diff options
3065 files changed, 136227 insertions, 68280 deletions
@@ -60,3 +60,4 @@ glob:indra/newview/teleport_history.txt glob:indra/newview/search_history.txt glob:indra/newview/filters.xml glob:indra/newview/avatar_icons_cache.txt +glob:indra/newview/avatar_lad.log diff --git a/doc/contributions.txt b/doc/contributions.txt index 2e4d803252..8c6bd5e0fe 100644 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -17,11 +17,15 @@ Agathos Frascati CT-317 CT-352 Aimee Trescothick - VWR-1813 + SNOW-227 + SNOW-570 + SNOW-572 VWR-3321 VWR-3336 VWR-3903 VWR-4083 + VWR-4106 + VWR-5308 VWR-6348 VWR-6358 VWR-6360 @@ -42,9 +46,15 @@ Aimee Trescothick VWR-11100 VWR-11111 VWR-11844 + VWR-12631 + VWR-12696 + VWR-12748 + VWR-14087 VWR-14267 VWR-14278 - VWR-14087 + VWR-14711 + VWR-14712 + VWR-15454 Alejandro Rosenthal VWR-1184 Aleric Inglewood @@ -175,6 +185,8 @@ Dale Glass VWR-2502 VWR-1358 VWR-2041 +Drew Dri + VWR-19683 Drewan Keats VWR-28 VWR-248 @@ -243,6 +255,7 @@ Gigs Taggart VWR-2491 VWR-2502 VWR-2331 + VWR-5308 VWR-8781 VWR-8783 Ginko Bayliss @@ -314,6 +327,8 @@ Khyota Wulluf VWR-8885 VWR-9256 VWR-9966 +Kitty Barnett + VWR-19699 Kunnis Basiat VWR-82 VWR-102 @@ -599,6 +614,7 @@ tenebrous pau Tharax Ferraris VWR-605 Thickbrick Sleaford + SNOW-207 VWR-7109 VWR-9287 VWR-13483 diff --git a/indra/cmake/APR.cmake b/indra/cmake/APR.cmake index f4706dd4f2..180504d286 100644 --- a/indra/cmake/APR.cmake +++ b/indra/cmake/APR.cmake @@ -54,7 +54,10 @@ else (STANDALONE) endif (WINDOWS) set(APR_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/include/apr-1) - if (LINUX AND VIEWER) - list(APPEND APRUTIL_LIBRARIES ${DB_LIBRARIES} uuid) - endif (LINUX AND VIEWER) + if (LINUX) + if (VIEWER) + list(APPEND APRUTIL_LIBRARIES ${DB_LIBRARIES} uuid) + endif (VIEWER) + list(APPEND APRUTIL_LIBRARIES ${DB_LIBRARIES} rt) + endif (LINUX) endif (STANDALONE) diff --git a/indra/cmake/Boost.cmake b/indra/cmake/Boost.cmake index efe9ad74d3..7ce57a5572 100644 --- a/indra/cmake/Boost.cmake +++ b/indra/cmake/Boost.cmake @@ -38,12 +38,12 @@ else (STANDALONE) debug libboost_signals-vc80-mt-gd-${BOOST_VERSION}) endif (MSVC71) elseif (DARWIN) - set(BOOST_PROGRAM_OPTIONS_LIBRARY boost_program_options-mt) - set(BOOST_REGEX_LIBRARY boost_regex-mt) - set(BOOST_SIGNALS_LIBRARY boost_signals-mt) + set(BOOST_PROGRAM_OPTIONS_LIBRARY boost_program_options-xgcc40-mt) + set(BOOST_REGEX_LIBRARY boost_regex-xgcc40-mt) + set(BOOST_SIGNALS_LIBRARY boost_signals-xgcc40-mt) elseif (LINUX) - set(BOOST_PROGRAM_OPTIONS_LIBRARY boost_program_options-mt) - set(BOOST_REGEX_LIBRARY boost_regex-mt) - set(BOOST_SIGNALS_LIBRARY boost_signals-mt) + set(BOOST_PROGRAM_OPTIONS_LIBRARY boost_program_options-gcc41-mt) + set(BOOST_REGEX_LIBRARY boost_regex-gcc41-mt) + set(BOOST_SIGNALS_LIBRARY boost_signals-gcc41-mt) endif (WINDOWS) endif (STANDALONE) diff --git a/indra/cmake/CARes.cmake b/indra/cmake/CARes.cmake index 8a2dc01561..1850b706ac 100644 --- a/indra/cmake/CARes.cmake +++ b/indra/cmake/CARes.cmake @@ -9,6 +9,7 @@ if (STANDALONE) include(FindCARes) else (STANDALONE) use_prebuilt_binary(ares) + add_definitions("-DCARES_STATICLIB") if (WINDOWS) set(CARES_LIBRARIES areslib) elseif (DARWIN) diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake index faf9da8b14..89422fbdb2 100644 --- a/indra/cmake/Copy3rdPartyLibs.cmake +++ b/indra/cmake/Copy3rdPartyLibs.cmake @@ -19,7 +19,7 @@ if(WINDOWS) set(vivox_src_dir "${CMAKE_SOURCE_DIR}/newview/vivox-runtime/i686-win32") set(vivox_files SLVoice.exe - libsndfile-1.dll + libsndfile-1.dll vivoxplatform.dll vivoxsdk.dll ortp.dll @@ -167,6 +167,7 @@ elseif(DARWIN) libexpat.dylib libllqtwebkit.dylib libndofdev.dylib + libexception_handler.dylib ) # fmod is statically linked on darwin @@ -216,6 +217,7 @@ elseif(LINUX) libapr-1.so.0 libaprutil-1.so.0 libatk-1.0.so + libbreakpad_client.so.0 libcrypto.so.0.9.7 libdb-4.2.so libexpat.so diff --git a/indra/cmake/GStreamer010Plugin.cmake b/indra/cmake/GStreamer010Plugin.cmake index 0d334837d4..0ca432da18 100644 --- a/indra/cmake/GStreamer010Plugin.cmake +++ b/indra/cmake/GStreamer010Plugin.cmake @@ -24,7 +24,6 @@ elseif (LINUX) gmodule-2.0 dl gthread-2.0 - rt glib-2.0 ) endif (STANDALONE) diff --git a/indra/cmake/GoogleBreakpad.cmake b/indra/cmake/GoogleBreakpad.cmake new file mode 100644 index 0000000000..8270c0fabb --- /dev/null +++ b/indra/cmake/GoogleBreakpad.cmake @@ -0,0 +1,19 @@ +# -*- cmake -*- +include(Prebuilt) + +if (STANDALONE) + MESSAGE(FATAL_ERROR "*TODO standalone support for google breakad is unimplemented") + # *TODO - implement this include(FindGoogleBreakpad) +else (STANDALONE) + use_prebuilt_binary(google_breakpad) + if (DARWIN) + set(BREAKPAD_EXCEPTION_HANDLER_LIBRARIES exception_handler) + endif (DARWIN) + if (LINUX) + set(BREAKPAD_EXCEPTION_HANDLER_LIBRARIES breakpad_client) + endif (LINUX) + if (WINDOWS) + set(BREAKPAD_EXCEPTION_HANDLER_LIBRARIES exception_handler crash_generation_client common) + endif (WINDOWS) +endif (STANDALONE) + diff --git a/indra/cmake/LLAddBuildTest.cmake b/indra/cmake/LLAddBuildTest.cmake index bf4d9b72a9..e8a0a949b6 100644 --- a/indra/cmake/LLAddBuildTest.cmake +++ b/indra/cmake/LLAddBuildTest.cmake @@ -137,21 +137,13 @@ INCLUDE(GoogleMock) SET(TEST_OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/PROJECT_${project}_TEST_${name}_ok.txt) SET(TEST_CMD ${TEST_EXE} --touch=${TEST_OUTPUT} --sourcedir=${CMAKE_CURRENT_SOURCE_DIR}) - # daveh - what configuration does this use? Debug? it's cmake-time, not build time. + poppy 2009-04-19 + # daveh - what configuration does this use? Debug? it's cmake-time, not build time. + poppy 2009-04-19 IF(LL_TEST_VERBOSE) MESSAGE(STATUS "LL_ADD_PROJECT_UNIT_TESTS ${name} test_cmd = ${TEST_CMD}") ENDIF(LL_TEST_VERBOSE) - - IF(WINDOWS) - set(LD_LIBRARY_PATH ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}) - ELSEIF(DARWIN) - set(LD_LIBRARY_PATH ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/Resources:/usr/lib) - ELSE(WINDOWS) - set(LD_LIBRARY_PATH ${SHARED_LIB_STAGING_DIR}:/usr/lib) - ENDIF(WINDOWS) - LL_TEST_COMMAND("${LD_LIBRARY_PATH}" ${TEST_CMD}) - SET(TEST_SCRIPT_CMD ${LL_TEST_COMMAND_value}) + SET_TEST_PATH(LD_LIBRARY_PATH) + LL_TEST_COMMAND(TEST_SCRIPT_CMD "${LD_LIBRARY_PATH}" ${TEST_CMD}) IF(LL_TEST_VERBOSE) MESSAGE(STATUS "LL_ADD_PROJECT_UNIT_TESTS ${name} test_script = ${TEST_SCRIPT_CMD}") ENDIF(LL_TEST_VERBOSE) @@ -233,16 +225,8 @@ FUNCTION(LL_ADD_INTEGRATION_TEST LIST(INSERT test_command test_exe_pos "${TEST_EXE}") ENDIF (test_exe_pos LESS 0) - IF(WINDOWS) - set(LD_LIBRARY_PATH ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}) - ELSEIF(DARWIN) - set(LD_LIBRARY_PATH ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/Resources:/usr/lib) - ELSE(WINDOWS) - set(LD_LIBRARY_PATH ${SHARED_LIB_STAGING_DIR}:/usr/lib) - ENDIF(WINDOWS) - - LL_TEST_COMMAND("${LD_LIBRARY_PATH}" ${test_command}) - SET(TEST_SCRIPT_CMD ${LL_TEST_COMMAND_value}) + SET_TEST_PATH(LD_LIBRARY_PATH) + LL_TEST_COMMAND(TEST_SCRIPT_CMD "${LD_LIBRARY_PATH}" ${test_command}) if(TEST_DEBUG) message(STATUS "TEST_SCRIPT_CMD: ${TEST_SCRIPT_CMD}") @@ -258,3 +242,20 @@ FUNCTION(LL_ADD_INTEGRATION_TEST # ADD_TEST(INTEGRATION_TEST_RUNNER_${testname} ${TEST_SCRIPT_CMD}) ENDFUNCTION(LL_ADD_INTEGRATION_TEST) + +MACRO(SET_TEST_PATH LISTVAR) + IF(WINDOWS) + # We typically build/package only Release variants of third-party + # libraries, so append the Release staging dir in case the library being + # sought doesn't have a debug variant. + set(${LISTVAR} ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR} ${SHARED_LIB_STAGING_DIR}/Release) + ELSEIF(DARWIN) + # We typically build/package only Release variants of third-party + # libraries, so append the Release staging dir in case the library being + # sought doesn't have a debug variant. + set(${LISTVAR} ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/Resources ${SHARED_LIB_STAGING_DIR}/Release/Resources /usr/lib) + ELSE(WINDOWS) + # Linux uses a single staging directory anyway. + set(${LISTVAR} ${SHARED_LIB_STAGING_DIR} /usr/lib) + ENDIF(WINDOWS) +ENDMACRO(SET_TEST_PATH) diff --git a/indra/cmake/LLSharedLibs.cmake b/indra/cmake/LLSharedLibs.cmake index 6f602680f4..e29076c738 100644 --- a/indra/cmake/LLSharedLibs.cmake +++ b/indra/cmake/LLSharedLibs.cmake @@ -5,20 +5,21 @@ macro(ll_deploy_sharedlibs_command target_exe) get_filename_component(OUTPUT_PATH ${TARGET_LOCATION} PATH) if(DARWIN) - set(SEARCH_DIRS "${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/Resources") + SET_TEST_PATH(SEARCH_DIRS) get_target_property(IS_BUNDLE ${target_exe} MACOSX_BUNDLE) if(IS_BUNDLE) - # If its a bundle the exe is not in the target location, this should find it. + # If its a bundle the exe is not in the target location, this should find it. get_filename_component(TARGET_FILE ${TARGET_LOCATION} NAME) set(OUTPUT_PATH ${TARGET_LOCATION}.app/Contents/MacOS) set(TARGET_LOCATION ${OUTPUT_PATH}/${TARGET_FILE}) - set(OUTPUT_PATH ${OUTPUT_PATH}/../Resources) + set(OUTPUT_PATH ${OUTPUT_PATH}/../Resources) endif(IS_BUNDLE) elseif(WINDOWS) - set(SEARCH_DIRS "${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}" "$ENV{SystemRoot}/system32") + SET_TEST_PATH(SEARCH_DIRS) + LIST(APPEND SEARCH_DIRS "$ENV{SystemRoot}/system32") elseif(LINUX) - set(SEARCH_DIRS "${SHARED_LIB_STAGING_DIR}") - set(OUTPUT_PATH ${OUTPUT_PATH}/lib) + SET_TEST_PATH(SEARCH_DIRS) + set(OUTPUT_PATH ${OUTPUT_PATH}/lib) endif(DARWIN) add_custom_command( @@ -49,7 +50,7 @@ macro(ll_stage_sharedlib DSO_TARGET) else(DARWIN) set(SHARED_LIB_STAGING_DIR_CONFIG ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}) endif(DARWIN) - + # *TODO - maybe make this a symbolic link? -brad add_custom_command( TARGET ${DSO_TARGET} POST_BUILD @@ -71,4 +72,4 @@ macro(ll_stage_sharedlib DSO_TARGET) ) endif(DARWIN) -endmacro(ll_stage_sharedlib)
\ No newline at end of file +endmacro(ll_stage_sharedlib) diff --git a/indra/cmake/LLTestCommand.cmake b/indra/cmake/LLTestCommand.cmake index fae5640493..554559edbd 100644 --- a/indra/cmake/LLTestCommand.cmake +++ b/indra/cmake/LLTestCommand.cmake @@ -1,13 +1,16 @@ -MACRO(LL_TEST_COMMAND LD_LIBRARY_PATH) +MACRO(LL_TEST_COMMAND OUTVAR LD_LIBRARY_PATH) # nat wonders how Kitware can use the term 'function' for a construct that # cannot return a value. And yet, variables you set inside a FUNCTION are # local. Try a MACRO instead. - SET(LL_TEST_COMMAND_value + SET(value ${PYTHON_EXECUTABLE} "${CMAKE_SOURCE_DIR}/cmake/run_build_test.py") - IF(LD_LIBRARY_PATH) - LIST(APPEND LL_TEST_COMMAND_value "-l${LD_LIBRARY_PATH}") - ENDIF(LD_LIBRARY_PATH) - LIST(APPEND LL_TEST_COMMAND_value ${ARGN}) -##MESSAGE(STATUS "Will run: ${LL_TEST_COMMAND_value}") + FOREACH(dir ${LD_LIBRARY_PATH}) + LIST(APPEND value "-l${dir}") + ENDFOREACH(dir) + LIST(APPEND value ${ARGN}) + SET(${OUTVAR} ${value}) +##IF(LL_TEST_VERBOSE) +## MESSAGE(STATUS "LL_TEST_COMMAND: ${value}") +##ENDIF(LL_TEST_VERBOSE) ENDMACRO(LL_TEST_COMMAND) diff --git a/indra/cmake/PulseAudio.cmake b/indra/cmake/PulseAudio.cmake new file mode 100644 index 0000000000..f8087a8083 --- /dev/null +++ b/indra/cmake/PulseAudio.cmake @@ -0,0 +1,28 @@ +# -*- cmake -*- +include(Prebuilt) + +if (STANDALONE) + include(FindPkgConfig) + + pkg_check_modules(PULSEAUDIO REQUIRED libpulse-mainloop-glib) + +elseif (LINUX) + use_prebuilt_binary(pulseaudio) + set(PULSEAUDIO_FOUND ON FORCE BOOL) + set(PULSEAUDIO_INCLUDE_DIRS + ${LIBS_PREBUILT_DIR}/include + ) + # We don't need to explicitly link against pulseaudio itself, because + # the viewer probes for the system's copy at runtime. + set(PULSEAUDIO_LIBRARIES + # none needed! + ) +endif (STANDALONE) + +if (PULSEAUDIO_FOUND) + set(PULSEAUDIO ON CACHE BOOL "Build with PulseAudio support, if available.") +endif (PULSEAUDIO_FOUND) + +if (PULSEAUDIO) + add_definitions(-DLL_PULSEAUDIO_ENABLED=1) +endif (PULSEAUDIO) diff --git a/indra/cmake/Variables.cmake b/indra/cmake/Variables.cmake index db0b44eb8f..bfaf3f4f26 100644 --- a/indra/cmake/Variables.cmake +++ b/indra/cmake/Variables.cmake @@ -75,11 +75,33 @@ endif (${CMAKE_SYSTEM_NAME} MATCHES "Linux") if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") set(DARWIN 1) - # set this dynamically from the build system now - - # NOTE: wont have a distributable build unless you add this on the configure line with: + + # NOTE: If specifying a different SDK with CMAKE_OSX_SYSROOT at configure + # time you should also specify CMAKE_OSX_DEPLOYMENT_TARGET explicitly, + # otherwise CMAKE_OSX_SYSROOT will be overridden here. We can't just check + # for it being unset, as it gets set to the system default :( + + # Default to building against the 10.4 SDK if no deployment target is + # specified. + if (NOT CMAKE_OSX_DEPLOYMENT_TARGET) + # NOTE: setting -isysroot is NOT adequate: http://lists.apple.com/archives/Xcode-users/2007/Oct/msg00696.html + # see http://public.kitware.com/Bug/view.php?id=9959 + poppy + set(CMAKE_OSX_SYSROOT /Developer/SDKs/MacOSX10.4u.sdk) + set(CMAKE_OSX_DEPLOYMENT_TARGET 10.4) + endif (NOT CMAKE_OSX_DEPLOYMENT_TARGET) + + # GCC 4.2 is incompatible with the MacOSX 10.4 SDK + if (${CMAKE_OSX_SYSROOT} MATCHES "10.4u") + set(CMAKE_XCODE_ATTRIBUTE_GCC_VERSION "4.0") + endif (${CMAKE_OSX_SYSROOT} MATCHES "10.4u") + + # NOTE: To attempt an i386/PPC Universal build, add this on the configure line: # -DCMAKE_OSX_ARCHITECTURES:STRING='i386;ppc' - #set(CMAKE_OSX_ARCHITECTURES i386;ppc) - set(CMAKE_OSX_SYSROOT /Developer/SDKs/MacOSX10.4u.sdk) + # Build only for i386 by default, system default on MacOSX 10.6 is x86_64 + if (NOT CMAKE_OSX_ARCHITECTURES) + set(CMAKE_OSX_ARCHITECTURES i386) + endif (NOT CMAKE_OSX_ARCHITECTURES) + if (CMAKE_OSX_ARCHITECTURES MATCHES "i386" AND CMAKE_OSX_ARCHITECTURES MATCHES "ppc") set(ARCH universal) else (CMAKE_OSX_ARCHITECTURES MATCHES "i386" AND CMAKE_OSX_ARCHITECTURES MATCHES "ppc") @@ -89,6 +111,7 @@ if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") set(ARCH i386) endif (${CMAKE_SYSTEM_PROCESSOR} MATCHES "ppc") endif (CMAKE_OSX_ARCHITECTURES MATCHES "i386" AND CMAKE_OSX_ARCHITECTURES MATCHES "ppc") + set(LL_ARCH ${ARCH}_darwin) set(LL_ARCH_DIR universal-darwin) set(WORD_SIZE 32) diff --git a/indra/integration_tests/llui_libtest/llwidgetreg.cpp b/indra/integration_tests/llui_libtest/llwidgetreg.cpp index c6e2e79a09..57c39243fb 100644 --- a/indra/integration_tests/llui_libtest/llwidgetreg.cpp +++ b/indra/integration_tests/llui_libtest/llwidgetreg.cpp @@ -37,6 +37,7 @@ #include "llcombobox.h" #include "llcontainerview.h" #include "lliconctrl.h" +#include "llloadingindicator.h" #include "llmenubutton.h" #include "llmenugl.h" #include "llmultislider.h" @@ -72,6 +73,7 @@ void LLWidgetReg::initClass(bool register_widgets) LLDefaultChildRegistry::Register<LLFlyoutButton> flyout_button("flyout_button"); LLDefaultChildRegistry::Register<LLContainerView> container_view("container_view"); LLDefaultChildRegistry::Register<LLIconCtrl> icon("icon"); + LLDefaultChildRegistry::Register<LLLoadingIndicator> loading_indicator("loading_indicator"); LLDefaultChildRegistry::Register<LLLineEditor> line_editor("line_editor"); LLDefaultChildRegistry::Register<LLMenuItemSeparatorGL> menu_item_separator("menu_item_separator"); LLDefaultChildRegistry::Register<LLMenuItemCallGL> menu_item_call_gl("menu_item_call"); diff --git a/indra/lib/python/indra/util/llmanifest.py b/indra/lib/python/indra/util/llmanifest.py index 7e5b86c53f..c33a03034a 100644 --- a/indra/lib/python/indra/util/llmanifest.py +++ b/indra/lib/python/indra/util/llmanifest.py @@ -39,6 +39,7 @@ import shutil import sys import tarfile import errno +import subprocess def path_ancestors(path): drive, path = os.path.splitdrive(os.path.normpath(path)) @@ -366,20 +367,23 @@ class LLManifest(object): def run_command(self, command): """ Runs an external command, and returns the output. Raises - an exception if the command reurns a nonzero status code. For - debugging/informational purpoases, prints out the command's + an exception if the command returns a nonzero status code. For + debugging/informational purposes, prints out the command's output as it is received.""" print "Running command:", command - fd = os.popen(command, 'r') + sys.stdout.flush() + child = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, + shell=True) lines = [] while True: - lines.append(fd.readline()) + lines.append(child.stdout.readline()) if lines[-1] == '': break else: print lines[-1], output = ''.join(lines) - status = fd.close() + child.stdout.close() + status = child.wait() if status: raise RuntimeError( "Command %s returned non-zero status (%s) \noutput:\n%s" diff --git a/indra/linux_crash_logger/CMakeLists.txt b/indra/linux_crash_logger/CMakeLists.txt index 4b19e28066..ab62a0d0af 100644 --- a/indra/linux_crash_logger/CMakeLists.txt +++ b/indra/linux_crash_logger/CMakeLists.txt @@ -54,12 +54,5 @@ target_link_libraries(linux-crash-logger ${DB_LIBRARIES} ) -add_custom_command( - OUTPUT linux-crash-logger-stripped - COMMAND strip - ARGS --strip-debug -o linux-crash-logger-stripped linux-crash-logger - DEPENDS linux-crash-logger - ) - -add_custom_target(linux-crash-logger-strip-target ALL - DEPENDS linux-crash-logger-stripped) +add_custom_target(linux-crash-logger-target ALL + DEPENDS linux-crash-logger) diff --git a/indra/linux_crash_logger/llcrashloggerlinux.cpp b/indra/linux_crash_logger/llcrashloggerlinux.cpp index 039b70ec4a..ce03ea0d6f 100644 --- a/indra/linux_crash_logger/llcrashloggerlinux.cpp +++ b/indra/linux_crash_logger/llcrashloggerlinux.cpp @@ -120,7 +120,6 @@ LLCrashLoggerLinux::~LLCrashLoggerLinux(void) void LLCrashLoggerLinux::gatherPlatformSpecificFiles() { - mFileMap["CrashLog"] = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"stack_trace.log").c_str(); } bool LLCrashLoggerLinux::mainLoop() diff --git a/indra/linux_updater/CMakeLists.txt b/indra/linux_updater/CMakeLists.txt index 9fe32ecb46..00a78b2a8f 100644 --- a/indra/linux_updater/CMakeLists.txt +++ b/indra/linux_updater/CMakeLists.txt @@ -47,12 +47,5 @@ target_link_libraries(linux-updater ${LLCOMMON_LIBRARIES} ) -add_custom_command( - OUTPUT linux-updater-stripped - COMMAND strip - ARGS --strip-debug -o linux-updater-stripped linux-updater - DEPENDS linux-updater - ) - -add_custom_target(linux-updater-strip-target ALL - DEPENDS linux-updater-stripped) +add_custom_target(linux-updater-target ALL + DEPENDS linux-updater) diff --git a/indra/llaudio/CMakeLists.txt b/indra/llaudio/CMakeLists.txt index bfa2c34c12..e869b9717c 100644 --- a/indra/llaudio/CMakeLists.txt +++ b/indra/llaudio/CMakeLists.txt @@ -57,13 +57,11 @@ if (FMOD) llstreamingaudio_fmod.h ) - if (LINUX) - if (${CXX_VERSION_NUMBER} GREATER 419) - set_source_files_properties(llaudioengine_fmod.cpp - llstreamingaudio_fmod.cpp - COMPILE_FLAGS -Wno-write-strings) - endif (${CXX_VERSION_NUMBER} GREATER 419) - endif (LINUX) + if (LINUX OR DARWIN) + set_source_files_properties(llaudioengine_fmod.cpp + llstreamingaudio_fmod.cpp + COMPILE_FLAGS -Wno-write-strings) + endif (LINUX OR DARWIN) endif (FMOD) if (OPENAL) diff --git a/indra/llaudio/llaudioengine.cpp b/indra/llaudio/llaudioengine.cpp index a28c94d00d..9f4c108dff 100644 --- a/indra/llaudio/llaudioengine.cpp +++ b/indra/llaudio/llaudioengine.cpp @@ -202,12 +202,12 @@ void LLAudioEngine::updateInternetStream() } // virtual -int LLAudioEngine::isInternetStreamPlaying() +LLAudioEngine::LLAudioPlayState LLAudioEngine::isInternetStreamPlaying() { if (mStreamingAudioImpl) - return mStreamingAudioImpl->isPlaying(); + return (LLAudioEngine::LLAudioPlayState) mStreamingAudioImpl->isPlaying(); - return 0; // Stopped + return LLAudioEngine::AUDIO_STOPPED; // Stopped } @@ -548,12 +548,11 @@ void LLAudioEngine::enableWind(bool enable) { if (enable && (!mEnableWind)) { - initWind(); - mEnableWind = enable; + mEnableWind = initWind(); } else if (mEnableWind && (!enable)) { - mEnableWind = enable; + mEnableWind = false; cleanupWind(); } } @@ -592,7 +591,7 @@ LLAudioBuffer * LLAudioEngine::getFreeBuffer() if (buffer_id >= 0) { - llinfos << "Taking over unused buffer " << buffer_id << llendl; + lldebugs << "Taking over unused buffer " << buffer_id << llendl; //llinfos << "Flushing unused buffer!" << llendl; mBuffers[buffer_id]->mAudioDatap->mBufferp = NULL; delete mBuffers[buffer_id]; diff --git a/indra/llaudio/llaudioengine.h b/indra/llaudio/llaudioengine.h index 457fd93abe..5876cef4ea 100644 --- a/indra/llaudio/llaudioengine.h +++ b/indra/llaudio/llaudioengine.h @@ -91,6 +91,15 @@ public: AUDIO_TYPE_COUNT = 4 // last }; + enum LLAudioPlayState + { + // isInternetStreamPlaying() returns an *int*, with + // 0 = stopped, 1 = playing, 2 = paused. + AUDIO_STOPPED = 0, + AUDIO_PLAYING = 1, + AUDIO_PAUSED = 2 + }; + LLAudioEngine(); virtual ~LLAudioEngine(); @@ -156,7 +165,7 @@ public: void stopInternetStream(); void pauseInternetStream(int pause); void updateInternetStream(); // expected to be called often - int isInternetStreamPlaying(); + LLAudioPlayState isInternetStreamPlaying(); // use a value from 0.0 to 1.0, inclusive void setInternetStreamGain(F32 vol); std::string getInternetStreamURL(); @@ -186,7 +195,7 @@ protected: virtual LLAudioBuffer *createBuffer() = 0; virtual LLAudioChannel *createChannel() = 0; - virtual void initWind() = 0; + virtual bool initWind() = 0; virtual void cleanupWind() = 0; virtual void setInternalGain(F32 gain) = 0; diff --git a/indra/llaudio/llaudioengine_fmod.cpp b/indra/llaudio/llaudioengine_fmod.cpp index d7f58defca..7a8a04afa1 100644 --- a/indra/llaudio/llaudioengine_fmod.cpp +++ b/indra/llaudio/llaudioengine_fmod.cpp @@ -54,13 +54,12 @@ extern "C" { void * F_CALLBACKAPI windCallback(void *originalbuffer, void *newbuffer, int length, void* userdata); } -FSOUND_DSPUNIT *gWindDSP = NULL; - LLAudioEngine_FMOD::LLAudioEngine_FMOD() { mInited = false; mWindGen = NULL; + mWindDSP = NULL; } @@ -258,10 +257,10 @@ void LLAudioEngine_FMOD::allocateListener(void) void LLAudioEngine_FMOD::shutdown() { - if (gWindDSP) + if (mWindDSP) { - FSOUND_DSP_SetActive(gWindDSP,false); - FSOUND_DSP_Free(gWindDSP); + FSOUND_DSP_SetActive(mWindDSP,false); + FSOUND_DSP_Free(mWindDSP); } stopInternetStream(); @@ -289,29 +288,66 @@ LLAudioChannel * LLAudioEngine_FMOD::createChannel() } -void LLAudioEngine_FMOD::initWind() +bool LLAudioEngine_FMOD::initWind() { - mWindGen = new LLWindGen<MIXBUFFERFORMAT>; + if (!mWindGen) + { + bool enable; + + switch (FSOUND_GetMixer()) + { + case FSOUND_MIXER_MMXP5: + case FSOUND_MIXER_MMXP6: + case FSOUND_MIXER_QUALITY_MMXP5: + case FSOUND_MIXER_QUALITY_MMXP6: + enable = (typeid(MIXBUFFERFORMAT) == typeid(S16)); + break; + case FSOUND_MIXER_BLENDMODE: + enable = (typeid(MIXBUFFERFORMAT) == typeid(S32)); + break; + case FSOUND_MIXER_QUALITY_FPU: + enable = (typeid(MIXBUFFERFORMAT) == typeid(F32)); + break; + default: + // FSOUND_GetMixer() does not return a valid mixer type on Darwin + LL_INFOS("AppInit") << "Unknown FMOD mixer type, assuming default" << LL_ENDL; + enable = true; + break; + } + + if (enable) + { + mWindGen = new LLWindGen<MIXBUFFERFORMAT>(FSOUND_GetOutputRate()); + } + else + { + LL_WARNS("AppInit") << "Incompatible FMOD mixer type, wind noise disabled" << LL_ENDL; + } + } + + mNextWindUpdate = 0.0; - if (!gWindDSP) + if (mWindGen && !mWindDSP) { - gWindDSP = FSOUND_DSP_Create(&windCallback, FSOUND_DSP_DEFAULTPRIORITY_CLEARUNIT + 20, mWindGen); + mWindDSP = FSOUND_DSP_Create(&windCallback, FSOUND_DSP_DEFAULTPRIORITY_CLEARUNIT + 20, mWindGen); } - if (gWindDSP) + if (mWindDSP) { - FSOUND_DSP_SetActive(gWindDSP, true); + FSOUND_DSP_SetActive(mWindDSP, true); + return true; } - mNextWindUpdate = 0.0; + + return false; } void LLAudioEngine_FMOD::cleanupWind() { - if (gWindDSP) + if (mWindDSP) { - FSOUND_DSP_SetActive(gWindDSP, false); - FSOUND_DSP_Free(gWindDSP); - gWindDSP = NULL; + FSOUND_DSP_SetActive(mWindDSP, false); + FSOUND_DSP_Free(mWindDSP); + mWindDSP = NULL; } delete mWindGen; @@ -740,30 +776,12 @@ void * F_CALLBACKAPI windCallback(void *originalbuffer, void *newbuffer, int len // originalbuffer = fmod's original mixbuffer. // newbuffer = the buffer passed from the previous DSP unit. // length = length in samples at this mix time. - // param = user parameter passed through in FSOUND_DSP_Create. - // - // modify the buffer in some fashion + // userdata = user parameter passed through in FSOUND_DSP_Create. LLWindGen<LLAudioEngine_FMOD::MIXBUFFERFORMAT> *windgen = (LLWindGen<LLAudioEngine_FMOD::MIXBUFFERFORMAT> *)userdata; - U8 stride; - -#if LL_DARWIN - stride = sizeof(LLAudioEngine_FMOD::MIXBUFFERFORMAT); -#else - int mixertype = FSOUND_GetMixer(); - if (mixertype == FSOUND_MIXER_BLENDMODE || - mixertype == FSOUND_MIXER_QUALITY_FPU) - { - stride = 4; - } - else - { - stride = 2; - } -#endif - - newbuffer = windgen->windGenerate((LLAudioEngine_FMOD::MIXBUFFERFORMAT *)newbuffer, length, stride); + + newbuffer = windgen->windGenerate((LLAudioEngine_FMOD::MIXBUFFERFORMAT *)newbuffer, length); return newbuffer; } diff --git a/indra/llaudio/llaudioengine_fmod.h b/indra/llaudio/llaudioengine_fmod.h index 3968657cba..0e386a3884 100644 --- a/indra/llaudio/llaudioengine_fmod.h +++ b/indra/llaudio/llaudioengine_fmod.h @@ -55,15 +55,15 @@ public: virtual void shutdown(); - /*virtual*/ void initWind(); + /*virtual*/ bool initWind(); /*virtual*/ void cleanupWind(); /*virtual*/void updateWind(LLVector3 direction, F32 camera_height_above_water); #if LL_DARWIN - typedef S32 MIXBUFFERFORMAT; + typedef S32 MIXBUFFERFORMAT; #else - typedef S16 MIXBUFFERFORMAT; + typedef S16 MIXBUFFERFORMAT; #endif protected: @@ -83,6 +83,7 @@ protected: void* mUserData; LLWindGen<MIXBUFFERFORMAT> *mWindGen; + FSOUND_DSPUNIT *mWindDSP; }; diff --git a/indra/llaudio/llaudioengine_openal.cpp b/indra/llaudio/llaudioengine_openal.cpp index a5982ccbd6..887c791790 100644 --- a/indra/llaudio/llaudioengine_openal.cpp +++ b/indra/llaudio/llaudioengine_openal.cpp @@ -370,7 +370,7 @@ U32 LLAudioBufferOpenAL::getLength() // ------------ -void LLAudioEngine_OpenAL::initWind() +bool LLAudioEngine_OpenAL::initWind() { ALenum error; llinfos << "LLAudioEngine_OpenAL::initWind() start" << llendl; @@ -397,10 +397,12 @@ void LLAudioEngine_OpenAL::initWind() if(mWindBuf==NULL) { llerrs << "LLAudioEngine_OpenAL::initWind() Error creating wind memory buffer" << llendl; - mEnableWind=false; + return false; } llinfos << "LLAudioEngine_OpenAL::initWind() done" << llendl; + + return true; } void LLAudioEngine_OpenAL::cleanupWind() @@ -508,14 +510,14 @@ void LLAudioEngine_OpenAL::updateWind(LLVector3 wind_vec, F32 camera_altitude) alGenBuffers(1,&buffer); if((error=alGetError()) != AL_NO_ERROR) { - llwarns << "LLAudioEngine_OpenAL::initWind() Error creating wind buffer: " << error << llendl; + llwarns << "LLAudioEngine_OpenAL::updateWind() Error creating wind buffer: " << error << llendl; break; } alBufferData(buffer, AL_FORMAT_STEREO16, mWindGen->windGenerate(mWindBuf, - mWindBufSamples, 2), + mWindBufSamples), mWindBufBytes, mWindBufFreq); error = alGetError(); diff --git a/indra/llaudio/llaudioengine_openal.h b/indra/llaudio/llaudioengine_openal.h index 5aca03e195..16125b2476 100644 --- a/indra/llaudio/llaudioengine_openal.h +++ b/indra/llaudio/llaudioengine_openal.h @@ -57,23 +57,23 @@ class LLAudioEngine_OpenAL : public LLAudioEngine LLAudioBuffer* createBuffer(); LLAudioChannel* createChannel(); - /*virtual*/ void initWind(); + /*virtual*/ bool initWind(); /*virtual*/ void cleanupWind(); /*virtual*/ void updateWind(LLVector3 direction, F32 camera_altitude); private: void * windDSP(void *newbuffer, int length); - typedef S16 WIND_SAMPLE_T; - LLWindGen<WIND_SAMPLE_T> *mWindGen; - S16 *mWindBuf; - U32 mWindBufFreq; - U32 mWindBufSamples; - U32 mWindBufBytes; - ALuint mWindSource; - int mNumEmptyWindALBuffers; - - static const int MAX_NUM_WIND_BUFFERS = 80; - static const float WIND_BUFFER_SIZE_SEC = 0.05f; // 1/20th sec + typedef S16 WIND_SAMPLE_T; + LLWindGen<WIND_SAMPLE_T> *mWindGen; + S16 *mWindBuf; + U32 mWindBufFreq; + U32 mWindBufSamples; + U32 mWindBufBytes; + ALuint mWindSource; + int mNumEmptyWindALBuffers; + + static const int MAX_NUM_WIND_BUFFERS = 80; + static const float WIND_BUFFER_SIZE_SEC = 0.05f; // 1/20th sec }; class LLAudioChannelOpenAL : public LLAudioChannel diff --git a/indra/llaudio/llstreamingaudio_fmod.cpp b/indra/llaudio/llstreamingaudio_fmod.cpp index a4620fa13c..fe94688565 100644 --- a/indra/llaudio/llstreamingaudio_fmod.cpp +++ b/indra/llaudio/llstreamingaudio_fmod.cpp @@ -271,7 +271,7 @@ void LLStreamingAudio_FMOD::setGain(F32 vol) if (mFMODInternetStreamChannel != -1) { - vol = llclamp(vol, 0.f, 1.f); + vol = llclamp(vol * vol, 0.f, 1.f); int vol_int = llround(vol * 255.f); FSOUND_SetVolumeAbsolute(mFMODInternetStreamChannel, vol_int); } diff --git a/indra/llaudio/llwindgen.h b/indra/llaudio/llwindgen.h index 847bfa6e9d..1908b2545f 100644 --- a/indra/llaudio/llwindgen.h +++ b/indra/llaudio/llwindgen.h @@ -33,104 +33,149 @@ #define WINDGEN_H #include "llcommon.h" -#include "llrand.h" template <class MIXBUFFERFORMAT_T> class LLWindGen { public: - LLWindGen() : + LLWindGen(const U32 sample_rate = 44100) : mTargetGain(0.f), mTargetFreq(100.f), mTargetPanGainR(0.5f), - mbuf0(0.0), - mbuf1(0.0), - mbuf2(0.0), - mbuf3(0.0), - mbuf4(0.0), - mbuf5(0.0), - mY0(0.0), - mY1(0.0), + mInputSamplingRate(sample_rate), + mSubSamples(2), + mFilterBandWidth(50.f), + mBuf0(0.0f), + mBuf1(0.0f), + mBuf2(0.0f), + mY0(0.0f), + mY1(0.0f), mCurrentGain(0.f), mCurrentFreq(100.f), - mCurrentPanGainR(0.5f) {}; - - static const U32 getInputSamplingRate() {return mInputSamplingRate;} + mCurrentPanGainR(0.5f) + { + mSamplePeriod = (F32)mSubSamples / (F32)mInputSamplingRate; + mB2 = expf(-F_TWO_PI * mFilterBandWidth * mSamplePeriod); + } + const U32 getInputSamplingRate() { return mInputSamplingRate; } + // newbuffer = the buffer passed from the previous DSP unit. // numsamples = length in samples-per-channel at this mix time. - // stride = number of bytes between start of each sample. // NOTE: generates L/R interleaved stereo - MIXBUFFERFORMAT_T* windGenerate(MIXBUFFERFORMAT_T *newbuffer, int numsamples, int stride) + MIXBUFFERFORMAT_T* windGenerate(MIXBUFFERFORMAT_T *newbuffer, int numsamples) { - U8 *cursamplep = (U8*)newbuffer; + MIXBUFFERFORMAT_T *cursamplep = newbuffer; + + // Filter coefficients + F32 a0 = 0.0f, b1 = 0.0f; - double bandwidth = 50.0F; - double a0,b1,b2; + // No need to clip at normal volumes + bool clip = mCurrentGain > 2.0f; - // calculate resonant filter coeffs - b2 = exp(-(F_TWO_PI) * (bandwidth / mInputSamplingRate)); + bool interp_freq = false; - while (numsamples--) + //if the frequency isn't changing much, we don't need to interpolate in the inner loop + if (llabs(mTargetFreq - mCurrentFreq) < (mCurrentFreq * 0.112)) { - mCurrentFreq = (float)((0.999 * mCurrentFreq) + (0.001 * mTargetFreq)); - mCurrentGain = (float)((0.999 * mCurrentGain) + (0.001 * mTargetGain)); - mCurrentPanGainR = (float)((0.999 * mCurrentPanGainR) + (0.001 * mTargetPanGainR)); - b1 = (-4.0 * b2) / (1.0 + b2) * cos(F_TWO_PI * (mCurrentFreq / mInputSamplingRate)); - a0 = (1.0 - b2) * sqrt(1.0 - (b1 * b1) / (4.0 * b2)); - double nextSample; + // calculate resonant filter coefficients + mCurrentFreq = mTargetFreq; + b1 = (-4.0f * mB2) / (1.0f + mB2) * cosf(F_TWO_PI * (mCurrentFreq * mSamplePeriod)); + a0 = (1.0f - mB2) * sqrtf(1.0f - (b1 * b1) / (4.0f * mB2)); + } + else + { + interp_freq = true; + } + + while (numsamples) + { + F32 next_sample; + + // Start with white noise + // This expression is fragile, rearrange it and it will break! + next_sample = (F32)rand() * (1.0f / (F32)(RAND_MAX / (U16_MAX / 8))) + (F32)(S16_MIN / 8); - // start with white noise - nextSample = ll_frand(2.0f) - 1.0f; + // Apply a pinking filter + // Magic numbers taken from PKE method at http://www.firstpr.com.au/dsp/pink-noise/ + mBuf0 = mBuf0 * 0.99765f + next_sample * 0.0990460f; + mBuf1 = mBuf1 * 0.96300f + next_sample * 0.2965164f; + mBuf2 = mBuf2 * 0.57000f + next_sample * 1.0526913f; - // apply pinking filter - mbuf0 = 0.997f * mbuf0 + 0.0126502f * nextSample; - mbuf1 = 0.985f * mbuf1 + 0.0139083f * nextSample; - mbuf2 = 0.950f * mbuf2 + 0.0205439f * nextSample; - mbuf3 = 0.850f * mbuf3 + 0.0387225f * nextSample; - mbuf4 = 0.620f * mbuf4 + 0.0465932f * nextSample; - mbuf5 = 0.250f * mbuf5 + 0.1093477f * nextSample; + next_sample = mBuf0 + mBuf1 + mBuf2 + next_sample * 0.1848f; - nextSample = mbuf0 + mbuf1 + mbuf2 + mbuf3 + mbuf4 + mbuf5; + if (interp_freq) + { + // calculate and interpolate resonant filter coefficients + mCurrentFreq = (0.999f * mCurrentFreq) + (0.001f * mTargetFreq); + b1 = (-4.0f * mB2) / (1.0f + mB2) * cosf(F_TWO_PI * (mCurrentFreq * mSamplePeriod)); + a0 = (1.0f - mB2) * sqrtf(1.0f - (b1 * b1) / (4.0f * mB2)); + } - // do a resonant filter on the noise - nextSample = (double)( a0 * nextSample - b1 * mY0 - b2 * mY1 ); + // Apply a resonant low-pass filter on the pink noise + next_sample = a0 * next_sample - b1 * mY0 - mB2 * mY1; mY1 = mY0; - mY0 = nextSample; + mY0 = next_sample; - nextSample *= mCurrentGain; + mCurrentGain = (0.999f * mCurrentGain) + (0.001f * mTargetGain); + mCurrentPanGainR = (0.999f * mCurrentPanGainR) + (0.001f * mTargetPanGainR); - MIXBUFFERFORMAT_T sample; + // For a 3dB pan law use: + // next_sample *= mCurrentGain * ((mCurrentPanGainR*(mCurrentPanGainR-1)*1.652+1.413); + next_sample *= mCurrentGain; - sample = llfloor(((F32)nextSample*32768.f*(1.0f - mCurrentPanGainR))+0.5f); - *(MIXBUFFERFORMAT_T*)cursamplep = llclamp(sample, (MIXBUFFERFORMAT_T)-32768, (MIXBUFFERFORMAT_T)32767); - cursamplep += stride; - - sample = llfloor(((F32)nextSample*32768.f*mCurrentPanGainR)+0.5f); - *(MIXBUFFERFORMAT_T*)cursamplep = llclamp(sample, (MIXBUFFERFORMAT_T)-32768, (MIXBUFFERFORMAT_T)32767); - cursamplep += stride; + // delta is used to interpolate between synthesized samples + F32 delta = (next_sample - mLastSample) / (F32)mSubSamples; + + // Fill the audio buffer, clipping if necessary + for (U8 i=mSubSamples; i && numsamples; --i, --numsamples) + { + mLastSample = mLastSample + delta; + S32 sample_right = (S32)(mLastSample * mCurrentPanGainR); + S32 sample_left = (S32)mLastSample - sample_right; + + if (!clip) + { + *cursamplep = (MIXBUFFERFORMAT_T)sample_left; + ++cursamplep; + *cursamplep = (MIXBUFFERFORMAT_T)sample_right; + ++cursamplep; + } + else + { + *cursamplep = (MIXBUFFERFORMAT_T)llclamp(sample_left, (S32)S16_MIN, (S32)S16_MAX); + ++cursamplep; + *cursamplep = (MIXBUFFERFORMAT_T)llclamp(sample_right, (S32)S16_MIN, (S32)S16_MAX); + ++cursamplep; + } + } } return newbuffer; } - + +public: F32 mTargetGain; F32 mTargetFreq; F32 mTargetPanGainR; - + private: - static const U32 mInputSamplingRate = 44100; - F64 mbuf0; - F64 mbuf1; - F64 mbuf2; - F64 mbuf3; - F64 mbuf4; - F64 mbuf5; - F64 mY0; - F64 mY1; + U32 mInputSamplingRate; + U8 mSubSamples; + F32 mSamplePeriod; + F32 mFilterBandWidth; + F32 mB2; + + F32 mBuf0; + F32 mBuf1; + F32 mBuf2; + F32 mY0; + F32 mY1; + F32 mCurrentGain; F32 mCurrentFreq; F32 mCurrentPanGainR; + F32 mLastSample; }; #endif diff --git a/indra/llcharacter/llanimationstates.cpp b/indra/llcharacter/llanimationstates.cpp index 365fb673f3..4c24218fc3 100644 --- a/indra/llcharacter/llanimationstates.cpp +++ b/indra/llcharacter/llanimationstates.cpp @@ -39,6 +39,146 @@ #include "llanimationstates.h" #include "llstring.h" +const LLUUID ANIM_AGENT_AFRAID = LLUUID("6b61c8e8-4747-0d75-12d7-e49ff207a4ca"); +const LLUUID ANIM_AGENT_AIM_BAZOOKA_R = LLUUID("b5b4a67d-0aee-30d2-72cd-77b333e932ef"); +const LLUUID ANIM_AGENT_AIM_BOW_L = LLUUID("46bb4359-de38-4ed8-6a22-f1f52fe8f506"); +const LLUUID ANIM_AGENT_AIM_HANDGUN_R = LLUUID("3147d815-6338-b932-f011-16b56d9ac18b"); +const LLUUID ANIM_AGENT_AIM_RIFLE_R = LLUUID("ea633413-8006-180a-c3ba-96dd1d756720"); +const LLUUID ANIM_AGENT_ANGRY = LLUUID("5747a48e-073e-c331-f6f3-7c2149613d3e"); +const LLUUID ANIM_AGENT_AWAY = LLUUID("fd037134-85d4-f241-72c6-4f42164fedee"); +const LLUUID ANIM_AGENT_BACKFLIP = LLUUID("c4ca6188-9127-4f31-0158-23c4e2f93304"); +const LLUUID ANIM_AGENT_BELLY_LAUGH = LLUUID("18b3a4b5-b463-bd48-e4b6-71eaac76c515"); +const LLUUID ANIM_AGENT_BLOW_KISS = LLUUID("db84829b-462c-ee83-1e27-9bbee66bd624"); +const LLUUID ANIM_AGENT_BORED = LLUUID("b906c4ba-703b-1940-32a3-0c7f7d791510"); +const LLUUID ANIM_AGENT_BOW = LLUUID("82e99230-c906-1403-4d9c-3889dd98daba"); +const LLUUID ANIM_AGENT_BRUSH = LLUUID("349a3801-54f9-bf2c-3bd0-1ac89772af01"); +const LLUUID ANIM_AGENT_BUSY = LLUUID("efcf670c-2d18-8128-973a-034ebc806b67"); +const LLUUID ANIM_AGENT_CLAP = LLUUID("9b0c1c4e-8ac7-7969-1494-28c874c4f668"); +const LLUUID ANIM_AGENT_COURTBOW = LLUUID("9ba1c942-08be-e43a-fb29-16ad440efc50"); +const LLUUID ANIM_AGENT_CROUCH = LLUUID("201f3fdf-cb1f-dbec-201f-7333e328ae7c"); +const LLUUID ANIM_AGENT_CROUCHWALK = LLUUID("47f5f6fb-22e5-ae44-f871-73aaaf4a6022"); +const LLUUID ANIM_AGENT_CRY = LLUUID("92624d3e-1068-f1aa-a5ec-8244585193ed"); +const LLUUID ANIM_AGENT_CUSTOMIZE = LLUUID("038fcec9-5ebd-8a8e-0e2e-6e71a0a1ac53"); +const LLUUID ANIM_AGENT_CUSTOMIZE_DONE = LLUUID("6883a61a-b27b-5914-a61e-dda118a9ee2c"); +const LLUUID ANIM_AGENT_DANCE1 = LLUUID("b68a3d7c-de9e-fc87-eec8-543d787e5b0d"); +const LLUUID ANIM_AGENT_DANCE2 = LLUUID("928cae18-e31d-76fd-9cc9-2f55160ff818"); +const LLUUID ANIM_AGENT_DANCE3 = LLUUID("30047778-10ea-1af7-6881-4db7a3a5a114"); +const LLUUID ANIM_AGENT_DANCE4 = LLUUID("951469f4-c7b2-c818-9dee-ad7eea8c30b7"); +const LLUUID ANIM_AGENT_DANCE5 = LLUUID("4bd69a1d-1114-a0b4-625f-84e0a5237155"); +const LLUUID ANIM_AGENT_DANCE6 = LLUUID("cd28b69b-9c95-bb78-3f94-8d605ff1bb12"); +const LLUUID ANIM_AGENT_DANCE7 = LLUUID("a54d8ee2-28bb-80a9-7f0c-7afbbe24a5d6"); +const LLUUID ANIM_AGENT_DANCE8 = LLUUID("b0dc417c-1f11-af36-2e80-7e7489fa7cdc"); +const LLUUID ANIM_AGENT_DEAD = LLUUID("57abaae6-1d17-7b1b-5f98-6d11a6411276"); +const LLUUID ANIM_AGENT_DRINK = LLUUID("0f86e355-dd31-a61c-fdb0-3a96b9aad05f"); +const LLUUID ANIM_AGENT_EMBARRASSED = LLUUID("514af488-9051-044a-b3fc-d4dbf76377c6"); +const LLUUID ANIM_AGENT_EXPRESS_AFRAID = LLUUID("aa2df84d-cf8f-7218-527b-424a52de766e"); +const LLUUID ANIM_AGENT_EXPRESS_ANGER = LLUUID("1a03b575-9634-b62a-5767-3a679e81f4de"); +const LLUUID ANIM_AGENT_EXPRESS_BORED = LLUUID("214aa6c1-ba6a-4578-f27c-ce7688f61d0d"); +const LLUUID ANIM_AGENT_EXPRESS_CRY = LLUUID("d535471b-85bf-3b4d-a542-93bea4f59d33"); +const LLUUID ANIM_AGENT_EXPRESS_DISDAIN = LLUUID("d4416ff1-09d3-300f-4183-1b68a19b9fc1"); +const LLUUID ANIM_AGENT_EXPRESS_EMBARRASSED = LLUUID("0b8c8211-d78c-33e8-fa28-c51a9594e424"); +const LLUUID ANIM_AGENT_EXPRESS_FROWN = LLUUID("fee3df48-fa3d-1015-1e26-a205810e3001"); +const LLUUID ANIM_AGENT_EXPRESS_KISS = LLUUID("1e8d90cc-a84e-e135-884c-7c82c8b03a14"); +const LLUUID ANIM_AGENT_EXPRESS_LAUGH = LLUUID("62570842-0950-96f8-341c-809e65110823"); +const LLUUID ANIM_AGENT_EXPRESS_OPEN_MOUTH = LLUUID("d63bc1f9-fc81-9625-a0c6-007176d82eb7"); +const LLUUID ANIM_AGENT_EXPRESS_REPULSED = LLUUID("f76cda94-41d4-a229-2872-e0296e58afe1"); +const LLUUID ANIM_AGENT_EXPRESS_SAD = LLUUID("eb6ebfb2-a4b3-a19c-d388-4dd5c03823f7"); +const LLUUID ANIM_AGENT_EXPRESS_SHRUG = LLUUID("a351b1bc-cc94-aac2-7bea-a7e6ebad15ef"); +const LLUUID ANIM_AGENT_EXPRESS_SMILE = LLUUID("b7c7c833-e3d3-c4e3-9fc0-131237446312"); +const LLUUID ANIM_AGENT_EXPRESS_SURPRISE = LLUUID("728646d9-cc79-08b2-32d6-937f0a835c24"); +const LLUUID ANIM_AGENT_EXPRESS_TONGUE_OUT = LLUUID("835965c6-7f2f-bda2-5deb-2478737f91bf"); +const LLUUID ANIM_AGENT_EXPRESS_TOOTHSMILE = LLUUID("b92ec1a5-e7ce-a76b-2b05-bcdb9311417e"); +const LLUUID ANIM_AGENT_EXPRESS_WINK = LLUUID("da020525-4d94-59d6-23d7-81fdebf33148"); +const LLUUID ANIM_AGENT_EXPRESS_WORRY = LLUUID("9c05e5c7-6f07-6ca4-ed5a-b230390c3950"); +const LLUUID ANIM_AGENT_FALLDOWN = LLUUID("666307d9-a860-572d-6fd4-c3ab8865c094"); +const LLUUID ANIM_AGENT_FEMALE_RUN_NEW = LLUUID("85995026-eade-5d78-d364-94a64512cb66"); +const LLUUID ANIM_AGENT_FEMALE_WALK = LLUUID("f5fc7433-043d-e819-8298-f519a119b688"); +const LLUUID ANIM_AGENT_FEMALE_WALK_NEW = LLUUID("d60c41d2-7c24-7074-d3fa-6101cea22a51"); +const LLUUID ANIM_AGENT_FINGER_WAG = LLUUID("c1bc7f36-3ba0-d844-f93c-93be945d644f"); +const LLUUID ANIM_AGENT_FIST_PUMP = LLUUID("7db00ccd-f380-f3ee-439d-61968ec69c8a"); +const LLUUID ANIM_AGENT_FLY = LLUUID("aec4610c-757f-bc4e-c092-c6e9caf18daf"); +const LLUUID ANIM_AGENT_FLYSLOW = LLUUID("2b5a38b2-5e00-3a97-a495-4c826bc443e6"); +const LLUUID ANIM_AGENT_HELLO = LLUUID("9b29cd61-c45b-5689-ded2-91756b8d76a9"); +const LLUUID ANIM_AGENT_HOLD_BAZOOKA_R = LLUUID("ef62d355-c815-4816-2474-b1acc21094a6"); +const LLUUID ANIM_AGENT_HOLD_BOW_L = LLUUID("8b102617-bcba-037b-86c1-b76219f90c88"); +const LLUUID ANIM_AGENT_HOLD_HANDGUN_R = LLUUID("efdc1727-8b8a-c800-4077-975fc27ee2f2"); +const LLUUID ANIM_AGENT_HOLD_RIFLE_R = LLUUID("3d94bad0-c55b-7dcc-8763-033c59405d33"); +const LLUUID ANIM_AGENT_HOLD_THROW_R = LLUUID("7570c7b5-1f22-56dd-56ef-a9168241bbb6"); +const LLUUID ANIM_AGENT_HOVER = LLUUID("4ae8016b-31b9-03bb-c401-b1ea941db41d"); +const LLUUID ANIM_AGENT_HOVER_DOWN = LLUUID("20f063ea-8306-2562-0b07-5c853b37b31e"); +const LLUUID ANIM_AGENT_HOVER_UP = LLUUID("62c5de58-cb33-5743-3d07-9e4cd4352864"); +const LLUUID ANIM_AGENT_IMPATIENT = LLUUID("5ea3991f-c293-392e-6860-91dfa01278a3"); +const LLUUID ANIM_AGENT_JUMP = LLUUID("2305bd75-1ca9-b03b-1faa-b176b8a8c49e"); +const LLUUID ANIM_AGENT_JUMP_FOR_JOY = LLUUID("709ea28e-1573-c023-8bf8-520c8bc637fa"); +const LLUUID ANIM_AGENT_KISS_MY_BUTT = LLUUID("19999406-3a3a-d58c-a2ac-d72e555dcf51"); +const LLUUID ANIM_AGENT_LAND = LLUUID("7a17b059-12b2-41b1-570a-186368b6aa6f"); +const LLUUID ANIM_AGENT_LAUGH_SHORT = LLUUID("ca5b3f14-3194-7a2b-c894-aa699b718d1f"); +const LLUUID ANIM_AGENT_MEDIUM_LAND = LLUUID("f4f00d6e-b9fe-9292-f4cb-0ae06ea58d57"); +const LLUUID ANIM_AGENT_MOTORCYCLE_SIT = LLUUID("08464f78-3a8e-2944-cba5-0c94aff3af29"); +const LLUUID ANIM_AGENT_MUSCLE_BEACH = LLUUID("315c3a41-a5f3-0ba4-27da-f893f769e69b"); +const LLUUID ANIM_AGENT_NO = LLUUID("5a977ed9-7f72-44e9-4c4c-6e913df8ae74"); +const LLUUID ANIM_AGENT_NO_UNHAPPY = LLUUID("d83fa0e5-97ed-7eb2-e798-7bd006215cb4"); +const LLUUID ANIM_AGENT_NYAH_NYAH = LLUUID("f061723d-0a18-754f-66ee-29a44795a32f"); +const LLUUID ANIM_AGENT_ONETWO_PUNCH = LLUUID("eefc79be-daae-a239-8c04-890f5d23654a"); +const LLUUID ANIM_AGENT_PEACE = LLUUID("b312b10e-65ab-a0a4-8b3c-1326ea8e3ed9"); +const LLUUID ANIM_AGENT_POINT_ME = LLUUID("17c024cc-eef2-f6a0-3527-9869876d7752"); +const LLUUID ANIM_AGENT_POINT_YOU = LLUUID("ec952cca-61ef-aa3b-2789-4d1344f016de"); +const LLUUID ANIM_AGENT_PRE_JUMP = LLUUID("7a4e87fe-de39-6fcb-6223-024b00893244"); +const LLUUID ANIM_AGENT_PUNCH_LEFT = LLUUID("f3300ad9-3462-1d07-2044-0fef80062da0"); +const LLUUID ANIM_AGENT_PUNCH_RIGHT = LLUUID("c8e42d32-7310-6906-c903-cab5d4a34656"); +const LLUUID ANIM_AGENT_REPULSED = LLUUID("36f81a92-f076-5893-dc4b-7c3795e487cf"); +const LLUUID ANIM_AGENT_ROUNDHOUSE_KICK = LLUUID("49aea43b-5ac3-8a44-b595-96100af0beda"); +const LLUUID ANIM_AGENT_RPS_COUNTDOWN = LLUUID("35db4f7e-28c2-6679-cea9-3ee108f7fc7f"); +const LLUUID ANIM_AGENT_RPS_PAPER = LLUUID("0836b67f-7f7b-f37b-c00a-460dc1521f5a"); +const LLUUID ANIM_AGENT_RPS_ROCK = LLUUID("42dd95d5-0bc6-6392-f650-777304946c0f"); +const LLUUID ANIM_AGENT_RPS_SCISSORS = LLUUID("16803a9f-5140-e042-4d7b-d28ba247c325"); +const LLUUID ANIM_AGENT_RUN = LLUUID("05ddbff8-aaa9-92a1-2b74-8fe77a29b445"); +const LLUUID ANIM_AGENT_RUN_NEW = LLUUID("1ab1b236-cd08-21e6-0cbc-0d923fc6eca2"); +const LLUUID ANIM_AGENT_SAD = LLUUID("0eb702e2-cc5a-9a88-56a5-661a55c0676a"); +const LLUUID ANIM_AGENT_SALUTE = LLUUID("cd7668a6-7011-d7e2-ead8-fc69eff1a104"); +const LLUUID ANIM_AGENT_SHOOT_BOW_L = LLUUID("e04d450d-fdb5-0432-fd68-818aaf5935f8"); +const LLUUID ANIM_AGENT_SHOUT = LLUUID("6bd01860-4ebd-127a-bb3d-d1427e8e0c42"); +const LLUUID ANIM_AGENT_SHRUG = LLUUID("70ea714f-3a97-d742-1b01-590a8fcd1db5"); +const LLUUID ANIM_AGENT_SIT = LLUUID("1a5fe8ac-a804-8a5d-7cbd-56bd83184568"); +const LLUUID ANIM_AGENT_SIT_FEMALE = LLUUID("b1709c8d-ecd3-54a1-4f28-d55ac0840782"); +const LLUUID ANIM_AGENT_SIT_GENERIC = LLUUID("245f3c54-f1c0-bf2e-811f-46d8eeb386e7"); +const LLUUID ANIM_AGENT_SIT_GROUND = LLUUID("1c7600d6-661f-b87b-efe2-d7421eb93c86"); +const LLUUID ANIM_AGENT_SIT_GROUND_CONSTRAINED = LLUUID("1a2bd58e-87ff-0df8-0b4c-53e047b0bb6e"); +const LLUUID ANIM_AGENT_SIT_TO_STAND = LLUUID("a8dee56f-2eae-9e7a-05a2-6fb92b97e21e"); +const LLUUID ANIM_AGENT_SLEEP = LLUUID("f2bed5f9-9d44-39af-b0cd-257b2a17fe40"); +const LLUUID ANIM_AGENT_SMOKE_IDLE = LLUUID("d2f2ee58-8ad1-06c9-d8d3-3827ba31567a"); +const LLUUID ANIM_AGENT_SMOKE_INHALE = LLUUID("6802d553-49da-0778-9f85-1599a2266526"); +const LLUUID ANIM_AGENT_SMOKE_THROW_DOWN = LLUUID("0a9fb970-8b44-9114-d3a9-bf69cfe804d6"); +const LLUUID ANIM_AGENT_SNAPSHOT = LLUUID("eae8905b-271a-99e2-4c0e-31106afd100c"); +const LLUUID ANIM_AGENT_STAND = LLUUID("2408fe9e-df1d-1d7d-f4ff-1384fa7b350f"); +const LLUUID ANIM_AGENT_STANDUP = LLUUID("3da1d753-028a-5446-24f3-9c9b856d9422"); +const LLUUID ANIM_AGENT_STAND_1 = LLUUID("15468e00-3400-bb66-cecc-646d7c14458e"); +const LLUUID ANIM_AGENT_STAND_2 = LLUUID("370f3a20-6ca6-9971-848c-9a01bc42ae3c"); +const LLUUID ANIM_AGENT_STAND_3 = LLUUID("42b46214-4b44-79ae-deb8-0df61424ff4b"); +const LLUUID ANIM_AGENT_STAND_4 = LLUUID("f22fed8b-a5ed-2c93-64d5-bdd8b93c889f"); +const LLUUID ANIM_AGENT_STRETCH = LLUUID("80700431-74ec-a008-14f8-77575e73693f"); +const LLUUID ANIM_AGENT_STRIDE = LLUUID("1cb562b0-ba21-2202-efb3-30f82cdf9595"); +const LLUUID ANIM_AGENT_SURF = LLUUID("41426836-7437-7e89-025d-0aa4d10f1d69"); +const LLUUID ANIM_AGENT_SURPRISE = LLUUID("313b9881-4302-73c0-c7d0-0e7a36b6c224"); +const LLUUID ANIM_AGENT_SWORD_STRIKE = LLUUID("85428680-6bf9-3e64-b489-6f81087c24bd"); +const LLUUID ANIM_AGENT_TALK = LLUUID("5c682a95-6da4-a463-0bf6-0f5b7be129d1"); +const LLUUID ANIM_AGENT_TANTRUM = LLUUID("11000694-3f41-adc2-606b-eee1d66f3724"); +const LLUUID ANIM_AGENT_THROW_R = LLUUID("aa134404-7dac-7aca-2cba-435f9db875ca"); +const LLUUID ANIM_AGENT_TRYON_SHIRT = LLUUID("83ff59fe-2346-f236-9009-4e3608af64c1"); +const LLUUID ANIM_AGENT_TURNLEFT = LLUUID("56e0ba0d-4a9f-7f27-6117-32f2ebbf6135"); +const LLUUID ANIM_AGENT_TURNRIGHT = LLUUID("2d6daa51-3192-6794-8e2e-a15f8338ec30"); +const LLUUID ANIM_AGENT_TYPE = LLUUID("c541c47f-e0c0-058b-ad1a-d6ae3a4584d9"); +const LLUUID ANIM_AGENT_WALK = LLUUID("6ed24bd8-91aa-4b12-ccc7-c97c857ab4e0"); +const LLUUID ANIM_AGENT_WALK_NEW = LLUUID("33339176-7ddc-9397-94a4-bf3403cbc8f5"); +const LLUUID ANIM_AGENT_WHISPER = LLUUID("7693f268-06c7-ea71-fa21-2b30d6533f8f"); +const LLUUID ANIM_AGENT_WHISTLE = LLUUID("b1ed7982-c68e-a982-7561-52a88a5298c0"); +const LLUUID ANIM_AGENT_WINK = LLUUID("869ecdad-a44b-671e-3266-56aef2e3ac2e"); +const LLUUID ANIM_AGENT_WINK_HOLLYWOOD = LLUUID("c0c4030f-c02b-49de-24ba-2331f43fe41c"); +const LLUUID ANIM_AGENT_WORRY = LLUUID("9f496bd2-589a-709f-16cc-69bf7df1d36c"); +const LLUUID ANIM_AGENT_YES = LLUUID("15dd911d-be82-2856-26db-27659b142875"); +const LLUUID ANIM_AGENT_YES_HAPPY = LLUUID("b8c8b2a3-9008-1771-3bfc-90924955ab2d"); +const LLUUID ANIM_AGENT_YOGA_FLOAT = LLUUID("42ecd00b-9947-a97c-400a-bbc9174c7aeb"); + LLUUID AGENT_WALK_ANIMS[] = {ANIM_AGENT_WALK, ANIM_AGENT_RUN, ANIM_AGENT_CROUCHWALK, ANIM_AGENT_TURNLEFT, ANIM_AGENT_TURNRIGHT}; S32 NUM_AGENT_WALK_ANIMS = LL_ARRAY_SIZE(AGENT_WALK_ANIMS); @@ -116,7 +256,9 @@ LLAnimationLibrary::LLAnimationLibrary() : mAnimMap[ANIM_AGENT_EXPRESS_WINK]= mAnimStringTable.addString("express_wink_emote"); mAnimMap[ANIM_AGENT_EXPRESS_WORRY]= mAnimStringTable.addString("express_worry_emote"); mAnimMap[ANIM_AGENT_FALLDOWN]= mAnimStringTable.addString("falldown"); + mAnimMap[ANIM_AGENT_FEMALE_RUN_NEW]= mAnimStringTable.addString("female_run_new"); mAnimMap[ANIM_AGENT_FEMALE_WALK]= mAnimStringTable.addString("female_walk"); + mAnimMap[ANIM_AGENT_FEMALE_WALK_NEW]= mAnimStringTable.addString("female_walk_new"); mAnimMap[ANIM_AGENT_FINGER_WAG]= mAnimStringTable.addString("angry_fingerwag"); mAnimMap[ANIM_AGENT_FIST_PUMP]= mAnimStringTable.addString("fist_pump"); mAnimMap[ANIM_AGENT_FLY]= mAnimStringTable.addString("fly"); @@ -156,6 +298,7 @@ LLAnimationLibrary::LLAnimationLibrary() : mAnimMap[ANIM_AGENT_RPS_ROCK]= mAnimStringTable.addString("rps_rock"); mAnimMap[ANIM_AGENT_RPS_SCISSORS]= mAnimStringTable.addString("rps_scissors"); mAnimMap[ANIM_AGENT_RUN]= mAnimStringTable.addString("run"); + mAnimMap[ANIM_AGENT_RUN_NEW]= mAnimStringTable.addString("run_new"); mAnimMap[ANIM_AGENT_SAD]= mAnimStringTable.addString("express_sad"); mAnimMap[ANIM_AGENT_SALUTE]= mAnimStringTable.addString("salute"); mAnimMap[ANIM_AGENT_SHOOT_BOW_L]= mAnimStringTable.addString("shoot_l_bow"); @@ -191,6 +334,7 @@ LLAnimationLibrary::LLAnimationLibrary() : mAnimMap[ANIM_AGENT_TURNRIGHT]= mAnimStringTable.addString("turnright"); mAnimMap[ANIM_AGENT_TYPE]= mAnimStringTable.addString("type"); mAnimMap[ANIM_AGENT_WALK]= mAnimStringTable.addString("walk"); + mAnimMap[ANIM_AGENT_WALK_NEW]= mAnimStringTable.addString("walk_new"); mAnimMap[ANIM_AGENT_WHISPER]= mAnimStringTable.addString("whisper"); mAnimMap[ANIM_AGENT_WHISTLE]= mAnimStringTable.addString("whistle"); mAnimMap[ANIM_AGENT_WINK]= mAnimStringTable.addString("express_wink"); @@ -260,6 +404,23 @@ LLUUID LLAnimationLibrary::stringToAnimState( const std::string& name, BOOL allo return id; } +//----------------------------------------------------------------------------- +// Associate an anim state with a name +//----------------------------------------------------------------------------- +void LLAnimationLibrary::animStateSetString( const LLUUID& state, const std::string& name) +{ + mAnimMap[state] = mAnimStringTable.addString(name); +} + +std::string LLAnimationLibrary::animationName( const LLUUID& id ) const +{ + const char *cptr = gAnimLibrary.animStateToString(id); + if (cptr) + return std::string(cptr); + else + return std::string("[") + id.asString() + std::string("]"); +} + // Animation states that the user can trigger as part of a gesture // See struct LLAnimStateEntry in header for label location information const LLAnimStateEntry gUserAnimStates[] = { @@ -337,6 +498,5 @@ const LLAnimStateEntry gUserAnimStates[] = { const S32 gUserAnimStatesCount = LL_ARRAY_SIZE(gUserAnimStates); - // End diff --git a/indra/llcharacter/llanimationstates.h b/indra/llcharacter/llanimationstates.h index 56b24d5215..59d3a7d789 100644 --- a/indra/llcharacter/llanimationstates.h +++ b/indra/llcharacter/llanimationstates.h @@ -49,142 +49,145 @@ //----------------------------------------------------------------------------- const S32 MAX_CONCURRENT_ANIMS = 16; - -const LLUUID ANIM_AGENT_AFRAID = LLUUID("6b61c8e8-4747-0d75-12d7-e49ff207a4ca"); -const LLUUID ANIM_AGENT_AIM_BAZOOKA_R = LLUUID("b5b4a67d-0aee-30d2-72cd-77b333e932ef"); -const LLUUID ANIM_AGENT_AIM_BOW_L = LLUUID("46bb4359-de38-4ed8-6a22-f1f52fe8f506"); -const LLUUID ANIM_AGENT_AIM_HANDGUN_R = LLUUID("3147d815-6338-b932-f011-16b56d9ac18b"); -const LLUUID ANIM_AGENT_AIM_RIFLE_R = LLUUID("ea633413-8006-180a-c3ba-96dd1d756720"); -const LLUUID ANIM_AGENT_ANGRY = LLUUID("5747a48e-073e-c331-f6f3-7c2149613d3e"); -const LLUUID ANIM_AGENT_AWAY = LLUUID("fd037134-85d4-f241-72c6-4f42164fedee"); -const LLUUID ANIM_AGENT_BACKFLIP = LLUUID("c4ca6188-9127-4f31-0158-23c4e2f93304"); -const LLUUID ANIM_AGENT_BELLY_LAUGH = LLUUID("18b3a4b5-b463-bd48-e4b6-71eaac76c515"); -const LLUUID ANIM_AGENT_BLOW_KISS = LLUUID("db84829b-462c-ee83-1e27-9bbee66bd624"); -const LLUUID ANIM_AGENT_BORED = LLUUID("b906c4ba-703b-1940-32a3-0c7f7d791510"); -const LLUUID ANIM_AGENT_BOW = LLUUID("82e99230-c906-1403-4d9c-3889dd98daba"); -const LLUUID ANIM_AGENT_BRUSH = LLUUID("349a3801-54f9-bf2c-3bd0-1ac89772af01"); -const LLUUID ANIM_AGENT_BUSY = LLUUID("efcf670c-2d18-8128-973a-034ebc806b67"); -const LLUUID ANIM_AGENT_CLAP = LLUUID("9b0c1c4e-8ac7-7969-1494-28c874c4f668"); -const LLUUID ANIM_AGENT_COURTBOW = LLUUID("9ba1c942-08be-e43a-fb29-16ad440efc50"); -const LLUUID ANIM_AGENT_CROUCH = LLUUID("201f3fdf-cb1f-dbec-201f-7333e328ae7c"); -const LLUUID ANIM_AGENT_CROUCHWALK = LLUUID("47f5f6fb-22e5-ae44-f871-73aaaf4a6022"); -const LLUUID ANIM_AGENT_CRY = LLUUID("92624d3e-1068-f1aa-a5ec-8244585193ed"); -const LLUUID ANIM_AGENT_CUSTOMIZE = LLUUID("038fcec9-5ebd-8a8e-0e2e-6e71a0a1ac53"); -const LLUUID ANIM_AGENT_CUSTOMIZE_DONE = LLUUID("6883a61a-b27b-5914-a61e-dda118a9ee2c"); -const LLUUID ANIM_AGENT_DANCE1 = LLUUID("b68a3d7c-de9e-fc87-eec8-543d787e5b0d"); -const LLUUID ANIM_AGENT_DANCE2 = LLUUID("928cae18-e31d-76fd-9cc9-2f55160ff818"); -const LLUUID ANIM_AGENT_DANCE3 = LLUUID("30047778-10ea-1af7-6881-4db7a3a5a114"); -const LLUUID ANIM_AGENT_DANCE4 = LLUUID("951469f4-c7b2-c818-9dee-ad7eea8c30b7"); -const LLUUID ANIM_AGENT_DANCE5 = LLUUID("4bd69a1d-1114-a0b4-625f-84e0a5237155"); -const LLUUID ANIM_AGENT_DANCE6 = LLUUID("cd28b69b-9c95-bb78-3f94-8d605ff1bb12"); -const LLUUID ANIM_AGENT_DANCE7 = LLUUID("a54d8ee2-28bb-80a9-7f0c-7afbbe24a5d6"); -const LLUUID ANIM_AGENT_DANCE8 = LLUUID("b0dc417c-1f11-af36-2e80-7e7489fa7cdc"); -const LLUUID ANIM_AGENT_DEAD = LLUUID("57abaae6-1d17-7b1b-5f98-6d11a6411276"); -const LLUUID ANIM_AGENT_DRINK = LLUUID("0f86e355-dd31-a61c-fdb0-3a96b9aad05f"); -const LLUUID ANIM_AGENT_EMBARRASSED = LLUUID("514af488-9051-044a-b3fc-d4dbf76377c6"); -const LLUUID ANIM_AGENT_EXPRESS_AFRAID = LLUUID("aa2df84d-cf8f-7218-527b-424a52de766e"); -const LLUUID ANIM_AGENT_EXPRESS_ANGER = LLUUID("1a03b575-9634-b62a-5767-3a679e81f4de"); -const LLUUID ANIM_AGENT_EXPRESS_BORED = LLUUID("214aa6c1-ba6a-4578-f27c-ce7688f61d0d"); -const LLUUID ANIM_AGENT_EXPRESS_CRY = LLUUID("d535471b-85bf-3b4d-a542-93bea4f59d33"); -const LLUUID ANIM_AGENT_EXPRESS_DISDAIN = LLUUID("d4416ff1-09d3-300f-4183-1b68a19b9fc1"); -const LLUUID ANIM_AGENT_EXPRESS_EMBARRASSED = LLUUID("0b8c8211-d78c-33e8-fa28-c51a9594e424"); -const LLUUID ANIM_AGENT_EXPRESS_FROWN = LLUUID("fee3df48-fa3d-1015-1e26-a205810e3001"); -const LLUUID ANIM_AGENT_EXPRESS_KISS = LLUUID("1e8d90cc-a84e-e135-884c-7c82c8b03a14"); -const LLUUID ANIM_AGENT_EXPRESS_LAUGH = LLUUID("62570842-0950-96f8-341c-809e65110823"); -const LLUUID ANIM_AGENT_EXPRESS_OPEN_MOUTH = LLUUID("d63bc1f9-fc81-9625-a0c6-007176d82eb7"); -const LLUUID ANIM_AGENT_EXPRESS_REPULSED = LLUUID("f76cda94-41d4-a229-2872-e0296e58afe1"); -const LLUUID ANIM_AGENT_EXPRESS_SAD = LLUUID("eb6ebfb2-a4b3-a19c-d388-4dd5c03823f7"); -const LLUUID ANIM_AGENT_EXPRESS_SHRUG = LLUUID("a351b1bc-cc94-aac2-7bea-a7e6ebad15ef"); -const LLUUID ANIM_AGENT_EXPRESS_SMILE = LLUUID("b7c7c833-e3d3-c4e3-9fc0-131237446312"); -const LLUUID ANIM_AGENT_EXPRESS_SURPRISE = LLUUID("728646d9-cc79-08b2-32d6-937f0a835c24"); -const LLUUID ANIM_AGENT_EXPRESS_TONGUE_OUT = LLUUID("835965c6-7f2f-bda2-5deb-2478737f91bf"); -const LLUUID ANIM_AGENT_EXPRESS_TOOTHSMILE = LLUUID("b92ec1a5-e7ce-a76b-2b05-bcdb9311417e"); -const LLUUID ANIM_AGENT_EXPRESS_WINK = LLUUID("da020525-4d94-59d6-23d7-81fdebf33148"); -const LLUUID ANIM_AGENT_EXPRESS_WORRY = LLUUID("9c05e5c7-6f07-6ca4-ed5a-b230390c3950"); -const LLUUID ANIM_AGENT_FALLDOWN = LLUUID("666307d9-a860-572d-6fd4-c3ab8865c094"); -const LLUUID ANIM_AGENT_FEMALE_WALK = LLUUID("f5fc7433-043d-e819-8298-f519a119b688"); -const LLUUID ANIM_AGENT_FINGER_WAG = LLUUID("c1bc7f36-3ba0-d844-f93c-93be945d644f"); -const LLUUID ANIM_AGENT_FIST_PUMP = LLUUID("7db00ccd-f380-f3ee-439d-61968ec69c8a"); -const LLUUID ANIM_AGENT_FLY = LLUUID("aec4610c-757f-bc4e-c092-c6e9caf18daf"); -const LLUUID ANIM_AGENT_FLYSLOW = LLUUID("2b5a38b2-5e00-3a97-a495-4c826bc443e6"); -const LLUUID ANIM_AGENT_HELLO = LLUUID("9b29cd61-c45b-5689-ded2-91756b8d76a9"); -const LLUUID ANIM_AGENT_HOLD_BAZOOKA_R = LLUUID("ef62d355-c815-4816-2474-b1acc21094a6"); -const LLUUID ANIM_AGENT_HOLD_BOW_L = LLUUID("8b102617-bcba-037b-86c1-b76219f90c88"); -const LLUUID ANIM_AGENT_HOLD_HANDGUN_R = LLUUID("efdc1727-8b8a-c800-4077-975fc27ee2f2"); -const LLUUID ANIM_AGENT_HOLD_RIFLE_R = LLUUID("3d94bad0-c55b-7dcc-8763-033c59405d33"); -const LLUUID ANIM_AGENT_HOLD_THROW_R = LLUUID("7570c7b5-1f22-56dd-56ef-a9168241bbb6"); -const LLUUID ANIM_AGENT_HOVER = LLUUID("4ae8016b-31b9-03bb-c401-b1ea941db41d"); -const LLUUID ANIM_AGENT_HOVER_DOWN = LLUUID("20f063ea-8306-2562-0b07-5c853b37b31e"); -const LLUUID ANIM_AGENT_HOVER_UP = LLUUID("62c5de58-cb33-5743-3d07-9e4cd4352864"); -const LLUUID ANIM_AGENT_IMPATIENT = LLUUID("5ea3991f-c293-392e-6860-91dfa01278a3"); -const LLUUID ANIM_AGENT_JUMP = LLUUID("2305bd75-1ca9-b03b-1faa-b176b8a8c49e"); -const LLUUID ANIM_AGENT_JUMP_FOR_JOY = LLUUID("709ea28e-1573-c023-8bf8-520c8bc637fa"); -const LLUUID ANIM_AGENT_KISS_MY_BUTT = LLUUID("19999406-3a3a-d58c-a2ac-d72e555dcf51"); -const LLUUID ANIM_AGENT_LAND = LLUUID("7a17b059-12b2-41b1-570a-186368b6aa6f"); -const LLUUID ANIM_AGENT_LAUGH_SHORT = LLUUID("ca5b3f14-3194-7a2b-c894-aa699b718d1f"); -const LLUUID ANIM_AGENT_MEDIUM_LAND = LLUUID("f4f00d6e-b9fe-9292-f4cb-0ae06ea58d57"); -const LLUUID ANIM_AGENT_MOTORCYCLE_SIT = LLUUID("08464f78-3a8e-2944-cba5-0c94aff3af29"); -const LLUUID ANIM_AGENT_MUSCLE_BEACH = LLUUID("315c3a41-a5f3-0ba4-27da-f893f769e69b"); -const LLUUID ANIM_AGENT_NO = LLUUID("5a977ed9-7f72-44e9-4c4c-6e913df8ae74"); -const LLUUID ANIM_AGENT_NO_UNHAPPY = LLUUID("d83fa0e5-97ed-7eb2-e798-7bd006215cb4"); -const LLUUID ANIM_AGENT_NYAH_NYAH = LLUUID("f061723d-0a18-754f-66ee-29a44795a32f"); -const LLUUID ANIM_AGENT_ONETWO_PUNCH = LLUUID("eefc79be-daae-a239-8c04-890f5d23654a"); -const LLUUID ANIM_AGENT_PEACE = LLUUID("b312b10e-65ab-a0a4-8b3c-1326ea8e3ed9"); -const LLUUID ANIM_AGENT_POINT_ME = LLUUID("17c024cc-eef2-f6a0-3527-9869876d7752"); -const LLUUID ANIM_AGENT_POINT_YOU = LLUUID("ec952cca-61ef-aa3b-2789-4d1344f016de"); -const LLUUID ANIM_AGENT_PRE_JUMP = LLUUID("7a4e87fe-de39-6fcb-6223-024b00893244"); -const LLUUID ANIM_AGENT_PUNCH_LEFT = LLUUID("f3300ad9-3462-1d07-2044-0fef80062da0"); -const LLUUID ANIM_AGENT_PUNCH_RIGHT = LLUUID("c8e42d32-7310-6906-c903-cab5d4a34656"); -const LLUUID ANIM_AGENT_REPULSED = LLUUID("36f81a92-f076-5893-dc4b-7c3795e487cf"); -const LLUUID ANIM_AGENT_ROUNDHOUSE_KICK = LLUUID("49aea43b-5ac3-8a44-b595-96100af0beda"); -const LLUUID ANIM_AGENT_RPS_COUNTDOWN = LLUUID("35db4f7e-28c2-6679-cea9-3ee108f7fc7f"); -const LLUUID ANIM_AGENT_RPS_PAPER = LLUUID("0836b67f-7f7b-f37b-c00a-460dc1521f5a"); -const LLUUID ANIM_AGENT_RPS_ROCK = LLUUID("42dd95d5-0bc6-6392-f650-777304946c0f"); -const LLUUID ANIM_AGENT_RPS_SCISSORS = LLUUID("16803a9f-5140-e042-4d7b-d28ba247c325"); -const LLUUID ANIM_AGENT_RUN = LLUUID("05ddbff8-aaa9-92a1-2b74-8fe77a29b445"); -const LLUUID ANIM_AGENT_SAD = LLUUID("0eb702e2-cc5a-9a88-56a5-661a55c0676a"); -const LLUUID ANIM_AGENT_SALUTE = LLUUID("cd7668a6-7011-d7e2-ead8-fc69eff1a104"); -const LLUUID ANIM_AGENT_SHOOT_BOW_L = LLUUID("e04d450d-fdb5-0432-fd68-818aaf5935f8"); -const LLUUID ANIM_AGENT_SHOUT = LLUUID("6bd01860-4ebd-127a-bb3d-d1427e8e0c42"); -const LLUUID ANIM_AGENT_SHRUG = LLUUID("70ea714f-3a97-d742-1b01-590a8fcd1db5"); -const LLUUID ANIM_AGENT_SIT = LLUUID("1a5fe8ac-a804-8a5d-7cbd-56bd83184568"); -const LLUUID ANIM_AGENT_SIT_FEMALE = LLUUID("b1709c8d-ecd3-54a1-4f28-d55ac0840782"); -const LLUUID ANIM_AGENT_SIT_GENERIC = LLUUID("245f3c54-f1c0-bf2e-811f-46d8eeb386e7"); -const LLUUID ANIM_AGENT_SIT_GROUND = LLUUID("1c7600d6-661f-b87b-efe2-d7421eb93c86"); -const LLUUID ANIM_AGENT_SIT_GROUND_CONSTRAINED = LLUUID("1a2bd58e-87ff-0df8-0b4c-53e047b0bb6e"); -const LLUUID ANIM_AGENT_SIT_TO_STAND = LLUUID("a8dee56f-2eae-9e7a-05a2-6fb92b97e21e"); -const LLUUID ANIM_AGENT_SLEEP = LLUUID("f2bed5f9-9d44-39af-b0cd-257b2a17fe40"); -const LLUUID ANIM_AGENT_SMOKE_IDLE = LLUUID("d2f2ee58-8ad1-06c9-d8d3-3827ba31567a"); -const LLUUID ANIM_AGENT_SMOKE_INHALE = LLUUID("6802d553-49da-0778-9f85-1599a2266526"); -const LLUUID ANIM_AGENT_SMOKE_THROW_DOWN = LLUUID("0a9fb970-8b44-9114-d3a9-bf69cfe804d6"); -const LLUUID ANIM_AGENT_SNAPSHOT = LLUUID("eae8905b-271a-99e2-4c0e-31106afd100c"); -const LLUUID ANIM_AGENT_STAND = LLUUID("2408fe9e-df1d-1d7d-f4ff-1384fa7b350f"); -const LLUUID ANIM_AGENT_STANDUP = LLUUID("3da1d753-028a-5446-24f3-9c9b856d9422"); -const LLUUID ANIM_AGENT_STAND_1 = LLUUID("15468e00-3400-bb66-cecc-646d7c14458e"); -const LLUUID ANIM_AGENT_STAND_2 = LLUUID("370f3a20-6ca6-9971-848c-9a01bc42ae3c"); -const LLUUID ANIM_AGENT_STAND_3 = LLUUID("42b46214-4b44-79ae-deb8-0df61424ff4b"); -const LLUUID ANIM_AGENT_STAND_4 = LLUUID("f22fed8b-a5ed-2c93-64d5-bdd8b93c889f"); -const LLUUID ANIM_AGENT_STRETCH = LLUUID("80700431-74ec-a008-14f8-77575e73693f"); -const LLUUID ANIM_AGENT_STRIDE = LLUUID("1cb562b0-ba21-2202-efb3-30f82cdf9595"); -const LLUUID ANIM_AGENT_SURF = LLUUID("41426836-7437-7e89-025d-0aa4d10f1d69"); -const LLUUID ANIM_AGENT_SURPRISE = LLUUID("313b9881-4302-73c0-c7d0-0e7a36b6c224"); -const LLUUID ANIM_AGENT_SWORD_STRIKE = LLUUID("85428680-6bf9-3e64-b489-6f81087c24bd"); -const LLUUID ANIM_AGENT_TALK = LLUUID("5c682a95-6da4-a463-0bf6-0f5b7be129d1"); -const LLUUID ANIM_AGENT_TANTRUM = LLUUID("11000694-3f41-adc2-606b-eee1d66f3724"); -const LLUUID ANIM_AGENT_THROW_R = LLUUID("aa134404-7dac-7aca-2cba-435f9db875ca"); -const LLUUID ANIM_AGENT_TRYON_SHIRT = LLUUID("83ff59fe-2346-f236-9009-4e3608af64c1"); -const LLUUID ANIM_AGENT_TURNLEFT = LLUUID("56e0ba0d-4a9f-7f27-6117-32f2ebbf6135"); -const LLUUID ANIM_AGENT_TURNRIGHT = LLUUID("2d6daa51-3192-6794-8e2e-a15f8338ec30"); -const LLUUID ANIM_AGENT_TYPE = LLUUID("c541c47f-e0c0-058b-ad1a-d6ae3a4584d9"); -const LLUUID ANIM_AGENT_WALK = LLUUID("6ed24bd8-91aa-4b12-ccc7-c97c857ab4e0"); -const LLUUID ANIM_AGENT_WHISPER = LLUUID("7693f268-06c7-ea71-fa21-2b30d6533f8f"); -const LLUUID ANIM_AGENT_WHISTLE = LLUUID("b1ed7982-c68e-a982-7561-52a88a5298c0"); -const LLUUID ANIM_AGENT_WINK = LLUUID("869ecdad-a44b-671e-3266-56aef2e3ac2e"); -const LLUUID ANIM_AGENT_WINK_HOLLYWOOD = LLUUID("c0c4030f-c02b-49de-24ba-2331f43fe41c"); -const LLUUID ANIM_AGENT_WORRY = LLUUID("9f496bd2-589a-709f-16cc-69bf7df1d36c"); -const LLUUID ANIM_AGENT_YES = LLUUID("15dd911d-be82-2856-26db-27659b142875"); -const LLUUID ANIM_AGENT_YES_HAPPY = LLUUID("b8c8b2a3-9008-1771-3bfc-90924955ab2d"); -const LLUUID ANIM_AGENT_YOGA_FLOAT = LLUUID("42ecd00b-9947-a97c-400a-bbc9174c7aeb"); +extern const LLUUID ANIM_AGENT_AFRAID; +extern const LLUUID ANIM_AGENT_AIM_BAZOOKA_R; +extern const LLUUID ANIM_AGENT_AIM_BOW_L; +extern const LLUUID ANIM_AGENT_AIM_HANDGUN_R; +extern const LLUUID ANIM_AGENT_AIM_RIFLE_R; +extern const LLUUID ANIM_AGENT_ANGRY; +extern const LLUUID ANIM_AGENT_AWAY; +extern const LLUUID ANIM_AGENT_BACKFLIP; +extern const LLUUID ANIM_AGENT_BELLY_LAUGH; +extern const LLUUID ANIM_AGENT_BLOW_KISS; +extern const LLUUID ANIM_AGENT_BORED; +extern const LLUUID ANIM_AGENT_BOW; +extern const LLUUID ANIM_AGENT_BRUSH; +extern const LLUUID ANIM_AGENT_BUSY; +extern const LLUUID ANIM_AGENT_CLAP; +extern const LLUUID ANIM_AGENT_COURTBOW; +extern const LLUUID ANIM_AGENT_CROUCH; +extern const LLUUID ANIM_AGENT_CROUCHWALK; +extern const LLUUID ANIM_AGENT_CRY; +extern const LLUUID ANIM_AGENT_CUSTOMIZE; +extern const LLUUID ANIM_AGENT_CUSTOMIZE_DONE; +extern const LLUUID ANIM_AGENT_DANCE1; +extern const LLUUID ANIM_AGENT_DANCE2; +extern const LLUUID ANIM_AGENT_DANCE3; +extern const LLUUID ANIM_AGENT_DANCE4; +extern const LLUUID ANIM_AGENT_DANCE5; +extern const LLUUID ANIM_AGENT_DANCE6; +extern const LLUUID ANIM_AGENT_DANCE7; +extern const LLUUID ANIM_AGENT_DANCE8; +extern const LLUUID ANIM_AGENT_DEAD; +extern const LLUUID ANIM_AGENT_DRINK; +extern const LLUUID ANIM_AGENT_EMBARRASSED; +extern const LLUUID ANIM_AGENT_EXPRESS_AFRAID; +extern const LLUUID ANIM_AGENT_EXPRESS_ANGER; +extern const LLUUID ANIM_AGENT_EXPRESS_BORED; +extern const LLUUID ANIM_AGENT_EXPRESS_CRY; +extern const LLUUID ANIM_AGENT_EXPRESS_DISDAIN; +extern const LLUUID ANIM_AGENT_EXPRESS_EMBARRASSED; +extern const LLUUID ANIM_AGENT_EXPRESS_FROWN; +extern const LLUUID ANIM_AGENT_EXPRESS_KISS; +extern const LLUUID ANIM_AGENT_EXPRESS_LAUGH; +extern const LLUUID ANIM_AGENT_EXPRESS_OPEN_MOUTH; +extern const LLUUID ANIM_AGENT_EXPRESS_REPULSED; +extern const LLUUID ANIM_AGENT_EXPRESS_SAD; +extern const LLUUID ANIM_AGENT_EXPRESS_SHRUG; +extern const LLUUID ANIM_AGENT_EXPRESS_SMILE; +extern const LLUUID ANIM_AGENT_EXPRESS_SURPRISE; +extern const LLUUID ANIM_AGENT_EXPRESS_TONGUE_OUT; +extern const LLUUID ANIM_AGENT_EXPRESS_TOOTHSMILE; +extern const LLUUID ANIM_AGENT_EXPRESS_WINK; +extern const LLUUID ANIM_AGENT_EXPRESS_WORRY; +extern const LLUUID ANIM_AGENT_FALLDOWN; +extern const LLUUID ANIM_AGENT_FEMALE_RUN_NEW; +extern const LLUUID ANIM_AGENT_FEMALE_WALK; +extern const LLUUID ANIM_AGENT_FEMALE_WALK_NEW; +extern const LLUUID ANIM_AGENT_FINGER_WAG; +extern const LLUUID ANIM_AGENT_FIST_PUMP; +extern const LLUUID ANIM_AGENT_FLY; +extern const LLUUID ANIM_AGENT_FLYSLOW; +extern const LLUUID ANIM_AGENT_HELLO; +extern const LLUUID ANIM_AGENT_HOLD_BAZOOKA_R; +extern const LLUUID ANIM_AGENT_HOLD_BOW_L; +extern const LLUUID ANIM_AGENT_HOLD_HANDGUN_R; +extern const LLUUID ANIM_AGENT_HOLD_RIFLE_R; +extern const LLUUID ANIM_AGENT_HOLD_THROW_R; +extern const LLUUID ANIM_AGENT_HOVER; +extern const LLUUID ANIM_AGENT_HOVER_DOWN; +extern const LLUUID ANIM_AGENT_HOVER_UP; +extern const LLUUID ANIM_AGENT_IMPATIENT; +extern const LLUUID ANIM_AGENT_JUMP; +extern const LLUUID ANIM_AGENT_JUMP_FOR_JOY; +extern const LLUUID ANIM_AGENT_KISS_MY_BUTT; +extern const LLUUID ANIM_AGENT_LAND; +extern const LLUUID ANIM_AGENT_LAUGH_SHORT; +extern const LLUUID ANIM_AGENT_MEDIUM_LAND; +extern const LLUUID ANIM_AGENT_MOTORCYCLE_SIT; +extern const LLUUID ANIM_AGENT_MUSCLE_BEACH; +extern const LLUUID ANIM_AGENT_NO; +extern const LLUUID ANIM_AGENT_NO_UNHAPPY; +extern const LLUUID ANIM_AGENT_NYAH_NYAH; +extern const LLUUID ANIM_AGENT_ONETWO_PUNCH; +extern const LLUUID ANIM_AGENT_PEACE; +extern const LLUUID ANIM_AGENT_POINT_ME; +extern const LLUUID ANIM_AGENT_POINT_YOU; +extern const LLUUID ANIM_AGENT_PRE_JUMP; +extern const LLUUID ANIM_AGENT_PUNCH_LEFT; +extern const LLUUID ANIM_AGENT_PUNCH_RIGHT; +extern const LLUUID ANIM_AGENT_REPULSED; +extern const LLUUID ANIM_AGENT_ROUNDHOUSE_KICK; +extern const LLUUID ANIM_AGENT_RPS_COUNTDOWN; +extern const LLUUID ANIM_AGENT_RPS_PAPER; +extern const LLUUID ANIM_AGENT_RPS_ROCK; +extern const LLUUID ANIM_AGENT_RPS_SCISSORS; +extern const LLUUID ANIM_AGENT_RUN; +extern const LLUUID ANIM_AGENT_RUN_NEW; +extern const LLUUID ANIM_AGENT_SAD; +extern const LLUUID ANIM_AGENT_SALUTE; +extern const LLUUID ANIM_AGENT_SHOOT_BOW_L; +extern const LLUUID ANIM_AGENT_SHOUT; +extern const LLUUID ANIM_AGENT_SHRUG; +extern const LLUUID ANIM_AGENT_SIT; +extern const LLUUID ANIM_AGENT_SIT_FEMALE; +extern const LLUUID ANIM_AGENT_SIT_GENERIC; +extern const LLUUID ANIM_AGENT_SIT_GROUND; +extern const LLUUID ANIM_AGENT_SIT_GROUND_CONSTRAINED; +extern const LLUUID ANIM_AGENT_SIT_TO_STAND; +extern const LLUUID ANIM_AGENT_SLEEP; +extern const LLUUID ANIM_AGENT_SMOKE_IDLE; +extern const LLUUID ANIM_AGENT_SMOKE_INHALE; +extern const LLUUID ANIM_AGENT_SMOKE_THROW_DOWN; +extern const LLUUID ANIM_AGENT_SNAPSHOT; +extern const LLUUID ANIM_AGENT_STAND; +extern const LLUUID ANIM_AGENT_STANDUP; +extern const LLUUID ANIM_AGENT_STAND_1; +extern const LLUUID ANIM_AGENT_STAND_2; +extern const LLUUID ANIM_AGENT_STAND_3; +extern const LLUUID ANIM_AGENT_STAND_4; +extern const LLUUID ANIM_AGENT_STRETCH; +extern const LLUUID ANIM_AGENT_STRIDE; +extern const LLUUID ANIM_AGENT_SURF; +extern const LLUUID ANIM_AGENT_SURPRISE; +extern const LLUUID ANIM_AGENT_SWORD_STRIKE; +extern const LLUUID ANIM_AGENT_TALK; +extern const LLUUID ANIM_AGENT_TANTRUM; +extern const LLUUID ANIM_AGENT_THROW_R; +extern const LLUUID ANIM_AGENT_TRYON_SHIRT; +extern const LLUUID ANIM_AGENT_TURNLEFT; +extern const LLUUID ANIM_AGENT_TURNRIGHT; +extern const LLUUID ANIM_AGENT_TYPE; +extern const LLUUID ANIM_AGENT_WALK; +extern const LLUUID ANIM_AGENT_WALK_NEW; +extern const LLUUID ANIM_AGENT_WHISPER; +extern const LLUUID ANIM_AGENT_WHISTLE; +extern const LLUUID ANIM_AGENT_WINK; +extern const LLUUID ANIM_AGENT_WINK_HOLLYWOOD; +extern const LLUUID ANIM_AGENT_WORRY; +extern const LLUUID ANIM_AGENT_YES; +extern const LLUUID ANIM_AGENT_YES_HAPPY; +extern const LLUUID ANIM_AGENT_YOGA_FLOAT; extern LLUUID AGENT_WALK_ANIMS[]; extern S32 NUM_AGENT_WALK_ANIMS; @@ -224,6 +227,16 @@ public: // Retun NULL if the name is invalid. //----------------------------------------------------------------------------- LLUUID stringToAnimState( const std::string& name, BOOL allow_ids = TRUE ); + + //----------------------------------------------------------------------------- + // Associate an anim state with a name + //----------------------------------------------------------------------------- + void animStateSetString( const LLUUID& state, const std::string& name); + + //----------------------------------------------------------------------------- + // Find the name for a given animation, or UUID string if none defined. + //----------------------------------------------------------------------------- + std::string animationName( const LLUUID& id ) const; }; struct LLAnimStateEntry @@ -249,7 +262,6 @@ extern const LLAnimStateEntry gUserAnimStates[]; extern const S32 gUserAnimStatesCount; extern LLAnimationLibrary gAnimLibrary; - #endif // LL_LLANIMATIONSTATES_H diff --git a/indra/llcharacter/llcharacter.cpp b/indra/llcharacter/llcharacter.cpp index 528a7bb4a5..27c0c0b640 100644 --- a/indra/llcharacter/llcharacter.cpp +++ b/indra/llcharacter/llcharacter.cpp @@ -181,16 +181,18 @@ void LLCharacter::requestStopMotion( LLMotion* motion) // updateMotions() //----------------------------------------------------------------------------- static LLFastTimer::DeclareTimer FTM_UPDATE_ANIMATION("Update Animation"); +static LLFastTimer::DeclareTimer FTM_UPDATE_HIDDEN_ANIMATION("Update Hidden Anim"); void LLCharacter::updateMotions(e_update_t update_type) { - LLFastTimer t(FTM_UPDATE_ANIMATION); if (update_type == HIDDEN_UPDATE) { + LLFastTimer t(FTM_UPDATE_HIDDEN_ANIMATION); mMotionController.updateMotionsMinimal(); } else { + LLFastTimer t(FTM_UPDATE_ANIMATION); // unpause if the number of outstanding pause requests has dropped to the initial one if (mMotionController.isPaused() && mPauseRequest->getNumRefs() == 1) { @@ -387,27 +389,6 @@ void LLCharacter::clearVisualParamWeights() } //----------------------------------------------------------------------------- -// BOOL visualParamWeightsAreDefault() -//----------------------------------------------------------------------------- -BOOL LLCharacter::visualParamWeightsAreDefault() -{ - for (LLVisualParam *param = getFirstVisualParam(); - param; - param = getNextVisualParam()) - { - if (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE) - { - if (param->getWeight() != param->getDefaultWeight()) - return false; - } - } - - return true; -} - - - -//----------------------------------------------------------------------------- // getVisualParam() //----------------------------------------------------------------------------- LLVisualParam* LLCharacter::getVisualParam(const char *param_name) diff --git a/indra/llcharacter/llcharacter.h b/indra/llcharacter/llcharacter.h index 27e2a51c62..cac73c01b9 100644 --- a/indra/llcharacter/llcharacter.h +++ b/indra/llcharacter/llcharacter.h @@ -212,12 +212,9 @@ public: F32 getVisualParamWeight(const char* param_name); F32 getVisualParamWeight(S32 index); - // set all morph weights to 0 + // set all morph weights to defaults void clearVisualParamWeights(); - // see if all the weights are default - BOOL visualParamWeightsAreDefault(); - // visual parameter accessors LLVisualParam* getFirstVisualParam() { @@ -231,6 +228,21 @@ public: return (mCurIterator++)->second; } + S32 getVisualParamCountInGroup(const EVisualParamGroup group) const + { + S32 rtn = 0; + for (visual_param_index_map_t::const_iterator iter = mVisualParamIndexMap.begin(); + iter != mVisualParamIndexMap.end(); + /**/ ) + { + if ((iter++)->second->getGroup() == group) + { + ++rtn; + } + } + return rtn; + } + LLVisualParam* getVisualParam(S32 id) const { visual_param_index_map_t::const_iterator iter = mVisualParamIndexMap.find(id); diff --git a/indra/llcharacter/lleditingmotion.cpp b/indra/llcharacter/lleditingmotion.cpp index 381d19e614..57554bdc35 100644 --- a/indra/llcharacter/lleditingmotion.cpp +++ b/indra/llcharacter/lleditingmotion.cpp @@ -221,7 +221,7 @@ BOOL LLEditingMotion::onUpdate(F32 time, U8* joint_mask) if (!target.isFinite()) { llerrs << "Non finite target in editing motion with target distance of " << target_dist << - " and focus point " << focus_pt << " and pointAtPt: " << *pointAtPt << llendl; + " and focus point " << focus_pt << llendl; } mTarget.setPosition( target + mParentJoint.getPosition()); diff --git a/indra/llcharacter/llkeyframemotion.cpp b/indra/llcharacter/llkeyframemotion.cpp index 5a2e3f73f9..f4dc3b927b 100644 --- a/indra/llcharacter/llkeyframemotion.cpp +++ b/indra/llcharacter/llkeyframemotion.cpp @@ -658,7 +658,12 @@ BOOL LLKeyframeMotion::onActivate() // If the keyframe anim has an associated emote, trigger it. if( mJointMotionList->mEmoteName.length() > 0 ) { - mCharacter->startMotion( gAnimLibrary.stringToAnimState(mJointMotionList->mEmoteName) ); + LLUUID emote_anim_id = gAnimLibrary.stringToAnimState(mJointMotionList->mEmoteName); + // don't start emote if already active to avoid recursion + if (!mCharacter->isMotionActive(emote_anim_id)) + { + mCharacter->startMotion( emote_anim_id ); + } } mLastLoopedTime = 0.f; diff --git a/indra/llcharacter/llkeyframewalkmotion.cpp b/indra/llcharacter/llkeyframewalkmotion.cpp index 461309bee9..0587e5642c 100644 --- a/indra/llcharacter/llkeyframewalkmotion.cpp +++ b/indra/llcharacter/llkeyframewalkmotion.cpp @@ -44,30 +44,31 @@ //----------------------------------------------------------------------------- // Macros //----------------------------------------------------------------------------- -const F32 MAX_WALK_PLAYBACK_SPEED = 8.f; // max m/s for which we adjust walk cycle speed - -const F32 MIN_WALK_SPEED = 0.1f; // minimum speed at which we use velocity for down foot detection -const F32 MAX_TIME_DELTA = 2.f; //max two seconds a frame for calculating interpolation -const F32 SPEED_ADJUST_MAX = 2.5f; // maximum adjustment of walk animation playback speed -const F32 SPEED_ADJUST_MAX_SEC = 3.f; // maximum adjustment to walk animation playback speed for a second -const F32 DRIFT_COMP_MAX_TOTAL = 0.07f;//0.55f; // maximum drift compensation overall, in any direction -const F32 DRIFT_COMP_MAX_SPEED = 4.f; // speed at which drift compensation total maxes out +const F32 MAX_WALK_PLAYBACK_SPEED = 8.f; // max m/s for which we adjust walk cycle speed + +const F32 MIN_WALK_SPEED = 0.1f; // minimum speed at which we use velocity for down foot detection +const F32 TIME_EPSILON = 0.001f; // minumum frame time +const F32 MAX_TIME_DELTA = 2.f; // max two seconds a frame for calculating interpolation +F32 SPEED_ADJUST_MAX_SEC = 2.f; // maximum adjustment to walk animation playback speed for a second +F32 ANIM_SPEED_MAX = 1.5f; // absolute upper limit on animation speed +const F32 DRIFT_COMP_MAX_TOTAL = 0.1f; // maximum drift compensation overall, in any direction +const F32 DRIFT_COMP_MAX_SPEED = 4.f; // speed at which drift compensation total maxes out const F32 MAX_ROLL = 0.6f; +const F32 PELVIS_COMPENSATION_WIEGHT = 0.7f; // proportion of foot drift that is compensated by moving the avatar directly +const F32 SPEED_ADJUST_TIME_CONSTANT = 0.1f; // time constant for speed adjustment interpolation //----------------------------------------------------------------------------- // LLKeyframeWalkMotion() // Class Constructor //----------------------------------------------------------------------------- LLKeyframeWalkMotion::LLKeyframeWalkMotion(const LLUUID &id) - : LLKeyframeMotion(id), - +: LLKeyframeMotion(id), mCharacter(NULL), mCyclePhase(0.0f), mRealTimeLast(0.0f), mAdjTimeLast(0.0f), mDownFoot(0) -{ -} +{} //----------------------------------------------------------------------------- @@ -75,8 +76,7 @@ LLKeyframeWalkMotion::LLKeyframeWalkMotion(const LLUUID &id) // Class Destructor //----------------------------------------------------------------------------- LLKeyframeWalkMotion::~LLKeyframeWalkMotion() -{ -} +{} //----------------------------------------------------------------------------- @@ -147,15 +147,12 @@ BOOL LLKeyframeWalkMotion::onUpdate(F32 time, U8* joint_mask) LLWalkAdjustMotion::LLWalkAdjustMotion(const LLUUID &id) : LLMotion(id), mLastTime(0.f), - mAvgCorrection(0.f), - mSpeedAdjust(0.f), mAnimSpeed(0.f), - mAvgSpeed(0.f), + mAdjustedSpeed(0.f), mRelativeDir(0.f), mAnkleOffset(0.f) { mName = "walk_adjust"; - mPelvisState = new LLJointState; } @@ -187,15 +184,16 @@ LLMotion::LLMotionInitStatus LLWalkAdjustMotion::onInitialize(LLCharacter *chara //----------------------------------------------------------------------------- BOOL LLWalkAdjustMotion::onActivate() { - mAvgCorrection = 0.f; - mSpeedAdjust = 0.f; mAnimSpeed = 0.f; - mAvgSpeed = 0.f; + mAdjustedSpeed = 0.f; mRelativeDir = 1.f; mPelvisState->setPosition(LLVector3::zero); // store ankle positions for next frame - mLastLeftAnklePos = mCharacter->getPosGlobalFromAgent(mLeftAnkleJoint->getWorldPosition()); - mLastRightAnklePos = mCharacter->getPosGlobalFromAgent(mRightAnkleJoint->getWorldPosition()); + mLastLeftFootGlobalPos = mCharacter->getPosGlobalFromAgent(mLeftAnkleJoint->getWorldPosition()); + mLastLeftFootGlobalPos.mdV[VZ] = 0.0; + + mLastRightFootGlobalPos = mCharacter->getPosGlobalFromAgent(mRightAnkleJoint->getWorldPosition()); + mLastRightFootGlobalPos.mdV[VZ] = 0.0; F32 leftAnkleOffset = (mLeftAnkleJoint->getWorldPosition() - mCharacter->getCharacterPosition()).magVec(); F32 rightAnkleOffset = (mRightAnkleJoint->getWorldPosition() - mCharacter->getCharacterPosition()).magVec(); @@ -209,143 +207,120 @@ BOOL LLWalkAdjustMotion::onActivate() //----------------------------------------------------------------------------- BOOL LLWalkAdjustMotion::onUpdate(F32 time, U8* joint_mask) { - LLVector3 footCorrection; - LLVector3 vel = mCharacter->getCharacterVelocity() * mCharacter->getTimeDilation(); - F32 deltaTime = llclamp(time - mLastTime, 0.f, MAX_TIME_DELTA); + // delta_time is guaranteed to be non zero + F32 delta_time = llclamp(time - mLastTime, TIME_EPSILON, MAX_TIME_DELTA); mLastTime = time; - LLQuaternion inv_rotation = ~mPelvisJoint->getWorldRotation(); + // find the avatar motion vector in the XY plane + LLVector3 avatar_velocity = mCharacter->getCharacterVelocity() * mCharacter->getTimeDilation(); + avatar_velocity.mV[VZ] = 0.f; - // get speed and normalize velocity vector - LLVector3 ang_vel = mCharacter->getCharacterAngularVelocity() * mCharacter->getTimeDilation(); - F32 speed = llmin(vel.normVec(), MAX_WALK_PLAYBACK_SPEED); - mAvgSpeed = lerp(mAvgSpeed, speed, LLCriticalDamp::getInterpolant(0.2f)); + F32 speed = llclamp(avatar_velocity.magVec(), 0.f, MAX_WALK_PLAYBACK_SPEED); - // calculate facing vector in pelvis-local space - // (either straight forward or back, depending on velocity) - LLVector3 localVel = vel * inv_rotation; - if (localVel.mV[VX] > 0.f) - { - mRelativeDir = 1.f; - } - else if (localVel.mV[VX] < 0.f) - { - mRelativeDir = -1.f; - } + // grab avatar->world transforms + LLQuaternion avatar_to_world_rot = mCharacter->getRootJoint()->getWorldRotation(); - // calculate world-space foot drift - LLVector3 leftFootDelta; - LLVector3 leftFootWorldPosition = mLeftAnkleJoint->getWorldPosition(); - LLVector3d leftFootGlobalPosition = mCharacter->getPosGlobalFromAgent(leftFootWorldPosition); - leftFootDelta.setVec(mLastLeftAnklePos - leftFootGlobalPosition); - mLastLeftAnklePos = leftFootGlobalPosition; + LLQuaternion world_to_avatar_rot(avatar_to_world_rot); + world_to_avatar_rot.conjugate(); - LLVector3 rightFootDelta; - LLVector3 rightFootWorldPosition = mRightAnkleJoint->getWorldPosition(); - LLVector3d rightFootGlobalPosition = mCharacter->getPosGlobalFromAgent(rightFootWorldPosition); - rightFootDelta.setVec(mLastRightAnklePos - rightFootGlobalPosition); - mLastRightAnklePos = rightFootGlobalPosition; + LLVector3 foot_slip_vector; // find foot drift along velocity vector - if (mAvgSpeed > 0.1) - { - // walking/running - F32 leftFootDriftAmt = leftFootDelta * vel; - F32 rightFootDriftAmt = rightFootDelta * vel; - - if (rightFootDriftAmt > leftFootDriftAmt) - { - footCorrection = rightFootDelta; - } else - { - footCorrection = leftFootDelta; - } - } - else - { - mAvgSpeed = ang_vel.magVec() * mAnkleOffset; - mRelativeDir = 1.f; - - // standing/turning - // find the lower foot - if (leftFootWorldPosition.mV[VZ] < rightFootWorldPosition.mV[VZ]) - { - // pivot on left foot - footCorrection = leftFootDelta; - } + if (speed > MIN_WALK_SPEED) + { // walking/running + + // calculate world-space foot drift + // use global coordinates to seamlessly handle region crossings + LLVector3d leftFootGlobalPosition = mCharacter->getPosGlobalFromAgent(mLeftAnkleJoint->getWorldPosition()); + leftFootGlobalPosition.mdV[VZ] = 0.0; + LLVector3 leftFootDelta(leftFootGlobalPosition - mLastLeftFootGlobalPos); + mLastLeftFootGlobalPos = leftFootGlobalPosition; + + LLVector3d rightFootGlobalPosition = mCharacter->getPosGlobalFromAgent(mRightAnkleJoint->getWorldPosition()); + rightFootGlobalPosition.mdV[VZ] = 0.0; + LLVector3 rightFootDelta(rightFootGlobalPosition - mLastRightFootGlobalPos); + mLastRightFootGlobalPos = rightFootGlobalPosition; + + // get foot drift along avatar direction of motion + F32 left_foot_slip_amt = leftFootDelta * avatar_velocity; + F32 right_foot_slip_amt = rightFootDelta * avatar_velocity; + + // if right foot is pushing back faster than left foot... + if (right_foot_slip_amt < left_foot_slip_amt) + { //...use it to calculate optimal animation speed + foot_slip_vector = rightFootDelta; + } else - { - // pivot on right foot - footCorrection = rightFootDelta; + { // otherwise use the left foot + foot_slip_vector = leftFootDelta; } - } - // rotate into avatar coordinates - footCorrection = footCorrection * inv_rotation; + // calculate ideal pelvis offset so that foot is glued to ground and damp towards it + // this will soak up transient slippage + // + // FIXME: this interacts poorly with speed adjustment + // mPelvisOffset compensates for foot drift by moving the avatar pelvis in the opposite + // direction of the drift, up to a certain limited distance + // but this will cause the animation playback rate calculation below to + // kick in too slowly and sometimes start playing the animation in reverse. - // calculate ideal pelvis offset so that foot is glued to ground and damp towards it - // the amount of foot slippage this frame + the offset applied last frame - mPelvisOffset = mPelvisState->getPosition() + lerp(LLVector3::zero, footCorrection, LLCriticalDamp::getInterpolant(0.2f)); + //mPelvisOffset -= PELVIS_COMPENSATION_WIEGHT * (foot_slip_vector * world_to_avatar_rot);//lerp(LLVector3::zero, -1.f * (foot_slip_vector * world_to_avatar_rot), LLCriticalDamp::getInterpolant(0.1f)); - // pelvis drift (along walk direction) - mAvgCorrection = lerp(mAvgCorrection, footCorrection.mV[VX] * mRelativeDir, LLCriticalDamp::getInterpolant(0.1f)); + ////F32 drift_comp_max = DRIFT_COMP_MAX_TOTAL * (llclamp(speed, 0.f, DRIFT_COMP_MAX_SPEED) / DRIFT_COMP_MAX_SPEED); + //F32 drift_comp_max = DRIFT_COMP_MAX_TOTAL; - // calculate average velocity of foot slippage - F32 footSlipVelocity = (deltaTime != 0.f) ? (-mAvgCorrection / deltaTime) : 0.f; + //// clamp pelvis offset to a 90 degree arc behind the nominal position + //// NB: this is an ADDITIVE amount that is accumulated every frame, so clamping it alone won't do the trick + //// must clamp with absolute position of pelvis in mind + //LLVector3 currentPelvisPos = mPelvisState->getJoint()->getPosition(); + //mPelvisOffset.mV[VX] = llclamp( mPelvisOffset.mV[VX], -drift_comp_max, drift_comp_max ); + //mPelvisOffset.mV[VY] = llclamp( mPelvisOffset.mV[VY], -drift_comp_max, drift_comp_max ); + //mPelvisOffset.mV[VZ] = 0.f; + // + //mLastRightFootGlobalPos += LLVector3d(mPelvisOffset * avatar_to_world_rot); + //mLastLeftFootGlobalPos += LLVector3d(mPelvisOffset * avatar_to_world_rot); - F32 newSpeedAdjust = 0.f; - - // modulate speed by dot products of facing and velocity - // so that if we are moving sideways, we slow down the animation - // and if we're moving backward, we walk backward + //foot_slip_vector -= mPelvisOffset; - F32 directional_factor = localVel.mV[VX] * mRelativeDir; - if (speed > 0.1f) - { - // calculate ratio of desired foot velocity to detected foot velocity - newSpeedAdjust = llclamp(footSlipVelocity - mAvgSpeed * (1.f - directional_factor), - -SPEED_ADJUST_MAX, SPEED_ADJUST_MAX); - newSpeedAdjust = lerp(mSpeedAdjust, newSpeedAdjust, LLCriticalDamp::getInterpolant(0.2f)); + LLVector3 avatar_movement_dir = avatar_velocity; + avatar_movement_dir.normalize(); + + // planted foot speed is avatar velocity - foot slip amount along avatar movement direction + F32 foot_speed = speed - ((foot_slip_vector * avatar_movement_dir) / delta_time); + + // multiply animation playback rate so that foot speed matches avatar speed + F32 desired_speed_multiplier = llclamp(speed / foot_speed, 0.f, ANIM_SPEED_MAX); - F32 speedDelta = newSpeedAdjust - mSpeedAdjust; - speedDelta = llclamp(speedDelta, -SPEED_ADJUST_MAX_SEC * deltaTime, SPEED_ADJUST_MAX_SEC * deltaTime); + // blend towards new speed adjustment value + F32 new_speed_adjust = lerp(mAdjustedSpeed, desired_speed_multiplier, LLCriticalDamp::getInterpolant(SPEED_ADJUST_TIME_CONSTANT)); - mSpeedAdjust = mSpeedAdjust + speedDelta; + // limit that rate at which the speed adjustment changes + F32 speedDelta = llclamp(new_speed_adjust - mAdjustedSpeed, -SPEED_ADJUST_MAX_SEC * delta_time, SPEED_ADJUST_MAX_SEC * delta_time); + mAdjustedSpeed += speedDelta; + + // modulate speed by dot products of facing and velocity + // so that if we are moving sideways, we slow down the animation + // and if we're moving backward, we walk backward + // do this at the end to be more responsive to direction changes instead of in the above speed calculations + F32 directional_factor = (avatar_movement_dir * world_to_avatar_rot).mV[VX]; + + mAnimSpeed = mAdjustedSpeed * directional_factor; } else - { - mSpeedAdjust = lerp(mSpeedAdjust, 0.f, LLCriticalDamp::getInterpolant(0.2f)); + { // standing/turning + + // damp out speed adjustment to 0 + mAnimSpeed = lerp(mAnimSpeed, 1.f, LLCriticalDamp::getInterpolant(0.2f)); + //mPelvisOffset = lerp(mPelvisOffset, LLVector3::zero, LLCriticalDamp::getInterpolant(0.2f)); } - mAnimSpeed = (mAvgSpeed + mSpeedAdjust) * mRelativeDir; -// char debug_text[64]; -// sprintf(debug_text, "Foot slip vel: %.2f", footSlipVelocity); -// mCharacter->addDebugText(debug_text); -// sprintf(debug_text, "Speed: %.2f", mAvgSpeed); -// mCharacter->addDebugText(debug_text); -// sprintf(debug_text, "Speed Adjust: %.2f", mSpeedAdjust); -// mCharacter->addDebugText(debug_text); -// sprintf(debug_text, "Animation Playback Speed: %.2f", mAnimSpeed); -// mCharacter->addDebugText(debug_text); - mCharacter->setAnimationData("Walk Speed", &mAnimSpeed); - - // clamp pelvis offset to a 90 degree arc behind the nominal position - F32 drift_comp_max = llclamp(speed, 0.f, DRIFT_COMP_MAX_SPEED) / DRIFT_COMP_MAX_SPEED; - drift_comp_max *= DRIFT_COMP_MAX_TOTAL; - - LLVector3 currentPelvisPos = mPelvisState->getJoint()->getPosition(); - - // NB: this is an ADDITIVE amount that is accumulated every frame, so clamping it alone won't do the trick - // must clamp with absolute position of pelvis in mind - mPelvisOffset.mV[VX] = llclamp( mPelvisOffset.mV[VX], -drift_comp_max - currentPelvisPos.mV[VX], drift_comp_max - currentPelvisPos.mV[VX] ); - mPelvisOffset.mV[VY] = llclamp( mPelvisOffset.mV[VY], -drift_comp_max - currentPelvisPos.mV[VY], drift_comp_max - currentPelvisPos.mV[VY]); - mPelvisOffset.mV[VZ] = 0.f; + // broadcast walk speed change + mCharacter->setAnimationData("Walk Speed", &mAnimSpeed); // set position + // need to update *some* joint to keep this animation active mPelvisState->setPosition(mPelvisOffset); - mCharacter->setAnimationData("Pelvis Offset", &mPelvisOffset); - return TRUE; } @@ -415,14 +390,8 @@ BOOL LLFlyAdjustMotion::onUpdate(F32 time, U8* joint_mask) // roll is critically damped interpolation between current roll and angular velocity-derived target roll mRoll = lerp(mRoll, target_roll, LLCriticalDamp::getInterpolant(0.1f)); -// llinfos << mRoll << llendl; - LLQuaternion roll(mRoll, LLVector3(0.f, 0.f, 1.f)); mPelvisState->setRotation(roll); -// F32 lerp_amt = LLCriticalDamp::getInterpolant(0.2f); -// -// LLVector3 pelvis_correction = mPelvisState->getPosition() - lerp(LLVector3::zero, mPelvisState->getJoint()->getPosition() + mPelvisState->getPosition(), lerp_amt); -// mPelvisState->setPosition(pelvis_correction); return TRUE; } diff --git a/indra/llcharacter/llkeyframewalkmotion.h b/indra/llcharacter/llkeyframewalkmotion.h index 90dd4dbcac..b507e9423a 100644 --- a/indra/llcharacter/llkeyframewalkmotion.h +++ b/indra/llcharacter/llkeyframewalkmotion.h @@ -126,13 +126,11 @@ public: LLJoint* mRightAnkleJoint; LLPointer<LLJointState> mPelvisState; LLJoint* mPelvisJoint; - LLVector3d mLastLeftAnklePos; - LLVector3d mLastRightAnklePos; + LLVector3d mLastLeftFootGlobalPos; + LLVector3d mLastRightFootGlobalPos; F32 mLastTime; - F32 mAvgCorrection; - F32 mSpeedAdjust; + F32 mAdjustedSpeed; F32 mAnimSpeed; - F32 mAvgSpeed; F32 mRelativeDir; LLVector3 mPelvisOffset; F32 mAnkleOffset; diff --git a/indra/llcharacter/llmotioncontroller.cpp b/indra/llcharacter/llmotioncontroller.cpp index bb9625b2bd..78d9398c1d 100644 --- a/indra/llcharacter/llmotioncontroller.cpp +++ b/indra/llcharacter/llmotioncontroller.cpp @@ -143,7 +143,8 @@ LLMotionController::LLMotionController() mPauseTime(0.f), mTimeStep(0.f), mTimeStepCount(0), - mLastInterp(0.f) + mLastInterp(0.f), + mIsSelf(FALSE) { } @@ -446,6 +447,7 @@ BOOL LLMotionController::stopMotionInstance(LLMotion* motion, BOOL stop_immediat return FALSE; } + // If on active list, stop it if (isMotionActive(motion) && !motion->isStopped()) { @@ -1033,6 +1035,31 @@ LLMotion* LLMotionController::findMotion(const LLUUID& id) const } //----------------------------------------------------------------------------- +// dumpMotions() +//----------------------------------------------------------------------------- +void LLMotionController::dumpMotions() +{ + llinfos << "=====================================" << llendl; + for (motion_map_t::iterator iter = mAllMotions.begin(); + iter != mAllMotions.end(); iter++) + { + LLUUID id = iter->first; + std::string state_string; + LLMotion *motion = iter->second; + if (mLoadingMotions.find(motion) != mLoadingMotions.end()) + state_string += std::string("l"); + if (mLoadedMotions.find(motion) != mLoadedMotions.end()) + state_string += std::string("L"); + if (std::find(mActiveMotions.begin(), mActiveMotions.end(), motion)!=mActiveMotions.end()) + state_string += std::string("A"); + if (mDeprecatedMotions.find(motion) != mDeprecatedMotions.end()) + state_string += std::string("D"); + llinfos << gAnimLibrary.animationName(id) << " " << state_string << llendl; + + } +} + +//----------------------------------------------------------------------------- // deactivateAllMotions() //----------------------------------------------------------------------------- void LLMotionController::deactivateAllMotions() diff --git a/indra/llcharacter/llmotioncontroller.h b/indra/llcharacter/llmotioncontroller.h index 5c3ec223cb..f8bf5ac289 100644 --- a/indra/llcharacter/llmotioncontroller.h +++ b/indra/llcharacter/llmotioncontroller.h @@ -92,6 +92,7 @@ class LLMotionController public: typedef std::list<LLMotion*> motion_list_t; typedef std::set<LLMotion*> motion_set_t; + BOOL mIsSelf; public: // Constructor @@ -169,6 +170,10 @@ public: bool isMotionLoading( LLMotion *motion ); LLMotion *findMotion( const LLUUID& id ) const; + void dumpMotions(); + + const LLFrameTimer& getFrameTimer() { return mTimer; } + protected: // internal operations act on motion instances directly // as there can be duplicate motions per id during blending overlap diff --git a/indra/llcharacter/llmultigesture.cpp b/indra/llcharacter/llmultigesture.cpp index 05d1bc0cd9..ee60430d97 100644 --- a/indra/llcharacter/llmultigesture.cpp +++ b/indra/llcharacter/llmultigesture.cpp @@ -498,6 +498,10 @@ std::vector<std::string> LLGestureStepWait::getLabel() const strings.push_back("until animations are done"); // label += "until animations are done"; } + else + { + strings.push_back(""); + } return strings; } diff --git a/indra/llcharacter/llvisualparam.cpp b/indra/llcharacter/llvisualparam.cpp index 297322fe58..703fe2f9cc 100644 --- a/indra/llcharacter/llvisualparam.cpp +++ b/indra/llcharacter/llvisualparam.cpp @@ -284,7 +284,7 @@ void LLVisualParam::setAnimationTarget(F32 target_value, BOOL upload_bake) void LLVisualParam::setNextParam( LLVisualParam *next ) { llassert(!mNext); - + llassert(getWeight() == getDefaultWeight()); // need to establish mNext before we start changing values on this, else initial value won't get mirrored (we can fix that, but better to forbid this pattern) mNext = next; } diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt index 9ead183a9e..2a036df06e 100644 --- a/indra/llcommon/CMakeLists.txt +++ b/indra/llcommon/CMakeLists.txt @@ -9,6 +9,7 @@ include(Linking) include(Boost) include(Pth) include(LLSharedLibs) +include(GoogleBreakpad) include(GooglePerfTools) include(Copy3rdPartyLibs) @@ -35,6 +36,7 @@ set(llcommon_SOURCE_FILES llbase32.cpp llbase64.cpp llcommon.cpp + llcommonutils.cpp llcoros.cpp llcrc.cpp llcriticaldamp.cpp @@ -50,6 +52,7 @@ set(llcommon_SOURCE_FILES lleventdispatcher.cpp lleventfilter.cpp llevents.cpp + lleventtimer.cpp llfasttimer_class.cpp llfile.cpp llfindlocale.cpp @@ -123,6 +126,7 @@ set(llcommon_HEADER_FILES llchat.h llclickaction.h llcommon.h + llcommonutils.h llcoros.h llcrc.h llcriticaldamp.h @@ -164,7 +168,6 @@ set(llcommon_HEADER_FILES llhttpstatuscodes.h llindexedqueue.h llinstancetracker.h - llinstancetracker.h llkeythrottle.h lllazy.h lllistenerwrapper.h @@ -230,7 +233,6 @@ set(llcommon_HEADER_FILES metaclasst.h metaproperty.h metapropertyt.h - processor.h reflective.h reflectivet.h roles_constants.h @@ -257,6 +259,7 @@ endif(LLCOMMON_LINK_SHARED) target_link_libraries( llcommon + ${BREAKPAD_EXCEPTION_HANDLER_LIBRARIES} ${APRUTIL_LIBRARIES} ${APR_LIBRARIES} ${EXPAT_LIBRARIES} @@ -288,6 +291,7 @@ if (LL_TESTS) LL_ADD_INTEGRATION_TEST(llframetimer "" "${test_libs}") LL_ADD_INTEGRATION_TEST(llinstancetracker "" "${test_libs}") LL_ADD_INTEGRATION_TEST(lllazy "" "${test_libs}") + LL_ADD_INTEGRATION_TEST(llprocessor "" "${test_libs}") LL_ADD_INTEGRATION_TEST(llrand "" "${test_libs}") LL_ADD_INTEGRATION_TEST(llsdserialize "" "${test_libs}") LL_ADD_INTEGRATION_TEST(llstring "" "${test_libs}") diff --git a/indra/llcommon/llapp.cpp b/indra/llcommon/llapp.cpp index 968b92d1e7..0447ca93f5 100644 --- a/indra/llcommon/llapp.cpp +++ b/indra/llcommon/llapp.cpp @@ -30,6 +30,14 @@ * $/LicenseInfo$ */ +#include <cstdlib> + +#ifdef LL_DARWIN +#include <sys/types.h> +#include <unistd.h> +#include <sys/sysctl.h> +#endif + #include "linden_common.h" #include "llapp.h" @@ -41,7 +49,10 @@ #include "lllivefile.h" #include "llmemory.h" #include "llstl.h" // for DeletePointer() -#include "lltimer.h" +#include "llstring.h" +#include "lleventtimer.h" + +#include "google_breakpad/exception_handler.h" // // Signal handling @@ -51,11 +62,22 @@ #if LL_WINDOWS LONG WINAPI default_windows_exception_handler(struct _EXCEPTION_POINTERS *exception_infop); BOOL ConsoleCtrlHandler(DWORD fdwCtrlType); +bool windows_post_minidump_callback(const wchar_t* dump_path, + const wchar_t* minidump_id, + void* context, + EXCEPTION_POINTERS* exinfo, + MDRawAssertionInfo* assertion, + bool succeeded); #else # include <signal.h> # include <unistd.h> // for fork() void setup_signals(); void default_unix_signal_handler(int signum, siginfo_t *info, void *); + +// Called by breakpad exception handler after the minidump has been generated. +bool unix_post_minidump_callback(const char *dump_dir, + const char *minidump_id, + void *context, bool succeeded); # if LL_DARWIN /* OSX doesn't support SIGRT* */ S32 LL_SMACKDOWN_SIGNAL = SIGUSR1; @@ -81,7 +103,6 @@ BOOL LLApp::sLogInSignal = FALSE; // static LLApp::EAppStatus LLApp::sStatus = LLApp::APP_STATUS_STOPPED; // Keeps track of application status LLAppErrorHandler LLApp::sErrorHandler = NULL; -LLAppErrorHandler LLApp::sSyncErrorHandler = NULL; BOOL LLApp::sErrorThreadRunning = FALSE; #if !LL_WINDOWS LLApp::child_map LLApp::sChildMap; @@ -123,7 +144,12 @@ void LLApp::commonCtor() // Set the application to this instance. sApplication = this; - + + mExceptionHandler = 0; + + // initialize the buffer to write the minidump filename to + // (this is used to avoid allocating memory in the crash handler) + memset(minidump_path, 0, MAX_MINDUMP_PATH_LENGTH); } LLApp::LLApp(LLErrorThread *error_thread) : @@ -152,6 +178,8 @@ LLApp::~LLApp() delete mThreadErrorp; mThreadErrorp = NULL; } + + if(mExceptionHandler != 0) delete mExceptionHandler; LLCommon::cleanupClass(); } @@ -262,19 +290,18 @@ void LLApp::setupErrorHandling() // occasionally checks to see if the app is in an error state, and sees if it needs to be run. #if LL_WINDOWS - // Windows doesn't have the same signal handling mechanisms as UNIX, thus APR doesn't provide - // a signal handling thread implementation. - // What we do is install an unhandled exception handler, which will try to do the right thing - // in the case of an error (generate a minidump) - - // Disable this until the viewer gets ported so server crashes can be JIT debugged. - //LPTOP_LEVEL_EXCEPTION_FILTER prev_filter; - //prev_filter = SetUnhandledExceptionFilter(default_windows_exception_handler); - // This sets a callback to handle w32 signals to the console window. // The viewer shouldn't be affected, sicne its a windowed app. SetConsoleCtrlHandler( (PHANDLER_ROUTINE) ConsoleCtrlHandler, TRUE); + // Install the Google Breakpad crash handler for Windows + if(mExceptionHandler == 0) + { + llwarns << "adding breakpad exception handler" << llendl; + mExceptionHandler = new google_breakpad::ExceptionHandler( + L"C:\\Temp\\", 0, windows_post_minidump_callback, 0, google_breakpad::ExceptionHandler::HANDLER_ALL); + } + #else // // Start up signal handling. @@ -282,9 +309,49 @@ void LLApp::setupErrorHandling() // There are two different classes of signals. Synchronous signals are delivered to a specific // thread, asynchronous signals can be delivered to any thread (in theory) // - setup_signals(); - + + // Add google breakpad exception handler configured for Darwin/Linux. + bool installHandler = true; +#ifdef LL_DARWIN + // For the special case of Darwin, we do not want to install the handler if + // the process is being debugged as the app will exit with value ABRT (6) if + // we do. Unfortunately, the code below which performs that test relies on + // the structure kinfo_proc which has been tagged by apple as an unstable + // API. We disable this test for shipping versions to avoid conflicts with + // future releases of Darwin. This test is really only needed for developers + // starting the app from a debugger anyway. + #ifndef LL_RELEASE_FOR_DOWNLOAD + int mib[4]; + mib[0] = CTL_KERN; + mib[1] = KERN_PROC; + mib[2] = KERN_PROC_PID; + mib[3] = getpid(); + + struct kinfo_proc info; + memset(&info, 0, sizeof(info)); + + size_t size = sizeof(info); + int result = sysctl(mib, sizeof(mib) / sizeof(*mib), &info, &size, NULL, 0); + if((result == 0) || (errno == ENOMEM)) + { + // P_TRACED flag is set, so this process is being debugged; do not install + // the handler + if(info.kp_proc.p_flag & P_TRACED) installHandler = false; + } + else + { + // Failed to discover if the process is being debugged; default to + // installing the handler. + installHandler = true; + } + #endif +#endif + if(installHandler && (mExceptionHandler == 0)) + { + std::string dumpPath = "/tmp/"; + mExceptionHandler = new google_breakpad::ExceptionHandler(dumpPath, 0, &unix_post_minidump_callback, 0, true); + } #endif startErrorThread(); @@ -310,21 +377,6 @@ void LLApp::setErrorHandler(LLAppErrorHandler handler) LLApp::sErrorHandler = handler; } - -void LLApp::setSyncErrorHandler(LLAppErrorHandler handler) -{ - LLApp::sSyncErrorHandler = handler; -} - -// static -void LLApp::runSyncErrorHandler() -{ - if (LLApp::sSyncErrorHandler) - { - LLApp::sSyncErrorHandler(); - } -} - // static void LLApp::runErrorHandler() { @@ -337,7 +389,6 @@ void LLApp::runErrorHandler() LLApp::setStopped(); } - // static void LLApp::setStatus(EAppStatus status) { @@ -348,15 +399,27 @@ void LLApp::setStatus(EAppStatus status) // static void LLApp::setError() { - if (!isError()) - { - // perform any needed synchronous error-handling - runSyncErrorHandler(); - // set app status to ERROR so that the LLErrorThread notices - setStatus(APP_STATUS_ERROR); - } + // set app status to ERROR so that the LLErrorThread notices + setStatus(APP_STATUS_ERROR); } +void LLApp::setMiniDumpDir(const std::string &path) +{ + if(mExceptionHandler == 0) return; +#ifdef LL_WINDOWS + wchar_t buffer[MAX_MINDUMP_PATH_LENGTH]; + mbstowcs(buffer, path.c_str(), MAX_MINDUMP_PATH_LENGTH); + mExceptionHandler->set_dump_path(std::wstring(buffer)); +#else + mExceptionHandler->set_dump_path(path); +#endif +} + +void LLApp::writeMiniDump() +{ + if(mExceptionHandler == 0) return; + mExceptionHandler->WriteMinidump(); +} // static void LLApp::setQuitting() @@ -587,6 +650,7 @@ void setup_signals() // Asynchronous signals that result in core sigaction(SIGQUIT, &act, NULL); + } void clear_signals() @@ -765,4 +829,97 @@ void default_unix_signal_handler(int signum, siginfo_t *info, void *) } } +bool unix_post_minidump_callback(const char *dump_dir, + const char *minidump_id, + void *context, bool succeeded) +{ + // Copy minidump file path into fixed buffer in the app instance to avoid + // heap allocations in a crash handler. + + // path format: <dump_dir>/<minidump_id>.dmp + int dirPathLength = strlen(dump_dir); + int idLength = strlen(minidump_id); + + // The path must not be truncated. + llassert((dirPathLength + idLength + 5) <= LLApp::MAX_MINDUMP_PATH_LENGTH); + + char * path = LLApp::instance()->getMiniDumpFilename(); + S32 remaining = LLApp::MAX_MINDUMP_PATH_LENGTH; + strncpy(path, dump_dir, remaining); + remaining -= dirPathLength; + path += dirPathLength; + if (remaining > 0 && dirPathLength > 0 && path[-1] != '/') + { + *path++ = '/'; + --remaining; + } + if (remaining > 0) + { + strncpy(path, minidump_id, remaining); + remaining -= idLength; + path += idLength; + strncpy(path, ".dmp", remaining); + } + + llinfos << "generated minidump: " << LLApp::instance()->getMiniDumpFilename() << llendl; + LLApp::runErrorHandler(); + return true; +} #endif // !WINDOWS + +#ifdef LL_WINDOWS +bool windows_post_minidump_callback(const wchar_t* dump_path, + const wchar_t* minidump_id, + void* context, + EXCEPTION_POINTERS* exinfo, + MDRawAssertionInfo* assertion, + bool succeeded) +{ + char * path = LLApp::instance()->getMiniDumpFilename(); + S32 remaining = LLApp::MAX_MINDUMP_PATH_LENGTH; + size_t bytesUsed; + + bytesUsed = wcstombs(path, dump_path, static_cast<size_t>(remaining)); + remaining -= bytesUsed; + path += bytesUsed; + if(remaining > 0 && bytesUsed > 0 && path[-1] != '\\') + { + *path++ = '\\'; + --remaining; + } + if(remaining > 0) + { + bytesUsed = wcstombs(path, minidump_id, static_cast<size_t>(remaining)); + remaining -= bytesUsed; + path += bytesUsed; + } + if(remaining > 0) + { + strncpy(path, ".dmp", remaining); + } + + llinfos << "generated minidump: " << LLApp::instance()->getMiniDumpFilename() << llendl; + // *NOTE:Mani - this code is stolen from LLApp, where its never actually used. + //OSMessageBox("Attach Debugger Now", "Error", OSMB_OK); + // *TODO: Translate the signals/exceptions into cross-platform stuff + // Windows implementation + llinfos << "Entering Windows Exception Handler..." << llendl; + + if (LLApp::isError()) + { + llwarns << "Got another fatal signal while in the error handler, die now!" << llendl; + } + + // Flag status to error, so thread_error starts its work + LLApp::setError(); + + // Block in the exception handler until the app has stopped + // This is pretty sketchy, but appears to work just fine + while (!LLApp::isStopped()) + { + ms_sleep(10); + } + + return true; +} +#endif diff --git a/indra/llcommon/llapp.h b/indra/llcommon/llapp.h index 27a52cdd99..fef05a7939 100644 --- a/indra/llcommon/llapp.h +++ b/indra/llcommon/llapp.h @@ -66,6 +66,10 @@ public: }; #endif +namespace google_breakpad { + class ExceptionHandler; // See exception_handler.h +} + class LL_COMMON_API LLApp : public LLOptionInterface { friend class LLErrorThread; @@ -227,15 +231,27 @@ public: void setupErrorHandling(); void setErrorHandler(LLAppErrorHandler handler); - void setSyncErrorHandler(LLAppErrorHandler handler); + static void runErrorHandler(); // run shortly after we detect an error, ran in the relatively robust context of the LLErrorThread - preferred. //@} + + // the maximum length of the minidump filename returned by getMiniDumpFilename() + static const U32 MAX_MINDUMP_PATH_LENGTH = 256; + + // change the directory where Breakpad minidump files are written to + void setMiniDumpDir(const std::string &path); + + // Return the Google Breakpad minidump filename after a crash. + char *getMiniDumpFilename() { return minidump_path; } + + // Write out a Google Breakpad minidump file. + void writeMiniDump(); #if !LL_WINDOWS // // Child process handling (Unix only for now) // // Set a callback to be run on exit of a child process - // WARNING! This callback is run from the signal handler due to the extreme crappiness of + // WARNING! This callback is run from the signal handler due to // Linux threading requiring waitpid() to be called from the thread that spawned the process. // At some point I will make this more behaved, but I'm not going to fix this right now - djs void setChildCallback(pid_t pid, LLAppChildCallback callback); @@ -286,15 +302,14 @@ protected: private: void startErrorThread(); - static void runErrorHandler(); // run shortly after we detect an error, ran in the relatively robust context of the LLErrorThread - preferred. - static void runSyncErrorHandler(); // run IMMEDIATELY when we get an error, ran in the context of the faulting thread. + // Contains the filename of the minidump file after a crash. + char minidump_path[MAX_MINDUMP_PATH_LENGTH]; // *NOTE: On Windows, we need a routine to reset the structured // exception handler when some evil driver has taken it over for // their own purposes typedef int(*signal_handler_func)(int signum); static LLAppErrorHandler sErrorHandler; - static LLAppErrorHandler sSyncErrorHandler; // Default application threads LLErrorThread* mThreadErrorp; // Waits for app to go to status ERROR, then runs the error callback @@ -315,6 +330,8 @@ private: private: // the static application instance if it was created. static LLApp* sApplication; + + google_breakpad::ExceptionHandler * mExceptionHandler; #if !LL_WINDOWS diff --git a/indra/llcommon/llapr.cpp b/indra/llcommon/llapr.cpp index ed70b1d9f2..7330b00bcf 100644 --- a/indra/llcommon/llapr.cpp +++ b/indra/llcommon/llapr.cpp @@ -543,14 +543,13 @@ S32 LLAPRFile::readEx(const std::string& filename, void *buf, S32 offset, S32 nb return 0; } - S32 off; - if (offset < 0) - off = LLAPRFile::seek(file_handle, APR_END, 0); - else - off = LLAPRFile::seek(file_handle, APR_SET, offset); + llassert(offset >= 0); + + if (offset > 0) + offset = LLAPRFile::seek(file_handle, APR_SET, offset); apr_size_t bytes_read; - if (off < 0) + if (offset < 0) { bytes_read = 0; } diff --git a/indra/llcommon/llapr.h b/indra/llcommon/llapr.h index b05a222b33..08cf11e593 100644 --- a/indra/llcommon/llapr.h +++ b/indra/llcommon/llapr.h @@ -182,7 +182,7 @@ typedef LLAtomic32<U32> LLAtomicU32; typedef LLAtomic32<S32> LLAtomicS32; // File IO convenience functions. -// Returns NULL if the file fails to openm sets *sizep to file size of not NULL +// Returns NULL if the file fails to open, sets *sizep to file size if not NULL // abbreviated flags #define LL_APR_R (APR_READ) // "r" #define LL_APR_W (APR_CREATE|APR_TRUNCATE|APR_WRITE) // "w" @@ -200,7 +200,7 @@ typedef LLAtomic32<S32> LLAtomicS32; // especially do not put some time-costly operations between open() and close(). // otherwise it might lock the APRFilePool. //there are two different apr_pools the APRFile can use: -// 1, a temperary pool passed to an APRFile function, which is used within this function and only once. +// 1, a temporary pool passed to an APRFile function, which is used within this function and only once. // 2, a global pool. // @@ -255,12 +255,12 @@ public: // Returns bytes read/written, 0 if read/write fails: static S32 readEx(const std::string& filename, void *buf, S32 offset, S32 nbytes, LLVolatileAPRPool* pool = NULL); - static S32 writeEx(const std::string& filename, void *buf, S32 offset, S32 nbytes, LLVolatileAPRPool* pool = NULL); + static S32 writeEx(const std::string& filename, void *buf, S32 offset, S32 nbytes, LLVolatileAPRPool* pool = NULL); // offset<0 means append //******************************************************************************************************************************* }; /** - * @brief Function which approprately logs error or remains quiet on + * @brief Function which appropriately logs error or remains quiet on * APR_SUCCESS. * @return Returns <code>true</code> if status is an error condition. */ diff --git a/indra/llcommon/llassettype.cpp b/indra/llcommon/llassettype.cpp index 6d5b12d840..2cd29448ae 100644 --- a/indra/llcommon/llassettype.cpp +++ b/indra/llcommon/llassettype.cpp @@ -45,12 +45,16 @@ struct AssetEntry : public LLDictionaryEntry AssetEntry(const char *desc_name, const char *type_name, // 8 character limit! const char *human_name, // for decoding to human readable form; put any and as many printable characters you want in each one - bool can_link) // can you create a link to this type? + bool can_link, // can you create a link to this type? + bool can_fetch, // can you fetch this asset by ID? + bool can_know) // can you see this asset's ID? : LLDictionaryEntry(desc_name), mTypeName(type_name), mHumanName(human_name), - mCanLink(can_link) + mCanLink(can_link), + mCanFetch(can_fetch), + mCanKnow(can_know) { llassert(strlen(mTypeName) <= 8); } @@ -58,6 +62,8 @@ struct AssetEntry : public LLDictionaryEntry const char *mTypeName; const char *mHumanName; bool mCanLink; + bool mCanFetch; + bool mCanKnow; }; class LLAssetDictionary : public LLSingleton<LLAssetDictionary>, @@ -69,32 +75,32 @@ public: LLAssetDictionary::LLAssetDictionary() { - // DESCRIPTION TYPE NAME HUMAN NAME CAN LINK? - // |--------------------|-----------|-------------------|-----------| - addEntry(LLAssetType::AT_TEXTURE, new AssetEntry("TEXTURE", "texture", "texture", FALSE)); - addEntry(LLAssetType::AT_SOUND, new AssetEntry("SOUND", "sound", "sound", FALSE)); - addEntry(LLAssetType::AT_CALLINGCARD, new AssetEntry("CALLINGCARD", "callcard", "calling card", FALSE)); - addEntry(LLAssetType::AT_LANDMARK, new AssetEntry("LANDMARK", "landmark", "landmark", FALSE)); - addEntry(LLAssetType::AT_SCRIPT, new AssetEntry("SCRIPT", "script", "legacy script", FALSE)); - addEntry(LLAssetType::AT_CLOTHING, new AssetEntry("CLOTHING", "clothing", "clothing", TRUE)); - addEntry(LLAssetType::AT_OBJECT, new AssetEntry("OBJECT", "object", "object", TRUE)); - addEntry(LLAssetType::AT_NOTECARD, new AssetEntry("NOTECARD", "notecard", "note card", FALSE)); - addEntry(LLAssetType::AT_CATEGORY, new AssetEntry("CATEGORY", "category", "folder", TRUE)); - addEntry(LLAssetType::AT_LSL_TEXT, new AssetEntry("LSL_TEXT", "lsltext", "lsl2 script", FALSE)); - addEntry(LLAssetType::AT_LSL_BYTECODE, new AssetEntry("LSL_BYTECODE", "lslbyte", "lsl bytecode", FALSE)); - addEntry(LLAssetType::AT_TEXTURE_TGA, new AssetEntry("TEXTURE_TGA", "txtr_tga", "tga texture", FALSE)); - addEntry(LLAssetType::AT_BODYPART, new AssetEntry("BODYPART", "bodypart", "body part", TRUE)); - addEntry(LLAssetType::AT_SOUND_WAV, new AssetEntry("SOUND_WAV", "snd_wav", "sound", FALSE)); - addEntry(LLAssetType::AT_IMAGE_TGA, new AssetEntry("IMAGE_TGA", "img_tga", "targa image", FALSE)); - addEntry(LLAssetType::AT_IMAGE_JPEG, new AssetEntry("IMAGE_JPEG", "jpeg", "jpeg image", FALSE)); - addEntry(LLAssetType::AT_ANIMATION, new AssetEntry("ANIMATION", "animatn", "animation", FALSE)); - addEntry(LLAssetType::AT_GESTURE, new AssetEntry("GESTURE", "gesture", "gesture", TRUE)); - addEntry(LLAssetType::AT_SIMSTATE, new AssetEntry("SIMSTATE", "simstate", "simstate", FALSE)); - - addEntry(LLAssetType::AT_LINK, new AssetEntry("LINK", "link", "symbolic link", FALSE)); - addEntry(LLAssetType::AT_LINK_FOLDER, new AssetEntry("FOLDER_LINK", "link_f", "symbolic folder link", FALSE)); - - addEntry(LLAssetType::AT_NONE, new AssetEntry("NONE", "-1", NULL, FALSE)); + // DESCRIPTION TYPE NAME HUMAN NAME CAN LINK? CAN FETCH? CAN KNOW? + // |--------------------|-----------|-------------------|-----------|-----------|---------| + addEntry(LLAssetType::AT_TEXTURE, new AssetEntry("TEXTURE", "texture", "texture", true, false, true)); + addEntry(LLAssetType::AT_SOUND, new AssetEntry("SOUND", "sound", "sound", true, true, true)); + addEntry(LLAssetType::AT_CALLINGCARD, new AssetEntry("CALLINGCARD", "callcard", "calling card", true, false, false)); + addEntry(LLAssetType::AT_LANDMARK, new AssetEntry("LANDMARK", "landmark", "landmark", true, true, true)); + addEntry(LLAssetType::AT_SCRIPT, new AssetEntry("SCRIPT", "script", "legacy script", true, false, false)); + addEntry(LLAssetType::AT_CLOTHING, new AssetEntry("CLOTHING", "clothing", "clothing", true, true, true)); + addEntry(LLAssetType::AT_OBJECT, new AssetEntry("OBJECT", "object", "object", true, false, false)); + addEntry(LLAssetType::AT_NOTECARD, new AssetEntry("NOTECARD", "notecard", "note card", true, false, true)); + addEntry(LLAssetType::AT_CATEGORY, new AssetEntry("CATEGORY", "category", "folder", true, false, false)); + addEntry(LLAssetType::AT_LSL_TEXT, new AssetEntry("LSL_TEXT", "lsltext", "lsl2 script", true, false, false)); + addEntry(LLAssetType::AT_LSL_BYTECODE, new AssetEntry("LSL_BYTECODE", "lslbyte", "lsl bytecode", true, false, false)); + addEntry(LLAssetType::AT_TEXTURE_TGA, new AssetEntry("TEXTURE_TGA", "txtr_tga", "tga texture", true, false, false)); + addEntry(LLAssetType::AT_BODYPART, new AssetEntry("BODYPART", "bodypart", "body part", true, true, true)); + addEntry(LLAssetType::AT_SOUND_WAV, new AssetEntry("SOUND_WAV", "snd_wav", "sound", true, false, false)); + addEntry(LLAssetType::AT_IMAGE_TGA, new AssetEntry("IMAGE_TGA", "img_tga", "targa image", true, false, false)); + addEntry(LLAssetType::AT_IMAGE_JPEG, new AssetEntry("IMAGE_JPEG", "jpeg", "jpeg image", true, false, false)); + addEntry(LLAssetType::AT_ANIMATION, new AssetEntry("ANIMATION", "animatn", "animation", true, true, true)); + addEntry(LLAssetType::AT_GESTURE, new AssetEntry("GESTURE", "gesture", "gesture", true, true, true)); + addEntry(LLAssetType::AT_SIMSTATE, new AssetEntry("SIMSTATE", "simstate", "simstate", false, false, false)); + + addEntry(LLAssetType::AT_LINK, new AssetEntry("LINK", "link", "sym link", false, false, true)); + addEntry(LLAssetType::AT_LINK_FOLDER, new AssetEntry("FOLDER_LINK", "link_f", "sym folder link", false, false, true)); + + addEntry(LLAssetType::AT_NONE, new AssetEntry("NONE", "-1", NULL, false, false, false)); }; // static @@ -225,3 +231,27 @@ const std::string &LLAssetType::badLookup() return sBadLookup; } + +// static +bool LLAssetType::lookupIsAssetFetchByIDAllowed(EType asset_type) +{ + const LLAssetDictionary *dict = LLAssetDictionary::getInstance(); + const AssetEntry *entry = dict->lookup(asset_type); + if (entry) + { + return entry->mCanFetch; + } + return false; +} + +// static +bool LLAssetType::lookupIsAssetIDKnowable(EType asset_type) +{ + const LLAssetDictionary *dict = LLAssetDictionary::getInstance(); + const AssetEntry *entry = dict->lookup(asset_type); + if (entry) + { + return entry->mCanKnow; + } + return false; +} diff --git a/indra/llcommon/llassettype.h b/indra/llcommon/llassettype.h index c7bbc2e74a..2c2dc27aaa 100644 --- a/indra/llcommon/llassettype.h +++ b/indra/llcommon/llassettype.h @@ -146,6 +146,9 @@ public: static bool lookupCanLink(EType asset_type); static bool lookupIsLinkType(EType asset_type); + static bool lookupIsAssetFetchByIDAllowed(EType asset_type); // the asset allows direct download + static bool lookupIsAssetIDKnowable(EType asset_type); // asset data can be known by the viewer + static const std::string& badLookup(); // error string when a lookup fails protected: diff --git a/indra/llcommon/llchat.h b/indra/llcommon/llchat.h index a77bd211f3..63cce24005 100644 --- a/indra/llcommon/llchat.h +++ b/indra/llcommon/llchat.h @@ -43,7 +43,8 @@ typedef enum e_chat_source_type { CHAT_SOURCE_SYSTEM = 0, CHAT_SOURCE_AGENT = 1, - CHAT_SOURCE_OBJECT = 2 + CHAT_SOURCE_OBJECT = 2, + CHAT_SOURCE_UNKNOWN = 3 } EChatSourceType; typedef enum e_chat_type @@ -68,7 +69,8 @@ typedef enum e_chat_audible_level typedef enum e_chat_style { CHAT_STYLE_NORMAL, - CHAT_STYLE_IRC + CHAT_STYLE_IRC, + CHAT_STYLE_HISTORY }EChatStyle; // A piece of chat @@ -80,6 +82,7 @@ public: mFromName(), mFromID(), mNotifId(), + mOwnerID(), mSourceType(CHAT_SOURCE_AGENT), mChatType(CHAT_TYPE_NORMAL), mAudible(CHAT_AUDIBLE_FULLY), @@ -96,6 +99,7 @@ public: std::string mFromName; // agent or object name LLUUID mFromID; // agent id or object id LLUUID mNotifId; + LLUUID mOwnerID; EChatSourceType mSourceType; EChatType mChatType; EChatAudible mAudible; diff --git a/indra/llcommon/llcommonutils.cpp b/indra/llcommon/llcommonutils.cpp new file mode 100644 index 0000000000..0022dc6915 --- /dev/null +++ b/indra/llcommon/llcommonutils.cpp @@ -0,0 +1,61 @@ +/** + * @file llcommonutils.h + * @brief Commin utils + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "linden_common.h" +#include "llcommonutils.h" + +void LLCommonUtils::computeDifference( + const uuid_vec_t& vnew, + const uuid_vec_t& vcur, + uuid_vec_t& vadded, + uuid_vec_t& vremoved) +{ + uuid_vec_t vnew_copy(vnew); + uuid_vec_t vcur_copy(vcur); + + std::sort(vnew_copy.begin(), vnew_copy.end()); + std::sort(vcur_copy.begin(), vcur_copy.end()); + + size_t maxsize = llmax(vnew_copy.size(), vcur_copy.size()); + vadded.resize(maxsize); + vremoved.resize(maxsize); + + uuid_vec_t::iterator it; + // what was removed + it = set_difference(vcur_copy.begin(), vcur_copy.end(), vnew_copy.begin(), vnew_copy.end(), vremoved.begin()); + vremoved.erase(it, vremoved.end()); + + // what was added + it = set_difference(vnew_copy.begin(), vnew_copy.end(), vcur_copy.begin(), vcur_copy.end(), vadded.begin()); + vadded.erase(it, vadded.end()); +} + +// EOF diff --git a/indra/llcommon/llcommonutils.h b/indra/llcommon/llcommonutils.h new file mode 100644 index 0000000000..ad0d884e37 --- /dev/null +++ b/indra/llcommon/llcommonutils.h @@ -0,0 +1,56 @@ +/** + * @file llcommonutils.h + * @brief Common utils + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLCOMMONUTILS_H +#define LL_LLCOMMONUTILS_H + +namespace LLCommonUtils +{ + /** + * Computes difference between 'vnew' and 'vcur' vectors. + * Items present in 'vnew' and missing in 'vcur' are treated as added and are copied into 'vadded' + * Items missing in 'vnew' and present in 'vcur' are treated as removed and are copied into 'vremoved' + * + * @param vnew[in] - incoming IDs + * @param vcur[in] - current IDs + * @param vadded[out] - difference between incoming and current IDS - added IDs + * @param vremoved[out] - difference between incoming and current IDS - removed IDs + */ + LL_COMMON_API void computeDifference( + const uuid_vec_t& vnew, + const uuid_vec_t& vcur, + uuid_vec_t& vadded, + uuid_vec_t& vremoved); +}; + +#endif //LL_LLCOMMONUTILS_H + +// EOF diff --git a/indra/llcommon/llcursortypes.cpp b/indra/llcommon/llcursortypes.cpp index 23ede97af3..6751c235f6 100644 --- a/indra/llcommon/llcursortypes.cpp +++ b/indra/llcommon/llcursortypes.cpp @@ -72,6 +72,9 @@ ECursorType getCursorFromString(const std::string& cursor_string) cursor_string_table["UI_CURSOR_TOOLPAUSE"] = UI_CURSOR_TOOLPAUSE; cursor_string_table["UI_CURSOR_TOOLMEDIAOPEN"] = UI_CURSOR_TOOLMEDIAOPEN; cursor_string_table["UI_CURSOR_PIPETTE"] = UI_CURSOR_PIPETTE; + cursor_string_table["UI_CURSOR_TOOLSIT"] = UI_CURSOR_TOOLSIT; + cursor_string_table["UI_CURSOR_TOOLBUY"] = UI_CURSOR_TOOLBUY; + cursor_string_table["UI_CURSOR_TOOLOPEN"] = UI_CURSOR_TOOLOPEN; } std::map<std::string,U32>::const_iterator iter = cursor_string_table.find(cursor_string); diff --git a/indra/llcommon/llcursortypes.h b/indra/llcommon/llcursortypes.h index a1b8178bfe..143c2c64cf 100644 --- a/indra/llcommon/llcursortypes.h +++ b/indra/llcommon/llcursortypes.h @@ -68,6 +68,9 @@ enum ECursorType { UI_CURSOR_TOOLPAUSE, UI_CURSOR_TOOLMEDIAOPEN, UI_CURSOR_PIPETTE, + UI_CURSOR_TOOLSIT, + UI_CURSOR_TOOLBUY, + UI_CURSOR_TOOLOPEN, UI_CURSOR_COUNT // Number of elements in this enum (NOT a cursor) }; diff --git a/indra/llcommon/lldate.cpp b/indra/llcommon/lldate.cpp index de7f2ead74..a7ef28b431 100644 --- a/indra/llcommon/lldate.cpp +++ b/indra/llcommon/lldate.cpp @@ -248,8 +248,27 @@ bool LLDate::fromStream(std::istream& s) s >> fractional; seconds_since_epoch += fractional; } - c = s.get(); // skip the Z - if (c != 'Z') { return false; } + + c = s.peek(); // check for offset + if (c == '+' || c == '-') + { + S32 offset_sign = (c == '+') ? 1 : -1; + S32 offset_hours = 0; + S32 offset_minutes = 0; + S32 offset_in_seconds = 0; + + s >> offset_hours; + + c = s.get(); // skip the colon a get the minutes if there are any + if (c == ':') + { + s >> offset_minutes; + } + + offset_in_seconds = (offset_hours * 60 + offset_sign * offset_minutes) * 60; + seconds_since_epoch -= offset_in_seconds; + } + else if (c != 'Z') { return false; } // skip the Z mSecondsSinceEpoch = seconds_since_epoch; return true; diff --git a/indra/llcommon/llerror.cpp b/indra/llcommon/llerror.cpp index bd334a6654..d06d6baf85 100644 --- a/indra/llcommon/llerror.cpp +++ b/indra/llcommon/llerror.cpp @@ -954,7 +954,12 @@ namespace LLError std::string class_name = className(site.mClassInfo); std::string function_name = functionName(site.mFunction); +#if LL_LINUX + // gross, but typeid comparison seems to always fail here with gcc4.1 + if (0 != strcmp(site.mClassInfo.name(), typeid(NoClassInfo).name())) +#else if (site.mClassInfo != typeid(NoClassInfo)) +#endif // LL_LINUX { function_name = class_name + "::" + function_name; } @@ -1079,7 +1084,12 @@ namespace LLError #if LL_WINDOWS // DevStudio: __FUNCTION__ already includes the full class name #else + #if LL_LINUX + // gross, but typeid comparison seems to always fail here with gcc4.1 + if (0 != strcmp(site.mClassInfo.name(), typeid(NoClassInfo).name())) + #else if (site.mClassInfo != typeid(NoClassInfo)) + #endif // LL_LINUX { prefix << className(site.mClassInfo) << "::"; } @@ -1225,17 +1235,32 @@ namespace LLError char** LLCallStacks::sBuffer = NULL ; S32 LLCallStacks::sIndex = 0 ; +#define SINGLE_THREADED 1 + class CallStacksLogLock { public: CallStacksLogLock(); ~CallStacksLogLock(); + +#if SINGLE_THREADED + bool ok() const { return true; } +#else bool ok() const { return mOK; } private: bool mLocked; bool mOK; +#endif }; +#if SINGLE_THREADED + CallStacksLogLock::CallStacksLogLock() + { + } + CallStacksLogLock::~CallStacksLogLock() + { + } +#else CallStacksLogLock::CallStacksLogLock() : mLocked(false), mOK(false) { @@ -1271,6 +1296,7 @@ namespace LLError apr_thread_mutex_unlock(gCallStacksLogMutexp); } } +#endif //static void LLCallStacks::push(const char* function, const int line) diff --git a/indra/llcommon/llerror.h b/indra/llcommon/llerror.h index 09812de2b8..e64ee5e081 100644 --- a/indra/llcommon/llerror.h +++ b/indra/llcommon/llerror.h @@ -179,7 +179,7 @@ namespace LLError { return s; } // used to indicate the end of a message - class NoClassInfo { }; + class LL_COMMON_API NoClassInfo { }; // used to indicate no class info known for logging //LLCallStacks keeps track of call stacks and output the call stacks to log file diff --git a/indra/llcommon/lleventtimer.cpp b/indra/llcommon/lleventtimer.cpp new file mode 100644 index 0000000000..d44e7ec1e6 --- /dev/null +++ b/indra/llcommon/lleventtimer.cpp @@ -0,0 +1,95 @@ +/** + * @file lleventtimer.cpp + * @brief Cross-platform objects for doing timing + * + * $LicenseInfo:firstyear=2000&license=viewergpl$ + * + * Copyright (c) 2000-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "linden_common.h" + +#include "lleventtimer.h" + +#include "u64.h" + + +////////////////////////////////////////////////////////////////////////////// +// +// LLEventTimer Implementation +// +////////////////////////////////////////////////////////////////////////////// + +LLEventTimer::LLEventTimer(F32 period) +: mEventTimer() +{ + mPeriod = period; +} + +LLEventTimer::LLEventTimer(const LLDate& time) +: mEventTimer() +{ + mPeriod = (F32)(time.secondsSinceEpoch() - LLDate::now().secondsSinceEpoch()); +} + + +LLEventTimer::~LLEventTimer() +{ +} + +//static +void LLEventTimer::updateClass() +{ + std::list<LLEventTimer*> completed_timers; + + { + LLInstanceTrackerScopedGuard guard; + for (instance_iter iter = guard.beginInstances(); iter != guard.endInstances(); ) + { + LLEventTimer& timer = *iter++; + F32 et = timer.mEventTimer.getElapsedTimeF32(); + if (timer.mEventTimer.getStarted() && et > timer.mPeriod) { + timer.mEventTimer.reset(); + if ( timer.tick() ) + { + completed_timers.push_back( &timer ); + } + } + } + } + + if ( completed_timers.size() > 0 ) + { + for (std::list<LLEventTimer*>::iterator completed_iter = completed_timers.begin(); + completed_iter != completed_timers.end(); + completed_iter++ ) + { + delete *completed_iter; + } + } +} + + diff --git a/indra/llcommon/lleventtimer.h b/indra/llcommon/lleventtimer.h new file mode 100644 index 0000000000..5181cce52d --- /dev/null +++ b/indra/llcommon/lleventtimer.h @@ -0,0 +1,60 @@ +/** + * @file lleventtimer.h + * @brief Cross-platform objects for doing timing + * + * $LicenseInfo:firstyear=2000&license=viewergpl$ + * + * Copyright (c) 2000-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_EVENTTIMER_H +#define LL_EVENTTIMER_H + +#include "stdtypes.h" +#include "lldate.h" +#include "llinstancetracker.h" +#include "lltimer.h" + +// class for scheduling a function to be called at a given frequency (approximate, inprecise) +class LL_COMMON_API LLEventTimer : protected LLInstanceTracker<LLEventTimer> +{ +public: + LLEventTimer(F32 period); // period is the amount of time between each call to tick() in seconds + LLEventTimer(const LLDate& time); + virtual ~LLEventTimer(); + + //function to be called at the supplied frequency + // Normally return FALSE; TRUE will delete the timer after the function returns. + virtual BOOL tick() = 0; + + static void updateClass(); + +protected: + LLTimer mEventTimer; + F32 mPeriod; +}; + +#endif //LL_EVENTTIMER_H diff --git a/indra/llcommon/llfasttimer.h b/indra/llcommon/llfasttimer.h index 48461df6ae..840d09d970 100644 --- a/indra/llcommon/llfasttimer.h +++ b/indra/llcommon/llfasttimer.h @@ -36,6 +36,10 @@ // pull in the actual class definition #include "llfasttimer_class.h" +// +// Important note: These implementations must be FAST! +// + #if LL_WINDOWS // // Windows implementation of CPU clock @@ -99,15 +103,17 @@ inline U64 LLFastTimer::getCPUClockCount64() #endif -#if LL_LINUX || LL_SOLARIS +#if (LL_LINUX || LL_SOLARIS) && !(defined(__i386__) || defined(__amd64__)) // -// Linux and Solaris implementation of CPU clock - all architectures. +// Linux and Solaris implementation of CPU clock - non-x86. +// This is accurate but SLOW! Only use out of desperation. // // Try to use the MONOTONIC clock if available, this is a constant time counter -// with nanosecond resolution (but not necessarily accuracy) and attempts are made -// to synchronize this value between cores at kernel start. It should not be affected -// by CPU frequency. If not available use the REALTIME clock, but this may be affected by -// NTP adjustments or other user activity affecting the system time. +// with nanosecond resolution (but not necessarily accuracy) and attempts are +// made to synchronize this value between cores at kernel start. It should not +// be affected by CPU frequency. If not available use the REALTIME clock, but +// this may be affected by NTP adjustments or other user activity affecting +// the system time. inline U64 LLFastTimer::getCPUClockCount64() { struct timespec tp; @@ -124,12 +130,12 @@ inline U32 LLFastTimer::getCPUClockCount32() { return (U32)(LLFastTimer::getCPUClockCount64() >> 8); } -#endif // (LL_LINUX || LL_SOLARIS)) +#endif // (LL_LINUX || LL_SOLARIS) && !(defined(__i386__) || defined(__amd64__)) -#if (LL_DARWIN) && (defined(__i386__) || defined(__amd64__)) +#if (LL_LINUX || LL_SOLARIS || LL_DARWIN) && (defined(__i386__) || defined(__amd64__)) // -// Mac x86 implementation of CPU clock +// Mac+Linux+Solaris FAST x86 implementation of CPU clock inline U32 LLFastTimer::getCPUClockCount32() { U64 x; diff --git a/indra/llcommon/llfasttimer_class.cpp b/indra/llcommon/llfasttimer_class.cpp index 6d8d81e114..dfbae09864 100644 --- a/indra/llcommon/llfasttimer_class.cpp +++ b/indra/llcommon/llfasttimer_class.cpp @@ -218,9 +218,10 @@ LLFastTimer::DeclareTimer::DeclareTimer(const std::string& name) // static void LLFastTimer::DeclareTimer::updateCachedPointers() { + DeclareTimer::LLInstanceTrackerScopedGuard guard; // propagate frame state pointers to timer declarations - for (DeclareTimer::instance_iter it = DeclareTimer::beginInstances(); - it != DeclareTimer::endInstances(); + for (DeclareTimer::instance_iter it = guard.beginInstances(); + it != guard.endInstances(); ++it) { // update cached pointer @@ -229,17 +230,18 @@ void LLFastTimer::DeclareTimer::updateCachedPointers() } //static -#if LL_LINUX || LL_SOLARIS || ( LL_DARWIN && !(defined(__i386__) || defined(__amd64__)) ) +#if (LL_DARWIN || LL_LINUX || LL_SOLARIS) && !(defined(__i386__) || defined(__amd64__)) U64 LLFastTimer::countsPerSecond() // counts per second for the *32-bit* timer { return sClockResolution >> 8; } -#else // windows or x86-mac +#else // windows or x86-mac or x86-linux or x86-solaris U64 LLFastTimer::countsPerSecond() // counts per second for the *32-bit* timer { - static U64 sCPUClockFrequency = U64(CProcessor().GetCPUFrequency(50)); + //getCPUFrequency returns MHz and sCPUClockFrequency wants to be in Hz + static U64 sCPUClockFrequency = U64(LLProcessorInfo().getCPUFrequency()*1000000.0); - // we drop the low-order byte in out timers, so report a lower frequency + // we drop the low-order byte in our timers, so report a lower frequency return sCPUClockFrequency >> 8; } #endif @@ -371,20 +373,23 @@ void LLFastTimer::NamedTimer::buildHierarchy() if (sCurFrameIndex < 0 ) return; // set up initial tree - for (instance_iter it = NamedTimer::beginInstances(); - it != endInstances(); - ++it) { - NamedTimer& timer = *it; - if (&timer == NamedTimerFactory::instance().getRootTimer()) continue; - - // bootstrap tree construction by attaching to last timer to be on stack - // when this timer was called - if (timer.getFrameState().mLastCaller && timer.mParent == NamedTimerFactory::instance().getRootTimer()) + NamedTimer::LLInstanceTrackerScopedGuard guard; + for (instance_iter it = guard.beginInstances(); + it != guard.endInstances(); + ++it) { - timer.setParent(timer.getFrameState().mLastCaller->mTimer); - // no need to push up tree on first use, flag can be set spuriously - timer.getFrameState().mMoveUpTree = false; + NamedTimer& timer = *it; + if (&timer == NamedTimerFactory::instance().getRootTimer()) continue; + + // bootstrap tree construction by attaching to last timer to be on stack + // when this timer was called + if (timer.getFrameState().mLastCaller && timer.mParent == NamedTimerFactory::instance().getRootTimer()) + { + timer.setParent(timer.getFrameState().mLastCaller->mTimer); + // no need to push up tree on first use, flag can be set spuriously + timer.getFrameState().mMoveUpTree = false; + } } } @@ -486,18 +491,21 @@ void LLFastTimer::NamedTimer::resetFrame() F64 total_time = 0; LLSD sd; - for (NamedTimer::instance_iter it = NamedTimer::beginInstances(); - it != NamedTimer::endInstances(); - ++it) { - NamedTimer& timer = *it; - FrameState& info = timer.getFrameState(); - sd[timer.getName()]["Time"] = (LLSD::Real) (info.mSelfTimeCounter*iclock_freq); - sd[timer.getName()]["Calls"] = (LLSD::Integer) info.mCalls; - - // computing total time here because getting the root timer's getCountHistory - // doesn't work correctly on the first frame - total_time = total_time + info.mSelfTimeCounter * iclock_freq; + NamedTimer::LLInstanceTrackerScopedGuard guard; + for (NamedTimer::instance_iter it = guard.beginInstances(); + it != guard.endInstances(); + ++it) + { + NamedTimer& timer = *it; + FrameState& info = timer.getFrameState(); + sd[timer.getName()]["Time"] = (LLSD::Real) (info.mSelfTimeCounter*iclock_freq); + sd[timer.getName()]["Calls"] = (LLSD::Integer) info.mCalls; + + // computing total time here because getting the root timer's getCountHistory + // doesn't work correctly on the first frame + total_time = total_time + info.mSelfTimeCounter * iclock_freq; + } } sd["Total"]["Time"] = (LLSD::Real) total_time; @@ -531,21 +539,24 @@ void LLFastTimer::NamedTimer::resetFrame() DeclareTimer::updateCachedPointers(); // reset for next frame - for (NamedTimer::instance_iter it = NamedTimer::beginInstances(); - it != NamedTimer::endInstances(); - ++it) { - NamedTimer& timer = *it; - - FrameState& info = timer.getFrameState(); - info.mSelfTimeCounter = 0; - info.mCalls = 0; - info.mLastCaller = NULL; - info.mMoveUpTree = false; - // update parent pointer in timer state struct - if (timer.mParent) + NamedTimer::LLInstanceTrackerScopedGuard guard; + for (NamedTimer::instance_iter it = guard.beginInstances(); + it != guard.endInstances(); + ++it) { - info.mParent = &timer.mParent->getFrameState(); + NamedTimer& timer = *it; + + FrameState& info = timer.getFrameState(); + info.mSelfTimeCounter = 0; + info.mCalls = 0; + info.mLastCaller = NULL; + info.mMoveUpTree = false; + // update parent pointer in timer state struct + if (timer.mParent) + { + info.mParent = &timer.mParent->getFrameState(); + } } } @@ -575,20 +586,23 @@ void LLFastTimer::NamedTimer::reset() } // reset all history - for (NamedTimer::instance_iter it = NamedTimer::beginInstances(); - it != NamedTimer::endInstances(); - ++it) { - NamedTimer& timer = *it; - if (&timer != NamedTimerFactory::instance().getRootTimer()) + NamedTimer::LLInstanceTrackerScopedGuard guard; + for (NamedTimer::instance_iter it = guard.beginInstances(); + it != guard.endInstances(); + ++it) { - timer.setParent(NamedTimerFactory::instance().getRootTimer()); + NamedTimer& timer = *it; + if (&timer != NamedTimerFactory::instance().getRootTimer()) + { + timer.setParent(NamedTimerFactory::instance().getRootTimer()); + } + + timer.mCountAverage = 0; + timer.mCallAverage = 0; + memset(timer.mCountHistory, 0, sizeof(U32) * HISTORY_NUM); + memset(timer.mCallHistory, 0, sizeof(U32) * HISTORY_NUM); } - - timer.mCountAverage = 0; - timer.mCallAverage = 0; - memset(timer.mCountHistory, 0, sizeof(U32) * HISTORY_NUM); - memset(timer.mCallHistory, 0, sizeof(U32) * HISTORY_NUM); } sLastFrameIndex = 0; diff --git a/indra/llcommon/llinstancetracker.cpp b/indra/llcommon/llinstancetracker.cpp new file mode 100644 index 0000000000..c962cb5be1 --- /dev/null +++ b/indra/llcommon/llinstancetracker.cpp @@ -0,0 +1,20 @@ +/** + * @file lllinstancetracker.cpp + * + * $LicenseInfo:firstyear=2009&license=viewergpl$ + * Copyright (c) 2009, Linden Research, Inc. + * $/LicenseInfo$ + */ + +// Precompiled header +#include "linden_common.h" +// associated header +#include "llinstancetracker.h" +// STL headers +// std headers +// external library headers +// other Linden headers + +// llinstancetracker.h is presently header-only. This file exists only because our CMake +// test macro ADD_BUILD_TEST requires it. +int dummy = 0; diff --git a/indra/llcommon/llinstancetracker.h b/indra/llcommon/llinstancetracker.h index 11fe523651..9df7998273 100644 --- a/indra/llcommon/llinstancetracker.h +++ b/indra/llcommon/llinstancetracker.h @@ -98,7 +98,10 @@ private: mKey = key; getMap_()[key] = static_cast<T*>(this); } - void remove_() { getMap_().erase(mKey); } + void remove_() + { + getMap_().erase(mKey); + } static InstanceMap& getMap_() { @@ -129,31 +132,65 @@ public: /// for completeness of analogy with the generic implementation static T* getInstance(T* k) { return k; } - static key_iter beginKeys() { return getSet_().begin(); } - static key_iter endKeys() { return getSet_().end(); } - static instance_iter beginInstances() { return instance_iter(getSet_().begin()); } - static instance_iter endInstances() { return instance_iter(getSet_().end()); } static S32 instanceCount() { return getSet_().size(); } + // Instantiate this to get access to iterators for this type. It's a 'guard' in the sense + // that it treats deletes of this type as errors as long as there is an instance of + // this class alive in scope somewhere (i.e. deleting while iterating is bad). + class LLInstanceTrackerScopedGuard + { + public: + LLInstanceTrackerScopedGuard() + { + ++sIterationNestDepth; + } + + ~LLInstanceTrackerScopedGuard() + { + --sIterationNestDepth; + } + + static instance_iter beginInstances() { return instance_iter(getSet_().begin()); } + static instance_iter endInstances() { return instance_iter(getSet_().end()); } + static key_iter beginKeys() { return getSet_().begin(); } + static key_iter endKeys() { return getSet_().end(); } + }; + protected: - LLInstanceTracker() { getSet_().insert(static_cast<T*>(this)); } - virtual ~LLInstanceTracker() { getSet_().erase(static_cast<T*>(this)); } + LLInstanceTracker() + { + // it's safe but unpredictable to create instances of this type while all instances are being iterated over. I hate unpredictable. This assert will probably be turned on early in the next development cycle. + //llassert(sIterationNestDepth == 0); + getSet_().insert(static_cast<T*>(this)); + } + virtual ~LLInstanceTracker() + { + // it's unsafe to delete instances of this type while all instances are being iterated over. + llassert(sIterationNestDepth == 0); + getSet_().erase(static_cast<T*>(this)); + } - LLInstanceTracker(const LLInstanceTracker& other) { getSet_().insert(static_cast<T*>(this)); } + LLInstanceTracker(const LLInstanceTracker& other) + { + //llassert(sIterationNestDepth == 0); + getSet_().insert(static_cast<T*>(this)); + } - static InstanceSet& getSet_() // called after getReady() but before go() - { - if (! sInstances) - { - sInstances = new InstanceSet; - } - return *sInstances; - } + static InstanceSet& getSet_() + { + if (! sInstances) + { + sInstances = new InstanceSet; + } + return *sInstances; + } static InstanceSet* sInstances; + static S32 sIterationNestDepth; }; template <typename T, typename KEY> typename LLInstanceTracker<T, KEY>::InstanceMap* LLInstanceTracker<T, KEY>::sInstances = NULL; template <typename T> typename LLInstanceTracker<T, T*>::InstanceSet* LLInstanceTracker<T, T*>::sInstances = NULL; +template <typename T> S32 LLInstanceTracker<T, T*>::sIterationNestDepth = 0; #endif diff --git a/indra/llcommon/lllivefile.cpp b/indra/llcommon/lllivefile.cpp index effda6c49c..5ca90d82ba 100644 --- a/indra/llcommon/lllivefile.cpp +++ b/indra/llcommon/lllivefile.cpp @@ -33,7 +33,7 @@ #include "lllivefile.h" #include "llframetimer.h" -#include "lltimer.h" +#include "lleventtimer.h" const F32 DEFAULT_CONFIG_FILE_REFRESH = 5.0f; diff --git a/indra/llcommon/llprocessor.cpp b/indra/llcommon/llprocessor.cpp index 8a4a4a8f9a..d3ba215751 100644 --- a/indra/llcommon/llprocessor.cpp +++ b/indra/llcommon/llprocessor.cpp @@ -30,130 +30,389 @@ * $/LicenseInfo$ */ -// Filename: Processor.cpp -// ======================= -// Author: Benjamin Jurke -// File history: 27.02.2002 - File created. Support for Intel and AMD processors -// 05.03.2002 - Fixed the CPUID bug: On Pre-Pentium CPUs the CPUID -// command is not available -// - The CProcessor::WriteInfoTextFile function do not -// longer use Win32 file functions (-> os independend) -// - Optional include of the windows.h header which is -// still need for CProcessor::GetCPUFrequency. -// 06.03.2002 - My birthday (18th :-)) -// - Replaced the '\r\n' line endings in function -// CProcessor::CPUInfoToText by '\n' -// - Replaced unsigned __int64 by signed __int64 for -// solving some compiler conversion problems -// - Fixed a bug at family=6, model=6 (Celeron -> P2) -////////////////////////////////////////////////////////////////////////////////// - #include "linden_common.h" +#include "llprocessor.h" -#include "processor.h" +#include "llerror.h" -#include <memory> +//#include <memory> #if LL_WINDOWS # define WIN32_LEAN_AND_MEAN # include <winsock2.h> # include <windows.h> +# define _interlockedbittestandset _renamed_interlockedbittestandset +# define _interlockedbittestandreset _renamed_interlockedbittestandreset +# include <intrin.h> +# undef _interlockedbittestandset +# undef _interlockedbittestandreset #endif -#if !LL_DARWIN && !LL_SOLARIS - -#ifdef PROCESSOR_FREQUENCY_MEASURE_AVAILABLE -// We need the QueryPerformanceCounter and Sleep functions -#define FORCEINLINE __forceinline -#else -#define FORCEINLINE +#include "llsd.h" + +#if LL_MSVC && _M_X64 +# define LL_X86_64 1 +# define LL_X86 1 +#elif LL_MSVC && _M_IX86 +# define LL_X86 1 +#elif LL_GNUC && ( defined(__amd64__) || defined(__x86_64__) ) +# define LL_X86_64 1 +# define LL_X86 1 +#elif LL_GNUC && ( defined(__i386__) ) +# define LL_X86 1 +#elif LL_GNUC && ( defined(__powerpc__) || defined(__ppc__) ) +# define LL_PPC 1 #endif +class LLProcessorInfoImpl; // foward declaration for the mImpl; + +namespace +{ + enum cpu_info + { + eBrandName = 0, + eFrequency, + eVendor, + eStepping, + eFamily, + eExtendedFamily, + eModel, + eExtendedModel, + eType, + eBrandID, + eFamilyName + }; + + + const char* cpu_info_names[] = + { + "Processor Name", + "Frequency", + "Vendor", + "Stepping", + "Family", + "Extended Family", + "Model", + "Extended Model", + "Type", + "Brand ID", + "Family Name" + }; + + enum cpu_config + { + eMaxID, + eMaxExtID, + eCLFLUSHCacheLineSize, + eAPICPhysicalID, + eCacheLineSize, + eL2Associativity, + eCacheSizeK, + eFeatureBits, + eExtFeatureBits + }; + + const char* cpu_config_names[] = + { + "Max Supported CPUID level", + "Max Supported Ext. CPUID level", + "CLFLUSH cache line size", + "APIC Physical ID", + "Cache Line Size", + "L2 Associativity", + "Cache Size", + "Feature Bits", + "Ext. Feature Bits" + }; + + + + // *NOTE:Mani - this contains the elements we reference directly and extensions beyond the first 32. + // The rest of the names are referenced by bit maks returned from cpuid. + enum cpu_features + { + eSSE_Ext=25, + eSSE2_Ext=26, + + eSSE3_Features=32, + eMONTIOR_MWAIT=33, + eCPLDebugStore=34, + eThermalMonitor2=35, + eAltivec=36 + }; + + const char* cpu_feature_names[] = + { + "x87 FPU On Chip", + "Virtual-8086 Mode Enhancement", + "Debugging Extensions", + "Page Size Extensions", + "Time Stamp Counter", + "RDMSR and WRMSR Support", + "Physical Address Extensions", + "Machine Check Exception", + "CMPXCHG8B Instruction", + "APIC On Chip", + "Unknown1", + "SYSENTER and SYSEXIT", + "Memory Type Range Registers", + "PTE Global Bit", + "Machine Check Architecture", + "Conditional Move/Compare Instruction", + "Page Attribute Table", + "Page Size Extension", + "Processor Serial Number", + "CFLUSH Extension", + "Unknown2", + "Debug Store", + "Thermal Monitor and Clock Ctrl", + "MMX Technology", + "FXSAVE/FXRSTOR", + "SSE Extensions", + "SSE2 Extensions", + "Self Snoop", + "Hyper-threading Technology", + "Thermal Monitor", + "Unknown4", + "Pend. Brk. EN.", // 31 End of FeatureInfo bits + + "SSE3 New Instructions", // 32 + "MONITOR/MWAIT", + "CPL Qualified Debug Store", + "Thermal Monitor 2", + + "Altivec" + }; + + std::string intel_CPUFamilyName(int composed_family) + { + switch(composed_family) + { + case 3: return "Intel i386"; + case 4: return "Intel i486"; + case 5: return "Intel Pentium"; + case 6: return "Intel Pentium Pro/2/3, Core"; + case 7: return "Intel Itanium (IA-64)"; + case 0xF: return "Intel Pentium 4"; + case 0x10: return "Intel Itanium 2 (IA-64)"; + } + return "Unknown"; + } + + std::string amd_CPUFamilyName(int composed_family) + { + switch(composed_family) + { + case 4: return "AMD 80486/5x86"; + case 5: return "AMD K5/K6"; + case 6: return "AMD K7"; + case 0xF: return "AMD K8"; + case 0x10: return "AMD K8L"; + } + return "Unknown"; + } + + std::string compute_CPUFamilyName(const char* cpu_vendor, int composed_family) + { + const char* intel_string = "GenuineIntel"; + const char* amd_string = "AuthenticAMD"; + if(!strncmp(cpu_vendor, intel_string, strlen(intel_string))) + { + return intel_CPUFamilyName(composed_family); + } + else if(!strncmp(cpu_vendor, amd_string, strlen(amd_string))) + { + return amd_CPUFamilyName(composed_family); + } + return "Unknown"; + } + + std::string compute_CPUFamilyName(const char* cpu_vendor, int family, int ext_family) + { + const char* intel_string = "GenuineIntel"; + const char* amd_string = "AuthenticAMD"; + if(!strncmp(cpu_vendor, intel_string, strlen(intel_string))) + { + U32 composed_family = family + ext_family; + return intel_CPUFamilyName(composed_family); + } + else if(!strncmp(cpu_vendor, amd_string, strlen(amd_string))) + { + U32 composed_family = (family == 0xF) + ? family + ext_family + : family; + return amd_CPUFamilyName(composed_family); + } + return "Unknown"; + } + +} // end unnamed namespace + +// The base class for implementations. +// Each platform should override this class. +class LLProcessorInfoImpl +{ +public: + LLProcessorInfoImpl() + { + mProcessorInfo["info"] = LLSD::emptyMap(); + mProcessorInfo["config"] = LLSD::emptyMap(); + mProcessorInfo["extension"] = LLSD::emptyMap(); + } + virtual ~LLProcessorInfoImpl() {} + + F64 getCPUFrequency() const + { + return getInfo(eFrequency, 0).asReal(); + } + + bool hasSSE() const + { + return hasExtension(cpu_feature_names[eSSE_Ext]); + } + + bool hasSSE2() const + { + return hasExtension(cpu_feature_names[eSSE2_Ext]); + } + + bool hasAltivec() const + { + return hasExtension("Altivec"); + } -// Some macros we often need -//////////////////////////// -#define CheckBit(var, bit) ((var & (1 << bit)) ? true : false) + std::string getCPUFamilyName() const { return getInfo(eFamilyName, "Unknown").asString(); } + std::string getCPUBrandName() const { return getInfo(eBrandName, "Unknown").asString(); } + + // This is virtual to support a different linux format. + // *NOTE:Mani - I didn't want to screw up server use of this data... + virtual std::string getCPUFeatureDescription() const + { + std::ostringstream out; + out << std::endl << std::endl; + out << "// CPU General Information" << std::endl; + out << "//////////////////////////" << std::endl; + out << "Processor Name: " << getCPUBrandName() << std::endl; + out << "Frequency: " << getCPUFrequency() << " MHz" << std::endl; + out << "Vendor: " << getInfo(eVendor, "Unknown").asString() << std::endl; + out << "Family: " << getCPUFamilyName() << " (" << getInfo(eFamily, 0) << ")" << std::endl; + out << "Extended family: " << getInfo(eExtendedFamily, 0) << std::endl; + out << "Model: " << getInfo(eModel, 0) << std::endl; + out << "Extended model: " << getInfo(eExtendedModel, 0) << std::endl; + out << "Type: " << getInfo(eType, 0) << std::endl; + out << "Brand ID: " << getInfo(eBrandID, 0) << std::endl; + out << std::endl; + out << "// CPU Configuration" << std::endl; + out << "//////////////////////////" << std::endl; + + // Iterate through the dictionary of configuration options. + LLSD configs = mProcessorInfo["config"]; + for(LLSD::map_const_iterator cfgItr = configs.beginMap(); cfgItr != configs.endMap(); ++cfgItr) + { + out << cfgItr->first << " = " << cfgItr->second << std::endl; + } + out << std::endl; + + out << "// CPU Extensions" << std::endl; + out << "//////////////////////////" << std::endl; + + for(LLSD::map_const_iterator itr = mProcessorInfo["extension"].beginMap(); itr != mProcessorInfo["extension"].endMap(); ++itr) + { + out << " " << itr->first << std::endl; + } + return out.str(); + } + +protected: + void setInfo(cpu_info info_type, const LLSD& value) + { + setInfo(cpu_info_names[info_type], value); + } + LLSD getInfo(cpu_info info_type, const LLSD& defaultVal) const + { + return getInfo(cpu_info_names[info_type], defaultVal); + } + + void setConfig(cpu_config config_type, const LLSD& value) + { + setConfig(cpu_config_names[config_type], value); + } + LLSD getConfig(cpu_config config_type, const LLSD& defaultVal) const + { + return getConfig(cpu_config_names[config_type], defaultVal); + } + + void setExtension(const std::string& name) { mProcessorInfo["extension"][name] = "true"; } + bool hasExtension(const std::string& name) const + { + return mProcessorInfo["extension"].has(name); + } + +private: + void setInfo(const std::string& name, const LLSD& value) { mProcessorInfo["info"][name]=value; } + LLSD getInfo(const std::string& name, const LLSD& defaultVal) const + { + if(mProcessorInfo["info"].has(name)) + { + return mProcessorInfo["info"][name]; + } + return defaultVal; + } + void setConfig(const std::string& name, const LLSD& value) { mProcessorInfo["config"][name]=value; } + LLSD getConfig(const std::string& name, const LLSD& defaultVal) const + { + LLSD r = mProcessorInfo["config"].get(name); + return r.isDefined() ? r : defaultVal; + } + +private: + + LLSD mProcessorInfo; +}; + + +#ifdef LL_MSVC +// LL_MSVC and not LLWINDOWS because some of the following code +// uses the MSVC compiler intrinsics __cpuid() and __rdtsc(). -#ifdef PROCESSOR_FREQUENCY_MEASURE_AVAILABLE // Delays for the specified amount of milliseconds -static void _Delay(unsigned int ms) +static void _Delay(unsigned int ms) { - LARGE_INTEGER freq, c1, c2; - __int64 x; + LARGE_INTEGER freq, c1, c2; + __int64 x; - // Get High-Res Timer frequency + // Get High-Res Timer frequency if (!QueryPerformanceFrequency(&freq)) return; - + // Convert ms to High-Res Timer value x = freq.QuadPart/1000*ms; - // Get first snapshot of High-Res Timer value + // Get first snapshot of High-Res Timer value QueryPerformanceCounter(&c1); do { - // Get second snapshot - QueryPerformanceCounter(&c2); + // Get second snapshot + QueryPerformanceCounter(&c2); }while(c2.QuadPart-c1.QuadPart < x); // Loop while (second-first < x) } -#endif - -// CProcessor::CProcessor -// ====================== -// Class constructor: -///////////////////////// -CProcessor::CProcessor() -{ - uqwFrequency = 0; - strCPUName[0] = 0; - memset(&CPUInfo, 0, sizeof(CPUInfo)); -} -// unsigned __int64 CProcessor::GetCPUFrequency(unsigned int uiMeasureMSecs) -// ========================================================================= -// Function to measure the current CPU frequency -//////////////////////////////////////////////////////////////////////////// -F64 CProcessor::GetCPUFrequency(unsigned int uiMeasureMSecs) +static F64 calculate_cpu_frequency(U32 measure_msecs) { -#ifndef PROCESSOR_FREQUENCY_MEASURE_AVAILABLE - return 0; -#else - // If there are invalid measure time parameters, zero msecs for example, - // we've to exit the function - if (uiMeasureMSecs < 1) + if(measure_msecs == 0) { - // If theres already a measured frequency available, we return it - if (uqwFrequency > 0) - return uqwFrequency; - else - return 0; - } - - // Now we check if the CPUID command is available - if (!CheckCPUIDPresence()) return 0; - - // First we get the CPUID standard level 0x00000001 - unsigned long reg; - __asm - { - mov eax, 1 - cpuid - mov reg, edx } - // Then we check, if the RDTSC (Real Date Time Stamp Counter) is available. - // This function is necessary for our measure process. - if (!(reg & (1 << 4))) - return 0; - // After that we declare some vars and check the frequency of the high // resolution timer for the measure process. - // If there's no high-res timer, we exit. - __int64 starttime, endtime, timedif, freq, start, end, dif; + // If there"s no high-res timer, we exit. + unsigned __int64 starttime, endtime, timedif, freq, start, end, dif; if (!QueryPerformanceFrequency((LARGE_INTEGER *) &freq)) + { return 0; + } // Now we can init the measure process. We set the process and thread priority // to the highest available level (Realtime priority). Also we focus the @@ -169,35 +428,27 @@ F64 CProcessor::GetCPUFrequency(unsigned int uiMeasureMSecs) SetThreadPriority(hThread, THREAD_PRIORITY_TIME_CRITICAL); SetProcessAffinityMask(hProcess, dwNewMask); - // Now we call a CPUID to ensure, that all other prior called functions are - // completed now (serialization) - __asm cpuid + //// Now we call a CPUID to ensure, that all other prior called functions are + //// completed now (serialization) + //__asm cpuid + int cpu_info[4] = {-1}; + __cpuid(cpu_info, 0); // We ask the high-res timer for the start time QueryPerformanceCounter((LARGE_INTEGER *) &starttime); // Then we get the current cpu clock and store it - __asm - { - rdtsc - mov dword ptr [start+4], edx - mov dword ptr [start], eax - } + start = __rdtsc(); // Now we wart for some msecs - _Delay(uiMeasureMSecs); -// Sleep(uiMeasureMSecs); + _Delay(measure_msecs); + // Sleep(uiMeasureMSecs); // We ask for the end time QueryPerformanceCounter((LARGE_INTEGER *) &endtime); // And also for the end cpu clock - __asm - { - rdtsc - mov dword ptr [end+4], edx - mov dword ptr [end], eax - } + end = __rdtsc(); // Now we can restore the default process and thread priorities SetProcessAffinityMask(hProcess, dwProcessMask); @@ -210,2075 +461,433 @@ F64 CProcessor::GetCPUFrequency(unsigned int uiMeasureMSecs) // And finally the frequency is the clock difference divided by the time // difference. - uqwFrequency = (F64)dif / (((F64)timedif) / freq); + F64 frequency = (F64)dif / (((F64)timedif) / freq); // At last we just return the frequency that is also stored in the call - // member var uqwFrequency - return uqwFrequency; -#endif + // member var uqwFrequency - converted to MHz + return frequency / (F64)1000000; } -// bool CProcessor::AnalyzeIntelProcessor() -// ======================================== -// Private class function for analyzing an Intel processor -////////////////////////////////////////////////////////// -bool CProcessor::AnalyzeIntelProcessor() +// Windows implementation +class LLProcessorInfoWindowsImpl : public LLProcessorInfoImpl { -#if LL_WINDOWS - unsigned long eaxreg, ebxreg, edxreg; - - // First we check if the CPUID command is available - if (!CheckCPUIDPresence()) - return false; - - // Now we get the CPUID standard level 0x00000001 - __asm +public: + LLProcessorInfoWindowsImpl() { - mov eax, 1 - cpuid - mov eaxreg, eax - mov ebxreg, ebx - mov edxreg, edx + getCPUIDInfo(); + setInfo(eFrequency, calculate_cpu_frequency(50)); } - - // Then get the cpu model, family, type, stepping and brand id by masking - // the eax and ebx register - CPUInfo.uiStepping = eaxreg & 0xF; - CPUInfo.uiModel = (eaxreg >> 4) & 0xF; - CPUInfo.uiFamily = (eaxreg >> 8) & 0xF; - CPUInfo.uiType = (eaxreg >> 12) & 0x3; - CPUInfo.uiBrandID = ebxreg & 0xF; - - static const char* INTEL_BRAND[] = - { - /* 0x00 */ "", - /* 0x01 */ "0.18 micron Intel Celeron", - /* 0x02 */ "0.18 micron Intel Pentium III", - /* 0x03 */ "0.13 micron Intel Celeron", - /* 0x04 */ "0.13 micron Intel Pentium III", - /* 0x05 */ "", - /* 0x06 */ "0.13 micron Intel Pentium III Mobile", - /* 0x07 */ "0.13 micron Intel Celeron Mobile", - /* 0x08 */ "0.18 micron Intel Pentium 4", - /* 0x09 */ "0.13 micron Intel Pentium 4", - /* 0x0A */ "0.13 micron Intel Celeron", - /* 0x0B */ "0.13 micron Intel Pentium 4 Xeon", - /* 0x0C */ "Intel Xeon MP", - /* 0x0D */ "", - /* 0x0E */ "0.18 micron Intel Pentium 4 Xeon", - /* 0x0F */ "Mobile Intel Celeron", - /* 0x10 */ "", - /* 0x11 */ "Mobile Genuine Intel", - /* 0x12 */ "Intel Celeron M", - /* 0x13 */ "Mobile Intel Celeron", - /* 0x14 */ "Intel Celeron", - /* 0x15 */ "Mobile Genuine Intel", - /* 0x16 */ "Intel Pentium M", - /* 0x17 */ "Mobile Intel Celeron", - }; - // Only override the brand if we have it in the lookup table. We should - // already have a string here from GetCPUInfo(). JC - if ( CPUInfo.uiBrandID < LL_ARRAY_SIZE(INTEL_BRAND) ) +private: + void getCPUIDInfo() { - strncpy(CPUInfo.strBrandID, INTEL_BRAND[CPUInfo.uiBrandID], sizeof(CPUInfo.strBrandID)-1); - CPUInfo.strBrandID[sizeof(CPUInfo.strBrandID)-1]='\0'; + // http://msdn.microsoft.com/en-us/library/hskdteyh(VS.80).aspx - if (CPUInfo.uiBrandID == 3 && CPUInfo.uiModel == 6) + // __cpuid with an InfoType argument of 0 returns the number of + // valid Ids in cpu_info[0] and the CPU identification string in + // the other three array elements. The CPU identification string is + // not in linear order. The code below arranges the information + // in a human readable form. + int cpu_info[4] = {-1}; + __cpuid(cpu_info, 0); + unsigned int ids = (unsigned int)cpu_info[0]; + setConfig(eMaxID, (S32)ids); + + char cpu_vendor[0x20]; + memset(cpu_vendor, 0, sizeof(cpu_vendor)); + *((int*)cpu_vendor) = cpu_info[1]; + *((int*)(cpu_vendor+4)) = cpu_info[3]; + *((int*)(cpu_vendor+8)) = cpu_info[2]; + setInfo(eVendor, cpu_vendor); + + // Get the information associated with each valid Id + for(unsigned int i=0; i<=ids; ++i) { - strcpy(CPUInfo.strBrandID, "0.18 micron Intel Pentium III Xeon"); - } - } + __cpuid(cpu_info, i); - // Then we translate the cpu family - switch (CPUInfo.uiFamily) - { - case 3: // Family = 3: i386 (80386) processor family - strcpy(CPUInfo.strFamily, "Intel i386"); /* Flawfinder: ignore */ - break; - case 4: // Family = 4: i486 (80486) processor family - strcpy(CPUInfo.strFamily, "Intel i486"); /* Flawfinder: ignore */ - break; - case 5: // Family = 5: Pentium (80586) processor family - strcpy(CPUInfo.strFamily, "Intel Pentium"); /* Flawfinder: ignore */ - break; - case 6: // Family = 6: Pentium Pro (80686) processor family - strcpy(CPUInfo.strFamily, "Intel Pentium Pro/2/3, Core"); /* Flawfinder: ignore */ - break; - case 15: // Family = 15: Extended family specific - // Masking the extended family - CPUInfo.uiExtendedFamily = (eaxreg >> 20) & 0xFF; - switch (CPUInfo.uiExtendedFamily) - { - case 0: // Family = 15, Ext. Family = 0: Pentium 4 (80786 ??) processor family - strcpy(CPUInfo.strFamily, "Intel Pentium 4"); /* Flawfinder: ignore */ - break; - case 1: // Family = 15, Ext. Family = 1: McKinley (64-bit) processor family - strcpy(CPUInfo.strFamily, "Intel McKinley (IA-64)"); /* Flawfinder: ignore */ - break; - default: // Sure is sure - strcpy(CPUInfo.strFamily, "Unknown Intel Pentium 4+"); /* Flawfinder: ignore */ - break; - } - break; - default: // Failsave - strcpy(CPUInfo.strFamily, "Unknown"); /* Flawfinder: ignore */ - break; - } - - // Now we come to the big deal, the exact model name - switch (CPUInfo.uiFamily) - { - case 3: // i386 (80386) processor family - strcpy(CPUInfo.strModel, "Unknown Intel i386"); /* Flawfinder: ignore */ - strncat(strCPUName, "Intel i386", sizeof(strCPUName)-strlen(strCPUName)-1); /* Flawfinder: ignore */ - break; - case 4: // i486 (80486) processor family - switch (CPUInfo.uiModel) - { - case 0: // Model = 0: i486 DX-25/33 processor model - strcpy(CPUInfo.strModel, "Intel i486 DX-25/33"); /* Flawfinder: ignore */ - strncat(strCPUName, "Intel i486 DX-25/33", sizeof(strCPUName)-strlen(strCPUName)-1); /* Flawfinder: ignore */ - break; - case 1: // Model = 1: i486 DX-50 processor model - strcpy(CPUInfo.strModel, "Intel i486 DX-50"); /* Flawfinder: ignore */ - strncat(strCPUName, "Intel i486 DX-50", sizeof(strCPUName)-strlen(strCPUName)-1); /* Flawfinder: ignore */ - break; - case 2: // Model = 2: i486 SX processor model - strcpy(CPUInfo.strModel, "Intel i486 SX"); /* Flawfinder: ignore */ - strncat(strCPUName, "Intel i486 SX", sizeof(strCPUName)-strlen(strCPUName)-1); /* Flawfinder: ignore */ - break; - case 3: // Model = 3: i486 DX2 (with i487 numeric coprocessor) processor model - strcpy(CPUInfo.strModel, "Intel i486 487/DX2"); /* Flawfinder: ignore */ - strncat(strCPUName, "Intel i486 DX2 with i487 numeric coprocessor", sizeof(strCPUName)-strlen(strCPUName)-1); /* Flawfinder: ignore */ - break; - case 4: // Model = 4: i486 SL processor model (never heard ?!?) - strcpy(CPUInfo.strModel, "Intel i486 SL"); /* Flawfinder: ignore */ - strncat(strCPUName, "Intel i486 SL", sizeof(strCPUName)-strlen(strCPUName)-1); /* Flawfinder: ignore */ - break; - case 5: // Model = 5: i486 SX2 processor model - strcpy(CPUInfo.strModel, "Intel i486 SX2"); /* Flawfinder: ignore */ - strncat(strCPUName, "Intel i486 SX2", sizeof(strCPUName)-strlen(strCPUName)-1); /* Flawfinder: ignore */ - break; - case 7: // Model = 7: i486 write-back enhanced DX2 processor model - strcpy(CPUInfo.strModel, "Intel i486 write-back enhanced DX2"); /* Flawfinder: ignore */ - strncat(strCPUName, "Intel i486 write-back enhanced DX2", sizeof(strCPUName)-strlen(strCPUName)-1); /* Flawfinder: ignore */ - break; - case 8: // Model = 8: i486 DX4 processor model - strcpy(CPUInfo.strModel, "Intel i486 DX4"); /* Flawfinder: ignore */ - strncat(strCPUName, "Intel i486 DX4", sizeof(strCPUName)-strlen(strCPUName)-1); /* Flawfinder: ignore */ - break; - case 9: // Model = 9: i486 write-back enhanced DX4 processor model - strcpy(CPUInfo.strModel, "Intel i486 write-back enhanced DX4"); /* Flawfinder: ignore */ - strncat(strCPUName, "Intel i486 DX4", sizeof(strCPUName)-strlen(strCPUName)-1); /* Flawfinder: ignore */ - break; - default: // ... - strcpy(CPUInfo.strModel, "Unknown Intel i486"); /* Flawfinder: ignore */ - strncat(strCPUName, "Intel i486 (Unknown model)", sizeof(strCPUName)-strlen(strCPUName)-1); /* Flawfinder: ignore */ - break; - } - break; - case 5: // Pentium (80586) processor family - switch (CPUInfo.uiModel) - { - case 0: // Model = 0: Pentium (P5 A-Step) processor model - strcpy(CPUInfo.strModel, "Intel Pentium (P5 A-Step)"); /* Flawfinder: ignore */ - strncat(strCPUName, "Intel Pentium (P5 A-Step core)", sizeof(strCPUName)-strlen(strCPUName)-1); /* Flawfinder: ignore */ - break; // Famous for the DIV bug, as far as I know - case 1: // Model = 1: Pentium 60/66 processor model - strcpy(CPUInfo.strModel, "Intel Pentium 60/66 (P5)"); /* Flawfinder: ignore */ - strncat(strCPUName, "Intel Pentium 60/66 (P5 core)", sizeof(strCPUName)-strlen(strCPUName)-1); /* Flawfinder: ignore */ - break; - case 2: // Model = 2: Pentium 75-200 (P54C) processor model - strcpy(CPUInfo.strModel, "Intel Pentium 75-200 (P54C)"); /* Flawfinder: ignore */ - strncat(strCPUName, "Intel Pentium 75-200 (P54C core)", sizeof(strCPUName)-strlen(strCPUName)-1); /* Flawfinder: ignore */ - break; - case 3: // Model = 3: Pentium overdrive for 486 systems processor model - strcpy(CPUInfo.strModel, "Intel Pentium for 486 system (P24T Overdrive)"); /* Flawfinder: ignore */ - strncat(strCPUName, "Intel Pentium for 486 (P24T overdrive core)", sizeof(strCPUName)-(strlen(strCPUName)-1)); /*Flawfinder: ignore*/ - break; - case 4: // Model = 4: Pentium MMX processor model - strcpy(CPUInfo.strModel, "Intel Pentium MMX (P55C)"); /*Flawfinder: ignore*/ - strncat(strCPUName, "Intel Pentium MMX (P55C core)", sizeof(strCPUName)-(strlen(strCPUName)-1)); /*Flawfinder: ignore*/ - break; - case 7: // Model = 7: Pentium processor model (don't know difference to Model=2) - strcpy(CPUInfo.strModel, "Intel Pentium (P54C)"); /*Flawfinder: ignore*/ - strncat(strCPUName, "Intel Pentium (P54C core)", sizeof(strCPUName)-(strlen(strCPUName)-1)); /*Flawfinder: ignore*/ - break; - case 8: // Model = 8: Pentium MMX (0.25 micron) processor model - strcpy(CPUInfo.strModel, "Intel Pentium MMX (P55C), 0.25 micron"); /*Flawfinder: ignore*/ - strncat(strCPUName, "Intel Pentium MMX (P55C core), 0.25 micron", sizeof(strCPUName)-(strlen(strCPUName)-1)); /*Flawfinder: ignore*/ - break; - default: // ... - strcpy(CPUInfo.strModel, "Unknown Intel Pentium"); /*Flawfinder: ignore*/ - strncat(strCPUName, "Intel Pentium (Unknown P5-model)", sizeof(strCPUName)-(strlen(strCPUName)-1)); /*Flawfinder: ignore*/ - break; - } - break; - case 6: // Pentium Pro (80686) processor family - switch (CPUInfo.uiModel) - { - case 0: // Model = 0: Pentium Pro (P6 A-Step) processor model - strcpy(CPUInfo.strModel, "Intel Pentium Pro (P6 A-Step)"); /*Flawfinder: ignore*/ - strncat(strCPUName, "Intel Pentium Pro (P6 A-Step core)", sizeof(strCPUName)-(strlen(strCPUName)-1)); /*Flawfinder: ignore*/ - break; - case 1: // Model = 1: Pentium Pro - strcpy(CPUInfo.strModel, "Intel Pentium Pro (P6)"); /*Flawfinder: ignore*/ - strncat(strCPUName, "Intel Pentium Pro (P6 core)", sizeof(strCPUName)-(strlen(strCPUName)-1)); /*Flawfinder: ignore*/ - break; - case 3: // Model = 3: Pentium II (66 MHz FSB, I think) processor model - strcpy(CPUInfo.strModel, "Intel Pentium II Model 3, 0.28 micron"); /*Flawfinder: ignore*/ - strncat(strCPUName, "Intel Pentium II (Model 3 core, 0.28 micron process)", sizeof(strCPUName)-(strlen(strCPUName)-1)); /*Flawfinder: ignore*/ - break; - case 5: // Model = 5: Pentium II/Xeon/Celeron (0.25 micron) processor model - strcpy(CPUInfo.strModel, "Intel Pentium II Model 5/Xeon/Celeron, 0.25 micron"); /*Flawfinder: ignore*/ - strncat(strCPUName, "Intel Pentium II/Xeon/Celeron (Model 5 core, 0.25 micron process)", sizeof(strCPUName)-(strlen(strCPUName)-1)); /*Flawfinder: ignore*/ - break; - case 6: // Model = 6: Pentium II with internal L2 cache - strcpy(CPUInfo.strModel, "Intel Pentium II - internal L2 cache"); /*Flawfinder: ignore*/ - strncat(strCPUName, "Intel Pentium II with internal L2 cache", sizeof(strCPUName)-(strlen(strCPUName)-1)); /*Flawfinder: ignore*/ - break; - case 7: // Model = 7: Pentium III/Xeon (extern L2 cache) processor model - strcpy(CPUInfo.strModel, "Intel Pentium III/Pentium III Xeon - external L2 cache, 0.25 micron"); /*Flawfinder: ignore*/ - strncat(strCPUName, "Intel Pentium III/Pentium III Xeon (0.25 micron process) with external L2 cache", sizeof(strCPUName)-(strlen(strCPUName)-1)); /*Flawfinder: ignore*/ - break; - case 8: // Model = 8: Pentium III/Xeon/Celeron (256 KB on-die L2 cache) processor model - strcpy(CPUInfo.strModel, "Intel Pentium III/Celeron/Pentium III Xeon - internal L2 cache, 0.18 micron"); /*Flawfinder: ignore*/ - // We want to know it exactly: - switch (CPUInfo.uiBrandID) - { - case 1: // Model = 8, Brand id = 1: Celeron (on-die L2 cache) processor model - strncat(strCPUName, "Intel Celeron (0.18 micron process) with internal L2 cache", sizeof(strCPUName)-(strlen(strCPUName)-1)); /*Flawfinder: ignore*/ - break; - case 2: // Model = 8, Brand id = 2: Pentium III (on-die L2 cache) processor model (my current cpu :-)) - strncat(strCPUName, "Intel Pentium III (0.18 micron process) with internal L2 cache", sizeof(strCPUName)-(strlen(strCPUName)-1)); /*Flawfinder: ignore*/ - break; - case 3: // Model = 8, Brand id = 3: Pentium III Xeon (on-die L2 cache) processor model - strncat(strCPUName, "Intel Pentium III Xeon (0.18 micron process) with internal L2 cache", sizeof(strCPUName)-(strlen(strCPUName)-1)); /*Flawfinder: ignore*/ - break; - default: // ... - strncat(strCPUName, "Intel Pentium III core (unknown model, 0.18 micron process) with internal L2 cache", sizeof(strCPUName)-(strlen(strCPUName)-1)); /*Flawfinder: ignore*/ - break; - } - break; - case 9: // Model = 9: Intel Pentium M processor, Intel Celeron M processor, model 9 - strcpy(CPUInfo.strModel, "Intel Pentium M Series Processor"); /*Flawfinder: ignore*/ - strncat(strCPUName, "Intel Pentium M Series Processor", sizeof(strCPUName)-(strlen(strCPUName)-1)); /*Flawfinder: ignore*/ - break; - case 0xA: // Model = 0xA: Pentium III/Xeon/Celeron (1 or 2 MB on-die L2 cache) processor model - strcpy(CPUInfo.strModel, "Intel Pentium III/Celeron/Pentium III Xeon - internal L2 cache, 0.18 micron"); /*Flawfinder: ignore*/ - // Exact detection: - switch (CPUInfo.uiBrandID) - { - case 1: // Model = 0xA, Brand id = 1: Celeron (1 or 2 MB on-die L2 cache (does it exist??)) processor model - strncat(strCPUName, "Intel Celeron (0.18 micron process) with internal L2 cache", sizeof(strCPUName)-(strlen(strCPUName)-1)); /*Flawfinder: ignore*/ - break; - case 2: // Model = 0xA, Brand id = 2: Pentium III (1 or 2 MB on-die L2 cache (never seen...)) processor model - strncat(strCPUName, "Intel Pentium III (0.18 micron process) with internal L2 cache", sizeof(strCPUName)-(strlen(strCPUName)-1)); /*Flawfinder: ignore*/ - break; - case 3: // Model = 0xA, Brand id = 3: Pentium III Xeon (1 or 2 MB on-die L2 cache) processor model - strncat(strCPUName, "Intel Pentium III Xeon (0.18 micron process) with internal L2 cache", sizeof(strCPUName)-(strlen(strCPUName)-1)); /*Flawfinder: ignore*/ - break; - default: // Getting bored of this............ - strncat(strCPUName, "Intel Pentium III core (unknown model, 0.18 micron process) with internal L2 cache", sizeof(strCPUName)-(strlen(strCPUName)-1)); /*Flawfinder: ignore*/ - break; - } - break; - case 0xB: // Model = 0xB: Pentium III/Xeon/Celeron (Tualatin core, on-die cache) processor model - strcpy(CPUInfo.strModel, "Intel Pentium III/Celeron/Pentium III Xeon - internal L2 cache, 0.13 micron"); /*Flawfinder: ignore*/ - // Omniscient: ;-) - switch (CPUInfo.uiBrandID) - { - case 3: // Model = 0xB, Brand id = 3: Celeron (Tualatin core) processor model - strncat(strCPUName, "Intel Celeron (Tualatin core, 0.13 micron process) with internal L2 cache", sizeof(strCPUName)-(strlen(strCPUName)-1)); /*Flawfinder: ignore*/ - break; - case 4: // Model = 0xB, Brand id = 4: Pentium III (Tualatin core) processor model - strncat(strCPUName, "Intel Pentium III (Tualatin core, 0.13 micron process) with internal L2 cache", sizeof(strCPUName)-(strlen(strCPUName)-1)); /*Flawfinder: ignore*/ - break; - case 7: // Model = 0xB, Brand id = 7: Celeron mobile (Tualatin core) processor model - strncat(strCPUName, "Intel Celeron mobile (Tualatin core, 0.13 micron process) with internal L2 cache", sizeof(strCPUName)-(strlen(strCPUName)-1)); /*Flawfinder: ignore*/ - break; - default: // *bored* - strncat(strCPUName, "Intel Pentium III Tualatin core (unknown model, 0.13 micron process) with internal L2 cache", sizeof(strCPUName)-(strlen(strCPUName)-1)); /*Flawfinder: ignore*/ - break; - } - break; - case 0xD: // Model = 0xD: Intel Pentium M processor, Intel Celeron M processor, model D - strcpy(CPUInfo.strModel, "Intel Pentium M Series Processor"); /*Flawfinder: ignore*/ - strncat(strCPUName, "Intel Pentium M Series Processor", sizeof(strCPUName)-(strlen(strCPUName)-1)); /*Flawfinder: ignore*/ - break; - case 0xE: // Model = 0xE: Intel Core Duo processor, Intel Core Solo processor, model E - strcpy(CPUInfo.strModel, "Intel Core Series Processor"); /*Flawfinder: ignore*/ - strncat(strCPUName, "Intel Core Series Processor", sizeof(strCPUName)-(strlen(strCPUName)-1)); /*Flawfinder: ignore*/ - break; - case 0xF: // Model = 0xF: Intel Core 2 Duo processor, model F - strcpy(CPUInfo.strModel, "Intel Core 2 Series Processor"); /*Flawfinder: ignore*/ - strncat(strCPUName, "Intel Core 2 Series Processor", sizeof(strCPUName)-(strlen(strCPUName)-1)); /*Flawfinder: ignore*/ - break; - default: // *more bored* - strcpy(CPUInfo.strModel, "Unknown Intel Pentium Pro/2/3, Core"); /*Flawfinder: ignore*/ - strncat(strCPUName, "Intel Pentium Pro/2/3, Core (Unknown model)", sizeof(strCPUName)-(strlen(strCPUName)-1)); /*Flawfinder: ignore*/ - break; - } - break; - case 15: // Extended processor family - // Masking the extended model - CPUInfo.uiExtendedModel = (eaxreg >> 16) & 0xFF; - switch (CPUInfo.uiModel) + // Interpret CPU feature information. + if (i == 1) { - case 0: // Model = 0: Pentium 4 Willamette (A-Step) core - if ((CPUInfo.uiBrandID) == 8) // Brand id = 8: P4 Willamette - { - strcpy(CPUInfo.strModel, "Intel Pentium 4 Willamette (A-Step)"); /*Flawfinder: ignore*/ - strncat(strCPUName, "Intel Pentium 4 Willamette (A-Step)", sizeof(strCPUName)-(strlen(strCPUName)-1)); /*Flawfinder: ignore*/ - } - else // else Xeon - { - strcpy(CPUInfo.strModel, "Intel Pentium 4 Willamette Xeon (A-Step)"); /* Flawfinder: ignore */ - strncat(strCPUName, "Intel Pentium 4 Willamette Xeon (A-Step)", sizeof(strCPUName) - strlen(strCPUName) - 1); /* Flawfinder: ignore */ - } - break; - case 1: // Model = 1: Pentium 4 Willamette core - if ((CPUInfo.uiBrandID) == 8) // Brand id = 8: P4 Willamette - { - strcpy(CPUInfo.strModel, "Intel Pentium 4 Willamette"); /* Flawfinder: ignore */ - strncat(strCPUName, "Intel Pentium 4 Willamette", sizeof(strCPUName) - strlen(strCPUName) - 1); /* Flawfinder: ignore */ - } - else // else Xeon + setInfo(eStepping, cpu_info[0] & 0xf); + setInfo(eModel, (cpu_info[0] >> 4) & 0xf); + int family = (cpu_info[0] >> 8) & 0xf; + setInfo(eFamily, family); + setInfo(eType, (cpu_info[0] >> 12) & 0x3); + setInfo(eExtendedModel, (cpu_info[0] >> 16) & 0xf); + int ext_family = (cpu_info[0] >> 20) & 0xff; + setInfo(eExtendedFamily, ext_family); + setInfo(eBrandID, cpu_info[1] & 0xff); + + setInfo(eFamilyName, compute_CPUFamilyName(cpu_vendor, family, ext_family)); + + setConfig(eCLFLUSHCacheLineSize, ((cpu_info[1] >> 8) & 0xff) * 8); + setConfig(eAPICPhysicalID, (cpu_info[1] >> 24) & 0xff); + + if(cpu_info[2] & 0x1) + { + setExtension(cpu_feature_names[eSSE3_Features]); + } + + if(cpu_info[2] & 0x8) + { + setExtension(cpu_feature_names[eMONTIOR_MWAIT]); + } + + if(cpu_info[2] & 0x10) + { + setExtension(cpu_feature_names[eCPLDebugStore]); + } + + if(cpu_info[2] & 0x100) + { + setExtension(cpu_feature_names[eThermalMonitor2]); + } + + unsigned int feature_info = (unsigned int) cpu_info[3]; + for(unsigned int index = 0, bit = 1; index < eSSE3_Features; ++index, bit <<= 1) + { + if(feature_info & bit) { - strcpy(CPUInfo.strModel, "Intel Pentium 4 Willamette Xeon"); /* Flawfinder: ignore */ - strncat(strCPUName, "Intel Pentium 4 Willamette Xeon", sizeof(strCPUName) - strlen(strCPUName) - 1); /* Flawfinder: ignore */ + setExtension(cpu_feature_names[index]); } - break; - case 2: // Model = 2: Pentium 4 Northwood core - if (((CPUInfo.uiBrandID) == 9) || ((CPUInfo.uiBrandID) == 0xA)) // P4 Willamette - { - strcpy(CPUInfo.strModel, "Intel Pentium 4 Northwood"); /* Flawfinder: ignore */ - strncat(strCPUName, "Intel Pentium 4 Northwood", sizeof(strCPUName) - strlen(strCPUName) - 1); /* Flawfinder: ignore */ - } - else // Xeon - { - strcpy(CPUInfo.strModel, "Intel Pentium 4 Northwood Xeon"); /* Flawfinder: ignore */ - strncat(strCPUName, "Intel Pentium 4 Northwood Xeon", sizeof(strCPUName) - strlen(strCPUName) - 1); /* Flawfinder: ignore */ - } - break; - default: // Silly stupid never used failsave option - strcpy(CPUInfo.strModel, "Unknown Intel Pentium 4"); /* Flawfinder: ignore */ - strncat(strCPUName, "Intel Pentium 4 (Unknown model)", sizeof(strCPUName) - strlen(strCPUName) - 1); /* Flawfinder: ignore */ - break; + } } - break; - default: // *grmpf* - strcpy(CPUInfo.strModel, "Unknown Intel model"); /* Flawfinder: ignore */ - strncat(strCPUName, "Intel (Unknown model)", sizeof(strCPUName) - strlen(strCPUName) - 1); /* Flawfinder: ignore */ - break; - } - - // After the long processor model block we now come to the processors serial - // number. - // First of all we check if the processor supports the serial number - if (CPUInfo.MaxSupportedLevel >= 3) - { - // If it supports the serial number CPUID level 0x00000003 we read the data - unsigned long sig1, sig2, sig3; - __asm - { - mov eax, 1 - cpuid - mov sig1, eax - mov eax, 3 - cpuid - mov sig2, ecx - mov sig3, edx } - // Then we convert the data to a readable string - snprintf( /* Flawfinder: ignore */ - CPUInfo.strProcessorSerial, - sizeof(CPUInfo.strProcessorSerial), - "%04lX-%04lX-%04lX-%04lX-%04lX-%04lX", - sig1 >> 16, - sig1 & 0xFFFF, - sig3 >> 16, - sig3 & 0xFFFF, - sig2 >> 16, sig2 & 0xFFFF); - } - else - { - // If there's no serial number support we just put "No serial number" - snprintf( /* Flawfinder: ignore */ - CPUInfo.strProcessorSerial, - sizeof(CPUInfo.strProcessorSerial), - "No Processor Serial Number"); - } - // Now we get the standard processor extensions - GetStandardProcessorExtensions(); + // Calling __cpuid with 0x80000000 as the InfoType argument + // gets the number of valid extended IDs. + __cpuid(cpu_info, 0x80000000); + unsigned int ext_ids = cpu_info[0]; + setConfig(eMaxExtID, 0); - // And finally the processor configuration (caches, TLBs, ...) and translate - // the data to readable strings - GetStandardProcessorConfiguration(); - TranslateProcessorConfiguration(); - - // At last... - return true; -#else - return FALSE; -#endif -} + char cpu_brand_string[0x40]; + memset(cpu_brand_string, 0, sizeof(cpu_brand_string)); -// bool CProcessor::AnalyzeAMDProcessor() -// ====================================== -// Private class function for analyzing an AMD processor -//////////////////////////////////////////////////////// -bool CProcessor::AnalyzeAMDProcessor() -{ -#if LL_WINDOWS - unsigned long eaxreg, ebxreg, ecxreg, edxreg; - - // First of all we check if the CPUID command is available - if (!CheckCPUIDPresence()) - return 0; - - // Now we get the CPUID standard level 0x00000001 - __asm - { - mov eax, 1 - cpuid - mov eaxreg, eax - mov ebxreg, ebx - mov edxreg, edx - } - - // Then we mask the model, family, stepping and type (AMD does not support brand id) - CPUInfo.uiStepping = eaxreg & 0xF; - CPUInfo.uiModel = (eaxreg >> 4) & 0xF; - CPUInfo.uiFamily = (eaxreg >> 8) & 0xF; - CPUInfo.uiType = (eaxreg >> 12) & 0x3; - - // Now we check if the processor supports the brand id string extended CPUID level - if (CPUInfo.MaxSupportedExtendedLevel >= 0x80000004) - { - // If it supports the extended CPUID level 0x80000004 we read the data - char tmp[52]; /* Flawfinder: ignore */ - memset(tmp, 0, sizeof(tmp)); - __asm + // Get the information associated with each extended ID. + for(unsigned int i=0x80000000; i<=ext_ids; ++i) { - mov eax, 0x80000002 - cpuid - mov dword ptr [tmp], eax - mov dword ptr [tmp+4], ebx - mov dword ptr [tmp+8], ecx - mov dword ptr [tmp+12], edx - mov eax, 0x80000003 - cpuid - mov dword ptr [tmp+16], eax - mov dword ptr [tmp+20], ebx - mov dword ptr [tmp+24], ecx - mov dword ptr [tmp+28], edx - mov eax, 0x80000004 - cpuid - mov dword ptr [tmp+32], eax - mov dword ptr [tmp+36], ebx - mov dword ptr [tmp+40], ecx - mov dword ptr [tmp+44], edx - } - // And copy it to the brand id string - strncpy(CPUInfo.strBrandID, tmp,sizeof(CPUInfo.strBrandID)-1); - CPUInfo.strBrandID[sizeof(CPUInfo.strBrandID)-1]='\0'; - } - else - { - // Or just tell there is no brand id string support - strcpy(CPUInfo.strBrandID, ""); /* Flawfinder: ignore */ - } - - // After that we translate the processor family - switch(CPUInfo.uiFamily) - { - case 4: // Family = 4: 486 (80486) or 5x86 (80486) processor family - switch (CPUInfo.uiModel) + __cpuid(cpu_info, i); + + // Interpret CPU brand string and cache information. + if (i == 0x80000002) + memcpy(cpu_brand_string, cpu_info, sizeof(cpu_info)); + else if (i == 0x80000003) + memcpy(cpu_brand_string + 16, cpu_info, sizeof(cpu_info)); + else if (i == 0x80000004) { - case 3: // Thanks to AMD for this nice form of family - case 7: // detection.... *grmpf* - case 8: - case 9: - strcpy(CPUInfo.strFamily, "AMD 80486"); /* Flawfinder: ignore */ - break; - case 0xE: - case 0xF: - strcpy(CPUInfo.strFamily, "AMD 5x86"); /* Flawfinder: ignore */ - break; - default: - strcpy(CPUInfo.strFamily, "Unknown family"); /* Flawfinder: ignore */ - break; + memcpy(cpu_brand_string + 32, cpu_info, sizeof(cpu_info)); + setInfo(eBrandName, cpu_brand_string); } - break; - case 5: // Family = 5: K5 or K6 processor family - switch (CPUInfo.uiModel) + else if (i == 0x80000006) { - case 0: - case 1: - case 2: - case 3: - strcpy(CPUInfo.strFamily, "AMD K5"); /* Flawfinder: ignore */ - break; - case 6: - case 7: - case 8: - case 9: - strcpy(CPUInfo.strFamily, "AMD K6"); /* Flawfinder: ignore */ - break; - default: - strcpy(CPUInfo.strFamily, "Unknown family"); /* Flawfinder: ignore */ - break; + setConfig(eCacheLineSize, cpu_info[2] & 0xff); + setConfig(eL2Associativity, (cpu_info[2] >> 12) & 0xf); + setConfig(eCacheSizeK, (cpu_info[2] >> 16) & 0xffff); } - break; - case 6: // Family = 6: K7 (Athlon, ...) processor family - strcpy(CPUInfo.strFamily, "AMD K7"); /* Flawfinder: ignore */ - break; - default: // For security - strcpy(CPUInfo.strFamily, "Unknown family"); /* Flawfinder: ignore */ - break; + } } +}; - // After the family detection we come to the specific processor model - // detection - switch (CPUInfo.uiFamily) - { - case 4: // Family = 4: 486 (80486) or 5x85 (80486) processor family - switch (CPUInfo.uiModel) - { - case 3: // Model = 3: 80486 DX2 - strcpy(CPUInfo.strModel, "AMD 80486 DX2"); /* Flawfinder: ignore */ - strncat(strCPUName, "AMD 80486 DX2", sizeof(strCPUName) - strlen(strCPUName) -1); /* Flawfinder: ignore */ - break; - case 7: // Model = 7: 80486 write-back enhanced DX2 - strcpy(CPUInfo.strModel, "AMD 80486 write-back enhanced DX2"); /* Flawfinder: ignore */ - strncat(strCPUName, "AMD 80486 write-back enhanced DX2", sizeof(strCPUName) - strlen(strCPUName) -1); /* Flawfinder: ignore */ - break; - case 8: // Model = 8: 80486 DX4 - strcpy(CPUInfo.strModel, "AMD 80486 DX4"); /* Flawfinder: ignore */ - strncat(strCPUName, "AMD 80486 DX4", sizeof(strCPUName) - strlen(strCPUName) -1); /* Flawfinder: ignore */ - break; - case 9: // Model = 9: 80486 write-back enhanced DX4 - strcpy(CPUInfo.strModel, "AMD 80486 write-back enhanced DX4"); /* Flawfinder: ignore */ - strncat(strCPUName, "AMD 80486 write-back enhanced DX4", sizeof(strCPUName) - strlen(strCPUName) -1); /* Flawfinder: ignore */ - break; - case 0xE: // Model = 0xE: 5x86 - strcpy(CPUInfo.strModel, "AMD 5x86"); /* Flawfinder: ignore */ - strncat(strCPUName, "AMD 5x86", sizeof(strCPUName) - strlen(strCPUName) -1); /* Flawfinder: ignore */ - break; - case 0xF: // Model = 0xF: 5x86 write-back enhanced (oh my god.....) - strcpy(CPUInfo.strModel, "AMD 5x86 write-back enhanced"); /* Flawfinder: ignore */ - strncat(strCPUName, "AMD 5x86 write-back enhanced", sizeof(strCPUName) - strlen(strCPUName) -1); /* Flawfinder: ignore */ - break; - default: // ... - strcpy(CPUInfo.strModel, "Unknown AMD 80486 or 5x86 model"); /* Flawfinder: ignore */ - strncat(strCPUName, "AMD 80486 or 5x86 (Unknown model)", sizeof(strCPUName) - strlen(strCPUName) -1); /* Flawfinder: ignore */ - break; - } - break; - case 5: // Family = 5: K5 / K6 processor family - switch (CPUInfo.uiModel) - { - case 0: // Model = 0: K5 SSA 5 (Pentium Rating *ggg* 75, 90 and 100 Mhz) - strcpy(CPUInfo.strModel, "AMD K5 SSA5 (PR75, PR90, PR100)"); /* Flawfinder: ignore */ - strncat(strCPUName, "AMD K5 SSA5 (PR75, PR90, PR100)", sizeof(strCPUName) - strlen(strCPUName) -1); /* Flawfinder: ignore */ - break; - case 1: // Model = 1: K5 5k86 (PR 120 and 133 MHz) - strcpy(CPUInfo.strModel, "AMD K5 5k86 (PR120, PR133)"); /* Flawfinder: ignore */ - strncat(strCPUName, "AMD K5 5k86 (PR120, PR133)", sizeof(strCPUName) - strlen(strCPUName) -1); /* Flawfinder: ignore */ - break; - case 2: // Model = 2: K5 5k86 (PR 166 MHz) - strcpy(CPUInfo.strModel, "AMD K5 5k86 (PR166)"); /* Flawfinder: ignore */ - strncat(strCPUName, "AMD K5 5k86 (PR166)", sizeof(strCPUName) - strlen(strCPUName) -1); /* Flawfinder: ignore */ - break; - case 3: // Model = 3: K5 5k86 (PR 200 MHz) - strcpy(CPUInfo.strModel, "AMD K5 5k86 (PR200)"); /* Flawfinder: ignore */ - strncat(strCPUName, "AMD K5 5k86 (PR200)", sizeof(strCPUName) - strlen(strCPUName) -1); /* Flawfinder: ignore */ - break; - case 6: // Model = 6: K6 - strcpy(CPUInfo.strModel, "AMD K6 (0.30 micron)"); /* Flawfinder: ignore */ - strncat(strCPUName, "AMD K6 (0.30 micron)", sizeof(strCPUName) - strlen(strCPUName) -1); /* Flawfinder: ignore */ - break; - case 7: // Model = 7: K6 (0.25 micron) - strcpy(CPUInfo.strModel, "AMD K6 (0.25 micron)"); /* Flawfinder: ignore */ - strncat(strCPUName, "AMD K6 (0.25 micron)", sizeof(strCPUName) - strlen(strCPUName) -1); /* Flawfinder: ignore */ - break; - case 8: // Model = 8: K6-2 - strcpy(CPUInfo.strModel, "AMD K6-2"); /* Flawfinder: ignore */ - strncat(strCPUName, "AMD K6-2", sizeof(strCPUName) - strlen(strCPUName) -1); /* Flawfinder: ignore */ - break; - case 9: // Model = 9: K6-III - strcpy(CPUInfo.strModel, "AMD K6-III"); /* Flawfinder: ignore */ - strncat(strCPUName, "AMD K6-III", sizeof(strCPUName) - strlen(strCPUName) -1); /* Flawfinder: ignore */ - break; - case 0xD: // Model = 0xD: K6-2+ / K6-III+ - strcpy(CPUInfo.strModel, "AMD K6-2+ or K6-III+ (0.18 micron)"); /* Flawfinder: ignore */ - strncat(strCPUName, "AMD K6-2+ or K6-III+ (0.18 micron)", sizeof(strCPUName) - strlen(strCPUName) -1); /* Flawfinder: ignore */ - break; - default: // ... - strcpy(CPUInfo.strModel, "Unknown AMD K5 or K6 model"); /* Flawfinder: ignore */ - strncat(strCPUName, "AMD K5 or K6 (Unknown model)", sizeof(strCPUName) - strlen(strCPUName) -1); /* Flawfinder: ignore */ - break; - } - break; - case 6: // Family = 6: K7 processor family (AMDs first good processors) - switch (CPUInfo.uiModel) +#elif LL_DARWIN + +#include <mach/machine.h> +#include <sys/sysctl.h> + +class LLProcessorInfoDarwinImpl : public LLProcessorInfoImpl +{ +public: + LLProcessorInfoDarwinImpl() + { + getCPUIDInfo(); + uint64_t frequency = getSysctlInt64("hw.cpufrequency"); + setInfo(eFrequency, (F64)frequency / (F64)1000000); + } + + virtual ~LLProcessorInfoDarwinImpl() {} + +private: + int getSysctlInt(const char* name) + { + int result = 0; + size_t len = sizeof(int); + int error = sysctlbyname(name, (void*)&result, &len, NULL, 0); + return error == -1 ? 0 : result; + } + + uint64_t getSysctlInt64(const char* name) + { + uint64_t value = 0; + size_t size = sizeof(value); + int result = sysctlbyname(name, (void*)&value, &size, NULL, 0); + if ( result == 0 ) + { + if ( size == sizeof( uint64_t ) ) + ; + else if ( size == sizeof( uint32_t ) ) + value = (uint64_t)(( uint32_t *)&value); + else if ( size == sizeof( uint16_t ) ) + value = (uint64_t)(( uint16_t *)&value); + else if ( size == sizeof( uint8_t ) ) + value = (uint64_t)(( uint8_t *)&value); + else { - case 1: // Athlon - strcpy(CPUInfo.strModel, "AMD Athlon (0.25 micron)"); /* Flawfinder: ignore */ - strncat(strCPUName, "AMD Athlon (0.25 micron)", sizeof(strCPUName) - strlen(strCPUName) -1); /* Flawfinder: ignore */ - break; - case 2: // Athlon (0.18 micron) - strcpy(CPUInfo.strModel, "AMD Athlon (0.18 micron)"); /* Flawfinder: ignore */ - strncat(strCPUName, "AMD Athlon (0.18 micron)", sizeof(strCPUName) - strlen(strCPUName) -1); /* Flawfinder: ignore */ - break; - case 3: // Duron (Spitfire core) - strcpy(CPUInfo.strModel, "AMD Duron (Spitfire)"); /* Flawfinder: ignore */ - strncat(strCPUName, "AMD Duron (Spitfire core)", sizeof(strCPUName) - strlen(strCPUName) -1); /* Flawfinder: ignore */ - break; - case 4: // Athlon (Thunderbird core) - strcpy(CPUInfo.strModel, "AMD Athlon (Thunderbird)"); /* Flawfinder: ignore */ - strncat(strCPUName, "AMD Athlon (Thunderbird core)", sizeof(strCPUName) - strlen(strCPUName) -1); /* Flawfinder: ignore */ - break; - case 6: // Athlon MP / Mobile Athlon (Palomino core) - strcpy(CPUInfo.strModel, "AMD Athlon MP/Mobile Athlon (Palomino)"); /* Flawfinder: ignore */ - strncat(strCPUName, "AMD Athlon MP/Mobile Athlon (Palomino core)", sizeof(strCPUName) - strlen(strCPUName) -1); /* Flawfinder: ignore */ - break; - case 7: // Mobile Duron (Morgan core) - strcpy(CPUInfo.strModel, "AMD Mobile Duron (Morgan)"); /* Flawfinder: ignore */ - strncat(strCPUName, "AMD Mobile Duron (Morgan core)", sizeof(strCPUName) - strlen(strCPUName) -1); /* Flawfinder: ignore */ - break; - default: // ... - strcpy(CPUInfo.strModel, "Unknown AMD K7 model"); /* Flawfinder: ignore */ - strncat(strCPUName, "AMD K7 (Unknown model)", sizeof(strCPUName) - strlen(strCPUName) -1); /* Flawfinder: ignore */ - break; + LL_WARNS("Unknown type returned from sysctl!") << LL_ENDL; } - break; - default: // ... - strcpy(CPUInfo.strModel, "Unknown AMD model"); /* Flawfinder: ignore */ - strncat(strCPUName, "AMD (Unknown model)", sizeof(strCPUName) - strlen(strCPUName) -1); /* Flawfinder: ignore */ - break; - } - - // Now we read the standard processor extension that are stored in the same - // way the Intel standard extensions are - GetStandardProcessorExtensions(); - - // Then we check if theres an extended CPUID level support - if (CPUInfo.MaxSupportedExtendedLevel >= 0x80000001) - { - // If we can access the extended CPUID level 0x80000001 we get the - // edx register - __asm - { - mov eax, 0x80000001 - cpuid - mov edxreg, edx } - - // Now we can mask some AMD specific cpu extensions - CPUInfo._Ext.EMMX_MultimediaExtensions = CheckBit(edxreg, 22); - CPUInfo._Ext.AA64_AMD64BitArchitecture = CheckBit(edxreg, 29); - CPUInfo._Ext._E3DNOW_InstructionExtensions = CheckBit(edxreg, 30); - CPUInfo._Ext._3DNOW_InstructionExtensions = CheckBit(edxreg, 31); - } - - // After that we check if the processor supports the ext. CPUID level - // 0x80000006 - if (CPUInfo.MaxSupportedExtendedLevel >= 0x80000006) + + return result == -1 ? 0 : value; + } + + void getCPUIDInfo() { - // If it's present, we read it out - __asm - { - mov eax, 0x80000005 - cpuid - mov eaxreg, eax - mov ebxreg, ebx - mov ecxreg, ecx - mov edxreg, edx - } + size_t len = 0; - // Then we mask the L1 Data TLB information - if ((ebxreg >> 16) && (eaxreg >> 16)) - { - CPUInfo._Data.bPresent = true; - strcpy(CPUInfo._Data.strPageSize, "4 KB / 2 MB / 4MB"); /*Flawfinder: ignore*/ - CPUInfo._Data.uiAssociativeWays = (eaxreg >> 24) & 0xFF; - CPUInfo._Data.uiEntries = (eaxreg >> 16) & 0xFF; - } - else if (eaxreg >> 16) - { - CPUInfo._Data.bPresent = true; - strcpy(CPUInfo._Data.strPageSize, "2 MB / 4MB"); /*Flawfinder: ignore*/ - CPUInfo._Data.uiAssociativeWays = (eaxreg >> 24) & 0xFF; - CPUInfo._Data.uiEntries = (eaxreg >> 16) & 0xFF; - } - else if (ebxreg >> 16) - { - CPUInfo._Data.bPresent = true; - strcpy(CPUInfo._Data.strPageSize, "4 KB"); /*Flawfinder: ignore*/ - CPUInfo._Data.uiAssociativeWays = (ebxreg >> 24) & 0xFF; - CPUInfo._Data.uiEntries = (ebxreg >> 16) & 0xFF; - } - if (CPUInfo._Data.uiAssociativeWays == 0xFF) - CPUInfo._Data.uiAssociativeWays = (unsigned int) -1; - - // Now the L1 Instruction/Code TLB information - if ((ebxreg & 0xFFFF) && (eaxreg & 0xFFFF)) - { - CPUInfo._Instruction.bPresent = true; - strcpy(CPUInfo._Instruction.strPageSize, "4 KB / 2 MB / 4MB"); /*Flawfinder: ignore*/ - CPUInfo._Instruction.uiAssociativeWays = (eaxreg >> 8) & 0xFF; - CPUInfo._Instruction.uiEntries = eaxreg & 0xFF; - } - else if (eaxreg & 0xFFFF) - { - CPUInfo._Instruction.bPresent = true; - strcpy(CPUInfo._Instruction.strPageSize, "2 MB / 4MB"); /*Flawfinder: ignore*/ - CPUInfo._Instruction.uiAssociativeWays = (eaxreg >> 8) & 0xFF; - CPUInfo._Instruction.uiEntries = eaxreg & 0xFF; - } - else if (ebxreg & 0xFFFF) - { - CPUInfo._Instruction.bPresent = true; - strcpy(CPUInfo._Instruction.strPageSize, "4 KB"); /*Flawfinder: ignore*/ - CPUInfo._Instruction.uiAssociativeWays = (ebxreg >> 8) & 0xFF; - CPUInfo._Instruction.uiEntries = ebxreg & 0xFF; - } - if (CPUInfo._Instruction.uiAssociativeWays == 0xFF) - CPUInfo._Instruction.uiAssociativeWays = (unsigned int) -1; + char cpu_brand_string[0x40]; + len = sizeof(cpu_brand_string); + memset(cpu_brand_string, 0, len); + sysctlbyname("machdep.cpu.brand_string", (void*)cpu_brand_string, &len, NULL, 0); + cpu_brand_string[0x3f] = 0; + setInfo(eBrandName, cpu_brand_string); - // Then we read the L1 data cache information - if ((ecxreg >> 24) > 0) - { - CPUInfo._L1.Data.bPresent = true; - snprintf(CPUInfo._L1.Data.strSize, sizeof(CPUInfo._L1.Data.strSize), "%d KB", ecxreg >> 24); /* Flawfinder: ignore */ - CPUInfo._L1.Data.uiAssociativeWays = (ecxreg >> 15) & 0xFF; - CPUInfo._L1.Data.uiLineSize = ecxreg & 0xFF; - } - // After that we read the L2 instruction/code cache information - if ((edxreg >> 24) > 0) - { - CPUInfo._L1.Instruction.bPresent = true; - snprintf(CPUInfo._L1.Instruction.strSize, sizeof(CPUInfo._L1.Instruction.strSize), "%d KB", edxreg >> 24); /* Flawfinder: ignore */ - CPUInfo._L1.Instruction.uiAssociativeWays = (edxreg >> 15) & 0xFF; - CPUInfo._L1.Instruction.uiLineSize = edxreg & 0xFF; - } - - // Note: I'm not absolutely sure that the L1 page size code (the - // 'if/else if/else if' structs above) really detects the real page - // size for the TLB. Somebody should check it.... - - // Now we read the ext. CPUID level 0x80000006 - __asm - { - mov eax, 0x80000006 - cpuid - mov eaxreg, eax - mov ebxreg, ebx - mov ecxreg, ecx - } + char cpu_vendor[0x20]; + len = sizeof(cpu_vendor); + memset(cpu_vendor, 0, len); + sysctlbyname("machdep.cpu.vendor", (void*)cpu_vendor, &len, NULL, 0); + cpu_vendor[0x1f] = 0; + setInfo(eVendor, cpu_vendor); + + setInfo(eStepping, getSysctlInt("machdep.cpu.stepping")); + setInfo(eModel, getSysctlInt("machdep.cpu.model")); + int family = getSysctlInt("machdep.cpu.family"); + int ext_family = getSysctlInt("machdep.cpu.extfamily"); + setInfo(eFamily, family); + setInfo(eExtendedFamily, ext_family); + setInfo(eFamilyName, compute_CPUFamilyName(cpu_vendor, family, ext_family)); + setInfo(eExtendedModel, getSysctlInt("machdep.cpu.extmodel")); + setInfo(eBrandID, getSysctlInt("machdep.cpu.brand")); + setInfo(eType, 0); // ? where to find this? + + //setConfig(eCLFLUSHCacheLineSize, ((cpu_info[1] >> 8) & 0xff) * 8); + //setConfig(eAPICPhysicalID, (cpu_info[1] >> 24) & 0xff); + setConfig(eCacheLineSize, getSysctlInt("machdep.cpu.cache.linesize")); + setConfig(eL2Associativity, getSysctlInt("machdep.cpu.cache.L2_associativity")); + setConfig(eCacheSizeK, getSysctlInt("machdep.cpu.cache.size")); + + uint64_t feature_info = getSysctlInt64("machdep.cpu.feature_bits"); + S32 *feature_infos = (S32*)(&feature_info); + + setConfig(eFeatureBits, feature_infos[0]); - // We only mask the unified L2 cache masks (never heard of an - // L2 cache that is divided in data and code parts) - if (((ecxreg >> 12) & 0xF) > 0) + for(unsigned int index = 0, bit = 1; index < eSSE3_Features; ++index, bit <<= 1) { - CPUInfo._L2.bPresent = true; - snprintf(CPUInfo._L2.strSize, sizeof(CPUInfo._L2.strSize), "%d KB", ecxreg >> 16); /* Flawfinder: ignore */ - switch ((ecxreg >> 12) & 0xF) + if(feature_info & bit) { - case 1: - CPUInfo._L2.uiAssociativeWays = 1; - break; - case 2: - CPUInfo._L2.uiAssociativeWays = 2; - break; - case 4: - CPUInfo._L2.uiAssociativeWays = 4; - break; - case 6: - CPUInfo._L2.uiAssociativeWays = 8; - break; - case 8: - CPUInfo._L2.uiAssociativeWays = 16; - break; - case 0xF: - CPUInfo._L2.uiAssociativeWays = (unsigned int) -1; - break; - default: - CPUInfo._L2.uiAssociativeWays = 0; - break; + setExtension(cpu_feature_names[index]); } - CPUInfo._L2.uiLineSize = ecxreg & 0xFF; } - } - else - { - // If we could not detect the ext. CPUID level 0x80000006 we - // try to read the standard processor configuration. - GetStandardProcessorConfiguration(); - } - // After reading we translate the configuration to strings - TranslateProcessorConfiguration(); - - // And finally exit - return true; -#else - return FALSE; -#endif -} - -// bool CProcessor::AnalyzeUnknownProcessor() -// ========================================== -// Private class function to analyze an unknown (No Intel or AMD) processor -/////////////////////////////////////////////////////////////////////////// -bool CProcessor::AnalyzeUnknownProcessor() -{ -#if LL_WINDOWS - unsigned long eaxreg, ebxreg; - - // We check if the CPUID command is available - if (!CheckCPUIDPresence()) - return false; - - // First of all we read the standard CPUID level 0x00000001 - // This level should be available on every x86-processor clone - __asm - { - mov eax, 1 - cpuid - mov eaxreg, eax - mov ebxreg, ebx - } - // Then we mask the processor model, family, type and stepping - CPUInfo.uiStepping = eaxreg & 0xF; - CPUInfo.uiModel = (eaxreg >> 4) & 0xF; - CPUInfo.uiFamily = (eaxreg >> 8) & 0xF; - CPUInfo.uiType = (eaxreg >> 12) & 0x3; - - // To have complete information we also mask the brand id - CPUInfo.uiBrandID = ebxreg & 0xF; - - // Then we get the standard processor extensions - GetStandardProcessorExtensions(); - - // Now we mark everything we do not know as unknown - strcpy(strCPUName, "Unknown"); /*Flawfinder: ignore*/ - - strcpy(CPUInfo._Data.strTLB, "Unknown"); /*Flawfinder: ignore*/ - strcpy(CPUInfo._Instruction.strTLB, "Unknown"); /*Flawfinder: ignore*/ - - strcpy(CPUInfo._Trace.strCache, "Unknown"); /*Flawfinder: ignore*/ - strcpy(CPUInfo._L1.Data.strCache, "Unknown"); /*Flawfinder: ignore*/ - strcpy(CPUInfo._L1.Instruction.strCache, "Unknown"); /*Flawfinder: ignore*/ - strcpy(CPUInfo._L2.strCache, "Unknown"); /*Flawfinder: ignore*/ - strcpy(CPUInfo._L3.strCache, "Unknown"); /*Flawfinder: ignore*/ - - strcpy(CPUInfo.strProcessorSerial, "Unknown / Not supported"); /*Flawfinder: ignore*/ - - // For the family, model and brand id we can only print the numeric value - snprintf(CPUInfo.strBrandID, sizeof(CPUInfo.strBrandID), "Brand-ID number %d", CPUInfo.uiBrandID); /* Flawfinder: ignore */ - snprintf(CPUInfo.strFamily, sizeof(CPUInfo.strFamily), "Family number %d", CPUInfo.uiFamily); /* Flawfinder: ignore */ - snprintf(CPUInfo.strModel, sizeof(CPUInfo.strModel), "Model number %d", CPUInfo.uiModel); /* Flawfinder: ignore */ - - // And thats it - return true; -#else - return FALSE; -#endif -} -// bool CProcessor::CheckCPUIDPresence() -// ===================================== -// This function checks if the CPUID command is available on the current -// processor -//////////////////////////////////////////////////////////////////////// -bool CProcessor::CheckCPUIDPresence() -{ -#if LL_WINDOWS - unsigned long BitChanged; - - // We've to check if we can toggle the flag register bit 21 - // If we can't the processor does not support the CPUID command - __asm - { - pushfd - pop eax - mov ebx, eax - xor eax, 0x00200000 - push eax - popfd - pushfd - pop eax - xor eax,ebx - mov BitChanged, eax - } - - return ((BitChanged) ? true : false); -#else - return FALSE; -#endif -} + // *NOTE:Mani - I didn't find any docs that assure me that machdep.cpu.feature_bits will always be + // The feature bits I think it is. Here's a test: +#ifndef LL_RELEASE_FOR_DOWNLOAD + #if defined(__i386__) && defined(__PIC__) + /* %ebx may be the PIC register. */ + #define __cpuid(level, a, b, c, d) \ + __asm__ ("xchgl\t%%ebx, %1\n\t" \ + "cpuid\n\t" \ + "xchgl\t%%ebx, %1\n\t" \ + : "=a" (a), "=r" (b), "=c" (c), "=d" (d) \ + : "0" (level)) + #else + #define __cpuid(level, a, b, c, d) \ + __asm__ ("cpuid\n\t" \ + : "=a" (a), "=b" (b), "=c" (c), "=d" (d) \ + : "0" (level)) + #endif + + unsigned int eax, ebx, ecx, edx; + __cpuid(0x1, eax, ebx, ecx, edx); + if(feature_infos[0] != (S32)edx) + { + llerrs << "machdep.cpu.feature_bits doesn't match expected cpuid result!" << llendl; + } +#endif // LL_RELEASE_FOR_DOWNLOAD -// void CProcessor::DecodeProcessorConfiguration(unsigned int cfg) -// =============================================================== -// This function (or switch ?!) just translates a one-byte processor configuration -// byte to understandable values -////////////////////////////////////////////////////////////////////////////////// -void CProcessor::DecodeProcessorConfiguration(unsigned int cfg) -{ - // First we ensure that there's only one single byte - cfg &= 0xFF; - // Then we do a big switch - switch(cfg) - { - case 0: // cfg = 0: Unused - break; - case 0x1: // cfg = 0x1: code TLB present, 4 KB pages, 4 ways, 32 entries - CPUInfo._Instruction.bPresent = true; - strcpy(CPUInfo._Instruction.strPageSize, "4 KB"); /*Flawfinder: ignore*/ - CPUInfo._Instruction.uiAssociativeWays = 4; - CPUInfo._Instruction.uiEntries = 32; - break; - case 0x2: // cfg = 0x2: code TLB present, 4 MB pages, fully associative, 2 entries - CPUInfo._Instruction.bPresent = true; - strcpy(CPUInfo._Instruction.strPageSize, "4 MB"); /*Flawfinder: ignore*/ - CPUInfo._Instruction.uiAssociativeWays = 4; - CPUInfo._Instruction.uiEntries = 2; - break; - case 0x3: // cfg = 0x3: data TLB present, 4 KB pages, 4 ways, 64 entries - CPUInfo._Data.bPresent = true; - strcpy(CPUInfo._Data.strPageSize, "4 KB"); /*Flawfinder: ignore*/ - CPUInfo._Data.uiAssociativeWays = 4; - CPUInfo._Data.uiEntries = 64; - break; - case 0x4: // cfg = 0x4: data TLB present, 4 MB pages, 4 ways, 8 entries - CPUInfo._Data.bPresent = true; - strcpy(CPUInfo._Data.strPageSize, "4 MB"); /*Flawfinder: ignore*/ - CPUInfo._Data.uiAssociativeWays = 4; - CPUInfo._Data.uiEntries = 8; - break; - case 0x6: // cfg = 0x6: code L1 cache present, 8 KB, 4 ways, 32 byte lines - CPUInfo._L1.Instruction.bPresent = true; - strcpy(CPUInfo._L1.Instruction.strSize, "8 KB"); /*Flawfinder: ignore*/ - CPUInfo._L1.Instruction.uiAssociativeWays = 4; - CPUInfo._L1.Instruction.uiLineSize = 32; - break; - case 0x8: // cfg = 0x8: code L1 cache present, 16 KB, 4 ways, 32 byte lines - CPUInfo._L1.Instruction.bPresent = true; - strcpy(CPUInfo._L1.Instruction.strSize, "16 KB"); /*Flawfinder: ignore*/ - CPUInfo._L1.Instruction.uiAssociativeWays = 4; - CPUInfo._L1.Instruction.uiLineSize = 32; - break; - case 0xA: // cfg = 0xA: data L1 cache present, 8 KB, 2 ways, 32 byte lines - CPUInfo._L1.Data.bPresent = true; - strcpy(CPUInfo._L1.Data.strSize, "8 KB"); /*Flawfinder: ignore*/ - CPUInfo._L1.Data.uiAssociativeWays = 2; - CPUInfo._L1.Data.uiLineSize = 32; - break; - case 0xC: // cfg = 0xC: data L1 cache present, 16 KB, 4 ways, 32 byte lines - CPUInfo._L1.Data.bPresent = true; - strcpy(CPUInfo._L1.Data.strSize, "16 KB"); /*Flawfinder: ignore*/ - CPUInfo._L1.Data.uiAssociativeWays = 4; - CPUInfo._L1.Data.uiLineSize = 32; - break; - case 0x22: // cfg = 0x22: code and data L3 cache present, 512 KB, 4 ways, 64 byte lines, sectored - CPUInfo._L3.bPresent = true; - strcpy(CPUInfo._L3.strSize, "512 KB"); /*Flawfinder: ignore*/ - CPUInfo._L3.uiAssociativeWays = 4; - CPUInfo._L3.uiLineSize = 64; - CPUInfo._L3.bSectored = true; - break; - case 0x23: // cfg = 0x23: code and data L3 cache present, 1024 KB, 8 ways, 64 byte lines, sectored - CPUInfo._L3.bPresent = true; - strcpy(CPUInfo._L3.strSize, "1024 KB"); /*Flawfinder: ignore*/ - CPUInfo._L3.uiAssociativeWays = 8; - CPUInfo._L3.uiLineSize = 64; - CPUInfo._L3.bSectored = true; - break; - case 0x25: // cfg = 0x25: code and data L3 cache present, 2048 KB, 8 ways, 64 byte lines, sectored - CPUInfo._L3.bPresent = true; - strcpy(CPUInfo._L3.strSize, "2048 KB"); /*Flawfinder: ignore*/ - CPUInfo._L3.uiAssociativeWays = 8; - CPUInfo._L3.uiLineSize = 64; - CPUInfo._L3.bSectored = true; - break; - case 0x29: // cfg = 0x29: code and data L3 cache present, 4096 KB, 8 ways, 64 byte lines, sectored - CPUInfo._L3.bPresent = true; - strcpy(CPUInfo._L3.strSize, "4096 KB"); /*Flawfinder: ignore*/ - CPUInfo._L3.uiAssociativeWays = 8; - CPUInfo._L3.uiLineSize = 64; - CPUInfo._L3.bSectored = true; - break; - case 0x40: // cfg = 0x40: no integrated L2 cache (P6 core) or L3 cache (P4 core) - break; - case 0x41: // cfg = 0x41: code and data L2 cache present, 128 KB, 4 ways, 32 byte lines - CPUInfo._L2.bPresent = true; - strcpy(CPUInfo._L2.strSize, "128 KB"); /*Flawfinder: ignore*/ - CPUInfo._L2.uiAssociativeWays = 4; - CPUInfo._L2.uiLineSize = 32; - break; - case 0x42: // cfg = 0x42: code and data L2 cache present, 256 KB, 4 ways, 32 byte lines - CPUInfo._L2.bPresent = true; - strcpy(CPUInfo._L2.strSize, "256 KB"); /*Flawfinder: ignore*/ - CPUInfo._L2.uiAssociativeWays = 4; - CPUInfo._L2.uiLineSize = 32; - break; - case 0x43: // cfg = 0x43: code and data L2 cache present, 512 KB, 4 ways, 32 byte lines - CPUInfo._L2.bPresent = true; - strcpy(CPUInfo._L2.strSize, "512 KB"); /* Flawfinder: ignore */ - CPUInfo._L2.uiAssociativeWays = 4; - CPUInfo._L2.uiLineSize = 32; - break; - case 0x44: // cfg = 0x44: code and data L2 cache present, 1024 KB, 4 ways, 32 byte lines - CPUInfo._L2.bPresent = true; - strcpy(CPUInfo._L2.strSize, "1 MB"); /* Flawfinder: ignore */ - CPUInfo._L2.uiAssociativeWays = 4; - CPUInfo._L2.uiLineSize = 32; - break; - case 0x45: // cfg = 0x45: code and data L2 cache present, 2048 KB, 4 ways, 32 byte lines - CPUInfo._L2.bPresent = true; - strcpy(CPUInfo._L2.strSize, "2 MB"); /* Flawfinder: ignore */ - CPUInfo._L2.uiAssociativeWays = 4; - CPUInfo._L2.uiLineSize = 32; - break; - case 0x50: // cfg = 0x50: code TLB present, 4 KB / 4 MB / 2 MB pages, fully associative, 64 entries - CPUInfo._Instruction.bPresent = true; - strcpy(CPUInfo._Instruction.strPageSize, "4 KB / 2 MB / 4 MB"); /* Flawfinder: ignore */ - CPUInfo._Instruction.uiAssociativeWays = (unsigned int) -1; - CPUInfo._Instruction.uiEntries = 64; - break; - case 0x51: // cfg = 0x51: code TLB present, 4 KB / 4 MB / 2 MB pages, fully associative, 128 entries - CPUInfo._Instruction.bPresent = true; - strcpy(CPUInfo._Instruction.strPageSize, "4 KB / 2 MB / 4 MB"); /* Flawfinder: ignore */ - CPUInfo._Instruction.uiAssociativeWays = (unsigned int) -1; - CPUInfo._Instruction.uiEntries = 128; - break; - case 0x52: // cfg = 0x52: code TLB present, 4 KB / 4 MB / 2 MB pages, fully associative, 256 entries - CPUInfo._Instruction.bPresent = true; - strcpy(CPUInfo._Instruction.strPageSize, "4 KB / 2 MB / 4 MB"); /* Flawfinder: ignore */ - CPUInfo._Instruction.uiAssociativeWays = (unsigned int) -1; - CPUInfo._Instruction.uiEntries = 256; - break; - case 0x5B: // cfg = 0x5B: data TLB present, 4 KB / 4 MB pages, fully associative, 64 entries - CPUInfo._Data.bPresent = true; - strcpy(CPUInfo._Data.strPageSize, "4 KB / 4 MB"); /* Flawfinder: ignore */ - CPUInfo._Data.uiAssociativeWays = (unsigned int) -1; - CPUInfo._Data.uiEntries = 64; - break; - case 0x5C: // cfg = 0x5C: data TLB present, 4 KB / 4 MB pages, fully associative, 128 entries - CPUInfo._Data.bPresent = true; - strcpy(CPUInfo._Data.strPageSize, "4 KB / 4 MB"); /* Flawfinder: ignore */ - CPUInfo._Data.uiAssociativeWays = (unsigned int) -1; - CPUInfo._Data.uiEntries = 128; - break; - case 0x5d: // cfg = 0x5D: data TLB present, 4 KB / 4 MB pages, fully associative, 256 entries - CPUInfo._Data.bPresent = true; - strcpy(CPUInfo._Data.strPageSize, "4 KB / 4 MB"); /* Flawfinder: ignore */ - CPUInfo._Data.uiAssociativeWays = (unsigned int) -1; - CPUInfo._Data.uiEntries = 256; - break; - case 0x66: // cfg = 0x66: data L1 cache present, 8 KB, 4 ways, 64 byte lines, sectored - CPUInfo._L1.Data.bPresent = true; - strcpy(CPUInfo._L1.Data.strSize, "8 KB"); /* Flawfinder: ignore */ - CPUInfo._L1.Data.uiAssociativeWays = 4; - CPUInfo._L1.Data.uiLineSize = 64; - break; - case 0x67: // cfg = 0x67: data L1 cache present, 16 KB, 4 ways, 64 byte lines, sectored - CPUInfo._L1.Data.bPresent = true; - strcpy(CPUInfo._L1.Data.strSize, "16 KB"); /* Flawfinder: ignore */ - CPUInfo._L1.Data.uiAssociativeWays = 4; - CPUInfo._L1.Data.uiLineSize = 64; - break; - case 0x68: // cfg = 0x68: data L1 cache present, 32 KB, 4 ways, 64 byte lines, sectored - CPUInfo._L1.Data.bPresent = true; - strcpy(CPUInfo._L1.Data.strSize, "32 KB"); /* Flawfinder: ignore */ - CPUInfo._L1.Data.uiAssociativeWays = 4; - CPUInfo._L1.Data.uiLineSize = 64; - break; - case 0x70: // cfg = 0x70: trace L1 cache present, 12 KuOPs, 4 ways - CPUInfo._Trace.bPresent = true; - strcpy(CPUInfo._Trace.strSize, "12 K-micro-ops"); /* Flawfinder: ignore */ - CPUInfo._Trace.uiAssociativeWays = 4; - break; - case 0x71: // cfg = 0x71: trace L1 cache present, 16 KuOPs, 4 ways - CPUInfo._Trace.bPresent = true; - strcpy(CPUInfo._Trace.strSize, "16 K-micro-ops"); /* Flawfinder: ignore */ - CPUInfo._Trace.uiAssociativeWays = 4; - break; - case 0x72: // cfg = 0x72: trace L1 cache present, 32 KuOPs, 4 ways - CPUInfo._Trace.bPresent = true; - strcpy(CPUInfo._Trace.strSize, "32 K-micro-ops"); /* Flawfinder: ignore */ - CPUInfo._Trace.uiAssociativeWays = 4; - break; - case 0x79: // cfg = 0x79: code and data L2 cache present, 128 KB, 8 ways, 64 byte lines, sectored - CPUInfo._L2.bPresent = true; - strcpy(CPUInfo._L2.strSize, "128 KB"); /* Flawfinder: ignore */ - CPUInfo._L2.uiAssociativeWays = 8; - CPUInfo._L2.uiLineSize = 64; - CPUInfo._L2.bSectored = true; - break; - case 0x7A: // cfg = 0x7A: code and data L2 cache present, 256 KB, 8 ways, 64 byte lines, sectored - CPUInfo._L2.bPresent = true; - strcpy(CPUInfo._L2.strSize, "256 KB"); /* Flawfinder: ignore */ - CPUInfo._L2.uiAssociativeWays = 8; - CPUInfo._L2.uiLineSize = 64; - CPUInfo._L2.bSectored = true; - break; - case 0x7B: // cfg = 0x7B: code and data L2 cache present, 512 KB, 8 ways, 64 byte lines, sectored - CPUInfo._L2.bPresent = true; - strcpy(CPUInfo._L2.strSize, "512 KB"); /* Flawfinder: ignore */ - CPUInfo._L2.uiAssociativeWays = 8; - CPUInfo._L2.uiLineSize = 64; - CPUInfo._L2.bSectored = true; - break; - case 0x7C: // cfg = 0x7C: code and data L2 cache present, 1024 KB, 8 ways, 64 byte lines, sectored - CPUInfo._L2.bPresent = true; - strcpy(CPUInfo._L2.strSize, "1 MB"); /* Flawfinder: ignore */ - CPUInfo._L2.uiAssociativeWays = 8; - CPUInfo._L2.uiLineSize = 64; - CPUInfo._L2.bSectored = true; - break; - case 0x81: // cfg = 0x81: code and data L2 cache present, 128 KB, 8 ways, 32 byte lines - CPUInfo._L2.bPresent = true; - strcpy(CPUInfo._L2.strSize, "128 KB"); /* Flawfinder: ignore */ - CPUInfo._L2.uiAssociativeWays = 8; - CPUInfo._L2.uiLineSize = 32; - break; - case 0x82: // cfg = 0x82: code and data L2 cache present, 256 KB, 8 ways, 32 byte lines - CPUInfo._L2.bPresent = true; - strcpy(CPUInfo._L2.strSize, "256 KB"); /* Flawfinder: ignore */ - CPUInfo._L2.uiAssociativeWays = 8; - CPUInfo._L2.uiLineSize = 32; - break; - case 0x83: // cfg = 0x83: code and data L2 cache present, 512 KB, 8 ways, 32 byte lines - CPUInfo._L2.bPresent = true; - strcpy(CPUInfo._L2.strSize, "512 KB"); /* Flawfinder: ignore */ - CPUInfo._L2.uiAssociativeWays = 8; - CPUInfo._L2.uiLineSize = 32; - break; - case 0x84: // cfg = 0x84: code and data L2 cache present, 1024 KB, 8 ways, 32 byte lines - CPUInfo._L2.bPresent = true; - strcpy(CPUInfo._L2.strSize, "1 MB"); /* Flawfinder: ignore */ - CPUInfo._L2.uiAssociativeWays = 8; - CPUInfo._L2.uiLineSize = 32; - break; - case 0x85: // cfg = 0x85: code and data L2 cache present, 2048 KB, 8 ways, 32 byte lines - CPUInfo._L2.bPresent = true; - strcpy(CPUInfo._L2.strSize, "2 MB"); /* Flawfinder: ignore */ - CPUInfo._L2.uiAssociativeWays = 8; - CPUInfo._L2.uiLineSize = 32; - break; + uint64_t ext_feature_info = getSysctlInt64("machdep.cpu.extfeature_bits"); + S32 *ext_feature_infos = (S32*)(&ext_feature_info); + setConfig(eExtFeatureBits, ext_feature_infos[0]); } -} +}; -FORCEINLINE static char *TranslateAssociativeWays(unsigned int uiWays, char *buf) -{ - // We define 0xFFFFFFFF (= -1) as fully associative - if (uiWays == ((unsigned int) -1)) - strcpy(buf, "fully associative"); /* Flawfinder: ignore */ - else - { - if (uiWays == 1) // A one way associative cache is just direct mapped - strcpy(buf, "direct mapped"); /* Flawfinder: ignore */ - else if (uiWays == 0) // This should not happen... - strcpy(buf, "unknown associative ways"); /* Flawfinder: ignore */ - else // The x-way associative cache - sprintf(buf, "%d ways associative", uiWays); /* Flawfinder: ignore */ - } - // To ease the function use we return the buffer - return buf; -} -FORCEINLINE static void TranslateTLB(ProcessorTLB *tlb) -{ - char buf[64]; /* Flawfinder: ignore */ +#elif LL_LINUX +const char CPUINFO_FILE[] = "/proc/cpuinfo"; - // We just check if the TLB is present - if (tlb->bPresent) - snprintf(tlb->strTLB,sizeof(tlb->strTLB), "%s page size, %s, %d entries", tlb->strPageSize, TranslateAssociativeWays(tlb->uiAssociativeWays, buf), tlb->uiEntries); /* Flawfinder: ignore */ - else - strcpy(tlb->strTLB, "Not present"); /* Flawfinder: ignore */ -} -FORCEINLINE static void TranslateCache(ProcessorCache *cache) +class LLProcessorInfoLinuxImpl : public LLProcessorInfoImpl { - char buf[64]; /* Flawfinder: ignore */ - - // We just check if the cache is present - if (cache->bPresent) - { - // If present we construct the string - snprintf(cache->strCache, sizeof(cache->strCache), "%s cache size, %s, %d bytes line size", cache->strSize, TranslateAssociativeWays(cache->uiAssociativeWays, buf), cache->uiLineSize); /* Flawfinder: ignore */ - if (cache->bSectored) - strncat(cache->strCache, ", sectored", sizeof(cache->strCache)-strlen(cache->strCache)-1); /* Flawfinder: ignore */ - } - else +public: + LLProcessorInfoLinuxImpl() { - // Else we just say "Not present" - strcpy(cache->strCache, "Not present"); /* Flawfinder: ignore */ + get_proc_cpuinfo(); } -} -// void CProcessor::TranslateProcessorConfiguration() -// ================================================== -// Private class function to translate the processor configuration values -// to strings -///////////////////////////////////////////////////////////////////////// -void CProcessor::TranslateProcessorConfiguration() -{ - // We just call the small functions defined above - TranslateTLB(&CPUInfo._Data); - TranslateTLB(&CPUInfo._Instruction); - - TranslateCache(&CPUInfo._Trace); - - TranslateCache(&CPUInfo._L1.Instruction); - TranslateCache(&CPUInfo._L1.Data); - TranslateCache(&CPUInfo._L2); - TranslateCache(&CPUInfo._L3); -} - -// void CProcessor::GetStandardProcessorConfiguration() -// ==================================================== -// Private class function to read the standard processor configuration -////////////////////////////////////////////////////////////////////// -void CProcessor::GetStandardProcessorConfiguration() -{ -#if LL_WINDOWS - unsigned long eaxreg, ebxreg, ecxreg, edxreg; + virtual ~LLProcessorInfoLinuxImpl() {} +private: - // We check if the CPUID function is available - if (!CheckCPUIDPresence()) - return; - - // First we check if the processor supports the standard - // CPUID level 0x00000002 - if (CPUInfo.MaxSupportedLevel >= 2) + void get_proc_cpuinfo() { - // Now we go read the std. CPUID level 0x00000002 the first time - unsigned long count, num = 255; - for (count = 0; count < num; count++) + std::map< std::string, std::string > cpuinfo; + LLFILE* cpuinfo_fp = LLFile::fopen(CPUINFO_FILE, "rb"); + if(cpuinfo_fp) { - __asm - { - mov eax, 2 - cpuid - mov eaxreg, eax - mov ebxreg, ebx - mov ecxreg, ecx - mov edxreg, edx - } - // We have to repeat this reading for 'num' times - num = eaxreg & 0xFF; - - // Then we call the big decode switch function - DecodeProcessorConfiguration(eaxreg >> 8); - DecodeProcessorConfiguration(eaxreg >> 16); - DecodeProcessorConfiguration(eaxreg >> 24); - - // If ebx contains additional data we also decode it - if ((ebxreg & 0x80000000) == 0) - { - DecodeProcessorConfiguration(ebxreg); - DecodeProcessorConfiguration(ebxreg >> 8); - DecodeProcessorConfiguration(ebxreg >> 16); - DecodeProcessorConfiguration(ebxreg >> 24); - } - // And also the ecx register - if ((ecxreg & 0x80000000) == 0) + char line[MAX_STRING]; + memset(line, 0, MAX_STRING); + while(fgets(line, MAX_STRING, cpuinfo_fp)) { - DecodeProcessorConfiguration(ecxreg); - DecodeProcessorConfiguration(ecxreg >> 8); - DecodeProcessorConfiguration(ecxreg >> 16); - DecodeProcessorConfiguration(ecxreg >> 24); - } - // At last the edx processor register - if ((edxreg & 0x80000000) == 0) - { - DecodeProcessorConfiguration(edxreg); - DecodeProcessorConfiguration(edxreg >> 8); - DecodeProcessorConfiguration(edxreg >> 16); - DecodeProcessorConfiguration(edxreg >> 24); + // /proc/cpuinfo on Linux looks like: + // name\t*: value\n + char* tabspot = strchr( line, '\t' ); + if (tabspot == NULL) + continue; + char* colspot = strchr( tabspot, ':' ); + if (colspot == NULL) + continue; + char* spacespot = strchr( colspot, ' ' ); + if (spacespot == NULL) + continue; + char* nlspot = strchr( line, '\n' ); + if (nlspot == NULL) + nlspot = line + strlen( line ); // Fallback to terminating NUL + std::string linename( line, tabspot ); + std::string llinename(linename); + LLStringUtil::toLower(llinename); + std::string lineval( spacespot + 1, nlspot ); + cpuinfo[ llinename ] = lineval; } + fclose(cpuinfo_fp); + } +# if LL_X86 + +// *NOTE:Mani - eww, macros! srry. +#define LLPI_SET_INFO_STRING(llpi_id, cpuinfo_id) \ + if (!cpuinfo[cpuinfo_id].empty()) \ + { setInfo(llpi_id, cpuinfo[cpuinfo_id]);} + +#define LLPI_SET_INFO_INT(llpi_id, cpuinfo_id) \ + {\ + S32 result; \ + if (!cpuinfo[cpuinfo_id].empty() \ + && LLStringUtil::convertToS32(cpuinfo[cpuinfo_id], result)) \ + { setInfo(llpi_id, result);} \ + } + + F64 mhz; + if (LLStringUtil::convertToF64(cpuinfo["cpu mhz"], mhz) + && 200.0 < mhz && mhz < 10000.0) + { + setInfo(eFrequency,(F64)(mhz)); } - } -#endif -} -// void CProcessor::GetStandardProcessorExtensions() -// ================================================= -// Private class function to read the standard processor extensions -/////////////////////////////////////////////////////////////////// -void CProcessor::GetStandardProcessorExtensions() -{ -#if LL_WINDOWS - unsigned long ebxreg, edxreg; + LLPI_SET_INFO_STRING(eBrandName, "model name"); + LLPI_SET_INFO_STRING(eVendor, "vendor_id"); - // We check if the CPUID command is available - if (!CheckCPUIDPresence()) - return; - // We just get the standard CPUID level 0x00000001 which should be - // available on every x86 processor - __asm - { - mov eax, 1 - cpuid - mov ebxreg, ebx - mov edxreg, edx - } - - // Then we mask some bits - CPUInfo._Ext.FPU_FloatingPointUnit = CheckBit(edxreg, 0); - CPUInfo._Ext.VME_Virtual8086ModeEnhancements = CheckBit(edxreg, 1); - CPUInfo._Ext.DE_DebuggingExtensions = CheckBit(edxreg, 2); - CPUInfo._Ext.PSE_PageSizeExtensions = CheckBit(edxreg, 3); - CPUInfo._Ext.TSC_TimeStampCounter = CheckBit(edxreg, 4); - CPUInfo._Ext.MSR_ModelSpecificRegisters = CheckBit(edxreg, 5); - CPUInfo._Ext.PAE_PhysicalAddressExtension = CheckBit(edxreg, 6); - CPUInfo._Ext.MCE_MachineCheckException = CheckBit(edxreg, 7); - CPUInfo._Ext.CX8_COMPXCHG8B_Instruction = CheckBit(edxreg, 8); - CPUInfo._Ext.APIC_AdvancedProgrammableInterruptController = CheckBit(edxreg, 9); - CPUInfo._Ext.APIC_ID = (ebxreg >> 24) & 0xFF; - CPUInfo._Ext.SEP_FastSystemCall = CheckBit(edxreg, 11); - CPUInfo._Ext.MTRR_MemoryTypeRangeRegisters = CheckBit(edxreg, 12); - CPUInfo._Ext.PGE_PTE_GlobalFlag = CheckBit(edxreg, 13); - CPUInfo._Ext.MCA_MachineCheckArchitecture = CheckBit(edxreg, 14); - CPUInfo._Ext.CMOV_ConditionalMoveAndCompareInstructions = CheckBit(edxreg, 15); - CPUInfo._Ext.FGPAT_PageAttributeTable = CheckBit(edxreg, 16); - CPUInfo._Ext.PSE36_36bitPageSizeExtension = CheckBit(edxreg, 17); - CPUInfo._Ext.PN_ProcessorSerialNumber = CheckBit(edxreg, 18); - CPUInfo._Ext.CLFSH_CFLUSH_Instruction = CheckBit(edxreg, 19); - CPUInfo._Ext.CLFLUSH_InstructionCacheLineSize = (ebxreg >> 8) & 0xFF; - CPUInfo._Ext.DS_DebugStore = CheckBit(edxreg, 21); - CPUInfo._Ext.ACPI_ThermalMonitorAndClockControl = CheckBit(edxreg, 22); - CPUInfo._Ext.MMX_MultimediaExtensions = CheckBit(edxreg, 23); - CPUInfo._Ext.FXSR_FastStreamingSIMD_ExtensionsSaveRestore = CheckBit(edxreg, 24); - CPUInfo._Ext.SSE_StreamingSIMD_Extensions = CheckBit(edxreg, 25); - CPUInfo._Ext.SSE2_StreamingSIMD2_Extensions = CheckBit(edxreg, 26); - CPUInfo._Ext.Altivec_Extensions = false; - CPUInfo._Ext.SS_SelfSnoop = CheckBit(edxreg, 27); - CPUInfo._Ext.HT_HyperThreading = CheckBit(edxreg, 28); - CPUInfo._Ext.HT_HyterThreadingSiblings = (ebxreg >> 16) & 0xFF; - CPUInfo._Ext.TM_ThermalMonitor = CheckBit(edxreg, 29); - CPUInfo._Ext.IA64_Intel64BitArchitecture = CheckBit(edxreg, 30); -#endif -} + LLPI_SET_INFO_INT(eStepping, "stepping"); + LLPI_SET_INFO_INT(eModel, "model"); -// const ProcessorInfo *CProcessor::GetCPUInfo() -// ============================================= -// Calls all the other detection function to create an detailed -// processor information -/////////////////////////////////////////////////////////////// -const ProcessorInfo *CProcessor::GetCPUInfo() -{ -#if LL_WINDOWS - unsigned long eaxreg, ebxreg, ecxreg, edxreg; + + S32 family; + if (!cpuinfo["cpu family"].empty() + && LLStringUtil::convertToS32(cpuinfo["cpu family"], family)) + { + setInfo(eFamily, family); + } - // First of all we check if the CPUID command is available - if (!CheckCPUIDPresence()) - return NULL; + setInfo(eFamilyName, compute_CPUFamilyName(cpuinfo["vendor_id"].c_str(), family)); - // We read the standard CPUID level 0x00000000 which should - // be available on every x86 processor - __asm - { - mov eax, 0 - cpuid - mov eaxreg, eax - mov ebxreg, ebx - mov edxreg, edx - mov ecxreg, ecx - } - // Then we connect the single register values to the vendor string - *((unsigned long *) CPUInfo.strVendor) = ebxreg; - *((unsigned long *) (CPUInfo.strVendor+4)) = edxreg; - *((unsigned long *) (CPUInfo.strVendor+8)) = ecxreg; - // Null terminate for string comparisons below. - CPUInfo.strVendor[12] = 0; - - // We can also read the max. supported standard CPUID level - CPUInfo.MaxSupportedLevel = eaxreg & 0xFFFF; - - // Then we read the ext. CPUID level 0x80000000 - __asm - { - mov eax, 0x80000000 - cpuid - mov eaxreg, eax - } - // ...to check the max. supportted extended CPUID level - CPUInfo.MaxSupportedExtendedLevel = eaxreg; - - // Then we switch to the specific processor vendors - // See http://www.sandpile.org/ia32/cpuid.htm - if (!strcmp(CPUInfo.strVendor, "GenuineIntel")) - { - AnalyzeIntelProcessor(); - } - else if (!strcmp(CPUInfo.strVendor, "AuthenticAMD")) - { - AnalyzeAMDProcessor(); - } - else if (!strcmp(CPUInfo.strVendor, "UMC UMC UMC")) - { - AnalyzeUnknownProcessor(); - } - else if (!strcmp(CPUInfo.strVendor, "CyrixInstead")) - { - AnalyzeUnknownProcessor(); - } - else if (!strcmp(CPUInfo.strVendor, "NexGenDriven")) - { - AnalyzeUnknownProcessor(); - } - else if (!strcmp(CPUInfo.strVendor, "CentaurHauls")) - { - AnalyzeUnknownProcessor(); - } - else if (!strcmp(CPUInfo.strVendor, "RiseRiseRise")) - { - AnalyzeUnknownProcessor(); - } - else if (!strcmp(CPUInfo.strVendor, "SiS SiS SiS")) - { - AnalyzeUnknownProcessor(); - } - else if (!strcmp(CPUInfo.strVendor, "GenuineTMx86")) - { - // Transmeta - AnalyzeUnknownProcessor(); - } - else if (!strcmp(CPUInfo.strVendor, "Geode by NSC")) - { - AnalyzeUnknownProcessor(); - } - else - { - AnalyzeUnknownProcessor(); - } -#endif - // After all we return the class CPUInfo member var - return (&CPUInfo); -} - -#elif LL_SOLARIS -#include <kstat.h> + // setInfo(eExtendedModel, getSysctlInt("machdep.cpu.extmodel")); + // setInfo(eBrandID, getSysctlInt("machdep.cpu.brand")); + // setInfo(eType, 0); // ? where to find this? -#if defined(__i386) -#include <sys/auxv.h> -#endif - -// ====================== -// Class constructor: -///////////////////////// -CProcessor::CProcessor() -{ - uqwFrequency = 0; - strCPUName[0] = 0; - memset(&CPUInfo, 0, sizeof(CPUInfo)); -} - -// unsigned __int64 CProcessor::GetCPUFrequency(unsigned int uiMeasureMSecs) -// ========================================================================= -// Function to query the current CPU frequency -//////////////////////////////////////////////////////////////////////////// -F64 CProcessor::GetCPUFrequency(unsigned int /*uiMeasureMSecs*/) -{ - if(uqwFrequency == 0){ - GetCPUInfo(); - } - - return uqwFrequency; -} - -// const ProcessorInfo *CProcessor::GetCPUInfo() -// ============================================= -// Calls all the other detection function to create an detailed -// processor information -/////////////////////////////////////////////////////////////// -const ProcessorInfo *CProcessor::GetCPUInfo() -{ - // In Solaris the CPU info is in the kstats - // try "psrinfo" or "kstat cpu_info" to see all - // that's available - int ncpus=0, i; - kstat_ctl_t *kc; - kstat_t *ks; - kstat_named_t *ksinfo, *ksi; - kstat_t *CPU_stats_list; - - kc = kstat_open(); - - if((int)kc == -1){ - llwarns << "kstat_open(0 failed!" << llendl; - return (&CPUInfo); - } - - for (ks = kc->kc_chain; ks != NULL; ks = ks->ks_next) { - if (strncmp(ks->ks_module, "cpu_info", 8) == 0 && - strncmp(ks->ks_name, "cpu_info", 8) == 0) - ncpus++; - } - - if(ncpus < 1){ - llwarns << "No cpus found in kstats!" << llendl; - return (&CPUInfo); - } - - for (ks = kc->kc_chain; ks; ks = ks->ks_next) { - if (strncmp(ks->ks_module, "cpu_info", 8) == 0 - && strncmp(ks->ks_name, "cpu_info", 8) == 0 - && kstat_read(kc, ks, NULL) != -1){ - CPU_stats_list = ks; // only looking at the first CPU - - break; - } - } - - if(ncpus > 1) - snprintf(strCPUName, sizeof(strCPUName), "%d x ", ncpus); - - kstat_read(kc, CPU_stats_list, NULL); - ksinfo = (kstat_named_t *)CPU_stats_list->ks_data; - for(i=0; i < (int)(CPU_stats_list->ks_ndata); ++i){ // Walk the kstats for this cpu gathering what we need - ksi = ksinfo++; - if(!strcmp(ksi->name, "brand")){ - strncat(strCPUName, (char *)KSTAT_NAMED_STR_PTR(ksi), - sizeof(strCPUName)-strlen(strCPUName)-1); - strncat(CPUInfo.strFamily, (char *)KSTAT_NAMED_STR_PTR(ksi), - sizeof(CPUInfo.strFamily)-strlen(CPUInfo.strFamily)-1); - strncpy(CPUInfo.strBrandID, strCPUName,sizeof(CPUInfo.strBrandID)-1); - CPUInfo.strBrandID[sizeof(CPUInfo.strBrandID)-1]='\0'; - // DEBUG llinfos << "CPU brand: " << strCPUName << llendl; - continue; - } + //setConfig(eCLFLUSHCacheLineSize, ((cpu_info[1] >> 8) & 0xff) * 8); + //setConfig(eAPICPhysicalID, (cpu_info[1] >> 24) & 0xff); + //setConfig(eCacheLineSize, getSysctlInt("machdep.cpu.cache.linesize")); + //setConfig(eL2Associativity, getSysctlInt("machdep.cpu.cache.L2_associativity")); + //setConfig(eCacheSizeK, getSysctlInt("machdep.cpu.cache.size")); + + // Read extensions + std::string flags = " " + cpuinfo["flags"] + " "; + LLStringUtil::toLower(flags); - if(!strcmp(ksi->name, "clock_MHz")){ -#if defined(__sparc) - llinfos << "Raw kstat clock rate is: " << ksi->value.l << llendl; - uqwFrequency = (F64)(ksi->value.l * 1000000); -#else - uqwFrequency = (F64)(ksi->value.i64 * 1000000); -#endif - //DEBUG llinfos << "CPU frequency: " << uqwFrequency << llendl; - continue; + if( flags.find( " sse " ) != std::string::npos ) + { + setExtension(cpu_feature_names[eSSE_Ext]); } -#if defined(__i386) - if(!strcmp(ksi->name, "vendor_id")){ - strncpy(CPUInfo.strVendor, (char *)KSTAT_NAMED_STR_PTR(ksi), sizeof(CPUInfo.strVendor)-1); - // DEBUG llinfos << "CPU vendor: " << CPUInfo.strVendor << llendl; - continue; + if( flags.find( " sse2 " ) != std::string::npos ) + { + setExtension(cpu_feature_names[eSSE2_Ext]); } -#endif - } - - kstat_close(kc); - -#if defined(__sparc) // SPARC does not define a vendor string in kstat - strncpy(CPUInfo.strVendor, "Sun Microsystems, Inc.", sizeof(CPUInfo.strVendor)-1); -#endif - - // DEBUG llinfo << "The system has " << ncpus << " CPUs with a clock rate of " << uqwFrequency << "MHz." << llendl; - -#if defined (__i386) // we really don't care about the CPU extensions on SPARC but on x86... - - // Now get cpu extensions - - uint_t ui; - - (void) getisax(&ui, 1); - - if(ui & AV_386_FPU) - CPUInfo._Ext.FPU_FloatingPointUnit = true; - if(ui & AV_386_CX8) - CPUInfo._Ext.CX8_COMPXCHG8B_Instruction = true; - if(ui & AV_386_MMX) - CPUInfo._Ext.MMX_MultimediaExtensions = true; - if(ui & AV_386_AMD_MMX) - CPUInfo._Ext.MMX_MultimediaExtensions = true; - if(ui & AV_386_FXSR) - CPUInfo._Ext.FXSR_FastStreamingSIMD_ExtensionsSaveRestore = true; - if(ui & AV_386_SSE) - CPUInfo._Ext.SSE_StreamingSIMD_Extensions = true; - if(ui & AV_386_SSE2) - CPUInfo._Ext.SSE2_StreamingSIMD2_Extensions = true; -/* Left these here since they may get used later - if(ui & AV_386_SSE3) - CPUInfo._Ext.... = true; - if(ui & AV_386_AMD_3DNow) - CPUInfo._Ext.... = true; - if(ui & AV_386_AMD_3DNowx) - CPUInfo._Ext.... = true; -*/ -#endif - return (&CPUInfo); -} - -#else -// LL_DARWIN - -#include <mach/machine.h> -#include <sys/sysctl.h> - -static char *TranslateAssociativeWays(unsigned int uiWays, char *buf) -{ - // We define 0xFFFFFFFF (= -1) as fully associative - if (uiWays == ((unsigned int) -1)) - strcpy(buf, "fully associative"); /* Flawfinder: ignore */ - else - { - if (uiWays == 1) // A one way associative cache is just direct mapped - strcpy(buf, "direct mapped"); /* Flawfinder: ignore */ - else if (uiWays == 0) // This should not happen... - strcpy(buf, "unknown associative ways"); /* Flawfinder: ignore */ - else // The x-way associative cache - sprintf(buf, "%d ways associative", uiWays); /* Flawfinder: ignore */ - } - // To ease the function use we return the buffer - return buf; -} -static void TranslateTLB(ProcessorTLB *tlb) -{ - char buf[64]; /* Flawfinder: ignore */ - - // We just check if the TLB is present - if (tlb->bPresent) - snprintf(tlb->strTLB, sizeof(tlb->strTLB), "%s page size, %s, %d entries", tlb->strPageSize, TranslateAssociativeWays(tlb->uiAssociativeWays, buf), tlb->uiEntries); /* Flawfinder: ignore */ - else - strcpy(tlb->strTLB, "Not present"); /* Flawfinder: ignore */ -} -static void TranslateCache(ProcessorCache *cache) -{ - char buf[64]; /* Flawfinder: ignore */ - - // We just check if the cache is present - if (cache->bPresent) - { - // If present we construct the string - snprintf(cache->strCache,sizeof(cache->strCache), "%s cache size, %s, %d bytes line size", cache->strSize, TranslateAssociativeWays(cache->uiAssociativeWays, buf), cache->uiLineSize); /* Flawfinder: ignore */ - if (cache->bSectored) - strncat(cache->strCache, ", sectored", sizeof(cache->strCache)-strlen(cache->strCache)-1); /* Flawfinder: ignore */ - } - else - { - // Else we just say "Not present" - strcpy(cache->strCache, "Not present"); /* Flawfinder: ignore */ - } -} - -// void CProcessor::TranslateProcessorConfiguration() -// ================================================== -// Private class function to translate the processor configuration values -// to strings -///////////////////////////////////////////////////////////////////////// -void CProcessor::TranslateProcessorConfiguration() -{ - // We just call the small functions defined above - TranslateTLB(&CPUInfo._Data); - TranslateTLB(&CPUInfo._Instruction); - - TranslateCache(&CPUInfo._Trace); - - TranslateCache(&CPUInfo._L1.Instruction); - TranslateCache(&CPUInfo._L1.Data); - TranslateCache(&CPUInfo._L2); - TranslateCache(&CPUInfo._L3); -} - -// CProcessor::CProcessor -// ====================== -// Class constructor: -///////////////////////// -CProcessor::CProcessor() -{ - uqwFrequency = 0; - strCPUName[0] = 0; - memset(&CPUInfo, 0, sizeof(CPUInfo)); -} - -// unsigned __int64 CProcessor::GetCPUFrequency(unsigned int uiMeasureMSecs) -// ========================================================================= -// Function to query the current CPU frequency -//////////////////////////////////////////////////////////////////////////// -F64 CProcessor::GetCPUFrequency(unsigned int /*uiMeasureMSecs*/) -{ - U64 frequency = 0; - size_t len = sizeof(frequency); - - if(sysctlbyname("hw.cpufrequency", &frequency, &len, NULL, 0) == 0) - { - uqwFrequency = (F64)frequency; - } - - return uqwFrequency; -} - -static bool hasFeature(const char *name) -{ - bool result = false; - int val = 0; - size_t len = sizeof(val); - - if(sysctlbyname(name, &val, &len, NULL, 0) == 0) - { - if(val != 0) - result = true; - } - - return result; -} - -// const ProcessorInfo *CProcessor::GetCPUInfo() -// ============================================= -// Calls all the other detection function to create an detailed -// processor information -/////////////////////////////////////////////////////////////// -const ProcessorInfo *CProcessor::GetCPUInfo() -{ - int pagesize = 0; - int cachelinesize = 0; - int l1icachesize = 0; - int l1dcachesize = 0; - int l2settings = 0; - int l2cachesize = 0; - int l3settings = 0; - int l3cachesize = 0; - int ncpu = 0; - int cpusubtype = 0; - - // sysctl knows all. - int mib[2]; - size_t len; - mib[0] = CTL_HW; - - mib[1] = HW_PAGESIZE; - len = sizeof(pagesize); - sysctl(mib, 2, &pagesize, &len, NULL, 0); - - mib[1] = HW_CACHELINE; - len = sizeof(cachelinesize); - sysctl(mib, 2, &cachelinesize, &len, NULL, 0); - - mib[1] = HW_L1ICACHESIZE; - len = sizeof(l1icachesize); - sysctl(mib, 2, &l1icachesize, &len, NULL, 0); - mib[1] = HW_L1DCACHESIZE; - len = sizeof(l1dcachesize); - sysctl(mib, 2, &l1dcachesize, &len, NULL, 0); - - mib[1] = HW_L2SETTINGS; - len = sizeof(l2settings); - sysctl(mib, 2, &l2settings, &len, NULL, 0); - - mib[1] = HW_L2CACHESIZE; - len = sizeof(l2cachesize); - sysctl(mib, 2, &l2cachesize, &len, NULL, 0); - - mib[1] = HW_L3SETTINGS; - len = sizeof(l3settings); - sysctl(mib, 2, &l3settings, &len, NULL, 0); - - mib[1] = HW_L3CACHESIZE; - len = sizeof(l3cachesize); - sysctl(mib, 2, &l3cachesize, &len, NULL, 0); - - mib[1] = HW_NCPU; - len = sizeof(ncpu); - sysctl(mib, 2, &ncpu, &len, NULL, 0); - - sysctlbyname("hw.cpusubtype", &cpusubtype, &len, NULL, 0); - - strCPUName[0] = 0; - - if((ncpu == 0) || (ncpu == 1)) - { - // Uhhh... - } - else if(ncpu == 2) - { - strncat(strCPUName, "Dual ", sizeof(strCPUName)-strlen(strCPUName)-1); /* Flawfinder: ignore */ +# endif // LL_X86 } - else - { - snprintf(strCPUName, sizeof(strCPUName), "%d x ", ncpu); /* Flawfinder: ignore */ - } - -#if __ppc__ - switch(cpusubtype) - { - case CPU_SUBTYPE_POWERPC_601:// ((cpu_subtype_t) 1) - strncat(strCPUName, "PowerPC 601", sizeof(strCPUName)-strlen(strCPUName)-1); /* Flawfinder: ignore */ - strncat(CPUInfo.strFamily, "PowerPC", sizeof(CPUInfo.strFamily)-strlen(CPUInfo.strFamily)-1); /* Flawfinder: ignore */ - - break; - case CPU_SUBTYPE_POWERPC_602:// ((cpu_subtype_t) 2) - strncat(strCPUName, "PowerPC 602", sizeof(strCPUName)-strlen(strCPUName)-1); /* Flawfinder: ignore */ - strncat(CPUInfo.strFamily, "PowerPC", sizeof(CPUInfo.strFamily)-strlen(CPUInfo.strFamily)-1); /* Flawfinder: ignore */ - break; - case CPU_SUBTYPE_POWERPC_603:// ((cpu_subtype_t) 3) - strncat(strCPUName, "PowerPC 603", sizeof(strCPUName)-strlen(strCPUName)-1); /* Flawfinder: ignore */ - strncat(CPUInfo.strFamily, "PowerPC", sizeof(CPUInfo.strFamily)-strlen(CPUInfo.strFamily)-1); /* Flawfinder: ignore */ - break; - case CPU_SUBTYPE_POWERPC_603e:// ((cpu_subtype_t) 4) - strncat(strCPUName, "PowerPC 603e", sizeof(strCPUName)-strlen(strCPUName)-1); /* Flawfinder: ignore */ - strncat(CPUInfo.strFamily, "PowerPC", sizeof(CPUInfo.strFamily)-strlen(CPUInfo.strFamily)-1); /* Flawfinder: ignore */ - break; - case CPU_SUBTYPE_POWERPC_603ev:// ((cpu_subtype_t) 5) - strncat(strCPUName, "PowerPC 603ev", sizeof(strCPUName)-strlen(strCPUName)-1); /* Flawfinder: ignore */ - strncat(CPUInfo.strFamily, "PowerPC", sizeof(CPUInfo.strFamily)-strlen(CPUInfo.strFamily)-1); /* Flawfinder: ignore */ - break; - case CPU_SUBTYPE_POWERPC_604:// ((cpu_subtype_t) 6) - strncat(strCPUName, "PowerPC 604", sizeof(strCPUName)-strlen(strCPUName)-1); /* Flawfinder: ignore */ - strncat(CPUInfo.strFamily, "PowerPC", sizeof(CPUInfo.strFamily)-strlen(CPUInfo.strFamily)-1); /* Flawfinder: ignore */ - break; - case CPU_SUBTYPE_POWERPC_604e:// ((cpu_subtype_t) 7) - strncat(strCPUName, "PowerPC 604e", sizeof(strCPUName)-strlen(strCPUName)-1); /* Flawfinder: ignore */ - strncat(CPUInfo.strFamily, "PowerPC", sizeof(CPUInfo.strFamily)-strlen(CPUInfo.strFamily)-1); /* Flawfinder: ignore */ - break; - case CPU_SUBTYPE_POWERPC_620:// ((cpu_subtype_t) 8) - strncat(strCPUName, "PowerPC 620", sizeof(strCPUName)-strlen(strCPUName)-1); /* Flawfinder: ignore */ - strncat(CPUInfo.strFamily, "PowerPC", sizeof(CPUInfo.strFamily)-strlen(CPUInfo.strFamily)-1); /* Flawfinder: ignore */ - break; - case CPU_SUBTYPE_POWERPC_750:// ((cpu_subtype_t) 9) - strncat(strCPUName, "PowerPC 750", sizeof(strCPUName)-strlen(strCPUName)-1); /* Flawfinder: ignore */ - strncat(CPUInfo.strFamily, "PowerPC G3", sizeof(CPUInfo.strFamily)-strlen(CPUInfo.strFamily)-1); /* Flawfinder: ignore */ - break; - case CPU_SUBTYPE_POWERPC_7400:// ((cpu_subtype_t) 10) - strncat(strCPUName, "PowerPC 7400", sizeof(strCPUName)-strlen(strCPUName)-1); /* Flawfinder: ignore */ - strncat(CPUInfo.strFamily, "PowerPC G4", sizeof(CPUInfo.strFamily)-strlen(CPUInfo.strFamily)-1); /* Flawfinder: ignore */ - break; - case CPU_SUBTYPE_POWERPC_7450:// ((cpu_subtype_t) 11) - strncat(strCPUName, "PowerPC 7450", sizeof(strCPUName)-strlen(strCPUName)-1); /* Flawfinder: ignore */ - strncat(CPUInfo.strFamily, "PowerPC G4", sizeof(CPUInfo.strFamily)-strlen(CPUInfo.strFamily)-1); /* Flawfinder: ignore */ - break; - case CPU_SUBTYPE_POWERPC_970:// ((cpu_subtype_t) 100) - strncat(strCPUName, "PowerPC 970", sizeof(strCPUName)-strlen(strCPUName)-1); /* Flawfinder: ignore */ - strncat(CPUInfo.strFamily, "PowerPC G5", sizeof(CPUInfo.strFamily)-strlen(CPUInfo.strFamily)-1); /* Flawfinder: ignore */ - break; - - default: - strncat(strCPUName, "PowerPC (Unknown)", sizeof(strCPUName)-strlen(strCPUName)-1); /* Flawfinder: ignore */ - break; - } - - CPUInfo._Ext.EMMX_MultimediaExtensions = - CPUInfo._Ext.MMX_MultimediaExtensions = - CPUInfo._Ext.SSE_StreamingSIMD_Extensions = - CPUInfo._Ext.SSE2_StreamingSIMD2_Extensions = false; - CPUInfo._Ext.Altivec_Extensions = hasFeature("hw.optional.altivec"); - -#endif - -#if __i386__ - // MBW -- XXX -- TODO -- make this call AnalyzeIntelProcessor()? - switch(cpusubtype) + std::string getCPUFeatureDescription() const { - default: - strncat(strCPUName, "i386 (Unknown)", sizeof(strCPUName)-strlen(strCPUName)-1); /* Flawfinder: ignore */ - break; - } - - CPUInfo._Ext.EMMX_MultimediaExtensions = hasFeature("hw.optional.mmx"); // MBW -- XXX -- this may be wrong... - CPUInfo._Ext.MMX_MultimediaExtensions = hasFeature("hw.optional.mmx"); - CPUInfo._Ext.SSE_StreamingSIMD_Extensions = hasFeature("hw.optional.sse"); - CPUInfo._Ext.SSE2_StreamingSIMD2_Extensions = hasFeature("hw.optional.sse2"); - CPUInfo._Ext.Altivec_Extensions = false; - CPUInfo._Ext.AA64_AMD64BitArchitecture = hasFeature("hw.optional.x86_64"); + std::ostringstream s; -#endif - - // Terse CPU info uses this string... - strncpy(CPUInfo.strBrandID, strCPUName,sizeof(CPUInfo.strBrandID)-1); /* Flawfinder: ignore */ - CPUInfo.strBrandID[sizeof(CPUInfo.strBrandID)-1]='\0'; - - // Fun cache config stuff... - - if(l1dcachesize != 0) - { - CPUInfo._L1.Data.bPresent = true; - snprintf(CPUInfo._L1.Data.strSize, sizeof(CPUInfo._L1.Data.strSize), "%d KB", l1dcachesize / 1024); /* Flawfinder: ignore */ -// CPUInfo._L1.Data.uiAssociativeWays = ???; - CPUInfo._L1.Data.uiLineSize = cachelinesize; + // *NOTE:Mani - This is for linux only. + LLFILE* cpuinfo = LLFile::fopen(CPUINFO_FILE, "rb"); + if(cpuinfo) + { + char line[MAX_STRING]; + memset(line, 0, MAX_STRING); + while(fgets(line, MAX_STRING, cpuinfo)) + { + line[strlen(line)-1] = ' '; + s << line; + s << std::endl; + } + fclose(cpuinfo); + s << std::endl; + } + else + { + s << "Unable to collect processor information" << std::endl; + } + return s.str(); } + +}; - if(l1icachesize != 0) - { - CPUInfo._L1.Instruction.bPresent = true; - snprintf(CPUInfo._L1.Instruction.strSize, sizeof(CPUInfo._L1.Instruction.strSize), "%d KB", l1icachesize / 1024); /* Flawfinder: ignore */ -// CPUInfo._L1.Instruction.uiAssociativeWays = ???; - CPUInfo._L1.Instruction.uiLineSize = cachelinesize; - } - if(l2cachesize != 0) - { - CPUInfo._L2.bPresent = true; - snprintf(CPUInfo._L2.strSize, sizeof(CPUInfo._L2.strSize), "%d KB", l2cachesize / 1024); /* Flawfinder: ignore */ -// CPUInfo._L2.uiAssociativeWays = ???; - CPUInfo._L2.uiLineSize = cachelinesize; - } +#endif // LL_MSVC elif LL_DARWIN elif LL_LINUX - if(l3cachesize != 0) - { - CPUInfo._L2.bPresent = true; - snprintf(CPUInfo._L2.strSize, sizeof(CPUInfo._L2.strSize), "%d KB", l3cachesize / 1024); /* Flawfinder: ignore */ -// CPUInfo._L2.uiAssociativeWays = ???; - CPUInfo._L2.uiLineSize = cachelinesize; +////////////////////////////////////////////////////// +// Interface definition +LLProcessorInfo::LLProcessorInfo() : mImpl(NULL) +{ + // *NOTE:Mani - not thread safe. + if(!mImpl) + { +#ifdef LL_MSVC + static LLProcessorInfoWindowsImpl the_impl; + mImpl = &the_impl; +#elif LL_DARWIN + static LLProcessorInfoDarwinImpl the_impl; + mImpl = &the_impl; +#else + static LLProcessorInfoLinuxImpl the_impl; + mImpl = &the_impl; +#endif // LL_MSVC } - - CPUInfo._Ext.FPU_FloatingPointUnit = hasFeature("hw.optional.floatingpoint"); - -// printf("pagesize = 0x%x\n", pagesize); -// printf("cachelinesize = 0x%x\n", cachelinesize); -// printf("l1icachesize = 0x%x\n", l1icachesize); -// printf("l1dcachesize = 0x%x\n", l1dcachesize); -// printf("l2settings = 0x%x\n", l2settings); -// printf("l2cachesize = 0x%x\n", l2cachesize); -// printf("l3settings = 0x%x\n", l3settings); -// printf("l3cachesize = 0x%x\n", l3cachesize); - - // After reading we translate the configuration to strings - TranslateProcessorConfiguration(); - - // After all we return the class CPUInfo member var - return (&CPUInfo); } -#endif // LL_DARWIN -// bool CProcessor::CPUInfoToText(char *strBuffer, unsigned int uiMaxLen) -// ====================================================================== -// Gets the frequency and processor information and writes it to a string -///////////////////////////////////////////////////////////////////////// -bool CProcessor::CPUInfoToText(char *strBuffer, unsigned int uiMaxLen) -{ -#define LENCHECK len = (unsigned int) strlen(buf); if (len >= uiMaxLen) return false; strcpy(strBuffer, buf); strBuffer += len; /*Flawfinder: ignore*/ -#define COPYADD(str) strcpy(buf, str); LENCHECK; /* Flawfinder: ignore */ -#define FORMATADD(format, var) sprintf(buf, format, var); LENCHECK; /* Flawfinder: ignore */ -#define BOOLADD(str, boolvar) COPYADD(str); if (boolvar) { COPYADD(" Yes\n"); } else { COPYADD(" No\n"); } - - char buf[1024]; /* Flawfinder: ignore */ - unsigned int len; - - // First we have to get the frequency - GetCPUFrequency(50); - - // Then we get the processor information - GetCPUInfo(); - - // Now we construct the string (see the macros at function beginning) - strBuffer[0] = 0; - - COPYADD("// CPU General Information\n//////////////////////////\n"); - FORMATADD("Processor name: %s\n", strCPUName); - FORMATADD("Frequency: %.2f MHz\n\n", (float) uqwFrequency / 1000000.0f); - FORMATADD("Vendor: %s\n", CPUInfo.strVendor); - FORMATADD("Family: %s\n", CPUInfo.strFamily); - FORMATADD("Extended family: %d\n", CPUInfo.uiExtendedFamily); - FORMATADD("Model: %s\n", CPUInfo.strModel); - FORMATADD("Extended model: %d\n", CPUInfo.uiExtendedModel); - FORMATADD("Type: %s\n", CPUInfo.strType); - FORMATADD("Brand ID: %s\n", CPUInfo.strBrandID); - if (CPUInfo._Ext.PN_ProcessorSerialNumber) - { - FORMATADD("Processor Serial: %s\n", CPUInfo.strProcessorSerial); - } - else - { - COPYADD("Processor Serial: Disabled\n"); - } -#if !LL_SOLARIS // NOTE: Why bother printing all this when it's irrelavent - - COPYADD("\n\n// CPU Configuration\n////////////////////\n"); - FORMATADD("L1 instruction cache: %s\n", CPUInfo._L1.Instruction.strCache); - FORMATADD("L1 data cache: %s\n", CPUInfo._L1.Data.strCache); - FORMATADD("L2 cache: %s\n", CPUInfo._L2.strCache); - FORMATADD("L3 cache: %s\n", CPUInfo._L3.strCache); - FORMATADD("Trace cache: %s\n", CPUInfo._Trace.strCache); - FORMATADD("Instruction TLB: %s\n", CPUInfo._Instruction.strTLB); - FORMATADD("Data TLB: %s\n", CPUInfo._Data.strTLB); - FORMATADD("Max Supported CPUID-Level: 0x%08lX\n", CPUInfo.MaxSupportedLevel); - FORMATADD("Max Supported Ext. CPUID-Level: 0x%08lX\n", CPUInfo.MaxSupportedExtendedLevel); - - COPYADD("\n\n// CPU Extensions\n/////////////////\n"); - BOOLADD("AA64 AMD 64-bit Architecture: ", CPUInfo._Ext.AA64_AMD64BitArchitecture); - BOOLADD("ACPI Thermal Monitor And Clock Control: ", CPUInfo._Ext.ACPI_ThermalMonitorAndClockControl); - BOOLADD("APIC Advanced Programmable Interrupt Controller: ", CPUInfo._Ext.APIC_AdvancedProgrammableInterruptController); - FORMATADD(" APIC-ID: %d\n", CPUInfo._Ext.APIC_ID); - BOOLADD("CLFSH CLFLUSH Instruction Presence: ", CPUInfo._Ext.CLFSH_CFLUSH_Instruction); - FORMATADD(" CLFLUSH Instruction Cache Line Size: %d\n", CPUInfo._Ext.CLFLUSH_InstructionCacheLineSize); - BOOLADD("CMOV Conditional Move And Compare Instructions: ", CPUInfo._Ext.CMOV_ConditionalMoveAndCompareInstructions); - BOOLADD("CX8 COMPXCHG8B Instruction: ", CPUInfo._Ext.CX8_COMPXCHG8B_Instruction); - BOOLADD("DE Debugging Extensions: ", CPUInfo._Ext.DE_DebuggingExtensions); - BOOLADD("DS Debug Store: ", CPUInfo._Ext.DS_DebugStore); - BOOLADD("FGPAT Page Attribute Table: ", CPUInfo._Ext.FGPAT_PageAttributeTable); - BOOLADD("FPU Floating Point Unit: ", CPUInfo._Ext.FPU_FloatingPointUnit); - BOOLADD("FXSR Fast Streaming SIMD Extensions Save/Restore:", CPUInfo._Ext.FXSR_FastStreamingSIMD_ExtensionsSaveRestore); - BOOLADD("HT Hyper Threading: ", CPUInfo._Ext.HT_HyperThreading); - BOOLADD("IA64 Intel 64-Bit Architecture: ", CPUInfo._Ext.IA64_Intel64BitArchitecture); - BOOLADD("MCA Machine Check Architecture: ", CPUInfo._Ext.MCA_MachineCheckArchitecture); - BOOLADD("MCE Machine Check Exception: ", CPUInfo._Ext.MCE_MachineCheckException); - BOOLADD("MMX Multimedia Extensions: ", CPUInfo._Ext.MMX_MultimediaExtensions); - BOOLADD("MMX+ Multimedia Extensions: ", CPUInfo._Ext.EMMX_MultimediaExtensions); - BOOLADD("MSR Model Specific Registers: ", CPUInfo._Ext.MSR_ModelSpecificRegisters); - BOOLADD("MTRR Memory Type Range Registers: ", CPUInfo._Ext.MTRR_MemoryTypeRangeRegisters); - BOOLADD("PAE Physical Address Extension: ", CPUInfo._Ext.PAE_PhysicalAddressExtension); - BOOLADD("PGE PTE Global Flag: ", CPUInfo._Ext.PGE_PTE_GlobalFlag); - if (CPUInfo._Ext.PN_ProcessorSerialNumber) - { - FORMATADD("PN Processor Serial Number: %s\n", CPUInfo.strProcessorSerial); - } - else - { - COPYADD("PN Processor Serial Number: Disabled\n"); - } - BOOLADD("PSE Page Size Extensions: ", CPUInfo._Ext.PSE_PageSizeExtensions); - BOOLADD("PSE36 36-bit Page Size Extension: ", CPUInfo._Ext.PSE36_36bitPageSizeExtension); - BOOLADD("SEP Fast System Call: ", CPUInfo._Ext.SEP_FastSystemCall); - BOOLADD("SS Self Snoop: ", CPUInfo._Ext.SS_SelfSnoop); - BOOLADD("SSE Streaming SIMD Extensions: ", CPUInfo._Ext.SSE_StreamingSIMD_Extensions); - BOOLADD("SSE2 Streaming SIMD 2 Extensions: ", CPUInfo._Ext.SSE2_StreamingSIMD2_Extensions); - BOOLADD("ALTVEC Altivec Extensions: ", CPUInfo._Ext.Altivec_Extensions); - BOOLADD("TM Thermal Monitor: ", CPUInfo._Ext.TM_ThermalMonitor); - BOOLADD("TSC Time Stamp Counter: ", CPUInfo._Ext.TSC_TimeStampCounter); - BOOLADD("VME Virtual 8086 Mode Enhancements: ", CPUInfo._Ext.VME_Virtual8086ModeEnhancements); - BOOLADD("3DNow! Instructions: ", CPUInfo._Ext._3DNOW_InstructionExtensions); - BOOLADD("Enhanced 3DNow! Instructions: ", CPUInfo._Ext._E3DNOW_InstructionExtensions); -#endif - // Yippie!!! - return true; -} +LLProcessorInfo::~LLProcessorInfo() {} +F64 LLProcessorInfo::getCPUFrequency() const { return mImpl->getCPUFrequency(); } +bool LLProcessorInfo::hasSSE() const { return mImpl->hasSSE(); } +bool LLProcessorInfo::hasSSE2() const { return mImpl->hasSSE2(); } +bool LLProcessorInfo::hasAltivec() const { return mImpl->hasAltivec(); } +std::string LLProcessorInfo::getCPUFamilyName() const { return mImpl->getCPUFamilyName(); } +std::string LLProcessorInfo::getCPUBrandName() const { return mImpl->getCPUBrandName(); } +std::string LLProcessorInfo::getCPUFeatureDescription() const { return mImpl->getCPUFeatureDescription(); } -// bool CProcessor::WriteInfoTextFile(const std::string& strFilename) -// =========================================================== -// Takes use of CProcessor::CPUInfoToText and saves the string to a -// file -/////////////////////////////////////////////////////////////////// -bool CProcessor::WriteInfoTextFile(const std::string& strFilename) -{ - char buf[16384]; /* Flawfinder: ignore */ - - // First we get the string - if (!CPUInfoToText(buf, 16383)) - return false; - - // Then we create a new file (CREATE_ALWAYS) - LLFILE *file = LLFile::fopen(strFilename, "w"); /* Flawfinder: ignore */ - if (!file) - return false; - - // After that we write the string to the file - unsigned long dwBytesToWrite, dwBytesWritten; - dwBytesToWrite = (unsigned long) strlen(buf); /*Flawfinder: ignore*/ - dwBytesWritten = (unsigned long) fwrite(buf, 1, dwBytesToWrite, file); - fclose(file); - if (dwBytesToWrite != dwBytesWritten) - return false; - - // Done - return true; -} diff --git a/indra/llcommon/llprocessor.h b/indra/llcommon/llprocessor.h index 746d007a7f..fc2c8dacfb 100644 --- a/indra/llcommon/llprocessor.h +++ b/indra/llcommon/llprocessor.h @@ -30,167 +30,26 @@ * $/LicenseInfo$ */ -// Author: Benjamin Jurke -// File history: 27.02.2002 File created. -/////////////////////////////////////////// - #ifndef LLPROCESSOR_H #define LLPROCESSOR_H +class LLProcessorInfoImpl; -// Options: -/////////// -#if LL_WINDOWS -#define PROCESSOR_FREQUENCY_MEASURE_AVAILABLE -#endif - -#if LL_MSVC && _M_X64 -# define LL_X86_64 1 -# define LL_X86 1 -#elif LL_MSVC && _M_IX86 -# define LL_X86 1 -#elif LL_GNUC && ( defined(__amd64__) || defined(__x86_64__) ) -# define LL_X86_64 1 -# define LL_X86 1 -#elif LL_GNUC && ( defined(__i386__) ) -# define LL_X86 1 -#elif LL_GNUC && ( defined(__powerpc__) || defined(__ppc__) ) -# define LL_PPC 1 -#endif - - -struct ProcessorExtensions -{ - bool FPU_FloatingPointUnit; - bool VME_Virtual8086ModeEnhancements; - bool DE_DebuggingExtensions; - bool PSE_PageSizeExtensions; - bool TSC_TimeStampCounter; - bool MSR_ModelSpecificRegisters; - bool PAE_PhysicalAddressExtension; - bool MCE_MachineCheckException; - bool CX8_COMPXCHG8B_Instruction; - bool APIC_AdvancedProgrammableInterruptController; - unsigned int APIC_ID; - bool SEP_FastSystemCall; - bool MTRR_MemoryTypeRangeRegisters; - bool PGE_PTE_GlobalFlag; - bool MCA_MachineCheckArchitecture; - bool CMOV_ConditionalMoveAndCompareInstructions; - bool FGPAT_PageAttributeTable; - bool PSE36_36bitPageSizeExtension; - bool PN_ProcessorSerialNumber; - bool CLFSH_CFLUSH_Instruction; - unsigned int CLFLUSH_InstructionCacheLineSize; - bool DS_DebugStore; - bool ACPI_ThermalMonitorAndClockControl; - bool EMMX_MultimediaExtensions; - bool MMX_MultimediaExtensions; - bool FXSR_FastStreamingSIMD_ExtensionsSaveRestore; - bool SSE_StreamingSIMD_Extensions; - bool SSE2_StreamingSIMD2_Extensions; - bool Altivec_Extensions; - bool SS_SelfSnoop; - bool HT_HyperThreading; - unsigned int HT_HyterThreadingSiblings; - bool TM_ThermalMonitor; - bool IA64_Intel64BitArchitecture; - bool _3DNOW_InstructionExtensions; - bool _E3DNOW_InstructionExtensions; - bool AA64_AMD64BitArchitecture; -}; - -struct ProcessorCache -{ - bool bPresent; - char strSize[32]; /* Flawfinder: ignore */ - unsigned int uiAssociativeWays; - unsigned int uiLineSize; - bool bSectored; - char strCache[128]; /* Flawfinder: ignore */ -}; - -struct ProcessorL1Cache -{ - ProcessorCache Instruction; - ProcessorCache Data; -}; - -struct ProcessorTLB +class LL_COMMON_API LLProcessorInfo { - bool bPresent; - char strPageSize[32]; /* Flawfinder: ignore */ - unsigned int uiAssociativeWays; - unsigned int uiEntries; - char strTLB[128]; /* Flawfinder: ignore */ -}; - -struct ProcessorInfo -{ - char strVendor[16]; /* Flawfinder: ignore */ - unsigned int uiFamily; - unsigned int uiExtendedFamily; - char strFamily[64]; /* Flawfinder: ignore */ - unsigned int uiModel; - unsigned int uiExtendedModel; - char strModel[128]; /* Flawfinder: ignore */ - unsigned int uiStepping; - unsigned int uiType; - char strType[64]; /* Flawfinder: ignore */ - unsigned int uiBrandID; - char strBrandID[64]; /* Flawfinder: ignore */ - char strProcessorSerial[64]; /* Flawfinder: ignore */ - unsigned long MaxSupportedLevel; - unsigned long MaxSupportedExtendedLevel; - ProcessorExtensions _Ext; - ProcessorL1Cache _L1; - ProcessorCache _L2; - ProcessorCache _L3; - ProcessorCache _Trace; - ProcessorTLB _Instruction; - ProcessorTLB _Data; -}; - - -// CProcessor -// ========== -// Class for detecting the processor name, type and available -// extensions as long as it's speed. -///////////////////////////////////////////////////////////// -class CProcessor -{ -// Constructor / Destructor: -//////////////////////////// public: - CProcessor(); - -// Private vars: -//////////////// -public: - F64 uqwFrequency; - char strCPUName[128]; /* Flawfinder: ignore */ - ProcessorInfo CPUInfo; - -// Private functions: -///////////////////// + LLProcessorInfo(); + ~LLProcessorInfo(); + + F64 getCPUFrequency() const; + bool hasSSE() const; + bool hasSSE2() const; + bool hasAltivec() const; + std::string getCPUFamilyName() const; + std::string getCPUBrandName() const; + std::string getCPUFeatureDescription() const; private: - bool AnalyzeIntelProcessor(); - bool AnalyzeAMDProcessor(); - bool AnalyzeUnknownProcessor(); - bool CheckCPUIDPresence(); - void DecodeProcessorConfiguration(unsigned int cfg); - void TranslateProcessorConfiguration(); - void GetStandardProcessorConfiguration(); - void GetStandardProcessorExtensions(); - -// Public functions: -//////////////////// -public: - F64 GetCPUFrequency(unsigned int uiMeasureMSecs); - const ProcessorInfo *GetCPUInfo(); - bool CPUInfoToText(char *strBuffer, unsigned int uiMaxLen); - bool WriteInfoTextFile(const std::string& strFilename); + LLProcessorInfoImpl* mImpl; }; - -#endif +#endif // LLPROCESSOR_H diff --git a/indra/llcommon/llqueuedthread.cpp b/indra/llcommon/llqueuedthread.cpp index 06ceeb2bc3..809a626c93 100644 --- a/indra/llcommon/llqueuedthread.cpp +++ b/indra/llcommon/llqueuedthread.cpp @@ -133,8 +133,11 @@ S32 LLQueuedThread::updateQueue(U32 max_time_ms) if (mThreaded) { pending = getPending(); + if(pending > 0) + { unpause(); } + } else { while (pending > 0) @@ -459,7 +462,7 @@ S32 LLQueuedThread::processNextRequest() req->setStatus(STATUS_QUEUED); mRequestQueue.insert(req); unlockData(); - if (mThreaded && start_priority <= PRIORITY_LOW) + if (mThreaded && start_priority < PRIORITY_NORMAL) { ms_sleep(1); // sleep the thread a little } diff --git a/indra/llcommon/llsdserialize_xml.cpp b/indra/llcommon/llsdserialize_xml.cpp index 7e1c2e35e0..fca173df47 100644 --- a/indra/llcommon/llsdserialize_xml.cpp +++ b/indra/llcommon/llsdserialize_xml.cpp @@ -139,12 +139,8 @@ S32 LLSDXMLFormatter::format_impl(const LLSD& data, std::ostream& ostr, U32 opti case LLSD::TypeBoolean: ostr << pre << "<boolean>"; if(mBoolAlpha || -#if( LL_WINDOWS || __GNUC__ > 2) (ostr.flags() & std::ios::boolalpha) -#else - (ostr.flags() & 0x0100) -#endif - ) + ) { ostr << (data.asBoolean() ? "true" : "false"); } @@ -511,12 +507,7 @@ void LLSDXMLParser::Impl::reset() mSkipping = false; -#if( LL_WINDOWS || __GNUC__ > 2) mCurrentKey.clear(); -#else - mCurrentKey = std::string(); -#endif - XML_ParserReset(mParser, "utf-8"); XML_SetUserData(mParser, this); @@ -644,11 +635,7 @@ void LLSDXMLParser::Impl::startElementHandler(const XML_Char* name, const XML_Ch LLSD& newElement = map[mCurrentKey]; mStack.push_back(&newElement); -#if( LL_WINDOWS || __GNUC__ > 2) mCurrentKey.clear(); -#else - mCurrentKey = std::string(); -#endif } else if (mStack.back()->isArray()) { diff --git a/indra/llcommon/llstring.cpp b/indra/llcommon/llstring.cpp index 5f3d9d6582..f14d947734 100644 --- a/indra/llcommon/llstring.cpp +++ b/indra/llcommon/llstring.cpp @@ -676,6 +676,17 @@ long LLStringOps::sLocalTimeOffset = 0; bool LLStringOps::sPacificDaylightTime = 0; std::map<std::string, std::string> LLStringOps::datetimeToCodes; +std::vector<std::string> LLStringOps::sWeekDayList; +std::vector<std::string> LLStringOps::sWeekDayShortList; +std::vector<std::string> LLStringOps::sMonthList; +std::vector<std::string> LLStringOps::sMonthShortList; + + +std::string LLStringOps::sDayFormat; +std::string LLStringOps::sAM; +std::string LLStringOps::sPM; + + S32 LLStringOps::collate(const llwchar* a, const llwchar* b) { #if LL_WINDOWS @@ -724,6 +735,50 @@ void LLStringOps::setupDatetimeInfo (bool daylight) datetimeToCodes["timezone"] = "%Z"; // PST } +void tokenizeStringToArray(const std::string& data, std::vector<std::string>& output) +{ + output.clear(); + size_t length = data.size(); + + // tokenize it and put it in the array + std::string cur_word; + for(size_t i = 0; i < length; ++i) + { + if(data[i] == ':') + { + output.push_back(cur_word); + cur_word.clear(); + } + else + { + cur_word.append(1, data[i]); + } + } + output.push_back(cur_word); +} + +void LLStringOps::setupWeekDaysNames(const std::string& data) +{ + tokenizeStringToArray(data,sWeekDayList); +} +void LLStringOps::setupWeekDaysShortNames(const std::string& data) +{ + tokenizeStringToArray(data,sWeekDayShortList); +} +void LLStringOps::setupMonthNames(const std::string& data) +{ + tokenizeStringToArray(data,sMonthList); +} +void LLStringOps::setupMonthShortNames(const std::string& data) +{ + tokenizeStringToArray(data,sMonthShortList); +} +void LLStringOps::setupDayFormat(const std::string& data) +{ + sDayFormat = data; +} + + std::string LLStringOps::getDatetimeCode (std::string key) { std::map<std::string, std::string>::iterator iter; @@ -819,6 +874,10 @@ namespace LLStringFn //////////////////////////////////////////////////////////// +// Forward specialization of LLStringUtil::format before use in LLStringUtil::formatDatetime. +template<> +S32 LLStringUtil::format(std::string& s, const format_map_t& substitutions); + //static template<> void LLStringUtil::getTokens(const std::string& instr, std::vector<std::string >& tokens, const std::string& delims) @@ -911,6 +970,20 @@ bool LLStringUtil::simpleReplacement(std::string &replacement, std::string token return false; } +//static +template<> +void LLStringUtil::setLocale(std::string inLocale) +{ + sLocale = inLocale; +}; + +//static +template<> +std::string LLStringUtil::getLocale(void) +{ + return sLocale; +}; + // static template<> void LLStringUtil::formatNumber(std::string& numStr, std::string decimals) @@ -984,7 +1057,53 @@ bool LLStringUtil::formatDatetime(std::string& replacement, std::string token, } return true; } - replacement = datetime.toHTTPDateString(code); + + //EXT-7013 + //few codes are not suppotred by strtime function (example - weekdays for Japanise) + //so use predefined ones + + //if sWeekDayList is not empty than current locale doesn't support + //weekday name. + time_t loc_seconds = (time_t) secFromEpoch; + if(LLStringOps::sWeekDayList.size() == 7 && code == "%A") + { + struct tm * gmt = gmtime (&loc_seconds); + replacement = LLStringOps::sWeekDayList[gmt->tm_wday]; + } + else if(LLStringOps::sWeekDayShortList.size() == 7 && code == "%a") + { + struct tm * gmt = gmtime (&loc_seconds); + replacement = LLStringOps::sWeekDayShortList[gmt->tm_wday]; + } + else if(LLStringOps::sMonthList.size() == 12 && code == "%B") + { + struct tm * gmt = gmtime (&loc_seconds); + replacement = LLStringOps::sWeekDayList[gmt->tm_mon]; + } + else if( !LLStringOps::sDayFormat.empty() && code == "%d" ) + { + struct tm * gmt = gmtime (&loc_seconds); + LLStringUtil::format_map_t args; + args["[MDAY]"] = llformat ("%d", gmt->tm_mday); + replacement = LLStringOps::sDayFormat; + LLStringUtil::format(replacement, args); + } + else if( !LLStringOps::sAM.empty() && !LLStringOps::sPM.empty() && code == "%p" ) + { + struct tm * gmt = gmtime (&loc_seconds); + if(gmt->tm_hour<12) + { + replacement = LLStringOps::sAM; + } + else + { + replacement = LLStringOps::sPM; + } + } + else + { + replacement = datetime.toHTTPDateString(code); + } // *HACK: delete leading zero from hour string in case 'hour12' (code = %I) time format // to show time without leading zero, e.g. 08:16 -> 8:16 (EXT-2738). diff --git a/indra/llcommon/llstring.h b/indra/llcommon/llstring.h index 62cedcde4e..8071c8aa2d 100644 --- a/indra/llcommon/llstring.h +++ b/indra/llcommon/llstring.h @@ -154,9 +154,19 @@ private: static long sPacificTimeOffset; static long sLocalTimeOffset; static bool sPacificDaylightTime; + static std::map<std::string, std::string> datetimeToCodes; public: + static std::vector<std::string> sWeekDayList; + static std::vector<std::string> sWeekDayShortList; + static std::vector<std::string> sMonthList; + static std::vector<std::string> sMonthShortList; + static std::string sDayFormat; + + static std::string sAM; + static std::string sPM; + static char toUpper(char elem) { return toupper((unsigned char)elem); } static llwchar toUpper(llwchar elem) { return towupper(elem); } @@ -185,6 +195,14 @@ public: static S32 collate(const llwchar* a, const llwchar* b); static void setupDatetimeInfo(bool pacific_daylight_time); + + static void setupWeekDaysNames(const std::string& data); + static void setupWeekDaysShortNames(const std::string& data); + static void setupMonthNames(const std::string& data); + static void setupMonthShortNames(const std::string& data); + static void setupDayFormat(const std::string& data); + + static long getPacificTimeOffset(void) { return sPacificTimeOffset;} static long getLocalTimeOffset(void) { return sLocalTimeOffset;} // Is the Pacific time zone (aka server time zone) @@ -231,7 +249,7 @@ public: ///////////////////////////////////////////////////////////////////////////////////////// // Static Utility functions that operate on std::strings - static std::basic_string<T> null; + static const std::basic_string<T> null; typedef std::map<LLFormatMapString, LLFormatMapString> format_map_t; LL_COMMON_API static void getTokens(const std::basic_string<T>& instr, std::vector<std::basic_string<T> >& tokens, const std::basic_string<T>& delims); @@ -241,8 +259,8 @@ public: LL_COMMON_API static S32 format(std::basic_string<T>& s, const LLSD& substitutions); LL_COMMON_API static bool simpleReplacement(std::basic_string<T>& replacement, std::basic_string<T> token, const format_map_t& substitutions); LL_COMMON_API static bool simpleReplacement(std::basic_string<T>& replacement, std::basic_string<T> token, const LLSD& substitutions); - static void setLocale (std::string inLocale) {sLocale = inLocale;}; - static std::string getLocale (void) {return sLocale;}; + LL_COMMON_API static void setLocale (std::string inLocale); + LL_COMMON_API static std::string getLocale (void); static bool isValidIndex(const std::basic_string<T>& string, size_type i) { @@ -353,7 +371,7 @@ private: LL_COMMON_API static size_type getSubstitution(const std::basic_string<T>& instr, size_type& start, std::vector<std::basic_string<T> >& tokens); }; -template<class T> std::basic_string<T> LLStringUtilBase<T>::null; +template<class T> const std::basic_string<T> LLStringUtilBase<T>::null; template<class T> std::string LLStringUtilBase<T>::sLocale; typedef LLStringUtilBase<char> LLStringUtil; diff --git a/indra/llcommon/llsys.cpp b/indra/llcommon/llsys.cpp index 0272c55db2..d41d0c8a3f 100644 --- a/indra/llcommon/llsys.cpp +++ b/indra/llcommon/llsys.cpp @@ -58,7 +58,6 @@ # include <unistd.h> # include <sys/sysinfo.h> const char MEMINFO_FILE[] = "/proc/meminfo"; -const char CPUINFO_FILE[] = "/proc/cpuinfo"; #elif LL_SOLARIS # include <stdio.h> # include <unistd.h> @@ -513,71 +512,21 @@ U32 LLOSInfo::getProcessResidentSizeKB() LLCPUInfo::LLCPUInfo() { std::ostringstream out; - CProcessor proc; - const ProcessorInfo* info = proc.GetCPUInfo(); + LLProcessorInfo proc; // proc.WriteInfoTextFile("procInfo.txt"); - mHasSSE = info->_Ext.SSE_StreamingSIMD_Extensions; - mHasSSE2 = info->_Ext.SSE2_StreamingSIMD2_Extensions; - mHasAltivec = info->_Ext.Altivec_Extensions; - mCPUMhz = (S32)(proc.GetCPUFrequency(50)/1000000.0); - mFamily.assign( info->strFamily ); + mHasSSE = proc.hasSSE(); + mHasSSE2 = proc.hasSSE2(); + mHasAltivec = proc.hasAltivec(); + mCPUMHz = (F64)proc.getCPUFrequency(); + mFamily = proc.getCPUFamilyName(); mCPUString = "Unknown"; -#if LL_WINDOWS || LL_DARWIN || LL_SOLARIS - out << proc.strCPUName; - if (200 < mCPUMhz && mCPUMhz < 10000) // *NOTE: cpu speed is often way wrong, do a sanity check + out << proc.getCPUBrandName(); + if (200 < mCPUMHz && mCPUMHz < 10000) // *NOTE: cpu speed is often way wrong, do a sanity check { - out << " (" << mCPUMhz << " MHz)"; + out << " (" << mCPUMHz << " MHz)"; } mCPUString = out.str(); - -#elif LL_LINUX - std::map< std::string, std::string > cpuinfo; - LLFILE* cpuinfo_fp = LLFile::fopen(CPUINFO_FILE, "rb"); - if(cpuinfo_fp) - { - char line[MAX_STRING]; - memset(line, 0, MAX_STRING); - while(fgets(line, MAX_STRING, cpuinfo_fp)) - { - // /proc/cpuinfo on Linux looks like: - // name\t*: value\n - char* tabspot = strchr( line, '\t' ); - if (tabspot == NULL) - continue; - char* colspot = strchr( tabspot, ':' ); - if (colspot == NULL) - continue; - char* spacespot = strchr( colspot, ' ' ); - if (spacespot == NULL) - continue; - char* nlspot = strchr( line, '\n' ); - if (nlspot == NULL) - nlspot = line + strlen( line ); // Fallback to terminating NUL - std::string linename( line, tabspot ); - std::string llinename(linename); - LLStringUtil::toLower(llinename); - std::string lineval( spacespot + 1, nlspot ); - cpuinfo[ llinename ] = lineval; - } - fclose(cpuinfo_fp); - } -# if LL_X86 - std::string flags = " " + cpuinfo["flags"] + " "; - LLStringUtil::toLower(flags); - mHasSSE = ( flags.find( " sse " ) != std::string::npos ); - mHasSSE2 = ( flags.find( " sse2 " ) != std::string::npos ); - - F64 mhz; - if (LLStringUtil::convertToF64(cpuinfo["cpu mhz"], mhz) - && 200.0 < mhz && mhz < 10000.0) - { - mCPUMhz = (S32)llrint(mhz); - } - if (!cpuinfo["model name"].empty()) - mCPUString = cpuinfo["model name"]; -# endif // LL_X86 -#endif // LL_LINUX } bool LLCPUInfo::hasAltivec() const @@ -595,9 +544,9 @@ bool LLCPUInfo::hasSSE2() const return mHasSSE2; } -S32 LLCPUInfo::getMhz() const +F64 LLCPUInfo::getMHz() const { - return mCPUMhz; + return mCPUMHz; } std::string LLCPUInfo::getCPUString() const @@ -607,44 +556,15 @@ std::string LLCPUInfo::getCPUString() const void LLCPUInfo::stream(std::ostream& s) const { -#if LL_WINDOWS || LL_DARWIN || LL_SOLARIS // gather machine information. - char proc_buf[CPUINFO_BUFFER_SIZE]; /* Flawfinder: ignore */ - CProcessor proc; - if(proc.CPUInfoToText(proc_buf, CPUINFO_BUFFER_SIZE)) - { - s << proc_buf; - } - else - { - s << "Unable to collect processor information" << std::endl; - } -#else - // *NOTE: This works on linux. What will it do on other systems? - LLFILE* cpuinfo = LLFile::fopen(CPUINFO_FILE, "rb"); - if(cpuinfo) - { - char line[MAX_STRING]; - memset(line, 0, MAX_STRING); - while(fgets(line, MAX_STRING, cpuinfo)) - { - line[strlen(line)-1] = ' '; - s << line; - } - fclose(cpuinfo); - s << std::endl; - } - else - { - s << "Unable to collect processor information" << std::endl; - } -#endif + s << LLProcessorInfo().getCPUFeatureDescription(); + // These are interesting as they reflect our internal view of the // CPU's attributes regardless of platform s << "->mHasSSE: " << (U32)mHasSSE << std::endl; s << "->mHasSSE2: " << (U32)mHasSSE2 << std::endl; s << "->mHasAltivec: " << (U32)mHasAltivec << std::endl; - s << "->mCPUMhz: " << mCPUMhz << std::endl; + s << "->mCPUMHz: " << mCPUMHz << std::endl; s << "->mCPUString: " << mCPUString << std::endl; } diff --git a/indra/llcommon/llsys.h b/indra/llcommon/llsys.h index c2c45bec9a..0b34951149 100644 --- a/indra/llcommon/llsys.h +++ b/indra/llcommon/llsys.h @@ -81,7 +81,7 @@ public: bool hasAltivec() const; bool hasSSE() const; bool hasSSE2() const; - S32 getMhz() const; + F64 getMHz() const; // Family is "AMD Duron" or "Intel Pentium Pro" const std::string& getFamily() const { return mFamily; } @@ -90,7 +90,7 @@ private: bool mHasSSE; bool mHasSSE2; bool mHasAltivec; - S32 mCPUMhz; + F64 mCPUMHz; std::string mFamily; std::string mCPUString; }; diff --git a/indra/llcommon/llthread.h b/indra/llcommon/llthread.h index adef1a9192..dbb8ec5231 100644 --- a/indra/llcommon/llthread.h +++ b/indra/llcommon/llthread.h @@ -135,7 +135,7 @@ class LL_COMMON_API LLMutex { public: LLMutex(apr_pool_t *apr_poolp); // NULL pool constructs a new pool for the mutex - ~LLMutex(); + virtual ~LLMutex(); void lock(); // blocks void unlock(); diff --git a/indra/llcommon/lltimer.cpp b/indra/llcommon/lltimer.cpp index 21e165ebc9..6111db2bfa 100644 --- a/indra/llcommon/lltimer.cpp +++ b/indra/llcommon/lltimer.cpp @@ -209,7 +209,7 @@ F64 calc_clock_frequency(U32 uiMeasureMSecs) // Both Linux and Mac use gettimeofday for accurate time F64 calc_clock_frequency(unsigned int uiMeasureMSecs) { - return 1000000.0; // microseconds, so 1 Mhz. + return 1000000.0; // microseconds, so 1 MHz. } U64 get_clock_count() @@ -555,60 +555,3 @@ void secondsToTimecodeString(F32 current_time, std::string& tcstring) } -////////////////////////////////////////////////////////////////////////////// -// -// LLEventTimer Implementation -// -////////////////////////////////////////////////////////////////////////////// - -LLEventTimer::LLEventTimer(F32 period) -: mEventTimer() -{ - mPeriod = period; - mBusy = false; -} - -LLEventTimer::LLEventTimer(const LLDate& time) -: mEventTimer() -{ - mPeriod = (F32)(time.secondsSinceEpoch() - LLDate::now().secondsSinceEpoch()); - mBusy = false; -} - - -LLEventTimer::~LLEventTimer() -{ - llassert(!mBusy); // this LLEventTimer was destroyed from within its own tick() function - bad. if you want tick() to cause destruction of its own timer, make it return true. -} - -//static -void LLEventTimer::updateClass() -{ - std::list<LLEventTimer*> completed_timers; - for (instance_iter iter = beginInstances(); iter != endInstances(); ) - { - LLEventTimer& timer = *iter++; - F32 et = timer.mEventTimer.getElapsedTimeF32(); - if (timer.mEventTimer.getStarted() && et > timer.mPeriod) { - timer.mEventTimer.reset(); - timer.mBusy = true; - if ( timer.tick() ) - { - completed_timers.push_back( &timer ); - } - timer.mBusy = false; - } - } - - if ( completed_timers.size() > 0 ) - { - for (std::list<LLEventTimer*>::iterator completed_iter = completed_timers.begin(); - completed_iter != completed_timers.end(); - completed_iter++ ) - { - delete *completed_iter; - } - } -} - - diff --git a/indra/llcommon/lltimer.h b/indra/llcommon/lltimer.h index 4d995d5bba..baba95bfa1 100644 --- a/indra/llcommon/lltimer.h +++ b/indra/llcommon/lltimer.h @@ -39,8 +39,6 @@ #include <limits.h> #include "stdtypes.h" -#include "lldate.h" -#include "llinstancetracker.h" #include <string> #include <list> @@ -171,26 +169,6 @@ LL_COMMON_API struct tm* utc_to_pacific_time(time_t utc_time, BOOL pacific_dayli LL_COMMON_API void microsecondsToTimecodeString(U64 current_time, std::string& tcstring); LL_COMMON_API void secondsToTimecodeString(F32 current_time, std::string& tcstring); -// class for scheduling a function to be called at a given frequency (approximate, inprecise) -class LL_COMMON_API LLEventTimer : protected LLInstanceTracker<LLEventTimer> -{ -public: - LLEventTimer(F32 period); // period is the amount of time between each call to tick() in seconds - LLEventTimer(const LLDate& time); - virtual ~LLEventTimer(); - - //function to be called at the supplied frequency - // Normally return FALSE; TRUE will delete the timer after the function returns. - virtual BOOL tick() = 0; - - static void updateClass(); - -protected: - LLTimer mEventTimer; - F32 mPeriod; - bool mBusy; -}; - U64 LL_COMMON_API totalTime(); // Returns current system time in microseconds #endif diff --git a/indra/llcommon/lluri.cpp b/indra/llcommon/lluri.cpp index 9d4f3a98f0..0e8f3f0f73 100644 --- a/indra/llcommon/lluri.cpp +++ b/indra/llcommon/lluri.cpp @@ -231,7 +231,8 @@ static BOOL isDefault(const std::string& scheme, U16 port) void LLURI::parseAuthorityAndPathUsingOpaque() { if (mScheme == "http" || mScheme == "https" || - mScheme == "ftp" || mScheme == "secondlife" ) + mScheme == "ftp" || mScheme == "secondlife" || + mScheme == "x-grid-location-info") { if (mEscapedOpaque.substr(0,2) != "//") { diff --git a/indra/llcommon/lluuid.cpp b/indra/llcommon/lluuid.cpp index bcbae06ec5..583c1e589b 100644 --- a/indra/llcommon/lluuid.cpp +++ b/indra/llcommon/lluuid.cpp @@ -33,9 +33,12 @@ // We can't use WIN32_LEAN_AND_MEAN here, needs lots of includes. #if LL_WINDOWS -# undef WIN32_LEAN_AND_MEAN -# include <winsock2.h> -# include <windows.h> +#undef WIN32_LEAN_AND_MEAN +#include <winsock2.h> +#include <windows.h> +// ugh, this is ugly. We need to straighten out our linking for this library +#pragma comment(lib, "IPHLPAPI.lib") +#include <iphlpapi.h> #endif #include "lldefs.h" @@ -452,67 +455,102 @@ static void get_random_bytes(void *buf, int nbytes) return; } -#if LL_WINDOWS -typedef struct _ASTAT_ -{ - ADAPTER_STATUS adapt; - NAME_BUFFER NameBuff [30]; -}ASTAT, * PASTAT; +#if LL_WINDOWS +// Code copied from http://msdn.microsoft.com/en-us/library/aa365939(VS.85).aspx +// This code grabs the first hardware address, rather than the first interface. +// Using a VPN can cause the first returned interface to be changed. + +const S32 MAC_ADDRESS_BYTES=6; + // static -S32 LLUUID::getNodeID(unsigned char * node_id) -{ - ASTAT Adapter; - NCB Ncb; - UCHAR uRetCode; - LANA_ENUM lenum; - int i; - int retval = 0; - - memset( &Ncb, 0, sizeof(Ncb) ); - Ncb.ncb_command = NCBENUM; - Ncb.ncb_buffer = (UCHAR *)&lenum; - Ncb.ncb_length = sizeof(lenum); - uRetCode = Netbios( &Ncb ); - // printf( "The NCBENUM return code is: 0x%x \n", uRetCode ); - - for(i=0; i < lenum.length ;i++) - { - memset( &Ncb, 0, sizeof(Ncb) ); - Ncb.ncb_command = NCBRESET; - Ncb.ncb_lana_num = lenum.lana[i]; - - uRetCode = Netbios( &Ncb ); - // printf( "The NCBRESET on LANA %d return code is: 0x%x \n", - // lenum.lana[i], uRetCode ); - - memset( &Ncb, 0, sizeof (Ncb) ); - Ncb.ncb_command = NCBASTAT; - Ncb.ncb_lana_num = lenum.lana[i]; - - strcpy( (char *)Ncb.ncb_callname, "* " ); /* Flawfinder: ignore */ - Ncb.ncb_buffer = (unsigned char *)&Adapter; - Ncb.ncb_length = sizeof(Adapter); - - uRetCode = Netbios( &Ncb ); -// printf( "The NCBASTAT on LANA %d return code is: 0x%x \n", -// lenum.lana[i], uRetCode ); - if ( uRetCode == 0 ) - { -// printf( "The Ethernet Number on LANA %d is: %02x%02x%02x%02x%02x%02x\n", -// lenum.lana[i], -// Adapter.adapt.adapter_address[0], -// Adapter.adapt.adapter_address[1], -// Adapter.adapt.adapter_address[2], -// Adapter.adapt.adapter_address[3], -// Adapter.adapt.adapter_address[4], -// Adapter.adapt.adapter_address[5] ); - memcpy(node_id,Adapter.adapt.adapter_address,6); /* Flawfinder: ignore */ - retval = 1; - - } - } - return retval; +S32 LLUUID::getNodeID(unsigned char *node_id) +{ + + // Declare and initialize variables. + DWORD dwSize = 0; + DWORD dwRetVal = 0; + int i; + +/* variables used for GetIfTable and GetIfEntry */ + MIB_IFTABLE *pIfTable; + MIB_IFROW *pIfRow; + + // Allocate memory for our pointers. + pIfTable = (MIB_IFTABLE *) malloc(sizeof (MIB_IFTABLE)); + if (pIfTable == NULL) + { + printf("Error allocating memory needed to call GetIfTable\n"); + return 0; + } + + // Before calling GetIfEntry, we call GetIfTable to make + // sure there are entries to get and retrieve the interface index. + + // Make an initial call to GetIfTable to get the + // necessary size into dwSize + if (GetIfTable(pIfTable, &dwSize, 0) == ERROR_INSUFFICIENT_BUFFER) { + free(pIfTable); + pIfTable = (MIB_IFTABLE *) malloc(dwSize); + if (pIfTable == NULL) + { + printf("Error allocating memory\n"); + return 0; + } + } + // Make a second call to GetIfTable to get the actual + // data we want. + if ((dwRetVal = GetIfTable(pIfTable, &dwSize, 0)) == NO_ERROR) + { + if (pIfTable->dwNumEntries > 0) + { + pIfRow = (MIB_IFROW *) malloc(sizeof (MIB_IFROW)); + if (pIfRow == NULL) + { + printf("Error allocating memory\n"); + if (pIfTable != NULL) + { + free(pIfTable); + pIfTable = NULL; + } + return 0; + } + + int limit = MAC_ADDRESS_BYTES; + memcpy(node_id, "\0\0\0\0\0\0", limit); // zero out array of bytes + for (i = 0; i < (int) pIfTable->dwNumEntries; i++) + { + pIfRow->dwIndex = pIfTable->table[i].dwIndex; + if ((dwRetVal = GetIfEntry(pIfRow)) == NO_ERROR) + { + switch (pIfRow->dwType) + { + case IF_TYPE_ETHERNET_CSMACD: + case IF_TYPE_IEEE80211: + limit = min((int) pIfRow->dwPhysAddrLen, limit); + if (pIfRow->dwPhysAddrLen == 0) + break; + memcpy(node_id, (UCHAR *)&pIfRow->bPhysAddr[0], limit); // just incase the PhysAddr is not the expected MAC_Address size + free(pIfTable); + return 1; //return first hardware device found. + break; + + case IF_TYPE_OTHER: + case IF_TYPE_PPP: + case IF_TYPE_SOFTWARE_LOOPBACK: + case IF_TYPE_ISO88025_TOKENRING: + case IF_TYPE_IEEE1394: + case IF_TYPE_ATM: + case IF_TYPE_TUNNEL: + default: + break; + } + } + } + } + } + free(pIfTable); + return 0; } #elif LL_DARWIN diff --git a/indra/llcommon/lluuid.h b/indra/llcommon/lluuid.h index c78fb12018..3a0d66e4a5 100644 --- a/indra/llcommon/lluuid.h +++ b/indra/llcommon/lluuid.h @@ -133,6 +133,7 @@ public: U8 mData[UUID_BYTES]; }; +typedef std::vector<LLUUID> uuid_vec_t; // Construct inline LLUUID::LLUUID() diff --git a/indra/llcommon/llversionserver.h b/indra/llcommon/llversionserver.h index 0f1e59a18c..87fe7001e0 100644 --- a/indra/llcommon/llversionserver.h +++ b/indra/llcommon/llversionserver.h @@ -33,10 +33,10 @@ #ifndef LL_LLVERSIONSERVER_H #define LL_LLVERSIONSERVER_H -const S32 LL_VERSION_MAJOR = 1; -const S32 LL_VERSION_MINOR = 31; +const S32 LL_VERSION_MAJOR = 2; +const S32 LL_VERSION_MINOR = 1; const S32 LL_VERSION_PATCH = 0; -const S32 LL_VERSION_BUILD = 200030; +const S32 LL_VERSION_BUILD = 0; const char * const LL_CHANNEL = "Second Life Server"; diff --git a/indra/llcommon/llversionviewer.h b/indra/llcommon/llversionviewer.h index 540aea4252..6e341b83a1 100644 --- a/indra/llcommon/llversionviewer.h +++ b/indra/llcommon/llversionviewer.h @@ -34,9 +34,9 @@ #define LL_LLVERSIONVIEWER_H const S32 LL_VERSION_MAJOR = 2; -const S32 LL_VERSION_MINOR = 0; +const S32 LL_VERSION_MINOR = 1; const S32 LL_VERSION_PATCH = 0; -const S32 LL_VERSION_BUILD = 200030; +const S32 LL_VERSION_BUILD = 0; const char * const LL_CHANNEL = "Second Life Developer"; diff --git a/indra/llcommon/llworkerthread.cpp b/indra/llcommon/llworkerthread.cpp index 1b0e03cb2a..a29e9a348e 100644 --- a/indra/llcommon/llworkerthread.cpp +++ b/indra/llcommon/llworkerthread.cpp @@ -65,6 +65,27 @@ LLWorkerThread::~LLWorkerThread() // ~LLQueuedThread() will be called here } +//called only in destructor. +void LLWorkerThread::clearDeleteList() +{ + // Delete any workers in the delete queue (should be safe - had better be!) + if (!mDeleteList.empty()) + { + llwarns << "Worker Thread: " << mName << " destroyed with " << mDeleteList.size() + << " entries in delete list." << llendl; + + mDeleteMutex->lock(); + for (delete_list_t::iterator iter = mDeleteList.begin(); iter != mDeleteList.end(); ++iter) + { + (*iter)->mRequestHandle = LLWorkerThread::nullHandle(); + (*iter)->clearFlags(LLWorkerClass::WCF_HAVE_WORK); + delete *iter ; + } + mDeleteList.clear() ; + mDeleteMutex->unlock() ; + } +} + // virtual S32 LLWorkerThread::update(U32 max_time_ms) { @@ -320,7 +341,20 @@ bool LLWorkerClass::checkWork(bool aborting) if (mRequestHandle != LLWorkerThread::nullHandle()) { LLWorkerThread::WorkRequest* workreq = (LLWorkerThread::WorkRequest*)mWorkerThread->getRequest(mRequestHandle); - llassert_always(workreq); + if(!workreq) + { + if(mWorkerThread->isQuitting() || mWorkerThread->isStopped()) //the mWorkerThread is not running + { + mRequestHandle = LLWorkerThread::nullHandle(); + clearFlags(WCF_HAVE_WORK); + } + else + { + llassert_always(workreq); + } + return true ; + } + LLQueuedThread::status_t status = workreq->getStatus(); if (status == LLWorkerThread::STATUS_ABORTED) { @@ -370,7 +404,7 @@ void LLWorkerClass::scheduleDelete() void LLWorkerClass::setPriority(U32 priority) { mMutex.lock(); - if (mRequestHandle != LLWorkerThread::nullHandle()) + if (mRequestHandle != LLWorkerThread::nullHandle() && mRequestPriority != priority) { mRequestPriority = priority; mWorkerThread->setPriority(mRequestHandle, priority); diff --git a/indra/llcommon/llworkerthread.h b/indra/llcommon/llworkerthread.h index a1e85d2ecc..1756ebab6b 100644 --- a/indra/llcommon/llworkerthread.h +++ b/indra/llcommon/llworkerthread.h @@ -80,6 +80,9 @@ public: S32 mParam; }; +protected: + void clearDeleteList() ; + private: typedef std::list<LLWorkerClass*> delete_list_t; delete_list_t mDeleteList; diff --git a/indra/llcommon/tests/llerror_test.cpp b/indra/llcommon/tests/llerror_test.cpp index 6785d0cf17..1558df231a 100644 --- a/indra/llcommon/tests/llerror_test.cpp +++ b/indra/llcommon/tests/llerror_test.cpp @@ -545,15 +545,6 @@ namespace tut // output order void ErrorTestObject::test<10>() { -#if LL_LINUX - skip("Fails on Linux, see comments"); -// on Linux: -// [error, 10] fail: 'order is time type location function message: expected -// '1947-07-08T03:04:05Z INFO: llcommon/tests/llerror_test.cpp(268) : -// writeReturningLocationAndFunction: apple' actual -// '1947-07-08T03:04:05Z INFO: llcommon/tests/llerror_test.cpp(268) : -// LLError::NoClassInfo::writeReturningLocationAndFunction: apple'' -#endif LLError::setPrintLocation(true); LLError::setTimeFunction(roswell); mRecorder.setWantsTime(true); diff --git a/indra/llcommon/tests/llinstancetracker_test.cpp b/indra/llcommon/tests/llinstancetracker_test.cpp index 7415f2d33b..4bb3ec2922 100644 --- a/indra/llcommon/tests/llinstancetracker_test.cpp +++ b/indra/llcommon/tests/llinstancetracker_test.cpp @@ -138,23 +138,29 @@ namespace tut keys.insert(&one); keys.insert(&two); keys.insert(&three); - for (Unkeyed::key_iter ki(Unkeyed::beginKeys()), kend(Unkeyed::endKeys()); - ki != kend; ++ki) - { - ensure_equals("spurious key", keys.erase(*ki), 1); - } + { + Unkeyed::LLInstanceTrackerScopedGuard guard; + for (Unkeyed::key_iter ki(guard.beginKeys()), kend(guard.endKeys()); + ki != kend; ++ki) + { + ensure_equals("spurious key", keys.erase(*ki), 1); + } + } ensure_equals("unreported key", keys.size(), 0); KeySet instances; instances.insert(&one); instances.insert(&two); instances.insert(&three); - for (Unkeyed::instance_iter ii(Unkeyed::beginInstances()), iend(Unkeyed::endInstances()); - ii != iend; ++ii) - { - Unkeyed& ref = *ii; - ensure_equals("spurious instance", instances.erase(&ref), 1); - } + { + Unkeyed::LLInstanceTrackerScopedGuard guard; + for (Unkeyed::instance_iter ii(guard.beginInstances()), iend(guard.endInstances()); + ii != iend; ++ii) + { + Unkeyed& ref = *ii; + ensure_equals("spurious instance", instances.erase(&ref), 1); + } + } ensure_equals("unreported instance", instances.size(), 0); } } // namespace tut diff --git a/indra/llcommon/tests/llprocessor_test.cpp b/indra/llcommon/tests/llprocessor_test.cpp new file mode 100644 index 0000000000..a9e312b70b --- /dev/null +++ b/indra/llcommon/tests/llprocessor_test.cpp @@ -0,0 +1,67 @@ +/** + * @file llprocessor_test.cpp + * @date 2010-06-01 + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "linden_common.h" +#include "../test/lltut.h" + +#include "../llprocessor.h" + + +namespace tut +{ + struct processor + { + }; + + typedef test_group<processor> processor_t; + typedef processor_t::object processor_object_t; + tut::processor_t tut_processor("processor"); + + template<> template<> + void processor_object_t::test<1>() + { + set_test_name("LLProcessorInfo regression test"); + + LLProcessorInfo pi; + F64 freq = pi.getCPUFrequency(); + //bool sse = pi.hasSSE(); + //bool sse2 = pi.hasSSE2(); + //bool alitvec = pi.hasAltivec(); + std::string family = pi.getCPUFamilyName(); + std::string brand = pi.getCPUBrandName(); + //std::string steam = pi.getCPUFeatureDescription(); + + ensure_not_equals("Unknown Brand name", brand, "Unknown"); + ensure_not_equals("Unknown Family name", family, "Unknown"); + ensure("Reasonable CPU Frequency > 100 && < 10000", freq > 100 && freq < 10000); + } +} diff --git a/indra/llcrashlogger/llcrashlogger.cpp b/indra/llcrashlogger/llcrashlogger.cpp index c1022c1195..51e5f14bfe 100755 --- a/indra/llcrashlogger/llcrashlogger.cpp +++ b/indra/llcrashlogger/llcrashlogger.cpp @@ -155,25 +155,6 @@ std::string getStartupStateFromLog(std::string& sllog) void LLCrashLogger::gatherFiles() { - - /* - //TODO:This function needs to be reimplemented somewhere in here... - if(!previous_crash && is_crash_log) - { - // Make sure the file isn't too old. - double age = difftime(gLaunchTime, stat_data.st_mtimespec.tv_sec); - - // llinfos << "age is " << age << llendl; - - if(age > 60.0) - { - // The file was last modified more than 60 seconds before the crash reporter was launched. Assume it's stale. - llwarns << "File " << mFilename << " is too old!" << llendl; - return; - } - } - */ - updateApplication("Gathering logs..."); // Figure out the filename of the debug log @@ -209,11 +190,9 @@ void LLCrashLogger::gatherFiles() mFileMap["SettingsXml"] = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS,"settings.xml"); } -#if !LL_DARWIN if(mCrashInPreviousExec) -#else -#endif { + // Restarting after freeze. // Replace the log file ext with .old, since the // instance that launched this process has overwritten // SecondLife.log @@ -225,7 +204,12 @@ void LLCrashLogger::gatherFiles() gatherPlatformSpecificFiles(); //Use the debug log to reconstruct the URL to send the crash report to - if(mDebugLog.has("CurrentSimHost")) + if(mDebugLog.has("CrashHostUrl")) + { + // Crash log receiver has been manually configured. + mCrashHost = mDebugLog["CrashHostUrl"].asString(); + } + else if(mDebugLog.has("CurrentSimHost")) { mCrashHost = "https://"; mCrashHost += mDebugLog["CurrentSimHost"].asString(); @@ -247,7 +231,6 @@ void LLCrashLogger::gatherFiles() mCrashInfo["DebugLog"] = mDebugLog; mFileMap["StatsLog"] = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"stats.log"); - mFileMap["StackTrace"] = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"stack_trace.log"); updateApplication("Encoding files..."); @@ -272,8 +255,30 @@ void LLCrashLogger::gatherFiles() trimSLLog(crash_info); } - mCrashInfo[(*itr).first] = rawstr_to_utf8(crash_info); + mCrashInfo[(*itr).first] = LLStringFn::strip_invalid_xml(rawstr_to_utf8(crash_info)); + } + + // Add minidump as binary. + std::string minidump_path = mDebugLog["MinidumpPath"]; + if(minidump_path != "") + { + std::ifstream minidump_stream(minidump_path.c_str(), std::ios_base::in | std::ios_base::binary); + if(minidump_stream.is_open()) + { + minidump_stream.seekg(0, std::ios::end); + size_t length = minidump_stream.tellg(); + minidump_stream.seekg(0, std::ios::beg); + + LLSD::Binary data; + data.resize(length); + + minidump_stream.read(reinterpret_cast<char *>(&(data[0])),length); + minidump_stream.close(); + + mCrashInfo["Minidump"] = data; + } } + mCrashInfo["DebugLog"].erase("MinidumpPath"); } LLSD LLCrashLogger::constructPostData() diff --git a/indra/llimage/CMakeLists.txt b/indra/llimage/CMakeLists.txt index 22be4078a1..a69621a57b 100644 --- a/indra/llimage/CMakeLists.txt +++ b/indra/llimage/CMakeLists.txt @@ -21,6 +21,7 @@ include_directories( set(llimage_SOURCE_FILES llimagebmp.cpp llimage.cpp + llimagedimensionsinfo.cpp llimagedxt.cpp llimagej2c.cpp llimagejpeg.cpp @@ -35,6 +36,7 @@ set(llimage_HEADER_FILES llimage.h llimagebmp.h + llimagedimensionsinfo.h llimagedxt.h llimagej2c.h llimagejpeg.h diff --git a/indra/llimage/llimage.cpp b/indra/llimage/llimage.cpp index e02be6c8c1..0fc5ca1ad6 100644 --- a/indra/llimage/llimage.cpp +++ b/indra/llimage/llimage.cpp @@ -93,9 +93,10 @@ LLImageBase::LLImageBase() mWidth(0), mHeight(0), mComponents(0), + mBadBufferAllocation(false), + mAllowOverSize(false), mMemType(LLMemType::MTYPE_IMAGEBASE) { - mBadBufferAllocation = FALSE ; } // virtual @@ -134,8 +135,6 @@ void LLImageBase::sanityCheck() } } -BOOL LLImageBase::sSizeOverride = FALSE; - // virtual void LLImageBase::deleteData() { @@ -157,22 +156,32 @@ U8* LLImageBase::allocateData(S32 size) llerrs << llformat("LLImageBase::allocateData called with bad dimensions: %dx%dx%d",mWidth,mHeight,mComponents) << llendl; } } - else if (size <= 0 || (size > 4096*4096*16 && sSizeOverride == FALSE)) + + //make this function thread-safe. + static const U32 MAX_BUFFER_SIZE = 4096 * 4096 * 16 ; //256 MB + if (size < 1 || size > MAX_BUFFER_SIZE) { - llerrs << "LLImageBase::allocateData: bad size: " << size << llendl; + llinfos << "width: " << mWidth << " height: " << mHeight << " components: " << mComponents << llendl ; + if(mAllowOverSize) + { + llinfos << "Oversize: " << size << llendl ; + } + else + { + llerrs << "LLImageBase::allocateData: bad size: " << size << llendl; + } } - if (!mData || size != mDataSize) { deleteData(); // virtual - mBadBufferAllocation = FALSE ; + mBadBufferAllocation = false ; mData = new U8[size]; if (!mData) { llwarns << "allocate image data: " << size << llendl; size = 0 ; mWidth = mHeight = 0 ; - mBadBufferAllocation = TRUE ; + mBadBufferAllocation = true ; } mDataSize = size; } @@ -221,7 +230,7 @@ U8* LLImageBase::getData() return mData; } -BOOL LLImageBase::isBufferInvalid() +bool LLImageBase::isBufferInvalid() { return mBadBufferAllocation || mData == NULL ; } @@ -257,7 +266,7 @@ LLImageRaw::LLImageRaw(U16 width, U16 height, S8 components) : LLImageBase() { mMemType = LLMemType::MTYPE_IMAGERAW; - llassert( S32(width) * S32(height) * S32(components) <= MAX_IMAGE_DATA_SIZE ); + //llassert( S32(width) * S32(height) * S32(components) <= MAX_IMAGE_DATA_SIZE ); allocateDataSize(width, height, components); ++sRawImageCount; } @@ -676,9 +685,6 @@ void LLImageRaw::copy(LLImageRaw* src) LLImageRaw* dst = this; // Just for clarity. - llassert( (3 == src->getComponents()) || (4 == src->getComponents()) ); - llassert( (3 == dst->getComponents()) || (4 == dst->getComponents()) ); - if( (src->getWidth() == dst->getWidth()) && (src->getHeight() == dst->getHeight()) ) { // No scaling needed @@ -1328,7 +1334,7 @@ LLImageFormatted::LLImageFormatted(S8 codec) mCodec(codec), mDecoding(0), mDecoded(0), - mDiscardLevel(0) + mDiscardLevel(-1) { mMemType = LLMemType::MTYPE_IMAGEFORMATTED; } diff --git a/indra/llimage/llimage.h b/indra/llimage/llimage.h index 686f583886..10444e7f89 100644 --- a/indra/llimage/llimage.h +++ b/indra/llimage/llimage.h @@ -48,7 +48,7 @@ const S32 MAX_IMAGE_SIZE = (1<<MAX_IMAGE_MIP); // 2048 const S32 MIN_IMAGE_AREA = MIN_IMAGE_SIZE * MIN_IMAGE_SIZE; const S32 MAX_IMAGE_AREA = MAX_IMAGE_SIZE * MAX_IMAGE_SIZE; const S32 MAX_IMAGE_COMPONENTS = 8; -const S32 MAX_IMAGE_DATA_SIZE = MAX_IMAGE_AREA * MAX_IMAGE_COMPONENTS; +const S32 MAX_IMAGE_DATA_SIZE = MAX_IMAGE_AREA * MAX_IMAGE_COMPONENTS; //2048 * 2048 * 8 = 16 MB // Note! These CANNOT be changed without modifying simulator code // *TODO: change both to 1024 when SIM texture fetching is deprecated @@ -124,10 +124,12 @@ public: const U8 *getData() const ; U8 *getData() ; - BOOL isBufferInvalid() ; + bool isBufferInvalid() ; void setSize(S32 width, S32 height, S32 ncomponents); U8* allocateDataSize(S32 width, S32 height, S32 ncomponents, S32 size = -1); // setSize() + allocateData() + void enableOverSize() {mAllowOverSize = true ;} + void disableOverSize() {mAllowOverSize = false; } protected: // special accessor to allow direct setting of mData and mDataSize by LLImageFormatted @@ -140,8 +142,6 @@ public: // <= 0 priority means that there's no need for more data. static F32 calc_download_priority(F32 virtual_size, F32 visible_area, S32 bytes_sent); - static void setSizeOverride(BOOL enabled) { sSizeOverride = enabled; } - static EImageCodec getCodecFromExtension(const std::string& exten); private: @@ -153,12 +153,10 @@ private: S8 mComponents; - BOOL mBadBufferAllocation ; - + bool mBadBufferAllocation ; + bool mAllowOverSize ; public: LLMemType::DeclareMemType& mMemType; // debug - - static BOOL sSizeOverride; }; // Raw representation of an image (used for textures, and other uncompressed formats diff --git a/indra/llimage/llimagedimensionsinfo.cpp b/indra/llimage/llimagedimensionsinfo.cpp new file mode 100644 index 0000000000..890b49b50a --- /dev/null +++ b/indra/llimage/llimagedimensionsinfo.cpp @@ -0,0 +1,139 @@ +/** + * @file llimagedimensionsinfo.cpp + * + * $LicenseInfo:firstyear=2002&license=viewergpl$ + * + * Copyright (c) 2002-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "linden_common.h" +#include "stdtypes.h" + +#include "llimagejpeg.h" + +#include "llimagedimensionsinfo.h" + +bool LLImageDimensionsInfo::load(const std::string& src_filename,U32 codec) +{ + clean(); + + mSrcFilename = src_filename; + + S32 file_size = 0; + apr_status_t s = mInfile.open(src_filename, LL_APR_RB, NULL, &file_size); + + if (s != APR_SUCCESS) + { + setLastError("Unable to open file for reading", src_filename); + return false; + } + + if (file_size == 0) + { + setLastError("File is empty",src_filename); + return false; + } + + switch (codec) + { + case IMG_CODEC_BMP: + return getImageDimensionsBmp(); + case IMG_CODEC_TGA: + return getImageDimensionsTga(); + case IMG_CODEC_JPEG: + return getImageDimensionsJpeg(); + case IMG_CODEC_PNG: + return getImageDimensionsPng(); + default: + return false; + + } +} + + +bool LLImageDimensionsInfo::getImageDimensionsBmp() +{ + const S32 BMP_FILE_HEADER_SIZE = 14; + + mInfile.seek(APR_CUR,BMP_FILE_HEADER_SIZE+4); + mWidth = read_reverse_s32(); + mHeight = read_reverse_s32(); + + return true; +} + +bool LLImageDimensionsInfo::getImageDimensionsTga() +{ + const S32 TGA_FILE_HEADER_SIZE = 12; + + mInfile.seek(APR_CUR,TGA_FILE_HEADER_SIZE); + mWidth = read_byte() | read_byte() << 8; + mHeight = read_byte() | read_byte() << 8; + + return true; +} + +bool LLImageDimensionsInfo::getImageDimensionsPng() +{ + const S32 PNG_FILE_MARKER_SIZE = 8; + + mInfile.seek(APR_CUR,PNG_FILE_MARKER_SIZE + 8/*header offset+chunk length+chunk type*/); + mWidth = read_s32(); + mHeight = read_s32(); + + return true; +} + + +bool LLImageDimensionsInfo::getImageDimensionsJpeg() +{ + clean(); + FILE *fp = fopen (mSrcFilename.c_str(), "rb"); + if (fp == NULL) + { + setLastError("Unable to open file for reading", mSrcFilename); + return false; + } + /* Init jpeg */ + jpeg_error_mgr jerr; + jpeg_decompress_struct cinfo; + cinfo.err = jpeg_std_error(&jerr); + + jpeg_create_decompress (&cinfo); + jpeg_stdio_src (&cinfo, fp); + jpeg_read_header (&cinfo, TRUE); + cinfo.out_color_space = JCS_RGB; + jpeg_start_decompress (&cinfo); + + mHeight = cinfo.output_width; + mHeight = cinfo.output_height; + + jpeg_destroy_decompress(&cinfo); + fclose(fp); + + return true; +} + diff --git a/indra/llimage/llimagedimensionsinfo.h b/indra/llimage/llimagedimensionsinfo.h new file mode 100644 index 0000000000..2c8f675fa1 --- /dev/null +++ b/indra/llimage/llimagedimensionsinfo.h @@ -0,0 +1,139 @@ +/** + * @file llimagedimentionsinfo.h + * + * $LicenseInfo:firstyear=2001&license=viewergpl$ + * + * Copyright (c) 2001-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + + +#ifndef LL_LLIMAGEDIMENSIONSINFO_H +#define LL_LLIMAGEDIMENSIONSINFO_H + +//----------------------------------------------------------------------------- +// LLImageDimensionsInfo +// helper class to get image dimensions WITHOUT loading image to memore +// usefull when image may be too large... +//----------------------------------------------------------------------------- +class LLImageDimensionsInfo +{ +public: + LLImageDimensionsInfo(): + mData(NULL) + ,mHeight(0) + ,mWidth(0) + {} + ~LLImageDimensionsInfo() + { + clean(); + } + + bool load(const std::string& src_filename,U32 codec); + S32 getWidth() const { return mWidth;} + S32 getHeight() const { return mHeight;} + + const std::string& getLastError() + { + return mLastError; + } +protected: + + void clean() + { + mInfile.close(); + delete[] mData; + mData = NULL; + mWidth = 0; + mHeight = 0; + } + + U8* getData() + { + return mData; + } + + + void setLastError(const std::string& message, const std::string& filename) + { + std::string error = message; + if (!filename.empty()) + error += std::string(" FILE: ") + filename; + mLastError = error; + } + + + bool getImageDimensionsBmp(); + bool getImageDimensionsTga(); + bool getImageDimensionsPng(); + bool getImageDimensionsJpeg(); + + S32 read_s32() + { + char p[4]; + mInfile.read(&p[0],4); + S32 temp = (((S32)p[3]) & 0x000000FF) | + (((S32)p[2] << 8 ) & 0x0000FF00) | + (((S32)p[1] << 16) & 0x00FF0000) | + (((S32)p[0] << 24) & 0xFF000000); + + return temp; + } + S32 read_reverse_s32() + { + char p[4]; + mInfile.read(&p[0],4); + S32 temp = (((S32)p[0]) & 0x000000FF) | + (((S32)p[1] << 8 ) & 0x0000FF00) | + (((S32)p[2] << 16) & 0x00FF0000) | + (((S32)p[3] << 24) & 0xFF000000); + + return temp; + } + + U8 read_byte() + { + U8 bt; + mInfile.read(&bt,1); + return bt; + } + + U16 read_short() + { + return read_byte() << 8 | read_byte(); + } + +protected: + LLAPRFile mInfile ; + std::string mSrcFilename; + + std::string mLastError; + + U8* mData; + + S32 mWidth; + S32 mHeight; +}; +#endif diff --git a/indra/llimage/llimagepng.cpp b/indra/llimage/llimagepng.cpp index b5de104e61..018ce993b5 100644 --- a/indra/llimage/llimagepng.cpp +++ b/indra/llimage/llimagepng.cpp @@ -42,17 +42,12 @@ // LLImagePNG // --------------------------------------------------------------------------- LLImagePNG::LLImagePNG() - : LLImageFormatted(IMG_CODEC_PNG), - mTmpWriteBuffer(NULL) + : LLImageFormatted(IMG_CODEC_PNG) { } LLImagePNG::~LLImagePNG() { - if (mTmpWriteBuffer) - { - delete[] mTmpWriteBuffer; - } } // Virtual @@ -123,27 +118,24 @@ BOOL LLImagePNG::encode(const LLImageRaw* raw_image, F32 encode_time) // Temporary buffer to hold the encoded image. Note: the final image // size should be much smaller due to compression. - if (mTmpWriteBuffer) - { - delete[] mTmpWriteBuffer; - } U32 bufferSize = getWidth() * getHeight() * getComponents() + 1024; - U8* mTmpWriteBuffer = new U8[ bufferSize ]; + U8* tmpWriteBuffer = new U8[ bufferSize ]; // Delegate actual encoding work to wrapper LLPngWrapper pngWrapper; - if (! pngWrapper.writePng(raw_image, mTmpWriteBuffer)) + if (! pngWrapper.writePng(raw_image, tmpWriteBuffer)) { setLastError(pngWrapper.getErrorMessage()); + delete[] tmpWriteBuffer; return FALSE; } // Resize internal buffer and copy from temp U32 encodedSize = pngWrapper.getFinalSize(); allocateData(encodedSize); - memcpy(getData(), mTmpWriteBuffer, encodedSize); + memcpy(getData(), tmpWriteBuffer, encodedSize); - delete[] mTmpWriteBuffer; + delete[] tmpWriteBuffer; return TRUE; } diff --git a/indra/llimage/llimagepng.h b/indra/llimage/llimagepng.h index 083dda73b9..4d6e2ee70a 100644 --- a/indra/llimage/llimagepng.h +++ b/indra/llimage/llimagepng.h @@ -47,9 +47,6 @@ public: /*virtual*/ BOOL updateData(); /*virtual*/ BOOL decode(LLImageRaw* raw_image, F32 decode_time); /*virtual*/ BOOL encode(const LLImageRaw* raw_image, F32 encode_time); - -private: - U8* mTmpWriteBuffer; }; #endif diff --git a/indra/llimage/llimageworker.cpp b/indra/llimage/llimageworker.cpp index 86d41515e7..20a72d0a28 100644 --- a/indra/llimage/llimageworker.cpp +++ b/indra/llimage/llimageworker.cpp @@ -54,9 +54,14 @@ S32 LLImageDecodeThread::update(U32 max_time_ms) { creation_info& info = *iter; ImageRequest* req = new ImageRequest(info.handle, info.image, - info.priority, info.discard, info.needs_aux, - info.responder); - addRequest(req); + info.priority, info.discard, info.needs_aux, + info.responder); + + bool res = addRequest(req); + if (!res) + { + llerrs << "request added after LLLFSThread::cleanupClass()" << llendl; + } } mCreationList.clear(); S32 res = LLQueuedThread::update(max_time_ms); diff --git a/indra/llinventory/CMakeLists.txt b/indra/llinventory/CMakeLists.txt index b358f0a013..a563db901a 100644 --- a/indra/llinventory/CMakeLists.txt +++ b/indra/llinventory/CMakeLists.txt @@ -20,6 +20,7 @@ set(llinventory_SOURCE_FILES llcategory.cpp lleconomy.cpp llinventory.cpp + llinventorydefines.cpp llinventorytype.cpp lllandmark.cpp llnotecard.cpp @@ -36,6 +37,7 @@ set(llinventory_HEADER_FILES llcategory.h lleconomy.h llinventory.h + llinventorydefines.h llinventorytype.h lllandmark.h llnotecard.h diff --git a/indra/llinventory/llinventory.cpp b/indra/llinventory/llinventory.cpp index d665deb605..53830b1a14 100644 --- a/indra/llinventory/llinventory.cpp +++ b/indra/llinventory/llinventory.cpp @@ -31,10 +31,10 @@ */ #include "linden_common.h" - #include "llinventory.h" #include "lldbstrings.h" +#include "llinventorydefines.h" #include "llxorcipher.h" #include "llsd.h" #include "message.h" @@ -43,9 +43,8 @@ #include "llsdutil.h" ///---------------------------------------------------------------------------- -/// exported functions +/// Exported functions ///---------------------------------------------------------------------------- - static const std::string INV_ITEM_ID_LABEL("item_id"); static const std::string INV_FOLDER_ID_LABEL("folder_id"); static const std::string INV_PARENT_ID_LABEL("parent_id"); @@ -64,34 +63,29 @@ static const std::string INV_CREATION_DATE_LABEL("created_at"); // key used by agent-inventory-service static const std::string INV_ASSET_TYPE_LABEL_WS("type_default"); static const std::string INV_FOLDER_ID_LABEL_WS("category_id"); + ///---------------------------------------------------------------------------- /// Local function declarations, constants, enums, and typedefs ///---------------------------------------------------------------------------- - const U8 TASK_INVENTORY_ITEM_KEY = 0; const U8 TASK_INVENTORY_ASSET_KEY = 1; const LLUUID MAGIC_ID("3c115e51-04f4-523c-9fa6-98aff1034730"); - ///---------------------------------------------------------------------------- /// Class LLInventoryObject ///---------------------------------------------------------------------------- -LLInventoryObject::LLInventoryObject( - const LLUUID& uuid, - const LLUUID& parent_uuid, - LLAssetType::EType type, - const std::string& name) : +LLInventoryObject::LLInventoryObject(const LLUUID& uuid, + const LLUUID& parent_uuid, + LLAssetType::EType type, + const std::string& name) : mUUID(uuid), mParentUUID(parent_uuid), mType(type), mName(name) { - LLStringUtil::replaceNonstandardASCII(mName, ' '); - LLStringUtil::replaceChar(mName, '|', ' '); - LLStringUtil::trim(mName); - LLStringUtil::truncate(mName, DB_INV_ITEM_NAME_STR_LEN); + correctInventoryName(mName); } LLInventoryObject::LLInventoryObject() : @@ -99,7 +93,7 @@ LLInventoryObject::LLInventoryObject() : { } -LLInventoryObject::~LLInventoryObject( void ) +LLInventoryObject::~LLInventoryObject() { } @@ -158,12 +152,8 @@ void LLInventoryObject::setUUID(const LLUUID& new_uuid) void LLInventoryObject::rename(const std::string& n) { std::string new_name(n); - LLStringUtil::replaceNonstandardASCII(new_name, ' '); - LLStringUtil::replaceChar(new_name, '|', ' '); - LLStringUtil::trim(new_name); - LLStringUtil::truncate(new_name, DB_INV_ITEM_NAME_STR_LEN); - - if( new_name != mName ) + correctInventoryName(new_name); + if( !new_name.empty() && new_name != mName ) { mName = new_name; } @@ -224,10 +214,7 @@ BOOL LLInventoryObject::importLegacyStream(std::istream& input_stream) " %254s %254[^|]", keyword, valuestr); mName.assign(valuestr); - LLStringUtil::replaceNonstandardASCII(mName, ' '); - LLStringUtil::replaceChar(mName, '|', ' '); - LLStringUtil::trim(mName); - LLStringUtil::truncate(mName, DB_INV_ITEM_NAME_STR_LEN); + correctInventoryName(mName); } else { @@ -287,23 +274,31 @@ void LLInventoryObject::updateServer(BOOL) const llwarns << "LLInventoryObject::updateServer() called. Doesn't do anything." << llendl; } +inline +void LLInventoryObject::correctInventoryName(std::string& name) +{ + LLStringUtil::replaceNonstandardASCII(name, ' '); + LLStringUtil::replaceChar(name, '|', ' '); + LLStringUtil::trim(name); + LLStringUtil::truncate(name, DB_INV_ITEM_NAME_STR_LEN); +} + ///---------------------------------------------------------------------------- /// Class LLInventoryItem ///---------------------------------------------------------------------------- -LLInventoryItem::LLInventoryItem( - const LLUUID& uuid, - const LLUUID& parent_uuid, - const LLPermissions& permissions, - const LLUUID& asset_uuid, - LLAssetType::EType type, - LLInventoryType::EType inv_type, - const std::string& name, - const std::string& desc, - const LLSaleInfo& sale_info, - U32 flags, - S32 creation_date_utc) : +LLInventoryItem::LLInventoryItem(const LLUUID& uuid, + const LLUUID& parent_uuid, + const LLPermissions& permissions, + const LLUUID& asset_uuid, + LLAssetType::EType type, + LLInventoryType::EType inv_type, + const std::string& name, + const std::string& desc, + const LLSaleInfo& sale_info, + U32 flags, + S32 creation_date_utc) : LLInventoryObject(uuid, parent_uuid, type, name), mPermissions(permissions), mAssetUUID(asset_uuid), @@ -458,11 +453,18 @@ void LLInventoryItem::setCreationDate(time_t creation_date_utc) mCreationDate = creation_date_utc; } +// Currently only used in the Viewer to handle calling cards +// where the creator is actually used to store the target. +void LLInventoryItem::setCreator(const LLUUID& creator) +{ + mPermissions.setCreator(creator); +} + void LLInventoryItem::accumulatePermissionSlamBits(const LLInventoryItem& old_item) { // Remove any pre-existing II_FLAGS_PERM_OVERWRITE_MASK flags // because we now detect when they should be set. - setFlags( old_item.getFlags() | (getFlags() & ~(LLInventoryItem::II_FLAGS_PERM_OVERWRITE_MASK)) ); + setFlags( old_item.getFlags() | (getFlags() & ~(LLInventoryItemFlags::II_FLAGS_PERM_OVERWRITE_MASK)) ); // Enforce the PERM_OVERWRITE flags for any masks that are different // but only for AT_OBJECT's since that is the only asset type that can @@ -473,20 +475,20 @@ void LLInventoryItem::accumulatePermissionSlamBits(const LLInventoryItem& old_it U32 flags_to_be_set = 0; if(old_permissions.getMaskNextOwner() != getPermissions().getMaskNextOwner()) { - flags_to_be_set |= LLInventoryItem::II_FLAGS_OBJECT_SLAM_PERM; + flags_to_be_set |= LLInventoryItemFlags::II_FLAGS_OBJECT_SLAM_PERM; } if(old_permissions.getMaskEveryone() != getPermissions().getMaskEveryone()) { - flags_to_be_set |= LLInventoryItem::II_FLAGS_OBJECT_PERM_OVERWRITE_EVERYONE; + flags_to_be_set |= LLInventoryItemFlags::II_FLAGS_OBJECT_PERM_OVERWRITE_EVERYONE; } if(old_permissions.getMaskGroup() != getPermissions().getMaskGroup()) { - flags_to_be_set |= LLInventoryItem::II_FLAGS_OBJECT_PERM_OVERWRITE_GROUP; + flags_to_be_set |= LLInventoryItemFlags::II_FLAGS_OBJECT_PERM_OVERWRITE_GROUP; } LLSaleInfo old_sale_info = old_item.getSaleInfo(); if(old_sale_info != getSaleInfo()) { - flags_to_be_set |= LLInventoryItem::II_FLAGS_OBJECT_SLAM_SALE; + flags_to_be_set |= LLInventoryItemFlags::II_FLAGS_OBJECT_SLAM_SALE; } setFlags(getFlags() | flags_to_be_set); } @@ -1304,28 +1306,14 @@ void LLInventoryItem::unpackBinaryBucket(U8* bin_bucket, S32 bin_bucket_size) setCreationDate(now); } -// returns TRUE if a should appear before b -BOOL item_dictionary_sort( LLInventoryItem* a, LLInventoryItem* b ) -{ - return (LLStringUtil::compareDict( a->getName().c_str(), b->getName().c_str() ) < 0); -} - -// returns TRUE if a should appear before b -BOOL item_date_sort( LLInventoryItem* a, LLInventoryItem* b ) -{ - return a->getCreationDate() < b->getCreationDate(); -} - - ///---------------------------------------------------------------------------- /// Class LLInventoryCategory ///---------------------------------------------------------------------------- -LLInventoryCategory::LLInventoryCategory( - const LLUUID& uuid, - const LLUUID& parent_uuid, - LLFolderType::EType preferred_type, - const std::string& name) : +LLInventoryCategory::LLInventoryCategory(const LLUUID& uuid, + const LLUUID& parent_uuid, + LLFolderType::EType preferred_type, + const std::string& name) : LLInventoryObject(uuid, parent_uuid, LLAssetType::AT_CATEGORY, name), mPreferredType(preferred_type) { diff --git a/indra/llinventory/llinventory.h b/indra/llinventory/llinventory.h index 9faecbea85..4c6ac83ab8 100644 --- a/indra/llinventory/llinventory.h +++ b/indra/llinventory/llinventory.h @@ -33,8 +33,6 @@ #ifndef LL_LLINVENTORY_H #define LL_LLINVENTORY_H -#include <functional> - #include "lldarray.h" #include "llfoldertype.h" #include "llinventorytype.h" @@ -45,180 +43,98 @@ #include "llsd.h" #include "lluuid.h" -// consts for Key field in the task inventory update message -extern const U8 TASK_INVENTORY_ITEM_KEY; -extern const U8 TASK_INVENTORY_ASSET_KEY; - -// anonymous enumeration to specify a max inventory buffer size for -// use in packBinaryBucket() -enum -{ - MAX_INVENTORY_BUFFER_SIZE = 1024 -}; - - +class LLMessageSystem; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Class LLInventoryObject // -// This is the base class for inventory objects that handles the -// common code between items and categories. The 'mParentUUID' member -// means the parent category since all inventory objects except each -// user's root category are in some category. Each user's root -// category will have mParentUUID==LLUUID::null. +// Base class for anything in the user's inventory. Handles the common code +// between items and categories. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -class LLMessageSystem; - class LLInventoryObject : public LLRefCount { -protected: - LLUUID mUUID; - LLUUID mParentUUID; - LLAssetType::EType mType; - std::string mName; +public: + typedef std::list<LLPointer<LLInventoryObject> > object_list_t; -protected: - virtual ~LLInventoryObject( void ); - + //-------------------------------------------------------------------- + // Initialization + //-------------------------------------------------------------------- public: MEM_TYPE_NEW(LLMemType::MTYPE_INVENTORY); - LLInventoryObject(const LLUUID& uuid, const LLUUID& parent_uuid, - LLAssetType::EType type, const std::string& name); LLInventoryObject(); + LLInventoryObject(const LLUUID& uuid, + const LLUUID& parent_uuid, + LLAssetType::EType type, + const std::string& name); void copyObject(const LLInventoryObject* other); // LLRefCount requires custom copy +protected: + virtual ~LLInventoryObject(); - // accessors - virtual const LLUUID& getUUID() const; + //-------------------------------------------------------------------- + // Accessors + //-------------------------------------------------------------------- +public: + virtual const LLUUID& getUUID() const; // inventoryID that this item points to + virtual const LLUUID& getLinkedUUID() const; // inventoryID that this item points to, else this item's inventoryID const LLUUID& getParentUUID() const; - virtual const LLUUID& getLinkedUUID() const; // get the inventoryID that this item points to, else this item's inventoryID virtual const std::string& getName() const; virtual LLAssetType::EType getType() const; LLAssetType::EType getActualType() const; // bypasses indirection for linked items BOOL getIsLinkType() const; - // mutators - will not call updateServer(); + + //-------------------------------------------------------------------- + // Mutators + // Will not call updateServer + //-------------------------------------------------------------------- +public: void setUUID(const LLUUID& new_uuid); virtual void rename(const std::string& new_name); void setParent(const LLUUID& new_parent); void setType(LLAssetType::EType type); - // file support - implemented here so that a minimal information - // set can be transmitted between simulator and viewer. -// virtual BOOL importFile(LLFILE* fp); - virtual BOOL exportFile(LLFILE* fp, BOOL include_asset_key = TRUE) const; +private: + // in place correction for inventory name string + void correctInventoryName(std::string& name); + //-------------------------------------------------------------------- + // File Support + // Implemented here so that a minimal information set can be transmitted + // between simulator and viewer. + //-------------------------------------------------------------------- +public: + // virtual BOOL importFile(LLFILE* fp); + virtual BOOL exportFile(LLFILE* fp, BOOL include_asset_key = TRUE) const; virtual BOOL importLegacyStream(std::istream& input_stream); virtual BOOL exportLegacyStream(std::ostream& output_stream, BOOL include_asset_key = TRUE) const; - // virtual methods virtual void removeFromServer(); virtual void updateParentOnServer(BOOL) const; virtual void updateServer(BOOL) const; + + //-------------------------------------------------------------------- + // Member Variables + //-------------------------------------------------------------------- +protected: + LLUUID mUUID; + LLUUID mParentUUID; // Parent category. Root categories have LLUUID::NULL. + LLAssetType::EType mType; + std::string mName; }; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Class LLInventoryItem // -// An inventory item represents something that the current user has in -// their inventory. +// An item in the current user's inventory. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - class LLInventoryItem : public LLInventoryObject { public: typedef LLDynamicArray<LLPointer<LLInventoryItem> > item_array_t; - -protected: - LLPermissions mPermissions; - LLUUID mAssetUUID; - std::string mDescription; - LLSaleInfo mSaleInfo; - LLInventoryType::EType mInventoryType; - U32 mFlags; - time_t mCreationDate; // seconds from 1/1/1970, UTC - -public: - - /** - * Anonymous enumeration for specifying the inventory item flags. - */ - enum - { - // The shared flags at the top are shared among all inventory - // types. After that section, all values of flags are type - // dependent. The shared flags will start at 2^30 and work - // down while item type specific flags will start at 2^0 and - // work up. - II_FLAGS_NONE = 0, - - - // - // Shared flags - // - // - - // This value means that the asset has only one reference in - // the system. If the inventory item is deleted, or the asset - // id updated, then we can remove the old reference. - II_FLAGS_SHARED_SINGLE_REFERENCE = 0x40000000, - - - // - // Landmark flags - // - II_FLAGS_LANDMARK_VISITED = 1, - - // - // Object flags - // - - // flag to indicate that object permissions should have next - // owner perm be more restrictive on rez. We bump this into - // the second byte of the flags since the low byte is used to - // track attachment points. - II_FLAGS_OBJECT_SLAM_PERM = 0x100, - - // flag to indicate that the object sale information has been changed. - II_FLAGS_OBJECT_SLAM_SALE = 0x1000, - - // These flags specify which permissions masks to overwrite - // upon rez. Normally, if no permissions slam (above) or - // overwrite flags are set, the asset's permissions are - // used and the inventory's permissions are ignored. If - // any of these flags are set, the inventory's permissions - // take precedence. - II_FLAGS_OBJECT_PERM_OVERWRITE_BASE = 0x010000, - II_FLAGS_OBJECT_PERM_OVERWRITE_OWNER = 0x020000, - II_FLAGS_OBJECT_PERM_OVERWRITE_GROUP = 0x040000, - II_FLAGS_OBJECT_PERM_OVERWRITE_EVERYONE = 0x080000, - II_FLAGS_OBJECT_PERM_OVERWRITE_NEXT_OWNER = 0x100000, - - // flag to indicate whether an object that is returned is composed - // of muiltiple items or not. - II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS = 0x200000, - - // - // wearables use the low order byte of flags to store the - // EWearableType enumeration found in newview/llwearable.h - // - II_FLAGS_WEARABLES_MASK = 0xff, - - // these bits need to be cleared whenever the asset_id is updated - // on a pre-existing inventory item (DEV-28098 and DEV-30997) - II_FLAGS_PERM_OVERWRITE_MASK = II_FLAGS_OBJECT_SLAM_PERM - | II_FLAGS_OBJECT_SLAM_SALE - | II_FLAGS_OBJECT_PERM_OVERWRITE_BASE - | II_FLAGS_OBJECT_PERM_OVERWRITE_OWNER - | II_FLAGS_OBJECT_PERM_OVERWRITE_GROUP - | II_FLAGS_OBJECT_PERM_OVERWRITE_EVERYONE - | II_FLAGS_OBJECT_PERM_OVERWRITE_NEXT_OWNER, - }; - -protected: - ~LLInventoryItem(); // ref counted + //-------------------------------------------------------------------- + // Initialization + //-------------------------------------------------------------------- public: - MEM_TYPE_NEW(LLMemType::MTYPE_INVENTORY); LLInventoryItem(const LLUUID& uuid, const LLUUID& parent_uuid, @@ -237,10 +153,14 @@ public: // is prohibited LLInventoryItem(const LLInventoryItem* other); virtual void copyItem(const LLInventoryItem* other); // LLRefCount requires custom copy - void generateUUID() { mUUID.generate(); } +protected: + ~LLInventoryItem(); // ref counted - // accessors + //-------------------------------------------------------------------- + // Accessors + //-------------------------------------------------------------------- +public: virtual const LLUUID& getLinkedUUID() const; virtual const LLPermissions& getPermissions() const; virtual const LLUUID& getCreatorUUID() const; @@ -252,8 +172,12 @@ public: virtual time_t getCreationDate() const; virtual U32 getCRC32() const; // really more of a checksum. - // mutators - will not call updateServer(), and will never fail - // (though it may correct to sane values) + //-------------------------------------------------------------------- + // Mutators + // Will not call updateServer and will never fail + // (though it may correct to sane values) + //-------------------------------------------------------------------- +public: void setAssetUUID(const LLUUID& asset_id); void setDescription(const std::string& new_desc); void setSaleInfo(const LLSaleInfo& sale_info); @@ -261,62 +185,68 @@ public: void setInventoryType(LLInventoryType::EType inv_type); void setFlags(U32 flags); void setCreationDate(time_t creation_date_utc); + void setCreator(const LLUUID& creator); // only used for calling cards // Check for changes in permissions masks and sale info - // and set the corresponding bits in mFlags + // and set the corresponding bits in mFlags. void accumulatePermissionSlamBits(const LLInventoryItem& old_item); - - // This is currently only used in the Viewer to handle calling cards - // where the creator is actually used to store the target. - void setCreator(const LLUUID& creator) { mPermissions.setCreator(creator); } - // Put this inventory item onto the current outgoing mesage. It - // assumes you have already called nextBlock(). + // Put this inventory item onto the current outgoing mesage. + // Assumes you have already called nextBlock(). virtual void packMessage(LLMessageSystem* msg) const; - // unpack returns TRUE if the inventory item came through the - // network ok. It uses a simple crc check which is defeatable, but - // we want to detect network mangling somehow. + // Returns TRUE if the inventory item came through the network correctly. + // Uses a simple crc check which is defeatable, but we want to detect + // network mangling somehow. virtual BOOL unpackMessage(LLMessageSystem* msg, const char* block, S32 block_num = 0); - // file support + + //-------------------------------------------------------------------- + // File Support + //-------------------------------------------------------------------- +public: virtual BOOL importFile(LLFILE* fp); virtual BOOL exportFile(LLFILE* fp, BOOL include_asset_key = TRUE) const; - virtual BOOL importLegacyStream(std::istream& input_stream); virtual BOOL exportLegacyStream(std::ostream& output_stream, BOOL include_asset_key = TRUE) const; - // helper functions - - // pack all information needed to reconstruct this item into the given binary bucket. - // perm_override is optional + //-------------------------------------------------------------------- + // Helper Functions + //-------------------------------------------------------------------- +public: + // Pack all information needed to reconstruct this item into the given binary bucket. S32 packBinaryBucket(U8* bin_bucket, LLPermissions* perm_override = NULL) const; void unpackBinaryBucket(U8* bin_bucket, S32 bin_bucket_size); LLSD asLLSD() const; void asLLSD( LLSD& sd ) const; bool fromLLSD(const LLSD& sd); + //-------------------------------------------------------------------- + // Member Variables + //-------------------------------------------------------------------- +protected: + LLPermissions mPermissions; + LLUUID mAssetUUID; + std::string mDescription; + LLSaleInfo mSaleInfo; + LLInventoryType::EType mInventoryType; + U32 mFlags; + time_t mCreationDate; // seconds from 1/1/1970, UTC }; -BOOL item_dictionary_sort(LLInventoryItem* a,LLInventoryItem* b); -BOOL item_date_sort(LLInventoryItem* a, LLInventoryItem* b); - - //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Class LLInventoryCategory // -// An instance of this class represents a category of inventory -// items. Users come with a set of default categories, and can create -// new ones as needed. +// A category/folder of inventory items. Users come with a set of default +// categories, and can create new ones as needed. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - class LLInventoryCategory : public LLInventoryObject { public: typedef LLDynamicArray<LLPointer<LLInventoryCategory> > cat_array_t; -protected: - ~LLInventoryCategory(); - + //-------------------------------------------------------------------- + // Initialization + //-------------------------------------------------------------------- public: MEM_TYPE_NEW(LLMemType::MTYPE_INVENTORY); LLInventoryCategory(const LLUUID& uuid, const LLUUID& parent_uuid, @@ -325,40 +255,49 @@ public: LLInventoryCategory(); LLInventoryCategory(const LLInventoryCategory* other); void copyCategory(const LLInventoryCategory* other); // LLRefCount requires custom copy +protected: + ~LLInventoryCategory(); - // accessors and mutators + //-------------------------------------------------------------------- + // Accessors And Mutators + //-------------------------------------------------------------------- +public: LLFolderType::EType getPreferredType() const; void setPreferredType(LLFolderType::EType type); - // For messaging system support - virtual void packMessage(LLMessageSystem* msg) const; - virtual void unpackMessage(LLMessageSystem* msg, const char* block, S32 block_num = 0); - LLSD asLLSD() const; bool fromLLSD(const LLSD& sd); - // file support + //-------------------------------------------------------------------- + // Messaging + //-------------------------------------------------------------------- +public: + virtual void packMessage(LLMessageSystem* msg) const; + virtual void unpackMessage(LLMessageSystem* msg, const char* block, S32 block_num = 0); + + //-------------------------------------------------------------------- + // File Support + //-------------------------------------------------------------------- +public: virtual BOOL importFile(LLFILE* fp); virtual BOOL exportFile(LLFILE* fp, BOOL include_asset_key = TRUE) const; - virtual BOOL importLegacyStream(std::istream& input_stream); virtual BOOL exportLegacyStream(std::ostream& output_stream, BOOL include_asset_key = TRUE) const; + //-------------------------------------------------------------------- + // Member Variables + //-------------------------------------------------------------------- protected: - // May be the type that this category was "meant" to hold (although it may hold any type). - LLFolderType::EType mPreferredType; + LLFolderType::EType mPreferredType; // Type that this category was "meant" to hold (although it may hold any type). }; //----------------------------------------------------------------------------- -// Useful bits +// Convertors +// +// These functions convert between structured data and an inventory +// item, appropriate for serialization. //----------------------------------------------------------------------------- - -typedef std::list<LLPointer<LLInventoryObject> > InventoryObjectList; - -// These functions convert between structured data and an inventory -// item, appropriate for serialization. LLSD ll_create_sd_from_inventory_item(LLPointer<LLInventoryItem> item); -//LLPointer<LLInventoryItem> ll_create_item_from_sd(const LLSD& sd_item); LLSD ll_create_sd_from_inventory_category(LLPointer<LLInventoryCategory> cat); LLPointer<LLInventoryCategory> ll_create_category_from_sd(const LLSD& sd_cat); diff --git a/indra/llinventory/llinventorydefines.cpp b/indra/llinventory/llinventorydefines.cpp new file mode 100644 index 0000000000..a9610d4d4b --- /dev/null +++ b/indra/llinventory/llinventorydefines.cpp @@ -0,0 +1,37 @@ +/** + * @file llinventorydefines.cpp + * @brief Implementation of the inventory defines. + * + * $LicenseInfo:firstyear=2001&license=viewergpl$ + * + * Copyright (c) 2001-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "linden_common.h" +#include "llinventorydefines.h" + +const U8 TASK_INVENTORY_ITEM_KEY = 0; +const U8 TASK_INVENTORY_ASSET_KEY = 1; diff --git a/indra/llinventory/llinventorydefines.h b/indra/llinventory/llinventorydefines.h new file mode 100644 index 0000000000..67e629c546 --- /dev/null +++ b/indra/llinventory/llinventorydefines.h @@ -0,0 +1,106 @@ +/** + * @file llinventorydefines.h + * @brief LLInventoryDefines + * + * $LicenseInfo:firstyear=2001&license=viewergpl$ + * + * Copyright (c) 2001-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLINVENTORYDEFINES_H +#define LL_LLINVENTORYDEFINES_H + +// Consts for "key" field in the task inventory update message +extern const U8 TASK_INVENTORY_ITEM_KEY; +extern const U8 TASK_INVENTORY_ASSET_KEY; + +// Max inventory buffer size (for use in packBinaryBucket) +enum +{ + MAX_INVENTORY_BUFFER_SIZE = 1024 +}; + +//-------------------------------------------------------------------- +// Inventory item flags enums +// The shared flags at the top are shared among all inventory +// types. After that section, all values of flags are type +// dependent. The shared flags will start at 2^30 and work +// down while item type specific flags will start at 2^0 and work up. +//-------------------------------------------------------------------- +class LLInventoryItemFlags +{ +public: + enum EType + { + II_FLAGS_NONE = 0, + + II_FLAGS_SHARED_SINGLE_REFERENCE = 0x40000000, + // The asset has only one reference in the system. If the + // inventory item is deleted, or the assetid updated, then we + // can remove the old reference. + + II_FLAGS_LANDMARK_VISITED = 1, + + II_FLAGS_OBJECT_SLAM_PERM = 0x100, + // Object permissions should have next owner perm be more + // restrictive on rez. We bump this into the second byte of the + // flags since the low byte is used to track attachment points. + + II_FLAGS_OBJECT_SLAM_SALE = 0x1000, + // The object sale information has been changed. + + II_FLAGS_OBJECT_PERM_OVERWRITE_BASE = 0x010000, + II_FLAGS_OBJECT_PERM_OVERWRITE_OWNER = 0x020000, + II_FLAGS_OBJECT_PERM_OVERWRITE_GROUP = 0x040000, + II_FLAGS_OBJECT_PERM_OVERWRITE_EVERYONE = 0x080000, + II_FLAGS_OBJECT_PERM_OVERWRITE_NEXT_OWNER = 0x100000, + // Specify which permissions masks to overwrite + // upon rez. Normally, if no permissions slam (above) or + // overwrite flags are set, the asset's permissions are + // used and the inventory's permissions are ignored. If + // any of these flags are set, the inventory's permissions + // take precedence. + + II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS = 0x200000, + // Whether a returned object is composed of multiple items. + + II_FLAGS_WEARABLES_MASK = 0xff, + // Wearables use the low order byte of flags to store the + // LLWearableType::EType enumeration found in newview/llwearable.h + + II_FLAGS_PERM_OVERWRITE_MASK = (II_FLAGS_OBJECT_SLAM_PERM | + II_FLAGS_OBJECT_SLAM_SALE | + II_FLAGS_OBJECT_PERM_OVERWRITE_BASE | + II_FLAGS_OBJECT_PERM_OVERWRITE_OWNER | + II_FLAGS_OBJECT_PERM_OVERWRITE_GROUP | + II_FLAGS_OBJECT_PERM_OVERWRITE_EVERYONE | + II_FLAGS_OBJECT_PERM_OVERWRITE_NEXT_OWNER), + // These bits need to be cleared whenever the asset_id is updated + // on a pre-existing inventory item (DEV-28098 and DEV-30997) + }; +}; + +#endif // LL_LLINVENTORYDEFINES_H diff --git a/indra/llinventory/llinventorytype.cpp b/indra/llinventory/llinventorytype.cpp index 4ef5df0b28..c050f20a9d 100644 --- a/indra/llinventory/llinventorytype.cpp +++ b/indra/llinventory/llinventorytype.cpp @@ -181,6 +181,10 @@ bool LLInventoryType::cannotRestrictPermissions(LLInventoryType::EType type) bool inventory_and_asset_types_match(LLInventoryType::EType inventory_type, LLAssetType::EType asset_type) { + // Links can be of any inventory type. + if (LLAssetType::lookupIsLinkType(asset_type)) + return true; + const InventoryEntry *entry = LLInventoryDictionary::getInstance()->lookup(inventory_type); if (!entry) return false; diff --git a/indra/llinventory/llinventorytype.h b/indra/llinventory/llinventorytype.h index e515b8a304..20da954002 100644 --- a/indra/llinventory/llinventorytype.h +++ b/indra/llinventory/llinventorytype.h @@ -75,7 +75,6 @@ public: // machine transation between type and strings static EType lookup(const std::string& name); static const std::string &lookup(EType type); - // translation from a type to a human readable form. static const std::string &lookupHumanReadable(EType type); diff --git a/indra/llinventory/llparcel.cpp b/indra/llinventory/llparcel.cpp index ec21ae40e7..b08cb28218 100644 --- a/indra/llinventory/llparcel.cpp +++ b/indra/llinventory/llparcel.cpp @@ -452,7 +452,7 @@ BOOL LLParcel::allowTerraformBy(const LLUUID &agent_id) const bool LLParcel::isAgentBlockedFromParcel(LLParcel* parcelp, const LLUUID& agent_id, - const std::vector<LLUUID>& group_ids, + const uuid_vec_t& group_ids, const BOOL is_agent_identified, const BOOL is_agent_transacted, const BOOL is_agent_ageverified) diff --git a/indra/llinventory/llparcel.h b/indra/llinventory/llparcel.h index 2a9a596912..4ee9d9b40f 100644 --- a/indra/llinventory/llparcel.h +++ b/indra/llinventory/llparcel.h @@ -258,7 +258,7 @@ public: void setMediaURLResetTimer(F32 time); virtual void setLocalID(S32 local_id); - // blow away all the extra crap lurking in parcels, including urls, access lists, etc + // blow away all the extra stuff lurking in parcels, including urls, access lists, etc void clearParcel(); // This value is not persisted out to the parcel file, it is only @@ -538,7 +538,7 @@ public: static bool isAgentBlockedFromParcel(LLParcel* parcelp, const LLUUID& agent_id, - const std::vector<LLUUID>& group_ids, + const uuid_vec_t& group_ids, const BOOL is_agent_identified, const BOOL is_agent_transacted, const BOOL is_agent_ageverified); diff --git a/indra/llinventory/llpermissions.cpp b/indra/llinventory/llpermissions.cpp index d2e5034734..9683252dc4 100644 --- a/indra/llinventory/llpermissions.cpp +++ b/indra/llinventory/llpermissions.cpp @@ -479,7 +479,7 @@ BOOL LLPermissions::setNextOwnerBits(const LLUUID& agent, const LLUUID& group, B return ownership; } -BOOL LLPermissions::allowOperationBy(PermissionBit op, const LLUUID& requester, const LLUUID& group) const +bool LLPermissions::allowOperationBy(PermissionBit op, const LLUUID& requester, const LLUUID& group) const { if(requester.isNull()) { diff --git a/indra/llinventory/llpermissions.h b/indra/llinventory/llpermissions.h index d5a0881c8f..fa20d5c214 100644 --- a/indra/llinventory/llpermissions.h +++ b/indra/llinventory/llpermissions.h @@ -149,7 +149,7 @@ public: const LLUUID& getGroup() const { return mGroup; } // return the agent_id of the last agent owner. Only returns - // LLUUID::null if there has never been a previous owner. + // LLUUID::null if there has never been a previous owner (*note: this is apparently not true, say for textures in inventory, it may return LLUUID::null even if there was a previous owner). const LLUUID& getLastOwner() const { return mLastOwner; } U32 getMaskBase() const { return mMaskBase; } @@ -272,18 +272,18 @@ public: // They also return true if the object isn't owned, or the // requesting agent is a system agent. See llpermissionsflags.h // for bits. - BOOL allowOperationBy(PermissionBit op, const LLUUID& agent, const LLUUID& group = LLUUID::null) const; + bool allowOperationBy(PermissionBit op, const LLUUID& agent, const LLUUID& group = LLUUID::null) const; - inline BOOL allowModifyBy(const LLUUID &agent_id) const; - inline BOOL allowCopyBy(const LLUUID& agent_id) const; - inline BOOL allowMoveBy(const LLUUID& agent_id) const; - inline BOOL allowModifyBy(const LLUUID &agent_id, const LLUUID& group) const; - inline BOOL allowCopyBy(const LLUUID& agent_id, const LLUUID& group) const; - inline BOOL allowMoveBy(const LLUUID &agent_id, const LLUUID &group) const; + inline bool allowModifyBy(const LLUUID &agent_id) const; + inline bool allowCopyBy(const LLUUID& agent_id) const; + inline bool allowMoveBy(const LLUUID& agent_id) const; + inline bool allowModifyBy(const LLUUID &agent_id, const LLUUID& group) const; + inline bool allowCopyBy(const LLUUID& agent_id, const LLUUID& group) const; + inline bool allowMoveBy(const LLUUID &agent_id, const LLUUID &group) const; // This somewhat specialized function is meant for testing if the // current owner is allowed to transfer to the specified agent id. - inline BOOL allowTransferTo(const LLUUID &agent_id) const; + inline bool allowTransferTo(const LLUUID &agent_id) const; // // DEPRECATED. @@ -336,38 +336,38 @@ public: }; // Inlines -BOOL LLPermissions::allowModifyBy(const LLUUID& agent, const LLUUID& group) const +bool LLPermissions::allowModifyBy(const LLUUID& agent, const LLUUID& group) const { return allowOperationBy(PERM_MODIFY, agent, group); } -BOOL LLPermissions::allowCopyBy(const LLUUID& agent, const LLUUID& group) const +bool LLPermissions::allowCopyBy(const LLUUID& agent, const LLUUID& group) const { return allowOperationBy(PERM_COPY, agent, group); } -BOOL LLPermissions::allowMoveBy(const LLUUID& agent, const LLUUID& group) const +bool LLPermissions::allowMoveBy(const LLUUID& agent, const LLUUID& group) const { return allowOperationBy(PERM_MOVE, agent, group); } -BOOL LLPermissions::allowModifyBy(const LLUUID& agent) const +bool LLPermissions::allowModifyBy(const LLUUID& agent) const { return allowOperationBy(PERM_MODIFY, agent, LLUUID::null); } -BOOL LLPermissions::allowCopyBy(const LLUUID& agent) const +bool LLPermissions::allowCopyBy(const LLUUID& agent) const { return allowOperationBy(PERM_COPY, agent, LLUUID::null); } -BOOL LLPermissions::allowMoveBy(const LLUUID& agent) const +bool LLPermissions::allowMoveBy(const LLUUID& agent) const { return allowOperationBy(PERM_MOVE, agent, LLUUID::null); } -BOOL LLPermissions::allowTransferTo(const LLUUID &agent_id) const +bool LLPermissions::allowTransferTo(const LLUUID &agent_id) const { if (mIsGroupOwned) { diff --git a/indra/llmath/llmath.h b/indra/llmath/llmath.h index 209b506c30..c3c15e1374 100644 --- a/indra/llmath/llmath.h +++ b/indra/llmath/llmath.h @@ -61,11 +61,11 @@ #endif // Single Precision Floating Point Routines -#ifndef fsqrtf -#define fsqrtf(x) ((F32)sqrt((F64)(x))) -#endif #ifndef sqrtf -#define sqrtf(x) ((F32)sqrt((F64)(x))) +#define sqrtf(x) ((F32)sqrt((F64)(x))) +#endif +#ifndef fsqrtf +#define fsqrtf(x) sqrtf(x) #endif #ifndef cosf @@ -78,11 +78,14 @@ #define tanf(x) ((F32)tan((F64)(x))) #endif #ifndef acosf -#define acosf(x) ((F32)acos((F64)(x))) +#define acosf(x) ((F32)acos((F64)(x))) #endif #ifndef powf -#define powf(x,y) ((F32)pow((F64)(x),(F64)(y))) +#define powf(x,y) ((F32)pow((F64)(x),(F64)(y))) +#endif +#ifndef expf +#define expf(x) ((F32)exp((F64)(x))) #endif const F32 GRAVITY = -9.8f; diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp index df4c618ac1..34348230b6 100644 --- a/indra/llmath/llvolume.cpp +++ b/indra/llmath/llvolume.cpp @@ -3822,6 +3822,7 @@ BOOL LLVolume::cleanupTriangleData( const S32 num_input_vertices, // Generate the vertex mapping and the list of vertices without // duplicates. This will crash if there are no vertices. + llassert(num_input_vertices > 0); // check for no vertices! S32 *vertex_mapping = new S32[num_input_vertices]; LLVector3 *new_vertices = new LLVector3[num_input_vertices]; LLVertexIndexPair *prev_pairp = NULL; @@ -4520,15 +4521,65 @@ BOOL LLVolumeFace::createUnCutCubeCap(LLVolume* volume, BOOL partial_build) if (!partial_build) { - int idxs[] = {0,1,(grid_size+1)+1,(grid_size+1)+1,(grid_size+1),0}; - for(int gx = 0;gx<grid_size;gx++){ - for(int gy = 0;gy<grid_size;gy++){ - if (mTypeMask & TOP_MASK){ - for(int i=5;i>=0;i--)mIndices.push_back(vtop+(gy*(grid_size+1))+gx+idxs[i]); - }else{ - for(int i=0;i<6;i++)mIndices.push_back(vtop+(gy*(grid_size+1))+gx+idxs[i]); + mTriStrip.clear(); + S32 idxs[] = {0,1,(grid_size+1)+1,(grid_size+1)+1,(grid_size+1),0}; + for(S32 gx = 0;gx<grid_size;gx++) + { + + for(S32 gy = 0;gy<grid_size;gy++) + { + if (mTypeMask & TOP_MASK) + { + for(S32 i=5;i>=0;i--) + { + mIndices.push_back(vtop+(gy*(grid_size+1))+gx+idxs[i]); + } + + if (gy == 0) + { + mTriStrip.push_back((gx+1)*(grid_size+1)); + mTriStrip.push_back((gx+1)*(grid_size+1)); + mTriStrip.push_back(gx*(grid_size+1)); + } + + mTriStrip.push_back(gy+1+(gx+1)*(grid_size+1)); + mTriStrip.push_back(gy+1+gx*(grid_size+1)); + + + if (gy == grid_size-1) + { + mTriStrip.push_back(gy+1+gx*(grid_size+1)); + } + } + else + { + for(S32 i=0;i<6;i++) + { + mIndices.push_back(vtop+(gy*(grid_size+1))+gx+idxs[i]); + } + + if (gy == 0) + { + mTriStrip.push_back(gx*(grid_size+1)); + mTriStrip.push_back(gx*(grid_size+1)); + mTriStrip.push_back((gx+1)*(grid_size+1)); + } + + mTriStrip.push_back(gy+1+gx*(grid_size+1)); + mTriStrip.push_back(gy+1+(gx+1)*(grid_size+1)); + + if (gy == grid_size-1) + { + mTriStrip.push_back(gy+1+(gx+1)*(grid_size+1)); + } } } + + } + + if (mTriStrip.size()%2 == 1) + { + mTriStrip.push_back(mTriStrip[mTriStrip.size()-1]); } } @@ -4770,6 +4821,8 @@ BOOL LLVolumeFace::createCap(LLVolume* volume, BOOL partial_build) pt2--; } } + + makeTriStrip(); } else { @@ -4874,67 +4927,108 @@ BOOL LLVolumeFace::createCap(LLVolume* volume, BOOL partial_build) pt2--; } } + + makeTriStrip(); } } else { // Not hollow, generate the triangle fan. + U16 v1 = 2; + U16 v2 = 1; + if (mTypeMask & TOP_MASK) { - if (mTypeMask & OPEN_MASK) - { - // SOLID OPEN TOP - // Generate indices - // This is a tri-fan, so we reuse the same first point for all triangles. - for (S32 i = 0; i < (num_vertices - 2); i++) - { - mIndices[3*i] = num_vertices - 1; - mIndices[3*i+1] = i; - mIndices[3*i+2] = i + 1; - } - } - else - { - // SOLID CLOSED TOP - for (S32 i = 0; i < (num_vertices - 2); i++) - { - //MSMSM fix these caps but only for the un-cut case - mIndices[3*i] = num_vertices - 1; - mIndices[3*i+1] = i; - mIndices[3*i+2] = i + 1; - } - } + v1 = 1; + v2 = 2; + } + + for (S32 i = 0; i < (num_vertices - 2); i++) + { + mIndices[3*i] = num_vertices - 1; + mIndices[3*i+v1] = i; + mIndices[3*i+v2] = i + 1; + } + + //make tri strip + if (mTypeMask & OPEN_MASK) + { + makeTriStrip(); } else { - if (mTypeMask & OPEN_MASK) + S32 j = num_vertices-2; + if (mTypeMask & TOP_MASK) { - // SOLID OPEN BOTTOM - // Generate indices - // This is a tri-fan, so we reuse the same first point for all triangles. - for (S32 i = 0; i < (num_vertices - 2); i++) + mTriStrip.push_back(0); + for (S32 i = 0; i <= j; ++i) { - mIndices[3*i] = num_vertices - 1; - mIndices[3*i+1] = i + 1; - mIndices[3*i+2] = i; + mTriStrip.push_back(i); + if (i != j) + { + mTriStrip.push_back(j); + } + --j; } } else { - // SOLID CLOSED BOTTOM - for (S32 i = 0; i < (num_vertices - 2); i++) + mTriStrip.push_back(j); + for (S32 i = 0; i <= j; ++i) { - //MSMSM fix these caps but only for the un-cut case - mIndices[3*i] = num_vertices - 1; - mIndices[3*i+1] = i + 1; - mIndices[3*i+2] = i; + if (i != j) + { + mTriStrip.push_back(j); + } + mTriStrip.push_back(i); + --j; } } + + mTriStrip.push_back(mTriStrip[mTriStrip.size()-1]); + + if (mTriStrip.size()%2 == 1) + { + mTriStrip.push_back(mTriStrip[mTriStrip.size()-1]); + } } } + return TRUE; } +void LLVolumeFace::makeTriStrip() +{ + for (U32 i = 0; i < mIndices.size(); i+=3) + { + U16 i0 = mIndices[i]; + U16 i1 = mIndices[i+1]; + U16 i2 = mIndices[i+2]; + + if ((i/3)%2 == 1) + { + mTriStrip.push_back(i0); + mTriStrip.push_back(i0); + mTriStrip.push_back(i1); + mTriStrip.push_back(i2); + mTriStrip.push_back(i2); + } + else + { + mTriStrip.push_back(i2); + mTriStrip.push_back(i2); + mTriStrip.push_back(i1); + mTriStrip.push_back(i0); + mTriStrip.push_back(i0); + } + } + + if (mTriStrip.size()%2 == 1) + { + mTriStrip.push_back(mTriStrip[mTriStrip.size()-1]); + } +} + void LLVolumeFace::createBinormals() { LLMemType m1(LLMemType::MTYPE_VOLUME); @@ -5135,9 +5229,14 @@ BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build) if (!partial_build) { + mTriStrip.clear(); + // Now we generate the indices. for (t = 0; t < (mNumT-1); t++) { + //prepend terminating index to strip + mTriStrip.push_back(mNumS*t); + for (s = 0; s < (mNumS-1); s++) { mIndices[cur_index++] = s + mNumS*t; //bottom left @@ -5147,6 +5246,14 @@ BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build) mIndices[cur_index++] = s+1 + mNumS*t; //bottom right mIndices[cur_index++] = s+1 + mNumS*(t+1); //top right + if (s == 0) + { + mTriStrip.push_back(s+mNumS*t); + mTriStrip.push_back(s+mNumS*(t+1)); + } + mTriStrip.push_back(s+1+mNumS*t); + mTriStrip.push_back(s+1+mNumS*(t+1)); + mEdge[cur_edge++] = (mNumS-1)*2*t+s*2+1; //bottom left/top right neighbor face if (t < mNumT-2) { //top right/top left neighbor face mEdge[cur_edge++] = (mNumS-1)*2*(t+1)+s*2+1; @@ -5187,6 +5294,13 @@ BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build) } mEdge[cur_edge++] = (mNumS-1)*2*t+s*2; //top right/bottom left neighbor face } + //append terminating vertex to strip + mTriStrip.push_back(mNumS-1+mNumS*(t+1)); + } + + if (mTriStrip.size()%2 == 1) + { + mTriStrip.push_back(mTriStrip[mTriStrip.size()-1]); } } diff --git a/indra/llmath/llvolume.h b/indra/llmath/llvolume.h index 871b334452..d9f80f0e30 100644 --- a/indra/llmath/llvolume.h +++ b/indra/llmath/llvolume.h @@ -798,7 +798,8 @@ public: BOOL create(LLVolume* volume, BOOL partial_build = FALSE); void createBinormals(); - + void makeTriStrip(); + class VertexData { public: @@ -839,6 +840,7 @@ public: std::vector<VertexData> mVertices; std::vector<U16> mIndices; + std::vector<U16> mTriStrip; std::vector<S32> mEdge; private: diff --git a/indra/llmath/tests/mathmisc_test.cpp b/indra/llmath/tests/mathmisc_test.cpp index ea42f6e001..68d9ddc0fe 100644 --- a/indra/llmath/tests/mathmisc_test.cpp +++ b/indra/llmath/tests/mathmisc_test.cpp @@ -334,6 +334,8 @@ namespace tut template<> template<> void sphere_object::test<2>() { + skip("See SNOW-620. Neither the test nor the code being tested seem good. Also sim-only."); + // test LLSphere::getBoundingSphere() S32 number_of_tests = 100; S32 number_of_spheres = 10; diff --git a/indra/llmath/v2math.h b/indra/llmath/v2math.h index 9fef8851cc..65f3714313 100644 --- a/indra/llmath/v2math.h +++ b/indra/llmath/v2math.h @@ -70,6 +70,8 @@ class LLVector2 void setVec(const LLVector2 &vec); // deprecated void setVec(const F32 *vec); // deprecated + inline bool isFinite() const; // checks to see if all values of LLVector2 are finite + F32 length() const; // Returns magnitude of LLVector2 F32 lengthSquared() const; // Returns magnitude squared of LLVector2 F32 normalize(); // Normalizes and returns the magnitude of LLVector2 @@ -215,6 +217,7 @@ inline void LLVector2::setVec(const F32 *vec) mV[VY] = vec[VY]; } + // LLVector2 Magnitude and Normalization Functions inline F32 LLVector2::length(void) const @@ -247,6 +250,12 @@ inline F32 LLVector2::normalize(void) return (mag); } +// checker +inline bool LLVector2::isFinite() const +{ + return (llfinite(mV[VX]) && llfinite(mV[VY])); +} + // deprecated inline F32 LLVector2::magVec(void) const { diff --git a/indra/llmessage/llares.cpp b/indra/llmessage/llares.cpp index 00e77d20e9..5b7e5138ef 100644 --- a/indra/llmessage/llares.cpp +++ b/indra/llmessage/llares.cpp @@ -108,7 +108,8 @@ LLAres::LLAres() : mInitSuccess(false), mListener(new LLAresListener(this)) { - if (ares_init(&chan_) != ARES_SUCCESS) + if (ares_library_init( ARES_LIB_INIT_ALL ) != ARES_SUCCESS || + ares_init(&chan_) != ARES_SUCCESS) { llwarns << "Could not succesfully initialize ares!" << llendl; return; @@ -120,6 +121,7 @@ LLAres::LLAres() : LLAres::~LLAres() { ares_destroy(chan_); + ares_library_cleanup(); } void LLAres::cancel() @@ -473,7 +475,7 @@ bool LLAres::process(U64 timeout) ll_init_apr(); } - int socks[ARES_GETSOCK_MAXNUM]; + ares_socket_t socks[ARES_GETSOCK_MAXNUM]; apr_pollfd_t aprFds[ARES_GETSOCK_MAXNUM]; apr_int32_t nsds = 0; int nactive = 0; diff --git a/indra/llmessage/llassetstorage.cpp b/indra/llmessage/llassetstorage.cpp index 0ab1081200..970b6747f7 100644 --- a/indra/llmessage/llassetstorage.cpp +++ b/indra/llmessage/llassetstorage.cpp @@ -283,28 +283,30 @@ LLEstateAssetRequest::~LLEstateAssetRequest() // TODO: rework tempfile handling? -LLAssetStorage::LLAssetStorage(LLMessageSystem *msg, LLXferManager *xfer, LLVFS *vfs, const LLHost &upstream_host) +LLAssetStorage::LLAssetStorage(LLMessageSystem *msg, LLXferManager *xfer, LLVFS *vfs, LLVFS *static_vfs, const LLHost &upstream_host) { - _init(msg, xfer, vfs, upstream_host); + _init(msg, xfer, vfs, static_vfs, upstream_host); } LLAssetStorage::LLAssetStorage(LLMessageSystem *msg, LLXferManager *xfer, - LLVFS *vfs) + LLVFS *vfs, LLVFS *static_vfs) { - _init(msg, xfer, vfs, LLHost::invalid); + _init(msg, xfer, vfs, static_vfs, LLHost::invalid); } void LLAssetStorage::_init(LLMessageSystem *msg, LLXferManager *xfer, LLVFS *vfs, + LLVFS *static_vfs, const LLHost &upstream_host) { mShutDown = FALSE; mMessageSys = msg; mXferManager = xfer; mVFS = vfs; + mStaticVFS = static_vfs; setUpstream(upstream_host); msg->setHandlerFuncFast(_PREHASH_AssetUploadComplete, processUploadComplete, (void **)this); @@ -396,7 +398,33 @@ void LLAssetStorage::_cleanupRequests(BOOL all, S32 error) BOOL LLAssetStorage::hasLocalAsset(const LLUUID &uuid, const LLAssetType::EType type) { - return mVFS->getExists(uuid, type); + return mStaticVFS->getExists(uuid, type) || mVFS->getExists(uuid, type); +} + +bool LLAssetStorage::findInStaticVFSAndInvokeCallback(const LLUUID& uuid, LLAssetType::EType type, + LLGetAssetCallback callback, void *user_data) +{ + BOOL exists = mStaticVFS->getExists(uuid, type); + if (exists) + { + LLVFile file(mStaticVFS, uuid, type); + U32 size = file.getSize(); + if (size > 0) + { + // we've already got the file + if (callback) + { + callback(mStaticVFS, uuid, type, user_data, LL_ERR_NOERR, LL_EXSTAT_VFS_CACHED); + } + return true; + } + else + { + llwarns << "Asset vfile " << uuid << ":" << type + << " found in static cache with bad size " << file.getSize() << ", ignoring" << llendl; + } + } + return false; } /////////////////////////////////////////////////////////////////////////// @@ -404,12 +432,15 @@ BOOL LLAssetStorage::hasLocalAsset(const LLUUID &uuid, const LLAssetType::EType /////////////////////////////////////////////////////////////////////////// // IW - uuid is passed by value to avoid side effects, please don't re-add & -void LLAssetStorage::getAssetData(const LLUUID uuid, LLAssetType::EType type, void (*callback)(LLVFS *vfs, const LLUUID&, LLAssetType::EType, void *, S32, LLExtStat), void *user_data, BOOL is_priority) +void LLAssetStorage::getAssetData(const LLUUID uuid, LLAssetType::EType type, LLGetAssetCallback callback, void *user_data, BOOL is_priority) { lldebugs << "LLAssetStorage::getAssetData() - " << uuid << "," << LLAssetType::lookup(type) << llendl; + llinfos << "ASSET_TRACE requesting " << uuid << " type " << LLAssetType::lookup(type) << llendl; + if (mShutDown) { + llinfos << "ASSET_TRACE cancelled " << uuid << " type " << LLAssetType::lookup(type) << " shutting down" << llendl; return; // don't get the asset or do any callbacks, we are shutting down } @@ -423,11 +454,30 @@ void LLAssetStorage::getAssetData(const LLUUID uuid, LLAssetType::EType type, vo return; } + // Try static VFS first. + if (findInStaticVFSAndInvokeCallback(uuid,type,callback,user_data)) + { + llinfos << "ASSET_TRACE asset " << uuid << " found in static VFS" << llendl; + return; + } + BOOL exists = mVFS->getExists(uuid, type); LLVFile file(mVFS, uuid, type); U32 size = exists ? file.getSize() : 0; - if (size < 1) + if (size > 0) + { + // we've already got the file + // theoretically, partial files w/o a pending request shouldn't happen + // unless there's a weird error + if (callback) + { + callback(mVFS, uuid, type, user_data, LL_ERR_NOERR, LL_EXSTAT_VFS_CACHED); + } + + llinfos << "ASSET_TRACE asset " << uuid << " found in VFS" << llendl; + } + else { if (exists) { @@ -466,16 +516,7 @@ void LLAssetStorage::getAssetData(const LLUUID uuid, LLAssetType::EType type, vo // This can be overridden by subclasses _queueDataRequest(uuid, type, callback, user_data, duplicate, is_priority); } - else - { - // we've already got the file - // theoretically, partial files w/o a pending request shouldn't happen - // unless there's a weird error - if (callback) - { - callback(mVFS, uuid, type, user_data, LL_ERR_NOERR, LL_EXSTAT_VFS_CACHED); - } - } + } void LLAssetStorage::_queueDataRequest(const LLUUID& uuid, LLAssetType::EType atype, @@ -528,6 +569,8 @@ void LLAssetStorage::downloadCompleteCallback( LLAssetType::EType file_type, void* user_data, LLExtStat ext_status) { + llinfos << "ASSET_TRACE asset " << file_id << " downloadCompleteCallback" << llendl; + lldebugs << "LLAssetStorage::downloadCompleteCallback() for " << file_id << "," << LLAssetType::lookup(file_type) << llendl; LLAssetRequest* req = (LLAssetRequest*)user_data; @@ -616,11 +659,27 @@ void LLAssetStorage::getEstateAsset(const LLHost &object_sim, const LLUUID &agen return; } + // Try static VFS first. + if (findInStaticVFSAndInvokeCallback(asset_id,atype,callback,user_data)) + { + return; + } + BOOL exists = mVFS->getExists(asset_id, atype); LLVFile file(mVFS, asset_id, atype); U32 size = exists ? file.getSize() : 0; - if (size < 1) + if (size > 0) + { + // we've already got the file + // theoretically, partial files w/o a pending request shouldn't happen + // unless there's a weird error + if (callback) + { + callback(mVFS, asset_id, atype, user_data, LL_ERR_NOERR, LL_EXSTAT_VFS_CACHED); + } + } + else { if (exists) { @@ -671,16 +730,6 @@ void LLAssetStorage::getEstateAsset(const LLHost &object_sim, const LLUUID &agen } } } - else - { - // we've already got the file - // theoretically, partial files w/o a pending request shouldn't happen - // unless there's a weird error - if (callback) - { - callback(mVFS, asset_id, atype, user_data, LL_ERR_NOERR, LL_EXSTAT_VFS_CACHED); - } - } } void LLAssetStorage::downloadEstateAssetCompleteCallback( @@ -747,6 +796,12 @@ void LLAssetStorage::getInvItemAsset(const LLHost &object_sim, const LLUUID &age if(asset_id.notNull()) { + // Try static VFS first. + if (findInStaticVFSAndInvokeCallback( asset_id, atype, callback, user_data)) + { + return; + } + exists = mVFS->getExists(asset_id, atype); LLVFile file(mVFS, asset_id, atype); size = exists ? file.getSize() : 0; @@ -758,7 +813,17 @@ void LLAssetStorage::getInvItemAsset(const LLHost &object_sim, const LLUUID &age } - if (size < 1) + if (size > 0) + { + // we've already got the file + // theoretically, partial files w/o a pending request shouldn't happen + // unless there's a weird error + if (callback) + { + callback(mVFS, asset_id, atype, user_data, LL_ERR_NOERR, LL_EXSTAT_VFS_CACHED); + } + } + else { // See whether we should talk to the object's originating sim, // or the upstream provider. @@ -807,16 +872,6 @@ void LLAssetStorage::getInvItemAsset(const LLHost &object_sim, const LLUUID &age } } } - else - { - // we've already got the file - // theoretically, partial files w/o a pending request shouldn't happen - // unless there's a weird error - if (callback) - { - callback(mVFS, asset_id, atype, user_data, LL_ERR_NOERR, LL_EXSTAT_VFS_CACHED); - } - } } diff --git a/indra/llmessage/llassetstorage.h b/indra/llmessage/llassetstorage.h index 83cfdf6110..e97b398ca7 100644 --- a/indra/llmessage/llassetstorage.h +++ b/indra/llmessage/llassetstorage.h @@ -218,6 +218,7 @@ class LLAssetStorage : public LLTempAssetStorage public: // VFS member is public because static child methods need it :( LLVFS *mVFS; + LLVFS *mStaticVFS; typedef void (*LLStoreAssetCallback)(const LLUUID &asset_id, void *user_data, S32 status, LLExtStat ext_status); enum ERequestType @@ -247,10 +248,10 @@ protected: public: LLAssetStorage(LLMessageSystem *msg, LLXferManager *xfer, - LLVFS *vfs, const LLHost &upstream_host); + LLVFS *vfs, LLVFS *static_vfs, const LLHost &upstream_host); LLAssetStorage(LLMessageSystem *msg, LLXferManager *xfer, - LLVFS *vfs); + LLVFS *vfs, LLVFS *static_vfs); virtual ~LLAssetStorage(); void setUpstream(const LLHost &upstream_host); @@ -315,6 +316,9 @@ public: void markAssetToxic( const LLUUID& uuid ); protected: + bool findInStaticVFSAndInvokeCallback(const LLUUID& uuid, LLAssetType::EType type, + LLGetAssetCallback callback, void *user_data); + virtual LLSD getPendingDetailsImpl(const request_list_t* requests, LLAssetType::EType asset_type, const std::string& detail_prefix) const; @@ -442,6 +446,7 @@ private: void _init(LLMessageSystem *msg, LLXferManager *xfer, LLVFS *vfs, + LLVFS *static_vfs, const LLHost &upstream_host); protected: diff --git a/indra/llmessage/llcachename.cpp b/indra/llmessage/llcachename.cpp index 9363b3a8d5..9871c922f1 100644 --- a/indra/llmessage/llcachename.cpp +++ b/indra/llmessage/llcachename.cpp @@ -486,7 +486,7 @@ BOOL LLCacheName::getName(const LLUUID& id, std::string& first, std::string& las { first = sCacheName["nobody"]; last.clear(); - return FALSE; + return TRUE; } LLCacheNameEntry* entry = get_ptr_in_map(impl.mCache, id ); @@ -530,7 +530,7 @@ BOOL LLCacheName::getGroupName(const LLUUID& id, std::string& group) if(id.isNull()) { group = sCacheName["none"]; - return FALSE; + return TRUE; } LLCacheNameEntry* entry = get_ptr_in_map(impl.mCache,id); diff --git a/indra/llmessage/llcurl.cpp b/indra/llmessage/llcurl.cpp index 024e17a777..36874a5d48 100644 --- a/indra/llmessage/llcurl.cpp +++ b/indra/llmessage/llcurl.cpp @@ -89,10 +89,6 @@ S32 gCurlMultiCount = 0; std::vector<LLMutex*> LLCurl::sSSLMutex; std::string LLCurl::sCAPath; std::string LLCurl::sCAFile; -// Verify SSL certificates by default (matches libcurl default). The ability -// to alter this flag is only to allow us to suppress verification if it's -// broken for some reason. -bool LLCurl::sSSLVerify = true; //static void LLCurl::setCAPath(const std::string& path) @@ -107,18 +103,6 @@ void LLCurl::setCAFile(const std::string& file) } //static -void LLCurl::setSSLVerify(bool verify) -{ - sSSLVerify = verify; -} - -//static -bool LLCurl::getSSLVerify() -{ - return sSSLVerify; -} - -//static std::string LLCurl::getVersionString() { return std::string(curl_version()); @@ -381,6 +365,13 @@ U32 LLCurl::Easy::report(CURLcode code) responseReason = strerror(code) + " : " + mErrorBuffer; } + if(responseCode >= 300 && responseCode < 400) //redirect + { + char new_url[512] ; + curl_easy_getinfo(mCurlEasyHandle, CURLINFO_REDIRECT_URL, new_url); + responseReason = new_url ; //get the new URL. + } + if (mResponder) { mResponder->completedRaw(responseCode, responseReason, mChannels, mOutput); @@ -481,8 +472,7 @@ void LLCurl::Easy::prepRequest(const std::string& url, setErrorBuffer(); setCA(); - setopt(CURLOPT_SSL_VERIFYPEER, LLCurl::getSSLVerify()); - setopt(CURLOPT_SSL_VERIFYHOST, LLCurl::getSSLVerify()? 2 : 0); + setopt(CURLOPT_SSL_VERIFYPEER, true); setopt(CURLOPT_TIMEOUT, CURL_REQUEST_TIMEOUT); setoptString(CURLOPT_URL, url); @@ -912,6 +902,15 @@ void LLCurlEasyRequest::setReadCallback(curl_read_callback callback, void* userd } } +void LLCurlEasyRequest::setSSLCtxCallback(curl_ssl_ctx_callback callback, void* userdata) +{ + if (mEasy) + { + mEasy->setopt(CURLOPT_SSL_CTX_FUNCTION, (void*)callback); + mEasy->setopt(CURLOPT_SSL_CTX_DATA, userdata); + } +} + void LLCurlEasyRequest::slist_append(const char* str) { if (mEasy) @@ -1061,3 +1060,4 @@ void LLCurl::cleanupClass() #endif curl_global_cleanup(); } + diff --git a/indra/llmessage/llcurl.h b/indra/llmessage/llcurl.h index caf02cccd9..b6a637ae5b 100644 --- a/indra/llmessage/llcurl.h +++ b/indra/llmessage/llcurl.h @@ -158,16 +158,6 @@ public: static const std::string& getCAPath() { return sCAPath; } /** - * @ brief Set flag controlling whether to verify HTTPS certs. - */ - static void setSSLVerify(bool verify); - - /** - * @ brief Get flag controlling whether to verify HTTPS certs. - */ - static bool getSSLVerify(); - - /** * @ brief Initialize LLCurl class */ static void initClass(); @@ -192,7 +182,6 @@ public: private: static std::string sCAPath; static std::string sCAFile; - static bool sSSLVerify; }; namespace boost @@ -240,6 +229,7 @@ public: void setHeaderCallback(curl_header_callback callback, void* userdata); void setWriteCallback(curl_write_callback callback, void* userdata); void setReadCallback(curl_read_callback callback, void* userdata); + void setSSLCtxCallback(curl_ssl_ctx_callback callback, void* userdata); void slist_append(const char* str); void sendRequest(const std::string& url); void requestComplete(); diff --git a/indra/llmessage/llhttpassetstorage.cpp b/indra/llmessage/llhttpassetstorage.cpp index 1980735bbb..fc326790eb 100644 --- a/indra/llmessage/llhttpassetstorage.cpp +++ b/indra/llmessage/llhttpassetstorage.cpp @@ -401,21 +401,23 @@ size_t LLHTTPAssetRequest::curlCompressedUploadCallback( LLHTTPAssetStorage::LLHTTPAssetStorage(LLMessageSystem *msg, LLXferManager *xfer, - LLVFS *vfs, const LLHost &upstream_host, + LLVFS *vfs, LLVFS *static_vfs, + const LLHost &upstream_host, const std::string& web_host, const std::string& local_web_host, const std::string& host_name) - : LLAssetStorage(msg, xfer, vfs, upstream_host) + : LLAssetStorage(msg, xfer, vfs, static_vfs, upstream_host) { _init(web_host, local_web_host, host_name); } LLHTTPAssetStorage::LLHTTPAssetStorage(LLMessageSystem *msg, LLXferManager *xfer, LLVFS *vfs, + LLVFS *static_vfs, const std::string& web_host, const std::string& local_web_host, const std::string& host_name) - : LLAssetStorage(msg, xfer, vfs) + : LLAssetStorage(msg, xfer, vfs, static_vfs) { _init(web_host, local_web_host, host_name); } diff --git a/indra/llmessage/llhttpassetstorage.h b/indra/llmessage/llhttpassetstorage.h index 231437dad4..3e85e898e2 100644 --- a/indra/llmessage/llhttpassetstorage.h +++ b/indra/llmessage/llhttpassetstorage.h @@ -48,13 +48,14 @@ class LLHTTPAssetStorage : public LLAssetStorage { public: LLHTTPAssetStorage(LLMessageSystem *msg, LLXferManager *xfer, - LLVFS *vfs, const LLHost &upstream_host, + LLVFS *vfs, LLVFS *static_vfs, + const LLHost &upstream_host, const std::string& web_host, const std::string& local_web_host, const std::string& host_name); LLHTTPAssetStorage(LLMessageSystem *msg, LLXferManager *xfer, - LLVFS *vfs, + LLVFS *vfs, LLVFS *static_vfs, const std::string& web_host, const std::string& local_web_host, const std::string& host_name); diff --git a/indra/llmessage/llhttpclient.cpp b/indra/llmessage/llhttpclient.cpp index dd56e18caf..e8dc207114 100644 --- a/indra/llmessage/llhttpclient.cpp +++ b/indra/llmessage/llhttpclient.cpp @@ -31,7 +31,7 @@ */ #include "linden_common.h" - +#include <openssl/x509_vfy.h> #include "llhttpclient.h" #include "llassetstorage.h" @@ -46,7 +46,10 @@ #include "message.h" #include <curl/curl.h> + const F32 HTTP_REQUEST_EXPIRY_SECS = 60.0f; +LLURLRequest::SSLCertVerifyCallback LLHTTPClient::mCertVerifyCallback = NULL; + //////////////////////////////////////////////////////////////////////////// // Responder class moved to LLCurl @@ -79,8 +82,10 @@ namespace { if (mResponder.get()) { - mResponder->completedRaw(mStatus, mReason, channels, buffer); + // Allow clients to parse headers before we attempt to parse + // the body and provide completed/result/error calls. mResponder->completedHeader(mStatus, mReason, mHeaderOutput); + mResponder->completedRaw(mStatus, mReason, channels, buffer); } } virtual void header(const std::string& header, const std::string& value) @@ -194,6 +199,7 @@ namespace fileBuffer = new U8 [fileSize]; vfile.read(fileBuffer, fileSize); ostream.write((char*)fileBuffer, fileSize); + delete [] fileBuffer; eos = true; return STATUS_DONE; } @@ -206,13 +212,19 @@ namespace LLPumpIO* theClientPump = NULL; } +void LLHTTPClient::setCertVerifyCallback(LLURLRequest::SSLCertVerifyCallback callback) +{ + LLHTTPClient::mCertVerifyCallback = callback; +} + static void request( const std::string& url, LLURLRequest::ERequestAction method, Injector* body_injector, LLCurl::ResponderPtr responder, const F32 timeout = HTTP_REQUEST_EXPIRY_SECS, - const LLSD& headers = LLSD()) + const LLSD& headers = LLSD() + ) { if (!LLHTTPClient::hasPump()) { @@ -222,7 +234,7 @@ static void request( LLPumpIO::chain_t chain; LLURLRequest* req = new LLURLRequest(method, url); - req->checkRootCertificate(LLCurl::getSSLVerify()); + req->setSSLVerifyCallback(LLHTTPClient::getCertVerifyCallback(), (void *)req); lldebugs << LLURLRequest::actionAsVerb(method) << " " << url << " " @@ -417,7 +429,6 @@ static LLSD blocking_request( std::string body_str; // other request method checks root cert first, we skip? - //req->checkRootCertificate(true); // * Set curl handle options curl_easy_setopt(curlp, CURLOPT_NOSIGNAL, 1); // don't use SIGALRM for timeouts diff --git a/indra/llmessage/llhttpclient.h b/indra/llmessage/llhttpclient.h index 3d0646e5fe..8afbc9e0fc 100644 --- a/indra/llmessage/llhttpclient.h +++ b/indra/llmessage/llhttpclient.h @@ -40,7 +40,8 @@ #include <string> #include <boost/intrusive_ptr.hpp> - +#include <openssl/x509_vfy.h> +#include "llurlrequest.h" #include "llassettype.h" #include "llcurl.h" #include "lliopipe.h" @@ -61,6 +62,7 @@ public: typedef LLCurl::Responder Responder; typedef LLCurl::ResponderPtr ResponderPtr; + /** @name non-blocking API */ //@{ static void head( @@ -155,7 +157,12 @@ public: static void setPump(LLPumpIO& pump); ///< must be called before any of the above calls are made static bool hasPump(); - ///< for testing + + static void setCertVerifyCallback(LLURLRequest::SSLCertVerifyCallback callback); + static LLURLRequest::SSLCertVerifyCallback getCertVerifyCallback() { return mCertVerifyCallback; } + +protected: + static LLURLRequest::SSLCertVerifyCallback mCertVerifyCallback; }; #endif // LL_LLHTTPCLIENT_H diff --git a/indra/llmessage/llinstantmessage.cpp b/indra/llmessage/llinstantmessage.cpp index a9e1ee77ef..57e8a22546 100644 --- a/indra/llmessage/llinstantmessage.cpp +++ b/indra/llmessage/llinstantmessage.cpp @@ -61,6 +61,7 @@ const char EMPTY_BINARY_BUCKET[] = ""; const S32 EMPTY_BINARY_BUCKET_SIZE = 1; const U32 NO_TIMESTAMP = 0; const std::string SYSTEM_FROM("Second Life"); +const std::string INTERACTIVE_SYSTEM_FROM("F387446C-37C4-45f2-A438-D99CBDBB563B"); const S32 IM_TTL = 1; diff --git a/indra/llmessage/llinstantmessage.h b/indra/llmessage/llinstantmessage.h index 272e753f3c..f11b649f78 100644 --- a/indra/llmessage/llinstantmessage.h +++ b/indra/llmessage/llinstantmessage.h @@ -226,6 +226,7 @@ extern const S32 EMPTY_BINARY_BUCKET_SIZE; extern const U32 NO_TIMESTAMP; extern const std::string SYSTEM_FROM; +extern const std::string INTERACTIVE_SYSTEM_FROM; // Number of retry attempts on sending the im. extern const S32 IM_TTL; diff --git a/indra/llmessage/lltemplatemessagebuilder.cpp b/indra/llmessage/lltemplatemessagebuilder.cpp index 55379fc6fd..fa02456d90 100644 --- a/indra/llmessage/lltemplatemessagebuilder.cpp +++ b/indra/llmessage/lltemplatemessagebuilder.cpp @@ -326,7 +326,7 @@ void LLTemplateMessageBuilder::addData(const char *varname, const void *data, EM << "(" << size << "). Clamping size and truncating data." << llendl; size = 255; char *truncate = (char *)data; - truncate[255] = 0; + truncate[254] = 0; // array size is 255 but the last element index is 254 } // no correct size for MVT_VARIABLE, instead we need to tell how many bytes the size will be encoded as diff --git a/indra/llmessage/lltemplatemessagereader.cpp b/indra/llmessage/lltemplatemessagereader.cpp index 6682575ca5..8f56cf2521 100644 --- a/indra/llmessage/lltemplatemessagereader.cpp +++ b/indra/llmessage/lltemplatemessagereader.cpp @@ -433,10 +433,9 @@ inline void LLTemplateMessageReader::getString(const char *block, const char *va inline void LLTemplateMessageReader::getString(const char *block, const char *var, std::string& outstr, S32 blocknum ) { - char s[MTUBYTES]; - s[0] = '\0'; + char s[MTUBYTES + 1]= {0}; // every element is initialized with 0 getData(block, var, s, 0, blocknum, MTUBYTES); - s[MTUBYTES - 1] = '\0'; + s[MTUBYTES] = '\0'; outstr = s; } diff --git a/indra/llmessage/lltransfersourceasset.cpp b/indra/llmessage/lltransfersourceasset.cpp index 8f36d516d7..43f7c07e94 100644 --- a/indra/llmessage/lltransfersourceasset.cpp +++ b/indra/llmessage/lltransfersourceasset.cpp @@ -60,7 +60,7 @@ void LLTransferSourceAsset::initTransfer() // to the simulator. This is subset of assets we allow to be // simply pulled straight from the asset system. LLUUID* tidp; - if(is_asset_fetch_by_id_allowed(mParams.getAssetType())) + if(LLAssetType::lookupIsAssetFetchByIDAllowed(mParams.getAssetType())) { tidp = new LLUUID(getID()); gAssetStorage->getAssetData( @@ -131,7 +131,7 @@ LLTSCode LLTransferSourceAsset::dataCallback(const S32 packet_id, *data_handle = tmpp; if (!vf.read(tmpp, max_bytes)) /* Flawfinder: Ignore */ { - // Crap, read failure, need to deal with it. + // Read failure, need to deal with it. delete[] tmpp; *data_handle = NULL; returned_bytes = 0; @@ -257,50 +257,3 @@ BOOL LLTransferSourceParamsAsset::unpackParams(LLDataPacker &dp) return TRUE; } - -/** - * Helper functions - */ -bool is_asset_fetch_by_id_allowed(LLAssetType::EType type) -{ - // *FIX: Make this list smaller. - bool rv = false; - switch(type) - { - case LLAssetType::AT_SOUND: - case LLAssetType::AT_LANDMARK: - case LLAssetType::AT_CLOTHING: - case LLAssetType::AT_BODYPART: - case LLAssetType::AT_ANIMATION: - case LLAssetType::AT_GESTURE: - rv = true; - break; - default: - break; - } - return rv; -} - -bool is_asset_id_knowable(LLAssetType::EType type) -{ - // *FIX: Make this list smaller. - bool rv = false; - switch(type) - { - case LLAssetType::AT_TEXTURE: - case LLAssetType::AT_SOUND: - case LLAssetType::AT_LANDMARK: - case LLAssetType::AT_CLOTHING: - case LLAssetType::AT_NOTECARD: - case LLAssetType::AT_BODYPART: - case LLAssetType::AT_ANIMATION: - case LLAssetType::AT_GESTURE: - case LLAssetType::AT_LINK: - case LLAssetType::AT_LINK_FOLDER: - rv = true; - break; - default: - break; - } - return rv; -} diff --git a/indra/llmessage/lltransfersourceasset.h b/indra/llmessage/lltransfersourceasset.h index 70b09b6aaf..8616595654 100644 --- a/indra/llmessage/lltransfersourceasset.h +++ b/indra/llmessage/lltransfersourceasset.h @@ -84,24 +84,4 @@ protected: S32 mCurPos; }; -/** - * @brief Quick check to see if the asset allows direct download. - * - * This might not be the right place for this function call, but it - * originally started life inside the LLTransferSourceAsset code. - * @param type The type of asset. - * @return Returns true if the asset can be fetched by id. - */ -bool is_asset_fetch_by_id_allowed(LLAssetType::EType type); - -/** - * @brief Quick check to see if all asset data can be known by the viewer. - * - * This might not be the right place for this function call, but it - * originally started life inside the LLTransferSourceAsset code. - * @param type The type of asset. - * @return Returns true if the asset id can be transmitted to the viewer. - */ -bool is_asset_id_knowable(LLAssetType::EType type); - #endif // LL_LLTRANSFERSOURCEASSET_H diff --git a/indra/llmessage/llurlrequest.cpp b/indra/llmessage/llurlrequest.cpp index 4e7ceff984..1e76d10828 100644 --- a/indra/llmessage/llurlrequest.cpp +++ b/indra/llmessage/llurlrequest.cpp @@ -36,7 +36,8 @@ #include "llurlrequest.h" #include <algorithm> - +#include <openssl/x509_vfy.h> +#include <openssl/ssl.h> #include "llcurl.h" #include "llioutil.h" #include "llmemtype.h" @@ -56,6 +57,8 @@ const std::string CONTEXT_TRANSFERED_BYTES("transfered_bytes"); static size_t headerCallback(void* data, size_t size, size_t nmemb, void* user); + + /** * class LLURLRequestDetail */ @@ -72,6 +75,7 @@ public: U32 mBodyLimit; S32 mByteAccumulator; bool mIsBodyLimitSet; + LLURLRequest::SSLCertVerifyCallback mSSLVerifyCallback; }; LLURLRequestDetail::LLURLRequestDetail() : @@ -80,7 +84,8 @@ LLURLRequestDetail::LLURLRequestDetail() : mLastRead(NULL), mBodyLimit(0), mByteAccumulator(0), - mIsBodyLimitSet(false) + mIsBodyLimitSet(false), + mSSLVerifyCallback(NULL) { LLMemType m1(LLMemType::MTYPE_IO_URL_REQUEST); mCurlRequest = new LLCurlEasyRequest(); @@ -94,6 +99,36 @@ LLURLRequestDetail::~LLURLRequestDetail() mLastRead = NULL; } +void LLURLRequest::setSSLVerifyCallback(SSLCertVerifyCallback callback, void *param) +{ + mDetail->mSSLVerifyCallback = callback; + mDetail->mCurlRequest->setSSLCtxCallback(LLURLRequest::_sslCtxCallback, (void *)this); + mDetail->mCurlRequest->setopt(CURLOPT_SSL_VERIFYPEER, true); + mDetail->mCurlRequest->setopt(CURLOPT_SSL_VERIFYHOST, 2); +} + + +// _sslCtxFunction +// Callback function called when an SSL Context is created via CURL +// used to configure the context for custom cert validation + +CURLcode LLURLRequest::_sslCtxCallback(CURL * curl, void *sslctx, void *param) +{ + LLURLRequest *req = (LLURLRequest *)param; + if(req == NULL || req->mDetail->mSSLVerifyCallback == NULL) + { + SSL_CTX_set_cert_verify_callback((SSL_CTX *)sslctx, NULL, NULL); + return CURLE_OK; + } + SSL_CTX * ctx = (SSL_CTX *) sslctx; + // disable any default verification for server certs + SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, NULL); + // set the verification callback. + SSL_CTX_set_cert_verify_callback(ctx, req->mDetail->mSSLVerifyCallback, (void *)req); + // the calls are void + return CURLE_OK; + +} /** * class LLURLRequest @@ -148,6 +183,11 @@ void LLURLRequest::setURL(const std::string& url) mDetail->mURL = url; } +std::string LLURLRequest::getURL() const +{ + return mDetail->mURL; +} + void LLURLRequest::addHeader(const char* header) { LLMemType m1(LLMemType::MTYPE_IO_URL_REQUEST); @@ -160,13 +200,6 @@ void LLURLRequest::setBodyLimit(U32 size) mDetail->mIsBodyLimitSet = true; } -void LLURLRequest::checkRootCertificate(bool check) -{ - mDetail->mCurlRequest->setopt(CURLOPT_SSL_VERIFYPEER, (check? TRUE : FALSE)); - mDetail->mCurlRequest->setopt(CURLOPT_SSL_VERIFYHOST, (check? 2 : 0)); - mDetail->mCurlRequest->setoptString(CURLOPT_ENCODING, ""); -} - void LLURLRequest::setCallback(LLURLRequestComplete* callback) { LLMemType m1(LLMemType::MTYPE_IO_URL_REQUEST); diff --git a/indra/llmessage/llurlrequest.h b/indra/llmessage/llurlrequest.h index cb3c466440..69fd22e592 100644 --- a/indra/llmessage/llurlrequest.h +++ b/indra/llmessage/llurlrequest.h @@ -44,6 +44,8 @@ #include "lliopipe.h" #include "llchainio.h" #include "llerror.h" +#include <openssl/x509_vfy.h> +#include "llcurl.h" extern const std::string CONTEXT_REQUEST; @@ -72,6 +74,8 @@ class LLURLRequest : public LLIOPipe { LOG_CLASS(LLURLRequest); public: + + typedef int (* SSLCertVerifyCallback)(X509_STORE_CTX *ctx, void *param); /** * @brief This enumeration is for specifying the type of request. */ @@ -125,7 +129,7 @@ public: * */ void setURL(const std::string& url); - + std::string getURL() const; /** * @brief Add a header to the http post. * @@ -143,8 +147,9 @@ public: * Set whether request will check that remote server * certificates are signed by a known root CA when using HTTPS. */ - void checkRootCertificate(bool check); + void setSSLVerifyCallback(SSLCertVerifyCallback callback, void * param); + /** * @brief Return at most size bytes of body. * @@ -189,6 +194,7 @@ public: * @brief Give this pipe a chance to handle a generated error */ virtual EStatus handleError(EStatus status, LLPumpIO* pump); + protected: /** @@ -217,6 +223,8 @@ protected: S32 mRequestTransferedBytes; S32 mResponseTransferedBytes; + static CURLcode _sslCtxCallback(CURL * curl, void *sslctx, void *param); + private: /** * @brief Initialize the object. Called during construction. @@ -364,62 +372,6 @@ protected: }; -/** - * @class LLURLRequestClientFactory - * @brief Template class to build url request based client chains - * - * This class eases construction of a basic sd rpc client. Here is an - * example of it's use: - * <code> - * class LLUsefulService : public LLService { ... }<br> - * LLService::registerCreator(<br> - * "useful",<br> - * LLService::creator_t(new LLURLRequestClientFactory<LLUsefulService>))<br> - * </code> - * - * This class should work, but I never got around to using/testing it. - * - */ -#if 0 -template<class Client> -class LLURLRequestClientFactory : public LLChainIOFactory -{ -public: - LLURLRequestClientFactory(LLURLRequest::ERequestAction action) {} - LLURLRequestClientFactory( - LLURLRequest::ERequestAction action, - const std::string& fixed_url) : - mAction(action), - mURL(fixed_url) - { - } - virtual bool build(LLPumpIO::chain_t& chain, LLSD context) const - { - lldebugs << "LLURLRequestClientFactory::build" << llendl; - LLIOPipe::ptr_t service(new Client); - chain.push_back(service); - LLURLRequest* http(new LLURLRequest(mAction)); - LLIOPipe::ptr_t http_pipe(http); - // *FIX: how do we know the content type? - //http->addHeader("Content-Type: text/llsd"); - if(mURL.empty()) - { - chain.push_back(LLIOPipe::ptr_t(new LLContextURLExtractor(http))); - } - else - { - http->setURL(mURL); - } - chain.push_back(http_pipe); - chain.push_back(service); - return true; - } - -protected: - LLURLRequest::ERequestAction mAction; - std::string mURL; -}; -#endif /** * External constants diff --git a/indra/llmessage/message_prehash.cpp b/indra/llmessage/message_prehash.cpp index 9e3986f257..a118e21ffb 100644 --- a/indra/llmessage/message_prehash.cpp +++ b/indra/llmessage/message_prehash.cpp @@ -1147,7 +1147,7 @@ char* _PREHASH_ForceObjectSelect = LLMessageStringTable::getInstance()->getStrin char* _PREHASH_Price = LLMessageStringTable::getInstance()->getString("Price"); char* _PREHASH_SunDirection = LLMessageStringTable::getInstance()->getString("SunDirection"); char* _PREHASH_FromName = LLMessageStringTable::getInstance()->getString("FromName"); -char* _PREHASH_ChangeInventoryItemFlags = LLMessageStringTable::getInstance()->getString("ChangeInventoryItemFlags"); +char* _PREHASH_ChangeInventoryItemFlags = LLMessageStringTable::getInstance()->getString("ChangLLInventoryItemFlags"); char* _PREHASH_Force = LLMessageStringTable::getInstance()->getString("Force"); char* _PREHASH_TransactionBlock = LLMessageStringTable::getInstance()->getString("TransactionBlock"); char* _PREHASH_PowersMask = LLMessageStringTable::getInstance()->getString("PowersMask"); diff --git a/indra/llmessage/tests/llareslistener_test.cpp b/indra/llmessage/tests/llareslistener_test.cpp index ac4886ccf4..6ee74c8e7a 100644 --- a/indra/llmessage/tests/llareslistener_test.cpp +++ b/indra/llmessage/tests/llareslistener_test.cpp @@ -4,7 +4,7 @@ * @date 2009-02-26 * @brief Tests of llareslistener.h. * - * $LicenseInfo:firstyear=2009&license=internal$ + * $LicenseInfo:firstyear=2009&license=viewergpl$ * Copyright (c) 2009, Linden Research, Inc. * $/LicenseInfo$ */ diff --git a/indra/llplugin/CMakeLists.txt b/indra/llplugin/CMakeLists.txt index 6706775d4f..441becbae0 100644 --- a/indra/llplugin/CMakeLists.txt +++ b/indra/llplugin/CMakeLists.txt @@ -3,6 +3,7 @@ project(llplugin) include(00-Common) +include(CURL) include(LLCommon) include(LLImage) include(LLMath) @@ -23,6 +24,7 @@ include_directories( set(llplugin_SOURCE_FILES llpluginclassmedia.cpp + llplugincookiestore.cpp llplugininstance.cpp llpluginmessage.cpp llpluginmessagepipe.cpp @@ -36,6 +38,7 @@ set(llplugin_HEADER_FILES llpluginclassmedia.h llpluginclassmediaowner.h + llplugincookiestore.h llplugininstance.h llpluginmessage.h llpluginmessageclasses.h @@ -53,3 +56,19 @@ list(APPEND llplugin_SOURCE_FILES ${llplugin_HEADER_FILES}) add_library (llplugin ${llplugin_SOURCE_FILES}) add_subdirectory(slplugin) + +# Add tests +include(LLAddBuildTest) +# UNIT TESTS +SET(llplugin_TEST_SOURCE_FILES + llplugincookiestore.cpp + ) + +# llplugincookiestore has a dependency on curl, so we need to link the curl library into the test. +set_source_files_properties( + llplugincookiestore.cpp + PROPERTIES + LL_TEST_ADDITIONAL_LIBRARIES "${CURL_LIBRARIES}" + ) + +LL_ADD_PROJECT_UNIT_TESTS(llplugin "${llplugin_TEST_SOURCE_FILES}") diff --git a/indra/llplugin/llpluginclassmedia.cpp b/indra/llplugin/llpluginclassmedia.cpp index 91c796a9e6..41ace62964 100644 --- a/indra/llplugin/llpluginclassmedia.cpp +++ b/indra/llplugin/llpluginclassmedia.cpp @@ -57,23 +57,31 @@ LLPluginClassMedia::LLPluginClassMedia(LLPluginClassMediaOwner *owner) mOwner = owner; mPlugin = NULL; reset(); + + //debug use + mDeleteOK = true ; } LLPluginClassMedia::~LLPluginClassMedia() { + llassert_always(mDeleteOK) ; reset(); } -bool LLPluginClassMedia::init(const std::string &launcher_filename, const std::string &plugin_filename, bool debug, const std::string &user_data_path) +bool LLPluginClassMedia::init(const std::string &launcher_filename, const std::string &plugin_filename, bool debug) { LL_DEBUGS("Plugin") << "launcher: " << launcher_filename << LL_ENDL; LL_DEBUGS("Plugin") << "plugin: " << plugin_filename << LL_ENDL; - LL_DEBUGS("Plugin") << "user_data_path: " << user_data_path << LL_ENDL; mPlugin = new LLPluginProcessParent(this); mPlugin->setSleepTime(mSleepTime); - mPlugin->init(launcher_filename, plugin_filename, debug, user_data_path); + + // Queue up the media init message -- it will be sent after all the currently queued messages. + LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "init"); + sendMessage(message); + + mPlugin->init(launcher_filename, plugin_filename, debug); return true; } @@ -156,7 +164,7 @@ void LLPluginClassMedia::idle(void) mPlugin->idle(); } - if((mMediaWidth == -1) || (!mTextureParamsReceived) || (mPlugin == NULL)) + if((mMediaWidth == -1) || (!mTextureParamsReceived) || (mPlugin == NULL) || (mPlugin->isBlocked())) { // Can't process a size change at this time } @@ -433,6 +441,12 @@ void LLPluginClassMedia::mouseEvent(EMouseEventType type, int button, int x, int { if(type == MOUSE_EVENT_MOVE) { + if(!mPlugin || !mPlugin->isRunning() || mPlugin->isBlocked()) + { + // Don't queue up mouse move events that can't be delivered. + return; + } + if((x == mLastMouseX) && (y == mLastMouseY)) { // Don't spam unnecessary mouse move events. @@ -471,7 +485,7 @@ void LLPluginClassMedia::mouseEvent(EMouseEventType type, int button, int x, int sendMessage(message); } -bool LLPluginClassMedia::keyEvent(EKeyEventType type, int key_code, MASK modifiers) +bool LLPluginClassMedia::keyEvent(EKeyEventType type, int key_code, MASK modifiers, LLSD native_key_data) { bool result = true; @@ -528,6 +542,7 @@ bool LLPluginClassMedia::keyEvent(EKeyEventType type, int key_code, MASK modifie message.setValueS32("key", key_code); message.setValue("modifiers", translateModifiers(modifiers)); + message.setValueLLSD("native_key_data", native_key_data); sendMessage(message); } @@ -546,12 +561,13 @@ void LLPluginClassMedia::scrollEvent(int x, int y, MASK modifiers) sendMessage(message); } -bool LLPluginClassMedia::textInput(const std::string &text, MASK modifiers) +bool LLPluginClassMedia::textInput(const std::string &text, MASK modifiers, LLSD native_key_data) { LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "text_event"); message.setValue("text", text); message.setValue("modifiers", translateModifiers(modifiers)); + message.setValueLLSD("native_key_data", native_key_data); sendMessage(message); @@ -676,19 +692,47 @@ void LLPluginClassMedia::paste() sendMessage(message); } +void LLPluginClassMedia::setUserDataPath(const std::string &user_data_path) +{ + LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "set_user_data_path"); + message.setValue("path", user_data_path); + sendMessage(message); +} + +void LLPluginClassMedia::setLanguageCode(const std::string &language_code) +{ + LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "set_language_code"); + message.setValue("language", language_code); + sendMessage(message); +} + +void LLPluginClassMedia::setPluginsEnabled(const bool enabled) +{ + LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "plugins_enabled"); + message.setValueBoolean("enable", enabled); + sendMessage(message); +} + +void LLPluginClassMedia::setJavascriptEnabled(const bool enabled) +{ + LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "javascript_enabled"); + message.setValueBoolean("enable", enabled); + sendMessage(message); +} + LLPluginClassMedia::ETargetType getTargetTypeFromLLQtWebkit(int target_type) { // convert a LinkTargetType value from llqtwebkit to an ETargetType // so that we don't expose the llqtwebkit header in viewer code switch (target_type) { - case LinkTargetType::LTT_TARGET_NONE: + case LLQtWebKit::LTT_TARGET_NONE: return LLPluginClassMedia::TARGET_NONE; - case LinkTargetType::LTT_TARGET_BLANK: + case LLQtWebKit::LTT_TARGET_BLANK: return LLPluginClassMedia::TARGET_BLANK; - case LinkTargetType::LTT_TARGET_EXTERNAL: + case LLQtWebKit::LTT_TARGET_EXTERNAL: return LLPluginClassMedia::TARGET_EXTERNAL; default: @@ -959,6 +1003,13 @@ void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message) mClickTargetType = TARGET_NONE; mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_CLICK_LINK_NOFOLLOW); } + else if(message_name == "cookie_set") + { + if(mOwner) + { + mOwner->handleCookieSet(this, message.getValue("cookie")); + } + } else { LL_WARNS("Plugin") << "Unknown " << message_name << " class message: " << message_name << LL_ENDL; @@ -1042,9 +1093,17 @@ void LLPluginClassMedia::clear_cookies() sendMessage(message); } +void LLPluginClassMedia::set_cookies(const std::string &cookies) +{ + LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "set_cookies"); + message.setValue("cookies", cookies); + sendMessage(message); +} + void LLPluginClassMedia::enable_cookies(bool enable) { LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "enable_cookies"); + message.setValueBoolean("enable", enable); sendMessage(message); } diff --git a/indra/llplugin/llpluginclassmedia.h b/indra/llplugin/llpluginclassmedia.h index ebb9099576..66853c9940 100644 --- a/indra/llplugin/llpluginclassmedia.h +++ b/indra/llplugin/llpluginclassmedia.h @@ -49,7 +49,9 @@ public: virtual ~LLPluginClassMedia(); // local initialization, called by the media manager when creating a source - virtual bool init(const std::string &launcher_filename, const std::string &plugin_filename, bool debug, const std::string &user_data_path); + virtual bool init(const std::string &launcher_filename, + const std::string &plugin_filename, + bool debug); // undoes everything init() didm called by the media manager when destroying a source virtual void reset(); @@ -114,12 +116,12 @@ public: KEY_EVENT_REPEAT }EKeyEventType; - bool keyEvent(EKeyEventType type, int key_code, MASK modifiers); + bool keyEvent(EKeyEventType type, int key_code, MASK modifiers, LLSD native_key_data); void scrollEvent(int x, int y, MASK modifiers); // Text may be unicode (utf8 encoded) - bool textInput(const std::string &text, MASK modifiers); + bool textInput(const std::string &text, MASK modifiers, LLSD native_key_data); void loadURI(const std::string &uri); @@ -173,6 +175,12 @@ public: void paste(); bool canPaste() const { return mCanPaste; }; + + // These can be called before init(), and they will be queued and sent before the media init message. + void setUserDataPath(const std::string &user_data_path); + void setLanguageCode(const std::string &language_code); + void setPluginsEnabled(const bool enabled); + void setJavascriptEnabled(const bool enabled); /////////////////////////////////// // media browser class functions @@ -181,6 +189,7 @@ public: void focus(bool focused); void clear_cache(); void clear_cookies(); + void set_cookies(const std::string &cookies); void enable_cookies(bool enable); void proxy_setup(bool enable, const std::string &host = LLStringUtil::null, int port = 0); void browse_stop(); @@ -364,6 +373,14 @@ protected: F64 mCurrentRate; F64 mLoadedDuration; +//-------------------------------------- + //debug use only + // +private: + bool mDeleteOK ; +public: + void setDeleteOK(bool flag) { mDeleteOK = flag ;} +//-------------------------------------- }; #endif // LL_LLPLUGINCLASSMEDIA_H diff --git a/indra/llplugin/llpluginclassmediaowner.h b/indra/llplugin/llpluginclassmediaowner.h index 6d369cd51a..5669b81fd1 100644 --- a/indra/llplugin/llpluginclassmediaowner.h +++ b/indra/llplugin/llpluginclassmediaowner.h @@ -39,6 +39,7 @@ #include <queue> class LLPluginClassMedia; +class LLPluginCookieStore; class LLPluginClassMediaOwner { @@ -78,6 +79,7 @@ public: virtual ~LLPluginClassMediaOwner() {}; virtual void handleMediaEvent(LLPluginClassMedia* /*self*/, EMediaEvent /*event*/) {}; + virtual void handleCookieSet(LLPluginClassMedia* /*self*/, const std::string &/*cookie*/) {}; }; #endif // LL_LLPLUGINCLASSMEDIAOWNER_H diff --git a/indra/llplugin/llplugincookiestore.cpp b/indra/llplugin/llplugincookiestore.cpp new file mode 100644 index 0000000000..da770c5f2e --- /dev/null +++ b/indra/llplugin/llplugincookiestore.cpp @@ -0,0 +1,669 @@ +/** + * @file llplugincookiestore.cpp + * @brief LLPluginCookieStore provides central storage for http cookies used by plugins + * + * @cond + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlife.com/developers/opensource/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlife.com/developers/opensource/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + * @endcond + */ + +#include "linden_common.h" +#include "indra_constants.h" + +#include "llplugincookiestore.h" +#include <iostream> + +// for curl_getdate() (apparently parsing RFC 1123 dates is hard) +#include <curl/curl.h> + +LLPluginCookieStore::LLPluginCookieStore(): + mHasChangedCookies(false) +{ +} + + +LLPluginCookieStore::~LLPluginCookieStore() +{ + clearCookies(); +} + + +LLPluginCookieStore::Cookie::Cookie(const std::string &s, std::string::size_type cookie_start, std::string::size_type cookie_end): + mCookie(s, cookie_start, cookie_end - cookie_start), + mNameStart(0), mNameEnd(0), + mValueStart(0), mValueEnd(0), + mDomainStart(0), mDomainEnd(0), + mPathStart(0), mPathEnd(0), + mDead(false), mChanged(true) +{ +} + +LLPluginCookieStore::Cookie *LLPluginCookieStore::Cookie::createFromString(const std::string &s, std::string::size_type cookie_start, std::string::size_type cookie_end, const std::string &host) +{ + Cookie *result = new Cookie(s, cookie_start, cookie_end); + + if(!result->parse(host)) + { + delete result; + result = NULL; + } + + return result; +} + +std::string LLPluginCookieStore::Cookie::getKey() const +{ + std::string result; + if(mDomainEnd > mDomainStart) + { + result += mCookie.substr(mDomainStart, mDomainEnd - mDomainStart); + } + result += ';'; + if(mPathEnd > mPathStart) + { + result += mCookie.substr(mPathStart, mPathEnd - mPathStart); + } + result += ';'; + result += mCookie.substr(mNameStart, mNameEnd - mNameStart); + return result; +} + +bool LLPluginCookieStore::Cookie::parse(const std::string &host) +{ + bool first_field = true; + + std::string::size_type cookie_end = mCookie.size(); + std::string::size_type field_start = 0; + + LL_DEBUGS("CookieStoreParse") << "parsing cookie: " << mCookie << LL_ENDL; + while(field_start < cookie_end) + { + // Finding the start of the next field requires honoring special quoting rules + // see the definition of 'quoted-string' in rfc2616 for details + std::string::size_type next_field_start = findFieldEnd(field_start); + + // The end of this field should not include the terminating ';' or any trailing whitespace + std::string::size_type field_end = mCookie.find_last_not_of("; ", next_field_start); + if(field_end == std::string::npos || field_end < field_start) + { + // This field was empty or all whitespace. Set end = start so it shows as empty. + field_end = field_start; + } + else if (field_end < next_field_start) + { + // we actually want the index of the char _after_ what 'last not of' found + ++field_end; + } + + // find the start of the actual name (skip separator and possible whitespace) + std::string::size_type name_start = mCookie.find_first_not_of("; ", field_start); + if(name_start == std::string::npos || name_start > next_field_start) + { + // Again, nothing but whitespace. + name_start = field_start; + } + + // the name and value are separated by the first equals sign + std::string::size_type name_value_sep = mCookie.find_first_of("=", name_start); + if(name_value_sep == std::string::npos || name_value_sep > field_end) + { + // No separator found, so this is a field without an = + name_value_sep = field_end; + } + + // the name end is before the name-value separator + std::string::size_type name_end = mCookie.find_last_not_of("= ", name_value_sep); + if(name_end == std::string::npos || name_end < name_start) + { + // I'm not sure how we'd hit this case... it seems like it would have to be an empty name. + name_end = name_start; + } + else if (name_end < name_value_sep) + { + // we actually want the index of the char _after_ what 'last not of' found + ++name_end; + } + + // Value is between the name-value sep and the end of the field. + std::string::size_type value_start = mCookie.find_first_not_of("= ", name_value_sep); + if(value_start == std::string::npos || value_start > field_end) + { + // All whitespace or empty value + value_start = field_end; + } + std::string::size_type value_end = mCookie.find_last_not_of("; ", field_end); + if(value_end == std::string::npos || value_end < value_start) + { + // All whitespace or empty value + value_end = value_start; + } + else if (value_end < field_end) + { + // we actually want the index of the char _after_ what 'last not of' found + ++value_end; + } + + LL_DEBUGS("CookieStoreParse") + << " field name: \"" << mCookie.substr(name_start, name_end - name_start) + << "\", value: \"" << mCookie.substr(value_start, value_end - value_start) << "\"" + << LL_ENDL; + + // See whether this field is one we know + if(first_field) + { + // The first field is the name=value pair + mNameStart = name_start; + mNameEnd = name_end; + mValueStart = value_start; + mValueEnd = value_end; + first_field = false; + } + else + { + // Subsequent fields must come from the set in rfc2109 + if(matchName(name_start, name_end, "expires")) + { + std::string date_string(mCookie, value_start, value_end - value_start); + // If the cookie contains an "expires" field, it MUST contain a parsable date. + + // HACK: LLDate apparently can't PARSE an rfc1123-format date, even though it can GENERATE one. + // The curl function curl_getdate can do this, but I'm hesitant to unilaterally introduce a curl dependency in LLDate. +#if 1 + time_t date = curl_getdate(date_string.c_str(), NULL ); + mDate.secondsSinceEpoch((F64)date); + LL_DEBUGS("CookieStoreParse") << " expire date parsed to: " << mDate.asRFC1123() << LL_ENDL; +#else + // This doesn't work (rfc1123-format dates cause it to fail) + if(!mDate.fromString(date_string)) + { + // Date failed to parse. + LL_WARNS("CookieStoreParse") << "failed to parse cookie's expire date: " << date << LL_ENDL; + return false; + } +#endif + } + else if(matchName(name_start, name_end, "domain")) + { + mDomainStart = value_start; + mDomainEnd = value_end; + } + else if(matchName(name_start, name_end, "path")) + { + mPathStart = value_start; + mPathEnd = value_end; + } + else if(matchName(name_start, name_end, "max-age")) + { + // TODO: how should we handle this? + } + else if(matchName(name_start, name_end, "secure")) + { + // We don't care about the value of this field (yet) + } + else if(matchName(name_start, name_end, "version")) + { + // We don't care about the value of this field (yet) + } + else if(matchName(name_start, name_end, "comment")) + { + // We don't care about the value of this field (yet) + } + else if(matchName(name_start, name_end, "httponly")) + { + // We don't care about the value of this field (yet) + } + else + { + // An unknown field is a parse failure + LL_WARNS("CookieStoreParse") << "unexpected field name: " << mCookie.substr(name_start, name_end - name_start) << LL_ENDL; + return false; + } + + } + + + // move on to the next field, skipping this field's separator and any leading whitespace + field_start = mCookie.find_first_not_of("; ", next_field_start); + } + + // The cookie MUST have a name + if(mNameEnd <= mNameStart) + return false; + + // If the cookie doesn't have a domain, add the current host as the domain. + if(mDomainEnd <= mDomainStart) + { + if(host.empty()) + { + // no domain and no current host -- this is a parse failure. + return false; + } + + // Figure out whether this cookie ended with a ";" or not... + std::string::size_type last_char = mCookie.find_last_not_of(" "); + if((last_char != std::string::npos) && (mCookie[last_char] != ';')) + { + mCookie += ";"; + } + + mCookie += " domain="; + mDomainStart = mCookie.size(); + mCookie += host; + mDomainEnd = mCookie.size(); + + LL_DEBUGS("CookieStoreParse") << "added domain (" << mDomainStart << " to " << mDomainEnd << "), new cookie is: " << mCookie << LL_ENDL; + } + + // If the cookie doesn't have a path, add "/". + if(mPathEnd <= mPathStart) + { + // Figure out whether this cookie ended with a ";" or not... + std::string::size_type last_char = mCookie.find_last_not_of(" "); + if((last_char != std::string::npos) && (mCookie[last_char] != ';')) + { + mCookie += ";"; + } + + mCookie += " path="; + mPathStart = mCookie.size(); + mCookie += "/"; + mPathEnd = mCookie.size(); + + LL_DEBUGS("CookieStoreParse") << "added path (" << mPathStart << " to " << mPathEnd << "), new cookie is: " << mCookie << LL_ENDL; + } + + + return true; +} + +std::string::size_type LLPluginCookieStore::Cookie::findFieldEnd(std::string::size_type start, std::string::size_type end) +{ + std::string::size_type result = start; + + if(end == std::string::npos) + end = mCookie.size(); + + bool in_quotes = false; + for(; (result < end); result++) + { + switch(mCookie[result]) + { + case '\\': + if(in_quotes) + result++; // The next character is backslash-quoted. Skip over it. + break; + case '"': + in_quotes = !in_quotes; + break; + case ';': + if(!in_quotes) + return result; + break; + } + } + + // If we got here, no ';' was found. + return end; +} + +bool LLPluginCookieStore::Cookie::matchName(std::string::size_type start, std::string::size_type end, const char *name) +{ + // NOTE: this assumes 'name' is already in lowercase. The code which uses it should be able to arrange this... + + while((start < end) && (*name != '\0')) + { + if(tolower(mCookie[start]) != *name) + return false; + + start++; + name++; + } + + // iff both strings hit the end at the same time, they're equal. + return ((start == end) && (*name == '\0')); +} + +std::string LLPluginCookieStore::getAllCookies() +{ + std::stringstream result; + writeAllCookies(result); + return result.str(); +} + +void LLPluginCookieStore::writeAllCookies(std::ostream& s) +{ + cookie_map_t::iterator iter; + for(iter = mCookies.begin(); iter != mCookies.end(); iter++) + { + // Don't return expired cookies + if(!iter->second->isDead()) + { + s << (iter->second->getCookie()) << "\n"; + } + } + +} + +std::string LLPluginCookieStore::getPersistentCookies() +{ + std::stringstream result; + writePersistentCookies(result); + return result.str(); +} + +void LLPluginCookieStore::writePersistentCookies(std::ostream& s) +{ + cookie_map_t::iterator iter; + for(iter = mCookies.begin(); iter != mCookies.end(); iter++) + { + // Don't return expired cookies or session cookies + if(!iter->second->isDead() && !iter->second->isSessionCookie()) + { + s << iter->second->getCookie() << "\n"; + } + } +} + +std::string LLPluginCookieStore::getChangedCookies(bool clear_changed) +{ + std::stringstream result; + writeChangedCookies(result, clear_changed); + + return result.str(); +} + +void LLPluginCookieStore::writeChangedCookies(std::ostream& s, bool clear_changed) +{ + if(mHasChangedCookies) + { + lldebugs << "returning changed cookies: " << llendl; + cookie_map_t::iterator iter; + for(iter = mCookies.begin(); iter != mCookies.end(); ) + { + cookie_map_t::iterator next = iter; + next++; + + // Only return cookies marked as "changed" + if(iter->second->isChanged()) + { + s << iter->second->getCookie() << "\n"; + + lldebugs << " " << iter->second->getCookie() << llendl; + + // If requested, clear the changed mark + if(clear_changed) + { + if(iter->second->isDead()) + { + // If this cookie was previously marked dead, it needs to be removed entirely. + delete iter->second; + mCookies.erase(iter); + } + else + { + // Not dead, just mark as not changed. + iter->second->setChanged(false); + } + } + } + + iter = next; + } + } + + if(clear_changed) + mHasChangedCookies = false; +} + +void LLPluginCookieStore::setAllCookies(const std::string &cookies, bool mark_changed) +{ + clearCookies(); + setCookies(cookies, mark_changed); +} + +void LLPluginCookieStore::readAllCookies(std::istream& s, bool mark_changed) +{ + clearCookies(); + readCookies(s, mark_changed); +} + +void LLPluginCookieStore::setCookies(const std::string &cookies, bool mark_changed) +{ + std::string::size_type start = 0; + + while(start != std::string::npos) + { + std::string::size_type end = cookies.find_first_of("\r\n", start); + if(end > start) + { + // The line is non-empty. Try to create a cookie from it. + setOneCookie(cookies, start, end, mark_changed); + } + start = cookies.find_first_not_of("\r\n ", end); + } +} + +void LLPluginCookieStore::setCookiesFromHost(const std::string &cookies, const std::string &host, bool mark_changed) +{ + std::string::size_type start = 0; + + while(start != std::string::npos) + { + std::string::size_type end = cookies.find_first_of("\r\n", start); + if(end > start) + { + // The line is non-empty. Try to create a cookie from it. + setOneCookie(cookies, start, end, mark_changed, host); + } + start = cookies.find_first_not_of("\r\n ", end); + } +} + +void LLPluginCookieStore::readCookies(std::istream& s, bool mark_changed) +{ + std::string line; + while(s.good() && !s.eof()) + { + std::getline(s, line); + if(!line.empty()) + { + // Try to create a cookie from this line. + setOneCookie(line, 0, std::string::npos, mark_changed); + } + } +} + +std::string LLPluginCookieStore::quoteString(const std::string &s) +{ + std::stringstream result; + + result << '"'; + + for(std::string::size_type i = 0; i < s.size(); ++i) + { + char c = s[i]; + switch(c) + { + // All these separators need to be quoted in HTTP headers, according to section 2.2 of rfc 2616: + case '(': case ')': case '<': case '>': case '@': + case ',': case ';': case ':': case '\\': case '"': + case '/': case '[': case ']': case '?': case '=': + case '{': case '}': case ' ': case '\t': + result << '\\'; + break; + } + + result << c; + } + + result << '"'; + + return result.str(); +} + +std::string LLPluginCookieStore::unquoteString(const std::string &s) +{ + std::stringstream result; + + bool in_quotes = false; + + for(std::string::size_type i = 0; i < s.size(); ++i) + { + char c = s[i]; + switch(c) + { + case '\\': + if(in_quotes) + { + // The next character is backslash-quoted. Pass it through untouched. + ++i; + if(i < s.size()) + { + result << s[i]; + } + continue; + } + break; + case '"': + in_quotes = !in_quotes; + continue; + break; + } + + result << c; + } + + return result.str(); +} + +// The flow for deleting a cookie is non-obvious enough that I should call it out here... +// Deleting a cookie is done by setting a cookie with the same name, path, and domain, but with an expire timestamp in the past. +// (This is exactly how a web server tells a browser to delete a cookie.) +// When deleting with mark_changed set to true, this replaces the existing cookie in the list with an entry that's marked both dead and changed. +// Some time later when writeChangedCookies() is called with clear_changed set to true, the dead cookie is deleted from the list after being returned, so that the +// delete operation (in the form of the expired cookie) is passed along. +void LLPluginCookieStore::setOneCookie(const std::string &s, std::string::size_type cookie_start, std::string::size_type cookie_end, bool mark_changed, const std::string &host) +{ + Cookie *cookie = Cookie::createFromString(s, cookie_start, cookie_end, host); + if(cookie) + { + LL_DEBUGS("CookieStoreUpdate") << "setting cookie: " << cookie->getCookie() << LL_ENDL; + + // Create a key for this cookie + std::string key = cookie->getKey(); + + // Check to see whether this cookie should have expired + if(!cookie->isSessionCookie() && (cookie->getDate() < LLDate::now())) + { + // This cookie has expired. + if(mark_changed) + { + // If we're marking cookies as changed, we should keep it anyway since we'll need to send it out with deltas. + cookie->setDead(true); + LL_DEBUGS("CookieStoreUpdate") << " marking dead" << LL_ENDL; + } + else + { + // If we're not marking cookies as changed, we don't need to keep this cookie at all. + // If the cookie was already in the list, delete it. + removeCookie(key); + + delete cookie; + cookie = NULL; + + LL_DEBUGS("CookieStoreUpdate") << " removing" << LL_ENDL; + } + } + + if(cookie) + { + // If it already exists in the map, replace it. + cookie_map_t::iterator iter = mCookies.find(key); + if(iter != mCookies.end()) + { + if(iter->second->getCookie() == cookie->getCookie()) + { + // The new cookie is identical to the old -- don't mark as changed. + // Just leave the old one in the map. + delete cookie; + cookie = NULL; + + LL_DEBUGS("CookieStoreUpdate") << " unchanged" << LL_ENDL; + } + else + { + // A matching cookie was already in the map. Replace it. + delete iter->second; + iter->second = cookie; + + cookie->setChanged(mark_changed); + if(mark_changed) + mHasChangedCookies = true; + + LL_DEBUGS("CookieStoreUpdate") << " replacing" << LL_ENDL; + } + } + else + { + // The cookie wasn't in the map. Insert it. + mCookies.insert(std::make_pair(key, cookie)); + + cookie->setChanged(mark_changed); + if(mark_changed) + mHasChangedCookies = true; + + LL_DEBUGS("CookieStoreUpdate") << " adding" << LL_ENDL; + } + } + } + else + { + LL_WARNS("CookieStoreUpdate") << "failed to parse cookie: " << s.substr(cookie_start, cookie_end - cookie_start) << LL_ENDL; + } + +} + +void LLPluginCookieStore::clearCookies() +{ + while(!mCookies.empty()) + { + cookie_map_t::iterator iter = mCookies.begin(); + delete iter->second; + mCookies.erase(iter); + } +} + +void LLPluginCookieStore::removeCookie(const std::string &key) +{ + cookie_map_t::iterator iter = mCookies.find(key); + if(iter != mCookies.end()) + { + delete iter->second; + mCookies.erase(iter); + } +} + diff --git a/indra/llplugin/llplugincookiestore.h b/indra/llplugin/llplugincookiestore.h new file mode 100644 index 0000000000..a93f0c14f0 --- /dev/null +++ b/indra/llplugin/llplugincookiestore.h @@ -0,0 +1,125 @@ +/** + * @file llplugincookiestore.h + * @brief LLPluginCookieStore provides central storage for http cookies used by plugins + * + * @cond + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlife.com/developers/opensource/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlife.com/developers/opensource/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + * @endcond + */ + +#ifndef LL_LLPLUGINCOOKIESTORE_H +#define LL_LLPLUGINCOOKIESTORE_H + +#include "lldate.h" +#include <map> +#include <string> +#include <iostream> + +class LLPluginCookieStore +{ + LOG_CLASS(LLPluginCookieStore); +public: + LLPluginCookieStore(); + ~LLPluginCookieStore(); + + // gets all cookies currently in storage -- use when initializing a plugin + std::string getAllCookies(); + void writeAllCookies(std::ostream& s); + + // gets only persistent cookies (i.e. not session cookies) -- use when writing cookies to a file + std::string getPersistentCookies(); + void writePersistentCookies(std::ostream& s); + + // gets cookies which are marked as "changed" -- use when sending periodic updates to plugins + std::string getChangedCookies(bool clear_changed = true); + void writeChangedCookies(std::ostream& s, bool clear_changed = true); + + // (re)initializes internal data structures and bulk-sets cookies -- use when reading cookies from a file + void setAllCookies(const std::string &cookies, bool mark_changed = false); + void readAllCookies(std::istream& s, bool mark_changed = false); + + // sets one or more cookies (without reinitializing anything) -- use when receiving cookies from a plugin + void setCookies(const std::string &cookies, bool mark_changed = true); + void readCookies(std::istream& s, bool mark_changed = true); + + // sets one or more cookies (without reinitializing anything), supplying a hostname the cookies came from -- use when setting a cookie manually + void setCookiesFromHost(const std::string &cookies, const std::string &host, bool mark_changed = true); + + // quote or unquote a string as per the definition of 'quoted-string' in rfc2616 + static std::string quoteString(const std::string &s); + static std::string unquoteString(const std::string &s); + +private: + + void setOneCookie(const std::string &s, std::string::size_type cookie_start, std::string::size_type cookie_end, bool mark_changed, const std::string &host = LLStringUtil::null); + + class Cookie + { + public: + static Cookie *createFromString(const std::string &s, std::string::size_type cookie_start = 0, std::string::size_type cookie_end = std::string::npos, const std::string &host = LLStringUtil::null); + + // Construct a string from the cookie that uniquely represents it, to be used as a key in a std::map. + std::string getKey() const; + + const std::string &getCookie() const { return mCookie; }; + bool isSessionCookie() const { return mDate.isNull(); }; + + bool isDead() const { return mDead; }; + void setDead(bool dead) { mDead = dead; }; + + bool isChanged() const { return mChanged; }; + void setChanged(bool changed) { mChanged = changed; }; + + const LLDate &getDate() const { return mDate; }; + + private: + Cookie(const std::string &s, std::string::size_type cookie_start = 0, std::string::size_type cookie_end = std::string::npos); + bool parse(const std::string &host); + std::string::size_type findFieldEnd(std::string::size_type start = 0, std::string::size_type end = std::string::npos); + bool matchName(std::string::size_type start, std::string::size_type end, const char *name); + + std::string mCookie; // The full cookie, in RFC 2109 string format + LLDate mDate; // The expiration date of the cookie. For session cookies, this will be a null date (mDate.isNull() is true). + // Start/end indices of various parts of the cookie string. Stored as indices into the string to save space and time. + std::string::size_type mNameStart, mNameEnd; + std::string::size_type mValueStart, mValueEnd; + std::string::size_type mDomainStart, mDomainEnd; + std::string::size_type mPathStart, mPathEnd; + bool mDead; + bool mChanged; + }; + + typedef std::map<std::string, Cookie*> cookie_map_t; + + cookie_map_t mCookies; + bool mHasChangedCookies; + + void clearCookies(); + void removeCookie(const std::string &key); +}; + +#endif // LL_LLPLUGINCOOKIESTORE_H diff --git a/indra/llplugin/llpluginmessagepipe.cpp b/indra/llplugin/llpluginmessagepipe.cpp index cc193fca42..89f8b44569 100644 --- a/indra/llplugin/llpluginmessagepipe.cpp +++ b/indra/llplugin/llpluginmessagepipe.cpp @@ -96,11 +96,14 @@ void LLPluginMessagePipeOwner::killMessagePipe(void) } } -LLPluginMessagePipe::LLPluginMessagePipe(LLPluginMessagePipeOwner *owner, LLSocket::ptr_t socket) +LLPluginMessagePipe::LLPluginMessagePipe(LLPluginMessagePipeOwner *owner, LLSocket::ptr_t socket): + mInputMutex(gAPRPoolp), + mOutputMutex(gAPRPoolp), + mOwner(owner), + mSocket(socket) { - mOwner = owner; + mOwner->setMessagePipe(this); - mSocket = socket; } LLPluginMessagePipe::~LLPluginMessagePipe() @@ -114,6 +117,7 @@ LLPluginMessagePipe::~LLPluginMessagePipe() bool LLPluginMessagePipe::addMessage(const std::string &message) { // queue the message for later output + LLMutexLock lock(&mOutputMutex); mOutput += message; mOutput += MESSAGE_DELIMITER; // message separator @@ -149,6 +153,18 @@ void LLPluginMessagePipe::setSocketTimeout(apr_interval_time_t timeout_usec) bool LLPluginMessagePipe::pump(F64 timeout) { + bool result = pumpOutput(); + + if(result) + { + result = pumpInput(timeout); + } + + return result; +} + +bool LLPluginMessagePipe::pumpOutput() +{ bool result = true; if(mSocket) @@ -156,6 +172,7 @@ bool LLPluginMessagePipe::pump(F64 timeout) apr_status_t status; apr_size_t size; + LLMutexLock lock(&mOutputMutex); if(!mOutput.empty()) { // write any outgoing messages @@ -183,6 +200,17 @@ bool LLPluginMessagePipe::pump(F64 timeout) // remove the written part from the buffer and try again later. mOutput = mOutput.substr(size); } + else if(APR_STATUS_IS_EOF(status)) + { + // This is what we normally expect when a plugin exits. + llinfos << "Got EOF from plugin socket. " << llendl; + + if(mOwner) + { + mOwner->socketError(status); + } + result = false; + } else { // some other error @@ -196,6 +224,19 @@ bool LLPluginMessagePipe::pump(F64 timeout) result = false; } } + } + + return result; +} + +bool LLPluginMessagePipe::pumpInput(F64 timeout) +{ + bool result = true; + + if(mSocket) + { + apr_status_t status; + apr_size_t size; // FIXME: For some reason, the apr timeout stuff isn't working properly on windows. // Until such time as we figure out why, don't try to use the socket timeout -- just sleep here instead. @@ -216,8 +257,16 @@ bool LLPluginMessagePipe::pump(F64 timeout) char input_buf[1024]; apr_size_t request_size; - // Start out by reading one byte, so that any data received will wake us up. - request_size = 1; + if(timeout == 0.0f) + { + // If we have no timeout, start out with a full read. + request_size = sizeof(input_buf); + } + else + { + // Start out by reading one byte, so that any data received will wake us up. + request_size = 1; + } // and use the timeout so we'll sleep if no data is available. setSocketTimeout((apr_interval_time_t)(timeout * 1000000)); @@ -236,11 +285,14 @@ bool LLPluginMessagePipe::pump(F64 timeout) // LL_INFOS("Plugin") << "after apr_socket_recv, size = " << size << LL_ENDL; if(size > 0) + { + LLMutexLock lock(&mInputMutex); mInput.append(input_buf, size); + } if(status == APR_SUCCESS) { -// llinfos << "success, read " << size << llendl; + LL_DEBUGS("PluginSocket") << "success, read " << size << LL_ENDL; if(size != request_size) { @@ -250,16 +302,28 @@ bool LLPluginMessagePipe::pump(F64 timeout) } else if(APR_STATUS_IS_TIMEUP(status)) { -// llinfos << "TIMEUP, read " << size << llendl; + LL_DEBUGS("PluginSocket") << "TIMEUP, read " << size << LL_ENDL; // Timeout was hit. Since the initial read is 1 byte, this should never be a partial read. break; } else if(APR_STATUS_IS_EAGAIN(status)) { -// llinfos << "EAGAIN, read " << size << llendl; + LL_DEBUGS("PluginSocket") << "EAGAIN, read " << size << LL_ENDL; - // We've been doing partial reads, and we're done now. + // Non-blocking read returned immediately. + break; + } + else if(APR_STATUS_IS_EOF(status)) + { + // This is what we normally expect when a plugin exits. + LL_INFOS("PluginSocket") << "Got EOF from plugin socket. " << LL_ENDL; + + if(mOwner) + { + mOwner->socketError(status); + } + result = false; break; } else @@ -276,22 +340,18 @@ bool LLPluginMessagePipe::pump(F64 timeout) break; } - // Second and subsequent reads should not use the timeout - setSocketTimeout(0); - // and should try to fill the input buffer - request_size = sizeof(input_buf); + if(timeout != 0.0f) + { + // Second and subsequent reads should not use the timeout + setSocketTimeout(0); + // and should try to fill the input buffer + request_size = sizeof(input_buf); + } } processInput(); } } - - if(!result) - { - // If we got an error, we're done. - LL_INFOS("Plugin") << "Error from socket, cleaning up." << LL_ENDL; - delete this; - } return result; } @@ -299,19 +359,27 @@ bool LLPluginMessagePipe::pump(F64 timeout) void LLPluginMessagePipe::processInput(void) { // Look for input delimiter(s) in the input buffer. - int start = 0; int delim; - while((delim = mInput.find(MESSAGE_DELIMITER, start)) != std::string::npos) + mInputMutex.lock(); + while((delim = mInput.find(MESSAGE_DELIMITER)) != std::string::npos) { // Let the owner process this message - mOwner->receiveMessageRaw(mInput.substr(start, delim - start)); - - start = delim + 1; + if (mOwner) + { + // Pull the message out of the input buffer before calling receiveMessageRaw. + // It's now possible for this function to get called recursively (in the case where the plugin makes a blocking request) + // and this guarantees that the messages will get dequeued correctly. + std::string message(mInput, 0, delim); + mInput.erase(0, delim + 1); + mInputMutex.unlock(); + mOwner->receiveMessageRaw(message); + mInputMutex.lock(); + } + else + { + LL_WARNS("Plugin") << "!mOwner" << LL_ENDL; + } } - - // Remove delivered messages from the input buffer. - if(start != 0) - mInput = mInput.substr(start); - + mInputMutex.unlock(); } diff --git a/indra/llplugin/llpluginmessagepipe.h b/indra/llplugin/llpluginmessagepipe.h index 1ddb38de68..1b0a08254b 100644 --- a/indra/llplugin/llpluginmessagepipe.h +++ b/indra/llplugin/llpluginmessagepipe.h @@ -35,6 +35,7 @@ #define LL_LLPLUGINMESSAGEPIPE_H #include "lliosocket.h" +#include "llthread.h" class LLPluginMessagePipe; @@ -51,7 +52,7 @@ public: virtual apr_status_t socketError(apr_status_t error); // called from LLPluginMessagePipe to manage the connection with LLPluginMessagePipeOwner -- do not use! - virtual void setMessagePipe(LLPluginMessagePipe *message_pipe) ; + virtual void setMessagePipe(LLPluginMessagePipe *message_pipe); protected: // returns false if writeMessageRaw() would drop the message @@ -76,14 +77,18 @@ public: void clearOwner(void); bool pump(F64 timeout = 0.0f); - + bool pumpOutput(); + bool pumpInput(F64 timeout = 0.0f); + protected: void processInput(void); // used internally by pump() void setSocketTimeout(apr_interval_time_t timeout_usec); + LLMutex mInputMutex; std::string mInput; + LLMutex mOutputMutex; std::string mOutput; LLPluginMessagePipeOwner *mOwner; diff --git a/indra/llplugin/llpluginprocesschild.cpp b/indra/llplugin/llpluginprocesschild.cpp index 0f3254d78d..d1cf91b253 100644 --- a/indra/llplugin/llpluginprocesschild.cpp +++ b/indra/llplugin/llpluginprocesschild.cpp @@ -48,6 +48,8 @@ LLPluginProcessChild::LLPluginProcessChild() mSocket = LLSocket::create(gAPRPoolp, LLSocket::STREAM_TCP); mSleepTime = PLUGIN_IDLE_SECONDS; // default: send idle messages at 100Hz mCPUElapsed = 0.0f; + mBlockingRequest = false; + mBlockingResponseReceived = false; } LLPluginProcessChild::~LLPluginProcessChild() @@ -83,9 +85,14 @@ void LLPluginProcessChild::idle(void) bool idle_again; do { - if(mSocketError != APR_SUCCESS) + if(APR_STATUS_IS_EOF(mSocketError)) { - LL_INFOS("Plugin") << "message pipe is in error state, moving to STATE_ERROR"<< LL_ENDL; + // Plugin socket was closed. This covers both normal plugin termination and host crashes. + setState(STATE_ERROR); + } + else if(mSocketError != APR_SUCCESS) + { + LL_INFOS("Plugin") << "message pipe is in error state (" << mSocketError << "), moving to STATE_ERROR"<< LL_ENDL; setState(STATE_ERROR); } @@ -155,7 +162,6 @@ void LLPluginProcessChild::idle(void) { setState(STATE_PLUGIN_INITIALIZING); LLPluginMessage message("base", "init"); - message.setValue("user_data_path", mUserDataPath); sendMessageToPlugin(message); } break; @@ -227,6 +233,7 @@ void LLPluginProcessChild::idle(void) void LLPluginProcessChild::sleep(F64 seconds) { + deliverQueuedMessages(); if(mMessagePipe) { mMessagePipe->pump(seconds); @@ -239,6 +246,7 @@ void LLPluginProcessChild::sleep(F64 seconds) void LLPluginProcessChild::pump(void) { + deliverQueuedMessages(); if(mMessagePipe) { mMessagePipe->pump(0.0f); @@ -278,14 +286,21 @@ bool LLPluginProcessChild::isDone(void) void LLPluginProcessChild::sendMessageToPlugin(const LLPluginMessage &message) { - std::string buffer = message.generate(); - - LL_DEBUGS("Plugin") << "Sending to plugin: " << buffer << LL_ENDL; - LLTimer elapsed; - - mInstance->sendMessage(buffer); - - mCPUElapsed += elapsed.getElapsedTimeF64(); + if (mInstance) + { + std::string buffer = message.generate(); + + LL_DEBUGS("Plugin") << "Sending to plugin: " << buffer << LL_ENDL; + LLTimer elapsed; + + mInstance->sendMessage(buffer); + + mCPUElapsed += elapsed.getElapsedTimeF64(); + } + else + { + LL_WARNS("Plugin") << "mInstance == NULL" << LL_ENDL; + } } void LLPluginProcessChild::sendMessageToParent(const LLPluginMessage &message) @@ -303,15 +318,32 @@ void LLPluginProcessChild::receiveMessageRaw(const std::string &message) LL_DEBUGS("Plugin") << "Received from parent: " << message << LL_ENDL; + // Decode this message + LLPluginMessage parsed; + parsed.parse(message); + + if(mBlockingRequest) + { + // We're blocking the plugin waiting for a response. + + if(parsed.hasValue("blocking_response")) + { + // This is the message we've been waiting for -- fall through and send it immediately. + mBlockingResponseReceived = true; + } + else + { + // Still waiting. Queue this message and don't process it yet. + mMessageQueue.push(message); + return; + } + } + bool passMessage = true; // FIXME: how should we handle queueing here? { - // Decode this message - LLPluginMessage parsed; - parsed.parse(message); - std::string message_class = parsed.getClass(); if(message_class == LLPLUGIN_MESSAGE_CLASS_INTERNAL) { @@ -321,7 +353,6 @@ void LLPluginProcessChild::receiveMessageRaw(const std::string &message) if(message_name == "load_plugin") { mPluginFile = parsed.getValue("file"); - mUserDataPath = parsed.getValue("user_data_path"); } else if(message_name == "shm_add") { @@ -420,7 +451,13 @@ void LLPluginProcessChild::receiveMessageRaw(const std::string &message) void LLPluginProcessChild::receivePluginMessage(const std::string &message) { LL_DEBUGS("Plugin") << "Received from plugin: " << message << LL_ENDL; - + + if(mBlockingRequest) + { + // + LL_ERRS("Plugin") << "Can't send a message while already waiting on a blocking request -- aborting!" << LL_ENDL; + } + // Incoming message from the plugin instance bool passMessage = true; @@ -431,6 +468,12 @@ void LLPluginProcessChild::receivePluginMessage(const std::string &message) // Decode this message LLPluginMessage parsed; parsed.parse(message); + + if(parsed.hasValue("blocking_request")) + { + mBlockingRequest = true; + } + std::string message_class = parsed.getClass(); if(message_class == "base") { @@ -489,6 +532,19 @@ void LLPluginProcessChild::receivePluginMessage(const std::string &message) LL_DEBUGS("Plugin") << "Passing through to parent: " << message << LL_ENDL; writeMessageRaw(message); } + + while(mBlockingRequest) + { + // The plugin wants to block and wait for a response to this message. + sleep(mSleepTime); // this will pump the message pipe and process messages + + if(mBlockingResponseReceived || mSocketError != APR_SUCCESS || (mMessagePipe == NULL)) + { + // Response has been received, or we've hit an error state. Stop waiting. + mBlockingRequest = false; + mBlockingResponseReceived = false; + } + } } @@ -497,3 +553,15 @@ void LLPluginProcessChild::setState(EState state) LL_DEBUGS("Plugin") << "setting state to " << state << LL_ENDL; mState = state; }; + +void LLPluginProcessChild::deliverQueuedMessages() +{ + if(!mBlockingRequest) + { + while(!mMessageQueue.empty()) + { + receiveMessageRaw(mMessageQueue.front()); + mMessageQueue.pop(); + } + } +} diff --git a/indra/llplugin/llpluginprocesschild.h b/indra/llplugin/llpluginprocesschild.h index 58f8935ed1..1430ad7a5d 100644 --- a/indra/llplugin/llpluginprocesschild.h +++ b/indra/llplugin/llpluginprocesschild.h @@ -98,8 +98,6 @@ private: std::string mPluginFile; - std::string mUserDataPath; - LLPluginInstance *mInstance; typedef std::map<std::string, LLPluginSharedMemory*> sharedMemoryRegionsType; @@ -108,6 +106,11 @@ private: LLTimer mHeartbeat; F64 mSleepTime; F64 mCPUElapsed; + bool mBlockingRequest; + bool mBlockingResponseReceived; + std::queue<std::string> mMessageQueue; + + void deliverQueuedMessages(); }; diff --git a/indra/llplugin/llpluginprocessparent.cpp b/indra/llplugin/llpluginprocessparent.cpp index efd5df687e..3589b22a77 100644 --- a/indra/llplugin/llpluginprocessparent.cpp +++ b/indra/llplugin/llpluginprocessparent.cpp @@ -45,8 +45,51 @@ LLPluginProcessParentOwner::~LLPluginProcessParentOwner() } -LLPluginProcessParent::LLPluginProcessParent(LLPluginProcessParentOwner *owner) +bool LLPluginProcessParent::sUseReadThread = false; +apr_pollset_t *LLPluginProcessParent::sPollSet = NULL; +bool LLPluginProcessParent::sPollsetNeedsRebuild = false; +LLMutex *LLPluginProcessParent::sInstancesMutex; +std::list<LLPluginProcessParent*> LLPluginProcessParent::sInstances; +LLThread *LLPluginProcessParent::sReadThread = NULL; + + +class LLPluginProcessParentPollThread: public LLThread { +public: + LLPluginProcessParentPollThread() : + LLThread("LLPluginProcessParentPollThread", gAPRPoolp) + { + } +protected: + // Inherited from LLThread + /*virtual*/ void run(void) + { + while(!isQuitting() && LLPluginProcessParent::getUseReadThread()) + { + LLPluginProcessParent::poll(0.1f); + checkPause(); + } + + // Final poll to clean up the pollset, etc. + LLPluginProcessParent::poll(0.0f); + } + + // Inherited from LLThread + /*virtual*/ bool runCondition(void) + { + return(LLPluginProcessParent::canPollThreadRun()); + } + +}; + +LLPluginProcessParent::LLPluginProcessParent(LLPluginProcessParentOwner *owner): + mIncomingQueueMutex(gAPRPoolp) +{ + if(!sInstancesMutex) + { + sInstancesMutex = new LLMutex(gAPRPoolp); + } + mOwner = owner; mBoundPort = 0; mState = STATE_UNINITIALIZED; @@ -54,18 +97,37 @@ LLPluginProcessParent::LLPluginProcessParent(LLPluginProcessParentOwner *owner) mCPUUsage = 0.0; mDisableTimeout = false; mDebug = false; + mBlocked = false; + mPolledInput = false; + mPollFD.client_data = NULL; mPluginLaunchTimeout = 60.0f; mPluginLockupTimeout = 15.0f; // Don't start the timer here -- start it when we actually launch the plugin process. mHeartbeat.stop(); + + // Don't add to the global list until fully constructed. + { + LLMutexLock lock(sInstancesMutex); + sInstances.push_back(this); + } } LLPluginProcessParent::~LLPluginProcessParent() { LL_DEBUGS("Plugin") << "destructor" << LL_ENDL; + // Remove from the global list before beginning destruction. + { + // Make sure to get the global mutex _first_ here, to avoid a possible deadlock against LLPluginProcessParent::poll() + LLMutexLock lock(sInstancesMutex); + { + LLMutexLock lock2(&mIncomingQueueMutex); + sInstances.remove(this); + } + } + // Destroy any remaining shared memory regions sharedMemoryRegionsType::iterator iter; while((iter = mSharedMemoryRegions.begin()) != mSharedMemoryRegions.end()) @@ -77,15 +139,17 @@ LLPluginProcessParent::~LLPluginProcessParent() mSharedMemoryRegions.erase(iter); } - // orphaning the process means it won't be killed when the LLProcessLauncher is destructed. - // This is what we want -- it should exit cleanly once it notices the sockets have been closed. - mProcess.orphan(); + mProcess.kill(); killSockets(); } void LLPluginProcessParent::killSockets(void) { - killMessagePipe(); + { + LLMutexLock lock(&mIncomingQueueMutex); + killMessagePipe(); + } + mListenSocket.reset(); mSocket.reset(); } @@ -98,14 +162,12 @@ void LLPluginProcessParent::errorState(void) setState(STATE_ERROR); } -void LLPluginProcessParent::init(const std::string &launcher_filename, const std::string &plugin_filename, bool debug, const std::string &user_data_path) +void LLPluginProcessParent::init(const std::string &launcher_filename, const std::string &plugin_filename, bool debug) { mProcess.setExecutable(launcher_filename); mPluginFile = plugin_filename; mCPUUsage = 0.0f; - mDebug = debug; - mUserDataPath = user_data_path; - + mDebug = debug; setState(STATE_INITIALIZED); } @@ -161,21 +223,47 @@ void LLPluginProcessParent::idle(void) do { + // process queued messages + mIncomingQueueMutex.lock(); + while(!mIncomingQueue.empty()) + { + LLPluginMessage message = mIncomingQueue.front(); + mIncomingQueue.pop(); + mIncomingQueueMutex.unlock(); + + receiveMessage(message); + + mIncomingQueueMutex.lock(); + } + + mIncomingQueueMutex.unlock(); + // Give time to network processing if(mMessagePipe) { - if(!mMessagePipe->pump()) + // Drain any queued outgoing messages + mMessagePipe->pumpOutput(); + + // Only do input processing here if this instance isn't in a pollset. + if(!mPolledInput) { -// LL_WARNS("Plugin") << "Message pipe hit an error state" << LL_ENDL; - errorState(); + mMessagePipe->pumpInput(); } } - - if((mSocketError != APR_SUCCESS) && (mState <= STATE_RUNNING)) + + if(mState <= STATE_RUNNING) { - // The socket is in an error state -- the plugin is gone. - LL_WARNS("Plugin") << "Socket hit an error state (" << mSocketError << ")" << LL_ENDL; - errorState(); + if(APR_STATUS_IS_EOF(mSocketError)) + { + // Plugin socket was closed. This covers both normal plugin termination and plugin crashes. + errorState(); + } + else if(mSocketError != APR_SUCCESS) + { + // The socket is in an error state -- the plugin is gone. + LL_WARNS("Plugin") << "Socket hit an error state (" << mSocketError << ")" << LL_ENDL; + errorState(); + } } // If a state needs to go directly to another state (as a performance enhancement), it can set idle_again to true after calling setState(). @@ -356,13 +444,12 @@ void LLPluginProcessParent::idle(void) break; case STATE_HELLO: - LL_DEBUGS("Plugin") << "received hello message" << llendl; + LL_DEBUGS("Plugin") << "received hello message" << LL_ENDL; // Send the message to load the plugin { LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_INTERNAL, "load_plugin"); message.setValue("file", mPluginFile); - message.setValue("user_data_path", mUserDataPath); sendMessage(message); } @@ -391,7 +478,7 @@ void LLPluginProcessParent::idle(void) } else if(pluginLockedUp()) { - LL_WARNS("Plugin") << "timeout in exiting state, bailing out" << llendl; + LL_WARNS("Plugin") << "timeout in exiting state, bailing out" << LL_ENDL; errorState(); } break; @@ -413,8 +500,7 @@ void LLPluginProcessParent::idle(void) break; case STATE_CLEANUP: - // Don't do a kill here anymore -- closing the sockets is the new 'kill'. - mProcess.orphan(); + mProcess.kill(); killSockets(); setState(STATE_DONE); break; @@ -482,23 +568,323 @@ void LLPluginProcessParent::setSleepTime(F64 sleep_time, bool force_send) void LLPluginProcessParent::sendMessage(const LLPluginMessage &message) { + if(message.hasValue("blocking_response")) + { + mBlocked = false; + + // reset the heartbeat timer, since there will have been no heartbeats while the plugin was blocked. + mHeartbeat.setTimerExpirySec(mPluginLockupTimeout); + } std::string buffer = message.generate(); LL_DEBUGS("Plugin") << "Sending: " << buffer << LL_ENDL; writeMessageRaw(buffer); + + // Try to send message immediately. + if(mMessagePipe) + { + mMessagePipe->pumpOutput(); + } +} + +//virtual +void LLPluginProcessParent::setMessagePipe(LLPluginMessagePipe *message_pipe) +{ + bool update_pollset = false; + + if(mMessagePipe) + { + // Unsetting an existing message pipe -- remove from the pollset + mPollFD.client_data = NULL; + + // pollset needs an update + update_pollset = true; + } + if(message_pipe != NULL) + { + // Set up the apr_pollfd_t + mPollFD.p = gAPRPoolp; + mPollFD.desc_type = APR_POLL_SOCKET; + mPollFD.reqevents = APR_POLLIN|APR_POLLERR|APR_POLLHUP; + mPollFD.rtnevents = 0; + mPollFD.desc.s = mSocket->getSocket(); + mPollFD.client_data = (void*)this; + + // pollset needs an update + update_pollset = true; + } + + mMessagePipe = message_pipe; + + if(update_pollset) + { + dirtyPollSet(); + } +} + +//static +void LLPluginProcessParent::dirtyPollSet() +{ + sPollsetNeedsRebuild = true; + + if(sReadThread) + { + LL_DEBUGS("PluginPoll") << "unpausing read thread " << LL_ENDL; + sReadThread->unpause(); + } +} + +void LLPluginProcessParent::updatePollset() +{ + if(!sInstancesMutex) + { + // No instances have been created yet. There's no work to do. + return; + } + + LLMutexLock lock(sInstancesMutex); + + if(sPollSet) + { + LL_DEBUGS("PluginPoll") << "destroying pollset " << sPollSet << LL_ENDL; + // delete the existing pollset. + apr_pollset_destroy(sPollSet); + sPollSet = NULL; + } + + std::list<LLPluginProcessParent*>::iterator iter; + int count = 0; + + // Count the number of instances that want to be in the pollset + for(iter = sInstances.begin(); iter != sInstances.end(); iter++) + { + (*iter)->mPolledInput = false; + if((*iter)->mPollFD.client_data) + { + // This instance has a socket that needs to be polled. + ++count; + } + } + + if(sUseReadThread && sReadThread && !sReadThread->isQuitting()) + { + if(!sPollSet && (count > 0)) + { +#ifdef APR_POLLSET_NOCOPY + // The pollset doesn't exist yet. Create it now. + apr_status_t status = apr_pollset_create(&sPollSet, count, gAPRPoolp, APR_POLLSET_NOCOPY); + if(status != APR_SUCCESS) + { +#endif // APR_POLLSET_NOCOPY + LL_WARNS("PluginPoll") << "Couldn't create pollset. Falling back to non-pollset mode." << LL_ENDL; + sPollSet = NULL; +#ifdef APR_POLLSET_NOCOPY + } + else + { + LL_DEBUGS("PluginPoll") << "created pollset " << sPollSet << LL_ENDL; + + // Pollset was created, add all instances to it. + for(iter = sInstances.begin(); iter != sInstances.end(); iter++) + { + if((*iter)->mPollFD.client_data) + { + status = apr_pollset_add(sPollSet, &((*iter)->mPollFD)); + if(status == APR_SUCCESS) + { + (*iter)->mPolledInput = true; + } + else + { + LL_WARNS("PluginPoll") << "apr_pollset_add failed with status " << status << LL_ENDL; + } + } + } + } +#endif // APR_POLLSET_NOCOPY + } + } +} + +void LLPluginProcessParent::setUseReadThread(bool use_read_thread) +{ + if(sUseReadThread != use_read_thread) + { + sUseReadThread = use_read_thread; + + if(sUseReadThread) + { + if(!sReadThread) + { + // start up the read thread + LL_INFOS("PluginPoll") << "creating read thread " << LL_ENDL; + + // make sure the pollset gets rebuilt. + sPollsetNeedsRebuild = true; + + sReadThread = new LLPluginProcessParentPollThread; + sReadThread->start(); + } + } + else + { + if(sReadThread) + { + // shut down the read thread + LL_INFOS("PluginPoll") << "destroying read thread " << LL_ENDL; + delete sReadThread; + sReadThread = NULL; + } + } + + } +} + +void LLPluginProcessParent::poll(F64 timeout) +{ + if(sPollsetNeedsRebuild || !sUseReadThread) + { + sPollsetNeedsRebuild = false; + updatePollset(); + } + + if(sPollSet) + { + apr_status_t status; + apr_int32_t count; + const apr_pollfd_t *descriptors; + status = apr_pollset_poll(sPollSet, (apr_interval_time_t)(timeout * 1000000), &count, &descriptors); + if(status == APR_SUCCESS) + { + // One or more of the descriptors signalled. Call them. + for(int i = 0; i < count; i++) + { + LLPluginProcessParent *self = (LLPluginProcessParent *)(descriptors[i].client_data); + // NOTE: the descriptor returned here is actually a COPY of the original (even though we create the pollset with APR_POLLSET_NOCOPY). + // This means that even if the parent has set its mPollFD.client_data to NULL, the old pointer may still there in this descriptor. + // It's even possible that the old pointer no longer points to a valid LLPluginProcessParent. + // This means that we can't safely dereference the 'self' pointer here without some extra steps... + if(self) + { + // Make sure this pointer is still in the instances list + bool valid = false; + { + LLMutexLock lock(sInstancesMutex); + for(std::list<LLPluginProcessParent*>::iterator iter = sInstances.begin(); iter != sInstances.end(); ++iter) + { + if(*iter == self) + { + // Lock the instance's mutex before unlocking the global mutex. + // This avoids a possible race condition where the instance gets deleted between this check and the servicePoll() call. + self->mIncomingQueueMutex.lock(); + valid = true; + break; + } + } + } + + if(valid) + { + // The instance is still valid. + // Pull incoming messages off the socket + self->servicePoll(); + self->mIncomingQueueMutex.unlock(); + } + else + { + LL_DEBUGS("PluginPoll") << "detected deleted instance " << self << LL_ENDL; + } + + } + } + } + else if(APR_STATUS_IS_TIMEUP(status)) + { + // timed out with no incoming data. Just return. + } + else if(status == EBADF) + { + // This happens when one of the file descriptors in the pollset is destroyed, which happens whenever a plugin's socket is closed. + // The pollset has been or will be recreated, so just return. + LL_DEBUGS("PluginPoll") << "apr_pollset_poll returned EBADF" << LL_ENDL; + } + else if(status != APR_SUCCESS) + { + LL_WARNS("PluginPoll") << "apr_pollset_poll failed with status " << status << LL_ENDL; + } + } } +void LLPluginProcessParent::servicePoll() +{ + bool result = true; + + // poll signalled on this object's socket. Try to process incoming messages. + if(mMessagePipe) + { + result = mMessagePipe->pumpInput(0.0f); + } + + if(!result) + { + // If we got a read error on input, remove this pipe from the pollset + apr_pollset_remove(sPollSet, &mPollFD); + + // and tell the code not to re-add it + mPollFD.client_data = NULL; + } +} void LLPluginProcessParent::receiveMessageRaw(const std::string &message) { LL_DEBUGS("Plugin") << "Received: " << message << LL_ENDL; - - // FIXME: should this go into a queue instead? LLPluginMessage parsed; if(parsed.parse(message) != -1) { - receiveMessage(parsed); + if(parsed.hasValue("blocking_request")) + { + mBlocked = true; + } + + if(mPolledInput) + { + // This is being called on the polling thread -- only do minimal processing/queueing. + receiveMessageEarly(parsed); + } + else + { + // This is not being called on the polling thread -- do full message processing at this time. + receiveMessage(parsed); + } + } +} + +void LLPluginProcessParent::receiveMessageEarly(const LLPluginMessage &message) +{ + // NOTE: this function will be called from the polling thread. It will be called with mIncomingQueueMutex _already locked_. + + bool handled = false; + + std::string message_class = message.getClass(); + if(message_class == LLPLUGIN_MESSAGE_CLASS_INTERNAL) + { + // no internal messages need to be handled early. + } + else + { + // Call out to the owner and see if they to reply + // TODO: Should this only happen when blocked? + if(mOwner != NULL) + { + handled = mOwner->receivePluginMessageEarly(message); + } + } + + if(!handled) + { + // any message that wasn't handled early needs to be queued. + mIncomingQueue.push(message); } } @@ -692,18 +1078,15 @@ bool LLPluginProcessParent::pluginLockedUpOrQuit() { bool result = false; - if(!mDisableTimeout && !mDebug) + if(!mProcess.isRunning()) { - if(!mProcess.isRunning()) - { - LL_WARNS("Plugin") << "child exited" << llendl; - result = true; - } - else if(pluginLockedUp()) - { - LL_WARNS("Plugin") << "timeout" << llendl; - result = true; - } + LL_WARNS("Plugin") << "child exited" << LL_ENDL; + result = true; + } + else if(pluginLockedUp()) + { + LL_WARNS("Plugin") << "timeout" << LL_ENDL; + result = true; } return result; @@ -711,6 +1094,12 @@ bool LLPluginProcessParent::pluginLockedUpOrQuit() bool LLPluginProcessParent::pluginLockedUp() { + if(mDisableTimeout || mDebug || mBlocked) + { + // Never time out a plugin process in these cases. + return false; + } + // If the timer is running and has expired, the plugin has locked up. return (mHeartbeat.getStarted() && mHeartbeat.hasExpired()); } diff --git a/indra/llplugin/llpluginprocessparent.h b/indra/llplugin/llpluginprocessparent.h index 524cd9923f..4dff835b6a 100644 --- a/indra/llplugin/llpluginprocessparent.h +++ b/indra/llplugin/llpluginprocessparent.h @@ -41,12 +41,14 @@ #include "llpluginsharedmemory.h" #include "lliosocket.h" +#include "llthread.h" class LLPluginProcessParentOwner { public: virtual ~LLPluginProcessParentOwner(); virtual void receivePluginMessage(const LLPluginMessage &message) = 0; + virtual bool receivePluginMessageEarly(const LLPluginMessage &message) {return false;}; // This will only be called when the plugin has died unexpectedly virtual void pluginLaunchFailed() {}; virtual void pluginDied() {}; @@ -59,7 +61,10 @@ public: LLPluginProcessParent(LLPluginProcessParentOwner *owner); ~LLPluginProcessParent(); - void init(const std::string &launcher_filename, const std::string &plugin_filename, bool debug, const std::string &user_data_path); + void init(const std::string &launcher_filename, + const std::string &plugin_filename, + bool debug); + void idle(void); // returns true if the plugin is on its way to steady state @@ -71,6 +76,9 @@ public: // returns true if the process has exited or we've had a fatal error bool isDone(void); + // returns true if the process is currently waiting on a blocking request + bool isBlocked(void) { return mBlocked; }; + void killSockets(void); // Go to the proper error state @@ -84,7 +92,9 @@ public: void receiveMessage(const LLPluginMessage &message); // Inherited from LLPluginMessagePipeOwner - void receiveMessageRaw(const std::string &message); + /*virtual*/ void receiveMessageRaw(const std::string &message); + /*virtual*/ void receiveMessageEarly(const LLPluginMessage &message); + /*virtual*/ void setMessagePipe(LLPluginMessagePipe *message_pipe) ; // This adds a memory segment shared with the client, generating a name for the segment. The name generated is guaranteed to be unique on the host. // The caller must call removeSharedMemory first (and wait until getSharedMemorySize returns 0 for the indicated name) before re-adding a segment with the same name. @@ -107,7 +117,11 @@ public: void setLockupTimeout(F32 timeout) { mPluginLockupTimeout = timeout; }; F64 getCPUUsage() { return mCPUUsage; }; - + + static void poll(F64 timeout); + static bool canPollThreadRun() { return (sPollSet || sPollsetNeedsRebuild || sUseReadThread); }; + static void setUseReadThread(bool use_read_thread); + static bool getUseReadThread() { return sUseReadThread; }; private: enum EState @@ -143,8 +157,6 @@ private: std::string mPluginFile; - std::string mUserDataPath; - LLPluginProcessParentOwner *mOwner; typedef std::map<std::string, LLPluginSharedMemory*> sharedMemoryRegionsType; @@ -159,12 +171,27 @@ private: bool mDisableTimeout; bool mDebug; + bool mBlocked; + bool mPolledInput; LLProcessLauncher mDebugger; F32 mPluginLaunchTimeout; // Somewhat longer timeout for initial launch. F32 mPluginLockupTimeout; // If we don't receive a heartbeat in this many seconds, we declare the plugin locked up. + static bool sUseReadThread; + apr_pollfd_t mPollFD; + static apr_pollset_t *sPollSet; + static bool sPollsetNeedsRebuild; + static LLMutex *sInstancesMutex; + static std::list<LLPluginProcessParent*> sInstances; + static void dirtyPollSet(); + static void updatePollset(); + void servicePoll(); + static LLThread *sReadThread; + + LLMutex mIncomingQueueMutex; + std::queue<LLPluginMessage> mIncomingQueue; }; #endif // LL_LLPLUGINPROCESSPARENT_H diff --git a/indra/llplugin/slplugin/CMakeLists.txt b/indra/llplugin/slplugin/CMakeLists.txt index 4a7d670c23..c1536e85de 100644 --- a/indra/llplugin/slplugin/CMakeLists.txt +++ b/indra/llplugin/slplugin/CMakeLists.txt @@ -27,9 +27,15 @@ set(SLPlugin_SOURCE_FILES add_executable(SLPlugin WIN32 + MACOSX_BUNDLE ${SLPlugin_SOURCE_FILES} ) +set_target_properties(SLPlugin + PROPERTIES + MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/slplugin_info.plist + ) + target_link_libraries(SLPlugin ${LLPLUGIN_LIBRARIES} ${LLMESSAGE_LIBRARIES} @@ -44,12 +50,16 @@ add_dependencies(SLPlugin ) if (DARWIN) - # Mac version needs to link against carbon, and also needs an embedded plist (to set LSBackgroundOnly) + # Mac version needs to link against Carbon target_link_libraries(SLPlugin ${CARBON_LIBRARY}) - set_target_properties( - SLPlugin - PROPERTIES - LINK_FLAGS "-Wl,-sectcreate,__TEXT,__info_plist,${CMAKE_CURRENT_SOURCE_DIR}/slplugin_info.plist" + # Make sure the app bundle has a Resources directory (it will get populated by viewer-manifest.py later) + add_custom_command( + TARGET SLPlugin POST_BUILD + COMMAND mkdir + ARGS + -p + ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/SLPlugin.app/Contents/Resources ) endif (DARWIN) +ll_deploy_sharedlibs_command(SLPlugin) diff --git a/indra/llplugin/slplugin/slplugin.cpp b/indra/llplugin/slplugin/slplugin.cpp index 77240ce546..7d6dde1a58 100644 --- a/indra/llplugin/slplugin/slplugin.cpp +++ b/indra/llplugin/slplugin/slplugin.cpp @@ -51,7 +51,7 @@ #endif /* - On Mac OS, since we call WaitNextEvent, this process will show up in the dock unless we set the LSBackgroundOnly flag in the Info.plist. + On Mac OS, since we call WaitNextEvent, this process will show up in the dock unless we set the LSBackgroundOnly or LSUIElement flag in the Info.plist. Normally non-bundled binaries don't have an info.plist file, but it's possible to embed one in the binary by adding this to the linker flags: @@ -60,7 +60,8 @@ which means adding this to the gcc flags: -Wl,-sectcreate,__TEXT,__info_plist,/path/to/slplugin_info.plist - + + Now that SLPlugin is a bundled app on the Mac, this is no longer necessary (it can just use a regular Info.plist file), but I'm leaving this comment in for posterity. */ #if LL_DARWIN || LL_LINUX @@ -239,6 +240,24 @@ int main(int argc, char **argv) checkExceptionHandler(); #endif +#if LL_DARWIN + // If the plugin opens a new window (such as the Flash plugin's fullscreen player), we may need to bring this plugin process to the foreground. + // Use this to track the current frontmost window and bring this process to the front if it changes. + WindowRef front_window = NULL; + WindowGroupRef layer_group = NULL; + int window_hack_state = 0; + CreateWindowGroup(kWindowGroupAttrFixedLevel, &layer_group); + if(layer_group) + { + // Start out with a window layer that's way out in front (fixes the problem with the menubar not getting hidden on first switch to fullscreen youtube) + SetWindowGroupName(layer_group, CFSTR("SLPlugin Layer")); + SetWindowGroupLevel(layer_group, kCGOverlayWindowLevel); + } +#endif + +#if LL_DARWIN + EventTargetRef event_target = GetEventDispatcherTarget(); +#endif while(!plugin->isDone()) { timer.reset(); @@ -246,8 +265,86 @@ int main(int argc, char **argv) #if LL_DARWIN { // Some plugins (webkit at least) will want an event loop. This qualifies. - EventRecord evt; - WaitNextEvent(0, &evt, 0, NULL); + EventRef event; + if(ReceiveNextEvent(0, 0, kEventDurationNoWait, true, &event) == noErr) + { + SendEventToEventTarget (event, event_target); + ReleaseEvent(event); + } + + // Check for a change in this process's frontmost window. + if(FrontWindow() != front_window) + { + ProcessSerialNumber self = { 0, kCurrentProcess }; + ProcessSerialNumber parent = { 0, kNoProcess }; + ProcessSerialNumber front = { 0, kNoProcess }; + Boolean this_is_front_process = false; + Boolean parent_is_front_process = false; + { + // Get this process's parent + ProcessInfoRec info; + info.processInfoLength = sizeof(ProcessInfoRec); + info.processName = NULL; + info.processAppSpec = NULL; + if(GetProcessInformation( &self, &info ) == noErr) + { + parent = info.processLauncher; + } + + // and figure out whether this process or its parent are currently frontmost + if(GetFrontProcess(&front) == noErr) + { + (void) SameProcess(&self, &front, &this_is_front_process); + (void) SameProcess(&parent, &front, &parent_is_front_process); + } + } + + if((FrontWindow() != NULL) && (front_window == NULL)) + { + // Opening the first window + + if(window_hack_state == 0) + { + // Next time through the event loop, lower the window group layer + window_hack_state = 1; + } + + if(layer_group) + { + SetWindowGroup(FrontWindow(), layer_group); + } + + if(parent_is_front_process) + { + // Bring this process's windows to the front. + (void) SetFrontProcess( &self ); + } + + ActivateWindow(FrontWindow(), true); + } + else if((FrontWindow() == NULL) && (front_window != NULL)) + { + // Closing the last window + + if(this_is_front_process) + { + // Try to bring this process's parent to the front + (void) SetFrontProcess(&parent); + } + } + else if(window_hack_state == 1) + { + if(layer_group) + { + // Set the window group level back to something less extreme + SetWindowGroupLevel(layer_group, kCGNormalWindowLevel); + } + window_hack_state = 2; + } + + front_window = FrontWindow(); + + } } #endif F64 elapsed = timer.getElapsedTimeF64(); diff --git a/indra/llplugin/slplugin/slplugin_info.plist b/indra/llplugin/slplugin/slplugin_info.plist index b1daf87424..c4597380e0 100644 --- a/indra/llplugin/slplugin/slplugin_info.plist +++ b/indra/llplugin/slplugin/slplugin_info.plist @@ -6,7 +6,7 @@ <string>English</string> <key>CFBundleInfoDictionaryVersion</key> <string>6.0</string> - <key>LSBackgroundOnly</key> - <true/> + <key>LSUIElement</key> + <string>1</string> </dict> </plist> diff --git a/indra/llplugin/tests/llplugincookiestore_test.cpp b/indra/llplugin/tests/llplugincookiestore_test.cpp new file mode 100644 index 0000000000..c903464c64 --- /dev/null +++ b/indra/llplugin/tests/llplugincookiestore_test.cpp @@ -0,0 +1,211 @@ +/** + * @file llplugincookiestore_test.cpp + * @brief Unit tests for LLPluginCookieStore. + * + * @cond + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlife.com/developers/opensource/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlife.com/developers/opensource/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + * @endcond + */ + +#include "linden_common.h" +#include "../test/lltut.h" + +#include "../llplugincookiestore.h" + + +namespace tut +{ + // Main Setup + struct LLPluginCookieStoreFixture + { + LLPluginCookieStoreFixture() + { + // We need dates definitively in the past and the future to properly test cookie expiration. + LLDate now = LLDate::now(); + LLDate past(now.secondsSinceEpoch() - (60.0 * 60.0 * 24.0)); // 1 day in the past + LLDate future(now.secondsSinceEpoch() + (60.0 * 60.0 * 24.0)); // 1 day in the future + + mPastString = past.asRFC1123(); + mFutureString = future.asRFC1123(); + } + + std::string mPastString; + std::string mFutureString; + LLPluginCookieStore mCookieStore; + + // List of cookies used for validation + std::list<std::string> mCookies; + + // This sets up mCookies from a string returned by one of the functions in LLPluginCookieStore + void setCookies(const std::string &cookies) + { + mCookies.clear(); + std::string::size_type start = 0; + + while(start != std::string::npos) + { + std::string::size_type end = cookies.find_first_of("\r\n", start); + if(end > start) + { + std::string line(cookies, start, end - start); + if(line.find_first_not_of("\r\n\t ") != std::string::npos) + { + // The line has some non-whitespace characters. Save it to the list. + mCookies.push_back(std::string(cookies, start, end - start)); + } + } + start = cookies.find_first_not_of("\r\n ", end); + } + } + + // This ensures that a cookie matching the one passed is in the list. + void ensureCookie(const std::string &cookie) + { + std::list<std::string>::iterator iter; + for(iter = mCookies.begin(); iter != mCookies.end(); iter++) + { + if(*iter == cookie) + { + // Found the cookie + // TODO: this should do a smarter equality comparison on the two cookies, instead of just a string compare. + return; + } + } + + // Didn't find this cookie + std::string message = "cookie not found: "; + message += cookie; + ensure(message, false); + } + + // This ensures that the number of cookies in the list matches what's expected. + void ensureSize(const std::string &message, size_t size) + { + if(mCookies.size() != size) + { + std::stringstream full_message; + + full_message << message << " (expected " << size << ", actual " << mCookies.size() << ")"; + ensure(full_message.str(), false); + } + } + }; + + typedef test_group<LLPluginCookieStoreFixture> factory; + typedef factory::object object; + factory tf("LLPluginCookieStore test"); + + // Tests + template<> template<> + void object::test<1>() + { + // Test 1: cookie uniqueness and update lists. + // Valid, distinct cookies: + + std::string cookie01 = "cookieA=value; domain=example.com; path=/"; + std::string cookie02 = "cookieB=value; Domain=example.com; Path=/; Max-Age=10; Secure; Version=1; Comment=foo!; HTTPOnly"; // cookie with every supported field, in different cases. + std::string cookie03 = "cookieA=value; domain=foo.example.com; path=/"; // different domain + std::string cookie04 = "cookieA=value; domain=example.com; path=/bar/"; // different path + std::string cookie05 = "cookieC; domain=example.com; path=/"; // empty value + std::string cookie06 = "cookieD=value; domain=example.com; path=/; expires="; // different name, persistent cookie + cookie06 += mFutureString; + + mCookieStore.setCookies(cookie01); + mCookieStore.setCookies(cookie02); + mCookieStore.setCookies(cookie03); + mCookieStore.setCookies(cookie04); + mCookieStore.setCookies(cookie05); + mCookieStore.setCookies(cookie06); + + // Invalid cookies (these will get parse errors and not be added to the store) + + std::string badcookie01 = "cookieD=value; domain=example.com; path=/; foo=bar"; // invalid field name + std::string badcookie02 = "cookieE=value; path=/"; // no domain + + mCookieStore.setCookies(badcookie01); + mCookieStore.setCookies(badcookie02); + + // All cookies added so far should have been marked as "changed" + setCookies(mCookieStore.getChangedCookies()); + ensureSize("count of changed cookies", 6); + ensureCookie(cookie01); + ensureCookie(cookie02); + ensureCookie(cookie03); + ensureCookie(cookie04); + ensureCookie(cookie05); + ensureCookie(cookie06); + + // Save off the current state of the cookie store (we'll restore it later) + std::string savedCookies = mCookieStore.getAllCookies(); + + // Test replacing cookies + std::string cookie01a = "cookieA=newvalue; domain=example.com; path=/"; // updated value + std::string cookie02a = "cookieB=newvalue; domain=example.com; path=/; expires="; // remove cookie (by setting an expire date in the past) + cookie02a += mPastString; + + mCookieStore.setCookies(cookie01a); + mCookieStore.setCookies(cookie02a); + + // test for getting changed cookies + setCookies(mCookieStore.getChangedCookies()); + ensureSize("count of updated cookies", 2); + ensureCookie(cookie01a); + ensureCookie(cookie02a); + + // and for the state of the store after getting changed cookies + setCookies(mCookieStore.getAllCookies()); + ensureSize("count of valid cookies", 5); + ensureCookie(cookie01a); + ensureCookie(cookie03); + ensureCookie(cookie04); + ensureCookie(cookie05); + ensureCookie(cookie06); + + // Check that only the persistent cookie is returned here + setCookies(mCookieStore.getPersistentCookies()); + ensureSize("count of persistent cookies", 1); + ensureCookie(cookie06); + + // Restore the cookie store to a previous state and verify + mCookieStore.setAllCookies(savedCookies); + + // Since setAllCookies defaults to not marking cookies as changed, this list should be empty. + setCookies(mCookieStore.getChangedCookies()); + ensureSize("count of changed cookies after restore", 0); + + // Verify that the restore worked as it should have. + setCookies(mCookieStore.getAllCookies()); + ensureSize("count of restored cookies", 6); + ensureCookie(cookie01); + ensureCookie(cookie02); + ensureCookie(cookie03); + ensureCookie(cookie04); + ensureCookie(cookie05); + ensureCookie(cookie06); + } + +} diff --git a/indra/llrender/llfontfreetype.cpp b/indra/llrender/llfontfreetype.cpp index 59e7d890f4..a86bbbffff 100644 --- a/indra/llrender/llfontfreetype.cpp +++ b/indra/llrender/llfontfreetype.cpp @@ -270,6 +270,14 @@ F32 LLFontFreetype::getXAdvance(llwchar wch) const return (F32)mFontBitmapCachep->getMaxCharWidth(); } +F32 LLFontFreetype::getXAdvance(const LLFontGlyphInfo* glyph) const +{ + if (mFTFace == NULL) + return 0.0; + + return glyph->mXAdvance; +} + F32 LLFontFreetype::getXKerning(llwchar char_left, llwchar char_right) const { if (mFTFace == NULL) @@ -289,6 +297,21 @@ F32 LLFontFreetype::getXKerning(llwchar char_left, llwchar char_right) const return delta.x*(1.f/64.f); } +F32 LLFontFreetype::getXKerning(const LLFontGlyphInfo* left_glyph_info, const LLFontGlyphInfo* right_glyph_info) const +{ + if (mFTFace == NULL) + return 0.0; + + U32 left_glyph = left_glyph_info ? left_glyph_info->mGlyphIndex : 0; + U32 right_glyph = right_glyph_info ? right_glyph_info->mGlyphIndex : 0; + + FT_Vector delta; + + llverify(!FT_Get_Kerning(mFTFace, left_glyph, right_glyph, ft_kerning_unfitted, &delta)); + + return delta.x*(1.f/64.f); +} + BOOL LLFontFreetype::hasGlyph(llwchar wch) const { llassert(!mIsFallback); @@ -504,8 +527,13 @@ void LLFontFreetype::resetBitmapCache() mCharGlyphInfoMap.clear(); mFontBitmapCachep->reset(); - // Add the empty glyph - addGlyphFromFont(this, 0, 0); + // Adding default glyph is skipped for fallback fonts here as well as in loadFace(). + // This if was added as fix for EXT-4971. + if(!mIsFallback) + { + // Add the empty glyph + addGlyphFromFont(this, 0, 0); + } } void LLFontFreetype::destroyGL() diff --git a/indra/llrender/llfontfreetype.h b/indra/llrender/llfontfreetype.h index 7a5d029038..f60d09316d 100644 --- a/indra/llrender/llfontfreetype.h +++ b/indra/llrender/llfontfreetype.h @@ -128,7 +128,9 @@ public: }; F32 getXAdvance(llwchar wc) const; + F32 getXAdvance(const LLFontGlyphInfo* glyph) const; F32 getXKerning(llwchar char_left, llwchar char_right) const; // Get the kerning between the two characters + F32 getXKerning(const LLFontGlyphInfo* left_glyph_info, const LLFontGlyphInfo* right_glyph_info) const; // Get the kerning between the two characters LLFontGlyphInfo* getGlyphInfo(llwchar wch) const; diff --git a/indra/llrender/llfontgl.cpp b/indra/llrender/llfontgl.cpp index b6a6b448ee..d9e1976341 100644 --- a/indra/llrender/llfontgl.cpp +++ b/indra/llrender/llfontgl.cpp @@ -151,14 +151,16 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons } } - gGL.pushMatrix(); - glLoadIdentity(); - gGL.translatef(floorf(sCurOrigin.mX*sScaleX), floorf(sCurOrigin.mY*sScaleY), sCurOrigin.mZ); + gGL.pushUIMatrix(); + + gGL.loadUIIdentity(); + + gGL.translateUI(floorf(sCurOrigin.mX*sScaleX), floorf(sCurOrigin.mY*sScaleY), sCurOrigin.mZ); // this code snaps the text origin to a pixel grid to start with F32 pixel_offset_x = llround((F32)sCurOrigin.mX) - (sCurOrigin.mX); F32 pixel_offset_y = llround((F32)sCurOrigin.mY) - (sCurOrigin.mY); - gGL.translatef(-pixel_offset_x, -pixel_offset_y, 0.f); + gGL.translateUI(-pixel_offset_x, -pixel_offset_y, 0.f); LLFastTimer t(FTM_RENDER_FONTS); @@ -246,14 +248,18 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons } - // Remember last-used texture to avoid unnecesssary bind calls. - LLImageGL *last_bound_texture = NULL; + const LLFontGlyphInfo* next_glyph = NULL; for (i = begin_offset; i < begin_offset + length; i++) { llwchar wch = wstr[i]; - const LLFontGlyphInfo* fgi= mFontFreetype->getGlyphInfo(wch); + const LLFontGlyphInfo* fgi = next_glyph; + next_glyph = NULL; + if(!fgi) + { + fgi = mFontFreetype->getGlyphInfo(wch); + } if (!fgi) { llerrs << "Missing Glyph Info" << llendl; @@ -261,12 +267,8 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons } // Per-glyph bitmap texture. LLImageGL *image_gl = mFontFreetype->getFontBitmapCache()->getImageGL(fgi->mBitmapNum); - if (last_bound_texture != image_gl) - { - gGL.getTexUnit(0)->bind(image_gl); - last_bound_texture = image_gl; - } - + gGL.getTexUnit(0)->bind(image_gl); + if ((start_x + scaled_max_pixels) < (cur_x + fgi->mXBearing + fgi->mWidth)) { // Not enough room for this character. @@ -295,7 +297,8 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons if (next_char && (next_char < LAST_CHARACTER)) { // Kern this puppy. - cur_x += mFontFreetype->getXKerning(wch, next_char); + next_glyph = mFontFreetype->getGlyphInfo(next_char); + cur_x += mFontFreetype->getXKerning(fgi, next_glyph); } // Round after kerning. @@ -330,10 +333,7 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons // recursively render ellipses at end of string // we've already reserved enough room - gGL.pushMatrix(); - //glLoadIdentity(); - //gGL.translatef(sCurOrigin.mX, sCurOrigin.mY, 0.0f); - //glScalef(sScaleX, sScaleY, 1.f); + gGL.pushUIMatrix(); renderUTF8(std::string("..."), 0, cur_x / sScaleX, (F32)y, @@ -344,10 +344,10 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons S32_MAX, max_pixels, right_x, FALSE); - gGL.popMatrix(); + gGL.popUIMatrix(); } - gGL.popMatrix(); + gGL.popUIMatrix(); return chars_drawn; } @@ -435,14 +435,21 @@ F32 LLFontGL::getWidthF32(const llwchar* wchars, S32 begin_offset, S32 max_chars F32 cur_x = 0; const S32 max_index = begin_offset + max_chars; + const LLFontGlyphInfo* next_glyph = NULL; + F32 width_padding = 0.f; for (S32 i = begin_offset; i < max_index && wchars[i] != 0; i++) { llwchar wch = wchars[i]; - const LLFontGlyphInfo* fgi= mFontFreetype->getGlyphInfo(wch); + const LLFontGlyphInfo* fgi = next_glyph; + next_glyph = NULL; + if(!fgi) + { + fgi = mFontFreetype->getGlyphInfo(wch); + } - F32 advance = mFontFreetype->getXAdvance(wch); + F32 advance = mFontFreetype->getXAdvance(fgi); // for the last character we want to measure the greater of its width and xadvance values // so keep track of the difference between these values for the each character we measure @@ -459,7 +466,8 @@ F32 LLFontGL::getWidthF32(const llwchar* wchars, S32 begin_offset, S32 max_chars && (next_char < LAST_CHARACTER)) { // Kern this puppy. - cur_x += mFontFreetype->getXKerning(wch, next_char); + next_glyph = mFontFreetype->getGlyphInfo(next_char); + cur_x += mFontFreetype->getXKerning(fgi, next_glyph); } // Round after kerning. cur_x = (F32)llround(cur_x); @@ -492,6 +500,8 @@ S32 LLFontGL::maxDrawableChars(const llwchar* wchars, F32 max_pixels, S32 max_ch // avoid S32 overflow when max_pixels == S32_MAX by staying in floating point F32 scaled_max_pixels = ceil(max_pixels * sScaleX); F32 width_padding = 0.f; + + LLFontGlyphInfo* next_glyph = NULL; S32 i; for (i=0; (i < max_chars); i++) @@ -534,8 +544,13 @@ S32 LLFontGL::maxDrawableChars(const llwchar* wchars, F32 max_pixels, S32 max_ch in_word = TRUE; } } - - LLFontGlyphInfo* fgi = mFontFreetype->getGlyphInfo(wch); + + LLFontGlyphInfo* fgi = next_glyph; + next_glyph = NULL; + if(!fgi) + { + fgi = mFontFreetype->getGlyphInfo(wch); + } // account for glyphs that run beyond the starting point for the next glyphs width_padding = llmax( 0.f, // always use positive padding amount @@ -554,7 +569,8 @@ S32 LLFontGL::maxDrawableChars(const llwchar* wchars, F32 max_pixels, S32 max_ch if (((i+1) < max_chars) && wchars[i+1]) { // Kern this puppy. - cur_x += mFontFreetype->getXKerning(wch, wchars[i+1]); + next_glyph = mFontFreetype->getGlyphInfo(wchars[i+1]); + cur_x += mFontFreetype->getXKerning(fgi, next_glyph); } // Round after kerning. @@ -657,9 +673,11 @@ S32 LLFontGL::charFromPixelOffset(const llwchar* wchars, S32 begin_offset, F32 t target_x *= sScaleX; // max_chars is S32_MAX by default, so make sure we don't get overflow - const S32 max_index = begin_offset + llmin(S32_MAX - begin_offset, max_chars); + const S32 max_index = begin_offset + llmin(S32_MAX - begin_offset, max_chars - 1); F32 scaled_max_pixels = max_pixels * sScaleX; + + const LLFontGlyphInfo* next_glyph = NULL; S32 pos; for (pos = begin_offset; pos < max_index; pos++) @@ -669,7 +687,15 @@ S32 LLFontGL::charFromPixelOffset(const llwchar* wchars, S32 begin_offset, F32 t { break; // done } - F32 char_width = mFontFreetype->getXAdvance(wch); + + const LLFontGlyphInfo* glyph = next_glyph; + next_glyph = NULL; + if(!glyph) + { + glyph = mFontFreetype->getGlyphInfo(wch); + } + + F32 char_width = mFontFreetype->getXAdvance(glyph); if (round) { @@ -695,11 +721,12 @@ S32 LLFontGL::charFromPixelOffset(const llwchar* wchars, S32 begin_offset, F32 t if (((pos + 1) < max_index) && (wchars[(pos + 1)])) { - llwchar next_char = wchars[pos + 1]; // Kern this puppy. - cur_x += mFontFreetype->getXKerning(wch, next_char); + next_glyph = mFontFreetype->getGlyphInfo(wchars[pos + 1]); + cur_x += mFontFreetype->getXKerning(glyph, next_glyph); } + // Round after kerning. cur_x = llround(cur_x); } diff --git a/indra/llrender/llfontregistry.cpp b/indra/llrender/llfontregistry.cpp index 7a3d6ec4f2..e619f89e1d 100644 --- a/indra/llrender/llfontregistry.cpp +++ b/indra/llrender/llfontregistry.cpp @@ -469,6 +469,8 @@ LLFontGL *LLFontRegistry::createFont(const LLFontDescriptor& desc) else { fontlist.push_back(fontp->mFontFreetype); + delete fontp; + fontp = NULL; } } } diff --git a/indra/llrender/llimagegl.cpp b/indra/llrender/llimagegl.cpp index 36ac3ff119..2d408f8e10 100644 --- a/indra/llrender/llimagegl.cpp +++ b/indra/llrender/llimagegl.cpp @@ -105,9 +105,9 @@ void check_all_images() } } -void LLImageGL::checkTexSize() const +void LLImageGL::checkTexSize(bool forced) const { - if (gDebugGL && mTarget == GL_TEXTURE_2D) + if ((forced || gDebugGL) && mTarget == GL_TEXTURE_2D) { GLint texname; glGetIntegerv(GL_TEXTURE_BINDING_2D, &texname); @@ -129,6 +129,8 @@ void LLImageGL::checkTexSize() const glGetTexLevelParameteriv(mTarget, 0, GL_TEXTURE_WIDTH, (GLint*)&x); glGetTexLevelParameteriv(mTarget, 0, GL_TEXTURE_HEIGHT, (GLint*)&y) ; stop_glerror() ; + llcallstacks << "w: " << x << " h: " << y << llcallstacksendl ; + if(!x || !y) { return ; @@ -138,11 +140,13 @@ void LLImageGL::checkTexSize() const error = TRUE; if (gDebugSession) { - gFailLog << "wrong texture size and discard level!" << std::endl; + gFailLog << "wrong texture size and discard level!" << + mWidth << " Height: " << mHeight << " Current Level: " << mCurrentDiscardLevel << std::endl; } else { - llerrs << "wrong texture size and discard level!" << llendl ; + llerrs << "wrong texture size and discard level: width: " << + mWidth << " Height: " << mHeight << " Current Level: " << mCurrentDiscardLevel << llendl ; } } @@ -1044,7 +1048,9 @@ BOOL LLImageGL::setSubImageFromFrameBuffer(S32 fb_x, S32 fb_y, S32 x_pos, S32 y_ { if (gGL.getTexUnit(0)->bind(this, false, true)) { - //checkTexSize() ; + checkTexSize(true) ; + llcallstacks << fb_x << " : " << fb_y << " : " << x_pos << " : " << y_pos << " : " << width << " : " << height << llcallstacksendl ; + glCopyTexSubImage2D(GL_TEXTURE_2D, 0, fb_x, fb_y, x_pos, y_pos, width, height); mGLTextureCreated = true; stop_glerror(); @@ -1699,8 +1705,8 @@ void LLImageGL::updatePickMask(S32 width, S32 height, const U8* data_in) U32 size = pick_width * pick_height; size = (size + 7) / 8; // pixelcount-to-bits mPickMask = new U8[size]; - mPickMaskWidth = pick_width; - mPickMaskHeight = pick_height; + mPickMaskWidth = pick_width - 1; + mPickMaskHeight = pick_height - 1; memset(mPickMask, 0, sizeof(U8) * size); @@ -1732,31 +1738,41 @@ BOOL LLImageGL::getMask(const LLVector2 &tc) if (mPickMask) { - F32 u = tc.mV[0] - floorf(tc.mV[0]); - F32 v = tc.mV[1] - floorf(tc.mV[1]); + F32 u,v; + if (LL_LIKELY(tc.isFinite())) + { + u = tc.mV[0] - floorf(tc.mV[0]); + v = tc.mV[1] - floorf(tc.mV[1]); + } + else + { + LL_WARNS_ONCE("render") << "Ugh, non-finite u/v in mask pick" << LL_ENDL; + u = v = 0.f; + // removing assert per EXT-4388 + // llassert(false); + } if (LL_UNLIKELY(u < 0.f || u > 1.f || v < 0.f || v > 1.f)) { LL_WARNS_ONCE("render") << "Ugh, u/v out of range in image mask pick" << LL_ENDL; u = v = 0.f; - llassert(false); + // removing assert per EXT-4388 + // llassert(false); } - llassert(mPickMaskWidth > 0 && mPickMaskHeight > 0); - S32 x = llfloor(u * mPickMaskWidth); S32 y = llfloor(v * mPickMaskHeight); - if (LL_UNLIKELY(x >= mPickMaskWidth)) + if (LL_UNLIKELY(x > mPickMaskWidth)) { LL_WARNS_ONCE("render") << "Ooh, width overrun on pick mask read, that coulda been bad." << LL_ENDL; - x = llmax(0, mPickMaskWidth-1); + x = llmax((U16)0, mPickMaskWidth); } - if (LL_UNLIKELY(y >= mPickMaskHeight)) + if (LL_UNLIKELY(y > mPickMaskHeight)) { LL_WARNS_ONCE("render") << "Ooh, height overrun on pick mask read, that woulda been bad." << LL_ENDL; - y = llmax(0, mPickMaskHeight-1); + y = llmax((U16)0, mPickMaskHeight); } S32 idx = y*mPickMaskWidth+x; diff --git a/indra/llrender/llimagegl.h b/indra/llrender/llimagegl.h index f0870c3fc4..41239d24c8 100644 --- a/indra/llrender/llimagegl.h +++ b/indra/llrender/llimagegl.h @@ -157,7 +157,7 @@ public: void updatePickMask(S32 width, S32 height, const U8* data_in); BOOL getMask(const LLVector2 &tc); - void checkTexSize() const ; + void checkTexSize(bool forced = false) const ; // Sets the addressing mode used to sample the texture // (such as wrapping, mirrored wrapping, and clamp) diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp index 595b8577ff..c3540a717c 100644 --- a/indra/llrender/llrender.cpp +++ b/indra/llrender/llrender.cpp @@ -49,6 +49,9 @@ F64 gGLLastProjection[16]; F64 gGLProjection[16]; S32 gGLViewport[4]; +U32 LLRender::sUICalls = 0; +U32 LLRender::sUIVerts = 0; + static const U32 LL_NUM_TEXTURE_LAYERS = 16; static GLenum sGLTextureType[] = @@ -90,7 +93,9 @@ static GLenum sGLBlendFactor[] = GL_DST_ALPHA, GL_SRC_ALPHA, GL_ONE_MINUS_DST_ALPHA, - GL_ONE_MINUS_SRC_ALPHA + GL_ONE_MINUS_SRC_ALPHA, + + GL_ZERO // 'BF_UNDEF' }; LLTexUnit::LLTexUnit(S32 index) @@ -116,6 +121,8 @@ void LLTexUnit::refreshState(void) // We set dirty to true so that the tex unit knows to ignore caching // and we reset the cached tex unit state + gGL.flush(); + glActiveTextureARB(GL_TEXTURE0_ARB + mIndex); if (mCurrTexType != TT_NONE) { @@ -145,6 +152,7 @@ void LLTexUnit::activate(void) if ((S32)gGL.mCurrTextureUnitIndex != mIndex || gGL.mDirty) { + gGL.flush(); glActiveTextureARB(GL_TEXTURE0_ARB + mIndex); gGL.mCurrTextureUnitIndex = mIndex; } @@ -176,6 +184,7 @@ void LLTexUnit::disable(void) { activate(); unbind(mCurrTexType); + gGL.flush(); glDisable(sGLTextureType[mCurrTexType]); mCurrTexType = TT_NONE; } @@ -255,10 +264,9 @@ bool LLTexUnit::bind(LLImageGL* texture, bool for_rendering, bool forceBind) return false ; } - gGL.flush(); - if ((mCurrTexture != texture->getTexName()) || forceBind) { + gGL.flush(); activate(); enable(texture->getTarget()); mCurrTexture = texture->getTexName(); @@ -382,6 +390,8 @@ void LLTexUnit::setTextureAddressMode(eTextureAddressMode mode) { if (mIndex < 0 || mCurrTexture == 0) return; + gGL.flush(); + activate(); glTexParameteri (sGLTextureType[mCurrTexType], GL_TEXTURE_WRAP_S, sGLAddressMode[mode]); @@ -396,6 +406,8 @@ void LLTexUnit::setTextureFilteringOption(LLTexUnit::eTextureFilterOptions optio { if (mIndex < 0 || mCurrTexture == 0) return; + gGL.flush(); + if (option == TFO_POINT) { glTexParameteri(sGLTextureType[mCurrTexType], GL_TEXTURE_MAG_FILTER, GL_NEAREST); @@ -445,6 +457,8 @@ void LLTexUnit::setTextureBlendType(eTextureBlendType type) return; } + gGL.flush(); + activate(); mCurrBlendType = type; S32 scale_amount = 1; @@ -561,6 +575,7 @@ void LLTexUnit::setTextureCombiner(eTextureBlendOp op, eTextureBlendSrc src1, eT if (mCurrBlendType != TB_COMBINE || gGL.mDirty) { mCurrBlendType = TB_COMBINE; + gGL.flush(); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB); } @@ -571,6 +586,8 @@ void LLTexUnit::setTextureCombiner(eTextureBlendOp op, eTextureBlendSrc src1, eT return; } + gGL.flush(); + // Get the gl source enums according to the eTextureBlendSrc sources passed in GLint source1 = getTextureSource(src1); GLint source2 = getTextureSource(src2); @@ -703,6 +720,7 @@ void LLTexUnit::setColorScale(S32 scale) if (mCurrColorScale != scale || gGL.mDirty) { mCurrColorScale = scale; + gGL.flush(); glTexEnvi( GL_TEXTURE_ENV, GL_RGB_SCALE, scale ); } } @@ -712,6 +730,7 @@ void LLTexUnit::setAlphaScale(S32 scale) if (mCurrAlphaScale != scale || gGL.mDirty) { mCurrAlphaScale = scale; + gGL.flush(); glTexEnvi( GL_TEXTURE_ENV, GL_ALPHA_SCALE, scale ); } } @@ -759,6 +778,8 @@ LLRender::LLRender() mCurrAlphaFunc = CF_DEFAULT; mCurrAlphaFuncVal = 0.01f; + mCurrBlendSFactor = BF_UNDEF; + mCurrBlendDFactor = BF_UNDEF; } LLRender::~LLRender() @@ -821,6 +842,88 @@ void LLRender::popMatrix() glPopMatrix(); } +void LLRender::translateUI(F32 x, F32 y, F32 z) +{ + if (mUIOffset.empty()) + { + llerrs << "Need to push a UI translation frame before offsetting" << llendl; + } + + mUIOffset.front().mV[0] += x; + mUIOffset.front().mV[1] += y; + mUIOffset.front().mV[2] += z; +} + +void LLRender::scaleUI(F32 x, F32 y, F32 z) +{ + if (mUIScale.empty()) + { + llerrs << "Need to push a UI transformation frame before scaling." << llendl; + } + + mUIScale.front().scaleVec(LLVector3(x,y,z)); +} + +void LLRender::pushUIMatrix() +{ + if (mUIOffset.empty()) + { + mUIOffset.push_front(LLVector3(0,0,0)); + } + else + { + mUIOffset.push_front(mUIOffset.front()); + } + + if (mUIScale.empty()) + { + mUIScale.push_front(LLVector3(1,1,1)); + } + else + { + mUIScale.push_front(mUIScale.front()); + } +} + +void LLRender::popUIMatrix() +{ + if (mUIOffset.empty()) + { + llerrs << "UI offset stack blown." << llendl; + } + mUIOffset.pop_front(); + mUIScale.pop_front(); +} + +LLVector3 LLRender::getUITranslation() +{ + if (mUIOffset.empty()) + { + llerrs << "UI offset stack empty." << llendl; + } + return mUIOffset.front(); +} + +LLVector3 LLRender::getUIScale() +{ + if (mUIScale.empty()) + { + llerrs << "UI scale stack empty." << llendl; + } + return mUIScale.front(); +} + + +void LLRender::loadUIIdentity() +{ + if (mUIOffset.empty()) + { + llerrs << "Need to push UI translation frame before clearing offset." << llendl; + } + mUIOffset.front().setVec(0,0,0); + mUIScale.front().setVec(1,1,1); +} + void LLRender::setColorMask(bool writeColor, bool writeAlpha) { setColorMask(writeColor, writeColor, writeColor, writeAlpha); @@ -843,29 +946,28 @@ void LLRender::setColorMask(bool writeColorR, bool writeColorG, bool writeColorB void LLRender::setSceneBlendType(eBlendType type) { - flush(); switch (type) { case BT_ALPHA: - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + blendFunc(BF_SOURCE_ALPHA, BF_ONE_MINUS_SOURCE_ALPHA); break; case BT_ADD: - glBlendFunc(GL_ONE, GL_ONE); + blendFunc(BF_ONE, BF_ONE); break; case BT_ADD_WITH_ALPHA: - glBlendFunc(GL_SRC_ALPHA, GL_ONE); + blendFunc(BF_SOURCE_ALPHA, BF_ONE); break; case BT_MULT: - glBlendFunc(GL_DST_COLOR, GL_ZERO); + blendFunc(BF_DEST_COLOR, BF_ZERO); break; case BT_MULT_ALPHA: - glBlendFunc(GL_DST_ALPHA, GL_ZERO); + blendFunc(BF_DEST_ALPHA, BF_ZERO); break; case BT_MULT_X2: - glBlendFunc(GL_DST_COLOR, GL_SRC_COLOR); + blendFunc(BF_DEST_COLOR, BF_SOURCE_COLOR); break; case BT_REPLACE: - glBlendFunc(GL_ONE, GL_ZERO); + blendFunc(BF_ONE, BF_ZERO); break; default: llerrs << "Unknown Scene Blend Type: " << type << llendl; @@ -891,8 +993,15 @@ void LLRender::setAlphaRejectSettings(eCompareFunc func, F32 value) void LLRender::blendFunc(eBlendFactor sfactor, eBlendFactor dfactor) { - flush(); - glBlendFunc(sGLBlendFactor[sfactor], sGLBlendFactor[dfactor]); + llassert(sfactor < BF_UNDEF); + llassert(dfactor < BF_UNDEF); + if (mCurrBlendSFactor != sfactor || mCurrBlendDFactor != dfactor) + { + mCurrBlendSFactor = sfactor; + mCurrBlendDFactor = dfactor; + flush(); + glBlendFunc(sGLBlendFactor[sfactor], sGLBlendFactor[dfactor]); + } } LLTexUnit* LLRender::getTexUnit(U32 index) @@ -1012,6 +1121,39 @@ void LLRender::flush() } #endif + if (!mUIOffset.empty()) + { + sUICalls++; + sUIVerts += mCount; + } + + if (gDebugGL) + { + if (mMode == LLRender::QUADS) + { + if (mCount%4 != 0) + { + llerrs << "Incomplete quad rendered." << llendl; + } + } + + if (mMode == LLRender::TRIANGLES) + { + if (mCount%3 != 0) + { + llerrs << "Incomplete triangle rendered." << llendl; + } + } + + if (mMode == LLRender::LINES) + { + if (mCount%2 != 0) + { + llerrs << "Incomplete line rendered." << llendl; + } + } + } + mBuffer->setBuffer(immediate_mask); mBuffer->drawArrays(mMode, 0, mCount); @@ -1031,7 +1173,16 @@ void LLRender::vertex3f(const GLfloat& x, const GLfloat& y, const GLfloat& z) return; } - mVerticesp[mCount] = LLVector3(x,y,z); + if (mUIOffset.empty()) + { + mVerticesp[mCount] = LLVector3(x,y,z); + } + else + { + LLVector3 vert = (LLVector3(x,y,z)+mUIOffset.front()).scaledVec(mUIScale.front()); + mVerticesp[mCount] = vert; + } + mCount++; if (mCount < 4096) { diff --git a/indra/llrender/llrender.h b/indra/llrender/llrender.h index 0121a190ee..a90fbd4a5c 100644 --- a/indra/llrender/llrender.h +++ b/indra/llrender/llrender.h @@ -270,7 +270,9 @@ public: BF_DEST_ALPHA, BF_SOURCE_ALPHA, BF_ONE_MINUS_DEST_ALPHA, - BF_ONE_MINUS_SOURCE_ALPHA + BF_ONE_MINUS_SOURCE_ALPHA, + + BF_UNDEF } eBlendFactor; LLRender(); @@ -286,6 +288,14 @@ public: void pushMatrix(); void popMatrix(); + void translateUI(F32 x, F32 y, F32 z); + void scaleUI(F32 x, F32 y, F32 z); + void pushUIMatrix(); + void popUIMatrix(); + void loadUIIdentity(); + LLVector3 getUITranslation(); + LLVector3 getUIScale(); + void flush(); void begin(const GLuint& mode); @@ -333,7 +343,9 @@ public: }; public: - + static U32 sUICalls; + static U32 sUIVerts; + private: bool mDirty; U32 mCount; @@ -350,7 +362,14 @@ private: std::vector<LLTexUnit*> mTexUnits; LLTexUnit* mDummyTexUnit; + eBlendFactor mCurrBlendSFactor; + eBlendFactor mCurrBlendDFactor; + F32 mMaxAnisotropy; + + std::list<LLVector3> mUIOffset; + std::list<LLVector3> mUIScale; + }; extern F64 gGLModelView[16]; diff --git a/indra/llrender/llrendersphere.cpp b/indra/llrender/llrendersphere.cpp index e22b753923..212963f270 100644 --- a/indra/llrender/llrendersphere.cpp +++ b/indra/llrender/llrendersphere.cpp @@ -68,45 +68,6 @@ void drawSolidSphere(GLdouble radius, GLint slices, GLint stacks) } -// lat = 0 is Z-axis -// lon = 0, lat = 90 at X-axis -void lat2xyz(LLVector3 * result, F32 lat, F32 lon) -{ - // Convert a latitude and longitude to x,y,z on a normal sphere and return it in result - F32 r; - result->mV[VX] = (F32) (cos(lon * DEG_TO_RAD) * sin(lat * DEG_TO_RAD)); - result->mV[VY] = (F32) (sin(lon * DEG_TO_RAD) * sin(lat * DEG_TO_RAD)); - r = (F32) pow(result->mV[VX] * result->mV[VX] + result->mV[VY] * result->mV[VY], 0.5f); - if (r == 1.0f) - { - result->mV[VZ] = 0.0f; - } - else - { - result->mV[VZ] = (F32) pow(1 - r*r, 0.5f); - if (lat > 90.01) - { - result->mV[VZ] *= -1.0; - } - } -} - -void lat2xyz_rad(LLVector3 * result, F32 lat, F32 lon) -{ - // Convert a latitude and longitude to x,y,z on a normal sphere and return it in result - F32 r; - result->mV[VX] = (F32) (cos(lon) * sin(lat)); - result->mV[VY] = (F32) (sin(lon) * sin(lat)); - r = (F32) pow(result->mV[VX] * result->mV[VX] + result->mV[VY] * result->mV[VY], 0.5f); - if (r == 1.0f) - result->mV[VZ] = 0.0f; - else - { - result->mV[VZ] = (F32) pow(1 - r*r, 0.5f); - if (lat > F_PI_BY_TWO) result->mV[VZ] *= -1.0; - } -} - // A couple thoughts on sphere drawing: // 1) You need more slices than stacks, but little less than 2:1 // 2) At low LOD, setting stacks to an odd number avoids a "band" around the equator, making things look smoother @@ -181,3 +142,50 @@ void LLRenderSphere::render() { glCallList(mDList[0]); } + +inline LLVector3 polar_to_cart(F32 latitude, F32 longitude) +{ + return LLVector3(sin(F_TWO_PI * latitude) * cos(F_TWO_PI * longitude), + sin(F_TWO_PI * latitude) * sin(F_TWO_PI * longitude), + cos(F_TWO_PI * latitude)); +} + + +void LLRenderSphere::renderGGL() +{ + S32 const LATITUDE_SLICES = 20; + S32 const LONGITUDE_SLICES = 30; + + if (mSpherePoints.empty()) + { + mSpherePoints.resize(LATITUDE_SLICES + 1); + for (S32 lat_i = 0; lat_i < LATITUDE_SLICES + 1; lat_i++) + { + mSpherePoints[lat_i].resize(LONGITUDE_SLICES + 1); + for (S32 lon_i = 0; lon_i < LONGITUDE_SLICES + 1; lon_i++) + { + F32 lat = (F32)lat_i / LATITUDE_SLICES; + F32 lon = (F32)lon_i / LONGITUDE_SLICES; + + mSpherePoints[lat_i][lon_i] = polar_to_cart(lat, lon); + } + } + } + + gGL.begin(LLRender::TRIANGLES); + + for (S32 lat_i = 0; lat_i < LATITUDE_SLICES; lat_i++) + { + for (S32 lon_i = 0; lon_i < LONGITUDE_SLICES; lon_i++) + { + gGL.vertex3fv(mSpherePoints[lat_i][lon_i].mV); + gGL.vertex3fv(mSpherePoints[lat_i][lon_i+1].mV); + gGL.vertex3fv(mSpherePoints[lat_i+1][lon_i].mV); + + gGL.vertex3fv(mSpherePoints[lat_i+1][lon_i].mV); + gGL.vertex3fv(mSpherePoints[lat_i][lon_i+1].mV); + gGL.vertex3fv(mSpherePoints[lat_i+1][lon_i+1].mV); + } + } + gGL.end(); +} diff --git a/indra/llrender/llrendersphere.h b/indra/llrender/llrendersphere.h index 617ee3e12e..ebc71b6146 100644 --- a/indra/llrender/llrendersphere.h +++ b/indra/llrender/llrendersphere.h @@ -52,6 +52,10 @@ public: void cleanupGL(); void render(F32 pixel_area); // of a box of size 1.0 at that position void render(); // render at highest LOD + void renderGGL(); // render using LLRender + +private: + std::vector< std::vector<LLVector3> > mSpherePoints; }; extern LLRenderSphere gSphere; diff --git a/indra/llui/CMakeLists.txt b/indra/llui/CMakeLists.txt index ce068618e2..12df9ccae4 100644 --- a/indra/llui/CMakeLists.txt +++ b/indra/llui/CMakeLists.txt @@ -52,6 +52,7 @@ set(llui_SOURCE_FILES llkeywords.cpp lllayoutstack.cpp lllineeditor.cpp + llloadingindicator.cpp lllocalcliprect.cpp llmenubutton.cpp llmenugl.cpp @@ -90,6 +91,8 @@ set(llui_SOURCE_FILES lltextbox.cpp lltexteditor.cpp lltextparser.cpp + lltextutil.cpp + lltextvalidate.cpp lltransutil.cpp lltoggleablemenu.cpp lltooltip.cpp @@ -143,6 +146,7 @@ set(llui_HEADER_FILES lllayoutstack.h lllazyvalue.h lllineeditor.h + llloadingindicator.h lllocalcliprect.h llmenubutton.h llmenugl.h @@ -182,6 +186,8 @@ set(llui_HEADER_FILES lltextbox.h lltexteditor.h lltextparser.h + lltextutil.h + lltextvalidate.h lltoggleablemenu.h lltooltip.h lltransutil.h @@ -207,6 +213,16 @@ set(llui_HEADER_FILES set_source_files_properties(${llui_HEADER_FILES} PROPERTIES HEADER_FILE_ONLY TRUE) +SET(llurlentry_TEST_DEPENDENCIES + llurlmatch.cpp + llurlregistry.cpp + ) + +set_source_files_properties(llurlentry.cpp + PROPERTIES LL_TEST_ADDITIONAL_SOURCE_FILES + "${llurlentry_TEST_DEPENDENCIES}" + ) + list(APPEND llui_SOURCE_FILES ${llui_HEADER_FILES}) add_library (llui ${llui_SOURCE_FILES}) diff --git a/indra/llui/llaccordionctrl.cpp b/indra/llui/llaccordionctrl.cpp index d0c73fbfbc..237d42090f 100644 --- a/indra/llui/llaccordionctrl.cpp +++ b/indra/llui/llaccordionctrl.cpp @@ -65,8 +65,14 @@ LLAccordionCtrl::LLAccordionCtrl(const Params& params):LLPanel(params) , mFitParent(params.fit_parent) , mAutoScrolling( false ) , mAutoScrollRate( 0.f ) + , mSelectedTab( NULL ) + , mTabComparator( NULL ) + , mNoVisibleTabsHelpText(NULL) + , mNoVisibleTabsOrigString(params.no_visible_tabs_text.initial_value().asString()) { - mSingleExpansion = params.single_expansion; + initNoTabsWidget(params.no_matched_tabs_text); + + mSingleExpansion = params.single_expansion; if(mFitParent && !mSingleExpansion) { llinfos << "fit_parent works best when combined with single_expansion" << llendl; @@ -76,7 +82,11 @@ LLAccordionCtrl::LLAccordionCtrl(const Params& params):LLPanel(params) LLAccordionCtrl::LLAccordionCtrl() : LLPanel() , mAutoScrolling( false ) , mAutoScrollRate( 0.f ) + , mSelectedTab( NULL ) + , mNoVisibleTabsHelpText(NULL) { + initNoTabsWidget(LLTextBox::Params()); + mSingleExpansion = false; mFitParent = false; LLUICtrlFactory::getInstance()->buildPanel(this, "accordion_parent.xml"); @@ -118,7 +128,6 @@ BOOL LLAccordionCtrl::postBuild() scrollbar_size, getRect().getHeight() - 1); - LLScrollbar::Params sbparams; sbparams.name("scrollable vertical"); sbparams.rect(scroll_rect); @@ -167,6 +176,8 @@ BOOL LLAccordionCtrl::postBuild() } } + updateNoTabsHelpTextVisibility(); + return TRUE; } @@ -186,8 +197,15 @@ void LLAccordionCtrl::reshape(S32 width, S32 height, BOOL called_from_parent) rcLocal.mRight = rcLocal.mLeft + width; rcLocal.mTop = rcLocal.mBottom + height; + // get textbox a chance to reshape its content + mNoVisibleTabsHelpText->reshape(width, height, called_from_parent); + setRect(rcLocal); + // assume that help text is always fit accordion. + // necessary text paddings can be set via h_pad and v_pad + mNoVisibleTabsHelpText->setRect(getLocalRect()); + arrange(); } @@ -330,44 +348,130 @@ void LLAccordionCtrl::addCollapsibleCtrl(LLView* view) LLAccordionCtrlTab* accordion_tab = dynamic_cast<LLAccordionCtrlTab*>(view); if(!accordion_tab) return; - if(std::find(getChildList()->begin(),getChildList()->end(),accordion_tab) == getChildList()->end()) + if(std::find(beginChild(), endChild(), accordion_tab) == endChild()) addChild(accordion_tab); mAccordionTabs.push_back(accordion_tab); - + accordion_tab->setDropDownStateChangedCallback( boost::bind(&LLAccordionCtrl::onCollapseCtrlCloseOpen, this, mAccordionTabs.size() - 1) ); + arrange(); +} + +void LLAccordionCtrl::removeCollapsibleCtrl(LLView* view) +{ + LLAccordionCtrlTab* accordion_tab = dynamic_cast<LLAccordionCtrlTab*>(view); + if(!accordion_tab) + return; + + if(std::find(beginChild(), endChild(), accordion_tab) != endChild()) + removeChild(accordion_tab); + for (std::vector<LLAccordionCtrlTab*>::iterator iter = mAccordionTabs.begin(); + iter != mAccordionTabs.end(); ++iter) + { + if (accordion_tab == (*iter)) + { + mAccordionTabs.erase(iter); + break; + } + } } +void LLAccordionCtrl::initNoTabsWidget(const LLTextBox::Params& tb_params) +{ + LLTextBox::Params tp = tb_params; + tp.rect(getLocalRect()); + mNoMatchedTabsOrigString = tp.initial_value().asString(); + mNoVisibleTabsHelpText = LLUICtrlFactory::create<LLTextBox>(tp, this); +} -void LLAccordionCtrl::arrange() +void LLAccordionCtrl::updateNoTabsHelpTextVisibility() { - if( mAccordionTabs.size() == 0) + bool visible_exists = false; + std::vector<LLAccordionCtrlTab*>::const_iterator it = mAccordionTabs.begin(); + const std::vector<LLAccordionCtrlTab*>::const_iterator it_end = mAccordionTabs.end(); + for (; it != it_end; ++it) { - //We do not arrange if we do not have what should be arranged - return; + if ((*it)->getVisible()) + { + visible_exists = true; + break; + } } - //Calculate params + mNoVisibleTabsHelpText->setVisible(!visible_exists); +} + +void LLAccordionCtrl::arrangeSinge() +{ S32 panel_left = BORDER_MARGIN; // Margin from left side of Splitter S32 panel_top = getRect().getHeight() - BORDER_MARGIN; // Top coordinate of the first panel S32 panel_width = getRect().getWidth() - 4; // Top coordinate of the first panel + S32 panel_height; - - if(mAccordionTabs.size() == 1) + S32 collapsed_height = 0; + + for(size_t i=0;i<mAccordionTabs.size();++i) { - LLAccordionCtrlTab* accordion_tab = dynamic_cast<LLAccordionCtrlTab*>(mAccordionTabs[0]); - - LLRect panel_rect = accordion_tab->getRect(); + LLAccordionCtrlTab* accordion_tab = dynamic_cast<LLAccordionCtrlTab*>(mAccordionTabs[i]); - S32 panel_height = getRect().getHeight() - 2*BORDER_MARGIN; + if(accordion_tab->getVisible() == false) //skip hidden accordion tabs + continue; + if(!accordion_tab->isExpanded() ) + { + collapsed_height+=mAccordionTabs[i]->getRect().getHeight(); + } + } - ctrlSetLeftTopAndSize(accordion_tab,panel_rect.mLeft,panel_top,panel_width,panel_height); + S32 expanded_height = getRect().getHeight() - BORDER_MARGIN - collapsed_height; + + for(size_t i=0;i<mAccordionTabs.size();++i) + { + LLAccordionCtrlTab* accordion_tab = dynamic_cast<LLAccordionCtrlTab*>(mAccordionTabs[i]); - show_hide_scrollbar(getRect().getWidth(),getRect().getHeight()); - return; + if(accordion_tab->getVisible() == false) //skip hidden accordion tabs + continue; + if(!accordion_tab->isExpanded() ) + { + panel_height = accordion_tab->getRect().getHeight(); + } + else + { + if(mFitParent) + { + panel_height = expanded_height; + } + else + { + if(accordion_tab->getAccordionView()) + { + panel_height = accordion_tab->getAccordionView()->getRect().getHeight() + + accordion_tab->getHeaderHeight() + 2*BORDER_MARGIN; + } + else + { + panel_height = accordion_tab->getRect().getHeight(); + } + } + } + + // make sure at least header is shown + panel_height = llmax(panel_height, accordion_tab->getHeaderHeight()); + ctrlSetLeftTopAndSize(mAccordionTabs[i], panel_left, panel_top, panel_width, panel_height); + panel_top-=mAccordionTabs[i]->getRect().getHeight(); } + show_hide_scrollbar(getRect().getWidth(), getRect().getHeight()); + updateLayout(getRect().getWidth(), getRect().getHeight()); +} + +void LLAccordionCtrl::arrangeMultiple() +{ + S32 panel_left = BORDER_MARGIN; // Margin from left side of Splitter + S32 panel_top = getRect().getHeight() - BORDER_MARGIN; // Top coordinate of the first panel + S32 panel_width = getRect().getWidth() - 4; // Top coordinate of the first panel + + //Calculate params for(size_t i = 0; i < mAccordionTabs.size(); i++ ) { LLAccordionCtrlTab* accordion_tab = dynamic_cast<LLAccordionCtrlTab*>(mAccordionTabs[i]); @@ -415,7 +519,44 @@ void LLAccordionCtrl::arrange() show_hide_scrollbar(getRect().getWidth(),getRect().getHeight()); updateLayout(getRect().getWidth(),getRect().getHeight()); +} + + +void LLAccordionCtrl::arrange() +{ + updateNoTabsHelpTextVisibility(); + + if( mAccordionTabs.size() == 0) + { + //We do not arrange if we do not have what should be arranged + return; + } + + if(mAccordionTabs.size() == 1) + { + S32 panel_top = getRect().getHeight() - BORDER_MARGIN; // Top coordinate of the first panel + S32 panel_width = getRect().getWidth() - 4; // Top coordinate of the first panel + + LLAccordionCtrlTab* accordion_tab = dynamic_cast<LLAccordionCtrlTab*>(mAccordionTabs[0]); + + LLRect panel_rect = accordion_tab->getRect(); + + S32 panel_height = getRect().getHeight() - 2*BORDER_MARGIN; + + if (accordion_tab->getFitParent()) + panel_height = accordion_tab->getRect().getHeight(); + ctrlSetLeftTopAndSize(accordion_tab,panel_rect.mLeft,panel_top,panel_width,panel_height); + + show_hide_scrollbar(getRect().getWidth(),getRect().getHeight()); + return; + + } + + if(mSingleExpansion) + arrangeSinge (); + else + arrangeMultiple (); } //--------------------------------------------------------------------------------- @@ -575,14 +716,44 @@ S32 LLAccordionCtrl::notifyParent(const LLSD& info) LLAccordionCtrlTab* accordion_tab = dynamic_cast<LLAccordionCtrlTab*>(mAccordionTabs[i]); if(accordion_tab->hasFocus() && i>0) { + bool prev_visible_tab_found = false; while(i>0) { if(mAccordionTabs[--i]->getVisible()) + { + prev_visible_tab_found = true; break; + } } - - accordion_tab = dynamic_cast<LLAccordionCtrlTab*>(mAccordionTabs[i]); - accordion_tab->notify(LLSD().with("action","select_last")); + + if (prev_visible_tab_found) + { + accordion_tab = dynamic_cast<LLAccordionCtrlTab*>(mAccordionTabs[i]); + accordion_tab->notify(LLSD().with("action","select_last")); + return 1; + } + break; + } + } + return 0; + } + else if(str_action == "select_current") + { + for(size_t i=0;i<mAccordionTabs.size();++i) + { + // Set selection to the currently focused tab. + if(mAccordionTabs[i]->hasFocus()) + { + if (mAccordionTabs[i] != mSelectedTab) + { + if (mSelectedTab) + { + mSelectedTab->setSelected(false); + } + mSelectedTab = mAccordionTabs[i]; + mSelectedTab->setSelected(true); + } + return 1; } } @@ -612,6 +783,20 @@ S32 LLAccordionCtrl::notifyParent(const LLSD& info) } return 1; } + else if (info.has("child_visibility_change")) + { + BOOL new_visibility = info["child_visibility_change"]; + if (new_visibility) + { + // there is at least one visible tab + mNoVisibleTabsHelpText->setVisible(FALSE); + } + else + { + // it could be the latest visible tab, check all of them + updateNoTabsHelpTextVisibility(); + } + } return LLPanel::notifyParent(info); } void LLAccordionCtrl::reset () @@ -620,6 +805,46 @@ void LLAccordionCtrl::reset () mScrollbar->setDocPos(0); } +void LLAccordionCtrl::sort() +{ + if (!mTabComparator) + { + llwarns << "No comparator specified for sorting accordion tabs." << llendl; + return; + } + + std::sort(mAccordionTabs.begin(), mAccordionTabs.end(), LLComparatorAdaptor(*mTabComparator)); + arrange(); +} + +void LLAccordionCtrl::setFilterSubString(const std::string& filter_string) +{ + LLStringUtil::format_map_t args; + args["[SEARCH_TERM]"] = LLURI::escape(filter_string); + std::string text = filter_string.empty() ? mNoVisibleTabsOrigString : mNoMatchedTabsOrigString; + LLStringUtil::format(text, args); + + mNoVisibleTabsHelpText->setValue(text); +} + +const LLAccordionCtrlTab* LLAccordionCtrl::getExpandedTab() const +{ + typedef std::vector<LLAccordionCtrlTab*>::const_iterator tabs_const_iterator; + + const LLAccordionCtrlTab* result = 0; + + for (tabs_const_iterator i = mAccordionTabs.begin(); i != mAccordionTabs.end(); ++i) + { + if ((*i)->isExpanded()) + { + result = *i; + break; + } + } + + return result; +} + S32 LLAccordionCtrl::calcExpandedTabHeight(S32 tab_index /* = 0 */, S32 available_height /* = 0 */) { if(tab_index < 0) diff --git a/indra/llui/llaccordionctrl.h b/indra/llui/llaccordionctrl.h index d57a42df32..b5fdf796cd 100644 --- a/indra/llui/llaccordionctrl.h +++ b/indra/llui/llaccordionctrl.h @@ -34,6 +34,7 @@ #define LL_ACCORDIONCTRL_H #include "llpanel.h" +#include "lltextbox.h" #include "llscrollbar.h" #include <vector> @@ -56,6 +57,19 @@ private: public: + /** + * Abstract comparator for accordion tabs. + */ + class LLTabComparator + { + public: + LLTabComparator() {}; + virtual ~LLTabComparator() {}; + + /** Returns true if tab1 < tab2, false otherwise */ + virtual bool compare(const LLAccordionCtrlTab* tab1, const LLAccordionCtrlTab* tab2) const = 0; + }; + struct Params : public LLInitParam::Block<Params, LLPanel::Params> { @@ -64,10 +78,14 @@ public: accordion tabs are responsible for scrolling their content. *NOTE fit_parent works best when combined with single_expansion. Accordion view should implement getRequiredRect() and provide valid height*/ + Optional<LLTextBox::Params> no_matched_tabs_text; + Optional<LLTextBox::Params> no_visible_tabs_text; Params() : single_expansion("single_expansion",false) , fit_parent("fit_parent", false) + , no_matched_tabs_text("no_matched_tabs_text") + , no_visible_tabs_text("no_visible_tabs_text") {}; }; @@ -92,6 +110,7 @@ public: virtual void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE); void addCollapsibleCtrl(LLView* view); + void removeCollapsibleCtrl(LLView* view); void arrange(); @@ -104,7 +123,30 @@ public: void reset (); + void setComparator(const LLTabComparator* comp) { mTabComparator = comp; } + void sort(); + + /** + * Sets filter substring as a search_term for help text when there are no any visible tabs. + */ + void setFilterSubString(const std::string& filter_string); + + /** + * This method returns the first expanded accordion tab. + * It is expected to be called for accordion which doesn't allow multiple + * tabs to be expanded. Use with care. + */ + const LLAccordionCtrlTab* getExpandedTab() const; + + const LLAccordionCtrlTab* getSelectedTab() const { return mSelectedTab; } + private: + void initNoTabsWidget(const LLTextBox::Params& tb_params); + void updateNoTabsHelpTextVisibility(); + + void arrangeSinge(); + void arrangeMultiple(); + // Calc Splitter's height that is necessary to display all child content S32 calcRecuiredHeight(); S32 getRecuiredHeight() const { return mInnerRect.getHeight(); } @@ -119,6 +161,21 @@ private: BOOL autoScroll (S32 x, S32 y); + /** + * An adaptor for LLTabComparator + */ + struct LLComparatorAdaptor + { + LLComparatorAdaptor(const LLTabComparator& comparator) : mComparator(comparator) {}; + + bool operator()(const LLAccordionCtrlTab* tab1, const LLAccordionCtrlTab* tab2) + { + return mComparator.compare(tab1, tab2); + } + + const LLTabComparator& mComparator; + }; + private: LLRect mInnerRect; LLScrollbar* mScrollbar; @@ -126,6 +183,13 @@ private: bool mFitParent; bool mAutoScrolling; F32 mAutoScrollRate; + LLTextBox* mNoVisibleTabsHelpText; + + std::string mNoMatchedTabsOrigString; + std::string mNoVisibleTabsOrigString; + + LLAccordionCtrlTab* mSelectedTab; + const LLTabComparator* mTabComparator; }; diff --git a/indra/llui/llaccordionctrltab.cpp b/indra/llui/llaccordionctrltab.cpp index daa9e08f14..20e4b7867c 100644 --- a/indra/llui/llaccordionctrltab.cpp +++ b/indra/llui/llaccordionctrltab.cpp @@ -32,11 +32,13 @@ #include "linden_common.h" -#include "lluictrl.h" - #include "llaccordionctrltab.h" +#include "lllocalcliprect.h" +#include "llscrollbar.h" #include "lltextbox.h" +#include "lltextutil.h" +#include "lluictrl.h" static const std::string DD_BUTTON_NAME = "dd_button"; static const std::string DD_TEXTBOX_NAME = "dd_textbox"; @@ -46,6 +48,8 @@ static const S32 HEADER_HEIGHT = 20; static const S32 HEADER_IMAGE_LEFT_OFFSET = 5; static const S32 HEADER_TEXT_LEFT_OFFSET = 30; static const F32 AUTO_OPEN_TIME = 1.f; +static const S32 VERTICAL_MULTIPLE = 16; +static const S32 PARENT_BORDER_MARGIN = 5; static LLDefaultChildRegistry::Register<LLAccordionCtrlTab> t1("accordion_tab"); @@ -69,7 +73,12 @@ public: virtual BOOL postBuild(); - void setTitle(const std::string& title); + std::string getTitle(); + void setTitle(const std::string& title, const std::string& hl); + + void setTitleFontStyle(std::string style); + + void setSelected(bool is_selected) { mIsSelected = is_selected; } virtual void onMouseEnter(S32 x, S32 y, MASK mask); virtual void onMouseLeave(S32 x, S32 y, MASK mask); @@ -95,9 +104,13 @@ private: LLPointer<LLUIImage> mImageHeaderPressed; LLPointer<LLUIImage> mImageHeaderFocused; + // style saved when applying it in setTitleFontStyle + LLStyle::Params mStyleParams; + LLUIColor mHeaderBGColor; bool mNeedsHighlight; + bool mIsSelected; LLFrameTimer mAutoOpenTimer; }; @@ -110,7 +123,8 @@ LLAccordionCtrlTab::LLAccordionCtrlTabHeader::LLAccordionCtrlTabHeader( const LLAccordionCtrlTabHeader::Params& p) : LLUICtrl(p) , mHeaderBGColor(p.header_bg_color()) -,mNeedsHighlight(false), +, mNeedsHighlight(false) +, mIsSelected(false), mImageCollapsed(p.header_collapse_img), mImageCollapsedPressed(p.header_collapse_img_pressed), mImageExpanded(p.header_expand_img), @@ -143,10 +157,39 @@ BOOL LLAccordionCtrlTab::LLAccordionCtrlTabHeader::postBuild() return TRUE; } -void LLAccordionCtrlTab::LLAccordionCtrlTabHeader::setTitle(const std::string& title) +std::string LLAccordionCtrlTab::LLAccordionCtrlTabHeader::getTitle() +{ + if(mHeaderTextbox) + { + return mHeaderTextbox->getText(); + } + else + { + return LLStringUtil::null; + } +} + +void LLAccordionCtrlTab::LLAccordionCtrlTabHeader::setTitle(const std::string& title, const std::string& hl) { if(mHeaderTextbox) - mHeaderTextbox->setText(title); + { + LLTextUtil::textboxSetHighlightedVal( + mHeaderTextbox, + mStyleParams, + title, + hl); + } +} + +void LLAccordionCtrlTab::LLAccordionCtrlTabHeader::setTitleFontStyle(std::string style) +{ + if (mHeaderTextbox) + { + std::string text = mHeaderTextbox->getText(); + mStyleParams.font(mHeaderTextbox->getDefaultFont()); + mStyleParams.font.style(style); + mHeaderTextbox->setText(text, mStyleParams); + } } void LLAccordionCtrlTab::LLAccordionCtrlTabHeader::draw() @@ -164,7 +207,7 @@ void LLAccordionCtrlTab::LLAccordionCtrlTabHeader::draw() // Only show green "focus" background image if the accordion is open, // because the user's mental model of focus is that it goes away after // the accordion is closed. - if (getParent()->hasFocus() + if (getParent()->hasFocus() || mIsSelected /*&& !(collapsible && !expanded)*/ // WHY?? ) { @@ -277,6 +320,8 @@ LLAccordionCtrlTab::Params::Params() ,header_image_pressed("header_image_pressed") ,header_image_focused("header_image_focused") ,header_text_color("header_text_color") + ,fit_panel("fit_panel",true) + ,selection_enabled("selection_enabled", false) { mouse_opaque(false); } @@ -293,6 +338,9 @@ LLAccordionCtrlTab::LLAccordionCtrlTab(const LLAccordionCtrlTab::Params&p) ,mPaddingTop(p.padding_top) ,mPaddingBottom(p.padding_bottom) ,mCanOpenClose(true) + ,mFitPanel(p.fit_panel) + ,mContainerPanel(NULL) + ,mScrollbar(NULL) { mStoredOpenCloseState = false; mWasStateStored = false; @@ -304,6 +352,11 @@ LLAccordionCtrlTab::LLAccordionCtrlTab(const LLAccordionCtrlTab::Params&p) mHeader = LLUICtrlFactory::create<LLAccordionCtrlTabHeader>(headerParams); addChild(mHeader, 1); + if (p.selection_enabled) + { + LLFocusableElement::setFocusReceivedCallback(boost::bind(&LLAccordionCtrlTab::selectOnFocusReceived, this)); + } + reshape(100, 200,FALSE); } @@ -321,54 +374,42 @@ void LLAccordionCtrlTab::setDisplayChildren(bool display) mExpandedHeight : HEADER_HEIGHT); setRect(rect); - for(child_list_const_iter_t it = getChildList()->begin(); - getChildList()->end() != it; ++it) - { - LLView* child = *it; - if(DD_HEADER_NAME == child->getName()) - continue; + if(mContainerPanel) + mContainerPanel->setVisible(getDisplayChildren()); - child->setVisible(getDisplayChildren()); + if(mDisplayChildren) + { + adjustContainerPanel(); } + else + { + if(mScrollbar) + mScrollbar->setVisible(false); + } + } void LLAccordionCtrlTab::reshape(S32 width, S32 height, BOOL called_from_parent /* = TRUE */) { LLRect headerRect; - LLUICtrl::reshape(width, height, TRUE); - headerRect.setLeftTopAndSize( 0,height,width,HEADER_HEIGHT); mHeader->setRect(headerRect); mHeader->reshape(headerRect.getWidth(), headerRect.getHeight()); - for(child_list_const_iter_t it = getChildList()->begin(); - getChildList()->end() != it; ++it) - { - LLView* child = *it; - if(DD_HEADER_NAME == child->getName()) - continue; - if(!child->getVisible()) - continue; - - LLRect childRect = child->getRect(); - S32 childWidth = width - getPaddingLeft() - getPaddingRight(); - S32 childHeight = height - getHeaderHeight() - getPaddingTop() - getPaddingBottom(); + if(!mDisplayChildren) + return; - child->reshape(childWidth,childHeight); - - childRect.setLeftTopAndSize( - getPaddingLeft(), - childHeight + getPaddingBottom(), - childWidth, - childHeight); + LLRect childRect; - child->setRect(childRect); - - break;//suppose that there is only one panel - } + childRect.setLeftTopAndSize( + getPaddingLeft(), + height - getHeaderHeight() - getPaddingTop(), + width - getPaddingLeft() - getPaddingRight(), + height - getHeaderHeight() - getPaddingTop() - getPaddingBottom() ); + adjustContainerPanel(childRect); } void LLAccordionCtrlTab::changeOpenClose(bool is_open) @@ -384,6 +425,13 @@ void LLAccordionCtrlTab::changeOpenClose(bool is_open) } } +void LLAccordionCtrlTab::handleVisibilityChange(BOOL new_visibility) +{ + LLUICtrl::handleVisibilityChange(new_visibility); + + notifyParent(LLSD().with("child_visibility_change", new_visibility)); +} + BOOL LLAccordionCtrlTab::handleMouseDown(S32 x, S32 y, MASK mask) { if(mCollapsible && mHeaderVisible && mCanOpenClose) @@ -430,6 +478,9 @@ bool LLAccordionCtrlTab::addChild(LLView* child, S32 tab_group) setDisplayChildren(getDisplayChildren()); } + if (!mContainerPanel) + mContainerPanel = findContainerView(); + return res; } @@ -438,8 +489,67 @@ void LLAccordionCtrlTab::setAccordionView(LLView* panel) addChild(panel,0); } +std::string LLAccordionCtrlTab::getTitle() const +{ + LLAccordionCtrlTabHeader* header = findChild<LLAccordionCtrlTabHeader>(DD_HEADER_NAME); + if (header) + { + return header->getTitle(); + } + else + { + return LLStringUtil::null; + } +} + +void LLAccordionCtrlTab::setTitle(const std::string& title, const std::string& hl) +{ + LLAccordionCtrlTabHeader* header = findChild<LLAccordionCtrlTabHeader>(DD_HEADER_NAME); + if (header) + { + header->setTitle(title, hl); + } +} + +void LLAccordionCtrlTab::setTitleFontStyle(std::string style) +{ + LLAccordionCtrlTabHeader* header = findChild<LLAccordionCtrlTabHeader>(DD_HEADER_NAME); + if (header) + { + header->setTitleFontStyle(style); + } +} -LLView* LLAccordionCtrlTab::getAccordionView() +boost::signals2::connection LLAccordionCtrlTab::setFocusReceivedCallback(const focus_signal_t::slot_type& cb) +{ + LLAccordionCtrlTabHeader* header = findChild<LLAccordionCtrlTabHeader>(DD_HEADER_NAME); + if (header) + { + return header->setFocusReceivedCallback(cb); + } + return boost::signals2::connection(); +} + +boost::signals2::connection LLAccordionCtrlTab::setFocusLostCallback(const focus_signal_t::slot_type& cb) +{ + LLAccordionCtrlTabHeader* header = findChild<LLAccordionCtrlTabHeader>(DD_HEADER_NAME); + if (header) + { + return header->setFocusLostCallback(cb); + } + return boost::signals2::connection(); +} + +void LLAccordionCtrlTab::setSelected(bool is_selected) +{ + LLAccordionCtrlTabHeader* header = findChild<LLAccordionCtrlTabHeader>(DD_HEADER_NAME); + if (header) + { + header->setSelected(is_selected); + } +} + +LLView* LLAccordionCtrlTab::findContainerView() { for(child_list_const_iter_t it = getChildList()->begin(); getChildList()->end() != it; ++it) @@ -454,6 +564,11 @@ LLView* LLAccordionCtrlTab::getAccordionView() return NULL; } +void LLAccordionCtrlTab::selectOnFocusReceived() +{ + if (getParent()) // A parent may not be set if tabs are added dynamically. + getParent()->notifyParent(LLSD().with("action", "select_current")); +} S32 LLAccordionCtrlTab::getHeaderHeight() { @@ -470,10 +585,49 @@ void LLAccordionCtrlTab::setHeaderVisible(bool value) reshape(getRect().getWidth(), getRect().getHeight(), FALSE); }; -//vurtual +//virtual BOOL LLAccordionCtrlTab::postBuild() { - mHeader->setVisible(mHeaderVisible); + if(mHeader) + mHeader->setVisible(mHeaderVisible); + + static LLUICachedControl<S32> scrollbar_size ("UIScrollbarSize", 0); + + LLRect scroll_rect; + scroll_rect.setOriginAndSize( + getRect().getWidth() - scrollbar_size, + 1, + scrollbar_size, + getRect().getHeight() - 1); + + mContainerPanel = findContainerView(); + + if(!mFitPanel) + { + LLScrollbar::Params sbparams; + sbparams.name("scrollable vertical"); + sbparams.rect(scroll_rect); + sbparams.orientation(LLScrollbar::VERTICAL); + sbparams.doc_size(getRect().getHeight()); + sbparams.doc_pos(0); + sbparams.page_size(getRect().getHeight()); + sbparams.step_size(VERTICAL_MULTIPLE); + sbparams.follows.flags(FOLLOWS_RIGHT | FOLLOWS_TOP | FOLLOWS_BOTTOM); + sbparams.change_callback(boost::bind(&LLAccordionCtrlTab::onScrollPosChangeCallback, this, _1, _2)); + + + mScrollbar = LLUICtrlFactory::create<LLScrollbar> (sbparams); + LLView::addChild( mScrollbar ); + mScrollbar->setFollowsRight(); + mScrollbar->setFollowsTop(); + mScrollbar->setFollowsBottom(); + + mScrollbar->setVisible(false); + } + + if(mContainerPanel) + mContainerPanel->setVisible(mDisplayChildren); + return LLUICtrl::postBuild(); } bool LLAccordionCtrlTab::notifyChildren (const LLSD& info) @@ -517,7 +671,8 @@ S32 LLAccordionCtrlTab::notifyParent(const LLSD& info) } //LLAccordionCtrl should rearrange accodion tab if one of accordion change its size - getParent()->notifyParent(info); + if (getParent()) // A parent may not be set if tabs are added dynamically. + getParent()->notifyParent(info); return 1; } else if(str_action == "select_prev") @@ -562,6 +717,12 @@ BOOL LLAccordionCtrlTab::handleKey(KEY key, MASK mask, BOOL called_from_parent) if( !header->hasFocus() ) return LLUICtrl::handleKey(key, mask, called_from_parent); + if ( (key == KEY_RETURN )&& mask == MASK_NONE) + { + changeOpenClose(getDisplayChildren()); + return TRUE; + } + if ( (key == KEY_ADD || key == KEY_RIGHT)&& mask == MASK_NONE) { if(getDisplayChildren() == false) @@ -608,6 +769,7 @@ void LLAccordionCtrlTab::showAndFocusHeader() { LLAccordionCtrlTabHeader* header = getChild<LLAccordionCtrlTabHeader>(DD_HEADER_NAME); header->setFocus(true); + header->setSelected(true); LLRect screen_rc; LLRect selected_rc = header->getRect(); @@ -622,6 +784,7 @@ void LLAccordionCtrlTab::storeOpenCloseState() mStoredOpenCloseState = getDisplayChildren(); mWasStateStored = true; } + void LLAccordionCtrlTab::restoreOpenCloseState() { if(!mWasStateStored) @@ -632,3 +795,214 @@ void LLAccordionCtrlTab::restoreOpenCloseState() } mWasStateStored = false; } + +void LLAccordionCtrlTab::adjustContainerPanel () +{ + S32 width = getRect().getWidth(); + S32 height = getRect().getHeight(); + + LLRect child_rect; + child_rect.setLeftTopAndSize( + getPaddingLeft(), + height - getHeaderHeight() - getPaddingTop(), + width - getPaddingLeft() - getPaddingRight(), + height - getHeaderHeight() - getPaddingTop() - getPaddingBottom() ); + + adjustContainerPanel(child_rect); +} + +void LLAccordionCtrlTab::adjustContainerPanel(const LLRect& child_rect) +{ + if(!mContainerPanel) + return; + + if(!mFitPanel) + { + show_hide_scrollbar(child_rect); + updateLayout(child_rect); + } + else + { + mContainerPanel->reshape(child_rect.getWidth(),child_rect.getHeight()); + mContainerPanel->setRect(child_rect); + } +} + +S32 LLAccordionCtrlTab::getChildViewHeight() +{ + if(!mContainerPanel) + return 0; + return mContainerPanel->getRect().getHeight(); +} + +void LLAccordionCtrlTab::show_hide_scrollbar(const LLRect& child_rect) +{ + if(getChildViewHeight() > child_rect.getHeight() ) + showScrollbar(child_rect); + else + hideScrollbar(child_rect); +} +void LLAccordionCtrlTab::showScrollbar(const LLRect& child_rect) +{ + if(!mContainerPanel || !mScrollbar) + return; + bool was_visible = mScrollbar->getVisible(); + mScrollbar->setVisible(true); + + static LLUICachedControl<S32> scrollbar_size ("UIScrollbarSize", 0); + + { + ctrlSetLeftTopAndSize(mScrollbar,child_rect.getWidth()-scrollbar_size, + child_rect.getHeight()-PARENT_BORDER_MARGIN, + scrollbar_size, + child_rect.getHeight()-2*PARENT_BORDER_MARGIN); + } + + LLRect orig_rect = mContainerPanel->getRect(); + + mScrollbar->setPageSize(child_rect.getHeight()); + mScrollbar->setDocParams(orig_rect.getHeight(),mScrollbar->getDocPos()); + + if(was_visible) + { + S32 scroll_pos = llmin(mScrollbar->getDocPos(), orig_rect.getHeight() - child_rect.getHeight() - 1); + mScrollbar->setDocPos(scroll_pos); + } + else//shrink child panel + { + updateLayout(child_rect); + } + +} + +void LLAccordionCtrlTab::hideScrollbar( const LLRect& child_rect ) +{ + if(!mContainerPanel || !mScrollbar) + return; + + if(mScrollbar->getVisible() == false) + return; + mScrollbar->setVisible(false); + mScrollbar->setDocPos(0); + + //shrink child panel + updateLayout(child_rect); +} + +void LLAccordionCtrlTab::onScrollPosChangeCallback(S32, LLScrollbar*) +{ + LLRect child_rect; + + S32 width = getRect().getWidth(); + S32 height = getRect().getHeight(); + + child_rect.setLeftTopAndSize( + getPaddingLeft(), + height - getHeaderHeight() - getPaddingTop(), + width - getPaddingLeft() - getPaddingRight(), + height - getHeaderHeight() - getPaddingTop() - getPaddingBottom() ); + + updateLayout(child_rect); +} + +void LLAccordionCtrlTab::drawChild(const LLRect& root_rect,LLView* child) +{ + if (child && child->getVisible() && child->getRect().isValid()) + { + LLRect screen_rect; + localRectToScreen(child->getRect(),&screen_rect); + + if ( root_rect.overlaps(screen_rect) && LLUI::sDirtyRect.overlaps(screen_rect)) + { + glMatrixMode(GL_MODELVIEW); + LLUI::pushMatrix(); + { + LLUI::translate((F32)child->getRect().mLeft, (F32)child->getRect().mBottom, 0.f); + child->draw(); + + } + LLUI::popMatrix(); + } + } +} + +void LLAccordionCtrlTab::draw() +{ + if(mFitPanel) + LLUICtrl::draw(); + else + { + LLRect root_rect = getRootView()->getRect(); + drawChild(root_rect,mHeader); + drawChild(root_rect,mScrollbar ); + { + LLRect child_rect; + + S32 width = getRect().getWidth(); + S32 height = getRect().getHeight(); + + child_rect.setLeftTopAndSize( + getPaddingLeft(), + height - getHeaderHeight() - getPaddingTop(), + width - getPaddingLeft() - getPaddingRight(), + height - getHeaderHeight() - getPaddingTop() - getPaddingBottom() ); + + LLLocalClipRect clip(child_rect); + drawChild(root_rect,mContainerPanel); + } + } +} + +void LLAccordionCtrlTab::updateLayout ( const LLRect& child_rect ) +{ + LLView* child = getAccordionView(); + if(!mContainerPanel) + return; + + S32 panel_top = child_rect.getHeight(); + S32 panel_width = child_rect.getWidth(); + + static LLUICachedControl<S32> scrollbar_size ("UIScrollbarSize", 0); + if(mScrollbar->getVisible() != false) + { + panel_top+=mScrollbar->getDocPos(); + panel_width-=scrollbar_size; + } + + //set sizes for first panels and dragbars + LLRect panel_rect = child->getRect(); + ctrlSetLeftTopAndSize(mContainerPanel,child_rect.mLeft,panel_top,panel_width,panel_rect.getHeight()); +} +void LLAccordionCtrlTab::ctrlSetLeftTopAndSize(LLView* panel, S32 left, S32 top, S32 width, S32 height) +{ + if(!panel) + return; + LLRect panel_rect = panel->getRect(); + panel_rect.setLeftTopAndSize( left, top, width, height); + panel->reshape( width, height, 1); + panel->setRect(panel_rect); +} +BOOL LLAccordionCtrlTab::handleToolTip(S32 x, S32 y, MASK mask) +{ + //header may be not the first child but we need to process it first + if(y >= (getRect().getHeight() - HEADER_HEIGHT - HEADER_HEIGHT/2) ) + { + //inside tab header + //fix for EXT-6619 + return TRUE; + } + return LLUICtrl::handleToolTip(x, y, mask); +} +BOOL LLAccordionCtrlTab::handleScrollWheel ( S32 x, S32 y, S32 clicks ) +{ + if( LLUICtrl::handleScrollWheel(x,y,clicks)) + { + return TRUE; + } + if( mScrollbar && mScrollbar->getVisible() && mScrollbar->handleScrollWheel( 0, 0, clicks ) ) + { + return TRUE; + } + return FALSE; +} + diff --git a/indra/llui/llaccordionctrltab.h b/indra/llui/llaccordionctrltab.h index 2e0260ab16..e17ecc5319 100644 --- a/indra/llui/llaccordionctrltab.h +++ b/indra/llui/llaccordionctrltab.h @@ -35,12 +35,15 @@ #include <string> #include "llrect.h" +#include "lluictrl.h" +#include "lluicolor.h" +#include "llstyle.h" -class LLUICtrl; class LLUICtrlFactory; class LLUIImage; class LLButton; class LLTextBox; +class LLScrollbar; @@ -84,6 +87,10 @@ public: Optional<bool> header_visible; + Optional<bool> fit_panel; + + Optional<bool> selection_enabled; + Optional<S32> padding_left; Optional<S32> padding_right; Optional<S32> padding_top; @@ -107,7 +114,20 @@ public: //set LLAccordionCtrlTab panel void setAccordionView(LLView* panel); - LLView* getAccordionView(); + LLView* getAccordionView() { return mContainerPanel; }; + + std::string getTitle() const; + + // Set text and highlight substring in LLAccordionCtrlTabHeader + void setTitle(const std::string& title, const std::string& hl = LLStringUtil::null); + + // Set text font style in LLAccordionCtrlTabHeader + void setTitleFontStyle(std::string style); + + boost::signals2::connection setFocusReceivedCallback(const focus_signal_t::slot_type& cb); + boost::signals2::connection setFocusLostCallback(const focus_signal_t::slot_type& cb); + + void setSelected(bool is_selected); bool getCollapsible() {return mCollapsible;}; @@ -123,6 +143,8 @@ public: S32 notify(const LLSD& info); bool notifyChildren(const LLSD& info); + void draw(); + void storeOpenCloseState (); void restoreOpenCloseState (); @@ -136,15 +158,24 @@ public: // Call reshape after changing size virtual void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE); + /** + * Raises notifyParent event with "child_visibility_change" = new_visibility + */ + void handleVisibilityChange(BOOL new_visibility); + // Changes expand/collapse state and triggers expand/collapse callbacks virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask); virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask); virtual BOOL handleKey(KEY key, MASK mask, BOOL called_from_parent); + virtual BOOL handleToolTip(S32 x, S32 y, MASK mask); + virtual BOOL handleScrollWheel( S32 x, S32 y, S32 clicks ); + + virtual bool addChild(LLView* child, S32 tab_group); - bool isExpanded() { return mDisplayChildren; } + bool isExpanded() const { return mDisplayChildren; } S32 getHeaderHeight(); @@ -164,9 +195,30 @@ public: void showAndFocusHeader(); -private: + void setFitPanel( bool fit ) { mFitPanel = true; } + bool getFitParent() const { return mFitPanel; } - +protected: + void adjustContainerPanel (const LLRect& child_rect); + void adjustContainerPanel (); + S32 getChildViewHeight (); + + void onScrollPosChangeCallback(S32, LLScrollbar*); + + void show_hide_scrollbar (const LLRect& child_rect); + void showScrollbar (const LLRect& child_rect); + void hideScrollbar (const LLRect& child_rect); + + void updateLayout ( const LLRect& child_rect ); + void ctrlSetLeftTopAndSize (LLView* panel, S32 left, S32 top, S32 width, S32 height); + + void drawChild(const LLRect& root_rect,LLView* child); + + LLView* findContainerView (); + + void selectOnFocusReceived(); + +private: class LLAccordionCtrlTabHeader; LLAccordionCtrlTabHeader* mHeader; //Header @@ -176,6 +228,7 @@ private: bool mHeaderVisible; bool mCanOpenClose; + bool mFitPanel; S32 mPaddingLeft; S32 mPaddingRight; @@ -185,6 +238,8 @@ private: bool mStoredOpenCloseState; bool mWasStateStored; + LLScrollbar* mScrollbar; + LLView* mContainerPanel; LLUIColor mDropdownBGColor; }; diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp index 4944ed4fe7..34f3049f2e 100644 --- a/indra/llui/llbutton.cpp +++ b/indra/llui/llbutton.cpp @@ -81,10 +81,9 @@ LLButton::Params::Params() image_pressed_selected("image_pressed_selected"), image_overlay("image_overlay"), image_overlay_alignment("image_overlay_alignment", std::string("center")), - image_left_pad("image_left_pad"), - image_right_pad("image_right_pad"), image_top_pad("image_top_pad"), image_bottom_pad("image_bottom_pad"), + imgoverlay_label_space("imgoverlay_label_space", 1), label_color("label_color"), label_color_selected("label_color_selected"), // requires is_toggle true label_color_disabled("label_color_disabled"), @@ -129,6 +128,7 @@ LLButton::LLButton(const LLButton::Params& p) mImageSelected(p.image_selected), mImageDisabled(p.image_disabled), mImageDisabledSelected(p.image_disabled_selected), + mImageFlash(p.image_flash), mImagePressed(p.image_pressed), mImagePressedSelected(p.image_pressed_selected), mImageHoverSelected(p.image_hover_selected), @@ -144,10 +144,9 @@ LLButton::LLButton(const LLButton::Params& p) mImageOverlay(p.image_overlay()), mImageOverlayColor(p.image_overlay_color()), mImageOverlayAlignment(LLFontGL::hAlignFromName(p.image_overlay_alignment)), - mImageOverlayLeftPad(p.image_left_pad), - mImageOverlayRightPad(p.image_right_pad), mImageOverlayTopPad(p.image_top_pad), mImageOverlayBottomPad(p.image_bottom_pad), + mImgOverlayLabelSpace(p.imgoverlay_label_space), mIsToggle(p.is_toggle), mScaleImage(p.scale_image), mDropShadowedText(p.label_shadow), @@ -637,14 +636,24 @@ void LLButton::draw() if (mFlashing) { - LLColor4 flash_color = mFlashBgColor.get(); - use_glow_effect = TRUE; - glow_type = LLRender::BT_ALPHA; // blend the glow - - if (mNeedsHighlight) // highlighted AND flashing - glow_color = (glow_color*0.5f + flash_color*0.5f) % 2.0f; // average between flash and highlight colour, with sum of the opacity + // if button should flash and we have icon for flashing, use it as image for button + if(flash && mImageFlash) + { + // setting flash to false to avoid its further influence on glow + flash = false; + imagep = mImageFlash; + } + // else use usual flashing via flash_color else - glow_color = flash_color; + { + LLColor4 flash_color = mFlashBgColor.get(); + use_glow_effect = TRUE; + glow_type = LLRender::BT_ALPHA; // blend the glow + if (mNeedsHighlight) // highlighted AND flashing + glow_color = (glow_color*0.5f + flash_color*0.5f) % 2.0f; // average between flash and highlight colour, with sum of the opacity + else + glow_color = flash_color; + } } if (mNeedsHighlight && !imagep) @@ -771,12 +780,7 @@ void LLButton::draw() center_x++; } - S32 text_width_delta = overlay_width + 1; - // if image paddings set, they should participate in scaling process - S32 image_size_delta = mImageOverlayTopPad + mImageOverlayBottomPad; - overlay_width = overlay_width - image_size_delta; - overlay_height = overlay_height - image_size_delta; - + center_y += (mImageOverlayBottomPad - mImageOverlayTopPad); // fade out overlay images on disabled buttons LLColor4 overlay_color = mImageOverlayColor.get(); if (!enabled) @@ -788,10 +792,9 @@ void LLButton::draw() switch(mImageOverlayAlignment) { case LLFontGL::LEFT: - text_left += overlay_width + mImageOverlayRightPad + 1; - text_width -= text_width_delta; + text_left += overlay_width + mImgOverlayLabelSpace; mImageOverlay->draw( - mLeftHPad, + mLeftHPad, center_y - (overlay_height / 2), overlay_width, overlay_height, @@ -806,10 +809,9 @@ void LLButton::draw() overlay_color); break; case LLFontGL::RIGHT: - text_right -= overlay_width + mImageOverlayLeftPad+ 1; - text_width -= text_width_delta; + text_right -= overlay_width + mImgOverlayLabelSpace; mImageOverlay->draw( - getRect().getWidth() - mRightHPad - overlay_width, + getRect().getWidth() - mRightHPad - overlay_width, center_y - (overlay_height / 2), overlay_width, overlay_height, @@ -833,7 +835,7 @@ void LLButton::draw() x = text_right; break; case LLFontGL::HCENTER: - x = getRect().getWidth() / 2; + x = text_left + (text_width / 2); break; case LLFontGL::LEFT: default: @@ -1012,6 +1014,11 @@ void LLButton::setImageDisabledSelected(LLPointer<LLUIImage> image) mFadeWhenDisabled = TRUE; } +void LLButton::setImagePressed(LLPointer<LLUIImage> image) +{ + mImagePressed = image; +} + void LLButton::setImageHoverSelected(LLPointer<LLUIImage> image) { mImageHoverSelected = image; @@ -1022,6 +1029,11 @@ void LLButton::setImageHoverUnselected(LLPointer<LLUIImage> image) mImageHoverUnselected = image; } +void LLButton::setImageFlash(LLPointer<LLUIImage> image) +{ + mImageFlash = image; +} + void LLButton::setImageOverlay(const std::string& image_name, LLFontGL::HAlign alignment, const LLColor4& color) { if (image_name.empty()) diff --git a/indra/llui/llbutton.h b/indra/llui/llbutton.h index 8e5f19602f..9bd566d3c9 100644 --- a/indra/llui/llbutton.h +++ b/indra/llui/llbutton.h @@ -84,6 +84,7 @@ public: image_hover_unselected, image_disabled_selected, image_disabled, + image_flash, image_pressed, image_pressed_selected, image_overlay; @@ -107,11 +108,14 @@ public: Optional<S32> pad_bottom; // under text label //image overlay paddings - Optional<S32> image_left_pad; - Optional<S32> image_right_pad; Optional<S32> image_top_pad; Optional<S32> image_bottom_pad; + /** + * Space between image_overlay and label + */ + Optional<S32> imgoverlay_label_space; + // callbacks Optional<CommitCallbackParam> click_callback, // alias -> commit_callback mouse_down_callback, @@ -192,10 +196,6 @@ public: void setLeftHPad( S32 pad ) { mLeftHPad = pad; } void setRightHPad( S32 pad ) { mRightHPad = pad; } - void setImageOverlayLeftPad( S32 pad ) { mImageOverlayLeftPad = pad; } - S32 getImageOverlayLeftPad() const { return mImageOverlayLeftPad; } - void setImageOverlayRightPad( S32 pad ) { mImageOverlayRightPad = pad; } - S32 getImageOverlayRightPad() const { return mImageOverlayRightPad; } void setImageOverlayTopPad( S32 pad ) { mImageOverlayTopPad = pad; } S32 getImageOverlayTopPad() const { return mImageOverlayTopPad; } void setImageOverlayBottomPad( S32 pad ) { mImageOverlayBottomPad = pad; } @@ -217,7 +217,8 @@ public: void setImageOverlay(const std::string& image_name, LLFontGL::HAlign alignment = LLFontGL::HCENTER, const LLColor4& color = LLColor4::white); void setImageOverlay(const LLUUID& image_id, LLFontGL::HAlign alignment = LLFontGL::HCENTER, const LLColor4& color = LLColor4::white); LLPointer<LLUIImage> getImageOverlay() { return mImageOverlay; } - + LLFontGL::HAlign getImageOverlayHAlign() const { return mImageOverlayAlignment; } + void autoResize(); // resize with label of current btn state void resize(LLUIString label); // resize with label input void setLabel( const LLStringExplicit& label); @@ -246,6 +247,8 @@ public: void setImageHoverUnselected(LLPointer<LLUIImage> image); void setImageDisabled(LLPointer<LLUIImage> image); void setImageDisabledSelected(LLPointer<LLUIImage> image); + void setImageFlash(LLPointer<LLUIImage> image); + void setImagePressed(LLPointer<LLUIImage> image); void setCommitOnReturn(BOOL commit) { mCommitOnReturn = commit; } BOOL getCommitOnReturn() const { return mCommitOnReturn; } @@ -258,6 +261,8 @@ public: void setForcePressedState(bool b) { mForcePressedState = b; } + void setAutoResize(bool auto_resize) { mAutoResize = auto_resize; } + protected: LLPointer<LLUIImage> getImageUnselected() const { return mImageUnselected; } LLPointer<LLUIImage> getImageSelected() const { return mImageSelected; } @@ -307,6 +312,11 @@ private: LLPointer<LLUIImage> mImagePressed; LLPointer<LLUIImage> mImagePressedSelected; + /* There are two ways an image can flash- by making changes in color according to flash_color attribute + or by changing icon from current to the one specified in image_flash. Second way is used only if + flash icon name is set in attributes(by default it isn't). First way is used otherwise. */ + LLPointer<LLUIImage> mImageFlash; + LLUIColor mHighlightColor; LLUIColor mFlashBgColor; @@ -328,11 +338,14 @@ private: S32 mRightHPad; S32 mBottomVPad; // under text label - S32 mImageOverlayLeftPad; - S32 mImageOverlayRightPad; S32 mImageOverlayTopPad; S32 mImageOverlayBottomPad; + /* + * Space between image_overlay and label + */ + S32 mImgOverlayLabelSpace; + F32 mHoverGlowStrength; F32 mCurGlowStrength; diff --git a/indra/llui/llcombobox.cpp b/indra/llui/llcombobox.cpp index 9d23daf56d..cc107c972d 100644 --- a/indra/llui/llcombobox.cpp +++ b/indra/llui/llcombobox.cpp @@ -160,7 +160,7 @@ LLComboBox::LLComboBox(const LLComboBox::Params& p) createLineEditor(p); - setTopLostCallback(boost::bind(&LLComboBox::hideList, this)); + mTopLostSignalConnection = setTopLostCallback(boost::bind(&LLComboBox::hideList, this)); } void LLComboBox::initFromParams(const LLComboBox::Params& p) @@ -187,6 +187,9 @@ BOOL LLComboBox::postBuild() LLComboBox::~LLComboBox() { // children automatically deleted, including mMenu, mButton + + // explicitly disconect this signal, since base class destructor might fire top lost + mTopLostSignalConnection.disconnect(); } @@ -320,15 +323,19 @@ void LLComboBox::setValue(const LLSD& value) LLScrollListItem* item = mList->getFirstSelected(); if (item) { - setLabel( mList->getSelectedItemLabel() ); + setLabel(getSelectedItemLabel()); } mLastSelectedIndex = mList->getFirstSelectedIndex(); } + else + { + mLastSelectedIndex = -1; + } } const std::string LLComboBox::getSimple() const { - const std::string res = mList->getSelectedItemLabel(); + const std::string res = getSelectedItemLabel(); if (res.empty() && mAllowTextEntry) { return mTextEntry->getText(); @@ -407,7 +414,7 @@ BOOL LLComboBox::remove(S32 index) if (index < mList->getItemCount()) { mList->deleteSingleItem(index); - setLabel(mList->getSelectedItemLabel()); + setLabel(getSelectedItemLabel()); return TRUE; } return FALSE; @@ -448,7 +455,7 @@ BOOL LLComboBox::setCurrentByIndex( S32 index ) BOOL found = mList->selectNthItem( index ); if (found) { - setLabel(mList->getSelectedItemLabel()); + setLabel(getSelectedItemLabel()); mLastSelectedIndex = index; } return found; @@ -488,7 +495,6 @@ void LLComboBox::createLineEditor(const LLComboBox::Params& p) params.max_length_bytes(mMaxChars); params.commit_callback.function(boost::bind(&LLComboBox::onTextCommit, this, _2)); params.keystroke_callback(boost::bind(&LLComboBox::onTextEntry, this, _1)); - params.handle_edit_keys_directly(true); params.commit_on_focus_lost(false); params.follows.flags(FOLLOWS_ALL); params.label(mLabel); @@ -612,16 +618,14 @@ void LLComboBox::showList() mList->setFocus(TRUE); - // register ourselves as a "top" control - // effectively putting us into a special draw layer - // and not affecting the bounding rectangle calculation - gFocusMgr.setTopCtrl(this); - // Show the list and push the button down mButton->setToggleState(TRUE); mList->setVisible(TRUE); + LLUI::addPopup(this); + setUseBoundingRect(TRUE); +// updateBoundingRect(); } void LLComboBox::hideList() @@ -644,10 +648,8 @@ void LLComboBox::hideList() mList->mouseOverHighlightNthItem(-1); setUseBoundingRect(FALSE); - if( gFocusMgr.getTopCtrl() == this ) - { - gFocusMgr.setTopCtrl(NULL); - } + LLUI::removePopup(this); +// updateBoundingRect(); } } @@ -703,13 +705,10 @@ void LLComboBox::onListMouseUp() void LLComboBox::onItemSelected(const LLSD& data) { - const std::string name = mList->getSelectedItemLabel(); - - S32 cur_id = getCurrentIndex(); - mLastSelectedIndex = cur_id; - if (cur_id != -1) + mLastSelectedIndex = getCurrentIndex(); + if (mLastSelectedIndex != -1) { - setLabel(name); + setLabel(getSelectedItemLabel()); if (mAllowTextEntry) { @@ -717,7 +716,6 @@ void LLComboBox::onItemSelected(const LLSD& data) mTextEntry->selectAll(); } } - // hiding the list reasserts the old value stored in the text editor/dropdown button hideList(); @@ -912,7 +910,7 @@ void LLComboBox::updateSelection() } else if (mList->selectItemByPrefix(left_wstring, FALSE)) { - LLWString selected_item = utf8str_to_wstring(mList->getSelectedItemLabel()); + LLWString selected_item = utf8str_to_wstring(getSelectedItemLabel()); LLWString wtext = left_wstring + selected_item.substr(left_wstring.size(), selected_item.size()); mTextEntry->setText(wstring_to_utf8str(wtext)); mTextEntry->setSelection(left_wstring.size(), mTextEntry->getWText().size()); @@ -1014,7 +1012,7 @@ BOOL LLComboBox::setCurrentByID(const LLUUID& id) if (found) { - setLabel(mList->getSelectedItemLabel()); + setLabel(getSelectedItemLabel()); mLastSelectedIndex = mList->getFirstSelectedIndex(); } @@ -1030,7 +1028,7 @@ BOOL LLComboBox::setSelectedByValue(const LLSD& value, BOOL selected) BOOL found = mList->setSelectedByValue(value, selected); if (found) { - setLabel(mList->getSelectedItemLabel()); + setLabel(getSelectedItemLabel()); } return found; } @@ -1069,3 +1067,24 @@ BOOL LLComboBox::selectItemRange( S32 first, S32 last ) { return mList->selectItemRange(first, last); } + + +static LLDefaultChildRegistry::Register<LLIconsComboBox> register_icons_combo_box("icons_combo_box"); + +LLIconsComboBox::Params::Params() +: icon_column("icon_column", ICON_COLUMN), + label_column("label_column", LABEL_COLUMN) +{} + +LLIconsComboBox::LLIconsComboBox(const LLIconsComboBox::Params& p) +: LLComboBox(p), + mIconColumnIndex(p.icon_column), + mLabelColumnIndex(p.label_column) +{} + +const std::string LLIconsComboBox::getSelectedItemLabel(S32 column) const +{ + mButton->setImageOverlay(LLComboBox::getSelectedItemLabel(mIconColumnIndex), mButton->getImageOverlayHAlign()); + + return LLComboBox::getSelectedItemLabel(mLabelColumnIndex); +} diff --git a/indra/llui/llcombobox.h b/indra/llui/llcombobox.h index 4f27588467..f0bd432f3a 100644 --- a/indra/llui/llcombobox.h +++ b/indra/llui/llcombobox.h @@ -150,7 +150,7 @@ public: // Get name of current item. Returns an empty string if not found. const std::string getSimple() const; // Get contents of column x of selected row - const std::string getSelectedItemLabel(S32 column = 0) const; + virtual const std::string getSelectedItemLabel(S32 column = 0) const; // Sets the label, which doesn't have to exist in the label. // This is probably a UI abuse. @@ -230,6 +230,38 @@ private: commit_callback_t mPrearrangeCallback; commit_callback_t mTextEntryCallback; commit_callback_t mSelectionCallback; - S32 mLastSelectedIndex; + boost::signals2::connection mTopLostSignalConnection; + S32 mLastSelectedIndex; }; + +// A combo box with icons for the list of items. +class LLIconsComboBox +: public LLComboBox +{ +public: + struct Params + : public LLInitParam::Block<Params, LLComboBox::Params> + { + Optional<S32> icon_column, + label_column; + Params(); + }; + + /*virtual*/ const std::string getSelectedItemLabel(S32 column = 0) const; + +private: + enum EColumnIndex + { + ICON_COLUMN = 0, + LABEL_COLUMN + }; + + friend class LLUICtrlFactory; + LLIconsComboBox(const Params&); + virtual ~LLIconsComboBox() {}; + + S32 mIconColumnIndex; + S32 mLabelColumnIndex; +}; + #endif diff --git a/indra/llui/llconsole.cpp b/indra/llui/llconsole.cpp index 0237c80efa..badbddc3cc 100644 --- a/indra/llui/llconsole.cpp +++ b/indra/llui/llconsole.cpp @@ -244,23 +244,6 @@ void LLConsole::draw() } } -void LLConsole::addLine(const std::string& utf8line) -{ - LLWString wline = utf8str_to_wstring(utf8line); - addLine(wline, 0.f, LLColor4(1.f, 1.f, 1.f, 1.f)); -} - -void LLConsole::addLine(const LLWString& wline) -{ - addLine(wline, 0.f, LLColor4(1.f, 1.f, 1.f, 1.f)); -} - -void LLConsole::addLine(const std::string& utf8line, F32 size, const LLColor4 &color) -{ - LLWString wline = utf8str_to_wstring(utf8line); - addLine(wline, size, color); -} - //Generate highlight color segments for this paragraph. Pass in default color of paragraph. void LLConsole::Paragraph::makeParagraphColorSegments (const LLColor4 &color) { @@ -317,7 +300,8 @@ void LLConsole::Paragraph::updateLines(F32 screen_width, const LLFontGL* font, b S32 paragraph_offset = 0; //Offset into the paragraph text. // Wrap lines that are longer than the view is wide. - while( paragraph_offset < (S32)mParagraphText.length() ) + while( paragraph_offset < (S32)mParagraphText.length() && + mParagraphText[paragraph_offset] != 0) { S32 skip_chars; // skip '\n' // Figure out if a word-wrapped line fits here. @@ -383,21 +367,45 @@ void LLConsole::Paragraph::updateLines(F32 screen_width, const LLFontGL* font, b //Pass in the string and the default color for this block of text. LLConsole::Paragraph::Paragraph (LLWString str, const LLColor4 &color, F32 add_time, const LLFontGL* font, F32 screen_width) - : mParagraphText(str), mAddTime(add_time), mMaxWidth(-1) +: mParagraphText(str), mAddTime(add_time), mMaxWidth(-1) { makeParagraphColorSegments(color); updateLines( screen_width, font ); } -void LLConsole::addLine(const LLWString& wline, F32 size, const LLColor4 &color) +// called once per frame regardless of console visibility +// static +void LLConsole::updateClass() { - Paragraph paragraph(wline, color, mTimer.getElapsedTimeF32(), mFont, (F32)getRect().getWidth() ); - - mParagraphs.push_back ( paragraph ); + LLInstanceTrackerScopedGuard guard; + + for (instance_iter it = guard.beginInstances(); it != guard.endInstances(); ++it) + { + it->update(); + } +} + +void LLConsole::update() +{ + { + LLMutexLock lock(&mMutex); + + while (!mLines.empty()) + { + mParagraphs.push_back( + Paragraph( mLines.front(), + LLColor4::white, + mTimer.getElapsedTimeF32(), + mFont, + (F32)getRect().getWidth())); + mLines.pop_front(); + } + } // remove old paragraphs which can't possibly be visible any more. ::draw() will do something similar but more conservative - we do this here because ::draw() isn't guaranteed to ever be called! (i.e. the console isn't visible) - while ((S32)mParagraphs.size() > llmax((S32)0, (S32)(mMaxLines))) - { - mParagraphs.pop_front(); - } + while ((S32)mParagraphs.size() > llmax((S32)0, (S32)(mMaxLines))) + { + mParagraphs.pop_front(); + } } + diff --git a/indra/llui/llconsole.h b/indra/llui/llconsole.h index 4719950f28..f38e2bc9c2 100644 --- a/indra/llui/llconsole.h +++ b/indra/llui/llconsole.h @@ -40,7 +40,7 @@ class LLSD; -class LLConsole : public LLFixedBuffer, public LLUICtrl +class LLConsole : public LLFixedBuffer, public LLUICtrl, public LLInstanceTracker<LLConsole> { public: typedef enum e_font_size @@ -68,6 +68,9 @@ protected: friend class LLUICtrlFactory; public: + // call once per frame to pull data out of LLFixedBuffer + static void updateClass(); + //A paragraph color segment defines the color of text in a line //of text that was received for console display. It has no //notion of line wraps, screen position, or the text it contains. @@ -139,14 +142,12 @@ public: // -1 = monospace, 0 means small, font size = 1 means big void setFontSize(S32 size_index); - void addLine(const std::string& utf8line, F32 size, const LLColor4 &color); - void addLine(const LLWString& wline, F32 size, const LLColor4 &color); // Overrides /*virtual*/ void draw(); - /*virtual*/ void addLine(const std::string& utf8line); - /*virtual*/ void addLine(const LLWString& line); private: + void update(); + F32 mLinePersistTime; // Age at which to stop drawing. F32 mFadeTime; // Age at which to start fading const LLFontGL* mFont; diff --git a/indra/llui/lldockablefloater.cpp b/indra/llui/lldockablefloater.cpp index 57baf28dab..3d8670fef2 100644 --- a/indra/llui/lldockablefloater.cpp +++ b/indra/llui/lldockablefloater.cpp @@ -95,7 +95,7 @@ void LLDockableFloater::toggleInstance(const LLSD& sdname) LLDockableFloater* instance = dynamic_cast<LLDockableFloater*> (LLFloaterReg::findInstance(name)); // if floater closed or docked - if (instance == NULL || instance != NULL && instance->isDocked()) + if (instance == NULL || (instance && instance->isDocked())) { LLFloaterReg::toggleInstance(name, key); // restore button toggle state @@ -202,10 +202,6 @@ void LLDockableFloater::setDocked(bool docked, bool pop_on_undock) translate(0, UNDOCK_LEAP_HEIGHT); } } - else - { - docked = false; - } LLFloater::setDocked(docked, pop_on_undock); } @@ -226,7 +222,7 @@ void LLDockableFloater::draw() void LLDockableFloater::setDockControl(LLDockControl* dockControl) { mDockControl.reset(dockControl); - setDocked(mDockControl.get() != NULL && mDockControl.get()->isDockVisible()); + setDocked(isDocked()); } const LLUIImagePtr& LLDockableFloater::getDockTongue() diff --git a/indra/llui/lldockcontrol.cpp b/indra/llui/lldockcontrol.cpp index d836a5f4cd..d738b10130 100644 --- a/indra/llui/lldockcontrol.cpp +++ b/indra/llui/lldockcontrol.cpp @@ -162,7 +162,9 @@ bool LLDockControl::isDockVisible() { case LEFT: // to keep compiler happy break; + case BOTTOM: case TOP: + { // check is dock inside parent rect LLRect dockParentRect = mDockWidget->getParent()->calcScreenRect(); @@ -173,6 +175,9 @@ bool LLDockControl::isDockVisible() } break; } + default: + break; + } } } @@ -255,6 +260,42 @@ void LLDockControl::moveDockable() mDockTongueY = dockRect.mTop; break; + case BOTTOM: + x = dockRect.getCenterX() - dockableRect.getWidth() / 2; + y = dockRect.mBottom; + // unique docking used with dock tongue, so add tongue height o the Y coordinate + if (use_tongue) + { + y -= mDockTongue->getHeight(); + } + + // check is dockable inside root view rect + if (x < rootRect.mLeft) + { + x = rootRect.mLeft; + } + if (x + dockableRect.getWidth() > rootRect.mRight) + { + x = rootRect.mRight - dockableRect.getWidth(); + } + + // calculate dock tongue position + dockParentRect = mDockWidget->getParent()->calcScreenRect(); + if (dockRect.getCenterX() < dockParentRect.mLeft) + { + mDockTongueX = dockParentRect.mLeft - mDockTongue->getWidth() / 2; + } + else if (dockRect.getCenterX() > dockParentRect.mRight) + { + mDockTongueX = dockParentRect.mRight - mDockTongue->getWidth() / 2;; + } + else + { + mDockTongueX = dockRect.getCenterX() - mDockTongue->getWidth() / 2; + } + mDockTongueY = dockRect.mBottom - mDockTongue->getHeight(); + + break; } // move dockable diff --git a/indra/llui/lldockcontrol.h b/indra/llui/lldockcontrol.h index 550955c4c5..a5caf68001 100644 --- a/indra/llui/lldockcontrol.h +++ b/indra/llui/lldockcontrol.h @@ -47,8 +47,9 @@ class LLDockControl public: enum DocAt { - TOP - ,LEFT + TOP, + LEFT, + BOTTOM }; public: diff --git a/indra/llui/lldraghandle.cpp b/indra/llui/lldraghandle.cpp index 832f148902..9f83fcca35 100644 --- a/indra/llui/lldraghandle.cpp +++ b/indra/llui/lldraghandle.cpp @@ -248,15 +248,14 @@ void LLDragHandleTop::reshapeTitleBox() return; } const LLFontGL* font = LLFontGL::getFontSansSerif(); - S32 title_width = font->getWidth( mTitleBox->getText() ) + TITLE_HPAD; - if (getMaxTitleWidth() > 0) - title_width = llmin(title_width, getMaxTitleWidth()); + S32 title_width = getRect().getWidth(); + title_width -= LEFT_PAD + 2 * BORDER_PAD + getButtonsRect().getWidth(); S32 title_height = llround(font->getLineHeight()); LLRect title_rect; title_rect.setLeftTopAndSize( LEFT_PAD, getRect().getHeight() - title_vpad, - getRect().getWidth() - LEFT_PAD - RIGHT_PAD, + title_width, title_height); // calls reshape on mTitleBox diff --git a/indra/llui/lldraghandle.h b/indra/llui/lldraghandle.h index dc5410787b..825bc9303e 100644 --- a/indra/llui/lldraghandle.h +++ b/indra/llui/lldraghandle.h @@ -71,6 +71,8 @@ public: BOOL getForeground() const { return mForeground; } void setMaxTitleWidth(S32 max_width) {mMaxTitleWidth = llmin(max_width, mMaxTitleWidth); } S32 getMaxTitleWidth() const { return mMaxTitleWidth; } + void setButtonsRect(const LLRect& rect){ mButtonsRect = rect; } + LLRect getButtonsRect() { return mButtonsRect; } void setTitleVisible(BOOL visible); virtual void setTitle( const std::string& title ) = 0; @@ -88,6 +90,7 @@ protected: LLTextBox* mTitleBox; private: + LLRect mButtonsRect; S32 mDragLastScreenX; S32 mDragLastScreenY; S32 mLastMouseScreenX; diff --git a/indra/llui/lleditmenuhandler.cpp b/indra/llui/lleditmenuhandler.cpp index 821afae8fd..245bce76f5 100644 --- a/indra/llui/lleditmenuhandler.cpp +++ b/indra/llui/lleditmenuhandler.cpp @@ -37,3 +37,10 @@ /* static */ LLEditMenuHandler* LLEditMenuHandler::gEditMenuHandler = NULL; +LLEditMenuHandler::~LLEditMenuHandler() +{ + if (gEditMenuHandler == this) + { + gEditMenuHandler = NULL; + } +} diff --git a/indra/llui/lleditmenuhandler.h b/indra/llui/lleditmenuhandler.h index 1de9c56afb..d72283cd99 100644 --- a/indra/llui/lleditmenuhandler.h +++ b/indra/llui/lleditmenuhandler.h @@ -38,7 +38,7 @@ class LLEditMenuHandler { public: // this is needed even though this is just an interface class. - virtual ~LLEditMenuHandler() {}; + virtual ~LLEditMenuHandler(); virtual void undo() {}; virtual BOOL canUndo() const { return FALSE; } diff --git a/indra/llui/llfiltereditor.cpp b/indra/llui/llfiltereditor.cpp index 390504234d..6c80275713 100644 --- a/indra/llui/llfiltereditor.cpp +++ b/indra/llui/llfiltereditor.cpp @@ -39,6 +39,7 @@ LLFilterEditor::LLFilterEditor(const LLFilterEditor::Params& p) : LLSearchEditor(p) { + setCommitOnFocusLost(FALSE); // we'll commit on every keystroke, don't re-commit when we take focus away (i.e. we go to interact with the actual results!) } diff --git a/indra/llui/llflatlistview.cpp b/indra/llui/llflatlistview.cpp index 2481249f91..2433c14315 100644 --- a/indra/llui/llflatlistview.cpp +++ b/indra/llui/llflatlistview.cpp @@ -1,10 +1,10 @@ /** * @file llflatlistview.cpp - * @brief LLFlatListView base class + * @brief LLFlatListView base class and extension to support messages for several cases of an empty list. * * $LicenseInfo:firstyear=2009&license=viewergpl$ * - * Copyright (c) 2009, Linden Research, Inc. + * Copyright (c) 2009-2010, Linden Research, Inc. * * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab @@ -243,7 +243,7 @@ LLUUID LLFlatListView::getSelectedUUID() const } } -void LLFlatListView::getSelectedUUIDs(std::vector<LLUUID>& selected_uuids) const +void LLFlatListView::getSelectedUUIDs(uuid_vec_t& selected_uuids) const { if (mSelectedItemPairs.empty()) return; @@ -297,6 +297,27 @@ void LLFlatListView::setNoItemsCommentText(const std::string& comment_text) mNoItemsCommentTextbox->setValue(comment_text); } +U32 LLFlatListView::size(const bool only_visible_items) const +{ + if (only_visible_items) + { + U32 size = 0; + for (pairs_const_iterator_t + iter = mItemPairs.begin(), + iter_end = mItemPairs.end(); + iter != iter_end; ++iter) + { + if ((*iter)->first->getVisible()) + ++size; + } + return size; + } + else + { + return mItemPairs.size(); + } +} + void LLFlatListView::clear() { // do not use LLView::deleteAllChildren to avoid removing nonvisible items. drag-n-drop for ex. @@ -358,6 +379,7 @@ LLFlatListView::LLFlatListView(const LLFlatListView::Params& p) , mCommitOnSelectionChange(false) , mPrevNotifyParentRect(LLRect()) , mNoItemsCommentTextbox(NULL) + , mIsConsecutiveSelection(false) { mBorderThickness = getBorderWidth(); @@ -426,7 +448,7 @@ void LLFlatListView::rearrangeItems() { static LLUICachedControl<S32> scrollbar_size ("UIScrollbarSize", 0); - setNoItemsCommentVisible(mItemPairs.empty()); + setNoItemsCommentVisible(0==size()); if (mItemPairs.empty()) return; @@ -492,13 +514,92 @@ void LLFlatListView::onItemMouseClick(item_pair_t* item_pair, MASK mask) { if (!item_pair) return; + if (!item_pair->first) + { + llwarning("Attempt to selet an item pair containing null panel item", 0); + return; + } + setFocus(TRUE); bool select_item = !isSelected(item_pair); //*TODO find a better place for that enforcing stuff if (mKeepOneItemSelected && numSelected() == 1 && !select_item) return; - + + if ( (mask & MASK_SHIFT) && !(mask & MASK_CONTROL) + && mMultipleSelection && !mSelectedItemPairs.empty() ) + { + item_pair_t* last_selected_pair = mSelectedItemPairs.back(); + + // If item_pair is already selected - do nothing + if (last_selected_pair == item_pair) + return; + + bool grab_items = false; + bool reverse = false; + pairs_list_t pairs_to_select; + + // Pick out items from list between last selected and current clicked item_pair. + for (pairs_iterator_t + iter = mItemPairs.begin(), + iter_end = mItemPairs.end(); + iter != iter_end; ++iter) + { + item_pair_t* cur = *iter; + if (cur == last_selected_pair || cur == item_pair) + { + // We've got reverse selection if last grabed item isn't a new selection. + reverse = grab_items && (cur != item_pair); + grab_items = !grab_items; + // Skip last selected and current clicked item pairs. + continue; + } + if (!cur->first->getVisible()) + { + // Skip invisible item pairs. + continue; + } + if (grab_items) + { + pairs_to_select.push_back(cur); + } + } + + if (reverse) + { + pairs_to_select.reverse(); + } + + pairs_to_select.push_back(item_pair); + + for (pairs_iterator_t + iter = pairs_to_select.begin(), + iter_end = pairs_to_select.end(); + iter != iter_end; ++iter) + { + item_pair_t* pair_to_select = *iter; + if (isSelected(pair_to_select)) + { + // Item was already selected but there is a need to keep order from last selected pair to new selection. + // Do it here to prevent extra mCommitOnSelectionChange in selectItemPair(). + mSelectedItemPairs.remove(pair_to_select); + mSelectedItemPairs.push_back(pair_to_select); + } + else + { + selectItemPair(pair_to_select, true); + } + } + + if (!select_item) + { + // Update last selected item border. + mSelectedItemsBorder->setRect(getLastSelectedItemRect().stretch(-1)); + } + return; + } + if (!(mask & MASK_CONTROL) || !mMultipleSelection) resetSelection(); selectItemPair(item_pair, select_item); } @@ -552,15 +653,6 @@ BOOL LLFlatListView::handleKeyHere(KEY key, MASK mask) } break; } - case 'A': - { - if(MASK_CONTROL & mask) - { - selectAll(); - handled = TRUE; - } - break; - } default: break; } @@ -670,6 +762,8 @@ bool LLFlatListView::selectItemPair(item_pair_t* item_pair, bool select) // Stretch selected item rect to ensure it won't be clipped mSelectedItemsBorder->setRect(getLastSelectedItemRect().stretch(-1)); + // By default mark it as not consecutive selection + mIsConsecutiveSelection = false; return true; } @@ -686,14 +780,44 @@ LLRect LLFlatListView::getLastSelectedItemRect() void LLFlatListView::selectFirstItem () { - selectItemPair(mItemPairs.front(), true); - ensureSelectedVisible(); + // No items - no actions! + if (0 == size()) return; + + // Select first visible item + for (pairs_iterator_t + iter = mItemPairs.begin(), + iter_end = mItemPairs.end(); + iter != iter_end; ++iter) + { + // skip invisible items + if ( (*iter)->first->getVisible() ) + { + selectItemPair(*iter, true); + ensureSelectedVisible(); + break; + } + } } void LLFlatListView::selectLastItem () { - selectItemPair(mItemPairs.back(), true); - ensureSelectedVisible(); + // No items - no actions! + if (0 == size()) return; + + // Select last visible item + for (pairs_list_t::reverse_iterator + r_iter = mItemPairs.rbegin(), + r_iter_end = mItemPairs.rend(); + r_iter != r_iter_end; ++r_iter) + { + // skip invisible items + if ( (*r_iter)->first->getVisible() ) + { + selectItemPair(*r_iter, true); + ensureSelectedVisible(); + break; + } + } } void LLFlatListView::ensureSelectedVisible() @@ -711,14 +835,25 @@ void LLFlatListView::ensureSelectedVisible() bool LLFlatListView::selectNextItemPair(bool is_up_direction, bool reset_selection) { // No items - no actions! - if ( !mItemPairs.size() ) + if ( 0 == size() ) return false; - - item_pair_t* to_sel_pair = NULL; - item_pair_t* cur_sel_pair = NULL; + if (!mIsConsecutiveSelection) + { + // Leave only one item selected if list has not consecutive selection + if (mSelectedItemPairs.size() && !reset_selection) + { + item_pair_t* cur_sel_pair = mSelectedItemPairs.back(); + resetSelection(); + selectItemPair (cur_sel_pair, true); + } + } + if ( mSelectedItemPairs.size() ) { + item_pair_t* to_sel_pair = NULL; + item_pair_t* cur_sel_pair = NULL; + // Take the last selected pair cur_sel_pair = mSelectedItemPairs.back(); // Bases on given direction choose next item to select @@ -752,43 +887,52 @@ bool LLFlatListView::selectNextItemPair(bool is_up_direction, bool reset_selecti } } } + + if ( to_sel_pair ) + { + bool select = true; + if ( reset_selection ) + { + // Reset current selection if we were asked about it + resetSelection(); + } + else + { + // If item already selected and no reset request than we should deselect last selected item. + select = (mSelectedItemPairs.end() == std::find(mSelectedItemPairs.begin(), mSelectedItemPairs.end(), to_sel_pair)); + } + // Select/Deselect next item + selectItemPair(select ? to_sel_pair : cur_sel_pair, select); + // Mark it as consecutive selection + mIsConsecutiveSelection = true; + return true; + } } else { // If there weren't selected items then choose the first one bases on given direction - cur_sel_pair = (is_up_direction) ? mItemPairs.back() : mItemPairs.front(); // Force selection to first item - to_sel_pair = cur_sel_pair; - } - - - if ( to_sel_pair ) - { - bool select = true; - - if ( reset_selection ) - { - // Reset current selection if we were asked about it - resetSelection(); - } + if (is_up_direction) + selectLastItem(); else - { - // If item already selected and no reset request than we should deselect last selected item. - select = (mSelectedItemPairs.end() == std::find(mSelectedItemPairs.begin(), mSelectedItemPairs.end(), to_sel_pair)); - } - - // Select/Deselect next item - selectItemPair(select ? to_sel_pair : cur_sel_pair, select); - + selectFirstItem(); + // Mark it as consecutive selection + mIsConsecutiveSelection = true; return true; } + return false; } -bool LLFlatListView::selectAll() +BOOL LLFlatListView::canSelectAll() const { - if (!mAllowSelection) - return false; + return 0 != size() && mAllowSelection && mMultipleSelection; +} + +void LLFlatListView::selectAll() +{ + if (!mAllowSelection || !mMultipleSelection) + return; mSelectedItemPairs.clear(); @@ -808,8 +952,6 @@ bool LLFlatListView::selectAll() // Stretch selected item rect to ensure it won't be clipped mSelectedItemsBorder->setRect(getLastSelectedItemRect().stretch(-1)); - - return true; } bool LLFlatListView::isSelected(item_pair_t* item_pair) const @@ -947,11 +1089,17 @@ void LLFlatListView::getValues(std::vector<LLSD>& values) const void LLFlatListView::onFocusReceived() { mSelectedItemsBorder->setVisible(TRUE); + gEditMenuHandler = this; } // virtual void LLFlatListView::onFocusLost() { mSelectedItemsBorder->setVisible(FALSE); + // Route menu back to the default + if( gEditMenuHandler == this ) + { + gEditMenuHandler = NULL; + } } //virtual @@ -1055,4 +1203,90 @@ void LLFlatListView::detachItems(std::vector<LLPanel*>& detached_items) } } + +/************************************************************************/ +/* LLFlatListViewEx implementation */ +/************************************************************************/ +LLFlatListViewEx::Params::Params() +: no_items_msg("no_items_msg") +, no_filtered_items_msg("no_filtered_items_msg") +{ + +} + +LLFlatListViewEx::LLFlatListViewEx(const Params& p) +: LLFlatListView(p) +, mNoFilteredItemsMsg(p.no_filtered_items_msg) +, mNoItemsMsg(p.no_items_msg) +{ + +} + +void LLFlatListViewEx::updateNoItemsMessage(const std::string& filter_string) +{ + bool items_filtered = !filter_string.empty(); + if (items_filtered) + { + // items were filtered + LLStringUtil::format_map_t args; + args["[SEARCH_TERM]"] = LLURI::escape(filter_string); + std::string text = mNoFilteredItemsMsg; + LLStringUtil::format(text, args); + setNoItemsCommentText(text); + } + else + { + // list does not contain any items at all + setNoItemsCommentText(mNoItemsMsg); + } + +} + +void LLFlatListViewEx::setFilterSubString(const std::string& filter_str) +{ + if (0 != LLStringUtil::compareInsensitive(filter_str, mFilterSubString)) + { + mFilterSubString = filter_str; + updateNoItemsMessage(mFilterSubString); + filterItems(); + } +} + +void LLFlatListViewEx::filterItems() +{ + typedef std::vector <LLPanel*> item_panel_list_t; + + std::string cur_filter = mFilterSubString; + LLStringUtil::toUpper(cur_filter); + + LLSD action; + action.with("match_filter", cur_filter); + + item_panel_list_t items; + getItems(items); + + for (item_panel_list_t::iterator + iter = items.begin(), + iter_end = items.end(); + iter != iter_end; ++iter) + { + LLPanel* pItem = (*iter); + // 0 signifies that filter is matched, + // i.e. we don't hide items that don't support 'match_filter' action, separators etc. + if (0 == pItem->notify(action)) + { + pItem->setVisible(true); + } + else + { + // TODO: implement (re)storing of current selection. + selectItem(pItem, false); + pItem->setVisible(false); + } + } + + sort(); + notifyParentItemsRectChanged(); +} + //EOF diff --git a/indra/llui/llflatlistview.h b/indra/llui/llflatlistview.h index 92cb40332e..f4e0426f15 100644 --- a/indra/llui/llflatlistview.h +++ b/indra/llui/llflatlistview.h @@ -1,10 +1,10 @@ /** * @file llflatlistview.h - * @brief LLFlatListView base class + * @brief LLFlatListView base class and extension to support messages for several cases of an empty list. * * $LicenseInfo:firstyear=2009&license=viewergpl$ * - * Copyright (c) 2009, Linden Research, Inc. + * Copyright (c) 2009-2010, Linden Research, Inc. * * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab @@ -58,7 +58,7 @@ * - Order of returned selected items are not guaranteed * - The control assumes that all items being added are unique. */ -class LLFlatListView : public LLScrollContainer +class LLFlatListView : public LLScrollContainer, public LLEditMenuHandler { public: @@ -114,8 +114,6 @@ public: Params(); }; - virtual ~LLFlatListView() { clear(); }; - /** * Connects callback to signal called when Return key is pressed. */ @@ -224,7 +222,7 @@ public: * Get LLUUIDs associated with selected items * @param selected_uuids An std::vector being populated with LLUUIDs associated with selected items */ - virtual void getSelectedUUIDs(std::vector<LLUUID>& selected_uuids) const; + virtual void getSelectedUUIDs(uuid_vec_t& selected_uuids) const; /** Get the top selected item */ virtual LLPanel* getSelectedItem() const; @@ -266,9 +264,8 @@ public: /** Get number of selected items in the list */ U32 numSelected() const {return mSelectedItemPairs.size(); } - /** Get number of items in the list */ - U32 size() const { return mItemPairs.size(); } - + /** Get number of (visible) items in the list */ + U32 size(const bool only_visible_items = true) const; /** Removes all items from the list */ virtual void clear(); @@ -344,7 +341,8 @@ protected: virtual bool selectNextItemPair(bool is_up_direction, bool reset_selection); - virtual bool selectAll(); + virtual BOOL canSelectAll() const; + virtual void selectAll(); virtual bool isSelected(item_pair_t* item_pair) const; @@ -379,11 +377,14 @@ private: void setNoItemsCommentVisible(bool visible) const; -private: +protected: /** Comparator to use when sorting the list. */ const ItemComparator* mItemComparator; + +private: + LLPanel* mItemsPanel; S32 mItemsNoScrollWidth; @@ -409,6 +410,8 @@ private: bool mKeepOneItemSelected; + bool mIsConsecutiveSelection; + /** All pairs of the list */ pairs_list_t mItemPairs; @@ -428,4 +431,66 @@ private: commit_signal_t mOnReturnSignal; }; +/** + * Extends LLFlatListView functionality to show different messages when there are no items in the + * list depend on whether they are filtered or not. + * + * Class provides one message per case of empty list. + * It also provides protected updateNoItemsMessage() method to be called each time when derived list + * is changed to update base mNoItemsCommentTextbox value. + * + * It is implemented to avoid duplication of this functionality in concrete implementations of the + * lists. It is intended to be used as a base class for lists which should support two different + * messages for empty state. Can be improved to support more than two messages via state-to-message map. + */ +class LLFlatListViewEx : public LLFlatListView +{ +public: + struct Params : public LLInitParam::Block<Params, LLFlatListView::Params> + { + /** + * Contains a message for empty list when it does not contain any items at all. + */ + Optional<std::string> no_items_msg; + + /** + * Contains a message for empty list when its items are removed by filtering. + */ + Optional<std::string> no_filtered_items_msg; + Params(); + }; + + // *WORKAROUND: two methods to overload appropriate Params due to localization issue: + // no_items_msg & no_filtered_items_msg attributes are not defined as translatable in VLT. See EXT-5931 + void setNoItemsMsg(const std::string& msg) { mNoItemsMsg = msg; } + void setNoFilteredItemsMsg(const std::string& msg) { mNoFilteredItemsMsg = msg; } + + /** + * Sets up new filter string and filters the list. + */ + void setFilterSubString(const std::string& filter_str); + + /** + * Filters the list, rearranges and notifies parent about shape changes. + * Derived classes may want to overload rearrangeItems() to exclude repeated separators after filtration. + */ + void filterItems(); + +protected: + LLFlatListViewEx(const Params& p); + + /** + * Applies a message for empty list depend on passed argument. + * + * @param filter_string - if is not empty, message for filtered items will be set, otherwise for + * completely empty list. Value of filter string will be passed as search_term in SLURL. + */ + void updateNoItemsMessage(const std::string& filter_string); + +private: + std::string mNoFilteredItemsMsg; + std::string mNoItemsMsg; + std::string mFilterSubString; +}; + #endif diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp index a55915af35..9a56372e68 100644 --- a/indra/llui/llfloater.cpp +++ b/indra/llui/llfloater.cpp @@ -169,6 +169,7 @@ LLFloater::Params::Params() save_rect("save_rect", false), save_visibility("save_visibility", false), can_dock("can_dock", false), + open_centered("open_centered", false), header_height("header_height", 0), legacy_header_height("legacy_header_height", 0), close_image("close_image"), @@ -329,6 +330,7 @@ void LLFloater::addDragHandle() addChild(mDragHandle); } layoutDragHandle(); + applyTitle(); } void LLFloater::layoutDragHandle() @@ -345,9 +347,8 @@ void LLFloater::layoutDragHandle() { rect = getLocalRect(); } - mDragHandle->setRect(rect); - updateButtons(); - applyTitle(); + mDragHandle->setShape(rect); + updateTitleButtons(); } void LLFloater::addResizeCtrls() @@ -527,10 +528,7 @@ void LLFloater::setVisible( BOOL visible ) if( !visible ) { - if( gFocusMgr.childIsTopCtrl( this ) ) - { - gFocusMgr.setTopCtrl(NULL); - } + LLUI::removePopup(this); if( gFocusMgr.childHasMouseCapture( this ) ) { @@ -566,6 +564,7 @@ void LLFloater::handleVisibilityChange ( BOOL new_visibility ) void LLFloater::openFloater(const LLSD& key) { + llinfos << "Opening floater " << getName() << llendl; mKey = key; // in case we need to open ourselves again if (getSoundFlags() != SILENT @@ -606,6 +605,7 @@ void LLFloater::openFloater(const LLSD& key) void LLFloater::closeFloater(bool app_quitting) { + llinfos << "Closing floater " << getName() << llendl; if (app_quitting) { LLFloater::sQuitting = true; @@ -704,10 +704,7 @@ void LLFloater::reshape(S32 width, S32 height, BOOL called_from_parent) void LLFloater::releaseFocus() { - if( gFocusMgr.childIsTopCtrl( this ) ) - { - gFocusMgr.setTopCtrl(NULL); - } + LLUI::removePopup(this); setFocus(FALSE); @@ -767,6 +764,13 @@ void LLFloater::applySavedVariables() void LLFloater::applyRectControl() { + // first, center on screen if requested + if (mOpenCentered) + { + center(); + } + + // override center if we have saved rect control if (mRectControl.size() > 1) { const LLRect& rect = LLUI::sSettingGroups["floater"]->getRect(mRectControl); @@ -806,6 +810,11 @@ void LLFloater::applyTitle() { mDragHandle->setTitle ( mTitle ); } + + if (getHost()) + { + getHost()->updateFloaterTitle(this); + } } std::string LLFloater::getCurrentTitle() const @@ -1067,11 +1076,10 @@ void LLFloater::setMinimized(BOOL minimize) // Reshape *after* setting mMinimized reshape( mExpandedRect.getWidth(), mExpandedRect.getHeight(), TRUE ); } - - applyTitle (); make_ui_sound("UISndWindowClose"); - updateButtons(); + updateTitleButtons(); + applyTitle (); } void LLFloater::setFocus( BOOL b ) @@ -1127,6 +1135,7 @@ void LLFloater::setIsChrome(BOOL is_chrome) setFocus(FALSE); // can't Ctrl-Tab to "chrome" floaters setFocusRoot(FALSE); + mButtons[BUTTON_CLOSE]->setToolTip(LLStringExplicit(getButtonTooltip(Params(), BUTTON_CLOSE, is_chrome))); } // no titles displayed on "chrome" floaters @@ -1196,7 +1205,7 @@ void LLFloater::setHost(LLMultiFloater* host) mButtonScale = 1.f; //mButtonsEnabled[BUTTON_TEAR_OFF] = FALSE; } - updateButtons(); + updateTitleButtons(); if (host) { mHostHandle = host->getHandle(); @@ -1360,7 +1369,6 @@ void LLFloater::bringToFront( S32 x, S32 y ) // virtual void LLFloater::setVisibleAndFrontmost(BOOL take_focus) { - gFocusMgr.setTopCtrl(NULL); setVisible(TRUE); setFrontmost(take_focus); } @@ -1396,7 +1404,7 @@ void LLFloater::setCanDock(bool b) mButtonsEnabled[BUTTON_DOCK] = FALSE; } } - updateButtons(); + updateTitleButtons(); } void LLFloater::setDocked(bool docked, bool pop_on_undock) @@ -1405,7 +1413,7 @@ void LLFloater::setDocked(bool docked, bool pop_on_undock) { mDocked = docked; mButtonsEnabled[BUTTON_DOCK] = !mDocked; - updateButtons(); + updateTitleButtons(); storeDockStateControl(); } @@ -1458,7 +1466,7 @@ void LLFloater::onClickTearOff(LLFloater* self) } self->setTornOff(false); } - self->updateButtons(); + self->updateTitleButtons(); } // static @@ -1554,7 +1562,12 @@ void LLFloater::onClickClose( LLFloater* self ) { if (!self) return; - self->closeFloater(false); + self->onClickCloseBtn(); +} + +void LLFloater::onClickCloseBtn() +{ + closeFloater(false); } @@ -1565,43 +1578,34 @@ void LLFloater::draw() // draw background if( isBackgroundVisible() ) { + drawShadow(this); + S32 left = LLPANEL_BORDER_WIDTH; S32 top = getRect().getHeight() - LLPANEL_BORDER_WIDTH; S32 right = getRect().getWidth() - LLPANEL_BORDER_WIDTH; S32 bottom = LLPANEL_BORDER_WIDTH; - static LLUICachedControl<S32> shadow_offset_S32 ("DropShadowFloater", 0); - static LLUIColor shadow_color_cached = LLUIColorTable::instance().getColor("ColorDropShadow"); - LLColor4 shadow_color = shadow_color_cached; - F32 shadow_offset = (F32)shadow_offset_S32; - - if (!isBackgroundOpaque()) - { - shadow_offset *= 0.2f; - shadow_color.mV[VALPHA] *= 0.5f; - } - gl_drop_shadow(left, top, right, bottom, - shadow_color % alpha, - llround(shadow_offset)); - LLUIImage* image = NULL; LLColor4 color; + LLColor4 overlay_color; if (isBackgroundOpaque()) { // NOTE: image may not be set image = getBackgroundImage(); color = getBackgroundColor(); + overlay_color = getBackgroundImageOverlay(); } else { image = getTransparentImage(); color = getTransparentColor(); + overlay_color = getTransparentImageOverlay(); } if (image) { // We're using images for this floater's backgrounds - image->draw(getLocalRect(), UI_VERTEX_COLOR % alpha); + image->draw(getLocalRect(), overlay_color % alpha); } else { @@ -1666,6 +1670,29 @@ void LLFloater::draw() } } +void LLFloater::drawShadow(LLPanel* panel) +{ + F32 alpha = panel->getDrawContext().mAlpha; + S32 left = LLPANEL_BORDER_WIDTH; + S32 top = panel->getRect().getHeight() - LLPANEL_BORDER_WIDTH; + S32 right = panel->getRect().getWidth() - LLPANEL_BORDER_WIDTH; + S32 bottom = LLPANEL_BORDER_WIDTH; + + static LLUICachedControl<S32> shadow_offset_S32 ("DropShadowFloater", 0); + static LLUIColor shadow_color_cached = LLUIColorTable::instance().getColor("ColorDropShadow"); + LLColor4 shadow_color = shadow_color_cached; + F32 shadow_offset = (F32)shadow_offset_S32; + + if (!panel->isBackgroundOpaque()) + { + shadow_offset *= 0.2f; + shadow_color.mV[VALPHA] *= 0.5f; + } + gl_drop_shadow(left, top, right, bottom, + shadow_color % alpha, + llround(shadow_offset)); +} + void LLFloater::setCanMinimize(BOOL can_minimize) { // if removing minimize/restore button programmatically, @@ -1679,7 +1706,7 @@ void LLFloater::setCanMinimize(BOOL can_minimize) mButtonsEnabled[BUTTON_MINIMIZE] = can_minimize && !isMinimized(); mButtonsEnabled[BUTTON_RESTORE] = can_minimize && isMinimized(); - updateButtons(); + updateTitleButtons(); } void LLFloater::setCanClose(BOOL can_close) @@ -1687,7 +1714,7 @@ void LLFloater::setCanClose(BOOL can_close) mCanClose = can_close; mButtonsEnabled[BUTTON_CLOSE] = can_close; - updateButtons(); + updateTitleButtons(); } void LLFloater::setCanTearOff(BOOL can_tear_off) @@ -1695,7 +1722,7 @@ void LLFloater::setCanTearOff(BOOL can_tear_off) mCanTearOff = can_tear_off; mButtonsEnabled[BUTTON_TEAR_OFF] = mCanTearOff && !mHostHandle.isDead(); - updateButtons(); + updateTitleButtons(); } @@ -1719,10 +1746,11 @@ void LLFloater::setCanDrag(BOOL can_drag) } } -void LLFloater::updateButtons() +void LLFloater::updateTitleButtons() { static LLUICachedControl<S32> floater_close_box_size ("UIFloaterCloseBoxSize", 0); static LLUICachedControl<S32> close_box_from_top ("UICloseBoxFromTop", 0); + LLRect buttons_rect; S32 button_count = 0; for (S32 i = 0; i < BUTTON_COUNT; i++) { @@ -1773,6 +1801,18 @@ void LLFloater::updateButtons() llround((F32)floater_close_box_size * mButtonScale)); } + // first time here, init 'buttons_rect' + if(1 == button_count) + { + buttons_rect = btn_rect; + } + else + { + // if mDragOnLeft=true then buttons are on top-left side vertically aligned + // title is not displayed in this case, calculating 'buttons_rect' for future use + mDragOnLeft ? buttons_rect.mBottom -= btn_rect.mBottom : + buttons_rect.mLeft = btn_rect.mLeft; + } mButtons[i]->setRect(btn_rect); mButtons[i]->setVisible(TRUE); // the restore button should have a tab stop so that it takes action when you Ctrl-Tab to a minimized floater @@ -1784,7 +1824,10 @@ void LLFloater::updateButtons() } } if (mDragHandle) - mDragHandle->setMaxTitleWidth(getRect().getWidth() - (button_count * (floater_close_box_size + 1))); + { + localRectToOtherView(buttons_rect, &buttons_rect, mDragHandle); + mDragHandle->setButtonsRect(buttons_rect); + } } void LLFloater::buildButtons(const Params& floater_params) @@ -1832,7 +1875,7 @@ void LLFloater::buildButtons(const Params& floater_params) p.click_callback.function(boost::bind(sButtonCallbacks[i], this)); p.tab_stop(false); p.follows.flags(FOLLOWS_TOP|FOLLOWS_RIGHT); - p.tool_tip = getButtonTooltip(floater_params, (EFloaterButton)i); + p.tool_tip = getButtonTooltip(floater_params, (EFloaterButton)i, getIsChrome()); p.scale_image(true); p.chrome(true); @@ -1841,7 +1884,7 @@ void LLFloater::buildButtons(const Params& floater_params) mButtons[i] = buttonp; } - updateButtons(); + updateTitleButtons(); } // static @@ -1887,8 +1930,15 @@ LLUIImage* LLFloater::getButtonPressedImage(const Params& p, EFloaterButton e) } // static -std::string LLFloater::getButtonTooltip(const Params& p, EFloaterButton e) +std::string LLFloater::getButtonTooltip(const Params& p, EFloaterButton e, bool is_chrome) { + // EXT-4081 (Lag Meter: Ctrl+W does not close floater) + // If floater is chrome set 'Close' text for close button's tooltip + if(is_chrome && BUTTON_CLOSE == e) + { + static std::string close_tooltip_chrome = LLTrans::getString("BUTTON_CLOSE_CHROME"); + return close_tooltip_chrome; + } // TODO: per-floater localizable tooltips set in XML return sButtonToolTips[e]; } @@ -2376,10 +2426,17 @@ void LLFloaterView::adjustToFitScreen(LLFloater* floater, BOOL allow_partial_out LLRect new_rect; new_rect.setLeftTopAndSize(view_rect.mLeft,view_rect.mTop,new_width, new_height); - floater->reshape( new_width, new_height, TRUE ); - floater->setRect(new_rect); + floater->setShape(new_rect); - floater->translateIntoRect( getLocalRect(), false ); + if (floater->followsRight()) + { + floater->translate(old_width - new_width, 0); + } + + if (floater->followsTop()) + { + floater->translate(0, old_height - new_height); + } } } @@ -2467,7 +2524,7 @@ LLFloater *LLFloaterView::getBackmost() const void LLFloaterView::syncFloaterTabOrder() { - // look for a visible modal dialog, starting from first (should be only one) + // look for a visible modal dialog, starting from first LLModalDialog* modal_dialog = NULL; for ( child_list_const_iter_t child_it = getChildList()->begin(); child_it != getChildList()->end(); ++child_it) { @@ -2482,10 +2539,7 @@ void LLFloaterView::syncFloaterTabOrder() if (modal_dialog) { // If we have a visible modal dialog, make sure that it has focus - if( gFocusMgr.getTopCtrl() != modal_dialog ) - { - gFocusMgr.setTopCtrl( modal_dialog ); - } + LLUI::addPopup(modal_dialog); if( !gFocusMgr.childHasKeyboardFocus( modal_dialog ) ) { @@ -2670,6 +2724,7 @@ void LLFloater::initFromParams(const LLFloater::Params& p) mLegacyHeaderHeight = p.legacy_header_height; mSingleInstance = p.single_instance; mAutoTile = p.auto_tile; + mOpenCentered = p.open_centered; if (p.save_rect) { @@ -2794,3 +2849,15 @@ bool LLFloater::isShown(const LLFloater* floater) { return floater && floater->isShown(); } + +/* static */ +bool LLFloater::isMinimized(const LLFloater* floater) +{ + return floater && floater->isMinimized(); +} + +/* static */ +bool LLFloater::isVisible(const LLFloater* floater) +{ + return floater && floater->getVisible(); +} diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h index 2166d8db8a..654164ddc0 100644 --- a/indra/llui/llfloater.h +++ b/indra/llui/llfloater.h @@ -110,7 +110,8 @@ public: save_rect, save_visibility, save_dock_state, - can_dock; + can_dock, + open_centered; Optional<S32> header_height, legacy_header_height; // HACK see initFromXML() @@ -194,6 +195,8 @@ public: /// The static isShown() can accept a NULL pointer (which of course /// returns false). When non-NULL, it calls the non-static isShown(). static bool isShown(const LLFloater* floater); + static bool isVisible(const LLFloater* floater); + static bool isMinimized(const LLFloater* floater); BOOL isFirstLook() { return mFirstLook; } // EXT-2653: This function is necessary to prevent overlapping for secondary showed toasts BOOL isFrontmost(); BOOL isDependent() { return !mDependeeHandle.isDead(); } @@ -222,6 +225,7 @@ public: virtual BOOL handleScrollWheel(S32 x, S32 y, S32 mask); virtual void draw(); + virtual void drawShadow(LLPanel* panel); virtual void onOpen(const LLSD& key) {} virtual void onClose(bool app_quitting) {} @@ -306,19 +310,28 @@ protected: void destroy() { die(); } // Don't call this directly. You probably want to call closeFloater() + virtual void onClickCloseBtn(); + + virtual void updateTitleButtons(); + private: void setForeground(BOOL b); // called only by floaterview void cleanupHandles(); // remove handles to dead floaters void createMinimizeButton(); - void updateButtons(); void buildButtons(const Params& p); // Images and tooltips are named in the XML, but we want to look them // up by index. static LLUIImage* getButtonImage(const Params& p, EFloaterButton e); static LLUIImage* getButtonPressedImage(const Params& p, EFloaterButton e); - static std::string getButtonTooltip(const Params& p, EFloaterButton e); + /** + * @params is_chrome - if floater is Chrome it means that floater will never get focus. + * Therefore it can't be closed with 'Ctrl+W'. So the tooltip text of close button( X ) + * should be 'Close' not 'Close(Ctrl+W)' as for usual floaters. + */ + static std::string getButtonTooltip(const Params& p, EFloaterButton e, bool is_chrome); + BOOL offerClickToButton(S32 x, S32 y, MASK mask, EFloaterButton index); void addResizeCtrls(); void layoutResizeCtrls(); @@ -345,6 +358,7 @@ protected: LLResizeBar* mResizeBar[4]; LLResizeHandle* mResizeHandle[4]; + LLButton* mButtons[BUTTON_COUNT]; private: LLRect mExpandedRect; @@ -360,6 +374,7 @@ private: BOOL mCanClose; BOOL mDragOnLeft; BOOL mResizable; + bool mOpenCentered; S32 mMinWidth; S32 mMinHeight; @@ -378,7 +393,6 @@ private: handle_set_t mDependents; bool mButtonsEnabled[BUTTON_COUNT]; - LLButton* mButtons[BUTTON_COUNT]; F32 mButtonScale; BOOL mAutoFocus; LLHandle<LLFloater> mSnappedTo; @@ -420,11 +434,15 @@ private: class LLFloaterView : public LLUICtrl { +public: + struct Params : public LLInitParam::Block<Params, LLUICtrl::Params>{}; + protected: LLFloaterView (const Params& p); friend class LLUICtrlFactory; public: + /*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE); void reshapeFloater(S32 width, S32 height, BOOL called_from_parent, BOOL adjust_vertical); diff --git a/indra/llui/llfloaterreg.cpp b/indra/llui/llfloaterreg.cpp index 5de3934c8a..85f9af126c 100644 --- a/indra/llui/llfloaterreg.cpp +++ b/indra/llui/llfloaterreg.cpp @@ -47,6 +47,7 @@ LLFloaterReg::instance_map_t LLFloaterReg::sInstanceMap; LLFloaterReg::build_map_t LLFloaterReg::sBuildMap; std::map<std::string,std::string> LLFloaterReg::sGroupMap; bool LLFloaterReg::sBlockShowFloaters = false; +std::set<std::string> LLFloaterReg::sAlwaysShowableList; static LLFloaterRegListener sFloaterRegListener; @@ -219,7 +220,9 @@ LLFloaterReg::const_instance_list_t& LLFloaterReg::getFloaterList(const std::str //static LLFloater* LLFloaterReg::showInstance(const std::string& name, const LLSD& key, BOOL focus) { - if( sBlockShowFloaters ) + if( sBlockShowFloaters + // see EXT-7090 + && sAlwaysShowableList.find(name) == sAlwaysShowableList.end()) return 0;// LLFloater* instance = getInstance(name, key); if (instance) @@ -272,11 +275,11 @@ bool LLFloaterReg::toggleInstance(const std::string& name, const LLSD& key) } //static -// returns true if the instance exists and is visible +// returns true if the instance exists and is visible (doesnt matter minimized or not) bool LLFloaterReg::instanceVisible(const std::string& name, const LLSD& key) { LLFloater* instance = findInstance(name, key); - return LLFloater::isShown(instance); + return LLFloater::isVisible(instance); } //static @@ -403,6 +406,14 @@ void LLFloaterReg::registerControlVariables() declareVisibilityControl(name); } } + + const LLSD& exclude_list = LLUI::sSettingGroups["config"]->getLLSD("always_showable_floaters"); + for (LLSD::array_const_iterator iter = exclude_list.beginArray(); + iter != exclude_list.endArray(); + iter++) + { + sAlwaysShowableList.insert(iter->asString()); + } } // Callbacks @@ -463,3 +474,12 @@ bool LLFloaterReg::floaterInstanceVisible(const LLSD& sdname) return instanceVisible(name, key); } +//static +bool LLFloaterReg::floaterInstanceMinimized(const LLSD& sdname) +{ + LLSD key; + std::string name = sdname.asString(); + parse_name_key(name, key); + LLFloater* instance = findInstance(name, key); + return LLFloater::isShown(instance); +} diff --git a/indra/llui/llfloaterreg.h b/indra/llui/llfloaterreg.h index 8a11d5c3f2..f1ba41f638 100644 --- a/indra/llui/llfloaterreg.h +++ b/indra/llui/llfloaterreg.h @@ -76,6 +76,10 @@ private: static build_map_t sBuildMap; static std::map<std::string,std::string> sGroupMap; static bool sBlockShowFloaters; + /** + * Defines list of floater names that can be shown despite state of sBlockShowFloaters. + */ + static std::set<std::string> sAlwaysShowableList; public: // Registration @@ -134,6 +138,7 @@ public: static void hideFloaterInstance(const LLSD& sdname); static void toggleFloaterInstance(const LLSD& sdname); static bool floaterInstanceVisible(const LLSD& sdname); + static bool floaterInstanceMinimized(const LLSD& sdname); // Typed find / get / show template <class T> diff --git a/indra/llui/llfocusmgr.cpp b/indra/llui/llfocusmgr.cpp index 35fbc7b0a8..b3af258456 100644 --- a/indra/llui/llfocusmgr.cpp +++ b/indra/llui/llfocusmgr.cpp @@ -38,8 +38,6 @@ const F32 FOCUS_FADE_TIME = 0.3f; -// NOTE: the LLFocusableElement implementation has been moved here from lluictrl.cpp. - LLFocusableElement::LLFocusableElement() : mFocusLostCallback(NULL), mFocusReceivedCallback(NULL), @@ -124,8 +122,7 @@ boost::signals2::connection LLFocusableElement::setTopLostCallback(const focus_s LLFocusMgr gFocusMgr; LLFocusMgr::LLFocusMgr() - : - mLockedView( NULL ), +: mLockedView( NULL ), mMouseCaptor( NULL ), mKeyboardFocus( NULL ), mLastKeyboardFocus( NULL ), @@ -133,16 +130,11 @@ LLFocusMgr::LLFocusMgr() mKeystrokesOnly(FALSE), mTopCtrl( NULL ), mAppHasFocus(TRUE) // Macs don't seem to notify us that we've gotten focus, so default to true - #ifdef _DEBUG - , mMouseCaptorName("none") - , mKeyboardFocusName("none") - , mTopCtrlName("none") - #endif { } -void LLFocusMgr::releaseFocusIfNeeded( const LLView* view ) +void LLFocusMgr::releaseFocusIfNeeded( LLView* view ) { if( childHasMouseCapture( view ) ) { @@ -162,10 +154,7 @@ void LLFocusMgr::releaseFocusIfNeeded( const LLView* view ) } } - if( childIsTopCtrl( view ) ) - { - setTopCtrl( NULL ); - } + LLUI::removePopup(view); } @@ -248,11 +237,6 @@ void LLFocusMgr::setKeyboardFocus(LLFocusableElement* new_focus, BOOL lock, BOOL return; } - #ifdef _DEBUG - LLUICtrl* focus_ctrl = dynamic_cast<LLUICtrl*>(new_focus); - mKeyboardFocusName = focus_ctrl ? focus_ctrl->getName() : std::string("none"); - #endif - // If we've got a default keyboard focus, and the caller is // releasing keyboard focus, move to the default. if (mDefaultKeyboardFocus != NULL && mKeyboardFocus == NULL) @@ -334,20 +318,12 @@ void LLFocusMgr::removeKeyboardFocusWithoutCallback( const LLFocusableElement* f if( mKeyboardFocus == focus ) { mKeyboardFocus = NULL; - #ifdef _DEBUG - mKeyboardFocusName = std::string("none"); - #endif } } void LLFocusMgr::setMouseCapture( LLMouseHandler* new_captor ) { - //if (mFocusLocked) - //{ - // return; - //} - if( new_captor != mMouseCaptor ) { LLMouseHandler* old_captor = mMouseCaptor; @@ -370,24 +346,14 @@ void LLFocusMgr::setMouseCapture( LLMouseHandler* new_captor ) old_captor->onMouseCaptureLost(); } - #ifdef _DEBUG - mMouseCaptorName = new_captor ? new_captor->getName() : std::string("none"); - #endif } } void LLFocusMgr::removeMouseCaptureWithoutCallback( const LLMouseHandler* captor ) { - //if (mFocusLocked) - //{ - // return; - //} if( mMouseCaptor == captor ) { mMouseCaptor = NULL; - #ifdef _DEBUG - mMouseCaptorName = std::string("none"); - #endif } } @@ -416,10 +382,6 @@ void LLFocusMgr::setTopCtrl( LLUICtrl* new_top ) { mTopCtrl = new_top; - #ifdef _DEBUG - mTopCtrlName = new_top ? new_top->getName() : std::string("none"); - #endif - if (old_top) { old_top->onTopLost(); @@ -432,9 +394,6 @@ void LLFocusMgr::removeTopCtrlWithoutCallback( const LLUICtrl* top_view ) if( mTopCtrl == top_view ) { mTopCtrl = NULL; - #ifdef _DEBUG - mTopCtrlName = std::string("none"); - #endif } } @@ -478,9 +437,9 @@ void LLFocusMgr::setAppHasFocus(BOOL focus) } // release focus from "top ctrl"s, which generally hides them - if (!focus && mTopCtrl) + if (!focus) { - setTopCtrl(NULL); + LLUI::clearPopups(); } mAppHasFocus = focus; } diff --git a/indra/llui/llfocusmgr.h b/indra/llui/llfocusmgr.h index 83ecd1d301..86d3ccf111 100644 --- a/indra/llui/llfocusmgr.h +++ b/indra/llui/llfocusmgr.h @@ -65,10 +65,10 @@ public: virtual BOOL handleKey(KEY key, MASK mask, BOOL called_from_parent); virtual BOOL handleUnicodeChar(llwchar uni_char, BOOL called_from_parent); + virtual void onTopLost(); // called when registered as top ctrl and user clicks elsewhere protected: virtual void onFocusReceived(); virtual void onFocusLost(); - virtual void onTopLost(); // called when registered as top ctrl and user clicks elsewhere focus_signal_t* mFocusLostCallback; focus_signal_t* mFocusReceivedCallback; focus_signal_t* mFocusChangedCallback; @@ -119,7 +119,7 @@ public: BOOL childIsTopCtrl( const LLView* parent ) const; // All Three - void releaseFocusIfNeeded( const LLView* top_view ); + void releaseFocusIfNeeded( LLView* top_view ); void lockFocus(); void unlockFocus(); BOOL focusLocked() const { return mLockedView != NULL; } @@ -149,12 +149,6 @@ private: typedef std::map<LLHandle<LLView>, LLHandle<LLView> > focus_history_map_t; focus_history_map_t mFocusHistory; - - #ifdef _DEBUG - std::string mMouseCaptorName; - std::string mKeyboardFocusName; - std::string mTopCtrlName; - #endif }; extern LLFocusMgr gFocusMgr; diff --git a/indra/llui/llhandle.h b/indra/llui/llhandle.h index 899f6b9326..8ade327044 100644 --- a/indra/llui/llhandle.h +++ b/indra/llui/llhandle.h @@ -67,6 +67,13 @@ public: return *this; } + template<typename Subclass> + LLHandle<T>& operator =(const LLHandle<Subclass>& other) + { + mTombStone = other.mTombStone; + return *this; + } + bool isDead() const { return mTombStone->getTarget() == NULL; diff --git a/indra/llui/lliconctrl.h b/indra/llui/lliconctrl.h index 66368f979b..7e37600409 100644 --- a/indra/llui/lliconctrl.h +++ b/indra/llui/lliconctrl.h @@ -73,6 +73,7 @@ public: std::string getImageName() const; void setColor(const LLColor4& color) { mColor = color; } + void setImage(LLPointer<LLUIImage> image) { mImagep = image; } private: void setIconImageDrawSize() ; diff --git a/indra/llui/llkeywords.cpp b/indra/llui/llkeywords.cpp index ede32084d0..e9614ea660 100644 --- a/indra/llui/llkeywords.cpp +++ b/indra/llui/llkeywords.cpp @@ -218,6 +218,86 @@ void LLKeywords::addToken(LLKeywordToken::TOKEN_TYPE type, llassert(0); } } +LLKeywords::WStringMapIndex::WStringMapIndex(const WStringMapIndex& other) +{ + if(other.mOwner) + { + copyData(other.mData, other.mLength); + } + else + { + mOwner = false; + mLength = other.mLength; + mData = other.mData; + } +} + +LLKeywords::WStringMapIndex::WStringMapIndex(const LLWString& str) +{ + copyData(str.data(), str.size()); +} + +LLKeywords::WStringMapIndex::WStringMapIndex(const llwchar *start, size_t length): +mData(start), mLength(length), mOwner(false) +{ +} + +LLKeywords::WStringMapIndex::~WStringMapIndex() +{ + if(mOwner) + delete[] mData; +} + +void LLKeywords::WStringMapIndex::copyData(const llwchar *start, size_t length) +{ + llwchar *data = new llwchar[length]; + memcpy((void*)data, (const void*)start, length * sizeof(llwchar)); + + mOwner = true; + mLength = length; + mData = data; +} + +bool LLKeywords::WStringMapIndex::operator<(const LLKeywords::WStringMapIndex &other) const +{ + // NOTE: Since this is only used to organize a std::map, it doesn't matter if it uses correct collate order or not. + // The comparison only needs to strictly order all possible strings, and be stable. + + bool result = false; + const llwchar* self_iter = mData; + const llwchar* self_end = mData + mLength; + const llwchar* other_iter = other.mData; + const llwchar* other_end = other.mData + other.mLength; + + while(true) + { + if(other_iter >= other_end) + { + // We've hit the end of other. + // This covers two cases: other being shorter than self, or the strings being equal. + // In either case, we want to return false. + result = false; + break; + } + else if(self_iter >= self_end) + { + // self is shorter than other. + result = true; + break; + } + else if(*self_iter != *other_iter) + { + // The current character differs. The strings are not equal. + result = *self_iter < *other_iter; + break; + } + + self_iter++; + other_iter++; + } + + return result; +} LLColor3 LLKeywords::readColor( const std::string& s ) { @@ -259,6 +339,9 @@ void LLKeywords::findSegments(std::vector<LLTextSegmentPtr>* seg_list, const LLW { if( *cur == '\n' ) { + LLTextSegmentPtr text_segment = new LLLineBreakTextSegment(cur-base); + text_segment->setToken( 0 ); + insertSegment( *seg_list, text_segment, text_len, defaultColor, editor); cur++; if( !*cur || *cur == '\n' ) { @@ -298,9 +381,8 @@ void LLKeywords::findSegments(std::vector<LLTextSegmentPtr>* seg_list, const LLW } S32 seg_end = cur - base; - LLTextSegmentPtr text_segment = new LLNormalTextSegment( cur_token->getColor(), seg_start, seg_end, editor ); - text_segment->setToken( cur_token ); - insertSegment( seg_list, text_segment, text_len, defaultColor, editor); + //create segments from seg_start to seg_end + insertSegments(wtext, *seg_list,cur_token, text_len, seg_start, seg_end, defaultColor, editor); line_done = TRUE; // to break out of second loop. break; } @@ -406,11 +488,12 @@ void LLKeywords::findSegments(std::vector<LLTextSegmentPtr>* seg_list, const LLW seg_end = seg_start + between_delimiters + cur_delimiter->getLength(); } - + insertSegments(wtext, *seg_list,cur_delimiter, text_len, seg_start, seg_end, defaultColor, editor); + /* LLTextSegmentPtr text_segment = new LLNormalTextSegment( cur_delimiter->getColor(), seg_start, seg_end, editor ); text_segment->setToken( cur_delimiter ); insertSegment( seg_list, text_segment, text_len, defaultColor, editor); - + */ // Note: we don't increment cur, since the end of one delimited seg may be immediately // followed by the start of another one. continue; @@ -429,7 +512,7 @@ void LLKeywords::findSegments(std::vector<LLTextSegmentPtr>* seg_list, const LLW S32 seg_len = p - cur; if( seg_len > 0 ) { - LLWString word( cur, 0, seg_len ); + WStringMapIndex word( cur, seg_len ); word_token_map_t::iterator map_iter = mWordTokenMap.find(word); if( map_iter != mWordTokenMap.end() ) { @@ -439,10 +522,7 @@ void LLKeywords::findSegments(std::vector<LLTextSegmentPtr>* seg_list, const LLW // llinfos << "Seg: [" << word.c_str() << "]" << llendl; - - LLTextSegmentPtr text_segment = new LLNormalTextSegment( cur_token->getColor(), seg_start, seg_end, editor ); - text_segment->setToken( cur_token ); - insertSegment( seg_list, text_segment, text_len, defaultColor, editor); + insertSegments(wtext, *seg_list,cur_token, text_len, seg_start, seg_end, defaultColor, editor); } cur += seg_len; continue; @@ -457,24 +537,50 @@ void LLKeywords::findSegments(std::vector<LLTextSegmentPtr>* seg_list, const LLW } } -void LLKeywords::insertSegment(std::vector<LLTextSegmentPtr>* seg_list, LLTextSegmentPtr new_segment, S32 text_len, const LLColor4 &defaultColor, LLTextEditor& editor ) +void LLKeywords::insertSegments(const LLWString& wtext, std::vector<LLTextSegmentPtr>& seg_list, LLKeywordToken* cur_token, S32 text_len, S32 seg_start, S32 seg_end, const LLColor4 &defaultColor, LLTextEditor& editor ) +{ + std::string::size_type pos = wtext.find('\n',seg_start); + + while (pos!=-1 && pos < (std::string::size_type)seg_end) + { + if (pos!=seg_start) + { + LLTextSegmentPtr text_segment = new LLNormalTextSegment( cur_token->getColor(), seg_start, pos, editor ); + text_segment->setToken( cur_token ); + insertSegment( seg_list, text_segment, text_len, defaultColor, editor); + } + + LLTextSegmentPtr text_segment = new LLLineBreakTextSegment(pos); + text_segment->setToken( cur_token ); + insertSegment( seg_list, text_segment, text_len, defaultColor, editor); + + seg_start = pos+1; + pos = wtext.find('\n',seg_start); + } + + LLTextSegmentPtr text_segment = new LLNormalTextSegment( cur_token->getColor(), seg_start, seg_end, editor ); + text_segment->setToken( cur_token ); + insertSegment( seg_list, text_segment, text_len, defaultColor, editor); +} + +void LLKeywords::insertSegment(std::vector<LLTextSegmentPtr>& seg_list, LLTextSegmentPtr new_segment, S32 text_len, const LLColor4 &defaultColor, LLTextEditor& editor ) { - LLTextSegmentPtr last = seg_list->back(); + LLTextSegmentPtr last = seg_list.back(); S32 new_seg_end = new_segment->getEnd(); if( new_segment->getStart() == last->getStart() ) { - seg_list->pop_back(); + seg_list.pop_back(); } else { last->setEnd( new_segment->getStart() ); } - seg_list->push_back( new_segment ); + seg_list.push_back( new_segment ); if( new_seg_end < text_len ) { - seg_list->push_back( new LLNormalTextSegment( defaultColor, new_seg_end, text_len, editor ) ); + seg_list.push_back( new LLNormalTextSegment( defaultColor, new_seg_end, text_len, editor ) ); } } diff --git a/indra/llui/llkeywords.h b/indra/llui/llkeywords.h index 53377869ca..09378e408b 100644 --- a/indra/llui/llkeywords.h +++ b/indra/llui/llkeywords.h @@ -92,8 +92,33 @@ public: const std::string& key, const LLColor3& color, const std::string& tool_tip = LLStringUtil::null); - - typedef std::map<LLWString, LLKeywordToken*> word_token_map_t; + + // This class is here as a performance optimization. + // The word token map used to be defined as std::map<LLWString, LLKeywordToken*>. + // This worked, but caused a performance bottleneck due to memory allocation and string copies + // because it's not possible to search such a map without creating an LLWString. + // Using this class as the map index instead allows us to search using segments of an existing + // text run without copying them first, which greatly reduces overhead in LLKeywords::findSegments(). + class WStringMapIndex + { + public: + // copy constructor + WStringMapIndex(const WStringMapIndex& other); + // constructor from a string (copies the string's data into the new object) + WStringMapIndex(const LLWString& str); + // constructor from pointer and length + // NOTE: does NOT copy data, caller must ensure that the lifetime of the pointer exceeds that of the new object! + WStringMapIndex(const llwchar *start, size_t length); + ~WStringMapIndex(); + bool operator<(const WStringMapIndex &other) const; + private: + void copyData(const llwchar *start, size_t length); + const llwchar *mData; + size_t mLength; + bool mOwner; + }; + + typedef std::map<WStringMapIndex, LLKeywordToken*> word_token_map_t; typedef word_token_map_t::const_iterator keyword_iterator_t; keyword_iterator_t begin() const { return mWordTokenMap.begin(); } keyword_iterator_t end() const { return mWordTokenMap.end(); } @@ -104,7 +129,8 @@ public: private: LLColor3 readColor(const std::string& s); - void insertSegment(std::vector<LLTextSegmentPtr> *seg_list, LLTextSegmentPtr new_segment, S32 text_len, const LLColor4 &defaultColor, class LLTextEditor& editor); + void insertSegment(std::vector<LLTextSegmentPtr>& seg_list, LLTextSegmentPtr new_segment, S32 text_len, const LLColor4 &defaultColor, class LLTextEditor& editor); + void insertSegments(const LLWString& wtext, std::vector<LLTextSegmentPtr>& seg_list, LLKeywordToken* token, S32 text_len, S32 seg_start, S32 seg_end, const LLColor4 &defaultColor, LLTextEditor& editor); BOOL mLoaded; word_token_map_t mWordTokenMap; diff --git a/indra/llui/lllayoutstack.cpp b/indra/llui/lllayoutstack.cpp index 1aaba88c49..4512091371 100644 --- a/indra/llui/lllayoutstack.cpp +++ b/indra/llui/lllayoutstack.cpp @@ -49,9 +49,11 @@ static LLDefaultChildRegistry::Register<LLLayoutStack> register_layout_stack("la // struct LLLayoutStack::LayoutPanel { - LayoutPanel(LLPanel* panelp, ELayoutOrientation orientation, S32 min_width, S32 min_height, BOOL auto_resize, BOOL user_resize) : mPanel(panelp), + LayoutPanel(LLPanel* panelp, ELayoutOrientation orientation, S32 min_width, S32 min_height, S32 max_width, S32 max_height, BOOL auto_resize, BOOL user_resize) : mPanel(panelp), mMinWidth(min_width), mMinHeight(min_height), + mMaxWidth(max_width), + mMaxHeight(max_height), mAutoResize(auto_resize), mUserResize(user_resize), mOrientation(orientation), @@ -112,6 +114,11 @@ struct LLLayoutStack::LayoutPanel LLPanel* mPanel; S32 mMinWidth; S32 mMinHeight; + + // mMaxWidth & mMaxHeight are added to make configurable max width of the nearby chat bar. EXT-5589 + // they are not processed by LLLayoutStack but they can be if necessary + S32 mMaxWidth; + S32 mMaxHeight; BOOL mAutoResize; BOOL mUserResize; BOOL mCollapsed; @@ -261,10 +268,14 @@ LLView* LLLayoutStack::fromXML(LLXMLNodePtr node, LLView *parent, LLXMLNodePtr o { const S32 DEFAULT_MIN_WIDTH = 0; const S32 DEFAULT_MIN_HEIGHT = 0; + const S32 DEFAULT_MAX_WIDTH = S32_MAX; + const S32 DEFAULT_MAX_HEIGHT = S32_MAX; const BOOL DEFAULT_AUTO_RESIZE = TRUE; S32 min_width = DEFAULT_MIN_WIDTH; S32 min_height = DEFAULT_MIN_HEIGHT; + S32 max_width = DEFAULT_MAX_WIDTH; + S32 max_height = DEFAULT_MAX_HEIGHT; BOOL auto_resize = DEFAULT_AUTO_RESIZE; LLXMLNodePtr output_child; @@ -281,6 +292,10 @@ LLView* LLLayoutStack::fromXML(LLXMLNodePtr node, LLView *parent, LLXMLNodePtr o DEFAULT_MIN_WIDTH, output_child); get_attribute_s32_and_write(child_node, "min_height", &min_height, DEFAULT_MIN_HEIGHT, output_child); + get_attribute_s32_and_write(child_node, "max_width", &max_width, + DEFAULT_MAX_WIDTH, output_child); + get_attribute_s32_and_write(child_node, "max_height", &max_height, + DEFAULT_MAX_HEIGHT, output_child); get_attribute_bool_and_write(child_node, "auto_resize", &auto_resize, DEFAULT_AUTO_RESIZE, output_child); @@ -293,7 +308,7 @@ LLView* LLLayoutStack::fromXML(LLXMLNodePtr node, LLView *parent, LLXMLNodePtr o if (panelp) { panelp->setFollowsNone(); - layout_stackp->addPanel(panelp, min_width, min_height, auto_resize, user_resize); + layout_stackp->addPanel(panelp, min_width, min_height, max_width, max_height, auto_resize, user_resize); } } else @@ -309,7 +324,7 @@ LLView* LLLayoutStack::fromXML(LLXMLNodePtr node, LLView *parent, LLXMLNodePtr o if (new_child) { // put child in new embedded panel - layout_stackp->addPanel(panelp, min_width, min_height, auto_resize, user_resize); + layout_stackp->addPanel(panelp, min_width, min_height, max_width, max_height, auto_resize, user_resize); // resize panel to contain widget and move widget to be contained in panel panelp->setRect(new_child->getRect()); new_child->setOrigin(0, 0); @@ -359,14 +374,14 @@ S32 LLLayoutStack::getDefaultWidth(S32 cur_width) return cur_width; } -void LLLayoutStack::addPanel(LLPanel* panel, S32 min_width, S32 min_height, BOOL auto_resize, BOOL user_resize, EAnimate animate, S32 index) +void LLLayoutStack::addPanel(LLPanel* panel, S32 min_width, S32 min_height, S32 max_width, S32 max_height, BOOL auto_resize, BOOL user_resize, EAnimate animate, S32 index) { // panel starts off invisible (collapsed) if (animate == ANIMATE) { panel->setVisible(FALSE); } - LayoutPanel* embedded_panel = new LayoutPanel(panel, mOrientation, min_width, min_height, auto_resize, user_resize); + LayoutPanel* embedded_panel = new LayoutPanel(panel, mOrientation, min_width, min_height, max_width, max_height, auto_resize, user_resize); mPanels.insert(mPanels.begin() + llclamp(index, 0, (S32)mPanels.size()), embedded_panel); @@ -437,6 +452,19 @@ bool LLLayoutStack::getPanelMinSize(const std::string& panel_name, S32* min_widt return NULL != panel; } +bool LLLayoutStack::getPanelMaxSize(const std::string& panel_name, S32* max_widthp, S32* max_heightp) +{ + LayoutPanel* panel = findEmbeddedPanelByName(panel_name); + + if (panel) + { + if (max_widthp) *max_widthp = panel->mMaxWidth; + if (max_heightp) *max_heightp = panel->mMaxHeight; + } + + return NULL != panel; +} + static LLFastTimer::DeclareTimer FTM_UPDATE_LAYOUT("Update LayoutStacks"); void LLLayoutStack::updateLayout(BOOL force_resize) { @@ -816,7 +844,10 @@ void LLLayoutStack::calcMinExtents() //static void LLLayoutStack::updateClass() { - for (LLLayoutStack::instance_iter it = beginInstances(); it != endInstances(); ++it) + LLInstanceTrackerScopedGuard guard; + for (LLLayoutStack::instance_iter it = guard.beginInstances(); + it != guard.endInstances(); + ++it) { it->updateLayout(); } diff --git a/indra/llui/lllayoutstack.h b/indra/llui/lllayoutstack.h index c4f10038f8..e454454fe2 100644 --- a/indra/llui/lllayoutstack.h +++ b/indra/llui/lllayoutstack.h @@ -74,7 +74,7 @@ public: ANIMATE } EAnimate; - void addPanel(LLPanel* panel, S32 min_width, S32 min_height, BOOL auto_resize, BOOL user_resize, EAnimate animate = NO_ANIMATE, S32 index = S32_MAX); + void addPanel(LLPanel* panel, S32 min_width, S32 min_height, S32 max_width, S32 max_height, BOOL auto_resize, BOOL user_resize, EAnimate animate = NO_ANIMATE, S32 index = S32_MAX); void removePanel(LLPanel* panel); void collapsePanel(LLPanel* panel, BOOL collapsed = TRUE); S32 getNumPanels() { return mPanels.size(); } @@ -89,6 +89,14 @@ public: * @returns true if specified by panel_name internal panel exists, false otherwise. */ bool getPanelMinSize(const std::string& panel_name, S32* min_widthp, S32* min_heightp); + + /** + * Gets maximal width and/or height of the specified by name panel. + * + * If it is necessary to get only the one dimension pass NULL for another one. + * @returns true if specified by panel_name internal panel exists, false otherwise. + */ + bool getPanelMaxSize(const std::string& panel_name, S32* max_width, S32* max_height); void updateLayout(BOOL force_resize = FALSE); diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp index 30b09352d8..c93ca1af88 100644 --- a/indra/llui/lllineeditor.cpp +++ b/indra/llui/lllineeditor.cpp @@ -83,19 +83,6 @@ template class LLLineEditor* LLView::getChild<class LLLineEditor>( // Member functions // -void LLLineEditor::PrevalidateNamedFuncs::declareValues() -{ - declare("ascii", LLLineEditor::prevalidateASCII); - declare("float", LLLineEditor::prevalidateFloat); - declare("int", LLLineEditor::prevalidateInt); - declare("positive_s32", LLLineEditor::prevalidatePositiveS32); - declare("non_negative_s32", LLLineEditor::prevalidateNonNegativeS32); - declare("alpha_num", LLLineEditor::prevalidateAlphaNum); - declare("alpha_num_space", LLLineEditor::prevalidateAlphaNumSpace); - declare("ascii_printable_no_pipe", LLLineEditor::prevalidateASCIIPrintableNoPipe); - declare("ascii_printable_no_space", LLLineEditor::prevalidateASCIIPrintableNoSpace); -} - LLLineEditor::Params::Params() : max_length_bytes("max_length", 254), keystroke_callback("keystroke_callback"), @@ -104,7 +91,6 @@ LLLineEditor::Params::Params() background_image_disabled("background_image_disabled"), background_image_focused("background_image_focused"), select_on_focus("select_on_focus", false), - handle_edit_keys_directly("handle_edit_keys_directly", false), revert_on_esc("revert_on_esc", true), commit_on_focus_lost("commit_on_focus_lost", true), ignore_tab("ignore_tab", true), @@ -149,7 +135,6 @@ LLLineEditor::LLLineEditor(const LLLineEditor::Params& p) mIgnoreArrowKeys( FALSE ), mIgnoreTab( p.ignore_tab ), mDrawAsterixes( FALSE ), - mHandleEditKeysDirectly(p.handle_edit_keys_directly), mSelectAllonFocusReceived( p.select_on_focus ), mPassDelete(FALSE), mReadOnly(FALSE), @@ -205,12 +190,8 @@ LLLineEditor::~LLLineEditor() { mCommitOnFocusLost = FALSE; + // calls onCommit() while LLLineEditor still valid gFocusMgr.releaseFocusIfNeeded( this ); - - if( gEditMenuHandler == this ) - { - gEditMenuHandler = NULL; - } } @@ -396,7 +377,10 @@ void LLLineEditor::setText(const LLStringExplicit &new_text) setCursor(llmin((S32)mText.length(), getCursor())); // Set current history line to end of history. - mCurrentHistoryLine = mLineHistory.end() - 1; + if(mLineHistory.end() != mLineHistory.begin()) + { + mCurrentHistoryLine = mLineHistory.end() - 1; + } mPrevText = mText; } @@ -510,6 +494,7 @@ void LLLineEditor::selectAll() setCursor(mSelectionEnd); //mScrollHPos = 0; mIsSelecting = TRUE; + updatePrimary(); } @@ -801,7 +786,7 @@ void LLLineEditor::removeChar() } else { - reportBadKeystroke(); + LLUI::reportBadKeystroke(); } } @@ -840,7 +825,7 @@ void LLLineEditor::addChar(const llwchar uni_char) } else { - reportBadKeystroke(); + LLUI::reportBadKeystroke(); } getWindow()->hideCursorUntilMouseMove(); @@ -929,7 +914,7 @@ BOOL LLLineEditor::handleSelectionKey(KEY key, MASK mask) } else { - reportBadKeystroke(); + LLUI::reportBadKeystroke(); } break; @@ -945,7 +930,7 @@ BOOL LLLineEditor::handleSelectionKey(KEY key, MASK mask) } else { - reportBadKeystroke(); + LLUI::reportBadKeystroke(); } break; @@ -971,22 +956,6 @@ BOOL LLLineEditor::handleSelectionKey(KEY key, MASK mask) } } - if (!handled && mHandleEditKeysDirectly) - { - if( (MASK_CONTROL & mask) && ('A' == key) ) - { - if( canSelectAll() ) - { - selectAll(); - } - else - { - reportBadKeystroke(); - } - handled = TRUE; - } - } - if(handled) { // take selection to 'primary' clipboard @@ -1033,7 +1002,7 @@ void LLLineEditor::cut() if( need_to_rollback ) { rollback.doRollback( this ); - reportBadKeystroke(); + LLUI::reportBadKeystroke(); } else if( mKeystrokeCallback ) @@ -1142,7 +1111,7 @@ void LLLineEditor::pasteHelper(bool is_primary) } // Truncate the clean string at the limit of what will fit clean_string = clean_string.substr(0, wchars_that_fit); - reportBadKeystroke(); + LLUI::reportBadKeystroke(); } mText.insert(getCursor(), clean_string); @@ -1154,7 +1123,7 @@ void LLLineEditor::pasteHelper(bool is_primary) if( need_to_rollback ) { rollback.doRollback( this ); - reportBadKeystroke(); + LLUI::reportBadKeystroke(); } else if( mKeystrokeCallback ) @@ -1219,7 +1188,7 @@ BOOL LLLineEditor::handleSpecialKey(KEY key, MASK mask) } else { - reportBadKeystroke(); + LLUI::reportBadKeystroke(); } } handled = TRUE; @@ -1268,7 +1237,7 @@ BOOL LLLineEditor::handleSpecialKey(KEY key, MASK mask) } else { - reportBadKeystroke(); + LLUI::reportBadKeystroke(); } handled = TRUE; } @@ -1295,7 +1264,7 @@ BOOL LLLineEditor::handleSpecialKey(KEY key, MASK mask) } else { - reportBadKeystroke(); + LLUI::reportBadKeystroke(); } handled = TRUE; } @@ -1312,7 +1281,7 @@ BOOL LLLineEditor::handleSpecialKey(KEY key, MASK mask) } else { - reportBadKeystroke(); + LLUI::reportBadKeystroke(); } handled = TRUE; } @@ -1329,7 +1298,7 @@ BOOL LLLineEditor::handleSpecialKey(KEY key, MASK mask) } else { - reportBadKeystroke(); + LLUI::reportBadKeystroke(); } handled = TRUE; } @@ -1352,64 +1321,6 @@ BOOL LLLineEditor::handleSpecialKey(KEY key, MASK mask) break; } - if( !handled && mHandleEditKeysDirectly ) - { - // Standard edit keys (Ctrl-X, Delete, etc,) are handled here instead of routed by the menu system. - if( KEY_DELETE == key ) - { - if( canDoDelete() ) - { - doDelete(); - } - else - { - reportBadKeystroke(); - } - handled = TRUE; - } - else - if( MASK_CONTROL & mask ) - { - if( 'C' == key ) - { - if( canCopy() ) - { - copy(); - } - else - { - reportBadKeystroke(); - } - handled = TRUE; - } - else - if( 'V' == key ) - { - if( canPaste() ) - { - paste(); - } - else - { - reportBadKeystroke(); - } - handled = TRUE; - } - else - if( 'X' == key ) - { - if( canCut() ) - { - cut(); - } - else - { - reportBadKeystroke(); - } - handled = TRUE; - } - } - } return handled; } @@ -1464,7 +1375,7 @@ BOOL LLLineEditor::handleKeyHere(KEY key, MASK mask ) { rollback.doRollback(this); - reportBadKeystroke(); + LLUI::reportBadKeystroke(); } // Notify owner if requested @@ -1512,7 +1423,7 @@ BOOL LLLineEditor::handleUnicodeCharHere(llwchar uni_char) { rollback.doRollback( this ); - reportBadKeystroke(); + LLUI::reportBadKeystroke(); } // Notify owner if requested @@ -1532,7 +1443,7 @@ BOOL LLLineEditor::handleUnicodeCharHere(llwchar uni_char) BOOL LLLineEditor::canDoDelete() const { - return ( !mReadOnly && (!mPassDelete || (hasSelection() || (getCursor() < mText.length()))) ); + return ( !mReadOnly && mText.length() > 0 && (!mPassDelete || (hasSelection() || (getCursor() < mText.length()))) ); } void LLLineEditor::doDelete() @@ -1557,7 +1468,7 @@ void LLLineEditor::doDelete() if( need_to_rollback ) { rollback.doRollback( this ); - reportBadKeystroke(); + LLUI::reportBadKeystroke(); } else { @@ -1892,11 +1803,6 @@ S32 LLLineEditor::findPixelNearestPos(const S32 cursor_offset) const return result; } -void LLLineEditor::reportBadKeystroke() -{ - make_ui_sound("UISndBadKeystroke"); -} - //virtual void LLLineEditor::clear() { @@ -1984,51 +1890,12 @@ void LLLineEditor::setRect(const LLRect& rect) } } -void LLLineEditor::setPrevalidate(LLLinePrevalidateFunc func) +void LLLineEditor::setPrevalidate(LLTextValidate::validate_func_t func) { mPrevalidateFunc = func; updateAllowingLanguageInput(); } -// Limits what characters can be used to [1234567890.-] with [-] only valid in the first position. -// Does NOT ensure that the string is a well-formed number--that's the job of post-validation--for -// the simple reasons that intermediate states may be invalid even if the final result is valid. -// -// static -BOOL LLLineEditor::prevalidateFloat(const LLWString &str) -{ - LLLocale locale(LLLocale::USER_LOCALE); - - BOOL success = TRUE; - LLWString trimmed = str; - LLWStringUtil::trim(trimmed); - S32 len = trimmed.length(); - if( 0 < len ) - { - // May be a comma or period, depending on the locale - llwchar decimal_point = (llwchar)LLResMgr::getInstance()->getDecimalPoint(); - - S32 i = 0; - - // First character can be a negative sign - if( '-' == trimmed[0] ) - { - i++; - } - - for( ; i < len; i++ ) - { - if( (decimal_point != trimmed[i] ) && !LLStringOps::isDigit( trimmed[i] ) ) - { - success = FALSE; - break; - } - } - } - - return success; -} - // static BOOL LLLineEditor::postvalidateFloat(const std::string &str) { @@ -2088,223 +1955,6 @@ BOOL LLLineEditor::postvalidateFloat(const std::string &str) return success; } -// Limits what characters can be used to [1234567890-] with [-] only valid in the first position. -// Does NOT ensure that the string is a well-formed number--that's the job of post-validation--for -// the simple reasons that intermediate states may be invalid even if the final result is valid. -// -// static -BOOL LLLineEditor::prevalidateInt(const LLWString &str) -{ - LLLocale locale(LLLocale::USER_LOCALE); - - BOOL success = TRUE; - LLWString trimmed = str; - LLWStringUtil::trim(trimmed); - S32 len = trimmed.length(); - if( 0 < len ) - { - S32 i = 0; - - // First character can be a negative sign - if( '-' == trimmed[0] ) - { - i++; - } - - for( ; i < len; i++ ) - { - if( !LLStringOps::isDigit( trimmed[i] ) ) - { - success = FALSE; - break; - } - } - } - - return success; -} - -// static -BOOL LLLineEditor::prevalidatePositiveS32(const LLWString &str) -{ - LLLocale locale(LLLocale::USER_LOCALE); - - LLWString trimmed = str; - LLWStringUtil::trim(trimmed); - S32 len = trimmed.length(); - BOOL success = TRUE; - if(0 < len) - { - if(('-' == trimmed[0]) || ('0' == trimmed[0])) - { - success = FALSE; - } - S32 i = 0; - while(success && (i < len)) - { - if(!LLStringOps::isDigit(trimmed[i++])) - { - success = FALSE; - } - } - } - if (success) - { - S32 val = strtol(wstring_to_utf8str(trimmed).c_str(), NULL, 10); - if (val <= 0) - { - success = FALSE; - } - } - return success; -} - -BOOL LLLineEditor::prevalidateNonNegativeS32(const LLWString &str) -{ - LLLocale locale(LLLocale::USER_LOCALE); - - LLWString trimmed = str; - LLWStringUtil::trim(trimmed); - S32 len = trimmed.length(); - BOOL success = TRUE; - if(0 < len) - { - if('-' == trimmed[0]) - { - success = FALSE; - } - S32 i = 0; - while(success && (i < len)) - { - if(!LLStringOps::isDigit(trimmed[i++])) - { - success = FALSE; - } - } - } - if (success) - { - S32 val = strtol(wstring_to_utf8str(trimmed).c_str(), NULL, 10); - if (val < 0) - { - success = FALSE; - } - } - return success; -} - -BOOL LLLineEditor::prevalidateAlphaNum(const LLWString &str) -{ - LLLocale locale(LLLocale::USER_LOCALE); - - BOOL rv = TRUE; - S32 len = str.length(); - if(len == 0) return rv; - while(len--) - { - if( !LLStringOps::isAlnum((char)str[len]) ) - { - rv = FALSE; - break; - } - } - return rv; -} - -// static -BOOL LLLineEditor::prevalidateAlphaNumSpace(const LLWString &str) -{ - LLLocale locale(LLLocale::USER_LOCALE); - - BOOL rv = TRUE; - S32 len = str.length(); - if(len == 0) return rv; - while(len--) - { - if(!(LLStringOps::isAlnum((char)str[len]) || (' ' == str[len]))) - { - rv = FALSE; - break; - } - } - return rv; -} - -// Used for most names of things stored on the server, due to old file-formats -// that used the pipe (|) for multiline text storage. Examples include -// inventory item names, parcel names, object names, etc. -// static -BOOL LLLineEditor::prevalidateASCIIPrintableNoPipe(const LLWString &str) -{ - BOOL rv = TRUE; - S32 len = str.length(); - if(len == 0) return rv; - while(len--) - { - llwchar wc = str[len]; - if (wc < 0x20 - || wc > 0x7f - || wc == '|') - { - rv = FALSE; - break; - } - if(!(wc == ' ' - || LLStringOps::isAlnum((char)wc) - || LLStringOps::isPunct((char)wc) ) ) - { - rv = FALSE; - break; - } - } - return rv; -} - - -// Used for avatar names -// static -BOOL LLLineEditor::prevalidateASCIIPrintableNoSpace(const LLWString &str) -{ - BOOL rv = TRUE; - S32 len = str.length(); - if(len == 0) return rv; - while(len--) - { - llwchar wc = str[len]; - if (wc < 0x20 - || wc > 0x7f - || LLStringOps::isSpace(wc)) - { - rv = FALSE; - break; - } - if( !(LLStringOps::isAlnum((char)str[len]) || - LLStringOps::isPunct((char)str[len]) ) ) - { - rv = FALSE; - break; - } - } - return rv; -} - - -// static -BOOL LLLineEditor::prevalidateASCII(const LLWString &str) -{ - BOOL rv = TRUE; - S32 len = str.length(); - while(len--) - { - if (str[len] < 0x20 || str[len] > 0x7f) - { - rv = FALSE; - break; - } - } - return rv; -} - void LLLineEditor::onMouseCaptureLost() { endSelection(); diff --git a/indra/llui/lllineeditor.h b/indra/llui/lllineeditor.h index a06a317f76..9489e723e3 100644 --- a/indra/llui/lllineeditor.h +++ b/indra/llui/lllineeditor.h @@ -51,27 +51,18 @@ #include "llviewborder.h" #include "llpreeditor.h" -#include <boost/function.hpp> +#include "lltextvalidate.h" class LLFontGL; class LLLineEditorRollback; class LLButton; class LLContextMenu; -typedef boost::function<BOOL (const LLWString &wstr)> LLLinePrevalidateFunc; - class LLLineEditor : public LLUICtrl, public LLEditMenuHandler, protected LLPreeditor { public: - struct PrevalidateNamedFuncs - : public LLInitParam::TypeValuesHelper<LLLinePrevalidateFunc, PrevalidateNamedFuncs> - - { - static void declareValues(); - }; - typedef boost::function<void (LLLineEditor* caller)> keystroke_callback_t; struct Params : public LLInitParam::Block<Params, LLUICtrl::Params> @@ -81,7 +72,7 @@ public: Optional<keystroke_callback_t> keystroke_callback; - Optional<LLLinePrevalidateFunc, PrevalidateNamedFuncs> prevalidate_callback; + Optional<LLTextValidate::validate_func_t, LLTextValidate::ValidateTextNamedFuncs> prevalidate_callback; Optional<LLViewBorder::Params> border; @@ -90,7 +81,6 @@ public: background_image_focused; Optional<bool> select_on_focus, - handle_edit_keys_directly, revert_on_esc, commit_on_focus_lost, ignore_tab; @@ -207,6 +197,8 @@ public: const LLColor4& getReadOnlyFgColor() const { return mReadOnlyFgColor.get(); } const LLColor4& getTentativeFgColor() const { return mTentativeFgColor.get(); } + const LLFontGL* getFont() const { return mGLFont; } + void setIgnoreArrowKeys(BOOL b) { mIgnoreArrowKeys = b; } void setIgnoreTab(BOOL b) { mIgnoreTab = b; } void setPassDelete(BOOL b) { mPassDelete = b; } @@ -222,7 +214,6 @@ public: void extendSelection(S32 new_cursor_pos); void deleteSelection(); - void setHandleEditKeysDirectly( BOOL b ) { mHandleEditKeysDirectly = b; } void setSelectAllonFocusReceived(BOOL b); typedef boost::function<void (LLLineEditor* caller, void* user_data)> callback_t; @@ -234,17 +225,7 @@ public: void setTextPadding(S32 left, S32 right); // Prevalidation controls which keystrokes can affect the editor - void setPrevalidate( LLLinePrevalidateFunc func ); - static BOOL prevalidateFloat(const LLWString &str ); - static BOOL prevalidateInt(const LLWString &str ); - static BOOL prevalidatePositiveS32(const LLWString &str); - static BOOL prevalidateNonNegativeS32(const LLWString &str); - static BOOL prevalidateAlphaNum(const LLWString &str ); - static BOOL prevalidateAlphaNumSpace(const LLWString &str ); - static BOOL prevalidateASCIIPrintableNoPipe(const LLWString &str); - static BOOL prevalidateASCIIPrintableNoSpace(const LLWString &str); - static BOOL prevalidateASCII(const LLWString &str); - + void setPrevalidate( LLTextValidate::validate_func_t func ); static BOOL postvalidateFloat(const std::string &str); // line history support: @@ -264,7 +245,6 @@ private: void addChar(const llwchar c); void setCursorAtLocalPos(S32 local_mouse_x); S32 findPixelNearestPos(S32 cursor_offset = 0) const; - void reportBadKeystroke(); BOOL handleSpecialKey(KEY key, MASK mask); BOOL handleSelectionKey(KEY key, MASK mask); BOOL handleControlKey(KEY key, MASK mask); @@ -324,7 +304,7 @@ protected: S32 mLastSelectionStart; S32 mLastSelectionEnd; - LLLinePrevalidateFunc mPrevalidateFunc; + LLTextValidate::validate_func_t mPrevalidateFunc; LLFrameTimer mKeystrokeTimer; LLTimer mTripleClickTimer; @@ -342,7 +322,6 @@ protected: BOOL mIgnoreTab; BOOL mDrawAsterixes; - BOOL mHandleEditKeysDirectly; // If true, the standard edit keys (Ctrl-X, Delete, etc,) are handled here instead of routed by the menu system BOOL mSelectAllonFocusReceived; BOOL mPassDelete; diff --git a/indra/llui/llloadingindicator.cpp b/indra/llui/llloadingindicator.cpp new file mode 100644 index 0000000000..f8b029e19c --- /dev/null +++ b/indra/llui/llloadingindicator.cpp @@ -0,0 +1,133 @@ +/** + * @file llloadingindicator.cpp + * @brief Perpetual loading indicator + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "linden_common.h" + +#include "llloadingindicator.h" + +// Linden library includes +#include "llsingleton.h" + +// Project includes +#include "lluictrlfactory.h" +#include "lluiimage.h" + +static LLDefaultChildRegistry::Register<LLLoadingIndicator> r("loading_indicator"); + +/////////////////////////////////////////////////////////////////////////////// +// LLLoadingIndicator::Data class +/////////////////////////////////////////////////////////////////////////////// + +/** + * Pre-loaded images shared by all instances of the widget + */ +class LLLoadingIndicator::Data: public LLSingleton<LLLoadingIndicator::Data> +{ +public: + /*virtual*/ void initSingleton(); // from LLSingleton + + LLPointer<LLUIImage> getNextImage(S8& idx) const; + U8 getImagesCount() const { return NIMAGES; } +private: + + static const U8 NIMAGES = 12; + LLPointer<LLUIImage> mImages[NIMAGES]; +}; + +// virtual +// Called right after the instance gets constructed. +void LLLoadingIndicator::Data::initSingleton() +{ + // Load images. + for (U8 i = 0; i < NIMAGES; ++i) + { + std::string img_name = llformat("Progress_%d", i+1); + mImages[i] = LLUI::getUIImage(img_name, 0); + llassert(mImages[i]); + } +} + +LLPointer<LLUIImage> LLLoadingIndicator::Data::getNextImage(S8& idx) const +{ + // Calculate next index, performing array bounds checking. + idx = (idx >= NIMAGES || idx < 0) ? 0 : (idx + 1) % NIMAGES; + return mImages[idx]; +} + +/////////////////////////////////////////////////////////////////////////////// +// LLLoadingIndicator class +/////////////////////////////////////////////////////////////////////////////// + +LLLoadingIndicator::LLLoadingIndicator(const Params& p) +: LLUICtrl(p) + , mRotationsPerSec(p.rotations_per_sec > 0 ? p.rotations_per_sec : 1.0f) + , mCurImageIdx(-1) +{ + // Select initial image. + mCurImagep = Data::instance().getNextImage(mCurImageIdx); + + // Start timer for switching images. + start(); +} + +void LLLoadingIndicator::draw() +{ + // Time to switch to the next image? + if (mImageSwitchTimer.getStarted() && mImageSwitchTimer.hasExpired()) + { + // Switch to the next image. + mCurImagep = Data::instance().getNextImage(mCurImageIdx); + + // Restart timer. + start(); + } + + // Draw current image. + if( mCurImagep.notNull() ) + { + mCurImagep->draw(getLocalRect(), LLColor4::white % getDrawContext().mAlpha); + } + + LLUICtrl::draw(); +} + +void LLLoadingIndicator::stop() +{ + mImageSwitchTimer.stop(); +} + +void LLLoadingIndicator::start() +{ + mImageSwitchTimer.start(); + F32 period = 1.0f / (Data::instance().getImagesCount() * mRotationsPerSec); + mImageSwitchTimer.setTimerExpirySec(period); +} diff --git a/indra/llui/llloadingindicator.h b/indra/llui/llloadingindicator.h new file mode 100644 index 0000000000..32dd1fead8 --- /dev/null +++ b/indra/llui/llloadingindicator.h @@ -0,0 +1,93 @@ +/** + * @file llloadingindicator.h + * @brief Perpetual loading indicator + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLLOADINGINDICATOR_H +#define LL_LLLOADINGINDICATOR_H + +#include "lluictrl.h" + +/////////////////////////////////////////////////////////////////////////////// +// class LLLoadingIndicator +/////////////////////////////////////////////////////////////////////////////// + +/** + * Perpetual loading indicator (a la MacOSX or YouTube) + * + * Number of rotations per second can be overriden + * with the "roations_per_sec" parameter. + * + * Can start/stop spinning. + * + * @see start() + * @see stop() + */ +class LLLoadingIndicator +: public LLUICtrl +{ + LOG_CLASS(LLLoadingIndicator); +public: + struct Params : public LLInitParam::Block<Params, LLUICtrl::Params> + { + Optional<F32> rotations_per_sec; + Params() + : rotations_per_sec("rotations_per_sec", 1.0f) + {} + }; + + virtual ~LLLoadingIndicator() {} + + // llview overrides + virtual void draw(); + + /** + * Stop spinning. + */ + void stop(); + + /** + * Start spinning. + */ + void start(); + +private: + LLLoadingIndicator(const Params&); + friend class LLUICtrlFactory; + + class Data; + + F32 mRotationsPerSec; + S8 mCurImageIdx; + LLPointer<LLUIImage> mCurImagep; + LLFrameTimer mImageSwitchTimer; +}; + +#endif // LL_LLLOADINGINDICATOR_H diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp index 7fa9a88059..b77126996e 100644 --- a/indra/llui/llmenugl.cpp +++ b/indra/llui/llmenugl.cpp @@ -657,11 +657,38 @@ LLMenuItemVerticalSeparatorGL::LLMenuItemVerticalSeparatorGL( void ) // Class LLMenuItemTearOffGL //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ LLMenuItemTearOffGL::LLMenuItemTearOffGL(const LLMenuItemTearOffGL::Params& p) -: LLMenuItemGL(p), - mParentHandle(p.parent_floater_handle) +: LLMenuItemGL(p) { } +// Returns the first floater ancestor if there is one +LLFloater* LLMenuItemTearOffGL::getParentFloater() +{ + LLView* parent_view = getMenu(); + + while (parent_view) + { + if (dynamic_cast<LLFloater*>(parent_view)) + { + return dynamic_cast<LLFloater*>(parent_view); + } + + bool parent_is_menu = dynamic_cast<LLMenuGL*>(parent_view) && !dynamic_cast<LLMenuBarGL*>(parent_view); + + if (parent_is_menu) + { + // use menu parent + parent_view = dynamic_cast<LLMenuGL*>(parent_view)->getParentMenuItem(); + } + else + { + // just use regular view parent + parent_view = parent_view->getParent(); + } + } + + return NULL; +} void LLMenuItemTearOffGL::onCommit() { @@ -680,7 +707,7 @@ void LLMenuItemTearOffGL::onCommit() getMenu()->needsArrange(); - LLFloater* parent_floater = mParentHandle.get(); + LLFloater* parent_floater = getParentFloater(); LLFloater* tear_off_menu = LLTearOffMenu::create(getMenu()); if (tear_off_menu) @@ -1671,7 +1698,6 @@ LLMenuGL::LLMenuGL(const LLMenuGL::Params& p) mSpilloverMenu(NULL), mJumpKey(p.jump_key), mCreateJumpKeys(p.create_jump_keys), - mParentFloaterHandle(p.parent_floater), mNeedsArrange(FALSE), mShortcutPad(p.shortcut_pad) { @@ -1699,7 +1725,7 @@ LLMenuGL::LLMenuGL(const LLMenuGL::Params& p) void LLMenuGL::initFromParams(const LLMenuGL::Params& p) { LLUICtrl::initFromParams(p); - setCanTearOff(p.can_tear_off, p.parent_floater); + setCanTearOff(p.can_tear_off); } // Destroys the object @@ -1711,12 +1737,11 @@ LLMenuGL::~LLMenuGL( void ) mJumpKeys.clear(); } -void LLMenuGL::setCanTearOff(BOOL tear_off, LLHandle<LLFloater> parent_floater_handle ) +void LLMenuGL::setCanTearOff(BOOL tear_off) { if (tear_off && mTearOffItem == NULL) { LLMenuItemTearOffGL::Params p; - p.parent_floater_handle = parent_floater_handle; mTearOffItem = LLUICtrlFactory::create<LLMenuItemTearOffGL>(p); addChildInBack(mTearOffItem); } @@ -2233,7 +2258,6 @@ void LLMenuGL::createSpilloverBranch() LLMenuGL::Params p; p.name("More"); p.label("More"); // *TODO: Translate - p.parent_floater(mParentFloaterHandle); p.bg_color(mBackgroundColor); p.bg_visible(true); p.can_tear_off(false); @@ -3321,7 +3345,7 @@ void LLMenuHolderGL::draw() LLView::draw(); // now draw last selected item as overlay LLMenuItemGL* selecteditem = (LLMenuItemGL*)sItemLastSelectedHandle.get(); - if (selecteditem && sItemActivationTimer.getStarted() && sItemActivationTimer.getElapsedTimeF32() < ACTIVATE_HIGHLIGHT_TIME) + if (selecteditem && selecteditem->getVisible() && sItemActivationTimer.getStarted() && sItemActivationTimer.getElapsedTimeF32() < ACTIVATE_HIGHLIGHT_TIME) { // make sure toggle items, for example, show the proper state when fading out selecteditem->buildDrawLabel(); @@ -3396,6 +3420,12 @@ BOOL LLMenuHolderGL::handleKey(KEY key, MASK mask, BOOL called_from_parent) if (pMenu) { + //eat TAB key - EXT-7000 + if (key == KEY_TAB && mask == MASK_NONE) + { + return TRUE; + } + //handle ESCAPE and RETURN key handled = LLPanel::handleKey(key, mask, called_from_parent); if (!handled) @@ -3431,7 +3461,7 @@ LLView* const LLMenuHolderGL::getVisibleMenu() const for ( child_list_const_iter_t child_it = getChildList()->begin(); child_it != getChildList()->end(); ++child_it) { LLView* viewp = *child_it; - if (viewp->getVisible() && dynamic_cast<LLMenuBarGL*>(viewp) == NULL) + if (viewp->getVisible() && dynamic_cast<LLMenuGL*>(viewp) != NULL) { return viewp; } @@ -3454,8 +3484,7 @@ BOOL LLMenuHolderGL::hideMenus() for ( child_list_const_iter_t child_it = getChildList()->begin(); child_it != getChildList()->end(); ++child_it) { LLView* viewp = *child_it; - // clicks off of menu do not hide menu bar - if (dynamic_cast<LLMenuBarGL*>(viewp) == NULL && viewp->getVisible()) + if (dynamic_cast<LLMenuGL*>(viewp) != NULL && viewp->getVisible()) { viewp->setVisible(FALSE); } @@ -3703,10 +3732,14 @@ void LLContextMenuBranch::buildDrawLabel( void ) void LLContextMenuBranch::showSubMenu() { - S32 center_x; - S32 center_y; - localPointToScreen(getRect().getWidth(), getRect().getHeight() , ¢er_x, ¢er_y); - mBranch->show( center_x, center_y); + LLMenuItemGL* menu_item = mBranch->getParentMenuItem(); + if (menu_item != NULL && menu_item->getVisible()) + { + S32 center_x; + S32 center_y; + localPointToScreen(getRect().getWidth(), getRect().getHeight() , ¢er_x, ¢er_y); + mBranch->show(center_x, center_y); + } } // onCommit() - do the primary funcationality of the menu item. @@ -3941,7 +3974,6 @@ BOOL LLContextMenu::appendContextSubMenu(LLContextMenu *menu) item = LLUICtrlFactory::create<LLContextMenuBranch>(p); LLMenuGL::sMenuContainer->addChild(item->getBranch()); - item->setFont( LLFontGL::getFontSansSerif() ); return append( item ); } diff --git a/indra/llui/llmenugl.h b/indra/llui/llmenugl.h index 8441aaadd4..6f0f83d4b9 100644 --- a/indra/llui/llmenugl.h +++ b/indra/llui/llmenugl.h @@ -295,7 +295,7 @@ private: // class, by allowing another method to be specified which determines // if the menu item should consider itself checked as true or not. Be // careful that the provided callback is fast - it needs to be VERY -// FUCKING EFFICIENT, because it may need to be checked a lot. +// EFFICIENT because it may need to be checked a lot. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ class LLMenuItemCheckGL @@ -355,7 +355,6 @@ class LLMenuGL public: struct Params : public LLInitParam::Block<Params, LLUICtrl::Params> { - Optional<LLHandle<LLFloater> > parent_floater; Optional<KEY> jump_key; Optional<bool> horizontal_layout, can_tear_off, @@ -430,7 +429,7 @@ public: void setBackgroundColor( const LLUIColor& color ) { mBackgroundColor = color; } const LLUIColor& getBackgroundColor() const { return mBackgroundColor; } void setBackgroundVisible( BOOL b ) { mBgVisible = b; } - void setCanTearOff(BOOL tear_off, LLHandle<LLFloater> parent_floater_handle = LLHandle<LLFloater>()); + void setCanTearOff(BOOL tear_off); // add a separator to this menu virtual BOOL addSeparator(); @@ -553,7 +552,6 @@ private: class LLMenuItemTearOffGL* mTearOffItem; class LLMenuItemBranchGL* mSpilloverBranch; LLMenuGL* mSpilloverMenu; - LLHandle<LLFloater> mParentFloaterHandle; KEY mJumpKey; BOOL mCreateJumpKeys; S32 mShortcutPad; @@ -814,7 +812,6 @@ class LLMenuItemTearOffGL : public LLMenuItemGL public: struct Params : public LLInitParam::Block<Params, LLMenuItemGL::Params> { - Optional<LLHandle<LLFloater> > parent_floater_handle; Params() { name = "tear off"; @@ -823,13 +820,12 @@ public: }; LLMenuItemTearOffGL( const Params& ); - + virtual void onCommit(void); virtual void draw(void); virtual U32 getNominalHeight() const; -private: - LLHandle<LLFloater> mParentHandle; + LLFloater* getParentFloater(); }; diff --git a/indra/llui/llmodaldialog.cpp b/indra/llui/llmodaldialog.cpp index 387af05935..6cff68c20b 100644 --- a/indra/llui/llmodaldialog.cpp +++ b/indra/llui/llmodaldialog.cpp @@ -111,7 +111,7 @@ void LLModalDialog::onOpen(const LLSD& key) // This is a modal dialog. It sucks up all mouse and keyboard operations. gFocusMgr.setMouseCapture( this ); - gFocusMgr.setTopCtrl( this ); + LLUI::addPopup(this); setFocus(TRUE); sModalStack.push_front( this ); @@ -153,7 +153,7 @@ void LLModalDialog::setVisible( BOOL visible ) gFocusMgr.setMouseCapture( this ); // The dialog view is a root view - gFocusMgr.setTopCtrl( this ); + LLUI::addPopup(this); setFocus( TRUE ); } else @@ -291,7 +291,7 @@ void LLModalDialog::onAppFocusGained() // This is a modal dialog. It sucks up all mouse and keyboard operations. gFocusMgr.setMouseCapture( instance ); instance->setFocus(TRUE); - gFocusMgr.setTopCtrl( instance ); + LLUI::addPopup(instance); instance->centerOnScreen(); } diff --git a/indra/llui/llmultifloater.cpp b/indra/llui/llmultifloater.cpp index 78738c826d..b1dbce0000 100644 --- a/indra/llui/llmultifloater.cpp +++ b/indra/llui/llmultifloater.cpp @@ -92,14 +92,6 @@ void LLMultiFloater::draw() } else { - for (S32 i = 0; i < mTabContainer->getTabCount(); i++) - { - LLFloater* floaterp = (LLFloater*)mTabContainer->getPanelByIndex(i); - if (floaterp->getShortTitle() != mTabContainer->getPanelTitle(i)) - { - mTabContainer->setPanelTitle(i, floaterp->getShortTitle()); - } - } LLFloater::draw(); } } @@ -246,6 +238,16 @@ void LLMultiFloater::addFloater(LLFloater* floaterp, BOOL select_added_floater, moveResizeHandlesToFront(); } +void LLMultiFloater::updateFloaterTitle(LLFloater* floaterp) +{ + S32 index = mTabContainer->getIndexForPanel(floaterp); + if (index != -1) + { + mTabContainer->setPanelTitle(index, floaterp->getShortTitle()); + } +} + + /** BOOL selectFloater(LLFloater* floaterp) @@ -353,13 +355,20 @@ void LLMultiFloater::setVisible(BOOL visible) BOOL LLMultiFloater::handleKeyHere(KEY key, MASK mask) { - if (key == 'W' && mask == MASK_CONTROL) + if (key == 'W' && mask == (MASK_CONTROL|MASK_SHIFT)) { LLFloater* floater = getActiveFloater(); // is user closeable and is system closeable if (floater && floater->canClose() && floater->isCloseable()) { floater->closeFloater(); + + // EXT-5695 (Tabbed IM window loses focus if close any tabs by Ctrl+W) + // bring back focus on tab container if there are any tab left + if(mTabContainer->getTabCount() > 0) + { + mTabContainer->setFocus(TRUE); + } } return TRUE; } diff --git a/indra/llui/llmultifloater.h b/indra/llui/llmultifloater.h index bbf2c56fe7..24a841f64e 100644 --- a/indra/llui/llmultifloater.h +++ b/indra/llui/llmultifloater.h @@ -80,6 +80,7 @@ public: void onTabSelected(); virtual void updateResizeLimits(); + virtual void updateFloaterTitle(LLFloater* floaterp); protected: struct LLFloaterData diff --git a/indra/llui/llmultisliderctrl.cpp b/indra/llui/llmultisliderctrl.cpp index f4434a0f78..cc26c00a3e 100644 --- a/indra/llui/llmultisliderctrl.cpp +++ b/indra/llui/llmultisliderctrl.cpp @@ -138,7 +138,7 @@ LLMultiSliderCtrl::LLMultiSliderCtrl(const LLMultiSliderCtrl::Params& p) params.font(p.font); params.max_length_bytes(MAX_STRING_LENGTH); params.commit_callback.function(LLMultiSliderCtrl::onEditorCommit); - params.prevalidate_callback(&LLLineEditor::prevalidateFloat); + params.prevalidate_callback(&LLTextValidate::validateFloat); params.follows.flags(FOLLOWS_LEFT | FOLLOWS_BOTTOM); mEditor = LLUICtrlFactory::create<LLLineEditor> (params); mEditor->setFocusReceivedCallback( boost::bind(LLMultiSliderCtrl::onEditorGainFocus, _1, this) ); @@ -330,9 +330,14 @@ void LLMultiSliderCtrl::updateText() // static void LLMultiSliderCtrl::onEditorCommit( LLUICtrl* ctrl, const LLSD& userdata) { - LLMultiSliderCtrl* self = dynamic_cast<LLMultiSliderCtrl*>(ctrl->getParent()); + llassert(ctrl); if (!ctrl) return; + + LLMultiSliderCtrl* self = dynamic_cast<LLMultiSliderCtrl*>(ctrl->getParent()); + llassert(self); + if (!self) // cast failed - wrong type! :O + return; BOOL success = FALSE; F32 val = self->mCurValue; diff --git a/indra/llui/llnotifications.cpp b/indra/llui/llnotifications.cpp index 5816cef6af..7b8f51ae3c 100644 --- a/indra/llui/llnotifications.cpp +++ b/indra/llui/llnotifications.cpp @@ -48,122 +48,38 @@ const std::string NOTIFICATION_PERSIST_VERSION = "0.93"; -// local channel for notification history -class LLNotificationHistoryChannel : public LLNotificationChannel +// Local channel for persistent notifications +// Stores only persistent notifications. +// Class users can use connectChanged() to process persistent notifications +// (see LLNotificationStorage for example). +class LLPersistentNotificationChannel : public LLNotificationChannel { - LOG_CLASS(LLNotificationHistoryChannel); + LOG_CLASS(LLPersistentNotificationChannel); public: - LLNotificationHistoryChannel(const std::string& filename) : - LLNotificationChannel("History", "Visible", &historyFilter, LLNotificationComparators::orderByUUID()), - mFileName(filename) + LLPersistentNotificationChannel() : + LLNotificationChannel("Persistent", "Visible", ¬ificationFilter, LLNotificationComparators::orderByUUID()) { - connectChanged(boost::bind(&LLNotificationHistoryChannel::historyHandler, this, _1)); - loadPersistentNotifications(); } private: - bool historyHandler(const LLSD& payload) - { - // we ignore "load" messages, but rewrite the persistence file on any other - std::string sigtype = payload["sigtype"]; - if (sigtype != "load") - { - savePersistentNotifications(); - } - return false; - } - // The history channel gets all notifications except those that have been cancelled - static bool historyFilter(LLNotificationPtr pNotification) + // The channel gets all persistent notifications except those that have been canceled + static bool notificationFilter(LLNotificationPtr pNotification) { - return !pNotification->isCancelled(); - } - - void savePersistentNotifications() - { - /* NOTE: As of 2009-11-09 the reload of notifications on startup does not - work, and has not worked for months. Skip saving notifications until the - read can be fixed, because this hits the disk once per notification and - causes log spam. James - - llinfos << "Saving open notifications to " << mFileName << llendl; + bool handle_notification = false; - llofstream notify_file(mFileName.c_str()); - if (!notify_file.is_open()) - { - llwarns << "Failed to open " << mFileName << llendl; - return; - } - - LLSD output; - output["version"] = NOTIFICATION_PERSIST_VERSION; - LLSD& data = output["data"]; - - for (LLNotificationSet::iterator it = mItems.begin(); it != mItems.end(); ++it) - { - if (!LLNotifications::instance().templateExists((*it)->getName())) continue; + handle_notification = pNotification->isPersistent() + && !pNotification->isCancelled(); - // only store notifications flagged as persisting - LLNotificationTemplatePtr templatep = LLNotifications::instance().getTemplate((*it)->getName()); - if (!templatep->mPersist) continue; - - data.append((*it)->asLLSD()); - } - - LLPointer<LLSDFormatter> formatter = new LLSDXMLFormatter(); - formatter->format(output, notify_file, LLSDFormatter::OPTIONS_PRETTY); - */ + return handle_notification; } - void loadPersistentNotifications() - { - llinfos << "Loading open notifications from " << mFileName << llendl; - - llifstream notify_file(mFileName.c_str()); - if (!notify_file.is_open()) - { - llwarns << "Failed to open " << mFileName << llendl; - return; - } - - LLSD input; - LLPointer<LLSDParser> parser = new LLSDXMLParser(); - if (parser->parse(notify_file, input, LLSDSerialize::SIZE_UNLIMITED) < 0) - { - llwarns << "Failed to parse open notifications" << llendl; - return; - } - - if (input.isUndefined()) return; - std::string version = input["version"]; - if (version != NOTIFICATION_PERSIST_VERSION) - { - llwarns << "Bad open notifications version: " << version << llendl; - return; - } - LLSD& data = input["data"]; - if (data.isUndefined()) return; - - LLNotifications& instance = LLNotifications::instance(); - for (LLSD::array_const_iterator notification_it = data.beginArray(); - notification_it != data.endArray(); - ++notification_it) - { - instance.add(LLNotificationPtr(new LLNotification(*notification_it))); - } - } - - //virtual void onDelete(LLNotificationPtr pNotification) { - // we want to keep deleted notifications in our log + // we want to keep deleted notifications in our log, otherwise some + // notifications will be lost on exit. mItems.insert(pNotification); - - return; } - -private: - std::string mFileName; }; bool filterIgnoredNotifications(LLNotificationPtr notification) @@ -402,7 +318,9 @@ LLNotification::LLNotification(const LLNotification::Params& p) : mRespondedTo(false), mPriority(p.priority), mCancelled(false), - mIgnored(false) + mIgnored(false), + mResponderObj(NULL), + mIsReusable(false) { if (p.functor.name.isChosen()) { @@ -415,6 +333,15 @@ LLNotification::LLNotification(const LLNotification::Params& p) : mTemporaryResponder = true; } + else if(p.functor.responder.isChosen()) + { + mResponder = p.functor.responder; + } + + if(p.responder.isProvided()) + { + mResponderObj = p.responder; + } mId.generate(); init(p.name, p.form_elements); @@ -425,7 +352,9 @@ LLNotification::LLNotification(const LLSD& sd) : mTemporaryResponder(false), mRespondedTo(false), mCancelled(false), - mIgnored(false) + mIgnored(false), + mResponderObj(NULL), + mIsReusable(false) { mId.generate(); mSubstitutions = sd["substitutions"]; @@ -452,6 +381,13 @@ LLSD LLNotification::asLLSD() output["expiry"] = mExpiresAt; output["priority"] = (S32)mPriority; output["responseFunctor"] = mResponseFunctorName; + output["reusable"] = mIsReusable; + + if(mResponder) + { + output["responder"] = mResponder->asLLSD(); + } + return output; } @@ -479,7 +415,9 @@ void LLNotification::updateFrom(LLNotificationPtr other) mForm = other->mForm; mResponseFunctorName = other->mResponseFunctorName; mRespondedTo = other->mRespondedTo; + mResponse = other->mResponse; mTemporaryResponder = other->mTemporaryResponder; + mIsReusable = other->isReusable(); update(); } @@ -556,14 +494,24 @@ std::string LLNotification::getSelectedOptionName(const LLSD& response) void LLNotification::respond(const LLSD& response) { + // *TODO may remove mRespondedTo and use mResponce.isDefined() in isRespondedTo() mRespondedTo = true; - // look up the functor - LLNotificationFunctorRegistry::ResponseFunctor functor = - LLNotificationFunctorRegistry::instance().getFunctor(mResponseFunctorName); - // and then call it - functor(asLLSD(), response); - - if (mTemporaryResponder) + mResponse = response; + + if(mResponder) + { + mResponder->handleRespond(asLLSD(), response); + } + else + { + // look up the functor + LLNotificationFunctorRegistry::ResponseFunctor functor = + LLNotificationFunctorRegistry::instance().getFunctor(mResponseFunctorName); + // and then call it + functor(asLLSD(), response); + } + + if (mTemporaryResponder && !isReusable()) { LLNotificationFunctorRegistry::instance().unregisterFunctor(mResponseFunctorName); mResponseFunctorName = ""; @@ -597,6 +545,21 @@ void LLNotification::setResponseFunctor(std::string const &responseFunctorName) mTemporaryResponder = false; } +void LLNotification::setResponseFunctor(const LLNotificationFunctorRegistry::ResponseFunctor& cb) +{ + if(mTemporaryResponder) + { + LLNotificationFunctorRegistry::instance().unregisterFunctor(mResponseFunctorName); + } + + LLNotificationFunctorRegistry::instance().registerFunctor(mResponseFunctorName, cb); +} + +void LLNotification::setResponseFunctor(const LLNotificationResponderPtr& responder) +{ + mResponder = responder; +} + bool LLNotification::payloadContainsAll(const std::vector<std::string>& required_fields) const { for(std::vector<std::string>::const_iterator required_fields_it = required_fields.begin(); @@ -856,8 +819,12 @@ bool LLNotificationChannelBase::updateItem(const LLSD& payload, LLNotificationPt if (wasFound) { abortProcessing = mChanged(payload); - mItems.erase(pNotification); - onDelete(pNotification); + // do not delete the notification to make LLChatHistory::appendMessage add notification panel to IM window + if( ! pNotification->isReusable() ) + { + mItems.erase(pNotification); + onDelete(pNotification); + } } } return abortProcessing; @@ -1088,12 +1055,9 @@ void LLNotifications::createDefaultChannels() LLNotificationChannel::buildChannel("Visible", "Ignore", &LLNotificationFilters::includeEverything); - // create special history channel - //std::string notifications_log_file = gDirUtilp->getExpandedFilename ( LL_PATH_PER_SL_ACCOUNT, "open_notifications.xml" ); - // use ^^^ when done debugging notifications serialization - std::string notifications_log_file = gDirUtilp->getExpandedFilename ( LL_PATH_USER_SETTINGS, "open_notifications.xml" ); + // create special persistent notification channel // this isn't a leak, don't worry about the empty "new" - new LLNotificationHistoryChannel(notifications_log_file); + new LLPersistentNotificationChannel(); // connect action methods to these channels LLNotifications::instance().getChannel("Expiration")-> @@ -1524,3 +1488,11 @@ std::ostream& operator<<(std::ostream& s, const LLNotification& notification) return s; } +void LLPostponedNotification::onCachedNameReceived(const LLUUID& id, const std::string& first, + const std::string& last, bool is_group) +{ + gCacheName->getFullName(id, mName); + modifyNotificationParams(); + LLNotifications::instance().add(mParams); + cleanup(); +} diff --git a/indra/llui/llnotifications.h b/indra/llui/llnotifications.h index 8d993b71d7..c942a32512 100644 --- a/indra/llui/llnotifications.h +++ b/indra/llui/llnotifications.h @@ -104,6 +104,7 @@ #include "llinitparam.h" #include "llnotificationslistener.h" #include "llnotificationptr.h" +#include "llcachename.h" typedef enum e_notification_priority @@ -115,8 +116,23 @@ typedef enum e_notification_priority NOTIFICATION_PRIORITY_CRITICAL } ENotificationPriority; +class LLNotificationResponderInterface +{ +public: + LLNotificationResponderInterface(){}; + virtual ~LLNotificationResponderInterface(){}; + + virtual void handleRespond(const LLSD& notification, const LLSD& response) = 0; + + virtual LLSD asLLSD() = 0; + + virtual void fromLLSD(const LLSD& params) = 0; +}; + typedef boost::function<void (const LLSD&, const LLSD&)> LLNotificationResponder; +typedef boost::shared_ptr<LLNotificationResponderInterface> LLNotificationResponderPtr; + typedef LLFunctorRegistry<LLNotificationResponder> LLNotificationFunctorRegistry; typedef LLFunctorRegistration<LLNotificationResponder> LLNotificationFunctorRegistration; @@ -296,15 +312,18 @@ public: Optional<LLSD> form_elements; Optional<LLDate> time_stamp; Optional<LLNotificationContext*> context; + Optional<void*> responder; struct Functor : public LLInitParam::Choice<Functor> { Alternative<std::string> name; Alternative<LLNotificationFunctorRegistry::ResponseFunctor> function; + Alternative<LLNotificationResponderPtr> responder; Functor() : name("functor_name"), - function("functor") + function("functor"), + responder("responder") {} }; Optional<Functor> functor; @@ -317,6 +336,7 @@ public: form_elements("form_elements") { time_stamp = LLDate::now(); + responder = NULL; } Params(const std::string& _name) @@ -329,6 +349,7 @@ public: functor.name = _name; name = _name; time_stamp = LLDate::now(); + responder = NULL; } }; @@ -341,13 +362,17 @@ private: LLDate mExpiresAt; bool mCancelled; bool mRespondedTo; // once the notification has been responded to, this becomes true + LLSD mResponse; bool mIgnored; ENotificationPriority mPriority; LLNotificationFormPtr mForm; - + void* mResponderObj; // TODO - refactor/remove this field + bool mIsReusable; + LLNotificationResponderPtr mResponder; + // a reference to the template LLNotificationTemplatePtr mTemplatep; - + /* We want to be able to store and reload notifications so that they can survive a shutdown/restart of the client. So we can't simply pass in callbacks; @@ -384,6 +409,10 @@ public: void setResponseFunctor(std::string const &responseFunctorName); + void setResponseFunctor(const LLNotificationFunctorRegistry::ResponseFunctor& cb); + + void setResponseFunctor(const LLNotificationResponderPtr& responder); + typedef enum e_response_template_type { WITHOUT_DEFAULT_BUTTON, @@ -423,6 +452,10 @@ public: void respond(const LLSD& sd); + void* getResponder() { return mResponderObj; } + + void setResponder(void* responder) { mResponderObj = responder; } + void setIgnored(bool ignore); bool isCancelled() const @@ -435,6 +468,8 @@ public: return mRespondedTo; } + const LLSD& getResponse() { return mResponse; } + bool isIgnored() const { return mIgnored; @@ -444,7 +479,12 @@ public: { return mTemplatep->mName; } - + + bool isPersistent() const + { + return mTemplatep->mPersist; + } + const LLUUID& id() const { return mId; @@ -504,6 +544,10 @@ public: { return mId; } + + bool isReusable() { return mIsReusable; } + + void setReusable(bool reusable) { mIsReusable = reusable; } // comparing two notifications normally means comparing them by UUID (so we can look them // up quickly this way) @@ -931,6 +975,62 @@ private: boost::scoped_ptr<LLNotificationsListener> mListener; }; +/** + * Abstract class for postponed notifications. + * Provides possibility to add notification after specified by id avatar or group will be + * received from cache name. The object of this type automatically well be deleted + * by cleanup method after respond will be received from cache name. + * + * To add custom postponed notification to the notification system client should: + * 1 create class derived from LLPostponedNotification; + * 2 call LLPostponedNotification::add method; + */ +class LLPostponedNotification +{ +public: + /** + * Performs hooking cache name callback which will add notification to notifications system. + * Type of added notification should be specified by template parameter T + * and non-private derived from LLPostponedNotification class, + * otherwise compilation error will occur. + */ + template<class T> + static void add(const LLNotification::Params& params, + const LLUUID& id, bool is_group) + { + // upcast T to the base type to restrict T derivation from LLPostponedNotification + LLPostponedNotification* thiz = new T(); + + thiz->mParams = params; + + gCacheName->get(id, is_group, boost::bind( + &LLPostponedNotification::onCachedNameReceived, thiz, _1, _2, + _3, _4)); + } + +private: + void onCachedNameReceived(const LLUUID& id, const std::string& first, + const std::string& last, bool is_group); + + void cleanup() + { + delete this; + } + +protected: + LLPostponedNotification() {} + virtual ~LLPostponedNotification() {} + + /** + * Abstract method provides possibility to modify notification parameters and + * will be called after cache name retrieve information about avatar or group + * and before notification will be added to the notification system. + */ + virtual void modifyNotificationParams() = 0; + + LLNotification::Params mParams; + std::string mName; +}; #endif//LL_LLNOTIFICATIONS_H diff --git a/indra/llui/llpanel.cpp b/indra/llui/llpanel.cpp index 7f23fe2671..0cd052eefa 100644 --- a/indra/llui/llpanel.cpp +++ b/indra/llui/llpanel.cpp @@ -80,6 +80,8 @@ LLPanel::Params::Params() background_opaque("background_opaque", false), bg_opaque_color("bg_opaque_color"), bg_alpha_color("bg_alpha_color"), + bg_opaque_image_overlay("bg_opaque_image_overlay"), + bg_alpha_image_overlay("bg_alpha_image_overlay"), bg_opaque_image("bg_opaque_image"), bg_alpha_image("bg_alpha_image"), min_width("min_width", 100), @@ -103,6 +105,8 @@ LLPanel::LLPanel(const LLPanel::Params& p) mBgOpaque(p.background_opaque), mBgOpaqueColor(p.bg_opaque_color()), mBgAlphaColor(p.bg_alpha_color()), + mBgOpaqueImageOverlay(p.bg_opaque_image_overlay), + mBgAlphaImageOverlay(p.bg_alpha_image_overlay), mBgOpaqueImage(p.bg_opaque_image()), mBgAlphaImage(p.bg_alpha_image()), mDefaultBtn(NULL), @@ -199,7 +203,7 @@ void LLPanel::draw() // opaque, in-front look if (mBgOpaqueImage.notNull()) { - mBgOpaqueImage->draw( local_rect, UI_VERTEX_COLOR % alpha ); + mBgOpaqueImage->draw( local_rect, mBgOpaqueImageOverlay % alpha ); } else { @@ -212,7 +216,7 @@ void LLPanel::draw() // transparent, in-back look if (mBgAlphaImage.notNull()) { - mBgAlphaImage->draw( local_rect, UI_VERTEX_COLOR % alpha ); + mBgAlphaImage->draw( local_rect, mBgAlphaImageOverlay % alpha ); } else { @@ -397,6 +401,12 @@ LLView* LLPanel::fromXML(LLXMLNodePtr node, LLView* parent, LLXMLNodePtr output_ if (!panelp) { panelp = LLUICtrlFactory::getInstance()->createFactoryPanel(name); + llassert(panelp); + + if (!panelp) + { + return NULL; // :( + } } } @@ -414,7 +424,7 @@ LLView* LLPanel::fromXML(LLXMLNodePtr node, LLView* parent, LLXMLNodePtr output_ panelp->mCommitCallbackRegistrar.popScope(); panelp->mEnableCallbackRegistrar.popScope(); - if (panelp && !panelp->getFactoryMap().empty()) + if (!panelp->getFactoryMap().empty()) { LLUICtrlFactory::instance().popFactoryFunctions(); } @@ -475,6 +485,8 @@ void LLPanel::initFromParams(const LLPanel::Params& p) setTransparentColor(p.bg_alpha_color().get()); mBgOpaqueImage = p.bg_opaque_image(); mBgAlphaImage = p.bg_alpha_image(); + mBgOpaqueImageOverlay = p.bg_opaque_image_overlay; + mBgAlphaImageOverlay = p.bg_alpha_image_overlay; } static LLFastTimer::DeclareTimer FTM_PANEL_SETUP("Panel Setup"); @@ -936,7 +948,7 @@ LLPanel *LLPanel::childGetVisiblePanelWithHelp() return ::childGetVisiblePanelWithHelp(this); } -void LLPanel::childSetPrevalidate(const std::string& id, BOOL (*func)(const LLWString &) ) +void LLPanel::childSetPrevalidate(const std::string& id, bool (*func)(const LLWString &) ) { LLLineEditor* child = findChild<LLLineEditor>(id); if (child) diff --git a/indra/llui/llpanel.h b/indra/llui/llpanel.h index 6de83fe3a7..03e3dc0c0e 100644 --- a/indra/llui/llpanel.h +++ b/indra/llui/llpanel.h @@ -77,7 +77,9 @@ public: background_opaque; Optional<LLUIColor> bg_opaque_color, - bg_alpha_color; + bg_alpha_color, + bg_opaque_image_overlay, + bg_alpha_image_overlay; // opaque image is for "panel in foreground" look Optional<LLUIImage*> bg_opaque_image, bg_alpha_image; @@ -137,6 +139,8 @@ public: const LLColor4& getTransparentColor() const { return mBgAlphaColor; } LLPointer<LLUIImage> getBackgroundImage() const { return mBgOpaqueImage; } LLPointer<LLUIImage> getTransparentImage() const { return mBgAlphaImage; } + LLColor4 getBackgroundImageOverlay() { return mBgOpaqueImageOverlay; } + LLColor4 getTransparentImageOverlay() { return mBgAlphaImageOverlay; } void setBackgroundVisible( BOOL b ) { mBgVisible = b; } BOOL isBackgroundVisible() const { return mBgVisible; } void setBackgroundOpaque(BOOL b) { mBgOpaque = b; } @@ -226,7 +230,7 @@ public: std::string childGetText(const std::string& id) const { return childGetValue(id).asString(); } // LLLineEditor - void childSetPrevalidate(const std::string& id, BOOL (*func)(const LLWString &) ); + void childSetPrevalidate(const std::string& id, bool (*func)(const LLWString &) ); // LLButton void childSetAction(const std::string& id, boost::function<void(void*)> function, void* value = NULL); @@ -262,6 +266,8 @@ private: BOOL mBgOpaque; // use opaque color or image LLUIColor mBgOpaqueColor; LLUIColor mBgAlphaColor; + LLUIColor mBgOpaqueImageOverlay; + LLUIColor mBgAlphaImageOverlay; LLPointer<LLUIImage> mBgOpaqueImage; // "panel in front" look LLPointer<LLUIImage> mBgAlphaImage; // "panel in back" look LLViewBorder* mBorder; diff --git a/indra/llui/llradiogroup.cpp b/indra/llui/llradiogroup.cpp index 4087b484aa..e27792dc1d 100644 --- a/indra/llui/llradiogroup.cpp +++ b/indra/llui/llradiogroup.cpp @@ -106,7 +106,6 @@ LLRadioGroup::LLRadioGroup(const LLRadioGroup::Params& p) void LLRadioGroup::initFromParams(const Params& p) { - LLUICtrl::initFromParams(p); for (LLInitParam::ParamIterator<ItemParams>::const_iterator it = p.items().begin(); it != p.items().end(); ++it) @@ -124,6 +123,9 @@ void LLRadioGroup::initFromParams(const Params& p) LLRadioCtrl* item = LLUICtrlFactory::create<LLRadioCtrl>(item_params, this); mRadioButtons.push_back(item); } + + // call this *after* setting up mRadioButtons so we can handle setValue() calls + LLUICtrl::initFromParams(p); } @@ -138,10 +140,6 @@ BOOL LLRadioGroup::postBuild() { mRadioButtons[0]->setTabStop(true); } - if (mControlVariable) - { - setSelectedIndex(mControlVariable->getValue().asInteger()); - } return TRUE; } diff --git a/indra/llui/llresizebar.cpp b/indra/llui/llresizebar.cpp index 0c46edf300..5d26b904b5 100644 --- a/indra/llui/llresizebar.cpp +++ b/indra/llui/llresizebar.cpp @@ -182,6 +182,11 @@ BOOL LLResizeBar::handleHover(S32 x, S32 y, MASK mask) break; } + notifyParent(LLSD().with("action", "resize") + .with("view_name", mResizingView->getName()) + .with("new_height", new_height) + .with("new_width", new_width)); + scaled_rect.mTop = scaled_rect.mBottom + new_height; scaled_rect.mRight = scaled_rect.mLeft + new_width; mResizingView->setRect(scaled_rect); diff --git a/indra/llui/llresizehandle.cpp b/indra/llui/llresizehandle.cpp index 3df09d124a..00214d451c 100644 --- a/indra/llui/llresizehandle.cpp +++ b/indra/llui/llresizehandle.cpp @@ -124,7 +124,7 @@ BOOL LLResizeHandle::handleHover(S32 x, S32 y, MASK mask) { // Make sure the mouse in still over the application. We don't want to make the parent // so big that we can't see the resize handle any more. - + S32 screen_x; S32 screen_y; localPointToScreen(x, y, &screen_x, &screen_y); @@ -136,9 +136,10 @@ BOOL LLResizeHandle::handleHover(S32 x, S32 y, MASK mask) if( resizing_view ) { // undock floater when user resize it - if (((LLFloater*)getParent())->isDocked()) + LLFloater* floater_parent = dynamic_cast<LLFloater*>(getParent()); + if (floater_parent && floater_parent->isDocked()) { - ((LLFloater*)getParent())->setDocked(false, false); + floater_parent->setDocked(false, false); } // Resize the parent @@ -146,61 +147,68 @@ BOOL LLResizeHandle::handleHover(S32 x, S32 y, MASK mask) LLRect scaled_rect = orig_rect; S32 delta_x = screen_x - mDragLastScreenX; S32 delta_y = screen_y - mDragLastScreenY; - - if(delta_x == 0 && delta_y == 0) - return FALSE; - LLCoordGL mouse_dir; // use hysteresis on mouse motion to preserve user intent when mouse stops moving mouse_dir.mX = (screen_x == mLastMouseScreenX) ? mLastMouseDir.mX : screen_x - mLastMouseScreenX; mouse_dir.mY = (screen_y == mLastMouseScreenY) ? mLastMouseDir.mY : screen_y - mLastMouseScreenY; - mLastMouseScreenX = screen_x; mLastMouseScreenY = screen_y; mLastMouseDir = mouse_dir; - S32 new_width = orig_rect.getWidth(); - S32 new_height = orig_rect.getHeight(); + S32 x_multiple = 1; + S32 y_multiple = 1; + switch( mCorner ) + { + case LEFT_TOP: + x_multiple = -1; + y_multiple = 1; + break; + case LEFT_BOTTOM: + x_multiple = -1; + y_multiple = -1; + break; + case RIGHT_TOP: + x_multiple = 1; + y_multiple = 1; + break; + case RIGHT_BOTTOM: + x_multiple = 1; + y_multiple = -1; + break; + } - S32 new_pos_x = orig_rect.mLeft; - S32 new_pos_y = orig_rect.mTop; + S32 new_width = orig_rect.getWidth() + x_multiple * delta_x; + if( new_width < mMinWidth ) + { + new_width = mMinWidth; + delta_x = x_multiple * (mMinWidth - orig_rect.getWidth()); + } + + S32 new_height = orig_rect.getHeight() + y_multiple * delta_y; + if( new_height < mMinHeight ) + { + new_height = mMinHeight; + delta_y = y_multiple * (mMinHeight - orig_rect.getHeight()); + } switch( mCorner ) { - case LEFT_TOP: - new_width-=delta_x; - new_height+=delta_y; - new_pos_x+=delta_x; - new_pos_y+=delta_y; + case LEFT_TOP: + scaled_rect.translate(delta_x, 0); break; case LEFT_BOTTOM: - new_width-=delta_x; - new_height-=delta_y; - new_pos_x+=delta_x; + scaled_rect.translate(delta_x, delta_y); break; case RIGHT_TOP: - new_width+=delta_x; - new_height+=delta_y; - new_pos_y+=delta_y; break; case RIGHT_BOTTOM: - new_width+=delta_x; - new_height-=delta_y; + scaled_rect.translate(0, delta_y); break; } - new_width = llmax(new_width,mMinWidth); - new_height = llmax(new_height,mMinHeight); - - LLRect::tCoordType screen_width = resizing_view->getParent()->getSnapRect().getWidth(); - LLRect::tCoordType screen_height = resizing_view->getParent()->getSnapRect().getHeight(); - - new_width = llmin(new_width, screen_width); - new_height = llmin(new_height, screen_height); - // temporarily set new parent rect - scaled_rect.setLeftTopAndSize(new_pos_x,new_pos_y,new_width,new_height); - + scaled_rect.mRight = scaled_rect.mLeft + new_width; + scaled_rect.mTop = scaled_rect.mBottom + new_height; resizing_view->setRect(scaled_rect); LLView* snap_view = NULL; @@ -251,11 +259,7 @@ BOOL LLResizeHandle::handleHover(S32 x, S32 y, MASK mask) resizing_view->setRect(orig_rect); // translate and scale to new shape - resizing_view->reshape(scaled_rect.getWidth(),scaled_rect.getHeight()); - resizing_view->setRect(scaled_rect); - //set shape to handle dependent floaters... - resizing_view->handleReshape(scaled_rect, false); - + resizing_view->setShape(scaled_rect, true); // update last valid mouse cursor position based on resized view's actual size LLRect new_rect = resizing_view->getRect(); diff --git a/indra/llui/llscrollingpanellist.cpp b/indra/llui/llscrollingpanellist.cpp index 4f55c0507c..b7840d1b59 100644 --- a/indra/llui/llscrollingpanellist.cpp +++ b/indra/llui/llscrollingpanellist.cpp @@ -47,7 +47,12 @@ void LLScrollingPanelList::clearPanels() { deleteAllChildren(); mPanelList.clear(); - reshape( 1, 1, FALSE ); + + LLRect rc = getRect(); + rc.setLeftTopAndSize(rc.mLeft, rc.mTop, 1, 1); + setRect(rc); + + notifySizeChanged(rc.getHeight()); } S32 LLScrollingPanelList::addPanel( LLScrollingPanel* panel ) @@ -67,7 +72,11 @@ S32 LLScrollingPanelList::addPanel( LLScrollingPanel* panel ) max_width = llmax( max_width, childp->getRect().getWidth() ); cur_gap = GAP_BETWEEN_PANELS; } - reshape( max_width, total_height, FALSE ); + LLRect rc = getRect(); + rc.setLeftTopAndSize(rc.mLeft, rc.mTop, max_width, total_height); + setRect(rc); + + notifySizeChanged(rc.getHeight()); // Reposition each of the child views S32 cur_y = total_height; @@ -131,7 +140,11 @@ void LLScrollingPanelList::removePanel( U32 panel_index ) max_width = llmax( max_width, childp->getRect().getWidth() ); cur_gap = GAP_BETWEEN_PANELS; } - reshape( max_width, total_height, FALSE ); + LLRect rc = getRect(); + rc.setLeftTopAndSize(rc.mLeft, rc.mTop, max_width, total_height); + setRect(rc); + + notifySizeChanged(rc.getHeight()); // Reposition each of the child views S32 cur_y = total_height; @@ -200,3 +213,12 @@ void LLScrollingPanelList::draw() LLUICtrl::draw(); } +void LLScrollingPanelList::notifySizeChanged(S32 height) +{ + LLSD info; + info["action"] = "size_changes"; + info["height"] = height; + notifyParent(info); +} + +// EOF diff --git a/indra/llui/llscrollingpanellist.h b/indra/llui/llscrollingpanellist.h index 3abfbcbbe7..5f1996159b 100644 --- a/indra/llui/llscrollingpanellist.h +++ b/indra/llui/llscrollingpanellist.h @@ -61,7 +61,6 @@ public: Params() { name = "scrolling_panel_list"; - follows.flags = FOLLOWS_LEFT | FOLLOWS_BOTTOM; } }; LLScrollingPanelList(const Params& p) @@ -86,6 +85,11 @@ public: private: void updatePanelVisiblilty(); + /** + * Notify parent about size change, makes sense when used inside accordion + */ + void notifySizeChanged(S32 height); + panel_list_t mPanelList; }; diff --git a/indra/llui/llscrolllistcell.cpp b/indra/llui/llscrolllistcell.cpp index 3cc92baa8d..d17be8b94a 100644 --- a/indra/llui/llscrolllistcell.cpp +++ b/indra/llui/llscrolllistcell.cpp @@ -185,6 +185,8 @@ LLScrollListText::LLScrollListText(const LLScrollListCell::Params& p) { sCount++; + mTextWidth = getWidth(); + // initialize rounded rect image if (!mRoundedRectImage) { @@ -340,7 +342,7 @@ void LLScrollListText::draw(const LLColor4& color, const LLColor4& highlight_col 0, LLFontGL::NO_SHADOW, string_chars, - getWidth(), + getTextWidth(), &right_x, TRUE); } diff --git a/indra/llui/llscrolllistcell.h b/indra/llui/llscrolllistcell.h index 5fecf5aade..b1c8901fc4 100644 --- a/indra/llui/llscrolllistcell.h +++ b/indra/llui/llscrolllistcell.h @@ -151,11 +151,16 @@ public: /*virtual*/ const std::string & getToolTip() const; /*virtual*/ BOOL needsToolTip() const; + S32 getTextWidth() const { return mTextWidth;} + void setTextWidth(S32 value) { mTextWidth = value;} + virtual void setWidth(S32 width) { LLScrollListCell::setWidth(width); mTextWidth = width; } + void setText(const LLStringExplicit& text); void setFontStyle(const U8 font_style); private: LLUIString mText; + S32 mTextWidth; const LLFontGL* mFont; LLColor4 mColor; U8 mUseColor; diff --git a/indra/llui/llscrolllistctrl.cpp b/indra/llui/llscrolllistctrl.cpp index 478e270c98..d4d161f2c9 100644 --- a/indra/llui/llscrolllistctrl.cpp +++ b/indra/llui/llscrolllistctrl.cpp @@ -71,8 +71,9 @@ static LLDefaultChildRegistry::Register<LLScrollListCtrl> r("scroll_list"); // local structures & classes. struct SortScrollListItem { - SortScrollListItem(const std::vector<std::pair<S32, BOOL> >& sort_orders) + SortScrollListItem(const std::vector<std::pair<S32, BOOL> >& sort_orders,const LLScrollListCtrl::sort_signal_t* sort_signal) : mSortOrders(sort_orders) + , mSortSignal(sort_signal) {} bool operator()(const LLScrollListItem* i1, const LLScrollListItem* i2) @@ -85,12 +86,20 @@ struct SortScrollListItem S32 col_idx = it->first; BOOL sort_ascending = it->second; + S32 order = sort_ascending ? 1 : -1; // ascending or descending sort for this column? + const LLScrollListCell *cell1 = i1->getColumn(col_idx); const LLScrollListCell *cell2 = i2->getColumn(col_idx); - S32 order = sort_ascending ? 1 : -1; // ascending or descending sort for this column? if (cell1 && cell2) { - sort_result = order * LLStringUtil::compareDict(cell1->getValue().asString(), cell2->getValue().asString()); + if(mSortSignal) + { + sort_result = order * (*mSortSignal)(col_idx,i1, i2); + } + else + { + sort_result = order * LLStringUtil::compareDict(cell1->getValue().asString(), cell2->getValue().asString()); + } if (sort_result != 0) { break; // we have a sort order! @@ -100,8 +109,10 @@ struct SortScrollListItem return sort_result < 0; } + typedef std::vector<std::pair<S32, BOOL> > sort_order_t; + const LLScrollListCtrl::sort_signal_t* mSortSignal; const sort_order_t& mSortOrders; }; @@ -169,6 +180,7 @@ LLScrollListCtrl::LLScrollListCtrl(const LLScrollListCtrl::Params& p) mOnSortChangedCallback( NULL ), mHighlightedItem(-1), mBorder(NULL), + mSortCallback(NULL), mPopupMenu(NULL), mNumDynamicWidthColumns(0), mTotalStaticColumnWidth(0), @@ -270,6 +282,8 @@ LLScrollListCtrl::LLScrollListCtrl(const LLScrollListCtrl::Params& p) text_p.border_visible(false); text_p.rect(mItemListRect); text_p.follows.flags(FOLLOWS_ALL); + // word wrap was added accroding to the EXT-6841 + text_p.wrap(true); addChild(LLUICtrlFactory::create<LLTextBox>(text_p)); } @@ -309,12 +323,9 @@ bool LLScrollListCtrl::preProcessChildNode(LLXMLNodePtr child) LLScrollListCtrl::~LLScrollListCtrl() { - std::for_each(mItemList.begin(), mItemList.end(), DeletePointer()); + delete mSortCallback; - if( gEditMenuHandler == this ) - { - gEditMenuHandler = NULL; - } + std::for_each(mItemList.begin(), mItemList.end(), DeletePointer()); } @@ -540,7 +551,7 @@ BOOL LLScrollListCtrl::addItem( LLScrollListItem* item, EAddPosition pos, BOOL r std::stable_sort( mItemList.begin(), mItemList.end(), - SortScrollListItem(single_sort_column)); + SortScrollListItem(single_sort_column,mSortCallback)); // ADD_SORTED just sorts by first column... // this might not match user sort criteria, so flag list as being in unsorted state @@ -943,14 +954,14 @@ void LLScrollListCtrl::mouseOverHighlightNthItem(S32 target_index) } } -S32 LLScrollListCtrl::selectMultiple( std::vector<LLUUID> ids ) +S32 LLScrollListCtrl::selectMultiple( uuid_vec_t ids ) { item_list::iterator iter; S32 count = 0; for (iter = mItemList.begin(); iter != mItemList.end(); iter++) { LLScrollListItem* item = *iter; - std::vector<LLUUID>::iterator iditr; + uuid_vec_t::iterator iditr; for(iditr = ids.begin(); iditr != ids.end(); ++iditr) { if (item->getEnabled() && (item->getUUID() == (*iditr))) @@ -1388,6 +1399,8 @@ void LLScrollListCtrl::drawItems() LLGLSUIDefault gls_ui; + F32 alpha = getDrawContext().mAlpha; + { LLLocalClipRect clip(mItemListRect); @@ -1463,7 +1476,7 @@ void LLScrollListCtrl::drawItems() bg_color = mBgReadOnlyColor.get(); } - item->draw(item_rect, fg_color, bg_color, highlight_color, mColumnPadding); + item->draw(item_rect, fg_color % alpha, bg_color% alpha, highlight_color % alpha, mColumnPadding); cur_y -= mLineHeight; } @@ -2393,7 +2406,7 @@ void LLScrollListCtrl::updateSort() const std::stable_sort( mItemList.begin(), mItemList.end(), - SortScrollListItem(mSortColumns)); + SortScrollListItem(mSortColumns,mSortCallback)); mSorted = true; } @@ -2409,7 +2422,7 @@ void LLScrollListCtrl::sortOnce(S32 column, BOOL ascending) std::stable_sort( mItemList.begin(), mItemList.end(), - SortScrollListItem(sort_column)); + SortScrollListItem(sort_column,mSortCallback)); } void LLScrollListCtrl::dirtyColumns() @@ -2936,7 +2949,6 @@ BOOL LLScrollListCtrl::operateOnAll(EOperation op) //virtual void LLScrollListCtrl::setFocus(BOOL b) { - mSearchString.clear(); // for tabbing into pristine scroll lists (Finder) if (!getFirstSelected()) { @@ -2981,6 +2993,9 @@ void LLScrollListCtrl::onFocusLost() { gFocusMgr.setMouseCapture(NULL); } + + mSearchString.clear(); + LLUICtrl::onFocusLost(); } diff --git a/indra/llui/llscrolllistctrl.h b/indra/llui/llscrolllistctrl.h index d2d2379328..1f0ef585db 100644 --- a/indra/llui/llscrolllistctrl.h +++ b/indra/llui/llscrolllistctrl.h @@ -73,6 +73,30 @@ public: // *TODO: Add callbacks to Params typedef boost::function<void (void)> callback_t; + + template<typename T> struct maximum + { + typedef T result_type; + + template<typename InputIterator> + T operator()(InputIterator first, InputIterator last) const + { + // If there are no slots to call, just return the + // default-constructed value + if(first == last ) return T(); + T max_value = *first++; + while (first != last) { + if (max_value < *first) + max_value = *first; + ++first; + } + + return max_value; + } + }; + + + typedef boost::signals2::signal<S32 (S32,const LLScrollListItem*,const LLScrollListItem*),maximum<S32> > sort_signal_t; struct Params : public LLInitParam::Block<Params, LLUICtrl::Params> { @@ -195,7 +219,10 @@ public: void deselectAllItems(BOOL no_commit_on_change = FALSE); // by default, go ahead and commit on selection change void clearHighlightedItems(); - void mouseOverHighlightNthItem( S32 index ); + + virtual void mouseOverHighlightNthItem( S32 index ); + + S32 getHighlightedItemInx() const { return mHighlightedItem; } void setDoubleClickCallback( callback_t cb ) { mOnDoubleClickCallback = cb; } void setMaximumSelectCallback( callback_t cb) { mOnMaximumSelectCallback = cb; } @@ -352,7 +379,7 @@ public: BOOL getSortAscending() { return mSortColumns.empty() ? TRUE : mSortColumns.back().second; } BOOL hasSortOrder() const; - S32 selectMultiple( std::vector<LLUUID> ids ); + S32 selectMultiple( uuid_vec_t ids ); // conceptually const, but mutates mItemList void updateSort() const; // sorts a list without affecting the permanent sort order (so further list insertions can be unsorted, for example) @@ -362,6 +389,13 @@ public: void setNeedsSort(bool val = true) { mSorted = !val; } void dirtyColumns(); // some operation has potentially affected column layout or ordering + boost::signals2::connection setSortCallback(sort_signal_t::slot_type cb ) + { + if (!mSortCallback) mSortCallback = new sort_signal_t(); + return mSortCallback->connect(cb); + } + + protected: // "Full" interface: use this when you're creating a list that has one or more of the following: // * contains icons @@ -474,6 +508,8 @@ private: typedef std::pair<S32, BOOL> sort_column_t; std::vector<sort_column_t> mSortColumns; + + sort_signal_t* mSortCallback; }; // end class LLScrollListCtrl #endif // LL_SCROLLLISTCTRL_H diff --git a/indra/llui/llsearcheditor.cpp b/indra/llui/llsearcheditor.cpp index 6fa99df82e..ec2ad5e5fa 100644 --- a/indra/llui/llsearcheditor.cpp +++ b/indra/llui/llsearcheditor.cpp @@ -44,22 +44,34 @@ LLSearchEditor::LLSearchEditor(const LLSearchEditor::Params& p) S32 srch_btn_top = p.search_button.top_pad + p.search_button.rect.height; S32 srch_btn_right = p.search_button.rect.width + p.search_button.left_pad; LLRect srch_btn_rect(p.search_button.left_pad, srch_btn_top, srch_btn_right, p.search_button.top_pad); + + S32 clr_btn_top = p.clear_button.rect.bottom + p.clear_button.rect.height; + S32 clr_btn_right = getRect().getWidth() - p.clear_button.pad_right; + S32 clr_btn_left = clr_btn_right - p.clear_button.rect.width; + LLRect clear_btn_rect(clr_btn_left, clr_btn_top, clr_btn_right, p.clear_button.rect.bottom); + S32 text_pad_left = p.text_pad_left; + S32 text_pad_right = p.text_pad_right; if (p.search_button_visible) text_pad_left += srch_btn_rect.getWidth(); + if (p.clear_button_visible) + text_pad_right = getRect().getWidth() - clr_btn_left + p.clear_button.pad_left; + // Set up line editor. LLLineEditor::Params line_editor_params(p); line_editor_params.name("filter edit box"); line_editor_params.rect(getLocalRect()); line_editor_params.follows.flags(FOLLOWS_ALL); line_editor_params.text_pad_left(text_pad_left); + line_editor_params.text_pad_right(text_pad_right); line_editor_params.revert_on_esc(false); line_editor_params.commit_callback.function(boost::bind(&LLUICtrl::onCommit, this)); line_editor_params.keystroke_callback(boost::bind(&LLSearchEditor::handleKeystroke, this)); mSearchEditor = LLUICtrlFactory::create<LLLineEditor>(line_editor_params); + mSearchEditor->setPassDelete(TRUE); addChild(mSearchEditor); if (p.search_button_visible) @@ -79,8 +91,6 @@ LLSearchEditor::LLSearchEditor(const LLSearchEditor::Params& p) if (p.clear_button_visible) { // Set up clear button. - S32 clr_btn_width = getRect().getHeight(); // button is square, and as tall as search editor - LLRect clear_btn_rect(getRect().getWidth() - clr_btn_width, getRect().getHeight(), getRect().getWidth(), 0); LLButton::Params clr_btn_params(p.clear_button); clr_btn_params.name(std::string("clear button")); clr_btn_params.rect(clear_btn_rect) ; @@ -153,7 +163,7 @@ void LLSearchEditor::setFocus( BOOL b ) void LLSearchEditor::onClearButtonClick(const LLSD& data) { setText(LLStringUtil::null); - mSearchEditor->doDelete(); // force keystroke callback + mSearchEditor->onCommit(); // force keystroke callback } void LLSearchEditor::handleKeystroke() diff --git a/indra/llui/llsearcheditor.h b/indra/llui/llsearcheditor.h index 714aca9337..785d0633dc 100644 --- a/indra/llui/llsearcheditor.h +++ b/indra/llui/llsearcheditor.h @@ -66,6 +66,8 @@ public: } }; + void setCommitOnFocusLost(BOOL b) { if (mSearchEditor) mSearchEditor->setCommitOnFocusLost(b); } + protected: LLSearchEditor(const Params&); friend class LLUICtrlFactory; diff --git a/indra/llui/llsliderctrl.cpp b/indra/llui/llsliderctrl.cpp index 01c274bb4e..04958075db 100644 --- a/indra/llui/llsliderctrl.cpp +++ b/indra/llui/llsliderctrl.cpp @@ -63,7 +63,8 @@ LLSliderCtrl::LLSliderCtrl(const LLSliderCtrl::Params& p) mCanEditText(p.can_edit_text), mPrecision(p.decimal_digits), mTextEnabledColor(p.text_color()), - mTextDisabledColor(p.text_disabled_color()) + mTextDisabledColor(p.text_disabled_color()), + mLabelWidth(p.label_width) { S32 top = getRect().getHeight(); S32 bottom = 0; @@ -86,6 +87,7 @@ LLSliderCtrl::LLSliderCtrl(const LLSliderCtrl::Params& p) params.initial_value(p.label()); mLabelBox = LLUICtrlFactory::create<LLTextBox> (params); addChild(mLabelBox); + mLabelFont = params.font(); } if (p.show_text && !p.text_width.isProvided()) @@ -141,7 +143,7 @@ LLSliderCtrl::LLSliderCtrl(const LLSliderCtrl::Params& p) line_p.rect.setIfNotProvided(text_rect); line_p.font.setIfNotProvided(p.font); line_p.commit_callback.function(&LLSliderCtrl::onEditorCommit); - line_p.prevalidate_callback(&LLLineEditor::prevalidateFloat); + line_p.prevalidate_callback(&LLTextValidate::validateFloat); mEditor = LLUICtrlFactory::create<LLLineEditor>(line_p); mEditor->setFocusReceivedCallback( boost::bind(&LLSliderCtrl::onEditorGainFocus, _1, this )); @@ -186,9 +188,9 @@ BOOL LLSliderCtrl::setLabelArg( const std::string& key, const LLStringExplicit& if (mLabelBox) { res = mLabelBox->setTextArg(key, text); - if (res && mLabelWidth == 0) + if (res && mLabelFont && mLabelWidth == 0) { - S32 label_width = mFont->getWidth(mLabelBox->getText()); + S32 label_width = mLabelFont->getWidth(mLabelBox->getText()); LLRect rect = mLabelBox->getRect(); S32 prev_right = rect.mRight; rect.mRight = rect.mLeft + label_width; diff --git a/indra/llui/llsliderctrl.h b/indra/llui/llsliderctrl.h index c425849782..482c81a0f4 100644 --- a/indra/llui/llsliderctrl.h +++ b/indra/llui/llsliderctrl.h @@ -141,6 +141,7 @@ private: void reportInvalidData(); const LLFontGL* mFont; + const LLFontGL* mLabelFont; BOOL mShowText; BOOL mCanEditText; @@ -158,3 +159,4 @@ private: }; #endif // LL_LLSLIDERCTRL_H + diff --git a/indra/llui/llspinctrl.cpp b/indra/llui/llspinctrl.cpp index 28f3788817..c0d02fa8e9 100644 --- a/indra/llui/llspinctrl.cpp +++ b/indra/llui/llspinctrl.cpp @@ -127,7 +127,16 @@ LLSpinCtrl::LLSpinCtrl(const LLSpinCtrl::Params& p) } params.max_length_bytes(MAX_STRING_LENGTH); params.commit_callback.function((boost::bind(&LLSpinCtrl::onEditorCommit, this, _2))); - params.prevalidate_callback(&LLLineEditor::prevalidateFloat); + + if( mPrecision>0 )//should accept float numbers + { + params.prevalidate_callback(&LLTextValidate::validateFloat); + } + else //should accept int numbers + { + params.prevalidate_callback(&LLTextValidate::validateNonNegativeS32); + } + params.follows.flags(FOLLOWS_LEFT | FOLLOWS_BOTTOM); mEditor = LLUICtrlFactory::create<LLLineEditor> (params); mEditor->setFocusReceivedCallback( boost::bind(&LLSpinCtrl::onEditorGainFocus, _1, this )); @@ -457,3 +466,8 @@ BOOL LLSpinCtrl::handleKeyHere(KEY key, MASK mask) return FALSE; } +BOOL LLSpinCtrl::handleDoubleClick(S32 x, S32 y, MASK mask) +{ + // just treat a double click as a second click + return handleMouseDown(x, y, mask); +} diff --git a/indra/llui/llspinctrl.h b/indra/llui/llspinctrl.h index 00d6f86f83..06201255d2 100644 --- a/indra/llui/llspinctrl.h +++ b/indra/llui/llspinctrl.h @@ -94,6 +94,7 @@ public: virtual BOOL handleScrollWheel(S32 x,S32 y,S32 clicks); virtual BOOL handleKeyHere(KEY key, MASK mask); + virtual BOOL handleDoubleClick(S32 x, S32 y, MASK mask); void onEditorCommit(const LLSD& data); static void onEditorGainFocus(LLFocusableElement* caller, void *userdata); diff --git a/indra/llui/lltabcontainer.cpp b/indra/llui/lltabcontainer.cpp index 6be76605fd..986cfe75a1 100644 --- a/indra/llui/lltabcontainer.cpp +++ b/indra/llui/lltabcontainer.cpp @@ -35,7 +35,6 @@ #include "lltabcontainer.h" #include "llfocusmgr.h" -#include "llbutton.h" #include "lllocalcliprect.h" #include "llrect.h" #include "llresizehandle.h" @@ -96,6 +95,95 @@ public: //---------------------------------------------------------------------------- +//============================================================================ +/* + * @file lltabcontainer.cpp + * @brief class implements LLButton with LLIconCtrl on it + */ +class LLCustomButtonIconCtrl : public LLButton +{ +public: + struct Params + : public LLInitParam::Block<Params, LLButton::Params> + { + // LEFT, RIGHT, TOP, BOTTOM paddings of LLIconCtrl in this class has same value + Optional<S32> icon_ctrl_pad; + + Params(): + icon_ctrl_pad("icon_ctrl_pad", 1) + {} + }; + +protected: + friend class LLUICtrlFactory; + LLCustomButtonIconCtrl(const Params& p): + LLButton(p), + mIcon(NULL), + mIconAlignment(LLFontGL::HCENTER), + mIconCtrlPad(p.icon_ctrl_pad) + {} + +public: + + void updateLayout() + { + LLRect button_rect = getRect(); + LLRect icon_rect = mIcon->getRect(); + + S32 icon_size = button_rect.getHeight() - 2*mIconCtrlPad; + + switch(mIconAlignment) + { + case LLFontGL::LEFT: + icon_rect.setLeftTopAndSize(button_rect.mLeft + mIconCtrlPad, button_rect.mTop - mIconCtrlPad, + icon_size, icon_size); + setLeftHPad(icon_size + mIconCtrlPad * 2); + break; + case LLFontGL::HCENTER: + icon_rect.setLeftTopAndSize(button_rect.mRight - (button_rect.getWidth() + mIconCtrlPad - icon_size)/2, button_rect.mTop - mIconCtrlPad, + icon_size, icon_size); + setRightHPad(icon_size + mIconCtrlPad * 2); + break; + case LLFontGL::RIGHT: + icon_rect.setLeftTopAndSize(button_rect.mRight - mIconCtrlPad - icon_size, button_rect.mTop - mIconCtrlPad, + icon_size, icon_size); + setRightHPad(icon_size + mIconCtrlPad * 2); + break; + default: + break; + } + mIcon->setRect(icon_rect); + } + + void setIcon(LLIconCtrl* icon, LLFontGL::HAlign alignment = LLFontGL::LEFT) + { + if(icon) + { + if(mIcon) + { + removeChild(mIcon); + mIcon->die(); + } + mIcon = icon; + mIconAlignment = alignment; + + addChild(mIcon); + updateLayout(); + } + } + + LLIconCtrl* getIconCtrl() const + { + return mIcon; + } + +private: + LLIconCtrl* mIcon; + LLFontGL::HAlign mIconAlignment; + S32 mIconCtrlPad; +}; +//============================================================================ + struct LLPlaceHolderPanel : public LLPanel { // create dummy param block to register with "placeholder" nane @@ -109,10 +197,13 @@ static LLDefaultChildRegistry::Register<LLTabContainer> r2("tab_container"); LLTabContainer::TabParams::TabParams() : tab_top_image_unselected("tab_top_image_unselected"), tab_top_image_selected("tab_top_image_selected"), + tab_top_image_flash("tab_top_image_flash"), tab_bottom_image_unselected("tab_bottom_image_unselected"), tab_bottom_image_selected("tab_bottom_image_selected"), + tab_bottom_image_flash("tab_bottom_image_flash"), tab_left_image_unselected("tab_left_image_unselected"), - tab_left_image_selected("tab_left_image_selected") + tab_left_image_selected("tab_left_image_selected"), + tab_left_image_flash("tab_left_image_flash") {} LLTabContainer::Params::Params() @@ -127,7 +218,11 @@ LLTabContainer::Params::Params() tab_padding_right("tab_padding_right"), first_tab("first_tab"), middle_tab("middle_tab"), - last_tab("last_tab") + last_tab("last_tab"), + use_custom_icon_ctrl("use_custom_icon_ctrl", false), + tab_icon_ctrl_pad("tab_icon_ctrl_pad", 0), + use_ellipses("use_ellipses"), + font_halign("halign") { name(std::string("tab_container")); mouse_opaque = false; @@ -162,7 +257,10 @@ LLTabContainer::LLTabContainer(const LLTabContainer::Params& p) mFont(p.font), mFirstTabParams(p.first_tab), mMiddleTabParams(p.middle_tab), - mLastTabParams(p.last_tab) + mLastTabParams(p.last_tab), + mCustomIconCtrlUsed(p.use_custom_icon_ctrl), + mTabIconCtrlPad(p.tab_icon_ctrl_pad), + mUseTabEllipses(p.use_ellipses) { static LLUICachedControl<S32> tabcntr_vert_tab_min_width ("UITabCntrVertTabMinWidth", 0); @@ -402,15 +500,15 @@ void LLTabContainer::draw() if( mIsVertical && has_scroll_arrows ) { // Redraw the arrows so that they appears on top. - gGL.pushMatrix(); - gGL.translatef((F32)mPrevArrowBtn->getRect().mLeft, (F32)mPrevArrowBtn->getRect().mBottom, 0.f); + gGL.pushUIMatrix(); + gGL.translateUI((F32)mPrevArrowBtn->getRect().mLeft, (F32)mPrevArrowBtn->getRect().mBottom, 0.f); mPrevArrowBtn->draw(); - gGL.popMatrix(); + gGL.popUIMatrix(); - gGL.pushMatrix(); - gGL.translatef((F32)mNextArrowBtn->getRect().mLeft, (F32)mNextArrowBtn->getRect().mBottom, 0.f); + gGL.pushUIMatrix(); + gGL.translateUI((F32)mNextArrowBtn->getRect().mLeft, (F32)mNextArrowBtn->getRect().mBottom, 0.f); mNextArrowBtn->draw(); - gGL.popMatrix(); + gGL.popUIMatrix(); } } @@ -784,16 +882,19 @@ void LLTabContainer::update_images(LLTabTuple* tuple, TabParams params, LLTabCon { tuple->mButton->setImageUnselected(static_cast<LLUIImage*>(params.tab_top_image_unselected)); tuple->mButton->setImageSelected(static_cast<LLUIImage*>(params.tab_top_image_selected)); + tuple->mButton->setImageFlash(static_cast<LLUIImage*>(params.tab_top_image_flash)); } else if (pos == LLTabContainer::BOTTOM) { tuple->mButton->setImageUnselected(static_cast<LLUIImage*>(params.tab_bottom_image_unselected)); tuple->mButton->setImageSelected(static_cast<LLUIImage*>(params.tab_bottom_image_selected)); + tuple->mButton->setImageFlash(static_cast<LLUIImage*>(params.tab_bottom_image_flash)); } else if (pos == LLTabContainer::LEFT) { tuple->mButton->setImageUnselected(static_cast<LLUIImage*>(params.tab_left_image_unselected)); tuple->mButton->setImageSelected(static_cast<LLUIImage*>(params.tab_left_image_selected)); + tuple->mButton->setImageFlash(static_cast<LLUIImage*>(params.tab_left_image_flash)); } } } @@ -801,6 +902,10 @@ void LLTabContainer::update_images(LLTabTuple* tuple, TabParams params, LLTabCon void LLTabContainer::addTabPanel(const TabPanelParams& panel) { LLPanel* child = panel.panel(); + + llassert(child); + if (!child) return; + const std::string& label = panel.label.isProvided() ? panel.label() : panel.panel()->getLabel(); @@ -856,7 +961,7 @@ void LLTabContainer::addTabPanel(const TabPanelParams& panel) LLRect tab_panel_rect; if (!getTabsHidden() && mIsVertical) { - tab_panel_rect = LLRect(mMinTabWidth + (LLPANEL_BORDER_WIDTH * 2) + tabcntrv_pad, + tab_panel_rect = LLRect(mMinTabWidth + mRightTabBtnOffset + (LLPANEL_BORDER_WIDTH * 2) + tabcntrv_pad, getRect().getHeight() - LLPANEL_BORDER_WIDTH, getRect().getWidth() - LLPANEL_BORDER_WIDTH, LLPANEL_BORDER_WIDTH); @@ -905,6 +1010,11 @@ void LLTabContainer::addTabPanel(const TabPanelParams& panel) LLTextBox* textbox = NULL; LLButton* btn = NULL; + LLCustomButtonIconCtrl::Params custom_btn_params; + { + custom_btn_params.icon_ctrl_pad(mTabIconCtrlPad); + } + LLButton::Params normal_btn_params; if (placeholder) { @@ -924,7 +1034,9 @@ void LLTabContainer::addTabPanel(const TabPanelParams& panel) { if (mIsVertical) { - LLButton::Params p; + LLButton::Params& p = (mCustomIconCtrlUsed)? + custom_btn_params:normal_btn_params; + p.name(std::string("vert tab button")); p.rect(btn_rect); p.follows.flags(FOLLOWS_TOP | FOLLOWS_LEFT); @@ -942,11 +1054,22 @@ void LLTabContainer::addTabPanel(const TabPanelParams& panel) { p.pad_left(indent); } - btn = LLUICtrlFactory::create<LLButton>(p); + + + if(mCustomIconCtrlUsed) + { + btn = LLUICtrlFactory::create<LLCustomButtonIconCtrl>(custom_btn_params); + + } + else + { + btn = LLUICtrlFactory::create<LLButton>(p); + } } else { - LLButton::Params p; + LLButton::Params& p = (mCustomIconCtrlUsed)? + custom_btn_params:normal_btn_params; p.name(std::string(child->getName()) + " tab"); p.rect(btn_rect); p.click_callback.function(boost::bind(&LLTabContainer::onTabBtn, this, _2, child)); @@ -980,7 +1103,14 @@ void LLTabContainer::addTabPanel(const TabPanelParams& panel) p.follows.flags = p.follows.flags() | FOLLOWS_BOTTOM; } -++ btn = LLUICtrlFactory::create<LLButton>(p); + if(mCustomIconCtrlUsed) + { + btn = LLUICtrlFactory::create<LLCustomButtonIconCtrl>(custom_btn_params); + } + else + { + btn = LLUICtrlFactory::create<LLButton>(p); + } } } @@ -1373,8 +1503,8 @@ BOOL LLTabContainer::setTab(S32 which) { LLTabTuple* tuple = *iter; BOOL is_selected = ( tuple == selected_tuple ); - tuple->mButton->setUseEllipses(TRUE); - tuple->mButton->setHAlign(LLFontGL::LEFT); + tuple->mButton->setUseEllipses(mUseTabEllipses); + tuple->mButton->setHAlign(mFontHalign); tuple->mTabPanel->setVisible( is_selected ); // tuple->mTabPanel->setFocus(is_selected); // not clear that we want to do this here. tuple->mButton->setToggleState( is_selected ); @@ -1484,7 +1614,7 @@ void LLTabContainer::setTabImage(LLPanel* child, std::string image_name, const L if( tuple ) { tuple->mButton->setImageOverlay(image_name, LLFontGL::LEFT, color); - reshape_tuple(tuple); + reshapeTuple(tuple); } } @@ -1494,31 +1624,48 @@ void LLTabContainer::setTabImage(LLPanel* child, const LLUUID& image_id, const L if( tuple ) { tuple->mButton->setImageOverlay(image_id, LLFontGL::LEFT, color); - reshape_tuple(tuple); + reshapeTuple(tuple); } } -void LLTabContainer::reshape_tuple(LLTabTuple* tuple) +void LLTabContainer::setTabImage(LLPanel* child, LLIconCtrl* icon) +{ + LLTabTuple* tuple = getTabByPanel(child); + LLCustomButtonIconCtrl* button; + + if(tuple) + { + button = dynamic_cast<LLCustomButtonIconCtrl*>(tuple->mButton); + if(button) + { + button->setIcon(icon); + reshapeTuple(tuple); + } + } +} + +void LLTabContainer::reshapeTuple(LLTabTuple* tuple) { static LLUICachedControl<S32> tab_padding ("UITabPadding", 0); - static LLUICachedControl<S32> image_left_padding ("UIButtonImageLeftPadding", 4); - static LLUICachedControl<S32> image_right_padding ("UIButtonImageRightPadding", 4); - static LLUICachedControl<S32> image_top_padding ("UIButtonImageTopPadding", 2); - static LLUICachedControl<S32> image_bottom_padding ("UIButtonImageBottomPadding", 2); if (!mIsVertical) { - tuple->mButton->setImageOverlayLeftPad(image_left_padding); - tuple->mButton->setImageOverlayRightPad(image_right_padding); - tuple->mButton->setImageOverlayTopPad(image_top_padding); - tuple->mButton->setImageOverlayBottomPad(image_bottom_padding); + S32 image_overlay_width = 0; + if(mCustomIconCtrlUsed) + { + LLCustomButtonIconCtrl* button = dynamic_cast<LLCustomButtonIconCtrl*>(tuple->mButton); + LLIconCtrl* icon_ctrl = button ? button->getIconCtrl() : NULL; + image_overlay_width = icon_ctrl ? icon_ctrl->getRect().getWidth() : 0; + } + else + { + image_overlay_width = tuple->mButton->getImageOverlay().notNull() ? + tuple->mButton->getImageOverlay()->getImage()->getWidth(0) : 0; + } // remove current width from total tab strip width mTotalTabWidth -= tuple->mButton->getRect().getWidth(); - S32 image_overlay_width = tuple->mButton->getImageOverlay().notNull() ? - tuple->mButton->getImageOverlay()->getImage()->getWidth(0) : 0; - tuple->mPadding = image_overlay_width; tuple->mButton->reshape(llclamp(mFont->getWidth(tuple->mButton->getLabelSelected()) + tab_padding + tuple->mPadding, mMinTabWidth, mMaxTabWidth), diff --git a/indra/llui/lltabcontainer.h b/indra/llui/lltabcontainer.h index 2a55877d3c..a2dc15aaf9 100644 --- a/indra/llui/lltabcontainer.h +++ b/indra/llui/lltabcontainer.h @@ -36,6 +36,8 @@ #include "llpanel.h" #include "lltextbox.h" #include "llframetimer.h" +#include "lliconctrl.h" +#include "llbutton.h" class LLTabTuple; @@ -65,10 +67,13 @@ public: { Optional<LLUIImage*> tab_top_image_unselected, tab_top_image_selected, + tab_top_image_flash, tab_bottom_image_unselected, tab_bottom_image_selected, + tab_bottom_image_flash, tab_left_image_unselected, - tab_left_image_selected; + tab_left_image_selected, + tab_left_image_flash; TabParams(); }; @@ -90,6 +95,26 @@ public: middle_tab, last_tab; + /** + * Tab label horizontal alignment + */ + Optional<LLFontGL::HAlign> font_halign; + + /** + * Tab label ellipses + */ + Optional<bool> use_ellipses; + + /** + * Use LLCustomButtonIconCtrl or LLButton in LLTabTuple + */ + Optional<bool> use_custom_icon_ctrl; + + /** + * Paddings for LLIconCtrl in case of LLCustomButtonIconCtrl usage(use_custom_icon_ctrl = true) + */ + Optional<S32> tab_icon_ctrl_pad; + Params(); }; @@ -173,6 +198,7 @@ public: void setTabPanelFlashing(LLPanel* child, BOOL state); void setTabImage(LLPanel* child, std::string img_name, const LLColor4& color = LLColor4::white); void setTabImage(LLPanel* child, const LLUUID& img_id, const LLColor4& color = LLColor4::white); + void setTabImage(LLPanel* child, LLIconCtrl* icon); void setTitle( const std::string& title ); const std::string getPanelTitle(S32 index); @@ -228,7 +254,7 @@ private: // updates tab button images given the tuple, tab position and the corresponding params void update_images(LLTabTuple* tuple, TabParams params, LLTabContainer::TabPosition pos); - void reshape_tuple(LLTabTuple* tuple); + void reshapeTuple(LLTabTuple* tuple); // Variables @@ -278,6 +304,10 @@ private: TabParams mFirstTabParams; TabParams mMiddleTabParams; TabParams mLastTabParams; + + bool mCustomIconCtrlUsed; + S32 mTabIconCtrlPad; + bool mUseTabEllipses; }; #endif // LL_TABCONTAINER_H diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index 2b1e2b8226..2d0d5c12cb 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -152,6 +152,7 @@ LLTextBase::Params::Params() bg_writeable_color("bg_writeable_color"), bg_focus_color("bg_focus_color"), allow_scroll("allow_scroll", true), + plain_text("plain_text",false), track_end("track_end", false), read_only("read_only", false), v_pad("v_pad", 0), @@ -200,6 +201,7 @@ LLTextBase::LLTextBase(const LLTextBase::Params &p) mSelectionStart( 0 ), mSelectionEnd( 0 ), mIsSelecting( FALSE ), + mPlainText ( p.plain_text ), mWordWrap(p.wrap), mUseEllipses( p.use_ellipses ), mParseHTML(p.allow_html), @@ -246,7 +248,7 @@ LLTextBase::~LLTextBase() { // Menu, like any other LLUICtrl, is deleted by its parent - gMenuHolder - clearSegments(); + mSegments.clear(); } void LLTextBase::initFromParams(const LLTextBase::Params& p) @@ -350,6 +352,8 @@ void LLTextBase::drawSelectionBackground() S32 segment_line_start = segmentp->getStart() + segment_offset; S32 segment_line_end = llmin(segmentp->getEnd(), line_iter->mDocIndexEnd); + if (segment_line_start > segment_line_end) break; + S32 segment_width = 0; S32 segment_height = 0; @@ -361,8 +365,11 @@ void LLTextBase::drawSelectionBackground() selection_rect.mLeft += segment_width; } - // if selection spans end of current segment... - if (selection_right > segment_line_end) + // if selection_right == segment_line_end then that means we are the first character of the next segment + // or first character of the next line, in either case we want to add the length of the current segment + // to the selection rectangle and continue. + // if selection right > segment_line_end then selection spans end of current segment... + if (selection_right >= segment_line_end) { // extend selection slightly beyond end of line // to indicate selection of newline character (use "n" character to determine width) @@ -957,8 +964,20 @@ void LLTextBase::reshape(S32 width, S32 height, BOOL called_from_parent) { if (width != getRect().getWidth() || height != getRect().getHeight()) { + bool scrolled_to_bottom = mScroller ? mScroller->isAtBottom() : false; + LLUICtrl::reshape( width, height, called_from_parent ); + if (mScroller && scrolled_to_bottom && mTrackEnd) + { + // keep bottom of text buffer visible + // do this here as well as in reflow to handle case + // where shrinking from top, which causes buffer to temporarily + // not be scrolled to the bottom, since the scroll index + // specified the _top_ of the visible document region + mScroller->goToBottom(); + } + // do this first after reshape, because other things depend on // up-to-date mVisibleTextRect updateRects(); @@ -1043,6 +1062,13 @@ void LLTextBase::setValue(const LLSD& value ) } //virtual +BOOL LLTextBase::canDeselect() const +{ + return hasSelection(); +} + + +//virtual void LLTextBase::deselect() { mSelectionStart = 0; @@ -1077,7 +1103,7 @@ S32 LLTextBase::getLeftOffset(S32 width) case LLFontGL::LEFT: return mHPad; case LLFontGL::HCENTER: - return mHPad + (mVisibleTextRect.getWidth() - width - mHPad) / 2; + return mHPad + llmax(0, (mVisibleTextRect.getWidth() - width - mHPad) / 2); case LLFontGL::RIGHT: return mVisibleTextRect.getWidth() - width; default: @@ -1093,33 +1119,54 @@ void LLTextBase::reflow() updateSegments(); - while(mReflowIndex < S32_MAX) + if (mReflowIndex == S32_MAX) { - S32 start_index = mReflowIndex; - mReflowIndex = S32_MAX; + return; + } - // shrink document to minimum size (visible portion of text widget) - // to force inlined widgets with follows set to shrink - mDocumentView->reshape(mVisibleTextRect.getWidth(), mDocumentView->getRect().getHeight()); + bool scrolled_to_bottom = mScroller ? mScroller->isAtBottom() : false; - bool scrolled_to_bottom = mScroller ? mScroller->isAtBottom() : false; + LLRect cursor_rect = getLocalRectFromDocIndex(mCursorPos); + bool follow_selection = getLocalRect().overlaps(cursor_rect); // cursor is (potentially) visible + + // store in top-left relative coordinates to avoid issues with horizontal scrollbar appearing and disappearing + cursor_rect.mTop = mVisibleTextRect.mTop - cursor_rect.mTop; + cursor_rect.mBottom = mVisibleTextRect.mTop - cursor_rect.mBottom; - LLRect old_cursor_rect = getLocalRectFromDocIndex(mCursorPos); - bool follow_selection = mVisibleTextRect.overlaps(old_cursor_rect); // cursor is visible - old_cursor_rect.translate(-mVisibleTextRect.mLeft, -mVisibleTextRect.mBottom); + S32 first_line = getFirstVisibleLine(); - S32 first_line = getFirstVisibleLine(); + // if scroll anchor not on first line, update it to first character of first line + if (!mLineInfoList.empty() + && (mScrollIndex < mLineInfoList[first_line].mDocIndexStart + || mScrollIndex >= mLineInfoList[first_line].mDocIndexEnd)) + { + mScrollIndex = mLineInfoList[first_line].mDocIndexStart; + } + LLRect first_char_rect = getLocalRectFromDocIndex(mScrollIndex); + // store in top-left relative coordinates to avoid issues with horizontal scrollbar appearing and disappearing + first_char_rect.mTop = mVisibleTextRect.mTop - first_char_rect.mTop; + first_char_rect.mBottom = mVisibleTextRect.mTop - first_char_rect.mBottom; - // if scroll anchor not on first line, update it to first character of first line - if (!mLineInfoList.empty() - && (mScrollIndex < mLineInfoList[first_line].mDocIndexStart - || mScrollIndex >= mLineInfoList[first_line].mDocIndexEnd)) + S32 reflow_count = 0; + while(mReflowIndex < S32_MAX) + { + // we can get into an infinite loop if the document height does not monotonically increase + // with decreasing width (embedded ui elements with alternate layouts). In that case, + // we want to stop reflowing after 2 iterations. We use 2, since we need to handle the case + // of introducing a vertical scrollbar causing a reflow with less width. We should also always + // use an even number of iterations to avoid user visible oscillation of the layout + if(++reflow_count > 2) { - mScrollIndex = mLineInfoList[first_line].mDocIndexStart; + lldebugs << "Breaking out of reflow due to possible infinite loop in " << getName() << llendl; + break; } - LLRect first_char_rect = getLocalRectFromDocIndex(mScrollIndex); - // subtract off effect of horizontal scrollbar from local position of first char - first_char_rect.translate(-mVisibleTextRect.mLeft, -mVisibleTextRect.mBottom); + + S32 start_index = mReflowIndex; + mReflowIndex = S32_MAX; + + // shrink document to minimum size (visible portion of text widget) + // to force inlined widgets with follows set to shrink + mDocumentView->reshape(mVisibleTextRect.getWidth(), mDocumentView->getRect().getHeight()); S32 cur_top = 0; @@ -1137,6 +1184,7 @@ void LLTextBase::reflow() line_list_t::iterator iter = std::upper_bound(mLineInfoList.begin(), mLineInfoList.end(), start_index, line_end_compare()); line_start_index = iter->mDocIndexStart; line_count = iter->mLineNum; + cur_top = iter->mRect.mTop; getSegmentAndOffset(iter->mDocIndexStart, &seg_iter, &seg_offset); mLineInfoList.erase(iter, mLineInfoList.end()); } @@ -1161,11 +1209,6 @@ void LLTextBase::reflow() // grow line height as necessary based on reported height of this segment line_height = llmax(line_height, segment_height); remaining_pixels -= segment_width; - if (remaining_pixels < 0) - { - // getNumChars() and getDimensions() should return consistent results - remaining_pixels = 0; - } seg_offset += character_count; @@ -1240,32 +1283,42 @@ void LLTextBase::reflow() segmentp->updateLayout(*this); } + } - // apply scroll constraints after reflowing text - if (!hasMouseCapture() && mScroller) + // apply scroll constraints after reflowing text + if (!hasMouseCapture() && mScroller) + { + if (scrolled_to_bottom && mTrackEnd) { - if (scrolled_to_bottom && mTrackEnd) - { - // keep bottom of text buffer visible - endOfDoc(); - } - else if (hasSelection() && follow_selection) - { - // keep cursor in same vertical position on screen when selecting text - LLRect new_cursor_rect_doc = getDocRectFromDocIndex(mCursorPos); - mScroller->scrollToShowRect(new_cursor_rect_doc, old_cursor_rect); - } - else - { - // keep first line of text visible - LLRect new_first_char_rect = getDocRectFromDocIndex(mScrollIndex); - mScroller->scrollToShowRect(new_first_char_rect, first_char_rect); - } + // keep bottom of text buffer visible + endOfDoc(); } + else if (hasSelection() && follow_selection) + { + // keep cursor in same vertical position on screen when selecting text + LLRect new_cursor_rect_doc = getDocRectFromDocIndex(mCursorPos); + LLRect old_cursor_rect = cursor_rect; + old_cursor_rect.mTop = mVisibleTextRect.mTop - cursor_rect.mTop; + old_cursor_rect.mBottom = mVisibleTextRect.mTop - cursor_rect.mBottom; - // reset desired x cursor position - updateCursorXPos(); + mScroller->scrollToShowRect(new_cursor_rect_doc, old_cursor_rect); + } + else + { + // keep first line of text visible + LLRect new_first_char_rect = getDocRectFromDocIndex(mScrollIndex); + + // pass in desired rect in the coordinate frame of the document viewport + LLRect old_first_char_rect = first_char_rect; + old_first_char_rect.mTop = mVisibleTextRect.mTop - first_char_rect.mTop; + old_first_char_rect.mBottom = mVisibleTextRect.mTop - first_char_rect.mBottom; + + mScroller->scrollToShowRect(new_first_char_rect, old_first_char_rect); + } } + + // reset desired x cursor position + updateCursorXPos(); } LLRect LLTextBase::getTextBoundingRect() @@ -1444,10 +1497,10 @@ LLTextBase::segment_set_t::const_iterator LLTextBase::getSegIterContaining(S32 i } // Finds the text segment (if any) at the give local screen position -LLTextSegmentPtr LLTextBase::getSegmentAtLocalPos( S32 x, S32 y ) +LLTextSegmentPtr LLTextBase::getSegmentAtLocalPos( S32 x, S32 y, bool hit_past_end_of_line) { // Find the cursor position at the requested local screen position - S32 offset = getDocIndexFromLocalCoord( x, y, FALSE ); + S32 offset = getDocIndexFromLocalCoord( x, y, FALSE, hit_past_end_of_line); segment_set_t::iterator seg_iter = getSegIterContaining(offset); if (seg_iter != mSegments.end()) { @@ -1483,6 +1536,7 @@ void LLTextBase::createUrlContextMenu(S32 x, S32 y, const std::string &in_url) registrar.add("Url.OpenExternal", boost::bind(&LLUrlAction::openURLExternal, url)); registrar.add("Url.Execute", boost::bind(&LLUrlAction::executeSLURL, url)); registrar.add("Url.Teleport", boost::bind(&LLUrlAction::teleportToLocation, url)); + registrar.add("Url.ShowProfile", boost::bind(&LLUrlAction::showProfile, url)); registrar.add("Url.ShowOnMap", boost::bind(&LLUrlAction::showLocationOnMap, url)); registrar.add("Url.CopyLabel", boost::bind(&LLUrlAction::copyLabelToClipboard, url)); registrar.add("Url.CopyUrl", boost::bind(&LLUrlAction::copyURLToClipboard, url)); @@ -1526,7 +1580,7 @@ std::string LLTextBase::getText() const return getViewModel()->getValue().asString(); } -void LLTextBase::appendText(const std::string &new_text, bool prepend_newline, const LLStyle::Params& input_params) +void LLTextBase::appendTextImpl(const std::string &new_text, const LLStyle::Params& input_params) { LLStyle::Params style_params(input_params); style_params.fillFrom(getDefaultStyleParams()); @@ -1562,8 +1616,7 @@ void LLTextBase::appendText(const std::string &new_text, bool prepend_newline, c part = (S32)LLTextParser::MIDDLE; } std::string subtext=text.substr(0,start); - appendAndHighlightText(subtext, prepend_newline, part, style_params); - prepend_newline = false; + appendAndHighlightText(subtext, part, style_params); } // output an optional icon before the Url @@ -1574,20 +1627,21 @@ void LLTextBase::appendText(const std::string &new_text, bool prepend_newline, c { LLStyle::Params icon; icon.image = image; - // HACK: fix spacing of images and remove the fixed char spacing - appendAndHighlightText(" ", prepend_newline, part, icon); - prepend_newline = false; + // Text will be replaced during rendering with the icon, + // but string cannot be empty or the segment won't be + // added (or drawn). + appendImageSegment(part, icon); } } // output the styled Url (unless we've been asked to suppress hyperlinking) if (match.isLinkDisabled()) { - appendAndHighlightText(match.getLabel(), prepend_newline, part, style_params); + appendAndHighlightText(match.getLabel(), part, style_params); } else { - appendAndHighlightText(match.getLabel(), prepend_newline, part, link_params); + appendAndHighlightText(match.getLabel(), part, link_params); // set the tooltip for the Url label if (! match.getTooltip().empty()) @@ -1600,8 +1654,6 @@ void LLTextBase::appendText(const std::string &new_text, bool prepend_newline, c } } } - prepend_newline = false; - // move on to the rest of the text after the Url if (end < (S32)text.length()) { @@ -1614,25 +1666,59 @@ void LLTextBase::appendText(const std::string &new_text, bool prepend_newline, c break; } } - if (part != (S32)LLTextParser::WHOLE) part=(S32)LLTextParser::END; - if (end < (S32)text.length()) appendAndHighlightText(text, prepend_newline, part, style_params); + if (part != (S32)LLTextParser::WHOLE) + part=(S32)LLTextParser::END; + if (end < (S32)text.length()) + appendAndHighlightText(text, part, style_params); } else { - appendAndHighlightText(new_text, prepend_newline, part, style_params); + appendAndHighlightText(new_text, part, style_params); } } +void LLTextBase::appendText(const std::string &new_text, bool prepend_newline, const LLStyle::Params& input_params) +{ + if (new_text.empty()) + return; + + if(prepend_newline) + appendLineBreakSegment(input_params); + appendTextImpl(new_text,input_params); +} + void LLTextBase::needsReflow(S32 index) { lldebugs << "reflow on object " << (void*)this << " index = " << mReflowIndex << ", new index = " << index << llendl; mReflowIndex = llmin(mReflowIndex, index); } -void LLTextBase::appendAndHighlightText(const std::string &new_text, bool prepend_newline, S32 highlight_part, const LLStyle::Params& style_params) +void LLTextBase::appendLineBreakSegment(const LLStyle::Params& style_params) +{ + segment_vec_t segments; + LLStyleConstSP sp(new LLStyle(style_params)); + segments.push_back(new LLLineBreakTextSegment(sp, getLength())); + + insertStringNoUndo(getLength(), utf8str_to_wstring("\n"), &segments); +} + +void LLTextBase::appendImageSegment(S32 highlight_part, const LLStyle::Params& style_params) { - if (new_text.empty()) return; + if(getPlainText()) + { + return; + } + segment_vec_t segments; + LLStyleConstSP sp(new LLStyle(style_params)); + segments.push_back(new LLImageTextSegment(sp, getLength(),*this)); + + insertStringNoUndo(getLength(), utf8str_to_wstring(" "), &segments); +} + + +void LLTextBase::appendAndHighlightTextImpl(const std::string &new_text, S32 highlight_part, const LLStyle::Params& style_params) +{ // Save old state S32 selection_start = mSelectionStart; S32 selection_end = mSelectionEnd; @@ -1645,13 +1731,11 @@ void LLTextBase::appendAndHighlightText(const std::string &new_text, bool prepen setCursorPos(old_length); - LLTextParser* highlight = LLTextParser::getInstance(); - - if (mParseHighlights && highlight) + if (mParseHighlights) { LLStyle::Params highlight_params(style_params); - LLSD pieces = highlight->parsePartialLineHighlights(new_text, highlight_params.color(), (LLTextParser::EHighlightPosition)highlight_part); + LLSD pieces = LLTextParser::instance().parsePartialLineHighlights(new_text, highlight_params.color(), (LLTextParser::EHighlightPosition)highlight_part); for (S32 i = 0; i < pieces.size(); i++) { LLSD color_llsd = pieces[i]["color"]; @@ -1660,14 +1744,8 @@ void LLTextBase::appendAndHighlightText(const std::string &new_text, bool prepen highlight_params.color = lcolor; LLWString wide_text; - if (prepend_newline && (i == 0 || pieces.size() <= 1 )) - { - wide_text = utf8str_to_wstring(std::string("\n") + pieces[i]["text"].asString()); - } - else - { - wide_text = utf8str_to_wstring(pieces[i]["text"].asString()); - } + wide_text = utf8str_to_wstring(pieces[i]["text"].asString()); + S32 cur_length = getLength(); LLStyleConstSP sp(new LLStyle(highlight_params)); LLTextSegmentPtr segmentp = new LLNormalTextSegment(sp, cur_length, cur_length + wide_text.size(), *this); @@ -1679,17 +1757,7 @@ void LLTextBase::appendAndHighlightText(const std::string &new_text, bool prepen else { LLWString wide_text; - - // Add carriage return if not first line - if (getLength() != 0 - && prepend_newline) - { - wide_text = utf8str_to_wstring(std::string("\n") + new_text); - } - else - { - wide_text = utf8str_to_wstring(new_text); - } + wide_text = utf8str_to_wstring(new_text); segment_vec_t segments; S32 segment_start = old_length; @@ -1717,11 +1785,29 @@ void LLTextBase::appendAndHighlightText(const std::string &new_text, bool prepen { setCursorPos(cursor_pos); } +} + +void LLTextBase::appendAndHighlightText(const std::string &new_text, S32 highlight_part, const LLStyle::Params& style_params) +{ + if (new_text.empty()) return; + + std::string::size_type start = 0; + std::string::size_type pos = new_text.find("\n",start); + + while(pos!=-1) + { + if(pos!=start) + { + std::string str = std::string(new_text,start,pos-start); + appendAndHighlightTextImpl(str,highlight_part, style_params); + } + appendLineBreakSegment(style_params); + start = pos+1; + pos = new_text.find("\n",start); + } - //if( !allow_undo ) - //{ - // blockUndo(); - //} + std::string str = std::string(new_text,start,new_text.length()-start); + appendAndHighlightTextImpl(str,highlight_part, style_params); } @@ -1785,11 +1871,11 @@ const LLWString& LLTextBase::getWText() const // will be put to its right. If round is false, the cursor will always be put to the // character's left. -S32 LLTextBase::getDocIndexFromLocalCoord( S32 local_x, S32 local_y, BOOL round ) const +S32 LLTextBase::getDocIndexFromLocalCoord( S32 local_x, S32 local_y, BOOL round, bool hit_past_end_of_line) const { // Figure out which line we're nearest to. LLRect visible_region = getVisibleDocumentRect(); - + // binary search for line that starts before local_y line_list_t::const_iterator line_iter = std::lower_bound(mLineInfoList.begin(), mLineInfoList.end(), local_y - mVisibleTextRect.mBottom + visible_region.mBottom, compare_bottom()); @@ -1799,7 +1885,7 @@ S32 LLTextBase::getDocIndexFromLocalCoord( S32 local_x, S32 local_y, BOOL round } S32 pos = getLength(); - S32 start_x = mVisibleTextRect.mLeft + line_iter->mRect.mLeft; + S32 start_x = mVisibleTextRect.mLeft + line_iter->mRect.mLeft - visible_region.mLeft; segment_set_t::iterator line_seg_iter; S32 line_seg_offset; @@ -1810,11 +1896,23 @@ S32 LLTextBase::getDocIndexFromLocalCoord( S32 local_x, S32 local_y, BOOL round const LLTextSegmentPtr segmentp = *line_seg_iter; S32 segment_line_start = segmentp->getStart() + line_seg_offset; - S32 segment_line_length = llmin(segmentp->getEnd(), line_iter->mDocIndexEnd - 1) - segment_line_start; + S32 segment_line_length = llmin(segmentp->getEnd(), line_iter->mDocIndexEnd) - segment_line_start; S32 text_width, text_height; - segmentp->getDimensions(line_seg_offset, segment_line_length, text_width, text_height); - if (local_x < start_x + text_width // cursor to left of right edge of text - || segmentp->getEnd() >= line_iter->mDocIndexEnd - 1) // or this segment wraps to next line + bool newline = segmentp->getDimensions(line_seg_offset, segment_line_length, text_width, text_height); + + if(newline) + { + pos = segment_line_start + segmentp->getOffset(local_x - start_x, line_seg_offset, segment_line_length, round); + break; + } + + // if we've reached a line of text *below* the mouse cursor, doc index is first character on that line + if (hit_past_end_of_line && local_y - mVisibleTextRect.mBottom + visible_region.mBottom > line_iter->mRect.mTop) + { + pos = segment_line_start; + break; + } + if (local_x < start_x + text_width) // cursor to left of right edge of text { // Figure out which character we're nearest to. S32 offset; @@ -1838,6 +1936,13 @@ S32 LLTextBase::getDocIndexFromLocalCoord( S32 local_x, S32 local_y, BOOL round pos = segment_line_start + offset; break; } + else if (hit_past_end_of_line && segmentp->getEnd() > line_iter->mDocIndexEnd - 1) + { + // segment wraps to next line, so just set doc pos to the end of the line + // segment wraps to next line, so just set doc pos to start of next line (represented by mDocIndexEnd) + pos = llmin(getLength(), line_iter->mDocIndexEnd); + break; + } start_x += text_width; } @@ -1906,11 +2011,18 @@ LLRect LLTextBase::getDocRectFromDocIndex(S32 pos) const LLRect LLTextBase::getLocalRectFromDocIndex(S32 pos) const { + LLRect content_window_rect = mScroller ? mScroller->getContentWindowRect() : getLocalRect(); + if (mBorderVisible) + { + content_window_rect.stretch(-1); + } + LLRect local_rect; + if (mLineInfoList.empty()) { // return default height rect in upper left - local_rect = mVisibleTextRect; + local_rect = content_window_rect; local_rect.mBottom = local_rect.mTop - (S32)(mDefaultFont->getLineHeight()); return local_rect; } @@ -1921,8 +2033,8 @@ LLRect LLTextBase::getLocalRectFromDocIndex(S32 pos) const // compensate for scrolled, inset view of doc LLRect scrolled_view_rect = getVisibleDocumentRect(); local_rect = doc_rect; - local_rect.translate(mVisibleTextRect.mLeft - scrolled_view_rect.mLeft, - mVisibleTextRect.mBottom - scrolled_view_rect.mBottom); + local_rect.translate(content_window_rect.mLeft - scrolled_view_rect.mLeft, + content_window_rect.mBottom - scrolled_view_rect.mBottom); return local_rect; } @@ -2294,18 +2406,6 @@ F32 LLNormalTextSegment::draw(S32 start, S32 end, S32 selection_start, S32 selec { if( end - start > 0 ) { - if ( mStyle->isImage() && (start >= 0) && (end <= mEnd - mStart)) - { - LLColor4 color = LLColor4::white % mEditor.getDrawContext().mAlpha; - LLUIImagePtr image = mStyle->getImage(); - S32 style_image_height = image->getHeight(); - S32 style_image_width = image->getWidth(); - // Center the image vertically - S32 image_bottom = draw_rect.getCenterY() - (style_image_height/2); - image->draw(draw_rect.mLeft, image_bottom, - style_image_width, style_image_height, color); - } - return drawClippedSegment( getStart() + start, getStart() + end, selection_start, selection_end, draw_rect); } return draw_rect.mLeft; @@ -2318,11 +2418,6 @@ F32 LLNormalTextSegment::drawClippedSegment(S32 seg_start, S32 seg_end, S32 sele const LLWString &text = mEditor.getWText(); - if ( text[seg_end-1] == '\n' ) - { - --seg_end; - } - F32 right_x = rect.mLeft; if (!mStyle->isVisible()) { @@ -2392,8 +2487,12 @@ BOOL LLNormalTextSegment::handleHover(S32 x, S32 y, MASK mask) { if (getStyle() && getStyle()->isLink()) { - LLUI::getWindow()->setCursor(UI_CURSOR_HAND); - return TRUE; + // Only process the click if it's actually in this segment, not to the right of the end-of-line. + if(mEditor.getSegmentAtLocalPos(x, y, false) == this) + { + LLUI::getWindow()->setCursor(UI_CURSOR_HAND); + return TRUE; + } } return FALSE; } @@ -2402,8 +2501,12 @@ BOOL LLNormalTextSegment::handleRightMouseDown(S32 x, S32 y, MASK mask) { if (getStyle() && getStyle()->isLink()) { - mEditor.createUrlContextMenu(x, y, getStyle()->getLinkHREF()); - return TRUE; + // Only process the click if it's actually in this segment, not to the right of the end-of-line. + if(mEditor.getSegmentAtLocalPos(x, y, false) == this) + { + mEditor.createUrlContextMenu(x, y, getStyle()->getLinkHREF()); + return TRUE; + } } return FALSE; } @@ -2412,8 +2515,12 @@ BOOL LLNormalTextSegment::handleMouseDown(S32 x, S32 y, MASK mask) { if (getStyle() && getStyle()->isLink()) { - // eat mouse down event on hyperlinks, so we get the mouse up - return TRUE; + // Only process the click if it's actually in this segment, not to the right of the end-of-line. + if(mEditor.getSegmentAtLocalPos(x, y, false) == this) + { + // eat mouse down event on hyperlinks, so we get the mouse up + return TRUE; + } } return FALSE; @@ -2423,8 +2530,12 @@ BOOL LLNormalTextSegment::handleMouseUp(S32 x, S32 y, MASK mask) { if (getStyle() && getStyle()->isLink()) { - LLUrlAction::clickAction(getStyle()->getLinkHREF()); - return TRUE; + // Only process the click if it's actually in this segment, not to the right of the end-of-line. + if(mEditor.getSegmentAtLocalPos(x, y, false) == this) + { + LLUrlAction::clickAction(getStyle()->getLinkHREF()); + return TRUE; + } } return FALSE; @@ -2465,33 +2576,14 @@ bool LLNormalTextSegment::getDimensions(S32 first_char, S32 num_chars, S32& widt { height = 0; width = 0; - bool force_newline = false; if (num_chars > 0) { height = mFontHeight; const LLWString &text = mEditor.getWText(); // if last character is a newline, then return true, forcing line break - llwchar last_char = text[mStart + first_char + num_chars - 1]; - if (last_char == '\n') - { - force_newline = true; - // don't count newline in font width - width = mStyle->getFont()->getWidth(text.c_str(), mStart + first_char, num_chars - 1); - } - else - { - width = mStyle->getFont()->getWidth(text.c_str(), mStart + first_char, num_chars); - } - } - - LLUIImagePtr image = mStyle->getImage(); - if( image.notNull()) - { - width += image->getWidth(); - height = llmax(height, image->getHeight()); + width = mStyle->getFont()->getWidth(text.c_str(), mStart + first_char, num_chars); } - - return force_newline; + return false; } S32 LLNormalTextSegment::getOffset(S32 segment_local_x_coord, S32 start_offset, S32 num_chars, bool round) const @@ -2514,15 +2606,7 @@ S32 LLNormalTextSegment::getNumChars(S32 num_pixels, S32 segment_offset, S32 lin num_pixels = llmax(0, num_pixels - image->getWidth()); } - // search for newline and if found, truncate there - S32 last_char = mStart + segment_offset; - for (; last_char != mEnd; ++last_char) - { - if (text[last_char] == '\n') - { - break; - } - } + S32 last_char = mEnd; // set max characters to length of segment, or to first newline max_chars = llmin(max_chars, last_char - (mStart + segment_offset)); @@ -2550,8 +2634,7 @@ S32 LLNormalTextSegment::getNumChars(S32 num_pixels, S32 segment_offset, S32 lin S32 last_char_in_run = mStart + segment_offset + num_chars; // check length first to avoid indexing off end of string if (last_char_in_run < mEnd - && (last_char_in_run >= mEditor.getLength() - || text[last_char_in_run] == '\n')) + && (last_char_in_run >= mEditor.getLength() )) { num_chars++; } @@ -2646,3 +2729,93 @@ void LLInlineViewSegment::linkToDocument(LLTextBase* editor) { editor->addDocumentChild(mView); } + +LLLineBreakTextSegment::LLLineBreakTextSegment(S32 pos):LLTextSegment(pos,pos+1) +{ + LLStyleSP s( new LLStyle(LLStyle::Params().visible(true))); + + mFontHeight = llceil(s->getFont()->getLineHeight()); +} +LLLineBreakTextSegment::LLLineBreakTextSegment(LLStyleConstSP style,S32 pos):LLTextSegment(pos,pos+1) +{ + mFontHeight = llceil(style->getFont()->getLineHeight()); +} +LLLineBreakTextSegment::~LLLineBreakTextSegment() +{ +} +bool LLLineBreakTextSegment::getDimensions(S32 first_char, S32 num_chars, S32& width, S32& height) const +{ + width = 0; + height = mFontHeight; + + return true; +} +S32 LLLineBreakTextSegment::getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars) const +{ + return 1; +} +F32 LLLineBreakTextSegment::draw(S32 start, S32 end, S32 selection_start, S32 selection_end, const LLRect& draw_rect) +{ + return draw_rect.mLeft; +} + +LLImageTextSegment::LLImageTextSegment(LLStyleConstSP style,S32 pos,class LLTextBase& editor) + :LLTextSegment(pos,pos+1) + ,mStyle( style ) + ,mEditor(editor) +{ +} + +LLImageTextSegment::~LLImageTextSegment() +{ +} + +static const S32 IMAGE_HPAD = 3; + +bool LLImageTextSegment::getDimensions(S32 first_char, S32 num_chars, S32& width, S32& height) const +{ + width = 0; + height = llceil(mStyle->getFont()->getLineHeight());; + + LLUIImagePtr image = mStyle->getImage(); + if( num_chars>0 && image.notNull()) + { + width += image->getWidth() + IMAGE_HPAD; + height = llmax(height, image->getHeight() + IMAGE_HPAD ); + } + return false; +} + +S32 LLImageTextSegment::getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars) const +{ + LLUIImagePtr image = mStyle->getImage(); + S32 image_width = image->getWidth(); + if(line_offset == 0 || num_pixels>image_width + IMAGE_HPAD) + { + return 1; + } + return 0; +} + +F32 LLImageTextSegment::draw(S32 start, S32 end, S32 selection_start, S32 selection_end, const LLRect& draw_rect) +{ + if ( (start >= 0) && (end <= mEnd - mStart)) + { + LLColor4 color = LLColor4::white % mEditor.getDrawContext().mAlpha; + LLUIImagePtr image = mStyle->getImage(); + S32 style_image_height = image->getHeight(); + S32 style_image_width = image->getWidth(); + // Text is drawn from the top of the draw_rect downward + + S32 text_center = draw_rect.mTop - (draw_rect.getHeight() / 2); + // Align image to center of draw rect + S32 image_bottom = text_center - (style_image_height / 2); + image->draw(draw_rect.mLeft, image_bottom, + style_image_width, style_image_height, color); + + const S32 IMAGE_HPAD = 3; + return draw_rect.mLeft + style_image_width + IMAGE_HPAD; + } + return 0.0; +} + diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h index 3dda6f4cc8..92876e20d6 100644 --- a/indra/llui/lltextbase.h +++ b/indra/llui/lltextbase.h @@ -48,6 +48,7 @@ class LLContextMenu; class LLTextSegment; +class LLNormalTextSegment; typedef LLPointer<LLTextSegment> LLTextSegmentPtr; @@ -61,6 +62,9 @@ class LLTextBase protected LLEditMenuHandler { public: + friend class LLTextSegment; + friend class LLNormalTextSegment; + struct LineSpacingParams : public LLInitParam::Choice<LineSpacingParams> { Alternative<F32> multiple; @@ -82,6 +86,7 @@ public: track_end, read_only, allow_scroll, + plain_text, wrap, use_ellipses, allow_html, @@ -128,6 +133,7 @@ public: /*virtual*/ LLTextViewModel* getViewModel() const; // LLEditMenuHandler interface + /*virtual*/ BOOL canDeselect() const; /*virtual*/ void deselect(); // used by LLTextSegment layout code @@ -165,13 +171,16 @@ public: S32 getVPad() { return mVPad; } S32 getHPad() { return mHPad; } - S32 getDocIndexFromLocalCoord( S32 local_x, S32 local_y, BOOL round ) const; + S32 getDocIndexFromLocalCoord( S32 local_x, S32 local_y, BOOL round, bool hit_past_end_of_line = true) const; LLRect getLocalRectFromDocIndex(S32 pos) const; LLRect getDocRectFromDocIndex(S32 pos) const; void setReadOnly(bool read_only) { mReadOnly = read_only; } bool getReadOnly() { return mReadOnly; } + void setPlainText(bool value) { mPlainText = value;} + bool getPlainText() const { return mPlainText; } + // cursor manipulation bool setCursor(S32 row, S32 column); bool setCursorPos(S32 cursor_pos, bool keep_cursor_offset = false); @@ -269,13 +278,13 @@ protected: S32 insertStringNoUndo(S32 pos, const LLWString &wstr, segment_vec_t* segments = NULL); // returns num of chars actually inserted S32 removeStringNoUndo(S32 pos, S32 length); S32 overwriteCharNoUndo(S32 pos, llwchar wc); - void appendAndHighlightText(const std::string &new_text, bool prepend_newline, S32 highlight_part, const LLStyle::Params& stylep); + void appendAndHighlightText(const std::string &new_text, S32 highlight_part, const LLStyle::Params& stylep); // manage segments void getSegmentAndOffset( S32 startpos, segment_set_t::const_iterator* seg_iter, S32* offsetp ) const; void getSegmentAndOffset( S32 startpos, segment_set_t::iterator* seg_iter, S32* offsetp ); - LLTextSegmentPtr getSegmentAtLocalPos( S32 x, S32 y ); + LLTextSegmentPtr getSegmentAtLocalPos( S32 x, S32 y, bool hit_past_end_of_line = true); segment_set_t::iterator getSegIterContaining(S32 index); segment_set_t::const_iterator getSegIterContaining(S32 index) const; void clearSegments(); @@ -311,6 +320,13 @@ protected: void needsScroll() { mScrollNeeded = TRUE; } void replaceUrlLabel(const std::string &url, const std::string &label); + void appendLineBreakSegment(const LLStyle::Params& style_params); + void appendImageSegment(S32 highlight_part, const LLStyle::Params& style_params); + + void appendTextImpl(const std::string &new_text, const LLStyle::Params& input_params = LLStyle::Params()); + void appendAndHighlightTextImpl(const std::string &new_text, S32 highlight_part, const LLStyle::Params& style_params); + + protected: // text segmentation and flow segment_set_t mSegments; @@ -354,6 +370,7 @@ protected: bool mReadOnly; bool mBGVisible; // render background? bool mClipPartial; // false if we show lines that are partially inside bounding rect + bool mPlainText; // didn't use Image or Icon segments S32 mMaxTextByteLength; // Maximum length mText is allowed to be in bytes // support widgets @@ -502,5 +519,33 @@ private: bool mForceNewLine; }; +class LLLineBreakTextSegment : public LLTextSegment +{ +public: + + LLLineBreakTextSegment(LLStyleConstSP style,S32 pos); + LLLineBreakTextSegment(S32 pos); + ~LLLineBreakTextSegment(); + bool getDimensions(S32 first_char, S32 num_chars, S32& width, S32& height) const; + S32 getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars) const; + F32 draw(S32 start, S32 end, S32 selection_start, S32 selection_end, const LLRect& draw_rect); + +private: + S32 mFontHeight; +}; + +class LLImageTextSegment : public LLTextSegment +{ +public: + LLImageTextSegment(LLStyleConstSP style,S32 pos,class LLTextBase& editor); + ~LLImageTextSegment(); + bool getDimensions(S32 first_char, S32 num_chars, S32& width, S32& height) const; + S32 getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars) const; + F32 draw(S32 start, S32 end, S32 selection_start, S32 selection_end, const LLRect& draw_rect); + +private: + class LLTextBase& mEditor; + LLStyleConstSP mStyle; +}; #endif diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp index 3fdb48b3ca..c9474d66b7 100644 --- a/indra/llui/lltexteditor.cpp +++ b/indra/llui/lltexteditor.cpp @@ -237,13 +237,16 @@ private: /////////////////////////////////////////////////////////////////// LLTextEditor::Params::Params() : default_text("default_text"), + prevalidate_callback("prevalidate_callback"), embedded_items("embedded_items", false), ignore_tab("ignore_tab", true), - handle_edit_keys_directly("handle_edit_keys_directly", false), show_line_numbers("show_line_numbers", false), default_color("default_color"), - commit_on_focus_lost("commit_on_focus_lost", false) -{} + commit_on_focus_lost("commit_on_focus_lost", false), + show_context_menu("show_context_menu") +{ + addSynonym(prevalidate_callback, "text_type"); +} LLTextEditor::LLTextEditor(const LLTextEditor::Params& p) : LLTextBase(p), @@ -254,11 +257,12 @@ LLTextEditor::LLTextEditor(const LLTextEditor::Params& p) : mShowLineNumbers ( p.show_line_numbers ), mCommitOnFocusLost( p.commit_on_focus_lost), mAllowEmbeddedItems( p.embedded_items ), - mHandleEditKeysDirectly( p.handle_edit_keys_directly ), mMouseDownX(0), mMouseDownY(0), mTabsToNextField(p.ignore_tab), - mContextMenu(NULL) + mPrevalidateFunc(p.prevalidate_callback()), + mContextMenu(NULL), + mShowContextMenu(p.show_context_menu) { mDefaultFont = p.font; @@ -299,12 +303,6 @@ LLTextEditor::~LLTextEditor() { gFocusMgr.releaseFocusIfNeeded( this ); // calls onCommit() while LLTextEditor still valid - // Route menu back to the default - if( gEditMenuHandler == this ) - { - gEditMenuHandler = NULL; - } - // Scrollbar is deleted by LLView std::for_each(mUndoStack.begin(), mUndoStack.end(), DeletePointer()); @@ -318,6 +316,17 @@ LLTextEditor::~LLTextEditor() void LLTextEditor::setText(const LLStringExplicit &utf8str, const LLStyle::Params& input_params) { + // validate incoming text if necessary + if (mPrevalidateFunc) + { + LLWString test_text = utf8str_to_wstring(utf8str); + if (!mPrevalidateFunc(test_text)) + { + // not valid text, nothing to do + return; + } + } + blockUndo(); deselect(); @@ -490,21 +499,6 @@ void LLTextEditor::getSegmentsInRange(LLTextEditor::segment_vec_t& segments_out, } } -// virtual -BOOL LLTextEditor::canDeselect() const -{ - return hasSelection(); -} - - -void LLTextEditor::deselect() -{ - mSelectionStart = 0; - mSelectionEnd = 0; - mIsSelecting = FALSE; -} - - BOOL LLTextEditor::selectionContainsLineBreaks() { if (hasSelection()) @@ -651,6 +645,7 @@ void LLTextEditor::selectAll() mSelectionStart = getLength(); mSelectionEnd = 0; setCursorPos(mSelectionEnd); + updatePrimary(); } BOOL LLTextEditor::handleMouseDown(S32 x, S32 y, MASK mask) @@ -718,9 +713,10 @@ BOOL LLTextEditor::handleRightMouseDown(S32 x, S32 y, MASK mask) { setFocus(TRUE); } - if (!LLTextBase::handleRightMouseDown(x, y, mask)) + // Prefer editor menu if it has selection. See EXT-6806. + if (hasSelection() || !LLTextBase::handleRightMouseDown(x, y, mask)) { - if(getMouseOpaque()) + if(getShowContextMenu()) { showContextMenu(x, y); } @@ -909,6 +905,21 @@ S32 LLTextEditor::execute( TextCmd* cmd ) // Push the new command is now on the top (front) of the undo stack. mUndoStack.push_front(cmd); mLastCmd = cmd; + + bool need_to_rollback = mPrevalidateFunc + && !mPrevalidateFunc(getViewModel()->getDisplay()); + if (need_to_rollback) + { + // get rid of this last command and clean up undo stack + undo(); + + // remove any evidence of this command from redo history + mUndoStack.pop_front(); + delete cmd; + + // failure, nothing changed + delta = 0; + } } else { @@ -993,7 +1004,7 @@ void LLTextEditor::removeCharOrTab() } else { - reportBadKeystroke(); + LLUI::reportBadKeystroke(); } } @@ -1016,7 +1027,7 @@ void LLTextEditor::removeChar() } else { - reportBadKeystroke(); + LLUI::reportBadKeystroke(); } } @@ -1032,7 +1043,21 @@ S32 LLTextEditor::addChar(S32 pos, llwchar wc) if (mLastCmd && mLastCmd->canExtend(pos)) { S32 delta = 0; + if (mPrevalidateFunc) + { + // get a copy of current text contents + LLWString test_string(getViewModel()->getDisplay()); + + // modify text contents as if this addChar succeeded + llassert(pos <= (S32)test_string.size()); + test_string.insert(pos, 1, wc); + if (!mPrevalidateFunc( test_string)) + { + return 0; + } + } mLastCmd->extendAndExecute(this, pos, wc, &delta); + return delta; } else @@ -1058,6 +1083,28 @@ void LLTextEditor::addChar(llwchar wc) setCursorPos(mCursorPos + addChar( mCursorPos, wc )); } +void LLTextEditor::addLineBreakChar() +{ + if( !getEnabled() ) + { + return; + } + if( hasSelection() ) + { + deleteSelection(TRUE); + } + else if (LL_KIM_OVERWRITE == gKeyboard->getInsertMode()) + { + removeChar(mCursorPos); + } + + LLStyleConstSP sp(new LLStyle(LLStyle::Params())); + LLTextSegmentPtr segment = new LLLineBreakTextSegment(sp, mCursorPos); + + S32 pos = execute(new TextCmdAddChar(mCursorPos, FALSE, '\n', segment)); + + setCursorPos(mCursorPos + pos); +} BOOL LLTextEditor::handleSelectionKey(const KEY key, const MASK mask) @@ -1152,22 +1199,6 @@ BOOL LLTextEditor::handleSelectionKey(const KEY key, const MASK mask) } } - if( !handled && mHandleEditKeysDirectly ) - { - if( (MASK_CONTROL & mask) && ('A' == key) ) - { - if( canSelectAll() ) - { - selectAll(); - } - else - { - reportBadKeystroke(); - } - handled = TRUE; - } - } - if( handled ) { // take selection to 'primary' clipboard @@ -1201,6 +1232,7 @@ BOOL LLTextEditor::handleNavigationKey(const KEY key, const MASK mask) case KEY_DOWN: changeLine( 1 ); + deselect(); break; case KEY_PAGE_DOWN: @@ -1214,7 +1246,7 @@ BOOL LLTextEditor::handleNavigationKey(const KEY key, const MASK mask) case KEY_LEFT: if( hasSelection() ) { - setCursorPos(llmin( mCursorPos - 1, mSelectionStart, mSelectionEnd )); + setCursorPos(llmin( mSelectionStart, mSelectionEnd )); } else { @@ -1224,7 +1256,7 @@ BOOL LLTextEditor::handleNavigationKey(const KEY key, const MASK mask) } else { - reportBadKeystroke(); + LLUI::reportBadKeystroke(); } } break; @@ -1232,7 +1264,7 @@ BOOL LLTextEditor::handleNavigationKey(const KEY key, const MASK mask) case KEY_RIGHT: if( hasSelection() ) { - setCursorPos(llmax( mCursorPos + 1, mSelectionStart, mSelectionEnd )); + setCursorPos(llmax( mSelectionStart, mSelectionEnd )); } else { @@ -1242,7 +1274,7 @@ BOOL LLTextEditor::handleNavigationKey(const KEY key, const MASK mask) } else { - reportBadKeystroke(); + LLUI::reportBadKeystroke(); } } break; @@ -1253,6 +1285,11 @@ BOOL LLTextEditor::handleNavigationKey(const KEY key, const MASK mask) } } + if (handled) + { + deselect(); + } + return handled; } @@ -1389,7 +1426,27 @@ void LLTextEditor::pasteHelper(bool is_primary) } // Insert the new text into the existing text. - setCursorPos(mCursorPos + insert(mCursorPos, clean_string, FALSE, LLTextSegmentPtr())); + + //paste text with linebreaks. + std::basic_string<llwchar>::size_type start = 0; + std::basic_string<llwchar>::size_type pos = clean_string.find('\n',start); + + while(pos!=-1) + { + if(pos!=start) + { + std::basic_string<llwchar> str = std::basic_string<llwchar>(clean_string,start,pos-start); + setCursorPos(mCursorPos + insert(mCursorPos, str, FALSE, LLTextSegmentPtr())); + } + addLineBreakChar(); + + start = pos+1; + pos = clean_string.find('\n',start); + } + + std::basic_string<llwchar> str = std::basic_string<llwchar>(clean_string,start,clean_string.length()-start); + setCursorPos(mCursorPos + insert(mCursorPos, str, FALSE, LLTextSegmentPtr())); + deselect(); onKeyStroke(); @@ -1505,75 +1562,13 @@ BOOL LLTextEditor::handleControlKey(const KEY key, const MASK mask) return handled; } -BOOL LLTextEditor::handleEditKey(const KEY key, const MASK mask) -{ - BOOL handled = FALSE; - // Standard edit keys (Ctrl-X, Delete, etc,) are handled here instead of routed by the menu system. - if( KEY_DELETE == key ) +BOOL LLTextEditor::handleSpecialKey(const KEY key, const MASK mask) { - if( canDoDelete() ) - { - doDelete(); - } - else - { - reportBadKeystroke(); - } - handled = TRUE; - } - else - if( MASK_CONTROL & mask ) - { - if( 'C' == key ) - { - if( canCopy() ) - { - copy(); - } - else - { - reportBadKeystroke(); - } - handled = TRUE; - } - else - if( 'V' == key ) - { - if( canPaste() ) - { - paste(); - } - else - { - reportBadKeystroke(); - } - handled = TRUE; - } - else - if( 'X' == key ) - { - if( canCut() ) - { - cut(); - } - else - { - reportBadKeystroke(); - } - handled = TRUE; - } - } - - return handled; -} - - -BOOL LLTextEditor::handleSpecialKey(const KEY key, const MASK mask, BOOL* return_key_hit) -{ - *return_key_hit = FALSE; BOOL handled = TRUE; + if (mReadOnly) return FALSE; + switch( key ) { case KEY_INSERT: @@ -1595,7 +1590,7 @@ BOOL LLTextEditor::handleSpecialKey(const KEY key, const MASK mask, BOOL* return } else { - reportBadKeystroke(); + LLUI::reportBadKeystroke(); } break; @@ -1648,6 +1643,10 @@ BOOL LLTextEditor::handleSpecialKey(const KEY key, const MASK mask, BOOL* return break; } + if (handled) + { + onKeyStroke(); + } return handled; } @@ -1668,9 +1667,6 @@ void LLTextEditor::unindentLineBeforeCloseBrace() BOOL LLTextEditor::handleKeyHere(KEY key, MASK mask ) { BOOL handled = FALSE; - BOOL selection_modified = FALSE; - BOOL return_key_hit = FALSE; - BOOL text_may_have_changed = TRUE; // Special case for TAB. If want to move to next field, report // not handled and let the parent take care of field movement. @@ -1678,116 +1674,24 @@ BOOL LLTextEditor::handleKeyHere(KEY key, MASK mask ) { return FALSE; } - /* - if (KEY_F10 == key) - { - LLComboBox::Params cp; - cp.name = "combo box"; - cp.label = "my combo"; - cp.rect.width = 100; - cp.rect.height = 20; - cp.items.add().label = "item 1"; - cp.items.add().label = "item 2"; - cp.items.add().label = "item 3"; - appendWidget(LLUICtrlFactory::create<LLComboBox>(cp), "combo", true, false); - } - if (KEY_F11 == key) - { - LLButton::Params bp; - bp.name = "text button"; - bp.label = "Click me"; - bp.rect.width = 100; - bp.rect.height = 20; - - appendWidget(LLUICtrlFactory::create<LLButton>(bp), "button", true, false); - } - */ - if (mReadOnly) + if (mReadOnly && mScroller) { - if(mScroller) - { - handled = mScroller->handleKeyHere( key, mask ); + handled = (mScroller && mScroller->handleKeyHere( key, mask )) + || handleSelectionKey(key, mask) + || handleControlKey(key, mask); } else { - handled = handleNavigationKey( key, mask ); - } - - } - else - { - // handle navigation keys ourself - handled = handleNavigationKey( key, mask ); - } - - - if( handled ) - { - text_may_have_changed = FALSE; - } - - if( !handled ) - { - handled = handleSelectionKey( key, mask ); - if( handled ) - { - selection_modified = TRUE; - } - } - - if( !handled ) - { - handled = handleControlKey( key, mask ); - if( handled ) - { - selection_modified = TRUE; - } - } - - if( !handled && mHandleEditKeysDirectly ) - { - handled = handleEditKey( key, mask ); - if( handled ) - { - selection_modified = TRUE; - text_may_have_changed = TRUE; - } - } - - // Handle most keys only if the text editor is writeable. - if( !mReadOnly ) - { - if( !handled ) - { - handled = handleSpecialKey( key, mask, &return_key_hit ); - if( handled ) - { - selection_modified = TRUE; - text_may_have_changed = TRUE; - } - } - + handled = handleNavigationKey( key, mask ) + || handleSelectionKey(key, mask) + || handleControlKey(key, mask) + || handleSpecialKey(key, mask); } if( handled ) { resetCursorBlink(); - - // Most keystrokes will make the selection box go away, but not all will. - if( !selection_modified && - KEY_SHIFT != key && - KEY_CONTROL != key && - KEY_ALT != key && - KEY_CAPSLOCK ) - { - deselect(); - } - - if(text_may_have_changed) - { - onKeyStroke(); - } needsScroll(); } @@ -2288,7 +2192,7 @@ void LLTextEditor::getCurrentLineAndColumn( S32* line, S32* col, BOOL include_wo void LLTextEditor::autoIndent() { // Count the number of spaces in the current line - S32 line = getLineNumFromDocIndex(mCursorPos); + S32 line = getLineNumFromDocIndex(mCursorPos, false); S32 line_start = getLineStart(line); S32 space_count = 0; S32 i; @@ -2307,7 +2211,10 @@ void LLTextEditor::autoIndent() } // Insert that number of spaces on the new line - addChar( '\n' ); + + //appendLineBreakSegment(LLStyle::Params());//addChar( '\n' ); + addLineBreakChar(); + for( i = 0; i < space_count; i++ ) { addChar( ' ' ); @@ -2478,9 +2385,9 @@ void LLTextEditor::loadKeywords(const std::string& filename, void LLTextEditor::updateSegments() { - LLFastTimer ft(FTM_SYNTAX_HIGHLIGHTING); - if (mKeywords.isLoaded()) + if (mReflowIndex < S32_MAX && mKeywords.isLoaded()) { + LLFastTimer ft(FTM_SYNTAX_HIGHLIGHTING); // HACK: No non-ascii keywords for now segment_vec_t segment_list; mKeywords.findSegments(&segment_list, getWText(), mDefaultColor.get(), *this); diff --git a/indra/llui/lltexteditor.h b/indra/llui/lltexteditor.h index a136f9ccce..7b68974fd8 100644 --- a/indra/llui/lltexteditor.h +++ b/indra/llui/lltexteditor.h @@ -44,6 +44,7 @@ #include "lldarray.h" #include "llviewborder.h" // for params #include "lltextbase.h" +#include "lltextvalidate.h" #include "llpreeditor.h" #include "llcontrol.h" @@ -63,12 +64,13 @@ public: struct Params : public LLInitParam::Block<Params, LLTextBase::Params> { Optional<std::string> default_text; + Optional<LLTextValidate::validate_func_t, LLTextValidate::ValidateTextNamedFuncs> prevalidate_callback; Optional<bool> embedded_items, ignore_tab, - handle_edit_keys_directly, show_line_numbers, - commit_on_focus_lost; + commit_on_focus_lost, + show_context_menu; //colors Optional<LLUIColor> default_color; @@ -143,8 +145,6 @@ public: virtual BOOL canDoDelete() const; virtual void selectAll(); virtual BOOL canSelectAll() const; - virtual void deselect(); - virtual BOOL canDeselect() const; void selectNext(const std::string& search_text_in, BOOL case_insensitive, BOOL wrap = TRUE); BOOL replaceText(const std::string& search_text, const std::string& replace_text, BOOL case_insensitive, BOOL wrap = TRUE); @@ -200,6 +200,9 @@ public: const LLTextSegmentPtr getPreviousSegment() const; void getSelectedSegments(segment_vec_t& segments) const; + void setShowContextMenu(bool show) { mShowContextMenu = show; } + bool getShowContextMenu() const { return mShowContextMenu; } + protected: void showContextMenu(S32 x, S32 y); void drawPreeditMarker(); @@ -212,13 +215,10 @@ protected: S32 indentLine( S32 pos, S32 spaces ); void unindentLineBeforeCloseBrace(); - void reportBadKeystroke() { make_ui_sound("UISndBadKeystroke"); } - BOOL handleNavigationKey(const KEY key, const MASK mask); - BOOL handleSpecialKey(const KEY key, const MASK mask, BOOL* return_key_hit); + BOOL handleSpecialKey(const KEY key, const MASK mask); BOOL handleSelectionKey(const KEY key, const MASK mask); BOOL handleControlKey(const KEY key, const MASK mask); - BOOL handleEditKey(const KEY key, const MASK mask); BOOL selectionContainsLineBreaks(); void deleteSelection(BOOL transient_operation); @@ -240,6 +240,7 @@ protected: // Undoable operations void addChar(llwchar c); // at mCursorPos S32 addChar(S32 pos, llwchar wc); + void addLineBreakChar(); S32 overwriteChar(S32 pos, llwchar wc); void removeChar(); S32 removeChar(S32 pos); @@ -319,16 +320,14 @@ private: BOOL mTakesFocus; BOOL mAllowEmbeddedItems; + bool mShowContextMenu; LLUUID mSourceID; - // If true, the standard edit keys (Ctrl-X, Delete, etc,) are handled here - //instead of routed by the menu system - BOOL mHandleEditKeysDirectly; - LLCoordGL mLastIMEPosition; // Last position of the IME editor keystroke_signal_t mKeystrokeSignal; + LLTextValidate::validate_func_t mPrevalidateFunc; LLContextMenu* mContextMenu; }; // end class LLTextEditor diff --git a/indra/llui/lltextparser.cpp b/indra/llui/lltextparser.cpp index 76a39e3094..2493afcb5d 100644 --- a/indra/llui/lltextparser.cpp +++ b/indra/llui/lltextparser.cpp @@ -43,29 +43,14 @@ #include "v4color.h" #include "lldir.h" -// Routines used for parsing text for TextParsers and html - -LLTextParser* LLTextParser::sInstance = NULL; - // // Member Functions // -LLTextParser::~LLTextParser() -{ - sInstance=NULL; -} +LLTextParser::LLTextParser() +: mLoaded(false) +{} -// static -LLTextParser* LLTextParser::getInstance() -{ - if (!sInstance) - { - sInstance = new LLTextParser(); - sInstance->loadFromDisk(); - } - return sInstance; -} // Moved triggerAlerts() to llfloaterchat.cpp to break llui/llaudio library dependency. @@ -105,6 +90,8 @@ S32 LLTextParser::findPattern(const std::string &text, LLSD highlight) LLSD LLTextParser::parsePartialLineHighlights(const std::string &text, const LLColor4 &color, EHighlightPosition part, S32 index) { + loadKeywords(); + //evil recursive string atomizer. LLSD ret_llsd, start_llsd, middle_llsd, end_llsd; @@ -195,6 +182,8 @@ LLSD LLTextParser::parsePartialLineHighlights(const std::string &text, const LLC bool LLTextParser::parseFullLineHighlights(const std::string &text, LLColor4 *color) { + loadKeywords(); + for (S32 i=0;i<mHighlights.size();i++) { if ((S32)mHighlights[i]["highlight"]==ALL || (S32)mHighlights[i]["condition"]==MATCHES) @@ -221,14 +210,14 @@ std::string LLTextParser::getFileName() return path; } -LLSD LLTextParser::loadFromDisk() +void LLTextParser::loadKeywords() { - std::string filename=getFileName(); - if (filename.empty()) - { - llwarns << "LLTextParser::loadFromDisk() no valid user directory." << llendl; + if (mLoaded) + {// keywords already loaded + return; } - else + std::string filename=getFileName(); + if (!filename.empty()) { llifstream file; file.open(filename.c_str()); @@ -237,9 +226,8 @@ LLSD LLTextParser::loadFromDisk() LLSDSerialize::fromXML(mHighlights, file); } file.close(); + mLoaded = true; } - - return mHighlights; } bool LLTextParser::saveToDisk(LLSD highlights) diff --git a/indra/llui/lltextparser.h b/indra/llui/lltextparser.h index 072ac0f300..3005822f43 100644 --- a/indra/llui/lltextparser.h +++ b/indra/llui/lltextparser.h @@ -35,12 +35,13 @@ #define LL_LLTEXTPARSER_H #include "llsd.h" +#include "llsingleton.h" class LLUUID; class LLVector3d; class LLColor4; -class LLTextParser +class LLTextParser : public LLSingleton<LLTextParser> { public: typedef enum e_condition_type { CONTAINS, MATCHES, STARTS_WITH, ENDS_WITH } EConditionType; @@ -48,22 +49,20 @@ public: typedef enum e_highlight_position { WHOLE, START, MIDDLE, END } EHighlightPosition; typedef enum e_dialog_action { ACTION_NONE, ACTION_CLOSE, ACTION_ADD, ACTION_COPY, ACTION_UPDATE } EDialogAction; - static LLTextParser* getInstance(); - LLTextParser(){}; - ~LLTextParser(); + LLTextParser(); - S32 findPattern(const std::string &text, LLSD highlight); LLSD parsePartialLineHighlights(const std::string &text,const LLColor4 &color, EHighlightPosition part=WHOLE, S32 index=0); bool parseFullLineHighlights(const std::string &text, LLColor4 *color); +private: + S32 findPattern(const std::string &text, LLSD highlight); std::string getFileName(); - LLSD loadFromDisk(); + void loadKeywords(); bool saveToDisk(LLSD highlights); public: LLSD mHighlights; -private: - static LLTextParser* sInstance; + bool mLoaded; }; #endif diff --git a/indra/llui/lltextutil.cpp b/indra/llui/lltextutil.cpp new file mode 100644 index 0000000000..c5f3929fb1 --- /dev/null +++ b/indra/llui/lltextutil.cpp @@ -0,0 +1,79 @@ +/** + * @file lltextutil.cpp + * @brief Misc text-related auxiliary methods + * + * $LicenseInfo:firstyear=2009&license=viewergpl$ + * + * Copyright (c) 2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "lltextutil.h" + +#include "lluicolor.h" +#include "lltextbox.h" + + +void LLTextUtil::textboxSetHighlightedVal(LLTextBox *txtbox, const LLStyle::Params& normal_style, const std::string& text, const std::string& hl) +{ + static LLUIColor sFilterTextColor = LLUIColorTable::instance().getColor("FilterTextColor", LLColor4::green); + + std::string text_uc = text; + LLStringUtil::toUpper(text_uc); + + size_t hl_begin = 0, hl_len = hl.size(); + + if (hl_len == 0 || (hl_begin = text_uc.find(hl)) == std::string::npos) + { + txtbox->setText(text, normal_style); + return; + } + + LLStyle::Params hl_style = normal_style; + hl_style.color = sFilterTextColor; + + txtbox->setText(LLStringUtil::null); // clear text + txtbox->appendText(text.substr(0, hl_begin), false, normal_style); + txtbox->appendText(text.substr(hl_begin, hl_len), false, hl_style); + txtbox->appendText(text.substr(hl_begin + hl_len), false, normal_style); +} + +const std::string& LLTextUtil::formatPhoneNumber(const std::string& phone_str) +{ + static const std::string PHONE_SEPARATOR = LLUI::sSettingGroups["config"]->getString("AvalinePhoneSeparator"); + static const S32 PHONE_PART_LEN = 2; + + static std::string formatted_phone_str; + formatted_phone_str = phone_str; + S32 separator_pos = (S32)(formatted_phone_str.size()) - PHONE_PART_LEN; + for (; separator_pos >= PHONE_PART_LEN; separator_pos -= PHONE_PART_LEN) + { + formatted_phone_str.insert(separator_pos, PHONE_SEPARATOR); + } + + return formatted_phone_str; +} + +// EOF diff --git a/indra/llui/lltextutil.h b/indra/llui/lltextutil.h new file mode 100644 index 0000000000..325c3c5b7c --- /dev/null +++ b/indra/llui/lltextutil.h @@ -0,0 +1,72 @@ +/** + * @file lltextutil.h + * @brief Misc text-related auxiliary methods + * + * $LicenseInfo:firstyear=2009&license=viewergpl$ + * + * Copyright (c) 2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLTEXTUTIL_H +#define LL_LLTEXTUTIL_H + +#include "llstyle.h" + +class LLTextBox; + +namespace LLTextUtil +{ + + /** + * Set value for text box, highlighting substring hl_uc. + * + * Used to highlight filter matches. + * + * @param txtbox Text box to set value for + * @param normal_style Style to use for non-highlighted text + * @param text Text to set + * @param hl Upper-cased string to highlight + */ + void textboxSetHighlightedVal( + LLTextBox *txtbox, + const LLStyle::Params& normal_style, + const std::string& text, + const std::string& hl); + + /** + * Formats passed phone number to be more human readable. + * + * It just divides the number on parts by two digits from right to left. The first left part + * can have 2 or 3 digits, i.e. +44-33-33-44-55-66 or 12-34-56-78-90. Separator is set in + * application settings (AvalinePhoneSeparator) + * + * @param[in] phone_str string with original phone number + * @return reference to string with formatted phone number + */ + const std::string& formatPhoneNumber(const std::string& phone_str); +} + +#endif // LL_LLTEXTUTIL_H diff --git a/indra/llui/lltextvalidate.cpp b/indra/llui/lltextvalidate.cpp new file mode 100644 index 0000000000..8b6bc5bd7d --- /dev/null +++ b/indra/llui/lltextvalidate.cpp @@ -0,0 +1,302 @@ +/** + * @file lltextvalidate.cpp + * @brief Text validation helper functions + * + * $LicenseInfo:firstyear=2001&license=viewergpl$ + * + * Copyright (c) 2001-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +// Text editor widget to let users enter a single line. + +#include "linden_common.h" + +#include "lltextvalidate.h" +#include "llresmgr.h" // for LLLocale + +namespace LLTextValidate +{ + void ValidateTextNamedFuncs::declareValues() + { + declare("ascii", validateASCII); + declare("float", validateFloat); + declare("int", validateInt); + declare("positive_s32", validatePositiveS32); + declare("non_negative_s32", validateNonNegativeS32); + declare("alpha_num", validateAlphaNum); + declare("alpha_num_space", validateAlphaNumSpace); + declare("ascii_printable_no_pipe", validateASCIIPrintableNoPipe); + declare("ascii_printable_no_space", validateASCIIPrintableNoSpace); + } + + // Limits what characters can be used to [1234567890.-] with [-] only valid in the first position. + // Does NOT ensure that the string is a well-formed number--that's the job of post-validation--for + // the simple reasons that intermediate states may be invalid even if the final result is valid. + // + bool validateFloat(const LLWString &str) + { + LLLocale locale(LLLocale::USER_LOCALE); + + bool success = TRUE; + LLWString trimmed = str; + LLWStringUtil::trim(trimmed); + S32 len = trimmed.length(); + if( 0 < len ) + { + // May be a comma or period, depending on the locale + llwchar decimal_point = (llwchar)LLResMgr::getInstance()->getDecimalPoint(); + + S32 i = 0; + + // First character can be a negative sign + if( '-' == trimmed[0] ) + { + i++; + } + + for( ; i < len; i++ ) + { + if( (decimal_point != trimmed[i] ) && !LLStringOps::isDigit( trimmed[i] ) ) + { + success = FALSE; + break; + } + } + } + + return success; + } + + // Limits what characters can be used to [1234567890-] with [-] only valid in the first position. + // Does NOT ensure that the string is a well-formed number--that's the job of post-validation--for + // the simple reasons that intermediate states may be invalid even if the final result is valid. + // + bool validateInt(const LLWString &str) + { + LLLocale locale(LLLocale::USER_LOCALE); + + bool success = TRUE; + LLWString trimmed = str; + LLWStringUtil::trim(trimmed); + S32 len = trimmed.length(); + if( 0 < len ) + { + S32 i = 0; + + // First character can be a negative sign + if( '-' == trimmed[0] ) + { + i++; + } + + for( ; i < len; i++ ) + { + if( !LLStringOps::isDigit( trimmed[i] ) ) + { + success = FALSE; + break; + } + } + } + + return success; + } + + bool validatePositiveS32(const LLWString &str) + { + LLLocale locale(LLLocale::USER_LOCALE); + + LLWString trimmed = str; + LLWStringUtil::trim(trimmed); + S32 len = trimmed.length(); + bool success = TRUE; + if(0 < len) + { + if(('-' == trimmed[0]) || ('0' == trimmed[0])) + { + success = FALSE; + } + S32 i = 0; + while(success && (i < len)) + { + if(!LLStringOps::isDigit(trimmed[i++])) + { + success = FALSE; + } + } + } + if (success) + { + S32 val = strtol(wstring_to_utf8str(trimmed).c_str(), NULL, 10); + if (val <= 0) + { + success = FALSE; + } + } + return success; + } + + bool validateNonNegativeS32(const LLWString &str) + { + LLLocale locale(LLLocale::USER_LOCALE); + + LLWString trimmed = str; + LLWStringUtil::trim(trimmed); + S32 len = trimmed.length(); + bool success = TRUE; + if(0 < len) + { + if('-' == trimmed[0]) + { + success = FALSE; + } + S32 i = 0; + while(success && (i < len)) + { + if(!LLStringOps::isDigit(trimmed[i++])) + { + success = FALSE; + } + } + } + if (success) + { + S32 val = strtol(wstring_to_utf8str(trimmed).c_str(), NULL, 10); + if (val < 0) + { + success = FALSE; + } + } + return success; + } + + bool validateAlphaNum(const LLWString &str) + { + LLLocale locale(LLLocale::USER_LOCALE); + + bool rv = TRUE; + S32 len = str.length(); + if(len == 0) return rv; + while(len--) + { + if( !LLStringOps::isAlnum((char)str[len]) ) + { + rv = FALSE; + break; + } + } + return rv; + } + + bool validateAlphaNumSpace(const LLWString &str) + { + LLLocale locale(LLLocale::USER_LOCALE); + + bool rv = TRUE; + S32 len = str.length(); + if(len == 0) return rv; + while(len--) + { + if(!(LLStringOps::isAlnum((char)str[len]) || (' ' == str[len]))) + { + rv = FALSE; + break; + } + } + return rv; + } + + // Used for most names of things stored on the server, due to old file-formats + // that used the pipe (|) for multiline text storage. Examples include + // inventory item names, parcel names, object names, etc. + bool validateASCIIPrintableNoPipe(const LLWString &str) + { + bool rv = TRUE; + S32 len = str.length(); + if(len == 0) return rv; + while(len--) + { + llwchar wc = str[len]; + if (wc < 0x20 + || wc > 0x7f + || wc == '|') + { + rv = FALSE; + break; + } + if(!(wc == ' ' + || LLStringOps::isAlnum((char)wc) + || LLStringOps::isPunct((char)wc) ) ) + { + rv = FALSE; + break; + } + } + return rv; + } + + + // Used for avatar names + bool validateASCIIPrintableNoSpace(const LLWString &str) + { + bool rv = TRUE; + S32 len = str.length(); + if(len == 0) return rv; + while(len--) + { + llwchar wc = str[len]; + if (wc < 0x20 + || wc > 0x7f + || LLStringOps::isSpace(wc)) + { + rv = FALSE; + break; + } + if( !(LLStringOps::isAlnum((char)str[len]) || + LLStringOps::isPunct((char)str[len]) ) ) + { + rv = FALSE; + break; + } + } + return rv; + } + + bool validateASCII(const LLWString &str) + { + bool rv = TRUE; + S32 len = str.length(); + while(len--) + { + if (str[len] < 0x20 || str[len] > 0x7f) + { + rv = FALSE; + break; + } + } + return rv; + } +} diff --git a/indra/llui/lltextvalidate.h b/indra/llui/lltextvalidate.h new file mode 100644 index 0000000000..ffb4e85e7c --- /dev/null +++ b/indra/llui/lltextvalidate.h @@ -0,0 +1,63 @@ +/** + * @file lltextbase.h + * @author Martin Reddy + * @brief The base class of text box/editor, providing Url handling support + * + * $LicenseInfo:firstyear=2009&license=viewergpl$ + * + * Copyright (c) 2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLTEXTVALIDATE_H +#define LL_LLTEXTVALIDATE_H + +#include "llstring.h" +#include "llinitparam.h" +#include <boost/function.hpp> + +namespace LLTextValidate +{ + typedef boost::function<BOOL (const LLWString &wstr)> validate_func_t; + + struct ValidateTextNamedFuncs + : public LLInitParam::TypeValuesHelper<validate_func_t, ValidateTextNamedFuncs> + { + static void declareValues(); + }; + + bool validateFloat(const LLWString &str ); + bool validateInt(const LLWString &str ); + bool validatePositiveS32(const LLWString &str); + bool validateNonNegativeS32(const LLWString &str); + bool validateAlphaNum(const LLWString &str ); + bool validateAlphaNumSpace(const LLWString &str ); + bool validateASCIIPrintableNoPipe(const LLWString &str); + bool validateASCIIPrintableNoSpace(const LLWString &str); + bool validateASCII(const LLWString &str); +} + + +#endif diff --git a/indra/llui/lltooltip.cpp b/indra/llui/lltooltip.cpp index 173fde8e76..ed7fd02e14 100644 --- a/indra/llui/lltooltip.cpp +++ b/indra/llui/lltooltip.cpp @@ -129,12 +129,6 @@ BOOL LLToolTipView::handleScrollWheel( S32 x, S32 y, S32 clicks ) return FALSE; } -void LLToolTipView::onMouseLeave(S32 x, S32 y, MASK mask) -{ - LLToolTipMgr::instance().blockToolTips(); -} - - void LLToolTipView::drawStickyRect() { gl_rect_2d(LLToolTipMgr::instance().getMouseNearRect(), LLColor4::white, false); diff --git a/indra/llui/lltooltip.h b/indra/llui/lltooltip.h index 7978b6a583..24e32b9b24 100644 --- a/indra/llui/lltooltip.h +++ b/indra/llui/lltooltip.h @@ -56,8 +56,6 @@ public: /*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask); /*virtual*/ BOOL handleScrollWheel( S32 x, S32 y, S32 clicks ); - /*virtual*/ void onMouseLeave(S32 x, S32 y, MASK mask); - void drawStickyRect(); /*virtual*/ void draw(); @@ -129,7 +127,8 @@ private: class LLInspector : public LLToolTip { public: - struct Params : public LLInitParam::Block<Params, LLToolTip::Params> {}; + struct Params : public LLInitParam::Block<Params, LLToolTip::Params> + {}; }; class LLToolTipMgr : public LLSingleton<LLToolTipMgr> diff --git a/indra/llui/llui.cpp b/indra/llui/llui.cpp index 76f07373b4..bf12384a28 100644 --- a/indra/llui/llui.cpp +++ b/indra/llui/llui.cpp @@ -39,6 +39,7 @@ // Linden library includes #include "v2math.h" +#include "m3math.h" #include "v4color.h" #include "llrender.h" #include "llrect.h" @@ -55,6 +56,7 @@ #include "llfloaterreg.h" #include "llmenugl.h" #include "llmenubutton.h" +#include "llloadingindicator.h" #include "llwindow.h" // for registration @@ -85,12 +87,18 @@ std::list<std::string> gUntranslated; /*static*/ LLHelp* LLUI::sHelpImpl = NULL; /*static*/ std::vector<std::string> LLUI::sXUIPaths; /*static*/ LLFrameTimer LLUI::sMouseIdleTimer; +/*static*/ LLUI::add_popup_t LLUI::sAddPopupFunc; +/*static*/ LLUI::remove_popup_t LLUI::sRemovePopupFunc; +/*static*/ LLUI::clear_popups_t LLUI::sClearPopupsFunc; // register filtereditor here static LLDefaultChildRegistry::Register<LLFilterEditor> register_filter_editor("filter_editor"); static LLDefaultChildRegistry::Register<LLFlyoutButton> register_flyout_button("flyout_button"); static LLDefaultChildRegistry::Register<LLSearchEditor> register_search_editor("search_editor"); + +// register other widgets which otherwise may not be linked in static LLDefaultChildRegistry::Register<LLMenuButton> register_menu_button("menu_button"); +static LLDefaultChildRegistry::Register<LLLoadingIndicator> register_loading_indicator("loading_indicator"); // @@ -180,19 +188,19 @@ void gl_rect_2d_offset_local( S32 left, S32 top, S32 right, S32 bottom, const LL void gl_rect_2d_offset_local( S32 left, S32 top, S32 right, S32 bottom, S32 pixel_offset, BOOL filled) { - gGL.pushMatrix(); + gGL.pushUIMatrix(); left += LLFontGL::sCurOrigin.mX; right += LLFontGL::sCurOrigin.mX; bottom += LLFontGL::sCurOrigin.mY; top += LLFontGL::sCurOrigin.mY; - glLoadIdentity(); + gGL.loadUIIdentity(); gl_rect_2d(llfloor((F32)left * LLUI::sGLScaleFactor.mV[VX]) - pixel_offset, llfloor((F32)top * LLUI::sGLScaleFactor.mV[VY]) + pixel_offset, llfloor((F32)right * LLUI::sGLScaleFactor.mV[VX]) + pixel_offset, llfloor((F32)bottom * LLUI::sGLScaleFactor.mV[VY]) - pixel_offset, filled); - gGL.popMatrix(); + gGL.popUIMatrix(); } @@ -203,7 +211,7 @@ void gl_rect_2d(S32 left, S32 top, S32 right, S32 bottom, BOOL filled ) // Counterclockwise quad will face the viewer if( filled ) - { + { gGL.begin( LLRender::QUADS ); gGL.vertex2i(left, top); gGL.vertex2i(left, bottom); @@ -508,9 +516,9 @@ void gl_draw_scaled_image_with_border(S32 x, S32 y, S32 width, S32 height, LLTex gGL.getTexUnit(0)->setTextureAlphaBlend(LLTexUnit::TBO_MULT, LLTexUnit::TBS_TEX_ALPHA, LLTexUnit::TBS_VERT_ALPHA); } - gGL.pushMatrix(); + gGL.pushUIMatrix(); { - gGL.translatef((F32)x, (F32)y, 0.f); + gGL.translateUI((F32)x, (F32)y, 0.f); gGL.getTexUnit(0)->bind(image); @@ -637,7 +645,7 @@ void gl_draw_scaled_image_with_border(S32 x, S32 y, S32 width, S32 height, LLTex } gGL.end(); } - gGL.popMatrix(); + gGL.popUIMatrix(); if (solid_color) { @@ -660,39 +668,72 @@ void gl_draw_scaled_rotated_image(S32 x, S32 y, S32 width, S32 height, F32 degre LLGLSUIDefault gls_ui; - gGL.pushMatrix(); + + gGL.getTexUnit(0)->bind(image); + + gGL.color4fv(color.mV); + + if (degrees == 0.f) { - gGL.translatef((F32)x, (F32)y, 0.f); - if( degrees ) + gGL.pushUIMatrix(); + gGL.translateUI((F32)x, (F32)y, 0.f); + + gGL.begin(LLRender::QUADS); { - F32 offset_x = F32(width/2); - F32 offset_y = F32(height/2); - gGL.translatef( offset_x, offset_y, 0.f); - glRotatef( degrees, 0.f, 0.f, 1.f ); - gGL.translatef( -offset_x, -offset_y, 0.f ); + gGL.texCoord2f(uv_rect.mRight, uv_rect.mTop); + gGL.vertex2i(width, height ); + + gGL.texCoord2f(uv_rect.mLeft, uv_rect.mTop); + gGL.vertex2i(0, height ); + + gGL.texCoord2f(uv_rect.mLeft, uv_rect.mBottom); + gGL.vertex2i(0, 0); + + gGL.texCoord2f(uv_rect.mRight, uv_rect.mBottom); + gGL.vertex2i(width, 0); } + gGL.end(); + gGL.popUIMatrix(); + } + else + { + gGL.pushUIMatrix(); + gGL.translateUI((F32)x, (F32)y, 0.f); + + F32 offset_x = F32(width/2); + F32 offset_y = F32(height/2); + + gGL.translateUI(offset_x, offset_y, 0.f); + LLMatrix3 quat(0.f, 0.f, degrees*DEG_TO_RAD); + gGL.getTexUnit(0)->bind(image); gGL.color4fv(color.mV); gGL.begin(LLRender::QUADS); { + LLVector3 v; + + v = LLVector3(offset_x, offset_y, 0.f) * quat; gGL.texCoord2f(uv_rect.mRight, uv_rect.mTop); - gGL.vertex2i(width, height ); + gGL.vertex2f(v.mV[0], v.mV[1] ); + v = LLVector3(-offset_x, offset_y, 0.f) * quat; gGL.texCoord2f(uv_rect.mLeft, uv_rect.mTop); - gGL.vertex2i(0, height ); + gGL.vertex2f(v.mV[0], v.mV[1] ); + v = LLVector3(-offset_x, -offset_y, 0.f) * quat; gGL.texCoord2f(uv_rect.mLeft, uv_rect.mBottom); - gGL.vertex2i(0, 0); + gGL.vertex2f(v.mV[0], v.mV[1] ); + v = LLVector3(offset_x, -offset_y, 0.f) * quat; gGL.texCoord2f(uv_rect.mRight, uv_rect.mBottom); - gGL.vertex2i(width, 0); + gGL.vertex2f(v.mV[0], v.mV[1] ); } gGL.end(); + gGL.popUIMatrix(); } - gGL.popMatrix(); } @@ -747,9 +788,9 @@ void gl_arc_2d(F32 center_x, F32 center_y, F32 radius, S32 steps, BOOL filled, F end_angle += F_TWO_PI; } - gGL.pushMatrix(); + gGL.pushUIMatrix(); { - gGL.translatef(center_x, center_y, 0.f); + gGL.translateUI(center_x, center_y, 0.f); // Inexact, but reasonably fast. F32 delta = (end_angle - start_angle) / steps; @@ -780,15 +821,15 @@ void gl_arc_2d(F32 center_x, F32 center_y, F32 radius, S32 steps, BOOL filled, F } gGL.end(); } - gGL.popMatrix(); + gGL.popUIMatrix(); } void gl_circle_2d(F32 center_x, F32 center_y, F32 radius, S32 steps, BOOL filled) { - gGL.pushMatrix(); + gGL.pushUIMatrix(); { gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - gGL.translatef(center_x, center_y, 0.f); + gGL.translateUI(center_x, center_y, 0.f); // Inexact, but reasonably fast. F32 delta = F_TWO_PI / steps; @@ -819,7 +860,7 @@ void gl_circle_2d(F32 center_x, F32 center_y, F32 radius, S32 steps, BOOL filled } gGL.end(); } - gGL.popMatrix(); + gGL.popUIMatrix(); } // Renders a ring with sides (tube shape) @@ -846,9 +887,9 @@ void gl_deep_circle( F32 radius, F32 depth, S32 steps ) void gl_ring( F32 radius, F32 width, const LLColor4& center_color, const LLColor4& side_color, S32 steps, BOOL render_center ) { - gGL.pushMatrix(); + gGL.pushUIMatrix(); { - gGL.translatef(0.f, 0.f, -width / 2); + gGL.translateUI(0.f, 0.f, -width / 2); if( render_center ) { gGL.color4fv(center_color.mV); @@ -857,11 +898,11 @@ void gl_ring( F32 radius, F32 width, const LLColor4& center_color, const LLColor else { gl_washer_2d(radius, radius - width, steps, side_color, side_color); - gGL.translatef(0.f, 0.f, width); + gGL.translateUI(0.f, 0.f, width); gl_washer_2d(radius - width, radius, steps, side_color, side_color); } } - gGL.popMatrix(); + gGL.popUIMatrix(); } // Draw gray and white checkerboard with black border @@ -1050,9 +1091,9 @@ void gl_segmented_rect_2d_tex(const S32 left, S32 width = llabs(right - left); S32 height = llabs(top - bottom); - gGL.pushMatrix(); + gGL.pushUIMatrix(); - gGL.translatef((F32)left, (F32)bottom, 0.f); + gGL.translateUI((F32)left, (F32)bottom, 0.f); LLVector2 border_uv_scale((F32)border_size / (F32)texture_width, (F32)border_size / (F32)texture_height); if (border_uv_scale.mV[VX] > 0.5f) @@ -1193,7 +1234,7 @@ void gl_segmented_rect_2d_tex(const S32 left, } gGL.end(); - gGL.popMatrix(); + gGL.popUIMatrix(); } void gl_segmented_rect_2d_fragment_tex(const S32 left, @@ -1210,9 +1251,9 @@ void gl_segmented_rect_2d_fragment_tex(const S32 left, S32 width = llabs(right - left); S32 height = llabs(top - bottom); - gGL.pushMatrix(); + gGL.pushUIMatrix(); - gGL.translatef((F32)left, (F32)bottom, 0.f); + gGL.translateUI((F32)left, (F32)bottom, 0.f); LLVector2 border_uv_scale((F32)border_size / (F32)texture_width, (F32)border_size / (F32)texture_height); if (border_uv_scale.mV[VX] > 0.5f) @@ -1383,7 +1424,7 @@ void gl_segmented_rect_2d_fragment_tex(const S32 left, } gGL.end(); - gGL.popMatrix(); + gGL.popUIMatrix(); } void gl_segmented_rect_3d_tex(const LLVector2& border_scale, const LLVector3& border_width, @@ -1573,6 +1614,13 @@ void LLUI::cleanupClass() sImageProvider->cleanUp(); } +void LLUI::setPopupFuncs(const add_popup_t& add_popup, const remove_popup_t& remove_popup, const clear_popups_t& clear_popups) +{ + sAddPopupFunc = add_popup; + sRemovePopupFunc = remove_popup; + sClearPopupsFunc = clear_popups; +} + //static void LLUI::dirtyRect(LLRect rect) { @@ -1591,7 +1639,7 @@ void LLUI::dirtyRect(LLRect rect) //static void LLUI::translate(F32 x, F32 y, F32 z) { - gGL.translatef(x,y,z); + gGL.translateUI(x,y,z); LLFontGL::sCurOrigin.mX += (S32) x; LLFontGL::sCurOrigin.mY += (S32) y; LLFontGL::sCurOrigin.mZ += z; @@ -1600,14 +1648,14 @@ void LLUI::translate(F32 x, F32 y, F32 z) //static void LLUI::pushMatrix() { - gGL.pushMatrix(); + gGL.pushUIMatrix(); LLFontGL::sOriginStack.push_back(LLFontGL::sCurOrigin); } //static void LLUI::popMatrix() { - gGL.popMatrix(); + gGL.popUIMatrix(); LLFontGL::sCurOrigin = *LLFontGL::sOriginStack.rbegin(); LLFontGL::sOriginStack.pop_back(); } @@ -1615,7 +1663,7 @@ void LLUI::popMatrix() //static void LLUI::loadIdentity() { - glLoadIdentity(); + gGL.loadUIIdentity(); LLFontGL::sCurOrigin.mX = 0; LLFontGL::sCurOrigin.mY = 0; LLFontGL::sCurOrigin.mZ = 0; @@ -1843,6 +1891,39 @@ LLControlGroup& LLUI::getControlControlGroup (const std::string& controlname) return *sSettingGroups["config"]; // default group } +//static +void LLUI::addPopup(LLView* viewp) +{ + if (sAddPopupFunc) + { + sAddPopupFunc(viewp); + } +} + +//static +void LLUI::removePopup(LLView* viewp) +{ + if (sRemovePopupFunc) + { + sRemovePopupFunc(viewp); + } +} + +//static +void LLUI::clearPopups() +{ + if (sClearPopupsFunc) + { + sClearPopupsFunc(); + } +} + +//static +void LLUI::reportBadKeystroke() +{ + make_ui_sound("UISndBadKeystroke"); +} + //static // spawn_x and spawn_y are top left corner of view in screen GL coordinates void LLUI::positionViewNearMouse(LLView* view, S32 spawn_x, S32 spawn_y) @@ -1894,7 +1975,9 @@ namespace LLInitParam blue("blue"), alpha("alpha"), control("") - {} + { + setBlockFromValue(); + } void TypedParam<LLUIColor>::setValueFromBlock() const { @@ -1939,7 +2022,9 @@ namespace LLInitParam size("size"), style("style") { + setBlockFromValue(); addSynonym(name, ""); + setBlockFromValue(); } void TypedParam<const LLFontGL*>::setValueFromBlock() const @@ -1979,7 +2064,9 @@ namespace LLInitParam bottom("bottom"), width("width"), height("height") - {} + { + setBlockFromValue(); + } void TypedParam<LLRect>::setValueFromBlock() const { @@ -2064,6 +2151,7 @@ namespace LLInitParam x("x"), y("y") { + setBlockFromValue(); } void TypedParam<LLCoordGL>::setValueFromBlock() const diff --git a/indra/llui/llui.h b/indra/llui/llui.h index 5840e76f5c..c18262ef76 100644 --- a/indra/llui/llui.h +++ b/indra/llui/llui.h @@ -160,12 +160,17 @@ public: // Methods // typedef std::map<std::string, LLControlGroup*> settings_map_t; + typedef boost::function<void(LLView*)> add_popup_t; + typedef boost::function<void(LLView*)> remove_popup_t; + typedef boost::function<void(void)> clear_popups_t; + static void initClass(const settings_map_t& settings, LLImageProviderInterface* image_provider, LLUIAudioCallback audio_callback = NULL, const LLVector2 *scale_factor = NULL, const std::string& language = LLStringUtil::null); static void cleanupClass(); + static void setPopupFuncs(const add_popup_t& add_popup, const remove_popup_t&, const clear_popups_t& ); static void pushMatrix(); static void popMatrix(); @@ -208,6 +213,12 @@ public: static void resetMouseIdleTimer() { sMouseIdleTimer.reset(); } static LLWindow* getWindow() { return sWindow; } + static void addPopup(LLView*); + static void removePopup(LLView*); + static void clearPopups(); + + static void reportBadKeystroke(); + // Ensures view does not overlap mouse cursor, but is inside // the view's parent rectangle. Used for tooltips, inspectors. // Optionally override the view's default X/Y, which are relative to the @@ -227,6 +238,9 @@ private: static LLImageProviderInterface* sImageProvider; static std::vector<std::string> sXUIPaths; static LLFrameTimer sMouseIdleTimer; + static add_popup_t sAddPopupFunc; + static remove_popup_t sRemovePopupFunc; + static clear_popups_t sClearPopupsFunc; }; @@ -426,8 +440,8 @@ namespace LLInitParam { typedef BlockValue<const LLFontGL*> super_t; public: - Mandatory<std::string> name; - Optional<std::string> size, + Optional<std::string> name, + size, style; TypedParam(BlockDescriptor& descriptor, const char* name, const LLFontGL* const value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count); diff --git a/indra/llui/lluicolortable.cpp b/indra/llui/lluicolortable.cpp index 9be33483d0..1b64ef3abe 100644 --- a/indra/llui/lluicolortable.cpp +++ b/indra/llui/lluicolortable.cpp @@ -56,7 +56,7 @@ LLUIColorTable::Params::Params() { } -void LLUIColorTable::insertFromParams(const Params& p) +void LLUIColorTable::insertFromParams(const Params& p, string_color_map_t& table) { // this map will contain all color references after the following loop typedef std::map<std::string, std::string> string_string_map_t; @@ -69,14 +69,7 @@ void LLUIColorTable::insertFromParams(const Params& p) ColorEntryParams color_entry = *it; if(color_entry.color.value.isChosen()) { - if(mUserSetColors.find(color_entry.name)!=mUserSetColors.end()) - { - setColor(color_entry.name, color_entry.color.value); - } - else - { - setColor(color_entry.name, color_entry.color.value, mLoadedColors); - } + setColor(color_entry.name, color_entry.color.value, table); } else { @@ -220,16 +213,16 @@ bool LLUIColorTable::loadFromSettings() bool result = false; std::string default_filename = gDirUtilp->getExpandedFilename(LL_PATH_DEFAULT_SKIN, "colors.xml"); - result |= loadFromFilename(default_filename); + result |= loadFromFilename(default_filename, mLoadedColors); std::string current_filename = gDirUtilp->getExpandedFilename(LL_PATH_TOP_SKIN, "colors.xml"); if(current_filename != default_filename) { - result |= loadFromFilename(current_filename); + result |= loadFromFilename(current_filename, mLoadedColors); } std::string user_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "colors.xml"); - loadFromFilename(user_filename); + loadFromFilename(user_filename, mUserSetColors); return result; } @@ -299,7 +292,7 @@ void LLUIColorTable::setColor(const std::string& name, const LLColor4& color, st } } -bool LLUIColorTable::loadFromFilename(const std::string& filename) +bool LLUIColorTable::loadFromFilename(const std::string& filename, string_color_map_t& table) { LLXMLNodePtr root; @@ -320,7 +313,7 @@ bool LLUIColorTable::loadFromFilename(const std::string& filename) if(params.validateBlock()) { - insertFromParams(params); + insertFromParams(params, table); } else { @@ -330,3 +323,11 @@ bool LLUIColorTable::loadFromFilename(const std::string& filename) return true; } + +void LLUIColorTable::insertFromParams(const Params& p) +{ + insertFromParams(p, mUserSetColors); +} + +// EOF + diff --git a/indra/llui/lluicolortable.h b/indra/llui/lluicolortable.h index c87695f456..d401e5e724 100644 --- a/indra/llui/lluicolortable.h +++ b/indra/llui/lluicolortable.h @@ -45,6 +45,10 @@ class LLUIColor; class LLUIColorTable : public LLSingleton<LLUIColorTable> { LOG_CLASS(LLUIColorTable); + + // consider using sorted vector, can be much faster + typedef std::map<std::string, LLUIColor> string_color_map_t; + public: struct ColorParams : LLInitParam::Choice<ColorParams> { @@ -91,10 +95,9 @@ public: void saveUserSettings() const; private: - bool loadFromFilename(const std::string& filename); + bool loadFromFilename(const std::string& filename, string_color_map_t& table); - // consider using sorted vector, can be much faster - typedef std::map<std::string, LLUIColor> string_color_map_t; + void insertFromParams(const Params& p, string_color_map_t& table); void clearTable(string_color_map_t& table); void setColor(const std::string& name, const LLColor4& color, string_color_map_t& table); diff --git a/indra/llui/lluictrlfactory.cpp b/indra/llui/lluictrlfactory.cpp index 27237800d4..930dadc377 100644 --- a/indra/llui/lluictrlfactory.cpp +++ b/indra/llui/lluictrlfactory.cpp @@ -435,7 +435,10 @@ void LLUICtrlFactory::registerWidget(const std::type_info* widget_type, const st std::string* existing_tag = LLWidgetNameRegistry::instance().getValue(param_block_type); if (existing_tag != NULL && *existing_tag != tag) { - llerrs << "Duplicate entry for T::Params, try creating empty param block in derived classes that inherit T::Params" << llendl; + std::cerr << "Duplicate entry for T::Params, try creating empty param block in derived classes that inherit T::Params" << std::endl; + // forcing crash here + char* foo = 0; + *foo = 1; } LLWidgetNameRegistry ::instance().defaultRegistrar().add(param_block_type, tag); // associate widget type with factory function diff --git a/indra/llui/lluifwd.h b/indra/llui/lluifwd.h index f99bb39fdd..d6047b943c 100644 --- a/indra/llui/lluifwd.h +++ b/indra/llui/lluifwd.h @@ -39,6 +39,7 @@ class LLComboBox; class LLDragHandle; class LLFloater; class LLIconCtrl; +class LLLoadingIndicator; class LLLineEditor; class LLMenuGL; class LLPanel; diff --git a/indra/llui/lluiimage.h b/indra/llui/lluiimage.h index bdfc44262d..4ea0738026 100644 --- a/indra/llui/lluiimage.h +++ b/indra/llui/lluiimage.h @@ -109,6 +109,7 @@ namespace LLInitParam TypedParam(BlockDescriptor& descriptor, const char* name, super_t::value_assignment_t value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count) : super_t(descriptor, name, value, func, min_count, max_count) { + setBlockFromValue(); } void setValueFromBlock() const; diff --git a/indra/llui/llurlaction.cpp b/indra/llui/llurlaction.cpp index 679db5e39b..2f13a56b42 100644 --- a/indra/llui/llurlaction.cpp +++ b/indra/llui/llurlaction.cpp @@ -146,3 +146,20 @@ void LLUrlAction::copyLabelToClipboard(std::string url) LLView::getWindow()->copyTextToClipboard(utf8str_to_wstring(match.getLabel())); } } + +void LLUrlAction::showProfile(std::string url) +{ + // Get id from 'secondlife:///app/{cmd}/{id}/{action}' + // and show its profile + LLURI uri(url); + LLSD path_array = uri.pathArray(); + if (path_array.size() == 4) + { + std::string id_str = path_array.get(2).asString(); + if (LLUUID::validate(id_str)) + { + std::string cmd_str = path_array.get(1).asString(); + executeSLURL("secondlife:///app/" + cmd_str + "/" + id_str + "/about"); + } + } +} diff --git a/indra/llui/llurlaction.h b/indra/llui/llurlaction.h index 4830cf27ef..b96faf1b3f 100644 --- a/indra/llui/llurlaction.h +++ b/indra/llui/llurlaction.h @@ -79,6 +79,9 @@ public: /// copy a Url to the clipboard static void copyURLToClipboard(std::string url); + /// if the Url specifies an SL command in the form like 'app/{cmd}/{id}/*', show its profile + static void showProfile(std::string url); + /// specify the callbacks to enable this class's functionality static void setOpenURLCallback(void (*cb) (const std::string& url)); static void setOpenURLInternalCallback(void (*cb) (const std::string& url)); diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp index 92b7816bdd..fd56a87345 100644 --- a/indra/llui/llurlentry.cpp +++ b/indra/llui/llurlentry.cpp @@ -34,11 +34,16 @@ #include "linden_common.h" #include "llurlentry.h" #include "lluri.h" +#include "llurlmatch.h" +#include "llurlregistry.h" #include "llcachename.h" #include "lltrans.h" #include "lluicolortable.h" +#define APP_HEADER_REGEX "((x-grid-location-info://[-\\w\\.]+/app)|(secondlife:///app))" + + LLUrlEntryBase::LLUrlEntryBase() : mColor(LLUIColorTable::instance().getColor("HTMLLinkColor")), mDisabledLink(false) @@ -232,7 +237,7 @@ std::string LLUrlEntryHTTPNoProtocol::getUrl(const std::string &string) const LLUrlEntrySLURL::LLUrlEntrySLURL() { // see http://slurl.com/about.php for details on the SLURL format - mPattern = boost::regex("http://(maps.secondlife.com|slurl.com)/secondlife/\\S+/?(\\d+)?/?(\\d+)?/?(\\d+)?/?\\S*", + mPattern = boost::regex("http://(maps.secondlife.com|slurl.com)/secondlife/[^ /]+(/\\d+){0,3}(/?(\\?title|\\?img|\\?msg)=\\S*)?/?", boost::regex::perl|boost::regex::icase); mMenuName = "menu_url_slurl.xml"; mTooltip = LLTrans::getString("TooltipSLURL"); @@ -287,7 +292,7 @@ std::string LLUrlEntrySLURL::getLabel(const std::string &url, const LLUrlLabelCa std::string LLUrlEntrySLURL::getLocation(const std::string &url) const { // return the part of the Url after slurl.com/secondlife/ - const std::string search_string = "secondlife"; + const std::string search_string = "/secondlife"; size_t pos = url.find(search_string); if (pos == std::string::npos) { @@ -301,10 +306,11 @@ std::string LLUrlEntrySLURL::getLocation(const std::string &url) const // // LLUrlEntryAgent Describes a Second Life agent Url, e.g., // secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about +// x-grid-location-info://lincoln.lindenlab.com/app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about // LLUrlEntryAgent::LLUrlEntryAgent() { - mPattern = boost::regex("secondlife:///app/agent/[\\da-f-]+/\\w+", + mPattern = boost::regex(APP_HEADER_REGEX "/agent/[\\da-f-]+/\\w+", boost::regex::perl|boost::regex::icase); mMenuName = "menu_url_agent.xml"; mIcon = "Generic_Person"; @@ -320,6 +326,38 @@ void LLUrlEntryAgent::onAgentNameReceived(const LLUUID& id, callObservers(id.asString(), first + " " + last); } +std::string LLUrlEntryAgent::getTooltip(const std::string &string) const +{ + // return a tooltip corresponding to the URL type instead of the generic one + std::string url = getUrl(string); + + if (LLStringUtil::endsWith(url, "/mute")) + { + return LLTrans::getString("TooltipAgentMute"); + } + if (LLStringUtil::endsWith(url, "/unmute")) + { + return LLTrans::getString("TooltipAgentUnmute"); + } + if (LLStringUtil::endsWith(url, "/im")) + { + return LLTrans::getString("TooltipAgentIM"); + } + if (LLStringUtil::endsWith(url, "/pay")) + { + return LLTrans::getString("TooltipAgentPay"); + } + if (LLStringUtil::endsWith(url, "/offerteleport")) + { + return LLTrans::getString("TooltipAgentOfferTeleport"); + } + if (LLStringUtil::endsWith(url, "/requestfriend")) + { + return LLTrans::getString("TooltipAgentRequestFriend"); + } + return LLTrans::getString("TooltipAgentUrl"); +} + std::string LLUrlEntryAgent::getLabel(const std::string &url, const LLUrlLabelCallback &cb) { if (!gCacheName) @@ -343,6 +381,31 @@ std::string LLUrlEntryAgent::getLabel(const std::string &url, const LLUrlLabelCa } else if (gCacheName->getFullName(agent_id, full_name)) { + // customize label string based on agent SLapp suffix + if (LLStringUtil::endsWith(url, "/mute")) + { + return LLTrans::getString("SLappAgentMute") + " " + full_name; + } + if (LLStringUtil::endsWith(url, "/unmute")) + { + return LLTrans::getString("SLappAgentUnmute") + " " + full_name; + } + if (LLStringUtil::endsWith(url, "/im")) + { + return LLTrans::getString("SLappAgentIM") + " " + full_name; + } + if (LLStringUtil::endsWith(url, "/pay")) + { + return LLTrans::getString("SLappAgentPay") + " " + full_name; + } + if (LLStringUtil::endsWith(url, "/offerteleport")) + { + return LLTrans::getString("SLappAgentOfferTeleport") + " " + full_name; + } + if (LLStringUtil::endsWith(url, "/requestfriend")) + { + return LLTrans::getString("SLappAgentRequestFriend") + " " + full_name; + } return full_name; } else @@ -359,10 +422,11 @@ std::string LLUrlEntryAgent::getLabel(const std::string &url, const LLUrlLabelCa // LLUrlEntryGroup Describes a Second Life group Url, e.g., // secondlife:///app/group/00005ff3-4044-c79f-9de8-fb28ae0df991/about // secondlife:///app/group/00005ff3-4044-c79f-9de8-fb28ae0df991/inspect +// x-grid-location-info://lincoln.lindenlab.com/app/group/00005ff3-4044-c79f-9de8-fb28ae0df991/inspect // LLUrlEntryGroup::LLUrlEntryGroup() { - mPattern = boost::regex("secondlife:///app/group/[\\da-f-]+/\\w+", + mPattern = boost::regex(APP_HEADER_REGEX "/group/[\\da-f-]+/\\w+", boost::regex::perl|boost::regex::icase); mMenuName = "menu_url_group.xml"; mIcon = "Generic_Group"; @@ -423,7 +487,8 @@ LLUrlEntryInventory::LLUrlEntryInventory() //*TODO: add supporting of inventory item names with whitespaces //this pattern cann't parse for example //secondlife:///app/inventory/0e346d8b-4433-4d66-a6b0-fd37083abc4c/select?name=name with spaces¶m2=value - mPattern = boost::regex("secondlife:///app/inventory/[\\da-f-]+/\\w+\\S*", + //x-grid-location-info://lincoln.lindenlab.com/app/inventory/0e346d8b-4433-4d66-a6b0-fd37083abc4c/select?name=name with spaces¶m2=value + mPattern = boost::regex(APP_HEADER_REGEX "/inventory/[\\da-f-]+/\\w+\\S*", boost::regex::perl|boost::regex::icase); mMenuName = "menu_url_inventory.xml"; } @@ -434,13 +499,43 @@ std::string LLUrlEntryInventory::getLabel(const std::string &url, const LLUrlLab return LLURI::unescape(label.empty() ? url : label); } +// +// LLUrlEntryObjectIM Describes a Second Life inspector for the object Url, e.g., +// secondlife:///app/objectim/7bcd7864-da6b-e43f-4486-91d28a28d95b?name=Object&owner=3de548e1-57be-cfea-2b78-83ae3ad95998&slurl=Danger!%20Danger!/200/200/30/&groupowned=1 +// +LLUrlEntryObjectIM::LLUrlEntryObjectIM() +{ + mPattern = boost::regex("secondlife:///app/objectim/[\\da-f-]+\?.*", + boost::regex::perl|boost::regex::icase); + mMenuName = "menu_url_objectim.xml"; +} + +std::string LLUrlEntryObjectIM::getLabel(const std::string &url, const LLUrlLabelCallback &cb) +{ + LLURI uri(url); + LLSD query_map = uri.queryMap(); + if (query_map.has("name")) + return query_map["name"]; + return unescapeUrl(url); +} + +std::string LLUrlEntryObjectIM::getLocation(const std::string &url) const +{ + LLURI uri(url); + LLSD query_map = uri.queryMap(); + if (query_map.has("slurl")) + return query_map["slurl"]; + return LLUrlEntryBase::getLocation(url); +} + /// /// LLUrlEntryParcel Describes a Second Life parcel Url, e.g., /// secondlife:///app/parcel/0000060e-4b39-e00b-d0c3-d98b1934e3a8/about +/// x-grid-location-info://lincoln.lindenlab.com/app/parcel/0000060e-4b39-e00b-d0c3-d98b1934e3a8/about /// LLUrlEntryParcel::LLUrlEntryParcel() { - mPattern = boost::regex("secondlife:///app/parcel/[\\da-f-]+/about", + mPattern = boost::regex(APP_HEADER_REGEX "/parcel/[\\da-f-]+/about", boost::regex::perl|boost::regex::icase); mMenuName = "menu_url_parcel.xml"; mTooltip = LLTrans::getString("TooltipParcelUrl"); @@ -456,7 +551,7 @@ std::string LLUrlEntryParcel::getLabel(const std::string &url, const LLUrlLabelC // LLUrlEntryPlace::LLUrlEntryPlace() { - mPattern = boost::regex("secondlife://\\S+/?(\\d+/\\d+/\\d+|\\d+/\\d+)/?", + mPattern = boost::regex("((x-grid-location-info://[-\\w\\.]+/region/)|(secondlife://))\\S+/?(\\d+/\\d+/\\d+|\\d+/\\d+)/?", boost::regex::perl|boost::regex::icase); mMenuName = "menu_url_slurl.xml"; mTooltip = LLTrans::getString("TooltipSLURL"); @@ -501,10 +596,11 @@ std::string LLUrlEntryPlace::getLocation(const std::string &url) const // // LLUrlEntryTeleport Describes a Second Life teleport Url, e.g., // secondlife:///app/teleport/Ahern/50/50/50/ +// x-grid-location-info://lincoln.lindenlab.com/app/teleport/Ahern/50/50/50/ // LLUrlEntryTeleport::LLUrlEntryTeleport() { - mPattern = boost::regex("secondlife:///app/teleport/\\S+(/\\d+)?(/\\d+)?(/\\d+)?/?\\S*", + mPattern = boost::regex(APP_HEADER_REGEX "/teleport/\\S+(/\\d+)?(/\\d+)?(/\\d+)?/?\\S*", boost::regex::perl|boost::regex::icase); mMenuName = "menu_url_teleport.xml"; mTooltip = LLTrans::getString("TooltipTeleportUrl"); @@ -522,7 +618,12 @@ std::string LLUrlEntryTeleport::getLabel(const std::string &url, const LLUrlLabe LLURI uri(url); LLSD path_array = uri.pathArray(); S32 path_parts = path_array.size(); - const std::string label = LLTrans::getString("SLurlLabelTeleport"); + std::string host = uri.hostName(); + std::string label = LLTrans::getString("SLurlLabelTeleport"); + if (!host.empty()) + { + label += " " + host; + } if (path_parts == 6) { // handle teleport url with (X,Y,Z) coordinates @@ -602,12 +703,26 @@ std::string LLUrlEntrySLLabel::getUrl(const std::string &string) const return getUrlFromWikiLink(string); } +std::string LLUrlEntrySLLabel::getTooltip(const std::string &string) const +{ + // return a tooltip corresponding to the URL type instead of the generic one (EXT-4574) + std::string url = getUrl(string); + LLUrlMatch match; + if (LLUrlRegistry::instance().findUrl(url, match)) + { + return match.getTooltip(); + } + + // unrecognized URL? should not happen + return LLUrlEntryBase::getTooltip(string); +} + // // LLUrlEntryWorldMap Describes secondlife:///<location> URLs // LLUrlEntryWorldMap::LLUrlEntryWorldMap() { - mPattern = boost::regex("secondlife:///app/worldmap/\\S+/?(\\d+)?/?(\\d+)?/?(\\d+)?/?\\S*", + mPattern = boost::regex(APP_HEADER_REGEX "/worldmap/\\S+/?(\\d+)?/?(\\d+)?/?(\\d+)?/?\\S*", boost::regex::perl|boost::regex::icase); mMenuName = "menu_url_map.xml"; mTooltip = LLTrans::getString("TooltipMapUrl"); @@ -630,7 +745,7 @@ std::string LLUrlEntryWorldMap::getLabel(const std::string &url, const LLUrlLabe } const std::string label = LLTrans::getString("SLurlLabelShowOnMap"); - std::string location = path_array[2]; + std::string location = unescapeUrl(path_array[2]); std::string x = (path_parts > 3) ? path_array[3] : "128"; std::string y = (path_parts > 4) ? path_array[4] : "128"; std::string z = (path_parts > 5) ? path_array[5] : "0"; @@ -663,3 +778,35 @@ std::string LLUrlEntryNoLink::getLabel(const std::string &url, const LLUrlLabelC { return getUrl(url); } + +// +// LLUrlEntryIcon describes an icon with <icon>...</icon> tags +// +LLUrlEntryIcon::LLUrlEntryIcon() +{ + mPattern = boost::regex("<icon\\s*>\\s*([^<]*)?\\s*</icon\\s*>", + boost::regex::perl|boost::regex::icase); + mDisabledLink = true; +} + +std::string LLUrlEntryIcon::getUrl(const std::string &url) const +{ + return LLStringUtil::null; +} + +std::string LLUrlEntryIcon::getLabel(const std::string &url, const LLUrlLabelCallback &cb) +{ + return LLStringUtil::null; +} + +std::string LLUrlEntryIcon::getIcon(const std::string &url) +{ + // Grep icon info between <icon>...</icon> tags + // matches[1] contains the icon name/path + boost::match_results<std::string::const_iterator> matches; + mIcon = (boost::regex_match(url, matches, mPattern) && matches[1].matched) + ? matches[1] + : LLStringUtil::null; + LLStringUtil::trim(mIcon); + return mIcon; +} diff --git a/indra/llui/llurlentry.h b/indra/llui/llurlentry.h index 3abada0f24..3c21fe8d61 100644 --- a/indra/llui/llurlentry.h +++ b/indra/llui/llurlentry.h @@ -77,13 +77,13 @@ public: virtual std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb) { return url; } /// Return an icon that can be displayed next to Urls of this type - std::string getIcon() const { return mIcon; } + virtual std::string getIcon(const std::string &url) { return mIcon; } /// Return the color to render the displayed text LLUIColor getColor() const { return mColor; } /// Given a matched Url, return a tooltip string for the hyperlink - std::string getTooltip() const { return mTooltip; } + virtual std::string getTooltip(const std::string &string) const { return mTooltip; } /// Return the name of a XUI file containing the context menu items std::string getMenuName() const { return mMenuName; } @@ -94,6 +94,8 @@ public: /// is this a match for a URL that should not be hyperlinked? bool isLinkDisabled() const { return mDisabledLink; } + virtual LLUUID getID(const std::string &string) const { return LLUUID::null; } + protected: std::string getIDStringFromUrl(const std::string &url) const; std::string escapeUrl(const std::string &url) const; @@ -169,6 +171,7 @@ class LLUrlEntryAgent : public LLUrlEntryBase public: LLUrlEntryAgent(); /*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb); + /*virtual*/ std::string getTooltip(const std::string &string) const; private: void onAgentNameReceived(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group); @@ -200,6 +203,18 @@ public: private: }; +/// +/// LLUrlEntryObjectIM Describes a Second Life inspector for the object Url, e.g., +/// secondlife:///app/objectim/7bcd7864-da6b-e43f-4486-91d28a28d95b?name=Object&owner=3de548e1-57be-cfea-2b78-83ae3ad95998&slurl=Danger!%20Danger!/200/200/30/&groupowned=1 +/// +class LLUrlEntryObjectIM : public LLUrlEntryBase +{ +public: + LLUrlEntryObjectIM(); + /*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb); + /*virtual*/ std::string getLocation(const std::string &url) const; +private: +}; /// /// LLUrlEntryParcel Describes a Second Life parcel Url, e.g., @@ -257,6 +272,7 @@ public: LLUrlEntrySLLabel(); /*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb); /*virtual*/ std::string getUrl(const std::string &string) const; + /*virtual*/ std::string getTooltip(const std::string &string) const; }; /// @@ -282,4 +298,17 @@ public: /*virtual*/ std::string getUrl(const std::string &string) const; }; +/// +/// LLUrlEntryIcon describes an icon with <icon>...</icon> tags +/// +class LLUrlEntryIcon : public LLUrlEntryBase +{ +public: + LLUrlEntryIcon(); + /*virtual*/ std::string getUrl(const std::string &string) const; + /*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb); + /*virtual*/ std::string getIcon(const std::string &url); +}; + + #endif diff --git a/indra/llui/llurlmatch.cpp b/indra/llui/llurlmatch.cpp index 72a199c220..7c96665ce4 100644 --- a/indra/llui/llurlmatch.cpp +++ b/indra/llui/llurlmatch.cpp @@ -51,7 +51,7 @@ void LLUrlMatch::setValues(U32 start, U32 end, const std::string &url, const std::string &label, const std::string &tooltip, const std::string &icon, const LLUIColor& color, const std::string &menu, const std::string &location, - bool disabled_link) + bool disabled_link, const LLUUID& id) { mStart = start; mEnd = end; @@ -63,4 +63,5 @@ void LLUrlMatch::setValues(U32 start, U32 end, const std::string &url, mMenuName = menu; mLocation = location; mDisabledLink = disabled_link; + mID = id; } diff --git a/indra/llui/llurlmatch.h b/indra/llui/llurlmatch.h index e86762548b..78dd2c528f 100644 --- a/indra/llui/llurlmatch.h +++ b/indra/llui/llurlmatch.h @@ -90,7 +90,10 @@ public: void setValues(U32 start, U32 end, const std::string &url, const std::string &label, const std::string &tooltip, const std::string &icon, const LLUIColor& color, const std::string &menu, - const std::string &location, bool disabled_link); + const std::string &location, bool disabled_link + , const LLUUID& id ); + + const LLUUID& getID() const { return mID;} private: U32 mStart; @@ -101,6 +104,8 @@ private: std::string mIcon; std::string mMenuName; std::string mLocation; + + LLUUID mID; LLUIColor mColor; bool mDisabledLink; }; diff --git a/indra/llui/llurlregistry.cpp b/indra/llui/llurlregistry.cpp index 722dbe41b3..1f86f72faa 100644 --- a/indra/llui/llurlregistry.cpp +++ b/indra/llui/llurlregistry.cpp @@ -45,6 +45,7 @@ LLUrlRegistry::LLUrlRegistry() { // Urls are matched in the order that they were registered registerUrl(new LLUrlEntryNoLink()); + registerUrl(new LLUrlEntryIcon()); registerUrl(new LLUrlEntrySLURL()); registerUrl(new LLUrlEntryHTTP()); registerUrl(new LLUrlEntryHTTPLabel()); @@ -53,8 +54,10 @@ LLUrlRegistry::LLUrlRegistry() registerUrl(new LLUrlEntryParcel()); registerUrl(new LLUrlEntryTeleport()); registerUrl(new LLUrlEntryWorldMap()); + registerUrl(new LLUrlEntryObjectIM()); registerUrl(new LLUrlEntryPlace()); registerUrl(new LLUrlEntryInventory()); + registerUrl(new LLUrlEntryObjectIM()); //LLUrlEntrySL and LLUrlEntrySLLabel have more common pattern, //so it should be registered in the end of list registerUrl(new LLUrlEntrySL()); @@ -133,7 +136,8 @@ static bool stringHasUrl(const std::string &text) text.find(".net") != std::string::npos || text.find(".edu") != std::string::npos || text.find(".org") != std::string::npos || - text.find("<nolink>") != std::string::npos); + text.find("<nolink>") != std::string::npos || + text.find("<icon") != std::string::npos); } bool LLUrlRegistry::findUrl(const std::string &text, LLUrlMatch &match, const LLUrlLabelCallback &cb) @@ -174,12 +178,13 @@ bool LLUrlRegistry::findUrl(const std::string &text, LLUrlMatch &match, const LL match.setValues(match_start, match_end, match_entry->getUrl(url), match_entry->getLabel(url, cb), - match_entry->getTooltip(), - match_entry->getIcon(), + match_entry->getTooltip(url), + match_entry->getIcon(url), match_entry->getColor(), match_entry->getMenuName(), match_entry->getLocation(url), - match_entry->isLinkDisabled()); + match_entry->isLinkDisabled(), + match_entry->getID(url)); return true; } @@ -213,7 +218,8 @@ bool LLUrlRegistry::findUrl(const LLWString &text, LLUrlMatch &match, const LLUr match.getColor(), match.getMenuName(), match.getLocation(), - match.isLinkDisabled()); + match.isLinkDisabled(), + match.getID()); return true; } return false; diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp index f1b08c380b..bd56da9121 100644 --- a/indra/llui/llview.cpp +++ b/indra/llui/llview.cpp @@ -73,9 +73,9 @@ S32 LLView::sLastBottomXML = S32_MIN; std::vector<LLViewDrawContext*> LLViewDrawContext::sDrawContextStack; -#if LL_DEBUG +//#if LL_DEBUG BOOL LLView::sIsDrawing = FALSE; -#endif +//#endif // Compiler optimization, generate extern template template class LLView* LLView::getChild<class LLView>( @@ -107,8 +107,6 @@ LLView::Params::Params() top_delta("top_delta", S32_MAX), left_pad("left_pad"), left_delta("left_delta", S32_MAX), - center_horiz("center_horiz", false), - center_vert("center_vert", false), from_xui("from_xui", false), user_resize("user_resize"), auto_resize("auto_resize"), @@ -150,6 +148,10 @@ LLView::~LLView() { dirtyRect(); //llinfos << "Deleting view " << mName << ":" << (void*) this << llendl; + if (LLView::sIsDrawing) + { + lldebugs << "Deleting view " << mName << " during UI draw() phase" << llendl; + } // llassert(LLView::sIsDrawing == FALSE); // llassert_always(sDepth == 0); // avoid deleting views while drawing! It can subtly break list iterators @@ -592,11 +594,6 @@ void LLView::setVisible(BOOL visible) { if ( mVisible != visible ) { - if( !visible && (gFocusMgr.getTopCtrl() == this) ) - { - gFocusMgr.setTopCtrl( NULL ); - } - mVisible = visible; // notify children of visibility change if root, or part of visible hierarchy @@ -1326,7 +1323,6 @@ void LLView::drawChildren() localRectToScreen(viewp->getRect(),&screenRect); if ( rootRect.overlaps(screenRect) && LLUI::sDirtyRect.overlaps(screenRect)) { - glMatrixMode(GL_MODELVIEW); LLUI::pushMatrix(); { LLUI::translate((F32)viewp->getRect().mLeft, (F32)viewp->getRect().mBottom, 0.f); @@ -1350,8 +1346,6 @@ void LLView::drawChildren() } --sDepth; } - - gGL.getTexUnit(0)->disable(); } void LLView::dirtyRect() @@ -1720,6 +1714,7 @@ LLView* LLView::findChildView(const std::string& name, BOOL recurse) const for ( child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it) { LLView* childp = *child_it; + llassert(childp); if (childp->getName() == name) { return childp; @@ -1731,6 +1726,7 @@ LLView* LLView::findChildView(const std::string& name, BOOL recurse) const for ( child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it) { LLView* childp = *child_it; + llassert(childp); LLView* viewp = childp->findChildView(name, recurse); if ( viewp ) { @@ -2501,7 +2497,6 @@ void LLView::applyXUILayout(LLView::Params& p, LLView* parent) p.layout = parent->getLayout(); } - if (parent) { LLRect parent_rect = parent->getLocalRect(); @@ -2509,60 +2504,21 @@ void LLView::applyXUILayout(LLView::Params& p, LLView* parent) LLRect last_rect = parent->getLocalRect(); bool layout_topleft = (p.layout() == "topleft"); - if (layout_topleft) - { - //invert top to bottom - if (p.rect.top.isProvided()) p.rect.top = parent_rect.getHeight() - p.rect.top; - if (p.rect.bottom.isProvided()) p.rect.bottom = parent_rect.getHeight() - p.rect.bottom; - } // convert negative or centered coordinates to parent relative values // Note: some of this logic matches the logic in TypedParam<LLRect>::setValueFromBlock() + if (p.rect.left.isProvided() && p.rect.left < 0) p.rect.left = p.rect.left + parent_rect.getWidth(); + if (p.rect.right.isProvided() && p.rect.right < 0) p.rect.right = p.rect.right + parent_rect.getWidth(); + if (p.rect.bottom.isProvided() && p.rect.bottom < 0) p.rect.bottom = p.rect.bottom + parent_rect.getHeight(); + if (p.rect.top.isProvided() && p.rect.top < 0) p.rect.top = p.rect.top + parent_rect.getHeight(); - if (p.center_horiz) - { - if (p.rect.left.isProvided() && p.rect.right.isProvided()) - { - S32 width = p.rect.right - p.rect.left; - width = llmax(width, 0); - S32 offset = parent_rect.getWidth()/2 - width/2; - p.rect.left = p.rect.left + offset; - p.rect.right = p.rect.right + offset; - } - else - { - p.rect.left = p.rect.left + parent_rect.getWidth()/2 - p.rect.width/2; - p.rect.right.setProvided(false); // recalculate the right - } - } - else - { - if (p.rect.left.isProvided() && p.rect.left < 0) p.rect.left = p.rect.left + parent_rect.getWidth(); - if (p.rect.right.isProvided() && p.rect.right < 0) p.rect.right = p.rect.right + parent_rect.getWidth(); - } - if (p.center_vert) - { - if (p.rect.bottom.isProvided() && p.rect.top.isProvided()) - { - S32 height = p.rect.top - p.rect.bottom; - height = llmax(height, 0); - S32 offset = parent_rect.getHeight()/2 - height/2; - p.rect.bottom = p.rect.bottom + offset; - p.rect.top = p.rect.top + offset; - } - else - { - p.rect.bottom = p.rect.bottom + parent_rect.getHeight()/2 - p.rect.height/2; - p.rect.top.setProvided(false); // recalculate the top - } - } - else + if (layout_topleft) { - if (p.rect.bottom.isProvided() && p.rect.bottom < 0) p.rect.bottom = p.rect.bottom + parent_rect.getHeight(); - if (p.rect.top.isProvided() && p.rect.top < 0) p.rect.top = p.rect.top + parent_rect.getHeight(); + //invert top to bottom + if (p.rect.top.isProvided()) p.rect.top = parent_rect.getHeight() - p.rect.top; + if (p.rect.bottom.isProvided()) p.rect.bottom = parent_rect.getHeight() - p.rect.bottom; } - // DEPRECATE: automatically fall back to height of MIN_WIDGET_HEIGHT pixels if (!p.rect.height.isProvided() && !p.rect.top.isProvided() && p.rect.height == 0) { diff --git a/indra/llui/llview.h b/indra/llui/llview.h index c4d7313743..3779fedf34 100644 --- a/indra/llui/llview.h +++ b/indra/llui/llview.h @@ -143,9 +143,6 @@ public: left_pad, // from last right to my left left_delta; // from last left to my left - Optional<bool> center_horiz, - center_vert; - // these are nested attributes for LLLayoutPanel //FIXME: get parent context involved in parsing traversal Ignored user_resize, @@ -171,9 +168,9 @@ private: // widgets in general are not copyable LLView(const LLView& other) {}; public: -#if LL_DEBUG +//#if LL_DEBUG static BOOL sIsDrawing; -#endif +//#endif enum ESoundFlags { SILENT = 0, diff --git a/indra/llui/llviewborder.cpp b/indra/llui/llviewborder.cpp index 30717f87de..bd9c43c97f 100644 --- a/indra/llui/llviewborder.cpp +++ b/indra/llui/llviewborder.cpp @@ -125,14 +125,6 @@ void LLViewBorder::draw() llassert( FALSE ); // not implemented } } - else - if( STYLE_TEXTURE == mStyle ) - { - if( mTexture ) - { - drawTextures(); - } - } LLView::draw(); } @@ -255,56 +247,6 @@ void LLViewBorder::drawTwoPixelLines() gl_line_2d(left+1, bottom+1, right-1, bottom+1); } -void LLViewBorder::drawTextures() -{ - //LLGLSUIDefault gls_ui; - - //llassert( FALSE ); // TODO: finish implementing - - //gGL.color4fv(UI_VERTEX_COLOR.mV); - - //gGL.getTexUnit(0)->bind(mTexture); - //gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_WRAP); - - //drawTextureTrapezoid( 0.f, mBorderWidth, getRect().getWidth(), 0, 0 ); - //drawTextureTrapezoid( 90.f, mBorderWidth, getRect().getHeight(), (F32)getRect().getWidth(),0 ); - //drawTextureTrapezoid( 180.f, mBorderWidth, getRect().getWidth(), (F32)getRect().getWidth(),(F32)getRect().getHeight() ); - //drawTextureTrapezoid( 270.f, mBorderWidth, getRect().getHeight(), 0, (F32)getRect().getHeight() ); -} - - -void LLViewBorder::drawTextureTrapezoid( F32 degrees, S32 width, S32 length, F32 start_x, F32 start_y ) -{ - gGL.pushMatrix(); - { - gGL.translatef(start_x, start_y, 0.f); - glRotatef( degrees, 0, 0, 1 ); - - gGL.begin(LLRender::QUADS); - { - // width, width /---------\ length-width, width // - // / \ // - // / \ // - // /---------------\ // - // 0,0 length, 0 // - - gGL.texCoord2f( 0, 0 ); - gGL.vertex2i( 0, 0 ); - - gGL.texCoord2f( (GLfloat)length, 0 ); - gGL.vertex2i( length, 0 ); - - gGL.texCoord2f( (GLfloat)(length - width), (GLfloat)width ); - gGL.vertex2i( length - width, width ); - - gGL.texCoord2f( (GLfloat)width, (GLfloat)width ); - gGL.vertex2i( width, width ); - } - gGL.end(); - } - gGL.popMatrix(); -} - BOOL LLViewBorder::getBevelFromAttribute(LLXMLNodePtr node, LLViewBorder::EBevel& bevel_style) { if (node->hasAttribute("bevel_style")) diff --git a/indra/llui/llviewborder.h b/indra/llui/llviewborder.h index 92fd569325..342e84fd93 100644 --- a/indra/llui/llviewborder.h +++ b/indra/llui/llviewborder.h @@ -99,8 +99,7 @@ private: void drawOnePixelLines(); void drawTwoPixelLines(); void drawTextures(); - void drawTextureTrapezoid( F32 degrees, S32 width, S32 length, F32 start_x, F32 start_y ); - + EBevel mBevel; EStyle mStyle; LLUIColor mHighlightLight; diff --git a/indra/llui/tests/llurlentry_test.cpp b/indra/llui/tests/llurlentry_test.cpp index cbb303a059..4463b6cc6f 100644 --- a/indra/llui/tests/llurlentry_test.cpp +++ b/indra/llui/tests/llurlentry_test.cpp @@ -286,6 +286,13 @@ namespace tut "XXX secondlife:///App/AGENT/0E346D8B-4433-4d66-a6b0-fd37083abc4c/foobar", "secondlife:///App/AGENT/0E346D8B-4433-4d66-a6b0-fd37083abc4c/foobar"); + testRegex("Standalone Agent Url ", url, + "x-grid-location-info://lincoln.lindenlab.com/app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about", + "x-grid-location-info://lincoln.lindenlab.com/app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about"); + + testRegex("Standalone Agent Url Multicase with Text", url, + "M x-grid-location-info://lincoln.lindenlab.com/app/AGENT/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about M", + "x-grid-location-info://lincoln.lindenlab.com/app/AGENT/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about"); } template<> template<> @@ -315,6 +322,15 @@ namespace tut testRegex("Group Url multicase", url, "XXX secondlife:///APP/Group/00005FF3-4044-c79f-9de8-fb28ae0df991/About XXX", "secondlife:///APP/Group/00005FF3-4044-c79f-9de8-fb28ae0df991/About"); + + testRegex("Standalone Group Url ", url, + "x-grid-location-info://lincoln.lindenlab.com/app/group/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about", + "x-grid-location-info://lincoln.lindenlab.com/app/group/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about"); + + testRegex("Standalone Group Url Multicase ith Text", url, + "M x-grid-location-info://lincoln.lindenlab.com/app/GROUP/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about M", + "x-grid-location-info://lincoln.lindenlab.com/app/GROUP/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about"); + } template<> template<> @@ -361,7 +377,11 @@ namespace tut // DEV-35459: SLURLs and teleport Links not parsed properly testRegex("SLURL with quote", url, "XXX secondlife://A'ksha%20Oasis/41/166/701 XXX", - "secondlife://A%27ksha%20Oasis/41/166/701"); + "secondlife://A%27ksha%20Oasis/41/166/701"); + + testRegex("Standalone All Hands (50,50) [2] with text", url, + "XXX x-grid-location-info://lincoln.lindenlab.com/region/All%20Hands/50/50/50 XXX", + "x-grid-location-info://lincoln.lindenlab.com/region/All%20Hands/50/50/50"); } template<> template<> @@ -461,6 +481,10 @@ namespace tut testRegex("Teleport url with quote", url, "XXX secondlife:///app/teleport/A'ksha%20Oasis/41/166/701 XXX", "secondlife:///app/teleport/A%27ksha%20Oasis/41/166/701"); + + testRegex("Standalone All Hands", url, + "XXX x-grid-location-info://lincoln.lindenlab.com/app/teleport/All%20Hands/50/50/50 XXX", + "x-grid-location-info://lincoln.lindenlab.com/app/teleport/All%20Hands/50/50/50"); } template<> template<> diff --git a/indra/llui/tests/llurlmatch_test.cpp b/indra/llui/tests/llurlmatch_test.cpp index 24a32de268..06b850d233 100644 --- a/indra/llui/tests/llurlmatch_test.cpp +++ b/indra/llui/tests/llurlmatch_test.cpp @@ -54,7 +54,7 @@ namespace tut LLUrlMatch match; ensure("empty()", match.empty()); - match.setValues(0, 1, "http://secondlife.com", "Second Life", "", "", LLUIColor(), "", "", false); + match.setValues(0, 1, "http://secondlife.com", "Second Life", "", "", LLUIColor(), "", "", false,LLUUID::null); ensure("! empty()", ! match.empty()); } @@ -67,7 +67,7 @@ namespace tut LLUrlMatch match; ensure_equals("getStart() == 0", match.getStart(), 0); - match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "", false); + match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "", false,LLUUID::null); ensure_equals("getStart() == 10", match.getStart(), 10); } @@ -80,7 +80,7 @@ namespace tut LLUrlMatch match; ensure_equals("getEnd() == 0", match.getEnd(), 0); - match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "", false); + match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "", false,LLUUID::null); ensure_equals("getEnd() == 20", match.getEnd(), 20); } @@ -93,10 +93,10 @@ namespace tut LLUrlMatch match; ensure_equals("getUrl() == ''", match.getUrl(), ""); - match.setValues(10, 20, "http://slurl.com/", "", "", "", LLUIColor(), "", "", false); + match.setValues(10, 20, "http://slurl.com/", "", "", "", LLUIColor(), "", "", false,LLUUID::null); ensure_equals("getUrl() == 'http://slurl.com/'", match.getUrl(), "http://slurl.com/"); - match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "", false); + match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "", false,LLUUID::null); ensure_equals("getUrl() == '' (2)", match.getUrl(), ""); } @@ -109,10 +109,10 @@ namespace tut LLUrlMatch match; ensure_equals("getLabel() == ''", match.getLabel(), ""); - match.setValues(10, 20, "", "Label", "", "", LLUIColor(), "", "", false); + match.setValues(10, 20, "", "Label", "", "", LLUIColor(), "", "", false,LLUUID::null); ensure_equals("getLabel() == 'Label'", match.getLabel(), "Label"); - match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "", false); + match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "", false,LLUUID::null); ensure_equals("getLabel() == '' (2)", match.getLabel(), ""); } @@ -125,10 +125,10 @@ namespace tut LLUrlMatch match; ensure_equals("getTooltip() == ''", match.getTooltip(), ""); - match.setValues(10, 20, "", "", "Info", "", LLUIColor(), "", "", false); + match.setValues(10, 20, "", "", "Info", "", LLUIColor(), "", "", false,LLUUID::null); ensure_equals("getTooltip() == 'Info'", match.getTooltip(), "Info"); - match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "", false); + match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "", false,LLUUID::null); ensure_equals("getTooltip() == '' (2)", match.getTooltip(), ""); } @@ -141,10 +141,10 @@ namespace tut LLUrlMatch match; ensure_equals("getIcon() == ''", match.getIcon(), ""); - match.setValues(10, 20, "", "", "", "Icon", LLUIColor(), "", "", false); + match.setValues(10, 20, "", "", "", "Icon", LLUIColor(), "", "", false,LLUUID::null); ensure_equals("getIcon() == 'Icon'", match.getIcon(), "Icon"); - match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "", false); + match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "", false,LLUUID::null); ensure_equals("getIcon() == '' (2)", match.getIcon(), ""); } @@ -157,10 +157,10 @@ namespace tut LLUrlMatch match; ensure("getMenuName() empty", match.getMenuName().empty()); - match.setValues(10, 20, "", "", "", "Icon", LLUIColor(), "xui_file.xml", "", false); + match.setValues(10, 20, "", "", "", "Icon", LLUIColor(), "xui_file.xml", "", false,LLUUID::null); ensure_equals("getMenuName() == \"xui_file.xml\"", match.getMenuName(), "xui_file.xml"); - match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "", false); + match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "", false,LLUUID::null); ensure("getMenuName() empty (2)", match.getMenuName().empty()); } @@ -173,10 +173,10 @@ namespace tut LLUrlMatch match; ensure("getLocation() empty", match.getLocation().empty()); - match.setValues(10, 20, "", "", "", "Icon", LLUIColor(), "xui_file.xml", "Paris", false); + match.setValues(10, 20, "", "", "", "Icon", LLUIColor(), "xui_file.xml", "Paris", false,LLUUID::null); ensure_equals("getLocation() == \"Paris\"", match.getLocation(), "Paris"); - match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "", false); + match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "", false,LLUUID::null); ensure("getLocation() empty (2)", match.getLocation().empty()); } } diff --git a/indra/llvfs/lldir.cpp b/indra/llvfs/lldir.cpp index da4abde451..795aa8327d 100644 --- a/indra/llvfs/lldir.cpp +++ b/indra/llvfs/lldir.cpp @@ -91,15 +91,16 @@ S32 LLDir::deleteFilesInDir(const std::string &dirname, const std::string &mask) S32 result; while (getNextFileInDir(dirname, mask, filename, FALSE)) { - if ((filename == ".") || (filename == "..")) + fullpath = dirname; + fullpath += getDirDelimiter(); + fullpath += filename; + + if(LLFile::isdir(fullpath)) { // skipping directory traversal filenames count++; continue; } - fullpath = dirname; - fullpath += getDirDelimiter(); - fullpath += filename; S32 retry_count = 0; while (retry_count < 5) @@ -459,7 +460,6 @@ std::string LLDir::getExpandedFilename(ELLPath location, const std::string& subd } //llinfos << "*** EXPANDED FILENAME: <" << expanded_filename << ">" << llendl; - return expanded_filename; } @@ -565,27 +565,23 @@ std::string LLDir::getForbiddenFileChars() return "\\/:*?\"<>|"; } -void LLDir::setLindenUserDir(const std::string &first, const std::string &last) +void LLDir::setLindenUserDir(const std::string &username) { - // if both first and last aren't set, that's bad. - if (!first.empty() && !last.empty()) + // if the username isn't set, that's bad + if (!username.empty()) { // some platforms have case-sensitive filesystems, so be // utterly consistent with our firstname/lastname case. - std::string firstlower(first); - LLStringUtil::toLower(firstlower); - std::string lastlower(last); - LLStringUtil::toLower(lastlower); + std::string userlower(username); + LLStringUtil::toLower(userlower); + LLStringUtil::replaceChar(userlower, ' ', '_'); mLindenUserDir = getOSUserAppDir(); mLindenUserDir += mDirDelimiter; - mLindenUserDir += firstlower; - mLindenUserDir += "_"; - mLindenUserDir += lastlower; - llinfos << "Got name for LLDir::setLindenUserDir(first='" << first << "', last='" << last << "')" << llendl; + mLindenUserDir += userlower; } else { - llerrs << "Invalid name for LLDir::setLindenUserDir(first='" << first << "', last='" << last << "')" << llendl; + llerrs << "NULL name for LLDir::setLindenUserDir" << llendl; } dumpCurrentDirectories(); @@ -603,27 +599,25 @@ void LLDir::setChatLogsDir(const std::string &path) } } -void LLDir::setPerAccountChatLogsDir(const std::string &first, const std::string &last) +void LLDir::setPerAccountChatLogsDir(const std::string &username) { // if both first and last aren't set, assume we're grabbing the cached dir - if (!first.empty() && !last.empty()) + if (!username.empty()) { // some platforms have case-sensitive filesystems, so be // utterly consistent with our firstname/lastname case. - std::string firstlower(first); - LLStringUtil::toLower(firstlower); - std::string lastlower(last); - LLStringUtil::toLower(lastlower); + std::string userlower(username); + LLStringUtil::toLower(userlower); + LLStringUtil::replaceChar(userlower, ' ', '_'); mPerAccountChatLogsDir = getChatLogsDir(); mPerAccountChatLogsDir += mDirDelimiter; - mPerAccountChatLogsDir += firstlower; - mPerAccountChatLogsDir += "_"; - mPerAccountChatLogsDir += lastlower; + mPerAccountChatLogsDir += userlower; } else { - llwarns << "Invalid name for LLDir::setPerAccountChatLogsDir" << llendl; + llerrs << "NULL name for LLDir::setPerAccountChatLogsDir" << llendl; } + } void LLDir::setSkinFolder(const std::string &skin_folder) diff --git a/indra/llvfs/lldir.h b/indra/llvfs/lldir.h index 9067d75bac..05d5efc66f 100644 --- a/indra/llvfs/lldir.h +++ b/indra/llvfs/lldir.h @@ -137,8 +137,8 @@ class LLDir static std::string getForbiddenFileChars(); virtual void setChatLogsDir(const std::string &path); // Set the chat logs dir to this user's dir - virtual void setPerAccountChatLogsDir(const std::string &first, const std::string &last); // Set the per user chat log directory. - virtual void setLindenUserDir(const std::string &first, const std::string &last); // Set the linden user dir to this user's dir + virtual void setPerAccountChatLogsDir(const std::string &username); // Set the per user chat log directory. + virtual void setLindenUserDir(const std::string &username); // Set the linden user dir to this user's dir virtual void setSkinFolder(const std::string &skin_folder); virtual bool setCacheDir(const std::string &path); diff --git a/indra/llvfs/lldir_mac.cpp b/indra/llvfs/lldir_mac.cpp index 7bc6f63e1f..8d3852002c 100644 --- a/indra/llvfs/lldir_mac.cpp +++ b/indra/llvfs/lldir_mac.cpp @@ -426,7 +426,7 @@ BOOL LLDir_Mac::fileExists(const std::string &filename) const /*virtual*/ std::string LLDir_Mac::getLLPluginLauncher() { return gDirUtilp->getAppRODataDir() + gDirUtilp->getDirDelimiter() + - "SLPlugin"; + "SLPlugin.app/Contents/MacOS/SLPlugin"; } /*virtual*/ std::string LLDir_Mac::getLLPluginFilename(std::string base_name) diff --git a/indra/llvfs/lllfsthread.cpp b/indra/llvfs/lllfsthread.cpp index e85cc437f4..49c198a82d 100644 --- a/indra/llvfs/lllfsthread.cpp +++ b/indra/llvfs/lllfsthread.cpp @@ -188,7 +188,7 @@ bool LLLFSThread::Request::processRequest() if (mOperation == FILE_READ) { llassert(mOffset >= 0); - LLAPRFile infile ; + LLAPRFile infile ; // auto-closes infile.open(mFileName, LL_APR_RB, mThread->getLocalAPRFilePool()); if (!infile.getFileHandle()) { @@ -204,7 +204,6 @@ bool LLLFSThread::Request::processRequest() llassert_always(off >= 0); mBytesRead = infile.read(mBuffer, mBytes ); complete = true; - infile.close() ; // llinfos << "LLLFSThread::READ:" << mFileName << " Bytes: " << mBytesRead << llendl; } else if (mOperation == FILE_WRITE) @@ -212,7 +211,7 @@ bool LLLFSThread::Request::processRequest() apr_int32_t flags = APR_CREATE|APR_WRITE|APR_BINARY; if (mOffset < 0) flags |= APR_APPEND; - LLAPRFile outfile ; + LLAPRFile outfile ; // auto-closes outfile.open(mFileName, flags, mThread->getLocalAPRFilePool()); if (!outfile.getFileHandle()) { @@ -232,7 +231,6 @@ bool LLLFSThread::Request::processRequest() } mBytesRead = outfile.write(mBuffer, mBytes ); complete = true; - // llinfos << "LLLFSThread::WRITE:" << mFileName << " Bytes: " << mBytesRead << "/" << mBytes << " Offset:" << mOffset << llendl; } else diff --git a/indra/llwindow/CMakeLists.txt b/indra/llwindow/CMakeLists.txt index 77c6fa57b6..bf3233f386 100644 --- a/indra/llwindow/CMakeLists.txt +++ b/indra/llwindow/CMakeLists.txt @@ -113,6 +113,7 @@ if (WINDOWS) ) list(APPEND llwindow_LINK_LIBRARIES comdlg32 # Common Dialogs for ChooseColor + ole32 ) endif (WINDOWS) diff --git a/indra/llwindow/lldragdropwin32.cpp b/indra/llwindow/lldragdropwin32.cpp index 9b80fe0a84..b85960be10 100644 --- a/indra/llwindow/lldragdropwin32.cpp +++ b/indra/llwindow/lldragdropwin32.cpp @@ -50,7 +50,8 @@ class LLDragDropWin32Target: LLDragDropWin32Target( HWND hWnd ) : mRefCount( 1 ), mAppWindowHandle( hWnd ), - mAllowDrop( false) + mAllowDrop(false), + mIsSlurl(false) { }; diff --git a/indra/llwindow/llwindow.h b/indra/llwindow/llwindow.h index 127dbf45e0..52132c38d3 100644 --- a/indra/llwindow/llwindow.h +++ b/indra/llwindow/llwindow.h @@ -37,6 +37,7 @@ #include "llcoord.h" #include "llstring.h" #include "llcursortypes.h" +#include "llsd.h" class LLSplashScreen; class LLPreeditor; @@ -159,9 +160,12 @@ public: virtual void setLanguageTextInput( const LLCoordGL & pos ) {}; virtual void updateLanguageTextInputArea() {} virtual void interruptLanguageTextInput() {} - virtual void spawnWebBrowser(const std::string& escaped_url) {}; + virtual void spawnWebBrowser(const std::string& escaped_url, bool async) {}; static std::vector<std::string> getDynamicFallbackFontList(); + + // Provide native key event data + virtual LLSD getNativeKeyData() { return LLSD::emptyMap(); } protected: LLWindow(LLWindowCallbacks* callbacks, BOOL fullscreen, U32 flags); diff --git a/indra/llwindow/llwindowmacosx.cpp b/indra/llwindow/llwindowmacosx.cpp index 9ccd4c7f97..7026a3f7a6 100644 --- a/indra/llwindow/llwindowmacosx.cpp +++ b/indra/llwindow/llwindowmacosx.cpp @@ -260,6 +260,7 @@ LLWindowMacOSX::LLWindowMacOSX(LLWindowCallbacks* callbacks, mTSMScriptCode = 0; mTSMLangCode = 0; mPreeditor = NULL; + mRawKeyEvent = NULL; mFSAASamples = fsaa_samples; mForceRebuild = FALSE; @@ -2140,10 +2141,11 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e { UInt32 modifiers = 0; + // First, process the raw event. { - EventRef rawEvent; - + EventRef rawEvent = NULL; + // Get the original event and extract the modifier keys, so we can ignore command-key events. if (GetEventParameter(event, kEventParamTextInputSendKeyboardEvent, typeEventRef, NULL, sizeof(rawEvent), NULL, &rawEvent) == noErr) { @@ -2152,6 +2154,9 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e // and call this function recursively to handle the raw key event. eventHandler (myHandler, rawEvent); + + // save the raw event until we're done processing the unicode input as well. + mRawKeyEvent = rawEvent; } } @@ -2202,6 +2207,7 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e delete[] buffer; } + mRawKeyEvent = NULL; result = err; } break; @@ -2276,6 +2282,9 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e GetEventParameter (event, kEventParamKeyCode, typeUInt32, NULL, sizeof(UInt32), NULL, &keyCode); GetEventParameter (event, kEventParamKeyModifiers, typeUInt32, NULL, sizeof(UInt32), NULL, &modifiers); + // save the raw event so getNativeKeyData can use it. + mRawKeyEvent = event; + // printf("key event, key code = 0x%08x, char code = 0x%02x (%c), modifiers = 0x%08x\n", keyCode, charCode, (char)charCode, modifiers); // fflush(stdout); @@ -2371,6 +2380,8 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e result = eventNotHandledErr; break; } + + mRawKeyEvent = NULL; } break; @@ -2770,6 +2781,9 @@ const char* cursorIDToName(int id) case UI_CURSOR_TOOLPAUSE: return "UI_CURSOR_TOOLPAUSE"; case UI_CURSOR_TOOLMEDIAOPEN: return "UI_CURSOR_TOOLMEDIAOPEN"; case UI_CURSOR_PIPETTE: return "UI_CURSOR_PIPETTE"; + case UI_CURSOR_TOOLSIT: return "UI_CURSOR_TOOLSIT"; + case UI_CURSOR_TOOLBUY: return "UI_CURSOR_TOOLBUY"; + case UI_CURSOR_TOOLOPEN: return "UI_CURSOR_TOOLOPEN"; } llerrs << "cursorIDToName: unknown cursor id" << id << llendl; @@ -2872,6 +2886,9 @@ void LLWindowMacOSX::setCursor(ECursorType cursor) case UI_CURSOR_TOOLPLAY: case UI_CURSOR_TOOLPAUSE: case UI_CURSOR_TOOLMEDIAOPEN: + case UI_CURSOR_TOOLSIT: + case UI_CURSOR_TOOLBUY: + case UI_CURSOR_TOOLOPEN: result = setImageCursor(gCursors[cursor]); break; @@ -2913,6 +2930,9 @@ void LLWindowMacOSX::initCursors() initPixmapCursor(UI_CURSOR_TOOLPLAY, 1, 1); initPixmapCursor(UI_CURSOR_TOOLPAUSE, 1, 1); initPixmapCursor(UI_CURSOR_TOOLMEDIAOPEN, 1, 1); + initPixmapCursor(UI_CURSOR_TOOLSIT, 20, 15); + initPixmapCursor(UI_CURSOR_TOOLBUY, 20, 15); + initPixmapCursor(UI_CURSOR_TOOLOPEN, 20, 15); initPixmapCursor(UI_CURSOR_SIZENWSE, 10, 10); initPixmapCursor(UI_CURSOR_SIZENESW, 10, 10); @@ -3158,7 +3178,7 @@ S32 OSMessageBoxMacOSX(const std::string& text, const std::string& caption, U32 // Open a URL with the user's default web browser. // Must begin with protocol identifier. -void LLWindowMacOSX::spawnWebBrowser(const std::string& escaped_url) +void LLWindowMacOSX::spawnWebBrowser(const std::string& escaped_url, bool async) { bool found = false; S32 i; @@ -3211,6 +3231,60 @@ void LLWindowMacOSX::spawnWebBrowser(const std::string& escaped_url) } } +LLSD LLWindowMacOSX::getNativeKeyData() +{ + LLSD result = LLSD::emptyMap(); + + if(mRawKeyEvent) + { + char char_code = 0; + UInt32 key_code = 0; + UInt32 modifiers = 0; + UInt32 keyboard_type = 0; + + GetEventParameter (mRawKeyEvent, kEventParamKeyMacCharCodes, typeChar, NULL, sizeof(char), NULL, &char_code); + GetEventParameter (mRawKeyEvent, kEventParamKeyCode, typeUInt32, NULL, sizeof(UInt32), NULL, &key_code); + GetEventParameter (mRawKeyEvent, kEventParamKeyModifiers, typeUInt32, NULL, sizeof(UInt32), NULL, &modifiers); + GetEventParameter (mRawKeyEvent, kEventParamKeyboardType, typeUInt32, NULL, sizeof(UInt32), NULL, &keyboard_type); + + result["char_code"] = (S32)char_code; + result["key_code"] = (S32)key_code; + result["modifiers"] = (S32)modifiers; + result["keyboard_type"] = (S32)keyboard_type; + +#if 0 + // This causes trouble for control characters -- apparently character codes less than 32 (escape, control-A, etc) + // cause llsd serialization to create XML that the llsd deserializer won't parse! + std::string unicode; + OSStatus err = noErr; + EventParamType actualType = typeUTF8Text; + UInt32 actualSize = 0; + char *buffer = NULL; + + err = GetEventParameter (mRawKeyEvent, kEventParamKeyUnicodes, typeUTF8Text, &actualType, 0, &actualSize, NULL); + if(err == noErr) + { + // allocate a buffer and get the actual data. + buffer = new char[actualSize]; + err = GetEventParameter (mRawKeyEvent, kEventParamKeyUnicodes, typeUTF8Text, &actualType, actualSize, &actualSize, buffer); + if(err == noErr) + { + unicode.assign(buffer, actualSize); + } + delete[] buffer; + } + + result["unicode"] = unicode; +#endif + + } + + + lldebugs << "native key data is: " << result << llendl; + + return result; +} + BOOL LLWindowMacOSX::dialogColorPicker( F32 *r, F32 *g, F32 *b) { diff --git a/indra/llwindow/llwindowmacosx.h b/indra/llwindow/llwindowmacosx.h index 377f10b6d4..5ac74bb004 100644 --- a/indra/llwindow/llwindowmacosx.h +++ b/indra/llwindow/llwindowmacosx.h @@ -116,10 +116,14 @@ public: /*virtual*/ void allowLanguageTextInput(LLPreeditor *preeditor, BOOL b); /*virtual*/ void interruptLanguageTextInput(); - /*virtual*/ void spawnWebBrowser(const std::string& escaped_url); + /*virtual*/ void spawnWebBrowser(const std::string& escaped_url, bool async); static std::vector<std::string> getDynamicFallbackFontList(); + // Provide native key event data + /*virtual*/ LLSD getNativeKeyData(); + + protected: LLWindowMacOSX(LLWindowCallbacks* callbacks, const std::string& title, const std::string& name, int x, int y, int width, int height, U32 flags, @@ -218,6 +222,7 @@ protected: friend class LLWindowManager; static WindowRef sMediaWindow; + EventRef mRawKeyEvent; }; diff --git a/indra/llwindow/llwindowsdl.cpp b/indra/llwindow/llwindowsdl.cpp index f9c3694459..399d284402 100644 --- a/indra/llwindow/llwindowsdl.cpp +++ b/indra/llwindow/llwindowsdl.cpp @@ -251,6 +251,10 @@ LLWindowSDL::LLWindowSDL(LLWindowCallbacks* callbacks, #if LL_X11 mFlashing = FALSE; #endif // LL_X11 + + mKeyScanCode = 0; + mKeyVirtualKey = 0; + mKeyModifiers = KMOD_NONE; } static SDL_Surface *Load_BMP_Resource(const char *basename) @@ -1593,12 +1597,83 @@ U32 LLWindowSDL::SDLCheckGrabbyKeys(SDLKey keysym, BOOL gain) return mGrabbyKeyFlags; } + +void check_vm_bloat() +{ +#if LL_LINUX + // watch our own VM and RSS sizes, warn if we bloated rapidly + FILE *fp = fopen("/proc/self/stat", "r"); + if (fp) + { + static long long last_vm_size = 0; + static long long last_rss_size = 0; + const long long significant_vm_difference = 250 * 1024*1024; + const long long significant_rss_difference = 50 * 1024*1024; + + ssize_t res; + size_t dummy; + char *ptr; + for (int i=0; i<22; ++i) // parse past the values we don't want + { + ptr = NULL; + res = getdelim(&ptr, &dummy, ' ', fp); + free(ptr); + } + // 23rd space-delimited entry is vsize + ptr = NULL; + res = getdelim(&ptr, &dummy, ' ', fp); + llassert(ptr); + long long this_vm_size = atoll(ptr); + free(ptr); + // 24th space-delimited entry is RSS + ptr = NULL; + res = getdelim(&ptr, &dummy, ' ', fp); + llassert(ptr); + long long this_rss_size = getpagesize() * atoll(ptr); + free(ptr); + + llinfos << "VM SIZE IS NOW " << (this_vm_size/(1024*1024)) << " MB, RSS SIZE IS NOW " << (this_rss_size/(1024*1024)) << " MB" << llendl; + + if (llabs(last_vm_size - this_vm_size) > + significant_vm_difference) + { + if (this_vm_size > last_vm_size) + { + llwarns << "VM size grew by " << (this_vm_size - last_vm_size)/(1024*1024) << " MB in last frame" << llendl; + } + else + { + llinfos << "VM size shrank by " << (last_vm_size - this_vm_size)/(1024*1024) << " MB in last frame" << llendl; + } + } + + if (llabs(last_rss_size - this_rss_size) > + significant_rss_difference) + { + if (this_rss_size > last_rss_size) + { + llwarns << "RSS size grew by " << (this_rss_size - last_rss_size)/(1024*1024) << " MB in last frame" << llendl; + } + else + { + llinfos << "RSS size shrank by " << (last_rss_size - this_rss_size)/(1024*1024) << " MB in last frame" << llendl; + } + } + + last_rss_size = this_rss_size; + last_vm_size = this_vm_size; + + fclose(fp); + } +#endif // LL_LINUX +} + + // virtual void LLWindowSDL::processMiscNativeEvents() { #if LL_GTK // Pump GTK events to avoid starvation for: - // * Embedded Gecko // * DBUS servicing // * Anything else which quietly hooks into the default glib/GTK loop if (ll_try_gtk_init()) @@ -1624,6 +1699,12 @@ void LLWindowSDL::processMiscNativeEvents() setlocale(LC_ALL, saved_locale.c_str() ); } #endif // LL_GTK + + // hack - doesn't belong here - but this is just for debugging + if (getenv("LL_DEBUG_BLOAT")) + { + check_vm_bloat(); + } } void LLWindowSDL::gatherInput() @@ -1651,24 +1732,32 @@ void LLWindowSDL::gatherInput() } case SDL_KEYDOWN: - gKeyboard->handleKeyDown(event.key.keysym.sym, event.key.keysym.mod); - // part of the fix for SL-13243 - if (SDLCheckGrabbyKeys(event.key.keysym.sym, TRUE) != 0) - SDLReallyCaptureInput(TRUE); - - if (event.key.keysym.unicode) - { - handleUnicodeUTF16(event.key.keysym.unicode, - gKeyboard->currentMask(FALSE)); - } + mKeyScanCode = event.key.keysym.scancode; + mKeyVirtualKey = event.key.keysym.unicode; + mKeyModifiers = event.key.keysym.mod; + + gKeyboard->handleKeyDown(event.key.keysym.sym, event.key.keysym.mod); + // part of the fix for SL-13243 + if (SDLCheckGrabbyKeys(event.key.keysym.sym, TRUE) != 0) + SDLReallyCaptureInput(TRUE); + + if (event.key.keysym.unicode) + { + handleUnicodeUTF16(event.key.keysym.unicode, + gKeyboard->currentMask(FALSE)); + } break; case SDL_KEYUP: - if (SDLCheckGrabbyKeys(event.key.keysym.sym, FALSE) == 0) - SDLReallyCaptureInput(FALSE); // part of the fix for SL-13243 + mKeyScanCode = event.key.keysym.scancode; + mKeyVirtualKey = event.key.keysym.unicode; + mKeyModifiers = event.key.keysym.mod; - gKeyboard->handleKeyUp(event.key.keysym.sym, event.key.keysym.mod); - break; + if (SDLCheckGrabbyKeys(event.key.keysym.sym, FALSE) == 0) + SDLReallyCaptureInput(FALSE); // part of the fix for SL-13243 + + gKeyboard->handleKeyUp(event.key.keysym.sym, event.key.keysym.mod); + break; case SDL_MOUSEBUTTONDOWN: { @@ -1985,6 +2074,9 @@ void LLWindowSDL::initCursors() mSDLCursors[UI_CURSOR_TOOLPAUSE] = makeSDLCursorFromBMP("toolpause.BMP",0,0); mSDLCursors[UI_CURSOR_TOOLMEDIAOPEN] = makeSDLCursorFromBMP("toolmediaopen.BMP",0,0); mSDLCursors[UI_CURSOR_PIPETTE] = makeSDLCursorFromBMP("lltoolpipette.BMP",2,28); + mSDLCursors[UI_CURSOR_TOOLSIT] = makeSDLCursorFromBMP("toolsit.BMP",20,15); + mSDLCursors[UI_CURSOR_TOOLBUY] = makeSDLCursorFromBMP("toolbuy.BMP",20,15); + mSDLCursors[UI_CURSOR_TOOLOPEN] = makeSDLCursorFromBMP("toolopen.BMP",20,15); if (getenv("LL_ATI_MOUSE_CURSOR_BUG") != NULL) { llinfos << "Disabling cursor updating due to LL_ATI_MOUSE_CURSOR_BUG" << llendl; @@ -2224,6 +2316,39 @@ static void color_changed_callback(GtkWidget *widget, gtk_color_selection_get_current_color(colorsel, colorp); } + +/* + Make the raw keyboard data available - used to poke through to LLQtWebKit so + that Qt/Webkit has access to the virtual keycodes etc. that it needs +*/ +LLSD LLWindowSDL::getNativeKeyData() +{ + LLSD result = LLSD::emptyMap(); + + U32 modifiers = 0; // pretend-native modifiers... oh what a tangled web we weave! + + // we go through so many levels of device abstraction that I can't really guess + // what a plugin under GDK under Qt under SL under SDL under X11 considers + // a 'native' modifier mask. this has been sort of reverse-engineered... they *appear* + // to match GDK consts, but that may be co-incidence. + modifiers |= (mKeyModifiers & KMOD_LSHIFT) ? 0x0001 : 0; + modifiers |= (mKeyModifiers & KMOD_RSHIFT) ? 0x0001 : 0;// munge these into the same shift + modifiers |= (mKeyModifiers & KMOD_CAPS) ? 0x0002 : 0; + modifiers |= (mKeyModifiers & KMOD_LCTRL) ? 0x0004 : 0; + modifiers |= (mKeyModifiers & KMOD_RCTRL) ? 0x0004 : 0;// munge these into the same ctrl + modifiers |= (mKeyModifiers & KMOD_LALT) ? 0x0008 : 0;// untested + modifiers |= (mKeyModifiers & KMOD_RALT) ? 0x0008 : 0;// untested + // *todo: test ALTs - I don't have a case for testing these. Do you? + // *todo: NUM? - I don't care enough right now (and it's not a GDK modifier). + + result["scan_code"] = (S32)mKeyScanCode; + result["virtual_key"] = (S32)mKeyVirtualKey; + result["modifiers"] = (S32)modifiers; + + return result; +} + + BOOL LLWindowSDL::dialogColorPicker( F32 *r, F32 *g, F32 *b) { BOOL rtn = FALSE; @@ -2343,7 +2468,7 @@ void exec_cmd(const std::string& cmd, const std::string& arg) // Open a URL with the user's default web browser. // Must begin with protocol identifier. -void LLWindowSDL::spawnWebBrowser(const std::string& escaped_url) +void LLWindowSDL::spawnWebBrowser(const std::string& escaped_url, bool async) { llinfos << "spawn_web_browser: " << escaped_url << llendl; @@ -2421,6 +2546,7 @@ std::vector<std::string> LLWindowSDL::getDynamicFallbackFontList() // Use libfontconfig to find us a nice ordered list of fallback fonts // specific to this system. std::string final_fallback("/usr/share/fonts/truetype/kochi/kochi-gothic.ttf"); + const int max_font_count_cutoff = 40; // fonts are expensive in the current system, don't enumerate an arbitrary number of them // Our 'ideal' font properties which define the sorting results. // slant=0 means Roman, index=0 means the first face in a font file // (the one we actually use), weight=80 means medium weight, @@ -2436,7 +2562,6 @@ std::vector<std::string> LLWindowSDL::getDynamicFallbackFontList() std::vector<std::string> rtns; FcFontSet *fs = NULL; FcPattern *sortpat = NULL; - int font_count = 0; llinfos << "Getting system font list from FontConfig..." << llendl; @@ -2480,12 +2605,13 @@ std::vector<std::string> LLWindowSDL::getDynamicFallbackFontList() FcPatternDestroy(sortpat); } + int found_font_count = 0; if (fs) { // Get the full pathnames to the fonts, where available, // which is what we really want. - int i; - for (i=0; i<fs->nfont; ++i) + found_font_count = fs->nfont; + for (int i=0; i<fs->nfont; ++i) { FcChar8 *filename; if (FcResultMatch == FcPatternGetString(fs->fonts[i], @@ -2494,7 +2620,8 @@ std::vector<std::string> LLWindowSDL::getDynamicFallbackFontList() && filename) { rtns.push_back(std::string((const char*)filename)); - ++font_count; + if (rtns.size() >= max_font_count_cutoff) + break; // hit limit } } FcFontSetDestroy (fs); @@ -2507,7 +2634,7 @@ std::vector<std::string> LLWindowSDL::getDynamicFallbackFontList() { lldebugs << " file: " << *it << llendl; } - llinfos << "Using " << font_count << " system font(s)." << llendl; + llinfos << "Using " << rtns.size() << "/" << found_font_count << " system fonts." << llendl; rtns.push_back(final_fallback); return rtns; diff --git a/indra/llwindow/llwindowsdl.h b/indra/llwindow/llwindowsdl.h index 0ba1c861da..8e65a2f324 100644 --- a/indra/llwindow/llwindowsdl.h +++ b/indra/llwindow/llwindowsdl.h @@ -102,7 +102,7 @@ public: /*virtual*/ void gatherInput(); /*virtual*/ void swapBuffers(); - /*virtual*/ void delayInputProcessing() { }; + /*virtual*/ void delayInputProcessing() { }; // handy coordinate space conversion routines /*virtual*/ BOOL convertCoords(LLCoordScreen from, LLCoordWindow *to); @@ -125,7 +125,7 @@ public: /*virtual*/ void *getPlatformWindow(); /*virtual*/ void bringToFront(); - /*virtual*/ void spawnWebBrowser(const std::string& escaped_url); + /*virtual*/ void spawnWebBrowser(const std::string& escaped_url, bool async); static std::vector<std::string> getDynamicFallbackFontList(); @@ -155,12 +155,13 @@ protected: BOOL ignore_pixel_depth, U32 fsaa_samples); ~LLWindowSDL(); + /*virtual*/ BOOL isValid(); + /*virtual*/ LLSD getNativeKeyData(); + void initCursors(); void quitCursors(); - BOOL isValid(); void moveWindow(const LLCoordScreen& position,const LLCoordScreen& size); - // Changes display resolution. Returns true if successful BOOL setDisplayResolution(S32 width, S32 height, S32 bits, S32 refresh); @@ -204,12 +205,16 @@ protected: friend class LLWindowManager; -#if LL_X11 private: +#if LL_X11 void x11_set_urgent(BOOL urgent); BOOL mFlashing; LLTimer mFlashTimer; #endif //LL_X11 + + U32 mKeyScanCode; + U32 mKeyVirtualKey; + SDLMod mKeyModifiers; }; diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp index 57a4921d92..f8fde0319e 100644 --- a/indra/llwindow/llwindowwin32.cpp +++ b/indra/llwindow/llwindowwin32.cpp @@ -46,6 +46,7 @@ #include "llerror.h" #include "llgl.h" #include "llstring.h" +#include "lldir.h" // System includes #include <commdlg.h> @@ -378,6 +379,9 @@ LLWindowWin32::LLWindowWin32(LLWindowCallbacks* callbacks, mMousePositionModified = FALSE; mInputProcessingPaused = FALSE; mPreeditor = NULL; + mKeyCharCode = 0; + mKeyScanCode = 0; + mKeyVirtualKey = 0; mhDC = NULL; mhRC = NULL; @@ -1540,11 +1544,14 @@ void LLWindowWin32::initCursors() mCursor[ UI_CURSOR_TOOLZOOMIN ] = LoadCursor(module, TEXT("TOOLZOOMIN")); mCursor[ UI_CURSOR_TOOLPICKOBJECT3 ] = LoadCursor(module, TEXT("TOOLPICKOBJECT3")); mCursor[ UI_CURSOR_PIPETTE ] = LoadCursor(module, TEXT("TOOLPIPETTE")); + mCursor[ UI_CURSOR_TOOLSIT ] = LoadCursor(module, TEXT("TOOLSIT")); + mCursor[ UI_CURSOR_TOOLBUY ] = LoadCursor(module, TEXT("TOOLBUY")); + mCursor[ UI_CURSOR_TOOLOPEN ] = LoadCursor(module, TEXT("TOOLOPEN")); // Color cursors - mCursor[UI_CURSOR_TOOLPLAY] = loadColorCursor(TEXT("TOOLPLAY")); - mCursor[UI_CURSOR_TOOLPAUSE] = loadColorCursor(TEXT("TOOLPAUSE")); - mCursor[UI_CURSOR_TOOLMEDIAOPEN] = loadColorCursor(TEXT("TOOLMEDIAOPEN")); + mCursor[ UI_CURSOR_TOOLPLAY ] = loadColorCursor(TEXT("TOOLPLAY")); + mCursor[ UI_CURSOR_TOOLPAUSE ] = loadColorCursor(TEXT("TOOLPAUSE")); + mCursor[ UI_CURSOR_TOOLMEDIAOPEN ] = loadColorCursor(TEXT("TOOLMEDIAOPEN")); // Note: custom cursors that are not found make LoadCursor() return NULL. for( S32 i = 0; i < UI_CURSOR_COUNT; i++ ) @@ -1872,6 +1879,10 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_ // allow system keys, such as ALT-F4 to be processed by Windows eat_keystroke = FALSE; case WM_KEYDOWN: + window_imp->mKeyCharCode = 0; // don't know until wm_char comes in next + window_imp->mKeyScanCode = ( l_param >> 16 ) & 0xff; + window_imp->mKeyVirtualKey = w_param; + window_imp->mCallbacks->handlePingWatchdog(window_imp, "Main:WM_KEYDOWN"); { if (gDebugWindowProc) @@ -1891,6 +1902,9 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_ eat_keystroke = FALSE; case WM_KEYUP: { + window_imp->mKeyScanCode = ( l_param >> 16 ) & 0xff; + window_imp->mKeyVirtualKey = w_param; + window_imp->mCallbacks->handlePingWatchdog(window_imp, "Main:WM_KEYUP"); LLFastTimer t2(FTM_KEYHANDLER); @@ -1976,6 +1990,8 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_ break; case WM_CHAR: + window_imp->mKeyCharCode = w_param; + // Should really use WM_UNICHAR eventually, but it requires a specific Windows version and I need // to figure out how that works. - Doug // @@ -2861,8 +2877,16 @@ void LLSplashScreenWin32::updateImpl(const std::string& mesg) { if (!mWindow) return; - WCHAR w_mesg[1024]; - mbstowcs(w_mesg, mesg.c_str(), 1024); + int output_str_len = MultiByteToWideChar(CP_UTF8, 0, mesg.c_str(), mesg.length(), NULL, 0); + if( output_str_len>1024 ) + return; + + WCHAR w_mesg[1025];//big enought to keep null terminatos + + MultiByteToWideChar (CP_UTF8, 0, mesg.c_str(), mesg.length(), w_mesg, output_str_len); + + //looks like MultiByteToWideChar didn't add null terminator to converted string, see EXT-4858 + w_mesg[output_str_len] = 0; SendDlgItemMessage(mWindow, 666, // HACK: text id @@ -2941,7 +2965,7 @@ S32 OSMessageBoxWin32(const std::string& text, const std::string& caption, U32 t } -void LLWindowWin32::spawnWebBrowser(const std::string& escaped_url ) +void LLWindowWin32::spawnWebBrowser(const std::string& escaped_url, bool async) { bool found = false; S32 i; @@ -2971,87 +2995,32 @@ void LLWindowWin32::spawnWebBrowser(const std::string& escaped_url ) // let the OS decide what to use to open the URL SHELLEXECUTEINFO sei = { sizeof( sei ) }; - sei.fMask = SEE_MASK_FLAG_DDEWAIT; + // NOTE: this assumes that SL will stick around long enough to complete the DDE message exchange + // necessary for ShellExecuteEx to complete + if (async) + { + sei.fMask = SEE_MASK_ASYNCOK; + } sei.nShow = SW_SHOWNORMAL; sei.lpVerb = L"open"; sei.lpFile = url_utf16.c_str(); ShellExecuteEx( &sei ); +} - //// TODO: LEAVING OLD CODE HERE SO I DON'T BONE OTHER MERGES - //// DELETE THIS ONCE THE MERGES ARE DONE - - // Figure out the user's default web browser - // HKEY_CLASSES_ROOT\http\shell\open\command - /* - std::string reg_path_str = gURLProtocolWhitelistHandler[i] + "\\shell\\open\\command"; - WCHAR reg_path_wstr[256]; - mbstowcs( reg_path_wstr, reg_path_str.c_str(), LL_ARRAY_SIZE(reg_path_wstr) ); - - HKEY key; - WCHAR browser_open_wstr[1024]; - DWORD buffer_length = 1024; - RegOpenKeyEx(HKEY_CLASSES_ROOT, reg_path_wstr, 0, KEY_QUERY_VALUE, &key); - RegQueryValueEx(key, NULL, NULL, NULL, (LPBYTE)browser_open_wstr, &buffer_length); - RegCloseKey(key); - - // Convert to STL string - LLWString browser_open_wstring = utf16str_to_wstring(browser_open_wstr); - - if (browser_open_wstring.length() < 2) - { - LL_WARNS("Window") << "Invalid browser executable in registry " << browser_open_wstring << LL_ENDL; - return; - } - - // Extract the process that's supposed to be launched - LLWString browser_executable; - if (browser_open_wstring[0] == '"') - { - // executable is quoted, find the matching quote - size_t quote_pos = browser_open_wstring.find('"', 1); - // copy out the string including both quotes - browser_executable = browser_open_wstring.substr(0, quote_pos+1); - } - else - { - // executable not quoted, find a space - size_t space_pos = browser_open_wstring.find(' ', 1); - browser_executable = browser_open_wstring.substr(0, space_pos); - } - - LL_DEBUGS("Window") << "Browser reg key: " << wstring_to_utf8str(browser_open_wstring) << LL_ENDL; - LL_INFOS("Window") << "Browser executable: " << wstring_to_utf8str(browser_executable) << LL_ENDL; - - // Convert URL to wide string for Windows API - // Assume URL is UTF8, as can come from scripts - LLWString url_wstring = utf8str_to_wstring(escaped_url); - llutf16string url_utf16 = wstring_to_utf16str(url_wstring); +/* + Make the raw keyboard data available - used to poke through to LLQtWebKit so + that Qt/Webkit has access to the virtual keycodes etc. that it needs +*/ +LLSD LLWindowWin32::getNativeKeyData() +{ + LLSD result = LLSD::emptyMap(); - // Convert executable and path to wide string for Windows API - llutf16string browser_exec_utf16 = wstring_to_utf16str(browser_executable); + result["scan_code"] = (S32)mKeyScanCode; + result["virtual_key"] = (S32)mKeyVirtualKey; - // ShellExecute returns HINSTANCE for backwards compatiblity. - // MS docs say to cast to int and compare to 32. - HWND our_window = NULL; - LPCWSTR directory_wstr = NULL; - int retval = (int) ShellExecute(our_window, // Flawfinder: ignore - L"open", - browser_exec_utf16.c_str(), - url_utf16.c_str(), - directory_wstr, - SW_SHOWNORMAL); - if (retval > 32) - { - LL_DEBUGS("Window") << "load_url success with " << retval << LL_ENDL; - } - else - { - LL_INFOS("Window") << "load_url failure with " << retval << LL_ENDL; - } - */ + return result; } - BOOL LLWindowWin32::dialogColorPicker( F32 *r, F32 *g, F32 *b ) { BOOL retval = FALSE; diff --git a/indra/llwindow/llwindowwin32.h b/indra/llwindow/llwindowwin32.h index 6aca31b63e..d4a3446515 100644 --- a/indra/llwindow/llwindowwin32.h +++ b/indra/llwindow/llwindowwin32.h @@ -114,7 +114,7 @@ public: /*virtual*/ void setLanguageTextInput( const LLCoordGL & pos ); /*virtual*/ void updateLanguageTextInputArea(); /*virtual*/ void interruptLanguageTextInput(); - /*virtual*/ void spawnWebBrowser(const std::string& escaped_url); + /*virtual*/ void spawnWebBrowser(const std::string& escaped_url, bool async); LLWindowCallbacks::DragNDropResult completeDragNDropRequest( const LLCoordGL gl_coord, const MASK mask, LLWindowCallbacks::DragNDropAction action, const std::string url ); @@ -132,7 +132,7 @@ protected: HCURSOR loadColorCursor(LPCTSTR name); BOOL isValid(); void moveWindow(const LLCoordScreen& position,const LLCoordScreen& size); - + LLSD getNativeKeyData(); // Changes display resolution. Returns true if successful BOOL setDisplayResolution(S32 width, S32 height, S32 bits, S32 refresh); @@ -211,6 +211,10 @@ protected: LLDragDropWin32* mDragDrop; + U32 mKeyCharCode; + U32 mKeyScanCode; + U32 mKeyVirtualKey; + friend class LLWindowManager; }; diff --git a/indra/llxuixml/llinitparam.cpp b/indra/llxuixml/llinitparam.cpp index fb0a04dc58..8d6aa405e2 100644 --- a/indra/llxuixml/llinitparam.cpp +++ b/indra/llxuixml/llinitparam.cpp @@ -137,15 +137,15 @@ namespace LLInitParam } - bool BaseBlock::validateBlock(bool silent) const + bool BaseBlock::validateBlock(bool emit_errors) const { - const BlockDescriptor& block_data = getBlockDescriptor(); + const BlockDescriptor& block_data = mostDerivedBlockDescriptor(); for (BlockDescriptor::param_validation_list_t::const_iterator it = block_data.mValidationList.begin(); it != block_data.mValidationList.end(); ++it) { const Param* param = getParamFromHandle(it->first); if (!it->second(param)) { - if (!silent) + if (emit_errors) { llwarns << "Invalid param \"" << getParamName(block_data, param) << "\"" << llendl; } @@ -159,7 +159,7 @@ namespace LLInitParam { // named param is one like LLView::Params::follows // unnamed param is like LLView::Params::rect - implicit - const BlockDescriptor& block_data = getBlockDescriptor(); + const BlockDescriptor& block_data = mostDerivedBlockDescriptor(); for (BlockDescriptor::param_list_t::const_iterator it = block_data.mUnnamedParams.begin(); it != block_data.mUnnamedParams.end(); @@ -230,7 +230,7 @@ namespace LLInitParam { // named param is one like LLView::Params::follows // unnamed param is like LLView::Params::rect - implicit - const BlockDescriptor& block_data = getBlockDescriptor(); + const BlockDescriptor& block_data = mostDerivedBlockDescriptor(); for (BlockDescriptor::param_list_t::const_iterator it = block_data.mUnnamedParams.begin(); it != block_data.mUnnamedParams.end(); @@ -301,7 +301,7 @@ namespace LLInitParam bool BaseBlock::deserializeBlock(Parser& p, Parser::name_stack_range_t name_stack) { - BlockDescriptor& block_data = getBlockDescriptor(); + BlockDescriptor& block_data = mostDerivedBlockDescriptor(); bool names_left = name_stack.first != name_stack.second; if (names_left) @@ -386,7 +386,7 @@ namespace LLInitParam void BaseBlock::addSynonym(Param& param, const std::string& synonym) { - BlockDescriptor& block_data = getBlockDescriptor(); + BlockDescriptor& block_data = mostDerivedBlockDescriptor(); if (block_data.mInitializationState == BlockDescriptor::INITIALIZING) { param_handle_t handle = getHandleFromParam(¶m); @@ -417,8 +417,8 @@ namespace LLInitParam { if (user_provided) { - mChangeVersion++; - } + mChangeVersion++; + } } const std::string& BaseBlock::getParamName(const BlockDescriptor& block_data, const Param* paramp) const @@ -445,7 +445,7 @@ namespace LLInitParam ParamDescriptor* BaseBlock::findParamDescriptor(param_handle_t handle) { - BlockDescriptor& descriptor = getBlockDescriptor(); + BlockDescriptor& descriptor = mostDerivedBlockDescriptor(); BlockDescriptor::all_params_list_t::iterator end_it = descriptor.mAllParams.end(); for (BlockDescriptor::all_params_list_t::iterator it = descriptor.mAllParams.begin(); it != end_it; @@ -458,29 +458,9 @@ namespace LLInitParam // take all provided params from other and apply to self // NOTE: this requires that "other" is of the same derived type as this - bool BaseBlock::overwriteFromImpl(BlockDescriptor& block_data, const BaseBlock& other) - { - bool param_changed = false; - BlockDescriptor::all_params_list_t::const_iterator end_it = block_data.mAllParams.end(); - for (BlockDescriptor::all_params_list_t::const_iterator it = block_data.mAllParams.begin(); - it != end_it; - ++it) - { - const Param* other_paramp = other.getParamFromHandle(it->mParamHandle); - ParamDescriptor::merge_func_t merge_func = it->mMergeFunc; - if (merge_func) - { - Param* paramp = getParamFromHandle(it->mParamHandle); - param_changed |= merge_func(*paramp, *other_paramp, true); - } - } - return param_changed; - } - - // take all provided params that are not already provided, and apply to self - bool BaseBlock::fillFromImpl(BlockDescriptor& block_data, const BaseBlock& other) + bool BaseBlock::merge(BlockDescriptor& block_data, const BaseBlock& other, bool overwrite) { - bool param_changed = false; + bool some_param_changed = false; BlockDescriptor::all_params_list_t::const_iterator end_it = block_data.mAllParams.end(); for (BlockDescriptor::all_params_list_t::const_iterator it = block_data.mAllParams.begin(); it != end_it; @@ -491,10 +471,10 @@ namespace LLInitParam if (merge_func) { Param* paramp = getParamFromHandle(it->mParamHandle); - param_changed |= merge_func(*paramp, *other_paramp, false); + some_param_changed |= merge_func(*paramp, *other_paramp, overwrite); } } - return param_changed; + return some_param_changed; } bool ParamCompare<LLSD, false>::equals(const LLSD &a, const LLSD &b) diff --git a/indra/llxuixml/llinitparam.h b/indra/llxuixml/llinitparam.h index d264cea3b2..b645c4be7c 100644 --- a/indra/llxuixml/llinitparam.h +++ b/indra/llxuixml/llinitparam.h @@ -407,7 +407,7 @@ namespace LLInitParam class BaseBlock { public: - // "Multiple" constraint types + // "Multiple" constraint types, put here in root class to avoid ambiguity during use struct AnyAmount { static U32 minCount() { return 0; } @@ -452,7 +452,7 @@ namespace LLInitParam bool submitValue(const Parser::name_stack_t& name_stack, Parser& p, bool silent=false); param_handle_t getHandleFromParam(const Param* param) const; - bool validateBlock(bool silent = false) const; + bool validateBlock(bool emit_errors = true) const; Param* getParamFromHandle(const param_handle_t param_handle) { @@ -477,10 +477,10 @@ namespace LLInitParam bool deserializeBlock(Parser& p, Parser::name_stack_range_t name_stack); bool serializeBlock(Parser& p, Parser::name_stack_t name_stack = Parser::name_stack_t(), const BaseBlock* diff_block = NULL) const; - virtual bool inspectBlock(Parser& p, Parser::name_stack_t name_stack = Parser::name_stack_t()) const; + bool inspectBlock(Parser& p, Parser::name_stack_t name_stack = Parser::name_stack_t()) const; - const BlockDescriptor& getBlockDescriptor() const { return *mBlockDescriptor; } - BlockDescriptor& getBlockDescriptor() { return *mBlockDescriptor; } + const BlockDescriptor& mostDerivedBlockDescriptor() const { return *mBlockDescriptor; } + BlockDescriptor& mostDerivedBlockDescriptor() { return *mBlockDescriptor; } // take all provided params from other and apply to self bool overwriteFrom(const BaseBlock& other) @@ -500,17 +500,14 @@ namespace LLInitParam // take all provided params from other and apply to self - bool overwriteFromImpl(BlockDescriptor& block_data, const BaseBlock& other); - - // take all provided params that are not already provided, and apply to self - bool fillFromImpl(BlockDescriptor& block_data, const BaseBlock& other); + bool merge(BlockDescriptor& block_data, const BaseBlock& other, bool overwrite); // can be updated in getters mutable S32 mChangeVersion; BlockDescriptor* mBlockDescriptor; // most derived block descriptor - static BlockDescriptor& blockDescriptor() + static BlockDescriptor& selfBlockDescriptor() { static BlockDescriptor sBlockDescriptor; return sBlockDescriptor; @@ -562,7 +559,7 @@ namespace LLInitParam TypedParam(BlockDescriptor& block_descriptor, const char* name, value_assignment_t value, ParamDescriptor::validation_func_t validate_func, S32 min_count, S32 max_count) : Param(block_descriptor.mCurrentBlockPtr) { - if (block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING) + if (LL_UNLIKELY(block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING)) { ParamDescriptor param_descriptor(block_descriptor.mCurrentBlockPtr->getHandleFromParam(this), &mergeWith, @@ -587,6 +584,7 @@ namespace LLInitParam { if (parser.readValue<T>(typed_param.mData.mValue)) { + typed_param.mData.clearKey(); typed_param.setProvided(true); typed_param.enclosingBlock().setLastChangedParam(param, true); return true; @@ -693,7 +691,7 @@ namespace LLInitParam && (overwrite || !dst_typed_param.isProvided())) { dst_typed_param.mData.clearKey(); - dst_typed_param = src_typed_param; + dst_typed_param.set(src_typed_param.get()); return true; } return false; @@ -725,7 +723,7 @@ namespace LLInitParam : Param(block_descriptor.mCurrentBlockPtr), T(value) { - if (block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING) + if (LL_UNLIKELY(block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING)) { ParamDescriptor param_descriptor(block_descriptor.mCurrentBlockPtr->getHandleFromParam(this), &mergeWith, @@ -744,6 +742,7 @@ namespace LLInitParam // attempt to parse block... if(typed_param.deserializeBlock(parser, name_stack)) { + typed_param.mData.clearKey(); typed_param.enclosingBlock().setLastChangedParam(param, true); return true; } @@ -805,7 +804,7 @@ namespace LLInitParam if (Param::getProvided() && mData.mValidatedVersion < T::getLastChangeVersion()) { // a sub-block is "provided" when it has been filled in enough to be valid - mData.mValidated = T::validateBlock(true); + mData.mValidated = T::validateBlock(false); mData.mValidatedVersion = T::getLastChangeVersion(); } return Param::getProvided() && mData.mValidated; @@ -859,21 +858,10 @@ namespace LLInitParam { const self_t& src_typed_param = static_cast<const self_t&>(src); self_t& dst_typed_param = static_cast<self_t&>(dst); - if (overwrite) - { - if (dst_typed_param.T::overwriteFrom(src_typed_param)) - { - dst_typed_param.mData.clearKey(); - return true; - } - } - else + if (dst_typed_param.T::merge(T::selfBlockDescriptor(), src_typed_param, overwrite || !dst_typed_param.isProvided())) { - if (dst_typed_param.T::fillFrom(src_typed_param)) - { - dst_typed_param.mData.clearKey(); - return true; - } + dst_typed_param.mData.clearKey(); + return true; } return false; } @@ -914,7 +902,7 @@ namespace LLInitParam mValues(value) { mCachedKeys.resize(mValues.size()); - if (block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING) + if (LL_UNLIKELY(block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING)) { ParamDescriptor param_descriptor(block_descriptor.mCurrentBlockPtr->getHandleFromParam(this), &mergeWith, @@ -1063,9 +1051,9 @@ namespace LLInitParam self_t& dst_typed_param = static_cast<self_t&>(dst); if (src_typed_param.isProvided() - && (overwrite || !isProvided())) + && (overwrite || !dst_typed_param.isProvided())) { - dst_typed_param = src_typed_param; + dst_typed_param.set(src_typed_param.get()); return true; } return false; @@ -1097,7 +1085,7 @@ namespace LLInitParam mLastParamGeneration(0) { mCachedKeys.resize(mValues.size()); - if (block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING) + if (LL_UNLIKELY(block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING)) { ParamDescriptor param_descriptor(block_descriptor.mCurrentBlockPtr->getHandleFromParam(this), &mergeWith, @@ -1236,7 +1224,7 @@ namespace LLInitParam it != mValues.end(); ++it) { - if(it->validateBlock(true)) count++; + if(it->validateBlock(false)) count++; } return count; } @@ -1255,7 +1243,7 @@ namespace LLInitParam if (src_typed_param.isProvided() && (overwrite || !dst_typed_param.isProvided())) { - dst_typed_param = src_typed_param; + dst_typed_param.set(src_typed_param.get()); return true; } return false; @@ -1285,13 +1273,24 @@ namespace LLInitParam // take all provided params from other and apply to self bool overwriteFrom(const self_t& other) { - mCurChoice = other.mCurChoice; - return BaseBlock::overwriteFromImpl(blockDescriptor(), other); + return merge(selfBlockDescriptor(), other, true); } // take all provided params that are not already provided, and apply to self bool fillFrom(const self_t& other) { + return merge(selfBlockDescriptor(), other, false); + } + + // merge with other block + bool merge(BlockDescriptor& block_data, const self_t& other, bool overwrite) + { + // only merge a choice if we are overwriting with other's contents + if (overwrite) + { + mCurChoice = other.mCurChoice; + return BaseBlock::merge(selfBlockDescriptor(), other, overwrite); + } return false; } @@ -1317,7 +1316,7 @@ namespace LLInitParam Choice() : mCurChoice(0) { - BaseBlock::init(blockDescriptor(), BaseBlock::blockDescriptor(), sizeof(DERIVED_BLOCK)); + BaseBlock::init(selfBlockDescriptor(), BaseBlock::selfBlockDescriptor(), sizeof(DERIVED_BLOCK)); } // Alternatives are mutually exclusive wrt other Alternatives in the same block. @@ -1334,13 +1333,14 @@ namespace LLInitParam typedef typename super_t::value_assignment_t value_assignment_t; explicit Alternative(const char* name, value_assignment_t val = DefaultInitializer<T>::get()) - : super_t(DERIVED_BLOCK::blockDescriptor(), name, val, NULL, 0, 1), + : super_t(DERIVED_BLOCK::selfBlockDescriptor(), name, val, NULL, 0, 1), mOriginalValue(val) { // assign initial choice to first declared option - DERIVED_BLOCK* blockp = ((DERIVED_BLOCK*)DERIVED_BLOCK::blockDescriptor().mCurrentBlockPtr); - if (DERIVED_BLOCK::blockDescriptor().mInitializationState == BlockDescriptor::INITIALIZING - && blockp->mCurChoice == 0) + DERIVED_BLOCK* blockp = ((DERIVED_BLOCK*)DERIVED_BLOCK::selfBlockDescriptor().mCurrentBlockPtr); + if (LL_UNLIKELY( + DERIVED_BLOCK::selfBlockDescriptor().mInitializationState == BlockDescriptor::INITIALIZING + && blockp->mCurChoice == 0)) { blockp->mCurChoice = Param::enclosingBlock().getHandleFromParam(this); } @@ -1385,7 +1385,7 @@ namespace LLInitParam }; protected: - static BlockDescriptor& blockDescriptor() + static BlockDescriptor& selfBlockDescriptor() { static BlockDescriptor sBlockDescriptor; return sBlockDescriptor; @@ -1413,19 +1413,19 @@ namespace LLInitParam // take all provided params from other and apply to self bool overwriteFrom(const self_t& other) { - return BaseBlock::overwriteFromImpl(blockDescriptor(), other); + return BaseBlock::merge(selfBlockDescriptor(), other, true); } // take all provided params that are not already provided, and apply to self bool fillFrom(const self_t& other) { - return BaseBlock::fillFromImpl(blockDescriptor(), other); + return BaseBlock::merge(selfBlockDescriptor(), other, false); } protected: Block() { //#pragma message("Parsing LLInitParam::Block") - BaseBlock::init(blockDescriptor(), BASE_BLOCK::blockDescriptor(), sizeof(DERIVED_BLOCK)); + BaseBlock::init(selfBlockDescriptor(), BASE_BLOCK::selfBlockDescriptor(), sizeof(DERIVED_BLOCK)); } // @@ -1439,7 +1439,7 @@ namespace LLInitParam typedef typename super_t::value_assignment_t value_assignment_t; explicit Optional(const char* name = "", value_assignment_t val = DefaultInitializer<T>::get()) - : super_t(DERIVED_BLOCK::blockDescriptor(), name, val, NULL, 0, 1) + : super_t(DERIVED_BLOCK::selfBlockDescriptor(), name, val, NULL, 0, 1) { //#pragma message("Parsing LLInitParam::Block::Optional") } @@ -1468,7 +1468,7 @@ namespace LLInitParam // mandatory parameters require a name to be parseable explicit Mandatory(const char* name = "", value_assignment_t val = DefaultInitializer<T>::get()) - : super_t(DERIVED_BLOCK::blockDescriptor(), name, val, &validate, 1, 1) + : super_t(DERIVED_BLOCK::selfBlockDescriptor(), name, val, &validate, 1, 1) {} Mandatory& operator=(value_assignment_t val) @@ -1504,7 +1504,7 @@ namespace LLInitParam typedef typename container_t::const_iterator const_iterator; explicit Multiple(const char* name = "", value_assignment_t val = DefaultInitializer<container_t>::get()) - : super_t(DERIVED_BLOCK::blockDescriptor(), name, val, &validate, RANGE::minCount(), RANGE::maxCount()) + : super_t(DERIVED_BLOCK::selfBlockDescriptor(), name, val, &validate, RANGE::minCount(), RANGE::maxCount()) {} using super_t::operator(); @@ -1532,10 +1532,10 @@ namespace LLInitParam { public: explicit Deprecated(const char* name) - : Param(DERIVED_BLOCK::blockDescriptor().mCurrentBlockPtr) + : Param(DERIVED_BLOCK::selfBlockDescriptor().mCurrentBlockPtr) { - BlockDescriptor& block_descriptor = DERIVED_BLOCK::blockDescriptor(); - if (block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING) + BlockDescriptor& block_descriptor = DERIVED_BLOCK::selfBlockDescriptor(); + if (LL_UNLIKELY(block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING)) { ParamDescriptor param_descriptor(block_descriptor.mCurrentBlockPtr->getHandleFromParam(this), NULL, @@ -1564,7 +1564,7 @@ namespace LLInitParam typedef Deprecated Ignored; protected: - static BlockDescriptor& blockDescriptor() + static BlockDescriptor& selfBlockDescriptor() { static BlockDescriptor sBlockDescriptor; return sBlockDescriptor; @@ -1577,6 +1577,13 @@ namespace LLInitParam public Param { public: + typedef enum e_value_age + { + OLDER_THAN_BLOCK, // mData.mValue needs to be refreshed from the block parameters + NEWER_THAN_BLOCK, // mData.mValue holds the authoritative value (which has been replicated to the block parameters via setBlockFromValue) + SAME_AS_BLOCK // mData.mValue is derived from the block parameters, which are authoritative + } EValueAge; + typedef BlockValue<T> self_t; typedef Block<TypedParam<T, TypeValues<T>, false> > block_t; typedef const T& value_const_ref_t; @@ -1585,9 +1592,9 @@ namespace LLInitParam BlockValue(BlockDescriptor& block_descriptor, const char* name, value_assignment_t value, ParamDescriptor::validation_func_t validate_func, S32 min_count, S32 max_count) : Param(block_descriptor.mCurrentBlockPtr), - mData(value) + mData(value, NEWER_THAN_BLOCK) { - if (block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING) + if (LL_UNLIKELY(block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING)) { ParamDescriptor param_descriptor(block_descriptor.mCurrentBlockPtr->getHandleFromParam(this), &mergeWith, @@ -1607,7 +1614,7 @@ namespace LLInitParam static bool deserializeParam(Param& param, Parser& parser, const Parser::name_stack_range_t& name_stack, S32 generation) { - self_t& typed_param = static_cast<self_t&>(param); + DERIVED& typed_param = static_cast<DERIVED&>(param); // type to apply parse direct value T if (name_stack.first == name_stack.second) { @@ -1615,7 +1622,10 @@ namespace LLInitParam { typed_param.enclosingBlock().setLastChangedParam(param, true); typed_param.setProvided(true); - typed_param.mData.mLastParamVersion = typed_param.BaseBlock::getLastChangeVersion(); + typed_param.mData.clearKey(); + typed_param.mData.mValueAge = NEWER_THAN_BLOCK; + typed_param.setBlockFromValue(); + return true; } @@ -1631,7 +1641,9 @@ namespace LLInitParam typed_param.mData.setKey(name); typed_param.enclosingBlock().setLastChangedParam(param, true); typed_param.setProvided(true); - typed_param.mData.mLastParamVersion = typed_param.BaseBlock::getLastChangeVersion(); + typed_param.mData.mValueAge = NEWER_THAN_BLOCK; + typed_param.setBlockFromValue(); + return true; } } @@ -1706,16 +1718,18 @@ namespace LLInitParam bool isProvided() const { - // either param value provided directly or block is sufficiently filled in + if (!Param::getProvided()) return false; + + // block has an updated parameter // if cached value is stale, regenerate from params - if (Param::getProvided() && mData.mLastParamVersion < BaseBlock::getLastChangeVersion()) + if (mData.mValueAge == OLDER_THAN_BLOCK) { - if (block_t::validateBlock(true)) + if (block_t::validateBlock(false)) { static_cast<const DERIVED*>(this)->setValueFromBlock(); // clear stale keyword associated with old value mData.clearKey(); - mData.mLastParamVersion = BaseBlock::getLastChangeVersion(); + mData.mValueAge = SAME_AS_BLOCK; return true; } else @@ -1725,8 +1739,11 @@ namespace LLInitParam return false; } } - // either no data provided, or we have a valid value in hand - return Param::getProvided(); + else + { + // we have a valid value in hand + return true; + } } void set(value_assignment_t val, bool flag_as_provided = true) @@ -1734,7 +1751,7 @@ namespace LLInitParam Param::enclosingBlock().setLastChangedParam(*this, flag_as_provided); // set param version number to be up to date, so we ignore block contents - mData.mLastParamVersion = BaseBlock::getLastChangeVersion(); + mData.mValueAge = NEWER_THAN_BLOCK; mData.mValue = val; mData.clearKey(); @@ -1759,6 +1776,8 @@ namespace LLInitParam if (user_provided) { setProvided(true); // some component provided + // a parameter changed, so our value is out of date + mData.mValueAge = OLDER_THAN_BLOCK; } } @@ -1766,56 +1785,54 @@ namespace LLInitParam value_assignment_t get() const { // if some parameters were provided, issue warnings on invalid blocks - if (Param::getProvided() && (mData.mLastParamVersion < BaseBlock::getLastChangeVersion())) + if (Param::getProvided() && (mData.mValueAge == OLDER_THAN_BLOCK)) { // go ahead and issue warnings at this point if any param is invalid - if(block_t::validateBlock(false)) + if(block_t::validateBlock(true)) { static_cast<const DERIVED*>(this)->setValueFromBlock(); mData.clearKey(); - mData.mLastParamVersion = BaseBlock::getLastChangeVersion(); + mData.mValueAge = SAME_AS_BLOCK; } } return mData.mValue; } - // mutable to allow lazy updates on get + struct Data : public key_cache_t { - Data(const T& value) + Data(const T& value, EValueAge age) : mValue(value), - mLastParamVersion(0) + mValueAge(age) {} - T mValue; - S32 mLastParamVersion; + T mValue; + EValueAge mValueAge; }; + // mutable to allow lazy updates on get mutable Data mData; private: static bool mergeWith(Param& dst, const Param& src, bool overwrite) { - const self_t& src_param = static_cast<const self_t&>(src); - self_t& dst_typed_param = static_cast<self_t&>(dst); + const DERIVED& src_typed_param = static_cast<const DERIVED&>(src); + DERIVED& dst_typed_param = static_cast<DERIVED&>(dst); - if (src_param.isProvided() + if (src_typed_param.isProvided() && (overwrite || !dst_typed_param.isProvided())) { - // assign individual parameters - if (overwrite) + if (src_typed_param.mData.mValueAge == NEWER_THAN_BLOCK) { - dst_typed_param.BaseBlock::overwriteFromImpl(block_t::blockDescriptor(), src_param); + // copy value over + dst_typed_param.set(src_typed_param.get()); } else { - dst_typed_param.BaseBlock::fillFromImpl(block_t::blockDescriptor(), src_param); + // merge individual parameters into destination + dst_typed_param.merge(block_t::selfBlockDescriptor(), src_typed_param, overwrite); } - // then copy actual value - dst_typed_param.mData.mValue = src_param.get(); - dst_typed_param.mData.clearKey(); - dst_typed_param.setProvided(true); return true; } return false; diff --git a/indra/llxuixml/llxuiparser.cpp b/indra/llxuixml/llxuiparser.cpp index 17399865e5..dbc20a5a1e 100644 --- a/indra/llxuixml/llxuiparser.cpp +++ b/indra/llxuixml/llxuiparser.cpp @@ -324,33 +324,33 @@ void LLXUIXSDWriter::writeXSD(const std::string& type_name, const std::string& p // add includes for all possible children const std::type_info* type = *LLWidgetTypeRegistry::instance().getValue(type_name); const widget_registry_t* widget_registryp = LLChildRegistryRegistry::instance().getValue(type); - - // add include declarations for all valid children - for (widget_registry_t::Registrar::registry_map_t::const_iterator it = widget_registryp->currentRegistrar().beginItems(); - it != widget_registryp->currentRegistrar().endItems(); - ++it) - { - std::string widget_name = it->first; - if (widget_name == type_name) - { - continue; - } - LLXMLNodePtr nodep = new LLXMLNode("xs:include", false); - nodep->createChild("schemaLocation", true)->setStringValue(widget_name + ".xsd"); - - // add to front of schema - mSchemaNode->addChild(nodep, mSchemaNode); - } // add choices for valid children if (widget_registryp) { + // add include declarations for all valid children + for (widget_registry_t::Registrar::registry_map_t::const_iterator it = widget_registryp->currentRegistrar().beginItems(); + it != widget_registryp->currentRegistrar().endItems(); + ++it) + { + std::string widget_name = it->first; + if (widget_name == type_name) + { + continue; + } + LLXMLNodePtr nodep = new LLXMLNode("xs:include", false); + nodep->createChild("schemaLocation", true)->setStringValue(widget_name + ".xsd"); + + // add to front of schema + mSchemaNode->addChild(nodep, mSchemaNode); + } + for (widget_registry_t::Registrar::registry_map_t::const_iterator it = widget_registryp->currentRegistrar().beginItems(); it != widget_registryp->currentRegistrar().endItems(); ++it) { std::string widget_name = it->first; - //<xs:element name="widget_name" type="widget_name"> + //<xs:element name="widget_name" type="widget_name"> LLXMLNodePtr widget_node = mElementNode->createChild("xs:element", false); widget_node->createChild("name", true)->setStringValue(widget_name); widget_node->createChild("type", true)->setStringValue(widget_name); diff --git a/indra/lscript/lscript_compile/lscript_tree.cpp b/indra/lscript/lscript_compile/lscript_tree.cpp index 3b8bbbe805..3d19de193a 100644 --- a/indra/lscript/lscript_compile/lscript_tree.cpp +++ b/indra/lscript/lscript_compile/lscript_tree.cpp @@ -9805,6 +9805,9 @@ void LLScriptEventHandler::recurse(LLFILE *fp, S32 tabs, S32 tabsize, LSCRIPTCom break; case LSCP_EMIT_BYTE_CODE: { + llassert(mEventp); + if (!mEventp) return; + // order for event handler // set jump table value S32 jumpoffset; @@ -9818,13 +9821,11 @@ void LLScriptEventHandler::recurse(LLFILE *fp, S32 tabs, S32 tabsize, LSCRIPTCom chunk->addBytes(4); // null terminated event name and null terminated parameters - if (mEventp) - { - LLScriptByteCodeChunk *event = new LLScriptByteCodeChunk(FALSE); - mEventp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, event, heap, stacksize, entry, entrycount, NULL); - chunk->addBytes(event->mCodeChunk, event->mCurrentOffset); - delete event; - } + LLScriptByteCodeChunk *event = new LLScriptByteCodeChunk(FALSE); + mEventp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, event, heap, stacksize, entry, entrycount, NULL); + chunk->addBytes(event->mCodeChunk, event->mCurrentOffset); + delete event; + chunk->addBytes(1); // now we're at the first opcode @@ -10626,6 +10627,8 @@ LLScriptScript::LLScriptScript(LLScritpGlobalStorage *globals, } temp = temp->mNextp; } + + mClassName[0] = '\0'; } void LLScriptScript::setBytecodeDest(const char* dst_filename) diff --git a/indra/lscript/lscript_compile/lscript_tree.h b/indra/lscript/lscript_compile/lscript_tree.h index a667e1eb5b..7de9606dfc 100644 --- a/indra/lscript/lscript_compile/lscript_tree.h +++ b/indra/lscript/lscript_compile/lscript_tree.h @@ -1876,7 +1876,7 @@ class LLScriptStateChange : public LLScriptStatement { public: LLScriptStateChange(S32 line, S32 col, LLScriptIdentifier *identifier) - : LLScriptStatement(line, col, LSSMT_STATE_CHANGE), mIdentifier(identifier) + : LLScriptStatement(line, col, LSSMT_STATE_CHANGE), mIdentifier(identifier), mReturnType(LST_NULL) { } @@ -2210,7 +2210,7 @@ class LLScriptState : public LLScriptFilePosition { public: LLScriptState(S32 line, S32 col, LSCRIPTStateType type, LLScriptIdentifier *identifier, LLScriptEventHandler *event) - : LLScriptFilePosition(line, col), mType(type), mIdentifier(identifier), mEvent(event), mNextp(NULL) + : LLScriptFilePosition(line, col), mType(type), mIdentifier(identifier), mEvent(event), mNextp(NULL), mStateScope(NULL) { } diff --git a/indra/lscript/lscript_execute/lscript_execute.cpp b/indra/lscript/lscript_execute/lscript_execute.cpp index e849fa9a6e..8de54aeda5 100644 --- a/indra/lscript/lscript_execute/lscript_execute.cpp +++ b/indra/lscript/lscript_execute/lscript_execute.cpp @@ -520,7 +520,7 @@ void LLScriptExecuteLSL2::callNextQueuedEventHandler(U64 event_register, const L } else { - llwarns << "Shit, somehow got an event that we're not registered for!" << llendl; + llwarns << "Somehow got an event that we're not registered for!" << llendl; } delete eventdata; } diff --git a/indra/mac_crash_logger/llcrashloggermac.cpp b/indra/mac_crash_logger/llcrashloggermac.cpp index 16efa4fe2c..90de39ba27 100644 --- a/indra/mac_crash_logger/llcrashloggermac.cpp +++ b/indra/mac_crash_logger/llcrashloggermac.cpp @@ -211,89 +211,6 @@ bool LLCrashLoggerMac::init(void) void LLCrashLoggerMac::gatherPlatformSpecificFiles() { updateApplication("Gathering hardware information..."); - char path[MAX_PATH]; - FSRef folder; - - if(FSFindFolder(kUserDomain, kLogsFolderType, false, &folder) == noErr) - { - // folder is an FSRef to ~/Library/Logs/ - if(FSRefMakePath(&folder, (UInt8*)&path, sizeof(path)) == noErr) - { - struct stat dw_stat; - std::string mBuf; - bool isLeopard = false; - // Try the 10.3 path first... - std::string dw_file_name = std::string(path) + std::string("/CrashReporter/Second Life.crash.log"); - int res = stat(dw_file_name.c_str(), &dw_stat); - - if (res) - { - // Try the 10.2 one next... - dw_file_name = std::string(path) + std::string("/Second Life.crash.log"); - res = stat(dw_file_name.c_str(), &dw_stat); - } - - if(res) - { - //10.5: Like 10.3+, except it puts the crash time in the file instead of dividing it up - //using asterisks. Get a directory listing, search for files starting with second life, - //use the last one found. - std::string old_file_name, current_file_name, pathname, mask; - pathname = std::string(path) + std::string("/CrashReporter/"); - mask = "Second Life*"; - while(gDirUtilp->getNextFileInDir(pathname, mask, current_file_name, false)) - { - old_file_name = current_file_name; - } - if(old_file_name != "") - { - dw_file_name = pathname + old_file_name; - res=stat(dw_file_name.c_str(), &dw_stat); - isLeopard = true; - } - } - - if (!res) - { - std::ifstream fp(dw_file_name.c_str()); - std::stringstream str; - if(!fp.is_open()) return; - str << fp.rdbuf(); - mBuf = str.str(); - - if(!isLeopard) - { - // Crash logs consist of a number of entries, one per crash. - // Each entry is preceeded by "**********" on a line by itself. - // We want only the most recent (i.e. last) one. - const char *sep = "**********"; - const char *start = mBuf.c_str(); - const char *cur = start; - const char *temp = strstr(cur, sep); - - while(temp != NULL) - { - // Skip past the marker we just found - cur = temp + strlen(sep); /* Flawfinder: ignore */ - - // and try to find another - temp = strstr(cur, sep); - } - - // If there's more than one entry in the log file, strip all but the last one. - if(cur != start) - { - mBuf.erase(0, cur - start); - } - } - mCrashInfo["CrashLog"] = mBuf; - } - else - { - llwarns << "Couldn't find any CrashReporter files..." << llendl; - } - } - } } bool LLCrashLoggerMac::mainLoop() diff --git a/indra/mac_updater/CMakeLists.txt b/indra/mac_updater/CMakeLists.txt index 57d426aa24..44f98e5e18 100644 --- a/indra/mac_updater/CMakeLists.txt +++ b/indra/mac_updater/CMakeLists.txt @@ -15,24 +15,10 @@ include_directories( set(mac_updater_SOURCE_FILES mac_updater.cpp - FSCopyObject.c - GenLinkedList.c - MoreFilesX.c ) set(mac_updater_HEADER_FILES CMakeLists.txt - - FSCopyObject.h - GenLinkedList.h - MoreFilesX.h - ) - -set_source_files_properties( - FSCopyObject.c - MoreFilesX.c - PROPERTIES - COMPILE_FLAGS -Wno-deprecated-declarations ) set_source_files_properties(${mac_updater_HEADER_FILES} diff --git a/indra/mac_updater/mac_updater.cpp b/indra/mac_updater/mac_updater.cpp index d2a46d4338..44f002aecf 100644 --- a/indra/mac_updater/mac_updater.cpp +++ b/indra/mac_updater/mac_updater.cpp @@ -48,9 +48,6 @@ #include <Carbon/Carbon.h> -#include "MoreFilesX.h" -#include "FSCopyObject.h" - #include "llerrorcontrol.h" enum @@ -547,20 +544,6 @@ bool isDirWritable(FSRef &dir) return result; } -static void utf8str_to_HFSUniStr255(HFSUniStr255 *dest, const char* src) -{ - llutf16string utf16str = utf8str_to_utf16str(src); - - dest->length = utf16str.size(); - if(dest->length > 255) - { - // There's onl room for 255 chars in a HFSUniStr25.. - // Truncate to avoid stack smaching or other badness. - dest->length = 255; - } - memcpy(dest->unicode, utf16str.data(), sizeof(UniChar)* dest->length); /* Flawfinder: ignore */ -} - static std::string HFSUniStr255_to_utf8str(const HFSUniStr255* src) { llutf16string string16((U16*)&(src->unicode), src->length); @@ -584,19 +567,12 @@ int restoreObject(const char* aside, const char* target, const char* path, const llinfos << "Copying " << source << " to " << dest << llendl; - err = FSCopyObject( + err = FSCopyObjectSync( &sourceRef, &destRef, - 0, - kFSCatInfoNone, - kDupeActionReplace, - NULL, - false, - false, NULL, NULL, - NULL, - NULL); + kFSFileOperationOverwrite); if(err != noErr) return false; return true; @@ -779,21 +755,21 @@ void *updatethreadproc(void*) // so we need to go up 3 levels to get the path to the main application bundle. if(err == noErr) { - err = FSGetParentRef(&myBundle, &targetRef); + err = FSGetCatalogInfo(&myBundle, kFSCatInfoNone, NULL, NULL, NULL, &targetRef); } if(err == noErr) { - err = FSGetParentRef(&targetRef, &targetRef); + err = FSGetCatalogInfo(&targetRef, kFSCatInfoNone, NULL, NULL, NULL, &targetRef); } if(err == noErr) { - err = FSGetParentRef(&targetRef, &targetRef); + err = FSGetCatalogInfo(&targetRef, kFSCatInfoNone, NULL, NULL, NULL, &targetRef); } // And once more to get the parent of the target if(err == noErr) { - err = FSGetParentRef(&targetRef, &targetParentRef); + err = FSGetCatalogInfo(&targetRef, kFSCatInfoNone, NULL, NULL, NULL, &targetParentRef); } if(err == noErr) @@ -1077,14 +1053,16 @@ void *updatethreadproc(void*) char aside[MAX_PATH]; /* Flawfinder: ignore */ // this will hold the name of the destination target - HFSUniStr255 appNameUniStr; + CFStringRef appNameRef; if(replacingTarget) { // Get the name of the target we're replacing + HFSUniStr255 appNameUniStr; err = FSGetCatalogInfo(&targetRef, 0, NULL, &appNameUniStr, NULL, NULL); if(err != noErr) throw 0; + appNameRef = FSCreateStringFromHFSUniStr(NULL, &appNameUniStr); // Move aside old version (into work directory) err = FSMoveObject(&targetRef, &tempDirRef, &asideRef); @@ -1099,7 +1077,7 @@ void *updatethreadproc(void*) // Construct the name of the target based on the product name char appName[MAX_PATH]; /* Flawfinder: ignore */ snprintf(appName, sizeof(appName), "%s.app", gProductName); - utf8str_to_HFSUniStr255( &appNameUniStr, appName ); + appNameRef = CFStringCreateWithCString(NULL, appName, kCFStringEncodingUTF8); } sendProgress(0, 0, CFSTR("Copying files...")); @@ -1107,19 +1085,12 @@ void *updatethreadproc(void*) llinfos << "Starting copy..." << llendl; // Copy the new version from the disk image to the target location. - err = FSCopyObject( + err = FSCopyObjectSync( &sourceRef, &targetParentRef, - 0, - kFSCatInfoNone, - kDupeActionStandard, - &appNameUniStr, - false, - false, - NULL, - NULL, + appNameRef, &targetRef, - NULL); + kFSFileOperationDefaultOptions); // Grab the path for later use. err = FSRefMakePath(&targetRef, (UInt8*)target, sizeof(target)); @@ -1131,7 +1102,7 @@ void *updatethreadproc(void*) if(err != noErr) { // Something went wrong during the copy. Attempt to put the old version back and bail. - (void)FSDeleteObjects(&targetRef); + (void)FSDeleteObject(&targetRef); if(replacingTarget) { (void)FSMoveObject(&asideRef, &targetParentRef, NULL); diff --git a/indra/media_plugins/CMakeLists.txt b/indra/media_plugins/CMakeLists.txt index cc03d9cb72..85318aea3b 100644 --- a/indra/media_plugins/CMakeLists.txt +++ b/indra/media_plugins/CMakeLists.txt @@ -10,4 +10,8 @@ if (WINDOWS OR DARWIN) add_subdirectory(quicktime) endif (WINDOWS OR DARWIN) +if (WINDOWS) + add_subdirectory(winmmshim) +endif (WINDOWS) + add_subdirectory(example) diff --git a/indra/media_plugins/example/media_plugin_example.cpp b/indra/media_plugins/example/media_plugin_example.cpp index f5b077fea0..49bbca6c52 100644 --- a/indra/media_plugins/example/media_plugin_example.cpp +++ b/indra/media_plugins/example/media_plugin_example.cpp @@ -119,17 +119,6 @@ void MediaPluginExample::receiveMessage( const char* message_string ) std::string plugin_version = "Example media plugin, Example Version 1.0.0.0"; message.setValue( "plugin_version", plugin_version ); sendMessage( message ); - - // Plugin gets to decide the texture parameters to use. - message.setMessage( LLPLUGIN_MESSAGE_CLASS_MEDIA, "texture_params" ); - message.setValueS32( "default_width", mWidth ); - message.setValueS32( "default_height", mHeight ); - message.setValueS32( "depth", mDepth ); - message.setValueU32( "internalformat", GL_RGBA ); - message.setValueU32( "format", GL_RGBA ); - message.setValueU32( "type", GL_UNSIGNED_BYTE ); - message.setValueBoolean( "coords_opengl", false ); - sendMessage( message ); } else if ( message_name == "idle" ) @@ -191,7 +180,20 @@ void MediaPluginExample::receiveMessage( const char* message_string ) else if ( message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA ) { - if ( message_name == "size_change" ) + if ( message_name == "init" ) + { + // Plugin gets to decide the texture parameters to use. + LLPluginMessage message( LLPLUGIN_MESSAGE_CLASS_MEDIA, "texture_params" ); + message.setValueS32( "default_width", mWidth ); + message.setValueS32( "default_height", mHeight ); + message.setValueS32( "depth", mDepth ); + message.setValueU32( "internalformat", GL_RGBA ); + message.setValueU32( "format", GL_RGBA ); + message.setValueU32( "type", GL_UNSIGNED_BYTE ); + message.setValueBoolean( "coords_opengl", false ); + sendMessage( message ); + } + else if ( message_name == "size_change" ) { std::string name = message_in.getValue( "name" ); S32 width = message_in.getValueS32( "width" ); diff --git a/indra/media_plugins/gstreamer010/CMakeLists.txt b/indra/media_plugins/gstreamer010/CMakeLists.txt index 3b73e04786..9f0ff654fc 100644 --- a/indra/media_plugins/gstreamer010/CMakeLists.txt +++ b/indra/media_plugins/gstreamer010/CMakeLists.txt @@ -42,12 +42,12 @@ set(media_plugin_gstreamer010_HEADER_FILES llmediaimplgstreamertriviallogging.h ) -if (${CXX_VERSION_NUMBER} MATCHES "4[23].") +if (${CXX_VERSION_NUMBER} MATCHES "4[23456789].") # Work around a bad interaction between broken gstreamer headers and - # g++ 4.3's increased strictness. + # g++ >= 4.2's increased strictness. set_source_files_properties(llmediaimplgstreamervidplug.cpp PROPERTIES COMPILE_FLAGS -Wno-write-strings) -endif (${CXX_VERSION_NUMBER} MATCHES "4[23].") +endif (${CXX_VERSION_NUMBER} MATCHES "4[23456789].") add_library(media_plugin_gstreamer010 SHARED diff --git a/indra/media_plugins/gstreamer010/media_plugin_gstreamer010.cpp b/indra/media_plugins/gstreamer010/media_plugin_gstreamer010.cpp index 26173314a7..e6d2ad3edc 100644 --- a/indra/media_plugins/gstreamer010/media_plugin_gstreamer010.cpp +++ b/indra/media_plugins/gstreamer010/media_plugin_gstreamer010.cpp @@ -141,6 +141,7 @@ private: // Very GStreamer-specific GMainLoop *mPump; // event pump for this media GstElement *mPlaybin; + GstElement *mVisualizer; GstSLVideo *mVideoSink; }; @@ -159,6 +160,7 @@ MediaPluginGStreamer010::MediaPluginGStreamer010( mSeekDestination(0.0), mPump ( NULL ), mPlaybin ( NULL ), + mVisualizer ( NULL ), mVideoSink ( NULL ), mCommand ( COMMAND_NONE ) { @@ -542,8 +544,12 @@ MediaPluginGStreamer010::pause() { DEBUGMSG("pausing media..."); // todo: error-check this? - llgst_element_set_state(mPlaybin, GST_STATE_PAUSED); - return true; + if (mDoneInit && mPlaybin) + { + llgst_element_set_state(mPlaybin, GST_STATE_PAUSED); + return true; + } + return false; } bool @@ -551,8 +557,12 @@ MediaPluginGStreamer010::stop() { DEBUGMSG("stopping media..."); // todo: error-check this? - llgst_element_set_state(mPlaybin, GST_STATE_READY); - return true; + if (mDoneInit && mPlaybin) + { + llgst_element_set_state(mPlaybin, GST_STATE_READY); + return true; + } + return false; } bool @@ -562,8 +572,12 @@ MediaPluginGStreamer010::play(double rate) DEBUGMSG("playing media... rate=%f", rate); // todo: error-check this? - llgst_element_set_state(mPlaybin, GST_STATE_PLAYING); - return true; + if (mDoneInit && mPlaybin) + { + llgst_element_set_state(mPlaybin, GST_STATE_PLAYING); + return true; + } + return false; } bool @@ -606,7 +620,7 @@ bool MediaPluginGStreamer010::getTimePos(double &sec_out) { bool got_position = false; - if (mPlaybin) + if (mDoneInit && mPlaybin) { gint64 pos; GstFormat timefmt = GST_FORMAT_TIME; @@ -686,6 +700,35 @@ MediaPluginGStreamer010::load() this); llgst_object_unref (bus); +#if 0 // not quite stable/correct yet + // get a visualizer element (bonus feature!) + char* vis_name = getenv("LL_GST_VIS_NAME"); + if (!vis_name || + (vis_name && std::string(vis_name)!="none")) + { + if (vis_name) + { + mVisualizer = llgst_element_factory_make (vis_name, "vis"); + } + if (!mVisualizer) + { + mVisualizer = llgst_element_factory_make ("libvisual_jess", "vis"); + if (!mVisualizer) + { + mVisualizer = llgst_element_factory_make ("goom", "vis"); + if (!mVisualizer) + { + mVisualizer = llgst_element_factory_make ("libvisual_lv_scope", "vis"); + if (!mVisualizer) + { + // That's okay, we don't NEED this. + } + } + } + } + } +#endif + if (NULL == getenv("LL_GSTREAMER_EXTERNAL")) { // instantiate a custom video sink mVideoSink = @@ -702,6 +745,11 @@ MediaPluginGStreamer010::load() g_object_set(mPlaybin, "video-sink", mVideoSink, NULL); } + if (mVisualizer) + { + g_object_set(mPlaybin, "vis-plugin", mVisualizer, NULL); + } + return true; } @@ -724,6 +772,12 @@ MediaPluginGStreamer010::unload () mPlaybin = NULL; } + if (mVisualizer) + { + llgst_object_unref (GST_OBJECT (mVisualizer)); + mVisualizer = NULL; + } + if (mPump) { g_main_loop_quit(mPump); @@ -946,33 +1000,6 @@ void MediaPluginGStreamer010::receiveMessage(const char *message_string) message.setValue("plugin_version", getVersion()); sendMessage(message); - - // Plugin gets to decide the texture parameters to use. - message.setMessage(LLPLUGIN_MESSAGE_CLASS_MEDIA, "texture_params"); - // lame to have to decide this now, it depends on the movie. Oh well. - mDepth = 4; - - mCurrentWidth = 1; - mCurrentHeight = 1; - mPreviousWidth = 1; - mPreviousHeight = 1; - mNaturalWidth = 1; - mNaturalHeight = 1; - mWidth = 1; - mHeight = 1; - mTextureWidth = 1; - mTextureHeight = 1; - - message.setValueU32("format", GL_RGBA); - message.setValueU32("type", GL_UNSIGNED_INT_8_8_8_8_REV); - - message.setValueS32("depth", mDepth); - message.setValueS32("default_width", mWidth); - message.setValueS32("default_height", mHeight); - message.setValueU32("internalformat", GL_RGBA8); - message.setValueBoolean("coords_opengl", true); // true == use OpenGL-style coordinates, false == (0,0) is upper left. - message.setValueBoolean("allow_downsample", true); // we respond with grace and performance if asked to downscale - sendMessage(message); } else if(message_name == "idle") { @@ -1037,7 +1064,36 @@ void MediaPluginGStreamer010::receiveMessage(const char *message_string) } else if(message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA) { - if(message_name == "size_change") + if(message_name == "init") + { + // Plugin gets to decide the texture parameters to use. + LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "texture_params"); + // lame to have to decide this now, it depends on the movie. Oh well. + mDepth = 4; + + mCurrentWidth = 1; + mCurrentHeight = 1; + mPreviousWidth = 1; + mPreviousHeight = 1; + mNaturalWidth = 1; + mNaturalHeight = 1; + mWidth = 1; + mHeight = 1; + mTextureWidth = 1; + mTextureHeight = 1; + + message.setValueU32("format", GL_RGBA); + message.setValueU32("type", GL_UNSIGNED_INT_8_8_8_8_REV); + + message.setValueS32("depth", mDepth); + message.setValueS32("default_width", mWidth); + message.setValueS32("default_height", mHeight); + message.setValueU32("internalformat", GL_RGBA8); + message.setValueBoolean("coords_opengl", true); // true == use OpenGL-style coordinates, false == (0,0) is upper left. + message.setValueBoolean("allow_downsample", true); // we respond with grace and performance if asked to downscale + sendMessage(message); + } + else if(message_name == "size_change") { std::string name = message_in.getValue("name"); S32 width = message_in.getValueS32("width"); diff --git a/indra/media_plugins/quicktime/media_plugin_quicktime.cpp b/indra/media_plugins/quicktime/media_plugin_quicktime.cpp index e230fcc280..1f88301ca7 100644 --- a/indra/media_plugins/quicktime/media_plugin_quicktime.cpp +++ b/indra/media_plugins/quicktime/media_plugin_quicktime.cpp @@ -859,36 +859,6 @@ void MediaPluginQuickTime::receiveMessage(const char *message_string) plugin_version += codec.str(); message.setValue("plugin_version", plugin_version); sendMessage(message); - - // Plugin gets to decide the texture parameters to use. - message.setMessage(LLPLUGIN_MESSAGE_CLASS_MEDIA, "texture_params"); - #if defined(LL_WINDOWS) - // Values for Windows - mDepth = 3; - message.setValueU32("format", GL_RGB); - message.setValueU32("type", GL_UNSIGNED_BYTE); - - // We really want to pad the texture width to a multiple of 32 bytes, but since we're using 3-byte pixels, it doesn't come out even. - // Padding to a multiple of 3*32 guarantees it'll divide out properly. - message.setValueU32("padding", 32 * 3); - #else - // Values for Mac - mDepth = 4; - message.setValueU32("format", GL_BGRA_EXT); - #ifdef __BIG_ENDIAN__ - message.setValueU32("type", GL_UNSIGNED_INT_8_8_8_8_REV ); - #else - message.setValueU32("type", GL_UNSIGNED_INT_8_8_8_8); - #endif - - // Pad texture width to a multiple of 32 bytes, to line up with cache lines. - message.setValueU32("padding", 32); - #endif - message.setValueS32("depth", mDepth); - message.setValueU32("internalformat", GL_RGB); - message.setValueBoolean("coords_opengl", true); // true == use OpenGL-style coordinates, false == (0,0) is upper left. - message.setValueBoolean("allow_downsample", true); - sendMessage(message); } else if(message_name == "idle") { @@ -953,7 +923,41 @@ void MediaPluginQuickTime::receiveMessage(const char *message_string) } else if(message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA) { - if(message_name == "size_change") + if(message_name == "init") + { + // This is the media init message -- all necessary data for initialization should have been received. + + // Plugin gets to decide the texture parameters to use. + LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "texture_params"); + #if defined(LL_WINDOWS) + // Values for Windows + mDepth = 3; + message.setValueU32("format", GL_RGB); + message.setValueU32("type", GL_UNSIGNED_BYTE); + + // We really want to pad the texture width to a multiple of 32 bytes, but since we're using 3-byte pixels, it doesn't come out even. + // Padding to a multiple of 3*32 guarantees it'll divide out properly. + message.setValueU32("padding", 32 * 3); + #else + // Values for Mac + mDepth = 4; + message.setValueU32("format", GL_BGRA_EXT); + #ifdef __BIG_ENDIAN__ + message.setValueU32("type", GL_UNSIGNED_INT_8_8_8_8_REV ); + #else + message.setValueU32("type", GL_UNSIGNED_INT_8_8_8_8); + #endif + + // Pad texture width to a multiple of 32 bytes, to line up with cache lines. + message.setValueU32("padding", 32); + #endif + message.setValueS32("depth", mDepth); + message.setValueU32("internalformat", GL_RGB); + message.setValueBoolean("coords_opengl", true); // true == use OpenGL-style coordinates, false == (0,0) is upper left. + message.setValueBoolean("allow_downsample", true); + sendMessage(message); + } + else if(message_name == "size_change") { std::string name = message_in.getValue("name"); S32 width = message_in.getValueS32("width"); diff --git a/indra/media_plugins/webkit/CMakeLists.txt b/indra/media_plugins/webkit/CMakeLists.txt index 812760a116..d576638dd7 100644 --- a/indra/media_plugins/webkit/CMakeLists.txt +++ b/indra/media_plugins/webkit/CMakeLists.txt @@ -14,10 +14,12 @@ include(Linking) include(PluginAPI) include(MediaPluginBase) include(FindOpenGL) +include(PulseAudio) include(WebKitLibPlugin) include_directories( + ${PULSEAUDIO_INCLUDE_DIRS} ${LLPLUGIN_INCLUDE_DIRS} ${MEDIA_PLUGIN_BASE_INCLUDE_DIRS} ${LLCOMMON_INCLUDE_DIRS} @@ -34,10 +36,9 @@ set(media_plugin_webkit_SOURCE_FILES media_plugin_webkit.cpp ) -add_library(media_plugin_webkit - SHARED - ${media_plugin_webkit_SOURCE_FILES} -) +set(media_plugin_webkit_HEADER_FILES + volume_catcher.h + ) set(media_plugin_webkit_LINK_LIBRARIES ${LLPLUGIN_LIBRARIES} @@ -45,14 +46,42 @@ set(media_plugin_webkit_LINK_LIBRARIES ${LLCOMMON_LIBRARIES} ${WEBKIT_PLUGIN_LIBRARIES} ${PLUGIN_API_WINDOWS_LIBRARIES} + ${PULSEAUDIO_LIBRARIES} ) +# Select which VolumeCatcher implementation to use if (LINUX) + if (PULSEAUDIO) + list(APPEND media_plugin_webkit_SOURCE_FILES linux_volume_catcher.cpp) + endif (PULSEAUDIO) list(APPEND media_plugin_webkit_LINK_LIBRARIES ${UI_LIBRARIES} # for glib/GTK ) +elseif (DARWIN) + list(APPEND media_plugin_webkit_SOURCE_FILES mac_volume_catcher.cpp) + find_library(CORESERVICES_LIBRARY CoreServices) + find_library(AUDIOUNIT_LIBRARY AudioUnit) + list(APPEND media_plugin_webkit_LINK_LIBRARIES + ${CORESERVICES_LIBRARY} # for Component Manager calls + ${AUDIOUNIT_LIBRARY} # for AudioUnit calls + ) +elseif (WINDOWS) + list(APPEND media_plugin_webkit_SOURCE_FILES windows_volume_catcher.cpp) +else (LINUX) + # All other platforms use the dummy volume catcher for now. + list(APPEND media_plugin_webkit_SOURCE_FILES dummy_volume_catcher.cpp) endif (LINUX) +set_source_files_properties(${media_plugin_webkit_HEADER_FILES} + PROPERTIES HEADER_FILE_ONLY TRUE) + +list(APPEND media_plugin_webkit_SOURCE_FILES ${media_plugin_webkit_HEADER_FILES}) + +add_library(media_plugin_webkit + SHARED + ${media_plugin_webkit_SOURCE_FILES} +) + target_link_libraries(media_plugin_webkit ${media_plugin_webkit_LINK_LIBRARIES}) add_dependencies(media_plugin_webkit @@ -88,4 +117,5 @@ if (DARWIN) DEPENDS media_plugin_webkit ${CMAKE_SOURCE_DIR}/../libraries/universal-darwin/lib_release/libllqtwebkit.dylib ) -endif (DARWIN)
\ No newline at end of file +endif (DARWIN) + diff --git a/indra/media_plugins/webkit/dummy_volume_catcher.cpp b/indra/media_plugins/webkit/dummy_volume_catcher.cpp new file mode 100644 index 0000000000..45b2c62eba --- /dev/null +++ b/indra/media_plugins/webkit/dummy_volume_catcher.cpp @@ -0,0 +1,63 @@ +/** + * @file dummy_volume_catcher.cpp + * @brief A null implementation of the "VolumeCatcher" class for platforms where it's not implemented yet. + * + * @cond + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlife.com/developers/opensource/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlife.com/developers/opensource/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + * @endcond + */ + +#include "volume_catcher.h" + + +class VolumeCatcherImpl +{ +}; + +///////////////////////////////////////////////////// + +VolumeCatcher::VolumeCatcher() +{ + pimpl = NULL; +} + +VolumeCatcher::~VolumeCatcher() +{ +} + +void VolumeCatcher::setVolume(F32 volume) +{ +} + +void VolumeCatcher::setPan(F32 pan) +{ +} + +void VolumeCatcher::pump() +{ +} + diff --git a/indra/media_plugins/webkit/linux_volume_catcher.cpp b/indra/media_plugins/webkit/linux_volume_catcher.cpp new file mode 100644 index 0000000000..2e7fda865e --- /dev/null +++ b/indra/media_plugins/webkit/linux_volume_catcher.cpp @@ -0,0 +1,468 @@ +/** + * @file linux_volume_catcher.cpp + * @brief A Linux-specific, PulseAudio-specific hack to detect and volume-adjust new audio sources + * + * @cond + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlife.com/developers/opensource/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlife.com/developers/opensource/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + * @endcond + */ + +/* + The high-level design is as follows: + 1) Connect to the PulseAudio daemon + 2) Watch for the creation of new audio players connecting to the daemon (this includes ALSA clients running on the PulseAudio emulation layer, such as Flash plugins) + 3) Examine any new audio player's PID to see if it belongs to our own process + 4) If so, tell PA to adjust the volume of that audio player ('sink input' in PA parlance) + 5) Keep a list of all living audio players that we care about, adjust the volumes of all of them when we get a new setVolume() call + */ + +#include "linden_common.h" + +#include "volume_catcher.h" + + +extern "C" { +#include <glib.h> + +#include <pulse/introspect.h> +#include <pulse/context.h> +#include <pulse/subscribe.h> +#include <pulse/glib-mainloop.h> // There's no special reason why we want the *glib* PA mainloop, but the generic polling implementation seems broken. + +#include "apr_pools.h" +#include "apr_dso.h" +} + +//////////////////////////////////////////////////// + +#define DEBUGMSG(...) do {} while(0) +#define INFOMSG(...) do {} while(0) +#define WARNMSG(...) do {} while(0) + +#define LL_PA_SYM(REQUIRED, PASYM, RTN, ...) RTN (*ll##PASYM)(__VA_ARGS__) = NULL +#include "linux_volume_catcher_pa_syms.inc" +#include "linux_volume_catcher_paglib_syms.inc" +#undef LL_PA_SYM + +static bool sSymsGrabbed = false; +static apr_pool_t *sSymPADSOMemoryPool = NULL; +static apr_dso_handle_t *sSymPADSOHandleG = NULL; + +bool grab_pa_syms(std::string pulse_dso_name) +{ + if (sSymsGrabbed) + { + // already have grabbed good syms + return true; + } + + bool sym_error = false; + bool rtn = false; + apr_status_t rv; + apr_dso_handle_t *sSymPADSOHandle = NULL; + +#define LL_PA_SYM(REQUIRED, PASYM, RTN, ...) do{rv = apr_dso_sym((apr_dso_handle_sym_t*)&ll##PASYM, sSymPADSOHandle, #PASYM); if (rv != APR_SUCCESS) {INFOMSG("Failed to grab symbol: %s", #PASYM); if (REQUIRED) sym_error = true;} else DEBUGMSG("grabbed symbol: %s from %p", #PASYM, (void*)ll##PASYM);}while(0) + + //attempt to load the shared library + apr_pool_create(&sSymPADSOMemoryPool, NULL); + + if ( APR_SUCCESS == (rv = apr_dso_load(&sSymPADSOHandle, + pulse_dso_name.c_str(), + sSymPADSOMemoryPool) )) + { + INFOMSG("Found DSO: %s", pulse_dso_name.c_str()); + +#include "linux_volume_catcher_pa_syms.inc" +#include "linux_volume_catcher_paglib_syms.inc" + + if ( sSymPADSOHandle ) + { + sSymPADSOHandleG = sSymPADSOHandle; + sSymPADSOHandle = NULL; + } + + rtn = !sym_error; + } + else + { + INFOMSG("Couldn't load DSO: %s", pulse_dso_name.c_str()); + rtn = false; // failure + } + + if (sym_error) + { + WARNMSG("Failed to find necessary symbols in PulseAudio libraries."); + } +#undef LL_PA_SYM + + sSymsGrabbed = rtn; + return rtn; +} + + +void ungrab_pa_syms() +{ + // should be safe to call regardless of whether we've + // actually grabbed syms. + + if ( sSymPADSOHandleG ) + { + apr_dso_unload(sSymPADSOHandleG); + sSymPADSOHandleG = NULL; + } + + if ( sSymPADSOMemoryPool ) + { + apr_pool_destroy(sSymPADSOMemoryPool); + sSymPADSOMemoryPool = NULL; + } + + // NULL-out all of the symbols we'd grabbed +#define LL_PA_SYM(REQUIRED, PASYM, RTN, ...) do{ll##PASYM = NULL;}while(0) +#include "linux_volume_catcher_pa_syms.inc" +#include "linux_volume_catcher_paglib_syms.inc" +#undef LL_PA_SYM + + sSymsGrabbed = false; +} +//////////////////////////////////////////////////// + +// PulseAudio requires a chain of callbacks with C linkage +extern "C" { + void callback_discovered_sinkinput(pa_context *context, const pa_sink_input_info *i, int eol, void *userdata); + void callback_subscription_alert(pa_context *context, pa_subscription_event_type_t t, uint32_t index, void *userdata); + void callback_context_state(pa_context *context, void *userdata); +} + + +class VolumeCatcherImpl +{ +public: + VolumeCatcherImpl(); + ~VolumeCatcherImpl(); + + void setVolume(F32 volume); + void pump(void); + + // for internal use - can't be private because used from our C callbacks + + bool loadsyms(std::string pulse_dso_name); + void init(); + void cleanup(); + + void update_all_volumes(F32 volume); + void update_index_volume(U32 index, F32 volume); + void connected_okay(); + + std::set<U32> mSinkInputIndices; + std::map<U32,U32> mSinkInputNumChannels; + F32 mDesiredVolume; + pa_glib_mainloop *mMainloop; + pa_context *mPAContext; + bool mConnected; + bool mGotSyms; +}; + +VolumeCatcherImpl::VolumeCatcherImpl() + : mDesiredVolume(0.0f), + mMainloop(NULL), + mPAContext(NULL), + mConnected(false), + mGotSyms(false) +{ + init(); +} + +VolumeCatcherImpl::~VolumeCatcherImpl() +{ + cleanup(); +} + +bool VolumeCatcherImpl::loadsyms(std::string pulse_dso_name) +{ + return grab_pa_syms(pulse_dso_name); +} + +void VolumeCatcherImpl::init() +{ + // try to be as defensive as possible because PA's interface is a + // bit fragile and (for our purposes) we'd rather simply not function + // than crash + + // we cheat and rely upon libpulse-mainloop-glib.so.0 to pull-in + // libpulse.so.0 - this isn't a great assumption, and the two DSOs should + // probably be loaded separately. Our Linux DSO framework needs refactoring, + // we do this sort of thing a lot with practically identical logic... + mGotSyms = loadsyms("libpulse-mainloop-glib.so.0"); + if (!mGotSyms) return; + + mMainloop = llpa_glib_mainloop_new(g_main_context_default()); + if (mMainloop) + { + pa_mainloop_api *api = llpa_glib_mainloop_get_api(mMainloop); + if (api) + { + pa_proplist *proplist = llpa_proplist_new(); + if (proplist) + { + llpa_proplist_sets(proplist, PA_PROP_APPLICATION_ICON_NAME, "multimedia-player"); + llpa_proplist_sets(proplist, PA_PROP_APPLICATION_ID, "com.secondlife.viewer.mediaplugvoladjust"); + llpa_proplist_sets(proplist, PA_PROP_APPLICATION_NAME, "SL Plugin Volume Adjuster"); + llpa_proplist_sets(proplist, PA_PROP_APPLICATION_VERSION, "1"); + + // plain old pa_context_new() is broken! + mPAContext = llpa_context_new_with_proplist(api, NULL, proplist); + llpa_proplist_free(proplist); + } + } + } + + // Now we've set up a PA context and mainloop, try connecting the + // PA context to a PA daemon. + if (mPAContext) + { + llpa_context_set_state_callback(mPAContext, callback_context_state, this); + pa_context_flags_t cflags = (pa_context_flags)0; // maybe add PA_CONTEXT_NOAUTOSPAWN? + if (llpa_context_connect(mPAContext, NULL, cflags, NULL) >= 0) + { + // Okay! We haven't definitely connected, but we + // haven't definitely failed yet. + } + else + { + // Failed to connect to PA manager... we'll leave + // things like that. Perhaps we should try again later. + } + } +} + +void VolumeCatcherImpl::cleanup() +{ + mConnected = false; + + if (mGotSyms && mPAContext) + { + llpa_context_disconnect(mPAContext); + llpa_context_unref(mPAContext); + } + mPAContext = NULL; + + if (mGotSyms && mMainloop) + { + llpa_glib_mainloop_free(mMainloop); + } + mMainloop = NULL; +} + +void VolumeCatcherImpl::setVolume(F32 volume) +{ + mDesiredVolume = volume; + + if (!mGotSyms) return; + + if (mConnected && mPAContext) + { + update_all_volumes(mDesiredVolume); + } + + pump(); +} + +void VolumeCatcherImpl::pump() +{ + gboolean may_block = FALSE; + g_main_context_iteration(g_main_context_default(), may_block); +} + +void VolumeCatcherImpl::connected_okay() +{ + pa_operation *op; + + // fetch global list of existing sinkinputs + if ((op = llpa_context_get_sink_input_info_list(mPAContext, + callback_discovered_sinkinput, + this))) + { + llpa_operation_unref(op); + } + + // subscribe to future global sinkinput changes + llpa_context_set_subscribe_callback(mPAContext, + callback_subscription_alert, + this); + if ((op = llpa_context_subscribe(mPAContext, (pa_subscription_mask_t) + (PA_SUBSCRIPTION_MASK_SINK_INPUT), + NULL, NULL))) + { + llpa_operation_unref(op); + } +} + +void VolumeCatcherImpl::update_all_volumes(F32 volume) +{ + for (std::set<U32>::iterator it = mSinkInputIndices.begin(); + it != mSinkInputIndices.end(); ++it) + { + update_index_volume(*it, volume); + } +} + +void VolumeCatcherImpl::update_index_volume(U32 index, F32 volume) +{ + static pa_cvolume cvol; + llpa_cvolume_set(&cvol, mSinkInputNumChannels[index], + llpa_sw_volume_from_linear(volume)); + + pa_context *c = mPAContext; + uint32_t idx = index; + const pa_cvolume *cvolumep = &cvol; + pa_context_success_cb_t cb = NULL; // okay as null + void *userdata = NULL; // okay as null + + pa_operation *op; + if ((op = llpa_context_set_sink_input_volume(c, idx, cvolumep, cb, userdata))) + { + llpa_operation_unref(op); + } +} + + +void callback_discovered_sinkinput(pa_context *context, const pa_sink_input_info *sii, int eol, void *userdata) +{ + VolumeCatcherImpl *impl = dynamic_cast<VolumeCatcherImpl*>((VolumeCatcherImpl*)userdata); + llassert(impl); + + if (0 == eol) + { + pa_proplist *proplist = sii->proplist; + pid_t sinkpid = atoll(llpa_proplist_gets(proplist, PA_PROP_APPLICATION_PROCESS_ID)); + + if (sinkpid == getpid()) // does the discovered sinkinput belong to this process? + { + bool is_new = (impl->mSinkInputIndices.find(sii->index) == + impl->mSinkInputIndices.end()); + + impl->mSinkInputIndices.insert(sii->index); + impl->mSinkInputNumChannels[sii->index] = sii->channel_map.channels; + + if (is_new) + { + // new! + impl->update_index_volume(sii->index, impl->mDesiredVolume); + } + else + { + // seen it already, do nothing. + } + } + } +} + +void callback_subscription_alert(pa_context *context, pa_subscription_event_type_t t, uint32_t index, void *userdata) +{ + VolumeCatcherImpl *impl = dynamic_cast<VolumeCatcherImpl*>((VolumeCatcherImpl*)userdata); + llassert(impl); + + switch (t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) { + case PA_SUBSCRIPTION_EVENT_SINK_INPUT: + if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == + PA_SUBSCRIPTION_EVENT_REMOVE) + { + // forget this sinkinput, if we were caring about it + impl->mSinkInputIndices.erase(index); + impl->mSinkInputNumChannels.erase(index); + } + else if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == + PA_SUBSCRIPTION_EVENT_NEW) + { + // ask for more info about this new sinkinput + pa_operation *op; + if ((op = llpa_context_get_sink_input_info(impl->mPAContext, index, callback_discovered_sinkinput, impl))) + { + llpa_operation_unref(op); + } + } + else + { + // property change on this sinkinput - we don't care. + } + break; + + default:; + } +} + +void callback_context_state(pa_context *context, void *userdata) +{ + VolumeCatcherImpl *impl = dynamic_cast<VolumeCatcherImpl*>((VolumeCatcherImpl*)userdata); + llassert(impl); + + switch (llpa_context_get_state(context)) + { + case PA_CONTEXT_READY: + impl->mConnected = true; + impl->connected_okay(); + break; + case PA_CONTEXT_TERMINATED: + impl->mConnected = false; + break; + case PA_CONTEXT_FAILED: + impl->mConnected = false; + break; + default:; + } +} + +///////////////////////////////////////////////////// + +VolumeCatcher::VolumeCatcher() +{ + pimpl = new VolumeCatcherImpl(); +} + +VolumeCatcher::~VolumeCatcher() +{ + delete pimpl; + pimpl = NULL; +} + +void VolumeCatcher::setVolume(F32 volume) +{ + llassert(pimpl); + pimpl->setVolume(volume); +} + +void VolumeCatcher::setPan(F32 pan) +{ + // TODO: implement this (if possible) +} + +void VolumeCatcher::pump() +{ + llassert(pimpl); + pimpl->pump(); +} diff --git a/indra/media_plugins/webkit/linux_volume_catcher_pa_syms.inc b/indra/media_plugins/webkit/linux_volume_catcher_pa_syms.inc new file mode 100644 index 0000000000..d806b48428 --- /dev/null +++ b/indra/media_plugins/webkit/linux_volume_catcher_pa_syms.inc @@ -0,0 +1,21 @@ +// required symbols to grab +LL_PA_SYM(true, pa_context_connect, int, pa_context *c, const char *server, pa_context_flags_t flags, const pa_spawn_api *api); +LL_PA_SYM(true, pa_context_disconnect, void, pa_context *c); +LL_PA_SYM(true, pa_context_get_sink_input_info, pa_operation*, pa_context *c, uint32_t idx, pa_sink_input_info_cb_t cb, void *userdata); +LL_PA_SYM(true, pa_context_get_sink_input_info_list, pa_operation*, pa_context *c, pa_sink_input_info_cb_t cb, void *userdata); +LL_PA_SYM(true, pa_context_get_state, pa_context_state_t, pa_context *c); +LL_PA_SYM(true, pa_context_new_with_proplist, pa_context*, pa_mainloop_api *mainloop, const char *name, pa_proplist *proplist); +LL_PA_SYM(true, pa_context_set_sink_input_volume, pa_operation*, pa_context *c, uint32_t idx, const pa_cvolume *volume, pa_context_success_cb_t cb, void *userdata); +LL_PA_SYM(true, pa_context_set_state_callback, void, pa_context *c, pa_context_notify_cb_t cb, void *userdata); +LL_PA_SYM(true, pa_context_set_subscribe_callback, void, pa_context *c, pa_context_subscribe_cb_t cb, void *userdata); +LL_PA_SYM(true, pa_context_subscribe, pa_operation*, pa_context *c, pa_subscription_mask_t m, pa_context_success_cb_t cb, void *userdata); +LL_PA_SYM(true, pa_context_unref, void, pa_context *c); +LL_PA_SYM(true, pa_cvolume_set, pa_cvolume*, pa_cvolume *a, unsigned channels, pa_volume_t v); +LL_PA_SYM(true, pa_operation_unref, void, pa_operation *o); +LL_PA_SYM(true, pa_proplist_free, void, pa_proplist* p); +LL_PA_SYM(true, pa_proplist_gets, const char*, pa_proplist *p, const char *key); +LL_PA_SYM(true, pa_proplist_new, pa_proplist*, void); +LL_PA_SYM(true, pa_proplist_sets, int, pa_proplist *p, const char *key, const char *value); +LL_PA_SYM(true, pa_sw_volume_from_linear, pa_volume_t, double v); + +// optional symbols to grab diff --git a/indra/media_plugins/webkit/linux_volume_catcher_paglib_syms.inc b/indra/media_plugins/webkit/linux_volume_catcher_paglib_syms.inc new file mode 100644 index 0000000000..abf628c96c --- /dev/null +++ b/indra/media_plugins/webkit/linux_volume_catcher_paglib_syms.inc @@ -0,0 +1,6 @@ +// required symbols to grab +LL_PA_SYM(true, pa_glib_mainloop_free, void, pa_glib_mainloop* g); +LL_PA_SYM(true, pa_glib_mainloop_get_api, pa_mainloop_api*, pa_glib_mainloop* g); +LL_PA_SYM(true, pa_glib_mainloop_new, pa_glib_mainloop *, GMainContext *c); + +// optional symbols to grab diff --git a/indra/media_plugins/webkit/mac_volume_catcher.cpp b/indra/media_plugins/webkit/mac_volume_catcher.cpp new file mode 100644 index 0000000000..38727e5965 --- /dev/null +++ b/indra/media_plugins/webkit/mac_volume_catcher.cpp @@ -0,0 +1,273 @@ +/** + * @file mac_volume_catcher.cpp + * @brief A Mac OS X specific hack to control the volume level of all audio channels opened by a process. + * + * @cond + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlife.com/developers/opensource/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlife.com/developers/opensource/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + * @endcond + */ + +/************************************************************************************************************** + This code works by using CaptureComponent to capture the "Default Output" audio component + (kAudioUnitType_Output/kAudioUnitSubType_DefaultOutput) and delegating all calls to the original component. + It does this just to keep track of all instances of the default output component, so that it can set the + kHALOutputParam_Volume parameter on all of them to adjust the output volume. +**************************************************************************************************************/ + +#include "volume_catcher.h" + +#include <Carbon/Carbon.h> +#include <QuickTime/QuickTime.h> +#include <AudioUnit/AudioUnit.h> + +struct VolumeCatcherStorage; + +class VolumeCatcherImpl +{ +public: + + void setVolume(F32 volume); + void setPan(F32 pan); + + void setInstanceVolume(VolumeCatcherStorage *instance); + + std::list<VolumeCatcherStorage*> mComponentInstances; + Component mOriginalDefaultOutput; + Component mVolumeAdjuster; + + static VolumeCatcherImpl *getInstance(); +private: + // This is a singleton class -- both callers and the component implementation should use getInstance() to find the instance. + VolumeCatcherImpl(); + static VolumeCatcherImpl *sInstance; + + // The singlar instance of this class is expected to last until the process exits. + // To ensure this, we declare the destructor here but never define it, so any code which attempts to destroy the instance will not link. + ~VolumeCatcherImpl(); + + F32 mVolume; + F32 mPan; +}; + +VolumeCatcherImpl *VolumeCatcherImpl::sInstance = NULL;; + +struct VolumeCatcherStorage +{ + ComponentInstance self; + ComponentInstance delegate; +}; + +static ComponentResult volume_catcher_component_entry(ComponentParameters *cp, Handle componentStorage); +static ComponentResult volume_catcher_component_open(VolumeCatcherStorage *storage, ComponentInstance self); +static ComponentResult volume_catcher_component_close(VolumeCatcherStorage *storage, ComponentInstance self); + +VolumeCatcherImpl *VolumeCatcherImpl::getInstance() +{ + if(!sInstance) + { + sInstance = new VolumeCatcherImpl; + } + + return sInstance; +} + +VolumeCatcherImpl::VolumeCatcherImpl() +{ + mVolume = 1.0; // default to full volume + mPan = 0.0; // and center pan + + ComponentDescription desc; + desc.componentType = kAudioUnitType_Output; + desc.componentSubType = kAudioUnitSubType_DefaultOutput; + desc.componentManufacturer = kAudioUnitManufacturer_Apple; + desc.componentFlags = 0; + desc.componentFlagsMask = 0; + + // Find the original default output component + mOriginalDefaultOutput = FindNextComponent(NULL, &desc); + + // Register our own output component with the same parameters + mVolumeAdjuster = RegisterComponent(&desc, NewComponentRoutineUPP(volume_catcher_component_entry), 0, NULL, NULL, NULL); + + // Capture the original component, so we always get found instead. + CaptureComponent(mOriginalDefaultOutput, mVolumeAdjuster); + +} + +static ComponentResult volume_catcher_component_entry(ComponentParameters *cp, Handle componentStorage) +{ + ComponentResult result = badComponentSelector; + VolumeCatcherStorage *storage = (VolumeCatcherStorage*)componentStorage; + + switch(cp->what) + { + case kComponentOpenSelect: +// std::cerr << "kComponentOpenSelect" << std::endl; + result = CallComponentFunctionWithStorageProcInfo((Handle)storage, cp, (ProcPtr)volume_catcher_component_open, uppCallComponentOpenProcInfo); + break; + + case kComponentCloseSelect: +// std::cerr << "kComponentCloseSelect" << std::endl; + result = CallComponentFunctionWithStorageProcInfo((Handle)storage, cp, (ProcPtr)volume_catcher_component_close, uppCallComponentCloseProcInfo); + // CallComponentFunctionWithStorageProcInfo + break; + + default: +// std::cerr << "Delegating selector: " << cp->what << " to component instance " << storage->delegate << std::endl; + result = DelegateComponentCall(cp, storage->delegate); + break; + } + + return result; +} + +static ComponentResult volume_catcher_component_open(VolumeCatcherStorage *storage, ComponentInstance self) +{ + ComponentResult result = noErr; + VolumeCatcherImpl *impl = VolumeCatcherImpl::getInstance(); + + storage = new VolumeCatcherStorage; + + storage->self = self; + storage->delegate = NULL; + + result = OpenAComponent(impl->mOriginalDefaultOutput, &(storage->delegate)); + + if(result != noErr) + { +// std::cerr << "OpenAComponent result = " << result << ", component ref = " << storage->delegate << std::endl; + + // If we failed to open the delagate component, our open is going to fail. Clean things up. + delete storage; + } + else + { + // Success -- set up this component's storage + SetComponentInstanceStorage(self, (Handle)storage); + + // add this instance to the global list + impl->mComponentInstances.push_back(storage); + + // and set up the initial volume + impl->setInstanceVolume(storage); + } + + return result; +} + +static ComponentResult volume_catcher_component_close(VolumeCatcherStorage *storage, ComponentInstance self) +{ + ComponentResult result = noErr; + + if(storage) + { + if(storage->delegate) + { + CloseComponent(storage->delegate); + storage->delegate = NULL; + } + + VolumeCatcherImpl *impl = VolumeCatcherImpl::getInstance(); + impl->mComponentInstances.remove(storage); + delete[] storage; + } + + return result; +} + +void VolumeCatcherImpl::setVolume(F32 volume) +{ + VolumeCatcherImpl *impl = VolumeCatcherImpl::getInstance(); + impl->mVolume = volume; + + // Iterate through all known instances, setting the volume on each. + for(std::list<VolumeCatcherStorage*>::iterator iter = mComponentInstances.begin(); iter != mComponentInstances.end(); ++iter) + { + impl->setInstanceVolume(*iter); + } +} + +void VolumeCatcherImpl::setPan(F32 pan) +{ + VolumeCatcherImpl *impl = VolumeCatcherImpl::getInstance(); + impl->mPan = pan; + + // TODO: implement this. + // This will probably require adding a "panner" audio unit to the chain somehow. + // There's also a "3d mixer" component that we might be able to use... +} + +void VolumeCatcherImpl::setInstanceVolume(VolumeCatcherStorage *instance) +{ +// std::cerr << "Setting volume on component instance: " << (instance->delegate) << " to " << mVolume << std::endl; + + OSStatus err = noErr; + + if(instance && instance->delegate) + { + err = AudioUnitSetParameter( + instance->delegate, + kHALOutputParam_Volume, + kAudioUnitScope_Global, + 0, + mVolume, + 0); + } + + if(err) + { +// std::cerr << " AudioUnitSetParameter returned " << err << std::endl; + } +} + +///////////////////////////////////////////////////// + +VolumeCatcher::VolumeCatcher() +{ + pimpl = VolumeCatcherImpl::getInstance(); +} + +VolumeCatcher::~VolumeCatcher() +{ + // Let the instance persist until exit. +} + +void VolumeCatcher::setVolume(F32 volume) +{ + pimpl->setVolume(volume); +} + +void VolumeCatcher::setPan(F32 pan) +{ + pimpl->setPan(pan); +} + +void VolumeCatcher::pump() +{ + // No periodic tasks are necessary for this implementation. +} + diff --git a/indra/media_plugins/webkit/media_plugin_webkit.cpp b/indra/media_plugins/webkit/media_plugin_webkit.cpp index b607d2f66a..a9ff7bf752 100644 --- a/indra/media_plugins/webkit/media_plugin_webkit.cpp +++ b/indra/media_plugins/webkit/media_plugin_webkit.cpp @@ -43,12 +43,18 @@ #include "llpluginmessageclasses.h" #include "media_plugin_base.h" +// set to 1 if you're using the version of llqtwebkit that's QPixmap-ified #if LL_LINUX +# define LL_QTWEBKIT_USES_PIXMAPS 0 extern "C" { # include <glib.h> } +#else +# define LL_QTWEBKIT_USES_PIXMAPS 0 #endif // LL_LINUX +# include "volume_catcher.h" + #if LL_WINDOWS # include <direct.h> #else @@ -83,10 +89,16 @@ public: private: std::string mProfileDir; + std::string mHostLanguage; + std::string mUserAgent; + bool mCookiesEnabled; + bool mJavascriptEnabled; + bool mPluginsEnabled; enum { - INIT_STATE_UNINITIALIZED, // Browser instance hasn't been set up yet + INIT_STATE_UNINITIALIZED, // LLQtWebkit hasn't been set up yet + INIT_STATE_INITIALIZED, // LLQtWebkit has been set up, but no browser window has been created yet. INIT_STATE_NAVIGATING, // Browser instance has been set up and initial navigate to about:blank has been issued INIT_STATE_NAVIGATE_COMPLETE, // initial navigate to about:blank has completed INIT_STATE_WAIT_REDRAW, // First real navigate begin has been received, waiting for page changed event to start handling redraws @@ -108,6 +120,8 @@ private: F32 mBackgroundG; F32 mBackgroundB; + VolumeCatcher mVolumeCatcher; + void setInitState(int state) { // std::cerr << "changing init state to " << state << std::endl; @@ -130,6 +144,8 @@ private: // pump qt LLQtWebKit::getInstance()->pump( milliseconds ); + mVolumeCatcher.pump(); + checkEditState(); if(mInitState == INIT_STATE_NAVIGATE_COMPLETE) @@ -146,7 +162,11 @@ private: { const unsigned char* browser_pixels = LLQtWebKit::getInstance()->grabBrowserWindow( mBrowserWindowId ); - unsigned int buffer_size = LLQtWebKit::getInstance()->getBrowserRowSpan( mBrowserWindowId ) * LLQtWebKit::getInstance()->getBrowserHeight( mBrowserWindowId ); + unsigned int rowspan = LLQtWebKit::getInstance()->getBrowserRowSpan( mBrowserWindowId ); + unsigned int height = LLQtWebKit::getInstance()->getBrowserHeight( mBrowserWindowId ); +#if !LL_QTWEBKIT_USES_PIXMAPS + unsigned int buffer_size = rowspan * height; +#endif // !LL_QTWEBKIT_USES_PIXMAPS // std::cerr << "webkit plugin: updating" << std::endl; @@ -154,7 +174,16 @@ private: if ( mPixels && browser_pixels ) { // std::cerr << " memcopy of " << buffer_size << " bytes" << std::endl; + +#if LL_QTWEBKIT_USES_PIXMAPS + // copy the pixel data upside-down because of the co-ord system + for (int y=0; y<height; ++y) + { + memcpy( &mPixels[(height-y-1)*rowspan], &browser_pixels[y*rowspan], rowspan ); + } +#else memcpy( mPixels, browser_pixels, buffer_size ); +#endif // LL_QTWEBKIT_USES_PIXMAPS } if ( mWidth > 0 && mHeight > 0 ) @@ -175,13 +204,6 @@ private: if ( mInitState > INIT_STATE_UNINITIALIZED ) return true; - // not enough information to initialize the browser yet. - if ( mWidth < 0 || mHeight < 0 || mDepth < 0 || - mTextureWidth < 0 || mTextureHeight < 0 ) - { - return false; - }; - // set up directories char cwd[ FILENAME_MAX ]; // I *think* this is defined on all platforms we use if (NULL == getcwd( cwd, FILENAME_MAX - 1 )) @@ -192,12 +214,12 @@ private: std::string application_dir = std::string( cwd ); #if LL_DARWIN - // When running under the Xcode debugger, there's a setting called "Break on Debugger()/DebugStr()" which defaults to being turned on. - // This causes the environment variable USERBREAK to be set to 1, which causes these legacy calls to break into the debugger. - // This wouldn't cause any problems except for the fact that the current release version of the Flash plugin has a call to Debugger() in it - // which gets hit when the plugin is probed by webkit. - // Unsetting the environment variable here works around this issue. - unsetenv("USERBREAK"); + // When running under the Xcode debugger, there's a setting called "Break on Debugger()/DebugStr()" which defaults to being turned on. + // This causes the environment variable USERBREAK to be set to 1, which causes these legacy calls to break into the debugger. + // This wouldn't cause any problems except for the fact that the current release version of the Flash plugin has a call to Debugger() in it + // which gets hit when the plugin is probed by webkit. + // Unsetting the environment variable here works around this issue. + unsetenv("USERBREAK"); #endif #if LL_WINDOWS @@ -238,65 +260,94 @@ private: bool result = LLQtWebKit::getInstance()->init( application_dir, component_dir, mProfileDir, native_window_handle ); if ( result ) { - // create single browser window - mBrowserWindowId = LLQtWebKit::getInstance()->createBrowserWindow( mWidth, mHeight ); -#if LL_WINDOWS - // Enable plugins - LLQtWebKit::getInstance()->enablePlugins(true); -#elif LL_DARWIN - // Enable plugins - LLQtWebKit::getInstance()->enablePlugins(true); -#elif LL_LINUX - // Enable plugins - LLQtWebKit::getInstance()->enablePlugins(true); -#endif - // Enable cookies - LLQtWebKit::getInstance()->enableCookies( true ); - - // tell LLQtWebKit about the size of the browser window - LLQtWebKit::getInstance()->setSize( mBrowserWindowId, mWidth, mHeight ); - - // observer events that LLQtWebKit emits - LLQtWebKit::getInstance()->addObserver( mBrowserWindowId, this ); - - // append details to agent string - LLQtWebKit::getInstance()->setBrowserAgentId( "LLPluginMedia Web Browser" ); - - // don't flip bitmap - LLQtWebKit::getInstance()->flipWindow( mBrowserWindowId, true ); - - // set background color - // convert background color channels from [0.0, 1.0] to [0, 255]; - LLQtWebKit::getInstance()->setBackgroundColor( mBrowserWindowId, int(mBackgroundR * 255.0f), int(mBackgroundG * 255.0f), int(mBackgroundB * 255.0f) ); - - // Set state _before_ starting the navigate, since onNavigateBegin might get called before this call returns. - setInitState(INIT_STATE_NAVIGATING); - - // Don't do this here -- it causes the dreaded "white flash" when loading a browser instance. - // FIXME: Re-added this because navigating to a "page" initializes things correctly - especially - // for the HTTP AUTH dialog issues (DEV-41731). Will fix at a later date. - // Build a data URL like this: "data:text/html,%3Chtml%3E%3Cbody bgcolor=%22#RRGGBB%22%3E%3C/body%3E%3C/html%3E" - // where RRGGBB is the background color in HTML style - std::stringstream url; + mInitState = INIT_STATE_INITIALIZED; - url << "data:text/html,%3Chtml%3E%3Cbody%20bgcolor=%22#"; - // convert background color channels from [0.0, 1.0] to [0, 255]; - url << std::setfill('0') << std::setw(2) << std::hex << int(mBackgroundR * 255.0f); - url << std::setfill('0') << std::setw(2) << std::hex << int(mBackgroundG * 255.0f); - url << std::setfill('0') << std::setw(2) << std::hex << int(mBackgroundB * 255.0f); - url << "%22%3E%3C/body%3E%3C/html%3E"; - - lldebugs << "data url is: " << url.str() << llendl; - - LLQtWebKit::getInstance()->navigateTo( mBrowserWindowId, url.str() ); -// LLQtWebKit::getInstance()->navigateTo( mBrowserWindowId, "about:blank" ); - return true; }; return false; }; + //////////////////////////////////////////////////////////////////////////////// + // + bool initBrowserWindow() + { + // already initialized + if ( mInitState > INIT_STATE_INITIALIZED ) + return true; + + // not enough information to initialize the browser yet. + if ( mWidth < 0 || mHeight < 0 || mDepth < 0 || + mTextureWidth < 0 || mTextureHeight < 0 ) + { + return false; + }; + + // Set up host language before creating browser window + if(!mHostLanguage.empty()) + { + LLQtWebKit::getInstance()->setHostLanguage(mHostLanguage); + } + + // turn on/off cookies based on what host app tells us + LLQtWebKit::getInstance()->enableCookies( mCookiesEnabled ); + + // turn on/off plugins based on what host app tells us + LLQtWebKit::getInstance()->enablePlugins( mPluginsEnabled ); + + // turn on/off Javascript based on what host app tells us + LLQtWebKit::getInstance()->enableJavascript( mJavascriptEnabled ); + + // create single browser window + mBrowserWindowId = LLQtWebKit::getInstance()->createBrowserWindow( mWidth, mHeight ); + + // tell LLQtWebKit about the size of the browser window + LLQtWebKit::getInstance()->setSize( mBrowserWindowId, mWidth, mHeight ); + + // observer events that LLQtWebKit emits + LLQtWebKit::getInstance()->addObserver( mBrowserWindowId, this ); + + // append details to agent string + LLQtWebKit::getInstance()->setBrowserAgentId( mUserAgent ); + + // Set up window open behavior + LLQtWebKit::getInstance()->setWindowOpenBehavior(mBrowserWindowId, LLQtWebKit::WOB_SIMULATE_BLANK_HREF_CLICK); + +#if !LL_QTWEBKIT_USES_PIXMAPS + // don't flip bitmap + LLQtWebKit::getInstance()->flipWindow( mBrowserWindowId, true ); +#endif // !LL_QTWEBKIT_USES_PIXMAPS + + // set background color + // convert background color channels from [0.0, 1.0] to [0, 255]; + LLQtWebKit::getInstance()->setBackgroundColor( mBrowserWindowId, int(mBackgroundR * 255.0f), int(mBackgroundG * 255.0f), int(mBackgroundB * 255.0f) ); + + // Set state _before_ starting the navigate, since onNavigateBegin might get called before this call returns. + setInitState(INIT_STATE_NAVIGATING); + + // Don't do this here -- it causes the dreaded "white flash" when loading a browser instance. + // FIXME: Re-added this because navigating to a "page" initializes things correctly - especially + // for the HTTP AUTH dialog issues (DEV-41731). Will fix at a later date. + // Build a data URL like this: "data:text/html,%3Chtml%3E%3Cbody bgcolor=%22#RRGGBB%22%3E%3C/body%3E%3C/html%3E" + // where RRGGBB is the background color in HTML style + std::stringstream url; + + url << "data:text/html,%3Chtml%3E%3Cbody%20bgcolor=%22#"; + // convert background color channels from [0.0, 1.0] to [0, 255]; + url << std::setfill('0') << std::setw(2) << std::hex << int(mBackgroundR * 255.0f); + url << std::setfill('0') << std::setw(2) << std::hex << int(mBackgroundG * 255.0f); + url << std::setfill('0') << std::setw(2) << std::hex << int(mBackgroundB * 255.0f); + url << "%22%3E%3C/body%3E%3C/html%3E"; + + lldebugs << "data url is: " << url.str() << llendl; + + LLQtWebKit::getInstance()->navigateTo( mBrowserWindowId, url.str() ); +// LLQtWebKit::getInstance()->navigateTo( mBrowserWindowId, "about:blank" ); + + return true; + } + + void setVolume(F32 vol); //////////////////////////////////////////////////////////////////////////////// // virtual @@ -467,6 +518,19 @@ private: sendMessage(message); } + + //////////////////////////////////////////////////////////////////////////////// + // virtual + void onCookieChanged(const EventType& event) + { + LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "cookie_set"); + message.setValue("cookie", event.getStringValue()); + // These could be passed through as well, but aren't really needed. +// message.setValue("uri", event.getEventUri()); +// message.setValueBoolean("dead", (event.getIntValue() != 0)) + sendMessage(message); + } + LLQtWebKit::EKeyboardModifier decodeModifiers(std::string &modifiers) { int result = 0; @@ -486,92 +550,96 @@ private: return (LLQtWebKit::EKeyboardModifier)result; } - //////////////////////////////////////////////////////////////////////////////// // - void keyEvent(LLQtWebKit::EKeyEvent key_event, int key, LLQtWebKit::EKeyboardModifier modifiers) + void deserializeKeyboardData( LLSD native_key_data, uint32_t& native_scan_code, uint32_t& native_virtual_key, uint32_t& native_modifiers ) { - int llqt_key; + native_scan_code = 0; + native_virtual_key = 0; + native_modifiers = 0; + if( native_key_data.isMap() ) + { +#if LL_DARWIN + native_scan_code = (uint32_t)(native_key_data["char_code"].asInteger()); + native_virtual_key = (uint32_t)(native_key_data["key_code"].asInteger()); + native_modifiers = (uint32_t)(native_key_data["modifiers"].asInteger()); +#elif LL_WINDOWS + native_scan_code = (uint32_t)(native_key_data["scan_code"].asInteger()); + native_virtual_key = (uint32_t)(native_key_data["virtual_key"].asInteger()); + // TODO: I don't think we need to do anything with native modifiers here -- please verify +#elif LL_LINUX + native_scan_code = (uint32_t)(native_key_data["scan_code"].asInteger()); + native_virtual_key = (uint32_t)(native_key_data["virtual_key"].asInteger()); + native_modifiers = (uint32_t)(native_key_data["modifiers"].asInteger()); +#else + // Add other platforms here as needed +#endif + }; + }; + + //////////////////////////////////////////////////////////////////////////////// + // + void keyEvent(LLQtWebKit::EKeyEvent key_event, int key, LLQtWebKit::EKeyboardModifier modifiers, LLSD native_key_data = LLSD::emptyMap()) + { // The incoming values for 'key' will be the ones from indra_constants.h - // the outgoing values are the ones from llqtwebkit.h + std::string utf8_text; + if(key < KEY_SPECIAL) + { + // Low-ascii characters need to get passed through. + utf8_text = (char)key; + } + + // Any special-case handling we want to do for particular keys... switch((KEY)key) { - // This is the list that the llqtwebkit implementation actually maps into Qt keys. -// case KEY_XXX: llqt_key = LL_DOM_VK_CANCEL; break; -// case KEY_XXX: llqt_key = LL_DOM_VK_HELP; break; - case KEY_BACKSPACE: llqt_key = LL_DOM_VK_BACK_SPACE; break; - case KEY_TAB: llqt_key = LL_DOM_VK_TAB; break; -// case KEY_XXX: llqt_key = LL_DOM_VK_CLEAR; break; - case KEY_RETURN: llqt_key = LL_DOM_VK_RETURN; break; - case KEY_PAD_RETURN: llqt_key = LL_DOM_VK_ENTER; break; - case KEY_SHIFT: llqt_key = LL_DOM_VK_SHIFT; break; - case KEY_CONTROL: llqt_key = LL_DOM_VK_CONTROL; break; - case KEY_ALT: llqt_key = LL_DOM_VK_ALT; break; -// case KEY_XXX: llqt_key = LL_DOM_VK_PAUSE; break; - case KEY_CAPSLOCK: llqt_key = LL_DOM_VK_CAPS_LOCK; break; - case KEY_ESCAPE: llqt_key = LL_DOM_VK_ESCAPE; break; - case KEY_PAGE_UP: llqt_key = LL_DOM_VK_PAGE_UP; break; - case KEY_PAGE_DOWN: llqt_key = LL_DOM_VK_PAGE_DOWN; break; - case KEY_END: llqt_key = LL_DOM_VK_END; break; - case KEY_HOME: llqt_key = LL_DOM_VK_HOME; break; - case KEY_LEFT: llqt_key = LL_DOM_VK_LEFT; break; - case KEY_UP: llqt_key = LL_DOM_VK_UP; break; - case KEY_RIGHT: llqt_key = LL_DOM_VK_RIGHT; break; - case KEY_DOWN: llqt_key = LL_DOM_VK_DOWN; break; -// case KEY_XXX: llqt_key = LL_DOM_VK_PRINTSCREEN; break; - case KEY_INSERT: llqt_key = LL_DOM_VK_INSERT; break; - case KEY_DELETE: llqt_key = LL_DOM_VK_DELETE; break; -// case KEY_XXX: llqt_key = LL_DOM_VK_CONTEXT_MENU; break; + // ASCII codes for some standard keys + case LLQtWebKit::KEY_BACKSPACE: utf8_text = (char)8; break; + case LLQtWebKit::KEY_TAB: utf8_text = (char)9; break; + case LLQtWebKit::KEY_RETURN: utf8_text = (char)13; break; + case LLQtWebKit::KEY_PAD_RETURN: utf8_text = (char)13; break; + case LLQtWebKit::KEY_ESCAPE: utf8_text = (char)27; break; - default: - if(key < KEY_SPECIAL) - { - // Pass the incoming key through -- it should be regular ASCII, which should be correct for webkit. - llqt_key = key; - } - else - { - // Don't pass through untranslated special keys -- they'll be all wrong. - llqt_key = 0; - } + default: break; } -// std::cerr << "keypress, original code = 0x" << std::hex << key << ", converted code = 0x" << std::hex << llqt_key << std::dec << std::endl; +// std::cerr << "key event " << (int)key_event << ", native_key_data = " << native_key_data << std::endl; - if(llqt_key != 0) - { - LLQtWebKit::getInstance()->keyEvent( mBrowserWindowId, key_event, llqt_key, modifiers); - } + uint32_t native_scan_code = 0; + uint32_t native_virtual_key = 0; + uint32_t native_modifiers = 0; + deserializeKeyboardData( native_key_data, native_scan_code, native_virtual_key, native_modifiers ); + + LLQtWebKit::getInstance()->keyboardEvent( mBrowserWindowId, key_event, (uint32_t)key, utf8_text.c_str(), modifiers, native_scan_code, native_virtual_key, native_modifiers); checkEditState(); }; //////////////////////////////////////////////////////////////////////////////// // - void unicodeInput( const std::string &utf8str, LLQtWebKit::EKeyboardModifier modifiers) - { - LLWString wstr = utf8str_to_wstring(utf8str); + void unicodeInput( const std::string &utf8str, LLQtWebKit::EKeyboardModifier modifiers, LLSD native_key_data = LLSD::emptyMap()) + { + uint32_t key = LLQtWebKit::KEY_NONE; - unsigned int i; - for(i=0; i < wstr.size(); i++) +// std::cerr << "unicode input, native_key_data = " << native_key_data << std::endl; + + if(utf8str.size() == 1) { -// std::cerr << "unicode input, code = 0x" << std::hex << (unsigned long)(wstr[i]) << std::dec << std::endl; - - if(wstr[i] == 32) - { - // For some reason, the webkit plugin really wants the space bar to come in through the key-event path, not the unicode path. - LLQtWebKit::getInstance()->keyEvent( mBrowserWindowId, LLQtWebKit::KE_KEY_DOWN, 32, modifiers); - LLQtWebKit::getInstance()->keyEvent( mBrowserWindowId, LLQtWebKit::KE_KEY_UP, 32, modifiers); - } - else - { - LLQtWebKit::getInstance()->unicodeInput(mBrowserWindowId, wstr[i], modifiers); - } + // The only way a utf8 string can be one byte long is if it's actually a single 7-bit ascii character. + // In this case, use it as the key value. + key = utf8str[0]; } + uint32_t native_scan_code = 0; + uint32_t native_virtual_key = 0; + uint32_t native_modifiers = 0; + deserializeKeyboardData( native_key_data, native_scan_code, native_virtual_key, native_modifiers ); + + LLQtWebKit::getInstance()->keyboardEvent( mBrowserWindowId, LLQtWebKit::KE_KEY_DOWN, (uint32_t)key, utf8str.c_str(), modifiers, native_scan_code, native_virtual_key, native_modifiers); + LLQtWebKit::getInstance()->keyboardEvent( mBrowserWindowId, LLQtWebKit::KE_KEY_UP, (uint32_t)key, utf8str.c_str(), modifiers, native_scan_code, native_virtual_key, native_modifiers); + checkEditState(); }; @@ -627,6 +695,11 @@ MediaPluginWebKit::MediaPluginWebKit(LLPluginInstance::sendMessageFunction host_ mBackgroundR = 0.0f; mBackgroundG = 0.0f; mBackgroundB = 0.0f; + + mHostLanguage = "en"; // default to english + mJavascriptEnabled = true; // default to on + mPluginsEnabled = true; // default to on + mUserAgent = "LLPluginMedia Web Browser"; } MediaPluginWebKit::~MediaPluginWebKit() @@ -653,9 +726,6 @@ void MediaPluginWebKit::receiveMessage(const char *message_string) { if(message_name == "init") { - std::string user_data_path = message_in.getValue("user_data_path"); // n.b. always has trailing platform-specific dir-delimiter - mProfileDir = user_data_path + "browser_profile"; - LLPluginMessage message("base", "init_response"); LLSD versions = LLSD::emptyMap(); versions[LLPLUGIN_MESSAGE_CLASS_BASE] = LLPLUGIN_MESSAGE_CLASS_BASE_VERSION; @@ -667,19 +737,6 @@ void MediaPluginWebKit::receiveMessage(const char *message_string) plugin_version += LLQtWebKit::getInstance()->getVersion(); message.setValue("plugin_version", plugin_version); sendMessage(message); - - // Plugin gets to decide the texture parameters to use. - mDepth = 4; - - message.setMessage(LLPLUGIN_MESSAGE_CLASS_MEDIA, "texture_params"); - message.setValueS32("default_width", 1024); - message.setValueS32("default_height", 1024); - message.setValueS32("depth", mDepth); - message.setValueU32("internalformat", GL_RGBA); - message.setValueU32("format", GL_RGBA); - message.setValueU32("type", GL_UNSIGNED_BYTE); - message.setValueBoolean("coords_opengl", true); - sendMessage(message); } else if(message_name == "idle") { @@ -744,9 +801,68 @@ void MediaPluginWebKit::receiveMessage(const char *message_string) // std::cerr << "MediaPluginWebKit::receiveMessage: unknown base message: " << message_name << std::endl; } } + else if(message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME) + { + if(message_name == "set_volume") + { + F32 volume = message_in.getValueReal("volume"); + setVolume(volume); + } + } else if(message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA) { - if(message_name == "size_change") + if(message_name == "init") + { + // This is the media init message -- all necessary data for initialization should have been received. + if(initBrowser()) + { + + // Plugin gets to decide the texture parameters to use. + mDepth = 4; + + LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "texture_params"); + message.setValueS32("default_width", 1024); + message.setValueS32("default_height", 1024); + message.setValueS32("depth", mDepth); + message.setValueU32("internalformat", GL_RGBA); + #if LL_QTWEBKIT_USES_PIXMAPS + message.setValueU32("format", GL_BGRA_EXT); // I hope this isn't system-dependant... is it? If so, we'll have to check the root window's pixel layout or something... yuck. + #else + message.setValueU32("format", GL_RGBA); + #endif // LL_QTWEBKIT_USES_PIXMAPS + message.setValueU32("type", GL_UNSIGNED_BYTE); + message.setValueBoolean("coords_opengl", true); + sendMessage(message); + } + else + { + // if initialization failed, we're done. + mDeleteMe = true; + } + + } + else if(message_name == "set_user_data_path") + { + std::string user_data_path = message_in.getValue("path"); // n.b. always has trailing platform-specific dir-delimiter + mProfileDir = user_data_path + "browser_profile"; + + // FIXME: Should we do anything with this if it comes in after the browser has been initialized? + } + else if(message_name == "set_language_code") + { + mHostLanguage = message_in.getValue("language"); + + // FIXME: Should we do anything with this if it comes in after the browser has been initialized? + } + else if(message_name == "plugins_enabled") + { + mPluginsEnabled = message_in.getValueBoolean("enable"); + } + else if(message_name == "javascript_enabled") + { + mJavascriptEnabled = message_in.getValueBoolean("enable"); + } + else if(message_name == "size_change") { std::string name = message_in.getValue("name"); S32 width = message_in.getValueS32("width"); @@ -768,29 +884,36 @@ void MediaPluginWebKit::receiveMessage(const char *message_string) mWidth = width; mHeight = height; - // initialize (only gets called once) - initBrowser(); - - // size changed so tell the browser - LLQtWebKit::getInstance()->setSize( mBrowserWindowId, mWidth, mHeight ); - -// std::cerr << "webkit plugin: set size to " << mWidth << " x " << mHeight -// << ", rowspan is " << LLQtWebKit::getInstance()->getBrowserRowSpan(mBrowserWindowId) << std::endl; - - S32 real_width = LLQtWebKit::getInstance()->getBrowserRowSpan(mBrowserWindowId) / LLQtWebKit::getInstance()->getBrowserDepth(mBrowserWindowId); - - // The actual width the browser will be drawing to is probably smaller... let the host know by modifying texture_width in the response. - if(real_width <= texture_width) + if(initBrowserWindow()) { - texture_width = real_width; + + // size changed so tell the browser + LLQtWebKit::getInstance()->setSize( mBrowserWindowId, mWidth, mHeight ); + + // std::cerr << "webkit plugin: set size to " << mWidth << " x " << mHeight + // << ", rowspan is " << LLQtWebKit::getInstance()->getBrowserRowSpan(mBrowserWindowId) << std::endl; + + S32 real_width = LLQtWebKit::getInstance()->getBrowserRowSpan(mBrowserWindowId) / LLQtWebKit::getInstance()->getBrowserDepth(mBrowserWindowId); + + // The actual width the browser will be drawing to is probably smaller... let the host know by modifying texture_width in the response. + if(real_width <= texture_width) + { + texture_width = real_width; + } + else + { + // This won't work -- it'll be bigger than the allocated memory. This is a fatal error. + // std::cerr << "Fatal error: browser rowbytes greater than texture width" << std::endl; + mDeleteMe = true; + return; + } } else { - // This won't work -- it'll be bigger than the allocated memory. This is a fatal error. -// std::cerr << "Fatal error: browser rowbytes greater than texture width" << std::endl; + // Setting up the browser window failed. This is a fatal error. mDeleteMe = true; - return; } + mTextureWidth = texture_width; mTextureHeight = texture_height; @@ -871,6 +994,7 @@ void MediaPluginWebKit::receiveMessage(const char *message_string) std::string event = message_in.getValue("event"); S32 key = message_in.getValueS32("key"); std::string modifiers = message_in.getValue("modifiers"); + LLSD native_key_data = message_in.getValueLLSD("native_key_data"); // Treat unknown events as key-up for safety. LLQtWebKit::EKeyEvent key_event = LLQtWebKit::KE_KEY_UP; @@ -883,14 +1007,15 @@ void MediaPluginWebKit::receiveMessage(const char *message_string) key_event = LLQtWebKit::KE_KEY_REPEAT; } - keyEvent(key_event, key, decodeModifiers(modifiers)); + keyEvent(key_event, key, decodeModifiers(modifiers), native_key_data); } else if(message_name == "text_event") { std::string text = message_in.getValue("text"); std::string modifiers = message_in.getValue("modifiers"); + LLSD native_key_data = message_in.getValueLLSD("native_key_data"); - unicodeInput(text, decodeModifiers(modifiers)); + unicodeInput(text, decodeModifiers(modifiers), native_key_data); } if(message_name == "edit_cut") { @@ -938,8 +1063,22 @@ void MediaPluginWebKit::receiveMessage(const char *message_string) } else if(message_name == "enable_cookies") { - bool val = message_in.getValueBoolean("enable"); - LLQtWebKit::getInstance()->enableCookies( val ); + mCookiesEnabled = message_in.getValueBoolean("enable"); + LLQtWebKit::getInstance()->enableCookies( mCookiesEnabled ); + } + else if(message_name == "enable_plugins") + { + mPluginsEnabled = message_in.getValueBoolean("enable"); + LLQtWebKit::getInstance()->enablePlugins( mPluginsEnabled ); + } + else if(message_name == "enable_javascript") + { + mJavascriptEnabled = message_in.getValueBoolean("enable"); + //LLQtWebKit::getInstance()->enableJavascript( mJavascriptEnabled ); + } + else if(message_name == "set_cookies") + { + LLQtWebKit::getInstance()->setCookies(message_in.getValue("cookies")); } else if(message_name == "proxy_setup") { @@ -976,8 +1115,8 @@ void MediaPluginWebKit::receiveMessage(const char *message_string) } else if(message_name == "set_user_agent") { - std::string user_agent = message_in.getValue("user_agent"); - LLQtWebKit::getInstance()->setBrowserAgentId( user_agent ); + mUserAgent = message_in.getValue("user_agent"); + LLQtWebKit::getInstance()->setBrowserAgentId( mUserAgent ); } else if(message_name == "init_history") { @@ -1008,6 +1147,11 @@ void MediaPluginWebKit::receiveMessage(const char *message_string) } } +void MediaPluginWebKit::setVolume(F32 volume) +{ + mVolumeCatcher.setVolume(volume); +} + int init_media_plugin(LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data, LLPluginInstance::sendMessageFunction *plugin_send_func, void **plugin_user_data) { MediaPluginWebKit *self = new MediaPluginWebKit(host_send_func, host_user_data); diff --git a/indra/media_plugins/webkit/volume_catcher.h b/indra/media_plugins/webkit/volume_catcher.h new file mode 100644 index 0000000000..77b10cfed0 --- /dev/null +++ b/indra/media_plugins/webkit/volume_catcher.h @@ -0,0 +1,59 @@ +/** + * @file volume_catcher.h + * @brief Interface to a class with platform-specific implementations that allows control of the audio volume of all sources in the current process. + * + * @cond + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlife.com/developers/opensource/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlife.com/developers/opensource/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + * @endcond + */ + +#ifndef VOLUME_CATCHER_H +#define VOLUME_CATCHER_H + +#include "linden_common.h" + +class VolumeCatcherImpl; + +class VolumeCatcher +{ + public: + VolumeCatcher(); + ~VolumeCatcher(); + + void setVolume(F32 volume); // 0.0 - 1.0 + + // Set the left-right pan of audio sources + // where -1.0 = left, 0 = center, and 1.0 = right + void setPan(F32 pan); + + void pump(); // call this at least a few times a second if you can - it affects how quickly we can 'catch' a new audio source and adjust its volume + + private: + VolumeCatcherImpl *pimpl; +}; + +#endif // VOLUME_CATCHER_H diff --git a/indra/media_plugins/webkit/windows_volume_catcher.cpp b/indra/media_plugins/webkit/windows_volume_catcher.cpp new file mode 100644 index 0000000000..ef96102a0a --- /dev/null +++ b/indra/media_plugins/webkit/windows_volume_catcher.cpp @@ -0,0 +1,122 @@ +/** + * @file windows_volume_catcher.cpp + * @brief A Windows implementation of volume level control of all audio channels opened by a process. + * + * @cond + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlife.com/developers/opensource/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlife.com/developers/opensource/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + * @endcond + */ + +#include "volume_catcher.h" +#include <windows.h> +#include "llsingleton.h" +class VolumeCatcherImpl : public LLSingleton<VolumeCatcherImpl> +{ +friend LLSingleton<VolumeCatcherImpl>; +public: + + void setVolume(F32 volume); + void setPan(F32 pan); + +private: + // This is a singleton class -- both callers and the component implementation should use getInstance() to find the instance. + VolumeCatcherImpl(); + ~VolumeCatcherImpl(); + + typedef void (WINAPI *set_volume_func_t)(F32); + typedef void (WINAPI *set_mute_func_t)(bool); + + set_volume_func_t mSetVolumeFunc; + set_mute_func_t mSetMuteFunc; + + F32 mVolume; + F32 mPan; +}; +VolumeCatcherImpl::VolumeCatcherImpl() +: mVolume(1.0f), // default volume is max + mPan(0.f) // default pan is centered +{ + HMODULE handle = ::LoadLibrary(L"winmm.dll"); + if(handle) + { + mSetVolumeFunc = (set_volume_func_t)::GetProcAddress(handle, "setPluginVolume"); + mSetMuteFunc = (set_mute_func_t)::GetProcAddress(handle, "setPluginMute"); + } +} + +VolumeCatcherImpl::~VolumeCatcherImpl() +{ +} + + +void VolumeCatcherImpl::setVolume(F32 volume) +{ + mVolume = volume; + + if (mSetMuteFunc) + { + mSetMuteFunc(volume == 0.f); + } + if (mSetVolumeFunc) + { + mSetVolumeFunc(mVolume); + } +} + +void VolumeCatcherImpl::setPan(F32 pan) +{ // remember pan for calculating individual channel levels later + mPan = pan; +} + +///////////////////////////////////////////////////// + +VolumeCatcher::VolumeCatcher() +{ + pimpl = VolumeCatcherImpl::getInstance(); +} + +VolumeCatcher::~VolumeCatcher() +{ + // Let the instance persist until exit. +} + +void VolumeCatcher::setVolume(F32 volume) +{ + pimpl->setVolume(volume); +} + +void VolumeCatcher::setPan(F32 pan) +{ + pimpl->setPan(pan); +} + +void VolumeCatcher::pump() +{ + // No periodic tasks are necessary for this implementation. +} + + diff --git a/indra/media_plugins/winmmshim/CMakeLists.txt b/indra/media_plugins/winmmshim/CMakeLists.txt new file mode 100644 index 0000000000..387214088f --- /dev/null +++ b/indra/media_plugins/winmmshim/CMakeLists.txt @@ -0,0 +1,34 @@ +# -*- cmake -*- + +project(winmm_shim) + +### winmm_shim + +set(winmm_shim_SOURCE_FILES + forwarding_api.cpp + winmm_shim.cpp + ) + +set(winmm_shim_HEADER_FILES + forwarding_api.h + winmm.def + ) + +list(APPEND winmm_shim_SOURCE_FILES ${winmm_shim_HEADER_FILES}) + +set_source_files_properties(${media_plugin_webkit_HEADER_FILES} + PROPERTIES HEADER_FILE_ONLY TRUE) + +add_library(winmm_shim + SHARED + ${winmm_shim_SOURCE_FILES} +) + +if (WINDOWS) + set_target_properties( + winmm_shim + PROPERTIES + LINK_FLAGS "/MANIFEST:NO" + OUTPUT_NAME "winmm" + ) +endif (WINDOWS) diff --git a/indra/media_plugins/winmmshim/forwarding_api.cpp b/indra/media_plugins/winmmshim/forwarding_api.cpp new file mode 100644 index 0000000000..c2f553dfef --- /dev/null +++ b/indra/media_plugins/winmmshim/forwarding_api.cpp @@ -0,0 +1,1460 @@ +/** + * @file forwarding_api.cpp + * @brief forwards winmm API calls to real winmm.dll + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "forwarding_api.h" + +CloseDriver_type CloseDriver_orig; +OpenDriver_type OpenDriver_orig; +SendDriverMessage_type SendDriverMessage_orig; +DrvGetModuleHandle_type DrvGetModuleHandle_orig; +GetDriverModuleHandle_type GetDriverModuleHandle_orig; +DefDriverProc_type DefDriverProc_orig; +DriverCallback_type DriverCallback_orig; +mmsystemGetVersion_type mmsystemGetVersion_orig; +sndPlaySoundA_type sndPlaySoundA_orig; +sndPlaySoundW_type sndPlaySoundW_orig; +PlaySoundA_type PlaySoundA_orig; +PlaySoundW_type PlaySoundW_orig; +waveOutGetNumDevs_type waveOutGetNumDevs_orig; +waveOutGetDevCapsA_type waveOutGetDevCapsA_orig; +waveOutGetDevCapsW_type waveOutGetDevCapsW_orig; +waveOutGetVolume_type waveOutGetVolume_orig; +waveOutSetVolume_type waveOutSetVolume_orig; +waveOutGetErrorTextA_type waveOutGetErrorTextA_orig; +waveOutGetErrorTextW_type waveOutGetErrorTextW_orig; +waveOutOpen_type waveOutOpen_orig; +waveOutClose_type waveOutClose_orig; +waveOutPrepareHeader_type waveOutPrepareHeader_orig; +waveOutUnprepareHeader_type waveOutUnprepareHeader_orig; +waveOutWrite_type waveOutWrite_orig; +waveOutPause_type waveOutPause_orig; +waveOutRestart_type waveOutRestart_orig; +waveOutReset_type waveOutReset_orig; +waveOutBreakLoop_type waveOutBreakLoop_orig; +waveOutGetPosition_type waveOutGetPosition_orig; +waveOutGetPitch_type waveOutGetPitch_orig; +waveOutSetPitch_type waveOutSetPitch_orig; +waveOutGetPlaybackRate_type waveOutGetPlaybackRate_orig; +waveOutSetPlaybackRate_type waveOutSetPlaybackRate_orig; +waveOutGetID_type waveOutGetID_orig; +waveOutMessage_type waveOutMessage_orig; +waveInGetNumDevs_type waveInGetNumDevs_orig; +waveInGetDevCapsA_type waveInGetDevCapsA_orig; +waveInGetDevCapsW_type waveInGetDevCapsW_orig; +waveInGetErrorTextA_type waveInGetErrorTextA_orig; +waveInGetErrorTextW_type waveInGetErrorTextW_orig; +waveInOpen_type waveInOpen_orig; +waveInClose_type waveInClose_orig; +waveInPrepareHeader_type waveInPrepareHeader_orig; +waveInUnprepareHeader_type waveInUnprepareHeader_orig; +waveInAddBuffer_type waveInAddBuffer_orig; +waveInStart_type waveInStart_orig; +waveInStop_type waveInStop_orig; +waveInReset_type waveInReset_orig; +waveInGetPosition_type waveInGetPosition_orig; +waveInGetID_type waveInGetID_orig; +waveInMessage_type waveInMessage_orig; +midiOutGetNumDevs_type midiOutGetNumDevs_orig; +midiStreamOpen_type midiStreamOpen_orig; +midiStreamClose_type midiStreamClose_orig; +midiStreamProperty_type midiStreamProperty_orig; +midiStreamPosition_type midiStreamPosition_orig; +midiStreamOut_type midiStreamOut_orig; +midiStreamPause_type midiStreamPause_orig; +midiStreamRestart_type midiStreamRestart_orig; +midiStreamStop_type midiStreamStop_orig; +midiConnect_type midiConnect_orig; +midiDisconnect_type midiDisconnect_orig; +midiOutGetDevCapsA_type midiOutGetDevCapsA_orig; +midiOutGetDevCapsW_type midiOutGetDevCapsW_orig; +midiOutGetVolume_type midiOutGetVolume_orig; +midiOutSetVolume_type midiOutSetVolume_orig; +midiOutGetErrorTextA_type midiOutGetErrorTextA_orig; +midiOutGetErrorTextW_type midiOutGetErrorTextW_orig; +midiOutOpen_type midiOutOpen_orig; +midiOutClose_type midiOutClose_orig; +midiOutPrepareHeader_type midiOutPrepareHeader_orig; +midiOutUnprepareHeader_type midiOutUnprepareHeader_orig; +midiOutShortMsg_type midiOutShortMsg_orig; +midiOutLongMsg_type midiOutLongMsg_orig; +midiOutReset_type midiOutReset_orig; +midiOutCachePatches_type midiOutCachePatches_orig; +midiOutCacheDrumPatches_type midiOutCacheDrumPatches_orig; +midiOutGetID_type midiOutGetID_orig; +midiOutMessage_type midiOutMessage_orig; +midiInGetNumDevs_type midiInGetNumDevs_orig; +midiInGetDevCapsA_type midiInGetDevCapsA_orig; +midiInGetDevCapsW_type midiInGetDevCapsW_orig; +midiInGetErrorTextA_type midiInGetErrorTextA_orig; +midiInGetErrorTextW_type midiInGetErrorTextW_orig; +midiInOpen_type midiInOpen_orig; +midiInClose_type midiInClose_orig; +midiInPrepareHeader_type midiInPrepareHeader_orig; +midiInUnprepareHeader_type midiInUnprepareHeader_orig; +midiInAddBuffer_type midiInAddBuffer_orig; +midiInStart_type midiInStart_orig; +midiInStop_type midiInStop_orig; +midiInReset_type midiInReset_orig; +midiInGetID_type midiInGetID_orig; +midiInMessage_type midiInMessage_orig; +auxGetNumDevs_type auxGetNumDevs_orig; +auxGetDevCapsA_type auxGetDevCapsA_orig; +auxGetDevCapsW_type auxGetDevCapsW_orig; +auxSetVolume_type auxSetVolume_orig; +auxGetVolume_type auxGetVolume_orig; +auxOutMessage_type auxOutMessage_orig; +mixerGetNumDevs_type mixerGetNumDevs_orig; +mixerGetDevCapsA_type mixerGetDevCapsA_orig; +mixerGetDevCapsW_type mixerGetDevCapsW_orig; +mixerOpen_type mixerOpen_orig; +mixerClose_type mixerClose_orig; +mixerMessage_type mixerMessage_orig; +mixerGetLineInfoA_type mixerGetLineInfoA_orig; +mixerGetLineInfoW_type mixerGetLineInfoW_orig; +mixerGetID_type mixerGetID_orig; +mixerGetLineControlsA_type mixerGetLineControlsA_orig; +mixerGetLineControlsW_type mixerGetLineControlsW_orig; +mixerGetControlDetailsA_type mixerGetControlDetailsA_orig; +mixerGetControlDetailsW_type mixerGetControlDetailsW_orig; +mixerSetControlDetails_type mixerSetControlDetails_orig; +mmGetCurrentTask_type mmGetCurrentTask_orig; +mmTaskBlock_type mmTaskBlock_orig; +mmTaskCreate_type mmTaskCreate_orig; +mmTaskSignal_type mmTaskSignal_orig; +mmTaskYield_type mmTaskYield_orig; +timeGetSystemTime_type timeGetSystemTime_orig; +timeGetTime_type timeGetTime_orig; +timeSetEvent_type timeSetEvent_orig; +timeKillEvent_type timeKillEvent_orig; +timeGetDevCaps_type timeGetDevCaps_orig; +timeBeginPeriod_type timeBeginPeriod_orig; +timeEndPeriod_type timeEndPeriod_orig; +joyGetNumDevs_type joyGetNumDevs_orig; +joyConfigChanged_type joyConfigChanged_orig; +joyGetDevCapsA_type joyGetDevCapsA_orig; +joyGetDevCapsW_type joyGetDevCapsW_orig; +joyGetPos_type joyGetPos_orig; +joyGetPosEx_type joyGetPosEx_orig; +joyGetThreshold_type joyGetThreshold_orig; +joyReleaseCapture_type joyReleaseCapture_orig; +joySetCapture_type joySetCapture_orig; +joySetThreshold_type joySetThreshold_orig; +mmioStringToFOURCCA_type mmioStringToFOURCCA_orig; +mmioStringToFOURCCW_type mmioStringToFOURCCW_orig; +mmioInstallIOProcA_type mmioInstallIOProcA_orig; +mmioInstallIOProcW_type mmioInstallIOProcW_orig; +mmioOpenA_type mmioOpenA_orig; +mmioOpenW_type mmioOpenW_orig; +mmioRenameA_type mmioRenameA_orig; +mmioRenameW_type mmioRenameW_orig; +mmioClose_type mmioClose_orig; +mmioRead_type mmioRead_orig; +mmioWrite_type mmioWrite_orig; +mmioSeek_type mmioSeek_orig; +mmioGetInfo_type mmioGetInfo_orig; +mmioSetInfo_type mmioSetInfo_orig; +mmioSetBuffer_type mmioSetBuffer_orig; +mmioFlush_type mmioFlush_orig; +mmioAdvance_type mmioAdvance_orig; +mmioSendMessage_type mmioSendMessage_orig; +mmioDescend_type mmioDescend_orig; +mmioAscend_type mmioAscend_orig; +mmioCreateChunk_type mmioCreateChunk_orig; +mciSendCommandA_type mciSendCommandA_orig; +mciSendCommandW_type mciSendCommandW_orig; +mciSendStringA_type mciSendStringA_orig; +mciSendStringW_type mciSendStringW_orig; +mciGetDeviceIDA_type mciGetDeviceIDA_orig; +mciGetDeviceIDW_type mciGetDeviceIDW_orig; +mciGetDeviceIDFromElementIDA_type mciGetDeviceIDFromElementIDA_orig; +mciGetDeviceIDFromElementIDW_type mciGetDeviceIDFromElementIDW_orig; +mciGetDriverData_type mciGetDriverData_orig; +mciGetErrorStringA_type mciGetErrorStringA_orig; +mciGetErrorStringW_type mciGetErrorStringW_orig; +mciSetDriverData_type mciSetDriverData_orig; +mciDriverNotify_type mciDriverNotify_orig; +mciDriverYield_type mciDriverYield_orig; +mciSetYieldProc_type mciSetYieldProc_orig; +mciFreeCommandResource_type mciFreeCommandResource_orig; +mciGetCreatorTask_type mciGetCreatorTask_orig; +mciGetYieldProc_type mciGetYieldProc_orig; +mciLoadCommandResource_type mciLoadCommandResource_orig; +mciExecute_type mciExecute_orig; + +// grab pointers to function calls in the real DLL +void init_function_pointers(HMODULE winmm_handle) +{ + CloseDriver_orig = (CloseDriver_type)::GetProcAddress(winmm_handle, "CloseDriver"); + OpenDriver_orig = (OpenDriver_type)::GetProcAddress(winmm_handle, "OpenDriver"); + SendDriverMessage_orig = (SendDriverMessage_type)::GetProcAddress(winmm_handle, "SendDriverMessage"); + DrvGetModuleHandle_orig = (DrvGetModuleHandle_type)::GetProcAddress(winmm_handle, "DrvGetModuleHandle"); + GetDriverModuleHandle_orig = (GetDriverModuleHandle_type)::GetProcAddress(winmm_handle, "GetDriverModuleHandle"); + DefDriverProc_orig = (DefDriverProc_type)::GetProcAddress(winmm_handle, "DefDriverProc"); + DriverCallback_orig = (DriverCallback_type)::GetProcAddress(winmm_handle, "DriverCallback"); + mmsystemGetVersion_orig = (mmsystemGetVersion_type)::GetProcAddress(winmm_handle, "mmsystemGetVersion"); + sndPlaySoundA_orig = (sndPlaySoundA_type)::GetProcAddress(winmm_handle, "sndPlaySoundA"); + sndPlaySoundW_orig = (sndPlaySoundW_type)::GetProcAddress(winmm_handle, "sndPlaySoundW"); + PlaySoundA_orig = (PlaySoundA_type)::GetProcAddress(winmm_handle, "PlaySoundA"); + PlaySoundW_orig = (PlaySoundW_type)::GetProcAddress(winmm_handle, "PlaySoundW"); + waveOutGetNumDevs_orig = (waveOutGetNumDevs_type)::GetProcAddress(winmm_handle, "waveOutGetNumDevs"); + waveOutGetDevCapsA_orig = (waveOutGetDevCapsA_type)::GetProcAddress(winmm_handle, "waveOutGetDevCapsA"); + waveOutGetDevCapsW_orig = (waveOutGetDevCapsW_type)::GetProcAddress(winmm_handle, "waveOutGetDevCapsW"); + waveOutGetVolume_orig = (waveOutGetVolume_type)::GetProcAddress(winmm_handle, "waveOutGetVolume"); + waveOutSetVolume_orig = (waveOutSetVolume_type)::GetProcAddress(winmm_handle, "waveOutSetVolume"); + waveOutGetErrorTextA_orig = (waveOutGetErrorTextA_type)::GetProcAddress(winmm_handle, "waveOutGetErrorTextA"); + waveOutGetErrorTextW_orig = (waveOutGetErrorTextW_type)::GetProcAddress(winmm_handle, "waveOutGetErrorTextW"); + waveOutOpen_orig = (waveOutOpen_type)::GetProcAddress(winmm_handle, "waveOutOpen"); + waveOutClose_orig = (waveOutClose_type)::GetProcAddress(winmm_handle, "waveOutClose"); + waveOutPrepareHeader_orig = (waveOutPrepareHeader_type)::GetProcAddress(winmm_handle, "waveOutPrepareHeader"); + waveOutUnprepareHeader_orig = (waveOutUnprepareHeader_type)::GetProcAddress(winmm_handle, "waveOutUnprepareHeader"); + waveOutWrite_orig = (waveOutWrite_type)::GetProcAddress(winmm_handle, "waveOutWrite"); + waveOutPause_orig = (waveOutPause_type)::GetProcAddress(winmm_handle, "waveOutPause"); + waveOutRestart_orig = (waveOutRestart_type)::GetProcAddress(winmm_handle, "waveOutRestart"); + waveOutReset_orig = (waveOutReset_type)::GetProcAddress(winmm_handle, "waveOutReset"); + waveOutBreakLoop_orig = (waveOutBreakLoop_type)::GetProcAddress(winmm_handle, "waveOutBreakLoop"); + waveOutGetPosition_orig = (waveOutGetPosition_type)::GetProcAddress(winmm_handle, "waveOutGetPosition"); + waveOutGetPitch_orig = (waveOutGetPitch_type)::GetProcAddress(winmm_handle, "waveOutGetPitch"); + waveOutSetPitch_orig = (waveOutSetPitch_type)::GetProcAddress(winmm_handle, "waveOutSetPitch"); + waveOutGetPlaybackRate_orig = (waveOutGetPlaybackRate_type)::GetProcAddress(winmm_handle, "waveOutGetPlaybackRate"); + waveOutSetPlaybackRate_orig = (waveOutSetPlaybackRate_type)::GetProcAddress(winmm_handle, "waveOutSetPlaybackRate"); + waveOutGetID_orig = (waveOutGetID_type)::GetProcAddress(winmm_handle, "waveOutGetID"); + waveOutMessage_orig = (waveOutMessage_type)::GetProcAddress(winmm_handle, "waveOutMessage"); + waveInGetNumDevs_orig = (waveInGetNumDevs_type)::GetProcAddress(winmm_handle, "waveInGetNumDevs"); + waveInGetDevCapsA_orig = (waveInGetDevCapsA_type)::GetProcAddress(winmm_handle, "waveInGetDevCapsA"); + waveInGetDevCapsW_orig = (waveInGetDevCapsW_type)::GetProcAddress(winmm_handle, "waveInGetDevCapsW"); + waveInGetErrorTextA_orig = (waveInGetErrorTextA_type)::GetProcAddress(winmm_handle, "waveInGetErrorTextA"); + waveInGetErrorTextW_orig = (waveInGetErrorTextW_type)::GetProcAddress(winmm_handle, "waveInGetErrorTextW"); + waveInOpen_orig = (waveInOpen_type)::GetProcAddress(winmm_handle, "waveInOpen"); + waveInClose_orig = (waveInClose_type)::GetProcAddress(winmm_handle, "waveInClose"); + waveInPrepareHeader_orig = (waveInPrepareHeader_type)::GetProcAddress(winmm_handle, "waveInPrepareHeader"); + waveInUnprepareHeader_orig = (waveInUnprepareHeader_type)::GetProcAddress(winmm_handle, "waveInUnprepareHeader"); + waveInAddBuffer_orig = (waveInAddBuffer_type)::GetProcAddress(winmm_handle, "waveInAddBuffer"); + waveInStart_orig = (waveInStart_type)::GetProcAddress(winmm_handle, "waveInStart"); + waveInStop_orig = (waveInStop_type)::GetProcAddress(winmm_handle, "waveInStop"); + waveInReset_orig = (waveInReset_type)::GetProcAddress(winmm_handle, "waveInReset"); + waveInGetPosition_orig = (waveInGetPosition_type)::GetProcAddress(winmm_handle, "waveInGetPosition"); + waveInGetID_orig = (waveInGetID_type)::GetProcAddress(winmm_handle, "waveInGetID"); + waveInMessage_orig = (waveInMessage_type)::GetProcAddress(winmm_handle, "waveInMessage"); + midiOutGetNumDevs_orig = (midiOutGetNumDevs_type)::GetProcAddress(winmm_handle, "midiOutGetNumDevs"); + midiStreamOpen_orig = (midiStreamOpen_type)::GetProcAddress(winmm_handle, "midiStreamOpen"); + midiStreamClose_orig = (midiStreamClose_type)::GetProcAddress(winmm_handle, "midiStreamClose"); + midiStreamProperty_orig = (midiStreamProperty_type)::GetProcAddress(winmm_handle, "midiStreamProperty"); + midiStreamPosition_orig = (midiStreamPosition_type)::GetProcAddress(winmm_handle, "midiStreamPosition"); + midiStreamOut_orig = (midiStreamOut_type)::GetProcAddress(winmm_handle, "midiStreamOut"); + midiStreamPause_orig = (midiStreamPause_type)::GetProcAddress(winmm_handle, "midiStreamPause"); + midiStreamRestart_orig = (midiStreamRestart_type)::GetProcAddress(winmm_handle, "midiStreamRestart"); + midiStreamStop_orig = (midiStreamStop_type)::GetProcAddress(winmm_handle, "midiStreamStop"); + midiConnect_orig = (midiConnect_type)::GetProcAddress(winmm_handle, "midiConnect"); + midiDisconnect_orig = (midiDisconnect_type)::GetProcAddress(winmm_handle, "midiDisconnect"); + midiOutGetDevCapsA_orig = (midiOutGetDevCapsA_type)::GetProcAddress(winmm_handle, "midiOutGetDevCapsA"); + midiOutGetDevCapsW_orig = (midiOutGetDevCapsW_type)::GetProcAddress(winmm_handle, "midiOutGetDevCapsW"); + midiOutGetVolume_orig = (midiOutGetVolume_type)::GetProcAddress(winmm_handle, "midiOutGetVolume"); + midiOutSetVolume_orig = (midiOutSetVolume_type)::GetProcAddress(winmm_handle, "midiOutSetVolume"); + midiOutGetErrorTextA_orig = (midiOutGetErrorTextA_type)::GetProcAddress(winmm_handle, "midiOutGetErrorTextA"); + midiOutGetErrorTextW_orig = (midiOutGetErrorTextW_type)::GetProcAddress(winmm_handle, "midiOutGetErrorTextW"); + midiOutOpen_orig = (midiOutOpen_type)::GetProcAddress(winmm_handle, "midiOutOpen"); + midiOutClose_orig = (midiOutClose_type)::GetProcAddress(winmm_handle, "midiOutClose"); + midiOutPrepareHeader_orig = (midiOutPrepareHeader_type)::GetProcAddress(winmm_handle, "midiOutPrepareHeader"); + midiOutUnprepareHeader_orig = (midiOutUnprepareHeader_type)::GetProcAddress(winmm_handle, "midiOutUnprepareHeader"); + midiOutShortMsg_orig = (midiOutShortMsg_type)::GetProcAddress(winmm_handle, "midiOutShortMsg"); + midiOutLongMsg_orig = (midiOutLongMsg_type)::GetProcAddress(winmm_handle, "midiOutLongMsg"); + midiOutReset_orig = (midiOutReset_type)::GetProcAddress(winmm_handle, "midiOutReset"); + midiOutCachePatches_orig = (midiOutCachePatches_type)::GetProcAddress(winmm_handle, "midiOutCachePatches"); + midiOutCacheDrumPatches_orig = (midiOutCacheDrumPatches_type)::GetProcAddress(winmm_handle, "midiOutCacheDrumPatches"); + midiOutGetID_orig = (midiOutGetID_type)::GetProcAddress(winmm_handle, "midiOutGetID"); + midiOutMessage_orig = (midiOutMessage_type)::GetProcAddress(winmm_handle, "midiOutMessage"); + midiInGetNumDevs_orig = (midiInGetNumDevs_type)::GetProcAddress(winmm_handle, "midiInGetNumDevs"); + midiInGetDevCapsA_orig = (midiInGetDevCapsA_type)::GetProcAddress(winmm_handle, "midiInGetDevCapsA"); + midiInGetDevCapsW_orig = (midiInGetDevCapsW_type)::GetProcAddress(winmm_handle, "midiInGetDevCapsW"); + midiInGetErrorTextA_orig = (midiInGetErrorTextA_type)::GetProcAddress(winmm_handle, "midiInGetErrorTextA"); + midiInGetErrorTextW_orig = (midiInGetErrorTextW_type)::GetProcAddress(winmm_handle, "midiInGetErrorTextW"); + midiInOpen_orig = (midiInOpen_type)::GetProcAddress(winmm_handle, "midiInOpen"); + midiInClose_orig = (midiInClose_type)::GetProcAddress(winmm_handle, "midiInClose"); + midiInPrepareHeader_orig = (midiInPrepareHeader_type)::GetProcAddress(winmm_handle, "midiInPrepareHeader"); + midiInUnprepareHeader_orig = (midiInUnprepareHeader_type)::GetProcAddress(winmm_handle, "midiInUnprepareHeader"); + midiInAddBuffer_orig = (midiInAddBuffer_type)::GetProcAddress(winmm_handle, "midiInAddBuffer"); + midiInStart_orig = (midiInStart_type)::GetProcAddress(winmm_handle, "midiInStart"); + midiInStop_orig = (midiInStop_type)::GetProcAddress(winmm_handle, "midiInStop"); + midiInReset_orig = (midiInReset_type)::GetProcAddress(winmm_handle, "midiInReset"); + midiInGetID_orig = (midiInGetID_type)::GetProcAddress(winmm_handle, "midiInGetID"); + midiInMessage_orig = (midiInMessage_type)::GetProcAddress(winmm_handle, "midiInMessage"); + auxGetNumDevs_orig = (auxGetNumDevs_type)::GetProcAddress(winmm_handle, "auxGetNumDevs"); + auxGetDevCapsA_orig = (auxGetDevCapsA_type)::GetProcAddress(winmm_handle, "auxGetDevCapsA"); + auxGetDevCapsW_orig = (auxGetDevCapsW_type)::GetProcAddress(winmm_handle, "auxGetDevCapsW"); + auxSetVolume_orig = (auxSetVolume_type)::GetProcAddress(winmm_handle, "auxSetVolume"); + auxGetVolume_orig = (auxGetVolume_type)::GetProcAddress(winmm_handle, "auxGetVolume"); + auxOutMessage_orig = (auxOutMessage_type)::GetProcAddress(winmm_handle, "auxOutMessage"); + mixerGetNumDevs_orig = (mixerGetNumDevs_type)::GetProcAddress(winmm_handle, "mixerGetNumDevs"); + mixerGetDevCapsA_orig = (mixerGetDevCapsA_type)::GetProcAddress(winmm_handle, "mixerGetDevCapsA"); + mixerGetDevCapsW_orig = (mixerGetDevCapsW_type)::GetProcAddress(winmm_handle, "mixerGetDevCapsW"); + mixerOpen_orig = (mixerOpen_type)::GetProcAddress(winmm_handle, "mixerOpen"); + mixerClose_orig = (mixerClose_type)::GetProcAddress(winmm_handle, "mixerClose"); + mixerMessage_orig = (mixerMessage_type)::GetProcAddress(winmm_handle, "mixerMessage"); + mixerGetLineInfoA_orig = (mixerGetLineInfoA_type)::GetProcAddress(winmm_handle, "mixerGetLineInfoA"); + mixerGetLineInfoW_orig = (mixerGetLineInfoW_type)::GetProcAddress(winmm_handle, "mixerGetLineInfoW"); + mixerGetID_orig = (mixerGetID_type)::GetProcAddress(winmm_handle, "mixerGetID"); + mixerGetLineControlsA_orig = (mixerGetLineControlsA_type)::GetProcAddress(winmm_handle, "mixerGetLineControlsA"); + mixerGetLineControlsW_orig = (mixerGetLineControlsW_type)::GetProcAddress(winmm_handle, "mixerGetLineControlsW"); + mixerGetControlDetailsA_orig = (mixerGetControlDetailsA_type)::GetProcAddress(winmm_handle, "mixerGetControlDetailsA"); + mixerGetControlDetailsW_orig = (mixerGetControlDetailsW_type)::GetProcAddress(winmm_handle, "mixerGetControlDetailsW"); + mixerSetControlDetails_orig = (mixerSetControlDetails_type)::GetProcAddress(winmm_handle, "mixerSetControlDetails"); + mmGetCurrentTask_orig = (mmGetCurrentTask_type)::GetProcAddress(winmm_handle, "mmGetCurrentTask"); + mmTaskBlock_orig = (mmTaskBlock_type)::GetProcAddress(winmm_handle, "mmTaskBlock"); + mmTaskCreate_orig = (mmTaskCreate_type)::GetProcAddress(winmm_handle, "mmTaskCreate"); + mmTaskSignal_orig = (mmTaskSignal_type)::GetProcAddress(winmm_handle, "mmTaskSignal"); + mmTaskYield_orig = (mmTaskYield_type)::GetProcAddress(winmm_handle, "mmTaskYield"); + timeGetSystemTime_orig = (timeGetSystemTime_type)::GetProcAddress(winmm_handle, "timeGetSystemTime"); + timeGetTime_orig = (timeGetTime_type)::GetProcAddress(winmm_handle, "timeGetTime"); + timeSetEvent_orig = (timeSetEvent_type)::GetProcAddress(winmm_handle, "timeSetEvent"); + timeKillEvent_orig = (timeKillEvent_type)::GetProcAddress(winmm_handle, "timeKillEvent"); + timeGetDevCaps_orig = (timeGetDevCaps_type)::GetProcAddress(winmm_handle, "timeGetDevCaps"); + timeBeginPeriod_orig = (timeBeginPeriod_type)::GetProcAddress(winmm_handle, "timeBeginPeriod"); + timeEndPeriod_orig = (timeEndPeriod_type)::GetProcAddress(winmm_handle, "timeEndPeriod"); + joyGetNumDevs_orig = (joyGetNumDevs_type)::GetProcAddress(winmm_handle, "joyGetNumDevs"); + joyConfigChanged_orig = (joyConfigChanged_type)::GetProcAddress(winmm_handle, "joyConfigChanged"); + joyGetDevCapsA_orig = (joyGetDevCapsA_type)::GetProcAddress(winmm_handle, "joyGetDevCapsA"); + joyGetDevCapsW_orig = (joyGetDevCapsW_type)::GetProcAddress(winmm_handle, "joyGetDevCapsW"); + joyGetPos_orig = (joyGetPos_type)::GetProcAddress(winmm_handle, "joyGetPos"); + joyGetPosEx_orig = (joyGetPosEx_type)::GetProcAddress(winmm_handle, "joyGetPosEx"); + joyGetThreshold_orig = (joyGetThreshold_type)::GetProcAddress(winmm_handle, "joyGetThreshold"); + joyReleaseCapture_orig = (joyReleaseCapture_type)::GetProcAddress(winmm_handle, "joyReleaseCapture"); + joySetCapture_orig = (joySetCapture_type)::GetProcAddress(winmm_handle, "joySetCapture"); + joySetThreshold_orig = (joySetThreshold_type)::GetProcAddress(winmm_handle, "joySetThreshold"); + mciDriverNotify_orig = (mciDriverNotify_type)::GetProcAddress(winmm_handle, "mciDriverNotify"); + mciDriverYield_orig = (mciDriverYield_type)::GetProcAddress(winmm_handle, "mciDriverYield"); + mmioStringToFOURCCA_orig = (mmioStringToFOURCCA_type)::GetProcAddress(winmm_handle, "mmioStringToFOURCCA"); + mmioStringToFOURCCW_orig = (mmioStringToFOURCCW_type)::GetProcAddress(winmm_handle, "mmioStringToFOURCCW"); + mmioInstallIOProcA_orig = (mmioInstallIOProcA_type)::GetProcAddress(winmm_handle, "mmioInstallIOProcA"); + mmioInstallIOProcW_orig = (mmioInstallIOProcW_type)::GetProcAddress(winmm_handle, "mmioInstallIOProcW"); + mmioOpenA_orig = (mmioOpenA_type)::GetProcAddress(winmm_handle, "mmioOpenA"); + mmioOpenW_orig = (mmioOpenW_type)::GetProcAddress(winmm_handle, "mmioOpenW"); + mmioRenameA_orig = (mmioRenameA_type)::GetProcAddress(winmm_handle, "mmioRenameA"); + mmioRenameW_orig = (mmioRenameW_type)::GetProcAddress(winmm_handle, "mmioRenameW"); + mmioClose_orig = (mmioClose_type)::GetProcAddress(winmm_handle, "mmioClose"); + mmioRead_orig = (mmioRead_type)::GetProcAddress(winmm_handle, "mmioRead"); + mmioWrite_orig = (mmioWrite_type)::GetProcAddress(winmm_handle, "mmioWrite"); + mmioSeek_orig = (mmioSeek_type)::GetProcAddress(winmm_handle, "mmioSeek"); + mmioGetInfo_orig = (mmioGetInfo_type)::GetProcAddress(winmm_handle, "mmioGetInfo"); + mmioSetInfo_orig = (mmioSetInfo_type)::GetProcAddress(winmm_handle, "mmioSetInfo"); + mmioSetBuffer_orig = (mmioSetBuffer_type)::GetProcAddress(winmm_handle, "mmioSetBuffer"); + mmioFlush_orig = (mmioFlush_type)::GetProcAddress(winmm_handle, "mmioFlush"); + mmioAdvance_orig = (mmioAdvance_type)::GetProcAddress(winmm_handle, "mmioAdvance"); + mmioSendMessage_orig = (mmioSendMessage_type)::GetProcAddress(winmm_handle, "mmioSendMessage"); + mmioDescend_orig = (mmioDescend_type)::GetProcAddress(winmm_handle, "mmioDescend"); + mmioAscend_orig = (mmioAscend_type)::GetProcAddress(winmm_handle, "mmioAscend"); + mmioCreateChunk_orig = (mmioCreateChunk_type)::GetProcAddress(winmm_handle, "mmioCreateChunk"); + mciSendCommandA_orig = (mciSendCommandA_type)::GetProcAddress(winmm_handle, "mciSendCommandA"); + mciSendCommandW_orig = (mciSendCommandW_type)::GetProcAddress(winmm_handle, "mciSendCommandW"); + mciSendStringA_orig = (mciSendStringA_type)::GetProcAddress(winmm_handle, "mciSendStringA"); + mciSendStringW_orig = (mciSendStringW_type)::GetProcAddress(winmm_handle, "mciSendStringW"); + mciGetDeviceIDA_orig = (mciGetDeviceIDA_type)::GetProcAddress(winmm_handle, "mciGetDeviceIDA"); + mciGetDeviceIDW_orig = (mciGetDeviceIDW_type)::GetProcAddress(winmm_handle, "mciGetDeviceIDW"); + mciGetDeviceIDFromElementIDA_orig = (mciGetDeviceIDFromElementIDA_type)::GetProcAddress(winmm_handle, "mciGetDeviceIDFromElementIDA"); + mciGetDeviceIDFromElementIDW_orig = (mciGetDeviceIDFromElementIDW_type)::GetProcAddress(winmm_handle, "mciGetDeviceIDFromElementIDW"); + mciGetDriverData_orig = (mciGetDriverData_type)::GetProcAddress(winmm_handle, "mciGetDriverData"); + mciGetErrorStringA_orig = (mciGetErrorStringA_type)::GetProcAddress(winmm_handle, "mciGetErrorStringA"); + mciGetErrorStringW_orig = (mciGetErrorStringW_type)::GetProcAddress(winmm_handle, "mciGetErrorStringW"); + mciSetDriverData_orig = (mciSetDriverData_type)::GetProcAddress(winmm_handle, "mciSetDriverData"); + mciSetYieldProc_orig = (mciSetYieldProc_type)::GetProcAddress(winmm_handle, "mciSetYieldProc"); + mciFreeCommandResource_orig = (mciFreeCommandResource_type)::GetProcAddress(winmm_handle, "mciFreeCommandResource"); + mciGetCreatorTask_orig = (mciGetCreatorTask_type)::GetProcAddress(winmm_handle, "mciGetCreatorTask"); + mciGetYieldProc_orig = (mciGetYieldProc_type)::GetProcAddress(winmm_handle, "mciGetYieldProc"); + mciLoadCommandResource_orig = (mciLoadCommandResource_type)::GetProcAddress(winmm_handle, "mciLoadCommandResource"); + mciExecute_orig = (mciExecute_type)::GetProcAddress(winmm_handle, "mciExecute"); +} + +extern "C" { + LRESULT WINAPI CloseDriver( HDRVR hDriver, LPARAM lParam1, LPARAM lParam2) + { + //OutputDebugString(L"CloseDriver\n"); + return CloseDriver_orig( hDriver, lParam1, lParam2); + } + + HDRVR WINAPI OpenDriver( LPCWSTR szDriverName, LPCWSTR szSectionName, LPARAM lParam2) + { + //OutputDebugString(L"OpenDriver\n"); + return OpenDriver_orig( szDriverName, szSectionName, lParam2); + } + + LRESULT WINAPI SendDriverMessage( HDRVR hDriver, UINT message, LPARAM lParam1, LPARAM lParam2) + { + //OutputDebugString(L"SendDriverMessage\n"); + return SendDriverMessage_orig( hDriver, message, lParam1, lParam2); + } + + HMODULE WINAPI DrvGetModuleHandle( HDRVR hDriver) + { + //OutputDebugString(L"DrvGetModuleHandle\n"); + return DrvGetModuleHandle_orig( hDriver); + } + + HMODULE WINAPI GetDriverModuleHandle( HDRVR hDriver) + { + //OutputDebugString(L"GetDriverModuleHandle\n"); + return GetDriverModuleHandle_orig( hDriver); + } + + LRESULT WINAPI DefDriverProc( DWORD_PTR dwDriverIdentifier, HDRVR hdrvr, UINT uMsg, LPARAM lParam1, LPARAM lParam2) + { + //OutputDebugString(L"DefDriverProc\n"); + return DefDriverProc_orig( dwDriverIdentifier, hdrvr, uMsg, lParam1, lParam2); + } + + BOOL WINAPI DriverCallback( DWORD dwCallBack, DWORD dwFlags, HDRVR hdrvr, DWORD msg, DWORD dwUser, DWORD dwParam1, DWORD dwParam2) + { + //OutputDebugString(L"DriverCallback\n"); + return DriverCallback_orig(dwCallBack, dwFlags, hdrvr, msg, dwUser, dwParam1, dwParam2); + } + + UINT WINAPI mmsystemGetVersion(void) + { + //OutputDebugString(L"mmsystemGetVersion\n"); + return mmsystemGetVersion_orig(); + } + + BOOL WINAPI sndPlaySoundA( LPCSTR pszSound, UINT fuSound) + { + //OutputDebugString(L"sndPlaySoundA\n"); + return sndPlaySoundA_orig( pszSound, fuSound); + } + + BOOL WINAPI sndPlaySoundW( LPCWSTR pszSound, UINT fuSound) + { + //OutputDebugString(L"sndPlaySoundW\n"); + return sndPlaySoundW_orig( pszSound, fuSound); + } + + BOOL WINAPI PlaySoundA( LPCSTR pszSound, HMODULE hmod, DWORD fdwSound) + { + //OutputDebugString(L"PlaySoundA\n"); + return PlaySoundA_orig( pszSound, hmod, fdwSound); + } + + BOOL WINAPI PlaySoundW( LPCWSTR pszSound, HMODULE hmod, DWORD fdwSound) + { + //OutputDebugString(L"PlaySoundW\n"); + return PlaySoundW_orig( pszSound, hmod, fdwSound); + } + + UINT WINAPI waveOutGetNumDevs(void) + { + //OutputDebugString(L"waveOutGetNumDevs\n"); + return waveOutGetNumDevs_orig(); + } + + MMRESULT WINAPI waveOutGetDevCapsA( UINT_PTR uDeviceID, LPWAVEOUTCAPSA pwoc, UINT cbwoc) + { + //OutputDebugString(L"waveOutGetDevCapsA\n"); + return waveOutGetDevCapsA_orig( uDeviceID, pwoc, cbwoc); + } + + MMRESULT WINAPI waveOutGetDevCapsW( UINT_PTR uDeviceID, LPWAVEOUTCAPSW pwoc, UINT cbwoc) + { + //OutputDebugString(L"waveOutGetDevCapsW\n"); + return waveOutGetDevCapsW_orig( uDeviceID, pwoc, cbwoc); + } + + + MMRESULT WINAPI waveOutGetVolume( HWAVEOUT hwo, LPDWORD pdwVolume) + { + //OutputDebugString(L"waveOutGetVolume\n"); + return waveOutGetVolume_orig( hwo, pdwVolume); + } + + MMRESULT WINAPI waveOutSetVolume( HWAVEOUT hwo, DWORD dwVolume) + { + //OutputDebugString(L"waveOutSetVolume\n"); + return waveOutSetVolume_orig( hwo, dwVolume); + } + + MMRESULT WINAPI waveOutGetErrorTextA( MMRESULT mmrError, LPSTR pszText, UINT cchText) + { + //OutputDebugString(L"waveOutGetErrorTextA\n"); + return waveOutGetErrorTextA_orig( mmrError, pszText, cchText); + } + + MMRESULT WINAPI waveOutGetErrorTextW( MMRESULT mmrError, LPWSTR pszText, UINT cchText) + { + //OutputDebugString(L"waveOutGetErrorTextW\n"); + return waveOutGetErrorTextW_orig( mmrError, pszText, cchText); + } + + //MMRESULT WINAPI waveOutOpen( LPHWAVEOUT phwo, UINT uDeviceID, LPCWAVEFORMATEX pwfx, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen) + //{ + // //OutputDebugString(L"waveOutGetErrorTextW\n"); + // return waveOutOpen_orig( phwo, uDeviceID, pwfx, dwCallback, dwInstance, fdwOpen); + //} + + //MMRESULT WINAPI waveOutClose( HWAVEOUT hwo) + //{ + // //OutputDebugString(L"waveOutGetErrorTextW\n"); + // return waveOutClose_orig( hwo ); + //} + + MMRESULT WINAPI waveOutPrepareHeader( HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh) + { + //OutputDebugString(L"waveOutPrepareHeader\n"); + return waveOutPrepareHeader_orig( hwo, pwh, cbwh); + } + + MMRESULT WINAPI waveOutUnprepareHeader( HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh) + { + //OutputDebugString(L"waveOutUnprepareHeader\n"); + return waveOutUnprepareHeader_orig( hwo, pwh, cbwh); + } + + + //MMRESULT WINAPI waveOutWrite( HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh) + //{ + // //OutputDebugString(L"waveOutUnprepareHeader\n"); + // return waveOutWrite_orig( hwo, pwh, cbwh); + //} + + MMRESULT WINAPI waveOutPause( HWAVEOUT hwo) + { + //OutputDebugString(L"waveOutPause\n"); + return waveOutPause_orig( hwo); + } + + MMRESULT WINAPI waveOutRestart( HWAVEOUT hwo) + { + //OutputDebugString(L"waveOutRestart\n"); + return waveOutRestart_orig( hwo); + } + + MMRESULT WINAPI waveOutReset( HWAVEOUT hwo) + { + //OutputDebugString(L"waveOutReset\n"); + return waveOutReset_orig( hwo); + } + + MMRESULT WINAPI waveOutBreakLoop( HWAVEOUT hwo) + { + //OutputDebugString(L"waveOutBreakLoop\n"); + return waveOutBreakLoop_orig( hwo); + } + + MMRESULT WINAPI waveOutGetPosition( HWAVEOUT hwo, LPMMTIME pmmt, UINT cbmmt) + { + //OutputDebugString(L"waveOutGetPosition\n"); + return waveOutGetPosition_orig( hwo, pmmt, cbmmt); + } + + MMRESULT WINAPI waveOutGetPitch( HWAVEOUT hwo, LPDWORD pdwPitch) + { + //OutputDebugString(L"waveOutGetPitch\n"); + return waveOutGetPitch_orig( hwo, pdwPitch); + } + + MMRESULT WINAPI waveOutSetPitch( HWAVEOUT hwo, DWORD dwPitch) + { + //OutputDebugString(L"waveOutSetPitch\n"); + return waveOutSetPitch_orig( hwo, dwPitch); + } + + MMRESULT WINAPI waveOutGetPlaybackRate( HWAVEOUT hwo, LPDWORD pdwRate) + { + //OutputDebugString(L"waveOutGetPlaybackRate\n"); + return waveOutGetPlaybackRate_orig( hwo, pdwRate); + } + + MMRESULT WINAPI waveOutSetPlaybackRate( HWAVEOUT hwo, DWORD dwRate) + { + //OutputDebugString(L"waveOutSetPlaybackRate\n"); + return waveOutSetPlaybackRate_orig( hwo, dwRate); + } + + MMRESULT WINAPI waveOutGetID( HWAVEOUT hwo, LPUINT puDeviceID) + { + //OutputDebugString(L"waveOutGetID\n"); + return waveOutGetID_orig( hwo, puDeviceID); + } + + MMRESULT WINAPI waveOutMessage( HWAVEOUT hwo, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2) + { + //OutputDebugString(L"waveOutMessage\n"); + return waveOutMessage_orig( hwo, uMsg, dw1, dw2); + } + + UINT WINAPI waveInGetNumDevs(void) + { + //OutputDebugString(L"waveInGetNumDevs\n"); + return waveInGetNumDevs_orig(); + } + + MMRESULT WINAPI waveInGetDevCapsA( UINT_PTR uDeviceID, LPWAVEINCAPSA pwic, UINT cbwic) + { + //OutputDebugString(L"waveInGetDevCapsA\n"); + return waveInGetDevCapsA_orig( uDeviceID, pwic, cbwic); + } + + MMRESULT WINAPI waveInGetDevCapsW( UINT_PTR uDeviceID, LPWAVEINCAPSW pwic, UINT cbwic) + { + //OutputDebugString(L"waveInGetDevCapsW\n"); + return waveInGetDevCapsW_orig( uDeviceID, pwic, cbwic); + } + + MMRESULT WINAPI waveInGetErrorTextA(MMRESULT mmrError, LPSTR pszText, UINT cchText) + { + //OutputDebugString(L"waveInGetErrorTextA\n"); + return waveInGetErrorTextA_orig(mmrError, pszText, cchText); + } + + MMRESULT WINAPI waveInGetErrorTextW(MMRESULT mmrError, LPWSTR pszText, UINT cchText) + { + //OutputDebugString(L"waveInGetErrorTextW\n"); + return waveInGetErrorTextW_orig(mmrError, pszText, cchText); + } + + MMRESULT WINAPI waveInOpen( LPHWAVEIN phwi, UINT uDeviceID, LPCWAVEFORMATEX pwfx, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen) + { + //OutputDebugString(L"waveInOpen\n"); + return waveInOpen_orig(phwi, uDeviceID, pwfx, dwCallback, dwInstance, fdwOpen); + } + + MMRESULT WINAPI waveInClose( HWAVEIN hwi) + { + //OutputDebugString(L"waveInClose\n"); + return waveInClose_orig( hwi); + } + + MMRESULT WINAPI waveInPrepareHeader( HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh) + { + //OutputDebugString(L"waveInPrepareHeader\n"); + return waveInPrepareHeader_orig( hwi, pwh, cbwh); + } + + MMRESULT WINAPI waveInUnprepareHeader( HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh) + { + //OutputDebugString(L"waveInUnprepareHeader\n"); + return waveInUnprepareHeader_orig( hwi, pwh, cbwh); + } + + MMRESULT WINAPI waveInAddBuffer( HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh) + { + //OutputDebugString(L"waveInAddBuffer\n"); + return waveInAddBuffer_orig( hwi, pwh, cbwh); + } + + MMRESULT WINAPI waveInStart( HWAVEIN hwi) + { + //OutputDebugString(L"waveInStart\n"); + return waveInStart_orig( hwi); + } + + MMRESULT WINAPI waveInStop( HWAVEIN hwi) + { + //OutputDebugString(L"waveInStop\n"); + return waveInStop_orig(hwi); + } + + MMRESULT WINAPI waveInReset( HWAVEIN hwi) + { + //OutputDebugString(L"waveInReset\n"); + return waveInReset_orig(hwi); + } + + MMRESULT WINAPI waveInGetPosition( HWAVEIN hwi, LPMMTIME pmmt, UINT cbmmt) + { + //OutputDebugString(L"waveInGetPosition\n"); + return waveInGetPosition_orig( hwi, pmmt, cbmmt); + } + + MMRESULT WINAPI waveInGetID( HWAVEIN hwi, LPUINT puDeviceID) + { + //OutputDebugString(L"waveInGetID\n"); + return waveInGetID_orig( hwi, puDeviceID); + } + + MMRESULT WINAPI waveInMessage( HWAVEIN hwi, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2) + { + //OutputDebugString(L"waveInMessage\n"); + return waveInMessage_orig( hwi, uMsg, dw1, dw2); + } + + UINT WINAPI midiOutGetNumDevs(void) + { + //OutputDebugString(L"midiOutGetNumDevs\n"); + return midiOutGetNumDevs_orig(); + } + + MMRESULT WINAPI midiStreamOpen( LPHMIDISTRM phms, LPUINT puDeviceID, DWORD cMidi, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen) + { + //OutputDebugString(L"midiStreamOpen\n"); + return midiStreamOpen_orig( phms, puDeviceID, cMidi, dwCallback, dwInstance, fdwOpen); + } + + MMRESULT WINAPI midiStreamClose( HMIDISTRM hms) + { + //OutputDebugString(L"midiStreamClose\n"); + return midiStreamClose_orig( hms); + } + + MMRESULT WINAPI midiStreamProperty( HMIDISTRM hms, LPBYTE lppropdata, DWORD dwProperty) + { + //OutputDebugString(L"midiStreamProperty\n"); + return midiStreamProperty_orig( hms, lppropdata, dwProperty); + } + + MMRESULT WINAPI midiStreamPosition( HMIDISTRM hms, LPMMTIME lpmmt, UINT cbmmt) + { + //OutputDebugString(L"midiStreamPosition\n"); + return midiStreamPosition_orig( hms, lpmmt, cbmmt); + } + + MMRESULT WINAPI midiStreamOut( HMIDISTRM hms, LPMIDIHDR pmh, UINT cbmh) + { + //OutputDebugString(L"midiStreamOut\n"); + return midiStreamOut_orig( hms, pmh, cbmh); + } + + MMRESULT WINAPI midiStreamPause( HMIDISTRM hms) + { + //OutputDebugString(L"midiStreamPause\n"); + return midiStreamPause_orig( hms); + } + + MMRESULT WINAPI midiStreamRestart( HMIDISTRM hms) + { + //OutputDebugString(L"midiStreamRestart\n"); + return midiStreamRestart_orig( hms); + } + + MMRESULT WINAPI midiStreamStop( HMIDISTRM hms) + { + //OutputDebugString(L"midiStreamStop\n"); + return midiStreamStop_orig( hms); + } + + MMRESULT WINAPI midiConnect( HMIDI hmi, HMIDIOUT hmo, LPVOID pReserved) + { + //OutputDebugString(L"midiConnect\n"); + return midiConnect_orig( hmi, hmo, pReserved); + } + + MMRESULT WINAPI midiDisconnect( HMIDI hmi, HMIDIOUT hmo, LPVOID pReserved) + { + //OutputDebugString(L"midiDisconnect\n"); + return midiDisconnect_orig( hmi, hmo, pReserved); + } + + MMRESULT WINAPI midiOutGetDevCapsA( UINT_PTR uDeviceID, LPMIDIOUTCAPSA pmoc, UINT cbmoc) + { + //OutputDebugString(L"midiOutGetDevCapsA\n"); + return midiOutGetDevCapsA_orig( uDeviceID, pmoc, cbmoc); + } + + MMRESULT WINAPI midiOutGetDevCapsW( UINT_PTR uDeviceID, LPMIDIOUTCAPSW pmoc, UINT cbmoc) + { + //OutputDebugString(L"midiOutGetDevCapsW\n"); + return midiOutGetDevCapsW_orig( uDeviceID, pmoc, cbmoc); + } + + MMRESULT WINAPI midiOutGetVolume( HMIDIOUT hmo, LPDWORD pdwVolume) + { + //OutputDebugString(L"midiOutGetVolume\n"); + return midiOutGetVolume_orig( hmo, pdwVolume); + } + + MMRESULT WINAPI midiOutSetVolume( HMIDIOUT hmo, DWORD dwVolume) + { + //OutputDebugString(L"midiOutSetVolume\n"); + return midiOutSetVolume_orig( hmo, dwVolume); + } + + MMRESULT WINAPI midiOutGetErrorTextA( MMRESULT mmrError, LPSTR pszText, UINT cchText) + { + //OutputDebugString(L"midiOutGetErrorTextA\n"); + return midiOutGetErrorTextA_orig( mmrError, pszText, cchText); + } + + MMRESULT WINAPI midiOutGetErrorTextW( MMRESULT mmrError, LPWSTR pszText, UINT cchText) + { + //OutputDebugString(L"midiOutGetErrorTextW\n"); + return midiOutGetErrorTextW_orig( mmrError, pszText, cchText); + } + + MMRESULT WINAPI midiOutOpen( LPHMIDIOUT phmo, UINT uDeviceID, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen) + { + //OutputDebugString(L"midiOutOpen\n"); + return midiOutOpen_orig(phmo, uDeviceID, dwCallback, dwInstance, fdwOpen); + } + + MMRESULT WINAPI midiOutClose( HMIDIOUT hmo) + { + //OutputDebugString(L"midiOutClose\n"); + return midiOutClose_orig( hmo); + } + + MMRESULT WINAPI midiOutPrepareHeader( HMIDIOUT hmo, LPMIDIHDR pmh, UINT cbmh) + { + //OutputDebugString(L"midiOutPrepareHeader\n"); + return midiOutPrepareHeader_orig( hmo, pmh, cbmh); + } + + MMRESULT WINAPI midiOutUnprepareHeader(HMIDIOUT hmo, LPMIDIHDR pmh, UINT cbmh) + { + //OutputDebugString(L"midiOutUnprepareHeader\n"); + return midiOutUnprepareHeader_orig(hmo, pmh, cbmh); + } + + MMRESULT WINAPI midiOutShortMsg( HMIDIOUT hmo, DWORD dwMsg) + { + //OutputDebugString(L"midiOutShortMsg\n"); + return midiOutShortMsg_orig( hmo, dwMsg); + } + + MMRESULT WINAPI midiOutLongMsg(HMIDIOUT hmo, LPMIDIHDR pmh, UINT cbmh) + { + //OutputDebugString(L"midiOutLongMsg\n"); + return midiOutLongMsg_orig(hmo, pmh, cbmh); + } + + MMRESULT WINAPI midiOutReset( HMIDIOUT hmo) + { + //OutputDebugString(L"midiOutReset\n"); + return midiOutReset_orig( hmo); + } + + MMRESULT WINAPI midiOutCachePatches( HMIDIOUT hmo, UINT uBank, LPWORD pwpa, UINT fuCache) + { + //OutputDebugString(L"midiOutCachePatches\n"); + return midiOutCachePatches_orig( hmo, uBank, pwpa, fuCache); + } + + MMRESULT WINAPI midiOutCacheDrumPatches( HMIDIOUT hmo, UINT uPatch, LPWORD pwkya, UINT fuCache) + { + //OutputDebugString(L"midiOutCacheDrumPatches\n"); + return midiOutCacheDrumPatches_orig( hmo, uPatch, pwkya, fuCache); + } + + MMRESULT WINAPI midiOutGetID( HMIDIOUT hmo, LPUINT puDeviceID) + { + //OutputDebugString(L"midiOutGetID\n"); + return midiOutGetID_orig( hmo, puDeviceID); + } + + MMRESULT WINAPI midiOutMessage( HMIDIOUT hmo, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2) + { + //OutputDebugString(L"midiOutMessage\n"); + return midiOutMessage_orig( hmo, uMsg, dw1, dw2); + } + + UINT WINAPI midiInGetNumDevs(void) + { + //OutputDebugString(L"midiInGetNumDevs\n"); + return midiInGetNumDevs_orig(); + } + + MMRESULT WINAPI midiInGetDevCapsA( UINT_PTR uDeviceID, LPMIDIINCAPSA pmic, UINT cbmic) + { + //OutputDebugString(L"midiInGetDevCapsA\n"); + return midiInGetDevCapsA_orig( uDeviceID, pmic, cbmic); + } + + MMRESULT WINAPI midiInGetDevCapsW( UINT_PTR uDeviceID, LPMIDIINCAPSW pmic, UINT cbmic) + { + //OutputDebugString(L"midiInGetDevCapsW\n"); + return midiInGetDevCapsW_orig( uDeviceID, pmic, cbmic); + } + + MMRESULT WINAPI midiInGetErrorTextA( MMRESULT mmrError, LPSTR pszText, UINT cchText) + { + //OutputDebugString(L"midiInGetErrorTextA\n"); + return midiInGetErrorTextA_orig( mmrError, pszText, cchText); + } + + MMRESULT WINAPI midiInGetErrorTextW( MMRESULT mmrError, LPWSTR pszText, UINT cchText) + { + //OutputDebugString(L"midiInGetErrorTextW\n"); + return midiInGetErrorTextW_orig( mmrError, pszText, cchText); + } + + MMRESULT WINAPI midiInOpen( LPHMIDIIN phmi, UINT uDeviceID, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen) + { + //OutputDebugString(L"midiInOpen\n"); + return midiInOpen_orig(phmi, uDeviceID, dwCallback, dwInstance, fdwOpen); + } + + MMRESULT WINAPI midiInClose( HMIDIIN hmi) + { + //OutputDebugString(L"midiInClose\n"); + return midiInClose_orig( hmi); + } + + MMRESULT WINAPI midiInPrepareHeader( HMIDIIN hmi, LPMIDIHDR pmh, UINT cbmh) + { + //OutputDebugString(L"midiInPrepareHeader\n"); + return midiInPrepareHeader_orig( hmi, pmh, cbmh); + } + + MMRESULT WINAPI midiInUnprepareHeader( HMIDIIN hmi, LPMIDIHDR pmh, UINT cbmh) + { + //OutputDebugString(L"midiInUnprepareHeader\n"); + return midiInUnprepareHeader_orig( hmi, pmh, cbmh); + } + + MMRESULT WINAPI midiInAddBuffer( HMIDIIN hmi, LPMIDIHDR pmh, UINT cbmh) + { + //OutputDebugString(L"midiInAddBuffer\n"); + return midiInAddBuffer_orig( hmi, pmh, cbmh); + } + + MMRESULT WINAPI midiInStart( HMIDIIN hmi) + { + //OutputDebugString(L"midiInStart\n"); + return midiInStart_orig( hmi); + } + + MMRESULT WINAPI midiInStop( HMIDIIN hmi) + { + //OutputDebugString(L"midiInStop\n"); + return midiInStop_orig(hmi); + } + + MMRESULT WINAPI midiInReset( HMIDIIN hmi) + { + //OutputDebugString(L"midiInReset\n"); + return midiInReset_orig( hmi); + } + + MMRESULT WINAPI midiInGetID( HMIDIIN hmi, LPUINT puDeviceID) + { + //OutputDebugString(L"midiInGetID\n"); + return midiInGetID_orig( hmi, puDeviceID); + } + + MMRESULT WINAPI midiInMessage( HMIDIIN hmi, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2) + { + //OutputDebugString(L"midiInMessage\n"); + return midiInMessage_orig( hmi, uMsg, dw1, dw2); + } + + UINT WINAPI auxGetNumDevs(void) + { + //OutputDebugString(L"auxGetNumDevs\n"); + return auxGetNumDevs_orig(); + } + + MMRESULT WINAPI auxGetDevCapsA( UINT_PTR uDeviceID, LPAUXCAPSA pac, UINT cbac) + { + //OutputDebugString(L"auxGetDevCapsA\n"); + return auxGetDevCapsA_orig( uDeviceID, pac, cbac); + } + + MMRESULT WINAPI auxGetDevCapsW( UINT_PTR uDeviceID, LPAUXCAPSW pac, UINT cbac) + { + //OutputDebugString(L"auxGetDevCapsW\n"); + return auxGetDevCapsW_orig( uDeviceID, pac, cbac); + } + + MMRESULT WINAPI auxSetVolume( UINT uDeviceID, DWORD dwVolume) + { + //OutputDebugString(L"auxSetVolume\n"); + return auxSetVolume_orig( uDeviceID, dwVolume); + } + + MMRESULT WINAPI auxGetVolume( UINT uDeviceID, LPDWORD pdwVolume) + { + //OutputDebugString(L"auxGetVolume\n"); + return auxGetVolume_orig( uDeviceID, pdwVolume); + } + + MMRESULT WINAPI auxOutMessage( UINT uDeviceID, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2) + { + //OutputDebugString(L"auxOutMessage\n"); + return auxOutMessage_orig( uDeviceID, uMsg, dw1, dw2); + } + + UINT WINAPI mixerGetNumDevs(void) + { + //OutputDebugString(L"mixerGetNumDevs\n"); + return mixerGetNumDevs_orig(); + } + + MMRESULT WINAPI mixerGetDevCapsA( UINT_PTR uMxId, LPMIXERCAPSA pmxcaps, UINT cbmxcaps) + { + //OutputDebugString(L"mixerGetDevCapsA\n"); + return mixerGetDevCapsA_orig( uMxId, pmxcaps, cbmxcaps); + } + + MMRESULT WINAPI mixerGetDevCapsW( UINT_PTR uMxId, LPMIXERCAPSW pmxcaps, UINT cbmxcaps) + { + //OutputDebugString(L"mixerGetDevCapsW\n"); + return mixerGetDevCapsW_orig( uMxId, pmxcaps, cbmxcaps); + } + + MMRESULT WINAPI mixerOpen( LPHMIXER phmx, UINT uMxId, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen) + { + //OutputDebugString(L"mixerOpen\n"); + return mixerOpen_orig( phmx, uMxId, dwCallback, dwInstance, fdwOpen); + } + + MMRESULT WINAPI mixerClose( HMIXER hmx) + { + //OutputDebugString(L"mixerClose\n"); + return mixerClose_orig( hmx); + } + + DWORD WINAPI mixerMessage( HMIXER hmx, UINT uMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2) + { + //OutputDebugString(L"mixerMessage\n"); + return mixerMessage_orig( hmx, uMsg, dwParam1, dwParam2); + } + + MMRESULT WINAPI mixerGetLineInfoA( HMIXEROBJ hmxobj, LPMIXERLINEA pmxl, DWORD fdwInfo) + { + //OutputDebugString(L"mixerGetLineInfoA\n"); + return mixerGetLineInfoA_orig( hmxobj, pmxl, fdwInfo); + } + + MMRESULT WINAPI mixerGetLineInfoW( HMIXEROBJ hmxobj, LPMIXERLINEW pmxl, DWORD fdwInfo) + { + //OutputDebugString(L"mixerGetLineInfoW\n"); + return mixerGetLineInfoW_orig( hmxobj, pmxl, fdwInfo); + } + + MMRESULT WINAPI mixerGetID( HMIXEROBJ hmxobj, UINT FAR *puMxId, DWORD fdwId) + { + //OutputDebugString(L"mixerGetID\n"); + return mixerGetID_orig( hmxobj, puMxId, fdwId); + } + + MMRESULT WINAPI mixerGetLineControlsA( HMIXEROBJ hmxobj, LPMIXERLINECONTROLSA pmxlc, DWORD fdwControls) + { + //OutputDebugString(L"mixerGetLineControlsA\n"); + return mixerGetLineControlsA_orig( hmxobj, pmxlc, fdwControls); + } + + MMRESULT WINAPI mixerGetLineControlsW( HMIXEROBJ hmxobj, LPMIXERLINECONTROLSW pmxlc, DWORD fdwControls) + { + //OutputDebugString(L"mixerGetLineControlsW\n"); + return mixerGetLineControlsW_orig( hmxobj, pmxlc, fdwControls); + } + + MMRESULT WINAPI mixerGetControlDetailsA( HMIXEROBJ hmxobj, LPMIXERCONTROLDETAILS pmxcd, DWORD fdwDetails) + { + //OutputDebugString(L"mixerGetControlDetailsA\n"); + return mixerGetControlDetailsA_orig( hmxobj, pmxcd, fdwDetails); + } + + MMRESULT WINAPI mixerGetControlDetailsW( HMIXEROBJ hmxobj, LPMIXERCONTROLDETAILS pmxcd, DWORD fdwDetails) + { + //OutputDebugString(L"mixerGetControlDetailsW\n"); + return mixerGetControlDetailsW_orig( hmxobj, pmxcd, fdwDetails); + } + + MMRESULT WINAPI mixerSetControlDetails( HMIXEROBJ hmxobj, LPMIXERCONTROLDETAILS pmxcd, DWORD fdwDetails) + { + //OutputDebugString(L"mixerSetControlDetails\n"); + return mixerSetControlDetails_orig( hmxobj, pmxcd, fdwDetails); + } + + DWORD WINAPI mmGetCurrentTask(void) + { + //OutputDebugString(L"mmGetCurrentTask\n"); + return mmGetCurrentTask_orig(); + } + + void WINAPI mmTaskBlock(DWORD val) + { + //OutputDebugString(L"mmTaskBlock\n"); + return mmTaskBlock_orig(val); + } + + UINT WINAPI mmTaskCreate(LPTASKCALLBACK a, HANDLE* b, DWORD_PTR c) + { + //OutputDebugString(L"mmTaskCreate\n"); + return mmTaskCreate_orig(a, b, c); + } + + BOOL WINAPI mmTaskSignal(DWORD a) + { + //OutputDebugString(L"mmTaskSignal\n"); + return mmTaskSignal_orig(a); + } + + VOID WINAPI mmTaskYield() + { + //OutputDebugString(L"mmTaskYield\n"); + mmTaskYield_orig(); + } + + MMRESULT WINAPI timeGetSystemTime( LPMMTIME pmmt, UINT cbmmt) + { + //OutputDebugString(L"timeGetSystemTime\n"); + return timeGetSystemTime_orig( pmmt, cbmmt); + } + + DWORD WINAPI timeGetTime(void) + { + //OutputDebugString(L"timeGetTime\n"); + return timeGetTime_orig(); + } + + MMRESULT WINAPI timeSetEvent( UINT uDelay, UINT uResolution, LPTIMECALLBACK fptc, DWORD_PTR dwUser, UINT fuEvent) + { + //OutputDebugString(L"timeSetEvent\n"); + return timeSetEvent_orig(uDelay, uResolution, fptc, dwUser, fuEvent); + } + + MMRESULT WINAPI timeKillEvent( UINT uTimerID) + { + //OutputDebugString(L"timeKillEvent\n"); + return timeKillEvent_orig( uTimerID); + } + + MMRESULT WINAPI timeGetDevCaps( LPTIMECAPS ptc, UINT cbtc) + { + //OutputDebugString(L"timeGetDevCaps\n"); + return timeGetDevCaps_orig( ptc, cbtc); + } + + MMRESULT WINAPI timeBeginPeriod( UINT uPeriod) + { + //OutputDebugString(L"timeBeginPeriod\n"); + return timeBeginPeriod_orig( uPeriod); + } + + MMRESULT WINAPI timeEndPeriod( UINT uPeriod) + { + //OutputDebugString(L"timeEndPeriod\n"); + return timeEndPeriod_orig( uPeriod); + } + + UINT WINAPI joyGetNumDevs(void) + { + //OutputDebugString(L"joyGetNumDevs\n"); + return joyGetNumDevs_orig(); + } + + MMRESULT WINAPI joyConfigChanged(DWORD dwFlags) + { + //OutputDebugString(L"joyConfigChanged\n"); + return joyConfigChanged_orig(dwFlags); + } + + MMRESULT WINAPI joyGetDevCapsA( UINT_PTR uJoyID, LPJOYCAPSA pjc, UINT cbjc) + { + //OutputDebugString(L"joyGetDevCapsA\n"); + return joyGetDevCapsA_orig( uJoyID, pjc, cbjc); + } + + MMRESULT WINAPI joyGetDevCapsW( UINT_PTR uJoyID, LPJOYCAPSW pjc, UINT cbjc) + { + //OutputDebugString(L"joyGetDevCapsW\n"); + return joyGetDevCapsW_orig( uJoyID, pjc, cbjc); + } + + MMRESULT WINAPI joyGetPos( UINT uJoyID, LPJOYINFO pji) + { + //OutputDebugString(L"joyGetPos\n"); + return joyGetPos_orig( uJoyID, pji); + } + + MMRESULT WINAPI joyGetPosEx( UINT uJoyID, LPJOYINFOEX pji) + { + //OutputDebugString(L"joyGetPosEx\n"); + return joyGetPosEx_orig( uJoyID, pji); + } + + MMRESULT WINAPI joyGetThreshold( UINT uJoyID, LPUINT puThreshold) + { + //OutputDebugString(L"joyGetThreshold\n"); + return joyGetThreshold_orig( uJoyID, puThreshold); + } + + MMRESULT WINAPI joyReleaseCapture( UINT uJoyID) + { + //OutputDebugString(L"joyReleaseCapture\n"); + return joyReleaseCapture_orig( uJoyID); + } + + MMRESULT WINAPI joySetCapture( HWND hwnd, UINT uJoyID, UINT uPeriod, BOOL fChanged) + { + //OutputDebugString(L"joySetCapture\n"); + return joySetCapture_orig(hwnd, uJoyID, uPeriod, fChanged); + } + + MMRESULT WINAPI joySetThreshold( UINT uJoyID, UINT uThreshold) + { + //OutputDebugString(L"joySetThreshold\n"); + return joySetThreshold_orig( uJoyID, uThreshold); + } + + BOOL WINAPI mciDriverNotify(HWND hwndCallback, UINT uDeviceID, UINT uStatus) + { + //OutputDebugString(L"mciDriverNotify\n"); + return mciDriverNotify_orig(hwndCallback, uDeviceID, uStatus); + } + + UINT WINAPI mciDriverYield(UINT uDeviceID) + { + //OutputDebugString(L"mciDriverYield\n"); + return mciDriverYield_orig(uDeviceID); + } + + FOURCC WINAPI mmioStringToFOURCCA( LPCSTR sz, UINT uFlags) + { + //OutputDebugString(L"mmioStringToFOURCCA\n"); + return mmioStringToFOURCCA_orig( sz, uFlags); + } + + FOURCC WINAPI mmioStringToFOURCCW( LPCWSTR sz, UINT uFlags) + { + //OutputDebugString(L"mmioStringToFOURCCW\n"); + return mmioStringToFOURCCW_orig( sz, uFlags); + } + + LPMMIOPROC WINAPI mmioInstallIOProcA( FOURCC fccIOProc, LPMMIOPROC pIOProc, DWORD dwFlags) + { + //OutputDebugString(L"mmioInstallIOProcA\n"); + return mmioInstallIOProcA_orig( fccIOProc, pIOProc, dwFlags); + } + + LPMMIOPROC WINAPI mmioInstallIOProcW( FOURCC fccIOProc, LPMMIOPROC pIOProc, DWORD dwFlags) + { + //OutputDebugString(L"mmioInstallIOProcW\n"); + return mmioInstallIOProcW_orig( fccIOProc, pIOProc, dwFlags); + } + + HMMIO WINAPI mmioOpenA( LPSTR pszFileName, LPMMIOINFO pmmioinfo, DWORD fdwOpen) + { + //OutputDebugString(L"mmioOpenA\n"); + return mmioOpenA_orig( pszFileName, pmmioinfo, fdwOpen); + } + + HMMIO WINAPI mmioOpenW( LPWSTR pszFileName, LPMMIOINFO pmmioinfo, DWORD fdwOpen) + { + //OutputDebugString(L"mmioOpenW\n"); + return mmioOpenW_orig( pszFileName, pmmioinfo, fdwOpen); + } + + MMRESULT WINAPI mmioRenameA( LPCSTR pszFileName, LPCSTR pszNewFileName, LPCMMIOINFO pmmioinfo, DWORD fdwRename) + { + //OutputDebugString(L"mmioRenameA\n"); + return mmioRenameA_orig( pszFileName, pszNewFileName, pmmioinfo, fdwRename); + } + + MMRESULT WINAPI mmioRenameW( LPCWSTR pszFileName, LPCWSTR pszNewFileName, LPCMMIOINFO pmmioinfo, DWORD fdwRename) + { + //OutputDebugString(L"mmioRenameW\n"); + return mmioRenameW_orig( pszFileName, pszNewFileName, pmmioinfo, fdwRename); + } + + MMRESULT WINAPI mmioClose( HMMIO hmmio, UINT fuClose) + { + //OutputDebugString(L"mmioClose\n"); + return mmioClose_orig( hmmio, fuClose); + } + + LONG WINAPI mmioRead( HMMIO hmmio, HPSTR pch, LONG cch) + { + //OutputDebugString(L"mmioRead\n"); + return mmioRead_orig( hmmio, pch, cch); + } + + LONG WINAPI mmioWrite( HMMIO hmmio, const char _huge* pch, LONG cch) + { + //OutputDebugString(L"mmioWrite\n"); + return mmioWrite_orig( hmmio, pch, cch); + } + + LONG WINAPI mmioSeek( HMMIO hmmio, LONG lOffset, int iOrigin) + { + //OutputDebugString(L"mmioSeek\n"); + return mmioSeek_orig(hmmio, lOffset, iOrigin); + } + + MMRESULT WINAPI mmioGetInfo( HMMIO hmmio, LPMMIOINFO pmmioinfo, UINT fuInfo) + { + //OutputDebugString(L"mmioGetInfo\n"); + return mmioGetInfo_orig( hmmio, pmmioinfo, fuInfo); + } + + MMRESULT WINAPI mmioSetInfo( HMMIO hmmio, LPCMMIOINFO pmmioinfo, UINT fuInfo) + { + //OutputDebugString(L"mmioSetInfo\n"); + return mmioSetInfo_orig( hmmio, pmmioinfo, fuInfo); + } + + MMRESULT WINAPI mmioSetBuffer( HMMIO hmmio, LPSTR pchBuffer, LONG cchBuffer, UINT fuBuffer) + { + //OutputDebugString(L"mmioSetBuffer\n"); + return mmioSetBuffer_orig(hmmio, pchBuffer, cchBuffer, fuBuffer); + } + + MMRESULT WINAPI mmioFlush( HMMIO hmmio, UINT fuFlush) + { + //OutputDebugString(L"mmioFlush\n"); + return mmioFlush_orig( hmmio, fuFlush); + } + + MMRESULT WINAPI mmioAdvance( HMMIO hmmio, LPMMIOINFO pmmioinfo, UINT fuAdvance) + { + //OutputDebugString(L"mmioAdvance\n"); + return mmioAdvance_orig( hmmio, pmmioinfo, fuAdvance); + } + + LRESULT WINAPI mmioSendMessage( HMMIO hmmio, UINT uMsg, LPARAM lParam1, LPARAM lParam2) + { + //OutputDebugString(L"mmioSendMessage\n"); + return mmioSendMessage_orig(hmmio, uMsg, lParam1, lParam2); + } + + MMRESULT WINAPI mmioDescend( HMMIO hmmio, LPMMCKINFO pmmcki, const MMCKINFO FAR* pmmckiParent, UINT fuDescend) + { + //OutputDebugString(L"mmioDescend\n"); + return mmioDescend_orig(hmmio, pmmcki, pmmckiParent, fuDescend); + } + + MMRESULT WINAPI mmioAscend( HMMIO hmmio, LPMMCKINFO pmmcki, UINT fuAscend) + { + //OutputDebugString(L"mmioAscend\n"); + return mmioAscend_orig( hmmio, pmmcki, fuAscend); + } + + MMRESULT WINAPI mmioCreateChunk(HMMIO hmmio, LPMMCKINFO pmmcki, UINT fuCreate) + { + //OutputDebugString(L"mmioCreateChunk\n"); + return mmioCreateChunk_orig(hmmio, pmmcki, fuCreate); + } + + MCIERROR WINAPI mciSendCommandA( MCIDEVICEID mciId, UINT uMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2) + { + //OutputDebugString(L"mciSendCommandA\n"); + return mciSendCommandA_orig( mciId, uMsg, dwParam1, dwParam2); + } + + MCIERROR WINAPI mciSendCommandW( MCIDEVICEID mciId, UINT uMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2) + { + //OutputDebugString(L"mciSendCommandW\n"); + return mciSendCommandW_orig( mciId, uMsg, dwParam1, dwParam2); + } + + MCIERROR WINAPI mciSendStringA( LPCSTR lpstrCommand, LPSTR lpstrReturnString, UINT uReturnLength, HWND hwndCallback) + { + //OutputDebugString(L"mciSendStringA\n"); + return mciSendStringA_orig( lpstrCommand, lpstrReturnString, uReturnLength, hwndCallback); + } + + MCIERROR WINAPI mciSendStringW( LPCWSTR lpstrCommand, LPWSTR lpstrReturnString, UINT uReturnLength, HWND hwndCallback) + { + //OutputDebugString(L"mciSendStringW\n"); + return mciSendStringW_orig( lpstrCommand, lpstrReturnString, uReturnLength, hwndCallback); + } + + MCIDEVICEID WINAPI mciGetDeviceIDA( LPCSTR pszDevice) + { + //OutputDebugString(L"mciGetDeviceIDA\n"); + return mciGetDeviceIDA_orig( pszDevice); + } + + MCIDEVICEID WINAPI mciGetDeviceIDW( LPCWSTR pszDevice) + { + //OutputDebugString(L"mciGetDeviceIDW\n"); + return mciGetDeviceIDW_orig( pszDevice); + } + + MCIDEVICEID WINAPI mciGetDeviceIDFromElementIDA( DWORD dwElementID, LPCSTR lpstrType ) + { + //OutputDebugString(L"mciGetDeviceIDFromElementIDA\n"); + return mciGetDeviceIDFromElementIDA_orig( dwElementID, lpstrType ); + } + + MCIDEVICEID WINAPI mciGetDeviceIDFromElementIDW( DWORD dwElementID, LPCWSTR lpstrType ) + { + //OutputDebugString(L"mciGetDeviceIDFromElementIDW\n"); + return mciGetDeviceIDFromElementIDW_orig( dwElementID, lpstrType ); + } + + DWORD_PTR WINAPI mciGetDriverData(UINT uDeviceID) + { + //OutputDebugString(L"mciGetDriverData\n"); + return mciGetDriverData_orig(uDeviceID); + } + + BOOL WINAPI mciGetErrorStringA( MCIERROR mcierr, LPSTR pszText, UINT cchText) + { + //OutputDebugString(L"mciGetErrorStringA\n"); + return mciGetErrorStringA_orig( mcierr, pszText, cchText); + } + + BOOL WINAPI mciGetErrorStringW( MCIERROR mcierr, LPWSTR pszText, UINT cchText) + { + //OutputDebugString(L"mciGetErrorStringW\n"); + return mciGetErrorStringW_orig( mcierr, pszText, cchText); + } + + BOOL WINAPI mciSetDriverData(UINT uDeviceID, DWORD_PTR dwData) + { + //OutputDebugString(L"mciSetDriverData_type\n"); + return mciSetDriverData_orig( uDeviceID, dwData ); + } + + BOOL WINAPI mciSetYieldProc( MCIDEVICEID mciId, YIELDPROC fpYieldProc, DWORD dwYieldData) + { + //OutputDebugString(L"mciSetYieldProc\n"); + return mciSetYieldProc_orig(mciId, fpYieldProc, dwYieldData); + } + + BOOL WINAPI mciFreeCommandResource(UINT uTable) + { + //OutputDebugString(L"mciFreeCommandResource\n"); + return mciFreeCommandResource_orig(uTable); + } + + HTASK WINAPI mciGetCreatorTask( MCIDEVICEID mciId) + { + //OutputDebugString(L"mciGetCreatorTask\n"); + return mciGetCreatorTask_orig( mciId); + } + + YIELDPROC WINAPI mciGetYieldProc( MCIDEVICEID mciId, LPDWORD pdwYieldData) + { + //OutputDebugString(L"mciGetYieldProc\n"); + return mciGetYieldProc_orig( mciId, pdwYieldData); + } + + UINT WINAPI mciLoadCommandResource(HINSTANCE hInstance, LPCWSTR lpResName, UINT uType) + { + //OutputDebugString(L"mciLoadCommandResource"); + return mciLoadCommandResource_orig(hInstance, lpResName, uType); + } + + + BOOL WINAPI mciExecute(LPCSTR pszCommand) + { + //OutputDebugString(L"mciExecute\n"); + return mciExecute_orig(pszCommand); + } +} diff --git a/indra/media_plugins/winmmshim/forwarding_api.h b/indra/media_plugins/winmmshim/forwarding_api.h new file mode 100644 index 0000000000..31e2186aa2 --- /dev/null +++ b/indra/media_plugins/winmmshim/forwarding_api.h @@ -0,0 +1,395 @@ +/** + * @file forwarding_api.h + * @brief forwards winmm API calls to real winmm.dll + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +// this turns off __declspec(dllimport) for the functions declared in mmsystem.h +#define _WINMM_ +#include <windows.h> +#include <mmsystem.h> + +void init_function_pointers(HMODULE winmm_handle); + +typedef VOID (*LPTASKCALLBACK)(DWORD_PTR dwInst); + +typedef LRESULT (WINAPI *CloseDriver_type)( HDRVR hDriver, LPARAM lParam1, LPARAM lParam2); +extern CloseDriver_type CloseDriver_orig; +typedef HDRVR (WINAPI *OpenDriver_type)( LPCWSTR szDriverName, LPCWSTR szSectionName, LPARAM lParam2); +extern OpenDriver_type OpenDriver_orig; +typedef LRESULT (WINAPI *SendDriverMessage_type)( HDRVR hDriver, UINT message, LPARAM lParam1, LPARAM lParam2); +extern SendDriverMessage_type SendDriverMessage_orig; +typedef HMODULE (WINAPI *DrvGetModuleHandle_type)( HDRVR hDriver); +extern DrvGetModuleHandle_type DrvGetModuleHandle_orig; +typedef HMODULE (WINAPI *GetDriverModuleHandle_type)( HDRVR hDriver); +extern GetDriverModuleHandle_type GetDriverModuleHandle_orig; +typedef LRESULT (WINAPI *DefDriverProc_type)( DWORD_PTR dwDriverIdentifier, HDRVR hdrvr, UINT uMsg, LPARAM lParam1, LPARAM lParam2); +extern DefDriverProc_type DefDriverProc_orig; +typedef BOOL (WINAPI *DriverCallback_type)(DWORD dwCallBack, DWORD dwFlags, HDRVR hdrvr, DWORD msg, DWORD dwUser, DWORD dwParam1, DWORD dwParam2); +extern DriverCallback_type DriverCallback_orig; +typedef UINT (WINAPI *mmsystemGetVersion_type)(void); +extern mmsystemGetVersion_type mmsystemGetVersion_orig; +typedef BOOL (WINAPI *sndPlaySoundA_type)( LPCSTR pszSound, UINT fuSound); +extern sndPlaySoundA_type sndPlaySoundA_orig; +typedef BOOL (WINAPI *sndPlaySoundW_type)( LPCWSTR pszSound, UINT fuSound); +extern sndPlaySoundW_type sndPlaySoundW_orig; +typedef BOOL (WINAPI *PlaySoundA_type)( LPCSTR pszSound, HMODULE hmod, DWORD fdwSound); +extern PlaySoundA_type PlaySoundA_orig; +typedef BOOL (WINAPI *PlaySoundW_type)( LPCWSTR pszSound, HMODULE hmod, DWORD fdwSound); +extern PlaySoundW_type PlaySoundW_orig; +typedef UINT (WINAPI *waveOutGetNumDevs_type)(void); +extern waveOutGetNumDevs_type waveOutGetNumDevs_orig; +typedef MMRESULT (WINAPI *waveOutGetDevCapsA_type)( UINT_PTR uDeviceID, LPWAVEOUTCAPSA pwoc, UINT cbwoc); +extern waveOutGetDevCapsA_type waveOutGetDevCapsA_orig; +typedef MMRESULT (WINAPI *waveOutGetDevCapsW_type)( UINT_PTR uDeviceID, LPWAVEOUTCAPSW pwoc, UINT cbwoc); +extern waveOutGetDevCapsW_type waveOutGetDevCapsW_orig; +typedef MMRESULT (WINAPI *waveOutGetVolume_type)( HWAVEOUT hwo, LPDWORD pdwVolume); +extern waveOutGetVolume_type waveOutGetVolume_orig; +typedef MMRESULT (WINAPI *waveOutSetVolume_type)( HWAVEOUT hwo, DWORD dwVolume); +extern waveOutSetVolume_type waveOutSetVolume_orig; +typedef MMRESULT (WINAPI *waveOutGetErrorTextA_type)( MMRESULT mmrError, LPSTR pszText, UINT cchText); +extern waveOutGetErrorTextA_type waveOutGetErrorTextA_orig; +typedef MMRESULT (WINAPI *waveOutGetErrorTextW_type)( MMRESULT mmrError, LPWSTR pszText, UINT cchText); +extern waveOutGetErrorTextW_type waveOutGetErrorTextW_orig; +typedef MMRESULT (WINAPI *waveOutOpen_type)( LPHWAVEOUT phwo, UINT uDeviceID, LPCWAVEFORMATEX pwfx, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen); +extern waveOutOpen_type waveOutOpen_orig; +typedef MMRESULT (WINAPI *waveOutClose_type)( HWAVEOUT hwo); +extern waveOutClose_type waveOutClose_orig; +typedef MMRESULT (WINAPI *waveOutPrepareHeader_type)( HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh); +extern waveOutPrepareHeader_type waveOutPrepareHeader_orig; +typedef MMRESULT (WINAPI *waveOutUnprepareHeader_type)( HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh); +extern waveOutUnprepareHeader_type waveOutUnprepareHeader_orig; +typedef MMRESULT (WINAPI *waveOutWrite_type)( HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh); +extern waveOutWrite_type waveOutWrite_orig; +typedef MMRESULT (WINAPI *waveOutPause_type)( HWAVEOUT hwo); +extern waveOutPause_type waveOutPause_orig; +typedef MMRESULT (WINAPI *waveOutRestart_type)( HWAVEOUT hwo); +extern waveOutRestart_type waveOutRestart_orig; +typedef MMRESULT (WINAPI *waveOutReset_type)( HWAVEOUT hwo); +extern waveOutReset_type waveOutReset_orig; +typedef MMRESULT (WINAPI *waveOutBreakLoop_type)( HWAVEOUT hwo); +extern waveOutBreakLoop_type waveOutBreakLoop_orig; +typedef MMRESULT (WINAPI *waveOutGetPosition_type)( HWAVEOUT hwo, LPMMTIME pmmt, UINT cbmmt); +extern waveOutGetPosition_type waveOutGetPosition_orig; +typedef MMRESULT (WINAPI *waveOutGetPitch_type)( HWAVEOUT hwo, LPDWORD pdwPitch); +extern waveOutGetPitch_type waveOutGetPitch_orig; +typedef MMRESULT (WINAPI *waveOutSetPitch_type)( HWAVEOUT hwo, DWORD dwPitch); +extern waveOutSetPitch_type waveOutSetPitch_orig; +typedef MMRESULT (WINAPI *waveOutGetPlaybackRate_type)( HWAVEOUT hwo, LPDWORD pdwRate); +extern waveOutGetPlaybackRate_type waveOutGetPlaybackRate_orig; +typedef MMRESULT (WINAPI *waveOutSetPlaybackRate_type)( HWAVEOUT hwo, DWORD dwRate); +extern waveOutSetPlaybackRate_type waveOutSetPlaybackRate_orig; +typedef MMRESULT (WINAPI *waveOutGetID_type)( HWAVEOUT hwo, LPUINT puDeviceID); +extern waveOutGetID_type waveOutGetID_orig; +typedef MMRESULT (WINAPI *waveOutMessage_type)( HWAVEOUT hwo, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2); +extern waveOutMessage_type waveOutMessage_orig; +typedef UINT (WINAPI *waveInGetNumDevs_type)(void); +extern waveInGetNumDevs_type waveInGetNumDevs_orig; +typedef MMRESULT (WINAPI *waveInGetDevCapsA_type)( UINT_PTR uDeviceID, LPWAVEINCAPSA pwic, UINT cbwic); +extern waveInGetDevCapsA_type waveInGetDevCapsA_orig; +typedef MMRESULT (WINAPI *waveInGetDevCapsW_type)( UINT_PTR uDeviceID, LPWAVEINCAPSW pwic, UINT cbwic); +extern waveInGetDevCapsW_type waveInGetDevCapsW_orig; +typedef MMRESULT (WINAPI *waveInGetErrorTextA_type)(MMRESULT mmrError, LPSTR pszText, UINT cchText); +extern waveInGetErrorTextA_type waveInGetErrorTextA_orig; +typedef MMRESULT (WINAPI *waveInGetErrorTextW_type)(MMRESULT mmrError, LPWSTR pszText, UINT cchText); +extern waveInGetErrorTextW_type waveInGetErrorTextW_orig; +typedef MMRESULT (WINAPI *waveInOpen_type)( LPHWAVEIN phwi, UINT uDeviceID, LPCWAVEFORMATEX pwfx, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen); +extern waveInOpen_type waveInOpen_orig; +typedef MMRESULT (WINAPI *waveInClose_type)( HWAVEIN hwi); +extern waveInClose_type waveInClose_orig; +typedef MMRESULT (WINAPI *waveInPrepareHeader_type)( HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh); +extern waveInPrepareHeader_type waveInPrepareHeader_orig; +typedef MMRESULT (WINAPI *waveInUnprepareHeader_type)( HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh); +extern waveInUnprepareHeader_type waveInUnprepareHeader_orig; +typedef MMRESULT (WINAPI *waveInAddBuffer_type)( HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh); +extern waveInAddBuffer_type waveInAddBuffer_orig; +typedef MMRESULT (WINAPI *waveInStart_type)( HWAVEIN hwi); +extern waveInStart_type waveInStart_orig; +typedef MMRESULT (WINAPI *waveInStop_type)( HWAVEIN hwi); +extern waveInStop_type waveInStop_orig; +typedef MMRESULT (WINAPI *waveInReset_type)( HWAVEIN hwi); +extern waveInReset_type waveInReset_orig; +typedef MMRESULT (WINAPI *waveInGetPosition_type)( HWAVEIN hwi, LPMMTIME pmmt, UINT cbmmt); +extern waveInGetPosition_type waveInGetPosition_orig; +typedef MMRESULT (WINAPI *waveInGetID_type)( HWAVEIN hwi, LPUINT puDeviceID); +extern waveInGetID_type waveInGetID_orig; +typedef MMRESULT (WINAPI *waveInMessage_type)( HWAVEIN hwi, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2); +extern waveInMessage_type waveInMessage_orig; +typedef UINT (WINAPI *midiOutGetNumDevs_type)(void); +extern midiOutGetNumDevs_type midiOutGetNumDevs_orig; +typedef MMRESULT (WINAPI *midiStreamOpen_type)( LPHMIDISTRM phms, LPUINT puDeviceID, DWORD cMidi, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen); +extern midiStreamOpen_type midiStreamOpen_orig; +typedef MMRESULT (WINAPI *midiStreamClose_type)( HMIDISTRM hms); +extern midiStreamClose_type midiStreamClose_orig; +typedef MMRESULT (WINAPI *midiStreamProperty_type)( HMIDISTRM hms, LPBYTE lppropdata, DWORD dwProperty); +extern midiStreamProperty_type midiStreamProperty_orig; +typedef MMRESULT (WINAPI *midiStreamPosition_type)( HMIDISTRM hms, LPMMTIME lpmmt, UINT cbmmt); +extern midiStreamPosition_type midiStreamPosition_orig; +typedef MMRESULT (WINAPI *midiStreamOut_type)( HMIDISTRM hms, LPMIDIHDR pmh, UINT cbmh); +extern midiStreamOut_type midiStreamOut_orig; +typedef MMRESULT (WINAPI *midiStreamPause_type)( HMIDISTRM hms); +extern midiStreamPause_type midiStreamPause_orig; +typedef MMRESULT (WINAPI *midiStreamRestart_type)( HMIDISTRM hms); +extern midiStreamRestart_type midiStreamRestart_orig; +typedef MMRESULT (WINAPI *midiStreamStop_type)( HMIDISTRM hms); +extern midiStreamStop_type midiStreamStop_orig; +typedef MMRESULT (WINAPI *midiConnect_type)( HMIDI hmi, HMIDIOUT hmo, LPVOID pReserved); +extern midiConnect_type midiConnect_orig; +typedef MMRESULT (WINAPI *midiDisconnect_type)( HMIDI hmi, HMIDIOUT hmo, LPVOID pReserved); +extern midiDisconnect_type midiDisconnect_orig; +typedef MMRESULT (WINAPI *midiOutGetDevCapsA_type)( UINT_PTR uDeviceID, LPMIDIOUTCAPSA pmoc, UINT cbmoc); +extern midiOutGetDevCapsA_type midiOutGetDevCapsA_orig; +typedef MMRESULT (WINAPI *midiOutGetDevCapsW_type)( UINT_PTR uDeviceID, LPMIDIOUTCAPSW pmoc, UINT cbmoc); +extern midiOutGetDevCapsW_type midiOutGetDevCapsW_orig; +typedef MMRESULT (WINAPI *midiOutGetVolume_type)( HMIDIOUT hmo, LPDWORD pdwVolume); +extern midiOutGetVolume_type midiOutGetVolume_orig; +typedef MMRESULT (WINAPI *midiOutSetVolume_type)( HMIDIOUT hmo, DWORD dwVolume); +extern midiOutSetVolume_type midiOutSetVolume_orig; +typedef MMRESULT (WINAPI *midiOutGetErrorTextA_type)( MMRESULT mmrError, LPSTR pszText, UINT cchText); +extern midiOutGetErrorTextA_type midiOutGetErrorTextA_orig; +typedef MMRESULT (WINAPI *midiOutGetErrorTextW_type)( MMRESULT mmrError, LPWSTR pszText, UINT cchText); +extern midiOutGetErrorTextW_type midiOutGetErrorTextW_orig; +typedef MMRESULT (WINAPI *midiOutOpen_type)( LPHMIDIOUT phmo, UINT uDeviceID, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen); +extern midiOutOpen_type midiOutOpen_orig; +typedef MMRESULT (WINAPI *midiOutClose_type)( HMIDIOUT hmo); +extern midiOutClose_type midiOutClose_orig; +typedef MMRESULT (WINAPI *midiOutPrepareHeader_type)( HMIDIOUT hmo, LPMIDIHDR pmh, UINT cbmh); +extern midiOutPrepareHeader_type midiOutPrepareHeader_orig; +typedef MMRESULT (WINAPI *midiOutUnprepareHeader_type)(HMIDIOUT hmo, LPMIDIHDR pmh, UINT cbmh); +extern midiOutUnprepareHeader_type midiOutUnprepareHeader_orig; +typedef MMRESULT (WINAPI *midiOutShortMsg_type)( HMIDIOUT hmo, DWORD dwMsg); +extern midiOutShortMsg_type midiOutShortMsg_orig; +typedef MMRESULT (WINAPI *midiOutLongMsg_type)(HMIDIOUT hmo, LPMIDIHDR pmh, UINT cbmh); +extern midiOutLongMsg_type midiOutLongMsg_orig; +typedef MMRESULT (WINAPI *midiOutReset_type)( HMIDIOUT hmo); +extern midiOutReset_type midiOutReset_orig; +typedef MMRESULT (WINAPI *midiOutCachePatches_type)( HMIDIOUT hmo, UINT uBank, LPWORD pwpa, UINT fuCache); +extern midiOutCachePatches_type midiOutCachePatches_orig; +typedef MMRESULT (WINAPI *midiOutCacheDrumPatches_type)( HMIDIOUT hmo, UINT uPatch, LPWORD pwkya, UINT fuCache); +extern midiOutCacheDrumPatches_type midiOutCacheDrumPatches_orig; +typedef MMRESULT (WINAPI *midiOutGetID_type)( HMIDIOUT hmo, LPUINT puDeviceID); +extern midiOutGetID_type midiOutGetID_orig; +typedef MMRESULT (WINAPI *midiOutMessage_type)( HMIDIOUT hmo, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2); +extern midiOutMessage_type midiOutMessage_orig; +typedef UINT (WINAPI *midiInGetNumDevs_type)(void); +extern midiInGetNumDevs_type midiInGetNumDevs_orig; +typedef MMRESULT (WINAPI *midiInGetDevCapsA_type)( UINT_PTR uDeviceID, LPMIDIINCAPSA pmic, UINT cbmic); +extern midiInGetDevCapsA_type midiInGetDevCapsA_orig; +typedef MMRESULT (WINAPI *midiInGetDevCapsW_type)( UINT_PTR uDeviceID, LPMIDIINCAPSW pmic, UINT cbmic); +extern midiInGetDevCapsW_type midiInGetDevCapsW_orig; +typedef MMRESULT (WINAPI *midiInGetErrorTextA_type)( MMRESULT mmrError, LPSTR pszText, UINT cchText); +extern midiInGetErrorTextA_type midiInGetErrorTextA_orig; +typedef MMRESULT (WINAPI *midiInGetErrorTextW_type)( MMRESULT mmrError, LPWSTR pszText, UINT cchText); +extern midiInGetErrorTextW_type midiInGetErrorTextW_orig; +typedef MMRESULT (WINAPI *midiInOpen_type)( LPHMIDIIN phmi, UINT uDeviceID, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen); +extern midiInOpen_type midiInOpen_orig; +typedef MMRESULT (WINAPI *midiInClose_type)( HMIDIIN hmi); +extern midiInClose_type midiInClose_orig; +typedef MMRESULT (WINAPI *midiInPrepareHeader_type)( HMIDIIN hmi, LPMIDIHDR pmh, UINT cbmh); +extern midiInPrepareHeader_type midiInPrepareHeader_orig; +typedef MMRESULT (WINAPI *midiInUnprepareHeader_type)( HMIDIIN hmi, LPMIDIHDR pmh, UINT cbmh); +extern midiInUnprepareHeader_type midiInUnprepareHeader_orig; +typedef MMRESULT (WINAPI *midiInAddBuffer_type)( HMIDIIN hmi, LPMIDIHDR pmh, UINT cbmh); +extern midiInAddBuffer_type midiInAddBuffer_orig; +typedef MMRESULT (WINAPI *midiInStart_type)( HMIDIIN hmi); +extern midiInStart_type midiInStart_orig; +typedef MMRESULT (WINAPI *midiInStop_type)( HMIDIIN hmi); +extern midiInStop_type midiInStop_orig; +typedef MMRESULT (WINAPI *midiInReset_type)( HMIDIIN hmi); +extern midiInReset_type midiInReset_orig; +typedef MMRESULT (WINAPI *midiInGetID_type)( HMIDIIN hmi, LPUINT puDeviceID); +extern midiInGetID_type midiInGetID_orig; +typedef MMRESULT (WINAPI *midiInMessage_type)( HMIDIIN hmi, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2); +extern midiInMessage_type midiInMessage_orig; +typedef UINT (WINAPI *auxGetNumDevs_type)(void); +extern auxGetNumDevs_type auxGetNumDevs_orig; +typedef MMRESULT (WINAPI *auxGetDevCapsA_type)( UINT_PTR uDeviceID, LPAUXCAPSA pac, UINT cbac); +extern auxGetDevCapsA_type auxGetDevCapsA_orig; +typedef MMRESULT (WINAPI *auxGetDevCapsW_type)( UINT_PTR uDeviceID, LPAUXCAPSW pac, UINT cbac); +extern auxGetDevCapsW_type auxGetDevCapsW_orig; +typedef MMRESULT (WINAPI *auxSetVolume_type)( UINT uDeviceID, DWORD dwVolume); +extern auxSetVolume_type auxSetVolume_orig; +typedef MMRESULT (WINAPI *auxGetVolume_type)( UINT uDeviceID, LPDWORD pdwVolume); +extern auxGetVolume_type auxGetVolume_orig; +typedef MMRESULT (WINAPI *auxOutMessage_type)( UINT uDeviceID, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2); +extern auxOutMessage_type auxOutMessage_orig; +typedef UINT (WINAPI *mixerGetNumDevs_type)(void); +extern mixerGetNumDevs_type mixerGetNumDevs_orig; +typedef MMRESULT (WINAPI *mixerGetDevCapsA_type)( UINT_PTR uMxId, LPMIXERCAPSA pmxcaps, UINT cbmxcaps); +extern mixerGetDevCapsA_type mixerGetDevCapsA_orig; +typedef MMRESULT (WINAPI *mixerGetDevCapsW_type)( UINT_PTR uMxId, LPMIXERCAPSW pmxcaps, UINT cbmxcaps); +extern mixerGetDevCapsW_type mixerGetDevCapsW_orig; +typedef MMRESULT (WINAPI *mixerOpen_type)( LPHMIXER phmx, UINT uMxId, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen); +extern mixerOpen_type mixerOpen_orig; +typedef MMRESULT (WINAPI *mixerClose_type)( HMIXER hmx); +extern mixerClose_type mixerClose_orig; +typedef DWORD (WINAPI *mixerMessage_type)( HMIXER hmx, UINT uMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2); +extern mixerMessage_type mixerMessage_orig; +typedef MMRESULT (WINAPI *mixerGetLineInfoA_type)( HMIXEROBJ hmxobj, LPMIXERLINEA pmxl, DWORD fdwInfo); +extern mixerGetLineInfoA_type mixerGetLineInfoA_orig; +typedef MMRESULT (WINAPI *mixerGetLineInfoW_type)( HMIXEROBJ hmxobj, LPMIXERLINEW pmxl, DWORD fdwInfo); +extern mixerGetLineInfoW_type mixerGetLineInfoW_orig; +typedef MMRESULT (WINAPI *mixerGetID_type)( HMIXEROBJ hmxobj, UINT FAR *puMxId, DWORD fdwId); +extern mixerGetID_type mixerGetID_orig; +typedef MMRESULT (WINAPI *mixerGetLineControlsA_type)( HMIXEROBJ hmxobj, LPMIXERLINECONTROLSA pmxlc, DWORD fdwControls); +extern mixerGetLineControlsA_type mixerGetLineControlsA_orig; +typedef MMRESULT (WINAPI *mixerGetLineControlsW_type)( HMIXEROBJ hmxobj, LPMIXERLINECONTROLSW pmxlc, DWORD fdwControls); +extern mixerGetLineControlsW_type mixerGetLineControlsW_orig; +typedef MMRESULT (WINAPI *mixerGetControlDetailsA_type)( HMIXEROBJ hmxobj, LPMIXERCONTROLDETAILS pmxcd, DWORD fdwDetails); +extern mixerGetControlDetailsA_type mixerGetControlDetailsA_orig; +typedef MMRESULT (WINAPI *mixerGetControlDetailsW_type)( HMIXEROBJ hmxobj, LPMIXERCONTROLDETAILS pmxcd, DWORD fdwDetails); +extern mixerGetControlDetailsW_type mixerGetControlDetailsW_orig; +typedef MMRESULT (WINAPI *mixerSetControlDetails_type)( HMIXEROBJ hmxobj, LPMIXERCONTROLDETAILS pmxcd, DWORD fdwDetails); +extern mixerSetControlDetails_type mixerSetControlDetails_orig; +typedef DWORD (WINAPI *mmGetCurrentTask_type)(void); +extern mmGetCurrentTask_type mmGetCurrentTask_orig; +typedef void (WINAPI *mmTaskBlock_type)(DWORD); +extern mmTaskBlock_type mmTaskBlock_orig; +typedef UINT (WINAPI *mmTaskCreate_type)(LPTASKCALLBACK, HANDLE*, DWORD_PTR); +extern mmTaskCreate_type mmTaskCreate_orig; +typedef BOOL (WINAPI *mmTaskSignal_type)(DWORD); +extern mmTaskSignal_type mmTaskSignal_orig; +typedef VOID (WINAPI *mmTaskYield_type)(VOID); +extern mmTaskYield_type mmTaskYield_orig; +typedef MMRESULT (WINAPI *timeGetSystemTime_type)( LPMMTIME pmmt, UINT cbmmt); +extern timeGetSystemTime_type timeGetSystemTime_orig; +typedef DWORD (WINAPI *timeGetTime_type)(void); +extern timeGetTime_type timeGetTime_orig; +typedef MMRESULT (WINAPI *timeSetEvent_type)( UINT uDelay, UINT uResolution, LPTIMECALLBACK fptc, DWORD_PTR dwUser, UINT fuEvent); +extern timeSetEvent_type timeSetEvent_orig; +typedef MMRESULT (WINAPI *timeKillEvent_type)( UINT uTimerID); +extern timeKillEvent_type timeKillEvent_orig; +typedef MMRESULT (WINAPI *timeGetDevCaps_type)( LPTIMECAPS ptc, UINT cbtc); +extern timeGetDevCaps_type timeGetDevCaps_orig; +typedef MMRESULT (WINAPI *timeBeginPeriod_type)( UINT uPeriod); +extern timeBeginPeriod_type timeBeginPeriod_orig; +typedef MMRESULT (WINAPI *timeEndPeriod_type)( UINT uPeriod); +extern timeEndPeriod_type timeEndPeriod_orig; +typedef UINT (WINAPI *joyGetNumDevs_type)(void); +extern joyGetNumDevs_type joyGetNumDevs_orig; +typedef MMRESULT (WINAPI *joyConfigChanged_type)(DWORD dwFlags); +extern joyConfigChanged_type joyConfigChanged_orig; +typedef MMRESULT (WINAPI *joyGetDevCapsA_type)( UINT_PTR uJoyID, LPJOYCAPSA pjc, UINT cbjc); +extern joyGetDevCapsA_type joyGetDevCapsA_orig; +typedef MMRESULT (WINAPI *joyGetDevCapsW_type)( UINT_PTR uJoyID, LPJOYCAPSW pjc, UINT cbjc); +extern joyGetDevCapsW_type joyGetDevCapsW_orig; +typedef MMRESULT (WINAPI *joyGetPos_type)( UINT uJoyID, LPJOYINFO pji); +extern joyGetPos_type joyGetPos_orig; +typedef MMRESULT (WINAPI *joyGetPosEx_type)( UINT uJoyID, LPJOYINFOEX pji); +extern joyGetPosEx_type joyGetPosEx_orig; +typedef MMRESULT (WINAPI *joyGetThreshold_type)( UINT uJoyID, LPUINT puThreshold); +extern joyGetThreshold_type joyGetThreshold_orig; +typedef MMRESULT (WINAPI *joyReleaseCapture_type)( UINT uJoyID); +extern joyReleaseCapture_type joyReleaseCapture_orig; +typedef MMRESULT (WINAPI *joySetCapture_type)( HWND hwnd, UINT uJoyID, UINT uPeriod, BOOL fChanged); +extern joySetCapture_type joySetCapture_orig; +typedef MMRESULT (WINAPI *joySetThreshold_type)( UINT uJoyID, UINT uThreshold); +extern joySetThreshold_type joySetThreshold_orig; +typedef BOOL (WINAPI *mciDriverNotify_type)(HWND hwndCallback, UINT uDeviceID, UINT uStatus); +extern mciDriverNotify_type mciDriverNotify_orig; +typedef UINT (WINAPI *mciDriverYield_type)(UINT uDeviceID); +extern mciDriverYield_type mciDriverYield_orig; +typedef FOURCC (WINAPI *mmioStringToFOURCCA_type)( LPCSTR sz, UINT uFlags); +extern mmioStringToFOURCCA_type mmioStringToFOURCCA_orig; +typedef FOURCC (WINAPI *mmioStringToFOURCCW_type)( LPCWSTR sz, UINT uFlags); +extern mmioStringToFOURCCW_type mmioStringToFOURCCW_orig; +typedef LPMMIOPROC (WINAPI *mmioInstallIOProcA_type)( FOURCC fccIOProc, LPMMIOPROC pIOProc, DWORD dwFlags); +extern mmioInstallIOProcA_type mmioInstallIOProcA_orig; +typedef LPMMIOPROC (WINAPI *mmioInstallIOProcW_type)( FOURCC fccIOProc, LPMMIOPROC pIOProc, DWORD dwFlags); +extern mmioInstallIOProcW_type mmioInstallIOProcW_orig; +typedef HMMIO (WINAPI *mmioOpenA_type)( LPSTR pszFileName, LPMMIOINFO pmmioinfo, DWORD fdwOpen); +extern mmioOpenA_type mmioOpenA_orig; +typedef HMMIO (WINAPI *mmioOpenW_type)( LPWSTR pszFileName, LPMMIOINFO pmmioinfo, DWORD fdwOpen); +extern mmioOpenW_type mmioOpenW_orig; +typedef MMRESULT (WINAPI *mmioRenameA_type)( LPCSTR pszFileName, LPCSTR pszNewFileName, LPCMMIOINFO pmmioinfo, DWORD fdwRename); +extern mmioRenameA_type mmioRenameA_orig; +typedef MMRESULT (WINAPI *mmioRenameW_type)( LPCWSTR pszFileName, LPCWSTR pszNewFileName, LPCMMIOINFO pmmioinfo, DWORD fdwRename); +extern mmioRenameW_type mmioRenameW_orig; +typedef MMRESULT (WINAPI *mmioClose_type)( HMMIO hmmio, UINT fuClose); +extern mmioClose_type mmioClose_orig; +typedef LONG (WINAPI *mmioRead_type)( HMMIO hmmio, HPSTR pch, LONG cch); +extern mmioRead_type mmioRead_orig; +typedef LONG (WINAPI *mmioWrite_type)( HMMIO hmmio, const char _huge* pch, LONG cch); +extern mmioWrite_type mmioWrite_orig; +typedef LONG (WINAPI *mmioSeek_type)( HMMIO hmmio, LONG lOffset, int iOrigin); +extern mmioSeek_type mmioSeek_orig; +typedef MMRESULT (WINAPI *mmioGetInfo_type)( HMMIO hmmio, LPMMIOINFO pmmioinfo, UINT fuInfo); +extern mmioGetInfo_type mmioGetInfo_orig; +typedef MMRESULT (WINAPI *mmioSetInfo_type)( HMMIO hmmio, LPCMMIOINFO pmmioinfo, UINT fuInfo); +extern mmioSetInfo_type mmioSetInfo_orig; +typedef MMRESULT (WINAPI *mmioSetBuffer_type)( HMMIO hmmio, LPSTR pchBuffer, LONG cchBuffer, UINT fuBuffer); +extern mmioSetBuffer_type mmioSetBuffer_orig; +typedef MMRESULT (WINAPI *mmioFlush_type)( HMMIO hmmio, UINT fuFlush); +extern mmioFlush_type mmioFlush_orig; +typedef MMRESULT (WINAPI *mmioAdvance_type)( HMMIO hmmio, LPMMIOINFO pmmioinfo, UINT fuAdvance); +extern mmioAdvance_type mmioAdvance_orig; +typedef LRESULT (WINAPI *mmioSendMessage_type)( HMMIO hmmio, UINT uMsg, LPARAM lParam1, LPARAM lParam2); +extern mmioSendMessage_type mmioSendMessage_orig; +typedef MMRESULT (WINAPI *mmioDescend_type)( HMMIO hmmio, LPMMCKINFO pmmcki, const MMCKINFO FAR* pmmckiParent, UINT fuDescend); +extern mmioDescend_type mmioDescend_orig; +typedef MMRESULT (WINAPI *mmioAscend_type)( HMMIO hmmio, LPMMCKINFO pmmcki, UINT fuAscend); +extern mmioAscend_type mmioAscend_orig; +typedef MMRESULT (WINAPI *mmioCreateChunk_type)(HMMIO hmmio, LPMMCKINFO pmmcki, UINT fuCreate); +extern mmioCreateChunk_type mmioCreateChunk_orig; +typedef MCIERROR (WINAPI *mciSendCommandA_type)( MCIDEVICEID mciId, UINT uMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2); +extern mciSendCommandA_type mciSendCommandA_orig; +typedef MCIERROR (WINAPI *mciSendCommandW_type)( MCIDEVICEID mciId, UINT uMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2); +extern mciSendCommandW_type mciSendCommandW_orig; +typedef MCIERROR (WINAPI *mciSendStringA_type)( LPCSTR lpstrCommand, LPSTR lpstrReturnString, UINT uReturnLength, HWND hwndCallback); +extern mciSendStringA_type mciSendStringA_orig; +typedef MCIERROR (WINAPI *mciSendStringW_type)( LPCWSTR lpstrCommand, LPWSTR lpstrReturnString, UINT uReturnLength, HWND hwndCallback); +extern mciSendStringW_type mciSendStringW_orig; +typedef MCIDEVICEID (WINAPI *mciGetDeviceIDA_type)( LPCSTR pszDevice); +extern mciGetDeviceIDA_type mciGetDeviceIDA_orig; +typedef MCIDEVICEID (WINAPI *mciGetDeviceIDW_type)( LPCWSTR pszDevice); +extern mciGetDeviceIDW_type mciGetDeviceIDW_orig; +typedef MCIDEVICEID (WINAPI *mciGetDeviceIDFromElementIDA_type)( DWORD dwElementID, LPCSTR lpstrType ); +extern mciGetDeviceIDFromElementIDA_type mciGetDeviceIDFromElementIDA_orig; +typedef MCIDEVICEID (WINAPI *mciGetDeviceIDFromElementIDW_type)( DWORD dwElementID, LPCWSTR lpstrType ); +extern mciGetDeviceIDFromElementIDW_type mciGetDeviceIDFromElementIDW_orig; +typedef DWORD_PTR (WINAPI *mciGetDriverData_type)(UINT uDeviceID); +extern mciGetDriverData_type mciGetDriverData_orig; +typedef BOOL (WINAPI *mciGetErrorStringA_type)( MCIERROR mcierr, LPSTR pszText, UINT cchText); +extern mciGetErrorStringA_type mciGetErrorStringA_orig; +typedef BOOL (WINAPI *mciGetErrorStringW_type)( MCIERROR mcierr, LPWSTR pszText, UINT cchText); +extern mciGetErrorStringW_type mciGetErrorStringW_orig; +typedef BOOL (WINAPI *mciSetDriverData_type)(UINT uDeviceID, DWORD_PTR dwData); +extern mciSetDriverData_type mciSetDriverData_orig; +typedef BOOL (WINAPI *mciSetYieldProc_type)( MCIDEVICEID mciId, YIELDPROC fpYieldProc, DWORD dwYieldData); +extern mciSetYieldProc_type mciSetYieldProc_orig; +typedef BOOL (WINAPI *mciFreeCommandResource_type)(UINT uTable); +extern mciFreeCommandResource_type mciFreeCommandResource_orig; +typedef HTASK (WINAPI *mciGetCreatorTask_type)( MCIDEVICEID mciId); +extern mciGetCreatorTask_type mciGetCreatorTask_orig; +typedef YIELDPROC (WINAPI *mciGetYieldProc_type)( MCIDEVICEID mciId, LPDWORD pdwYieldData); +extern mciGetYieldProc_type mciGetYieldProc_orig; +typedef UINT (WINAPI *mciLoadCommandResource_type)(HINSTANCE hInstance, LPCWSTR lpResName, UINT uType); +extern mciLoadCommandResource_type mciLoadCommandResource_orig; +typedef BOOL (WINAPI *mciExecute_type)(LPCSTR pszCommand); +extern mciExecute_type mciExecute_orig; diff --git a/indra/media_plugins/winmmshim/winmm.def b/indra/media_plugins/winmmshim/winmm.def new file mode 100644 index 0000000000..c55a2845f8 --- /dev/null +++ b/indra/media_plugins/winmmshim/winmm.def @@ -0,0 +1,218 @@ +; +; winmm.def +; +; Exports for WINMM DLL +; + +LIBRARY WINMM +EXPORTS +CloseDriver +DefDriverProc +DriverCallback +DrvGetModuleHandle +GetDriverModuleHandle +;MigrateAllDrivers +;MigrateSoundEvents +;NotifyCallbackData +OpenDriver +;PlaySound +PlaySoundA +PlaySoundW +SendDriverMessage +;WOW32DriverCallback +;WOW32ResolveMultiMediaHandle +;WOWAppExit +;WinmmLogoff +;WinmmLogon +;aux32Message +auxGetDevCapsA +auxGetDevCapsW +auxGetNumDevs +auxGetVolume +auxOutMessage +auxSetVolume +;gfxAddGfx +;gfxBatchChange +;gfxCreateGfxFactoriesList +;gfxCreateZoneFactoriesList +;gfxDestroyDeviceInterfaceList +;gfxEnumerateGfxs +;gfxLogoff +;gfxLogon +;gfxModifyGfx +;gfxOpenGfx +;gfxRemoveGfx +;joy32Message +joyConfigChanged +joyGetDevCapsA +joyGetDevCapsW +joyGetNumDevs +joyGetPos +joyGetPosEx +joyGetThreshold +joyReleaseCapture +joySetCapture +joySetThreshold +;mci32Message +mciDriverNotify +mciDriverYield +mciExecute +mciFreeCommandResource +mciGetCreatorTask +mciGetDeviceIDA +mciGetDeviceIDFromElementIDA +mciGetDeviceIDFromElementIDW +mciGetDeviceIDW +mciGetDriverData +mciGetErrorStringA +mciGetErrorStringW +mciGetYieldProc +mciLoadCommandResource +mciSendCommandA +mciSendCommandW +mciSendStringA +mciSendStringW +mciSetDriverData +mciSetYieldProc +;mid32Message +midiConnect +midiDisconnect +midiInAddBuffer +midiInClose +midiInGetDevCapsA +midiInGetDevCapsW +midiInGetErrorTextA +midiInGetErrorTextW +midiInGetID +midiInGetNumDevs +midiInMessage +midiInOpen +midiInPrepareHeader +midiInReset +midiInStart +midiInStop +midiInUnprepareHeader +midiOutCacheDrumPatches +midiOutCachePatches +midiOutClose +midiOutGetDevCapsA +midiOutGetDevCapsW +midiOutGetErrorTextA +midiOutGetErrorTextW +midiOutGetID +midiOutGetNumDevs +midiOutGetVolume +midiOutLongMsg +midiOutMessage +midiOutOpen +midiOutPrepareHeader +midiOutReset +midiOutSetVolume +midiOutShortMsg +midiOutUnprepareHeader +midiStreamClose +midiStreamOpen +midiStreamOut +midiStreamPause +midiStreamPosition +midiStreamProperty +midiStreamRestart +midiStreamStop +mixerClose +mixerGetControlDetailsA +mixerGetControlDetailsW +mixerGetDevCapsA +mixerGetDevCapsW +mixerGetID +mixerGetLineControlsA +mixerGetLineControlsW +mixerGetLineInfoA +mixerGetLineInfoW +mixerGetNumDevs +mixerMessage +mixerOpen +mixerSetControlDetails +;mmDrvInstall +mmGetCurrentTask +mmTaskBlock +mmTaskCreate +mmTaskSignal +mmTaskYield +mmioAdvance +mmioAscend +mmioClose +mmioCreateChunk +mmioDescend +mmioFlush +mmioGetInfo +mmioInstallIOProcA +mmioInstallIOProcW +mmioOpenA +mmioOpenW +mmioRead +mmioRenameA +mmioRenameW +mmioSeek +mmioSendMessage +mmioSetBuffer +mmioSetInfo +mmioStringToFOURCCA +mmioStringToFOURCCW +mmioWrite +mmsystemGetVersion +;mod32Message +;mxd32Message +sndPlaySoundA +sndPlaySoundW +;tid32Message +timeBeginPeriod +timeEndPeriod +timeGetDevCaps +timeGetSystemTime +timeGetTime +timeKillEvent +timeSetEvent +waveInAddBuffer +waveInClose +waveInGetDevCapsA +waveInGetDevCapsW +waveInGetErrorTextA +waveInGetErrorTextW +waveInGetID +waveInGetNumDevs +waveInGetPosition +waveInMessage +waveInOpen +waveInPrepareHeader +waveInReset +waveInStart +waveInStop +waveInUnprepareHeader +waveOutBreakLoop +waveOutClose +waveOutGetDevCapsA +waveOutGetDevCapsW +waveOutGetErrorTextA +waveOutGetErrorTextW +waveOutGetID +waveOutGetNumDevs +waveOutGetPitch +waveOutGetPlaybackRate +waveOutGetPosition +waveOutGetVolume +waveOutMessage +waveOutOpen +waveOutPause +waveOutPrepareHeader +waveOutReset +waveOutRestart +waveOutSetPitch +waveOutSetPlaybackRate +waveOutSetVolume +waveOutUnprepareHeader +waveOutWrite +;wid32Message +;winmmSetDebugLevel +;wod32Message +setPluginVolume +setPluginMute
\ No newline at end of file diff --git a/indra/media_plugins/winmmshim/winmm_shim.cpp b/indra/media_plugins/winmmshim/winmm_shim.cpp new file mode 100644 index 0000000000..6fbf517d7c --- /dev/null +++ b/indra/media_plugins/winmmshim/winmm_shim.cpp @@ -0,0 +1,194 @@ +/** + * @file winmmshim.cpp + * @brief controls volume level of process by intercepting calls to winmm.dll + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ +#include "forwarding_api.h" +#include <xmmintrin.h> +#include <map> +#include <math.h> + +using std::wstring; + +static float sVolumeLevel = 1.f; +static bool sMute = false; + +BOOL APIENTRY DllMain( HMODULE hModule, + DWORD ul_reason_for_call, + LPVOID lpReserved + ) +{ + static bool initialized = false; + // do this only once + if (!initialized) + { // bind to original winmm.dll + TCHAR system_path[MAX_PATH]; + TCHAR dll_path[MAX_PATH]; + ::GetSystemDirectory(system_path, MAX_PATH); + + // grab winmm.dll from system path, where it should live + wsprintf(dll_path, "%s\\winmm.dll", system_path); + HMODULE winmm_handle = ::LoadLibrary(dll_path); + + if (winmm_handle != NULL) + { // we have a dll, let's get out pointers! + initialized = true; + init_function_pointers(winmm_handle); + return true; + } + + // failed to initialize real winmm.dll + return false; + } + return true; +} + + +extern "C" +{ + // tracks the requested format for a given waveout buffer + struct WaveOutFormat + { + WaveOutFormat(int bits_per_sample) + : mBitsPerSample(bits_per_sample) + {} + int mBitsPerSample; + }; + typedef std::map<HWAVEOUT, WaveOutFormat*> wave_out_map_t; + static wave_out_map_t sWaveOuts; + + MMRESULT WINAPI waveOutOpen( LPHWAVEOUT phwo, UINT uDeviceID, LPCWAVEFORMATEX pwfx, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen) + { + if (pwfx->wFormatTag != WAVE_FORMAT_PCM + || (pwfx->wBitsPerSample != 8 && pwfx->wBitsPerSample != 16)) + { // uncompressed 8 and 16 bit sound are the only types we support + return WAVERR_BADFORMAT; + } + + MMRESULT result = waveOutOpen_orig(phwo, uDeviceID, pwfx, dwCallback, dwInstance, fdwOpen); + if (result == MMSYSERR_NOERROR + && ((fdwOpen & WAVE_FORMAT_QUERY) == 0)) // not just querying for format support + { // remember the requested bits per sample, and associate with the given handle + WaveOutFormat* wave_outp = new WaveOutFormat(pwfx->wBitsPerSample); + sWaveOuts.insert(std::make_pair(*phwo, wave_outp)); + } + return result; + } + + MMRESULT WINAPI waveOutClose( HWAVEOUT hwo) + { + wave_out_map_t::iterator found_it = sWaveOuts.find(hwo); + if (found_it != sWaveOuts.end()) + { // forget what we know about this handle + delete found_it->second; + sWaveOuts.erase(found_it); + } + return waveOutClose_orig( hwo); + } + + MMRESULT WINAPI waveOutWrite( HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh) + { + MMRESULT result = MMSYSERR_NOERROR; + + if (sMute) + { // zero out the audio buffer when muted + memset(pwh->lpData, 0, pwh->dwBufferLength); + } + else if (sVolumeLevel != 1.f) + { // need to apply volume level + wave_out_map_t::iterator found_it = sWaveOuts.find(hwo); + if (found_it != sWaveOuts.end()) + { + WaveOutFormat* formatp = found_it->second; + switch (formatp->mBitsPerSample){ + case 8: + { + char volume = (char)(sVolumeLevel * 127.f); + for (unsigned int i = 0; i < pwh->dwBufferLength; i++) + { + // unsigned multiply doesn't use most significant bit, so shift by 7 bits + // to get resulting value back into 8 bits + pwh->lpData[i] = (pwh->lpData[i] * volume) >> 7; + } + break; + } + case 16: + { + short volume_16 = (short)(sVolumeLevel * 32767.f); + + // copy volume level 4 times into 64 bit MMX register + __m64 volume_64 = _mm_set_pi16(volume_16, volume_16, volume_16, volume_16); + __m64* sample_64; + __m64* last_sample_64 = (__m64*)(pwh->lpData + pwh->dwBufferLength - sizeof(__m64)); + // for everything that can be addressed in 64 bit multiples... + for (sample_64 = (__m64*)pwh->lpData; + sample_64 <= last_sample_64; + ++sample_64) + { + //...multiply the samples by the volume... + __m64 scaled_sample = _mm_mulhi_pi16(*sample_64, volume_64); + // ...and shift left 1 bit since an unsigned multiple loses the most significant bit + // 0x7FFF * 0x7FFF = 0x3fff0001 + // 0x3fff0001 << 1 = 0x7ffe0002 + // notice that the LSB is always 0...should consider dithering + *sample_64 = _mm_slli_pi16(scaled_sample, 1); + } + + // the captain has turned off the MMX sign, you are now free to use floating point registers + _mm_empty(); + + // finish remaining samples that didn't fit into 64 bit register + for (short* sample_16 = (short*)sample_64; + sample_16 < (short*)(pwh->lpData + pwh->dwBufferLength); + ++sample_16) + { + *sample_16 = (*sample_16 * volume_16) >> 15; + } + + break; + } + default: + // don't do anything + break; + } + } + } + return waveOutWrite_orig( hwo, pwh, cbwh); + } + + void WINAPI setPluginVolume(float volume) + { + sVolumeLevel = volume; + } + + void WINAPI setPluginMute(bool mute) + { + sMute = mute; + } +} diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index cd7c002096..24811db3cb 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -7,6 +7,7 @@ include(Boost) include(BuildVersion) include(DBusGlib) include(DirectX) +include(OpenSSL) include(DragDrop) include(ELFIO) include(FMOD) @@ -66,6 +67,7 @@ include_directories( set(viewer_SOURCE_FILES llagent.cpp llagentaccess.cpp + llagentcamera.cpp llagentdata.cpp llagentlanguage.cpp llagentlistener.cpp @@ -73,6 +75,7 @@ set(viewer_SOURCE_FILES llagentpilot.cpp llagentui.cpp llagentwearables.cpp + llagentwearablesfetch.cpp llanimstatelabels.cpp llappearancemgr.cpp llappviewer.cpp @@ -88,6 +91,7 @@ set(viewer_SOURCE_FILES llbottomtray.cpp llbox.cpp llbreadcrumbview.cpp + llbuycurrencyhtml.cpp llcallbacklist.cpp llcallfloater.cpp llcallingcard.cpp @@ -102,6 +106,7 @@ set(viewer_SOURCE_FILES llclassifiedinfo.cpp llclassifiedstatsresponder.cpp llcloud.cpp + llcofwearables.cpp llcolorswatch.cpp llcommanddispatcherlistener.cpp llcommandhandler.cpp @@ -140,10 +145,10 @@ set(viewer_SOURCE_FILES llfavoritesbar.cpp llfeaturemanager.cpp llfilepicker.cpp + llfilteredwearablelist.cpp llfirstuse.cpp llflexibleobject.cpp llfloaterabout.cpp - llfloateractivespeakers.cpp llfloateranimpreview.cpp llfloaterauction.cpp llfloateravatarpicker.cpp @@ -155,12 +160,13 @@ set(viewer_SOURCE_FILES llfloaterbuy.cpp llfloaterbuycontents.cpp llfloaterbuycurrency.cpp + llfloaterbuycurrencyhtml.cpp llfloaterbuyland.cpp llfloatercamera.cpp llfloatercolorpicker.cpp - llfloatercustomize.cpp llfloaterdaycycle.cpp llfloaterenvsettings.cpp + llfloaterevent.cpp llfloaterfonttest.cpp llfloatergesture.cpp llfloatergodtools.cpp @@ -182,7 +188,6 @@ set(viewer_SOURCE_FILES llfloatermediasettings.cpp llfloatermemleak.cpp llfloaternamedesc.cpp - llfloaternearbymedia.cpp llfloaternotificationsconsole.cpp llfloateropenobject.cpp llfloaterparcel.cpp @@ -210,6 +215,7 @@ set(viewer_SOURCE_FILES llfloaterurldisplay.cpp llfloaterurlentry.cpp llfloatervoicedevicesettings.cpp + llfloatervoiceeffect.cpp llfloaterwater.cpp llfloaterwhitelistentry.cpp llfloaterwindlight.cpp @@ -220,6 +226,7 @@ set(viewer_SOURCE_FILES llfollowcam.cpp llfriendcard.cpp llgesturemgr.cpp + llgiveinventory.cpp llglsandbox.cpp llgroupactions.cpp llgroupiconctrl.cpp @@ -251,13 +258,17 @@ set(viewer_SOURCE_FILES llinventoryclipboard.cpp llinventoryfilter.cpp llinventoryfunctions.cpp + llinventoryicon.cpp + llinventoryitemslist.cpp llinventorymodel.cpp + llinventorymodelbackgroundfetch.cpp llinventoryobserver.cpp llinventorypanel.cpp lljoystickbutton.cpp lllandmarkactions.cpp lllandmarklist.cpp lllistbrowser.cpp + lllistcontextmenu.cpp lllistview.cpp lllocaltextureobject.cpp lllocationhistory.cpp @@ -265,6 +276,7 @@ set(viewer_SOURCE_FILES lllogchat.cpp llloginhandler.cpp lllogininstance.cpp + llmachineid.cpp llmanip.cpp llmaniprotate.cpp llmanipscale.cpp @@ -292,7 +304,10 @@ set(viewer_SOURCE_FILES llnotificationmanager.cpp llnotificationofferhandler.cpp llnotificationscripthandler.cpp + llnotificationstorage.cpp llnotificationtiphandler.cpp + lloutfitslist.cpp + lloutfitobserver.cpp lloutputmonitorctrl.cpp llpanelavatar.cpp llpanelavatartag.cpp @@ -300,8 +315,8 @@ set(viewer_SOURCE_FILES llpanelclassified.cpp llpanelcontents.cpp llpaneleditwearable.cpp - llpanelevent.cpp llpanelface.cpp + llpanelgenerictip.cpp llpanelgroup.cpp llpanelgroupgeneral.cpp llpanelgroupinvite.cpp @@ -317,14 +332,16 @@ set(viewer_SOURCE_FILES llpanellandmedia.cpp llpanellogin.cpp llpanelloginlistener.cpp - llpanellookinfo.cpp llpanelmaininventory.cpp llpanelmediasettingsgeneral.cpp llpanelmediasettingspermissions.cpp llpanelmediasettingssecurity.cpp llpanelme.cpp + llpanelnearbymedia.cpp llpanelobject.cpp llpanelobjectinventory.cpp + llpanelonlinestatus.cpp + llpaneloutfitedit.cpp llpaneloutfitsinventory.cpp llpanelpeople.cpp llpanelpeoplemenus.cpp @@ -340,6 +357,9 @@ set(viewer_SOURCE_FILES llpanelprofile.cpp llpanelprofileview.cpp llpanelteleporthistory.cpp + llpaneltiptoast.cpp + llpanelvoiceeffect.cpp + llpaneltopinfobar.cpp llpanelvolume.cpp llpanelvolumepulldown.cpp llparcelselection.cpp @@ -347,6 +367,7 @@ set(viewer_SOURCE_FILES llpatchvertexarray.cpp llplacesinventorybridge.cpp llplacesinventorypanel.cpp + llpopupview.cpp llpolymesh.cpp llpolymorph.cpp llpreview.cpp @@ -362,11 +383,14 @@ set(viewer_SOURCE_FILES llregionposition.cpp llremoteparcelrequest.cpp llsavedsettingsglue.cpp + llsaveoutfitcombobtn.cpp llscreenchannel.cpp llscriptfloater.cpp llscrollingpanelparam.cpp llsearchcombobox.cpp llsearchhistory.cpp + llsecapi.cpp + llsechandler_basic.cpp llselectmgr.cpp llsidepanelappearance.cpp llsidepanelinventory.cpp @@ -406,7 +430,6 @@ set(viewer_SOURCE_FILES lltexturestats.cpp lltexturestatsuploader.cpp lltextureview.cpp - lltextutil.cpp lltoast.cpp lltoastalertpanel.cpp lltoastgroupnotifypanel.cpp @@ -441,13 +464,13 @@ set(viewer_SOURCE_FILES llurldispatcherlistener.cpp llurlhistory.cpp llurllineeditorctrl.cpp - llurlsimstring.cpp llurlwhitelist.cpp llvectorperfoptions.cpp llversioninfo.cpp llviewchildren.cpp llviewerassetstorage.cpp llviewerassettype.cpp + llviewerattachmenu.cpp llvieweraudio.cpp llviewercamera.cpp llviewerchat.cpp @@ -509,6 +532,7 @@ set(viewer_SOURCE_FILES llvoicechannel.cpp llvoiceclient.cpp llvoicevisualizer.cpp + llvoicevivox.cpp llvoinventorylistener.cpp llvopartgroup.cpp llvosky.cpp @@ -522,8 +546,9 @@ set(viewer_SOURCE_FILES llwaterparammanager.cpp llwaterparamset.cpp llwearable.cpp - llwearabledictionary.cpp + llwearableitemslist.cpp llwearablelist.cpp + llwearabletype.cpp llweb.cpp llwind.cpp llwlanimator.cpp @@ -563,6 +588,7 @@ set(viewer_HEADER_FILES ViewerInstall.cmake llagent.h llagentaccess.h + llagentcamera.h llagentdata.h llagentlanguage.h llagentlistener.h @@ -570,6 +596,7 @@ set(viewer_HEADER_FILES llagentpilot.h llagentui.h llagentwearables.h + llagentwearablesfetch.h llanimstatelabels.h llappearance.h llappearancemgr.h @@ -586,6 +613,7 @@ set(viewer_HEADER_FILES llbottomtray.h llbox.h llbreadcrumbview.h + llbuycurrencyhtml.h llcallbacklist.h llcallfloater.h llcallingcard.h @@ -601,6 +629,7 @@ set(viewer_HEADER_FILES llclassifiedinfo.h llclassifiedstatsresponder.h llcloud.h + llcofwearables.h llcolorswatch.h llcommanddispatcherlistener.h llcommandhandler.h @@ -640,10 +669,10 @@ set(viewer_HEADER_FILES llfavoritesbar.h llfeaturemanager.h llfilepicker.h + llfilteredwearablelist.h llfirstuse.h llflexibleobject.h llfloaterabout.h - llfloateractivespeakers.h llfloateranimpreview.h llfloaterauction.h llfloateravatarpicker.h @@ -655,12 +684,13 @@ set(viewer_HEADER_FILES llfloaterbuy.h llfloaterbuycontents.h llfloaterbuycurrency.h + llfloaterbuycurrencyhtml.h llfloaterbuyland.h llfloatercamera.h llfloatercolorpicker.h - llfloatercustomize.h llfloaterdaycycle.h llfloaterenvsettings.h + llfloaterevent.h llfloaterfonttest.h llfloatergesture.h llfloatergodtools.h @@ -682,7 +712,6 @@ set(viewer_HEADER_FILES llfloatermediasettings.h llfloatermemleak.h llfloaternamedesc.h - llfloaternearbymedia.h llfloaternotificationsconsole.h llfloateropenobject.h llfloaterparcel.h @@ -710,6 +739,7 @@ set(viewer_HEADER_FILES llfloaterurldisplay.h llfloaterurlentry.h llfloatervoicedevicesettings.h + llfloatervoiceeffect.h llfloaterwater.h llfloaterwhitelistentry.h llfloaterwindlight.h @@ -721,6 +751,7 @@ set(viewer_HEADER_FILES llfollowcam.h llfriendcard.h llgesturemgr.h + llgiveinventory.h llgroupactions.h llgroupiconctrl.h llgrouplist.h @@ -750,7 +781,10 @@ set(viewer_HEADER_FILES llinventoryclipboard.h llinventoryfilter.h llinventoryfunctions.h + llinventoryicon.h + llinventoryitemslist.h llinventorymodel.h + llinventorymodelbackgroundfetch.h llinventoryobserver.h llinventorypanel.h lljoystickbutton.h @@ -758,6 +792,7 @@ set(viewer_HEADER_FILES lllandmarklist.h lllightconstants.h lllistbrowser.h + lllistcontextmenu.h lllistview.h lllocaltextureobject.h lllocationhistory.h @@ -765,6 +800,7 @@ set(viewer_HEADER_FILES lllogchat.h llloginhandler.h lllogininstance.h + llmachineid.h llmanip.h llmaniprotate.h llmanipscale.h @@ -788,6 +824,9 @@ set(viewer_HEADER_FILES llnetmap.h llnotificationhandler.h llnotificationmanager.h + llnotificationstorage.h + lloutfitslist.h + lloutfitobserver.h lloutputmonitorctrl.h llpanelavatar.h llpanelavatartag.h @@ -795,8 +834,8 @@ set(viewer_HEADER_FILES llpanelclassified.h llpanelcontents.h llpaneleditwearable.h - llpanelevent.h llpanelface.h + llpanelgenerictip.h llpanelgroup.h llpanelgroupgeneral.h llpanelgroupinvite.h @@ -812,14 +851,16 @@ set(viewer_HEADER_FILES llpanellandmedia.h llpanellogin.h llpanelloginlistener.h - llpanellookinfo.h llpanelmaininventory.h llpanelmediasettingsgeneral.h llpanelmediasettingspermissions.h llpanelmediasettingssecurity.h llpanelme.h + llpanelnearbymedia.h llpanelobject.h llpanelobjectinventory.h + llpanelonlinestatus.h + llpaneloutfitedit.h llpaneloutfitsinventory.h llpanelpeople.h llpanelpeoplemenus.h @@ -835,6 +876,9 @@ set(viewer_HEADER_FILES llpanelprofile.h llpanelprofileview.h llpanelteleporthistory.h + llpaneltiptoast.h + llpanelvoiceeffect.h + llpaneltopinfobar.h llpanelvolume.h llpanelvolumepulldown.h llparcelselection.h @@ -844,6 +888,7 @@ set(viewer_HEADER_FILES llplacesinventorypanel.h llpolymesh.h llpolymorph.h + llpopupview.h llpreview.h llpreviewanim.h llpreviewgesture.h @@ -859,11 +904,14 @@ set(viewer_HEADER_FILES llresourcedata.h llrootview.h llsavedsettingsglue.h + llsaveoutfitcombobtn.h llscreenchannel.h llscriptfloater.h llscrollingpanelparam.h llsearchcombobox.h llsearchhistory.h + llsecapi.h + llsechandler_basic.h llselectmgr.h llsidepanelappearance.h llsidepanelinventory.h @@ -904,7 +952,6 @@ set(viewer_HEADER_FILES lltexturestats.h lltexturestatsuploader.h lltextureview.h - lltextutil.h lltoast.h lltoastalertpanel.h lltoastgroupnotifypanel.h @@ -940,13 +987,13 @@ set(viewer_HEADER_FILES llurldispatcherlistener.h llurlhistory.h llurllineeditorctrl.h - llurlsimstring.h llurlwhitelist.h llvectorperfoptions.h llversioninfo.h llviewchildren.h llviewerassetstorage.h llviewerassettype.h + llviewerattachmenu.h llvieweraudio.h llviewercamera.h llviewerchat.h @@ -1005,6 +1052,7 @@ set(viewer_HEADER_FILES llvoicechannel.h llvoiceclient.h llvoicevisualizer.h + llvoicevivox.h llvoinventorylistener.h llvopartgroup.h llvosky.h @@ -1019,11 +1067,11 @@ set(viewer_HEADER_FILES llwaterparammanager.h llwaterparamset.h llwearable.h - llwearabledictionary.h + llwearableitemslist.h llwearablelist.h + llwearabletype.h llweb.h llwind.h - llwindebug.h llwlanimator.h llwldaycycle.h llwlparammanager.h @@ -1097,12 +1145,10 @@ endif (LINUX) if (WINDOWS) list(APPEND viewer_SOURCE_FILES llappviewerwin32.cpp - llwindebug.cpp ) list(APPEND viewer_HEADER_FILES llappviewerwin32.h - llwindebug.h ) # precompiled header configuration @@ -1154,6 +1200,9 @@ if (WINDOWS) res/toolpickobject2.cur res/toolpickobject3.cur res/toolpipette.cur + res/toolbuy.cur + res/toolopen.cur + res/toolsit.cur ) set_source_files_properties(${viewer_RESOURCE_FILES} @@ -1377,7 +1426,7 @@ if (WINDOWS) # If adding a file to viewer_manifest.py in the WindowsManifest.construct() method, be sure to add the dependency # here. - # *NOTE:Mani - This is a crappy hack to have important dependecies for the viewer_manifest copy action + # *NOTE:Mani - This is a crappy hack to have important dependencies for the viewer_manifest copy action # be met. I'm looking forward to a source-code split-up project next year that will address this kind of thing. # In the meantime, if you have any ideas on how to easily maintain one list, either here or in viewer_manifest.py # and have the build deps get tracked *please* tell me about it. @@ -1395,10 +1444,10 @@ if (WINDOWS) ${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/libtcmalloc_minimal.dll ${SHARED_LIB_STAGING_DIR}/Debug/libtcmalloc_minimal-debug.dll ) - endif(USE_GOOGLE_PERFTOOLS) - + endif(USE_GOOGLE_PERFTOOLS) + - set(COPY_INPUT_DEPENDECIES + set(COPY_INPUT_DEPENDENCIES # The following commented dependencies are determined at variably at build time. Can't do this here. #${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/libtcmalloc_minimal.dll => None ... Skipping libtcmalloc_minimal.dll ${CMAKE_SOURCE_DIR}/../etc/message.xml @@ -1432,8 +1481,6 @@ if (WINDOWS) ${CMAKE_CURRENT_SOURCE_DIR}/featuretable.txt ${CMAKE_CURRENT_SOURCE_DIR}/dbghelp.dll ${CMAKE_CURRENT_SOURCE_DIR}/fmod.dll - ${CMAKE_BINARY_DIR}/media_plugins/quicktime/${CMAKE_CFG_INTDIR}/media_plugin_quicktime.dll - ${CMAKE_BINARY_DIR}/media_plugins/quicktime/${CMAKE_CFG_INTDIR}/media_plugin_webkit.dll ${ARCH_PREBUILT_DIRS_RELEASE}/libeay32.dll ${ARCH_PREBUILT_DIRS_RELEASE}/qtcore4.dll ${ARCH_PREBUILT_DIRS_RELEASE}/qtgui4.dll @@ -1473,6 +1520,7 @@ if (WINDOWS) SLPlugin media_plugin_quicktime media_plugin_webkit + winmm_shim windows-crash-logger windows-updater ) @@ -1494,7 +1542,7 @@ if (WINDOWS) DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py stage_third_party_libs - ${COPY_INPUT_DEPENDECIES} + ${COPY_INPUT_DEPENDENCIES} COMMENT "Performing viewer_manifest copy" ) @@ -1513,8 +1561,6 @@ if (WINDOWS) add_dependencies(${VIEWER_BINARY_NAME} SLPlugin - media_plugin_quicktime - media_plugin_webkit windows-updater windows-crash-logger ) @@ -1564,7 +1610,10 @@ if (WINDOWS) --login_channel=${VIEWER_LOGIN_CHANNEL} --source=${CMAKE_CURRENT_SOURCE_DIR} --touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/touched.bat - DEPENDS ${VIEWER_BINARY_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py + DEPENDS + ${VIEWER_BINARY_NAME} + ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py + ${COPY_INPUT_DEPENDENCIES} ) add_custom_target(package ALL DEPENDS @@ -1613,6 +1662,8 @@ target_link_libraries(${VIEWER_BINARY_NAME} ${WINDOWS_LIBRARIES} ${XMLRPCEPI_LIBRARIES} ${ELFIO_LIBRARIES} + ${OPENSSL_LIBRARIES} + ${CRYPTO_LIBRARIES} ${LLLOGIN_LIBRARIES} ${GOOGLE_PERFTOOLS_LIBRARIES} ) @@ -1624,13 +1675,6 @@ set(ARTWORK_DIR ${CMAKE_CURRENT_SOURCE_DIR} CACHE PATH if (LINUX) - add_custom_command( - OUTPUT secondlife-stripped - COMMAND strip - ARGS --strip-debug -o secondlife-stripped ${VIEWER_BINARY_NAME} - DEPENDS ${VIEWER_BINARY_NAME} - ) - set(product SecondLife-${ARCH}-${viewer_VERSION}) add_custom_command( @@ -1650,17 +1694,40 @@ if (LINUX) --login_channel=${VIEWER_LOGIN_CHANNEL} --source=${CMAKE_CURRENT_SOURCE_DIR} --touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.touched - DEPENDS secondlife-stripped ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py + DEPENDS ${VIEWER_BINARY_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py ) add_dependencies(${VIEWER_BINARY_NAME} SLPlugin media_plugin_gstreamer010 media_plugin_webkit) if (NOT INSTALL) add_custom_target(package ALL DEPENDS ${product}.tar.bz2) - add_dependencies(package linux-crash-logger-strip-target) - add_dependencies(package linux-updater-strip-target) + add_dependencies(package linux-crash-logger-target) + add_dependencies(package linux-updater-target) check_message_template(package) endif (NOT INSTALL) + + add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.copy_touched + COMMAND ${PYTHON_EXECUTABLE} + ARGS + ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py + --arch=${ARCH} + --actions=copy + --artwork=${ARTWORK_DIR} + --build=${CMAKE_CURRENT_BINARY_DIR} + --buildtype=${CMAKE_BUILD_TYPE} + --configuration=${CMAKE_CFG_INTDIR} + --dest=${CMAKE_CURRENT_BINARY_DIR}/packaged + --grid=${GRID} + --source=${CMAKE_CURRENT_SOURCE_DIR} + DEPENDS + ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py + ${COPY_INPUT_DEPENDENCIES} + COMMENT "Performing viewer_manifest copy" + ) + + add_custom_target(copy_l_viewer_manifest ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.copy_touched) + add_dependencies(copy_l_viewer_manifest "${VIEWER_BINARY_NAME}" linux-crash-logger-target linux-updater-target) endif (LINUX) if (DARWIN) @@ -1695,52 +1762,30 @@ if (DARWIN) DEPENDS ${VIEWER_BINARY_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py ) - add_dependencies(${VIEWER_BINARY_NAME} SLPlugin media_plugin_quicktime media_plugin_webkit) + add_dependencies(${VIEWER_BINARY_NAME} SLPlugin media_plugin_quicktime media_plugin_webkit mac-updater mac-crash-logger) if (PACKAGE) add_custom_target(package ALL DEPENDS ${VIEWER_BINARY_NAME}) check_message_template(package) - add_dependencies(package mac-updater mac-crash-logger) add_custom_command( TARGET package POST_BUILD COMMAND ${PYTHON_EXECUTABLE} ARGS ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py - --grid=${GRID} - --buildtype=${CMAKE_BUILD_TYPE} - --configuration=${CMAKE_CFG_INTDIR} - --channel=${VIEWER_CHANNEL} - --login_channel=${VIEWER_LOGIN_CHANNEL} - --source=${CMAKE_CURRENT_SOURCE_DIR} --artwork=${ARTWORK_DIR} --build=${CMAKE_CURRENT_BINARY_DIR} - --dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${product}.app - --touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.touched - DEPENDS - ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py - ) - - - add_custom_command( - TARGET package POST_BUILD - COMMAND ${PYTHON_EXECUTABLE} - ARGS - ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py - --grid=${GRID} --buildtype=${CMAKE_BUILD_TYPE} - --configuration=${CMAKE_CFG_INTDIR} --channel=${VIEWER_CHANNEL} + --configuration=${CMAKE_CFG_INTDIR} + --dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${product}.app + --grid=${GRID} --login_channel=${VIEWER_LOGIN_CHANNEL} --source=${CMAKE_CURRENT_SOURCE_DIR} - --artwork=${ARTWORK_DIR} - --build=${CMAKE_CURRENT_BINARY_DIR} - --dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${product}.app --touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.touched DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py ) - endif (PACKAGE) endif (DARWIN) @@ -1748,6 +1793,45 @@ if (INSTALL) include(${CMAKE_CURRENT_SOURCE_DIR}/ViewerInstall.cmake) endif (INSTALL) +if (PACKAGE) + if (WINDOWS) + set(VIEWER_DIST_DIR "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}") + set(VIEWER_SYMBOL_FILE "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/secondlife-symbols-windows.tar.bz2") + set(VIEWER_EXE_GLOBS "${VIEWER_BINARY_NAME}${CMAKE_EXECUTABLE_SUFFIX} slplugin.exe") + set(VIEWER_LIB_GLOB "*${CMAKE_SHARED_MODULE_SUFFIX}") + set(VIEWER_COPY_MANIFEST copy_w_viewer_manifest) + endif (WINDOWS) + if (DARWIN) + set(VIEWER_DIST_DIR "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${product}.app") + set(VIEWER_SYMBOL_FILE "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/secondlife-symbols-darwin.tar.bz2") + set(VIEWER_EXE_GLOBS "'Second Life' SLPlugin") + set(VIEWER_LIB_GLOB "*.dylib") + endif (DARWIN) + if (LINUX) + set(VIEWER_DIST_DIR "${CMAKE_CURRENT_BINARY_DIR}/packaged") + set(VIEWER_SYMBOL_FILE "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/secondlife-symbols-linux.tar.bz2") + set(VIEWER_EXE_GLOBS "do-not-directly-run-secondlife-bin SLPlugin") + set(VIEWER_LIB_GLOB "*${CMAKE_SHARED_MODULE_SUFFIX}*") + set(VIEWER_COPY_MANIFEST copy_l_viewer_manifest) + endif (LINUX) + + add_custom_command(OUTPUT "${VIEWER_SYMBOL_FILE}" + COMMAND "${PYTHON_EXECUTABLE}" + ARGS + "${CMAKE_CURRENT_SOURCE_DIR}/generate_breakpad_symbols.py" + "${VIEWER_DIST_DIR}" + "${VIEWER_EXE_GLOBS}" + "${VIEWER_LIB_GLOB}" + "${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/bin/dump_syms" + "${VIEWER_SYMBOL_FILE}" + DEPENDS generate_breakpad_symbols.py + VERBATIM + ) + add_custom_target(generate_breakpad_symbols ALL DEPENDS "${VIEWER_SYMBOL_FILE}") + add_dependencies(generate_breakpad_symbols "${VIEWER_BINARY_NAME}" "${VIEWER_COPY_MANIFEST}") + add_dependencies(package generate_breakpad_symbols) +endif (PACKAGE) + if (LL_TESTS) # To add a viewer unit test, just add the test .cpp file below # This creates a separate test project per file listed. @@ -1796,6 +1880,43 @@ if (LL_TESTS) "${CMAKE_SOURCE_DIR}/llmessage/tests/test_llsdmessage_peer.py" ) + set(test_libs + ${LLMESSAGE_LIBRARIES} + ${WINDOWS_LIBRARIES} + ${LLVFS_LIBRARIES} + ${LLMATH_LIBRARIES} + ${LLCOMMON_LIBRARIES} + ${GOOGLEMOCK_LIBRARIES} + ${OPENSSL_LIBRARIES} + ${CRYPTO_LIBRARIES} + ) + + LL_ADD_INTEGRATION_TEST(llsechandler_basic + llsechandler_basic.cpp + "${test_libs}" + ) + + LL_ADD_INTEGRATION_TEST(llsecapi + llsecapi.cpp + "${test_libs}" + ) + + set(llslurl_test_sources + llslurl.cpp + llviewernetwork.cpp + ) + + + LL_ADD_INTEGRATION_TEST(llslurl + "${llslurl_test_sources}" + "${test_libs}" + ) + + LL_ADD_INTEGRATION_TEST(llviewernetwork + llviewernetwork.cpp + "${test_libs}" + ) + #ADD_VIEWER_BUILD_TEST(llmemoryview viewer) #ADD_VIEWER_BUILD_TEST(llagentaccess viewer) #ADD_VIEWER_BUILD_TEST(llworldmap viewer) @@ -1803,6 +1924,7 @@ if (LL_TESTS) #ADD_VIEWER_BUILD_TEST(lltextureinfo viewer) #ADD_VIEWER_BUILD_TEST(lltextureinfodetails viewer) #ADD_VIEWER_BUILD_TEST(lltexturestatsuploader viewer) + endif (LL_TESTS) diff --git a/indra/newview/English.lproj/InfoPlist.strings b/indra/newview/English.lproj/InfoPlist.strings index 879408d6e4..fc531f93d4 100644 --- a/indra/newview/English.lproj/InfoPlist.strings +++ b/indra/newview/English.lproj/InfoPlist.strings @@ -2,6 +2,6 @@ CFBundleName = "Second Life"; -CFBundleShortVersionString = "Second Life version 2.0.0.200030"; -CFBundleGetInfoString = "Second Life version 2.0.0.200030, Copyright 2004-2009 Linden Research, Inc."; +CFBundleShortVersionString = "Second Life version 2.1.0.0"; +CFBundleGetInfoString = "Second Life version 2.1.0.0, Copyright 2004-2009 Linden Research, Inc."; diff --git a/indra/newview/Info-SecondLife.plist b/indra/newview/Info-SecondLife.plist index 38ebb22b84..97e24a0bd5 100644 --- a/indra/newview/Info-SecondLife.plist +++ b/indra/newview/Info-SecondLife.plist @@ -18,6 +18,33 @@ <string>APPL</string> <key>CFBundleSignature</key> <string>????</string> + <key>CFBundleDocumentTypes</key> + <array> + <dict> + <key>CFBundleTypeExtensions</key> + <array> + <string>slurl</string> + </array> + <key>CFBundleTypeIconFile</key> + <string>seconlife</string> + <key>CFBundleTypeMIMETypes</key> + <array> + <string>application/x-grid-location-info</string> + </array> + <key>CFBundleTypeName</key> + <string>Secondlife SLURL</string> + <key>CFBundleTypeOSTypes</key> + <array> + <string>SLRL</string> + </array> + <key>CFBundleTypeRole</key> + <string>Viewer</string> + <key>LSTypeIsPackage</key> + <true/> + <key>NSDocumentClass</key> + <string>SecondLifeSLURL</string> + </dict> + </array> <key>CFBundleURLTypes</key> <array> <dict> @@ -26,13 +53,14 @@ <key>CFBundleURLSchemes</key> <array> <string>secondlife</string> + <string>x-grid-location-info</string> </array> <key>LSIsAppleDefaultForScheme</key> <true/> </dict> </array> <key>CFBundleVersion</key> - <string>2.0.0.200030</string> + <string>2.1.0.0</string> <key>CSResourcesFileMapped</key> <true/> </dict> diff --git a/indra/newview/app_settings/CA.pem b/indra/newview/app_settings/CA.pem index b14e7346ad..e68e2b6ce6 100644 --- a/indra/newview/app_settings/CA.pem +++ b/indra/newview/app_settings/CA.pem @@ -26,1489 +26,1464 @@ t79enKNHEA2fupH3vEigf5Eh4bVAN5VohrTm6MY53x7XQZZr1ME7a55lFEnSeT0u mlOAjR2mAbvSM5X5oSZNrmetdzyTj2flCM8CC7MLab0kkdngRIlUBGHF1/S5nmPb K+9A46sd33oqK8n8 -----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIDtTCCAp2gAwIBAgIRANAeQJAAAEZSAAAAAQAAAAQwDQYJKoZIhvcNAQEFBQAw +gYkxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJEQzETMBEGA1UEBxMKV2FzaGluZ3Rv +bjEXMBUGA1UEChMOQUJBLkVDT00sIElOQy4xGTAXBgNVBAMTEEFCQS5FQ09NIFJv +b3QgQ0ExJDAiBgkqhkiG9w0BCQEWFWFkbWluQGRpZ3NpZ3RydXN0LmNvbTAeFw05 +OTA3MTIxNzMzNTNaFw0wOTA3MDkxNzMzNTNaMIGJMQswCQYDVQQGEwJVUzELMAkG +A1UECBMCREMxEzARBgNVBAcTCldhc2hpbmd0b24xFzAVBgNVBAoTDkFCQS5FQ09N +LCBJTkMuMRkwFwYDVQQDExBBQkEuRUNPTSBSb290IENBMSQwIgYJKoZIhvcNAQkB +FhVhZG1pbkBkaWdzaWd0cnVzdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQCx0xHgeVVDBwhMywVCAOINg0Y95JO6tgbTDVm9PsHOQ2cBiiGo77zM +0KLMsFWWU4RmBQDaREmA2FQKpSWGlO1jVv9wbKOhGdJ4vmgqRF4vz8wYXke8OrFG +PR7wuSw0X4x8TAgpnUBV6zx9g9618PeKgw6hTLQ6pbNfWiKX7BmbwQVo/ea3qZGU +LOR4SCQaJRk665WcOQqKz0Ky8BzVX/tr7WhWezkscjiw7pOp03t3POtxA6k4ShZs +iSrK2jMTecJVjO2cu/LLWxD4LmE1xilMKtAqY9FlWbT4zfn0AIS2V0KFnTKo+SpU ++/94Qby9cSj0u5C8/5Y0BONFnqFGKECBAgMBAAGjFjAUMBIGA1UdEwEB/wQIMAYB +Af8CAQgwDQYJKoZIhvcNAQEFBQADggEBAARvJYbk5pYntNlCwNDJALF/VD6Hsm0k +qS8Kfv2kRLD4VAe9G52dyntQJHsRW0mjpr8SdNWJt7cvmGQlFLdh6X9ggGvTZOir +vRrWUfrAtF13Gn9kCF55xgVM8XrdTX3O5kh7VNJhkoHWG9YA8A6eKHegTYjHInYZ +w8eeG6Z3ePhfm1bR8PIXrI6dWeYf/le22V7hXZ9F7GFoGUHhsiAm/lowdiT/QHI8 +eZ98IkirRs3bs4Ysj78FQdPB4xTjQRcm0HyncUwZ6EoPclgxfexgeqMiKL0ZJGA/ +O4dzwGvky663qyVDslUte6sGDnVdNOVdc22esnVApVnJTzFxiNmIf1Q= +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIID5jCCAs6gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMCVVMx +HTAbBgNVBAoTFEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNBbWVyaWNh +IE9ubGluZSBJbmMuMTcwNQYDVQQDEy5BT0wgVGltZSBXYXJuZXIgUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyOTA2MDAwMFoXDTM3MTEyMDE1 +MDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRBT0wgVGltZSBXYXJuZXIg +SW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUgSW5jLjE3MDUGA1UEAxMuQU9M +IFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnej8Mlo2k06AX3dLm/WpcZuS+U +0pPlLYnKhHw/EEMbjIt8hFj4JHxIzyr9wBXZGH6EGhfT257XyuTZ16pYUYfw8ItI +TuLCxFlpMGK2MKKMCxGZYTVtfu/FsRkGIBKOQuHfD5YQUqjPnF+VFNivO3ULMSAf +RC+iYkGzuxgh28pxPIzstrkNn+9R7017EvILDOGsQI93f7DKeHEMXRZxcKLXwjqF +zQ6axOAAsNUl6twr5JQtOJyJQVdkKGUZHLZEtMgxa44Be3ZZJX8VHIQIfHNlIAqh +BC4aMqiaILGcLCFZ5/vP7nAtCMpjPiybkxlqpMKX/7eGV4iFbJ4VFitNLLMCAwEA +AaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUoTYwFsuGkABFgFOxj8jY +PXy+XxIwHwYDVR0jBBgwFoAUoTYwFsuGkABFgFOxj8jYPXy+XxIwDgYDVR0PAQH/ +BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQCKIBilvrMvtKaEAEAwKfq0FHNMeUWn +9nDg6H5kHgqVfGphwu9OH77/yZkfB2FK4V1Mza3u0FIy2VkyvNp5ctZ7CegCgTXT +Ct8RHcl5oIBN/lrXVtbtDyqvpxh1MwzqwWEFT2qaifKNuZ8u77BfWgDrvq2g+EQF +Z7zLBO+eZMXpyD8Fv8YvBxzDNnGGyjhmSs3WuEvGbKeXO/oTLW4jYYehY0KswsuX +n2Fozy1MBJ3XJU8KDk2QixhWqJNIV9xvrr2eZ1d3iVCzvhGbRWeDhhmH05i9CBoW +H1iCC+GWaQVLjuyDUTEH1dSf/1l7qG6Fz9NLqUmwX7A5KGgOc90lmt4S +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIF5jCCA86gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMCVVMx +HTAbBgNVBAoTFEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNBbWVyaWNh +IE9ubGluZSBJbmMuMTcwNQYDVQQDEy5BT0wgVGltZSBXYXJuZXIgUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyOTA2MDAwMFoXDTM3MDkyODIz +NDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRBT0wgVGltZSBXYXJuZXIg +SW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUgSW5jLjE3MDUGA1UEAxMuQU9M +IFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALQ3WggWmRToVbEbJGv8x4vmh6mJ +7ouZzU9AhqS2TcnZsdw8TQ2FTBVsRotSeJ/4I/1n9SQ6aF3Q92RhQVSji6UI0ilb +m2BPJoPRYxJWSXakFsKlnUWsi4SVqBax7J/qJBrvuVdcmiQhLE0OcR+mrF1FdAOY +xFSMFkpBd4aVdQxHAWZg/BXxD+r1FHjHDtdugRxev17nOirYlxcwfACtCJ0zr7iZ +YYCLqJV+FNwSbKTQ2O9ASQI2+W6p1h2WVgSysy0WVoaP2SBXgM1nEG2wTPDaRrbq +JS5Gr42whTg0ixQmgiusrpkLjhTXUr2eacOGAgvqdnUxCc4zGSGFQ+aJLZ8lN2fx +I2rSAG2X+Z/nKcrdH9cG6rjJuQkhn8g/BsXS6RJGAE57COtCPStIbp1n3UsC5ETz +kxmlJ85per5n0/xQpCyrw2u544BMzwVhSyvcG7mm0tCq9Stz+86QNZ8MUhy/XCFh +EVsVS6kkUfykXPcXnbDS+gfpj1bkGoxoigTTfFrjnqKhynFbotSg5ymFXQNoKk/S +Btc9+cMDLz9l+WceR0DTYw/j1Y75hauXTLPXJuuWCpTehTacyH+BCQJJKg71ZDIM +gtG6aoIbs0t0EfOMd9afv9w3pKdVBC/UMejTRrkDfNoSTllkt1ExMVCgyhwn2RAu +rda9EGYrw7AiShJbAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FE9pbQN+nZ8HGEO8txBO1b+pxCAoMB8GA1UdIwQYMBaAFE9pbQN+nZ8HGEO8txBO +1b+pxCAoMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAO/Ouyugu +h4X7ZVnnrREUpVe8WJ8kEle7+z802u6teio0cnAxa8cZmIDJgt43d15Ui47y6mdP +yXSEkVYJ1eV6moG2gcKtNuTxVBFT8zRFASbI5Rq8NEQh3q0l/HYWdyGQgJhXnU7q +7C+qPBR7V8F+GBRn7iTGvboVsNIYvbdVgaxTwOjdaRITQrcCtQVBynlQboIOcXKT +RuidDV29rs4prWPVVRaAMCf/drr3uNZK49m1+VLQTkCpx+XCMseqdiThawVQ68W/ +ClTluUI8JPu3B5wwn3la5uBAUhX0/Kr0VvlEl4ftDmVyXr4m+02kLQgH3thcoNyB +M5kYJRF3p+v9WAksmWsbivNSPxpNSGDxoPYzAlOL7SUJuA0t7Zdz7NeWH45gDtoQ +my8YJPamTQr5O8t1wswvziRpyQoijlmn94IM19drNZxDAGrElWe6nEXLuA4399xO +AU++CrYD062KRffaJ00psUjf5BHklka9bAI+1lHIlRcBFanyqqryvy9lG2/QuRqT +9Y41xICHPpQvZuTpqP9BnHAqTyo5GJUefvthATxRCC4oGKQWDzH9OmwjkyB24f0H +hdFbP9IcczLd+rn4jM8Ch3qaluTtT4mNU0OrDhPAARW0eTjb/G49nlG2uBOLZ8/5 +fNkiHfZdxRwBL5joeiQYvITX+txyW/fBOmg= +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs +IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290 +MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux +FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h +bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v +dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt +H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9 +uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX +mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX +a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN +E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0 +WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD +VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0 +Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU +cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx +IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN +AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH +YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 +6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC +Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX +c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a +mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 +b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMw +MTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYD +VQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUA +A4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ul +CDtbKRY654eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6n +tGO0/7Gcrjyvd7ZWxbWroulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyl +dI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1Zmne3yzxbrww2ywkEtvrNTVokMsAsJch +PXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJuiGMx1I4S+6+JNM3GOGvDC ++Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8wHQYDVR0O +BBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8E +BTADAQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBl +MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFk +ZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENB +IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxtZBsfzQ3duQH6lmM0MkhHma6X +7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0PhiVYrqW9yTkkz +43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY +eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJl +pz/+0WatC7xrmYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOA +WiFeIc9TVPC6b4nbqKqVz4vjccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk= +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 +b3JrMSAwHgYDVQQDExdBZGRUcnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAx +MDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtB +ZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIDAeBgNV +BAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV +6tsfSlbunyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nX +GCwwfQ56HmIexkvA/X1id9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnP +dzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSGAa2Il+tmzV7R/9x98oTaunet3IAIx6eH +1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAwHM+A+WD+eeSI8t0A65RF +62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0GA1UdDgQW +BBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUw +AwEB/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDEL +MAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRU +cnVzdCBUVFAgTmV0d29yazEgMB4GA1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJv +b3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4JNojVhaTdt02KLmuG7jD8WS6 +IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL+YPoRNWyQSW/ +iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao +GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh +4SINhwBk/ox9Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQm +XiLsks3/QppEIW1cxeMiHV9HEufOX1362KqxMy3ZdvJOOjMMK7MtkAY= +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 +b3JrMSMwIQYDVQQDExpBZGRUcnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1 +MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcxCzAJBgNVBAYTAlNFMRQwEgYDVQQK +EwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIzAh +BgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwq +xBb/4Oxx64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G +87B4pfYOQnrjfxvM0PC3KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i +2O+tCBGaKZnhqkRFmhJePp1tUvznoD1oL/BLcHwTOK28FSXx1s6rosAx1i+f4P8U +WfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GRwVY18BTcZTYJbqukB8c1 +0cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HUMIHRMB0G +A1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0T +AQH/BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6Fr +pGkwZzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQL +ExRBZGRUcnVzdCBUVFAgTmV0d29yazEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlm +aWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBABmrder4i2VhlRO6aQTv +hsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxGGuoYQ992zPlm +hpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X +dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3 +P6CxB9bpT9zeRXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9Y +iQBCYz95OdBEsIJuQRno3eDBiFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5no +xqE= +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP +bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2 +MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft +ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lk +hsmj76CGv2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym +1BW32J/X3HGrfpq/m44zDyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsW +OqMFf6Dch9Wc/HKpoH145LcxVR5lu9RhsCFg7RAycsWSJR74kEoYeEfffjA3PlAb +2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP8c9GsEsPPt2IYriMqQko +O3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAU +AK3Zo/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB +BQUAA4IBAQB8itEfGDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkF +Zu90821fnZmv9ov761KyBZiibyrFVL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAb +LjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft3OJvx8Fi8eNy1gTIdGcL+oir +oQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43gKd8hdIaC2y+C +MMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds +sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7 +-----END CERTIFICATE----- + -----BEGIN CERTIFICATE----- -MIIDtTCCAp2gAwIBAgIRANAeQJAAAEZSAAAAAQAAAAQwDQYJKoZIhvcNAQEF -BQAwgYkxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJEQzETMBEGA1UEBxMKV2Fz -aGluZ3RvbjEXMBUGA1UEChMOQUJBLkVDT00sIElOQy4xGTAXBgNVBAMTEEFC -QS5FQ09NIFJvb3QgQ0ExJDAiBgkqhkiG9w0BCQEWFWFkbWluQGRpZ3NpZ3Ry -dXN0LmNvbTAeFw05OTA3MTIxNzMzNTNaFw0wOTA3MDkxNzMzNTNaMIGJMQsw -CQYDVQQGEwJVUzELMAkGA1UECBMCREMxEzARBgNVBAcTCldhc2hpbmd0b24x -FzAVBgNVBAoTDkFCQS5FQ09NLCBJTkMuMRkwFwYDVQQDExBBQkEuRUNPTSBS -b290IENBMSQwIgYJKoZIhvcNAQkBFhVhZG1pbkBkaWdzaWd0cnVzdC5jb20w -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx0xHgeVVDBwhMywVC -AOINg0Y95JO6tgbTDVm9PsHOQ2cBiiGo77zM0KLMsFWWU4RmBQDaREmA2FQK -pSWGlO1jVv9wbKOhGdJ4vmgqRF4vz8wYXke8OrFGPR7wuSw0X4x8TAgpnUBV -6zx9g9618PeKgw6hTLQ6pbNfWiKX7BmbwQVo/ea3qZGULOR4SCQaJRk665Wc -OQqKz0Ky8BzVX/tr7WhWezkscjiw7pOp03t3POtxA6k4ShZsiSrK2jMTecJV -jO2cu/LLWxD4LmE1xilMKtAqY9FlWbT4zfn0AIS2V0KFnTKo+SpU+/94Qby9 -cSj0u5C8/5Y0BONFnqFGKECBAgMBAAGjFjAUMBIGA1UdEwEB/wQIMAYBAf8C -AQgwDQYJKoZIhvcNAQEFBQADggEBAARvJYbk5pYntNlCwNDJALF/VD6Hsm0k -qS8Kfv2kRLD4VAe9G52dyntQJHsRW0mjpr8SdNWJt7cvmGQlFLdh6X9ggGvT -ZOirvRrWUfrAtF13Gn9kCF55xgVM8XrdTX3O5kh7VNJhkoHWG9YA8A6eKHeg -TYjHInYZw8eeG6Z3ePhfm1bR8PIXrI6dWeYf/le22V7hXZ9F7GFoGUHhsiAm -/lowdiT/QHI8eZ98IkirRs3bs4Ysj78FQdPB4xTjQRcm0HyncUwZ6EoPclgx -fexgeqMiKL0ZJGA/O4dzwGvky663qyVDslUte6sGDnVdNOVdc22esnVApVnJ -TzFxiNmIf1Q= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIID5jCCAs6gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMC -VVMxHTAbBgNVBAoTFEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNB -bWVyaWNhIE9ubGluZSBJbmMuMTcwNQYDVQQDEy5BT0wgVGltZSBXYXJuZXIg -Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyOTA2MDAw -MFoXDTM3MTEyMDE1MDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRB -T0wgVGltZSBXYXJuZXIgSW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUg -SW5jLjE3MDUGA1UEAxMuQU9MIFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAJnej8Mlo2k06AX3dLm/WpcZuS+U0pPlLYnKhHw/EEMbjIt8hFj4JHxI -zyr9wBXZGH6EGhfT257XyuTZ16pYUYfw8ItITuLCxFlpMGK2MKKMCxGZYTVt -fu/FsRkGIBKOQuHfD5YQUqjPnF+VFNivO3ULMSAfRC+iYkGzuxgh28pxPIzs -trkNn+9R7017EvILDOGsQI93f7DKeHEMXRZxcKLXwjqFzQ6axOAAsNUl6twr -5JQtOJyJQVdkKGUZHLZEtMgxa44Be3ZZJX8VHIQIfHNlIAqhBC4aMqiaILGc -LCFZ5/vP7nAtCMpjPiybkxlqpMKX/7eGV4iFbJ4VFitNLLMCAwEAAaNjMGEw -DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUoTYwFsuGkABFgFOxj8jYPXy+ -XxIwHwYDVR0jBBgwFoAUoTYwFsuGkABFgFOxj8jYPXy+XxIwDgYDVR0PAQH/ -BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQCKIBilvrMvtKaEAEAwKfq0FHNM -eUWn9nDg6H5kHgqVfGphwu9OH77/yZkfB2FK4V1Mza3u0FIy2VkyvNp5ctZ7 -CegCgTXTCt8RHcl5oIBN/lrXVtbtDyqvpxh1MwzqwWEFT2qaifKNuZ8u77Bf -WgDrvq2g+EQFZ7zLBO+eZMXpyD8Fv8YvBxzDNnGGyjhmSs3WuEvGbKeXO/oT -LW4jYYehY0KswsuXn2Fozy1MBJ3XJU8KDk2QixhWqJNIV9xvrr2eZ1d3iVCz -vhGbRWeDhhmH05i9CBoWH1iCC+GWaQVLjuyDUTEH1dSf/1l7qG6Fz9NLqUmw -X7A5KGgOc90lmt4S ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIF5jCCA86gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMC -VVMxHTAbBgNVBAoTFEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNB -bWVyaWNhIE9ubGluZSBJbmMuMTcwNQYDVQQDEy5BT0wgVGltZSBXYXJuZXIg -Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyOTA2MDAw -MFoXDTM3MDkyODIzNDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRB -T0wgVGltZSBXYXJuZXIgSW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUg -SW5jLjE3MDUGA1UEAxMuQU9MIFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC -ggIBALQ3WggWmRToVbEbJGv8x4vmh6mJ7ouZzU9AhqS2TcnZsdw8TQ2FTBVs -RotSeJ/4I/1n9SQ6aF3Q92RhQVSji6UI0ilbm2BPJoPRYxJWSXakFsKlnUWs -i4SVqBax7J/qJBrvuVdcmiQhLE0OcR+mrF1FdAOYxFSMFkpBd4aVdQxHAWZg -/BXxD+r1FHjHDtdugRxev17nOirYlxcwfACtCJ0zr7iZYYCLqJV+FNwSbKTQ -2O9ASQI2+W6p1h2WVgSysy0WVoaP2SBXgM1nEG2wTPDaRrbqJS5Gr42whTg0 -ixQmgiusrpkLjhTXUr2eacOGAgvqdnUxCc4zGSGFQ+aJLZ8lN2fxI2rSAG2X -+Z/nKcrdH9cG6rjJuQkhn8g/BsXS6RJGAE57COtCPStIbp1n3UsC5ETzkxml -J85per5n0/xQpCyrw2u544BMzwVhSyvcG7mm0tCq9Stz+86QNZ8MUhy/XCFh -EVsVS6kkUfykXPcXnbDS+gfpj1bkGoxoigTTfFrjnqKhynFbotSg5ymFXQNo -Kk/SBtc9+cMDLz9l+WceR0DTYw/j1Y75hauXTLPXJuuWCpTehTacyH+BCQJJ -Kg71ZDIMgtG6aoIbs0t0EfOMd9afv9w3pKdVBC/UMejTRrkDfNoSTllkt1Ex -MVCgyhwn2RAurda9EGYrw7AiShJbAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMB -Af8wHQYDVR0OBBYEFE9pbQN+nZ8HGEO8txBO1b+pxCAoMB8GA1UdIwQYMBaA -FE9pbQN+nZ8HGEO8txBO1b+pxCAoMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG -9w0BAQUFAAOCAgEAO/Ouyuguh4X7ZVnnrREUpVe8WJ8kEle7+z802u6teio0 -cnAxa8cZmIDJgt43d15Ui47y6mdPyXSEkVYJ1eV6moG2gcKtNuTxVBFT8zRF -ASbI5Rq8NEQh3q0l/HYWdyGQgJhXnU7q7C+qPBR7V8F+GBRn7iTGvboVsNIY -vbdVgaxTwOjdaRITQrcCtQVBynlQboIOcXKTRuidDV29rs4prWPVVRaAMCf/ -drr3uNZK49m1+VLQTkCpx+XCMseqdiThawVQ68W/ClTluUI8JPu3B5wwn3la -5uBAUhX0/Kr0VvlEl4ftDmVyXr4m+02kLQgH3thcoNyBM5kYJRF3p+v9WAks -mWsbivNSPxpNSGDxoPYzAlOL7SUJuA0t7Zdz7NeWH45gDtoQmy8YJPamTQr5 -O8t1wswvziRpyQoijlmn94IM19drNZxDAGrElWe6nEXLuA4399xOAU++CrYD -062KRffaJ00psUjf5BHklka9bAI+1lHIlRcBFanyqqryvy9lG2/QuRqT9Y41 -xICHPpQvZuTpqP9BnHAqTyo5GJUefvthATxRCC4oGKQWDzH9OmwjkyB24f0H -hdFbP9IcczLd+rn4jM8Ch3qaluTtT4mNU0OrDhPAARW0eTjb/G49nlG2uBOL -Z8/5fNkiHfZdxRwBL5joeiQYvITX+txyW/fBOmg= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJT -RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4 -dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5h -bCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzEL -MAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1B -ZGRUcnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1 -c3QgRXh0ZXJuYWwgQ0EgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBALf3GjPm8gAELTngTlvtH7xsD821+iO2zt6bETOXpClMfZOfvUq8 -k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfwTz/oMp50 -ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504 -B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDez -eWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5 -aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0WicCAwEAAaOB -3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0PBAQD -AgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6 -xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU -cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdv -cmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJ -KoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl -j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5R -xNKWt9x+Tu5w/Rw56wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjT -K3rMUUKhemPR5ruhxSvCNr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1 -n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHx -REzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49O -hgQ= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJT -RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRU -UCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3Qw -HhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQswCQYDVQQGEwJT -RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRU -UCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3Qw -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwze -xODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY654eyNAbFvAWlA3yCyykQruGI -gb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWroulpOj0O -M3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1Lc -sRVlIPo1Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5 -mqRJjox0r26kmqPZm9I4XJuiGMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG -9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8wHQYDVR0OBBYEFJWxtPCU -tr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTADAQH/ -MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQsw -CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFk -ZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAx -IENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxtZBsfzQ3duQH6lmM0 -MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph -iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9 -tTEv2dB8Xfjea4MYeDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL -/bscVjby/rK25Xa71SJlpz/+0WatC7xrmYbvP33zGDLKe8bjq2RGlfgmadlV -g3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vjccweGyBECMB6 -tkD9xOQ14R0WHNC8K47Wcdk= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJT -RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRU -UCBOZXR3b3JrMSAwHgYDVQQDExdBZGRUcnVzdCBQdWJsaWMgQ0EgUm9vdDAe -Fw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJBgNVBAYTAlNF -MRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ -IE5ldHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIB -IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+ -A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbunyNu9DnLoblv8n75XYcmYZ4c -+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1id9NEHif2 -P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKX -C1sIXzSGAa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8R -s3iQhCBSWxHveNCD9tVIkNAwHM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9 -BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0GA1UdDgQWBBSBPjfYkrAf -d59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zCB -jgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkG -A1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRU -cnVzdCBUVFAgTmV0d29yazEgMB4GA1UEAxMXQWRkVHJ1c3QgUHVibGljIENB -IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4JNojVhaTdt02KLmu -G7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL -+YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbj -PGsye/Kf8Lb93/AoGEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bY -GozH7ZxOmuASu7VqTITh4SINhwBk/ox9Yjllpu9CtoAlEmEBqCQTcAARJl/6 -NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9HEufOX1362Kqx -My3ZdvJOOjMMK7MtkAY= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJT -RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRU -UCBOZXR3b3JrMSMwIQYDVQQDExpBZGRUcnVzdCBRdWFsaWZpZWQgQ0EgUm9v -dDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcxCzAJBgNVBAYT -AlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3Qg -VFRQIE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBS -b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoek -n0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx64r1EW7tTw2R0hIYLUkVAcKk -IhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3KP0q6p6z -sLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1t -UvznoD1oL/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R -+Bg6Ot4l2ffTQO2kBhLEO+GRwVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvES -a0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HUMIHRMB0GA1UdDgQWBBQ5 -lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUw -AwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkw -ZzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQL -ExRBZGRUcnVzdCBUVFAgTmV0d29yazEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVh -bGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBABmrder4i2Vh -lRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG -GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx9 -5dr6h+sNNVJn0J6XdgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKF -Yqa0p9m9N5xotS1WfbC3P6CxB9bpT9zeRXEwMn8bLgn5v1Kh7sKAPgZcLlVA -wRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDBiFrRHnGTHyQw -dOUeqN48Jzd/g66ed8/wMLH/S5noxqE= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJV -UzEcMBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1l -cmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4X -DTAyMDUyODA2MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkGA1UEBhMCVVMx -HDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJp -Y2EgT25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIw -DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCa -xlCyfqXfaE0bfA+2l2h9LaaLl+lkhsmj76CGv2BlnEtUiMJIxUo5vxTjWVXl -GbR0yLQFOVwWpeKVBeASrlmLojNoWBym1BW32J/X3HGrfpq/m44zDyL9Hy7n -BzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsWOqMFf6Dch9Wc/HKpoH145Lcx -VR5lu9RhsCFg7RAycsWSJR74kEoYeEfffjA3PlAb2xzTa5qGUwew76wGePiE -mf4hjUyAtgyC9mZweRrTT6PP8c9GsEsPPt2IYriMqQkoO3rHl+Ee5fSfwMCu -JKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAdBgNV -HQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAUAK3Zo/Z5 -9m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBBQUA -A4IBAQB8itEfGDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkF -Zu90821fnZmv9ov761KyBZiibyrFVL0lvV+uyIbqRizBs73B6UlwGBaXCBOM -IOAbLjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft3OJvx8Fi8eNy1gTI -dGcL+oiroQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43g -Kd8hdIaC2y+CMMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j -8uB9Gr784N/Xx6dssPmuujz9dLQR6FgNgLzTqIA6me11zEZ7 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJV -UzEcMBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1l -cmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4X -DTAyMDUyODA2MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkGA1UEBhMCVVMx -HDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJp -Y2EgT25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIw -DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssN -t79Hc9PwVU3dxgz6sWYFas14tNwC206B89enfHG8dWOgXeMHDEjsJcQDIPT/ -DjsS/5uN4cbVG7RtIuOx238hZK+GvFciKtZHgVdEglZTvYYUAQv8f3SkWq7x -uhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2JxhP7JsowtS013wMPgwr38oE -18aO6lhOqKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9BoInLRBYBbV4Bbkv2wxr -kJB+FFk4u5QkE+XRnRTf04JNRvCAOVIyD+OEsnpD8l7eXz8d3eOyG6ChKiMD -bi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0gBe4lL8BPeraunzgWGcX -uVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67Xnfn6KVu -Y8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEqZ8A9 -W6Wa6897GqidFEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZ -o2C7HK2JNDJiuEMhBnIMoVxtRsX6Kc8w3onccVvdtjc+31D1uAclJuW8tf48 -ArO3+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnjB453cMor9H124Hhn -AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3Op -aaEg5+31IqEjFNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNee -MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypL -M7PmG2tZTiLMubekJcmnxPBUlgtk87FYT15R/LKXeydlwuXK5w0MJXti4/qf -tIe3RUavg6WXSIylvfEWK5t2LHo1YGwRgJfMqZJS5ivmae2p+DYtLHe/YUjR -Ywu5W1LtGLBDQiKmsXeu3mnFzcccobGlHBD7GL4acN3Bkku+KVqdPzW+5X1R -+FXgJXUjhx5c3LqdsKyzadsXg8n33gy8CNyRnqjQ1xU3c6U1uPx+xURABsPr -+CKAXEfOAuMRn0T//ZoyzH1kUQ7rVyZ2OuMeIjzCpjbdGe+n/BLzJsBZMYVM -nNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgOZtMADjMSW7yV5TKQqLPGbIOt -d+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2FAjgQ5ANh1NolNscI -WC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUXOm/9riW99XJZ -ZLF0KjhfGEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPbAZO1XB4Y -3WRayhgoPmMEEf0cjQAPuDffZ4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQlZvqz -2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuPcX/9XhmgD0uRuMRUvAaw +MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP +bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2 +MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft +ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC +206B89enfHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFci +KtZHgVdEglZTvYYUAQv8f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2 +JxhP7JsowtS013wMPgwr38oE18aO6lhOqKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9 +BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JNRvCAOVIyD+OEsnpD8l7e +Xz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0gBe4lL8B +PeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67 +Xnfn6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEq +Z8A9W6Wa6897GqidFEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZ +o2C7HK2JNDJiuEMhBnIMoVxtRsX6Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3 ++L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnjB453cMor9H124HhnAgMBAAGj +YzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3OpaaEg5+31IqEj +FNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE +AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmn +xPBUlgtk87FYT15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2 +LHo1YGwRgJfMqZJS5ivmae2p+DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzccc +obGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXgJXUjhx5c3LqdsKyzadsXg8n33gy8 +CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//ZoyzH1kUQ7rVyZ2OuMe +IjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgOZtMA +DjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2F +AjgQ5ANh1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUX +Om/9riW99XJZZLF0KjhfGEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPb +AZO1XB4Y3WRayhgoPmMEEf0cjQAPuDffZ4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQl +Zvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuPcX/9XhmgD0uRuMRUvAaw RY8mkaKO/qk= -----END CERTIFICATE----- + -----BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQG -EwJJRTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0 -MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUx -MjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNV -BAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZ -QmFsdGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAKMEuyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+h -Xe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gR -QKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/CG9VwcPCP -wBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1 -pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNT -Px8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkC -AwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1BE3wMBIGA1Ud -EwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUA -A4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkT -I7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx -jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/ -oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67 -G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H -RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQG -EwJVUzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREw -DwYDVQQLEwhEU1RDQSBFMTAeFw05ODEyMTAxODEwMjNaFw0xODEyMTAxODQw -MjNaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVy -ZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEB -AQUAA4GLADCBhwKBgQCgbIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlR -EmlvMVW5SXIACH7TpWJENySZj9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+Lth -zfNHwJmm8fOR6Hh8AMthyUQncWlVSn5JTe2io74CTADKAqjuAQIxZA9SLRN0 -dja1erQtcQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBoBgNVHR8E -YTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwg -U2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTExDTALBgNV -BAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5ODEyMTAxODEwMjNagQ8yMDE4MTIx -MDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFGp5fpFpRhgTCgJ3 -pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i+DAMBgNV -HRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3 -DQEBBQUAA4GBACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lN -QseSJqBcNJo4cvj9axY+IO6CizEqkzaFI4iKPANo08kJD038bKTaKHKTDomA -sH3+gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4RbyhkwS7hp86W0N6 -w4pl ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIID2DCCAsACEQDQHkCLAAACfAAAAAIAAAABMA0GCSqGSIb3DQEBBQUAMIGp -MQswCQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBM -YWtlIENpdHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENv -LjERMA8GA1UECxMIRFNUQ0EgWDExFjAUBgNVBAMTDURTVCBSb290Q0EgWDEx -ITAfBgkqhkiG9w0BCQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTAeFw05ODEyMDEx -ODE4NTVaFw0wODExMjgxODE4NTVaMIGpMQswCQYDVQQGEwJ1czENMAsGA1UE -CBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkxJDAiBgNVBAoTG0Rp -Z2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgWDEx -FjAUBgNVBAMTDURTVCBSb290Q0EgWDExITAfBgkqhkiG9w0BCQEWEmNhQGRp -Z3NpZ3RydXN0LmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -ANLGJrbnpT3BxGjVUG9TxW9JEwm4ryxIjRRqoxdfWvnTLnUv2Chi0ZMv/E3U -q4flCMeZ55I/db3rJbQVwZsZPdJEjdd0IG03Ao9pk1uKxBmd9LIO/BZsubEF -koPRhSxglD5FVaDZqwgh5mDoO3TymVBRaNADLbGAvqPYUrBEzUNKcI5YhZXh -TizWLUFv1oTnyJhEykfbLCSlaSbPa7gnYsP0yXqSI+0TZ4KuRS5F5X5yP4Wd -lGIQ5jyRoa13AOAV7POEgHJ6jm5gl8ckWRA0g1vhpaRptlc1HHhZxtMvOnNn -7pTKBBMFYgZwI7P0fO5F2WQLW0mqpEPOJsREEmy43XkCAwEAATANBgkqhkiG -9w0BAQUFAAOCAQEAojeyP2n714Z5VEkxlTMr89EJFEliYIalsBHiUMIdBlc+ -LegzZL6bqq1fG03UmZWii5rJYnK1aerZWKs17RWiQ9a2vAd5ZWRzfdd5ynvV -WlHG4VMElo04z6MXrDlxawHDi1M8Y+nuecDkvpIyZHqzH5eUYr3qsiAVlfuX -8ngvYzZAOONGDx3drJXK50uQe7FLqdTF65raqtWjlBRGjS0f8zrWkzr2Pnn8 -6Oawde3uPclwx12qgUtGJRzHbBXjlU4PqjI3lAoXJJIThFjSY28r9+ZbYgsT -F7ANUkz+/m9c4pFuHf2kYtdo+o56T9II2pPc8JIRetDccpMMc5NihWjQ9A== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQG -EwJVUzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREw -DwYDVQQLEwhEU1RDQSBFMjAeFw05ODEyMDkxOTE3MjZaFw0xODEyMDkxOTQ3 -MjZaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVy -ZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEB -AQUAA4GLADCBhwKBgQC/k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fB -w18DW9Fvrn5C6mYjuGODVvsoLeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87e -ZfCocfdPJmyMvMa1795JJ/9IKn3oTQPMx7JSxhcxEzu1TdvIxPbDDyQq2gyd -55FbgM2UnQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBoBgNVHR8E -YTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwg -U2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTIxDTALBgNV -BAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5ODEyMDkxOTE3MjZagQ8yMDE4MTIw -OTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFB6CTShlgDzJQW6s -NS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5WzAMBgNV -HRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3 -DQEBBQUAA4GBAEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHR -xdf0CiUPPXiBng+xZ8SQTGPdXqfiup/1902lMXucKS1M/mQ+7LZT/uqb7YLb -dHVLB3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1mPnHfxsb1gYgAlih -w6ID ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIID2DCCAsACEQDQHkCLAAB3bQAAAAEAAAAEMA0GCSqGSIb3DQEBBQUAMIGp -MQswCQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBM -YWtlIENpdHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENv -LjERMA8GA1UECxMIRFNUQ0EgWDIxFjAUBgNVBAMTDURTVCBSb290Q0EgWDIx -ITAfBgkqhkiG9w0BCQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTAeFw05ODExMzAy -MjQ2MTZaFw0wODExMjcyMjQ2MTZaMIGpMQswCQYDVQQGEwJ1czENMAsGA1UE -CBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkxJDAiBgNVBAoTG0Rp -Z2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgWDIx -FjAUBgNVBAMTDURTVCBSb290Q0EgWDIxITAfBgkqhkiG9w0BCQEWEmNhQGRp -Z3NpZ3RydXN0LmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -ANx18IzAdZaawGIfJvfE4Zrq4FZzW5nNAUSoCLbVp9oaBBg5kkp4o4HC9Xd6 -ULRw/5qrxsfKboNPQpj7Jgva3G3WqZlVUmfpKAOS3OWwBZoPFflrWXJW8vo5 -/Kpo7g8fEIMv/J36F5bdguPmRX3AS4BEH+0s4IT9kVySVGkl5WJp3OXuAFK9 -MwutdQKFp2RQLcUZGTDAJtvJ0/0uma1ZtQtN1EGuhUhDWdy3qOKi3sOP17ih -YqZoUFLkzzGnlIXan0YyF1bl8utmPRL/Q9uY73fPy4GNNLHGUEom0eQ+QVCv -bK4iNC7Va26Dunm4dmVI2gkpZGMiuftHdoWMhkTLCdsCAwEAATANBgkqhkiG -9w0BAQUFAAOCAQEAtTYOXeFhKFoRZcA/gwN5Tb4opgsHAlKFzfiR0BBstWog -WxyQ2TA8xkieil5k+aFxd+8EJx8H6+Qm93N0yUQYGmbT4EOvkTvRyyzYdFQ6 -HE3K1GjNI3wdEJ5F6fYAbqbNGf9PLCmPV03Ed5K+4EwJ+11EhmYhqLkyolbV -6YyDfFk/xPEL553snr2cGA4+wjl5KLcDDQjLxufZATdQEOzMYRZA1K8xdHv8 -PzGn0EdzMzkbzE5q10mDEQb+64JYMzJM8FasHpwvVpp7wUocpf1VNs78lk30 -sPDst2yC7S8xmUJMqbINuBVd8d+6ybVK1GSYsyapMMj9puyrliGtf8J4tg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEgzCCA+ygAwIBAgIEOJ725DANBgkqhkiG9w0BAQQFADCBtDEUMBIGA1UE -ChMLRW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9HQ0NB -X0NQUyBpbmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsT -HChjKSAyMDAwIEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1 -c3QubmV0IENsaWVudCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMDAy -MDcxNjE2NDBaFw0yMDAyMDcxNjQ2NDBaMIG0MRQwEgYDVQQKEwtFbnRydXN0 -Lm5ldDFAMD4GA1UECxQ3d3d3LmVudHJ1c3QubmV0L0dDQ0FfQ1BTIGluY29y -cC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDIwMDAg -RW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5uZXQgQ2xp -ZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQCTdLS25MVL1qFof2LV7PdRV7NySpj10InJrWPNTTVRaoTU -rcloeW+46xHbh65cJFET8VQlhK8pK5/jgOLZy93GRUk0iJBeAZfv6lOm3fzB -3ksqJeTpNfpVBQbliXrqpBFXO/x8PTbNZzVtpKklWb1m9fkn5JVn1j+SgF7y -NH0rhQIDAQABo4IBnjCCAZowEQYJYIZIAYb4QgEBBAQDAgAHMIHdBgNVHR8E -gdUwgdIwgc+ggcyggcmkgcYwgcMxFDASBgNVBAoTC0VudHJ1c3QubmV0MUAw -PgYDVQQLFDd3d3cuZW50cnVzdC5uZXQvR0NDQV9DUFMgaW5jb3JwLiBieSBy -ZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMjAwMCBFbnRydXN0 -Lm5ldCBMaW1pdGVkMTMwMQYDVQQDEypFbnRydXN0Lm5ldCBDbGllbnQgQ2Vy -dGlmaWNhdGlvbiBBdXRob3JpdHkxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw -IoAPMjAwMDAyMDcxNjE2NDBagQ8yMDIwMDIwNzE2NDY0MFowCwYDVR0PBAQD -AgEGMB8GA1UdIwQYMBaAFISLdP3FjcD/J20gN0V8/i3OutN9MB0GA1UdDgQW -BBSEi3T9xY3A/ydtIDdFfP4tzrrTfTAMBgNVHRMEBTADAQH/MB0GCSqGSIb2 -fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0BAQQFAAOBgQBObzWA -O9GK9Q6nIMstZVXQkvTnhLUGJoMShAusO7JE7r3PQNsgDrpuFOow4DtifH+L -a3xKp9U1PL6oXOpLu5OOgGarDyn9TS2/GpsKkMWr2tGzhtQvJFJcem3G8v7l -TRowjJDyutdKPkN+1MhQGof4T4HHdguEOnKdzmVml64mXg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIElTCCA/6gAwIBAgIEOJsRPDANBgkqhkiG9w0BAQQFADCBujEUMBIGA1UE -ChMLRW50cnVzdC5uZXQxPzA9BgNVBAsUNnd3dy5lbnRydXN0Lm5ldC9TU0xf -Q1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc -KGMpIDIwMDAgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVz -dC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe -Fw0wMDAyMDQxNzIwMDBaFw0yMDAyMDQxNzUwMDBaMIG6MRQwEgYDVQQKEwtF -bnRydXN0Lm5ldDE/MD0GA1UECxQ2d3d3LmVudHJ1c3QubmV0L1NTTF9DUFMg -aW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykg -MjAwMCBFbnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5l -dCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0G -CSqGSIb3DQEBAQUAA4GNADCBiQKBgQDHwV9OcfHO8GCGD9JYf9Mzly0XonUw -tZZkJi9ow0SrqHXmAGc0V55lxyKbc+bT3QgON1WqJUaBbL3+qPZ1V1eMkGxK -wz6LS0MKyRFWmponIpnPVZ5h2QLifLZ8OAfc439PmrkDQYC2dWcTC5/oVzbI -XQA23mYU2m52H083jIITiQIDAQABo4IBpDCCAaAwEQYJYIZIAYb4QgEBBAQD -AgAHMIHjBgNVHR8EgdswgdgwgdWggdKggc+kgcwwgckxFDASBgNVBAoTC0Vu -dHJ1c3QubmV0MT8wPQYDVQQLFDZ3d3cuZW50cnVzdC5uZXQvU1NMX0NQUyBp -bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAy -MDAwIEVudHJ1c3QubmV0IExpbWl0ZWQxOjA4BgNVBAMTMUVudHJ1c3QubmV0 -IFNlY3VyZSBTZXJ2ZXIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxDTALBgNV -BAMTBENSTDEwKwYDVR0QBCQwIoAPMjAwMDAyMDQxNzIwMDBagQ8yMDIwMDIw -NDE3NTAwMFowCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFMtswGvjuz7L/CKc -/vuLkpyw8m4iMB0GA1UdDgQWBBTLbMBr47s+y/winP77i5KcsPJuIjAMBgNV -HRMEBTADAQH/MB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkq -hkiG9w0BAQQFAAOBgQBi24GRzsiad0Iv7L0no1MPUBvqTpLwqa+poLpIYcvv -yQbvH9X07t9WLebKahlzqlO+krNQAraFJnJj2HVQYnUUt7NQGj/KEQALhUVp -bbalrlHhStyCP2yMNLJ3a9kC9n8O6mUE8c1UyrrJzOCE98g+EZfTYAkYvAX/ -bIkz8OwVDw== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UE -ChMLRW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNf -MjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsT -HChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1 -c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEy -MjQxNzUwNTFaFw0xOTEyMjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0 -Lm5ldDFAMD4GA1UECxQ3d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29y -cC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDE5OTkg -RW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5uZXQgQ2Vy -dGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4 -QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/EC -DNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuXMlBvPci6Zgzj -/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzWnLLP -KQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZd -enoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH -4QIDAQABo3QwcjARBglghkgBhvhCAQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB -0RGAvtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdERgL7YibkIozH5oSQJ -FrlwMB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0B -AQUFAAOCAQEAWUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFh -fGPjK50xA3B20qMooPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVU -KcgF7bISKo30Axv/55IQh7A6tcOdBTcSo8f0FbnVpDkWm1M6I5HxqIKiaoho -wXkCIryqptau37AUX7iH0N18f3v/rxzP5tsHrV7bhZ3QKw0z2wTR5klAEyt2 -+z7pnIkPFc4YsIV4IU9rTw76NmfNB/L/CNDi3tm/Kq+4h4YhPATKt5Rof888 -6ZjXOP/swNlQ8C5LWK5Gb9Auw2DaclVyvUxFnmG6v4SBkgPR0ml8xQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIE7TCCBFagAwIBAgIEOAOR7jANBgkqhkiG9w0BAQQFADCByTELMAkGA1UE -BhMCVVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MUgwRgYDVQQLFD93d3cuZW50 -cnVzdC5uZXQvQ2xpZW50X0NBX0luZm8vQ1BTIGluY29ycC4gYnkgcmVmLiBs -aW1pdHMgbGlhYi4xJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExp -bWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENsaWVudCBDZXJ0aWZpY2F0 -aW9uIEF1dGhvcml0eTAeFw05OTEwMTIxOTI0MzBaFw0xOTEwMTIxOTU0MzBa -MIHJMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxSDBGBgNV -BAsUP3d3dy5lbnRydXN0Lm5ldC9DbGllbnRfQ0FfSW5mby9DUFMgaW5jb3Jw -LiBieSByZWYuIGxpbWl0cyBsaWFiLjElMCMGA1UECxMcKGMpIDE5OTkgRW50 -cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5uZXQgQ2xpZW50 -IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GL -ADCBhwKBgQDIOpleMRffrCdvkHvkGf9FozTC28GoT/Bo6oT9n3V5z8GKUZSv -x1cDR2SerYIbWtp/N3hHuzeYEpbOxhN979IMMFGpOZ5V+Pux5zDeg7K6PvHV -iTs7hbqqdCz+PzFur5GVbgbUB01LLFZHGARS2g4Qk79jkJvh34zmAqTmT173 -iwIBA6OCAeAwggHcMBEGCWCGSAGG+EIBAQQEAwIABzCCASIGA1UdHwSCARkw -ggEVMIHkoIHhoIHepIHbMIHYMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50 -cnVzdC5uZXQxSDBGBgNVBAsUP3d3dy5lbnRydXN0Lm5ldC9DbGllbnRfQ0Ff -SW5mby9DUFMgaW5jb3JwLiBieSByZWYuIGxpbWl0cyBsaWFiLjElMCMGA1UE -CxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50 -cnVzdC5uZXQgQ2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYD -VQQDEwRDUkwxMCygKqAohiZodHRwOi8vd3d3LmVudHJ1c3QubmV0L0NSTC9D -bGllbnQxLmNybDArBgNVHRAEJDAigA8xOTk5MTAxMjE5MjQzMFqBDzIwMTkx -MDEyMTkyNDMwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUxPucKXuXzUyW -/O5bs8qZdIuV6kwwHQYDVR0OBBYEFMT7nCl7l81MlvzuW7PKmXSLlepMMAwG -A1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI -hvcNAQEEBQADgYEAP66K8ddmAwWePvrqHEa7pFuPeJoSSJn59DXeDDYHAmsQ -OokUgZwxpnyyQbJq5wcBoUv5nyU7lsqZwz6hURzzwy5E97BnRqqS5TvaHBkU -ODDV4qIxJS7x7EU47fgGWANzYrAQMY9Av2TgXD7FTx/aEkP/TOYGJqibGapE -PHayXOw= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UE -BhMCVVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50 -cnVzdC5uZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl -MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UE -AxMxRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1 -dGhvcml0eTAeFw05OTA1MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQsw -CQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3 -dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlh -Yi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVkMTow -OAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp -b24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDNKIM0 -VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/I0dNxScZgSYMVHIN -iC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3wkrYKZImZNHk -mGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OCAdcwggHT -MBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHboIHY -pIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5 -BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChs -aW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBM -aW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENl -cnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNo -dHRwOi8vd3d3LmVudHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAi -gA8xOTk5MDUyNTE2MDk0MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMC -AQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYE -FPAXYhNVPbP/CgBr+1CEl/PtYtAaMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9 -B0EABAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEFBQADgYEAkNwwAvpkdMKn -CqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN95K+8cPV1ZVqBLssziY2Zcgx -xufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd2cNgQ4xYDiKWL2KjLB+6 -rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQG -EwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1 -cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4 -MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgx -LTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0 -eTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2R -FGiYCh7+2gRvE4RiIcPRfM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO -/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuv -K9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAGA1UdHwRp -MGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEt -MCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 -MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjAL -BgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gjIBBPM5iQn9Qw -HQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMBAf8w -GgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GB -AFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y -7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2u -FHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJV -UzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1 -aWZheCBTZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0 -MDAwMFoXDTIwMDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoT -E0VxdWlmYXggU2VjdXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJl -IEdsb2JhbCBlQnVzaW5lc3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAw -gYkCgYEAuucXkAJlsTRVPEnCUdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQy -td4zjTov2/KaelpzmKNc6fuKcxtc58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORR -OhI8bIpaVIRw28HFkM9yRcuoWcDNM50/o5brhTMhHD4ePmBudpxnhcXIw2EC -AwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAHMA8GA1UdEwEB/wQFMAMBAf8w -HwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1draGwwHQYDVR0OBBYEFL6o -oHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUAA4GBADDiAVGqx+pf -2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkAZ70Br83gcfxa -z2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv8qIYNMR1 -pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJV -UzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1 -aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcN -MjAwNjIxMDQwMDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZh -eCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2lu -ZXNzIENBLTEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fe -k6lfWg0XTzQaDJj0ItlZ1MRoRvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5 -/VGcqiTZ9J2DKocKIdMSODRsjQBuWqDZQu4aIZX5UkxVWsUPOE9G+m34LjXW -HXzr4vCwdYDIqROsvojvOm6rXyo4YgKwEnv+j6YDAgMBAAGjZjBkMBEGCWCG -SAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEp4 -MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRKeDJSEdtZFjZe38EUNkBq -R3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZMzfmpTMANmvPMZWnm -JXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+WB5Hh1Q+WKG1 -tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN/Bf+KpYr -tWKmpj29f5JZzVoqgrI3eQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQG -EwJVUzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlm -YXggU2VjdXJlIGVCdXNpbmVzcyBDQS0yMB4XDTk5MDYyMzEyMTQ0NVoXDTE5 -MDYyMzEyMTQ0NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkVxdWlmYXgg -U2VjdXJlMSYwJAYDVQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0Et -MjCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF -7Y6yEb3+6+e0dMKP/wXn2Z0GvxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKD -pkWNYmi7hRsgcDKqQM2mll/EcTc/BPO3QSQ5BxoeLmFYoBIL5aXfxavqN3HM -HMg3OrmXUqesxWoklE6ce8/AatbfIb0CAwEAAaOCAQkwggEFMHAGA1UdHwRp -MGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORXF1aWZheCBT -ZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0y -MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTkwNjIzMTIxNDQ1WjAL -BgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9euSBIplBqy/3YIHqngnYw -HQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQFMAMBAf8w -GgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GB -AAyGgq3oThr1jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy -0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkt -y3D1E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUmV+GRMOrN ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgw -FgYDVQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRy -dXN0IFNvbHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3Qg -R2xvYmFsIFJvb3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1 -MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYD -VQQLEx5HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMT -GkdURSBDeWJlclRydXN0IEdsb2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQCVD6C28FCc6HrHiM3dFw4usJTQGz0O9pTAipTHBsiQl8i4 -ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTSr41tiGeA5u2ylc9yMcqlHHK6XALn -ZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X404Wqk2kmhXBIgD8SFcd5tB8F -LztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3rGwnpXtlR22ciYaQqPEh3 -46B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l93PR2VX2bY1QY6fDq -81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0PlZPvy5TYnh+d -XIVtx6quTx8itc2VrbqnzPmrC3p/ ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIB+jCCAWMCAgGjMA0GCSqGSIb3DQEBBAUAMEUxCzAJBgNVBAYTAlVTMRgw -FgYDVQQKEw9HVEUgQ29ycG9yYXRpb24xHDAaBgNVBAMTE0dURSBDeWJlclRy -dXN0IFJvb3QwHhcNOTYwMjIzMjMwMTAwWhcNMDYwMjIzMjM1OTAwWjBFMQsw -CQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMRwwGgYDVQQD -ExNHVEUgQ3liZXJUcnVzdCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB -iQKBgQC45k+625h8cXyvRLfTD0bZZOWTwUKOx7pJjTUteueLveUFMVnGsS8K -DPufpz+iCWaEVh43KRuH6X4MypqfpX/1FZSj1aJGgthoTNE3FQZor734sLPw -KfWVWgkWYXcKIiXUT0Wqx73llt/51KiOQswkwB6RJ0q1bQaAYznEol44AwID -AQABMA0GCSqGSIb3DQEBBAUAA4GBABKzdcZfHeFhVYAA1IFLezEPI2PnPfMD -+fQ2qLvZ46WXTeorKeDWanOB5sCJo9Px4KWlIjeaY8JIILTbcuPI9tl8vrGv -U9oUtCG41tWW4/5ODFlitppK+ULdjG+BqXH/9ApybW1EDp3zdHSo1TRJ6V6e -6bR64eVaH4QwnNOfpSXY ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYT -AlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVz -dCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBC -MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UE -AxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEH -CIjaWC9mOSm9BXiLnTjoBbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlC -GDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet8u5fa9IAjbkU+BQVNdnARqN7 -csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+VcT4wt/lAj -Nvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdRe -JivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQAB -o1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9 -qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1luMrMTjANBgkq -hkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Qzxpe -R+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWV -Yrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF -PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot -2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeX -xx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm -Mw== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDdTCCAl2gAwIBAgILAgAAAAAA1ni3lAUwDQYJKoZIhvcNAQEEBQAwVzEL -MAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNV -BAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05 -ODA5MDExMjAwMDBaFw0xNDAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkw -FwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRsw -GQYDVQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUA -A4IBDwAwggEKAoIBAQDaDuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR -4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc -71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4 -bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgK -OOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMW -ea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DP -AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIABjAdBgNVHQ4EFgQUYHtmGkUNl8qJ -UC99BM00qP/8/UswDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOC -AQEArqqf/LfSyx9fOSkoGJ40yWxPbxrwZKJwSk8ThptgKJ7ogUmYfQq75bCd -PTbbjwVR/wkxKh/diXeeDy5slQTthsu0AD+EAk2AaioteAuubyuig0SDH81Q -gkwkr733pbTIWg/050deSY43lv6aiAU62cDbKYfmGZZHpzqmjIs8d/5GY6dT -2iHRrH5Jokvmw2dZL7OKDrssvamqQnw1wdh/1acxOk5jQzmvCLBhNIzTmKlD -NPYPhyk7ncJWWJh3w/cbrPad+D6qp1RF8PX51TFl/mtYnHGzHtdS6jIX/EBg -Hcl5JLL2bP2oZg6C3ZjL2sJETy6ge/L3ayx2EYRGinij4w== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlD -ZXJ0IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIElu -Yy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRp -b24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNv -bS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYy -NjAwMjIzM1oXDTE5MDYyNjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4x -NTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24g -QXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8x -IDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3 -DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfDcnWTq8+epvzzFlLWLU2f -NUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs2Ejcv8ECIMYkpChM -MFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqYJJgpp0lZpd34 -t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliEZwgs3x/b -e0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJn0Wu -PIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ +RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD +VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX +DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y +ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy +VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr +mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr +IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK +mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu +XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy +dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye +jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 +BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 +DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 +9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx +jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 +Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz +ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS +R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJV +UzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQL +EwhEU1RDQSBFMTAeFw05ODEyMTAxODEwMjNaFw0xODEyMTAxODQwMjNaMEYxCzAJ +BgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4x +ETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCg +bIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlREmlvMVW5SXIACH7TpWJENySZ +j9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+LthzfNHwJmm8fOR6Hh8AMthyUQncWlV +Sn5JTe2io74CTADKAqjuAQIxZA9SLRN0dja1erQtcQIBA6OCASQwggEgMBEGCWCG +SAGG+EIBAQQEAwIABzBoBgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMx +JDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMI +RFNUQ0EgRTExDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5ODEyMTAxODEw +MjNagQ8yMDE4MTIxMDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFGp5 +fpFpRhgTCgJ3pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i ++DAMBgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqG +SIb3DQEBBQUAA4GBACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lN +QseSJqBcNJo4cvj9axY+IO6CizEqkzaFI4iKPANo08kJD038bKTaKHKTDomAsH3+ +gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4RbyhkwS7hp86W0N6w4pl +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIID2DCCAsACEQDQHkCLAAACfAAAAAIAAAABMA0GCSqGSIb3DQEBBQUAMIGpMQsw +CQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBMYWtlIENp +dHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UE +CxMIRFNUQ0EgWDExFjAUBgNVBAMTDURTVCBSb290Q0EgWDExITAfBgkqhkiG9w0B +CQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTAeFw05ODEyMDExODE4NTVaFw0wODExMjgx +ODE4NTVaMIGpMQswCQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMO +U2FsdCBMYWtlIENpdHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0 +IENvLjERMA8GA1UECxMIRFNUQ0EgWDExFjAUBgNVBAMTDURTVCBSb290Q0EgWDEx +ITAfBgkqhkiG9w0BCQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBANLGJrbnpT3BxGjVUG9TxW9JEwm4ryxIjRRqoxdf +WvnTLnUv2Chi0ZMv/E3Uq4flCMeZ55I/db3rJbQVwZsZPdJEjdd0IG03Ao9pk1uK +xBmd9LIO/BZsubEFkoPRhSxglD5FVaDZqwgh5mDoO3TymVBRaNADLbGAvqPYUrBE +zUNKcI5YhZXhTizWLUFv1oTnyJhEykfbLCSlaSbPa7gnYsP0yXqSI+0TZ4KuRS5F +5X5yP4WdlGIQ5jyRoa13AOAV7POEgHJ6jm5gl8ckWRA0g1vhpaRptlc1HHhZxtMv +OnNn7pTKBBMFYgZwI7P0fO5F2WQLW0mqpEPOJsREEmy43XkCAwEAATANBgkqhkiG +9w0BAQUFAAOCAQEAojeyP2n714Z5VEkxlTMr89EJFEliYIalsBHiUMIdBlc+Legz +ZL6bqq1fG03UmZWii5rJYnK1aerZWKs17RWiQ9a2vAd5ZWRzfdd5ynvVWlHG4VME +lo04z6MXrDlxawHDi1M8Y+nuecDkvpIyZHqzH5eUYr3qsiAVlfuX8ngvYzZAOONG +Dx3drJXK50uQe7FLqdTF65raqtWjlBRGjS0f8zrWkzr2Pnn86Oawde3uPclwx12q +gUtGJRzHbBXjlU4PqjI3lAoXJJIThFjSY28r9+ZbYgsTF7ANUkz+/m9c4pFuHf2k +Ytdo+o56T9II2pPc8JIRetDccpMMc5NihWjQ9A== +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJV +UzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQL +EwhEU1RDQSBFMjAeFw05ODEyMDkxOTE3MjZaFw0xODEyMDkxOTQ3MjZaMEYxCzAJ +BgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4x +ETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQC/ +k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fBw18DW9Fvrn5C6mYjuGODVvso +LeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87eZfCocfdPJmyMvMa1795JJ/9IKn3o +TQPMx7JSxhcxEzu1TdvIxPbDDyQq2gyd55FbgM2UnQIBA6OCASQwggEgMBEGCWCG +SAGG+EIBAQQEAwIABzBoBgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMx +JDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMI +RFNUQ0EgRTIxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5ODEyMDkxOTE3 +MjZagQ8yMDE4MTIwOTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFB6C +TShlgDzJQW6sNS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5 +WzAMBgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqG +SIb3DQEBBQUAA4GBAEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHR +xdf0CiUPPXiBng+xZ8SQTGPdXqfiup/1902lMXucKS1M/mQ+7LZT/uqb7YLbdHVL +B3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1mPnHfxsb1gYgAlihw6ID +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIID2DCCAsACEQDQHkCLAAB3bQAAAAEAAAAEMA0GCSqGSIb3DQEBBQUAMIGpMQsw +CQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBMYWtlIENp +dHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UE +CxMIRFNUQ0EgWDIxFjAUBgNVBAMTDURTVCBSb290Q0EgWDIxITAfBgkqhkiG9w0B +CQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTAeFw05ODExMzAyMjQ2MTZaFw0wODExMjcy +MjQ2MTZaMIGpMQswCQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMO +U2FsdCBMYWtlIENpdHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0 +IENvLjERMA8GA1UECxMIRFNUQ0EgWDIxFjAUBgNVBAMTDURTVCBSb290Q0EgWDIx +ITAfBgkqhkiG9w0BCQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBANx18IzAdZaawGIfJvfE4Zrq4FZzW5nNAUSoCLbV +p9oaBBg5kkp4o4HC9Xd6ULRw/5qrxsfKboNPQpj7Jgva3G3WqZlVUmfpKAOS3OWw +BZoPFflrWXJW8vo5/Kpo7g8fEIMv/J36F5bdguPmRX3AS4BEH+0s4IT9kVySVGkl +5WJp3OXuAFK9MwutdQKFp2RQLcUZGTDAJtvJ0/0uma1ZtQtN1EGuhUhDWdy3qOKi +3sOP17ihYqZoUFLkzzGnlIXan0YyF1bl8utmPRL/Q9uY73fPy4GNNLHGUEom0eQ+ +QVCvbK4iNC7Va26Dunm4dmVI2gkpZGMiuftHdoWMhkTLCdsCAwEAATANBgkqhkiG +9w0BAQUFAAOCAQEAtTYOXeFhKFoRZcA/gwN5Tb4opgsHAlKFzfiR0BBstWogWxyQ +2TA8xkieil5k+aFxd+8EJx8H6+Qm93N0yUQYGmbT4EOvkTvRyyzYdFQ6HE3K1GjN +I3wdEJ5F6fYAbqbNGf9PLCmPV03Ed5K+4EwJ+11EhmYhqLkyolbV6YyDfFk/xPEL +553snr2cGA4+wjl5KLcDDQjLxufZATdQEOzMYRZA1K8xdHv8PzGn0EdzMzkbzE5q +10mDEQb+64JYMzJM8FasHpwvVpp7wUocpf1VNs78lk30sPDst2yC7S8xmUJMqbIN +uBVd8d+6ybVK1GSYsyapMMj9puyrliGtf8J4tg== +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIEgzCCA+ygAwIBAgIEOJ725DANBgkqhkiG9w0BAQQFADCBtDEUMBIGA1UEChML +RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9HQ0NBX0NQUyBp +bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAyMDAw +IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENsaWVu +dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMDAyMDcxNjE2NDBaFw0yMDAy +MDcxNjQ2NDBaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 +LmVudHJ1c3QubmV0L0dDQ0FfQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp +YWIuKTElMCMGA1UECxMcKGMpIDIwMDAgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG +A1UEAxMqRW50cnVzdC5uZXQgQ2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCTdLS25MVL1qFof2LV7PdRV7Ny +Spj10InJrWPNTTVRaoTUrcloeW+46xHbh65cJFET8VQlhK8pK5/jgOLZy93GRUk0 +iJBeAZfv6lOm3fzB3ksqJeTpNfpVBQbliXrqpBFXO/x8PTbNZzVtpKklWb1m9fkn +5JVn1j+SgF7yNH0rhQIDAQABo4IBnjCCAZowEQYJYIZIAYb4QgEBBAQDAgAHMIHd +BgNVHR8EgdUwgdIwgc+ggcyggcmkgcYwgcMxFDASBgNVBAoTC0VudHJ1c3QubmV0 +MUAwPgYDVQQLFDd3d3cuZW50cnVzdC5uZXQvR0NDQV9DUFMgaW5jb3JwLiBieSBy +ZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMjAwMCBFbnRydXN0Lm5l +dCBMaW1pdGVkMTMwMQYDVQQDEypFbnRydXN0Lm5ldCBDbGllbnQgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMjAwMDAy +MDcxNjE2NDBagQ8yMDIwMDIwNzE2NDY0MFowCwYDVR0PBAQDAgEGMB8GA1UdIwQY +MBaAFISLdP3FjcD/J20gN0V8/i3OutN9MB0GA1UdDgQWBBSEi3T9xY3A/ydtIDdF +fP4tzrrTfTAMBgNVHRMEBTADAQH/MB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4w +AwIEkDANBgkqhkiG9w0BAQQFAAOBgQBObzWAO9GK9Q6nIMstZVXQkvTnhLUGJoMS +hAusO7JE7r3PQNsgDrpuFOow4DtifH+La3xKp9U1PL6oXOpLu5OOgGarDyn9TS2/ +GpsKkMWr2tGzhtQvJFJcem3G8v7lTRowjJDyutdKPkN+1MhQGof4T4HHdguEOnKd +zmVml64mXg== +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIElTCCA/6gAwIBAgIEOJsRPDANBgkqhkiG9w0BAQQFADCBujEUMBIGA1UEChML +RW50cnVzdC5uZXQxPzA9BgNVBAsUNnd3dy5lbnRydXN0Lm5ldC9TU0xfQ1BTIGlu +Y29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDIwMDAg +RW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5uZXQgU2VjdXJl +IFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMDAyMDQxNzIwMDBa +Fw0yMDAyMDQxNzUwMDBaMIG6MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDE/MD0GA1UE +CxQ2d3d3LmVudHJ1c3QubmV0L1NTTF9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p +dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMjAwMCBFbnRydXN0Lm5ldCBMaW1pdGVk +MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp +b24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDHwV9OcfHO +8GCGD9JYf9Mzly0XonUwtZZkJi9ow0SrqHXmAGc0V55lxyKbc+bT3QgON1WqJUaB +bL3+qPZ1V1eMkGxKwz6LS0MKyRFWmponIpnPVZ5h2QLifLZ8OAfc439PmrkDQYC2 +dWcTC5/oVzbIXQA23mYU2m52H083jIITiQIDAQABo4IBpDCCAaAwEQYJYIZIAYb4 +QgEBBAQDAgAHMIHjBgNVHR8EgdswgdgwgdWggdKggc+kgcwwgckxFDASBgNVBAoT +C0VudHJ1c3QubmV0MT8wPQYDVQQLFDZ3d3cuZW50cnVzdC5uZXQvU1NMX0NQUyBp +bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAyMDAw +IEVudHJ1c3QubmV0IExpbWl0ZWQxOjA4BgNVBAMTMUVudHJ1c3QubmV0IFNlY3Vy +ZSBTZXJ2ZXIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxDTALBgNVBAMTBENSTDEw +KwYDVR0QBCQwIoAPMjAwMDAyMDQxNzIwMDBagQ8yMDIwMDIwNDE3NTAwMFowCwYD +VR0PBAQDAgEGMB8GA1UdIwQYMBaAFMtswGvjuz7L/CKc/vuLkpyw8m4iMB0GA1Ud +DgQWBBTLbMBr47s+y/winP77i5KcsPJuIjAMBgNVHRMEBTADAQH/MB0GCSqGSIb2 +fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0BAQQFAAOBgQBi24GRzsia +d0Iv7L0no1MPUBvqTpLwqa+poLpIYcvvyQbvH9X07t9WLebKahlzqlO+krNQAraF +JnJj2HVQYnUUt7NQGj/KEQALhUVpbbalrlHhStyCP2yMNLJ3a9kC9n8O6mUE8c1U +yrrJzOCE98g+EZfTYAkYvAX/bIkz8OwVDw== +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML +RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp +bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 +IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0xOTEy +MjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 +LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp +YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG +A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq +K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe +sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX +MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT +XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ +HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH +4QIDAQABo3QwcjARBglghkgBhvhCAQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGA +vtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdERgL7YibkIozH5oSQJFrlwMB0G +CSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEA +WUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo +oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQ +h7A6tcOdBTcSo8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18 +f3v/rxzP5tsHrV7bhZ3QKw0z2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfN +B/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjXOP/swNlQ8C5LWK5Gb9Auw2DaclVy +vUxFnmG6v4SBkgPR0ml8xQ== +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIE7TCCBFagAwIBAgIEOAOR7jANBgkqhkiG9w0BAQQFADCByTELMAkGA1UEBhMC +VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MUgwRgYDVQQLFD93d3cuZW50cnVzdC5u +ZXQvQ2xpZW50X0NBX0luZm8vQ1BTIGluY29ycC4gYnkgcmVmLiBsaW1pdHMgbGlh +Yi4xJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV +BAMTKkVudHJ1c3QubmV0IENsaWVudCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe +Fw05OTEwMTIxOTI0MzBaFw0xOTEwMTIxOTU0MzBaMIHJMQswCQYDVQQGEwJVUzEU +MBIGA1UEChMLRW50cnVzdC5uZXQxSDBGBgNVBAsUP3d3dy5lbnRydXN0Lm5ldC9D +bGllbnRfQ0FfSW5mby9DUFMgaW5jb3JwLiBieSByZWYuIGxpbWl0cyBsaWFiLjEl +MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMq +RW50cnVzdC5uZXQgQ2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0G +CSqGSIb3DQEBAQUAA4GLADCBhwKBgQDIOpleMRffrCdvkHvkGf9FozTC28GoT/Bo +6oT9n3V5z8GKUZSvx1cDR2SerYIbWtp/N3hHuzeYEpbOxhN979IMMFGpOZ5V+Pux +5zDeg7K6PvHViTs7hbqqdCz+PzFur5GVbgbUB01LLFZHGARS2g4Qk79jkJvh34zm +AqTmT173iwIBA6OCAeAwggHcMBEGCWCGSAGG+EIBAQQEAwIABzCCASIGA1UdHwSC +ARkwggEVMIHkoIHhoIHepIHbMIHYMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50 +cnVzdC5uZXQxSDBGBgNVBAsUP3d3dy5lbnRydXN0Lm5ldC9DbGllbnRfQ0FfSW5m +by9DUFMgaW5jb3JwLiBieSByZWYuIGxpbWl0cyBsaWFiLjElMCMGA1UECxMcKGMp +IDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5uZXQg +Q2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCyg +KqAohiZodHRwOi8vd3d3LmVudHJ1c3QubmV0L0NSTC9DbGllbnQxLmNybDArBgNV +HRAEJDAigA8xOTk5MTAxMjE5MjQzMFqBDzIwMTkxMDEyMTkyNDMwWjALBgNVHQ8E +BAMCAQYwHwYDVR0jBBgwFoAUxPucKXuXzUyW/O5bs8qZdIuV6kwwHQYDVR0OBBYE +FMT7nCl7l81MlvzuW7PKmXSLlepMMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EA +BAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEEBQADgYEAP66K8ddmAwWePvrqHEa7 +pFuPeJoSSJn59DXeDDYHAmsQOokUgZwxpnyyQbJq5wcBoUv5nyU7lsqZwz6hURzz +wy5E97BnRqqS5TvaHBkUODDV4qIxJS7x7EU47fgGWANzYrAQMY9Av2TgXD7FTx/a +EkP/TOYGJqibGapEPHayXOw= +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC +VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u +ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc +KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u +ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1 +MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE +ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j +b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF +bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg +U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA +A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/ +I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3 +wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC +AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb +oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5 +BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p +dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk +MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp +b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu +dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0 +MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi +E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa +MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI +hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN +95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd +2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV +UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy +dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1 +MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx +dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B +AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f +BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A +cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC +AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ +MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm +aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw +ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj +IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF +MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA +A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y +7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh +1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4 +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBT +ZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIw +MDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0VxdWlmYXggU2Vj +dXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEdsb2JhbCBlQnVzaW5l +c3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRVPEnC +UdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc +58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/ +o5brhTMhHD4ePmBudpxnhcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAH +MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1dr +aGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUA +A4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkA +Z70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv +8qIYNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBT +ZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQw +MDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5j +LjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwgZ8wDQYJ +KoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ1MRo +RvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBu +WqDZQu4aIZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKw +Env+j6YDAgMBAAGjZjBkMBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTAD +AQH/MB8GA1UdIwQYMBaAFEp4MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRK +eDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZM +zfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+ +WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN +/Bf+KpYrtWKmpj29f5JZzVoqgrI3eQ== +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2Vj +dXJlIGVCdXNpbmVzcyBDQS0yMB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0 +NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkVxdWlmYXggU2VjdXJlMSYwJAYD +VQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCBnzANBgkqhkiG9w0B +AQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn2Z0G +vxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/ +BPO3QSQ5BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0C +AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEX +MBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJl +IGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTkw +NjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9euSBIplBq +y/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQF +MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA +A4GBAAyGgq3oThr1jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy +0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1 +E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUmV+GRMOrN +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD +VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv +bHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv +b3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1MQswCQYDVQQGEwJV +UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU +cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds +b2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrH +iM3dFw4usJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTS +r41tiGeA5u2ylc9yMcqlHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X4 +04Wqk2kmhXBIgD8SFcd5tB8FLztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3r +GwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l9 +3PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0P +lZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIB+jCCAWMCAgGjMA0GCSqGSIb3DQEBBAUAMEUxCzAJBgNVBAYTAlVTMRgwFgYD +VQQKEw9HVEUgQ29ycG9yYXRpb24xHDAaBgNVBAMTE0dURSBDeWJlclRydXN0IFJv +b3QwHhcNOTYwMjIzMjMwMTAwWhcNMDYwMjIzMjM1OTAwWjBFMQswCQYDVQQGEwJV +UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMRwwGgYDVQQDExNHVEUgQ3liZXJU +cnVzdCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC45k+625h8cXyv +RLfTD0bZZOWTwUKOx7pJjTUteueLveUFMVnGsS8KDPufpz+iCWaEVh43KRuH6X4M +ypqfpX/1FZSj1aJGgthoTNE3FQZor734sLPwKfWVWgkWYXcKIiXUT0Wqx73llt/5 +1KiOQswkwB6RJ0q1bQaAYznEol44AwIDAQABMA0GCSqGSIb3DQEBBAUAA4GBABKz +dcZfHeFhVYAA1IFLezEPI2PnPfMD+fQ2qLvZ46WXTeorKeDWanOB5sCJo9Px4KWl +IjeaY8JIILTbcuPI9tl8vrGvU9oUtCG41tWW4/5ODFlitppK+ULdjG+BqXH/9Apy +bW1EDp3zdHSo1TRJ6V6e6bR64eVaH4QwnNOfpSXY +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT +MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i +YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg +R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 +9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq +fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv +iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU +1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ +bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW +MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA +ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l +uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn +Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS +tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF +PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un +hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV +5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw== +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIDdTCCAl2gAwIBAgILAgAAAAAA1ni3lAUwDQYJKoZIhvcNAQEEBQAwVzELMAkG +A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv +b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw +MDBaFw0xNDAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i +YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT +aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ +jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp +xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp +1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG +snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ +U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 +9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIABjAdBgNVHQ4EFgQU +YHtmGkUNl8qJUC99BM00qP/8/UswDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0B +AQQFAAOCAQEArqqf/LfSyx9fOSkoGJ40yWxPbxrwZKJwSk8ThptgKJ7ogUmYfQq7 +5bCdPTbbjwVR/wkxKh/diXeeDy5slQTthsu0AD+EAk2AaioteAuubyuig0SDH81Q +gkwkr733pbTIWg/050deSY43lv6aiAU62cDbKYfmGZZHpzqmjIs8d/5GY6dT2iHR +rH5Jokvmw2dZL7OKDrssvamqQnw1wdh/1acxOk5jQzmvCLBhNIzTmKlDNPYPhyk7 +ncJWWJh3w/cbrPad+D6qp1RF8PX51TFl/mtYnHGzHtdS6jIX/EBgHcl5JLL2bP2o +Zg6C3ZjL2sJETy6ge/L3ayx2EYRGinij4w== +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz +BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y +aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG +9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMjIzM1oXDTE5MDYy +NjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y +azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw +Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl +cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfD +cnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs +2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqY +JJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliE +Zwgs3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJ +n0WuPIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A PhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu -----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIICXDCCAcWgAwIBAgIQCgEBAQAAAnwAAAALAAAAAjANBgkqhkiG9w0BAQUFADA6 +MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJp +dHkgMTAyNCBWMzAeFw0wMTAyMjIyMTAxNDlaFw0yNjAyMjIyMDAxNDlaMDoxGTAX +BgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJTQSBTZWN1cml0eSAx +MDI0IFYzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDV3f5mCc8kPD6ugU5O +isRpgFtZO9+5TUzKtS3DJy08rwBCbbwoppbPf9dYrIMKo1W1exeQFYRMiu4mmdxY +78c4pqqv0I5CyGLXq6yp+0p9v+r+Ek3d/yYtbzZUaMjShFbuklNhCbM/OZuoyZu9 +zp9+1BlqFikYvtc6adwlWzMaUQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBTEwBykB5T9zU0B1FTapQxf3q4FWjAd +BgNVHQ4EFgQUxMAcpAeU/c1NAdRU2qUMX96uBVowDQYJKoZIhvcNAQEFBQADgYEA +Py1q4yZDlX2Jl2X7deRyHUZXxGFraZ8SmyzVWujAovBDleMf6XbN3Ou8k6BlCsdN +T1+nr6JGFLkM88y9am63nd4lQtBU/55oc2PcJOsiv6hy8l4A4Q1OOkNumU4/iXgD +mMrzVcydro7BqkWY+o8aoI2II/EVQQ2lRj6RP4vr93E= +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6 +MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJp +dHkgMjA0OCBWMzAeFw0wMTAyMjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAX +BgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJTQSBTZWN1cml0eSAy +MDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAt49VcdKA3Xtp +eafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7Jylg +/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGl +wSMiuLgbWhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnh +AMFRD0xS+ARaqn1y07iHKrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2 +PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpu +AWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4EFgQUB8NR +MKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYc +HnmYv/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/ +Zb5gEydxiKRz44Rj0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+ +f00/FGj1EVDVwfSQpQgdMWD/YIwjVAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVO +rSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395nzIlQnQFgCi/vcEkllgVsRch +6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kApKnXwiJPZ9d3 +7CAFYd4= +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIDXDCCAsWgAwIBAgICA+owDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYTAkRF +MRAwDgYDVQQIEwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYDVQQKEzFU +QyBUcnVzdENlbnRlciBmb3IgU2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJI +MSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBDbGFzcyAyIENBMSkwJwYJKoZIhvcN +AQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAeFw05ODAzMDkxMTU5NTla +Fw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJERTEQMA4GA1UECBMHSGFtYnVy +ZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UEChMxVEMgVHJ1c3RDZW50ZXIgZm9y +IFNlY3VyaXR5IGluIERhdGEgTmV0d29ya3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1 +c3RDZW50ZXIgQ2xhc3MgMiBDQTEpMCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVA +dHJ1c3RjZW50ZXIuZGUwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANo46O0y +AClxgwENv4wB3NrGrTmkqYov1YtcaF9QxmL1Zr3KkSLsqh1R1z2zUbKDTl3LSbDw +TFXlay3HhQswHJJOgtTKAu33b77c4OMUuAVT8pr0VotanoWT0bSCVq5Nu6hLVxa8 +/vhYnvgpjbB7zXjJT6yLZwzxnPv8V5tXXE8NAgMBAAGjazBpMA8GA1UdEwEB/wQF +MAMBAf8wDgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3 +LnRydXN0Y2VudGVyLmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0G +CSqGSIb3DQEBBAUAA4GBAIRS+yjf/x91AbwBvgRWl2p0QiQxg/lGsQaKic+WLDO/ +jLVfenKhhQbOhvgFjuj5Jcrag4wGrOs2bYWRNAQ29ELw+HkuCkhcq8xRT3h2oNms +Gb0q0WkEKJHKNhAngFdb0lz1wlurZIFjdFH0l7/NEij3TWZ/p/AcASZ4smZHcFFk +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIDXDCCAsWgAwIBAgICA+swDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYTAkRF +MRAwDgYDVQQIEwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYDVQQKEzFU +QyBUcnVzdENlbnRlciBmb3IgU2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJI +MSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBDbGFzcyAzIENBMSkwJwYJKoZIhvcN +AQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAeFw05ODAzMDkxMTU5NTla +Fw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJERTEQMA4GA1UECBMHSGFtYnVy +ZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UEChMxVEMgVHJ1c3RDZW50ZXIgZm9y +IFNlY3VyaXR5IGluIERhdGEgTmV0d29ya3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1 +c3RDZW50ZXIgQ2xhc3MgMyBDQTEpMCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVA +dHJ1c3RjZW50ZXIuZGUwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALa0wTUF +Lg2N7KBAahwOJ6ZQkmtQGwfeLud2zODa/ISoXoxjaitN2U4CdhHBC/KNecoAtvGw +Dtf7pBc9r6tpepYnv68zoZoqWarEtTcI8hKlMbZD9TKWcSgoq40oht+77uMMfTDW +w1Krj10nnGvAo+cFa1dJRLNu6mTP0o56UHd3AgMBAAGjazBpMA8GA1UdEwEB/wQF +MAMBAf8wDgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3 +LnRydXN0Y2VudGVyLmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0G +CSqGSIb3DQEBBAUAA4GBABY9xs3Bu4VxhUafPiCPUSiZ7C1FIWMjWwS7TJC4iJIE +Tb19AaM/9uzO8d7+feXhPrvGq14L3T2WxMup1Pkm5gZOngylerpuw3yCGdHHsbHD +2w2Om0B8NwvxXej9H5CIpQ5ON2QhqE6NtJ/x3kit1VYYUimLRzQSCdS7kjXvD9s0 +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIDITCCAoqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCByzELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD +VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT +ZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFBlcnNvbmFsIEJhc2lj +IENBMSgwJgYJKoZIhvcNAQkBFhlwZXJzb25hbC1iYXNpY0B0aGF3dGUuY29tMB4X +DTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgcsxCzAJBgNVBAYTAlpBMRUw +EwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEaMBgGA1UE +ChMRVGhhd3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2Vy +dmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQZXJzb25hbCBCYXNpYyBD +QTEoMCYGCSqGSIb3DQEJARYZcGVyc29uYWwtYmFzaWNAdGhhd3RlLmNvbTCBnzAN +BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAvLyTU23AUE+CFeZIlDWmWr5vQvoPR+53 +dXLdjUmbllegeNTKP1GzaQuRdhciB5dqxFGTS+CN7zeVoQxN2jSQHReJl+A1OFdK +wPQIcOk8RHtQfmGakOMj04gRRif1CwcOu93RfyAKiLlWCy4cgNrx454p7xS9CkT7 +G1sY0b8jkyECAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQF +AAOBgQAt4plrsD16iddZopQBHyvdEktTwq1/qqcAXJFAVyVKOKqEcLnZgA+le1z7 +c8a914phXAPjLSeoF+CEhULcXpvGt7Jtu3Sv5D/Lp7ew4F2+eIMllNLbgQ95B21P +9DkVWlIBe94y1k049hJcBlDfBVu9FEuh3ym6O0GN92NWod8isQ== +-----END CERTIFICATE----- + -----BEGIN CERTIFICATE----- -MIICXDCCAcWgAwIBAgIQCgEBAQAAAnwAAAALAAAAAjANBgkqhkiG9w0BAQUF -ADA6MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0Eg -U2VjdXJpdHkgMTAyNCBWMzAeFw0wMTAyMjIyMTAxNDlaFw0yNjAyMjIyMDAx -NDlaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJT -QSBTZWN1cml0eSAxMDI0IFYzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB -gQDV3f5mCc8kPD6ugU5OisRpgFtZO9+5TUzKtS3DJy08rwBCbbwoppbPf9dY -rIMKo1W1exeQFYRMiu4mmdxY78c4pqqv0I5CyGLXq6yp+0p9v+r+Ek3d/yYt -bzZUaMjShFbuklNhCbM/OZuoyZu9zp9+1BlqFikYvtc6adwlWzMaUQIDAQAB -o2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSME -GDAWgBTEwBykB5T9zU0B1FTapQxf3q4FWjAdBgNVHQ4EFgQUxMAcpAeU/c1N -AdRU2qUMX96uBVowDQYJKoZIhvcNAQEFBQADgYEAPy1q4yZDlX2Jl2X7deRy -HUZXxGFraZ8SmyzVWujAovBDleMf6XbN3Ou8k6BlCsdNT1+nr6JGFLkM88y9 -am63nd4lQtBU/55oc2PcJOsiv6hy8l4A4Q1OOkNumU4/iXgDmMrzVcydro7B -qkWY+o8aoI2II/EVQQ2lRj6RP4vr93E= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUF -ADA6MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0Eg -U2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAyMjIyMDM5MjNaFw0yNjAyMjIyMDM5 -MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJT -QSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB -CgKCAQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37 -RqtBaB4Y6lXIL5F4iSj7Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E -0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgbWhOHV4PR8CDn6E8jQrAApX2J -6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iHKrtjEAMq -s6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzD -uvsf9/UP+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2Mw -YTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAW -gBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4EFgQUB8NRMKSq6UWuNST6 -/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmYv/3V -EhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5g -EydxiKRz44Rj0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+ -f00/FGj1EVDVwfSQpQgdMWD/YIwjVAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJq -aHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395nzIlQnQFgCi/vcEk -llgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA -pKnXwiJPZ9d37CAFYd4= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDXDCCAsWgAwIBAgICA+owDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYT -AkRFMRAwDgYDVQQIEwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYD -VQQKEzFUQyBUcnVzdENlbnRlciBmb3IgU2VjdXJpdHkgaW4gRGF0YSBOZXR3 -b3JrcyBHbWJIMSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBDbGFzcyAyIENB -MSkwJwYJKoZIhvcNAQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAe -Fw05ODAzMDkxMTU5NTlaFw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJE -RTEQMA4GA1UECBMHSGFtYnVyZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UE -ChMxVEMgVHJ1c3RDZW50ZXIgZm9yIFNlY3VyaXR5IGluIERhdGEgTmV0d29y -a3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTEp -MCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVAdHJ1c3RjZW50ZXIuZGUwgZ8w -DQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANo46O0yAClxgwENv4wB3NrGrTmk -qYov1YtcaF9QxmL1Zr3KkSLsqh1R1z2zUbKDTl3LSbDwTFXlay3HhQswHJJO -gtTKAu33b77c4OMUuAVT8pr0VotanoWT0bSCVq5Nu6hLVxa8/vhYnvgpjbB7 -zXjJT6yLZwzxnPv8V5tXXE8NAgMBAAGjazBpMA8GA1UdEwEB/wQFMAMBAf8w -DgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3LnRy -dXN0Y2VudGVyLmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0G -CSqGSIb3DQEBBAUAA4GBAIRS+yjf/x91AbwBvgRWl2p0QiQxg/lGsQaKic+W -LDO/jLVfenKhhQbOhvgFjuj5Jcrag4wGrOs2bYWRNAQ29ELw+HkuCkhcq8xR -T3h2oNmsGb0q0WkEKJHKNhAngFdb0lz1wlurZIFjdFH0l7/NEij3TWZ/p/Ac -ASZ4smZHcFFk ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDXDCCAsWgAwIBAgICA+swDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYT -AkRFMRAwDgYDVQQIEwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYD -VQQKEzFUQyBUcnVzdENlbnRlciBmb3IgU2VjdXJpdHkgaW4gRGF0YSBOZXR3 -b3JrcyBHbWJIMSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBDbGFzcyAzIENB -MSkwJwYJKoZIhvcNAQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAe -Fw05ODAzMDkxMTU5NTlaFw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJE -RTEQMA4GA1UECBMHSGFtYnVyZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UE -ChMxVEMgVHJ1c3RDZW50ZXIgZm9yIFNlY3VyaXR5IGluIERhdGEgTmV0d29y -a3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTEp -MCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVAdHJ1c3RjZW50ZXIuZGUwgZ8w -DQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALa0wTUFLg2N7KBAahwOJ6ZQkmtQ -GwfeLud2zODa/ISoXoxjaitN2U4CdhHBC/KNecoAtvGwDtf7pBc9r6tpepYn -v68zoZoqWarEtTcI8hKlMbZD9TKWcSgoq40oht+77uMMfTDWw1Krj10nnGvA -o+cFa1dJRLNu6mTP0o56UHd3AgMBAAGjazBpMA8GA1UdEwEB/wQFMAMBAf8w -DgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3LnRy -dXN0Y2VudGVyLmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0G -CSqGSIb3DQEBBAUAA4GBABY9xs3Bu4VxhUafPiCPUSiZ7C1FIWMjWwS7TJC4 -iJIETb19AaM/9uzO8d7+feXhPrvGq14L3T2WxMup1Pkm5gZOngylerpuw3yC -GdHHsbHD2w2Om0B8NwvxXej9H5CIpQ5ON2QhqE6NtJ/x3kit1VYYUimLRzQS -CdS7kjXvD9s0 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDITCCAoqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCByzELMAkGA1UEBhMC -WkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3du -MRowGAYDVQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlm -aWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFBl -cnNvbmFsIEJhc2ljIENBMSgwJgYJKoZIhvcNAQkBFhlwZXJzb25hbC1iYXNp -Y0B0aGF3dGUuY29tMB4XDTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVow -gcsxCzAJBgNVBAYTAlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNV -BAcTCUNhcGUgVG93bjEaMBgGA1UEChMRVGhhd3RlIENvbnN1bHRpbmcxKDAm -BgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24xITAfBgNV -BAMTGFRoYXd0ZSBQZXJzb25hbCBCYXNpYyBDQTEoMCYGCSqGSIb3DQEJARYZ -cGVyc29uYWwtYmFzaWNAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOB -jQAwgYkCgYEAvLyTU23AUE+CFeZIlDWmWr5vQvoPR+53dXLdjUmbllegeNTK -P1GzaQuRdhciB5dqxFGTS+CN7zeVoQxN2jSQHReJl+A1OFdKwPQIcOk8RHtQ -fmGakOMj04gRRif1CwcOu93RfyAKiLlWCy4cgNrx454p7xS9CkT7G1sY0b8j -kyECAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOB -gQAt4plrsD16iddZopQBHyvdEktTwq1/qqcAXJFAVyVKOKqEcLnZgA+le1z7 -c8a914phXAPjLSeoF+CEhULcXpvGt7Jtu3Sv5D/Lp7ew4F2+eIMllNLbgQ95 -B21P9DkVWlIBe94y1k049hJcBlDfBVu9FEuh3ym6O0GN92NWod8isQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDLTCCApagAwIBAgIBADANBgkqhkiG9w0BAQQFADCB0TELMAkGA1UEBhMC -WkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3du -MRowGAYDVQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlm -aWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEkMCIGA1UEAxMbVGhhd3RlIFBl -cnNvbmFsIEZyZWVtYWlsIENBMSswKQYJKoZIhvcNAQkBFhxwZXJzb25hbC1m -cmVlbWFpbEB0aGF3dGUuY29tMB4XDTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIz -NTk1OVowgdExCzAJBgNVBAYTAlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUx -EjAQBgNVBAcTCUNhcGUgVG93bjEaMBgGA1UEChMRVGhhd3RlIENvbnN1bHRp -bmcxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24x -JDAiBgNVBAMTG1RoYXd0ZSBQZXJzb25hbCBGcmVlbWFpbCBDQTErMCkGCSqG -SIb3DQEJARYccGVyc29uYWwtZnJlZW1haWxAdGhhd3RlLmNvbTCBnzANBgkq -hkiG9w0BAQEFAAOBjQAwgYkCgYEA1GnX1LCUZFtx6UfYDFG26nKRsIRefS0N -j3sS34UldSh0OkIsYyeflXtL734Zhx2G6qPduc6WZBrCFG5ErHzmj+hND3Ef -QDimAKOHePb5lIZererAXnbr2RSjXW56fAylS1V/Bhkpf56aJtVquzgkCGqY -x7Hao5iR/Xnb5VrEHLkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq -hkiG9w0BAQQFAAOBgQDH7JJ+Tvj1lqVnYiqk8E0RYNBvjWBYYawmu1I1XAjP -MPuoSpaKH2JCI4wXD/S6ZJwXrEcp352YXtJsYHFcoqzceePnbgBHH7UNKOgC -neSa/RP0ptl8sfjcXyMmCZGAc9AUG95DqYMl8uacLxXK/qarigd1iwzdUYRr -5PjRzneigQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDKTCCApKgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBzzELMAkGA1UEBhMC -WkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3du -MRowGAYDVQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlm -aWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEjMCEGA1UEAxMaVGhhd3RlIFBl -cnNvbmFsIFByZW1pdW0gQ0ExKjAoBgkqhkiG9w0BCQEWG3BlcnNvbmFsLXBy -ZW1pdW1AdGhhd3RlLmNvbTAeFw05NjAxMDEwMDAwMDBaFw0yMDEyMzEyMzU5 -NTlaMIHPMQswCQYDVQQGEwJaQTEVMBMGA1UECBMMV2VzdGVybiBDYXBlMRIw -EAYDVQQHEwlDYXBlIFRvd24xGjAYBgNVBAoTEVRoYXd0ZSBDb25zdWx0aW5n -MSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMSMw -IQYDVQQDExpUaGF3dGUgUGVyc29uYWwgUHJlbWl1bSBDQTEqMCgGCSqGSIb3 -DQEJARYbcGVyc29uYWwtcHJlbWl1bUB0aGF3dGUuY29tMIGfMA0GCSqGSIb3 -DQEBAQUAA4GNADCBiQKBgQDJZtn4B0TPuYwu8KHvE0VsBd/eJxZRNkERbGw7 -7f4QfRKe5ZtCmv5gMcNmt3M6SK5O0DI3lIi1DbbZ8/JE2dWIEt12TfIa/G8j -Hnrx2JhFTgcQ7xZC0EN1bUre4qrJMf8fAHB8Zs8QJQi6+u4A6UYDZicRFTuq -W/KY3TZCstqIdQIDAQABoxMwETAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 -DQEBBAUAA4GBAGk2ifc0KjNyL2071CKyuG+axTZmDhs8obF1Wub9NdP4qPIH -b4Vnjt4rueIXsDqg8A6iAJrf8xQVbrvIhVqYgPn/vnQdPfP+MCXRNzRn+qVx -eTBhKXLA4CxM+1bkOqhv5TJZUtt1KFBZDPgLGeSs2a+WjS9Q2wfD6h+rM+D1 -KzGJ ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMC -WkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3du -MR0wGwYDVQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2Vy -dGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3Rl -IFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNl -cnZlckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1 -OVowgc4xCzAJBgNVBAYTAlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQ -BgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMUVGhhd3RlIENvbnN1bHRpbmcg -Y2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24x -ITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3 -DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0B -AQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhI -NTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQug2SBhRz1JPL -lyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMRuHM/qgeN -9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0B -AQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI -hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZ -a4JMpAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcU -Qg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMC -WkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3du -MR0wGwYDVQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2Vy -dGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3Rl -IFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0 -ZS5jb20wHhcNOTYwODAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkG -A1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2Fw -ZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UE -CxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQ -VGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRz -QHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANOkUG7I -/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91yekIYfUGbTBuFRkC -6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCXL+eQbcAoQpnX -TEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGjEzARMA8G -A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG7oWD -TSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e -QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdni -TCxZqdq5snUb9kLy78fyGPmJvKP/iiMucEc= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICoTCCAgqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBizELMAkGA1UEBhMC -WkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTEUMBIGA1UEBxMLRHVyYmFudmls -bGUxDzANBgNVBAoTBlRoYXd0ZTEdMBsGA1UECxMUVGhhd3RlIENlcnRpZmlj -YXRpb24xHzAdBgNVBAMTFlRoYXd0ZSBUaW1lc3RhbXBpbmcgQ0EwHhcNOTcw -MTAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBizELMAkGA1UEBhMCWkExFTAT -BgNVBAgTDFdlc3Rlcm4gQ2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzAN -BgNVBAoTBlRoYXd0ZTEdMBsGA1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24x -HzAdBgNVBAMTFlRoYXd0ZSBUaW1lc3RhbXBpbmcgQ0EwgZ8wDQYJKoZIhvcN -AQEBBQADgY0AMIGJAoGBANYrWHhhRYZT6jR7UZztsOYuGA7+4F+oJ9O0yeB8 -WU4WDnNUYMF/9p8u6TqFJBU820cEY8OexJQaWt9MevPZQx08EHp5JduQ/vBR -5zDWQQD9nyjfeb6Uu522FOMjhdepQeBMpHmwKxqL8vg7ij5FrHGSALSQQZj7 -X+36ty6K+Ig3AgMBAAGjEzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcN -AQEEBQADgYEAZ9viwuaHPUCDhjc1fR/OmsMMZiCouqoEiYbC9RAIDb/LogWK -0E02PvTX72nGXuSwlG9KuefeW4i2e9vjJ+V2w/A1wcu1J5szedyQpgCed/r8 -zSeUQhac0xxo7L9c3eWpexAKMnRUEzGLhQOEkbdYATAUOK8oyvyxUBkZCayJ -SdM= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEZDCCA0ygAwIBAgIQRL4Mi1AAJLQR0zYwS8AzdzANBgkqhkiG9w0BAQUF -ADCBozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0 -IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEw -HwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVU -Ti1VU0VSRmlyc3QtTmV0d29yayBBcHBsaWNhdGlvbnMwHhcNOTkwNzA5MTg0 -ODM5WhcNMTkwNzA5MTg1NzQ5WjCBozELMAkGA1UEBhMCVVMxCzAJBgNVBAgT -AlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVT -RVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVz -dC5jb20xKzApBgNVBAMTIlVUTi1VU0VSRmlyc3QtTmV0d29yayBBcHBsaWNh -dGlvbnMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCz+5Gh5DZV -hawGNFugmliy+LUPBXeDrjKxdpJo7CNKyXY/45y2N3kDuatpjQclthln5LAb -GHNhSuh+zdMvZOOmfAz6F4CjDUeJT1FxL+78P/m4FoCHiZMlIJpDgmkkdihZ -NaEdwH+DBmQWICzTSaSFtMBhf1EI+GgVkYDLpdXuOzr0hAReYFmnjDRy7rh4 -xdE7EkpvfmUnuaRVxblvQ6TFHSyZwFKkeEwVs0CYCGtDxgGwenv1axwiP8vv -/6jQOkt2FZ7S0cYu49tXGzKiuG/ohqY/cKvlcJKrRB5AUPuco2LkbG6gyN7i -gEL66S/ozjIEj3yNtxyjNTwV3Z7DrpelAgMBAAGjgZEwgY4wCwYDVR0PBAQD -AgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFPqGydvguul49Uuo1hXf -8NPhahQ8ME8GA1UdHwRIMEYwRKBCoECGPmh0dHA6Ly9jcmwudXNlcnRydXN0 -LmNvbS9VVE4tVVNFUkZpcnN0LU5ldHdvcmtBcHBsaWNhdGlvbnMuY3JsMA0G -CSqGSIb3DQEBBQUAA4IBAQCk8yXM0dSRgyLQzDKrm5ZONJFUICU0YV8qAhXh -i6r/fWRRzwr/vH3YIWp4yy9Rb/hCHTO967V7lMPDqaAt39EpHx3+jz+7qEUq -f9FuVSTiuwL7MT++6LzsQCv4AdRWOOTKRIK1YSAhZ2X28AvnNPilwpyjXEAf -hZOVBt5P1CeptqX8Fs1zMT+4ZSfP1FMa8Kxun08FDAOBp4QpxFq9ZFdyrTvP -NximmMatBrTcCKME1SmklpoSZ0qMYEWd8SOasACcaLWYUNPvji6SZbFIPiG+ -FTAqDbUMo2s/rn9X9R+WfN9v3YIwLGUbQErNaLly7HF27FSOH4UMAWr6pjis -H8SE ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlD -ZXJ0IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIElu -Yy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRp -b24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNv -bS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYy -NTIyMjM0OFoXDTE5MDYyNTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4x -NTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24g -QXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8x -IDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3 -DQEBAQUAA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9YLqdUHAZu9OqNSLwxlBfw -8068srg1knaw0KWlAdcAAxIiGQj4/xEjm84H9b9pGib+TunRf50sQB1ZaG6m -+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCmDuJWBQ8YTfwggtFzVXSN -dnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0LBwGlN+V -YH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLWI8so -gTLDAHkY7FkXicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPw +MIIDLTCCApagAwIBAgIBADANBgkqhkiG9w0BAQQFADCB0TELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD +VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT +ZXJ2aWNlcyBEaXZpc2lvbjEkMCIGA1UEAxMbVGhhd3RlIFBlcnNvbmFsIEZyZWVt +YWlsIENBMSswKQYJKoZIhvcNAQkBFhxwZXJzb25hbC1mcmVlbWFpbEB0aGF3dGUu +Y29tMB4XDTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgdExCzAJBgNVBAYT +AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEa +MBgGA1UEChMRVGhhd3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0NlcnRpZmljYXRp +b24gU2VydmljZXMgRGl2aXNpb24xJDAiBgNVBAMTG1RoYXd0ZSBQZXJzb25hbCBG +cmVlbWFpbCBDQTErMCkGCSqGSIb3DQEJARYccGVyc29uYWwtZnJlZW1haWxAdGhh +d3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA1GnX1LCUZFtx6UfY +DFG26nKRsIRefS0Nj3sS34UldSh0OkIsYyeflXtL734Zhx2G6qPduc6WZBrCFG5E +rHzmj+hND3EfQDimAKOHePb5lIZererAXnbr2RSjXW56fAylS1V/Bhkpf56aJtVq +uzgkCGqYx7Hao5iR/Xnb5VrEHLkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zAN +BgkqhkiG9w0BAQQFAAOBgQDH7JJ+Tvj1lqVnYiqk8E0RYNBvjWBYYawmu1I1XAjP +MPuoSpaKH2JCI4wXD/S6ZJwXrEcp352YXtJsYHFcoqzceePnbgBHH7UNKOgCneSa +/RP0ptl8sfjcXyMmCZGAc9AUG95DqYMl8uacLxXK/qarigd1iwzdUYRr5PjRznei +gQ== +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIDKTCCApKgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBzzELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD +VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT +ZXJ2aWNlcyBEaXZpc2lvbjEjMCEGA1UEAxMaVGhhd3RlIFBlcnNvbmFsIFByZW1p +dW0gQ0ExKjAoBgkqhkiG9w0BCQEWG3BlcnNvbmFsLXByZW1pdW1AdGhhd3RlLmNv +bTAeFw05NjAxMDEwMDAwMDBaFw0yMDEyMzEyMzU5NTlaMIHPMQswCQYDVQQGEwJa +QTEVMBMGA1UECBMMV2VzdGVybiBDYXBlMRIwEAYDVQQHEwlDYXBlIFRvd24xGjAY +BgNVBAoTEVRoYXd0ZSBDb25zdWx0aW5nMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9u +IFNlcnZpY2VzIERpdmlzaW9uMSMwIQYDVQQDExpUaGF3dGUgUGVyc29uYWwgUHJl +bWl1bSBDQTEqMCgGCSqGSIb3DQEJARYbcGVyc29uYWwtcHJlbWl1bUB0aGF3dGUu +Y29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJZtn4B0TPuYwu8KHvE0Vs +Bd/eJxZRNkERbGw77f4QfRKe5ZtCmv5gMcNmt3M6SK5O0DI3lIi1DbbZ8/JE2dWI +Et12TfIa/G8jHnrx2JhFTgcQ7xZC0EN1bUre4qrJMf8fAHB8Zs8QJQi6+u4A6UYD +ZicRFTuqW/KY3TZCstqIdQIDAQABoxMwETAPBgNVHRMBAf8EBTADAQH/MA0GCSqG +SIb3DQEBBAUAA4GBAGk2ifc0KjNyL2071CKyuG+axTZmDhs8obF1Wub9NdP4qPIH +b4Vnjt4rueIXsDqg8A6iAJrf8xQVbrvIhVqYgPn/vnQdPfP+MCXRNzRn+qVxeTBh +KXLA4CxM+1bkOqhv5TJZUtt1KFBZDPgLGeSs2a+WjS9Q2wfD6h+rM+D1KzGJ +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD +VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy +dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t +MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB +MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG +A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp +b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl +cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv +bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE +VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ +ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR +uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG +9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI +hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM +pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg== +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD +VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEm +MCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wHhcNOTYwODAx +MDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT +DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3 +dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNl +cyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3 +DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD +gY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91 +yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCX +L+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGj +EzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG +7oWDTSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e +QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZ +qdq5snUb9kLy78fyGPmJvKP/iiMucEc= +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIICoTCCAgqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBizELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzAN +BgNVBAoTBlRoYXd0ZTEdMBsGA1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24xHzAd +BgNVBAMTFlRoYXd0ZSBUaW1lc3RhbXBpbmcgQ0EwHhcNOTcwMTAxMDAwMDAwWhcN +MjAxMjMxMjM1OTU5WjCBizELMAkGA1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4g +Q2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzANBgNVBAoTBlRoYXd0ZTEdMBsG +A1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24xHzAdBgNVBAMTFlRoYXd0ZSBUaW1l +c3RhbXBpbmcgQ0EwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANYrWHhhRYZT +6jR7UZztsOYuGA7+4F+oJ9O0yeB8WU4WDnNUYMF/9p8u6TqFJBU820cEY8OexJQa +Wt9MevPZQx08EHp5JduQ/vBR5zDWQQD9nyjfeb6Uu522FOMjhdepQeBMpHmwKxqL +8vg7ij5FrHGSALSQQZj7X+36ty6K+Ig3AgMBAAGjEzARMA8GA1UdEwEB/wQFMAMB +Af8wDQYJKoZIhvcNAQEEBQADgYEAZ9viwuaHPUCDhjc1fR/OmsMMZiCouqoEiYbC +9RAIDb/LogWK0E02PvTX72nGXuSwlG9KuefeW4i2e9vjJ+V2w/A1wcu1J5szedyQ +pgCed/r8zSeUQhac0xxo7L9c3eWpexAKMnRUEzGLhQOEkbdYATAUOK8oyvyxUBkZ +CayJSdM= +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIEZDCCA0ygAwIBAgIQRL4Mi1AAJLQR0zYwS8AzdzANBgkqhkiG9w0BAQUFADCB +ozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug +Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho +dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVUTi1VU0VSRmlyc3Qt +TmV0d29yayBBcHBsaWNhdGlvbnMwHhcNOTkwNzA5MTg0ODM5WhcNMTkwNzA5MTg1 +NzQ5WjCBozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0 +IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYD +VQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVUTi1VU0VS +Rmlyc3QtTmV0d29yayBBcHBsaWNhdGlvbnMwggEiMA0GCSqGSIb3DQEBAQUAA4IB +DwAwggEKAoIBAQCz+5Gh5DZVhawGNFugmliy+LUPBXeDrjKxdpJo7CNKyXY/45y2 +N3kDuatpjQclthln5LAbGHNhSuh+zdMvZOOmfAz6F4CjDUeJT1FxL+78P/m4FoCH +iZMlIJpDgmkkdihZNaEdwH+DBmQWICzTSaSFtMBhf1EI+GgVkYDLpdXuOzr0hARe +YFmnjDRy7rh4xdE7EkpvfmUnuaRVxblvQ6TFHSyZwFKkeEwVs0CYCGtDxgGwenv1 +axwiP8vv/6jQOkt2FZ7S0cYu49tXGzKiuG/ohqY/cKvlcJKrRB5AUPuco2LkbG6g +yN7igEL66S/ozjIEj3yNtxyjNTwV3Z7DrpelAgMBAAGjgZEwgY4wCwYDVR0PBAQD +AgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFPqGydvguul49Uuo1hXf8NPh +ahQ8ME8GA1UdHwRIMEYwRKBCoECGPmh0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9V +VE4tVVNFUkZpcnN0LU5ldHdvcmtBcHBsaWNhdGlvbnMuY3JsMA0GCSqGSIb3DQEB +BQUAA4IBAQCk8yXM0dSRgyLQzDKrm5ZONJFUICU0YV8qAhXhi6r/fWRRzwr/vH3Y +IWp4yy9Rb/hCHTO967V7lMPDqaAt39EpHx3+jz+7qEUqf9FuVSTiuwL7MT++6Lzs +QCv4AdRWOOTKRIK1YSAhZ2X28AvnNPilwpyjXEAfhZOVBt5P1CeptqX8Fs1zMT+4 +ZSfP1FMa8Kxun08FDAOBp4QpxFq9ZFdyrTvPNximmMatBrTcCKME1SmklpoSZ0qM +YEWd8SOasACcaLWYUNPvji6SZbFIPiG+FTAqDbUMo2s/rn9X9R+WfN9v3YIwLGUb +QErNaLly7HF27FSOH4UMAWr6pjisH8SE +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz +BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y +aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG +9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIyMjM0OFoXDTE5MDYy +NTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y +azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw +Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl +cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9Y +LqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIiGQj4/xEjm84H9b9pGib+ +TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCmDuJWBQ8Y +TfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0 +LBwGlN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLW +I8sogTLDAHkY7FkXicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPw nXS3qT6gpf+2SQMT2iLM7XGCK5nPOrf1LXLI -----END CERTIFICATE----- + -----BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlD -ZXJ0IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIElu -Yy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRp -b24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNv -bS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYy -NjAwMTk1NFoXDTE5MDYyNjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4x -NTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24g -QXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8x -IDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3 -DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vYdA757tn2VUdZZUcOBVXc -65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9WlmpZdRJEy0kTRxQ -b7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QSv4dk+NoS/zcn -wbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9vUJSZSWI4 -OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTuIYEZ -oDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz +BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y +aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG +9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy +NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y +azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw +Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl +cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY +dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9 +WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS +v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v +UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu +IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd -----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIICPTCCAaYCEQDNun9W8N/kvFT+IqyzcqpVMA0GCSqGSIb3DQEBAgUAMF8xCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xh +c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05 +NjAxMjkwMDAwMDBaFw0yODA4MDEyMzU5NTlaMF8xCzAJBgNVBAYTAlVTMRcwFQYD +VQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xhc3MgMSBQdWJsaWMgUHJp +bWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCBnzANBgkqhkiG9w0BAQEFAAOB +jQAwgYkCgYEA5Rm/baNWYS2ZSHH2Z965jeu3noaACpEO+jglr0aIguVzqKCbJF0N +H8xlbgyw0FaEGIeaBpsQoXPftFg5a27B9hXVqKg/qhIGjTGsf7A01480Z4gJzRQR +4k5FVmkfeAKA2txHkSm7NsljXMXg1y2He6G3MrB7MLoqLzGq7qNn2tsCAwEAATAN +BgkqhkiG9w0BAQIFAAOBgQBMP7iLxmjf7kMzDl3ppssHhE16M/+SG/Q2rdiVIjZo +EWx8QszznC7EBz8UsA9P/5CSdvnivErpj82ggAr3xSnxgiJduLHdgSOjeyUVRjB5 +FvjqBUuUfx3CHMjjt/QQQDwTw18fU+hI5Ia0e6E1sHslurjTjqs/OJ0ANACY89Fx +lA== +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEEzH6qqYPnHTkxD4PTqJkZIwDQYJKoZIhvcNAQEFBQAwgcExCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh +c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy +MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp +emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X +DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw +FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMg +UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo +YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 +MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB +AQUAA4GNADCBiQKBgQCq0Lq+Fi24g9TK0g+8djHKlNgdk4xWArzZbxpvUjZudVYK +VdPfQ4chEWWKfo+9Id5rMj8bhDSVBZ1BNeuS65bdqlk/AVNtmU/t5eIqWpDBucSm +Fc/IReumXY6cPvBkJHalzasab7bYe1FhbqZ/h8jit+U03EGI6glAvnOSPWvndQID +AQABMA0GCSqGSIb3DQEBBQUAA4GBAKlPww3HZ74sy9mozS11534Vnjty637rXC0J +h9ZrbWB85a7FkCMMXErQr7Fd88e2CtvgFZMN3QO8x3aKtd1Pw5sTdbgBwObJW2ul +uIncrKTdcu1OofdPvAbT6shkdHvClUGcZXNY8ZCaPGqxmMnEh7zPRW1F4m4iP/68 +DzFc6PLZ +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCLW3VWhFSFCwDPrzhIzrGkMA0GCSqGSIb3DQEBBQUAMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl +cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu +LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT +aWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD +VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT +aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ +bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu +IENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAN2E1Lm0+afY8wR4 +nN493GwTFtl63SRRZsDHJlkNrAYIwpTRMx/wgzUfbhvI3qpuFU5UJ+/EbRrsC+MO +8ESlV8dAWB6jRx9x7GD2bZTIGDnt/kIYVt/kTEkQeE4BdjVjEjbdZrwBBDajVWjV +ojYJrKshJlQGrT/KFOCsyq0GHZXi+J3x4GD/wn91K0zM2v6HmSHquv4+VNfSWXjb +PG7PoBMAGrgnoeS+Z5bKoMWznN3JdZ7rMJpfo83ZrngZPyPpXNspva1VyBtUjGP2 +6KbqxzcSXKMpHgLZ2x87tNcPVkeBFQRKr4Mn0cVYiMHd9qqnoxjaaKptEVHhv2Vr +n5Z20T0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAq2aN17O6x5q25lXQBfGfMY1a +qtmqRiYPce2lrVNWYgFHKkTp/j90CxObufRNG7LRX7K20ohcs5/Ny9Sn2WCVhDr4 +wTcdYcrnsMXlkdpUpqwxga6X3s0IrLjAl4B/bnKk52kTlWUfxJM8/XmPBNQ+T+r3 +ns7NZ3xPZQL/kYVUc8f/NveGLezQXk//EZ9yBta4GvFMDSZl4kSAHsef493oCtrs +pSCAaWihT37ha88HQfqDjrw43bAuEbFrskLMmrz5SCJ5ShkPshw+IHTZasO+8ih4 +E1Z5T21Q6huwtVexN2ZYI/PcD98Kh8TvhgXVOBRgmaNL3gaWcSzy27YfpO8/7g== +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIDnjCCAwegAwIBAgIQK2jUo0aexTsoCas4XX8nIDANBgkqhkiG9w0BAQUFADBf +MQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xNzA1BgNVBAsT +LkNsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkw +HhcNMDAwODA0MDAwMDAwWhcNMDQwODAzMjM1OTU5WjCBpzEXMBUGA1UEChMOVmVy +aVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOzA5 +BgNVBAsTMlRlcm1zIG9mIHVzZSBhdCBodHRwczovL3d3dy52ZXJpc2lnbi5jb20v +UlBBIChjKTAwMS4wLAYDVQQDEyVDbGFzcyAxIFB1YmxpYyBQcmltYXJ5IE9DU1Ag +UmVzcG9uZGVyMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC57V56Ondfzl86 +UvzNZPdxtW9qlsZZklWUXS9bLsER6iaKy6eBPPZaRN56Ey/9WlHZezcmSsAnPwQD +albBgyzhb1upVFAkSsYuekyhWzdUJCExH6F4GHansXDaItBq/gdiQMb39pt9DAa4 +S8co5GYjhFHvRreT2IEzy+U2rMboBQIDAQABo4IBEDCCAQwwIAYDVR0RBBkwF6QV +MBMxETAPBgNVBAMTCE9DU1AgMS0xMDEGA1UdHwQqMCgwJqAkoCKGIGh0dHA6Ly9j +cmwudmVyaXNpZ24uY29tL3BjYTEuY3JsMBMGA1UdJQQMMAoGCCsGAQUFBwMJMEIG +CCsGAQUFBwEBBDYwNDAyBggrBgEFBQcwAaYmFiRodHRwOi8vb2NzcC52ZXJpc2ln +bi5jb20vb2NzcC9zdGF0dXMwRAYDVR0gBD0wOzA5BgtghkgBhvhFAQcBATAqMCgG +CCsGAQUFBwIBFhxodHRwczovL3d3dy52ZXJpc2lnbi5jb20vUlBBMAkGA1UdEwQC +MAAwCwYDVR0PBAQDAgeAMA0GCSqGSIb3DQEBBQUAA4GBAHCQ3bjkvlMXfH8C6dX3 +i5mTMWCNfuZgayTvYKzSzpHegG0JpNO4OOVEynJeDS3Bd5y9LAN4KY2kpXeH9fEr +Jq3MB2w6VFoo4AnzTQoEytRYaQuns/XdAaXn3PAfusFdkI2z6k/BEVmXarIrE7Ha +rZehs7GgIFvKMquNzxPwHynD +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEC0b/EoXjaOR6+f/9YtFvgswDQYJKoZIhvcNAQECBQAwXzELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz +cyAyIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 +MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV +BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAyIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN +ADCBiQKBgQC2WoujDWojg4BrzzmH9CETMwZMJaLtVRKXxaeAufqDwSCg+i8VDXyh +YGt+eSz6Bg86rvYbb7HS/y8oUl+DfUvEerf4Zh+AVPy3wo5ZShRXRtGak75BkQO7 +FYCTXOvnzAhsPz6zSvz/S2wj1VCCJkQZjiPDceoZJEcEnnW/yKYAHwIDAQABMA0G +CSqGSIb3DQEBAgUAA4GBAIobK/o5wXTXXtgZZKJYSi034DNHD6zt96rbHuSLBlxg +J8pFUs4W7z8GZOeUaHxgMxURaa+dYo2jA1Rrpr7l7gUYYAS/QoD90KioHgE796Nc +r6Pc5iaAIzy4RHT3Cq5Ji2F4zCS/iIqnDupzGUH9TQPwiNHleI2lKk/2lw0Xd8rY +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIDAzCCAmwCEQC5L2DMiJ+hekYJuFtwbIqvMA0GCSqGSIb3DQEBBQUAMIHBMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0Ns +YXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH +MjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9y +aXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazAe +Fw05ODA1MTgwMDAwMDBaFw0yODA4MDEyMzU5NTlaMIHBMQswCQYDVQQGEwJVUzEX +MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGlj +IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMx +KGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s +eTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazCBnzANBgkqhkiG9w0B +AQEFAAOBjQAwgYkCgYEAp4gBIXQs5xoD8JjhlzwPIQjxnNuX6Zr8wgQGE75fUsjM +HiwSViy4AWkszJkfrbCWrnkE8hM5wXuYuggs6MKEEyyqaekJ9MepAqRCwiNPStjw +DqL7MWzJ5m+ZJwf15vRMeJ5t60aG+rmGyVTyssSv1EYcWskVMP8NbPUtDm3Of3cC +AwEAATANBgkqhkiG9w0BAQUFAAOBgQByLvl/0fFx+8Se9sVeUYpAmLho+Jscg9ji +nb3/7aHmZuovCfTK1+qlK5X2JGCGTUQug6XELaDTrnhpb3LabK4I8GOSN+a7xDAX +rXfMSTWqz9iP0b63GJZHc2pUIjRkLbYWm1lbtFFZOrMLFPQS32eg9K0yZF6xRnIn +jBJ7xUS0rg== +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIEGTCCAwECEGFwy0mMX5hFKeewptlQW3owDQYJKoZIhvcNAQEFBQAwgcoxCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVy +aVNpZ24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24s +IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNp +Z24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eSAtIEczMB4XDTk5MTAwMTAwMDAwMFoXDTM2MDcxNjIzNTk1OVowgcoxCzAJBgNV +BAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNp +Z24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIElu +Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24g +Q2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt +IEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArwoNwtUs22e5LeWU +J92lvuCwTY+zYVY81nzD9M0+hsuiiOLh2KRpxbXiv8GmR1BeRjmL1Za6tW8UvxDO +JxOeBUebMXoT2B/Z0wI3i60sR/COgQanDTAM6/c8DyAd3HJG7qUCyFvDyVZpTMUY +wZF7C9UTAJu878NIPkZgIIUq1ZC2zYugzDLdt/1AVbJQHFauzI13TccgTacxdu9o +koqQHgiBVrKtaaNS0MscxCM9H5n+TOgWY47GCI72MfbS+uV23bUckqNJzc0BzWjN +qWm6o+sdDZykIKbBoMXRRkwXbdKsZj+WjOCE1Db/IlnF+RFgqF8EffIa9iVCYQ/E +Srg+iQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA0JhU8wI1NQ0kdvekhktdmnLfe +xbjQ5F1fdiLAJvmEOjr5jLX77GDx6M4EsMjdpwOPMPOY36TmpDHf0xwLRtxyID+u +7gU8pDM/CzmscHhzS5kr3zDCVLCoO1Wh/hYozUK9dG6A2ydEp85EXdQbkJgNHkKU +sQAsBNB0owIFImNjzYO1+8FtYmtpdf1dcEG59b98377BMnMiIYtYgXsVkXq642RI +sH/7NiXaldDxJBQX3RiAa0YjOVT1jmIJBB2UkKab5iXiQkWquJCtvgiPqQtCGJTP +cjnhsUPgKM+351psE2tJs//jGHyJizNdrDPXp/naOlXJWBD5qu9ats9LS98q +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIDnjCCAwegAwIBAgIQCUYX5h3Y1BygDKBi6HmKpzANBgkqhkiG9w0BAQUFADBf +MQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xNzA1BgNVBAsT +LkNsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkw +HhcNMDAwODAxMDAwMDAwWhcNMDQwNzMxMjM1OTU5WjCBpzEXMBUGA1UEChMOVmVy +aVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOzA5 +BgNVBAsTMlRlcm1zIG9mIHVzZSBhdCBodHRwczovL3d3dy52ZXJpc2lnbi5jb20v +UlBBIChjKTAwMS4wLAYDVQQDEyVDbGFzcyAyIFB1YmxpYyBQcmltYXJ5IE9DU1Ag +UmVzcG9uZGVyMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDQymMxYX9ENHwF +fQs9apDLeUt3Cj9LxyPlwGItfpx+PoiHkdCs6E1Jh6KWkIrdBKUCP4yb6Yn+YqDi +Wr3I3bR45qVCkwhnAcAgTddc9F3as+M3plIaLExlTYqH2aij8UlUuzxcgFFoxvtJ +/wtVqxXd+5rBuR10DbKMRF2J/J/5gwIDAQABo4IBEDCCAQwwIAYDVR0RBBkwF6QV +MBMxETAPBgNVBAMTCE9DU1AgMS0yMDEGA1UdHwQqMCgwJqAkoCKGIGh0dHA6Ly9j +cmwudmVyaXNpZ24uY29tL3BjYTIuY3JsMBMGA1UdJQQMMAoGCCsGAQUFBwMJMEIG +CCsGAQUFBwEBBDYwNDAyBggrBgEFBQcwAaYmFiRodHRwOi8vb2NzcC52ZXJpc2ln +bi5jb20vb2NzcC9zdGF0dXMwRAYDVR0gBD0wOzA5BgtghkgBhvhFAQcBATAqMCgG +CCsGAQUFBwIBFhxodHRwczovL3d3dy52ZXJpc2lnbi5jb20vUlBBMAkGA1UdEwQC +MAAwCwYDVR0PBAQDAgeAMA0GCSqGSIb3DQEBBQUAA4GBAB99CW4kRnUEnPMmm+M5 +bhfvvL2iG9IChIar0ECXLMRDiDcZayKoA3FQnSDcNmAgmnMtc1VsWJsswrQ0LHoz +QsqR2elDr88e4PXEeqs/cmMeqTfhWzuIsxOGgpBXy1f/9Fa+It3jl6jhvCJDwt1N +2/aBnpIUnjkPE1TegtjAXjSN +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz +cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 +MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV +BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN +ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE +BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is +I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G +CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do +lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc +AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh +c3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy +MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp +emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X +DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw +FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMg +UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo +YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 +MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB +AQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4 +pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg0 +13gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwID +AQABMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSk +U01UbSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i +F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpY +oJ2daZH9 +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl +cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu +LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT +aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD +VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT +aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ +bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu +IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b +N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t +KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu +kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm +CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ +Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu +imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te +2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe +DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC +/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p +F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt +TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIDojCCAwugAwIBAgIQLpaev7ZibOx76XPM42zBhDANBgkqhkiG9w0BAQUFADBf +MQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xNzA1BgNVBAsT +LkNsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkw +HhcNMDAwODA0MDAwMDAwWhcNMDQwODAzMjM1OTU5WjCBpzEXMBUGA1UEChMOVmVy +aVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOzA5 +BgNVBAsTMlRlcm1zIG9mIHVzZSBhdCBodHRwczovL3d3dy52ZXJpc2lnbi5jb20v +UlBBIChjKTAwMS4wLAYDVQQDEyVDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IE9DU1Ag +UmVzcG9uZGVyMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDx5AgOg7t140jl +uNum8Lmr6Txix141W9ACVBHYydFWuXZLuat65s269gwE1n7WsAplrE454/H3LaMl +Oe+wi8++2wxdbnD0B81w9zrAPjUW7XiMQ8/CJi5H1oZ9nPG+1mcMIiWkymXmH3p4 +KC8/BdsEIb/hRWb+PLeC7Vq4FhW5VQIDAQABo4IBFDCCARAwIAYDVR0RBBkwF6QV +MBMxETAPBgNVBAMTCE9DU1AgMS0zMDUGA1UdHwQuMCwwKqAooCaGJGh0dHA6Ly9j +cmwudmVyaXNpZ24uY29tL3BjYTMuMS4xLmNybDATBgNVHSUEDDAKBggrBgEFBQcD +CTBCBggrBgEFBQcBAQQ2MDQwMgYIKwYBBQUHMAGmJhYkaHR0cDovL29jc3AudmVy +aXNpZ24uY29tL29jc3Avc3RhdHVzMEQGA1UdIAQ9MDswOQYLYIZIAYb4RQEHAQEw +KjAoBggrBgEFBQcCARYcaHR0cHM6Ly93d3cudmVyaXNpZ24uY29tL1JQQTAJBgNV +HRMEAjAAMAsGA1UdDwQEAwIHgDANBgkqhkiG9w0BAQUFAAOBgQAC9lNjwKke8tCL +MzCPSJtMsFa0g3FKvtxQ2PW24AvbvXhP6c8JNNopSZ0Bc1qRkYJULBMK03cjzzf8 +Y96n4/a3tWlFKEnDkdyqRxypiJksBSqNjYr6YuJatwAgXTnEKMLL/J6oia5bPY4S +6jKy/OsU1wkVGsDNG9W1FU5B1ZbjTg== +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEDKIjprS9esTR/h/xCA3JfgwDQYJKoZIhvcNAQEFBQAwgcExCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh +c3MgNCBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy +MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp +emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X +DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw +FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgNCBQdWJsaWMg +UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo +YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 +MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB +AQUAA4GNADCBiQKBgQC68OTP+cSuhVS5B1f5j8V/aBH4xBewRNzjMHPVKmIquNDM +HO0oW369atyzkSTKQWI8/AIBvxwWMZQFl3Zuoq29YRdsTjCG8FE3KlDHqGKB3FtK +qsGgtG7rL+VXxbErQHDbWk2hjh+9Ax/YA9SPTJlxvOKCzFjomDqG04Y48wApHwID +AQABMA0GCSqGSIb3DQEBBQUAA4GBAIWMEsGnuVAVess+rLhDityq3RS6iYF+ATwj +cSGIL4LcY/oCRaxFWdcqWERbt5+BO5JoPeI3JPV7bI92NZYJqFmduc4jq3TWg/0y +cyfYaT5DdPauxYma51N86Xv2S/PBZYPejYqcPIiNOVn8qj8ijaHBZlCBckztImRP +T8qAkbYp +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl +cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu +LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT +aWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD +VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT +aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ +bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu +IENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK3LpRFpxlmr8Y+1 +GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaStBO3IFsJ ++mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0Gbd +U6LM8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLm +NxdLMEYH5IBtptiWLugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XY +ufTsgsbSPZUd5cBPhMnZo0QoBmrXRazwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ +ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAj/ola09b5KROJ1WrIhVZPMq1 +CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXttmhwwjIDLk5Mq +g6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm +fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c +2NU8Qh0XwRJdRTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/ +bLvSHgCwIe34QWKCudiyxLtGUPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg== +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIICNDCCAaECEAKtZn5ORf5eV288mBle3cAwDQYJKoZIhvcNAQECBQAwXzELMAkG +A1UEBhMCVVMxIDAeBgNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYD +VQQLEyVTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk0 +MTEwOTAwMDAwMFoXDTEwMDEwNzIzNTk1OVowXzELMAkGA1UEBhMCVVMxIDAeBgNV +BAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYDVQQLEyVTZWN1cmUgU2Vy +dmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGbMA0GCSqGSIb3DQEBAQUAA4GJ +ADCBhQJ+AJLOesGugz5aqomDV6wlAXYMra6OLDfO6zV4ZFQD5YRAUcm/jwjiioII +0haGN1XpsSECrXZogZoFokvJSyVmIlZsiAeP94FZbYQHZXATcXY+m3dM41CJVphI +uR2nKRoTLkoRWZweFdVJVCxzOmmCsZc5nG1wZ0jl3S3WyB57AgMBAAEwDQYJKoZI +hvcNAQECBQADfgBl3X7hsuyw4jrg7HFGmhkRuNPHoLQDQCYCPgmc4RKz0Vr2N6W3 +YQO2WxZpO8ZECAyIUwxrl0nHPjXcbLm7qt9cuzovk2C2qUtN8iD3zV9/ZHuO3ABc +1/p3yjkWWW8O6tO1g39NTUJWdrTJXwT4OPjr0l91X817/OWOgHz8UA== +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIDnzCCAwygAwIBAgIRAP9F1SddJPuzwjkkU1fhT94wDQYJKoZIhvcNAQEFBQAw +XzELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMu +MS4wLAYDVQQLEyVTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MB4XDTAwMDgwNDAwMDAwMFoXDTA0MDgwMzIzNTk1OVowgZ4xFzAVBgNVBAoTDlZl +cmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTsw +OQYDVQQLEzJUZXJtcyBvZiB1c2UgYXQgaHR0cHM6Ly93d3cudmVyaXNpZ24uY29t +L1JQQSAoYykwMDElMCMGA1UEAxMcU2VjdXJlIFNlcnZlciBPQ1NQIFJlc3BvbmRl +cjCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuFGZZIUO7rMKaPC/Y3YdU/X8 +oXiMM+6f9L452psPTUepjyDoS0S9zs17kNEw6JDEJXuJKN699pMd/7n/krWpjeSu +zOLDB4Nqo3IQASdiIqY1Jjktns9gDPxHpNfQQninHWzQy08VpykKtJVFxLHnWgnX +OZXYHTWewr2zXcEMSx8CAwEAAaOCAR0wggEZMCAGA1UdEQQZMBekFTATMREwDwYD +VQQDEwhPQ1NQIDEtNDA+BgNVHR8ENzA1MDOgMaAvhi1odHRwOi8vY3JsLnZlcmlz +aWduLmNvbS9SU0FTZWN1cmVTZXJ2ZXItcC5jcmwwEwYDVR0lBAwwCgYIKwYBBQUH +AwkwQgYIKwYBBQUHAQEENjA0MDIGCCsGAQUFBzABpiYWJGh0dHA6Ly9vY3NwLnZl +cmlzaWduLmNvbS9vY3NwL3N0YXR1czBEBgNVHSAEPTA7MDkGC2CGSAGG+EUBBwEB +MCowKAYIKwYBBQUHAgEWHGh0dHBzOi8vd3d3LnZlcmlzaWduLmNvbS9SUEEwCQYD +VR0TBAIwADALBgNVHQ8EBAMCB4AwDQYJKoZIhvcNAQEFBQADfgAAsxBTZpxJky4x +oAJC0lhXfmah/huKYRhQQCweK0Gl1tv/rAgcWgVtAlwqtpZPR9u+TtvOzLqGuBjO +sRKRX2P380g+zPFNE+RtCZR4AJLLoyCdBgtqoEMHztEZbI8YdZqfFzP9qSa44+Le +wqjEWop/mNYHBmvMVp6GcM7U7w== +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIDzTCCAzagAwIBAgIQU2GyYK7bcY6nlLMTM/QHCTANBgkqhkiG9w0BAQUFADCB +wTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTwwOgYDVQQL +EzNDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +IC0gRzIxOjA4BgNVBAsTMShjKSAxOTk4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1 +dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv +cmswHhcNMDAwOTI2MDAwMDAwWhcNMTAwOTI1MjM1OTU5WjCBpTEXMBUGA1UEChMO +VmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsx +OzA5BgNVBAsTMlRlcm1zIG9mIHVzZSBhdCBodHRwczovL3d3dy52ZXJpc2lnbi5j +b20vcnBhIChjKTAwMSwwKgYDVQQDEyNWZXJpU2lnbiBUaW1lIFN0YW1waW5nIEF1 +dGhvcml0eSBDQTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0hmdZ8IAIVli +zrQJIkRpivglWtvtDbc2fk7gu5Q+kCWHwmFHKdm9VLhjzCx9abQzNvQ3B5rB3UBU +/OB4naCTuQk9I1F/RMIUdNsKvsvJMDRAmD7Q1yUQgZS9B0+c1lQn3y6ov8uQjI11 +S7zi6ESHzeZBCiVu6PQkAsVSD27smHUCAwEAAaOB3zCB3DAPBgNVHRMECDAGAQH/ +AgEAMEUGA1UdIAQ+MDwwOgYMYIZIAYb4RQEHFwEDMCowKAYIKwYBBQUHAgEWHGh0 +dHBzOi8vd3d3LnZlcmlzaWduLmNvbS9ycGEwMQYDVR0fBCowKDAmoCSgIoYgaHR0 +cDovL2NybC52ZXJpc2lnbi5jb20vcGNhMy5jcmwwCwYDVR0PBAQDAgEGMEIGCCsG +AQUFBwEBBDYwNDAyBggrBgEFBQcwAaYmFiRodHRwOi8vb2NzcC52ZXJpc2lnbi5j +b20vb2NzcC9zdGF0dXMwDQYJKoZIhvcNAQEFBQADgYEAgnBold+2DcIBcBlK0lRW +HqzyRUyHuPU163hLBanInTsZIS5wNEqi9YngFXVF5yg3ADQnKeg3S/LvRJdrF1Ea +w1adPBqK9kpGRjeM+sv1ZFo4aC4cw+9wzrhGBha/937ntag+RaypJXUie28/sJyU +58dzq6wf7iWbwBbtt8pb8BQ= +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIDgDCCAmigAwIBAgICAx4wDQYJKoZIhvcNAQEFBQAwYTELMAkGA1UEBhMCVVMx +DTALBgNVBAoTBFZJU0ExLzAtBgNVBAsTJlZpc2EgSW50ZXJuYXRpb25hbCBTZXJ2 +aWNlIEFzc29jaWF0aW9uMRIwEAYDVQQDEwlHUCBSb290IDIwHhcNMDAwODE2MjI1 +MTAwWhcNMjAwODE1MjM1OTAwWjBhMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklT +QTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRp +b24xEjAQBgNVBAMTCUdQIFJvb3QgMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBAKkBcLWqxEDwq2omYXkZAPy/mzdZDK9vZBv42pWUJGkzEXDK41Z0ohdX +ZFwgBuHW73G3O/erwWnQSaSxBNf0V2KJXLB1LRckaeNCYOTudNargFbYiCjh+20i +/SN8RnNPflRzHqgsVVh1t0zzWkWlAhr62p3DRcMiXvOL8WAp0sdftAw6UYPvMPjU +58fy+pmjIlC++QU3o63tmsPm7IgbthknGziLgE3sucfFicv8GjLtI/C1AVj59o/g +halMCXI5Etuz9c9OYmTaxhkVOmMd6RdVoUwiPDQyRvhlV7or7zaMavrZ2UT0qt2E +1w0cslSsMoW0ZA3eQbuxNMYBhjJk1Z8CAwEAAaNCMEAwHQYDVR0OBBYEFJ59SzS/ +ca3CBfYDdYDOqU8axCRMMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG +MA0GCSqGSIb3DQEBBQUAA4IBAQAhpXYUVfmtJ3CPPPTVbMjMCqujmAuKBiPFyWHb +mQdpNSYx/scuhMKZYdQN6X0uEyt8joW2hcdLzzW2LEc9zikv2G+fiRxkk78IvXbQ +kIqUs38oW26sTTMs7WXcFsziza6kPWKSBpUmv9+55CCmc2rBvveURNZNbyoLaxhN +dBA2aGpawWqn3TYpjLgwi08hPwAuVDAHOrqK5MOeyti12HvOdUVmB/RtLdh6yumJ +ivIj2C/LbgA2T/vwLwHMD8AiZfSr4k5hLQOCfZEWtTDVFN5ex5D8ofyrEK9ca3Cn +B+8phuiyJccg/ybdd+95RBTEvd07xQObdyPsoOy7Wjm1zK0G +-----END CERTIFICATE----- + -----BEGIN CERTIFICATE----- -MIICPTCCAaYCEQDNun9W8N/kvFT+IqyzcqpVMA0GCSqGSIb3DQEBAgUAMF8x -CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UE -CxMuQ2xhc3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv -cml0eTAeFw05NjAxMjkwMDAwMDBaFw0yODA4MDEyMzU5NTlaMF8xCzAJBgNV -BAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xh -c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCB -nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA5Rm/baNWYS2ZSHH2Z965jeu3 -noaACpEO+jglr0aIguVzqKCbJF0NH8xlbgyw0FaEGIeaBpsQoXPftFg5a27B -9hXVqKg/qhIGjTGsf7A01480Z4gJzRQR4k5FVmkfeAKA2txHkSm7NsljXMXg -1y2He6G3MrB7MLoqLzGq7qNn2tsCAwEAATANBgkqhkiG9w0BAQIFAAOBgQBM -P7iLxmjf7kMzDl3ppssHhE16M/+SG/Q2rdiVIjZoEWx8QszznC7EBz8UsA9P -/5CSdvnivErpj82ggAr3xSnxgiJduLHdgSOjeyUVRjB5FvjqBUuUfx3CHMjj -t/QQQDwTw18fU+hI5Ia0e6E1sHslurjTjqs/OJ0ANACY89FxlA== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDAjCCAmsCEEzH6qqYPnHTkxD4PTqJkZIwDQYJKoZIhvcNAQEFBQAwgcEx -CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UE -CxMzQ2xhc3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv -cml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAt -IEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBU -cnVzdCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVow -gcExCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoG -A1UECxMzQ2xhc3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1 -dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5j -LiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2ln -biBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCq -0Lq+Fi24g9TK0g+8djHKlNgdk4xWArzZbxpvUjZudVYKVdPfQ4chEWWKfo+9 -Id5rMj8bhDSVBZ1BNeuS65bdqlk/AVNtmU/t5eIqWpDBucSmFc/IReumXY6c -PvBkJHalzasab7bYe1FhbqZ/h8jit+U03EGI6glAvnOSPWvndQIDAQABMA0G -CSqGSIb3DQEBBQUAA4GBAKlPww3HZ74sy9mozS11534Vnjty637rXC0Jh9Zr -bWB85a7FkCMMXErQr7Fd88e2CtvgFZMN3QO8x3aKtd1Pw5sTdbgBwObJW2ul -uIncrKTdcu1OofdPvAbT6shkdHvClUGcZXNY8ZCaPGqxmMnEh7zPRW1F4m4i -P/68DzFc6PLZ ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQCLW3VWhFSFCwDPrzhIzrGkMA0GCSqGSIb3DQEBBQUAMIHK -MQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNV -BAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5 -IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBD -BgNVBAMTPFZlcmlTaWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3 -MTYyMzU5NTlaMIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24s -IEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNV -BAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQg -dXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDEgUHVibGljIFBy -aW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAN2E1Lm0+afY8wR4nN493GwTFtl63SRR -ZsDHJlkNrAYIwpTRMx/wgzUfbhvI3qpuFU5UJ+/EbRrsC+MO8ESlV8dAWB6j -Rx9x7GD2bZTIGDnt/kIYVt/kTEkQeE4BdjVjEjbdZrwBBDajVWjVojYJrKsh -JlQGrT/KFOCsyq0GHZXi+J3x4GD/wn91K0zM2v6HmSHquv4+VNfSWXjbPG7P -oBMAGrgnoeS+Z5bKoMWznN3JdZ7rMJpfo83ZrngZPyPpXNspva1VyBtUjGP2 -6KbqxzcSXKMpHgLZ2x87tNcPVkeBFQRKr4Mn0cVYiMHd9qqnoxjaaKptEVHh -v2Vrn5Z20T0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAq2aN17O6x5q25lXQ -BfGfMY1aqtmqRiYPce2lrVNWYgFHKkTp/j90CxObufRNG7LRX7K20ohcs5/N -y9Sn2WCVhDr4wTcdYcrnsMXlkdpUpqwxga6X3s0IrLjAl4B/bnKk52kTlWUf -xJM8/XmPBNQ+T+r3ns7NZ3xPZQL/kYVUc8f/NveGLezQXk//EZ9yBta4GvFM -DSZl4kSAHsef493oCtrspSCAaWihT37ha88HQfqDjrw43bAuEbFrskLMmrz5 -SCJ5ShkPshw+IHTZasO+8ih4E1Z5T21Q6huwtVexN2ZYI/PcD98Kh8TvhgXV -OBRgmaNL3gaWcSzy27YfpO8/7g== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDnjCCAwegAwIBAgIQK2jUo0aexTsoCas4XX8nIDANBgkqhkiG9w0BAQUF -ADBfMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xNzA1 -BgNVBAsTLkNsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkwHhcNMDAwODA0MDAwMDAwWhcNMDQwODAzMjM1OTU5WjCBpzEX -MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy -dXN0IE5ldHdvcmsxOzA5BgNVBAsTMlRlcm1zIG9mIHVzZSBhdCBodHRwczov -L3d3dy52ZXJpc2lnbi5jb20vUlBBIChjKTAwMS4wLAYDVQQDEyVDbGFzcyAx -IFB1YmxpYyBQcmltYXJ5IE9DU1AgUmVzcG9uZGVyMIGfMA0GCSqGSIb3DQEB -AQUAA4GNADCBiQKBgQC57V56Ondfzl86UvzNZPdxtW9qlsZZklWUXS9bLsER -6iaKy6eBPPZaRN56Ey/9WlHZezcmSsAnPwQDalbBgyzhb1upVFAkSsYuekyh -WzdUJCExH6F4GHansXDaItBq/gdiQMb39pt9DAa4S8co5GYjhFHvRreT2IEz -y+U2rMboBQIDAQABo4IBEDCCAQwwIAYDVR0RBBkwF6QVMBMxETAPBgNVBAMT -CE9DU1AgMS0xMDEGA1UdHwQqMCgwJqAkoCKGIGh0dHA6Ly9jcmwudmVyaXNp -Z24uY29tL3BjYTEuY3JsMBMGA1UdJQQMMAoGCCsGAQUFBwMJMEIGCCsGAQUF -BwEBBDYwNDAyBggrBgEFBQcwAaYmFiRodHRwOi8vb2NzcC52ZXJpc2lnbi5j -b20vb2NzcC9zdGF0dXMwRAYDVR0gBD0wOzA5BgtghkgBhvhFAQcBATAqMCgG -CCsGAQUFBwIBFhxodHRwczovL3d3dy52ZXJpc2lnbi5jb20vUlBBMAkGA1Ud -EwQCMAAwCwYDVR0PBAQDAgeAMA0GCSqGSIb3DQEBBQUAA4GBAHCQ3bjkvlMX -fH8C6dX3i5mTMWCNfuZgayTvYKzSzpHegG0JpNO4OOVEynJeDS3Bd5y9LAN4 -KY2kpXeH9fErJq3MB2w6VFoo4AnzTQoEytRYaQuns/XdAaXn3PAfusFdkI2z -6k/BEVmXarIrE7HarZehs7GgIFvKMquNzxPwHynD ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEC0b/EoXjaOR6+f/9YtFvgswDQYJKoZIhvcNAQECBQAwXzEL -MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQL -Ey5DbGFzcyAyIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y -aXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UE -BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz -cyAyIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGf -MA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC2WoujDWojg4BrzzmH9CETMwZM -JaLtVRKXxaeAufqDwSCg+i8VDXyhYGt+eSz6Bg86rvYbb7HS/y8oUl+DfUvE -erf4Zh+AVPy3wo5ZShRXRtGak75BkQO7FYCTXOvnzAhsPz6zSvz/S2wj1VCC -JkQZjiPDceoZJEcEnnW/yKYAHwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBAIob -K/o5wXTXXtgZZKJYSi034DNHD6zt96rbHuSLBlxgJ8pFUs4W7z8GZOeUaHxg -MxURaa+dYo2jA1Rrpr7l7gUYYAS/QoD90KioHgE796Ncr6Pc5iaAIzy4RHT3 -Cq5Ji2F4zCS/iIqnDupzGUH9TQPwiNHleI2lKk/2lw0Xd8rY ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDAzCCAmwCEQC5L2DMiJ+hekYJuFtwbIqvMA0GCSqGSIb3DQEBBQUAMIHB -MQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNV -BAsTM0NsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRo -b3JpdHkgLSBHMjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNpZ24sIEluYy4g -LSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24g -VHJ1c3QgTmV0d29yazAeFw05ODA1MTgwMDAwMDBaFw0yODA4MDEyMzU5NTla -MIHBMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6 -BgNVBAsTM0NsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkgLSBHMjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNpZ24sIElu -Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNp -Z24gVHJ1c3QgTmV0d29yazCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA -p4gBIXQs5xoD8JjhlzwPIQjxnNuX6Zr8wgQGE75fUsjMHiwSViy4AWkszJkf -rbCWrnkE8hM5wXuYuggs6MKEEyyqaekJ9MepAqRCwiNPStjwDqL7MWzJ5m+Z -Jwf15vRMeJ5t60aG+rmGyVTyssSv1EYcWskVMP8NbPUtDm3Of3cCAwEAATAN -BgkqhkiG9w0BAQUFAAOBgQByLvl/0fFx+8Se9sVeUYpAmLho+Jscg9jinb3/ -7aHmZuovCfTK1+qlK5X2JGCGTUQug6XELaDTrnhpb3LabK4I8GOSN+a7xDAX -rXfMSTWqz9iP0b63GJZHc2pUIjRkLbYWm1lbtFFZOrMLFPQS32eg9K0yZF6x -RnInjBJ7xUS0rg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEGTCCAwECEGFwy0mMX5hFKeewptlQW3owDQYJKoZIhvcNAQEFBQAwgcox -CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UE -CxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkg -VmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMG -A1UEAxM8VmVyaVNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTk5MTAwMTAwMDAwMFoXDTM2MDcx -NjIzNTk1OVowgcoxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwg -SW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazE6MDgGA1UE -CxMxKGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1 -c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJp -bWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEArwoNwtUs22e5LeWUJ92lvuCwTY+zYVY8 -1nzD9M0+hsuiiOLh2KRpxbXiv8GmR1BeRjmL1Za6tW8UvxDOJxOeBUebMXoT -2B/Z0wI3i60sR/COgQanDTAM6/c8DyAd3HJG7qUCyFvDyVZpTMUYwZF7C9UT -AJu878NIPkZgIIUq1ZC2zYugzDLdt/1AVbJQHFauzI13TccgTacxdu9okoqQ -HgiBVrKtaaNS0MscxCM9H5n+TOgWY47GCI72MfbS+uV23bUckqNJzc0BzWjN -qWm6o+sdDZykIKbBoMXRRkwXbdKsZj+WjOCE1Db/IlnF+RFgqF8EffIa9iVC -YQ/ESrg+iQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA0JhU8wI1NQ0kdvekh -ktdmnLfexbjQ5F1fdiLAJvmEOjr5jLX77GDx6M4EsMjdpwOPMPOY36TmpDHf -0xwLRtxyID+u7gU8pDM/CzmscHhzS5kr3zDCVLCoO1Wh/hYozUK9dG6A2ydE -p85EXdQbkJgNHkKUsQAsBNB0owIFImNjzYO1+8FtYmtpdf1dcEG59b98377B -MnMiIYtYgXsVkXq642RIsH/7NiXaldDxJBQX3RiAa0YjOVT1jmIJBB2UkKab -5iXiQkWquJCtvgiPqQtCGJTPcjnhsUPgKM+351psE2tJs//jGHyJizNdrDPX -p/naOlXJWBD5qu9ats9LS98q ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDnjCCAwegAwIBAgIQCUYX5h3Y1BygDKBi6HmKpzANBgkqhkiG9w0BAQUF -ADBfMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xNzA1 -BgNVBAsTLkNsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkwHhcNMDAwODAxMDAwMDAwWhcNMDQwNzMxMjM1OTU5WjCBpzEX -MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy -dXN0IE5ldHdvcmsxOzA5BgNVBAsTMlRlcm1zIG9mIHVzZSBhdCBodHRwczov -L3d3dy52ZXJpc2lnbi5jb20vUlBBIChjKTAwMS4wLAYDVQQDEyVDbGFzcyAy -IFB1YmxpYyBQcmltYXJ5IE9DU1AgUmVzcG9uZGVyMIGfMA0GCSqGSIb3DQEB -AQUAA4GNADCBiQKBgQDQymMxYX9ENHwFfQs9apDLeUt3Cj9LxyPlwGItfpx+ -PoiHkdCs6E1Jh6KWkIrdBKUCP4yb6Yn+YqDiWr3I3bR45qVCkwhnAcAgTddc -9F3as+M3plIaLExlTYqH2aij8UlUuzxcgFFoxvtJ/wtVqxXd+5rBuR10DbKM -RF2J/J/5gwIDAQABo4IBEDCCAQwwIAYDVR0RBBkwF6QVMBMxETAPBgNVBAMT -CE9DU1AgMS0yMDEGA1UdHwQqMCgwJqAkoCKGIGh0dHA6Ly9jcmwudmVyaXNp -Z24uY29tL3BjYTIuY3JsMBMGA1UdJQQMMAoGCCsGAQUFBwMJMEIGCCsGAQUF -BwEBBDYwNDAyBggrBgEFBQcwAaYmFiRodHRwOi8vb2NzcC52ZXJpc2lnbi5j -b20vb2NzcC9zdGF0dXMwRAYDVR0gBD0wOzA5BgtghkgBhvhFAQcBATAqMCgG -CCsGAQUFBwIBFhxodHRwczovL3d3dy52ZXJpc2lnbi5jb20vUlBBMAkGA1Ud -EwQCMAAwCwYDVR0PBAQDAgeAMA0GCSqGSIb3DQEBBQUAA4GBAB99CW4kRnUE -nPMmm+M5bhfvvL2iG9IChIar0ECXLMRDiDcZayKoA3FQnSDcNmAgmnMtc1Vs -WJsswrQ0LHozQsqR2elDr88e4PXEeqs/cmMeqTfhWzuIsxOGgpBXy1f/9Fa+ -It3jl6jhvCJDwt1N2/aBnpIUnjkPE1TegtjAXjSN ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzEL -MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQL -Ey5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y -aXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UE -BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz -cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGf -MA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69q -RUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94f56TuZoAqiN91qyFomNFx3In -zPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Olhec9vn2a -/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtM -EivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPw -TtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzk -uxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcEx -CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UE -CxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv -cml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAt -IEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBU -cnVzdCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVow -gcExCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoG -A1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1 -dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5j -LiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2ln -biBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDM -XtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXX -wc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg013gfqLptQ5GV -j0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQABMA0G -CSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01U -bSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i -F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo -1KpYoJ2daZH9 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHK -MQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNV -BAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5 -IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBD -BgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3 -MTYyMzU5NTlaMIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24s -IEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNV -BAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQg -dXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFBy -aW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2 -R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2tKmFZpGcmTNDo -vFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUccLwg -TS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+V -k7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ -Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJ -OxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my -/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f -j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoA -Wii/gt/4uhMdUIaC/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8S -GhJouPtmmRQURVyu565pF4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbb -o27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh -/sVFuq1ruQp6Tk9LhO5L8X3dEQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDojCCAwugAwIBAgIQLpaev7ZibOx76XPM42zBhDANBgkqhkiG9w0BAQUF -ADBfMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xNzA1 -BgNVBAsTLkNsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkwHhcNMDAwODA0MDAwMDAwWhcNMDQwODAzMjM1OTU5WjCBpzEX -MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy -dXN0IE5ldHdvcmsxOzA5BgNVBAsTMlRlcm1zIG9mIHVzZSBhdCBodHRwczov -L3d3dy52ZXJpc2lnbi5jb20vUlBBIChjKTAwMS4wLAYDVQQDEyVDbGFzcyAz -IFB1YmxpYyBQcmltYXJ5IE9DU1AgUmVzcG9uZGVyMIGfMA0GCSqGSIb3DQEB -AQUAA4GNADCBiQKBgQDx5AgOg7t140jluNum8Lmr6Txix141W9ACVBHYydFW -uXZLuat65s269gwE1n7WsAplrE454/H3LaMlOe+wi8++2wxdbnD0B81w9zrA -PjUW7XiMQ8/CJi5H1oZ9nPG+1mcMIiWkymXmH3p4KC8/BdsEIb/hRWb+PLeC -7Vq4FhW5VQIDAQABo4IBFDCCARAwIAYDVR0RBBkwF6QVMBMxETAPBgNVBAMT -CE9DU1AgMS0zMDUGA1UdHwQuMCwwKqAooCaGJGh0dHA6Ly9jcmwudmVyaXNp -Z24uY29tL3BjYTMuMS4xLmNybDATBgNVHSUEDDAKBggrBgEFBQcDCTBCBggr -BgEFBQcBAQQ2MDQwMgYIKwYBBQUHMAGmJhYkaHR0cDovL29jc3AudmVyaXNp -Z24uY29tL29jc3Avc3RhdHVzMEQGA1UdIAQ9MDswOQYLYIZIAYb4RQEHAQEw -KjAoBggrBgEFBQcCARYcaHR0cHM6Ly93d3cudmVyaXNpZ24uY29tL1JQQTAJ -BgNVHRMEAjAAMAsGA1UdDwQEAwIHgDANBgkqhkiG9w0BAQUFAAOBgQAC9lNj -wKke8tCLMzCPSJtMsFa0g3FKvtxQ2PW24AvbvXhP6c8JNNopSZ0Bc1qRkYJU -LBMK03cjzzf8Y96n4/a3tWlFKEnDkdyqRxypiJksBSqNjYr6YuJatwAgXTnE -KMLL/J6oia5bPY4S6jKy/OsU1wkVGsDNG9W1FU5B1ZbjTg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDAjCCAmsCEDKIjprS9esTR/h/xCA3JfgwDQYJKoZIhvcNAQEFBQAwgcEx -CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UE -CxMzQ2xhc3MgNCBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv -cml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAt -IEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBU -cnVzdCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVow -gcExCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoG -A1UECxMzQ2xhc3MgNCBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1 -dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5j -LiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2ln -biBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC6 -8OTP+cSuhVS5B1f5j8V/aBH4xBewRNzjMHPVKmIquNDMHO0oW369atyzkSTK -QWI8/AIBvxwWMZQFl3Zuoq29YRdsTjCG8FE3KlDHqGKB3FtKqsGgtG7rL+VX -xbErQHDbWk2hjh+9Ax/YA9SPTJlxvOKCzFjomDqG04Y48wApHwIDAQABMA0G -CSqGSIb3DQEBBQUAA4GBAIWMEsGnuVAVess+rLhDityq3RS6iYF+ATwjcSGI -L4LcY/oCRaxFWdcqWERbt5+BO5JoPeI3JPV7bI92NZYJqFmduc4jq3TWg/0y -cyfYaT5DdPauxYma51N86Xv2S/PBZYPejYqcPIiNOVn8qj8ijaHBZlCBckzt -ImRPT8qAkbYp ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHK -MQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNV -BAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5 -IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBD -BgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3 -MTYyMzU5NTlaMIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24s -IEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNV -BAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQg -dXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFBy -aW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYl -S+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaStBO3IFsJ+mGuqPKljYXC -KtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM8BDc -VHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdL -MEYH5IBtptiWLugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XY -ufTsgsbSPZUd5cBPhMnZo0QoBmrXRazwa2rvTl/4EYIeOGM0ZlDUPpNz+jDD -Zq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAj/ola09b5KROJ1Wr -IhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt -mhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csK -vE+MW8VLADsfKoKmfjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluP -QSjA1egtTaRezarZ7c7c2NU8Qh0XwRJdRTjDOPP8hS6DRkiy1yBfkjaP53kP -mF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtGUPMxxY8BqHTr -9Xgn2uf3ZkPznoM+IKrDNWCRzg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICNDCCAaECEAKtZn5ORf5eV288mBle3cAwDQYJKoZIhvcNAQECBQAwXzEL -MAkGA1UEBhMCVVMxIDAeBgNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMu -MS4wLAYDVQQLEyVTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9y -aXR5MB4XDTk0MTEwOTAwMDAwMFoXDTEwMDEwNzIzNTk1OVowXzELMAkGA1UE -BhMCVVMxIDAeBgNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYD -VQQLEyVTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGb -MA0GCSqGSIb3DQEBAQUAA4GJADCBhQJ+AJLOesGugz5aqomDV6wlAXYMra6O -LDfO6zV4ZFQD5YRAUcm/jwjiioII0haGN1XpsSECrXZogZoFokvJSyVmIlZs -iAeP94FZbYQHZXATcXY+m3dM41CJVphIuR2nKRoTLkoRWZweFdVJVCxzOmmC -sZc5nG1wZ0jl3S3WyB57AgMBAAEwDQYJKoZIhvcNAQECBQADfgBl3X7hsuyw -4jrg7HFGmhkRuNPHoLQDQCYCPgmc4RKz0Vr2N6W3YQO2WxZpO8ZECAyIUwxr -l0nHPjXcbLm7qt9cuzovk2C2qUtN8iD3zV9/ZHuO3ABc1/p3yjkWWW8O6tO1 -g39NTUJWdrTJXwT4OPjr0l91X817/OWOgHz8UA== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDnzCCAwygAwIBAgIRAP9F1SddJPuzwjkkU1fhT94wDQYJKoZIhvcNAQEF -BQAwXzELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5 -LCBJbmMuMS4wLAYDVQQLEyVTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24g -QXV0aG9yaXR5MB4XDTAwMDgwNDAwMDAwMFoXDTA0MDgwMzIzNTk1OVowgZ4x -FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU -cnVzdCBOZXR3b3JrMTswOQYDVQQLEzJUZXJtcyBvZiB1c2UgYXQgaHR0cHM6 -Ly93d3cudmVyaXNpZ24uY29tL1JQQSAoYykwMDElMCMGA1UEAxMcU2VjdXJl -IFNlcnZlciBPQ1NQIFJlc3BvbmRlcjCBnzANBgkqhkiG9w0BAQEFAAOBjQAw -gYkCgYEAuFGZZIUO7rMKaPC/Y3YdU/X8oXiMM+6f9L452psPTUepjyDoS0S9 -zs17kNEw6JDEJXuJKN699pMd/7n/krWpjeSuzOLDB4Nqo3IQASdiIqY1Jjkt -ns9gDPxHpNfQQninHWzQy08VpykKtJVFxLHnWgnXOZXYHTWewr2zXcEMSx8C -AwEAAaOCAR0wggEZMCAGA1UdEQQZMBekFTATMREwDwYDVQQDEwhPQ1NQIDEt -NDA+BgNVHR8ENzA1MDOgMaAvhi1odHRwOi8vY3JsLnZlcmlzaWduLmNvbS9S -U0FTZWN1cmVTZXJ2ZXItcC5jcmwwEwYDVR0lBAwwCgYIKwYBBQUHAwkwQgYI -KwYBBQUHAQEENjA0MDIGCCsGAQUFBzABpiYWJGh0dHA6Ly9vY3NwLnZlcmlz -aWduLmNvbS9vY3NwL3N0YXR1czBEBgNVHSAEPTA7MDkGC2CGSAGG+EUBBwEB -MCowKAYIKwYBBQUHAgEWHGh0dHBzOi8vd3d3LnZlcmlzaWduLmNvbS9SUEEw -CQYDVR0TBAIwADALBgNVHQ8EBAMCB4AwDQYJKoZIhvcNAQEFBQADfgAAsxBT -ZpxJky4xoAJC0lhXfmah/huKYRhQQCweK0Gl1tv/rAgcWgVtAlwqtpZPR9u+ -TtvOzLqGuBjOsRKRX2P380g+zPFNE+RtCZR4AJLLoyCdBgtqoEMHztEZbI8Y -dZqfFzP9qSa44+LewqjEWop/mNYHBmvMVp6GcM7U7w== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDzTCCAzagAwIBAgIQU2GyYK7bcY6nlLMTM/QHCTANBgkqhkiG9w0BAQUF -ADCBwTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTww -OgYDVQQLEzNDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24g -QXV0aG9yaXR5IC0gRzIxOjA4BgNVBAsTMShjKSAxOTk4IFZlcmlTaWduLCBJ -bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAsTFlZlcmlT -aWduIFRydXN0IE5ldHdvcmswHhcNMDAwOTI2MDAwMDAwWhcNMTAwOTI1MjM1 -OTU5WjCBpTEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl -cmlTaWduIFRydXN0IE5ldHdvcmsxOzA5BgNVBAsTMlRlcm1zIG9mIHVzZSBh -dCBodHRwczovL3d3dy52ZXJpc2lnbi5jb20vcnBhIChjKTAwMSwwKgYDVQQD -EyNWZXJpU2lnbiBUaW1lIFN0YW1waW5nIEF1dGhvcml0eSBDQTCBnzANBgkq -hkiG9w0BAQEFAAOBjQAwgYkCgYEA0hmdZ8IAIVlizrQJIkRpivglWtvtDbc2 -fk7gu5Q+kCWHwmFHKdm9VLhjzCx9abQzNvQ3B5rB3UBU/OB4naCTuQk9I1F/ -RMIUdNsKvsvJMDRAmD7Q1yUQgZS9B0+c1lQn3y6ov8uQjI11S7zi6ESHzeZB -CiVu6PQkAsVSD27smHUCAwEAAaOB3zCB3DAPBgNVHRMECDAGAQH/AgEAMEUG -A1UdIAQ+MDwwOgYMYIZIAYb4RQEHFwEDMCowKAYIKwYBBQUHAgEWHGh0dHBz -Oi8vd3d3LnZlcmlzaWduLmNvbS9ycGEwMQYDVR0fBCowKDAmoCSgIoYgaHR0 -cDovL2NybC52ZXJpc2lnbi5jb20vcGNhMy5jcmwwCwYDVR0PBAQDAgEGMEIG -CCsGAQUFBwEBBDYwNDAyBggrBgEFBQcwAaYmFiRodHRwOi8vb2NzcC52ZXJp -c2lnbi5jb20vb2NzcC9zdGF0dXMwDQYJKoZIhvcNAQEFBQADgYEAgnBold+2 -DcIBcBlK0lRWHqzyRUyHuPU163hLBanInTsZIS5wNEqi9YngFXVF5yg3ADQn -Keg3S/LvRJdrF1Eaw1adPBqK9kpGRjeM+sv1ZFo4aC4cw+9wzrhGBha/937n -tag+RaypJXUie28/sJyU58dzq6wf7iWbwBbtt8pb8BQ= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDgDCCAmigAwIBAgICAx4wDQYJKoZIhvcNAQEFBQAwYTELMAkGA1UEBhMC -VVMxDTALBgNVBAoTBFZJU0ExLzAtBgNVBAsTJlZpc2EgSW50ZXJuYXRpb25h -bCBTZXJ2aWNlIEFzc29jaWF0aW9uMRIwEAYDVQQDEwlHUCBSb290IDIwHhcN -MDAwODE2MjI1MTAwWhcNMjAwODE1MjM1OTAwWjBhMQswCQYDVQQGEwJVUzEN -MAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNl -cnZpY2UgQXNzb2NpYXRpb24xEjAQBgNVBAMTCUdQIFJvb3QgMjCCASIwDQYJ -KoZIhvcNAQEBBQADggEPADCCAQoCggEBAKkBcLWqxEDwq2omYXkZAPy/mzdZ -DK9vZBv42pWUJGkzEXDK41Z0ohdXZFwgBuHW73G3O/erwWnQSaSxBNf0V2KJ -XLB1LRckaeNCYOTudNargFbYiCjh+20i/SN8RnNPflRzHqgsVVh1t0zzWkWl -Ahr62p3DRcMiXvOL8WAp0sdftAw6UYPvMPjU58fy+pmjIlC++QU3o63tmsPm -7IgbthknGziLgE3sucfFicv8GjLtI/C1AVj59o/ghalMCXI5Etuz9c9OYmTa -xhkVOmMd6RdVoUwiPDQyRvhlV7or7zaMavrZ2UT0qt2E1w0cslSsMoW0ZA3e -QbuxNMYBhjJk1Z8CAwEAAaNCMEAwHQYDVR0OBBYEFJ59SzS/ca3CBfYDdYDO -qU8axCRMMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqG -SIb3DQEBBQUAA4IBAQAhpXYUVfmtJ3CPPPTVbMjMCqujmAuKBiPFyWHbmQdp -NSYx/scuhMKZYdQN6X0uEyt8joW2hcdLzzW2LEc9zikv2G+fiRxkk78IvXbQ -kIqUs38oW26sTTMs7WXcFsziza6kPWKSBpUmv9+55CCmc2rBvveURNZNbyoL -axhNdBA2aGpawWqn3TYpjLgwi08hPwAuVDAHOrqK5MOeyti12HvOdUVmB/Rt -Ldh6yumJivIj2C/LbgA2T/vwLwHMD8AiZfSr4k5hLQOCfZEWtTDVFN5ex5D8 -ofyrEK9ca3CnB+8phuiyJccg/ybdd+95RBTEvd07xQObdyPsoOy7Wjm1zK0G ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUF -ADBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlz -YSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMT -E1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0 -MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UE -CxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAa -BgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUA -A4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh -28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8bRaVK7362 -rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81 -q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtF -Wsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0 -lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaLdXe6YJ2E5/4t -AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G -A1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOC -AQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR -zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKht -cbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGI -xHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu -YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/ -hC3euiInlhBx6yLt398znM/jra6O1I7mT1GvFpLgXPYHDw== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFajCCBFKgAwIBAgIEPLU9RjANBgkqhkiG9w0BAQUFADBmMRIwEAYDVQQK -EwliZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEzMDEG -A1UEAxMqYmVUUlVTVGVkIFJvb3QgQ0EtQmFsdGltb3JlIEltcGxlbWVudGF0 -aW9uMB4XDTAyMDQxMTA3Mzg1MVoXDTIyMDQxMTA3Mzg1MVowZjESMBAGA1UE -ChMJYmVUUlVTVGVkMRswGQYDVQQLExJiZVRSVVNUZWQgUm9vdCBDQXMxMzAx -BgNVBAMTKmJlVFJVU1RlZCBSb290IENBLUJhbHRpbW9yZSBJbXBsZW1lbnRh -dGlvbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALx+xDmcjOPW -HIb/ymKt4H8wRXqOGrO4x/nRNv8i805qX4QQ+2aBw5R5MdKR4XeOGCrDFN5R -9U+jK7wYFuK13XneIviCfsuBH/0nLI/6l2Qijvj/YaOcGx6Sj8CoCd8JEey3 -fTGaGuqDIQY8n7pc/5TqarjDa1U0Tz0yH92BFODEPM2dMPgwqZfT7syj0B9f -HBOB1BirlNFjw55/NZKeX0Tq7PQiXLfoPX2k+YmpkbIq2eszh+6l/ePazIjm -iSZuxyuC0F6dWdsU7JGDBcNeDsYq0ATdcT0gTlgn/FP7eHgZFLL8kFKJOGJg -B7Sg7KxrUNb9uShr71ItOrL/8QFArDcCAwEAAaOCAh4wggIaMA8GA1UdEwEB -/wQFMAMBAf8wggG1BgNVHSAEggGsMIIBqDCCAaQGDysGAQQBsT4AAAEJKIOR -MTCCAY8wggFIBggrBgEFBQcCAjCCAToaggE2UmVsaWFuY2Ugb24gb3IgdXNl -IG9mIHRoaXMgQ2VydGlmaWNhdGUgY3JlYXRlcyBhbiBhY2tub3dsZWRnbWVu -dCBhbmQgYWNjZXB0YW5jZSBvZiB0aGUgdGhlbiBhcHBsaWNhYmxlIHN0YW5k -YXJkIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZSwgdGhlIENlcnRpZmlj -YXRpb24gUHJhY3RpY2UgU3RhdGVtZW50IGFuZCB0aGUgUmVseWluZyBQYXJ0 -eSBBZ3JlZW1lbnQsIHdoaWNoIGNhbiBiZSBmb3VuZCBhdCB0aGUgYmVUUlVT -VGVkIHdlYiBzaXRlLCBodHRwOi8vd3d3LmJldHJ1c3RlZC5jb20vcHJvZHVj -dHNfc2VydmljZXMvaW5kZXguaHRtbDBBBggrBgEFBQcCARY1aHR0cDovL3d3 -dy5iZXRydXN0ZWQuY29tL3Byb2R1Y3RzX3NlcnZpY2VzL2luZGV4Lmh0bWww -HQYDVR0OBBYEFEU9w6nR3D8kVpgccxiIav+DR+22MB8GA1UdIwQYMBaAFEU9 -w6nR3D8kVpgccxiIav+DR+22MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0B -AQUFAAOCAQEASZK8o+6svfoNyYt5hhwjdrCAWXf82n+0S9/DZEtqTg6t8n1Z -dwWtColzsPq8y9yNAIiPpqCy6qxSJ7+hSHyXEHu67RMdmgduyzFiEuhjA6p9 -beP4G3YheBufS0OM00mG9htc9i5gFdPp43t1P9ACg9AYgkHNZTfqjjJ+vWuZ -XTARyNtIVBw74acT02pIk/c9jH8F6M7ziCpjBLjqflh8AXtb4cV97yHgjQ5d -UX2xZ/2jvTg2xvI4hocalmhgRvsoFEdV4aeADGvi6t9NfJBIoDa9CReJf8Py -05yc493EG931t3GzUwWJBtDLSoDByFOQtTwxiBdQn8nEDovYqAJjDQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFLDCCBBSgAwIBAgIEOU99hzANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQG -EwJXVzESMBAGA1UEChMJYmVUUlVTVGVkMRswGQYDVQQDExJiZVRSVVNUZWQg -Um9vdCBDQXMxGjAYBgNVBAMTEWJlVFJVU1RlZCBSb290IENBMB4XDTAwMDYy -MDE0MjEwNFoXDTEwMDYyMDEzMjEwNFowWjELMAkGA1UEBhMCV1cxEjAQBgNV -BAoTCWJlVFJVU1RlZDEbMBkGA1UEAxMSYmVUUlVTVGVkIFJvb3QgQ0FzMRow -GAYDVQQDExFiZVRSVVNUZWQgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBANS0c3oTCjhVAb6JVuGUntS+WutKNHUbYSnE4a0IYCF4 -SP+00PpeQY1hRIfo7clY+vyTmt9P6j41ffgzeubx181vSUs9Ty1uDoM6GHh3 -o8/n9E1z2Jo7Gh2+lVPPIJfCzz4kUmwMjmVZxXH/YgmPqsWPzGCgc0rXOD8V -cr+il7dw6K/ifhYGTPWqZCZyByWtNfwYsSbX2P8ZDoMbjNx4RWc0PfSvHI3k -bWvtILNnmrRhyxdviTX/507AMhLn7uzf/5cwdO2NR47rtMNE5qdMf1ZD6Li8 -tr76g5fmu/vEtpO+GRg+jIG5c4gW9JZDnGdzF5DYCW5jrEq2I8QBoa2k5MUC -AwEAAaOCAfgwggH0MA8GA1UdEwEB/wQFMAMBAf8wggFZBgNVHSAEggFQMIIB -TDCCAUgGCisGAQQBsT4BAAAwggE4MIIBAQYIKwYBBQUHAgIwgfQagfFSZWxp -YW5jZSBvbiB0aGlzIGNlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVz -IGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0 -ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGFuZCBjZXJ0aWZpY2F0aW9u -IHByYWN0aWNlIHN0YXRlbWVudCwgd2hpY2ggY2FuIGJlIGZvdW5kIGF0IGJl -VFJVU1RlZCdzIHdlYiBzaXRlLCBodHRwczovL3d3dy5iZVRSVVNUZWQuY29t -L3ZhdWx0L3Rlcm1zMDEGCCsGAQUFBwIBFiVodHRwczovL3d3dy5iZVRSVVNU -ZWQuY29tL3ZhdWx0L3Rlcm1zMDQGA1UdHwQtMCswKaAnoCWkIzAhMRIwEAYD -VQQKEwliZVRSVVNUZWQxCzAJBgNVBAYTAldXMB0GA1UdDgQWBBQquZtpLjub -2M3eKjEENGvKBxirZzAfBgNVHSMEGDAWgBQquZtpLjub2M3eKjEENGvKBxir -ZzAOBgNVHQ8BAf8EBAMCAf4wDQYJKoZIhvcNAQEFBQADggEBAHlh26Nebhax -6nZR+csVm8tpvuaBa58oH2U+3RGFktToQb9+M70j5/Egv6S0phkBxoyNNXxl -pE8JpNbYIxUFE6dDea/bow6be3ga8wSGWsb2jCBHOElQBp1yZzrwmAOtlmdE -/D8QDYZN5AA7KXvOOzuZhmElQITcE2K3+spZ1gMe1lMBzW1MaFVA4e5rxyoA -AEiCswoBw2AqDPeCNe5IhpbkdNQ96gFxugR1QKepfzk5mlWXKWWuGVUlBXJH -0+gY3Ljpr0NzARJ0o+FcXxVdJPP55PS2Z2cS52QiivalQaYctmBjRYoQtLpG -EK5BV2VsPyMQPyEQWbfkQN0mDCP2qq4= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIGUTCCBTmgAwIBAgIEPLVPQDANBgkqhkiG9w0BAQUFADBmMRIwEAYDVQQK -EwliZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEzMDEG -A1UEAxMqYmVUUlVTVGVkIFJvb3QgQ0EgLSBFbnRydXN0IEltcGxlbWVudGF0 -aW9uMB4XDTAyMDQxMTA4MjQyN1oXDTIyMDQxMTA4NTQyN1owZjESMBAGA1UE -ChMJYmVUUlVTVGVkMRswGQYDVQQLExJiZVRSVVNUZWQgUm9vdCBDQXMxMzAx -BgNVBAMTKmJlVFJVU1RlZCBSb290IENBIC0gRW50cnVzdCBJbXBsZW1lbnRh -dGlvbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALr0RAOqEmq1 -Q+xVkrYwfTVXDNvzDSduTPdQqJtOK2/b9a0cS12zqcH+e0TrW6MFDR/FNCsw -ACnxeECypP869AGIF37m1CbTukzqMvtDd5eHI8XbQ6P1KqNRXuE70mVpflUV -m3rnafdE4Fe1FehmYA8NA/uCjqPoEXtsvsdjDheT389Lrm5zdeDzqrmkwAkb -hepxKYhBMvnwKg5sCfJ0a2ZsUhMfGLzUPvfYbiCeyv78IZTuEyhL11xeDGbu -6bsPwTSxfwh28z0mcMmLJR1iJAzqHHVOwBLkuhMdMCktVjMFu5dZfsZJT4nX -LySotohAtWSSU1Yk5KKghbNekLQSM80CAwEAAaOCAwUwggMBMIIBtwYDVR0g -BIIBrjCCAaowggGmBg8rBgEEAbE+AAACCSiDkTEwggGRMIIBSQYIKwYBBQUH -AgIwggE7GoIBN1JlbGlhbmNlIG9uIG9yIHVzZSBvZiB0aGlzIENlcnRpZmlj -YXRlIGNyZWF0ZXMgYW4gYWNrbm93bGVkZ21lbnQgYW5kIGFjY2VwdGFuY2Ug -b2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29u -ZGl0aW9ucyBvZiB1c2UsIHRoZSBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0 -YXRlbWVudCBhbmQgdGhlIFJlbHlpbmcgUGFydHkgQWdyZWVtZW50LCB3aGlj -aCBjYW4gYmUgZm91bmQgYXQgdGhlIGJlVFJVU1RlZCB3ZWIgc2l0ZSwgaHR0 -cHM6Ly93d3cuYmV0cnVzdGVkLmNvbS9wcm9kdWN0c19zZXJ2aWNlcy9pbmRl -eC5odG1sMEIGCCsGAQUFBwIBFjZodHRwczovL3d3dy5iZXRydXN0ZWQuY29t -L3Byb2R1Y3RzX3NlcnZpY2VzL2luZGV4Lmh0bWwwEQYJYIZIAYb4QgEBBAQD -AgAHMIGJBgNVHR8EgYEwfzB9oHugeaR3MHUxEjAQBgNVBAoTCWJlVFJVU1Rl -ZDEbMBkGA1UECxMSYmVUUlVTVGVkIFJvb3QgQ0FzMTMwMQYDVQQDEypiZVRS -VVNUZWQgUm9vdCBDQSAtIEVudHJ1c3QgSW1wbGVtZW50YXRpb24xDTALBgNV -BAMTBENSTDEwKwYDVR0QBCQwIoAPMjAwMjA0MTEwODI0MjdagQ8yMDIyMDQx -MTA4NTQyN1owCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFH1w5a44iwY/qhwa -j/nPJDCqhIQWMB0GA1UdDgQWBBR9cOWuOIsGP6ocGo/5zyQwqoSEFjAMBgNV -HRMEBTADAQH/MB0GCSqGSIb2fQdBAAQQMA4bCFY2LjA6NC4wAwIEkDANBgkq -hkiG9w0BAQUFAAOCAQEAKrgXzh8QlOu4mre5X+za95IkrNySO8cgjfKZ5V04 -ocI07cUTWVwFtStPYZuR+0H8/NU8TZh2BvWBfevdkObRVlTa4y0MnxEylCIB -evZsLHRnBMylj44ss0O1lKLQfelifwa+JwGDnjr9iu6YQ0pr17WXOzq/T220 -Y/ozADQuLW2WyXvKmWO6vvT2MKAtmJbpVkQFqUSjYRDrgqFnXbxdJ3Wqiig2 -KjiS2d2kXgClzMx8KSreKJCrt+G2/30lC0DYqjSjLd4H61/OCt3Kfjp9JsFi -aDrmLzfzgYYhxKlkqu9FNtEaZnz46TfW1mG+oq1I59/mdP7TbX3SJdysYlep -9w== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFaDCCBFCgAwIBAgIQO1nHe81bV569N1KsdrSqGjANBgkqhkiG9w0BAQUF -ADBiMRIwEAYDVQQKEwliZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBS -b290IENBczEvMC0GA1UEAxMmYmVUUlVTVGVkIFJvb3QgQ0EgLSBSU0EgSW1w -bGVtZW50YXRpb24wHhcNMDIwNDExMTExODEzWhcNMjIwNDEyMTEwNzI1WjBi -MRIwEAYDVQQKEwliZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290 -IENBczEvMC0GA1UEAxMmYmVUUlVTVGVkIFJvb3QgQ0EgLSBSU0EgSW1wbGVt -ZW50YXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkujQw -CY5X0LkGLG9uJIAiv11DpvpPrILnHGhwhRujbrWqeNluB0s/6d/16uhUoWGK -Di9pdRi3DOUUjXFumLhV/AyV0Jtu4S2I1DpAa5LxmZZk3tv/ePTulh1HiXzU -vrmIdyM6CeYEnm2qXtLIvZpOGd+J6lsOfsPktPDgaTuID0GQ+NRxQyTBjyZL -O1bp/4xsN+lFrYWMU8NghpBKlsmzVLC7F/AcRdnUGxlkVgoZ98zh/4avflhe -rHqQH8koOUV7orbHnB/ahdQhhlkwk75TMzf270HPM8ercmsl9fNTGwxMLvF1 -S++gh/f+ihXQbNXL+WhTuXAVE8L1LvtDNXUtAgMBAAGjggIYMIICFDAMBgNV -HRMEBTADAQH/MIIBtQYDVR0gBIIBrDCCAagwggGkBg8rBgEEAbE+AAADCSiD -kTEwggGPMEEGCCsGAQUFBwIBFjVodHRwOi8vd3d3LmJldHJ1c3RlZC5jb20v -cHJvZHVjdHNfc2VydmljZXMvaW5kZXguaHRtbDCCAUgGCCsGAQUFBwICMIIB -OhqCATZSZWxpYW5jZSBvbiBvciB1c2Ugb2YgdGhpcyBDZXJ0aWZpY2F0ZSBj -cmVhdGVzIGFuIGFja25vd2xlZGdtZW50IGFuZCBhY2NlcHRhbmNlIG9mIHRo -ZSB0aGVuIGFwcGxpY2FibGUgc3RhbmRhcmQgdGVybXMgYW5kIGNvbmRpdGlv -bnMgb2YgdXNlLCB0aGUgQ2VydGlmaWNhdGlvbiBQcmFjdGljZSBTdGF0ZW1l -bnQgYW5kIHRoZSBSZWx5aW5nIFBhcnR5IEFncmVlbWVudCwgd2hpY2ggY2Fu -IGJlIGZvdW5kIGF0IHRoZSBiZVRSVVNUZWQgd2ViIHNpdGUsIGh0dHA6Ly93 -d3cuYmV0cnVzdGVkLmNvbS9wcm9kdWN0c19zZXJ2aWNlcy9pbmRleC5odG1s -MAsGA1UdDwQEAwIBBjAfBgNVHSMEGDAWgBSp7BR++dlDzFMrFK3P9/BZiUHN -GTAdBgNVHQ4EFgQUqewUfvnZQ8xTKxStz/fwWYlBzRkwDQYJKoZIhvcNAQEF -BQADggEBANuXsHXqDMTBmMpWBcCorSZIry0g6IHHtt9DwSwddUvUQo3neqh0 -3GZCWYez9Wlt2ames30cMcH1VOJZJEnl7r05pmuKmET7m9cqg5c0Lcd9NUwt -NLg+DcTsiCevnpL9UGGCqGAHFFPMZRPB9kdEadIxyKbdLrML3kqNWz2rDcI1 -UqJWN8wyiyiFQpyRQHpwKzg21eFzGh/l+n5f3NacOzDq28BbJ1zTcwfBwvNM -m2+fG8oeqqg4MwlYsq78B+g23FW6L09A/nq9BqaBwZMifIYRCgZ3SK41ty8y -mmFei74pnykkiFY5LKjSq5YDWtRIn7lAhAuYaPsBQ9Yb4gmxlxw= +MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBr +MQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRl +cm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv +bW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0MDAxNjEyWjBrMQsw +CQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5h +dGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1l +cmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h +2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4E +lpF7sDPwsRROEW+1QK8bRaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdV +ZqW1LS7YgFmypw23RuwhY/81q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq +299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0t +vz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaL +dXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD +AgEGMB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUF +AAOCAQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR +zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3 +LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGIxHYdkFsd +7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBuYQa7FkKMcPcw +++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt +398znM/jra6O1I7mT1GvFpLgXPYHDw== -----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIFajCCBFKgAwIBAgIEPLU9RjANBgkqhkiG9w0BAQUFADBmMRIwEAYDVQQKEwli +ZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEzMDEGA1UEAxMq +YmVUUlVTVGVkIFJvb3QgQ0EtQmFsdGltb3JlIEltcGxlbWVudGF0aW9uMB4XDTAy +MDQxMTA3Mzg1MVoXDTIyMDQxMTA3Mzg1MVowZjESMBAGA1UEChMJYmVUUlVTVGVk +MRswGQYDVQQLExJiZVRSVVNUZWQgUm9vdCBDQXMxMzAxBgNVBAMTKmJlVFJVU1Rl +ZCBSb290IENBLUJhbHRpbW9yZSBJbXBsZW1lbnRhdGlvbjCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBALx+xDmcjOPWHIb/ymKt4H8wRXqOGrO4x/nRNv8i +805qX4QQ+2aBw5R5MdKR4XeOGCrDFN5R9U+jK7wYFuK13XneIviCfsuBH/0nLI/6 +l2Qijvj/YaOcGx6Sj8CoCd8JEey3fTGaGuqDIQY8n7pc/5TqarjDa1U0Tz0yH92B +FODEPM2dMPgwqZfT7syj0B9fHBOB1BirlNFjw55/NZKeX0Tq7PQiXLfoPX2k+Ymp +kbIq2eszh+6l/ePazIjmiSZuxyuC0F6dWdsU7JGDBcNeDsYq0ATdcT0gTlgn/FP7 +eHgZFLL8kFKJOGJgB7Sg7KxrUNb9uShr71ItOrL/8QFArDcCAwEAAaOCAh4wggIa +MA8GA1UdEwEB/wQFMAMBAf8wggG1BgNVHSAEggGsMIIBqDCCAaQGDysGAQQBsT4A +AAEJKIORMTCCAY8wggFIBggrBgEFBQcCAjCCAToaggE2UmVsaWFuY2Ugb24gb3Ig +dXNlIG9mIHRoaXMgQ2VydGlmaWNhdGUgY3JlYXRlcyBhbiBhY2tub3dsZWRnbWVu +dCBhbmQgYWNjZXB0YW5jZSBvZiB0aGUgdGhlbiBhcHBsaWNhYmxlIHN0YW5kYXJk +IHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZSwgdGhlIENlcnRpZmljYXRpb24g +UHJhY3RpY2UgU3RhdGVtZW50IGFuZCB0aGUgUmVseWluZyBQYXJ0eSBBZ3JlZW1l +bnQsIHdoaWNoIGNhbiBiZSBmb3VuZCBhdCB0aGUgYmVUUlVTVGVkIHdlYiBzaXRl +LCBodHRwOi8vd3d3LmJldHJ1c3RlZC5jb20vcHJvZHVjdHNfc2VydmljZXMvaW5k +ZXguaHRtbDBBBggrBgEFBQcCARY1aHR0cDovL3d3dy5iZXRydXN0ZWQuY29tL3By +b2R1Y3RzX3NlcnZpY2VzL2luZGV4Lmh0bWwwHQYDVR0OBBYEFEU9w6nR3D8kVpgc +cxiIav+DR+22MB8GA1UdIwQYMBaAFEU9w6nR3D8kVpgccxiIav+DR+22MA4GA1Ud +DwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEASZK8o+6svfoNyYt5hhwjdrCA +WXf82n+0S9/DZEtqTg6t8n1ZdwWtColzsPq8y9yNAIiPpqCy6qxSJ7+hSHyXEHu6 +7RMdmgduyzFiEuhjA6p9beP4G3YheBufS0OM00mG9htc9i5gFdPp43t1P9ACg9AY +gkHNZTfqjjJ+vWuZXTARyNtIVBw74acT02pIk/c9jH8F6M7ziCpjBLjqflh8AXtb +4cV97yHgjQ5dUX2xZ/2jvTg2xvI4hocalmhgRvsoFEdV4aeADGvi6t9NfJBIoDa9 +CReJf8Py05yc493EG931t3GzUwWJBtDLSoDByFOQtTwxiBdQn8nEDovYqAJjDQ== +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIFLDCCBBSgAwIBAgIEOU99hzANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJX +VzESMBAGA1UEChMJYmVUUlVTVGVkMRswGQYDVQQDExJiZVRSVVNUZWQgUm9vdCBD +QXMxGjAYBgNVBAMTEWJlVFJVU1RlZCBSb290IENBMB4XDTAwMDYyMDE0MjEwNFoX +DTEwMDYyMDEzMjEwNFowWjELMAkGA1UEBhMCV1cxEjAQBgNVBAoTCWJlVFJVU1Rl +ZDEbMBkGA1UEAxMSYmVUUlVTVGVkIFJvb3QgQ0FzMRowGAYDVQQDExFiZVRSVVNU +ZWQgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANS0c3oT +CjhVAb6JVuGUntS+WutKNHUbYSnE4a0IYCF4SP+00PpeQY1hRIfo7clY+vyTmt9P +6j41ffgzeubx181vSUs9Ty1uDoM6GHh3o8/n9E1z2Jo7Gh2+lVPPIJfCzz4kUmwM +jmVZxXH/YgmPqsWPzGCgc0rXOD8Vcr+il7dw6K/ifhYGTPWqZCZyByWtNfwYsSbX +2P8ZDoMbjNx4RWc0PfSvHI3kbWvtILNnmrRhyxdviTX/507AMhLn7uzf/5cwdO2N +R47rtMNE5qdMf1ZD6Li8tr76g5fmu/vEtpO+GRg+jIG5c4gW9JZDnGdzF5DYCW5j +rEq2I8QBoa2k5MUCAwEAAaOCAfgwggH0MA8GA1UdEwEB/wQFMAMBAf8wggFZBgNV +HSAEggFQMIIBTDCCAUgGCisGAQQBsT4BAAAwggE4MIIBAQYIKwYBBQUHAgIwgfQa +gfFSZWxpYW5jZSBvbiB0aGlzIGNlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBhc3N1 +bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0 +ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGFuZCBjZXJ0aWZpY2F0aW9uIHBy +YWN0aWNlIHN0YXRlbWVudCwgd2hpY2ggY2FuIGJlIGZvdW5kIGF0IGJlVFJVU1Rl +ZCdzIHdlYiBzaXRlLCBodHRwczovL3d3dy5iZVRSVVNUZWQuY29tL3ZhdWx0L3Rl +cm1zMDEGCCsGAQUFBwIBFiVodHRwczovL3d3dy5iZVRSVVNUZWQuY29tL3ZhdWx0 +L3Rlcm1zMDQGA1UdHwQtMCswKaAnoCWkIzAhMRIwEAYDVQQKEwliZVRSVVNUZWQx +CzAJBgNVBAYTAldXMB0GA1UdDgQWBBQquZtpLjub2M3eKjEENGvKBxirZzAfBgNV +HSMEGDAWgBQquZtpLjub2M3eKjEENGvKBxirZzAOBgNVHQ8BAf8EBAMCAf4wDQYJ +KoZIhvcNAQEFBQADggEBAHlh26Nebhax6nZR+csVm8tpvuaBa58oH2U+3RGFktTo +Qb9+M70j5/Egv6S0phkBxoyNNXxlpE8JpNbYIxUFE6dDea/bow6be3ga8wSGWsb2 +jCBHOElQBp1yZzrwmAOtlmdE/D8QDYZN5AA7KXvOOzuZhmElQITcE2K3+spZ1gMe +1lMBzW1MaFVA4e5rxyoAAEiCswoBw2AqDPeCNe5IhpbkdNQ96gFxugR1QKepfzk5 +mlWXKWWuGVUlBXJH0+gY3Ljpr0NzARJ0o+FcXxVdJPP55PS2Z2cS52QiivalQaYc +tmBjRYoQtLpGEK5BV2VsPyMQPyEQWbfkQN0mDCP2qq4= +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIGUTCCBTmgAwIBAgIEPLVPQDANBgkqhkiG9w0BAQUFADBmMRIwEAYDVQQKEwli +ZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEzMDEGA1UEAxMq +YmVUUlVTVGVkIFJvb3QgQ0EgLSBFbnRydXN0IEltcGxlbWVudGF0aW9uMB4XDTAy +MDQxMTA4MjQyN1oXDTIyMDQxMTA4NTQyN1owZjESMBAGA1UEChMJYmVUUlVTVGVk +MRswGQYDVQQLExJiZVRSVVNUZWQgUm9vdCBDQXMxMzAxBgNVBAMTKmJlVFJVU1Rl +ZCBSb290IENBIC0gRW50cnVzdCBJbXBsZW1lbnRhdGlvbjCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBALr0RAOqEmq1Q+xVkrYwfTVXDNvzDSduTPdQqJtO +K2/b9a0cS12zqcH+e0TrW6MFDR/FNCswACnxeECypP869AGIF37m1CbTukzqMvtD +d5eHI8XbQ6P1KqNRXuE70mVpflUVm3rnafdE4Fe1FehmYA8NA/uCjqPoEXtsvsdj +DheT389Lrm5zdeDzqrmkwAkbhepxKYhBMvnwKg5sCfJ0a2ZsUhMfGLzUPvfYbiCe +yv78IZTuEyhL11xeDGbu6bsPwTSxfwh28z0mcMmLJR1iJAzqHHVOwBLkuhMdMCkt +VjMFu5dZfsZJT4nXLySotohAtWSSU1Yk5KKghbNekLQSM80CAwEAAaOCAwUwggMB +MIIBtwYDVR0gBIIBrjCCAaowggGmBg8rBgEEAbE+AAACCSiDkTEwggGRMIIBSQYI +KwYBBQUHAgIwggE7GoIBN1JlbGlhbmNlIG9uIG9yIHVzZSBvZiB0aGlzIENlcnRp +ZmljYXRlIGNyZWF0ZXMgYW4gYWNrbm93bGVkZ21lbnQgYW5kIGFjY2VwdGFuY2Ug +b2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0 +aW9ucyBvZiB1c2UsIHRoZSBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu +dCBhbmQgdGhlIFJlbHlpbmcgUGFydHkgQWdyZWVtZW50LCB3aGljaCBjYW4gYmUg +Zm91bmQgYXQgdGhlIGJlVFJVU1RlZCB3ZWIgc2l0ZSwgaHR0cHM6Ly93d3cuYmV0 +cnVzdGVkLmNvbS9wcm9kdWN0c19zZXJ2aWNlcy9pbmRleC5odG1sMEIGCCsGAQUF +BwIBFjZodHRwczovL3d3dy5iZXRydXN0ZWQuY29tL3Byb2R1Y3RzX3NlcnZpY2Vz +L2luZGV4Lmh0bWwwEQYJYIZIAYb4QgEBBAQDAgAHMIGJBgNVHR8EgYEwfzB9oHug +eaR3MHUxEjAQBgNVBAoTCWJlVFJVU1RlZDEbMBkGA1UECxMSYmVUUlVTVGVkIFJv +b3QgQ0FzMTMwMQYDVQQDEypiZVRSVVNUZWQgUm9vdCBDQSAtIEVudHJ1c3QgSW1w +bGVtZW50YXRpb24xDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMjAwMjA0MTEw +ODI0MjdagQ8yMDIyMDQxMTA4NTQyN1owCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaA +FH1w5a44iwY/qhwaj/nPJDCqhIQWMB0GA1UdDgQWBBR9cOWuOIsGP6ocGo/5zyQw +qoSEFjAMBgNVHRMEBTADAQH/MB0GCSqGSIb2fQdBAAQQMA4bCFY2LjA6NC4wAwIE +kDANBgkqhkiG9w0BAQUFAAOCAQEAKrgXzh8QlOu4mre5X+za95IkrNySO8cgjfKZ +5V04ocI07cUTWVwFtStPYZuR+0H8/NU8TZh2BvWBfevdkObRVlTa4y0MnxEylCIB +evZsLHRnBMylj44ss0O1lKLQfelifwa+JwGDnjr9iu6YQ0pr17WXOzq/T220Y/oz +ADQuLW2WyXvKmWO6vvT2MKAtmJbpVkQFqUSjYRDrgqFnXbxdJ3Wqiig2KjiS2d2k +XgClzMx8KSreKJCrt+G2/30lC0DYqjSjLd4H61/OCt3Kfjp9JsFiaDrmLzfzgYYh +xKlkqu9FNtEaZnz46TfW1mG+oq1I59/mdP7TbX3SJdysYlep9w== +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIFaDCCBFCgAwIBAgIQO1nHe81bV569N1KsdrSqGjANBgkqhkiG9w0BAQUFADBi +MRIwEAYDVQQKEwliZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENB +czEvMC0GA1UEAxMmYmVUUlVTVGVkIFJvb3QgQ0EgLSBSU0EgSW1wbGVtZW50YXRp +b24wHhcNMDIwNDExMTExODEzWhcNMjIwNDEyMTEwNzI1WjBiMRIwEAYDVQQKEwli +ZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEvMC0GA1UEAxMm +YmVUUlVTVGVkIFJvb3QgQ0EgLSBSU0EgSW1wbGVtZW50YXRpb24wggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkujQwCY5X0LkGLG9uJIAiv11DpvpPrILn +HGhwhRujbrWqeNluB0s/6d/16uhUoWGKDi9pdRi3DOUUjXFumLhV/AyV0Jtu4S2I +1DpAa5LxmZZk3tv/ePTulh1HiXzUvrmIdyM6CeYEnm2qXtLIvZpOGd+J6lsOfsPk +tPDgaTuID0GQ+NRxQyTBjyZLO1bp/4xsN+lFrYWMU8NghpBKlsmzVLC7F/AcRdnU +GxlkVgoZ98zh/4avflherHqQH8koOUV7orbHnB/ahdQhhlkwk75TMzf270HPM8er +cmsl9fNTGwxMLvF1S++gh/f+ihXQbNXL+WhTuXAVE8L1LvtDNXUtAgMBAAGjggIY +MIICFDAMBgNVHRMEBTADAQH/MIIBtQYDVR0gBIIBrDCCAagwggGkBg8rBgEEAbE+ +AAADCSiDkTEwggGPMEEGCCsGAQUFBwIBFjVodHRwOi8vd3d3LmJldHJ1c3RlZC5j +b20vcHJvZHVjdHNfc2VydmljZXMvaW5kZXguaHRtbDCCAUgGCCsGAQUFBwICMIIB +OhqCATZSZWxpYW5jZSBvbiBvciB1c2Ugb2YgdGhpcyBDZXJ0aWZpY2F0ZSBjcmVh +dGVzIGFuIGFja25vd2xlZGdtZW50IGFuZCBhY2NlcHRhbmNlIG9mIHRoZSB0aGVu +IGFwcGxpY2FibGUgc3RhbmRhcmQgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdXNl +LCB0aGUgQ2VydGlmaWNhdGlvbiBQcmFjdGljZSBTdGF0ZW1lbnQgYW5kIHRoZSBS +ZWx5aW5nIFBhcnR5IEFncmVlbWVudCwgd2hpY2ggY2FuIGJlIGZvdW5kIGF0IHRo +ZSBiZVRSVVNUZWQgd2ViIHNpdGUsIGh0dHA6Ly93d3cuYmV0cnVzdGVkLmNvbS9w +cm9kdWN0c19zZXJ2aWNlcy9pbmRleC5odG1sMAsGA1UdDwQEAwIBBjAfBgNVHSME +GDAWgBSp7BR++dlDzFMrFK3P9/BZiUHNGTAdBgNVHQ4EFgQUqewUfvnZQ8xTKxSt +z/fwWYlBzRkwDQYJKoZIhvcNAQEFBQADggEBANuXsHXqDMTBmMpWBcCorSZIry0g +6IHHtt9DwSwddUvUQo3neqh03GZCWYez9Wlt2ames30cMcH1VOJZJEnl7r05pmuK +mET7m9cqg5c0Lcd9NUwtNLg+DcTsiCevnpL9UGGCqGAHFFPMZRPB9kdEadIxyKbd +LrML3kqNWz2rDcI1UqJWN8wyiyiFQpyRQHpwKzg21eFzGh/l+n5f3NacOzDq28Bb +J1zTcwfBwvNMm2+fG8oeqqg4MwlYsq78B+g23FW6L09A/nq9BqaBwZMifIYRCgZ3 +SK41ty8ymmFei74pnykkiFY5LKjSq5YDWtRIn7lAhAuYaPsBQ9Yb4gmxlxw= +-----END CERTIFICATE----- + -----BEGIN CERTIFICATE----- MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0 @@ -1545,74 +1520,89 @@ SnQ2+Q== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIETzCCAzegAwIBAgIEO63vKTANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQTDEfMB0GA1UE -ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg -U2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBSb290Q0EwHhcNMDEwOTIzMTQxODE3WhcNMTEw -OTIzMTMxODE3WjB1MQswCQYDVQQGEwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5v -LjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MR8wHQYDVQQDExZDQyBTaWdu -ZXQgLSBDQSBLbGFzYSAxMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC4SRW9Q58g5DY1Hw7h -gCRKBEdPdGn0MFHsfw7rlu/oQm7IChI/uWd9q5wwo77YojtTDjRnpgZsjqBeynX8T90vFILqsY2K -5CF1OESalwvVr3sZiQX79lisuFKat92u6hBFikFIVxfHHB67Af+g7u0dEHdDW7lwy81MwFYxBTRy -9wIDAQABo4IBbTCCAWkwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwggEEBgNVHSAE -gfwwgfkwgfYGDSsGAQQBvj8CAQoBAQAwgeQwgZoGCCsGAQUFBwICMIGNGoGKQ2VydHlmaWthdCB3 -eXN0YXdpb255IHpnb2RuaWUgeiBkb2t1bWVudGVtOiAiUG9saXR5a2EgQ2VydHlmaWthY2ppIGRs -YSBSb290Q0EiLiBDZXJ0eWZpa2F0IHd5c3Rhd2lvbnkgcHJ6ZXogUm9vdENBIHcgaGllcmFyY2hp -aSBDQyBTaWduZXQuMEUGCCsGAQUFBwIBFjlodHRwOi8vd3d3LnNpZ25ldC5wbC9yZXBvenl0b3Jp -dW0vZG9rdW1lbnR5L3BjX3Jvb3RjYS50eHQwHwYDVR0jBBgwFoAUwJvFIw0C4aZOSGsfAOnjmhQb -sa8wHQYDVR0OBBYEFMODHtVZd1T7TftXR/nEI1zR54njMA0GCSqGSIb3DQEBBQUAA4IBAQBRIHQB -FIGh8Jpxt87AgSLwIEEk4+oGy769u3NtoaR0R3WNMdmt7fXTi0tyTQ9V4AIszxVjhnUPaKnF1KYy -f8Tl+YTzk9ZfFkZ3kCdSaILZAOIrmqWNLPmjUQ5/JiMGho0e1YmWUcMci84+pIisTsytFzVP32/W -+sz2H4FQAvOIMmxB7EJX9AdbnXn9EXZ+4nCqi0ft5z96ZqOJJiCB3vSaoYg+wdkcvb6souMJzuc2 -uptXtR1Xf3ihlHaGW+hmnpcwFA6AoNrom6Vgzk6U1ienx0Cw28BhRSKqzKkyXkuK8gRflZUx84uf -tXncwKJrMiE3lvgOOBITRzcahirLer4c ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIE9zCCA9+gAwIBAgIEPL/xoTANBgkqhkiG9w0BAQUFADB2MQswCQYDVQQGEwJQTDEfMB0GA1UE -ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg -U2lnbmV0MSAwHgYDVQQDExdDQyBTaWduZXQgLSBQQ0EgS2xhc2EgMjAeFw0wMjA0MTkxMDI5NTNa -Fw0xNzA0MTgxMjUzMDdaMHUxCzAJBgNVBAYTAlBMMR8wHQYDVQQKExZUUCBJbnRlcm5ldCBTcC4g -eiBvLm8uMSQwIgYDVQQLExtDZW50cnVtIENlcnR5ZmlrYWNqaSBTaWduZXQxHzAdBgNVBAMTFkND -IFNpZ25ldCAtIENBIEtsYXNhIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqgLJu -QqY4yavbSgHg8CyfKTx4BokNSDOVz4eD9vptUr11Kqd06ED1hlH7Sg0goBFAfntNU/QTKwSBaNui -me7C4sSEdgsKrPoAhGb4Mq8y7Ty7RqZz7mkzNMqzL2L2U4yQ2QjvpH8MH0IBqOWEcpSkpwnrCDIm -RoTfd+YlZWKi2JceQixUUYIQ45Ox8+x8hHbvvZdgqtcvo8PW27qoHkp/7hMuJ44kDAGrmxffBXl/ -OBRZp0uO1CSLcMcVJzyr2phKhy406MYdWrtNPEluGs0GFDzd0nrIctiWAO4cmct4S72S9Q6e//0G -O9f3/Ca5Kb2I1xYLj/xE+HgjHX9aD2MhAgMBAAGjggGMMIIBiDAPBgNVHRMBAf8EBTADAQH/MA4G -A1UdDwEB/wQEAwIBBjCB4wYDVR0gBIHbMIHYMIHVBg0rBgEEAb4/AhQKAQEAMIHDMHUGCCsGAQUF -BwICMGkaZ0NlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmllIHogZG9rdW1lbnRlbTogIlBvbGl0 -eWthIENlcnR5ZmlrYWNqaSBQQ0EyIC0gQ2VydHlmaWthdHkgVXJ6ZWRvdyBLbGFzeSAyIi4wSgYI -KwYBBQUHAgEWPmh0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9kb2t1bWVudHkva2xh -c2EyL3BjX3BjYTIudHh0MD8GA1UdHwQ4MDYwNKAyoDCGLmh0dHA6Ly93d3cuc2lnbmV0LnBsL3Jl -cG96eXRvcml1bS9jcmwvcGNhMi5jcmwwHwYDVR0jBBgwFoAUwGxGyl2CfpYHRonE82AVXO08kMIw -HQYDVR0OBBYEFLtFBlILy4HNKVSzvHxBTM0HDowlMA0GCSqGSIb3DQEBBQUAA4IBAQBWTsCbqXrX -hBBev5v5cIuc6gJM8ww7oR0uMQRZoFSqvQUPWBYM2/TLI/f8UM9hSShUVj3zEsSj/vFHagUVmzuV -Xo5u0WK8iaqATSyEVBhADHrPG6wYcLKJlagge/ILA0m+SieyP2sjYD9MUB9KZIEyBKv0429UuDTw -6P7pslxMWJBSNyQxaLIs0SRKsqZZWkc7ZYAj2apSkBMX2Is1oHA+PwkF6jQMwCao/+CndXPUzfCF -6caa9WwW31W26MlXCvSmJgfiTPwGvm4PkPmOnmWZ3CczzhHl4q7ztHFzshJH3sZWDnrWwBFjzz5e -Pr3WHV1wA7EY6oT4zBx+2gT9XBTB ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEUzCCAzugAwIBAgIEPq+qjzANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQGEwJQTDE3MDUGA1UE -ChMuQ1ppQyBDZW50cmFzdCBTQSB3IGltaWVuaXUgTWluaXN0cmEgR29zcG9kYXJraTEZMBcGA1UE -AxMQQ1ppQyBDZW50cmFzdCBTQTAeFw0wMzA0MzAxMDUwNTVaFw0wODA0MjgxMDUwNTVaMGgxCzAJ -BgNVBAYTAlBMMR8wHQYDVQQKExZUUCBJbnRlcm5ldCBTcC4geiBvLm8uMR8wHQYDVQQDExZDQyBT -aWduZXQgLSBDQSBLbGFzYSAzMRcwFQYDVQQFEw5OdW1lciB3cGlzdTogNDCCASIwDQYJKoZIhvcN -AQEBBQADggEPADCCAQoCggEBALVdeOM62cPH2NERFxbS5FIp/HSv3fgesdVsTUFxZbGtE+/E0RMl -KZQJHH9emx7vRYubsi4EOLCjYsCOTFvgGRIpZzx7R7T5c0Di5XFkRU4gjBl7aHJoKb5SLzGlWdoX -GsekVtl6keEACrizV2EafqjI8cnBWY7OxQ1ooLQp5AeFjXg+5PT0lO6TUZAubqjFbhVbxSWjqvdj -93RGfyYE76MnNn4c2xWySD07n7uno06TC0IJe6+3WSX1h+76VsIFouWBXOoM7cxxiLjoqdBVu24+ -P8e81SukE7qEvOwDPmk9ZJFtt1nBNg8a1kaixcljrA/43XwOPz6qnJ+cIj/xywECAwEAAaOCAQow -ggEGMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMDMGA1UdIAEB/wQpMCcwJQYEVR0g -ADAdMBsGCCsGAQUFBwIBFg93d3cuY2VudHJhc3QucGwwgY4GA1UdIwSBhjCBg4AU2a7r85Cp1iJN -W0Ca1LR6VG3996ShZaRjMGExCzAJBgNVBAYTAlBMMTcwNQYDVQQKEy5DWmlDIENlbnRyYXN0IFNB -IHcgaW1pZW5pdSBNaW5pc3RyYSBHb3Nwb2RhcmtpMRkwFwYDVQQDExBDWmlDIENlbnRyYXN0IFNB -ggQ9/0sQMB0GA1UdDgQWBBR7Y8wZkHq0zrY7nn1tFSdQ0PlJuTANBgkqhkiG9w0BAQUFAAOCAQEA -ldt/svO5c1MU08FKgrOXCGEbEPbQxhpM0xcd6Iv3dCo6qugEgjEs9Qm5CwUNKMnFsvR27cJWUvZb -MVcvwlwCwclOdwF6u/QRS8bC2HYErhYo9bp9yuxxzuow2A94c5fPqfVrjXy+vDouchAm6+A5Wjzv -J8wxVFDCs+9iGACmyUWr/JGXCYiQIbQkwlkRKHHlan9ymKf1NvIej/3EpeT8fKr6ywxGuhAfqofW -pg3WJY/RCB4lTzD8vZGNwfMFGkWhJkypad3i9w3lGmDVpsHaWtCgGfd0H7tUtWPkP+t7EjIRCD9J -HYnTR+wbbewc5vOI+UobR15ynGfFIaSIiMTVtQ== +MIIETzCCAzegAwIBAgIEO63vKTANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQ +TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2Vu +dHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBS +b290Q0EwHhcNMDEwOTIzMTQxODE3WhcNMTEwOTIzMTMxODE3WjB1MQswCQYDVQQG +EwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMb +Q2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MR8wHQYDVQQDExZDQyBTaWduZXQg +LSBDQSBLbGFzYSAxMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC4SRW9Q58g +5DY1Hw7hgCRKBEdPdGn0MFHsfw7rlu/oQm7IChI/uWd9q5wwo77YojtTDjRnpgZs +jqBeynX8T90vFILqsY2K5CF1OESalwvVr3sZiQX79lisuFKat92u6hBFikFIVxfH +HB67Af+g7u0dEHdDW7lwy81MwFYxBTRy9wIDAQABo4IBbTCCAWkwDwYDVR0TAQH/ +BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwggEEBgNVHSAEgfwwgfkwgfYGDSsGAQQB +vj8CAQoBAQAwgeQwgZoGCCsGAQUFBwICMIGNGoGKQ2VydHlmaWthdCB3eXN0YXdp +b255IHpnb2RuaWUgeiBkb2t1bWVudGVtOiAiUG9saXR5a2EgQ2VydHlmaWthY2pp +IGRsYSBSb290Q0EiLiBDZXJ0eWZpa2F0IHd5c3Rhd2lvbnkgcHJ6ZXogUm9vdENB +IHcgaGllcmFyY2hpaSBDQyBTaWduZXQuMEUGCCsGAQUFBwIBFjlodHRwOi8vd3d3 +LnNpZ25ldC5wbC9yZXBvenl0b3JpdW0vZG9rdW1lbnR5L3BjX3Jvb3RjYS50eHQw +HwYDVR0jBBgwFoAUwJvFIw0C4aZOSGsfAOnjmhQbsa8wHQYDVR0OBBYEFMODHtVZ +d1T7TftXR/nEI1zR54njMA0GCSqGSIb3DQEBBQUAA4IBAQBRIHQBFIGh8Jpxt87A +gSLwIEEk4+oGy769u3NtoaR0R3WNMdmt7fXTi0tyTQ9V4AIszxVjhnUPaKnF1KYy +f8Tl+YTzk9ZfFkZ3kCdSaILZAOIrmqWNLPmjUQ5/JiMGho0e1YmWUcMci84+pIis +TsytFzVP32/W+sz2H4FQAvOIMmxB7EJX9AdbnXn9EXZ+4nCqi0ft5z96ZqOJJiCB +3vSaoYg+wdkcvb6souMJzuc2uptXtR1Xf3ihlHaGW+hmnpcwFA6AoNrom6Vgzk6U +1ienx0Cw28BhRSKqzKkyXkuK8gRflZUx84uftXncwKJrMiE3lvgOOBITRzcahirL +er4c +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIE9zCCA9+gAwIBAgIEPL/xoTANBgkqhkiG9w0BAQUFADB2MQswCQYDVQQGEwJQ +TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2Vu +dHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MSAwHgYDVQQDExdDQyBTaWduZXQgLSBQ +Q0EgS2xhc2EgMjAeFw0wMjA0MTkxMDI5NTNaFw0xNzA0MTgxMjUzMDdaMHUxCzAJ +BgNVBAYTAlBMMR8wHQYDVQQKExZUUCBJbnRlcm5ldCBTcC4geiBvLm8uMSQwIgYD +VQQLExtDZW50cnVtIENlcnR5ZmlrYWNqaSBTaWduZXQxHzAdBgNVBAMTFkNDIFNp +Z25ldCAtIENBIEtsYXNhIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQCqgLJuQqY4yavbSgHg8CyfKTx4BokNSDOVz4eD9vptUr11Kqd06ED1hlH7Sg0g +oBFAfntNU/QTKwSBaNuime7C4sSEdgsKrPoAhGb4Mq8y7Ty7RqZz7mkzNMqzL2L2 +U4yQ2QjvpH8MH0IBqOWEcpSkpwnrCDImRoTfd+YlZWKi2JceQixUUYIQ45Ox8+x8 +hHbvvZdgqtcvo8PW27qoHkp/7hMuJ44kDAGrmxffBXl/OBRZp0uO1CSLcMcVJzyr +2phKhy406MYdWrtNPEluGs0GFDzd0nrIctiWAO4cmct4S72S9Q6e//0GO9f3/Ca5 +Kb2I1xYLj/xE+HgjHX9aD2MhAgMBAAGjggGMMIIBiDAPBgNVHRMBAf8EBTADAQH/ +MA4GA1UdDwEB/wQEAwIBBjCB4wYDVR0gBIHbMIHYMIHVBg0rBgEEAb4/AhQKAQEA +MIHDMHUGCCsGAQUFBwICMGkaZ0NlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmll +IHogZG9rdW1lbnRlbTogIlBvbGl0eWthIENlcnR5ZmlrYWNqaSBQQ0EyIC0gQ2Vy +dHlmaWthdHkgVXJ6ZWRvdyBLbGFzeSAyIi4wSgYIKwYBBQUHAgEWPmh0dHA6Ly93 +d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9kb2t1bWVudHkva2xhc2EyL3BjX3Bj +YTIudHh0MD8GA1UdHwQ4MDYwNKAyoDCGLmh0dHA6Ly93d3cuc2lnbmV0LnBsL3Jl +cG96eXRvcml1bS9jcmwvcGNhMi5jcmwwHwYDVR0jBBgwFoAUwGxGyl2CfpYHRonE +82AVXO08kMIwHQYDVR0OBBYEFLtFBlILy4HNKVSzvHxBTM0HDowlMA0GCSqGSIb3 +DQEBBQUAA4IBAQBWTsCbqXrXhBBev5v5cIuc6gJM8ww7oR0uMQRZoFSqvQUPWBYM +2/TLI/f8UM9hSShUVj3zEsSj/vFHagUVmzuVXo5u0WK8iaqATSyEVBhADHrPG6wY +cLKJlagge/ILA0m+SieyP2sjYD9MUB9KZIEyBKv0429UuDTw6P7pslxMWJBSNyQx +aLIs0SRKsqZZWkc7ZYAj2apSkBMX2Is1oHA+PwkF6jQMwCao/+CndXPUzfCF6caa +9WwW31W26MlXCvSmJgfiTPwGvm4PkPmOnmWZ3CczzhHl4q7ztHFzshJH3sZWDnrW +wBFjzz5ePr3WHV1wA7EY6oT4zBx+2gT9XBTB +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIEUzCCAzugAwIBAgIEPq+qjzANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQGEwJQ +TDE3MDUGA1UEChMuQ1ppQyBDZW50cmFzdCBTQSB3IGltaWVuaXUgTWluaXN0cmEg +R29zcG9kYXJraTEZMBcGA1UEAxMQQ1ppQyBDZW50cmFzdCBTQTAeFw0wMzA0MzAx +MDUwNTVaFw0wODA0MjgxMDUwNTVaMGgxCzAJBgNVBAYTAlBMMR8wHQYDVQQKExZU +UCBJbnRlcm5ldCBTcC4geiBvLm8uMR8wHQYDVQQDExZDQyBTaWduZXQgLSBDQSBL +bGFzYSAzMRcwFQYDVQQFEw5OdW1lciB3cGlzdTogNDCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBALVdeOM62cPH2NERFxbS5FIp/HSv3fgesdVsTUFxZbGt +E+/E0RMlKZQJHH9emx7vRYubsi4EOLCjYsCOTFvgGRIpZzx7R7T5c0Di5XFkRU4g +jBl7aHJoKb5SLzGlWdoXGsekVtl6keEACrizV2EafqjI8cnBWY7OxQ1ooLQp5AeF +jXg+5PT0lO6TUZAubqjFbhVbxSWjqvdj93RGfyYE76MnNn4c2xWySD07n7uno06T +C0IJe6+3WSX1h+76VsIFouWBXOoM7cxxiLjoqdBVu24+P8e81SukE7qEvOwDPmk9 +ZJFtt1nBNg8a1kaixcljrA/43XwOPz6qnJ+cIj/xywECAwEAAaOCAQowggEGMA8G +A1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMDMGA1UdIAEB/wQpMCcwJQYE +VR0gADAdMBsGCCsGAQUFBwIBFg93d3cuY2VudHJhc3QucGwwgY4GA1UdIwSBhjCB +g4AU2a7r85Cp1iJNW0Ca1LR6VG3996ShZaRjMGExCzAJBgNVBAYTAlBMMTcwNQYD +VQQKEy5DWmlDIENlbnRyYXN0IFNBIHcgaW1pZW5pdSBNaW5pc3RyYSBHb3Nwb2Rh +cmtpMRkwFwYDVQQDExBDWmlDIENlbnRyYXN0IFNBggQ9/0sQMB0GA1UdDgQWBBR7 +Y8wZkHq0zrY7nn1tFSdQ0PlJuTANBgkqhkiG9w0BAQUFAAOCAQEAldt/svO5c1MU +08FKgrOXCGEbEPbQxhpM0xcd6Iv3dCo6qugEgjEs9Qm5CwUNKMnFsvR27cJWUvZb +MVcvwlwCwclOdwF6u/QRS8bC2HYErhYo9bp9yuxxzuow2A94c5fPqfVrjXy+vDou +chAm6+A5WjzvJ8wxVFDCs+9iGACmyUWr/JGXCYiQIbQkwlkRKHHlan9ymKf1NvIe +j/3EpeT8fKr6ywxGuhAfqofWpg3WJY/RCB4lTzD8vZGNwfMFGkWhJkypad3i9w3l +GmDVpsHaWtCgGfd0H7tUtWPkP+t7EjIRCD9JHYnTR+wbbewc5vOI+UobR15ynGfF +IaSIiMTVtQ== -----END CERTIFICATE----- + -----BEGIN CERTIFICATE----- MIIEejCCA2KgAwIBAgIEP4vk6TANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJQ TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2Vu @@ -1639,6 +1629,7 @@ iCNe431axGNDWKnpuj2KUpj4CFHYsWCXky847YtTXDjri9NIwJJauazsrSjK+oXp ngRS506mdQ7vWrtApkh8zhhWp7duCkjcCo1O8JxqYr2qEW1fXmgOISe010v2mmuv hHxPyVwoAU4KkOw0nbXZn53yak0is5+XmAjh0wWue44AssHrjC9nUh3mkLt6eQ== -----END CERTIFICATE----- + -----BEGIN CERTIFICATE----- MIIEezCCA2OgAwIBAgIEP4vnLzANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJQ TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEfMB0GA1UEAxMWQ0Mg @@ -1665,100 +1656,123 @@ upyWls1BmYUxB91R7QkTiAUSNZ87s3auhZuG4f0V0JLVCcg2rn7AN1rfMkgxCbHk GxiQbYWFljl6aatxR3odnnzVUe1I8uoY2JXpmmUcOG4dNGuQYziyKG3mtXCQWvug 5qi9Mf3KUh1oSTKx6HfLjjNl1+wMB5Mdb8LF0XyZLdJM9yIZh7SBRsYm9QiXevY= -----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIFGjCCBAKgAwIBAgIEPL7eEDANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQ +TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2Vu +dHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBS +b290Q0EwHhcNMDIwNDE4MTQ1NDA4WhcNMjYwOTIxMTU0MjE5WjB2MQswCQYDVQQG +EwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMb +Q2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MSAwHgYDVQQDExdDQyBTaWduZXQg +LSBQQ0EgS2xhc2EgMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM7B +rBlbN5maM5eg0BOTqoZ+9NBDvU8Lm5rTdrMswFTCathzpVVLK/JD4K3+4oCZ9SRA +spEXE4gvwb08ASY6w5s+HpRkeJw8YzMFR5kDZD5adgnCAy4vDfIXYZgppXPaTQ8w +nfUZ7BZ7Zfa7QBemUIcJIzJBB0UqgtxWCeol9IekpBRVmuuSA6QG0Jkm+pGDJ05y +j2eQG8jTcBENM7sVA8rGRMyFA4skSZ+D0OG6FS2xC1i9JyN0ag1yII/LPx8HK5J4 +W9MaPRNjAEeaa2qI9EpchwrOxnyVbQfSedCG1VRJfAsE/9tT9CMUPZ3xW20QjQcS +ZJqVcmGW9gVsXKQOVLsCAwEAAaOCAbMwggGvMA8GA1UdEwEB/wQFMAMBAf8wDgYD +VR0PAQH/BAQDAgEGMIIBBAYDVR0gBIH8MIH5MIH2Bg0rBgEEAb4/AgEKAQEBMIHk +MIGaBggrBgEFBQcCAjCBjRqBikNlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmll +IHogZG9rdW1lbnRlbTogIlBvbGl0eWthIENlcnR5ZmlrYWNqaSBkbGEgUm9vdENB +Ii4gQ2VydHlmaWthdCB3eXN0YXdpb255IHByemV6IFJvb3RDQSB3IGhpZXJhcmNo +aWkgQ0MgU2lnbmV0LjBFBggrBgEFBQcCARY5aHR0cDovL3d3dy5zaWduZXQucGwv +cmVwb3p5dG9yaXVtL2Rva3VtZW50eS9wY19yb290Y2EudHh0MEQGA1UdHwQ9MDsw +OaA3oDWGM2h0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9yb290Y2Ev +cm9vdGNhLmNybDAfBgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAdBgNV +HQ4EFgQUwGxGyl2CfpYHRonE82AVXO08kMIwDQYJKoZIhvcNAQEFBQADggEBABp1 +TAUsa+BeVWg4cjowc8yTJ5XN3GvN96GObMkxUGY7U9kVrLI71xBgoNVyzXTiMNDB +vjh7vdPWjpl5SDiRpnnKiOFXA43HvNWzUaOkTu1mxjJsZsanot1Xt6j0ZDC+03Fj +LHdYMyM9kSWp6afb4980EPYZCcSzgM5TOGfJmNii5Tq468VFKrX+52Aou1G22Ohu ++EEOlOrG7ylKv1hHUJJCjwN0ZVEIn1nDbrU9FeGCz8J9ihVUvnENEBbBkU37PWqW +uHitKQDVtcwTwJJdR8cmKq3NmkwAm9fPacidQLpaw0WkuGrS+fEDhu1Nhy9xELP6 +NA9GRTCNxm/dXlcwnmY= +-----END CERTIFICATE----- + -----BEGIN CERTIFICATE----- -MIIFGjCCBAKgAwIBAgIEPL7eEDANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQTDEfMB0GA1UE -ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg -U2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBSb290Q0EwHhcNMDIwNDE4MTQ1NDA4WhcNMjYw -OTIxMTU0MjE5WjB2MQswCQYDVQQGEwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5v -LjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MSAwHgYDVQQDExdDQyBTaWdu -ZXQgLSBQQ0EgS2xhc2EgMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM7BrBlbN5ma -M5eg0BOTqoZ+9NBDvU8Lm5rTdrMswFTCathzpVVLK/JD4K3+4oCZ9SRAspEXE4gvwb08ASY6w5s+ -HpRkeJw8YzMFR5kDZD5adgnCAy4vDfIXYZgppXPaTQ8wnfUZ7BZ7Zfa7QBemUIcJIzJBB0UqgtxW -Ceol9IekpBRVmuuSA6QG0Jkm+pGDJ05yj2eQG8jTcBENM7sVA8rGRMyFA4skSZ+D0OG6FS2xC1i9 -JyN0ag1yII/LPx8HK5J4W9MaPRNjAEeaa2qI9EpchwrOxnyVbQfSedCG1VRJfAsE/9tT9CMUPZ3x -W20QjQcSZJqVcmGW9gVsXKQOVLsCAwEAAaOCAbMwggGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P -AQH/BAQDAgEGMIIBBAYDVR0gBIH8MIH5MIH2Bg0rBgEEAb4/AgEKAQEBMIHkMIGaBggrBgEFBQcC -AjCBjRqBikNlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmllIHogZG9rdW1lbnRlbTogIlBvbGl0 -eWthIENlcnR5ZmlrYWNqaSBkbGEgUm9vdENBIi4gQ2VydHlmaWthdCB3eXN0YXdpb255IHByemV6 -IFJvb3RDQSB3IGhpZXJhcmNoaWkgQ0MgU2lnbmV0LjBFBggrBgEFBQcCARY5aHR0cDovL3d3dy5z -aWduZXQucGwvcmVwb3p5dG9yaXVtL2Rva3VtZW50eS9wY19yb290Y2EudHh0MEQGA1UdHwQ9MDsw -OaA3oDWGM2h0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9yb290Y2Evcm9vdGNhLmNy -bDAfBgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAdBgNVHQ4EFgQUwGxGyl2CfpYHRonE -82AVXO08kMIwDQYJKoZIhvcNAQEFBQADggEBABp1TAUsa+BeVWg4cjowc8yTJ5XN3GvN96GObMkx -UGY7U9kVrLI71xBgoNVyzXTiMNDBvjh7vdPWjpl5SDiRpnnKiOFXA43HvNWzUaOkTu1mxjJsZsan -ot1Xt6j0ZDC+03FjLHdYMyM9kSWp6afb4980EPYZCcSzgM5TOGfJmNii5Tq468VFKrX+52Aou1G2 -2Ohu+EEOlOrG7ylKv1hHUJJCjwN0ZVEIn1nDbrU9FeGCz8J9ihVUvnENEBbBkU37PWqWuHitKQDV -tcwTwJJdR8cmKq3NmkwAm9fPacidQLpaw0WkuGrS+fEDhu1Nhy9xELP6NA9GRTCNxm/dXlcwnmY= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFGjCCBAKgAwIBAgIEPV0tNDANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQTDEfMB0GA1UE -ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg -U2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBSb290Q0EwHhcNMDIwODE2MTY0OTU2WhcNMjYw -OTIxMTU0MjE5WjB2MQswCQYDVQQGEwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5v -LjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MSAwHgYDVQQDExdDQyBTaWdu -ZXQgLSBQQ0EgS2xhc2EgMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALN3LanJtdue -Ne6geWUTFENa+lEuzqELcoqhYB+a/tJcPEkc6TX/bYPzalRRjqs+quMP6KZTU0DixOrV+K7iWaqA -iQ913HX5IBLmKDCrTVW/ZvSDpiBKbxlHfSNuJxAuVT6HdbzK7yAW38ssX+yS2tZYHZ5FhZcfqzPE -OpO94mAKcBUhk6T/ki0evXX/ZvvktwmF3hKattzwtM4JMLurAEl8SInyEYULw5JdlfcBez2Tg6Db -w34hA1A+ckTwhxzecrB8TUe2BnQKOs9vr2cCACpFFcOmPkM0Drtjctr1QHm1tYSqRFRf9VcV5tfC -3P8QqoK4ONjtLPHc9x5NE1uK/FMCAwEAAaOCAbMwggGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P -AQH/BAQDAgEGMIIBBAYDVR0gBIH8MIH5MIH2Bg0rBgEEAb4/AgEKAQECMIHkMIGaBggrBgEFBQcC -AjCBjRqBikNlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmllIHogZG9rdW1lbnRlbTogIlBvbGl0 -eWthIENlcnR5ZmlrYWNqaSBkbGEgUm9vdENBIi4gQ2VydHlmaWthdCB3eXN0YXdpb255IHByemV6 -IFJvb3RDQSB3IGhpZXJhcmNoaWkgQ0MgU2lnbmV0LjBFBggrBgEFBQcCARY5aHR0cDovL3d3dy5z -aWduZXQucGwvcmVwb3p5dG9yaXVtL2Rva3VtZW50eS9wY19yb290Y2EudHh0MEQGA1UdHwQ9MDsw -OaA3oDWGM2h0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9yb290Y2Evcm9vdGNhLmNy -bDAfBgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAdBgNVHQ4EFgQUXvthcPHlH5BgGhlM -ErJNXWlhlgAwDQYJKoZIhvcNAQEFBQADggEBACIce95Mvn710KCAISA0CuHD4aznTU6pLoCDShW4 -7OR+GTpJUm1coTcUqlBHV9mra4VFrBcBuOkHZoBLq/jmE0QJWnpSEULDcH9J3mF0nqO9SM+mWyJG -dsJF/XU/7smummgjMNQXwzQTtWORF+6v5KUbWX85anO2wR+M6YTBWC55zWpWi4RG3vkHFs5Ze2oF -JTlpuxw9ZgxTnWlwI9QR2MvEhYIUMKMOWxw1nt0kKj+5TCNQQGh/VJJ1dsiroGh/io1DOcePEhKz -1Ag52y6Wf0nJJB9yk0sFakqZH18F7eQecQImgZyyeRtsG95leNugB3BXWCW+KxwiBrtQTXv4dTE= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEzzCCA7egAwIBAgIEO6ocGTANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQTDEfMB0GA1UE -ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg -U2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBSb290Q0EwHhcNMDEwOTIwMTY0MjE5WhcNMjYw -OTIxMTU0MjE5WjBxMQswCQYDVQQGEwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5v -LjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MRswGQYDVQQDExJDQyBTaWdu -ZXQgLSBSb290Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrr2vydnNpELfGW3Ks -ARiDhJvwDtUe4AbWev+OfMc3+vA29nX8ZmIwno3gmItjo5DbUCCRiCMq5c9epcGu+kg4a3BJChVX -REl8gVh0ST15rr3RKrSc4VgsvQzl0ZUraeQLl8JoRT5PLsUj3qwF78jUCQVckiiLVcnGfZtFCm+D -CJXliQBDMB9XFAUEiO/DtEBs0B7wJGx7lgJeJpQUcGiaOPjcJDYOk7rNAYmmD2gWeSlepufO8luU -YG/YDxTC4mqhRqfa4MnVO5dqy+ICj2UvUpHbZDB0KfGRibgBYeQP1kuqgIzJN4UqknVAJb0aMBSP -l+9k2fAUdchx1njlbdcbAgMBAAGjggFtMIIBaTAPBgNVHRMBAf8EBTADAQH/MIIBBAYDVR0gBIH8 -MIH5MIH2Bg0rBgEEAb4/AgEKAQEAMIHkMIGaBggrBgEFBQcCAjCBjRqBikNlcnR5ZmlrYXQgd3lz -dGF3aW9ueSB6Z29kbmllIHogZG9rdW1lbnRlbTogIlBvbGl0eWthIENlcnR5ZmlrYWNqaSBkbGEg -Um9vdENBIi4gQ2VydHlmaWthdCB3eXN0YXdpb255IHByemV6IFJvb3RDQSB3IGhpZXJhcmNoaWkg -Q0MgU2lnbmV0LjBFBggrBgEFBQcCARY5aHR0cDovL3d3dy5zaWduZXQucGwvcmVwb3p5dG9yaXVt -L2Rva3VtZW50eS9wY19yb290Y2EudHh0MB0GA1UdDgQWBBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAf -BgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcN -AQEFBQADggEBAGnY5QmYqnnO9OqFOWZxxb25UHRnaRF6IV9aaGit5BZufZj2Tq3v8L3SgE34GOoI -cdRMMG5JEpEU4mN/Ef3oY6Eo+7HfqaPHI4KFmbDSPiK5s+wmf+bQSm0Yq5/h4ZOdcAESlLQeLSt1 -CQk2JoKQJ6pyAf6xJBgWEIlm4RXE4J3324PUiOp83kW6MDvaa1xY976WyInr4rwoLgxVl11LZeKW -ha0RJJxJgw/NyWpKG7LWCm1fglF8JH51vZNndGYq1iKtfnrIOvLZq6bzaCiZm1EurD8HE6P7pmAB -KK6o3C2OXlNfNIgwkDN/cDqk5TYsTkrpfriJPdxXBH8hQOkW89g= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIID/TCCA2agAwIBAgIEP4/gkTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJQTDEfMB0GA1UE -ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg -U2lnbmV0MR8wHQYDVQQDExZDQyBTaWduZXQgLSBDQSBLbGFzYSAxMB4XDTAzMTAxNzEyMjkwMloX -DTExMDkyMzExMTgxN1owdjELMAkGA1UEBhMCUEwxHzAdBgNVBAoTFlRQIEludGVybmV0IFNwLiB6 -IG8uby4xJDAiBgNVBAsTG0NlbnRydW0gQ2VydHlmaWthY2ppIFNpZ25ldDEgMB4GA1UEAxMXQ0Mg -U2lnbmV0IC0gVFNBIEtsYXNhIDEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOJYrISEtSsd -uHajROh5/n7NGrkpYTT9NEaPe9+ucuQ37KxIbfJwXJjgUc1dw4wCkcQ12FJarD1X6mSQ4cfN/60v -LfKI5ZD4nhJTMKlAj1pX9ScQ/MuyvKStCbn5WTkjPhjRAM0tdwXSnzuTEunfw0Oup559y3Iqxg1c -ExflB6cfAgMBAAGjggGXMIIBkzBBBgNVHR8EOjA4MDagNKAyhjBodHRwOi8vd3d3LnNpZ25ldC5w -bC9yZXBvenl0b3JpdW0vY3JsL2tsYXNhMS5jcmwwDgYDVR0PAQH/BAQDAgeAMBYGA1UdJQEB/wQM -MAoGCCsGAQUFBwMIMIHaBgNVHSAEgdIwgc8wgcwGDSsGAQQBvj8CZAoRAgEwgbowbwYIKwYBBQUH -AgIwYxphQ2VydHlmaWthdCB3eXN0YXdpb255IHpnb2RuaWUgeiBkb2t1bWVudGVtICJQb2xpdHlr -YSBDZXJ0eWZpa2FjamkgQ0MgU2lnbmV0IC0gWm5ha293YW5pZSBjemFzZW0iLjBHBggrBgEFBQcC -ARY7aHR0cDovL3d3dy5zaWduZXQucGwvcmVwb3p5dG9yaXVtL2Rva3VtZW50eS9wY190c2ExXzJf -MS5wZGYwHwYDVR0jBBgwFoAUw4Me1Vl3VPtN+1dH+cQjXNHnieMwHQYDVR0OBBYEFJdDwEqtcavO -Yd9u9tej53vWXwNBMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQEFBQADgYEAnpiQkqLCJQYXUrqMHUEz -+z3rOqS0XzSFnVVLhkVssvXc8S3FkJIiQTUrkScjI4CToCzujj3EyfNxH6yiLlMbskF8I31JxIeB -vueqV+s+o76CZm3ycu9hb0I4lswuxoT+q5ZzPR8Irrb51rZXlolR+7KtwMg4sFDJZ8RNgOf7tbA= +MIIFGjCCBAKgAwIBAgIEPV0tNDANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQ +TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2Vu +dHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBS +b290Q0EwHhcNMDIwODE2MTY0OTU2WhcNMjYwOTIxMTU0MjE5WjB2MQswCQYDVQQG +EwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMb +Q2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MSAwHgYDVQQDExdDQyBTaWduZXQg +LSBQQ0EgS2xhc2EgMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALN3 +LanJtdueNe6geWUTFENa+lEuzqELcoqhYB+a/tJcPEkc6TX/bYPzalRRjqs+quMP +6KZTU0DixOrV+K7iWaqAiQ913HX5IBLmKDCrTVW/ZvSDpiBKbxlHfSNuJxAuVT6H +dbzK7yAW38ssX+yS2tZYHZ5FhZcfqzPEOpO94mAKcBUhk6T/ki0evXX/ZvvktwmF +3hKattzwtM4JMLurAEl8SInyEYULw5JdlfcBez2Tg6Dbw34hA1A+ckTwhxzecrB8 +TUe2BnQKOs9vr2cCACpFFcOmPkM0Drtjctr1QHm1tYSqRFRf9VcV5tfC3P8QqoK4 +ONjtLPHc9x5NE1uK/FMCAwEAAaOCAbMwggGvMA8GA1UdEwEB/wQFMAMBAf8wDgYD +VR0PAQH/BAQDAgEGMIIBBAYDVR0gBIH8MIH5MIH2Bg0rBgEEAb4/AgEKAQECMIHk +MIGaBggrBgEFBQcCAjCBjRqBikNlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmll +IHogZG9rdW1lbnRlbTogIlBvbGl0eWthIENlcnR5ZmlrYWNqaSBkbGEgUm9vdENB +Ii4gQ2VydHlmaWthdCB3eXN0YXdpb255IHByemV6IFJvb3RDQSB3IGhpZXJhcmNo +aWkgQ0MgU2lnbmV0LjBFBggrBgEFBQcCARY5aHR0cDovL3d3dy5zaWduZXQucGwv +cmVwb3p5dG9yaXVtL2Rva3VtZW50eS9wY19yb290Y2EudHh0MEQGA1UdHwQ9MDsw +OaA3oDWGM2h0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9yb290Y2Ev +cm9vdGNhLmNybDAfBgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAdBgNV +HQ4EFgQUXvthcPHlH5BgGhlMErJNXWlhlgAwDQYJKoZIhvcNAQEFBQADggEBACIc +e95Mvn710KCAISA0CuHD4aznTU6pLoCDShW47OR+GTpJUm1coTcUqlBHV9mra4VF +rBcBuOkHZoBLq/jmE0QJWnpSEULDcH9J3mF0nqO9SM+mWyJGdsJF/XU/7smummgj +MNQXwzQTtWORF+6v5KUbWX85anO2wR+M6YTBWC55zWpWi4RG3vkHFs5Ze2oFJTlp +uxw9ZgxTnWlwI9QR2MvEhYIUMKMOWxw1nt0kKj+5TCNQQGh/VJJ1dsiroGh/io1D +OcePEhKz1Ag52y6Wf0nJJB9yk0sFakqZH18F7eQecQImgZyyeRtsG95leNugB3BX +WCW+KxwiBrtQTXv4dTE= -----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIEzzCCA7egAwIBAgIEO6ocGTANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQ +TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2Vu +dHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBS +b290Q0EwHhcNMDEwOTIwMTY0MjE5WhcNMjYwOTIxMTU0MjE5WjBxMQswCQYDVQQG +EwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMb +Q2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQg +LSBSb290Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrr2vydnNp +ELfGW3KsARiDhJvwDtUe4AbWev+OfMc3+vA29nX8ZmIwno3gmItjo5DbUCCRiCMq +5c9epcGu+kg4a3BJChVXREl8gVh0ST15rr3RKrSc4VgsvQzl0ZUraeQLl8JoRT5P +LsUj3qwF78jUCQVckiiLVcnGfZtFCm+DCJXliQBDMB9XFAUEiO/DtEBs0B7wJGx7 +lgJeJpQUcGiaOPjcJDYOk7rNAYmmD2gWeSlepufO8luUYG/YDxTC4mqhRqfa4MnV +O5dqy+ICj2UvUpHbZDB0KfGRibgBYeQP1kuqgIzJN4UqknVAJb0aMBSPl+9k2fAU +dchx1njlbdcbAgMBAAGjggFtMIIBaTAPBgNVHRMBAf8EBTADAQH/MIIBBAYDVR0g +BIH8MIH5MIH2Bg0rBgEEAb4/AgEKAQEAMIHkMIGaBggrBgEFBQcCAjCBjRqBikNl +cnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmllIHogZG9rdW1lbnRlbTogIlBvbGl0 +eWthIENlcnR5ZmlrYWNqaSBkbGEgUm9vdENBIi4gQ2VydHlmaWthdCB3eXN0YXdp +b255IHByemV6IFJvb3RDQSB3IGhpZXJhcmNoaWkgQ0MgU2lnbmV0LjBFBggrBgEF +BQcCARY5aHR0cDovL3d3dy5zaWduZXQucGwvcmVwb3p5dG9yaXVtL2Rva3VtZW50 +eS9wY19yb290Y2EudHh0MB0GA1UdDgQWBBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAf +BgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAOBgNVHQ8BAf8EBAMCAQYw +DQYJKoZIhvcNAQEFBQADggEBAGnY5QmYqnnO9OqFOWZxxb25UHRnaRF6IV9aaGit +5BZufZj2Tq3v8L3SgE34GOoIcdRMMG5JEpEU4mN/Ef3oY6Eo+7HfqaPHI4KFmbDS +PiK5s+wmf+bQSm0Yq5/h4ZOdcAESlLQeLSt1CQk2JoKQJ6pyAf6xJBgWEIlm4RXE +4J3324PUiOp83kW6MDvaa1xY976WyInr4rwoLgxVl11LZeKWha0RJJxJgw/NyWpK +G7LWCm1fglF8JH51vZNndGYq1iKtfnrIOvLZq6bzaCiZm1EurD8HE6P7pmABKK6o +3C2OXlNfNIgwkDN/cDqk5TYsTkrpfriJPdxXBH8hQOkW89g= +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIID/TCCA2agAwIBAgIEP4/gkTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJQ +TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2Vu +dHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MR8wHQYDVQQDExZDQyBTaWduZXQgLSBD +QSBLbGFzYSAxMB4XDTAzMTAxNzEyMjkwMloXDTExMDkyMzExMTgxN1owdjELMAkG +A1UEBhMCUEwxHzAdBgNVBAoTFlRQIEludGVybmV0IFNwLiB6IG8uby4xJDAiBgNV +BAsTG0NlbnRydW0gQ2VydHlmaWthY2ppIFNpZ25ldDEgMB4GA1UEAxMXQ0MgU2ln +bmV0IC0gVFNBIEtsYXNhIDEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOJY +rISEtSsduHajROh5/n7NGrkpYTT9NEaPe9+ucuQ37KxIbfJwXJjgUc1dw4wCkcQ1 +2FJarD1X6mSQ4cfN/60vLfKI5ZD4nhJTMKlAj1pX9ScQ/MuyvKStCbn5WTkjPhjR +AM0tdwXSnzuTEunfw0Oup559y3Iqxg1cExflB6cfAgMBAAGjggGXMIIBkzBBBgNV +HR8EOjA4MDagNKAyhjBodHRwOi8vd3d3LnNpZ25ldC5wbC9yZXBvenl0b3JpdW0v +Y3JsL2tsYXNhMS5jcmwwDgYDVR0PAQH/BAQDAgeAMBYGA1UdJQEB/wQMMAoGCCsG +AQUFBwMIMIHaBgNVHSAEgdIwgc8wgcwGDSsGAQQBvj8CZAoRAgEwgbowbwYIKwYB +BQUHAgIwYxphQ2VydHlmaWthdCB3eXN0YXdpb255IHpnb2RuaWUgeiBkb2t1bWVu +dGVtICJQb2xpdHlrYSBDZXJ0eWZpa2FjamkgQ0MgU2lnbmV0IC0gWm5ha293YW5p +ZSBjemFzZW0iLjBHBggrBgEFBQcCARY7aHR0cDovL3d3dy5zaWduZXQucGwvcmVw +b3p5dG9yaXVtL2Rva3VtZW50eS9wY190c2ExXzJfMS5wZGYwHwYDVR0jBBgwFoAU +w4Me1Vl3VPtN+1dH+cQjXNHnieMwHQYDVR0OBBYEFJdDwEqtcavOYd9u9tej53vW +XwNBMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQEFBQADgYEAnpiQkqLCJQYXUrqMHUEz ++z3rOqS0XzSFnVVLhkVssvXc8S3FkJIiQTUrkScjI4CToCzujj3EyfNxH6yiLlMb +skF8I31JxIeBvueqV+s+o76CZm3ycu9hb0I4lswuxoT+q5ZzPR8Irrb51rZXlolR ++7KtwMg4sFDJZ8RNgOf7tbA= +-----END CERTIFICATE----- + -----BEGIN CERTIFICATE----- MIIEFTCCA36gAwIBAgIBADANBgkqhkiG9w0BAQQFADCBvjELMAkGA1UEBhMCVVMx EDAOBgNVBAgTB0luZGlhbmExFTATBgNVBAcTDEluZGlhbmFwb2xpczEoMCYGA1UE @@ -1783,6 +1797,7 @@ AQEEBQADgYEAm/Abn8c2y1nO3fgpAIslxvi9iNBZDhQtJ0VQZY6wgSfANyDOR4DW iexO/AlorB49KnkFS7TjCAoLOZhcg5FaNiKnlstMI5krQmau1Qnb/vGSNsE/UGms 1ts+QYPUs0KmGEAFUri2XzLy+aQo9Kw74VBvqnxvaaMeY5yMcKNOieY= -----END CERTIFICATE----- + -----BEGIN CERTIFICATE----- MIIEUDCCA7mgAwIBAgIJAN4ppNGwj6yIMA0GCSqGSIb3DQEBBAUAMIHMMQswCQYD VQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZyYW5j @@ -1809,3 +1824,48 @@ xA39CIJ65Zozs28Eg1aV9/Y+Of7TnWhW+U3J3/wD/GghaAGiKK6vMn9gJBIdBX/9 e6ef37VGyiOEFFjnUIbuk0RWty0orN76q/lI/xjCi15XSA/VSq2j4vmnwfZcPTDu glmQ1A== -----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIDQTCCAikCBEvyOsEwDQYJKoZIhvcNAQEEBQAwSDENMAsGA1UECxMER0lBQjEi +MCAGA1UEAxMZY2hpbW5leXJvY2subGluZGVubGFiLmNvbTETMBEGA1UEChMKTGlu +ZGVuIExhYjAeFw0xMDA1MTcyMTUzMDVaFw0xMTA1MTcyMTUzMDVaMCQxIjAgBgNV +BAMTGWNoaW1uZXlyb2NrLmxpbmRlbmxhYi5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD +gY0AMIGJAoGBALYZBzbHpME8PQIO4lhokeLT9mowtw7/XO6DYAJwosRJ4zcEw+/5 +IBfKMfQwtbt9JeJULFEn37NL1UbMxIXXmhc5ksjh04WoOyNhPT10mLJ2bLbTa+xw +UEm5S3qo/4DKu6I/ONeKDX17XXs0MJQYr4JV0PaXig57Q7GUsEut1hslAgMBAAGj +gd8wgdwwEwYDVR0lBAwwCgYIKwYBBQUHAwEwCQYDVR0TBAIwADALBgNVHQ8EBAMC +BaAwfwYDVR0jBHgwdoAgxeADFdbMC6h1FEvUr1CQ+/0Gy9PZFec3OIBsByVVfc2h +TKRKMEgxDTALBgNVBAsTBEdJQUIxIjAgBgNVBAMTGWNoaW1uZXlyb2NrLmxpbmRl +bmxhYi5jb20xEzARBgNVBAoTCkxpbmRlbiBMYWKCBEvxusEwLAYDVR0OAQH/BCIE +IOSsRq4oCDj4UyXZWXuTbBjCxpSmM7K+JBWMRuZJnQm4MA0GCSqGSIb3DQEBBAUA +A4IBAQBSfsuZTC8dfsJfaIKywQDYMrjutSKEKLm7l9BtBKQKKG97k4GAnQL+9nvn +sOv5moA8qIuHdj05qoEvaMmOgKWGoNWr5YBN/gE1k15U8KdU6Z4usS5hx+6lcCb4 +kD4LybSGUku/Jl9qikT82mdEQA5FerNeA9XAq9LWDF37IorUsDlJTe4STb01LZO8 +37tAJ2eEgsY3cFFk5Zrdi46BRcixnLDRLTVGSUnOKKmaqUF1fFESO+kJFfYjH6Bu +gxO37yK5JUII7t4zNaTJnuFPbUxcNa/WQOMTBzp5xXdnqkTxJk4oHvO7x3+SEElZ +KeKB2mkBRCUG3dznWSFWrUT9hrui +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j +ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 +LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug +RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm ++9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW +PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM +xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB +Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 +hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg +EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA +FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec +nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z +eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF +hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 +Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep ++OkuE6N36B9K +-----END CERTIFICATE----- diff --git a/indra/newview/app_settings/ignorable_dialogs.xml b/indra/newview/app_settings/ignorable_dialogs.xml index e825f13e82..d0e1f62a84 100644 --- a/indra/newview/app_settings/ignorable_dialogs.xml +++ b/indra/newview/app_settings/ignorable_dialogs.xml @@ -177,17 +177,6 @@ <key>Value</key> <integer>1</integer> </map> - <key>FirstStreamingMedia</key> - <map> - <key>Comment</key> - <string>Enables FirstStreamingMedia warning dialog</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>Boolean</string> - <key>Value</key> - <integer>1</integer> - </map> <key>FirstTeleport</key> <map> <key>Comment</key> diff --git a/indra/newview/app_settings/keywords.ini b/indra/newview/app_settings/keywords.ini index 0805e94b10..263b73ba23 100644 --- a/indra/newview/app_settings/keywords.ini +++ b/indra/newview/app_settings/keywords.ini @@ -497,6 +497,7 @@ PARCEL_DETAILS_DESC Used with llGetParcelDetails to get the parcel description. PARCEL_DETAILS_OWNER Used with llGetParcelDetails to get the parcel owner id. PARCEL_DETAILS_GROUP Used with llGetParcelDetails to get the parcel group id. PARCEL_DETAILS_AREA Used with llGetParcelDetails to get the parcel area in square meters. +PARCEL_DETAILS_ID Used with llGetParcelDetails to get the parcel id. STRING_TRIM_HEAD Used with llStringTrim to trim leading spaces from a string. STRING_TRIM_TAIL Used with llStringTrim to trim trailing spaces from a string. diff --git a/indra/newview/app_settings/logcontrol.xml b/indra/newview/app_settings/logcontrol.xml index d7bb64ce8a..937c4e4c6a 100644 --- a/indra/newview/app_settings/logcontrol.xml +++ b/indra/newview/app_settings/logcontrol.xml @@ -25,6 +25,7 @@ <string>AppCache</string> <string>Window</string> <string>RenderInit</string> + <string>MediaAuth</string> </array> </map> <map> @@ -40,6 +41,8 @@ </array> <key>tags</key> <array> + <!-- sample entry for debugging a specific item --> +<!-- <string>Voice</string> --> </array> </map> </array> diff --git a/indra/newview/app_settings/low_graphics.xml b/indra/newview/app_settings/low_graphics.xml index 3f67a70d7a..d02a13a671 100644 --- a/indra/newview/app_settings/low_graphics.xml +++ b/indra/newview/app_settings/low_graphics.xml @@ -4,6 +4,8 @@ <RenderAvatarCloth value="FALSE"/> <!--Default for now--> <RenderAvatarLODFactor value="0.5"/> + <!--Default for now--> + <RenderAvatarMaxVisible value="3"/> <!--NO SHADERS--> <RenderAvatarVP value="FALSE"/> <!--Short Range--> diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index c7300fcee2..1d635ef18a 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -1,16 +1,28 @@ <?xml version="1.0" ?> <llsd> <map> + <key>CrashHostUrl</key> + <map> + <key>Comment</key> + <string>A URL pointing to a crash report handler; overrides cluster negotiation to locate crash handler.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string /> + </map> <key>AFKTimeout</key> <map> <key>Comment</key> - <string>Time before automatically setting AFK (away from keyboard) mode (seconds)</string> + <string>Time before automatically setting AFK (away from keyboard) mode (seconds, 0=never). + Valid values are: 0, 120, 300, 600, 1800</string> <key>Persist</key> <integer>1</integer> <key>Type</key> <string>S32</string> <key>Value</key> - <real>300.0</real> + <real>300</real> </map> <key>AdvanceSnapshot</key> <map> @@ -197,7 +209,7 @@ <key>Type</key> <string>F32</string> <key>Value</key> - <real>1.0</real> + <real>0.5</real> </map> <key>AudioLevelMic</key> <map> @@ -219,7 +231,7 @@ <key>Type</key> <string>F32</string> <key>Value</key> - <real>1.0</real> + <real>0.5</real> </map> <key>AudioLevelRolloff</key> <map> @@ -241,7 +253,7 @@ <key>Type</key> <string>F32</string> <key>Value</key> - <real>1.0</real> + <real>0.5</real> </map> <key>AudioLevelUI</key> <map> @@ -573,6 +585,17 @@ <key>Value</key> <integer>2</integer> </map> + <key>AvatarBakedTextureTimeout</key> + <map> + <key>Comment</key> + <string>Specifes the maximum time in seconds to wait before sending your baked textures for avatar appearance. Set to 0 to disable and wait until all baked textures are at highest resolution.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>U32</string> + <key>Value</key> + <integer>120</integer> + </map> <key>AvatarSex</key> <map> <key>Comment</key> @@ -620,7 +643,18 @@ <key>BlockAvatarAppearanceMessages</key> <map> <key>Comment</key> - <string>Ignore's appearance messages (for simulating Ruth)</string> + <string>Ignores appearance messages (for simulating Ruth)</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> + <key>BlockSomeAvatarAppearanceVisualParams</key> + <map> + <key>Comment</key> + <string>Drop around 50% of VisualParam occurances in appearance messages (for simulating Ruth)</string> <key>Persist</key> <integer>1</integer> <key>Type</key> @@ -1264,6 +1298,17 @@ <key>Value</key> <integer>0</integer> </map> + <key>CertStore</key> + <map> + <key>Comment</key> + <string>Specifies the Certificate Store for certificate trust verification</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>default</string> + </map> <key>ChatBarStealsFocus</key> <map> <key>Comment</key> @@ -1563,6 +1608,39 @@ <key>Value</key> <integer>1</integer> </map> + <key>BrowserJavascriptEnabled</key> + <map> + <key>Comment</key> + <string>Enable Javascript in the built-in Web browser?</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> + <key>BrowserPluginsEnabled</key> + <map> + <key>Comment</key> + <string>Enable Web plugins in the built-in Web browser?</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> + <key>ChatBarCustomWidth</key> + <map> + <key>Comment</key> + <string>Stores customized width of chat bar.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>S32</string> + <key>Value</key> + <integer>0</integer> + </map> <key>CreateToolCopyCenters</key> <map> <key>Comment</key> @@ -1618,6 +1696,17 @@ <key>Value</key> <integer>1</integer> </map> + <key>CurrentGrid</key> + <map> + <key>Comment</key> + <string>Currently Selected Grid</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string></string> + </map> <key>CustomServer</key> <map> <key>Comment</key> @@ -1629,6 +1718,17 @@ <key>Value</key> <string /> </map> + <key>DebugAvatarRezTime</key> + <map> + <key>Comment</key> + <string>Display times for avatars to resolve.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> <key>DebugBeaconLineWidth</key> <map> <key>Comment</key> @@ -2344,6 +2444,29 @@ <key>Value</key> <integer>0</integer> </map> + <key>DefaultFemaleAvatar</key> + <map> + <key>Comment</key> + <string>Default Female Avatar</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>Female Shape & Outfit</string> + </map> + <key>DefaultMaleAvatar</key> + <map> + <key>Comment</key> + <string>Default Male Avatar</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>Male Shape & Outfit</string> + </map> + <key>DefaultObjectTexture</key> <map> <key>Comment</key> @@ -2542,6 +2665,17 @@ <key>Value</key> <real>0.10000000149</real> </map> + <key>DragAndDropDistanceThreshold</key> + <map> + <key>Comment</key> + <string>Number of pixels that mouse should move before triggering drag and drop mode</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>S32</string> + <key>Value</key> + <integer>3</integer> + </map> <key>DropShadowButton</key> <map> <key>Comment</key> @@ -2586,6 +2720,17 @@ <key>Value</key> <integer>4</integer> </map> + <key>DumpVFSCaches</key> + <map> + <key>Comment</key> + <string>Dump VFS caches on startup.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> <key>DynamicCameraStrength</key> <map> <key>Comment</key> @@ -2696,6 +2841,17 @@ <key>Value</key> <integer>0</integer> </map> + <key>FeatureManagerHTTPTable</key> + <map> + <key>Comment</key> + <string>Base directory for HTTP feature/gpu table fetches</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>http://viewer-settings.secondlife.com</string> + </map> <key>FPSLogFrequency</key> <map> <key>Comment</key> @@ -2817,16 +2973,16 @@ <key>Value</key> <integer>0</integer> </map> - <key>HadFirstSuccessfulLogin</key> + <key>FirstRunThisInstall</key> <map> <key>Comment</key> - <string>Specifies whether you have successfully logged in at least once before</string> + <string>Specifies that you have not run the viewer since you installed the latest update</string> <key>Persist</key> <integer>1</integer> <key>Type</key> <string>Boolean</string> <key>Value</key> - <integer>0</integer> + <integer>1</integer> </map> <key>FirstSelectedDisabledPopups</key> <map> @@ -3400,6 +3556,17 @@ <key>Value</key> <real>9.0</real> </map> + <key>ForceAssetFail</key> + <map> + <key>Comment</key> + <string>Force wearable fetches to fail for this asset type.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>U32</string> + <key>Value</key> + <integer>255</integer> + </map> <key>ForceShowGrid</key> <map> <key>Comment</key> @@ -3442,7 +3609,7 @@ <key>Type</key> <string>F32</string> <key>Value</key> - <real>1.33329999447</real> + <real>3</real> </map> <key>FullScreenAutoDetectAspectRatio</key> <map> @@ -3453,29 +3620,18 @@ <key>Type</key> <string>Boolean</string> <key>Value</key> - <integer>1</integer> - </map> - <key>FullScreenHeight</key> - <map> - <key>Comment</key> - <string>Fullscreen resolution in height</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>S32</string> - <key>Value</key> - <integer>768</integer> + <integer>0</integer> </map> - <key>FullScreenWidth</key> + <key>GesturesMarketplaceURL</key> <map> <key>Comment</key> - <string>Fullscreen resolution in width</string> + <string>URL to the Gestures Marketplace</string> <key>Persist</key> - <integer>1</integer> + <integer>0</integer> <key>Type</key> - <string>S32</string> + <string>String</string> <key>Value</key> - <integer>1024</integer> + <string>https://www.xstreetsl.com/modules.php?name=Marketplace&CategoryID=233</string> </map> <key>GridCrossSections</key> <map> @@ -3607,7 +3763,7 @@ <key>Type</key> <string>String</string> <key>Value</key> - <string>http://lecs.viewer-sidebar.secondlife.com.s3.amazonaws.com/sidebar.html?p=[AUTH_TOKEN]&lang=[LANGUAGE]&channel=[CHANNEL]&version=[VERSION]&major=[VERSION_MAJOR]&minor=[VERSION_MINOR]</string> + <string>https://viewer-sidebar.secondlife.com/sidebar.html?p=[AUTH_TOKEN]&lang=[LANGUAGE]&channel=[CHANNEL]&version=[VERSION]&major=[VERSION_MAJOR]&minor=[VERSION_MINOR]&patch=[VERSION_PATCH]&build=[VERSION_BUILD]&firstlogin=[FIRST_LOGIN]</string> </map> <key>SearchURL</key> <map> @@ -3618,7 +3774,7 @@ <key>Type</key> <string>String</string> <key>Value</key> - <string>http://search.secondlife.com/viewer/[CATEGORY]?q=[QUERY]&p=[AUTH_TOKEN]&r=[MATURITY]&lang=[LANGUAGE]&g=[GODLIKE]&sid=[SESSION_ID]&rid=[REGION_ID]&pid=[PARCEL_ID]</string> + <string>http://search.secondlife.com/viewer/[CATEGORY]?q=[QUERY]&p=[AUTH_TOKEN]&r=[MATURITY]&lang=[LANGUAGE]&g=[GODLIKE]&sid=[SESSION_ID]&rid=[REGION_ID]&pid=[PARCEL_ID]&channel=[CHANNEL]&version=[VERSION]&major=[VERSION_MAJOR]&minor=[VERSION_MINOR]&patch=[VERSION_PATCH]&build=[VERSION_BUILD]</string> </map> <key>HighResSnapshot</key> <map> @@ -3706,7 +3862,7 @@ <key>Type</key> <string>Boolean</string> <key>Value</key> - <integer>0</integer> + <integer>1</integer> </map> <key>InBandwidth</key> <map> @@ -3763,6 +3919,17 @@ <key>Value</key> <real>1.0</real> </map> + <key>InventoryLinking</key> + <map> + <key>Comment</key> + <string>Enable ability to create links to folders and items via "Paste as link".</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> <key>InventorySortOrder</key> <map> <key>Comment</key> @@ -4027,6 +4194,17 @@ <key>Value</key> <integer>1</integer> </map> + <key>LastGPUClass</key> + <map> + <key>Comment</key> + <string>[DO NOT MODIFY] previous GPU class for tracking hardware changes</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>S32</string> + <key>Value</key> + <integer>-1</integer> + </map> <key>LastFeatureVersion</key> <map> <key>Comment</key> @@ -4328,7 +4506,7 @@ <key>LoginLocation</key> <map> <key>Comment</key> - <string>Login at same location you last logged out</string> + <string>Login location ('last', 'home')</string> <key>Persist</key> <integer>1</integer> <key>Type</key> @@ -4391,6 +4569,17 @@ <key>Value</key> <real>128.0</real> </map> + <key>MapServerURL</key> + <map> + <key>Comment</key> + <string>World map URL template for locating map tiles</string> + <key>Persist</key> + <integer>0</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>http://map.secondlife.com.s3.amazonaws.com/</string> + </map> <key>MapShowEvents</key> <map> <key>Comment</key> @@ -4457,6 +4646,391 @@ <key>Value</key> <string /> </map> + <key>MarketplaceURL</key> + <map> + <key>Comment</key> + <string>URL to the Marketplace</string> + <key>Persist</key> + <integer>0</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>https://www.xstreetsl.com/modules.php?name=Marketplace</string> + </map> + <key>MarketplaceURL_objectFemale</key> + <map> + <key>Comment</key> + <string>URL to the Marketplace Attachments Female</string> + <key>Persist</key> + <integer>0</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>http://marketplace.secondlife.com/trampoline/viewer21/attachments</string> + </map> + <key>MarketplaceURL_objectMale</key> + <map> + <key>Comment</key> + <string>URL to the Marketplace Attachments Male</string> + <key>Persist</key> + <integer>0</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>http://marketplace.secondlife.com/trampoline/viewer21/attachments</string> + </map> + <key>MarketplaceURL_clothingFemale</key> + <map> + <key>Comment</key> + <string>URL to the Marketplace Clothing Female</string> + <key>Persist</key> + <integer>0</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>http://marketplace.secondlife.com/trampoline/viewer21/clothing_female_avatar</string> + </map> + <key>MarketplaceURL_clothingMale</key> + <map> + <key>Comment</key> + <string>URL to the Marketplace Clothing Male</string> + <key>Persist</key> + <integer>0</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>http://marketplace.secondlife.com/trampoline/viewer21/clothing_male_avatar</string> + </map> + <key>MarketplaceURL_bodypartFemale</key> + <map> + <key>Comment</key> + <string>URL to the Marketplace Bodyparts Female</string> + <key>Persist</key> + <integer>0</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>https://www.xstreetsl.com/modules.php?name=Marketplace</string> + </map> + <key>MarketplaceURL_bodypartMale</key> + <map> + <key>Comment</key> + <string>URL to the Marketplace Bodyparts Male</string> + <key>Persist</key> + <integer>0</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>https://www.xstreetsl.com/modules.php?name=Marketplace</string> + </map> + <key>MarketplaceURL_glovesMale</key> + <map> + <key>Comment</key> + <string>URL to the Marketplace Gloves Male</string> + <key>Persist</key> + <integer>0</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>http://marketplace.secondlife.com/trampoline/viewer21/gloves_both_women_and_men</string> + </map> + <key>MarketplaceURL_glovesFemale</key> + <map> + <key>Comment</key> + <string>URL to the Marketplace Gloves Female</string> + <key>Persist</key> + <integer>0</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>http://marketplace.secondlife.com/trampoline/viewer21/gloves_both_women_and_men</string> + </map> + <key>MarketplaceURL_jacketFemale</key> + <map> + <key>Comment</key> + <string>URL to the Marketplace Jacket Female</string> + <key>Persist</key> + <integer>0</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>http://marketplace.secondlife.com/trampoline/viewer21/jacket_womens</string> + </map> + <key>MarketplaceURL_jacketMale</key> + <map> + <key>Comment</key> + <string>URL to the Marketplace Jacket Male</string> + <key>Persist</key> + <integer>0</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>http://marketplace.secondlife.com/trampoline/viewer21/jacket_mens</string> + </map> + <key>MarketplaceURL_shirtFemale</key> + <map> + <key>Comment</key> + <string>URL to the Marketplace Shirt Female</string> + <key>Persist</key> + <integer>0</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>http://marketplace.secondlife.com/trampoline/viewer21/shirt_womens</string> + </map> + <key>MarketplaceURL_shirtMale</key> + <map> + <key>Comment</key> + <string>URL to the Marketplace Shirt Male</string> + <key>Persist</key> + <integer>0</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>http://marketplace.secondlife.com/trampoline/viewer21/shirt_mens</string> + </map> + <key>MarketplaceURL_undershirtFemale</key> + <map> + <key>Comment</key> + <string>URL to the Marketplace Undershirt Female</string> + <key>Persist</key> + <integer>0</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>http://marketplace.secondlife.com/trampoline/viewer21/undershirt_womens</string> + </map> + <key>MarketplaceURL_undershirtMale</key> + <map> + <key>Comment</key> + <string>URL to the Marketplace Undershirt Male</string> + <key>Persist</key> + <integer>0</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>http://marketplace.secondlife.com/trampoline/viewer21/undershirt_mens</string> + </map> + <key>MarketplaceURL_skirtFemale</key> + <map> + <key>Comment</key> + <string>URL to the Marketplace Skirt Female</string> + <key>Persist</key> + <integer>0</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>http://marketplace.secondlife.com/trampoline/viewer21/skirts_women</string> + </map> + <key>MarketplaceURL_skirtMale</key> + <map> + <key>Comment</key> + <string>URL to the Marketplace Skirt Male</string> + <key>Persist</key> + <integer>0</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>http://marketplace.secondlife.com/trampoline/viewer21/skirts_women</string> + </map> + <key>MarketplaceURL_pantsFemale</key> + <map> + <key>Comment</key> + <string>URL to the Marketplace Pants Female</string> + <key>Persist</key> + <integer>0</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>http://marketplace.secondlife.com/trampoline/viewer21/pants_women</string> + </map> + <key>MarketplaceURL_pantsMale</key> + <map> + <key>Comment</key> + <string>URL to the Marketplace Pants Male</string> + <key>Persist</key> + <integer>0</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>http://marketplace.secondlife.com/trampoline/viewer21/pants_men</string> + </map> + <key>MarketplaceURL_underpantsFemale</key> + <map> + <key>Comment</key> + <string>URL to the Marketplace Underwear Female</string> + <key>Persist</key> + <integer>0</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>http://marketplace.secondlife.com/trampoline/viewer21/underwear_women</string> + </map> + <key>MarketplaceURL_underpantsMale</key> + <map> + <key>Comment</key> + <string>URL to the Marketplace Underwear Male</string> + <key>Persist</key> + <integer>0</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>http://marketplace.secondlife.com/trampoline/viewer21/underwear_men</string> + </map> + <key>MarketplaceURL_shoesFemale</key> + <map> + <key>Comment</key> + <string>URL to the Marketplace Shoes Female</string> + <key>Persist</key> + <integer>0</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>http://marketplace.secondlife.com/trampoline/viewer21/shoes_women</string> + </map> + <key>MarketplaceURL_shoesMale</key> + <map> + <key>Comment</key> + <string>URL to the Marketplace Shoes Male</string> + <key>Persist</key> + <integer>0</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>http://marketplace.secondlife.com/trampoline/viewer21/shoes_men</string> + </map> + <key>MarketplaceURL_socksFemale</key> + <map> + <key>Comment</key> + <string>URL to the Marketplace Socks Female</string> + <key>Persist</key> + <integer>0</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>http://marketplace.secondlife.com/trampoline/viewer21/socks_women</string> + </map> + <key>MarketplaceURL_socksMale</key> + <map> + <key>Comment</key> + <string>URL to the Marketplace Socks Male</string> + <key>Persist</key> + <integer>0</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>http://marketplace.secondlife.com/trampoline/viewer21/socks_women</string> + </map> + <key>MarketplaceURL_tattooMale</key> + <map> + <key>Comment</key> + <string>URL to the Marketplace Tattoo Male</string> + <key>Persist</key> + <integer>0</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>http://marketplace.secondlife.com/trampoline/viewer21/tattoo_both_women_and_men</string> + </map> + <key>MarketplaceURL_tattooFemale</key> + <map> + <key>Comment</key> + <string>URL to the Marketplace Tattoo Female</string> + <key>Persist</key> + <integer>0</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>http://marketplace.secondlife.com/trampoline/viewer21/tattoo_both_women_and_men</string> + </map> + <key>MarketplaceURL_hairFemale</key> + <map> + <key>Comment</key> + <string>URL to the Marketplace Hair Female</string> + <key>Persist</key> + <integer>0</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>http://marketplace.secondlife.com/trampoline/viewer21/womens_hair</string> + </map> + <key>MarketplaceURL_hairMale</key> + <map> + <key>Comment</key> + <string>URL to the Marketplace Hair Male</string> + <key>Persist</key> + <integer>0</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>http://marketplace.secondlife.com/trampoline/viewer21/mens_hair</string> + </map> + <key>MarketplaceURL_eyesFemale</key> + <map> + <key>Comment</key> + <string>URL to the Marketplace Eyes Female</string> + <key>Persist</key> + <integer>0</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>http://marketplace.secondlife.com/trampoline/viewer21/womens_eyes</string> + </map> + <key>MarketplaceURL_eyesMale</key> + <map> + <key>Comment</key> + <string>URL to the Marketplace Eyes Male</string> + <key>Persist</key> + <integer>0</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>http://marketplace.secondlife.com/trampoline/viewer21/mens_eyes</string> + </map> + <key>MarketplaceURL_shapeFemale</key> + <map> + <key>Comment</key> + <string>URL to the Marketplace Shape Female</string> + <key>Persist</key> + <integer>0</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>http://marketplace.secondlife.com/trampoline/viewer21/womens_shape</string> + </map> + <key>MarketplaceURL_shapeMale</key> + <map> + <key>Comment</key> + <string>URL to the Marketplace Shape Male</string> + <key>Persist</key> + <integer>0</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>http://marketplace.secondlife.com/trampoline/viewer21/mens_shape</string> + </map> + <key>MarketplaceURL_skinFemale</key> + <map> + <key>Comment</key> + <string>URL to the Marketplace Skin Female</string> + <key>Persist</key> + <integer>0</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>http://marketplace.secondlife.com/trampoline/viewer21/womens_skin</string> + </map> + <key>MarketplaceURL_skinMale</key> + <map> + <key>Comment</key> + <string>URL to the Marketplace Skins Male</string> + <key>Persist</key> + <integer>0</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>http://marketplace.secondlife.com/trampoline/viewer21/mens_skin</string> + </map> <key>MaxDragDistance</key> <map> <key>Comment</key> @@ -4479,6 +5053,17 @@ <key>Value</key> <real>64.0</real> </map> + <key>MaxWearableWaitTime</key> + <map> + <key>Comment</key> + <string>Max seconds to wait for wearable assets to fetch.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>F32</string> + <key>Value</key> + <real>60.0</real> + </map> <key>MeanCollisionBump</key> <map> <key>Comment</key> @@ -4578,6 +5163,50 @@ <key>Value</key> <integer>0</integer> </map> + <key>MediaShowOnOthers</key> + <map> + <key>Comment</key> + <string>Whether or not to show media on other avatars</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> + <key>MediaShowOutsideParcel</key> + <map> + <key>Comment</key> + <string>Whether or not to show media from outside the current parcel</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> + <key>MediaShowWithinParcel</key> + <map> + <key>Comment</key> + <string>Whether or not to show media within the current parcel</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> + <key>MediaTentativeAutoPlay</key> + <map> + <key>Comment</key> + <string>This is a tentative flag that may be temporarily set off by the user, until she teleports</string> + <key>Persist</key> + <integer>0</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> <key>MemoryLogFrequency</key> <map> <key>Comment</key> @@ -4633,6 +5262,17 @@ <key>Value</key> <integer>410</integer> </map> + <key>MePanelOpened</key> + <map> + <key>Comment</key> + <string>Indicates that Me Panel was opened at least once after Viewer was installed</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <real>0</real> + </map> <key>MigrateCacheDirectory</key> <map> <key>Comment</key> @@ -5044,7 +5684,9 @@ <map> <key>Comment</key> <string>Default width of buttons in the toast. - Note if required width will be less then this one, a button will be reshaped to default size , otherwise to required</string> + Notes: + If required width will be less then this one, a button will be reshaped to default size , otherwise to required + Change of this parameter will affect the layout of buttons in notification toast.</string> <key>Persist</key> <integer>1</integer> <key>Type</key> @@ -5303,7 +5945,18 @@ <key>Type</key> <string>Boolean</string> <key>Value</key> - <integer>0</integer> + <integer>1</integer> + </map> + <key>ParticipantListShowIcons</key> + <map> + <key>Comment</key> + <string>Show/hide people icons in participant list</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> </map> <key>PerAccountSettingsFile</key> <map> @@ -5435,7 +6088,7 @@ <key>Type</key> <string>F32</string> <key>Value</key> - <real>1.0</real> + <real>0.9</real> </map> <key>PlainTextChatHistory</key> @@ -5483,6 +6136,19 @@ <key>Value</key> <integer>8</integer> </map> + + <key>PluginUseReadThread</key> + <map> + <key>Comment</key> + <string>Use a separate thread to read incoming messages from plugins</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> + <key>PrecachingDelay</key> <map> <key>Comment</key> @@ -5497,7 +6163,7 @@ <key>PreferredMaturity</key> <map> <key>Comment</key> - <string>Setting for the user's preferred maturity level.</string> + <string>Setting for the user's preferred maturity level (consts in indra_constants.h)</string> <key>Persist</key> <integer>1</integer> <key>Type</key> @@ -5736,7 +6402,40 @@ <key>Value</key> <real>1.0</real> </map> - <key>RecentItemsSortOrder</key> + <key>MediaRollOffRate</key> + <map> + <key>Comment</key> + <string>Multiplier to change rate of media attenuation</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>F32</string> + <key>Value</key> + <real>0.125</real> + </map> + <key>MediaRollOffMin</key> + <map> + <key>Comment</key> + <string>Adjusts the distance at which media attentuation starts</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>F32</string> + <key>Value</key> + <real>5.0</real> + </map> + <key>MediaRollOffMax</key> + <map> + <key>Comment</key> + <string>Distance at which media volume is set to 0</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>F32</string> + <key>Value</key> + <real>30.0</real> + </map> + <key>RecentItemsSortOrder</key> <map> <key>Comment</key> <string>Specifies sort key for recent inventory items (+0 = name, +1 = date, +2 = folders always by name, +4 = system folders to top)</string> @@ -5769,6 +6468,17 @@ <key>Value</key> <integer>0</integer> </map> + <key>QuickBuyCurrency</key> + <map> + <key>Comment</key> + <string>Toggle between HTML based currency purchase floater and legacy XUI version</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> <key>RegionTextureSize</key> <map> <key>Comment</key> @@ -5877,7 +6587,7 @@ <key>Type</key> <string>S32</string> <key>Value</key> - <integer>35</integer> + <integer>12</integer> </map> <key>RenderAvatarVP</key> <map> @@ -7386,6 +8096,17 @@ <key>Value</key> <integer>0</integer> </map> + <key>RenderUseTriStrips</key> + <map> + <key>Comment</key> + <string>Use triangle strips for rendering prims.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> <key>RenderUseFarClip</key> <map> <key>Comment</key> @@ -7595,6 +8316,17 @@ <key>Value</key> <integer>0</integer> </map> + <key>SecondLifeEnterprise</key> + <map> + <key>Comment</key> + <string>Enables Second Life Enterprise features</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> <key>SelectMovableOnly</key> <map> <key>Comment</key> @@ -7771,6 +8503,28 @@ <key>Value</key> <integer>1</integer> </map> + <key>ShowBuildButton</key> + <map> + <key>Comment</key> + <string>Shows/Hides Build button in the bottom tray.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> + <key>ShowCameraButton</key> + <map> + <key>Comment</key> + <string>Show/Hide View button in the bottom tray.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> <key>ShowConsoleWindow</key> <map> <key>Comment</key> @@ -7804,6 +8558,17 @@ <key>Value</key> <integer>0</integer> </map> + <key>ShowBetaGrids</key> + <map> + <key>Comment</key> + <string>Display the beta grids in the grid selection control.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> <key>ShowCrosshairs</key> <map> <key>Comment</key> @@ -7826,10 +8591,10 @@ <key>Value</key> <integer>0</integer> </map> - <key>ShowDebugAppearanceEditor</key> + <key>ShowEmptyFoldersWhenSearching</key> <map> <key>Comment</key> - <string>Show debugging appearance editor</string> + <string>Shows folders that do not have any visible contents when applying a filter to inventory</string> <key>Persist</key> <integer>1</integer> <key>Type</key> @@ -7837,16 +8602,16 @@ <key>Value</key> <integer>0</integer> </map> - <key>ShowEmptyFoldersWhenSearching</key> + <key>ShowGestureButton</key> <map> <key>Comment</key> - <string>Shows folders that do not have any visible contents when applying a filter to inventory</string> + <string>Shows/Hides Gesture button in the bottom tray.</string> <key>Persist</key> <integer>1</integer> <key>Type</key> <string>Boolean</string> <key>Value</key> - <integer>0</integer> + <integer>1</integer> </map> <key>ShowHoverTips</key> <map> @@ -7870,21 +8635,21 @@ <key>Value</key> <integer>0</integer> </map> - <key>ShowCameraButton</key> + <key>ShowMiniMapButton</key> <map> <key>Comment</key> - <string>Show/Hide Camera button in the bottom tray</string> + <string>Shows/Hides Mini-Map button in the bottom tray.</string> <key>Persist</key> <integer>1</integer> <key>Type</key> <string>Boolean</string> <key>Value</key> - <integer>1</integer> + <integer>0</integer> </map> - <key>ShowScriptErrors</key> + <key>ShowMoveButton</key> <map> <key>Comment</key> - <string>Show script errors</string> + <string>Shows/Hides Move button in the bottom tray.</string> <key>Persist</key> <integer>1</integer> <key>Type</key> @@ -7892,49 +8657,49 @@ <key>Value</key> <integer>1</integer> </map> - <key>ShowScriptErrorsLocation</key> + <key>ShowScriptErrors</key> <map> <key>Comment</key> - <string>Show script error in chat or window</string> + <string>Show script errors</string> <key>Persist</key> <integer>1</integer> <key>Type</key> - <string>S32</string> + <string>Boolean</string> <key>Value</key> - <integer>0</integer> + <integer>1</integer> </map> - <key>ShowSnapshotButton</key> + <key>ShowScriptErrorsLocation</key> <map> <key>Comment</key> - <string>Show/Hide Snapshot button button in the bottom tray</string> + <string>Show script error in chat or window</string> <key>Persist</key> <integer>1</integer> <key>Type</key> - <string>Boolean</string> + <string>S32</string> <key>Value</key> - <integer>1</integer> + <integer>1</integer> </map> - <key>ShowMoveButton</key> + <key>ShowSearchButton</key> <map> <key>Comment</key> - <string>Show/Hide Move button in the bottom tray</string> + <string>Shows/Hides Search button in the bottom tray.</string> <key>Persist</key> <integer>1</integer> <key>Type</key> <string>Boolean</string> <key>Value</key> - <integer>1</integer> - </map> - <key>ShowGestureButton</key> + <integer>0</integer> + </map> + <key>ShowSnapshotButton</key> <map> <key>Comment</key> - <string>Show/Hide Gesture button in the bottom tray</string> + <string>Shows/Hides Snapshot button button in the bottom tray.</string> <key>Persist</key> <integer>1</integer> <key>Type</key> <string>Boolean</string> <key>Value</key> - <integer>1</integer> + <integer>1</integer> </map> <key>ShowObjectRenderingCost</key> <map> @@ -7969,6 +8734,39 @@ <key>Value</key> <integer>1</integer> </map> + <key>ShowWorldMapButton</key> + <map> + <key>Comment</key> + <string>Shows/Hides Map button in the bottom tray.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> + <key>ShowMiniLocationPanel</key> + <map> + <key>Comment</key> + <string>Show/Hide Mini-Location Panel</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> + <key>SidebarCameraMovement</key> + <map> + <key>Comment</key> + <string>Reflects world rect changing while changing sidebar visibility.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> <key>GroupListShowIcons</key> <map> <key>Comment</key> @@ -8027,13 +8825,13 @@ <key>NearbyPeopleSortOrder</key> <map> <key>Comment</key> - <string>Specifies sort order for nearby people (0 = by name, 2 = by most recent)</string> + <string>Specifies sort order for nearby people (0 = by name, 3 = by distance, 4 = by most recent)</string> <key>Persist</key> <integer>1</integer> <key>Type</key> <string>U32</string> <key>Value</key> - <integer>2</integer> + <integer>4</integer> </map> <key>RecentPeopleSortOrder</key> <map> @@ -8399,7 +9197,7 @@ <key>Type</key> <string>Boolean</string> <key>Value</key> - <integer>1</integer> + <integer>0</integer> </map> <key>ShowTangentBasis</key> <map> @@ -8434,21 +9232,10 @@ <key>Value</key> <integer>0</integer> </map> - <key>ShowVoiceChannelPopup</key> - <map> - <key>Comment</key> - <string>Controls visibility of the current voice channel popup above the voice tab</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>Boolean</string> - <key>Value</key> - <integer>0</integer> - </map> - <key>ShowVolumeSettingsPopup</key> + <key>ShowVoiceVisualizersInCalls</key> <map> <key>Comment</key> - <string>Show individual volume slider for voice, sound effects, etc</string> + <string>Enables in-world voice visualizers, voice gestures and lip-sync while in group or P2P calls.</string> <key>Persist</key> <integer>1</integer> <key>Type</key> @@ -8552,17 +9339,6 @@ <key>Value</key> <integer>1</integer> </map> - <key>SmallAvatarNames</key> - <map> - <key>Comment</key> - <string>Display avatar name text in smaller font</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>Boolean</string> - <key>Value</key> - <integer>1</integer> - </map> <key>SnapEnabled</key> <map> <key>Comment</key> @@ -8805,6 +9581,17 @@ <key>Value</key> <integer>0</integer> </map> + <key>TextureDiscardLevel</key> + <map> + <key>Comment</key> + <string>Specify texture resolution (0 = highest, 5 = lowest)</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>U32</string> + <key>Value</key> + <integer>0</integer> + </map> <key>TextureLoadFullRes</key> <map> <key>Comment</key> @@ -9938,50 +10725,6 @@ <key>Value</key> <integer>15</integer> </map> - <key>UIButtonImageLeftPadding</key> - <map> - <key>Comment</key> - <string>Button Overlay Image Left Padding</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>S32</string> - <key>Value</key> - <integer>4</integer> - </map> - <key>UIButtonImageRightPadding</key> - <map> - <key>Comment</key> - <string>Button Overlay Image Right Padding</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>S32</string> - <key>Value</key> - <integer>4</integer> - </map> - <key>UIButtonImageTopPadding</key> - <map> - <key>Comment</key> - <string>Button Overlay Image Top Padding</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>S32</string> - <key>Value</key> - <integer>2</integer> - </map> - <key>UIButtonImageBottomPadding</key> - <map> - <key>Comment</key> - <string>Button Overlay Image Bottom Padding</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>S32</string> - <key>Value</key> - <integer>2</integer> - </map> <key>UploadBakedTexOld</key> <map> <key>Comment</key> @@ -10090,7 +10833,7 @@ <key>Type</key> <string>Boolean</string> <key>Value</key> - <integer>0</integer> + <integer>1</integer> </map> <key>UseFreezeFrame</key> <map> @@ -10136,7 +10879,17 @@ <key>Value</key> <real>10.0</real> </map> - + <key>UseNewWalkRun</key> + <map> + <key>Comment</key> + <string>Replace standard walk/run animations with new ones.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> <key>UseStartScreen</key> <map> <key>Comment</key> @@ -10336,6 +11089,17 @@ <key>Value</key> <string></string> </map> + <key>VivoxDebugSIPURIHostName</key> + <map> + <key>Comment</key> + <string>Hostname portion of vivox SIP URIs (empty string for the default).</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string></string> + </map> <key>VivoxDebugVoiceAccountServerURI</key> <map> <key>Comment</key> @@ -10347,6 +11111,28 @@ <key>Value</key> <string></string> </map> + <key>VivoxVoiceHost</key> + <map> + <key>Comment</key> + <string>Client SLVoice host to connect to</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>127.0.0.1</string> + </map> + <key>VivoxVoicePort</key> + <map> + <key>Comment</key> + <string>Client SLVoice port to connect to</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>U32</string> + <key>Value</key> + <integer>44125</integer> + </map> <key>VoiceCallsFriendsOnly</key> <map> <key>Comment</key> @@ -10358,27 +11144,38 @@ <key>Value</key> <integer>0</integer> </map> - <key>AutoDisengageMic</key> + <key>VoiceEffectExpiryWarningTime</key> <map> <key>Comment</key> - <string>Automatically turn off the microphone when ending IM calls.</string> + <string>How much notice to give of Voice Morph subscriptions expiry, in seconds.</string> <key>Persist</key> <integer>1</integer> <key>Type</key> + <string>S32</string> + <key>Value</key> + <integer>259200</integer> + </map> + <key>VoiceMorphingEnabled</key> + <map> + <key>Comment</key> + <string>Whether or not to enable Voice Morphs and show the UI.</string> + <key>Persist</key> + <integer>0</integer> + <key>Type</key> <string>Boolean</string> <key>Value</key> <integer>1</integer> </map> - <key>VoiceDefaultInternalLevel</key> + <key>AutoDisengageMic</key> <map> <key>Comment</key> - <string>Internal level of voice set by default. Is equivalent to 0.5 (from 0.0-1.0 range) external voice level (internal = 400 * external^2).</string> + <string>Automatically turn off the microphone when ending IM calls.</string> <key>Persist</key> <integer>1</integer> <key>Type</key> - <string>S32</string> + <string>Boolean</string> <key>Value</key> - <integer>100</integer> + <integer>1</integer> </map> <key>VoiceEarLocation</key> <map> @@ -10490,6 +11287,17 @@ <key>Value</key> <string>Default</string> </map> + <key>VoiceLogFile</key> + <map> + <key>Comment</key> + <string>Log file to use when launching the voice daemon</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string></string> + </map> <key>VoiceOutputAudioDevice</key> <map> <key>Comment</key> @@ -10534,6 +11342,17 @@ <key>Value</key> <integer>0</integer> </map> + <key>VoiceServerType</key> + <map> + <key>Comment</key> + <string>The type of voice server to connect to.</string> + <key>Persist</key> + <integer>0</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>vivox</string> + </map> <key>WLSkyDetail</key> <map> <key>Comment</key> @@ -10600,27 +11419,38 @@ <key>Value</key> <real>50.0</real> </map> - <key>WindLightUseAtmosShaders</key> + <key>WellIconFlashCount</key> <map> <key>Comment</key> - <string>Whether to enable or disable WindLight atmospheric shaders.</string> + <string>Number of flashes of IM Well and Notification Well icons after which flashing buttons stay lit up. Requires restart.</string> <key>Persist</key> <integer>1</integer> <key>Type</key> - <string>Boolean</string> + <string>S32</string> <key>Value</key> + <integer>3</integer> + </map> + <key>WellIconFlashPeriod</key> + <map> + <key>Comment</key> + <string>Period at which IM Well and Notification Well icons flash (seconds). Requires restart.</string> + <key>Persist</key> <integer>1</integer> + <key>Type</key> + <string>F32</string> + <key>Value</key> + <real>0.25</real> </map> - <key>WindowFullScreen</key> + <key>WindLightUseAtmosShaders</key> <map> <key>Comment</key> - <string>Run SL in fullscreen mode</string> + <string>Whether to enable or disable WindLight atmospheric shaders.</string> <key>Persist</key> <integer>1</integer> <key>Type</key> <string>Boolean</string> <key>Value</key> - <integer>0</integer> + <integer>1</integer> </map> <key>WindowHeight</key> <map> @@ -10631,7 +11461,7 @@ <key>Type</key> <string>S32</string> <key>Value</key> - <integer>700</integer> + <integer>738</integer> </map> <key>WindowMaximized</key> <map> @@ -10653,7 +11483,7 @@ <key>Type</key> <string>S32</string> <key>Value</key> - <integer>1000</integer> + <integer>1024</integer> </map> <key>WindowX</key> <map> @@ -10886,5 +11716,113 @@ <key>Value</key> <integer>1</integer> </map> + + <!-- Settings below are for back compatibility only. + They are not used in current viewer anymore. But they can't be removed to avoid + influence on previous versions of the viewer in case of settings are not used or default value + should be changed. See also EXT-6661. --> + <!-- 1.23 settings --> + <key>ShowVoiceChannelPopup</key> + <map> + <key>Comment</key> + <string>Controls visibility of the current voice channel popup above the voice tab</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> + <key>ShowVolumeSettingsPopup</key> + <map> + <key>Comment</key> + <string>Show individual volume slider for voice, sound effects, etc</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> + <key>max_texture_dimension_X</key> + <map> + <key>Comment</key> + <string>Maximum texture width for user uploaded textures</string> + <key>Persist</key> + <key>Type</key> + <string>S32</string> + <key>Value</key> + <integer>2048</integer> + </map> + <key>max_texture_dimension_Y</key> + <map> + <key>Comment</key> + <string>Maximum texture height for user uploaded textures</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>S32</string> + <key>Value</key> + <integer>2048</integer> + </map> + <!-- End of back compatibility settings --> + <key>teleport_offer_invitation_max_length</key> + <map> + <key>Comment</key> + <string>Maximum length of teleport offer invitation line editor. 254 - max_location_url_length(76) = 178</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>S32</string> + <key>Value</key> + <integer>178</integer> + </map> + <key>always_showable_floaters</key> + <map> + <key>Comment</key> + <string>Floaters that can be shown despite mouselook mode</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>LLSD</string> + <key>Value</key> + <array> + <string>snapshot</string> + <string>mini_map</string> + </array> + </map> + <key>LandmarksSortedByDate</key> + <map> + <key>Comment</key> + <string>Reflects landmarks panel sorting order.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> + <key>OutfitOperationsTimeout</key> + <map> + <key>Comment</key> + <string>Timeout for outfit related operations.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>S32</string> + <key>Value</key> + <integer>180</integer> + </map> + <key>HeightUnits</key> + <map> + <key>Comment</key> + <string>Determines which metric units are used: 1(TRUE) for meter and 0(FALSE) for foot.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> </map> </llsd> diff --git a/indra/newview/app_settings/settings_per_account.xml b/indra/newview/app_settings/settings_per_account.xml index af5fa4f388..dc76a4e518 100644 --- a/indra/newview/app_settings/settings_per_account.xml +++ b/indra/newview/app_settings/settings_per_account.xml @@ -1,38 +1,27 @@ <llsd> <map> - <key>BusyModeResponse</key> + <key>BusyResponseChanged</key> <map> <key>Comment</key> - <string>Auto response to instant messages while in busy mode.</string> + <string>Does user's busy mode message differ from default?</string> <key>Persist</key> <integer>1</integer> <key>Type</key> - <string>String</string> + <string>Boolean</string> <key>Value</key> - <string>The Resident you messaged is in 'busy mode' which means they have requested not to be disturbed. Your message will still be shown in their IM panel for later viewing.</string> + <integer>0</integer> </map> - <key>BusyModeResponse2</key> + <key>BusyModeResponse</key> <map> <key>Comment</key> - <string>Auto response to instant messages while in busy mode, clean (unencoded) version of BusyModeResponse</string> + <string>Auto response to instant messages while in busy mode.</string> <key>Persist</key> <integer>1</integer> <key>Type</key> <string>String</string> <key>Value</key> - <string>|TOKEN COPY BusyModeResponse|</string> + <string>The Resident you messaged is in 'busy mode' which means they have requested not to be disturbed. Your message will still be shown in their IM panel for later viewing.</string> </map> - <key>InstantMessageLogFolder</key> - <map> - <key>Comment</key> - <string>Top level folder to your log files.</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>String</string> - <key>Value</key> - <string /> - </map> <key>InstantMessageLogPath</key> <map> <key>Comment</key> @@ -55,10 +44,10 @@ <key>Value</key> <integer>0</integer> </map> - <key>LogChat</key> + <key>LogNearbyChat</key> <map> <key>Comment</key> - <string>Log Chat</string> + <string>Log Nearby Chat messages to a file. Is used instead of LogChat but with the "1" default value.</string> <key>Persist</key> <integer>1</integer> <key>Type</key> @@ -110,5 +99,57 @@ <key>Value</key> <integer>1</integer> </map> + <key>VoiceEffectDefault</key> + <map> + <key>Comment</key> + <string>Selected Voice Morph</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>00000000-0000-0000-0000-000000000000</string> + </map> + + <!-- Settings below are for back compatibility only. + They are not used in current viewer anymore. But they can't be removed to avoid + influence on previous versions of the viewer in case of settings are not used or default value + should be changed. See EXT-6661. --> + + <!-- 1.23 settings --> + <key>LogChat</key> + <map> + <key>Comment</key> + <string>Log Chat</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> + <key>LogChatIM</key> + <map> + <key>Comment</key> + <string>Log Incoming Instant Messages with Chat</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> + <key>LogChatTimestamp</key> + <map> + <key>Comment</key> + <string>Log Timestamp of Chat</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> + <!-- End of back compatibility settings --> </map> </llsd> diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml index 448e20b382..9564236ad2 100644 --- a/indra/newview/character/avatar_lad.xml +++ b/indra/newview/character/avatar_lad.xml @@ -4782,7 +4782,7 @@ group="1" name="Saddlebags" wearable="shape" - edit_grouo="driven" + edit_group="driven" value_min="-.5" value_max="3"> <param_morph> @@ -6623,6 +6623,60 @@ render_pass="bump"> name="head_tattoo"> <texture local_texture="head_tattoo" /> + <param + id="1062" + group="1" + edit_group="colorpicker_driven" + wearable="tattoo" + name="tattoo_head_red" + value_min="0" + value_max="1" + value_default="1"> + <param_color> + <value + color="0, 0, 0, 255" /> + + <value + color="255, 0, 0, 255" /> + </param_color> + </param> + + <param + id="1063" + group="1" + edit_group="colorpicker_driven" + wearable="tattoo" + name="tattoo_head_green" + value_min="0" + value_max="1" + value_default="1"> + <param_color> + <value + color="0, 0, 0, 255" /> + + <value + color="0, 255, 0, 255" /> + </param_color> + </param> + + <param + id="1064" + group="1" + edit_group="colorpicker_driven" + wearable="tattoo" + name="tattoo_head_blue" + value_min="0" + value_max="1" + value_default="1"> + <param_color> + <value + color="0, 0, 0, 255" /> + + <value + color="0, 0, 255, 255" /> + </param_color> + </param> + </layer> @@ -6745,6 +6799,61 @@ render_pass="bump"> name="upper_tattoo"> <texture local_texture="upper_tattoo" /> + + <param + id="1065" + group="1" + edit_group="colorpicker_driven" + wearable="tattoo" + name="tattoo_upper_red" + value_min="0" + value_max="1" + value_default="1"> + <param_color> + <value + color="0, 0, 0, 255" /> + + <value + color="255, 0, 0, 255" /> + </param_color> + </param> + + <param + id="1066" + group="1" + edit_group="colorpicker_driven" + wearable="tattoo" + name="tattoo_upper_green" + value_min="0" + value_max="1" + value_default="1"> + <param_color> + <value + color="0, 0, 0, 255" /> + + <value + color="0, 255, 0, 255" /> + </param_color> + </param> + + <param + id="1067" + group="1" + edit_group="colorpicker_driven" + wearable="tattoo" + name="tattoo_upper_blue" + value_min="0" + value_max="1" + value_default="1"> + <param_color> + <value + color="0, 0, 0, 255" /> + + <value + color="0, 0, 255, 255" /> + </param_color> + </param> + </layer> @@ -7942,6 +8051,61 @@ render_pass="bump"> name="lower_tattoo"> <texture local_texture="lower_tattoo" /> + + <param + id="1068" + group="1" + edit_group="colorpicker_driven" + wearable="tattoo" + name="tattoo_lower_red" + value_min="0" + value_max="1" + value_default="1"> + <param_color> + <value + color="0, 0, 0, 255" /> + + <value + color="255, 0, 0, 255" /> + </param_color> + </param> + + <param + id="1069" + group="1" + edit_group="colorpicker_driven" + wearable="tattoo" + name="tattoo_lower_green" + value_min="0" + value_max="1" + value_default="1"> + <param_color> + <value + color="0, 0, 0, 255" /> + + <value + color="0, 255, 0, 255" /> + </param_color> + </param> + + <param + id="1070" + group="1" + edit_group="colorpicker_driven" + wearable="tattoo" + name="tattoo_lower_blue" + value_min="0" + value_max="1" + value_default="1"> + <param_color> + <value + color="0, 0, 0, 255" /> + + <value + color="0, 0, 255, 255" /> + </param_color> + </param> + </layer> <layer @@ -11367,6 +11531,106 @@ render_pass="bump"> </param_driver> </param> + <param + id="1071" + group="0" + wearable="tattoo" + edit_group="colorpicker" + name="tattoo_red" + value_min="0" + value_max="1" + value_default="1"> + <param_driver> + <driven + id="1062" + min1="0" + max1="1" + max2="1" + min2="1" /> + + <driven + id="1065" + min1="0" + max1="1" + max2="1" + min2="1" /> + + <driven + id="1068" + min1="0" + max1="1" + max2="1" + min2="1" /> + </param_driver> + </param> + + <param + id="1072" + group="0" + wearable="tattoo" + edit_group="colorpicker" + name="tattoo_green" + value_min="0" + value_max="1" + value_default="1"> + <param_driver> + <driven + id="1063" + min1="0" + max1="1" + max2="1" + min2="1" /> + + <driven + id="1066" + min1="0" + max1="1" + max2="1" + min2="1" /> + + <driven + id="1069" + min1="0" + max1="1" + max2="1" + min2="1" /> + </param_driver> + </param> + + <param + id="1073" + group="0" + wearable="tattoo" + edit_group="colorpicker" + name="tattoo_blue" + value_min="0" + value_max="1" + value_default="1"> + <param_driver> + <driven + id="1064" + min1="0" + max1="1" + max2="1" + min2="1" /> + + <driven + id="1067" + min1="0" + max1="1" + max2="1" + min2="1" /> + + <driven + id="1070" + min1="0" + max1="1" + max2="1" + min2="1" /> + + </param_driver> + </param> + </driver_parameters> diff --git a/indra/newview/cursors_mac/UI_CURSOR_TOOLBUY.tif b/indra/newview/cursors_mac/UI_CURSOR_TOOLBUY.tif Binary files differnew file mode 100644 index 0000000000..f366026c33 --- /dev/null +++ b/indra/newview/cursors_mac/UI_CURSOR_TOOLBUY.tif diff --git a/indra/newview/cursors_mac/UI_CURSOR_TOOLOPEN.tif b/indra/newview/cursors_mac/UI_CURSOR_TOOLOPEN.tif Binary files differnew file mode 100644 index 0000000000..e9e6a20cd9 --- /dev/null +++ b/indra/newview/cursors_mac/UI_CURSOR_TOOLOPEN.tif diff --git a/indra/newview/cursors_mac/UI_CURSOR_TOOLSIT.tif b/indra/newview/cursors_mac/UI_CURSOR_TOOLSIT.tif Binary files differnew file mode 100644 index 0000000000..bea3d9d442 --- /dev/null +++ b/indra/newview/cursors_mac/UI_CURSOR_TOOLSIT.tif diff --git a/indra/newview/featuretable.txt b/indra/newview/featuretable.txt index 4029bf95a0..e8591ca086 100644 --- a/indra/newview/featuretable.txt +++ b/indra/newview/featuretable.txt @@ -26,6 +26,7 @@ list all RenderAnisotropic 1 0 RenderAvatarCloth 1 1 RenderAvatarLODFactor 1 1.0 +RenderAvatarMaxVisible 1 12 RenderAvatarVP 1 1 RenderCubeMap 1 1 RenderDelayVBUpdate 1 0 @@ -56,7 +57,7 @@ Disregard128DefaultDrawDistance 1 1 Disregard96DefaultDrawDistance 1 1 RenderTextureMemoryMultiple 1 1.0 RenderShaderLightingMaxLevel 1 3 - +SkyUseClassicClouds 1 1 // // Low Graphics Settings @@ -64,24 +65,26 @@ RenderShaderLightingMaxLevel 1 3 list Low RenderAnisotropic 1 0 RenderAvatarCloth 1 0 -RenderAvatarLODFactor 1 0.5 +RenderAvatarLODFactor 1 0 +RenderAvatarMaxVisible 1 3 RenderAvatarVP 1 0 RenderFarClip 1 64 -RenderFlexTimeFactor 1 0.5 +RenderFlexTimeFactor 1 0 RenderGlowResolutionPow 1 8 RenderLightingDetail 1 0 -RenderMaxPartCount 1 1024 +RenderMaxPartCount 1 0 RenderObjectBump 1 0 RenderReflectionDetail 1 0 RenderTerrainDetail 1 0 RenderTerrainLODFactor 1 1 -RenderTreeLODFactor 1 0.5 +RenderTreeLODFactor 1 0 RenderUseImpostors 1 1 -RenderVolumeLODFactor 1 1.125 +RenderVolumeLODFactor 1 0 RenderWaterReflections 1 0 VertexShaderEnable 1 0 WindLightUseAtmosShaders 1 0 WLSkyDetail 1 48 +SkyUseClassicClouds 1 0 // // Mid Graphics Settings @@ -296,28 +299,23 @@ RenderUseImpostors 0 0 list Intel_945GM RenderTerrainDetail 1 0 RenderVBOEnable 1 0 -RenderUseImpostors 0 0 list Intel_945G RenderTerrainDetail 1 0 RenderVBOEnable 1 0 -RenderUseImpostors 0 0 list Intel_950 RenderTerrainDetail 1 0 RenderVBOEnable 1 0 -RenderUseImpostors 0 0 list Intel_965 RenderTerrainDetail 1 0 RenderVBOEnable 1 0 UseOcclusion 0 0 -RenderUseImpostors 0 0 list Intel_G33 RenderTerrainDetail 1 0 RenderVBOEnable 1 0 -RenderUseImpostors 0 0 list Intel_G45 WindLightUseAtmosShaders 0 0 diff --git a/indra/newview/featuretable_linux.txt b/indra/newview/featuretable_linux.txt index 61a8e51c50..779490c9f7 100644 --- a/indra/newview/featuretable_linux.txt +++ b/indra/newview/featuretable_linux.txt @@ -26,6 +26,7 @@ list all RenderAnisotropic 1 0 RenderAvatarCloth 1 1 RenderAvatarLODFactor 1 1.0 +RenderAvatarMaxVisible 1 12 RenderAvatarVP 1 1 RenderCubeMap 1 1 RenderDelayVBUpdate 1 0 @@ -55,6 +56,7 @@ WLSkyDetail 1 128 Disregard128DefaultDrawDistance 1 1 Disregard96DefaultDrawDistance 1 1 RenderTextureMemoryMultiple 1 1.0 +SkyUseClassicClouds 1 1 // // Low Graphics Settings @@ -62,24 +64,26 @@ RenderTextureMemoryMultiple 1 1.0 list Low RenderAnisotropic 1 0 RenderAvatarCloth 1 0 -RenderAvatarLODFactor 1 0.5 +RenderAvatarLODFactor 1 0 +RenderAvatarMaxVisible 1 3 RenderAvatarVP 1 0 RenderFarClip 1 64 -RenderFlexTimeFactor 1 0.5 +RenderFlexTimeFactor 1 0 RenderGlowResolutionPow 1 8 RenderLightingDetail 1 0 -RenderMaxPartCount 1 1024 +RenderMaxPartCount 1 0 RenderObjectBump 1 0 RenderReflectionDetail 1 0 RenderTerrainDetail 1 0 RenderTerrainLODFactor 1 1 -RenderTreeLODFactor 1 0.5 +RenderTreeLODFactor 1 0 RenderUseImpostors 1 1 -RenderVolumeLODFactor 1 1.125 +RenderVolumeLODFactor 1 0 RenderWaterReflections 1 0 VertexShaderEnable 1 0 WindLightUseAtmosShaders 1 0 WLSkyDetail 1 48 +SkyUseClassicClouds 1 0 // // Mid Graphics Settings diff --git a/indra/newview/featuretable_mac.txt b/indra/newview/featuretable_mac.txt index 12d47a904c..47033efc47 100644 --- a/indra/newview/featuretable_mac.txt +++ b/indra/newview/featuretable_mac.txt @@ -26,6 +26,7 @@ list all RenderAnisotropic 1 0 RenderAvatarCloth 0 0 RenderAvatarLODFactor 1 1.0 +RenderAvatarMaxVisible 1 12 RenderAvatarVP 1 0 RenderCubeMap 1 1 RenderDelayVBUpdate 1 0 @@ -57,6 +58,7 @@ Disregard96DefaultDrawDistance 1 1 RenderTextureMemoryMultiple 1 0.5 Disregard128DefaultDrawDistance 1 1 Disregard96DefaultDrawDistance 1 1 +SkyUseClassicClouds 1 1 // // Low Graphics Settings @@ -64,24 +66,26 @@ Disregard96DefaultDrawDistance 1 1 list Low RenderAnisotropic 1 0 RenderAvatarCloth 1 0 -RenderAvatarLODFactor 1 0.5 +RenderAvatarLODFactor 1 0 +RenderAvatarMaxVisible 1 3 RenderAvatarVP 1 0 RenderFarClip 1 64 -RenderFlexTimeFactor 1 0.5 +RenderFlexTimeFactor 1 0 RenderGlowResolutionPow 1 8 RenderLightingDetail 1 0 -RenderMaxPartCount 1 1024 +RenderMaxPartCount 1 0 RenderObjectBump 1 0 RenderReflectionDetail 1 0 RenderTerrainDetail 1 0 RenderTerrainLODFactor 1 1 -RenderTreeLODFactor 1 0.5 +RenderTreeLODFactor 1 0 RenderUseImpostors 1 1 -RenderVolumeLODFactor 1 1.125 +RenderVolumeLODFactor 1 0 RenderWaterReflections 1 0 VertexShaderEnable 1 0 WindLightUseAtmosShaders 1 0 WLSkyDetail 1 48 +SkyUseClassicClouds 1 0 // // Mid Graphics Settings diff --git a/indra/newview/featuretable_solaris.txt b/indra/newview/featuretable_solaris.txt index f24cbde5e2..6edd280686 100644 --- a/indra/newview/featuretable_solaris.txt +++ b/indra/newview/featuretable_solaris.txt @@ -117,6 +117,7 @@ UseOcclusion 0 0 list low RenderVBO 1 0 RenderAniso 1 0 +RenderAvatarMaxVisible 1 3 RenderLighting 1 0 list medium diff --git a/indra/newview/generate_breakpad_symbols.py b/indra/newview/generate_breakpad_symbols.py new file mode 100644 index 0000000000..1f42004bb7 --- /dev/null +++ b/indra/newview/generate_breakpad_symbols.py @@ -0,0 +1,135 @@ +#!/usr/bin/env python +# @file generate_breakpad_symbols.py +# @author Brad Kittenbrink <brad@lindenlab.com> +# @brief Simple tool for generating google_breakpad symbol information +# for the crash reporter. +# +# $LicenseInfo:firstyear=2010&license=viewergpl$ +# +# Copyright (c) 2010-2010, Linden Research, Inc. +# +# Second Life Viewer Source Code +# The source code in this file ("Source Code") is provided by Linden Lab +# to you under the terms of the GNU General Public License, version 2.0 +# ("GPL"), unless you have obtained a separate licensing agreement +# ("Other License"), formally executed by you and Linden Lab. Terms of +# the GPL can be found in doc/GPL-license.txt in this distribution, or +# online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 +# +# There are special exceptions to the terms and conditions of the GPL as +# it is applied to this Source Code. View the full text of the exception +# in the file doc/FLOSS-exception.txt in this software distribution, or +# online at +# http://secondlifegrid.net/programs/open_source/licensing/flossexception +# +# By copying, modifying or distributing this software, you acknowledge +# that you have read and understood your obligations described above, +# and agree to abide by those obligations. +# +# ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO +# WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, +# COMPLETENESS OR PERFORMANCE. +# $/LicenseInfo$ + + +import collections +import fnmatch +import itertools +import operator +import os +import sys +import shlex +import subprocess +import tarfile +import StringIO + +def usage(): + print >>sys.stderr, "usage: %s viewer_dir viewer_exes libs_suffix dump_syms_tool viewer_symbol_file" % sys.argv[0] + +class MissingModuleError(Exception): + def __init__(self, modules): + Exception.__init__(self, "Failed to find required modules: %r" % modules) + self.modules = modules + +def main(viewer_dir, viewer_exes, libs_suffix, dump_syms_tool, viewer_symbol_file): + print "generate_breakpad_symbols run with args: %s" % str((viewer_dir, viewer_exes, libs_suffix, dump_syms_tool, viewer_symbol_file)) + + # split up list of viewer_exes + # "'Second Life' SLPlugin" becomes ['Second Life', 'SLPlugin'] + viewer_exes = shlex.split(viewer_exes) + + found_required = dict([(module, False) for module in viewer_exes]) + + def matches(f): + if f in viewer_exes: + found_required[f] = True + return True + return fnmatch.fnmatch(f, libs_suffix) + + def list_files(): + for (dirname, subdirs, filenames) in os.walk(viewer_dir): + #print "scanning '%s' for modules..." % dirname + for f in itertools.ifilter(matches, filenames): + yield os.path.join(dirname, f) + + def dump_module(m): + print "dumping module '%s' with '%s'..." % (m, dump_syms_tool) + child = subprocess.Popen([dump_syms_tool, m] , stdout=subprocess.PIPE) + out, err = child.communicate() + return (m,child.returncode, out, err) + + out = tarfile.open(viewer_symbol_file, 'w:bz2') + + for (filename,status,symbols,err) in itertools.imap(dump_module, list_files()): + if status == 0: + module_line = symbols[:symbols.index('\n')] + module_line = module_line.split() + hash_id = module_line[3] + module = ' '.join(module_line[4:]) + if sys.platform in ['win32', 'cygwin']: + mod_name = module[:module.rindex('.pdb')] + else: + mod_name = module + symbolfile = StringIO.StringIO(symbols) + info = tarfile.TarInfo("%(module)s/%(hash_id)s/%(mod_name)s.sym" % dict(module=module, hash_id=hash_id, mod_name=mod_name)) + info.size = symbolfile.len + out.addfile(info, symbolfile) + else: + print >>sys.stderr, "warning: failed to dump symbols for '%s': %s" % (filename, err) + + out.close() + + missing_modules = [m for (m,_) in + itertools.ifilter(lambda (k,v): not v, found_required.iteritems()) + ] + if missing_modules: + print >> sys.stderr, "failed to generate %s" % viewer_symbol_file + os.remove(viewer_symbol_file) + raise MissingModuleError(missing_modules) + + symbols = tarfile.open(viewer_symbol_file, 'r:bz2') + tarfile_members = symbols.getnames() + symbols.close() + + for required_module in viewer_exes: + def match_module_basename(m): + return os.path.splitext(required_module)[0].lower() \ + == os.path.splitext(os.path.basename(m))[0].lower() + # there must be at least one .sym file in tarfile_members that matches + # each required module (ignoring file extensions) + if not reduce(operator.or_, itertools.imap(match_module_basename, tarfile_members)): + print >> sys.stderr, "failed to find required %s in generated %s" \ + % (required_module, viewer_symbol_file) + os.remove(viewer_symbol_file) + raise MissingModuleError([required_module]) + + print "successfully generated %s including required modules '%s'" % (viewer_symbol_file, viewer_exes) + + return 0 + +if __name__ == "__main__": + if len(sys.argv) != 6: + usage() + sys.exit(1) + sys.exit(main(*sys.argv[1:])) + diff --git a/indra/newview/gpu_table.txt b/indra/newview/gpu_table.txt index 887dab66d1..62766f9229 100644 --- a/indra/newview/gpu_table.txt +++ b/indra/newview/gpu_table.txt @@ -47,8 +47,10 @@ ATI ASUS EAH26xx .*ATI.*ASUS.*EAH26.* 3 1 ATI ASUS EAH34xx .*ATI.*ASUS.*EAH34.* 1 1 ATI ASUS EAH36xx .*ATI.*ASUS.*EAH36.* 3 1 ATI ASUS EAH38xx .*ATI.*ASUS.*EAH38.* 3 1 +ATI ASUS EAH45xx .*ATI.*ASUS.*EAH45.* 1 1 ATI ASUS EAH48xx .*ATI.*ASUS.*EAH48.* 3 1 -ATI Radeon X1xxx .*ATI.*ASUS.*X1.* 2 1 +ATI ASUS EAH57xx .*ATI.*ASUS.*EAH57.* 3 1 +ATI Radeon X1xxx .*ATI.*ASUS.*X1.* 3 1 ATI Radeon X7xx .*ATI.*ASUS.*X7.* 1 1 ATI Radeon X500 .*ATI.*Diamond X5.* 1 1 ATI Radeon X13xx .*ATI.*Diamond X13.* 1 1 @@ -68,37 +70,42 @@ ATI M56 .*ATI.*M56.* 1 1 ATI M71 .*ATI.*M71.* 1 1 ATI M72 .*ATI.*M72.* 1 1 ATI M76 .*ATI.*M76.* 3 1 -ATI Mobility Radeon 7xxx .*ATI.*Mobility.*Radeon 7.* 0 1 -ATI Mobility Radeon 8xxx .*ATI.*Mobility.*Radeon 8.* 0 1 -ATI Mobility Radeon 9800 .*ATI.*Mobility.*98.* 0 1 -ATI Mobility Radeon 9700 .*ATI.*Mobility.*97.* 0 1 -ATI Mobility Radeon 9600 .*ATI.*Mobility.*96.* 0 1 -ATI Mobility Radeon HD 2300 .*ATI.*Mobility.*HD.*23.* 1 1 -ATI Mobility Radeon HD 2400 .*ATI.*Mobility.*HD.*24.* 1 1 -ATI Mobility Radeon HD 2600 .*ATI.*Mobility.*HD.*26.* 3 1 -ATI Mobility Radeon HD 3400 .*ATI.*Mobility.*HD.*34.* 1 1 -ATI Mobility Radeon HD 3600 .*ATI.*Mobility.*HD.*36.* 3 1 -ATI Mobility Radeon HD 3800 .*ATI.*Mobility.*HD.*38.* 3 1 -ATI Mobility Radeon X1xxx .*ATI.*Mobility.*X1.* 0 1 -ATI Mobility Radeon X2xxx .*ATI.*Mobility.*X2.* 0 1 -ATI Mobility Radeon X3xx .*ATI.*Mobility.*X3.* 1 1 -ATI Mobility Radeon X6xx .*ATI.*Mobility.*X6.* 1 1 -ATI Mobility Radeon X7xx .*ATI.*Mobility.*X7.* 1 1 -ATI Mobility Radeon Xxxx .*ATI.*Mobility.*X.* 0 1 -ATI Mobility Radeon .*ATI.*Mobility.* 0 1 -ATI Radeon HD 2300 .*ATI.*Radeon HD 23.* 0 1 -ATI Radeon HD 2400 .*ATI.*Radeon HD.*24.* 1 1 -ATI Radeon HD 2600 .*ATI.*Radeon HD 26.* 2 1 -ATI Radeon HD 2900 .*ATI.*Radeon HD 29.* 3 1 -ATI Radeon HD 3200 .*ATI.*Radeon.*HD.*32.* 1 1 -ATI Radeon HD 3300 .*ATI.*Radeon HD.*33.* 1 1 -ATI Radeon HD 3400 .*ATI.*Radeon HD.*34.* 1 1 -ATI Radeon HD 3600 .*ATI.*Radeon HD.*36.* 3 1 -ATI Radeon HD 3800 .*ATI.*Radeon HD.*38.* 3 1 -ATI Radeon HD 4300 .*ATI.*Radeon HD 43.* 1 1 -ATI Radeon HD 4500 .*ATI.*Radeon HD 45.* 2 1 -ATI Radeon HD 4600 .*ATI.*Radeon HD 46.* 3 1 -ATI Radeon HD 4800 .*ATI.*Radeon.*HD.*48.* 3 1 +ATI Mobility Radeon 7xxx .*ATI.*Mobility *Radeon 7.* 0 1 +ATI Mobility Radeon 8xxx .*ATI.*Mobility *Radeon 8.* 0 1 +ATI Mobility Radeon 9800 .*ATI.*Mobility *98.* 0 1 +ATI Mobility Radeon 9700 .*ATI.*Mobility *97.* 0 1 +ATI Mobility Radeon 9600 .*ATI.*Mobility *96.* 0 1 +ATI Mobility Radeon HD 2300 .*ATI.*Mobility *HD *23.* 1 1 +ATI Mobility Radeon HD 2400 .*ATI.*Mobility *HD *24.* 1 1 +ATI Mobility Radeon HD 2600 .*ATI.*Mobility *HD *26.* 3 1 +ATI Mobility Radeon HD 3400 .*ATI.*Mobility *HD *34.* 1 1 +ATI Mobility Radeon HD 3600 .*ATI.*Mobility *HD *36.* 3 1 +ATI Mobility Radeon HD 3800 .*ATI.*Mobility *HD *38.* 3 1 +ATI Mobility Radeon X1xxx .*ATI.*Mobility *X1.* 0 1 +ATI Mobility Radeon X2xxx .*ATI.*Mobility *X2.* 0 1 +ATI Mobility Radeon X3xx .*ATI.*Mobility *X3.* 1 1 +ATI Mobility Radeon X6xx .*ATI.*Mobility *X6.* 1 1 +ATI Mobility Radeon X7xx .*ATI.*Mobility *X7.* 1 1 +ATI Mobility Radeon Xxxx .*ATI.*Mobility *X.* 0 1 +ATI Radeon HD 2300 .*ATI.*Radeon HD *23.* 0 1 +ATI Radeon HD 2400 .*ATI.*Radeon HD *24.* 1 1 +ATI Radeon HD 2600 .*ATI.*Radeon HD *26.* 2 1 +ATI Radeon HD 2900 .*ATI.*Radeon HD *29.* 3 1 +ATI Radeon HD 3200 .*ATI.*Radeon *HD *32.* 0 1 +ATI Radeon HD 3300 .*ATI.*Radeon HD *33.* 1 1 +ATI Radeon HD 3400 .*ATI.*Radeon HD *34.* 1 1 +ATI Radeon HD 3600 .*ATI.*Radeon HD *36.* 3 1 +ATI Radeon HD 3800 .*ATI.*Radeon HD *38.* 3 1 +ATI Radeon HD 4200 .*ATI.*Radeon HD *42.* 1 1 +ATI Radeon HD 4300 .*ATI.*Radeon HD *43.* 1 1 +ATI Radeon HD 4500 .*ATI.*Radeon HD *45.* 3 1 +ATI Radeon HD 4600 .*ATI.*Radeon HD *46.* 3 1 +ATI Radeon HD 4700 .*ATI.*Radeon HD *47.* 3 1 +ATI Radeon HD 4800 .*ATI.*Radeon.*HD *48.* 3 1 +ATI Radeon HD 5600 .*ATI.*Radeon.*HD *56.* 3 1 +ATI Radeon HD 5700 .*ATI.*Radeon.*HD *57.* 3 1 +ATI Radeon HD 5800 .*ATI.*Radeon.*HD *58.* 3 1 +ATI Radeon HD 5900 .*ATI.*Radeon.*HD *59.* 3 1 ATI Radeon OpenGL .*ATI.*Radeon OpenGL.* 0 0 ATI Radeon 2100 .*ATI.*Radeon 21.* 0 1 ATI Radeon 3100 .*ATI.*Radeon 31.* 1 1 @@ -120,12 +127,12 @@ ATI Radeon VE .*ATI.*Radeon.*VE.* 0 0 ATI Radeon X1000 .*ATI.*Radeon *X10.* 0 1 ATI Radeon X1200 .*ATI.*Radeon *X12.* 0 1 ATI Radeon X1300 .*ATI.*Radeon *X13.* 1 1 -ATI Radeon X1400 .*ATI.*Radeon X14.* 1 1 -ATI Radeon X1500 .*ATI.*Radeon X15.* 1 1 +ATI Radeon X1400 .*ATI.*Radeon *X14.* 1 1 +ATI Radeon X1500 .*ATI.*Radeon *X15.* 1 1 ATI Radeon X1600 .*ATI.*Radeon *X16.* 1 1 -ATI Radeon X1700 .*ATI.*Radeon X17.* 1 1 -ATI Radeon X1800 .*ATI.*Radeon X18.* 3 1 -ATI Radeon X1900 .*ATI.*Radeon X19.* 3 1 +ATI Radeon X1700 .*ATI.*Radeon *X17.* 1 1 +ATI Radeon X1800 .*ATI.*Radeon *X18.* 3 1 +ATI Radeon X1900 .*ATI.*Radeon *X19.* 3 1 ATI Radeon X300 .*ATI.*Radeon *X3.* 0 1 ATI Radeon X400 .*ATI.*Radeon X4.* 0 1 ATI Radeon X500 .*ATI.*Radeon X5.* 0 1 @@ -152,13 +159,17 @@ Intel 945G .*Intel.*945G.* 0 1 Intel 950 .*Intel.*950.* 0 1 Intel 965 .*Intel.*965.* 0 1 Intel G33 .*Intel.*G33.* 0 0 +Intel G41 .*Intel.*G41.* 0 1 Intel G45 .*Intel.*G45.* 0 1 Intel Bear Lake .*Intel.*Bear Lake.* 0 0 Intel Broadwater .*Intel.*Broadwater.* 0 0 Intel Brookdale .*Intel.*Brookdale.* 0 0 Intel Cantiga .*Intel.*Cantiga.* 0 0 Intel Eaglelake .*Intel.*Eaglelake.* 0 1 +Intel Mobile 4 Series .*Intel.*Mobile.*4 Series.* 0 1 +Intel Media Graphics HD .*Intel.*Media.*Graphics.*HD.* 0 1 Intel Montara .*Intel.*Montara.* 0 0 +Intel Pineview .*Intel.*Pineview.* 0 1 Intel Springdale .*Intel.*Springdale.* 0 0 Matrox .*Matrox.* 0 0 Mesa .*Mesa.* 0 0 @@ -192,14 +203,14 @@ NVIDIA GeForce 7100 .*NVIDIA.*GeForce 71.* 0 1 NVIDIA GeForce 7200 .*NVIDIA.*GeForce 72.* 1 1 NVIDIA GeForce 7300 .*NVIDIA.*GeForce 73.* 1 1 NVIDIA GeForce 7500 .*NVIDIA.*GeForce 75.* 1 1 -NVIDIA GeForce 7600 .*NVIDIA.*GeForce 76.* 3 1 -NVIDIA GeForce 7800 .*NVIDIA.*GeForce.*78.* 3 1 -NVIDIA GeForce 7900 .*NVIDIA.*GeForce.*79.* 3 1 +NVIDIA GeForce 7600 .*NVIDIA.*GeForce 76.* 1 1 +NVIDIA GeForce 7800 .*NVIDIA.*GeForce 78.* 1 1 +NVIDIA GeForce 7900 .*NVIDIA.*GeForce 79.* 1 1 NVIDIA GeForce 8100 .*NVIDIA.*GeForce 81.* 1 1 NVIDIA GeForce 8200 .*NVIDIA.*GeForce 82.* 1 1 NVIDIA GeForce 8300 .*NVIDIA.*GeForce 83.* 1 1 NVIDIA GeForce 8400 .*NVIDIA.*GeForce 84.* 1 1 -NVIDIA GeForce 8500 .*GeForce 85.* 3 1 +NVIDIA GeForce 8500 .*GeForce 85.* 1 1 NVIDIA GeForce 8600M .*NVIDIA.*GeForce.*8600M.* 1 1 NVIDIA GeForce 8600 .*NVIDIA.*GeForce 86.* 3 1 NVIDIA GeForce 8700 .*NVIDIA.*GeForce 87.* 3 1 @@ -248,6 +259,7 @@ NVIDIA G84 .*G84.* 1 1 NVIDIA G92 .*G92.* 3 1 NVIDIA G94 .*G94.* 3 1 NVIDIA GeForce Go 6 .*GeForce Go 6.* 1 1 +NVIDIA ION .*NVIDIA ION.* 1 1 NVIDIA NB9M .*GeForce NB9M.* 1 1 NVIDIA NB9P .*GeForce NB9P.* 1 1 NVIDIA GeForce PCX .*GeForce PCX.* 0 1 diff --git a/indra/newview/installers/darwin/release-dmg/_DS_Store b/indra/newview/installers/darwin/release-dmg/_DS_Store Binary files differindex 495ec37f53..8f6c25c2f4 100644 --- a/indra/newview/installers/darwin/release-dmg/_DS_Store +++ b/indra/newview/installers/darwin/release-dmg/_DS_Store diff --git a/indra/newview/installers/windows/install_icon.ico b/indra/newview/installers/windows/install_icon.ico Binary files differindex 1e00530c90..efe6c4f323 100644 --- a/indra/newview/installers/windows/install_icon.ico +++ b/indra/newview/installers/windows/install_icon.ico diff --git a/indra/newview/installers/windows/installer_template.nsi b/indra/newview/installers/windows/installer_template.nsi index a7322749ca..b7b4c54001 100644 --- a/indra/newview/installers/windows/installer_template.nsi +++ b/indra/newview/installers/windows/installer_template.nsi @@ -797,6 +797,12 @@ WriteRegStr HKEY_CLASSES_ROOT "${URLNAME}\DefaultIcon" "" '"$INSTDIR\$INSTEXE"' ;; URL param must be last item passed to viewer, it ignores subsequent params ;; to avoid parameter injection attacks. WriteRegExpandStr HKEY_CLASSES_ROOT "${URLNAME}\shell\open\command" "" '"$INSTDIR\$INSTEXE" $INSTFLAGS -url "%1"' +WriteRegStr HKEY_CLASSES_ROOT "x-grid-location-info"(default)" "URL:Second Life" +WriteRegStr HKEY_CLASSES_ROOT "x-grid-location-info" "URL Protocol" "" +WriteRegStr HKEY_CLASSES_ROOT "x-grid-location-info\DefaultIcon" "" '"$INSTDIR\$INSTEXE"' +;; URL param must be last item passed to viewer, it ignores subsequent params +;; to avoid parameter injection attacks. +WriteRegExpandStr HKEY_CLASSES_ROOT "x-grid-location-info\shell\open\command" "" '"$INSTDIR\$INSTEXE" $INSTFLAGS -url "%1"' ; write out uninstaller WriteUninstaller "$INSTDIR\uninst.exe" diff --git a/indra/newview/installers/windows/uninstall_icon.ico b/indra/newview/installers/windows/uninstall_icon.ico Binary files differindex c4ec6c70bd..05e1546860 100644 --- a/indra/newview/installers/windows/uninstall_icon.ico +++ b/indra/newview/installers/windows/uninstall_icon.ico diff --git a/indra/newview/linux_tools/client-readme.txt b/indra/newview/linux_tools/client-readme.txt index 92d321d8c0..e01b9e4bc6 100644 --- a/indra/newview/linux_tools/client-readme.txt +++ b/indra/newview/linux_tools/client-readme.txt @@ -15,7 +15,7 @@ Life itself - please see <http://www.secondlife.com/whatis/>. 5.3. Blank window after minimizing it 5.4. Audio 5.5. 'Alt' key for camera controls doesn't work - 5.6. In-world streaming movie/music playback + 5.6. In-world streaming movie, music and Flash playback 6. Advanced Troubleshooting 6.1. Audio 6.2. OpenGL @@ -169,12 +169,15 @@ SOLUTION:- Some window managers eat the Alt key for their own purposes; you example, the 'Windows' key!) which will allow the Alt key to function properly with mouse actions in Second Life and other applications. -PROBLEM 6:- In-world movie and/or music playback doesn't work for me. +PROBLEM 6:- In-world movie, music, or Flash playback doesn't work for me. SOLUTION:- You need to have a working installation of GStreamer 0.10; this is usually an optional package for most versions of Linux. If you have installed GStreamer 0.10 and you can play some music/movies but not others then you need to install a wider selection of GStreamer plugins, either - from your vendor or an appropriate third party. + from your vendor (i.e. the 'Ugly' plugins) or an appropriate third party. + For Flash playback, you need to have Flash 10 installed for your normal + web browser (for example, Firefox). PulseAudio is required for Flash + volume control / muting to fully function inside Second Life. 6. ADVANCED TROUBLESHOOTING diff --git a/indra/newview/linux_tools/wrapper.sh b/indra/newview/linux_tools/wrapper.sh index f84102e1fb..d2df968544 100755 --- a/indra/newview/linux_tools/wrapper.sh +++ b/indra/newview/linux_tools/wrapper.sh @@ -41,16 +41,8 @@ ## driver bug, try enabling this option and report whether it helps: #export LL_ATI_MOUSE_CURSOR_BUG=x -## - If you experience crashes with streaming video and music, you can -## disable these by enabling this option: -#export LL_DISABLE_GSTREAMER=x - -## - GStreamer is automatically disabled - for now - on 64-bit systems due -## to common fatal incompatibilities; remove/comment these lines if you want -## to try anyway. if [ "`uname -m`" = "x86_64" ]; then - export LL_DISABLE_GSTREAMER=x - echo '64-bit Linux detected: Disabling GStreamer (streaming video and music) by default; edit ./secondlife to re-enable.' + echo '64-bit Linux detected.' fi ## Everything below this line is just for advanced troubleshooters. diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index 2354323a66..03efcadc98 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -35,6 +35,7 @@ #include "pipeline.h" +#include "llagentcamera.h" #include "llagentlistener.h" #include "llagentwearables.h" #include "llagentui.h" @@ -43,9 +44,7 @@ #include "llcallingcard.h" #include "llchannelmanager.h" #include "llconsole.h" -//#include "llfirstuse.h" #include "llfloatercamera.h" -#include "llfloatercustomize.h" #include "llfloaterreg.h" #include "llfloatertools.h" #include "llgroupactions.h" @@ -59,6 +58,7 @@ #include "llnearbychatbar.h" #include "llnotificationsutil.h" #include "llparcel.h" +#include "llrendersphere.h" #include "llsdutil.h" #include "llsidetray.h" #include "llsky.h" @@ -72,6 +72,7 @@ #include "llviewerdisplay.h" #include "llviewerjoystick.h" #include "llviewermediafocus.h" +#include "llviewermenu.h" #include "llviewerobjectlist.h" #include "llviewerparcelmgr.h" #include "llviewerstats.h" @@ -88,77 +89,18 @@ const BOOL ANIMATE = TRUE; const U8 AGENT_STATE_TYPING = 0x04; const U8 AGENT_STATE_EDITING = 0x10; -//drone wandering constants -const F32 MAX_WANDER_TIME = 20.f; // seconds -const F32 MAX_HEADING_HALF_ERROR = 0.2f; // radians -const F32 WANDER_MAX_SLEW_RATE = 2.f * DEG_TO_RAD; // radians / frame -const F32 WANDER_TARGET_MIN_DISTANCE = 10.f; // meters - // Autopilot constants -const F32 AUTOPILOT_HEADING_HALF_ERROR = 10.f * DEG_TO_RAD; // radians -const F32 AUTOPILOT_MAX_SLEW_RATE = 1.f * DEG_TO_RAD; // radians / frame -const F32 AUTOPILOT_STOP_DISTANCE = 2.f; // meters const F32 AUTOPILOT_HEIGHT_ADJUST_DISTANCE = 8.f; // meters const F32 AUTOPILOT_MIN_TARGET_HEIGHT_OFF_GROUND = 1.f; // meters const F32 AUTOPILOT_MAX_TIME_NO_PROGRESS = 1.5f; // seconds -// face editing constants -const LLVector3d FACE_EDIT_CAMERA_OFFSET(0.4f, -0.05f, 0.07f); -const LLVector3d FACE_EDIT_TARGET_OFFSET(0.f, 0.f, 0.05f); - -// Mousewheel camera zoom -const F32 MIN_ZOOM_FRACTION = 0.25f; -const F32 INITIAL_ZOOM_FRACTION = 1.f; -const F32 MAX_ZOOM_FRACTION = 8.f; -const F32 METERS_PER_WHEEL_CLICK = 1.f; - -const F32 MAX_TIME_DELTA = 1.f; - -const F32 CAMERA_ZOOM_HALF_LIFE = 0.07f; // seconds -const F32 FOV_ZOOM_HALF_LIFE = 0.07f; // seconds - -const F32 CAMERA_FOCUS_HALF_LIFE = 0.f;//0.02f; -const F32 CAMERA_LAG_HALF_LIFE = 0.25f; -const F32 MIN_CAMERA_LAG = 0.5f; -const F32 MAX_CAMERA_LAG = 5.f; - -const F32 CAMERA_COLLIDE_EPSILON = 0.1f; -const F32 MIN_CAMERA_DISTANCE = 0.1f; -const F32 AVATAR_ZOOM_MIN_X_FACTOR = 0.55f; -const F32 AVATAR_ZOOM_MIN_Y_FACTOR = 0.7f; -const F32 AVATAR_ZOOM_MIN_Z_FACTOR = 1.15f; - -const F32 MAX_CAMERA_DISTANCE_FROM_AGENT = 50.f; - -const F32 MAX_CAMERA_SMOOTH_DISTANCE = 50.0f; - -const F32 HEAD_BUFFER_SIZE = 0.3f; -const F32 CUSTOMIZE_AVATAR_CAMERA_ANIM_SLOP = 0.2f; - -const F32 LAND_MIN_ZOOM = 0.15f; -const F32 AVATAR_MIN_ZOOM = 0.5f; -const F32 OBJECT_MIN_ZOOM = 0.02f; - -const F32 APPEARANCE_MIN_ZOOM = 0.39f; -const F32 APPEARANCE_MAX_ZOOM = 8.f; +const F32 MAX_VELOCITY_AUTO_LAND_SQUARED = 4.f * 4.f; +const F64 CHAT_AGE_FAST_RATE = 3.0; // fidget constants const F32 MIN_FIDGET_TIME = 8.f; // seconds const F32 MAX_FIDGET_TIME = 20.f; // seconds -const S32 MAX_NUM_CHAT_POSITIONS = 10; -const F32 GROUND_TO_AIR_CAMERA_TRANSITION_TIME = 0.5f; -const F32 GROUND_TO_AIR_CAMERA_TRANSITION_START_TIME = 0.5f; - -const F32 MAX_VELOCITY_AUTO_LAND_SQUARED = 4.f * 4.f; - -const F32 MAX_FOCUS_OFFSET = 20.f; - -const F32 OBJECT_EXTENTS_PADDING = 0.5f; - -const F32 MIN_RADIUS_ALPHA_SIZZLE = 0.5f; - -const F64 CHAT_AGE_FAST_RATE = 3.0; // The agent instance. LLAgent gAgent; @@ -193,11 +135,11 @@ bool handleSlowMotionAnimation(const LLSD& newvalue) { if (newvalue.asBoolean()) { - gAgent.getAvatarObject()->setAnimTimeFactor(0.2f); + gAgentAvatarp->setAnimTimeFactor(0.2f); } else { - gAgent.getAvatarObject()->setAnimTimeFactor(1.0f); + gAgentAvatarp->setAnimTimeFactor(1.0f); } return true; } @@ -218,20 +160,12 @@ bool handleSlowMotionAnimation(const LLSD& newvalue) // LLAgent() //----------------------------------------------------------------------------- LLAgent::LLAgent() : - mDrawDistance( DEFAULT_FAR_PLANE ), - mGroupPowers(0), mHideGroupTitle(FALSE), mGroupID(), - mLookAt(NULL), - mPointAt(NULL), - - mHUDTargetZoom(1.f), - mHUDCurZoom(1.f), mInitialized(FALSE), mListener(), - mForceMouselook(FALSE), mDoubleTapRunTimer(), mDoubleTapRunMode(DOUBLETAP_NONE), @@ -249,78 +183,17 @@ LLAgent::LLAgent() : mDistanceTraveled(0.F), mLastPositionGlobal(LLVector3d::zero), - mAvatarObject(NULL), - mRenderState(0), mTypingTimer(), - mCameraMode( CAMERA_MODE_THIRD_PERSON ), - mLastCameraMode( CAMERA_MODE_THIRD_PERSON ), mViewsPushed(FALSE), - mCameraPreset(CAMERA_PRESET_REAR_VIEW), - mCustomAnim(FALSE), mShowAvatar(TRUE), - mCameraAnimating( FALSE ), - mAnimationCameraStartGlobal(), - mAnimationFocusStartGlobal(), - mAnimationTimer(), - mAnimationDuration(0.33f), - - mCameraFOVZoomFactor(0.f), - mCameraCurrentFOVZoomFactor(0.f), - mCameraFocusOffset(), - mCameraFOVDefault(DEFAULT_FIELD_OF_VIEW), - - mCameraCollidePlane(), - - mCurrentCameraDistance(2.f), // meters, set in init() - mTargetCameraDistance(2.f), - mCameraZoomFraction(1.f), // deprecated - mThirdPersonHeadOffset(0.f, 0.f, 1.f), - mSitCameraEnabled(FALSE), - mCameraSmoothingLastPositionGlobal(), - mCameraSmoothingLastPositionAgent(), - mCameraSmoothingStop(FALSE), - - mCameraUpVector(LLVector3::z_axis), // default is straight up - - mFocusOnAvatar(TRUE), - mFocusGlobal(), - mFocusTargetGlobal(), - mFocusObject(NULL), - mFocusObjectDist(0.f), - mFocusObjectOffset(), - mFocusDotRadius( 0.1f ), // meters - mTrackFocusObject(TRUE), - mUIOffset(0.f), - mFrameAgent(), mIsBusy(FALSE), - mAtKey(0), // Either 1, 0, or -1... indicates that movement-key is pressed - mWalkKey(0), // like AtKey, but causes less forward thrust - mLeftKey(0), - mUpKey(0), - mYawKey(0.f), - mPitchKey(0.f), - - mOrbitLeftKey(0.f), - mOrbitRightKey(0.f), - mOrbitUpKey(0.f), - mOrbitDownKey(0.f), - mOrbitInKey(0.f), - mOrbitOutKey(0.f), - - mPanUpKey(0.f), - mPanDownKey(0.f), - mPanLeftKey(0.f), - mPanRightKey(0.f), - mPanInKey(0.f), - mPanOutKey(0.f), - mControlFlags(0x00000000), mbFlagsDirty(FALSE), mbFlagsNeedReset(FALSE), @@ -358,7 +231,6 @@ LLAgent::LLAgent() : mControlsTakenPassedOnCount[i] = 0; } - mFollowCam.setMaxCameraDistantFromSubject( MAX_CAMERA_DISTANCE_FROM_AGENT ); mListener.reset(new LLAgentListener(*this)); } @@ -372,37 +244,10 @@ void LLAgent::init() gSavedSettings.declareBOOL("SlowMotionAnimation", FALSE, "Declared in code", FALSE); gSavedSettings.getControl("SlowMotionAnimation")->getSignal()->connect(boost::bind(&handleSlowMotionAnimation, _2)); - mDrawDistance = gSavedSettings.getF32("RenderFarClip"); - // *Note: this is where LLViewerCamera::getInstance() used to be constructed. - LLViewerCamera::getInstance()->setView(DEFAULT_FIELD_OF_VIEW); - // Leave at 0.1 meters until we have real near clip management - LLViewerCamera::getInstance()->setNear(0.1f); - LLViewerCamera::getInstance()->setFar(mDrawDistance); // if you want to change camera settings, do so in camera.h - LLViewerCamera::getInstance()->setAspect( gViewerWindow->getWorldViewAspectRatio() ); // default, overridden in LLViewerWindow::reshape - LLViewerCamera::getInstance()->setViewHeightInPixels(768); // default, overridden in LLViewerWindow::reshape - setFlying( gSavedSettings.getBOOL("FlyingAtExit") ); - mCameraFocusOffsetTarget = LLVector4(gSavedSettings.getVector3("CameraOffsetBuild")); - - mCameraPreset = (ECameraPreset) gSavedSettings.getU32("CameraPreset"); - - mCameraOffsetInitial[CAMERA_PRESET_REAR_VIEW] = gSavedSettings.getVector3("CameraOffsetRearView"); - mCameraOffsetInitial[CAMERA_PRESET_FRONT_VIEW] = gSavedSettings.getVector3("CameraOffsetFrontView"); - mCameraOffsetInitial[CAMERA_PRESET_GROUP_VIEW] = gSavedSettings.getVector3("CameraOffsetGroupView"); - - mFocusOffsetInitial[CAMERA_PRESET_REAR_VIEW] = gSavedSettings.getVector3d("FocusOffsetRearView"); - mFocusOffsetInitial[CAMERA_PRESET_FRONT_VIEW] = gSavedSettings.getVector3d("FocusOffsetFrontView"); - mFocusOffsetInitial[CAMERA_PRESET_GROUP_VIEW] = gSavedSettings.getVector3d("FocusOffsetGroupView"); - - mCameraCollidePlane.clearVec(); - mCurrentCameraDistance = getCameraOffsetInitial().magVec() * gSavedSettings.getF32("CameraOffsetScale"); - mTargetCameraDistance = mCurrentCameraDistance; - mCameraZoomFraction = 1.f; - mTrackFocusObject = gSavedSettings.getBOOL("TrackFocusObject"); - mEffectColor = LLUIColorTable::instance().getColor("EffectColor"); gSavedSettings.getControl("PreferredMaturity")->getValidateSignal()->connect(boost::bind(&LLAgent::validateMaturity, this, _2)); @@ -416,22 +261,7 @@ void LLAgent::init() //----------------------------------------------------------------------------- void LLAgent::cleanup() { - setSitCamera(LLUUID::null); - - mAvatarObject = NULL; - - if(mLookAt) - { - mLookAt->markDead() ; - mLookAt = NULL; - } - if(mPointAt) - { - mPointAt->markDead() ; - mPointAt = NULL; - } mRegionp = NULL; - setFocusObject(NULL); } //----------------------------------------------------------------------------- @@ -444,83 +274,6 @@ LLAgent::~LLAgent() // *Note: this is where LLViewerCamera::getInstance() used to be deleted. } -// Change camera back to third person, stop the autopilot, -// deselect stuff, etc. -//----------------------------------------------------------------------------- -// resetView() -//----------------------------------------------------------------------------- -void LLAgent::resetView(BOOL reset_camera, BOOL change_camera) -{ - if (mAutoPilot) - { - stopAutoPilot(TRUE); - } - - if (!gNoRender) - { - LLSelectMgr::getInstance()->unhighlightAll(); - - // By popular request, keep land selection while walking around. JC - // LLViewerParcelMgr::getInstance()->deselectLand(); - - // force deselect when walking and attachment is selected - // this is so people don't wig out when their avatar moves without animating - if (LLSelectMgr::getInstance()->getSelection()->isAttachment()) - { - LLSelectMgr::getInstance()->deselectAll(); - } - - // Hide all popup menus - gMenuHolder->hideMenus(); - } - - if (change_camera && !gSavedSettings.getBOOL("FreezeTime")) - { - changeCameraToDefault(); - - if (LLViewerJoystick::getInstance()->getOverrideCamera()) - { - handle_toggle_flycam(); - } - - // reset avatar mode from eventual residual motion - if (LLToolMgr::getInstance()->inBuildMode()) - { - LLViewerJoystick::getInstance()->moveAvatar(true); - } - - //Camera Tool is needed for Free Camera Control Mode - if (!LLFloaterCamera::inFreeCameraMode()) - { - LLFloaterReg::hideInstance("build"); - - // Switch back to basic toolset - LLToolMgr::getInstance()->setCurrentToolset(gBasicToolset); - } - - gViewerWindow->showCursor(); - } - - - if (reset_camera && !gSavedSettings.getBOOL("FreezeTime")) - { - if (!gViewerWindow->getLeftMouseDown() && cameraThirdPerson()) - { - // leaving mouse-steer mode - LLVector3 agent_at_axis = getAtAxis(); - agent_at_axis -= projected_vec(agent_at_axis, getReferenceUpVector()); - agent_at_axis.normalize(); - gAgent.resetAxes(lerp(getAtAxis(), agent_at_axis, LLCriticalDamp::getInterpolant(0.3f))); - } - - setFocusOnAvatar(TRUE, ANIMATE); - - mCameraFOVZoomFactor = 0.f; - } - - mHUDTargetZoom = 1.f; -} - // Handle any actions that need to be performed when the main app gains focus // (such as through alt-tab). //----------------------------------------------------------------------------- @@ -528,9 +281,9 @@ void LLAgent::resetView(BOOL reset_camera, BOOL change_camera) //----------------------------------------------------------------------------- void LLAgent::onAppFocusGained() { - if (CAMERA_MODE_MOUSELOOK == mCameraMode) + if (CAMERA_MODE_MOUSELOOK == gAgentCamera.getCameraMode()) { - changeCameraToDefault(); + gAgentCamera.changeCameraToDefault(); LLToolMgr::getInstance()->clearSavedTool(); } } @@ -538,32 +291,15 @@ void LLAgent::onAppFocusGained() void LLAgent::ageChat() { - if (mAvatarObject.notNull()) + if (isAgentAvatarValid()) { // get amount of time since I last chatted - F64 elapsed_time = (F64)mAvatarObject->mChatTimer.getElapsedTimeF32(); + F64 elapsed_time = (F64)gAgentAvatarp->mChatTimer.getElapsedTimeF32(); // add in frame time * 3 (so it ages 4x) - mAvatarObject->mChatTimer.setAge(elapsed_time + (F64)gFrameDTClamped * (CHAT_AGE_FAST_RATE - 1.0)); + gAgentAvatarp->mChatTimer.setAge(elapsed_time + (F64)gFrameDTClamped * (CHAT_AGE_FAST_RATE - 1.0)); } } -// Allow camera to be moved somewhere other than behind avatar. -//----------------------------------------------------------------------------- -// unlockView() -//----------------------------------------------------------------------------- -void LLAgent::unlockView() -{ - if (getFocusOnAvatar()) - { - if (mAvatarObject.notNull()) - { - setFocusGlobal( LLVector3d::zero, mAvatarObject->mID ); - } - setFocusOnAvatar(FALSE, FALSE); // no animation - } -} - - //----------------------------------------------------------------------------- // moveAt() //----------------------------------------------------------------------------- @@ -572,7 +308,7 @@ void LLAgent::moveAt(S32 direction, bool reset) // age chat timer so it fades more quickly when you are intentionally moving ageChat(); - setKey(direction, mAtKey); + gAgentCamera.setAtKey(LLAgentCamera::directionToKey(direction)); if (direction > 0) { @@ -585,7 +321,7 @@ void LLAgent::moveAt(S32 direction, bool reset) if (reset) { - resetView(); + gAgentCamera.resetView(); } } @@ -597,7 +333,7 @@ void LLAgent::moveAtNudge(S32 direction) // age chat timer so it fades more quickly when you are intentionally moving ageChat(); - setKey(direction, mWalkKey); + gAgentCamera.setWalkKey(LLAgentCamera::directionToKey(direction)); if (direction > 0) { @@ -608,7 +344,7 @@ void LLAgent::moveAtNudge(S32 direction) setControlFlags(AGENT_CONTROL_NUDGE_AT_NEG); } - resetView(); + gAgentCamera.resetView(); } //----------------------------------------------------------------------------- @@ -619,7 +355,7 @@ void LLAgent::moveLeft(S32 direction) // age chat timer so it fades more quickly when you are intentionally moving ageChat(); - setKey(direction, mLeftKey); + gAgentCamera.setLeftKey(LLAgentCamera::directionToKey(direction)); if (direction > 0) { @@ -630,7 +366,7 @@ void LLAgent::moveLeft(S32 direction) setControlFlags(AGENT_CONTROL_LEFT_NEG | AGENT_CONTROL_FAST_LEFT); } - resetView(); + gAgentCamera.resetView(); } //----------------------------------------------------------------------------- @@ -641,7 +377,7 @@ void LLAgent::moveLeftNudge(S32 direction) // age chat timer so it fades more quickly when you are intentionally moving ageChat(); - setKey(direction, mLeftKey); + gAgentCamera.setLeftKey(LLAgentCamera::directionToKey(direction)); if (direction > 0) { @@ -652,7 +388,7 @@ void LLAgent::moveLeftNudge(S32 direction) setControlFlags(AGENT_CONTROL_NUDGE_LEFT_NEG); } - resetView(); + gAgentCamera.resetView(); } //----------------------------------------------------------------------------- @@ -663,7 +399,7 @@ void LLAgent::moveUp(S32 direction) // age chat timer so it fades more quickly when you are intentionally moving ageChat(); - setKey(direction, mUpKey); + gAgentCamera.setUpKey(LLAgentCamera::directionToKey(direction)); if (direction > 0) { @@ -674,7 +410,7 @@ void LLAgent::moveUp(S32 direction) setControlFlags(AGENT_CONTROL_UP_NEG | AGENT_CONTROL_FAST_UP); } - resetView(); + gAgentCamera.resetView(); } //----------------------------------------------------------------------------- @@ -682,7 +418,7 @@ void LLAgent::moveUp(S32 direction) //----------------------------------------------------------------------------- void LLAgent::moveYaw(F32 mag, bool reset_view) { - mYawKey = mag; + gAgentCamera.setYawKey(mag); if (mag > 0) { @@ -695,7 +431,7 @@ void LLAgent::moveYaw(F32 mag, bool reset_view) if (reset_view) { - resetView(); + gAgentCamera.resetView(); } } @@ -704,7 +440,7 @@ void LLAgent::moveYaw(F32 mag, bool reset_view) //----------------------------------------------------------------------------- void LLAgent::movePitch(F32 mag) { - mPitchKey = mag; + gAgentCamera.setPitchKey(mag); if (mag > 0) { @@ -747,20 +483,20 @@ BOOL LLAgent::getFlying() const //----------------------------------------------------------------------------- void LLAgent::setFlying(BOOL fly) { - if (mAvatarObject.notNull()) + if (isAgentAvatarValid()) { // *HACK: Don't allow to start the flying mode if we got ANIM_AGENT_STANDUP signal // because in this case we won't get a signal to start avatar flying animation and // it will be walking with flying mode "ON" indication. However we allow to switch // the flying mode off if we get ANIM_AGENT_STANDUP signal. See process_avatar_animation(). // See EXT-2781. - if(fly && mAvatarObject->mSignaledAnimations.find(ANIM_AGENT_STANDUP) != mAvatarObject->mSignaledAnimations.end()) + if(fly && gAgentAvatarp->mSignaledAnimations.find(ANIM_AGENT_STANDUP) != gAgentAvatarp->mSignaledAnimations.end()) { return; } // don't allow taking off while sitting - if (fly && mAvatarObject->isSitting()) + if (fly && gAgentAvatarp->isSitting()) { return; } @@ -806,16 +542,16 @@ void LLAgent::toggleFlying() BOOL fly = !gAgent.getFlying(); gAgent.setFlying( fly ); - gAgent.resetView(); + gAgentCamera.resetView(); } // static bool LLAgent::enableFlying() { BOOL sitting = FALSE; - if (gAgent.getAvatarObject()) + if (isAgentAvatarValid()) { - sitting = gAgent.getAvatarObject()->isSitting(); + sitting = gAgentAvatarp->isSitting(); } return !sitting; } @@ -956,6 +692,7 @@ void LLAgent::sendMessage() if (!mRegionp) { llerrs << "No region for agent yet!" << llendl; + return; } gMessageSystem->sendMessage(mRegionp->getHost()); } @@ -984,9 +721,9 @@ void LLAgent::sendReliableMessage() //----------------------------------------------------------------------------- LLVector3 LLAgent::getVelocity() const { - if (mAvatarObject.notNull()) + if (isAgentAvatarValid()) { - return mAvatarObject->getVelocity(); + return gAgentAvatarp->getVelocity(); } else { @@ -1005,13 +742,13 @@ void LLAgent::setPositionAgent(const LLVector3 &pos_agent) llerrs << "setPositionAgent is not a number" << llendl; } - if (mAvatarObject.notNull() && mAvatarObject->getParent()) + if (isAgentAvatarValid() && gAgentAvatarp->getParent()) { LLVector3 pos_agent_sitting; LLVector3d pos_agent_d; - LLViewerObject *parent = (LLViewerObject*)mAvatarObject->getParent(); + LLViewerObject *parent = (LLViewerObject*)gAgentAvatarp->getParent(); - pos_agent_sitting = mAvatarObject->getPosition() * parent->getRotation() + parent->getPositionAgent(); + pos_agent_sitting = gAgentAvatarp->getPosition() * parent->getRotation() + parent->getPositionAgent(); pos_agent_d.setVec(pos_agent_sitting); mFrameAgent.setOrigin(pos_agent_sitting); @@ -1028,24 +765,13 @@ void LLAgent::setPositionAgent(const LLVector3 &pos_agent) } //----------------------------------------------------------------------------- -// slamLookAt() -//----------------------------------------------------------------------------- -void LLAgent::slamLookAt(const LLVector3 &look_at) -{ - LLVector3 look_at_norm = look_at; - look_at_norm.mV[VZ] = 0.f; - look_at_norm.normalize(); - resetAxes(look_at_norm); -} - -//----------------------------------------------------------------------------- // getPositionGlobal() //----------------------------------------------------------------------------- const LLVector3d &LLAgent::getPositionGlobal() const { - if (mAvatarObject.notNull() && !mAvatarObject->mDrawable.isNull()) + if (isAgentAvatarValid() && !gAgentAvatarp->mDrawable.isNull()) { - mPositionGlobal = getPosGlobalFromAgent(mAvatarObject->getRenderPosition()); + mPositionGlobal = getPosGlobalFromAgent(gAgentAvatarp->getRenderPosition()); } else { @@ -1060,9 +786,9 @@ const LLVector3d &LLAgent::getPositionGlobal() const //----------------------------------------------------------------------------- const LLVector3 &LLAgent::getPositionAgent() { - if(mAvatarObject.notNull() && !mAvatarObject->mDrawable.isNull()) + if (isAgentAvatarValid() && !gAgentAvatarp->mDrawable.isNull()) { - mFrameAgent.setOrigin(mAvatarObject->getRenderPosition()); + mFrameAgent.setOrigin(gAgentAvatarp->getRenderPosition()); } return mFrameAgent.getOrigin(); @@ -1188,21 +914,21 @@ LLVector3 LLAgent::getReferenceUpVector() { // this vector is in the coordinate frame of the avatar's parent object, or the world if none LLVector3 up_vector = LLVector3::z_axis; - if (mAvatarObject.notNull() && - mAvatarObject->getParent() && - mAvatarObject->mDrawable.notNull()) + if (isAgentAvatarValid() && + gAgentAvatarp->getParent() && + gAgentAvatarp->mDrawable.notNull()) { - U32 camera_mode = mCameraAnimating ? mLastCameraMode : mCameraMode; + U32 camera_mode = gAgentCamera.getCameraAnimating() ? gAgentCamera.getLastCameraMode() : gAgentCamera.getCameraMode(); // and in third person... if (camera_mode == CAMERA_MODE_THIRD_PERSON) { // make the up vector point to the absolute +z axis - up_vector = up_vector * ~((LLViewerObject*)mAvatarObject->getParent())->getRenderRotation(); + up_vector = up_vector * ~((LLViewerObject*)gAgentAvatarp->getParent())->getRenderRotation(); } else if (camera_mode == CAMERA_MODE_MOUSELOOK) { // make the up vector point to the avatar's +z axis - up_vector = up_vector * mAvatarObject->mDrawable->getRotation(); + up_vector = up_vector * gAgentAvatarp->mDrawable->getRotation(); } } @@ -1238,7 +964,7 @@ F32 LLAgent::clampPitchToLimits(F32 angle) F32 angle_from_skyward = acos( mFrameAgent.getAtAxis() * skyward ); - if (mAvatarObject.notNull() && mAvatarObject->isSitting()) + if (isAgentAvatarValid() && gAgentAvatarp->isSitting()) { look_down_limit = 130.f * DEG_TO_RAD; } @@ -1291,736 +1017,11 @@ LLQuaternion LLAgent::getQuat() const return mFrameAgent.getQuaternion(); } - -//----------------------------------------------------------------------------- -// calcFocusOffset() -//----------------------------------------------------------------------------- -LLVector3 LLAgent::calcFocusOffset(LLViewerObject *object, LLVector3 original_focus_point, S32 x, S32 y) -{ - LLMatrix4 obj_matrix = object->getRenderMatrix(); - LLQuaternion obj_rot = object->getRenderRotation(); - LLVector3 obj_pos = object->getRenderPosition(); - - BOOL is_avatar = object->isAvatar(); - // if is avatar - don't do any funk heuristics to position the focal point - // see DEV-30589 - if (is_avatar) - { - return original_focus_point - obj_pos; - } - - - LLQuaternion inv_obj_rot = ~obj_rot; // get inverse of rotation - LLVector3 object_extents = object->getScale(); - // make sure they object extents are non-zero - object_extents.clamp(0.001f, F32_MAX); - - // obj_to_cam_ray is unit vector pointing from object center to camera, in the coordinate frame of the object - LLVector3 obj_to_cam_ray = obj_pos - LLViewerCamera::getInstance()->getOrigin(); - obj_to_cam_ray.rotVec(inv_obj_rot); - obj_to_cam_ray.normalize(); - - // obj_to_cam_ray_proportions are the (positive) ratios of - // the obj_to_cam_ray x,y,z components with the x,y,z object dimensions. - LLVector3 obj_to_cam_ray_proportions; - obj_to_cam_ray_proportions.mV[VX] = llabs(obj_to_cam_ray.mV[VX] / object_extents.mV[VX]); - obj_to_cam_ray_proportions.mV[VY] = llabs(obj_to_cam_ray.mV[VY] / object_extents.mV[VY]); - obj_to_cam_ray_proportions.mV[VZ] = llabs(obj_to_cam_ray.mV[VZ] / object_extents.mV[VZ]); - - // find the largest ratio stored in obj_to_cam_ray_proportions - // this corresponds to the object's local axial plane (XY, YZ, XZ) that is *most* facing the camera - LLVector3 longest_object_axis; - // is x-axis longest? - if (obj_to_cam_ray_proportions.mV[VX] > obj_to_cam_ray_proportions.mV[VY] - && obj_to_cam_ray_proportions.mV[VX] > obj_to_cam_ray_proportions.mV[VZ]) - { - // then grab it - longest_object_axis.setVec(obj_matrix.getFwdRow4()); - } - // is y-axis longest? - else if (obj_to_cam_ray_proportions.mV[VY] > obj_to_cam_ray_proportions.mV[VZ]) - { - // then grab it - longest_object_axis.setVec(obj_matrix.getLeftRow4()); - } - // otherwise, use z axis - else - { - longest_object_axis.setVec(obj_matrix.getUpRow4()); - } - - // Use this axis as the normal to project mouse click on to plane with that normal, at the object center. - // This generates a point behind the mouse cursor that is approximately in the middle of the object in - // terms of depth. - // We do this to allow the camera rotation tool to "tumble" the object by rotating the camera. - // If the focus point were the object surface under the mouse, camera rotation would introduce an undesirable - // eccentricity to the object orientation - LLVector3 focus_plane_normal(longest_object_axis); - focus_plane_normal.normalize(); - - LLVector3d focus_pt_global; - gViewerWindow->mousePointOnPlaneGlobal(focus_pt_global, x, y, gAgent.getPosGlobalFromAgent(obj_pos), focus_plane_normal); - LLVector3 focus_pt = gAgent.getPosAgentFromGlobal(focus_pt_global); - - // find vector from camera to focus point in object space - LLVector3 camera_to_focus_vec = focus_pt - LLViewerCamera::getInstance()->getOrigin(); - camera_to_focus_vec.rotVec(inv_obj_rot); - - // find vector from object origin to focus point in object coordinates - LLVector3 focus_offset_from_object_center = focus_pt - obj_pos; - // convert to object-local space - focus_offset_from_object_center.rotVec(inv_obj_rot); - - // We need to project the focus point back into the bounding box of the focused object. - // Do this by calculating the XYZ scale factors needed to get focus offset back in bounds along the camera_focus axis - LLVector3 clip_fraction; - - // for each axis... - for (U32 axis = VX; axis <= VZ; axis++) - { - //...calculate distance that focus offset sits outside of bounding box along that axis... - //NOTE: dist_out_of_bounds keeps the sign of focus_offset_from_object_center - F32 dist_out_of_bounds; - if (focus_offset_from_object_center.mV[axis] > 0.f) - { - dist_out_of_bounds = llmax(0.f, focus_offset_from_object_center.mV[axis] - (object_extents.mV[axis] * 0.5f)); - } - else - { - dist_out_of_bounds = llmin(0.f, focus_offset_from_object_center.mV[axis] + (object_extents.mV[axis] * 0.5f)); - } - - //...then calculate the scale factor needed to push camera_to_focus_vec back in bounds along current axis - if (llabs(camera_to_focus_vec.mV[axis]) < 0.0001f) - { - // don't divide by very small number - clip_fraction.mV[axis] = 0.f; - } - else - { - clip_fraction.mV[axis] = dist_out_of_bounds / camera_to_focus_vec.mV[axis]; - } - } - - LLVector3 abs_clip_fraction = clip_fraction; - abs_clip_fraction.abs(); - - // find axis of focus offset that is *most* outside the bounding box and use that to - // rescale focus offset to inside object extents - if (abs_clip_fraction.mV[VX] > abs_clip_fraction.mV[VY] - && abs_clip_fraction.mV[VX] > abs_clip_fraction.mV[VZ]) - { - focus_offset_from_object_center -= clip_fraction.mV[VX] * camera_to_focus_vec; - } - else if (abs_clip_fraction.mV[VY] > abs_clip_fraction.mV[VZ]) - { - focus_offset_from_object_center -= clip_fraction.mV[VY] * camera_to_focus_vec; - } - else - { - focus_offset_from_object_center -= clip_fraction.mV[VZ] * camera_to_focus_vec; - } - - // convert back to world space - focus_offset_from_object_center.rotVec(obj_rot); - - // now, based on distance of camera from object relative to object size - // push the focus point towards the near surface of the object when (relatively) close to the objcet - // or keep the focus point in the object middle when (relatively) far - // NOTE: leave focus point in middle of avatars, since the behavior you want when alt-zooming on avatars - // is almost always "tumble about middle" and not "spin around surface point" - if (!is_avatar) - { - LLVector3 obj_rel = original_focus_point - object->getRenderPosition(); - - //now that we have the object relative position, we should bias toward the center of the object - //based on the distance of the camera to the focus point vs. the distance of the camera to the focus - - F32 relDist = llabs(obj_rel * LLViewerCamera::getInstance()->getAtAxis()); - F32 viewDist = dist_vec(obj_pos + obj_rel, LLViewerCamera::getInstance()->getOrigin()); - - - LLBBox obj_bbox = object->getBoundingBoxAgent(); - F32 bias = 0.f; - - // virtual_camera_pos is the camera position we are simulating by backing the camera off - // and adjusting the FOV - LLVector3 virtual_camera_pos = gAgent.getPosAgentFromGlobal(mFocusTargetGlobal + (getCameraPositionGlobal() - mFocusTargetGlobal) / (1.f + mCameraFOVZoomFactor)); - - // if the camera is inside the object (large, hollow objects, for example) - // leave focus point all the way to destination depth, away from object center - if(!obj_bbox.containsPointAgent(virtual_camera_pos)) - { - // perform magic number biasing of focus point towards surface vs. planar center - bias = clamp_rescale(relDist/viewDist, 0.1f, 0.7f, 0.0f, 1.0f); - obj_rel = lerp(focus_offset_from_object_center, obj_rel, bias); - } - - focus_offset_from_object_center = obj_rel; - } - - return focus_offset_from_object_center; -} - -//----------------------------------------------------------------------------- -// calcCameraMinDistance() -//----------------------------------------------------------------------------- -BOOL LLAgent::calcCameraMinDistance(F32 &obj_min_distance) -{ - BOOL soft_limit = FALSE; // is the bounding box to be treated literally (volumes) or as an approximation (avatars) - - if (!mFocusObject || mFocusObject->isDead()) - { - obj_min_distance = 0.f; - return TRUE; - } - - if (mFocusObject->mDrawable.isNull()) - { -#ifdef LL_RELEASE_FOR_DOWNLOAD - llwarns << "Focus object with no drawable!" << llendl; -#else - mFocusObject->dump(); - llerrs << "Focus object with no drawable!" << llendl; -#endif - obj_min_distance = 0.f; - return TRUE; - } - - LLQuaternion inv_object_rot = ~mFocusObject->getRenderRotation(); - LLVector3 target_offset_origin = mFocusObjectOffset; - LLVector3 camera_offset_target(getCameraPositionAgent() - getPosAgentFromGlobal(mFocusTargetGlobal)); - - // convert offsets into object local space - camera_offset_target.rotVec(inv_object_rot); - target_offset_origin.rotVec(inv_object_rot); - - // push around object extents based on target offset - LLVector3 object_extents = mFocusObject->getScale(); - if (mFocusObject->isAvatar()) - { - // fudge factors that lets you zoom in on avatars a bit more (which don't do FOV zoom) - object_extents.mV[VX] *= AVATAR_ZOOM_MIN_X_FACTOR; - object_extents.mV[VY] *= AVATAR_ZOOM_MIN_Y_FACTOR; - object_extents.mV[VZ] *= AVATAR_ZOOM_MIN_Z_FACTOR; - soft_limit = TRUE; - } - LLVector3 abs_target_offset = target_offset_origin; - abs_target_offset.abs(); - - LLVector3 target_offset_dir = target_offset_origin; - F32 object_radius = mFocusObject->getVObjRadius(); - - BOOL target_outside_object_extents = FALSE; - - for (U32 i = VX; i <= VZ; i++) - { - if (abs_target_offset.mV[i] * 2.f > object_extents.mV[i] + OBJECT_EXTENTS_PADDING) - { - target_outside_object_extents = TRUE; - } - if (camera_offset_target.mV[i] > 0.f) - { - object_extents.mV[i] -= target_offset_origin.mV[i] * 2.f; - } - else - { - object_extents.mV[i] += target_offset_origin.mV[i] * 2.f; - } - } - - // don't shrink the object extents so far that the object inverts - object_extents.clamp(0.001f, F32_MAX); - - // move into first octant - LLVector3 camera_offset_target_abs_norm = camera_offset_target; - camera_offset_target_abs_norm.abs(); - // make sure offset is non-zero - camera_offset_target_abs_norm.clamp(0.001f, F32_MAX); - camera_offset_target_abs_norm.normalize(); - - // find camera position relative to normalized object extents - LLVector3 camera_offset_target_scaled = camera_offset_target_abs_norm; - camera_offset_target_scaled.mV[VX] /= object_extents.mV[VX]; - camera_offset_target_scaled.mV[VY] /= object_extents.mV[VY]; - camera_offset_target_scaled.mV[VZ] /= object_extents.mV[VZ]; - - if (camera_offset_target_scaled.mV[VX] > camera_offset_target_scaled.mV[VY] && - camera_offset_target_scaled.mV[VX] > camera_offset_target_scaled.mV[VZ]) - { - if (camera_offset_target_abs_norm.mV[VX] < 0.001f) - { - obj_min_distance = object_extents.mV[VX] * 0.5f; - } - else - { - obj_min_distance = object_extents.mV[VX] * 0.5f / camera_offset_target_abs_norm.mV[VX]; - } - } - else if (camera_offset_target_scaled.mV[VY] > camera_offset_target_scaled.mV[VZ]) - { - if (camera_offset_target_abs_norm.mV[VY] < 0.001f) - { - obj_min_distance = object_extents.mV[VY] * 0.5f; - } - else - { - obj_min_distance = object_extents.mV[VY] * 0.5f / camera_offset_target_abs_norm.mV[VY]; - } - } - else - { - if (camera_offset_target_abs_norm.mV[VZ] < 0.001f) - { - obj_min_distance = object_extents.mV[VZ] * 0.5f; - } - else - { - obj_min_distance = object_extents.mV[VZ] * 0.5f / camera_offset_target_abs_norm.mV[VZ]; - } - } - - LLVector3 object_split_axis; - LLVector3 target_offset_scaled = target_offset_origin; - target_offset_scaled.abs(); - target_offset_scaled.normalize(); - target_offset_scaled.mV[VX] /= object_extents.mV[VX]; - target_offset_scaled.mV[VY] /= object_extents.mV[VY]; - target_offset_scaled.mV[VZ] /= object_extents.mV[VZ]; - - if (target_offset_scaled.mV[VX] > target_offset_scaled.mV[VY] && - target_offset_scaled.mV[VX] > target_offset_scaled.mV[VZ]) - { - object_split_axis = LLVector3::x_axis; - } - else if (target_offset_scaled.mV[VY] > target_offset_scaled.mV[VZ]) - { - object_split_axis = LLVector3::y_axis; - } - else - { - object_split_axis = LLVector3::z_axis; - } - - LLVector3 camera_offset_object(getCameraPositionAgent() - mFocusObject->getPositionAgent()); - - // length projected orthogonal to target offset - F32 camera_offset_dist = (camera_offset_object - target_offset_dir * (camera_offset_object * target_offset_dir)).magVec(); - - // calculate whether the target point would be "visible" if it were outside the bounding box - // on the opposite of the splitting plane defined by object_split_axis; - BOOL exterior_target_visible = FALSE; - if (camera_offset_dist > object_radius) - { - // target is visible from camera, so turn off fov zoom - exterior_target_visible = TRUE; - } - - F32 camera_offset_clip = camera_offset_object * object_split_axis; - F32 target_offset_clip = target_offset_dir * object_split_axis; - - // target has moved outside of object extents - // check to see if camera and target are on same side - if (target_outside_object_extents) - { - if (camera_offset_clip > 0.f && target_offset_clip > 0.f) - { - return FALSE; - } - else if (camera_offset_clip < 0.f && target_offset_clip < 0.f) - { - return FALSE; - } - } - - // clamp obj distance to diagonal of 10 by 10 cube - obj_min_distance = llmin(obj_min_distance, 10.f * F_SQRT3); - - obj_min_distance += LLViewerCamera::getInstance()->getNear() + (soft_limit ? 0.1f : 0.2f); - - return TRUE; -} - -F32 LLAgent::getCameraZoomFraction() -{ - // 0.f -> camera zoomed all the way out - // 1.f -> camera zoomed all the way in - LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection(); - if (selection->getObjectCount() && selection->getSelectType() == SELECT_TYPE_HUD) - { - // already [0,1] - return mHUDTargetZoom; - } - else if (mFocusOnAvatar && cameraThirdPerson()) - { - return clamp_rescale(mCameraZoomFraction, MIN_ZOOM_FRACTION, MAX_ZOOM_FRACTION, 1.f, 0.f); - } - else if (cameraCustomizeAvatar()) - { - F32 distance = (F32)mCameraFocusOffsetTarget.magVec(); - return clamp_rescale(distance, APPEARANCE_MIN_ZOOM, APPEARANCE_MAX_ZOOM, 1.f, 0.f ); - } - else - { - F32 min_zoom; - const F32 DIST_FUDGE = 16.f; // meters - F32 max_zoom = llmin(mDrawDistance - DIST_FUDGE, - LLWorld::getInstance()->getRegionWidthInMeters() - DIST_FUDGE, - MAX_CAMERA_DISTANCE_FROM_AGENT); - - F32 distance = (F32)mCameraFocusOffsetTarget.magVec(); - if (mFocusObject.notNull()) - { - if (mFocusObject->isAvatar()) - { - min_zoom = AVATAR_MIN_ZOOM; - } - else - { - min_zoom = OBJECT_MIN_ZOOM; - } - } - else - { - min_zoom = LAND_MIN_ZOOM; - } - - return clamp_rescale(distance, min_zoom, max_zoom, 1.f, 0.f); - } -} - -void LLAgent::setCameraZoomFraction(F32 fraction) -{ - // 0.f -> camera zoomed all the way out - // 1.f -> camera zoomed all the way in - LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection(); - - if (selection->getObjectCount() && selection->getSelectType() == SELECT_TYPE_HUD) - { - mHUDTargetZoom = fraction; - } - else if (mFocusOnAvatar && cameraThirdPerson()) - { - mCameraZoomFraction = rescale(fraction, 0.f, 1.f, MAX_ZOOM_FRACTION, MIN_ZOOM_FRACTION); - } - else if (cameraCustomizeAvatar()) - { - LLVector3d camera_offset_dir = mCameraFocusOffsetTarget; - camera_offset_dir.normalize(); - mCameraFocusOffsetTarget = camera_offset_dir * rescale(fraction, 0.f, 1.f, APPEARANCE_MAX_ZOOM, APPEARANCE_MIN_ZOOM); - } - else - { - F32 min_zoom = LAND_MIN_ZOOM; - const F32 DIST_FUDGE = 16.f; // meters - F32 max_zoom = llmin(mDrawDistance - DIST_FUDGE, - LLWorld::getInstance()->getRegionWidthInMeters() - DIST_FUDGE, - MAX_CAMERA_DISTANCE_FROM_AGENT); - - if (mFocusObject.notNull()) - { - if (mFocusObject.notNull()) - { - if (mFocusObject->isAvatar()) - { - min_zoom = AVATAR_MIN_ZOOM; - } - else - { - min_zoom = OBJECT_MIN_ZOOM; - } - } - } - - LLVector3d camera_offset_dir = mCameraFocusOffsetTarget; - camera_offset_dir.normalize(); - mCameraFocusOffsetTarget = camera_offset_dir * rescale(fraction, 0.f, 1.f, max_zoom, min_zoom); - } - startCameraAnimation(); -} - - -//----------------------------------------------------------------------------- -// cameraOrbitAround() -//----------------------------------------------------------------------------- -void LLAgent::cameraOrbitAround(const F32 radians) -{ - LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection(); - if (selection->getObjectCount() && selection->getSelectType() == SELECT_TYPE_HUD) - { - // do nothing for hud selection - } - else if (mFocusOnAvatar && (mCameraMode == CAMERA_MODE_THIRD_PERSON || mCameraMode == CAMERA_MODE_FOLLOW)) - { - mFrameAgent.rotate(radians, getReferenceUpVector()); - } - else - { - mCameraFocusOffsetTarget.rotVec(radians, 0.f, 0.f, 1.f); - - cameraZoomIn(1.f); - } -} - - -//----------------------------------------------------------------------------- -// cameraOrbitOver() -//----------------------------------------------------------------------------- -void LLAgent::cameraOrbitOver(const F32 angle) -{ - LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection(); - if (selection->getObjectCount() && selection->getSelectType() == SELECT_TYPE_HUD) - { - // do nothing for hud selection - } - else if (mFocusOnAvatar && mCameraMode == CAMERA_MODE_THIRD_PERSON) - { - pitch(angle); - } - else - { - LLVector3 camera_offset_unit(mCameraFocusOffsetTarget); - camera_offset_unit.normalize(); - - F32 angle_from_up = acos( camera_offset_unit * getReferenceUpVector() ); - - LLVector3d left_axis; - left_axis.setVec(LLViewerCamera::getInstance()->getLeftAxis()); - F32 new_angle = llclamp(angle_from_up - angle, 1.f * DEG_TO_RAD, 179.f * DEG_TO_RAD); - mCameraFocusOffsetTarget.rotVec(angle_from_up - new_angle, left_axis); - - cameraZoomIn(1.f); - } -} - -//----------------------------------------------------------------------------- -// cameraZoomIn() -//----------------------------------------------------------------------------- -void LLAgent::cameraZoomIn(const F32 fraction) -{ - if (gDisconnected) - { - return; - } - - LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection(); - if (selection->getObjectCount() && selection->getSelectType() == SELECT_TYPE_HUD) - { - // just update hud zoom level - mHUDTargetZoom /= fraction; - return; - } - - - LLVector3d camera_offset(mCameraFocusOffsetTarget); - LLVector3d camera_offset_unit(mCameraFocusOffsetTarget); - F32 min_zoom = LAND_MIN_ZOOM; - F32 current_distance = (F32)camera_offset_unit.normalize(); - F32 new_distance = current_distance * fraction; - - // Don't move through focus point - if (mFocusObject) - { - LLVector3 camera_offset_dir((F32)camera_offset_unit.mdV[VX], (F32)camera_offset_unit.mdV[VY], (F32)camera_offset_unit.mdV[VZ]); - - if (mFocusObject->isAvatar()) - { - calcCameraMinDistance(min_zoom); - } - else - { - min_zoom = OBJECT_MIN_ZOOM; - } - } - - new_distance = llmax(new_distance, min_zoom); - - // Don't zoom too far back - const F32 DIST_FUDGE = 16.f; // meters - F32 max_distance = llmin(mDrawDistance - DIST_FUDGE, - LLWorld::getInstance()->getRegionWidthInMeters() - DIST_FUDGE ); - - if (new_distance > max_distance) - { - new_distance = max_distance; - - /* - // Unless camera is unlocked - if (!LLViewerCamera::sDisableCameraConstraints) - { - return; - } - */ - } - - if( cameraCustomizeAvatar() ) - { - new_distance = llclamp( new_distance, APPEARANCE_MIN_ZOOM, APPEARANCE_MAX_ZOOM ); - } - - mCameraFocusOffsetTarget = new_distance * camera_offset_unit; -} - -//----------------------------------------------------------------------------- -// cameraOrbitIn() -//----------------------------------------------------------------------------- -void LLAgent::cameraOrbitIn(const F32 meters) -{ - if (mFocusOnAvatar && mCameraMode == CAMERA_MODE_THIRD_PERSON) - { - F32 camera_offset_dist = llmax(0.001f, getCameraOffsetInitial().magVec() * gSavedSettings.getF32("CameraOffsetScale")); - - mCameraZoomFraction = (mTargetCameraDistance - meters) / camera_offset_dist; - - if (!gSavedSettings.getBOOL("FreezeTime") && mCameraZoomFraction < MIN_ZOOM_FRACTION && meters > 0.f) - { - // No need to animate, camera is already there. - changeCameraToMouselook(FALSE); - } - - mCameraZoomFraction = llclamp(mCameraZoomFraction, MIN_ZOOM_FRACTION, MAX_ZOOM_FRACTION); - } - else - { - LLVector3d camera_offset(mCameraFocusOffsetTarget); - LLVector3d camera_offset_unit(mCameraFocusOffsetTarget); - F32 current_distance = (F32)camera_offset_unit.normalize(); - F32 new_distance = current_distance - meters; - F32 min_zoom = LAND_MIN_ZOOM; - - // Don't move through focus point - if (mFocusObject.notNull()) - { - if (mFocusObject->isAvatar()) - { - min_zoom = AVATAR_MIN_ZOOM; - } - else - { - min_zoom = OBJECT_MIN_ZOOM; - } - } - - new_distance = llmax(new_distance, min_zoom); - - // Don't zoom too far back - const F32 DIST_FUDGE = 16.f; // meters - F32 max_distance = llmin(mDrawDistance - DIST_FUDGE, - LLWorld::getInstance()->getRegionWidthInMeters() - DIST_FUDGE ); - - if (new_distance > max_distance) - { - // Unless camera is unlocked - if (!gSavedSettings.getBOOL("DisableCameraConstraints")) - { - return; - } - } - - if( CAMERA_MODE_CUSTOMIZE_AVATAR == getCameraMode() ) - { - new_distance = llclamp( new_distance, APPEARANCE_MIN_ZOOM, APPEARANCE_MAX_ZOOM ); - } - - // Compute new camera offset - mCameraFocusOffsetTarget = new_distance * camera_offset_unit; - cameraZoomIn(1.f); - } -} - - -//----------------------------------------------------------------------------- -// cameraPanIn() -//----------------------------------------------------------------------------- -void LLAgent::cameraPanIn(F32 meters) -{ - LLVector3d at_axis; - at_axis.setVec(LLViewerCamera::getInstance()->getAtAxis()); - - mFocusTargetGlobal += meters * at_axis; - mFocusGlobal = mFocusTargetGlobal; - // don't enforce zoom constraints as this is the only way for users to get past them easily - updateFocusOffset(); - // NOTE: panning movements expect the camera to move exactly with the focus target, not animated behind -Nyx - mCameraSmoothingLastPositionGlobal = calcCameraPositionTargetGlobal(); -} - -//----------------------------------------------------------------------------- -// cameraPanLeft() -//----------------------------------------------------------------------------- -void LLAgent::cameraPanLeft(F32 meters) -{ - LLVector3d left_axis; - left_axis.setVec(LLViewerCamera::getInstance()->getLeftAxis()); - - mFocusTargetGlobal += meters * left_axis; - mFocusGlobal = mFocusTargetGlobal; - - // disable smoothing for camera pan, which causes some residents unhappiness - mCameraSmoothingStop = TRUE; - - cameraZoomIn(1.f); - updateFocusOffset(); - // NOTE: panning movements expect the camera to move exactly with the focus target, not animated behind - Nyx - mCameraSmoothingLastPositionGlobal = calcCameraPositionTargetGlobal(); -} - -//----------------------------------------------------------------------------- -// cameraPanUp() -//----------------------------------------------------------------------------- -void LLAgent::cameraPanUp(F32 meters) -{ - LLVector3d up_axis; - up_axis.setVec(LLViewerCamera::getInstance()->getUpAxis()); - - mFocusTargetGlobal += meters * up_axis; - mFocusGlobal = mFocusTargetGlobal; - - // disable smoothing for camera pan, which causes some residents unhappiness - mCameraSmoothingStop = TRUE; - - cameraZoomIn(1.f); - updateFocusOffset(); - // NOTE: panning movements expect the camera to move exactly with the focus target, not animated behind -Nyx - mCameraSmoothingLastPositionGlobal = calcCameraPositionTargetGlobal(); -} - -//----------------------------------------------------------------------------- -// setKey() -//----------------------------------------------------------------------------- -void LLAgent::setKey(const S32 direction, S32 &key) -{ - if (direction > 0) - { - key = 1; - } - else if (direction < 0) - { - key = -1; - } - else - { - key = 0; - } -} - - //----------------------------------------------------------------------------- // getControlFlags() //----------------------------------------------------------------------------- U32 LLAgent::getControlFlags() { -/* - // HACK -- avoids maintenance of control flags when camera mode is turned on or off, - // only worries about it when the flags are measured - if (mCameraMode == CAMERA_MODE_MOUSELOOK) - { - if ( !(mControlFlags & AGENT_CONTROL_MOUSELOOK) ) - { - mControlFlags |= AGENT_CONTROL_MOUSELOOK; - } - } -*/ return mControlFlags; } @@ -2116,10 +1117,9 @@ void LLAgent::clearAFK() // Gods can sometimes get into away state (via gestures) // without setting the appropriate control flag. JC - LLVOAvatar* av = mAvatarObject; if (mControlFlags & AGENT_CONTROL_AWAY - || (av - && (av->mSignaledAnimations.find(ANIM_AGENT_AWAY) != av->mSignaledAnimations.end()))) + || (isAgentAvatarValid() + && (gAgentAvatarp->mSignaledAnimations.find(ANIM_AGENT_AWAY) != gAgentAvatarp->mSignaledAnimations.end()))) { sendAnimationRequest(ANIM_AGENT_AWAY, ANIM_REQUEST_STOP); clearControlFlags(AGENT_CONTROL_AWAY); @@ -2180,7 +1180,7 @@ BOOL LLAgent::getBusy() const //----------------------------------------------------------------------------- void LLAgent::startAutoPilotGlobal(const LLVector3d &target_global, const std::string& behavior_name, const LLQuaternion *target_rotation, void (*finish_callback)(BOOL, void *), void *callback_data, F32 stop_distance, F32 rot_threshold) { - if (!gAgent.getAvatarObject()) + if (!isAgentAvatarValid()) { return; } @@ -2226,7 +1226,10 @@ void LLAgent::startAutoPilotGlobal(const LLVector3d &target_global, const std::s if ( distance > 1.f && heightDelta > (sqrtf(mAutoPilotStopDistance) + 1.f)) { setFlying(TRUE); - mAutoPilotFlyOnStop = TRUE; + // Do not force flying for "Sit" behavior to prevent flying after pressing "Stand" + // from an object. See EXT-1655. + if ("Sit" != mAutoPilotBehaviorName) + mAutoPilotFlyOnStop = TRUE; } mAutoPilot = TRUE; @@ -2241,7 +1244,7 @@ void LLAgent::startAutoPilotGlobal(const LLVector3d &target_global, const std::s LLViewerObject *obj; LLWorld::getInstance()->resolveStepHeightGlobal(NULL, target_global, traceEndPt, targetOnGround, groundNorm, &obj); - F64 target_height = llmax((F64)gAgent.getAvatarObject()->getPelvisToFoot(), target_global.mdV[VZ] - targetOnGround.mdV[VZ]); + F64 target_height = llmax((F64)gAgentAvatarp->getPelvisToFoot(), target_global.mdV[VZ] - targetOnGround.mdV[VZ]); // clamp z value of target to minimum height above ground mAutoPilotTargetGlobal.mdV[VZ] = targetOnGround.mdV[VZ] + target_height; @@ -2295,6 +1298,13 @@ void LLAgent::stopAutoPilot(BOOL user_cancel) { resetAxes(mAutoPilotTargetFacing); } + // Restore previous flying state before invoking mAutoPilotFinishedCallback to allow + // callback function to change the flying state (like in near_sit_down_point()). + // If the user cancelled, don't change the fly state + if (!user_cancel) + { + setFlying(mAutoPilotFlyOnStop); + } //NB: auto pilot can terminate for a reason other than reaching the destination if (mAutoPilotFinishedCallback) { @@ -2302,11 +1312,6 @@ void LLAgent::stopAutoPilot(BOOL user_cancel) } mLeaderID = LLUUID::null; - // If the user cancelled, don't change the fly state - if (!user_cancel) - { - setFlying(mAutoPilotFlyOnStop); - } setControlFlags(AGENT_CONTROL_STOP); if (user_cancel && !mAutoPilotBehaviorName.empty()) @@ -2341,12 +1346,9 @@ void LLAgent::autoPilot(F32 *delta_yaw) mAutoPilotTargetGlobal = object->getPositionGlobal(); } - if (mAvatarObject.isNull()) - { - return; - } + if (!isAgentAvatarValid()) return; - if (mAvatarObject->mInAir) + if (gAgentAvatarp->mInAir) { setFlying(TRUE); } @@ -2422,9 +1424,9 @@ void LLAgent::autoPilot(F32 *delta_yaw) // If we're flying, handle autopilot points above or below you. if (getFlying() && xy_distance < AUTOPILOT_HEIGHT_ADJUST_DISTANCE) { - if (mAvatarObject.notNull()) + if (isAgentAvatarValid()) { - F64 current_height = mAvatarObject->getPositionGlobal().mdV[VZ]; + F64 current_height = gAgentAvatarp->getPositionGlobal().mdV[VZ]; F32 delta_z = (F32)(mAutoPilotTargetGlobal.mdV[VZ] - current_height); F32 slope = delta_z / xy_distance; if (slope > 0.45f && delta_z > 6.f) @@ -2489,30 +1491,32 @@ void LLAgent::propagate(const F32 dt) LLFloaterMove *floater_move = LLFloaterReg::findTypedInstance<LLFloaterMove>("moveview"); if (floater_move) { - floater_move->mForwardButton ->setToggleState( mAtKey > 0 || mWalkKey > 0 ); - floater_move->mBackwardButton ->setToggleState( mAtKey < 0 || mWalkKey < 0 ); - floater_move->mTurnLeftButton ->setToggleState( mYawKey > 0.f ); - floater_move->mTurnRightButton ->setToggleState( mYawKey < 0.f ); - floater_move->mMoveUpButton ->setToggleState( mUpKey > 0 ); - floater_move->mMoveDownButton ->setToggleState( mUpKey < 0 ); + floater_move->mForwardButton ->setToggleState( gAgentCamera.getAtKey() > 0 || gAgentCamera.getWalkKey() > 0 ); + floater_move->mBackwardButton ->setToggleState( gAgentCamera.getAtKey() < 0 || gAgentCamera.getWalkKey() < 0 ); + floater_move->mTurnLeftButton ->setToggleState( gAgentCamera.getYawKey() > 0.f ); + floater_move->mTurnRightButton ->setToggleState( gAgentCamera.getYawKey() < 0.f ); + floater_move->mSlideLeftButton ->setToggleState( gAgentCamera.getLeftKey() > 0.f ); + floater_move->mSlideRightButton ->setToggleState( gAgentCamera.getLeftKey() < 0.f ); + floater_move->mMoveUpButton ->setToggleState( gAgentCamera.getUpKey() > 0 ); + floater_move->mMoveDownButton ->setToggleState( gAgentCamera.getUpKey() < 0 ); } // handle rotation based on keyboard levels const F32 YAW_RATE = 90.f * DEG_TO_RAD; // radians per second - yaw(YAW_RATE * mYawKey * dt); + yaw(YAW_RATE * gAgentCamera.getYawKey() * dt); const F32 PITCH_RATE = 90.f * DEG_TO_RAD; // radians per second - pitch(PITCH_RATE * mPitchKey * dt); + pitch(PITCH_RATE * gAgentCamera.getPitchKey() * dt); // handle auto-land behavior - if (mAvatarObject.notNull()) + if (isAgentAvatarValid()) { - BOOL in_air = mAvatarObject->mInAir; + BOOL in_air = gAgentAvatarp->mInAir; LLVector3 land_vel = getVelocity(); land_vel.mV[VZ] = 0.f; if (!in_air - && mUpKey < 0 + && gAgentCamera.getUpKey() < 0 && land_vel.magVecSquared() < MAX_VELOCITY_AUTO_LAND_SQUARED && gSavedSettings.getBOOL("AutomaticFly")) { @@ -2521,13 +1525,7 @@ void LLAgent::propagate(const F32 dt) } } - // clear keys - mAtKey = 0; - mWalkKey = 0; - mLeftKey = 0; - mUpKey = 0; - mYawKey = 0.f; - mPitchKey = 0.f; + gAgentCamera.clearGeneralKeys(); } //----------------------------------------------------------------------------- @@ -2545,79 +1543,7 @@ void LLAgent::updateAgentPosition(const F32 dt, const F32 yaw_radians, const S32 // Check for water and land collision, set underwater flag // - updateLookAt(mouse_x, mouse_y); -} - -//----------------------------------------------------------------------------- -// updateLookAt() -//----------------------------------------------------------------------------- -void LLAgent::updateLookAt(const S32 mouse_x, const S32 mouse_y) -{ - static LLVector3 last_at_axis; - - - if (mAvatarObject.isNull()) - { - return; - } - - LLQuaternion av_inv_rot = ~mAvatarObject->mRoot.getWorldRotation(); - LLVector3 root_at = LLVector3::x_axis * mAvatarObject->mRoot.getWorldRotation(); - - if ((gViewerWindow->getMouseVelocityStat()->getCurrent() < 0.01f) && - (root_at * last_at_axis > 0.95f )) - { - LLVector3 vel = mAvatarObject->getVelocity(); - if (vel.magVecSquared() > 4.f) - { - setLookAt(LOOKAT_TARGET_IDLE, mAvatarObject, vel * av_inv_rot); - } - else - { - // *FIX: rotate mframeagent by sit object's rotation? - LLQuaternion look_rotation = mAvatarObject->isSitting() ? mAvatarObject->getRenderRotation() : mFrameAgent.getQuaternion(); // use camera's current rotation - LLVector3 look_offset = LLVector3(2.f, 0.f, 0.f) * look_rotation * av_inv_rot; - setLookAt(LOOKAT_TARGET_IDLE, mAvatarObject, look_offset); - } - last_at_axis = root_at; - return; - } - - last_at_axis = root_at; - - if (CAMERA_MODE_CUSTOMIZE_AVATAR == getCameraMode()) - { - setLookAt(LOOKAT_TARGET_NONE, mAvatarObject, LLVector3(-2.f, 0.f, 0.f)); - } - else - { - // Move head based on cursor position - ELookAtType lookAtType = LOOKAT_TARGET_NONE; - LLVector3 headLookAxis; - LLCoordFrame frameCamera = *((LLCoordFrame*)LLViewerCamera::getInstance()); - - if (cameraMouselook()) - { - lookAtType = LOOKAT_TARGET_MOUSELOOK; - } - else if (cameraThirdPerson()) - { - // range from -.5 to .5 - F32 x_from_center = - ((F32) mouse_x / (F32) gViewerWindow->getWindowWidthScaled() ) - 0.5f; - F32 y_from_center = - ((F32) mouse_y / (F32) gViewerWindow->getWindowHeightScaled() ) - 0.5f; - - frameCamera.yaw( - x_from_center * gSavedSettings.getF32("YawFromMousePosition") * DEG_TO_RAD); - frameCamera.pitch( - y_from_center * gSavedSettings.getF32("PitchFromMousePosition") * DEG_TO_RAD); - lookAtType = LOOKAT_TARGET_FREELOOK; - } - - headLookAxis = frameCamera.getAtAxis(); - // RN: we use world-space offset for mouselook and freelook - //headLookAxis = headLookAxis * av_inv_rot; - setLookAt(lookAtType, mAvatarObject, headLookAxis); - } + gAgentCamera.updateLookAt(mouse_x, mouse_y); } // friends and operators @@ -2632,44 +1558,6 @@ std::ostream& operator<<(std::ostream &s, const LLAgent &agent) return s; } - -// ------------------- Beginning of legacy LLCamera hack ---------------------- -// This section is included for legacy LLCamera support until -// it is no longer needed. Some legacy code must exist in -// non-legacy functions, and is labeled with "// legacy" comments. - -//----------------------------------------------------------------------------- -// setAvatarObject() -//----------------------------------------------------------------------------- -void LLAgent::setAvatarObject(LLVOAvatarSelf *avatar) -{ - mAvatarObject = avatar; - - if (!avatar) - { - llinfos << "Setting LLAgent::mAvatarObject to NULL" << llendl; - return; - } - - if (!mLookAt) - { - mLookAt = (LLHUDEffectLookAt *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_LOOKAT); - } - if (!mPointAt) - { - mPointAt = (LLHUDEffectPointAt *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_POINTAT); - } - - if (!mLookAt.isNull()) - { - mLookAt->setSourceObject(avatar); - } - if (!mPointAt.isNull()) - { - mPointAt->setSourceObject(avatar); - } -} - // TRUE if your own avatar needs to be rendered. Usually only // in third person and build. //----------------------------------------------------------------------------- @@ -2677,7 +1565,7 @@ void LLAgent::setAvatarObject(LLVOAvatarSelf *avatar) //----------------------------------------------------------------------------- BOOL LLAgent::needsRenderAvatar() { - if (cameraMouselook() && !LLVOAvatar::sVisibleInFirstPerson) + if (gAgentCamera.cameraMouselook() && !LLVOAvatar::sVisibleInFirstPerson) { return FALSE; } @@ -2688,7 +1576,7 @@ BOOL LLAgent::needsRenderAvatar() // TRUE if we need to render your own avatar's head. BOOL LLAgent::needsRenderHead() { - return (LLVOAvatar::sVisibleInFirstPerson && LLPipeline::sReflectionRender) || (mShowAvatar && !cameraMouselook()); + return (LLVOAvatar::sVisibleInFirstPerson && LLPipeline::sReflectionRender) || (mShowAvatar && !gAgentCamera.cameraMouselook()); } //----------------------------------------------------------------------------- @@ -2710,7 +1598,7 @@ void LLAgent::startTyping() LLViewerObject* chatter = gObjectList.findObject(mLastChatterID); if (chatter && chatter->isAvatar()) { - gAgent.setLookAt(LOOKAT_TARGET_RESPOND, chatter, LLVector3::zero); + gAgentCamera.setLookAt(LOOKAT_TARGET_RESPOND, chatter, LLVector3::zero); } } @@ -2789,14 +1677,14 @@ U8 LLAgent::getRenderState() //----------------------------------------------------------------------------- void LLAgent::endAnimationUpdateUI() { - if (mCameraMode == mLastCameraMode) + if (gAgentCamera.getCameraMode() == gAgentCamera.getLastCameraMode()) { // We're already done endAnimationUpdateUI for this transition. return; } // clean up UI from mode we're leaving - if ( mLastCameraMode == CAMERA_MODE_MOUSELOOK ) + if (gAgentCamera.getLastCameraMode() == CAMERA_MODE_MOUSELOOK ) { // show mouse cursor gViewerWindow->showCursor(); @@ -2834,33 +1722,33 @@ void LLAgent::endAnimationUpdateUI() } - gAgent.setLookAt(LOOKAT_TARGET_CLEAR); + gAgentCamera.setLookAt(LOOKAT_TARGET_CLEAR); if( gMorphView ) { gMorphView->setVisible( FALSE ); } // Disable mouselook-specific animations - if (mAvatarObject.notNull()) + if (isAgentAvatarValid()) { - if( mAvatarObject->isAnyAnimationSignaled(AGENT_GUN_AIM_ANIMS, NUM_AGENT_GUN_AIM_ANIMS) ) + if( gAgentAvatarp->isAnyAnimationSignaled(AGENT_GUN_AIM_ANIMS, NUM_AGENT_GUN_AIM_ANIMS) ) { - if (mAvatarObject->mSignaledAnimations.find(ANIM_AGENT_AIM_RIFLE_R) != mAvatarObject->mSignaledAnimations.end()) + if (gAgentAvatarp->mSignaledAnimations.find(ANIM_AGENT_AIM_RIFLE_R) != gAgentAvatarp->mSignaledAnimations.end()) { sendAnimationRequest(ANIM_AGENT_AIM_RIFLE_R, ANIM_REQUEST_STOP); sendAnimationRequest(ANIM_AGENT_HOLD_RIFLE_R, ANIM_REQUEST_START); } - if (mAvatarObject->mSignaledAnimations.find(ANIM_AGENT_AIM_HANDGUN_R) != mAvatarObject->mSignaledAnimations.end()) + if (gAgentAvatarp->mSignaledAnimations.find(ANIM_AGENT_AIM_HANDGUN_R) != gAgentAvatarp->mSignaledAnimations.end()) { sendAnimationRequest(ANIM_AGENT_AIM_HANDGUN_R, ANIM_REQUEST_STOP); sendAnimationRequest(ANIM_AGENT_HOLD_HANDGUN_R, ANIM_REQUEST_START); } - if (mAvatarObject->mSignaledAnimations.find(ANIM_AGENT_AIM_BAZOOKA_R) != mAvatarObject->mSignaledAnimations.end()) + if (gAgentAvatarp->mSignaledAnimations.find(ANIM_AGENT_AIM_BAZOOKA_R) != gAgentAvatarp->mSignaledAnimations.end()) { sendAnimationRequest(ANIM_AGENT_AIM_BAZOOKA_R, ANIM_REQUEST_STOP); sendAnimationRequest(ANIM_AGENT_HOLD_BAZOOKA_R, ANIM_REQUEST_START); } - if (mAvatarObject->mSignaledAnimations.find(ANIM_AGENT_AIM_BOW_L) != mAvatarObject->mSignaledAnimations.end()) + if (gAgentAvatarp->mSignaledAnimations.find(ANIM_AGENT_AIM_BOW_L) != gAgentAvatarp->mSignaledAnimations.end()) { sendAnimationRequest(ANIM_AGENT_AIM_BOW_L, ANIM_REQUEST_STOP); sendAnimationRequest(ANIM_AGENT_HOLD_BOW_L, ANIM_REQUEST_START); @@ -2868,8 +1756,7 @@ void LLAgent::endAnimationUpdateUI() } } } - else - if( mLastCameraMode == CAMERA_MODE_CUSTOMIZE_AVATAR ) + else if (gAgentCamera.getLastCameraMode() == CAMERA_MODE_CUSTOMIZE_AVATAR) { // make sure we ask to save changes @@ -2880,7 +1767,7 @@ void LLAgent::endAnimationUpdateUI() gMorphView->setVisible( FALSE ); } - if (mAvatarObject.notNull()) + if (isAgentAvatarValid()) { if(mCustomAnim) { @@ -2891,13 +1778,13 @@ void LLAgent::endAnimationUpdateUI() } } - setLookAt(LOOKAT_TARGET_CLEAR); + gAgentCamera.setLookAt(LOOKAT_TARGET_CLEAR); } //--------------------------------------------------------------------- // Set up UI for mode we're entering //--------------------------------------------------------------------- - if (mCameraMode == CAMERA_MODE_MOUSELOOK) + if (gAgentCamera.getCameraMode() == CAMERA_MODE_MOUSELOOK) { // hide menus gMenuBarView->setVisible(FALSE); @@ -2912,7 +1799,7 @@ void LLAgent::endAnimationUpdateUI() LLPanelStandStopFlying::getInstance()->setVisible(FALSE); // clear out camera lag effect - mCameraLag.clearVec(); + gAgentCamera.clearCameraLag(); // JC - Added for always chat in third person option gFocusMgr.setKeyboardFocus(NULL); @@ -2940,49 +1827,49 @@ void LLAgent::endAnimationUpdateUI() gConsole->setVisible( TRUE ); - if (mAvatarObject.notNull()) + if (isAgentAvatarValid()) { // Trigger mouselook-specific animations - if( mAvatarObject->isAnyAnimationSignaled(AGENT_GUN_HOLD_ANIMS, NUM_AGENT_GUN_HOLD_ANIMS) ) + if( gAgentAvatarp->isAnyAnimationSignaled(AGENT_GUN_HOLD_ANIMS, NUM_AGENT_GUN_HOLD_ANIMS) ) { - if (mAvatarObject->mSignaledAnimations.find(ANIM_AGENT_HOLD_RIFLE_R) != mAvatarObject->mSignaledAnimations.end()) + if (gAgentAvatarp->mSignaledAnimations.find(ANIM_AGENT_HOLD_RIFLE_R) != gAgentAvatarp->mSignaledAnimations.end()) { sendAnimationRequest(ANIM_AGENT_HOLD_RIFLE_R, ANIM_REQUEST_STOP); sendAnimationRequest(ANIM_AGENT_AIM_RIFLE_R, ANIM_REQUEST_START); } - if (mAvatarObject->mSignaledAnimations.find(ANIM_AGENT_HOLD_HANDGUN_R) != mAvatarObject->mSignaledAnimations.end()) + if (gAgentAvatarp->mSignaledAnimations.find(ANIM_AGENT_HOLD_HANDGUN_R) != gAgentAvatarp->mSignaledAnimations.end()) { sendAnimationRequest(ANIM_AGENT_HOLD_HANDGUN_R, ANIM_REQUEST_STOP); sendAnimationRequest(ANIM_AGENT_AIM_HANDGUN_R, ANIM_REQUEST_START); } - if (mAvatarObject->mSignaledAnimations.find(ANIM_AGENT_HOLD_BAZOOKA_R) != mAvatarObject->mSignaledAnimations.end()) + if (gAgentAvatarp->mSignaledAnimations.find(ANIM_AGENT_HOLD_BAZOOKA_R) != gAgentAvatarp->mSignaledAnimations.end()) { sendAnimationRequest(ANIM_AGENT_HOLD_BAZOOKA_R, ANIM_REQUEST_STOP); sendAnimationRequest(ANIM_AGENT_AIM_BAZOOKA_R, ANIM_REQUEST_START); } - if (mAvatarObject->mSignaledAnimations.find(ANIM_AGENT_HOLD_BOW_L) != mAvatarObject->mSignaledAnimations.end()) + if (gAgentAvatarp->mSignaledAnimations.find(ANIM_AGENT_HOLD_BOW_L) != gAgentAvatarp->mSignaledAnimations.end()) { sendAnimationRequest(ANIM_AGENT_HOLD_BOW_L, ANIM_REQUEST_STOP); sendAnimationRequest(ANIM_AGENT_AIM_BOW_L, ANIM_REQUEST_START); } } - if (mAvatarObject->getParent()) + if (gAgentAvatarp->getParent()) { LLVector3 at_axis = LLViewerCamera::getInstance()->getAtAxis(); - LLViewerObject* root_object = (LLViewerObject*)mAvatarObject->getRoot(); + LLViewerObject* root_object = (LLViewerObject*)gAgentAvatarp->getRoot(); if (root_object->flagCameraDecoupled()) { resetAxes(at_axis); } else { - resetAxes(at_axis * ~((LLViewerObject*)mAvatarObject->getParent())->getRenderRotation()); + resetAxes(at_axis * ~((LLViewerObject*)gAgentAvatarp->getParent())->getRenderRotation()); } } } } - else if (mCameraMode == CAMERA_MODE_CUSTOMIZE_AVATAR) + else if (gAgentCamera.getCameraMode() == CAMERA_MODE_CUSTOMIZE_AVATAR) { LLToolMgr::getInstance()->setCurrentToolset(gFaceEditToolset); @@ -2992,1583 +1879,22 @@ void LLAgent::endAnimationUpdateUI() } // freeze avatar - if (mAvatarObject.notNull()) + if (isAgentAvatarValid()) { - mPauseRequest = mAvatarObject->requestPause(); + mPauseRequest = gAgentAvatarp->requestPause(); } } - if (getAvatarObject()) + if (isAgentAvatarValid()) { - getAvatarObject()->updateAttachmentVisibility(mCameraMode); + gAgentAvatarp->updateAttachmentVisibility(gAgentCamera.getCameraMode()); } gFloaterTools->dirty(); // Don't let this be called more than once if the camera // mode hasn't changed. --JC - mLastCameraMode = mCameraMode; - -} - - -//----------------------------------------------------------------------------- -// updateCamera() -//----------------------------------------------------------------------------- -void LLAgent::updateCamera() -{ - //Ventrella - changed camera_skyward to the new global "mCameraUpVector" - mCameraUpVector = LLVector3::z_axis; - //LLVector3 camera_skyward(0.f, 0.f, 1.f); - //end Ventrella - - U32 camera_mode = mCameraAnimating ? mLastCameraMode : mCameraMode; - - validateFocusObject(); - - if (mAvatarObject.notNull() && - mAvatarObject->isSitting() && - camera_mode == CAMERA_MODE_MOUSELOOK) - { - //Ventrella - //changed camera_skyward to the new global "mCameraUpVector" - mCameraUpVector = mCameraUpVector * mAvatarObject->getRenderRotation(); - //end Ventrella - } - - if (cameraThirdPerson() && mFocusOnAvatar && LLFollowCamMgr::getActiveFollowCamParams()) - { - changeCameraToFollow(); - } - - //Ventrella - //NOTE - this needs to be integrated into a general upVector system here within llAgent. - if ( camera_mode == CAMERA_MODE_FOLLOW && mFocusOnAvatar ) - { - mCameraUpVector = mFollowCam.getUpVector(); - } - //end Ventrella - - if (mSitCameraEnabled) - { - if (mSitCameraReferenceObject->isDead()) - { - setSitCamera(LLUUID::null); - } - } - - // Update UI with our camera inputs - LLFloaterCamera* camera_floater = LLFloaterReg::findTypedInstance<LLFloaterCamera>("camera"); - if (camera_floater) - { - camera_floater->mRotate->setToggleState( - mOrbitRightKey > 0.f, // left - mOrbitUpKey > 0.f, // top - mOrbitLeftKey > 0.f, // right - mOrbitDownKey > 0.f); // bottom - - camera_floater->mTrack->setToggleState( - mPanLeftKey > 0.f, // left - mPanUpKey > 0.f, // top - mPanRightKey > 0.f, // right - mPanDownKey > 0.f); // bottom - } - - // Handle camera movement based on keyboard. - const F32 ORBIT_OVER_RATE = 90.f * DEG_TO_RAD; // radians per second - const F32 ORBIT_AROUND_RATE = 90.f * DEG_TO_RAD; // radians per second - const F32 PAN_RATE = 5.f; // meters per second - - if( mOrbitUpKey || mOrbitDownKey ) - { - F32 input_rate = mOrbitUpKey - mOrbitDownKey; - cameraOrbitOver( input_rate * ORBIT_OVER_RATE / gFPSClamped ); - } - - if( mOrbitLeftKey || mOrbitRightKey) - { - F32 input_rate = mOrbitLeftKey - mOrbitRightKey; - cameraOrbitAround( input_rate * ORBIT_AROUND_RATE / gFPSClamped ); - } - - if( mOrbitInKey || mOrbitOutKey ) - { - F32 input_rate = mOrbitInKey - mOrbitOutKey; - - LLVector3d to_focus = gAgent.getPosGlobalFromAgent(LLViewerCamera::getInstance()->getOrigin()) - calcFocusPositionTargetGlobal(); - F32 distance_to_focus = (F32)to_focus.magVec(); - // Move at distance (in meters) meters per second - cameraOrbitIn( input_rate * distance_to_focus / gFPSClamped ); - } - - if( mPanInKey || mPanOutKey ) - { - F32 input_rate = mPanInKey - mPanOutKey; - cameraPanIn( input_rate * PAN_RATE / gFPSClamped ); - } - - if( mPanRightKey || mPanLeftKey ) - { - F32 input_rate = mPanRightKey - mPanLeftKey; - cameraPanLeft( input_rate * -PAN_RATE / gFPSClamped ); - } - - if( mPanUpKey || mPanDownKey ) - { - F32 input_rate = mPanUpKey - mPanDownKey; - cameraPanUp( input_rate * PAN_RATE / gFPSClamped ); - } - - // Clear camera keyboard keys. - mOrbitLeftKey = 0.f; - mOrbitRightKey = 0.f; - mOrbitUpKey = 0.f; - mOrbitDownKey = 0.f; - mOrbitInKey = 0.f; - mOrbitOutKey = 0.f; - - mPanRightKey = 0.f; - mPanLeftKey = 0.f; - mPanUpKey = 0.f; - mPanDownKey = 0.f; - mPanInKey = 0.f; - mPanOutKey = 0.f; - - // lerp camera focus offset - mCameraFocusOffset = lerp(mCameraFocusOffset, mCameraFocusOffsetTarget, LLCriticalDamp::getInterpolant(CAMERA_FOCUS_HALF_LIFE)); - - //Ventrella - if ( mCameraMode == CAMERA_MODE_FOLLOW ) - { - if ( mAvatarObject.notNull() ) - { - //-------------------------------------------------------------------------------- - // this is where the avatar's position and rotation are given to followCam, and - // where it is updated. All three of its attributes are updated: (1) position, - // (2) focus, and (3) upvector. They can then be queried elsewhere in llAgent. - //-------------------------------------------------------------------------------- - // *TODO: use combined rotation of frameagent and sit object - LLQuaternion avatarRotationForFollowCam = mAvatarObject->isSitting() ? mAvatarObject->getRenderRotation() : mFrameAgent.getQuaternion(); - - LLFollowCamParams* current_cam = LLFollowCamMgr::getActiveFollowCamParams(); - if (current_cam) - { - mFollowCam.copyParams(*current_cam); - mFollowCam.setSubjectPositionAndRotation( mAvatarObject->getRenderPosition(), avatarRotationForFollowCam ); - mFollowCam.update(); - LLViewerJoystick::getInstance()->setCameraNeedsUpdate(true); - } - else - { - changeCameraToThirdPerson(TRUE); - } - } - } - // end Ventrella - - BOOL hit_limit; - LLVector3d camera_pos_global; - LLVector3d camera_target_global = calcCameraPositionTargetGlobal(&hit_limit); - mCameraVirtualPositionAgent = getPosAgentFromGlobal(camera_target_global); - LLVector3d focus_target_global = calcFocusPositionTargetGlobal(); - - // perform field of view correction - mCameraFOVZoomFactor = calcCameraFOVZoomFactor(); - camera_target_global = focus_target_global + (camera_target_global - focus_target_global) * (1.f + mCameraFOVZoomFactor); - - mShowAvatar = TRUE; // can see avatar by default - - // Adjust position for animation - if (mCameraAnimating) - { - F32 time = mAnimationTimer.getElapsedTimeF32(); - - // yet another instance of critically damped motion, hooray! - // F32 fraction_of_animation = 1.f - pow(2.f, -time / CAMERA_ZOOM_HALF_LIFE); - - // linear interpolation - F32 fraction_of_animation = time / mAnimationDuration; - - BOOL isfirstPerson = mCameraMode == CAMERA_MODE_MOUSELOOK; - BOOL wasfirstPerson = mLastCameraMode == CAMERA_MODE_MOUSELOOK; - F32 fraction_animation_to_skip; - - if (mAnimationCameraStartGlobal == camera_target_global) - { - fraction_animation_to_skip = 0.f; - } - else - { - LLVector3d cam_delta = mAnimationCameraStartGlobal - camera_target_global; - fraction_animation_to_skip = HEAD_BUFFER_SIZE / (F32)cam_delta.magVec(); - } - F32 animation_start_fraction = (wasfirstPerson) ? fraction_animation_to_skip : 0.f; - F32 animation_finish_fraction = (isfirstPerson) ? (1.f - fraction_animation_to_skip) : 1.f; - - if (fraction_of_animation < animation_finish_fraction) - { - if (fraction_of_animation < animation_start_fraction || fraction_of_animation > animation_finish_fraction ) - { - mShowAvatar = FALSE; - } - - // ...adjust position for animation - F32 smooth_fraction_of_animation = llsmoothstep(0.0f, 1.0f, fraction_of_animation); - camera_pos_global = lerp(mAnimationCameraStartGlobal, camera_target_global, smooth_fraction_of_animation); - mFocusGlobal = lerp(mAnimationFocusStartGlobal, focus_target_global, smooth_fraction_of_animation); - } - else - { - // ...animation complete - mCameraAnimating = FALSE; - - camera_pos_global = camera_target_global; - mFocusGlobal = focus_target_global; - - endAnimationUpdateUI(); - mShowAvatar = TRUE; - } - - if (getAvatarObject() && mCameraMode != CAMERA_MODE_MOUSELOOK) - { - getAvatarObject()->updateAttachmentVisibility(mCameraMode); - } - } - else - { - camera_pos_global = camera_target_global; - mFocusGlobal = focus_target_global; - mShowAvatar = TRUE; - } - - // smoothing - if (TRUE) - { - LLVector3d agent_pos = getPositionGlobal(); - LLVector3d camera_pos_agent = camera_pos_global - agent_pos; - // Sitting on what you're manipulating can cause camera jitter with smoothing. - // This turns off smoothing while editing. -MG - mCameraSmoothingStop |= (BOOL)LLToolMgr::getInstance()->inBuildMode(); - - if (cameraThirdPerson() && !mCameraSmoothingStop) - { - const F32 SMOOTHING_HALF_LIFE = 0.02f; - - F32 smoothing = LLCriticalDamp::getInterpolant(gSavedSettings.getF32("CameraPositionSmoothing") * SMOOTHING_HALF_LIFE, FALSE); - - if (!mFocusObject) // we differentiate on avatar mode - { - // for avatar-relative focus, we smooth in avatar space - - // the avatar moves too jerkily w/r/t global space to smooth there. - - LLVector3d delta = camera_pos_agent - mCameraSmoothingLastPositionAgent; - if (delta.magVec() < MAX_CAMERA_SMOOTH_DISTANCE) // only smooth over short distances please - { - camera_pos_agent = lerp(mCameraSmoothingLastPositionAgent, camera_pos_agent, smoothing); - camera_pos_global = camera_pos_agent + agent_pos; - } - } - else - { - LLVector3d delta = camera_pos_global - mCameraSmoothingLastPositionGlobal; - if (delta.magVec() < MAX_CAMERA_SMOOTH_DISTANCE) // only smooth over short distances please - { - camera_pos_global = lerp(mCameraSmoothingLastPositionGlobal, camera_pos_global, smoothing); - } - } - } - - mCameraSmoothingLastPositionGlobal = camera_pos_global; - mCameraSmoothingLastPositionAgent = camera_pos_agent; - mCameraSmoothingStop = FALSE; - } - - - mCameraCurrentFOVZoomFactor = lerp(mCameraCurrentFOVZoomFactor, mCameraFOVZoomFactor, LLCriticalDamp::getInterpolant(FOV_ZOOM_HALF_LIFE)); - -// llinfos << "Current FOV Zoom: " << mCameraCurrentFOVZoomFactor << " Target FOV Zoom: " << mCameraFOVZoomFactor << " Object penetration: " << mFocusObjectDist << llendl; - - F32 ui_offset = 0.f; - if( CAMERA_MODE_CUSTOMIZE_AVATAR == mCameraMode ) - { - ui_offset = calcCustomizeAvatarUIOffset( camera_pos_global ); - } - - - LLVector3 focus_agent = getPosAgentFromGlobal(mFocusGlobal); - - mCameraPositionAgent = getPosAgentFromGlobal(camera_pos_global); - - // Move the camera - - //Ventrella - LLViewerCamera::getInstance()->updateCameraLocation(mCameraPositionAgent, mCameraUpVector, focus_agent); - //LLViewerCamera::getInstance()->updateCameraLocation(mCameraPositionAgent, camera_skyward, focus_agent); - //end Ventrella - - //RN: translate UI offset after camera is oriented properly - LLViewerCamera::getInstance()->translate(LLViewerCamera::getInstance()->getLeftAxis() * ui_offset); - - // Change FOV - LLViewerCamera::getInstance()->setView(LLViewerCamera::getInstance()->getDefaultFOV() / (1.f + mCameraCurrentFOVZoomFactor)); - - // follow camera when in customize mode - if (cameraCustomizeAvatar()) - { - setLookAt(LOOKAT_TARGET_FOCUS, NULL, mCameraPositionAgent); - } - - // update the travel distance stat - // this isn't directly related to the camera - // but this seemed like the best place to do this - LLVector3d global_pos = getPositionGlobal(); - if (! mLastPositionGlobal.isExactlyZero()) - { - LLVector3d delta = global_pos - mLastPositionGlobal; - mDistanceTraveled += delta.magVec(); - } - mLastPositionGlobal = global_pos; - - if (LLVOAvatar::sVisibleInFirstPerson && mAvatarObject.notNull() && !mAvatarObject->isSitting() && cameraMouselook()) - { - LLVector3 head_pos = mAvatarObject->mHeadp->getWorldPosition() + - LLVector3(0.08f, 0.f, 0.05f) * mAvatarObject->mHeadp->getWorldRotation() + - LLVector3(0.1f, 0.f, 0.f) * mAvatarObject->mPelvisp->getWorldRotation(); - LLVector3 diff = mCameraPositionAgent - head_pos; - diff = diff * ~mAvatarObject->mRoot.getWorldRotation(); - - LLJoint* torso_joint = mAvatarObject->mTorsop; - LLJoint* chest_joint = mAvatarObject->mChestp; - LLVector3 torso_scale = torso_joint->getScale(); - LLVector3 chest_scale = chest_joint->getScale(); - - // shorten avatar skeleton to avoid foot interpenetration - if (!mAvatarObject->mInAir) - { - LLVector3 chest_offset = LLVector3(0.f, 0.f, chest_joint->getPosition().mV[VZ]) * torso_joint->getWorldRotation(); - F32 z_compensate = llclamp(-diff.mV[VZ], -0.2f, 1.f); - F32 scale_factor = llclamp(1.f - ((z_compensate * 0.5f) / chest_offset.mV[VZ]), 0.5f, 1.2f); - torso_joint->setScale(LLVector3(1.f, 1.f, scale_factor)); - - LLJoint* neck_joint = mAvatarObject->mNeckp; - LLVector3 neck_offset = LLVector3(0.f, 0.f, neck_joint->getPosition().mV[VZ]) * chest_joint->getWorldRotation(); - scale_factor = llclamp(1.f - ((z_compensate * 0.5f) / neck_offset.mV[VZ]), 0.5f, 1.2f); - chest_joint->setScale(LLVector3(1.f, 1.f, scale_factor)); - diff.mV[VZ] = 0.f; - } - - mAvatarObject->mPelvisp->setPosition(mAvatarObject->mPelvisp->getPosition() + diff); - - mAvatarObject->mRoot.updateWorldMatrixChildren(); - - for (LLVOAvatar::attachment_map_t::iterator iter = mAvatarObject->mAttachmentPoints.begin(); - iter != mAvatarObject->mAttachmentPoints.end(); ) - { - LLVOAvatar::attachment_map_t::iterator curiter = iter++; - LLViewerJointAttachment* attachment = curiter->second; - for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin(); - attachment_iter != attachment->mAttachedObjects.end(); - ++attachment_iter) - { - LLViewerObject *attached_object = (*attachment_iter); - if (attached_object && !attached_object->isDead() && attached_object->mDrawable.notNull()) - { - // clear any existing "early" movements of attachment - attached_object->mDrawable->clearState(LLDrawable::EARLY_MOVE); - gPipeline.updateMoveNormalAsync(attached_object->mDrawable); - attached_object->updateText(); - } - } - } - - torso_joint->setScale(torso_scale); - chest_joint->setScale(chest_scale); - } -} - -void LLAgent::updateFocusOffset() -{ - validateFocusObject(); - if (mFocusObject.notNull()) - { - LLVector3d obj_pos = getPosGlobalFromAgent(mFocusObject->getRenderPosition()); - mFocusObjectOffset.setVec(mFocusTargetGlobal - obj_pos); - } -} - -void LLAgent::validateFocusObject() -{ - if (mFocusObject.notNull() && - (mFocusObject->isDead())) - { - mFocusObjectOffset.clearVec(); - clearFocusObject(); - mCameraFOVZoomFactor = 0.f; - } -} - -//----------------------------------------------------------------------------- -// calcCustomizeAvatarUIOffset() -//----------------------------------------------------------------------------- -F32 LLAgent::calcCustomizeAvatarUIOffset( const LLVector3d& camera_pos_global ) -{ - F32 ui_offset = 0.f; - - if( gFloaterCustomize ) - { - const LLRect& rect = gFloaterCustomize->getRect(); - - // Move the camera so that the avatar isn't covered up by this floater. - F32 fraction_of_fov = 0.5f - (0.5f * (1.f - llmin(1.f, ((F32)rect.getWidth() / (F32)gViewerWindow->getWindowWidthScaled())))); - F32 apparent_angle = fraction_of_fov * LLViewerCamera::getInstance()->getView() * LLViewerCamera::getInstance()->getAspect(); // radians - F32 offset = tan(apparent_angle); - - if( rect.mLeft < (gViewerWindow->getWindowWidthScaled() - rect.mRight) ) - { - // Move the avatar to the right (camera to the left) - ui_offset = offset; - } - else - { - // Move the avatar to the left (camera to the right) - ui_offset = -offset; - } - } - F32 range = (F32)dist_vec(camera_pos_global, gAgent.getFocusGlobal()); - mUIOffset = lerp(mUIOffset, ui_offset, LLCriticalDamp::getInterpolant(0.05f)); - return mUIOffset * range; -} - -//----------------------------------------------------------------------------- -// calcFocusPositionTargetGlobal() -//----------------------------------------------------------------------------- -LLVector3d LLAgent::calcFocusPositionTargetGlobal() -{ - if (mFocusObject.notNull() && mFocusObject->isDead()) - { - clearFocusObject(); - } - - // Ventrella - if ( mCameraMode == CAMERA_MODE_FOLLOW && mFocusOnAvatar ) - { - mFocusTargetGlobal = gAgent.getPosGlobalFromAgent(mFollowCam.getSimulatedFocus()); - return mFocusTargetGlobal; - }// End Ventrella - else if (mCameraMode == CAMERA_MODE_MOUSELOOK) - { - LLVector3d at_axis(1.0, 0.0, 0.0); - LLQuaternion agent_rot = mFrameAgent.getQuaternion(); - if (mAvatarObject.notNull() && mAvatarObject->getParent()) - { - LLViewerObject* root_object = (LLViewerObject*)mAvatarObject->getRoot(); - if (!root_object->flagCameraDecoupled()) - { - agent_rot *= ((LLViewerObject*)(mAvatarObject->getParent()))->getRenderRotation(); - } - } - at_axis = at_axis * agent_rot; - mFocusTargetGlobal = calcCameraPositionTargetGlobal() + at_axis; - return mFocusTargetGlobal; - } - else if (mCameraMode == CAMERA_MODE_CUSTOMIZE_AVATAR) - { - return mFocusTargetGlobal; - } - else if (!mFocusOnAvatar) - { - if (mFocusObject.notNull() && !mFocusObject->isDead() && mFocusObject->mDrawable.notNull()) - { - LLDrawable* drawablep = mFocusObject->mDrawable; - - if (mTrackFocusObject && - drawablep && - drawablep->isActive()) - { - if (!mFocusObject->isAvatar()) - { - if (mFocusObject->isSelected()) - { - gPipeline.updateMoveNormalAsync(drawablep); - } - else - { - if (drawablep->isState(LLDrawable::MOVE_UNDAMPED)) - { - gPipeline.updateMoveNormalAsync(drawablep); - } - else - { - gPipeline.updateMoveDampedAsync(drawablep); - } - } - } - } - // if not tracking object, update offset based on new object position - else - { - updateFocusOffset(); - } - LLVector3 focus_agent = mFocusObject->getRenderPosition() + mFocusObjectOffset; - mFocusTargetGlobal.setVec(getPosGlobalFromAgent(focus_agent)); - } - return mFocusTargetGlobal; - } - else if (mSitCameraEnabled && mAvatarObject.notNull() && mAvatarObject->isSitting() && mSitCameraReferenceObject.notNull()) - { - // sit camera - LLVector3 object_pos = mSitCameraReferenceObject->getRenderPosition(); - LLQuaternion object_rot = mSitCameraReferenceObject->getRenderRotation(); - - LLVector3 target_pos = object_pos + (mSitCameraFocus * object_rot); - return getPosGlobalFromAgent(target_pos); - } - else - { - return getPositionGlobal() + calcThirdPersonFocusOffset(); - } -} - -LLVector3d LLAgent::calcThirdPersonFocusOffset() -{ - // ...offset from avatar - LLVector3d focus_offset; - - LLQuaternion agent_rot = mFrameAgent.getQuaternion(); - if (!mAvatarObject.isNull() && mAvatarObject->getParent()) - { - agent_rot *= ((LLViewerObject*)(mAvatarObject->getParent()))->getRenderRotation(); - } - - focus_offset = mFocusOffsetInitial[mCameraPreset] * agent_rot; - return focus_offset; -} - -void LLAgent::setupSitCamera() -{ - // agent frame entering this function is in world coordinates - if (mAvatarObject.notNull() && mAvatarObject->getParent()) - { - LLQuaternion parent_rot = ((LLViewerObject*)mAvatarObject->getParent())->getRenderRotation(); - // slam agent coordinate frame to proper parent local version - LLVector3 at_axis = mFrameAgent.getAtAxis(); - at_axis.mV[VZ] = 0.f; - at_axis.normalize(); - resetAxes(at_axis * ~parent_rot); - } -} - -//----------------------------------------------------------------------------- -// getCameraPositionAgent() -//----------------------------------------------------------------------------- -const LLVector3 &LLAgent::getCameraPositionAgent() const -{ - return LLViewerCamera::getInstance()->getOrigin(); -} - -//----------------------------------------------------------------------------- -// getCameraPositionGlobal() -//----------------------------------------------------------------------------- -LLVector3d LLAgent::getCameraPositionGlobal() const -{ - return getPosGlobalFromAgent(LLViewerCamera::getInstance()->getOrigin()); -} - -//----------------------------------------------------------------------------- -// calcCameraFOVZoomFactor() -//----------------------------------------------------------------------------- -F32 LLAgent::calcCameraFOVZoomFactor() -{ - LLVector3 camera_offset_dir; - camera_offset_dir.setVec(mCameraFocusOffset); - - if (mCameraMode == CAMERA_MODE_MOUSELOOK) - { - return 0.f; - } - else if (mFocusObject.notNull() && !mFocusObject->isAvatar() && !mFocusOnAvatar) - { - // don't FOV zoom on mostly transparent objects - LLVector3 focus_offset = mFocusObjectOffset; - F32 obj_min_dist = 0.f; - calcCameraMinDistance(obj_min_dist); - F32 current_distance = llmax(0.001f, camera_offset_dir.magVec()); - - mFocusObjectDist = obj_min_dist - current_distance; - - F32 new_fov_zoom = llclamp(mFocusObjectDist / current_distance, 0.f, 1000.f); - return new_fov_zoom; - } - else // focusing on land or avatar - { - // keep old field of view until user changes focus explicitly - return mCameraFOVZoomFactor; - //return 0.f; - } -} - -//----------------------------------------------------------------------------- -// calcCameraPositionTargetGlobal() -//----------------------------------------------------------------------------- -LLVector3d LLAgent::calcCameraPositionTargetGlobal(BOOL *hit_limit) -{ - // Compute base camera position and look-at points. - F32 camera_land_height; - LLVector3d frame_center_global = mAvatarObject.isNull() ? getPositionGlobal() - : getPosGlobalFromAgent(mAvatarObject->mRoot.getWorldPosition()); - - BOOL isConstrained = FALSE; - LLVector3d head_offset; - head_offset.setVec(mThirdPersonHeadOffset); - - LLVector3d camera_position_global; - - // Ventrella - if ( mCameraMode == CAMERA_MODE_FOLLOW && mFocusOnAvatar ) - { - camera_position_global = gAgent.getPosGlobalFromAgent(mFollowCam.getSimulatedPosition()); - }// End Ventrella - else if (mCameraMode == CAMERA_MODE_MOUSELOOK) - { - if (mAvatarObject.isNull() || mAvatarObject->mDrawable.isNull()) - { - llwarns << "Null avatar drawable!" << llendl; - return LLVector3d::zero; - } - head_offset.clearVec(); - if (mAvatarObject->isSitting() && mAvatarObject->getParent()) - { - mAvatarObject->updateHeadOffset(); - head_offset.mdV[VX] = mAvatarObject->mHeadOffset.mV[VX]; - head_offset.mdV[VY] = mAvatarObject->mHeadOffset.mV[VY]; - head_offset.mdV[VZ] = mAvatarObject->mHeadOffset.mV[VZ] + 0.1f; - const LLMatrix4& mat = ((LLViewerObject*) mAvatarObject->getParent())->getRenderMatrix(); - camera_position_global = getPosGlobalFromAgent - ((mAvatarObject->getPosition()+ - LLVector3(head_offset)*mAvatarObject->getRotation()) * mat); - } - else - { - head_offset.mdV[VZ] = mAvatarObject->mHeadOffset.mV[VZ]; - if (mAvatarObject->isSitting()) - { - head_offset.mdV[VZ] += 0.1; - } - camera_position_global = getPosGlobalFromAgent(mAvatarObject->getRenderPosition());//frame_center_global; - head_offset = head_offset * mAvatarObject->getRenderRotation(); - camera_position_global = camera_position_global + head_offset; - } - } - else if (mCameraMode == CAMERA_MODE_THIRD_PERSON && mFocusOnAvatar) - { - LLVector3 local_camera_offset; - F32 camera_distance = 0.f; - - if (mSitCameraEnabled - && mAvatarObject.notNull() - && mAvatarObject->isSitting() - && mSitCameraReferenceObject.notNull()) - { - // sit camera - LLVector3 object_pos = mSitCameraReferenceObject->getRenderPosition(); - LLQuaternion object_rot = mSitCameraReferenceObject->getRenderRotation(); - - LLVector3 target_pos = object_pos + (mSitCameraPos * object_rot); - - camera_position_global = getPosGlobalFromAgent(target_pos); - } - else - { - local_camera_offset = mCameraZoomFraction * getCameraOffsetInitial() * gSavedSettings.getF32("CameraOffsetScale"); - - // are we sitting down? - if (mAvatarObject.notNull() && mAvatarObject->getParent()) - { - LLQuaternion parent_rot = ((LLViewerObject*)mAvatarObject->getParent())->getRenderRotation(); - // slam agent coordinate frame to proper parent local version - LLVector3 at_axis = mFrameAgent.getAtAxis() * parent_rot; - at_axis.mV[VZ] = 0.f; - at_axis.normalize(); - resetAxes(at_axis * ~parent_rot); - - local_camera_offset = local_camera_offset * mFrameAgent.getQuaternion() * parent_rot; - } - else - { - local_camera_offset = mFrameAgent.rotateToAbsolute( local_camera_offset ); - } - - if (!mCameraCollidePlane.isExactlyZero() && (mAvatarObject.isNull() || !mAvatarObject->isSitting())) - { - LLVector3 plane_normal; - plane_normal.setVec(mCameraCollidePlane.mV); - - F32 offset_dot_norm = local_camera_offset * plane_normal; - if (llabs(offset_dot_norm) < 0.001f) - { - offset_dot_norm = 0.001f; - } - - camera_distance = local_camera_offset.normalize(); - - F32 pos_dot_norm = getPosAgentFromGlobal(frame_center_global + head_offset) * plane_normal; - - // if agent is outside the colliding half-plane - if (pos_dot_norm > mCameraCollidePlane.mV[VW]) - { - // check to see if camera is on the opposite side (inside) the half-plane - if (offset_dot_norm + pos_dot_norm < mCameraCollidePlane.mV[VW]) - { - // diminish offset by factor to push it back outside the half-plane - camera_distance *= (pos_dot_norm - mCameraCollidePlane.mV[VW] - CAMERA_COLLIDE_EPSILON) / -offset_dot_norm; - } - } - else - { - if (offset_dot_norm + pos_dot_norm > mCameraCollidePlane.mV[VW]) - { - camera_distance *= (mCameraCollidePlane.mV[VW] - pos_dot_norm - CAMERA_COLLIDE_EPSILON) / offset_dot_norm; - } - } - } - else - { - camera_distance = local_camera_offset.normalize(); - } - - mTargetCameraDistance = llmax(camera_distance, MIN_CAMERA_DISTANCE); - - if (mTargetCameraDistance != mCurrentCameraDistance) - { - F32 camera_lerp_amt = LLCriticalDamp::getInterpolant(CAMERA_ZOOM_HALF_LIFE); - - mCurrentCameraDistance = lerp(mCurrentCameraDistance, mTargetCameraDistance, camera_lerp_amt); - } - - // Make the camera distance current - local_camera_offset *= mCurrentCameraDistance; - - // set the global camera position - LLVector3d camera_offset; - - LLVector3 av_pos = mAvatarObject.isNull() ? LLVector3::zero : mAvatarObject->getRenderPosition(); - camera_offset.setVec( local_camera_offset ); - camera_position_global = frame_center_global + head_offset + camera_offset; - - if (mAvatarObject.notNull()) - { - LLVector3d camera_lag_d; - F32 lag_interp = LLCriticalDamp::getInterpolant(CAMERA_LAG_HALF_LIFE); - LLVector3 target_lag; - LLVector3 vel = getVelocity(); - - // lag by appropriate amount for flying - F32 time_in_air = mAvatarObject->mTimeInAir.getElapsedTimeF32(); - if(!mCameraAnimating && mAvatarObject->mInAir && time_in_air > GROUND_TO_AIR_CAMERA_TRANSITION_START_TIME) - { - LLVector3 frame_at_axis = mFrameAgent.getAtAxis(); - frame_at_axis -= projected_vec(frame_at_axis, getReferenceUpVector()); - frame_at_axis.normalize(); - - //transition smoothly in air mode, to avoid camera pop - F32 u = (time_in_air - GROUND_TO_AIR_CAMERA_TRANSITION_START_TIME) / GROUND_TO_AIR_CAMERA_TRANSITION_TIME; - u = llclamp(u, 0.f, 1.f); - - lag_interp *= u; - - if (gViewerWindow->getLeftMouseDown() && gViewerWindow->getLastPick().mObjectID == mAvatarObject->getID()) - { - // disable camera lag when using mouse-directed steering - target_lag.clearVec(); - } - else - { - target_lag = vel * gSavedSettings.getF32("DynamicCameraStrength") / 30.f; - } - - mCameraLag = lerp(mCameraLag, target_lag, lag_interp); - - F32 lag_dist = mCameraLag.magVec(); - if (lag_dist > MAX_CAMERA_LAG) - { - mCameraLag = mCameraLag * MAX_CAMERA_LAG / lag_dist; - } - - // clamp camera lag so that avatar is always in front - F32 dot = (mCameraLag - (frame_at_axis * (MIN_CAMERA_LAG * u))) * frame_at_axis; - if (dot < -(MIN_CAMERA_LAG * u)) - { - mCameraLag -= (dot + (MIN_CAMERA_LAG * u)) * frame_at_axis; - } - } - else - { - mCameraLag = lerp(mCameraLag, LLVector3::zero, LLCriticalDamp::getInterpolant(0.15f)); - } - - camera_lag_d.setVec(mCameraLag); - camera_position_global = camera_position_global - camera_lag_d; - } - } - } - else - { - LLVector3d focusPosGlobal = calcFocusPositionTargetGlobal(); - // camera gets pushed out later wrt mCameraFOVZoomFactor...this is "raw" value - camera_position_global = focusPosGlobal + mCameraFocusOffset; - } - - if (!gSavedSettings.getBOOL("DisableCameraConstraints") && !gAgent.isGodlike()) - { - LLViewerRegion* regionp = LLWorld::getInstance()->getRegionFromPosGlobal( - camera_position_global); - bool constrain = true; - if(regionp && regionp->canManageEstate()) - { - constrain = false; - } - if(constrain) - { - F32 max_dist = ( CAMERA_MODE_CUSTOMIZE_AVATAR == mCameraMode ) ? - APPEARANCE_MAX_ZOOM : mDrawDistance; - - LLVector3d camera_offset = camera_position_global - - gAgent.getPositionGlobal(); - F32 camera_distance = (F32)camera_offset.magVec(); - - if(camera_distance > max_dist) - { - camera_position_global = gAgent.getPositionGlobal() + - (max_dist / camera_distance) * camera_offset; - isConstrained = TRUE; - } - } - -// JC - Could constrain camera based on parcel stuff here. -// LLViewerRegion *regionp = LLWorld::getInstance()->getRegionFromPosGlobal(camera_position_global); -// -// if (regionp && !regionp->mParcelOverlay->isBuildCameraAllowed(regionp->getPosRegionFromGlobal(camera_position_global))) -// { -// camera_position_global = last_position_global; -// -// isConstrained = TRUE; -// } - } - - // Don't let camera go underground - F32 camera_min_off_ground = getCameraMinOffGround(); - - camera_land_height = LLWorld::getInstance()->resolveLandHeightGlobal(camera_position_global); - - if (camera_position_global.mdV[VZ] < camera_land_height + camera_min_off_ground) - { - camera_position_global.mdV[VZ] = camera_land_height + camera_min_off_ground; - isConstrained = TRUE; - } - - - if (hit_limit) - { - *hit_limit = isConstrained; - } - - return camera_position_global; -} - - -LLVector3 LLAgent::getCameraOffsetInitial() -{ - return mCameraOffsetInitial[mCameraPreset]; -} - - -//----------------------------------------------------------------------------- -// handleScrollWheel() -//----------------------------------------------------------------------------- -void LLAgent::handleScrollWheel(S32 clicks) -{ - if ( mCameraMode == CAMERA_MODE_FOLLOW && gAgent.getFocusOnAvatar()) - { - if ( ! mFollowCam.getPositionLocked() ) // not if the followCam position is locked in place - { - mFollowCam.zoom( clicks ); - if ( mFollowCam.isZoomedToMinimumDistance() ) - { - changeCameraToMouselook(FALSE); - } - } - } - else - { - LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection(); - const F32 ROOT_ROOT_TWO = sqrt(F_SQRT2); - - // Block if camera is animating - if (mCameraAnimating) - { - return; - } - - if (selection->getObjectCount() && selection->getSelectType() == SELECT_TYPE_HUD) - { - F32 zoom_factor = (F32)pow(0.8, -clicks); - cameraZoomIn(zoom_factor); - } - else if (mFocusOnAvatar && mCameraMode == CAMERA_MODE_THIRD_PERSON) - { - F32 camera_offset_initial_mag = getCameraOffsetInitial().magVec(); - - F32 current_zoom_fraction = mTargetCameraDistance / (camera_offset_initial_mag * gSavedSettings.getF32("CameraOffsetScale")); - current_zoom_fraction *= 1.f - pow(ROOT_ROOT_TWO, clicks); - - cameraOrbitIn(current_zoom_fraction * camera_offset_initial_mag * gSavedSettings.getF32("CameraOffsetScale")); - } - else - { - F32 current_zoom_fraction = (F32)mCameraFocusOffsetTarget.magVec(); - cameraOrbitIn(current_zoom_fraction * (1.f - pow(ROOT_ROOT_TWO, clicks))); - } - } -} - - -//----------------------------------------------------------------------------- -// getCameraMinOffGround() -//----------------------------------------------------------------------------- -F32 LLAgent::getCameraMinOffGround() -{ - if (mCameraMode == CAMERA_MODE_MOUSELOOK) - { - return 0.f; - } - else - { - if (gSavedSettings.getBOOL("DisableCameraConstraints")) - { - return -1000.f; - } - else - { - return 0.5f; - } - } -} - - -//----------------------------------------------------------------------------- -// resetCamera() -//----------------------------------------------------------------------------- -void LLAgent::resetCamera() -{ - // Remove any pitch from the avatar - LLVector3 at = mFrameAgent.getAtAxis(); - at.mV[VZ] = 0.f; - at.normalize(); - gAgent.resetAxes(at); - // have to explicitly clear field of view zoom now - mCameraFOVZoomFactor = 0.f; - - updateCamera(); -} - -//----------------------------------------------------------------------------- -// changeCameraToMouselook() -//----------------------------------------------------------------------------- -void LLAgent::changeCameraToMouselook(BOOL animate) -{ - if (LLViewerJoystick::getInstance()->getOverrideCamera()) - { - return; - } - - // visibility changes at end of animation - gViewerWindow->getWindow()->resetBusyCount(); - - // unpause avatar animation - mPauseRequest = NULL; - - LLToolMgr::getInstance()->setCurrentToolset(gMouselookToolset); - - if (mAvatarObject.notNull()) - { - mAvatarObject->stopMotion( ANIM_AGENT_BODY_NOISE ); - mAvatarObject->stopMotion( ANIM_AGENT_BREATHE_ROT ); - } - - //gViewerWindow->stopGrab(); - LLSelectMgr::getInstance()->deselectAll(); - gViewerWindow->hideCursor(); - gViewerWindow->moveCursorToCenter(); - - if( mCameraMode != CAMERA_MODE_MOUSELOOK ) - { - gFocusMgr.setKeyboardFocus( NULL ); - - mLastCameraMode = mCameraMode; - mCameraMode = CAMERA_MODE_MOUSELOOK; - U32 old_flags = mControlFlags; - setControlFlags(AGENT_CONTROL_MOUSELOOK); - if (old_flags != mControlFlags) - { - mbFlagsDirty = TRUE; - } - - if (animate) - { - startCameraAnimation(); - } - else - { - mCameraAnimating = FALSE; - endAnimationUpdateUI(); - } - } -} - - -//----------------------------------------------------------------------------- -// changeCameraToDefault() -//----------------------------------------------------------------------------- -void LLAgent::changeCameraToDefault() -{ - if (LLViewerJoystick::getInstance()->getOverrideCamera()) - { - return; - } - - if (LLFollowCamMgr::getActiveFollowCamParams()) - { - changeCameraToFollow(); - } - else - { - changeCameraToThirdPerson(); - } -} - - -// Ventrella -//----------------------------------------------------------------------------- -// changeCameraToFollow() -//----------------------------------------------------------------------------- -void LLAgent::changeCameraToFollow(BOOL animate) -{ - if (LLViewerJoystick::getInstance()->getOverrideCamera()) - { - return; - } - - if( mCameraMode != CAMERA_MODE_FOLLOW ) - { - if (mCameraMode == CAMERA_MODE_MOUSELOOK) - { - animate = FALSE; - } - startCameraAnimation(); - - mLastCameraMode = mCameraMode; - mCameraMode = CAMERA_MODE_FOLLOW; - - // bang-in the current focus, position, and up vector of the follow cam - mFollowCam.reset( mCameraPositionAgent, LLViewerCamera::getInstance()->getPointOfInterest(), LLVector3::z_axis ); - - if (gBasicToolset) - { - LLToolMgr::getInstance()->setCurrentToolset(gBasicToolset); - } - - if (mAvatarObject.notNull()) - { - mAvatarObject->mPelvisp->setPosition(LLVector3::zero); - mAvatarObject->startMotion( ANIM_AGENT_BODY_NOISE ); - mAvatarObject->startMotion( ANIM_AGENT_BREATHE_ROT ); - } - - // unpause avatar animation - mPauseRequest = NULL; - - U32 old_flags = mControlFlags; - clearControlFlags(AGENT_CONTROL_MOUSELOOK); - if (old_flags != mControlFlags) - { - mbFlagsDirty = TRUE; - } - - if (animate) - { - startCameraAnimation(); - } - else - { - mCameraAnimating = FALSE; - endAnimationUpdateUI(); - } - } -} - -//----------------------------------------------------------------------------- -// changeCameraToThirdPerson() -//----------------------------------------------------------------------------- -void LLAgent::changeCameraToThirdPerson(BOOL animate) -{ - if (LLViewerJoystick::getInstance()->getOverrideCamera()) - { - return; - } - - gViewerWindow->getWindow()->resetBusyCount(); - - mCameraZoomFraction = INITIAL_ZOOM_FRACTION; - - if (mAvatarObject.notNull()) - { - if (!mAvatarObject->isSitting()) - { - mAvatarObject->mPelvisp->setPosition(LLVector3::zero); - } - mAvatarObject->startMotion( ANIM_AGENT_BODY_NOISE ); - mAvatarObject->startMotion( ANIM_AGENT_BREATHE_ROT ); - } - - LLVector3 at_axis; - - // unpause avatar animation - mPauseRequest = NULL; - - if( mCameraMode != CAMERA_MODE_THIRD_PERSON ) - { - if (gBasicToolset) - { - LLToolMgr::getInstance()->setCurrentToolset(gBasicToolset); - } - - mCameraLag.clearVec(); - if (mCameraMode == CAMERA_MODE_MOUSELOOK) - { - mCurrentCameraDistance = MIN_CAMERA_DISTANCE; - mTargetCameraDistance = MIN_CAMERA_DISTANCE; - animate = FALSE; - } - mLastCameraMode = mCameraMode; - mCameraMode = CAMERA_MODE_THIRD_PERSON; - U32 old_flags = mControlFlags; - clearControlFlags(AGENT_CONTROL_MOUSELOOK); - if (old_flags != mControlFlags) - { - mbFlagsDirty = TRUE; - } - - } - - // Remove any pitch from the avatar - if (mAvatarObject.notNull() && mAvatarObject->getParent()) - { - LLQuaternion obj_rot = ((LLViewerObject*)mAvatarObject->getParent())->getRenderRotation(); - at_axis = LLViewerCamera::getInstance()->getAtAxis(); - at_axis.mV[VZ] = 0.f; - at_axis.normalize(); - resetAxes(at_axis * ~obj_rot); - } - else - { - at_axis = mFrameAgent.getAtAxis(); - at_axis.mV[VZ] = 0.f; - at_axis.normalize(); - resetAxes(at_axis); - } - - - if (animate) - { - startCameraAnimation(); - } - else - { - mCameraAnimating = FALSE; - endAnimationUpdateUI(); - } -} - -//----------------------------------------------------------------------------- -// changeCameraToCustomizeAvatar() -//----------------------------------------------------------------------------- -void LLAgent::changeCameraToCustomizeAvatar(BOOL avatar_animate, BOOL camera_animate) -{ - if (LLViewerJoystick::getInstance()->getOverrideCamera()) - { - return; - } - - standUp(); // force stand up - gViewerWindow->getWindow()->resetBusyCount(); - - if (gFaceEditToolset) - { - LLToolMgr::getInstance()->setCurrentToolset(gFaceEditToolset); - } - - if (camera_animate) - { - startCameraAnimation(); - } - - // Remove any pitch from the avatar - //LLVector3 at = mFrameAgent.getAtAxis(); - //at.mV[VZ] = 0.f; - //at.normalize(); - //gAgent.resetAxes(at); - - if( mCameraMode != CAMERA_MODE_CUSTOMIZE_AVATAR ) - { - mLastCameraMode = mCameraMode; - mCameraMode = CAMERA_MODE_CUSTOMIZE_AVATAR; - U32 old_flags = mControlFlags; - clearControlFlags(AGENT_CONTROL_MOUSELOOK); - if (old_flags != mControlFlags) - { - mbFlagsDirty = TRUE; - } - - gFocusMgr.setKeyboardFocus( NULL ); - gFocusMgr.setMouseCapture( NULL ); - - LLVOAvatarSelf::onCustomizeStart(); - } - - if (mAvatarObject.notNull()) - { - if(avatar_animate) - { - // Remove any pitch from the avatar - LLVector3 at = mFrameAgent.getAtAxis(); - at.mV[VZ] = 0.f; - at.normalize(); - gAgent.resetAxes(at); - - sendAnimationRequest(ANIM_AGENT_CUSTOMIZE, ANIM_REQUEST_START); - mCustomAnim = TRUE ; - mAvatarObject->startMotion(ANIM_AGENT_CUSTOMIZE); - LLMotion* turn_motion = mAvatarObject->findMotion(ANIM_AGENT_CUSTOMIZE); - - if (turn_motion) - { - mAnimationDuration = turn_motion->getDuration() + CUSTOMIZE_AVATAR_CAMERA_ANIM_SLOP; - - } - else - { - mAnimationDuration = gSavedSettings.getF32("ZoomTime"); - } - } - - - - gAgent.setFocusGlobal(LLVector3d::zero); - } - else - { - mCameraAnimating = FALSE; - endAnimationUpdateUI(); - } - -} - - -void LLAgent::switchCameraPreset(ECameraPreset preset) -{ - //zoom is supposed to be reset for the front and group views - mCameraZoomFraction = 1.f; - - //focusing on avatar in that case means following him on movements - mFocusOnAvatar = TRUE; - - mCameraPreset = preset; - - gSavedSettings.setU32("CameraPreset", mCameraPreset); -} - - -// -// Focus point management -// - -//----------------------------------------------------------------------------- -// startCameraAnimation() -//----------------------------------------------------------------------------- -void LLAgent::startCameraAnimation() -{ - mAnimationCameraStartGlobal = getCameraPositionGlobal(); - mAnimationFocusStartGlobal = mFocusGlobal; - mAnimationTimer.reset(); - mCameraAnimating = TRUE; - mAnimationDuration = gSavedSettings.getF32("ZoomTime"); -} - -//----------------------------------------------------------------------------- -// stopCameraAnimation() -//----------------------------------------------------------------------------- -void LLAgent::stopCameraAnimation() -{ - mCameraAnimating = FALSE; -} - -void LLAgent::clearFocusObject() -{ - if (mFocusObject.notNull()) - { - startCameraAnimation(); - - setFocusObject(NULL); - mFocusObjectOffset.clearVec(); - } -} - -void LLAgent::setFocusObject(LLViewerObject* object) -{ - mFocusObject = object; -} - -// Focus on a point, but try to keep camera position stable. -//----------------------------------------------------------------------------- -// setFocusGlobal() -//----------------------------------------------------------------------------- -void LLAgent::setFocusGlobal(const LLPickInfo& pick) -{ - LLViewerObject* objectp = gObjectList.findObject(pick.mObjectID); - - if (objectp) - { - // focus on object plus designated offset - // which may or may not be same as pick.mPosGlobal - setFocusGlobal(objectp->getPositionGlobal() + LLVector3d(pick.mObjectOffset), pick.mObjectID); - } - else - { - // focus directly on point where user clicked - setFocusGlobal(pick.mPosGlobal, pick.mObjectID); - } -} - - -void LLAgent::setFocusGlobal(const LLVector3d& focus, const LLUUID &object_id) -{ - setFocusObject(gObjectList.findObject(object_id)); - LLVector3d old_focus = mFocusTargetGlobal; - LLViewerObject *focus_obj = mFocusObject; - - // if focus has changed - if (old_focus != focus) - { - if (focus.isExactlyZero()) - { - if (mAvatarObject.notNull()) - { - mFocusTargetGlobal = getPosGlobalFromAgent(mAvatarObject->mHeadp->getWorldPosition()); - } - else - { - mFocusTargetGlobal = getPositionGlobal(); - } - mCameraFocusOffsetTarget = getCameraPositionGlobal() - mFocusTargetGlobal; - mCameraFocusOffset = mCameraFocusOffsetTarget; - setLookAt(LOOKAT_TARGET_CLEAR); - } - else - { - mFocusTargetGlobal = focus; - if (!focus_obj) - { - mCameraFOVZoomFactor = 0.f; - } - - mCameraFocusOffsetTarget = gAgent.getPosGlobalFromAgent(mCameraVirtualPositionAgent) - mFocusTargetGlobal; - - startCameraAnimation(); - - if (focus_obj) - { - if (focus_obj->isAvatar()) - { - setLookAt(LOOKAT_TARGET_FOCUS, focus_obj); - } - else - { - setLookAt(LOOKAT_TARGET_FOCUS, focus_obj, (getPosAgentFromGlobal(focus) - focus_obj->getRenderPosition()) * ~focus_obj->getRenderRotation()); - } - } - else - { - setLookAt(LOOKAT_TARGET_FOCUS, NULL, getPosAgentFromGlobal(mFocusTargetGlobal)); - } - } - } - else // focus == mFocusTargetGlobal - { - if (focus.isExactlyZero()) - { - if (mAvatarObject.notNull()) - { - mFocusTargetGlobal = getPosGlobalFromAgent(mAvatarObject->mHeadp->getWorldPosition()); - } - else - { - mFocusTargetGlobal = getPositionGlobal(); - } - } - mCameraFocusOffsetTarget = (getCameraPositionGlobal() - mFocusTargetGlobal) / (1.f + mCameraFOVZoomFactor);; - mCameraFocusOffset = mCameraFocusOffsetTarget; - } - - if (mFocusObject.notNull()) - { - // for attachments, make offset relative to avatar, not the attachment - if (mFocusObject->isAttachment()) - { - while (mFocusObject.notNull() // DEV-29123 - can crash with a messed-up attachment - && !mFocusObject->isAvatar()) - { - mFocusObject = (LLViewerObject*) mFocusObject->getParent(); - } - setFocusObject((LLViewerObject*)mFocusObject); - } - updateFocusOffset(); - } -} - -// Used for avatar customization -//----------------------------------------------------------------------------- -// setCameraPosAndFocusGlobal() -//----------------------------------------------------------------------------- -void LLAgent::setCameraPosAndFocusGlobal(const LLVector3d& camera_pos, const LLVector3d& focus, const LLUUID &object_id) -{ - LLVector3d old_focus = mFocusTargetGlobal; - - F64 focus_delta_squared = (old_focus - focus).magVecSquared(); - const F64 ANIM_EPSILON_SQUARED = 0.0001; - if( focus_delta_squared > ANIM_EPSILON_SQUARED ) - { - startCameraAnimation(); - - if( CAMERA_MODE_CUSTOMIZE_AVATAR == mCameraMode ) - { - // Compensate for the fact that the camera has already been offset to make room for LLFloaterCustomize. - mAnimationCameraStartGlobal -= LLVector3d(LLViewerCamera::getInstance()->getLeftAxis() * calcCustomizeAvatarUIOffset( mAnimationCameraStartGlobal )); - } - } - - //LLViewerCamera::getInstance()->setOrigin( gAgent.getPosAgentFromGlobal( camera_pos ) ); - setFocusObject(gObjectList.findObject(object_id)); - mFocusTargetGlobal = focus; - mCameraFocusOffsetTarget = camera_pos - focus; - mCameraFocusOffset = mCameraFocusOffsetTarget; - - if (mFocusObject) - { - if (mFocusObject->isAvatar()) - { - setLookAt(LOOKAT_TARGET_FOCUS, mFocusObject); - } - else - { - setLookAt(LOOKAT_TARGET_FOCUS, mFocusObject, (getPosAgentFromGlobal(focus) - mFocusObject->getRenderPosition()) * ~mFocusObject->getRenderRotation()); - } - } - else - { - setLookAt(LOOKAT_TARGET_FOCUS, NULL, getPosAgentFromGlobal(mFocusTargetGlobal)); - } - - if( mCameraAnimating ) - { - const F64 ANIM_METERS_PER_SECOND = 10.0; - const F64 MIN_ANIM_SECONDS = 0.5; - F64 anim_duration = llmax( MIN_ANIM_SECONDS, sqrt(focus_delta_squared) / ANIM_METERS_PER_SECOND ); - setAnimationDuration( (F32)anim_duration ); - } - - updateFocusOffset(); -} - -//----------------------------------------------------------------------------- -// setSitCamera() -//----------------------------------------------------------------------------- -void LLAgent::setSitCamera(const LLUUID &object_id, const LLVector3 &camera_pos, const LLVector3 &camera_focus) -{ - BOOL camera_enabled = !object_id.isNull(); - - if (camera_enabled) - { - LLViewerObject *reference_object = gObjectList.findObject(object_id); - if (reference_object) - { - //convert to root object relative? - mSitCameraPos = camera_pos; - mSitCameraFocus = camera_focus; - mSitCameraReferenceObject = reference_object; - mSitCameraEnabled = TRUE; - } - } - else - { - mSitCameraPos.clearVec(); - mSitCameraFocus.clearVec(); - mSitCameraReferenceObject = NULL; - mSitCameraEnabled = FALSE; - } -} - -//----------------------------------------------------------------------------- -// setFocusOnAvatar() -//----------------------------------------------------------------------------- -void LLAgent::setFocusOnAvatar(BOOL focus_on_avatar, BOOL animate) -{ - if (focus_on_avatar != mFocusOnAvatar) - { - if (animate) - { - startCameraAnimation(); - } - else - { - stopCameraAnimation(); - } - } - - //RN: when focused on the avatar, we're not "looking" at it - // looking implies intent while focusing on avatar means - // you're just walking around with a camera on you...eesh. - if (!mFocusOnAvatar && focus_on_avatar) - { - setFocusGlobal(LLVector3d::zero); - mCameraFOVZoomFactor = 0.f; - if (mCameraMode == CAMERA_MODE_THIRD_PERSON) - { - LLVector3 at_axis; - if (mAvatarObject.notNull() && mAvatarObject->getParent()) - { - LLQuaternion obj_rot = ((LLViewerObject*)mAvatarObject->getParent())->getRenderRotation(); - at_axis = LLViewerCamera::getInstance()->getAtAxis(); - at_axis.mV[VZ] = 0.f; - at_axis.normalize(); - resetAxes(at_axis * ~obj_rot); - } - else - { - at_axis = LLViewerCamera::getInstance()->getAtAxis(); - at_axis.mV[VZ] = 0.f; - at_axis.normalize(); - resetAxes(at_axis); - } - } - } - // unlocking camera from avatar - else if (mFocusOnAvatar && !focus_on_avatar) - { - // keep camera focus point consistent, even though it is now unlocked - setFocusGlobal(getPositionGlobal() + calcThirdPersonFocusOffset(), gAgent.getID()); - } - - mFocusOnAvatar = focus_on_avatar; + gAgentCamera.updateLastCamera(); } //----------------------------------------------------------------------------- @@ -4586,90 +1912,13 @@ void LLAgent::heardChat(const LLUUID& id) if (ll_rand(2) == 0) { LLViewerObject *chatter = gObjectList.findObject(mLastChatterID); - setLookAt(LOOKAT_TARGET_AUTO_LISTEN, chatter, LLVector3::zero); + gAgentCamera.setLookAt(LOOKAT_TARGET_AUTO_LISTEN, chatter, LLVector3::zero); } mLastChatterID = id; mChatTimer.reset(); } -//----------------------------------------------------------------------------- -// lookAtLastChat() -//----------------------------------------------------------------------------- -void LLAgent::lookAtLastChat() -{ - // Block if camera is animating or not in normal third person camera mode - if (mCameraAnimating || !cameraThirdPerson()) - { - return; - } - - LLViewerObject *chatter = gObjectList.findObject(mLastChatterID); - if (chatter) - { - LLVector3 delta_pos; - if (chatter->isAvatar()) - { - LLVOAvatar *chatter_av = (LLVOAvatar*)chatter; - if (mAvatarObject.notNull() && chatter_av->mHeadp) - { - delta_pos = chatter_av->mHeadp->getWorldPosition() - mAvatarObject->mHeadp->getWorldPosition(); - } - else - { - delta_pos = chatter->getPositionAgent() - getPositionAgent(); - } - delta_pos.normalize(); - - setControlFlags(AGENT_CONTROL_STOP); - - changeCameraToThirdPerson(); - - LLVector3 new_camera_pos = mAvatarObject->mHeadp->getWorldPosition(); - LLVector3 left = delta_pos % LLVector3::z_axis; - left.normalize(); - LLVector3 up = left % delta_pos; - up.normalize(); - new_camera_pos -= delta_pos * 0.4f; - new_camera_pos += left * 0.3f; - new_camera_pos += up * 0.2f; - if (chatter_av->mHeadp) - { - setFocusGlobal(getPosGlobalFromAgent(chatter_av->mHeadp->getWorldPosition()), mLastChatterID); - mCameraFocusOffsetTarget = getPosGlobalFromAgent(new_camera_pos) - gAgent.getPosGlobalFromAgent(chatter_av->mHeadp->getWorldPosition()); - } - else - { - setFocusGlobal(chatter->getPositionGlobal(), mLastChatterID); - mCameraFocusOffsetTarget = getPosGlobalFromAgent(new_camera_pos) - chatter->getPositionGlobal(); - } - setFocusOnAvatar(FALSE, TRUE); - } - else - { - delta_pos = chatter->getRenderPosition() - getPositionAgent(); - delta_pos.normalize(); - - setControlFlags(AGENT_CONTROL_STOP); - - changeCameraToThirdPerson(); - - LLVector3 new_camera_pos = mAvatarObject->mHeadp->getWorldPosition(); - LLVector3 left = delta_pos % LLVector3::z_axis; - left.normalize(); - LLVector3 up = left % delta_pos; - up.normalize(); - new_camera_pos -= delta_pos * 0.4f; - new_camera_pos += left * 0.3f; - new_camera_pos += up * 0.2f; - - setFocusGlobal(chatter->getPositionGlobal(), mLastChatterID); - mCameraFocusOffsetTarget = getPosGlobalFromAgent(new_camera_pos) - chatter->getPositionGlobal(); - setFocusOnAvatar(FALSE, TRUE); - } - } -} - const F32 SIT_POINT_EXTENTS = 0.2f; LLSD ll_sdmap_from_vector3(const LLVector3& vec) @@ -4714,10 +1963,10 @@ void LLAgent::setStartPosition( U32 location_id ) LLVector3 agent_pos = getPositionAgent(); - if (mAvatarObject.notNull()) + if (isAgentAvatarValid()) { // the z height is at the agent's feet - agent_pos.mV[VZ] -= 0.5f * mAvatarObject->mBodySize.mV[VZ]; + agent_pos.mV[VZ] -= 0.5f * gAgentAvatarp->mBodySize.mV[VZ]; } agent_pos.mV[VX] = llclamp( agent_pos.mV[VX], INSET, REGION_WIDTH - INSET ); @@ -4824,7 +2073,7 @@ void LLAgent::onAnimStop(const LLUUID& id) setControlFlags(AGENT_CONTROL_FINISH_ANIM); // now trigger dusting self off animation - if (mAvatarObject.notNull() && !mAvatarObject->mBelowWater && rand() % 3 == 0) + if (isAgentAvatarValid() && !gAgentAvatarp->mBelowWater && rand() % 3 == 0) sendAnimationRequest( ANIM_AGENT_BRUSH, ANIM_REQUEST_START ); } else if (id == ANIM_AGENT_PRE_JUMP || id == ANIM_AGENT_LAND || id == ANIM_AGENT_MEDIUM_LAND) @@ -4833,11 +2082,16 @@ void LLAgent::onAnimStop(const LLUUID& id) } } -BOOL LLAgent::isGodlike() const +bool LLAgent::isGodlike() const { return mAgentAccess.isGodlike(); } +bool LLAgent::isGodlikeWithoutAdminMenuFakery() const +{ + return mAgentAccess.isGodlikeWithoutAdminMenuFakery(); +} + U8 LLAgent::getGodLevel() const { return mAgentAccess.getGodLevel(); @@ -5018,15 +2272,15 @@ void LLAgent::buildFullnameAndTitle(std::string& name) const name.erase(0, name.length()); } - if (mAvatarObject.notNull()) + if (isAgentAvatarValid()) { - name += mAvatarObject->getFullname(); + name += gAgentAvatarp->getFullname(); } } -BOOL LLAgent::isInGroup(const LLUUID& group_id) const +BOOL LLAgent::isInGroup(const LLUUID& group_id, BOOL ignore_god_mode /* FALSE */) const { - if (isGodlike()) + if (!ignore_god_mode && isGodlike()) return true; S32 count = mGroups.count(); @@ -5166,14 +2420,14 @@ BOOL LLAgent::canJoinGroups() const LLQuaternion LLAgent::getHeadRotation() { - if (mAvatarObject.isNull() || !mAvatarObject->mPelvisp || !mAvatarObject->mHeadp) + if (!isAgentAvatarValid() || !gAgentAvatarp->mPelvisp || !gAgentAvatarp->mHeadp) { return LLQuaternion::DEFAULT; } - if (!gAgent.cameraMouselook()) + if (!gAgentCamera.cameraMouselook()) { - return mAvatarObject->getRotation(); + return gAgentAvatarp->getRotation(); } // We must be in mouselook @@ -5182,9 +2436,9 @@ LLQuaternion LLAgent::getHeadRotation() LLVector3 left = up % look_dir; LLQuaternion rot(look_dir, left, up); - if (mAvatarObject->getParent()) + if (gAgentAvatarp->getParent()) { - rot = rot * ~mAvatarObject->getParent()->getRotation(); + rot = rot * ~gAgentAvatarp->getParent()->getRotation(); } return rot; @@ -5342,10 +2596,11 @@ void LLAgent::initOriginGlobal(const LLVector3d &origin_global) BOOL LLAgent::leftButtonGrabbed() const { - return (!cameraMouselook() && mControlsTakenCount[CONTROL_LBUTTON_DOWN_INDEX] > 0) - || (cameraMouselook() && mControlsTakenCount[CONTROL_ML_LBUTTON_DOWN_INDEX] > 0) - || (!cameraMouselook() && mControlsTakenPassedOnCount[CONTROL_LBUTTON_DOWN_INDEX] > 0) - || (cameraMouselook() && mControlsTakenPassedOnCount[CONTROL_ML_LBUTTON_DOWN_INDEX] > 0); + const BOOL camera_mouse_look = gAgentCamera.cameraMouselook(); + return (!camera_mouse_look && mControlsTakenCount[CONTROL_LBUTTON_DOWN_INDEX] > 0) + || (camera_mouse_look && mControlsTakenCount[CONTROL_ML_LBUTTON_DOWN_INDEX] > 0) + || (!camera_mouse_look && mControlsTakenPassedOnCount[CONTROL_LBUTTON_DOWN_INDEX] > 0) + || (camera_mouse_look && mControlsTakenPassedOnCount[CONTROL_ML_LBUTTON_DOWN_INDEX] > 0); } BOOL LLAgent::rotateGrabbed() const @@ -5806,14 +3061,13 @@ void LLAgent::processAgentCachedTextureResponse(LLMessageSystem *mesgsys, void * { gAgentQueryManager.mNumPendingQueries--; - LLVOAvatarSelf* avatarp = gAgent.getAvatarObject(); - if (!avatarp || avatarp->isDead()) + if (!isAgentAvatarValid() || gAgentAvatarp->isDead()) { llwarns << "No avatar for user in cached texture update!" << llendl; return; } - if (gAgent.cameraCustomizeAvatar()) + if (gAgentCamera.cameraCustomizeAvatar()) { // ignore baked textures when in customize mode return; @@ -5834,26 +3088,42 @@ void LLAgent::processAgentCachedTextureResponse(LLMessageSystem *mesgsys, void * mesgsys->getUUIDFast(_PREHASH_WearableData, _PREHASH_TextureID, texture_id, texture_block); mesgsys->getU8Fast(_PREHASH_WearableData, _PREHASH_TextureIndex, texture_index, texture_block); - if (texture_id.notNull() - && (S32)texture_index < BAKED_NUM_INDICES - && gAgentQueryManager.mActiveCacheQueries[texture_index] == query_id) - { - //llinfos << "Received cached texture " << (U32)texture_index << ": " << texture_id << llendl; - avatarp->setCachedBakedTexture(LLVOAvatarDictionary::bakedToLocalTextureIndex((EBakedTextureIndex)texture_index), texture_id); - //avatarp->setTETexture( LLVOAvatar::sBakedTextureIndices[texture_index], texture_id ); - gAgentQueryManager.mActiveCacheQueries[texture_index] = 0; - num_results++; + + if ((S32)texture_index < TEX_NUM_INDICES ) + { + const LLVOAvatarDictionary::TextureEntry *texture_entry = LLVOAvatarDictionary::instance().getTexture((ETextureIndex)texture_index); + if (texture_entry) + { + EBakedTextureIndex baked_index = texture_entry->mBakedTextureIndex; + + if (gAgentQueryManager.mActiveCacheQueries[baked_index] == query_id) + { + if (texture_id.notNull()) + { + //llinfos << "Received cached texture " << (U32)texture_index << ": " << texture_id << llendl; + gAgentAvatarp->setCachedBakedTexture((ETextureIndex)texture_index, texture_id); + //gAgentAvatarp->setTETexture( LLVOAvatar::sBakedTextureIndices[texture_index], texture_id ); + gAgentQueryManager.mActiveCacheQueries[baked_index] = 0; + num_results++; + } + else + { + // no cache of this bake. request upload. + gAgentAvatarp->requestLayerSetUpload(baked_index); + } + } + } } } llinfos << "Received cached texture response for " << num_results << " textures." << llendl; - avatarp->updateMeshTextures(); + gAgentAvatarp->updateMeshTextures(); if (gAgentQueryManager.mNumPendingQueries == 0) { // RN: not sure why composites are disabled at this point - avatarp->setCompositeUpdatesEnabled(TRUE); + gAgentAvatarp->setCompositeUpdatesEnabled(TRUE); gAgent.sendAgentSetAppearance(); } } @@ -5906,11 +3176,10 @@ BOOL LLAgent::getHomePosGlobal( LLVector3d* pos_global ) void LLAgent::clearVisualParams(void *data) { - LLVOAvatar* avatarp = gAgent.getAvatarObject(); - if (avatarp) + if (isAgentAvatarValid()) { - avatarp->clearVisualParamWeights(); - avatarp->updateVisualParams(); + gAgentAvatarp->clearVisualParamWeights(); + gAgentAvatarp->updateVisualParams(); } } @@ -5934,16 +3203,15 @@ bool LLAgent::teleportCore(bool is_local) // sync with other viewers. Discuss in DEV-14145/VWR-6744 before reenabling. // Stop all animation before actual teleporting - LLVOAvatar* avatarp = gAgent.getAvatarObject(); - if (avatarp) + if (isAgentAvatarValid()) { - for ( LLVOAvatar::AnimIterator anim_it= avatarp->mPlayingAnimations.begin(); - anim_it != avatarp->mPlayingAnimations.end(); + for ( LLVOAvatar::AnimIterator anim_it= gAgentAvatarp->mPlayingAnimations.begin(); + anim_it != gAgentAvatarp->mPlayingAnimations.end(); ++anim_it) { - avatarp->stopMotion(anim_it->first); + gAgentAvatarp->stopMotion(anim_it->first); } - avatarp->processAnimationStateChanges(); + gAgentAvatarp->processAnimationStateChanges(); } #endif @@ -5951,9 +3219,9 @@ bool LLAgent::teleportCore(bool is_local) // yet if the teleport will succeed. Look in // process_teleport_location_reply - // close the map and find panels so we can see our destination + // close the map panel so we can see our destination. + // we don't close search floater, see EXT-5840. LLFloaterReg::hideInstance("world_map"); - LLFloaterReg::hideInstance("search"); // hide land floater too - it'll be out of date LLFloaterReg::hideInstance("about_land"); @@ -5963,7 +3231,7 @@ bool LLAgent::teleportCore(bool is_local) // Close all pie menus, deselect land, etc. // Don't change the camera until we know teleport succeeded. JC - resetView(FALSE); + gAgentCamera.resetView(FALSE); // local logic LLViewerStats::getInstance()->incStat(LLViewerStats::ST_TELEPORT_COUNT); @@ -5979,7 +3247,7 @@ bool LLAgent::teleportCore(bool is_local) // MBW -- Let the voice client know a teleport has begun so it can leave the existing channel. // This was breaking the case of teleporting within a single sim. Backing it out for now. -// gVoiceClient->leaveChannel(); +// LLVoiceClient::getInstance()->leaveChannel(); return true; } @@ -6123,7 +3391,7 @@ void LLAgent::setTeleportState(ETeleportState state) if (mTeleportState == TELEPORT_MOVING) { // We're outa here. Save "back" slurl. - mTeleportSourceSLURL = LLAgentUI::buildSLURL(); + LLAgentUI::buildSLURL(mTeleportSourceSLURL); } else if(mTeleportState == TELEPORT_ARRIVING) { @@ -6136,13 +3404,11 @@ void LLAgent::stopCurrentAnimations() { // This function stops all current overriding animations on this // avatar, propagating this change back to the server. - - LLVOAvatar* avatarp = gAgent.getAvatarObject(); - if (avatarp) + if (isAgentAvatarValid()) { for ( LLVOAvatar::AnimIterator anim_it = - avatarp->mPlayingAnimations.begin(); - anim_it != avatarp->mPlayingAnimations.end(); + gAgentAvatarp->mPlayingAnimations.begin(); + anim_it != gAgentAvatarp->mPlayingAnimations.end(); anim_it++) { if (anim_it->first == @@ -6155,7 +3421,7 @@ void LLAgent::stopCurrentAnimations() else { // stop this animation locally - avatarp->stopMotion(anim_it->first, TRUE); + gAgentAvatarp->stopMotion(anim_it->first, TRUE); // ...and tell the server to tell everyone. sendAnimationRequest(anim_it->first, ANIM_REQUEST_STOP); } @@ -6262,15 +3528,14 @@ void LLAgent::requestLeaveGodMode() //----------------------------------------------------------------------------- void LLAgent::sendAgentSetAppearance() { - if (mAvatarObject.isNull()) return; + if (!isAgentAvatarValid()) return; - if (gAgentQueryManager.mNumPendingQueries > 0 && !gAgent.cameraCustomizeAvatar()) + if (gAgentQueryManager.mNumPendingQueries > 0 && !gAgentCamera.cameraCustomizeAvatar()) { return; } - - llinfos << "TAT: Sent AgentSetAppearance: " << mAvatarObject->getBakedStatusForPrintout() << llendl; + llinfos << "TAT: Sent AgentSetAppearance: " << gAgentAvatarp->getBakedStatusForPrintout() << llendl; //dumpAvatarTEs( "sendAgentSetAppearance()" ); LLMessageSystem* msg = gMessageSystem; @@ -6284,7 +3549,7 @@ void LLAgent::sendAgentSetAppearance() // NOTE -- when we start correcting all of the other Havok geometry // to compensate for the COLLISION_TOLERANCE ugliness we will have // to tweak this number again - const LLVector3 body_size = mAvatarObject->mBodySize; + const LLVector3 body_size = gAgentAvatarp->mBodySize; msg->addVector3Fast(_PREHASH_Size, body_size); // To guard against out of order packets @@ -6294,20 +3559,20 @@ void LLAgent::sendAgentSetAppearance() // is texture data current relative to wearables? // KLW - TAT this will probably need to check the local queue. - BOOL textures_current = mAvatarObject->areTexturesCurrent(); + BOOL textures_current = gAgentAvatarp->areTexturesCurrent(); for(U8 baked_index = 0; baked_index < BAKED_NUM_INDICES; baked_index++ ) { const ETextureIndex texture_index = LLVOAvatarDictionary::bakedToLocalTextureIndex((EBakedTextureIndex)baked_index); // if we're not wearing a skirt, we don't need the texture to be baked - if (texture_index == TEX_SKIRT_BAKED && !mAvatarObject->isWearingWearableType(WT_SKIRT)) + if (texture_index == TEX_SKIRT_BAKED && !gAgentAvatarp->isWearingWearableType(LLWearableType::WT_SKIRT)) { continue; } // IMG_DEFAULT_AVATAR means not baked. 0 index should be ignored for baked textures - if (!mAvatarObject->isTextureDefined(texture_index, 0)) + if (!gAgentAvatarp->isTextureDefined(texture_index, 0)) { textures_current = FALSE; break; @@ -6320,32 +3585,24 @@ void LLAgent::sendAgentSetAppearance() llinfos << "TAT: Sending cached texture data" << llendl; for (U8 baked_index = 0; baked_index < BAKED_NUM_INDICES; baked_index++) { - const LLVOAvatarDictionary::BakedEntry *baked_dict = LLVOAvatarDictionary::getInstance()->getBakedTexture((EBakedTextureIndex)baked_index); - LLUUID hash; - for (U8 i=0; i < baked_dict->mWearables.size(); i++) + BOOL generate_valid_hash = TRUE; + if (isAgentAvatarValid() && !gAgentAvatarp->isBakedTextureFinal((LLVOAvatarDefines::EBakedTextureIndex)baked_index)) { - // EWearableType wearable_type = gBakedWearableMap[baked_index][wearable_num]; - const EWearableType wearable_type = baked_dict->mWearables[i]; - // MULTI-WEARABLE: fixed to 0th - extend to everything once messaging works. - const LLWearable* wearable = gAgentWearables.getWearable(wearable_type,0); - if (wearable) - { - hash ^= wearable->getAssetID(); - } + generate_valid_hash = FALSE; + llinfos << "Not caching baked texture upload for " << (U32)baked_index << " due to being uploaded at low resolution." << llendl; } + + const LLUUID hash = gAgentWearables.computeBakedTextureHash((EBakedTextureIndex) baked_index, generate_valid_hash); if (hash.notNull()) { - hash ^= baked_dict->mWearablesHashID; + ETextureIndex texture_index = LLVOAvatarDictionary::bakedToLocalTextureIndex((EBakedTextureIndex) baked_index); + msg->nextBlockFast(_PREHASH_WearableData); + msg->addUUIDFast(_PREHASH_CacheID, hash); + msg->addU8Fast(_PREHASH_TextureIndex, (U8)texture_index); } - - const ETextureIndex texture_index = LLVOAvatarDictionary::bakedToLocalTextureIndex((EBakedTextureIndex)baked_index); - - msg->nextBlockFast(_PREHASH_WearableData); - msg->addUUIDFast(_PREHASH_CacheID, hash); - msg->addU8Fast(_PREHASH_TextureIndex, (U8)texture_index); } msg->nextBlockFast(_PREHASH_ObjectData); - mAvatarObject->sendAppearanceMessage( gMessageSystem ); + gAgentAvatarp->sendAppearanceMessage( gMessageSystem ); } else { @@ -6358,9 +3615,9 @@ void LLAgent::sendAgentSetAppearance() S32 transmitted_params = 0; - for (LLViewerVisualParam* param = (LLViewerVisualParam*)mAvatarObject->getFirstVisualParam(); + for (LLViewerVisualParam* param = (LLViewerVisualParam*)gAgentAvatarp->getFirstVisualParam(); param; - param = (LLViewerVisualParam*)mAvatarObject->getNextVisualParam()) + param = (LLViewerVisualParam*)gAgentAvatarp->getNextVisualParam()) { if (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE) { @@ -6482,7 +3739,39 @@ void LLAgent::dumpGroupInfo() //llinfos << "insig " << gAgent.mGroupInsigniaID << llendl; } +// Draw a representation of current autopilot target +void LLAgent::renderAutoPilotTarget() +{ + if (mAutoPilot) + { + F32 height_meters; + LLVector3d target_global; + + glMatrixMode(GL_MODELVIEW); + gGL.pushMatrix(); + + // not textured + gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); + + // lovely green + glColor4f(0.f, 1.f, 1.f, 1.f); + + target_global = mAutoPilotTargetGlobal; + + gGL.translatef((F32)(target_global.mdV[VX]), (F32)(target_global.mdV[VY]), (F32)(target_global.mdV[VZ])); + + height_meters = 1.f; + + glScalef(height_meters, height_meters, height_meters); + + gSphere.render(1500.f); + + gGL.popMatrix(); + } +} + /********************************************************************************/ + LLAgentQueryManager gAgentQueryManager; LLAgentQueryManager::LLAgentQueryManager() : diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h index beede7fbe3..32f9b00135 100644 --- a/indra/newview/llagent.h +++ b/indra/newview/llagent.h @@ -39,19 +39,16 @@ #include "llagentconstants.h" #include "llagentdata.h" // gAgentID, gAgentSessionID #include "llcharacter.h" // LLAnimPauseRequest -#include "llfollowcam.h" // Ventrella -#include "llhudeffectlookat.h" // EPointAtType -#include "llhudeffectpointat.h" // ELookAtType #include "llpointer.h" #include "lluicolor.h" #include "llvoavatardefines.h" +#include "llslurl.h" extern const BOOL ANIMATE; extern const U8 AGENT_STATE_TYPING; // Typing indication extern const U8 AGENT_STATE_EDITING; // Set when agent has objects selected class LLChat; -class LLVOAvatarSelf; class LLViewerRegion; class LLMotion; class LLToolset; @@ -66,26 +63,6 @@ class LLAgentDropGroupViewerNode; //-------------------------------------------------------------------- // Types //-------------------------------------------------------------------- -enum ECameraMode -{ - CAMERA_MODE_THIRD_PERSON, - CAMERA_MODE_MOUSELOOK, - CAMERA_MODE_CUSTOMIZE_AVATAR, - CAMERA_MODE_FOLLOW -}; - -/** Camera Presets for CAMERA_MODE_THIRD_PERSON */ -enum ECameraPreset -{ - /** Default preset, what the Third Person Mode actually was */ - CAMERA_PRESET_REAR_VIEW, - - /** "Looking at the Avatar from the front" */ - CAMERA_PRESET_FRONT_VIEW, - - /** "Above and to the left, over the shoulder, pulled back a little on the zoom" */ - CAMERA_PRESET_GROUP_VIEW -}; enum EAnimRequest { @@ -129,7 +106,6 @@ public: virtual ~LLAgent(); void init(); void cleanup(); - void setAvatarObject(LLVOAvatarSelf *avatar); //-------------------------------------------------------------------- // Login @@ -139,11 +115,12 @@ public: void setFirstLogin(BOOL b) { mFirstLogin = b; } // Return TRUE if the database reported this login as the first for this particular user. BOOL isFirstLogin() const { return mFirstLogin; } + BOOL isInitialized() const { return mInitialized; } public: - BOOL mInitialized; - BOOL mFirstLogin; std::string mMOTD; // Message of the day private: + BOOL mInitialized; + BOOL mFirstLogin; boost::shared_ptr<LLAgentListener> mListener; //-------------------------------------------------------------------- @@ -192,20 +169,6 @@ private: /******************************************************************************** ** ** - ** GENERAL ACCESSORS - **/ - -public: - LLVOAvatarSelf* getAvatarObject() const { return mAvatarObject; } -private: - LLPointer<LLVOAvatarSelf> mAvatarObject; // NULL until avatar object sent down from simulator - -/** General Accessors - ** ** - *******************************************************************************/ - -/******************************************************************************** - ** ** ** POSITION **/ @@ -236,7 +199,7 @@ public: // Coordinate System //-------------------------------------------------------------------- public: - LLCoordFrame getFrameAgent() const { return mFrameAgent; } + const LLCoordFrame& getFrameAgent() const { return mFrameAgent; } void initOriginGlobal(const LLVector3d &origin_global); // Only to be used in ONE place void resetAxes(); void resetAxes(const LLVector3 &look_at); // Makes reasonable left and up @@ -279,6 +242,10 @@ private: public: S32 getRegionsVisited() const; F64 getDistanceTraveled() const; + void setDistanceTraveled(F64 dist) { mDistanceTraveled = dist; } + + const LLVector3d &getLastPositionGlobal() const { return mLastPositionGlobal; } + void setLastPositionGlobal(const LLVector3d &pos) { mLastPositionGlobal = pos; } private: std::set<U64> mRegionsVisited; // Stat - what distinct regions has the avatar been to? F64 mDistanceTraveled; // Stat - how far has the avatar moved? @@ -321,7 +288,6 @@ public: //-------------------------------------------------------------------- public: void heardChat(const LLUUID& id); - void lookAtLastChat(); F32 getTypingTime() { return mTypingTimer.getElapsedTimeF32(); } LLUUID getLastChatter() const { return mLastChatterID; } F32 getNearChatRadius() { return mNearChatRadius; } @@ -430,6 +396,8 @@ public: // Send message to simulator to force grabbed controls to be // released, in case of a poorly written script. void forceReleaseControls(); + void setFlagsDirty() { mbFlagsDirty = TRUE; } + private: S32 mControlsTakenCount[TOTAL_CONTROLS]; S32 mControlsTakenPassedOnCount[TOTAL_CONTROLS]; @@ -447,9 +415,11 @@ public: void sendAnimationRequests(LLDynamicArray<LLUUID> &anim_ids, EAnimRequest request); void sendAnimationRequest(const LLUUID &anim_id, EAnimRequest request); void endAnimationUpdateUI(); + void unpauseAnimation() { mPauseRequest = NULL; } + BOOL getCustomAnim() const { return mCustomAnim; } + void setCustomAnim(BOOL anim) { mCustomAnim = anim; } + private: - LLFrameTimer mAnimationTimer; // Seconds that transition animation has been active - F32 mAnimationDuration; // In seconds BOOL mCustomAnim; // Current animation is ANIM_AGENT_CUSTOMIZE ? LLAnimPauseRequest mPauseRequest; BOOL mViewsPushed; // Keep track of whether or not we have pushed views @@ -462,19 +432,6 @@ private: ** ** ** MOVEMENT **/ - - //-------------------------------------------------------------------- - // Keys - //-------------------------------------------------------------------- -public: - void setKey(const S32 direction, S32 &key); // Sets key to +1 for +direction, -1 for -direction -private: - S32 mAtKey; // Either 1, 0, or -1. Indicates that movement key is pressed - S32 mWalkKey; // Like AtKey, but causes less forward thrust - S32 mLeftKey; - S32 mUpKey; - F32 mYawKey; - F32 mPitchKey; //-------------------------------------------------------------------- // Movement from user input @@ -492,42 +449,6 @@ public: void movePitch(F32 mag); //-------------------------------------------------------------------- - // Orbit - //-------------------------------------------------------------------- -public: - void setOrbitLeftKey(F32 mag) { mOrbitLeftKey = mag; } - void setOrbitRightKey(F32 mag) { mOrbitRightKey = mag; } - void setOrbitUpKey(F32 mag) { mOrbitUpKey = mag; } - void setOrbitDownKey(F32 mag) { mOrbitDownKey = mag; } - void setOrbitInKey(F32 mag) { mOrbitInKey = mag; } - void setOrbitOutKey(F32 mag) { mOrbitOutKey = mag; } -private: - F32 mOrbitLeftKey; - F32 mOrbitRightKey; - F32 mOrbitUpKey; - F32 mOrbitDownKey; - F32 mOrbitInKey; - F32 mOrbitOutKey; - - //-------------------------------------------------------------------- - // Pan - //-------------------------------------------------------------------- -public: - void setPanLeftKey(F32 mag) { mPanLeftKey = mag; } - void setPanRightKey(F32 mag) { mPanRightKey = mag; } - void setPanUpKey(F32 mag) { mPanUpKey = mag; } - void setPanDownKey(F32 mag) { mPanDownKey = mag; } - void setPanInKey(F32 mag) { mPanInKey = mag; } - void setPanOutKey(F32 mag) { mPanOutKey = mag; } -private: - F32 mPanUpKey; - F32 mPanDownKey; - F32 mPanLeftKey; - F32 mPanRightKey; - F32 mPanInKey; - F32 mPanOutKey; - - //-------------------------------------------------------------------- // Move the avatar's frame //-------------------------------------------------------------------- public: @@ -594,13 +515,13 @@ public: public: static void parseTeleportMessages(const std::string& xml_filename); - const std::string getTeleportSourceSLURL() const { return mTeleportSourceSLURL; } + const void getTeleportSourceSLURL(LLSLURL& slurl) const { slurl = mTeleportSourceSLURL; } public: // ! TODO ! Define ERROR and PROGRESS enums here instead of exposing the mappings. static std::map<std::string, std::string> sTeleportErrorMessages; static std::map<std::string, std::string> sTeleportProgressMessages; private: - std::string mTeleportSourceSLURL; // SLURL where last TP began + LLSLURL mTeleportSourceSLURL; // SLURL where last TP began //-------------------------------------------------------------------- // Teleport Actions @@ -640,232 +561,6 @@ private: /******************************************************************************** ** ** - ** CAMERA - **/ - - //-------------------------------------------------------------------- - // Mode - //-------------------------------------------------------------------- -public: - void changeCameraToDefault(); - void changeCameraToMouselook(BOOL animate = TRUE); - void changeCameraToThirdPerson(BOOL animate = TRUE); - void changeCameraToCustomizeAvatar(BOOL avatar_animate = TRUE, BOOL camera_animate = TRUE); // Trigger transition animation - void changeCameraToFollow(BOOL animate = TRUE); // Ventrella - BOOL cameraThirdPerson() const { return (mCameraMode == CAMERA_MODE_THIRD_PERSON && mLastCameraMode == CAMERA_MODE_THIRD_PERSON); } - BOOL cameraMouselook() const { return (mCameraMode == CAMERA_MODE_MOUSELOOK && mLastCameraMode == CAMERA_MODE_MOUSELOOK); } - BOOL cameraCustomizeAvatar() const { return (mCameraMode == CAMERA_MODE_CUSTOMIZE_AVATAR /*&& !mCameraAnimating*/); } - BOOL cameraFollow() const { return (mCameraMode == CAMERA_MODE_FOLLOW && mLastCameraMode == CAMERA_MODE_FOLLOW); } - ECameraMode getCameraMode() const { return mCameraMode; } - void updateCamera(); // Call once per frame to update camera location/orientation - void resetCamera(); // Slam camera into its default position -private: - ECameraMode mCameraMode; // Target mode after transition animation is done - ECameraMode mLastCameraMode; - - //-------------------------------------------------------------------- - // Preset - //-------------------------------------------------------------------- -public: - void switchCameraPreset(ECameraPreset preset); - -private: - - /** Determines default camera offset depending on the current camera preset */ - LLVector3 getCameraOffsetInitial(); - - /** Camera preset in Third Person Mode */ - ECameraPreset mCameraPreset; - - /** Initial camera offsets */ - std::map<ECameraPreset, LLVector3> mCameraOffsetInitial; - - /** Initial focus offsets */ - std::map<ECameraPreset, LLVector3d> mFocusOffsetInitial; - - - //-------------------------------------------------------------------- - // Position - //-------------------------------------------------------------------- -public: - LLVector3d getCameraPositionGlobal() const; - const LLVector3 &getCameraPositionAgent() const; - LLVector3d calcCameraPositionTargetGlobal(BOOL *hit_limit = NULL); // Calculate the camera position target - F32 getCameraMinOffGround(); // Minimum height off ground for this mode, meters - void setCameraCollidePlane(const LLVector4 &plane) { mCameraCollidePlane = plane; } - BOOL calcCameraMinDistance(F32 &obj_min_distance); - F32 calcCustomizeAvatarUIOffset(const LLVector3d& camera_pos_global); - F32 getCurrentCameraBuildOffset() { return (F32)mCameraFocusOffset.length(); } -private: - F32 mCurrentCameraDistance; // Current camera offset from avatar - F32 mTargetCameraDistance; // Target camera offset from avatar - F32 mCameraFOVZoomFactor; // Amount of fov zoom applied to camera when zeroing in on an object - F32 mCameraCurrentFOVZoomFactor; // Interpolated fov zoom - F32 mCameraFOVDefault; // Default field of view that is basis for FOV zoom effect - LLVector4 mCameraCollidePlane; // Colliding plane for camera - F32 mCameraZoomFraction; // Mousewheel driven fraction of zoom - LLVector3 mCameraPositionAgent; // Camera position in agent coordinates - LLVector3 mCameraVirtualPositionAgent; // Camera virtual position (target) before performing FOV zoom - LLVector3d mCameraSmoothingLastPositionGlobal; - LLVector3d mCameraSmoothingLastPositionAgent; - BOOL mCameraSmoothingStop; - LLVector3 mCameraLag; // Third person camera lag - LLVector3 mCameraUpVector; // Camera's up direction in world coordinates (determines the 'roll' of the view) - - //-------------------------------------------------------------------- - // Follow - //-------------------------------------------------------------------- -public: - void setUsingFollowCam(bool using_follow_cam); -private: - LLFollowCam mFollowCam; // Ventrella - - //-------------------------------------------------------------------- - // Sit - //-------------------------------------------------------------------- -public: - void setupSitCamera(); - BOOL sitCameraEnabled() { return mSitCameraEnabled; } - void setSitCamera(const LLUUID &object_id, - const LLVector3 &camera_pos = LLVector3::zero, const LLVector3 &camera_focus = LLVector3::zero); -private: - LLPointer<LLViewerObject> mSitCameraReferenceObject; // Object to which camera is related when sitting - BOOL mSitCameraEnabled; // Use provided camera information when sitting? - LLVector3 mSitCameraPos; // Root relative camera pos when sitting - LLVector3 mSitCameraFocus; // Root relative camera target when sitting - - //-------------------------------------------------------------------- - // Animation - //-------------------------------------------------------------------- -public: - void setCameraAnimating(BOOL b) { mCameraAnimating = b; } - BOOL getCameraAnimating() { return mCameraAnimating; } - void setAnimationDuration(F32 seconds) { mAnimationDuration = seconds; } - void startCameraAnimation(); - void stopCameraAnimation(); -private: - BOOL mCameraAnimating; // Camera is transitioning from one mode to another - LLVector3d mAnimationCameraStartGlobal; // Camera start position, global coords - LLVector3d mAnimationFocusStartGlobal; // Camera focus point, global coords - - //-------------------------------------------------------------------- - // Focus - //-------------------------------------------------------------------- -public: - LLVector3d calcFocusPositionTargetGlobal(); - LLVector3 calcFocusOffset(LLViewerObject *object, LLVector3 pos_agent, S32 x, S32 y); - BOOL getFocusOnAvatar() const { return mFocusOnAvatar; } - LLPointer<LLViewerObject>& getFocusObject() { return mFocusObject; } - F32 getFocusObjectDist() const { return mFocusObjectDist; } - void updateFocusOffset(); - void validateFocusObject(); - void setFocusGlobal(const LLPickInfo& pick); - void setFocusGlobal(const LLVector3d &focus, const LLUUID &object_id = LLUUID::null); - void setFocusOnAvatar(BOOL focus, BOOL animate); - void setCameraPosAndFocusGlobal(const LLVector3d& pos, const LLVector3d& focus, const LLUUID &object_id); - void clearFocusObject(); - void setFocusObject(LLViewerObject* object); - void setObjectTracking(BOOL track) { mTrackFocusObject = track; } - const LLVector3d &getFocusGlobal() const { return mFocusGlobal; } - const LLVector3d &getFocusTargetGlobal() const { return mFocusTargetGlobal; } -private: - LLVector3d mCameraFocusOffset; // Offset from focus point in build mode - LLVector3d mCameraFocusOffsetTarget; // Target towards which we are lerping the camera's focus offset - BOOL mFocusOnAvatar; - LLVector3d mFocusGlobal; - LLVector3d mFocusTargetGlobal; - LLPointer<LLViewerObject> mFocusObject; - F32 mFocusObjectDist; - LLVector3 mFocusObjectOffset; - F32 mFocusDotRadius; // Meters - BOOL mTrackFocusObject; - F32 mUIOffset; - - //-------------------------------------------------------------------- - // Lookat / Pointat - //-------------------------------------------------------------------- -public: - void updateLookAt(const S32 mouse_x, const S32 mouse_y); - BOOL setLookAt(ELookAtType target_type, LLViewerObject *object = NULL, LLVector3 position = LLVector3::zero); - ELookAtType getLookAtType(); - void slamLookAt(const LLVector3 &look_at); // Set the physics data - BOOL setPointAt(EPointAtType target_type, LLViewerObject *object = NULL, LLVector3 position = LLVector3::zero); - EPointAtType getPointAtType(); -public: - LLPointer<LLHUDEffectLookAt> mLookAt; - LLPointer<LLHUDEffectPointAt> mPointAt; - - //-------------------------------------------------------------------- - // Third person - //-------------------------------------------------------------------- -public: - LLVector3d calcThirdPersonFocusOffset(); - void setThirdPersonHeadOffset(LLVector3 offset) { mThirdPersonHeadOffset = offset; } -private: - LLVector3 mThirdPersonHeadOffset; // Head offset for third person camera position - - //-------------------------------------------------------------------- - // Orbit - //-------------------------------------------------------------------- -public: - void cameraOrbitAround(const F32 radians); // Rotate camera CCW radians about build focus point - void cameraOrbitOver(const F32 radians); // Rotate camera forward radians over build focus point - void cameraOrbitIn(const F32 meters); // Move camera in toward build focus point - - //-------------------------------------------------------------------- - // Zoom - //-------------------------------------------------------------------- -public: - void handleScrollWheel(S32 clicks); // Mousewheel driven zoom - void cameraZoomIn(const F32 factor); // Zoom in by fraction of current distance - F32 getCameraZoomFraction(); // Get camera zoom as fraction of minimum and maximum zoom - void setCameraZoomFraction(F32 fraction); // Set camera zoom as fraction of minimum and maximum zoom - F32 calcCameraFOVZoomFactor(); - - //-------------------------------------------------------------------- - // Pan - //-------------------------------------------------------------------- -public: - void cameraPanIn(const F32 meters); - void cameraPanLeft(const F32 meters); - void cameraPanUp(const F32 meters); - - //-------------------------------------------------------------------- - // View - //-------------------------------------------------------------------- -public: - // Called whenever the agent moves. Puts camera back in default position, deselects items, etc. - void resetView(BOOL reset_camera = TRUE, BOOL change_camera = FALSE); - // Called on camera movement. Unlocks camera from the default position behind the avatar. - void unlockView(); - - //-------------------------------------------------------------------- - // Mouselook - //-------------------------------------------------------------------- -public: - BOOL getForceMouselook() const { return mForceMouselook; } - void setForceMouselook(BOOL mouselook) { mForceMouselook = mouselook; } -private: - BOOL mForceMouselook; - - //-------------------------------------------------------------------- - // HUD - //-------------------------------------------------------------------- -public: - const LLColor4 &getEffectColor(); - void setEffectColor(const LLColor4 &color); -public: - F32 mHUDTargetZoom; // Target zoom level for HUD objects (used when editing) - F32 mHUDCurZoom; // Current animated zoom level for HUD objects -private: - LLUIColor mEffectColor; - -/** Camera - ** ** - *******************************************************************************/ - -/******************************************************************************** - ** ** ** ACCESS **/ @@ -888,7 +583,8 @@ private: // God //-------------------------------------------------------------------- public: - BOOL isGodlike() const; + bool isGodlike() const; + bool isGodlikeWithoutAdminMenuFakery() const; U8 getGodLevel() const; void setAdminOverride(BOOL b); void setGodLevel(U8 god_level); @@ -937,8 +633,9 @@ public: LLQuaternion getHeadRotation(); BOOL needsRenderAvatar(); // TRUE when camera mode is such that your own avatar should draw BOOL needsRenderHead(); -public: - F32 mDrawDistance; + void setShowAvatar(BOOL show) { mShowAvatar = show; } + BOOL getShowAvatar() const { return mShowAvatar; } + private: BOOL mShowAvatar; // Should we render the avatar? U32 mAppearanceSerialNum; @@ -953,6 +650,15 @@ public: private: U8 mRenderState; // Current behavior state of agent + //-------------------------------------------------------------------- + // HUD + //-------------------------------------------------------------------- +public: + const LLColor4 &getEffectColor(); + void setEffectColor(const LLColor4 &color); +private: + LLUIColor mEffectColor; + /** Rendering ** ** *******************************************************************************/ @@ -982,7 +688,7 @@ private: //-------------------------------------------------------------------- public: // Checks against all groups in the entire agent group list. - BOOL isInGroup(const LLUUID& group_id) const; + BOOL isInGroup(const LLUUID& group_id, BOOL ingnore_God_mod = FALSE) const; protected: // Only used for building titles. BOOL isGroupMember() const { return !mGroupID.isNull(); } diff --git a/indra/newview/llagentaccess.cpp b/indra/newview/llagentaccess.cpp index eb978eb6c1..915dabb935 100644 --- a/indra/newview/llagentaccess.cpp +++ b/indra/newview/llagentaccess.cpp @@ -69,12 +69,21 @@ bool LLAgentAccess::isGodlike() const #endif } +bool LLAgentAccess::isGodlikeWithoutAdminMenuFakery() const +{ +#ifdef HACKED_GODLIKE_VIEWER + return true; +#else + return mGodLevel > GOD_NOT; +#endif +} + U8 LLAgentAccess::getGodLevel() const { #ifdef HACKED_GODLIKE_VIEWER return GOD_MAINTENANCE; #else - if(mAdminOverride) return GOD_FULL; + if(mAdminOverride) return GOD_FULL; // :( return mGodLevel; #endif } diff --git a/indra/newview/llagentaccess.h b/indra/newview/llagentaccess.h index 93d2f0a371..49da5f44cc 100644 --- a/indra/newview/llagentaccess.h +++ b/indra/newview/llagentaccess.h @@ -48,6 +48,7 @@ public: void setGodLevel(U8 god_level); bool isGodlike() const; + bool isGodlikeWithoutAdminMenuFakery() const; U8 getGodLevel() const; diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp new file mode 100644 index 0000000000..9cf0a659c1 --- /dev/null +++ b/indra/newview/llagentcamera.cpp @@ -0,0 +1,2852 @@ +/** + * @file llagentcamera.cpp + * @brief LLAgent class implementation + * + * $LicenseInfo:firstyear=2001&license=viewergpl$ + * + * Copyright (c) 2001-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" +#include "llagentcamera.h" + +#include "pipeline.h" + +#include "llagent.h" +#include "llanimationstates.h" +#include "llfloatercamera.h" +#include "llfloaterreg.h" +#include "llhudmanager.h" +#include "lljoystickbutton.h" +#include "llselectmgr.h" +#include "llsmoothstep.h" +#include "lltoolmgr.h" +#include "llviewercamera.h" +#include "llviewercontrol.h" +#include "llviewerjoystick.h" +#include "llviewermenu.h" +#include "llviewerobjectlist.h" +#include "llviewerregion.h" +#include "llviewerwindow.h" +#include "llvoavatarself.h" +#include "llwindow.h" +#include "llworld.h" + +using namespace LLVOAvatarDefines; + +extern LLMenuBarGL* gMenuBarView; + +// Mousewheel camera zoom +const F32 MIN_ZOOM_FRACTION = 0.25f; +const F32 INITIAL_ZOOM_FRACTION = 1.f; +const F32 MAX_ZOOM_FRACTION = 8.f; + +const F32 CAMERA_ZOOM_HALF_LIFE = 0.07f; // seconds +const F32 FOV_ZOOM_HALF_LIFE = 0.07f; // seconds + +const F32 CAMERA_FOCUS_HALF_LIFE = 0.f;//0.02f; +const F32 CAMERA_LAG_HALF_LIFE = 0.25f; +const F32 MIN_CAMERA_LAG = 0.5f; +const F32 MAX_CAMERA_LAG = 5.f; + +const F32 CAMERA_COLLIDE_EPSILON = 0.1f; +const F32 MIN_CAMERA_DISTANCE = 0.1f; + +const F32 AVATAR_ZOOM_MIN_X_FACTOR = 0.55f; +const F32 AVATAR_ZOOM_MIN_Y_FACTOR = 0.7f; +const F32 AVATAR_ZOOM_MIN_Z_FACTOR = 1.15f; + +const F32 MAX_CAMERA_DISTANCE_FROM_AGENT = 50.f; + +const F32 MAX_CAMERA_SMOOTH_DISTANCE = 50.0f; + +const F32 HEAD_BUFFER_SIZE = 0.3f; + +const F32 CUSTOMIZE_AVATAR_CAMERA_ANIM_SLOP = 0.2f; + +const F32 LAND_MIN_ZOOM = 0.15f; + +const F32 AVATAR_MIN_ZOOM = 0.5f; +const F32 OBJECT_MIN_ZOOM = 0.02f; + +const F32 APPEARANCE_MIN_ZOOM = 0.39f; +const F32 APPEARANCE_MAX_ZOOM = 8.f; + +const F32 GROUND_TO_AIR_CAMERA_TRANSITION_TIME = 0.5f; +const F32 GROUND_TO_AIR_CAMERA_TRANSITION_START_TIME = 0.5f; + +const F32 OBJECT_EXTENTS_PADDING = 0.5f; + +// The agent instance. +LLAgentCamera gAgentCamera; + +//----------------------------------------------------------------------------- +// LLAgentCamera() +//----------------------------------------------------------------------------- +LLAgentCamera::LLAgentCamera() : + mInitialized(false), + + mDrawDistance( DEFAULT_FAR_PLANE ), + + mLookAt(NULL), + mPointAt(NULL), + + mHUDTargetZoom(1.f), + mHUDCurZoom(1.f), + + mForceMouselook(FALSE), + + mCameraMode( CAMERA_MODE_THIRD_PERSON ), + mLastCameraMode( CAMERA_MODE_THIRD_PERSON ), + + mCameraPreset(CAMERA_PRESET_REAR_VIEW), + + mCameraAnimating( FALSE ), + mAnimationCameraStartGlobal(), + mAnimationFocusStartGlobal(), + mAnimationTimer(), + mAnimationDuration(0.33f), + + mCameraFOVZoomFactor(0.f), + mCameraCurrentFOVZoomFactor(0.f), + mCameraFocusOffset(), + mCameraFOVDefault(DEFAULT_FIELD_OF_VIEW), + + mCameraCollidePlane(), + + mCurrentCameraDistance(2.f), // meters, set in init() + mTargetCameraDistance(2.f), + mCameraZoomFraction(1.f), // deprecated + mThirdPersonHeadOffset(0.f, 0.f, 1.f), + mSitCameraEnabled(FALSE), + mCameraSmoothingLastPositionGlobal(), + mCameraSmoothingLastPositionAgent(), + mCameraSmoothingStop(false), + + mCameraUpVector(LLVector3::z_axis), // default is straight up + + mFocusOnAvatar(TRUE), + mFocusGlobal(), + mFocusTargetGlobal(), + mFocusObject(NULL), + mFocusObjectDist(0.f), + mFocusObjectOffset(), + mFocusDotRadius( 0.1f ), // meters + mTrackFocusObject(TRUE), + mUIOffset(0.f), + + mAtKey(0), // Either 1, 0, or -1... indicates that movement-key is pressed + mWalkKey(0), // like AtKey, but causes less forward thrust + mLeftKey(0), + mUpKey(0), + mYawKey(0.f), + mPitchKey(0.f), + + mOrbitLeftKey(0.f), + mOrbitRightKey(0.f), + mOrbitUpKey(0.f), + mOrbitDownKey(0.f), + mOrbitInKey(0.f), + mOrbitOutKey(0.f), + + mPanUpKey(0.f), + mPanDownKey(0.f), + mPanLeftKey(0.f), + mPanRightKey(0.f), + mPanInKey(0.f), + mPanOutKey(0.f) +{ + mFollowCam.setMaxCameraDistantFromSubject( MAX_CAMERA_DISTANCE_FROM_AGENT ); + + clearGeneralKeys(); + clearOrbitKeys(); + clearPanKeys(); +} + +// Requires gSavedSettings to be initialized. +//----------------------------------------------------------------------------- +// init() +//----------------------------------------------------------------------------- +void LLAgentCamera::init() +{ + // *Note: this is where LLViewerCamera::getInstance() used to be constructed. + + mDrawDistance = gSavedSettings.getF32("RenderFarClip"); + + LLViewerCamera::getInstance()->setView(DEFAULT_FIELD_OF_VIEW); + // Leave at 0.1 meters until we have real near clip management + LLViewerCamera::getInstance()->setNear(0.1f); + LLViewerCamera::getInstance()->setFar(mDrawDistance); // if you want to change camera settings, do so in camera.h + LLViewerCamera::getInstance()->setAspect( gViewerWindow->getWorldViewAspectRatio() ); // default, overridden in LLViewerWindow::reshape + LLViewerCamera::getInstance()->setViewHeightInPixels(768); // default, overridden in LLViewerWindow::reshape + + mCameraFocusOffsetTarget = LLVector4(gSavedSettings.getVector3("CameraOffsetBuild")); + + mCameraPreset = (ECameraPreset) gSavedSettings.getU32("CameraPreset"); + + mCameraOffsetInitial[CAMERA_PRESET_REAR_VIEW] = gSavedSettings.getControl("CameraOffsetRearView"); + mCameraOffsetInitial[CAMERA_PRESET_FRONT_VIEW] = gSavedSettings.getControl("CameraOffsetFrontView"); + mCameraOffsetInitial[CAMERA_PRESET_GROUP_VIEW] = gSavedSettings.getControl("CameraOffsetGroupView"); + + mFocusOffsetInitial[CAMERA_PRESET_REAR_VIEW] = gSavedSettings.getControl("FocusOffsetRearView"); + mFocusOffsetInitial[CAMERA_PRESET_FRONT_VIEW] = gSavedSettings.getControl("FocusOffsetFrontView"); + mFocusOffsetInitial[CAMERA_PRESET_GROUP_VIEW] = gSavedSettings.getControl("FocusOffsetGroupView"); + + mCameraCollidePlane.clearVec(); + mCurrentCameraDistance = getCameraOffsetInitial().magVec() * gSavedSettings.getF32("CameraOffsetScale"); + mTargetCameraDistance = mCurrentCameraDistance; + mCameraZoomFraction = 1.f; + mTrackFocusObject = gSavedSettings.getBOOL("TrackFocusObject"); + + mInitialized = true; +} + +//----------------------------------------------------------------------------- +// cleanup() +//----------------------------------------------------------------------------- +void LLAgentCamera::cleanup() +{ + setSitCamera(LLUUID::null); + + if(mLookAt) + { + mLookAt->markDead() ; + mLookAt = NULL; + } + if(mPointAt) + { + mPointAt->markDead() ; + mPointAt = NULL; + } + setFocusObject(NULL); +} + +void LLAgentCamera::setAvatarObject(LLVOAvatarSelf* avatar) +{ + if (!mLookAt) + { + mLookAt = (LLHUDEffectLookAt *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_LOOKAT); + } + if (!mPointAt) + { + mPointAt = (LLHUDEffectPointAt *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_POINTAT); + } + + if (!mLookAt.isNull()) + { + mLookAt->setSourceObject(avatar); + } + if (!mPointAt.isNull()) + { + mPointAt->setSourceObject(avatar); + } +} + +//----------------------------------------------------------------------------- +// LLAgent() +//----------------------------------------------------------------------------- +LLAgentCamera::~LLAgentCamera() +{ + cleanup(); + + // *Note: this is where LLViewerCamera::getInstance() used to be deleted. +} + +// Change camera back to third person, stop the autopilot, +// deselect stuff, etc. +//----------------------------------------------------------------------------- +// resetView() +//----------------------------------------------------------------------------- +void LLAgentCamera::resetView(BOOL reset_camera, BOOL change_camera) +{ + if (gAgent.getAutoPilot()) + { + gAgent.stopAutoPilot(TRUE); + } + + if (!gNoRender) + { + LLSelectMgr::getInstance()->unhighlightAll(); + + // By popular request, keep land selection while walking around. JC + // LLViewerParcelMgr::getInstance()->deselectLand(); + + // force deselect when walking and attachment is selected + // this is so people don't wig out when their avatar moves without animating + if (LLSelectMgr::getInstance()->getSelection()->isAttachment()) + { + LLSelectMgr::getInstance()->deselectAll(); + } + + // Hide all popup menus + gMenuHolder->hideMenus(); + } + + if (change_camera && !gSavedSettings.getBOOL("FreezeTime")) + { + changeCameraToDefault(); + + if (LLViewerJoystick::getInstance()->getOverrideCamera()) + { + handle_toggle_flycam(); + } + + // reset avatar mode from eventual residual motion + if (LLToolMgr::getInstance()->inBuildMode()) + { + LLViewerJoystick::getInstance()->moveAvatar(true); + } + + //Camera Tool is needed for Free Camera Control Mode + if (!LLFloaterCamera::inFreeCameraMode()) + { + LLFloaterReg::hideInstance("build"); + + // Switch back to basic toolset + LLToolMgr::getInstance()->setCurrentToolset(gBasicToolset); + } + + gViewerWindow->showCursor(); + } + + + if (reset_camera && !gSavedSettings.getBOOL("FreezeTime")) + { + if (!gViewerWindow->getLeftMouseDown() && cameraThirdPerson()) + { + // leaving mouse-steer mode + LLVector3 agent_at_axis = gAgent.getAtAxis(); + agent_at_axis -= projected_vec(agent_at_axis, gAgent.getReferenceUpVector()); + agent_at_axis.normalize(); + gAgent.resetAxes(lerp(gAgent.getAtAxis(), agent_at_axis, LLCriticalDamp::getInterpolant(0.3f))); + } + + setFocusOnAvatar(TRUE, ANIMATE); + + mCameraFOVZoomFactor = 0.f; + } + + mHUDTargetZoom = 1.f; +} + +// Allow camera to be moved somewhere other than behind avatar. +//----------------------------------------------------------------------------- +// unlockView() +//----------------------------------------------------------------------------- +void LLAgentCamera::unlockView() +{ + if (getFocusOnAvatar()) + { + if (isAgentAvatarValid()) + { + setFocusGlobal(LLVector3d::zero, gAgentAvatarp->mID); + } + setFocusOnAvatar(FALSE, FALSE); // no animation + } +} + +//----------------------------------------------------------------------------- +// slamLookAt() +//----------------------------------------------------------------------------- +void LLAgentCamera::slamLookAt(const LLVector3 &look_at) +{ + LLVector3 look_at_norm = look_at; + look_at_norm.mV[VZ] = 0.f; + look_at_norm.normalize(); + gAgent.resetAxes(look_at_norm); +} + +//----------------------------------------------------------------------------- +// calcFocusOffset() +//----------------------------------------------------------------------------- +LLVector3 LLAgentCamera::calcFocusOffset(LLViewerObject *object, LLVector3 original_focus_point, S32 x, S32 y) +{ + LLMatrix4 obj_matrix = object->getRenderMatrix(); + LLQuaternion obj_rot = object->getRenderRotation(); + LLVector3 obj_pos = object->getRenderPosition(); + + BOOL is_avatar = object->isAvatar(); + // if is avatar - don't do any funk heuristics to position the focal point + // see DEV-30589 + if (is_avatar) + { + return original_focus_point - obj_pos; + } + + + LLQuaternion inv_obj_rot = ~obj_rot; // get inverse of rotation + LLVector3 object_extents = object->getScale(); + // make sure they object extents are non-zero + object_extents.clamp(0.001f, F32_MAX); + + // obj_to_cam_ray is unit vector pointing from object center to camera, in the coordinate frame of the object + LLVector3 obj_to_cam_ray = obj_pos - LLViewerCamera::getInstance()->getOrigin(); + obj_to_cam_ray.rotVec(inv_obj_rot); + obj_to_cam_ray.normalize(); + + // obj_to_cam_ray_proportions are the (positive) ratios of + // the obj_to_cam_ray x,y,z components with the x,y,z object dimensions. + LLVector3 obj_to_cam_ray_proportions; + obj_to_cam_ray_proportions.mV[VX] = llabs(obj_to_cam_ray.mV[VX] / object_extents.mV[VX]); + obj_to_cam_ray_proportions.mV[VY] = llabs(obj_to_cam_ray.mV[VY] / object_extents.mV[VY]); + obj_to_cam_ray_proportions.mV[VZ] = llabs(obj_to_cam_ray.mV[VZ] / object_extents.mV[VZ]); + + // find the largest ratio stored in obj_to_cam_ray_proportions + // this corresponds to the object's local axial plane (XY, YZ, XZ) that is *most* facing the camera + LLVector3 longest_object_axis; + // is x-axis longest? + if (obj_to_cam_ray_proportions.mV[VX] > obj_to_cam_ray_proportions.mV[VY] + && obj_to_cam_ray_proportions.mV[VX] > obj_to_cam_ray_proportions.mV[VZ]) + { + // then grab it + longest_object_axis.setVec(obj_matrix.getFwdRow4()); + } + // is y-axis longest? + else if (obj_to_cam_ray_proportions.mV[VY] > obj_to_cam_ray_proportions.mV[VZ]) + { + // then grab it + longest_object_axis.setVec(obj_matrix.getLeftRow4()); + } + // otherwise, use z axis + else + { + longest_object_axis.setVec(obj_matrix.getUpRow4()); + } + + // Use this axis as the normal to project mouse click on to plane with that normal, at the object center. + // This generates a point behind the mouse cursor that is approximately in the middle of the object in + // terms of depth. + // We do this to allow the camera rotation tool to "tumble" the object by rotating the camera. + // If the focus point were the object surface under the mouse, camera rotation would introduce an undesirable + // eccentricity to the object orientation + LLVector3 focus_plane_normal(longest_object_axis); + focus_plane_normal.normalize(); + + LLVector3d focus_pt_global; + gViewerWindow->mousePointOnPlaneGlobal(focus_pt_global, x, y, gAgent.getPosGlobalFromAgent(obj_pos), focus_plane_normal); + LLVector3 focus_pt = gAgent.getPosAgentFromGlobal(focus_pt_global); + + // find vector from camera to focus point in object space + LLVector3 camera_to_focus_vec = focus_pt - LLViewerCamera::getInstance()->getOrigin(); + camera_to_focus_vec.rotVec(inv_obj_rot); + + // find vector from object origin to focus point in object coordinates + LLVector3 focus_offset_from_object_center = focus_pt - obj_pos; + // convert to object-local space + focus_offset_from_object_center.rotVec(inv_obj_rot); + + // We need to project the focus point back into the bounding box of the focused object. + // Do this by calculating the XYZ scale factors needed to get focus offset back in bounds along the camera_focus axis + LLVector3 clip_fraction; + + // for each axis... + for (U32 axis = VX; axis <= VZ; axis++) + { + //...calculate distance that focus offset sits outside of bounding box along that axis... + //NOTE: dist_out_of_bounds keeps the sign of focus_offset_from_object_center + F32 dist_out_of_bounds; + if (focus_offset_from_object_center.mV[axis] > 0.f) + { + dist_out_of_bounds = llmax(0.f, focus_offset_from_object_center.mV[axis] - (object_extents.mV[axis] * 0.5f)); + } + else + { + dist_out_of_bounds = llmin(0.f, focus_offset_from_object_center.mV[axis] + (object_extents.mV[axis] * 0.5f)); + } + + //...then calculate the scale factor needed to push camera_to_focus_vec back in bounds along current axis + if (llabs(camera_to_focus_vec.mV[axis]) < 0.0001f) + { + // don't divide by very small number + clip_fraction.mV[axis] = 0.f; + } + else + { + clip_fraction.mV[axis] = dist_out_of_bounds / camera_to_focus_vec.mV[axis]; + } + } + + LLVector3 abs_clip_fraction = clip_fraction; + abs_clip_fraction.abs(); + + // find axis of focus offset that is *most* outside the bounding box and use that to + // rescale focus offset to inside object extents + if (abs_clip_fraction.mV[VX] > abs_clip_fraction.mV[VY] + && abs_clip_fraction.mV[VX] > abs_clip_fraction.mV[VZ]) + { + focus_offset_from_object_center -= clip_fraction.mV[VX] * camera_to_focus_vec; + } + else if (abs_clip_fraction.mV[VY] > abs_clip_fraction.mV[VZ]) + { + focus_offset_from_object_center -= clip_fraction.mV[VY] * camera_to_focus_vec; + } + else + { + focus_offset_from_object_center -= clip_fraction.mV[VZ] * camera_to_focus_vec; + } + + // convert back to world space + focus_offset_from_object_center.rotVec(obj_rot); + + // now, based on distance of camera from object relative to object size + // push the focus point towards the near surface of the object when (relatively) close to the objcet + // or keep the focus point in the object middle when (relatively) far + // NOTE: leave focus point in middle of avatars, since the behavior you want when alt-zooming on avatars + // is almost always "tumble about middle" and not "spin around surface point" + if (!is_avatar) + { + LLVector3 obj_rel = original_focus_point - object->getRenderPosition(); + + //now that we have the object relative position, we should bias toward the center of the object + //based on the distance of the camera to the focus point vs. the distance of the camera to the focus + + F32 relDist = llabs(obj_rel * LLViewerCamera::getInstance()->getAtAxis()); + F32 viewDist = dist_vec(obj_pos + obj_rel, LLViewerCamera::getInstance()->getOrigin()); + + + LLBBox obj_bbox = object->getBoundingBoxAgent(); + F32 bias = 0.f; + + // virtual_camera_pos is the camera position we are simulating by backing the camera off + // and adjusting the FOV + LLVector3 virtual_camera_pos = gAgent.getPosAgentFromGlobal(mFocusTargetGlobal + (getCameraPositionGlobal() - mFocusTargetGlobal) / (1.f + mCameraFOVZoomFactor)); + + // if the camera is inside the object (large, hollow objects, for example) + // leave focus point all the way to destination depth, away from object center + if(!obj_bbox.containsPointAgent(virtual_camera_pos)) + { + // perform magic number biasing of focus point towards surface vs. planar center + bias = clamp_rescale(relDist/viewDist, 0.1f, 0.7f, 0.0f, 1.0f); + obj_rel = lerp(focus_offset_from_object_center, obj_rel, bias); + } + + focus_offset_from_object_center = obj_rel; + } + + return focus_offset_from_object_center; +} + +//----------------------------------------------------------------------------- +// calcCameraMinDistance() +//----------------------------------------------------------------------------- +BOOL LLAgentCamera::calcCameraMinDistance(F32 &obj_min_distance) +{ + BOOL soft_limit = FALSE; // is the bounding box to be treated literally (volumes) or as an approximation (avatars) + + if (!mFocusObject || mFocusObject->isDead()) + { + obj_min_distance = 0.f; + return TRUE; + } + + if (mFocusObject->mDrawable.isNull()) + { +#ifdef LL_RELEASE_FOR_DOWNLOAD + llwarns << "Focus object with no drawable!" << llendl; +#else + mFocusObject->dump(); + llerrs << "Focus object with no drawable!" << llendl; +#endif + obj_min_distance = 0.f; + return TRUE; + } + + LLQuaternion inv_object_rot = ~mFocusObject->getRenderRotation(); + LLVector3 target_offset_origin = mFocusObjectOffset; + LLVector3 camera_offset_target(getCameraPositionAgent() - gAgent.getPosAgentFromGlobal(mFocusTargetGlobal)); + + // convert offsets into object local space + camera_offset_target.rotVec(inv_object_rot); + target_offset_origin.rotVec(inv_object_rot); + + // push around object extents based on target offset + LLVector3 object_extents = mFocusObject->getScale(); + if (mFocusObject->isAvatar()) + { + // fudge factors that lets you zoom in on avatars a bit more (which don't do FOV zoom) + object_extents.mV[VX] *= AVATAR_ZOOM_MIN_X_FACTOR; + object_extents.mV[VY] *= AVATAR_ZOOM_MIN_Y_FACTOR; + object_extents.mV[VZ] *= AVATAR_ZOOM_MIN_Z_FACTOR; + soft_limit = TRUE; + } + LLVector3 abs_target_offset = target_offset_origin; + abs_target_offset.abs(); + + LLVector3 target_offset_dir = target_offset_origin; + F32 object_radius = mFocusObject->getVObjRadius(); + + BOOL target_outside_object_extents = FALSE; + + for (U32 i = VX; i <= VZ; i++) + { + if (abs_target_offset.mV[i] * 2.f > object_extents.mV[i] + OBJECT_EXTENTS_PADDING) + { + target_outside_object_extents = TRUE; + } + if (camera_offset_target.mV[i] > 0.f) + { + object_extents.mV[i] -= target_offset_origin.mV[i] * 2.f; + } + else + { + object_extents.mV[i] += target_offset_origin.mV[i] * 2.f; + } + } + + // don't shrink the object extents so far that the object inverts + object_extents.clamp(0.001f, F32_MAX); + + // move into first octant + LLVector3 camera_offset_target_abs_norm = camera_offset_target; + camera_offset_target_abs_norm.abs(); + // make sure offset is non-zero + camera_offset_target_abs_norm.clamp(0.001f, F32_MAX); + camera_offset_target_abs_norm.normalize(); + + // find camera position relative to normalized object extents + LLVector3 camera_offset_target_scaled = camera_offset_target_abs_norm; + camera_offset_target_scaled.mV[VX] /= object_extents.mV[VX]; + camera_offset_target_scaled.mV[VY] /= object_extents.mV[VY]; + camera_offset_target_scaled.mV[VZ] /= object_extents.mV[VZ]; + + if (camera_offset_target_scaled.mV[VX] > camera_offset_target_scaled.mV[VY] && + camera_offset_target_scaled.mV[VX] > camera_offset_target_scaled.mV[VZ]) + { + if (camera_offset_target_abs_norm.mV[VX] < 0.001f) + { + obj_min_distance = object_extents.mV[VX] * 0.5f; + } + else + { + obj_min_distance = object_extents.mV[VX] * 0.5f / camera_offset_target_abs_norm.mV[VX]; + } + } + else if (camera_offset_target_scaled.mV[VY] > camera_offset_target_scaled.mV[VZ]) + { + if (camera_offset_target_abs_norm.mV[VY] < 0.001f) + { + obj_min_distance = object_extents.mV[VY] * 0.5f; + } + else + { + obj_min_distance = object_extents.mV[VY] * 0.5f / camera_offset_target_abs_norm.mV[VY]; + } + } + else + { + if (camera_offset_target_abs_norm.mV[VZ] < 0.001f) + { + obj_min_distance = object_extents.mV[VZ] * 0.5f; + } + else + { + obj_min_distance = object_extents.mV[VZ] * 0.5f / camera_offset_target_abs_norm.mV[VZ]; + } + } + + LLVector3 object_split_axis; + LLVector3 target_offset_scaled = target_offset_origin; + target_offset_scaled.abs(); + target_offset_scaled.normalize(); + target_offset_scaled.mV[VX] /= object_extents.mV[VX]; + target_offset_scaled.mV[VY] /= object_extents.mV[VY]; + target_offset_scaled.mV[VZ] /= object_extents.mV[VZ]; + + if (target_offset_scaled.mV[VX] > target_offset_scaled.mV[VY] && + target_offset_scaled.mV[VX] > target_offset_scaled.mV[VZ]) + { + object_split_axis = LLVector3::x_axis; + } + else if (target_offset_scaled.mV[VY] > target_offset_scaled.mV[VZ]) + { + object_split_axis = LLVector3::y_axis; + } + else + { + object_split_axis = LLVector3::z_axis; + } + + LLVector3 camera_offset_object(getCameraPositionAgent() - mFocusObject->getPositionAgent()); + + // length projected orthogonal to target offset + F32 camera_offset_dist = (camera_offset_object - target_offset_dir * (camera_offset_object * target_offset_dir)).magVec(); + + // calculate whether the target point would be "visible" if it were outside the bounding box + // on the opposite of the splitting plane defined by object_split_axis; + BOOL exterior_target_visible = FALSE; + if (camera_offset_dist > object_radius) + { + // target is visible from camera, so turn off fov zoom + exterior_target_visible = TRUE; + } + + F32 camera_offset_clip = camera_offset_object * object_split_axis; + F32 target_offset_clip = target_offset_dir * object_split_axis; + + // target has moved outside of object extents + // check to see if camera and target are on same side + if (target_outside_object_extents) + { + if (camera_offset_clip > 0.f && target_offset_clip > 0.f) + { + return FALSE; + } + else if (camera_offset_clip < 0.f && target_offset_clip < 0.f) + { + return FALSE; + } + } + + // clamp obj distance to diagonal of 10 by 10 cube + obj_min_distance = llmin(obj_min_distance, 10.f * F_SQRT3); + + obj_min_distance += LLViewerCamera::getInstance()->getNear() + (soft_limit ? 0.1f : 0.2f); + + return TRUE; +} + +F32 LLAgentCamera::getCameraZoomFraction() +{ + // 0.f -> camera zoomed all the way out + // 1.f -> camera zoomed all the way in + LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection(); + if (selection->getObjectCount() && selection->getSelectType() == SELECT_TYPE_HUD) + { + // already [0,1] + return mHUDTargetZoom; + } + else if (mFocusOnAvatar && cameraThirdPerson()) + { + return clamp_rescale(mCameraZoomFraction, MIN_ZOOM_FRACTION, MAX_ZOOM_FRACTION, 1.f, 0.f); + } + else if (cameraCustomizeAvatar()) + { + F32 distance = (F32)mCameraFocusOffsetTarget.magVec(); + return clamp_rescale(distance, APPEARANCE_MIN_ZOOM, APPEARANCE_MAX_ZOOM, 1.f, 0.f ); + } + else + { + F32 min_zoom; + const F32 DIST_FUDGE = 16.f; // meters + F32 max_zoom = llmin(mDrawDistance - DIST_FUDGE, + LLWorld::getInstance()->getRegionWidthInMeters() - DIST_FUDGE, + MAX_CAMERA_DISTANCE_FROM_AGENT); + + F32 distance = (F32)mCameraFocusOffsetTarget.magVec(); + if (mFocusObject.notNull()) + { + if (mFocusObject->isAvatar()) + { + min_zoom = AVATAR_MIN_ZOOM; + } + else + { + min_zoom = OBJECT_MIN_ZOOM; + } + } + else + { + min_zoom = LAND_MIN_ZOOM; + } + + return clamp_rescale(distance, min_zoom, max_zoom, 1.f, 0.f); + } +} + +void LLAgentCamera::setCameraZoomFraction(F32 fraction) +{ + // 0.f -> camera zoomed all the way out + // 1.f -> camera zoomed all the way in + LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection(); + + if (selection->getObjectCount() && selection->getSelectType() == SELECT_TYPE_HUD) + { + mHUDTargetZoom = fraction; + } + else if (mFocusOnAvatar && cameraThirdPerson()) + { + mCameraZoomFraction = rescale(fraction, 0.f, 1.f, MAX_ZOOM_FRACTION, MIN_ZOOM_FRACTION); + } + else if (cameraCustomizeAvatar()) + { + LLVector3d camera_offset_dir = mCameraFocusOffsetTarget; + camera_offset_dir.normalize(); + mCameraFocusOffsetTarget = camera_offset_dir * rescale(fraction, 0.f, 1.f, APPEARANCE_MAX_ZOOM, APPEARANCE_MIN_ZOOM); + } + else + { + F32 min_zoom = LAND_MIN_ZOOM; + const F32 DIST_FUDGE = 16.f; // meters + F32 max_zoom = llmin(mDrawDistance - DIST_FUDGE, + LLWorld::getInstance()->getRegionWidthInMeters() - DIST_FUDGE, + MAX_CAMERA_DISTANCE_FROM_AGENT); + + if (mFocusObject.notNull()) + { + if (mFocusObject.notNull()) + { + if (mFocusObject->isAvatar()) + { + min_zoom = AVATAR_MIN_ZOOM; + } + else + { + min_zoom = OBJECT_MIN_ZOOM; + } + } + } + + LLVector3d camera_offset_dir = mCameraFocusOffsetTarget; + camera_offset_dir.normalize(); + mCameraFocusOffsetTarget = camera_offset_dir * rescale(fraction, 0.f, 1.f, max_zoom, min_zoom); + } + startCameraAnimation(); +} + + +//----------------------------------------------------------------------------- +// cameraOrbitAround() +//----------------------------------------------------------------------------- +void LLAgentCamera::cameraOrbitAround(const F32 radians) +{ + LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection(); + if (selection->getObjectCount() && selection->getSelectType() == SELECT_TYPE_HUD) + { + // do nothing for hud selection + } + else if (mFocusOnAvatar && (mCameraMode == CAMERA_MODE_THIRD_PERSON || mCameraMode == CAMERA_MODE_FOLLOW)) + { + gAgent.yaw(radians); + } + else + { + mCameraFocusOffsetTarget.rotVec(radians, 0.f, 0.f, 1.f); + + cameraZoomIn(1.f); + } +} + + +//----------------------------------------------------------------------------- +// cameraOrbitOver() +//----------------------------------------------------------------------------- +void LLAgentCamera::cameraOrbitOver(const F32 angle) +{ + LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection(); + if (selection->getObjectCount() && selection->getSelectType() == SELECT_TYPE_HUD) + { + // do nothing for hud selection + } + else if (mFocusOnAvatar && mCameraMode == CAMERA_MODE_THIRD_PERSON) + { + gAgent.pitch(angle); + } + else + { + LLVector3 camera_offset_unit(mCameraFocusOffsetTarget); + camera_offset_unit.normalize(); + + F32 angle_from_up = acos( camera_offset_unit * gAgent.getReferenceUpVector() ); + + LLVector3d left_axis; + left_axis.setVec(LLViewerCamera::getInstance()->getLeftAxis()); + F32 new_angle = llclamp(angle_from_up - angle, 1.f * DEG_TO_RAD, 179.f * DEG_TO_RAD); + mCameraFocusOffsetTarget.rotVec(angle_from_up - new_angle, left_axis); + + cameraZoomIn(1.f); + } +} + +//----------------------------------------------------------------------------- +// cameraZoomIn() +//----------------------------------------------------------------------------- +void LLAgentCamera::cameraZoomIn(const F32 fraction) +{ + if (gDisconnected) + { + return; + } + + LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection(); + if (selection->getObjectCount() && selection->getSelectType() == SELECT_TYPE_HUD) + { + // just update hud zoom level + mHUDTargetZoom /= fraction; + return; + } + + + LLVector3d camera_offset(mCameraFocusOffsetTarget); + LLVector3d camera_offset_unit(mCameraFocusOffsetTarget); + F32 min_zoom = LAND_MIN_ZOOM; + F32 current_distance = (F32)camera_offset_unit.normalize(); + F32 new_distance = current_distance * fraction; + + // Don't move through focus point + if (mFocusObject) + { + LLVector3 camera_offset_dir((F32)camera_offset_unit.mdV[VX], (F32)camera_offset_unit.mdV[VY], (F32)camera_offset_unit.mdV[VZ]); + + if (mFocusObject->isAvatar()) + { + calcCameraMinDistance(min_zoom); + } + else + { + min_zoom = OBJECT_MIN_ZOOM; + } + } + + new_distance = llmax(new_distance, min_zoom); + + // Don't zoom too far back + const F32 DIST_FUDGE = 16.f; // meters + F32 max_distance = llmin(mDrawDistance - DIST_FUDGE, + LLWorld::getInstance()->getRegionWidthInMeters() - DIST_FUDGE ); + + if (new_distance > max_distance) + { + new_distance = max_distance; + + /* + // Unless camera is unlocked + if (!LLViewerCamera::sDisableCameraConstraints) + { + return; + } + */ + } + + if( cameraCustomizeAvatar() ) + { + new_distance = llclamp( new_distance, APPEARANCE_MIN_ZOOM, APPEARANCE_MAX_ZOOM ); + } + + mCameraFocusOffsetTarget = new_distance * camera_offset_unit; +} + +//----------------------------------------------------------------------------- +// cameraOrbitIn() +//----------------------------------------------------------------------------- +void LLAgentCamera::cameraOrbitIn(const F32 meters) +{ + if (mFocusOnAvatar && mCameraMode == CAMERA_MODE_THIRD_PERSON) + { + F32 camera_offset_dist = llmax(0.001f, getCameraOffsetInitial().magVec() * gSavedSettings.getF32("CameraOffsetScale")); + + mCameraZoomFraction = (mTargetCameraDistance - meters) / camera_offset_dist; + + if (!gSavedSettings.getBOOL("FreezeTime") && mCameraZoomFraction < MIN_ZOOM_FRACTION && meters > 0.f) + { + // No need to animate, camera is already there. + changeCameraToMouselook(FALSE); + } + + mCameraZoomFraction = llclamp(mCameraZoomFraction, MIN_ZOOM_FRACTION, MAX_ZOOM_FRACTION); + } + else + { + LLVector3d camera_offset(mCameraFocusOffsetTarget); + LLVector3d camera_offset_unit(mCameraFocusOffsetTarget); + F32 current_distance = (F32)camera_offset_unit.normalize(); + F32 new_distance = current_distance - meters; + F32 min_zoom = LAND_MIN_ZOOM; + + // Don't move through focus point + if (mFocusObject.notNull()) + { + if (mFocusObject->isAvatar()) + { + min_zoom = AVATAR_MIN_ZOOM; + } + else + { + min_zoom = OBJECT_MIN_ZOOM; + } + } + + new_distance = llmax(new_distance, min_zoom); + + // Don't zoom too far back + const F32 DIST_FUDGE = 16.f; // meters + F32 max_distance = llmin(mDrawDistance - DIST_FUDGE, + LLWorld::getInstance()->getRegionWidthInMeters() - DIST_FUDGE ); + + if (new_distance > max_distance) + { + // Unless camera is unlocked + if (!gSavedSettings.getBOOL("DisableCameraConstraints")) + { + return; + } + } + + if( CAMERA_MODE_CUSTOMIZE_AVATAR == getCameraMode() ) + { + new_distance = llclamp( new_distance, APPEARANCE_MIN_ZOOM, APPEARANCE_MAX_ZOOM ); + } + + // Compute new camera offset + mCameraFocusOffsetTarget = new_distance * camera_offset_unit; + cameraZoomIn(1.f); + } +} + + +//----------------------------------------------------------------------------- +// cameraPanIn() +//----------------------------------------------------------------------------- +void LLAgentCamera::cameraPanIn(F32 meters) +{ + LLVector3d at_axis; + at_axis.setVec(LLViewerCamera::getInstance()->getAtAxis()); + + mFocusTargetGlobal += meters * at_axis; + mFocusGlobal = mFocusTargetGlobal; + // don't enforce zoom constraints as this is the only way for users to get past them easily + updateFocusOffset(); + // NOTE: panning movements expect the camera to move exactly with the focus target, not animated behind -Nyx + mCameraSmoothingLastPositionGlobal = calcCameraPositionTargetGlobal(); +} + +//----------------------------------------------------------------------------- +// cameraPanLeft() +//----------------------------------------------------------------------------- +void LLAgentCamera::cameraPanLeft(F32 meters) +{ + LLVector3d left_axis; + left_axis.setVec(LLViewerCamera::getInstance()->getLeftAxis()); + + mFocusTargetGlobal += meters * left_axis; + mFocusGlobal = mFocusTargetGlobal; + + // disable smoothing for camera pan, which causes some residents unhappiness + mCameraSmoothingStop = true; + + cameraZoomIn(1.f); + updateFocusOffset(); + // NOTE: panning movements expect the camera to move exactly with the focus target, not animated behind - Nyx + mCameraSmoothingLastPositionGlobal = calcCameraPositionTargetGlobal(); +} + +//----------------------------------------------------------------------------- +// cameraPanUp() +//----------------------------------------------------------------------------- +void LLAgentCamera::cameraPanUp(F32 meters) +{ + LLVector3d up_axis; + up_axis.setVec(LLViewerCamera::getInstance()->getUpAxis()); + + mFocusTargetGlobal += meters * up_axis; + mFocusGlobal = mFocusTargetGlobal; + + // disable smoothing for camera pan, which causes some residents unhappiness + mCameraSmoothingStop = true; + + cameraZoomIn(1.f); + updateFocusOffset(); + // NOTE: panning movements expect the camera to move exactly with the focus target, not animated behind -Nyx + mCameraSmoothingLastPositionGlobal = calcCameraPositionTargetGlobal(); +} + +//----------------------------------------------------------------------------- +// updateLookAt() +//----------------------------------------------------------------------------- +void LLAgentCamera::updateLookAt(const S32 mouse_x, const S32 mouse_y) +{ + static LLVector3 last_at_axis; + + if (!isAgentAvatarValid()) return; + + LLQuaternion av_inv_rot = ~gAgentAvatarp->mRoot.getWorldRotation(); + LLVector3 root_at = LLVector3::x_axis * gAgentAvatarp->mRoot.getWorldRotation(); + + if ((gViewerWindow->getMouseVelocityStat()->getCurrent() < 0.01f) && + (root_at * last_at_axis > 0.95f)) + { + LLVector3 vel = gAgentAvatarp->getVelocity(); + if (vel.magVecSquared() > 4.f) + { + setLookAt(LOOKAT_TARGET_IDLE, gAgentAvatarp, vel * av_inv_rot); + } + else + { + // *FIX: rotate mframeagent by sit object's rotation? + LLQuaternion look_rotation = gAgentAvatarp->isSitting() ? gAgentAvatarp->getRenderRotation() : gAgent.getFrameAgent().getQuaternion(); // use camera's current rotation + LLVector3 look_offset = LLVector3(2.f, 0.f, 0.f) * look_rotation * av_inv_rot; + setLookAt(LOOKAT_TARGET_IDLE, gAgentAvatarp, look_offset); + } + last_at_axis = root_at; + return; + } + + last_at_axis = root_at; + + if (CAMERA_MODE_CUSTOMIZE_AVATAR == getCameraMode()) + { + setLookAt(LOOKAT_TARGET_NONE, gAgentAvatarp, LLVector3(-2.f, 0.f, 0.f)); + } + else + { + // Move head based on cursor position + ELookAtType lookAtType = LOOKAT_TARGET_NONE; + LLVector3 headLookAxis; + LLCoordFrame frameCamera = *((LLCoordFrame*)LLViewerCamera::getInstance()); + + if (cameraMouselook()) + { + lookAtType = LOOKAT_TARGET_MOUSELOOK; + } + else if (cameraThirdPerson()) + { + // range from -.5 to .5 + F32 x_from_center = + ((F32) mouse_x / (F32) gViewerWindow->getWorldViewWidthScaled() ) - 0.5f; + F32 y_from_center = + ((F32) mouse_y / (F32) gViewerWindow->getWorldViewHeightScaled() ) - 0.5f; + + frameCamera.yaw( - x_from_center * gSavedSettings.getF32("YawFromMousePosition") * DEG_TO_RAD); + frameCamera.pitch( - y_from_center * gSavedSettings.getF32("PitchFromMousePosition") * DEG_TO_RAD); + lookAtType = LOOKAT_TARGET_FREELOOK; + } + + headLookAxis = frameCamera.getAtAxis(); + // RN: we use world-space offset for mouselook and freelook + //headLookAxis = headLookAxis * av_inv_rot; + setLookAt(lookAtType, gAgentAvatarp, headLookAxis); + } +} + +//----------------------------------------------------------------------------- +// updateCamera() +//----------------------------------------------------------------------------- +void LLAgentCamera::updateCamera() +{ + static LLFastTimer::DeclareTimer ftm("Camera"); + LLFastTimer t(ftm); + + //Ventrella - changed camera_skyward to the new global "mCameraUpVector" + mCameraUpVector = LLVector3::z_axis; + //LLVector3 camera_skyward(0.f, 0.f, 1.f); + //end Ventrella + + U32 camera_mode = mCameraAnimating ? mLastCameraMode : mCameraMode; + + validateFocusObject(); + + if (isAgentAvatarValid() && + gAgentAvatarp->isSitting() && + camera_mode == CAMERA_MODE_MOUSELOOK) + { + //Ventrella + //changed camera_skyward to the new global "mCameraUpVector" + mCameraUpVector = mCameraUpVector * gAgentAvatarp->getRenderRotation(); + //end Ventrella + } + + if (cameraThirdPerson() && mFocusOnAvatar && LLFollowCamMgr::getActiveFollowCamParams()) + { + changeCameraToFollow(); + } + + //Ventrella + //NOTE - this needs to be integrated into a general upVector system here within llAgent. + if ( camera_mode == CAMERA_MODE_FOLLOW && mFocusOnAvatar ) + { + mCameraUpVector = mFollowCam.getUpVector(); + } + //end Ventrella + + if (mSitCameraEnabled) + { + if (mSitCameraReferenceObject->isDead()) + { + setSitCamera(LLUUID::null); + } + } + + // Update UI with our camera inputs + LLFloaterCamera* camera_floater = LLFloaterReg::findTypedInstance<LLFloaterCamera>("camera"); + if (camera_floater) + { + camera_floater->mRotate->setToggleState(gAgentCamera.getOrbitRightKey() > 0.f, // left + gAgentCamera.getOrbitUpKey() > 0.f, // top + gAgentCamera.getOrbitLeftKey() > 0.f, // right + gAgentCamera.getOrbitDownKey() > 0.f); // bottom + + camera_floater->mTrack->setToggleState(gAgentCamera.getPanLeftKey() > 0.f, // left + gAgentCamera.getPanUpKey() > 0.f, // top + gAgentCamera.getPanRightKey() > 0.f, // right + gAgentCamera.getPanDownKey() > 0.f); // bottom + } + + // Handle camera movement based on keyboard. + const F32 ORBIT_OVER_RATE = 90.f * DEG_TO_RAD; // radians per second + const F32 ORBIT_AROUND_RATE = 90.f * DEG_TO_RAD; // radians per second + const F32 PAN_RATE = 5.f; // meters per second + + if (gAgentCamera.getOrbitUpKey() || gAgentCamera.getOrbitDownKey()) + { + F32 input_rate = gAgentCamera.getOrbitUpKey() - gAgentCamera.getOrbitDownKey(); + cameraOrbitOver( input_rate * ORBIT_OVER_RATE / gFPSClamped ); + } + + if (gAgentCamera.getOrbitLeftKey() || gAgentCamera.getOrbitRightKey()) + { + F32 input_rate = gAgentCamera.getOrbitLeftKey() - gAgentCamera.getOrbitRightKey(); + cameraOrbitAround(input_rate * ORBIT_AROUND_RATE / gFPSClamped); + } + + if (gAgentCamera.getOrbitInKey() || gAgentCamera.getOrbitOutKey()) + { + F32 input_rate = gAgentCamera.getOrbitInKey() - gAgentCamera.getOrbitOutKey(); + + LLVector3d to_focus = gAgent.getPosGlobalFromAgent(LLViewerCamera::getInstance()->getOrigin()) - calcFocusPositionTargetGlobal(); + F32 distance_to_focus = (F32)to_focus.magVec(); + // Move at distance (in meters) meters per second + cameraOrbitIn( input_rate * distance_to_focus / gFPSClamped ); + } + + if (gAgentCamera.getPanInKey() || gAgentCamera.getPanOutKey()) + { + F32 input_rate = gAgentCamera.getPanInKey() - gAgentCamera.getPanOutKey(); + cameraPanIn(input_rate * PAN_RATE / gFPSClamped); + } + + if (gAgentCamera.getPanRightKey() || gAgentCamera.getPanLeftKey()) + { + F32 input_rate = gAgentCamera.getPanRightKey() - gAgentCamera.getPanLeftKey(); + cameraPanLeft(input_rate * -PAN_RATE / gFPSClamped ); + } + + if (gAgentCamera.getPanUpKey() || gAgentCamera.getPanDownKey()) + { + F32 input_rate = gAgentCamera.getPanUpKey() - gAgentCamera.getPanDownKey(); + cameraPanUp(input_rate * PAN_RATE / gFPSClamped ); + } + + // Clear camera keyboard keys. + gAgentCamera.clearOrbitKeys(); + gAgentCamera.clearPanKeys(); + + // lerp camera focus offset + mCameraFocusOffset = lerp(mCameraFocusOffset, mCameraFocusOffsetTarget, LLCriticalDamp::getInterpolant(CAMERA_FOCUS_HALF_LIFE)); + + //Ventrella + if ( mCameraMode == CAMERA_MODE_FOLLOW ) + { + if (isAgentAvatarValid()) + { + //-------------------------------------------------------------------------------- + // this is where the avatar's position and rotation are given to followCam, and + // where it is updated. All three of its attributes are updated: (1) position, + // (2) focus, and (3) upvector. They can then be queried elsewhere in llAgent. + //-------------------------------------------------------------------------------- + // *TODO: use combined rotation of frameagent and sit object + LLQuaternion avatarRotationForFollowCam = gAgentAvatarp->isSitting() ? gAgentAvatarp->getRenderRotation() : gAgent.getFrameAgent().getQuaternion(); + + LLFollowCamParams* current_cam = LLFollowCamMgr::getActiveFollowCamParams(); + if (current_cam) + { + mFollowCam.copyParams(*current_cam); + mFollowCam.setSubjectPositionAndRotation( gAgentAvatarp->getRenderPosition(), avatarRotationForFollowCam ); + mFollowCam.update(); + LLViewerJoystick::getInstance()->setCameraNeedsUpdate(true); + } + else + { + changeCameraToThirdPerson(TRUE); + } + } + } + // end Ventrella + + BOOL hit_limit; + LLVector3d camera_pos_global; + LLVector3d camera_target_global = calcCameraPositionTargetGlobal(&hit_limit); + mCameraVirtualPositionAgent = gAgent.getPosAgentFromGlobal(camera_target_global); + LLVector3d focus_target_global = calcFocusPositionTargetGlobal(); + + // perform field of view correction + mCameraFOVZoomFactor = calcCameraFOVZoomFactor(); + camera_target_global = focus_target_global + (camera_target_global - focus_target_global) * (1.f + mCameraFOVZoomFactor); + + gAgent.setShowAvatar(TRUE); // can see avatar by default + + // Adjust position for animation + if (mCameraAnimating) + { + F32 time = mAnimationTimer.getElapsedTimeF32(); + + // yet another instance of critically damped motion, hooray! + // F32 fraction_of_animation = 1.f - pow(2.f, -time / CAMERA_ZOOM_HALF_LIFE); + + // linear interpolation + F32 fraction_of_animation = time / mAnimationDuration; + + BOOL isfirstPerson = mCameraMode == CAMERA_MODE_MOUSELOOK; + BOOL wasfirstPerson = mLastCameraMode == CAMERA_MODE_MOUSELOOK; + F32 fraction_animation_to_skip; + + if (mAnimationCameraStartGlobal == camera_target_global) + { + fraction_animation_to_skip = 0.f; + } + else + { + LLVector3d cam_delta = mAnimationCameraStartGlobal - camera_target_global; + fraction_animation_to_skip = HEAD_BUFFER_SIZE / (F32)cam_delta.magVec(); + } + F32 animation_start_fraction = (wasfirstPerson) ? fraction_animation_to_skip : 0.f; + F32 animation_finish_fraction = (isfirstPerson) ? (1.f - fraction_animation_to_skip) : 1.f; + + if (fraction_of_animation < animation_finish_fraction) + { + if (fraction_of_animation < animation_start_fraction || fraction_of_animation > animation_finish_fraction ) + { + gAgent.setShowAvatar(FALSE); + } + + // ...adjust position for animation + F32 smooth_fraction_of_animation = llsmoothstep(0.0f, 1.0f, fraction_of_animation); + camera_pos_global = lerp(mAnimationCameraStartGlobal, camera_target_global, smooth_fraction_of_animation); + mFocusGlobal = lerp(mAnimationFocusStartGlobal, focus_target_global, smooth_fraction_of_animation); + } + else + { + // ...animation complete + mCameraAnimating = FALSE; + + camera_pos_global = camera_target_global; + mFocusGlobal = focus_target_global; + + gAgent.endAnimationUpdateUI(); + gAgent.setShowAvatar(TRUE); + } + + if (isAgentAvatarValid() && (mCameraMode != CAMERA_MODE_MOUSELOOK)) + { + gAgentAvatarp->updateAttachmentVisibility(mCameraMode); + } + } + else + { + camera_pos_global = camera_target_global; + mFocusGlobal = focus_target_global; + gAgent.setShowAvatar(TRUE); + } + + // smoothing + if (TRUE) + { + LLVector3d agent_pos = gAgent.getPositionGlobal(); + LLVector3d camera_pos_agent = camera_pos_global - agent_pos; + // Sitting on what you're manipulating can cause camera jitter with smoothing. + // This turns off smoothing while editing. -MG + bool in_build_mode = LLToolMgr::getInstance()->inBuildMode(); + mCameraSmoothingStop = mCameraSmoothingStop || in_build_mode; + + if (cameraThirdPerson() && !mCameraSmoothingStop) + { + const F32 SMOOTHING_HALF_LIFE = 0.02f; + + F32 smoothing = LLCriticalDamp::getInterpolant(gSavedSettings.getF32("CameraPositionSmoothing") * SMOOTHING_HALF_LIFE, FALSE); + + if (!mFocusObject) // we differentiate on avatar mode + { + // for avatar-relative focus, we smooth in avatar space - + // the avatar moves too jerkily w/r/t global space to smooth there. + + LLVector3d delta = camera_pos_agent - mCameraSmoothingLastPositionAgent; + if (delta.magVec() < MAX_CAMERA_SMOOTH_DISTANCE) // only smooth over short distances please + { + camera_pos_agent = lerp(mCameraSmoothingLastPositionAgent, camera_pos_agent, smoothing); + camera_pos_global = camera_pos_agent + agent_pos; + } + } + else + { + LLVector3d delta = camera_pos_global - mCameraSmoothingLastPositionGlobal; + if (delta.magVec() < MAX_CAMERA_SMOOTH_DISTANCE) // only smooth over short distances please + { + camera_pos_global = lerp(mCameraSmoothingLastPositionGlobal, camera_pos_global, smoothing); + } + } + } + + mCameraSmoothingLastPositionGlobal = camera_pos_global; + mCameraSmoothingLastPositionAgent = camera_pos_agent; + mCameraSmoothingStop = false; + } + + + mCameraCurrentFOVZoomFactor = lerp(mCameraCurrentFOVZoomFactor, mCameraFOVZoomFactor, LLCriticalDamp::getInterpolant(FOV_ZOOM_HALF_LIFE)); + +// llinfos << "Current FOV Zoom: " << mCameraCurrentFOVZoomFactor << " Target FOV Zoom: " << mCameraFOVZoomFactor << " Object penetration: " << mFocusObjectDist << llendl; + + F32 ui_offset = 0.f; + if( CAMERA_MODE_CUSTOMIZE_AVATAR == mCameraMode ) + { + ui_offset = calcCustomizeAvatarUIOffset( camera_pos_global ); + } + + + LLVector3 focus_agent = gAgent.getPosAgentFromGlobal(mFocusGlobal); + + mCameraPositionAgent = gAgent.getPosAgentFromGlobal(camera_pos_global); + + // Move the camera + + //Ventrella + LLViewerCamera::getInstance()->updateCameraLocation(mCameraPositionAgent, mCameraUpVector, focus_agent); + //LLViewerCamera::getInstance()->updateCameraLocation(mCameraPositionAgent, camera_skyward, focus_agent); + //end Ventrella + + //RN: translate UI offset after camera is oriented properly + LLViewerCamera::getInstance()->translate(LLViewerCamera::getInstance()->getLeftAxis() * ui_offset); + + // Change FOV + LLViewerCamera::getInstance()->setView(LLViewerCamera::getInstance()->getDefaultFOV() / (1.f + mCameraCurrentFOVZoomFactor)); + + // follow camera when in customize mode + if (cameraCustomizeAvatar()) + { + setLookAt(LOOKAT_TARGET_FOCUS, NULL, mCameraPositionAgent); + } + + // update the travel distance stat + // this isn't directly related to the camera + // but this seemed like the best place to do this + LLVector3d global_pos = gAgent.getPositionGlobal(); + if (!gAgent.getLastPositionGlobal().isExactlyZero()) + { + LLVector3d delta = global_pos - gAgent.getLastPositionGlobal(); + gAgent.setDistanceTraveled(gAgent.getDistanceTraveled() + delta.magVec()); + } + gAgent.setLastPositionGlobal(global_pos); + + if (LLVOAvatar::sVisibleInFirstPerson && isAgentAvatarValid() && !gAgentAvatarp->isSitting() && cameraMouselook()) + { + LLVector3 head_pos = gAgentAvatarp->mHeadp->getWorldPosition() + + LLVector3(0.08f, 0.f, 0.05f) * gAgentAvatarp->mHeadp->getWorldRotation() + + LLVector3(0.1f, 0.f, 0.f) * gAgentAvatarp->mPelvisp->getWorldRotation(); + LLVector3 diff = mCameraPositionAgent - head_pos; + diff = diff * ~gAgentAvatarp->mRoot.getWorldRotation(); + + LLJoint* torso_joint = gAgentAvatarp->mTorsop; + LLJoint* chest_joint = gAgentAvatarp->mChestp; + LLVector3 torso_scale = torso_joint->getScale(); + LLVector3 chest_scale = chest_joint->getScale(); + + // shorten avatar skeleton to avoid foot interpenetration + if (!gAgentAvatarp->mInAir) + { + LLVector3 chest_offset = LLVector3(0.f, 0.f, chest_joint->getPosition().mV[VZ]) * torso_joint->getWorldRotation(); + F32 z_compensate = llclamp(-diff.mV[VZ], -0.2f, 1.f); + F32 scale_factor = llclamp(1.f - ((z_compensate * 0.5f) / chest_offset.mV[VZ]), 0.5f, 1.2f); + torso_joint->setScale(LLVector3(1.f, 1.f, scale_factor)); + + LLJoint* neck_joint = gAgentAvatarp->mNeckp; + LLVector3 neck_offset = LLVector3(0.f, 0.f, neck_joint->getPosition().mV[VZ]) * chest_joint->getWorldRotation(); + scale_factor = llclamp(1.f - ((z_compensate * 0.5f) / neck_offset.mV[VZ]), 0.5f, 1.2f); + chest_joint->setScale(LLVector3(1.f, 1.f, scale_factor)); + diff.mV[VZ] = 0.f; + } + + gAgentAvatarp->mPelvisp->setPosition(gAgentAvatarp->mPelvisp->getPosition() + diff); + + gAgentAvatarp->mRoot.updateWorldMatrixChildren(); + + for (LLVOAvatar::attachment_map_t::iterator iter = gAgentAvatarp->mAttachmentPoints.begin(); + iter != gAgentAvatarp->mAttachmentPoints.end(); ) + { + LLVOAvatar::attachment_map_t::iterator curiter = iter++; + LLViewerJointAttachment* attachment = curiter->second; + for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin(); + attachment_iter != attachment->mAttachedObjects.end(); + ++attachment_iter) + { + LLViewerObject *attached_object = (*attachment_iter); + if (attached_object && !attached_object->isDead() && attached_object->mDrawable.notNull()) + { + // clear any existing "early" movements of attachment + attached_object->mDrawable->clearState(LLDrawable::EARLY_MOVE); + gPipeline.updateMoveNormalAsync(attached_object->mDrawable); + attached_object->updateText(); + } + } + } + + torso_joint->setScale(torso_scale); + chest_joint->setScale(chest_scale); + } +} + +void LLAgentCamera::updateLastCamera() +{ + mLastCameraMode = mCameraMode; +} + +void LLAgentCamera::updateFocusOffset() +{ + validateFocusObject(); + if (mFocusObject.notNull()) + { + LLVector3d obj_pos = gAgent.getPosGlobalFromAgent(mFocusObject->getRenderPosition()); + mFocusObjectOffset.setVec(mFocusTargetGlobal - obj_pos); + } +} + +void LLAgentCamera::validateFocusObject() +{ + if (mFocusObject.notNull() && + mFocusObject->isDead()) + { + mFocusObjectOffset.clearVec(); + clearFocusObject(); + mCameraFOVZoomFactor = 0.f; + } +} + +//----------------------------------------------------------------------------- +// calcCustomizeAvatarUIOffset() +//----------------------------------------------------------------------------- +F32 LLAgentCamera::calcCustomizeAvatarUIOffset(const LLVector3d& camera_pos_global) +{ + F32 ui_offset = 0.f; + + F32 range = (F32)dist_vec(camera_pos_global, getFocusGlobal()); + mUIOffset = lerp(mUIOffset, ui_offset, LLCriticalDamp::getInterpolant(0.05f)); + return mUIOffset * range; +} + +//----------------------------------------------------------------------------- +// calcFocusPositionTargetGlobal() +//----------------------------------------------------------------------------- +LLVector3d LLAgentCamera::calcFocusPositionTargetGlobal() +{ + if (mFocusObject.notNull() && mFocusObject->isDead()) + { + clearFocusObject(); + } + + // Ventrella + if (mCameraMode == CAMERA_MODE_FOLLOW && mFocusOnAvatar) + { + mFocusTargetGlobal = gAgent.getPosGlobalFromAgent(mFollowCam.getSimulatedFocus()); + return mFocusTargetGlobal; + }// End Ventrella + else if (mCameraMode == CAMERA_MODE_MOUSELOOK) + { + LLVector3d at_axis(1.0, 0.0, 0.0); + LLQuaternion agent_rot = gAgent.getFrameAgent().getQuaternion(); + if (isAgentAvatarValid() && gAgentAvatarp->getParent()) + { + LLViewerObject* root_object = (LLViewerObject*)gAgentAvatarp->getRoot(); + if (!root_object->flagCameraDecoupled()) + { + agent_rot *= ((LLViewerObject*)(gAgentAvatarp->getParent()))->getRenderRotation(); + } + } + at_axis = at_axis * agent_rot; + mFocusTargetGlobal = calcCameraPositionTargetGlobal() + at_axis; + return mFocusTargetGlobal; + } + else if (mCameraMode == CAMERA_MODE_CUSTOMIZE_AVATAR) + { + return mFocusTargetGlobal; + } + else if (!mFocusOnAvatar) + { + if (mFocusObject.notNull() && !mFocusObject->isDead() && mFocusObject->mDrawable.notNull()) + { + LLDrawable* drawablep = mFocusObject->mDrawable; + + if (mTrackFocusObject && + drawablep && + drawablep->isActive()) + { + if (!mFocusObject->isAvatar()) + { + if (mFocusObject->isSelected()) + { + gPipeline.updateMoveNormalAsync(drawablep); + } + else + { + if (drawablep->isState(LLDrawable::MOVE_UNDAMPED)) + { + gPipeline.updateMoveNormalAsync(drawablep); + } + else + { + gPipeline.updateMoveDampedAsync(drawablep); + } + } + } + } + // if not tracking object, update offset based on new object position + else + { + updateFocusOffset(); + } + LLVector3 focus_agent = mFocusObject->getRenderPosition() + mFocusObjectOffset; + mFocusTargetGlobal.setVec(gAgent.getPosGlobalFromAgent(focus_agent)); + } + return mFocusTargetGlobal; + } + else if (mSitCameraEnabled && isAgentAvatarValid() && gAgentAvatarp->isSitting() && mSitCameraReferenceObject.notNull()) + { + // sit camera + LLVector3 object_pos = mSitCameraReferenceObject->getRenderPosition(); + LLQuaternion object_rot = mSitCameraReferenceObject->getRenderRotation(); + + LLVector3 target_pos = object_pos + (mSitCameraFocus * object_rot); + return gAgent.getPosGlobalFromAgent(target_pos); + } + else + { + return gAgent.getPositionGlobal() + calcThirdPersonFocusOffset(); + } +} + +LLVector3d LLAgentCamera::calcThirdPersonFocusOffset() +{ + // ...offset from avatar + LLVector3d focus_offset; + LLQuaternion agent_rot = gAgent.getFrameAgent().getQuaternion(); + if (isAgentAvatarValid() && gAgentAvatarp->getParent()) + { + agent_rot *= ((LLViewerObject*)(gAgentAvatarp->getParent()))->getRenderRotation(); + } + + focus_offset = convert_from_llsd<LLVector3d>(mFocusOffsetInitial[mCameraPreset]->get(), TYPE_VEC3D, ""); + return focus_offset * agent_rot; +} + +void LLAgentCamera::setupSitCamera() +{ + // agent frame entering this function is in world coordinates + if (isAgentAvatarValid() && gAgentAvatarp->getParent()) + { + LLQuaternion parent_rot = ((LLViewerObject*)gAgentAvatarp->getParent())->getRenderRotation(); + // slam agent coordinate frame to proper parent local version + LLVector3 at_axis = gAgent.getFrameAgent().getAtAxis(); + at_axis.mV[VZ] = 0.f; + at_axis.normalize(); + gAgent.resetAxes(at_axis * ~parent_rot); + } +} + +//----------------------------------------------------------------------------- +// getCameraPositionAgent() +//----------------------------------------------------------------------------- +const LLVector3 &LLAgentCamera::getCameraPositionAgent() const +{ + return LLViewerCamera::getInstance()->getOrigin(); +} + +//----------------------------------------------------------------------------- +// getCameraPositionGlobal() +//----------------------------------------------------------------------------- +LLVector3d LLAgentCamera::getCameraPositionGlobal() const +{ + return gAgent.getPosGlobalFromAgent(LLViewerCamera::getInstance()->getOrigin()); +} + +//----------------------------------------------------------------------------- +// calcCameraFOVZoomFactor() +//----------------------------------------------------------------------------- +F32 LLAgentCamera::calcCameraFOVZoomFactor() +{ + LLVector3 camera_offset_dir; + camera_offset_dir.setVec(mCameraFocusOffset); + + if (mCameraMode == CAMERA_MODE_MOUSELOOK) + { + return 0.f; + } + else if (mFocusObject.notNull() && !mFocusObject->isAvatar() && !mFocusOnAvatar) + { + // don't FOV zoom on mostly transparent objects + LLVector3 focus_offset = mFocusObjectOffset; + F32 obj_min_dist = 0.f; + calcCameraMinDistance(obj_min_dist); + F32 current_distance = llmax(0.001f, camera_offset_dir.magVec()); + + mFocusObjectDist = obj_min_dist - current_distance; + + F32 new_fov_zoom = llclamp(mFocusObjectDist / current_distance, 0.f, 1000.f); + return new_fov_zoom; + } + else // focusing on land or avatar + { + // keep old field of view until user changes focus explicitly + return mCameraFOVZoomFactor; + //return 0.f; + } +} + +//----------------------------------------------------------------------------- +// calcCameraPositionTargetGlobal() +//----------------------------------------------------------------------------- +LLVector3d LLAgentCamera::calcCameraPositionTargetGlobal(BOOL *hit_limit) +{ + // Compute base camera position and look-at points. + F32 camera_land_height; + LLVector3d frame_center_global = !isAgentAvatarValid() ? + gAgent.getPositionGlobal() : + gAgent.getPosGlobalFromAgent(gAgentAvatarp->mRoot.getWorldPosition()); + + BOOL isConstrained = FALSE; + LLVector3d head_offset; + head_offset.setVec(mThirdPersonHeadOffset); + + LLVector3d camera_position_global; + + // Ventrella + if (mCameraMode == CAMERA_MODE_FOLLOW && mFocusOnAvatar) + { + camera_position_global = gAgent.getPosGlobalFromAgent(mFollowCam.getSimulatedPosition()); + }// End Ventrella + else if (mCameraMode == CAMERA_MODE_MOUSELOOK) + { + if (!isAgentAvatarValid() || gAgentAvatarp->mDrawable.isNull()) + { + llwarns << "Null avatar drawable!" << llendl; + return LLVector3d::zero; + } + head_offset.clearVec(); + if (gAgentAvatarp->isSitting() && gAgentAvatarp->getParent()) + { + gAgentAvatarp->updateHeadOffset(); + head_offset.mdV[VX] = gAgentAvatarp->mHeadOffset.mV[VX]; + head_offset.mdV[VY] = gAgentAvatarp->mHeadOffset.mV[VY]; + head_offset.mdV[VZ] = gAgentAvatarp->mHeadOffset.mV[VZ] + 0.1f; + const LLMatrix4& mat = ((LLViewerObject*) gAgentAvatarp->getParent())->getRenderMatrix(); + camera_position_global = gAgent.getPosGlobalFromAgent + ((gAgentAvatarp->getPosition()+ + LLVector3(head_offset)*gAgentAvatarp->getRotation()) * mat); + } + else + { + head_offset.mdV[VZ] = gAgentAvatarp->mHeadOffset.mV[VZ]; + if (gAgentAvatarp->isSitting()) + { + head_offset.mdV[VZ] += 0.1; + } + camera_position_global = gAgent.getPosGlobalFromAgent(gAgentAvatarp->getRenderPosition());//frame_center_global; + head_offset = head_offset * gAgentAvatarp->getRenderRotation(); + camera_position_global = camera_position_global + head_offset; + } + } + else if (mCameraMode == CAMERA_MODE_THIRD_PERSON && mFocusOnAvatar) + { + LLVector3 local_camera_offset; + F32 camera_distance = 0.f; + + if (mSitCameraEnabled + && isAgentAvatarValid() + && gAgentAvatarp->isSitting() + && mSitCameraReferenceObject.notNull()) + { + // sit camera + LLVector3 object_pos = mSitCameraReferenceObject->getRenderPosition(); + LLQuaternion object_rot = mSitCameraReferenceObject->getRenderRotation(); + + LLVector3 target_pos = object_pos + (mSitCameraPos * object_rot); + + camera_position_global = gAgent.getPosGlobalFromAgent(target_pos); + } + else + { + local_camera_offset = mCameraZoomFraction * getCameraOffsetInitial() * gSavedSettings.getF32("CameraOffsetScale"); + + // are we sitting down? + if (isAgentAvatarValid() && gAgentAvatarp->getParent()) + { + LLQuaternion parent_rot = ((LLViewerObject*)gAgentAvatarp->getParent())->getRenderRotation(); + // slam agent coordinate frame to proper parent local version + LLVector3 at_axis = gAgent.getFrameAgent().getAtAxis() * parent_rot; + at_axis.mV[VZ] = 0.f; + at_axis.normalize(); + gAgent.resetAxes(at_axis * ~parent_rot); + + local_camera_offset = local_camera_offset * gAgent.getFrameAgent().getQuaternion() * parent_rot; + } + else + { + local_camera_offset = gAgent.getFrameAgent().rotateToAbsolute( local_camera_offset ); + } + + if (!mCameraCollidePlane.isExactlyZero() && (!isAgentAvatarValid() || !gAgentAvatarp->isSitting())) + { + LLVector3 plane_normal; + plane_normal.setVec(mCameraCollidePlane.mV); + + F32 offset_dot_norm = local_camera_offset * plane_normal; + if (llabs(offset_dot_norm) < 0.001f) + { + offset_dot_norm = 0.001f; + } + + camera_distance = local_camera_offset.normalize(); + + F32 pos_dot_norm = gAgent.getPosAgentFromGlobal(frame_center_global + head_offset) * plane_normal; + + // if agent is outside the colliding half-plane + if (pos_dot_norm > mCameraCollidePlane.mV[VW]) + { + // check to see if camera is on the opposite side (inside) the half-plane + if (offset_dot_norm + pos_dot_norm < mCameraCollidePlane.mV[VW]) + { + // diminish offset by factor to push it back outside the half-plane + camera_distance *= (pos_dot_norm - mCameraCollidePlane.mV[VW] - CAMERA_COLLIDE_EPSILON) / -offset_dot_norm; + } + } + else + { + if (offset_dot_norm + pos_dot_norm > mCameraCollidePlane.mV[VW]) + { + camera_distance *= (mCameraCollidePlane.mV[VW] - pos_dot_norm - CAMERA_COLLIDE_EPSILON) / offset_dot_norm; + } + } + } + else + { + camera_distance = local_camera_offset.normalize(); + } + + mTargetCameraDistance = llmax(camera_distance, MIN_CAMERA_DISTANCE); + + if (mTargetCameraDistance != mCurrentCameraDistance) + { + F32 camera_lerp_amt = LLCriticalDamp::getInterpolant(CAMERA_ZOOM_HALF_LIFE); + + mCurrentCameraDistance = lerp(mCurrentCameraDistance, mTargetCameraDistance, camera_lerp_amt); + } + + // Make the camera distance current + local_camera_offset *= mCurrentCameraDistance; + + // set the global camera position + LLVector3d camera_offset; + + LLVector3 av_pos = !isAgentAvatarValid() ? LLVector3::zero : gAgentAvatarp->getRenderPosition(); + camera_offset.setVec( local_camera_offset ); + camera_position_global = frame_center_global + head_offset + camera_offset; + + if (isAgentAvatarValid()) + { + LLVector3d camera_lag_d; + F32 lag_interp = LLCriticalDamp::getInterpolant(CAMERA_LAG_HALF_LIFE); + LLVector3 target_lag; + LLVector3 vel = gAgent.getVelocity(); + + // lag by appropriate amount for flying + F32 time_in_air = gAgentAvatarp->mTimeInAir.getElapsedTimeF32(); + if(!mCameraAnimating && gAgentAvatarp->mInAir && time_in_air > GROUND_TO_AIR_CAMERA_TRANSITION_START_TIME) + { + LLVector3 frame_at_axis = gAgent.getFrameAgent().getAtAxis(); + frame_at_axis -= projected_vec(frame_at_axis, gAgent.getReferenceUpVector()); + frame_at_axis.normalize(); + + //transition smoothly in air mode, to avoid camera pop + F32 u = (time_in_air - GROUND_TO_AIR_CAMERA_TRANSITION_START_TIME) / GROUND_TO_AIR_CAMERA_TRANSITION_TIME; + u = llclamp(u, 0.f, 1.f); + + lag_interp *= u; + + if (gViewerWindow->getLeftMouseDown() && gViewerWindow->getLastPick().mObjectID == gAgentAvatarp->getID()) + { + // disable camera lag when using mouse-directed steering + target_lag.clearVec(); + } + else + { + target_lag = vel * gSavedSettings.getF32("DynamicCameraStrength") / 30.f; + } + + mCameraLag = lerp(mCameraLag, target_lag, lag_interp); + + F32 lag_dist = mCameraLag.magVec(); + if (lag_dist > MAX_CAMERA_LAG) + { + mCameraLag = mCameraLag * MAX_CAMERA_LAG / lag_dist; + } + + // clamp camera lag so that avatar is always in front + F32 dot = (mCameraLag - (frame_at_axis * (MIN_CAMERA_LAG * u))) * frame_at_axis; + if (dot < -(MIN_CAMERA_LAG * u)) + { + mCameraLag -= (dot + (MIN_CAMERA_LAG * u)) * frame_at_axis; + } + } + else + { + mCameraLag = lerp(mCameraLag, LLVector3::zero, LLCriticalDamp::getInterpolant(0.15f)); + } + + camera_lag_d.setVec(mCameraLag); + camera_position_global = camera_position_global - camera_lag_d; + } + } + } + else + { + LLVector3d focusPosGlobal = calcFocusPositionTargetGlobal(); + // camera gets pushed out later wrt mCameraFOVZoomFactor...this is "raw" value + camera_position_global = focusPosGlobal + mCameraFocusOffset; + } + + if (!gSavedSettings.getBOOL("DisableCameraConstraints") && !gAgent.isGodlike()) + { + LLViewerRegion* regionp = LLWorld::getInstance()->getRegionFromPosGlobal(camera_position_global); + bool constrain = true; + if(regionp && regionp->canManageEstate()) + { + constrain = false; + } + if(constrain) + { + F32 max_dist = (CAMERA_MODE_CUSTOMIZE_AVATAR == mCameraMode) ? APPEARANCE_MAX_ZOOM : mDrawDistance; + + LLVector3d camera_offset = camera_position_global - gAgent.getPositionGlobal(); + F32 camera_distance = (F32)camera_offset.magVec(); + + if(camera_distance > max_dist) + { + camera_position_global = gAgent.getPositionGlobal() + (max_dist/camera_distance)*camera_offset; + isConstrained = TRUE; + } + } + +// JC - Could constrain camera based on parcel stuff here. +// LLViewerRegion *regionp = LLWorld::getInstance()->getRegionFromPosGlobal(camera_position_global); +// +// if (regionp && !regionp->mParcelOverlay->isBuildCameraAllowed(regionp->getPosRegionFromGlobal(camera_position_global))) +// { +// camera_position_global = last_position_global; +// +// isConstrained = TRUE; +// } + } + + // Don't let camera go underground + F32 camera_min_off_ground = getCameraMinOffGround(); + + camera_land_height = LLWorld::getInstance()->resolveLandHeightGlobal(camera_position_global); + + if (camera_position_global.mdV[VZ] < camera_land_height + camera_min_off_ground) + { + camera_position_global.mdV[VZ] = camera_land_height + camera_min_off_ground; + isConstrained = TRUE; + } + + + if (hit_limit) + { + *hit_limit = isConstrained; + } + + return camera_position_global; +} + + +LLVector3 LLAgentCamera::getCameraOffsetInitial() +{ + return convert_from_llsd<LLVector3>(mCameraOffsetInitial[mCameraPreset]->get(), TYPE_VEC3, ""); +} + + +//----------------------------------------------------------------------------- +// handleScrollWheel() +//----------------------------------------------------------------------------- +void LLAgentCamera::handleScrollWheel(S32 clicks) +{ + if (mCameraMode == CAMERA_MODE_FOLLOW && getFocusOnAvatar()) + { + if (!mFollowCam.getPositionLocked()) // not if the followCam position is locked in place + { + mFollowCam.zoom(clicks); + if (mFollowCam.isZoomedToMinimumDistance()) + { + changeCameraToMouselook(FALSE); + } + } + } + else + { + LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection(); + const F32 ROOT_ROOT_TWO = sqrt(F_SQRT2); + + // Block if camera is animating + if (mCameraAnimating) + { + return; + } + + if (selection->getObjectCount() && selection->getSelectType() == SELECT_TYPE_HUD) + { + F32 zoom_factor = (F32)pow(0.8, -clicks); + cameraZoomIn(zoom_factor); + } + else if (mFocusOnAvatar && (mCameraMode == CAMERA_MODE_THIRD_PERSON)) + { + F32 camera_offset_initial_mag = getCameraOffsetInitial().magVec(); + + F32 current_zoom_fraction = mTargetCameraDistance / (camera_offset_initial_mag * gSavedSettings.getF32("CameraOffsetScale")); + current_zoom_fraction *= 1.f - pow(ROOT_ROOT_TWO, clicks); + + cameraOrbitIn(current_zoom_fraction * camera_offset_initial_mag * gSavedSettings.getF32("CameraOffsetScale")); + } + else + { + F32 current_zoom_fraction = (F32)mCameraFocusOffsetTarget.magVec(); + cameraOrbitIn(current_zoom_fraction * (1.f - pow(ROOT_ROOT_TWO, clicks))); + } + } +} + + +//----------------------------------------------------------------------------- +// getCameraMinOffGround() +//----------------------------------------------------------------------------- +F32 LLAgentCamera::getCameraMinOffGround() +{ + if (mCameraMode == CAMERA_MODE_MOUSELOOK) + { + return 0.f; + } + else + { + if (gSavedSettings.getBOOL("DisableCameraConstraints")) + { + return -1000.f; + } + else + { + return 0.5f; + } + } +} + + +//----------------------------------------------------------------------------- +// resetCamera() +//----------------------------------------------------------------------------- +void LLAgentCamera::resetCamera() +{ + // Remove any pitch from the avatar + LLVector3 at = gAgent.getFrameAgent().getAtAxis(); + at.mV[VZ] = 0.f; + at.normalize(); + gAgent.resetAxes(at); + // have to explicitly clear field of view zoom now + mCameraFOVZoomFactor = 0.f; + + updateCamera(); +} + +//----------------------------------------------------------------------------- +// changeCameraToMouselook() +//----------------------------------------------------------------------------- +void LLAgentCamera::changeCameraToMouselook(BOOL animate) +{ + if (LLViewerJoystick::getInstance()->getOverrideCamera()) + { + return; + } + + // visibility changes at end of animation + gViewerWindow->getWindow()->resetBusyCount(); + + // Menus should not remain open on switching to mouselook... + LLMenuGL::sMenuContainer->hideMenus(); + + // unpause avatar animation + gAgent.unpauseAnimation(); + + LLToolMgr::getInstance()->setCurrentToolset(gMouselookToolset); + + if (isAgentAvatarValid()) + { + gAgentAvatarp->stopMotion(ANIM_AGENT_BODY_NOISE); + gAgentAvatarp->stopMotion(ANIM_AGENT_BREATHE_ROT); + } + + //gViewerWindow->stopGrab(); + LLSelectMgr::getInstance()->deselectAll(); + gViewerWindow->hideCursor(); + gViewerWindow->moveCursorToCenter(); + + if (mCameraMode != CAMERA_MODE_MOUSELOOK) + { + gFocusMgr.setKeyboardFocus(NULL); + + updateLastCamera(); + mCameraMode = CAMERA_MODE_MOUSELOOK; + const U32 old_flags = gAgent.getControlFlags(); + gAgent.setControlFlags(AGENT_CONTROL_MOUSELOOK); + if (old_flags != gAgent.getControlFlags()) + { + gAgent.setFlagsDirty(); + } + + if (animate) + { + startCameraAnimation(); + } + else + { + mCameraAnimating = FALSE; + gAgent.endAnimationUpdateUI(); + } + } +} + + +//----------------------------------------------------------------------------- +// changeCameraToDefault() +//----------------------------------------------------------------------------- +void LLAgentCamera::changeCameraToDefault() +{ + if (LLViewerJoystick::getInstance()->getOverrideCamera()) + { + return; + } + + if (LLFollowCamMgr::getActiveFollowCamParams()) + { + changeCameraToFollow(); + } + else + { + changeCameraToThirdPerson(); + } +} + + +// Ventrella +//----------------------------------------------------------------------------- +// changeCameraToFollow() +//----------------------------------------------------------------------------- +void LLAgentCamera::changeCameraToFollow(BOOL animate) +{ + if (LLViewerJoystick::getInstance()->getOverrideCamera()) + { + return; + } + + if(mCameraMode != CAMERA_MODE_FOLLOW) + { + if (mCameraMode == CAMERA_MODE_MOUSELOOK) + { + animate = FALSE; + } + startCameraAnimation(); + + updateLastCamera(); + mCameraMode = CAMERA_MODE_FOLLOW; + + // bang-in the current focus, position, and up vector of the follow cam + mFollowCam.reset(mCameraPositionAgent, LLViewerCamera::getInstance()->getPointOfInterest(), LLVector3::z_axis); + + if (gBasicToolset) + { + LLToolMgr::getInstance()->setCurrentToolset(gBasicToolset); + } + + if (isAgentAvatarValid()) + { + gAgentAvatarp->mPelvisp->setPosition(LLVector3::zero); + gAgentAvatarp->startMotion( ANIM_AGENT_BODY_NOISE ); + gAgentAvatarp->startMotion( ANIM_AGENT_BREATHE_ROT ); + } + + // unpause avatar animation + gAgent.unpauseAnimation(); + + const U32 old_flags = gAgent.getControlFlags(); + gAgent.clearControlFlags(AGENT_CONTROL_MOUSELOOK); + if (old_flags != gAgent.getControlFlags()) + { + gAgent.setFlagsDirty(); + } + + if (animate) + { + startCameraAnimation(); + } + else + { + mCameraAnimating = FALSE; + gAgent.endAnimationUpdateUI(); + } + } +} + +//----------------------------------------------------------------------------- +// changeCameraToThirdPerson() +//----------------------------------------------------------------------------- +void LLAgentCamera::changeCameraToThirdPerson(BOOL animate) +{ + if (LLViewerJoystick::getInstance()->getOverrideCamera()) + { + return; + } + + gViewerWindow->getWindow()->resetBusyCount(); + + mCameraZoomFraction = INITIAL_ZOOM_FRACTION; + + if (isAgentAvatarValid()) + { + if (!gAgentAvatarp->isSitting()) + { + gAgentAvatarp->mPelvisp->setPosition(LLVector3::zero); + } + gAgentAvatarp->startMotion(ANIM_AGENT_BODY_NOISE); + gAgentAvatarp->startMotion(ANIM_AGENT_BREATHE_ROT); + } + + LLVector3 at_axis; + + // unpause avatar animation + gAgent.unpauseAnimation(); + + if (mCameraMode != CAMERA_MODE_THIRD_PERSON) + { + if (gBasicToolset) + { + LLToolMgr::getInstance()->setCurrentToolset(gBasicToolset); + } + + mCameraLag.clearVec(); + if (mCameraMode == CAMERA_MODE_MOUSELOOK) + { + mCurrentCameraDistance = MIN_CAMERA_DISTANCE; + mTargetCameraDistance = MIN_CAMERA_DISTANCE; + animate = FALSE; + } + updateLastCamera(); + mCameraMode = CAMERA_MODE_THIRD_PERSON; + const U32 old_flags = gAgent.getControlFlags(); + gAgent.clearControlFlags(AGENT_CONTROL_MOUSELOOK); + if (old_flags != gAgent.getControlFlags()) + { + gAgent.setFlagsDirty(); + } + + } + + // Remove any pitch from the avatar + if (isAgentAvatarValid() && gAgentAvatarp->getParent()) + { + LLQuaternion obj_rot = ((LLViewerObject*)gAgentAvatarp->getParent())->getRenderRotation(); + at_axis = LLViewerCamera::getInstance()->getAtAxis(); + at_axis.mV[VZ] = 0.f; + at_axis.normalize(); + gAgent.resetAxes(at_axis * ~obj_rot); + } + else + { + at_axis = gAgent.getFrameAgent().getAtAxis(); + at_axis.mV[VZ] = 0.f; + at_axis.normalize(); + gAgent.resetAxes(at_axis); + } + + + if (animate) + { + startCameraAnimation(); + } + else + { + mCameraAnimating = FALSE; + gAgent.endAnimationUpdateUI(); + } +} + +//----------------------------------------------------------------------------- +// changeCameraToCustomizeAvatar() +//----------------------------------------------------------------------------- +void LLAgentCamera::changeCameraToCustomizeAvatar(BOOL avatar_animate, BOOL camera_animate) +{ + if (LLViewerJoystick::getInstance()->getOverrideCamera()) + { + return; + } + + gAgent.standUp(); // force stand up + gViewerWindow->getWindow()->resetBusyCount(); + + if (gFaceEditToolset) + { + LLToolMgr::getInstance()->setCurrentToolset(gFaceEditToolset); + } + + if (camera_animate) + { + startCameraAnimation(); + } + + if (mCameraMode != CAMERA_MODE_CUSTOMIZE_AVATAR) + { + updateLastCamera(); + mCameraMode = CAMERA_MODE_CUSTOMIZE_AVATAR; + const U32 old_flags = gAgent.getControlFlags(); + gAgent.clearControlFlags(AGENT_CONTROL_MOUSELOOK); + if (old_flags != gAgent.getControlFlags()) + { + gAgent.setFlagsDirty(); + } + + gFocusMgr.setKeyboardFocus( NULL ); + gFocusMgr.setMouseCapture( NULL ); + + LLVOAvatarSelf::onCustomizeStart(); + } + + if (isAgentAvatarValid()) + { + if(avatar_animate) + { + // slamming the avatar's axis to the camera so that when the rotation + // completes it correctly points to the front of the avatar + // Remove any pitch or rotation from the avatar + LLVector3 at = LLViewerCamera::getInstance()->getAtAxis(); + at.mV[VZ] = 0.f; + at.normalize(); + gAgent.resetAxes(at); + + gAgent.sendAnimationRequest(ANIM_AGENT_CUSTOMIZE, ANIM_REQUEST_START); + gAgent.setCustomAnim(TRUE); + gAgentAvatarp->startMotion(ANIM_AGENT_CUSTOMIZE); + LLMotion* turn_motion = gAgentAvatarp->findMotion(ANIM_AGENT_CUSTOMIZE); + + if (turn_motion) + { + mAnimationDuration = turn_motion->getDuration() + CUSTOMIZE_AVATAR_CAMERA_ANIM_SLOP; + + } + else + { + mAnimationDuration = gSavedSettings.getF32("ZoomTime"); + } + } + + // this is what sets the avatar as the mFocusTargetGlobal + setFocusGlobal(LLVector3d::zero); + + gAgentAvatarp->updateMeshTextures(); + } + else + { + mCameraAnimating = FALSE; + gAgent.endAnimationUpdateUI(); + } +} + + +void LLAgentCamera::switchCameraPreset(ECameraPreset preset) +{ + //zoom is supposed to be reset for the front and group views + mCameraZoomFraction = 1.f; + + //focusing on avatar in that case means following him on movements + mFocusOnAvatar = TRUE; + + mCameraPreset = preset; + + gSavedSettings.setU32("CameraPreset", mCameraPreset); +} + + +// +// Focus point management +// + +//----------------------------------------------------------------------------- +// startCameraAnimation() +//----------------------------------------------------------------------------- +void LLAgentCamera::startCameraAnimation() +{ + mAnimationCameraStartGlobal = getCameraPositionGlobal(); + mAnimationFocusStartGlobal = mFocusGlobal; + mAnimationTimer.reset(); + mCameraAnimating = TRUE; + mAnimationDuration = gSavedSettings.getF32("ZoomTime"); +} + +//----------------------------------------------------------------------------- +// stopCameraAnimation() +//----------------------------------------------------------------------------- +void LLAgentCamera::stopCameraAnimation() +{ + mCameraAnimating = FALSE; +} + +void LLAgentCamera::clearFocusObject() +{ + if (mFocusObject.notNull()) + { + startCameraAnimation(); + + setFocusObject(NULL); + mFocusObjectOffset.clearVec(); + } +} + +void LLAgentCamera::setFocusObject(LLViewerObject* object) +{ + mFocusObject = object; +} + +// Focus on a point, but try to keep camera position stable. +//----------------------------------------------------------------------------- +// setFocusGlobal() +//----------------------------------------------------------------------------- +void LLAgentCamera::setFocusGlobal(const LLPickInfo& pick) +{ + LLViewerObject* objectp = gObjectList.findObject(pick.mObjectID); + + if (objectp) + { + // focus on object plus designated offset + // which may or may not be same as pick.mPosGlobal + setFocusGlobal(objectp->getPositionGlobal() + LLVector3d(pick.mObjectOffset), pick.mObjectID); + } + else + { + // focus directly on point where user clicked + setFocusGlobal(pick.mPosGlobal, pick.mObjectID); + } +} + + +void LLAgentCamera::setFocusGlobal(const LLVector3d& focus, const LLUUID &object_id) +{ + setFocusObject(gObjectList.findObject(object_id)); + LLVector3d old_focus = mFocusTargetGlobal; + LLViewerObject *focus_obj = mFocusObject; + + // if focus has changed + if (old_focus != focus) + { + if (focus.isExactlyZero()) + { + if (isAgentAvatarValid()) + { + mFocusTargetGlobal = gAgent.getPosGlobalFromAgent(gAgentAvatarp->mHeadp->getWorldPosition()); + } + else + { + mFocusTargetGlobal = gAgent.getPositionGlobal(); + } + mCameraFocusOffsetTarget = getCameraPositionGlobal() - mFocusTargetGlobal; + mCameraFocusOffset = mCameraFocusOffsetTarget; + setLookAt(LOOKAT_TARGET_CLEAR); + } + else + { + mFocusTargetGlobal = focus; + if (!focus_obj) + { + mCameraFOVZoomFactor = 0.f; + } + + mCameraFocusOffsetTarget = gAgent.getPosGlobalFromAgent(mCameraVirtualPositionAgent) - mFocusTargetGlobal; + + startCameraAnimation(); + + if (focus_obj) + { + if (focus_obj->isAvatar()) + { + setLookAt(LOOKAT_TARGET_FOCUS, focus_obj); + } + else + { + setLookAt(LOOKAT_TARGET_FOCUS, focus_obj, (gAgent.getPosAgentFromGlobal(focus) - focus_obj->getRenderPosition()) * ~focus_obj->getRenderRotation()); + } + } + else + { + setLookAt(LOOKAT_TARGET_FOCUS, NULL, gAgent.getPosAgentFromGlobal(mFocusTargetGlobal)); + } + } + } + else // focus == mFocusTargetGlobal + { + if (focus.isExactlyZero()) + { + if (isAgentAvatarValid()) + { + mFocusTargetGlobal = gAgent.getPosGlobalFromAgent(gAgentAvatarp->mHeadp->getWorldPosition()); + } + else + { + mFocusTargetGlobal = gAgent.getPositionGlobal(); + } + } + mCameraFocusOffsetTarget = (getCameraPositionGlobal() - mFocusTargetGlobal) / (1.f + mCameraFOVZoomFactor);; + mCameraFocusOffset = mCameraFocusOffsetTarget; + } + + if (mFocusObject.notNull()) + { + // for attachments, make offset relative to avatar, not the attachment + if (mFocusObject->isAttachment()) + { + while (mFocusObject.notNull() && !mFocusObject->isAvatar()) + { + mFocusObject = (LLViewerObject*) mFocusObject->getParent(); + } + setFocusObject((LLViewerObject*)mFocusObject); + } + updateFocusOffset(); + } +} + +// Used for avatar customization +//----------------------------------------------------------------------------- +// setCameraPosAndFocusGlobal() +//----------------------------------------------------------------------------- +void LLAgentCamera::setCameraPosAndFocusGlobal(const LLVector3d& camera_pos, const LLVector3d& focus, const LLUUID &object_id) +{ + LLVector3d old_focus = mFocusTargetGlobal; + + F64 focus_delta_squared = (old_focus - focus).magVecSquared(); + const F64 ANIM_EPSILON_SQUARED = 0.0001; + if (focus_delta_squared > ANIM_EPSILON_SQUARED) + { + startCameraAnimation(); + + if (CAMERA_MODE_CUSTOMIZE_AVATAR == mCameraMode) + { + // Compensate for the fact that the camera has already been offset to make room for LLFloaterCustomize. + mAnimationCameraStartGlobal -= LLVector3d(LLViewerCamera::getInstance()->getLeftAxis() * calcCustomizeAvatarUIOffset( mAnimationCameraStartGlobal )); + } + } + + //LLViewerCamera::getInstance()->setOrigin( gAgent.getPosAgentFromGlobal( camera_pos ) ); + setFocusObject(gObjectList.findObject(object_id)); + mFocusTargetGlobal = focus; + mCameraFocusOffsetTarget = camera_pos - focus; + mCameraFocusOffset = mCameraFocusOffsetTarget; + + if (mFocusObject) + { + if (mFocusObject->isAvatar()) + { + setLookAt(LOOKAT_TARGET_FOCUS, mFocusObject); + } + else + { + setLookAt(LOOKAT_TARGET_FOCUS, mFocusObject, (gAgent.getPosAgentFromGlobal(focus) - mFocusObject->getRenderPosition()) * ~mFocusObject->getRenderRotation()); + } + } + else + { + setLookAt(LOOKAT_TARGET_FOCUS, NULL, gAgent.getPosAgentFromGlobal(mFocusTargetGlobal)); + } + + if (mCameraAnimating) + { + const F64 ANIM_METERS_PER_SECOND = 10.0; + const F64 MIN_ANIM_SECONDS = 0.5; + const F64 MAX_ANIM_SECONDS = 10.0; + F64 anim_duration = llmax( MIN_ANIM_SECONDS, sqrt(focus_delta_squared) / ANIM_METERS_PER_SECOND ); + anim_duration = llmin( anim_duration, MAX_ANIM_SECONDS ); + setAnimationDuration( (F32)anim_duration ); + } + + updateFocusOffset(); +} + +//----------------------------------------------------------------------------- +// setSitCamera() +//----------------------------------------------------------------------------- +void LLAgentCamera::setSitCamera(const LLUUID &object_id, const LLVector3 &camera_pos, const LLVector3 &camera_focus) +{ + BOOL camera_enabled = !object_id.isNull(); + + if (camera_enabled) + { + LLViewerObject *reference_object = gObjectList.findObject(object_id); + if (reference_object) + { + //convert to root object relative? + mSitCameraPos = camera_pos; + mSitCameraFocus = camera_focus; + mSitCameraReferenceObject = reference_object; + mSitCameraEnabled = TRUE; + } + } + else + { + mSitCameraPos.clearVec(); + mSitCameraFocus.clearVec(); + mSitCameraReferenceObject = NULL; + mSitCameraEnabled = FALSE; + } +} + +//----------------------------------------------------------------------------- +// setFocusOnAvatar() +//----------------------------------------------------------------------------- +void LLAgentCamera::setFocusOnAvatar(BOOL focus_on_avatar, BOOL animate) +{ + if (focus_on_avatar != mFocusOnAvatar) + { + if (animate) + { + startCameraAnimation(); + } + else + { + stopCameraAnimation(); + } + } + + //RN: when focused on the avatar, we're not "looking" at it + // looking implies intent while focusing on avatar means + // you're just walking around with a camera on you...eesh. + if (!mFocusOnAvatar && focus_on_avatar) + { + setFocusGlobal(LLVector3d::zero); + mCameraFOVZoomFactor = 0.f; + if (mCameraMode == CAMERA_MODE_THIRD_PERSON) + { + LLVector3 at_axis; + if (isAgentAvatarValid() && gAgentAvatarp->getParent()) + { + LLQuaternion obj_rot = ((LLViewerObject*)gAgentAvatarp->getParent())->getRenderRotation(); + at_axis = LLViewerCamera::getInstance()->getAtAxis(); + at_axis.mV[VZ] = 0.f; + at_axis.normalize(); + gAgent.resetAxes(at_axis * ~obj_rot); + } + else + { + at_axis = LLViewerCamera::getInstance()->getAtAxis(); + at_axis.mV[VZ] = 0.f; + at_axis.normalize(); + gAgent.resetAxes(at_axis); + } + } + } + // unlocking camera from avatar + else if (mFocusOnAvatar && !focus_on_avatar) + { + // keep camera focus point consistent, even though it is now unlocked + setFocusGlobal(gAgent.getPositionGlobal() + calcThirdPersonFocusOffset(), gAgent.getID()); + } + + mFocusOnAvatar = focus_on_avatar; +} + + +BOOL LLAgentCamera::setLookAt(ELookAtType target_type, LLViewerObject *object, LLVector3 position) +{ + if(object && object->isAttachment()) + { + LLViewerObject* parent = object; + while(parent) + { + if (parent == gAgentAvatarp) + { + // looking at an attachment on ourselves, which we don't want to do + object = gAgentAvatarp; + position.clearVec(); + } + parent = (LLViewerObject*)parent->getParent(); + } + } + if(!mLookAt || mLookAt->isDead()) + { + mLookAt = (LLHUDEffectLookAt *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_LOOKAT); + mLookAt->setSourceObject(gAgentAvatarp); + } + + return mLookAt->setLookAt(target_type, object, position); +} + +//----------------------------------------------------------------------------- +// lookAtLastChat() +//----------------------------------------------------------------------------- +void LLAgentCamera::lookAtLastChat() +{ + // Block if camera is animating or not in normal third person camera mode + if (mCameraAnimating || !cameraThirdPerson()) + { + return; + } + + LLViewerObject *chatter = gObjectList.findObject(gAgent.getLastChatter()); + if (!chatter) + { + return; + } + + LLVector3 delta_pos; + if (chatter->isAvatar()) + { + LLVOAvatar *chatter_av = (LLVOAvatar*)chatter; + if (isAgentAvatarValid() && chatter_av->mHeadp) + { + delta_pos = chatter_av->mHeadp->getWorldPosition() - gAgentAvatarp->mHeadp->getWorldPosition(); + } + else + { + delta_pos = chatter->getPositionAgent() - gAgent.getPositionAgent(); + } + delta_pos.normalize(); + + gAgent.setControlFlags(AGENT_CONTROL_STOP); + + changeCameraToThirdPerson(); + + LLVector3 new_camera_pos = gAgentAvatarp->mHeadp->getWorldPosition(); + LLVector3 left = delta_pos % LLVector3::z_axis; + left.normalize(); + LLVector3 up = left % delta_pos; + up.normalize(); + new_camera_pos -= delta_pos * 0.4f; + new_camera_pos += left * 0.3f; + new_camera_pos += up * 0.2f; + if (chatter_av->mHeadp) + { + setFocusGlobal(gAgent.getPosGlobalFromAgent(chatter_av->mHeadp->getWorldPosition()), gAgent.getLastChatter()); + mCameraFocusOffsetTarget = gAgent.getPosGlobalFromAgent(new_camera_pos) - gAgent.getPosGlobalFromAgent(chatter_av->mHeadp->getWorldPosition()); + } + else + { + setFocusGlobal(chatter->getPositionGlobal(), gAgent.getLastChatter()); + mCameraFocusOffsetTarget = gAgent.getPosGlobalFromAgent(new_camera_pos) - chatter->getPositionGlobal(); + } + setFocusOnAvatar(FALSE, TRUE); + } + else + { + delta_pos = chatter->getRenderPosition() - gAgent.getPositionAgent(); + delta_pos.normalize(); + + gAgent.setControlFlags(AGENT_CONTROL_STOP); + + changeCameraToThirdPerson(); + + LLVector3 new_camera_pos = gAgentAvatarp->mHeadp->getWorldPosition(); + LLVector3 left = delta_pos % LLVector3::z_axis; + left.normalize(); + LLVector3 up = left % delta_pos; + up.normalize(); + new_camera_pos -= delta_pos * 0.4f; + new_camera_pos += left * 0.3f; + new_camera_pos += up * 0.2f; + + setFocusGlobal(chatter->getPositionGlobal(), gAgent.getLastChatter()); + mCameraFocusOffsetTarget = gAgent.getPosGlobalFromAgent(new_camera_pos) - chatter->getPositionGlobal(); + setFocusOnAvatar(FALSE, TRUE); + } +} + +BOOL LLAgentCamera::setPointAt(EPointAtType target_type, LLViewerObject *object, LLVector3 position) +{ + // disallow pointing at attachments and avatars + if (object && (object->isAttachment() || object->isAvatar())) + { + return FALSE; + } + if (!mPointAt || mPointAt->isDead()) + { + mPointAt = (LLHUDEffectPointAt *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_POINTAT); + mPointAt->setSourceObject(gAgentAvatarp); + } + return mPointAt->setPointAt(target_type, object, position); +} + +ELookAtType LLAgentCamera::getLookAtType() +{ + if (mLookAt) + { + return mLookAt->getLookAtType(); + } + return LOOKAT_TARGET_NONE; +} + +EPointAtType LLAgentCamera::getPointAtType() +{ + if (mPointAt) + { + return mPointAt->getPointAtType(); + } + return POINTAT_TARGET_NONE; +} + +void LLAgentCamera::clearGeneralKeys() +{ + mAtKey = 0; + mWalkKey = 0; + mLeftKey = 0; + mUpKey = 0; + mYawKey = 0.f; + mPitchKey = 0.f; +} + +void LLAgentCamera::clearOrbitKeys() +{ + mOrbitLeftKey = 0.f; + mOrbitRightKey = 0.f; + mOrbitUpKey = 0.f; + mOrbitDownKey = 0.f; + mOrbitInKey = 0.f; + mOrbitOutKey = 0.f; +} + +void LLAgentCamera::clearPanKeys() +{ + mPanRightKey = 0.f; + mPanLeftKey = 0.f; + mPanUpKey = 0.f; + mPanDownKey = 0.f; + mPanInKey = 0.f; + mPanOutKey = 0.f; +} + +// static +S32 LLAgentCamera::directionToKey(S32 direction) +{ + if (direction > 0) return 1; + if (direction < 0) return -1; + return 0; +} + + +// EOF + diff --git a/indra/newview/llagentcamera.h b/indra/newview/llagentcamera.h new file mode 100644 index 0000000000..7afb5c0ed9 --- /dev/null +++ b/indra/newview/llagentcamera.h @@ -0,0 +1,401 @@ +/** + * @file llagent.h + * @brief LLAgent class header file + * + * $LicenseInfo:firstyear=2000&license=viewergpl$ + * + * Copyright (c) 2000-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLAGENTCAMERA_H +#define LL_LLAGENTCAMERA_H + +#include "llfollowcam.h" // Ventrella +#include "llhudeffectlookat.h" // EPointAtType +#include "llhudeffectpointat.h" // ELookAtType + +class LLPickInfo; +class LLVOAvatarSelf; +class LLControlVariable; + +//-------------------------------------------------------------------- +// Types +//-------------------------------------------------------------------- +enum ECameraMode +{ + CAMERA_MODE_THIRD_PERSON, + CAMERA_MODE_MOUSELOOK, + CAMERA_MODE_CUSTOMIZE_AVATAR, + CAMERA_MODE_FOLLOW +}; + +/** Camera Presets for CAMERA_MODE_THIRD_PERSON */ +enum ECameraPreset +{ + /** Default preset, what the Third Person Mode actually was */ + CAMERA_PRESET_REAR_VIEW, + + /** "Looking at the Avatar from the front" */ + CAMERA_PRESET_FRONT_VIEW, + + /** "Above and to the left, over the shoulder, pulled back a little on the zoom" */ + CAMERA_PRESET_GROUP_VIEW +}; + +//------------------------------------------------------------------------ +// LLAgentCamera +//------------------------------------------------------------------------ +class LLAgentCamera +{ + LOG_CLASS(LLAgentCamera); + +public: + //-------------------------------------------------------------------- + // Constructors / Destructors + //-------------------------------------------------------------------- +public: + LLAgentCamera(); + virtual ~LLAgentCamera(); + void init(); + void cleanup(); + void setAvatarObject(LLVOAvatarSelf* avatar); +private: + bool mInitialized; + + + //-------------------------------------------------------------------- + // Mode + //-------------------------------------------------------------------- +public: + void changeCameraToDefault(); + void changeCameraToMouselook(BOOL animate = TRUE); + void changeCameraToThirdPerson(BOOL animate = TRUE); + void changeCameraToCustomizeAvatar(BOOL avatar_animate = TRUE, BOOL camera_animate = TRUE); // Trigger transition animation + void changeCameraToFollow(BOOL animate = TRUE); // Ventrella + BOOL cameraThirdPerson() const { return (mCameraMode == CAMERA_MODE_THIRD_PERSON && mLastCameraMode == CAMERA_MODE_THIRD_PERSON); } + BOOL cameraMouselook() const { return (mCameraMode == CAMERA_MODE_MOUSELOOK && mLastCameraMode == CAMERA_MODE_MOUSELOOK); } + BOOL cameraCustomizeAvatar() const { return (mCameraMode == CAMERA_MODE_CUSTOMIZE_AVATAR /*&& !mCameraAnimating*/); } + BOOL cameraFollow() const { return (mCameraMode == CAMERA_MODE_FOLLOW && mLastCameraMode == CAMERA_MODE_FOLLOW); } + ECameraMode getCameraMode() const { return mCameraMode; } + ECameraMode getLastCameraMode() const { return mLastCameraMode; } + void updateCamera(); // Call once per frame to update camera location/orientation + void resetCamera(); // Slam camera into its default position + void updateLastCamera(); // Set last camera to current camera + +private: + ECameraMode mCameraMode; // Target mode after transition animation is done + ECameraMode mLastCameraMode; + + //-------------------------------------------------------------------- + // Preset + //-------------------------------------------------------------------- +public: + void switchCameraPreset(ECameraPreset preset); +private: + /** Determines default camera offset depending on the current camera preset */ + LLVector3 getCameraOffsetInitial(); + + /** Camera preset in Third Person Mode */ + ECameraPreset mCameraPreset; + + /** Initial camera offsets */ + std::map<ECameraPreset, LLPointer<LLControlVariable> > mCameraOffsetInitial; + + /** Initial focus offsets */ + std::map<ECameraPreset, LLPointer<LLControlVariable> > mFocusOffsetInitial; + + //-------------------------------------------------------------------- + // Position + //-------------------------------------------------------------------- +public: + LLVector3d getCameraPositionGlobal() const; + const LLVector3 &getCameraPositionAgent() const; + LLVector3d calcCameraPositionTargetGlobal(BOOL *hit_limit = NULL); // Calculate the camera position target + F32 getCameraMinOffGround(); // Minimum height off ground for this mode, meters + void setCameraCollidePlane(const LLVector4 &plane) { mCameraCollidePlane = plane; } + BOOL calcCameraMinDistance(F32 &obj_min_distance); + F32 calcCustomizeAvatarUIOffset(const LLVector3d& camera_pos_global); + F32 getCurrentCameraBuildOffset() { return (F32)mCameraFocusOffset.length(); } + void clearCameraLag() { mCameraLag.clearVec(); } +private: + F32 mCurrentCameraDistance; // Current camera offset from avatar + F32 mTargetCameraDistance; // Target camera offset from avatar + F32 mCameraFOVZoomFactor; // Amount of fov zoom applied to camera when zeroing in on an object + F32 mCameraCurrentFOVZoomFactor; // Interpolated fov zoom + F32 mCameraFOVDefault; // Default field of view that is basis for FOV zoom effect + LLVector4 mCameraCollidePlane; // Colliding plane for camera + F32 mCameraZoomFraction; // Mousewheel driven fraction of zoom + LLVector3 mCameraPositionAgent; // Camera position in agent coordinates + LLVector3 mCameraVirtualPositionAgent; // Camera virtual position (target) before performing FOV zoom + LLVector3d mCameraSmoothingLastPositionGlobal; + LLVector3d mCameraSmoothingLastPositionAgent; + bool mCameraSmoothingStop; + LLVector3 mCameraLag; // Third person camera lag + LLVector3 mCameraUpVector; // Camera's up direction in world coordinates (determines the 'roll' of the view) + + //-------------------------------------------------------------------- + // Follow + //-------------------------------------------------------------------- +public: + void setUsingFollowCam(bool using_follow_cam); +private: + LLFollowCam mFollowCam; // Ventrella + + //-------------------------------------------------------------------- + // Sit + //-------------------------------------------------------------------- +public: + void setupSitCamera(); + BOOL sitCameraEnabled() { return mSitCameraEnabled; } + void setSitCamera(const LLUUID &object_id, + const LLVector3 &camera_pos = LLVector3::zero, const LLVector3 &camera_focus = LLVector3::zero); +private: + LLPointer<LLViewerObject> mSitCameraReferenceObject; // Object to which camera is related when sitting + BOOL mSitCameraEnabled; // Use provided camera information when sitting? + LLVector3 mSitCameraPos; // Root relative camera pos when sitting + LLVector3 mSitCameraFocus; // Root relative camera target when sitting + + //-------------------------------------------------------------------- + // Animation + //-------------------------------------------------------------------- +public: + void setCameraAnimating(BOOL b) { mCameraAnimating = b; } + BOOL getCameraAnimating() { return mCameraAnimating; } + void setAnimationDuration(F32 seconds) { mAnimationDuration = seconds; } + void startCameraAnimation(); + void stopCameraAnimation(); +private: + LLFrameTimer mAnimationTimer; // Seconds that transition animation has been active + F32 mAnimationDuration; // In seconds + BOOL mCameraAnimating; // Camera is transitioning from one mode to another + LLVector3d mAnimationCameraStartGlobal; // Camera start position, global coords + LLVector3d mAnimationFocusStartGlobal; // Camera focus point, global coords + + //-------------------------------------------------------------------- + // Focus + //-------------------------------------------------------------------- +public: + LLVector3d calcFocusPositionTargetGlobal(); + LLVector3 calcFocusOffset(LLViewerObject *object, LLVector3 pos_agent, S32 x, S32 y); + BOOL getFocusOnAvatar() const { return mFocusOnAvatar; } + LLPointer<LLViewerObject>& getFocusObject() { return mFocusObject; } + F32 getFocusObjectDist() const { return mFocusObjectDist; } + void updateFocusOffset(); + void validateFocusObject(); + void setFocusGlobal(const LLPickInfo& pick); + void setFocusGlobal(const LLVector3d &focus, const LLUUID &object_id = LLUUID::null); + void setFocusOnAvatar(BOOL focus, BOOL animate); + void setCameraPosAndFocusGlobal(const LLVector3d& pos, const LLVector3d& focus, const LLUUID &object_id); + void clearFocusObject(); + void setFocusObject(LLViewerObject* object); + void setObjectTracking(BOOL track) { mTrackFocusObject = track; } + const LLVector3d &getFocusGlobal() const { return mFocusGlobal; } + const LLVector3d &getFocusTargetGlobal() const { return mFocusTargetGlobal; } +private: + LLVector3d mCameraFocusOffset; // Offset from focus point in build mode + LLVector3d mCameraFocusOffsetTarget; // Target towards which we are lerping the camera's focus offset + BOOL mFocusOnAvatar; + LLVector3d mFocusGlobal; + LLVector3d mFocusTargetGlobal; + LLPointer<LLViewerObject> mFocusObject; + F32 mFocusObjectDist; + LLVector3 mFocusObjectOffset; + F32 mFocusDotRadius; // Meters + BOOL mTrackFocusObject; + F32 mUIOffset; + + //-------------------------------------------------------------------- + // Lookat / Pointat + //-------------------------------------------------------------------- +public: + void updateLookAt(const S32 mouse_x, const S32 mouse_y); + BOOL setLookAt(ELookAtType target_type, LLViewerObject *object = NULL, LLVector3 position = LLVector3::zero); + ELookAtType getLookAtType(); + void lookAtLastChat(); + void slamLookAt(const LLVector3 &look_at); // Set the physics data + BOOL setPointAt(EPointAtType target_type, LLViewerObject *object = NULL, LLVector3 position = LLVector3::zero); + EPointAtType getPointAtType(); +public: + LLPointer<LLHUDEffectLookAt> mLookAt; + LLPointer<LLHUDEffectPointAt> mPointAt; + + //-------------------------------------------------------------------- + // Third person + //-------------------------------------------------------------------- +public: + LLVector3d calcThirdPersonFocusOffset(); + void setThirdPersonHeadOffset(LLVector3 offset) { mThirdPersonHeadOffset = offset; } +private: + LLVector3 mThirdPersonHeadOffset; // Head offset for third person camera position + + //-------------------------------------------------------------------- + // Orbit + //-------------------------------------------------------------------- +public: + void cameraOrbitAround(const F32 radians); // Rotate camera CCW radians about build focus point + void cameraOrbitOver(const F32 radians); // Rotate camera forward radians over build focus point + void cameraOrbitIn(const F32 meters); // Move camera in toward build focus point + + //-------------------------------------------------------------------- + // Zoom + //-------------------------------------------------------------------- +public: + void handleScrollWheel(S32 clicks); // Mousewheel driven zoom + void cameraZoomIn(const F32 factor); // Zoom in by fraction of current distance + F32 getCameraZoomFraction(); // Get camera zoom as fraction of minimum and maximum zoom + void setCameraZoomFraction(F32 fraction); // Set camera zoom as fraction of minimum and maximum zoom + F32 calcCameraFOVZoomFactor(); + + //-------------------------------------------------------------------- + // Pan + //-------------------------------------------------------------------- +public: + void cameraPanIn(const F32 meters); + void cameraPanLeft(const F32 meters); + void cameraPanUp(const F32 meters); + + //-------------------------------------------------------------------- + // View + //-------------------------------------------------------------------- +public: + // Called whenever the agent moves. Puts camera back in default position, deselects items, etc. + void resetView(BOOL reset_camera = TRUE, BOOL change_camera = FALSE); + // Called on camera movement. Unlocks camera from the default position behind the avatar. + void unlockView(); +public: + F32 mDrawDistance; + + //-------------------------------------------------------------------- + // Mouselook + //-------------------------------------------------------------------- +public: + BOOL getForceMouselook() const { return mForceMouselook; } + void setForceMouselook(BOOL mouselook) { mForceMouselook = mouselook; } +private: + BOOL mForceMouselook; + + //-------------------------------------------------------------------- + // HUD + //-------------------------------------------------------------------- +public: + F32 mHUDTargetZoom; // Target zoom level for HUD objects (used when editing) + F32 mHUDCurZoom; // Current animated zoom level for HUD objects + + +/******************************************************************************** + ** ** + ** KEYS + **/ + +public: + S32 getAtKey() const { return mAtKey; } + S32 getWalkKey() const { return mWalkKey; } + S32 getLeftKey() const { return mLeftKey; } + S32 getUpKey() const { return mUpKey; } + F32 getYawKey() const { return mYawKey; } + F32 getPitchKey() const { return mPitchKey; } + + void setAtKey(S32 mag) { mAtKey = mag; } + void setWalkKey(S32 mag) { mWalkKey = mag; } + void setLeftKey(S32 mag) { mLeftKey = mag; } + void setUpKey(S32 mag) { mUpKey = mag; } + void setYawKey(F32 mag) { mYawKey = mag; } + void setPitchKey(F32 mag) { mPitchKey = mag; } + + void clearGeneralKeys(); + static S32 directionToKey(S32 direction); // Changes direction to -1/0/1 + +private: + S32 mAtKey; // Either 1, 0, or -1. Indicates that movement key is pressed + S32 mWalkKey; // Like AtKey, but causes less forward thrust + S32 mLeftKey; + S32 mUpKey; + F32 mYawKey; + F32 mPitchKey; + + //-------------------------------------------------------------------- + // Orbit + //-------------------------------------------------------------------- +public: + F32 getOrbitLeftKey() const { return mOrbitLeftKey; } + F32 getOrbitRightKey() const { return mOrbitRightKey; } + F32 getOrbitUpKey() const { return mOrbitUpKey; } + F32 getOrbitDownKey() const { return mOrbitDownKey; } + F32 getOrbitInKey() const { return mOrbitInKey; } + F32 getOrbitOutKey() const { return mOrbitOutKey; } + + void setOrbitLeftKey(F32 mag) { mOrbitLeftKey = mag; } + void setOrbitRightKey(F32 mag) { mOrbitRightKey = mag; } + void setOrbitUpKey(F32 mag) { mOrbitUpKey = mag; } + void setOrbitDownKey(F32 mag) { mOrbitDownKey = mag; } + void setOrbitInKey(F32 mag) { mOrbitInKey = mag; } + void setOrbitOutKey(F32 mag) { mOrbitOutKey = mag; } + + void clearOrbitKeys(); +private: + F32 mOrbitLeftKey; + F32 mOrbitRightKey; + F32 mOrbitUpKey; + F32 mOrbitDownKey; + F32 mOrbitInKey; + F32 mOrbitOutKey; + + //-------------------------------------------------------------------- + // Pan + //-------------------------------------------------------------------- +public: + F32 getPanLeftKey() const { return mPanLeftKey; } + F32 getPanRightKey() const { return mPanRightKey; } + F32 getPanUpKey() const { return mPanUpKey; } + F32 getPanDownKey() const { return mPanDownKey; } + F32 getPanInKey() const { return mPanInKey; } + F32 getPanOutKey() const { return mPanOutKey; } + + void setPanLeftKey(F32 mag) { mPanLeftKey = mag; } + void setPanRightKey(F32 mag) { mPanRightKey = mag; } + void setPanUpKey(F32 mag) { mPanUpKey = mag; } + void setPanDownKey(F32 mag) { mPanDownKey = mag; } + void setPanInKey(F32 mag) { mPanInKey = mag; } + void setPanOutKey(F32 mag) { mPanOutKey = mag; } + + void clearPanKeys(); +private: + F32 mPanUpKey; + F32 mPanDownKey; + F32 mPanLeftKey; + F32 mPanRightKey; + F32 mPanInKey; + F32 mPanOutKey; + +/** Keys + ** ** + *******************************************************************************/ + +}; + +extern LLAgentCamera gAgentCamera; + +#endif diff --git a/indra/newview/llagentlistener.cpp b/indra/newview/llagentlistener.cpp index b3ed7c353e..7a8205acb5 100644 --- a/indra/newview/llagentlistener.cpp +++ b/indra/newview/llagentlistener.cpp @@ -53,7 +53,10 @@ void LLAgentListener::requestTeleport(LLSD const & event_data) const } else { - std::string url = LLSLURL::buildSLURL(event_data["regionname"], event_data["x"], event_data["y"], event_data["z"]); + std::string url = LLSLURL(event_data["regionname"], + LLVector3(event_data["x"].asReal(), + event_data["y"].asReal(), + event_data["z"].asReal())).getSLURLString(); LLURLDispatcher::dispatch(url, NULL, false); } } diff --git a/indra/newview/llagentui.cpp b/indra/newview/llagentui.cpp index 7404fe5bc4..15d9f36b74 100644 --- a/indra/newview/llagentui.cpp +++ b/indra/newview/llagentui.cpp @@ -49,12 +49,10 @@ void LLAgentUI::buildName(std::string& name) { name.clear(); - - LLVOAvatarSelf* avatar_object = gAgent.getAvatarObject(); - if (avatar_object) + if (isAgentAvatarValid()) { - LLNameValue *first_nv = avatar_object->getNVPair("FirstName"); - LLNameValue *last_nv = avatar_object->getNVPair("LastName"); + LLNameValue *first_nv = gAgentAvatarp->getNVPair("FirstName"); + LLNameValue *last_nv = gAgentAvatarp->getNVPair("LastName"); if (first_nv && last_nv) { name = first_nv->printData() + " " + last_nv->printData(); @@ -73,20 +71,20 @@ void LLAgentUI::buildName(std::string& name) //static void LLAgentUI::buildFullname(std::string& name) { - if (gAgent.getAvatarObject()) name = gAgent.getAvatarObject()->getFullname(); + if (isAgentAvatarValid()) + name = gAgentAvatarp->getFullname(); } //static -std::string LLAgentUI::buildSLURL(const bool escaped /*= true*/) +void LLAgentUI::buildSLURL(LLSLURL& slurl, const bool escaped /*= true*/) { - std::string slurl; - LLViewerRegion *regionp = gAgent.getRegion(); - if (regionp) - { - LLVector3d agentPos = gAgent.getPositionGlobal(); - slurl = LLSLURL::buildSLURLfromPosGlobal(regionp->getName(), agentPos, escaped); - } - return slurl; + LLSLURL return_slurl; + LLViewerRegion *regionp = gAgent.getRegion(); + if (regionp) + { + return_slurl = LLSLURL(regionp->getName(), gAgent.getPositionGlobal()); + } + slurl = return_slurl; } //static @@ -150,11 +148,17 @@ BOOL LLAgentUI::buildLocationString(std::string& str, ELocationFormat fmt,const sim_access_string.c_str()); break; case LOCATION_FORMAT_NO_MATURITY: - case LOCATION_FORMAT_FULL: buffer = llformat("%s (%d, %d, %d)", region_name.c_str(), pos_x, pos_y, pos_z); break; + case LOCATION_FORMAT_FULL: + buffer = llformat("%s (%d, %d, %d)%s%s", + region_name.c_str(), + pos_x, pos_y, pos_z, + sim_access_string.empty() ? "" : " - ", + sim_access_string.c_str()); + break; } } else diff --git a/indra/newview/llagentui.h b/indra/newview/llagentui.h index 3478793e38..577b752fbe 100644 --- a/indra/newview/llagentui.h +++ b/indra/newview/llagentui.h @@ -33,6 +33,8 @@ #ifndef LLAGENTUI_H #define LLAGENTUI_H +class LLSLURL; + class LLAgentUI { public: @@ -48,7 +50,7 @@ public: static void buildName(std::string& name); static void buildFullname(std::string &name); - static std::string buildSLURL(const bool escaped = true); + static void buildSLURL(LLSLURL& slurl, const bool escaped = true); //build location string using the current position of gAgent. static BOOL buildLocationString(std::string& str, ELocationFormat fmt = LOCATION_FORMAT_LANDMARK); //build location string using a region position of the avatar. diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp index 7cbd7e46a9..5728256dba 100644 --- a/indra/newview/llagentwearables.cpp +++ b/indra/newview/llagentwearables.cpp @@ -31,109 +31,58 @@ */ #include "llviewerprecompiledheaders.h" - -#include "llagent.h" #include "llagentwearables.h" +#include "llaccordionctrltab.h" +#include "llagent.h" +#include "llagentcamera.h" +#include "llagentwearablesfetch.h" +#include "llappearancemgr.h" #include "llcallbacklist.h" -#include "llfloatercustomize.h" +#include "llfolderview.h" +#include "llgesturemgr.h" #include "llinventorybridge.h" +#include "llinventoryfunctions.h" #include "llinventoryobserver.h" #include "llinventorypanel.h" +#include "llmd5.h" #include "llnotificationsutil.h" +#include "lloutfitobserver.h" +#include "llpaneloutfitsinventory.h" +#include "llsidepanelappearance.h" +#include "llsidetray.h" +#include "lltexlayer.h" #include "llviewerregion.h" #include "llvoavatarself.h" #include "llwearable.h" #include "llwearablelist.h" -#include "llgesturemgr.h" -#include "llappearancemgr.h" -#include "lltexlayer.h" -#include "llsidetray.h" -#include "llpaneloutfitsinventory.h" -#include "llfolderview.h" -#include "llaccordionctrltab.h" #include <boost/scoped_ptr.hpp> -#define USE_CURRENT_OUTFIT_FOLDER +LLAgentWearables gAgentWearables; -//-------------------------------------------------------------------- -// Classes for fetching initial wearables data -//-------------------------------------------------------------------- -// Outfit folder fetching callback structure. -class LLInitialWearablesFetch : public LLInventoryFetchDescendentsObserver -{ -public: - LLInitialWearablesFetch() {} - ~LLInitialWearablesFetch(); - virtual void done(); - - struct InitialWearableData - { - EWearableType mType; - LLUUID mItemID; - LLUUID mAssetID; - InitialWearableData(EWearableType type, LLUUID& itemID, LLUUID& assetID) : - mType(type), - mItemID(itemID), - mAssetID(assetID) - {} - }; - - typedef std::vector<InitialWearableData> initial_wearable_data_vec_t; - initial_wearable_data_vec_t mCOFInitialWearables; // Wearables from the Current Outfit Folder - initial_wearable_data_vec_t mAgentInitialWearables; // Wearables from the old agent wearables msg - -protected: - void processWearablesMessage(); - void processContents(); -}; +BOOL LLAgentWearables::mInitialWearablesUpdateReceived = FALSE; + +using namespace LLVOAvatarDefines; + +/////////////////////////////////////////////////////////////////////////////// -class LLLibraryOutfitsFetch : public LLInventoryFetchDescendentsObserver +// Callback to wear and start editing an item that has just been created. +class LLWearAndEditCallback : public LLInventoryCallback { -public: - enum ELibraryOutfitFetchStep { - LOFS_FOLDER = 0, - LOFS_OUTFITS, - LOFS_LIBRARY, - LOFS_IMPORTED, - LOFS_CONTENTS - }; - LLLibraryOutfitsFetch() : mCurrFetchStep(LOFS_FOLDER), mOutfitsPopulated(false) - { - mMyOutfitsID = LLUUID::null; - mClothingID = LLUUID::null; - mLibraryClothingID = LLUUID::null; - mImportedClothingID = LLUUID::null; - mImportedClothingName = "Imported Library Clothing"; - } - ~LLLibraryOutfitsFetch() {} - virtual void done(); - void doneIdle(); - LLUUID mMyOutfitsID; - void importedFolderFetch(); -protected: - void folderDone(void); - void outfitsDone(void); - void libraryDone(void); - void importedFolderDone(void); - void contentsDone(void); - enum ELibraryOutfitFetchStep mCurrFetchStep; - typedef std::vector< std::pair< LLUUID, std::string > > cloth_folder_vec_t; - cloth_folder_vec_t mLibraryClothingFolders; - cloth_folder_vec_t mImportedClothingFolders; - bool mOutfitsPopulated; - LLUUID mClothingID; - LLUUID mLibraryClothingID; - LLUUID mImportedClothingID; - std::string mImportedClothingName; -}; + void fire(const LLUUID& inv_item) + { + if (inv_item.isNull()) return; -LLAgentWearables gAgentWearables; + // Request editing the item after it gets worn. + gAgentWearables.requestEditingWearable(inv_item); -BOOL LLAgentWearables::mInitialWearablesUpdateReceived = FALSE; + // Wear it. + LLAppearanceMgr::instance().wearItemOnAvatar(inv_item); + } +}; -using namespace LLVOAvatarDefines; +/////////////////////////////////////////////////////////////////////////////// // HACK: For EXT-3923: Pants item shows in inventory with skin icon and messes with "current look" // Some db items are corrupted, have inventory flags = 0, implying wearable type = shape, even though @@ -171,13 +120,13 @@ void checkWearableAgainstInventory(LLWearable *wearable) void LLAgentWearables::dump() { llinfos << "LLAgentWearablesDump" << llendl; - for (S32 i = 0; i < WT_COUNT; i++) + for (S32 i = 0; i < LLWearableType::WT_COUNT; i++) { - U32 count = getWearableCount((EWearableType)i); + U32 count = getWearableCount((LLWearableType::EType)i); llinfos << "Type: " << i << " count " << count << llendl; for (U32 j=0; j<count; j++) { - LLWearable* wearable = getWearable((EWearableType)i,j); + LLWearable* wearable = getWearable((LLWearableType::EType)i,j); if (wearable == NULL) { llinfos << " " << j << " NULL wearable" << llendl; @@ -196,7 +145,6 @@ void LLAgentWearables::dump() } } -// MULTI-WEARABLE: debugging struct LLAgentDumper { LLAgentDumper(std::string name): @@ -218,8 +166,8 @@ struct LLAgentDumper }; LLAgentWearables::LLAgentWearables() : - mWearablesLoaded(FALSE), - mAvatarObject(NULL) + mWearablesLoaded(FALSE) +, mCOFChangeInProgress(false) { } @@ -230,12 +178,18 @@ LLAgentWearables::~LLAgentWearables() void LLAgentWearables::cleanup() { - mAvatarObject = NULL; +} + +// static +void LLAgentWearables::initClass() +{ + // this can not be called from constructor because its instance is global and is created too early. + // Subscribe to "COF is Saved" signal to notify observers about this (Loading indicator for ex.). + LLOutfitObserver::instance().addCOFSavedCallback(boost::bind(&LLAgentWearables::notifyLoadingFinished, &gAgentWearables)); } void LLAgentWearables::setAvatarObject(LLVOAvatarSelf *avatar) { - mAvatarObject = avatar; if (avatar) { sendAgentWearablesRequest(); @@ -245,6 +199,7 @@ void LLAgentWearables::setAvatarObject(LLVOAvatarSelf *avatar) // wearables LLAgentWearables::createStandardWearablesAllDoneCallback::~createStandardWearablesAllDoneCallback() { + llinfos << "destructor - all done?" << llendl; gAgentWearables.createStandardWearablesAllDone(); } @@ -264,17 +219,23 @@ LLAgentWearables::sendAgentWearablesUpdateCallback::~sendAgentWearablesUpdateCal * @param todo Bitmask of actions to take on completion. */ LLAgentWearables::addWearableToAgentInventoryCallback::addWearableToAgentInventoryCallback( - LLPointer<LLRefCount> cb, S32 type, U32 index, LLWearable* wearable, U32 todo) : + LLPointer<LLRefCount> cb, LLWearableType::EType type, U32 index, LLWearable* wearable, U32 todo) : mType(type), mIndex(index), mWearable(wearable), mTodo(todo), mCB(cb) { + llinfos << "constructor" << llendl; } void LLAgentWearables::addWearableToAgentInventoryCallback::fire(const LLUUID& inv_item) { + if (mTodo & CALL_CREATESTANDARDDONE) + { + llinfos << "callback fired, inv_item " << inv_item.asString() << llendl; + } + if (inv_item.isNull()) return; @@ -286,6 +247,7 @@ void LLAgentWearables::addWearableToAgentInventoryCallback::fire(const LLUUID& i } if (mTodo & CALL_RECOVERDONE) { + LLAppearanceMgr::instance().addCOFItemLink(inv_item,false); gAgentWearables.recoverMissingWearableDone(); } /* @@ -293,38 +255,48 @@ void LLAgentWearables::addWearableToAgentInventoryCallback::fire(const LLUUID& i */ if (mTodo & CALL_CREATESTANDARDDONE) { + LLAppearanceMgr::instance().addCOFItemLink(inv_item,false); gAgentWearables.createStandardWearablesDone(mType, mIndex); } if (mTodo & CALL_MAKENEWOUTFITDONE) { gAgentWearables.makeNewOutfitDone(mType, mIndex); } + if (mTodo & CALL_WEARITEM) + { + LLAppearanceMgr::instance().addCOFItemLink(inv_item, true); + } } -void LLAgentWearables::addWearabletoAgentInventoryDone(const S32 type, +void LLAgentWearables::addWearabletoAgentInventoryDone(const LLWearableType::EType type, const U32 index, const LLUUID& item_id, LLWearable* wearable) { + llinfos << "type " << type << " index " << index << " item " << item_id.asString() << llendl; + if (item_id.isNull()) return; - LLUUID old_item_id = getWearableItemID((EWearableType)type,index); + LLUUID old_item_id = getWearableItemID(type,index); + if (wearable) { wearable->setItemID(item_id); - } - if (old_item_id.notNull()) - { - gInventory.addChangedMask(LLInventoryObserver::LABEL, old_item_id); - setWearable((EWearableType)type,index,wearable); - } - else - { - pushWearable((EWearableType)type,wearable); + if (old_item_id.notNull()) + { + gInventory.addChangedMask(LLInventoryObserver::LABEL, old_item_id); + setWearable(type,index,wearable); + } + else + { + pushWearable(type,wearable); + } } + gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id); + LLViewerInventoryItem* item = gInventory.getItem(item_id); if (item && wearable) { @@ -341,13 +313,12 @@ void LLAgentWearables::addWearabletoAgentInventoryDone(const S32 type, void LLAgentWearables::sendAgentWearablesUpdate() { - // MULTI-WEARABLE: call i "type" or something. // First make sure that we have inventory items for each wearable - for (S32 type=0; type < WT_COUNT; ++type) + for (S32 type=0; type < LLWearableType::WT_COUNT; ++type) { - for (U32 j=0; j < getWearableCount((EWearableType)type); ++j) + for (U32 index=0; index < getWearableCount((LLWearableType::EType)type); ++index) { - LLWearable* wearable = getWearable((EWearableType)type,j); + LLWearable* wearable = getWearable((LLWearableType::EType)type,index); if (wearable) { if (wearable->getItemID().isNull()) @@ -355,8 +326,8 @@ void LLAgentWearables::sendAgentWearablesUpdate() LLPointer<LLInventoryCallback> cb = new addWearableToAgentInventoryCallback( LLPointer<LLRefCount>(NULL), - type, - j, + (LLWearableType::EType)type, + index, wearable, addWearableToAgentInventoryCallback::CALL_NONE); addWearableToAgentInventory(cb, wearable); @@ -381,16 +352,15 @@ void LLAgentWearables::sendAgentWearablesUpdate() gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); lldebugs << "sendAgentWearablesUpdate()" << llendl; - // MULTI-WEARABLE: update for multi-wearables after server-side support is in. - for (S32 type=0; type < WT_COUNT; ++type) + // MULTI-WEARABLE: DEPRECATED: HACK: index to 0- server database tables don't support concept of multiwearables. + for (S32 type=0; type < LLWearableType::WT_COUNT; ++type) { gMessageSystem->nextBlockFast(_PREHASH_WearableData); U8 type_u8 = (U8)type; gMessageSystem->addU8Fast(_PREHASH_WearableType, type_u8); - // MULTI-WEARABLE: TODO: hacked index to 0, needs to loop over all once messages support this. - LLWearable* wearable = getWearable((EWearableType)type, 0); + LLWearable* wearable = getWearable((LLWearableType::EType)type, 0); if (wearable) { //llinfos << "Sending wearable " << wearable->getName() << llendl; @@ -406,16 +376,16 @@ void LLAgentWearables::sendAgentWearablesUpdate() } else { - //llinfos << "Not wearing wearable type " << LLWearableDictionary::getInstance()->getWearable((EWearableType)i) << llendl; + //llinfos << "Not wearing wearable type " << LLWearableType::getTypeName((LLWearableType::EType)i) << llendl; gMessageSystem->addUUIDFast(_PREHASH_ItemID, LLUUID::null); } - lldebugs << " " << LLWearableDictionary::getTypeLabel((EWearableType)type) << ": " << (wearable ? wearable->getAssetID() : LLUUID::null) << llendl; + lldebugs << " " << LLWearableType::getTypeLabel((LLWearableType::EType)type) << ": " << (wearable ? wearable->getAssetID() : LLUUID::null) << llendl; } gAgent.sendReliableMessage(); } -void LLAgentWearables::saveWearable(const EWearableType type, const U32 index, BOOL send_update) +void LLAgentWearables::saveWearable(const LLWearableType::EType type, const U32 index, BOOL send_update) { LLWearable* old_wearable = getWearable(type, index); if (old_wearable && (old_wearable->isDirty() || old_wearable->isOldVersion())) @@ -425,6 +395,11 @@ void LLAgentWearables::saveWearable(const EWearableType type, const U32 index, B new_wearable->setItemID(old_item_id); // should this be in LLWearable::copyDataFrom()? setWearable(type,index,new_wearable); + // old_wearable may still be referred to by other inventory items. Revert + // unsaved changes so other inventory items aren't affected by the changes + // that were just saved. + old_wearable->revertValues(); + LLInventoryItem* item = gInventory.getItem(old_item_id); if (item) { @@ -456,7 +431,7 @@ void LLAgentWearables::saveWearable(const EWearableType type, const U32 index, B LLPointer<LLInventoryCallback> cb = new addWearableToAgentInventoryCallback( LLPointer<LLRefCount>(NULL), - (S32)type, + type, index, new_wearable, todo); @@ -464,7 +439,7 @@ void LLAgentWearables::saveWearable(const EWearableType type, const U32 index, B return; } - gAgent.getAvatarObject()->wearableUpdated( type, TRUE ); + gAgentAvatarp->wearableUpdated( type, TRUE ); if (send_update) { @@ -473,7 +448,7 @@ void LLAgentWearables::saveWearable(const EWearableType type, const U32 index, B } } -void LLAgentWearables::saveWearableAs(const EWearableType type, +void LLAgentWearables::saveWearableAs(const LLWearableType::EType type, const U32 index, const std::string& new_name, BOOL save_in_lost_and_found) @@ -507,7 +482,7 @@ void LLAgentWearables::saveWearableAs(const EWearableType type, type, index, new_wearable, - addWearableToAgentInventoryCallback::CALL_UPDATE); + addWearableToAgentInventoryCallback::CALL_WEARITEM); LLUUID category_id; if (save_in_lost_and_found) { @@ -527,9 +502,14 @@ void LLAgentWearables::saveWearableAs(const EWearableType type, category_id, new_name, cb); + + // old_wearable may still be referred to by other inventory items. Revert + // unsaved changes so other inventory items aren't affected by the changes + // that were just saved. + old_wearable->revertValues(); } -void LLAgentWearables::revertWearable(const EWearableType type, const U32 index) +void LLAgentWearables::revertWearable(const LLWearableType::EType type, const U32 index) { LLWearable* wearable = getWearable(type, index); wearable->revertValues(); @@ -544,10 +524,10 @@ void LLAgentWearables::saveAllWearables() // return; //} - for (S32 i=0; i < WT_COUNT; i++) + for (S32 i=0; i < LLWearableType::WT_COUNT; i++) { - for (U32 j=0; j < getWearableCount((EWearableType)i); j++) - saveWearable((EWearableType)i, j, FALSE); + for (U32 j=0; j < getWearableCount((LLWearableType::EType)i); j++) + saveWearable((LLWearableType::EType)i, j, FALSE); } sendAgentWearablesUpdate(); } @@ -555,14 +535,14 @@ void LLAgentWearables::saveAllWearables() // Called when the user changes the name of a wearable inventory item that is currently being worn. void LLAgentWearables::setWearableName(const LLUUID& item_id, const std::string& new_name) { - for (S32 i=0; i < WT_COUNT; i++) + for (S32 i=0; i < LLWearableType::WT_COUNT; i++) { - for (U32 j=0; j < getWearableCount((EWearableType)i); j++) + for (U32 j=0; j < getWearableCount((LLWearableType::EType)i); j++) { - LLUUID curr_item_id = getWearableItemID((EWearableType)i,j); + LLUUID curr_item_id = getWearableItemID((LLWearableType::EType)i,j); if (curr_item_id == item_id) { - LLWearable* old_wearable = getWearable((EWearableType)i,j); + LLWearable* old_wearable = getWearable((LLWearableType::EType)i,j); llassert(old_wearable); std::string old_name = old_wearable->getName(); @@ -576,7 +556,7 @@ void LLAgentWearables::setWearableName(const LLUUID& item_id, const std::string& } old_wearable->setName(old_name); - setWearable((EWearableType)i,j,new_wearable); + setWearable((LLWearableType::EType)i,j,new_wearable); sendAgentWearablesUpdate(); break; } @@ -585,12 +565,18 @@ void LLAgentWearables::setWearableName(const LLUUID& item_id, const std::string& } -BOOL LLAgentWearables::isWearableModifiable(EWearableType type, U32 index) const +BOOL LLAgentWearables::isWearableModifiable(LLWearableType::EType type, U32 index) const { LLUUID item_id = getWearableItemID(type, index); - if (!item_id.isNull()) + return item_id.notNull() ? isWearableModifiable(item_id) : FALSE; +} + +BOOL LLAgentWearables::isWearableModifiable(const LLUUID& item_id) const +{ + const LLUUID& linked_id = gInventory.getLinkedItemID(item_id); + if (linked_id.notNull()) { - LLInventoryItem* item = gInventory.getItem(item_id); + LLInventoryItem* item = gInventory.getItem(linked_id); if (item && item->getPermissions().allowModifyBy(gAgent.getID(), gAgent.getGroupID())) { @@ -600,7 +586,7 @@ BOOL LLAgentWearables::isWearableModifiable(EWearableType type, U32 index) const return FALSE; } -BOOL LLAgentWearables::isWearableCopyable(EWearableType type, U32 index) const +BOOL LLAgentWearables::isWearableCopyable(LLWearableType::EType type, U32 index) const { LLUUID item_id = getWearableItemID(type, index); if (!item_id.isNull()) @@ -616,7 +602,7 @@ BOOL LLAgentWearables::isWearableCopyable(EWearableType type, U32 index) const } /* - U32 LLAgentWearables::getWearablePermMask(EWearableType type) + U32 LLAgentWearables::getWearablePermMask(LLWearableType::EType type) { LLUUID item_id = getWearableItemID(type); if (!item_id.isNull()) @@ -631,7 +617,7 @@ BOOL LLAgentWearables::isWearableCopyable(EWearableType type, U32 index) const } */ -LLInventoryItem* LLAgentWearables::getWearableInventoryItem(EWearableType type, U32 index) +LLInventoryItem* LLAgentWearables::getWearableInventoryItem(LLWearableType::EType type, U32 index) { LLUUID item_id = getWearableItemID(type,index); LLInventoryItem* item = NULL; @@ -644,12 +630,30 @@ LLInventoryItem* LLAgentWearables::getWearableInventoryItem(EWearableType type, const LLWearable* LLAgentWearables::getWearableFromItemID(const LLUUID& item_id) const { - for (S32 i=0; i < WT_COUNT; i++) + const LLUUID& base_item_id = gInventory.getLinkedItemID(item_id); + for (S32 i=0; i < LLWearableType::WT_COUNT; i++) + { + for (U32 j=0; j < getWearableCount((LLWearableType::EType)i); j++) + { + const LLWearable * curr_wearable = getWearable((LLWearableType::EType)i, j); + if (curr_wearable && (curr_wearable->getItemID() == base_item_id)) + { + return curr_wearable; + } + } + } + return NULL; +} + +LLWearable* LLAgentWearables::getWearableFromItemID(const LLUUID& item_id) +{ + const LLUUID& base_item_id = gInventory.getLinkedItemID(item_id); + for (S32 i=0; i < LLWearableType::WT_COUNT; i++) { - for (U32 j=0; j < getWearableCount((EWearableType)i); j++) + for (U32 j=0; j < getWearableCount((LLWearableType::EType)i); j++) { - const LLWearable * curr_wearable = getWearable((EWearableType)i, j); - if (curr_wearable && (curr_wearable->getItemID() == item_id)) + LLWearable * curr_wearable = getWearable((LLWearableType::EType)i, j); + if (curr_wearable && (curr_wearable->getItemID() == base_item_id)) { return curr_wearable; } @@ -658,13 +662,13 @@ const LLWearable* LLAgentWearables::getWearableFromItemID(const LLUUID& item_id) return NULL; } -const LLWearable* LLAgentWearables::getWearableFromAssetID(const LLUUID& asset_id) const +LLWearable* LLAgentWearables::getWearableFromAssetID(const LLUUID& asset_id) { - for (S32 i=0; i < WT_COUNT; i++) + for (S32 i=0; i < LLWearableType::WT_COUNT; i++) { - for (U32 j=0; j < getWearableCount((EWearableType)i); j++) + for (U32 j=0; j < getWearableCount((LLWearableType::EType)i); j++) { - const LLWearable * curr_wearable = getWearable((EWearableType)i, j); + LLWearable * curr_wearable = getWearable((LLWearableType::EType)i, j); if (curr_wearable && (curr_wearable->getAssetID() == asset_id)) { return curr_wearable; @@ -684,12 +688,12 @@ void LLAgentWearables::sendAgentWearablesRequest() } // static -BOOL LLAgentWearables::selfHasWearable(EWearableType type) +BOOL LLAgentWearables::selfHasWearable(LLWearableType::EType type) { return (gAgentWearables.getWearableCount(type) > 0); } -LLWearable* LLAgentWearables::getWearable(const EWearableType type, U32 index) +LLWearable* LLAgentWearables::getWearable(const LLWearableType::EType type, U32 index) { wearableentry_map_t::iterator wearable_iter = mWearableDatas.find(type); if (wearable_iter == mWearableDatas.end()) @@ -707,7 +711,7 @@ LLWearable* LLAgentWearables::getWearable(const EWearableType type, U32 index) } } -void LLAgentWearables::setWearable(const EWearableType type, U32 index, LLWearable *wearable) +void LLAgentWearables::setWearable(const LLWearableType::EType type, U32 index, LLWearable *wearable) { LLWearable *old_wearable = getWearable(type,index); @@ -737,27 +741,27 @@ void LLAgentWearables::setWearable(const EWearableType type, U32 index, LLWearab } } -U32 LLAgentWearables::pushWearable(const EWearableType type, LLWearable *wearable) +U32 LLAgentWearables::pushWearable(const LLWearableType::EType type, LLWearable *wearable) { if (wearable == NULL) { // no null wearables please! llwarns << "Null wearable sent for type " << type << llendl; - return MAX_WEARABLES_PER_TYPE; + return MAX_CLOTHING_PER_TYPE; } - if (type < WT_COUNT || mWearableDatas[type].size() < MAX_WEARABLES_PER_TYPE) + if (type < LLWearableType::WT_COUNT || mWearableDatas[type].size() < MAX_CLOTHING_PER_TYPE) { mWearableDatas[type].push_back(wearable); wearableUpdated(wearable); checkWearableAgainstInventory(wearable); return mWearableDatas[type].size()-1; } - return MAX_WEARABLES_PER_TYPE; + return MAX_CLOTHING_PER_TYPE; } void LLAgentWearables::wearableUpdated(LLWearable *wearable) { - mAvatarObject->wearableUpdated(wearable->getType(), TRUE); + gAgentAvatarp->wearableUpdated(wearable->getType(), FALSE); wearable->refreshName(); wearable->setLabelUpdated(); @@ -787,21 +791,21 @@ void LLAgentWearables::popWearable(LLWearable *wearable) } U32 index = getWearableIndex(wearable); - EWearableType type = wearable->getType(); + LLWearableType::EType type = wearable->getType(); - if (index < MAX_WEARABLES_PER_TYPE && index < getWearableCount(type)) + if (index < MAX_CLOTHING_PER_TYPE && index < getWearableCount(type)) { popWearable(type, index); } } -void LLAgentWearables::popWearable(const EWearableType type, U32 index) +void LLAgentWearables::popWearable(const LLWearableType::EType type, U32 index) { LLWearable *wearable = getWearable(type, index); if (wearable) { mWearableDatas[type].erase(mWearableDatas[type].begin() + index); - mAvatarObject->wearableUpdated(wearable->getType(), TRUE); + gAgentAvatarp->wearableUpdated(wearable->getType(), FALSE); wearable->setLabelUpdated(); } } @@ -810,15 +814,15 @@ U32 LLAgentWearables::getWearableIndex(LLWearable *wearable) { if (wearable == NULL) { - return MAX_WEARABLES_PER_TYPE; + return MAX_CLOTHING_PER_TYPE; } - const EWearableType type = wearable->getType(); + const LLWearableType::EType type = wearable->getType(); wearableentry_map_t::const_iterator wearable_iter = mWearableDatas.find(type); if (wearable_iter == mWearableDatas.end()) { llwarns << "tried to get wearable index with an invalid type!" << llendl; - return MAX_WEARABLES_PER_TYPE; + return MAX_CLOTHING_PER_TYPE; } const wearableentry_vec_t& wearable_vec = wearable_iter->second; for(U32 index = 0; index < wearable_vec.size(); index++) @@ -829,10 +833,10 @@ U32 LLAgentWearables::getWearableIndex(LLWearable *wearable) } } - return MAX_WEARABLES_PER_TYPE; + return MAX_CLOTHING_PER_TYPE; } -const LLWearable* LLAgentWearables::getWearable(const EWearableType type, U32 index) const +const LLWearable* LLAgentWearables::getWearable(const LLWearableType::EType type, U32 index) const { wearableentry_map_t::const_iterator wearable_iter = mWearableDatas.find(type); if (wearable_iter == mWearableDatas.end()) @@ -850,7 +854,7 @@ const LLWearable* LLAgentWearables::getWearable(const EWearableType type, U32 in } } -LLWearable* LLAgentWearables::getTopWearable(const EWearableType type) +LLWearable* LLAgentWearables::getTopWearable(const LLWearableType::EType type) { U32 count = getWearableCount(type); if ( count == 0) @@ -861,7 +865,17 @@ LLWearable* LLAgentWearables::getTopWearable(const EWearableType type) return getWearable(type, count-1); } -U32 LLAgentWearables::getWearableCount(const EWearableType type) const +LLWearable* LLAgentWearables::getBottomWearable(const LLWearableType::EType type) +{ + if (getWearableCount(type) == 0) + { + return NULL; + } + + return getWearable(type, 0); +} + +U32 LLAgentWearables::getWearableCount(const LLWearableType::EType type) const { wearableentry_map_t::const_iterator wearable_iter = mWearableDatas.find(type); if (wearable_iter == mWearableDatas.end()) @@ -874,7 +888,7 @@ U32 LLAgentWearables::getWearableCount(const EWearableType type) const U32 LLAgentWearables::getWearableCount(const U32 tex_index) const { - const EWearableType wearable_type = LLVOAvatarDictionary::getTEWearableType((LLVOAvatarDefines::ETextureIndex)tex_index); + const LLWearableType::EType wearable_type = LLVOAvatarDictionary::getTEWearableType((LLVOAvatarDefines::ETextureIndex)tex_index); return getWearableCount(wearable_type); } @@ -889,7 +903,7 @@ U32 LLAgentWearables::itemUpdatePendingCount() const return mItemsAwaitingWearableUpdate.size(); } -const LLUUID LLAgentWearables::getWearableItemID(EWearableType type, U32 index) const +const LLUUID LLAgentWearables::getWearableItemID(LLWearableType::EType type, U32 index) const { const LLWearable *wearable = getWearable(type,index); if (wearable) @@ -898,7 +912,7 @@ const LLUUID LLAgentWearables::getWearableItemID(EWearableType type, U32 index) return LLUUID(); } -const LLUUID LLAgentWearables::getWearableAssetID(EWearableType type, U32 index) const +const LLUUID LLAgentWearables::getWearableAssetID(LLWearableType::EType type, U32 index) const { const LLWearable *wearable = getWearable(type,index); if (wearable) @@ -909,32 +923,32 @@ const LLUUID LLAgentWearables::getWearableAssetID(EWearableType type, U32 index) BOOL LLAgentWearables::isWearingItem(const LLUUID& item_id) const { - const LLUUID& base_item_id = gInventory.getLinkedItemID(item_id); - if (getWearableFromItemID(base_item_id) != NULL) - { - return TRUE; - } - return FALSE; + return getWearableFromItemID(item_id) != NULL; } -// MULTI-WEARABLE: update for multiple +// MULTI-WEARABLE: DEPRECATED (see backwards compatibility) // static // ! BACKWARDS COMPATIBILITY ! When we stop supporting viewer1.23, we can assume // that viewers have a Current Outfit Folder and won't need this message, and thus -// we can remove/ignore this whole function. +// we can remove/ignore this whole function. EXCEPT gAgentWearables.notifyLoadingStarted void LLAgentWearables::processAgentInitialWearablesUpdate(LLMessageSystem* mesgsys, void** user_data) { // We should only receive this message a single time. Ignore subsequent AgentWearablesUpdates // that may result from AgentWearablesRequest having been sent more than once. if (mInitialWearablesUpdateReceived) return; + + // notify subscribers that wearables started loading. See EXT-7777 + // *TODO: find more proper place to not be called from deprecated method. + // Seems such place is found: LLInitialWearablesFetch::processContents() + gAgentWearables.notifyLoadingStarted(); + mInitialWearablesUpdateReceived = true; LLUUID agent_id; gMessageSystem->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id); - LLVOAvatar* avatar = gAgent.getAvatarObject(); - if (avatar && (agent_id == avatar->getID())) + if (isAgentAvatarValid() && (agent_id == gAgentAvatarp->getID())) { gMessageSystem->getU32Fast(_PREHASH_AgentData, _PREHASH_SerialNum, gAgentQueryManager.mUpdateSerialNum); @@ -952,23 +966,22 @@ void LLAgentWearables::processAgentInitialWearablesUpdate(LLMessageSystem* mesgs // Get the UUID of the current outfit folder (will be created if it doesn't exist) const LLUUID current_outfit_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT); - - LLInitialWearablesFetch* outfit = new LLInitialWearablesFetch(); + LLInitialWearablesFetch* outfit = new LLInitialWearablesFetch(current_outfit_id); //lldebugs << "processAgentInitialWearablesUpdate()" << llendl; // Add wearables - // MULTI-WEARABLE: TODO: update once messages change. Currently use results to populate the zeroth element. + // MULTI-WEARABLE: DEPRECATED: Message only supports one wearable per type, will be ignored in future. gAgentWearables.mItemsAwaitingWearableUpdate.clear(); for (S32 i=0; i < num_wearables; i++) { // Parse initial wearables data from message system U8 type_u8 = 0; gMessageSystem->getU8Fast(_PREHASH_WearableData, _PREHASH_WearableType, type_u8, i); - if (type_u8 >= WT_COUNT) + if (type_u8 >= LLWearableType::WT_COUNT) { continue; } - const EWearableType type = (EWearableType) type_u8; + const LLWearableType::EType type = (LLWearableType::EType) type_u8; LLUUID item_id; gMessageSystem->getUUIDFast(_PREHASH_WearableData, _PREHASH_ItemID, item_id, i); @@ -981,29 +994,26 @@ void LLAgentWearables::processAgentInitialWearablesUpdate(LLMessageSystem* mesgs } else { - LLAssetType::EType asset_type = LLWearableDictionary::getAssetType(type); + LLAssetType::EType asset_type = LLWearableType::getAssetType(type); if (asset_type == LLAssetType::AT_NONE) { continue; } - // MULTI-WEARABLE: TODO: update once messages change. Currently use results to populate the zeroth element. + // MULTI-WEARABLE: DEPRECATED: this message only supports one wearable per type. Should be ignored in future versions // Store initial wearables data until we know whether we have the current outfit folder or need to use the data. - LLInitialWearablesFetch::InitialWearableData wearable_data(type, item_id, asset_id); // MULTI-WEARABLE: update - outfit->mAgentInitialWearables.push_back(wearable_data); - + LLInitialWearablesFetch::InitialWearableData wearable_data(type, item_id, asset_id); + outfit->add(wearable_data); } - lldebugs << " " << LLWearableDictionary::getTypeLabel(type) << llendl; + lldebugs << " " << LLWearableType::getTypeLabel(type) << llendl; } // Get the complete information on the items in the inventory and set up an observer // that will trigger when the complete information is fetched. - LLInventoryFetchDescendentsObserver::folder_ref_t folders; - folders.push_back(current_outfit_id); - outfit->fetchDescendents(folders); - if(outfit->isEverythingComplete()) + outfit->startFetch(); + if(outfit->isFinished()) { // everything is already here - call done. outfit->done(); @@ -1018,74 +1028,16 @@ void LLAgentWearables::processAgentInitialWearablesUpdate(LLMessageSystem* mesgs } } -// A single wearable that the avatar was wearing on start-up has arrived from the database. -// static -void LLAgentWearables::onInitialWearableAssetArrived(LLWearable* wearable, void* userdata) -{ - boost::scoped_ptr<LLInitialWearablesFetch::InitialWearableData> wear_data((LLInitialWearablesFetch::InitialWearableData*)userdata); - const EWearableType type = wear_data->mType; - U32 index = 0; - - LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); - if (!avatar) - { - return; - } - - if (wearable) - { - llassert(type == wearable->getType()); - wearable->setItemID(wear_data->mItemID); - index = gAgentWearables.pushWearable(type, wearable); - gAgentWearables.mItemsAwaitingWearableUpdate.erase(wear_data->mItemID); - - // disable composites if initial textures are baked - avatar->setupComposites(); - - avatar->setCompositeUpdatesEnabled(TRUE); - gInventory.addChangedMask(LLInventoryObserver::LABEL, wearable->getItemID()); - } - else - { - // Somehow the asset doesn't exist in the database. - gAgentWearables.recoverMissingWearable(type,index); - } - - gInventory.notifyObservers(); - - // Have all the wearables that the avatar was wearing at log-in arrived? - // MULTI-WEARABLE: update when multiple wearables can arrive per type. - - gAgentWearables.updateWearablesLoaded(); - if (gAgentWearables.areWearablesLoaded()) - { - - // Can't query cache until all wearables have arrived, so calling this earlier is a no-op. - gAgentWearables.queryWearableCache(); - - // Make sure that the server's idea of the avatar's wearables actually match the wearables. - gAgent.sendAgentSetAppearance(); - - // Check to see if there are any baked textures that we hadn't uploaded before we logged off last time. - // If there are any, schedule them to be uploaded as soon as the layer textures they depend on arrive. - if (gAgent.cameraCustomizeAvatar()) - { - avatar->requestLayerSetUploads(); - } - } -} - // Normally, all wearables referred to "AgentWearablesUpdate" will correspond to actual assets in the // database. If for some reason, we can't load one of those assets, we can try to reconstruct it so that // the user isn't left without a shape, for example. (We can do that only after the inventory has loaded.) -void LLAgentWearables::recoverMissingWearable(const EWearableType type, U32 index) +void LLAgentWearables::recoverMissingWearable(const LLWearableType::EType type, U32 index) { // Try to recover by replacing missing wearable with a new one. LLNotificationsUtil::add("ReplacedMissingWearable"); - lldebugs << "Wearable " << LLWearableDictionary::getTypeLabel(type) << " could not be downloaded. Replaced inventory item with default wearable." << llendl; + lldebugs << "Wearable " << LLWearableType::getTypeLabel(type) << " could not be downloaded. Replaced inventory item with default wearable." << llendl; LLWearable* new_wearable = LLWearableList::instance().createNewWearable(type); - S32 type_s32 = (S32) type; setWearable(type,index,new_wearable); //new_wearable->writeToAvatar(TRUE); @@ -1096,7 +1048,7 @@ void LLAgentWearables::recoverMissingWearable(const EWearableType type, U32 inde LLPointer<LLInventoryCallback> cb = new addWearableToAgentInventoryCallback( LLPointer<LLRefCount>(NULL), - type_s32, + type, index, new_wearable, addWearableToAgentInventoryCallback::CALL_RECOVERDONE); @@ -1119,9 +1071,9 @@ void LLAgentWearables::recoverMissingWearableDone() } } -void LLAgentWearables::addLocalTextureObject(const EWearableType wearable_type, const LLVOAvatarDefines::ETextureIndex texture_type, U32 wearable_index) +void LLAgentWearables::addLocalTextureObject(const LLWearableType::EType wearable_type, const LLVOAvatarDefines::ETextureIndex texture_type, U32 wearable_index) { - LLWearable* wearable = getWearable((EWearableType)wearable_type, wearable_index); + LLWearable* wearable = getWearable((LLWearableType::EType)wearable_type, wearable_index); if (!wearable) { llerrs << "Tried to add local texture object to invalid wearable with type " << wearable_type << " and index " << wearable_index << llendl; @@ -1131,234 +1083,155 @@ void LLAgentWearables::addLocalTextureObject(const EWearableType wearable_type, wearable->setLocalTextureObject(texture_type, lto); } +class OnWearableItemCreatedCB: public LLInventoryCallback +{ +public: + OnWearableItemCreatedCB(): + mWearablesAwaitingItems(LLWearableType::WT_COUNT,NULL) + { + llinfos << "created callback" << llendl; + } + /* virtual */ void fire(const LLUUID& inv_item) + { + llinfos << "One item created " << inv_item.asString() << llendl; + LLViewerInventoryItem *item = gInventory.getItem(inv_item); + mItemsToLink.put(item); + updatePendingWearable(inv_item); + } + ~OnWearableItemCreatedCB() + { + llinfos << "All items created" << llendl; + LLPointer<LLInventoryCallback> link_waiter = new LLUpdateAppearanceOnDestroy; + LLAppearanceMgr::instance().linkAll(LLAppearanceMgr::instance().getCOF(), + mItemsToLink, + link_waiter); + } + void addPendingWearable(LLWearable *wearable) + { + if (!wearable) + { + llwarns << "no wearable" << llendl; + return; + } + LLWearableType::EType type = wearable->getType(); + if (type<LLWearableType::WT_COUNT) + { + mWearablesAwaitingItems[type] = wearable; + } + else + { + llwarns << "invalid type " << type << llendl; + } + } + void updatePendingWearable(const LLUUID& inv_item) + { + LLViewerInventoryItem *item = gInventory.getItem(inv_item); + if (!item) + { + llwarns << "no item found" << llendl; + return; + } + if (!item->isWearableType()) + { + llwarns << "non-wearable item found" << llendl; + return; + } + if (item && item->isWearableType()) + { + LLWearableType::EType type = item->getWearableType(); + if (type < LLWearableType::WT_COUNT) + { + LLWearable *wearable = mWearablesAwaitingItems[type]; + if (wearable) + wearable->setItemID(inv_item); + } + else + { + llwarns << "invalid wearable type " << type << llendl; + } + } + } + +private: + LLInventoryModel::item_array_t mItemsToLink; + std::vector<LLWearable*> mWearablesAwaitingItems; +}; + void LLAgentWearables::createStandardWearables(BOOL female) { llwarns << "Creating Standard " << (female ? "female" : "male") << " Wearables" << llendl; - if (mAvatarObject.isNull()) - { - return; - } + if (!isAgentAvatarValid()) return; - mAvatarObject->setSex(female ? SEX_FEMALE : SEX_MALE); + gAgentAvatarp->setSex(female ? SEX_FEMALE : SEX_MALE); - const BOOL create[WT_COUNT] = + const BOOL create[LLWearableType::WT_COUNT] = { - TRUE, //WT_SHAPE - TRUE, //WT_SKIN - TRUE, //WT_HAIR - TRUE, //WT_EYES - TRUE, //WT_SHIRT - TRUE, //WT_PANTS - TRUE, //WT_SHOES - TRUE, //WT_SOCKS - FALSE, //WT_JACKET - FALSE, //WT_GLOVES - TRUE, //WT_UNDERSHIRT - TRUE, //WT_UNDERPANTS - FALSE //WT_SKIRT + TRUE, //LLWearableType::WT_SHAPE + TRUE, //LLWearableType::WT_SKIN + TRUE, //LLWearableType::WT_HAIR + TRUE, //LLWearableType::WT_EYES + TRUE, //LLWearableType::WT_SHIRT + TRUE, //LLWearableType::WT_PANTS + TRUE, //LLWearableType::WT_SHOES + TRUE, //LLWearableType::WT_SOCKS + FALSE, //LLWearableType::WT_JACKET + FALSE, //LLWearableType::WT_GLOVES + TRUE, //LLWearableType::WT_UNDERSHIRT + TRUE, //LLWearableType::WT_UNDERPANTS + FALSE //LLWearableType::WT_SKIRT }; - for (S32 i=0; i < WT_COUNT; i++) + LLPointer<LLInventoryCallback> cb = new OnWearableItemCreatedCB; + for (S32 i=0; i < LLWearableType::WT_COUNT; i++) { - bool once = false; - LLPointer<LLRefCount> donecb = NULL; if (create[i]) { - if (!once) - { - once = true; - donecb = new createStandardWearablesAllDoneCallback; - } - llassert(getWearableCount((EWearableType)i) == 0); - LLWearable* wearable = LLWearableList::instance().createNewWearable((EWearableType)i); - U32 index = pushWearable((EWearableType)i,wearable); + llassert(getWearableCount((LLWearableType::EType)i) == 0); + LLWearable* wearable = LLWearableList::instance().createNewWearable((LLWearableType::EType)i); + ((OnWearableItemCreatedCB*)(&(*cb)))->addPendingWearable(wearable); // no need to update here... - LLPointer<LLInventoryCallback> cb = - new addWearableToAgentInventoryCallback( - donecb, - i, - index, - wearable, - addWearableToAgentInventoryCallback::CALL_CREATESTANDARDDONE); - addWearableToAgentInventory(cb, wearable, LLUUID::null, FALSE); + LLUUID category_id = LLUUID::null; + create_inventory_item(gAgent.getID(), + gAgent.getSessionID(), + category_id, + wearable->getTransactionID(), + wearable->getName(), + wearable->getDescription(), + wearable->getAssetType(), + LLInventoryType::IT_WEARABLE, + wearable->getType(), + wearable->getPermissions().getMaskNextOwner(), + cb); } } } void LLAgentWearables::createStandardWearablesDone(S32 type, U32 index) { - if (mAvatarObject) - { - mAvatarObject->updateVisualParams(); - } + llinfos << "type " << type << " index " << index << llendl; + + if (!isAgentAvatarValid()) return; + gAgentAvatarp->updateVisualParams(); } void LLAgentWearables::createStandardWearablesAllDone() { // ... because sendAgentWearablesUpdate will notify inventory // observers. + llinfos << "all done?" << llendl; + mWearablesLoaded = TRUE; checkWearablesLoaded(); + notifyLoadingFinished(); updateServer(); // Treat this as the first texture entry message, if none received yet - mAvatarObject->onFirstTEMessageReceived(); -} - -// MULTI-WEARABLE: Properly handle multiwearables later. -void LLAgentWearables::getAllWearablesArray(LLDynamicArray<S32>& wearables) -{ - for( S32 i = 0; i < WT_COUNT; ++i ) - { - if (getWearableCount((EWearableType) i) != 0) - { - wearables.push_back(i); - } - } + gAgentAvatarp->onFirstTEMessageReceived(); } -// Note: wearables_to_include should be a list of EWearableType types -// attachments_to_include should be a list of attachment points -void LLAgentWearables::makeNewOutfit(const std::string& new_folder_name, - const LLDynamicArray<S32>& wearables_to_include, - const LLDynamicArray<S32>& attachments_to_include, - BOOL rename_clothing) -{ - if (mAvatarObject.isNull()) - { - return; - } - - // First, make a folder in the Clothes directory. - LLUUID folder_id = gInventory.createNewCategory( - gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING), - LLFolderType::FT_NONE, - new_folder_name); - - bool found_first_item = false; - - /////////////////// - // Wearables - - if (wearables_to_include.count()) - { - // Then, iterate though each of the wearables and save copies of them in the folder. - S32 i; - S32 count = wearables_to_include.count(); - LLDynamicArray<LLUUID> delete_items; - LLPointer<LLRefCount> cbdone = NULL; - for (i = 0; i < count; ++i) - { - const S32 type = wearables_to_include[i]; - for (U32 j=0; j<getWearableCount((EWearableType)i); j++) - { - LLWearable* old_wearable = getWearable((EWearableType)type, j); - if (old_wearable) - { - std::string new_name; - LLWearable* new_wearable; - new_wearable = LLWearableList::instance().createCopy(old_wearable); - if (rename_clothing) - { - new_name = new_folder_name; - new_name.append(" "); - new_name.append(old_wearable->getTypeLabel()); - LLStringUtil::truncate(new_name, DB_INV_ITEM_NAME_STR_LEN); - new_wearable->setName(new_name); - } - - LLViewerInventoryItem* item = gInventory.getItem(getWearableItemID((EWearableType)type,j)); - S32 todo = addWearableToAgentInventoryCallback::CALL_NONE; - if (!found_first_item) - { - found_first_item = true; - /* set the focus to the first item */ - todo |= addWearableToAgentInventoryCallback::CALL_MAKENEWOUTFITDONE; - /* send the agent wearables update when done */ - cbdone = new sendAgentWearablesUpdateCallback; - } - LLPointer<LLInventoryCallback> cb = - new addWearableToAgentInventoryCallback( - cbdone, - type, - j, - new_wearable, - todo); - if (isWearableCopyable((EWearableType)type, j)) - { - copy_inventory_item( - gAgent.getID(), - item->getPermissions().getOwner(), - item->getUUID(), - folder_id, - new_name, - cb); - } - else - { - move_inventory_item( - gAgent.getID(), - gAgent.getSessionID(), - item->getUUID(), - folder_id, - new_name, - cb); - } - } - } - } - gInventory.notifyObservers(); - } - - - /////////////////// - // Attachments - - if (attachments_to_include.count()) - { - BOOL msg_started = FALSE; - LLMessageSystem* msg = gMessageSystem; - for (S32 i = 0; i < attachments_to_include.count(); i++) - { - S32 attachment_pt = attachments_to_include[i]; - LLViewerJointAttachment* attachment = get_if_there(mAvatarObject->mAttachmentPoints, attachment_pt, (LLViewerJointAttachment*)NULL); - if (!attachment) continue; - for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin(); - attachment_iter != attachment->mAttachedObjects.end(); - ++attachment_iter) - { - LLViewerObject *attached_object = (*attachment_iter); - if(!attached_object) continue; - const LLUUID& item_id = (*attachment_iter)->getItemID(); - if(item_id.isNull()) continue; - LLInventoryItem* item = gInventory.getItem(item_id); - if(!item) continue; - if(!msg_started) - { - msg_started = TRUE; - msg->newMessage("CreateNewOutfitAttachments"); - msg->nextBlock("AgentData"); - msg->addUUID("AgentID", gAgent.getID()); - msg->addUUID("SessionID", gAgent.getSessionID()); - msg->nextBlock("HeaderData"); - msg->addUUID("NewFolderID", folder_id); - } - msg->nextBlock("ObjectData"); - msg->addUUID("OldItemID", item_id); - msg->addUUID("OldFolderID", item->getParentUUID()); - } - } - - if (msg_started) - { - gAgent.sendReliableMessage(); - } - - } -} class LLShowCreatedOutfit: public LLInventoryCallback { @@ -1374,7 +1247,8 @@ public: LLSideTray::getInstance()->showPanel("panel_outfits_inventory", key); LLPanelOutfitsInventory *outfit_panel = dynamic_cast<LLPanelOutfitsInventory*>(LLSideTray::getInstance()->getPanel("panel_outfits_inventory")); - if (outfit_panel) + // TODO: add handling "My Outfits" tab. + if (outfit_panel && outfit_panel->isCOFPanelActive()) { outfit_panel->getRootFolder()->clearSelection(); outfit_panel->getRootFolder()->setSelectionByID(mFolderID, TRUE); @@ -1385,8 +1259,8 @@ public: tab_outfits->changeOpenClose(tab_outfits->getDisplayChildren()); } - LLAppearanceManager::instance().updateIsDirty(); - LLAppearanceManager::instance().updatePanelOutfitName(""); + LLAppearanceMgr::instance().updateIsDirty(); + LLAppearanceMgr::instance().updatePanelOutfitName(""); } virtual void fire(const LLUUID&) @@ -1397,30 +1271,9 @@ private: LLUUID mFolderID; }; -LLUUID LLAgentWearables::makeNewOutfitLinks(const std::string& new_folder_name) -{ - if (mAvatarObject.isNull()) - { - return LLUUID::null; - } - - // First, make a folder in the My Outfits directory. - const LLUUID parent_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS); - LLUUID folder_id = gInventory.createNewCategory( - parent_id, - LLFolderType::FT_OUTFIT, - new_folder_name); - - LLPointer<LLInventoryCallback> cb = new LLShowCreatedOutfit(folder_id); - LLAppearanceManager::instance().shallowCopyCategory(LLAppearanceManager::instance().getCOF(),folder_id, cb); - LLAppearanceManager::instance().createBaseOutfitLink(folder_id, cb); - - return folder_id; -} - void LLAgentWearables::makeNewOutfitDone(S32 type, U32 index) { - LLUUID first_item_id = getWearableItemID((EWearableType)type, index); + LLUUID first_item_id = getWearableItemID((LLWearableType::EType)type, index); // Open the inventory and select the first item we added. if (first_item_id.notNull()) { @@ -1451,10 +1304,10 @@ void LLAgentWearables::addWearableToAgentInventory(LLPointer<LLInventoryCallback cb); } -void LLAgentWearables::removeWearable(const EWearableType type, bool do_remove_all, U32 index) +void LLAgentWearables::removeWearable(const LLWearableType::EType type, bool do_remove_all, U32 index) { if (gAgent.isTeen() && - (type == WT_UNDERSHIRT || type == WT_UNDERPANTS)) + (type == LLWearableType::WT_UNDERSHIRT || type == LLWearableType::WT_UNDERPANTS)) { // Can't take off underclothing in simple UI mode or on PG accounts // TODO: enable the removing of a single undershirt/underpants if multiple are worn. - Nyx @@ -1480,6 +1333,7 @@ void LLAgentWearables::removeWearable(const EWearableType type, bool do_remove_a { LLSD payload; payload["wearable_type"] = (S32)type; + payload["wearable_index"] = (S32)index; // Bring up view-modal dialog: Save changes? Yes, No, Cancel LLNotificationsUtil::add("WearableSave", LLSD(), payload, &LLAgentWearables::onRemoveWearableDialog); return; @@ -1493,22 +1347,21 @@ void LLAgentWearables::removeWearable(const EWearableType type, bool do_remove_a } -// MULTI_WEARABLE: assuming one wearable per type. -// MULTI_WEARABLE: hardwiring 0th elt for now - notification needs to change. // static bool LLAgentWearables::onRemoveWearableDialog(const LLSD& notification, const LLSD& response) { S32 option = LLNotificationsUtil::getSelectedOption(notification, response); - EWearableType type = (EWearableType)notification["payload"]["wearable_type"].asInteger(); + LLWearableType::EType type = (LLWearableType::EType)notification["payload"]["wearable_type"].asInteger(); + S32 index = (S32)notification["payload"]["wearable_index"].asInteger(); switch(option) { case 0: // "Save" - gAgentWearables.saveWearable(type, 0); - gAgentWearables.removeWearableFinal(type, false, 0); + gAgentWearables.saveWearable(type, index); + gAgentWearables.removeWearableFinal(type, false, index); break; case 1: // "Don't Save" - gAgentWearables.removeWearableFinal(type, false, 0); + gAgentWearables.removeWearableFinal(type, false, index); break; case 2: // "Cancel" @@ -1522,7 +1375,7 @@ bool LLAgentWearables::onRemoveWearableDialog(const LLSD& notification, const LL } // Called by removeWearable() and onRemoveWearableDialog() to actually do the removal. -void LLAgentWearables::removeWearableFinal(const EWearableType type, bool do_remove_all, U32 index) +void LLAgentWearables::removeWearableFinal(const LLWearableType::EType type, bool do_remove_all, U32 index) { //LLAgentDumper dumper("removeWearable"); if (do_remove_all) @@ -1560,30 +1413,25 @@ void LLAgentWearables::removeWearableFinal(const EWearableType type, bool do_rem } // Assumes existing wearables are not dirty. -// MULTI_WEARABLE: assumes one wearable per type. void LLAgentWearables::setWearableOutfit(const LLInventoryItem::item_array_t& items, const LLDynamicArray< LLWearable* >& wearables, BOOL remove) { - lldebugs << "setWearableOutfit() start" << llendl; - - BOOL wearables_to_remove[WT_COUNT]; - wearables_to_remove[WT_SHAPE] = FALSE; - wearables_to_remove[WT_SKIN] = FALSE; - wearables_to_remove[WT_HAIR] = FALSE; - wearables_to_remove[WT_EYES] = FALSE; - wearables_to_remove[WT_SHIRT] = remove; - wearables_to_remove[WT_PANTS] = remove; - wearables_to_remove[WT_SHOES] = remove; - wearables_to_remove[WT_SOCKS] = remove; - wearables_to_remove[WT_JACKET] = remove; - wearables_to_remove[WT_GLOVES] = remove; - wearables_to_remove[WT_UNDERSHIRT] = (!gAgent.isTeen()) & remove; - wearables_to_remove[WT_UNDERPANTS] = (!gAgent.isTeen()) & remove; - wearables_to_remove[WT_SKIRT] = remove; - wearables_to_remove[WT_ALPHA] = remove; - wearables_to_remove[WT_TATTOO] = remove; + llinfos << "setWearableOutfit() start" << llendl; + // TODO: Removed check for ensuring that teens don't remove undershirt and underwear. Handle later + if (remove) + { + // note: shirt is the first non-body part wearable item. Update if wearable order changes. + // This loop should remove all clothing, but not any body parts + for (S32 type = 0; type < (S32)LLWearableType::WT_COUNT; type++) + { + if (LLWearableType::getAssetType((LLWearableType::EType)type) == LLAssetType::AT_CLOTHING) + { + removeWearable((LLWearableType::EType)type, true, 0); + } + } + } S32 count = wearables.count(); llassert(items.count() == count); @@ -1594,79 +1442,46 @@ void LLAgentWearables::setWearableOutfit(const LLInventoryItem::item_array_t& it LLWearable* new_wearable = wearables[i]; LLPointer<LLInventoryItem> new_item = items[i]; - const EWearableType type = new_wearable->getType(); - wearables_to_remove[type] = FALSE; - - // MULTI_WEARABLE: using 0th - LLWearable* old_wearable = getWearable(type, 0); - if (old_wearable) + llassert(new_wearable); + if (new_wearable) { - const LLUUID& old_item_id = getWearableItemID(type, 0); - if ((old_wearable->getAssetID() == new_wearable->getAssetID()) && - (old_item_id == new_item->getUUID())) - { - lldebugs << "No change to wearable asset and item: " << LLWearableDictionary::getInstance()->getWearableEntry(type) << llendl; - continue; - } + const LLWearableType::EType type = new_wearable->getType(); + + new_wearable->setName(new_item->getName()); + new_wearable->setItemID(new_item->getUUID()); - // Assumes existing wearables are not dirty. - if (old_wearable->isDirty()) + if (LLWearableType::getAssetType(type) == LLAssetType::AT_BODYPART) { - llassert(0); - continue; + // exactly one wearable per body part + setWearable(type,0,new_wearable); } - } - - if (new_wearable) - new_wearable->setItemID(new_item->getUUID()); - setWearable(type,0,new_wearable); - } - - std::vector<LLWearable*> wearables_being_removed; - - for (i = 0; i < WT_COUNT; i++) - { - if (wearables_to_remove[i]) - { - // MULTI_WEARABLE: assuming 0th - LLWearable* wearable = getWearable((EWearableType)i, 0); - const LLUUID &item_id = getWearableItemID((EWearableType)i,0); - gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id); - if (wearable) + else { - wearables_being_removed.push_back(wearable); + pushWearable(type,new_wearable); } - removeWearable((EWearableType)i,true,0); + wearableUpdated(new_wearable); + checkWearableAgainstInventory(new_wearable); } } gInventory.notifyObservers(); - - std::vector<LLWearable*>::iterator wearable_iter; - - for (wearable_iter = wearables_being_removed.begin(); - wearable_iter != wearables_being_removed.end(); - ++wearable_iter) - { - LLWearable* wearablep = *wearable_iter; - if (wearablep) - { - wearablep->removeFromAvatar(TRUE); - } - } - - if (mAvatarObject) + if (isAgentAvatarValid()) { - mAvatarObject->updateVisualParams(); + gAgentAvatarp->setCompositeUpdatesEnabled(TRUE); + gAgentAvatarp->updateVisualParams(); + gAgentAvatarp->invalidateAll(); } // Start rendering & update the server mWearablesLoaded = TRUE; checkWearablesLoaded(); + notifyLoadingFinished(); queryWearableCache(); updateServer(); + gAgentAvatarp->dumpAvatarTEs("setWearableOutfit"); + lldebugs << "setWearableOutfit() end" << llendl; } @@ -1681,7 +1496,7 @@ void LLAgentWearables::setWearableItem(LLInventoryItem* new_item, LLWearable* ne return; } - const EWearableType type = new_wearable->getType(); + const LLWearableType::EType type = new_wearable->getType(); if (!do_append) { @@ -1694,7 +1509,7 @@ void LLAgentWearables::setWearableItem(LLInventoryItem* new_item, LLWearable* ne if ((old_wearable->getAssetID() == new_wearable->getAssetID()) && (old_item_id == new_item->getUUID())) { - lldebugs << "No change to wearable asset and item: " << LLWearableDictionary::getInstance()->getWearableEntry(type) << llendl; + lldebugs << "No change to wearable asset and item: " << LLWearableType::getTypeName(type) << llendl; return; } @@ -1717,6 +1532,7 @@ bool LLAgentWearables::onSetWearableDialog(const LLSD& notification, const LLSD& { S32 option = LLNotificationsUtil::getSelectedOption(notification, response); LLInventoryItem* new_item = gInventory.getItem(notification["payload"]["item_id"].asUUID()); + U32 index = gAgentWearables.getWearableIndex(wearable); if (!new_item) { delete wearable; @@ -1726,8 +1542,7 @@ bool LLAgentWearables::onSetWearableDialog(const LLSD& notification, const LLSD& switch(option) { case 0: // "Save" -// MULTI_WEARABLE: assuming 0th - gAgentWearables.saveWearable(wearable->getType(),0); + gAgentWearables.saveWearable(wearable->getType(),index); gAgentWearables.setWearableFinal(new_item, wearable); break; @@ -1751,7 +1566,7 @@ bool LLAgentWearables::onSetWearableDialog(const LLSD& notification, const LLSD& // MULTI_WEARABLE: unify code after null objects are gone. void LLAgentWearables::setWearableFinal(LLInventoryItem* new_item, LLWearable* new_wearable, bool do_append) { - const EWearableType type = new_wearable->getType(); + const LLWearableType::EType type = new_wearable->getType(); if (do_append && getWearableItemID(type,0).notNull()) { @@ -1816,32 +1631,18 @@ void LLAgentWearables::queryWearableCache() S32 num_queries = 0; for (U8 baked_index = 0; baked_index < BAKED_NUM_INDICES; baked_index++) { - const LLVOAvatarDictionary::BakedEntry *baked_dict = LLVOAvatarDictionary::getInstance()->getBakedTexture((EBakedTextureIndex)baked_index); - LLUUID hash; - for (U8 i=0; i < baked_dict->mWearables.size(); i++) + LLUUID hash_id = computeBakedTextureHash((EBakedTextureIndex) baked_index); + if (hash_id.notNull()) { - const EWearableType baked_type = baked_dict->mWearables[i]; - // MULTI_WEARABLE: not order-dependent - const U32 num_wearables = getWearableCount(baked_type); - for (U32 index = 0; index < num_wearables; ++index) - { - const LLWearable* wearable = getWearable(baked_type,index); - if (wearable) - { - hash ^= wearable->getAssetID(); - } - } - } - if (hash.notNull()) - { - hash ^= baked_dict->mWearablesHashID; num_queries++; // *NOTE: make sure at least one request gets packed + ETextureIndex te_index = LLVOAvatarDictionary::bakedToLocalTextureIndex((EBakedTextureIndex)baked_index); + //llinfos << "Requesting texture for hash " << hash << " in baked texture slot " << baked_index << llendl; gMessageSystem->nextBlockFast(_PREHASH_WearableData); - gMessageSystem->addUUIDFast(_PREHASH_ID, hash); - gMessageSystem->addU8Fast(_PREHASH_TextureIndex, (U8)baked_index); + gMessageSystem->addUUIDFast(_PREHASH_ID, hash_id); + gMessageSystem->addU8Fast(_PREHASH_TextureIndex, (U8)te_index); } gAgentQueryManager.mActiveCacheQueries[baked_index] = gAgentQueryManager.mWearablesCacheQueryID; @@ -1853,16 +1654,66 @@ void LLAgentWearables::queryWearableCache() gAgentQueryManager.mWearablesCacheQueryID++; } -// MULTI_WEARABLE: need a way to specify by wearable rather than by type. +LLUUID LLAgentWearables::computeBakedTextureHash(LLVOAvatarDefines::EBakedTextureIndex baked_index, + BOOL generate_valid_hash) // Set to false if you want to upload the baked texture w/o putting it in the cache +{ + LLUUID hash_id; + bool hash_computed = false; + LLMD5 hash; + const LLVOAvatarDictionary::BakedEntry *baked_dict = LLVOAvatarDictionary::getInstance()->getBakedTexture(baked_index); + + for (U8 i=0; i < baked_dict->mWearables.size(); i++) + { + const LLWearableType::EType baked_type = baked_dict->mWearables[i]; + const U32 num_wearables = getWearableCount(baked_type); + for (U32 index = 0; index < num_wearables; ++index) + { + const LLWearable* wearable = getWearable(baked_type,index); + if (wearable) + { + LLUUID asset_id = wearable->getAssetID(); + hash.update((const unsigned char*)asset_id.mData, UUID_BYTES); + hash_computed = true; + } + } + } + if (hash_computed) + { + hash.update((const unsigned char*)baked_dict->mWearablesHashID.mData, UUID_BYTES); + + // Add some garbage into the hash so that it becomes invalid. + if (!generate_valid_hash) + { + if (isAgentAvatarValid()) + { + hash.update((const unsigned char*)gAgentAvatarp->getID().mData, UUID_BYTES); + } + } + hash.finalize(); + hash.raw_digest(hash_id.mData); + } + + return hash_id; +} + // User has picked "remove from avatar" from a menu. // static -void LLAgentWearables::userRemoveWearable(EWearableType& type) +void LLAgentWearables::userRemoveWearable(const LLWearableType::EType &type, const U32 &index) { - if (!(type==WT_SHAPE || type==WT_SKIN || type==WT_HAIR)) //&& - //!((!gAgent.isTeen()) && (type==WT_UNDERPANTS || type==WT_UNDERSHIRT))) + if (!(type==LLWearableType::WT_SHAPE || type==LLWearableType::WT_SKIN || type==LLWearableType::WT_HAIR || type==LLWearableType::WT_EYES)) //&& + //!((!gAgent.isTeen()) && (type==LLWearableType::WT_UNDERPANTS || type==LLWearableType::WT_UNDERSHIRT))) { - // MULTI_WEARABLE: fixed to 0th for now. - gAgentWearables.removeWearable(type,false,0); + gAgentWearables.removeWearable(type,false,index); + } +} + +//static +void LLAgentWearables::userRemoveWearablesOfType(const LLWearableType::EType &type) +{ + if (!(type==LLWearableType::WT_SHAPE || type==LLWearableType::WT_SKIN || type==LLWearableType::WT_HAIR || type==LLWearableType::WT_EYES)) //&& + //!((!gAgent.isTeen()) && (type==LLWearableType::WT_UNDERPANTS || type==LLWearableType::WT_UNDERSHIRT))) + { + gAgentWearables.removeWearable(type,true,0); } } @@ -1870,14 +1721,12 @@ void LLAgentWearables::userRemoveWearable(EWearableType& type) void LLAgentWearables::userRemoveAllClothes() { // We have to do this up front to avoid having to deal with the case of multiple wearables being dirty. - if (gFloaterCustomize) - { - gFloaterCustomize->askToSaveIfDirty(userRemoveAllClothesStep2); - } - else + if (gAgentCamera.cameraCustomizeAvatar()) { - userRemoveAllClothesStep2(TRUE); + // switching to outfit editor should automagically save any currently edited wearable + LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD().with("type", "edit_outfit")); } + userRemoveAllClothesStep2(TRUE); } // static @@ -1885,17 +1734,17 @@ void LLAgentWearables::userRemoveAllClothesStep2(BOOL proceed) { if (proceed) { - gAgentWearables.removeWearable(WT_SHIRT,true,0); - gAgentWearables.removeWearable(WT_PANTS,true,0); - gAgentWearables.removeWearable(WT_SHOES,true,0); - gAgentWearables.removeWearable(WT_SOCKS,true,0); - gAgentWearables.removeWearable(WT_JACKET,true,0); - gAgentWearables.removeWearable(WT_GLOVES,true,0); - gAgentWearables.removeWearable(WT_UNDERSHIRT,true,0); - gAgentWearables.removeWearable(WT_UNDERPANTS,true,0); - gAgentWearables.removeWearable(WT_SKIRT,true,0); - gAgentWearables.removeWearable(WT_ALPHA,true,0); - gAgentWearables.removeWearable(WT_TATTOO,true,0); + gAgentWearables.removeWearable(LLWearableType::WT_SHIRT,true,0); + gAgentWearables.removeWearable(LLWearableType::WT_PANTS,true,0); + gAgentWearables.removeWearable(LLWearableType::WT_SHOES,true,0); + gAgentWearables.removeWearable(LLWearableType::WT_SOCKS,true,0); + gAgentWearables.removeWearable(LLWearableType::WT_JACKET,true,0); + gAgentWearables.removeWearable(LLWearableType::WT_GLOVES,true,0); + gAgentWearables.removeWearable(LLWearableType::WT_UNDERSHIRT,true,0); + gAgentWearables.removeWearable(LLWearableType::WT_UNDERPANTS,true,0); + gAgentWearables.removeWearable(LLWearableType::WT_SKIRT,true,0); + gAgentWearables.removeWearable(LLWearableType::WT_ALPHA,true,0); + gAgentWearables.removeWearable(LLWearableType::WT_TATTOO,true,0); } } @@ -1908,12 +1757,7 @@ void LLAgentWearables::userUpdateAttachments(LLInventoryModel::item_array_t& obj // already wearing and in request set -> leave alone. // not wearing and in request set -> put on. - LLVOAvatar* avatarp = gAgent.getAvatarObject(); - if (!avatarp) - { - llwarns << "No avatar found." << llendl; - return; - } + if (!isAgentAvatarValid()) return; std::set<LLUUID> requested_item_ids; std::set<LLUUID> current_item_ids; @@ -1922,8 +1766,8 @@ void LLAgentWearables::userUpdateAttachments(LLInventoryModel::item_array_t& obj // Build up list of objects to be removed and items currently attached. llvo_vec_t objects_to_remove; - for (LLVOAvatar::attachment_map_t::iterator iter = avatarp->mAttachmentPoints.begin(); - iter != avatarp->mAttachmentPoints.end();) + for (LLVOAvatar::attachment_map_t::iterator iter = gAgentAvatarp->mAttachmentPoints.begin(); + iter != gAgentAvatarp->mAttachmentPoints.end();) { LLVOAvatar::attachment_map_t::iterator curiter = iter++; LLViewerJointAttachment* attachment = curiter->second; @@ -1979,12 +1823,7 @@ void LLAgentWearables::userUpdateAttachments(LLInventoryModel::item_array_t& obj void LLAgentWearables::userRemoveMultipleAttachments(llvo_vec_t& objects_to_remove) { - LLVOAvatar* avatarp = gAgent.getAvatarObject(); - if (!avatarp) - { - llwarns << "No avatar found." << llendl; - return; - } + if (!isAgentAvatarValid()) return; if (objects_to_remove.empty()) return; @@ -2007,17 +1846,12 @@ void LLAgentWearables::userRemoveMultipleAttachments(llvo_vec_t& objects_to_remo void LLAgentWearables::userRemoveAllAttachments() { - LLVOAvatar* avatarp = gAgent.getAvatarObject(); - if (!avatarp) - { - llwarns << "No avatar found." << llendl; - return; - } + if (!isAgentAvatarValid()) return; llvo_vec_t objects_to_remove; - for (LLVOAvatar::attachment_map_t::iterator iter = avatarp->mAttachmentPoints.begin(); - iter != avatarp->mAttachmentPoints.end();) + for (LLVOAvatar::attachment_map_t::iterator iter = gAgentAvatarp->mAttachmentPoints.begin(); + iter != gAgentAvatarp->mAttachmentPoints.end();) { LLVOAvatar::attachment_map_t::iterator curiter = iter++; LLViewerJointAttachment* attachment = curiter->second; @@ -2073,7 +1907,11 @@ void LLAgentWearables::userAttachMultipleAttachments(LLInventoryModel::item_arra msg->nextBlockFast(_PREHASH_ObjectData ); msg->addUUIDFast(_PREHASH_ItemID, item->getLinkedUUID()); msg->addUUIDFast(_PREHASH_OwnerID, item->getPermissions().getOwner()); +#if ENABLE_MULTIATTACHMENTS + msg->addU8Fast(_PREHASH_AttachmentPt, 0 | ATTACHMENT_ADD ); +#else msg->addU8Fast(_PREHASH_AttachmentPt, 0 ); // Wear at the previous or default attachment point +#endif pack_permissions_slam(msg, item->getFlags(), item->getPermissions()); msg->addStringFast(_PREHASH_Name, item->getName()); msg->addStringFast(_PREHASH_Description, item->getDescription()); @@ -2097,476 +1935,205 @@ void LLAgentWearables::checkWearablesLoaded() const #endif } +// Returns false if the given wearable is already topmost/bottommost +// (depending on closer_to_body parameter). +bool LLAgentWearables::canMoveWearable(const LLUUID& item_id, bool closer_to_body) +{ + const LLWearable* wearable = getWearableFromItemID(item_id); + if (!wearable) return false; + + LLWearableType::EType wtype = wearable->getType(); + const LLWearable* marginal_wearable = closer_to_body ? getBottomWearable(wtype) : getTopWearable(wtype); + if (!marginal_wearable) return false; + + return wearable != marginal_wearable; +} + BOOL LLAgentWearables::areWearablesLoaded() const { checkWearablesLoaded(); return mWearablesLoaded; } -// MULTI-WEARABLE: update for multiple indices. +// MULTI-WEARABLE: DEPRECATED: item pending count relies on old messages that don't support multi-wearables. do not trust to be accurate void LLAgentWearables::updateWearablesLoaded() { mWearablesLoaded = (itemUpdatePendingCount()==0); + if (mWearablesLoaded) + { + notifyLoadingFinished(); + } } bool LLAgentWearables::canWearableBeRemoved(const LLWearable* wearable) const { if (!wearable) return false; - EWearableType type = wearable->getType(); + LLWearableType::EType type = wearable->getType(); // Make sure the user always has at least one shape, skin, eyes, and hair type currently worn. - return !(((type == WT_SHAPE) || (type == WT_SKIN) || (type == WT_HAIR) || (type == WT_EYES)) + return !(((type == LLWearableType::WT_SHAPE) || (type == LLWearableType::WT_SKIN) || (type == LLWearableType::WT_HAIR) || (type == LLWearableType::WT_EYES)) && (getWearableCount(type) <= 1) ); } void LLAgentWearables::animateAllWearableParams(F32 delta, BOOL upload_bake) { - for( S32 type = 0; type < WT_COUNT; ++type ) + for( S32 type = 0; type < LLWearableType::WT_COUNT; ++type ) { - for (S32 count = 0; count < (S32)getWearableCount((EWearableType)type); ++count) + for (S32 count = 0; count < (S32)getWearableCount((LLWearableType::EType)type); ++count) { - LLWearable *wearable = getWearable((EWearableType)type,count); + LLWearable *wearable = getWearable((LLWearableType::EType)type,count); wearable->animateParams(delta, upload_bake); } } } -void LLAgentWearables::updateServer() +bool LLAgentWearables::moveWearable(const LLViewerInventoryItem* item, bool closer_to_body) { - sendAgentWearablesUpdate(); - gAgent.sendAgentSetAppearance(); -} + if (!item) return false; + if (!item->isWearableType()) return false; -void LLAgentWearables::populateMyOutfitsFolder(void) -{ - LLLibraryOutfitsFetch* outfits = new LLLibraryOutfitsFetch(); - - // Get the complete information on the items in the inventory and - // setup an observer that will wait for that to happen. - LLInventoryFetchDescendentsObserver::folder_ref_t folders; - outfits->mMyOutfitsID = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS); + wearableentry_map_t::iterator wearable_iter = mWearableDatas.find(item->getWearableType()); + if (wearable_iter == mWearableDatas.end()) return false; - folders.push_back(outfits->mMyOutfitsID); - gInventory.addObserver(outfits); - outfits->fetchDescendents(folders); - if (outfits->isEverythingComplete()) - { - outfits->done(); - } -} + wearableentry_vec_t& wearable_vec = wearable_iter->second; + if (wearable_vec.empty()) return false; -void LLLibraryOutfitsFetch::done() -{ - // Delay this until idle() routine, since it's a heavy operation and - // we also can't have it run within notifyObservers. - doOnIdle(boost::bind(&LLLibraryOutfitsFetch::doneIdle,this)); - gInventory.removeObserver(this); // Prevent doOnIdle from being added twice. -} + const LLUUID& asset_id = item->getAssetUUID(); -void LLLibraryOutfitsFetch::doneIdle() -{ - gInventory.addObserver(this); // Add this back in since it was taken out during ::done() - - switch (mCurrFetchStep) - { - case LOFS_FOLDER: - folderDone(); - mCurrFetchStep = LOFS_OUTFITS; - break; - case LOFS_OUTFITS: - outfitsDone(); - mCurrFetchStep = LOFS_LIBRARY; - break; - case LOFS_LIBRARY: - libraryDone(); - mCurrFetchStep = LOFS_IMPORTED; - break; - case LOFS_IMPORTED: - importedFolderDone(); - mCurrFetchStep = LOFS_CONTENTS; - break; - case LOFS_CONTENTS: - contentsDone(); - break; - default: - llwarns << "Got invalid state for outfit fetch: " << mCurrFetchStep << llendl; - mOutfitsPopulated = TRUE; - break; - } + //nowhere to move if the wearable is already on any boundary (closest to the body/furthest from the body) + if (closer_to_body && asset_id == wearable_vec.front()->getAssetID()) return false; + if (!closer_to_body && asset_id == wearable_vec.back()->getAssetID()) return false; - // We're completely done. Cleanup. - if (mOutfitsPopulated) + for (U32 i = 0; i < wearable_vec.size(); ++i) { - gInventory.removeObserver(this); - delete this; - return; + LLWearable* wearable = wearable_vec[i]; + if (!wearable) continue; + if (wearable->getAssetID() != asset_id) continue; + + //swapping wearables + U32 swap_i = closer_to_body ? i-1 : i+1; + wearable_vec[i] = wearable_vec[swap_i]; + wearable_vec[swap_i] = wearable; + return true; } -} -void LLLibraryOutfitsFetch::folderDone(void) -{ - LLInventoryModel::cat_array_t cat_array; - LLInventoryModel::item_array_t wearable_array; - gInventory.collectDescendents(mMyOutfitsID, cat_array, wearable_array, - LLInventoryModel::EXCLUDE_TRASH); - - // Early out if we already have items in My Outfits. - if (cat_array.count() > 0 || wearable_array.count() > 0) - { - mOutfitsPopulated = true; - return; - } - - mClothingID = gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING); - mLibraryClothingID = gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING, false, true); - - mCompleteFolders.clear(); - - // Get the complete information on the items in the inventory. - LLInventoryFetchDescendentsObserver::folder_ref_t folders; - folders.push_back(mClothingID); - folders.push_back(mLibraryClothingID); - fetchDescendents(folders); - if (isEverythingComplete()) - { - done(); - } + return false; } -void LLLibraryOutfitsFetch::outfitsDone(void) +// static +void LLAgentWearables::createWearable(LLWearableType::EType type, bool wear, const LLUUID& parent_id) { - LLInventoryModel::cat_array_t cat_array; - LLInventoryModel::item_array_t wearable_array; - LLInventoryFetchDescendentsObserver::folder_ref_t folders; - - // Collect the contents of the Library's Clothing folder - gInventory.collectDescendents(mLibraryClothingID, cat_array, wearable_array, - LLInventoryModel::EXCLUDE_TRASH); - - llassert(cat_array.count() > 0); - for (LLInventoryModel::cat_array_t::const_iterator iter = cat_array.begin(); - iter != cat_array.end(); - ++iter) + if (type == LLWearableType::WT_INVALID || type == LLWearableType::WT_NONE) return; + + LLWearable* wearable = LLWearableList::instance().createNewWearable(type); + LLAssetType::EType asset_type = wearable->getAssetType(); + LLInventoryType::EType inv_type = LLInventoryType::IT_WEARABLE; + LLPointer<LLInventoryCallback> cb = wear ? new LLWearAndEditCallback : NULL; + LLUUID folder_id; + + if (parent_id.notNull()) { - const LLViewerInventoryCategory *cat = iter->get(); - - // Get the names and id's of every outfit in the library, except for ruth and other "misc" outfits. - if (cat->getName() != "More Outfits" && cat->getName() != "Ruth") - { - // Get the name of every outfit in the library - folders.push_back(cat->getUUID()); - mLibraryClothingFolders.push_back(std::make_pair(cat->getUUID(), cat->getName())); - } + folder_id = parent_id; } - - // Collect the contents of your Inventory Clothing folder - cat_array.clear(); - wearable_array.clear(); - gInventory.collectDescendents(mClothingID, cat_array, wearable_array, - LLInventoryModel::EXCLUDE_TRASH); - - // Check if you already have an "Imported Library Clothing" folder - for (LLInventoryModel::cat_array_t::const_iterator iter = cat_array.begin(); - iter != cat_array.end(); - ++iter) - { - const LLViewerInventoryCategory *cat = iter->get(); - if (cat->getName() == mImportedClothingName) - { - mImportedClothingID = cat->getUUID(); - } - } - - mCompleteFolders.clear(); - - fetchDescendents(folders); - if (isEverythingComplete()) + else { - done(); + LLFolderType::EType folder_type = LLFolderType::assetTypeToFolderType(asset_type); + folder_id = gInventory.findCategoryUUIDForType(folder_type); } + + create_inventory_item(gAgent.getID(), gAgent.getSessionID(), + folder_id, wearable->getTransactionID(), wearable->getName(), + wearable->getDescription(), asset_type, inv_type, wearable->getType(), + wearable->getPermissions().getMaskNextOwner(), + cb); } -class LLLibraryOutfitsCopyDone: public LLInventoryCallback +// static +void LLAgentWearables::editWearable(const LLUUID& item_id) { -public: - LLLibraryOutfitsCopyDone(LLLibraryOutfitsFetch * fetcher): - mFireCount(0), mLibraryOutfitsFetcher(fetcher) + LLViewerInventoryItem* item = gInventory.getLinkedItem(item_id); + if (!item) { + llwarns << "Failed to get linked item" << llendl; + return; } - - virtual ~LLLibraryOutfitsCopyDone() + + LLWearable* wearable = gAgentWearables.getWearableFromItemID(item_id); + if (!wearable) { - if (!LLApp::isExiting() && mLibraryOutfitsFetcher) - { - gInventory.addObserver(mLibraryOutfitsFetcher); - mLibraryOutfitsFetcher->done(); - } + llwarns << "Cannot get wearable" << llendl; + return; } - - /* virtual */ void fire(const LLUUID& inv_item) + + if (!gAgentWearables.isWearableModifiable(item->getUUID())) { - mFireCount++; + llwarns << "Cannot modify wearable" << llendl; + return; } -private: - U32 mFireCount; - LLLibraryOutfitsFetch * mLibraryOutfitsFetcher; -}; -void LLLibraryOutfitsFetch::libraryDone(void) + LLPanel* panel = LLSideTray::getInstance()->getPanel("sidepanel_appearance"); + LLSidepanelAppearance::editWearable(wearable, panel); +} + +// Request editing the item after it gets worn. +void LLAgentWearables::requestEditingWearable(const LLUUID& item_id) { - // Copy the clothing folders from the library into the imported clothing folder if necessary. - if (mImportedClothingID == LLUUID::null) - { - gInventory.removeObserver(this); - LLPointer<LLInventoryCallback> copy_waiter = new LLLibraryOutfitsCopyDone(this); - mImportedClothingID = gInventory.createNewCategory(mClothingID, - LLFolderType::FT_NONE, - mImportedClothingName); - - for (cloth_folder_vec_t::const_iterator iter = mLibraryClothingFolders.begin(); - iter != mLibraryClothingFolders.end(); - ++iter) - { - LLUUID folder_id = gInventory.createNewCategory(mImportedClothingID, - LLFolderType::FT_NONE, - iter->second); - LLAppearanceManager::getInstance()->shallowCopyCategory(iter->first, folder_id, copy_waiter); - } - } - else - { - // Skip straight to fetching the contents of the imported folder - importedFolderFetch(); - } + mItemToEdit = gInventory.getLinkedItemID(item_id); } -void LLLibraryOutfitsFetch::importedFolderFetch(void) +// Start editing the item if previously requested. +void LLAgentWearables::editWearableIfRequested(const LLUUID& item_id) { - // Fetch the contents of the Imported Clothing Folder - LLInventoryFetchDescendentsObserver::folder_ref_t folders; - folders.push_back(mImportedClothingID); - - mCompleteFolders.clear(); - - fetchDescendents(folders); - if (isEverythingComplete()) + if (mItemToEdit.notNull() && + mItemToEdit == gInventory.getLinkedItemID(item_id)) { - done(); + LLAgentWearables::editWearable(item_id); + mItemToEdit.setNull(); } } -void LLLibraryOutfitsFetch::importedFolderDone(void) +void LLAgentWearables::updateServer() { - LLInventoryModel::cat_array_t cat_array; - LLInventoryModel::item_array_t wearable_array; - LLInventoryFetchDescendentsObserver::folder_ref_t folders; - - // Collect the contents of the Imported Clothing folder - gInventory.collectDescendents(mImportedClothingID, cat_array, wearable_array, - LLInventoryModel::EXCLUDE_TRASH); - - for (LLInventoryModel::cat_array_t::const_iterator iter = cat_array.begin(); - iter != cat_array.end(); - ++iter) - { - const LLViewerInventoryCategory *cat = iter->get(); - - // Get the name of every imported outfit - folders.push_back(cat->getUUID()); - mImportedClothingFolders.push_back(std::make_pair(cat->getUUID(), cat->getName())); - } - - mCompleteFolders.clear(); - fetchDescendents(folders); - if (isEverythingComplete()) - { - done(); - } + sendAgentWearablesUpdate(); + gAgent.sendAgentSetAppearance(); } -void LLLibraryOutfitsFetch::contentsDone(void) -{ - LLInventoryModel::cat_array_t cat_array; - LLInventoryModel::item_array_t wearable_array; +void LLAgentWearables::populateMyOutfitsFolder(void) +{ + llinfos << "starting outfit population" << llendl; + + const LLUUID& my_outfits_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS); + LLLibraryOutfitsFetch* outfits = new LLLibraryOutfitsFetch(my_outfits_id); + outfits->mMyOutfitsID = my_outfits_id; - for (cloth_folder_vec_t::const_iterator folder_iter = mImportedClothingFolders.begin(); - folder_iter != mImportedClothingFolders.end(); - ++folder_iter) + // Get the complete information on the items in the inventory and + // setup an observer that will wait for that to happen. + gInventory.addObserver(outfits); + outfits->startFetch(); + if (outfits->isFinished()) { - // First, make a folder in the My Outfits directory. - LLUUID new_outfit_folder_id = gInventory.createNewCategory(mMyOutfitsID, LLFolderType::FT_OUTFIT, folder_iter->second); - - cat_array.clear(); - wearable_array.clear(); - // Collect the contents of each imported clothing folder, so we can create new outfit links for it - gInventory.collectDescendents(folder_iter->first, cat_array, wearable_array, - LLInventoryModel::EXCLUDE_TRASH); - - for (LLInventoryModel::item_array_t::const_iterator wearable_iter = wearable_array.begin(); - wearable_iter != wearable_array.end(); - ++wearable_iter) - { - const LLViewerInventoryItem *item = wearable_iter->get(); - link_inventory_item(gAgent.getID(), - item->getLinkedUUID(), - new_outfit_folder_id, - item->getName(), - LLAssetType::AT_LINK, - NULL); - } + outfits->done(); } - - mOutfitsPopulated = true; } -//-------------------------------------------------------------------- -// InitialWearablesFetch -// -// This grabs contents from the COF and processes them. -// The processing is handled in idle(), i.e. outside of done(), -// to avoid gInventory.notifyObservers recursion. -//-------------------------------------------------------------------- - -LLInitialWearablesFetch::~LLInitialWearablesFetch() +boost::signals2::connection LLAgentWearables::addLoadingStartedCallback(loading_started_callback_t cb) { + return mLoadingStartedSignal.connect(cb); } -// virtual -void LLInitialWearablesFetch::done() +boost::signals2::connection LLAgentWearables::addLoadedCallback(loaded_callback_t cb) { - // Delay processing the actual results of this so it's not handled within - // gInventory.notifyObservers. The results will be handled in the next - // idle tick instead. - gInventory.removeObserver(this); - doOnIdle(boost::bind(&LLInitialWearablesFetch::processContents,this)); + return mLoadedSignal.connect(cb); } -void LLInitialWearablesFetch::processContents() +void LLAgentWearables::notifyLoadingStarted() { - // Fetch the wearable items from the Current Outfit Folder - LLInventoryModel::cat_array_t cat_array; - LLInventoryModel::item_array_t wearable_array; - LLFindWearables is_wearable; - gInventory.collectDescendentsIf(mCompleteFolders.front(), cat_array, wearable_array, - LLInventoryModel::EXCLUDE_TRASH, is_wearable); - - LLAppearanceManager::instance().setAttachmentInvLinkEnable(true); - if (wearable_array.count() > 0) - { - LLAppearanceManager::instance().updateAppearanceFromCOF(); - } - else - { - // if we're constructing the COF from the wearables message, we don't have a proper outfit link - LLAppearanceManager::instance().setOutfitDirty(true); - processWearablesMessage(); - } - delete this; + mCOFChangeInProgress = true; + mLoadingStartedSignal(); } -class LLFetchAndLinkObserver: public LLInventoryFetchObserver -{ -public: - LLFetchAndLinkObserver(LLInventoryFetchObserver::item_ref_t& ids): - m_ids(ids), - LLInventoryFetchObserver(true) - { - } - ~LLFetchAndLinkObserver() - { - } - virtual void done() - { - gInventory.removeObserver(this); - // Link to all fetched items in COF. - for (LLInventoryFetchObserver::item_ref_t::iterator it = m_ids.begin(); - it != m_ids.end(); - ++it) - { - LLUUID id = *it; - LLViewerInventoryItem *item = gInventory.getItem(*it); - if (!item) - { - llwarns << "fetch failed!" << llendl; - continue; - } - link_inventory_item(gAgent.getID(), item->getLinkedUUID(), LLAppearanceManager::instance().getCOF(), item->getName(), - LLAssetType::AT_LINK, LLPointer<LLInventoryCallback>(NULL)); - } - } -private: - LLInventoryFetchObserver::item_ref_t m_ids; -}; - -void LLInitialWearablesFetch::processWearablesMessage() +void LLAgentWearables::notifyLoadingFinished() { - if (!mAgentInitialWearables.empty()) // We have an empty current outfit folder, use the message data instead. - { - const LLUUID current_outfit_id = LLAppearanceManager::instance().getCOF(); - LLInventoryFetchObserver::item_ref_t ids; - for (U8 i = 0; i < mAgentInitialWearables.size(); ++i) - { - // Populate the current outfit folder with links to the wearables passed in the message - InitialWearableData *wearable_data = new InitialWearableData(mAgentInitialWearables[i]); // This will be deleted in the callback. - - if (wearable_data->mAssetID.notNull()) - { -#ifdef USE_CURRENT_OUTFIT_FOLDER - ids.push_back(wearable_data->mItemID); -#endif - // Fetch the wearables - LLWearableList::instance().getAsset(wearable_data->mAssetID, - LLStringUtil::null, - LLWearableDictionary::getAssetType(wearable_data->mType), - LLAgentWearables::onInitialWearableAssetArrived, (void*)(wearable_data)); - } - else - { - llinfos << "Invalid wearable, type " << wearable_data->mType << " itemID " - << wearable_data->mItemID << " assetID " << wearable_data->mAssetID << llendl; - delete wearable_data; - } - } - - // Add all current attachments to the requested items as well. - LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); - if( avatar ) - { - for (LLVOAvatar::attachment_map_t::const_iterator iter = avatar->mAttachmentPoints.begin(); - iter != avatar->mAttachmentPoints.end(); ++iter) - { - LLViewerJointAttachment* attachment = iter->second; - if (!attachment) continue; - for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin(); - attachment_iter != attachment->mAttachedObjects.end(); - ++attachment_iter) - { - LLViewerObject* attached_object = (*attachment_iter); - if (!attached_object) continue; - const LLUUID& item_id = attached_object->getItemID(); - if (item_id.isNull()) continue; - ids.push_back(item_id); - } - } - } - - // Need to fetch the inventory items for ids, then create links to them after they arrive. - LLFetchAndLinkObserver *fetcher = new LLFetchAndLinkObserver(ids); - fetcher->fetchItems(ids); - // If no items to be fetched, done will never be triggered. - // TODO: Change LLInventoryFetchObserver::fetchItems to trigger done() on this condition. - if (fetcher->isEverythingComplete()) - { - fetcher->done(); - } - else - { - gInventory.addObserver(fetcher); - } - } - else - { - LL_WARNS("Wearables") << "No current outfit folder items found and no initial wearables fallback message received." << LL_ENDL; - } + mCOFChangeInProgress = false; + mLoadedSignal(); } - - +// EOF diff --git a/indra/newview/llagentwearables.h b/indra/newview/llagentwearables.h index b4f58674af..8122971db6 100644 --- a/indra/newview/llagentwearables.h +++ b/indra/newview/llagentwearables.h @@ -33,9 +33,13 @@ #ifndef LL_LLAGENTWEARABLES_H #define LL_LLAGENTWEARABLES_H +// libraries #include "llmemory.h" +#include "llui.h" #include "lluuid.h" #include "llinventory.h" + +// newview #include "llinventorymodel.h" #include "llviewerinventory.h" #include "llvoavatardefines.h" @@ -47,7 +51,7 @@ class LLInitialWearablesFetch; class LLViewerObject; class LLTexLayerTemplate; -class LLAgentWearables +class LLAgentWearables : public LLInitClass<LLAgentWearables> { //-------------------------------------------------------------------- // Constructors / destructors / Initializers @@ -61,8 +65,10 @@ public: void createStandardWearables(BOOL female); void cleanup(); void dump(); + + // LLInitClass interface + static void initClass(); protected: - // MULTI-WEARABLE: assuming one per type. Type is called index - rename. void createStandardWearablesDone(S32 type, U32 index/* = 0*/); void createStandardWearablesAllDone(); @@ -71,51 +77,59 @@ protected: //-------------------------------------------------------------------- public: BOOL isWearingItem(const LLUUID& item_id) const; - BOOL isWearableModifiable(EWearableType type, U32 index /*= 0*/) const; - BOOL isWearableCopyable(EWearableType type, U32 index /*= 0*/) const; + BOOL isWearableModifiable(LLWearableType::EType type, U32 index /*= 0*/) const; + BOOL isWearableModifiable(const LLUUID& item_id) const; + + BOOL isWearableCopyable(LLWearableType::EType type, U32 index /*= 0*/) const; BOOL areWearablesLoaded() const; + bool isCOFChangeInProgress() const { return mCOFChangeInProgress; } void updateWearablesLoaded(); void checkWearablesLoaded() const; + bool canMoveWearable(const LLUUID& item_id, bool closer_to_body); // Note: False for shape, skin, eyes, and hair, unless you have MORE than 1. bool canWearableBeRemoved(const LLWearable* wearable) const; void animateAllWearableParams(F32 delta, BOOL upload_bake); - + //-------------------------------------------------------------------- // Accessors //-------------------------------------------------------------------- public: - const LLUUID getWearableItemID(EWearableType type, U32 index /*= 0*/) const; - const LLUUID getWearableAssetID(EWearableType type, U32 index /*= 0*/) const; + const LLUUID getWearableItemID(LLWearableType::EType type, U32 index /*= 0*/) const; + const LLUUID getWearableAssetID(LLWearableType::EType type, U32 index /*= 0*/) const; const LLWearable* getWearableFromItemID(const LLUUID& item_id) const; - const LLWearable* getWearableFromAssetID(const LLUUID& asset_id) const; - LLInventoryItem* getWearableInventoryItem(EWearableType type, U32 index /*= 0*/); - // MULTI-WEARABLE: assuming one per type. - static BOOL selfHasWearable(EWearableType type); - LLWearable* getWearable(const EWearableType type, U32 index /*= 0*/); - const LLWearable* getWearable(const EWearableType type, U32 index /*= 0*/) const; - LLWearable* getTopWearable(const EWearableType type); - U32 getWearableCount(const EWearableType type) const; + LLWearable* getWearableFromItemID(const LLUUID& item_id); + LLWearable* getWearableFromAssetID(const LLUUID& asset_id); + LLInventoryItem* getWearableInventoryItem(LLWearableType::EType type, U32 index /*= 0*/); + static BOOL selfHasWearable(LLWearableType::EType type); + LLWearable* getWearable(const LLWearableType::EType type, U32 index /*= 0*/); + const LLWearable* getWearable(const LLWearableType::EType type, U32 index /*= 0*/) const; + LLWearable* getTopWearable(const LLWearableType::EType type); + LLWearable* getBottomWearable(const LLWearableType::EType type); + U32 getWearableCount(const LLWearableType::EType type) const; U32 getWearableCount(const U32 tex_index) const; + static const U32 MAX_CLOTHING_PER_TYPE = 5; + + //-------------------------------------------------------------------- // Setters //-------------------------------------------------------------------- private: // Low-level data structure setter - public access is via setWearableItem, etc. - void setWearable(const EWearableType type, U32 index, LLWearable *wearable); - U32 pushWearable(const EWearableType type, LLWearable *wearable); + void setWearable(const LLWearableType::EType type, U32 index, LLWearable *wearable); + U32 pushWearable(const LLWearableType::EType type, LLWearable *wearable); void wearableUpdated(LLWearable *wearable); void popWearable(LLWearable *wearable); - void popWearable(const EWearableType type, U32 index); + void popWearable(const LLWearableType::EType type, U32 index); public: void setWearableItem(LLInventoryItem* new_item, LLWearable* wearable, bool do_append = false); void setWearableOutfit(const LLInventoryItem::item_array_t& items, const LLDynamicArray< LLWearable* >& wearables, BOOL remove); void setWearableName(const LLUUID& item_id, const std::string& new_name); - void addLocalTextureObject(const EWearableType wearable_type, const LLVOAvatarDefines::ETextureIndex texture_type, U32 wearable_index); + void addLocalTextureObject(const LLWearableType::EType wearable_type, const LLVOAvatarDefines::ETextureIndex texture_type, U32 wearable_index); U32 getWearableIndex(LLWearable *wearable); protected: @@ -126,20 +140,35 @@ protected: LLWearable* wearable, const LLUUID& category_id = LLUUID::null, BOOL notify = TRUE); - void addWearabletoAgentInventoryDone(const S32 type, + void addWearabletoAgentInventoryDone(const LLWearableType::EType type, const U32 index, const LLUUID& item_id, LLWearable* wearable); - void recoverMissingWearable(const EWearableType type, U32 index /*= 0*/); + void recoverMissingWearable(const LLWearableType::EType type, U32 index /*= 0*/); void recoverMissingWearableDone(); //-------------------------------------------------------------------- + // Editing/moving wearables + //-------------------------------------------------------------------- + +public: + static void createWearable(LLWearableType::EType type, bool wear = false, const LLUUID& parent_id = LLUUID::null); + static void editWearable(const LLUUID& item_id); + bool moveWearable(const LLViewerInventoryItem* item, bool closer_to_body); + + void requestEditingWearable(const LLUUID& item_id); + void editWearableIfRequested(const LLUUID& item_id); + +private: + LLUUID mItemToEdit; + + //-------------------------------------------------------------------- // Removing wearables //-------------------------------------------------------------------- public: - void removeWearable(const EWearableType type, bool do_remove_all /*= false*/, U32 index /*= 0*/); + void removeWearable(const LLWearableType::EType type, bool do_remove_all /*= false*/, U32 index /*= 0*/); private: - void removeWearableFinal(const EWearableType type, bool do_remove_all /*= false*/, U32 index /*= 0*/); + void removeWearableFinal(const LLWearableType::EType type, bool do_remove_all /*= false*/, U32 index /*= 0*/); protected: static bool onRemoveWearableDialog(const LLSD& notification, const LLSD& response); static void userRemoveAllClothesStep2(BOOL proceed); // userdata is NULL @@ -150,6 +179,9 @@ protected: public: // Processes the initial wearables update message (if necessary, since the outfit folder makes it redundant) static void processAgentInitialWearablesUpdate(LLMessageSystem* mesgsys, void** user_data); + LLUUID computeBakedTextureHash(LLVOAvatarDefines::EBakedTextureIndex baked_index, + BOOL generate_valid_hash = TRUE); + protected: void sendAgentWearablesUpdate(); void sendAgentWearablesRequest(); @@ -161,20 +193,10 @@ protected: // Outfits //-------------------------------------------------------------------- public: - void getAllWearablesArray(LLDynamicArray<S32>& wearables); - - // Note: wearables_to_include should be a list of EWearableType types - // attachments_to_include should be a list of attachment points - void makeNewOutfit(const std::string& new_folder_name, - const LLDynamicArray<S32>& wearables_to_include, - const LLDynamicArray<S32>& attachments_to_include, - BOOL rename_clothing); - - LLUUID makeNewOutfitLinks(const std::string& new_folder_name); // Should only be called if we *know* we've never done so before, since users may // not want the Library outfits to stay in their quick outfit selector and can delete them. - void populateMyOutfitsFolder(void); + void populateMyOutfitsFolder(); private: void makeNewOutfitDone(S32 type, U32 index); @@ -183,18 +205,17 @@ private: // Save Wearables //-------------------------------------------------------------------- public: - // MULTI-WEARABLE: assumes one per type. - void saveWearableAs(const EWearableType type, const U32 index, const std::string& new_name, BOOL save_in_lost_and_found); - void saveWearable(const EWearableType type, const U32 index, BOOL send_update = TRUE); + void saveWearableAs(const LLWearableType::EType type, const U32 index, const std::string& new_name, BOOL save_in_lost_and_found); + void saveWearable(const LLWearableType::EType type, const U32 index, BOOL send_update = TRUE); void saveAllWearables(); - void revertWearable(const EWearableType type, const U32 index); + void revertWearable(const LLWearableType::EType type, const U32 index); //-------------------------------------------------------------------- // Static UI hooks //-------------------------------------------------------------------- public: - // MULTI-WEARABLE: assuming one wearable per type. Need upstream changes. - static void userRemoveWearable(EWearableType& type); + static void userRemoveWearable(const LLWearableType::EType &type, const U32 &index); + static void userRemoveWearablesOfType(const LLWearableType::EType &type); static void userRemoveAllClothes(); typedef std::vector<LLViewerObject*> llvo_vec_t; @@ -208,17 +229,40 @@ public: U32 itemUpdatePendingCount() const; //-------------------------------------------------------------------- + // Signals + //-------------------------------------------------------------------- +public: + typedef boost::function<void()> loading_started_callback_t; + typedef boost::signals2::signal<void()> loading_started_signal_t; + boost::signals2::connection addLoadingStartedCallback(loading_started_callback_t cb); + + typedef boost::function<void()> loaded_callback_t; + typedef boost::signals2::signal<void()> loaded_signal_t; + boost::signals2::connection addLoadedCallback(loaded_callback_t cb); + + void notifyLoadingStarted(); + void notifyLoadingFinished(); + +private: + loading_started_signal_t mLoadingStartedSignal; // should be called before wearables are changed + loaded_signal_t mLoadedSignal; // emitted when all agent wearables get loaded + + //-------------------------------------------------------------------- // Member variables //-------------------------------------------------------------------- private: typedef std::vector<LLWearable*> wearableentry_vec_t; // all wearables of a certain type (EG all shirts) - typedef std::map<EWearableType, wearableentry_vec_t> wearableentry_map_t; // wearable "categories" arranged by wearable type + typedef std::map<LLWearableType::EType, wearableentry_vec_t> wearableentry_map_t; // wearable "categories" arranged by wearable type wearableentry_map_t mWearableDatas; static BOOL mInitialWearablesUpdateReceived; BOOL mWearablesLoaded; std::set<LLUUID> mItemsAwaitingWearableUpdate; - LLPointer<LLVOAvatarSelf> mAvatarObject; // NULL until avatar object sent down from simulator + + /** + * True if agent's outfit is being changed now. + */ + BOOL mCOFChangeInProgress; //-------------------------------------------------------------------------------- // Support classes @@ -238,33 +282,30 @@ private: class addWearableToAgentInventoryCallback : public LLInventoryCallback { public: - enum EType + enum ETodo { CALL_NONE = 0, CALL_UPDATE = 1, CALL_RECOVERDONE = 2, CALL_CREATESTANDARDDONE = 4, - CALL_MAKENEWOUTFITDONE = 8 + CALL_MAKENEWOUTFITDONE = 8, + CALL_WEARITEM = 16 }; - // MULTI-WEARABLE: index is an EWearableType - more confusing usage. - // MULTI-WEARABLE: need to have type and index args both? addWearableToAgentInventoryCallback(LLPointer<LLRefCount> cb, - S32 type, + LLWearableType::EType type, U32 index, LLWearable* wearable, U32 todo = CALL_NONE); virtual void fire(const LLUUID& inv_item); private: - S32 mType; + LLWearableType::EType mType; U32 mIndex; LLWearable* mWearable; U32 mTodo; LLPointer<LLRefCount> mCB; }; - static const U32 MAX_WEARABLES_PER_TYPE = 1; - }; // LLAgentWearables extern LLAgentWearables gAgentWearables; diff --git a/indra/newview/llagentwearablesfetch.cpp b/indra/newview/llagentwearablesfetch.cpp new file mode 100644 index 0000000000..931aba1d41 --- /dev/null +++ b/indra/newview/llagentwearablesfetch.cpp @@ -0,0 +1,574 @@ +/** + * @file llagentwearablesfetch.cpp + * @brief LLAgentWearblesFetch class implementation + * + * $LicenseInfo:firstyear=2001&license=viewergpl$ + * + * Copyright (c) 2001-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" +#include "llagentwearablesfetch.h" + +#include "llagent.h" +#include "llagentwearables.h" +#include "llappearancemgr.h" +#include "llinventoryfunctions.h" +#include "llstartup.h" +#include "llvoavatarself.h" + + +class LLOrderMyOutfitsOnDestroy: public LLInventoryCallback +{ +public: + LLOrderMyOutfitsOnDestroy() {}; + + virtual ~LLOrderMyOutfitsOnDestroy() + { + const LLUUID& my_outfits_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS); + if (my_outfits_id.isNull()) return; + + LLInventoryModel::cat_array_t* cats; + LLInventoryModel::item_array_t* items; + gInventory.getDirectDescendentsOf(my_outfits_id, cats, items); + if (!cats) return; + + //My Outfits should at least contain saved initial outfit and one another outfit + if (cats->size() < 2) + { + llwarning("My Outfits category was not populated properly", 0); + return; + } + + llinfos << "Starting updating My Outfits with wearables ordering information" << llendl; + + for (LLInventoryModel::cat_array_t::iterator outfit_iter = cats->begin(); + outfit_iter != cats->end(); ++outfit_iter) + { + const LLUUID& cat_id = (*outfit_iter)->getUUID(); + if (cat_id.isNull()) continue; + + // saved initial outfit already contains wearables ordering information + if (cat_id == LLAppearanceMgr::getInstance()->getBaseOutfitUUID()) continue; + + LLAppearanceMgr::getInstance()->updateClothingOrderingInfo(cat_id); + } + + llinfos << "Finished updating My Outfits with wearables ordering information" << llendl; + } + + /* virtual */ void fire(const LLUUID& inv_item) {}; +}; + + +LLInitialWearablesFetch::LLInitialWearablesFetch(const LLUUID& cof_id) : + LLInventoryFetchDescendentsObserver(cof_id) +{ +} + +LLInitialWearablesFetch::~LLInitialWearablesFetch() +{ +} + +// virtual +void LLInitialWearablesFetch::done() +{ + // Delay processing the actual results of this so it's not handled within + // gInventory.notifyObservers. The results will be handled in the next + // idle tick instead. + gInventory.removeObserver(this); + doOnIdleOneTime(boost::bind(&LLInitialWearablesFetch::processContents,this)); +} + +void LLInitialWearablesFetch::add(InitialWearableData &data) + +{ + mAgentInitialWearables.push_back(data); +} + +void LLInitialWearablesFetch::processContents() +{ + // Fetch the wearable items from the Current Outfit Folder + LLInventoryModel::cat_array_t cat_array; + LLInventoryModel::item_array_t wearable_array; + LLFindWearables is_wearable; + gInventory.collectDescendentsIf(mComplete.front(), cat_array, wearable_array, + LLInventoryModel::EXCLUDE_TRASH, is_wearable); + + LLAppearanceMgr::instance().setAttachmentInvLinkEnable(true); + if (wearable_array.count() > 0) + { + gAgentWearables.notifyLoadingStarted(); + LLAppearanceMgr::instance().updateAppearanceFromCOF(); + } + else + { + // if we're constructing the COF from the wearables message, we don't have a proper outfit link + LLAppearanceMgr::instance().setOutfitDirty(true); + processWearablesMessage(); + } + delete this; +} + +class LLFetchAndLinkObserver: public LLInventoryFetchItemsObserver +{ +public: + LLFetchAndLinkObserver(uuid_vec_t& ids): + LLInventoryFetchItemsObserver(ids) + { + } + ~LLFetchAndLinkObserver() + { + } + virtual void done() + { + gInventory.removeObserver(this); + + // Link to all fetched items in COF. + LLPointer<LLInventoryCallback> link_waiter = new LLUpdateAppearanceOnDestroy; + for (uuid_vec_t::iterator it = mIDs.begin(); + it != mIDs.end(); + ++it) + { + LLUUID id = *it; + LLViewerInventoryItem *item = gInventory.getItem(*it); + if (!item) + { + llwarns << "fetch failed!" << llendl; + continue; + } + + link_inventory_item(gAgent.getID(), + item->getLinkedUUID(), + LLAppearanceMgr::instance().getCOF(), + item->getName(), + item->getDescription(), + LLAssetType::AT_LINK, + link_waiter); + } + } +}; + +void LLInitialWearablesFetch::processWearablesMessage() +{ + if (!mAgentInitialWearables.empty()) // We have an empty current outfit folder, use the message data instead. + { + const LLUUID current_outfit_id = LLAppearanceMgr::instance().getCOF(); + uuid_vec_t ids; + for (U8 i = 0; i < mAgentInitialWearables.size(); ++i) + { + // Populate the current outfit folder with links to the wearables passed in the message + InitialWearableData *wearable_data = new InitialWearableData(mAgentInitialWearables[i]); // This will be deleted in the callback. + + if (wearable_data->mAssetID.notNull()) + { + ids.push_back(wearable_data->mItemID); + } + else + { + llinfos << "Invalid wearable, type " << wearable_data->mType << " itemID " + << wearable_data->mItemID << " assetID " << wearable_data->mAssetID << llendl; + delete wearable_data; + } + } + + // Add all current attachments to the requested items as well. + if (isAgentAvatarValid()) + { + for (LLVOAvatar::attachment_map_t::const_iterator iter = gAgentAvatarp->mAttachmentPoints.begin(); + iter != gAgentAvatarp->mAttachmentPoints.end(); ++iter) + { + LLViewerJointAttachment* attachment = iter->second; + if (!attachment) continue; + for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin(); + attachment_iter != attachment->mAttachedObjects.end(); + ++attachment_iter) + { + LLViewerObject* attached_object = (*attachment_iter); + if (!attached_object) continue; + const LLUUID& item_id = attached_object->getItemID(); + if (item_id.isNull()) continue; + ids.push_back(item_id); + } + } + } + + // Need to fetch the inventory items for ids, then create links to them after they arrive. + LLFetchAndLinkObserver *fetcher = new LLFetchAndLinkObserver(ids); + fetcher->startFetch(); + // If no items to be fetched, done will never be triggered. + // TODO: Change LLInventoryFetchItemsObserver::fetchItems to trigger done() on this condition. + if (fetcher->isFinished()) + { + fetcher->done(); + } + else + { + gInventory.addObserver(fetcher); + } + } + else + { + LL_WARNS("Wearables") << "No current outfit folder items found and no initial wearables fallback message received." << LL_ENDL; + } +} + +LLLibraryOutfitsFetch::LLLibraryOutfitsFetch(const LLUUID& my_outfits_id) : + LLInventoryFetchDescendentsObserver(my_outfits_id), + mCurrFetchStep(LOFS_FOLDER), + mOutfitsPopulated(false) +{ + mMyOutfitsID = LLUUID::null; + mClothingID = LLUUID::null; + mLibraryClothingID = LLUUID::null; + mImportedClothingID = LLUUID::null; + mImportedClothingName = "Imported Library Clothing"; +} + +LLLibraryOutfitsFetch::~LLLibraryOutfitsFetch() +{ +} + +void LLLibraryOutfitsFetch::done() +{ + // Delay this until idle() routine, since it's a heavy operation and + // we also can't have it run within notifyObservers. + doOnIdleOneTime(boost::bind(&LLLibraryOutfitsFetch::doneIdle,this)); + gInventory.removeObserver(this); // Prevent doOnIdleOneTime from being added twice. +} + +void LLLibraryOutfitsFetch::doneIdle() +{ + gInventory.addObserver(this); // Add this back in since it was taken out during ::done() + + switch (mCurrFetchStep) + { + case LOFS_FOLDER: + folderDone(); + mCurrFetchStep = LOFS_OUTFITS; + break; + case LOFS_OUTFITS: + outfitsDone(); + mCurrFetchStep = LOFS_LIBRARY; + break; + case LOFS_LIBRARY: + libraryDone(); + mCurrFetchStep = LOFS_IMPORTED; + break; + case LOFS_IMPORTED: + importedFolderDone(); + mCurrFetchStep = LOFS_CONTENTS; + break; + case LOFS_CONTENTS: + contentsDone(); + break; + default: + llwarns << "Got invalid state for outfit fetch: " << mCurrFetchStep << llendl; + mOutfitsPopulated = TRUE; + break; + } + + // We're completely done. Cleanup. + if (mOutfitsPopulated) + { + gInventory.removeObserver(this); + delete this; + return; + } +} + +void LLLibraryOutfitsFetch::folderDone() +{ + LLInventoryModel::cat_array_t cat_array; + LLInventoryModel::item_array_t wearable_array; + gInventory.collectDescendents(mMyOutfitsID, cat_array, wearable_array, + LLInventoryModel::EXCLUDE_TRASH); + + // Early out if we already have items in My Outfits + // except the case when My Outfits contains just initial outfit + if (cat_array.count() > 1 || + cat_array.count() == 1 && cat_array[0]->getUUID() != LLAppearanceMgr::getInstance()->getBaseOutfitUUID()) + { + mOutfitsPopulated = true; + return; + } + + mClothingID = gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING); + mLibraryClothingID = gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING, false, true); + + // If Library->Clothing->Initial Outfits exists, use that. + LLNameCategoryCollector matchFolderFunctor("Initial Outfits"); + cat_array.clear(); + gInventory.collectDescendentsIf(mLibraryClothingID, + cat_array, wearable_array, + LLInventoryModel::EXCLUDE_TRASH, + matchFolderFunctor); + if (cat_array.count() > 0) + { + const LLViewerInventoryCategory *cat = cat_array.get(0); + mLibraryClothingID = cat->getUUID(); + } + + mComplete.clear(); + + // Get the complete information on the items in the inventory. + uuid_vec_t folders; + folders.push_back(mClothingID); + folders.push_back(mLibraryClothingID); + setFetchIDs(folders); + startFetch(); + if (isFinished()) + { + done(); + } +} + +void LLLibraryOutfitsFetch::outfitsDone() +{ + LLInventoryModel::cat_array_t cat_array; + LLInventoryModel::item_array_t wearable_array; + uuid_vec_t folders; + + // Collect the contents of the Library's Clothing folder + gInventory.collectDescendents(mLibraryClothingID, cat_array, wearable_array, + LLInventoryModel::EXCLUDE_TRASH); + + llassert(cat_array.count() > 0); + for (LLInventoryModel::cat_array_t::const_iterator iter = cat_array.begin(); + iter != cat_array.end(); + ++iter) + { + const LLViewerInventoryCategory *cat = iter->get(); + + // Get the names and id's of every outfit in the library, skip "Ruth" + // because it's a low quality legacy outfit + if (cat->getName() != "Ruth") + { + // Get the name of every outfit in the library + folders.push_back(cat->getUUID()); + mLibraryClothingFolders.push_back(cat->getUUID()); + } + } + cat_array.clear(); + wearable_array.clear(); + + // Check if you already have an "Imported Library Clothing" folder + LLNameCategoryCollector matchFolderFunctor(mImportedClothingName); + gInventory.collectDescendentsIf(mClothingID, + cat_array, wearable_array, + LLInventoryModel::EXCLUDE_TRASH, + matchFolderFunctor); + if (cat_array.size() > 0) + { + const LLViewerInventoryCategory *cat = cat_array.get(0); + mImportedClothingID = cat->getUUID(); + } + + mComplete.clear(); + setFetchIDs(folders); + startFetch(); + if (isFinished()) + { + done(); + } +} + +class LLLibraryOutfitsCopyDone: public LLInventoryCallback +{ +public: + LLLibraryOutfitsCopyDone(LLLibraryOutfitsFetch * fetcher): + mFireCount(0), mLibraryOutfitsFetcher(fetcher) + { + } + + virtual ~LLLibraryOutfitsCopyDone() + { + if (!LLApp::isExiting() && mLibraryOutfitsFetcher) + { + gInventory.addObserver(mLibraryOutfitsFetcher); + mLibraryOutfitsFetcher->done(); + } + } + + /* virtual */ void fire(const LLUUID& inv_item) + { + mFireCount++; + } +private: + U32 mFireCount; + LLLibraryOutfitsFetch * mLibraryOutfitsFetcher; +}; + +// Copy the clothing folders from the library into the imported clothing folder +void LLLibraryOutfitsFetch::libraryDone() +{ + if (mImportedClothingID != LLUUID::null) + { + // Skip straight to fetching the contents of the imported folder + importedFolderFetch(); + return; + } + + // Remove observer; next autopopulation step will be triggered externally by LLLibraryOutfitsCopyDone. + gInventory.removeObserver(this); + + LLPointer<LLInventoryCallback> copy_waiter = new LLLibraryOutfitsCopyDone(this); + mImportedClothingID = gInventory.createNewCategory(mClothingID, + LLFolderType::FT_NONE, + mImportedClothingName); + // Copy each folder from library into clothing unless it already exists. + for (uuid_vec_t::const_iterator iter = mLibraryClothingFolders.begin(); + iter != mLibraryClothingFolders.end(); + ++iter) + { + const LLUUID& src_folder_id = (*iter); // Library clothing folder ID + const LLViewerInventoryCategory *cat = gInventory.getCategory(src_folder_id); + if (!cat) + { + llwarns << "Library folder import for uuid:" << src_folder_id << " failed to find folder." << llendl; + continue; + } + + if (!LLAppearanceMgr::getInstance()->getCanMakeFolderIntoOutfit(src_folder_id)) + { + llinfos << "Skipping non-outfit folder name:" << cat->getName() << llendl; + continue; + } + + // Don't copy the category if it already exists. + LLNameCategoryCollector matchFolderFunctor(cat->getName()); + LLInventoryModel::cat_array_t cat_array; + LLInventoryModel::item_array_t wearable_array; + gInventory.collectDescendentsIf(mImportedClothingID, + cat_array, wearable_array, + LLInventoryModel::EXCLUDE_TRASH, + matchFolderFunctor); + if (cat_array.size() > 0) + { + continue; + } + + LLUUID dst_folder_id = gInventory.createNewCategory(mImportedClothingID, + LLFolderType::FT_NONE, + cat->getName()); + LLAppearanceMgr::getInstance()->shallowCopyCategoryContents(src_folder_id, dst_folder_id, copy_waiter); + } +} + +void LLLibraryOutfitsFetch::importedFolderFetch() +{ + // Fetch the contents of the Imported Clothing Folder + uuid_vec_t folders; + folders.push_back(mImportedClothingID); + + mComplete.clear(); + setFetchIDs(folders); + startFetch(); + if (isFinished()) + { + done(); + } +} + +void LLLibraryOutfitsFetch::importedFolderDone() +{ + LLInventoryModel::cat_array_t cat_array; + LLInventoryModel::item_array_t wearable_array; + uuid_vec_t folders; + + // Collect the contents of the Imported Clothing folder + gInventory.collectDescendents(mImportedClothingID, cat_array, wearable_array, + LLInventoryModel::EXCLUDE_TRASH); + + for (LLInventoryModel::cat_array_t::const_iterator iter = cat_array.begin(); + iter != cat_array.end(); + ++iter) + { + const LLViewerInventoryCategory *cat = iter->get(); + + // Get the name of every imported outfit + folders.push_back(cat->getUUID()); + mImportedClothingFolders.push_back(cat->getUUID()); + } + + mComplete.clear(); + setFetchIDs(folders); + startFetch(); + if (isFinished()) + { + done(); + } +} + +void LLLibraryOutfitsFetch::contentsDone() +{ + LLInventoryModel::cat_array_t cat_array; + LLInventoryModel::item_array_t wearable_array; + + LLPointer<LLOrderMyOutfitsOnDestroy> order_myoutfits_on_destroy = new LLOrderMyOutfitsOnDestroy; + + for (uuid_vec_t::const_iterator folder_iter = mImportedClothingFolders.begin(); + folder_iter != mImportedClothingFolders.end(); + ++folder_iter) + { + const LLUUID &folder_id = (*folder_iter); + const LLViewerInventoryCategory *cat = gInventory.getCategory(folder_id); + if (!cat) + { + llwarns << "Library folder import for uuid:" << folder_id << " failed to find folder." << llendl; + continue; + } + + //initial outfit should be already in My Outfits + if (cat->getName() == LLStartUp::getInitialOutfitName()) continue; + + // First, make a folder in the My Outfits directory. + LLUUID new_outfit_folder_id = gInventory.createNewCategory(mMyOutfitsID, LLFolderType::FT_OUTFIT, cat->getName()); + + cat_array.clear(); + wearable_array.clear(); + // Collect the contents of each imported clothing folder, so we can create new outfit links for it + gInventory.collectDescendents(folder_id, cat_array, wearable_array, + LLInventoryModel::EXCLUDE_TRASH); + + for (LLInventoryModel::item_array_t::const_iterator wearable_iter = wearable_array.begin(); + wearable_iter != wearable_array.end(); + ++wearable_iter) + { + const LLViewerInventoryItem *item = wearable_iter->get(); + link_inventory_item(gAgent.getID(), + item->getLinkedUUID(), + new_outfit_folder_id, + item->getName(), + item->getDescription(), + LLAssetType::AT_LINK, + order_myoutfits_on_destroy); + } + } + + mOutfitsPopulated = true; +} + diff --git a/indra/newview/llagentwearablesfetch.h b/indra/newview/llagentwearablesfetch.h new file mode 100644 index 0000000000..faa5fbaa43 --- /dev/null +++ b/indra/newview/llagentwearablesfetch.h @@ -0,0 +1,118 @@ +/** + * @file llagentwearablesinitialfetch.h + * @brief LLAgentWearablesInitialFetch class header file + * + * $LicenseInfo:firstyear=2000&license=viewergpl$ + * + * Copyright (c) 2000-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLAGENTWEARABLESINITIALFETCH_H +#define LL_LLAGENTWEARABLESINITIALFETCH_H + +#include "llinventoryobserver.h" +#include "llwearabletype.h" +#include "lluuid.h" + +//-------------------------------------------------------------------- +// InitialWearablesFetch +// +// This grabs contents from the COF and processes them. +// The processing is handled in idle(), i.e. outside of done(), +// to avoid gInventory.notifyObservers recursion. +//-------------------------------------------------------------------- +class LLInitialWearablesFetch : public LLInventoryFetchDescendentsObserver +{ +public: + LLInitialWearablesFetch(const LLUUID& cof_id); + ~LLInitialWearablesFetch(); + virtual void done(); + + struct InitialWearableData + { + LLWearableType::EType mType; + LLUUID mItemID; + LLUUID mAssetID; + InitialWearableData(LLWearableType::EType type, LLUUID& itemID, LLUUID& assetID) : + mType(type), + mItemID(itemID), + mAssetID(assetID) + {} + }; + + void add(InitialWearableData &data); + +protected: + void processWearablesMessage(); + void processContents(); + +private: + typedef std::vector<InitialWearableData> initial_wearable_data_vec_t; + initial_wearable_data_vec_t mAgentInitialWearables; // Wearables from the old agent wearables msg +}; + +//-------------------------------------------------------------------- +// InitialWearablesFetch +// +// This grabs outfits from the Library and copies those over to the user's +// outfits folder, typically during first-ever login. +//-------------------------------------------------------------------- +class LLLibraryOutfitsFetch : public LLInventoryFetchDescendentsObserver +{ +public: + enum ELibraryOutfitFetchStep + { + LOFS_FOLDER = 0, + LOFS_OUTFITS, + LOFS_LIBRARY, + LOFS_IMPORTED, + LOFS_CONTENTS + }; + + LLLibraryOutfitsFetch(const LLUUID& my_outfits_id); + ~LLLibraryOutfitsFetch(); + + virtual void done(); + void doneIdle(); + LLUUID mMyOutfitsID; + void importedFolderFetch(); +protected: + void folderDone(); + void outfitsDone(); + void libraryDone(); + void importedFolderDone(); + void contentsDone(); + enum ELibraryOutfitFetchStep mCurrFetchStep; + uuid_vec_t mLibraryClothingFolders; + uuid_vec_t mImportedClothingFolders; + bool mOutfitsPopulated; + LLUUID mClothingID; + LLUUID mLibraryClothingID; + LLUUID mImportedClothingID; + std::string mImportedClothingName; +}; + +#endif // LL_AGENTWEARABLESINITIALFETCH_H diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 326fc41c1e..3947be49bb 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -32,22 +32,59 @@ #include "llviewerprecompiledheaders.h" +#include "llaccordionctrltab.h" #include "llagent.h" +#include "llagentcamera.h" #include "llagentwearables.h" #include "llappearancemgr.h" #include "llcommandhandler.h" -#include "llfloatercustomize.h" +#include "lleventtimer.h" #include "llgesturemgr.h" #include "llinventorybridge.h" +#include "llinventoryfunctions.h" #include "llinventoryobserver.h" #include "llnotificationsutil.h" +#include "lloutfitobserver.h" +#include "llpaneloutfitsinventory.h" +#include "llselectmgr.h" #include "llsidepanelappearance.h" #include "llsidetray.h" +#include "llviewerobjectlist.h" #include "llvoavatar.h" #include "llvoavatarself.h" #include "llviewerregion.h" #include "llwearablelist.h" +char ORDER_NUMBER_SEPARATOR('@'); + +class LLOutfitUnLockTimer: public LLEventTimer +{ +public: + LLOutfitUnLockTimer(F32 period) : LLEventTimer(period) + { + // restart timer on BOF changed event + LLOutfitObserver::instance().addBOFChangedCallback(boost::bind( + &LLOutfitUnLockTimer::reset, this)); + stop(); + } + + /*virtual*/ + BOOL tick() + { + if(mEventTimer.hasExpired()) + { + LLAppearanceMgr::instance().setOutfitLocked(false); + } + return FALSE; + } + void stop() { mEventTimer.stop(); } + void start() { mEventTimer.start(); } + void reset() { mEventTimer.reset(); } + BOOL getStarted() { return mEventTimer.getStarted(); } + + LLTimer& getEventTimer() { return mEventTimer;} +}; + // support for secondlife:///app/appearance SLapps class LLAppearanceHandler : public LLCommandHandler { @@ -63,8 +100,35 @@ public: return true; } }; + LLAppearanceHandler gAppearanceHandler; + +LLUUID findDescendentCategoryIDByName(const LLUUID& parent_id, const std::string& name) +{ + LLInventoryModel::cat_array_t cat_array; + LLInventoryModel::item_array_t item_array; + LLNameCategoryCollector has_name(name); + gInventory.collectDescendentsIf(parent_id, + cat_array, + item_array, + LLInventoryModel::EXCLUDE_TRASH, + has_name); + if (0 == cat_array.count()) + return LLUUID(); + else + { + LLViewerInventoryCategory *cat = cat_array.get(0); + if (cat) + return cat->getUUID(); + else + { + llwarns << "null cat" << llendl; + return LLUUID(); + } + } +} + class LLWearInventoryCategoryCallback : public LLInventoryCallback { public: @@ -88,11 +152,13 @@ public: protected: ~LLWearInventoryCategoryCallback() { + llinfos << "done all inventory callbacks" << llendl; + // Is the destructor called by ordinary dereference, or because the app's shutting down? // If the inventory callback manager goes away, we're shutting down, no longer want the callback. if( LLInventoryCallbackManager::is_instantiated() ) { - LLAppearanceManager::instance().wearInventoryCategoryOnAvatar(gInventory.getCategory(mCatID), mAppend); + LLAppearanceMgr::instance().wearInventoryCategoryOnAvatar(gInventory.getCategory(mCatID), mAppend); } else { @@ -105,212 +171,77 @@ private: bool mAppend; }; -class LLOutfitObserver : public LLInventoryFetchObserver -{ -public: - LLOutfitObserver(const LLUUID& cat_id, bool copy_items, bool append) : - mCatID(cat_id), - mCopyItems(copy_items), - mAppend(append) - {} - ~LLOutfitObserver() {} - virtual void done(); - void doWearCategory(); - -protected: - LLUUID mCatID; - bool mCopyItems; - bool mAppend; -}; - -void LLOutfitObserver::done() -{ - gInventory.removeObserver(this); - doOnIdle(boost::bind(&LLOutfitObserver::doWearCategory,this)); -} -void LLOutfitObserver::doWearCategory() +//Inventory callback updating "dirty" state when destroyed +class LLUpdateDirtyState: public LLInventoryCallback { - // We now have an outfit ready to be copied to agent inventory. Do - // it, and wear that outfit normally. - if(mCopyItems) +public: + LLUpdateDirtyState() {} + virtual ~LLUpdateDirtyState() { - LLInventoryCategory* cat = gInventory.getCategory(mCatID); - std::string name; - if(!cat) - { - // should never happen. - name = "New Outfit"; - } - else - { - name = cat->getName(); - } - LLViewerInventoryItem* item = NULL; - item_ref_t::iterator it = mComplete.begin(); - item_ref_t::iterator end = mComplete.end(); - LLUUID pid; - for(; it < end; ++it) - { - item = (LLViewerInventoryItem*)gInventory.getItem(*it); - if(item) - { - if(LLInventoryType::IT_GESTURE == item->getInventoryType()) - { - pid = gInventory.findCategoryUUIDForType(LLFolderType::FT_GESTURE); - } - else - { - pid = gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING); - } - break; - } - } - if(pid.isNull()) - { - pid = gInventory.getRootFolderID(); - } - - LLUUID cat_id = gInventory.createNewCategory( - pid, - LLFolderType::FT_NONE, - name); - mCatID = cat_id; - LLPointer<LLInventoryCallback> cb = new LLWearInventoryCategoryCallback(mCatID, mAppend); - it = mComplete.begin(); - for(; it < end; ++it) + if (LLAppearanceMgr::instanceExists()) { - item = (LLViewerInventoryItem*)gInventory.getItem(*it); - if(item) - { - copy_inventory_item( - gAgent.getID(), - item->getPermissions().getOwner(), - item->getUUID(), - cat_id, - std::string(), - cb); - } + LLAppearanceMgr::getInstance()->updateIsDirty(); } - // BAP fixes a lag in display of created dir. - gInventory.notifyObservers(); } - else - { - // Wear the inventory category. - LLAppearanceManager::instance().wearInventoryCategoryOnAvatar(gInventory.getCategory(mCatID), mAppend); - } - delete this; -} - -class LLOutfitFetch : public LLInventoryFetchDescendentsObserver -{ -public: - LLOutfitFetch(bool copy_items, bool append) : mCopyItems(copy_items), mAppend(append) {} - ~LLOutfitFetch() {} - virtual void done(); -protected: - bool mCopyItems; - bool mAppend; + virtual void fire(const LLUUID&) {} }; -void LLOutfitFetch::done() -{ - // What we do here is get the complete information on the items in - // the library, and set up an observer that will wait for that to - // happen. - LLInventoryModel::cat_array_t cat_array; - LLInventoryModel::item_array_t item_array; - gInventory.collectDescendents(mCompleteFolders.front(), - cat_array, - item_array, - LLInventoryModel::EXCLUDE_TRASH); - S32 count = item_array.count(); - if(!count) - { - llwarns << "Nothing fetched in category " << mCompleteFolders.front() - << llendl; - //dec_busy_count(); - gInventory.removeObserver(this); - delete this; - return; - } - - LLOutfitObserver* outfit_observer = new LLOutfitObserver(mCompleteFolders.front(), mCopyItems, mAppend); - LLInventoryFetchObserver::item_ref_t ids; - for(S32 i = 0; i < count; ++i) - { - ids.push_back(item_array.get(i)->getUUID()); - } - - // clean up, and remove this as an observer since the call to the - // outfit could notify observers and throw us into an infinite - // loop. - //dec_busy_count(); - gInventory.removeObserver(this); - // increment busy count and either tell the inventory to check & - // call done, or add this object to the inventory for observation. - //inc_busy_count(); - - // do the fetch - outfit_observer->fetchItems(ids); - if(outfit_observer->isEverythingComplete()) - { - // everything is already here - call done. - outfit_observer->done(); - } - else - { - // it's all on it's way - add an observer, and the inventory - // will call done for us when everything is here. - gInventory.addObserver(outfit_observer); - } - delete this; +LLUpdateAppearanceOnDestroy::LLUpdateAppearanceOnDestroy(): + mFireCount(0) +{ } -class LLUpdateAppearanceOnDestroy: public LLInventoryCallback +LLUpdateAppearanceOnDestroy::~LLUpdateAppearanceOnDestroy() { -public: - LLUpdateAppearanceOnDestroy(): - mFireCount(0) + llinfos << "done update appearance on destroy" << llendl; + + if (!LLApp::isExiting()) { + LLAppearanceMgr::instance().updateAppearanceFromCOF(); } +} - virtual ~LLUpdateAppearanceOnDestroy() - { - if (!LLApp::isExiting()) - { - LLAppearanceManager::instance().updateAppearanceFromCOF(); - } - } - - /* virtual */ void fire(const LLUUID& inv_item) - { - mFireCount++; - } -private: - U32 mFireCount; -}; +void LLUpdateAppearanceOnDestroy::fire(const LLUUID& inv_item) +{ + LLViewerInventoryItem* item = (LLViewerInventoryItem*)gInventory.getItem(inv_item); + const std::string item_name = item ? item->getName() : "ITEM NOT FOUND"; +#ifndef LL_RELEASE_FOR_DOWNLOAD + llinfos << "callback fired [ name:" << item_name << " UUID:" << inv_item << " count:" << mFireCount << " ] " << llendl; +#endif + mFireCount++; +} struct LLFoundData { - LLFoundData() : mAssetType(LLAssetType::AT_NONE), mWearable(NULL) {} + LLFoundData() : + mAssetType(LLAssetType::AT_NONE), + mWearableType(LLWearableType::WT_INVALID), + mWearable(NULL) {} + LLFoundData(const LLUUID& item_id, - const LLUUID& asset_id, - const std::string& name, - LLAssetType::EType asset_type) : + const LLUUID& asset_id, + const std::string& name, + const LLAssetType::EType& asset_type, + const LLWearableType::EType& wearable_type, + const bool is_replacement = false + ) : mItemID(item_id), mAssetID(asset_id), mName(name), mAssetType(asset_type), + mWearableType(wearable_type), + mIsReplacement(is_replacement), mWearable( NULL ) {} LLUUID mItemID; LLUUID mAssetID; std::string mName; LLAssetType::EType mAssetType; + LLWearableType::EType mWearableType; LLWearable* mWearable; + bool mIsReplacement; }; @@ -320,50 +251,241 @@ public: LLWearableHoldingPattern(); ~LLWearableHoldingPattern(); - bool pollCompletion(); + bool pollFetchCompletion(); + void onFetchCompletion(); bool isFetchCompleted(); bool isTimedOut(); + + void checkMissingWearables(); + bool pollMissingWearables(); + bool isMissingCompleted(); + void recoverMissingWearable(LLWearableType::EType type); + void clearCOFLinksForMissingWearables(); + void onWearableAssetFetch(LLWearable *wearable); + void onAllComplete(); + typedef std::list<LLFoundData> found_list_t; + found_list_t& getFoundList(); + void eraseTypeToLink(LLWearableType::EType type); + void eraseTypeToRecover(LLWearableType::EType type); + void setObjItems(const LLInventoryModel::item_array_t& items); + void setGestItems(const LLInventoryModel::item_array_t& items); + bool isMostRecent(); + void handleLateArrivals(); + void resetTime(F32 timeout); + +private: found_list_t mFoundList; LLInventoryModel::item_array_t mObjItems; LLInventoryModel::item_array_t mGestItems; + typedef std::set<S32> type_set_t; + type_set_t mTypesToRecover; + type_set_t mTypesToLink; S32 mResolved; LLTimer mWaitTime; bool mFired; + typedef std::set<LLWearableHoldingPattern*> type_set_hp; + static type_set_hp sActiveHoldingPatterns; + bool mIsMostRecent; + std::set<LLWearable*> mLateArrivals; + bool mIsAllComplete; }; +LLWearableHoldingPattern::type_set_hp LLWearableHoldingPattern::sActiveHoldingPatterns; + LLWearableHoldingPattern::LLWearableHoldingPattern(): mResolved(0), - mFired(false) + mFired(false), + mIsMostRecent(true), + mIsAllComplete(false) { + if (sActiveHoldingPatterns.size()>0) + { + llinfos << "Creating LLWearableHoldingPattern when " + << sActiveHoldingPatterns.size() + << " other attempts are active." + << " Flagging others as invalid." + << llendl; + for (type_set_hp::iterator it = sActiveHoldingPatterns.begin(); + it != sActiveHoldingPatterns.end(); + ++it) + { + (*it)->mIsMostRecent = false; + } + + } + sActiveHoldingPatterns.insert(this); } LLWearableHoldingPattern::~LLWearableHoldingPattern() { + sActiveHoldingPatterns.erase(this); +} + +bool LLWearableHoldingPattern::isMostRecent() +{ + return mIsMostRecent; +} + +LLWearableHoldingPattern::found_list_t& LLWearableHoldingPattern::getFoundList() +{ + return mFoundList; +} + +void LLWearableHoldingPattern::eraseTypeToLink(LLWearableType::EType type) +{ + mTypesToLink.erase(type); +} + +void LLWearableHoldingPattern::eraseTypeToRecover(LLWearableType::EType type) +{ + mTypesToRecover.erase(type); +} + +void LLWearableHoldingPattern::setObjItems(const LLInventoryModel::item_array_t& items) +{ + mObjItems = items; +} + +void LLWearableHoldingPattern::setGestItems(const LLInventoryModel::item_array_t& items) +{ + mGestItems = items; } bool LLWearableHoldingPattern::isFetchCompleted() { - return (mResolved >= (S32)mFoundList.size()); // have everything we were waiting for? + return (mResolved >= (S32)getFoundList().size()); // have everything we were waiting for? } bool LLWearableHoldingPattern::isTimedOut() { - static F32 max_wait_time = 20.0; // give up if wearable fetches haven't completed in max_wait_time seconds. - return mWaitTime.getElapsedTimeF32() > max_wait_time; + return mWaitTime.hasExpired(); } -bool LLWearableHoldingPattern::pollCompletion() +void LLWearableHoldingPattern::checkMissingWearables() { + if (!isMostRecent()) + { + llwarns << "skipping because LLWearableHolding pattern is invalid (superceded by later outfit request)" << llendl; + } + + std::vector<S32> found_by_type(LLWearableType::WT_COUNT,0); + std::vector<S32> requested_by_type(LLWearableType::WT_COUNT,0); + for (found_list_t::iterator it = getFoundList().begin(); it != getFoundList().end(); ++it) + { + LLFoundData &data = *it; + if (data.mWearableType < LLWearableType::WT_COUNT) + requested_by_type[data.mWearableType]++; + if (data.mWearable) + found_by_type[data.mWearableType]++; + } + + for (S32 type = 0; type < LLWearableType::WT_COUNT; ++type) + { + llinfos << "type " << type << " requested " << requested_by_type[type] << " found " << found_by_type[type] << llendl; + if (found_by_type[type] > 0) + continue; + if ( + // If at least one wearable of certain types (pants/shirt/skirt) + // was requested but none was found, create a default asset as a replacement. + // In all other cases, don't do anything. + // For critical types (shape/hair/skin/eyes), this will keep the avatar as a cloud + // due to logic in LLVOAvatarSelf::getIsCloud(). + // For non-critical types (tatoo, socks, etc.) the wearable will just be missing. + (requested_by_type[type] > 0) && + ((type == LLWearableType::WT_PANTS) || (type == LLWearableType::WT_SHIRT) || (type == LLWearableType::WT_SKIRT))) + { + mTypesToRecover.insert(type); + mTypesToLink.insert(type); + recoverMissingWearable((LLWearableType::EType)type); + llwarns << "need to replace " << type << llendl; + } + } + + resetTime(60.0F); + if (!pollMissingWearables()) + { + doOnIdleRepeating(boost::bind(&LLWearableHoldingPattern::pollMissingWearables,this)); + } +} + +void LLWearableHoldingPattern::onAllComplete() +{ + if (!isMostRecent()) + { + llwarns << "skipping because LLWearableHolding pattern is invalid (superceded by later outfit request)" << llendl; + } + + // Activate all gestures in this folder + if (mGestItems.count() > 0) + { + llinfos << "Activating " << mGestItems.count() << " gestures" << llendl; + + LLGestureMgr::instance().activateGestures(mGestItems); + + // Update the inventory item labels to reflect the fact + // they are active. + LLViewerInventoryCategory* catp = + gInventory.getCategory(LLAppearanceMgr::instance().getCOF()); + + if (catp) + { + gInventory.updateCategory(catp); + gInventory.notifyObservers(); + } + } + + // Update wearables. + llinfos << "Updating agent wearables with " << mResolved << " wearable items " << llendl; + LLAppearanceMgr::instance().updateAgentWearables(this, false); + + // Update attachments to match those requested. + if (isAgentAvatarValid()) + { + llinfos << "Updating " << mObjItems.count() << " attachments" << llendl; + LLAgentWearables::userUpdateAttachments(mObjItems); + } + + if (isFetchCompleted() && isMissingCompleted()) + { + // Only safe to delete if all wearable callbacks and all missing wearables completed. + delete this; + } + else + { + mIsAllComplete = true; + handleLateArrivals(); + } +} + +void LLWearableHoldingPattern::onFetchCompletion() +{ + if (!isMostRecent()) + { + llwarns << "skipping because LLWearableHolding pattern is invalid (superceded by later outfit request)" << llendl; + } + + checkMissingWearables(); +} + +// Runs as an idle callback until all wearables are fetched (or we time out). +bool LLWearableHoldingPattern::pollFetchCompletion() +{ + if (!isMostRecent()) + { + llwarns << "skipping because LLWearableHolding pattern is invalid (superceded by later outfit request)" << llendl; + } + bool completed = isFetchCompleted(); bool timed_out = isTimedOut(); bool done = completed || timed_out; - - llinfos << "polling, done status: " << completed << " timed out? " << timed_out << " elapsed " << mWaitTime.getElapsedTimeF32() << llendl; if (done) { + llinfos << "polling, done status: " << completed << " timed out " << timed_out + << " elapsed " << mWaitTime.getElapsedTimeF32() << llendl; + mFired = true; if (timed_out) @@ -371,46 +493,338 @@ bool LLWearableHoldingPattern::pollCompletion() llwarns << "Exceeded max wait time for wearables, updating appearance based on what has arrived" << llendl; } - // Activate all gestures in this folder - if (mGestItems.count() > 0) + onFetchCompletion(); + } + return done; +} + +class RecoveredItemLinkCB: public LLInventoryCallback +{ +public: + RecoveredItemLinkCB(LLWearableType::EType type, LLWearable *wearable, LLWearableHoldingPattern* holder): + mHolder(holder), + mWearable(wearable), + mType(type) + { + } + void fire(const LLUUID& item_id) + { + if (!mHolder->isMostRecent()) + { + llwarns << "skipping because LLWearableHolding pattern is invalid (superceded by later outfit request)" << llendl; + } + + llinfos << "Recovered item link for type " << mType << llendl; + mHolder->eraseTypeToLink(mType); + // Add wearable to FoundData for actual wearing + LLViewerInventoryItem *item = gInventory.getItem(item_id); + LLViewerInventoryItem *linked_item = item ? item->getLinkedItem() : NULL; + + if (linked_item) { - llinfos << "Activating " << mGestItems.count() << " gestures" << llendl; + gInventory.addChangedMask(LLInventoryObserver::LABEL, linked_item->getUUID()); - LLGestureManager::instance().activateGestures(mGestItems); - - // Update the inventory item labels to reflect the fact - // they are active. - LLViewerInventoryCategory* catp = - gInventory.getCategory(LLAppearanceManager::instance().getCOF()); - - if (catp) + if (item) + { + LLFoundData found(linked_item->getUUID(), + linked_item->getAssetUUID(), + linked_item->getName(), + linked_item->getType(), + linked_item->isWearableType() ? linked_item->getWearableType() : LLWearableType::WT_INVALID, + true // is replacement + ); + found.mWearable = mWearable; + mHolder->getFoundList().push_front(found); + } + else { - gInventory.updateCategory(catp); - gInventory.notifyObservers(); + llwarns << "inventory item not found for recovered wearable" << llendl; } } + else + { + llwarns << "inventory link not found for recovered wearable" << llendl; + } + } +private: + LLWearableHoldingPattern* mHolder; + LLWearable *mWearable; + LLWearableType::EType mType; +}; - // Update wearables. - llinfos << "Updating agent wearables with " << mResolved << " wearable items " << llendl; - LLAppearanceManager::instance().updateAgentWearables(this, false); - - // Update attachments to match those requested. - LLVOAvatar* avatar = gAgent.getAvatarObject(); - if( avatar ) +class RecoveredItemCB: public LLInventoryCallback +{ +public: + RecoveredItemCB(LLWearableType::EType type, LLWearable *wearable, LLWearableHoldingPattern* holder): + mHolder(holder), + mWearable(wearable), + mType(type) + { + } + void fire(const LLUUID& item_id) + { + if (!mHolder->isMostRecent()) { - llinfos << "Updating " << mObjItems.count() << " attachments" << llendl; - LLAgentWearables::userUpdateAttachments(mObjItems); + llwarns << "skipping because LLWearableHolding pattern is invalid (superceded by later outfit request)" << llendl; } - if (completed) + llinfos << "Recovered item for type " << mType << llendl; + LLViewerInventoryItem *itemp = gInventory.getItem(item_id); + mWearable->setItemID(item_id); + LLPointer<LLInventoryCallback> cb = new RecoveredItemLinkCB(mType,mWearable,mHolder); + mHolder->eraseTypeToRecover(mType); + llassert(itemp); + if (itemp) { - // Only safe to delete if all wearable callbacks completed. - delete this; + link_inventory_item( gAgent.getID(), + item_id, + LLAppearanceMgr::instance().getCOF(), + itemp->getName(), + itemp->getDescription(), + LLAssetType::AT_LINK, + cb); } } +private: + LLWearableHoldingPattern* mHolder; + LLWearable *mWearable; + LLWearableType::EType mType; +}; + +void LLWearableHoldingPattern::recoverMissingWearable(LLWearableType::EType type) +{ + if (!isMostRecent()) + { + llwarns << "skipping because LLWearableHolding pattern is invalid (superceded by later outfit request)" << llendl; + } + + // Try to recover by replacing missing wearable with a new one. + LLNotificationsUtil::add("ReplacedMissingWearable"); + lldebugs << "Wearable " << LLWearableType::getTypeLabel(type) + << " could not be downloaded. Replaced inventory item with default wearable." << llendl; + LLWearable* wearable = LLWearableList::instance().createNewWearable(type); + + // Add a new one in the lost and found folder. + const LLUUID lost_and_found_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND); + LLPointer<LLInventoryCallback> cb = new RecoveredItemCB(type,wearable,this); + + create_inventory_item(gAgent.getID(), + gAgent.getSessionID(), + lost_and_found_id, + wearable->getTransactionID(), + wearable->getName(), + wearable->getDescription(), + wearable->getAssetType(), + LLInventoryType::IT_WEARABLE, + wearable->getType(), + wearable->getPermissions().getMaskNextOwner(), + cb); +} + +bool LLWearableHoldingPattern::isMissingCompleted() +{ + return mTypesToLink.size()==0 && mTypesToRecover.size()==0; +} + +void LLWearableHoldingPattern::clearCOFLinksForMissingWearables() +{ + for (found_list_t::iterator it = getFoundList().begin(); it != getFoundList().end(); ++it) + { + LLFoundData &data = *it; + if ((data.mWearableType < LLWearableType::WT_COUNT) && (!data.mWearable)) + { + // Wearable link that was never resolved; remove links to it from COF + llinfos << "removing link for unresolved item " << data.mItemID.asString() << llendl; + LLAppearanceMgr::instance().removeCOFItemLinks(data.mItemID,false); + } + } +} + +bool LLWearableHoldingPattern::pollMissingWearables() +{ + if (!isMostRecent()) + { + llwarns << "skipping because LLWearableHolding pattern is invalid (superceded by later outfit request)" << llendl; + } + + bool timed_out = isTimedOut(); + bool missing_completed = isMissingCompleted(); + bool done = timed_out || missing_completed; + + llinfos << "polling missing wearables, waiting for items " << mTypesToRecover.size() + << " links " << mTypesToLink.size() + << " wearables, timed out " << timed_out + << " elapsed " << mWaitTime.getElapsedTimeF32() + << " done " << done << llendl; + + if (done) + { + gAgentAvatarp->debugWearablesLoaded(); + + // BAP - if we don't call clearCOFLinksForMissingWearables() + // here, we won't have to add the link back in later if the + // wearable arrives late. This is to avoid corruption of + // wearable ordering info. Also has the effect of making + // unworn item links visible in the COF under some + // circumstances. + + //clearCOFLinksForMissingWearables(); + onAllComplete(); + } return done; } +// Handle wearables that arrived after the timeout period expired. +void LLWearableHoldingPattern::handleLateArrivals() +{ + // Only safe to run if we have previously finished the missing + // wearables and other processing - otherwise we could be in some + // intermediate state - but have not been superceded by a later + // outfit change request. + if (mLateArrivals.size() == 0) + { + // Nothing to process. + return; + } + if (!isMostRecent()) + { + llwarns << "Late arrivals not handled - outfit change no longer valid" << llendl; + } + if (!mIsAllComplete) + { + llwarns << "Late arrivals not handled - in middle of missing wearables processing" << llendl; + } + + llinfos << "Need to handle " << mLateArrivals.size() << " late arriving wearables" << llendl; + + // Update mFoundList using late-arriving wearables. + std::set<LLWearableType::EType> replaced_types; + for (LLWearableHoldingPattern::found_list_t::iterator iter = getFoundList().begin(); + iter != getFoundList().end(); ++iter) + { + LLFoundData& data = *iter; + for (std::set<LLWearable*>::iterator wear_it = mLateArrivals.begin(); + wear_it != mLateArrivals.end(); + ++wear_it) + { + LLWearable *wearable = *wear_it; + + if(wearable->getAssetID() == data.mAssetID) + { + data.mWearable = wearable; + + replaced_types.insert(data.mWearableType); + + // BAP - if we didn't call + // clearCOFLinksForMissingWearables() earlier, we + // don't need to restore the link here. Fixes + // wearable ordering problems. + + // LLAppearanceMgr::instance().addCOFItemLink(data.mItemID,false); + + // BAP failing this means inventory or asset server + // are corrupted in a way we don't handle. + llassert((data.mWearableType < LLWearableType::WT_COUNT) && (wearable->getType() == data.mWearableType)); + break; + } + } + } + + // Remove COF links for any default wearables previously used to replace the late arrivals. + // All this pussyfooting around with a while loop and explicit + // iterator incrementing is to allow removing items from the list + // without clobbering the iterator we're using to navigate. + LLWearableHoldingPattern::found_list_t::iterator iter = getFoundList().begin(); + while (iter != getFoundList().end()) + { + LLFoundData& data = *iter; + + // If an item of this type has recently shown up, removed the corresponding replacement wearable from COF. + if (data.mWearable && data.mIsReplacement && + replaced_types.find(data.mWearableType) != replaced_types.end()) + { + LLAppearanceMgr::instance().removeCOFItemLinks(data.mItemID,false); + std::list<LLFoundData>::iterator clobber_ator = iter; + ++iter; + getFoundList().erase(clobber_ator); + } + else + { + ++iter; + } + } + + // Clear contents of late arrivals. + mLateArrivals.clear(); + + // Update appearance based on mFoundList + LLAppearanceMgr::instance().updateAgentWearables(this, false); +} + +void LLWearableHoldingPattern::resetTime(F32 timeout) +{ + mWaitTime.reset(); + mWaitTime.setTimerExpirySec(timeout); +} + +void LLWearableHoldingPattern::onWearableAssetFetch(LLWearable *wearable) +{ + if (!isMostRecent()) + { + llwarns << "skipping because LLWearableHolding pattern is invalid (superceded by later outfit request)" << llendl; + } + + mResolved += 1; // just counting callbacks, not successes. + llinfos << "onWearableAssetFetch, resolved count " << mResolved << " of requested " << getFoundList().size() << llendl; + if (wearable) + { + llinfos << "wearable found, type " << wearable->getType() << " asset " << wearable->getAssetID() << llendl; + } + else + { + llwarns << "no wearable found" << llendl; + } + + if (mFired) + { + llwarns << "called after holder fired" << llendl; + if (wearable) + { + mLateArrivals.insert(wearable); + if (mIsAllComplete) + { + handleLateArrivals(); + } + } + return; + } + + if (!wearable) + { + return; + } + + for (LLWearableHoldingPattern::found_list_t::iterator iter = getFoundList().begin(); + iter != getFoundList().end(); ++iter) + { + LLFoundData& data = *iter; + if(wearable->getAssetID() == data.mAssetID) + { + data.mWearable = wearable; + // Failing this means inventory or asset server are corrupted in a way we don't handle. + llassert((data.mWearableType < LLWearableType::WT_COUNT) && (wearable->getType() == data.mWearableType)); + break; + } + } +} + +static void onWearableAssetFetch(LLWearable* wearable, void* data) +{ + LLWearableHoldingPattern* holder = (LLWearableHoldingPattern*)data; + holder->onWearableAssetFetch(wearable); +} + + static void removeDuplicateItems(LLInventoryModel::item_array_t& items) { LLInventoryModel::item_array_t new_items; @@ -438,37 +852,13 @@ static void removeDuplicateItems(LLInventoryModel::item_array_t& items) items = new_items; } -static void onWearableAssetFetch(LLWearable* wearable, void* data) -{ - LLWearableHoldingPattern* holder = (LLWearableHoldingPattern*)data; - if (holder->mFired) - { - llwarns << "called after holder fired" << llendl; - } - - if(wearable) - { - for (LLWearableHoldingPattern::found_list_t::iterator iter = holder->mFoundList.begin(); - iter != holder->mFoundList.end(); ++iter) - { - LLFoundData& data = *iter; - if(wearable->getAssetID() == data.mAssetID) - { - data.mWearable = wearable; - break; - } - } - } - holder->mResolved += 1; -} - -const LLUUID LLAppearanceManager::getCOF() const +const LLUUID LLAppearanceMgr::getCOF() const { return gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT); } -const LLViewerInventoryItem* LLAppearanceManager::getBaseOutfitLink() +const LLViewerInventoryItem* LLAppearanceMgr::getBaseOutfitLink() { const LLUUID& current_outfit_cat = getCOF(); LLInventoryModel::cat_array_t cat_array; @@ -490,13 +880,20 @@ const LLViewerInventoryItem* LLAppearanceManager::getBaseOutfitLink() const LLViewerInventoryCategory *cat = item->getLinkedCategory(); if (cat && cat->getPreferredType() == LLFolderType::FT_OUTFIT) { + const LLUUID parent_id = cat->getParentUUID(); + LLViewerInventoryCategory* parent_cat = gInventory.getCategory(parent_id); + // if base outfit moved to trash it means that we don't have base outfit + if (parent_cat != NULL && parent_cat->getPreferredType() == LLFolderType::FT_TRASH) + { + return NULL; + } return item; } } return NULL; } -bool LLAppearanceManager::getBaseOutfitName(std::string& name) +bool LLAppearanceMgr::getBaseOutfitName(std::string& name) { const LLViewerInventoryItem* outfit_link = getBaseOutfitLink(); if(outfit_link) @@ -511,59 +908,360 @@ bool LLAppearanceManager::getBaseOutfitName(std::string& name) return false; } +const LLUUID LLAppearanceMgr::getBaseOutfitUUID() +{ + const LLViewerInventoryItem* outfit_link = getBaseOutfitLink(); + if (!outfit_link || !outfit_link->getIsLinkType()) return LLUUID::null; + + const LLViewerInventoryCategory* outfit_cat = outfit_link->getLinkedCategory(); + if (!outfit_cat) return LLUUID::null; + + if (outfit_cat->getPreferredType() != LLFolderType::FT_OUTFIT) + { + llwarns << "Expected outfit type:" << LLFolderType::FT_OUTFIT << " but got type:" << outfit_cat->getType() << " for folder name:" << outfit_cat->getName() << llendl; + return LLUUID::null; + } + + return outfit_cat->getUUID(); +} + +bool LLAppearanceMgr::wearItemOnAvatar(const LLUUID& item_id_to_wear, bool do_update, bool replace) +{ + if (item_id_to_wear.isNull()) return false; + + // *TODO: issue with multi-wearable should be fixed: + // in this case this method will be called N times - loading started for each item + // and than N times will be called - loading completed for each item. + // That means subscribers will be notified that loading is done after first item in a batch is worn. + // (loading indicator disappears for example before all selected items are worn) + // Have not fix this issue for 2.1 because of stability reason. EXT-7777. + gAgentWearables.notifyLoadingStarted(); + + LLViewerInventoryItem* item_to_wear = gInventory.getItem(item_id_to_wear); + if (!item_to_wear) return false; + + if (gInventory.isObjectDescendentOf(item_to_wear->getUUID(), gInventory.getLibraryRootFolderID())) + { + LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback(replace); + copy_inventory_item(gAgent.getID(), item_to_wear->getPermissions().getOwner(), item_to_wear->getUUID(), LLUUID::null, std::string(),cb); + return false; + } + else if (!gInventory.isObjectDescendentOf(item_to_wear->getUUID(), gInventory.getRootFolderID())) + { + return false; // not in library and not in agent's inventory + } + else if (gInventory.isObjectDescendentOf(item_to_wear->getUUID(), gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH))) + { + LLNotificationsUtil::add("CannotWearTrash"); + return false; + } + + switch (item_to_wear->getType()) + { + case LLAssetType::AT_CLOTHING: + if (gAgentWearables.areWearablesLoaded()) + { + S32 wearable_count = gAgentWearables.getWearableCount(item_to_wear->getWearableType()); + if ((replace && wearable_count != 0) || + (wearable_count >= LLAgentWearables::MAX_CLOTHING_PER_TYPE) ) + { + removeCOFItemLinks(gAgentWearables.getWearableItemID(item_to_wear->getWearableType(), wearable_count-1), false); + } + } + case LLAssetType::AT_BODYPART: + // Don't wear anything until initial wearables are loaded, can + // destroy clothing items. + if (!gAgentWearables.areWearablesLoaded()) + { + LLNotificationsUtil::add("CanNotChangeAppearanceUntilLoaded"); + return false; + } + + // Remove the existing wearables of the same type. + // Remove existing body parts anyway because we must not be able to wear e.g. two skins. + if (item_to_wear->getType() == LLAssetType::AT_BODYPART) + { + removeCOFLinksOfType(item_to_wear->getWearableType(), false); + } + + addCOFItemLink(item_to_wear, do_update); + break; + case LLAssetType::AT_OBJECT: + rez_attachment(item_to_wear, NULL); + break; + default: return false;; + } + + return true; +} + // Update appearance from outfit folder. -void LLAppearanceManager::changeOutfit(bool proceed, const LLUUID& category, bool append) +void LLAppearanceMgr::changeOutfit(bool proceed, const LLUUID& category, bool append) { if (!proceed) return; - LLAppearanceManager::instance().updateCOF(category,append); + LLAppearanceMgr::instance().updateCOF(category,append); } -void LLAppearanceManager::shallowCopyCategory(const LLUUID& src_id, const LLUUID& dst_id, - LLPointer<LLInventoryCallback> cb) +void LLAppearanceMgr::replaceCurrentOutfit(const LLUUID& new_outfit) +{ + LLViewerInventoryCategory* cat = gInventory.getCategory(new_outfit); + wearInventoryCategory(cat, false, false); +} + +// Open outfit renaming dialog. +void LLAppearanceMgr::renameOutfit(const LLUUID& outfit_id) +{ + LLViewerInventoryCategory* cat = gInventory.getCategory(outfit_id); + if (!cat) + { + return; + } + + LLSD args; + args["NAME"] = cat->getName(); + + LLSD payload; + payload["cat_id"] = outfit_id; + + LLNotificationsUtil::add("RenameOutfit", args, payload, boost::bind(onOutfitRename, _1, _2)); +} + +// User typed new outfit name. +// static +void LLAppearanceMgr::onOutfitRename(const LLSD& notification, const LLSD& response) +{ + S32 option = LLNotificationsUtil::getSelectedOption(notification, response); + if (option != 0) return; // canceled + + std::string outfit_name = response["new_name"].asString(); + LLStringUtil::trim(outfit_name); + if (!outfit_name.empty()) + { + LLUUID cat_id = notification["payload"]["cat_id"].asUUID(); + rename_category(&gInventory, cat_id, outfit_name); + } +} + +void LLAppearanceMgr::setOutfitLocked(bool locked) +{ + if (mOutfitLocked == locked) + { + return; + } + + mOutfitLocked = locked; + if (locked) + { + mUnlockOutfitTimer->reset(); + mUnlockOutfitTimer->start(); + } + else + { + mUnlockOutfitTimer->stop(); + } + + LLOutfitObserver::instance().notifyOutfitLockChanged(); +} + +void LLAppearanceMgr::addCategoryToCurrentOutfit(const LLUUID& cat_id) +{ + LLViewerInventoryCategory* cat = gInventory.getCategory(cat_id); + wearInventoryCategory(cat, false, true); +} + +void LLAppearanceMgr::takeOffOutfit(const LLUUID& cat_id) { LLInventoryModel::cat_array_t cats; LLInventoryModel::item_array_t items; - gInventory.collectDescendents(src_id, cats, items, - LLInventoryModel::EXCLUDE_TRASH); - for (S32 i = 0; i < items.count(); ++i) + LLFindWearablesEx collector(/*is_worn=*/ true, /*include_body_parts=*/ false); + + gInventory.collectDescendentsIf(cat_id, cats, items, FALSE, collector); + + LLInventoryModel::item_array_t::const_iterator it = items.begin(); + const LLInventoryModel::item_array_t::const_iterator it_end = items.end(); + for( ; it_end != it; ++it) { - const LLViewerInventoryItem* item = items.get(i).get(); - if (item->getActualType() == LLAssetType::AT_LINK) - { - link_inventory_item(gAgent.getID(), - item->getLinkedUUID(), - dst_id, - item->getName(), - LLAssetType::AT_LINK, cb); - } - else if (item->getActualType() == LLAssetType::AT_LINK_FOLDER) + LLViewerInventoryItem* item = *it; + removeItemFromAvatar(item->getUUID()); + } +} + +// Create a copy of src_id + contents as a subfolder of dst_id. +void LLAppearanceMgr::shallowCopyCategory(const LLUUID& src_id, const LLUUID& dst_id, + LLPointer<LLInventoryCallback> cb) +{ + LLInventoryCategory *src_cat = gInventory.getCategory(src_id); + if (!src_cat) + { + llwarns << "folder not found for src " << src_id.asString() << llendl; + return; + } + llinfos << "starting, src_id " << src_id << " name " << src_cat->getName() << " dst_id " << dst_id << llendl; + LLUUID parent_id = dst_id; + if(parent_id.isNull()) + { + parent_id = gInventory.getRootFolderID(); + } + LLUUID subfolder_id = gInventory.createNewCategory( parent_id, + LLFolderType::FT_NONE, + src_cat->getName()); + shallowCopyCategoryContents(src_id, subfolder_id, cb); + + gInventory.notifyObservers(); +} + +// Copy contents of src_id to dst_id. +void LLAppearanceMgr::shallowCopyCategoryContents(const LLUUID& src_id, const LLUUID& dst_id, + LLPointer<LLInventoryCallback> cb) +{ + LLInventoryModel::cat_array_t* cats; + LLInventoryModel::item_array_t* items; + gInventory.getDirectDescendentsOf(src_id, cats, items); + llinfos << "copying " << items->count() << " items" << llendl; + for (LLInventoryModel::item_array_t::const_iterator iter = items->begin(); + iter != items->end(); + ++iter) + { + const LLViewerInventoryItem* item = (*iter); + switch (item->getActualType()) { - LLViewerInventoryCategory *catp = item->getLinkedCategory(); - // Skip copying outfit links. - if (catp && catp->getPreferredType() != LLFolderType::FT_OUTFIT) + case LLAssetType::AT_LINK: { + //LLInventoryItem::getDescription() is used for a new description + //to propagate ordering information saved in descriptions of links link_inventory_item(gAgent.getID(), item->getLinkedUUID(), dst_id, item->getName(), - LLAssetType::AT_LINK_FOLDER, cb); + item->LLInventoryItem::getDescription(), + LLAssetType::AT_LINK, cb); + break; + } + case LLAssetType::AT_LINK_FOLDER: + { + LLViewerInventoryCategory *catp = item->getLinkedCategory(); + // Skip copying outfit links. + if (catp && catp->getPreferredType() != LLFolderType::FT_OUTFIT) + { + link_inventory_item(gAgent.getID(), + item->getLinkedUUID(), + dst_id, + item->getName(), + item->getDescription(), + LLAssetType::AT_LINK_FOLDER, cb); + } + break; + } + case LLAssetType::AT_CLOTHING: + case LLAssetType::AT_OBJECT: + case LLAssetType::AT_BODYPART: + case LLAssetType::AT_GESTURE: + { + llinfos << "copying inventory item " << item->getName() << llendl; + copy_inventory_item(gAgent.getID(), + item->getPermissions().getOwner(), + item->getUUID(), + dst_id, + item->getName(), + cb); + break; } + default: + // Ignore non-outfit asset types + break; } - else + } +} + +BOOL LLAppearanceMgr::getCanMakeFolderIntoOutfit(const LLUUID& folder_id) +{ + // These are the wearable items that are required for considering this + // folder as containing a complete outfit. + U32 required_wearables = 0; + required_wearables |= 1LL << LLWearableType::WT_SHAPE; + required_wearables |= 1LL << LLWearableType::WT_SKIN; + required_wearables |= 1LL << LLWearableType::WT_HAIR; + required_wearables |= 1LL << LLWearableType::WT_EYES; + + // These are the wearables that the folder actually contains. + U32 folder_wearables = 0; + LLInventoryModel::cat_array_t* cats; + LLInventoryModel::item_array_t* items; + gInventory.getDirectDescendentsOf(folder_id, cats, items); + for (LLInventoryModel::item_array_t::const_iterator iter = items->begin(); + iter != items->end(); + ++iter) + { + const LLViewerInventoryItem* item = (*iter); + if (item->isWearableType()) { - copy_inventory_item( - gAgent.getID(), - item->getPermissions().getOwner(), - item->getUUID(), - dst_id, - item->getName(), - cb); + const LLWearableType::EType wearable_type = item->getWearableType(); + folder_wearables |= 1LL << wearable_type; } } + + // If the folder contains the required wearables, return TRUE. + return ((required_wearables & folder_wearables) == required_wearables); +} + +bool LLAppearanceMgr::getCanRemoveOutfit(const LLUUID& outfit_cat_id) +{ + // Disallow removing the base outfit. + if (outfit_cat_id == getBaseOutfitUUID()) + { + return false; + } + + // Check if the outfit folder itself is removable. + if (!get_is_category_removable(&gInventory, outfit_cat_id)) + { + return false; + } + + // Check for the folder's non-removable descendants. + LLFindNonRemovableObjects filter_non_removable; + LLInventoryModel::cat_array_t cats; + LLInventoryModel::item_array_t items; + LLInventoryModel::item_array_t::const_iterator it; + gInventory.collectDescendentsIf(outfit_cat_id, cats, items, false, filter_non_removable); + if (!cats.empty() || !items.empty()) + { + return false; + } + + return true; } -void LLAppearanceManager::purgeBaseOutfitLink(const LLUUID& category) +// static +bool LLAppearanceMgr::getCanRemoveFromCOF(const LLUUID& outfit_cat_id) +{ + LLInventoryModel::cat_array_t cats; + LLInventoryModel::item_array_t items; + LLFindWearablesEx is_worn(/*is_worn=*/ true, /*include_body_parts=*/ false); + gInventory.collectDescendentsIf(outfit_cat_id, + cats, + items, + LLInventoryModel::EXCLUDE_TRASH, + is_worn); + return items.size() > 0; +} + +// static +bool LLAppearanceMgr::getCanAddToCOF(const LLUUID& outfit_cat_id) +{ + LLInventoryModel::cat_array_t cats; + LLInventoryModel::item_array_t items; + LLFindWearablesEx not_worn(/*is_worn=*/ false, /*include_body_parts=*/ false); + gInventory.collectDescendentsIf(outfit_cat_id, + cats, + items, + LLInventoryModel::EXCLUDE_TRASH, + not_worn); + return items.size() > 0; +} + +void LLAppearanceMgr::purgeBaseOutfitLink(const LLUUID& category) { LLInventoryModel::cat_array_t cats; LLInventoryModel::item_array_t items; @@ -585,7 +1283,7 @@ void LLAppearanceManager::purgeBaseOutfitLink(const LLUUID& category) } } -void LLAppearanceManager::purgeCategory(const LLUUID& category, bool keep_outfit_links) +void LLAppearanceMgr::purgeCategory(const LLUUID& category, bool keep_outfit_links) { LLInventoryModel::cat_array_t cats; LLInventoryModel::item_array_t items; @@ -605,24 +1303,16 @@ void LLAppearanceManager::purgeCategory(const LLUUID& category, bool keep_outfit // Keep the last N wearables of each type. For viewer 2.0, N is 1 for // both body parts and clothing items. -void LLAppearanceManager::filterWearableItems( +void LLAppearanceMgr::filterWearableItems( LLInventoryModel::item_array_t& items, S32 max_per_type) { // Divvy items into arrays by wearable type. - std::vector<LLInventoryModel::item_array_t> items_by_type(WT_COUNT); - for (S32 i=0; i<items.count(); i++) - { - LLViewerInventoryItem *item = items.get(i); - // Ignore non-wearables. - if (!item->isWearableType()) - continue; - EWearableType type = item->getWearableType(); - items_by_type[type].push_back(item); - } + std::vector<LLInventoryModel::item_array_t> items_by_type(LLWearableType::WT_COUNT); + divvyWearablesByType(items, items_by_type); // rebuild items list, retaining the last max_per_type of each array items.clear(); - for (S32 i=0; i<WT_COUNT; i++) + for (S32 i=0; i<LLWearableType::WT_COUNT; i++) { S32 size = items_by_type[i].size(); if (size <= 0) @@ -636,7 +1326,7 @@ void LLAppearanceManager::filterWearableItems( } // Create links to all listed items. -void LLAppearanceManager::linkAll(const LLUUID& category, +void LLAppearanceMgr::linkAll(const LLUUID& cat_uuid, LLInventoryModel::item_array_t& items, LLPointer<LLInventoryCallback> cb) { @@ -645,15 +1335,25 @@ void LLAppearanceManager::linkAll(const LLUUID& category, const LLInventoryItem* item = items.get(i).get(); link_inventory_item(gAgent.getID(), item->getLinkedUUID(), - category, + cat_uuid, item->getName(), + item->LLInventoryItem::getDescription(), LLAssetType::AT_LINK, cb); + + const LLViewerInventoryCategory *cat = gInventory.getCategory(cat_uuid); + const std::string cat_name = cat ? cat->getName() : "CAT NOT FOUND"; +#ifndef LL_RELEASE_FOR_DOWNLOAD + llinfos << "Linking Item [ name:" << item->getName() << " UUID:" << item->getUUID() << " ] to Category [ name:" << cat_name << " UUID:" << cat_uuid << " ] " << llendl; +#endif } } -void LLAppearanceManager::updateCOF(const LLUUID& category, bool append) +void LLAppearanceMgr::updateCOF(const LLUUID& category, bool append) { + LLViewerInventoryCategory *pcat = gInventory.getCategory(category); + llinfos << "starting, cat " << (pcat ? pcat->getName() : "[UNKNOWN]") << llendl; + const LLUUID cof = getCOF(); // Deactivate currently active gestures in the COF, if replacing outfit @@ -664,9 +1364,9 @@ void LLAppearanceManager::updateCOF(const LLUUID& category, bool append) for(S32 i = 0; i < gest_items.count(); ++i) { LLViewerInventoryItem *gest_item = gest_items.get(i); - if ( LLGestureManager::instance().isGestureActive( gest_item->getLinkedUUID()) ) + if ( LLGestureMgr::instance().isGestureActive( gest_item->getLinkedUUID()) ) { - LLGestureManager::instance().deactivateGesture( gest_item->getLinkedUUID() ); + LLGestureMgr::instance().deactivateGesture( gest_item->getLinkedUUID() ); } } } @@ -675,9 +1375,12 @@ void LLAppearanceManager::updateCOF(const LLUUID& category, bool append) // - Body parts: always include COF contents as a fallback in case any // required parts are missing. + // Preserve body parts from COF if appending. LLInventoryModel::item_array_t body_items; getDescendentsOfAssetType(cof, body_items, LLAssetType::AT_BODYPART, false); getDescendentsOfAssetType(category, body_items, LLAssetType::AT_BODYPART, false); + if (append) + reverse(body_items.begin(), body_items.end()); // Reduce body items to max of one per type. removeDuplicateItems(body_items); filterWearableItems(body_items, 1); @@ -689,7 +1392,7 @@ void LLAppearanceManager::updateCOF(const LLUUID& category, bool append) getDescendentsOfAssetType(category, wear_items, LLAssetType::AT_CLOTHING, false); // Reduce wearables to max of one per type. removeDuplicateItems(wear_items); - filterWearableItems(wear_items, 1); + filterWearableItems(wear_items, LLAgentWearables::MAX_CLOTHING_PER_TYPE); // - Attachments: include COF contents only if appending. LLInventoryModel::item_array_t obj_items; @@ -711,11 +1414,27 @@ void LLAppearanceManager::updateCOF(const LLUUID& category, bool append) gInventory.notifyObservers(); // Create links to new COF contents. + llinfos << "creating LLUpdateAppearanceOnDestroy" << llendl; LLPointer<LLInventoryCallback> link_waiter = new LLUpdateAppearanceOnDestroy; +#ifndef LL_RELEASE_FOR_DOWNLOAD + llinfos << "Linking body items" << llendl; +#endif linkAll(cof, body_items, link_waiter); + +#ifndef LL_RELEASE_FOR_DOWNLOAD + llinfos << "Linking wear items" << llendl; +#endif linkAll(cof, wear_items, link_waiter); + +#ifndef LL_RELEASE_FOR_DOWNLOAD + llinfos << "Linking obj items" << llendl; +#endif linkAll(cof, obj_items, link_waiter); + +#ifndef LL_RELEASE_FOR_DOWNLOAD + llinfos << "Linking gesture items" << llendl; +#endif linkAll(cof, gest_items, link_waiter); // Add link to outfit if category is an outfit. @@ -723,9 +1442,10 @@ void LLAppearanceManager::updateCOF(const LLUUID& category, bool append) { createBaseOutfitLink(category, link_waiter); } + llinfos << "waiting for LLUpdateAppearanceOnDestroy" << llendl; } -void LLAppearanceManager::updatePanelOutfitName(const std::string& name) +void LLAppearanceMgr::updatePanelOutfitName(const std::string& name) { LLSidepanelAppearance* panel_appearance = dynamic_cast<LLSidepanelAppearance *>(LLSideTray::getInstance()->getPanel("sidepanel_appearance")); @@ -735,7 +1455,7 @@ void LLAppearanceManager::updatePanelOutfitName(const std::string& name) } } -void LLAppearanceManager::createBaseOutfitLink(const LLUUID& category, LLPointer<LLInventoryCallback> link_waiter) +void LLAppearanceMgr::createBaseOutfitLink(const LLUUID& category, LLPointer<LLInventoryCallback> link_waiter) { const LLUUID cof = getCOF(); LLViewerInventoryCategory* catp = gInventory.getCategory(category); @@ -745,7 +1465,7 @@ void LLAppearanceManager::createBaseOutfitLink(const LLUUID& category, LLPointer if (catp && catp->getPreferredType() == LLFolderType::FT_OUTFIT) { - link_inventory_item(gAgent.getID(), category, cof, catp->getName(), + link_inventory_item(gAgent.getID(), category, cof, catp->getName(), "", LLAssetType::AT_LINK_FOLDER, link_waiter); new_outfit_name = catp->getName(); } @@ -753,31 +1473,28 @@ void LLAppearanceManager::createBaseOutfitLink(const LLUUID& category, LLPointer updatePanelOutfitName(new_outfit_name); } -void LLAppearanceManager::updateAgentWearables(LLWearableHoldingPattern* holder, bool append) +void LLAppearanceMgr::updateAgentWearables(LLWearableHoldingPattern* holder, bool append) { lldebugs << "updateAgentWearables()" << llendl; LLInventoryItem::item_array_t items; LLDynamicArray< LLWearable* > wearables; - // For each wearable type, find the first instance in the category - // that we recursed through. - for( S32 i = 0; i < WT_COUNT; i++ ) + // For each wearable type, find the wearables of that type. + for( S32 i = 0; i < LLWearableType::WT_COUNT; i++ ) { - for (LLWearableHoldingPattern::found_list_t::iterator iter = holder->mFoundList.begin(); - iter != holder->mFoundList.end(); ++iter) + for (LLWearableHoldingPattern::found_list_t::iterator iter = holder->getFoundList().begin(); + iter != holder->getFoundList().end(); ++iter) { LLFoundData& data = *iter; LLWearable* wearable = data.mWearable; if( wearable && ((S32)wearable->getType() == i) ) { - LLViewerInventoryItem* item; - item = (LLViewerInventoryItem*)gInventory.getItem(data.mItemID); + LLViewerInventoryItem* item = (LLViewerInventoryItem*)gInventory.getItem(data.mItemID); if( item && (item->getAssetUUID() == wearable->getAssetID()) ) { items.put(item); wearables.put(wearable); } - break; } } } @@ -790,10 +1507,44 @@ void LLAppearanceManager::updateAgentWearables(LLWearableHoldingPattern* holder, // dec_busy_count(); } -void LLAppearanceManager::updateAppearanceFromCOF() +static void remove_non_link_items(LLInventoryModel::item_array_t &items) +{ + LLInventoryModel::item_array_t pruned_items; + for (LLInventoryModel::item_array_t::const_iterator iter = items.begin(); + iter != items.end(); + ++iter) + { + const LLViewerInventoryItem *item = (*iter); + if (item && item->getIsLinkType()) + { + pruned_items.push_back((*iter)); + } + } + items = pruned_items; +} + +//a predicate for sorting inventory items by actual descriptions +bool sort_by_description(const LLInventoryItem* item1, const LLInventoryItem* item2) { + if (!item1 || !item2) + { + llwarning("either item1 or item2 is NULL", 0); + return true; + } + + return item1->LLInventoryItem::getDescription() < item2->LLInventoryItem::getDescription(); +} + +void LLAppearanceMgr::updateAppearanceFromCOF() +{ + //checking integrity of the COF in terms of ordering of wearables, + //checking and updating links' descriptions of wearables in the COF (before analyzed for "dirty" state) + updateClothingOrderingInfo(); + // update dirty flag to see if the state of the COF matches // the saved outfit stored as a folder link + llinfos << "starting" << llendl; + updateIsDirty(); dumpCat(getCOF(),"COF, start"); @@ -801,59 +1552,83 @@ void LLAppearanceManager::updateAppearanceFromCOF() bool follow_folder_links = true; LLUUID current_outfit_id = getCOF(); - // Find all the wearables that are in the COF's subtree. - lldebugs << "LLAppearanceManager::updateFromCOF()" << llendl; + // Find all the wearables that are in the COF's subtree. + lldebugs << "LLAppearanceMgr::updateFromCOF()" << llendl; LLInventoryModel::item_array_t wear_items; LLInventoryModel::item_array_t obj_items; LLInventoryModel::item_array_t gest_items; getUserDescendents(current_outfit_id, wear_items, obj_items, gest_items, follow_folder_links); - + // Get rid of non-links in case somehow the COF was corrupted. + remove_non_link_items(wear_items); + remove_non_link_items(obj_items); + remove_non_link_items(gest_items); + if(!wear_items.count()) { LLNotificationsUtil::add("CouldNotPutOnOutfit"); return; } + //preparing the list of wearables in the correct order for LLAgentWearables + sortItemsByActualDescription(wear_items); + + LLWearableHoldingPattern* holder = new LLWearableHoldingPattern; - holder->mObjItems = obj_items; - holder->mGestItems = gest_items; + holder->setObjItems(obj_items); + holder->setGestItems(gest_items); // Note: can't do normal iteration, because if all the // wearables can be resolved immediately, then the // callback will be called (and this object deleted) // before the final getNextData(). - LLDynamicArray<LLFoundData> found_container; + for(S32 i = 0; i < wear_items.count(); ++i) { LLViewerInventoryItem *item = wear_items.get(i); LLViewerInventoryItem *linked_item = item ? item->getLinkedItem() : NULL; - if (item && linked_item) + + // Fault injection: use debug setting to test asset + // fetch failures (should be replaced by new defaults in + // lost&found). + U32 skip_type = gSavedSettings.getU32("ForceAssetFail"); + + if (item && item->getIsLinkType() && linked_item) { LLFoundData found(linked_item->getUUID(), linked_item->getAssetUUID(), linked_item->getName(), - linked_item->getType()); - holder->mFoundList.push_front(found); - found_container.put(found); + linked_item->getType(), + linked_item->isWearableType() ? linked_item->getWearableType() : LLWearableType::WT_INVALID + ); + + if (skip_type != LLWearableType::WT_INVALID && skip_type == found.mWearableType) + { + found.mAssetID.generate(); // Replace with new UUID, guaranteed not to exist in DB + } + //pushing back, not front, to preserve order of wearables for LLAgentWearables + holder->getFoundList().push_back(found); } else { if (!item) { - llwarns << "attempt to wear a null item " << llendl; + llwarns << "Attempt to wear a null item " << llendl; } else if (!linked_item) { - llwarns << "attempt to wear a broken link " << item->getName() << llendl; + llwarns << "Attempt to wear a broken link [ name:" << item->getName() << " ] " << llendl; } } } - for(S32 i = 0; i < found_container.count(); ++i) + for (LLWearableHoldingPattern::found_list_t::iterator it = holder->getFoundList().begin(); + it != holder->getFoundList().end(); ++it) { - LLFoundData& found = found_container.get(i); - + LLFoundData& found = *it; + + llinfos << "waiting for onWearableAssetFetch callback, asset " << found.mAssetID.asString() << llendl; + // Fetch the wearables about to be worn. LLWearableList::instance().getAsset(found.mAssetID, found.mName, @@ -863,14 +1638,14 @@ void LLAppearanceManager::updateAppearanceFromCOF() } - if (!holder->pollCompletion()) + holder->resetTime(gSavedSettings.getF32("MaxWearableWaitTime")); + if (!holder->pollFetchCompletion()) { - doOnIdleRepeating(boost::bind(&LLWearableHoldingPattern::pollCompletion,holder)); + doOnIdleRepeating(boost::bind(&LLWearableHoldingPattern::pollFetchCompletion,holder)); } - } -void LLAppearanceManager::getDescendentsOfAssetType(const LLUUID& category, +void LLAppearanceMgr::getDescendentsOfAssetType(const LLUUID& category, LLInventoryModel::item_array_t& items, LLAssetType::EType type, bool follow_folder_links) @@ -885,7 +1660,7 @@ void LLAppearanceManager::getDescendentsOfAssetType(const LLUUID& category, follow_folder_links); } -void LLAppearanceManager::getUserDescendents(const LLUUID& category, +void LLAppearanceMgr::getUserDescendents(const LLUUID& category, LLInventoryModel::item_array_t& wear_items, LLInventoryModel::item_array_t& obj_items, LLInventoryModel::item_array_t& gest_items, @@ -920,56 +1695,117 @@ void LLAppearanceManager::getUserDescendents(const LLUUID& category, follow_folder_links); } -void LLAppearanceManager::wearInventoryCategory(LLInventoryCategory* category, bool copy, bool append) +void LLAppearanceMgr::wearInventoryCategory(LLInventoryCategory* category, bool copy, bool append) { + gAgentWearables.notifyLoadingStarted(); if(!category) return; - lldebugs << "wearInventoryCategory( " << category->getName() + llinfos << "wearInventoryCategory( " << category->getName() << " )" << llendl; - // What we do here is get the complete information on the items in - // the inventory, and set up an observer that will wait for that to - // happen. - LLOutfitFetch* outfit_fetcher = new LLOutfitFetch(copy, append); - LLInventoryFetchDescendentsObserver::folder_ref_t folders; - folders.push_back(category->getUUID()); - outfit_fetcher->fetchDescendents(folders); - //inc_busy_count(); - if(outfit_fetcher->isEverythingComplete()) + + callAfterCategoryFetch(category->getUUID(),boost::bind(&LLAppearanceMgr::wearCategoryFinal, + &LLAppearanceMgr::instance(), + category->getUUID(), copy, append)); +} + +void LLAppearanceMgr::wearCategoryFinal(LLUUID& cat_id, bool copy_items, bool append) +{ + llinfos << "starting" << llendl; + + // We now have an outfit ready to be copied to agent inventory. Do + // it, and wear that outfit normally. + LLInventoryCategory* cat = gInventory.getCategory(cat_id); + if(copy_items) { - // everything is already here - call done. - outfit_fetcher->done(); + LLInventoryModel::cat_array_t* cats; + LLInventoryModel::item_array_t* items; + gInventory.getDirectDescendentsOf(cat_id, cats, items); + std::string name; + if(!cat) + { + // should never happen. + name = "New Outfit"; + } + else + { + name = cat->getName(); + } + LLViewerInventoryItem* item = NULL; + LLInventoryModel::item_array_t::const_iterator it = items->begin(); + LLInventoryModel::item_array_t::const_iterator end = items->end(); + LLUUID pid; + for(; it < end; ++it) + { + item = *it; + if(item) + { + if(LLInventoryType::IT_GESTURE == item->getInventoryType()) + { + pid = gInventory.findCategoryUUIDForType(LLFolderType::FT_GESTURE); + } + else + { + pid = gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING); + } + break; + } + } + if(pid.isNull()) + { + pid = gInventory.getRootFolderID(); + } + + LLUUID new_cat_id = gInventory.createNewCategory( + pid, + LLFolderType::FT_NONE, + name); + LLPointer<LLInventoryCallback> cb = new LLWearInventoryCategoryCallback(new_cat_id, append); + it = items->begin(); + for(; it < end; ++it) + { + item = *it; + if(item) + { + copy_inventory_item( + gAgent.getID(), + item->getPermissions().getOwner(), + item->getUUID(), + new_cat_id, + std::string(), + cb); + } + } + // BAP fixes a lag in display of created dir. + gInventory.notifyObservers(); } else { - // it's all on it's way - add an observer, and the inventory - // will call done for us when everything is here. - gInventory.addObserver(outfit_fetcher); + // Wear the inventory category. + LLAppearanceMgr::instance().wearInventoryCategoryOnAvatar(cat, append); } } // *NOTE: hack to get from avatar inventory to avatar -void LLAppearanceManager::wearInventoryCategoryOnAvatar( LLInventoryCategory* category, bool append ) +void LLAppearanceMgr::wearInventoryCategoryOnAvatar( LLInventoryCategory* category, bool append ) { // Avoid unintentionally overwriting old wearables. We have to do // this up front to avoid having to deal with the case of multiple // wearables being dirty. if(!category) return; - lldebugs << "wearInventoryCategoryOnAvatar( " << category->getName() + + llinfos << "wearInventoryCategoryOnAvatar( " << category->getName() << " )" << llendl; - if( gFloaterCustomize ) + if (gAgentCamera.cameraCustomizeAvatar()) { - gFloaterCustomize->askToSaveIfDirty(boost::bind(&LLAppearanceManager::changeOutfit, - &LLAppearanceManager::instance(), - _1, category->getUUID(), append)); - } - else - { - LLAppearanceManager::changeOutfit(TRUE, category->getUUID(), append); + // switching to outfit editor should automagically save any currently edited wearable + LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD().with("type", "edit_outfit")); } + + LLAppearanceMgr::changeOutfit(TRUE, category->getUUID(), append); } -void LLAppearanceManager::wearOutfitByName(const std::string& name) +void LLAppearanceMgr::wearOutfitByName(const std::string& name) { llinfos << "Wearing category " << name << llendl; //inc_busy_count(); @@ -1005,7 +1841,7 @@ void LLAppearanceManager::wearOutfitByName(const std::string& name) if(cat) { - LLAppearanceManager::wearInventoryCategory(cat, copy_items, false); + LLAppearanceMgr::wearInventoryCategory(cat, copy_items, false); } else { @@ -1041,7 +1877,7 @@ public: if (item) { gInventory.removeObserver(this); - LLAppearanceManager::instance().addCOFItemLink(item,mDoUpdate); + LLAppearanceMgr::instance().addCOFItemLink(item,mDoUpdate); delete this; } } @@ -1052,7 +1888,9 @@ private: }; -void LLAppearanceManager::addCOFItemLink(const LLUUID &item_id, bool do_update ) +// BAP - note that this runs asynchronously if the item is not already loaded from inventory. +// Dangerous if caller assumes link will exist after calling the function. +void LLAppearanceMgr::addCOFItemLink(const LLUUID &item_id, bool do_update ) { const LLInventoryItem *item = gInventory.getItem(item_id); if (!item) @@ -1066,7 +1904,7 @@ void LLAppearanceManager::addCOFItemLink(const LLUUID &item_id, bool do_update ) } } -void LLAppearanceManager::addCOFItemLink(const LLInventoryItem *item, bool do_update ) +void LLAppearanceMgr::addCOFItemLink(const LLInventoryItem *item, bool do_update ) { const LLViewerInventoryItem *vitem = dynamic_cast<const LLViewerInventoryItem*>(item); if (!vitem) @@ -1079,52 +1917,69 @@ void LLAppearanceManager::addCOFItemLink(const LLInventoryItem *item, bool do_up LLInventoryModel::cat_array_t cat_array; LLInventoryModel::item_array_t item_array; - gInventory.collectDescendents(LLAppearanceManager::getCOF(), + gInventory.collectDescendents(LLAppearanceMgr::getCOF(), cat_array, item_array, LLInventoryModel::EXCLUDE_TRASH); bool linked_already = false; + U32 count = 0; for (S32 i=0; i<item_array.count(); i++) { // Are these links to the same object? const LLViewerInventoryItem* inv_item = item_array.get(i).get(); + const LLWearableType::EType wearable_type = inv_item->getWearableType(); + + const bool is_body_part = (wearable_type == LLWearableType::WT_SHAPE) + || (wearable_type == LLWearableType::WT_HAIR) + || (wearable_type == LLWearableType::WT_EYES) + || (wearable_type == LLWearableType::WT_SKIN); + if (inv_item->getLinkedUUID() == vitem->getLinkedUUID()) { linked_already = true; } - // Are these links to different items of the same wearable + // Are these links to different items of the same body part // type? If so, new item will replace old. - // MULTI-WEARABLES: revisit if more than one per type is allowed. - else if (areMatchingWearables(vitem,inv_item)) + else if ((vitem->isWearableType()) && (vitem->getWearableType() == wearable_type)) { - if (inv_item->getIsLinkType()) + ++count; + if (is_body_part && inv_item->getIsLinkType() && (vitem->getWearableType() == wearable_type)) + { + gInventory.purgeObject(inv_item->getUUID()); + } + else if (count >= LLAgentWearables::MAX_CLOTHING_PER_TYPE) { + // MULTI-WEARABLES: make sure we don't go over MAX_CLOTHING_PER_TYPE gInventory.purgeObject(inv_item->getUUID()); } } } + if (linked_already) { if (do_update) { - LLAppearanceManager::updateAppearanceFromCOF(); + LLAppearanceMgr::updateAppearanceFromCOF(); } return; } else { LLPointer<LLInventoryCallback> cb = do_update ? new ModifiedCOFCallback : 0; + const std::string description = vitem->getIsLinkType() ? vitem->getDescription() : ""; link_inventory_item( gAgent.getID(), vitem->getLinkedUUID(), getCOF(), vitem->getName(), + description, LLAssetType::AT_LINK, cb); } return; } -void LLAppearanceManager::addEnsembleLink( LLInventoryCategory* cat, bool do_update ) +// BAP remove ensemble code for 2.1? +void LLAppearanceMgr::addEnsembleLink( LLInventoryCategory* cat, bool do_update ) { #if SUPPORT_ENSEMBLES // BAP add check for already in COF. @@ -1133,18 +1988,19 @@ void LLAppearanceManager::addEnsembleLink( LLInventoryCategory* cat, bool do_upd cat->getLinkedUUID(), getCOF(), cat->getName(), + cat->getDescription(), LLAssetType::AT_LINK_FOLDER, cb); #endif } -void LLAppearanceManager::removeCOFItemLinks(const LLUUID& item_id, bool do_update) +void LLAppearanceMgr::removeCOFItemLinks(const LLUUID& item_id, bool do_update) { gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id); LLInventoryModel::cat_array_t cat_array; LLInventoryModel::item_array_t item_array; - gInventory.collectDescendents(LLAppearanceManager::getCOF(), + gInventory.collectDescendents(LLAppearanceMgr::getCOF(), cat_array, item_array, LLInventoryModel::EXCLUDE_TRASH); @@ -1158,11 +2014,45 @@ void LLAppearanceManager::removeCOFItemLinks(const LLUUID& item_id, bool do_upda } if (do_update) { - LLAppearanceManager::updateAppearanceFromCOF(); + LLAppearanceMgr::updateAppearanceFromCOF(); + } +} + +void LLAppearanceMgr::removeCOFLinksOfType(LLWearableType::EType type, bool do_update) +{ + LLFindWearablesOfType filter_wearables_of_type(type); + LLInventoryModel::cat_array_t cats; + LLInventoryModel::item_array_t items; + LLInventoryModel::item_array_t::const_iterator it; + + gInventory.collectDescendentsIf(getCOF(), cats, items, true, filter_wearables_of_type); + for (it = items.begin(); it != items.end(); ++it) + { + const LLViewerInventoryItem* item = *it; + if (item->getIsLinkType()) // we must operate on links only + { + gInventory.purgeObject(item->getUUID()); + } + } + + if (do_update) + { + updateAppearanceFromCOF(); } } -void LLAppearanceManager::updateIsDirty() +bool sort_by_linked_uuid(const LLViewerInventoryItem* item1, const LLViewerInventoryItem* item2) +{ + if (!item1 || !item2) + { + llwarning("item1, item2 cannot be null, something is very wrong", 0); + return true; + } + + return item1->getLinkedUUID() < item2->getLinkedUUID(); +} + +void LLAppearanceMgr::updateIsDirty() { LLUUID cof = getCOF(); LLUUID base_outfit; @@ -1201,39 +2091,378 @@ void LLAppearanceManager::updateIsDirty() // Current outfit folder should have one more item than the outfit folder. // this one item is the link back to the outfit folder itself. mOutfitIsDirty = true; + return; } - else - { - typedef std::set<LLUUID> item_set_t; - item_set_t cof_set; - item_set_t outfit_set; - // sort COF items by UUID - for (S32 i = 0; i < cof_items.count(); ++i) + //getting rid of base outfit folder link to simplify comparison + for (LLInventoryModel::item_array_t::iterator it = cof_items.begin(); it != cof_items.end(); ++it) + { + if (*it == base_outfit_item) { - LLViewerInventoryItem *item = cof_items.get(i); - // don't add the base outfit link to the list of objects we're comparing - if(item != base_outfit_item) - { - cof_set.insert(item->getLinkedUUID()); - } + cof_items.erase(it); + break; } + } + + //"dirty" - also means a difference in linked UUIDs and/or a difference in wearables order (links' descriptions) + std::sort(cof_items.begin(), cof_items.end(), sort_by_linked_uuid); + std::sort(outfit_items.begin(), outfit_items.end(), sort_by_linked_uuid); - // sort outfit folder by UUID - for (S32 i = 0; i < outfit_items.count(); ++i) + for (U32 i = 0; i < cof_items.size(); ++i) + { + LLViewerInventoryItem *item1 = cof_items.get(i); + LLViewerInventoryItem *item2 = outfit_items.get(i); + + if (item1->getLinkedUUID() != item2->getLinkedUUID() || + item1->LLInventoryItem::getDescription() != item2->LLInventoryItem::getDescription()) { - LLViewerInventoryItem *item = outfit_items.get(i); - outfit_set.insert(item->getLinkedUUID()); + mOutfitIsDirty = true; + return; } + } + + mOutfitIsDirty = false; + } +} + +void LLAppearanceMgr::autopopulateOutfits() +{ + // If this is the very first time the user has logged into viewer2+ (from a legacy viewer, or new account) + // then auto-populate outfits from the library into the My Outfits folder. + + llinfos << "avatar fully visible" << llendl; + + static bool check_populate_my_outfits = true; + if (check_populate_my_outfits && + (LLInventoryModel::getIsFirstTimeInViewer2() + || gSavedSettings.getBOOL("MyOutfitsAutofill"))) + { + gAgentWearables.populateMyOutfitsFolder(); + } + check_populate_my_outfits = false; +} + +// Handler for anything that's deferred until avatar de-clouds. +void LLAppearanceMgr::onFirstFullyVisible() +{ + gAgentAvatarp->debugAvatarVisible(); + autopopulateOutfits(); +} + +bool LLAppearanceMgr::updateBaseOutfit() +{ + if (isOutfitLocked()) + { + // don't allow modify locked outfit + llassert(!isOutfitLocked()); + return false; + } + setOutfitLocked(true); + + gAgentWearables.notifyLoadingStarted(); + + const LLUUID base_outfit_id = getBaseOutfitUUID(); + if (base_outfit_id.isNull()) return false; + + updateClothingOrderingInfo(); + + // in a Base Outfit we do not remove items, only links + purgeCategory(base_outfit_id, false); + + + LLPointer<LLInventoryCallback> dirty_state_updater = new LLUpdateDirtyState(); + + //COF contains only links so we copy to the Base Outfit only links + shallowCopyCategoryContents(getCOF(), base_outfit_id, dirty_state_updater); + + return true; +} + +void LLAppearanceMgr::divvyWearablesByType(const LLInventoryModel::item_array_t& items, wearables_by_type_t& items_by_type) +{ + items_by_type.reserve(LLWearableType::WT_COUNT); + if (items.empty()) return; + + for (S32 i=0; i<items.count(); i++) + { + LLViewerInventoryItem *item = items.get(i); + // Ignore non-wearables. + if (!item->isWearableType()) + continue; + LLWearableType::EType type = item->getWearableType(); + if(type < 0 || type >= LLWearableType::WT_COUNT) + { + LL_WARNS("Appearance") << "Invalid wearable type. Inventory type does not match wearable flag bitfield." << LL_ENDL; + continue; + } + items_by_type[type].push_back(item); + } +} + +std::string build_order_string(LLWearableType::EType type, U32 i) +{ + std::ostringstream order_num; + order_num << ORDER_NUMBER_SEPARATOR << type * 100 + i; + return order_num.str(); +} + +struct WearablesOrderComparator +{ + WearablesOrderComparator(const LLWearableType::EType type) + { + mControlSize = build_order_string(type, 0).size(); + }; + + bool operator()(const LLInventoryItem* item1, const LLInventoryItem* item2) + { + if (!item1 || !item2) + { + llwarning("either item1 or item2 is NULL", 0); + return true; + } + + const std::string& desc1 = item1->LLInventoryItem::getDescription(); + const std::string& desc2 = item2->LLInventoryItem::getDescription(); + + bool item1_valid = (desc1.size() == mControlSize) && (ORDER_NUMBER_SEPARATOR == desc1[0]); + bool item2_valid = (desc2.size() == mControlSize) && (ORDER_NUMBER_SEPARATOR == desc2[0]); - mOutfitIsDirty = (outfit_set != cof_set); + if (item1_valid && item2_valid) + return desc1 < desc2; + + //we need to sink down invalid items: items with empty descriptions, items with "Broken link" descriptions, + //items with ordering information but not for the associated wearables type + if (!item1_valid && item2_valid) + return false; + + return true; + } + + U32 mControlSize; +}; + +void LLAppearanceMgr::updateClothingOrderingInfo(LLUUID cat_id) +{ + if (cat_id.isNull()) + { + cat_id = getCOF(); + } + + // COF is processed if cat_id is not specified + LLInventoryModel::item_array_t wear_items; + getDescendentsOfAssetType(cat_id, wear_items, LLAssetType::AT_CLOTHING, false); + + wearables_by_type_t items_by_type(LLWearableType::WT_COUNT); + divvyWearablesByType(wear_items, items_by_type); + + bool inventory_changed = false; + for (U32 type = LLWearableType::WT_SHIRT; type < LLWearableType::WT_COUNT; type++) + { + + U32 size = items_by_type[type].size(); + if (!size) continue; + + //sinking down invalid items which need reordering + std::sort(items_by_type[type].begin(), items_by_type[type].end(), WearablesOrderComparator((LLWearableType::EType) type)); + + //requesting updates only for those links which don't have "valid" descriptions + for (U32 i = 0; i < size; i++) + { + LLViewerInventoryItem* item = items_by_type[type][i]; + if (!item) continue; + + std::string new_order_str = build_order_string((LLWearableType::EType)type, i); + if (new_order_str == item->LLInventoryItem::getDescription()) continue; + + item->setDescription(new_order_str); + item->setComplete(TRUE); + item->updateServer(FALSE); + gInventory.updateItem(item); + inventory_changed = true; } } + + //*TODO do we really need to notify observers? + if (inventory_changed) gInventory.notifyObservers(); +} + + + + +class LLShowCreatedOutfit: public LLInventoryCallback +{ +public: + LLShowCreatedOutfit(LLUUID& folder_id, bool show_panel = true): mFolderID(folder_id), mShowPanel(show_panel) + {} + + virtual ~LLShowCreatedOutfit() + { + LLSD key; + + //EXT-7727. For new accounts LLShowCreatedOutfit is created during login process + // add may be processed after login process is finished + if (mShowPanel) + { + LLSideTray::getInstance()->showPanel("panel_outfits_inventory", key); + } + LLPanelOutfitsInventory *outfit_panel = + dynamic_cast<LLPanelOutfitsInventory*>(LLSideTray::getInstance()->getPanel("panel_outfits_inventory")); + if (outfit_panel) + { + outfit_panel->getRootFolder()->clearSelection(); + outfit_panel->getRootFolder()->setSelectionByID(mFolderID, TRUE); + } + + LLAccordionCtrlTab* tab_outfits = outfit_panel ? outfit_panel->findChild<LLAccordionCtrlTab>("tab_outfits") : 0; + if (tab_outfits && !tab_outfits->getDisplayChildren()) + { + tab_outfits->changeOpenClose(tab_outfits->getDisplayChildren()); + } + + LLAppearanceMgr::getInstance()->updateIsDirty(); + gAgentWearables.notifyLoadingFinished(); // New outfit is saved. + LLAppearanceMgr::getInstance()->updatePanelOutfitName(""); + } + + virtual void fire(const LLUUID&) + {} + +private: + LLUUID mFolderID; + bool mShowPanel; +}; + +LLUUID LLAppearanceMgr::makeNewOutfitLinks(const std::string& new_folder_name, bool show_panel) +{ + if (!isAgentAvatarValid()) return LLUUID::null; + + gAgentWearables.notifyLoadingStarted(); + + // First, make a folder in the My Outfits directory. + const LLUUID parent_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS); + LLUUID folder_id = gInventory.createNewCategory( + parent_id, + LLFolderType::FT_OUTFIT, + new_folder_name); + + updateClothingOrderingInfo(); + + LLPointer<LLInventoryCallback> cb = new LLShowCreatedOutfit(folder_id,show_panel); + shallowCopyCategoryContents(getCOF(),folder_id, cb); + createBaseOutfitLink(folder_id, cb); + + dumpCat(folder_id,"COF, new outfit"); + + return folder_id; +} + +void LLAppearanceMgr::wearBaseOutfit() +{ + const LLUUID& base_outfit_id = getBaseOutfitUUID(); + if (base_outfit_id.isNull()) return; + + updateCOF(base_outfit_id); +} + +void LLAppearanceMgr::removeItemFromAvatar(const LLUUID& id_to_remove) +{ + LLViewerInventoryItem * item_to_remove = gInventory.getItem(id_to_remove); + if (!item_to_remove) return; + + switch (item_to_remove->getType()) + { + case LLAssetType::AT_CLOTHING: + if (get_is_item_worn(id_to_remove)) + { + //*TODO move here the exact removing code from LLWearableBridge::removeItemFromAvatar in the future + LLWearableBridge::removeItemFromAvatar(item_to_remove); + } + break; + case LLAssetType::AT_OBJECT: + gMessageSystem->newMessageFast(_PREHASH_DetachAttachmentIntoInv); + gMessageSystem->nextBlockFast(_PREHASH_ObjectData); + gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + gMessageSystem->addUUIDFast(_PREHASH_ItemID, item_to_remove->getLinkedUUID()); + gMessageSystem->sendReliable( gAgent.getRegion()->getHost()); + + { + // this object might have been selected, so let the selection manager know it's gone now + LLViewerObject *found_obj = gObjectList.findObject(item_to_remove->getLinkedUUID()); + if (found_obj) + { + LLSelectMgr::getInstance()->remove(found_obj); + }; + } + default: break; + } +} + +bool LLAppearanceMgr::moveWearable(LLViewerInventoryItem* item, bool closer_to_body) +{ + if (!item || !item->isWearableType()) return false; + if (item->getType() != LLAssetType::AT_CLOTHING) return false; + if (!gInventory.isObjectDescendentOf(item->getUUID(), getCOF())) return false; + + LLInventoryModel::cat_array_t cats; + LLInventoryModel::item_array_t items; + LLFindWearablesOfType filter_wearables_of_type(item->getWearableType()); + gInventory.collectDescendentsIf(getCOF(), cats, items, true, filter_wearables_of_type); + if (items.empty()) return false; + + // We assume that the items have valid descriptions. + std::sort(items.begin(), items.end(), WearablesOrderComparator(item->getWearableType())); + + if (closer_to_body && items.front() == item) return false; + if (!closer_to_body && items.back() == item) return false; + + LLInventoryModel::item_array_t::iterator it = std::find(items.begin(), items.end(), item); + if (items.end() == it) return false; + + + //swapping descriptions + closer_to_body ? --it : ++it; + LLViewerInventoryItem* swap_item = *it; + if (!swap_item) return false; + std::string tmp = swap_item->LLInventoryItem::getDescription(); + swap_item->setDescription(item->LLInventoryItem::getDescription()); + item->setDescription(tmp); + + + //items need to be updated on a dataserver + item->setComplete(TRUE); + item->updateServer(FALSE); + gInventory.updateItem(item); + + swap_item->setComplete(TRUE); + swap_item->updateServer(FALSE); + gInventory.updateItem(swap_item); + + //to cause appearance of the agent to be updated + bool result = false; + if (result = gAgentWearables.moveWearable(item, closer_to_body)) + { + gAgentAvatarp->wearableUpdated(item->getWearableType(), FALSE); + } + + setOutfitDirty(true); + + //*TODO do we need to notify observers here in such a way? + gInventory.notifyObservers(); + + return result; +} + +//static +void LLAppearanceMgr::sortItemsByActualDescription(LLInventoryModel::item_array_t& items) +{ + if (items.size() < 2) return; + + std::sort(items.begin(), items.end(), sort_by_description); } //#define DUMP_CAT_VERBOSE -void LLAppearanceManager::dumpCat(const LLUUID& cat_id, const std::string& msg) +void LLAppearanceMgr::dumpCat(const LLUUID& cat_id, const std::string& msg) { LLInventoryModel::cat_array_t cats; LLInventoryModel::item_array_t items; @@ -1254,7 +2483,7 @@ void LLAppearanceManager::dumpCat(const LLUUID& cat_id, const std::string& msg) llinfos << msg << " count " << items.count() << llendl; } -void LLAppearanceManager::dumpItemArray(const LLInventoryModel::item_array_t& items, +void LLAppearanceMgr::dumpItemArray(const LLInventoryModel::item_array_t& items, const std::string& msg) { llinfos << msg << llendl; @@ -1266,22 +2495,31 @@ void LLAppearanceManager::dumpItemArray(const LLInventoryModel::item_array_t& it llinfos << llendl; } -LLAppearanceManager::LLAppearanceManager(): +LLAppearanceMgr::LLAppearanceMgr(): mAttachmentInvLinkEnabled(false), mOutfitIsDirty(false) { + LLOutfitObserver& outfit_observer = LLOutfitObserver::instance(); + + // unlock outfit on save operation completed + outfit_observer.addCOFSavedCallback(boost::bind( + &LLAppearanceMgr::setOutfitLocked, this, false)); + + mUnlockOutfitTimer.reset(new LLOutfitUnLockTimer(gSavedSettings.getS32( + "OutfitOperationsTimeout"))); } -LLAppearanceManager::~LLAppearanceManager() +LLAppearanceMgr::~LLAppearanceMgr() { } -void LLAppearanceManager::setAttachmentInvLinkEnable(bool val) +void LLAppearanceMgr::setAttachmentInvLinkEnable(bool val) { llinfos << "setAttachmentInvLinkEnable => " << (int) val << llendl; mAttachmentInvLinkEnabled = val; } +// BAP TODO - mRegisteredAttachments is currently maintained but not used for anything. Consider yanking. void dumpAttachmentSet(const std::set<LLUUID>& atts, const std::string& msg) { llinfos << msg << llendl; @@ -1299,15 +2537,16 @@ void dumpAttachmentSet(const std::set<LLUUID>& atts, const std::string& msg) llinfos << llendl; } -void LLAppearanceManager::registerAttachment(const LLUUID& item_id) +void LLAppearanceMgr::registerAttachment(const LLUUID& item_id) { mRegisteredAttachments.insert(item_id); gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id); - //dumpAttachmentSet(mRegisteredAttachments,"after register:"); if (mAttachmentInvLinkEnabled) { - LLAppearanceManager::addCOFItemLink(item_id, false); // Add COF link for item. + // we have to pass do_update = true to call LLAppearanceMgr::updateAppearanceFromCOF. + // it will trigger gAgentWariables.notifyLoadingFinished() + LLAppearanceMgr::addCOFItemLink(item_id, true); // Add COF link for item. } else { @@ -1315,17 +2554,14 @@ void LLAppearanceManager::registerAttachment(const LLUUID& item_id) } } -void LLAppearanceManager::unregisterAttachment(const LLUUID& item_id) +void LLAppearanceMgr::unregisterAttachment(const LLUUID& item_id) { mRegisteredAttachments.erase(item_id); gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id); - //dumpAttachmentSet(mRegisteredAttachments,"after unregister:"); - if (mAttachmentInvLinkEnabled) { - //LLAppearanceManager::dumpCat(LLAppearanceManager::getCOF(),"Removing attachment link:"); - LLAppearanceManager::removeCOFItemLinks(item_id, false); + LLAppearanceMgr::removeCOFItemLinks(item_id, false); } else { @@ -1333,27 +2569,34 @@ void LLAppearanceManager::unregisterAttachment(const LLUUID& item_id) } } -void LLAppearanceManager::linkRegisteredAttachments() +void LLAppearanceMgr::linkRegisteredAttachments() { for (std::set<LLUUID>::iterator it = mRegisteredAttachments.begin(); it != mRegisteredAttachments.end(); ++it) { LLUUID item_id = *it; - addCOFItemLink(item_id, false); + addCOFItemLink(item_id, true); } mRegisteredAttachments.clear(); } -BOOL LLAppearanceManager::getIsInCOF(const LLUUID& obj_id) const +BOOL LLAppearanceMgr::getIsInCOF(const LLUUID& obj_id) const { return gInventory.isObjectDescendentOf(obj_id, getCOF()); } -BOOL LLAppearanceManager::getIsProtectedCOFItem(const LLUUID& obj_id) const +BOOL LLAppearanceMgr::getIsProtectedCOFItem(const LLUUID& obj_id) const { if (!getIsInCOF(obj_id)) return FALSE; + // If a non-link somehow ended up in COF, allow deletion. + const LLInventoryObject *obj = gInventory.getObject(obj_id); + if (obj && !obj->getIsLinkType()) + { + return FALSE; + } + // For now, don't allow direct deletion from the COF. Instead, force users // to choose "Detach" or "Take Off". return TRUE; diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h index 38d1e01d08..ab4ff1bcfc 100644 --- a/indra/newview/llappearancemgr.h +++ b/indra/newview/llappearancemgr.h @@ -35,29 +35,56 @@ #include "llsingleton.h" #include "llinventorymodel.h" +#include "llinventoryobserver.h" +#include "llviewerinventory.h" #include "llcallbacklist.h" class LLWearable; class LLWearableHoldingPattern; class LLInventoryCallback; +class LLOutfitUnLockTimer; -class LLAppearanceManager: public LLSingleton<LLAppearanceManager> +class LLAppearanceMgr: public LLSingleton<LLAppearanceMgr> { - friend class LLSingleton<LLAppearanceManager>; + friend class LLSingleton<LLAppearanceMgr>; + friend class LLOutfitUnLockTimer; public: + typedef std::vector<LLInventoryModel::item_array_t> wearables_by_type_t; + void updateAppearanceFromCOF(); bool needToSaveCOF(); void updateCOF(const LLUUID& category, bool append = false); void wearInventoryCategory(LLInventoryCategory* category, bool copy, bool append); void wearInventoryCategoryOnAvatar(LLInventoryCategory* category, bool append); + void wearCategoryFinal(LLUUID& cat_id, bool copy_items, bool append); void wearOutfitByName(const std::string& name); void changeOutfit(bool proceed, const LLUUID& category, bool append); + void replaceCurrentOutfit(const LLUUID& new_outfit); + void renameOutfit(const LLUUID& outfit_id); + void takeOffOutfit(const LLUUID& cat_id); + void addCategoryToCurrentOutfit(const LLUUID& cat_id); - // Copy all items in a category. + // Copy all items and the src category itself. void shallowCopyCategory(const LLUUID& src_id, const LLUUID& dst_id, LLPointer<LLInventoryCallback> cb); + // Return whether this folder contains minimal contents suitable for making a full outfit. + BOOL getCanMakeFolderIntoOutfit(const LLUUID& folder_id); + + // Determine whether a given outfit can be removed. + bool getCanRemoveOutfit(const LLUUID& outfit_cat_id); + + // Determine whether we're wearing any of the outfit contents (excluding body parts). + static bool getCanRemoveFromCOF(const LLUUID& outfit_cat_id); + + // Determine whether we can add anything (but body parts) from the outfit contents to COF. + static bool getCanAddToCOF(const LLUUID& outfit_cat_id); + + // Copy all items in a category. + void shallowCopyCategoryContents(const LLUUID& src_id, const LLUUID& dst_id, + LLPointer<LLInventoryCallback> cb); + // Find the Current Outfit folder. const LLUUID getCOF() const; @@ -65,6 +92,12 @@ public: const LLViewerInventoryItem *getBaseOutfitLink(); bool getBaseOutfitName(std::string &name); + // find the UUID of the currently worn outfit (Base Outfit) + const LLUUID getBaseOutfitUUID(); + + // Wear/attach an item (from a user's inventory) on the agent + bool wearItemOnAvatar(const LLUUID& item_to_wear, bool do_update = true, bool replace = false); + // Update the displayed outfit name in UI. void updatePanelOutfitName(const std::string& name); @@ -93,6 +126,7 @@ public: // Remove COF entries void removeCOFItemLinks(const LLUUID& item_id, bool do_update = true); + void removeCOFLinksOfType(LLWearableType::EType type, bool do_update = true); // Add COF link to ensemble folder. void addEnsembleLink(LLInventoryCategory* item, bool do_update = true); @@ -107,9 +141,40 @@ public: // should only be necessary to do on initial login. void updateIsDirty(); + // Called when self avatar is first fully visible. + void onFirstFullyVisible(); + + // Create initial outfits from library. + void autopopulateOutfits(); + + void wearBaseOutfit(); + + // Overrides the base outfit with the content from COF + // @return false if there is no base outfit + bool updateBaseOutfit(); + + //Remove clothing or detach an object from the agent (a bodypart cannot be removed) + void removeItemFromAvatar(const LLUUID& item_id); + + + LLUUID makeNewOutfitLinks(const std::string& new_folder_name,bool show_panel = true); + + bool moveWearable(LLViewerInventoryItem* item, bool closer_to_body); + + static void sortItemsByActualDescription(LLInventoryModel::item_array_t& items); + + //Divvy items into arrays by wearable type + static void divvyWearablesByType(const LLInventoryModel::item_array_t& items, wearables_by_type_t& items_by_type); + + //Check ordering information on wearables stored in links' descriptions and update if it is invalid + // COF is processed if cat_id is not specified + void updateClothingOrderingInfo(LLUUID cat_id = LLUUID::null); + + bool isOutfitLocked() { return mOutfitLocked; } + protected: - LLAppearanceManager(); - ~LLAppearanceManager(); + LLAppearanceMgr(); + ~LLAppearanceMgr(); private: @@ -129,10 +194,22 @@ private: void purgeCategory(const LLUUID& category, bool keep_outfit_links); void purgeBaseOutfitLink(const LLUUID& category); + static void onOutfitRename(const LLSD& notification, const LLSD& response); + + void setOutfitLocked(bool locked); + std::set<LLUUID> mRegisteredAttachments; bool mAttachmentInvLinkEnabled; bool mOutfitIsDirty; + /** + * Lock for blocking operations on outfit until server reply or timeout exceed + * to avoid unsynchronized outfit state or performing duplicate operations. + */ + bool mOutfitLocked; + + std::auto_ptr<LLOutfitUnLockTimer> mUnlockOutfitTimer; + ////////////////////////////////////////////////////////////////////////////////// // Item-specific convenience functions public: @@ -142,22 +219,36 @@ public: BOOL getIsProtectedCOFItem(const LLUUID& obj_id) const; }; +class LLUpdateAppearanceOnDestroy: public LLInventoryCallback +{ +public: + LLUpdateAppearanceOnDestroy(); + virtual ~LLUpdateAppearanceOnDestroy(); + /* virtual */ void fire(const LLUUID& inv_item); + +private: + U32 mFireCount; +}; + + #define SUPPORT_ENSEMBLES 0 +LLUUID findDescendentCategoryIDByName(const LLUUID& parent_id,const std::string& name); + // Shim class and template function to allow arbitrary boost::bind // expressions to be run as one-time idle callbacks. template <typename T> -class OnIdleCallback +class OnIdleCallbackOneTime { public: - OnIdleCallback(T callable): + OnIdleCallbackOneTime(T callable): mCallable(callable) { } static void onIdle(void *data) { gIdleCallbacks.deleteFunction(onIdle, data); - OnIdleCallback<T>* self = reinterpret_cast<OnIdleCallback<T>*>(data); + OnIdleCallbackOneTime<T>* self = reinterpret_cast<OnIdleCallbackOneTime<T>*>(data); self->call(); delete self; } @@ -170,14 +261,15 @@ private: }; template <typename T> -void doOnIdle(T callable) +void doOnIdleOneTime(T callable) { - OnIdleCallback<T>* cb_functor = new OnIdleCallback<T>(callable); - gIdleCallbacks.addFunction(&OnIdleCallback<T>::onIdle,cb_functor); + OnIdleCallbackOneTime<T>* cb_functor = new OnIdleCallbackOneTime<T>(callable); + gIdleCallbacks.addFunction(&OnIdleCallbackOneTime<T>::onIdle,cb_functor); } // Shim class and template function to allow arbitrary boost::bind // expressions to be run as recurring idle callbacks. +// Callable should return true when done, false to continue getting called. template <typename T> class OnIdleCallbackRepeating { @@ -186,7 +278,7 @@ public: mCallable(callable) { } - // Will keep getting called until the callable returns false. + // Will keep getting called until the callable returns true. static void onIdle(void *data) { OnIdleCallbackRepeating<T>* self = reinterpret_cast<OnIdleCallbackRepeating<T>*>(data); @@ -212,4 +304,108 @@ void doOnIdleRepeating(T callable) gIdleCallbacks.addFunction(&OnIdleCallbackRepeating<T>::onIdle,cb_functor); } +template <class T> +class CallAfterCategoryFetchStage2: public LLInventoryFetchItemsObserver +{ +public: + CallAfterCategoryFetchStage2(const uuid_vec_t& ids, + T callable) : + LLInventoryFetchItemsObserver(ids), + mCallable(callable) + { + } + ~CallAfterCategoryFetchStage2() + { + } + virtual void done() + { + llinfos << this << " done with incomplete " << mIncomplete.size() + << " complete " << mComplete.size() << " calling callable" << llendl; + + gInventory.removeObserver(this); + doOnIdleOneTime(mCallable); + delete this; + } +protected: + T mCallable; +}; + +template <class T> +class CallAfterCategoryFetchStage1: public LLInventoryFetchDescendentsObserver +{ +public: + CallAfterCategoryFetchStage1(const LLUUID& cat_id, T callable) : + LLInventoryFetchDescendentsObserver(cat_id), + mCallable(callable) + { + } + ~CallAfterCategoryFetchStage1() + { + } + virtual void done() + { + // What we do here is get the complete information on the items in + // the library, and set up an observer that will wait for that to + // happen. + LLInventoryModel::cat_array_t cat_array; + LLInventoryModel::item_array_t item_array; + gInventory.collectDescendents(mComplete.front(), + cat_array, + item_array, + LLInventoryModel::EXCLUDE_TRASH); + S32 count = item_array.count(); + if(!count) + { + llwarns << "Nothing fetched in category " << mComplete.front() + << llendl; + //dec_busy_count(); + gInventory.removeObserver(this); + delete this; + return; + } + + llinfos << "stage1 got " << item_array.count() << " items, passing to stage2 " << llendl; + uuid_vec_t ids; + for(S32 i = 0; i < count; ++i) + { + ids.push_back(item_array.get(i)->getUUID()); + } + + gInventory.removeObserver(this); + + // do the fetch + CallAfterCategoryFetchStage2<T> *stage2 = new CallAfterCategoryFetchStage2<T>(ids, mCallable); + stage2->startFetch(); + if(stage2->isFinished()) + { + // everything is already here - call done. + stage2->done(); + } + else + { + // it's all on it's way - add an observer, and the inventory + // will call done for us when everything is here. + gInventory.addObserver(stage2); + } + delete this; + } +protected: + T mCallable; +}; + +template <class T> +void callAfterCategoryFetch(const LLUUID& cat_id, T callable) +{ + CallAfterCategoryFetchStage1<T> *stage1 = new CallAfterCategoryFetchStage1<T>(cat_id, callable); + stage1->startFetch(); + if (stage1->isFinished()) + { + stage1->done(); + } + else + { + gInventory.addObserver(stage1); + } +} + #endif diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 2f90885df3..1ed63555b0 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -40,9 +40,11 @@ #include "lluictrlfactory.h" #include "lltexteditor.h" #include "llerrorcontrol.h" +#include "lleventtimer.h" #include "llviewertexturelist.h" #include "llgroupmgr.h" #include "llagent.h" +#include "llagentcamera.h" #include "llagentwearables.h" #include "llwindow.h" #include "llviewerstats.h" @@ -77,6 +79,7 @@ #include "lllocationhistory.h" #include "llfasttimerview.h" #include "llvoicechannel.h" +#include "llvoavatarself.h" #include "llsidetray.h" @@ -100,8 +103,8 @@ // Third party library includes #include <boost/bind.hpp> + #if LL_WINDOWS - #include "llwindebug.h" # include <share.h> // For _SH_DENYWR in initMarkerFile #else # include <sys/file.h> // For initMarkerFile support @@ -150,7 +153,7 @@ #include "llworld.h" #include "llhudeffecttrail.h" #include "llvectorperfoptions.h" -#include "llurlsimstring.h" +#include "llslurl.h" #include "llwatchdog.h" // Included so that constants/settings might be initialized @@ -190,6 +193,10 @@ #include "llparcel.h" #include "llavatariconctrl.h" +// Include for security api initialization +#include "llsecapi.h" +#include "llmachineid.h" + // *FIX: These extern globals should be cleaned up. // The globals either represent state/config/resource-storage of either // this app, or another 'component' of the viewer. App globals should be @@ -324,10 +331,6 @@ const char *VFS_INDEX_FILE_BASE = "index.db2.x."; static std::string gWindowTitle; -std::string gLoginPage; -std::vector<std::string> gLoginURIs; -static std::string gHelperURI; - LLAppViewer::LLUpdaterInfo *LLAppViewer::sUpdaterInfo = NULL ; void idle_afk_check() @@ -354,7 +357,7 @@ void request_initial_instant_messages() if (!requested && gMessageSystem && LLMuteList::getInstance()->isLoaded() - && gAgent.getAvatarObject()) + && isAgentAvatarValid()) { // Auto-accepted inventory items may require the avatar object // to build a correct name. Likewise, inventory offers from @@ -409,7 +412,7 @@ static void settings_to_globals() LLVolumeImplFlexible::sUpdateFactor = gSavedSettings.getF32("RenderFlexTimeFactor"); LLVOTree::sTreeFactor = gSavedSettings.getF32("RenderTreeLODFactor"); LLVOAvatar::sLODFactor = gSavedSettings.getF32("RenderAvatarLODFactor"); - LLVOAvatar::sMaxVisible = gSavedSettings.getS32("RenderAvatarMaxVisible"); + LLVOAvatar::sMaxVisible = (U32)gSavedSettings.getS32("RenderAvatarMaxVisible"); LLVOAvatar::sVisibleInFirstPerson = gSavedSettings.getBOOL("FirstPersonAvatarVisible"); // clamp auto-open time to some minimum usable value LLFolderView::sAutoOpenTime = llmax(0.25f, gSavedSettings.getF32("FolderAutoOpenDelay")); @@ -504,35 +507,6 @@ public: } }; -void LLAppViewer::initGridChoice() -{ - // Load up the initial grid choice from: - // - hard coded defaults... - // - command line settings... - // - if dev build, persisted settings... - - // Set the "grid choice", this is specified by command line. - std::string grid_choice = gSavedSettings.getString("CmdLineGridChoice"); - LLViewerLogin::getInstance()->setGridChoice(grid_choice); - - // Load last server choice by default - // ignored if the command line grid choice has been set - if(grid_choice.empty()) - { - S32 server = gSavedSettings.getS32("ServerChoice"); - server = llclamp(server, 0, (S32)GRID_INFO_COUNT - 1); - if(server == GRID_INFO_OTHER) - { - std::string custom_server = gSavedSettings.getString("CustomServer"); - LLViewerLogin::getInstance()->setGridChoice(custom_server); - } - else if(server != (S32)GRID_INFO_NONE) - { - LLViewerLogin::getInstance()->setGridChoice((EGridInfo)server); - } - } -} - //virtual bool LLAppViewer::initSLURLHandler() { @@ -625,6 +599,11 @@ bool LLAppViewer::init() if (!initConfiguration()) return false; + // write Google Breakpad minidump files to our log directory + std::string logdir = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, ""); + logdir += gDirUtilp->getDirDelimiter(); + setMiniDumpDir(logdir); + // Although initLogging() is the right place to mess with // setFatalFunction(), we can't query gSavedSettings until after // initConfiguration(). @@ -642,9 +621,9 @@ bool LLAppViewer::init() // *NOTE:Mani - LLCurl::initClass is not thread safe. // Called before threads are created. LLCurl::initClass(); + LLMachineID::init(); initThreads(); - writeSystemInfo(); // Build a string representing the current version number. @@ -701,9 +680,9 @@ bool LLAppViewer::init() settings_map["account"] = &gSavedPerAccountSettings; LLUI::initClass(settings_map, - LLUIImageList::getInstance(), - ui_audio_callback, - &LLUI::sGLScaleFactor); + LLUIImageList::getInstance(), + ui_audio_callback, + &LLUI::sGLScaleFactor); // Setup paths and LLTrans after LLUI::initClass has been called LLUI::setupPaths(); @@ -774,10 +753,6 @@ bool LLAppViewer::init() return false; } - // Always fetch the Ethernet MAC address, needed both for login - // and password load. - LLUUID::getNodeID(gMACAddress); - // Prepare for out-of-memory situations, during which we will crash on // purpose and save a dump. #if LL_WINDOWS && LL_RELEASE_FOR_DOWNLOAD && LL_USE_SMARTHEAP @@ -859,7 +834,7 @@ bool LLAppViewer::init() minSpecs += "\n"; unsupported = true; } - if(gSysCPU.getMhz() < minCPU) + if(gSysCPU.getMHz() < minCPU) { minSpecs += LLNotifications::instance().getGlobalString("UnsupportedCPU"); minSpecs += "\n"; @@ -889,6 +864,7 @@ bool LLAppViewer::init() } } + // save the graphics card gDebugInfo["GraphicsCard"] = LLFeatureManager::getInstance()->getGPUString(); @@ -899,6 +875,17 @@ bool LLAppViewer::init() gSimFrames = (F32)gFrameCount; LLViewerJoystick::getInstance()->init(false); + + try { + initializeSecHandler(); + } + catch (LLProtectedDataException ex) + { + LLNotificationsUtil::add("CorruptedProtectedDataStore"); + } + LLHTTPClient::setCertVerifyCallback(secapiSSLCertVerifyCallback); + + gGLActive = FALSE; if (gSavedSettings.getBOOL("QAMode") && gSavedSettings.getS32("QAModeEventHostPort") > 0) { @@ -906,7 +893,22 @@ bool LLAppViewer::init() } LLViewerMedia::initClass(); - + + //EXT-7013 - On windows for some locale (Japanese) standard + //datetime formatting functions didn't support some parameters such as "weekday". + std::string language = LLControlGroup::getInstance(sGlobalSettingsName)->getString("Language"); + if(language == "ja") + { + LLStringOps::setupWeekDaysNames(LLTrans::getString("dateTimeWeekdaysNames")); + LLStringOps::setupWeekDaysShortNames(LLTrans::getString("dateTimeWeekdaysShortNames")); + LLStringOps::setupMonthNames(LLTrans::getString("dateTimeMonthNames")); + LLStringOps::setupMonthShortNames(LLTrans::getString("dateTimeMonthShortNames")); + LLStringOps::setupDayFormat(LLTrans::getString("dateTimeDayFormat")); + + LLStringOps::sAM = LLTrans::getString("dateTimeAM"); + LLStringOps::sPM = LLTrans::getString("dateTimePM"); + } + return true; } @@ -933,13 +935,11 @@ bool LLAppViewer::mainLoop() gServicePump = new LLPumpIO(gAPRPoolp); LLHTTPClient::setPump(*gServicePump); LLCurl::setCAFile(gDirUtilp->getCAFile()); - LLCurl::setSSLVerify(! gSavedSettings.getBOOL("NoVerifySSLCert")); - + // Note: this is where gLocalSpeakerMgr and gActiveSpeakerMgr used to be instantiated. LLVoiceChannel::initClass(); - LLVoiceClient::init(gServicePump); - + LLVoiceClient::getInstance()->init(gServicePump); LLTimer frameTimer,idleTimer; LLTimer debugTime; LLViewerJoystick* joystick(LLViewerJoystick::getInstance()); @@ -1106,12 +1106,15 @@ bool LLAppViewer::mainLoop() ms_sleep(500); } - + static const F64 FRAME_SLOW_THRESHOLD = 0.5; //2 frames per seconds const F64 min_frame_time = 0.0; //(.0333 - .0010); // max video frame rate = 30 fps const F64 min_idle_time = 0.0; //(.0010); // min idle time = 1 ms const F64 max_idle_time = run_multiple_threads ? min_idle_time : llmin(.005*10.0*gFrameTimeSeconds, 0.005); // 5 ms a second idleTimer.reset(); - while(1) + bool is_slow = (frameTimer.getElapsedTimeF64() > FRAME_SLOW_THRESHOLD) ; + S32 total_work_pending = 0; + S32 total_io_pending = 0; + while(!is_slow)//do not unpause threads if the frame rates are very low. { S32 work_pending = 0; S32 io_pending = 0; @@ -1142,6 +1145,8 @@ bool LLAppViewer::mainLoop() ms_sleep(llmin(io_pending/100,100)); // give the vfs some time to catch up } + total_work_pending += work_pending ; + total_io_pending += io_pending ; F64 frame_time = frameTimer.getElapsedTimeF64(); F64 idle_time = idleTimer.getElapsedTimeF64(); if (frame_time >= min_frame_time && @@ -1151,25 +1156,32 @@ bool LLAppViewer::mainLoop() break; } } - if ((LLStartUp::getStartupState() >= STATE_CLEANUP) && - (frameTimer.getElapsedTimeF64() > FRAME_STALL_THRESHOLD)) - { - gFrameStalls++; - } - frameTimer.reset(); // Prevent the worker threads from running while rendering. // if (LLThread::processorCount()==1) //pause() should only be required when on a single processor client... if (run_multiple_threads == FALSE) { - LLFastTimer ftm(FTM_PAUSE_THREADS); - - LLAppViewer::getTextureCache()->pause(); - LLAppViewer::getImageDecodeThread()->pause(); - // LLAppViewer::getTextureFetch()->pause(); // Don't pause the fetch (IO) thread + //LLFastTimer ftm(FTM_PAUSE_THREADS); //not necessary. + + if(!total_work_pending) //pause texture fetching threads if nothing to process. + { + LLAppViewer::getTextureCache()->pause(); + LLAppViewer::getImageDecodeThread()->pause(); + LLAppViewer::getTextureFetch()->pause(); + } + if(!total_io_pending) //pause file threads if nothing to process. + { + LLVFSThread::sLocal->pause(); + LLLFSThread::sLocal->pause(); + } + } + + if ((LLStartUp::getStartupState() >= STATE_CLEANUP) && + (frameTimer.getElapsedTimeF64() > FRAME_STALL_THRESHOLD)) + { + gFrameStalls++; } - //LLVFSThread::sLocal->pause(); // Prevent the VFS thread from running while rendering. - //LLLFSThread::sLocal->pause(); // Prevent the LFS thread from running while rendering. + frameTimer.reset(); resumeMainloopTimeout(); @@ -1232,6 +1244,14 @@ bool LLAppViewer::cleanup() // workaround for DEV-35406 crash on shutdown LLEventPumps::instance().reset(); + // remove any old breakpad minidump files from the log directory + if (! isError()) + { + std::string logdir = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, ""); + logdir += gDirUtilp->getDirDelimiter(); + gDirUtilp->deleteFilesInDir(logdir, "*-*-*-*-*.dmp"); + } + // *TODO - generalize this and move DSO wrangling to a helper class -brad std::set<struct apr_dso_handle_t *>::const_iterator i; for(i = mPlugins.begin(); i != mPlugins.end(); ++i) @@ -1258,7 +1278,7 @@ bool LLAppViewer::cleanup() // to ensure shutdown order LLMortician::setZealous(TRUE); - LLVoiceClient::terminate(); + LLVoiceClient::getInstance()->terminate(); disconnectViewer(); @@ -1353,9 +1373,6 @@ bool LLAppViewer::cleanup() llinfos << "Cache files removed" << llendflush; - - cleanup_menus(); - // Wait for any pending VFS IO while (1) { @@ -1460,13 +1477,6 @@ bool LLAppViewer::cleanup() llinfos << "Saving Data" << llendflush; - // Quitting with "Remember Password" turned off should always stomp your - // saved password, whether or not you successfully logged in. JC - if (!gSavedSettings.getBOOL("RememberPassword")) - { - LLStartUp::deletePasswordFromDisk(); - } - // Store the time of our current logoff gSavedPerAccountSettings.setU32("LastLogoff", time_corrected()); @@ -1515,9 +1525,14 @@ bool LLAppViewer::cleanup() LLLocationHistory::getInstance()->save(); LLAvatarIconIDCache::getInstance()->save(); + + LLViewerMedia::saveCookieFile(); + + // Stop the plugin read thread if it's running. + LLPluginProcessParent::setUseReadThread(false); llinfos << "Shutting down Threads" << llendflush; - + // Let threads finish LLTimer idleTimer; idleTimer.reset(); @@ -1531,19 +1546,26 @@ bool LLAppViewer::cleanup() pending += LLVFSThread::updateClass(0); pending += LLLFSThread::updateClass(0); F64 idle_time = idleTimer.getElapsedTimeF64(); - if (!pending || idle_time >= max_idle_time) + if(!pending) + { + break ; //done + } + else if(idle_time >= max_idle_time) { llwarns << "Quitting with pending background tasks." << llendl; break; } } - + // Delete workers first // shotdown all worker threads before deleting them in case of co-dependencies sTextureCache->shutdown(); sTextureFetch->shutdown(); sImageDecodeThread->shutdown(); + sTextureFetch->shutDownTextureCacheThread() ; + sTextureFetch->shutDownImageDecodeThread() ; + delete sTextureCache; sTextureCache = NULL; delete sTextureFetch; @@ -1628,7 +1650,7 @@ bool LLAppViewer::cleanup() // HACK: Attempt to wait until the screen res. switch is complete. ms_sleep(1000); - LLWeb::loadURLExternal( gLaunchFileOnQuit ); + LLWeb::loadURLExternal( gLaunchFileOnQuit, false ); llinfos << "File launched." << llendflush; } @@ -1681,7 +1703,7 @@ bool LLAppViewer::initThreads() // Image decoding LLAppViewer::sImageDecodeThread = new LLImageDecodeThread(enable_threads && true); LLAppViewer::sTextureCache = new LLTextureCache(enable_threads && true); - LLAppViewer::sTextureFetch = new LLTextureFetch(LLAppViewer::getTextureCache(), sImageDecodeThread, enable_threads && false); + LLAppViewer::sTextureFetch = new LLTextureFetch(LLAppViewer::getTextureCache(), sImageDecodeThread, enable_threads && true); LLImage::initClass(); if (LLFastTimer::sLog || LLFastTimer::sMetricLog) @@ -1810,7 +1832,7 @@ bool LLAppViewer::loadSettingsFromDirectory(const std::string& location_key, } else { - llwarns << "Cannot load " << full_settings_path << " - No settings found." << llendl; + llinfos << "Cannot load " << full_settings_path << " - No settings found." << llendl; } } else @@ -1935,7 +1957,6 @@ bool LLAppViewer::initConfiguration() // LLFirstUse::addConfigVariable("FirstSandbox"); // LLFirstUse::addConfigVariable("FirstFlexible"); // LLFirstUse::addConfigVariable("FirstDebugMenus"); -// LLFirstUse::addConfigVariable("FirstStreamingMedia"); // LLFirstUse::addConfigVariable("FirstSculptedPrim"); // LLFirstUse::addConfigVariable("FirstVoice"); // LLFirstUse::addConfigVariable("FirstMedia"); @@ -2027,7 +2048,6 @@ bool LLAppViewer::initConfiguration() } } - initGridChoice(); // If we have specified crash on startup, set the global so we'll trigger the crash at the right time if(clp.hasOption("crashonstartup")) @@ -2121,30 +2141,17 @@ bool LLAppViewer::initConfiguration() // injection and steal passwords. Phoenix. SL-55321 if(clp.hasOption("url")) { - std::string slurl = clp.getOption("url")[0]; - if (LLSLURL::isSLURLCommand(slurl)) - { - LLStartUp::sSLURLCommand = slurl; - } - else - { - LLURLSimString::setString(slurl); - } + LLStartUp::setStartSLURL(LLSLURL(clp.getOption("url")[0])); + if(LLStartUp::getStartSLURL().getType() == LLSLURL::LOCATION) + { + LLGridManager::getInstance()->setGridChoice(LLStartUp::getStartSLURL().getGrid()); + + } } else if(clp.hasOption("slurl")) { - std::string slurl = clp.getOption("slurl")[0]; - if(LLSLURL::isSLURL(slurl)) - { - if (LLSLURL::isSLURLCommand(slurl)) - { - LLStartUp::sSLURLCommand = slurl; - } - else - { - LLURLSimString::setString(slurl); - } - } + LLSLURL start_slurl(clp.getOption("slurl")[0]); + LLStartUp::setStartSLURL(start_slurl); } const LLControlVariable* skinfolder = gSavedSettings.getControl("SkinCurrent"); @@ -2194,10 +2201,12 @@ bool LLAppViewer::initConfiguration() // Display splash screen. Must be after above check for previous // crash as this dialog is always frontmost. - std::ostringstream splash_msg; - splash_msg << "Loading " << LLTrans::getString("SECOND_LIFE") << "..."; + std::string splash_msg; + LLStringUtil::format_map_t args; + args["[APP_NAME]"] = LLTrans::getString("SECOND_LIFE"); + splash_msg = LLTrans::getString("StartupLoading", args); LLSplashScreen::show(); - LLSplashScreen::update(splash_msg.str()); + LLSplashScreen::update(splash_msg); //LLVolumeMgr::initClass(); LLVolumeMgr* volume_manager = new LLVolumeMgr(); @@ -2223,18 +2232,10 @@ bool LLAppViewer::initConfiguration() // don't call anotherInstanceRunning() when doing URL handoff, as // it relies on checking a marker file which will not work when running // out of different directories - std::string slurl; - if (!LLStartUp::sSLURLCommand.empty()) - { - slurl = LLStartUp::sSLURLCommand; - } - else if (LLURLSimString::parse()) - { - slurl = LLURLSimString::getURL(); - } - if (!slurl.empty()) + + if (LLStartUp::getStartSLURL().isValid()) { - if (sendURLToOtherInstance(slurl)) + if (sendURLToOtherInstance(LLStartUp::getStartSLURL().getSLURLString())) { // successfully handed off URL to existing instance, exit return false; @@ -2290,9 +2291,9 @@ bool LLAppViewer::initConfiguration() // need to do this here - need to have initialized global settings first std::string nextLoginLocation = gSavedSettings.getString( "NextLoginLocation" ); - if ( nextLoginLocation.length() ) + if ( !nextLoginLocation.empty() ) { - LLURLSimString::setString( nextLoginLocation ); + LLStartUp::setStartSLURL(LLSLURL(nextLoginLocation)); }; gLastRunVersion = gSavedSettings.getString("LastRunVersion"); @@ -2307,17 +2308,7 @@ void LLAppViewer::checkForCrash(void) { #if LL_SEND_CRASH_REPORTS - //*NOTE:Mani The current state of the crash handler has the MacOSX - // sending all crash reports as freezes, in order to let - // the MacOSX CrashRepoter generate stacks before spawning the - // SL crash logger. - // The Linux and Windows clients generate their own stacks and - // spawn the SL crash logger immediately. This may change in the future. -#if LL_DARWIN - if(gLastExecEvent != LAST_EXEC_NORMAL) -#else if (gLastExecEvent == LAST_EXEC_FROZE) -#endif { llinfos << "Last execution froze, requesting to send crash report." << llendl; // @@ -2365,9 +2356,6 @@ bool LLAppViewer::initWindow() // store setting in a global for easy access and modification gNoRender = gSavedSettings.getBOOL("DisableRendering"); - // Hide the splash screen - LLSplashScreen::hide(); - // always start windowed BOOL ignorePixelDepth = gSavedSettings.getBOOL("IgnorePixelDepth"); gViewerWindow = new LLViewerWindow(gWindowTitle, @@ -2378,16 +2366,9 @@ bool LLAppViewer::initWindow() LLNotificationsUI::LLNotificationManager::getInstance(); - if (gSavedSettings.getBOOL("WindowFullScreen")) - { - // request to go full screen... which will be delayed until login - gViewerWindow->toggleFullscreen(FALSE); - } - if (gSavedSettings.getBOOL("WindowMaximized")) { gViewerWindow->mWindow->maximize(); - gViewerWindow->getWindow()->setNativeAspectRatio(gSavedSettings.getF32("FullScreenAspectRatio")); } if (!gNoRender) @@ -2461,11 +2442,10 @@ void LLAppViewer::cleanupSavedSettings() } } - // save window position if not fullscreen + // save window position if not maximized // as we don't track it in callbacks - BOOL fullscreen = gViewerWindow->mWindow->getFullscreen(); BOOL maximized = gViewerWindow->mWindow->getMaximized(); - if (!fullscreen && !maximized) + if (!maximized) { LLCoordScreen window_pos; @@ -2479,9 +2459,9 @@ void LLAppViewer::cleanupSavedSettings() gSavedSettings.setF32("MapScale", LLWorldMapView::sMapScale ); // Some things are cached in LLAgent. - if (gAgent.mInitialized) + if (gAgent.isInitialized()) { - gSavedSettings.setF32("RenderFarClip", gAgent.mDrawDistance); + gSavedSettings.setF32("RenderFarClip", gAgentCamera.mDrawDistance); } } @@ -2505,7 +2485,7 @@ void LLAppViewer::writeSystemInfo() gDebugInfo["CPUInfo"]["CPUString"] = gSysCPU.getCPUString(); gDebugInfo["CPUInfo"]["CPUFamily"] = gSysCPU.getFamily(); - gDebugInfo["CPUInfo"]["CPUMhz"] = gSysCPU.getMhz(); + gDebugInfo["CPUInfo"]["CPUMhz"] = (S32)gSysCPU.getMHz(); gDebugInfo["CPUInfo"]["CPUAltivec"] = gSysCPU.hasAltivec(); gDebugInfo["CPUInfo"]["CPUSSE"] = gSysCPU.hasSSE(); gDebugInfo["CPUInfo"]["CPUSSE2"] = gSysCPU.hasSSE2(); @@ -2516,9 +2496,9 @@ void LLAppViewer::writeSystemInfo() // The user is not logged on yet, but record the current grid choice login url // which may have been the intended grid. This can b - gDebugInfo["GridName"] = LLViewerLogin::getInstance()->getGridLabel(); + gDebugInfo["GridName"] = LLGridManager::getInstance()->getGridLabel(); - // *FIX:Mani - move this ddown in llappviewerwin32 + // *FIX:Mani - move this down in llappviewerwin32 #ifdef LL_WINDOWS DWORD thread_id = GetCurrentThreadId(); gDebugInfo["MainloopThreadID"] = (S32)thread_id; @@ -2530,6 +2510,15 @@ void LLAppViewer::writeSystemInfo() // If the crash is handled by LLAppViewer::handleViewerCrash, ie not a freeze, // then the value of "CrashNotHandled" will be set to true. gDebugInfo["CrashNotHandled"] = (LLSD::Boolean)true; + + // Insert crash host url (url to post crash log to) if configured. This insures + // that the crash report will go to the proper location in the case of a + // prior freeze. + std::string crashHostUrl = gSavedSettings.get<std::string>("CrashHostUrl"); + if(crashHostUrl != "") + { + gDebugInfo["CrashHostUrl"] = crashHostUrl; + } // Dump some debugging info LL_INFOS("SystemInfo") << LLTrans::getString("APP_NAME") @@ -2551,17 +2540,12 @@ void LLAppViewer::writeSystemInfo() writeDebugInfo(); // Save out debug_info.log early, in case of crash. } -void LLAppViewer::handleSyncViewerCrash() -{ - LLAppViewer* pApp = LLAppViewer::instance(); - // Call to pure virtual, handled by platform specific llappviewer instance. - pApp->handleSyncCrashTrace(); -} - void LLAppViewer::handleViewerCrash() { llinfos << "Handle viewer crash entry." << llendl; + llinfos << "Last render pool type: " << LLPipeline::sCurRenderPoolType << llendl ; + //print out recorded call stacks if there are any. LLError::LLCallStacks::print(); @@ -2579,9 +2563,13 @@ void LLAppViewer::handleViewerCrash() return; } pApp->mReportedCrash = TRUE; - - // Make sure the watchdog gets turned off... -// pApp->destroyMainloopTimeout(); // SJB: Bah. This causes the crash handler to hang, not sure why. + + // Insert crash host url (url to post crash log to) if configured. + std::string crashHostUrl = gSavedSettings.get<std::string>("CrashHostUrl"); + if(crashHostUrl != "") + { + gDebugInfo["CrashHostUrl"] = crashHostUrl; + } //We already do this in writeSystemInfo(), but we do it again here to make /sure/ we have a version //to check against no matter what @@ -2611,8 +2599,14 @@ void LLAppViewer::handleViewerCrash() gDebugInfo["StartupState"] = LLStartUp::getStartupStateString(); gDebugInfo["RAMInfo"]["Allocated"] = (LLSD::Integer) LLMemory::getCurrentRSS() >> 10; gDebugInfo["FirstLogin"] = (LLSD::Boolean) gAgent.isFirstLogin(); - gDebugInfo["HadFirstSuccessfulLogin"] = gSavedSettings.getBOOL("HadFirstSuccessfulLogin"); + gDebugInfo["FirstRunThisInstall"] = gSavedSettings.getBOOL("FirstRunThisInstall"); + char *minidump_file = pApp->getMiniDumpFilename(); + if(minidump_file && minidump_file[0] != 0) + { + gDebugInfo["MinidumpPath"] = minidump_file; + } + if(gLogoutInProgress) { gDebugInfo["LastExecEvent"] = LAST_EXEC_LOGOUT_CRASH; @@ -2690,10 +2684,6 @@ void LLAppViewer::handleViewerCrash() LLError::logToFile(""); -// On Mac, we send the report on the next run, since we need macs crash report -// for a stack trace, so we have to let it the app fail. -#if !LL_DARWIN - // Remove the marker file, since otherwise we'll spawn a process that'll keep it locked if(gDebugInfo["LastExecEvent"].asInteger() == LAST_EXEC_LOGOUT_CRASH) { @@ -2706,8 +2696,6 @@ void LLAppViewer::handleViewerCrash() // Call to pure virtual, handled by platform specific llappviewer instance. pApp->handleCrashReporting(); - -#endif //!LL_DARWIN return; } @@ -2997,41 +2985,97 @@ void LLAppViewer::migrateCacheDirectory() #endif // LL_WINDOWS || LL_DARWIN } -bool LLAppViewer::initCache() +//static +S32 LLAppViewer::getCacheVersion() { - mPurgeCache = false; - // Purge cache if user requested it - if (gSavedSettings.getBOOL("PurgeCacheOnStartup") || - gSavedSettings.getBOOL("PurgeCacheOnNextStartup")) + static const S32 cache_version = 7; + + return cache_version ; +} + +void dumpVFSCaches() +{ + llinfos << "======= Static VFS ========" << llendl; + gStaticVFS->listFiles(); +#if LL_WINDOWS + llinfos << "======= Dumping static VFS to StaticVFSDump ========" << llendl; + WCHAR w_str[MAX_PATH]; + GetCurrentDirectory(MAX_PATH, w_str); + S32 res = LLFile::mkdir("StaticVFSDump"); + if (res == -1) { - gSavedSettings.setBOOL("PurgeCacheOnNextStartup", false); - mPurgeCache = true; + if (errno != EEXIST) + { + llwarns << "Couldn't create dir StaticVFSDump" << llendl; + } } - // Purge cache if it belongs to an old version - else + SetCurrentDirectory(utf8str_to_utf16str("StaticVFSDump").c_str()); + gStaticVFS->dumpFiles(); + SetCurrentDirectory(w_str); +#endif + + llinfos << "========= Dynamic VFS ====" << llendl; + gVFS->listFiles(); +#if LL_WINDOWS + llinfos << "========= Dumping dynamic VFS to VFSDump ====" << llendl; + res = LLFile::mkdir("VFSDump"); + if (res == -1) { - static const S32 cache_version = 5; - if (gSavedSettings.getS32("LocalCacheVersion") != cache_version) + if (errno != EEXIST) { - mPurgeCache = true; - gSavedSettings.setS32("LocalCacheVersion", cache_version); + llwarns << "Couldn't create dir VFSDump" << llendl; } } - - // We have moved the location of the cache directory over time. - migrateCacheDirectory(); + SetCurrentDirectory(utf8str_to_utf16str("VFSDump").c_str()); + gVFS->dumpFiles(); + SetCurrentDirectory(w_str); +#endif +} +bool LLAppViewer::initCache() +{ + mPurgeCache = false; + BOOL disable_texture_cache = FALSE ; + BOOL read_only = mSecondInstance ? TRUE : FALSE; + LLAppViewer::getTextureCache()->setReadOnly(read_only) ; - // Setup and verify the cache location - std::string cache_location = gSavedSettings.getString("CacheLocation"); - std::string new_cache_location = gSavedSettings.getString("NewCacheLocation"); - if (new_cache_location != cache_location) + if (gSavedSettings.getS32("LocalCacheVersion") != LLAppViewer::getCacheVersion()) { - gDirUtilp->setCacheDir(gSavedSettings.getString("CacheLocation")); - purgeCache(); // purge old cache - gSavedSettings.setString("CacheLocation", new_cache_location); - gSavedSettings.setString("CacheLocationTopFolder", gDirUtilp->getBaseFileName(new_cache_location)); + if(read_only) + { + disable_texture_cache = TRUE ; //if the cache version of this viewer is different from the running one, this viewer can not use the texture cache. + } + else + { + mPurgeCache = true; // Purge cache if the version number is different. + gSavedSettings.setS32("LocalCacheVersion", LLAppViewer::getCacheVersion()); + } } + + if(!read_only) + { + // Purge cache if user requested it + if (gSavedSettings.getBOOL("PurgeCacheOnStartup") || + gSavedSettings.getBOOL("PurgeCacheOnNextStartup")) + { + gSavedSettings.setBOOL("PurgeCacheOnNextStartup", false); + mPurgeCache = true; + } + // We have moved the location of the cache directory over time. + migrateCacheDirectory(); + + // Setup and verify the cache location + std::string cache_location = gSavedSettings.getString("CacheLocation"); + std::string new_cache_location = gSavedSettings.getString("NewCacheLocation"); + if (new_cache_location != cache_location) + { + gDirUtilp->setCacheDir(gSavedSettings.getString("CacheLocation")); + purgeCache(); // purge old cache + gSavedSettings.setString("CacheLocation", new_cache_location); + gSavedSettings.setString("CacheLocationTopFolder", gDirUtilp->getBaseFileName(new_cache_location)); + } + } + if (!gDirUtilp->setCacheDir(gSavedSettings.getString("CacheLocation"))) { LL_WARNS("AppCache") << "Unable to set cache location" << LL_ENDL; @@ -3039,26 +3083,25 @@ bool LLAppViewer::initCache() gSavedSettings.setString("CacheLocationTopFolder", ""); } - if (mPurgeCache) + if (mPurgeCache && !read_only) { - LLSplashScreen::update("Clearing cache..."); + LLSplashScreen::update(LLTrans::getString("StartupClearingCache")); purgeCache(); } - LLSplashScreen::update("Initializing Texture Cache..."); + LLSplashScreen::update(LLTrans::getString("StartupInitializingTextureCache")); // Init the texture cache - // Allocate 80% of the cache size for textures - BOOL read_only = mSecondInstance ? TRUE : FALSE; + // Allocate 80% of the cache size for textures const S32 MB = 1024*1024; S64 cache_size = (S64)(gSavedSettings.getU32("CacheSize")) * MB; const S64 MAX_CACHE_SIZE = 1024*MB; cache_size = llmin(cache_size, MAX_CACHE_SIZE); S64 texture_cache_size = ((cache_size * 8)/10); - S64 extra = LLAppViewer::getTextureCache()->initCache(LL_PATH_CACHE, texture_cache_size, read_only); + S64 extra = LLAppViewer::getTextureCache()->initCache(LL_PATH_CACHE, texture_cache_size, disable_texture_cache); texture_cache_size -= extra; - LLSplashScreen::update("Initializing VFS..."); + LLSplashScreen::update(LLTrans::getString("StartupInitializingVFS")); // Init the VFS S64 vfs_size = cache_size - texture_cache_size; @@ -3204,6 +3247,14 @@ bool LLAppViewer::initCache() else { LLVFile::initClass(); + +#ifndef LL_RELEASE_FOR_DOWNLOAD + if (gSavedSettings.getBOOL("DumpVFSCaches")) + { + dumpVFSCaches(); + } +#endif + return true; } } @@ -3288,13 +3339,6 @@ void LLAppViewer::badNetworkHandler() mPurgeOnExit = TRUE; -#if LL_WINDOWS - // Generates the minidump. - LLWinDebug::generateCrashStacks(NULL); -#endif - LLAppViewer::handleSyncViewerCrash(); - LLAppViewer::handleViewerCrash(); - std::ostringstream message; message << "The viewer has detected mangled network data indicative\n" @@ -3307,6 +3351,8 @@ void LLAppViewer::badNetworkHandler() "If the problem continues, see the Tech Support FAQ at: \n" "www.secondlife.com/support"; forceDisconnect(message.str()); + + LLApp::instance()->writeMiniDump(); } // This routine may get called more than once during the shutdown process. @@ -3316,10 +3362,10 @@ void LLAppViewer::saveFinalSnapshot() { if (!mSavedFinalSnapshot && !gNoRender) { - gSavedSettings.setVector3d("FocusPosOnLogout", gAgent.calcFocusPositionTargetGlobal()); - gSavedSettings.setVector3d("CameraPosOnLogout", gAgent.calcCameraPositionTargetGlobal()); + gSavedSettings.setVector3d("FocusPosOnLogout", gAgentCamera.calcFocusPositionTargetGlobal()); + gSavedSettings.setVector3d("CameraPosOnLogout", gAgentCamera.calcCameraPositionTargetGlobal()); gViewerWindow->setCursor(UI_CURSOR_WAIT); - gAgent.changeCameraToThirdPerson( FALSE ); // don't animate, need immediate switch + gAgentCamera.changeCameraToThirdPerson( FALSE ); // don't animate, need immediate switch gSavedSettings.setBOOL("ShowParcelOwners", FALSE); idle(); @@ -3599,13 +3645,15 @@ void LLAppViewer::idle() { // Handle pending gesture processing - LLGestureManager::instance().update(); + static LLFastTimer::DeclareTimer ftm("Agent Position"); + LLFastTimer t(ftm); + LLGestureMgr::instance().update(); gAgent.updateAgentPosition(gFrameDTClamped, yaw, current_mouse.mX, current_mouse.mY); } { - LLFastTimer t(FTM_OBJECTLIST_UPDATE); // Actually "object update" + LLFastTimer t(FTM_OBJECTLIST_UPDATE); if (!(logoutRequestSent() && hasSavedFinalSnapshot())) { @@ -3639,6 +3687,8 @@ void LLAppViewer::idle() // { + static LLFastTimer::DeclareTimer ftm("HUD Effects"); + LLFastTimer t(ftm); LLSelectMgr::getInstance()->updateEffects(); LLHUDManager::getInstance()->cleanupEffects(); LLHUDManager::getInstance()->sendEffects(); @@ -3725,7 +3775,7 @@ void LLAppViewer::idle() LLViewerJoystick::getInstance()->moveObjects(); } - gAgent.updateCamera(); + gAgentCamera.updateCamera(); } // update media focus @@ -3823,7 +3873,7 @@ void LLAppViewer::idleShutdown() S32 finished_uploads = total_uploads - pending_uploads; F32 percent = 100.f * finished_uploads / total_uploads; gViewerWindow->setProgressPercent(percent); - gViewerWindow->setProgressString("Saving your settings..."); + gViewerWindow->setProgressString(LLTrans::getString("SavingSettings")); return; } @@ -3835,7 +3885,7 @@ void LLAppViewer::idleShutdown() // Wait for a LogoutReply message gViewerWindow->setShowProgress(TRUE); gViewerWindow->setProgressPercent(100.f); - gViewerWindow->setProgressString("Logging out..."); + gViewerWindow->setProgressString(LLTrans::getString("LoggingOut")); return; } @@ -3863,7 +3913,7 @@ void LLAppViewer::sendLogoutRequest() gLogoutMaxTime = LOGOUT_REQUEST_TIME; mLogoutRequestSent = TRUE; - gVoiceClient->leaveChannel(); + LLVoiceClient::getInstance()->leaveChannel(); //Set internal status variables and marker files gLogoutInProgress = TRUE; @@ -3895,15 +3945,13 @@ void LLAppViewer::sendLogoutRequest() static F32 CheckMessagesMaxTime = CHECK_MESSAGES_DEFAULT_MAX_TIME; #endif -static LLFastTimer::DeclareTimer FTM_IDLE_NETWORK("Network"); +static LLFastTimer::DeclareTimer FTM_IDLE_NETWORK("Idle Network"); void LLAppViewer::idleNetwork() { LLMemType mt_in(LLMemType::MTYPE_IDLE_NETWORK); pingMainloopTimeout("idleNetwork"); - LLError::LLCallStacks::clear() ; - llpushcallstacks ; - + gObjectList.mNumNewObjects = 0; S32 total_decoded = 0; @@ -3913,7 +3961,6 @@ void LLAppViewer::idleNetwork() // deal with any queued name requests and replies. gCacheName->processPending(); - llpushcallstacks ; LLTimer check_message_timer; // Read all available packets from network const S64 frame_count = gFrameCount; // U32->S64 @@ -3983,16 +4030,13 @@ void LLAppViewer::idleNetwork() gPrintMessagesThisFrame = FALSE; } } - llpushcallstacks ; LLViewerStats::getInstance()->mNumNewObjectsStat.addValue(gObjectList.mNumNewObjects); // Retransmit unacknowledged packets. gXferManager->retransmitUnackedPackets(); gAssetStorage->checkForTimeouts(); - llpushcallstacks ; gViewerThrottle.updateDynamicThrottle(); - llpushcallstacks ; // Check that the circuit between the viewer and the agent's current // region is still alive LLViewerRegion *agent_region = gAgent.getRegion(); @@ -4008,7 +4052,6 @@ void LLAppViewer::idleNetwork() mAgentRegionLastID = this_region_id; mAgentRegionLastAlive = this_region_alive; } - llpushcallstacks ; } void LLAppViewer::disconnectViewer() @@ -4059,7 +4102,7 @@ void LLAppViewer::disconnectViewer() LLFloaterInventory::cleanup(); gAgentWearables.cleanup(); - + gAgentCamera.cleanup(); // Also writes cached agent settings to gSavedSettings gAgent.cleanup(); @@ -4283,7 +4326,7 @@ void LLAppViewer::launchUpdater() #endif // *TODO change userserver to be grid on both viewer and sim, since // userserver no longer exists. - query_map["userserver"] = LLViewerLogin::getInstance()->getGridLabel(); + query_map["userserver"] = LLGridManager::getInstance()->getGridLabel(); query_map["channel"] = gSavedSettings.getString("VersionChannelName"); // *TODO constantize this guy // *NOTE: This URL is also used in win_setup/lldownloader.cpp @@ -4296,10 +4339,10 @@ void LLAppViewer::launchUpdater() LLAppViewer::sUpdaterInfo = new LLAppViewer::LLUpdaterInfo() ; // if a sim name was passed in via command line parameter (typically through a SLURL) - if ( LLURLSimString::sInstance.mSimString.length() ) + if ( LLStartUp::getStartSLURL().getType() == LLSLURL::LOCATION ) { // record the location to start at next time - gSavedSettings.setString( "NextLoginLocation", LLURLSimString::sInstance.mSimString ); + gSavedSettings.setString( "NextLoginLocation", LLStartUp::getStartSLURL().getSLURLString()); }; #if LL_WINDOWS diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h index a011c5ebfd..0b862a92a1 100644 --- a/indra/newview/llappviewer.h +++ b/indra/newview/llappviewer.h @@ -36,6 +36,7 @@ #include "llallocator.h" #include "llcontrol.h" #include "llsys.h" // for LLOSInfo +#include "lltimer.h" class LLCommandLineParser; class LLFrameTimer; @@ -91,9 +92,7 @@ public: virtual bool restoreErrorTrap() = 0; // Require platform specific override to reset error handling mechanism. // return false if the error trap needed restoration. virtual void handleCrashReporting(bool reportFreeze = false) = 0; // What to do with crash report? - virtual void handleSyncCrashTrace() = 0; // any low-level crash-prep that has to happen in the context of the crashing thread before the crash report is delivered. static void handleViewerCrash(); // Hey! The viewer crashed. Do this, soon. - static void handleSyncViewerCrash(); // Hey! The viewer crashed. Do this right NOW in the context of the crashing thread. void checkForCrash(); // Thread accessors @@ -101,6 +100,8 @@ public: static LLImageDecodeThread* getImageDecodeThread() { return sImageDecodeThread; } static LLTextureFetch* getTextureFetch() { return sTextureFetch; } + static S32 getCacheVersion() ; + const std::string& getSerialNumber() { return mSerialNumber; } bool getPurgeCache() const { return mPurgeCache; } @@ -190,7 +191,6 @@ private: bool initThreads(); // Initialize viewer threads, return false on failure. bool initConfiguration(); // Initialize settings from the command line/config file. - void initGridChoice(); bool initCache(); // Initialize local client cache. diff --git a/indra/newview/llappviewerlinux.cpp b/indra/newview/llappviewerlinux.cpp index d34bcb4a68..78afdc8995 100644 --- a/indra/newview/llappviewerlinux.cpp +++ b/indra/newview/llappviewerlinux.cpp @@ -46,23 +46,6 @@ #include <exception> -#if LL_LINUX -# include <dlfcn.h> // RTLD_LAZY -# include <execinfo.h> // backtrace - glibc only -#elif LL_SOLARIS -# include <sys/types.h> -# include <unistd.h> -# include <fcntl.h> -# include <ucontext.h> -#endif - -#ifdef LL_ELFBIN -# ifdef __GNUC__ -# include <cxxabi.h> // for symbol demangling -# endif -# include "ELFIO/ELFIO.h" // for better backtraces -#endif - #if LL_DBUS_ENABLED # include "llappviewerlinux_api_dbus.h" @@ -86,7 +69,6 @@ static void exceptionTerminateHandler() // reinstall default terminate() handler in case we re-terminate. if (gOldTerminateHandler) std::set_terminate(gOldTerminateHandler); // treat this like a regular viewer crash, with nice stacktrace etc. - LLAppViewer::handleSyncViewerCrash(); LLAppViewer::handleViewerCrash(); // we've probably been killed-off before now, but... gOldTerminateHandler(); // call old terminate() handler @@ -109,7 +91,6 @@ int main( int argc, char **argv ) gOldTerminateHandler = std::set_terminate(exceptionTerminateHandler); // install crash handlers viewer_app_ptr->setErrorHandler(LLAppViewer::handleViewerCrash); - viewer_app_ptr->setSyncErrorHandler(LLAppViewer::handleSyncViewerCrash); bool ok = viewer_app_ptr->init(); if(!ok) @@ -138,201 +119,6 @@ int main( int argc, char **argv ) return 0; } -#ifdef LL_SOLARIS -static inline BOOL do_basic_glibc_backtrace() -{ - BOOL success = FALSE; - - std::string strace_filename = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"stack_trace.log"); - llinfos << "Opening stack trace file " << strace_filename << llendl; - LLFILE* StraceFile = LLFile::fopen(strace_filename, "w"); - if (!StraceFile) - { - llinfos << "Opening stack trace file " << strace_filename << " failed. Using stderr." << llendl; - StraceFile = stderr; - } - - printstack(fileno(StraceFile)); - - if (StraceFile != stderr) - fclose(StraceFile); - - return success; -} -#else -#define MAX_STACK_TRACE_DEPTH 40 -// This uses glibc's basic built-in stack-trace functions for a not very -// amazing backtrace. -static inline BOOL do_basic_glibc_backtrace() -{ - void *stackarray[MAX_STACK_TRACE_DEPTH]; - size_t size; - char **strings; - size_t i; - BOOL success = FALSE; - - size = backtrace(stackarray, MAX_STACK_TRACE_DEPTH); - strings = backtrace_symbols(stackarray, size); - - std::string strace_filename = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"stack_trace.log"); - llinfos << "Opening stack trace file " << strace_filename << llendl; - LLFILE* StraceFile = LLFile::fopen(strace_filename, "w"); // Flawfinder: ignore - if (!StraceFile) - { - llinfos << "Opening stack trace file " << strace_filename << " failed. Using stderr." << llendl; - StraceFile = stderr; - } - - if (size) - { - for (i = 0; i < size; i++) - { - // the format of the StraceFile is very specific, to allow (kludgy) machine-parsing - fprintf(StraceFile, "%-3lu ", (unsigned long)i); - fprintf(StraceFile, "%-32s\t", "unknown"); - fprintf(StraceFile, "%p ", stackarray[i]); - fprintf(StraceFile, "%s\n", strings[i]); - } - - success = TRUE; - } - - if (StraceFile != stderr) - fclose(StraceFile); - - free (strings); - return success; -} - -#if LL_ELFBIN -// This uses glibc's basic built-in stack-trace functions together with -// ELFIO's ability to parse the .symtab ELF section for better symbol -// extraction without exporting symbols (which'd cause subtle, fatal bugs). -static inline BOOL do_elfio_glibc_backtrace() -{ - void *stackarray[MAX_STACK_TRACE_DEPTH]; - size_t btsize; - char **strings; - BOOL success = FALSE; - - std::string appfilename = gDirUtilp->getExecutablePathAndName(); - - std::string strace_filename = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"stack_trace.log"); - llinfos << "Opening stack trace file " << strace_filename << llendl; - LLFILE* StraceFile = LLFile::fopen(strace_filename, "w"); // Flawfinder: ignore - if (!StraceFile) - { - llinfos << "Opening stack trace file " << strace_filename << " failed. Using stderr." << llendl; - StraceFile = stderr; - } - - // get backtrace address list and basic symbol info - btsize = backtrace(stackarray, MAX_STACK_TRACE_DEPTH); - strings = backtrace_symbols(stackarray, btsize); - - // create ELF reader for our app binary - IELFI* pReader; - const IELFISection* pSec = NULL; - IELFISymbolTable* pSymTbl = 0; - if (ERR_ELFIO_NO_ERROR != ELFIO::GetInstance()->CreateELFI(&pReader) || - ERR_ELFIO_NO_ERROR != pReader->Load(appfilename.c_str()) || - // find symbol table, create reader-object - NULL == (pSec = pReader->GetSection( ".symtab" )) || - ERR_ELFIO_NO_ERROR != pReader->CreateSectionReader(IELFI::ELFI_SYMBOL, pSec, (void**)&pSymTbl) ) - { - // Failed to open our binary and read its symbol table somehow - llinfos << "Could not initialize ELF symbol reading - doing basic backtrace." << llendl; - if (StraceFile != stderr) - fclose(StraceFile); - // note that we may be leaking some of the above ELFIO - // objects now, but it's expected that we'll be dead soon - // and we want to tread delicately until we get *some* kind - // of useful backtrace. - return do_basic_glibc_backtrace(); - } - - // iterate over trace and symtab, looking for plausible symbols - std::string name; - Elf32_Addr value; - Elf32_Word ssize; - unsigned char bind; - unsigned char type; - Elf32_Half section; - int nSymNo = pSymTbl->GetSymbolNum(); - size_t btpos; - for (btpos = 0; btpos < btsize; ++btpos) - { - // the format of the StraceFile is very specific, to allow (kludgy) machine-parsing - fprintf(StraceFile, "%-3ld ", (long)btpos); - int symidx; - for (symidx = 0; symidx < nSymNo; ++symidx) - { - if (ERR_ELFIO_NO_ERROR == - pSymTbl->GetSymbol(symidx, name, value, ssize, - bind, type, section)) - { - // check if trace address within symbol range - if (uintptr_t(stackarray[btpos]) >= value && - uintptr_t(stackarray[btpos]) < value+ssize) - { - // symbol is inside viewer - fprintf(StraceFile, "%-32s\t", "com.secondlife.indra.viewer"); - fprintf(StraceFile, "%p ", stackarray[btpos]); - - char *demangled_str = NULL; - int demangle_result = 1; - demangled_str = - abi::__cxa_demangle - (name.c_str(), NULL, NULL, - &demangle_result); - if (0 == demangle_result && - NULL != demangled_str) { - fprintf(StraceFile, - "%s", demangled_str); - free(demangled_str); - } - else // failed demangle; print it raw - { - fprintf(StraceFile, - "%s", name.c_str()); - } - // print offset from symbol start - fprintf(StraceFile, - " + %lu\n", - uintptr_t(stackarray[btpos]) - - value); - goto got_sym; // early escape - } - } - } - // Fallback: - // Didn't find a suitable symbol in the binary - it's probably - // a symbol in a DSO; use glibc's idea of what it should be. - fprintf(StraceFile, "%-32s\t", "unknown"); - fprintf(StraceFile, "%p ", stackarray[btpos]); - fprintf(StraceFile, "%s\n", strings[btpos]); - got_sym:; - } - - if (StraceFile != stderr) - fclose(StraceFile); - - pSymTbl->Release(); - pSec->Release(); - pReader->Release(); - - free(strings); - - llinfos << "Finished generating stack trace." << llendl; - - success = TRUE; - return success; -} -#endif // LL_ELFBIN - -#endif // LL_SOLARIS - - LLAppViewerLinux::LLAppViewerLinux() { } @@ -541,16 +327,6 @@ bool LLAppViewerLinux::sendURLToOtherInstance(const std::string& url) } #endif // LL_DBUS_ENABLED -void LLAppViewerLinux::handleSyncCrashTrace() -{ - // This backtrace writes into stack_trace.log -# if LL_ELFBIN - do_elfio_glibc_backtrace(); // more useful backtrace -# else - do_basic_glibc_backtrace(); // only slightly useful backtrace -# endif // LL_ELFBIN -} - void LLAppViewerLinux::handleCrashReporting(bool reportFreeze) { std::string cmd =gDirUtilp->getExecutableDir(); @@ -604,7 +380,7 @@ void LLAppViewerLinux::handleCrashReporting(bool reportFreeze) {cmd.c_str(), ask_dialog, "-user", - (char*)LLViewerLogin::getInstance()->getGridLabel().c_str(), + (char*)LLGridManager::getInstance()->getGridLabel().c_str(), "-name", LLAppViewer::instance()->getSecondLifeTitle().c_str(), NULL}; @@ -686,6 +462,8 @@ bool LLAppViewerLinux::beingDebugged() bool LLAppViewerLinux::initLogging() { // Remove the last stack trace, if any + // This file is no longer created, since the move to Google Breakpad + // The code is left here to clean out any old state in the log dir std::string old_stack_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"stack_trace.log"); LLFile::remove(old_stack_file); diff --git a/indra/newview/llappviewerlinux.h b/indra/newview/llappviewerlinux.h index 230c0dc24b..b17380d4d8 100644 --- a/indra/newview/llappviewerlinux.h +++ b/indra/newview/llappviewerlinux.h @@ -68,7 +68,6 @@ protected: virtual bool restoreErrorTrap(); virtual void handleCrashReporting(bool reportFreeze); - virtual void handleSyncCrashTrace(); virtual bool initLogging(); virtual bool initParseCommandLine(LLCommandLineParser& clp); diff --git a/indra/newview/llappviewermacosx.cpp b/indra/newview/llappviewermacosx.cpp index f8f8f50cd6..1e66e55f3d 100644 --- a/indra/newview/llappviewermacosx.cpp +++ b/indra/newview/llappviewermacosx.cpp @@ -44,7 +44,6 @@ #include "llviewernetwork.h" #include "llviewercontrol.h" #include "llmd5.h" -#include "llurlsimstring.h" #include "llfloaterworldmap.h" #include "llurldispatcher.h" #include <Carbon/Carbon.h> @@ -265,11 +264,6 @@ bool LLAppViewerMacOSX::restoreErrorTrap() return reset_count == 0; } -void LLAppViewerMacOSX::handleSyncCrashTrace() -{ - // do nothing -} - static OSStatus CarbonEventHandler(EventHandlerCallRef inHandlerCallRef, EventRef inEvent, void* inUserData) @@ -291,6 +285,7 @@ static OSStatus CarbonEventHandler(EventHandlerCallRef inHandlerCallRef, if(os_result >= 0 && matching_psn) { sCrashReporterIsRunning = false; + QuitApplicationEventLoop(); } } return noErr; @@ -326,7 +321,7 @@ void LLAppViewerMacOSX::handleCrashReporting(bool reportFreeze) // *NOTE:Mani A better way - make a copy of the data that the crash reporter will send // and let SL go about its business. This way makes the mac work like windows and linux // and is the smallest patch for the issue. - sCrashReporterIsRunning = true; + sCrashReporterIsRunning = false; ProcessSerialNumber o_psn; static EventHandlerRef sCarbonEventsRef = NULL; @@ -356,15 +351,13 @@ void LLAppViewerMacOSX::handleCrashReporting(bool reportFreeze) if(os_result >= 0) { - EventRecord evt; - while(sCrashReporterIsRunning) - { - while(WaitNextEvent(osMask, &evt, 0, NULL)) - { - // null op!?! - } - } - } + sCrashReporterIsRunning = true; + } + + while(sCrashReporterIsRunning) + { + RunApplicationEventLoop(); + } // Re-install the apps quit handler. AEInstallEventHandler(kCoreEventClass, @@ -386,33 +379,6 @@ void LLAppViewerMacOSX::handleCrashReporting(bool reportFreeze) } } - - if(!reportFreeze) - { - _exit(1); - } - - // TODO:palmer REMOVE THIS VERY SOON. THIS WILL NOT BE IN VIEWER 2.0 - // Remove the crash stack log from previous executions. - // Since we've started logging a new instance of the app, we can assume - // The old crash stack is invalid for the next crash report. - char path[MAX_PATH]; - FSRef folder; - if(FSFindFolder(kUserDomain, kLogsFolderType, false, &folder) == noErr) - { - // folder is an FSRef to ~/Library/Logs/ - if(FSRefMakePath(&folder, (UInt8*)&path, sizeof(path)) == noErr) - { - std::string pathname = std::string(path) + std::string("/CrashReporter/"); - std::string mask = "Second Life*"; - std::string file_name; - while(gDirUtilp->getNextFileInDir(pathname, mask, file_name, false)) - { - LLFile::remove(pathname + file_name); - } - } - } - } std::string LLAppViewerMacOSX::generateSerialNumber() @@ -448,16 +414,17 @@ std::string LLAppViewerMacOSX::generateSerialNumber() static AudioDeviceID get_default_audio_output_device(void) { AudioDeviceID device = 0; - UInt32 size; - OSStatus err; - - size = sizeof(device); - err = AudioHardwareGetProperty(kAudioHardwarePropertyDefaultOutputDevice, &size, &device); + UInt32 size = sizeof(device); + AudioObjectPropertyAddress device_address = { kAudioHardwarePropertyDefaultOutputDevice, + kAudioObjectPropertyScopeGlobal, + kAudioObjectPropertyElementMaster }; + + OSStatus err = AudioObjectGetPropertyData(kAudioObjectSystemObject, &device_address, 0, NULL, &size, &device); if(err != noErr) { LL_DEBUGS("SystemMute") << "Couldn't get default audio output device (0x" << std::hex << err << ")" << LL_ENDL; } - + return device; } @@ -465,11 +432,15 @@ static AudioDeviceID get_default_audio_output_device(void) void LLAppViewerMacOSX::setMasterSystemAudioMute(bool new_mute) { AudioDeviceID device = get_default_audio_output_device(); - + if(device != 0) { UInt32 mute = new_mute; - OSStatus err = AudioDeviceSetProperty(device, NULL, 0, false, kAudioDevicePropertyMute, sizeof(mute), &mute); + AudioObjectPropertyAddress device_address = { kAudioDevicePropertyMute, + kAudioDevicePropertyScopeOutput, + kAudioObjectPropertyElementMaster }; + + OSStatus err = AudioObjectSetPropertyData(device, &device_address, 0, NULL, sizeof(mute), &mute); if(err != noErr) { LL_INFOS("SystemMute") << "Couldn't set audio mute property (0x" << std::hex << err << ")" << LL_ENDL; @@ -482,13 +453,17 @@ bool LLAppViewerMacOSX::getMasterSystemAudioMute() { // Assume the system isn't muted UInt32 mute = 0; - + AudioDeviceID device = get_default_audio_output_device(); - + if(device != 0) { UInt32 size = sizeof(mute); - OSStatus err = AudioDeviceGetProperty(device, 0, false, kAudioDevicePropertyMute, &size, &mute); + AudioObjectPropertyAddress device_address = { kAudioDevicePropertyMute, + kAudioDevicePropertyScopeOutput, + kAudioObjectPropertyElementMaster }; + + OSStatus err = AudioObjectGetPropertyData(device, &device_address, 0, NULL, &size, &mute); if(err != noErr) { LL_DEBUGS("SystemMute") << "Couldn't get audio mute property (0x" << std::hex << err << ")" << LL_ENDL; diff --git a/indra/newview/llappviewermacosx.h b/indra/newview/llappviewermacosx.h index cbf7e6c209..3d7bb55556 100644 --- a/indra/newview/llappviewermacosx.h +++ b/indra/newview/llappviewermacosx.h @@ -55,7 +55,6 @@ public: protected: virtual bool restoreErrorTrap(); virtual void handleCrashReporting(bool reportFreeze); - virtual void handleSyncCrashTrace(); std::string generateSerialNumber(); virtual bool initParseCommandLine(LLCommandLineParser& clp); diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp index 12cff32780..e3ef04d03d 100644 --- a/indra/newview/llappviewerwin32.cpp +++ b/indra/newview/llappviewerwin32.cpp @@ -57,8 +57,6 @@ #include "llweb.h" #include "llsecondlifeurls.h" -#include "llwindebug.h" - #include "llviewernetwork.h" #include "llmd5.h" #include "llfindlocale.h" @@ -81,51 +79,6 @@ extern "C" { const std::string LLAppViewerWin32::sWindowClass = "Second Life"; -LONG WINAPI viewer_windows_exception_handler(struct _EXCEPTION_POINTERS *exception_infop) -{ - // *NOTE:Mani - this code is stolen from LLApp, where its never actually used. - //OSMessageBox("Attach Debugger Now", "Error", OSMB_OK); - // *TODO: Translate the signals/exceptions into cross-platform stuff - // Windows implementation - _tprintf( _T("Entering Windows Exception Handler...\n") ); - llinfos << "Entering Windows Exception Handler..." << llendl; - - // Make sure the user sees something to indicate that the app crashed. - LONG retval; - - if (LLApp::isError()) - { - _tprintf( _T("Got another fatal signal while in the error handler, die now!\n") ); - llwarns << "Got another fatal signal while in the error handler, die now!" << llendl; - - retval = EXCEPTION_EXECUTE_HANDLER; - return retval; - } - - // Generate a minidump if we can. - // Before we wake the error thread... - // Which will start the crash reporting. - LLWinDebug::generateCrashStacks(exception_infop); - - // Flag status to error, so thread_error starts its work - LLApp::setError(); - - // Block in the exception handler until the app has stopped - // This is pretty sketchy, but appears to work just fine - while (!LLApp::isStopped()) - { - ms_sleep(10); - } - - // - // At this point, we always want to exit the app. There's no graceful - // recovery for an unhandled exception. - // - // Just kill the process. - retval = EXCEPTION_EXECUTE_HANDLER; - return retval; -} - // Create app mutex creates a unique global windows object. // If the object can be created it returns true, otherwise // it returns false. The false result can be used to determine @@ -191,8 +144,6 @@ int APIENTRY WINMAIN(HINSTANCE hInstance, gIconResource = MAKEINTRESOURCE(IDI_LL_ICON); LLAppViewerWin32* viewer_app_ptr = new LLAppViewerWin32(lpCmdLine); - - LLWinDebug::initExceptionHandler(viewer_windows_exception_handler); viewer_app_ptr->setErrorHandler(LLAppViewer::handleViewerCrash); @@ -405,12 +356,6 @@ bool LLAppViewerWin32::cleanup() bool LLAppViewerWin32::initLogging() { - // Remove the crash stack log from previous executions. - // Since we've started logging a new instance of the app, we can assume - // *NOTE: This should happen before the we send a 'previous instance froze' - // crash report, but it must happen after we initialize the DirUtil. - LLWinDebug::clearCrashStacks(); - return LLAppViewer::initLogging(); } @@ -469,7 +414,7 @@ bool LLAppViewerWin32::initHardwareTest() if (OSBTN_NO== button) { LL_INFOS("AppInit") << "User quitting after failed DirectX 9 detection" << LL_ENDL; - LLWeb::loadURLExternal(DIRECTX_9_URL); + LLWeb::loadURLExternal(DIRECTX_9_URL, false); return false; } gWarningSettings.setBOOL("AboutDirectX9", FALSE); @@ -480,10 +425,12 @@ bool LLAppViewerWin32::initHardwareTest() gSavedSettings.setBOOL("ProbeHardwareOnStartup", FALSE); // Disable so debugger can work - std::ostringstream splash_msg; - splash_msg << LLTrans::getString("StartupLoading") << " " << LLAppViewer::instance()->getSecondLifeTitle() << "..."; + std::string splash_msg; + LLStringUtil::format_map_t args; + args["[APP_NAME]"] = LLAppViewer::instance()->getSecondLifeTitle(); + splash_msg = LLTrans::getString("StartupLoading", args); - LLSplashScreen::update(splash_msg.str()); + LLSplashScreen::update(splash_msg); } if (!restoreErrorTrap()) @@ -527,13 +474,9 @@ bool LLAppViewerWin32::initParseCommandLine(LLCommandLineParser& clp) } bool LLAppViewerWin32::restoreErrorTrap() -{ - return LLWinDebug::checkExceptionHandler(); -} - -void LLAppViewerWin32::handleSyncCrashTrace() -{ - // do nothing +{ + return true; + //return LLWinDebug::checkExceptionHandler(); } void LLAppViewerWin32::handleCrashReporting(bool reportFreeze) diff --git a/indra/newview/llappviewerwin32.h b/indra/newview/llappviewerwin32.h index 13454edeec..52dcc583a4 100644 --- a/indra/newview/llappviewerwin32.h +++ b/indra/newview/llappviewerwin32.h @@ -57,7 +57,6 @@ protected: virtual bool restoreErrorTrap(); virtual void handleCrashReporting(bool reportFreeze); - virtual void handleSyncCrashTrace(); virtual bool sendURLToOtherInstance(const std::string& url); diff --git a/indra/newview/llassetuploadresponders.cpp b/indra/newview/llassetuploadresponders.cpp index a2322e28b4..116c4cafc2 100644 --- a/indra/newview/llassetuploadresponders.cpp +++ b/indra/newview/llassetuploadresponders.cpp @@ -37,8 +37,9 @@ // viewer includes #include "llagent.h" #include "llcompilequeue.h" -#include "llfloaterbuycurrency.h" +#include "llbuycurrencyhtml.h" #include "llfilepicker.h" +#include "llinventorydefines.h" #include "llinventoryobserver.h" #include "llinventorypanel.h" #include "llpermissionsflags.h" @@ -55,6 +56,7 @@ #include "llviewermenufile.h" #include "llviewerwindow.h" #include "lltexlayer.h" +#include "lltrans.h" // library includes #include "lldir.h" @@ -181,7 +183,10 @@ void LLAssetUploadResponder::uploadFailure(const LLSD& content) // deal with L$ errors if (reason == "insufficient funds") { - LLFloaterBuyCurrency::buyCurrency("Uploading costs", LLGlobalEconomy::Singleton::getInstance()->getPriceUpload()); + S32 price = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(); + LLStringUtil::format_map_t args; + args["AMOUNT"] = llformat("%d", price); + LLBuyCurrencyHTML::openCurrencyFloater( LLTrans::getString("uploading_costs", args), price ); } else { @@ -278,7 +283,7 @@ void LLNewAgentInventoryResponder::uploadComplete(const LLSD& content) mPostData["name"].asString(), mPostData["description"].asString(), LLSaleInfo::DEFAULT, - LLInventoryItem::II_FLAGS_NONE, + LLInventoryItemFlags::II_FLAGS_NONE, creation_date_now); gInventory.updateItem(item); gInventory.notifyObservers(); @@ -473,10 +478,10 @@ void LLUpdateAgentInventoryResponder::uploadComplete(const LLSD& content) { // If this gesture is active, then we need to update the in-memory // active map with the new pointer. - if (LLGestureManager::instance().isGestureActive(item_id)) + if (LLGestureMgr::instance().isGestureActive(item_id)) { LLUUID asset_id = new_item->getAssetUUID(); - LLGestureManager::instance().replaceGesture(item_id, asset_id); + LLGestureMgr::instance().replaceGesture(item_id, asset_id); gInventory.notifyObservers(); } diff --git a/indra/newview/llassetuploadresponders.h b/indra/newview/llassetuploadresponders.h index e656351305..91fb39916d 100644 --- a/indra/newview/llassetuploadresponders.h +++ b/indra/newview/llassetuploadresponders.h @@ -72,7 +72,7 @@ public: virtual void uploadComplete(const LLSD& content); }; -class LLBakedUploadData; +struct LLBakedUploadData; class LLSendTexLayerResponder : public LLAssetUploadResponder { public: diff --git a/indra/newview/llaudiosourcevo.cpp b/indra/newview/llaudiosourcevo.cpp index 5e71e64b2f..50363ea2e7 100644 --- a/indra/newview/llaudiosourcevo.cpp +++ b/indra/newview/llaudiosourcevo.cpp @@ -35,7 +35,7 @@ #include "llaudiosourcevo.h" -#include "llagent.h" +#include "llagentcamera.h" #include "llmutelist.h" #include "llviewerparcelmgr.h" @@ -148,7 +148,7 @@ void LLAudioSourceVO::update() updateGain(); if (mObjectp->isHUDAttachment()) { - mPositionGlobal = gAgent.getCameraPositionGlobal(); + mPositionGlobal = gAgentCamera.getCameraPositionGlobal(); } else { diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp index bd987eac77..5bc3b3ac8d 100644 --- a/indra/newview/llavataractions.cpp +++ b/indra/newview/llavataractions.cpp @@ -35,6 +35,8 @@ #include "llavataractions.h" +#include "boost/lambda/lambda.hpp" // for lambda::constant + #include "llsd.h" #include "lldarray.h" #include "llnotifications.h" @@ -46,13 +48,18 @@ #include "llappviewer.h" // for gLastVersionChannel #include "llcachename.h" #include "llcallingcard.h" // for LLAvatarTracker +#include "llfloateravatarpicker.h" // for LLFloaterAvatarPicker #include "llfloatergroupinvite.h" #include "llfloatergroups.h" #include "llfloaterreg.h" #include "llfloaterpay.h" +#include "llfloaterworldmap.h" +#include "llgiveinventory.h" #include "llinventorymodel.h" // for gInventory.findCategoryUUIDForType +#include "llinventorypanel.h" #include "llimview.h" // for gIMMgr #include "llmutelist.h" +#include "llnotificationsutil.h" // for LLNotificationsUtil #include "llrecentpeople.h" #include "llsidetray.h" #include "lltrans.h" @@ -112,13 +119,13 @@ void LLAvatarActions::removeFriendDialog(const LLUUID& id) if (id.isNull()) return; - std::vector<LLUUID> ids; + uuid_vec_t ids; ids.push_back(id); removeFriendsDialog(ids); } // static -void LLAvatarActions::removeFriendsDialog(const std::vector<LLUUID>& ids) +void LLAvatarActions::removeFriendsDialog(const uuid_vec_t& ids) { if(ids.size() == 0) return; @@ -143,7 +150,7 @@ void LLAvatarActions::removeFriendsDialog(const std::vector<LLUUID>& ids) } LLSD payload; - for (std::vector<LLUUID>::const_iterator it = ids.begin(); it != ids.end(); ++it) + for (uuid_vec_t::const_iterator it = ids.begin(); it != ids.end(); ++it) { payload["ids"].append(*it); } @@ -160,13 +167,21 @@ void LLAvatarActions::offerTeleport(const LLUUID& invitee) if (invitee.isNull()) return; + //waiting until Name Cache gets updated with corresponding avatar name + std::string just_to_request_name; + if (!gCacheName->getFullName(invitee, just_to_request_name)) + { + gCacheName->get(invitee, FALSE, boost::bind((void (*)(const LLUUID&)) &LLAvatarActions::offerTeleport, invitee)); + return; + } + LLDynamicArray<LLUUID> ids; ids.push_back(invitee); offerTeleport(ids); } // static -void LLAvatarActions::offerTeleport(const std::vector<LLUUID>& ids) +void LLAvatarActions::offerTeleport(const uuid_vec_t& ids) { if (ids.size() == 0) return; @@ -181,7 +196,12 @@ void LLAvatarActions::startIM(const LLUUID& id) return; std::string name; - gCacheName->getFullName(id, name); + if (!gCacheName->getFullName(id, name)) + { + gCacheName->get(id, FALSE, boost::bind(&LLAvatarActions::startIM, id)); + return; + } + LLUUID session_id = gIMMgr->addSession(name, IM_NOTHING_SPECIAL, id); if (session_id != LLUUID::null) { @@ -222,7 +242,7 @@ void LLAvatarActions::startCall(const LLUUID& id) } // static -void LLAvatarActions::startAdhocCall(const std::vector<LLUUID>& ids) +void LLAvatarActions::startAdhocCall(const uuid_vec_t& ids) { if (ids.size() == 0) { @@ -231,7 +251,7 @@ void LLAvatarActions::startAdhocCall(const std::vector<LLUUID>& ids) // convert vector into LLDynamicArray for addSession LLDynamicArray<LLUUID> id_array; - for (std::vector<LLUUID>::const_iterator it = ids.begin(); it != ids.end(); ++it) + for (uuid_vec_t::const_iterator it = ids.begin(); it != ids.end(); ++it) { id_array.push_back(*it); } @@ -268,15 +288,15 @@ bool LLAvatarActions::isCalling(const LLUUID &id) //static bool LLAvatarActions::canCall() { - return LLVoiceClient::voiceEnabled() && gVoiceClient->voiceWorking(); + return LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking(); } // static -void LLAvatarActions::startConference(const std::vector<LLUUID>& ids) +void LLAvatarActions::startConference(const uuid_vec_t& ids) { // *HACK: Copy into dynamic array LLDynamicArray<LLUUID> id_array; - for (std::vector<LLUUID>::const_iterator it = ids.begin(); it != ids.end(); ++it) + for (uuid_vec_t::const_iterator it = ids.begin(); it != ids.end(); ++it) { id_array.push_back(*it); } @@ -312,6 +332,20 @@ void LLAvatarActions::showProfile(const LLUUID& id) } // static +void LLAvatarActions::showOnMap(const LLUUID& id) +{ + std::string name; + if (!gCacheName->getFullName(id, name)) + { + gCacheName->get(id, FALSE, boost::bind(&LLAvatarActions::showOnMap, id)); + return; + } + + gFloaterWorldMap->trackAvatar(id, name); + LLFloaterReg::showInstance("world_map"); +} + +// static void LLAvatarActions::pay(const LLUUID& id) { LLNotification::Params params("BusyModePay"); @@ -397,6 +431,234 @@ void LLAvatarActions::share(const LLUUID& id) } } +namespace action_give_inventory +{ + typedef std::set<LLUUID> uuid_set_t; + + /** + * Checks My Inventory visibility. + */ + static bool is_give_inventory_acceptable() + { + LLInventoryPanel* active_panel = LLInventoryPanel::getActiveInventoryPanel(FALSE); + if (NULL == active_panel) return false; + + // check selection in the panel + const uuid_set_t inventory_selected_uuids = active_panel->getRootFolder()->getSelectionList(); + if (inventory_selected_uuids.empty()) return false; // nothing selected + + bool acceptable = false; + uuid_set_t::const_iterator it = inventory_selected_uuids.begin(); + const uuid_set_t::const_iterator it_end = inventory_selected_uuids.end(); + for (; it != it_end; ++it) + { + LLViewerInventoryCategory* inv_cat = gInventory.getCategory(*it); + // any category can be offered. + if (inv_cat) + { + acceptable = true; + continue; + } + + LLViewerInventoryItem* inv_item = gInventory.getItem(*it); + // check if inventory item can be given + if (LLGiveInventory::isInventoryGiveAcceptable(inv_item)) + { + acceptable = true; + continue; + } + + // there are neither item nor category in inventory + acceptable = false; + break; + } + return acceptable; + } + + static void build_residents_string(const std::vector<std::string>& avatar_names, std::string& residents_string) + { + llassert(avatar_names.size() > 0); + + const std::string& separator = LLTrans::getString("words_separator"); + for (std::vector<std::string>::const_iterator it = avatar_names.begin(); ; ) + { + residents_string.append(*it); + if (++it == avatar_names.end()) + { + break; + } + residents_string.append(separator); + } + } + + static void build_items_string(const uuid_set_t& inventory_selected_uuids , std::string& items_string) + { + llassert(inventory_selected_uuids.size() > 0); + + const std::string& separator = LLTrans::getString("words_separator"); + for (uuid_set_t::const_iterator it = inventory_selected_uuids.begin(); ; ) + { + LLViewerInventoryCategory* inv_cat = gInventory.getCategory(*it); + if (NULL != inv_cat) + { + items_string = inv_cat->getName(); + break; + } + LLViewerInventoryItem* inv_item = gInventory.getItem(*it); + if (NULL != inv_item) + { + items_string.append(inv_item->getName()); + } + if(++it == inventory_selected_uuids.end()) + { + break; + } + items_string.append(separator); + } + } + + struct LLShareInfo : public LLSingleton<LLShareInfo> + { + std::vector<std::string> mAvatarNames; + uuid_vec_t mAvatarUuids; + }; + + static void give_inventory_cb(const LLSD& notification, const LLSD& response) + { + S32 option = LLNotificationsUtil::getSelectedOption(notification, response); + // if Cancel pressed + if (option == 1) + { + return; + } + + LLInventoryPanel* active_panel = LLInventoryPanel::getActiveInventoryPanel(FALSE); + if (NULL == active_panel) + { + return; + } + + const uuid_set_t inventory_selected_uuids = active_panel->getRootFolder()->getSelectionList(); + if (inventory_selected_uuids.empty()) + { + return; + } + + S32 count = LLShareInfo::instance().mAvatarNames.size(); + bool shared = false; + + // iterate through avatars + for(S32 i = 0; i < count; ++i) + { + const LLUUID& avatar_uuid = LLShareInfo::instance().mAvatarUuids[i]; + + // We souldn't open IM session, just calculate session ID for logging purpose. See EXT-6710 + const LLUUID session_id = gIMMgr->computeSessionID(IM_NOTHING_SPECIAL, avatar_uuid); + + uuid_set_t::const_iterator it = inventory_selected_uuids.begin(); + const uuid_set_t::const_iterator it_end = inventory_selected_uuids.end(); + + const std::string& separator = LLTrans::getString("words_separator"); + std::string noncopy_item_names; + LLSD noncopy_items = LLSD::emptyArray(); + // iterate through selected inventory objects + for (; it != it_end; ++it) + { + LLViewerInventoryCategory* inv_cat = gInventory.getCategory(*it); + if (inv_cat) + { + LLGiveInventory::doGiveInventoryCategory(avatar_uuid, inv_cat, session_id); + shared = true; + break; + } + LLViewerInventoryItem* inv_item = gInventory.getItem(*it); + if (!inv_item->getPermissions().allowCopyBy(gAgentID)) + { + if (!noncopy_item_names.empty()) + { + noncopy_item_names.append(separator); + } + noncopy_item_names.append(inv_item->getName()); + noncopy_items.append(*it); + } + else + { + LLGiveInventory::doGiveInventoryItem(avatar_uuid, inv_item, session_id); + shared = true; + } + } + if (noncopy_items.beginArray() != noncopy_items.endArray()) + { + LLSD substitutions; + substitutions["ITEMS"] = noncopy_item_names; + LLSD payload; + payload["agent_id"] = avatar_uuid; + payload["items"] = noncopy_items; + LLNotificationsUtil::add("CannotCopyWarning", substitutions, payload, + &LLGiveInventory::handleCopyProtectedItem); + break; + } + } + if (shared) + { + LLFloaterReg::hideInstance("avatar_picker"); + LLNotificationsUtil::add("ItemsShared"); + } + } + + /** + * Performs "give inventory" operations for provided avatars. + * + * Sends one requests to give all selected inventory items for each passed avatar. + * Avatars are represent by two vectors: names and UUIDs which must be sychronized with each other. + * + * @param avatar_names - avatar names request to be sent. + * @param avatar_uuids - avatar names request to be sent. + */ + static void give_inventory(const std::vector<std::string>& avatar_names, const uuid_vec_t& avatar_uuids) + { + llassert(avatar_names.size() == avatar_uuids.size()); + + + LLInventoryPanel* active_panel = LLInventoryPanel::getActiveInventoryPanel(FALSE); + if (NULL == active_panel) + { + return; + } + + const uuid_set_t inventory_selected_uuids = active_panel->getRootFolder()->getSelectionList(); + if (inventory_selected_uuids.empty()) + { + return; + } + + std::string residents; + build_residents_string(avatar_names, residents); + + std::string items; + build_items_string(inventory_selected_uuids, items); + + LLSD substitutions; + substitutions["RESIDENTS"] = residents; + substitutions["ITEMS"] = items; + LLShareInfo::instance().mAvatarNames = avatar_names; + LLShareInfo::instance().mAvatarUuids = avatar_uuids; + LLNotificationsUtil::add("ShareItemsConfirmation", substitutions, LLSD(), &give_inventory_cb); + } +} + +//static +void LLAvatarActions::shareWithAvatars() +{ + using namespace action_give_inventory; + + LLFloaterAvatarPicker* picker = + LLFloaterAvatarPicker::show(boost::bind(give_inventory, _1, _2), TRUE, FALSE); + picker->setOkBtnEnableCb(boost::bind(is_give_inventory_acceptable)); + picker->openFriendsTab(); + LLNotificationsUtil::add("ShareNotification"); +} + // static void LLAvatarActions::toggleBlock(const LLUUID& id) { @@ -414,6 +676,20 @@ void LLAvatarActions::toggleBlock(const LLUUID& id) LLMuteList::getInstance()->add(mute); } } +// static +bool LLAvatarActions::canOfferTeleport(const LLUUID& id) +{ + // First use LLAvatarTracker::isBuddy() + // If LLAvatarTracker::instance().isBuddyOnline function only is used + // then for avatars that are online and not a friend it will return false. + // But we should give an ability to offer a teleport for such avatars. + if(LLAvatarTracker::instance().isBuddy(id)) + { + return LLAvatarTracker::instance().isBuddyOnline(id); + } + + return true; +} void LLAvatarActions::inviteToGroup(const LLUUID& id) { @@ -479,7 +755,7 @@ bool LLAvatarActions::handlePay(const LLSD& notification, const LLSD& response, // static void LLAvatarActions::callback_invite_to_group(LLUUID group_id, LLUUID id) { - std::vector<LLUUID> agent_ids; + uuid_vec_t agent_ids; agent_ids.push_back(id); LLFloaterGroupInvite::showForGroup(group_id, &agent_ids); diff --git a/indra/newview/llavataractions.h b/indra/newview/llavataractions.h index 16a58718a2..d106a83eea 100644 --- a/indra/newview/llavataractions.h +++ b/indra/newview/llavataractions.h @@ -60,13 +60,13 @@ public: * Show a friend removal dialog. */ static void removeFriendDialog(const LLUUID& id); - static void removeFriendsDialog(const std::vector<LLUUID>& ids); + static void removeFriendsDialog(const uuid_vec_t& ids); /** * Show teleport offer dialog. */ static void offerTeleport(const LLUUID& invitee); - static void offerTeleport(const std::vector<LLUUID>& ids); + static void offerTeleport(const uuid_vec_t& ids); /** * Start instant messaging session. @@ -86,12 +86,12 @@ public: /** * Start an ad-hoc conference voice call with multiple users */ - static void startAdhocCall(const std::vector<LLUUID>& ids); + static void startAdhocCall(const uuid_vec_t& ids); /** * Start conference chat with the given avatars. */ - static void startConference(const std::vector<LLUUID>& ids); + static void startConference(const uuid_vec_t& ids); /** * Show avatar profile. @@ -99,6 +99,11 @@ public: static void showProfile(const LLUUID& id); /** + * Show avatar on world map. + */ + static void showOnMap(const LLUUID& id); + + /** * Give money to the avatar. */ static void pay(const LLUUID& id); @@ -109,6 +114,11 @@ public: static void share(const LLUUID& id); /** + * Share items with the picked avatars. + */ + static void shareWithAvatars(); + + /** * Block/unblock the avatar. */ static void toggleBlock(const LLUUID& id); @@ -166,6 +176,12 @@ public: */ static void csr(const LLUUID& id, std::string name); + /** + * Checks whether can offer teleport to the avatar + * Can't offer only for offline friends + */ + static bool canOfferTeleport(const LLUUID& id); + private: static bool callbackAddFriend(const LLSD& notification, const LLSD& response); diff --git a/indra/newview/llavatariconctrl.cpp b/indra/newview/llavatariconctrl.cpp index 87b8d807c4..abb79b53a7 100644 --- a/indra/newview/llavatariconctrl.cpp +++ b/indra/newview/llavatariconctrl.cpp @@ -244,7 +244,10 @@ void LLAvatarIconCtrl::setValue(const LLSD& value) LLIconCtrl::setValue(value); } - gCacheName->get(mAvatarId, FALSE, boost::bind(&LLAvatarIconCtrl::nameUpdatedCallback, this, _1, _2, _3, _4)); + if (gCacheName) + { + gCacheName->get(mAvatarId, FALSE, boost::bind(&LLAvatarIconCtrl::nameUpdatedCallback, this, _1, _2, _3, _4)); + } } bool LLAvatarIconCtrl::updateFromCache() diff --git a/indra/newview/llavatarlist.cpp b/indra/newview/llavatarlist.cpp index 6784e6693b..3275d784a3 100644 --- a/indra/newview/llavatarlist.cpp +++ b/indra/newview/llavatarlist.cpp @@ -33,12 +33,22 @@ #include "llviewerprecompiledheaders.h" #include "llavatarlist.h" -#include "llagentdata.h" // for comparator + +// common +#include "lltrans.h" +#include "llcommonutils.h" + +// llui +#include "lltextutil.h" // newview +#include "llagentdata.h" // for comparator +#include "llavatariconctrl.h" #include "llcallingcard.h" // for LLAvatarTracker #include "llcachename.h" +#include "lllistcontextmenu.h" #include "llrecentpeople.h" +#include "lluuid.h" #include "llvoiceclient.h" #include "llviewercontrol.h" // for gSavedSettings @@ -53,7 +63,7 @@ static const unsigned ADD_LIMIT = 50; bool LLAvatarList::contains(const LLUUID& id) { - const uuid_vector_t& ids = getIDs(); + const uuid_vec_t& ids = getIDs(); return std::find(ids.begin(), ids.end(), id) != ids.end(); } @@ -107,7 +117,7 @@ LLAvatarList::Params::Params() } LLAvatarList::LLAvatarList(const Params& p) -: LLFlatListView(p) +: LLFlatListViewEx(p) , mIgnoreOnlineStatus(p.ignore_online_status) , mShowLastInteractionTime(p.show_last_interaction_time) , mContextMenu(NULL) @@ -148,7 +158,7 @@ void LLAvatarList::draw() // *NOTE dzaporozhan // Call refresh() after draw() to avoid flickering of avatar list items. - LLFlatListView::draw(); + LLFlatListViewEx::draw(); if (mDirty) refresh(); @@ -165,14 +175,20 @@ void LLAvatarList::clear() { getIDs().clear(); setDirty(true); - LLFlatListView::clear(); + LLFlatListViewEx::clear(); } void LLAvatarList::setNameFilter(const std::string& filter) { - if (mNameFilter != filter) + std::string filter_upper = filter; + LLStringUtil::toUpper(filter_upper); + if (mNameFilter != filter_upper) { - mNameFilter = filter; + mNameFilter = filter_upper; + + // update message for empty state here instead of refresh() to avoid blinking when switch + // between tabs. + updateNoItemsMessage(filter); setDirty(); } } @@ -183,6 +199,27 @@ void LLAvatarList::sortByName() sort(); } +void LLAvatarList::setDirty(bool val /*= true*/, bool force_refresh /*= false*/) +{ + mDirty = val; + if(mDirty && force_refresh) + { + refresh(); + } +} + +void LLAvatarList::addAvalineItem(const LLUUID& item_id, const LLUUID& session_id, const std::string& item_name) +{ + LL_DEBUGS("Avaline") << "Adding avaline item into the list: " << item_name << "|" << item_id << ", session: " << session_id << LL_ENDL; + LLAvalineListItem* item = new LLAvalineListItem; + item->setAvatarId(item_id, session_id, true, false); + item->setName(item_name); + + addItem(item, item_id); + mIDs.push_back(item_id); + sort(); +} + ////////////////////////////////////////////////////////////////////////// // PROTECTED SECTION ////////////////////////////////////////////////////////////////////////// @@ -195,17 +232,17 @@ void LLAvatarList::refresh() bool have_filter = !mNameFilter.empty(); // Save selection. - std::vector<LLUUID> selected_ids; + uuid_vec_t selected_ids; getSelectedUUIDs(selected_ids); LLUUID current_id = getSelectedUUID(); // Determine what to add and what to remove. - std::vector<LLUUID> added, removed; + uuid_vec_t added, removed; LLAvatarList::computeDifference(getIDs(), added, removed); // Handle added items. unsigned nadded = 0; - for (std::vector<LLUUID>::const_iterator it=added.begin(); it != added.end(); it++) + for (uuid_vec_t::const_iterator it=added.begin(); it != added.end(); it++) { std::string name; const LLUUID& buddy_id = *it; @@ -227,7 +264,7 @@ void LLAvatarList::refresh() } // Handle removed items. - for (std::vector<LLUUID>::const_iterator it=removed.begin(); it != removed.end(); it++) + for (uuid_vec_t::const_iterator it=removed.begin(); it != removed.end(); it++) { removeItemByUUID(*it); modified = true; @@ -282,9 +319,7 @@ void LLAvatarList::refresh() } // Send refresh_complete signal. - std::vector<LLSD> cur_values; - getValues(cur_values); - mRefreshCompleteSignal(this, LLSD((S32)cur_values.size())); + mRefreshCompleteSignal(this, LLSD((S32)size(false))); } // Commit if we've added/removed items. @@ -294,9 +329,9 @@ void LLAvatarList::refresh() bool LLAvatarList::filterHasMatches() { - uuid_vector_t values = getIDs(); + uuid_vec_t values = getIDs(); - for (uuid_vector_t::const_iterator it=values.begin(); it != values.end(); it++) + for (uuid_vec_t::const_iterator it=values.begin(); it != values.end(); it++) { std::string name; const LLUUID& buddy_id = *it; @@ -325,11 +360,22 @@ boost::signals2::connection LLAvatarList::setItemDoubleClickCallback(const mouse return mItemDoubleClickSignal.connect(cb); } +//virtual +S32 LLAvatarList::notifyParent(const LLSD& info) +{ + if (info.has("sort") && &NAME_COMPARATOR == mItemComparator) + { + sort(); + return 1; + } + return LLFlatListViewEx::notifyParent(info); +} + void LLAvatarList::addNewItem(const LLUUID& id, const std::string& name, BOOL is_online, EAddPosition pos) { LLAvatarListItem* item = new LLAvatarListItem(); item->setName(name); - item->setAvatarId(id, mIgnoreOnlineStatus); + item->setAvatarId(id, mSessionID, mIgnoreOnlineStatus); item->setOnline(mIgnoreOnlineStatus ? true : is_online); item->showLastInteractionTime(mShowLastInteractionTime); @@ -349,20 +395,28 @@ BOOL LLAvatarList::handleRightMouseDown(S32 x, S32 y, MASK mask) BOOL handled = LLUICtrl::handleRightMouseDown(x, y, mask); if ( mContextMenu ) { - std::vector<LLUUID> selected_uuids; + uuid_vec_t selected_uuids; getSelectedUUIDs(selected_uuids); mContextMenu->show(this, selected_uuids, x, y); } return handled; } +void LLAvatarList::setVisible(BOOL visible) +{ + if ( visible == FALSE && mContextMenu ) + { + mContextMenu->hide(); + } + LLFlatListViewEx::setVisible(visible); +} + void LLAvatarList::computeDifference( - const std::vector<LLUUID>& vnew_unsorted, - std::vector<LLUUID>& vadded, - std::vector<LLUUID>& vremoved) + const uuid_vec_t& vnew_unsorted, + uuid_vec_t& vadded, + uuid_vec_t& vremoved) { - std::vector<LLUUID> vcur; - std::vector<LLUUID> vnew = vnew_unsorted; + uuid_vec_t vcur; // Convert LLSDs to LLUUIDs. { @@ -373,21 +427,7 @@ void LLAvatarList::computeDifference( vcur.push_back(vcur_values[i].asUUID()); } - std::sort(vcur.begin(), vcur.end()); - std::sort(vnew.begin(), vnew.end()); - - std::vector<LLUUID>::iterator it; - size_t maxsize = llmax(vcur.size(), vnew.size()); - vadded.resize(maxsize); - vremoved.resize(maxsize); - - // what to remove - it = set_difference(vcur.begin(), vcur.end(), vnew.begin(), vnew.end(), vremoved.begin()); - vremoved.erase(it, vremoved.end()); - - // what to add - it = set_difference(vnew.begin(), vnew.end(), vcur.begin(), vcur.end(), vadded.begin()); - vadded.erase(it, vadded.end()); + LLCommonUtils::computeDifference(vnew_unsorted, vcur, vadded, vremoved); } // Refresh shown time of our last interaction with all listed avatars. @@ -450,3 +490,61 @@ bool LLAvatarItemAgentOnTopComparator::doCompare(const LLAvatarListItem* avatar_ } return LLAvatarItemNameComparator::doCompare(avatar_item1,avatar_item2); } + +/************************************************************************/ +/* class LLAvalineListItem */ +/************************************************************************/ +LLAvalineListItem::LLAvalineListItem(bool hide_number/* = true*/) : LLAvatarListItem(false) +, mIsHideNumber(hide_number) +{ + // should not use buildPanel from the base class to ensure LLAvalineListItem::postBuild is called. + LLUICtrlFactory::getInstance()->buildPanel(this, "panel_avatar_list_item.xml"); +} + +BOOL LLAvalineListItem::postBuild() +{ + BOOL rv = LLAvatarListItem::postBuild(); + + if (rv) + { + setOnline(true); + showLastInteractionTime(false); + setShowProfileBtn(false); + setShowInfoBtn(false); + mAvatarIcon->setValue("Avaline_Icon"); + mAvatarIcon->setToolTip(std::string("")); + } + return rv; +} + +// to work correctly this method should be called AFTER setAvatarId for avaline callers with hidden phone number +void LLAvalineListItem::setName(const std::string& name) +{ + if (mIsHideNumber) + { + static U32 order = 0; + typedef std::map<LLUUID, U32> avaline_callers_nums_t; + static avaline_callers_nums_t mAvalineCallersNums; + + llassert(getAvatarId() != LLUUID::null); + + const LLUUID &uuid = getAvatarId(); + + if (mAvalineCallersNums.find(uuid) == mAvalineCallersNums.end()) + { + mAvalineCallersNums[uuid] = ++order; + LL_DEBUGS("Avaline") << "Set name for new avaline caller: " << uuid << ", order: " << order << LL_ENDL; + } + LLStringUtil::format_map_t args; + args["[ORDER]"] = llformat("%u", mAvalineCallersNums[uuid]); + std::string hidden_name = LLTrans::getString("AvalineCaller", args); + + LL_DEBUGS("Avaline") << "Avaline caller: " << uuid << ", name: " << hidden_name << LL_ENDL; + LLAvatarListItem::setName(hidden_name); + } + else + { + const std::string& formatted_phone = LLTextUtil::formatPhoneNumber(name); + LLAvatarListItem::setName(formatted_phone); + } +} diff --git a/indra/newview/llavatarlist.h b/indra/newview/llavatarlist.h index aeed4fee08..fffc6e6e73 100644 --- a/indra/newview/llavatarlist.h +++ b/indra/newview/llavatarlist.h @@ -38,6 +38,7 @@ #include "llavatarlistitem.h" class LLTimer; +class LLListContextMenu; /** * Generic list of avatars. @@ -49,13 +50,11 @@ class LLTimer; * @see setDirty() * @see setNameFilter() */ -class LLAvatarList : public LLFlatListView +class LLAvatarList : public LLFlatListViewEx { LOG_CLASS(LLAvatarList); public: - typedef std::vector<LLUUID> uuid_vector_t; - - struct Params : public LLInitParam::Block<Params, LLFlatListView::Params> + struct Params : public LLInitParam::Block<Params, LLFlatListViewEx::Params> { Optional<bool> ignore_online_status, // show all items as online show_last_interaction_time, // show most recent interaction time. *HACK: move this to a derived class @@ -72,12 +71,16 @@ public: virtual void clear(); + virtual void setVisible(BOOL visible); + void setNameFilter(const std::string& filter); - void setDirty(bool val = true) { mDirty = val; } - uuid_vector_t& getIDs() { return mIDs; } + void setDirty(bool val = true, bool force_refresh = false); + uuid_vec_t& getIDs() { return mIDs; } bool contains(const LLUUID& id); - void setContextMenu(LLAvatarListItem::ContextMenu* menu) { mContextMenu = menu; } + void setContextMenu(LLListContextMenu* menu) { mContextMenu = menu; } + void setSessionID(const LLUUID& session_id) { mSessionID = session_id; } + const LLUUID& getSessionID() { return mSessionID; } void toggleIcons(); void setSpeakingIndicatorsVisible(bool visible); @@ -94,14 +97,18 @@ public: boost::signals2::connection setItemDoubleClickCallback(const mouse_signal_t::slot_type& cb); + virtual S32 notifyParent(const LLSD& info); + + void addAvalineItem(const LLUUID& item_id, const LLUUID& session_id, const std::string& item_name); + protected: void refresh(); void addNewItem(const LLUUID& id, const std::string& name, BOOL is_online, EAddPosition pos = ADD_BOTTOM); void computeDifference( - const std::vector<LLUUID>& vnew, - std::vector<LLUUID>& vadded, - std::vector<LLUUID>& vremoved); + const uuid_vec_t& vnew, + uuid_vec_t& vadded, + uuid_vec_t& vremoved); void updateLastInteractionTimes(); void onItemDoucleClicked(LLUICtrl* ctrl, S32 x, S32 y, MASK mask); @@ -118,9 +125,10 @@ private: LLTimer* mLITUpdateTimer; // last interaction time update timer std::string mIconParamName; std::string mNameFilter; - uuid_vector_t mIDs; + uuid_vec_t mIDs; + LLUUID mSessionID; - LLAvatarListItem::ContextMenu* mContextMenu; + LLListContextMenu* mContextMenu; commit_signal_t mRefreshCompleteSignal; mouse_signal_t mItemDoubleClickSignal; @@ -172,4 +180,27 @@ protected: virtual bool doCompare(const LLAvatarListItem* avatar_item1, const LLAvatarListItem* avatar_item2) const; }; +/** + * Represents Avaline caller in Avatar list in Voice Control Panel and group chats. + */ +class LLAvalineListItem : public LLAvatarListItem +{ +public: + + /** + * Constructor + * + * @param hide_number - flag indicating if number should be hidden. + * In this case It will be shown as "Avaline Caller 1", "Avaline Caller 1", etc. + */ + LLAvalineListItem(bool hide_number = true); + + /*virtual*/ BOOL postBuild(); + + /*virtual*/ void setName(const std::string& name); + +private: + bool mIsHideNumber; +}; + #endif // LL_LLAVATARLIST_H diff --git a/indra/newview/llavatarlistitem.cpp b/indra/newview/llavatarlistitem.cpp index 846b2843dd..c74075d67f 100644 --- a/indra/newview/llavatarlistitem.cpp +++ b/indra/newview/llavatarlistitem.cpp @@ -1,6 +1,6 @@ /** * @file llavatarlistitem.cpp - * @avatar list item source file + * @brief avatar list item source file * * $LicenseInfo:firstyear=2009&license=viewergpl$ * @@ -36,12 +36,13 @@ #include "llavataractions.h" #include "llavatarlistitem.h" +#include "llbutton.h" #include "llfloaterreg.h" +#include "lltextutil.h" + #include "llagent.h" -#include "lloutputmonitorctrl.h" #include "llavatariconctrl.h" -#include "lltextutil.h" -#include "llbutton.h" +#include "lloutputmonitorctrl.h" bool LLAvatarListItem::sStaticInitialized = false; S32 LLAvatarListItem::sLeftPadding = 0; @@ -119,8 +120,9 @@ S32 LLAvatarListItem::notifyParent(const LLSD& info) if (info.has("visibility_changed")) { updateChildren(); + return 1; } - return 0; + return LLPanel::notifyParent(info); } void LLAvatarListItem::onMouseEnter(S32 x, S32 y, MASK mask) @@ -211,21 +213,25 @@ void LLAvatarListItem::setState(EItemState item_style) mAvatarIcon->setColor(item_icon_color_map[item_style]); } -void LLAvatarListItem::setAvatarId(const LLUUID& id, bool ignore_status_changes) +void LLAvatarListItem::setAvatarId(const LLUUID& id, const LLUUID& session_id, bool ignore_status_changes/* = false*/, bool is_resident/* = true*/) { if (mAvatarId.notNull()) LLAvatarTracker::instance().removeParticularFriendObserver(mAvatarId, this); mAvatarId = id; - mAvatarIcon->setValue(id); - mSpeakingIndicator->setSpeakerId(id); + mSpeakingIndicator->setSpeakerId(id, session_id); // We'll be notified on avatar online status changes if (!ignore_status_changes && mAvatarId.notNull()) LLAvatarTracker::instance().addParticularFriendObserver(mAvatarId, this); - // Set avatar name. - gCacheName->get(id, FALSE, boost::bind(&LLAvatarListItem::onNameCache, this, _2, _3)); + if (is_resident) + { + mAvatarIcon->setValue(id); + + // Set avatar name. + gCacheName->get(id, FALSE, boost::bind(&LLAvatarListItem::onNameCache, this, _2, _3)); + } } void LLAvatarListItem::showLastInteractionTime(bool show) @@ -334,6 +340,9 @@ void LLAvatarListItem::onNameCache(const std::string& first_name, const std::str { std::string name = first_name + " " + last_name; setName(name); + + //requesting the list to resort + notifyParent(LLSD().with("sort", LLSD())); } // Convert given number of seconds to a string like "23 minutes", "15 hours" or "3 years", @@ -526,21 +535,30 @@ void LLAvatarListItem::updateChildren() LLView* LLAvatarListItem::getItemChildView(EAvatarListItemChildIndex child_view_index) { LLView* child_view = mAvatarName; - if (child_view_index < 0 || ALIC_COUNT <= child_view_index) - { - LL_WARNS("AvatarItemReshape") << "Child view index is out of range: " << child_view_index << LL_ENDL; - return child_view; - } + switch (child_view_index) { - case ALIC_ICON: child_view = mAvatarIcon; break; - case ALIC_NAME: child_view = mAvatarName; break; - case ALIC_INTERACTION_TIME: child_view = mLastInteractionTime; break; - case ALIC_SPEAKER_INDICATOR: child_view = mSpeakingIndicator; break; - case ALIC_INFO_BUTTON: child_view = mInfoBtn; break; - case ALIC_PROFILE_BUTTON: child_view = mProfileBtn; break; + case ALIC_ICON: + child_view = mAvatarIcon; + break; + case ALIC_NAME: + child_view = mAvatarName; + break; + case ALIC_INTERACTION_TIME: + child_view = mLastInteractionTime; + break; + case ALIC_SPEAKER_INDICATOR: + child_view = mSpeakingIndicator; + break; + case ALIC_INFO_BUTTON: + child_view = mInfoBtn; + break; + case ALIC_PROFILE_BUTTON: + child_view = mProfileBtn; + break; default: LL_WARNS("AvatarItemReshape") << "Unexpected child view index is passed: " << child_view_index << LL_ENDL; + // leave child_view untouched } return child_view; diff --git a/indra/newview/llavatarlistitem.h b/indra/newview/llavatarlistitem.h index 426d80e0a8..ba9c3574d5 100644 --- a/indra/newview/llavatarlistitem.h +++ b/indra/newview/llavatarlistitem.h @@ -1,6 +1,6 @@ /** * @file llavatarlistitem.h - * @avatar list item header file + * @brief avatar list item header file * * $LicenseInfo:firstyear=2009&license=viewergpl$ * @@ -67,12 +67,6 @@ public: IS_OFFLINE, } EItemState; - class ContextMenu - { - public: - virtual void show(LLView* spawning_view, const std::vector<LLUUID>& selected_uuids, S32 x, S32 y) = 0; - }; - /** * Creates an instance of LLAvatarListItem. * @@ -100,7 +94,7 @@ public: void setName(const std::string& name); void setHighlight(const std::string& highlight); void setState(EItemState item_style); - void setAvatarId(const LLUUID& id, bool ignore_status_changes = false); + void setAvatarId(const LLUUID& id, const LLUUID& session_id, bool ignore_status_changes = false, bool is_resident = true); void setLastInteractionTime(U32 secs_since); //Show/hide profile/info btn, translating speaker indicator and avatar name coordinates accordingly void setShowProfileBtn(bool show); diff --git a/indra/newview/llavatarpropertiesprocessor.cpp b/indra/newview/llavatarpropertiesprocessor.cpp index 33e5046f50..c7e788f345 100644 --- a/indra/newview/llavatarpropertiesprocessor.cpp +++ b/indra/newview/llavatarpropertiesprocessor.cpp @@ -37,6 +37,7 @@ // Viewer includes #include "llagent.h" #include "llagentpicksinfo.h" +#include "lldateutil.h" #include "llviewergenericmessage.h" // Linden library includes @@ -246,6 +247,7 @@ std::string LLAvatarPropertiesProcessor::paymentInfo(const LLAvatarData* avatar_ void LLAvatarPropertiesProcessor::processAvatarPropertiesReply(LLMessageSystem* msg, void**) { LLAvatarData avatar_data; + std::string birth_date; msg->getUUIDFast( _PREHASH_AgentData, _PREHASH_AgentID, avatar_data.agent_id); msg->getUUIDFast( _PREHASH_AgentData, _PREHASH_AvatarID, avatar_data.avatar_id); @@ -254,11 +256,12 @@ void LLAvatarPropertiesProcessor::processAvatarPropertiesReply(LLMessageSystem* msg->getUUIDFast( _PREHASH_PropertiesData, _PREHASH_PartnerID, avatar_data.partner_id); msg->getStringFast( _PREHASH_PropertiesData, _PREHASH_AboutText, avatar_data.about_text); msg->getStringFast( _PREHASH_PropertiesData, _PREHASH_FLAboutText, avatar_data.fl_about_text); - msg->getStringFast( _PREHASH_PropertiesData, _PREHASH_BornOn, avatar_data.born_on); + msg->getStringFast( _PREHASH_PropertiesData, _PREHASH_BornOn, birth_date); msg->getString( _PREHASH_PropertiesData, _PREHASH_ProfileURL, avatar_data.profile_url); msg->getU32Fast( _PREHASH_PropertiesData, _PREHASH_Flags, avatar_data.flags); + LLDateUtil::dateFromPDTString(avatar_data.born_on, birth_date); avatar_data.caption_index = 0; S32 charter_member_size = 0; diff --git a/indra/newview/llavatarpropertiesprocessor.h b/indra/newview/llavatarpropertiesprocessor.h index 716c1b8065..b9e8bfd0ab 100644 --- a/indra/newview/llavatarpropertiesprocessor.h +++ b/indra/newview/llavatarpropertiesprocessor.h @@ -67,7 +67,7 @@ struct LLAvatarData LLUUID partner_id; std::string about_text; std::string fl_about_text; - std::string born_on; + LLDate born_on; std::string profile_url; U8 caption_index; std::string caption_text; diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp index 93b708f299..41f5fe64a1 100644 --- a/indra/newview/llbottomtray.cpp +++ b/indra/newview/llbottomtray.cpp @@ -35,20 +35,32 @@ #define LLBOTTOMTRAY_CPP #include "llbottomtray.h" -#include "llagent.h" -#include "llchiclet.h" +// library includes #include "llfloaterreg.h" #include "llflyoutbutton.h" -#include "llimfloater.h" // for LLIMFloater #include "lllayoutstack.h" -#include "llnearbychatbar.h" +#include "llnotifications.h" #include "llnotificationsutil.h" +#include "lltexteditor.h" + +// newview includes +#include "llagentcamera.h" +#include "llchiclet.h" +#include "llfloatercamera.h" +#include "llimfloater.h" // for LLIMFloater +#include "llnearbychatbar.h" #include "llspeakbutton.h" #include "llsplitbutton.h" #include "llsyswellwindow.h" -#include "llfloatercamera.h" -#include "lltexteditor.h" -#include "llnotifications.h" +#include "lltoolmgr.h" +#include "llviewerparcelmgr.h" + +static void update_build_button_enable_state() +{ + bool can_edit = LLToolMgr::getInstance()->canEdit(); + + LLBottomTray::getInstance()->childSetEnabled("build_btn", can_edit); +} // Build time optimization, generate extern template once in .cpp file template class LLBottomTray* LLSingleton<class LLBottomTray>::getInstance(); @@ -60,6 +72,38 @@ namespace const std::string& PANEL_MOVEMENT_NAME = "movement_panel"; const std::string& PANEL_CAMERA_NAME = "cam_panel"; const std::string& PANEL_GESTURE_NAME = "gesture_panel"; + + S32 get_panel_min_width(LLLayoutStack* stack, LLView* panel) + { + S32 minimal_width = 0; + llassert(stack); + if ( stack && panel && panel->getVisible() ) + { + stack->getPanelMinSize(panel->getName(), &minimal_width, NULL); + } + return minimal_width; + } + + S32 get_panel_max_width(LLLayoutStack* stack, LLPanel* panel) + { + S32 max_width = 0; + llassert(stack); + if ( stack && panel && panel->getVisible() ) + { + stack->getPanelMaxSize(panel->getName(), &max_width, NULL); + } + return max_width; + } + + S32 get_curr_width(LLUICtrl* ctrl) + { + S32 cur_width = 0; + if ( ctrl && ctrl->getVisible() ) + { + cur_width = ctrl->getRect().getWidth(); + } + return cur_width; + } } class LLBottomTrayLite @@ -93,7 +137,7 @@ public: void onFocusLost() { - if (gAgent.cameraMouselook()) + if (gAgentCamera.cameraMouselook()) { LLBottomTray::getInstance()->setVisible(FALSE); } @@ -112,10 +156,6 @@ LLBottomTray::LLBottomTray(const LLSD&) , mMovementButton(NULL) , mResizeState(RS_NORESIZE) , mBottomTrayContextMenu(NULL) -, mMovementPanel(NULL) -, mCamPanel(NULL) -, mSnapshotPanel(NULL) -, mGesturePanel(NULL) , mCamButton(NULL) , mBottomTrayLite(NULL) , mIsInLiteMode(false) @@ -128,19 +168,13 @@ LLBottomTray::LLBottomTray(const LLSD&) LLUICtrlFactory::getInstance()->buildPanel(this,"panel_bottomtray.xml"); - mChicletPanel = getChild<LLChicletPanel>("chiclet_list"); - - mChicletPanel->setChicletClickedCallback(boost::bind(&LLBottomTray::onChicletClick,this,_1)); - - LLUICtrl::CommitCallbackRegistry::defaultRegistrar().add("CameraPresets.ChangeView", boost::bind(&LLFloaterCamera::onClickCameraPresets, _2)); + LLUICtrl::CommitCallbackRegistry::defaultRegistrar().add("CameraPresets.ChangeView", boost::bind(&LLFloaterCamera::onClickCameraItem, _2)); //this is to fix a crash that occurs because LLBottomTray is a singleton //and thus is deleted at the end of the viewers lifetime, but to be cleanly //destroyed LLBottomTray requires some subsystems that are long gone //LLUI::getRootView()->addChild(this); - initStateProcessedObjectMap(); - // Necessary for focus movement among child controls setFocusRoot(TRUE); @@ -157,24 +191,21 @@ LLBottomTray::~LLBottomTray() { LLIMMgr::getInstance()->removeSessionObserver(this); } -} -void LLBottomTray::onChicletClick(LLUICtrl* ctrl) -{ - LLIMChiclet* chiclet = dynamic_cast<LLIMChiclet*>(ctrl); - if (chiclet) + if (mNearbyChatBar) { - // Until you can type into an IM Window and have a conversation, - // still show the old communicate window - //LLFloaterReg::showInstance("communicate", chiclet->getSessionId()); - - // Show after comm window so it is frontmost (and hence will not - // auto-hide) - -// this logic has been moved to LLIMChiclet::handleMouseDown -// LLIMFloater::show(chiclet->getSessionId()); -// chiclet->setCounter(0); + // store custom width of chatbar panel. + S32 custom_width = mNearbyChatBar->getRect().getWidth(); + gSavedSettings.setS32("ChatBarCustomWidth", custom_width); } + + // emulate previous floater behavior to be hidden on startup. + // override effect of save_visibility=true. + // this attribute is necessary to button.initial_callback=Button.SetFloaterToggle works properly: + // i.g when floater changes its visibility - button changes its toggle state. + getChild<LLUICtrl>("build_btn")->setControlValue(false); + getChild<LLUICtrl>("search_btn")->setControlValue(false); + getChild<LLUICtrl>("world_map_btn")->setControlValue(false); } // *TODO Vadim: why void* ? @@ -293,7 +324,7 @@ void LLBottomTray::onChange(EStatusType status, const std::string &channelURI, b // skipped to avoid button blinking if (status != STATUS_JOINING && status!= STATUS_LEFT_CHANNEL) { - mSpeakBtn->setFlyoutBtnEnabled(LLVoiceClient::voiceEnabled() && gVoiceClient->voiceWorking()); + mSpeakBtn->setFlyoutBtnEnabled(LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking()); } } @@ -329,7 +360,7 @@ void LLBottomTray::setVisible(BOOL visible) { mBottomTrayLite->setVisible(visible); } - else + else { LLPanel::setVisible(visible); } @@ -339,6 +370,37 @@ void LLBottomTray::setVisible(BOOL visible) gFloaterView->setSnapOffsetBottom(0); } +S32 LLBottomTray::notifyParent(const LLSD& info) +{ + if(info.has("well_empty")) // implementation of EXT-3397 + { + const std::string chiclet_name = info["well_name"]; + + // only "im_well" or "notification_well" names are expected. + // They are set in panel_bottomtray.xml in <chiclet_im_well> & <chiclet_notification> + llassert("im_well" == chiclet_name || "notification_well" == chiclet_name); + + BOOL should_be_visible = !info["well_empty"]; + showWellButton("im_well" == chiclet_name ? RS_IM_WELL : RS_NOTIFICATION_WELL, should_be_visible); + return 1; + } + + if (info.has("action") && info["action"] == "resize") + { + const std::string& name = info["view_name"]; + + // expected only resize of nearby chatbar + if (mNearbyChatBar->getName() != name) return LLPanel::notifyParent(info); + + const S32 new_width = info["new_width"]; + + processChatbarCustomization(new_width); + + return 2; + } + return LLPanel::notifyParent(info); +} + void LLBottomTray::showBottomTrayContextMenu(S32 x, S32 y, MASK mask) { // We should show BottomTrayContextMenu in last turn @@ -363,22 +425,12 @@ void LLBottomTray::updateContextMenu(S32 x, S32 y, MASK mask) bool in_edit_box = edit_box->pointInView(local_x, local_y); - LLMenuItemGL* menu_item; - menu_item = mBottomTrayContextMenu->findChild<LLMenuItemGL>("NearbyChatBar_Cut"); - if(menu_item) - menu_item->setVisible(in_edit_box); - menu_item = mBottomTrayContextMenu->findChild<LLMenuItemGL>("NearbyChatBar_Copy"); - if(menu_item) - menu_item->setVisible(in_edit_box); - menu_item = mBottomTrayContextMenu->findChild<LLMenuItemGL>("NearbyChatBar_Paste"); - if(menu_item) - menu_item->setVisible(in_edit_box); - menu_item = mBottomTrayContextMenu->findChild<LLMenuItemGL>("NearbyChatBar_Delete"); - if(menu_item) - menu_item->setVisible(in_edit_box); - menu_item = mBottomTrayContextMenu->findChild<LLMenuItemGL>("NearbyChatBar_Select_All"); - if(menu_item) - menu_item->setVisible(in_edit_box); + mBottomTrayContextMenu->setItemVisible("Separator", in_edit_box); + mBottomTrayContextMenu->setItemVisible("NearbyChatBar_Cut", in_edit_box); + mBottomTrayContextMenu->setItemVisible("NearbyChatBar_Copy", in_edit_box); + mBottomTrayContextMenu->setItemVisible("NearbyChatBar_Paste", in_edit_box); + mBottomTrayContextMenu->setItemVisible("NearbyChatBar_Delete", in_edit_box); + mBottomTrayContextMenu->setItemVisible("NearbyChatBar_Select_All", in_edit_box); } void LLBottomTray::showGestureButton(BOOL visible) @@ -401,6 +453,18 @@ void LLBottomTray::showSnapshotButton(BOOL visible) setTrayButtonVisibleIfPossible(RS_BUTTON_SNAPSHOT, visible); } +void LLBottomTray::toggleMovementControls() +{ + if (mMovementButton) + mMovementButton->onCommit(); +} + +void LLBottomTray::toggleCameraControls() +{ + if (mCamButton) + mCamButton->onCommit(); +} + BOOL LLBottomTray::postBuild() { @@ -413,12 +477,8 @@ BOOL LLBottomTray::postBuild() mNearbyChatBar = getChild<LLNearbyChatBar>("chat_bar"); mToolbarStack = getChild<LLLayoutStack>("toolbar_stack"); - mMovementPanel = getChild<LLPanel>("movement_panel"); - mMovementButton = mMovementPanel->getChild<LLButton>("movement_btn"); - mGesturePanel = getChild<LLPanel>("gesture_panel"); - mCamPanel = getChild<LLPanel>("cam_panel"); - mCamButton = mCamPanel->getChild<LLButton>("camera_btn"); - mSnapshotPanel = getChild<LLPanel>("snapshot_panel"); + mMovementButton = getChild<LLButton>("movement_btn"); + mCamButton = getChild<LLButton>("camera_btn"); setRightMouseDownCallback(boost::bind(&LLBottomTray::showBottomTrayContextMenu,this, _2, _3,_4)); mSpeakPanel = getChild<LLPanel>("speak_panel"); @@ -434,15 +494,24 @@ BOOL LLBottomTray::postBuild() mSpeakBtn->setShowToolTip( getString("VoiceControlBtnToolTip") ); // Registering Chat Bar to receive Voice client status change notifications. - gVoiceClient->addObserver(this); - - mObjectDefaultWidthMap[RS_BUTTON_GESTURES] = mGesturePanel->getRect().getWidth(); - mObjectDefaultWidthMap[RS_BUTTON_MOVEMENT] = mMovementPanel->getRect().getWidth(); - mObjectDefaultWidthMap[RS_BUTTON_CAMERA] = mCamPanel->getRect().getWidth(); - mObjectDefaultWidthMap[RS_BUTTON_SPEAK] = mSpeakPanel->getRect().getWidth(); + LLVoiceClient::getInstance()->addObserver(this); mNearbyChatBar->getChatBox()->setContextMenu(NULL); + mChicletPanel = getChild<LLChicletPanel>("chiclet_list"); + + initResizeStateContainers(); + + setButtonsControlsAndListeners(); + + initButtonsVisibility(); + + // update wells visibility: + showWellButton(RS_IM_WELL, !LLIMWellWindow::getInstance()->isWindowEmpty()); + showWellButton(RS_NOTIFICATION_WELL, !LLNotificationWellWindow::getInstance()->isWindowEmpty()); + + LLViewerParcelMgr::getInstance()->addAgentParcelChangedCallback(boost::bind(&update_build_button_enable_state)); + return TRUE; } @@ -604,6 +673,24 @@ void LLBottomTray::reshape(S32 width, S32 height, BOOL called_from_parent) if (mNearbyChatBar) log(mNearbyChatBar, "after"); if (mChicletPanel) log(mChicletPanel, "after"); + + + // Restore width of the chatbar on first reshape. + // we can not to do this from postBuild because reshape is called from parent view on startup + // creation after it and reset width according to resize logic. + static bool needs_restore_custom_state = true; + if (mNearbyChatBar && needs_restore_custom_state) + { + // restore custom width of chatbar panel. + S32 new_width = gSavedSettings.getS32("ChatBarCustomWidth"); + if (new_width > 0) + { + processChatbarCustomization(new_width); + mNearbyChatBar->reshape(new_width, mNearbyChatBar->getRect().getHeight()); + } + needs_restore_custom_state = false; + } + } S32 LLBottomTray::processWidthDecreased(S32 delta_width) @@ -639,7 +726,7 @@ S32 LLBottomTray::processWidthDecreased(S32 delta_width) } const S32 chatbar_panel_width = mNearbyChatBar->getRect().getWidth(); - const S32 chatbar_panel_min_width = mNearbyChatBar->getMinWidth(); + const S32 chatbar_panel_min_width = get_panel_min_width(mToolbarStack, mNearbyChatBar); if (still_should_be_processed && chatbar_panel_width > chatbar_panel_min_width) { // we have some space to decrease chatbar panel @@ -666,27 +753,9 @@ S32 LLBottomTray::processWidthDecreased(S32 delta_width) S32 buttons_freed_width = 0; if (still_should_be_processed) { - processShrinkButtons(&delta_width, &buttons_freed_width); + processShrinkButtons(delta_width, buttons_freed_width); - if (delta_width < 0) - { - processHideButton(RS_BUTTON_SNAPSHOT, &delta_width, &buttons_freed_width); - } - - if (delta_width < 0) - { - processHideButton(RS_BUTTON_CAMERA, &delta_width, &buttons_freed_width); - } - - if (delta_width < 0) - { - processHideButton(RS_BUTTON_MOVEMENT, &delta_width, &buttons_freed_width); - } - - if (delta_width < 0) - { - processHideButton(RS_BUTTON_GESTURES, &delta_width, &buttons_freed_width); - } + processHideButtons(delta_width, buttons_freed_width); if (delta_width < 0) { @@ -712,11 +781,11 @@ void LLBottomTray::processWidthIncreased(S32 delta_width) if (delta_width <= 0) return; const S32 chiclet_panel_width = mChicletPanel->getParent()->getRect().getWidth(); - const S32 chiclet_panel_min_width = mChicletPanel->getMinWidth(); + static const S32 chiclet_panel_min_width = mChicletPanel->getMinWidth(); const S32 chatbar_panel_width = mNearbyChatBar->getRect().getWidth(); - const S32 chatbar_panel_min_width = mNearbyChatBar->getMinWidth(); - const S32 chatbar_panel_max_width = mNearbyChatBar->getMaxWidth(); + static const S32 chatbar_panel_min_width = get_panel_min_width(mToolbarStack, mNearbyChatBar); + static const S32 chatbar_panel_max_width = get_panel_max_width(mToolbarStack, mNearbyChatBar); const S32 chatbar_available_shrink_width = chatbar_panel_width - chatbar_panel_min_width; const S32 available_width_chiclet = chiclet_panel_width - chiclet_panel_min_width; @@ -731,27 +800,10 @@ void LLBottomTray::processWidthIncreased(S32 delta_width) << llendl; S32 available_width = total_available_width; - if (available_width > 0) - { - processShowButton(RS_BUTTON_GESTURES, &available_width); - } - if (available_width > 0) - { - processShowButton(RS_BUTTON_MOVEMENT, &available_width); - } - - if (available_width > 0) - { - processShowButton(RS_BUTTON_CAMERA, &available_width); - } - - if (available_width > 0) - { - processShowButton(RS_BUTTON_SNAPSHOT, &available_width); - } + processShowButtons(available_width); - processExtendButtons(&available_width); + processExtendButtons(available_width); // if we have to show/extend some buttons but resized delta width is not enough... S32 processed_width = total_available_width - available_width; @@ -808,9 +860,26 @@ void LLBottomTray::processWidthIncreased(S32 delta_width) } } -bool LLBottomTray::processShowButton(EResizeState shown_object_type, S32* available_width) +void LLBottomTray::processShowButtons(S32& available_width) +{ + // process buttons from left to right + resize_state_vec_t::const_iterator it = mButtonsProcessOrder.begin(); + const resize_state_vec_t::const_iterator it_end = mButtonsProcessOrder.end(); + + for (; it != it_end; ++it) + { + // is there available space? + if (available_width <= 0) break; + + // try to show next button + processShowButton(*it, available_width); + } +} + +bool LLBottomTray::processShowButton(EResizeState shown_object_type, S32& available_width) { lldebugs << "Trying to show object type: " << shown_object_type << llendl; + llassert(mStateProcessedObjectMap[shown_object_type] != NULL); LLPanel* panel = mStateProcessedObjectMap[shown_object_type]; if (NULL == panel) @@ -823,15 +892,15 @@ bool LLBottomTray::processShowButton(EResizeState shown_object_type, S32* availa { //validate if we have enough room to show this button const S32 required_width = panel->getRect().getWidth(); - can_be_shown = *available_width >= required_width; + can_be_shown = available_width >= required_width; if (can_be_shown) { - *available_width -= required_width; + available_width -= required_width; setTrayButtonVisible(shown_object_type, true); lldebugs << "processed object type: " << shown_object_type - << ", rest available width: " << *available_width + << ", rest available width: " << available_width << llendl; mResizeState &= ~shown_object_type; } @@ -839,9 +908,26 @@ bool LLBottomTray::processShowButton(EResizeState shown_object_type, S32* availa return can_be_shown; } -void LLBottomTray::processHideButton(EResizeState processed_object_type, S32* required_width, S32* buttons_freed_width) +void LLBottomTray::processHideButtons(S32& required_width, S32& buttons_freed_width) +{ + // process buttons from right to left + resize_state_vec_t::const_reverse_iterator it = mButtonsProcessOrder.rbegin(); + const resize_state_vec_t::const_reverse_iterator it_end = mButtonsProcessOrder.rend(); + + for (; it != it_end; ++it) + { + // is it still necessary to hide a button? + if (required_width >= 0) break; + + // try to hide next button + processHideButton(*it, required_width, buttons_freed_width); + } +} + +void LLBottomTray::processHideButton(EResizeState processed_object_type, S32& required_width, S32& buttons_freed_width) { lldebugs << "Trying to hide object type: " << processed_object_type << llendl; + llassert(mStateProcessedObjectMap[processed_object_type] != NULL); LLPanel* panel = mStateProcessedObjectMap[processed_object_type]; if (NULL == panel) @@ -852,11 +938,11 @@ void LLBottomTray::processHideButton(EResizeState processed_object_type, S32* re if (panel->getVisible()) { - *required_width += panel->getRect().getWidth(); + required_width += panel->getRect().getWidth(); - if (*required_width > 0) + if (required_width > 0) { - *buttons_freed_width += *required_width; + buttons_freed_width += required_width; } setTrayButtonVisible(processed_object_type, false); @@ -864,24 +950,29 @@ void LLBottomTray::processHideButton(EResizeState processed_object_type, S32* re mResizeState |= processed_object_type; lldebugs << "processing object type: " << processed_object_type - << ", buttons_freed_width: " << *buttons_freed_width + << ", buttons_freed_width: " << buttons_freed_width << llendl; } } -void LLBottomTray::processShrinkButtons(S32* required_width, S32* buttons_freed_width) +void LLBottomTray::processShrinkButtons(S32& required_width, S32& buttons_freed_width) { - processShrinkButton(RS_BUTTON_CAMERA, required_width); + // process buttons from right to left + resize_state_vec_t::const_reverse_iterator it = mButtonsProcessOrder.rbegin(); + const resize_state_vec_t::const_reverse_iterator it_end = mButtonsProcessOrder.rend(); - if (*required_width < 0) - { - processShrinkButton(RS_BUTTON_MOVEMENT, required_width); - } - if (*required_width < 0) + // iterate through buttons in the mButtonsProcessOrder first + for (; it != it_end; ++it) { - processShrinkButton(RS_BUTTON_GESTURES, required_width); + // is it still necessary to hide a button? + if (required_width >= 0) break; + + // try to shrink next button + processShrinkButton(*it, required_width); } - if (*required_width < 0) + + // then shrink Speak button + if (required_width < 0) { S32 panel_min_width = 0; @@ -893,33 +984,33 @@ void LLBottomTray::processShrinkButtons(S32* required_width, S32* buttons_freed_ } else { - // - mSpeakBtn->setLabelVisible(false); S32 panel_width = mSpeakPanel->getRect().getWidth(); S32 possible_shrink_width = panel_width - panel_min_width; if (possible_shrink_width > 0) { + mSpeakBtn->setLabelVisible(false); mSpeakPanel->reshape(panel_width - possible_shrink_width, mSpeakPanel->getRect().getHeight()); - *required_width += possible_shrink_width; + required_width += possible_shrink_width; - if (*required_width > 0) + if (required_width > 0) { - *buttons_freed_width += *required_width; + buttons_freed_width += required_width; } - lldebugs << "Shrunk panel: " << panel_name + lldebugs << "Shrunk Speak button panel: " << panel_name << ", shrunk width: " << possible_shrink_width - << ", rest width to process: " << *required_width + << ", rest width to process: " << required_width << llendl; } } } } -void LLBottomTray::processShrinkButton(EResizeState processed_object_type, S32* required_width) +void LLBottomTray::processShrinkButton(EResizeState processed_object_type, S32& required_width) { + llassert(mStateProcessedObjectMap[processed_object_type] != NULL); LLPanel* panel = mStateProcessedObjectMap[processed_object_type]; if (NULL == panel) { @@ -945,64 +1036,70 @@ void LLBottomTray::processShrinkButton(EResizeState processed_object_type, S32* // let calculate real width to shrink // 1. apply all possible width - *required_width += possible_shrink_width; + required_width += possible_shrink_width; // 2. it it is too much... - if (*required_width > 0) + if (required_width > 0) { // reduce applied shrunk width to the excessive value. - possible_shrink_width -= *required_width; - *required_width = 0; + possible_shrink_width -= required_width; + required_width = 0; } panel->reshape(panel_width - possible_shrink_width, panel->getRect().getHeight()); lldebugs << "Shrunk panel: " << panel_name << ", shrunk width: " << possible_shrink_width - << ", rest width to process: " << *required_width + << ", rest width to process: " << required_width << llendl; } } } -void LLBottomTray::processExtendButtons(S32* available_width) +void LLBottomTray::processExtendButtons(S32& available_width) { - // do not allow extending any buttons if we have some buttons hidden + // do not allow extending any buttons if we have some buttons hidden via resize if (mResizeState & RS_BUTTONS_CAN_BE_HIDDEN) return; - processExtendButton(RS_BUTTON_GESTURES, available_width); + // process buttons from left to right + resize_state_vec_t::const_iterator it = mButtonsProcessOrder.begin(); + const resize_state_vec_t::const_iterator it_end = mButtonsProcessOrder.end(); - if (*available_width > 0) + // iterate through buttons in the mButtonsProcessOrder first + for (; it != it_end; ++it) { - processExtendButton(RS_BUTTON_CAMERA, available_width); - } - if (*available_width > 0) - { - processExtendButton(RS_BUTTON_MOVEMENT, available_width); + // is there available space? + if (available_width <= 0) break; + + // try to extend next button + processExtendButton(*it, available_width); } - if (*available_width > 0) + + // then try to extend Speak button + if (available_width > 0) { S32 panel_max_width = mObjectDefaultWidthMap[RS_BUTTON_SPEAK]; S32 panel_width = mSpeakPanel->getRect().getWidth(); S32 possible_extend_width = panel_max_width - panel_width; - if (possible_extend_width > 0 && possible_extend_width <= *available_width) + if (possible_extend_width >= 0 && possible_extend_width <= available_width) // HACK: this button doesn't change size so possible_extend_width will be 0 { mSpeakBtn->setLabelVisible(true); mSpeakPanel->reshape(panel_max_width, mSpeakPanel->getRect().getHeight()); log(mSpeakBtn, "speak button is extended"); - *available_width -= possible_extend_width; + available_width -= possible_extend_width; - lldebugs << "Extending panel: " << mSpeakPanel->getName() + lldebugs << "Extending Speak button panel: " << mSpeakPanel->getName() << ", extended width: " << possible_extend_width - << ", rest width to process: " << *available_width + << ", rest width to process: " << available_width << llendl; } } } -void LLBottomTray::processExtendButton(EResizeState processed_object_type, S32* available_width) +void LLBottomTray::processExtendButton(EResizeState processed_object_type, S32& available_width) { + llassert(mStateProcessedObjectMap[processed_object_type] != NULL); LLPanel* panel = mStateProcessedObjectMap[processed_object_type]; if (NULL == panel) { @@ -1021,68 +1118,142 @@ void LLBottomTray::processExtendButton(EResizeState processed_object_type, S32* // let calculate real width to extend // 1. apply all possible width - *available_width -= possible_extend_width; + available_width -= possible_extend_width; // 2. it it is too much... - if (*available_width < 0) + if (available_width < 0) { // reduce applied extended width to the excessive value. - possible_extend_width += *available_width; - *available_width = 0; + possible_extend_width += available_width; + available_width = 0; } panel->reshape(panel_width + possible_extend_width, panel->getRect().getHeight()); lldebugs << "Extending panel: " << panel->getName() << ", extended width: " << possible_extend_width - << ", rest width to process: " << *available_width + << ", rest width to process: " << available_width << llendl; } } bool LLBottomTray::canButtonBeShown(EResizeState processed_object_type) const { + // 0. Check if passed button was previously hidden on resize bool can_be_shown = mResizeState & processed_object_type; if (can_be_shown) { - static MASK MOVEMENT_PREVIOUS_BUTTONS_MASK = RS_BUTTON_GESTURES; - static MASK CAMERA_PREVIOUS_BUTTONS_MASK = RS_BUTTON_GESTURES | RS_BUTTON_MOVEMENT; - static MASK SNAPSHOT_PREVIOUS_BUTTONS_MASK = RS_BUTTON_GESTURES | RS_BUTTON_MOVEMENT | RS_BUTTON_CAMERA; + // Yes, it was. Lets now check that all buttons before it (that can be hidden on resize) + // are already shown + + // process buttons in direct order (from left to right) + resize_state_vec_t::const_iterator it = mButtonsProcessOrder.begin(); + const resize_state_vec_t::const_iterator it_end = mButtonsProcessOrder.end(); - switch(processed_object_type) + // 1. Find and accumulate all buttons types before one passed into the method. + MASK buttons_before_mask = RS_NORESIZE; + for (; it != it_end; ++it) { - case RS_BUTTON_GESTURES: // Gestures should be shown first - break; - case RS_BUTTON_MOVEMENT: // Move only if gesture is shown - can_be_shown = !(MOVEMENT_PREVIOUS_BUTTONS_MASK & mResizeState); - break; - case RS_BUTTON_CAMERA: - can_be_shown = !(CAMERA_PREVIOUS_BUTTONS_MASK & mResizeState); - break; - case RS_BUTTON_SNAPSHOT: - can_be_shown = !(SNAPSHOT_PREVIOUS_BUTTONS_MASK & mResizeState); - break; - default: // nothing to do here - break; + const EResizeState button_type = *it; + if (button_type == processed_object_type) break; + + buttons_before_mask |= button_type; } + + // 2. Check if some previous buttons are still hidden on resize + can_be_shown = !(buttons_before_mask & mResizeState); } return can_be_shown; } -void LLBottomTray::initStateProcessedObjectMap() +void LLBottomTray::initResizeStateContainers() +{ + // init map with objects should be processed for each type + mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_GESTURES, getChild<LLPanel>("gesture_panel"))); + mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_MOVEMENT, getChild<LLPanel>("movement_panel"))); + mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_CAMERA, getChild<LLPanel>("cam_panel"))); + mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_SNAPSHOT, getChild<LLPanel>("snapshot_panel"))); + mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_BUILD, getChild<LLPanel>("build_btn_panel"))); + mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_SEARCH, getChild<LLPanel>("search_btn_panel"))); + mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_WORLD_MAP, getChild<LLPanel>("world_map_btn_panel"))); + mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_MINI_MAP, getChild<LLPanel>("mini_map_btn_panel"))); + + // init an order of processed buttons + mButtonsProcessOrder.push_back(RS_BUTTON_GESTURES); + mButtonsProcessOrder.push_back(RS_BUTTON_MOVEMENT); + mButtonsProcessOrder.push_back(RS_BUTTON_CAMERA); + mButtonsProcessOrder.push_back(RS_BUTTON_SNAPSHOT); + mButtonsProcessOrder.push_back(RS_BUTTON_BUILD); + mButtonsProcessOrder.push_back(RS_BUTTON_SEARCH); + mButtonsProcessOrder.push_back(RS_BUTTON_WORLD_MAP); + mButtonsProcessOrder.push_back(RS_BUTTON_MINI_MAP); + + // init default widths + + // process buttons that can be hidden on resize... + resize_state_vec_t::const_iterator it = mButtonsProcessOrder.begin(); + const resize_state_vec_t::const_iterator it_end = mButtonsProcessOrder.end(); + + for (; it != it_end; ++it) + { + const EResizeState button_type = *it; + // is there an appropriate object? + llassert(mStateProcessedObjectMap.count(button_type) > 0); + if (0 == mStateProcessedObjectMap.count(button_type)) continue; + + // set default width for it. + mObjectDefaultWidthMap[button_type] = mStateProcessedObjectMap[button_type]->getRect().getWidth(); + } + + // ... and add Speak button because it also can be shrunk. + mObjectDefaultWidthMap[RS_BUTTON_SPEAK] = mSpeakPanel->getRect().getWidth(); + +} + +// this method must be called before restoring of the chat entry field on startup +// because it resets chatbar's width according to resize logic. +void LLBottomTray::initButtonsVisibility() +{ + setVisibleAndFitWidths(RS_BUTTON_GESTURES, gSavedSettings.getBOOL("ShowGestureButton")); + setVisibleAndFitWidths(RS_BUTTON_MOVEMENT, gSavedSettings.getBOOL("ShowMoveButton")); + setVisibleAndFitWidths(RS_BUTTON_CAMERA, gSavedSettings.getBOOL("ShowCameraButton")); + setVisibleAndFitWidths(RS_BUTTON_SNAPSHOT, gSavedSettings.getBOOL("ShowSnapshotButton")); + setVisibleAndFitWidths(RS_BUTTON_BUILD, gSavedSettings.getBOOL("ShowBuildButton")); + setVisibleAndFitWidths(RS_BUTTON_SEARCH, gSavedSettings.getBOOL("ShowSearchButton")); + setVisibleAndFitWidths(RS_BUTTON_WORLD_MAP, gSavedSettings.getBOOL("ShowWorldMapButton")); + setVisibleAndFitWidths(RS_BUTTON_MINI_MAP, gSavedSettings.getBOOL("ShowMiniMapButton")); +} + +void LLBottomTray::setButtonsControlsAndListeners() { - mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_GESTURES, mGesturePanel)); - mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_MOVEMENT, mMovementPanel)); - mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_CAMERA, mCamPanel)); - mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_SNAPSHOT, mSnapshotPanel)); - - mDummiesMap.insert(std::make_pair(RS_BUTTON_GESTURES, getChild<LLUICtrl>("after_gesture_panel"))); - mDummiesMap.insert(std::make_pair(RS_BUTTON_MOVEMENT, getChild<LLUICtrl>("after_movement_panel"))); - mDummiesMap.insert(std::make_pair(RS_BUTTON_CAMERA, getChild<LLUICtrl>("after_cam_panel"))); - mDummiesMap.insert(std::make_pair(RS_BUTTON_SPEAK, getChild<LLUICtrl>("after_speak_panel"))); + gSavedSettings.getControl("ShowGestureButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_GESTURES, _2)); + gSavedSettings.getControl("ShowMoveButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_MOVEMENT, _2)); + gSavedSettings.getControl("ShowCameraButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_CAMERA, _2)); + gSavedSettings.getControl("ShowSnapshotButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_SNAPSHOT, _2)); + gSavedSettings.getControl("ShowBuildButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_BUILD, _2)); + gSavedSettings.getControl("ShowSearchButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_SEARCH, _2)); + gSavedSettings.getControl("ShowWorldMapButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_WORLD_MAP, _2)); + gSavedSettings.getControl("ShowMiniMapButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_MINI_MAP, _2)); + + + LLButton* build_btn = getChild<LLButton>("build_btn"); + // set control name for Build button. It is not enough to link it with Button.SetFloaterToggle in xml + std::string vis_control_name = LLFloaterReg::declareVisibilityControl("build"); + // Set the button control value (toggle state) to the floater visibility control (Sets the value as well) + build_btn->setControlVariable(LLUI::sSettingGroups["floater"]->getControl(vis_control_name)); +} + +bool LLBottomTray::toggleShowButton(LLBottomTray::EResizeState button_type, const LLSD& new_visibility) +{ + if (LLBottomTray::instanceExists()) + { + LLBottomTray::getInstance()->setTrayButtonVisibleIfPossible(button_type, new_visibility.asBoolean()); + } + return true; } void LLBottomTray::setTrayButtonVisible(EResizeState shown_object_type, bool visible) { + llassert(mStateProcessedObjectMap[shown_object_type] != NULL); LLPanel* panel = mStateProcessedObjectMap[shown_object_type]; if (NULL == panel) { @@ -1091,60 +1262,176 @@ void LLBottomTray::setTrayButtonVisible(EResizeState shown_object_type, bool vis } panel->setVisible(visible); +} - if (mDummiesMap.count(shown_object_type)) +void LLBottomTray::setTrayButtonVisibleIfPossible(EResizeState shown_object_type, bool visible, bool raise_notification) +{ + if (!setVisibleAndFitWidths(shown_object_type, visible) && visible && raise_notification) { - mDummiesMap[shown_object_type]->setVisible(visible); + LLNotificationsUtil::add("BottomTrayButtonCanNotBeShown", + LLSD(), + LLSD(), + LLNotificationFunctorRegistry::instance().DONOTHING); } } -void LLBottomTray::setTrayButtonVisibleIfPossible(EResizeState shown_object_type, bool visible, bool raise_notification) +bool LLBottomTray::setVisibleAndFitWidths(EResizeState object_type, bool visible) { - bool can_be_set = true; + LLPanel* cur_panel = mStateProcessedObjectMap[object_type]; + if (NULL == cur_panel) + { + lldebugs << "There is no object to process for state: " << object_type << llendl; + return false; + } + + bool is_set = true; if (visible) { - LLPanel* panel = mStateProcessedObjectMap[shown_object_type]; - if (NULL == panel) + // Assume that only chiclet panel can be auto-resized + const S32 available_width = + mChicletPanel->getParent()->getRect().getWidth() - mChicletPanel->getMinWidth(); + + S32 preferred_width = mObjectDefaultWidthMap[object_type]; + S32 current_width = cur_panel->getRect().getWidth(); + S32 result_width = 0; + bool decrease_width = false; + + // Mark this button to be shown + mResizeState |= object_type; + + if (preferred_width > 0 && available_width >= preferred_width) { - lldebugs << "There is no object to process for state: " << shown_object_type << llendl; - return; + result_width = preferred_width; } + else if (available_width >= current_width) + { + result_width = current_width; + } + else + { + // Calculate the possible shrunk width as difference between current and minimal widths + const S32 chatbar_shrunk_width = + mNearbyChatBar->getRect().getWidth() - get_panel_min_width(mToolbarStack, mNearbyChatBar); - const S32 dummy_width = mDummiesMap.count(shown_object_type) ? mDummiesMap[shown_object_type]->getRect().getWidth() : 0; + S32 sum_of_min_widths = get_panel_min_width(mToolbarStack, mSpeakPanel); + S32 sum_of_curr_widths = get_curr_width(mSpeakPanel); - const S32 chatbar_panel_width = mNearbyChatBar->getRect().getWidth(); - const S32 chatbar_panel_min_width = mNearbyChatBar->getMinWidth(); + resize_state_vec_t::const_iterator it = mButtonsProcessOrder.begin(); + const resize_state_vec_t::const_iterator it_end = mButtonsProcessOrder.end(); - const S32 chiclet_panel_width = mChicletPanel->getParent()->getRect().getWidth(); - const S32 chiclet_panel_min_width = mChicletPanel->getMinWidth(); + for (; it != it_end; ++it) + { + LLPanel * cur_panel = mStateProcessedObjectMap[*it]; + sum_of_min_widths += get_panel_min_width(mToolbarStack, cur_panel); + sum_of_curr_widths += get_curr_width(cur_panel); + } - const S32 available_width = (chatbar_panel_width - chatbar_panel_min_width) - + (chiclet_panel_width - chiclet_panel_min_width); + const S32 possible_shrunk_width = + chatbar_shrunk_width + (sum_of_curr_widths - sum_of_min_widths); - const S32 required_width = panel->getRect().getWidth() + dummy_width; - can_be_set = available_width >= required_width; - } + // Minimal width of current panel + S32 minimal_width = 0; + mToolbarStack->getPanelMinSize(cur_panel->getName(), &minimal_width, NULL); - if (can_be_set) + if ( (available_width + possible_shrunk_width) >= minimal_width) + { + // There is enough space for minimal width, but set the result_width + // to preferred_width so buttons widths decreasing will be done in predefined order + result_width = (preferred_width > 0) ? preferred_width : current_width; + decrease_width = true; + } + else + { + // Nothing can be done, give up... + return false; + } + } + + if (result_width != current_width) + { + cur_panel->reshape(result_width, cur_panel->getRect().getHeight()); + current_width = result_width; + } + + is_set = processShowButton(object_type, current_width); + + // Shrink buttons if needed + if (is_set && decrease_width) + { + processWidthDecreased( -result_width); + } + } + else { - setTrayButtonVisible(shown_object_type, visible); + const S32 delta_width = get_curr_width(cur_panel); + + setTrayButtonVisible(object_type, false); - // if we hide the button mark it NOT to show while future bottom tray extending - if (!visible) + // Mark button NOT to show while future bottom tray extending + mResizeState &= ~object_type; + + // Extend other buttons if need + if (delta_width) { - mResizeState &= ~shown_object_type; + processWidthIncreased(delta_width); } } + return is_set; +} + +void LLBottomTray::showWellButton(EResizeState object_type, bool visible) +{ + llassert( ((RS_NOTIFICATION_WELL | RS_IM_WELL) & object_type) == object_type ); + + const std::string panel_name = RS_IM_WELL == object_type ? "im_well_panel" : "notification_well_panel"; + + LLView * panel = getChild<LLView>(panel_name); + + // if necessary visibility is set nothing to do here + if (panel->getVisible() == (BOOL)visible) return; + + S32 panel_width = panel->getRect().getWidth(); + panel->setVisible(visible); + + if (visible) + { + // method assumes that input param is a negative value + processWidthDecreased(-panel_width); + } else { - // mark this button to show it while future bottom tray extending - mResizeState |= shown_object_type; - if ( raise_notification ) - LLNotificationsUtil::add("BottomTrayButtonCanNotBeShown", - LLSD(), - LLSD(), - LLNotificationFunctorRegistry::instance().DONOTHING); + processWidthIncreased(panel_width); + } +} + +void LLBottomTray::processChatbarCustomization(S32 new_width) +{ + if (NULL == mNearbyChatBar) return; + + const S32 delta_width = mNearbyChatBar->getRect().getWidth() - new_width; + + if (delta_width == 0) return; + + LLView * chiclet_layout_panel = mChicletPanel->getParent(); + const S32 chiclet_min_width = get_panel_min_width(mToolbarStack, chiclet_layout_panel); + const S32 chiclet_panel_width = chiclet_layout_panel->getRect().getWidth(); + const S32 available_chiclet_shrink_width = chiclet_panel_width - chiclet_min_width; + llassert(available_chiclet_shrink_width >= 0); + + if (delta_width > 0) // panel gets narrowly + { + S32 total_possible_width = delta_width + available_chiclet_shrink_width; + processShowButtons(total_possible_width); + processExtendButtons(total_possible_width); + } + // here (delta_width < 0) // panel gets wider + else //if (-delta_width > available_chiclet_shrink_width) + { + S32 required_width = delta_width + available_chiclet_shrink_width; + S32 buttons_freed_width = 0; + processShrinkButtons(required_width, buttons_freed_width); + processHideButtons(required_width, buttons_freed_width); } } diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h index ee0eb13218..05fed53936 100644 --- a/indra/newview/llbottomtray.h +++ b/indra/newview/llbottomtray.h @@ -83,6 +83,8 @@ public: virtual void setVisible(BOOL visible); + /*virtual*/ S32 notifyParent(const LLSD& info); + // Implements LLVoiceClientStatusObserver::onChange() to enable the speak // button when voice is available /*virtual*/ void onChange(EStatusType status, const std::string &channelURI, bool proximal); @@ -94,6 +96,9 @@ public: void showCameraButton(BOOL visible); void showSnapshotButton(BOOL visible); + void toggleMovementControls(); + void toggleCameraControls(); + void onMouselookModeIn(); void onMouselookModeOut(); @@ -113,37 +118,153 @@ private: , RS_BUTTON_MOVEMENT = 0x0010 , RS_BUTTON_GESTURES = 0x0020 , RS_BUTTON_SPEAK = 0x0040 + , RS_IM_WELL = 0x0080 + , RS_NOTIFICATION_WELL = 0x0100 + , RS_BUTTON_BUILD = 0x0200 + , RS_BUTTON_SEARCH = 0x0400 + , RS_BUTTON_WORLD_MAP = 0x0800 + , RS_BUTTON_MINI_MAP = 0x1000 + + /* + Once new button that can be hidden on resize is added don't forget to update related places: + - RS_BUTTONS_CAN_BE_HIDDEN enum value below. + - initResizeStateContainers(): mStateProcessedObjectMap and mButtonsProcessOrder + */ /** * Specifies buttons which can be hidden when bottom tray is shrunk. * They are: Gestures, Movement (Move), Camera (View), Snapshot + * new: Build, Search, Map, World Map, Mini-Map. */ , RS_BUTTONS_CAN_BE_HIDDEN = RS_BUTTON_SNAPSHOT | RS_BUTTON_CAMERA | RS_BUTTON_MOVEMENT | RS_BUTTON_GESTURES + | RS_BUTTON_BUILD | RS_BUTTON_SEARCH | RS_BUTTON_WORLD_MAP | RS_BUTTON_MINI_MAP }EResizeState; + /** + * Updates child controls size and visibility when it is necessary to reduce total width. + * + * Process order: + * - reduce chiclet panel to its minimal width; + * - reduce chatbar to its minimal width; + * - reduce visible buttons from right to left to their minimal width; + * - hide visible buttons from right to left; + * When button is hidden chatbar extended to fill released space if it is necessary. + * + * @param[in] delta_width - value by which bottom tray should be shrunk. It is a negative value. + * @return positive value which bottom tray can not process when it reaches its minimal width. + * Zero if there was enough space to process delta_width. + */ S32 processWidthDecreased(S32 delta_width); + + /** + * Updates child controls size and visibility when it is necessary to extend total width. + * + * Process order: + * - show invisible buttons should be shown from left to right if possible; + * - extend visible buttons from left to right to their default width; + * - extend chatbar to its maximal width; + * - extend chiclet panel to all available space; + * When chatbar & chiclet panels are wider then their minimal width they can be reduced to allow + * a button gets visible in case if passed delta_width is not enough (chatbar first). + * + * @param[in] delta_width - value by which bottom tray should be extended. It is a positive value. + */ void processWidthIncreased(S32 delta_width); + + /** helper function to log debug messages */ void log(LLView* panel, const std::string& descr); - bool processShowButton(EResizeState shown_object_type, S32* available_width); - void processHideButton(EResizeState processed_object_type, S32* required_width, S32* buttons_freed_width); + + /** + * Tries to show hidden by resize buttons using available width. + * + * Gets buttons visible if there is enough space. Reduces available_width in this case. + * + * @params[in, out] available_width - reference to available width to be used to show buttons. + * @see processShowButton() + */ + void processShowButtons(S32& available_width); + + /** + * Tries to show panel with specified button using available width. + * + * Shows button specified by type if there is enough space. Reduces available_width in this case. + * + * @params[in] shown_object_type - type of button to be shown. + * @params[in, out] available_width - reference to available width to be used to show button. + * + * @return true if button can be shown, false otherwise + */ + bool processShowButton(EResizeState shown_object_type, S32& available_width); + + /** + * Hides visible panels with all buttons that may be hidden by resize if it is necessary. + * + * When button gets hidden some space is released in bottom tray. + * This space is taken into account for several consecutive calls for several buttons. + * + * @params[in, out] required_width - reference to required width to be released. This is a negative value. + * Its absolute value is decreased by shown panel width. + * @params[in, out] buttons_freed_width - reference to value released over required one. + * If panel's width is more than required difference is added to buttons_freed_width. + * @see processHideButton() + */ + void processHideButtons(S32& required_width, S32& buttons_freed_width); + + /** + * Hides panel with specified button if it is visible. + * + * When button gets hidden some space is released in bottom tray. + * This space is taken into account for several consecutive calls for several buttons. + * + * @params[in] processed_object_type - type of button to be hide. + * @params[in, out] required_width - reference to required width to be released. This is a negative value. + * Its absolute value is decreased by panel width. + * @params[in, out] buttons_freed_width - reference to value released over required one. + * If panel's width is more than required difference is added to buttons_freed_width. + */ + void processHideButton(EResizeState processed_object_type, S32& required_width, S32& buttons_freed_width); /** * Shrinks shown buttons to reduce total taken space. * - * @param - required_width - width which buttons can use to be shrunk. It is a negative value. + * Shrinks buttons that may be shrunk smoothly first. Then shrinks Speak button. + * + * @param[in, out] required_width - reference to width value which should be released when buttons are shrunk. It is a negative value. * It is increased on the value processed by buttons. + * @params[in, out] buttons_freed_width - reference to value released over required one. + * If width of panel with Speak button is more than required that difference is added + * to buttons_freed_width. + * This is because Speak button shrinks discretely unlike other buttons which are changed smoothly. + */ + void processShrinkButtons(S32& required_width, S32& buttons_freed_width); + + /** + * Shrinks panel with specified button if it is visible. + * + * @params[in] processed_object_type - type of button to be shrunk. + * @param[in, out] required_width - reference to width value which should be released when button is shrunk. It is a negative value. + * It is increased on the value released by the button. */ - void processShrinkButtons(S32* required_width, S32* buttons_freed_width); - void processShrinkButton(EResizeState processed_object_type, S32* required_width); + void processShrinkButton(EResizeState processed_object_type, S32& required_width); /** * Extends shown buttons to increase total taken space. * - * @param - available_width - width which buttons can use to be extended. It is a positive value. - * It is decreased on the value processed by buttons. + * Extends buttons that may be extended smoothly first. Then extends Speak button. + * + * @param[in, out] available_width - reference to width value which buttons can use to be extended. + * It is a positive value. It is decreased on the value processed by buttons. + */ + void processExtendButtons(S32& available_width); + + /** + * Extends shown button to increase total taken space. + * + * @params[in] processed_object_type - type of button to be extended. + * @param[in, out] available_width - reference to width value which button can use to be extended. + * It is a positive value. It is decreased on the value processed by buttons. */ - void processExtendButtons(S32* available_width); - void processExtendButton(EResizeState processed_object_type, S32* available_width); + void processExtendButton(EResizeState processed_object_type, S32& available_width); /** * Determines if specified by type object can be shown. It should be hidden by shrink before. @@ -152,7 +273,37 @@ private: * - Gestures, Move, View, Snapshot */ bool canButtonBeShown(EResizeState processed_object_type) const; - void initStateProcessedObjectMap(); + + /** + * Initializes all containers stored data related to children resize state. + * + * @see mStateProcessedObjectMap + * @see mObjectDefaultWidthMap + * @see mButtonsProcessOrder + */ + void initResizeStateContainers(); + + /** + * Initializes buttons' visibility depend on stored Control Settings. + */ + void initButtonsVisibility(); + + /** + * Initializes listeners of Control Settings to toggle appropriate buttons' visibility. + * + * @see toggleShowButton() + */ + void setButtonsControlsAndListeners(); + + /** + * Toggles visibility of specified button depend on passed value. + * + * @param button_type - type of button to be toggled + * @param new_visibility - new visibility of the button + * + * @see setButtonsControlsAndListeners() + */ + static bool toggleShowButton(EResizeState button_type, const LLSD& new_visibility); /** * Sets passed visibility to object specified by resize type. @@ -173,6 +324,34 @@ private: */ void setTrayButtonVisibleIfPossible(EResizeState shown_object_type, bool visible, bool raise_notification = true); + /** + * Sets passed visibility to required button and fit widths of shown + * buttons(notice that method can shrink widths to + * allocate needed room in bottom tray). + * Returns true if visibility of required button was set. + */ + bool setVisibleAndFitWidths(EResizeState object_type, bool visible); + + /** + * Shows/hides panel with specified well button (IM or Notification) + * + * @param[in] object_type - type of well button to be processed. + * Must be one of RS_IM_WELL or RS_NOTIFICATION_WELL. + * @param[in] visible - flag specified whether button should be shown or hidden. + */ + void showWellButton(EResizeState object_type, bool visible); + + /** + * Handles a customization of chatbar width. + * + * When chatbar gets wider layout stack will reduce chiclet panel (it is auto-resizable) + * But once chiclet panel reaches its minimal width Stack will force to reduce buttons width. + * including Speak button. The similar behavior is when chatbar gets narrowly. + * This methods force resize behavior to resize buttons properly in these cases. + */ + void processChatbarCustomization(S32 new_width); + + MASK mResizeState; typedef std::map<EResizeState, LLPanel*> state_object_map_t; @@ -181,15 +360,17 @@ private: typedef std::map<EResizeState, S32> state_object_width_map_t; state_object_width_map_t mObjectDefaultWidthMap; - typedef std::map<EResizeState, LLUICtrl*> dummies_map_t; - dummies_map_t mDummiesMap; + typedef std::vector<EResizeState> resize_state_vec_t; + + /** + * Contains order in which child buttons should be processed in show/hide, extend/shrink methods. + */ + resize_state_vec_t mButtonsProcessOrder; protected: LLBottomTray(const LLSD& key = LLSD()); - void onChicletClick(LLUICtrl* ctrl); - static void* createNearbyChatBar(void* userdata); void updateContextMenu(S32 x, S32 y, MASK mask); @@ -202,10 +383,6 @@ protected: LLNearbyChatBar* mNearbyChatBar; LLLayoutStack* mToolbarStack; LLMenuGL* mBottomTrayContextMenu; - LLPanel* mMovementPanel; - LLPanel* mCamPanel; - LLPanel* mSnapshotPanel; - LLPanel* mGesturePanel; LLButton* mCamButton; LLButton* mMovementButton; LLBottomTrayLite* mBottomTrayLite; diff --git a/indra/newview/llbuycurrencyhtml.cpp b/indra/newview/llbuycurrencyhtml.cpp new file mode 100644 index 0000000000..163829a1ea --- /dev/null +++ b/indra/newview/llbuycurrencyhtml.cpp @@ -0,0 +1,165 @@ +/** + * @file llbuycurrencyhtml.cpp + * @brief Manages Buy Currency HTML floater + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2006-2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llfloaterbuycurrency.h" +#include "llbuycurrencyhtml.h" +#include "llfloaterbuycurrencyhtml.h" + +#include "llfloaterreg.h" +#include "llcommandhandler.h" +#include "llviewercontrol.h" + +// support for secondlife:///app/buycurrencyhtml/{ACTION}/{NEXT_ACTION}/{RETURN_CODE} SLapps +class LLBuyCurrencyHTMLHandler : + public LLCommandHandler +{ +public: + // requests will be throttled from a non-trusted browser + LLBuyCurrencyHTMLHandler() : LLCommandHandler( "buycurrencyhtml", UNTRUSTED_ALLOW ) {} + + bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web) + { + std::string action( "" ); + if ( params.size() >= 1 ) + { + action = params[ 0 ].asString(); + }; + + std::string next_action( "" ); + if ( params.size() >= 2 ) + { + next_action = params[ 1 ].asString(); + }; + + int result_code = 0; + if ( params.size() >= 3 ) + { + result_code = params[ 2 ].asInteger(); + }; + + // open the legacy XUI based currency floater + if ( "open_legacy" == next_action ) + { + LLFloaterBuyCurrency::buyCurrency(); + }; + + // ask the Buy Currency floater to close + // note: this is the last thing we can do so make + // sure any other actions are processed before this. + if ( "close" == action ) + { + LLBuyCurrencyHTML::closeDialog(); + }; + + return true; + }; +}; +LLBuyCurrencyHTMLHandler gBuyCurrencyHTMLHandler; + +//////////////////////////////////////////////////////////////////////////////// +// static +// Opens the legacy XUI based floater or new HTML based one based on +// the QuickBuyCurrency value in settings.xml - this overload is for +// the case where the amount is not requested. +void LLBuyCurrencyHTML::openCurrencyFloater() +{ + if ( gSavedSettings.getBOOL( "QuickBuyCurrency" ) ) + { + // HTML version + LLBuyCurrencyHTML::showDialog( false, "", 0 ); + } + else + { + // legacy version + LLFloaterBuyCurrency::buyCurrency(); + }; +} + +//////////////////////////////////////////////////////////////////////////////// +// static +// Opens the legacy XUI based floater or new HTML based one based on +// the QuickBuyCurrency value in settings.xml - this overload is for +// the case where the amount and a string to display are requested. +void LLBuyCurrencyHTML::openCurrencyFloater( const std::string& message, S32 sum ) +{ + if ( gSavedSettings.getBOOL( "QuickBuyCurrency" ) ) + { + // HTML version + LLBuyCurrencyHTML::showDialog( true, message, sum ); + } + else + { + // legacy version + LLFloaterBuyCurrency::buyCurrency( message, sum ); + }; +} + +//////////////////////////////////////////////////////////////////////////////// +// static +void LLBuyCurrencyHTML::showDialog( bool specific_sum_requested, const std::string& message, S32 sum ) +{ + LLFloaterBuyCurrencyHTML* buy_currency_floater = dynamic_cast< LLFloaterBuyCurrencyHTML* >( LLFloaterReg::getInstance( "buy_currency_html" ) ); + if ( buy_currency_floater ) + { + // pass on flag indicating if we want to buy specific amount and if so, how much + buy_currency_floater->setParams( specific_sum_requested, message, sum ); + + // force navigate to new URL + buy_currency_floater->navigateToFinalURL(); + + // make it visible and raise to front + BOOL visible = TRUE; + buy_currency_floater->setVisible( visible ); + BOOL take_focus = TRUE; + buy_currency_floater->setFrontmost( take_focus ); + + // spec calls for floater to be centered on client window + buy_currency_floater->center(); + } + else + { + llwarns << "Buy Currency (HTML) Floater not found" << llendl; + }; +} + +//////////////////////////////////////////////////////////////////////////////// +// +void LLBuyCurrencyHTML::closeDialog() +{ + LLFloaterBuyCurrencyHTML* buy_currency_floater = dynamic_cast< LLFloaterBuyCurrencyHTML* >(LLFloaterReg::getInstance( "buy_currency_html" ) ); + if ( buy_currency_floater ) + { + buy_currency_floater->closeFloater(); + }; +} diff --git a/indra/newview/llbuycurrencyhtml.h b/indra/newview/llbuycurrencyhtml.h new file mode 100644 index 0000000000..3435bb0451 --- /dev/null +++ b/indra/newview/llbuycurrencyhtml.h @@ -0,0 +1,57 @@ +/** + * @file llbuycurrencyhtml.h + * @brief Manages Buy Currency HTML floater + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2006-2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLBUYCURRENCYHTML_H +#define LL_LLBUYCURRENCYHTML_H + +#include "llsingleton.h" + +class LLFloaterBuyCurrencyHTML; + +class LLBuyCurrencyHTML +{ + public: + // choke point for opening a legacy or new currency floater - this overload is when the L$ sum is not required + static void openCurrencyFloater(); + + // choke point for opening a legacy or new currency floater - this overload is when the L$ sum is required + static void openCurrencyFloater( const std::string& message, S32 sum ); + + // show and give focus to actual currency floater - this is used for both cases + // where the sum is required and where it is not + static void showDialog( bool specific_sum_requested, const std::string& message, S32 sum ); + + // close (and destroy) the currency floater + static void closeDialog(); +}; + +#endif // LL_LLBUYCURRENCYHTML_H diff --git a/indra/newview/llcallfloater.cpp b/indra/newview/llcallfloater.cpp index bd4fae6ab6..60a2392d87 100644 --- a/indra/newview/llcallfloater.cpp +++ b/indra/newview/llcallfloater.cpp @@ -54,7 +54,7 @@ #include "llvoicechannel.h" #include "llviewerparcelmgr.h" -static void get_voice_participants_uuids(std::vector<LLUUID>& speakers_uuids); +static void get_voice_participants_uuids(uuid_vec_t& speakers_uuids); void reshape_floater(LLCallFloater* floater, S32 delta_height); class LLNonAvatarCaller : public LLAvatarListItem @@ -95,7 +95,7 @@ static void* create_non_avatar_caller(void*) return new LLNonAvatarCaller; } -LLVoiceChannel* LLCallFloater::sCurrentVoiceCanel = NULL; +LLVoiceChannel* LLCallFloater::sCurrentVoiceChannel = NULL; LLCallFloater::LLCallFloater(const LLSD& key) : LLTransientDockableFloater(NULL, false, key) @@ -113,8 +113,11 @@ LLCallFloater::LLCallFloater(const LLSD& key) mSpeakerDelayRemover = new LLSpeakersDelayActionsStorage(boost::bind(&LLCallFloater::removeVoiceLeftParticipant, this, _1), voice_left_remove_delay); mFactoryMap["non_avatar_caller"] = LLCallbackMap(create_non_avatar_caller, NULL); - LLVoiceClient::getInstance()->addObserver(this); + LLVoiceClient::instance().addObserver(this); LLTransientFloaterMgr::getInstance()->addControlView(this); + + // force docked state since this floater doesn't save it between recreations + setDocked(true); } LLCallFloater::~LLCallFloater() @@ -128,11 +131,9 @@ LLCallFloater::~LLCallFloater() mAvatarListRefreshConnection.disconnect(); mVoiceChannelStateChangeConnection.disconnect(); - // Don't use LLVoiceClient::getInstance() here - // singleton MAY have already been destroyed. - if(gVoiceClient) + if(LLVoiceClient::instanceExists()) { - gVoiceClient->removeObserver(this); + LLVoiceClient::getInstance()->removeObserver(this); } LLTransientFloaterMgr::getInstance()->removeControlView(this); } @@ -157,7 +158,6 @@ BOOL LLCallFloater::postBuild() initAgentData(); - connectToChannel(LLVoiceChannel::getCurrentVoiceChannel()); setIsChrome(true); @@ -188,7 +188,7 @@ void LLCallFloater::draw() // Seems this is a problem somewhere in Voice Client (LLVoiceClient::participantAddedEvent) // onChange(); - bool is_moderator_muted = gVoiceClient->getIsModeratorMuted(gAgentID); + bool is_moderator_muted = LLVoiceClient::getInstance()->getIsModeratorMuted(gAgentID); if (mIsModeratorMutedVoice != is_moderator_muted) { @@ -203,16 +203,15 @@ void LLCallFloater::draw() } // virtual -void LLCallFloater::onChange() +void LLCallFloater::onParticipantsChanged() { if (NULL == mParticipants) return; - updateParticipantsVoiceState(); // Add newly joined participants. - std::vector<LLUUID> speakers_uuids; + uuid_vec_t speakers_uuids; get_voice_participants_uuids(speakers_uuids); - for (std::vector<LLUUID>::const_iterator it = speakers_uuids.begin(); it != speakers_uuids.end(); it++) + for (uuid_vec_t::const_iterator it = speakers_uuids.begin(); it != speakers_uuids.end(); it++) { mParticipants->addAvatarIDExceptAgent(*it); } @@ -227,7 +226,7 @@ void LLCallFloater::leaveCall() LLVoiceChannel* voice_channel = LLVoiceChannel::getCurrentVoiceChannel(); if (voice_channel) { - voice_channel->deactivate(); + gIMMgr->endCall(voice_channel->getSessionID()); } } @@ -236,11 +235,11 @@ void LLCallFloater::updateSession() LLVoiceChannel* voice_channel = LLVoiceChannel::getCurrentVoiceChannel(); if (voice_channel) { - lldebugs << "Current voice channel: " << voice_channel->getSessionID() << llendl; + LL_DEBUGS("Voice") << "Current voice channel: " << voice_channel->getSessionID() << LL_ENDL; if (mSpeakerManager && voice_channel->getSessionID() == mSpeakerManager->getSessionID()) { - lldebugs << "Speaker manager is already set for session: " << voice_channel->getSessionID() << llendl; + LL_DEBUGS("Voice") << "Speaker manager is already set for session: " << voice_channel->getSessionID() << LL_ENDL; return; } else @@ -250,7 +249,6 @@ void LLCallFloater::updateSession() } const LLUUID& session_id = voice_channel ? voice_channel->getSessionID() : LLUUID::null; - lldebugs << "Set speaker manager for session: " << session_id << llendl; LLIMModel::LLIMSession* im_session = LLIMModel::getInstance()->findIMSession(session_id); if (im_session) @@ -288,23 +286,25 @@ void LLCallFloater::updateSession() if (NULL == mSpeakerManager) { - // by default let show nearby chat participants + // By default show nearby chat participants mSpeakerManager = LLLocalSpeakerMgr::getInstance(); - lldebugs << "Set DEFAULT speaker manager" << llendl; + LL_DEBUGS("Voice") << "Set DEFAULT speaker manager" << LL_ENDL; mVoiceType = VC_LOCAL_CHAT; } updateTitle(); - - //hide "Leave Call" button for nearby chat + + // Hide "Leave Call" button for nearby chat bool is_local_chat = mVoiceType == VC_LOCAL_CHAT; childSetVisible("leave_call_btn_panel", !is_local_chat); refreshParticipantList(); updateAgentModeratorState(); - //show floater for voice calls - if (!is_local_chat) + // Show floater for voice calls & only in CONNECTED to voice channel state + if (!is_local_chat && + voice_channel && + LLVoiceChannel::STATE_CONNECTED == voice_channel->getState()) { LLIMFloater* im_floater = LLIMFloater::findInstance(session_id); bool show_me = !(im_floater && im_floater->getVisible()); @@ -331,8 +331,9 @@ void LLCallFloater::refreshParticipantList() if (!non_avatar_caller) { - mParticipants = new LLParticipantList(mSpeakerManager, mAvatarList, true, mVoiceType != VC_GROUP_CHAT && mVoiceType != VC_AD_HOC_CHAT); + mParticipants = new LLParticipantList(mSpeakerManager, mAvatarList, true, mVoiceType != VC_GROUP_CHAT && mVoiceType != VC_AD_HOC_CHAT, false); mParticipants->setValidateSpeakerCallback(boost::bind(&LLCallFloater::validateSpeaker, this, _1)); + mParticipants->setSortOrder(LLParticipantList::E_SORT_BY_RECENT_SPEAKERS); if (LLLocalSpeakerMgr::getInstance() == mSpeakerManager) { @@ -366,7 +367,7 @@ void LLCallFloater::sOnCurrentChannelChanged(const LLUUID& /*session_id*/) // *NOTE: if signal was sent for voice channel with LLVoiceChannel::STATE_NO_CHANNEL_INFO // it sill be sent for the same channel again (when state is changed). // So, lets ignore this call. - if (channel == sCurrentVoiceCanel) return; + if (channel == sCurrentVoiceChannel) return; LLCallFloater* call_floater = LLFloaterReg::getTypedInstance<LLCallFloater>("voice_controls"); @@ -463,19 +464,18 @@ void LLCallFloater::updateAgentModeratorState() mAgentPanel->childSetValue("user_text", name); } -static void get_voice_participants_uuids(std::vector<LLUUID>& speakers_uuids) +static void get_voice_participants_uuids(uuid_vec_t& speakers_uuids) { // Get a list of participants from VoiceClient - LLVoiceClient::participantMap *voice_map = gVoiceClient->getParticipantList(); - if (voice_map) + std::set<LLUUID> participants; + LLVoiceClient::getInstance()->getParticipantList(participants); + + for (std::set<LLUUID>::const_iterator iter = participants.begin(); + iter != participants.end(); ++iter) { - for (LLVoiceClient::participantMap::const_iterator iter = voice_map->begin(); - iter != voice_map->end(); ++iter) - { - LLUUID id = (*iter).second->mAvatarID; - speakers_uuids.push_back(id); - } + speakers_uuids.push_back(*iter); } + } void LLCallFloater::initParticipantsVoiceState() @@ -488,7 +488,7 @@ void LLCallFloater::initParticipantsVoiceState() it_end = items.end(); - std::vector<LLUUID> speakers_uuids; + uuid_vec_t speakers_uuids; get_voice_participants_uuids(speakers_uuids); for(; it != it_end; ++it) @@ -499,7 +499,7 @@ void LLCallFloater::initParticipantsVoiceState() LLUUID speaker_id = item->getAvatarId(); - std::vector<LLUUID>::const_iterator speaker_iter = std::find(speakers_uuids.begin(), speakers_uuids.end(), speaker_id); + uuid_vec_t::const_iterator speaker_iter = std::find(speakers_uuids.begin(), speakers_uuids.end(), speaker_id); // If an avatarID assigned to a panel is found in a speakers list // obtained from VoiceClient we assign the JOINED status to the owner @@ -528,10 +528,10 @@ void LLCallFloater::initParticipantsVoiceState() void LLCallFloater::updateParticipantsVoiceState() { - std::vector<LLUUID> speakers_list; + uuid_vec_t speakers_list; // Get a list of participants from VoiceClient - std::vector<LLUUID> speakers_uuids; + uuid_vec_t speakers_uuids; get_voice_participants_uuids(speakers_uuids); // Updating the status for each participant already in list. @@ -549,9 +549,9 @@ void LLCallFloater::updateParticipantsVoiceState() const LLUUID participant_id = item->getAvatarId(); bool found = false; - std::vector<LLUUID>::iterator speakers_iter = std::find(speakers_uuids.begin(), speakers_uuids.end(), participant_id); + uuid_vec_t::iterator speakers_iter = std::find(speakers_uuids.begin(), speakers_uuids.end(), participant_id); - lldebugs << "processing speaker: " << item->getAvatarName() << ", " << item->getAvatarId() << llendl; + LL_DEBUGS("Voice") << "processing speaker: " << item->getAvatarName() << ", " << item->getAvatarId() << LL_ENDL; // If an avatarID assigned to a panel is found in a speakers list // obtained from VoiceClient we assign the JOINED status to the owner @@ -597,10 +597,13 @@ void LLCallFloater::updateNotInVoiceParticipantState(LLAvatarListItem* item) } } break; - case STATE_INVITED: case STATE_LEFT: // nothing to do. These states should not be changed. break; + case STATE_INVITED: + // If avatar was invited into group chat and went offline it is still exists in mSpeakerStateMap + // If it goes online it will be rendered as JOINED via LAvatarListItem. + // Lets update its visual representation. See EXT-6660 case STATE_UNKNOWN: // If an avatarID is not found in a speakers list from VoiceClient and // a panel with this ID has an UNKNOWN status this means that this person @@ -659,8 +662,8 @@ void LLCallFloater::setVoiceRemoveTimer(const LLUUID& voice_speaker_id) bool LLCallFloater::removeVoiceLeftParticipant(const LLUUID& voice_speaker_id) { - LLAvatarList::uuid_vector_t& speaker_uuids = mAvatarList->getIDs(); - LLAvatarList::uuid_vector_t::iterator pos = std::find(speaker_uuids.begin(), speaker_uuids.end(), voice_speaker_id); + uuid_vec_t& speaker_uuids = mAvatarList->getIDs(); + uuid_vec_t::iterator pos = std::find(speaker_uuids.begin(), speaker_uuids.end(), voice_speaker_id); if(pos != speaker_uuids.end()) { speaker_uuids.erase(pos); @@ -678,8 +681,7 @@ void LLCallFloater::resetVoiceRemoveTimers() void LLCallFloater::removeVoiceRemoveTimer(const LLUUID& voice_speaker_id) { - bool delete_it = true; - mSpeakerDelayRemover->unsetActionTimer(voice_speaker_id, delete_it); + mSpeakerDelayRemover->unsetActionTimer(voice_speaker_id); } bool LLCallFloater::validateSpeaker(const LLUUID& speaker_id) @@ -690,7 +692,7 @@ bool LLCallFloater::validateSpeaker(const LLUUID& speaker_id) case VC_LOCAL_CHAT: { // A nearby chat speaker is considered valid it it's known to LLVoiceClient (i.e. has enabled voice). - std::vector<LLUUID> speakers; + uuid_vec_t speakers; get_voice_participants_uuids(speakers); is_valid = std::find(speakers.begin(), speakers.end(), speaker_id) != speakers.end(); } @@ -712,21 +714,29 @@ void LLCallFloater::connectToChannel(LLVoiceChannel* channel) { mVoiceChannelStateChangeConnection.disconnect(); - sCurrentVoiceCanel = channel; + sCurrentVoiceChannel = channel; - mVoiceChannelStateChangeConnection = sCurrentVoiceCanel->setStateChangedCallback(boost::bind(&LLCallFloater::onVoiceChannelStateChanged, this, _1, _2)); + mVoiceChannelStateChangeConnection = sCurrentVoiceChannel->setStateChangedCallback(boost::bind(&LLCallFloater::onVoiceChannelStateChanged, this, _1, _2)); updateState(channel->getState()); } void LLCallFloater::onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state) { - updateState(new_state); + // check is voice operational and if it doesn't work hide VCP (EXT-4397) + if(LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking()) + { + updateState(new_state); + } + else + { + closeFloater(); + } } void LLCallFloater::updateState(const LLVoiceChannel::EState& new_state) { - LL_DEBUGS("Voice") << "Updating state: " << new_state << ", session name: " << sCurrentVoiceCanel->getSessionName() << LL_ENDL; + LL_DEBUGS("Voice") << "Updating state: " << new_state << ", session name: " << sCurrentVoiceChannel->getSessionName() << LL_ENDL; if (LLVoiceChannel::STATE_CONNECTED == new_state) { updateSession(); @@ -750,18 +760,26 @@ void LLCallFloater::reset(const LLVoiceChannel::EState& new_state) mParticipants = NULL; mAvatarList->clear(); - // "loading" is shown in parcel with disabled voice only when state is "ringing" - // to avoid showing it in nearby chat vcp all the time- "no_one_near" is now shown there (EXT-4648) - bool show_loading = LLVoiceChannel::STATE_RINGING == new_state; - if(!show_loading && !LLViewerParcelMgr::getInstance()->allowAgentVoice() && mVoiceType == VC_LOCAL_CHAT) + // These ifs were added instead of simply showing "loading" to make VCP work correctly in parcels + // with disabled voice (EXT-4648 and EXT-4649) + if (!LLViewerParcelMgr::getInstance()->allowAgentVoice() && LLVoiceChannel::STATE_HUNG_UP == new_state) { + // hides "Leave Call" when call is ended in parcel with disabled voice- hiding usually happens in + // updateSession() which won't be called here because connect to nearby voice never happens + childSetVisible("leave_call_btn_panel", false); + // setting title to nearby chat an "no one near..." text- because in region with disabled + // voice we won't have chance to really connect to nearby, so VCP is changed here manually + setTitle(getString("title_nearby")); mAvatarList->setNoItemsCommentText(getString("no_one_near")); } - else + // "loading" is shown only when state is "ringing" to avoid showing it in nearby chat vcp + // of parcels with disabled voice all the time- "no_one_near" is now shown there (EXT-4648) + else if (new_state == LLVoiceChannel::STATE_RINGING) { // update floater to show Loading while waiting for data. mAvatarList->setNoItemsCommentText(LLTrans::getString("LoadingData")); } + mAvatarList->setVisible(TRUE); mNonAvatarCaller->setVisible(FALSE); diff --git a/indra/newview/llcallfloater.h b/indra/newview/llcallfloater.h index dac4390fa7..e4341175e2 100644 --- a/indra/newview/llcallfloater.h +++ b/indra/newview/llcallfloater.h @@ -47,15 +47,15 @@ class LLSpeakerMgr; class LLSpeakersDelayActionsStorage; /** - * The Voice Control Panel is an ambient window summoned by clicking the flyout chevron on the Speak button. - * It can be torn-off and freely positioned onscreen. + * The Voice Control Panel is an ambient window summoned by clicking the flyout chevron + * on the Speak button. It can be torn-off and freely positioned onscreen. * - * When the Resident is engaged in Nearby Voice Chat, the Voice Control Panel provides control over - * the Resident's own microphone input volume, the audible volume of each of the other participants, - * the Resident's own Voice Morphing settings (if she has subscribed to enable the feature), and Voice Recording. + * When the Resident is engaged in Voice Chat, the Voice Control Panel provides control + * over the audible volume of each of the other participants, the Resident's own Voice + * Morphing settings (if she has subscribed to enable the feature), and Voice Recording. * - * When the Resident is engaged in any chat except Nearby Chat, the Voice Control Panel also provides an - * 'Leave Call' button to allow the Resident to leave that voice channel. + * When the Resident is engaged in any chat except Nearby Chat, the Voice Control Panel + * also provides a 'Leave Call' button to allow the Resident to leave that voice channel. */ class LLCallFloater : public LLTransientDockableFloater, LLVoiceClientParticipantObserver { @@ -75,7 +75,7 @@ public: * * Refreshes list to display participants not in voice as disabled. */ - /*virtual*/ void onChange(); + /*virtual*/ void onParticipantsChanged(); static void sOnCurrentChannelChanged(const LLUUID& session_id); @@ -259,7 +259,11 @@ private: * * @see sOnCurrentChannelChanged() */ - static LLVoiceChannel* sCurrentVoiceCanel; + static LLVoiceChannel* sCurrentVoiceChannel; + + /* virtual */ + LLTransientFloaterMgr::ETransientGroup getGroup() { return LLTransientFloaterMgr::IM; } + boost::signals2::connection mVoiceChannelStateChangeConnection; }; diff --git a/indra/newview/llcallingcard.cpp b/indra/newview/llcallingcard.cpp index d988770f90..1a6c11fa73 100644 --- a/indra/newview/llcallingcard.cpp +++ b/indra/newview/llcallingcard.cpp @@ -56,12 +56,14 @@ #include "llnotifications.h" #include "llnotificationsutil.h" #include "llresmgr.h" +#include "llslurl.h" #include "llimview.h" #include "llviewercontrol.h" #include "llviewernetwork.h" #include "llviewerobjectlist.h" #include "llviewerwindow.h" #include "llvoavatar.h" +#include "llavataractions.h" ///---------------------------------------------------------------------------- /// Local function declarations, constants, enums, and typedefs @@ -680,9 +682,11 @@ void LLAvatarTracker::processNotify(LLMessageSystem* msg, bool online) } BOOL notify = FALSE; LLSD args; + LLSD payload; for(S32 i = 0; i < count; ++i) { msg->getUUIDFast(_PREHASH_AgentBlock, _PREHASH_AgentID, agent_id, i); + payload["FROM_ID"] = agent_id; info = getBuddyInfo(agent_id); if(info) { @@ -696,6 +700,7 @@ void LLAvatarTracker::processNotify(LLMessageSystem* msg, bool online) args["FIRST"] = first; args["LAST"] = last; } + } } else @@ -715,7 +720,21 @@ void LLAvatarTracker::processNotify(LLMessageSystem* msg, bool online) if(notify) { // Popup a notify box with online status of this agent - LLNotificationPtr notification = LLNotificationsUtil::add(online ? "FriendOnline" : "FriendOffline", args); + LLNotificationPtr notification; + + if (online) + { + notification = + LLNotificationsUtil::add("FriendOnline", + args, + payload.with("respond_on_mousedown", TRUE), + boost::bind(&LLAvatarActions::startIM, agent_id)); + } + else + { + notification = + LLNotificationsUtil::add("FriendOffline", args, payload); + } // If there's an open IM session with this agent, send a notification there too. LLUUID session_id = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL, agent_id); diff --git a/indra/newview/llchannelmanager.cpp b/indra/newview/llchannelmanager.cpp index 769387c26c..fafa315a59 100644 --- a/indra/newview/llchannelmanager.cpp +++ b/indra/newview/llchannelmanager.cpp @@ -35,6 +35,7 @@ #include "llchannelmanager.h" #include "llappviewer.h" +#include "llnotificationstorage.h" #include "llviewercontrol.h" #include "llviewerwindow.h" #include "llrootview.h" @@ -107,31 +108,35 @@ void LLChannelManager::onLoginCompleted() if(!away_notifications) { onStartUpToastClose(); - return; } - - // create a channel for the StartUp Toast - LLChannelManager::Params p; - p.id = LLUUID(gSavedSettings.getString("StartUpChannelUUID")); - p.channel_align = CA_RIGHT; - mStartUpChannel = createChannel(p); - - if(!mStartUpChannel) + else { - onStartUpToastClose(); - return; - } + // create a channel for the StartUp Toast + LLChannelManager::Params p; + p.id = LLUUID(gSavedSettings.getString("StartUpChannelUUID")); + p.channel_align = CA_RIGHT; + mStartUpChannel = createChannel(p); - gViewerWindow->getRootView()->addChild(mStartUpChannel); + if(!mStartUpChannel) + { + onStartUpToastClose(); + } + else + { + gViewerWindow->getRootView()->addChild(mStartUpChannel); - // init channel's position and size - S32 channel_right_bound = gViewerWindow->getWorldViewRectScaled().mRight - gSavedSettings.getS32("NotificationChannelRightMargin"); - S32 channel_width = gSavedSettings.getS32("NotifyBoxWidth"); - mStartUpChannel->init(channel_right_bound - channel_width, channel_right_bound); - mStartUpChannel->setMouseDownCallback(boost::bind(&LLNotificationWellWindow::onStartUpToastClick, LLNotificationWellWindow::getInstance(), _2, _3, _4)); + // init channel's position and size + S32 channel_right_bound = gViewerWindow->getWorldViewRectScaled().mRight - gSavedSettings.getS32("NotificationChannelRightMargin"); + S32 channel_width = gSavedSettings.getS32("NotifyBoxWidth"); + mStartUpChannel->init(channel_right_bound - channel_width, channel_right_bound); + mStartUpChannel->setMouseDownCallback(boost::bind(&LLNotificationWellWindow::onStartUpToastClick, LLNotificationWellWindow::getInstance(), _2, _3, _4)); - mStartUpChannel->setCommitCallback(boost::bind(&LLChannelManager::onStartUpToastClose, this)); - mStartUpChannel->createStartUpToast(away_notifications, gSavedSettings.getS32("StartUpToastLifeTime")); + mStartUpChannel->setCommitCallback(boost::bind(&LLChannelManager::onStartUpToastClose, this)); + mStartUpChannel->createStartUpToast(away_notifications, gSavedSettings.getS32("StartUpToastLifeTime")); + } + } + + LLPersistentNotificationStorage::getInstance()->loadNotifications(); } //-------------------------------------------------------------------------- @@ -238,3 +243,19 @@ void LLChannelManager::killToastsFromChannel(const LLUUID& channel_id, const LLS } } +// static +LLNotificationsUI::LLScreenChannel* LLChannelManager::getNotificationScreenChannel() +{ + LLNotificationsUI::LLScreenChannel* channel = static_cast<LLNotificationsUI::LLScreenChannel*> + (LLNotificationsUI::LLChannelManager::getInstance()-> + findChannelByID(LLUUID(gSavedSettings.getString("NotificationChannelUUID")))); + + if (channel == NULL) + { + llwarns << "Can't find screen channel by NotificationChannelUUID" << llendl; + llassert(!"Can't find screen channel by NotificationChannelUUID"); + } + + return channel; +} + diff --git a/indra/newview/llchannelmanager.h b/indra/newview/llchannelmanager.h index c2be39122f..8c725f2660 100644 --- a/indra/newview/llchannelmanager.h +++ b/indra/newview/llchannelmanager.h @@ -114,6 +114,11 @@ public: */ void killToastsFromChannel(const LLUUID& channel_id, const LLScreenChannel::Matcher& matcher); + /** + * Returns notification screen channel. + */ + static LLNotificationsUI::LLScreenChannel* getNotificationScreenChannel(); + private: LLScreenChannel* createChannel(LLChannelManager::Params& p); diff --git a/indra/newview/llchatbar.cpp b/indra/newview/llchatbar.cpp index b32a955038..cd279fa10a 100644 --- a/indra/newview/llchatbar.cpp +++ b/indra/newview/llchatbar.cpp @@ -107,7 +107,7 @@ LLChatBar::LLChatBar() LLChatBar::~LLChatBar() { - LLGestureManager::instance().removeObserver(mObserver); + LLGestureMgr::instance().removeObserver(mObserver); delete mObserver; mObserver = NULL; // LLView destructor cleans up children @@ -149,7 +149,6 @@ BOOL LLChatBar::handleKeyHere( KEY key, MASK mask ) { BOOL handled = FALSE; - // ALT-RETURN is reserved for windowed/fullscreen toggle if( KEY_RETURN == key ) { if (mask == MASK_CONTROL) @@ -209,8 +208,8 @@ void LLChatBar::refreshGestures() // collect list of unique gestures std::map <std::string, BOOL> unique; - LLGestureManager::item_map_t::const_iterator it; - const LLGestureManager::item_map_t& active_gestures = LLGestureManager::instance().getActiveGestures(); + LLGestureMgr::item_map_t::const_iterator it; + const LLGestureMgr::item_map_t& active_gestures = LLGestureMgr::instance().getActiveGestures(); for (it = active_gestures.begin(); it != active_gestures.end(); ++it) { LLMultiGesture* gesture = (*it).second; @@ -296,7 +295,7 @@ void LLChatBar::setGestureCombo(LLComboBox* combo) // now register observer since we have a place to put the results mObserver = new LLChatBarGestureObserver(this); - LLGestureManager::instance().addObserver(mObserver); + LLGestureMgr::instance().addObserver(mObserver); // refresh list from current active gestures refreshGestures(); @@ -377,7 +376,7 @@ void LLChatBar::sendChat( EChatType type ) if (0 == channel) { // discard returned "found" boolean - LLGestureManager::instance().triggerAndReviseString(utf8text, &utf8_revised_text); + LLGestureMgr::instance().triggerAndReviseString(utf8text, &utf8_revised_text); } else { @@ -516,7 +515,7 @@ void LLChatBar::onInputEditorKeystroke( LLLineEditor* caller, void* userdata ) std::string utf8_trigger = wstring_to_utf8str(raw_text); std::string utf8_out_str(utf8_trigger); - if (LLGestureManager::instance().matchPrefix(utf8_trigger, &utf8_out_str)) + if (LLGestureMgr::instance().matchPrefix(utf8_trigger, &utf8_out_str)) { if (self->mInputEditor) { @@ -653,7 +652,7 @@ void LLChatBar::onCommitGesture(LLUICtrl* ctrl) // substitution and logging. std::string text(trigger); std::string revised_text; - LLGestureManager::instance().triggerAndReviseString(text, &revised_text); + LLGestureMgr::instance().triggerAndReviseString(text, &revised_text); revised_text = utf8str_trim(revised_text); if (!revised_text.empty()) diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp index f046e08827..ab97dbb695 100644 --- a/indra/newview/llchathistory.cpp +++ b/indra/newview/llchathistory.cpp @@ -66,6 +66,9 @@ static LLDefaultChildRegistry::Register<LLChatHistory> r("chat_history"); const static std::string NEW_LINE(rawstr_to_utf8("\n")); +const static std::string SLURL_APP_AGENT = "secondlife:///app/agent/"; +const static std::string SLURL_ABOUT = "/about"; + // support for secondlife:///app/objectim/{UUID}/ SLapps class LLObjectIMHandler : public LLCommandHandler { @@ -90,7 +93,7 @@ public: payload["object_id"] = object_id; payload["owner_id"] = query_map["owner"]; payload["name"] = query_map["name"]; - payload["slurl"] = query_map["slurl"]; + payload["slurl"] = LLWeb::escapeURL(query_map["slurl"]); payload["group_owned"] = query_map["groupowned"]; LLFloaterReg::showInstance("inspect_remote_object", payload); return true; @@ -113,34 +116,6 @@ public: return LLPanel::handleMouseUp(x,y,mask); } - //*TODO remake it using mouse enter/leave and static LLHandle<LLIconCtrl> to add/remove as a child - BOOL handleToolTip(S32 x, S32 y, MASK mask) - { - LLViewerTextEditor* name = getChild<LLViewerTextEditor>("user_name"); - if (name && name->parentPointInView(x, y) && mAvatarID.notNull() && SYSTEM_FROM != mFrom) - { - - // Spawn at right side of the name textbox. - LLRect sticky_rect = name->calcScreenRect(); - S32 icon_x = llmin(sticky_rect.mLeft + name->getTextBoundingRect().getWidth() + 7, sticky_rect.mRight - 3); - - LLToolTip::Params params; - params.background_visible(false); - params.click_callback(boost::bind(&LLChatHistoryHeader::onHeaderPanelClick, this, 0, 0, 0)); - params.delay_time(0.0f); // spawn instantly on hover - params.image(LLUI::getUIImage("Info_Small")); - params.message(""); - params.padding(0); - params.pos(LLCoordGL(icon_x, sticky_rect.mTop - 2)); - params.sticky_rect(sticky_rect); - - LLToolTipMgr::getInstance()->show(params); - return TRUE; - } - - return LLPanel::handleToolTip(x, y, mask); - } - void onObjectIconContextMenuItemClicked(const LLSD& userdata) { std::string level = userdata.asString(); @@ -174,12 +149,7 @@ public: } else if (level == "add") { - std::string name; - name.assign(getFirstName()); - name.append(" "); - name.append(getLastName()); - - LLAvatarActions::requestFriendshipDialog(getAvatarId(), name); + LLAvatarActions::requestFriendshipDialog(getAvatarId(), mFrom); } else if (level == "remove") { @@ -200,7 +170,10 @@ public: menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_object_icon.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); mPopupMenuHandleObject = menu->getHandle(); - setDoubleClickCallback(boost::bind(&LLChatHistoryHeader::onHeaderPanelClick, this, _2, _3, _4)); + setDoubleClickCallback(boost::bind(&LLChatHistoryHeader::showInspector, this)); + + setMouseEnterCallback(boost::bind(&LLChatHistoryHeader::showInfoCtrl, this)); + setMouseLeaveCallback(boost::bind(&LLChatHistoryHeader::hideInfoCtrl, this)); return LLPanel::postBuild(); } @@ -234,8 +207,10 @@ public: return LLPanel::handleRightMouseDown(x,y,mask); } - void onHeaderPanelClick(S32 x, S32 y, MASK mask) + void showInspector() { + if (mAvatarID.isNull() && CHAT_SOURCE_SYSTEM != mSourceType) return; + if (mSourceType == CHAT_SOURCE_OBJECT) { LLFloaterReg::showInstance("inspect_object", LLSD().with("object_id", mAvatarID)); @@ -247,9 +222,18 @@ public: //if chat source is system, you may add "else" here to define behaviour. } + static void onClickInfoCtrl(LLUICtrl* info_ctrl) + { + if (!info_ctrl) return; + + LLChatHistoryHeader* header = dynamic_cast<LLChatHistoryHeader*>(info_ctrl->getParent()); + if (!header) return; + + header->showInspector(); + } + + const LLUUID& getAvatarId () const { return mAvatarID;} - const std::string& getFirstName() const { return mFirstName; } - const std::string& getLastName () const { return mLastName; } void setup(const LLChat& chat,const LLStyle::Params& style_params) { @@ -257,27 +241,27 @@ public: mSessionID = chat.mSessionID; mSourceType = chat.mSourceType; gCacheName->get(mAvatarID, FALSE, boost::bind(&LLChatHistoryHeader::nameUpdatedCallback, this, _1, _2, _3, _4)); - if(chat.mFromID.isNull()) + + //*TODO overly defensive thing, source type should be maintained out there + if((chat.mFromID.isNull() && chat.mFromName.empty()) || chat.mFromName == SYSTEM_FROM && chat.mFromID.isNull()) { mSourceType = CHAT_SOURCE_SYSTEM; } - LLTextEditor* userName = getChild<LLTextEditor>("user_name"); + LLTextBox* userName = getChild<LLTextBox>("user_name"); userName->setReadOnlyColor(style_params.readonly_color()); userName->setColor(style_params.color()); - if(!chat.mFromName.empty()) - { - userName->setValue(chat.mFromName); - mFrom = chat.mFromName; - } - else + userName->setValue(chat.mFromName); + mFrom = chat.mFromName; + if (chat.mFromName.empty() || CHAT_SOURCE_SYSTEM == mSourceType) { - std::string SL = LLTrans::getString("SECOND_LIFE"); - userName->setValue(SL); + mFrom = LLTrans::getString("SECOND_LIFE"); + userName->setValue(mFrom); } + mMinUserNameWidth = style_params.font()->getWidth(userName->getWText().c_str()) + PADDING; setTimeField(chat); @@ -287,20 +271,25 @@ public: if(mSourceType != CHAT_SOURCE_AGENT) icon->setDrawTooltip(false); - if(!chat.mFromID.isNull()) - { - icon->setValue(chat.mFromID); - } - else if (userName->getValue().asString()==LLTrans::getString("SECOND_LIFE")) + switch (mSourceType) { - icon->setValue(LLSD("SL_Logo")); + case CHAT_SOURCE_AGENT: + icon->setValue(chat.mFromID); + break; + case CHAT_SOURCE_OBJECT: + icon->setValue(LLSD("OBJECT_Icon")); + break; + case CHAT_SOURCE_SYSTEM: + icon->setValue(LLSD("SL_Logo")); + break; + case CHAT_SOURCE_UNKNOWN: + icon->setValue(LLSD("Unknown_Icon")); } - } /*virtual*/ void draw() { - LLTextEditor* user_name = getChild<LLTextEditor>("user_name"); + LLTextBox* user_name = getChild<LLTextBox>("user_name"); LLTextBox* time_box = getChild<LLTextBox>("time_box"); LLRect user_name_rect = user_name->getRect(); @@ -332,8 +321,7 @@ public: { if (id != mAvatarID) return; - mFirstName = first; - mLastName = last; + mFrom = first + " " + last; } protected: static const S32 PADDING = 20; @@ -342,9 +330,9 @@ protected: { if(mSourceType == CHAT_SOURCE_SYSTEM) showSystemContextMenu(x,y); - if(mSourceType == CHAT_SOURCE_AGENT) + if(mAvatarID.notNull() && mSourceType == CHAT_SOURCE_AGENT) showAvatarContextMenu(x,y); - if(mSourceType == CHAT_SOURCE_OBJECT && SYSTEM_FROM != mFrom) + if(mAvatarID.notNull() && mSourceType == CHAT_SOURCE_OBJECT && SYSTEM_FROM != mFrom) showObjectContextMenu(x,y); } @@ -388,6 +376,33 @@ protected: } } + void showInfoCtrl() + { + if (mAvatarID.isNull() || mFrom.empty() || SYSTEM_FROM == mFrom) return; + + if (!sInfoCtrl) + { + sInfoCtrl = LLUICtrlFactory::createFromFile<LLUICtrl>("inspector_info_ctrl.xml", NULL, LLPanel::child_registry_t::instance()); + sInfoCtrl->setCommitCallback(boost::bind(&LLChatHistoryHeader::onClickInfoCtrl, sInfoCtrl)); + } + + LLTextBase* name = getChild<LLTextBase>("user_name"); + LLRect sticky_rect = name->getRect(); + S32 icon_x = llmin(sticky_rect.mLeft + name->getTextBoundingRect().getWidth() + 7, sticky_rect.mRight - 3); + sInfoCtrl->setOrigin(icon_x, sticky_rect.getCenterY() - sInfoCtrl->getRect().getHeight() / 2 ) ; + addChild(sInfoCtrl); + } + + void hideInfoCtrl() + { + if (!sInfoCtrl) return; + + if (sInfoCtrl->getParent() == this) + { + removeChild(sInfoCtrl); + } + } + private: void setTimeField(const LLChat& chat) { @@ -416,16 +431,17 @@ protected: LLHandle<LLView> mPopupMenuHandleAvatar; LLHandle<LLView> mPopupMenuHandleObject; + static LLUICtrl* sInfoCtrl; + LLUUID mAvatarID; EChatSourceType mSourceType; - std::string mFirstName; - std::string mLastName; std::string mFrom; LLUUID mSessionID; S32 mMinUserNameWidth; }; +LLUICtrl* LLChatHistoryHeader::sInfoCtrl = NULL; LLChatHistory::LLChatHistory(const LLChatHistory::Params& p) : LLUICtrl(p), @@ -438,12 +454,14 @@ LLChatHistory::LLChatHistory(const LLChatHistory::Params& p) mTopSeparatorPad(p.top_separator_pad), mBottomSeparatorPad(p.bottom_separator_pad), mTopHeaderPad(p.top_header_pad), - mBottomHeaderPad(p.bottom_header_pad) + mBottomHeaderPad(p.bottom_header_pad), + mIsLastMessageFromLog(false) { LLTextEditor::Params editor_params(p); editor_params.rect = getLocalRect(); editor_params.follows.flags = FOLLOWS_ALL; editor_params.enabled = false; // read only + editor_params.show_context_menu = "true"; mEditor = LLUICtrlFactory::create<LLTextEditor>(editor_params, this); } @@ -473,7 +491,7 @@ void LLChatHistory::initFromParams(const LLChatHistory::Params& p) panel_p.background_visible = false; panel_p.has_border = false; panel_p.mouse_opaque = false; - stackp->addPanel(LLUICtrlFactory::create<LLPanel>(panel_p), 0, 30, true, false, LLLayoutStack::ANIMATE); + stackp->addPanel(LLUICtrlFactory::create<LLPanel>(panel_p), 0, 30, S32_MAX, S32_MAX, true, false, LLLayoutStack::ANIMATE); panel_p.name = "new_text_notice_holder"; LLRect new_text_notice_rect = getLocalRect(); @@ -491,7 +509,7 @@ void LLChatHistory::initFromParams(const LLChatHistory::Params& p) mMoreChatText = LLUICtrlFactory::create<LLTextBox>(text_p, mMoreChatPanel); mMoreChatText->setClickedCallback(boost::bind(&LLChatHistory::onClickMoreText, this)); - stackp->addPanel(mMoreChatPanel, 0, 0, false, false, LLLayoutStack::ANIMATE); + stackp->addPanel(mMoreChatPanel, 0, 0, S32_MAX, S32_MAX, false, false, LLLayoutStack::ANIMATE); } @@ -538,6 +556,12 @@ void LLChatHistory::clear() void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LLStyle::Params& input_append_params) { bool use_plain_text_chat_history = args["use_plain_text_chat_history"].asBoolean(); + + if(mEditor) + { + mEditor->setPlainText(use_plain_text_chat_history); + } + if (!mEditor->scrolledToEnd() && chat.mFromID != gAgent.getID() && !chat.mFromName.empty()) { mUnreadChatSources.insert(chat.mFromName); @@ -603,30 +627,44 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL style_params.font.style = "ITALIC"; } + bool message_from_log = chat.mChatStyle == CHAT_STYLE_HISTORY; + // We graying out chat history by graying out messages that contains full date in a time string + if (message_from_log) + { + style_params.color(LLColor4::grey); + style_params.readonly_color(LLColor4::grey); + } + if (use_plain_text_chat_history) { - mEditor->appendText("[" + chat.mTimeStr + "] ", mEditor->getText().size() != 0, style_params); + LLStyle::Params timestamp_style(style_params); + if (!message_from_log) + { + LLColor4 timestamp_color = LLUIColorTable::instance().getColor("ChatTimestampColor"); + timestamp_style.color(timestamp_color); + timestamp_style.readonly_color(timestamp_color); + } + mEditor->appendText("[" + chat.mTimeStr + "] ", mEditor->getText().size() != 0, timestamp_style); if (utf8str_trim(chat.mFromName).size() != 0) { // Don't hotlink any messages from the system (e.g. "Second Life:"), so just add those in plain text. - if ( chat.mSourceType == CHAT_SOURCE_OBJECT ) + if ( chat.mSourceType == CHAT_SOURCE_OBJECT && chat.mFromID.notNull()) { // for object IMs, create a secondlife:///app/objectim SLapp - std::string url = LLSLURL::buildCommand("objectim", chat.mFromID, ""); + std::string url = LLSLURL("objectim", chat.mFromID, "").getSLURLString(); url += "?name=" + chat.mFromName; - url += "&owner=" + args["owner_id"].asString(); + url += "&owner=" + chat.mOwnerID.asString(); std::string slurl = args["slurl"].asString(); if (slurl.empty()) { - LLViewerRegion *region = LLWorld::getInstance()->getRegionFromPosAgent(chat.mPosAgent); - if (region) - { - S32 x, y, z; - LLSLURL::globalPosToXYZ(LLVector3d(chat.mPosAgent), x, y, z); - slurl = region->getName() + llformat("/%d/%d/%d", x, y, z); - } + LLViewerRegion *region = LLWorld::getInstance()->getRegionFromPosAgent(chat.mPosAgent); + if(region) + { + LLSLURL region_slurl(region->getName(), chat.mPosAgent); + slurl = region_slurl.getLocationString(); + } } url += "&slurl=" + slurl; @@ -634,14 +672,14 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL // (don't let object names with hyperlinks override our objectim Url) LLStyle::Params link_params(style_params); link_params.color.control = "HTMLLinkColor"; - link_params.link_href = url; + link_params.link_href = LLURI::escape(url); mEditor->appendText("<nolink>" + chat.mFromName + "</nolink>" + delimiter, false, link_params); } - else if ( chat.mFromName != SYSTEM_FROM && chat.mFromID.notNull() ) + else if ( chat.mFromName != SYSTEM_FROM && chat.mFromID.notNull() && !message_from_log) { LLStyle::Params link_params(style_params); - link_params.fillFrom(LLStyleMap::instance().lookupAgent(chat.mFromID)); + link_params.overwriteFrom(LLStyleMap::instance().lookupAgent(chat.mFromID)); // Convert the name to a hotlink and add to message. mEditor->appendText(chat.mFromName + delimiter, false, link_params); } @@ -665,7 +703,7 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL && mLastFromID == chat.mFromID && mLastMessageTime.notNull() && (new_message_time.secondsSinceEpoch() - mLastMessageTime.secondsSinceEpoch()) < 60.0 - && mLastMessageTimeStr.size() == chat.mTimeStr.size()) //*HACK to distinguish between current and previous chat session's histories + && mIsLastMessageFromLog == message_from_log) //distinguish between current and previous chat session's histories { view = getSeparator(); p.top_pad = mTopSeparatorPad; @@ -699,7 +737,7 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL mLastFromName = chat.mFromName; mLastFromID = chat.mFromID; mLastMessageTime = new_message_time; - mLastMessageTimeStr = chat.mTimeStr; + mIsLastMessageFromLog = message_from_log; } if (chat.mNotifId.notNull()) @@ -707,29 +745,35 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL LLNotificationPtr notification = LLNotificationsUtil::find(chat.mNotifId); if (notification != NULL) { - LLToastNotifyPanel* notify_box = new LLToastNotifyPanel( - notification); + LLIMToastNotifyPanel* notify_box = new LLIMToastNotifyPanel( + notification, chat.mSessionID); //we can't set follows in xml since it broke toasts behavior notify_box->setFollowsLeft(); notify_box->setFollowsRight(); notify_box->setFollowsTop(); - LLButton* accept_button = notify_box->getChild<LLButton> ("Accept", - TRUE); - if (accept_button != NULL) - { - accept_button->setFollowsNone(); - accept_button->setOrigin(2*HPAD, accept_button->getRect().mBottom); - } - - LLButton* decline_button = notify_box->getChild<LLButton> ( - "Decline", TRUE); - if (accept_button != NULL && decline_button != NULL) + ctrl_list_t ctrls = notify_box->getControlPanel()->getCtrlList(); + S32 offset = 0; + // Children were added by addChild() which uses push_front to insert them into list, + // so to get buttons in correct order reverse iterator is used (EXT-5906) + for (ctrl_list_t::reverse_iterator it = ctrls.rbegin(); it != ctrls.rend(); it++) { - decline_button->setFollowsNone(); - decline_button->setOrigin(4*HPAD - + accept_button->getRect().getWidth(), - decline_button->getRect().mBottom); + LLButton * button = dynamic_cast<LLButton*> (*it); + if (button != NULL) + { + button->setOrigin( offset, + button->getRect().mBottom); + button->setLeftHPad(2 * HPAD); + button->setRightHPad(2 * HPAD); + // set zero width before perform autoResize() + button->setRect(LLRect(button->getRect().mLeft, + button->getRect().mTop, button->getRect().mLeft, + button->getRect().mBottom)); + button->setAutoResize(true); + button->autoResize(); + offset += HPAD + button->getRect().getWidth(); + button->setFollowsNone(); + } } LLTextEditor* text_editor = notify_box->getChild<LLTextEditor>("text_editor_box", TRUE); @@ -767,6 +811,25 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL else { std::string message = irc_me ? chat.mText.substr(3) : chat.mText; + + + //MESSAGE TEXT PROCESSING + //*HACK getting rid of redundant sender names in system notifications sent using sender name (see EXT-5010) + if (use_plain_text_chat_history && gAgentID != chat.mFromID && chat.mFromID.notNull()) + { + std::string slurl_about = SLURL_APP_AGENT + chat.mFromID.asString() + SLURL_ABOUT; + if (message.length() > slurl_about.length() && + message.compare(0, slurl_about.length(), slurl_about) == 0) + { + message = message.substr(slurl_about.length(), message.length()-1); + } + } + + if (irc_me && !use_plain_text_chat_history) + { + message = chat.mFromName + message; + } + mEditor->appendText(message, FALSE, style_params); } mEditor->blockUndo(); @@ -788,12 +851,3 @@ void LLChatHistory::draw() LLUICtrl::draw(); } - -void LLChatHistory::reshape(S32 width, S32 height, BOOL called_from_parent) -{ - bool is_scrolled_to_end = mEditor->scrolledToEnd(); - LLUICtrl::reshape( width, height, called_from_parent ); - // update scroll - if (is_scrolled_to_end) - mEditor->setCursorAndScrollToEnd(); -} diff --git a/indra/newview/llchathistory.h b/indra/newview/llchathistory.h index 32600bb71d..fa1f2e04a4 100644 --- a/indra/newview/llchathistory.h +++ b/indra/newview/llchathistory.h @@ -122,13 +122,13 @@ class LLChatHistory : public LLUICtrl */ void appendMessage(const LLChat& chat, const LLSD &args = LLSD(), const LLStyle::Params& input_append_params = LLStyle::Params()); /*virtual*/ void clear(); - /*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE); private: std::string mLastFromName; LLUUID mLastFromID; LLDate mLastMessageTime; - std::string mLastMessageTimeStr; + bool mIsLastMessageFromLog; + //std::string mLastMessageTimeStr; std::string mMessageHeaderFilename; std::string mMessageSeparatorFilename; diff --git a/indra/newview/llchatitemscontainerctrl.cpp b/indra/newview/llchatitemscontainerctrl.cpp index f772aea4bd..35a244c461 100644 --- a/indra/newview/llchatitemscontainerctrl.cpp +++ b/indra/newview/llchatitemscontainerctrl.cpp @@ -44,6 +44,8 @@ #include "llviewercontrol.h" #include "llagentdata.h" +#include "llslurl.h" + static const S32 msg_left_offset = 10; static const S32 msg_right_offset = 10; static const S32 msg_height_pad = 5; @@ -144,6 +146,7 @@ void LLNearbyChatToastPanel::init(LLSD& notification) std::string messageText = notification["message"].asString(); // UTF-8 line of text std::string fromName = notification["from"].asString(); // agent or object name mFromID = notification["from_id"].asUUID(); // agent id or object id + mFromName = fromName; int sType = notification["source"].asInteger(); mSourceType = (EChatSourceType)sType; @@ -189,6 +192,8 @@ void LLNearbyChatToastPanel::init(LLSD& notification) style_params_name.font.name(font_name); style_params_name.font.size(font_style_size); + style_params_name.link_href = LLSLURL("agent",mFromID,"about").getSLURLString(); + msg_text->appendText(str_sender, FALSE, style_params_name); } @@ -321,7 +326,14 @@ void LLNearbyChatToastPanel::draw() if(icon) { icon->setDrawTooltip(mSourceType == CHAT_SOURCE_AGENT); - icon->setValue(mFromID); + if(mSourceType == CHAT_SOURCE_OBJECT) + icon->setValue(LLSD("OBJECT_Icon")); + else if(mSourceType == CHAT_SOURCE_SYSTEM) + icon->setValue(LLSD("SL_Logo")); + else if(mSourceType == CHAT_SOURCE_AGENT) + icon->setValue(mFromID); + else if(!mFromID.isNull()) + icon->setValue(mFromID); } mIsDirty = false; } diff --git a/indra/newview/llchatitemscontainerctrl.h b/indra/newview/llchatitemscontainerctrl.h index 4d730573d9..b28c9dbc4b 100644 --- a/indra/newview/llchatitemscontainerctrl.h +++ b/indra/newview/llchatitemscontainerctrl.h @@ -60,6 +60,7 @@ public: static LLNearbyChatToastPanel* createInstance(); const LLUUID& getFromID() const { return mFromID;} + const std::string& getFromName() const { return mFromName; } //void addText (const std::string& message , const LLStyle::Params& input_params = LLStyle::Params()); //void setMessage (const LLChat& msg); @@ -84,9 +85,11 @@ public: virtual void draw(); + //*TODO REMOVE, why a dup of getFromID? const LLUUID& messageID() const { return mFromID;} private: LLUUID mFromID; // agent id or object id + std::string mFromName; EChatSourceType mSourceType; diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp index f646bcccb5..6897f4ee8e 100644 --- a/indra/newview/llchiclet.cpp +++ b/indra/newview/llchiclet.cpp @@ -36,6 +36,7 @@ #include "llagent.h" #include "llavataractions.h" #include "llbottomtray.h" +#include "lleventtimer.h" #include "llgroupactions.h" #include "lliconctrl.h" #include "llimfloater.h" @@ -130,8 +131,6 @@ LLSysWellChiclet::Params::Params() : button("button") , unread_notifications("unread_notifications") , max_displayed_count("max_displayed_count", 99) -, flash_to_lit_count("flash_to_lit_count", 3) -, flash_period("flash_period", 0.5F) { button.name("button"); button.tab_stop(FALSE); @@ -151,7 +150,13 @@ LLSysWellChiclet::LLSysWellChiclet(const Params& p) mButton = LLUICtrlFactory::create<LLButton>(button_params); addChild(mButton); - mFlashToLitTimer = new FlashToLitTimer(p.flash_to_lit_count, p.flash_period, boost::bind(&LLSysWellChiclet::changeLitState, this)); + // use settings from settings.xml to be able change them via Debug settings. See EXT-5973. + // Due to Timer is implemented as derived class from EventTimer it is impossible to change period + // in runtime. So, both settings are made as required restart. + static S32 flash_to_lit_count = gSavedSettings.getS32("WellIconFlashCount"); + static F32 flash_period = gSavedSettings.getF32("WellIconFlashPeriod"); + + mFlashToLitTimer = new FlashToLitTimer(flash_to_lit_count, flash_period, boost::bind(&LLSysWellChiclet::changeLitState, this)); } LLSysWellChiclet::~LLSysWellChiclet() @@ -178,20 +183,6 @@ void LLSysWellChiclet::setCounter(S32 counter) mButton->setLabel(s_count); - setNewMessagesState(counter > mCounter); - - // we have to flash to 'Lit' state each time new unread message is coming. - if (counter > mCounter) - { - mFlashToLitTimer->flash(); - } - else if (counter == 0) - { - // if notification is resolved while well is flashing it can leave in the 'Lit' state - // when flashing finishes itself. Let break flashing here. - mFlashToLitTimer->stopFlashing(); - } - mCounter = counter; } @@ -228,6 +219,11 @@ void LLSysWellChiclet::setNewMessagesState(bool new_messages) void LLSysWellChiclet::updateWidget(bool is_window_empty) { mButton->setEnabled(!is_window_empty); + + LLSD params; + params["well_empty"] = is_window_empty; + params["well_name"] = getName(); + notifyParent(params); } // virtual BOOL LLSysWellChiclet::handleRightMouseDown(S32 x, S32 y, MASK mask) @@ -306,7 +302,26 @@ void LLIMWellChiclet::createMenu() void LLIMWellChiclet::messageCountChanged(const LLSD& session_data) { - setCounter(LLBottomTray::getInstance()->getTotalUnreadIMCount()); + const LLUUID& session_id = session_data["session_id"]; + const S32 counter = LLBottomTray::getInstance()->getTotalUnreadIMCount(); + const bool im_not_visible = !LLFloaterReg::instanceVisible("im_container") + && !LLFloaterReg::instanceVisible("impanel", session_id); + + setNewMessagesState(counter > mCounter && im_not_visible); + + // we have to flash to 'Lit' state each time new unread message is coming. + if (counter > mCounter && im_not_visible) + { + mFlashToLitTimer->flash(); + } + else if (counter == 0) + { + // if notification is resolved while well is flashing it can leave in the 'Lit' state + // when flashing finishes itself. Let break flashing here. + mFlashToLitTimer->stopFlashing(); + } + + setCounter(counter); } /************************************************************************/ @@ -455,6 +470,7 @@ LLIMChiclet::LLIMChiclet(const LLIMChiclet::Params& p) , mSpeakerCtrl(NULL) , mCounterCtrl(NULL) , mChicletButton(NULL) +, mPopupMenu(NULL) { enableCounterControl(p.enable_counter); } @@ -545,6 +561,7 @@ void LLIMChiclet::toggleSpeakerControl() } setRequiredWidth(); + mSpeakerCtrl->setSpeakerId(LLUUID::null); mSpeakerCtrl->setVisible(getShowSpeaker()); } @@ -637,6 +654,37 @@ LLIMChiclet::EType LLIMChiclet::getIMSessionType(const LLUUID& session_id) return type; } +BOOL LLIMChiclet::handleRightMouseDown(S32 x, S32 y, MASK mask) +{ + if(!mPopupMenu) + { + createPopupMenu(); + } + + if (mPopupMenu) + { + updateMenuItems(); + mPopupMenu->arrangeAndClear(); + LLMenuGL::showPopup(this, mPopupMenu, x, y); + } + + return TRUE; +} + +bool LLIMChiclet::canCreateMenu() +{ + if(mPopupMenu) + { + llwarns << "Menu already exists" << llendl; + return false; + } + if(getSessionId().isNull()) + { + return false; + } + return true; +} + ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// @@ -654,7 +702,6 @@ LLIMP2PChiclet::Params::Params() LLIMP2PChiclet::LLIMP2PChiclet(const Params& p) : LLIMChiclet(p) , mChicletIconCtrl(NULL) -, mPopupMenu(NULL) { LLButton::Params button_params = p.chiclet_button; mChicletButton = LLUICtrlFactory::create<LLButton>(button_params); @@ -709,34 +756,10 @@ void LLIMP2PChiclet::updateMenuItems() mPopupMenu->getChild<LLUICtrl>("Add Friend")->setEnabled(!is_friend); } -BOOL LLIMP2PChiclet::handleRightMouseDown(S32 x, S32 y, MASK mask) -{ - if(!mPopupMenu) - { - createPopupMenu(); - } - - if (mPopupMenu) - { - updateMenuItems(); - mPopupMenu->arrangeAndClear(); - LLMenuGL::showPopup(this, mPopupMenu, x, y); - } - - return TRUE; -} - void LLIMP2PChiclet::createPopupMenu() { - if(mPopupMenu) - { - llwarns << "Menu already exists" << llendl; - return; - } - if(getSessionId().isNull()) - { + if(!canCreateMenu()) return; - } LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar; registrar.add("IMChicletMenu.Action", boost::bind(&LLIMP2PChiclet::onMenuItemClicked, this, _2)); @@ -786,7 +809,6 @@ LLAdHocChiclet::Params::Params() LLAdHocChiclet::LLAdHocChiclet(const Params& p) : LLIMChiclet(p) , mChicletIconCtrl(NULL) -, mPopupMenu(NULL) { LLButton::Params button_params = p.chiclet_button; mChicletButton = LLUICtrlFactory::create<LLButton>(button_params); @@ -856,15 +878,8 @@ void LLAdHocChiclet::switchToCurrentSpeaker() void LLAdHocChiclet::createPopupMenu() { - if(mPopupMenu) - { - llwarns << "Menu already exists" << llendl; + if(!canCreateMenu()) return; - } - if(getSessionId().isNull()) - { - return; - } LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar; registrar.add("IMChicletMenu.Action", boost::bind(&LLAdHocChiclet::onMenuItemClicked, this, _2)); @@ -884,22 +899,6 @@ void LLAdHocChiclet::onMenuItemClicked(const LLSD& user_data) } } -BOOL LLAdHocChiclet::handleRightMouseDown(S32 x, S32 y, MASK mask) -{ - if(!mPopupMenu) - { - createPopupMenu(); - } - - if (mPopupMenu) - { - mPopupMenu->arrangeAndClear(); - LLMenuGL::showPopup(this, mPopupMenu, x, y); - } - - return TRUE; -} - ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// @@ -918,7 +917,6 @@ LLIMGroupChiclet::LLIMGroupChiclet(const Params& p) : LLIMChiclet(p) , LLGroupMgrObserver(LLUUID::null) , mChicletIconCtrl(NULL) -, mPopupMenu(NULL) { LLButton::Params button_params = p.chiclet_button; mChicletButton = LLUICtrlFactory::create<LLButton>(button_params); @@ -954,7 +952,10 @@ LLIMGroupChiclet::~LLIMGroupChiclet() void LLIMGroupChiclet::draw() { - switchToCurrentSpeaker(); + if(getShowSpeaker()) + { + switchToCurrentSpeaker(); + } LLIMChiclet::draw(); } @@ -1028,34 +1029,10 @@ void LLIMGroupChiclet::updateMenuItems() mPopupMenu->getChild<LLUICtrl>("Chat")->setEnabled(!open_window_exists); } -BOOL LLIMGroupChiclet::handleRightMouseDown(S32 x, S32 y, MASK mask) -{ - if(!mPopupMenu) - { - createPopupMenu(); - } - - if (mPopupMenu) - { - updateMenuItems(); - mPopupMenu->arrangeAndClear(); - LLMenuGL::showPopup(this, mPopupMenu, x, y); - } - - return TRUE; -} - void LLIMGroupChiclet::createPopupMenu() { - if(mPopupMenu) - { - llwarns << "Menu already exists" << llendl; - return; - } - if(getSessionId().isNull()) - { + if(!canCreateMenu()) return; - } LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar; registrar.add("IMChicletMenu.Action", boost::bind(&LLIMGroupChiclet::onMenuItemClicked, this, _2)); @@ -1132,7 +1109,7 @@ void im_chiclet_callback(LLChicletPanel* panel, const LLSD& data){ S32 unread = data["participant_unread"].asInteger(); LLIMFloater* im_floater = LLIMFloater::findInstance(session_id); - if (im_floater && im_floater->getVisible()) + if (im_floater && im_floater->getVisible() && im_floater->hasFocus()) { unread = 0; } @@ -1154,10 +1131,10 @@ void im_chiclet_callback(LLChicletPanel* panel, const LLSD& data){ void object_chiclet_callback(const LLSD& data) { - LLUUID object_id = data["object_id"]; + LLUUID notification_id = data["notification_id"]; bool new_message = data["new_message"]; - std::list<LLChiclet*> chiclets = LLIMChiclet::sFindChicletsSignal(object_id); + std::list<LLChiclet*> chiclets = LLIMChiclet::sFindChicletsSignal(notification_id); std::list<LLChiclet *>::iterator iter; for (iter = chiclets.begin(); iter != chiclets.end(); iter++) { @@ -1889,12 +1866,8 @@ void LLScriptChiclet::setSessionId(const LLUUID& session_id) setShowNewMessagesIcon( getSessionId() != session_id ); LLIMChiclet::setSessionId(session_id); - LLUUID notification_id = LLScriptFloaterManager::getInstance()->findNotificationId(session_id); - LLNotificationPtr notification = LLNotifications::getInstance()->find(notification_id); - if(notification) - { - setToolTip(notification->getSubstitutions()["TITLE"].asString()); - } + + setToolTip(LLScriptFloaterManager::getObjectName(session_id)); } void LLScriptChiclet::setCounter(S32 counter) @@ -1907,6 +1880,28 @@ void LLScriptChiclet::onMouseDown() LLScriptFloaterManager::getInstance()->toggleScriptFloater(getSessionId()); } +void LLScriptChiclet::onMenuItemClicked(const LLSD& user_data) +{ + std::string action = user_data.asString(); + + if("end" == action) + { + LLScriptFloaterManager::instance().onRemoveNotification(getSessionId()); + } +} + +void LLScriptChiclet::createPopupMenu() +{ + if(!canCreateMenu()) + return; + + LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar; + registrar.add("ScriptChiclet.Action", boost::bind(&LLScriptChiclet::onMenuItemClicked, this, _2)); + + mPopupMenu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL> + ("menu_script_chiclet.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); +} + ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// @@ -1943,13 +1938,10 @@ void LLInvOfferChiclet::setSessionId(const LLUUID& session_id) { setShowNewMessagesIcon( getSessionId() != session_id ); + setToolTip(LLScriptFloaterManager::getObjectName(session_id)); + LLIMChiclet::setSessionId(session_id); - LLUUID notification_id = LLScriptFloaterManager::getInstance()->findNotificationId(session_id); - LLNotificationPtr notification = LLNotifications::getInstance()->find(notification_id); - if(notification) - { - setToolTip(notification->getSubstitutions()["TITLE"].asString()); - } + LLNotificationPtr notification = LLNotifications::getInstance()->find(session_id); if ( notification && notification->getName() == INVENTORY_USER_OFFER ) { @@ -1971,4 +1963,26 @@ void LLInvOfferChiclet::onMouseDown() LLScriptFloaterManager::instance().toggleScriptFloater(getSessionId()); } +void LLInvOfferChiclet::onMenuItemClicked(const LLSD& user_data) +{ + std::string action = user_data.asString(); + + if("end" == action) + { + LLScriptFloaterManager::instance().onRemoveNotification(getSessionId()); + } +} + +void LLInvOfferChiclet::createPopupMenu() +{ + if(!canCreateMenu()) + return; + + LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar; + registrar.add("InvOfferChiclet.Action", boost::bind(&LLInvOfferChiclet::onMenuItemClicked, this, _2)); + + mPopupMenu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL> + ("menu_inv_offer_chiclet.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); +} + // EOF diff --git a/indra/newview/llchiclet.h b/indra/newview/llchiclet.h index b006ae3420..9d421b4f0b 100644 --- a/indra/newview/llchiclet.h +++ b/indra/newview/llchiclet.h @@ -428,12 +428,31 @@ public: virtual void setToggleState(bool toggle); + /** + * Displays popup menu. + */ + virtual BOOL handleRightMouseDown(S32 x, S32 y, MASK mask); + protected: LLIMChiclet(const LLIMChiclet::Params& p); protected: + /** + * Creates chiclet popup menu. + */ + virtual void createPopupMenu() = 0; + + /** + * Enables/disables menus. + */ + virtual void updateMenuItems() {}; + + bool canCreateMenu(); + + LLMenuGL* mPopupMenu; + bool mShowSpeaker; bool mCounterEnabled; /* initial width of chiclet, should not include counter or speaker width */ @@ -519,11 +538,6 @@ protected: */ virtual void onMenuItemClicked(const LLSD& user_data); - /** - * Displays popup menu. - */ - /*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask); - /** * Enables/disables menus based on relationship with other participant. * Enables/disables "show session" menu item depending on visible IM floater existence. @@ -533,7 +547,6 @@ protected: private: LLChicletAvatarIconCtrl* mChicletIconCtrl; - LLMenuGL* mPopupMenu; }; /** @@ -598,11 +611,6 @@ protected: virtual void onMenuItemClicked(const LLSD& user_data); /** - * Displays popup menu. - */ - virtual BOOL handleRightMouseDown(S32 x, S32 y, MASK mask); - - /** * Finds a current speaker and resets the SpeakerControl with speaker's ID */ /*virtual*/ void switchToCurrentSpeaker(); @@ -610,7 +618,6 @@ protected: private: LLChicletAvatarIconCtrl* mChicletIconCtrl; - LLMenuGL* mPopupMenu; }; /** @@ -647,6 +654,16 @@ protected: LLScriptChiclet(const Params&); friend class LLUICtrlFactory; + /** + * Creates chiclet popup menu. + */ + virtual void createPopupMenu(); + + /** + * Processes clicks on chiclet popup menu. + */ + virtual void onMenuItemClicked(const LLSD& user_data); + private: LLIconCtrl* mChicletIconCtrl; @@ -685,6 +702,16 @@ protected: LLInvOfferChiclet(const Params&); friend class LLUICtrlFactory; + /** + * Creates chiclet popup menu. + */ + virtual void createPopupMenu(); + + /** + * Processes clicks on chiclet popup menu. + */ + virtual void onMenuItemClicked(const LLSD& user_data); + private: LLChicletInvOfferIconCtrl* mChicletIconCtrl; }; @@ -767,15 +794,9 @@ protected: */ virtual void updateMenuItems(); - /** - * Displays popup menu. - */ - /*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask); - private: LLChicletGroupIconCtrl* mChicletIconCtrl; - LLMenuGL* mPopupMenu; }; /** @@ -800,16 +821,6 @@ public: */ Optional<S32> max_displayed_count; - /** - * How many time chiclet should flash before set "Lit" state. Default value is 3. - */ - Optional<S32> flash_to_lit_count; - - /** - * Period of flashing while setting "Lit" state, in seconds. Default value is 0.5. - */ - Optional<F32> flash_period; - Params(); }; @@ -910,6 +921,9 @@ protected: class LLNotificationChiclet : public LLSysWellChiclet { friend class LLUICtrlFactory; +public: + struct Params : public LLInitParam::Block<Params, LLSysWellChiclet::Params>{}; + protected: LLNotificationChiclet(const Params& p); @@ -1228,12 +1242,15 @@ T* LLChicletPanel::findChiclet(const LLUUID& im_session_id) { LLChiclet* chiclet = *it; + llassert(chiclet); + if (!chiclet) continue; if(chiclet->getSessionId() == im_session_id) { T* result = dynamic_cast<T*>(chiclet); - if(!result && chiclet) + if(!result) { llwarns << "Found chiclet but of wrong type " << llendl; + continue; } return result; } diff --git a/indra/newview/llclassifiedstatsresponder.cpp b/indra/newview/llclassifiedstatsresponder.cpp index ecd1879090..95f17aa7ba 100644 --- a/indra/newview/llclassifiedstatsresponder.cpp +++ b/indra/newview/llclassifiedstatsresponder.cpp @@ -43,11 +43,12 @@ #include "llview.h" #include "message.h" -LLClassifiedStatsResponder::LLClassifiedStatsResponder(LLHandle<LLView> classified_panel_handle, LLUUID classified_id) -: mClassifiedPanelHandle(classified_panel_handle), +LLClassifiedStatsResponder::LLClassifiedStatsResponder(LLUUID classified_id) +: mClassifiedID(classified_id) { } + /*virtual*/ void LLClassifiedStatsResponder::result(const LLSD& content) { @@ -58,17 +59,12 @@ void LLClassifiedStatsResponder::result(const LLSD& content) S32 search_map = content["search_map_clicks"].asInteger(); S32 search_profile = content["search_profile_clicks"].asInteger(); - LLPanelClassified* classified_panelp = (LLPanelClassified*)mClassifiedPanelHandle.get(); - - if(classified_panelp) - { - classified_panelp->setClickThrough(mClassifiedID, - teleport + search_teleport, - map + search_map, - profile + search_profile, - true); - } - + LLPanelClassifiedInfo::setClickThrough( + mClassifiedID, + teleport + search_teleport, + map + search_map, + profile + search_profile, + true); } /*virtual*/ @@ -77,5 +73,3 @@ void LLClassifiedStatsResponder::error(U32 status, const std::string& reason) llinfos << "LLClassifiedStatsResponder::error(" << status << ": " << reason << ")" << llendl; } - - diff --git a/indra/newview/llclassifiedstatsresponder.h b/indra/newview/llclassifiedstatsresponder.h index 9c52ed5ae1..4a74f7b129 100644 --- a/indra/newview/llclassifiedstatsresponder.h +++ b/indra/newview/llclassifiedstatsresponder.h @@ -40,7 +40,7 @@ class LLClassifiedStatsResponder : public LLHTTPClient::Responder { public: - LLClassifiedStatsResponder(LLHandle<LLView> classified_panel_handle, LLUUID classified_id); + LLClassifiedStatsResponder(LLUUID classified_id); //If we get back a normal response, handle it here virtual void result(const LLSD& content); //If we get back an error (not found, etc...), handle it here @@ -48,7 +48,6 @@ public: virtual void error(U32 status, const std::string& reason); protected: - LLHandle<LLView> mClassifiedPanelHandle; LLUUID mClassifiedID; }; diff --git a/indra/newview/llcloud.cpp b/indra/newview/llcloud.cpp index af6f4e3286..a4104923e4 100644 --- a/indra/newview/llcloud.cpp +++ b/indra/newview/llcloud.cpp @@ -329,16 +329,7 @@ void LLCloudLayer::setRegion(LLViewerRegion *regionp) void LLCloudLayer::destroy() { - // Kill all of the existing puffs - S32 i, j; - - for (i = 0; i < CLOUD_GROUPS_PER_EDGE; i++) - { - for (j = 0; j < CLOUD_GROUPS_PER_EDGE; j++) - { - mCloudGroups[i][j].cleanup(); - } - } + reset(); delete [] mDensityp; mDensityp = NULL; @@ -348,8 +339,17 @@ void LLCloudLayer::destroy() void LLCloudLayer::reset() { -} + // Kill all of the existing puffs + S32 i, j; + for (i = 0; i < CLOUD_GROUPS_PER_EDGE; i++) + { + for (j = 0; j < CLOUD_GROUPS_PER_EDGE; j++) + { + mCloudGroups[i][j].cleanup(); + } + } +} void LLCloudLayer::setWindPointer(LLWind *windp) { diff --git a/indra/newview/llcofwearables.cpp b/indra/newview/llcofwearables.cpp new file mode 100644 index 0000000000..aa8cc01f7d --- /dev/null +++ b/indra/newview/llcofwearables.cpp @@ -0,0 +1,616 @@ +/** + * @file llcofwearables.cpp + * @brief LLCOFWearables displayes wearables from the current outfit split into three lists (attachments, clothing and body parts) + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llcofwearables.h" + +#include "llaccordionctrl.h" +#include "llaccordionctrltab.h" +#include "llagentdata.h" +#include "llagentwearables.h" +#include "llappearancemgr.h" +#include "llinventory.h" +#include "llinventoryfunctions.h" +#include "lllistcontextmenu.h" +#include "llmenugl.h" +#include "llviewermenu.h" +#include "llwearableitemslist.h" +#include "llpaneloutfitedit.h" +#include "llsidetray.h" +#include "lltrans.h" + +static LLRegisterPanelClassWrapper<LLCOFWearables> t_cof_wearables("cof_wearables"); + +const LLSD REARRANGE = LLSD().with("rearrange", LLSD()); + +static const LLWearableItemNameComparator WEARABLE_NAME_COMPARATOR; + +////////////////////////////////////////////////////////////////////////// + +class CofContextMenu : public LLListContextMenu +{ +protected: + CofContextMenu(LLCOFWearables* cof_wearables) + : mCOFWearables(cof_wearables) + { + llassert(mCOFWearables); + } + + void updateCreateWearableLabel(LLMenuGL* menu, const LLUUID& item_id) + { + LLMenuItemGL* menu_item = menu->getChild<LLMenuItemGL>("create_new"); + LLWearableType::EType w_type = getWearableType(item_id); + + // Hide the "Create new <WEARABLE_TYPE>" if it's irrelevant. + if (w_type == LLWearableType::WT_NONE) + { + menu_item->setVisible(FALSE); + return; + } + + // Set proper label for the "Create new <WEARABLE_TYPE>" menu item. + LLStringUtil::format_map_t args; + args["[WEARABLE_TYPE]"] = LLWearableType::getTypeDefaultNewName(w_type); + std::string new_label = LLTrans::getString("CreateNewWearable", args); + menu_item->setLabel(new_label); + } + + void createNew(const LLUUID& item_id) + { + LLAgentWearables::createWearable(getWearableType(item_id), true); + } + + // Get wearable type of the given item. + // + // There is a special case: so-called "dummy items" + // (i.e. the ones that are there just to indicate that you're not wearing + // any wearables of the corresponding type. They are currently grayed out + // and suffixed with "not worn"). + // Those items don't have an UUID, but they do have an associated wearable type. + // If the user has invoked context menu for such item, + // we ignore the passed item_id and retrieve wearable type from the item. + LLWearableType::EType getWearableType(const LLUUID& item_id) + { + if (!isDummyItem(item_id)) + { + LLViewerInventoryItem* item = gInventory.getLinkedItem(item_id); + if (item && item->isWearableType()) + { + return item->getWearableType(); + } + } + else if (mCOFWearables) // dummy item selected + { + LLPanelDummyClothingListItem* item; + + item = dynamic_cast<LLPanelDummyClothingListItem*>(mCOFWearables->getSelectedItem()); + if (item) + { + return item->getWearableType(); + } + } + + return LLWearableType::WT_NONE; + } + + static bool isDummyItem(const LLUUID& item_id) + { + return item_id.isNull(); + } + + LLCOFWearables* mCOFWearables; +}; + +////////////////////////////////////////////////////////////////////////// + +class CofAttachmentContextMenu : public CofContextMenu +{ +public: + CofAttachmentContextMenu(LLCOFWearables* cof_wearables) + : CofContextMenu(cof_wearables) + { + } + +protected: + + /*virtual*/ LLContextMenu* createMenu() + { + LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar; + + functor_t take_off = boost::bind(&LLAppearanceMgr::removeItemFromAvatar, LLAppearanceMgr::getInstance(), _1); + registrar.add("Attachment.Detach", boost::bind(handleMultiple, take_off, mUUIDs)); + + return createFromFile("menu_cof_attachment.xml"); + } +}; + +////////////////////////////////////////////////////////////////////////// + +class CofClothingContextMenu : public CofContextMenu +{ +public: + CofClothingContextMenu(LLCOFWearables* cof_wearables) + : CofContextMenu(cof_wearables) + { + } + +protected: + /*virtual*/ LLContextMenu* createMenu() + { + LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar; + LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar; + LLUUID selected_id = mUUIDs.back(); + functor_t take_off = boost::bind(&LLAppearanceMgr::removeItemFromAvatar, LLAppearanceMgr::getInstance(), _1); + + registrar.add("Clothing.TakeOff", boost::bind(handleMultiple, take_off, mUUIDs)); + registrar.add("Clothing.MoveUp", boost::bind(moveWearable, selected_id, false)); + registrar.add("Clothing.MoveDown", boost::bind(moveWearable, selected_id, true)); + registrar.add("Clothing.Edit", boost::bind(LLAgentWearables::editWearable, selected_id)); + registrar.add("Clothing.Create", boost::bind(&CofClothingContextMenu::createNew, this, selected_id)); + + enable_registrar.add("Clothing.OnEnable", boost::bind(&CofClothingContextMenu::onEnable, this, _2)); + + LLContextMenu* menu = createFromFile("menu_cof_clothing.xml"); + llassert(menu); + if (menu) + { + updateCreateWearableLabel(menu, selected_id); + } + return menu; + } + + bool onEnable(const LLSD& data) + { + std::string param = data.asString(); + LLUUID selected_id = mUUIDs.back(); + + if ("move_up" == param) + { + return gAgentWearables.canMoveWearable(selected_id, false); + } + else if ("move_down" == param) + { + return gAgentWearables.canMoveWearable(selected_id, true); + } + else if ("take_off" == param) + { + return get_is_item_worn(selected_id); + } + else if ("edit" == param) + { + return mUUIDs.size() == 1 && gAgentWearables.isWearableModifiable(selected_id); + } + return true; + } + + // We don't use LLAppearanceMgr::moveWearable() directly because + // the item may be invalidated between setting the callback and calling it. + static bool moveWearable(const LLUUID& item_id, bool closer_to_body) + { + LLViewerInventoryItem* item = gInventory.getItem(item_id); + return LLAppearanceMgr::instance().moveWearable(item, closer_to_body); + } +}; + +////////////////////////////////////////////////////////////////////////// + +class CofBodyPartContextMenu : public CofContextMenu +{ +public: + CofBodyPartContextMenu(LLCOFWearables* cof_wearables) + : CofContextMenu(cof_wearables) + { + } + +protected: + /*virtual*/ LLContextMenu* createMenu() + { + LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar; + LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar; + LLUUID selected_id = mUUIDs.back(); + + // *HACK* need to pass pointer to LLPanelOutfitEdit instead of LLSideTray::getInstance()->getPanel(). + // LLSideTray::getInstance()->getPanel() is rather slow variant + LLPanelOutfitEdit* panel_oe = dynamic_cast<LLPanelOutfitEdit*>(LLSideTray::getInstance()->getPanel("panel_outfit_edit")); + registrar.add("BodyPart.Replace", boost::bind(&LLPanelOutfitEdit::onReplaceBodyPartMenuItemClicked, panel_oe, selected_id)); + registrar.add("BodyPart.Edit", boost::bind(LLAgentWearables::editWearable, selected_id)); + registrar.add("BodyPart.Create", boost::bind(&CofBodyPartContextMenu::createNew, this, selected_id)); + + enable_registrar.add("BodyPart.OnEnable", boost::bind(&CofBodyPartContextMenu::onEnable, this, _2)); + + LLContextMenu* menu = createFromFile("menu_cof_body_part.xml"); + llassert(menu); + if (menu) + { + updateCreateWearableLabel(menu, selected_id); + } + return menu; + } + + bool onEnable(const LLSD& data) + { + std::string param = data.asString(); + LLUUID selected_id = mUUIDs.back(); + + if ("edit" == param) + { + return mUUIDs.size() == 1 && gAgentWearables.isWearableModifiable(selected_id); + } + + return true; + } +}; + +////////////////////////////////////////////////////////////////////////// + +LLCOFWearables::LLCOFWearables() : LLPanel(), + mAttachments(NULL), + mClothing(NULL), + mBodyParts(NULL), + mLastSelectedList(NULL) +{ + mClothingMenu = new CofClothingContextMenu(this); + mAttachmentMenu = new CofAttachmentContextMenu(this); + mBodyPartMenu = new CofBodyPartContextMenu(this); +}; + +LLCOFWearables::~LLCOFWearables() +{ + delete mClothingMenu; + delete mAttachmentMenu; + delete mBodyPartMenu; +} + +// virtual +BOOL LLCOFWearables::postBuild() +{ + mAttachments = getChild<LLFlatListView>("list_attachments"); + mClothing = getChild<LLFlatListView>("list_clothing"); + mBodyParts = getChild<LLFlatListView>("list_body_parts"); + + mClothing->setRightMouseDownCallback(boost::bind(&LLCOFWearables::onListRightClick, this, _1, _2, _3, mClothingMenu)); + mAttachments->setRightMouseDownCallback(boost::bind(&LLCOFWearables::onListRightClick, this, _1, _2, _3, mAttachmentMenu)); + mBodyParts->setRightMouseDownCallback(boost::bind(&LLCOFWearables::onListRightClick, this, _1, _2, _3, mBodyPartMenu)); + + //selection across different list/tabs is not supported + mAttachments->setCommitCallback(boost::bind(&LLCOFWearables::onSelectionChange, this, mAttachments)); + mClothing->setCommitCallback(boost::bind(&LLCOFWearables::onSelectionChange, this, mClothing)); + mBodyParts->setCommitCallback(boost::bind(&LLCOFWearables::onSelectionChange, this, mBodyParts)); + + mAttachments->setCommitOnSelectionChange(true); + mClothing->setCommitOnSelectionChange(true); + mBodyParts->setCommitOnSelectionChange(true); + + //clothing is sorted according to its position relatively to the body + mAttachments->setComparator(&WEARABLE_NAME_COMPARATOR); + mBodyParts->setComparator(&WEARABLE_NAME_COMPARATOR); + + return LLPanel::postBuild(); +} + +void LLCOFWearables::onSelectionChange(LLFlatListView* selected_list) +{ + if (!selected_list) return; + + if (selected_list != mLastSelectedList) + { + if (selected_list != mAttachments) mAttachments->resetSelection(true); + if (selected_list != mClothing) mClothing->resetSelection(true); + if (selected_list != mBodyParts) mBodyParts->resetSelection(true); + + mLastSelectedList = selected_list; + } + + onCommit(); +} + +void LLCOFWearables::refresh() +{ + typedef std::vector<LLSD> values_vector_t; + typedef std::map<LLFlatListView*, values_vector_t> selection_map_t; + + selection_map_t preserve_selection; + + // Save current selection + mAttachments->getSelectedValues(preserve_selection[mAttachments]); + mClothing->getSelectedValues(preserve_selection[mClothing]); + mBodyParts->getSelectedValues(preserve_selection[mBodyParts]); + + clear(); + + LLInventoryModel::cat_array_t cats; + LLInventoryModel::item_array_t cof_items; + + gInventory.collectDescendents(LLAppearanceMgr::getInstance()->getCOF(), cats, cof_items, LLInventoryModel::EXCLUDE_TRASH); + + populateAttachmentsAndBodypartsLists(cof_items); + + + LLAppearanceMgr::wearables_by_type_t clothing_by_type(LLWearableType::WT_COUNT); + LLAppearanceMgr::getInstance()->divvyWearablesByType(cof_items, clothing_by_type); + + populateClothingList(clothing_by_type); + + // Restore previous selection + for (selection_map_t::iterator + iter = preserve_selection.begin(), + iter_end = preserve_selection.end(); + iter != iter_end; ++iter) + { + LLFlatListView* list = iter->first; + const values_vector_t& values = iter->second; + for (values_vector_t::const_iterator + value_it = values.begin(), + value_it_end = values.end(); + value_it != value_it_end; ++value_it) + { + list->selectItemByValue(*value_it); + } + } +} + + +void LLCOFWearables::populateAttachmentsAndBodypartsLists(const LLInventoryModel::item_array_t& cof_items) +{ + for (U32 i = 0; i < cof_items.size(); ++i) + { + LLViewerInventoryItem* item = cof_items.get(i); + if (!item) continue; + + const LLAssetType::EType item_type = item->getType(); + if (item_type == LLAssetType::AT_CLOTHING) continue; + LLPanelInventoryListItemBase* item_panel = NULL; + if (item_type == LLAssetType::AT_OBJECT) + { + item_panel = buildAttachemntListItem(item); + mAttachments->addItem(item_panel, item->getUUID(), ADD_BOTTOM, false); + } + else if (item_type == LLAssetType::AT_BODYPART) + { + item_panel = buildBodypartListItem(item); + if (!item_panel) continue; + + mBodyParts->addItem(item_panel, item->getUUID(), ADD_BOTTOM, false); + } + } + + if (mAttachments->size()) + { + mAttachments->sort(); + mAttachments->notify(REARRANGE); //notifying the parent about the list's size change (cause items were added with rearrange=false) + } + + if (mBodyParts->size()) + { + mBodyParts->sort(); + mBodyParts->notify(REARRANGE); + } +} + +//create a clothing list item, update verbs and show/hide line separator +LLPanelClothingListItem* LLCOFWearables::buildClothingListItem(LLViewerInventoryItem* item, bool first, bool last) +{ + llassert(item); + if (!item) return NULL; + LLPanelClothingListItem* item_panel = LLPanelClothingListItem::create(item); + if (!item_panel) return NULL; + + //updating verbs + //we don't need to use permissions of a link but of an actual/linked item + if (item->getLinkedItem()) item = item->getLinkedItem(); + llassert(item); + if (!item) return NULL; + + bool allow_modify = item->getPermissions().allowModifyBy(gAgentID); + + item_panel->setShowLockButton(!allow_modify); + item_panel->setShowEditButton(allow_modify); + + item_panel->setShowMoveUpButton(!first); + item_panel->setShowMoveDownButton(!last); + + //setting callbacks + //*TODO move that item panel's inner structure disclosing stuff into the panels + item_panel->childSetAction("btn_delete", mCOFCallbacks.mDeleteWearable); + item_panel->childSetAction("btn_move_up", mCOFCallbacks.mMoveWearableFurther); + item_panel->childSetAction("btn_move_down", mCOFCallbacks.mMoveWearableCloser); + item_panel->childSetAction("btn_edit", mCOFCallbacks.mEditWearable); + + //turning on gray separator line for the last item in the items group of the same wearable type + item_panel->childSetVisible("wearable_type_separator_icon", last); + + return item_panel; +} + +LLPanelBodyPartsListItem* LLCOFWearables::buildBodypartListItem(LLViewerInventoryItem* item) +{ + llassert(item); + if (!item) return NULL; + LLPanelBodyPartsListItem* item_panel = LLPanelBodyPartsListItem::create(item); + if (!item_panel) return NULL; + + //updating verbs + //we don't need to use permissions of a link but of an actual/linked item + if (item->getLinkedItem()) item = item->getLinkedItem(); + llassert(item); + if (!item) return NULL; + bool allow_modify = item->getPermissions().allowModifyBy(gAgentID); + item_panel->setShowLockButton(!allow_modify); + item_panel->setShowEditButton(allow_modify); + + //setting callbacks + //*TODO move that item panel's inner structure disclosing stuff into the panels + item_panel->childSetAction("btn_delete", mCOFCallbacks.mDeleteWearable); + item_panel->childSetAction("btn_edit", mCOFCallbacks.mEditWearable); + + return item_panel; +} + +LLPanelDeletableWearableListItem* LLCOFWearables::buildAttachemntListItem(LLViewerInventoryItem* item) +{ + llassert(item); + if (!item) return NULL; + + LLPanelAttachmentListItem* item_panel = LLPanelAttachmentListItem::create(item); + if (!item_panel) return NULL; + + //setting callbacks + //*TODO move that item panel's inner structure disclosing stuff into the panels + item_panel->childSetAction("btn_delete", mCOFCallbacks.mDeleteWearable); + + return item_panel; +} + +void LLCOFWearables::populateClothingList(LLAppearanceMgr::wearables_by_type_t& clothing_by_type) +{ + llassert(clothing_by_type.size() == LLWearableType::WT_COUNT); + + for (U32 type = LLWearableType::WT_SHIRT; type < LLWearableType::WT_COUNT; ++type) + { + U32 size = clothing_by_type[type].size(); + if (!size) continue; + + LLAppearanceMgr::sortItemsByActualDescription(clothing_by_type[type]); + + //clothing items are displayed in reverse order, from furthest ones to closest ones (relatively to the body) + for (U32 i = size; i != 0; --i) + { + LLViewerInventoryItem* item = clothing_by_type[type][i-1]; + + LLPanelClothingListItem* item_panel = buildClothingListItem(item, i == size, i == 1); + if (!item_panel) continue; + + mClothing->addItem(item_panel, item->getUUID(), ADD_BOTTOM, false); + } + } + + addClothingTypesDummies(clothing_by_type); + + mClothing->notify(REARRANGE); +} + +//adding dummy items for missing wearable types +void LLCOFWearables::addClothingTypesDummies(const LLAppearanceMgr::wearables_by_type_t& clothing_by_type) +{ + llassert(clothing_by_type.size() == LLWearableType::WT_COUNT); + + for (U32 type = LLWearableType::WT_SHIRT; type < LLWearableType::WT_COUNT; type++) + { + U32 size = clothing_by_type[type].size(); + if (size) continue; + + LLWearableType::EType w_type = static_cast<LLWearableType::EType>(type); + LLPanelInventoryListItemBase* item_panel = LLPanelDummyClothingListItem::create(w_type); + if(!item_panel) continue; + item_panel->childSetAction("btn_add", mCOFCallbacks.mAddWearable); + mClothing->addItem(item_panel, LLUUID::null, ADD_BOTTOM, false); + } +} + +LLUUID LLCOFWearables::getSelectedUUID() +{ + if (!mLastSelectedList) return LLUUID::null; + + return mLastSelectedList->getSelectedUUID(); +} + +bool LLCOFWearables::getSelectedUUIDs(uuid_vec_t& selected_ids) +{ + if (!mLastSelectedList) return false; + + mLastSelectedList->getSelectedUUIDs(selected_ids); + return selected_ids.size() != 0; +} + +LLPanel* LLCOFWearables::getSelectedItem() +{ + if (!mLastSelectedList) return NULL; + + return mLastSelectedList->getSelectedItem(); +} + +void LLCOFWearables::getSelectedItems(std::vector<LLPanel*>& selected_items) const +{ + if (mLastSelectedList) + { + mLastSelectedList->getSelectedItems(selected_items); + } +} + +void LLCOFWearables::clear() +{ + mAttachments->clear(); + mClothing->clear(); + mBodyParts->clear(); +} + +LLAssetType::EType LLCOFWearables::getExpandedAccordionAssetType() +{ + typedef std::map<std::string, LLAssetType::EType> type_map_t; + + static type_map_t type_map; + static LLAccordionCtrl* accordion_ctrl = getChild<LLAccordionCtrl>("cof_wearables_accordion"); + + if (type_map.empty()) + { + type_map["tab_clothing"] = LLAssetType::AT_CLOTHING; + type_map["tab_attachments"] = LLAssetType::AT_OBJECT; + type_map["tab_body_parts"] = LLAssetType::AT_BODYPART; + } + + const LLAccordionCtrlTab* tab = accordion_ctrl->getExpandedTab(); + LLAssetType::EType result = LLAssetType::AT_NONE; + + if (tab) + { + type_map_t::iterator i = type_map.find(tab->getName()); + llassert(i != type_map.end()); + result = i->second; + } + + return result; +} + +void LLCOFWearables::onListRightClick(LLUICtrl* ctrl, S32 x, S32 y, LLListContextMenu* menu) +{ + if(menu) + { + uuid_vec_t selected_uuids; + if(getSelectedUUIDs(selected_uuids)) + { + menu->show(ctrl, selected_uuids, x, y); + } + } +} + +//EOF diff --git a/indra/newview/llcofwearables.h b/indra/newview/llcofwearables.h new file mode 100644 index 0000000000..62f4cfc692 --- /dev/null +++ b/indra/newview/llcofwearables.h @@ -0,0 +1,118 @@ +/** + * @file llcofwearables.h + * @brief LLCOFWearables displayes wearables from the current outfit split into three lists (attachments, clothing and body parts) + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLCOFWEARABLES_H +#define LL_LLCOFWEARABLES_H + +// llui +#include "llflatlistview.h" +#include "llpanel.h" + +#include "llappearancemgr.h" +#include "llinventorymodel.h" + +class LLListContextMenu; +class LLPanelClothingListItem; +class LLPanelBodyPartsListItem; +class LLPanelDeletableWearableListItem; + +class LLCOFWearables : public LLPanel +{ +public: + + /** + * Represents a collection of callbacks assigned to inventory panel item's buttons + */ + class LLCOFCallbacks + { + public: + LLCOFCallbacks() {}; + virtual ~LLCOFCallbacks() {}; + + typedef boost::function<void (void*)> cof_callback_t; + + cof_callback_t mAddWearable; + cof_callback_t mMoveWearableCloser; + cof_callback_t mMoveWearableFurther; + cof_callback_t mEditWearable; + cof_callback_t mDeleteWearable; + }; + + + + LLCOFWearables(); + virtual ~LLCOFWearables(); + + /*virtual*/ BOOL postBuild(); + + LLUUID getSelectedUUID(); + bool getSelectedUUIDs(uuid_vec_t& selected_ids); + + LLPanel* getSelectedItem(); + void getSelectedItems(std::vector<LLPanel*>& selected_items) const; + + void refresh(); + void clear(); + + LLAssetType::EType getExpandedAccordionAssetType(); + + LLCOFCallbacks& getCOFCallbacks() { return mCOFCallbacks; } + +protected: + + void populateAttachmentsAndBodypartsLists(const LLInventoryModel::item_array_t& cof_items); + void populateClothingList(LLAppearanceMgr::wearables_by_type_t& clothing_by_type); + + void addClothingTypesDummies(const LLAppearanceMgr::wearables_by_type_t& clothing_by_type); + void onSelectionChange(LLFlatListView* selected_list); + + LLPanelClothingListItem* buildClothingListItem(LLViewerInventoryItem* item, bool first, bool last); + LLPanelBodyPartsListItem* buildBodypartListItem(LLViewerInventoryItem* item); + LLPanelDeletableWearableListItem* buildAttachemntListItem(LLViewerInventoryItem* item); + + void onListRightClick(LLUICtrl* ctrl, S32 x, S32 y, LLListContextMenu* menu); + + LLFlatListView* mAttachments; + LLFlatListView* mClothing; + LLFlatListView* mBodyParts; + + LLFlatListView* mLastSelectedList; + + LLCOFCallbacks mCOFCallbacks; + + LLListContextMenu* mClothingMenu; + LLListContextMenu* mAttachmentMenu; + LLListContextMenu* mBodyPartMenu; +}; + + +#endif diff --git a/indra/newview/llcolorswatch.cpp b/indra/newview/llcolorswatch.cpp index dc6847f236..b83e4fe830 100644 --- a/indra/newview/llcolorswatch.cpp +++ b/indra/newview/llcolorswatch.cpp @@ -68,7 +68,7 @@ LLColorSwatchCtrl::Params::Params() LLColorSwatchCtrl::LLColorSwatchCtrl(const Params& p) : LLUICtrl(p), mValid( TRUE ), - mColor(p.color), + mColor(p.color()), mCanApplyImmediately(p.can_apply_immediately), mAlphaGradientImage(p.alpha_background_image), mOnCancelCallback(p.cancel_callback()), @@ -338,7 +338,11 @@ void LLColorSwatchCtrl::showPicker(BOOL take_focus) if (!pickerp) { pickerp = new LLFloaterColorPicker(this, mCanApplyImmediately); - //gFloaterView->getParentFloater(this)->addDependentFloater(pickerp); + LLFloater* parent = gFloaterView->getParentFloater(this); + if (parent) + { + parent->addDependentFloater(pickerp); + } mPickerHandle = pickerp->getHandle(); } diff --git a/indra/newview/llcolorswatch.h b/indra/newview/llcolorswatch.h index 4bb7d837cb..09bb49cfbe 100644 --- a/indra/newview/llcolorswatch.h +++ b/indra/newview/llcolorswatch.h @@ -60,7 +60,7 @@ public: struct Params : public LLInitParam::Block<Params, LLUICtrl::Params> { - Optional<LLColor4> color; + Optional<LLUIColor> color; Optional<bool> can_apply_immediately; Optional<LLUIImage*> alpha_background_image; Optional<commit_callback_t> cancel_callback; diff --git a/indra/newview/llcompilequeue.cpp b/indra/newview/llcompilequeue.cpp index a96981a108..feb8c540ef 100644 --- a/indra/newview/llcompilequeue.cpp +++ b/indra/newview/llcompilequeue.cpp @@ -114,7 +114,7 @@ BOOL LLFloaterScriptQueue::postBuild() // worked on. // NOT static, virtual! void LLFloaterScriptQueue::inventoryChanged(LLViewerObject* viewer_object, - InventoryObjectList* inv, + LLInventoryObject::object_list_t* inv, S32, void* q_id) { @@ -305,7 +305,7 @@ LLFloaterCompileQueue::~LLFloaterCompileQueue() } void LLFloaterCompileQueue::handleInventory(LLViewerObject *viewer_object, - InventoryObjectList* inv) + LLInventoryObject::object_list_t* inv) { // find all of the lsl, leaving off duplicates. We'll remove // all matching asset uuids on compilation success. @@ -313,8 +313,8 @@ void LLFloaterCompileQueue::handleInventory(LLViewerObject *viewer_object, typedef std::multimap<LLUUID, LLPointer<LLInventoryItem> > uuid_item_map; uuid_item_map asset_item_map; - InventoryObjectList::const_iterator it = inv->begin(); - InventoryObjectList::const_iterator end = inv->end(); + LLInventoryObject::object_list_t::const_iterator it = inv->begin(); + LLInventoryObject::object_list_t::const_iterator end = inv->end(); for ( ; it != end; ++it) { if((*it)->getType() == LLAssetType::AT_LSL_TEXT) @@ -625,14 +625,14 @@ LLFloaterResetQueue::~LLFloaterResetQueue() } void LLFloaterResetQueue::handleInventory(LLViewerObject* viewer_obj, - InventoryObjectList* inv) + LLInventoryObject::object_list_t* inv) { // find all of the lsl, leaving off duplicates. We'll remove // all matching asset uuids on compilation success. LLDynamicArray<const char*> names; - InventoryObjectList::const_iterator it = inv->begin(); - InventoryObjectList::const_iterator end = inv->end(); + LLInventoryObject::object_list_t::const_iterator it = inv->begin(); + LLInventoryObject::object_list_t::const_iterator end = inv->end(); for ( ; it != end; ++it) { if((*it)->getType() == LLAssetType::AT_LSL_TEXT) @@ -677,14 +677,14 @@ LLFloaterRunQueue::~LLFloaterRunQueue() } void LLFloaterRunQueue::handleInventory(LLViewerObject* viewer_obj, - InventoryObjectList* inv) + LLInventoryObject::object_list_t* inv) { // find all of the lsl, leaving off duplicates. We'll remove // all matching asset uuids on compilation success. LLDynamicArray<const char*> names; - InventoryObjectList::const_iterator it = inv->begin(); - InventoryObjectList::const_iterator end = inv->end(); + LLInventoryObject::object_list_t::const_iterator it = inv->begin(); + LLInventoryObject::object_list_t::const_iterator end = inv->end(); for ( ; it != end; ++it) { if((*it)->getType() == LLAssetType::AT_LSL_TEXT) @@ -732,14 +732,14 @@ LLFloaterNotRunQueue::~LLFloaterNotRunQueue() } void LLFloaterNotRunQueue::handleInventory(LLViewerObject* viewer_obj, - InventoryObjectList* inv) + LLInventoryObject::object_list_t* inv) { // find all of the lsl, leaving off duplicates. We'll remove // all matching asset uuids on compilation success. LLDynamicArray<const char*> names; - InventoryObjectList::const_iterator it = inv->begin(); - InventoryObjectList::const_iterator end = inv->end(); + LLInventoryObject::object_list_t::const_iterator it = inv->begin(); + LLInventoryObject::object_list_t::const_iterator end = inv->end(); for ( ; it != end; ++it) { if((*it)->getType() == LLAssetType::AT_LSL_TEXT) diff --git a/indra/newview/llcompilequeue.h b/indra/newview/llcompilequeue.h index 2d061f5d8a..4fde2572af 100644 --- a/indra/newview/llcompilequeue.h +++ b/indra/newview/llcompilequeue.h @@ -76,13 +76,13 @@ protected: // This is the callback method for the viewer object currently // being worked on. /*virtual*/ void inventoryChanged(LLViewerObject* obj, - InventoryObjectList* inv, + LLInventoryObject::object_list_t* inv, S32 serial_num, void* queue); // This is called by inventoryChanged virtual void handleInventory(LLViewerObject* viewer_obj, - InventoryObjectList* inv) = 0; + LLInventoryObject::object_list_t* inv) = 0; static void onCloseBtn(void* user_data); @@ -145,7 +145,7 @@ protected: // This is called by inventoryChanged virtual void handleInventory(LLViewerObject* viewer_obj, - InventoryObjectList* inv); + LLInventoryObject::object_list_t* inv); // This is the callback for when each script arrives static void scriptArrived(LLVFS *vfs, const LLUUID& asset_id, @@ -192,7 +192,7 @@ protected: // This is called by inventoryChanged virtual void handleInventory(LLViewerObject* viewer_obj, - InventoryObjectList* inv); + LLInventoryObject::object_list_t* inv); }; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -210,7 +210,7 @@ protected: // This is called by inventoryChanged virtual void handleInventory(LLViewerObject* viewer_obj, - InventoryObjectList* inv); + LLInventoryObject::object_list_t* inv); }; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -228,7 +228,7 @@ protected: // This is called by inventoryChanged virtual void handleInventory(LLViewerObject* viewer_obj, - InventoryObjectList* inv); + LLInventoryObject::object_list_t* inv); }; #endif // LL_LLCOMPILEQUEUE_H diff --git a/indra/newview/llcurrencyuimanager.cpp b/indra/newview/llcurrencyuimanager.cpp index 00c05445e1..fd3df359bd 100644 --- a/indra/newview/llcurrencyuimanager.cpp +++ b/indra/newview/llcurrencyuimanager.cpp @@ -284,7 +284,7 @@ void LLCurrencyUIManager::Impl::startTransaction(TransactionType type, static std::string transactionURI; if (transactionURI.empty()) { - transactionURI = LLViewerLogin::getInstance()->getHelperURI() + "currency.php"; + transactionURI = LLGridManager::getInstance()->getHelperURI() + "currency.php"; } delete mTransaction; @@ -426,7 +426,7 @@ void LLCurrencyUIManager::Impl::prepare() LLLineEditor* lindenAmount = mPanel.getChild<LLLineEditor>("currency_amt"); if (lindenAmount) { - lindenAmount->setPrevalidate(LLLineEditor::prevalidateNonNegativeS32); + lindenAmount->setPrevalidate(LLTextValidate::validateNonNegativeS32); lindenAmount->setKeystrokeCallback(onCurrencyKey, this); } } diff --git a/indra/newview/lldateutil.cpp b/indra/newview/lldateutil.cpp index abb2fdeb9a..3e71ecdfba 100644 --- a/indra/newview/lldateutil.cpp +++ b/indra/newview/lldateutil.cpp @@ -59,19 +59,22 @@ static S32 days_from_month(S32 year, S32 month) } } -std::string LLDateUtil::ageFromDate(const std::string& date_string, - const LLDate& now) +bool LLDateUtil::dateFromPDTString(LLDate& date, const std::string& str) +{ + S32 month, day, year; + S32 matched = sscanf(str.c_str(), "%d/%d/%d", &month, &day, &year); + if (matched != 3) return false; + date.fromYMDHMS(year, month, day); + F64 secs_since_epoch = date.secondsSinceEpoch(); + // Correct for the fact that specified date is in Pacific time, == UTC - 8 + secs_since_epoch += 8.0 * 60.0 * 60.0; + date.secondsSinceEpoch(secs_since_epoch); + return true; +} + +std::string LLDateUtil::ageFromDate(const LLDate& born_date, const LLDate& now) { S32 born_month, born_day, born_year; - S32 matched = sscanf(date_string.c_str(), "%d/%d/%d", &born_month, &born_day, &born_year); - if (matched != 3) return "???"; - LLDate born_date; - born_date.fromYMDHMS(born_year, born_month, born_day); - F64 born_date_secs_since_epoch = born_date.secondsSinceEpoch(); - // Correct for the fact that account creation dates are in Pacific time, - // == UTC - 8 - born_date_secs_since_epoch += 8.0 * 60.0 * 60.0; - born_date.secondsSinceEpoch(born_date_secs_since_epoch); // explode out to month/day/year again born_date.split(&born_year, &born_month, &born_day); @@ -155,6 +158,16 @@ std::string LLDateUtil::ageFromDate(const std::string& date_string, return LLTrans::getString("TodayOld"); } +std::string LLDateUtil::ageFromDate(const std::string& date_string, const LLDate& now) +{ + LLDate born_date; + + if (!dateFromPDTString(born_date, date_string)) + return "???"; + + return ageFromDate(born_date, now); +} + std::string LLDateUtil::ageFromDate(const std::string& date_string) { return ageFromDate(date_string, LLDate::now()); diff --git a/indra/newview/lldateutil.h b/indra/newview/lldateutil.h index 041be07f12..a0df21022e 100644 --- a/indra/newview/lldateutil.h +++ b/indra/newview/lldateutil.h @@ -36,6 +36,29 @@ class LLDate; namespace LLDateUtil { + /** + * Convert a date provided by the server into seconds since the Epoch. + * + * @param[out] date Number of seconds since 01/01/1970 UTC. + * @param[in] str Date string (MM/DD/YYYY) in PDT time zone. + * + * @return true on success, false on parse error + */ + bool dateFromPDTString(LLDate& date, const std::string& str); + + /** + * Get human-readable avatar age. + * + * Used for avatar inspectors and profiles. + * + * @param born_date Date an avatar was born on. + * @param now Current date. + * + * @return human-readable localized string like "1 year, 2 months", + * or "???" on error. + */ + std::string ageFromDate(const LLDate& born_date, const LLDate& now); + // Convert a date provided by the server (MM/DD/YYYY) into a localized, // human-readable age (1 year, 2 months) using translation strings. // Pass LLDate::now() for now. diff --git a/indra/newview/lldebugview.cpp b/indra/newview/lldebugview.cpp index 169a963d0d..f113cc49d4 100644 --- a/indra/newview/lldebugview.cpp +++ b/indra/newview/lldebugview.cpp @@ -81,11 +81,13 @@ void LLDebugView::init() r.setLeftTopAndSize(25, rect.getHeight() - 50, (S32) (gViewerWindow->getWindowRectScaled().getWidth() * 0.75f), (S32) (gViewerWindow->getWindowRectScaled().getHeight() * 0.75f)); + mFastTimerView = new LLFastTimerView(r); mFastTimerView->setFollowsTop(); mFastTimerView->setFollowsLeft(); mFastTimerView->setVisible(FALSE); // start invisible addChild(mFastTimerView); + mFastTimerView->setRect(rect); r.setLeftTopAndSize(25, rect.getHeight() - 50, (S32) (gViewerWindow->getWindowRectScaled().getWidth() * 0.75f), (S32) (gViewerWindow->getWindowRectScaled().getHeight() * 0.75f)); diff --git a/indra/newview/lldrawable.cpp b/indra/newview/lldrawable.cpp index d60330024a..3f9d3fdbef 100644 --- a/indra/newview/lldrawable.cpp +++ b/indra/newview/lldrawable.cpp @@ -386,8 +386,6 @@ void LLDrawable::makeActive() mParent->makeActive(); } - gPipeline.setActive(this, TRUE); - //all child objects must also be active llassert_always(mVObjp); @@ -434,7 +432,6 @@ void LLDrawable::makeStatic(BOOL warning_enabled) if (isState(ACTIVE)) { clearState(ACTIVE); - gPipeline.setActive(this, FALSE); if (mParent.notNull() && mParent->isActive() && warning_enabled) { @@ -1049,9 +1046,13 @@ LLSpatialBridge::LLSpatialBridge(LLDrawable* root, BOOL render_by_group, U32 dat llassert(mDrawable); llassert(mDrawable->getRegion()); - llassert(mDrawable->getRegion()->getSpatialPartition(mPartitionType)); + LLSpatialPartition *part = mDrawable->getRegion()->getSpatialPartition(mPartitionType); + llassert(part); - mDrawable->getRegion()->getSpatialPartition(mPartitionType)->put(this); + if (part) + { + part->put(this); + } } LLSpatialBridge::~LLSpatialBridge() @@ -1365,12 +1366,17 @@ void LLSpatialBridge::move(LLDrawable *drawablep, LLSpatialGroup *curp, BOOL imm BOOL LLSpatialBridge::updateMove() { - llassert(mDrawable); - llassert(mDrawable->getRegion()); - llassert(mDrawable->getRegion()->getSpatialPartition(mPartitionType)); + llassert_always(mDrawable); + llassert_always(mDrawable->mVObjp); + llassert_always(mDrawable->getRegion()); + LLSpatialPartition* part = mDrawable->getRegion()->getSpatialPartition(mPartitionType); + llassert_always(part); mOctree->balance(); - mDrawable->getRegion()->getSpatialPartition(mPartitionType)->move(this, getSpatialGroup(), TRUE); + if (part) + { + part->move(this, getSpatialGroup(), TRUE); + } return TRUE; } diff --git a/indra/newview/lldrawpool.cpp b/indra/newview/lldrawpool.cpp index 95ddacb722..e3e66fa00d 100644 --- a/indra/newview/lldrawpool.cpp +++ b/indra/newview/lldrawpool.cpp @@ -442,7 +442,6 @@ void LLRenderPass::renderTexture(U32 type, U32 mask) void LLRenderPass::pushBatches(U32 type, U32 mask, BOOL texture) { - llpushcallstacks ; for (LLCullResult::drawinfo_list_t::iterator i = gPipeline.beginRenderMap(type); i != gPipeline.endRenderMap(type); ++i) { LLDrawInfo* pparams = *i; @@ -496,8 +495,8 @@ void LLRenderPass::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture) params.mGroup->rebuildMesh(); } params.mVertexBuffer->setBuffer(mask); - params.mVertexBuffer->drawRange(LLRender::TRIANGLES, params.mStart, params.mEnd, params.mCount, params.mOffset); - gPipeline.addTrianglesDrawn(params.mCount/3); + params.mVertexBuffer->drawRange(params.mDrawMode, params.mStart, params.mEnd, params.mCount, params.mOffset); + gPipeline.addTrianglesDrawn(params.mCount, params.mDrawMode); } if (params.mTextureMatrix && texture && params.mTexture.notNull()) diff --git a/indra/newview/lldrawpoolalpha.cpp b/indra/newview/lldrawpoolalpha.cpp index 6d77361414..875c9ac6a9 100644 --- a/indra/newview/lldrawpoolalpha.cpp +++ b/indra/newview/lldrawpoolalpha.cpp @@ -180,6 +180,7 @@ void LLDrawPoolAlpha::render(S32 pass) if (LLPipeline::sFastAlpha && !deferred_render) { + LLGLDisable blend_disable(GL_BLEND); gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.33f); if (mVertexShaderLevel > 0) { @@ -250,8 +251,8 @@ void LLDrawPoolAlpha::renderAlphaHighlight(U32 mask) params.mGroup->rebuildMesh(); } params.mVertexBuffer->setBuffer(mask); - params.mVertexBuffer->drawRange(LLRender::TRIANGLES, params.mStart, params.mEnd, params.mCount, params.mOffset); - gPipeline.addTrianglesDrawn(params.mCount/3); + params.mVertexBuffer->drawRange(params.mDrawMode, params.mStart, params.mEnd, params.mCount, params.mOffset); + gPipeline.addTrianglesDrawn(params.mCount, params.mDrawMode); } } } @@ -380,8 +381,8 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask) } params.mVertexBuffer->setBuffer(mask); - params.mVertexBuffer->drawRange(LLRender::TRIANGLES, params.mStart, params.mEnd, params.mCount, params.mOffset); - gPipeline.addTrianglesDrawn(params.mCount/3); + params.mVertexBuffer->drawRange(params.mDrawMode, params.mStart, params.mEnd, params.mCount, params.mOffset); + gPipeline.addTrianglesDrawn(params.mCount, params.mDrawMode); if (params.mTextureMatrix && params.mTexture.notNull()) { diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp index 546b60f286..2d0859650a 100644 --- a/indra/newview/lldrawpoolavatar.cpp +++ b/indra/newview/lldrawpoolavatar.cpp @@ -634,7 +634,7 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass) if (!single_avatar && !avatarp->isFullyLoaded() ) { - if (pass==1 && (!gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_PARTICLES) || LLViewerPartSim::getMaxPartCount() <= 0)) + if (pass==0 && (!gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_PARTICLES) || LLViewerPartSim::getMaxPartCount() <= 0)) { // debug code to draw a sphere in place of avatar gGL.getTexUnit(0)->bind(LLViewerFetchedTexture::sWhiteImagep); @@ -646,8 +646,10 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass) gGL.translatef((F32)(pos.mV[VX]), (F32)(pos.mV[VY]), (F32)(pos.mV[VZ])); - gGL.scalef(0.15f, 0.15f, 0.3f); - gSphere.render(); + gGL.scalef(0.15f, 0.15f, 0.3f); + + gSphere.renderGGL(); + gGL.popMatrix(); gGL.setColorMask(true, false); } diff --git a/indra/newview/lldrawpoolbump.cpp b/indra/newview/lldrawpoolbump.cpp index 03a8b108e2..19cdccb630 100644 --- a/indra/newview/lldrawpoolbump.cpp +++ b/indra/newview/lldrawpoolbump.cpp @@ -560,8 +560,8 @@ void LLDrawPoolBump::renderGroup(LLSpatialGroup* group, U32 type, U32 mask, BOOL params.mGroup->rebuildMesh(); } params.mVertexBuffer->setBuffer(mask); - params.mVertexBuffer->drawRange(LLRender::TRIANGLES, params.mStart, params.mEnd, params.mCount, params.mOffset); - gPipeline.addTrianglesDrawn(params.mCount/3); + params.mVertexBuffer->drawRange(params.mDrawMode, params.mStart, params.mEnd, params.mCount, params.mOffset); + gPipeline.addTrianglesDrawn(params.mCount, params.mDrawMode); } } @@ -825,7 +825,6 @@ void LLBumpImageList::addTextureStats(U8 bump, const LLUUID& base_image_id, F32 void LLBumpImageList::updateImages() { - llpushcallstacks ; for (bump_image_map_t::iterator iter = mBrightnessEntries.begin(); iter != mBrightnessEntries.end(); ) { bump_image_map_t::iterator curiter = iter++; @@ -852,7 +851,6 @@ void LLBumpImageList::updateImages() } } } - llpushcallstacks ; for (bump_image_map_t::iterator iter = mDarknessEntries.begin(); iter != mDarknessEntries.end(); ) { bump_image_map_t::iterator curiter = iter++; @@ -879,7 +877,6 @@ void LLBumpImageList::updateImages() } } } - llpushcallstacks ; } @@ -1231,8 +1228,8 @@ void LLDrawPoolBump::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture) params.mGroup->rebuildMesh(); } params.mVertexBuffer->setBuffer(mask); - params.mVertexBuffer->drawRange(LLRender::TRIANGLES, params.mStart, params.mEnd, params.mCount, params.mOffset); - gPipeline.addTrianglesDrawn(params.mCount/3); + params.mVertexBuffer->drawRange(params.mDrawMode, params.mStart, params.mEnd, params.mCount, params.mOffset); + gPipeline.addTrianglesDrawn(params.mCount, params.mDrawMode); if (params.mTextureMatrix) { if (mShiny) diff --git a/indra/newview/lldrawpooltree.cpp b/indra/newview/lldrawpooltree.cpp index 5521fb05a8..1571415e63 100644 --- a/indra/newview/lldrawpooltree.cpp +++ b/indra/newview/lldrawpooltree.cpp @@ -113,9 +113,12 @@ void LLDrawPoolTree::render(S32 pass) iter != mDrawFace.end(); iter++) { LLFace *face = *iter; - face->mVertexBuffer->setBuffer(LLDrawPoolTree::VERTEX_DATA_MASK); - face->mVertexBuffer->drawRange(LLRender::TRIANGLES, 0, face->mVertexBuffer->getRequestedVerts()-1, face->mVertexBuffer->getRequestedIndices(), 0); - gPipeline.addTrianglesDrawn(face->mVertexBuffer->getRequestedIndices()/3); + if(face->mVertexBuffer.notNull()) + { + face->mVertexBuffer->setBuffer(LLDrawPoolTree::VERTEX_DATA_MASK); + face->mVertexBuffer->drawRange(LLRender::TRIANGLES, 0, face->mVertexBuffer->getRequestedVerts()-1, face->mVertexBuffer->getRequestedIndices(), 0); + gPipeline.addTrianglesDrawn(face->mVertexBuffer->getRequestedIndices()); + } } } } @@ -237,7 +240,7 @@ void LLDrawPoolTree::renderForSelect() face->mVertexBuffer->setBuffer(LLDrawPoolTree::VERTEX_DATA_MASK); face->mVertexBuffer->drawRange(LLRender::TRIANGLES, 0, face->mVertexBuffer->getRequestedVerts()-1, face->mVertexBuffer->getRequestedIndices(), 0); - gPipeline.addTrianglesDrawn(face->mVertexBuffer->getRequestedIndices()/3); + gPipeline.addTrianglesDrawn(face->mVertexBuffer->getRequestedIndices()); } } } @@ -333,7 +336,7 @@ void LLDrawPoolTree::renderTree(BOOL selecting) S32 stop_depth = 0; F32 app_angle = treep->getAppAngle()*LLVOTree::sTreeFactor; F32 alpha = 1.0; - S32 trunk_LOD = 0; + S32 trunk_LOD = LLVOTree::sMAX_NUM_TREE_LOD_LEVELS; for (S32 j = 0; j < 4; j++) { @@ -344,6 +347,10 @@ void LLDrawPoolTree::renderTree(BOOL selecting) break; } } + if(trunk_LOD >= LLVOTree::sMAX_NUM_TREE_LOD_LEVELS) + { + continue ; //do not render. + } if (app_angle < (THRESH_ANGLE_FOR_BILLBOARD - BLEND_RANGE_FOR_BILLBOARD)) { diff --git a/indra/newview/lldriverparam.cpp b/indra/newview/lldriverparam.cpp index 8ebfa471f3..40ce0ebcf4 100644 --- a/indra/newview/lldriverparam.cpp +++ b/indra/newview/lldriverparam.cpp @@ -118,13 +118,12 @@ void LLDriverParamInfo::toStream(std::ostream &out) out << std::endl; - LLVOAvatarSelf *avatar = gAgent.getAvatarObject(); - if(avatar) + if(isAgentAvatarValid()) { for (entry_info_list_t::iterator iter = mDrivenInfoList.begin(); iter != mDrivenInfoList.end(); iter++) { LLDrivenEntryInfo driven = *iter; - LLViewerVisualParam *param = (LLViewerVisualParam*)avatar->getVisualParam(driven.mDrivenID); + LLViewerVisualParam *param = (LLViewerVisualParam*)gAgentAvatarp->getVisualParam(driven.mDrivenID); if (param) { param->getInfo()->toStream(out); @@ -146,7 +145,7 @@ void LLDriverParamInfo::toStream(std::ostream &out) } else { - llwarns << "could not get parameter " << driven.mDrivenID << " from avatar " << avatar << " for driver parameter " << getID() << llendl; + llwarns << "could not get parameter " << driven.mDrivenID << " from avatar " << gAgentAvatarp << " for driver parameter " << getID() << llendl; } out << std::endl; } @@ -432,6 +431,12 @@ const LLVector3* LLDriverParam::getNextDistortion(U32 *index, LLPolyMesh **poly_ } } + llassert(driven); + if (!driven) + { + return NULL; // shouldn't happen, but... + } + // We're already in the middle of a param's distortions, so get the next one. const LLVector3* v = driven->mParam->getNextDistortion( index, poly_mesh ); if( (!v) && (iter != mDriven.end()) ) @@ -529,7 +534,7 @@ void LLDriverParam::resetDrivenParams() mDriven.reserve(getInfo()->mDrivenInfoList.size()); } -void LLDriverParam::updateCrossDrivenParams(EWearableType driven_type) +void LLDriverParam::updateCrossDrivenParams(LLWearableType::EType driven_type) { bool needs_update = (getWearableType()==driven_type); @@ -546,7 +551,7 @@ void LLDriverParam::updateCrossDrivenParams(EWearableType driven_type) if (needs_update) { - EWearableType driver_type = (EWearableType)getWearableType(); + LLWearableType::EType driver_type = (LLWearableType::EType)getWearableType(); // If we've gotten here, we've added a new wearable of type "type" // Thus this wearable needs to get updates from the driver wearable. @@ -620,13 +625,13 @@ F32 LLDriverParam::getDrivenWeight(const LLDrivenEntry* driven, F32 input_weight void LLDriverParam::setDrivenWeight(LLDrivenEntry *driven, F32 driven_weight, bool upload_bake) { - LLVOAvatarSelf *avatar_self = gAgent.getAvatarObject(); - if(mWearablep && + if(isAgentAvatarValid() && + mWearablep && driven->mParam->getCrossWearable() && mWearablep->isOnTop()) { // call setWeight through LLVOAvatarSelf so other wearables can be updated with the correct values - avatar_self->setVisualParamWeight( (LLVisualParam*)driven->mParam, driven_weight, upload_bake ); + gAgentAvatarp->setVisualParamWeight( (LLVisualParam*)driven->mParam, driven_weight, upload_bake ); } else { diff --git a/indra/newview/lldriverparam.h b/indra/newview/lldriverparam.h index e963a2d55a..1069f7ad51 100644 --- a/indra/newview/lldriverparam.h +++ b/indra/newview/lldriverparam.h @@ -34,7 +34,7 @@ #define LL_LLDRIVERPARAM_H #include "llviewervisualparam.h" -#include "llwearabledictionary.h" +#include "llwearabletype.h" class LLVOAvatar; class LLWearable; @@ -94,7 +94,7 @@ public: void setWearable(LLWearable *wearablep); void setAvatar(LLVOAvatar *avatarp); - void updateCrossDrivenParams(EWearableType driven_type); + void updateCrossDrivenParams(LLWearableType::EType driven_type); /*virtual*/ LLViewerVisualParam* cloneParam(LLWearable* wearable) const; diff --git a/indra/newview/lldynamictexture.cpp b/indra/newview/lldynamictexture.cpp index c7c79401a0..c423473740 100644 --- a/indra/newview/lldynamictexture.cpp +++ b/indra/newview/lldynamictexture.cpp @@ -167,6 +167,8 @@ void LLViewerDynamicTexture::postRender(BOOL success) { generateGLTexture() ; } + llcallstacks << "class type: " << (S32)getType() << llcallstacksendl ; + success = mGLTexturep->setSubImageFromFrameBuffer(0, 0, mOrigin.mX, mOrigin.mY, mFullWidth, mFullHeight); } } diff --git a/indra/newview/lldynamictexture.h b/indra/newview/lldynamictexture.h index 2a944eaada..caf2603519 100644 --- a/indra/newview/lldynamictexture.h +++ b/indra/newview/lldynamictexture.h @@ -41,6 +41,19 @@ class LLViewerDynamicTexture : public LLViewerTexture { +public: + enum + { + LL_VIEWER_DYNAMIC_TEXTURE = LLViewerTexture::DYNAMIC_TEXTURE, + LL_TEX_LAYER_SET_BUFFER = LLViewerTexture::INVALID_TEXTURE_TYPE + 1, + LL_VISUAL_PARAM_HINT, + LL_VISUAL_PARAM_RESET, + LL_PREVIEW_ANIMATION, + LL_IMAGE_PREVIEW_SCULPTED, + LL_IMAGE_PREVIEW_AVATAR, + INVALID_DYNAMIC_TEXTURE + }; + protected: /*virtual*/ ~LLViewerDynamicTexture(); diff --git a/indra/newview/lleventpoll.cpp b/indra/newview/lleventpoll.cpp index eca9f8aba2..cc4e1a1868 100644 --- a/indra/newview/lleventpoll.cpp +++ b/indra/newview/lleventpoll.cpp @@ -39,7 +39,7 @@ #include "llhttpclient.h" #include "llhttpstatuscodes.h" #include "llsdserialize.h" -#include "lltimer.h" +#include "lleventtimer.h" #include "llviewerregion.h" #include "message.h" #include "lltrans.h" diff --git a/indra/newview/llexpandabletextbox.cpp b/indra/newview/llexpandabletextbox.cpp index 3818ee6f78..149ba2478d 100644 --- a/indra/newview/llexpandabletextbox.cpp +++ b/indra/newview/llexpandabletextbox.cpp @@ -35,6 +35,7 @@ #include "llscrollcontainer.h" #include "llwindow.h" +#include "llviewerwindow.h" static LLDefaultChildRegistry::Register<LLExpandableTextBox> t1("expandable_text"); @@ -111,13 +112,12 @@ private: }; LLExpandableTextBox::LLTextBoxEx::Params::Params() -: more_label("more_label") { } LLExpandableTextBox::LLTextBoxEx::LLTextBoxEx(const Params& p) : LLTextEditor(p), - mExpanderLabel(p.more_label), + mExpanderLabel(p.label), mExpanderVisible(false) { setIsChrome(TRUE); @@ -382,7 +382,7 @@ void LLExpandableTextBox::expandTextBox() setFocus(TRUE); // this lets us receive top_lost event(needed to collapse text box) // it also draws text box above all other ui elements - gFocusMgr.setTopCtrl(this); + gViewerWindow->addPopup(this); mExpanded = true; } @@ -401,10 +401,7 @@ void LLExpandableTextBox::collapseTextBox() updateTextBoxRect(); - if(gFocusMgr.getTopCtrl() == this) - { - gFocusMgr.setTopCtrl(NULL); - } + gViewerWindow->removePopup(this); } void LLExpandableTextBox::onFocusLost() diff --git a/indra/newview/llexpandabletextbox.h b/indra/newview/llexpandabletextbox.h index 58316ddb98..5872592fae 100644 --- a/indra/newview/llexpandabletextbox.h +++ b/indra/newview/llexpandabletextbox.h @@ -54,7 +54,6 @@ protected: public: struct Params : public LLInitParam::Block<Params, LLTextEditor::Params> { - Mandatory<std::string> more_label; Params(); }; @@ -144,6 +143,7 @@ public: */ /*virtual*/ void onTopLost(); + /** * Draws text box, collapses text box if its expanded and its parent's position changed */ diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp index 965ac1cad0..dbbcb6e7c4 100644 --- a/indra/newview/llface.cpp +++ b/indra/newview/llface.cpp @@ -182,6 +182,7 @@ void LLFace::init(LLDrawable* drawablep, LLViewerObject* objp) mAtlasInfop = NULL ; mUsingAtlas = FALSE ; + mHasMedia = FALSE ; } @@ -301,7 +302,8 @@ void LLFace::switchTexture(LLViewerTexture* new_texture) if(!new_texture) { - llerrs << "Can not switch to a null texture." << llendl ; + llerrs << "Can not switch to a null texture." << llendl; + return; } new_texture->addTextureStats(mTexture->getMaxVirtualSize()) ; @@ -860,15 +862,17 @@ void LLFace::updateRebuildFlags() } } +static LLFastTimer::DeclareTimer FTM_FACE_GET_GEOM("Face Geom"); + BOOL LLFace::getGeometryVolume(const LLVolume& volume, const S32 &f, const LLMatrix4& mat_vert, const LLMatrix3& mat_normal, const U16 &index_offset) { - llpushcallstacks ; + LLFastTimer t(FTM_FACE_GET_GEOM); const LLVolumeFace &vf = volume.getVolumeFace(f); S32 num_vertices = (S32)vf.mVertices.size(); - S32 num_indices = (S32)vf.mIndices.size(); + S32 num_indices = LLPipeline::sUseTriStrips ? (S32)vf.mTriStrip.size() : (S32) vf.mIndices.size(); if (mVertexBuffer.notNull()) { @@ -1040,17 +1044,20 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, if (rebuild_color) { - GLfloat alpha[4] = - { - 0.00f, - 0.25f, - 0.5f, - 0.75f - }; - - if (getPoolType() != LLDrawPool::POOL_ALPHA && (LLPipeline::sRenderDeferred || (LLPipeline::sRenderBump && tep->getShiny()))) + if (tep) { - color.mV[3] = U8 (alpha[tep->getShiny()] * 255); + GLfloat alpha[4] = + { + 0.00f, + 0.25f, + 0.5f, + 0.75f + }; + + if (getPoolType() != LLDrawPool::POOL_ALPHA && (LLPipeline::sRenderDeferred || (LLPipeline::sRenderBump && tep->getShiny()))) + { + color.mV[3] = U8 (alpha[tep->getShiny()] * 255); + } } } @@ -1058,9 +1065,19 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, if (full_rebuild) { mVertexBuffer->getIndexStrider(indicesp, mIndicesIndex); - for (U16 i = 0; i < num_indices; i++) + if (LLPipeline::sUseTriStrips) { - *indicesp++ = vf.mIndices[i] + index_offset; + for (U32 i = 0; i < (U32) num_indices; i++) + { + *indicesp++ = vf.mTriStrip[i] + index_offset; + } + } + else + { + for (U32 i = 0; i < (U32) num_indices; i++) + { + *indicesp++ = vf.mIndices[i] + index_offset; + } } } @@ -1323,17 +1340,33 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, return TRUE; } +//check if the face has a media +BOOL LLFace::hasMedia() const +{ + if(mHasMedia) + { + return TRUE ; + } + if(mTexture.notNull()) + { + return mTexture->hasParcelMedia() ; //if has a parcel media + } + + return FALSE ; //no media. +} + const F32 LEAST_IMPORTANCE = 0.05f ; const F32 LEAST_IMPORTANCE_FOR_LARGE_IMAGE = 0.3f ; F32 LLFace::getTextureVirtualSize() { F32 radius; - F32 cos_angle_to_view_dir; - mPixelArea = calcPixelArea(cos_angle_to_view_dir, radius); + F32 cos_angle_to_view_dir; + BOOL in_frustum = calcPixelArea(cos_angle_to_view_dir, radius); - if (mPixelArea <= 0) + if (mPixelArea < 0.0001f || !in_frustum) { + setVirtualSize(0.f) ; return 0.f; } @@ -1346,9 +1379,18 @@ F32 LLFace::getTextureVirtualSize() texel_area = 1.f; } - //apply texel area to face area to get accurate ratio - //face_area /= llclamp(texel_area, 1.f/64.f, 16.f); - F32 face_area = mPixelArea / llclamp(texel_area, 0.015625f, 128.f); + F32 face_area; + if (mVObjp->isSculpted() && texel_area > 1.f) + { + //sculpts can break assumptions about texel area + face_area = mPixelArea; + } + else + { + //apply texel area to face area to get accurate ratio + //face_area /= llclamp(texel_area, 1.f/64.f, 16.f); + face_area = mPixelArea / llclamp(texel_area, 0.015625f, 128.f); + } if(face_area > LLViewerTexture::sMaxSmallImageSize) { @@ -1370,23 +1412,48 @@ F32 LLFace::getTextureVirtualSize() } } + setVirtualSize(face_area) ; + return face_area; } -F32 LLFace::calcPixelArea(F32& cos_angle_to_view_dir, F32& radius) +BOOL LLFace::calcPixelArea(F32& cos_angle_to_view_dir, F32& radius) { //get area of circle around face LLVector3 center = getPositionAgent(); - LLVector3 size = (mExtents[1] - mExtents[0]) * 0.5f; - + LLVector3 size = (mExtents[1] - mExtents[0]) * 0.5f; LLViewerCamera* camera = LLViewerCamera::getInstance(); + + F32 size_squared = size.lengthSquared() ; LLVector3 lookAt = center - camera->getOrigin(); - F32 dist = lookAt.normVec() ; + F32 dist = lookAt.normVec() ; //get area of circle around node - F32 app_angle = atanf(size.length()/dist); + F32 app_angle = atanf(fsqrtf(size_squared) / dist); radius = app_angle*LLDrawable::sCurPixelAngle; - F32 face_area = radius*radius * 3.14159f; + mPixelArea = radius*radius * 3.14159f; + cos_angle_to_view_dir = lookAt * camera->getXAxis() ; + + //if has media, check if the face is out of the view frustum. + if(hasMedia()) + { + if(!camera->AABBInFrustum(center, size)) + { + mImportanceToCamera = 0.f ; + return false ; + } + if(cos_angle_to_view_dir > camera->getCosHalfFov()) //the center is within the view frustum + { + cos_angle_to_view_dir = 1.0f ; + } + else + { + if(dist * dist * (lookAt - camera->getXAxis()).lengthSquared() < size_squared) + { + cos_angle_to_view_dir = 1.0f ; + } + } + } if(dist < mBoundingSphereRadius) //camera is very close { @@ -1394,12 +1461,11 @@ F32 LLFace::calcPixelArea(F32& cos_angle_to_view_dir, F32& radius) mImportanceToCamera = 1.0f ; } else - { - cos_angle_to_view_dir = lookAt * camera->getXAxis() ; + { mImportanceToCamera = LLFace::calcImportanceToCamera(cos_angle_to_view_dir, dist) ; } - return face_area ; + return true ; } //the projection of the face partially overlaps with the screen @@ -1572,8 +1638,13 @@ S32 LLFace::pushVertices(const U16* index_array) const { if (mIndicesCount) { - mVertexBuffer->drawRange(LLRender::TRIANGLES, mGeomIndex, mGeomIndex+mGeomCount-1, mIndicesCount, mIndicesIndex); - gPipeline.addTrianglesDrawn(mIndicesCount/3); + U32 render_type = LLRender::TRIANGLES; + if (mDrawInfo) + { + render_type = mDrawInfo->mDrawMode; + } + mVertexBuffer->drawRange(render_type, mGeomIndex, mGeomIndex+mGeomCount-1, mIndicesCount, mIndicesIndex); + gPipeline.addTrianglesDrawn(mIndicesCount, render_type); } return mIndicesCount; diff --git a/indra/newview/llface.h b/indra/newview/llface.h index e12b64a2f2..67dd97e6f7 100644 --- a/indra/newview/llface.h +++ b/indra/newview/llface.h @@ -194,6 +194,9 @@ public: F32 getTextureVirtualSize() ; F32 getImportanceToCamera()const {return mImportanceToCamera ;} + void setHasMedia(bool has_media) { mHasMedia = has_media ;} + BOOL hasMedia() const ; + //for atlas LLTextureAtlasSlot* getAtlasInfo() ; void setAtlasInUse(BOOL flag); @@ -208,7 +211,7 @@ public: private: F32 adjustPartialOverlapPixelArea(F32 cos_angle_to_view_dir, F32 radius ); - F32 calcPixelArea(F32& cos_angle_to_view_dir, F32& radius) ; + BOOL calcPixelArea(F32& cos_angle_to_view_dir, F32& radius) ; public: static F32 calcImportanceToCamera(F32 to_view_dir, F32 dist); @@ -262,7 +265,7 @@ private: //based on the distance from the face to the view point and the angle from the face center to the view direction. F32 mImportanceToCamera ; F32 mBoundingSphereRadius ; - + bool mHasMedia ; //atlas LLPointer<LLTextureAtlasSlot> mAtlasInfop ; diff --git a/indra/newview/llfasttimerview.cpp b/indra/newview/llfasttimerview.cpp index 4fa97e789b..8bc3b5a75f 100644 --- a/indra/newview/llfasttimerview.cpp +++ b/indra/newview/llfasttimerview.cpp @@ -44,6 +44,7 @@ #include "llfontgl.h" #include "llsdserialize.h" #include "lltooltip.h" +#include "llbutton.h" #include "llappviewer.h" #include "llviewertexturelist.h" @@ -99,6 +100,8 @@ LLFastTimerView::LLFastTimerView(const LLRect& rect) FTV_NUM_TIMERS = LLFastTimer::NamedTimer::instanceCount(); mPrintStats = -1; mAverageCyclesPerTimer = 0; + setCanMinimize(false); + setCanClose(true); } @@ -139,6 +142,18 @@ LLFastTimer::NamedTimer* LLFastTimerView::getLegendID(S32 y) BOOL LLFastTimerView::handleMouseDown(S32 x, S32 y, MASK mask) { + + { + S32 local_x = x - mButtons[BUTTON_CLOSE]->getRect().mLeft; + S32 local_y = y - mButtons[BUTTON_CLOSE]->getRect().mBottom; + if(mButtons[BUTTON_CLOSE]->getVisible() + && mButtons[BUTTON_CLOSE]->pointInView(local_x, local_y) ) + { + return LLFloater::handleMouseDown(x, y, mask);; + } + } + + if (x < mBarRect.mLeft) { LLFastTimer::NamedTimer* idp = getLegendID(y); @@ -188,6 +203,15 @@ BOOL LLFastTimerView::handleMouseDown(S32 x, S32 y, MASK mask) BOOL LLFastTimerView::handleMouseUp(S32 x, S32 y, MASK mask) { + { + S32 local_x = x - mButtons[BUTTON_CLOSE]->getRect().mLeft; + S32 local_y = y - mButtons[BUTTON_CLOSE]->getRect().mBottom; + if(mButtons[BUTTON_CLOSE]->getVisible() + && mButtons[BUTTON_CLOSE]->pointInView(local_x, local_y) ) + { + return LLFloater::handleMouseUp(x, y, mask);; + } + } return FALSE; } @@ -1191,5 +1215,8 @@ void LLFastTimerView::doAnalysis(std::string baseline, std::string target, std:: return ; } } - +void LLFastTimerView::onClickCloseBtn() +{ + setVisible(false); +} diff --git a/indra/newview/llfasttimerview.h b/indra/newview/llfasttimerview.h index f5c8f23818..ac06990913 100644 --- a/indra/newview/llfasttimerview.h +++ b/indra/newview/llfasttimerview.h @@ -63,7 +63,9 @@ public: LLFastTimer::NamedTimer* getLegendID(S32 y); F64 getTime(const std::string& name); - + +protected: + virtual void onClickCloseBtn(); private: typedef std::vector<std::vector<S32> > bar_positions_t; bar_positions_t mBarStart; diff --git a/indra/newview/llfavoritesbar.cpp b/indra/newview/llfavoritesbar.cpp index 0f52b30567..6b7a257a4b 100644 --- a/indra/newview/llfavoritesbar.cpp +++ b/indra/newview/llfavoritesbar.cpp @@ -31,7 +31,6 @@ */ #include "llviewerprecompiledheaders.h" - #include "llfavoritesbar.h" #include "llfloaterreg.h" @@ -47,6 +46,7 @@ #include "llclipboard.h" #include "llinventoryclipboard.h" #include "llinventorybridge.h" +#include "llinventoryfunctions.h" #include "llfloaterworldmap.h" #include "lllandmarkactions.h" #include "llnotificationsutil.h" @@ -75,7 +75,9 @@ public: mPosY(0), mPosZ(0), mLoaded(false) - {} + { + mHandle.bind(this); + } void setLandmarkID(const LLUUID& id) { mLandmarkID = id; } const LLUUID& getLandmarkId() const { return mLandmarkID; } @@ -122,17 +124,21 @@ private: if(LLLandmarkActions::getLandmarkGlobalPos(mLandmarkID, g_pos)) { LLLandmarkActions::getRegionNameAndCoordsFromPosGlobal(g_pos, - boost::bind(&LLLandmarkInfoGetter::landmarkNameCallback, this, _1, _2, _3, _4)); + boost::bind(&LLLandmarkInfoGetter::landmarkNameCallback, static_cast<LLHandle<LLLandmarkInfoGetter> >(mHandle), _1, _2, _3, _4)); } } - void landmarkNameCallback(const std::string& name, S32 x, S32 y, S32 z) + static void landmarkNameCallback(LLHandle<LLLandmarkInfoGetter> handle, const std::string& name, S32 x, S32 y, S32 z) { - mPosX = x; - mPosY = y; - mPosZ = z; - mName = name; - mLoaded = true; + LLLandmarkInfoGetter* getter = handle.get(); + if (getter) + { + getter->mPosX = x; + getter->mPosY = y; + getter->mPosZ = z; + getter->mName = name; + getter->mLoaded = true; + } } LLUUID mLandmarkID; @@ -141,6 +147,7 @@ private: S32 mPosY; S32 mPosZ; bool mLoaded; + LLRootHandle<LLLandmarkInfoGetter> mHandle; }; /** @@ -298,6 +305,20 @@ public: return TRUE; } + void setVisible(BOOL b) + { + // Overflow menu shouldn't hide when it still has focus. See EXT-4217. + if (!b && hasFocus()) + return; + LLToggleableMenu::setVisible(b); + setFocus(b); + } + + void onFocusLost() + { + setVisible(FALSE); + } + protected: LLFavoriteLandmarkToggleableMenu(const LLToggleableMenu::Params& p): LLToggleableMenu(p) @@ -777,6 +798,15 @@ void LLFavoritesBarCtrl::updateButtons() mChevronButton->setRect(rect); mChevronButton->setVisible(TRUE); } + // Update overflow menu + LLToggleableMenu* overflow_menu = static_cast <LLToggleableMenu*> (mPopupMenuHandle.get()); + if (overflow_menu && overflow_menu->getVisible()) + { + overflow_menu->setFocus(FALSE); + overflow_menu->setVisible(FALSE); + if (mUpdateDropDownItems) + showDropDownMenu(); + } } else { @@ -892,6 +922,8 @@ void LLFavoritesBarCtrl::showDropDownMenu() if (menu) { + // Release focus to allow changing of visibility. + menu->setFocus(FALSE); if (!menu->toggleVisibility()) return; @@ -1133,6 +1165,17 @@ void LLFavoritesBarCtrl::pastFromClipboard() const void LLFavoritesBarCtrl::onButtonMouseDown(LLUUID id, LLUICtrl* ctrl, S32 x, S32 y, MASK mask) { + // EXT-6997 (Fav bar: Pop-up menu for LM in overflow dropdown is kept after LM was dragged away) + // mInventoryItemsPopupMenuHandle.get() - is a pop-up menu (of items) in already opened dropdown menu. + // We have to check and set visibility of pop-up menu in such a way instead of using + // LLMenuHolderGL::hideMenus() because it will close both menus(dropdown and pop-up), but + // we need to close only pop-up menu while dropdown one should be still opened. + LLMenuGL* menu = (LLMenuGL*)mInventoryItemsPopupMenuHandle.get(); + if(menu && menu->getVisible()) + { + menu->setVisible(FALSE); + } + mDragItemId = id; mStartDrag = TRUE; @@ -1239,8 +1282,11 @@ LLInventoryModel::item_array_t::iterator LLFavoritesBarCtrl::findItemByUUID(LLIn void LLFavoritesBarCtrl::insertBeforeItem(LLInventoryModel::item_array_t& items, const LLUUID& beforeItemId, LLViewerInventoryItem* insertedItem) { LLViewerInventoryItem* beforeItem = gInventory.getItem(beforeItemId); - - items.insert(findItemByUUID(items, beforeItem->getUUID()), insertedItem); + llassert(beforeItem); + if (beforeItem) + { + items.insert(findItemByUUID(items, beforeItem->getUUID()), insertedItem); + } } // EOF diff --git a/indra/newview/llfeaturemanager.cpp b/indra/newview/llfeaturemanager.cpp index fb724f30e0..f32fcd6b7f 100644 --- a/indra/newview/llfeaturemanager.cpp +++ b/indra/newview/llfeaturemanager.cpp @@ -45,10 +45,13 @@ #include "llsecondlifeurls.h" #include "llappviewer.h" +#include "llhttpclient.h" +#include "llnotificationsutil.h" #include "llviewercontrol.h" #include "llworld.h" #include "lldrawpoolterrain.h" #include "llviewertexturelist.h" +#include "llversioninfo.h" #include "llwindow.h" #include "llui.h" #include "llcontrol.h" @@ -62,15 +65,20 @@ #if LL_DARWIN const char FEATURE_TABLE_FILENAME[] = "featuretable_mac.txt"; +const char FEATURE_TABLE_VER_FILENAME[] = "featuretable_mac.%s.txt"; #elif LL_LINUX const char FEATURE_TABLE_FILENAME[] = "featuretable_linux.txt"; +const char FEATURE_TABLE_VER_FILENAME[] = "featuretable_linux.%s.txt"; #elif LL_SOLARIS const char FEATURE_TABLE_FILENAME[] = "featuretable_solaris.txt"; +const char FEATURE_TABLE_VER_FILENAME[] = "featuretable_solaris.%s.txt"; #else const char FEATURE_TABLE_FILENAME[] = "featuretable.txt"; +const char FEATURE_TABLE_VER_FILENAME[] = "featuretable.%s.txt"; #endif const char GPU_TABLE_FILENAME[] = "gpu_table.txt"; +const char GPU_TABLE_VER_FILENAME[] = "gpu_table.%s.txt"; LLFeatureInfo::LLFeatureInfo(const std::string& name, const BOOL available, const F32 level) : mValid(TRUE), mName(name), mAvailable(available), mRecommendedLevel(level) @@ -215,22 +223,44 @@ BOOL LLFeatureManager::loadFeatureTables() mSkippedFeatures.insert("RenderVBOEnable"); mSkippedFeatures.insert("RenderFogRatio"); - std::string data_path = gDirUtilp->getAppRODataDir(); + // first table is install with app + std::string app_path = gDirUtilp->getAppRODataDir(); + app_path += gDirUtilp->getDirDelimiter(); + app_path += FEATURE_TABLE_FILENAME; - data_path += gDirUtilp->getDirDelimiter(); + // second table is downloaded with HTTP + std::string http_filename = llformat(FEATURE_TABLE_VER_FILENAME, LLVersionInfo::getVersion().c_str()); + std::string http_path = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, http_filename); - data_path += FEATURE_TABLE_FILENAME; - lldebugs << "Looking for feature table in " << data_path << llendl; + // use HTTP table if it exists + std::string path; + if (gDirUtilp->fileExists(http_path)) + { + path = http_path; + } + else + { + path = app_path; + } + + + return parseFeatureTable(path); +} + + +BOOL LLFeatureManager::parseFeatureTable(std::string filename) +{ + llinfos << "Looking for feature table in " << filename << llendl; llifstream file; std::string name; U32 version; - file.open(data_path); /*Flawfinder: ignore*/ + file.open(filename); /*Flawfinder: ignore*/ if (!file) { - LL_WARNS("RenderInit") << "Unable to open feature table!" << LL_ENDL; + LL_WARNS("RenderInit") << "Unable to open feature table " << filename << LL_ENDL; return FALSE; } @@ -239,7 +269,7 @@ BOOL LLFeatureManager::loadFeatureTables() file >> version; if (name != "version") { - LL_WARNS("RenderInit") << data_path << " does not appear to be a valid feature table!" << LL_ENDL; + LL_WARNS("RenderInit") << filename << " does not appear to be a valid feature table!" << LL_ENDL; return FALSE; } @@ -287,6 +317,7 @@ BOOL LLFeatureManager::loadFeatureTables() if (!flp) { LL_ERRS("RenderInit") << "Specified parameter before <list> keyword!" << LL_ENDL; + return FALSE; } S32 available; F32 recommended; @@ -301,24 +332,44 @@ BOOL LLFeatureManager::loadFeatureTables() void LLFeatureManager::loadGPUClass() { - std::string data_path = gDirUtilp->getAppRODataDir(); - - data_path += gDirUtilp->getDirDelimiter(); - - data_path += GPU_TABLE_FILENAME; - // defaults mGPUClass = GPU_CLASS_UNKNOWN; mGPUString = gGLManager.getRawGLString(); mGPUSupported = FALSE; + // first table is in the app dir + std::string app_path = gDirUtilp->getAppRODataDir(); + app_path += gDirUtilp->getDirDelimiter(); + app_path += GPU_TABLE_FILENAME; + + // second table is downloaded with HTTP + std::string http_filename = llformat(GPU_TABLE_VER_FILENAME, LLVersionInfo::getVersion().c_str()); + std::string http_path = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, http_filename); + + // use HTTP table if it exists + std::string path; + if (gDirUtilp->fileExists(http_path)) + { + path = http_path; + } + else + { + path = app_path; + } + + parseGPUTable(path); +} + + +void LLFeatureManager::parseGPUTable(std::string filename) +{ llifstream file; - file.open(data_path); /*Flawfinder: ignore*/ + file.open(filename); if (!file) { - LL_WARNS("RenderInit") << "Unable to open GPU table: " << data_path << "!" << LL_ENDL; + LL_WARNS("RenderInit") << "Unable to open GPU table: " << filename << "!" << LL_ENDL; return; } @@ -402,6 +453,70 @@ void LLFeatureManager::loadGPUClass() LL_WARNS("RenderInit") << "Couldn't match GPU to a class: " << gGLManager.getRawGLString() << LL_ENDL; } +// responder saves table into file +class LLHTTPFeatureTableResponder : public LLHTTPClient::Responder +{ +public: + + LLHTTPFeatureTableResponder(std::string filename) : + mFilename(filename) + { + } + + + virtual void completedRaw(U32 status, const std::string& reason, + const LLChannelDescriptors& channels, + const LLIOPipe::buffer_ptr_t& buffer) + { + if (isGoodStatus(status)) + { + // write to file + + llinfos << "writing feature table to " << mFilename << llendl; + + S32 file_size = buffer->countAfter(channels.in(), NULL); + if (file_size > 0) + { + // read from buffer + U8* copy_buffer = new U8[file_size]; + buffer->readAfter(channels.in(), NULL, copy_buffer, file_size); + + // write to file + LLAPRFile out(mFilename, LL_APR_WB); + out.write(copy_buffer, file_size); + out.close(); + } + } + + } + +private: + std::string mFilename; +}; + +void fetch_table(std::string table) +{ + const std::string base = gSavedSettings.getString("FeatureManagerHTTPTable"); + + const std::string filename = llformat(table.c_str(), LLVersionInfo::getVersion().c_str()); + + const std::string url = base + "/" + filename; + + const std::string path = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, filename); + + llinfos << "LLFeatureManager fetching " << url << " into " << path << llendl; + + LLHTTPClient::get(url, new LLHTTPFeatureTableResponder(path)); +} + +// fetch table(s) from a website (S3) +void LLFeatureManager::fetchHTTPTables() +{ + fetch_table(FEATURE_TABLE_VER_FILENAME); + fetch_table(GPU_TABLE_VER_FILENAME); +} + + void LLFeatureManager::cleanupFeatureTables() { std::for_each(mMaskList.begin(), mMaskList.end(), DeletePairedPointer()); @@ -620,9 +735,9 @@ void LLFeatureManager::applyBaseMasks() #if LL_SOLARIS && defined(__sparc) // even low MHz SPARCs are fast #error The 800 is hinky. Would something like a LL_MIN_MHZ make more sense here? - if (gSysCPU.getMhz() < 800) + if (gSysCPU.getMHz() < 800) #else - if (gSysCPU.getMhz() < 1100) + if (gSysCPU.getMHz() < 1100) #endif { maskFeatures("CPUSlow"); diff --git a/indra/newview/llfeaturemanager.h b/indra/newview/llfeaturemanager.h index dd218d428f..c2ecede2c5 100644 --- a/indra/newview/llfeaturemanager.h +++ b/indra/newview/llfeaturemanager.h @@ -48,6 +48,7 @@ typedef enum EGPUClass GPU_CLASS_3 = 3 } EGPUClass; + class LLFeatureInfo { public: @@ -144,8 +145,13 @@ public: // in the skip list if true void applyFeatures(bool skipFeatures); + // load the dynamic GPU/feature table from a website + void fetchHTTPTables(); + protected: void loadGPUClass(); + BOOL parseFeatureTable(std::string filename); + void parseGPUTable(std::string filename); void initBaseMask(); diff --git a/indra/newview/llfilteredwearablelist.cpp b/indra/newview/llfilteredwearablelist.cpp new file mode 100644 index 0000000000..306fa5ad6d --- /dev/null +++ b/indra/newview/llfilteredwearablelist.cpp @@ -0,0 +1,100 @@ +/** + * @file llfilteredwearablelist.cpp + * @brief Functionality for showing filtered wearable flat list + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" +#include "llfilteredwearablelist.h" + +// newview +#include "llinventoryfunctions.h" +#include "llinventoryitemslist.h" +#include "llinventorymodel.h" + + +LLFilteredWearableListManager::LLFilteredWearableListManager(LLInventoryItemsList* list, LLInventoryCollectFunctor* collector) +: mWearableList(list) +, mCollector(collector) +{ + llassert(mWearableList); + gInventory.addObserver(this); + gInventory.fetchDescendentsOf(gInventory.getRootFolderID()); +} + +LLFilteredWearableListManager::~LLFilteredWearableListManager() +{ + gInventory.removeObserver(this); +} + +void LLFilteredWearableListManager::changed(U32 mask) +{ + if (LLInventoryObserver::CALLING_CARD == mask + || LLInventoryObserver::GESTURE == mask + || LLInventoryObserver::SORT == mask + ) + { + // skip non-related changes + return; + } + + if(!gInventory.isInventoryUsable()) + { + return; + } + + populateList(); +} + +void LLFilteredWearableListManager::setFilterCollector(LLInventoryCollectFunctor* collector) +{ + mCollector = collector; + populateList(); +} + +void LLFilteredWearableListManager::populateList() +{ + LLInventoryModel::cat_array_t cat_array; + LLInventoryModel::item_array_t item_array; + + if(mCollector) + { + gInventory.collectDescendentsIf( + gInventory.getRootFolderID(), + cat_array, + item_array, + LLInventoryModel::EXCLUDE_TRASH, + *mCollector); + } + + // Probably will also need to get items from Library (waiting for reply in EXT-6724). + + mWearableList->refreshList(item_array); +} + +// EOF diff --git a/indra/newview/llfilteredwearablelist.h b/indra/newview/llfilteredwearablelist.h new file mode 100644 index 0000000000..b7825c07af --- /dev/null +++ b/indra/newview/llfilteredwearablelist.h @@ -0,0 +1,71 @@ +/** + * @file llfilteredwearablelist.h + * @brief Functionality for showing filtered wearable flat list + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLFILTEREDWEARABLELIST_H +#define LL_LLFILTEREDWEARABLELIST_H + +#include "llinventoryfunctions.h" +#include "llinventoryobserver.h" + +class LLInventoryItemsList; + +// Class that fills LLInventoryItemsList with filtered data (original items only (non-links)). +class LLFilteredWearableListManager : public LLInventoryObserver +{ + LOG_CLASS(LLFilteredWearableListManager); +public: + + LLFilteredWearableListManager(LLInventoryItemsList* list, LLInventoryCollectFunctor* collector); + ~LLFilteredWearableListManager(); + + /** LLInventoryObserver implementation + * + */ + /*virtual*/ void changed(U32 mask); + + /** + * Sets new collector and applies it immediately + */ + void setFilterCollector(LLInventoryCollectFunctor* collector); + + /** + * Populates wearable list with filtered data. + */ + void populateList(); + +private: + LLInventoryItemsList* mWearableList; + LLInventoryCollectFunctor* mCollector; +}; + +#endif //LL_LLFILTEREDWEARABLELIST_H + +// EOF diff --git a/indra/newview/llflexibleobject.cpp b/indra/newview/llflexibleobject.cpp index aea2de8e92..561965d021 100644 --- a/indra/newview/llflexibleobject.cpp +++ b/indra/newview/llflexibleobject.cpp @@ -51,6 +51,9 @@ /*static*/ F32 LLVolumeImplFlexible::sUpdateFactor = 1.0f; +static LLFastTimer::DeclareTimer FTM_FLEXIBLE_REBUILD("Rebuild"); +static LLFastTimer::DeclareTimer FTM_DO_FLEXIBLE_UPDATE("Update"); + // LLFlexibleObjectData::pack/unpack now in llprimitive.cpp //----------------------------------------------- @@ -194,7 +197,6 @@ void LLVolumeImplFlexible::remapSections(LLFlexibleObjectSection *source, S32 so } } - //----------------------------------------------------------------------------- void LLVolumeImplFlexible::setAttributesOfAllSections(LLVector3* inScale) { @@ -363,6 +365,7 @@ inline S32 log2(S32 x) void LLVolumeImplFlexible::doFlexibleUpdate() { + LLFastTimer ftm(FTM_DO_FLEXIBLE_UPDATE); LLVolume* volume = mVO->getVolume(); LLPath *path = &volume->getPath(); if (mSimulateRes == 0) @@ -693,7 +696,10 @@ BOOL LLVolumeImplFlexible::doUpdateGeometry(LLDrawable *drawable) } volume->updateRelativeXform(); - doFlexibleUpdate(); + { + LLFastTimer t(FTM_DO_FLEXIBLE_UPDATE); + doFlexibleUpdate(); + } // Object may have been rotated, which means it needs a rebuild. See SL-47220 BOOL rotated = FALSE; @@ -710,7 +716,10 @@ BOOL LLVolumeImplFlexible::doUpdateGeometry(LLDrawable *drawable) volume->regenFaces(); volume->mDrawable->setState(LLDrawable::REBUILD_VOLUME); volume->dirtySpatialGroup(); - doFlexibleRebuild(); + { + LLFastTimer t(FTM_FLEXIBLE_REBUILD); + doFlexibleRebuild(); + } volume->genBBoxes(isVolumeGlobal()); } else if (!mUpdated || rotated) diff --git a/indra/newview/llfloaterabout.cpp b/indra/newview/llfloaterabout.cpp index ef69f39ad2..4bd3151f2e 100644 --- a/indra/newview/llfloaterabout.cpp +++ b/indra/newview/llfloaterabout.cpp @@ -135,10 +135,10 @@ BOOL LLFloaterAbout::postBuild() // Render the LLSD from getInfo() as a format_map_t LLStringUtil::format_map_t args; - // For reasons I don't yet understand, [ReleaseNotes] is not part of the - // default substitution strings whereas [APP_NAME] is. But it works to - // simply copy it into these specific args. + + // allow the "Release Notes" URL label to be localized args["ReleaseNotes"] = LLTrans::getString("ReleaseNotes"); + for (LLSD::map_const_iterator ii(info.beginMap()), iend(info.endMap()); ii != iend; ++ii) { @@ -266,8 +266,18 @@ LLSD LLFloaterAbout::getInfo() info["J2C_VERSION"] = LLImageJ2C::getEngineInfo(); bool want_fullname = true; info["AUDIO_DRIVER_VERSION"] = gAudiop ? LLSD(gAudiop->getDriverName(want_fullname)) : LLSD(); - info["VIVOX_VERSION"] = gVoiceClient ? gVoiceClient->getAPIVersion() : LLTrans::getString("NotConnected"); - + if(LLVoiceClient::getInstance()->voiceEnabled()) + { + LLVoiceVersionInfo version = LLVoiceClient::getInstance()->getVersion(); + std::ostringstream version_string; + version_string << version.serverType << " " << version.serverVersion << std::endl; + info["VOICE_VERSION"] = version_string.str(); + } + else + { + info["VOICE_VERSION"] = LLTrans::getString("NotConnected"); + } + // TODO: Implement media plugin version query info["QT_WEBKIT_VERSION"] = "4.6 (version number hard-coded)"; @@ -283,14 +293,14 @@ LLSD LLFloaterAbout::getInfo() static std::string get_viewer_release_notes_url() { - LLSD query; - query["channel"] = gSavedSettings.getString("VersionChannelName"); - query["version"] = LLVersionInfo::getVersion(); - - std::ostringstream url; - url << LLTrans::getString("RELEASE_NOTES_BASE_URL") << LLURI::mapToQueryString(query); - - return LLWeb::escapeURL(url.str()); + // return a URL to the release notes for this viewer, such as: + // http://wiki.secondlife.com/wiki/Release_Notes/Second Life Beta Viewer/2.1.0 + std::string url = LLTrans::getString("RELEASE_NOTES_BASE_URL"); + if (! LLStringUtil::endsWith(url, "/")) + url += "/"; + url += gSavedSettings.getString("VersionChannelName") + "/"; + url += LLVersionInfo::getShortVersion(); + return LLWeb::escapeURL(url); } class LLFloaterAboutListener: public LLEventAPI diff --git a/indra/newview/llfloateranimpreview.cpp b/indra/newview/llfloateranimpreview.cpp index 5ec58c8dd6..f14e64e3e4 100644 --- a/indra/newview/llfloateranimpreview.cpp +++ b/indra/newview/llfloateranimpreview.cpp @@ -568,7 +568,7 @@ void LLFloaterAnimPreview::onBtnPlay(void* user_data) { LLVOAvatar* avatarp = previewp->mAnimPreview->getDummyAvatar(); - if(!avatarp->isMotionActive(previewp->mMotionID)) + if (!avatarp->isMotionActive(previewp->mMotionID)) { previewp->resetMotion(); previewp->mPauseRequest = NULL; @@ -593,7 +593,7 @@ void LLFloaterAnimPreview::onBtnPause(void* user_data) { LLVOAvatar* avatarp = previewp->mAnimPreview->getDummyAvatar(); - if(avatarp->isMotionActive(previewp->mMotionID)) + if (avatarp->isMotionActive(previewp->mMotionID)) { if (!avatarp->areAnimationsPaused()) { @@ -1069,6 +1069,12 @@ LLPreviewAnimation::~LLPreviewAnimation() mDummyAvatar->markDead(); } +//virtual +S8 LLPreviewAnimation::getType() const +{ + return LLViewerDynamicTexture::LL_PREVIEW_ANIMATION ; +} + //----------------------------------------------------------------------------- // update() //----------------------------------------------------------------------------- diff --git a/indra/newview/llfloateranimpreview.h b/indra/newview/llfloateranimpreview.h index 3ee1f419ab..84f131a322 100644 --- a/indra/newview/llfloateranimpreview.h +++ b/indra/newview/llfloateranimpreview.h @@ -50,6 +50,8 @@ protected: public: LLPreviewAnimation(S32 width, S32 height); + /*virtual*/ S8 getType() const ; + BOOL render(); void requestUpdate(); void rotate(F32 yaw_radians, F32 pitch_radians); diff --git a/indra/newview/llfloaterauction.cpp b/indra/newview/llfloaterauction.cpp index 698ccec9c1..679ab4c713 100644 --- a/indra/newview/llfloaterauction.cpp +++ b/indra/newview/llfloaterauction.cpp @@ -46,6 +46,7 @@ #include "llagent.h" #include "llcombobox.h" +#include "llmimetypes.h" #include "llnotifications.h" #include "llnotificationsutil.h" #include "llsavedsettingsglue.h" @@ -351,7 +352,7 @@ void LLFloaterAuction::doResetParcel() body["music_url"] = empty; body["media_url"] = empty; body["media_desc"] = empty; - body["media_type"] = std::string("none/none"); + body["media_type"] = LLMIMETypes::getDefaultMimeType(); body["media_width"] = (S32) 0; body["media_height"] = (S32) 0; body["auto_scale"] = (S32) 0; diff --git a/indra/newview/llfloateravatarpicker.cpp b/indra/newview/llfloateravatarpicker.cpp index a0b2de85f0..8f6816b845 100644 --- a/indra/newview/llfloateravatarpicker.cpp +++ b/indra/newview/llfloateravatarpicker.cpp @@ -38,6 +38,8 @@ #include "llcallingcard.h" #include "llfocusmgr.h" #include "llfloaterreg.h" +#include "llimview.h" // for gIMMgr +#include "lltooldraganddrop.h" // for LLToolDragAndDrop #include "llviewercontrol.h" #include "llworld.h" @@ -157,7 +159,7 @@ void LLFloaterAvatarPicker::onBtnFind() find(); } -static void getSelectedAvatarData(const LLScrollListCtrl* from, std::vector<std::string>& avatar_names, std::vector<LLUUID>& avatar_ids) +static void getSelectedAvatarData(const LLScrollListCtrl* from, std::vector<std::string>& avatar_names, uuid_vec_t& avatar_ids) { std::vector<LLScrollListItem*> items = from->getAllSelected(); for (std::vector<LLScrollListItem*>::iterator iter = items.begin(); iter != items.end(); ++iter) @@ -203,7 +205,7 @@ void LLFloaterAvatarPicker::onBtnSelect() if(list) { std::vector<std::string> avatar_names; - std::vector<LLUUID> avatar_ids; + uuid_vec_t avatar_ids; getSelectedAvatarData(list, avatar_names, avatar_ids); mSelectionCallback(avatar_names, avatar_ids); } @@ -247,7 +249,7 @@ void LLFloaterAvatarPicker::populateNearMe() LLScrollListCtrl* near_me_scroller = getChild<LLScrollListCtrl>("NearMe"); near_me_scroller->deleteAllItems(); - std::vector<LLUUID> avatar_ids; + uuid_vec_t avatar_ids; LLWorld::getInstance()->getAvatars(&avatar_ids, NULL, gAgent.getPositionGlobal(), gSavedSettings.getF32("NearMeRange")); for(U32 i=0; i<avatar_ids.size(); i++) { @@ -312,6 +314,18 @@ void LLFloaterAvatarPicker::populateFriend() void LLFloaterAvatarPicker::draw() { + // sometimes it is hard to determine when Select/Ok button should be disabled (see LLAvatarActions::shareWithAvatars). + // lets check this via mOkButtonValidateSignal callback periodically. + static LLFrameTimer timer; + if (timer.hasExpired()) + { + timer.setTimerExpirySec(0.33f); // three times per second should be enough. + + // simulate list changes. + onList(); + timer.start(); + } + LLFloater::draw(); if (!mNearMeListComplete && childGetVisibleTab("ResidentChooserTabs") == getChild<LLPanel>("NearMePanel")) { @@ -370,6 +384,81 @@ void LLFloaterAvatarPicker::setAllowMultiple(BOOL allow_multiple) getChild<LLScrollListCtrl>("Friends")->setAllowMultipleSelection(allow_multiple); } +LLScrollListCtrl* LLFloaterAvatarPicker::getActiveList() +{ + std::string acvtive_panel_name; + LLScrollListCtrl* list = NULL; + LLPanel* active_panel = childGetVisibleTab("ResidentChooserTabs"); + if(active_panel) + { + acvtive_panel_name = active_panel->getName(); + } + if(acvtive_panel_name == "SearchPanel") + { + list = getChild<LLScrollListCtrl>("SearchResults"); + } + else if(acvtive_panel_name == "NearMePanel") + { + list = getChild<LLScrollListCtrl>("NearMe"); + } + else if (acvtive_panel_name == "FriendsPanel") + { + list = getChild<LLScrollListCtrl>("Friends"); + } + return list; +} + +BOOL LLFloaterAvatarPicker::handleDragAndDrop(S32 x, S32 y, MASK mask, + BOOL drop, EDragAndDropType cargo_type, + void *cargo_data, EAcceptance *accept, + std::string& tooltip_msg) +{ + LLScrollListCtrl* list = getActiveList(); + if(list) + { + LLRect rc_list; + LLRect rc_point(x,y,x,y); + if (localRectToOtherView(rc_point, &rc_list, list)) + { + // Keep selected only one item + list->deselectAllItems(TRUE); + list->selectItemAt(rc_list.mLeft, rc_list.mBottom, mask); + LLScrollListItem* selection = list->getFirstSelected(); + if (selection) + { + LLUUID session_id = LLUUID::null; + LLUUID dest_agent_id = selection->getUUID(); + std::string avatar_name = selection->getColumn(0)->getValue().asString(); + if (dest_agent_id.notNull() && dest_agent_id != gAgentID) + { + if (drop) + { + // Start up IM before give the item + session_id = gIMMgr->addSession(avatar_name, IM_NOTHING_SPECIAL, dest_agent_id); + } + return LLToolDragAndDrop::handleGiveDragAndDrop(dest_agent_id, session_id, drop, + cargo_type, cargo_data, accept, getName()); + } + } + } + } + *accept = ACCEPT_NO; + return TRUE; +} + + +void LLFloaterAvatarPicker::openFriendsTab() +{ + LLTabContainer* tab_container = getChild<LLTabContainer>("ResidentChooserTabs"); + if (tab_container == NULL) + { + llassert(tab_container != NULL); + return; + } + + tab_container->selectTabByName("FriendsPanel"); +} + // static void LLFloaterAvatarPicker::processAvatarPickerReply(LLMessageSystem* msg, void**) { @@ -387,8 +476,8 @@ void LLFloaterAvatarPicker::processAvatarPickerReply(LLMessageSystem* msg, void* LLFloaterAvatarPicker* floater = LLFloaterReg::findTypedInstance<LLFloaterAvatarPicker>("avatar_picker"); - // these are not results from our last request - if (query_id != floater->mQueryID) + // floater is closed or these are not results from our last request + if (NULL == floater || query_id != floater->mQueryID) { return; } @@ -499,7 +588,7 @@ bool LLFloaterAvatarPicker::isSelectBtnEnabled() if(list) { - std::vector<LLUUID> avatar_ids; + uuid_vec_t avatar_ids; std::vector<std::string> avatar_names; getSelectedAvatarData(list, avatar_names, avatar_ids); return mOkButtonValidateSignal(avatar_ids); diff --git a/indra/newview/llfloateravatarpicker.h b/indra/newview/llfloateravatarpicker.h index e35466cec8..0af72e85a0 100644 --- a/indra/newview/llfloateravatarpicker.h +++ b/indra/newview/llfloateravatarpicker.h @@ -37,14 +37,16 @@ #include <vector> +class LLScrollListCtrl; + class LLFloaterAvatarPicker : public LLFloater { public: - typedef boost::signals2::signal<bool(const std::vector<LLUUID>&), boost_boolean_combiner> validate_signal_t; + typedef boost::signals2::signal<bool(const uuid_vec_t&), boost_boolean_combiner> validate_signal_t; typedef validate_signal_t::slot_type validate_callback_t; // The callback function will be called with an avatar name and UUID. - typedef boost::function<void (const std::vector<std::string>&, const std::vector<LLUUID>&)> select_callback_t; + typedef boost::function<void (const std::vector<std::string>&, const uuid_vec_t&)> select_callback_t; // Call this to select an avatar. static LLFloaterAvatarPicker* show(select_callback_t callback, BOOL allow_multiple = FALSE, @@ -59,6 +61,13 @@ public: static void processAvatarPickerReply(class LLMessageSystem* msg, void**); + BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, + BOOL drop, EDragAndDropType cargo_type, + void *cargo_data, EAcceptance *accept, + std::string& tooltip_msg); + + void openFriendsTab(); + private: void editKeystroke(class LLLineEditor* caller, void* user_data); @@ -77,6 +86,7 @@ private: void find(); void setAllowMultiple(BOOL allow_multiple); + LLScrollListCtrl* getActiveList(); virtual void draw(); virtual BOOL handleKeyHere(KEY key, MASK mask); diff --git a/indra/newview/llfloateravatartextures.cpp b/indra/newview/llfloateravatartextures.cpp index 8c7899af3e..847462a6c3 100644 --- a/indra/newview/llfloateravatartextures.cpp +++ b/indra/newview/llfloateravatartextures.cpp @@ -31,15 +31,14 @@ */ #include "llviewerprecompiledheaders.h" - #include "llfloateravatartextures.h" +#include "llagent.h" +#include "llagentwearables.h" #include "lltexturectrl.h" - #include "lluictrlfactory.h" #include "llviewerobjectlist.h" -#include "llvoavatar.h" -#include "llagentwearables.h" +#include "llvoavatarself.h" using namespace LLVOAvatarDefines; @@ -75,7 +74,6 @@ void LLFloaterAvatarTextures::draw() LLFloater::draw(); } -#if !LL_RELEASE_FOR_DOWNLOAD static void update_texture_ctrl(LLVOAvatar* avatarp, LLTextureCtrl* ctrl, ETextureIndex te) @@ -84,14 +82,17 @@ static void update_texture_ctrl(LLVOAvatar* avatarp, const LLVOAvatarDictionary::TextureEntry* tex_entry = LLVOAvatarDictionary::getInstance()->getTexture(te); if (tex_entry->mIsLocalTexture) { - const EWearableType wearable_type = tex_entry->mWearableType; - LLWearable *wearable = gAgentWearables.getWearable(wearable_type, 0); - if (wearable) + if (avatarp->isSelf()) { - LLLocalTextureObject *lto = wearable->getLocalTextureObject(te); - if (lto) + const LLWearableType::EType wearable_type = tex_entry->mWearableType; + LLWearable *wearable = gAgentWearables.getWearable(wearable_type, 0); + if (wearable) { - id = lto->getID(); + LLLocalTextureObject *lto = wearable->getLocalTextureObject(te); + if (lto) + { + id = lto->getID(); + } } } } @@ -103,12 +104,12 @@ static void update_texture_ctrl(LLVOAvatar* avatarp, if (id == IMG_DEFAULT_AVATAR) { ctrl->setImageAssetID(LLUUID::null); - ctrl->setToolTip(std::string("IMG_DEFAULT_AVATAR")); + ctrl->setToolTip(tex_entry->mName + " : " + std::string("IMG_DEFAULT_AVATAR")); } else { ctrl->setImageAssetID(id); - ctrl->setToolTip(id.asString()); + ctrl->setToolTip(tex_entry->mName + " : " + id.asString()); } } @@ -132,72 +133,73 @@ static LLVOAvatar* find_avatar(const LLUUID& id) void LLFloaterAvatarTextures::refresh() { - LLVOAvatar *avatarp = find_avatar(mID); - if (avatarp) + if (gAgent.isGodlike()) { - std::string fullname; - if (gCacheName->getFullName(avatarp->getID(), fullname)) + LLVOAvatar *avatarp = find_avatar(mID); + if (avatarp) { - setTitle(mTitle + ": " + fullname); + std::string fullname; + if (gCacheName->getFullName(avatarp->getID(), fullname)) + { + setTitle(mTitle + ": " + fullname); + } + for (U32 i=0; i < TEX_NUM_INDICES; i++) + { + update_texture_ctrl(avatarp, mTextures[i], ETextureIndex(i)); + } } - for (U32 i=0; i < TEX_NUM_INDICES; i++) + else { - update_texture_ctrl(avatarp, mTextures[i], ETextureIndex(i)); + setTitle(mTitle + ": " + getString("InvalidAvatar") + " (" + mID.asString() + ")"); } } - else - { - setTitle(mTitle + ": " + getString("InvalidAvatar") + " (" + mID.asString() + ")"); - } } -#else - -void LLFloaterAvatarTextures::refresh() -{ -} - -#endif - // static void LLFloaterAvatarTextures::onClickDump(void* data) { -#if !LL_RELEASE_FOR_DOWNLOAD - LLFloaterAvatarTextures* self = (LLFloaterAvatarTextures*)data; - LLVOAvatar* avatarp = find_avatar(self->mID); - if (!avatarp) return; - - for (S32 i = 0; i < avatarp->getNumTEs(); i++) + if (gAgent.isGodlike()) { - const LLTextureEntry* te = avatarp->getTE(i); - if (!te) continue; - - if (LLVOAvatar::isIndexLocalTexture((ETextureIndex)i)) + const LLVOAvatarSelf* avatarp = gAgentAvatarp; + if (!avatarp) return; + for (S32 i = 0; i < avatarp->getNumTEs(); i++) { - LLUUID id = IMG_DEFAULT_AVATAR; - EWearableType wearable_type = LLVOAvatarDictionary::getInstance()->getTEWearableType((ETextureIndex)i); - LLWearable *wearable = gAgentWearables.getWearable(wearable_type, 0); - if (wearable) + const LLTextureEntry* te = avatarp->getTE(i); + if (!te) continue; + + const LLVOAvatarDictionary::TextureEntry* tex_entry = LLVOAvatarDictionary::getInstance()->getTexture((ETextureIndex)(i)); + if (!tex_entry) + continue; + + if (LLVOAvatar::isIndexLocalTexture((ETextureIndex)i)) { - LLLocalTextureObject *lto = wearable->getLocalTextureObject(i); - if (lto) + LLUUID id = IMG_DEFAULT_AVATAR; + LLWearableType::EType wearable_type = LLVOAvatarDictionary::getInstance()->getTEWearableType((ETextureIndex)i); + if (avatarp->isSelf()) { - id = lto->getID(); + LLWearable *wearable = gAgentWearables.getWearable(wearable_type, 0); + if (wearable) + { + LLLocalTextureObject *lto = wearable->getLocalTextureObject(i); + if (lto) + { + id = lto->getID(); + } + } + } + if (id != IMG_DEFAULT_AVATAR) + { + llinfos << "TE " << i << " name:" << tex_entry->mName << " id:" << id << llendl; + } + else + { + llinfos << "TE " << i << " name:" << tex_entry->mName << " id:" << "<DEFAULT>" << llendl; } - } - if (id != IMG_DEFAULT_AVATAR) - { - llinfos << "Avatar TE " << i << " id " << id << llendl; } else { - llinfos << "Avatar TE " << i << " id " << "<DEFAULT>" << llendl; + llinfos << "TE " << i << " name:" << tex_entry->mName << " id:" << te->getID() << llendl; } } - else - { - llinfos << "Avatar TE " << i << " id " << te->getID() << llendl; - } } -#endif } diff --git a/indra/newview/llfloaterbeacons.cpp b/indra/newview/llfloaterbeacons.cpp index 13a7888f60..975c888a2b 100644 --- a/indra/newview/llfloaterbeacons.cpp +++ b/indra/newview/llfloaterbeacons.cpp @@ -71,7 +71,7 @@ void LLFloaterBeacons::onClickUICheck(LLUICtrl *ctrl) { LLCheckBoxCtrl *check = (LLCheckBoxCtrl *)ctrl; std::string name = check->getName(); - if( name == "touch_only") + if(name == "touch_only") { LLPipeline::toggleRenderScriptedTouchBeacons(NULL); // Don't allow both to be ON at the same time. Toggle the other one off if both now on. @@ -81,7 +81,9 @@ void LLFloaterBeacons::onClickUICheck(LLUICtrl *ctrl) { LLPipeline::setRenderScriptedBeacons(FALSE); getChild<LLCheckBoxCtrl>("scripted")->setControlValue(LLSD(FALSE)); + getChild<LLCheckBoxCtrl>("scripted")->setValue(FALSE); getChild<LLCheckBoxCtrl>("touch_only")->setControlValue(LLSD(TRUE)); // just to be sure it's in sync with llpipeline + getChild<LLCheckBoxCtrl>("touch_only")->setValue(TRUE); } } else if(name == "scripted") @@ -94,7 +96,9 @@ void LLFloaterBeacons::onClickUICheck(LLUICtrl *ctrl) { LLPipeline::setRenderScriptedTouchBeacons(FALSE); getChild<LLCheckBoxCtrl>("touch_only")->setControlValue(LLSD(FALSE)); + getChild<LLCheckBoxCtrl>("touch_only")->setValue(FALSE); getChild<LLCheckBoxCtrl>("scripted")->setControlValue(LLSD(TRUE)); // just to be sure it's in sync with llpipeline + getChild<LLCheckBoxCtrl>("scripted")->setValue(TRUE); } } else if(name == "physical") LLPipeline::setRenderPhysicalBeacons(check->get()); @@ -110,7 +114,9 @@ void LLFloaterBeacons::onClickUICheck(LLUICtrl *ctrl) { LLPipeline::setRenderBeacons(TRUE); getChild<LLCheckBoxCtrl>("beacons")->setControlValue(LLSD(TRUE)); + getChild<LLCheckBoxCtrl>("beacons")->setValue(TRUE); getChild<LLCheckBoxCtrl>("highlights")->setControlValue(LLSD(FALSE)); // just to be sure it's in sync with llpipeline + getChild<LLCheckBoxCtrl>("highlights")->setValue(FALSE); } } else if(name == "beacons") @@ -123,7 +129,9 @@ void LLFloaterBeacons::onClickUICheck(LLUICtrl *ctrl) { LLPipeline::setRenderHighlights(TRUE); getChild<LLCheckBoxCtrl>("highlights")->setControlValue(LLSD(TRUE)); + getChild<LLCheckBoxCtrl>("highlights")->setValue(TRUE); getChild<LLCheckBoxCtrl>("beacons")->setControlValue(LLSD(FALSE)); // just to be sure it's in sync with llpipeline + getChild<LLCheckBoxCtrl>("beacons")->setValue(FALSE); } } } diff --git a/indra/newview/llfloaterbulkpermission.cpp b/indra/newview/llfloaterbulkpermission.cpp index b2f700069f..766fc0723c 100644 --- a/indra/newview/llfloaterbulkpermission.cpp +++ b/indra/newview/llfloaterbulkpermission.cpp @@ -37,6 +37,7 @@ #include "llfloaterperms.h" // for utilities #include "llagent.h" #include "llchat.h" +#include "llinventorydefines.h" #include "llviewerwindow.h" #include "llviewerobject.h" #include "llviewerobjectlist.h" @@ -116,7 +117,7 @@ void LLFloaterBulkPermission::doApply() // worked on. // NOT static, virtual! void LLFloaterBulkPermission::inventoryChanged(LLViewerObject* viewer_object, - InventoryObjectList* inv, + LLInventoryObject::object_list_t* inv, S32, void* q_id) { @@ -250,12 +251,12 @@ void LLFloaterBulkPermission::doCheckUncheckAll(BOOL check) } -void LLFloaterBulkPermission::handleInventory(LLViewerObject* viewer_obj, InventoryObjectList* inv) +void LLFloaterBulkPermission::handleInventory(LLViewerObject* viewer_obj, LLInventoryObject::object_list_t* inv) { LLScrollListCtrl* list = getChild<LLScrollListCtrl>("queue output"); - InventoryObjectList::const_iterator it = inv->begin(); - InventoryObjectList::const_iterator end = inv->end(); + LLInventoryObject::object_list_t::const_iterator it = inv->begin(); + LLInventoryObject::object_list_t::const_iterator end = inv->end(); for ( ; it != end; ++it) { LLAssetType::EType asstype = (*it)->getType(); diff --git a/indra/newview/llfloaterbulkpermission.h b/indra/newview/llfloaterbulkpermission.h index bffcff7059..80dc88fbb1 100644 --- a/indra/newview/llfloaterbulkpermission.h +++ b/indra/newview/llfloaterbulkpermission.h @@ -63,13 +63,13 @@ private: // This is the callback method for the viewer object currently // being worked on. /*virtual*/ void inventoryChanged(LLViewerObject* obj, - InventoryObjectList* inv, + LLInventoryObject::object_list_t* inv, S32 serial_num, void* queue); // This is called by inventoryChanged void handleInventory(LLViewerObject* viewer_obj, - InventoryObjectList* inv); + LLInventoryObject::object_list_t* inv); void updateInventory(LLViewerObject* object, diff --git a/indra/newview/llfloaterbuy.cpp b/indra/newview/llfloaterbuy.cpp index fba557c656..d359856443 100644 --- a/indra/newview/llfloaterbuy.cpp +++ b/indra/newview/llfloaterbuy.cpp @@ -43,7 +43,8 @@ #include "llagent.h" // for agent id #include "llinventorymodel.h" // for gInventory #include "llfloaterreg.h" -#include "llfloaterinventory.h" // for get_item_icon +#include "llinventoryicon.h" +#include "llinventorydefines.h" #include "llinventoryfunctions.h" #include "llnotificationsutil.h" #include "llselectmgr.h" @@ -151,9 +152,8 @@ void LLFloaterBuy::show(const LLSaleInfo& sale_info) LLSD row; // Compute icon for this item - std::string icon_name = get_item_icon_name(LLAssetType::AT_OBJECT, - LLInventoryType::IT_OBJECT, - 0x0, FALSE); + std::string icon_name = LLInventoryIcon::getIconName(LLAssetType::AT_OBJECT, + LLInventoryType::IT_OBJECT); row["columns"][0]["column"] = "icon"; row["columns"][0]["type"] = "icon"; @@ -195,7 +195,7 @@ void LLFloaterBuy::show(const LLSaleInfo& sale_info) } void LLFloaterBuy::inventoryChanged(LLViewerObject* obj, - InventoryObjectList* inv, + LLInventoryObject::object_list_t* inv, S32 serial_num, void* data) { @@ -220,8 +220,8 @@ void LLFloaterBuy::inventoryChanged(LLViewerObject* obj, return; } - InventoryObjectList::const_iterator it = inv->begin(); - InventoryObjectList::const_iterator end = inv->end(); + LLInventoryObject::object_list_t::const_iterator it = inv->begin(); + LLInventoryObject::object_list_t::const_iterator end = inv->end(); for ( ; it != end; ++it ) { LLInventoryObject* obj = (LLInventoryObject*)(*it); @@ -246,12 +246,13 @@ void LLFloaterBuy::inventoryChanged(LLViewerObject* obj, // Compute icon for this item BOOL item_is_multi = FALSE; - if ( inv_item->getFlags() & LLInventoryItem::II_FLAGS_LANDMARK_VISITED ) + if ( inv_item->getFlags() & LLInventoryItemFlags::II_FLAGS_LANDMARK_VISITED + || inv_item->getFlags() & LLInventoryItemFlags::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS) { item_is_multi = TRUE; } - std::string icon_name = get_item_icon_name(inv_item->getType(), + std::string icon_name = LLInventoryIcon::getIconName(inv_item->getType(), inv_item->getInventoryType(), inv_item->getFlags(), item_is_multi); diff --git a/indra/newview/llfloaterbuy.h b/indra/newview/llfloaterbuy.h index ab38e082dc..411c8fb00e 100644 --- a/indra/newview/llfloaterbuy.h +++ b/indra/newview/llfloaterbuy.h @@ -65,7 +65,7 @@ protected: void requestObjectInventories(); /*virtual*/ void inventoryChanged(LLViewerObject* obj, - InventoryObjectList* inv, + LLInventoryObject::object_list_t* inv, S32 serial_num, void* data); diff --git a/indra/newview/llfloaterbuycontents.cpp b/indra/newview/llfloaterbuycontents.cpp index 0daef27af2..9bde3b1dac 100644 --- a/indra/newview/llfloaterbuycontents.cpp +++ b/indra/newview/llfloaterbuycontents.cpp @@ -44,10 +44,11 @@ #include "llagent.h" // for agent id #include "llcheckboxctrl.h" +#include "llinventorydefines.h" #include "llinventoryfunctions.h" #include "llinventorymodel.h" // for gInventory #include "llfloaterreg.h" -#include "llfloaterinventory.h" // for get_item_icon +#include "llfloaterinventory.h" // for LLInventoryIcon::getIcon #include "llnotificationsutil.h" #include "llselectmgr.h" #include "llscrolllistctrl.h" @@ -142,7 +143,7 @@ void LLFloaterBuyContents::show(const LLSaleInfo& sale_info) void LLFloaterBuyContents::inventoryChanged(LLViewerObject* obj, - InventoryObjectList* inv, + LLInventoryObject::object_list_t* inv, S32 serial_num, void* data) { @@ -176,8 +177,8 @@ void LLFloaterBuyContents::inventoryChanged(LLViewerObject* obj, LLInventoryType::EType inv_type; S32 wearable_count = 0; - InventoryObjectList::const_iterator it = inv->begin(); - InventoryObjectList::const_iterator end = inv->end(); + LLInventoryObject::object_list_t::const_iterator it = inv->begin(); + LLInventoryObject::object_list_t::const_iterator end = inv->end(); for ( ; it != end; ++it ) { @@ -215,12 +216,12 @@ void LLFloaterBuyContents::inventoryChanged(LLViewerObject* obj, LLSD row; BOOL item_is_multi = FALSE; - if ( inv_item->getFlags() & LLInventoryItem::II_FLAGS_LANDMARK_VISITED ) + if ( inv_item->getFlags() & LLInventoryItemFlags::II_FLAGS_LANDMARK_VISITED ) { item_is_multi = TRUE; } - std::string icon_name = get_item_icon_name(inv_item->getType(), + std::string icon_name = LLInventoryIcon::getIconName(inv_item->getType(), inv_item->getInventoryType(), inv_item->getFlags(), item_is_multi); diff --git a/indra/newview/llfloaterbuycontents.h b/indra/newview/llfloaterbuycontents.h index 8045a46c9f..ab161adfea 100644 --- a/indra/newview/llfloaterbuycontents.h +++ b/indra/newview/llfloaterbuycontents.h @@ -59,7 +59,7 @@ public: protected: void requestObjectInventories(); /*virtual*/ void inventoryChanged(LLViewerObject* obj, - InventoryObjectList* inv, + LLInventoryObject::object_list_t* inv, S32 serial_num, void* data); diff --git a/indra/newview/llfloaterbuycurrency.cpp b/indra/newview/llfloaterbuycurrency.cpp index 1642e6725e..7fddd1fc5f 100644 --- a/indra/newview/llfloaterbuycurrency.cpp +++ b/indra/newview/llfloaterbuycurrency.cpp @@ -234,8 +234,7 @@ void LLFloaterBuyCurrencyUI::updateUI() if (mHasTarget) { childSetVisible("buy_action", true); - childSetTextArg("buy_action", "[NAME]", mTargetName); - childSetTextArg("buy_action", "[PRICE]", llformat("%d",mTargetPrice)); + childSetTextArg("buy_action", "[ACTION]", mTargetName); } } diff --git a/indra/newview/llfloaterbuycurrencyhtml.cpp b/indra/newview/llfloaterbuycurrencyhtml.cpp new file mode 100644 index 0000000000..d45df37092 --- /dev/null +++ b/indra/newview/llfloaterbuycurrencyhtml.cpp @@ -0,0 +1,128 @@ +/** + * @file llfloaterbuycurrencyhtml.cpp + * @brief buy currency implemented in HTML floater - uses embedded media browser control + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2006-2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llfloaterbuycurrencyhtml.h" +#include "llstatusbar.h" + +//////////////////////////////////////////////////////////////////////////////// +// +LLFloaterBuyCurrencyHTML::LLFloaterBuyCurrencyHTML( const LLSD& key ): + LLFloater( key ), + mSpecificSumRequested( false ), + mMessage( "" ), + mSum( 0 ) +{ +} + +//////////////////////////////////////////////////////////////////////////////// +// +BOOL LLFloaterBuyCurrencyHTML::postBuild() +{ + // observer media events + mBrowser = getChild<LLMediaCtrl>( "browser" ); + mBrowser->addObserver( this ); + + return TRUE; +} + +//////////////////////////////////////////////////////////////////////////////// +// +void LLFloaterBuyCurrencyHTML::navigateToFinalURL() +{ + // URL for actual currency buy contents is in XUI file + std::string buy_currency_url = getString( "buy_currency_url" ); + + // replace [LANGUAGE] meta-tag with view language + LLStringUtil::format_map_t replace; + + // viewer language + replace[ "[LANGUAGE]" ] = LLUI::getLanguage(); + + // flag that specific amount requested + replace[ "[SPECIFIC_AMOUNT]" ] = ( mSpecificSumRequested ? "y":"n" ); + + // amount requested + std::ostringstream codec( "" ); + codec << mSum; + replace[ "[SUM]" ] = codec.str(); + + // users' current balance + codec.clear(); + codec.str( "" ); + codec << gStatusBar->getBalance(); + replace[ "[BAL]" ] = codec.str(); + + // message - "This cost L$x,xxx for example + replace[ "[MSG]" ] = LLURI::escape( mMessage ); + LLStringUtil::format( buy_currency_url, replace ); + + // write final URL to debug console + llinfos << "Buy currency HTML prased URL is " << buy_currency_url << llendl; + + // kick off the navigation + mBrowser->navigateTo( buy_currency_url, "text/html" ); +} + +//////////////////////////////////////////////////////////////////////////////// +// +void LLFloaterBuyCurrencyHTML::handleMediaEvent( LLPluginClassMedia* self, EMediaEvent event ) +{ + // placeholder for now - just in case we want to catch media events + if ( LLPluginClassMediaOwner::MEDIA_EVENT_NAVIGATE_COMPLETE == event ) + { + // update currency after we complete a navigation since there are many ways + // this can result in a different L$ balance + LLStatusBar::sendMoneyBalanceRequest(); + }; +} + +//////////////////////////////////////////////////////////////////////////////// +// +void LLFloaterBuyCurrencyHTML::onClose( bool app_quitting ) +{ + // update L$ balanace one more time + LLStatusBar::sendMoneyBalanceRequest(); + + destroy(); +} + +//////////////////////////////////////////////////////////////////////////////// +// +void LLFloaterBuyCurrencyHTML::setParams( bool specific_sum_requested, const std::string& message, S32 sum ) +{ + // save these away - used to construct URL later + mSpecificSumRequested = specific_sum_requested; + mMessage = message; + mSum = sum; +} diff --git a/indra/newview/llfloaterbuycurrencyhtml.h b/indra/newview/llfloaterbuycurrencyhtml.h new file mode 100644 index 0000000000..be7a4d3dd6 --- /dev/null +++ b/indra/newview/llfloaterbuycurrencyhtml.h @@ -0,0 +1,65 @@ +/** + * @file llfloaterbuycurrencyhtml.h + * @brief buy currency implemented in HTML floater - uses embedded media browser control + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2006-2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLFLOATERBUYCURRENCYHTML_H +#define LL_LLFLOATERBUYCURRENCYHTML_H + +#include "llfloater.h" +#include "llmediactrl.h" + +class LLFloaterBuyCurrencyHTML : + public LLFloater, + public LLViewerMediaObserver +{ + public: + LLFloaterBuyCurrencyHTML( const LLSD& key ); + + /*virtual*/ BOOL postBuild(); + /*virtual*/ void onClose( bool app_quitting ); + + // inherited from LLViewerMediaObserver + /*virtual*/ void handleMediaEvent( LLPluginClassMedia* self, EMediaEvent event ); + + // allow our controlling parent to tell us paramters + void setParams( bool specific_sum_requested, const std::string& message, S32 sum ); + + // parse and construct URL and set browser to navigate there. + void navigateToFinalURL(); + + private: + LLMediaCtrl* mBrowser; + bool mSpecificSumRequested; + std::string mMessage; + S32 mSum; +}; + +#endif // LL_LLFLOATERBUYCURRENCYHTML_H diff --git a/indra/newview/llfloaterbuyland.cpp b/indra/newview/llfloaterbuyland.cpp index 9b88923e7e..7ca7ace0fc 100644 --- a/indra/newview/llfloaterbuyland.cpp +++ b/indra/newview/llfloaterbuyland.cpp @@ -54,6 +54,7 @@ #include "llstatusbar.h" #include "lltextbox.h" #include "lltexturectrl.h" +#include "lltrans.h" #include "llviewchildren.h" #include "llviewercontrol.h" #include "lluictrlfactory.h" @@ -82,7 +83,10 @@ public: virtual ~LLFloaterBuyLandUI(); /*virtual*/ void onClose(bool app_quitting); - + + // Left padding for maturity rating icon. + static const S32 ICON_PAD = 2; + private: class SelectionObserver : public LLParcelObserver { @@ -501,6 +505,25 @@ void LLFloaterBuyLandUI::updateCovenantInfo() { std::string region_name_txt = region->getName() + " ("+rating +")"; region_name->setText(region_name_txt); + + LLIconCtrl* rating_icon = getChild<LLIconCtrl>("rating_icon"); + LLRect rect = rating_icon->getRect(); + S32 icon_left_pad = region_name->getRect().mLeft + region_name->getTextBoundingRect().getWidth() + ICON_PAD; + rating_icon->setRect(rect.setOriginAndSize(icon_left_pad, rect.mBottom, rect.getWidth(), rect.getHeight())); + + switch(sim_access) + { + case SIM_ACCESS_PG: + rating_icon->setValue(getString("icon_PG")); + break; + + case SIM_ACCESS_ADULT: + rating_icon->setValue(getString("icon_R")); + break; + + default: + rating_icon->setValue(getString("icon_M")); + } } LLTextBox* region_type = getChild<LLTextBox>("region_type_text"); @@ -808,7 +831,7 @@ void LLFloaterBuyLandUI::updateNames() else { mParcelSellerName = - LLSLURL::buildCommand("agent", parcelp->getOwnerID(), "inspect"); + LLSLURL("agent", parcelp->getOwnerID(), "inspect").getSLURLString(); } } @@ -837,7 +860,7 @@ void LLFloaterBuyLandUI::startTransaction(TransactionType type, const LLXMLRPCVa static std::string transaction_uri; if (transaction_uri.empty()) { - transaction_uri = LLViewerLogin::getInstance()->getHelperURI() + "landtool.php"; + transaction_uri = LLGridManager::getInstance()->getHelperURI() + "landtool.php"; } const char* method; @@ -1150,13 +1173,13 @@ void LLFloaterBuyLandUI::refreshUI() if (!mParcelValid) { - message += getString("no_parcel_selected"); + message += LLTrans::getString("sentences_separator") + getString("no_parcel_selected"); } else if (mParcelBillableArea == mParcelActualArea) { LLStringUtil::format_map_t string_args; string_args["[AMOUNT]"] = llformat("%d ", mParcelActualArea); - message += getString("parcel_meters", string_args); + message += LLTrans::getString("sentences_separator") + getString("parcel_meters", string_args); } else { @@ -1165,13 +1188,13 @@ void LLFloaterBuyLandUI::refreshUI() { LLStringUtil::format_map_t string_args; string_args["[AMOUNT]"] = llformat("%d ", mParcelBillableArea); - message += getString("premium_land", string_args); + message += LLTrans::getString("sentences_separator") + getString("premium_land", string_args); } else { LLStringUtil::format_map_t string_args; string_args["[AMOUNT]"] = llformat("%d ", mParcelBillableArea); - message += getString("discounted_land", string_args); + message += LLTrans::getString("sentences_separator") + getString("discounted_land", string_args); } } diff --git a/indra/newview/llfloatercamera.cpp b/indra/newview/llfloatercamera.cpp index 9496e94780..d6effb2b21 100644 --- a/indra/newview/llfloatercamera.cpp +++ b/indra/newview/llfloatercamera.cpp @@ -38,24 +38,31 @@ #include "llfloaterreg.h" // Viewer includes +#include "llagentcamera.h" #include "lljoystickbutton.h" #include "llviewercontrol.h" #include "llviewercamera.h" #include "llbottomtray.h" -#include "llagent.h" #include "lltoolmgr.h" #include "lltoolfocus.h" #include "llslider.h" +static LLDefaultChildRegistry::Register<LLPanelCameraItem> r("panel_camera_item"); + +const F32 NUDGE_TIME = 0.25f; // in seconds +const F32 ORBIT_NUDGE_RATE = 0.05f; // fraction of normal speed + // Constants const F32 CAMERA_BUTTON_DELAY = 0.0f; #define ORBIT "cam_rotate_stick" #define PAN "cam_track_stick" #define ZOOM "zoom" -#define PRESETS "camera_presets" +#define PRESETS "preset_views_list" #define CONTROLS "controls" +bool LLFloaterCamera::sFreeCamera = false; + // Zoom the camera in and out class LLPanelCameraZoom : public LLPanel @@ -65,20 +72,82 @@ public: LLPanelCameraZoom(); /* virtual */ BOOL postBuild(); - /* virtual */ void onOpen(const LLSD& key); + /* virtual */ void draw(); protected: void onZoomPlusHeldDown(); void onZoomMinusHeldDown(); void onSliderValueChanged(); + F32 getOrbitRate(F32 time); private: - F32 mSavedSliderVal; LLButton* mPlusBtn; LLButton* mMinusBtn; LLSlider* mSlider; }; +LLPanelCameraItem::Params::Params() +: icon_over("icon_over"), + icon_selected("icon_selected"), + picture("picture"), + text("text"), + selected_picture("selected_picture"), + mousedown_callback("mousedown_callback") +{ +} + +LLPanelCameraItem::LLPanelCameraItem(const LLPanelCameraItem::Params& p) +: LLPanel(p) +{ + LLIconCtrl::Params icon_params = p.picture; + mPicture = LLUICtrlFactory::create<LLIconCtrl>(icon_params); + addChild(mPicture); + + icon_params = p.icon_over; + mIconOver = LLUICtrlFactory::create<LLIconCtrl>(icon_params); + addChild(mIconOver); + + icon_params = p.icon_selected; + mIconSelected = LLUICtrlFactory::create<LLIconCtrl>(icon_params); + addChild(mIconSelected); + + icon_params = p.selected_picture; + mPictureSelected = LLUICtrlFactory::create<LLIconCtrl>(icon_params); + addChild(mPictureSelected); + + LLTextBox::Params text_params = p.text; + mText = LLUICtrlFactory::create<LLTextBox>(text_params); + addChild(mText); + + if (p.mousedown_callback.isProvided()) + { + setCommitCallback(initCommitCallback(p.mousedown_callback)); + } +} + +BOOL LLPanelCameraItem::postBuild() +{ + setMouseEnterCallback(boost::bind(&LLPanelCameraItem::childSetVisible, this, "hovered_icon", true)); + setMouseLeaveCallback(boost::bind(&LLPanelCameraItem::childSetVisible, this, "hovered_icon", false)); + setMouseDownCallback(boost::bind(&LLPanelCameraItem::onAnyMouseClick, this)); + setRightMouseDownCallback(boost::bind(&LLPanelCameraItem::onAnyMouseClick, this)); + return TRUE; +} + +void LLPanelCameraItem::onAnyMouseClick() +{ + if (mCommitSignal) (*mCommitSignal)(this, LLSD()); +} + +void LLPanelCameraItem::setValue(const LLSD& value) +{ + if (!value.isMap()) return;; + if (!value.has("selected")) return; + childSetVisible("selected_icon", value["selected"]); + childSetVisible("picture", !value["selected"]); + childSetVisible("selected_picture", value["selected"]); +} + static LLRegisterPanelClassWrapper<LLPanelCameraZoom> t_camera_zoom_panel("camera_zoom_panel"); //------------------------------------------------------------------------------- @@ -88,11 +157,10 @@ static LLRegisterPanelClassWrapper<LLPanelCameraZoom> t_camera_zoom_panel("camer LLPanelCameraZoom::LLPanelCameraZoom() : mPlusBtn( NULL ), mMinusBtn( NULL ), - mSlider( NULL ), - mSavedSliderVal(0.f) + mSlider( NULL ) { - mCommitCallbackRegistrar.add("Zoom.minus", boost::bind(&LLPanelCameraZoom::onZoomPlusHeldDown, this)); - mCommitCallbackRegistrar.add("Zoom.plus", boost::bind(&LLPanelCameraZoom::onZoomMinusHeldDown, this)); + mCommitCallbackRegistrar.add("Zoom.minus", boost::bind(&LLPanelCameraZoom::onZoomMinusHeldDown, this)); + mCommitCallbackRegistrar.add("Zoom.plus", boost::bind(&LLPanelCameraZoom::onZoomPlusHeldDown, this)); mCommitCallbackRegistrar.add("Slider.value_changed", boost::bind(&LLPanelCameraZoom::onSliderValueChanged, this)); } @@ -101,16 +169,13 @@ BOOL LLPanelCameraZoom::postBuild() mPlusBtn = getChild <LLButton> ("zoom_plus_btn"); mMinusBtn = getChild <LLButton> ("zoom_minus_btn"); mSlider = getChild <LLSlider> ("zoom_slider"); - mSlider->setMinValue(.0f); - mSlider->setMaxValue(8.f); return LLPanel::postBuild(); } -void LLPanelCameraZoom::onOpen(const LLSD& key) +void LLPanelCameraZoom::draw() { - LLVector3d to_focus = gAgent.getPosGlobalFromAgent(LLViewerCamera::getInstance()->getOrigin()) - gAgent.calcFocusPositionTargetGlobal(); - mSavedSliderVal = 8.f - (F32)to_focus.magVec(); // maximum minus current - mSlider->setValue( mSavedSliderVal ); + mSlider->setValue(gAgentCamera.getCameraZoomFraction()); + LLPanel::draw(); } void LLPanelCameraZoom::onZoomPlusHeldDown() @@ -118,9 +183,9 @@ void LLPanelCameraZoom::onZoomPlusHeldDown() F32 val = mSlider->getValueF32(); F32 inc = mSlider->getIncrement(); mSlider->setValue(val - inc); - // commit only if value changed - if (val != mSlider->getValueF32()) - mSlider->onCommit(); + F32 time = mPlusBtn->getHeldDownTime(); + gAgentCamera.unlockView(); + gAgentCamera.setOrbitInKey(getOrbitRate(time)); } void LLPanelCameraZoom::onZoomMinusHeldDown() @@ -128,20 +193,28 @@ void LLPanelCameraZoom::onZoomMinusHeldDown() F32 val = mSlider->getValueF32(); F32 inc = mSlider->getIncrement(); mSlider->setValue(val + inc); - // commit only if value changed - if (val != mSlider->getValueF32()) - mSlider->onCommit(); + F32 time = mMinusBtn->getHeldDownTime(); + gAgentCamera.unlockView(); + gAgentCamera.setOrbitOutKey(getOrbitRate(time)); } -void LLPanelCameraZoom::onSliderValueChanged() +F32 LLPanelCameraZoom::getOrbitRate(F32 time) { - F32 val = mSlider->getValueF32(); - F32 rate = val - mSavedSliderVal; - - gAgent.unlockView(); - gAgent.cameraOrbitIn(rate); + if( time < NUDGE_TIME ) + { + F32 rate = ORBIT_NUDGE_RATE + time * (1 - ORBIT_NUDGE_RATE)/ NUDGE_TIME; + return rate; + } + else + { + return 1; + } +} - mSavedSliderVal = val; +void LLPanelCameraZoom::onSliderValueChanged() +{ + F32 zoom_level = mSlider->getValueF32(); + gAgentCamera.setCameraZoomFraction(zoom_level); } void activate_camera_tool() @@ -156,23 +229,18 @@ void activate_camera_tool() /*static*/ bool LLFloaterCamera::inFreeCameraMode() { LLFloaterCamera* floater_camera = LLFloaterCamera::findInstance(); - if (floater_camera && floater_camera->mCurrMode == CAMERA_CTRL_MODE_FREE_CAMERA && gAgent.getCameraMode() != CAMERA_MODE_MOUSELOOK) + if (floater_camera && floater_camera->mCurrMode == CAMERA_CTRL_MODE_FREE_CAMERA && gAgentCamera.getCameraMode() != CAMERA_MODE_MOUSELOOK) { return true; } return false; } -bool LLFloaterCamera::inAvatarViewMode() -{ - return mCurrMode == CAMERA_CTRL_MODE_AVATAR_VIEW; -} - void LLFloaterCamera::resetCameraMode() { LLFloaterCamera* floater_camera = LLFloaterCamera::findInstance(); if (!floater_camera) return; - floater_camera->switchMode(CAMERA_CTRL_MODE_ORBIT); + floater_camera->switchMode(CAMERA_CTRL_MODE_PAN); } void LLFloaterCamera::update() @@ -190,9 +258,13 @@ void LLFloaterCamera::toPrevMode() /*static*/ void LLFloaterCamera::onLeavingMouseLook() { LLFloaterCamera* floater_camera = LLFloaterCamera::findInstance(); - if (floater_camera && floater_camera->inFreeCameraMode()) + if (floater_camera) { - activate_camera_tool(); + floater_camera->updateItemsSelection(); + if(floater_camera->inFreeCameraMode()) + { + activate_camera_tool(); + } } } @@ -226,24 +298,24 @@ void LLFloaterCamera::onClose(bool app_quitting) //We don't care of camera mode if app is quitting if(app_quitting) return; - // When mCurrMode is in CAMERA_CTRL_MODE_ORBIT + // When mCurrMode is in CAMERA_CTRL_MODE_PAN // switchMode won't modify mPrevMode, so force it here. // It is needed to correctly return to previous mode on open, see EXT-2727. - if (mCurrMode == CAMERA_CTRL_MODE_ORBIT) - mPrevMode = CAMERA_CTRL_MODE_ORBIT; + if (mCurrMode == CAMERA_CTRL_MODE_PAN) + mPrevMode = CAMERA_CTRL_MODE_PAN; // HACK: Should always close as docked to prevent toggleInstance without calling onOpen. if ( !isDocked() ) setDocked(true); - switchMode(CAMERA_CTRL_MODE_ORBIT); + switchMode(CAMERA_CTRL_MODE_PAN); mClosed = TRUE; } LLFloaterCamera::LLFloaterCamera(const LLSD& val) : LLTransientDockableFloater(NULL, true, val), mClosed(FALSE), - mCurrMode(CAMERA_CTRL_MODE_ORBIT), - mPrevMode(CAMERA_CTRL_MODE_ORBIT) + mCurrMode(CAMERA_CTRL_MODE_PAN), + mPrevMode(CAMERA_CTRL_MODE_PAN) { } @@ -251,21 +323,38 @@ LLFloaterCamera::LLFloaterCamera(const LLSD& val) BOOL LLFloaterCamera::postBuild() { setIsChrome(TRUE); + setTitleVisible(TRUE); // restore title visibility after chrome applying mRotate = getChild<LLJoystickCameraRotate>(ORBIT); mZoom = getChild<LLPanelCameraZoom>(ZOOM); mTrack = getChild<LLJoystickCameraTrack>(PAN); - assignButton2Mode(CAMERA_CTRL_MODE_ORBIT, "orbit_btn"); + assignButton2Mode(CAMERA_CTRL_MODE_MODES, "avatarview_btn"); assignButton2Mode(CAMERA_CTRL_MODE_PAN, "pan_btn"); - assignButton2Mode(CAMERA_CTRL_MODE_FREE_CAMERA, "freecamera_btn"); - assignButton2Mode(CAMERA_CTRL_MODE_AVATAR_VIEW, "avatarview_btn"); + assignButton2Mode(CAMERA_CTRL_MODE_PRESETS, "presets_btn"); update(); return LLDockableFloater::postBuild(); } +void LLFloaterCamera::fillFlatlistFromPanel (LLFlatListView* list, LLPanel* panel) +{ + // copying child list and then iterating over a copy, because list itself + // is changed in process + const child_list_t child_list = *panel->getChildList(); + child_list_t::const_reverse_iterator iter = child_list.rbegin(); + child_list_t::const_reverse_iterator end = child_list.rend(); + for ( ; iter != end; ++iter) + { + LLView* view = *iter; + LLPanel* item = dynamic_cast<LLPanel*>(view); + if (panel) + list->addItem(item); + } + +} + ECameraControlMode LLFloaterCamera::determineMode() { LLTool* curr_tool = LLToolMgr::getInstance()->getCurrentTool(); @@ -274,12 +363,12 @@ ECameraControlMode LLFloaterCamera::determineMode() return CAMERA_CTRL_MODE_FREE_CAMERA; } - if (gAgent.getCameraMode() == CAMERA_MODE_MOUSELOOK) + if (gAgentCamera.getCameraMode() == CAMERA_MODE_MOUSELOOK) { - return CAMERA_CTRL_MODE_AVATAR_VIEW; + return CAMERA_CTRL_MODE_PRESETS; } - return CAMERA_CTRL_MODE_ORBIT; + return CAMERA_CTRL_MODE_PAN; } @@ -305,25 +394,54 @@ void LLFloaterCamera::setMode(ECameraControlMode mode) updateState(); } +void LLFloaterCamera::setModeTitle(const ECameraControlMode mode) +{ + std::string title; + switch(mode) + { + case CAMERA_CTRL_MODE_MODES: + title = getString("camera_modes_title"); + break; + case CAMERA_CTRL_MODE_PAN: + title = getString("pan_mode_title"); + break; + case CAMERA_CTRL_MODE_PRESETS: + title = getString("presets_mode_title"); + break; + default: + break; + } + setTitle(title); +} + void LLFloaterCamera::switchMode(ECameraControlMode mode) { setMode(mode); switch (mode) { - case CAMERA_CTRL_MODE_ORBIT: - clear_camera_tool(); + case CAMERA_CTRL_MODE_MODES: + if(sFreeCamera) + { + switchMode(CAMERA_CTRL_MODE_FREE_CAMERA); + } break; case CAMERA_CTRL_MODE_PAN: + sFreeCamera = false; clear_camera_tool(); break; case CAMERA_CTRL_MODE_FREE_CAMERA: + sFreeCamera = true; activate_camera_tool(); break; - case CAMERA_CTRL_MODE_AVATAR_VIEW: + case CAMERA_CTRL_MODE_PRESETS: + if(sFreeCamera) + { + switchMode(CAMERA_CTRL_MODE_FREE_CAMERA); + } break; default: @@ -352,67 +470,98 @@ void LLFloaterCamera::assignButton2Mode(ECameraControlMode mode, const std::stri void LLFloaterCamera::updateState() { + childSetVisible(ZOOM, CAMERA_CTRL_MODE_PAN == mCurrMode); + + bool show_presets = (CAMERA_CTRL_MODE_PRESETS == mCurrMode) || (CAMERA_CTRL_MODE_FREE_CAMERA == mCurrMode + && CAMERA_CTRL_MODE_PRESETS == mPrevMode); + childSetVisible(PRESETS, show_presets); + + bool show_camera_modes = CAMERA_CTRL_MODE_MODES == mCurrMode || (CAMERA_CTRL_MODE_FREE_CAMERA == mCurrMode + && CAMERA_CTRL_MODE_MODES == mPrevMode); + childSetVisible("camera_modes_list", show_camera_modes); + + updateItemsSelection(); + + if (CAMERA_CTRL_MODE_FREE_CAMERA == mCurrMode) + { + return; + } + //updating buttons std::map<ECameraControlMode, LLButton*>::const_iterator iter = mMode2Button.begin(); for (; iter != mMode2Button.end(); ++iter) { iter->second->setToggleState(iter->first == mCurrMode); } + setModeTitle(mCurrMode); +} - childSetVisible(ORBIT, CAMERA_CTRL_MODE_ORBIT == mCurrMode); - childSetVisible(PAN, CAMERA_CTRL_MODE_PAN == mCurrMode); - childSetVisible(ZOOM, CAMERA_CTRL_MODE_AVATAR_VIEW != mCurrMode); - childSetVisible(PRESETS, CAMERA_CTRL_MODE_AVATAR_VIEW == mCurrMode); - - //hiding or showing the panel with controls by reshaping the floater - bool showControls = CAMERA_CTRL_MODE_FREE_CAMERA != mCurrMode; - if (showControls == childIsVisible(CONTROLS)) return; +void LLFloaterCamera::updateItemsSelection() +{ + ECameraPreset preset = (ECameraPreset) gSavedSettings.getU32("CameraPreset"); + LLSD argument; + argument["selected"] = preset == CAMERA_PRESET_REAR_VIEW; + getChild<LLPanelCameraItem>("rear_view")->setValue(argument); + argument["selected"] = preset == CAMERA_PRESET_GROUP_VIEW; + getChild<LLPanelCameraItem>("group_view")->setValue(argument); + argument["selected"] = preset == CAMERA_PRESET_FRONT_VIEW; + getChild<LLPanelCameraItem>("front_view")->setValue(argument); + argument["selected"] = gAgentCamera.getCameraMode() == CAMERA_MODE_MOUSELOOK; + getChild<LLPanelCameraItem>("mouselook_view")->setValue(argument); + argument["selected"] = mCurrMode == CAMERA_CTRL_MODE_FREE_CAMERA; + getChild<LLPanelCameraItem>("object_view")->setValue(argument); +} - childSetVisible(CONTROLS, showControls); +void LLFloaterCamera::onClickCameraItem(const LLSD& param) +{ + std::string name = param.asString(); - LLRect rect = getRect(); - LLRect controls_rect; - if (childGetRect(CONTROLS, controls_rect)) + if ("mouselook_view" == name) { - S32 floater_header_size = getHeaderHeight(); - S32 height = controls_rect.getHeight() - floater_header_size; - S32 newHeight = rect.getHeight(); - - if (showControls) - { - newHeight += height; - } - else - { - newHeight -= height; - } - - rect.setOriginAndSize(rect.mLeft, rect.mBottom, rect.getWidth(), newHeight); - reshape(rect.getWidth(), rect.getHeight()); - setRect(rect); + gAgentCamera.changeCameraToMouselook(); + } + else if ("object_view" == name) + { + LLFloaterCamera* camera_floater = LLFloaterCamera::findInstance(); + if (camera_floater) + camera_floater->switchMode(CAMERA_CTRL_MODE_FREE_CAMERA); + } + else + { + switchToPreset(name); + } + LLFloaterCamera* camera_floater = LLFloaterCamera::findInstance(); + if (camera_floater) + { + camera_floater->updateItemsSelection(); + camera_floater->fromFreeToPresets(); } } -void LLFloaterCamera::onClickCameraPresets(const LLSD& param) +/*static*/ +void LLFloaterCamera::switchToPreset(const std::string& name) { - std::string name = param.asString(); - + sFreeCamera = false; + clear_camera_tool(); if ("rear_view" == name) { - gAgent.switchCameraPreset(CAMERA_PRESET_REAR_VIEW); + gAgentCamera.switchCameraPreset(CAMERA_PRESET_REAR_VIEW); } else if ("group_view" == name) { - gAgent.switchCameraPreset(CAMERA_PRESET_GROUP_VIEW); + gAgentCamera.switchCameraPreset(CAMERA_PRESET_GROUP_VIEW); } else if ("front_view" == name) { - gAgent.switchCameraPreset(CAMERA_PRESET_FRONT_VIEW); + gAgentCamera.switchCameraPreset(CAMERA_PRESET_FRONT_VIEW); } - else if ("mouselook_view" == name) +} + +void LLFloaterCamera::fromFreeToPresets() +{ + if (!sFreeCamera && mCurrMode == CAMERA_CTRL_MODE_FREE_CAMERA && mPrevMode == CAMERA_CTRL_MODE_PRESETS) { - gAgent.changeCameraToMouselook(); + switchMode(CAMERA_CTRL_MODE_PRESETS); } - } diff --git a/indra/newview/llfloatercamera.h b/indra/newview/llfloatercamera.h index 45d5e9a845..564e38d02d 100644 --- a/indra/newview/llfloatercamera.h +++ b/indra/newview/llfloatercamera.h @@ -34,19 +34,21 @@ #define LLFLOATERCAMERA_H #include "lltransientdockablefloater.h" +#include "lliconctrl.h" +#include "lltextbox.h" +#include "llflatlistview.h" class LLJoystickCameraRotate; -class LLJoystickCameraZoom; class LLJoystickCameraTrack; class LLFloaterReg; class LLPanelCameraZoom; enum ECameraControlMode { - CAMERA_CTRL_MODE_ORBIT, + CAMERA_CTRL_MODE_MODES, CAMERA_CTRL_MODE_PAN, CAMERA_CTRL_MODE_FREE_CAMERA, - CAMERA_CTRL_MODE_AVATAR_VIEW + CAMERA_CTRL_MODE_PRESETS }; class LLFloaterCamera @@ -58,8 +60,8 @@ public: /* whether in free camera mode */ static bool inFreeCameraMode(); - /* callback for camera presets changing */ - static void onClickCameraPresets(const LLSD& param); + /* callback for camera items selection changing */ + static void onClickCameraItem(const LLSD& param); static void onLeavingMouseLook(); @@ -68,7 +70,14 @@ public: /* determines actual mode and updates ui */ void update(); - + + /*switch to one of the camera presets (front, rear, side)*/ + static void switchToPreset(const std::string& name); + + /* move to CAMERA_CTRL_MODE_PRESETS from CAMERA_CTRL_MODE_FREE_CAMERA if we are on presets panel and + are not in free camera mode*/ + void fromFreeToPresets(); + virtual void onOpen(const LLSD& key); virtual void onClose(bool app_quitting); @@ -88,9 +97,6 @@ private: ECameraControlMode determineMode(); - /* whether in avatar view (first person) mode */ - bool inAvatarViewMode(); - /* resets to the previous mode */ void toPrevMode(); @@ -100,18 +106,65 @@ private: /* sets a new mode preserving previous one and updates ui*/ void setMode(ECameraControlMode mode); + /** set title appropriate to passed mode */ + void setModeTitle(const ECameraControlMode mode); + /* updates the state (UI) according to the current mode */ void updateState(); + /* update camera modes items selection and camera preset items selection according to the currently selected preset */ + void updateItemsSelection(); + void onClickBtn(ECameraControlMode mode); void assignButton2Mode(ECameraControlMode mode, const std::string& button_name); + // fills flatlist with items from given panel + void fillFlatlistFromPanel (LLFlatListView* list, LLPanel* panel); + // set to true when free camera mode is selected in modes list + // remains true until preset camera mode is chosen, or pan button is clicked, or escape pressed + static bool sFreeCamera; BOOL mClosed; ECameraControlMode mPrevMode; ECameraControlMode mCurrMode; std::map<ECameraControlMode, LLButton*> mMode2Button; +}; +/** + * Class used to represent widgets from panel_camera_item.xml- + * panels that contain pictures and text. Pictures are different + * for selected and unselected state (this state is nor stored- icons + * are changed in setValue()). This class doesn't implement selection logic- + * it's items are used inside of flatlist. + */ +class LLPanelCameraItem + : public LLPanel +{ +public: + struct Params : public LLInitParam::Block<Params, LLPanel::Params> + { + Optional<LLIconCtrl::Params> icon_over; + Optional<LLIconCtrl::Params> icon_selected; + Optional<LLIconCtrl::Params> picture; + Optional<LLIconCtrl::Params> selected_picture; + + Optional<LLTextBox::Params> text; + Optional<CommitCallbackParam> mousedown_callback; + Params(); + }; + /*virtual*/ BOOL postBuild(); + /** setting on/off background icon to indicate selected state */ + /*virtual*/ void setValue(const LLSD& value); + // sends commit signal + void onAnyMouseClick(); +protected: + friend class LLUICtrlFactory; + LLPanelCameraItem(const Params&); + LLIconCtrl* mIconOver; + LLIconCtrl* mIconSelected; + LLIconCtrl* mPicture; + LLIconCtrl* mPictureSelected; + LLTextBox* mText; }; #endif diff --git a/indra/newview/llfloaterchat.cpp b/indra/newview/llfloaterchat.cpp index cdb9b8edb8..882d12f68e 100644 --- a/indra/newview/llfloaterchat.cpp +++ b/indra/newview/llfloaterchat.cpp @@ -166,7 +166,7 @@ void add_timestamped_line(LLViewerTextEditor* edit, LLChat chat, const LLColor4& if (chat.mSourceType == CHAT_SOURCE_AGENT && chat.mFromID != LLUUID::null) { - chat.mURL = LLSLURL::buildCommand("agent", chat.mFromID, "inspect"); + chat.mURL = LLSLURL("agent", chat.mFromID, "inspect").getSLURLString(); } // If the chat line has an associated url, link it up to the name. diff --git a/indra/newview/llfloaterchatterbox.cpp b/indra/newview/llfloaterchatterbox.cpp index 774caaec90..a15cef7ea4 100644 --- a/indra/newview/llfloaterchatterbox.cpp +++ b/indra/newview/llfloaterchatterbox.cpp @@ -318,7 +318,7 @@ LLFloaterChatterBox* LLFloaterChatterBox::getInstance() //static LLFloater* LLFloaterChatterBox::getCurrentVoiceFloater() { - if (!LLVoiceClient::voiceEnabled()) + if (!LLVoiceClient::getInstance()->voiceEnabled()) { return NULL; } diff --git a/indra/newview/llfloaterevent.cpp b/indra/newview/llfloaterevent.cpp new file mode 100644 index 0000000000..f6cffd4b14 --- /dev/null +++ b/indra/newview/llfloaterevent.cpp @@ -0,0 +1,356 @@ +/** + * @file llfloaterevent.cpp + * @brief Display for events in the finder + * + * $LicenseInfo:firstyear=2004&license=viewergpl$ + * + * Copyright (c) 2004-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llfloaterevent.h" + +#include "message.h" +#include "llnotificationsutil.h" +#include "llui.h" + +#include "llagent.h" +#include "llviewerwindow.h" +#include "llbutton.h" +#include "llcachename.h" +#include "llcommandhandler.h" // secondlife:///app/chat/ support +#include "lleventflags.h" +#include "lleventnotifier.h" +#include "llexpandabletextbox.h" +#include "llfloater.h" +#include "llfloaterreg.h" +#include "llfloaterworldmap.h" +#include "llinventorymodel.h" +#include "llsecondlifeurls.h" +#include "llslurl.h" +#include "lltextbox.h" +#include "lltexteditor.h" +#include "lluiconstants.h" +#include "llviewercontrol.h" +#include "llweb.h" +#include "llworldmap.h" +#include "llworldmapmessage.h" +#include "lluictrlfactory.h" +#include "lltrans.h" + + +class LLEventHandler : public LLCommandHandler +{ +public: + // requires trusted browser to trigger + LLEventHandler() : LLCommandHandler("event", UNTRUSTED_THROTTLE) { } + bool handle(const LLSD& params, const LLSD& query_map, + LLMediaCtrl* web) + { + if (params.size() < 1) + { + return false; + } + + LLFloaterEvent* floater = LLFloaterReg::getTypedInstance<LLFloaterEvent>("event"); + if (floater) + { + floater->setEventID(params[0].asInteger()); + LLFloaterReg::showTypedInstance<LLFloaterEvent>("event"); + return true; + } + + return false; + } +}; +LLEventHandler gEventHandler; + +LLFloaterEvent::LLFloaterEvent(const LLSD& key) + : LLFloater(key), + + mEventID(0) +{ +} + + +LLFloaterEvent::~LLFloaterEvent() +{ +} + + +BOOL LLFloaterEvent::postBuild() +{ + mTBName = getChild<LLTextBox>("event_name"); + + mTBCategory = getChild<LLTextBox>("event_category"); + + mTBDate = getChild<LLTextBox>("event_date"); + + mTBDuration = getChild<LLTextBox>("event_duration"); + + mTBDesc = getChild<LLExpandableTextBox>("event_desc"); + + mTBRunBy = getChild<LLTextBox>("event_runby"); + mTBLocation = getChild<LLTextBox>("event_location"); + mTBCover = getChild<LLTextBox>("event_cover"); + + mTeleportBtn = getChild<LLButton>( "teleport_btn"); + mTeleportBtn->setClickedCallback(onClickTeleport, this); + + mMapBtn = getChild<LLButton>( "map_btn"); + mMapBtn->setClickedCallback(onClickMap, this); + + mNotifyBtn = getChild<LLButton>( "notify_btn"); + mNotifyBtn->setClickedCallback(onClickNotify, this); + + mCreateEventBtn = getChild<LLButton>( "create_event_btn"); + mCreateEventBtn->setClickedCallback(onClickCreateEvent, this); + + mGodDeleteEventBtn = getChild<LLButton>( "god_delete_event_btn"); + mGodDeleteEventBtn->setClickedCallback(boost::bind(&LLFloaterEvent::onClickDeleteEvent, this)); + + return TRUE; +} + +void LLFloaterEvent::setEventID(const U32 event_id) +{ + mEventID = event_id; + // Should reset all of the panel state here + resetInfo(); + + if (event_id != 0) + { + sendEventInfoRequest(); + } +} + +void LLFloaterEvent::onClickDeleteEvent() +{ + LLMessageSystem* msg = gMessageSystem; + + msg->newMessageFast(_PREHASH_EventGodDelete); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + + msg->nextBlockFast(_PREHASH_EventData); + msg->addU32Fast(_PREHASH_EventID, mEventID); + + gAgent.sendReliableMessage(); +} + +void LLFloaterEvent::sendEventInfoRequest() +{ + LLMessageSystem *msg = gMessageSystem; + + msg->newMessageFast(_PREHASH_EventInfoRequest); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID() ); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID() ); + msg->nextBlockFast(_PREHASH_EventData); + msg->addU32Fast(_PREHASH_EventID, mEventID); + gAgent.sendReliableMessage(); +} + +//static +void LLFloaterEvent::processEventInfoReply(LLMessageSystem *msg, void **) +{ + // extract the agent id + LLUUID agent_id; + msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id ); + + LLFloaterEvent* floater = LLFloaterReg::getTypedInstance<LLFloaterEvent>("event"); + + if(floater) + { + floater->mEventInfo.unpack(msg); + floater->mTBName->setText(floater->mEventInfo.mName); + floater->mTBCategory->setText(floater->mEventInfo.mCategoryStr); + floater->mTBDate->setText(floater->mEventInfo.mTimeStr); + floater->mTBDesc->setText(floater->mEventInfo.mDesc); + floater->mTBRunBy->setText(LLSLURL("agent", floater->mEventInfo.mRunByID, "inspect").getSLURLString()); + + floater->mTBDuration->setText(llformat("%d:%.2d", floater->mEventInfo.mDuration / 60, floater->mEventInfo.mDuration % 60)); + + if (!floater->mEventInfo.mHasCover) + { + floater->mTBCover->setText(floater->getString("none")); + } + else + { + floater->mTBCover->setText(llformat("%d", floater->mEventInfo.mCover)); + } + + F32 global_x = (F32)floater->mEventInfo.mPosGlobal.mdV[VX]; + F32 global_y = (F32)floater->mEventInfo.mPosGlobal.mdV[VY]; + + S32 region_x = llround(global_x) % REGION_WIDTH_UNITS; + S32 region_y = llround(global_y) % REGION_WIDTH_UNITS; + S32 region_z = llround((F32)floater->mEventInfo.mPosGlobal.mdV[VZ]); + + std::string desc = floater->mEventInfo.mSimName + llformat(" (%d, %d, %d)", region_x, region_y, region_z); + floater->mTBLocation->setText(desc); + + floater->childSetVisible("rating_icon_m", FALSE); + floater->childSetVisible("rating_icon_r", FALSE); + floater->childSetVisible("rating_icon_pg", FALSE); + floater->childSetValue("rating_value", floater->getString("unknown")); + + //for some reason there's not adult flags for now, so see if region is adult and then + //set flags + LLWorldMapMessage::url_callback_t cb = boost::bind( ®ionInfoCallback, floater->mEventInfo.mID, _1); + LLWorldMapMessage::getInstance()->sendNamedRegionRequest(floater->mEventInfo.mSimName, cb, std::string("unused"), false); + + if (floater->mEventInfo.mUnixTime < time_corrected()) + { + floater->mNotifyBtn->setEnabled(FALSE); + } + else + { + floater->mNotifyBtn->setEnabled(TRUE); + } + + if (gEventNotifier.hasNotification(floater->mEventInfo.mID)) + { + floater->mNotifyBtn->setLabel(floater->getString("dont_notify")); + } + else + { + floater->mNotifyBtn->setLabel(floater->getString("notify")); + } + + floater->mMapBtn->setEnabled(TRUE); + floater->mTeleportBtn->setEnabled(TRUE); + } +} + +//static +void LLFloaterEvent::regionInfoCallback(U32 event_id, U64 region_handle) +{ + LLSimInfo* sim_info = LLWorldMap::getInstance()->simInfoFromHandle(region_handle); + LLFloaterEvent* floater = LLFloaterReg::getTypedInstance<LLFloaterEvent>("event"); + + if (sim_info && floater && (event_id == floater->getEventID())) + { + // update the event with the maturity info + if (sim_info->isAdult()) + { + floater->childSetVisible("rating_icon_m", FALSE); + floater->childSetVisible("rating_icon_r", TRUE); + floater->childSetVisible("rating_icon_pg", FALSE); + floater->childSetValue("rating_value", floater->getString("adult")); + + } + else if (floater->mEventInfo.mEventFlags & EVENT_FLAG_MATURE) + { + floater->childSetVisible("rating_icon_m", TRUE); + floater->childSetVisible("rating_icon_r", FALSE); + floater->childSetVisible("rating_icon_pg", FALSE); + floater->childSetValue("rating_value", floater->getString("moderate")); + } + else + { + floater->childSetVisible("rating_icon_m", FALSE); + floater->childSetVisible("rating_icon_r", FALSE); + floater->childSetVisible("rating_icon_pg", TRUE); + floater->childSetValue("rating_value", floater->getString("general")); + } + } +} + +void LLFloaterEvent::draw() +{ + mGodDeleteEventBtn->setVisible(gAgent.isGodlike()); + + LLPanel::draw(); +} + +void LLFloaterEvent::resetInfo() +{ + mTBName->setText(LLStringUtil::null); + mTBCategory->setText(LLStringUtil::null); + mTBDate->setText(LLStringUtil::null); + mTBDesc->setText(LLStringUtil::null); + mTBDuration->setText(LLStringUtil::null); + mTBCover->setText(LLStringUtil::null); + mTBLocation->setText(LLStringUtil::null); + mTBRunBy->setText(LLStringUtil::null); + mNotifyBtn->setEnabled(FALSE); + mMapBtn->setEnabled(FALSE); + mTeleportBtn->setEnabled(FALSE); +} + +// static +void LLFloaterEvent::onClickTeleport(void* data) +{ + LLFloaterEvent* self = (LLFloaterEvent*)data; + LLFloaterWorldMap* worldmap_instance = LLFloaterWorldMap::getInstance(); + if (!self->mEventInfo.mPosGlobal.isExactlyZero()&&worldmap_instance) + { + gAgent.teleportViaLocation(self->mEventInfo.mPosGlobal); + worldmap_instance->trackLocation(self->mEventInfo.mPosGlobal); + } +} + + +// static +void LLFloaterEvent::onClickMap(void* data) +{ + LLFloaterEvent* self = (LLFloaterEvent*)data; + LLFloaterWorldMap* worldmap_instance = LLFloaterWorldMap::getInstance(); + + if (!self->mEventInfo.mPosGlobal.isExactlyZero()&&worldmap_instance) + { + worldmap_instance->trackLocation(self->mEventInfo.mPosGlobal); + LLFloaterReg::showInstance("world_map", "center"); + } +} + + +// static +void LLFloaterEvent::onClickCreateEvent(void* data) +{ + LLNotificationsUtil::add("PromptGoToEventsPage");//, LLSD(), LLSD(), callbackCreateEventWebPage); +} + + +// static +void LLFloaterEvent::onClickNotify(void *data) +{ + LLFloaterEvent* self = (LLFloaterEvent*)data; + + if (!gEventNotifier.hasNotification(self->mEventID)) + { + gEventNotifier.add(self->mEventInfo); + self->mNotifyBtn->setLabel(self->getString("dont_notify")); + } + else + { + gEventNotifier.remove(self->mEventInfo.mID); + self->mNotifyBtn->setLabel(self->getString("notify")); + } +} diff --git a/indra/newview/llfloaterevent.h b/indra/newview/llfloaterevent.h new file mode 100644 index 0000000000..4126236964 --- /dev/null +++ b/indra/newview/llfloaterevent.h @@ -0,0 +1,97 @@ +/** + * @file llfloaterevent.h + * @brief Display for events in the finder + * + * $LicenseInfo:firstyear=2004&license=viewergpl$ + * + * Copyright (c) 2004-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLFLOATEREVENT_H +#define LL_LLFLOATEREVENT_H + +#include "llfloater.h" +#include "lleventinfo.h" +#include "lluuid.h" +#include "v3dmath.h" + +class LLTextBox; +class LLTextEditor; +class LLButton; +class LLExpandableTextBox; +class LLMessageSystem; + +class LLFloaterEvent : public LLFloater +{ +public: + LLFloaterEvent(const LLSD& key); + /*virtual*/ ~LLFloaterEvent(); + + /*virtual*/ BOOL postBuild(); + /*virtual*/ void draw(); + + void setEventID(const U32 event_id); + void sendEventInfoRequest(); + + static void processEventInfoReply(LLMessageSystem *msg, void **); + + U32 getEventID() { return mEventID; } + +protected: + void resetInfo(); + + static void onClickTeleport(void*); + static void onClickMap(void*); + //static void onClickLandmark(void*); + static void onClickCreateEvent(void*); + static void onClickNotify(void*); + void onClickDeleteEvent(); + + static void regionInfoCallback(U32 event_id, U64 region_handle); + + +protected: + U32 mEventID; + LLEventInfo mEventInfo; + + LLTextBox* mTBName; + LLTextBox* mTBCategory; + LLTextBox* mTBDate; + LLTextBox* mTBDuration; + LLExpandableTextBox* mTBDesc; + + LLTextBox* mTBRunBy; + LLTextBox* mTBLocation; + LLTextBox* mTBCover; + + LLButton* mTeleportBtn; + LLButton* mMapBtn; + LLButton* mCreateEventBtn; + LLButton* mGodDeleteEventBtn; + LLButton* mNotifyBtn; +}; + +#endif // LL_LLFLOATEREVENT_H diff --git a/indra/newview/llfloaterfriends.cpp b/indra/newview/llfloaterfriends.cpp index ccc5cab85a..4e2633d750 100644 --- a/indra/newview/llfloaterfriends.cpp +++ b/indra/newview/llfloaterfriends.cpp @@ -58,7 +58,7 @@ #include "llmenucommands.h" #include "llviewercontrol.h" #include "llviewermessage.h" -#include "lltimer.h" +#include "lleventtimer.h" #include "lltextbox.h" #include "llvoiceclient.h" diff --git a/indra/newview/llfloatergesture.cpp b/indra/newview/llfloatergesture.cpp index b684e1f985..eff7131145 100644 --- a/indra/newview/llfloatergesture.cpp +++ b/indra/newview/llfloatergesture.cpp @@ -36,6 +36,7 @@ #include "llinventory.h" #include "llinventorybridge.h" +#include "llinventoryfunctions.h" #include "llinventorymodel.h" #include "llinventoryclipboard.h" @@ -106,7 +107,7 @@ LLFloaterGesture::LLFloaterGesture(const LLSD& key) : LLFloater(key) { mObserver = new LLFloaterGestureObserver(this); - LLGestureManager::instance().addObserver(mObserver); + LLGestureMgr::instance().addObserver(mObserver); mCommitCallbackRegistrar.add("Gesture.Action.ToogleActiveState", boost::bind(&LLFloaterGesture::onActivateBtnClick, this)); mCommitCallbackRegistrar.add("Gesture.Action.ShowPreview", boost::bind(&LLFloaterGesture::onClickEdit, this)); @@ -125,7 +126,7 @@ void LLFloaterGesture::done() // we load only gesture folder without childred. LLInventoryModel::cat_array_t* categories; LLInventoryModel::item_array_t* items; - LLInventoryFetchDescendentsObserver::folder_ref_t unloaded_folders; + uuid_vec_t unloaded_folders; LL_DEBUGS("Gesture")<< "Get subdirs of Gesture Folder...." << LL_ENDL; gInventory.getDirectDescendentsOf(mGestureFolderID, categories, items); if (categories->empty()) @@ -147,7 +148,8 @@ void LLFloaterGesture::done() if (!unloaded_folders.empty()) { LL_DEBUGS("Gesture")<< "Fetching subdirectories....." << LL_ENDL; - fetchDescendents(unloaded_folders); + setFetchIDs(unloaded_folders); + startFetch(); } else { @@ -165,7 +167,7 @@ void LLFloaterGesture::done() // virtual LLFloaterGesture::~LLFloaterGesture() { - LLGestureManager::instance().removeObserver(mObserver); + LLGestureMgr::instance().removeObserver(mObserver); delete mObserver; mObserver = NULL; gInventory.removeObserver(this); @@ -197,18 +199,19 @@ BOOL LLFloaterGesture::postBuild() setDefaultBtn("play_btn"); mGestureFolderID = gInventory.findCategoryUUIDForType(LLFolderType::FT_GESTURE, false); - folder_ref_t folders; + uuid_vec_t folders; folders.push_back(mGestureFolderID); //perform loading Gesture directory anyway to make sure that all subdirectory are loaded too. See method done() for details. gInventory.addObserver(this); - fetchDescendents(folders); - - buildGestureList(); - - mGestureList->setFocus(TRUE); + setFetchIDs(folders); + startFetch(); if (mGestureList) { + buildGestureList(); + + mGestureList->setFocus(TRUE); + const BOOL ascending = TRUE; mGestureList->sortByColumn(std::string("name"), ascending); mGestureList->selectFirstItem(); @@ -223,10 +226,10 @@ BOOL LLFloaterGesture::postBuild() void LLFloaterGesture::refreshAll() { - buildGestureList(); - if (!mGestureList) return; + buildGestureList(); + if (mSelectedID.isNull()) { mGestureList->selectFirstItem(); @@ -246,13 +249,13 @@ void LLFloaterGesture::refreshAll() void LLFloaterGesture::buildGestureList() { S32 scroll_pos = mGestureList->getScrollPos(); - std::vector<LLUUID> selected_items; + uuid_vec_t selected_items; getSelectedIds(selected_items); LL_DEBUGS("Gesture")<< "Rebuilding gesture list "<< LL_ENDL; mGestureList->deleteAllItems(); - LLGestureManager::item_map_t::const_iterator it; - const LLGestureManager::item_map_t& active_gestures = LLGestureManager::instance().getActiveGestures(); + LLGestureMgr::item_map_t::const_iterator it; + const LLGestureMgr::item_map_t& active_gestures = LLGestureMgr::instance().getActiveGestures(); for (it = active_gestures.begin(); it != active_gestures.end(); ++it) { addGesture(it->first,it->second, mGestureList); @@ -278,7 +281,7 @@ void LLFloaterGesture::buildGestureList() // attempt to preserve scroll position through re-builds // since we do re-build whenever something gets dirty - for(std::vector<LLUUID>::iterator it = selected_items.begin(); it != selected_items.end(); it++) + for(uuid_vec_t::iterator it = selected_items.begin(); it != selected_items.end(); it++) { mGestureList->selectByID(*it); } @@ -354,10 +357,10 @@ void LLFloaterGesture::addGesture(const LLUUID& item_id , LLMultiGesture* gestur element["columns"][0]["value"] = ""; element["columns"][0]["font"]["name"] = "SANSSERIF"; element["columns"][0]["font"]["style"] = font_style; - element["columns"][0]["column"] = "trigger"; - element["columns"][0]["value"] = "---"; - element["columns"][0]["font"]["name"] = "SANSSERIF"; - element["columns"][0]["font"]["style"] = font_style; + element["columns"][1]["column"] = "shortcut"; + element["columns"][1]["value"] = "---"; + element["columns"][1]["font"]["name"] = "SANSSERIF"; + element["columns"][1]["font"]["style"] = font_style; element["columns"][2]["column"] = "key"; element["columns"][2]["value"] = "~~~"; element["columns"][2]["font"]["name"] = "SANSSERIF"; @@ -371,13 +374,13 @@ void LLFloaterGesture::addGesture(const LLUUID& item_id , LLMultiGesture* gestur LLScrollListItem* sl_item = list->addElement(element, ADD_BOTTOM); if(sl_item) { - LLFontGL::StyleFlags style = LLGestureManager::getInstance()->isGestureActive(item_id) ? LLFontGL::BOLD : LLFontGL::NORMAL; + LLFontGL::StyleFlags style = LLGestureMgr::getInstance()->isGestureActive(item_id) ? LLFontGL::BOLD : LLFontGL::NORMAL; // *TODO find out why ["font"]["style"] does not affect font style ((LLScrollListText*)sl_item->getColumn(0))->setFontStyle(style); } } -void LLFloaterGesture::getSelectedIds(std::vector<LLUUID>& ids) +void LLFloaterGesture::getSelectedIds(uuid_vec_t& ids) { std::vector<LLScrollListItem*> items = mGestureList->getAllSelected(); for(std::vector<LLScrollListItem*>::const_iterator it = items.begin(); it != items.end(); it++) @@ -421,14 +424,19 @@ void LLFloaterGesture::onClickPlay() if(item_id.isNull()) return; LL_DEBUGS("Gesture")<<" Trying to play gesture id: "<< item_id <<LL_ENDL; - if(!LLGestureManager::instance().isGestureActive(item_id)) + if(!LLGestureMgr::instance().isGestureActive(item_id)) { // we need to inform server about gesture activating to be consistent with LLPreviewGesture and LLGestureComboList. BOOL inform_server = TRUE; BOOL deactivate_similar = FALSE; - LLGestureManager::instance().setGestureLoadedCallback(item_id, boost::bind(&LLFloaterGesture::playGesture, this, item_id)); - LLGestureManager::instance().activateGestureWithAsset(item_id, gInventory.getItem(item_id)->getAssetUUID(), inform_server, deactivate_similar); - LL_DEBUGS("Gesture")<< "Activating gesture with inventory ID: " << item_id <<LL_ENDL; + LLGestureMgr::instance().setGestureLoadedCallback(item_id, boost::bind(&LLFloaterGesture::playGesture, this, item_id)); + LLViewerInventoryItem *item = gInventory.getItem(item_id); + llassert(item); + if (item) + { + LLGestureMgr::instance().activateGestureWithAsset(item_id, item->getAssetUUID(), inform_server, deactivate_similar); + LL_DEBUGS("Gesture")<< "Activating gesture with inventory ID: " << item_id <<LL_ENDL; + } } else { @@ -446,13 +454,13 @@ void LLFloaterGesture::onClickNew() void LLFloaterGesture::onActivateBtnClick() { - std::vector<LLUUID> ids; + uuid_vec_t ids; getSelectedIds(ids); if(ids.empty()) return; - LLGestureManager* gm = LLGestureManager::getInstance(); - std::vector<LLUUID>::const_iterator it = ids.begin(); + LLGestureMgr* gm = LLGestureMgr::getInstance(); + uuid_vec_t::const_iterator it = ids.begin(); BOOL first_gesture_state = gm->isGestureActive(*it); BOOL is_mixed = FALSE; while( ++it != ids.end() ) @@ -463,7 +471,7 @@ void LLFloaterGesture::onActivateBtnClick() break; } } - for(std::vector<LLUUID>::const_iterator it = ids.begin(); it != ids.end(); it++) + for(uuid_vec_t::const_iterator it = ids.begin(); it != ids.end(); it++) { if(is_mixed) { @@ -489,11 +497,11 @@ void LLFloaterGesture::onCopyPasteAction(const LLSD& command) // since we select this comman inventory item had already arrived . if("copy_gesture" == command_name) { - std::vector<LLUUID> ids; + uuid_vec_t ids; getSelectedIds(ids); // make sure that clopboard is empty LLInventoryClipboard::instance().reset(); - for(std::vector<LLUUID>::iterator it = ids.begin(); it != ids.end(); it++) + for(uuid_vec_t::iterator it = ids.begin(); it != ids.end(); it++) { LLInventoryItem* item = gInventory.getItem(*it); if(item && item->getInventoryType() == LLInventoryType::IT_GESTURE) @@ -510,15 +518,16 @@ void LLFloaterGesture::onCopyPasteAction(const LLSD& command) if(ids.empty() || !gInventory.isCategoryComplete(mGestureFolderID)) return; LLInventoryCategory* gesture_dir = gInventory.getCategory(mGestureFolderID); + llassert(gesture_dir); LLPointer<GestureCopiedCallback> cb = new GestureCopiedCallback(this); for(LLDynamicArray<LLUUID>::iterator it = ids.begin(); it != ids.end(); it++) { LLInventoryItem* item = gInventory.getItem(*it); - LLStringUtil::format_map_t string_args; - string_args["[COPY_NAME]"] = item->getName(); - if(item && item->getInventoryType() == LLInventoryType::IT_GESTURE) + if(gesture_dir && item && item->getInventoryType() == LLInventoryType::IT_GESTURE) { + LLStringUtil::format_map_t string_args; + string_args["[COPY_NAME]"] = item->getName(); LL_DEBUGS("Gesture")<< "Copying gesture " << item->getName() << " "<< item->getUUID() << " into " << gesture_dir->getName() << " "<< gesture_dir->getUUID() << LL_ENDL; copy_inventory_item(gAgent.getID(), item->getPermissions().getOwner(), item->getUUID(), @@ -552,7 +561,7 @@ void LLFloaterGesture::onCommitList() const LLUUID& item_id = mGestureList->getCurrentID(); mSelectedID = item_id; - if (LLGestureManager::instance().isGesturePlaying(item_id)) + if (LLGestureMgr::instance().isGesturePlaying(item_id)) { childSetVisible("play_btn", false); childSetVisible("stop_btn", true); @@ -566,14 +575,14 @@ void LLFloaterGesture::onCommitList() void LLFloaterGesture::onDeleteSelected() { - std::vector<LLUUID> ids; + uuid_vec_t ids; getSelectedIds(ids); if(ids.empty()) return; const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH); - LLGestureManager* gm = LLGestureManager::getInstance(); - for(std::vector<LLUUID>::const_iterator it = ids.begin(); it != ids.end(); it++) + LLGestureMgr* gm = LLGestureMgr::getInstance(); + for(uuid_vec_t::const_iterator it = ids.begin(); it != ids.end(); it++) { const LLUUID& selected_item = *it; LLInventoryItem* inv_item = gInventory.getItem(selected_item); @@ -604,10 +613,10 @@ void LLFloaterGesture::onDeleteSelected() void LLFloaterGesture::addToCurrentOutFit() { - std::vector<LLUUID> ids; + uuid_vec_t ids; getSelectedIds(ids); - LLAppearanceManager* am = LLAppearanceManager::getInstance(); - for(std::vector<LLUUID>::const_iterator it = ids.begin(); it != ids.end(); it++) + LLAppearanceMgr* am = LLAppearanceMgr::getInstance(); + for(uuid_vec_t::const_iterator it = ids.begin(); it != ids.end(); it++) { am->addCOFItemLink(*it); } @@ -617,12 +626,12 @@ void LLFloaterGesture::playGesture(LLUUID item_id) { LL_DEBUGS("Gesture")<<"Playing gesture "<< item_id<<LL_ENDL; - if (LLGestureManager::instance().isGesturePlaying(item_id)) + if (LLGestureMgr::instance().isGesturePlaying(item_id)) { - LLGestureManager::instance().stopGesture(item_id); + LLGestureMgr::instance().stopGesture(item_id); } else { - LLGestureManager::instance().playGesture(item_id); + LLGestureMgr::instance().playGesture(item_id); } } diff --git a/indra/newview/llfloatergesture.h b/indra/newview/llfloatergesture.h index 629d77b949..1676542c77 100644 --- a/indra/newview/llfloatergesture.h +++ b/indra/newview/llfloatergesture.h @@ -85,7 +85,7 @@ private: * Therefore we have to copy these items to avoid viewer crash. * @see LLFloaterGesture::onActivateBtnClick */ - void getSelectedIds(std::vector<LLUUID>& ids); + void getSelectedIds(uuid_vec_t& ids); bool isActionEnabled(const LLSD& command); /** * @brief Activation rules: diff --git a/indra/newview/llfloatergodtools.cpp b/indra/newview/llfloatergodtools.cpp index c2b0bd18fa..bd07cfdfbf 100644 --- a/indra/newview/llfloatergodtools.cpp +++ b/indra/newview/llfloatergodtools.cpp @@ -213,6 +213,9 @@ void LLFloaterGodTools::showPanel(const std::string& panel_name) // static void LLFloaterGodTools::processRegionInfo(LLMessageSystem* msg) { + llassert(msg); + if (!msg) return; + LLHost host = msg->getSender(); if (host != gAgent.getRegionHost()) { @@ -270,8 +273,7 @@ void LLFloaterGodTools::processRegionInfo(LLMessageSystem* msg) if ( gAgent.isGodlike() && LLFloaterReg::instanceVisible("god_tools") && god_tools->mPanelRegionTools - && god_tools->mPanelObjectTools - && msg ) + && god_tools->mPanelObjectTools) { LLPanelRegionTools* rtool = god_tools->mPanelRegionTools; god_tools->mCurrentHost = host; @@ -414,17 +416,17 @@ LLPanelRegionTools::LLPanelRegionTools() BOOL LLPanelRegionTools::postBuild() { getChild<LLLineEditor>("region name")->setKeystrokeCallback(onChangeSimName, this); - childSetPrevalidate("region name", &LLLineEditor::prevalidateASCIIPrintableNoPipe); - childSetPrevalidate("estate", &LLLineEditor::prevalidatePositiveS32); - childSetPrevalidate("parentestate", &LLLineEditor::prevalidatePositiveS32); + childSetPrevalidate("region name", &LLTextValidate::validateASCIIPrintableNoPipe); + childSetPrevalidate("estate", &LLTextValidate::validatePositiveS32); + childSetPrevalidate("parentestate", &LLTextValidate::validatePositiveS32); childDisable("parentestate"); - childSetPrevalidate("gridposx", &LLLineEditor::prevalidatePositiveS32); + childSetPrevalidate("gridposx", &LLTextValidate::validatePositiveS32); childDisable("gridposx"); - childSetPrevalidate("gridposy", &LLLineEditor::prevalidatePositiveS32); + childSetPrevalidate("gridposy", &LLTextValidate::validatePositiveS32); childDisable("gridposy"); - childSetPrevalidate("redirectx", &LLLineEditor::prevalidatePositiveS32); - childSetPrevalidate("redirecty", &LLLineEditor::prevalidatePositiveS32); + childSetPrevalidate("redirectx", &LLTextValidate::validatePositiveS32); + childSetPrevalidate("redirecty", &LLTextValidate::validatePositiveS32); return TRUE; } @@ -826,7 +828,6 @@ const F32 HOURS_TO_RADIANS = (2.f*F_PI)/24.f; LLPanelGridTools::LLPanelGridTools() : LLPanel() { - mCommitCallbackRegistrar.add("GridTools.KickAll", boost::bind(&LLPanelGridTools::onClickKickAll, this)); mCommitCallbackRegistrar.add("GridTools.FlushMapVisibilityCaches", boost::bind(&LLPanelGridTools::onClickFlushMapVisibilityCaches, this)); } @@ -844,46 +845,6 @@ void LLPanelGridTools::refresh() { } -void LLPanelGridTools::onClickKickAll() -{ - LLNotificationsUtil::add("KickAllUsers", LLSD(), LLSD(), LLPanelGridTools::confirmKick); -} - - -bool LLPanelGridTools::confirmKick(const LLSD& notification, const LLSD& response) -{ - if (LLNotificationsUtil::getSelectedOption(notification, response) == 0) - { - LLSD payload; - payload["kick_message"] = response["message"].asString(); - LLNotificationsUtil::add("ConfirmKick", LLSD(), payload, LLPanelGridTools::finishKick); - } - return false; -} - - -// static -bool LLPanelGridTools::finishKick(const LLSD& notification, const LLSD& response) -{ - S32 option = LLNotificationsUtil::getSelectedOption(notification, response); - - - if (option == 0) - { - LLMessageSystem* msg = gMessageSystem; - - msg->newMessageFast(_PREHASH_GodKickUser); - msg->nextBlockFast(_PREHASH_UserInfo); - msg->addUUIDFast(_PREHASH_GodID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_GodSessionID, gAgent.getSessionID()); - msg->addUUIDFast(_PREHASH_AgentID, LL_UUID_ALL_AGENTS ); - msg->addU32("KickFlags", KICK_FLAGS_DEFAULT ); - msg->addStringFast(_PREHASH_Reason, notification["payload"]["kick_message"].asString()); - gAgent.sendReliableMessage(); - } - return false; -} - void LLPanelGridTools::onClickFlushMapVisibilityCaches() { LLNotificationsUtil::add("FlushMapVisibilityCaches", LLSD(), LLSD(), flushMapVisibilityCachesConfirm); @@ -961,6 +922,7 @@ LLPanelObjectTools::~LLPanelObjectTools() BOOL LLPanelObjectTools::postBuild() { + refresh(); return TRUE; } @@ -1189,7 +1151,7 @@ void LLPanelObjectTools::onClickSetBySelection(void* data) panelp->childSetValue("target_avatar_name", name); } -void LLPanelObjectTools::callbackAvatarID(const std::vector<std::string>& names, const std::vector<LLUUID>& ids) +void LLPanelObjectTools::callbackAvatarID(const std::vector<std::string>& names, const uuid_vec_t& ids) { if (ids.empty() || names.empty()) return; mTargetAvatar = ids[0]; diff --git a/indra/newview/llfloatergodtools.h b/indra/newview/llfloatergodtools.h index ef5ce02749..aee9db78a3 100644 --- a/indra/newview/llfloatergodtools.h +++ b/indra/newview/llfloatergodtools.h @@ -198,9 +198,6 @@ public: void refresh(); - void onClickKickAll(); - static bool confirmKick(const LLSD& notification, const LLSD& response); - static bool finishKick(const LLSD& notification, const LLSD& response); static void onDragSunPhase(LLUICtrl *ctrl, void *userdata); void onClickFlushMapVisibilityCaches(); static bool flushMapVisibilityCachesConfirm(const LLSD& notification, const LLSD& response); @@ -234,7 +231,7 @@ public: void onChangeAnything(); void onApplyChanges(); void onClickSet(); - void callbackAvatarID(const std::vector<std::string>& names, const std::vector<LLUUID>& ids); + void callbackAvatarID(const std::vector<std::string>& names, const uuid_vec_t& ids); void onClickDeletePublicOwnedBy(); void onClickDeleteAllScriptedOwnedBy(); void onClickDeleteAllOwnedBy(); diff --git a/indra/newview/llfloatergroupinvite.cpp b/indra/newview/llfloatergroupinvite.cpp index bf484c6343..5d1864b4c8 100644 --- a/indra/newview/llfloatergroupinvite.cpp +++ b/indra/newview/llfloatergroupinvite.cpp @@ -112,7 +112,7 @@ LLFloaterGroupInvite::~LLFloaterGroupInvite() } // static -void LLFloaterGroupInvite::showForGroup(const LLUUID& group_id, std::vector<LLUUID> *agent_ids) +void LLFloaterGroupInvite::showForGroup(const LLUUID& group_id, uuid_vec_t *agent_ids) { const LLFloater::Params& floater_params = LLFloater::getDefaultParams(); S32 floater_header_size = floater_params.header_height; diff --git a/indra/newview/llfloatergroupinvite.h b/indra/newview/llfloatergroupinvite.h index b3f5d75ac1..68943724df 100644 --- a/indra/newview/llfloatergroupinvite.h +++ b/indra/newview/llfloatergroupinvite.h @@ -43,7 +43,7 @@ class LLFloaterGroupInvite public: virtual ~LLFloaterGroupInvite(); - static void showForGroup(const LLUUID &group_id, std::vector<LLUUID> *agent_ids = NULL); + static void showForGroup(const LLUUID &group_id, uuid_vec_t *agent_ids = NULL); protected: LLFloaterGroupInvite(const LLUUID& group_id = LLUUID::null); diff --git a/indra/newview/llfloaterhardwaresettings.cpp b/indra/newview/llfloaterhardwaresettings.cpp index b2564eb2b6..480e4ce3a4 100644 --- a/indra/newview/llfloaterhardwaresettings.cpp +++ b/indra/newview/llfloaterhardwaresettings.cpp @@ -143,10 +143,9 @@ void LLFloaterHardwareSettings::apply() LLWindow* window = gViewerWindow->getWindow(); LLCoordScreen size; window->getSize(&size); - gViewerWindow->changeDisplaySettings(window->getFullscreen(), - size, - gSavedSettings.getBOOL("DisableVerticalSync"), - logged_in); + gViewerWindow->changeDisplaySettings(size, + gSavedSettings.getBOOL("DisableVerticalSync"), + logged_in); } else if (old_anisotropic != LLImageGL::sGlobalUseAnisotropic) { diff --git a/indra/newview/llfloaterhud.cpp b/indra/newview/llfloaterhud.cpp index d2ee3e44c5..930bbe9e6b 100644 --- a/indra/newview/llfloaterhud.cpp +++ b/indra/newview/llfloaterhud.cpp @@ -79,9 +79,6 @@ BOOL LLFloaterHUD::postBuild() mWebBrowser = getChild<LLMediaCtrl>("floater_hud_browser" ); if (mWebBrowser) { - // Open links in internal browser - mWebBrowser->setOpenInExternalBrowser(false); - // This is a "chrome" floater, so we don't want anything to // take focus (as the user needs to be able to walk with // arrow keys during tutorial). diff --git a/indra/newview/llfloaterimagepreview.cpp b/indra/newview/llfloaterimagepreview.cpp index 61568df12e..8a20712ea8 100644 --- a/indra/newview/llfloaterimagepreview.cpp +++ b/indra/newview/llfloaterimagepreview.cpp @@ -59,13 +59,18 @@ #include "llviewertexturelist.h" #include "llstring.h" +#include "llendianswizzle.h" + +#include "llviewercontrol.h" +#include "lltrans.h" +#include "llimagedimensionsinfo.h" + const S32 PREVIEW_BORDER_WIDTH = 2; const S32 PREVIEW_RESIZE_HANDLE_SIZE = S32(RESIZE_HANDLE_WIDTH * OO_SQRT2) + PREVIEW_BORDER_WIDTH; const S32 PREVIEW_HPAD = PREVIEW_RESIZE_HANDLE_SIZE; const S32 PREF_BUTTON_HEIGHT = 16 + 7 + 16; const S32 PREVIEW_TEXTURE_HEIGHT = 300; - //----------------------------------------------------------------------------- // LLFloaterImagePreview() //----------------------------------------------------------------------------- @@ -124,6 +129,11 @@ BOOL LLFloaterImagePreview::postBuild() childShow("bad_image_text"); childDisable("clothing_type_combo"); childDisable("ok_btn"); + + if(!mImageLoadError.empty()) + { + childSetValue("bad_image_text",mImageLoadError.c_str()); + } } getChild<LLUICtrl>("ok_btn")->setCommitCallback(boost::bind(&LLFloaterNameDesc::onBtnOK, this)); @@ -341,6 +351,27 @@ bool LLFloaterImagePreview::loadImage(const std::string& src_filename) codec = IMG_CODEC_PNG; } + LLImageDimensionsInfo image_info; + if(!image_info.load(src_filename,codec)) + { + mImageLoadError = image_info.getLastError(); + return false; + } + + S32 max_width = gSavedSettings.getS32("max_texture_dimension_X"); + S32 max_heigh = gSavedSettings.getS32("max_texture_dimension_Y"); + + if(image_info.getWidth() > max_width|| image_info.getHeight() > max_heigh) + { + LLStringUtil::format_map_t args; + args["WIDTH"] = llformat("%d", max_width); + args["HEIGHT"] = llformat("%d", max_heigh); + + mImageLoadError = LLTrans::getString("texture_load_dimensions_error", args); + return false; + } + + LLPointer<LLImageRaw> raw_image = new LLImageRaw; switch (codec) @@ -611,7 +642,6 @@ LLImagePreviewAvatar::LLImagePreviewAvatar(S32 width, S32 height) : LLViewerDyna mCameraZoom = 1.f; mDummyAvatar = (LLVOAvatar*)gObjectList.createObjectViewer(LL_PCODE_LEGACY_AVATAR, gAgent.getRegion()); - mDummyAvatar->initInstance(); mDummyAvatar->createDrawable(&gPipeline); mDummyAvatar->mIsDummy = TRUE; mDummyAvatar->mSpecialRenderMode = 2; @@ -630,6 +660,11 @@ LLImagePreviewAvatar::~LLImagePreviewAvatar() mDummyAvatar->markDead(); } +//virtual +S8 LLImagePreviewAvatar::getType() const +{ + return LLViewerDynamicTexture::LL_IMAGE_PREVIEW_AVATAR ; +} void LLImagePreviewAvatar::setPreviewTarget(const std::string& joint_name, const std::string& mesh_name, LLImageRaw* imagep, F32 distance, BOOL male) { @@ -688,6 +723,9 @@ BOOL LLImagePreviewAvatar::render() mNeedsUpdate = FALSE; LLVOAvatar* avatarp = mDummyAvatar; + gGL.pushUIMatrix(); + gGL.loadUIIdentity(); + glMatrixMode(GL_PROJECTION); gGL.pushMatrix(); glLoadIdentity(); @@ -696,6 +734,7 @@ BOOL LLImagePreviewAvatar::render() glMatrixMode(GL_MODELVIEW); gGL.pushMatrix(); glLoadIdentity(); + LLGLSUIDefault def; gGL.color4f(0.15f, 0.2f, 0.3f, 1.f); @@ -741,6 +780,7 @@ BOOL LLImagePreviewAvatar::render() avatarPoolp->renderAvatars(avatarp); // renders only one avatar } + gGL.popUIMatrix(); gGL.color4f(1,1,1,1); return TRUE; } @@ -804,6 +844,11 @@ LLImagePreviewSculpted::~LLImagePreviewSculpted() { } +//virtual +S8 LLImagePreviewSculpted::getType() const +{ + return LLViewerDynamicTexture::LL_IMAGE_PREVIEW_SCULPTED ; +} void LLImagePreviewSculpted::setPreviewTarget(LLImageRaw* imagep, F32 distance) { diff --git a/indra/newview/llfloaterimagepreview.h b/indra/newview/llfloaterimagepreview.h index 4a12543650..3a7e1ff7d8 100644 --- a/indra/newview/llfloaterimagepreview.h +++ b/indra/newview/llfloaterimagepreview.h @@ -54,6 +54,8 @@ protected: public: LLImagePreviewSculpted(S32 width, S32 height); + /*virtual*/ S8 getType() const ; + void setPreviewTarget(LLImageRaw *imagep, F32 distance); void setTexture(U32 name) { mTextureName = name; } @@ -85,6 +87,8 @@ protected: public: LLImagePreviewAvatar(S32 width, S32 height); + /*virtual*/ S8 getType() const ; + void setPreviewTarget(const std::string& joint_name, const std::string& mesh_name, LLImageRaw* imagep, F32 distance, BOOL male); void setTexture(U32 name) { mTextureName = name; } void clearPreviewTexture(const std::string& mesh_name); @@ -139,7 +143,8 @@ protected: LLRect mPreviewRect; LLRectf mPreviewImageRect; LLPointer<LLViewerTexture> mImagep ; - + + std::string mImageLoadError; }; #endif // LL_LLFLOATERIMAGEPREVIEW_H diff --git a/indra/newview/llfloaterinventory.cpp b/indra/newview/llfloaterinventory.cpp index e62e2c99a7..4bffd41d29 100644 --- a/indra/newview/llfloaterinventory.cpp +++ b/indra/newview/llfloaterinventory.cpp @@ -34,13 +34,14 @@ #include "llfloaterinventory.h" -#include "llagent.h" +#include "llagentcamera.h" //#include "llfirstuse.h" #include "llfloaterreg.h" #include "llinventorymodel.h" #include "llpanelmaininventory.h" #include "llresmgr.h" #include "llviewerfoldertype.h" +#include "lltransientfloatermgr.h" ///---------------------------------------------------------------------------- /// LLFloaterInventory @@ -49,10 +50,12 @@ LLFloaterInventory::LLFloaterInventory(const LLSD& key) : LLFloater(key) { + LLTransientFloaterMgr::getInstance()->addControlView(this); } LLFloaterInventory::~LLFloaterInventory() { + LLTransientFloaterMgr::getInstance()->removeControlView(this); } BOOL LLFloaterInventory::postBuild() @@ -61,42 +64,6 @@ BOOL LLFloaterInventory::postBuild() return TRUE; } - -void LLFloaterInventory::draw() -{ - updateTitle(); - LLFloater::draw(); -} - -void LLFloaterInventory::updateTitle() -{ - LLLocale locale(LLLocale::USER_LOCALE); - std::string item_count_string; - LLResMgr::getInstance()->getIntegerString(item_count_string, gInventory.getItemCount()); - - LLStringUtil::format_map_t string_args; - string_args["[ITEM_COUNT]"] = item_count_string; - string_args["[FILTER]"] = mPanelMainInventory->getFilterText(); - - if (LLInventoryModel::backgroundFetchActive()) - { - setTitle(getString("TitleFetching", string_args)); - } - else if (LLInventoryModel::isEverythingFetched()) - { - setTitle(getString("TitleCompleted", string_args)); - } - else - { - setTitle(getString("Title")); - } -} - -void LLFloaterInventory::changed(U32 mask) -{ - updateTitle(); -} - LLInventoryPanel* LLFloaterInventory::getPanel() { if (mPanelMainInventory) @@ -112,7 +79,7 @@ LLFloaterInventory* LLFloaterInventory::showAgentInventory() instance_num = (instance_num + 1) % S32_MAX; LLFloaterInventory* iv = NULL; - if (!gAgent.cameraMouselook()) + if (!gAgentCamera.cameraMouselook()) { iv = LLFloaterReg::showTypedInstance<LLFloaterInventory>("inventory", LLSD(instance_num)); } diff --git a/indra/newview/llfloaterinventory.h b/indra/newview/llfloaterinventory.h index b661c391a7..dc719bdafe 100644 --- a/indra/newview/llfloaterinventory.h +++ b/indra/newview/llfloaterinventory.h @@ -63,13 +63,10 @@ public: static void cleanup(); // Inherited functionality - /*virtual*/ void changed(U32 mask); - /*virtual*/ void draw(); /*virtual*/ void onOpen(const LLSD& key); LLInventoryPanel* getPanel(); -protected: - void updateTitle(); + LLPanelMainInventory* getMainInventoryPanel() { return mPanelMainInventory;} private: LLPanelMainInventory* mPanelMainInventory; }; diff --git a/indra/newview/llfloaterlagmeter.cpp b/indra/newview/llfloaterlagmeter.cpp index 3753dcaaa8..100cbdb217 100644 --- a/indra/newview/llfloaterlagmeter.cpp +++ b/indra/newview/llfloaterlagmeter.cpp @@ -64,7 +64,7 @@ BOOL LLFloaterLagMeter::postBuild() setIsChrome(TRUE); // were we shrunk last time? - if (gSavedSettings.getBOOL("LagMeterShrunk")) + if (isShrunk()) { onClickShrink(); } @@ -122,6 +122,7 @@ BOOL LLFloaterLagMeter::postBuild() mStringArgs["[SERVER_FRAME_RATE_WARNING]"] = getString("server_frame_rate_warning_fps"); // childSetAction("minimize", onClickShrink, this); + updateControls(isShrunk()); // if expanded append colon to the labels (EXT-4079) return TRUE; } @@ -130,7 +131,7 @@ LLFloaterLagMeter::~LLFloaterLagMeter() // save shrunk status for next time // gSavedSettings.setBOOL("LagMeterShrunk", mShrunk); // expand so we save the large window rectangle - if (gSavedSettings.getBOOL("LagMeterShrunk")) + if (isShrunk()) { onClickShrink(); } @@ -205,7 +206,7 @@ void LLFloaterLagMeter::determineNetwork() // *FIXME: We can't blame a large ping time on anything in // particular if the frame rate is low, because a low frame - // rate is a sure recipe for crappy ping times right now until + // rate is a sure recipe for bad ping times right now until // the network handlers are de-synched from the rendering. F32 client_frame_time_ms = 1000.0f * LLViewerStats::getInstance()->mFPSStat.getMeanDuration(); @@ -312,17 +313,15 @@ void LLFloaterLagMeter::determineServer() } } - -void LLFloaterLagMeter::onClickShrink() // toggle "LagMeterShrunk" +void LLFloaterLagMeter::updateControls(bool shrink) { // LLFloaterLagMeter * self = (LLFloaterLagMeter*)data; LLButton * button = getChild<LLButton>("minimize"); S32 delta_width = mMaxWidth -mMinWidth; LLRect r = getRect(); - bool shrunk = gSavedSettings.getBOOL("LagMeterShrunk"); - if(shrunk) + if(!shrink) { setTitle(getString("max_title_msg", mStringArgs) ); // make left edge appear to expand @@ -368,5 +367,16 @@ void LLFloaterLagMeter::onClickShrink() // toggle "LagMeterShrunk" // self->childSetVisible("server_help", self->mShrunk); // self->mShrunk = !self->mShrunk; - gSavedSettings.setBOOL("LagMeterShrunk", !gSavedSettings.getBOOL("LagMeterShrunk")); +} + +BOOL LLFloaterLagMeter::isShrunk() +{ + return gSavedSettings.getBOOL("LagMeterShrunk"); +} + +void LLFloaterLagMeter::onClickShrink() // toggle "LagMeterShrunk" +{ + bool shrunk = isShrunk(); + updateControls(!shrunk); + gSavedSettings.setBOOL("LagMeterShrunk", !shrunk); } diff --git a/indra/newview/llfloaterlagmeter.h b/indra/newview/llfloaterlagmeter.h index 592630636a..5416bca790 100644 --- a/indra/newview/llfloaterlagmeter.h +++ b/indra/newview/llfloaterlagmeter.h @@ -51,6 +51,8 @@ private: void determineClient(); void determineNetwork(); void determineServer(); + void updateControls(bool shrink); + BOOL isShrunk(); void onClickShrink(); diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp index 8cd63deebe..7c5586ec96 100644 --- a/indra/newview/llfloaterland.cpp +++ b/indra/newview/llfloaterland.cpp @@ -42,7 +42,6 @@ #include "llnotificationsutil.h" #include "llparcel.h" #include "message.h" -#include "lluserauth.h" #include "llagent.h" #include "llbutton.h" @@ -86,10 +85,12 @@ static std::string OWNER_ONLINE = "0"; static std::string OWNER_OFFLINE = "1"; static std::string OWNER_GROUP = "2"; +static std::string MATURITY = "[MATURITY]"; // constants used in callbacks below - syntactic sugar. static const BOOL BUY_GROUP_LAND = TRUE; static const BOOL BUY_PERSONAL_LAND = FALSE; +LLPointer<LLParcelSelection> LLPanelLandGeneral::sSelectionForBuyPass = NULL; // Statics LLParcelSelectionObserver* LLFloaterLand::sObserver = NULL; @@ -102,6 +103,22 @@ public: virtual void changed() { LLFloaterLand::refreshAll(); } }; +// class needed to get full access to textbox inside checkbox, because LLCheckBoxCtrl::setLabel() has string as its argument. +// It was introduced while implementing EXT-4706 +class LLCheckBoxWithTBAcess : public LLCheckBoxCtrl +{ +public: + LLTextBox* getTextBox() + { + return mLabel; + } +}; + +// inserts maturity info(icon and text) into target textbox +// names_floater - pointer to floater which contains strings with maturity icons filenames +// str_to_parse is string in format "txt1[MATURITY]txt2" where maturity icon and text will be inserted instead of [MATURITY] +void insert_maturity_into_textbox(LLTextBox* target_textbox, LLFloater* names_floater, std::string str_to_parse); + //--------------------------------------------------------------------------- // LLFloaterLand //--------------------------------------------------------------------------- @@ -353,7 +370,7 @@ BOOL LLPanelLandGeneral::postBuild() { mEditName = getChild<LLLineEditor>("Name"); mEditName->setCommitCallback(onCommitAny, this); - childSetPrevalidate("Name", LLLineEditor::prevalidateASCIIPrintableNoPipe); + childSetPrevalidate("Name", LLTextValidate::validateASCIIPrintableNoPipe); mEditDesc = getChild<LLTextEditor>("Description"); mEditDesc->setCommitOnFocusLost(TRUE); @@ -554,8 +571,8 @@ void LLPanelLandGeneral::refresh() if (regionp) { - mContentRating->setText(regionp->getSimAccessString()); - mLandType->setText(regionp->getSimProductName()); + insert_maturity_into_textbox(mContentRating, gFloaterView->getParentFloater(this), MATURITY); + mLandType->setText(LLTrans::getString(regionp->getSimProductName())); } // estate owner/manager cannot edit other parts of the parcel @@ -629,9 +646,12 @@ void LLPanelLandGeneral::refresh() } // Display claim date - // *TODO:Localize (Time format may need Translating) time_t claim_date = parcel->getClaimDate(); - mTextClaimDate->setText(formatted_time(claim_date)); + std::string claim_date_str = getString("time_stamp_template"); + LLSD substitution; + substitution["datetime"] = (S32) claim_date; + LLStringUtil::format (claim_date_str, substitution); + mTextClaimDate->setText(claim_date_str); mTextClaimDate->setEnabled(is_leased); BOOL enable_auction = (gAgent.getGodLevel() >= GOD_LIAISON) @@ -787,7 +807,7 @@ void LLPanelLandGeneral::refreshNames() else { // Figure out the owner's name - owner = LLSLURL::buildCommand("agent", parcel->getOwnerID(), "inspect"); + owner = LLSLURL("agent", parcel->getOwnerID(), "inspect").getSLURLString(); } if(LLParcel::OS_LEASE_PENDING == parcel->getOwnershipStatus()) @@ -799,20 +819,23 @@ void LLPanelLandGeneral::refreshNames() std::string group; if (!parcel->getGroupID().isNull()) { - group = LLSLURL::buildCommand("group", parcel->getGroupID(), "inspect"); + group = LLSLURL("group", parcel->getGroupID(), "inspect").getSLURLString(); } mTextGroup->setText(group); - const LLUUID& auth_buyer_id = parcel->getAuthorizedBuyerID(); - if(auth_buyer_id.notNull()) - { - std::string name; - name = LLSLURL::buildCommand("agent", auth_buyer_id, "inspect"); - mSaleInfoForSale2->setTextArg("[BUYER]", name); - } - else + if (parcel->getForSale()) { - mSaleInfoForSale2->setTextArg("[BUYER]", getString("anyone")); + const LLUUID& auth_buyer_id = parcel->getAuthorizedBuyerID(); + if(auth_buyer_id.notNull()) + { + std::string name; + name = LLSLURL("agent", auth_buyer_id, "inspect").getSLURLString(); + mSaleInfoForSale2->setTextArg("[BUYER]", name); + } + else + { + mSaleInfoForSale2->setTextArg("[BUYER]", getString("anyone")); + } } } @@ -955,6 +978,8 @@ void LLPanelLandGeneral::onClickBuyPass(void* data) args["PARCEL_NAME"] = parcel_name; args["TIME"] = time; + // creating pointer on selection to avoid deselection of parcel until we are done with buying pass (EXT-6464) + sSelectionForBuyPass = LLViewerParcelMgr::getInstance()->getParcelSelection(); LLNotificationsUtil::add("LandBuyPass", args, LLSD(), cbBuyPass); } @@ -986,6 +1011,8 @@ bool LLPanelLandGeneral::cbBuyPass(const LLSD& notification, const LLSD& respons // User clicked OK LLViewerParcelMgr::getInstance()->buyPass(); } + // we are done with buying pass, additional selection is no longer needed + sSelectionForBuyPass = NULL; return false; } @@ -1111,7 +1138,7 @@ BOOL LLPanelLandObjects::postBuild() mCleanOtherObjectsTime->setFocusLostCallback(boost::bind(onLostFocus, _1, this)); mCleanOtherObjectsTime->setCommitCallback(onCommitClean, this); - childSetPrevalidate("clean other time", LLLineEditor::prevalidateNonNegativeS32); + childSetPrevalidate("clean other time", LLTextValidate::validateNonNegativeS32); mBtnRefresh = getChild<LLButton>("Refresh List"); mBtnRefresh->setClickedCallback(onClickRefresh, this); @@ -1592,7 +1619,7 @@ void LLPanelLandObjects::processParcelObjectOwnersReply(LLMessageSystem *msg, vo item_params.columns.add().value(object_count_str).font(FONT).column("count"); item_params.columns.add().value(LLDate((time_t)most_recent_time)).font(FONT).column("mostrecent").type("date"); - self->mOwnerList->addRow(item_params); + self->mOwnerList->addNameItemRow(item_params); lldebugs << "object owner " << owner_id << " (" << (is_group_owned ? "group" : "agent") << ") owns " << object_count << " objects." << llendl; @@ -2058,8 +2085,14 @@ void LLPanelLandOptions::refresh() { // not teen so fill in the data for the maturity control mMatureCtrl->setVisible(TRUE); - mMatureCtrl->setLabel(getString("mature_check_mature")); - mMatureCtrl->setToolTip(getString("mature_check_mature_tooltip")); + LLStyle::Params style; + style.image(LLUI::getUIImage(gFloaterView->getParentFloater(this)->getString("maturity_icon_moderate"))); + LLCheckBoxWithTBAcess* fullaccess_mature_ctrl = (LLCheckBoxWithTBAcess*)mMatureCtrl; + fullaccess_mature_ctrl->getTextBox()->setText(std::string("icon"),style); + fullaccess_mature_ctrl->getTextBox()->appendText(getString("mature_check_mature"), false); + fullaccess_mature_ctrl->setToolTip(getString("mature_check_mature_tooltip")); + fullaccess_mature_ctrl->reshape(fullaccess_mature_ctrl->getRect().getWidth(), fullaccess_mature_ctrl->getRect().getHeight(), FALSE); + // they can see the checkbox, but its disposition depends on the // state of the region LLViewerRegion* regionp = LLViewerParcelMgr::getInstance()->getSelectionRegion(); @@ -2460,19 +2493,26 @@ void LLPanelLandAccess::refresh() } } + LLCheckBoxWithTBAcess* maturity_checkbox = (LLCheckBoxWithTBAcess*) getChild<LLCheckBoxCtrl>( "public_access"); LLViewerRegion* region = LLViewerParcelMgr::getInstance()->getSelectionRegion(); if(region) { - std::string region_access = "("; - region_access += region->getSimAccessString(); - region_access += ")"; - childSetLabelArg( "public_access", "[MATURITY]", region_access ); + LLTextBox* maturity_textbox = maturity_checkbox->getTextBox(); + insert_maturity_into_textbox(maturity_textbox, gFloaterView->getParentFloater(this), getString("allow_public_access")); + maturity_checkbox->reshape(maturity_checkbox->getRect().getWidth(), maturity_checkbox->getRect().getHeight(), FALSE); } else { - childSetLabelArg( "public_access", "[MATURITY]", std::string() ); - } + std::string maturity_string = getString("allow_public_access"); + size_t maturity_pos = maturity_string.find(MATURITY); + if (maturity_pos != std::string::npos) + { + maturity_string.replace(maturity_pos, MATURITY.length(), std::string("")); + } + + maturity_checkbox->setLabel(maturity_string); + } if(parcel->getRegionDenyAnonymousOverride()) { @@ -2741,7 +2781,7 @@ void LLPanelLandAccess::onClickAddAccess() gFloaterView->getParentFloater(this)->addDependentFloater(LLFloaterAvatarPicker::show(boost::bind(&LLPanelLandAccess::callbackAvatarCBAccess, this, _1,_2)) ); } -void LLPanelLandAccess::callbackAvatarCBAccess(const std::vector<std::string>& names, const std::vector<LLUUID>& ids) +void LLPanelLandAccess::callbackAvatarCBAccess(const std::vector<std::string>& names, const uuid_vec_t& ids) { if (!names.empty() && !ids.empty()) { @@ -2786,7 +2826,7 @@ void LLPanelLandAccess::onClickAddBanned() } // static -void LLPanelLandAccess::callbackAvatarCBBanned(const std::vector<std::string>& names, const std::vector<LLUUID>& ids) +void LLPanelLandAccess::callbackAvatarCBBanned(const std::vector<std::string>& names, const uuid_vec_t& ids) { if (!names.empty() && !ids.empty()) { @@ -2858,7 +2898,7 @@ void LLPanelLandCovenant::refresh() LLTextBox* region_maturity = getChild<LLTextBox>("region_maturity_text"); if (region_maturity) { - region_maturity->setText(region->getSimAccessString()); + insert_maturity_into_textbox(region_maturity, gFloaterView->getParentFloater(this), MATURITY); } LLTextBox* resellable_clause = getChild<LLTextBox>("resellable_clause"); @@ -2939,3 +2979,51 @@ void LLPanelLandCovenant::updateEstateOwnerName(const std::string& name) if (editor) editor->setText(name); } } + +// inserts maturity info(icon and text) into target textbox +// names_floater - pointer to floater which contains strings with maturity icons filenames +// str_to_parse is string in format "txt1[MATURITY]txt2" where maturity icon and text will be inserted instead of [MATURITY] +void insert_maturity_into_textbox(LLTextBox* target_textbox, LLFloater* names_floater, std::string str_to_parse) +{ + LLViewerRegion* region = LLViewerParcelMgr::getInstance()->getSelectionRegion(); + if (!region) + return; + + LLStyle::Params style; + + U8 sim_access = region->getSimAccess(); + + switch(sim_access) + { + case SIM_ACCESS_PG: + style.image(LLUI::getUIImage(names_floater->getString("maturity_icon_general"))); + break; + + case SIM_ACCESS_ADULT: + style.image(LLUI::getUIImage(names_floater->getString("maturity_icon_adult"))); + break; + + case SIM_ACCESS_MATURE: + style.image(LLUI::getUIImage(names_floater->getString("maturity_icon_moderate"))); + break; + + default: + break; + } + + size_t maturity_pos = str_to_parse.find(MATURITY); + + if (maturity_pos == std::string::npos) + { + return; + } + + std::string text_before_rating = str_to_parse.substr(0, maturity_pos); + std::string text_after_rating = str_to_parse.substr(maturity_pos + MATURITY.length()); + + target_textbox->setText(text_before_rating); + // any text may be here instead of "icon" except "" + target_textbox->appendText(std::string("icon"), false, style); + target_textbox->appendText(LLViewerParcelMgr::getInstance()->getSelectionRegion()->getSimAccessString(), false); + target_textbox->appendText(text_after_rating, false); +} diff --git a/indra/newview/llfloaterland.h b/indra/newview/llfloaterland.h index a4785e8f5b..0a743e5215 100644 --- a/indra/newview/llfloaterland.h +++ b/indra/newview/llfloaterland.h @@ -167,7 +167,7 @@ public: static void onClickSet(void* data); static void onClickClear(void* data); static void onClickShow(void* data); - static void callbackAvatarPick(const std::vector<std::string>& names, const std::vector<LLUUID>& ids, void* data); + static void callbackAvatarPick(const std::vector<std::string>& names, const uuid_vec_t& ids, void* data); static void finalizeAvatarPick(void* data); static void callbackHighlightTransferable(S32 option, void* userdata); static void onClickStartAuction(void*); @@ -234,6 +234,11 @@ protected: LLSafeHandle<LLParcelSelection>& mParcel; + // This pointer is needed to avoid parcel deselection until buying pass is completed or canceled. + // Deselection happened because of zero references to parcel selection, which took place when + // "Buy Pass" was called from popup menu(EXT-6464) + static LLPointer<LLParcelSelection> sSelectionForBuyPass; + static LLHandle<LLFloater> sBuyPassDialogHandle; }; @@ -374,8 +379,8 @@ public: void onClickAddAccess(); void onClickAddBanned(); - void callbackAvatarCBBanned(const std::vector<std::string>& names, const std::vector<LLUUID>& ids); - void callbackAvatarCBAccess(const std::vector<std::string>& names, const std::vector<LLUUID>& ids); + void callbackAvatarCBBanned(const std::vector<std::string>& names, const uuid_vec_t& ids); + void callbackAvatarCBAccess(const std::vector<std::string>& names, const uuid_vec_t& ids); protected: LLNameListCtrl* mListAccess; diff --git a/indra/newview/llfloatermap.cpp b/indra/newview/llfloatermap.cpp index 051ab585e2..e74bfae026 100644 --- a/indra/newview/llfloatermap.cpp +++ b/indra/newview/llfloatermap.cpp @@ -41,7 +41,7 @@ #include "llglheaders.h" // Viewer includes -#include "llagent.h" +#include "llagentcamera.h" #include "llviewercontrol.h" #include "llnetmap.h" #include "lltracker.h" @@ -54,7 +54,10 @@ // Constants // const F32 MAP_MINOR_DIR_THRESHOLD = 0.08f; - +const S32 MAP_PADDING_LEFT = 0; +const S32 MAP_PADDING_TOP = 2; +const S32 MAP_PADDING_RIGHT = 2; +const S32 MAP_PADDING_BOTTOM = 0; // // Member functions // @@ -106,6 +109,9 @@ BOOL LLFloaterMap::postBuild() mPopupMenu->setItemEnabled ("Stop Tracking", false); } + stretchMiniMap(getRect().getWidth() - MAP_PADDING_LEFT - MAP_PADDING_RIGHT + ,getRect().getHeight() - MAP_PADDING_TOP - MAP_PADDING_BOTTOM); + updateMinorDirections(); // Get the drag handle all the way in back @@ -196,7 +202,7 @@ void LLFloaterMap::draw() setDirectionPos( mTextBoxSouthEast, rotation + F_PI + F_PI_BY_TWO + F_PI_BY_TWO / 2); // Note: we can't just gAgent.check cameraMouselook() because the transition states are wrong. - if( gAgent.cameraMouselook()) + if(gAgentCamera.cameraMouselook()) { setMouseOpaque(FALSE); getDragHandle()->setMouseOpaque(FALSE); @@ -215,9 +221,40 @@ void LLFloaterMap::draw() LLFloater::draw(); } +// virtual +void LLFloaterMap::onFocusReceived() +{ + setBackgroundOpaque(true); + LLPanel::onFocusReceived(); +} + +// virtual +void LLFloaterMap::onFocusLost() +{ + setBackgroundOpaque(false); + LLPanel::onFocusLost(); +} + +void LLFloaterMap::stretchMiniMap(S32 width,S32 height) +{ + //fix for ext-7112 + //by default ctrl can't overlap caption area + if(mMap) + { + LLRect map_rect; + map_rect.setLeftTopAndSize( MAP_PADDING_LEFT, getRect().getHeight() - MAP_PADDING_TOP, width, height); + mMap->reshape( width, height, 1); + mMap->setRect(map_rect); + } +} + void LLFloaterMap::reshape(S32 width, S32 height, BOOL called_from_parent) { LLFloater::reshape(width, height, called_from_parent); + + stretchMiniMap(width - MAP_PADDING_LEFT - MAP_PADDING_RIGHT + ,height - MAP_PADDING_TOP - MAP_PADDING_BOTTOM); + updateMinorDirections(); } diff --git a/indra/newview/llfloatermap.h b/indra/newview/llfloatermap.h index 6c9138c6a7..3c063adfb8 100644 --- a/indra/newview/llfloatermap.h +++ b/indra/newview/llfloatermap.h @@ -53,12 +53,16 @@ public: /*virtual*/ BOOL handleRightMouseDown( S32 x, S32 y, MASK mask ); /*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE); /*virtual*/ void draw(); + /*virtual*/ void onFocusLost(); + /*virtual*/ void onFocusReceived(); private: void handleZoom(const LLSD& userdata); void handleStopTracking (const LLSD& userdata); void setDirectionPos( LLTextBox* text_box, F32 rotation ); void updateMinorDirections(); + + void stretchMiniMap(S32 width,S32 height); LLMenuGL* mPopupMenu; diff --git a/indra/newview/llfloatermediasettings.cpp b/indra/newview/llfloatermediasettings.cpp index 7388f7ea3f..ee68faf84b 100644 --- a/indra/newview/llfloatermediasettings.cpp +++ b/indra/newview/llfloatermediasettings.cpp @@ -207,7 +207,7 @@ void LLFloaterMediaSettings::commitFields() if (hasFocus()) { LLUICtrl* cur_focus = dynamic_cast<LLUICtrl*>(gFocusMgr.getKeyboardFocus()); - if (cur_focus->acceptsTextInput()) + if (cur_focus && cur_focus->acceptsTextInput()) { cur_focus->onCommit(); }; @@ -242,6 +242,12 @@ void LLFloaterMediaSettings::onBtnApply( void* userdata ) sInstance->commitFields(); sInstance->apply(); + + sInstance->mInitialValues.clear(); + sInstance->mPanelMediaSettingsGeneral->getValues( sInstance->mInitialValues ); + sInstance->mPanelMediaSettingsSecurity->getValues( sInstance->mInitialValues ); + sInstance->mPanelMediaSettingsPermissions->getValues( sInstance->mInitialValues ); + } //////////////////////////////////////////////////////////////////////////////// diff --git a/indra/newview/llfloaternamedesc.cpp b/indra/newview/llfloaternamedesc.cpp index 810761e034..159ce41b79 100644 --- a/indra/newview/llfloaternamedesc.cpp +++ b/indra/newview/llfloaternamedesc.cpp @@ -111,7 +111,7 @@ BOOL LLFloaterNameDesc::postBuild() if (NameEditor) { NameEditor->setMaxTextLength(DB_INV_ITEM_NAME_STR_LEN); - NameEditor->setPrevalidate(&LLLineEditor::prevalidateASCIIPrintableNoPipe); + NameEditor->setPrevalidate(&LLTextValidate::validateASCIIPrintableNoPipe); } y -= llfloor(PREVIEW_LINE_HEIGHT * 1.2f); @@ -123,7 +123,7 @@ BOOL LLFloaterNameDesc::postBuild() if (DescEditor) { DescEditor->setMaxTextLength(DB_INV_ITEM_DESC_STR_LEN); - DescEditor->setPrevalidate(&LLLineEditor::prevalidateASCIIPrintableNoPipe); + DescEditor->setPrevalidate(&LLTextValidate::validateASCIIPrintableNoPipe); } y -= llfloor(PREVIEW_LINE_HEIGHT * 1.2f); diff --git a/indra/newview/llfloaternotificationsconsole.cpp b/indra/newview/llfloaternotificationsconsole.cpp index 90db8988b2..105d7f9201 100644 --- a/indra/newview/llfloaternotificationsconsole.cpp +++ b/indra/newview/llfloaternotificationsconsole.cpp @@ -112,10 +112,15 @@ void LLNotificationChannelPanel::onClickNotification(void* user_data) { LLNotificationChannelPanel* self = (LLNotificationChannelPanel*)user_data; if (!self) return; - void* data = self->getChild<LLScrollListCtrl>("notifications_list")->getFirstSelected()->getUserdata(); - if (data) + LLScrollListItem* firstselected = self->getChild<LLScrollListCtrl>("notifications_list")->getFirstSelected(); + llassert(firstselected); + if (firstselected) { - gFloaterView->getParentFloater(self)->addDependentFloater(new LLFloaterNotification((LLNotification*)data), TRUE); + void* data = firstselected->getUserdata(); + if (data) + { + gFloaterView->getParentFloater(self)->addDependentFloater(new LLFloaterNotification((LLNotification*)data), TRUE); + } } } @@ -124,10 +129,15 @@ void LLNotificationChannelPanel::onClickNotificationReject(void* user_data) { LLNotificationChannelPanel* self = (LLNotificationChannelPanel*)user_data; if (!self) return; - void* data = self->getChild<LLScrollListCtrl>("notification_rejects_list")->getFirstSelected()->getUserdata(); - if (data) + LLScrollListItem* firstselected = self->getChild<LLScrollListCtrl>("notification_rejects_list")->getFirstSelected(); + llassert(firstselected); + if (firstselected) { - gFloaterView->getParentFloater(self)->addDependentFloater(new LLFloaterNotification((LLNotification*)data), TRUE); + void* data = firstselected->getUserdata(); + if (data) + { + gFloaterView->getParentFloater(self)->addDependentFloater(new LLFloaterNotification((LLNotification*)data), TRUE); + } } } @@ -174,7 +184,7 @@ BOOL LLFloaterNotificationConsole::postBuild() addChannel("Ignore"); addChannel("Visible", true); // all the ones below attach to the Visible channel - addChannel("History"); + addChannel("Persistent"); addChannel("Alerts"); addChannel("AlertModal"); addChannel("Group Notifications"); @@ -200,7 +210,7 @@ void LLFloaterNotificationConsole::addChannel(const std::string& name, bool open { LLLayoutStack& stack = getChildRef<LLLayoutStack>("notification_channels"); LLNotificationChannelPanel* panelp = new LLNotificationChannelPanel(name); - stack.addPanel(panelp, 0, NOTIFICATION_PANEL_HEADER_HEIGHT, TRUE, TRUE, LLLayoutStack::ANIMATE); + stack.addPanel(panelp, 0, NOTIFICATION_PANEL_HEADER_HEIGHT, S32_MAX, S32_MAX, TRUE, TRUE, LLLayoutStack::ANIMATE); LLButton& header_button = panelp->getChildRef<LLButton>("header"); header_button.setToggleState(!open); diff --git a/indra/newview/llfloateropenobject.cpp b/indra/newview/llfloateropenobject.cpp index ec50ed596c..71bfae316a 100644 --- a/indra/newview/llfloateropenobject.cpp +++ b/indra/newview/llfloateropenobject.cpp @@ -121,12 +121,12 @@ void LLFloaterOpenObject::refresh() { // this folder is coming from an object, as there is only one folder in an object, the root, // we need to collect the entire contents and handle them as a group - InventoryObjectList inventory_objects; + LLInventoryObject::object_list_t inventory_objects; object->getInventoryContents(inventory_objects); if (!inventory_objects.empty()) { - for (InventoryObjectList::iterator it = inventory_objects.begin(); + for (LLInventoryObject::object_list_t::iterator it = inventory_objects.begin(); it != inventory_objects.end(); ++it) { diff --git a/indra/newview/llfloaterpay.cpp b/indra/newview/llfloaterpay.cpp index 00959322e5..51364594e4 100644 --- a/indra/newview/llfloaterpay.cpp +++ b/indra/newview/llfloaterpay.cpp @@ -204,7 +204,7 @@ BOOL LLFloaterPay::postBuild() getChild<LLLineEditor>("amount")->setKeystrokeCallback(&LLFloaterPay::onKeystroke, this); childSetText("amount", last_amount); - childSetPrevalidate("amount", LLLineEditor::prevalidateNonNegativeS32); + childSetPrevalidate("amount", LLTextValidate::validateNonNegativeS32); info = new LLGiveMoneyInfo(this, 0); mCallbackData.push_back(info); diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index 9d9fbacee3..f450b199c8 100644 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -107,10 +107,13 @@ #include "llpluginclassmedia.h" #include "llteleporthistorystorage.h" +#include "lllogininstance.h" // to check if logged in yet + const F32 MAX_USER_FAR_CLIP = 512.f; const F32 MIN_USER_FAR_CLIP = 64.f; -const S32 ASPECT_RATIO_STR_LEN = 100; +//control value for middle mouse as talk2push button +const static std::string MIDDLE_MOUSE_CV = "MiddleMouse"; class LLVoiceSetKeyDialog : public LLModalDialog { @@ -181,8 +184,6 @@ void LLVoiceSetKeyDialog::onCancel(void* user_data) // if creating/destroying these is too slow, we'll need to create // a static member and update all our static callbacks -void handleNameTagOptionChanged(const LLSD& newvalue); -viewer_media_t get_web_media(); bool callback_clear_browser_cache(const LLSD& notification, const LLSD& response); //bool callback_skip_dialogs(const LLSD& notification, const LLSD& response, LLFloaterPreference* floater); @@ -190,23 +191,14 @@ bool callback_clear_browser_cache(const LLSD& notification, const LLSD& response void fractionFromDecimal(F32 decimal_val, S32& numerator, S32& denominator); -viewer_media_t get_web_media() -{ - viewer_media_t media_source = LLViewerMedia::newMediaImpl(LLUUID::null); - media_source->initializeMedia("text/html"); - return media_source; -} - - bool callback_clear_browser_cache(const LLSD& notification, const LLSD& response) { S32 option = LLNotificationsUtil::getSelectedOption(notification, response); if ( option == 0 ) // YES { // clean web - viewer_media_t media_source = get_web_media(); - if (media_source && media_source->hasMedia()) - media_source->getMediaPlugin()->clear_cache(); + LLViewerMedia::clearAllCaches(); + LLViewerMedia::clearAllCookies(); // clean nav bar history LLNavigationBar::getInstance()->clearHistoryCache(); @@ -227,15 +219,6 @@ bool callback_clear_browser_cache(const LLSD& notification, const LLSD& response return false; } -void handleNameTagOptionChanged(const LLSD& newvalue) -{ - S32 name_tag_option = S32(newvalue); - if(name_tag_option==2) - { - gSavedSettings.setBOOL("SmallAvatarNames", TRUE); - } -} - /*bool callback_skip_dialogs(const LLSD& notification, const LLSD& response, LLFloaterPreference* floater) { S32 option = LLNotificationsUtil::getSelectedOption(notification, response); @@ -283,7 +266,6 @@ void fractionFromDecimal(F32 decimal_val, S32& numerator, S32& denominator) } // static std::string LLFloaterPreference::sSkin = ""; -F32 LLFloaterPreference::sAspectRatio = 0.0; ////////////////////////////////////////////// // LLFloaterPreference @@ -318,24 +300,17 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key) mCommitCallbackRegistrar.add("Pref.ClickEnablePopup", boost::bind(&LLFloaterPreference::onClickEnablePopup, this)); mCommitCallbackRegistrar.add("Pref.ClickDisablePopup", boost::bind(&LLFloaterPreference::onClickDisablePopup, this)); mCommitCallbackRegistrar.add("Pref.LogPath", boost::bind(&LLFloaterPreference::onClickLogPath, this)); - mCommitCallbackRegistrar.add("Pref.UpdateMeterText", boost::bind(&LLFloaterPreference::updateMeterText, this, _1)); mCommitCallbackRegistrar.add("Pref.HardwareSettings", boost::bind(&LLFloaterPreference::onOpenHardwareSettings, this)); mCommitCallbackRegistrar.add("Pref.HardwareDefaults", boost::bind(&LLFloaterPreference::setHardwareDefaults, this)); mCommitCallbackRegistrar.add("Pref.VertexShaderEnable", boost::bind(&LLFloaterPreference::onVertexShaderEnable, this)); mCommitCallbackRegistrar.add("Pref.WindowedMod", boost::bind(&LLFloaterPreference::onCommitWindowedMode, this)); mCommitCallbackRegistrar.add("Pref.UpdateSliderText", boost::bind(&LLFloaterPreference::onUpdateSliderText,this, _1,_2)); - mCommitCallbackRegistrar.add("Pref.AutoDetectAspect", boost::bind(&LLFloaterPreference::onCommitAutoDetectAspect, this)); - mCommitCallbackRegistrar.add("Pref.ParcelMediaAutoPlayEnable", boost::bind(&LLFloaterPreference::onCommitParcelMediaAutoPlayEnable, this)); - mCommitCallbackRegistrar.add("Pref.MediaEnabled", boost::bind(&LLFloaterPreference::onCommitMediaEnabled, this)); - mCommitCallbackRegistrar.add("Pref.MusicEnabled", boost::bind(&LLFloaterPreference::onCommitMusicEnabled, this)); - mCommitCallbackRegistrar.add("Pref.onSelectAspectRatio", boost::bind(&LLFloaterPreference::onKeystrokeAspectRatio, this)); mCommitCallbackRegistrar.add("Pref.QualityPerformance", boost::bind(&LLFloaterPreference::onChangeQuality, this, _2)); mCommitCallbackRegistrar.add("Pref.applyUIColor", boost::bind(&LLFloaterPreference::applyUIColor, this ,_1, _2)); mCommitCallbackRegistrar.add("Pref.getUIColor", boost::bind(&LLFloaterPreference::getUIColor, this ,_1, _2)); - + mCommitCallbackRegistrar.add("Pref.MaturitySettings", boost::bind(&LLFloaterPreference::onChangeMaturity, this)); + sSkin = gSavedSettings.getString("SkinCurrent"); - - gSavedSettings.getControl("AvatarNameTagMode")->getCommitSignal()->connect(boost::bind(&handleNameTagOptionChanged, _2)); } BOOL LLFloaterPreference::postBuild() @@ -344,27 +319,43 @@ BOOL LLFloaterPreference::postBuild() gSavedSettings.getControl("PlainTextChatHistory")->getSignal()->connect(boost::bind(&LLNearbyChat::processChatHistoryStyleUpdate, _2)); + gSavedSettings.getControl("ChatFontSize")->getSignal()->connect(boost::bind(&LLIMFloater::processChatHistoryStyleUpdate, _2)); + + gSavedSettings.getControl("ChatFontSize")->getSignal()->connect(boost::bind(&LLNearbyChat::processChatHistoryStyleUpdate, _2)); + LLTabContainer* tabcontainer = getChild<LLTabContainer>("pref core"); if (!tabcontainer->selectTab(gSavedSettings.getS32("LastPrefTab"))) tabcontainer->selectFirstTab(); - S32 show_avatar_nametag_options = gSavedSettings.getS32("AvatarNameTagMode"); - handleNameTagOptionChanged(LLSD(show_avatar_nametag_options)); std::string cache_location = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, ""); childSetText("cache_location", cache_location); + // if floater is opened before login set default localized busy message + if (LLStartUp::getStartupState() < STATE_STARTED) + { + gSavedPerAccountSettings.setString("BusyModeResponse", LLTrans::getString("BusyModeResponseDefault")); + } + return TRUE; } +void LLFloaterPreference::onBusyResponseChanged() +{ + // set "BusyResponseChanged" TRUE if user edited message differs from default, FALSE otherwise + if(LLTrans::getString("BusyModeResponseDefault") != getChild<LLUICtrl>("busy_response")->getValue().asString()) + { + gSavedPerAccountSettings.setBOOL("BusyResponseChanged", TRUE ); + } + else + { + gSavedPerAccountSettings.setBOOL("BusyResponseChanged", FALSE ); + } +} + LLFloaterPreference::~LLFloaterPreference() { // clean up user data - LLComboBox* ctrl_aspect_ratio = getChild<LLComboBox>( "aspect_ratio"); LLComboBox* ctrl_window_size = getChild<LLComboBox>("windowsize combo"); - for (S32 i = 0; i < ctrl_aspect_ratio->getItemCount(); i++) - { - ctrl_aspect_ratio->setCurrentByIndex(i); - } for (S32 i = 0; i < ctrl_window_size->getItemCount(); i++) { ctrl_window_size->setCurrentByIndex(i); @@ -435,17 +426,14 @@ void LLFloaterPreference::apply() std::string cache_location = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, ""); childSetText("cache_location", cache_location); - viewer_media_t media_source = get_web_media(); - if (media_source && media_source->hasMedia()) + LLViewerMedia::setCookiesEnabled(childGetValue("cookies_enabled")); + + if(hasChild("web_proxy_enabled") &&hasChild("web_proxy_editor") && hasChild("web_proxy_port")) { - media_source->getMediaPlugin()->enable_cookies(childGetValue("cookies_enabled")); - if(hasChild("web_proxy_enabled") &&hasChild("web_proxy_editor") && hasChild("web_proxy_port")) - { - bool proxy_enable = childGetValue("web_proxy_enabled"); - std::string proxy_address = childGetValue("web_proxy_editor"); - int proxy_port = childGetValue("web_proxy_port"); - media_source->getMediaPlugin()->proxy_setup(proxy_enable, proxy_address, proxy_port); - } + bool proxy_enable = childGetValue("web_proxy_enabled"); + std::string proxy_address = childGetValue("web_proxy_editor"); + int proxy_port = childGetValue("web_proxy_port"); + LLViewerMedia::setProxyConfig(proxy_enable, proxy_address, proxy_port); } // LLWString busy_response = utf8str_to_wstring(getChild<LLUICtrl>("busy_response")->getValue().asString()); @@ -477,8 +465,6 @@ void LLFloaterPreference::apply() gAgent.sendAgentUpdateUserInfo(new_im_via_email,mDirectoryVisibility); } } - - applyResolution(); } void LLFloaterPreference::cancel() @@ -514,40 +500,60 @@ void LLFloaterPreference::cancel() LLFloaterReg::hideInstance("pref_voicedevicesettings"); - gSavedSettings.setF32("FullScreenAspectRatio", sAspectRatio); - } void LLFloaterPreference::onOpen(const LLSD& key) { + // this variable and if that follows it are used to properly handle busy mode response message + static bool initialized = FALSE; + // if user is logged in and we haven't initialized busy_response yet, do it + if (!initialized && LLStartUp::getStartupState() == STATE_STARTED) + { + // Special approach is used for busy response localization, because "BusyModeResponse" is + // in non-localizable xml, and also because it may be changed by user and in this case it shouldn't be localized. + // To keep track of whether busy response is default or changed by user additional setting BusyResponseChanged + // was added into per account settings. + + // initialization should happen once,so setting variable to TRUE + initialized = TRUE; + // this connection is needed to properly set "BusyResponseChanged" setting when user makes changes in + // busy response message. + gSavedPerAccountSettings.getControl("BusyModeResponse")->getSignal()->connect(boost::bind(&LLFloaterPreference::onBusyResponseChanged, this)); + } gAgent.sendAgentUserInfoRequest(); /////////////////////////// From LLPanelGeneral ////////////////////////// // if we have no agent, we can't let them choose anything // if we have an agent, then we only let them choose if they have a choice bool can_choose_maturity = - gAgent.getID().notNull() && (gAgent.isMature() || gAgent.isGodlike()); + gAgent.getID().notNull() && + (gAgent.isMature() || gAgent.isGodlike()); LLComboBox* maturity_combo = getChild<LLComboBox>("maturity_desired_combobox"); if (can_choose_maturity) { // if they're not adult or a god, they shouldn't see the adult selection, so delete it - if (!gAgent.isAdult() && !gAgent.isGodlike()) + if (!gAgent.isAdult() && !gAgent.isGodlikeWithoutAdminMenuFakery()) { - // we're going to remove the adult entry from the combo. This obviously depends - // on the order of items in the XML file, but there doesn't seem to be a reasonable - // way to depend on the field in XML called 'name'. - maturity_combo->remove(0); + // we're going to remove the adult entry from the combo + LLScrollListCtrl* maturity_list = maturity_combo->findChild<LLScrollListCtrl>("ComboBox"); + if (maturity_list) + { + maturity_list->deleteItems(LLSD(SIM_ACCESS_ADULT)); + } } childSetVisible("maturity_desired_combobox", true); - childSetVisible("maturity_desired_textbox", false); + childSetVisible("maturity_desired_textbox", false); } else { childSetText("maturity_desired_textbox", maturity_combo->getSelectedItemLabel()); childSetVisible("maturity_desired_combobox", false); } + + // Display selected maturity icons. + onChangeMaturity(); // Enabled/disabled popups, might have been changed by user actions // while preferences floater was closed. @@ -567,6 +573,16 @@ void LLFloaterPreference::onVertexShaderEnable() refreshEnabledGraphics(); } +//static +void LLFloaterPreference::initBusyResponse() + { + if (!gSavedPerAccountSettings.getBOOL("BusyResponseChanged")) + { + //LLTrans::getString("BusyModeResponseDefault") is used here for localization (EXT-5885) + gSavedPerAccountSettings.setString("BusyModeResponse", LLTrans::getString("BusyModeResponseDefault")); + } + } + void LLFloaterPreference::setHardwareDefaults() { LLFeatureManager::getInstance()->applyRecommendedSettings(); @@ -602,7 +618,7 @@ void LLFloaterPreference::onBtnOK() if (hasFocus()) { LLUICtrl* cur_focus = dynamic_cast<LLUICtrl*>(gFocusMgr.getKeyboardFocus()); - if (cur_focus->acceptsTextInput()) + if (cur_focus && cur_focus->acceptsTextInput()) { cur_focus->onCommit(); } @@ -626,7 +642,7 @@ void LLFloaterPreference::onBtnOK() llinfos << "Can't close preferences!" << llendl; } - LLPanelLogin::refreshLocation( false ); + LLPanelLogin::updateLocationCombo( false ); } // static @@ -635,7 +651,7 @@ void LLFloaterPreference::onBtnApply( ) if (hasFocus()) { LLUICtrl* cur_focus = dynamic_cast<LLUICtrl*>(gFocusMgr.getKeyboardFocus()); - if (cur_focus->acceptsTextInput()) + if (cur_focus && cur_focus->acceptsTextInput()) { cur_focus->onCommit(); } @@ -643,7 +659,7 @@ void LLFloaterPreference::onBtnApply( ) apply(); saveSettings(); - LLPanelLogin::refreshLocation( false ); + LLPanelLogin::updateLocationCombo( false ); } // static @@ -652,7 +668,7 @@ void LLFloaterPreference::onBtnCancel() if (hasFocus()) { LLUICtrl* cur_focus = dynamic_cast<LLUICtrl*>(gFocusMgr.getKeyboardFocus()); - if (cur_focus->acceptsTextInput()) + if (cur_focus && cur_focus->acceptsTextInput()) { cur_focus->onCommit(); } @@ -678,7 +694,8 @@ void LLFloaterPreference::refreshEnabledGraphics() LLFloaterPreference* instance = LLFloaterReg::findTypedInstance<LLFloaterPreference>("preferences"); if(instance) { - instance->refreshEnabledState(); + instance->refresh(); + //instance->refreshEnabledState(); } LLFloaterHardwareSettings* hardware_settings = LLFloaterReg::getTypedInstance<LLFloaterHardwareSettings>("prefs_hardware_settings"); if (hardware_settings) @@ -687,21 +704,6 @@ void LLFloaterPreference::refreshEnabledGraphics() } } -void LLFloaterPreference::updateMeterText(LLUICtrl* ctrl) -{ - // get our UI widgets - LLSliderCtrl* slider = (LLSliderCtrl*) ctrl; - - LLTextBox* m1 = getChild<LLTextBox>("DrawDistanceMeterText1"); - LLTextBox* m2 = getChild<LLTextBox>("DrawDistanceMeterText2"); - - // toggle the two text boxes based on whether we have 1 or two digits - F32 val = slider->getValueF32(); - bool two_digits = val < 100; - m1->setVisible(two_digits); - m2->setVisible(!two_digits); -} - void LLFloaterPreference::onClickBrowserClearCache() { LLNotificationsUtil::add("ConfirmClearBrowserCache", LLSD(), LLSD(), callback_clear_browser_cache); @@ -901,6 +903,8 @@ void LLFloaterPreference::refreshEnabledState() ctrl_wind_light->setEnabled(ctrl_shader_enable->getEnabled() && shaders); // now turn off any features that are unavailable disableUnavailableSettings(); + + childSetEnabled ("block_list", LLLoginInstance::getInstance()->authSuccess()); } void LLFloaterPreference::disableUnavailableSettings() @@ -968,60 +972,6 @@ void LLFloaterPreference::disableUnavailableSettings() } } -void LLFloaterPreference::onCommitAutoDetectAspect() -{ - BOOL auto_detect = getChild<LLCheckBoxCtrl>("aspect_auto_detect")->get(); - F32 ratio; - - if (auto_detect) - { - S32 numerator = 0; - S32 denominator = 0; - - // clear any aspect ratio override - gViewerWindow->mWindow->setNativeAspectRatio(0.f); - fractionFromDecimal(gViewerWindow->mWindow->getNativeAspectRatio(), numerator, denominator); - - std::string aspect; - if (numerator != 0) - { - aspect = llformat("%d:%d", numerator, denominator); - } - else - { - aspect = llformat("%.3f", gViewerWindow->mWindow->getNativeAspectRatio()); - } - - getChild<LLComboBox>( "aspect_ratio")->setLabel(aspect); - - ratio = gViewerWindow->mWindow->getNativeAspectRatio(); - gSavedSettings.setF32("FullScreenAspectRatio", ratio); - } -} - -void LLFloaterPreference::onCommitParcelMediaAutoPlayEnable() -{ - BOOL autoplay = getChild<LLCheckBoxCtrl>("autoplay_enabled")->get(); - - gSavedSettings.setBOOL(LLViewerMedia::AUTO_PLAY_MEDIA_SETTING, autoplay); - - lldebugs << "autoplay now = " << int(autoplay) << llendl; -} - -void LLFloaterPreference::onCommitMediaEnabled() -{ - LLCheckBoxCtrl *media_enabled_ctrl = getChild<LLCheckBoxCtrl>("media_enabled"); - bool enabled = media_enabled_ctrl->get(); - gSavedSettings.setBOOL("AudioStreamingMedia", enabled); -} - -void LLFloaterPreference::onCommitMusicEnabled() -{ - LLCheckBoxCtrl *music_enabled_ctrl = getChild<LLCheckBoxCtrl>("music_enabled"); - bool enabled = music_enabled_ctrl->get(); - gSavedSettings.setBOOL("AudioStreamingMusic", enabled); -} - void LLFloaterPreference::refresh() { LLPanel::refresh(); @@ -1053,17 +1003,6 @@ void LLFloaterPreference::onChangeQuality(const LLSD& data) refresh(); } -// static -// DEV-24146 - needs to be removed at a later date. jan-2009 -void LLFloaterPreference::cleanupBadSetting() -{ - if (gSavedPerAccountSettings.getString("BusyModeResponse2") == "|TOKEN COPY BusyModeResponse|") - { - llwarns << "cleaning old BusyModeResponse" << llendl; - gSavedPerAccountSettings.setString("BusyModeResponse2", gSavedPerAccountSettings.getText("BusyModeResponse")); - } -} - void LLFloaterPreference::onClickSetKey() { LLVoiceSetKeyDialog* dialog = LLFloaterReg::showTypedInstance<LLVoiceSetKeyDialog>("voice_set_key", LLSD(), TRUE); @@ -1082,9 +1021,17 @@ void LLFloaterPreference::setKey(KEY key) void LLFloaterPreference::onClickSetMiddleMouse() { - childSetValue("modifier_combo", "MiddleMouse"); + LLUICtrl* p2t_line_editor = getChild<LLUICtrl>("modifier_combo"); + // update the control right away since we no longer wait for apply - getChild<LLUICtrl>("modifier_combo")->onCommit(); + p2t_line_editor->setControlValue(MIDDLE_MOUSE_CV); + + //push2talk button "middle mouse" control value is in English, need to localize it for presentation + LLPanel* advanced_preferences = dynamic_cast<LLPanel*>(p2t_line_editor->getParent()); + if (advanced_preferences) + { + p2t_line_editor->setValue(advanced_preferences->getString("middle_mouse")); + } } /* void LLFloaterPreference::onClickSkipDialogs() @@ -1167,10 +1114,8 @@ void LLFloaterPreference::onClickLogPath() { return; //Canceled! } - std::string chat_log_dir = picker.getDirName(); - std::string chat_log_top_folder= gDirUtilp->getBaseFileName(chat_log_dir); - gSavedPerAccountSettings.setString("InstantMessageLogPath",chat_log_dir); - gSavedPerAccountSettings.setString("InstantMessageLogFolder",chat_log_top_folder); + + gSavedPerAccountSettings.setString("InstantMessageLogPath", picker.getDirName()); } void LLFloaterPreference::setPersonalInfo(const std::string& visibility, bool im_via_email, const std::string& email) @@ -1266,79 +1211,19 @@ void LLFloaterPreference::updateSliderText(LLSliderCtrl* ctrl, LLTextBox* text_b } } -void LLFloaterPreference::onKeystrokeAspectRatio() +void LLFloaterPreference::onChangeMaturity() { - getChild<LLCheckBoxCtrl>("aspect_auto_detect")->set(FALSE); -} + U8 sim_access = gSavedSettings.getU32("PreferredMaturity"); -void LLFloaterPreference::applyResolution() -{ - LLComboBox* ctrl_aspect_ratio = getChild<LLComboBox>( "aspect_ratio"); - gGL.flush(); - char aspect_ratio_text[ASPECT_RATIO_STR_LEN]; /*Flawfinder: ignore*/ - if (ctrl_aspect_ratio->getCurrentIndex() == -1) - { - // *Can't pass const char* from c_str() into strtok - strncpy(aspect_ratio_text, ctrl_aspect_ratio->getSimple().c_str(), sizeof(aspect_ratio_text) -1); /*Flawfinder: ignore*/ - aspect_ratio_text[sizeof(aspect_ratio_text) -1] = '\0'; - char *element = strtok(aspect_ratio_text, ":/\\"); - if (!element) - { - sAspectRatio = 0.f; // will be clamped later - } - else - { - LLLocale locale(LLLocale::USER_LOCALE); - sAspectRatio = (F32)atof(element); - } - - // look for denominator - element = strtok(NULL, ":/\\"); - if (element) - { - LLLocale locale(LLLocale::USER_LOCALE); - - F32 denominator = (F32)atof(element); - if (denominator != 0.f) - { - sAspectRatio /= denominator; - } - } - } - else - { - sAspectRatio = (F32)ctrl_aspect_ratio->getValue().asReal(); - } - - // presumably, user entered a non-numeric value if aspect_ratio == 0.f - if (sAspectRatio != 0.f) - { - sAspectRatio = llclamp(sAspectRatio, 0.2f, 5.f); - gSavedSettings.setF32("FullScreenAspectRatio", sAspectRatio); - } - - // Screen resolution - S32 num_resolutions; - LLWindow::LLWindowResolution* supported_resolutions = - gViewerWindow->getWindow()->getSupportedResolutions(num_resolutions); - S32 resIndex = getChild<LLComboBox>("fullscreen combo")->getCurrentIndex(); - if (resIndex == -1) - { - // use highest resolution if nothing selected - resIndex = num_resolutions - 1; - } - gSavedSettings.setS32("FullScreenWidth", supported_resolutions[resIndex].mWidth); - gSavedSettings.setS32("FullScreenHeight", supported_resolutions[resIndex].mHeight); - - gViewerWindow->requestResolutionUpdate(gSavedSettings.getBOOL("WindowFullScreen")); - - send_agent_update(TRUE); - - // Update enable/disable - refresh(); -} + getChild<LLIconCtrl>("rating_icon_general")->setVisible(sim_access == SIM_ACCESS_PG + || sim_access == SIM_ACCESS_MATURE + || sim_access == SIM_ACCESS_ADULT); + getChild<LLIconCtrl>("rating_icon_moderate")->setVisible(sim_access == SIM_ACCESS_MATURE + || sim_access == SIM_ACCESS_ADULT); + getChild<LLIconCtrl>("rating_icon_adult")->setVisible(sim_access == SIM_ACCESS_ADULT); +} void LLFloaterPreference::applyUIColor(LLUICtrl* ctrl, const LLSD& param) @@ -1393,54 +1278,12 @@ BOOL LLPanelPreference::postBuild() childSetText("email_address",getString("log_in_to_change") ); // childSetText("busy_response", getString("log_in_to_change")); } - - - if(hasChild("aspect_ratio")) - { - // We used to set up fullscreen resolution and window size - // controls here, see LLFloaterWindowSize::initWindowSizeControls() - - if (gSavedSettings.getBOOL("FullScreenAutoDetectAspectRatio")) - { - LLFloaterPreference::sAspectRatio = gViewerWindow->getDisplayAspectRatio(); - } - else - { - LLFloaterPreference::sAspectRatio = gSavedSettings.getF32("FullScreenAspectRatio"); - } - - getChild<LLComboBox>("aspect_ratio")->setTextEntryCallback(boost::bind(&LLPanelPreference::setControlFalse, this, LLSD("FullScreenAutoDetectAspectRatio") )); - - - S32 numerator = 0; - S32 denominator = 0; - fractionFromDecimal(LLFloaterPreference::sAspectRatio, numerator, denominator); - - LLUIString aspect_ratio_text = getString("aspect_ratio_text"); - if (numerator != 0) - { - aspect_ratio_text.setArg("[NUM]", llformat("%d", numerator)); - aspect_ratio_text.setArg("[DEN]", llformat("%d", denominator)); - } - else - { - aspect_ratio_text = llformat("%.3f", LLFloaterPreference::sAspectRatio); - } - - LLComboBox* ctrl_aspect_ratio = getChild<LLComboBox>( "aspect_ratio"); - //mCtrlAspectRatio->setCommitCallback(onSelectAspectRatio, this); - // add default aspect ratios - ctrl_aspect_ratio->add(aspect_ratio_text, &LLFloaterPreference::sAspectRatio, ADD_TOP); - ctrl_aspect_ratio->setCurrentByIndex(0); - - refresh(); - } //////////////////////PanelPrivacy /////////////////// if (hasChild("media_enabled")) { bool media_enabled = gSavedSettings.getBOOL("AudioStreamingMedia"); - getChild<LLCheckBoxCtrl>("voice_call_friends_only_check")->setCommitCallback(boost::bind(&showFriendsOnlyWarning, _1, _2)); + getChild<LLCheckBoxCtrl>("media_enabled")->set(media_enabled); getChild<LLCheckBoxCtrl>("autoplay_enabled")->setEnabled(media_enabled); } @@ -1448,7 +1291,21 @@ BOOL LLPanelPreference::postBuild() { getChild<LLCheckBoxCtrl>("music_enabled")->set(gSavedSettings.getBOOL("AudioStreamingMusic")); } - + if (hasChild("voice_call_friends_only_check")) + { + getChild<LLCheckBoxCtrl>("voice_call_friends_only_check")->setCommitCallback(boost::bind(&showFriendsOnlyWarning, _1, _2)); + } + + // Panel Advanced + if (hasChild("modifier_combo")) + { + //localizing if push2talk button is set to middle mouse + if (MIDDLE_MOUSE_CV == childGetValue("modifier_combo").asString()) + { + childSetValue("modifier_combo", getString("middle_mouse")); + } + } + apply(); return true; } diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h index 0827c7c2b2..b45e09db7d 100644 --- a/indra/newview/llfloaterpreference.h +++ b/indra/newview/llfloaterpreference.h @@ -80,6 +80,9 @@ public: // refresh all the graphics preferences menus static void refreshEnabledGraphics(); + // translate user's busy response message according to current locale if message is default, otherwise do nothing + static void initBusyResponse(); + protected: void onBtnOK(); void onBtnCancel(); @@ -87,6 +90,9 @@ protected: void onClickBrowserClearCache(); + // set value of "BusyResponseChanged" in account settings depending on whether busy response + // string differs from default after user changes. + void onBusyResponseChanged(); // if the custom settings box is clicked void onChangeCustom(); void updateMeterText(LLUICtrl* ctrl); @@ -128,21 +134,18 @@ public: void updateSliderText(LLSliderCtrl* ctrl, LLTextBox* text_box); void onUpdateSliderText(LLUICtrl* ctrl, const LLSD& name); - void onKeystrokeAspectRatio(); // void fractionFromDecimal(F32 decimal_val, S32& numerator, S32& denominator); - void onCommitAutoDetectAspect(); void onCommitParcelMediaAutoPlayEnable(); void onCommitMediaEnabled(); void onCommitMusicEnabled(); void applyResolution(); + void onChangeMaturity(); void applyUIColor(LLUICtrl* ctrl, const LLSD& param); - void getUIColor(LLUICtrl* ctrl, const LLSD& param); + void getUIColor(LLUICtrl* ctrl, const LLSD& param); void buildPopupLists(); static void refreshSkin(void* data); - static void cleanupBadSetting(); - static F32 sAspectRatio; private: static std::string sSkin; bool mGotPersonalInfo; diff --git a/indra/newview/llfloaterproperties.cpp b/indra/newview/llfloaterproperties.cpp index ff9002787c..30b654de24 100644 --- a/indra/newview/llfloaterproperties.cpp +++ b/indra/newview/llfloaterproperties.cpp @@ -38,12 +38,12 @@ #include "llcachename.h" #include "lldbstrings.h" #include "llfloaterreg.h" -#include "llinventory.h" #include "llagent.h" #include "llbutton.h" #include "llcheckboxctrl.h" #include "llavataractions.h" +#include "llinventorydefines.h" #include "llinventoryobserver.h" #include "llinventorymodel.h" #include "lllineeditor.h" @@ -130,9 +130,9 @@ BOOL LLFloaterProperties::postBuild() { // build the UI // item name & description - childSetPrevalidate("LabelItemName",&LLLineEditor::prevalidateASCIIPrintableNoPipe); + childSetPrevalidate("LabelItemName",&LLTextValidate::validateASCIIPrintableNoPipe); getChild<LLUICtrl>("LabelItemName")->setCommitCallback(boost::bind(&LLFloaterProperties::onCommitName,this)); - childSetPrevalidate("LabelItemDesc",&LLLineEditor::prevalidateASCIIPrintableNoPipe); + childSetPrevalidate("LabelItemDesc",&LLTextValidate::validateASCIIPrintableNoPipe); getChild<LLUICtrl>("LabelItemDesc")->setCommitCallback(boost::bind(&LLFloaterProperties:: onCommitDescription, this)); // Creator information getChild<LLUICtrl>("BtnCreator")->setCommitCallback(boost::bind(&LLFloaterProperties::onClickCreator,this)); @@ -237,7 +237,7 @@ void LLFloaterProperties::refreshFromItem(LLInventoryItem* item) // do not enable the UI for incomplete items. LLViewerInventoryItem* i = (LLViewerInventoryItem*)item; - BOOL is_complete = i->isComplete(); + BOOL is_complete = i->isFinished(); const BOOL cannot_restrict_permissions = LLInventoryType::cannotRestrictPermissions(i->getInventoryType()); const BOOL is_calling_card = (i->getInventoryType() == LLInventoryType::IT_CALLINGCARD); const LLPermissions& perm = item->getPermissions(); @@ -380,9 +380,9 @@ void LLFloaterProperties::refreshFromItem(LLInventoryItem* item) if (item->getType() == LLAssetType::AT_OBJECT) { U32 flags = item->getFlags(); - slam_perm = flags & LLInventoryItem::II_FLAGS_OBJECT_SLAM_PERM; - overwrite_everyone = flags & LLInventoryItem::II_FLAGS_OBJECT_PERM_OVERWRITE_EVERYONE; - overwrite_group = flags & LLInventoryItem::II_FLAGS_OBJECT_PERM_OVERWRITE_GROUP; + slam_perm = flags & LLInventoryItemFlags::II_FLAGS_OBJECT_SLAM_PERM; + overwrite_everyone = flags & LLInventoryItemFlags::II_FLAGS_OBJECT_PERM_OVERWRITE_EVERYONE; + overwrite_group = flags & LLInventoryItemFlags::II_FLAGS_OBJECT_PERM_OVERWRITE_GROUP; } std::string perm_string; @@ -683,7 +683,7 @@ void LLFloaterProperties::onCommitPermissions() CheckNextOwnerTransfer->get(), PERM_TRANSFER); } if(perm != item->getPermissions() - && item->isComplete()) + && item->isFinished()) { LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item); new_item->setPermissions(perm); @@ -693,7 +693,7 @@ void LLFloaterProperties::onCommitPermissions() if((perm.getMaskNextOwner()!=item->getPermissions().getMaskNextOwner()) && (item->getType() == LLAssetType::AT_OBJECT)) { - flags |= LLInventoryItem::II_FLAGS_OBJECT_SLAM_PERM; + flags |= LLInventoryItemFlags::II_FLAGS_OBJECT_SLAM_PERM; } // If everyone permissions have changed (and this is an object) // then set the overwrite everyone permissions flag so they @@ -701,7 +701,7 @@ void LLFloaterProperties::onCommitPermissions() if ((perm.getMaskEveryone()!=item->getPermissions().getMaskEveryone()) && (item->getType() == LLAssetType::AT_OBJECT)) { - flags |= LLInventoryItem::II_FLAGS_OBJECT_PERM_OVERWRITE_EVERYONE; + flags |= LLInventoryItemFlags::II_FLAGS_OBJECT_PERM_OVERWRITE_EVERYONE; } // If group permissions have changed (and this is an object) // then set the overwrite group permissions flag so they @@ -709,7 +709,7 @@ void LLFloaterProperties::onCommitPermissions() if ((perm.getMaskGroup()!=item->getPermissions().getMaskGroup()) && (item->getType() == LLAssetType::AT_OBJECT)) { - flags |= LLInventoryItem::II_FLAGS_OBJECT_PERM_OVERWRITE_GROUP; + flags |= LLInventoryItemFlags::II_FLAGS_OBJECT_PERM_OVERWRITE_GROUP; } new_item->setFlags(flags); if(mObjectID.isNull()) @@ -813,7 +813,7 @@ void LLFloaterProperties::updateSaleInfo() sale_info.setSaleType(LLSaleInfo::FS_NOT); } if(sale_info != item->getSaleInfo() - && item->isComplete()) + && item->isFinished()) { LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item); @@ -821,7 +821,7 @@ void LLFloaterProperties::updateSaleInfo() if (item->getType() == LLAssetType::AT_OBJECT) { U32 flags = new_item->getFlags(); - flags |= LLInventoryItem::II_FLAGS_OBJECT_SLAM_SALE; + flags |= LLInventoryItemFlags::II_FLAGS_OBJECT_SLAM_SALE; new_item->setFlags(flags); } @@ -880,7 +880,11 @@ void LLFloaterProperties::dirtyAll() iter != inst_list.end(); ++iter) { LLFloaterProperties* floater = dynamic_cast<LLFloaterProperties*>(*iter); - floater->dirty(); + llassert(floater); // else cast failed - wrong type D: + if (floater) + { + floater->dirty(); + } } } diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp index d54736e942..8c219cb3fd 100644 --- a/indra/newview/llfloaterregioninfo.cpp +++ b/indra/newview/llfloaterregioninfo.cpp @@ -610,7 +610,7 @@ void LLPanelRegionGeneralInfo::onClickKick() parent_floater->addDependentFloater(child_floater); } -void LLPanelRegionGeneralInfo::onKickCommit(const std::vector<std::string>& names, const std::vector<LLUUID>& ids) +void LLPanelRegionGeneralInfo::onKickCommit(const std::vector<std::string>& names, const uuid_vec_t& ids) { if (names.empty() || ids.empty()) return; if(ids[0].notNull()) @@ -848,7 +848,7 @@ void LLPanelRegionDebugInfo::onClickChooseAvatar() } -void LLPanelRegionDebugInfo::callbackAvatarID(const std::vector<std::string>& names, const std::vector<LLUUID>& ids) +void LLPanelRegionDebugInfo::callbackAvatarID(const std::vector<std::string>& names, const uuid_vec_t& ids) { if (ids.empty() || names.empty()) return; mTargetAvatar = ids[0]; @@ -1531,7 +1531,7 @@ void LLPanelEstateInfo::onClickKickUser() parent_floater->addDependentFloater(child_floater); } -void LLPanelEstateInfo::onKickUserCommit(const std::vector<std::string>& names, const std::vector<LLUUID>& ids) +void LLPanelEstateInfo::onKickUserCommit(const std::vector<std::string>& names, const uuid_vec_t& ids) { if (names.empty() || ids.empty()) return; @@ -1616,7 +1616,6 @@ bool LLPanelEstateInfo::isLindenEstate() return (estate_id <= ESTATE_LAST_LINDEN); } -typedef std::vector<LLUUID> AgentOrGroupIDsVector; struct LLEstateAccessChangeInfo { LLEstateAccessChangeInfo(const LLSD& sd) @@ -1637,7 +1636,7 @@ struct LLEstateAccessChangeInfo LLSD sd; sd["name"] = mDialogName; sd["operation"] = (S32)mOperationFlag; - for (AgentOrGroupIDsVector::const_iterator it = mAgentOrGroupIDs.begin(); + for (uuid_vec_t::const_iterator it = mAgentOrGroupIDs.begin(); it != mAgentOrGroupIDs.end(); ++it) { @@ -1648,7 +1647,7 @@ struct LLEstateAccessChangeInfo U32 mOperationFlag; // ESTATE_ACCESS_BANNED_AGENT_ADD, _REMOVE, etc. std::string mDialogName; - AgentOrGroupIDsVector mAgentOrGroupIDs; // List of agent IDs to apply to this change + uuid_vec_t mAgentOrGroupIDs; // List of agent IDs to apply to this change }; // Special case callback for groups, since it has different callback format than names @@ -1716,7 +1715,7 @@ bool LLPanelEstateInfo::accessAddCore2(const LLSD& notification, const LLSD& res } // static -void LLPanelEstateInfo::accessAddCore3(const std::vector<std::string>& names, const std::vector<LLUUID>& ids, void* data) +void LLPanelEstateInfo::accessAddCore3(const std::vector<std::string>& names, const uuid_vec_t& ids, void* data) { LLEstateAccessChangeInfo* change_info = (LLEstateAccessChangeInfo*)data; if (!change_info) return; @@ -2923,8 +2922,7 @@ bool LLDispatchEstateUpdateInfo::operator()( LLUUID owner_id(strings[1]); regionp->setOwner(owner_id); // Update estate owner name in UI - std::string owner_name = - LLSLURL::buildCommand("agent", owner_id, "inspect"); + std::string owner_name = LLSLURL("agent", owner_id, "inspect").getSLURLString(); panel->setOwnerName(owner_name); U32 estate_id = strtoul(strings[2].c_str(), NULL, 10); diff --git a/indra/newview/llfloaterregioninfo.h b/indra/newview/llfloaterregioninfo.h index 8d315bdb78..482ebb3303 100644 --- a/indra/newview/llfloaterregioninfo.h +++ b/indra/newview/llfloaterregioninfo.h @@ -168,7 +168,7 @@ public: protected: virtual BOOL sendUpdate(); void onClickKick(); - void onKickCommit(const std::vector<std::string>& names, const std::vector<LLUUID>& ids); + void onKickCommit(const std::vector<std::string>& names, const uuid_vec_t& ids); static void onClickKickAll(void* userdata); bool onKickAllCommit(const LLSD& notification, const LLSD& response); static void onClickMessage(void* userdata); @@ -193,7 +193,7 @@ protected: virtual BOOL sendUpdate(); void onClickChooseAvatar(); - void callbackAvatarID(const std::vector<std::string>& names, const std::vector<LLUUID>& ids); + void callbackAvatarID(const std::vector<std::string>& names, const uuid_vec_t& ids); static void onClickReturn(void *); bool callbackReturn(const LLSD& notification, const LLSD& response); static void onClickTopColliders(void*); @@ -284,7 +284,7 @@ public: // Core methods for all above add/remove button clicks static void accessAddCore(U32 operation_flag, const std::string& dialog_name); static bool accessAddCore2(const LLSD& notification, const LLSD& response); - static void accessAddCore3(const std::vector<std::string>& names, const std::vector<LLUUID>& ids, void* data); + static void accessAddCore3(const std::vector<std::string>& names, const uuid_vec_t& ids, void* data); static void accessRemoveCore(U32 operation_flag, const std::string& dialog_name, const std::string& list_ctrl_name); static bool accessRemoveCore2(const LLSD& notification, const LLSD& response); @@ -296,7 +296,7 @@ public: // Send the actual EstateOwnerRequest "estateaccessdelta" message static void sendEstateAccessDelta(U32 flags, const LLUUID& agent_id); - void onKickUserCommit(const std::vector<std::string>& names, const std::vector<LLUUID>& ids); + void onKickUserCommit(const std::vector<std::string>& names, const uuid_vec_t& ids); static void onClickMessageEstate(void* data); bool onMessageCommit(const LLSD& notification, const LLSD& response); diff --git a/indra/newview/llfloaterreporter.cpp b/indra/newview/llfloaterreporter.cpp index 0f3c176cea..f7c8855bf6 100644 --- a/indra/newview/llfloaterreporter.cpp +++ b/indra/newview/llfloaterreporter.cpp @@ -84,6 +84,8 @@ #include "llassetuploadresponders.h" #include "llagentui.h" +#include "lltrans.h" + const U32 INCLUDE_SCREENSHOT = 0x01 << 0; //----------------------------------------------------------------------------- @@ -124,7 +126,9 @@ void LLFloaterReporter::processRegionInfo(LLMessageSystem* msg) // virtual BOOL LLFloaterReporter::postBuild() { - childSetText("abuse_location_edit", LLAgentUI::buildSLURL()); + LLSLURL slurl; + LLAgentUI::buildSLURL(slurl); + childSetText("abuse_location_edit", slurl.getSLURLString()); enableControls(TRUE); @@ -278,7 +282,6 @@ void LLFloaterReporter::getObjectInfo(const LLUUID& object_id) { object_owner.append("Unknown"); } - setFromAvatar(mObjectID, object_owner); } else @@ -306,7 +309,7 @@ void LLFloaterReporter::onClickSelectAbuser() gFloaterView->getParentFloater(this)->addDependentFloater(LLFloaterAvatarPicker::show(boost::bind(&LLFloaterReporter::callbackAvatarID, this, _1, _2), FALSE, TRUE )); } -void LLFloaterReporter::callbackAvatarID(const std::vector<std::string>& names, const std::vector<LLUUID>& ids) +void LLFloaterReporter::callbackAvatarID(const std::vector<std::string>& names, const uuid_vec_t& ids) { if (ids.empty() || names.empty()) return; @@ -323,7 +326,8 @@ void LLFloaterReporter::setFromAvatar(const LLUUID& avatar_id, const std::string mAbuserID = mObjectID = avatar_id; mOwnerName = avatar_name; - std::string avatar_link = LLSLURL::buildCommand("agent", mObjectID, "inspect"); + std::string avatar_link = + LLSLURL("agent", mObjectID, "inspect").getSLURLString(); childSetText("owner_name", avatar_link); childSetText("object_name", avatar_name); childSetText("abuser_name_edit", avatar_name); @@ -372,8 +376,7 @@ void LLFloaterReporter::onClickSend(void *userdata) return; } - - LLUploadDialog::modalUploadDialog("Uploading...\n\nReport"); + LLUploadDialog::modalUploadDialog(LLTrans::getString("uploading_abuse_report")); // *TODO don't upload image if checkbox isn't checked std::string url = gAgent.getRegion()->getCapability("SendUserReport"); std::string sshot_url = gAgent.getRegion()->getCapability("SendUserReportWithScreenshot"); @@ -503,7 +506,7 @@ void LLFloaterReporter::setPickedObjectProperties(const std::string& object_name { childSetText("object_name", object_name); std::string owner_link = - LLSLURL::buildCommand("agent", owner_id, "inspect"); + LLSLURL("agent", owner_id, "inspect").getSLURLString(); childSetText("owner_name", owner_link); childSetText("abuser_name_edit", owner_name); mAbuserID = owner_id; @@ -565,7 +568,7 @@ LLSD LLFloaterReporter::gatherReport() mCopyrightWarningSeen = FALSE; std::ostringstream summary; - if (!LLViewerLogin::getInstance()->isInProductionGrid()) + if (!LLGridManager::getInstance()->isInProductionGrid()) { summary << "Preview "; } diff --git a/indra/newview/llfloaterreporter.h b/indra/newview/llfloaterreporter.h index 7c6473f975..23784b7650 100644 --- a/indra/newview/llfloaterreporter.h +++ b/indra/newview/llfloaterreporter.h @@ -123,7 +123,7 @@ private: void setPosBox(const LLVector3d &pos); void enableControls(BOOL own_avatar); void getObjectInfo(const LLUUID& object_id); - void callbackAvatarID(const std::vector<std::string>& names, const std::vector<LLUUID>& ids); + void callbackAvatarID(const std::vector<std::string>& names, const uuid_vec_t& ids); void setFromAvatar(const LLUUID& avatar_id, const std::string& avatar_name = LLStringUtil::null); private: diff --git a/indra/newview/llfloaterscriptdebug.cpp b/indra/newview/llfloaterscriptdebug.cpp index eeea71cc4c..d6732a9d5c 100644 --- a/indra/newview/llfloaterscriptdebug.cpp +++ b/indra/newview/llfloaterscriptdebug.cpp @@ -104,6 +104,10 @@ void LLFloaterScriptDebug::addScriptLine(const std::string &utf8mesg, const std: LLViewerObject* objectp = gObjectList.findObject(source_id); std::string floater_label; + // Handle /me messages. + std::string prefix = utf8mesg.substr(0, 4); + std::string message = (prefix == "/me " || prefix == "/me'") ? user_name + utf8mesg.substr(3) : utf8mesg; + if (objectp) { objectp->setIcon(LLViewerTextureManager::getFetchedTextureFromFile("script_error.j2c", TRUE, LLViewerTexture::BOOST_UI)); @@ -121,14 +125,14 @@ void LLFloaterScriptDebug::addScriptLine(const std::string &utf8mesg, const std: LLFloaterScriptDebugOutput* floaterp = LLFloaterReg::getTypedInstance<LLFloaterScriptDebugOutput>("script_debug_output", LLUUID::null); if (floaterp) { - floaterp->addLine(utf8mesg, user_name, color); + floaterp->addLine(message, user_name, color); } // add to specific script instance floater floaterp = LLFloaterReg::getTypedInstance<LLFloaterScriptDebugOutput>("script_debug_output", source_id); if (floaterp) { - floaterp->addLine(utf8mesg, floater_label, color); + floaterp->addLine(message, floater_label, color); } } diff --git a/indra/newview/llfloaterscriptlimits.cpp b/indra/newview/llfloaterscriptlimits.cpp index 4194416a01..4792d761d8 100644 --- a/indra/newview/llfloaterscriptlimits.cpp +++ b/indra/newview/llfloaterscriptlimits.cpp @@ -110,7 +110,7 @@ BOOL LLFloaterScriptLimits::postBuild() if(!mTab) { - llinfos << "Error! couldn't get scriptlimits_panels, aborting Script Information setup" << llendl; + llwarns << "Error! couldn't get scriptlimits_panels, aborting Script Information setup" << llendl; return FALSE; } @@ -214,7 +214,7 @@ void fetchScriptLimitsRegionInfoResponder::result(const LLSD& content) LLFloaterScriptLimits* instance = LLFloaterReg::getTypedInstance<LLFloaterScriptLimits>("script_limits"); if(!instance) { - llinfos << "Failed to get llfloaterscriptlimits instance" << llendl; + llwarns << "Failed to get llfloaterscriptlimits instance" << llendl; } } @@ -227,7 +227,7 @@ void fetchScriptLimitsRegionInfoResponder::result(const LLSD& content) void fetchScriptLimitsRegionInfoResponder::error(U32 status, const std::string& reason) { - llinfos << "Error from responder " << reason << llendl; + llwarns << "Error from responder " << reason << llendl; } void fetchScriptLimitsRegionSummaryResponder::result(const LLSD& content_ref) @@ -281,26 +281,40 @@ void fetchScriptLimitsRegionSummaryResponder::result(const LLSD& content_ref) OSMessageBox(nice_llsd.str(), "summary response:", 0); - llinfos << "summary response:" << *content << llendl; + llwarns << "summary response:" << *content << llendl; #endif LLFloaterScriptLimits* instance = LLFloaterReg::getTypedInstance<LLFloaterScriptLimits>("script_limits"); if(!instance) { - llinfos << "Failed to get llfloaterscriptlimits instance" << llendl; + llwarns << "Failed to get llfloaterscriptlimits instance" << llendl; } else { LLTabContainer* tab = instance->getChild<LLTabContainer>("scriptlimits_panels"); - LLPanelScriptLimitsRegionMemory* panel_memory = (LLPanelScriptLimitsRegionMemory*)tab->getChild<LLPanel>("script_limits_region_memory_panel"); - panel_memory->setRegionSummary(content); + if(tab) + { + LLPanelScriptLimitsRegionMemory* panel_memory = (LLPanelScriptLimitsRegionMemory*)tab->getChild<LLPanel>("script_limits_region_memory_panel"); + if(panel_memory) + { + panel_memory->childSetValue("loading_text", LLSD(std::string(""))); + + LLButton* btn = panel_memory->getChild<LLButton>("refresh_list_btn"); + if(btn) + { + btn->setEnabled(true); + } + + panel_memory->setRegionSummary(content); + } + } } } void fetchScriptLimitsRegionSummaryResponder::error(U32 status, const std::string& reason) { - llinfos << "Error from responder " << reason << llendl; + llwarns << "Error from responder " << reason << llendl; } void fetchScriptLimitsRegionDetailsResponder::result(const LLSD& content_ref) @@ -383,7 +397,7 @@ result (map) if(!instance) { - llinfos << "Failed to get llfloaterscriptlimits instance" << llendl; + llwarns << "Failed to get llfloaterscriptlimits instance" << llendl; } else { @@ -397,19 +411,19 @@ result (map) } else { - llinfos << "Failed to get scriptlimits memory panel" << llendl; + llwarns << "Failed to get scriptlimits memory panel" << llendl; } } else { - llinfos << "Failed to get scriptlimits_panels" << llendl; + llwarns << "Failed to get scriptlimits_panels" << llendl; } } } void fetchScriptLimitsRegionDetailsResponder::error(U32 status, const std::string& reason) { - llinfos << "Error from responder " << reason << llendl; + llwarns << "Error from responder " << reason << llendl; } void fetchScriptLimitsAttachmentInfoResponder::result(const LLSD& content_ref) @@ -471,7 +485,7 @@ void fetchScriptLimitsAttachmentInfoResponder::result(const LLSD& content_ref) if(!instance) { - llinfos << "Failed to get llfloaterscriptlimits instance" << llendl; + llwarns << "Failed to get llfloaterscriptlimits instance" << llendl; } else { @@ -481,29 +495,46 @@ void fetchScriptLimitsAttachmentInfoResponder::result(const LLSD& content_ref) LLPanelScriptLimitsAttachment* panel = (LLPanelScriptLimitsAttachment*)tab->getChild<LLPanel>("script_limits_my_avatar_panel"); if(panel) { + panel->childSetValue("loading_text", LLSD(std::string(""))); + + LLButton* btn = panel->getChild<LLButton>("refresh_list_btn"); + if(btn) + { + btn->setEnabled(true); + } + panel->setAttachmentDetails(content); } else { - llinfos << "Failed to get script_limits_my_avatar_panel" << llendl; + llwarns << "Failed to get script_limits_my_avatar_panel" << llendl; } } else { - llinfos << "Failed to get scriptlimits_panels" << llendl; + llwarns << "Failed to get scriptlimits_panels" << llendl; } } } void fetchScriptLimitsAttachmentInfoResponder::error(U32 status, const std::string& reason) { - llinfos << "Error from responder " << reason << llendl; + llwarns << "Error from responder " << reason << llendl; } ///---------------------------------------------------------------------------- // Memory Panel ///---------------------------------------------------------------------------- +LLPanelScriptLimitsRegionMemory::~LLPanelScriptLimitsRegionMemory() +{ + if(!mParcelId.isNull()) + { + LLRemoteParcelInfoProcessor::getInstance()->removeObserver(mParcelId, this); + mParcelId.setNull(); + } +}; + BOOL LLPanelScriptLimitsRegionMemory::getLandScriptResources() { LLSD body; @@ -544,6 +575,11 @@ void LLPanelScriptLimitsRegionMemory::setParcelID(const LLUUID& parcel_id) { if (!parcel_id.isNull()) { + if(!mParcelId.isNull()) + { + LLRemoteParcelInfoProcessor::getInstance()->removeObserver(mParcelId, this); + mParcelId.setNull(); + } LLRemoteParcelInfoProcessor::getInstance()->addObserver(parcel_id, this); LLRemoteParcelInfoProcessor::getInstance()->sendParcelInfoRequest(parcel_id); } @@ -557,7 +593,7 @@ void LLPanelScriptLimitsRegionMemory::setParcelID(const LLUUID& parcel_id) // virtual void LLPanelScriptLimitsRegionMemory::setErrorStatus(U32 status, const std::string& reason) { - llerrs << "Can't handle remote parcel request."<< " Http Status: "<< status << ". Reason : "<< reason<<llendl; + llwarns << "Can't handle remote parcel request."<< " Http Status: "<< status << ". Reason : "<< reason<<llendl; } // callback from the name cache with an owner name to add to the list @@ -597,7 +633,7 @@ void LLPanelScriptLimitsRegionMemory::setRegionDetails(LLSD content) if(!list) { - llinfos << "Error getting the scripts_list control" << llendl; + llwarns << "Error getting the scripts_list control" << llendl; return; } @@ -608,7 +644,7 @@ void LLPanelScriptLimitsRegionMemory::setRegionDetails(LLSD content) std::string msg_parcels = LLTrans::getString("ScriptLimitsParcelsOwned", args_parcels); childSetValue("parcels_listed", LLSD(msg_parcels)); - std::vector<LLUUID> names_requested; + uuid_vec_t names_requested; // This makes the assumption that all objects will have the same set // of attributes, ie they will all have, or none will have locations @@ -734,8 +770,6 @@ void LLPanelScriptLimitsRegionMemory::setRegionDetails(LLSD content) // save the structure to make object return easier mContent = content; - - childSetValue("loading_text", LLSD(std::string(""))); } void LLPanelScriptLimitsRegionMemory::setRegionSummary(LLSD content) @@ -744,17 +778,17 @@ void LLPanelScriptLimitsRegionMemory::setRegionSummary(LLSD content) { mParcelMemoryUsed = content["summary"]["used"][0]["amount"].asInteger() / SIZE_OF_ONE_KB; mParcelMemoryMax = content["summary"]["available"][0]["amount"].asInteger() / SIZE_OF_ONE_KB; - mGotParcelMemoryUsed = TRUE; + mGotParcelMemoryUsed = true; } else if(content["summary"]["used"][1]["type"].asString() == std::string("memory")) { mParcelMemoryUsed = content["summary"]["used"][1]["amount"].asInteger() / SIZE_OF_ONE_KB; mParcelMemoryMax = content["summary"]["available"][1]["amount"].asInteger() / SIZE_OF_ONE_KB; - mGotParcelMemoryUsed = TRUE; + mGotParcelMemoryUsed = true; } else { - llinfos << "summary doesn't contain memory info" << llendl; + llwarns << "summary doesn't contain memory info" << llendl; return; } @@ -762,17 +796,17 @@ void LLPanelScriptLimitsRegionMemory::setRegionSummary(LLSD content) { mParcelURLsUsed = content["summary"]["used"][0]["amount"].asInteger(); mParcelURLsMax = content["summary"]["available"][0]["amount"].asInteger(); - mGotParcelURLsUsed = TRUE; + mGotParcelURLsUsed = true; } else if(content["summary"]["used"][1]["type"].asString() == std::string("urls")) { mParcelURLsUsed = content["summary"]["used"][1]["amount"].asInteger(); mParcelURLsMax = content["summary"]["available"][1]["amount"].asInteger(); - mGotParcelURLsUsed = TRUE; + mGotParcelURLsUsed = true; } else { - llinfos << "summary doesn't contain urls info" << llendl; + llwarns << "summary doesn't contain urls info" << llendl; return; } @@ -902,10 +936,10 @@ void LLPanelScriptLimitsRegionMemory::clearList() list->operateOnAll(LLCtrlListInterface::OP_DELETE); } - mGotParcelMemoryUsed = FALSE; - mGotParcelMemoryMax = FALSE; - mGotParcelURLsUsed = FALSE; - mGotParcelURLsMax = FALSE; + mGotParcelMemoryUsed = false; + mGotParcelMemoryMax = false; + mGotParcelURLsUsed = false; + mGotParcelURLsMax = false; LLStringUtil::format_map_t args_parcel_memory; std::string msg_empty_string(""); @@ -919,8 +953,6 @@ void LLPanelScriptLimitsRegionMemory::clearList() // static void LLPanelScriptLimitsRegionMemory::onClickRefresh(void* userdata) { - llinfos << "LLPanelRegionGeneralInfo::onClickRefresh" << llendl; - LLFloaterScriptLimits* instance = LLFloaterReg::getTypedInstance<LLFloaterScriptLimits>("script_limits"); if(instance) { @@ -930,6 +962,13 @@ void LLPanelScriptLimitsRegionMemory::onClickRefresh(void* userdata) LLPanelScriptLimitsRegionMemory* panel_memory = (LLPanelScriptLimitsRegionMemory*)tab->getChild<LLPanel>("script_limits_region_memory_panel"); if(panel_memory) { + //To stop people from hammering the refesh button and accidentally dosing themselves - enough requests can crash the viewer! + //turn the button off, then turn it on when we get a response + LLButton* btn = panel_memory->getChild<LLButton>("refresh_list_btn"); + if(btn) + { + btn->setEnabled(false); + } panel_memory->clearList(); panel_memory->StartRequestChain(); @@ -969,7 +1008,6 @@ void LLPanelScriptLimitsRegionMemory::showBeacon() // static void LLPanelScriptLimitsRegionMemory::onClickHighlight(void* userdata) { - llinfos << "LLPanelRegionGeneralInfo::onClickHighlight" << llendl; LLFloaterScriptLimits* instance = LLFloaterReg::getTypedInstance<LLFloaterScriptLimits>("script_limits"); if(instance) { @@ -1075,7 +1113,6 @@ void LLPanelScriptLimitsRegionMemory::returnObjects() // static void LLPanelScriptLimitsRegionMemory::onClickReturn(void* userdata) { - llinfos << "LLPanelRegionGeneralInfo::onClickReturn" << llendl; LLFloaterScriptLimits* instance = LLFloaterReg::getTypedInstance<LLFloaterScriptLimits>("script_limits"); if(instance) { @@ -1178,6 +1215,12 @@ void LLPanelScriptLimitsAttachment::setAttachmentDetails(LLSD content) setAttachmentSummary(content); childSetValue("loading_text", LLSD(std::string(""))); + + LLButton* btn = getChild<LLButton>("refresh_list_btn"); + if(btn) + { + btn->setEnabled(true); + } } BOOL LLPanelScriptLimitsAttachment::postBuild() @@ -1208,17 +1251,17 @@ void LLPanelScriptLimitsAttachment::setAttachmentSummary(LLSD content) { mAttachmentMemoryUsed = content["summary"]["used"][0]["amount"].asInteger() / SIZE_OF_ONE_KB; mAttachmentMemoryMax = content["summary"]["available"][0]["amount"].asInteger() / SIZE_OF_ONE_KB; - mGotAttachmentMemoryUsed = TRUE; + mGotAttachmentMemoryUsed = true; } else if(content["summary"]["used"][1]["type"].asString() == std::string("memory")) { mAttachmentMemoryUsed = content["summary"]["used"][1]["amount"].asInteger() / SIZE_OF_ONE_KB; mAttachmentMemoryMax = content["summary"]["available"][1]["amount"].asInteger() / SIZE_OF_ONE_KB; - mGotAttachmentMemoryUsed = TRUE; + mGotAttachmentMemoryUsed = true; } else { - llinfos << "attachment details don't contain memory summary info" << llendl; + llwarns << "attachment details don't contain memory summary info" << llendl; return; } @@ -1226,17 +1269,17 @@ void LLPanelScriptLimitsAttachment::setAttachmentSummary(LLSD content) { mAttachmentURLsUsed = content["summary"]["used"][0]["amount"].asInteger(); mAttachmentURLsMax = content["summary"]["available"][0]["amount"].asInteger(); - mGotAttachmentURLsUsed = TRUE; + mGotAttachmentURLsUsed = true; } else if(content["summary"]["used"][1]["type"].asString() == std::string("urls")) { mAttachmentURLsUsed = content["summary"]["used"][1]["amount"].asInteger(); mAttachmentURLsMax = content["summary"]["available"][1]["amount"].asInteger(); - mGotAttachmentURLsUsed = TRUE; + mGotAttachmentURLsUsed = true; } else { - llinfos << "attachment details don't contain urls summary info" << llendl; + llwarns << "attachment details don't contain urls summary info" << llendl; return; } @@ -1267,16 +1310,23 @@ void LLPanelScriptLimitsAttachment::setAttachmentSummary(LLSD content) // static void LLPanelScriptLimitsAttachment::onClickRefresh(void* userdata) -{ - llinfos << "Refresh clicked" << llendl; - +{ LLFloaterScriptLimits* instance = LLFloaterReg::getTypedInstance<LLFloaterScriptLimits>("script_limits"); if(instance) { LLTabContainer* tab = instance->getChild<LLTabContainer>("scriptlimits_panels"); LLPanelScriptLimitsAttachment* panel_attachments = (LLPanelScriptLimitsAttachment*)tab->getChild<LLPanel>("script_limits_my_avatar_panel"); + LLButton* btn = panel_attachments->getChild<LLButton>("refresh_list_btn"); + + //To stop people from hammering the refesh button and accidentally dosing themselves - enough requests can crash the viewer! + //turn the button off, then turn it on when we get a response + if(btn) + { + btn->setEnabled(false); + } panel_attachments->clearList(); panel_attachments->requestAttachmentDetails(); + return; } else diff --git a/indra/newview/llfloaterscriptlimits.h b/indra/newview/llfloaterscriptlimits.h index 4c1ecc1019..3c32b9f701 100644 --- a/indra/newview/llfloaterscriptlimits.h +++ b/indra/newview/llfloaterscriptlimits.h @@ -148,15 +148,12 @@ public: : LLPanelScriptLimitsInfo(), LLRemoteParcelInfoObserver(), mParcelId(LLUUID()), - mGotParcelMemoryUsed(FALSE), - mGotParcelMemoryMax(FALSE), + mGotParcelMemoryUsed(false), + mGotParcelMemoryMax(false), mParcelMemoryMax(0), mParcelMemoryUsed(0) {}; - ~LLPanelScriptLimitsRegionMemory() - { - LLRemoteParcelInfoProcessor::getInstance()->removeObserver(mParcelId, this); - }; + ~LLPanelScriptLimitsRegionMemory(); // LLPanel virtual BOOL postBuild(); @@ -180,16 +177,16 @@ private: LLSD mContent; LLUUID mParcelId; - BOOL mGotParcelMemoryUsed; - BOOL mGotParcelMemoryUsedDetails; - BOOL mGotParcelMemoryMax; + bool mGotParcelMemoryUsed; + bool mGotParcelMemoryUsedDetails; + bool mGotParcelMemoryMax; S32 mParcelMemoryMax; S32 mParcelMemoryUsed; S32 mParcelMemoryUsedDetails; - BOOL mGotParcelURLsUsed; - BOOL mGotParcelURLsUsedDetails; - BOOL mGotParcelURLsMax; + bool mGotParcelURLsUsed; + bool mGotParcelURLsUsedDetails; + bool mGotParcelURLsMax; S32 mParcelURLsMax; S32 mParcelURLsUsed; S32 mParcelURLsUsedDetails; @@ -217,7 +214,21 @@ class LLPanelScriptLimitsAttachment : public LLPanelScriptLimitsInfo public: LLPanelScriptLimitsAttachment() - : LLPanelScriptLimitsInfo() {}; + : LLPanelScriptLimitsInfo(), + mGotAttachmentMemoryUsed(false), + mGotAttachmentMemoryUsedDetails(false), + mGotAttachmentMemoryMax(false), + mAttachmentMemoryMax(0), + mAttachmentMemoryUsed(0), + mAttachmentMemoryUsedDetails(0), + mGotAttachmentURLsUsed(false), + mGotAttachmentURLsUsedDetails(false), + mGotAttachmentURLsMax(false), + mAttachmentURLsMax(0), + mAttachmentURLsUsed(0), + mAttachmentURLsUsedDetails(0) + {}; + ~LLPanelScriptLimitsAttachment() { }; @@ -233,16 +244,16 @@ public: private: - BOOL mGotAttachmentMemoryUsed; - BOOL mGotAttachmentMemoryUsedDetails; - BOOL mGotAttachmentMemoryMax; + bool mGotAttachmentMemoryUsed; + bool mGotAttachmentMemoryUsedDetails; + bool mGotAttachmentMemoryMax; S32 mAttachmentMemoryMax; S32 mAttachmentMemoryUsed; S32 mAttachmentMemoryUsedDetails; - BOOL mGotAttachmentURLsUsed; - BOOL mGotAttachmentURLsUsedDetails; - BOOL mGotAttachmentURLsMax; + bool mGotAttachmentURLsUsed; + bool mGotAttachmentURLsUsedDetails; + bool mGotAttachmentURLsMax; S32 mAttachmentURLsMax; S32 mAttachmentURLsUsed; S32 mAttachmentURLsUsedDetails; diff --git a/indra/newview/llfloatersearch.cpp b/indra/newview/llfloatersearch.cpp index a7401fdb6f..76caa0cf91 100644 --- a/indra/newview/llfloatersearch.cpp +++ b/indra/newview/llfloatersearch.cpp @@ -118,11 +118,9 @@ void LLFloaterSearch::onOpen(const LLSD& key) void LLFloaterSearch::onClose(bool app_quitting) { - if (! app_quitting) - { - // Show the blank home page ready for the next onOpen() - mBrowser->navigateHome(); - } + // tear down the web view so we don't show the previous search + // result when the floater is opened next time + destroy(); } void LLFloaterSearch::handleMediaEvent(LLPluginClassMedia *self, EMediaEvent event) @@ -158,11 +156,6 @@ void LLFloaterSearch::search(const LLSD &key) return; } - // display the blank home page first, to clear the display of - // any previous search results while the new results load. - // The home page is set in floater_search.xml as start_url. - mBrowser->navigateHome(); - // reset the god level warning as we're sending the latest state childHide("refresh_search"); mSearchGodLevel = gAgent.getGodLevel(); diff --git a/indra/newview/llfloatersellland.cpp b/indra/newview/llfloatersellland.cpp index e2b0c4b66f..9dddbd998a 100644 --- a/indra/newview/llfloatersellland.cpp +++ b/indra/newview/llfloatersellland.cpp @@ -94,14 +94,14 @@ private: static void doSellLand(void *userdata); bool onConfirmSale(const LLSD& notification, const LLSD& response); static void doShowObjects(void *userdata); - static bool callbackHighlightTransferable(const LLSD& notification, const LLSD& response); - void callbackAvatarPick(const std::vector<std::string>& names, const std::vector<LLUUID>& ids); + void callbackAvatarPick(const std::vector<std::string>& names, const uuid_vec_t& ids); public: virtual BOOL postBuild(); bool setParcel(LLViewerRegion* region, LLParcelSelectionHandle parcel); + static bool callbackHighlightTransferable(const LLSD& notification, const LLSD& response); }; // static @@ -163,13 +163,14 @@ BOOL LLFloaterSellLandUI::postBuild() { childSetCommitCallback("sell_to", onChangeValue, this); childSetCommitCallback("price", onChangeValue, this); - childSetPrevalidate("price", LLLineEditor::prevalidateNonNegativeS32); + childSetPrevalidate("price", LLTextValidate::validateNonNegativeS32); childSetCommitCallback("sell_objects", onChangeValue, this); childSetAction("sell_to_select_agent", boost::bind( &LLFloaterSellLandUI::doSelectAgent, this)); childSetAction("cancel_btn", doCancel, this); childSetAction("sell_btn", doSellLand, this); childSetAction("show_objects", doShowObjects, this); center(); + getChild<LLUICtrl>("profile_scroll")->setTabStop(true); return TRUE; } @@ -268,7 +269,7 @@ void LLFloaterSellLandUI::refreshUI() std::string price_str = childGetValue("price").asString(); bool valid_price = false; - valid_price = (price_str != "") && LLLineEditor::prevalidateNonNegativeS32(utf8str_to_wstring(price_str)); + valid_price = (price_str != "") && LLTextValidate::validateNonNegativeS32(utf8str_to_wstring(price_str)); if (valid_price && mParcelActualArea > 0) { @@ -390,7 +391,7 @@ void LLFloaterSellLandUI::doSelectAgent() addDependentFloater(LLFloaterAvatarPicker::show(boost::bind(&LLFloaterSellLandUI::callbackAvatarPick, this, _1, _2), FALSE, TRUE)); } -void LLFloaterSellLandUI::callbackAvatarPick(const std::vector<std::string>& names, const std::vector<LLUUID>& ids) +void LLFloaterSellLandUI::callbackAvatarPick(const std::vector<std::string>& names, const uuid_vec_t& ids) { LLParcel* parcel = mParcelSelection->getParcel(); @@ -422,11 +423,13 @@ void LLFloaterSellLandUI::doShowObjects(void *userdata) send_parcel_select_objects(parcel->getLocalID(), RT_SELL); + // we shouldn't pass callback functor since it is registered in LLFunctorRegistration LLNotificationsUtil::add("TransferObjectsHighlighted", - LLSD(), LLSD(), - &LLFloaterSellLandUI::callbackHighlightTransferable); + LLSD(), LLSD()); } +static LLNotificationFunctorRegistration tr("TransferObjectsHighlighted", &LLFloaterSellLandUI::callbackHighlightTransferable); + // static bool LLFloaterSellLandUI::callbackHighlightTransferable(const LLSD& notification, const LLSD& data) { diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp index a0031f0193..f3baa482a0 100644 --- a/indra/newview/llfloatersnapshot.cpp +++ b/indra/newview/llfloatersnapshot.cpp @@ -38,6 +38,7 @@ // Viewer includes #include "llagent.h" +#include "llagentcamera.h" #include "llcallbacklist.h" #include "llcriticaldamp.h" #include "llui.h" @@ -892,7 +893,7 @@ BOOL LLSnapshotLivePreview::onIdle( void* snapshot_preview ) previewp->mSnapshotUpToDate = TRUE; previewp->generateThumbnailImage(TRUE) ; - previewp->mPosTakenGlobal = gAgent.getCameraPositionGlobal(); + previewp->mPosTakenGlobal = gAgentCamera.getCameraPositionGlobal(); previewp->mShineCountdown = 4; // wait a few frames to avoid animation glitch due to readback this frame } } diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp index 4edd09b02c..a42f6ee00f 100644 --- a/indra/newview/llfloatertools.cpp +++ b/indra/newview/llfloatertools.cpp @@ -38,7 +38,7 @@ #include "llcoord.h" //#include "llgl.h" -#include "llagent.h" +#include "llagentcamera.h" #include "llbutton.h" #include "llcheckboxctrl.h" #include "llcombobox.h" @@ -237,6 +237,7 @@ BOOL LLFloaterTools::postBuild() childSetValue("checkbox stretch textures",(BOOL)gSavedSettings.getBOOL("ScaleStretchTextures")); mTextGridMode = getChild<LLTextBox>("text ruler mode"); mComboGridMode = getChild<LLComboBox>("combobox grid mode"); + mCheckStretchUniformLabel = getChild<LLTextBox>("checkbox uniform label"); // // Create Buttons @@ -316,6 +317,7 @@ LLFloaterTools::LLFloaterTools(const LLSD& key) mComboGridMode(NULL), mCheckStretchUniform(NULL), mCheckStretchTexture(NULL), + mCheckStretchUniformLabel(NULL), mBtnRotateLeft(NULL), mBtnRotateReset(NULL), @@ -533,7 +535,7 @@ void LLFloaterTools::updatePopup(LLCoordGL center, MASK mask) } // multiply by correction factor because volume sliders go [0, 0.5] - childSetValue( "slider zoom", gAgent.getCameraZoomFraction() * 0.5f); + childSetValue( "slider zoom", gAgentCamera.getCameraZoomFraction() * 0.5f); // Move buttons BOOL move_visible = (tool == LLToolGrab::getInstance()); @@ -632,6 +634,7 @@ void LLFloaterTools::updatePopup(LLCoordGL center, MASK mask) //mCheckSelectLinked ->setVisible( edit_visible ); if (mCheckStretchUniform) mCheckStretchUniform->setVisible( edit_visible ); if (mCheckStretchTexture) mCheckStretchTexture->setVisible( edit_visible ); + if (mCheckStretchUniformLabel) mCheckStretchUniformLabel->setVisible( edit_visible ); // Create buttons BOOL create_visible = (tool == LLToolCompCreate::getInstance()); @@ -666,8 +669,8 @@ void LLFloaterTools::updatePopup(LLCoordGL center, MASK mask) if (mCheckCopyCenters) mCheckCopyCenters ->setVisible( create_visible ); if (mCheckCopyRotates) mCheckCopyRotates ->setVisible( create_visible ); - if (mCheckCopyCenters) mCheckCopyCenters->setEnabled( mCheckCopySelection->get() ); - if (mCheckCopyRotates) mCheckCopyRotates->setEnabled( mCheckCopySelection->get() ); + if (mCheckCopyCenters && mCheckCopySelection) mCheckCopyCenters->setEnabled( mCheckCopySelection->get() ); + if (mCheckCopyRotates && mCheckCopySelection) mCheckCopyRotates->setEnabled( mCheckCopySelection->get() ); // Land buttons BOOL land_visible = (tool == LLToolBrushLand::getInstance() || tool == LLToolSelectLand::getInstance() ); @@ -766,7 +769,7 @@ void LLFloaterTools::onClose(bool app_quitting) // Different from handle_reset_view in that it doesn't actually // move the camera if EditCameraMovement is not set. - gAgent.resetView(gSavedSettings.getBOOL("EditCameraMovement")); + gAgentCamera.resetView(gSavedSettings.getBOOL("EditCameraMovement")); // exit component selection mode LLSelectMgr::getInstance()->promoteSelectionToRoot(); @@ -847,7 +850,7 @@ void commit_slider_zoom(LLUICtrl *ctrl) { // renormalize value, since max "volume" level is 0.5 for some reason F32 zoom_level = (F32)ctrl->getValue().asReal() * 2.f; // / 0.5f; - gAgent.setCameraZoomFraction(zoom_level); + gAgentCamera.setCameraZoomFraction(zoom_level); } void click_popup_rotate_left(void*) @@ -1523,7 +1526,9 @@ void LLFloaterTools::updateMediaSettings() mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical; // Auto play - value_bool = default_media_data.getAutoPlay(); + //value_bool = default_media_data.getAutoPlay(); + // set default to auto play TRUE -- angela EXT-5172 + value_bool = true; struct functor_getter_auto_play : public LLSelectedTEGetFunctor< bool > { functor_getter_auto_play(const LLMediaEntry& entry) : mMediaEntry(entry) {} @@ -1534,7 +1539,8 @@ void LLFloaterTools::updateMediaSettings() if ( object->getTE(face) ) if ( object->getTE(face)->getMediaData() ) return object->getTE(face)->getMediaData()->getAutoPlay(); - return mMediaEntry.getAutoPlay(); + //return mMediaEntry.getAutoPlay(); set default to auto play TRUE -- angela EXT-5172 + return true; }; const LLMediaEntry &mMediaEntry; @@ -1547,7 +1553,9 @@ void LLFloaterTools::updateMediaSettings() // Auto scale - value_bool = default_media_data.getAutoScale(); + // set default to auto scale TRUE -- angela EXT-5172 + //value_bool = default_media_data.getAutoScale(); + value_bool = true; struct functor_getter_auto_scale : public LLSelectedTEGetFunctor< bool > { functor_getter_auto_scale(const LLMediaEntry& entry): mMediaEntry(entry) {} @@ -1558,8 +1566,9 @@ void LLFloaterTools::updateMediaSettings() if ( object->getTE(face) ) if ( object->getTE(face)->getMediaData() ) return object->getTE(face)->getMediaData()->getAutoScale(); - return mMediaEntry.getAutoScale();; - }; + // return mMediaEntry.getAutoScale(); set default to auto scale TRUE -- angela EXT-5172 + return true; + }; const LLMediaEntry &mMediaEntry; diff --git a/indra/newview/llfloatertools.h b/indra/newview/llfloatertools.h index e1f3c9b78c..91431969bb 100644 --- a/indra/newview/llfloatertools.h +++ b/indra/newview/llfloatertools.h @@ -149,6 +149,10 @@ public: LLCheckBoxCtrl* mCheckStretchUniform; LLCheckBoxCtrl* mCheckStretchTexture; + // !HACK! Replacement of mCheckStretchUniform label because LLCheckBoxCtrl + // doesn't support word_wrap of its label. Need to fix truncation bug EXT-6658 + LLTextBox* mCheckStretchUniformLabel; + LLButton *mBtnRotateLeft; LLButton *mBtnRotateReset; LLButton *mBtnRotateRight; diff --git a/indra/newview/llfloatertopobjects.cpp b/indra/newview/llfloatertopobjects.cpp index c930e99bad..84ea353dab 100644 --- a/indra/newview/llfloatertopobjects.cpp +++ b/indra/newview/llfloatertopobjects.cpp @@ -283,8 +283,13 @@ void LLFloaterTopObjects::updateSelectionInfo() std::string object_id_string = object_id.asString(); childSetValue("id_editor", LLSD(object_id_string)); - childSetValue("object_name_editor", list->getFirstSelected()->getColumn(1)->getValue().asString()); - childSetValue("owner_name_editor", list->getFirstSelected()->getColumn(2)->getValue().asString()); + LLScrollListItem* sli = list->getFirstSelected(); + llassert(sli); + if (sli) + { + childSetValue("object_name_editor", sli->getColumn(1)->getValue().asString()); + childSetValue("owner_name_editor", sli->getColumn(2)->getValue().asString()); + } } // static @@ -310,7 +315,7 @@ void LLFloaterTopObjects::doToObjects(int action, bool all) LLCtrlListInterface *list = childGetListInterface("objects_list"); if (!list || list->getItemCount() == 0) return; - std::vector<LLUUID>::iterator id_itor; + uuid_vec_t::iterator id_itor; bool start_message = true; diff --git a/indra/newview/llfloatertopobjects.h b/indra/newview/llfloatertopobjects.h index ee3c5d3cce..8fb89a3cc5 100644 --- a/indra/newview/llfloatertopobjects.h +++ b/indra/newview/llfloatertopobjects.h @@ -89,7 +89,7 @@ private: std::string mMethod; LLSD mObjectListData; - std::vector<LLUUID> mObjectListIDs; + uuid_vec_t mObjectListIDs; U32 mCurrentMode; U32 mFlags; diff --git a/indra/newview/llfloatertos.cpp b/indra/newview/llfloatertos.cpp index 69ee8cd547..104827f4a3 100644 --- a/indra/newview/llfloatertos.cpp +++ b/indra/newview/llfloatertos.cpp @@ -57,7 +57,9 @@ LLFloaterTOS::LLFloaterTOS(const LLSD& data) : LLModalDialog( data["message"].asString() ), mMessage(data["message"].asString()), mWebBrowserWindowId( 0 ), - mLoadCompleteCount( 0 ), + mLoadingScreenLoaded(false), + mSiteAlive(false), + mRealNavigateBegun(false), mReplyPumpName(data["reply_pump"].asString()) { } @@ -138,8 +140,10 @@ BOOL LLFloaterTOS::postBuild() if ( web_browser ) { web_browser->addObserver(this); - gResponsePtr = LLIamHere::build( this ); - LLHTTPClient::get( getString( "real_url" ), gResponsePtr ); + + // Don't use the start_url parameter for this browser instance -- it may finish loading before we get to add our observer. + // Store the URL separately and navigate here instead. + web_browser->navigateTo( getString( "loading_url" ) ); } return TRUE; @@ -147,18 +151,28 @@ BOOL LLFloaterTOS::postBuild() void LLFloaterTOS::setSiteIsAlive( bool alive ) { + mSiteAlive = alive; + // only do this for TOS pages if (hasChild("tos_html")) { - LLMediaCtrl* web_browser = getChild<LLMediaCtrl>("tos_html"); // if the contents of the site was retrieved if ( alive ) { // navigate to the "real" page - web_browser->navigateTo( getString( "real_url" ) ); + if(!mRealNavigateBegun && mSiteAlive) + { + LLMediaCtrl* web_browser = getChild<LLMediaCtrl>("tos_html"); + if(web_browser) + { + mRealNavigateBegun = true; + web_browser->navigateTo( getString( "real_url" ) ); + } + } } else { + LL_INFOS("TOS") << "ToS page: ToS page unavailable!" << LL_ENDL; // normally this is set when navigation to TOS page navigation completes (so you can't accept before TOS loads) // but if the page is unavailable, we need to do this now LLCheckBoxCtrl* tos_agreement = getChild<LLCheckBoxCtrl>("agree_chk"); @@ -169,7 +183,6 @@ void LLFloaterTOS::setSiteIsAlive( bool alive ) LLFloaterTOS::~LLFloaterTOS() { - // tell the responder we're not here anymore if ( gResponsePtr ) gResponsePtr->setParent( 0 ); @@ -194,7 +207,7 @@ void LLFloaterTOS::updateAgree(LLUICtrl*, void* userdata ) void LLFloaterTOS::onContinue( void* userdata ) { LLFloaterTOS* self = (LLFloaterTOS*) userdata; - llinfos << "User agrees with TOS." << llendl; + LL_INFOS("TOS") << "User agrees with TOS." << LL_ENDL; if(self->mReplyPumpName != "") { @@ -208,7 +221,7 @@ void LLFloaterTOS::onContinue( void* userdata ) void LLFloaterTOS::onCancel( void* userdata ) { LLFloaterTOS* self = (LLFloaterTOS*) userdata; - llinfos << "User disagrees with TOS." << llendl; + LL_INFOS("TOS") << "User disagrees with TOS." << LL_ENDL; LLNotificationsUtil::add("MustAgreeToLogIn", LLSD(), LLSD(), login_alert_done); if(self->mReplyPumpName != "") @@ -216,8 +229,13 @@ void LLFloaterTOS::onCancel( void* userdata ) LLEventPumps::instance().obtain(self->mReplyPumpName).post(LLSD(false)); } - self->mLoadCompleteCount = 0; // reset counter for next time we come to TOS - self->closeFloater(); // destroys this object + // reset state for next time we come to TOS + self->mLoadingScreenLoaded = false; + self->mSiteAlive = false; + self->mRealNavigateBegun = false; + + // destroys this object + self->closeFloater(); } //virtual @@ -225,10 +243,16 @@ void LLFloaterTOS::handleMediaEvent(LLPluginClassMedia* /*self*/, EMediaEvent ev { if(event == MEDIA_EVENT_NAVIGATE_COMPLETE) { - // skip past the loading screen navigate complete - if ( ++mLoadCompleteCount == 2 ) + if(!mLoadingScreenLoaded) + { + mLoadingScreenLoaded = true; + + gResponsePtr = LLIamHere::build( this ); + LLHTTPClient::get( getString( "real_url" ), gResponsePtr ); + } + else if(mRealNavigateBegun) { - llinfos << "NAVIGATE COMPLETE" << llendl; + LL_INFOS("TOS") << "TOS: NAVIGATE COMPLETE" << LL_ENDL; // enable Agree to TOS radio button now that page has loaded LLCheckBoxCtrl * tos_agreement = getChild<LLCheckBoxCtrl>("agree_chk"); tos_agreement->setEnabled( true ); diff --git a/indra/newview/llfloatertos.h b/indra/newview/llfloatertos.h index 1d573e8170..d985ccbab0 100644 --- a/indra/newview/llfloatertos.h +++ b/indra/newview/llfloatertos.h @@ -66,9 +66,12 @@ public: /*virtual*/ void handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event); private: + std::string mMessage; int mWebBrowserWindowId; - int mLoadCompleteCount; + bool mLoadingScreenLoaded; + bool mSiteAlive; + bool mRealNavigateBegun; std::string mReplyPumpName; }; diff --git a/indra/newview/llfloateruipreview.cpp b/indra/newview/llfloateruipreview.cpp index c6e12476bd..1b6ef0e97a 100644 --- a/indra/newview/llfloateruipreview.cpp +++ b/indra/newview/llfloateruipreview.cpp @@ -41,6 +41,7 @@ #include "llfloateruipreview.h" // Own header // Internal utility +#include "lleventtimer.h" #include "llrender.h" #include "llsdutil.h" #include "llxmltree.h" @@ -91,7 +92,6 @@ static std::string get_xui_dir() } // Forward declarations to avoid header dependencies -class LLEventTimer; class LLColor; class LLScrollListCtrl; class LLComboBox; @@ -266,11 +266,12 @@ private: class LLPreviewedFloater : public LLFloater { public: - LLPreviewedFloater(LLFloaterUIPreview* floater) - : LLFloater(LLSD()), + LLPreviewedFloater(LLFloaterUIPreview* floater, const Params& params) + : LLFloater(LLSD(), params), mFloaterUIPreview(floater) { } + virtual void draw(); BOOL handleRightMouseDown(S32 x, S32 y, MASK mask); BOOL handleToolTip(S32 x, S32 y, MASK mask); @@ -362,8 +363,7 @@ BOOL LLFadeEventTimer::tick() if(NULL == mParent) // no more need to tick, so suicide { - delete this; - return FALSE; + return TRUE; } // Set up colors @@ -429,6 +429,7 @@ BOOL LLFloaterUIPreview::postBuild() // Double-click opens the floater, for convenience mFileList->setDoubleClickCallback(boost::bind(&LLFloaterUIPreview::onClickDisplayFloater, this, PRIMARY_FLOATER)); + setDefaultBtn("display_floater"); // get pointers to buttons and link to callbacks mLanguageSelection = main_panel_tmp->getChild<LLComboBox>("language_select_combo"); mLanguageSelection->setCommitCallback(boost::bind(&LLFloaterUIPreview::onLanguageComboSelect, this, mLanguageSelection)); @@ -825,7 +826,11 @@ void LLFloaterUIPreview::displayFloater(BOOL click, S32 ID, bool save) return; // ignore click (this can only happen with empty list; otherwise an item is always selected) } - *floaterp = new LLPreviewedFloater(this); + LLFloater::Params p(LLFloater::getDefaultParams()); + p.min_height=p.header_height; + p.min_width=10; + + *floaterp = new LLPreviewedFloater(this, p); if(!strncmp(path.c_str(),"floater_",8) || !strncmp(path.c_str(), "inspect_", 8)) // if it's a floater @@ -875,6 +880,8 @@ void LLFloaterUIPreview::displayFloater(BOOL click, S32 ID, bool save) } else // if it is a panel... { + (*floaterp)->setCanResize(true); + const LLFloater::Params& floater_params = LLFloater::getDefaultParams(); S32 floater_header_size = floater_params.header_height; diff --git a/indra/newview/llfloaterurlentry.cpp b/indra/newview/llfloaterurlentry.cpp index 91d0f0e370..0e802e9736 100644 --- a/indra/newview/llfloaterurlentry.cpp +++ b/indra/newview/llfloaterurlentry.cpp @@ -40,6 +40,7 @@ #include "llpanelface.h" #include "llcombobox.h" +#include "llmimetypes.h" #include "llnotificationsutil.h" #include "llurlhistory.h" #include "lluictrlfactory.h" @@ -69,16 +70,11 @@ public: completeAny(status, mime_type); } - virtual void error( U32 status, const std::string& reason ) - { - completeAny(status, "none/none"); - } - void completeAny(U32 status, const std::string& mime_type) { // Set empty type to none/none. Empty string is reserved for legacy parcels // which have no mime type set. - std::string resolved_mime_type = ! mime_type.empty() ? mime_type : "none/none"; + std::string resolved_mime_type = ! mime_type.empty() ? mime_type : LLMIMETypes::getDefaultMimeType(); LLFloaterURLEntry* floater_url_entry = (LLFloaterURLEntry*)mParent.get(); if ( floater_url_entry ) floater_url_entry->headerFetchComplete( status, resolved_mime_type ); diff --git a/indra/newview/llfloatervoicedevicesettings.cpp b/indra/newview/llfloatervoicedevicesettings.cpp index 638c9f1b8c..63365e3461 100644 --- a/indra/newview/llfloatervoicedevicesettings.cpp +++ b/indra/newview/llfloatervoicedevicesettings.cpp @@ -64,9 +64,6 @@ LLPanelVoiceDeviceSettings::LLPanelVoiceDeviceSettings() // grab "live" mic volume level mMicVolume = gSavedSettings.getF32("AudioLevelMic"); - // ask for new device enumeration - // now do this in onOpen() instead... - //gVoiceClient->refreshDeviceLists(); } LLPanelVoiceDeviceSettings::~LLPanelVoiceDeviceSettings() @@ -105,7 +102,7 @@ void LLPanelVoiceDeviceSettings::draw() refresh(); // let user know that volume indicator is not yet available - bool is_in_tuning_mode = gVoiceClient->inTuningMode(); + bool is_in_tuning_mode = LLVoiceClient::getInstance()->inTuningMode(); childSetVisible("wait_text", !is_in_tuning_mode); LLPanel::draw(); @@ -113,7 +110,7 @@ void LLPanelVoiceDeviceSettings::draw() if (is_in_tuning_mode) { const S32 num_bars = 5; - F32 voice_power = gVoiceClient->tuningGetEnergy() / LLVoiceClient::OVERDRIVEN_POWER_LEVEL; + F32 voice_power = LLVoiceClient::getInstance()->tuningGetEnergy() / LLVoiceClient::OVERDRIVEN_POWER_LEVEL; S32 discrete_power = llmin(num_bars, llfloor(voice_power * (F32)num_bars + 0.1f)); for(S32 power_bar_idx = 0; power_bar_idx < num_bars; power_bar_idx++) @@ -194,13 +191,13 @@ void LLPanelVoiceDeviceSettings::refresh() LLSlider* volume_slider = getChild<LLSlider>("mic_volume_slider"); // set mic volume tuning slider based on last mic volume setting F32 current_volume = (F32)volume_slider->getValue().asReal(); - gVoiceClient->tuningSetMicVolume(current_volume); + LLVoiceClient::getInstance()->tuningSetMicVolume(current_volume); // Fill in popup menus mCtrlInputDevices = getChild<LLComboBox>("voice_input_device"); mCtrlOutputDevices = getChild<LLComboBox>("voice_output_device"); - if(!gVoiceClient->deviceSettingsAvailable()) + if(!LLVoiceClient::getInstance()->deviceSettingsAvailable()) { // The combo boxes are disabled, since we can't get the device settings from the daemon just now. // Put the currently set default (ONLY) in the box, and select it. @@ -219,17 +216,16 @@ void LLPanelVoiceDeviceSettings::refresh() } else if (!mDevicesUpdated) { - LLVoiceClient::deviceList *devices; - - LLVoiceClient::deviceList::iterator iter; + LLVoiceDeviceList::const_iterator iter; if(mCtrlInputDevices) { mCtrlInputDevices->removeall(); mCtrlInputDevices->add( getString("default_text"), ADD_BOTTOM ); - devices = gVoiceClient->getCaptureDevices(); - for(iter=devices->begin(); iter != devices->end(); iter++) + for(iter=LLVoiceClient::getInstance()->getCaptureDevices().begin(); + iter != LLVoiceClient::getInstance()->getCaptureDevices().end(); + iter++) { mCtrlInputDevices->add( *iter, ADD_BOTTOM ); } @@ -245,8 +241,8 @@ void LLPanelVoiceDeviceSettings::refresh() mCtrlOutputDevices->removeall(); mCtrlOutputDevices->add( getString("default_text"), ADD_BOTTOM ); - devices = gVoiceClient->getRenderDevices(); - for(iter=devices->begin(); iter != devices->end(); iter++) + for(iter= LLVoiceClient::getInstance()->getRenderDevices().begin(); + iter != LLVoiceClient::getInstance()->getRenderDevices().end(); iter++) { mCtrlOutputDevices->add( *iter, ADD_BOTTOM ); } @@ -268,37 +264,34 @@ void LLPanelVoiceDeviceSettings::initialize() mDevicesUpdated = FALSE; // ask for new device enumeration - gVoiceClient->refreshDeviceLists(); + LLVoiceClient::getInstance()->refreshDeviceLists(); // put voice client in "tuning" mode - gVoiceClient->tuningStart(); + LLVoiceClient::getInstance()->tuningStart(); LLVoiceChannel::suspend(); } void LLPanelVoiceDeviceSettings::cleanup() { - if (gVoiceClient) - { - gVoiceClient->tuningStop(); - } + LLVoiceClient::getInstance()->tuningStop(); LLVoiceChannel::resume(); } // static void LLPanelVoiceDeviceSettings::onCommitInputDevice(LLUICtrl* ctrl, void* user_data) { - if(gVoiceClient) + if(LLVoiceClient::getInstance()) { - gVoiceClient->setCaptureDevice(ctrl->getValue().asString()); + LLVoiceClient::getInstance()->setCaptureDevice(ctrl->getValue().asString()); } } // static void LLPanelVoiceDeviceSettings::onCommitOutputDevice(LLUICtrl* ctrl, void* user_data) { - if(gVoiceClient) + if(LLVoiceClient::getInstance()) { - gVoiceClient->setRenderDevice(ctrl->getValue().asString()); + LLVoiceClient::getInstance()->setRenderDevice(ctrl->getValue().asString()); } } diff --git a/indra/newview/llfloatervoiceeffect.cpp b/indra/newview/llfloatervoiceeffect.cpp new file mode 100644 index 0000000000..ca1f142760 --- /dev/null +++ b/indra/newview/llfloatervoiceeffect.cpp @@ -0,0 +1,288 @@ +/** + * @file llfloatervoiceeffect.cpp + * @author Aimee + * @brief Selection and preview of voice effect. + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2002-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llfloatervoiceeffect.h" + +#include "llscrolllistctrl.h" +#include "lltrans.h" +#include "llweb.h" + +LLFloaterVoiceEffect::LLFloaterVoiceEffect(const LLSD& key) + : LLFloater(key) +{ + mCommitCallbackRegistrar.add("VoiceEffect.Record", boost::bind(&LLFloaterVoiceEffect::onClickRecord, this)); + mCommitCallbackRegistrar.add("VoiceEffect.Play", boost::bind(&LLFloaterVoiceEffect::onClickPlay, this)); + mCommitCallbackRegistrar.add("VoiceEffect.Stop", boost::bind(&LLFloaterVoiceEffect::onClickStop, this)); +// mCommitCallbackRegistrar.add("VoiceEffect.Activate", boost::bind(&LLFloaterVoiceEffect::onClickActivate, this)); +} + +// virtual +LLFloaterVoiceEffect::~LLFloaterVoiceEffect() +{ + if(LLVoiceClient::instanceExists()) + { + LLVoiceEffectInterface* effect_interface = LLVoiceClient::instance().getVoiceEffectInterface(); + if (effect_interface) + { + effect_interface->removeObserver(this); + } + } +} + +// virtual +BOOL LLFloaterVoiceEffect::postBuild() +{ + setDefaultBtn("record_btn"); + getChild<LLButton>("record_btn")->setFocus(true); + childSetTextArg("voice_morphing_link", "[URL]", LLTrans::getString("voice_morphing_url")); + + mVoiceEffectList = getChild<LLScrollListCtrl>("voice_effect_list"); + if (mVoiceEffectList) + { + mVoiceEffectList->setCommitCallback(boost::bind(&LLFloaterVoiceEffect::onClickPlay, this)); +// mVoiceEffectList->setDoubleClickCallback(boost::bind(&LLFloaterVoiceEffect::onClickActivate, this)); + } + + LLVoiceEffectInterface* effect_interface = LLVoiceClient::instance().getVoiceEffectInterface(); + if (effect_interface) + { + effect_interface->addObserver(this); + + // Disconnect from the current voice channel ready to record a voice sample for previewing + effect_interface->enablePreviewBuffer(true); + } + + refreshEffectList(); + updateControls(); + + return TRUE; +} + +// virtual +void LLFloaterVoiceEffect::onClose(bool app_quitting) +{ + LLVoiceEffectInterface* effect_interface = LLVoiceClient::instance().getVoiceEffectInterface(); + if (effect_interface) + { + effect_interface->enablePreviewBuffer(false); + } +} + +void LLFloaterVoiceEffect::refreshEffectList() +{ + if (!mVoiceEffectList) + { + return; + } + + LLVoiceEffectInterface* effect_interface = LLVoiceClient::instance().getVoiceEffectInterface(); + if (!effect_interface) + { + mVoiceEffectList->setEnabled(false); + return; + } + + LL_DEBUGS("Voice")<< "Rebuilding Voice Morph list."<< LL_ENDL; + + // Preserve selected items and scroll position + S32 scroll_pos = mVoiceEffectList->getScrollPos(); + uuid_vec_t selected_items; + std::vector<LLScrollListItem*> items = mVoiceEffectList->getAllSelected(); + for(std::vector<LLScrollListItem*>::const_iterator it = items.begin(); it != items.end(); it++) + { + selected_items.push_back((*it)->getUUID()); + } + + mVoiceEffectList->deleteAllItems(); + + { + // Add the "No Voice Morph" entry + LLSD element; + + element["id"] = LLUUID::null; + element["columns"][NAME_COLUMN]["column"] = "name"; + element["columns"][NAME_COLUMN]["value"] = getString("no_voice_effect"); + element["columns"][NAME_COLUMN]["font"]["style"] = "BOLD"; + + LLScrollListItem* sl_item = mVoiceEffectList->addElement(element, ADD_BOTTOM); + // *HACK: Copied from llfloatergesture.cpp : ["font"]["style"] does not affect font style :( + if(sl_item) + { + ((LLScrollListText*)sl_item->getColumn(0))->setFontStyle(LLFontGL::BOLD); + } + } + + // Add each Voice Morph template, if there are any (template list includes all usable effects) + const voice_effect_list_t& template_list = effect_interface->getVoiceEffectTemplateList(); + if (!template_list.empty()) + { + for (voice_effect_list_t::const_iterator it = template_list.begin(); it != template_list.end(); ++it) + { + const LLUUID& effect_id = it->second; + std::string effect_name = it->first; + + LLSD effect_properties = effect_interface->getVoiceEffectProperties(effect_id); + + // Tag the active effect. + if (effect_id == LLVoiceClient::instance().getVoiceEffectDefault()) + { + effect_name += " " + getString("active_voice_effect"); + } + + // Tag available effects that are new this session + if (effect_properties["is_new"].asBoolean()) + { + effect_name += " " + getString("new_voice_effect"); + } + + LLDate expiry_date = effect_properties["expiry_date"].asDate(); + bool is_template_only = effect_properties["template_only"].asBoolean(); + + std::string font_style = "NORMAL"; + if (!is_template_only) + { + font_style = "BOLD"; + } + + LLSD element; + element["id"] = effect_id; + + element["columns"][NAME_COLUMN]["column"] = "name"; + element["columns"][NAME_COLUMN]["value"] = effect_name; + element["columns"][NAME_COLUMN]["font"]["style"] = font_style; + + element["columns"][1]["column"] = "expires"; + if (!is_template_only) + { + element["columns"][DATE_COLUMN]["value"] = expiry_date; + element["columns"][DATE_COLUMN]["type"] = "date"; + } + else { + element["columns"][DATE_COLUMN]["value"] = getString("unsubscribed_voice_effect"); + } +// element["columns"][DATE_COLUMN]["font"]["style"] = "NORMAL"; + + LLScrollListItem* sl_item = mVoiceEffectList->addElement(element, ADD_BOTTOM); + // *HACK: Copied from llfloatergesture.cpp : ["font"]["style"] does not affect font style :( + if(sl_item) + { + LLFontGL::StyleFlags style = is_template_only ? LLFontGL::NORMAL : LLFontGL::BOLD; + dynamic_cast<LLScrollListText*>(sl_item->getColumn(0))->setFontStyle(style); + } + } + } + + // Re-select items that were selected before, and restore the scroll position + for(uuid_vec_t::iterator it = selected_items.begin(); it != selected_items.end(); it++) + { + mVoiceEffectList->selectByID(*it); + } + mVoiceEffectList->setScrollPos(scroll_pos); + mVoiceEffectList->setEnabled(true); +} + +void LLFloaterVoiceEffect::updateControls() +{ + bool recording = false; + + LLVoiceEffectInterface* effect_interface = LLVoiceClient::instance().getVoiceEffectInterface(); + if (effect_interface) + { + recording = effect_interface->isPreviewRecording(); + } + + getChild<LLButton>("record_btn")->setVisible(!recording); + getChild<LLButton>("record_stop_btn")->setVisible(recording); +} + +// virtual +void LLFloaterVoiceEffect::onVoiceEffectChanged(bool effect_list_updated) +{ + if (effect_list_updated) + { + refreshEffectList(); + } + updateControls(); +} + +void LLFloaterVoiceEffect::onClickRecord() +{ + LL_DEBUGS("Voice") << "Record clicked" << LL_ENDL; + LLVoiceEffectInterface* effect_interface = LLVoiceClient::instance().getVoiceEffectInterface(); + if (effect_interface) + { + effect_interface->recordPreviewBuffer(); + } + updateControls(); +} + +void LLFloaterVoiceEffect::onClickPlay() +{ + LL_DEBUGS("Voice") << "Play clicked" << LL_ENDL; + if (!mVoiceEffectList) + { + return; + } + + const LLUUID& effect_id = mVoiceEffectList->getCurrentID(); + + LLVoiceEffectInterface* effect_interface = LLVoiceClient::instance().getVoiceEffectInterface(); + if (effect_interface) + { + effect_interface->playPreviewBuffer(effect_id); + } + updateControls(); +} + +void LLFloaterVoiceEffect::onClickStop() +{ + LL_DEBUGS("Voice") << "Stop clicked" << LL_ENDL; + LLVoiceEffectInterface* effect_interface = LLVoiceClient::instance().getVoiceEffectInterface(); + if (effect_interface) + { + effect_interface->stopPreviewBuffer(); + } + updateControls(); +} + +//void LLFloaterVoiceEffect::onClickActivate() +//{ +// LLVoiceEffectInterface* effect_interface = LLVoiceClient::instance().getVoiceEffectInterface(); +// if (effect_interface && mVoiceEffectList) +// { +// effect_interface->setVoiceEffect(mVoiceEffectList->getCurrentID()); +// } +//} + diff --git a/indra/newview/llfloatervoiceeffect.h b/indra/newview/llfloatervoiceeffect.h new file mode 100644 index 0000000000..fe207a05c3 --- /dev/null +++ b/indra/newview/llfloatervoiceeffect.h @@ -0,0 +1,78 @@ +/** + * @file llfloatervoiceeffect.h + * @author Aimee + * @brief Selection and preview of voice effects. + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2002-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLFLOATERVOICEEFFECT_H +#define LL_LLFLOATERVOICEEFFECT_H + +#include "llfloater.h" +#include "llvoiceclient.h" + +class LLButton; +class LLScrollListCtrl; + +class LLFloaterVoiceEffect + : public LLFloater + , public LLVoiceEffectObserver +{ +public: + LOG_CLASS(LLFloaterVoiceEffect); + + LLFloaterVoiceEffect(const LLSD& key); + virtual ~LLFloaterVoiceEffect(); + + virtual BOOL postBuild(); + virtual void onClose(bool app_quitting); + +private: + enum ColumnIndex + { + NAME_COLUMN = 0, + DATE_COLUMN = 1, + }; + + void refreshEffectList(); + void updateControls(); + + /// Called by voice effect provider when voice effect list is changed. + virtual void onVoiceEffectChanged(bool effect_list_updated); + + void onClickRecord(); + void onClickPlay(); + void onClickStop(); +// void onClickActivate(); + + LLUUID mSelectedID; + LLScrollListCtrl* mVoiceEffectList; +}; + +#endif diff --git a/indra/newview/llfloaterwater.cpp b/indra/newview/llfloaterwater.cpp index 66a1f6701f..1bbee2625c 100644 --- a/indra/newview/llfloaterwater.cpp +++ b/indra/newview/llfloaterwater.cpp @@ -574,12 +574,10 @@ bool LLFloaterWater::deleteAlertCallback(const LLSD& notification, const LLSD& r LLComboBox* combo_box = getChild<LLComboBox>("WaterPresetsCombo"); LLFloaterDayCycle* day_cycle = LLFloaterReg::findTypedInstance<LLFloaterDayCycle>("env_day_cycle"); LLComboBox* key_combo = NULL; - LLMultiSliderCtrl* mult_sldr = NULL; if (day_cycle) { key_combo = day_cycle->getChild<LLComboBox>("WaterKeyPresets"); - mult_sldr = day_cycle->getChild<LLMultiSliderCtrl>("WaterDayCycleKeys"); } std::string name = combo_box->getSelectedValue().asString(); diff --git a/indra/newview/llfloaterwindlight.cpp b/indra/newview/llfloaterwindlight.cpp index ea6fda7303..c1b15c578c 100644 --- a/indra/newview/llfloaterwindlight.cpp +++ b/indra/newview/llfloaterwindlight.cpp @@ -749,12 +749,10 @@ bool LLFloaterWindLight::deleteAlertCallback(const LLSD& notification, const LLS LLComboBox* combo_box = getChild<LLComboBox>("WLPresetsCombo"); LLFloaterDayCycle* day_cycle = LLFloaterReg::findTypedInstance<LLFloaterDayCycle>("env_day_cycle"); LLComboBox* key_combo = NULL; - LLMultiSliderCtrl* mult_sldr = NULL; if (day_cycle) { key_combo = day_cycle->getChild<LLComboBox>("WLKeyPresets"); - mult_sldr = day_cycle->getChild<LLMultiSliderCtrl>("WLDayCycleKeys"); } std::string name(combo_box->getSelectedValue().asString()); diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp index f4d4ea3553..152360a96e 100644 --- a/indra/newview/llfloaterworldmap.cpp +++ b/indra/newview/llfloaterworldmap.cpp @@ -41,6 +41,7 @@ #include "llfloaterworldmap.h" #include "llagent.h" +#include "llagentcamera.h" #include "llbutton.h" #include "llcallingcard.h" #include "llcombobox.h" @@ -50,7 +51,9 @@ //#include "llfirstuse.h" #include "llfloaterreg.h" // getTypedInstance() #include "llfocusmgr.h" +#include "llinventoryfunctions.h" #include "llinventorymodel.h" +#include "llinventorymodelbackgroundfetch.h" #include "llinventoryobserver.h" #include "lllandmarklist.h" #include "lllineeditor.h" @@ -122,7 +125,7 @@ public: } // support the secondlife:///app/worldmap/{LOCATION}/{COORDS} SLapp - const std::string region_name = params[0].asString(); + const std::string region_name = LLURI::unescape(params[0].asString()); S32 x = (params.size() > 1) ? params[1].asInteger() : 128; S32 y = (params.size() > 2) ? params[2].asInteger() : 128; S32 z = (params.size() > 3) ? params[3].asInteger() : 0; @@ -321,7 +324,7 @@ void LLFloaterWorldMap::onOpen(const LLSD& key) // Start speculative download of landmarks const LLUUID landmark_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK); - gInventory.startBackgroundFetch(landmark_folder_id); + LLInventoryModelBackgroundFetch::instance().start(landmark_folder_id); childSetFocus("location", TRUE); gFocusMgr.triggerFocusFlash(); @@ -359,9 +362,7 @@ BOOL LLFloaterWorldMap::handleScrollWheel(S32 x, S32 y, S32 clicks) { if (!isMinimized() && isFrontmost()) { - LLRect area; - childGetRect("search_results", area); - if(!area.pointInRect(x, y)) + if(mPanel->pointInView(x, y)) { F32 slider_value = (F32)childGetValue("zoom slider").asReal(); slider_value += ((F32)clicks * -0.3333f); @@ -460,7 +461,7 @@ void LLFloaterWorldMap::draw() childSetEnabled("Teleport", (BOOL)tracking_status); // childSetEnabled("Clear", (BOOL)tracking_status); childSetEnabled("Show Destination", (BOOL)tracking_status || LLWorldMap::getInstance()->isTracking()); - childSetEnabled("copy_slurl", (mSLURL.size() > 0) ); + childSetEnabled("copy_slurl", (mSLURL.isValid()) ); setMouseOpaque(TRUE); getDragHandle()->setMouseOpaque(TRUE); @@ -659,14 +660,8 @@ void LLFloaterWorldMap::updateLocation() childSetValue("location", agent_sim_name); // Figure out where user is - LLVector3d agentPos = gAgent.getPositionGlobal(); - - S32 agent_x = llround( (F32)fmod( agentPos.mdV[VX], (F64)REGION_WIDTH_METERS ) ); - S32 agent_y = llround( (F32)fmod( agentPos.mdV[VY], (F64)REGION_WIDTH_METERS ) ); - S32 agent_z = llround( (F32)agentPos.mdV[VZ] ); - // Set the current SLURL - mSLURL = LLSLURL::buildSLURL(agent_sim_name, agent_x, agent_y, agent_z); + mSLURL = LLSLURL(agent_sim_name, gAgent.getPositionGlobal()); } } @@ -693,18 +688,15 @@ void LLFloaterWorldMap::updateLocation() } childSetValue("location", sim_name); - - F32 region_x = (F32)fmod( pos_global.mdV[VX], (F64)REGION_WIDTH_METERS ); - F32 region_y = (F32)fmod( pos_global.mdV[VY], (F64)REGION_WIDTH_METERS ); // simNameFromPosGlobal can fail, so don't give the user an invalid SLURL if ( gotSimName ) { - mSLURL = LLSLURL::buildSLURL(sim_name, llround(region_x), llround(region_y), llround((F32)pos_global.mdV[VZ])); + mSLURL = LLSLURL(sim_name, pos_global); } else { // Empty SLURL will disable the "Copy SLURL to clipboard" button - mSLURL = ""; + mSLURL = LLSLURL(); } } } @@ -788,8 +780,11 @@ void LLFloaterWorldMap::friendsChanged() if(avatar_id.notNull()) { LLCtrlSelectionInterface *iface = childGetSelectionInterface("friend combo"); - if(!iface || !iface->setCurrentByID(avatar_id) || - !t.getBuddyInfo(avatar_id)->isRightGrantedFrom(LLRelationship::GRANT_MAP_LOCATION) || gAgent.isGodlike()) + const LLRelationship* buddy_info = t.getBuddyInfo(avatar_id); + if(!iface || + !iface->setCurrentByID(avatar_id) || + (buddy_info && !buddy_info->isRightGrantedFrom(LLRelationship::GRANT_MAP_LOCATION)) || + gAgent.isGodlike()) { LLTracker::stopTracking(NULL); } @@ -1170,7 +1165,7 @@ void LLFloaterWorldMap::onClearBtn() mTrackedStatus = LLTracker::TRACKING_NOTHING; LLTracker::stopTracking((void *)(intptr_t)TRUE); LLWorldMap::getInstance()->cancelTracking(); - mSLURL = ""; // Clear the SLURL since it's invalid + mSLURL = LLSLURL(); // Clear the SLURL since it's invalid mSetToUserPosition = TRUE; // Revert back to the current user position } @@ -1193,10 +1188,10 @@ void LLFloaterWorldMap::onClickTeleportBtn() void LLFloaterWorldMap::onCopySLURL() { - getWindow()->copyTextToClipboard(utf8str_to_wstring(mSLURL)); + getWindow()->copyTextToClipboard(utf8str_to_wstring(mSLURL.getSLURLString())); LLSD args; - args["SLURL"] = mSLURL; + args["SLURL"] = mSLURL.getSLURLString(); LLNotificationsUtil::add("CopySLURL", args); } @@ -1219,12 +1214,12 @@ void LLFloaterWorldMap::centerOnTarget(BOOL animate) { // We've got the position finally, so we're no longer busy. JC // getWindow()->decBusyCount(); - pos_global = LLTracker::getTrackedPositionGlobal() - gAgent.getCameraPositionGlobal(); + pos_global = LLTracker::getTrackedPositionGlobal() - gAgentCamera.getCameraPositionGlobal(); } } else if(LLWorldMap::getInstance()->isTracking()) { - pos_global = LLWorldMap::getInstance()->getTrackedPositionGlobal() - gAgent.getCameraPositionGlobal();; + pos_global = LLWorldMap::getInstance()->getTrackedPositionGlobal() - gAgentCamera.getCameraPositionGlobal();; } else { diff --git a/indra/newview/llfloaterworldmap.h b/indra/newview/llfloaterworldmap.h index 00f5e788fb..52809ff830 100644 --- a/indra/newview/llfloaterworldmap.h +++ b/indra/newview/llfloaterworldmap.h @@ -43,6 +43,7 @@ #include "llhudtext.h" #include "llmapimagetype.h" #include "lltracker.h" +#include "llslurl.h" class LLEventInfo; class LLFriendObserver; @@ -183,7 +184,7 @@ private: LLTracker::ETrackingStatus mTrackedStatus; std::string mTrackedSimName; std::string mTrackedAvatarName; - std::string mSLURL; + LLSLURL mSLURL; }; extern LLFloaterWorldMap* gFloaterWorldMap; diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp index 5c65b2c293..f241d18a21 100644 --- a/indra/newview/llfolderview.cpp +++ b/indra/newview/llfolderview.cpp @@ -39,6 +39,7 @@ #include "llinventoryclipboard.h" // *TODO: remove this once hack below gone. #include "llinventoryfilter.h" #include "llinventoryfunctions.h" +#include "llinventorymodelbackgroundfetch.h" #include "llinventorypanel.h" #include "llfoldertype.h" #include "llfloaterinventory.h"// hacked in for the bonus context menu items. @@ -87,6 +88,10 @@ const S32 MIN_ITEM_WIDTH_VISIBLE = LLFolderViewItem::ICON_WIDTH + /*first few characters*/ 40; const S32 MINIMUM_RENAMER_WIDTH = 80; +// *TODO: move in params in xml if necessary. Requires modification of LLFolderView & LLInventoryPanel Params. +const S32 STATUS_TEXT_HPAD = 6; +const S32 STATUS_TEXT_VPAD = 8; + enum { SIGNAL_NO_KEYBOARD_FOCUS = 1, SIGNAL_KEYBOARD_FOCUS = 2 @@ -179,13 +184,15 @@ LLFolderView::LLFolderView(const Params& p) mSourceID(p.task_id), mRenameItem( NULL ), mNeedsScroll( FALSE ), + mEnableScroll( true ), + mUseLabelSuffix(p.use_label_suffix), mPinningSelectedItem(FALSE), mNeedsAutoSelect( FALSE ), mAutoSelectOverride(FALSE), mNeedsAutoRename(FALSE), mDebugFilters(FALSE), mSortOrder(LLInventoryFilter::SO_FOLDERS_BY_NAME), // This gets overridden by a pref immediately - mFilter( new LLInventoryFilter(p.name) ), + mFilter( new LLInventoryFilter(p.title) ), mShowSelectionContext(FALSE), mShowSingleSelection(FALSE), mArrangeGeneration(0), @@ -195,7 +202,8 @@ LLFolderView::LLFolderView(const Params& p) mCallbackRegistrar(NULL), mParentPanel(p.parent_panel), mUseEllipses(false), - mDraggingOverItem(NULL) + mDraggingOverItem(NULL), + mStatusTextBox(NULL) { LLRect rect = p.rect; LLRect new_rect(rect.mLeft, rect.mBottom + getRect().getHeight(), rect.mLeft + getRect().getWidth(), rect.mBottom); @@ -221,16 +229,38 @@ LLFolderView::LLFolderView(const Params& p) // Escape is handled by reverting the rename, not commiting it (default behavior) LLLineEditor::Params params; params.name("ren"); - params.rect(getRect()); + params.rect(rect); params.font(getLabelFontForStyle(LLFontGL::NORMAL)); params.max_length_bytes(DB_INV_ITEM_NAME_STR_LEN); params.commit_callback.function(boost::bind(&LLFolderView::commitRename, this, _2)); - params.prevalidate_callback(&LLLineEditor::prevalidateASCIIPrintableNoPipe); + params.prevalidate_callback(&LLTextValidate::validateASCIIPrintableNoPipe); params.commit_on_focus_lost(true); params.visible(false); mRenamer = LLUICtrlFactory::create<LLLineEditor> (params); addChild(mRenamer); + // Textbox + LLTextBox::Params text_p; + LLFontGL* font = getLabelFontForStyle(mLabelStyle); + LLRect new_r = LLRect(rect.mLeft + ICON_PAD, + rect.mTop - TEXT_PAD, + rect.mRight, + rect.mTop - TEXT_PAD - llfloor(font->getLineHeight())); + text_p.rect(new_r); + text_p.name(std::string(p.name)); + text_p.font(font); + text_p.visible(false); + text_p.allow_html(true); + text_p.wrap(true); // allow multiline text. See EXT-7564, EXT-7047 + // set text padding the same as in People panel. EXT-7047, EXT-4837 + text_p.h_pad(STATUS_TEXT_HPAD); + text_p.v_pad(STATUS_TEXT_VPAD); + mStatusTextBox = LLUICtrlFactory::create<LLTextBox> (text_p); + mStatusTextBox->setFollowsLeft(); + mStatusTextBox->setFollowsTop(); + //addChild(mStatusTextBox); + + // make the popup menu available LLMenuGL* menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_inventory.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); if (!menu) @@ -253,21 +283,14 @@ LLFolderView::~LLFolderView( void ) mScrollContainer = NULL; mRenameItem = NULL; mRenamer = NULL; - - if( gEditMenuHandler == this ) - { - gEditMenuHandler = NULL; - } + mStatusTextBox = NULL; mAutoOpenItems.removeAllNodes(); gIdleCallbacks.deleteFunction(idle, this); LLView::deleteViewByHandle(mPopupMenuHandle); - if(mRenamer == gFocusMgr.getTopCtrl()) - { - gFocusMgr.setTopCtrl(NULL); - } + gViewerWindow->removePopup(mRenamer); mAutoOpenItems.removeAllNodes(); clearSelection(); @@ -458,6 +481,13 @@ S32 LLFolderView::arrange( S32* unused_width, S32* unused_height, S32 filter_gen } } + if(!mHasVisibleChildren)// is there any filtered items ? + { + //Nope. We need to display status textbox, let's reserve some place for it + running_height = mStatusTextBox->getTextPixelHeight(); + target_height = running_height; + } + LLRect scroll_rect = mScrollContainer->getContentWindowRect(); reshape( llmax(scroll_rect.getWidth(), total_width), running_height ); @@ -814,30 +844,33 @@ void LLFolderView::sanitizeSelection() void LLFolderView::clearSelection() { - if (mSelectedItems.size() > 0) + for (selected_items_t::const_iterator item_it = mSelectedItems.begin(); + item_it != mSelectedItems.end(); + ++item_it) { - recursiveDeselect(FALSE); - mSelectedItems.clear(); + (*item_it)->setUnselected(); } + + mSelectedItems.clear(); mSelectThisID.setNull(); } -BOOL LLFolderView::getSelectionList(std::set<LLUUID> &selection) const +std::set<LLUUID> LLFolderView::getSelectionList() const { + std::set<LLUUID> selection; for (selected_items_t::const_iterator item_it = mSelectedItems.begin(); item_it != mSelectedItems.end(); ++item_it) { selection.insert((*item_it)->getListener()->getUUID()); } - - return (selection.size() != 0); + return selection; } BOOL LLFolderView::startDrag(LLToolDragAndDrop::ESource source) { std::vector<EDragAndDropType> types; - std::vector<LLUUID> cargo_ids; + uuid_vec_t cargo_ids; selected_items_t::iterator item_it; BOOL can_drag = TRUE; if (!mSelectedItems.empty()) @@ -874,7 +907,7 @@ void LLFolderView::draw() LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE ); } - LLFontGL* font = getLabelFontForStyle(mLabelStyle); + //LLFontGL* font = getLabelFontForStyle(mLabelStyle); // if cursor has moved off of me during drag and drop // close all auto opened folders @@ -911,19 +944,42 @@ void LLFolderView::draw() || mFilter->getShowFolderState() == LLInventoryFilter::SHOW_ALL_FOLDERS) { mStatusText.clear(); + mStatusTextBox->setVisible( FALSE ); } else { - if (gInventory.backgroundFetchActive() || mCompletedFilterGeneration < mFilter->getMinRequiredGeneration()) + if (LLInventoryModelBackgroundFetch::instance().backgroundFetchActive() || mCompletedFilterGeneration < mFilter->getMinRequiredGeneration()) { mStatusText = LLTrans::getString("Searching"); - font->renderUTF8(mStatusText, 0, 2, 1, sSearchStatusColor, LLFontGL::LEFT, LLFontGL::TOP, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE ); + //font->renderUTF8(mStatusText, 0, 2, 1, sSearchStatusColor, LLFontGL::LEFT, LLFontGL::TOP, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE ); } else { - mStatusText = LLTrans::getString(getFilter()->getEmptyLookupMessage()); - font->renderUTF8(mStatusText, 0, 2, 1, sSearchStatusColor, LLFontGL::LEFT, LLFontGL::TOP, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE ); + LLStringUtil::format_map_t args; + args["[SEARCH_TERM]"] = LLURI::escape(getFilter()->getFilterSubStringOrig()); + mStatusText = LLTrans::getString(getFilter()->getEmptyLookupMessage(), args); + //font->renderUTF8(mStatusText, 0, 2, 1, sSearchStatusColor, LLFontGL::LEFT, LLFontGL::TOP, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE ); } + mStatusTextBox->setValue(mStatusText); + mStatusTextBox->setVisible( TRUE ); + + // firstly reshape message textbox with current size. This is necessary to + // LLTextBox::getTextPixelHeight works properly + const LLRect local_rect = getLocalRect(); + mStatusTextBox->setShape(local_rect); + + // get preferable text height... + S32 pixel_height = mStatusTextBox->getTextPixelHeight(); + bool height_changed = local_rect.getHeight() != pixel_height; + if (height_changed) + { + // ... if it does not match current height, lets rearrange current view. + // This will indirectly call ::arrange and reshape of the status textbox. + // We should call this method to also notify parent about required rect. + // See EXT-7564, EXT-7047. + arrangeFromRoot(); + } + } LLFolderViewFolder::draw(); @@ -942,12 +998,11 @@ void LLFolderView::finishRenamingItem( void ) mRenameItem->rename( mRenamer->getText() ); } - gFocusMgr.setTopCtrl( NULL ); + gViewerWindow->removePopup(mRenamer); if( mRenameItem ) { setSelectionFromRoot( mRenameItem, TRUE ); - mRenameItem = NULL; } // List is re-sorted alphabeticly, so scroll to make sure the selected item is visible. @@ -959,7 +1014,7 @@ void LLFolderView::closeRenamer( void ) // will commit current name (which could be same as original name) mRenamer->setFocus( FALSE ); mRenamer->setVisible( FALSE ); - gFocusMgr.setTopCtrl( NULL ); + gViewerWindow->removePopup(mRenamer); if( mRenameItem ) { @@ -1389,9 +1444,9 @@ void LLFolderView::startRenamingSelectedItem( void ) mRenamer->setVisible( TRUE ); // set focus will fail unless item is visible mRenamer->setFocus( TRUE ); - mRenamer->setTopLostCallback(boost::bind(onRenamerLost, _1)); - mRenamer->setFocusLostCallback(boost::bind(onRenamerLost, _1)); - gFocusMgr.setTopCtrl( mRenamer ); + mRenamer->setTopLostCallback(boost::bind(&LLFolderView::onRenamerLost, this, _1)); + mRenamer->setFocusLostCallback(boost::bind(&LLFolderView::onRenamerLost, this, _1)); + gViewerWindow->addPopup(mRenamer); } } @@ -1607,7 +1662,11 @@ BOOL LLFolderView::handleKeyHere( KEY key, MASK mask ) LLFolderViewItem* parent_folder = last_selected->getParentFolder(); if (!last_selected->isOpen() && parent_folder && parent_folder->getParentFolder()) { - setSelection(parent_folder, FALSE, TRUE); + // Don't change selectin to hidden folder. See EXT-5328. + if (!parent_folder->getHidden()) + { + setSelection(parent_folder, FALSE, TRUE); + } } else { @@ -1711,6 +1770,8 @@ BOOL LLFolderView::handleMouseDown( S32 x, S32 y, MASK mask ) mParentPanel->setFocus(TRUE); + LLEditMenuHandler::gEditMenuHandler = this; + return LLView::handleMouseDown( x, y, mask ); } @@ -1795,7 +1856,9 @@ BOOL LLFolderView::handleRightMouseDown( S32 x, S32 y, MASK mask ) BOOL handled = childrenHandleRightMouseDown(x, y, mask) != NULL; S32 count = mSelectedItems.size(); LLMenuGL* menu = (LLMenuGL*)mPopupMenuHandle.get(); - if(handled && (count > 0) && menu) + if ( handled + && ( count > 0 && (hasVisibleChildren() || mFilter->getShowFolderState() == LLInventoryFilter::SHOW_ALL_FOLDERS) ) // show menu only if selected items are visible + && menu ) { if (mCallbackRegistrar) mCallbackRegistrar->pushScope(); @@ -1868,7 +1931,7 @@ void LLFolderView::deleteAllChildren() { if(mRenamer == gFocusMgr.getTopCtrl()) { - gFocusMgr.setTopCtrl(NULL); + gViewerWindow->removePopup(mRenamer); } LLView::deleteViewByHandle(mPopupMenuHandle); mPopupMenuHandle = LLHandle<LLView>(); @@ -1880,7 +1943,7 @@ void LLFolderView::deleteAllChildren() void LLFolderView::scrollToShowSelection() { - if (mSelectedItems.size()) + if (mEnableScroll && mSelectedItems.size()) { mNeedsScroll = TRUE; } @@ -2035,8 +2098,7 @@ bool LLFolderView::doToSelected(LLInventoryModel* model, const LLSD& userdata) } - std::set<LLUUID> selected_items; - getSelectionList(selected_items); + std::set<LLUUID> selected_items = getSelectionList(); LLMultiPreview* multi_previewp = NULL; LLMultiProperties* multi_propertiesp = NULL; @@ -2065,8 +2127,7 @@ bool LLFolderView::doToSelected(LLInventoryModel* model, const LLSD& userdata) if(!folder_item) continue; LLInvFVBridge* bridge = (LLInvFVBridge*)folder_item->getListener(); if(!bridge) continue; - - bridge->performAction(this, model, action); + bridge->performAction(model, action); } LLFloater::setFloaterHost(NULL); @@ -2130,6 +2191,15 @@ void LLFolderView::doIdle() LLSelectFirstFilteredItem filter; applyFunctorRecursively(filter); } + + // Open filtered folders for folder views with mAutoSelectOverride=TRUE. + // Used by LLPlacesFolderView. + if (mAutoSelectOverride && !mFilter->getFilterSubString().empty()) + { + LLOpenFilteredFolders filter; + applyFunctorRecursively(filter); + } + scrollToShowSelection(); } @@ -2266,7 +2336,7 @@ void LLFolderView::updateRenamerPosition() bool LLFolderView::selectFirstItem() { for (folders_t::iterator iter = mFolders.begin(); - iter != mFolders.end();) + iter != mFolders.end();++iter) { LLFolderViewFolder* folder = (*iter ); if (folder->getVisible()) @@ -2303,7 +2373,7 @@ bool LLFolderView::selectLastItem() } } for (folders_t::reverse_iterator iter = mFolders.rbegin(); - iter != mFolders.rend();) + iter != mFolders.rend();++iter) { LLFolderViewFolder* folder = (*iter); if (folder->getVisible()) @@ -2345,9 +2415,9 @@ S32 LLFolderView::notify(const LLSD& info) /// Local function definitions ///---------------------------------------------------------------------------- -//static void LLFolderView::onRenamerLost( LLFocusableElement* renamer) { + mRenameItem = NULL; LLUICtrl* uictrl = dynamic_cast<LLUICtrl*>(renamer); if (uictrl) { diff --git a/indra/newview/llfolderview.h b/indra/newview/llfolderview.h index 56ebdfcf79..55eb543f5f 100644 --- a/indra/newview/llfolderview.h +++ b/indra/newview/llfolderview.h @@ -62,6 +62,7 @@ class LLLineEditor; class LLMenuGL; class LLScrollContainer; class LLUICtrl; +class LLTextBox; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Class LLFolderViewFunctor @@ -92,8 +93,10 @@ class LLFolderView : public LLFolderViewFolder, public LLEditMenuHandler public: struct Params : public LLInitParam::Block<Params, LLFolderViewFolder::Params> { - Mandatory<LLPanel*> parent_panel; - Optional<LLUUID> task_id; + Mandatory<LLPanel*> parent_panel; + Optional<LLUUID> task_id; + Optional<std::string> title; + Optional<bool> use_label_suffix; }; LLFolderView(const Params&); virtual ~LLFolderView( void ); @@ -162,7 +165,7 @@ public: virtual S32 extendSelection(LLFolderViewItem* selection, LLFolderViewItem* last_selected, LLDynamicArray<LLFolderViewItem*>& items); - virtual BOOL getSelectionList(std::set<LLUUID> &selection) const; + virtual std::set<LLUUID> getSelectionList() const; // make sure if ancestor is selected, descendents are not void sanitizeSelection(); @@ -228,6 +231,7 @@ public: EAcceptance* accept, std::string& tooltip_msg); /*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE); + /*virtual*/ void onMouseLeave(S32 x, S32 y, MASK mask) { setShowSelectionContext(FALSE); } virtual void draw(); virtual void deleteAllChildren(); @@ -268,7 +272,9 @@ public: void dumpSelectionInformation(); virtual S32 notify(const LLSD& info) ; + void setEnableScroll(bool enable_scroll) { mEnableScroll = enable_scroll; } + bool useLabelSuffix() { return mUseLabelSuffix; } private: void updateRenamerPosition(); @@ -276,7 +282,7 @@ protected: LLScrollContainer* mScrollContainer; // NULL if this is not a child of a scroll container. void commitRename( const LLSD& data ); - static void onRenamerLost( LLFocusableElement* renamer); + void onRenamerLost( LLFocusableElement* renamer); void finishRenamingItem( void ); void closeRenamer( void ); @@ -299,11 +305,13 @@ protected: LLLineEditor* mRenamer; BOOL mNeedsScroll; + bool mEnableScroll; BOOL mPinningSelectedItem; LLRect mScrollConstraintRect; BOOL mNeedsAutoSelect; BOOL mAutoSelectOverride; BOOL mNeedsAutoRename; + bool mUseLabelSuffix; BOOL mDebugFilters; U32 mSortOrder; @@ -327,7 +335,7 @@ protected: LLUUID mSelectThisID; // if non null, select this item - LLPanel* mParentPanel; + LLPanel* mParentPanel; /** * Is used to determine if we need to cut text In LLFolderViewItem to avoid horizontal scroll. @@ -344,6 +352,8 @@ protected: public: static F32 sAutoOpenTime; + LLTextBox* mStatusTextBox; + }; bool sort_item_name(LLFolderViewItem* a, LLFolderViewItem* b); diff --git a/indra/newview/llfoldervieweventlistener.h b/indra/newview/llfoldervieweventlistener.h index 12e100caf4..82f8a10cf3 100644 --- a/indra/newview/llfoldervieweventlistener.h +++ b/indra/newview/llfoldervieweventlistener.h @@ -37,6 +37,7 @@ #include "llinventorytype.h" #include "llpermissionsflags.h" #include "llpointer.h" +#include "llwearabletype.h" class LLFolderViewItem; @@ -88,7 +89,8 @@ public: virtual BOOL isUpToDate() const = 0; virtual BOOL hasChildren() const = 0; virtual LLInventoryType::EType getInventoryType() const = 0; - virtual void performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) = 0; + virtual void performAction(LLInventoryModel* model, std::string action) = 0; + virtual LLWearableType::EType getWearableType() const = 0; // This method should be called when a drag begins. returns TRUE // if the drag can begin, otherwise FALSE. diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp index f154de39c9..50b35bfc69 100644 --- a/indra/newview/llfolderviewitem.cpp +++ b/indra/newview/llfolderviewitem.cpp @@ -38,6 +38,7 @@ #include "llfoldervieweventlistener.h" #include "llinventorybridge.h" // for LLItemBridge in LLInventorySort::operator() #include "llinventoryfilter.h" +#include "llinventorymodelbackgroundfetch.h" #include "llpanel.h" #include "llviewercontrol.h" // gSavedSettings #include "llviewerwindow.h" // Argh, only for setCursor() @@ -95,6 +96,7 @@ void LLFolderViewItem::cleanupClass() LLFolderViewItem::Params::Params() : icon(), icon_open(), + icon_overlay(), root(), listener(), folder_arrow_image("folder_arrow_image"), @@ -121,7 +123,6 @@ LLFolderViewItem::LLFolderViewItem(const LLFolderViewItem::Params& p) mHasVisibleChildren(FALSE), mIndentation(0), mItemHeight(p.item_height), - mNumDescendantsSelected(0), mPassedFilter(FALSE), mLastFilterGeneration(-1), mStringMatchOffset(std::string::npos), @@ -133,6 +134,7 @@ LLFolderViewItem::LLFolderViewItem(const LLFolderViewItem::Params& p) mCreationDate(p.creation_date), mIcon(p.icon), mIconOpen(p.icon_open), + mIconOverlay(p.icon_overlay), mListener(p.listener), mHidden(false), mShowLoadStatus(false) @@ -256,11 +258,30 @@ void LLFolderViewItem::refreshFromListener() // temporary attempt to display the inventory folder in the user locale. // mantipov: *NOTE: be sure this code is synchronized with LLFriendCardsManager::findChildFolderUUID // it uses the same way to find localized string - if (LLFolderType::lookupIsProtectedType(preferred_type)) + + // HACK: EXT - 6028 ([HARD CODED]? Inventory > Library > "Accessories" folder) + // Translation of Accessories folder in Library inventory folder + bool accessories = false; + if(mLabel == std::string("Accessories")) + { + //To ensure that Accessories folder is in Library we have to check its parent folder. + //Due to parent LLFolderViewFloder is not set to this item yet we have to check its parent via Inventory Model + LLInventoryCategory* cat = gInventory.getCategory(mListener->getUUID()); + if(cat) + { + const LLUUID& parent_folder_id = cat->getParentUUID(); + accessories = (parent_folder_id == gInventory.getLibraryRootFolderID()); + } + } + + //"Accessories" inventory category has folder type FT_NONE. So, this folder + //can not be detected as protected with LLFolderType::lookupIsProtectedType + if (accessories || LLFolderType::lookupIsProtectedType(preferred_type)) { LLTrans::findString(mLabel, "InvFolder " + mLabel); }; + setToolTip(mLabel); setIcon(mListener->getIcon()); time_t creation_date = mListener->getCreationDate(); if (mCreationDate != creation_date) @@ -268,8 +289,11 @@ void LLFolderViewItem::refreshFromListener() mCreationDate = mListener->getCreationDate(); dirtyFilter(); } - mLabelStyle = mListener->getLabelStyle(); - mLabelSuffix = mListener->getLabelSuffix(); + if (mRoot->useLabelSuffix()) + { + mLabelStyle = mListener->getLabelStyle(); + mLabelSuffix = mListener->getLabelSuffix(); + } } } @@ -368,6 +392,12 @@ void LLFolderViewItem::extendSelectionFromRoot(LLFolderViewItem* selection) getRoot()->extendSelection(selection, NULL, selected_items); } +std::set<LLUUID> LLFolderViewItem::getSelectionList() const +{ + std::set<LLUUID> selection; + return selection; +} + EInventorySortGroup LLFolderViewItem::getSortGroup() const { return SG_ITEM; @@ -418,11 +448,8 @@ S32 LLFolderViewItem::arrange( S32* width, S32* height, S32 filter_generation) S32 LLFolderViewItem::getItemHeight() { - if (mHidden) return 0; + if (getHidden()) return 0; - //S32 icon_height = mIcon->getHeight(); - //S32 label_height = llround(getLabelFontForStyle(mLabelStyle)->getLineHeight()); - //return llmax( icon_height, label_height ) + ICON_PAD; return mItemHeight; } @@ -497,22 +524,6 @@ BOOL LLFolderViewItem::changeSelection(LLFolderViewItem* selection, BOOL selecte return FALSE; } -void LLFolderViewItem::recursiveDeselect(BOOL deselect_self) -{ - if (mIsSelected && deselect_self) - { - mIsSelected = FALSE; - - // update ancestors' count of selected descendents - LLFolderViewFolder* parent_folder = getParentFolder(); - while(parent_folder) - { - parent_folder->mNumDescendantsSelected--; - parent_folder = parent_folder->getParentFolder(); - } - } -} - BOOL LLFolderViewItem::isMovable() { @@ -611,6 +622,7 @@ const std::string& LLFolderViewItem::getSearchableLabel() const LLViewerInventoryItem * LLFolderViewItem::getInventoryItem(void) { + if (!getListener()) return NULL; return gInventory.getItem(getListener()->getUUID()); } @@ -821,32 +833,39 @@ BOOL LLFolderViewItem::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, return handled; } - void LLFolderViewItem::draw() { - if (mHidden) return; + if (getHidden()) + { + return; + } static LLUIColor sFgColor = LLUIColorTable::instance().getColor("MenuItemEnabledColor", DEFAULT_WHITE); static LLUIColor sHighlightBgColor = LLUIColorTable::instance().getColor("MenuItemHighlightBgColor", DEFAULT_WHITE); static LLUIColor sHighlightFgColor = LLUIColorTable::instance().getColor("MenuItemHighlightFgColor", DEFAULT_WHITE); - static LLUIColor sFocusOutlineColor = - LLUIColorTable::instance().getColor("InventoryFocusOutlineColor", DEFAULT_WHITE); + static LLUIColor sFocusOutlineColor = LLUIColorTable::instance().getColor("InventoryFocusOutlineColor", DEFAULT_WHITE); static LLUIColor sFilterBGColor = LLUIColorTable::instance().getColor("FilterBackgroundColor", DEFAULT_WHITE); static LLUIColor sFilterTextColor = LLUIColorTable::instance().getColor("FilterTextColor", DEFAULT_WHITE); - static LLUIColor sSuffixColor = LLUIColorTable::instance().getColor("InventoryItemSuffixColor", DEFAULT_WHITE); + static LLUIColor sSuffixColor = LLUIColorTable::instance().getColor("InventoryItemColor", DEFAULT_WHITE); + static LLUIColor sLibraryColor = LLUIColorTable::instance().getColor("InventoryItemLibraryColor", DEFAULT_WHITE); + static LLUIColor sLinkColor = LLUIColorTable::instance().getColor("InventoryItemLinkColor", DEFAULT_WHITE); static LLUIColor sSearchStatusColor = LLUIColorTable::instance().getColor("InventorySearchStatusColor", DEFAULT_WHITE); const Params& default_params = LLUICtrlFactory::getDefaultParams<LLFolderViewItem>(); const S32 TOP_PAD = default_params.item_top_pad; + const S32 FOCUS_LEFT = 1; + const LLFontGL* font = getLabelFontForStyle(mLabelStyle); - bool possibly_has_children = false; - bool up_to_date = mListener && mListener->isUpToDate(); - if((up_to_date && hasVisibleChildren() ) || // we fetched our children and some of them have passed the filter... - (!up_to_date && mListener && mListener->hasChildren())) // ...or we know we have children but haven't fetched them (doesn't obey filter) - { - possibly_has_children = true; - } - if(/*mControlLabel[0] != '\0' && */possibly_has_children) + const BOOL in_inventory = getListener() && gInventory.isObjectDescendentOf(getListener()->getUUID(), gInventory.getRootFolderID()); + const BOOL in_library = getListener() && gInventory.isObjectDescendentOf(getListener()->getUUID(), gInventory.getLibraryRootFolderID()); + + //--------------------------------------------------------------------------------// + // Draw open folder arrow + // + const bool up_to_date = mListener && mListener->isUpToDate(); + const bool possibly_has_children = ((up_to_date && hasVisibleChildren()) || // we fetched our children and some of them have passed the filter... + (!up_to_date && mListener && mListener->hasChildren())); // ...or we know we have children but haven't fetched them (doesn't obey filter) + if (possibly_has_children) { LLUIImage* arrow_image = default_params.folder_arrow_image; gl_draw_scaled_rotated_image( @@ -854,22 +873,16 @@ void LLFolderViewItem::draw() ARROW_SIZE, ARROW_SIZE, mControlLabelRotation, arrow_image->getImage(), sFgColor); } - // See also LLFolderView::updateRenamerPosition() - F32 text_left = (F32)(ARROW_SIZE + TEXT_PAD + ICON_WIDTH + ICON_PAD + mIndentation); - - LLFontGL* font = getLabelFontForStyle(mLabelStyle); - // If we have keyboard focus, draw selection filled - BOOL show_context = getRoot()->getShowSelectionContext(); - BOOL filled = show_context || (getRoot()->getParentPanel()->hasFocus()); - const S32 FOCUS_LEFT = 1; - S32 focus_top = getRect().getHeight(); - S32 focus_bottom = getRect().getHeight() - mItemHeight; - bool folder_open = (getRect().getHeight() > mItemHeight + 4); - - // always render "current" item, only render other selected items if - // mShowSingleSelection is FALSE - if( mIsSelected ) + //--------------------------------------------------------------------------------// + // Draw highlight for selected items + // + const BOOL show_context = getRoot()->getShowSelectionContext(); + const BOOL filled = show_context || (getRoot()->getParentPanel()->hasFocus()); // If we have keyboard focus, draw selection filled + const S32 focus_top = getRect().getHeight(); + const S32 focus_bottom = getRect().getHeight() - mItemHeight; + const bool folder_open = (getRect().getHeight() > mItemHeight + 4); + if (mIsSelected) // always render "current" item. Only render other selected items if mShowSingleSelection is FALSE { gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); LLColor4 bg_color = sHighlightBgColor; @@ -888,152 +901,173 @@ void LLFolderViewItem::draw() bg_color.mV[VALPHA] = clamp_rescale(fade_time, 0.f, 0.4f, 0.f, bg_color.mV[VALPHA]); } } - - gl_rect_2d( - FOCUS_LEFT, - focus_top, - getRect().getWidth() - 2, - focus_bottom, - bg_color, filled); + gl_rect_2d(FOCUS_LEFT, + focus_top, + getRect().getWidth() - 2, + focus_bottom, + bg_color, filled); if (mIsCurSelection) { - gl_rect_2d( - FOCUS_LEFT, - focus_top, - getRect().getWidth() - 2, - focus_bottom, - sFocusOutlineColor, FALSE); + gl_rect_2d(FOCUS_LEFT, + focus_top, + getRect().getWidth() - 2, + focus_bottom, + sFocusOutlineColor, FALSE); } if (folder_open) { - gl_rect_2d( - FOCUS_LEFT, - focus_bottom + 1, // overlap with bottom edge of above rect - getRect().getWidth() - 2, - 0, - sFocusOutlineColor, FALSE); + gl_rect_2d(FOCUS_LEFT, + focus_bottom + 1, // overlap with bottom edge of above rect + getRect().getWidth() - 2, + 0, + sFocusOutlineColor, FALSE); if (show_context) { - gl_rect_2d( - FOCUS_LEFT, - focus_bottom + 1, - getRect().getWidth() - 2, - 0, - sHighlightBgColor, TRUE); + gl_rect_2d(FOCUS_LEFT, + focus_bottom + 1, + getRect().getWidth() - 2, + 0, + sHighlightBgColor, TRUE); } } } + + //--------------------------------------------------------------------------------// + // Draw DragNDrop highlight + // if (mDragAndDropTarget) { gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - gl_rect_2d( - FOCUS_LEFT, - focus_top, - getRect().getWidth() - 2, - focus_bottom, - sHighlightBgColor, FALSE); + gl_rect_2d(FOCUS_LEFT, + focus_top, + getRect().getWidth() - 2, + focus_bottom, + sHighlightBgColor, FALSE); if (folder_open) { - gl_rect_2d( - FOCUS_LEFT, - focus_bottom + 1, // overlap with bottom edge of above rect - getRect().getWidth() - 2, - 0, - sHighlightBgColor, FALSE); + gl_rect_2d(FOCUS_LEFT, + focus_bottom + 1, // overlap with bottom edge of above rect + getRect().getWidth() - 2, + 0, + sHighlightBgColor, FALSE); } mDragAndDropTarget = FALSE; } - S32 icon_x = mIndentation + ARROW_SIZE + TEXT_PAD; - // First case is used for open folders - if (!mIconOpen.isNull() && (llabs(mControlLabelRotation) > 80)) + const LLViewerInventoryItem *item = getInventoryItem(); + const BOOL highlight_link = mIconOverlay && item && item->getIsLinkType(); + //--------------------------------------------------------------------------------// + // Draw open icon + // + const S32 icon_x = mIndentation + ARROW_SIZE + TEXT_PAD; + if (!mIconOpen.isNull() && (llabs(mControlLabelRotation) > 80)) // For open folders { mIconOpen->draw(icon_x, getRect().getHeight() - mIconOpen->getHeight() - TOP_PAD + 1); } - else if(mIcon) + else if (mIcon) { mIcon->draw(icon_x, getRect().getHeight() - mIcon->getHeight() - TOP_PAD + 1); } - if (!mLabel.empty()) + if (highlight_link) { - // highlight filtered text - BOOL debug_filters = getRoot()->getDebugFilters(); - LLColor4 color = ( (mIsSelected && filled) ? sHighlightFgColor : sFgColor ); - F32 right_x; - F32 y = (F32)getRect().getHeight() - font->getLineHeight() - (F32)TEXT_PAD - (F32)TOP_PAD; - - if (debug_filters) - { - if (!getFiltered() && !possibly_has_children) - { - color.mV[VALPHA] *= 0.5f; - } + mIconOverlay->draw(icon_x, getRect().getHeight() - mIcon->getHeight() - TOP_PAD + 1); + } - LLColor4 filter_color = mLastFilterGeneration >= getRoot()->getFilter()->getCurrentGeneration() ? LLColor4(0.5f, 0.8f, 0.5f, 1.f) : LLColor4(0.8f, 0.5f, 0.5f, 1.f); - LLFontGL::getFontMonospace()->renderUTF8( - mStatusText, 0, text_left, y, filter_color, - LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, - S32_MAX, S32_MAX, &right_x, FALSE ); - text_left = right_x; - } + //--------------------------------------------------------------------------------// + // Exit if no label to draw + // + if (mLabel.empty()) + { + return; + } + LLColor4 color = (mIsSelected && filled) ? sHighlightFgColor : sFgColor; + if (highlight_link) color = sLinkColor; + if (in_library) color = sLibraryColor; - font->renderUTF8( mLabel, 0, text_left, y, color, - LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, - S32_MAX, getRect().getWidth() - (S32) text_left, &right_x, TRUE); + F32 right_x = 0; + F32 y = (F32)getRect().getHeight() - font->getLineHeight() - (F32)TEXT_PAD - (F32)TOP_PAD; + F32 text_left = (F32)(ARROW_SIZE + TEXT_PAD + ICON_WIDTH + ICON_PAD + mIndentation); -// LLViewerInventoryCategory *item = 0; -// if (getListener()) -// item = gInventory.getCategory(getListener()->getUUID()); - bool root_is_loading = false; - if (getListener() && gInventory.isObjectDescendentOf(getListener()->getUUID(),gInventory.getRootFolderID())) - { - // Descendent of my inventory. - root_is_loading = gInventory.myInventoryFetchInProgress(); - } - if (getListener() && gInventory.isObjectDescendentOf(getListener()->getUUID(),gInventory.getLibraryRootFolderID())) - { - // Descendent of library - root_is_loading = gInventory.libraryFetchInProgress(); - } - - if ( (mIsLoading && mTimeSinceRequestStart.getElapsedTimeF32() >= gSavedSettings.getF32("FolderLoadingMessageWaitTime")) - || (LLInventoryModel::backgroundFetchActive() && root_is_loading && mShowLoadStatus) ) + //--------------------------------------------------------------------------------// + // Highlight filtered text + // + if (getRoot()->getDebugFilters()) + { + if (!getFiltered() && !possibly_has_children) { - std::string load_string = " ( " + LLTrans::getString("LoadingData") + " ) "; - font->renderUTF8(load_string, 0, right_x, y, sSearchStatusColor, - LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, &right_x, FALSE); + color.mV[VALPHA] *= 0.5f; } + LLColor4 filter_color = mLastFilterGeneration >= getRoot()->getFilter()->getCurrentGeneration() ? + LLColor4(0.5f, 0.8f, 0.5f, 1.f) : + LLColor4(0.8f, 0.5f, 0.5f, 1.f); + LLFontGL::getFontMonospace()->renderUTF8(mStatusText, 0, text_left, y, filter_color, + LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, + S32_MAX, S32_MAX, &right_x, FALSE ); + text_left = right_x; + } + //--------------------------------------------------------------------------------// + // Draw the actual label text + // + font->renderUTF8(mLabel, 0, text_left, y, color, + LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, + S32_MAX, getRect().getWidth() - (S32) text_left, &right_x, TRUE); - if (!mLabelSuffix.empty()) - { - font->renderUTF8( mLabelSuffix, 0, right_x, y, sSuffixColor, - LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, - S32_MAX, S32_MAX, &right_x, FALSE ); - } + //--------------------------------------------------------------------------------// + // Draw "Loading..." text + // + bool root_is_loading = false; + if (in_inventory) + { + root_is_loading = LLInventoryModelBackgroundFetch::instance().inventoryFetchInProgress(); + } + if (in_library) + { + root_is_loading = LLInventoryModelBackgroundFetch::instance().libraryFetchInProgress(); + } + if ((mIsLoading && mTimeSinceRequestStart.getElapsedTimeF32() >= gSavedSettings.getF32("FolderLoadingMessageWaitTime")) || + (LLInventoryModelBackgroundFetch::instance().backgroundFetchActive() && root_is_loading && (mShowLoadStatus || mHidden))) + { + std::string load_string = " ( " + LLTrans::getString("LoadingData") + " ) "; + font->renderUTF8(load_string, 0, right_x, y, sSearchStatusColor, + LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, + S32_MAX, S32_MAX, &right_x, FALSE); + } + + //--------------------------------------------------------------------------------// + // Draw label suffix + // + if (!mLabelSuffix.empty()) + { + font->renderUTF8( mLabelSuffix, 0, right_x, y, sSuffixColor, + LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, + S32_MAX, S32_MAX, &right_x, FALSE ); + } - if (mStringMatchOffset != std::string::npos) + //--------------------------------------------------------------------------------// + // Highlight string match + // + if (mStringMatchOffset != std::string::npos) + { + // don't draw backgrounds for zero-length strings + S32 filter_string_length = getRoot()->getFilterSubString().size(); + if (filter_string_length > 0) { - // don't draw backgrounds for zero-length strings - S32 filter_string_length = getRoot()->getFilterSubString().size(); - if (filter_string_length > 0) - { - std::string combined_string = mLabel + mLabelSuffix; - S32 left = llround(text_left) + font->getWidth(combined_string, 0, mStringMatchOffset) - 1; - S32 right = left + font->getWidth(combined_string, mStringMatchOffset, filter_string_length) + 2; - S32 bottom = llfloor(getRect().getHeight() - font->getLineHeight() - 3 - TOP_PAD); - S32 top = getRect().getHeight() - TOP_PAD; + std::string combined_string = mLabel + mLabelSuffix; + S32 left = llround(text_left) + font->getWidth(combined_string, 0, mStringMatchOffset) - 1; + S32 right = left + font->getWidth(combined_string, mStringMatchOffset, filter_string_length) + 2; + S32 bottom = llfloor(getRect().getHeight() - font->getLineHeight() - 3 - TOP_PAD); + S32 top = getRect().getHeight() - TOP_PAD; - LLUIImage* box_image = default_params.selection_image; - LLRect box_rect(left, top, right, bottom); - box_image->draw(box_rect, sFilterBGColor); - F32 match_string_left = text_left + font->getWidthF32(combined_string, 0, mStringMatchOffset); - F32 yy = (F32)getRect().getHeight() - font->getLineHeight() - (F32)TEXT_PAD - (F32)TOP_PAD; - font->renderUTF8( combined_string, mStringMatchOffset, match_string_left, yy, - sFilterTextColor, LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, - filter_string_length, S32_MAX, &right_x, FALSE ); - } + LLUIImage* box_image = default_params.selection_image; + LLRect box_rect(left, top, right, bottom); + box_image->draw(box_rect, sFilterBGColor); + F32 match_string_left = text_left + font->getWidthF32(combined_string, 0, mStringMatchOffset); + F32 yy = (F32)getRect().getHeight() - font->getLineHeight() - (F32)TEXT_PAD - (F32)TOP_PAD; + font->renderUTF8( combined_string, mStringMatchOffset, match_string_left, yy, + sFilterTextColor, LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, + filter_string_length, S32_MAX, &right_x, FALSE ); } } } @@ -1044,20 +1078,21 @@ void LLFolderViewItem::draw() ///---------------------------------------------------------------------------- LLFolderViewFolder::LLFolderViewFolder( const LLFolderViewItem::Params& p ): -LLFolderViewItem( p ), // 0 = no create time -mIsOpen(FALSE), -mExpanderHighlighted(FALSE), -mCurHeight(0.f), -mTargetHeight(0.f), -mAutoOpenCountdown(0.f), -mSubtreeCreationDate(0), -mAmTrash(LLFolderViewFolder::UNKNOWN), -mLastArrangeGeneration( -1 ), -mLastCalculatedWidth(0), -mCompletedFilterGeneration(-1), -mMostFilteredDescendantGeneration(-1), -mNeedsSort(false) -{} + LLFolderViewItem( p ), // 0 = no create time + mIsOpen(FALSE), + mExpanderHighlighted(FALSE), + mCurHeight(0.f), + mTargetHeight(0.f), + mAutoOpenCountdown(0.f), + mSubtreeCreationDate(0), + mAmTrash(LLFolderViewFolder::UNKNOWN), + mLastArrangeGeneration( -1 ), + mLastCalculatedWidth(0), + mCompletedFilterGeneration(-1), + mMostFilteredDescendantGeneration(-1), + mNeedsSort(false) +{ +} // Destroys the object LLFolderViewFolder::~LLFolderViewFolder( void ) @@ -1315,7 +1350,7 @@ void LLFolderViewFolder::filter( LLInventoryFilter& filter) // when applying a filter, matching folders get their contents downloaded first if (filter.isNotDefault() && getFiltered(filter.getMinRequiredGeneration()) && (mListener && !gInventory.isCategoryComplete(mListener->getUUID()))) { - gInventory.startBackgroundFetch(mListener->getUUID()); + LLInventoryModelBackgroundFetch::instance().start(mListener->getUUID()); } // now query children @@ -1339,10 +1374,6 @@ void LLFolderViewFolder::filter( LLInventoryFilter& filter) if (folder->getFiltered() || folder->hasFilteredDescendants(filter.getMinRequiredGeneration())) { mMostFilteredDescendantGeneration = filter_generation; - if (getRoot()->needsAutoSelect() && autoopen_folders) - { - folder->setOpenArrangeRecursively(TRUE); - } } // just skip it, it has already been filtered continue; @@ -1463,7 +1494,6 @@ BOOL LLFolderViewFolder::setSelection(LLFolderViewItem* selection, BOOL openitem { rv = TRUE; child_selected = TRUE; - mNumDescendantsSelected++; } } for (items_t::iterator iter = mItems.begin(); @@ -1474,7 +1504,6 @@ BOOL LLFolderViewFolder::setSelection(LLFolderViewItem* selection, BOOL openitem { rv = TRUE; child_selected = TRUE; - mNumDescendantsSelected++; } } if(openitem && child_selected) @@ -1507,14 +1536,6 @@ BOOL LLFolderViewFolder::changeSelection(LLFolderViewItem* selection, folders_t::iterator fit = iter++; if((*fit)->changeSelection(selection, selected)) { - if (selected) - { - mNumDescendantsSelected++; - } - else - { - mNumDescendantsSelected--; - } rv = TRUE; } } @@ -1524,14 +1545,6 @@ BOOL LLFolderViewFolder::changeSelection(LLFolderViewItem* selection, items_t::iterator iit = iter++; if((*iit)->changeSelection(selection, selected)) { - if (selected) - { - mNumDescendantsSelected++; - } - else - { - mNumDescendantsSelected--; - } rv = TRUE; } } @@ -1548,7 +1561,6 @@ S32 LLFolderViewFolder::extendSelection(LLFolderViewItem* selection, LLFolderVie { folders_t::iterator fit = iter++; num_selected += (*fit)->extendSelection(selection, last_selected, selected_items); - mNumDescendantsSelected += num_selected; } // handle selection of our immediate children... @@ -1641,7 +1653,6 @@ S32 LLFolderViewFolder::extendSelection(LLFolderViewItem* selection, LLFolderVie if (item->changeSelection(item, TRUE)) { selected_items.put(item); - mNumDescendantsSelected++; num_selected++; } } @@ -1652,7 +1663,6 @@ S32 LLFolderViewFolder::extendSelection(LLFolderViewItem* selection, LLFolderVie if (selection->changeSelection(selection, TRUE)) { selected_items.put(selection); - mNumDescendantsSelected++; num_selected++; } } @@ -1660,47 +1670,6 @@ S32 LLFolderViewFolder::extendSelection(LLFolderViewItem* selection, LLFolderVie return num_selected; } -void LLFolderViewFolder::recursiveDeselect(BOOL deselect_self) -{ - // make sure we don't have negative values - llassert(mNumDescendantsSelected >= 0); - - if (mIsSelected && deselect_self) - { - mIsSelected = FALSE; - - // update ancestors' count of selected descendents - LLFolderViewFolder* parent_folder = getParentFolder(); - while(parent_folder) - { - parent_folder->mNumDescendantsSelected--; - parent_folder = parent_folder->getParentFolder(); - } - } - - if (0 == mNumDescendantsSelected) - { - return; - } - - for (items_t::iterator iter = mItems.begin(); - iter != mItems.end();) - { - items_t::iterator iit = iter++; - LLFolderViewItem* item = (*iit); - item->recursiveDeselect(TRUE); - } - - for (folders_t::iterator iter = mFolders.begin(); - iter != mFolders.end();) - { - folders_t::iterator fit = iter++; - LLFolderViewFolder* folder = (*fit); - folder->recursiveDeselect(TRUE); - } - -} - void LLFolderViewFolder::destroyView() { for (items_t::iterator iter = mItems.begin(); @@ -1734,8 +1703,6 @@ BOOL LLFolderViewFolder::removeItem(LLFolderViewItem* item) { if(item->remove()) { - //RN: this seem unneccessary as remove() moves to trash - //removeView(item); return TRUE; } return FALSE; @@ -1750,7 +1717,6 @@ void LLFolderViewFolder::removeView(LLFolderViewItem* item) return; } // deselect without traversing hierarchy - item->recursiveDeselect(TRUE); getRoot()->removeFromSelectionList(item); extractItem(item); delete item; @@ -1859,10 +1825,9 @@ EInventorySortGroup LLFolderViewFolder::getSortGroup() const return SG_TRASH_FOLDER; } - // Folders that can't be moved are 'system' folders. if( mListener ) { - if( !(mListener->isItemMovable()) ) + if(LLFolderType::lookupIsProtectedType(mListener->getPreferredType())) { return SG_SYSTEM_FOLDER; } @@ -2548,8 +2513,12 @@ bool LLInventorySort::operator()(const LLFolderViewItem* const& a, const LLFolde { // *TODO: mantipov: probably it is better to add an appropriate method to LLFolderViewItem // or to LLInvFVBridge - S32 a_sort = (static_cast<const LLItemBridge*>(a->getListener()))->getItem()->getSortField(); - S32 b_sort = (static_cast<const LLItemBridge*>(b->getListener()))->getItem()->getSortField(); + LLViewerInventoryItem* aitem = (static_cast<const LLItemBridge*>(a->getListener()))->getItem(); + LLViewerInventoryItem* bitem = (static_cast<const LLItemBridge*>(b->getListener()))->getItem(); + if (!aitem || !bitem) + return false; + S32 a_sort = aitem->getSortField(); + S32 b_sort = bitem->getSortField(); return a_sort < b_sort; } } diff --git a/indra/newview/llfolderviewitem.h b/indra/newview/llfolderviewitem.h index be8e73a5a9..d6e4b2f556 100644 --- a/indra/newview/llfolderviewitem.h +++ b/indra/newview/llfolderviewitem.h @@ -97,6 +97,7 @@ public: { Optional<LLUIImage*> icon; Optional<LLUIImage*> icon_open; // used for folders + Optional<LLUIImage*> icon_overlay; // for links Optional<LLFolderView*> root; Optional<LLFolderViewEventListener*> listener; @@ -147,10 +148,10 @@ protected: LLUIImagePtr mIcon; std::string mStatusText; LLUIImagePtr mIconOpen; + LLUIImagePtr mIconOverlay; BOOL mHasVisibleChildren; S32 mIndentation; S32 mItemHeight; - S32 mNumDescendantsSelected; BOOL mPassedFilter; S32 mLastFilterGeneration; std::string::size_type mStringMatchOffset; @@ -231,11 +232,8 @@ public: // this method is used to group select items virtual S32 extendSelection(LLFolderViewItem* selection, LLFolderViewItem* last_selected, LLDynamicArray<LLFolderViewItem*>& items){ return FALSE; } - // this method is used to group select items - virtual void recursiveDeselect(BOOL deselect_self); - // gets multiple-element selection - virtual BOOL getSelectionList(std::set<LLUUID> &selection) const {return TRUE;} + virtual std::set<LLUUID> getSelectionList() const; // Returns true is this object and all of its children can be removed (deleted by user) virtual BOOL isRemovable(); @@ -246,10 +244,10 @@ public: // destroys this item recursively virtual void destroyView(); - S32 getNumSelectedDescendants() { return mNumDescendantsSelected; } - BOOL isSelected() { return mIsSelected; } + void setUnselected() { mIsSelected = FALSE; } + void setIsCurSelection(BOOL select) { mIsCurSelection = select; } BOOL getIsCurSelection() { return mIsCurSelection; } @@ -441,8 +439,6 @@ public: // this method is used to group select items virtual S32 extendSelection(LLFolderViewItem* selection, LLFolderViewItem* last_selected, LLDynamicArray<LLFolderViewItem*>& items); - virtual void recursiveDeselect(BOOL deselect_self); - // Returns true is this object and all of its children can be removed. virtual BOOL isRemovable(); diff --git a/indra/newview/llfriendcard.cpp b/indra/newview/llfriendcard.cpp index ac060cef15..7f28e09933 100644 --- a/indra/newview/llfriendcard.cpp +++ b/indra/newview/llfriendcard.cpp @@ -33,6 +33,7 @@ #include "llviewerprecompiledheaders.h" #include "llinventory.h" +#include "llinventoryfunctions.h" #include "llinventoryobserver.h" #include "lltrans.h" @@ -44,24 +45,28 @@ // Constants; -static const std::string INVENTORY_STRING_FRIENDS_SUBFOLDER = "InvFolder Friends"; -static const std::string INVENTORY_STRING_FRIENDS_ALL_SUBFOLDER = "InvFolder All"; +static const std::string INVENTORY_STRING_FRIENDS_SUBFOLDER = "Friends"; +static const std::string INVENTORY_STRING_FRIENDS_ALL_SUBFOLDER = "All"; // helper functions -// NOTE: Usage of LLTrans::getString(); in next two functions to set localized -// folders' names is caused by a hack in the LLFolderViewItem::refreshFromListener() -// method for protected asset types. -// So, localized names will be got from the strings with "InvFolder LABEL_NAME" -// in the strings.xml +// NOTE: For now Friends & All folders are created as protected folders of the LLFolderType::FT_CALLINGCARD type. +// So, their names will be processed in the LLFolderViewItem::refreshFromListener() to be localized +// using "InvFolder LABEL_NAME" as LLTrans::findString argument. + +// We must use in this file their hard-coded names to ensure found them on different locales. EXT-5829. +// These hard-coded names will be stored in InventoryItems but shown localized in FolderViewItems + +// If hack in the LLFolderViewItem::refreshFromListener() to localize protected folder is removed +// or these folders are not protected these names should be localized in another place/way. inline const std::string get_friend_folder_name() { - return LLTrans::getString(INVENTORY_STRING_FRIENDS_SUBFOLDER); + return INVENTORY_STRING_FRIENDS_SUBFOLDER; } inline const std::string get_friend_all_subfolder_name() { - return LLTrans::getString(INVENTORY_STRING_FRIENDS_ALL_SUBFOLDER); + return INVENTORY_STRING_FRIENDS_ALL_SUBFOLDER; } void move_from_to_arrays(LLInventoryModel::cat_array_t& from, LLInventoryModel::cat_array_t& to) @@ -106,8 +111,11 @@ class LLInitialFriendCardsFetch : public LLInventoryFetchDescendentsObserver public: typedef boost::function<void()> callback_t; - LLInitialFriendCardsFetch(callback_t cb) - : mCheckFolderCallback(cb) {} + LLInitialFriendCardsFetch(const LLUUID& folder_id, + callback_t cb) : + LLInventoryFetchDescendentsObserver(folder_id), + mCheckFolderCallback(cb) + {} /* virtual */ void done(); @@ -318,7 +326,7 @@ void LLFriendCardsManager::collectFriendsLists(folderid_buddies_map_t& folderBud if (NULL == items) continue; - std::vector<LLUUID> buddyUUIDs; + uuid_vec_t buddyUUIDs; for (itBuddy = items->begin(); itBuddy != items->end(); ++itBuddy) { buddyUUIDs.push_back((*itBuddy)->getCreatorUUID()); @@ -350,9 +358,9 @@ const LLUUID& LLFriendCardsManager::findFriendAllSubfolderUUIDImpl() const return findChildFolderUUID(friendFolderUUID, friendAllSubfolderName); } -const LLUUID& LLFriendCardsManager::findChildFolderUUID(const LLUUID& parentFolderUUID, const std::string& localizedName) const +const LLUUID& LLFriendCardsManager::findChildFolderUUID(const LLUUID& parentFolderUUID, const std::string& nonLocalizedName) const { - LLNameCategoryCollector matchFolderFunctor(localizedName); + LLNameCategoryCollector matchFolderFunctor(nonLocalizedName); return get_folder_uuid(parentFolderUUID, matchFolderFunctor); } @@ -403,13 +411,9 @@ void LLFriendCardsManager::findMatchedFriendCards(const LLUUID& avatarID, LLInve void LLFriendCardsManager::fetchAndCheckFolderDescendents(const LLUUID& folder_id, callback_t cb) { // This instance will be deleted in LLInitialFriendCardsFetch::done(). - LLInitialFriendCardsFetch* fetch = new LLInitialFriendCardsFetch(cb); - - LLInventoryFetchDescendentsObserver::folder_ref_t folders; - folders.push_back(folder_id); - - fetch->fetchDescendents(folders); - if(fetch->isEverythingComplete()) + LLInitialFriendCardsFetch* fetch = new LLInitialFriendCardsFetch(folder_id, cb); + fetch->startFetch(); + if(fetch->isFinished()) { // everything is already here - call done. fetch->done(); diff --git a/indra/newview/llfriendcard.h b/indra/newview/llfriendcard.h index b94d5ec2c0..638a1eca84 100644 --- a/indra/newview/llfriendcard.h +++ b/indra/newview/llfriendcard.h @@ -49,7 +49,7 @@ class LLFriendCardsManager friend class CreateFriendCardCallback; public: - typedef std::map<LLUUID, std::vector<LLUUID> > folderid_buddies_map_t; + typedef std::map<LLUUID, uuid_vec_t > folderid_buddies_map_t; // LLFriendObserver implementation void changed(U32 mask) @@ -120,7 +120,7 @@ private: return (mBuddyIDSet.end() != mBuddyIDSet.find(avatarID)); } - const LLUUID& findChildFolderUUID(const LLUUID& parentFolderUUID, const std::string& localizedName) const; + const LLUUID& findChildFolderUUID(const LLUUID& parentFolderUUID, const std::string& nonLocalizedName) const; const LLUUID& findFriendFolderUUIDImpl() const; const LLUUID& findFriendAllSubfolderUUIDImpl() const; const LLUUID& findFriendCardInventoryUUIDImpl(const LLUUID& avatarID); diff --git a/indra/newview/llgesturemgr.cpp b/indra/newview/llgesturemgr.cpp index 0ba7bdf613..6ffd534a53 100644 --- a/indra/newview/llgesturemgr.cpp +++ b/indra/newview/llgesturemgr.cpp @@ -67,19 +67,18 @@ static const LLUUID& get_linked_uuid(const LLUUID& item_id); // Lightweight constructor. // init() does the heavy lifting. -LLGestureManager::LLGestureManager() +LLGestureMgr::LLGestureMgr() : mValid(FALSE), mPlaying(), mActive(), mLoadingCount(0) { - mRetryIfMissing = true; gInventory.addObserver(this); } // We own the data for gestures, so clean them up. -LLGestureManager::~LLGestureManager() +LLGestureMgr::~LLGestureMgr() { item_map_t::iterator it; for (it = mActive.begin(); it != mActive.end(); ++it) @@ -93,14 +92,14 @@ LLGestureManager::~LLGestureManager() } -void LLGestureManager::init() +void LLGestureMgr::init() { // TODO } -void LLGestureManager::changed(U32 mask) +void LLGestureMgr::changed(U32 mask) { - LLInventoryFetchObserver::changed(mask); + LLInventoryFetchItemsObserver::changed(mask); if (mask & LLInventoryObserver::GESTURE) { @@ -136,10 +135,12 @@ void LLGestureManager::changed(U32 mask) // Use this version when you have the item_id but not the asset_id, // and you KNOW the inventory is loaded. -void LLGestureManager::activateGesture(const LLUUID& item_id) +void LLGestureMgr::activateGesture(const LLUUID& item_id) { LLViewerInventoryItem* item = gInventory.getItem(item_id); if (!item) return; + if (item->getType() != LLAssetType::AT_GESTURE) + return; LLUUID asset_id = item->getAssetUUID(); @@ -152,7 +153,7 @@ void LLGestureManager::activateGesture(const LLUUID& item_id) } -void LLGestureManager::activateGestures(LLViewerInventoryItem::item_array_t& items) +void LLGestureMgr::activateGestures(LLViewerInventoryItem::item_array_t& items) { // Load up the assets S32 count = 0; @@ -248,7 +249,7 @@ struct LLLoadInfo /** * It will load a gesture from remote storage */ -void LLGestureManager::activateGestureWithAsset(const LLUUID& item_id, +void LLGestureMgr::activateGestureWithAsset(const LLUUID& item_id, const LLUUID& asset_id, BOOL inform_server, BOOL deactivate_similar) @@ -257,7 +258,7 @@ void LLGestureManager::activateGestureWithAsset(const LLUUID& item_id, if( !gAssetStorage ) { - llwarns << "LLGestureManager::activateGestureWithAsset without valid gAssetStorage" << llendl; + llwarns << "LLGestureMgr::activateGestureWithAsset without valid gAssetStorage" << llendl; return; } // If gesture is already active, nothing to do. @@ -299,7 +300,7 @@ void LLGestureManager::activateGestureWithAsset(const LLUUID& item_id, } -void LLGestureManager::deactivateGesture(const LLUUID& item_id) +void LLGestureMgr::deactivateGesture(const LLUUID& item_id) { const LLUUID& base_item_id = get_linked_uuid(item_id); item_map_t::iterator it = mActive.find(base_item_id); @@ -338,16 +339,16 @@ void LLGestureManager::deactivateGesture(const LLUUID& item_id) gAgent.sendReliableMessage(); - LLAppearanceManager::instance().removeCOFItemLinks(base_item_id, false); + LLAppearanceMgr::instance().removeCOFItemLinks(base_item_id, false); notifyObservers(); } -void LLGestureManager::deactivateSimilarGestures(LLMultiGesture* in, const LLUUID& in_item_id) +void LLGestureMgr::deactivateSimilarGestures(LLMultiGesture* in, const LLUUID& in_item_id) { const LLUUID& base_in_item_id = get_linked_uuid(in_item_id); - std::vector<LLUUID> gest_item_ids; + uuid_vec_t gest_item_ids; // Deactivate all gestures that match item_map_t::iterator it; @@ -386,7 +387,7 @@ void LLGestureManager::deactivateSimilarGestures(LLMultiGesture* in, const LLUUI // Inform database of the change LLMessageSystem* msg = gMessageSystem; BOOL start_message = TRUE; - std::vector<LLUUID>::const_iterator vit = gest_item_ids.begin(); + uuid_vec_t::const_iterator vit = gest_item_ids.begin(); while (vit != gest_item_ids.end()) { if (start_message) @@ -431,7 +432,7 @@ void LLGestureManager::deactivateSimilarGestures(LLMultiGesture* in, const LLUUI } -BOOL LLGestureManager::isGestureActive(const LLUUID& item_id) +BOOL LLGestureMgr::isGestureActive(const LLUUID& item_id) { const LLUUID& base_item_id = get_linked_uuid(item_id); item_map_t::iterator it = mActive.find(base_item_id); @@ -439,7 +440,7 @@ BOOL LLGestureManager::isGestureActive(const LLUUID& item_id) } -BOOL LLGestureManager::isGesturePlaying(const LLUUID& item_id) +BOOL LLGestureMgr::isGesturePlaying(const LLUUID& item_id) { const LLUUID& base_item_id = get_linked_uuid(item_id); @@ -452,7 +453,7 @@ BOOL LLGestureManager::isGesturePlaying(const LLUUID& item_id) return gesture->mPlaying; } -BOOL LLGestureManager::isGesturePlaying(LLMultiGesture* gesture) +BOOL LLGestureMgr::isGesturePlaying(LLMultiGesture* gesture) { if(!gesture) { @@ -462,7 +463,7 @@ BOOL LLGestureManager::isGesturePlaying(LLMultiGesture* gesture) return gesture->mPlaying; } -void LLGestureManager::replaceGesture(const LLUUID& item_id, LLMultiGesture* new_gesture, const LLUUID& asset_id) +void LLGestureMgr::replaceGesture(const LLUUID& item_id, LLMultiGesture* new_gesture, const LLUUID& asset_id) { const LLUUID& base_item_id = get_linked_uuid(item_id); @@ -504,11 +505,11 @@ void LLGestureManager::replaceGesture(const LLUUID& item_id, LLMultiGesture* new notifyObservers(); } -void LLGestureManager::replaceGesture(const LLUUID& item_id, const LLUUID& new_asset_id) +void LLGestureMgr::replaceGesture(const LLUUID& item_id, const LLUUID& new_asset_id) { const LLUUID& base_item_id = get_linked_uuid(item_id); - item_map_t::iterator it = LLGestureManager::instance().mActive.find(base_item_id); + item_map_t::iterator it = LLGestureMgr::instance().mActive.find(base_item_id); if (it == mActive.end()) { llwarns << "replaceGesture for inactive gesture " << base_item_id << llendl; @@ -517,10 +518,10 @@ void LLGestureManager::replaceGesture(const LLUUID& item_id, const LLUUID& new_a // mActive owns this gesture pointer, so clean up memory. LLMultiGesture* gesture = (*it).second; - LLGestureManager::instance().replaceGesture(base_item_id, gesture, new_asset_id); + LLGestureMgr::instance().replaceGesture(base_item_id, gesture, new_asset_id); } -void LLGestureManager::playGesture(LLMultiGesture* gesture) +void LLGestureMgr::playGesture(LLMultiGesture* gesture) { if (!gesture) return; @@ -539,7 +540,7 @@ void LLGestureManager::playGesture(LLMultiGesture* gesture) // Convenience function that looks up the item_id for you. -void LLGestureManager::playGesture(const LLUUID& item_id) +void LLGestureMgr::playGesture(const LLUUID& item_id) { const LLUUID& base_item_id = get_linked_uuid(item_id); @@ -556,7 +557,7 @@ void LLGestureManager::playGesture(const LLUUID& item_id) // Iterates through space delimited tokens in string, triggering any gestures found. // Generates a revised string that has the found tokens replaced by their replacement strings // and (as a minor side effect) has multiple spaces in a row replaced by single spaces. -BOOL LLGestureManager::triggerAndReviseString(const std::string &utf8str, std::string* revised_string) +BOOL LLGestureMgr::triggerAndReviseString(const std::string &utf8str, std::string* revised_string) { std::string tokenized = utf8str; @@ -649,7 +650,7 @@ BOOL LLGestureManager::triggerAndReviseString(const std::string &utf8str, std::s } -BOOL LLGestureManager::triggerGesture(KEY key, MASK mask) +BOOL LLGestureMgr::triggerGesture(KEY key, MASK mask) { std::vector <LLMultiGesture *> matching; item_map_t::iterator it; @@ -683,7 +684,7 @@ BOOL LLGestureManager::triggerGesture(KEY key, MASK mask) } -S32 LLGestureManager::getPlayingCount() const +S32 LLGestureMgr::getPlayingCount() const { return mPlaying.size(); } @@ -697,7 +698,7 @@ struct IsGesturePlaying : public std::unary_function<LLMultiGesture*, bool> } }; -void LLGestureManager::update() +void LLGestureMgr::update() { S32 i; for (i = 0; i < (S32)mPlaying.size(); ++i) @@ -740,14 +741,13 @@ void LLGestureManager::update() // Run all steps until you're either done or hit a wait. -void LLGestureManager::stepGesture(LLMultiGesture* gesture) +void LLGestureMgr::stepGesture(LLMultiGesture* gesture) { if (!gesture) { return; } - LLVOAvatar* avatar = gAgent.getAvatarObject(); - if (!avatar) return; + if (!isAgentAvatarValid()) return; // Of the ones that started playing, have any stopped? @@ -758,8 +758,8 @@ void LLGestureManager::stepGesture(LLMultiGesture* gesture) { // look in signaled animations (simulator's view of what is // currently playing. - LLVOAvatar::AnimIterator play_it = avatar->mSignaledAnimations.find(*gest_it); - if (play_it != avatar->mSignaledAnimations.end()) + LLVOAvatar::AnimIterator play_it = gAgentAvatarp->mSignaledAnimations.find(*gest_it); + if (play_it != gAgentAvatarp->mSignaledAnimations.end()) { ++gest_it; } @@ -777,8 +777,8 @@ void LLGestureManager::stepGesture(LLMultiGesture* gesture) gest_it != gesture->mRequestedAnimIDs.end(); ) { - LLVOAvatar::AnimIterator play_it = avatar->mSignaledAnimations.find(*gest_it); - if (play_it != avatar->mSignaledAnimations.end()) + LLVOAvatar::AnimIterator play_it = gAgentAvatarp->mSignaledAnimations.find(*gest_it); + if (play_it != gAgentAvatarp->mSignaledAnimations.end()) { // Hooray, this animation has started playing! // Copy into playing. @@ -888,7 +888,7 @@ void LLGestureManager::stepGesture(LLMultiGesture* gesture) } -void LLGestureManager::runStep(LLMultiGesture* gesture, LLGestureStep* step) +void LLGestureMgr::runStep(LLMultiGesture* gesture, LLGestureStep* step) { switch(step->getType()) { @@ -975,7 +975,7 @@ void LLGestureManager::runStep(LLMultiGesture* gesture, LLGestureStep* step) // static -void LLGestureManager::onLoadComplete(LLVFS *vfs, +void LLGestureMgr::onLoadComplete(LLVFS *vfs, const LLUUID& asset_uuid, LLAssetType::EType type, void* user_data, S32 status, LLExtStat ext_status) @@ -988,7 +988,7 @@ void LLGestureManager::onLoadComplete(LLVFS *vfs, delete info; info = NULL; - LLGestureManager& self = LLGestureManager::instance(); + LLGestureMgr& self = LLGestureMgr::instance(); self.mLoadingCount--; if (0 == status) @@ -1032,9 +1032,8 @@ void LLGestureManager::onLoadComplete(LLVFS *vfs, else { // Watch this item and set gesture name when item exists in inventory - item_ref_t ids; - ids.push_back(item_id); - self.fetchItems(ids); + self.setFetchID(item_id); + self.startFetch(); } self.mActive[item_id] = gesture; @@ -1094,12 +1093,12 @@ void LLGestureManager::onLoadComplete(LLVFS *vfs, llwarns << "Problem loading gesture: " << status << llendl; - LLGestureManager::instance().mActive.erase(item_id); + LLGestureMgr::instance().mActive.erase(item_id); } } -void LLGestureManager::stopGesture(LLMultiGesture* gesture) +void LLGestureMgr::stopGesture(LLMultiGesture* gesture) { if (!gesture) return; @@ -1139,7 +1138,7 @@ void LLGestureManager::stopGesture(LLMultiGesture* gesture) } -void LLGestureManager::stopGesture(const LLUUID& item_id) +void LLGestureMgr::stopGesture(const LLUUID& item_id) { const LLUUID& base_item_id = get_linked_uuid(item_id); @@ -1153,12 +1152,12 @@ void LLGestureManager::stopGesture(const LLUUID& item_id) } -void LLGestureManager::addObserver(LLGestureManagerObserver* observer) +void LLGestureMgr::addObserver(LLGestureManagerObserver* observer) { mObservers.push_back(observer); } -void LLGestureManager::removeObserver(LLGestureManagerObserver* observer) +void LLGestureMgr::removeObserver(LLGestureManagerObserver* observer) { std::vector<LLGestureManagerObserver*>::iterator it; it = std::find(mObservers.begin(), mObservers.end(), observer); @@ -1171,9 +1170,9 @@ void LLGestureManager::removeObserver(LLGestureManagerObserver* observer) // Call this method when it's time to update everyone on a new state. // Copy the list because an observer could respond by removing itself // from the list. -void LLGestureManager::notifyObservers() +void LLGestureMgr::notifyObservers() { - lldebugs << "LLGestureManager::notifyObservers" << llendl; + lldebugs << "LLGestureMgr::notifyObservers" << llendl; std::vector<LLGestureManagerObserver*> observers = mObservers; @@ -1185,7 +1184,7 @@ void LLGestureManager::notifyObservers() } } -BOOL LLGestureManager::matchPrefix(const std::string& in_str, std::string* out_str) +BOOL LLGestureMgr::matchPrefix(const std::string& in_str, std::string* out_str) { S32 in_len = in_str.length(); @@ -1216,7 +1215,7 @@ BOOL LLGestureManager::matchPrefix(const std::string& in_str, std::string* out_s } -void LLGestureManager::getItemIDs(std::vector<LLUUID>* ids) +void LLGestureMgr::getItemIDs(uuid_vec_t* ids) { item_map_t::const_iterator it; for (it = mActive.begin(); it != mActive.end(); ++it) @@ -1225,7 +1224,7 @@ void LLGestureManager::getItemIDs(std::vector<LLUUID>* ids) } } -void LLGestureManager::done() +void LLGestureMgr::done() { bool notify = false; for(item_map_t::iterator it = mActive.begin(); it != mActive.end(); ++it) diff --git a/indra/newview/llgesturemgr.h b/indra/newview/llgesturemgr.h index 3dd184ddc7..5f2c3e2d61 100644 --- a/indra/newview/llgesturemgr.h +++ b/indra/newview/llgesturemgr.h @@ -54,7 +54,7 @@ public: virtual void changed() = 0; }; -class LLGestureManager : public LLSingleton<LLGestureManager>, public LLInventoryFetchObserver +class LLGestureMgr : public LLSingleton<LLGestureMgr>, public LLInventoryFetchItemsObserver { public: @@ -63,8 +63,8 @@ public: typedef std::map<LLUUID, LLMultiGesture*> item_map_t; typedef std::map<LLUUID, gesture_loaded_callback_t> callback_map_t; - LLGestureManager(); - ~LLGestureManager(); + LLGestureMgr(); + ~LLGestureMgr(); void init(); @@ -146,7 +146,7 @@ public: BOOL matchPrefix(const std::string& in_str, std::string* out_str); // Copy item ids into the vector - void getItemIDs(std::vector<LLUUID>* ids); + void getItemIDs(uuid_vec_t* ids); protected: // Handle the processing of a single gesture diff --git a/indra/newview/llgiveinventory.cpp b/indra/newview/llgiveinventory.cpp new file mode 100644 index 0000000000..6470e9d6fe --- /dev/null +++ b/indra/newview/llgiveinventory.cpp @@ -0,0 +1,553 @@ +/** + * @file llgiveinventory.cpp + * @brief LLGiveInventory class implementation + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" +#include "llgiveinventory.h" + +// library includes +#include "llnotificationsutil.h" +#include "lltrans.h" + +// newview includes +#include "llagent.h" +#include "llagentdata.h" +#include "llagentui.h" +#include "llagentwearables.h" +#include "llfloatertools.h" // for gFloaterTool +#include "llhudeffecttrail.h" +#include "llhudmanager.h" +#include "llimview.h" +#include "llinventory.h" +#include "llinventoryfunctions.h" +#include "llmutelist.h" +#include "llrecentpeople.h" +#include "llviewerobjectlist.h" +#include "llvoavatarself.h" + +// MAX ITEMS is based on (sizeof(uuid)+2) * count must be < MTUBYTES +// or 18 * count < 1200 => count < 1200/18 => 66. I've cut it down a +// bit from there to give some pad. +const S32 MAX_ITEMS = 42; + +class LLGiveable : public LLInventoryCollectFunctor +{ +public: + LLGiveable() : mCountLosing(0) {} + virtual ~LLGiveable() {} + virtual bool operator()(LLInventoryCategory* cat, LLInventoryItem* item); + + S32 countNoCopy() const { return mCountLosing; } +protected: + S32 mCountLosing; +}; + +bool LLGiveable::operator()(LLInventoryCategory* cat, LLInventoryItem* item) +{ + // All categories can be given. + if (cat) + return true; + + bool allowed = false; + if (item) + { + allowed = itemTransferCommonlyAllowed(item); + if (allowed && + !item->getPermissions().allowOperationBy(PERM_TRANSFER, + gAgent.getID())) + { + allowed = FALSE; + } + if (allowed && + !item->getPermissions().allowCopyBy(gAgent.getID())) + { + ++mCountLosing; + } + } + return allowed; +} + +class LLUncopyableItems : public LLInventoryCollectFunctor +{ +public: + LLUncopyableItems() {} + virtual ~LLUncopyableItems() {} + virtual bool operator()(LLInventoryCategory* cat, LLInventoryItem* item); +}; + +bool LLUncopyableItems::operator()(LLInventoryCategory* cat, + LLInventoryItem* item) +{ + bool uncopyable = false; + if (item) + { + if (itemTransferCommonlyAllowed(item) && + !item->getPermissions().allowCopyBy(gAgent.getID())) + { + uncopyable = true; + } + } + return uncopyable; +} + +// static +bool LLGiveInventory::isInventoryGiveAcceptable(const LLInventoryItem* item) +{ + if (!item) return false; + + if (!isAgentAvatarValid()) return false; + + if (!item->getPermissions().allowOperationBy(PERM_TRANSFER, gAgentID)) + { + return false; + } + + bool acceptable = true; + switch(item->getType()) + { + case LLAssetType::AT_OBJECT: + if (gAgentAvatarp->isWearingAttachment(item->getUUID())) + { + acceptable = false; + } + break; + case LLAssetType::AT_BODYPART: + case LLAssetType::AT_CLOTHING: + { + BOOL copyable = false; + if (item->getPermissions().allowCopyBy(gAgentID)) copyable = true; + + if (!copyable && gAgentWearables.isWearingItem(item->getUUID())) + { + acceptable = false; + } + } + break; + default: + break; + } + return acceptable; +} + +// static +bool LLGiveInventory::isInventoryGroupGiveAcceptable(const LLInventoryItem* item) +{ + if (!item) return false; + + if (!isAgentAvatarValid()) return false; + + // These permissions are double checked in the simulator in + // LLGroupNoticeInventoryItemFetch::result(). + if (!item->getPermissions().allowOperationBy(PERM_TRANSFER, gAgentID)) + { + return false; + } + if (!item->getPermissions().allowCopyBy(gAgent.getID())) + { + return false; + } + + + bool acceptable = true; + switch(item->getType()) + { + case LLAssetType::AT_OBJECT: + if (gAgentAvatarp->isWearingAttachment(item->getUUID())) + { + acceptable = false; + } + break; + default: + break; + } + return acceptable; +} + +// static +bool LLGiveInventory::doGiveInventoryItem(const LLUUID& to_agent, + const LLInventoryItem* item, + const LLUUID& im_session_id/* = LLUUID::null*/) + +{ + bool res = true; + llinfos << "LLGiveInventory::giveInventory()" << llendl; + if (!isInventoryGiveAcceptable(item)) + { + return false; + } + if (item->getPermissions().allowCopyBy(gAgentID)) + { + // just give it away. + LLGiveInventory::commitGiveInventoryItem(to_agent, item, im_session_id); + } + else + { + // ask if the agent is sure. + LLSD substitutions; + substitutions["ITEMS"] = item->getName(); + LLSD payload; + payload["agent_id"] = to_agent; + LLSD items = LLSD::emptyArray(); + items.append(item->getUUID()); + payload["items"] = items; + LLNotificationsUtil::add("CannotCopyWarning", substitutions, payload, + &LLGiveInventory::handleCopyProtectedItem); + res = false; + } + + return res; +} + +void LLGiveInventory::doGiveInventoryCategory(const LLUUID& to_agent, + const LLInventoryCategory* cat, + const LLUUID& im_session_id) + +{ + if (!cat) return; + llinfos << "LLGiveInventory::giveInventoryCategory() - " + << cat->getUUID() << llendl; + + if (!isAgentAvatarValid()) return; + + // Test out how many items are being given. + LLViewerInventoryCategory::cat_array_t cats; + LLViewerInventoryItem::item_array_t items; + LLGiveable giveable; + gInventory.collectDescendentsIf (cat->getUUID(), + cats, + items, + LLInventoryModel::EXCLUDE_TRASH, + giveable); + S32 count = cats.count(); + bool complete = true; + for(S32 i = 0; i < count; ++i) + { + if (!gInventory.isCategoryComplete(cats.get(i)->getUUID())) + { + complete = false; + break; + } + } + if (!complete) + { + LLNotificationsUtil::add("IncompleteInventory"); + return; + } + count = items.count() + cats.count(); + if (count > MAX_ITEMS) + { + LLNotificationsUtil::add("TooManyItems"); + return; + } + else if (count == 0) + { + LLNotificationsUtil::add("NoItems"); + return; + } + else + { + if (0 == giveable.countNoCopy()) + { + LLGiveInventory::commitGiveInventoryCategory(to_agent, cat, im_session_id); + } + else + { + LLSD args; + args["COUNT"] = llformat("%d",giveable.countNoCopy()); + LLSD payload; + payload["agent_id"] = to_agent; + payload["folder_id"] = cat->getUUID(); + LLNotificationsUtil::add("CannotCopyCountItems", args, payload, &LLGiveInventory::handleCopyProtectedCategory); + } + } +} + +////////////////////////////////////////////////////////////////////////// +// PRIVATE METHODS +////////////////////////////////////////////////////////////////////////// + +//static +void LLGiveInventory::logInventoryOffer(const LLUUID& to_agent, const LLUUID &im_session_id) +{ + // compute id of possible IM session with agent that has "to_agent" id + LLUUID session_id = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL, to_agent); + // If this item was given by drag-and-drop into an IM panel, log this action in the IM panel chat. + LLSD args; + args["user_id"] = to_agent; + if (im_session_id.notNull()) + { + gIMMgr->addSystemMessage(im_session_id, "inventory_item_offered", args); + } + // If this item was given by drag-and-drop on avatar while IM panel was open, log this action in the IM panel chat. + else if (LLIMModel::getInstance()->findIMSession(session_id)) + { + gIMMgr->addSystemMessage(session_id, "inventory_item_offered", args); + } + // If this item was given by drag-and-drop on avatar while IM panel wasn't open, log this action to IM history. + else + { + std::string full_name; + if (gCacheName->getFullName(to_agent, full_name)) + { + LLIMModel::instance().logToFile(full_name, LLTrans::getString("SECOND_LIFE"), im_session_id, LLTrans::getString("inventory_item_offered-im")); + } + } +} + +// static +bool LLGiveInventory::handleCopyProtectedItem(const LLSD& notification, const LLSD& response) +{ + S32 option = LLNotificationsUtil::getSelectedOption(notification, response); + LLSD itmes = notification["payload"]["items"]; + LLInventoryItem* item = NULL; + switch(option) + { + case 0: // "Yes" + for (LLSD::array_iterator it = itmes.beginArray(); it != itmes.endArray(); it++) + { + item = gInventory.getItem((*it).asUUID()); + if (item) + { + LLGiveInventory::commitGiveInventoryItem(notification["payload"]["agent_id"].asUUID(), + item); + // delete it for now - it will be deleted on the server + // quickly enough. + gInventory.deleteObject(item->getUUID()); + gInventory.notifyObservers(); + } + else + { + LLNotificationsUtil::add("CannotGiveItem"); + } + } + break; + + default: // no, cancel, whatever, who cares, not yes. + LLNotificationsUtil::add("TransactionCancelled"); + break; + } + return false; +} + +// static +void LLGiveInventory::commitGiveInventoryItem(const LLUUID& to_agent, + const LLInventoryItem* item, + const LLUUID& im_session_id) +{ + if (!item) return; + std::string name; + LLAgentUI::buildFullname(name); + LLUUID transaction_id; + transaction_id.generate(); + const S32 BUCKET_SIZE = sizeof(U8) + UUID_BYTES; + U8 bucket[BUCKET_SIZE]; + bucket[0] = (U8)item->getType(); + memcpy(&bucket[1], &(item->getUUID().mData), UUID_BYTES); /* Flawfinder: ignore */ + pack_instant_message( + gMessageSystem, + gAgentID, + FALSE, + gAgentSessionID, + to_agent, + name, + item->getName(), + IM_ONLINE, + IM_INVENTORY_OFFERED, + transaction_id, + 0, + LLUUID::null, + gAgent.getPositionAgent(), + NO_TIMESTAMP, + bucket, + BUCKET_SIZE); + gAgent.sendReliableMessage(); + + // VEFFECT: giveInventory + LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BEAM, TRUE); + effectp->setSourceObject(gAgentAvatarp); + effectp->setTargetObject(gObjectList.findObject(to_agent)); + effectp->setDuration(LL_HUD_DUR_SHORT); + effectp->setColor(LLColor4U(gAgent.getEffectColor())); + gFloaterTools->dirty(); + + LLMuteList::getInstance()->autoRemove(to_agent, LLMuteList::AR_INVENTORY); + + logInventoryOffer(to_agent, im_session_id); + + // add buddy to recent people list + LLRecentPeople::instance().add(to_agent); +} + +// static +bool LLGiveInventory::handleCopyProtectedCategory(const LLSD& notification, const LLSD& response) +{ + S32 option = LLNotificationsUtil::getSelectedOption(notification, response); + LLInventoryCategory* cat = NULL; + switch(option) + { + case 0: // "Yes" + cat = gInventory.getCategory(notification["payload"]["folder_id"].asUUID()); + if (cat) + { + LLGiveInventory::commitGiveInventoryCategory(notification["payload"]["agent_id"].asUUID(), + cat); + LLViewerInventoryCategory::cat_array_t cats; + LLViewerInventoryItem::item_array_t items; + LLUncopyableItems remove; + gInventory.collectDescendentsIf (cat->getUUID(), + cats, + items, + LLInventoryModel::EXCLUDE_TRASH, + remove); + S32 count = items.count(); + for(S32 i = 0; i < count; ++i) + { + gInventory.deleteObject(items.get(i)->getUUID()); + } + gInventory.notifyObservers(); + } + else + { + LLNotificationsUtil::add("CannotGiveCategory"); + } + break; + + default: // no, cancel, whatever, who cares, not yes. + LLNotificationsUtil::add("TransactionCancelled"); + break; + } + return false; +} + +// static +void LLGiveInventory::commitGiveInventoryCategory(const LLUUID& to_agent, + const LLInventoryCategory* cat, + const LLUUID& im_session_id) + +{ + if (!cat) return; + llinfos << "LLGiveInventory::commitGiveInventoryCategory() - " + << cat->getUUID() << llendl; + + // add buddy to recent people list + LLRecentPeople::instance().add(to_agent); + + // Test out how many items are being given. + LLViewerInventoryCategory::cat_array_t cats; + LLViewerInventoryItem::item_array_t items; + LLGiveable giveable; + gInventory.collectDescendentsIf (cat->getUUID(), + cats, + items, + LLInventoryModel::EXCLUDE_TRASH, + giveable); + + // MAX ITEMS is based on (sizeof(uuid)+2) * count must be < + // MTUBYTES or 18 * count < 1200 => count < 1200/18 => + // 66. I've cut it down a bit from there to give some pad. + S32 count = items.count() + cats.count(); + if (count > MAX_ITEMS) + { + LLNotificationsUtil::add("TooManyItems"); + return; + } + else if (count == 0) + { + LLNotificationsUtil::add("NoItems"); + return; + } + else + { + std::string name; + LLAgentUI::buildFullname(name); + LLUUID transaction_id; + transaction_id.generate(); + S32 bucket_size = (sizeof(U8) + UUID_BYTES) * (count + 1); + U8* bucket = new U8[bucket_size]; + U8* pos = bucket; + U8 type = (U8)cat->getType(); + memcpy(pos, &type, sizeof(U8)); /* Flawfinder: ignore */ + pos += sizeof(U8); + memcpy(pos, &(cat->getUUID()), UUID_BYTES); /* Flawfinder: ignore */ + pos += UUID_BYTES; + S32 i; + count = cats.count(); + for(i = 0; i < count; ++i) + { + memcpy(pos, &type, sizeof(U8)); /* Flawfinder: ignore */ + pos += sizeof(U8); + memcpy(pos, &(cats.get(i)->getUUID()), UUID_BYTES); /* Flawfinder: ignore */ + pos += UUID_BYTES; + } + count = items.count(); + for(i = 0; i < count; ++i) + { + type = (U8)items.get(i)->getType(); + memcpy(pos, &type, sizeof(U8)); /* Flawfinder: ignore */ + pos += sizeof(U8); + memcpy(pos, &(items.get(i)->getUUID()), UUID_BYTES); /* Flawfinder: ignore */ + pos += UUID_BYTES; + } + pack_instant_message( + gMessageSystem, + gAgent.getID(), + FALSE, + gAgent.getSessionID(), + to_agent, + name, + cat->getName(), + IM_ONLINE, + IM_INVENTORY_OFFERED, + transaction_id, + 0, + LLUUID::null, + gAgent.getPositionAgent(), + NO_TIMESTAMP, + bucket, + bucket_size); + gAgent.sendReliableMessage(); + delete[] bucket; + + // VEFFECT: giveInventoryCategory + LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BEAM, TRUE); + effectp->setSourceObject(gAgentAvatarp); + effectp->setTargetObject(gObjectList.findObject(to_agent)); + effectp->setDuration(LL_HUD_DUR_SHORT); + effectp->setColor(LLColor4U(gAgent.getEffectColor())); + gFloaterTools->dirty(); + + LLMuteList::getInstance()->autoRemove(to_agent, LLMuteList::AR_INVENTORY); + + logInventoryOffer(to_agent, im_session_id); + } +} + +// EOF diff --git a/indra/newview/llgiveinventory.h b/indra/newview/llgiveinventory.h new file mode 100644 index 0000000000..86f0f2fe86 --- /dev/null +++ b/indra/newview/llgiveinventory.h @@ -0,0 +1,100 @@ +/** + * @file llgiveinventory.cpp + * @brief LLGiveInventory class declaration + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLGIVEINVENTORY_H +#define LL_LLGIVEINVENTORY_H + +class LLInventoryItem; +class LLInventoryCategory; + +/** + * Class represented give inventory related actions. + * + * It has only static methods and is not intended to be instantiated for now. + */ +class LLGiveInventory +{ +public: + /** + * Checks if inventory item you are attempting to transfer to a resident can be given. + * + * @return true if you can give, otherwise false. + */ + static bool isInventoryGiveAcceptable(const LLInventoryItem* item); + + /** + * Checks if inventory item you are attempting to transfer to a group can be given. + * + * @return true if you can give, otherwise false. + */ + static bool isInventoryGroupGiveAcceptable(const LLInventoryItem* item); + + /** + * Gives passed inventory item to specified avatar in specified session. + */ + static bool doGiveInventoryItem(const LLUUID& to_agent, + const LLInventoryItem* item, + const LLUUID& im_session_id = LLUUID::null); + + /** + * Gives passed inventory category to specified avatar in specified session. + */ + static void doGiveInventoryCategory(const LLUUID& to_agent, + const LLInventoryCategory* item, + const LLUUID &session_id = LLUUID::null); + + // give inventory item functionality + static bool handleCopyProtectedItem(const LLSD& notification, const LLSD& response); + +private: + // this class is not intended to be instantiated. + LLGiveInventory(); + + /** + * logs "Inventory item offered" to IM + */ + static void logInventoryOffer(const LLUUID& to_agent, + const LLUUID &im_session_id = LLUUID::null); + + static void commitGiveInventoryItem(const LLUUID& to_agent, + const LLInventoryItem* item, + const LLUUID &im_session_id = LLUUID::null); + + // give inventory category functionality + static bool handleCopyProtectedCategory(const LLSD& notification, const LLSD& response); + static void commitGiveInventoryCategory(const LLUUID& to_agent, + const LLInventoryCategory* cat, + const LLUUID &im_session_id = LLUUID::null); + +}; + +#endif // LL_LLGIVEINVENTORY_H diff --git a/indra/newview/llglsandbox.cpp b/indra/newview/llglsandbox.cpp index 750a9d478f..2aba0b5c09 100644 --- a/indra/newview/llglsandbox.cpp +++ b/indra/newview/llglsandbox.cpp @@ -71,99 +71,6 @@ // Height of the yellow selection highlight posts for land const F32 PARCEL_POST_HEIGHT = 0.666f; -BOOL LLAgent::setLookAt(ELookAtType target_type, LLViewerObject *object, LLVector3 position) -{ - if(object && object->isAttachment()) - { - LLViewerObject* parent = object; - while(parent) - { - if (parent == mAvatarObject) - { - // looking at an attachment on ourselves, which we don't want to do - object = mAvatarObject; - position.clearVec(); - } - parent = (LLViewerObject*)parent->getParent(); - } - } - if(!mLookAt || mLookAt->isDead()) - { - mLookAt = (LLHUDEffectLookAt *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_LOOKAT); - mLookAt->setSourceObject(mAvatarObject); - } - - return mLookAt->setLookAt(target_type, object, position); -} - -BOOL LLAgent::setPointAt(EPointAtType target_type, LLViewerObject *object, LLVector3 position) -{ - // disallow pointing at attachments and avatars - if (object && (object->isAttachment() || object->isAvatar())) - { - return FALSE; - } - - if(!mPointAt || mPointAt->isDead()) - { - mPointAt = (LLHUDEffectPointAt *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_POINTAT); - mPointAt->setSourceObject(mAvatarObject); - } - - return mPointAt->setPointAt(target_type, object, position); -} - -ELookAtType LLAgent::getLookAtType() -{ - if (mLookAt) - { - return mLookAt->getLookAtType(); - } - - return LOOKAT_TARGET_NONE; -} - -EPointAtType LLAgent::getPointAtType() -{ - if (mPointAt) - { - return mPointAt->getPointAtType(); - } - - return POINTAT_TARGET_NONE; -} - -// Draw a representation of current autopilot target -void LLAgent::renderAutoPilotTarget() -{ - if (mAutoPilot) - { - F32 height_meters; - LLVector3d target_global; - - glMatrixMode(GL_MODELVIEW); - gGL.pushMatrix(); - - // not textured - gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - - // lovely green - glColor4f(0.f, 1.f, 1.f, 1.f); - - target_global = mAutoPilotTargetGlobal; - - gGL.translatef((F32)(target_global.mdV[VX]), (F32)(target_global.mdV[VY]), (F32)(target_global.mdV[VZ])); - - height_meters = 1.f; - - glScalef(height_meters, height_meters, height_meters); - - gSphere.render(1500.f); - - gGL.popMatrix(); - } -} - // Returns true if you got at least one object void LLToolSelectRect::handleRectangleSelection(S32 x, S32 y, MASK mask) { @@ -897,19 +804,21 @@ void LLViewerObjectList::renderObjectBeacons() S32 last_line_width = -1; // gGL.begin(LLRender::LINES); // Always happens in (line_width != last_line_width) - for (S32 i = 0; i < mDebugBeacons.count(); i++) + BOOL flush = FALSE; + for (std::vector<LLDebugBeacon>::iterator iter = mDebugBeacons.begin(); iter != mDebugBeacons.end(); ++iter) { - const LLDebugBeacon &debug_beacon = mDebugBeacons[i]; + const LLDebugBeacon &debug_beacon = *iter; LLColor4 color = debug_beacon.mColor; color.mV[3] *= 0.25f; S32 line_width = debug_beacon.mLineWidth; if (line_width != last_line_width) { - if (i > 0) + if (flush) { gGL.end(); - gGL.flush(); } + flush = TRUE; + gGL.flush(); glLineWidth( (F32)line_width ); last_line_width = line_width; gGL.begin(LLRender::LINES); @@ -936,18 +845,20 @@ void LLViewerObjectList::renderObjectBeacons() S32 last_line_width = -1; // gGL.begin(LLRender::LINES); // Always happens in (line_width != last_line_width) - for (S32 i = 0; i < mDebugBeacons.count(); i++) + BOOL flush = FALSE; + for (std::vector<LLDebugBeacon>::iterator iter = mDebugBeacons.begin(); iter != mDebugBeacons.end(); ++iter) { - const LLDebugBeacon &debug_beacon = mDebugBeacons[i]; + const LLDebugBeacon &debug_beacon = *iter; S32 line_width = debug_beacon.mLineWidth; if (line_width != last_line_width) { - if (i > 0) + if (flush) { gGL.end(); - gGL.flush(); } + flush = TRUE; + gGL.flush(); glLineWidth( (F32)line_width ); last_line_width = line_width; gGL.begin(LLRender::LINES); @@ -969,9 +880,9 @@ void LLViewerObjectList::renderObjectBeacons() gGL.flush(); glLineWidth(1.f); - for (S32 i = 0; i < mDebugBeacons.count(); i++) + for (std::vector<LLDebugBeacon>::iterator iter = mDebugBeacons.begin(); iter != mDebugBeacons.end(); ++iter) { - LLDebugBeacon &debug_beacon = mDebugBeacons[i]; + LLDebugBeacon &debug_beacon = *iter; if (debug_beacon.mString == "") { continue; diff --git a/indra/newview/llgroupactions.cpp b/indra/newview/llgroupactions.cpp index 00e2365ffd..438159b2e6 100644 --- a/indra/newview/llgroupactions.cpp +++ b/indra/newview/llgroupactions.cpp @@ -75,12 +75,13 @@ public: return false; } - //*TODO by what to replace showing groups floater? if (tokens[0].asString() == "list") { if (tokens[1].asString() == "show") { - //LLFloaterReg::showInstance("contacts", "groups"); + LLSD params; + params["people_panel_tab_name"] = "groups_panel"; + LLSideTray::getInstance()->showPanel("panel_people", params); return true; } return false; @@ -105,7 +106,7 @@ public: { if (group_id.isNull()) return true; - LLGroupActions::show(group_id); + LLGroupActions::inspect(group_id); return true; } return false; @@ -246,6 +247,12 @@ static bool isGroupUIVisible() return panel->isInVisibleChain(); } +// static +void LLGroupActions::inspect(const LLUUID& group_id) +{ + LLFloaterReg::showInstance("inspect_group", LLSD().with("group_id", group_id)); +} + // static void LLGroupActions::show(const LLUUID& group_id) { diff --git a/indra/newview/llgroupactions.h b/indra/newview/llgroupactions.h index e99df86cd9..55cae4db0b 100644 --- a/indra/newview/llgroupactions.h +++ b/indra/newview/llgroupactions.h @@ -66,6 +66,11 @@ public: static void show(const LLUUID& group_id); /** + * Show group inspector floater. + */ + static void inspect(const LLUUID& group_id); + + /** * Refresh group information panel. */ static void refresh(const LLUUID& group_id); diff --git a/indra/newview/llgrouplist.cpp b/indra/newview/llgrouplist.cpp index 1ed1113f4d..da5196df45 100644 --- a/indra/newview/llgrouplist.cpp +++ b/indra/newview/llgrouplist.cpp @@ -39,13 +39,13 @@ #include "lliconctrl.h" #include "llmenugl.h" #include "lltextbox.h" +#include "lltextutil.h" #include "lltrans.h" // newview #include "llagent.h" #include "llgroupactions.h" #include "llfloaterreg.h" -#include "lltextutil.h" #include "llviewercontrol.h" // for gSavedSettings #include "llviewermenu.h" // for gMenuHolder #include "llvoiceclient.h" @@ -71,18 +71,10 @@ public: static const LLGroupComparator GROUP_COMPARATOR; -LLGroupList::Params::Params() -: no_groups_msg("no_groups_msg") -, no_filtered_groups_msg("no_filtered_groups_msg") -{ - -} LLGroupList::LLGroupList(const Params& p) -: LLFlatListView(p) +: LLFlatListViewEx(p) , mDirty(true) // to force initial update - , mNoFilteredGroupsMsg(p.no_filtered_groups_msg) - , mNoGroupsMsg(p.no_groups_msg) { // Listen for agent group changes. gAgent.addListener(this, "new group"); @@ -127,7 +119,7 @@ BOOL LLGroupList::handleRightMouseDown(S32 x, S32 y, MASK mask) BOOL handled = LLUICtrl::handleRightMouseDown(x, y, mask); LLMenuGL* context_menu = (LLMenuGL*)mContextMenuHandle.get(); - if (context_menu) + if (context_menu && size() > 0) { context_menu->buildDrawLabels(); context_menu->updateParent(LLMenuGL::sMenuContainer); @@ -139,9 +131,15 @@ BOOL LLGroupList::handleRightMouseDown(S32 x, S32 y, MASK mask) void LLGroupList::setNameFilter(const std::string& filter) { - if (mNameFilter != filter) + std::string filter_upper = filter; + LLStringUtil::toUpper(filter_upper); + if (mNameFilter != filter_upper) { - mNameFilter = filter; + mNameFilter = filter_upper; + + // set no items message depend on filter state + updateNoItemsMessage(filter); + setDirty(); } } @@ -159,18 +157,6 @@ void LLGroupList::refresh() LLUUID id; bool have_filter = !mNameFilter.empty(); - // set no items message depend on filter state & total count of groups - if (have_filter) - { - // groups were filtered - setNoItemsCommentText(mNoFilteredGroupsMsg); - } - else if (0 == count) - { - // user is not a member of any group - setNoItemsCommentText(mNoGroupsMsg); - } - clear(); for(S32 i = 0; i < count; ++i) @@ -287,7 +273,7 @@ bool LLGroupList::onContextMenuItemEnable(const LLSD& userdata) return gAgent.getGroupID() != selected_group_id; if (userdata.asString() == "call") - return LLVoiceClient::voiceEnabled()&&gVoiceClient->voiceWorking(); + return real_group_selected && LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking(); return real_group_selected; } diff --git a/indra/newview/llgrouplist.h b/indra/newview/llgrouplist.h index f3ac676edd..16f3fc05a3 100644 --- a/indra/newview/llgrouplist.h +++ b/indra/newview/llgrouplist.h @@ -47,23 +47,10 @@ * * @see setNameFilter() */ -class LLGroupList: public LLFlatListView, public LLOldEvents::LLSimpleListener +class LLGroupList: public LLFlatListViewEx, public LLOldEvents::LLSimpleListener { LOG_CLASS(LLGroupList); public: - struct Params : public LLInitParam::Block<Params, LLFlatListView::Params> - { - /** - * Contains a message for empty list when user is not a member of any group - */ - Optional<std::string> no_groups_msg; - - /** - * Contains a message for empty list when all groups don't match passed filter - */ - Optional<std::string> no_filtered_groups_msg; - Params(); - }; LLGroupList(const Params& p); virtual ~LLGroupList(); @@ -74,7 +61,7 @@ public: void setNameFilter(const std::string& filter); void toggleIcons(); bool getIconsVisible() const { return mShowIcons; } - + private: void setDirty(bool val = true) { mDirty = val; } void refresh(); @@ -89,8 +76,6 @@ private: bool mShowIcons; bool mDirty; std::string mNameFilter; - std::string mNoFilteredGroupsMsg; - std::string mNoGroupsMsg; }; class LLButton; diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp index 4c1019a882..996553ccf7 100644 --- a/indra/newview/llgroupmgr.cpp +++ b/indra/newview/llgroupmgr.cpp @@ -54,8 +54,19 @@ #include "llgroupactions.h" #include "llnotificationsutil.h" #include "lluictrlfactory.h" +#include "lltrans.h" #include <boost/regex.hpp> +#if LL_MSVC +// disable boost::lexical_cast warning +#pragma warning (disable:4702) +#endif + +#include <boost/lexical_cast.hpp> + +#if LL_MSVC +#pragma warning(pop) // Restore all warnings to the previous state +#endif const U32 MAX_CACHED_GROUPS = 10; @@ -149,7 +160,7 @@ LLGroupRoleData::~LLGroupRoleData() { } -S32 LLGroupRoleData::getMembersInRole(std::vector<LLUUID> members, +S32 LLGroupRoleData::getMembersInRole(uuid_vec_t members, BOOL needs_sort) { if (mRoleID.isNull()) @@ -173,8 +184,8 @@ S32 LLGroupRoleData::getMembersInRole(std::vector<LLUUID> members, // Return the number of members in the intersection. S32 max_size = llmin( members.size(), mMemberIDs.size() ); - std::vector<LLUUID> in_role( max_size ); - std::vector<LLUUID>::iterator in_role_end; + uuid_vec_t in_role( max_size ); + uuid_vec_t::iterator in_role_end; in_role_end = std::set_intersection(mMemberIDs.begin(), mMemberIDs.end(), members.begin(), members.end(), in_role.begin()); @@ -189,7 +200,7 @@ void LLGroupRoleData::addMember(const LLUUID& member) bool LLGroupRoleData::removeMember(const LLUUID& member) { - std::vector<LLUUID>::iterator it = std::find(mMemberIDs.begin(),mMemberIDs.end(),member); + uuid_vec_t::iterator it = std::find(mMemberIDs.begin(),mMemberIDs.end(),member); if (it != mMemberIDs.end()) { @@ -677,9 +688,12 @@ void LLGroupMgrGroupData::sendRoleChanges() break; } case RC_UPDATE_ALL: + // fall through case RC_UPDATE_POWERS: need_power_recalc = true; + // fall through case RC_UPDATE_DATA: + // fall through default: { LLGroupRoleData* group_role_data = (*role_it).second; @@ -762,7 +776,7 @@ void LLGroupMgr::addObserver(LLGroupMgrObserver* observer) mObservers.insert(std::pair<LLUUID, LLGroupMgrObserver*>(observer->getID(), observer)); } -void LLGroupMgr::addObserver(const LLUUID& group_id, LLParticularGroupMgrObserver* observer) +void LLGroupMgr::addObserver(const LLUUID& group_id, LLParticularGroupObserver* observer) { if(group_id.notNull() && observer) { @@ -792,7 +806,7 @@ void LLGroupMgr::removeObserver(LLGroupMgrObserver* observer) } } -void LLGroupMgr::removeObserver(const LLUUID& group_id, LLParticularGroupMgrObserver* observer) +void LLGroupMgr::removeObserver(const LLUUID& group_id, LLParticularGroupObserver* observer) { if(group_id.isNull() || !observer) { @@ -830,12 +844,13 @@ static void formatDateString(std::string &date_string) const regex expression("([0-9]{1,2})/([0-9]{1,2})/([0-9]{4})"); if (regex_match(date_string.c_str(), result, expression)) { - std::string year = result[3]; - std::string month = result[1]; - std::string day = result[2]; + // convert matches to integers so that we can pad them with zeroes on Linux + S32 year = boost::lexical_cast<S32>(result[3]); + S32 month = boost::lexical_cast<S32>(result[1]); + S32 day = boost::lexical_cast<S32>(result[2]); // ISO 8601 date format - date_string = llformat("%02s/%02s/%04s", month.c_str(), day.c_str(), year.c_str()); + date_string = llformat("%04d/%02d/%02d", year, month, day); } } @@ -1048,6 +1063,24 @@ void LLGroupMgr::processGroupRoleDataReply(LLMessageSystem* msg, void** data) msg->getU64("RoleData","Powers",powers,i); msg->getU32("RoleData","Members",member_count,i); + //there are 3 predifined roles - Owners, Officers, Everyone + //there names are defined in lldatagroups.cpp + //lets change names from server to localized strings + if(name == "Everyone") + { + name = LLTrans::getString("group_role_everyone"); + } + else if(name == "Officers") + { + name = LLTrans::getString("group_role_officers"); + } + else if(name == "Owners") + { + name = LLTrans::getString("group_role_owners"); + } + + + lldebugs << "Adding role data: " << name << " {" << role_id << "}" << llendl; LLGroupRoleData* rd = new LLGroupRoleData(role_id,name,title,desc,powers,member_count); group_data->mRoles[role_id] = rd; @@ -1364,7 +1397,7 @@ void LLGroupMgr::notifyObservers(LLGroupChange gc) gi->second->mChanged = FALSE; - // notify LLParticularGroupMgrObserver + // notify LLParticularGroupObserver observer_map_t::iterator obs_it = mParticularObservers.find(group_id); if(obs_it == mParticularObservers.end()) return; @@ -1703,7 +1736,7 @@ void LLGroupMgr::sendGroupMemberInvites(const LLUUID& group_id, std::map<LLUUID, //static void LLGroupMgr::sendGroupMemberEjects(const LLUUID& group_id, - std::vector<LLUUID>& member_ids) + uuid_vec_t& member_ids) { bool start_message = true; LLMessageSystem* msg = gMessageSystem; @@ -1713,18 +1746,16 @@ void LLGroupMgr::sendGroupMemberEjects(const LLUUID& group_id, LLGroupMgrGroupData* group_datap = LLGroupMgr::getInstance()->getGroupData(group_id); if (!group_datap) return; - for (std::vector<LLUUID>::iterator it = member_ids.begin(); + for (uuid_vec_t::iterator it = member_ids.begin(); it != member_ids.end(); ++it) { LLUUID& ejected_member_id = (*it); - llwarns << "LLGroupMgr::sendGroupMemberEjects -- ejecting member" << ejected_member_id << llendl; - // Can't use 'eject' to leave a group. - if ((*it) == gAgent.getID()) continue; + if (ejected_member_id == gAgent.getID()) continue; // Make sure they are in the group, and we need the member data - LLGroupMgrGroupData::member_list_t::iterator mit = group_datap->mMembers.find(*it); + LLGroupMgrGroupData::member_list_t::iterator mit = group_datap->mMembers.find(ejected_member_id); if (mit != group_datap->mMembers.end()) { // Add them to the message @@ -1748,22 +1779,23 @@ void LLGroupMgr::sendGroupMemberEjects(const LLUUID& group_id, start_message = true; } + LLGroupMemberData* member_data = (*mit).second; + // Clean up groupmgr - for (LLGroupMemberData::role_list_t::iterator rit = (*mit).second->roleBegin(); - rit != (*mit).second->roleEnd(); ++rit) + for (LLGroupMemberData::role_list_t::iterator rit = member_data->roleBegin(); + rit != member_data->roleEnd(); ++rit) { if ((*rit).first.notNull() && (*rit).second!=0) { (*rit).second->removeMember(ejected_member_id); - - llwarns << "LLGroupMgr::sendGroupMemberEjects - removing member from role " << llendl; } } - group_datap->mMembers.erase(*it); + group_datap->mMembers.erase(ejected_member_id); - llwarns << "LLGroupMgr::sendGroupMemberEjects - deleting memnber data " << llendl; - delete (*mit).second; + // member_data was introduced and is used here instead of (*mit).second to avoid crash because of invalid iterator + // It becomes invalid after line with erase above. EXT-4778 + delete member_data; } } @@ -1771,8 +1803,6 @@ void LLGroupMgr::sendGroupMemberEjects(const LLUUID& group_id, { gAgent.sendReliableMessage(); } - - llwarns << "LLGroupMgr::sendGroupMemberEjects - done " << llendl; } void LLGroupMgr::sendGroupRoleChanges(const LLUUID& group_id) diff --git a/indra/newview/llgroupmgr.h b/indra/newview/llgroupmgr.h index 588b4a9034..82df631b8c 100644 --- a/indra/newview/llgroupmgr.h +++ b/indra/newview/llgroupmgr.h @@ -53,10 +53,10 @@ protected: LLUUID mID; }; -class LLParticularGroupMgrObserver +class LLParticularGroupObserver { public: - virtual ~LLParticularGroupMgrObserver(){} + virtual ~LLParticularGroupObserver(){} virtual void changed(const LLUUID& group_id, LLGroupChange gc) = 0; }; @@ -139,8 +139,8 @@ public: const LLUUID& getID() const { return mRoleID; } - const std::vector<LLUUID>& getRoleMembers() const { return mMemberIDs; } - S32 getMembersInRole(std::vector<LLUUID> members, BOOL needs_sort = TRUE); + const uuid_vec_t& getRoleMembers() const { return mMemberIDs; } + S32 getMembersInRole(uuid_vec_t members, BOOL needs_sort = TRUE); S32 getTotalMembersInRole() { return mMemberIDs.size(); } LLRoleData getRoleData() const { return mRoleData; } @@ -150,10 +150,10 @@ public: bool removeMember(const LLUUID& member); void clearMembers(); - const std::vector<LLUUID>::const_iterator getMembersBegin() const + const uuid_vec_t::const_iterator getMembersBegin() const { return mMemberIDs.begin(); } - const std::vector<LLUUID>::const_iterator getMembersEnd() const + const uuid_vec_t::const_iterator getMembersEnd() const { return mMemberIDs.end(); } @@ -164,7 +164,7 @@ protected: LLUUID mRoleID; LLRoleData mRoleData; - std::vector<LLUUID> mMemberIDs; + uuid_vec_t mMemberIDs; S32 mMemberCount; private: @@ -313,9 +313,9 @@ public: ~LLGroupMgr(); void addObserver(LLGroupMgrObserver* observer); - void addObserver(const LLUUID& group_id, LLParticularGroupMgrObserver* observer); + void addObserver(const LLUUID& group_id, LLParticularGroupObserver* observer); void removeObserver(LLGroupMgrObserver* observer); - void removeObserver(const LLUUID& group_id, LLParticularGroupMgrObserver* observer); + void removeObserver(const LLUUID& group_id, LLParticularGroupObserver* observer); LLGroupMgrGroupData* getGroupData(const LLUUID& id); void sendGroupPropertiesRequest(const LLUUID& group_id); @@ -340,7 +340,7 @@ public: static void sendGroupMemberJoin(const LLUUID& group_id); static void sendGroupMemberInvites(const LLUUID& group_id, std::map<LLUUID,LLUUID>& role_member_pairs); static void sendGroupMemberEjects(const LLUUID& group_id, - std::vector<LLUUID>& member_ids); + uuid_vec_t& member_ids); void cancelGroupRoleChanges(const LLUUID& group_id); @@ -374,7 +374,7 @@ private: typedef std::map<LLUUID, LLGroupMgrGroupData*> group_map_t; group_map_t mGroups; - typedef std::set<LLParticularGroupMgrObserver*> observer_set_t; + typedef std::set<LLParticularGroupObserver*> observer_set_t; typedef std::map<LLUUID,observer_set_t> observer_map_t; observer_map_t mParticularObservers; }; diff --git a/indra/newview/llhudeffectlookat.cpp b/indra/newview/llhudeffectlookat.cpp index 07b81ef134..3be0fcbc5f 100644 --- a/indra/newview/llhudeffectlookat.cpp +++ b/indra/newview/llhudeffectlookat.cpp @@ -38,6 +38,7 @@ #include "message.h" #include "llagent.h" +#include "llagentcamera.h" #include "llvoavatar.h" #include "lldrawable.h" #include "llviewerobjectlist.h" @@ -316,7 +317,7 @@ void LLHUDEffectLookAt::unpackData(LLMessageSystem *mesgsys, S32 blocknum) LLUUID dataId; mesgsys->getUUIDFast(_PREHASH_Effect, _PREHASH_ID, dataId, blocknum); - if (!gAgent.mLookAt.isNull() && dataId == gAgent.mLookAt->getID()) + if (!gAgentCamera.mLookAt.isNull() && dataId == gAgentCamera.mLookAt->getID()) { return; } @@ -637,7 +638,7 @@ bool LLHUDEffectLookAt::calcTargetPosition() // mouselook and freelook target offsets are absolute target_rot = LLQuaternion::DEFAULT; } - else if (looking_at_self && gAgent.cameraCustomizeAvatar()) + else if (looking_at_self && gAgentCamera.cameraCustomizeAvatar()) { // *NOTE: We have to do this because animation // overrides do not set lookat behavior. diff --git a/indra/newview/llhudeffectpointat.cpp b/indra/newview/llhudeffectpointat.cpp index a13ee8572f..01dfb50b10 100644 --- a/indra/newview/llhudeffectpointat.cpp +++ b/indra/newview/llhudeffectpointat.cpp @@ -38,6 +38,7 @@ #include "llrender.h" #include "llagent.h" +#include "llagentcamera.h" #include "lldrawable.h" #include "llviewerobjectlist.h" #include "llvoavatar.h" @@ -152,7 +153,7 @@ void LLHUDEffectPointAt::unpackData(LLMessageSystem *mesgsys, S32 blocknum) mesgsys->getUUIDFast(_PREHASH_Effect, _PREHASH_ID, dataId, blocknum); // ignore messages from ourselves - if (!gAgent.mPointAt.isNull() && dataId == gAgent.mPointAt->getID()) + if (!gAgentCamera.mPointAt.isNull() && dataId == gAgentCamera.mPointAt->getID()) { return; } diff --git a/indra/newview/llhudobject.cpp b/indra/newview/llhudobject.cpp index dc55aba0db..2b73ed1dcd 100644 --- a/indra/newview/llhudobject.cpp +++ b/indra/newview/llhudobject.cpp @@ -43,6 +43,7 @@ #include "llhudeffectbeam.h" #include "llhudeffecttrail.h" #include "llhudeffectlookat.h" +#include "llhudeffectpointat.h" #include "llvoicevisualizer.h" diff --git a/indra/newview/llhudrender.cpp b/indra/newview/llhudrender.cpp index a02dc3355b..47fe641680 100644 --- a/indra/newview/llhudrender.cpp +++ b/indra/newview/llhudrender.cpp @@ -78,8 +78,8 @@ void hud_render_text(const LLWString &wstr, const LLVector3 &pos_agent, LLVector3 up_axis; if (orthographic) { - right_axis.setVec(0.f, -1.f / gViewerWindow->getWorldViewWidthRaw(), 0.f); - up_axis.setVec(0.f, 0.f, 1.f / gViewerWindow->getWorldViewHeightRaw()); + right_axis.setVec(0.f, -1.f / gViewerWindow->getWorldViewHeightScaled(), 0.f); + up_axis.setVec(0.f, 0.f, 1.f / gViewerWindow->getWorldViewHeightScaled()); } else { @@ -121,24 +121,24 @@ void hud_render_text(const LLWString &wstr, const LLVector3 &pos_agent, glMatrixMode(GL_PROJECTION); glPushMatrix(); glMatrixMode(GL_MODELVIEW); - + gGL.pushMatrix(); LLUI::pushMatrix(); gl_state_for_2d(world_view_rect.getWidth(), world_view_rect.getHeight()); gViewerWindow->setup3DViewport(); - //gViewerWindow->setup2DRender(); - + winX -= world_view_rect.mLeft; winY -= world_view_rect.mBottom; LLUI::loadIdentity(); + glLoadIdentity(); LLUI::translate((F32) winX*1.0f/LLFontGL::sScaleX, (F32) winY*1.0f/(LLFontGL::sScaleY), -(((F32) winZ*2.f)-1.f)); - //glRotatef(angle * RAD_TO_DEG, axis.mV[VX], axis.mV[VY], axis.mV[VZ]); - //glScalef(right_scale, up_scale, 1.f); F32 right_x; font.render(wstr, 0, 0, 0, color, LLFontGL::LEFT, LLFontGL::BASELINE, style, shadow, wstr.length(), 1000, &right_x); + LLUI::popMatrix(); - + gGL.popMatrix(); + glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW); diff --git a/indra/newview/llhudtext.cpp b/indra/newview/llhudtext.cpp index 8ad94b957d..8d1d27444b 100644 --- a/indra/newview/llhudtext.cpp +++ b/indra/newview/llhudtext.cpp @@ -555,7 +555,7 @@ void LLHUDText::renderText(BOOL for_select) } } /// Reset the default color to white. The renderer expects this to be the default. - glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + gGL.color4f(1.0f, 1.0f, 1.0f, 1.0f); if (for_select) { gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE); diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp index 1eac90371d..967f38bfd2 100644 --- a/indra/newview/llimfloater.cpp +++ b/indra/newview/llimfloater.cpp @@ -44,6 +44,7 @@ #include "llchiclet.h" #include "llfloaterreg.h" #include "llimfloatercontainer.h" // to replace separate IM Floaters with multifloater container +#include "llinventoryfunctions.h" #include "lllayoutstack.h" #include "lllineeditor.h" #include "lllogchat.h" @@ -52,14 +53,20 @@ #include "llsyswellwindow.h" #include "lltrans.h" #include "llchathistory.h" +#include "llnotifications.h" #include "llviewerwindow.h" #include "llvoicechannel.h" #include "lltransientfloatermgr.h" #include "llinventorymodel.h" #include "llrootview.h" - #include "llspeakers.h" +#include "llsidetray.h" + + +static const S32 RECT_PADDING_NOT_INIT = -1; +static const S32 RECT_PADDING_NEED_RECALC = -2; +S32 LLIMFloater::sAllowedRectRightPadding = RECT_PADDING_NOT_INIT; LLIMFloater::LLIMFloater(const LLUUID& session_id) : LLTransientDockableFloater(NULL, true, session_id), @@ -112,6 +119,8 @@ LLIMFloater::LLIMFloater(const LLUUID& session_id) setOverlapsScreenChannel(true); LLTransientFloaterMgr::getInstance()->addControlView(LLTransientFloaterMgr::IM, this); + + setDocked(true); } void LLIMFloater::onFocusLost() @@ -125,13 +134,12 @@ void LLIMFloater::onFocusReceived() { LLIMModel::getInstance()->setActiveSessionID(mSessionID); - // return focus to the input field when active tab in the multitab container is clicked. - if (isChatMultiTab() && mInputEditor) + LLBottomTray::getInstance()->getChicletPanel()->setChicletToggleState(mSessionID, true); + + if (getVisible()) { - mInputEditor->setFocus(TRUE); + LLIMModel::instance().sendNoUnreadMessages(mSessionID); } - - LLBottomTray::getInstance()->getChicletPanel()->setChicletToggleState(mSessionID, true); } // virtual @@ -271,6 +279,7 @@ BOOL LLIMFloater::postBuild() mInputEditor->setCommitOnFocusLost( FALSE ); mInputEditor->setRevertOnEsc( FALSE ); mInputEditor->setReplaceNewlinesWithSpaces( FALSE ); + mInputEditor->setPassDelete( TRUE ); std::string session_name(LLIMModel::instance().getName(mSessionID)); @@ -368,6 +377,8 @@ void LLIMFloater::onSlide() //static LLIMFloater* LLIMFloater::show(const LLUUID& session_id) { + closeHiddenIMToasts(); + if (!gIMMgr->hasSession(session_id)) return NULL; if(!isChatMultiTab()) @@ -407,12 +418,7 @@ LLIMFloater* LLIMFloater::show(const LLUUID& session_id) } } - if (floater_container) - { - //selecting the panel resets a chiclet's counter - floater_container->selectFloater(floater); - floater_container->setVisible(TRUE); - } + floater->openFloater(floater->getKey()); } else { @@ -444,25 +450,50 @@ LLIMFloater* LLIMFloater::show(const LLUUID& session_id) return floater; } +//static +bool LLIMFloater::resetAllowedRectPadding(const LLSD& newvalue) +{ + //reset allowed rect right padding if "SidebarCameraMovement" option + //or sidebar state changed + sAllowedRectRightPadding = RECT_PADDING_NEED_RECALC ; + return true; +} + void LLIMFloater::getAllowedRect(LLRect& rect) { - rect = gViewerWindow->getWorldViewRectRaw(); - static S32 right_padding = 0; - if (right_padding == 0) + if (sAllowedRectRightPadding == RECT_PADDING_NOT_INIT) //wasn't initialized + { + gSavedSettings.getControl("SidebarCameraMovement")->getSignal()->connect(boost::bind(&LLIMFloater::resetAllowedRectPadding, _2)); + + LLSideTray* side_bar = LLSideTray::getInstance(); + side_bar->getCollapseSignal().connect(boost::bind(&LLIMFloater::resetAllowedRectPadding, _2)); + sAllowedRectRightPadding = RECT_PADDING_NEED_RECALC; + } + + rect = gViewerWindow->getWorldViewRectScaled(); + if (sAllowedRectRightPadding == RECT_PADDING_NEED_RECALC) //recalc allowed rect right padding { LLPanel* side_bar_tabs = gViewerWindow->getRootView()->getChild<LLPanel> ( "side_bar_tabs"); - right_padding = side_bar_tabs->getRect().getWidth(); + sAllowedRectRightPadding = side_bar_tabs->getRect().getWidth(); LLTransientFloaterMgr::getInstance()->addControlView(side_bar_tabs); + + if (gSavedSettings.getBOOL("SidebarCameraMovement") == FALSE) + { + LLSideTray* side_bar = LLSideTray::getInstance(); + + if (side_bar->getVisible() && !side_bar->getCollapsed()) + sAllowedRectRightPadding += side_bar->getRect().getWidth(); + } } - rect.mRight -= right_padding; + rect.mRight -= sAllowedRectRightPadding; } void LLIMFloater::setDocked(bool docked, bool pop_on_undock) { // update notification channel state - LLNotificationsUI::LLScreenChannel* channel = dynamic_cast<LLNotificationsUI::LLScreenChannel*> + LLNotificationsUI::LLScreenChannel* channel = static_cast<LLNotificationsUI::LLScreenChannel*> (LLNotificationsUI::LLChannelManager::getInstance()-> findChannelByID(LLUUID(gSavedSettings.getString("NotificationChannelUUID")))); @@ -481,7 +512,7 @@ void LLIMFloater::setDocked(bool docked, bool pop_on_undock) void LLIMFloater::setVisible(BOOL visible) { - LLNotificationsUI::LLScreenChannel* channel = dynamic_cast<LLNotificationsUI::LLScreenChannel*> + LLNotificationsUI::LLScreenChannel* channel = static_cast<LLNotificationsUI::LLScreenChannel*> (LLNotificationsUI::LLChannelManager::getInstance()-> findChannelByID(LLUUID(gSavedSettings.getString("NotificationChannelUUID")))); LLTransientDockableFloater::setVisible(visible); @@ -493,11 +524,19 @@ void LLIMFloater::setVisible(BOOL visible) channel->redrawToasts(); } - if (visible && mChatHistory && mInputEditor) + BOOL is_minimized = visible && isChatMultiTab() + ? LLIMFloaterContainer::getInstance()->isMinimized() + : !visible; + + if (!is_minimized && mChatHistory && mInputEditor) { //only if floater was construced and initialized from xml updateMessages(); - mInputEditor->setFocus(TRUE); + //prevent stealing focus when opening a background IM tab (EXT-5387, checking focus for EXT-6781) + if (!isChatMultiTab() || hasFocus()) + { + mInputEditor->setFocus(TRUE); + } } if(!visible) @@ -515,8 +554,18 @@ BOOL LLIMFloater::getVisible() if(isChatMultiTab()) { LLIMFloaterContainer* im_container = LLIMFloaterContainer::getInstance(); + + // Treat inactive floater as invisible. + bool is_active = im_container->getActiveFloater() == this; + + //torn off floater is always inactive + if (!is_active && getHost() != im_container) + { + return LLTransientDockableFloater::getVisible(); + } + // getVisible() returns TRUE when Tabbed IM window is minimized. - return !im_container->isMinimized() && im_container->getVisible(); + return is_active && !im_container->isMinimized() && im_container->getVisible(); } else { @@ -599,7 +648,16 @@ void LLIMFloater::updateMessages() bool use_plain_text_chat_history = gSavedSettings.getBOOL("PlainTextChatHistory"); std::list<LLSD> messages; - LLIMModel::instance().getMessages(mSessionID, messages, mLastMessageIndex+1); + + // we shouldn't reset unread message counters if IM floater doesn't have focus + if (hasFocus()) + { + LLIMModel::instance().getMessages(mSessionID, messages, mLastMessageIndex+1); + } + else + { + LLIMModel::instance().getMessagesSilently(mSessionID, messages, mLastMessageIndex+1); + } if (messages.size()) { @@ -619,17 +677,37 @@ void LLIMFloater::updateMessages() LLUUID from_id = msg["from_id"].asUUID(); std::string from = msg["from"].asString(); std::string message = msg["message"].asString(); + bool is_history = msg["is_history"].asBoolean(); LLChat chat; chat.mFromID = from_id; chat.mSessionID = mSessionID; chat.mFromName = from; chat.mTimeStr = time; + chat.mChatStyle = is_history ? CHAT_STYLE_HISTORY : chat.mChatStyle; // process offer notification if (msg.has("notification_id")) { chat.mNotifId = msg["notification_id"].asUUID(); + // if notification exists - embed it + if (LLNotificationsUtil::find(chat.mNotifId) != NULL) + { + // remove embedded notification from channel + LLNotificationsUI::LLScreenChannel* channel = static_cast<LLNotificationsUI::LLScreenChannel*> + (LLNotificationsUI::LLChannelManager::getInstance()-> + findChannelByID(LLUUID(gSavedSettings.getString("NotificationChannelUUID")))); + if (getVisible()) + { + // toast will be automatically closed since it is not storable toast + channel->hideToast(chat.mNotifId); + } + } + // if notification doesn't exist - try to use next message which should be log entry + else + { + continue; + } } //process text message else @@ -639,6 +717,19 @@ void LLIMFloater::updateMessages() mChatHistory->appendMessage(chat, chat_args); mLastMessageIndex = msg["index"].asInteger(); + + // if it is a notification - next message is a notification history log, so skip it + if (chat.mNotifId.notNull() && LLNotificationsUtil::find(chat.mNotifId) != NULL) + { + if (++iter == iter_end) + { + break; + } + else + { + mLastMessageIndex++; + } + } } } } @@ -664,15 +755,6 @@ void LLIMFloater::onInputEditorFocusReceived( LLFocusableElement* caller, void* //in disconnected state IM input editor should be disabled self->mInputEditor->setEnabled(!gDisconnected); } - - // when IM Floater is a part of the multitab container LLTabContainer set focus to the first - // child on tab button's mouse up. This leads input field lost focus. See EXT-3852. - if (isChatMultiTab()) - { - // So, clear control captured mouse to prevent LLTabContainer set focus on the panel's first child. - // do not pass self->mInputEditor, this leads to have "Edit Text" mouse pointer wherever it is. - gFocusMgr.setMouseCapture(NULL); - } } // static @@ -874,7 +956,7 @@ BOOL LLIMFloater::dropCallingCard(LLInventoryItem* item, BOOL drop) { if(drop) { - std::vector<LLUUID> ids; + uuid_vec_t ids; ids.push_back(item->getCreatorUUID()); inviteToSession(ids); } @@ -907,7 +989,7 @@ BOOL LLIMFloater::dropCategory(LLInventoryCategory* category, BOOL drop) } else if(drop) { - std::vector<LLUUID> ids; + uuid_vec_t ids; ids.reserve(count); for(S32 i = 0; i < count; ++i) { @@ -944,7 +1026,7 @@ private: LLUUID mSessionID; }; -BOOL LLIMFloater::inviteToSession(const std::vector<LLUUID>& ids) +BOOL LLIMFloater::inviteToSession(const uuid_vec_t& ids) { LLViewerRegion* region = gAgent.getRegion(); if (!region) @@ -1035,6 +1117,41 @@ void LLIMFloater::removeTypingIndicator(const LLIMInfo* im_info) } // static +void LLIMFloater::closeHiddenIMToasts() +{ + class IMToastMatcher: public LLNotificationsUI::LLScreenChannel::Matcher + { + public: + bool matches(const LLNotificationPtr notification) const + { + // "notifytoast" type of notifications is reserved for IM notifications + return "notifytoast" == notification->getType(); + } + }; + + LLNotificationsUI::LLScreenChannel* channel = LLNotificationsUI::LLChannelManager::getNotificationScreenChannel(); + if (channel != NULL) + { + channel->closeHiddenToasts(IMToastMatcher()); + } +} +// static +void LLIMFloater::confirmLeaveCallCallback(const LLSD& notification, const LLSD& response) +{ + S32 option = LLNotificationsUtil::getSelectedOption(notification, response); + const LLSD& payload = notification["payload"]; + LLUUID session_id = payload["session_id"]; + + LLFloater* im_floater = LLFloaterReg::findInstance("impanel", session_id); + if (option == 0 && im_floater != NULL) + { + im_floater->closeFloater(); + } + + return; +} + +// static bool LLIMFloater::isChatMultiTab() { // Restart is required in order to change chat window type. @@ -1083,3 +1200,31 @@ void LLIMFloater::onIMChicletCreated( const LLUUID& session_id ) } } + +void LLIMFloater::onClickCloseBtn() +{ + + LLIMModel::LLIMSession* session = LLIMModel::instance().findIMSession( + mSessionID); + + if (session == NULL) + { + llwarns << "Empty session." << llendl; + return; + } + + bool is_call_with_chat = session->isGroupSessionType() + || session->isAdHocSessionType() || session->isP2PSessionType(); + + LLVoiceChannel* voice_channel = LLIMModel::getInstance()->getVoiceChannel(mSessionID); + + if (is_call_with_chat && voice_channel != NULL && voice_channel->isActive()) + { + LLSD payload; + payload["session_id"] = mSessionID; + LLNotificationsUtil::add("ConfirmLeaveCall", LLSD(), payload, confirmLeaveCallCallback); + return; + } + + LLFloater::onClickCloseBtn(); +} diff --git a/indra/newview/llimfloater.h b/indra/newview/llimfloater.h index 2f034d02b8..f1e68a2b3d 100644 --- a/indra/newview/llimfloater.h +++ b/indra/newview/llimfloater.h @@ -50,6 +50,7 @@ class LLInventoryCategory; */ class LLIMFloater : public LLTransientDockableFloater { + LOG_CLASS(LLIMFloater); public: LLIMFloater(const LLUUID& session_id); @@ -120,6 +121,10 @@ public: virtual LLTransientFloaterMgr::ETransientGroup getGroup() { return LLTransientFloaterMgr::IM; } +protected: + /* virtual */ + void onClickCloseBtn(); + private: // process focus events to set a currently active session /* virtual */ void onFocusLost(); @@ -129,7 +134,7 @@ private: BOOL dropCategory(LLInventoryCategory* category, BOOL drop); BOOL isInviteAllowed() const; - BOOL inviteToSession(const std::vector<LLUUID>& agent_ids); + BOOL inviteToSession(const uuid_vec_t& agent_ids); static void onInputEditorFocusReceived( LLFocusableElement* caller, void* userdata ); static void onInputEditorFocusLost(LLFocusableElement* caller, void* userdata); @@ -148,6 +153,14 @@ private: // Remove the "User is typing..." indicator. void removeTypingIndicator(const LLIMInfo* im_info = NULL); + static void closeHiddenIMToasts(); + + static bool resetAllowedRectPadding(const LLSD& newvalue); + //need to keep this static for performance issues + static S32 sAllowedRectRightPadding; + + static void confirmLeaveCallCallback(const LLSD& notification, const LLSD& response); + LLPanelChatControlPanel* mControlPanel; LLUUID mSessionID; S32 mLastMessageIndex; diff --git a/indra/newview/llimfloatercontainer.cpp b/indra/newview/llimfloatercontainer.cpp index 22eb9a51d2..9eb11a6ac4 100644 --- a/indra/newview/llimfloatercontainer.cpp +++ b/indra/newview/llimfloatercontainer.cpp @@ -37,7 +37,9 @@ #include "llfloaterreg.h" #include "llimview.h" #include "llavatariconctrl.h" +#include "llgroupiconctrl.h" #include "llagent.h" +#include "lltransientfloatermgr.h" // // LLIMFloaterContainer @@ -46,9 +48,13 @@ LLIMFloaterContainer::LLIMFloaterContainer(const LLSD& seed) : LLMultiFloater(seed) { mAutoResize = FALSE; + LLTransientFloaterMgr::getInstance()->addControlView(LLTransientFloaterMgr::IM, this); } -LLIMFloaterContainer::~LLIMFloaterContainer(){} +LLIMFloaterContainer::~LLIMFloaterContainer() +{ + LLTransientFloaterMgr::getInstance()->removeControlView(LLTransientFloaterMgr::IM, this); +} BOOL LLIMFloaterContainer::postBuild() { @@ -90,85 +96,39 @@ void LLIMFloaterContainer::addFloater(LLFloater* floaterp, LLUUID session_id = floaterp->getKey(); - if(gAgent.isInGroup(session_id)) + LLIconCtrl* icon = 0; + + if(gAgent.isInGroup(session_id, TRUE)) { + LLGroupIconCtrl::Params icon_params = LLUICtrlFactory::instance().getDefaultParams<LLGroupIconCtrl>(); + icon_params.group_id = session_id; + icon = LLUICtrlFactory::instance().createWidget<LLGroupIconCtrl>(icon_params); + mSessions[session_id] = floaterp; - LLGroupMgrGroupData* group_data = LLGroupMgr::getInstance()->getGroupData(session_id); - LLGroupMgr* gm = LLGroupMgr::getInstance(); - gm->addObserver(session_id, this); floaterp->mCloseSignal.connect(boost::bind(&LLIMFloaterContainer::onCloseFloater, this, session_id)); - - if (group_data && group_data->mInsigniaID.notNull()) - { - mTabContainer->setTabImage(get_ptr_in_map(mSessions, session_id), group_data->mInsigniaID); - } - else - { - mTabContainer->setTabImage(floaterp, "Generic_Group"); - gm->sendGroupPropertiesRequest(session_id); - } } else { LLUUID avatar_id = LLIMModel::getInstance()->getOtherParticipantID(session_id); - LLAvatarPropertiesProcessor& app = LLAvatarPropertiesProcessor::instance(); - app.addObserver(avatar_id, this); - floaterp->mCloseSignal.connect(boost::bind(&LLIMFloaterContainer::onCloseFloater, this, avatar_id)); - mSessions[avatar_id] = floaterp; - LLUUID* icon_id_ptr = LLAvatarIconIDCache::getInstance()->get(avatar_id); - if(icon_id_ptr && icon_id_ptr->notNull()) - { - mTabContainer->setTabImage(floaterp, *icon_id_ptr); - } - else - { - mTabContainer->setTabImage(floaterp, "Generic_Person"); - app.sendAvatarPropertiesRequest(avatar_id); - } - } -} - -void LLIMFloaterContainer::processProperties(void* data, enum EAvatarProcessorType type) -{ - if (APT_PROPERTIES == type) - { - LLAvatarData* avatar_data = static_cast<LLAvatarData*>(data); - if (avatar_data) - { - LLUUID avatar_id = avatar_data->avatar_id; - LLUUID* cached_avatarId = LLAvatarIconIDCache::getInstance()->get(avatar_id); - if(cached_avatarId && cached_avatarId->notNull() && avatar_data->image_id != *cached_avatarId) - { - LLAvatarIconIDCache::getInstance()->add(avatar_id,avatar_data->image_id); - mTabContainer->setTabImage(get_ptr_in_map(mSessions, avatar_id), avatar_data->image_id); - } - } - } -} + LLAvatarIconCtrl::Params icon_params = LLUICtrlFactory::instance().getDefaultParams<LLAvatarIconCtrl>(); + icon_params.avatar_id = avatar_id; + icon = LLUICtrlFactory::instance().createWidget<LLAvatarIconCtrl>(icon_params); -void LLIMFloaterContainer::changed(const LLUUID& group_id, LLGroupChange gc) -{ - if (GC_PROPERTIES == gc) - { - LLGroupMgrGroupData* group_data = LLGroupMgr::getInstance()->getGroupData(group_id); - if (group_data && group_data->mInsigniaID.notNull()) - { - mTabContainer->setTabImage(get_ptr_in_map(mSessions, group_id), group_data->mInsigniaID); - } + mSessions[session_id] = floaterp; + floaterp->mCloseSignal.connect(boost::bind(&LLIMFloaterContainer::onCloseFloater, this, session_id)); } + mTabContainer->setTabImage(floaterp, icon); } -void LLIMFloaterContainer::onCloseFloater(LLUUID id) +void LLIMFloaterContainer::onCloseFloater(LLUUID& id) { - LLAvatarPropertiesProcessor::instance().removeObserver(id, this); - LLGroupMgr::instance().removeObserver(id, this); - + mSessions.erase(id); } void LLIMFloaterContainer::onNewMessageReceived(const LLSD& data) { - LLUUID session_id = data["from_id"].asUUID(); + LLUUID session_id = data["session_id"].asUUID(); LLFloater* floaterp = get_ptr_in_map(mSessions, session_id); LLFloater* current_floater = LLMultiFloater::getActiveFloater(); @@ -190,4 +150,20 @@ LLIMFloaterContainer* LLIMFloaterContainer::getInstance() return LLFloaterReg::getTypedInstance<LLIMFloaterContainer>("im_container"); } +void LLIMFloaterContainer::setMinimized(BOOL b) +{ + if (isMinimized() == b) return; + + LLMultiFloater::setMinimized(b); + // Hide minimized floater (see EXT-5315) + setVisible(!b); + + if (isMinimized()) return; + + if (getActiveFloater()) + { + getActiveFloater()->setVisible(TRUE); + } +} + // EOF diff --git a/indra/newview/llimfloatercontainer.h b/indra/newview/llimfloatercontainer.h index bc06f0cbd3..f6cdc25ebd 100644 --- a/indra/newview/llimfloatercontainer.h +++ b/indra/newview/llimfloatercontainer.h @@ -43,7 +43,7 @@ class LLTabContainer; -class LLIMFloaterContainer : public LLMultiFloater, public LLAvatarPropertiesObserver, public LLParticularGroupMgrObserver +class LLIMFloaterContainer : public LLMultiFloater { public: LLIMFloaterContainer(const LLSD& seed); @@ -51,25 +51,24 @@ public: /*virtual*/ BOOL postBuild(); /*virtual*/ void onOpen(const LLSD& key); + void onCloseFloater(LLUUID& id); /*virtual*/ void addFloater(LLFloater* floaterp, BOOL select_added_floater, LLTabContainer::eInsertionPoint insertion_point = LLTabContainer::END); - void processProperties(void* data, EAvatarProcessorType type); - void changed(const LLUUID& group_id, LLGroupChange gc); - static LLFloater* getCurrentVoiceFloater(); static LLIMFloaterContainer* findInstance(); static LLIMFloaterContainer* getInstance(); + virtual void setMinimized(BOOL b); + private: typedef std::map<LLUUID,LLFloater*> avatarID_panel_map_t; avatarID_panel_map_t mSessions; - void onCloseFloater(LLUUID avatar_id); void onNewMessageReceived(const LLSD& data); }; diff --git a/indra/newview/llimpanel.cpp b/indra/newview/llimpanel.cpp index 4bdf5f42dc..0e3b78df7f 100644 --- a/indra/newview/llimpanel.cpp +++ b/indra/newview/llimpanel.cpp @@ -300,7 +300,7 @@ void LLFloaterIMPanel::onVolumeChange(LLUICtrl* source, void* user_data) LLFloaterIMPanel* floaterp = (LLFloaterIMPanel*)user_data; if (floaterp) { - gVoiceClient->setUserVolume(floaterp->mOtherParticipantUUID, (F32)source->getValue().asReal()); + LLVoiceClient::getInstance()->setUserVolume(floaterp->mOtherParticipantUUID, (F32)source->getValue().asReal()); } } @@ -312,7 +312,7 @@ void LLFloaterIMPanel::draw() BOOL enable_connect = (region && region->getCapability("ChatSessionRequest") != "") && mSessionInitialized - && LLVoiceClient::voiceEnabled() + && LLVoiceClient::getInstance()->voiceEnabled() && mCallBackEnabled; // hide/show start call and end call buttons @@ -320,8 +320,8 @@ void LLFloaterIMPanel::draw() if (!voice_channel) return; - childSetVisible("end_call_btn", LLVoiceClient::voiceEnabled() && voice_channel->getState() >= LLVoiceChannel::STATE_CALL_STARTED); - childSetVisible("start_call_btn", LLVoiceClient::voiceEnabled() && voice_channel->getState() < LLVoiceChannel::STATE_CALL_STARTED); + childSetVisible("end_call_btn", LLVoiceClient::getInstance()->voiceEnabled() && voice_channel->getState() >= LLVoiceChannel::STATE_CALL_STARTED); + childSetVisible("start_call_btn", LLVoiceClient::getInstance()->voiceEnabled() && voice_channel->getState() < LLVoiceChannel::STATE_CALL_STARTED); childSetEnabled("start_call_btn", enable_connect); childSetEnabled("send_btn", !childGetValue("chat_editor").asString().empty()); @@ -384,11 +384,11 @@ void LLFloaterIMPanel::draw() else { // refresh volume and mute checkbox - childSetVisible("speaker_volume", LLVoiceClient::voiceEnabled() && voice_channel->isActive()); - childSetValue("speaker_volume", gVoiceClient->getUserVolume(mOtherParticipantUUID)); + childSetVisible("speaker_volume", LLVoiceClient::getInstance()->voiceEnabled() && voice_channel->isActive()); + childSetValue("speaker_volume", LLVoiceClient::getInstance()->getUserVolume(mOtherParticipantUUID)); childSetValue("mute_btn", LLMuteList::getInstance()->isMuted(mOtherParticipantUUID, LLMute::flagVoiceChat)); - childSetVisible("mute_btn", LLVoiceClient::voiceEnabled() && voice_channel->isActive()); + childSetVisible("mute_btn", LLVoiceClient::getInstance()->voiceEnabled() && voice_channel->isActive()); } LLFloater::draw(); } diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index 0c64c2b032..ddfcd68e38 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -36,12 +36,14 @@ #include "llfloaterreg.h" #include "llfontgl.h" +#include "llgl.h" #include "llrect.h" #include "llerror.h" #include "llbutton.h" #include "llhttpclient.h" #include "llsdutil_math.h" #include "llstring.h" +#include "lltextutil.h" #include "lltrans.h" #include "lluictrlfactory.h" @@ -64,7 +66,6 @@ #include "llnearbychat.h" #include "llspeakers.h" //for LLIMSpeakerMgr #include "lltextbox.h" -#include "lltextutil.h" #include "llviewercontrol.h" #include "llviewerparcelmgr.h" @@ -77,6 +78,12 @@ const static std::string IM_FROM_ID("from_id"); const static std::string NO_SESSION("(IM Session Doesn't Exist)"); const static std::string ADHOC_NAME_SUFFIX(" Conference"); +const static std::string NEARBY_P2P_BY_OTHER("nearby_P2P_by_other"); +const static std::string NEARBY_P2P_BY_AGENT("nearby_P2P_by_agent"); + +/** Timeout of outgoing session initialization (in seconds) */ +const static U32 SESSION_INITIALIZATION_TIMEOUT = 30; + std::string LLCallDialogManager::sPreviousSessionlName = ""; LLIMModel::LLIMSession::SType LLCallDialogManager::sPreviousSessionType = LLIMModel::LLIMSession::P2P_SESSION; std::string LLCallDialogManager::sCurrentSessionlName = ""; @@ -88,6 +95,19 @@ const LLUUID LLOutgoingCallDialog::OCD_KEY = LLUUID("7CF78E11-0CFE-498D-ADB9-141 // LLIMMgr* gIMMgr = NULL; + +BOOL LLSessionTimeoutTimer::tick() +{ + if (mSessionId.isNull()) return TRUE; + + LLIMModel::LLIMSession* session = LLIMModel::getInstance()->findIMSession(mSessionId); + if (session && !session->mSessionInitialized) + { + gIMMgr->showSessionStartError("session_initialization_timed_out_error", mSessionId); + } + return TRUE; +} + void toast_callback(const LLSD& msg){ // do not show toast in busy mode or it goes from agent if (gAgent.getBusy() || gAgent.getID() == msg["from_id"]) @@ -143,7 +163,7 @@ LLIMModel::LLIMModel() addNewMsgCallback(toast_callback); } -LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, const LLUUID& other_participant_id, const std::vector<LLUUID>& ids, bool voice) +LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, const LLUUID& other_participant_id, const uuid_vec_t& ids, bool voice) : mSessionID(session_id), mName(name), mType(type), @@ -211,6 +231,11 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string& //so we're already initialized mSessionInitialized = true; } + else + { + //tick returns TRUE - timer will be deleted after the tick + new LLSessionTimeoutTimer(mSessionID, SESSION_INITIALIZATION_TIMEOUT); + } if (IM_NOTHING_SPECIAL == type) { @@ -232,9 +257,8 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string& void LLIMModel::LLIMSession::onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state, const LLVoiceChannel::EDirection& direction) { - std::string you = LLTrans::getString("You"); - std::string started_call = LLTrans::getString("started_call"); - std::string joined_call = LLTrans::getString("joined_call"); + std::string you_joined_call = LLTrans::getString("you_joined_call"); + std::string you_started_call = LLTrans::getString("you_started_call"); std::string other_avatar_name = ""; std::string message; @@ -252,13 +276,15 @@ void LLIMModel::LLIMSession::onVoiceChannelStateChanged(const LLVoiceChannel::ES switch(new_state) { case LLVoiceChannel::STATE_CALL_STARTED : - message = other_avatar_name + " " + started_call; - LLIMModel::getInstance()->addMessageSilently(mSessionID, SYSTEM_FROM, LLUUID::null, message); - - break; + { + LLStringUtil::format_map_t string_args; + string_args["[NAME]"] = other_avatar_name; + message = LLTrans::getString("name_started_call", string_args); + LLIMModel::getInstance()->addMessage(mSessionID, SYSTEM_FROM, LLUUID::null, message); + break; + } case LLVoiceChannel::STATE_CONNECTED : - message = you + " " + joined_call; - LLIMModel::getInstance()->addMessageSilently(mSessionID, SYSTEM_FROM, LLUUID::null, message); + LLIMModel::getInstance()->addMessage(mSessionID, SYSTEM_FROM, LLUUID::null, you_joined_call); default: break; } @@ -268,12 +294,11 @@ void LLIMModel::LLIMSession::onVoiceChannelStateChanged(const LLVoiceChannel::ES switch(new_state) { case LLVoiceChannel::STATE_CALL_STARTED : - message = you + " " + started_call; - LLIMModel::getInstance()->addMessageSilently(mSessionID, SYSTEM_FROM, LLUUID::null, message); + LLIMModel::getInstance()->addMessage(mSessionID, SYSTEM_FROM, LLUUID::null, you_started_call); break; case LLVoiceChannel::STATE_CONNECTED : - message = other_avatar_name + " " + joined_call; - LLIMModel::getInstance()->addMessageSilently(mSessionID, SYSTEM_FROM, LLUUID::null, message); + message = LLTrans::getString("answered_call"); + LLIMModel::getInstance()->addMessage(mSessionID, SYSTEM_FROM, LLUUID::null, message); default: break; } @@ -287,8 +312,7 @@ void LLIMModel::LLIMSession::onVoiceChannelStateChanged(const LLVoiceChannel::ES switch(new_state) { case LLVoiceChannel::STATE_CONNECTED : - message = you + " " + joined_call; - LLIMModel::getInstance()->addMessageSilently(mSessionID, SYSTEM_FROM, LLUUID::null, message); + LLIMModel::getInstance()->addMessage(mSessionID, SYSTEM_FROM, LLUUID::null, you_joined_call); default: break; } @@ -298,8 +322,7 @@ void LLIMModel::LLIMSession::onVoiceChannelStateChanged(const LLVoiceChannel::ES switch(new_state) { case LLVoiceChannel::STATE_CALL_STARTED : - message = you + " " + started_call; - LLIMModel::getInstance()->addMessageSilently(mSessionID, SYSTEM_FROM, LLUUID::null, message); + LLIMModel::getInstance()->addMessage(mSessionID, SYSTEM_FROM, LLUUID::null, you_started_call); break; default: break; @@ -319,13 +342,13 @@ LLIMModel::LLIMSession::~LLIMSession() mSpeakers = NULL; // End the text IM session if necessary - if(gVoiceClient && mOtherParticipantID.notNull()) + if(LLVoiceClient::getInstance() && mOtherParticipantID.notNull()) { switch(mType) { case IM_NOTHING_SPECIAL: case IM_SESSION_P2P_INVITE: - gVoiceClient->endUserIMSession(mOtherParticipantID); + LLVoiceClient::getInstance()->endUserIMSession(mOtherParticipantID); break; default: @@ -354,7 +377,7 @@ void LLIMModel::LLIMSession::sessionInitReplyReceived(const LLUUID& new_session_ } } -void LLIMModel::LLIMSession::addMessage(const std::string& from, const LLUUID& from_id, const std::string& utf8_text, const std::string& time) +void LLIMModel::LLIMSession::addMessage(const std::string& from, const LLUUID& from_id, const std::string& utf8_text, const std::string& time, const bool is_history) { LLSD message; message["from"] = from; @@ -362,6 +385,7 @@ void LLIMModel::LLIMSession::addMessage(const std::string& from, const LLUUID& f message["message"] = utf8_text; message["time"] = time; message["index"] = (LLSD::Integer)mMsgs.size(); + message["is_history"] = is_history; mMsgs.push_front(message); @@ -390,7 +414,7 @@ void LLIMModel::LLIMSession::addMessagesFromHistory(const std::list<LLSD>& histo std::string timestamp = msg[IM_TIME]; std::string text = msg[IM_TEXT]; - addMessage(from, from_id, text, timestamp); + addMessage(from, from_id, text, timestamp, true); it++; } @@ -404,11 +428,11 @@ void LLIMModel::LLIMSession::chatFromLogFile(LLLogChat::ELogLineType type, const if (type == LLLogChat::LOG_LINE) { - self->addMessage("", LLSD(), msg["message"].asString(), ""); + self->addMessage("", LLSD(), msg["message"].asString(), "", true); } else if (type == LLLogChat::LOG_LLSD) { - self->addMessage(msg["from"].asString(), msg["from_id"].asUUID(), msg["message"].asString(), msg["time"].asString()); + self->addMessage(msg["from"].asString(), msg["from_id"].asUUID(), msg["message"].asString(), msg["time"].asString(), true); } } @@ -419,7 +443,7 @@ LLIMModel::LLIMSession* LLIMModel::findIMSession(const LLUUID& session_id) const } //*TODO consider switching to using std::set instead of std::list for holding LLUUIDs across the whole code -LLIMModel::LLIMSession* LLIMModel::findAdHocIMSession(const std::vector<LLUUID>& ids) +LLIMModel::LLIMSession* LLIMModel::findAdHocIMSession(const uuid_vec_t& ids) { S32 num = ids.size(); if (!num) return NULL; @@ -436,7 +460,7 @@ LLIMModel::LLIMSession* LLIMModel::findAdHocIMSession(const std::vector<LLUUID>& std::list<LLUUID> tmp_list(session->mInitialTargetIDs.begin(), session->mInitialTargetIDs.end()); - std::vector<LLUUID>::const_iterator iter = ids.begin(); + uuid_vec_t::const_iterator iter = ids.begin(); while (iter != ids.end()) { tmp_list.remove(*iter); @@ -567,7 +591,7 @@ void LLIMModel::testMessages() //session name should not be empty bool LLIMModel::newSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, - const LLUUID& other_participant_id, const std::vector<LLUUID>& ids, bool voice) + const LLUUID& other_participant_id, const uuid_vec_t& ids, bool voice) { if (name.empty()) { @@ -592,7 +616,7 @@ bool LLIMModel::newSession(const LLUUID& session_id, const std::string& name, co bool LLIMModel::newSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, const LLUUID& other_participant_id, bool voice) { - std::vector<LLUUID> no_ids; + uuid_vec_t no_ids; return newSession(session_id, name, type, other_participant_id, no_ids, voice); } @@ -604,10 +628,10 @@ bool LLIMModel::clearSession(const LLUUID& session_id) return true; } -void LLIMModel::getMessages(const LLUUID& session_id, std::list<LLSD>& messages, int start_index) +void LLIMModel::getMessagesSilently(const LLUUID& session_id, std::list<LLSD>& messages, int start_index) { LLIMSession* session = findIMSession(session_id); - if (!session) + if (!session) { llwarns << "session " << session_id << "does not exist " << llendl; return; @@ -615,7 +639,7 @@ void LLIMModel::getMessages(const LLUUID& session_id, std::list<LLSD>& messages, int i = session->mMsgs.size() - start_index; - for (std::list<LLSD>::iterator iter = session->mMsgs.begin(); + for (std::list<LLSD>::iterator iter = session->mMsgs.begin(); iter != session->mMsgs.end() && i > 0; iter++) { @@ -624,6 +648,16 @@ void LLIMModel::getMessages(const LLUUID& session_id, std::list<LLSD>& messages, messages.push_back(*iter); i--; } +} + +void LLIMModel::sendNoUnreadMessages(const LLUUID& session_id) +{ + LLIMSession* session = findIMSession(session_id); + if (!session) + { + llwarns << "session " << session_id << "does not exist " << llendl; + return; + } session->mNumUnread = 0; session->mParticipantUnreadMessageCount = 0; @@ -635,6 +669,13 @@ void LLIMModel::getMessages(const LLUUID& session_id, std::list<LLSD>& messages, mNoUnreadMsgsSignal(arg); } +void LLIMModel::getMessages(const LLUUID& session_id, std::list<LLSD>& messages, int start_index) +{ + getMessagesSilently(session_id, messages, start_index); + + sendNoUnreadMessages(session_id); +} + bool LLIMModel::addToHistory(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, const std::string& utf8_text) { LLIMSession* session = findIMSession(session_id); @@ -713,13 +754,22 @@ LLIMModel::LLIMSession* LLIMModel::addMessageSilently(const LLUUID& session_id, return NULL; } - addToHistory(session_id, from, from_id, utf8_text); - if (log2file) logToFile(session_id, from, from_id, utf8_text); + // replace interactive system message marker with correct from string value + std::string from_name = from; + if (INTERACTIVE_SYSTEM_FROM == from) + { + from_name = SYSTEM_FROM; + } + + addToHistory(session_id, from_name, from_id, utf8_text); + if (log2file) logToFile(session_id, from_name, from_id, utf8_text); session->mNumUnread++; //update count of unread messages from real participant - if (!(from_id.isNull() || from_id == gAgentID || SYSTEM_FROM == from)) + if (!(from_id.isNull() || from_id == gAgentID || SYSTEM_FROM == from) + // we should increment counter for interactive system messages() + || INTERACTIVE_SYSTEM_FROM == from) { ++(session->mParticipantUnreadMessageCount); } @@ -873,7 +923,7 @@ void LLIMModel::sendMessage(const std::string& utf8_text, if((offline == IM_OFFLINE) && (LLVoiceClient::getInstance()->isOnlineSIP(other_participant_id))) { // User is online through the OOW connector, but not with a regular viewer. Try to send the message via SLVoice. - sent = gVoiceClient->sendTextMessage(other_participant_id, utf8_text); + sent = LLVoiceClient::getInstance()->sendTextMessage(other_participant_id, utf8_text); } if(!sent) @@ -948,7 +998,42 @@ void LLIMModel::sendMessage(const std::string& utf8_text, } // Add the recipient to the recent people list. - LLRecentPeople::instance().add(other_participant_id); + bool is_not_group_id = LLGroupMgr::getInstance()->getGroupData(other_participant_id) == NULL; + + if (is_not_group_id) + { + +#if 0 + //use this code to add only online members + LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(im_session_id); + LLSpeakerMgr::speaker_list_t speaker_list; + speaker_mgr->getSpeakerList(&speaker_list, true); + for(LLSpeakerMgr::speaker_list_t::iterator it = speaker_list.begin(); it != speaker_list.end(); it++) + { + const LLPointer<LLSpeaker>& speakerp = *it; + + LLRecentPeople::instance().add(speakerp->mID); + } +#else + LLIMModel::LLIMSession* session = LLIMModel::getInstance()->findIMSession(im_session_id); + if( session == 0)//??? shouldn't really happen + { + LLRecentPeople::instance().add(other_participant_id); + } + else + { + for(uuid_vec_t::iterator it = session->mInitialTargetIDs.begin(); + it!=session->mInitialTargetIDs.end();++it) + { + const LLUUID id = *it; + + LLRecentPeople::instance().add(id); + } + } +#endif + } + + } void session_starter_helper( @@ -1069,7 +1154,7 @@ private: bool LLIMModel::sendStartSession( const LLUUID& temp_session_id, const LLUUID& other_participant_id, - const std::vector<LLUUID>& ids, + const uuid_vec_t& ids, EInstantMessage dialog) { if ( dialog == IM_SESSION_GROUP_START ) @@ -1372,7 +1457,13 @@ void LLCallDialogManager::onVoiceChannelChanged(const LLUUID &session_id) } sSession = session; - sSession->mVoiceChannel->setStateChangedCallback(boost::bind(LLCallDialogManager::onVoiceChannelStateChanged, _1, _2, _3)); + + static boost::signals2::connection prev_channel_state_changed_connection; + // disconnect previously connected callback to avoid have invalid sSession in onVoiceChannelStateChanged() + prev_channel_state_changed_connection.disconnect(); + prev_channel_state_changed_connection = + sSession->mVoiceChannel->setStateChangedCallback(boost::bind(LLCallDialogManager::onVoiceChannelStateChanged, _1, _2, _3, _4)); + if(sCurrentSessionlName != session->mName) { sPreviousSessionlName = sCurrentSessionlName; @@ -1403,7 +1494,7 @@ void LLCallDialogManager::onVoiceChannelChanged(const LLUUID &session_id) } -void LLCallDialogManager::onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state, const LLVoiceChannel::EDirection& direction) +void LLCallDialogManager::onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state, const LLVoiceChannel::EDirection& direction, bool ended_by_agent) { LLSD mCallDialogPayload; LLOutgoingCallDialog* ocd = NULL; @@ -1423,6 +1514,7 @@ void LLCallDialogManager::onVoiceChannelStateChanged(const LLVoiceChannel::EStat mCallDialogPayload["state"] = new_state; mCallDialogPayload["disconnected_channel_name"] = sSession->mName; mCallDialogPayload["session_type"] = sSession->mSessionType; + mCallDialogPayload["ended_by_agent"] = ended_by_agent; switch(new_state) { @@ -1468,6 +1560,13 @@ LLCallDialog::LLCallDialog(const LLSD& payload) mLifetime(DEFAULT_LIFETIME) { setAutoFocus(FALSE); + // force docked state since this floater doesn't save it between recreations + setDocked(true); +} + +LLCallDialog::~LLCallDialog() +{ + LLUI::removePopup(this); } void LLCallDialog::getAllowedRect(LLRect& rect) @@ -1517,6 +1616,15 @@ void LLCallDialog::draw() } } +// virtual +void LLCallDialog::onOpen(const LLSD& key) +{ + LLDockableFloater::onOpen(key); + + // it should be over the all floaters. EXT-5116 + LLUI::addPopup(this); +} + void LLCallDialog::setIcon(const LLSD& session_id, const LLSD& participant_id) { // *NOTE: 12/28/2009: check avaline calls: LLVoiceClient::isParticipantAvatar returns false for them @@ -1609,7 +1717,15 @@ void LLOutgoingCallDialog::show(const LLSD& key) channel_name = LLTextUtil::formatPhoneNumber(channel_name); } childSetTextArg("nearby", "[VOICE_CHANNEL_NAME]", channel_name); - childSetTextArg("nearby_P2P", "[VOICE_CHANNEL_NAME]", mPayload["disconnected_channel_name"].asString()); + + // skipping "You will now be reconnected to nearby" in notification when call is ended by disabling voice, + // so no reconnection to nearby chat happens (EXT-4397) + bool voice_works = LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking(); + std::string reconnect_nearby = voice_works ? LLTrans::getString("reconnect_nearby") : std::string(); + childSetTextArg("nearby", "[RECONNECT_NEARBY]", reconnect_nearby); + + const std::string& nearby_str = mPayload["ended_by_agent"] ? NEARBY_P2P_BY_AGENT : NEARBY_P2P_BY_OTHER; + childSetTextArg(nearby_str, "[RECONNECT_NEARBY]", reconnect_nearby); } std::string callee_name = mPayload["session_name"].asString(); @@ -1643,11 +1759,14 @@ void LLOutgoingCallDialog::show(const LLSD& key) { case LLVoiceChannel::STATE_CALL_STARTED : getChild<LLTextBox>("calling")->setVisible(true); + getChild<LLButton>("Cancel")->setVisible(true); if(show_oldchannel) { getChild<LLTextBox>("leaving")->setVisible(true); } break; + // STATE_READY is here to show appropriate text for ad-hoc and group calls when floater is shown(EXT-6893) + case LLVoiceChannel::STATE_READY : case LLVoiceChannel::STATE_RINGING : if(show_oldchannel) { @@ -1664,7 +1783,8 @@ void LLOutgoingCallDialog::show(const LLSD& key) case LLVoiceChannel::STATE_HUNG_UP : if (mPayload["session_type"].asInteger() == LLIMModel::LLIMSession::P2P_SESSION) { - getChild<LLTextBox>("nearby_P2P")->setVisible(true); + const std::string& nearby_str = mPayload["ended_by_agent"] ? NEARBY_P2P_BY_AGENT : NEARBY_P2P_BY_OTHER; + getChild<LLTextBox>(nearby_str)->setVisible(true); } else { @@ -1683,7 +1803,8 @@ void LLOutgoingCallDialog::hideAllText() getChild<LLTextBox>("calling")->setVisible(false); getChild<LLTextBox>("leaving")->setVisible(false); getChild<LLTextBox>("connecting")->setVisible(false); - getChild<LLTextBox>("nearby_P2P")->setVisible(false); + getChild<LLTextBox>("nearby_P2P_by_other")->setVisible(false); + getChild<LLTextBox>("nearby_P2P_by_agent")->setVisible(false); getChild<LLTextBox>("nearby")->setVisible(false); getChild<LLTextBox>("noanswer")->setVisible(false); } @@ -1726,8 +1847,8 @@ LLCallDialog(payload) void LLIncomingCallDialog::onLifetimeExpired() { - // check whether a call is valid or not - if (LLVoiceClient::getInstance()->findSession(mPayload["caller_id"].asUUID())) + std::string session_handle = mPayload["session_handle"].asString(); + if (LLVoiceClient::getInstance()->isValidChannel(session_handle)) { // restart notification's timer if call is still valid mLifetimeTimer.start(); @@ -1820,15 +1941,24 @@ void LLIncomingCallDialog::onOpen(const LLSD& key) { LLCallDialog::onOpen(key); + LLStringUtil::format_map_t args; + LLGroupData data; + // if it's a group call, retrieve group name to use it in question + if (gAgent.getGroupData(key["session_id"].asUUID(), data)) + { + args["[GROUP]"] = data.mName; + } // tell the user which voice channel they would be leaving LLVoiceChannel *voice = LLVoiceChannel::getCurrentVoiceChannel(); if (voice && !voice->getSessionName().empty()) { - childSetTextArg("question", "[CURRENT_CHAT]", voice->getSessionName()); + args["[CURRENT_CHAT]"] = voice->getSessionName(); + childSetText("question", getString(key["question_type"].asString(), args)); } else { - childSetTextArg("question", "[CURRENT_CHAT]", getString("localchat")); + args["[CURRENT_CHAT]"] = getString("localchat"); + childSetText("question", getString(key["question_type"].asString(), args)); } } @@ -1946,8 +2076,9 @@ void LLIncomingCallDialog::processCallResponse(S32 response) // send notification message to the corresponding chat if (mPayload["notify_box_type"].asString() == "VoiceInviteGroup" || mPayload["notify_box_type"].asString() == "VoiceInviteAdHoc") { - std::string started_call = LLTrans::getString("started_call"); - std::string message = mPayload["caller_name"].asString() + " " + started_call; + LLStringUtil::format_map_t string_args; + string_args["[NAME]"] = mPayload["caller_name"].asString(); + std::string message = LLTrans::getString("name_started_call", string_args); LLIMModel::getInstance()->addMessageSilently(session_id, SYSTEM_FROM, LLUUID::null, message); } } @@ -1961,10 +2092,10 @@ void LLIncomingCallDialog::processCallResponse(S32 response) { if (type == IM_SESSION_P2P_INVITE) { - if(gVoiceClient) + if(LLVoiceClient::getInstance()) { std::string s = mPayload["session_handle"].asString(); - gVoiceClient->declineInvite(s); + LLVoiceClient::getInstance()->declineInvite(s); } } else @@ -2052,11 +2183,8 @@ bool inviteUserResponse(const LLSD& notification, const LLSD& response) { if (type == IM_SESSION_P2P_INVITE) { - if(gVoiceClient) - { - std::string s = payload["session_handle"].asString(); - gVoiceClient->declineInvite(s); - } + std::string s = payload["session_handle"].asString(); + LLVoiceClient::getInstance()->declineInvite(s); } else { @@ -2183,12 +2311,20 @@ void LLIMMgr::addSystemMessage(const LLUUID& session_id, const std::string& mess } else // going to IM session { + message = LLTrans::getString(message_name + "-im"); + message.setArgs(args); if (hasSession(session_id)) { - message = LLTrans::getString(message_name + "-im"); - message.setArgs(args); gIMMgr->addMessage(session_id, LLUUID::null, SYSTEM_FROM, message.getString()); } + // log message to file + else + { + std::string session_name; + // since we select user to share item with - his name is already in cache + gCacheName->getFullName(args["user_id"], session_name); + LLIMModel::instance().logToFile(session_name, SYSTEM_FROM, LLUUID::null, message.getString()); + } } } @@ -2361,6 +2497,8 @@ void LLIMMgr::inviteToSession( } std::string notify_box_type; + // voice invite question is different from default only for group call (EXT-7118) + std::string question_type = "VoiceInviteQuestionDefault"; BOOL ad_hoc_invite = FALSE; if(type == IM_SESSION_P2P_INVITE) @@ -2372,6 +2510,7 @@ void LLIMMgr::inviteToSession( { //only really old school groups have voice invitations notify_box_type = "VoiceInviteGroup"; + question_type = "VoiceInviteQuestionGroup"; } else if ( inv_type == INVITATION_TYPE_VOICE ) { @@ -2396,6 +2535,7 @@ void LLIMMgr::inviteToSession( payload["session_handle"] = session_handle; payload["session_uri"] = session_uri; payload["notify_box_type"] = notify_box_type; + payload["question_type"] = question_type; LLVoiceChannel* channelp = LLVoiceChannel::getChannelByID(session_id); if (channelp && channelp->callStarted()) @@ -2623,6 +2763,12 @@ bool LLIMMgr::endCall(const LLUUID& session_id) if (!voice_channel) return false; voice_channel->deactivate(); + LLIMModel::LLIMSession* im_session = LLIMModel::getInstance()->findIMSession(session_id); + if (im_session) + { + // need to update speakers' state + im_session->mSpeakers->update(FALSE); + } return true; } @@ -2962,7 +3108,7 @@ public: return; } - if(!LLVoiceClient::voiceEnabled()) + if(!LLVoiceClient::getInstance()->voiceEnabled() || !LLVoiceClient::getInstance()->isVoiceWorking()) { // Don't display voice invites unless the user has voice enabled. return; diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h index 1c7aaa3f1b..ffa8a16797 100644 --- a/indra/newview/llimview.h +++ b/indra/newview/llimview.h @@ -34,6 +34,7 @@ #define LL_LLIMVIEW_H #include "lldockablefloater.h" +#include "lleventtimer.h" #include "llinstantmessage.h" #include "lllogchat.h" @@ -45,7 +46,24 @@ class LLFriendObserver; class LLCallDialogManager; class LLIMSpeakerMgr; +/** + * Timeout Timer for outgoing Ad-Hoc/Group IM sessions which being initialized by the server + */ +class LLSessionTimeoutTimer : public LLEventTimer +{ +public: + LLSessionTimeoutTimer(const LLUUID& session_id, F32 period) : LLEventTimer(period), mSessionId(session_id) {} + virtual ~LLSessionTimeoutTimer() {}; + /* virtual */ BOOL tick(); + +private: + LLUUID mSessionId; +}; + +/** + * Model (MVC) for IM Sessions + */ class LLIMModel : public LLSingleton<LLIMModel> { public: @@ -61,12 +79,12 @@ public: } SType; LLIMSession(const LLUUID& session_id, const std::string& name, - const EInstantMessage& type, const LLUUID& other_participant_id, const std::vector<LLUUID>& ids, bool voice); + const EInstantMessage& type, const LLUUID& other_participant_id, const uuid_vec_t& ids, bool voice); virtual ~LLIMSession(); void sessionInitReplyReceived(const LLUUID& new_session_id); void addMessagesFromHistory(const std::list<LLSD>& history); - void addMessage(const std::string& from, const LLUUID& from_id, const std::string& utf8_text, const std::string& time); + void addMessage(const std::string& from, const LLUUID& from_id, const std::string& utf8_text, const std::string& time, const bool is_history = false); void onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state, const LLVoiceChannel::EDirection& direction); /** @deprecated */ @@ -93,7 +111,7 @@ public: EInstantMessage mType; SType mSessionType; LLUUID mOtherParticipantID; - std::vector<LLUUID> mInitialTargetIDs; + uuid_vec_t mInitialTargetIDs; std::string mHistoryFileName; // connection to voice channel state change signal @@ -152,7 +170,7 @@ public: * Find an Ad-Hoc IM Session with specified participants * @return first found Ad-Hoc session or NULL if the session does not exist */ - LLIMSession* findAdHocIMSession(const std::vector<LLUUID>& ids); + LLIMSession* findAdHocIMSession(const uuid_vec_t& ids); /** * Rebind session data to a new session id. @@ -167,7 +185,7 @@ public: * @param name session name should not be empty, will return false if empty */ bool newSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, const LLUUID& other_participant_id, - const std::vector<LLUUID>& ids, bool voice = false); + const uuid_vec_t& ids, bool voice = false); bool newSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, const LLUUID& other_participant_id, bool voice = false); @@ -178,6 +196,17 @@ public: bool clearSession(const LLUUID& session_id); /** + * Populate supplied std::list with messages starting from index specified by start_index without + * emitting no unread messages signal. + */ + void getMessagesSilently(const LLUUID& session_id, std::list<LLSD>& messages, int start_index = 0); + + /** + * Sends no unread messages signal. + */ + void sendNoUnreadMessages(const LLUUID& session_id); + + /** * Populate supplied std::list with messages starting from index specified by start_index */ void getMessages(const LLUUID& session_id, std::list<LLSD>& messages, int start_index = 0); @@ -244,7 +273,7 @@ public: static void sendLeaveSession(const LLUUID& session_id, const LLUUID& other_participant_id); static bool sendStartSession(const LLUUID& temp_session_id, const LLUUID& other_participant_id, - const std::vector<LLUUID>& ids, EInstantMessage dialog); + const uuid_vec_t& ids, EInstantMessage dialog); static void sendTypingState(LLUUID session_id, LLUUID other_participant_id, BOOL typing); static void sendMessage(const std::string& utf8_text, const LLUUID& im_session_id, const LLUUID& other_participant_id, EInstantMessage dialog); @@ -452,7 +481,7 @@ public: static void initClass(); static void onVoiceChannelChanged(const LLUUID &session_id); - static void onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state, const LLVoiceChannel::EDirection& direction); + static void onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state, const LLVoiceChannel::EDirection& direction, bool ended_by_agent); protected: static std::string sPreviousSessionlName; @@ -466,12 +495,13 @@ class LLCallDialog : public LLDockableFloater { public: LLCallDialog(const LLSD& payload); - ~LLCallDialog() {} + ~LLCallDialog(); virtual BOOL postBuild(); // check timer state /*virtual*/ void draw(); + /*virtual*/ void onOpen(const LLSD& key); protected: // lifetime timer for a notification diff --git a/indra/newview/llinspect.cpp b/indra/newview/llinspect.cpp index c7b651f37c..81cfce53b1 100644 --- a/indra/newview/llinspect.cpp +++ b/indra/newview/llinspect.cpp @@ -32,6 +32,7 @@ #include "llinspect.h" +#include "lltooltip.h" #include "llcontrol.h" // LLCachedControl #include "llui.h" // LLUI::sSettingsGroups #include "llviewermenu.h" @@ -104,6 +105,26 @@ BOOL LLInspect::handleHover(S32 x, S32 y, MASK mask) return LLView::handleHover(x, y, mask); } +BOOL LLInspect::handleToolTip(S32 x, S32 y, MASK mask) +{ + BOOL handled = FALSE; + + + //delegate handling of tooltip to the hovered child + LLView* child_handler = childFromPoint(x,y); + if (child_handler && !child_handler->getToolTip().empty())// show tooltip if a view has non-empty tooltip message + { + //build LLInspector params to get correct tooltip setting, etc. background image + LLInspector::Params params; + params.fillFrom(LLUICtrlFactory::instance().getDefaultParams<LLInspector>()); + params.message = child_handler->getToolTip(); + //set up delay if there is no visible tooltip at this moment + params.delay_time = LLToolTipMgr::instance().toolTipVisible() ? 0.f : LLUI::sSettingGroups["config"]->getF32( "ToolTipDelay" ); + LLToolTipMgr::instance().show(params); + handled = TRUE; + } + return handled; +} // virtual void LLInspect::onMouseLeave(S32 x, S32 y, MASK mask) { diff --git a/indra/newview/llinspect.h b/indra/newview/llinspect.h index f8c86618d2..6d994a8d7c 100644 --- a/indra/newview/llinspect.h +++ b/indra/newview/llinspect.h @@ -47,6 +47,7 @@ public: /*virtual*/ void draw(); /*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask); + /*virtual*/ BOOL handleToolTip(S32 x, S32 y, MASK mask); /*virtual*/ void onMouseLeave(S32 x, S32 y, MASK mask); /// Start open animation diff --git a/indra/newview/llinspectavatar.cpp b/indra/newview/llinspectavatar.cpp index b2cdc0738f..d9fdc876db 100644 --- a/indra/newview/llinspectavatar.cpp +++ b/indra/newview/llinspectavatar.cpp @@ -51,12 +51,14 @@ #include "llviewermenu.h" #include "llvoiceclient.h" #include "llviewerobjectlist.h" +#include "lltransientfloatermgr.h" // Linden libraries #include "llfloater.h" #include "llfloaterreg.h" #include "llmenubutton.h" #include "lltooltip.h" // positionViewNearMouse() +#include "lltrans.h" #include "lluictrl.h" #include "llavatariconctrl.h" @@ -71,7 +73,7 @@ class LLFetchAvatarData; // Avatar Inspector, a small information window used when clicking // on avatar names in the 2D UI and in the ambient inspector widget for // the 3D world. -class LLInspectAvatar : public LLInspect +class LLInspectAvatar : public LLInspect, LLTransientFloater { friend class LLFloaterReg; @@ -97,6 +99,8 @@ public: // gear menu is not open /* virtual */ void onMouseLeave(S32 x, S32 y, MASK mask); + virtual LLTransientFloaterMgr::ETransientGroup getGroup() { return LLTransientFloaterMgr::GLOBAL; } + private: // Make network requests for all the data to display in this view. // Used on construction and if avatar id changes. @@ -120,6 +124,7 @@ private: void onClickTeleport(); void onClickInviteToGroup(); void onClickPay(); + void onClickShare(); void onToggleMute(); void onClickReport(); void onClickFreeze(); @@ -133,6 +138,7 @@ private: void onVolumeChange(const LLSD& data); bool enableMute(); bool enableUnmute(); + bool enableTeleportOffer(); // Is used to determine if "Add friend" option should be enabled in gear menu bool isNotFriend(); @@ -213,6 +219,7 @@ LLInspectAvatar::LLInspectAvatar(const LLSD& sd) mCommitCallbackRegistrar.add("InspectAvatar.Teleport", boost::bind(&LLInspectAvatar::onClickTeleport, this)); mCommitCallbackRegistrar.add("InspectAvatar.InviteToGroup", boost::bind(&LLInspectAvatar::onClickInviteToGroup, this)); mCommitCallbackRegistrar.add("InspectAvatar.Pay", boost::bind(&LLInspectAvatar::onClickPay, this)); + mCommitCallbackRegistrar.add("InspectAvatar.Share", boost::bind(&LLInspectAvatar::onClickShare, this)); mCommitCallbackRegistrar.add("InspectAvatar.ToggleMute", boost::bind(&LLInspectAvatar::onToggleMute, this)); mCommitCallbackRegistrar.add("InspectAvatar.Freeze", boost::bind(&LLInspectAvatar::onClickFreeze, this)); @@ -230,11 +237,15 @@ LLInspectAvatar::LLInspectAvatar(const LLSD& sd) boost::bind(&LLInspectAvatar::onVisibleZoomIn, this)); mEnableCallbackRegistrar.add("InspectAvatar.Gear.Enable", boost::bind(&LLInspectAvatar::isNotFriend, this)); mEnableCallbackRegistrar.add("InspectAvatar.Gear.EnableCall", boost::bind(&LLAvatarActions::canCall)); + mEnableCallbackRegistrar.add("InspectAvatar.Gear.EnableTeleportOffer", boost::bind(&LLInspectAvatar::enableTeleportOffer, this)); mEnableCallbackRegistrar.add("InspectAvatar.EnableMute", boost::bind(&LLInspectAvatar::enableMute, this)); mEnableCallbackRegistrar.add("InspectAvatar.EnableUnmute", boost::bind(&LLInspectAvatar::enableUnmute, this)); // can't make the properties request until the widgets are constructed // as it might return immediately, so do it in postBuild. + + LLTransientFloaterMgr::getInstance()->addControlView(LLTransientFloaterMgr::GLOBAL, this); + LLTransientFloater::init(this); } LLInspectAvatar::~LLInspectAvatar() @@ -243,6 +254,8 @@ LLInspectAvatar::~LLInspectAvatar() // view delete mPropertiesRequest; mPropertiesRequest = NULL; + + LLTransientFloaterMgr::getInstance()->removeControlView(this); } /*virtual*/ @@ -368,7 +381,11 @@ void LLInspectAvatar::requestUpdate() void LLInspectAvatar::processAvatarData(LLAvatarData* data) { LLStringUtil::format_map_t args; - args["[BORN_ON]"] = data->born_on; + { + std::string birth_date = LLTrans::getString("AvatarBirthDateFormat"); + LLStringUtil::format(birth_date, LLSD().with("datetime", (S32) data->born_on.secondsSinceEpoch())); + args["[BORN_ON]"] = birth_date; + } args["[AGE]"] = LLDateUtil::ageFromDate(data->born_on, LLDate::now()); args["[SL_PROFILE]"] = data->about_text; args["[RW_PROFILE"] = data->fl_about_text; @@ -524,8 +541,7 @@ void LLInspectAvatar::toggleSelectedVoice(bool enabled) void LLInspectAvatar::updateVolumeSlider() { - - bool voice_enabled = gVoiceClient->getVoiceEnabled(mAvatarID); + bool voice_enabled = LLVoiceClient::getInstance()->getVoiceEnabled(mAvatarID); // Do not display volume slider and mute button if it // is ourself or we are not in a voice channel together @@ -554,8 +570,8 @@ void LLInspectAvatar::updateVolumeSlider() LLUICtrl* volume_slider = getChild<LLUICtrl>("volume_slider"); volume_slider->setEnabled( !is_muted ); - const F32 DEFAULT_VOLUME = 0.5f; F32 volume; + if (is_muted) { // it's clearer to display their volume as zero @@ -564,14 +580,7 @@ void LLInspectAvatar::updateVolumeSlider() else { // actual volume - volume = gVoiceClient->getUserVolume(mAvatarID); - - // *HACK: Voice client doesn't have any data until user actually - // says something. - if (volume == 0.f) - { - volume = DEFAULT_VOLUME; - } + volume = LLVoiceClient::getInstance()->getUserVolume(mAvatarID); } volume_slider->setValue( (F64)volume ); } @@ -600,7 +609,7 @@ void LLInspectAvatar::onClickMuteVolume() void LLInspectAvatar::onVolumeChange(const LLSD& data) { F32 volume = (F32)data.asReal(); - gVoiceClient->setUserVolume(mAvatarID, volume); + LLVoiceClient::getInstance()->setUserVolume(mAvatarID, volume); } void LLInspectAvatar::nameUpdatedCallback( @@ -678,6 +687,12 @@ void LLInspectAvatar::onClickPay() closeFloater(); } +void LLInspectAvatar::onClickShare() +{ + LLAvatarActions::share(mAvatarID); + closeFloater(); +} + void LLInspectAvatar::onToggleMute() { LLMute mute(mAvatarID, mAvatarName, LLMute::AGENT); @@ -756,6 +771,11 @@ bool LLInspectAvatar::enableUnmute() } } +bool LLInspectAvatar::enableTeleportOffer() +{ + return LLAvatarActions::canOfferTeleport(mAvatarID); +} + ////////////////////////////////////////////////////////////////////////////// // LLInspectAvatarUtil ////////////////////////////////////////////////////////////////////////////// diff --git a/indra/newview/llinspectobject.cpp b/indra/newview/llinspectobject.cpp index 91cbbbf430..a2b5ffbac4 100644 --- a/indra/newview/llinspectobject.cpp +++ b/indra/newview/llinspectobject.cpp @@ -480,7 +480,7 @@ void LLInspectObject::updateCreator(LLSelectNode* nodep) // Objects cannot be created by a group, so use agent URL format LLUUID creator_id = nodep->mPermissions->getCreator(); std::string creator_url = - LLSLURL::buildCommand("agent", creator_id, "about"); + LLSLURL("agent", creator_id, "about").getSLURLString(); args["[CREATOR]"] = creator_url; // created by one user but owned by another @@ -490,12 +490,12 @@ void LLInspectObject::updateCreator(LLSelectNode* nodep) if (group_owned) { owner_id = nodep->mPermissions->getGroup(); - owner_url = LLSLURL::buildCommand("group", owner_id, "about"); + owner_url = LLSLURL("group", owner_id, "about").getSLURLString(); } else { owner_id = nodep->mPermissions->getOwner(); - owner_url = LLSLURL::buildCommand("agent", owner_id, "about"); + owner_url = LLSLURL("agent", owner_id, "about").getSLURLString(); } args["[OWNER]"] = owner_url; diff --git a/indra/newview/llinspectremoteobject.cpp b/indra/newview/llinspectremoteobject.cpp index 66e4a1bf66..97ff771658 100644 --- a/indra/newview/llinspectremoteobject.cpp +++ b/indra/newview/llinspectremoteobject.cpp @@ -176,11 +176,11 @@ void LLInspectRemoteObject::update() { if (mGroupOwned) { - owner = LLSLURL::buildCommand("group", mOwnerID, "about"); + owner = LLSLURL("group", mOwnerID, "about").getSLURLString(); } else { - owner = LLSLURL::buildCommand("agent", mOwnerID, "about"); + owner = LLSLURL("agent", mOwnerID, "about").getSLURLString(); } } else diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 19fbd7ade1..afaeddaaeb 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -33,21 +33,27 @@ #include "llviewerprecompiledheaders.h" #include "llinventorybridge.h" +// external projects +#include "lltransfersourceasset.h" + #include "llagent.h" +#include "llagentcamera.h" #include "llagentwearables.h" #include "llappearancemgr.h" #include "llavataractions.h" -#include "llfloatercustomize.h" #include "llfloateropenobject.h" #include "llfloaterreg.h" #include "llfloaterworldmap.h" #include "llfriendcard.h" #include "llgesturemgr.h" +#include "llgiveinventory.h" #include "llimfloater.h" #include "llimview.h" #include "llinventoryclipboard.h" +#include "llinventorydefines.h" #include "llinventoryfunctions.h" #include "llinventorymodel.h" +#include "llinventorymodelbackgroundfetch.h" #include "llinventorypanel.h" #include "llnotifications.h" #include "llnotificationsutil.h" @@ -55,9 +61,12 @@ #include "llpreviewgesture.h" #include "llpreviewtexture.h" #include "llselectmgr.h" +#include "llsidepanelappearance.h" #include "llsidetray.h" #include "lltrans.h" #include "llviewerassettype.h" +#include "llviewerfoldertype.h" +#include "llviewermenu.h" #include "llviewermessage.h" #include "llviewerobjectlist.h" #include "llviewerwindow.h" @@ -65,6 +74,18 @@ #include "llwearablelist.h" #include "llpaneloutfitsinventory.h" +typedef std::pair<LLUUID, LLUUID> two_uuids_t; +typedef std::list<two_uuids_t> two_uuids_list_t; + +struct LLMoveInv +{ + LLUUID mObjectID; + LLUUID mCategoryID; + two_uuids_list_t mMoveList; + void (*mCallback)(S32, void*); + void* mUserData; +}; + using namespace LLOldEvents; // Helpers @@ -83,64 +104,32 @@ void dec_busy_count() } // Function declarations -void wear_add_inventory_item_on_avatar(LLInventoryItem* item); void remove_inventory_category_from_avatar(LLInventoryCategory* category); void remove_inventory_category_from_avatar_step2( BOOL proceed, LLUUID category_id); bool move_task_inventory_callback(const LLSD& notification, const LLSD& response, LLMoveInv*); bool confirm_replace_attachment_rez(const LLSD& notification, const LLSD& response); - -std::string ICON_NAME[ICON_NAME_COUNT] = -{ - "Inv_Texture", - "Inv_Sound", - "Inv_CallingCard", - "Inv_CallingCard", - "Inv_Landmark", - "Inv_Landmark", - "Inv_Script", - "Inv_Clothing", - "Inv_Object", - "Inv_Object", - "Inv_Notecard", - "Inv_Skin", - "Inv_Snapshot", - - "Inv_BodyShape", - "Inv_Skin", - "Inv_Hair", - "Inv_Eye", - "Inv_Shirt", - "Inv_Pants", - "Inv_Shoe", - "Inv_Socks", - "Inv_Jacket", - "Inv_Gloves", - "Inv_Undershirt", - "Inv_Underpants", - "Inv_Skirt", - "Inv_Alpha", - "Inv_Tattoo", - - "Inv_Animation", - "Inv_Gesture", - - "Inv_LinkItem", - "Inv_LinkFolder" -}; +void teleport_via_landmark(const LLUUID& asset_id); // +=================================================+ // | LLInvFVBridge | // +=================================================+ -LLInvFVBridge::LLInvFVBridge(LLInventoryPanel* inventory, const LLUUID& uuid) : -mUUID(uuid), mInvType(LLInventoryType::IT_NONE) +LLInvFVBridge::LLInvFVBridge(LLInventoryPanel* inventory, + LLFolderView* root, + const LLUUID& uuid) : + mUUID(uuid), + mRoot(root), + mInvType(LLInventoryType::IT_NONE), + mIsLink(FALSE) { mInventoryPanel = inventory->getHandle(); + const LLInventoryObject* obj = getInventoryObject(); + mIsLink = obj && obj->getIsLinkType(); } const std::string& LLInvFVBridge::getName() const { - LLInventoryObject* obj = getInventoryObject(); + const LLInventoryObject* obj = getInventoryObject(); if(obj) { return obj->getName(); @@ -156,7 +145,6 @@ const std::string& LLInvFVBridge::getDisplayName() const // Folders have full perms PermissionMask LLInvFVBridge::getPermissionMask() const { - return PERM_ALL; } @@ -176,34 +164,7 @@ time_t LLInvFVBridge::getCreationDate() const // Can be destroyed (or moved to trash) BOOL LLInvFVBridge::isItemRemovable() const { - const LLInventoryModel* model = getInventoryModel(); - if(!model) - { - return FALSE; - } - - // Can't delete an item that's in the library. - if(!model->isObjectDescendentOf(mUUID, gInventory.getRootFolderID())) - { - return FALSE; - } - - // Disable delete from COF folder; have users explicitly choose "detach/take off". - if (LLAppearanceManager::instance().getIsProtectedCOFItem(mUUID)) - { - return FALSE; - } - - const LLInventoryObject *obj = model->getItem(mUUID); - if (obj && obj->getIsLinkType()) - { - return TRUE; - } - if (get_is_item_worn(mUUID)) - { - return FALSE; - } - return TRUE; + return get_is_item_removable(getInventoryModel(), mUUID); } // Can be moved to another folder @@ -212,6 +173,11 @@ BOOL LLInvFVBridge::isItemMovable() const return TRUE; } +BOOL LLInvFVBridge::isLink() const +{ + return mIsLink; +} + /*virtual*/ /** * @brief Adds this item into clipboard storage @@ -226,13 +192,11 @@ void LLInvFVBridge::cutToClipboard() // *TODO: make sure this does the right thing void LLInvFVBridge::showProperties() { - LLSD key; - key["id"] = mUUID; - LLSideTray::getInstance()->showPanel("sidepanel_inventory", key); + show_item_profile(mUUID); // Disable old properties floater; this is replaced by the sidepanel. /* - LLFloaterReg::showInstance("properties", mUUID); + LLFloaterReg::showInstance("properties", mUUID); */ } @@ -256,7 +220,7 @@ void LLInvFVBridge::removeBatch(LLDynamicArray<LLFolderViewEventListener*>& batc { if(LLAssetType::AT_GESTURE == item->getType()) { - LLGestureManager::instance().deactivateGesture(item->getUUID()); + LLGestureMgr::instance().deactivateGesture(item->getUUID()); } } } @@ -272,7 +236,7 @@ void LLInvFVBridge::removeBatch(LLDynamicArray<LLFolderViewEventListener*>& batc { if(LLAssetType::AT_GESTURE == descendent_items[j]->getType()) { - LLGestureManager::instance().deactivateGesture(descendent_items[j]->getUUID()); + LLGestureMgr::instance().deactivateGesture(descendent_items[j]->getUUID()); } } } @@ -293,12 +257,27 @@ void LLInvFVBridge::removeBatchNoCheck(LLDynamicArray<LLFolderViewEventListener* LLMessageSystem* msg = gMessageSystem; const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH); LLViewerInventoryItem* item = NULL; - LLViewerInventoryCategory* cat = NULL; - std::vector<LLUUID> move_ids; + uuid_vec_t move_ids; LLInventoryModel::update_map_t update; bool start_new_message = true; S32 count = batch.count(); S32 i; + + // first, hide any 'preview' floaters that correspond to the items + // being deleted. + for(i = 0; i < count; ++i) + { + bridge = (LLInvFVBridge*)(batch.get(i)); + if(!bridge || !bridge->isItemRemovable()) continue; + item = (LLViewerInventoryItem*)model->getItem(bridge->getUUID()); + if(item) + { + LLPreview::hide(item->getUUID()); + } + } + + // do the inventory move to trash + for(i = 0; i < count; ++i) { bridge = (LLInvFVBridge*)(batch.get(i)); @@ -308,7 +287,6 @@ void LLInvFVBridge::removeBatchNoCheck(LLDynamicArray<LLFolderViewEventListener* { if(item->getParentUUID() == trash_id) continue; move_ids.push_back(item->getUUID()); - LLPreview::hide(item->getUUID()); --update[item->getParentUUID()]; ++update[trash_id]; if(start_new_message) @@ -340,11 +318,12 @@ void LLInvFVBridge::removeBatchNoCheck(LLDynamicArray<LLFolderViewEventListener* gInventory.accountForUpdate(update); update.clear(); } + for(i = 0; i < count; ++i) { bridge = (LLInvFVBridge*)(batch.get(i)); if(!bridge || !bridge->isItemRemovable()) continue; - cat = (LLViewerInventoryCategory*)model->getCategory(bridge->getUUID()); + LLViewerInventoryCategory* cat = (LLViewerInventoryCategory*)model->getCategory(bridge->getUUID()); if(cat) { if(cat->getParentUUID() == trash_id) continue; @@ -379,8 +358,8 @@ void LLInvFVBridge::removeBatchNoCheck(LLDynamicArray<LLFolderViewEventListener* } // move everything. - std::vector<LLUUID>::iterator it = move_ids.begin(); - std::vector<LLUUID>::iterator end = move_ids.end(); + uuid_vec_t::iterator it = move_ids.begin(); + uuid_vec_t::iterator end = move_ids.end(); for(; it != end; ++it) { gInventory.moveObject((*it), trash_id); @@ -456,7 +435,7 @@ BOOL LLInvFVBridge::isClipboardPasteableAsLink() const } } const LLViewerInventoryCategory *cat = model->getCategory(objects.get(i)); - if (cat && !LLFolderType::lookupIsProtectedType(cat->getPreferredType())) + if (cat && LLFolderType::lookupIsProtectedType(cat->getPreferredType())) { return FALSE; } @@ -465,12 +444,14 @@ BOOL LLInvFVBridge::isClipboardPasteableAsLink() const } void hide_context_entries(LLMenuGL& menu, - const menuentry_vec_t &entries_to_show, - const menuentry_vec_t &disabled_entries) + const menuentry_vec_t &entries_to_show, + const menuentry_vec_t &disabled_entries) { const LLView::child_list_t *list = menu.getChildList(); - BOOL is_previous_entry_separator = FALSE; + // For removing double separators or leading separator. Start at true so that + // if the first element is a separator, it will not be shown. + BOOL is_previous_entry_separator = TRUE; LLView::child_list_t::const_iterator itor; for (itor = list->begin(); itor != list->end(); ++itor) @@ -566,7 +547,16 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id, if (show_asset_id) { items.push_back(std::string("Copy Asset UUID")); - if ( (! ( isItemPermissive() || gAgent.isGodlike() ) ) + + bool is_asset_knowable = false; + + LLViewerInventoryItem* inv_item = gInventory.getItem(mUUID); + if (inv_item) + { + is_asset_knowable = LLAssetType::lookupIsAssetIDKnowable(inv_item->getType()); + } + if ( !is_asset_knowable // disable menu item for Inventory items with unknown asset. EXT-5308 + || (! ( isItemPermissive() || gAgent.isGodlike() ) ) || (flags & FIRST_SELECTED_ITEM) == 0) { disabled_items.push_back(std::string("Copy Asset UUID")); @@ -582,13 +572,17 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id, } } - items.push_back(std::string("Paste")); - if (!isClipboardPasteable() || (flags & FIRST_SELECTED_ITEM) == 0) + // Don't allow items to be pasted directly into the COF. + if (!isCOFFolder()) + { + items.push_back(std::string("Paste")); + } + if (!isClipboardPasteable() || ((flags & FIRST_SELECTED_ITEM) == 0)) { disabled_items.push_back(std::string("Paste")); } - if (gAgent.isGodlike()) + if (gSavedSettings.getBOOL("InventoryLinking")) { items.push_back(std::string("Paste As Link")); if (!isClipboardPasteableAsLink() || (flags & FIRST_SELECTED_ITEM) == 0) @@ -619,7 +613,13 @@ void LLInvFVBridge::buildContextMenu(LLMenuGL& menu, U32 flags) } else { - items.push_back(std::string("Open")); + items.push_back(std::string("Share")); + if (!canShare()) + { + disabled_items.push_back(std::string("Share")); + } + + addOpenRightClickMenuOption(items); items.push_back(std::string("Properties")); getClipboardEntries(true, items, disabled_items, flags); @@ -650,14 +650,15 @@ void LLInvFVBridge::addTrashContextMenuOptions(menuentry_vec_t &items, void LLInvFVBridge::addDeleteContextMenuOptions(menuentry_vec_t &items, menuentry_vec_t &disabled_items) { + + const LLInventoryObject *obj = getInventoryObject(); + // Don't allow delete as a direct option from COF folder. - if (isCOFFolder()) + if (obj && obj->getIsLinkType() && isCOFFolder() && get_is_item_worn(mUUID)) { return; } - const LLInventoryObject *obj = getInventoryObject(); - // "Remove link" and "Delete" are the same operation. if (obj && obj->getIsLinkType() && !get_is_item_worn(mUUID)) { @@ -674,6 +675,17 @@ void LLInvFVBridge::addDeleteContextMenuOptions(menuentry_vec_t &items, } } +void LLInvFVBridge::addOpenRightClickMenuOption(menuentry_vec_t &items) +{ + const LLInventoryObject *obj = getInventoryObject(); + const BOOL is_link = (obj && obj->getIsLinkType()); + + if (is_link) + items.push_back(std::string("Open Original")); + else + items.push_back(std::string("Open")); +} + // *TODO: remove this BOOL LLInvFVBridge::startDrag(EDragAndDropType* type, LLUUID* id) const { @@ -694,7 +706,7 @@ BOOL LLInvFVBridge::startDrag(EDragAndDropType* type, LLUUID* id) const if (*type == DAD_CATEGORY) { - gInventory.startBackgroundFetch(obj->getUUID()); + LLInventoryModelBackgroundFetch::instance().start(obj->getUUID()); } rv = TRUE; @@ -767,7 +779,7 @@ BOOL LLInvFVBridge::isAgentInventory() const BOOL LLInvFVBridge::isCOFFolder() const { - return LLAppearanceManager::instance().getIsInCOF(mUUID); + return LLAppearanceMgr::instance().getIsInCOF(mUUID); } BOOL LLInvFVBridge::isItemPermissive() const @@ -781,21 +793,7 @@ void LLInvFVBridge::changeItemParent(LLInventoryModel* model, const LLUUID& new_parent_id, BOOL restamp) { - if(item->getParentUUID() != new_parent_id) - { - LLInventoryModel::update_list_t update; - LLInventoryModel::LLCategoryUpdate old_folder(item->getParentUUID(),-1); - update.push_back(old_folder); - LLInventoryModel::LLCategoryUpdate new_folder(new_parent_id, 1); - update.push_back(new_folder); - gInventory.accountForUpdate(update); - - LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item); - new_item->setParent(new_parent_id); - new_item->updateParentOnServer(restamp); - model->updateItem(new_item); - model->notifyObservers(); - } + change_item_parent(model, item, new_parent_id, restamp); } // static @@ -804,41 +802,14 @@ void LLInvFVBridge::changeCategoryParent(LLInventoryModel* model, const LLUUID& new_parent_id, BOOL restamp) { - // Can't move a folder into a child of itself. - if (model->isObjectDescendentOf(new_parent_id, cat->getUUID())) - { - return; - } - - LLInventoryModel::update_list_t update; - LLInventoryModel::LLCategoryUpdate old_folder(cat->getParentUUID(), -1); - update.push_back(old_folder); - LLInventoryModel::LLCategoryUpdate new_folder(new_parent_id, 1); - update.push_back(new_folder); - model->accountForUpdate(update); - - LLPointer<LLViewerInventoryCategory> new_cat = new LLViewerInventoryCategory(cat); - new_cat->setParent(new_parent_id); - new_cat->updateParentOnServer(restamp); - model->updateCategory(new_cat); - model->notifyObservers(); -} - - -const std::string safe_inv_type_lookup(LLInventoryType::EType inv_type) -{ - const std::string rv= LLInventoryType::lookup(inv_type); - if(rv.empty()) - { - return std::string("<invalid>"); - } - return rv; + change_category_parent(model, cat, new_parent_id, restamp); } LLInvFVBridge* LLInvFVBridge::createBridge(LLAssetType::EType asset_type, LLAssetType::EType actual_asset_type, LLInventoryType::EType inv_type, LLInventoryPanel* inventory, + LLFolderView* root, const LLUUID& uuid, U32 flags) { @@ -848,104 +819,104 @@ LLInvFVBridge* LLInvFVBridge::createBridge(LLAssetType::EType asset_type, case LLAssetType::AT_TEXTURE: if(!(inv_type == LLInventoryType::IT_TEXTURE || inv_type == LLInventoryType::IT_SNAPSHOT)) { - llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; + llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << LLInventoryType::lookupHumanReadable(inv_type) << " on uuid " << uuid << llendl; } - new_listener = new LLTextureBridge(inventory, uuid, inv_type); + new_listener = new LLTextureBridge(inventory, root, uuid, inv_type); break; case LLAssetType::AT_SOUND: if(!(inv_type == LLInventoryType::IT_SOUND)) { - llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; + llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << LLInventoryType::lookupHumanReadable(inv_type) << " on uuid " << uuid << llendl; } - new_listener = new LLSoundBridge(inventory, uuid); + new_listener = new LLSoundBridge(inventory, root, uuid); break; case LLAssetType::AT_LANDMARK: if(!(inv_type == LLInventoryType::IT_LANDMARK)) { - llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; + llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << LLInventoryType::lookupHumanReadable(inv_type) << " on uuid " << uuid << llendl; } - new_listener = new LLLandmarkBridge(inventory, uuid, flags); + new_listener = new LLLandmarkBridge(inventory, root, uuid, flags); break; case LLAssetType::AT_CALLINGCARD: if(!(inv_type == LLInventoryType::IT_CALLINGCARD)) { - llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; + llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << LLInventoryType::lookupHumanReadable(inv_type) << " on uuid " << uuid << llendl; } - new_listener = new LLCallingCardBridge(inventory, uuid); + new_listener = new LLCallingCardBridge(inventory, root, uuid); break; case LLAssetType::AT_SCRIPT: if(!(inv_type == LLInventoryType::IT_LSL)) { - llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; + llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << LLInventoryType::lookupHumanReadable(inv_type) << " on uuid " << uuid << llendl; } - new_listener = new LLScriptBridge(inventory, uuid); + new_listener = new LLItemBridge(inventory, root, uuid); break; case LLAssetType::AT_OBJECT: if(!(inv_type == LLInventoryType::IT_OBJECT || inv_type == LLInventoryType::IT_ATTACHMENT)) { - llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; + llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << LLInventoryType::lookupHumanReadable(inv_type) << " on uuid " << uuid << llendl; } - new_listener = new LLObjectBridge(inventory, uuid, inv_type, flags); + new_listener = new LLObjectBridge(inventory, root, uuid, inv_type, flags); break; case LLAssetType::AT_NOTECARD: if(!(inv_type == LLInventoryType::IT_NOTECARD)) { - llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; + llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << LLInventoryType::lookupHumanReadable(inv_type) << " on uuid " << uuid << llendl; } - new_listener = new LLNotecardBridge(inventory, uuid); + new_listener = new LLNotecardBridge(inventory, root, uuid); break; case LLAssetType::AT_ANIMATION: if(!(inv_type == LLInventoryType::IT_ANIMATION)) { - llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; + llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << LLInventoryType::lookupHumanReadable(inv_type) << " on uuid " << uuid << llendl; } - new_listener = new LLAnimationBridge(inventory, uuid); + new_listener = new LLAnimationBridge(inventory, root, uuid); break; case LLAssetType::AT_GESTURE: if(!(inv_type == LLInventoryType::IT_GESTURE)) { - llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; + llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << LLInventoryType::lookupHumanReadable(inv_type) << " on uuid " << uuid << llendl; } - new_listener = new LLGestureBridge(inventory, uuid); + new_listener = new LLGestureBridge(inventory, root, uuid); break; case LLAssetType::AT_LSL_TEXT: if(!(inv_type == LLInventoryType::IT_LSL)) { - llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; + llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << LLInventoryType::lookupHumanReadable(inv_type) << " on uuid " << uuid << llendl; } - new_listener = new LLLSLTextBridge(inventory, uuid); + new_listener = new LLLSLTextBridge(inventory, root, uuid); break; case LLAssetType::AT_CLOTHING: case LLAssetType::AT_BODYPART: if(!(inv_type == LLInventoryType::IT_WEARABLE)) { - llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; + llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << LLInventoryType::lookupHumanReadable(inv_type) << " on uuid " << uuid << llendl; } - new_listener = new LLWearableBridge(inventory, uuid, asset_type, inv_type, (EWearableType)flags); + new_listener = new LLWearableBridge(inventory, root, uuid, asset_type, inv_type, (LLWearableType::EType)flags); break; case LLAssetType::AT_CATEGORY: if (actual_asset_type == LLAssetType::AT_LINK_FOLDER) { // Create a link folder handler instead. - new_listener = new LLLinkFolderBridge(inventory, uuid); + new_listener = new LLLinkFolderBridge(inventory, root, uuid); break; } - new_listener = new LLFolderBridge(inventory, uuid); + new_listener = new LLFolderBridge(inventory, root, uuid); break; case LLAssetType::AT_LINK: case LLAssetType::AT_LINK_FOLDER: // Only should happen for broken links. - new_listener = new LLLinkItemBridge(inventory, uuid); + new_listener = new LLLinkItemBridge(inventory, root, uuid); break; default: llinfos << "Unhandled asset type (llassetstorage.h): " @@ -977,16 +948,34 @@ void LLInvFVBridge::purgeItem(LLInventoryModel *model, const LLUUID &uuid) } } -bool LLInvFVBridge::isInOutfitsSidePanel() const +BOOL LLInvFVBridge::isInOutfitsSidePanel() const { LLInventoryPanel *my_panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get()); LLPanelOutfitsInventory *outfit_panel = dynamic_cast<LLPanelOutfitsInventory*>(LLSideTray::getInstance()->getPanel("panel_outfits_inventory")); if (!outfit_panel) - return false; + return FALSE; return outfit_panel->isTabPanel(my_panel); } +BOOL LLInvFVBridge::canShare() const +{ + const LLInventoryModel* model = getInventoryModel(); + if (!model) return FALSE; + + const LLViewerInventoryItem *item = model->getItem(mUUID); + if (item) + { + if (!LLInventoryCollectFunctor::itemTransferCommonlyAllowed(item)) + return FALSE; + return (BOOL)LLGiveInventory::isInventoryGiveAcceptable(item); + } + + // All categories can be given. + const LLViewerInventoryCategory* cat = model->getCategory(mUUID); + return (cat != NULL); +} + // +=================================================+ // | InventoryFVBridgeBuilder | // +=================================================+ @@ -994,29 +983,31 @@ LLInvFVBridge* LLInventoryFVBridgeBuilder::createBridge(LLAssetType::EType asset LLAssetType::EType actual_asset_type, LLInventoryType::EType inv_type, LLInventoryPanel* inventory, + LLFolderView* root, const LLUUID& uuid, U32 flags /* = 0x00 */) const { return LLInvFVBridge::createBridge(asset_type, - actual_asset_type, - inv_type, - inventory, - uuid, - flags); + actual_asset_type, + inv_type, + inventory, + root, + uuid, + flags); } // +=================================================+ // | LLItemBridge | // +=================================================+ -void LLItemBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) +void LLItemBridge::performAction(LLInventoryModel* model, std::string action) { if ("goto" == action) { - gotoItem(folder); + gotoItem(); } - if ("open" == action) + if ("open" == action || "open_original" == action) { openItem(); return; @@ -1044,9 +1035,9 @@ void LLItemBridge::performAction(LLFolderView* folder, LLInventoryModel* model, else if ("copy_uuid" == action) { // Single item only - LLInventoryItem* item = model->getItem(mUUID); + LLViewerInventoryItem* item = static_cast<LLViewerInventoryItem*>(getItem()); if(!item) return; - LLUUID asset_id = item->getAssetUUID(); + LLUUID asset_id = item->getProtectedAssetUUID(); std::string buffer; asset_id.toString(buffer); @@ -1064,7 +1055,7 @@ void LLItemBridge::performAction(LLFolderView* folder, LLInventoryModel* model, LLInventoryItem* itemp = model->getItem(mUUID); if (!itemp) return; - LLFolderViewItem* folder_view_itemp = folder->getItemByID(itemp->getParentUUID()); + LLFolderViewItem* folder_view_itemp = mRoot->getItemByID(itemp->getParentUUID()); if (!folder_view_itemp) return; folder_view_itemp->getListener()->pasteFromClipboard(); @@ -1076,7 +1067,7 @@ void LLItemBridge::performAction(LLFolderView* folder, LLInventoryModel* model, LLInventoryItem* itemp = model->getItem(mUUID); if (!itemp) return; - LLFolderViewItem* folder_view_itemp = folder->getItemByID(itemp->getParentUUID()); + LLFolderViewItem* folder_view_itemp = mRoot->getItemByID(itemp->getParentUUID()); if (!folder_view_itemp) return; folder_view_itemp->getListener()->pasteLinkFromClipboard(); @@ -1086,8 +1077,8 @@ void LLItemBridge::performAction(LLFolderView* folder, LLInventoryModel* model, void LLItemBridge::selectItem() { - LLViewerInventoryItem* item = (LLViewerInventoryItem*)getItem(); - if(item && !item->isComplete()) + LLViewerInventoryItem* item = static_cast<LLViewerInventoryItem*>(getItem()); + if(item && !item->isFinished()) { item->fetchFromServer(); } @@ -1095,7 +1086,7 @@ void LLItemBridge::selectItem() void LLItemBridge::restoreItem() { - LLViewerInventoryItem* item = (LLViewerInventoryItem*)getItem(); + LLViewerInventoryItem* item = static_cast<LLViewerInventoryItem*>(getItem()); if(item) { LLInventoryModel* model = getInventoryModel(); @@ -1107,7 +1098,10 @@ void LLItemBridge::restoreItem() void LLItemBridge::restoreToWorld() { - LLViewerInventoryItem* itemp = (LLViewerInventoryItem*)getItem(); + //Similar functionality to the drag and drop rez logic + bool remove_from_inventory = false; + + LLViewerInventoryItem* itemp = static_cast<LLViewerInventoryItem*>(getItem()); if (itemp) { LLMessageSystem* msg = gMessageSystem; @@ -1119,23 +1113,20 @@ void LLItemBridge::restoreToWorld() msg->nextBlockFast(_PREHASH_InventoryData); itemp->packMessage(msg); msg->sendReliable(gAgent.getRegion()->getHost()); - } - - //Similar functionality to the drag and drop rez logic - BOOL remove_from_inventory = FALSE; - - //remove local inventory copy, sim will deal with permissions and removing the item - //from the actual inventory if its a no-copy etc - if(!itemp->getPermissions().allowCopyBy(gAgent.getID())) - { - remove_from_inventory = TRUE; - } - // Check if it's in the trash. (again similar to the normal rez logic) - const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH); - if(gInventory.isObjectDescendentOf(itemp->getUUID(), trash_id)) - { - remove_from_inventory = TRUE; + //remove local inventory copy, sim will deal with permissions and removing the item + //from the actual inventory if its a no-copy etc + if(!itemp->getPermissions().allowCopyBy(gAgent.getID())) + { + remove_from_inventory = true; + } + + // Check if it's in the trash. (again similar to the normal rez logic) + const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH); + if(gInventory.isObjectDescendentOf(itemp->getUUID(), trash_id)) + { + remove_from_inventory = true; + } } if(remove_from_inventory) @@ -1145,7 +1136,7 @@ void LLItemBridge::restoreToWorld() } } -void LLItemBridge::gotoItem(LLFolderView *folder) +void LLItemBridge::gotoItem() { LLInventoryObject *obj = getInventoryObject(); if (obj && obj->getIsLinkType()) @@ -1160,25 +1151,22 @@ void LLItemBridge::gotoItem(LLFolderView *folder) LLUIImagePtr LLItemBridge::getIcon() const { - return LLUI::getUIImage(ICON_NAME[OBJECT_ICON_NAME]); + LLInventoryObject *obj = getInventoryObject(); + if (obj) + { + return LLInventoryIcon::getIcon(obj->getType(), + LLInventoryType::IT_NONE, + mIsLink); + } + + return LLInventoryIcon::getIcon(LLInventoryIcon::ICONNAME_OBJECT); } PermissionMask LLItemBridge::getPermissionMask() const { LLViewerInventoryItem* item = getItem(); PermissionMask perm_mask = 0; - if(item) - { - BOOL copy = item->getPermissions().allowCopyBy(gAgent.getID()); - BOOL mod = item->getPermissions().allowModifyBy(gAgent.getID()); - BOOL xfer = item->getPermissions().allowOperationBy(PERM_TRANSFER, - gAgent.getID()); - - if (copy) perm_mask |= PERM_COPY; - if (mod) perm_mask |= PERM_MODIFY; - if (xfer) perm_mask |= PERM_TRANSFER; - - } + if (item) perm_mask = item->getPermissionMask(); return perm_mask; } @@ -1206,18 +1194,18 @@ void LLItemBridge::buildDisplayName(LLInventoryItem* item, std::string& name) LLFontGL::StyleFlags LLItemBridge::getLabelStyle() const { U8 font = LLFontGL::NORMAL; + const LLViewerInventoryItem* item = getItem(); if (get_is_item_worn(mUUID)) { // llinfos << "BOLD" << llendl; font |= LLFontGL::BOLD; } - - const LLViewerInventoryItem* item = getItem(); - if (item && item->getIsLinkType()) + else if(item && item->getIsLinkType()) { font |= LLFontGL::ITALIC; } + return (LLFontGL::StyleFlags)font; } @@ -1323,13 +1311,65 @@ BOOL LLItemBridge::removeItem() { return FALSE; } + + // move it to the trash LLPreview::hide(mUUID, TRUE); LLInventoryModel* model = getInventoryModel(); if(!model) return FALSE; - const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH); + const LLUUID& trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH); LLViewerInventoryItem* item = getItem(); + if (!item) return FALSE; + // Already in trash + if (model->isObjectDescendentOf(mUUID, trash_id)) return FALSE; + + LLNotification::Params params("ConfirmItemDeleteHasLinks"); + params.functor.function(boost::bind(&LLItemBridge::confirmRemoveItem, this, _1, _2)); + + // Check if this item has any links. If generic inventory linking is enabled, + // we can't do this check because we may have items in a folder somewhere that is + // not yet in memory, so we don't want false negatives. (If disabled, then we + // know we only have links in the Outfits folder which we explicitly fetch.) + if (!gSavedSettings.getBOOL("InventoryLinking")) + { + if (!item->getIsLinkType()) + { + LLInventoryModel::cat_array_t cat_array; + LLInventoryModel::item_array_t item_array; + LLLinkedItemIDMatches is_linked_item_match(mUUID); + gInventory.collectDescendentsIf(gInventory.getRootFolderID(), + cat_array, + item_array, + LLInventoryModel::INCLUDE_TRASH, + is_linked_item_match); + + const U32 num_links = cat_array.size() + item_array.size(); + if (num_links > 0) + { + // Warn if the user is will break any links when deleting this item. + LLNotifications::instance().add(params); + return FALSE; + } + } + } + + LLNotifications::instance().forceResponse(params, 0); + return TRUE; +} + +BOOL LLItemBridge::confirmRemoveItem(const LLSD& notification, const LLSD& response) +{ + S32 option = LLNotificationsUtil::getSelectedOption(notification, response); + if (option != 0) return FALSE; + + LLInventoryModel* model = getInventoryModel(); + if (!model) return FALSE; + + LLViewerInventoryItem* item = getItem(); + if (!item) return FALSE; + + const LLUUID& trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH); // if item is not already in trash if(item && !model->isObjectDescendentOf(mUUID, trash_id)) { @@ -1338,11 +1378,7 @@ BOOL LLItemBridge::removeItem() // delete was successful return TRUE; } - else - { - // tried to delete already item in trash (should purge?) - return FALSE; - } + return FALSE; } BOOL LLItemBridge::isItemCopyable() const @@ -1362,17 +1398,11 @@ BOOL LLItemBridge::isItemCopyable() const return FALSE; } - if (gAgent.isGodlike()) - { - // All items can be copied in god mode since you can - // at least paste-as-link the item, though you - // still may not be able paste the item. - return TRUE; - } - else - { - return (item->getPermissions().allowCopyBy(gAgent.getID())); - } + // All items can be copied in god mode since you can + // at least paste-as-link the item, though you + // still may not be able paste the item. + return TRUE; + // return (item->getPermissions().allowCopyBy(gAgent.getID())); } return FALSE; } @@ -1403,11 +1433,7 @@ BOOL LLItemBridge::isItemPermissive() const LLViewerInventoryItem* item = getItem(); if(item) { - U32 mask = item->getPermissions().getMaskBase(); - if((mask & PERM_ITEM_UNRESTRICTED) == PERM_ITEM_UNRESTRICTED) - { - return TRUE; - } + return item->getIsFullPerm(); } return FALSE; } @@ -1464,30 +1490,7 @@ public: // Can be destroyed (or moved to trash) BOOL LLFolderBridge::isItemRemovable() const { - LLInventoryModel* model = getInventoryModel(); - if(!model) - { - return FALSE; - } - - if(!model->isObjectDescendentOf(mUUID, gInventory.getRootFolderID())) - { - return FALSE; - } - - LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); - if( !avatar ) - { - return FALSE; - } - - LLInventoryCategory* category = model->getCategory(mUUID); - if( !category ) - { - return FALSE; - } - - if(LLFolderType::lookupIsProtectedType(category->getPreferredType())) + if (!get_is_category_removable(getInventoryModel(), mUUID)) { return FALSE; } @@ -1503,6 +1506,7 @@ BOOL LLFolderBridge::isItemRemovable() const return FALSE; } } + return TRUE; } @@ -1521,7 +1525,12 @@ BOOL LLFolderBridge::isUpToDate() const BOOL LLFolderBridge::isItemCopyable() const { - return TRUE; + if (gSavedSettings.getBOOL("InventoryLinking")) + { + // Can copy folders to paste-as-link, but not for straight paste. + return TRUE; + } + return FALSE; } BOOL LLFolderBridge::copyToClipboard() const @@ -1630,8 +1639,7 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat, LLInventoryModel* model = getInventoryModel(); if(!model) return FALSE; - LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); - if(!avatar) return FALSE; + if (!isAgentAvatarValid()) return FALSE; // cannot drag categories into library if(!isAgentInventory()) @@ -1655,7 +1663,7 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat, // Is the destination the trash? const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH); BOOL move_is_into_trash = (mUUID == trash_id) - || model->isObjectDescendentOf(mUUID, trash_id); + || model->isObjectDescendentOf(mUUID, trash_id); BOOL is_movable = (!LLFolderType::lookupIsProtectedType(inv_cat->getPreferredType())); const LLUUID current_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT); BOOL move_is_into_current_outfit = (mUUID == current_outfit_id); @@ -1703,12 +1711,11 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat, } } - - accept = is_movable - && (mUUID != cat_id) // Can't move a folder into itself - && (mUUID != inv_cat->getParentUUID()) // Avoid moves that would change nothing - && !(model->isObjectDescendentOf(mUUID, cat_id)); // Avoid circularity - if(accept && drop) + accept = is_movable + && (mUUID != cat_id) // Can't move a folder into itself + && (mUUID != inv_cat->getParentUUID()) // Avoid moves that would change nothing + && !(model->isObjectDescendentOf(mUUID, cat_id)); // Avoid circularity + if (accept && drop) { // Look for any gestures and deactivate them if (move_is_into_trash) @@ -1717,9 +1724,9 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat, { LLInventoryItem* item = descendent_items[i]; if (item->getType() == LLAssetType::AT_GESTURE - && LLGestureManager::instance().isGestureActive(item->getUUID())) + && LLGestureMgr::instance().isGestureActive(item->getUUID())) { - LLGestureManager::instance().deactivateGesture(item->getUUID()); + LLGestureMgr::instance().deactivateGesture(item->getUUID()); } } } @@ -1732,7 +1739,7 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat, { // traverse category and add all contents to currently worn. BOOL append = true; - LLAppearanceManager::instance().wearInventoryCategory(inv_cat, false, append); + LLAppearanceMgr::instance().wearInventoryCategory(inv_cat, false, append); } else { @@ -1740,28 +1747,30 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat, LLInventoryModel::cat_array_t cats; LLInventoryModel::item_array_t items; gInventory.collectDescendents(inv_cat->getUUID(), cats, items, LLInventoryModel::EXCLUDE_TRASH); - LLAppearanceManager::instance().linkAll(mUUID,items,NULL); + LLAppearanceMgr::instance().linkAll(mUUID,items,NULL); } } else { #if SUPPORT_ENSEMBLES - // BAP - should skip if dup. - if (move_is_into_current_outfit) - { - LLAppearanceManager::instance().addEnsembleLink(inv_cat); - } - else - { - LLPointer<LLInventoryCallback> cb = NULL; - link_inventory_item( - gAgent.getID(), - inv_cat->getUUID(), - mUUID, - inv_cat->getName(), - LLAssetType::AT_LINK_FOLDER, - cb); - } + // BAP - should skip if dup. + if (move_is_into_current_outfit) + { + LLAppearanceMgr::instance().addEnsembleLink(inv_cat); + } + else + { + LLPointer<LLInventoryCallback> cb = NULL; + const std::string empty_description = ""; + link_inventory_item( + gAgent.getID(), + inv_cat->getUUID(), + mUUID, + inv_cat->getName(), + empty_description, + LLAssetType::AT_LINK_FOLDER, + cb); + } #endif } } @@ -1778,7 +1787,7 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat, } } } - else if(LLToolDragAndDrop::SOURCE_WORLD == source) + else if (LLToolDragAndDrop::SOURCE_WORLD == source) { // content category has same ID as object itself LLUUID object_id = inv_cat->getUUID(); @@ -1823,7 +1832,7 @@ BOOL move_inv_category_world_to_agent(const LLUUID& object_id, // this folder is coming from an object, as there is only one folder in an object, the root, // we need to collect the entire contents and handle them as a group - InventoryObjectList inventory_objects; + LLInventoryObject::object_list_t inventory_objects; object->getInventoryContents(inventory_objects); if (inventory_objects.empty()) @@ -1837,8 +1846,8 @@ BOOL move_inv_category_world_to_agent(const LLUUID& object_id, // coming from a task. Need to figure out if the person can // move/copy this item. - InventoryObjectList::iterator it = inventory_objects.begin(); - InventoryObjectList::iterator end = inventory_objects.end(); + LLInventoryObject::object_list_t::iterator it = inventory_objects.begin(); + LLInventoryObject::object_list_t::iterator end = inventory_objects.end(); for ( ; it != end; ++it) { // coming from a task. Need to figure out if the person can @@ -1868,7 +1877,7 @@ BOOL move_inv_category_world_to_agent(const LLUUID& object_id, if(drop && accept) { it = inventory_objects.begin(); - InventoryObjectList::iterator first_it = inventory_objects.begin(); + LLInventoryObject::object_list_t::iterator first_it = inventory_objects.begin(); LLMoveInv* move_inv = new LLMoveInv; move_inv->mObjectID = object_id; move_inv->mCategoryID = category_id; @@ -1896,61 +1905,21 @@ BOOL move_inv_category_world_to_agent(const LLUUID& object_id, return accept; } -bool LLFindCOFValidItems::operator()(LLInventoryCategory* cat, - LLInventoryItem* item) -{ - // Valid COF items are: - // - links to wearables (body parts or clothing) - // - links to attachments - // - links to gestures - // - links to ensemble folders - LLViewerInventoryItem *linked_item = ((LLViewerInventoryItem*)item)->getLinkedItem(); // BAP - safe? - if (linked_item) - { - LLAssetType::EType type = linked_item->getType(); - return (type == LLAssetType::AT_CLOTHING || - type == LLAssetType::AT_BODYPART || - type == LLAssetType::AT_GESTURE || - type == LLAssetType::AT_OBJECT); - } - else - { - LLViewerInventoryCategory *linked_category = ((LLViewerInventoryItem*)item)->getLinkedCategory(); // BAP - safe? - // BAP remove AT_NONE support after ensembles are fully working? - return (linked_category && - ((linked_category->getPreferredType() == LLFolderType::FT_NONE) || - (LLFolderType::lookupIsEnsembleType(linked_category->getPreferredType())))); - } -} - - -bool LLFindWearables::operator()(LLInventoryCategory* cat, - LLInventoryItem* item) -{ - if(item) - { - if((item->getType() == LLAssetType::AT_CLOTHING) - || (item->getType() == LLAssetType::AT_BODYPART)) - { - return TRUE; - } - } - return FALSE; -} - - - //Used by LLFolderBridge as callback for directory recursion. -class LLRightClickInventoryFetchObserver : public LLInventoryFetchObserver +class LLRightClickInventoryFetchObserver : public LLInventoryFetchItemsObserver { public: - LLRightClickInventoryFetchObserver() : + LLRightClickInventoryFetchObserver(const uuid_vec_t& ids) : + LLInventoryFetchItemsObserver(ids), mCopyItems(false) { }; - LLRightClickInventoryFetchObserver(const LLUUID& cat_id, bool copy_items) : + LLRightClickInventoryFetchObserver(const uuid_vec_t& ids, + const LLUUID& cat_id, + bool copy_items) : + LLInventoryFetchItemsObserver(ids), mCatID(cat_id), mCopyItems(copy_items) - { }; + { }; virtual void done() { // we've downloaded all the items, so repaint the dialog @@ -1971,7 +1940,11 @@ protected: class LLRightClickInventoryFetchDescendentsObserver : public LLInventoryFetchDescendentsObserver { public: - LLRightClickInventoryFetchDescendentsObserver(bool copy_items) : mCopyItems(copy_items) {} + LLRightClickInventoryFetchDescendentsObserver(const uuid_vec_t& ids, + bool copy_items) : + LLInventoryFetchDescendentsObserver(ids), + mCopyItems(copy_items) + {} ~LLRightClickInventoryFetchDescendentsObserver() {} virtual void done(); protected: @@ -1982,7 +1955,7 @@ void LLRightClickInventoryFetchDescendentsObserver::done() { // Avoid passing a NULL-ref as mCompleteFolders.front() down to // gInventory.collectDescendents() - if( mCompleteFolders.empty() ) + if( mComplete.empty() ) { llwarns << "LLRightClickInventoryFetchDescendentsObserver::done with empty mCompleteFolders" << llendl; dec_busy_count(); @@ -1996,7 +1969,7 @@ void LLRightClickInventoryFetchDescendentsObserver::done() // happen. LLInventoryModel::cat_array_t cat_array; LLInventoryModel::item_array_t item_array; - gInventory.collectDescendents(mCompleteFolders.front(), + gInventory.collectDescendents(mComplete.front(), cat_array, item_array, LLInventoryModel::EXCLUDE_TRASH); @@ -2014,14 +1987,14 @@ void LLRightClickInventoryFetchDescendentsObserver::done() } #endif - LLRightClickInventoryFetchObserver* outfit; - outfit = new LLRightClickInventoryFetchObserver(mCompleteFolders.front(), mCopyItems); - LLInventoryFetchObserver::item_ref_t ids; + uuid_vec_t ids; for(S32 i = 0; i < count; ++i) { ids.push_back(item_array.get(i)->getUUID()); } + LLRightClickInventoryFetchObserver* outfit = new LLRightClickInventoryFetchObserver(ids, mComplete.front(), mCopyItems); + // clean up, and remove this as an observer since the call to the // outfit could notify observers and throw us into an infinite // loop. @@ -2034,19 +2007,19 @@ void LLRightClickInventoryFetchDescendentsObserver::done() inc_busy_count(); // do the fetch - outfit->fetchItems(ids); + outfit->startFetch(); outfit->done(); //Not interested in waiting and this will be right 99% of the time. //Uncomment the following code for laggy Inventory UI. -/* if(outfit->isEverythingComplete()) +/* if(outfit->isFinished()) { - // everything is already here - call done. - outfit->done(); + // everything is already here - call done. + outfit->done(); } else { - // it's all on it's way - add an observer, and the inventory - // will call done for us when everything is here. - gInventory.addObserver(outfit); + // it's all on it's way - add an observer, and the inventory + // will call done for us when everything is here. + gInventory.addObserver(outfit); }*/ } @@ -2060,7 +2033,8 @@ void LLRightClickInventoryFetchDescendentsObserver::done() class LLInventoryCopyAndWearObserver : public LLInventoryObserver { public: - LLInventoryCopyAndWearObserver(const LLUUID& cat_id, int count) :mCatID(cat_id), mContentsCount(count), mFolderAdded(FALSE) {} + LLInventoryCopyAndWearObserver(const LLUUID& cat_id, int count) : + mCatID(cat_id), mContentsCount(count), mFolderAdded(FALSE) {} virtual ~LLInventoryCopyAndWearObserver() {} virtual void changed(U32 mask); @@ -2099,7 +2073,7 @@ void LLInventoryCopyAndWearObserver::changed(U32 mask) if (NULL == category) { llwarns << "gInventory.getCategory(" << mCatID - << ") was NULL" << llendl; + << ") was NULL" << llendl; } else { @@ -2107,7 +2081,7 @@ void LLInventoryCopyAndWearObserver::changed(U32 mask) mContentsCount) { gInventory.removeObserver(this); - LLAppearanceManager::instance().wearInventoryCategory(category, FALSE, TRUE); + LLAppearanceMgr::instance().wearInventoryCategory(category, FALSE, TRUE); delete this; } } @@ -2118,11 +2092,11 @@ void LLInventoryCopyAndWearObserver::changed(U32 mask) -void LLFolderBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) +void LLFolderBridge::performAction(LLInventoryModel* model, std::string action) { if ("open" == action) { - LLFolderViewFolder *f = dynamic_cast<LLFolderViewFolder *>(folder->getItemByID(mUUID)); + LLFolderViewFolder *f = dynamic_cast<LLFolderViewFolder *>(mRoot->getItemByID(mUUID)); if (f) { f->setOpen(TRUE); @@ -2157,7 +2131,7 @@ void LLFolderBridge::performAction(LLFolderView* folder, LLInventoryModel* model if(!model) return; LLViewerInventoryCategory* cat = getCategory(); if(!cat) return; - LLAppearanceManager::instance().addEnsembleLink(cat,true); + LLAppearanceMgr::instance().addEnsembleLink(cat,true); return; } #endif @@ -2226,19 +2200,16 @@ void LLFolderBridge::determineFolderType() { LLInventoryModel* model = getInventoryModel(); LLViewerInventoryCategory* category = model->getCategory(mUUID); - category->determineFolderType(); + if (category) + { + category->determineFolderType(); + } } } BOOL LLFolderBridge::isItemRenameable() const { - LLViewerInventoryCategory* cat = (LLViewerInventoryCategory*)getCategory(); - if(cat && !LLFolderType::lookupIsProtectedType(cat->getPreferredType()) - && (cat->getOwnerID() == gAgent.getID())) - { - return TRUE; - } - return FALSE; + return get_is_category_renameable(getInventoryModel(), mUUID); } void LLFolderBridge::restoreItem() @@ -2278,42 +2249,22 @@ LLUIImagePtr LLFolderBridge::getIcon() const return getIcon(preferred_type); } +// static LLUIImagePtr LLFolderBridge::getIcon(LLFolderType::EType preferred_type) { - // we only have one folder image now - if (preferred_type == LLFolderType::FT_OUTFIT) - { - return LLUI::getUIImage("Inv_LookFolderClosed"); - } - return LLUI::getUIImage("Inv_FolderClosed"); + return LLUI::getUIImage(LLViewerFolderType::lookupIconName(preferred_type, FALSE)); } LLUIImagePtr LLFolderBridge::getOpenIcon() const { - if (getPreferredType() == LLFolderType::FT_OUTFIT) - { - return LLUI::getUIImage("Inv_LookFolderOpen"); - } - return LLUI::getUIImage("Inv_FolderOpen"); + return LLUI::getUIImage(LLViewerFolderType::lookupIconName(getPreferredType(), TRUE)); + } BOOL LLFolderBridge::renameItem(const std::string& new_name) { - if(!isItemRenameable()) - return FALSE; - LLInventoryModel* model = getInventoryModel(); - if(!model) - return FALSE; - LLViewerInventoryCategory* cat = getCategory(); - if(cat && (cat->getName() != new_name)) - { - LLPointer<LLViewerInventoryCategory> new_cat = new LLViewerInventoryCategory(cat); - new_cat->rename(new_name); - new_cat->updateServer(FALSE); - model->updateCategory(new_cat); + rename_category(getInventoryModel(), mUUID, new_name); - model->notifyObservers(); - } // return FALSE because we either notified observers (& therefore // rebuilt) or we didn't update. return FALSE; @@ -2367,36 +2318,7 @@ bool LLFolderBridge::removeItemResponse(const LLSD& notification, const LLSD& re { // move it to the trash LLPreview::hide(mUUID); - LLInventoryModel* model = getInventoryModel(); - if(!model) return FALSE; - - const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH); - - // Look for any gestures and deactivate them - LLInventoryModel::cat_array_t descendent_categories; - LLInventoryModel::item_array_t descendent_items; - gInventory.collectDescendents( mUUID, descendent_categories, descendent_items, FALSE ); - - for (LLInventoryModel::item_array_t::const_iterator iter = descendent_items.begin(); - iter != descendent_items.end(); - ++iter) - { - const LLViewerInventoryItem* item = (*iter); - const LLUUID& item_id = item->getUUID(); - if (item->getType() == LLAssetType::AT_GESTURE - && LLGestureManager::instance().isGestureActive(item_id)) - { - LLGestureManager::instance().deactivateGesture(item_id); - } - } - - // go ahead and do the normal remove if no 'last calling - // cards' are being removed. - LLViewerInventoryCategory* cat = getCategory(); - if(cat) - { - LLInvFVBridge::changeCategoryParent(model, cat, trash_id, TRUE); - } + remove_category(getInventoryModel(), mUUID); return TRUE; } return FALSE; @@ -2423,7 +2345,12 @@ void LLFolderBridge::pasteFromClipboard() { // move_inventory_item() is not enough, //we have to update inventory locally too - changeItemParent(model, dynamic_cast<LLViewerInventoryItem*>(item), parent_id, FALSE); + LLViewerInventoryItem* viitem = dynamic_cast<LLViewerInventoryItem*>(item); + llassert(viitem); + if (viitem) + { + changeItemParent(model, viitem, parent_id, FALSE); + } } else { @@ -2454,26 +2381,26 @@ void LLFolderBridge::pasteLinkFromClipboard() ++iter) { const LLUUID &object_id = (*iter); -#if SUPPORT_ENSEMBLES if (LLInventoryCategory *cat = model->getCategory(object_id)) { + const std::string empty_description = ""; link_inventory_item( gAgent.getID(), cat->getUUID(), parent_id, cat->getName(), + empty_description, LLAssetType::AT_LINK_FOLDER, LLPointer<LLInventoryCallback>(NULL)); } - else -#endif - if (LLInventoryItem *item = model->getItem(object_id)) + else if (LLInventoryItem *item = model->getItem(object_id)) { link_inventory_item( gAgent.getID(), item->getLinkedUUID(), parent_id, item->getName(), + item->getDescription(), LLAssetType::AT_LINK, LLPointer<LLInventoryCallback>(NULL)); } @@ -2495,11 +2422,13 @@ void LLFolderBridge::folderOptionsMenu() if(!model) return; const LLInventoryCategory* category = model->getCategory(mUUID); + if(!category) return; + LLFolderType::EType type = category->getPreferredType(); - const bool is_system_folder = category && LLFolderType::lookupIsProtectedType(type); + const bool is_system_folder = LLFolderType::lookupIsProtectedType(type); // BAP change once we're no longer treating regular categories as ensembles. - const bool is_ensemble = category && (type == LLFolderType::FT_NONE || - LLFolderType::lookupIsEnsembleType(type)); + const bool is_ensemble = (type == LLFolderType::FT_NONE || + LLFolderType::lookupIsEnsembleType(type)); // calling card related functionality for folders. @@ -2560,7 +2489,7 @@ void LLFolderBridge::folderOptionsMenu() mItems.push_back(std::string("Wear As Ensemble")); } mItems.push_back(std::string("Remove From Outfit")); - if (!areAnyContentsWorn(model)) + if (!LLAppearanceMgr::getCanRemoveFromCOF(mUUID)) { disabled_items.push_back(std::string("Remove From Outfit")); } @@ -2585,35 +2514,6 @@ BOOL LLFolderBridge::checkFolderForContentsOfType(LLInventoryModel* model, LLInv return ((item_array.count() > 0) ? TRUE : FALSE ); } -class LLFindWorn : public LLInventoryCollectFunctor -{ -public: - LLFindWorn() {} - virtual ~LLFindWorn() {} - virtual bool operator()(LLInventoryCategory* cat, - LLInventoryItem* item) - { - if (item && get_is_item_worn(item->getUUID())) - { - return TRUE; - } - return FALSE; - } -}; - -BOOL LLFolderBridge::areAnyContentsWorn(LLInventoryModel* model) const -{ - LLInventoryModel::cat_array_t cat_array; - LLInventoryModel::item_array_t item_array; - LLFindWorn is_worn; - model->collectDescendentsIf(mUUID, - cat_array, - item_array, - LLInventoryModel::EXCLUDE_TRASH, - is_worn); - return (item_array.size() > 0); -} - // Flags unused void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags) { @@ -2629,10 +2529,17 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags) const LLUUID lost_and_found_id = model->findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND); if (lost_and_found_id == mUUID) - { + { // This is the lost+found folder. - mItems.push_back(std::string("Empty Lost And Found")); - } + mItems.push_back(std::string("Empty Lost And Found")); + + mDisabledItems.push_back(std::string("New Folder")); + mDisabledItems.push_back(std::string("New Script")); + mDisabledItems.push_back(std::string("New Note")); + mDisabledItems.push_back(std::string("New Gesture")); + mDisabledItems.push_back(std::string("New Clothes")); + mDisabledItems.push_back(std::string("New Body Parts")); + } if(trash_id == mUUID) { @@ -2650,8 +2557,7 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags) LLViewerInventoryCategory *cat = getCategory(); // BAP removed protected check to re-enable standard ops in untyped folders. // Not sure what the right thing is to do here. - if (!isCOFFolder() && cat && cat->getPreferredType()!=LLFolderType::FT_OUTFIT /*&& - LLAssetType::lookupIsProtectedCategoryType(cat->getPreferredType())*/) + if (!isCOFFolder() && cat && (cat->getPreferredType() != LLFolderType::FT_OUTFIT)) { // Do not allow to create 2-level subfolder in the Calling Card/Friends folder. EXT-694. if (!LLFriendCardsManager::instance().isCategoryInFriendFolder(cat)) @@ -2662,9 +2568,9 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags) mItems.push_back(std::string("New Clothes")); mItems.push_back(std::string("New Body Parts")); - // Changing folder types is just a debug feature; this is fairly unsupported +#if SUPPORT_ENSEMBLES + // Changing folder types is an unfinished unsupported feature // and can lead to unexpected behavior if enabled. -#if !LL_RELEASE_FOR_DOWNLOAD mItems.push_back(std::string("Change Type")); const LLViewerInventoryCategory *cat = getCategory(); if (cat && LLFolderType::lookupIsProtectedType(cat->getPreferredType())) @@ -2683,7 +2589,7 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags) addDeleteContextMenuOptions(mItems, mDisabledItems); // EXT-4030: disallow deletion of currently worn outfit - const LLViewerInventoryItem *base_outfit_link = LLAppearanceManager::instance().getBaseOutfitLink(); + const LLViewerInventoryItem *base_outfit_link = LLAppearanceMgr::instance().getBaseOutfitLink(); if (base_outfit_link && (cat == base_outfit_link->getLinkedCategory())) { mDisabledItems.push_back(std::string("Delete")); @@ -2713,17 +2619,18 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags) mMenu = &menu; sSelf = this; - LLRightClickInventoryFetchDescendentsObserver* fetch = new LLRightClickInventoryFetchDescendentsObserver(FALSE); - LLInventoryFetchDescendentsObserver::folder_ref_t folders; + + uuid_vec_t folders; LLViewerInventoryCategory* category = (LLViewerInventoryCategory*)model->getCategory(mUUID); if (category) { folders.push_back(category->getUUID()); } - fetch->fetchDescendents(folders); + LLRightClickInventoryFetchDescendentsObserver* fetch = new LLRightClickInventoryFetchDescendentsObserver(folders, FALSE); + fetch->startFetch(); inc_busy_count(); - if(fetch->isEverythingComplete()) + if(fetch->isFinished()) { // everything is already here - call done. fetch->done(); @@ -2746,7 +2653,13 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags) { mDisabledItems.push_back(std::string("Delete System Folder")); } - + + mItems.push_back(std::string("Share")); + if (!canShare()) + { + mDisabledItems.push_back(std::string("Share")); + } + hide_context_entries(menu, mItems, mDisabledItems); } @@ -2838,90 +2751,75 @@ void LLFolderBridge::createNewCategory(void* user_data) void LLFolderBridge::createNewShirt(void* user_data) { - LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SHIRT); + LLFolderBridge::createWearable((LLFolderBridge*)user_data, LLWearableType::WT_SHIRT); } void LLFolderBridge::createNewPants(void* user_data) { - LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_PANTS); + LLFolderBridge::createWearable((LLFolderBridge*)user_data, LLWearableType::WT_PANTS); } void LLFolderBridge::createNewShoes(void* user_data) { - LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SHOES); + LLFolderBridge::createWearable((LLFolderBridge*)user_data, LLWearableType::WT_SHOES); } void LLFolderBridge::createNewSocks(void* user_data) { - LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SOCKS); + LLFolderBridge::createWearable((LLFolderBridge*)user_data, LLWearableType::WT_SOCKS); } void LLFolderBridge::createNewJacket(void* user_data) { - LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_JACKET); + LLFolderBridge::createWearable((LLFolderBridge*)user_data, LLWearableType::WT_JACKET); } void LLFolderBridge::createNewSkirt(void* user_data) { - LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SKIRT); + LLFolderBridge::createWearable((LLFolderBridge*)user_data, LLWearableType::WT_SKIRT); } void LLFolderBridge::createNewGloves(void* user_data) { - LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_GLOVES); + LLFolderBridge::createWearable((LLFolderBridge*)user_data, LLWearableType::WT_GLOVES); } void LLFolderBridge::createNewUndershirt(void* user_data) { - LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_UNDERSHIRT); + LLFolderBridge::createWearable((LLFolderBridge*)user_data, LLWearableType::WT_UNDERSHIRT); } void LLFolderBridge::createNewUnderpants(void* user_data) { - LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_UNDERPANTS); + LLFolderBridge::createWearable((LLFolderBridge*)user_data, LLWearableType::WT_UNDERPANTS); } void LLFolderBridge::createNewShape(void* user_data) { - LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SHAPE); + LLFolderBridge::createWearable((LLFolderBridge*)user_data, LLWearableType::WT_SHAPE); } void LLFolderBridge::createNewSkin(void* user_data) { - LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SKIN); + LLFolderBridge::createWearable((LLFolderBridge*)user_data, LLWearableType::WT_SKIN); } void LLFolderBridge::createNewHair(void* user_data) { - LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_HAIR); + LLFolderBridge::createWearable((LLFolderBridge*)user_data, LLWearableType::WT_HAIR); } void LLFolderBridge::createNewEyes(void* user_data) { - LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_EYES); + LLFolderBridge::createWearable((LLFolderBridge*)user_data, LLWearableType::WT_EYES); } // static -void LLFolderBridge::createWearable(LLFolderBridge* bridge, EWearableType type) +void LLFolderBridge::createWearable(LLFolderBridge* bridge, LLWearableType::EType type) { if(!bridge) return; LLUUID parent_id = bridge->getUUID(); - createWearable(parent_id, type); -} - -// Separate function so can be called by global menu as well as right-click -// menu. -// static -void LLFolderBridge::createWearable(const LLUUID &parent_id, EWearableType type) -{ - LLWearable* wearable = LLWearableList::instance().createNewWearable(type); - LLAssetType::EType asset_type = wearable->getAssetType(); - LLInventoryType::EType inv_type = LLInventoryType::IT_WEARABLE; - create_inventory_item(gAgent.getID(), gAgent.getSessionID(), - parent_id, wearable->getTransactionID(), wearable->getName(), - wearable->getDescription(), asset_type, inv_type, wearable->getType(), - wearable->getPermissions().getMaskNextOwner(), - LLPointer<LLInventoryCallback>(NULL)); + LLAgentWearables::createWearable(type, false, parent_id); } void LLFolderBridge::modifyOutfit(BOOL append) @@ -2931,9 +2829,7 @@ void LLFolderBridge::modifyOutfit(BOOL append) LLViewerInventoryCategory* cat = getCategory(); if(!cat) return; - // BAP - was: - // wear_inventory_category_on_avatar( cat, append ); - LLAppearanceManager::instance().wearInventoryCategory( cat, FALSE, append ); + LLAppearanceMgr::instance().wearInventoryCategory( cat, FALSE, append ); } // helper stuff @@ -2947,7 +2843,7 @@ bool move_task_inventory_callback(const LLSD& notification, const LLSD& response { if (cat_and_wear && cat_and_wear->mWear) { - InventoryObjectList inventory_objects; + LLInventoryObject::object_list_t inventory_objects; object->getInventoryContents(inventory_objects); int contents_count = inventory_objects.size()-1; //subtract one for containing folder @@ -2957,8 +2853,8 @@ bool move_task_inventory_callback(const LLSD& notification, const LLSD& response two_uuids_list_t::iterator move_it; for (move_it = move_inv->mMoveList.begin(); - move_it != move_inv->mMoveList.end(); - ++move_it) + move_it != move_inv->mMoveList.end(); + ++move_it) { object->moveInventory(move_it->first, move_it->second); } @@ -2988,31 +2884,36 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item, return FALSE; } - LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); - if(!avatar) return FALSE; + if (!isAgentAvatarValid()) return FALSE; LLToolDragAndDrop::ESource source = LLToolDragAndDrop::getInstance()->getSource(); BOOL accept = FALSE; LLViewerObject* object = NULL; if(LLToolDragAndDrop::SOURCE_AGENT == source) { - BOOL is_movable = TRUE; switch( inv_item->getActualType() ) { - case LLAssetType::AT_CATEGORY: - is_movable = !LLFolderType::lookupIsProtectedType(((LLInventoryCategory*)inv_item)->getPreferredType()); - break; - default: - break; + case LLAssetType::AT_CATEGORY: + is_movable = !LLFolderType::lookupIsProtectedType(((LLInventoryCategory*)inv_item)->getPreferredType()); + break; + default: + break; } const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH); - BOOL move_is_into_trash = (mUUID == trash_id) || model->isObjectDescendentOf(mUUID, trash_id); + const BOOL move_is_into_trash = (mUUID == trash_id) || model->isObjectDescendentOf(mUUID, trash_id); const LLUUID current_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT); - BOOL move_is_into_current_outfit = (mUUID == current_outfit_id); - BOOL move_is_into_outfit = (getCategory() && getCategory()->getPreferredType()==LLFolderType::FT_OUTFIT); + const BOOL move_is_into_current_outfit = (mUUID == current_outfit_id); + const BOOL move_is_into_outfit = (getCategory() && getCategory()->getPreferredType()==LLFolderType::FT_OUTFIT); + const BOOL move_is_outof_current_outfit = LLAppearanceMgr::instance().getIsInCOF(inv_item->getUUID()); + // Can't explicitly drag things out of the COF. + if (move_is_outof_current_outfit) + { + is_movable = FALSE; + } + if(is_movable && move_is_into_trash) { is_movable = inv_item->getIsLinkType() || !get_is_item_worn(inv_item->getUUID()); @@ -3037,9 +2938,9 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item, if(accept && drop) { if (inv_item->getType() == LLAssetType::AT_GESTURE - && LLGestureManager::instance().isGestureActive(inv_item->getUUID()) && move_is_into_trash) + && LLGestureMgr::instance().isGestureActive(inv_item->getUUID()) && move_is_into_trash) { - LLGestureManager::instance().deactivateGesture(inv_item->getUUID()); + LLGestureMgr::instance().deactivateGesture(inv_item->getUUID()); } // If an item is being dragged between windows, unselect // everything in the active window so that we don't follow @@ -3092,7 +2993,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item, // BAP - should skip if dup. if (move_is_into_current_outfit) { - LLAppearanceManager::instance().addCOFItemLink(inv_item); + LLAppearanceMgr::instance().addCOFItemLink(inv_item); } else { @@ -3102,6 +3003,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item, inv_item->getLinkedUUID(), mUUID, inv_item->getName(), + inv_item->getDescription(), LLAssetType::AT_LINK, cb); } @@ -3162,6 +3064,9 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item, } else { + // store dad inventory item to select added one later. See EXT-4347 + set_dad_inventory_item(inv_item, mUUID); + LLNotification::Params params("MoveInventoryFromObject"); params.functor.function(boost::bind(move_task_inventory_callback, _1, _2, move_inv)); LLNotifications::instance().forceResponse(params, 0); @@ -3175,13 +3080,13 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item, if(drop) { copy_inventory_from_notecard(LLToolDragAndDrop::getInstance()->getObjectID(), - LLToolDragAndDrop::getInstance()->getSourceID(), inv_item); + LLToolDragAndDrop::getInstance()->getSourceID(), inv_item); } } else if(LLToolDragAndDrop::SOURCE_LIBRARY == source) { LLViewerInventoryItem* item = (LLViewerInventoryItem*)inv_item; - if(item && item->isComplete()) + if(item && item->isFinished()) { accept = TRUE; if(drop) @@ -3204,21 +3109,12 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item, } // +=================================================+ -// | LLScriptBridge (DEPRECTED) | -// +=================================================+ - -LLUIImagePtr LLScriptBridge::getIcon() const -{ - return get_item_icon(LLAssetType::AT_SCRIPT, LLInventoryType::IT_LSL, 0, FALSE); -} - -// +=================================================+ // | LLTextureBridge | // +=================================================+ LLUIImagePtr LLTextureBridge::getIcon() const { - return get_item_icon(LLAssetType::AT_TEXTURE, mInvType, 0, FALSE); + return LLInventoryIcon::getIcon(LLAssetType::AT_TEXTURE, mInvType); } void LLTextureBridge::openItem() @@ -3258,7 +3154,13 @@ void LLTextureBridge::buildContextMenu(LLMenuGL& menu, U32 flags) } else { - items.push_back(std::string("Open")); + items.push_back(std::string("Share")); + if (!canShare()) + { + disabled_items.push_back(std::string("Share")); + } + + addOpenRightClickMenuOption(items); items.push_back(std::string("Properties")); getClipboardEntries(true, items, disabled_items, flags); @@ -3274,7 +3176,7 @@ void LLTextureBridge::buildContextMenu(LLMenuGL& menu, U32 flags) } // virtual -void LLTextureBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) +void LLTextureBridge::performAction(LLInventoryModel* model, std::string action) { if ("save_as" == action) { @@ -3285,38 +3187,20 @@ void LLTextureBridge::performAction(LLFolderView* folder, LLInventoryModel* mode preview_texture->openToSave(); } } - else LLItemBridge::performAction(folder, model, action); + else LLItemBridge::performAction(model, action); } // +=================================================+ // | LLSoundBridge | // +=================================================+ -LLUIImagePtr LLSoundBridge::getIcon() const -{ - return get_item_icon(LLAssetType::AT_SOUND, LLInventoryType::IT_SOUND, 0, FALSE); -} - void LLSoundBridge::openItem() { - LLViewerInventoryItem* item = getItem(); - + const LLViewerInventoryItem* item = getItem(); if (item) { LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); } -/* -// Changed this back to the way it USED to work: -// only open the preview dialog through the contextual right-click menu -// double-click just plays the sound - - LLViewerInventoryItem* item = getItem(); - if(item) - { - openSoundPreview((void*)this); - //send_uuid_sound_trigger(item->getAssetUUID(), 1.0); - } -*/ } void LLSoundBridge::previewItem() @@ -3346,6 +3230,11 @@ void LLSoundBridge::buildContextMenu(LLMenuGL& menu, U32 flags) } else { + items.push_back(std::string("Share")); + if (!canShare()) + { + disabled_items.push_back(std::string("Share")); + } items.push_back(std::string("Sound Open")); items.push_back(std::string("Properties")); @@ -3362,11 +3251,14 @@ void LLSoundBridge::buildContextMenu(LLMenuGL& menu, U32 flags) // | LLLandmarkBridge | // +=================================================+ -LLLandmarkBridge::LLLandmarkBridge(LLInventoryPanel* inventory, const LLUUID& uuid, U32 flags/* = 0x00*/) : -LLItemBridge(inventory, uuid) +LLLandmarkBridge::LLLandmarkBridge(LLInventoryPanel* inventory, + LLFolderView* root, + const LLUUID& uuid, + U32 flags/* = 0x00*/) : + LLItemBridge(inventory, root, uuid) { mVisited = FALSE; - if (flags & LLInventoryItem::II_FLAGS_LANDMARK_VISITED) + if (flags & LLInventoryItemFlags::II_FLAGS_LANDMARK_VISITED) { mVisited = TRUE; } @@ -3374,7 +3266,7 @@ LLItemBridge(inventory, uuid) LLUIImagePtr LLLandmarkBridge::getIcon() const { - return get_item_icon(LLAssetType::AT_LANDMARK, LLInventoryType::IT_LANDMARK, mVisited, FALSE); + return LLInventoryIcon::getIcon(LLAssetType::AT_LANDMARK, LLInventoryType::IT_LANDMARK, mVisited, FALSE); } void LLLandmarkBridge::buildContextMenu(LLMenuGL& menu, U32 flags) @@ -3389,6 +3281,11 @@ void LLLandmarkBridge::buildContextMenu(LLMenuGL& menu, U32 flags) } else { + items.push_back(std::string("Share")); + if (!canShare()) + { + disabled_items.push_back(std::string("Share")); + } items.push_back(std::string("Landmark Open")); items.push_back(std::string("Properties")); @@ -3424,7 +3321,7 @@ void teleport_via_landmark(const LLUUID& asset_id) } // virtual -void LLLandmarkBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) +void LLLandmarkBridge::performAction(LLInventoryModel* model, std::string action) { if ("teleport" == action) { @@ -3448,7 +3345,7 @@ void LLLandmarkBridge::performAction(LLFolderView* folder, LLInventoryModel* mod } else { - LLItemBridge::performAction(folder, model, action); + LLItemBridge::performAction(model, action); } } @@ -3475,35 +3372,33 @@ void LLLandmarkBridge::openItem() { LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); } -/* - LLViewerInventoryItem* item = getItem(); - if( item ) - { - // Opening (double-clicking) a landmark immediately teleports, - // but warns you the first time. - // open_landmark(item); - LLSD payload; - payload["asset_id"] = item->getAssetUUID(); - LLNotificationsUtil::add("TeleportFromLandmark", LLSD(), payload); - } -*/ } // +=================================================+ // | LLCallingCardObserver | // +=================================================+ -void LLCallingCardObserver::changed(U32 mask) +class LLCallingCardObserver : public LLFriendObserver { - mBridgep->refreshFolderViewItem(); -} +public: + LLCallingCardObserver(LLCallingCardBridge* bridge) : mBridgep(bridge) {} + virtual ~LLCallingCardObserver() { mBridgep = NULL; } + virtual void changed(U32 mask) + { + mBridgep->refreshFolderViewItem(); + } +protected: + LLCallingCardBridge* mBridgep; +}; // +=================================================+ // | LLCallingCardBridge | // +=================================================+ -LLCallingCardBridge::LLCallingCardBridge( LLInventoryPanel* inventory, const LLUUID& uuid ) : - LLItemBridge(inventory, uuid) +LLCallingCardBridge::LLCallingCardBridge(LLInventoryPanel* inventory, + LLFolderView* root, + const LLUUID& uuid ) : + LLItemBridge(inventory, root, uuid) { mObserver = new LLCallingCardObserver(this); LLAvatarTracker::instance().addObserver(mObserver); @@ -3526,7 +3421,7 @@ void LLCallingCardBridge::refreshFolderViewItem() } // virtual -void LLCallingCardBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) +void LLCallingCardBridge::performAction(LLInventoryModel* model, std::string action) { if ("begin_im" == action) { @@ -3552,7 +3447,7 @@ void LLCallingCardBridge::performAction(LLFolderView* folder, LLInventoryModel* LLAvatarActions::offerTeleport(item->getCreatorUUID()); } } - else LLItemBridge::performAction(folder, model, action); + else LLItemBridge::performAction(model, action); } LLUIImagePtr LLCallingCardBridge::getIcon() const @@ -3563,7 +3458,7 @@ LLUIImagePtr LLCallingCardBridge::getIcon() const { online = LLAvatarTracker::instance().isBuddyOnline(item->getCreatorUUID()); } - return get_item_icon(LLAssetType::AT_CALLINGCARD, LLInventoryType::IT_CALLINGCARD, online, FALSE); + return LLInventoryIcon::getIcon(LLAssetType::AT_CALLINGCARD, LLInventoryType::IT_CALLINGCARD, online, FALSE); } std::string LLCallingCardBridge::getLabelSuffix() const @@ -3588,11 +3483,11 @@ void LLCallingCardBridge::openItem() LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); } /* - LLViewerInventoryItem* item = getItem(); - if(item && !item->getCreatorUUID().isNull()) - { - LLAvatarActions::showProfile(item->getCreatorUUID()); - } + LLViewerInventoryItem* item = getItem(); + if(item && !item->getCreatorUUID().isNull()) + { + LLAvatarActions::showProfile(item->getCreatorUUID()); + } */ } @@ -3608,7 +3503,12 @@ void LLCallingCardBridge::buildContextMenu(LLMenuGL& menu, U32 flags) } else { - items.push_back(std::string("Open")); + items.push_back(std::string("Share")); + if (!canShare()) + { + disabled_items.push_back(std::string("Share")); + } + addOpenRightClickMenuOption(items); items.push_back(std::string("Properties")); getClipboardEntries(true, items, disabled_items, flags); @@ -3617,7 +3517,11 @@ void LLCallingCardBridge::buildContextMenu(LLMenuGL& menu, U32 flags) BOOL good_card = (item && (LLUUID::null != item->getCreatorUUID()) && (item->getCreatorUUID() != gAgent.getID())); - BOOL user_online = (LLAvatarTracker::instance().isBuddyOnline(item->getCreatorUUID())); + BOOL user_online = FALSE; + if (item) + { + user_online = (LLAvatarTracker::instance().isBuddyOnline(item->getCreatorUUID())); + } items.push_back(std::string("Send Instant Message Separator")); items.push_back(std::string("Send Instant Message")); items.push_back(std::string("Offer Teleport...")); @@ -3647,16 +3551,16 @@ BOOL LLCallingCardBridge::dragOrDrop(MASK mask, BOOL drop, // check the type switch(cargo_type) { - case DAD_TEXTURE: - case DAD_SOUND: - case DAD_LANDMARK: - case DAD_SCRIPT: - case DAD_CLOTHING: - case DAD_OBJECT: - case DAD_NOTECARD: - case DAD_BODYPART: - case DAD_ANIMATION: - case DAD_GESTURE: + case DAD_TEXTURE: + case DAD_SOUND: + case DAD_LANDMARK: + case DAD_SCRIPT: + case DAD_CLOTHING: + case DAD_OBJECT: + case DAD_NOTECARD: + case DAD_BODYPART: + case DAD_ANIMATION: + case DAD_GESTURE: { LLInventoryItem* inv_item = (LLInventoryItem*)cargo_data; const LLPermissions& perm = inv_item->getPermissions(); @@ -3666,7 +3570,7 @@ BOOL LLCallingCardBridge::dragOrDrop(MASK mask, BOOL drop, rv = TRUE; if(drop) { - LLToolDragAndDrop::giveInventory(item->getCreatorUUID(), + LLGiveInventory::doGiveInventoryItem(item->getCreatorUUID(), (LLInventoryItem*)cargo_data); } } @@ -3679,7 +3583,7 @@ BOOL LLCallingCardBridge::dragOrDrop(MASK mask, BOOL drop, } break; } - case DAD_CATEGORY: + case DAD_CATEGORY: { LLInventoryCategory* inv_cat = (LLInventoryCategory*)cargo_data; if( gInventory.getCategory( inv_cat->getUUID() ) ) @@ -3687,7 +3591,7 @@ BOOL LLCallingCardBridge::dragOrDrop(MASK mask, BOOL drop, rv = TRUE; if(drop) { - LLToolDragAndDrop::giveInventoryCategory( + LLGiveInventory::doGiveInventoryCategory( item->getCreatorUUID(), inv_cat); } @@ -3701,8 +3605,8 @@ BOOL LLCallingCardBridge::dragOrDrop(MASK mask, BOOL drop, } break; } - default: - break; + default: + break; } } return rv; @@ -3712,42 +3616,22 @@ BOOL LLCallingCardBridge::dragOrDrop(MASK mask, BOOL drop, // | LLNotecardBridge | // +=================================================+ -LLUIImagePtr LLNotecardBridge::getIcon() const -{ - return get_item_icon(LLAssetType::AT_NOTECARD, LLInventoryType::IT_NOTECARD, 0, FALSE); -} - void LLNotecardBridge::openItem() { LLViewerInventoryItem* item = getItem(); - if (item) { LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); } - -/* - LLViewerInventoryItem* item = getItem(); - if (item) - { - LLFloaterReg::showInstance("preview_notecard", LLSD(item->getUUID()), TAKE_FOCUS_YES); - } -*/ } - // +=================================================+ // | LLGestureBridge | // +=================================================+ -LLUIImagePtr LLGestureBridge::getIcon() const -{ - return get_item_icon(LLAssetType::AT_GESTURE, LLInventoryType::IT_GESTURE, 0, FALSE); -} - LLFontGL::StyleFlags LLGestureBridge::getLabelStyle() const { - if( LLGestureManager::instance().isGestureActive(mUUID) ) + if( LLGestureMgr::instance().isGestureActive(mUUID) ) { return LLFontGL::BOLD; } @@ -3759,9 +3643,11 @@ LLFontGL::StyleFlags LLGestureBridge::getLabelStyle() const std::string LLGestureBridge::getLabelSuffix() const { - if( LLGestureManager::instance().isGestureActive(mUUID) ) + if( LLGestureMgr::instance().isGestureActive(mUUID) ) { - return LLItemBridge::getLabelSuffix() + " (active)"; + LLStringUtil::format_map_t args; + args["[GESLABEL]"] = LLItemBridge::getLabelSuffix(); + return LLTrans::getString("ActiveGesture", args); } else { @@ -3770,11 +3656,11 @@ std::string LLGestureBridge::getLabelSuffix() const } // virtual -void LLGestureBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) +void LLGestureBridge::performAction(LLInventoryModel* model, std::string action) { if (isAddAction(action)) { - LLGestureManager::instance().activateGesture(mUUID); + LLGestureMgr::instance().activateGesture(mUUID); LLViewerInventoryItem* item = gInventory.getItem(mUUID); if (!item) return; @@ -3786,7 +3672,7 @@ void LLGestureBridge::performAction(LLFolderView* folder, LLInventoryModel* mode } else if (isRemoveAction(action)) { - LLGestureManager::instance().deactivateGesture(mUUID); + LLGestureMgr::instance().deactivateGesture(mUUID); LLViewerInventoryItem* item = gInventory.getItem(mUUID); if (!item) return; @@ -3798,20 +3684,25 @@ void LLGestureBridge::performAction(LLFolderView* folder, LLInventoryModel* mode } else if("play" == action) { - if(!LLGestureManager::instance().isGestureActive(mUUID)) + if(!LLGestureMgr::instance().isGestureActive(mUUID)) { // we need to inform server about gesture activating to be consistent with LLPreviewGesture and LLGestureComboList. BOOL inform_server = TRUE; BOOL deactivate_similar = FALSE; - LLGestureManager::instance().setGestureLoadedCallback(mUUID, boost::bind(&LLGestureBridge::playGesture, mUUID)); - LLGestureManager::instance().activateGestureWithAsset(mUUID, gInventory.getItem(mUUID)->getAssetUUID(), inform_server, deactivate_similar); + LLGestureMgr::instance().setGestureLoadedCallback(mUUID, boost::bind(&LLGestureBridge::playGesture, mUUID)); + LLViewerInventoryItem* item = gInventory.getItem(mUUID); + llassert(item); + if (item) + { + LLGestureMgr::instance().activateGestureWithAsset(mUUID, item->getAssetUUID(), inform_server, deactivate_similar); + } } else { playGesture(mUUID); } } - else LLItemBridge::performAction(folder, model, action); + else LLItemBridge::performAction(model, action); } void LLGestureBridge::openItem() @@ -3823,12 +3714,12 @@ void LLGestureBridge::openItem() LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); } /* - LLViewerInventoryItem* item = getItem(); - if (item) - { - LLPreviewGesture* preview = LLPreviewGesture::show(mUUID, LLUUID::null); - preview->setFocus(TRUE); - } + LLViewerInventoryItem* item = getItem(); + if (item) + { + LLPreviewGesture* preview = LLPreviewGesture::show(mUUID, LLUUID::null); + preview->setFocus(TRUE); + } */ } @@ -3845,7 +3736,7 @@ BOOL LLGestureBridge::removeItem() // This will also force close the preview window, if it exists. // This may actually delete *this, if mUUID is in the COF. - LLGestureManager::instance().deactivateGesture(item_id); + LLGestureMgr::instance().deactivateGesture(item_id); // If deactivateGesture deleted *this, then return out immediately. if (!model->getObject(item_id)) @@ -3867,18 +3758,23 @@ void LLGestureBridge::buildContextMenu(LLMenuGL& menu, U32 flags) } else { + items.push_back(std::string("Share")); + if (!canShare()) + { + disabled_items.push_back(std::string("Share")); + } bool is_sidepanel = isInOutfitsSidePanel(); if (!is_sidepanel) { - items.push_back(std::string("Open")); + addOpenRightClickMenuOption(items); items.push_back(std::string("Properties")); } getClipboardEntries(true, items, disabled_items, flags); items.push_back(std::string("Gesture Separator")); - if (LLGestureManager::instance().isGestureActive(getUUID())) + if (LLGestureMgr::instance().isGestureActive(getUUID())) { items.push_back(std::string("Deactivate")); } @@ -3893,13 +3789,13 @@ void LLGestureBridge::buildContextMenu(LLMenuGL& menu, U32 flags) // static void LLGestureBridge::playGesture(const LLUUID& item_id) { - if (LLGestureManager::instance().isGesturePlaying(item_id)) + if (LLGestureMgr::instance().isGesturePlaying(item_id)) { - LLGestureManager::instance().stopGesture(item_id); + LLGestureMgr::instance().stopGesture(item_id); } else { - LLGestureManager::instance().playGesture(item_id); + LLGestureMgr::instance().playGesture(item_id); } } @@ -3908,11 +3804,6 @@ void LLGestureBridge::playGesture(const LLUUID& item_id) // | LLAnimationBridge | // +=================================================+ -LLUIImagePtr LLAnimationBridge::getIcon() const -{ - return get_item_icon(LLAssetType::AT_ANIMATION, LLInventoryType::IT_ANIMATION, 0, FALSE); -} - void LLAnimationBridge::buildContextMenu(LLMenuGL& menu, U32 flags) { menuentry_vec_t items; @@ -3925,6 +3816,11 @@ void LLAnimationBridge::buildContextMenu(LLMenuGL& menu, U32 flags) } else { + items.push_back(std::string("Share")); + if (!canShare()) + { + disabled_items.push_back(std::string("Share")); + } items.push_back(std::string("Animation Open")); items.push_back(std::string("Properties")); @@ -3940,7 +3836,7 @@ void LLAnimationBridge::buildContextMenu(LLMenuGL& menu, U32 flags) } // virtual -void LLAnimationBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) +void LLAnimationBridge::performAction(LLInventoryModel* model, std::string action) { if ((action == "playworld") || (action == "playlocal")) { @@ -3959,7 +3855,7 @@ void LLAnimationBridge::performAction(LLFolderView* folder, LLInventoryModel* mo } else { - LLItemBridge::performAction(folder, model, action); + LLItemBridge::performAction(model, action); } } @@ -3972,11 +3868,11 @@ void LLAnimationBridge::openItem() LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); } /* - LLViewerInventoryItem* item = getItem(); - if (item) - { - LLFloaterReg::showInstance("preview_anim", LLSD(mUUID), TAKE_FOCUS_YES); - } + LLViewerInventoryItem* item = getItem(); + if (item) + { + LLFloaterReg::showInstance("preview_anim", LLSD(mUUID), TAKE_FOCUS_YES); + } */ } @@ -3987,17 +3883,21 @@ void LLAnimationBridge::openItem() // static LLUUID LLObjectBridge::sContextMenuItemID; -LLObjectBridge::LLObjectBridge(LLInventoryPanel* inventory, const LLUUID& uuid, LLInventoryType::EType type, U32 flags) : -LLItemBridge(inventory, uuid), mInvType(type) +LLObjectBridge::LLObjectBridge(LLInventoryPanel* inventory, + LLFolderView* root, + const LLUUID& uuid, + LLInventoryType::EType type, + U32 flags) : + LLItemBridge(inventory, root, uuid) { mAttachPt = (flags & 0xff); // low bye of inventory flags - - mIsMultiObject = ( flags & LLInventoryItem::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS ) ? TRUE: FALSE; + mIsMultiObject = ( flags & LLInventoryItemFlags::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS ) ? TRUE: FALSE; + mInvType = type; } LLUIImagePtr LLObjectBridge::getIcon() const { - return get_item_icon(LLAssetType::AT_OBJECT, mInvType, mAttachPt, mIsMultiObject ); + return LLInventoryIcon::getIcon(LLAssetType::AT_OBJECT, mInvType, mAttachPt, mIsMultiObject); } LLInventoryObject* LLObjectBridge::getObject() const @@ -4012,7 +3912,7 @@ LLInventoryObject* LLObjectBridge::getObject() const } // virtual -void LLObjectBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) +void LLObjectBridge::performAction(LLInventoryModel* model, std::string action) { if (isAddAction(action)) { @@ -4023,7 +3923,7 @@ void LLObjectBridge::performAction(LLFolderView* folder, LLInventoryModel* model { rez_attachment(item, NULL); } - else if(item && item->isComplete()) + else if(item && item->isFinished()) { // must be in library. copy it to our inventory and put it on. LLPointer<LLInventoryCallback> cb = new RezAttachmentCallback(0); @@ -4047,64 +3947,34 @@ void LLObjectBridge::performAction(LLFolderView* folder, LLInventoryModel* model gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); gMessageSystem->addUUIDFast(_PREHASH_ItemID, item->getLinkedUUID()); gMessageSystem->sendReliable( gAgent.getRegion()->getHost()); - } - // this object might have been selected, so let the selection manager know it's gone now - LLViewerObject *found_obj = gObjectList.findObject(item->getLinkedUUID()); - if (found_obj) - { - LLSelectMgr::getInstance()->remove(found_obj); + + // this object might have been selected, so let the selection manager know it's gone now + LLViewerObject *found_obj = gObjectList.findObject(item->getLinkedUUID()); + if (found_obj) + { + LLSelectMgr::getInstance()->remove(found_obj); + } } } - else LLItemBridge::performAction(folder, model, action); + else LLItemBridge::performAction(model, action); } void LLObjectBridge::openItem() { - LLViewerInventoryItem* item = getItem(); - - if (item) - { - LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); - } - - LLSD key; - key["id"] = mUUID; - LLSideTray::getInstance()->showPanel("sidepanel_inventory", key); - - // Disable old properties floater; this is replaced by the sidepanel. - /* - LLFloaterReg::showInstance("properties", mUUID); - */ -} - -LLFontGL::StyleFlags LLObjectBridge::getLabelStyle() const -{ - U8 font = LLFontGL::NORMAL; - - if(get_is_item_worn( mUUID ) ) - { - font |= LLFontGL::BOLD; - } - - LLInventoryItem* item = getItem(); - if (item && item->getIsLinkType()) - { - font |= LLFontGL::ITALIC; - } - - return (LLFontGL::StyleFlags)font; + // object double-click action is to wear/unwear object + performAction(getInventoryModel(), + get_is_item_worn(mUUID) ? "detach" : "attach"); } std::string LLObjectBridge::getLabelSuffix() const { if (get_is_item_worn(mUUID)) { - LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); - std::string attachment_point_name = avatar->getAttachedPointName(mUUID); + std::string attachment_point_name = gAgentAvatarp->getAttachedPointName(mUUID); // e.g. "(worn on ...)" / "(attached to ...)" LLStringUtil::format_map_t args; - args["[ATTACHMENT_POINT]"] = attachment_point_name.c_str(); + args["[ATTACHMENT_POINT]"] = LLTrans::getString(attachment_point_name); return LLItemBridge::getLabelSuffix() + LLTrans::getString("WornOnAttachmentPoint", args); } else @@ -4119,10 +3989,10 @@ void rez_attachment(LLViewerInventoryItem* item, LLViewerJointAttachment* attach payload["item_id"] = item->getLinkedUUID(); // Wear the base object in case this is a link. S32 attach_pt = 0; - if (gAgent.getAvatarObject() && attachment) + if (isAgentAvatarValid() && attachment) { - for (LLVOAvatar::attachment_map_t::iterator iter = gAgent.getAvatarObject()->mAttachmentPoints.begin(); - iter != gAgent.getAvatarObject()->mAttachmentPoints.end(); ++iter) + for (LLVOAvatar::attachment_map_t::iterator iter = gAgentAvatarp->mAttachmentPoints.begin(); + iter != gAgentAvatarp->mAttachmentPoints.end(); ++iter) { if (iter->second == attachment) { @@ -4148,9 +4018,7 @@ void rez_attachment(LLViewerInventoryItem* item, LLViewerJointAttachment* attach bool confirm_replace_attachment_rez(const LLSD& notification, const LLSD& response) { - LLVOAvatar *avatarp = gAgent.getAvatarObject(); - - if (!avatarp->canAttachMoreObjects()) + if (!gAgentAvatarp->canAttachMoreObjects()) { LLSD args; args["MAX_ATTACHMENTS"] = llformat("%d", MAX_AGENT_ATTACHMENTS); @@ -4198,6 +4066,11 @@ void LLObjectBridge::buildContextMenu(LLMenuGL& menu, U32 flags) } else { + items.push_back(std::string("Share")); + if (!canShare()) + { + disabled_items.push_back(std::string("Share")); + } bool is_sidepanel = isInOutfitsSidePanel(); if (!is_sidepanel) @@ -4212,18 +4085,14 @@ void LLObjectBridge::buildContextMenu(LLMenuGL& menu, U32 flags) LLInventoryItem *item = getItem(); if(item) { - LLVOAvatarSelf* avatarp = gAgent.getAvatarObject(); - if( !avatarp ) - { - return; - } + if (!isAgentAvatarValid()) return; if( get_is_item_worn( mUUID ) ) { items.push_back(std::string("Attach Separator")); items.push_back(std::string("Detach From Yourself")); } - else if (!isItemInTrash() && !isLinkedObjectInTrash() && !isLinkedObjectMissing()) + else if (!isItemInTrash() && !isLinkedObjectInTrash() && !isLinkedObjectMissing() && !isCOFFolder()) { items.push_back(std::string("Attach Separator")); items.push_back(std::string("Object Wear")); @@ -4232,7 +4101,7 @@ void LLObjectBridge::buildContextMenu(LLMenuGL& menu, U32 flags) // commented out for DEV-32347 //items.push_back(std::string("Restore to Last Position")); - if (!avatarp->canAttachMoreObjects()) + if (!gAgentAvatarp->canAttachMoreObjects()) { disabled_items.push_back(std::string("Object Wear")); disabled_items.push_back(std::string("Attach To")); @@ -4240,15 +4109,14 @@ void LLObjectBridge::buildContextMenu(LLMenuGL& menu, U32 flags) } LLMenuGL* attach_menu = menu.findChildMenuByName("Attach To", TRUE); LLMenuGL* attach_hud_menu = menu.findChildMenuByName("Attach To HUD", TRUE); - LLVOAvatar *avatarp = gAgent.getAvatarObject(); if (attach_menu && (attach_menu->getChildCount() == 0) && attach_hud_menu && (attach_hud_menu->getChildCount() == 0) - && avatarp) + && isAgentAvatarValid()) { - for (LLVOAvatar::attachment_map_t::iterator iter = avatarp->mAttachmentPoints.begin(); - iter != avatarp->mAttachmentPoints.end(); ) + for (LLVOAvatar::attachment_map_t::iterator iter = gAgentAvatarp->mAttachmentPoints.begin(); + iter != gAgentAvatarp->mAttachmentPoints.end(); ) { LLVOAvatar::attachment_map_t::iterator curiter = iter++; LLViewerJointAttachment* attachment = curiter->second; @@ -4298,11 +4166,10 @@ BOOL LLObjectBridge::renameItem(const std::string& new_name) model->notifyObservers(); - LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); - if( avatar ) + if (isAgentAvatarValid()) { - LLViewerObject* obj = avatar->getWornAttachment( item->getUUID() ); - if( obj ) + LLViewerObject* obj = gAgentAvatarp->getWornAttachment( item->getUUID() ); + if(obj) { LLSelectMgr::getInstance()->deselectAll(); LLSelectMgr::getInstance()->addAsIndividual( obj, SELECT_ALL_TES, FALSE ); @@ -4320,11 +4187,6 @@ BOOL LLObjectBridge::renameItem(const std::string& new_name) // | LLLSLTextBridge | // +=================================================+ -LLUIImagePtr LLLSLTextBridge::getIcon() const -{ - return get_item_icon(LLAssetType::AT_SCRIPT, LLInventoryType::IT_LSL, 0, FALSE); -} - void LLLSLTextBridge::openItem() { LLViewerInventoryItem* item = getItem(); @@ -4333,44 +4195,23 @@ void LLLSLTextBridge::openItem() { LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); } - /* - LLViewerInventoryItem* item = getItem(); - if (item) - { - LLFloaterReg::showInstance("preview_script", LLSD(mUUID), TAKE_FOCUS_YES); - } - */ } // +=================================================+ // | LLWearableBridge | // +=================================================+ -// *NOTE: hack to get from avatar inventory to avatar -void wear_inventory_item_on_avatar( LLInventoryItem* item ) +LLWearableBridge::LLWearableBridge(LLInventoryPanel* inventory, + LLFolderView* root, + const LLUUID& uuid, + LLAssetType::EType asset_type, + LLInventoryType::EType inv_type, + LLWearableType::EType wearable_type) : + LLItemBridge(inventory, root, uuid), + mAssetType( asset_type ), + mWearableType(wearable_type) { - if(item) - { - lldebugs << "wear_inventory_item_on_avatar( " << item->getName() - << " )" << llendl; - - LLAppearanceManager::instance().addCOFItemLink(item); - } -} - -void wear_add_inventory_item_on_avatar( LLInventoryItem* item ) -{ - if(item) - { - lldebugs << "wear_add_inventory_item_on_avatar( " << item->getName() - << " )" << llendl; - - LLWearableList::instance().getAsset(item->getAssetUUID(), - item->getName(), - item->getType(), - LLWearableBridge::onWearAddOnAvatarArrived, - new LLUUID(item->getUUID())); - } + mInvType = inv_type; } void remove_inventory_category_from_avatar( LLInventoryCategory* category ) @@ -4380,15 +4221,13 @@ void remove_inventory_category_from_avatar( LLInventoryCategory* category ) << " )" << llendl; - if( gFloaterCustomize ) - { - gFloaterCustomize->askToSaveIfDirty( - boost::bind(remove_inventory_category_from_avatar_step2, _1, category->getUUID())); - } - else + if (gAgentCamera.cameraCustomizeAvatar()) { - remove_inventory_category_from_avatar_step2(TRUE, category->getUUID() ); + // switching to outfit editor should automagically save any currently edited wearable + LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD().with("type", "edit_outfit")); } + + remove_inventory_category_from_avatar_step2(TRUE, category->getUUID() ); } struct OnRemoveStruct @@ -4447,7 +4286,7 @@ void remove_inventory_category_from_avatar_step2( BOOL proceed, LLUUID category_ if (item->getType() == LLAssetType::AT_BODYPART) continue; if (gAgent.isTeen() && item->isWearableType() && - (item->getWearableType() == WT_UNDERPANTS || item->getWearableType() == WT_UNDERSHIRT)) + (item->getWearableType() == LLWearableType::WT_UNDERPANTS || item->getWearableType() == LLWearableType::WT_UNDERSHIRT)) continue; if (get_is_item_worn(item->getUUID())) { @@ -4491,7 +4330,7 @@ void remove_inventory_category_from_avatar_step2( BOOL proceed, LLUUID category_ LLViewerInventoryItem *gest_item = gest_item_array.get(i); if (get_is_item_worn(gest_item->getUUID())) { - LLGestureManager::instance().deactivateGesture( gest_item->getLinkedUUID() ); + LLGestureMgr::instance().deactivateGesture( gest_item->getLinkedUUID() ); gInventory.updateItem( gest_item ); gInventory.notifyObservers(); } @@ -4525,11 +4364,11 @@ std::string LLWearableBridge::getLabelSuffix() const LLUIImagePtr LLWearableBridge::getIcon() const { - return get_item_icon(mAssetType, mInvType, mWearableType, FALSE); + return LLInventoryIcon::getIcon(mAssetType, mInvType, mWearableType, FALSE); } // virtual -void LLWearableBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) +void LLWearableBridge::performAction(LLInventoryModel* model, std::string action) { if (isAddAction(action)) { @@ -4549,7 +4388,7 @@ void LLWearableBridge::performAction(LLFolderView* folder, LLInventoryModel* mod removeFromAvatar(); return; } - else LLItemBridge::performAction(folder, model, action); + else LLItemBridge::performAction(model, action); } void LLWearableBridge::openItem() @@ -4560,42 +4399,6 @@ void LLWearableBridge::openItem() { LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); } - /* - if( isItemInTrash() ) - { - LLNotificationsUtil::add("CannotWearTrash"); - } - else if(isAgentInventory()) - { - if( !get_is_item_worn( mUUID ) ) - { - wearOnAvatar(); - } - } - else - { - // must be in the inventory library. copy it to our inventory - // and put it on right away. - LLViewerInventoryItem* item = getItem(); - if(item && item->isComplete()) - { - LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback(); - copy_inventory_item( - gAgent.getID(), - item->getPermissions().getOwner(), - item->getUUID(), - LLUUID::null, - std::string(), - cb); - } - else if(item) - { - // *TODO: We should fetch the item details, and then do - // the operation above. - LLNotificationsUtil::add("CannotWearInfoNotComplete"); - } - } - */ } void LLWearableBridge::buildContextMenu(LLMenuGL& menu, U32 flags) @@ -4623,11 +4426,16 @@ void LLWearableBridge::buildContextMenu(LLMenuGL& menu, U32 flags) can_open = FALSE; } + items.push_back(std::string("Share")); + if (!canShare()) + { + disabled_items.push_back(std::string("Share")); + } bool is_sidepanel = isInOutfitsSidePanel(); if (can_open && !is_sidepanel) { - items.push_back(std::string("Open")); + addOpenRightClickMenuOption(items); } if (!is_sidepanel) @@ -4649,7 +4457,7 @@ void LLWearableBridge::buildContextMenu(LLMenuGL& menu, U32 flags) disabled_items.push_back(std::string("Wearable Edit")); } // Don't allow items to be worn if their baseobj is in the trash. - if (isLinkedObjectInTrash() || isLinkedObjectMissing()) + if (isLinkedObjectInTrash() || isLinkedObjectMissing() || isCOFFolder()) { disabled_items.push_back(std::string("Wearable Wear")); disabled_items.push_back(std::string("Wearable Add")); @@ -4675,6 +4483,7 @@ void LLWearableBridge::buildContextMenu(LLMenuGL& menu, U32 flags) items.push_back(std::string("Wearable Wear")); items.push_back(std::string("Wearable Add")); disabled_items.push_back(std::string("Take Off")); + disabled_items.push_back(std::string("Wearable Edit")); } break; default: @@ -4694,7 +4503,7 @@ BOOL LLWearableBridge::canWearOnAvatar(void* user_data) if(!self->isAgentInventory()) { LLViewerInventoryItem* item = (LLViewerInventoryItem*)self->getItem(); - if(!item || !item->isComplete()) return FALSE; + if(!item || !item->isFinished()) return FALSE; } return (!get_is_item_worn(self->mUUID)); } @@ -4721,21 +4530,7 @@ void LLWearableBridge::wearOnAvatar() LLViewerInventoryItem* item = getItem(); if(item) { - if(!isAgentInventory()) - { - LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback(); - copy_inventory_item( - gAgent.getID(), - item->getPermissions().getOwner(), - item->getUUID(), - LLUUID::null, - std::string(), - cb); - } - else - { - wear_inventory_item_on_avatar(item); - } + LLAppearanceMgr::instance().wearItemOnAvatar(item->getUUID(), true, true); } } @@ -4752,21 +4547,7 @@ void LLWearableBridge::wearAddOnAvatar() LLViewerInventoryItem* item = getItem(); if(item) { - if(!isAgentInventory()) - { - LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback(); - copy_inventory_item( - gAgent.getID(), - item->getPermissions().getOwner(), - item->getUUID(), - LLUUID::null, - std::string(), - cb); - } - else - { - wear_add_inventory_item_on_avatar(item); - } + LLAppearanceMgr::instance().wearItemOnAvatar(item->getUUID(), true, false); } } @@ -4843,20 +4624,7 @@ void LLWearableBridge::onEditOnAvatar(void* user_data) void LLWearableBridge::editOnAvatar() { - LLUUID linked_id = gInventory.getLinkedItemID(mUUID); - const LLWearable* wearable = gAgentWearables.getWearableFromItemID(linked_id); - if( wearable ) - { - // Set the tab to the right wearable. - if (gFloaterCustomize) - gFloaterCustomize->setCurrentWearableType( wearable->getType() ); - - if( CAMERA_MODE_CUSTOMIZE_AVATAR != gAgent.getCameraMode() ) - { - // Start Avatar Customization - gAgent.changeCameraToCustomizeAvatar(); - } - } + LLAgentWearables::editWearable(mUUID); } // static @@ -4900,71 +4668,47 @@ void LLWearableBridge::onRemoveFromAvatarArrived(LLWearable* wearable, { if( get_is_item_worn( item_id ) ) { - EWearableType type = wearable->getType(); + LLWearableType::EType type = wearable->getType(); - if( !(type==WT_SHAPE || type==WT_SKIN || type==WT_HAIR || type==WT_EYES ) ) //&& - //!((!gAgent.isTeen()) && ( type==WT_UNDERPANTS || type==WT_UNDERSHIRT )) ) + if( !(type==LLWearableType::WT_SHAPE || type==LLWearableType::WT_SKIN || type==LLWearableType::WT_HAIR || type==LLWearableType::WT_EYES ) ) //&& + //!((!gAgent.isTeen()) && ( type==LLWearableType::WT_UNDERPANTS || type==LLWearableType::WT_UNDERSHIRT )) ) { - // MULTI_WEARABLE: FIXME HACK - always remove all bool do_remove_all = false; - gAgentWearables.removeWearable( type, do_remove_all, 0 ); + U32 index = gAgentWearables.getWearableIndex(wearable); + gAgentWearables.removeWearable( type, do_remove_all, index ); } } } // Find and remove this item from the COF. - // FIXME 2.1 - call removeCOFItemLinks in llappearancemgr instead. - LLInventoryModel::item_array_t items = gInventory.collectLinkedItems(item_id, LLAppearanceManager::instance().getCOF()); - if (items.size() != 1) - { - llwarns << "Found " << items.size() << " COF links to " << item_id.asString() << ", expected 1" << llendl; - } - for (LLInventoryModel::item_array_t::const_iterator iter = items.begin(); - iter != items.end(); - ++iter) - { - const LLViewerInventoryItem *linked_item = (*iter); - const LLUUID &item_id = linked_item->getUUID(); - gInventory.purgeObject(item_id); - } + LLAppearanceMgr::instance().removeCOFItemLinks(item_id,false); gInventory.notifyObservers(); delete on_remove_struct; } -/* static */ +// static void LLWearableBridge::removeAllClothesFromAvatar() { // Remove COF links. - for (S32 itype = WT_SHAPE; itype < WT_COUNT; ++itype) + for (S32 itype = LLWearableType::WT_SHAPE; itype < LLWearableType::WT_COUNT; ++itype) { - if (itype == WT_SHAPE || itype == WT_SKIN || itype == WT_HAIR || itype == WT_EYES) - continue; - - // MULTI-WEARABLES: fixed to index 0 - LLViewerInventoryItem *item = dynamic_cast<LLViewerInventoryItem*>( - gAgentWearables.getWearableInventoryItem((EWearableType)itype, 0)); - if (!item) - continue; - const LLUUID &item_id = gInventory.getLinkedItemID(item->getUUID()); - const LLWearable *wearable = gAgentWearables.getWearableFromItemID(item_id); - if (!wearable) + if (itype == LLWearableType::WT_SHAPE || itype == LLWearableType::WT_SKIN || itype == LLWearableType::WT_HAIR || itype == LLWearableType::WT_EYES) continue; - // Find and remove this item from the COF. - LLInventoryModel::item_array_t items = gInventory.collectLinkedItems( - item_id, LLAppearanceManager::instance().getCOF()); - if (items.size() != 1) - { - llwarns << "Found " << items.size() << " COF links to " << item_id.asString() << ", expected 1" << llendl; - } - for (LLInventoryModel::item_array_t::const_iterator iter = items.begin(); - iter != items.end(); - ++iter) + for (S32 index = gAgentWearables.getWearableCount(itype)-1; index >= 0 ; --index) { - const LLViewerInventoryItem *linked_item = (*iter); - const LLUUID &item_id = linked_item->getUUID(); - gInventory.purgeObject(item_id); + LLViewerInventoryItem *item = dynamic_cast<LLViewerInventoryItem*>( + gAgentWearables.getWearableInventoryItem((LLWearableType::EType)itype, index)); + if (!item) + continue; + const LLUUID &item_id = item->getUUID(); + const LLWearable *wearable = gAgentWearables.getWearableFromItemID(item_id); + if (!wearable) + continue; + + // Find and remove this item from the COF. + LLAppearanceMgr::instance().removeCOFItemLinks(item_id,false); } } gInventory.notifyObservers(); @@ -4973,7 +4717,7 @@ void LLWearableBridge::removeAllClothesFromAvatar() LLAgentWearables::userRemoveAllClothes(); } -/* static */ +// static void LLWearableBridge::removeItemFromAvatar(LLViewerInventoryItem *item) { if (item) @@ -4995,65 +4739,131 @@ void LLWearableBridge::removeFromAvatar() } } -LLInvFVBridgeAction* LLInvFVBridgeAction::createAction(LLAssetType::EType asset_type, - const LLUUID& uuid,LLInventoryModel* model) -{ - LLInvFVBridgeAction* action = NULL; - switch(asset_type) - { - case LLAssetType::AT_TEXTURE: - action = new LLTextureBridgeAction(uuid,model); - break; - - case LLAssetType::AT_SOUND: - action = new LLSoundBridgeAction(uuid,model); - break; - - case LLAssetType::AT_LANDMARK: - action = new LLLandmarkBridgeAction(uuid,model); - break; - - case LLAssetType::AT_CALLINGCARD: - action = new LLCallingCardBridgeAction(uuid,model); - break; - - case LLAssetType::AT_OBJECT: - action = new LLObjectBridgeAction(uuid,model); - break; - - case LLAssetType::AT_NOTECARD: - action = new LLNotecardBridgeAction(uuid,model); - break; +// +=================================================+ +// | LLLinkItemBridge | +// +=================================================+ +// For broken item links - case LLAssetType::AT_ANIMATION: - action = new LLAnimationBridgeAction(uuid,model); - break; +std::string LLLinkItemBridge::sPrefix("Link: "); - case LLAssetType::AT_GESTURE: - action = new LLGestureBridgeAction(uuid,model); - break; +void LLLinkItemBridge::buildContextMenu(LLMenuGL& menu, U32 flags) +{ + // *TODO: Translate + lldebugs << "LLLink::buildContextMenu()" << llendl; + menuentry_vec_t items; + menuentry_vec_t disabled_items; - case LLAssetType::AT_LSL_TEXT: - action = new LLLSLTextBridgeAction(uuid,model); - break; + items.push_back(std::string("Find Original")); + disabled_items.push_back(std::string("Find Original")); + + if(isItemInTrash()) + { + addTrashContextMenuOptions(items, disabled_items); + } + else + { + items.push_back(std::string("Properties")); + addDeleteContextMenuOptions(items, disabled_items); + } + hide_context_entries(menu, items, disabled_items); +} - case LLAssetType::AT_CLOTHING: - case LLAssetType::AT_BODYPART: - action = new LLWearableBridgeAction(uuid,model); +// +=================================================+ +// | LLLinkBridge | +// +=================================================+ +// For broken folder links. +std::string LLLinkFolderBridge::sPrefix("Link: "); +LLUIImagePtr LLLinkFolderBridge::getIcon() const +{ + LLFolderType::EType folder_type = LLFolderType::FT_NONE; + const LLInventoryObject *obj = getInventoryObject(); + if (obj) + { + LLViewerInventoryCategory* cat = NULL; + LLInventoryModel* model = getInventoryModel(); + if(model) + { + cat = (LLViewerInventoryCategory*)model->getCategory(obj->getLinkedUUID()); + if (cat) + { + folder_type = cat->getPreferredType(); + } + } + } + return LLFolderBridge::getIcon(folder_type); +} - break; +void LLLinkFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags) +{ + // *TODO: Translate + lldebugs << "LLLink::buildContextMenu()" << llendl; + menuentry_vec_t items; + menuentry_vec_t disabled_items; - default: - break; + if (isItemInTrash()) + { + addTrashContextMenuOptions(items, disabled_items); } - return action; + else + { + items.push_back(std::string("Find Original")); + addDeleteContextMenuOptions(items, disabled_items); + } + hide_context_entries(menu, items, disabled_items); +} +void LLLinkFolderBridge::performAction(LLInventoryModel* model, std::string action) +{ + if ("goto" == action) + { + gotoItem(); + return; + } + LLItemBridge::performAction(model,action); } +void LLLinkFolderBridge::gotoItem() +{ + const LLUUID &cat_uuid = getFolderID(); + if (!cat_uuid.isNull()) + { + if (LLFolderViewItem *base_folder = mRoot->getItemByID(cat_uuid)) + { + if (LLInventoryModel* model = getInventoryModel()) + { + model->fetchDescendentsOf(cat_uuid); + } + base_folder->setOpen(TRUE); + mRoot->setSelectionFromRoot(base_folder,TRUE); + mRoot->scrollToShowSelection(); + } + } +} +const LLUUID &LLLinkFolderBridge::getFolderID() const +{ + if (LLViewerInventoryItem *link_item = getItem()) + { + if (const LLViewerInventoryCategory *cat = link_item->getLinkedCategory()) + { + const LLUUID& cat_uuid = cat->getUUID(); + return cat_uuid; + } + } + return LLUUID::null; +} + +/******************************************************************************** + ** + ** BRIDGE ACTIONS + **/ -//static +// static void LLInvFVBridgeAction::doAction(LLAssetType::EType asset_type, - const LLUUID& uuid,LLInventoryModel* model) + const LLUUID& uuid, + LLInventoryModel* model) { - LLInvFVBridgeAction* action = createAction(asset_type,uuid,model); + // Perform indirection in case of link. + const LLUUID& linked_uuid = gInventory.getLinkedItemID(uuid); + + LLInvFVBridgeAction* action = createAction(asset_type,linked_uuid,model); if(action) { action->doIt(); @@ -5061,143 +4871,218 @@ void LLInvFVBridgeAction::doAction(LLAssetType::EType asset_type, } } -//static +// static void LLInvFVBridgeAction::doAction(const LLUUID& uuid, LLInventoryModel* model) { - LLAssetType::EType asset_type = model->getItem(uuid)->getType(); - LLInvFVBridgeAction* action = createAction(asset_type,uuid,model); - if(action) + llassert(model); + LLViewerInventoryItem* item = model->getItem(uuid); + llassert(item); + if (item) { - action->doIt(); - delete action; + LLAssetType::EType asset_type = item->getType(); + LLInvFVBridgeAction* action = createAction(asset_type,uuid,model); + if(action) + { + action->doIt(); + delete action; + } } } LLViewerInventoryItem* LLInvFVBridgeAction::getItem() const { - if(mModel) + if (mModel) return (LLViewerInventoryItem*)mModel->getItem(mUUID); return NULL; } -//virtual -void LLTextureBridgeAction::doIt() +class LLTextureBridgeAction: public LLInvFVBridgeAction { - if (getItem()) + friend class LLInvFVBridgeAction; +public: + virtual void doIt() { - LLFloaterReg::showInstance("preview_texture", LLSD(mUUID), TAKE_FOCUS_YES); + if (getItem()) + { + LLFloaterReg::showInstance("preview_texture", LLSD(mUUID), TAKE_FOCUS_YES); + } + LLInvFVBridgeAction::doIt(); } + virtual ~LLTextureBridgeAction(){} +protected: + LLTextureBridgeAction(const LLUUID& id,LLInventoryModel* model) : LLInvFVBridgeAction(id,model) {} +}; - LLInvFVBridgeAction::doIt(); -} - -//virtual -void LLSoundBridgeAction::doIt() +class LLSoundBridgeAction: public LLInvFVBridgeAction { - LLViewerInventoryItem* item = getItem(); - if(item) + friend class LLInvFVBridgeAction; +public: + virtual void doIt() { - LLFloaterReg::showInstance("preview_sound", LLSD(mUUID), TAKE_FOCUS_YES); + LLViewerInventoryItem* item = getItem(); + if (item) + { + LLFloaterReg::showInstance("preview_sound", LLSD(mUUID), TAKE_FOCUS_YES); + } + LLInvFVBridgeAction::doIt(); } + virtual ~LLSoundBridgeAction(){} +protected: + LLSoundBridgeAction(const LLUUID& id,LLInventoryModel* model) : LLInvFVBridgeAction(id,model) {} +}; - LLInvFVBridgeAction::doIt(); -} - - -//virtual -void LLLandmarkBridgeAction::doIt() +class LLLandmarkBridgeAction: public LLInvFVBridgeAction { - LLViewerInventoryItem* item = getItem(); - if( item ) + friend class LLInvFVBridgeAction; +public: + virtual void doIt() { - // Opening (double-clicking) a landmark immediately teleports, - // but warns you the first time. - LLSD payload; - payload["asset_id"] = item->getAssetUUID(); - - LLSD args; - args["LOCATION"] = item->getName(); - - LLNotificationsUtil::add("TeleportFromLandmark", args, payload); + LLViewerInventoryItem* item = getItem(); + if (item) + { + // Opening (double-clicking) a landmark immediately teleports, + // but warns you the first time. + LLSD payload; + payload["asset_id"] = item->getAssetUUID(); + + LLSD args; + args["LOCATION"] = item->getName(); + + LLNotificationsUtil::add("TeleportFromLandmark", args, payload); + } + LLInvFVBridgeAction::doIt(); } + virtual ~LLLandmarkBridgeAction(){} +protected: + LLLandmarkBridgeAction(const LLUUID& id,LLInventoryModel* model) : LLInvFVBridgeAction(id,model) {} +}; - LLInvFVBridgeAction::doIt(); -} - - -//virtual -void LLCallingCardBridgeAction::doIt() +class LLCallingCardBridgeAction: public LLInvFVBridgeAction { - LLViewerInventoryItem* item = getItem(); - if(item && item->getCreatorUUID().notNull()) + friend class LLInvFVBridgeAction; +public: + virtual void doIt() { - LLAvatarActions::showProfile(item->getCreatorUUID()); + LLViewerInventoryItem* item = getItem(); + if (item && item->getCreatorUUID().notNull()) + { + LLAvatarActions::showProfile(item->getCreatorUUID()); + } + LLInvFVBridgeAction::doIt(); } + virtual ~LLCallingCardBridgeAction(){} +protected: + LLCallingCardBridgeAction(const LLUUID& id,LLInventoryModel* model) : LLInvFVBridgeAction(id,model) {} - LLInvFVBridgeAction::doIt(); -} +}; -//virtual -void -LLNotecardBridgeAction::doIt() +class LLNotecardBridgeAction +: public LLInvFVBridgeAction { - LLViewerInventoryItem* item = getItem(); - if (item) + friend class LLInvFVBridgeAction; +public: + virtual void doIt() { - LLFloaterReg::showInstance("preview_notecard", LLSD(item->getUUID()), TAKE_FOCUS_YES); + LLViewerInventoryItem* item = getItem(); + if (item) + { + LLFloaterReg::showInstance("preview_notecard", LLSD(item->getUUID()), TAKE_FOCUS_YES); + } + LLInvFVBridgeAction::doIt(); } + virtual ~LLNotecardBridgeAction(){} +protected: + LLNotecardBridgeAction(const LLUUID& id,LLInventoryModel* model) : LLInvFVBridgeAction(id,model) {} +}; - LLInvFVBridgeAction::doIt(); -} - -//virtual -void LLGestureBridgeAction::doIt() +class LLGestureBridgeAction: public LLInvFVBridgeAction { - LLViewerInventoryItem* item = getItem(); - if (item) + friend class LLInvFVBridgeAction; +public: + virtual void doIt() { - LLPreviewGesture* preview = LLPreviewGesture::show(mUUID, LLUUID::null); - preview->setFocus(TRUE); + LLViewerInventoryItem* item = getItem(); + if (item) + { + LLPreviewGesture* preview = LLPreviewGesture::show(mUUID, LLUUID::null); + preview->setFocus(TRUE); + } + LLInvFVBridgeAction::doIt(); } + virtual ~LLGestureBridgeAction(){} +protected: + LLGestureBridgeAction(const LLUUID& id,LLInventoryModel* model) : LLInvFVBridgeAction(id,model) {} +}; - LLInvFVBridgeAction::doIt(); -} - -//virtual -void LLAnimationBridgeAction::doIt() +class LLAnimationBridgeAction: public LLInvFVBridgeAction { - LLViewerInventoryItem* item = getItem(); - if (item) + friend class LLInvFVBridgeAction; +public: + virtual void doIt() { - LLFloaterReg::showInstance("preview_anim", LLSD(mUUID), TAKE_FOCUS_YES); + LLViewerInventoryItem* item = getItem(); + if (item) + { + LLFloaterReg::showInstance("preview_anim", LLSD(mUUID), TAKE_FOCUS_YES); + } + LLInvFVBridgeAction::doIt(); } + virtual ~LLAnimationBridgeAction(){} +protected: + LLAnimationBridgeAction(const LLUUID& id,LLInventoryModel* model) : LLInvFVBridgeAction(id,model) {} +}; - LLInvFVBridgeAction::doIt(); -} - - -//virtual -void LLObjectBridgeAction::doIt() +class LLObjectBridgeAction: public LLInvFVBridgeAction { - /* - LLFloaterReg::showInstance("properties", mUUID); - */ - LLInvFVBridgeAction::doIt(); -} - + friend class LLInvFVBridgeAction; +public: + virtual void doIt() + { + /* + LLFloaterReg::showInstance("properties", mUUID); + */ + LLInvFVBridgeAction::doIt(); + } + virtual ~LLObjectBridgeAction(){} +protected: + LLObjectBridgeAction(const LLUUID& id,LLInventoryModel* model) : LLInvFVBridgeAction(id,model) {} +}; -//virtual -void LLLSLTextBridgeAction::doIt() +class LLLSLTextBridgeAction: public LLInvFVBridgeAction { - LLViewerInventoryItem* item = getItem(); - if (item) + friend class LLInvFVBridgeAction; +public: + virtual void doIt() { - LLFloaterReg::showInstance("preview_script", LLSD(mUUID), TAKE_FOCUS_YES); + LLViewerInventoryItem* item = getItem(); + if (item) + { + LLFloaterReg::showInstance("preview_script", LLSD(mUUID), TAKE_FOCUS_YES); + } + LLInvFVBridgeAction::doIt(); } + virtual ~LLLSLTextBridgeAction(){} +protected: + LLLSLTextBridgeAction(const LLUUID& id,LLInventoryModel* model) : LLInvFVBridgeAction(id,model) {} +}; - LLInvFVBridgeAction::doIt(); -} - +class LLWearableBridgeAction: public LLInvFVBridgeAction +{ + friend class LLInvFVBridgeAction; +public: + virtual void doIt() + { + wearOnAvatar(); + } + virtual ~LLWearableBridgeAction(){} +protected: + LLWearableBridgeAction(const LLUUID& id,LLInventoryModel* model) : LLInvFVBridgeAction(id,model) {} + BOOL isItemInTrash() const; + // return true if the item is in agent inventory. if false, it + // must be lost or in the inventory library. + BOOL isAgentInventory() const; + void wearOnAvatar(); +}; BOOL LLWearableBridgeAction::isItemInTrash() const { @@ -5226,182 +5111,118 @@ void LLWearableBridgeAction::wearOnAvatar() LLViewerInventoryItem* item = getItem(); if(item) { - if(!isAgentInventory()) - { - LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback(); - copy_inventory_item( - gAgent.getID(), - item->getPermissions().getOwner(), - item->getUUID(), - LLUUID::null, - std::string(), - cb); - } - else - { - wear_inventory_item_on_avatar(item); - } + LLAppearanceMgr::instance().wearItemOnAvatar(item->getUUID(), true, true); } } -//virtual -void LLWearableBridgeAction::doIt() +LLInvFVBridgeAction* LLInvFVBridgeAction::createAction(LLAssetType::EType asset_type, + const LLUUID& uuid, + LLInventoryModel* model) { - if(isItemInTrash()) - { - LLNotificationsUtil::add("CannotWearTrash"); - } - else if(isAgentInventory()) - { - if(!get_is_item_worn(mUUID)) - { - wearOnAvatar(); - } - } - else + LLInvFVBridgeAction* action = NULL; + switch(asset_type) { - // must be in the inventory library. copy it to our inventory - // and put it on right away. - LLViewerInventoryItem* item = getItem(); - if(item && item->isComplete()) - { - LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback(); - copy_inventory_item( - gAgent.getID(), - item->getPermissions().getOwner(), - item->getUUID(), - LLUUID::null, - std::string(), - cb); - } - else if(item) - { - // *TODO: We should fetch the item details, and then do - // the operation above. - LLNotificationsUtil::add("CannotWearInfoNotComplete"); - } + case LLAssetType::AT_TEXTURE: + action = new LLTextureBridgeAction(uuid,model); + break; + case LLAssetType::AT_SOUND: + action = new LLSoundBridgeAction(uuid,model); + break; + case LLAssetType::AT_LANDMARK: + action = new LLLandmarkBridgeAction(uuid,model); + break; + case LLAssetType::AT_CALLINGCARD: + action = new LLCallingCardBridgeAction(uuid,model); + break; + case LLAssetType::AT_OBJECT: + action = new LLObjectBridgeAction(uuid,model); + break; + case LLAssetType::AT_NOTECARD: + action = new LLNotecardBridgeAction(uuid,model); + break; + case LLAssetType::AT_ANIMATION: + action = new LLAnimationBridgeAction(uuid,model); + break; + case LLAssetType::AT_GESTURE: + action = new LLGestureBridgeAction(uuid,model); + break; + case LLAssetType::AT_LSL_TEXT: + action = new LLLSLTextBridgeAction(uuid,model); + break; + case LLAssetType::AT_CLOTHING: + case LLAssetType::AT_BODYPART: + action = new LLWearableBridgeAction(uuid,model); + break; + default: + break; } - - LLInvFVBridgeAction::doIt(); + return action; } -// +=================================================+ -// | LLLinkItemBridge | -// +=================================================+ -// For broken links - -std::string LLLinkItemBridge::sPrefix("Link: "); +/** Bridge Actions + ** + ********************************************************************************/ - -LLUIImagePtr LLLinkItemBridge::getIcon() const +/************************************************************************/ +/* Recent Inventory Panel related classes */ +/************************************************************************/ +void LLRecentItemsFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags) { - if (LLViewerInventoryItem *item = getItem()) - { - return get_item_icon(item->getActualType(), item->getInventoryType(), 0, FALSE); - } - return get_item_icon(LLAssetType::AT_LINK, LLInventoryType::IT_NONE, 0, FALSE); -} + LLFolderBridge::buildContextMenu(menu, flags); -void LLLinkItemBridge::buildContextMenu(LLMenuGL& menu, U32 flags) -{ - // *TODO: Translate - lldebugs << "LLLink::buildContextMenu()" << llendl; - menuentry_vec_t items; - menuentry_vec_t disabled_items; + menuentry_vec_t disabled_items, items = getMenuItems(); + + items.erase(std::remove(items.begin(), items.end(), std::string("New Body Parts")), items.end()); + items.erase(std::remove(items.begin(), items.end(), std::string("New Clothes")), items.end()); + items.erase(std::remove(items.begin(), items.end(), std::string("New Note")), items.end()); + items.erase(std::remove(items.begin(), items.end(), std::string("New Gesture")), items.end()); + items.erase(std::remove(items.begin(), items.end(), std::string("New Script")), items.end()); + items.erase(std::remove(items.begin(), items.end(), std::string("New Folder")), items.end()); - items.push_back(std::string("Find Original")); - disabled_items.push_back(std::string("Find Original")); - - if(isItemInTrash()) - { - addTrashContextMenuOptions(items, disabled_items); - } - else - { - items.push_back(std::string("Properties")); - addDeleteContextMenuOptions(items, disabled_items); - } hide_context_entries(menu, items, disabled_items); } - -// +=================================================+ -// | LLLinkBridge | -// +=================================================+ -// For broken links. - -std::string LLLinkFolderBridge::sPrefix("Link: "); - - -LLUIImagePtr LLLinkFolderBridge::getIcon() const +LLInvFVBridge* LLRecentInventoryBridgeBuilder::createBridge( + LLAssetType::EType asset_type, + LLAssetType::EType actual_asset_type, + LLInventoryType::EType inv_type, + LLInventoryPanel* inventory, + LLFolderView* root, + const LLUUID& uuid, + U32 flags /*= 0x00*/ ) const { - LLFolderType::EType preferred_type = LLFolderType::FT_NONE; - if (LLViewerInventoryItem *item = getItem()) + LLInvFVBridge* new_listener = NULL; + switch(asset_type) { - if (const LLViewerInventoryCategory* cat = item->getLinkedCategory()) - { - preferred_type = cat->getPreferredType(); + case LLAssetType::AT_CATEGORY: + if (actual_asset_type == LLAssetType::AT_LINK_FOLDER) + { + // *TODO: Create a link folder handler instead if it is necessary + new_listener = LLInventoryFVBridgeBuilder::createBridge( + asset_type, + actual_asset_type, + inv_type, + inventory, + root, + uuid, + flags); + break; } + new_listener = new LLRecentItemsFolderBridge(inv_type, inventory, root, uuid); + break; + default: + new_listener = LLInventoryFVBridgeBuilder::createBridge( + asset_type, + actual_asset_type, + inv_type, + inventory, + root, + uuid, + flags); } - return LLFolderBridge::getIcon(preferred_type); -} - -void LLLinkFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags) -{ - // *TODO: Translate - lldebugs << "LLLink::buildContextMenu()" << llendl; - menuentry_vec_t items; - menuentry_vec_t disabled_items; - - if (isItemInTrash()) - { - addTrashContextMenuOptions(items, disabled_items); - } - else - { - items.push_back(std::string("Find Original")); - addDeleteContextMenuOptions(items, disabled_items); - } - hide_context_entries(menu, items, disabled_items); -} + return new_listener; -void LLLinkFolderBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) -{ - if ("goto" == action) - { - gotoItem(folder); - return; - } - LLItemBridge::performAction(folder,model,action); } -void LLLinkFolderBridge::gotoItem(LLFolderView *folder) -{ - const LLUUID &cat_uuid = getFolderID(); - if (!cat_uuid.isNull()) - { - if (LLFolderViewItem *base_folder = folder->getItemByID(cat_uuid)) - { - if (LLInventoryModel* model = getInventoryModel()) - { - model->fetchDescendentsOf(cat_uuid); - } - base_folder->setOpen(TRUE); - folder->setSelectionFromRoot(base_folder,TRUE); - folder->scrollToShowSelection(); - } - } -} -const LLUUID &LLLinkFolderBridge::getFolderID() const -{ - if (LLViewerInventoryItem *link_item = getItem()) - { - if (const LLViewerInventoryCategory *cat = link_item->getLinkedCategory()) - { - const LLUUID& cat_uuid = cat->getUUID(); - return cat_uuid; - } - } - return LLUUID::null; -} +// EOF diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h index 32504091cb..64d0f8d254 100644 --- a/indra/newview/llinventorybridge.h +++ b/indra/newview/llinventorybridge.h @@ -44,78 +44,13 @@ class LLInventoryPanel; class LLInventoryModel; class LLMenuGL; - -enum EInventoryIcon -{ - TEXTURE_ICON_NAME, - SOUND_ICON_NAME, - CALLINGCARD_ONLINE_ICON_NAME, - CALLINGCARD_OFFLINE_ICON_NAME, - LANDMARK_ICON_NAME, - LANDMARK_VISITED_ICON_NAME, - SCRIPT_ICON_NAME, - CLOTHING_ICON_NAME, - OBJECT_ICON_NAME, - OBJECT_MULTI_ICON_NAME, - NOTECARD_ICON_NAME, - BODYPART_ICON_NAME, - SNAPSHOT_ICON_NAME, - - BODYPART_SHAPE_ICON_NAME, - BODYPART_SKIN_ICON_NAME, - BODYPART_HAIR_ICON_NAME, - BODYPART_EYES_ICON_NAME, - CLOTHING_SHIRT_ICON_NAME, - CLOTHING_PANTS_ICON_NAME, - CLOTHING_SHOES_ICON_NAME, - CLOTHING_SOCKS_ICON_NAME, - CLOTHING_JACKET_ICON_NAME, - CLOTHING_GLOVES_ICON_NAME, - CLOTHING_UNDERSHIRT_ICON_NAME, - CLOTHING_UNDERPANTS_ICON_NAME, - CLOTHING_SKIRT_ICON_NAME, - CLOTHING_ALPHA_ICON_NAME, - CLOTHING_TATTOO_ICON_NAME, - - ANIMATION_ICON_NAME, - GESTURE_ICON_NAME, - - LINKITEM_ICON_NAME, - LINKFOLDER_ICON_NAME, - - ICON_NAME_COUNT -}; - -extern std::string ICON_NAME[ICON_NAME_COUNT]; - -typedef std::pair<LLUUID, LLUUID> two_uuids_t; -typedef std::list<two_uuids_t> two_uuids_list_t; -typedef std::pair<LLUUID, two_uuids_list_t> uuid_move_list_t; - -struct LLMoveInv -{ - LLUUID mObjectID; - LLUUID mCategoryID; - two_uuids_list_t mMoveList; - void (*mCallback)(S32, void*); - void* mUserData; -}; - -struct LLAttachmentRezAction -{ - LLUUID mItemID; - S32 mAttachPt; -}; +class LLCallingCardObserver; +class LLViewerJointAttachment; typedef std::vector<std::string> menuentry_vec_t; -const std::string safe_inv_type_lookup(LLInventoryType::EType inv_type); -void hide_context_entries(LLMenuGL& menu, - const menuentry_vec_t &entries_to_show, - const menuentry_vec_t &disabled_entries); - //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// Class LLInvFVBridge (& its derived classes) +// Class LLInvFVBridge // // Short for Inventory-Folder-View-Bridge. This is an // implementation class to be able to view inventory items. @@ -134,25 +69,31 @@ public: LLAssetType::EType actual_asset_type, LLInventoryType::EType inv_type, LLInventoryPanel* inventory, + LLFolderView* root, const LLUUID& uuid, U32 flags = 0x00); virtual ~LLInvFVBridge() {} - virtual const LLUUID& getUUID() const { return mUUID; } + BOOL isInOutfitsSidePanel() const; // allow context menus to be customized for side panel + BOOL canShare() const; + //-------------------------------------------------------------------- + // LLInvFVBridge functionality + //-------------------------------------------------------------------- + virtual const LLUUID& getUUID() const { return mUUID; } + virtual void clearDisplayName() {} virtual void restoreItem() {} virtual void restoreToWorld() {} - // LLFolderViewEventListener functions + //-------------------------------------------------------------------- + // Inherited LLFolderViewEventListener functions + //-------------------------------------------------------------------- virtual const std::string& getName() const; virtual const std::string& getDisplayName() const; virtual PermissionMask getPermissionMask() const; virtual LLFolderType::EType getPreferredType() const; virtual time_t getCreationDate() const; - virtual LLFontGL::StyleFlags getLabelStyle() const - { - return LLFontGL::NORMAL; - } + virtual LLFontGL::StyleFlags getLabelStyle() const { return LLFontGL::NORMAL; } virtual std::string getLabelSuffix() const { return LLStringUtil::null; } virtual void openItem() {} virtual void closeItem() {} @@ -163,7 +104,7 @@ public: virtual BOOL isItemRemovable() const; virtual BOOL isItemMovable() const; virtual BOOL isItemInTrash() const; - + virtual BOOL isLink() const; //virtual BOOL removeItem() = 0; virtual void removeBatch(LLDynamicArray<LLFolderViewEventListener*>& batch); virtual void move(LLFolderViewEventListener* new_parent_bridge) {} @@ -175,19 +116,14 @@ public: virtual void pasteFromClipboard() {} virtual void pasteLinkFromClipboard() {} void getClipboardEntries(bool show_asset_id, menuentry_vec_t &items, - menuentry_vec_t &disabled_items, U32 flags); + menuentry_vec_t &disabled_items, U32 flags); virtual void buildContextMenu(LLMenuGL& menu, U32 flags); virtual BOOL startDrag(EDragAndDropType* type, LLUUID* id) const; virtual BOOL dragOrDrop(MASK mask, BOOL drop, EDragAndDropType cargo_type, void* cargo_data) { return FALSE; } virtual LLInventoryType::EType getInventoryType() const { return mInvType; } - - // LLInvFVBridge functionality - virtual void clearDisplayName() {} - - // Allow context menus to be customized for side panel. - bool isInOutfitsSidePanel() const; + virtual LLWearableType::EType getWearableType() const { return LLWearableType::WT_NONE; } //-------------------------------------------------------------------- // Convenience functions for adding various common menu options. @@ -197,9 +133,9 @@ protected: menuentry_vec_t &disabled_items); virtual void addDeleteContextMenuOptions(menuentry_vec_t &items, menuentry_vec_t &disabled_items); - + virtual void addOpenRightClickMenuOption(menuentry_vec_t &items); protected: - LLInvFVBridge(LLInventoryPanel* inventory, const LLUUID& uuid); + LLInvFVBridge(LLInventoryPanel* inventory, LLFolderView* root, const LLUUID& uuid); LLInventoryObject* getInventoryObject() const; LLInventoryModel* getInventoryModel() const; @@ -208,7 +144,7 @@ protected: BOOL isLinkedObjectMissing() const; // Is this a linked obj whose baseobj is not in inventory? BOOL isAgentInventory() const; // false if lost or in the inventory library - BOOL isCOFFolder() const; // true if COF or descendent of. + BOOL isCOFFolder() const; // true if COF or descendent of virtual BOOL isItemPermissive() const; static void changeItemParent(LLInventoryModel* model, LLViewerInventoryItem* item, @@ -221,40 +157,45 @@ protected: void removeBatchNoCheck(LLDynamicArray<LLFolderViewEventListener*>& batch); protected: LLHandle<LLPanel> mInventoryPanel; + LLFolderView* mRoot; const LLUUID mUUID; // item id LLInventoryType::EType mInvType; + BOOL mIsLink; void purgeItem(LLInventoryModel *model, const LLUUID &uuid); }; -/** - * This class intended to build Folder View Bridge via LLInvFVBridge::createBridge. - * It can be overridden with another way of creation necessary Inventory-Folder-View-Bridge. - */ +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Class LLInvFVBridgeBuilder +// +// This class intended to build Folder View Bridge via LLInvFVBridge::createBridge. +// It can be overridden with another way of creation necessary Inventory-Folder-View-Bridge. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ class LLInventoryFVBridgeBuilder { public: - virtual ~LLInventoryFVBridgeBuilder(){} + virtual ~LLInventoryFVBridgeBuilder() {} virtual LLInvFVBridge* createBridge(LLAssetType::EType asset_type, LLAssetType::EType actual_asset_type, LLInventoryType::EType inv_type, LLInventoryPanel* inventory, + LLFolderView* root, const LLUUID& uuid, U32 flags = 0x00) const; }; - class LLItemBridge : public LLInvFVBridge { public: - LLItemBridge(LLInventoryPanel* inventory, const LLUUID& uuid) : - LLInvFVBridge(inventory, uuid) {} - - virtual void performAction(LLFolderView* folder, LLInventoryModel* model, std::string action); + LLItemBridge(LLInventoryPanel* inventory, + LLFolderView* root, + const LLUUID& uuid) : + LLInvFVBridge(inventory, root, uuid) {} + virtual void performAction(LLInventoryModel* model, std::string action); virtual void selectItem(); virtual void restoreItem(); virtual void restoreToWorld(); - virtual void gotoItem(LLFolderView *folder); + virtual void gotoItem(); virtual LLUIImagePtr getIcon() const; virtual const std::string& getDisplayName() const; virtual std::string getLabelSuffix() const; @@ -269,30 +210,33 @@ public: virtual BOOL hasChildren() const { return FALSE; } virtual BOOL isUpToDate() const { return TRUE; } - // override for LLInvFVBridge - virtual void clearDisplayName() { mDisplayName.clear(); } + /*virtual*/ void clearDisplayName() { mDisplayName.clear(); } LLViewerInventoryItem* getItem() const; - bool isAddAction(std::string action) const; bool isRemoveAction(std::string action) const; - protected: + BOOL confirmRemoveItem(const LLSD& notification, const LLSD& response); virtual BOOL isItemPermissive() const; static void buildDisplayName(LLInventoryItem* item, std::string& name); + mutable std::string mDisplayName; }; - class LLFolderBridge : public LLInvFVBridge { - friend class LLInvFVBridge; public: - BOOL dragItemIntoFolder(LLInventoryItem* inv_item, - BOOL drop); - BOOL dragCategoryIntoFolder(LLInventoryCategory* inv_category, - BOOL drop); - virtual void performAction(LLFolderView* folder, LLInventoryModel* model, std::string action); + LLFolderBridge(LLInventoryPanel* inventory, + LLFolderView* root, + const LLUUID& uuid) : + LLInvFVBridge(inventory, root, uuid), + mCallingCards(FALSE), + mWearables(FALSE), + mMenu(NULL) {} + BOOL dragItemIntoFolder(LLInventoryItem* inv_item, BOOL drop); + BOOL dragCategoryIntoFolder(LLInventoryCategory* inv_category, BOOL drop); + + virtual void performAction(LLInventoryModel* model, std::string action); virtual void openItem(); virtual void closeItem(); virtual BOOL isItemRenameable() const; @@ -326,23 +270,16 @@ public: virtual BOOL isClipboardPasteableAsLink() const; virtual BOOL copyToClipboard() const; - static void createWearable(LLFolderBridge* bridge, EWearableType type); - static void createWearable(const LLUUID &parent_folder_id, EWearableType type); + static void createWearable(LLFolderBridge* bridge, LLWearableType::EType type); LLViewerInventoryCategory* getCategory() const; protected: - LLFolderBridge(LLInventoryPanel* inventory, const LLUUID& uuid) - : LLInvFVBridge(inventory, uuid), - - mCallingCards(FALSE), - mWearables(FALSE), - mMenu(NULL) {} - - // menu callbacks + //-------------------------------------------------------------------- + // Menu callbacks + //-------------------------------------------------------------------- static void pasteClipboard(void* user_data); static void createNewCategory(void* user_data); - static void createNewShirt(void* user_data); static void createNewPants(void* user_data); static void createNewShoes(void* user_data); @@ -358,15 +295,21 @@ protected: static void createNewEyes(void* user_data); BOOL checkFolderForContentsOfType(LLInventoryModel* model, LLInventoryCollectFunctor& typeToCheck); - BOOL areAnyContentsWorn(LLInventoryModel* model) const; void modifyOutfit(BOOL append); void determineFolderType(); + menuentry_vec_t getMenuItems() { return mItems; } // returns a copy of current menu items + + + //-------------------------------------------------------------------- + // Messy hacks for handling folder options + //-------------------------------------------------------------------- public: static LLFolderBridge* sSelf; static void staticFolderOptionsMenu(); void folderOptionsMenu(); + private: BOOL mCallingCards; BOOL mWearables; @@ -375,206 +318,160 @@ private: menuentry_vec_t mDisabledItems; }; -// DEPRECATED -class LLScriptBridge : public LLItemBridge -{ - friend class LLInvFVBridge; -public: - LLUIImagePtr getIcon() const; - -protected: - LLScriptBridge( LLInventoryPanel* inventory, const LLUUID& uuid ) : - LLItemBridge(inventory, uuid) {} -}; - - class LLTextureBridge : public LLItemBridge { - friend class LLInvFVBridge; public: + LLTextureBridge(LLInventoryPanel* inventory, + LLFolderView* root, + const LLUUID& uuid, + LLInventoryType::EType type) : + LLItemBridge(inventory, root, uuid) + { + mInvType = type; + } virtual LLUIImagePtr getIcon() const; virtual void openItem(); virtual void buildContextMenu(LLMenuGL& menu, U32 flags); - virtual void performAction(LLFolderView* folder, LLInventoryModel* model, std::string action); - -protected: - LLTextureBridge(LLInventoryPanel* inventory, const LLUUID& uuid, LLInventoryType::EType type) : - LLItemBridge(inventory, uuid), mInvType(type) {} + virtual void performAction(LLInventoryModel* model, std::string action); bool canSaveTexture(void); - LLInventoryType::EType mInvType; }; class LLSoundBridge : public LLItemBridge { - friend class LLInvFVBridge; public: - virtual LLUIImagePtr getIcon() const; + LLSoundBridge(LLInventoryPanel* inventory, + LLFolderView* root, + const LLUUID& uuid) : + LLItemBridge(inventory, root, uuid) {} virtual void openItem(); virtual void previewItem(); virtual void buildContextMenu(LLMenuGL& menu, U32 flags); static void openSoundPreview(void*); - -protected: - LLSoundBridge(LLInventoryPanel* inventory, const LLUUID& uuid) : - LLItemBridge(inventory, uuid) {} }; class LLLandmarkBridge : public LLItemBridge { - friend class LLInvFVBridge; public: - virtual void performAction(LLFolderView* folder, LLInventoryModel* model, std::string action); + LLLandmarkBridge(LLInventoryPanel* inventory, + LLFolderView* root, + const LLUUID& uuid, + U32 flags = 0x00); + virtual void performAction(LLInventoryModel* model, std::string action); virtual void buildContextMenu(LLMenuGL& menu, U32 flags); virtual LLUIImagePtr getIcon() const; virtual void openItem(); - -protected: - LLLandmarkBridge(LLInventoryPanel* inventory, const LLUUID& uuid, U32 flags = 0x00); - protected: BOOL mVisited; }; -class LLCallingCardBridge; - -class LLCallingCardObserver : public LLFriendObserver -{ -public: - LLCallingCardObserver(LLCallingCardBridge* bridge) : mBridgep(bridge) {} - virtual ~LLCallingCardObserver() { mBridgep = NULL; } - virtual void changed(U32 mask); - -protected: - LLCallingCardBridge* mBridgep; -}; - class LLCallingCardBridge : public LLItemBridge { - friend class LLInvFVBridge; public: + LLCallingCardBridge(LLInventoryPanel* inventory, + LLFolderView* folder, + const LLUUID& uuid ); + ~LLCallingCardBridge(); virtual std::string getLabelSuffix() const; //virtual const std::string& getDisplayName() const; virtual LLUIImagePtr getIcon() const; - virtual void performAction(LLFolderView* folder, LLInventoryModel* model, std::string action); + virtual void performAction(LLInventoryModel* model, std::string action); virtual void openItem(); virtual void buildContextMenu(LLMenuGL& menu, U32 flags); - //virtual void renameItem(const std::string& new_name); - //virtual BOOL removeItem(); virtual BOOL dragOrDrop(MASK mask, BOOL drop, EDragAndDropType cargo_type, void* cargo_data); void refreshFolderViewItem(); - -protected: - LLCallingCardBridge( LLInventoryPanel* inventory, const LLUUID& uuid ); - ~LLCallingCardBridge(); - protected: LLCallingCardObserver* mObserver; }; - class LLNotecardBridge : public LLItemBridge { - friend class LLInvFVBridge; public: - virtual LLUIImagePtr getIcon() const; + LLNotecardBridge(LLInventoryPanel* inventory, + LLFolderView* root, + const LLUUID& uuid) : + LLItemBridge(inventory, root, uuid) {} virtual void openItem(); - -protected: - LLNotecardBridge(LLInventoryPanel* inventory, const LLUUID& uuid) : - LLItemBridge(inventory, uuid) {} }; class LLGestureBridge : public LLItemBridge { - friend class LLInvFVBridge; public: - virtual LLUIImagePtr getIcon() const; - + LLGestureBridge(LLInventoryPanel* inventory, + LLFolderView* root, + const LLUUID& uuid) : + LLItemBridge(inventory, root, uuid) {} // Only suffix for gesture items, not task items, because only // gestures in your inventory can be active. virtual LLFontGL::StyleFlags getLabelStyle() const; virtual std::string getLabelSuffix() const; - - virtual void performAction(LLFolderView* folder, LLInventoryModel* model, std::string action); + virtual void performAction(LLInventoryModel* model, std::string action); virtual void openItem(); virtual BOOL removeItem(); - virtual void buildContextMenu(LLMenuGL& menu, U32 flags); - static void playGesture(const LLUUID& item_id); - -protected: - LLGestureBridge(LLInventoryPanel* inventory, const LLUUID& uuid) - : LLItemBridge(inventory, uuid) {} }; - class LLAnimationBridge : public LLItemBridge { - friend class LLInvFVBridge; public: - virtual void performAction(LLFolderView* folder, LLInventoryModel* model, std::string action); + LLAnimationBridge(LLInventoryPanel* inventory, + LLFolderView* root, + const LLUUID& uuid) : + LLItemBridge(inventory, root, uuid) {} + virtual void performAction(LLInventoryModel* model, std::string action); virtual void buildContextMenu(LLMenuGL& menu, U32 flags); - - virtual LLUIImagePtr getIcon() const; virtual void openItem(); - -protected: - LLAnimationBridge(LLInventoryPanel* inventory, const LLUUID& uuid) : - LLItemBridge(inventory, uuid) {} }; - class LLObjectBridge : public LLItemBridge { - friend class LLInvFVBridge; public: + LLObjectBridge(LLInventoryPanel* inventory, + LLFolderView* root, + const LLUUID& uuid, + LLInventoryType::EType type, + U32 flags); virtual LLUIImagePtr getIcon() const; - virtual void performAction(LLFolderView* folder, LLInventoryModel* model, std::string action); + virtual void performAction(LLInventoryModel* model, std::string action); virtual void openItem(); - virtual LLFontGL::StyleFlags getLabelStyle() const; virtual std::string getLabelSuffix() const; virtual void buildContextMenu(LLMenuGL& menu, U32 flags); virtual BOOL renameItem(const std::string& new_name); - LLInventoryObject* getObject() const; - -protected: - LLObjectBridge(LLInventoryPanel* inventory, const LLUUID& uuid, LLInventoryType::EType type, U32 flags); - protected: - static LLUUID sContextMenuItemID; // Only valid while the context menu is open. - LLInventoryType::EType mInvType; + static LLUUID sContextMenuItemID; // Only valid while the context menu is open. U32 mAttachPt; BOOL mIsMultiObject; }; - class LLLSLTextBridge : public LLItemBridge { - friend class LLInvFVBridge; public: - virtual LLUIImagePtr getIcon() const; + LLLSLTextBridge(LLInventoryPanel* inventory, + LLFolderView* root, + const LLUUID& uuid ) : + LLItemBridge(inventory, root, uuid) {} virtual void openItem(); - -protected: - LLLSLTextBridge( LLInventoryPanel* inventory, const LLUUID& uuid ) : - LLItemBridge(inventory, uuid) {} }; - class LLWearableBridge : public LLItemBridge { - friend class LLInvFVBridge; public: + LLWearableBridge(LLInventoryPanel* inventory, + LLFolderView* root, + const LLUUID& uuid, + LLAssetType::EType asset_type, + LLInventoryType::EType inv_type, + LLWearableType::EType wearable_type); virtual LLUIImagePtr getIcon() const; - virtual void performAction(LLFolderView* folder, LLInventoryModel* model, std::string action); + virtual void performAction(LLInventoryModel* model, std::string action); virtual void openItem(); virtual void buildContextMenu(LLMenuGL& menu, U32 flags); virtual std::string getLabelSuffix() const; virtual BOOL renameItem(const std::string& new_name); + virtual LLWearableType::EType getWearableType() const { return mWearableType; } static void onWearOnAvatar( void* userdata ); // Access to wearOnAvatar() from menu static BOOL canWearOnAvatar( void* userdata ); @@ -594,61 +491,43 @@ public: static void removeItemFromAvatar(LLViewerInventoryItem *item); static void removeAllClothesFromAvatar(); void removeFromAvatar(); - -protected: - LLWearableBridge(LLInventoryPanel* inventory, const LLUUID& uuid, LLAssetType::EType asset_type, LLInventoryType::EType inv_type, EWearableType wearable_type) : - LLItemBridge(inventory, uuid), - mAssetType( asset_type ), - mInvType(inv_type), - mWearableType(wearable_type) - {} - protected: LLAssetType::EType mAssetType; - LLInventoryType::EType mInvType; - EWearableType mWearableType; + LLWearableType::EType mWearableType; }; class LLLinkItemBridge : public LLItemBridge { - friend class LLInvFVBridge; public: + LLLinkItemBridge(LLInventoryPanel* inventory, + LLFolderView* root, + const LLUUID& uuid) : + LLItemBridge(inventory, root, uuid) {} virtual const std::string& getPrefix() { return sPrefix; } - - virtual LLUIImagePtr getIcon() const; virtual void buildContextMenu(LLMenuGL& menu, U32 flags); - -protected: - LLLinkItemBridge(LLInventoryPanel* inventory, const LLUUID& uuid) : - LLItemBridge(inventory, uuid) {} - protected: static std::string sPrefix; }; - class LLLinkFolderBridge : public LLItemBridge { - friend class LLInvFVBridge; public: + LLLinkFolderBridge(LLInventoryPanel* inventory, + LLFolderView* root, + const LLUUID& uuid) : + LLItemBridge(inventory, root, uuid) {} virtual const std::string& getPrefix() { return sPrefix; } - virtual LLUIImagePtr getIcon() const; virtual void buildContextMenu(LLMenuGL& menu, U32 flags); - virtual void performAction(LLFolderView* folder, LLInventoryModel* model, std::string action); - virtual void gotoItem(LLFolderView *folder); - + virtual void performAction(LLInventoryModel* model, std::string action); + virtual void gotoItem(); protected: - LLLinkFolderBridge(LLInventoryPanel* inventory, const LLUUID& uuid) : - LLItemBridge(inventory, uuid) {} const LLUUID &getFolderID() const; - -protected: static std::string sPrefix; }; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// Class LLInvFVBridgeAction (& its derived classes) +// Class LLInvFVBridgeAction // // This is an implementation class to be able to // perform action to view inventory items. @@ -658,159 +537,63 @@ class LLInvFVBridgeAction { public: // This method is a convenience function which creates the correct - // type of bridge action based on some basic information + // type of bridge action based on some basic information. static LLInvFVBridgeAction* createAction(LLAssetType::EType asset_type, - const LLUUID& uuid,LLInventoryModel* model); - + const LLUUID& uuid, + LLInventoryModel* model); static void doAction(LLAssetType::EType asset_type, const LLUUID& uuid, LLInventoryModel* model); static void doAction(const LLUUID& uuid, LLInventoryModel* model); - virtual void doIt() { }; - virtual ~LLInvFVBridgeAction(){}//need this because of warning on OSX + virtual void doIt() {}; + virtual ~LLInvFVBridgeAction() {} // need this because of warning on OSX protected: - LLInvFVBridgeAction(const LLUUID& id,LLInventoryModel* model):mUUID(id),mModel(model){} - + LLInvFVBridgeAction(const LLUUID& id, LLInventoryModel* model) : + mUUID(id), mModel(model) {} LLViewerInventoryItem* getItem() const; protected: - const LLUUID& mUUID; // item id + const LLUUID& mUUID; // item id LLInventoryModel* mModel; - -}; - - - -class LLTextureBridgeAction: public LLInvFVBridgeAction -{ - friend class LLInvFVBridgeAction; -public: - virtual void doIt() ; - virtual ~LLTextureBridgeAction(){} -protected: - LLTextureBridgeAction(const LLUUID& id,LLInventoryModel* model):LLInvFVBridgeAction(id,model){} - -}; - - -class LLSoundBridgeAction: public LLInvFVBridgeAction -{ - friend class LLInvFVBridgeAction; -public: - virtual void doIt() ; - virtual ~LLSoundBridgeAction(){} -protected: - LLSoundBridgeAction(const LLUUID& id,LLInventoryModel* model):LLInvFVBridgeAction(id,model){} - -}; - - -class LLLandmarkBridgeAction: public LLInvFVBridgeAction -{ - friend class LLInvFVBridgeAction; -public: - virtual void doIt() ; - virtual ~LLLandmarkBridgeAction(){} -protected: - LLLandmarkBridgeAction(const LLUUID& id,LLInventoryModel* model):LLInvFVBridgeAction(id,model){} - -}; - - -class LLCallingCardBridgeAction: public LLInvFVBridgeAction -{ - friend class LLInvFVBridgeAction; -public: - virtual void doIt() ; - virtual ~LLCallingCardBridgeAction(){} -protected: - LLCallingCardBridgeAction(const LLUUID& id,LLInventoryModel* model):LLInvFVBridgeAction(id,model){} - -}; - - -class LLNotecardBridgeAction: public LLInvFVBridgeAction -{ - friend class LLInvFVBridgeAction; -public: - virtual void doIt() ; - virtual ~LLNotecardBridgeAction(){} -protected: - LLNotecardBridgeAction(const LLUUID& id,LLInventoryModel* model):LLInvFVBridgeAction(id,model){} - -}; - - -class LLGestureBridgeAction: public LLInvFVBridgeAction -{ - friend class LLInvFVBridgeAction; -public: - virtual void doIt() ; - virtual ~LLGestureBridgeAction(){} -protected: - LLGestureBridgeAction(const LLUUID& id,LLInventoryModel* model):LLInvFVBridgeAction(id,model){} - -}; - - -class LLAnimationBridgeAction: public LLInvFVBridgeAction -{ - friend class LLInvFVBridgeAction; -public: - virtual void doIt() ; - virtual ~LLAnimationBridgeAction(){} -protected: - LLAnimationBridgeAction(const LLUUID& id,LLInventoryModel* model):LLInvFVBridgeAction(id,model){} - -}; - - -class LLObjectBridgeAction: public LLInvFVBridgeAction -{ - friend class LLInvFVBridgeAction; -public: - virtual void doIt() ; - virtual ~LLObjectBridgeAction(){} -protected: - LLObjectBridgeAction(const LLUUID& id,LLInventoryModel* model):LLInvFVBridgeAction(id,model){} - }; +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Recent Inventory Panel related classes +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -class LLLSLTextBridgeAction: public LLInvFVBridgeAction +// Overridden version of the Inventory-Folder-View-Bridge for Folders +class LLRecentItemsFolderBridge : public LLFolderBridge { - friend class LLInvFVBridgeAction; public: - virtual void doIt() ; - virtual ~LLLSLTextBridgeAction(){} -protected: - LLLSLTextBridgeAction(const LLUUID& id,LLInventoryModel* model):LLInvFVBridgeAction(id,model){} - + // Creates context menu for Folders related to Recent Inventory Panel. + // Uses base logic and than removes from visible items "New..." menu items. + LLRecentItemsFolderBridge(LLInventoryType::EType type, + LLInventoryPanel* inventory, + LLFolderView* root, + const LLUUID& uuid) : + LLFolderBridge(inventory, root, uuid) + { + mInvType = type; + } + /*virtual*/ void buildContextMenu(LLMenuGL& menu, U32 flags); }; - -class LLWearableBridgeAction: public LLInvFVBridgeAction +// Bridge builder to create Inventory-Folder-View-Bridge for Recent Inventory Panel +class LLRecentInventoryBridgeBuilder : public LLInventoryFVBridgeBuilder { - friend class LLInvFVBridgeAction; public: - virtual void doIt(); - virtual ~LLWearableBridgeAction(){} -protected: - LLWearableBridgeAction(const LLUUID& id,LLInventoryModel* model):LLInvFVBridgeAction(id,model){} - - - BOOL isItemInTrash() const; - // return true if the item is in agent inventory. if false, it - // must be lost or in the inventory library. - BOOL isAgentInventory() const; - - void wearOnAvatar(); - + // Overrides FolderBridge for Recent Inventory Panel. + // It use base functionality for bridges other than FolderBridge. + virtual LLInvFVBridge* createBridge(LLAssetType::EType asset_type, + LLAssetType::EType actual_asset_type, + LLInventoryType::EType inv_type, + LLInventoryPanel* inventory, + LLFolderView* root, + const LLUUID& uuid, + U32 flags = 0x00) const; }; -void wear_inventory_item_on_avatar(LLInventoryItem* item); - -class LLViewerJointAttachment; -void rez_attachment(LLViewerInventoryItem* item, LLViewerJointAttachment* attachment); +void rez_attachment(LLViewerInventoryItem* item, + LLViewerJointAttachment* attachment); // Move items from an in-world object's "Contents" folder to a specified // folder in agent inventory. @@ -820,13 +603,9 @@ BOOL move_inv_category_world_to_agent(const LLUUID& object_id, void (*callback)(S32, void*) = NULL, void* user_data = NULL); - - -void teleport_via_landmark(const LLUUID& asset_id); - // Utility function to hide all entries except those in the list void hide_context_entries(LLMenuGL& menu, - const menuentry_vec_t &entries_to_show, - const menuentry_vec_t &disabled_entries); + const menuentry_vec_t &entries_to_show, + const menuentry_vec_t &disabled_entries); #endif // LL_LLINVENTORYBRIDGE_H diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp index cd20d64ca8..6e829f2dc2 100644 --- a/indra/newview/llinventoryfilter.cpp +++ b/indra/newview/llinventoryfilter.cpp @@ -37,9 +37,11 @@ // viewer includes #include "llfoldervieweventlistener.h" #include "llfolderviewitem.h" -#include "llinventorymodel.h" // gInventory.backgroundFetchActive() +#include "llinventorymodel.h" +#include "llinventorymodelbackgroundfetch.h" #include "llviewercontrol.h" #include "llfolderview.h" +#include "llinventorybridge.h" // linden library includes #include "lltrans.h" @@ -47,13 +49,15 @@ LLInventoryFilter::FilterOps::FilterOps() : mFilterObjectTypes(0xffffffffffffffffULL), mFilterCategoryTypes(0xffffffffffffffffULL), + mFilterWearableTypes(0xffffffffffffffffULL), mMinDate(time_min()), mMaxDate(time_max()), mHoursAgo(0), mShowFolderState(SHOW_NON_EMPTY_FOLDERS), mPermissions(PERM_NONE), mFilterTypes(FILTERTYPE_OBJECT), - mFilterUUID(LLUUID::null) + mFilterUUID(LLUUID::null), + mIncludeLinks(TRUE) { } @@ -96,23 +100,23 @@ BOOL LLInventoryFilter::check(const LLFolderViewItem* item) return TRUE; } - const LLFolderViewEventListener* listener = item->getListener(); mSubStringMatchOffset = mFilterSubString.size() ? item->getSearchableLabel().find(mFilterSubString) : std::string::npos; const BOOL passed_filtertype = checkAgainstFilterType(item); - const BOOL passed = passed_filtertype && - (mFilterSubString.size() == 0 || mSubStringMatchOffset != std::string::npos) && - ((listener->getPermissionMask() & mFilterOps.mPermissions) == mFilterOps.mPermissions); + const BOOL passed_permissions = checkAgainstPermissions(item); + const BOOL passed = (passed_filtertype && + passed_permissions && + (mFilterSubString.size() == 0 || mSubStringMatchOffset != std::string::npos)); return passed; } -BOOL LLInventoryFilter::checkAgainstFilterType(const LLFolderViewItem* item) +BOOL LLInventoryFilter::checkAgainstFilterType(const LLFolderViewItem* item) const { const LLFolderViewEventListener* listener = item->getListener(); if (!listener) return FALSE; - const LLInventoryType::EType object_type = listener->getInventoryType(); + LLInventoryType::EType object_type = listener->getInventoryType(); const LLUUID object_id = listener->getUUID(); const LLInventoryObject *object = gInventory.getObject(object_id); @@ -127,15 +131,15 @@ BOOL LLInventoryFilter::checkAgainstFilterType(const LLFolderViewItem* item) if (object_type == LLInventoryType::IT_NONE) { if (object && object->getIsLinkType()) + { return FALSE; + } } else if ((1LL << object_type & mFilterOps.mFilterObjectTypes) == U64(0)) { return FALSE; } } - // - //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// @@ -159,8 +163,6 @@ BOOL LLInventoryFilter::checkAgainstFilterType(const LLFolderViewItem* item) if ((1LL << cat->getPreferredType() & mFilterOps.mFilterCategoryTypes) == U64(0)) return FALSE; } - // - //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// @@ -173,8 +175,6 @@ BOOL LLInventoryFilter::checkAgainstFilterType(const LLFolderViewItem* item) if (object->getLinkedUUID() != mFilterOps.mFilterUUID) return FALSE; } - // - //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// @@ -196,12 +196,38 @@ BOOL LLInventoryFilter::checkAgainstFilterType(const LLFolderViewItem* item) listener->getCreationDate() > mFilterOps.mMaxDate) return FALSE; } - // + //////////////////////////////////////////////////////////////////////////////// + // FILTERTYPE_WEARABLE + // Pass if this item is a wearable of the appropriate type + if (filterTypes & FILTERTYPE_WEARABLE) + { + LLWearableType::EType type = listener->getWearableType(); + if ((0x1LL << type & mFilterOps.mFilterWearableTypes) == 0) + { + return FALSE; + } + } return TRUE; } +BOOL LLInventoryFilter::checkAgainstPermissions(const LLFolderViewItem* item) const +{ + const LLFolderViewEventListener* listener = item->getListener(); + if (!listener) return FALSE; + + PermissionMask perm = listener->getPermissionMask(); + const LLInvFVBridge *bridge = dynamic_cast<const LLInvFVBridge *>(item->getListener()); + if (bridge && bridge->isLink()) + { + const LLUUID& linked_uuid = gInventory.getLinkedItemID(bridge->getUUID()); + const LLViewerInventoryItem *linked_item = gInventory.getItem(linked_uuid); + if (linked_item) + perm = linked_item->getPermissionMask(); + } + return (perm & mFilterOps.mPermissions) == mFilterOps.mPermissions; +} const std::string& LLInventoryFilter::getFilterSubString(BOOL trim) const { @@ -217,6 +243,8 @@ std::string::size_type LLInventoryFilter::getStringMatchOffset() const BOOL LLInventoryFilter::isNotDefault() const { return mFilterOps.mFilterObjectTypes != mDefaultFilterOps.mFilterObjectTypes + || mFilterOps.mFilterCategoryTypes != mDefaultFilterOps.mFilterCategoryTypes + || mFilterOps.mFilterWearableTypes != mDefaultFilterOps.mFilterWearableTypes || mFilterOps.mFilterTypes != FILTERTYPE_OBJECT || mFilterSubString.size() || mFilterOps.mPermissions != mDefaultFilterOps.mPermissions @@ -228,6 +256,8 @@ BOOL LLInventoryFilter::isNotDefault() const BOOL LLInventoryFilter::isActive() const { return mFilterOps.mFilterObjectTypes != 0xffffffffffffffffULL + || mFilterOps.mFilterCategoryTypes != 0xffffffffffffffffULL + || mFilterOps.mFilterWearableTypes != 0xffffffffffffffffULL || mFilterOps.mFilterTypes != FILTERTYPE_OBJECT || mFilterSubString.size() || mFilterOps.mPermissions != PERM_NONE @@ -301,7 +331,35 @@ void LLInventoryFilter::setFilterCategoryTypes(U64 types) setModified(FILTER_MORE_RESTRICTIVE); } } - mFilterOps.mFilterTypes |= FILTERTYPE_CATEGORY; + mFilterOps.mFilterTypes |= FILTERTYPE_OBJECT; +} + +void LLInventoryFilter::setFilterWearableTypes(U64 types) +{ + if (mFilterOps.mFilterWearableTypes != types) + { + // keep current items only if no type bits getting turned off + BOOL fewer_bits_set = (mFilterOps.mFilterWearableTypes & ~types); + BOOL more_bits_set = (~mFilterOps.mFilterWearableTypes & types); + + mFilterOps.mFilterWearableTypes = types; + if (more_bits_set && fewer_bits_set) + { + // neither less or more restrive, both simultaneously + // so we need to filter from scratch + setModified(FILTER_RESTART); + } + else if (more_bits_set) + { + // target is only one of all requested types so more type bits == less restrictive + setModified(FILTER_LESS_RESTRICTIVE); + } + else if (fewer_bits_set) + { + setModified(FILTER_MORE_RESTRICTIVE); + } + } + mFilterOps.mFilterTypes |= FILTERTYPE_WEARABLE; } void LLInventoryFilter::setFilterUUID(const LLUUID& object_id) @@ -328,9 +386,10 @@ void LLInventoryFilter::setFilterSubString(const std::string& string) // appending new characters const BOOL more_restrictive = mFilterSubString.size() < string.size() && !string.substr(0, mFilterSubString.size()).compare(mFilterSubString); - mFilterSubString = string; + mFilterSubStringOrig = string; + LLStringUtil::trimHead(mFilterSubStringOrig); + mFilterSubString = mFilterSubStringOrig; LLStringUtil::toUpper(mFilterSubString); - LLStringUtil::trimHead(mFilterSubString); if (less_restrictive) { setModified(FILTER_LESS_RESTRICTIVE); @@ -449,6 +508,18 @@ void LLInventoryFilter::setHoursAgo(U32 hours) mFilterOps.mFilterTypes |= FILTERTYPE_DATE; } +void LLInventoryFilter::setIncludeLinks(BOOL include_links) +{ + if (mFilterOps.mIncludeLinks != include_links) + { + if (!mFilterOps.mIncludeLinks) + setModified(FILTER_LESS_RESTRICTIVE); + else + setModified(FILTER_MORE_RESTRICTIVE); + } + mFilterOps.mIncludeLinks = include_links; +} + void LLInventoryFilter::setShowFolderState(EFolderShow state) { if (mFilterOps.mShowFolderState != state) @@ -713,7 +784,7 @@ const std::string& LLInventoryFilter::getFilterText() filtered_by_all_types = FALSE; } - if (!gInventory.backgroundFetchActive() + if (!LLInventoryModelBackgroundFetch::instance().backgroundFetchActive() && filtered_by_type && !filtered_by_all_types) { @@ -824,6 +895,10 @@ U32 LLInventoryFilter::getHoursAgo() const { return mFilterOps.mHoursAgo; } +BOOL LLInventoryFilter::getIncludeLinks() const +{ + return mFilterOps.mIncludeLinks; +} LLInventoryFilter::EFolderShow LLInventoryFilter::getShowFolderState() const { return mFilterOps.mShowFolderState; diff --git a/indra/newview/llinventoryfilter.h b/indra/newview/llinventoryfilter.h index b01554edc8..f740a6b333 100644 --- a/indra/newview/llinventoryfilter.h +++ b/indra/newview/llinventoryfilter.h @@ -59,10 +59,11 @@ public: enum EFilterType { FILTERTYPE_NONE = 0, - FILTERTYPE_OBJECT = 1, // normal default search-by-object-type - FILTERTYPE_CATEGORY = 2, // search by folder type - FILTERTYPE_UUID = 4, // find the object with UUID and any links to it - FILTERTYPE_DATE = 8 // search by date range + FILTERTYPE_OBJECT = 0x1 << 0, // normal default search-by-object-type + FILTERTYPE_CATEGORY = 0x1 << 1, // search by folder type + FILTERTYPE_UUID = 0x1 << 2, // find the object with UUID and any links to it + FILTERTYPE_DATE = 0x1 << 3, // search by date range + FILTERTYPE_WEARABLE = 0x1 << 4 // search by wearable type }; // REFACTOR: Change this to an enum. @@ -81,9 +82,11 @@ public: BOOL isFilterObjectTypesWith(LLInventoryType::EType t) const; void setFilterCategoryTypes(U64 types); void setFilterUUID(const LLUUID &object_id); + void setFilterWearableTypes(U64 types); void setFilterSubString(const std::string& string); const std::string& getFilterSubString(BOOL trim = FALSE) const; + const std::string& getFilterSubStringOrig() const { return mFilterSubStringOrig; } BOOL hasFilterString() const; void setFilterPermissions(PermissionMask perms); @@ -97,11 +100,15 @@ public: void setHoursAgo(U32 hours); U32 getHoursAgo() const; + void setIncludeLinks(BOOL include_links); + BOOL getIncludeLinks() const; + // +-------------------------------------------------------------------+ // + Execution And Results // +-------------------------------------------------------------------+ BOOL check(const LLFolderViewItem* item); - BOOL checkAgainstFilterType(const LLFolderViewItem* item); + BOOL checkAgainstFilterType(const LLFolderViewItem* item) const; + BOOL checkAgainstPermissions(const LLFolderViewItem* item) const; std::string::size_type getStringMatchOffset() const; // +-------------------------------------------------------------------+ @@ -163,6 +170,7 @@ private: U32 mFilterTypes; U64 mFilterObjectTypes; // For _OBJECT + U64 mFilterWearableTypes; U64 mFilterCategoryTypes; // For _CATEGORY LLUUID mFilterUUID; // for UUID @@ -171,6 +179,7 @@ private: U32 mHoursAgo; EFolderShow mShowFolderState; PermissionMask mPermissions; + BOOL mIncludeLinks; }; U32 mOrder; @@ -181,6 +190,7 @@ private: std::string::size_type mSubStringMatchOffset; std::string mFilterSubString; + std::string mFilterSubStringOrig; const std::string mName; S32 mFilterGeneration; diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp index 33623539e9..37088064c6 100644 --- a/indra/newview/llinventoryfunctions.cpp +++ b/indra/newview/llinventoryfunctions.cpp @@ -1,5 +1,5 @@ /** - * @file llfloaterinventory.cpp + * @file llinventoryfunctions.cpp * @brief Implementation of the inventory view and associated stuff. * * $LicenseInfo:firstyear=2001&license=viewergpl$ @@ -41,6 +41,7 @@ #include "llagentwearables.h" #include "llcallingcard.h" #include "llfloaterreg.h" +#include "llinventorydefines.h" #include "llsdserialize.h" #include "llfiltereditor.h" #include "llspinctrl.h" @@ -51,7 +52,7 @@ #include "llappearancemgr.h" #include "llappviewer.h" //#include "llfirstuse.h" -#include "llfloatercustomize.h" +#include "llfloaterinventory.h" #include "llfocusmgr.h" #include "llfolderview.h" #include "llgesturemgr.h" @@ -63,6 +64,7 @@ #include "llinventorypanel.h" #include "lllineeditor.h" #include "llmenugl.h" +#include "llpanelmaininventory.h" #include "llpreviewanim.h" #include "llpreviewgesture.h" #include "llpreviewnotecard.h" @@ -73,6 +75,8 @@ #include "llscrollbar.h" #include "llscrollcontainer.h" #include "llselectmgr.h" +#include "llsidetray.h" +#include "llsidepanelinventory.h" #include "lltabcontainer.h" #include "lltooldraganddrop.h" #include "lluictrlfactory.h" @@ -86,6 +90,572 @@ BOOL LLInventoryState::sWearNewClothing = FALSE; LLUUID LLInventoryState::sWearNewClothingTransactionID; +// Generates a string containing the path to the item specified by +// item_id. +void append_path(const LLUUID& id, std::string& path) +{ + std::string temp; + const LLInventoryObject* obj = gInventory.getObject(id); + LLUUID parent_id; + if(obj) parent_id = obj->getParentUUID(); + std::string forward_slash("/"); + while(obj) + { + obj = gInventory.getCategory(parent_id); + if(obj) + { + temp.assign(forward_slash + obj->getName() + temp); + parent_id = obj->getParentUUID(); + } + } + path.append(temp); +} + +void change_item_parent(LLInventoryModel* model, + LLViewerInventoryItem* item, + const LLUUID& new_parent_id, + BOOL restamp) +{ + if (item->getParentUUID() != new_parent_id) + { + LLInventoryModel::update_list_t update; + LLInventoryModel::LLCategoryUpdate old_folder(item->getParentUUID(),-1); + update.push_back(old_folder); + LLInventoryModel::LLCategoryUpdate new_folder(new_parent_id, 1); + update.push_back(new_folder); + gInventory.accountForUpdate(update); + + LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item); + new_item->setParent(new_parent_id); + new_item->updateParentOnServer(restamp); + model->updateItem(new_item); + model->notifyObservers(); + } +} + +void change_category_parent(LLInventoryModel* model, + LLViewerInventoryCategory* cat, + const LLUUID& new_parent_id, + BOOL restamp) +{ + if (!model || !cat) + { + return; + } + + // Can't move a folder into a child of itself. + if (model->isObjectDescendentOf(new_parent_id, cat->getUUID())) + { + return; + } + + LLInventoryModel::update_list_t update; + LLInventoryModel::LLCategoryUpdate old_folder(cat->getParentUUID(), -1); + update.push_back(old_folder); + LLInventoryModel::LLCategoryUpdate new_folder(new_parent_id, 1); + update.push_back(new_folder); + model->accountForUpdate(update); + + LLPointer<LLViewerInventoryCategory> new_cat = new LLViewerInventoryCategory(cat); + new_cat->setParent(new_parent_id); + new_cat->updateParentOnServer(restamp); + model->updateCategory(new_cat); + model->notifyObservers(); +} + +void remove_category(LLInventoryModel* model, const LLUUID& cat_id) +{ + if (!model || !get_is_category_removable(model, cat_id)) + { + return; + } + + // Look for any gestures and deactivate them + LLInventoryModel::cat_array_t descendent_categories; + LLInventoryModel::item_array_t descendent_items; + gInventory.collectDescendents(cat_id, descendent_categories, descendent_items, FALSE); + + for (LLInventoryModel::item_array_t::const_iterator iter = descendent_items.begin(); + iter != descendent_items.end(); + ++iter) + { + const LLViewerInventoryItem* item = (*iter); + const LLUUID& item_id = item->getUUID(); + if (item->getType() == LLAssetType::AT_GESTURE + && LLGestureMgr::instance().isGestureActive(item_id)) + { + LLGestureMgr::instance().deactivateGesture(item_id); + } + } + + LLViewerInventoryCategory* cat = gInventory.getCategory(cat_id); + if (cat) + { + const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH); + change_category_parent(model, cat, trash_id, TRUE); + } +} + +void rename_category(LLInventoryModel* model, const LLUUID& cat_id, const std::string& new_name) +{ + LLViewerInventoryCategory* cat; + + if (!model || + !get_is_category_renameable(model, cat_id) || + (cat = model->getCategory(cat_id)) == NULL || + cat->getName() == new_name) + { + return; + } + + LLPointer<LLViewerInventoryCategory> new_cat = new LLViewerInventoryCategory(cat); + new_cat->rename(new_name); + new_cat->updateServer(FALSE); + model->updateCategory(new_cat); + + model->notifyObservers(); +} + +BOOL get_is_item_worn(const LLUUID& id) +{ + const LLViewerInventoryItem* item = gInventory.getItem(id); + if (!item) + return FALSE; + + switch(item->getType()) + { + case LLAssetType::AT_OBJECT: + { + if (isAgentAvatarValid() && gAgentAvatarp->isWearingAttachment(item->getLinkedUUID())) + return TRUE; + break; + } + case LLAssetType::AT_BODYPART: + case LLAssetType::AT_CLOTHING: + if(gAgentWearables.isWearingItem(item->getLinkedUUID())) + return TRUE; + break; + case LLAssetType::AT_GESTURE: + if (LLGestureMgr::instance().isGestureActive(item->getLinkedUUID())) + return TRUE; + break; + default: + break; + } + return FALSE; +} + +BOOL get_is_item_removable(const LLInventoryModel* model, const LLUUID& id) +{ + if (!model) + { + return FALSE; + } + + // Can't delete an item that's in the library. + if (!model->isObjectDescendentOf(id, gInventory.getRootFolderID())) + { + return FALSE; + } + + // Disable delete from COF folder; have users explicitly choose "detach/take off", + // unless the item is not worn but in the COF (i.e. is bugged). + if (LLAppearanceMgr::instance().getIsProtectedCOFItem(id)) + { + if (get_is_item_worn(id)) + { + return FALSE; + } + } + + const LLInventoryObject *obj = model->getItem(id); + if (obj && obj->getIsLinkType()) + { + return TRUE; + } + if (get_is_item_worn(id)) + { + return FALSE; + } + return TRUE; +} + +BOOL get_is_category_removable(const LLInventoryModel* model, const LLUUID& id) +{ + // This function doesn't check the folder's children. + + if (!model) + { + return FALSE; + } + + if (!model->isObjectDescendentOf(id, gInventory.getRootFolderID())) + { + return FALSE; + } + + if (!isAgentAvatarValid()) return FALSE; + + LLInventoryCategory* category = model->getCategory(id); + if (!category) + { + return FALSE; + } + + if (LLFolderType::lookupIsProtectedType(category->getPreferredType())) + { + return FALSE; + } + + return TRUE; +} + +BOOL get_is_category_renameable(const LLInventoryModel* model, const LLUUID& id) +{ + if (!model) + { + return FALSE; + } + + LLViewerInventoryCategory* cat = model->getCategory(id); + + if (cat && !LLFolderType::lookupIsProtectedType(cat->getPreferredType()) && + cat->getOwnerID() == gAgent.getID()) + { + return TRUE; + } + return FALSE; +} + +void show_task_item_profile(const LLUUID& item_uuid, const LLUUID& object_id) +{ + LLSideTray::getInstance()->showPanel("sidepanel_inventory", LLSD().with("id", item_uuid).with("object", object_id)); +} + +void show_item_profile(const LLUUID& item_uuid) +{ + LLUUID linked_uuid = gInventory.getLinkedItemID(item_uuid); + LLSideTray::getInstance()->showPanel("sidepanel_inventory", LLSD().with("id", linked_uuid)); +} + +void show_item_original(const LLUUID& item_uuid) +{ + //sidetray inventory panel + LLSidepanelInventory *sidepanel_inventory = + dynamic_cast<LLSidepanelInventory *>(LLSideTray::getInstance()->getPanel("sidepanel_inventory")); + + bool reset_inventory_filter = !LLSideTray::getInstance()->isPanelActive("sidepanel_inventory"); + + LLInventoryPanel* active_panel = LLInventoryPanel::getActiveInventoryPanel(); + if (!active_panel) + { + //this may happen when there is no floatera and other panel is active in inventory tab + + if (sidepanel_inventory) + { + sidepanel_inventory->showInventoryPanel(); + } + } + + active_panel = LLInventoryPanel::getActiveInventoryPanel(); + if (!active_panel) + { + return; + } + active_panel->setSelection(gInventory.getLinkedItemID(item_uuid), TAKE_FOCUS_NO); + + if(reset_inventory_filter) + { + //inventory floater + bool floater_inventory_visible = false; + + LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("inventory"); + for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); iter != inst_list.end(); ++iter) + { + LLFloaterInventory* floater_inventory = dynamic_cast<LLFloaterInventory*>(*iter); + if (floater_inventory) + { + LLPanelMainInventory* main_inventory = floater_inventory->getMainInventoryPanel(); + + main_inventory->onFilterEdit(""); + } + + if(floater_inventory->getVisible()) + { + floater_inventory_visible = true; + } + + } + if(sidepanel_inventory && !floater_inventory_visible) + { + LLPanelMainInventory* main_inventory = sidepanel_inventory->getMainInventoryPanel(); + + main_inventory->onFilterEdit(""); + } + } +} + +///---------------------------------------------------------------------------- +/// LLInventoryCollectFunctor implementations +///---------------------------------------------------------------------------- + +// static +bool LLInventoryCollectFunctor::itemTransferCommonlyAllowed(const LLInventoryItem* item) +{ + if (!item) + return false; + + switch(item->getType()) + { + case LLAssetType::AT_CALLINGCARD: + return false; + break; + case LLAssetType::AT_OBJECT: + if (isAgentAvatarValid() && !gAgentAvatarp->isWearingAttachment(item->getUUID())) + return true; + break; + case LLAssetType::AT_BODYPART: + case LLAssetType::AT_CLOTHING: + if(!gAgentWearables.isWearingItem(item->getUUID())) + return true; + break; + default: + return true; + break; + } + return false; +} + +bool LLIsType::operator()(LLInventoryCategory* cat, LLInventoryItem* item) +{ + if(mType == LLAssetType::AT_CATEGORY) + { + if(cat) return TRUE; + } + if(item) + { + if(item->getType() == mType) return TRUE; + } + return FALSE; +} + +bool LLIsNotType::operator()(LLInventoryCategory* cat, LLInventoryItem* item) +{ + if(mType == LLAssetType::AT_CATEGORY) + { + if(cat) return FALSE; + } + if(item) + { + if(item->getType() == mType) return FALSE; + else return TRUE; + } + return TRUE; +} + +bool LLIsTypeWithPermissions::operator()(LLInventoryCategory* cat, LLInventoryItem* item) +{ + if(mType == LLAssetType::AT_CATEGORY) + { + if(cat) + { + return TRUE; + } + } + if(item) + { + if(item->getType() == mType) + { + LLPermissions perm = item->getPermissions(); + if ((perm.getMaskBase() & mPerm) == mPerm) + { + return TRUE; + } + } + } + return FALSE; +} + +bool LLBuddyCollector::operator()(LLInventoryCategory* cat, + LLInventoryItem* item) +{ + if(item) + { + if((LLAssetType::AT_CALLINGCARD == item->getType()) + && (!item->getCreatorUUID().isNull()) + && (item->getCreatorUUID() != gAgent.getID())) + { + return true; + } + } + return false; +} + + +bool LLUniqueBuddyCollector::operator()(LLInventoryCategory* cat, + LLInventoryItem* item) +{ + if(item) + { + if((LLAssetType::AT_CALLINGCARD == item->getType()) + && (item->getCreatorUUID().notNull()) + && (item->getCreatorUUID() != gAgent.getID())) + { + mSeen.insert(item->getCreatorUUID()); + return true; + } + } + return false; +} + + +bool LLParticularBuddyCollector::operator()(LLInventoryCategory* cat, + LLInventoryItem* item) +{ + if(item) + { + if((LLAssetType::AT_CALLINGCARD == item->getType()) + && (item->getCreatorUUID() == mBuddyID)) + { + return TRUE; + } + } + return FALSE; +} + + +bool LLNameCategoryCollector::operator()( + LLInventoryCategory* cat, LLInventoryItem* item) +{ + if(cat) + { + if (!LLStringUtil::compareInsensitive(mName, cat->getName())) + { + return true; + } + } + return false; +} + +bool LLFindCOFValidItems::operator()(LLInventoryCategory* cat, + LLInventoryItem* item) +{ + // Valid COF items are: + // - links to wearables (body parts or clothing) + // - links to attachments + // - links to gestures + // - links to ensemble folders + LLViewerInventoryItem *linked_item = ((LLViewerInventoryItem*)item)->getLinkedItem(); + if (linked_item) + { + LLAssetType::EType type = linked_item->getType(); + return (type == LLAssetType::AT_CLOTHING || + type == LLAssetType::AT_BODYPART || + type == LLAssetType::AT_GESTURE || + type == LLAssetType::AT_OBJECT); + } + else + { + LLViewerInventoryCategory *linked_category = ((LLViewerInventoryItem*)item)->getLinkedCategory(); + // BAP remove AT_NONE support after ensembles are fully working? + return (linked_category && + ((linked_category->getPreferredType() == LLFolderType::FT_NONE) || + (LLFolderType::lookupIsEnsembleType(linked_category->getPreferredType())))); + } +} + +bool LLFindWearables::operator()(LLInventoryCategory* cat, + LLInventoryItem* item) +{ + if(item) + { + if((item->getType() == LLAssetType::AT_CLOTHING) + || (item->getType() == LLAssetType::AT_BODYPART)) + { + return TRUE; + } + } + return FALSE; +} + +LLFindWearablesEx::LLFindWearablesEx(bool is_worn, bool include_body_parts) +: mIsWorn(is_worn) +, mIncludeBodyParts(include_body_parts) +{} + +bool LLFindWearablesEx::operator()(LLInventoryCategory* cat, LLInventoryItem* item) +{ + LLViewerInventoryItem *vitem = dynamic_cast<LLViewerInventoryItem*>(item); + if (!vitem) return false; + + // Skip non-wearables. + if (!vitem->isWearableType() && vitem->getType() != LLAssetType::AT_OBJECT) + { + return false; + } + + // Skip body parts if requested. + if (!mIncludeBodyParts && vitem->getType() == LLAssetType::AT_BODYPART) + { + return false; + } + + return (bool) get_is_item_worn(item->getUUID()) == mIsWorn; +} + +bool LLFindWearablesOfType::operator()(LLInventoryCategory* cat, LLInventoryItem* item) +{ + if (!item) return false; + if (item->getType() != LLAssetType::AT_CLOTHING && + item->getType() != LLAssetType::AT_BODYPART) + { + return false; + } + + LLViewerInventoryItem *vitem = dynamic_cast<LLViewerInventoryItem*>(item); + if (!vitem || vitem->getWearableType() != mWearableType) return false; + + return true; +} + +void LLFindWearablesOfType::setType(LLWearableType::EType type) +{ + mWearableType = type; +} + +bool LLFindNonRemovableObjects::operator()(LLInventoryCategory* cat, LLInventoryItem* item) +{ + if (item) + { + return !get_is_item_removable(&gInventory, item->getUUID()); + } + if (cat) + { + return !get_is_category_removable(&gInventory, cat->getUUID()); + } + + llwarns << "Not a category and not an item?" << llendl; + return false; +} + +///---------------------------------------------------------------------------- +/// LLAssetIDMatches +///---------------------------------------------------------------------------- +bool LLAssetIDMatches::operator()(LLInventoryCategory* cat, LLInventoryItem* item) +{ + return (item && item->getAssetUUID() == mAssetID); +} + +///---------------------------------------------------------------------------- +/// LLLinkedItemIDMatches +///---------------------------------------------------------------------------- +bool LLLinkedItemIDMatches::operator()(LLInventoryCategory* cat, LLInventoryItem* item) +{ + return (item && + (item->getIsLinkType()) && + (item->getLinkedUUID() == mBaseItemID)); // A linked item's assetID will be the compared-to item's itemID. +} + void LLSaveFolderState::setApply(BOOL apply) { mApply = apply; @@ -194,175 +764,3 @@ void LLOpenFoldersWithSelection::doFolder(LLFolderViewFolder* folder) folder->getParentFolder()->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP); } } - -const std::string& get_item_icon_name(LLAssetType::EType asset_type, - LLInventoryType::EType inventory_type, - U32 attachment_point, - BOOL item_is_multi ) -{ - EInventoryIcon idx = OBJECT_ICON_NAME; - if ( item_is_multi ) - { - idx = OBJECT_MULTI_ICON_NAME; - } - - switch(asset_type) - { - case LLAssetType::AT_TEXTURE: - if(LLInventoryType::IT_SNAPSHOT == inventory_type) - { - idx = SNAPSHOT_ICON_NAME; - } - else - { - idx = TEXTURE_ICON_NAME; - } - break; - - case LLAssetType::AT_SOUND: - idx = SOUND_ICON_NAME; - break; - case LLAssetType::AT_CALLINGCARD: - if(attachment_point!= 0) - { - idx = CALLINGCARD_ONLINE_ICON_NAME; - } - else - { - idx = CALLINGCARD_OFFLINE_ICON_NAME; - } - break; - case LLAssetType::AT_LANDMARK: - if(attachment_point!= 0) - { - idx = LANDMARK_VISITED_ICON_NAME; - } - else - { - idx = LANDMARK_ICON_NAME; - } - break; - case LLAssetType::AT_SCRIPT: - case LLAssetType::AT_LSL_TEXT: - case LLAssetType::AT_LSL_BYTECODE: - idx = SCRIPT_ICON_NAME; - break; - case LLAssetType::AT_CLOTHING: - idx = CLOTHING_ICON_NAME; - case LLAssetType::AT_BODYPART : - if(LLAssetType::AT_BODYPART == asset_type) - { - idx = BODYPART_ICON_NAME; - } - switch(LLInventoryItem::II_FLAGS_WEARABLES_MASK & attachment_point) - { - case WT_SHAPE: - idx = BODYPART_SHAPE_ICON_NAME; - break; - case WT_SKIN: - idx = BODYPART_SKIN_ICON_NAME; - break; - case WT_HAIR: - idx = BODYPART_HAIR_ICON_NAME; - break; - case WT_EYES: - idx = BODYPART_EYES_ICON_NAME; - break; - case WT_SHIRT: - idx = CLOTHING_SHIRT_ICON_NAME; - break; - case WT_PANTS: - idx = CLOTHING_PANTS_ICON_NAME; - break; - case WT_SHOES: - idx = CLOTHING_SHOES_ICON_NAME; - break; - case WT_SOCKS: - idx = CLOTHING_SOCKS_ICON_NAME; - break; - case WT_JACKET: - idx = CLOTHING_JACKET_ICON_NAME; - break; - case WT_GLOVES: - idx = CLOTHING_GLOVES_ICON_NAME; - break; - case WT_UNDERSHIRT: - idx = CLOTHING_UNDERSHIRT_ICON_NAME; - break; - case WT_UNDERPANTS: - idx = CLOTHING_UNDERPANTS_ICON_NAME; - break; - case WT_SKIRT: - idx = CLOTHING_SKIRT_ICON_NAME; - break; - case WT_ALPHA: - idx = CLOTHING_ALPHA_ICON_NAME; - break; - case WT_TATTOO: - idx = CLOTHING_TATTOO_ICON_NAME; - break; - default: - // no-op, go with choice above - break; - } - break; - case LLAssetType::AT_NOTECARD: - idx = NOTECARD_ICON_NAME; - break; - case LLAssetType::AT_ANIMATION: - idx = ANIMATION_ICON_NAME; - break; - case LLAssetType::AT_GESTURE: - idx = GESTURE_ICON_NAME; - break; - case LLAssetType::AT_LINK: - idx = LINKITEM_ICON_NAME; - break; - case LLAssetType::AT_LINK_FOLDER: - idx = LINKFOLDER_ICON_NAME; - break; - default: - break; - } - - return ICON_NAME[idx]; -} - -LLUIImagePtr get_item_icon(LLAssetType::EType asset_type, - LLInventoryType::EType inventory_type, - U32 attachment_point, - BOOL item_is_multi) -{ - const std::string& icon_name = get_item_icon_name(asset_type, inventory_type, attachment_point, item_is_multi ); - return LLUI::getUIImage(icon_name); -} - -BOOL get_is_item_worn(const LLUUID& id) -{ - const LLViewerInventoryItem* item = gInventory.getItem(id); - if (!item) - return FALSE; - - switch(item->getType()) - { - case LLAssetType::AT_OBJECT: - { - const LLVOAvatarSelf* my_avatar = gAgent.getAvatarObject(); - if(my_avatar && my_avatar->isWearingAttachment(item->getLinkedUUID())) - return TRUE; - break; - } - case LLAssetType::AT_BODYPART: - case LLAssetType::AT_CLOTHING: - if(gAgentWearables.isWearingItem(item->getLinkedUUID())) - return TRUE; - break; - case LLAssetType::AT_GESTURE: - if (LLGestureManager::instance().isGestureActive(item->getLinkedUUID())) - return TRUE; - break; - default: - break; - } - return FALSE; -} diff --git a/indra/newview/llinventoryfunctions.h b/indra/newview/llinventoryfunctions.h index 968db84819..6619a50d28 100644 --- a/indra/newview/llinventoryfunctions.h +++ b/indra/newview/llinventoryfunctions.h @@ -38,14 +38,357 @@ #include "llfolderview.h" #include "llfolderviewitem.h" +/******************************************************************************** + ** ** + ** MISCELLANEOUS GLOBAL FUNCTIONS + **/ + +// Is this item or its baseitem is worn, attached, etc... +BOOL get_is_item_worn(const LLUUID& id); + +BOOL get_is_item_removable(const LLInventoryModel* model, const LLUUID& id); + +BOOL get_is_category_removable(const LLInventoryModel* model, const LLUUID& id); + +BOOL get_is_category_renameable(const LLInventoryModel* model, const LLUUID& id); + +void show_item_profile(const LLUUID& item_uuid); +void show_task_item_profile(const LLUUID& item_uuid, const LLUUID& object_id); + +void show_item_original(const LLUUID& item_uuid); + +void change_item_parent(LLInventoryModel* model, + LLViewerInventoryItem* item, + const LLUUID& new_parent_id, + BOOL restamp); + +void change_category_parent(LLInventoryModel* model, + LLViewerInventoryCategory* cat, + const LLUUID& new_parent_id, + BOOL restamp); + +void remove_category(LLInventoryModel* model, const LLUUID& cat_id); + +void rename_category(LLInventoryModel* model, const LLUUID& cat_id, const std::string& new_name); + +// Generates a string containing the path to the item specified by item_id. +void append_path(const LLUUID& id, std::string& path); + +/** Miscellaneous global functions + ** ** + *******************************************************************************/ + +/******************************************************************************** + ** ** + ** INVENTORY COLLECTOR FUNCTIONS + **/ + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Class LLInventoryCollectFunctor +// +// Base class for LLInventoryModel::collectDescendentsIf() method +// which accepts an instance of one of these objects to use as the +// function to determine if it should be added. Derive from this class +// and override the () operator to return TRUE if you want to collect +// the category or item passed in. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +class LLInventoryCollectFunctor +{ +public: + virtual ~LLInventoryCollectFunctor(){}; + virtual bool operator()(LLInventoryCategory* cat, LLInventoryItem* item) = 0; + + static bool itemTransferCommonlyAllowed(const LLInventoryItem* item); +}; + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Class LLAssetIDMatches +// +// This functor finds inventory items pointing to the specified asset +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +class LLViewerInventoryItem; + +class LLAssetIDMatches : public LLInventoryCollectFunctor +{ +public: + LLAssetIDMatches(const LLUUID& asset_id) : mAssetID(asset_id) {} + virtual ~LLAssetIDMatches() {} + bool operator()(LLInventoryCategory* cat, LLInventoryItem* item); + +protected: + LLUUID mAssetID; +}; + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Class LLLinkedItemIDMatches +// +// This functor finds inventory items linked to the specific inventory id. +// Assumes the inventory id is itself not a linked item. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +class LLLinkedItemIDMatches : public LLInventoryCollectFunctor +{ +public: + LLLinkedItemIDMatches(const LLUUID& item_id) : mBaseItemID(item_id) {} + virtual ~LLLinkedItemIDMatches() {} + bool operator()(LLInventoryCategory* cat, LLInventoryItem* item); + +protected: + LLUUID mBaseItemID; +}; + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Class LLIsType +// +// Implementation of a LLInventoryCollectFunctor which returns TRUE if +// the type is the type passed in during construction. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +class LLIsType : public LLInventoryCollectFunctor +{ +public: + LLIsType(LLAssetType::EType type) : mType(type) {} + virtual ~LLIsType() {} + virtual bool operator()(LLInventoryCategory* cat, + LLInventoryItem* item); +protected: + LLAssetType::EType mType; +}; + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Class LLIsNotType +// +// Implementation of a LLInventoryCollectFunctor which returns FALSE if the +// type is the type passed in during construction, otherwise false. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +class LLIsNotType : public LLInventoryCollectFunctor +{ +public: + LLIsNotType(LLAssetType::EType type) : mType(type) {} + virtual ~LLIsNotType() {} + virtual bool operator()(LLInventoryCategory* cat, + LLInventoryItem* item); +protected: + LLAssetType::EType mType; +}; + +class LLIsTypeWithPermissions : public LLInventoryCollectFunctor +{ +public: + LLIsTypeWithPermissions(LLAssetType::EType type, const PermissionBit perms, const LLUUID &agent_id, const LLUUID &group_id) + : mType(type), mPerm(perms), mAgentID(agent_id), mGroupID(group_id) {} + virtual ~LLIsTypeWithPermissions() {} + virtual bool operator()(LLInventoryCategory* cat, + LLInventoryItem* item); +protected: + LLAssetType::EType mType; + PermissionBit mPerm; + LLUUID mAgentID; + LLUUID mGroupID; +}; + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Class LLBuddyCollector +// +// Simple class that collects calling cards that are not null, and not +// the agent. Duplicates are possible. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +class LLBuddyCollector : public LLInventoryCollectFunctor +{ +public: + LLBuddyCollector() {} + virtual ~LLBuddyCollector() {} + virtual bool operator()(LLInventoryCategory* cat, + LLInventoryItem* item); +}; + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Class LLUniqueBuddyCollector +// +// Simple class that collects calling cards that are not null, and not +// the agent. Duplicates are discarded. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +class LLUniqueBuddyCollector : public LLInventoryCollectFunctor +{ +public: + LLUniqueBuddyCollector() {} + virtual ~LLUniqueBuddyCollector() {} + virtual bool operator()(LLInventoryCategory* cat, + LLInventoryItem* item); + +protected: + std::set<LLUUID> mSeen; +}; + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Class LLParticularBuddyCollector +// +// Simple class that collects calling cards that match a particular uuid +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +class LLParticularBuddyCollector : public LLInventoryCollectFunctor +{ +public: + LLParticularBuddyCollector(const LLUUID& id) : mBuddyID(id) {} + virtual ~LLParticularBuddyCollector() {} + virtual bool operator()(LLInventoryCategory* cat, + LLInventoryItem* item); +protected: + LLUUID mBuddyID; +}; + //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Class LLNameCategoryCollector // -// This is a collection of miscellaneous functions and classes -// that don't fit cleanly into any other class header. Eventually, -// we should figure out where to put these functions so that we can -// get rid of this generic file. +// Collects categories based on case-insensitive match of prefix +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +class LLNameCategoryCollector : public LLInventoryCollectFunctor +{ +public: + LLNameCategoryCollector(const std::string& name) : mName(name) {} + virtual ~LLNameCategoryCollector() {} + virtual bool operator()(LLInventoryCategory* cat, + LLInventoryItem* item); +protected: + std::string mName; +}; + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Class LLFindCOFValidItems // +// Collects items that can be legitimately linked to in the COF. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +class LLFindCOFValidItems : public LLInventoryCollectFunctor +{ +public: + LLFindCOFValidItems() {} + virtual ~LLFindCOFValidItems() {} + virtual bool operator()(LLInventoryCategory* cat, + LLInventoryItem* item); + +}; + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Class LLFindNonLinksByMask +// +// +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +class LLFindByMask : public LLInventoryCollectFunctor +{ +public: + LLFindByMask(U64 mask) + : mFilterMask(mask) + {} + + virtual bool operator()(LLInventoryCategory* cat, LLInventoryItem* item) + { + if(item && (mFilterMask & (1LL << item->getInventoryType())) ) + { + return true; + } + + return false; + } + +private: + U64 mFilterMask; +}; + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Class LLFindNonLinksByMask +// +// +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +class LLFindNonLinksByMask : public LLInventoryCollectFunctor +{ +public: + LLFindNonLinksByMask(U64 mask) + : mFilterMask(mask) + {} + + virtual bool operator()(LLInventoryCategory* cat, LLInventoryItem* item) + { + if(item && !item->getIsLinkType() && (mFilterMask & (1LL << item->getInventoryType())) ) + { + return true; + } + + return false; + } + + void setFilterMask(U64 mask) + { + mFilterMask = mask; + } + +private: + U64 mFilterMask; +}; + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Class LLFindWearables +// +// Collects wearables based on item type. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +class LLFindWearables : public LLInventoryCollectFunctor +{ +public: + LLFindWearables() {} + virtual ~LLFindWearables() {} + virtual bool operator()(LLInventoryCategory* cat, + LLInventoryItem* item); +}; + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Class LLFindWearablesEx +// +// Collects wearables based on given criteria. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +class LLFindWearablesEx : public LLInventoryCollectFunctor +{ +public: + LLFindWearablesEx(bool is_worn, bool include_body_parts = true); + virtual bool operator()(LLInventoryCategory* cat, LLInventoryItem* item); +private: + bool mIncludeBodyParts; + bool mIsWorn; +}; + +//Inventory collect functor collecting wearables of a specific wearable type +class LLFindWearablesOfType : public LLInventoryCollectFunctor +{ +public: + LLFindWearablesOfType(LLWearableType::EType type) : mWearableType(type) {} + virtual ~LLFindWearablesOfType() {} + virtual bool operator()(LLInventoryCategory* cat, LLInventoryItem* item); + void setType(LLWearableType::EType type); + +private: + LLWearableType::EType mWearableType; +}; + +/** Filter out wearables-links */ +class LLFindActualWearablesOfType : public LLFindWearablesOfType +{ +public: + LLFindActualWearablesOfType(LLWearableType::EType type) : LLFindWearablesOfType(type) {} + virtual ~LLFindActualWearablesOfType() {} + virtual bool operator()(LLInventoryCategory* cat, LLInventoryItem* item) + { + if (item && item->getIsLinkType()) return false; + return LLFindWearablesOfType::operator()(cat, item); + } +}; + +// Collect non-removable folders and items. +class LLFindNonRemovableObjects : public LLInventoryCollectFunctor +{ +public: + virtual bool operator()(LLInventoryCategory* cat, LLInventoryItem* item); +}; + +/** Inventory Collector Functions + ** ** + *******************************************************************************/ class LLInventoryState { @@ -64,7 +407,7 @@ public: virtual void doItem(LLFolderViewItem* item); BOOL wasItemSelected() { return mItemSelected; } protected: - BOOL mItemSelected; + BOOL mItemSelected; }; class LLOpenFilteredFolders : public LLFolderViewFunctor @@ -99,19 +442,6 @@ public: virtual void doItem(LLFolderViewItem* item); }; -const std::string& get_item_icon_name(LLAssetType::EType asset_type, - LLInventoryType::EType inventory_type, - U32 attachment_point, - BOOL item_is_multi ); - -LLUIImagePtr get_item_icon(LLAssetType::EType asset_type, - LLInventoryType::EType inventory_type, - U32 attachment_point, - BOOL item_is_multi ); - -// Is this item or its baseitem is worn, attached, etc... -BOOL get_is_item_worn(const LLUUID& id); - #endif // LL_LLINVENTORYFUNCTIONS_H diff --git a/indra/newview/llinventoryicon.cpp b/indra/newview/llinventoryicon.cpp new file mode 100644 index 0000000000..3090371a73 --- /dev/null +++ b/indra/newview/llinventoryicon.cpp @@ -0,0 +1,181 @@ +/** + * @file llinventoryicon.cpp + * @brief Implementation of the inventory icon. + * + * $LicenseInfo:firstyear=2001&license=viewergpl$ + * + * Copyright (c) 2001-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" +#include "llinventoryicon.h" + +#include "lldictionary.h" +#include "llinventorydefines.h" +#include "llui.h" +#include "llwearabletype.h" + +struct IconEntry : public LLDictionaryEntry +{ + IconEntry(const std::string &item_name) + : + LLDictionaryEntry(item_name) + {} +}; + +class LLIconDictionary : public LLSingleton<LLIconDictionary>, + public LLDictionary<LLInventoryIcon::EIconName, IconEntry> +{ +public: + LLIconDictionary(); +}; + +LLIconDictionary::LLIconDictionary() +{ + addEntry(LLInventoryIcon::ICONNAME_TEXTURE, new IconEntry("Inv_Texture")); + addEntry(LLInventoryIcon::ICONNAME_SOUND, new IconEntry("Inv_Texture")); + addEntry(LLInventoryIcon::ICONNAME_CALLINGCARD_ONLINE, new IconEntry("Inv_CallingCard")); + addEntry(LLInventoryIcon::ICONNAME_CALLINGCARD_OFFLINE, new IconEntry("Inv_CallingCard")); + addEntry(LLInventoryIcon::ICONNAME_LANDMARK, new IconEntry("Inv_Landmark")); + addEntry(LLInventoryIcon::ICONNAME_LANDMARK_VISITED, new IconEntry("Inv_Landmark")); + addEntry(LLInventoryIcon::ICONNAME_SCRIPT, new IconEntry("Inv_Script")); + addEntry(LLInventoryIcon::ICONNAME_CLOTHING, new IconEntry("Inv_Clothing")); + addEntry(LLInventoryIcon::ICONNAME_OBJECT, new IconEntry("Inv_Object")); + addEntry(LLInventoryIcon::ICONNAME_OBJECT_MULTI, new IconEntry("Inv_Object_Multi")); + addEntry(LLInventoryIcon::ICONNAME_NOTECARD, new IconEntry("Inv_Notecard")); + addEntry(LLInventoryIcon::ICONNAME_BODYPART, new IconEntry("Inv_Skin")); + addEntry(LLInventoryIcon::ICONNAME_SNAPSHOT, new IconEntry("Inv_Snapshot")); + + addEntry(LLInventoryIcon::ICONNAME_BODYPART_SHAPE, new IconEntry("Inv_BodyShape")); + addEntry(LLInventoryIcon::ICONNAME_BODYPART_SKIN, new IconEntry("Inv_Skin")); + addEntry(LLInventoryIcon::ICONNAME_BODYPART_HAIR, new IconEntry("Inv_Hair")); + addEntry(LLInventoryIcon::ICONNAME_BODYPART_EYES, new IconEntry("Inv_Eye")); + + addEntry(LLInventoryIcon::ICONNAME_CLOTHING_SHIRT, new IconEntry("Inv_Shirt")); + addEntry(LLInventoryIcon::ICONNAME_CLOTHING_PANTS, new IconEntry("Inv_Pants")); + addEntry(LLInventoryIcon::ICONNAME_CLOTHING_SHOES, new IconEntry("Inv_Shoe")); + addEntry(LLInventoryIcon::ICONNAME_CLOTHING_SOCKS, new IconEntry("Inv_Socks")); + addEntry(LLInventoryIcon::ICONNAME_CLOTHING_JACKET, new IconEntry("Inv_Jacket")); + addEntry(LLInventoryIcon::ICONNAME_CLOTHING_GLOVES, new IconEntry("Inv_Gloves")); + addEntry(LLInventoryIcon::ICONNAME_CLOTHING_UNDERSHIRT, new IconEntry("Inv_Undershirt")); + addEntry(LLInventoryIcon::ICONNAME_CLOTHING_UNDERPANTS, new IconEntry("Inv_Underpants")); + addEntry(LLInventoryIcon::ICONNAME_CLOTHING_SKIRT, new IconEntry("Inv_Skirt")); + addEntry(LLInventoryIcon::ICONNAME_CLOTHING_ALPHA, new IconEntry("Inv_Alpha")); + addEntry(LLInventoryIcon::ICONNAME_CLOTHING_TATTOO, new IconEntry("Inv_Tattoo")); + addEntry(LLInventoryIcon::ICONNAME_ANIMATION, new IconEntry("Inv_Animation")); + addEntry(LLInventoryIcon::ICONNAME_GESTURE, new IconEntry("Inv_Gesture")); + + addEntry(LLInventoryIcon::ICONNAME_LINKITEM, new IconEntry("Inv_LinkItem")); + addEntry(LLInventoryIcon::ICONNAME_LINKFOLDER, new IconEntry("Inv_LinkItem")); + + addEntry(LLInventoryIcon::ICONNAME_NONE, new IconEntry("NONE")); +} + +LLUIImagePtr LLInventoryIcon::getIcon(LLAssetType::EType asset_type, + LLInventoryType::EType inventory_type, + U32 misc_flag, + BOOL item_is_multi) +{ + const std::string& icon_name = getIconName(asset_type, inventory_type, misc_flag, item_is_multi); + return LLUI::getUIImage(icon_name); +} + +LLUIImagePtr LLInventoryIcon::getIcon(EIconName idx) +{ + return LLUI::getUIImage(getIconName(idx)); +} + +const std::string& LLInventoryIcon::getIconName(LLAssetType::EType asset_type, + LLInventoryType::EType inventory_type, + U32 misc_flag, + BOOL item_is_multi) +{ + EIconName idx = ICONNAME_OBJECT; + if (item_is_multi) + { + idx = ICONNAME_OBJECT_MULTI; + } + + switch(asset_type) + { + case LLAssetType::AT_TEXTURE: + idx = (inventory_type == LLInventoryType::IT_SNAPSHOT) ? ICONNAME_SNAPSHOT : ICONNAME_TEXTURE; + break; + case LLAssetType::AT_SOUND: + idx = ICONNAME_SOUND; + break; + case LLAssetType::AT_CALLINGCARD: + idx = (misc_flag != 0) ? ICONNAME_CALLINGCARD_ONLINE : ICONNAME_CALLINGCARD_OFFLINE; + break; + case LLAssetType::AT_LANDMARK: + idx = (misc_flag != 0) ? ICONNAME_LANDMARK_VISITED : ICONNAME_LANDMARK; + break; + case LLAssetType::AT_SCRIPT: + case LLAssetType::AT_LSL_TEXT: + case LLAssetType::AT_LSL_BYTECODE: + idx = ICONNAME_SCRIPT; + break; + case LLAssetType::AT_CLOTHING: + case LLAssetType::AT_BODYPART: + idx = assignWearableIcon(misc_flag); + break; + case LLAssetType::AT_NOTECARD: + idx = ICONNAME_NOTECARD; + break; + case LLAssetType::AT_ANIMATION: + idx = ICONNAME_ANIMATION; + break; + case LLAssetType::AT_GESTURE: + idx = ICONNAME_GESTURE; + break; + case LLAssetType::AT_LINK: + idx = ICONNAME_LINKITEM; + break; + case LLAssetType::AT_LINK_FOLDER: + idx = ICONNAME_LINKFOLDER; + break; + case LLAssetType::AT_OBJECT: + idx = ICONNAME_OBJECT; + break; + default: + break; + } + + return getIconName(idx); +} + + +const std::string& LLInventoryIcon::getIconName(EIconName idx) +{ + const IconEntry *entry = LLIconDictionary::instance().lookup(idx); + return entry->mName; +} + +LLInventoryIcon::EIconName LLInventoryIcon::assignWearableIcon(U32 misc_flag) +{ + const LLWearableType::EType wearable_type = LLWearableType::EType(LLInventoryItemFlags::II_FLAGS_WEARABLES_MASK & misc_flag); + return LLWearableType::getIconName(wearable_type); +} diff --git a/indra/newview/llinventoryicon.h b/indra/newview/llinventoryicon.h new file mode 100644 index 0000000000..6e29012c4c --- /dev/null +++ b/indra/newview/llinventoryicon.h @@ -0,0 +1,105 @@ +/** + * @file llinventoryfunctions.h + * @brief Miscellaneous inventory-related functions and classes + * class definition + * + * $LicenseInfo:firstyear=2001&license=viewergpl$ + * + * Copyright (c) 2001-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLINVENTORYICON_H +#define LL_LLINVENTORYICON_H + +#include "llassettype.h" +#include "llinventorytype.h" +#include "lluiimage.h" + +class LLInventoryIcon +{ +public: + enum EIconName + { + ICONNAME_TEXTURE, + ICONNAME_SOUND, + ICONNAME_CALLINGCARD_ONLINE, + ICONNAME_CALLINGCARD_OFFLINE, + ICONNAME_LANDMARK, + ICONNAME_LANDMARK_VISITED, + ICONNAME_SCRIPT, + ICONNAME_CLOTHING, + ICONNAME_OBJECT, + ICONNAME_OBJECT_MULTI, + ICONNAME_NOTECARD, + ICONNAME_BODYPART, + ICONNAME_SNAPSHOT, + + ICONNAME_BODYPART_SHAPE, + ICONNAME_BODYPART_SKIN, + ICONNAME_BODYPART_HAIR, + ICONNAME_BODYPART_EYES, + ICONNAME_CLOTHING_SHIRT, + ICONNAME_CLOTHING_PANTS, + ICONNAME_CLOTHING_SHOES, + ICONNAME_CLOTHING_SOCKS, + ICONNAME_CLOTHING_JACKET, + ICONNAME_CLOTHING_GLOVES, + ICONNAME_CLOTHING_UNDERSHIRT, + ICONNAME_CLOTHING_UNDERPANTS, + ICONNAME_CLOTHING_SKIRT, + ICONNAME_CLOTHING_ALPHA, + ICONNAME_CLOTHING_TATTOO, + + ICONNAME_ANIMATION, + ICONNAME_GESTURE, + + ICONNAME_LINKITEM, + ICONNAME_LINKFOLDER, + + ICONNAME_COUNT, + + ICONNAME_NONE = -1 + }; + + static const std::string& getIconName(LLAssetType::EType asset_type, + LLInventoryType::EType inventory_type = LLInventoryType::IT_NONE, + U32 misc_flag = 0, // different meanings depending on item type + BOOL item_is_multi = FALSE); + static const std::string& getIconName(EIconName idx); + + static LLUIImagePtr getIcon(LLAssetType::EType asset_type, + LLInventoryType::EType inventory_type = LLInventoryType::IT_NONE, + U32 misc_flag = 0, // different meanings depending on item type + BOOL item_is_multi = FALSE); + static LLUIImagePtr getIcon(EIconName idx); + +protected: + static EIconName assignWearableIcon(U32 misc_flag); +}; +#endif // LL_LLINVENTORYICON_H + + + diff --git a/indra/newview/llinventoryitemslist.cpp b/indra/newview/llinventoryitemslist.cpp new file mode 100644 index 0000000000..14de5442d6 --- /dev/null +++ b/indra/newview/llinventoryitemslist.cpp @@ -0,0 +1,522 @@ +/** + * @file llinventoryitemslist.cpp + * @brief A list of inventory items represented by LLFlatListView. + * + * Class LLInventoryItemsList implements a flat list of inventory items. + * Class LLPanelInventoryListItem displays inventory item as an element + * of LLInventoryItemsList. + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llinventoryitemslist.h" + +// llcommon +#include "llcommonutils.h" + +// llui +#include "lliconctrl.h" +#include "lltextutil.h" + +#include "llcallbacklist.h" +#include "llinventoryfunctions.h" +#include "llinventorymodel.h" +#include "lltrans.h" + +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// + +static const S32 WIDGET_SPACING = 3; + +LLPanelInventoryListItemBase* LLPanelInventoryListItemBase::create(LLViewerInventoryItem* item) +{ + LLPanelInventoryListItemBase* list_item = NULL; + if (item) + { + list_item = new LLPanelInventoryListItemBase(item); + list_item->init(); + } + return list_item; +} + +void LLPanelInventoryListItemBase::draw() +{ + if (getNeedsRefresh()) + { + if (mItem) + { + updateItem(mItem->getName()); + } + setNeedsRefresh(false); + } + LLPanel::draw(); +} + +// virtual +void LLPanelInventoryListItemBase::updateItem(const std::string& name, + const LLStyle::Params& input_params) +{ + setIconImage(mIconImage); + setTitle(name, mHighlightedText, input_params); +} + +void LLPanelInventoryListItemBase::addWidgetToLeftSide(const std::string& name, bool show_widget/* = true*/) +{ + LLUICtrl* ctrl = findChild<LLUICtrl>(name); + if(ctrl) + { + addWidgetToLeftSide(ctrl, show_widget); + } +} + +void LLPanelInventoryListItemBase::addWidgetToLeftSide(LLUICtrl* ctrl, bool show_widget/* = true*/) +{ + mLeftSideWidgets.push_back(ctrl); + setShowWidget(ctrl, show_widget); +} + +void LLPanelInventoryListItemBase::addWidgetToRightSide(const std::string& name, bool show_widget/* = true*/) +{ + LLUICtrl* ctrl = findChild<LLUICtrl>(name); + if(ctrl) + { + addWidgetToRightSide(ctrl, show_widget); + } +} + +void LLPanelInventoryListItemBase::addWidgetToRightSide(LLUICtrl* ctrl, bool show_widget/* = true*/) +{ + mRightSideWidgets.push_back(ctrl); + setShowWidget(ctrl, show_widget); +} + +void LLPanelInventoryListItemBase::setShowWidget(const std::string& name, bool show) +{ + LLUICtrl* widget = findChild<LLUICtrl>(name); + if(widget) + { + setShowWidget(widget, show); + } +} + +void LLPanelInventoryListItemBase::setShowWidget(LLUICtrl* ctrl, bool show) +{ + // Enable state determines whether widget may become visible in setWidgetsVisible() + ctrl->setEnabled(show); +} + +BOOL LLPanelInventoryListItemBase::postBuild() +{ + setIconCtrl(getChild<LLIconCtrl>("item_icon")); + setTitleCtrl(getChild<LLTextBox>("item_name")); + + if (mItem) + { + mIconImage = LLInventoryIcon::getIcon(mItem->getType(), mItem->getInventoryType(), mItem->getFlags(), FALSE); + updateItem(mItem->getName()); + } + + setNeedsRefresh(true); + + setWidgetsVisible(false); + reshapeWidgets(); + + return TRUE; +} + +void LLPanelInventoryListItemBase::setValue(const LLSD& value) +{ + if (!value.isMap()) return; + if (!value.has("selected")) return; + childSetVisible("selected_icon", value["selected"]); +} + +void LLPanelInventoryListItemBase::onMouseEnter(S32 x, S32 y, MASK mask) +{ + childSetVisible("hovered_icon", true); + LLPanel::onMouseEnter(x, y, mask); +} + +void LLPanelInventoryListItemBase::onMouseLeave(S32 x, S32 y, MASK mask) +{ + childSetVisible("hovered_icon", false); + LLPanel::onMouseLeave(x, y, mask); +} + +const std::string& LLPanelInventoryListItemBase::getItemName() const +{ + if (!mItem) + { + return LLStringUtil::null; + } + return mItem->getName(); +} + +LLAssetType::EType LLPanelInventoryListItemBase::getType() const +{ + if (!mItem) + { + return LLAssetType::AT_NONE; + } + return mItem->getType(); +} + +LLWearableType::EType LLPanelInventoryListItemBase::getWearableType() const +{ + if (!mItem) + { + return LLWearableType::WT_NONE; + } + return mItem->getWearableType(); +} + +const std::string& LLPanelInventoryListItemBase::getDescription() const +{ + if (!mItem) + { + return LLStringUtil::null; + } + return mItem->getDescription(); +} + +S32 LLPanelInventoryListItemBase::notify(const LLSD& info) +{ + S32 rv = 0; + if(info.has("match_filter")) + { + mHighlightedText = info["match_filter"].asString(); + + std::string test(mTitleCtrl->getText()); + LLStringUtil::toUpper(test); + + if(mHighlightedText.empty() || std::string::npos != test.find(mHighlightedText)) + { + rv = 0; // substring is found + } + else + { + rv = -1; + } + + setNeedsRefresh(true); + } + else + { + rv = LLPanel::notify(info); + } + return rv; +} + +LLPanelInventoryListItemBase::LLPanelInventoryListItemBase(LLViewerInventoryItem* item) +: LLPanel() +, mItem(item) +, mIconCtrl(NULL) +, mTitleCtrl(NULL) +, mWidgetSpacing(WIDGET_SPACING) +, mLeftWidgetsWidth(0) +, mRightWidgetsWidth(0) +, mNeedsRefresh(false) +{ +} + +void LLPanelInventoryListItemBase::init() +{ + LLUICtrlFactory::getInstance()->buildPanel(this, "panel_inventory_item.xml"); +} + +class WidgetVisibilityChanger +{ +public: + WidgetVisibilityChanger(bool visible) : mVisible(visible){} + void operator()(LLUICtrl* widget) + { + // Disabled widgets never become visible. see LLPanelInventoryListItemBase::setShowWidget() + widget->setVisible(mVisible && widget->getEnabled()); + } +private: + bool mVisible; +}; + +void LLPanelInventoryListItemBase::setWidgetsVisible(bool visible) +{ + std::for_each(mLeftSideWidgets.begin(), mLeftSideWidgets.end(), WidgetVisibilityChanger(visible)); + std::for_each(mRightSideWidgets.begin(), mRightSideWidgets.end(), WidgetVisibilityChanger(visible)); +} + +void LLPanelInventoryListItemBase::reshapeWidgets() +{ + // disabled reshape left for now to reserve space for 'delete' button in LLPanelClothingListItem + /*reshapeLeftWidgets();*/ + reshapeRightWidgets(); + reshapeMiddleWidgets(); +} + +void LLPanelInventoryListItemBase::setIconImage(const LLUIImagePtr& image) +{ + if(image) + { + mIconImage = image; + mIconCtrl->setImage(mIconImage); + } +} + +void LLPanelInventoryListItemBase::setTitle(const std::string& title, + const std::string& highlit_text, + const LLStyle::Params& input_params) +{ + mTitleCtrl->setToolTip(title); + + LLTextUtil::textboxSetHighlightedVal( + mTitleCtrl, + input_params, + title, + highlit_text); +} + +BOOL LLPanelInventoryListItemBase::handleToolTip( S32 x, S32 y, MASK mask) +{ + LLRect text_box_rect = mTitleCtrl->getRect(); + if (text_box_rect.pointInRect(x, y) && + mTitleCtrl->getTextPixelWidth() <= text_box_rect.getWidth()) + { + return FALSE; + } + return LLPanel::handleToolTip(x, y, mask); +} + +void LLPanelInventoryListItemBase::reshapeLeftWidgets() +{ + S32 widget_left = 0; + mLeftWidgetsWidth = 0; + + widget_array_t::const_iterator it = mLeftSideWidgets.begin(); + const widget_array_t::const_iterator it_end = mLeftSideWidgets.end(); + for( ; it_end != it; ++it) + { + LLUICtrl* widget = *it; + if(!widget->getVisible()) + { + continue; + } + LLRect widget_rect(widget->getRect()); + widget_rect.setLeftTopAndSize(widget_left, widget_rect.mTop, widget_rect.getWidth(), widget_rect.getHeight()); + widget->setShape(widget_rect); + + widget_left += widget_rect.getWidth() + getWidgetSpacing(); + mLeftWidgetsWidth = widget_rect.mRight; + } +} + +void LLPanelInventoryListItemBase::reshapeRightWidgets() +{ + S32 widget_right = getLocalRect().getWidth(); + S32 widget_left = widget_right; + + widget_array_t::const_reverse_iterator it = mRightSideWidgets.rbegin(); + const widget_array_t::const_reverse_iterator it_end = mRightSideWidgets.rend(); + for( ; it_end != it; ++it) + { + LLUICtrl* widget = *it; + if(!widget->getVisible()) + { + continue; + } + LLRect widget_rect(widget->getRect()); + widget_left = widget_right - widget_rect.getWidth(); + widget_rect.setLeftTopAndSize(widget_left, widget_rect.mTop, widget_rect.getWidth(), widget_rect.getHeight()); + widget->setShape(widget_rect); + + widget_right = widget_left - getWidgetSpacing(); + } + mRightWidgetsWidth = getLocalRect().getWidth() - widget_left; +} + +void LLPanelInventoryListItemBase::reshapeMiddleWidgets() +{ + LLRect icon_rect(mIconCtrl->getRect()); + icon_rect.setLeftTopAndSize(mLeftWidgetsWidth + getWidgetSpacing(), icon_rect.mTop, + icon_rect.getWidth(), icon_rect.getHeight()); + mIconCtrl->setShape(icon_rect); + + S32 name_left = icon_rect.mRight + getWidgetSpacing(); + S32 name_right = getLocalRect().getWidth() - mRightWidgetsWidth - getWidgetSpacing(); + LLRect name_rect(mTitleCtrl->getRect()); + name_rect.set(name_left, name_rect.mTop, name_right, name_rect.mBottom); + mTitleCtrl->setShape(name_rect); +} + +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// + +LLInventoryItemsList::Params::Params() +{} + +LLInventoryItemsList::LLInventoryItemsList(const LLInventoryItemsList::Params& p) +: LLFlatListViewEx(p) +, mNeedsRefresh(false) +, mForceRefresh(false) +{ + // TODO: mCommitOnSelectionChange is set to "false" in LLFlatListView + // but reset to true in all derived classes. This settings might need to + // be added to LLFlatListView::Params() and/or set to "true" by default. + setCommitOnSelectionChange(true); + + setNoFilteredItemsMsg(LLTrans::getString("InventoryNoMatchingItems")); + + gIdleCallbacks.addFunction(idle, this); +} + +// virtual +LLInventoryItemsList::~LLInventoryItemsList() +{ + gIdleCallbacks.deleteFunction(idle, this); +} + +void LLInventoryItemsList::refreshList(const LLInventoryModel::item_array_t item_array) +{ + getIDs().clear(); + LLInventoryModel::item_array_t::const_iterator it = item_array.begin(); + for( ; item_array.end() != it; ++it) + { + getIDs().push_back((*it)->getUUID()); + } + mNeedsRefresh = true; +} + +boost::signals2::connection LLInventoryItemsList::setRefreshCompleteCallback(const commit_signal_t::slot_type& cb) +{ + return mRefreshCompleteSignal.connect(cb); +} + +void LLInventoryItemsList::doIdle() +{ + if (!mNeedsRefresh) return; + + if (isInVisibleChain() || mForceRefresh) + { + refresh(); + + mRefreshCompleteSignal(this, LLSD()); + } +} + +//static +void LLInventoryItemsList::idle(void* user_data) +{ + LLInventoryItemsList* self = static_cast<LLInventoryItemsList*>(user_data); + if ( self ) + { // Do the real idle + self->doIdle(); + } +} + +void LLInventoryItemsList::refresh() +{ + static const unsigned ADD_LIMIT = 50; + + uuid_vec_t added_items; + uuid_vec_t removed_items; + + computeDifference(getIDs(), added_items, removed_items); + + bool add_limit_exceeded = false; + unsigned int nadded = 0; + + uuid_vec_t::const_iterator it = added_items.begin(); + for( ; added_items.end() != it; ++it) + { + if(nadded >= ADD_LIMIT) + { + add_limit_exceeded = true; + break; + } + LLViewerInventoryItem* item = gInventory.getItem(*it); + // Do not rearrange items on each adding, let's do that on filter call + llassert(item); + if (item) + { + addNewItem(item, false); + ++nadded; + } + } + + it = removed_items.begin(); + for( ; removed_items.end() != it; ++it) + { + removeItemByUUID(*it); + } + + // Filter, rearrange and notify parent about shape changes + filterItems(); + + bool needs_refresh = add_limit_exceeded; + setNeedsRefresh(needs_refresh); + setForceRefresh(needs_refresh); +} + +void LLInventoryItemsList::computeDifference( + const uuid_vec_t& vnew, + uuid_vec_t& vadded, + uuid_vec_t& vremoved) +{ + uuid_vec_t vcur; + { + std::vector<LLSD> vcur_values; + getValues(vcur_values); + + for (size_t i=0; i<vcur_values.size(); i++) + vcur.push_back(vcur_values[i].asUUID()); + } + + LLCommonUtils::computeDifference(vnew, vcur, vadded, vremoved); +} + +void LLInventoryItemsList::addNewItem(LLViewerInventoryItem* item, bool rearrange /*= true*/) +{ + if (!item) + { + llwarns << "No inventory item. Couldn't create flat list item." << llendl; + llassert(item != NULL); + } + + LLPanelInventoryListItemBase *list_item = LLPanelInventoryListItemBase::create(item); + if (!list_item) + return; + + bool is_item_added = addItem(list_item, item->getUUID(), ADD_BOTTOM, rearrange); + if (!is_item_added) + { + llwarns << "Couldn't add flat list item." << llendl; + llassert(is_item_added); + } +} + +// EOF diff --git a/indra/newview/llinventoryitemslist.h b/indra/newview/llinventoryitemslist.h new file mode 100644 index 0000000000..5dc0bfe3de --- /dev/null +++ b/indra/newview/llinventoryitemslist.h @@ -0,0 +1,294 @@ +/** + * @file llinventoryitemslist.h + * @brief A list of inventory items represented by LLFlatListView. + * + * Class LLInventoryItemsList implements a flat list of inventory items. + * Class LLPanelInventoryListItem displays inventory item as an element + * of LLInventoryItemsList. + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLINVENTORYITEMSLIST_H +#define LL_LLINVENTORYITEMSLIST_H + +#include "lldarray.h" + +#include "llpanel.h" + +// newview +#include "llflatlistview.h" +#include "llviewerinventory.h" + +class LLIconCtrl; +class LLTextBox; +class LLViewerInventoryItem; + +/** + * @class LLPanelInventoryListItemBase + * + * Base class for Inventory flat list item. Panel consists of inventory icon + * and inventory item name. + * This class is able to display widgets(buttons) on left(before icon) and right(after text-box) sides + * of panel. + * + * How to use (see LLPanelClothingListItem for example): + * - implement init() to build panel from xml + * - create new xml file, fill it with widgets you want to dynamically show/hide/reshape on left/right sides + * - redefine postBuild()(call base implementation) and add needed widgets to needed sides, + * + */ +class LLPanelInventoryListItemBase : public LLPanel +{ +public: + static LLPanelInventoryListItemBase* create(LLViewerInventoryItem* item); + + virtual void draw(); + + /** + * Let item know it need to be refreshed in next draw() + */ + void setNeedsRefresh(bool needs_refresh){ mNeedsRefresh = needs_refresh; } + + bool getNeedsRefresh(){ return mNeedsRefresh; } + + /** + * Add widget to left side + */ + void addWidgetToLeftSide(const std::string& name, bool show_widget = true); + void addWidgetToLeftSide(LLUICtrl* ctrl, bool show_widget = true); + + /** + * Add widget to right side, widget is supposed to be child of calling panel + */ + void addWidgetToRightSide(const std::string& name, bool show_widget = true); + void addWidgetToRightSide(LLUICtrl* ctrl, bool show_widget = true); + + /** + * Mark widgets as visible. Only visible widgets take part in reshaping children + */ + void setShowWidget(const std::string& name, bool show); + void setShowWidget(LLUICtrl* ctrl, bool show); + + /** + * Set spacing between widgets during reshape + */ + void setWidgetSpacing(S32 spacing) { mWidgetSpacing = spacing; } + + S32 getWidgetSpacing() { return mWidgetSpacing; } + + /** + * Inheritors need to call base implementation of postBuild() + */ + /*virtual*/ BOOL postBuild(); + + /** + * Handles item selection + */ + /*virtual*/ void setValue(const LLSD& value); + + /** + * Handles filter request + */ + /*virtual*/ S32 notify(const LLSD& info); + + /* Highlights item */ + /*virtual*/ void onMouseEnter(S32 x, S32 y, MASK mask); + /* Removes item highlight */ + /*virtual*/ void onMouseLeave(S32 x, S32 y, MASK mask); + + /** Get the name of a corresponding inventory item */ + const std::string& getItemName() const; + + /** Get the asset type of a corresponding inventory item */ + LLAssetType::EType getType() const; + + /** Get the wearable type of a corresponding inventory item */ + LLWearableType::EType getWearableType() const; + + /** Get the description of a corresponding inventory item */ + const std::string& getDescription() const; + + /** Get the associated inventory item */ + LLViewerInventoryItem* getItem() const { return mItem; } + + virtual ~LLPanelInventoryListItemBase(){} + +protected: + + LLPanelInventoryListItemBase(LLViewerInventoryItem* item); + + typedef std::vector<LLUICtrl*> widget_array_t; + + /** + * Use it from a factory function to build panel, do not build panel in constructor + */ + virtual void init(); + + /** + * Called after inventory item was updated, update panel widgets to reflect inventory changes. + */ + virtual void updateItem(const std::string& name, + const LLStyle::Params& input_params = LLStyle::Params()); + + /** setter for mIconCtrl */ + void setIconCtrl(LLIconCtrl* icon) { mIconCtrl = icon; } + /** setter for MTitleCtrl */ + void setTitleCtrl(LLTextBox* tb) { mTitleCtrl = tb; } + + void setLeftWidgetsWidth(S32 width) { mLeftWidgetsWidth = width; } + void setRightWidgetsWidth(S32 width) { mRightWidgetsWidth = width; } + + /** + * Set all widgets from both side visible/invisible. Only enabled widgets + * (see setShowWidget()) can become visible + */ + virtual void setWidgetsVisible(bool visible); + + /** + * Reshape all child widgets - icon, text-box and side widgets + */ + virtual void reshapeWidgets(); + + /** set wearable type icon image */ + void setIconImage(const LLUIImagePtr& image); + + /** Set item title - inventory item name usually */ + virtual void setTitle(const std::string& title, + const std::string& highlit_text, + const LLStyle::Params& input_params = LLStyle::Params()); + + /** + * Show tool tip if item name text size > panel size + */ + virtual BOOL handleToolTip( S32 x, S32 y, MASK mask); + + LLViewerInventoryItem* mItem; + +private: + + /** reshape left side widgets + * Deprecated for now. Disabled reshape left for now to reserve space for 'delete' + * button in LLPanelClothingListItem according to Neal's comment (https://codereview.productengine.com/secondlife/r/325/) + */ + void reshapeLeftWidgets(); + + /** reshape right side widgets */ + void reshapeRightWidgets(); + + /** reshape remaining widgets */ + void reshapeMiddleWidgets(); + + + LLIconCtrl* mIconCtrl; + LLTextBox* mTitleCtrl; + + LLUIImagePtr mIconImage; + std::string mHighlightedText; + + widget_array_t mLeftSideWidgets; + widget_array_t mRightSideWidgets; + S32 mWidgetSpacing; + + S32 mLeftWidgetsWidth; + S32 mRightWidgetsWidth; + bool mNeedsRefresh; +}; + +////////////////////////////////////////////////////////////////////////// + +class LLInventoryItemsList : public LLFlatListViewEx +{ +public: + struct Params : public LLInitParam::Block<Params, LLFlatListViewEx::Params> + { + Params(); + }; + + virtual ~LLInventoryItemsList(); + + void refreshList(const LLDynamicArray<LLPointer<LLViewerInventoryItem> > item_array); + + boost::signals2::connection setRefreshCompleteCallback(const commit_signal_t::slot_type& cb); + + /** + * Let list know items need to be refreshed in next doIdle() + */ + void setNeedsRefresh(bool needs_refresh){ mNeedsRefresh = needs_refresh; } + + bool getNeedsRefresh(){ return mNeedsRefresh; } + + /** + * Sets the flag indicating that the list needs to be refreshed even if it is + * not currently visible. + */ + void setForceRefresh(bool force_refresh){ mForceRefresh = force_refresh; } + + /** + * Idle routine used to refresh the list regardless of the current list + * visibility, unlike draw() which is called only for the visible list. + * This is needed for example to filter items of the list hidden by closed + * accordion tab. + */ + void doIdle(); // Real idle routine + static void idle(void* user_data); // static glue to doIdle() + +protected: + friend class LLUICtrlFactory; + LLInventoryItemsList(const LLInventoryItemsList::Params& p); + + uuid_vec_t& getIDs() { return mIDs; } + + /** + * Refreshes list items, adds new items and removes deleted items. + * Called from doIdle() until all new items are added, + * maximum 50 items can be added during single call. + */ + void refresh(); + + /** + * Compute difference between new items and current items, fills 'vadded' with added items, + * 'vremoved' with removed items. See LLCommonUtils::computeDifference + */ + void computeDifference(const uuid_vec_t& vnew, uuid_vec_t& vadded, uuid_vec_t& vremoved); + + /** + * Add an item to the list + */ + virtual void addNewItem(LLViewerInventoryItem* item, bool rearrange = true); + +private: + uuid_vec_t mIDs; // IDs of items that were added in refreshList(). + // Will be used in refresh() to determine added and removed ids + bool mNeedsRefresh; + + bool mForceRefresh; + + commit_signal_t mRefreshCompleteSignal; +}; + +#endif //LL_LLINVENTORYITEMSLIST_H diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index 7ec976604a..b9e9f0fc0b 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -35,6 +35,7 @@ #include "llagent.h" #include "llagentwearables.h" +#include "llappearancemgr.h" #include "llinventorypanel.h" #include "llinventorybridge.h" #include "llinventoryfunctions.h" @@ -57,32 +58,16 @@ #include "process.h" #endif -BOOL LLInventoryModel::sBackgroundFetchActive = FALSE; -BOOL LLInventoryModel::sAllFoldersFetched = FALSE; -BOOL LLInventoryModel::sMyInventoryFetchStarted = FALSE; -BOOL LLInventoryModel::sLibraryFetchStarted = FALSE; -S32 LLInventoryModel::sNumFetchRetries = 0; -F32 LLInventoryModel::sMinTimeBetweenFetches = 0.3f; -F32 LLInventoryModel::sMaxTimeBetweenFetches = 10.f; -BOOL LLInventoryModel::sTimelyFetchPending = FALSE; -LLFrameTimer LLInventoryModel::sFetchTimer; -S16 LLInventoryModel::sBulkFetchCount = 0; -BOOL LLInventoryModel::sFirstTimeInViewer2 = TRUE; - // Increment this if the inventory contents change in a non-backwards-compatible way. // For viewer 2, the addition of link items makes a pre-viewer-2 cache incorrect. const S32 LLInventoryModel::sCurrentInvCacheVersion = 2; - -// RN: for some reason, using std::queue in the header file confuses the compiler which things it's an xmlrpc_queue -static std::deque<LLUUID> sFetchQueue; +BOOL LLInventoryModel::sFirstTimeInViewer2 = TRUE; ///---------------------------------------------------------------------------- /// Local function declarations, constants, enums, and typedefs ///---------------------------------------------------------------------------- //BOOL decompress_file(const char* src_filename, const char* dst_filename); -const F32 MAX_TIME_FOR_SINGLE_FETCH = 10.f; -const S32 MAX_FETCH_RETRIES = 10; const char CACHE_FORMAT_STRING[] = "%s.inv"; struct InventoryIDPtrLess @@ -335,30 +320,18 @@ void LLInventoryModel::unlockDirectDescendentArrays(const LLUUID& cat_id) // specifies 'type' as what it defaults to containing. The category is // not necessarily only for that type. *NOTE: This will create a new // inventory category on the fly if one does not exist. -const LLUUID LLInventoryModel::findCategoryUUIDForType(LLFolderType::EType t, bool create_folder, bool find_in_library) -{ - const LLUUID &rv = findCatUUID(t, find_in_library); - if(rv.isNull() && isInventoryUsable() && (create_folder && !find_in_library)) - { - const LLUUID &root_id = gInventory.getRootFolderID(); - if(root_id.notNull()) - { - return createNewCategory(root_id, t, LLStringUtil::null); - } - } - return rv; -} - -// Internal method which looks for a category with the specified -// preferred type. Returns LLUUID::null if not found. -const LLUUID &LLInventoryModel::findCatUUID(LLFolderType::EType preferred_type, bool find_in_library) const +const LLUUID LLInventoryModel::findCategoryUUIDForType(LLFolderType::EType preferred_type, + bool create_folder, + bool find_in_library) { + LLUUID rv = LLUUID::null; + const LLUUID &root_id = (find_in_library) ? gInventory.getLibraryRootFolderID() : gInventory.getRootFolderID(); if(LLFolderType::FT_ROOT_INVENTORY == preferred_type) { - return root_id; + rv = root_id; } - if(root_id.notNull()) + else if (root_id.notNull()) { cat_array_t* cats = NULL; cats = get_ptr_in_map(mParentChildCategoryTree, root_id); @@ -369,12 +342,21 @@ const LLUUID &LLInventoryModel::findCatUUID(LLFolderType::EType preferred_type, { if(cats->get(i)->getPreferredType() == preferred_type) { - return cats->get(i)->getUUID(); + rv = cats->get(i)->getUUID(); + break; } } } } - return LLUUID::null; + + if(rv.isNull() && isInventoryUsable() && (create_folder && !find_in_library)) + { + if(root_id.notNull()) + { + return createNewCategory(root_id, preferred_type, LLStringUtil::null); + } + } + return rv; } // Convenience function to create a new category. You could call @@ -585,6 +567,11 @@ const LLUUID& LLInventoryModel::getLinkedItemID(const LLUUID& object_id) const return item->getLinkedUUID(); } +LLViewerInventoryItem* LLInventoryModel::getLinkedItem(const LLUUID& object_id) const +{ + return object_id.notNull() ? getItem(getLinkedItemID(object_id)) : NULL; +} + LLInventoryModel::item_array_t LLInventoryModel::collectLinkedItems(const LLUUID& id, const LLUUID& start_folder_id) { @@ -599,27 +586,6 @@ LLInventoryModel::item_array_t LLInventoryModel::collectLinkedItems(const LLUUID return items; } -// Generates a string containing the path to the item specified by -// item_id. -void LLInventoryModel::appendPath(const LLUUID& id, std::string& path) const -{ - std::string temp; - const LLInventoryObject* obj = getObject(id); - LLUUID parent_id; - if(obj) parent_id = obj->getParentUUID(); - std::string forward_slash("/"); - while(obj) - { - obj = getCategory(parent_id); - if(obj) - { - temp.assign(forward_slash + obj->getName() + temp); - parent_id = obj->getParentUUID(); - } - } - path.append(temp); -} - bool LLInventoryModel::isInventoryUsable() const { bool result = false; @@ -755,8 +721,20 @@ U32 LLInventoryModel::updateItem(const LLViewerInventoryItem* item) // Valid UUID; set the item UUID and rename it new_item->setCreator(id); std::string avatar_name; - // Fetch the currect name - gCacheName->get(id, FALSE, boost::bind(&LLViewerInventoryItem::onCallingCardNameLookup, new_item.get(), _1, _2, _3)); + + if (gCacheName->getFullName(id, avatar_name)) + { + new_item->rename(avatar_name); + mask |= LLInventoryObserver::LABEL; + } + else + { + // Fetch the current name + gCacheName->get(id, FALSE, + boost::bind(&LLViewerInventoryItem::onCallingCardNameLookup, new_item.get(), + _1, _2, _3)); + } + } } else if (new_item->getType() == LLAssetType::AT_GESTURE) @@ -1040,98 +1018,6 @@ void LLInventoryModel::purgeDescendentsOf(const LLUUID& id) } } -void LLInventoryModel::deleteFromServer(LLDynamicArray<LLUUID>& category_ids, - LLDynamicArray<LLUUID>& item_ids) -{ - // Store off tre UUIDS of parents which are being deleted (thus no - // need to increment) and the parents which are being modified. We - // have to increment the version of the parent with each message - // sent upstream since the dataserver will increment each unique - // parent per update message. - std::set<LLUUID> ignore_parents; - update_map_t inc_parents; - - S32 i; - S32 count = category_ids.count(); - BOOL start_new_message = TRUE; - LLMessageSystem* msg = gMessageSystem; - LLPointer<LLViewerInventoryCategory> cat; - for(i = 0; i < count; i++) - { - if(start_new_message) - { - start_new_message = FALSE; - msg->newMessageFast(_PREHASH_RemoveInventoryObjects); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - } - LLUUID cat_id = category_ids.get(i); - - msg->nextBlockFast(_PREHASH_FolderData); - msg->addUUIDFast(_PREHASH_FolderID, cat_id); - cat = getCategory(cat_id); - ignore_parents.insert(cat_id); - addChangedMask(LLInventoryObserver::REMOVE | LLInventoryObserver::STRUCTURE, cat_id); - if(cat.notNull() && (ignore_parents.find(cat->getParentUUID())==ignore_parents.end())) - { - --inc_parents[cat->getParentUUID()]; - } - if(msg->isSendFullFast(_PREHASH_FolderData)) - { - start_new_message = TRUE; - msg->nextBlockFast(_PREHASH_ItemData); - msg->addUUIDFast(_PREHASH_ItemID, LLUUID::null); - gAgent.sendReliableMessage(); - accountForUpdate(inc_parents); - inc_parents.clear(); - } - } - - count = item_ids.count(); - std::set<LLUUID>::iterator not_ignored = ignore_parents.end(); - LLPointer<LLViewerInventoryItem> item; - if((0 == count) && (!start_new_message)) - { - msg->nextBlockFast(_PREHASH_ItemData); - msg->addUUIDFast(_PREHASH_ItemID, LLUUID::null); - } - for(i = 0; i < count; i++) - { - if(start_new_message) - { - start_new_message = FALSE; - msg->newMessageFast(_PREHASH_RemoveInventoryObjects); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - msg->nextBlockFast(_PREHASH_FolderData); - msg->addUUIDFast(_PREHASH_FolderID, LLUUID::null); - } - LLUUID item_id = item_ids.get(i); - msg->nextBlockFast(_PREHASH_ItemData); - msg->addUUIDFast(_PREHASH_ItemID, item_id); - item = getItem(item_id); - addChangedMask(LLInventoryObserver::REMOVE | LLInventoryObserver::STRUCTURE, item_id); - if(item.notNull() && (ignore_parents.find(item->getParentUUID()) == not_ignored)) - { - --inc_parents[item->getParentUUID()]; - } - if(msg->isSendFullFast(_PREHASH_ItemData)) - { - start_new_message = TRUE; - gAgent.sendReliableMessage(); - accountForUpdate(inc_parents); - inc_parents.clear(); - } - } - if(!start_new_message) - { - gAgent.sendReliableMessage(); - accountForUpdate(inc_parents); - } -} - // Add/remove an observer. If the observer is destroyed, be sure to // remove it. void LLInventoryModel::addObserver(LLInventoryObserver* observer) @@ -1222,29 +1108,7 @@ void LLInventoryModel::addChangedMask(U32 mask, const LLUUID& referent) } } -// This method to prepares a set of mock inventory which provides -// minimal functionality before the actual arrival of inventory. -/* -void LLInventoryModel::mock(const LLUUID& root_id) -{ - llinfos << "LLInventoryModel::mock() " << root_id << llendl; - if(root_id.isNull()) - { - llwarns << "Not a valid root id" << llendl; - return; - } - LLPointer<LLViewerInventoryCategory> cat = new LLViewerInventoryCategory( - root_id, - LLUUID::null, - LLAssetType::AT_CATEGORY, - LLFolderType::lookupNewCategoryName(LLFolderType::FT_ROOT_INVENTORY), - gAgent.getID()); - addCategory(cat); - gInventory.buildParentChildMap(); -} -*/ - -//If we get back a normal response, handle it here +// If we get back a normal response, handle it here void LLInventoryModel::fetchInventoryResponder::result(const LLSD& content) { start_new_inventory_observer(); @@ -1317,7 +1181,7 @@ void LLInventoryModel::fetchInventoryResponder::error(U32 status, const std::str gInventory.notifyObservers("fetchinventory"); } -bool LLInventoryModel::fetchDescendentsOf(const LLUUID& folder_id) +bool LLInventoryModel::fetchDescendentsOf(const LLUUID& folder_id) const { if(folder_id.isNull()) { @@ -1342,544 +1206,7 @@ bool LLInventoryModel::fetchDescendentsOf(const LLUUID& folder_id) //{ // known_descendents += items->count(); //} - return cat->fetchDescendents(); -} - -//Initialize statics. -bool LLInventoryModel::isBulkFetchProcessingComplete() -{ - return sFetchQueue.empty() && sBulkFetchCount<=0; -} - -class LLInventoryModelFetchDescendentsResponder: public LLHTTPClient::Responder -{ - public: - LLInventoryModelFetchDescendentsResponder(const LLSD& request_sd) : mRequestSD(request_sd) {}; - //LLInventoryModelFetchDescendentsResponder() {}; - void result(const LLSD& content); - void error(U32 status, const std::string& reason); - public: - typedef std::vector<LLViewerInventoryCategory*> folder_ref_t; - protected: - LLSD mRequestSD; -}; - -//If we get back a normal response, handle it here -void LLInventoryModelFetchDescendentsResponder::result(const LLSD& content) -{ - if (content.has("folders")) - { - - for(LLSD::array_const_iterator folder_it = content["folders"].beginArray(); - folder_it != content["folders"].endArray(); - ++folder_it) - { - LLSD folder_sd = *folder_it; - - - //LLUUID agent_id = folder_sd["agent_id"]; - - //if(agent_id != gAgent.getID()) //This should never happen. - //{ - // llwarns << "Got a UpdateInventoryItem for the wrong agent." - // << llendl; - // break; - //} - - LLUUID parent_id = folder_sd["folder_id"]; - LLUUID owner_id = folder_sd["owner_id"]; - S32 version = (S32)folder_sd["version"].asInteger(); - S32 descendents = (S32)folder_sd["descendents"].asInteger(); - LLPointer<LLViewerInventoryCategory> tcategory = new LLViewerInventoryCategory(owner_id); - - if (parent_id.isNull()) - { - LLPointer<LLViewerInventoryItem> titem = new LLViewerInventoryItem; - for(LLSD::array_const_iterator item_it = folder_sd["items"].beginArray(); - item_it != folder_sd["items"].endArray(); - ++item_it) - { - const LLUUID lost_uuid = gInventory.findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND); - if (lost_uuid.notNull()) - { - LLSD item = *item_it; - titem->unpackMessage(item); - - LLInventoryModel::update_list_t update; - LLInventoryModel::LLCategoryUpdate new_folder(lost_uuid, 1); - update.push_back(new_folder); - gInventory.accountForUpdate(update); - - titem->setParent(lost_uuid); - titem->updateParentOnServer(FALSE); - gInventory.updateItem(titem); - gInventory.notifyObservers("fetchDescendents"); - - } - } - } - - LLViewerInventoryCategory* pcat = gInventory.getCategory(parent_id); - if (!pcat) - { - continue; - } - - for(LLSD::array_const_iterator category_it = folder_sd["categories"].beginArray(); - category_it != folder_sd["categories"].endArray(); - ++category_it) - { - LLSD category = *category_it; - tcategory->fromLLSD(category); - - if (LLInventoryModel::sMyInventoryFetchStarted || - LLInventoryModel::sLibraryFetchStarted) - { - sFetchQueue.push_back(tcategory->getUUID()); - } - else if ( !gInventory.isCategoryComplete(tcategory->getUUID()) ) - { - gInventory.updateCategory(tcategory); - } - - } - LLPointer<LLViewerInventoryItem> titem = new LLViewerInventoryItem; - for(LLSD::array_const_iterator item_it = folder_sd["items"].beginArray(); - item_it != folder_sd["items"].endArray(); - ++item_it) - { - LLSD item = *item_it; - titem->unpackMessage(item); - - gInventory.updateItem(titem); - } - - // set version and descendentcount according to message. - LLViewerInventoryCategory* cat = gInventory.getCategory(parent_id); - if(cat) - { - cat->setVersion(version); - cat->setDescendentCount(descendents); - cat->determineFolderType(); - } - - } - } - - if (content.has("bad_folders")) - { - for(LLSD::array_const_iterator folder_it = content["bad_folders"].beginArray(); - folder_it != content["bad_folders"].endArray(); - ++folder_it) - { - LLSD folder_sd = *folder_it; - - //These folders failed on the dataserver. We probably don't want to retry them. - llinfos << "Folder " << folder_sd["folder_id"].asString() - << "Error: " << folder_sd["error"].asString() << llendl; - } - } - - LLInventoryModel::incrBulkFetch(-1); - - if (LLInventoryModel::isBulkFetchProcessingComplete()) - { - llinfos << "Inventory fetch completed" << llendl; - LLInventoryModel::setAllFoldersFetched(); - } - - gInventory.notifyObservers("fetchDescendents"); -} - -//If we get back an error (not found, etc...), handle it here -void LLInventoryModelFetchDescendentsResponder::error(U32 status, const std::string& reason) -{ - llinfos << "LLInventoryModelFetchDescendentsResponder::error " - << status << ": " << reason << llendl; - - LLInventoryModel::incrBulkFetch(-1); - - if (status==499) //timed out. Let's be awesome! - { - for(LLSD::array_const_iterator folder_it = mRequestSD["folders"].beginArray(); - folder_it != mRequestSD["folders"].endArray(); - ++folder_it) - { - LLSD folder_sd = *folder_it; - LLUUID folder_id = folder_sd["folder_id"]; - sFetchQueue.push_front(folder_id); - } - } - else - { - if (LLInventoryModel::isBulkFetchProcessingComplete()) - { - LLInventoryModel::setAllFoldersFetched(); - } - } - gInventory.notifyObservers("fetchDescendents"); -} - -//static Bundle up a bunch of requests to send all at once. -void LLInventoryModel::bulkFetch(std::string url) -{ - //Background fetch is called from gIdleCallbacks in a loop until background fetch is stopped. - //If there are items in sFetchQueue, we want to check the time since the last bulkFetch was - //sent. If it exceeds our retry time, go ahead and fire off another batch. - //Stopbackgroundfetch will be run from the Responder instead of here. - - S16 max_concurrent_fetches=8; - F32 new_min_time = 0.5f; //HACK! Clean this up when old code goes away entirely. - if (sMinTimeBetweenFetches < new_min_time) sMinTimeBetweenFetches=new_min_time; //HACK! See above. - - if(gDisconnected - || sBulkFetchCount > max_concurrent_fetches - || sFetchTimer.getElapsedTimeF32() < sMinTimeBetweenFetches) - { - return; // just bail if we are disconnected. - } - - U32 folder_count=0; - U32 max_batch_size=5; - - U32 sort_order = gSavedSettings.getU32("InventorySortOrder") & 0x1; - - LLSD body; - LLSD body_lib; - while( !(sFetchQueue.empty() ) && (folder_count < max_batch_size) ) - { - if (sFetchQueue.front().isNull()) //DEV-17797 - { - LLSD folder_sd; - folder_sd["folder_id"] = LLUUID::null.asString(); - folder_sd["owner_id"] = gAgent.getID(); - folder_sd["sort_order"] = (LLSD::Integer)sort_order; - folder_sd["fetch_folders"] = (LLSD::Boolean)FALSE; - folder_sd["fetch_items"] = (LLSD::Boolean)TRUE; - body["folders"].append(folder_sd); - folder_count++; - } - else - { - - - LLViewerInventoryCategory* cat = gInventory.getCategory(sFetchQueue.front()); - - if (cat) - { - if ( LLViewerInventoryCategory::VERSION_UNKNOWN == cat->getVersion()) - { - LLSD folder_sd; - folder_sd["folder_id"] = cat->getUUID(); - folder_sd["owner_id"] = cat->getOwnerID(); - folder_sd["sort_order"] = (LLSD::Integer)sort_order; - folder_sd["fetch_folders"] = TRUE; //(LLSD::Boolean)sFullFetchStarted; - folder_sd["fetch_items"] = (LLSD::Boolean)TRUE; - - if (ALEXANDRIA_LINDEN_ID == cat->getOwnerID()) - body_lib["folders"].append(folder_sd); - else - body["folders"].append(folder_sd); - folder_count++; - } - if (sMyInventoryFetchStarted || - sLibraryFetchStarted) - { //Already have this folder but append child folders to list. - // add all children to queue - parent_cat_map_t::iterator cat_it = gInventory.mParentChildCategoryTree.find(cat->getUUID()); - if (cat_it != gInventory.mParentChildCategoryTree.end()) - { - cat_array_t* child_categories = cat_it->second; - - for (S32 child_num = 0; child_num < child_categories->count(); child_num++) - { - sFetchQueue.push_back(child_categories->get(child_num)->getUUID()); - } - } - - } - } - } - sFetchQueue.pop_front(); - } - - if (folder_count > 0) - { - sBulkFetchCount++; - if (body["folders"].size()) - { - LLHTTPClient::post(url, body, new LLInventoryModelFetchDescendentsResponder(body),300.0); - } - if (body_lib["folders"].size()) - { - std::string url_lib = gAgent.getRegion()->getCapability("FetchLibDescendents"); - LLHTTPClient::post(url_lib, body_lib, new LLInventoryModelFetchDescendentsResponder(body_lib),300.0); - } - sFetchTimer.reset(); - } - else if (isBulkFetchProcessingComplete()) - { - setAllFoldersFetched(); - } -} - -bool fetchQueueContainsNoDescendentsOf(const LLUUID& cat_id) -{ - for (std::deque<LLUUID>::iterator it = sFetchQueue.begin(); - it != sFetchQueue.end(); ++it) - { - const LLUUID& fetch_id = *it; - if (gInventory.isObjectDescendentOf(fetch_id, cat_id)) - return false; - } - return true; -} - -/* static */ -bool LLInventoryModel::libraryFetchStarted() -{ - return sLibraryFetchStarted; -} - -/* static */ -bool LLInventoryModel::libraryFetchCompleted() -{ - return libraryFetchStarted() && fetchQueueContainsNoDescendentsOf(gInventory.getLibraryRootFolderID()); -} - -/* static */ -bool LLInventoryModel::libraryFetchInProgress() -{ - return libraryFetchStarted() && !libraryFetchCompleted(); -} - -/* static */ -bool LLInventoryModel::myInventoryFetchStarted() -{ - return sMyInventoryFetchStarted; -} - -/* static */ -bool LLInventoryModel::myInventoryFetchCompleted() -{ - return myInventoryFetchStarted() && fetchQueueContainsNoDescendentsOf(gInventory.getRootFolderID()); -} - -/* static */ -bool LLInventoryModel::myInventoryFetchInProgress() -{ - return myInventoryFetchStarted() && !myInventoryFetchCompleted(); -} - -// static -bool LLInventoryModel::isEverythingFetched() -{ - return sAllFoldersFetched; -} - -//static -BOOL LLInventoryModel::backgroundFetchActive() -{ - return sBackgroundFetchActive; -} - -void LLInventoryModel::startBackgroundFetch(const LLUUID& cat_id) -{ - if (!sAllFoldersFetched) - { - sBackgroundFetchActive = TRUE; - if (cat_id.isNull()) - { - if (!sMyInventoryFetchStarted) - { - sMyInventoryFetchStarted = TRUE; - sFetchQueue.push_back(gInventory.getRootFolderID()); - gIdleCallbacks.addFunction(&LLInventoryModel::backgroundFetch, NULL); - } - if (!sLibraryFetchStarted) - { - sLibraryFetchStarted = TRUE; - sFetchQueue.push_back(gInventory.getLibraryRootFolderID()); - gIdleCallbacks.addFunction(&LLInventoryModel::backgroundFetch, NULL); - } - } - else - { - // specific folder requests go to front of queue - if (sFetchQueue.empty() || sFetchQueue.front() != cat_id) - { - sFetchQueue.push_front(cat_id); - gIdleCallbacks.addFunction(&LLInventoryModel::backgroundFetch, NULL); - } - if (cat_id == gInventory.getLibraryRootFolderID()) - { - sLibraryFetchStarted = TRUE; - } - if (cat_id == gInventory.getRootFolderID()) - { - sMyInventoryFetchStarted = TRUE; - } - } - } -} - -//static -void LLInventoryModel::findLostItems() -{ - sBackgroundFetchActive = TRUE; - sFetchQueue.push_back(LLUUID::null); - gIdleCallbacks.addFunction(&LLInventoryModel::backgroundFetch, NULL); -} - -//static -void LLInventoryModel::stopBackgroundFetch() -{ - if (sBackgroundFetchActive) - { - sBackgroundFetchActive = FALSE; - gIdleCallbacks.deleteFunction(&LLInventoryModel::backgroundFetch, NULL); - sBulkFetchCount=0; - sMinTimeBetweenFetches=0.0f; - } -} - -// static -void LLInventoryModel::setAllFoldersFetched() -{ - if (sMyInventoryFetchStarted && - sLibraryFetchStarted) - { - sAllFoldersFetched = TRUE; - } - stopBackgroundFetch(); -} - -//static -void LLInventoryModel::backgroundFetch(void*) -{ - if (sBackgroundFetchActive && gAgent.getRegion()) - { - //If we'll be using the capability, we'll be sending batches and the background thing isn't as important. - std::string url = gAgent.getRegion()->getCapability("WebFetchInventoryDescendents"); - if (!url.empty()) - { - bulkFetch(url); - return; - } - - //DEPRECATED OLD CODE FOLLOWS. - // no more categories to fetch, stop fetch process - if (sFetchQueue.empty()) - { - llinfos << "Inventory fetch completed" << llendl; - - setAllFoldersFetched(); - return; - } - - F32 fast_fetch_time = lerp(sMinTimeBetweenFetches, sMaxTimeBetweenFetches, 0.1f); - F32 slow_fetch_time = lerp(sMinTimeBetweenFetches, sMaxTimeBetweenFetches, 0.5f); - if (sTimelyFetchPending && sFetchTimer.getElapsedTimeF32() > slow_fetch_time) - { - // double timeouts on failure - sMinTimeBetweenFetches = llmin(sMinTimeBetweenFetches * 2.f, 10.f); - sMaxTimeBetweenFetches = llmin(sMaxTimeBetweenFetches * 2.f, 120.f); - llinfos << "Inventory fetch times grown to (" << sMinTimeBetweenFetches << ", " << sMaxTimeBetweenFetches << ")" << llendl; - // fetch is no longer considered "timely" although we will wait for full time-out - sTimelyFetchPending = FALSE; - } - - while(1) - { - if (sFetchQueue.empty()) - { - break; - } - - if(gDisconnected) - { - // just bail if we are disconnected. - break; - } - - LLViewerInventoryCategory* cat = gInventory.getCategory(sFetchQueue.front()); - - // category has been deleted, remove from queue. - if (!cat) - { - sFetchQueue.pop_front(); - continue; - } - - if (sFetchTimer.getElapsedTimeF32() > sMinTimeBetweenFetches && - LLViewerInventoryCategory::VERSION_UNKNOWN == cat->getVersion()) - { - // category exists but has no children yet, fetch the descendants - // for now, just request every time and rely on retry timer to throttle - if (cat->fetchDescendents()) - { - sFetchTimer.reset(); - sTimelyFetchPending = TRUE; - } - else - { - // The catagory also tracks if it has expired and here it says it hasn't - // yet. Get out of here because nothing is going to happen until we - // update the timers. - break; - } - } - // do I have all my children? - else if (gInventory.isCategoryComplete(sFetchQueue.front())) - { - // finished with this category, remove from queue - sFetchQueue.pop_front(); - - // add all children to queue - parent_cat_map_t::iterator cat_it = gInventory.mParentChildCategoryTree.find(cat->getUUID()); - if (cat_it != gInventory.mParentChildCategoryTree.end()) - { - cat_array_t* child_categories = cat_it->second; - - for (S32 child_num = 0; child_num < child_categories->count(); child_num++) - { - sFetchQueue.push_back(child_categories->get(child_num)->getUUID()); - } - } - - // we received a response in less than the fast time - if (sTimelyFetchPending && sFetchTimer.getElapsedTimeF32() < fast_fetch_time) - { - // shrink timeouts based on success - sMinTimeBetweenFetches = llmax(sMinTimeBetweenFetches * 0.8f, 0.3f); - sMaxTimeBetweenFetches = llmax(sMaxTimeBetweenFetches * 0.8f, 10.f); - //llinfos << "Inventory fetch times shrunk to (" << sMinTimeBetweenFetches << ", " << sMaxTimeBetweenFetches << ")" << llendl; - } - - sTimelyFetchPending = FALSE; - continue; - } - else if (sFetchTimer.getElapsedTimeF32() > sMaxTimeBetweenFetches) - { - // received first packet, but our num descendants does not match db's num descendants - // so try again later - LLUUID fetch_id = sFetchQueue.front(); - sFetchQueue.pop_front(); - - if (sNumFetchRetries++ < MAX_FETCH_RETRIES) - { - // push on back of queue - sFetchQueue.push_back(fetch_id); - } - sTimelyFetchPending = FALSE; - sFetchTimer.reset(); - break; - } - - // not enough time has elapsed to do a new fetch - break; - } - } + return cat->fetch(); } void LLInventoryModel::cache( @@ -1935,25 +1262,26 @@ void LLInventoryModel::addCategory(LLViewerInventoryCategory* category) void LLInventoryModel::addItem(LLViewerInventoryItem* item) { - //llinfos << "LLInventoryModel::addItem()" << llendl; - - // This can happen if assettype enums from llassettype.h ever change. - // For example, there is a known backwards compatibility issue in some viewer prototypes prior to when - // the AT_LINK enum changed from 23 to 24. - if ((item->getType() == LLAssetType::AT_NONE) - || LLAssetType::lookup(item->getType()) == LLAssetType::badLookup()) - { - llwarns << "Got bad asset type for item [ name: " << item->getName() << " type: " << item->getType() << " inv-type: " << item->getInventoryType() << " ], ignoring." << llendl; - return; - } + llassert(item); if(item) { + // This can happen if assettype enums from llassettype.h ever change. + // For example, there is a known backwards compatibility issue in some viewer prototypes prior to when + // the AT_LINK enum changed from 23 to 24. + if ((item->getType() == LLAssetType::AT_NONE) + || LLAssetType::lookup(item->getType()) == LLAssetType::badLookup()) + { + llwarns << "Got bad asset type for item [ name: " << item->getName() << " type: " << item->getType() << " inv-type: " << item->getInventoryType() << " ], ignoring." << llendl; + return; + } + // This condition means that we tried to add a link without the baseobj being in memory. // The item will show up as a broken link. if (item->getIsBrokenLink()) { llinfos << "Adding broken link [ name: " << item->getName() << " itemID: " << item->getUUID() << " assetID: " << item->getAssetUUID() << " ) parent: " << item->getParentUUID() << llendl; } + mItemMap[item->getUUID()] = item; } } @@ -2386,88 +1714,6 @@ bool LLInventoryModel::loadSkeleton( return rv; } -bool LLInventoryModel::loadMeat(const LLSD& options, const LLUUID& owner_id) -{ - llinfos << "importing inventory for " << owner_id << llendl; - bool rv = true; - for(LLSD::array_const_iterator it = options.beginArray(), - end = options.endArray(); it != end; ++it) - { - LLSD name = (*it)["name"]; - LLSD item_id = (*it)["item_id"]; - LLSD parent_id = (*it)["parent_id"]; - LLSD asset_type = (*it)["type"]; - LLSD data_id = (*it)["data_id"]; - if(name.isDefined() - && item_id.isDefined() - && parent_id.isDefined() - && asset_type.isDefined() - && data_id.isDefined()) - { - LLPointer<LLViewerInventoryItem> item = new LLViewerInventoryItem; - item->rename(name.asString()); - item->setUUID(item_id.asUUID()); - item->setParent(parent_id.asUUID()); - LLAssetType::EType type = (LLAssetType::EType)asset_type.asInteger(); - item->setType(type); - - LLSD llsd_inv_type = (*it)["inv_type"]; - if(llsd_inv_type.isDefined()) - { - LLInventoryType::EType inv_type = (LLInventoryType::EType)llsd_inv_type.asInteger(); - item->setInventoryType(inv_type); - } - - if(LLAssetType::AT_CALLINGCARD == type) - { - LLPermissions perm; - perm.init(data_id.asUUID(), owner_id, LLUUID::null, LLUUID::null); - item->setPermissions(perm); - } - else - { - LLPermissions default_perm; - default_perm.init(LLUUID::null, owner_id, LLUUID::null, LLUUID::null); - LLSD llsd_perm_mask = (*it)["perm_mask"]; - if(llsd_perm_mask.isDefined()) - { - PermissionMask perm_mask = llsd_perm_mask.asInteger(); - default_perm.initMasks( - perm_mask, perm_mask, perm_mask, perm_mask, perm_mask); - } - else - { - default_perm.initMasks( - PERM_NONE, PERM_NONE, PERM_NONE, PERM_NONE, PERM_NONE); - } - item->setPermissions(default_perm); - item->setAssetUUID(data_id.asUUID()); - } - - LLSD flags = (*it)["flags"]; - if(flags.isDefined()) - { - // Not sure how well LLSD.asInteger() maps to - // unsigned long - using strtoul() - item->setFlags(strtoul(flags.asString().c_str(), NULL, 0)); - } - - LLSD time = (*it)["time"]; - if(time.isDefined()) - { - item->setCreationDate(time.asInteger()); - } - addItem(item); - } - else - { - llwarns << "Unable to import near " << name.asString() << llendl; - rv = false; - } - } - return rv; -} - // This is a brute force method to rebuild the entire parent-child // relations. The overall operation has O(NlogN) performance, which // should be sufficient for our needs. @@ -2592,7 +1838,7 @@ void LLInventoryModel::buildParentChildMap() } count = items.count(); lost = 0; - std::vector<LLUUID> lost_item_ids; + uuid_vec_t lost_item_ids; for(i = 0; i < count; ++i) { LLPointer<LLViewerInventoryItem> item; @@ -2631,7 +1877,7 @@ void LLInventoryModel::buildParentChildMap() LLMessageSystem* msg = gMessageSystem; BOOL start_new_message = TRUE; const LLUUID lnf = findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND); - for(std::vector<LLUUID>::iterator it = lost_item_ids.begin() ; it < lost_item_ids.end(); ++it) + for(uuid_vec_t::iterator it = lost_item_ids.begin() ; it < lost_item_ids.end(); ++it) { if(start_new_message) { @@ -2735,73 +1981,6 @@ bool LLUUIDAndName::operator>(const LLUUIDAndName& rhs) const return (mID > rhs.mID); } -// Given the current state of the inventory items, figure out the -// clone information. *FIX: This is sub-optimal, since we can insert -// this information snurgically, but this makes sure the implementation -// works before we worry about optimization. -//void LLInventoryModel::recalculateCloneInformation() -//{ -// //dumpInventory(); -// -// // This implements a 'multi-map' like structure to keep track of -// // how many clones we find. -// typedef LLDynamicArray<LLViewerInventoryItem*> viewer_item_array_t; -// typedef std::map<LLUUIDAndName, viewer_item_array_t*> clone_map_t; -// clone_map_t clone_map; -// LLUUIDAndName id_and_name; -// viewer_item_array_t* clones = NULL; -// LLViewerInventoryItem* item = NULL; -// for(item = (LLViewerInventoryItem*)mItemMap.getFirstData(); -// item != NULL; -// item = (LLViewerInventoryItem*)mItemMap.getNextData()) -// { -// if(item->getType() == LLAssetType::AT_CALLINGCARD) -// { -// // if it's a calling card, we key off of the creator id, not -// // the asset id. -// id_and_name.mID = item->getCreatorUUID(); -// } -// else -// { -// // if it's not a calling card, we key clones from the -// // asset id. -// id_and_name.mID = item->getAssetUUID(); -// } -// if(id_and_name.mID == LLUUID::null) -// { -// continue; -// } -// id_and_name.mName = item->getName(); -// if(clone_map.checkData(id_and_name)) -// { -// clones = clone_map.getData(id_and_name); -// } -// else -// { -// clones = new viewer_item_array_t; -// clone_map.addData(id_and_name, clones); -// } -// clones->put(item); -// } -// -// S32 count = 0; -// for(clones = clone_map.getFirstData(); -// clones != NULL; -// clones = clone_map.getNextData()) -// { -// count = clones->count(); -// for(S32 i = 0; i < count; i++) -// { -// item = clones->get(i); -// item->setCloneCount(count - 1); -// //clones[i] = NULL; -// } -// delete clones; -// } -// clone_map.removeAllData(); -// //dumpInventory(); -//} - // static bool LLInventoryModel::loadFromFile(const std::string& filename, LLInventoryModel::cat_array_t& categories, @@ -3091,7 +2270,7 @@ void LLInventoryModel::processRemoveInventoryItem(LLMessageSystem* msg, void**) return; } S32 count = msg->getNumberOfBlocksFast(_PREHASH_InventoryData); - std::vector<LLUUID> item_ids; + uuid_vec_t item_ids; update_map_t update; for(S32 i = 0; i < count; ++i) { @@ -3107,7 +2286,7 @@ void LLInventoryModel::processRemoveInventoryItem(LLMessageSystem* msg, void**) } } gInventory.accountForUpdate(update); - for(std::vector<LLUUID>::iterator it = item_ids.begin(); it != item_ids.end(); ++it) + for(uuid_vec_t::iterator it = item_ids.begin(); it != item_ids.end(); ++it) { gInventory.deleteObject(*it); } @@ -3187,7 +2366,7 @@ void LLInventoryModel::processRemoveInventoryFolder(LLMessageSystem* msg, << llendl; return; } - std::vector<LLUUID> folder_ids; + uuid_vec_t folder_ids; update_map_t update; S32 count = msg->getNumberOfBlocksFast(_PREHASH_FolderData); for(S32 i = 0; i < count; ++i) @@ -3201,7 +2380,7 @@ void LLInventoryModel::processRemoveInventoryFolder(LLMessageSystem* msg, } } gInventory.accountForUpdate(update); - for(std::vector<LLUUID>::iterator it = folder_ids.begin(); it != folder_ids.end(); ++it) + for(uuid_vec_t::iterator it = folder_ids.begin(); it != folder_ids.end(); ++it) { gInventory.deleteObject(*it); } @@ -3268,7 +2447,9 @@ void LLInventoryModel::processBulkUpdateInventory(LLMessageSystem* msg, void**) } LLUUID tid; msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_TransactionID, tid); +#ifndef LL_RELEASE_FOR_DOWNLOAD llinfos << "Bulk inventory: " << tid << llendl; +#endif update_map_t update; cat_array_t folders; @@ -3314,7 +2495,7 @@ void LLInventoryModel::processBulkUpdateInventory(LLMessageSystem* msg, void**) count = msg->getNumberOfBlocksFast(_PREHASH_ItemData); - std::vector<LLUUID> wearable_ids; + uuid_vec_t wearable_ids; item_array_t items; std::list<InventoryCallbackInfo> cblist; for(i = 0; i < count; ++i) @@ -3389,7 +2570,7 @@ void LLInventoryModel::processBulkUpdateInventory(LLMessageSystem* msg, void**) { LLViewerInventoryItem* wearable_item; wearable_item = gInventory.getItem(wearable_ids[i]); - wear_inventory_item_on_avatar(wearable_item); + LLAppearanceMgr::instance().wearItemOnAvatar(wearable_item->getUUID(), true, true); } } @@ -3647,6 +2828,10 @@ static LLInventoryModel::item_array_t::iterator find_item_iter_by_uuid(LLInvento } // static +// * @param[in, out] items - vector with items to be updated. It should be sorted in a right way +// * before calling this method. +// * @param src_item_id - LLUUID of inventory item to be moved in new position +// * @param dest_item_id - LLUUID of inventory item before which source item should be placed. void LLInventoryModel::updateItemsOrder(LLInventoryModel::item_array_t& items, const LLUUID& src_item_id, const LLUUID& dest_item_id) { LLInventoryModel::item_array_t::iterator it_src = find_item_iter_by_uuid(items, src_item_id); @@ -3662,6 +2847,7 @@ void LLInventoryModel::updateItemsOrder(LLInventoryModel::item_array_t& items, c items.insert(it_dest, src_item); } +//* @param[in] items vector of items in order to be saved. void LLInventoryModel::saveItemsOrder(const LLInventoryModel::item_array_t& items) { int sortField = 0; @@ -3705,6 +2891,8 @@ static void rearrange_item_order_by_sort_field(LLInventoryModel::item_array_t& i std::sort(items.begin(), items.end(), sort_functor); } +// * @param source_item_id - LLUUID of the source item to be moved into new position +// * @param target_item_id - LLUUID of the target item before which source item should be placed. void LLInventoryModel::rearrangeFavoriteLandmarks(const LLUUID& source_item_id, const LLUUID& target_item_id) { LLInventoryModel::cat_array_t cats; @@ -3761,207 +2949,6 @@ void LLInventoryModel::dumpInventory() const } ///---------------------------------------------------------------------------- -/// LLInventoryCollectFunctor implementations -///---------------------------------------------------------------------------- - -// static -bool LLInventoryCollectFunctor::itemTransferCommonlyAllowed(LLInventoryItem* item) -{ - if (!item) - return false; - - bool allowed = false; - LLVOAvatarSelf* my_avatar = NULL; - - switch(item->getType()) - { - case LLAssetType::AT_CALLINGCARD: - // not allowed - break; - - case LLAssetType::AT_OBJECT: - my_avatar = gAgent.getAvatarObject(); - if(my_avatar && !my_avatar->isWearingAttachment(item->getUUID())) - { - allowed = true; - } - break; - - case LLAssetType::AT_BODYPART: - case LLAssetType::AT_CLOTHING: - if(!gAgentWearables.isWearingItem(item->getUUID())) - { - allowed = true; - } - break; - - default: - allowed = true; - break; - } - - return allowed; -} - -bool LLIsType::operator()(LLInventoryCategory* cat, LLInventoryItem* item) -{ - if(mType == LLAssetType::AT_CATEGORY) - { - if(cat) return TRUE; - } - if(item) - { - if(item->getType() == mType) return TRUE; - } - return FALSE; -} - -bool LLIsNotType::operator()(LLInventoryCategory* cat, LLInventoryItem* item) -{ - if(mType == LLAssetType::AT_CATEGORY) - { - if(cat) return FALSE; - } - if(item) - { - if(item->getType() == mType) return FALSE; - else return TRUE; - } - return TRUE; -} - -bool LLIsTypeWithPermissions::operator()(LLInventoryCategory* cat, LLInventoryItem* item) -{ - if(mType == LLAssetType::AT_CATEGORY) - { - if(cat) - { - return TRUE; - } - } - if(item) - { - if(item->getType() == mType) - { - LLPermissions perm = item->getPermissions(); - if ((perm.getMaskBase() & mPerm) == mPerm) - { - return TRUE; - } - } - } - return FALSE; -} - - -//bool LLIsClone::operator()(LLInventoryCategory* cat, LLInventoryItem* item) -//{ -// if(cat) return FALSE; -// if(item) -// { -// if(mItemMap->getType() == LLAssetType::AT_CALLINGCARD) -// { -// if((item->getType() == LLAssetType::AT_CALLINGCARD) -// && !(item->getCreatorUUID().isNull()) -// && (item->getCreatorUUID() == mItemMap->getCreatorUUID())) -// { -// return TRUE; -// } -// } -// else -// { -// if((item->getType() == mItemMap->getType()) -// && !(item->getAssetUUID().isNull()) -// && (item->getAssetUUID() == mItemMap->getAssetUUID()) -// && (item->getName() == mItemMap->getName())) -// { -// return TRUE; -// } -// } -// } -// return FALSE; -//} - -bool LLBuddyCollector::operator()(LLInventoryCategory* cat, - LLInventoryItem* item) -{ - if(item) - { - if((LLAssetType::AT_CALLINGCARD == item->getType()) - && (!item->getCreatorUUID().isNull()) - && (item->getCreatorUUID() != gAgent.getID())) - { - return true; - } - } - return false; -} - - -bool LLUniqueBuddyCollector::operator()(LLInventoryCategory* cat, - LLInventoryItem* item) -{ - if(item) - { - if((LLAssetType::AT_CALLINGCARD == item->getType()) - && (item->getCreatorUUID().notNull()) - && (item->getCreatorUUID() != gAgent.getID())) - { - mSeen.insert(item->getCreatorUUID()); - return true; - } - } - return false; -} - - -bool LLParticularBuddyCollector::operator()(LLInventoryCategory* cat, - LLInventoryItem* item) -{ - if(item) - { - if((LLAssetType::AT_CALLINGCARD == item->getType()) - && (item->getCreatorUUID() == mBuddyID)) - { - return TRUE; - } - } - return FALSE; -} - - -bool LLNameCategoryCollector::operator()( - LLInventoryCategory* cat, LLInventoryItem* item) -{ - if(cat) - { - if (!LLStringUtil::compareInsensitive(mName, cat->getName())) - { - return true; - } - } - return false; -} - -///---------------------------------------------------------------------------- -/// LLAssetIDMatches -///---------------------------------------------------------------------------- -bool LLAssetIDMatches::operator()(LLInventoryCategory* cat, LLInventoryItem* item) -{ - return (item && item->getAssetUUID() == mAssetID); -} - -///---------------------------------------------------------------------------- -/// LLLinkedItemIDMatches -///---------------------------------------------------------------------------- -bool LLLinkedItemIDMatches::operator()(LLInventoryCategory* cat, LLInventoryItem* item) -{ - return (item && - (item->getIsLinkType()) && - (item->getLinkedUUID() == mBaseItemID)); // A linked item's assetID will be the compared-to item's itemID. -} - -///---------------------------------------------------------------------------- /// Local function definitions ///---------------------------------------------------------------------------- diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h index 2a2b48ce3c..7b56d0bdd1 100644 --- a/indra/newview/llinventorymodel.h +++ b/indra/newview/llinventorymodel.h @@ -58,17 +58,15 @@ class LLMessageSystem; class LLInventoryCollectFunctor; -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// Class LLInventoryModel +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// LLInventoryModel // -// This class represents a collection of inventory, and provides -// efficient ways to access that information. This class could in -// theory be used for any place where you need inventory, though it -// optimizes for time efficiency - not space efficiency, probably -// making it inappropriate for use on tasks. -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - +// Represents a collection of inventory, and provides efficient ways to access +// that information. +// NOTE: This class could in theory be used for any place where you need +// inventory, though it optimizes for time efficiency - not space efficiency, +// probably making it inappropriate for use on tasks. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ class LLInventoryModel { public: @@ -81,83 +79,132 @@ public: CHILDREN_MAYBE }; - // These are used a lot... typedef LLDynamicArray<LLPointer<LLViewerInventoryCategory> > cat_array_t; typedef LLDynamicArray<LLPointer<LLViewerInventoryItem> > item_array_t; typedef std::set<LLUUID> changed_items_t; - - // construction & destruction - LLInventoryModel(); - ~LLInventoryModel(); - - void cleanupInventory(); - + class fetchInventoryResponder : public LLHTTPClient::Responder { public: fetchInventoryResponder(const LLSD& request_sd) : mRequestSD(request_sd) {}; void result(const LLSD& content); - void error(U32 status, const std::string& reason); - - public: - typedef std::vector<LLViewerInventoryCategory*> folder_ref_t; protected: LLSD mRequestSD; }; - // - // Accessors - // +/******************************************************************************** + ** ** + ** INITIALIZATION/SETUP + **/ - // Check if one object has a parent chain up to the category specified by UUID. - BOOL isObjectDescendentOf(const LLUUID& obj_id, const LLUUID& cat_id) const; + //-------------------------------------------------------------------- + // Constructors / Destructors + //-------------------------------------------------------------------- +public: + LLInventoryModel(); + ~LLInventoryModel(); + void cleanupInventory(); +protected: + void empty(); // empty the entire contents - // Get whatever special folder this object is a child of, if any. - const LLViewerInventoryCategory *getFirstNondefaultParent(const LLUUID& obj_id) const; + //-------------------------------------------------------------------- + // Initialization + //-------------------------------------------------------------------- +public: + // The inventory model usage is sensitive to the initial construction of the model + bool isInventoryUsable() const; +private: + bool mIsAgentInvUsable; // used to handle an invalid inventory state - // Get the object by id. Returns NULL if not found. - // * WARNING: use the pointer returned for read operations - do - // not modify the object values in place or you will break stuff. - LLInventoryObject* getObject(const LLUUID& id) const; + //-------------------------------------------------------------------- + // Root Folders + //-------------------------------------------------------------------- +public: + // The following are set during login with data from the server + void setRootFolderID(const LLUUID& id); + void setLibraryOwnerID(const LLUUID& id); + void setLibraryRootFolderID(const LLUUID& id); - // Get the item by id. Returns NULL if not found. - // * WARNING: use the pointer for read operations - use the - // updateItem() method to actually modify values. - LLViewerInventoryItem* getItem(const LLUUID& id) const; + const LLUUID &getRootFolderID() const; + const LLUUID &getLibraryOwnerID() const; + const LLUUID &getLibraryRootFolderID() const; +private: + LLUUID mRootFolderID; + LLUUID mLibraryRootFolderID; + LLUUID mLibraryOwnerID; + + //-------------------------------------------------------------------- + // Structure + //-------------------------------------------------------------------- +public: + // Methods to load up inventory skeleton & meat. These are used + // during authentication. Returns true if everything parsed. + bool loadSkeleton(const LLSD& options, const LLUUID& owner_id); + void buildParentChildMap(); // brute force method to rebuild the entire parent-child relations + // Call on logout to save a terse representation. + void cache(const LLUUID& parent_folder_id, const LLUUID& agent_id); +private: + // Information for tracking the actual inventory. We index this + // information in a lot of different ways so we can access + // the inventory using several different identifiers. + // mInventory member data is the 'master' list of inventory, and + // mCategoryMap and mItemMap store uuid->object mappings. + typedef std::map<LLUUID, LLPointer<LLViewerInventoryCategory> > cat_map_t; + typedef std::map<LLUUID, LLPointer<LLViewerInventoryItem> > item_map_t; + cat_map_t mCategoryMap; + item_map_t mItemMap; + // This last set of indices is used to map parents to children. + typedef std::map<LLUUID, cat_array_t*> parent_cat_map_t; + typedef std::map<LLUUID, item_array_t*> parent_item_map_t; + parent_cat_map_t mParentChildCategoryTree; + parent_item_map_t mParentChildItemTree; - // Get the category by id. Returns NULL if not found. - // * WARNING: use the pointer for read operations - use the - // updateCategory() method to actually modify values. - LLViewerInventoryCategory* getCategory(const LLUUID& id) const; + //-------------------------------------------------------------------- + // Login + //-------------------------------------------------------------------- +public: + static BOOL getIsFirstTimeInViewer2(); +private: + static BOOL sFirstTimeInViewer2; + const static S32 sCurrentInvCacheVersion; // expected inventory cache version - // Return the number of items or categories - S32 getItemCount() const; - S32 getCategoryCount() const; +/** Initialization/Setup + ** ** + *******************************************************************************/ + +/******************************************************************************** + ** ** + ** ACCESSORS + **/ + + //-------------------------------------------------------------------- + // Descendents + //-------------------------------------------------------------------- +public: + // Make sure we have the descendents in the structure. Returns true + // if a fetch was performed. + bool fetchDescendentsOf(const LLUUID& folder_id) const; // Return the direct descendents of the id provided.Set passed // in values to NULL if the call fails. - // *WARNING: The array provided points straight into the guts of - // this object, and should only be used for read operations, since - // modifications may invalidate the internal state of the - // inventory. + // NOTE: The array provided points straight into the guts of + // this object, and should only be used for read operations, since + // modifications may invalidate the internal state of the inventory. void getDirectDescendentsOf(const LLUUID& cat_id, cat_array_t*& categories, item_array_t*& items) const; - // SJB: Added version to lock the arrays to catch potential logic bugs - void lockDirectDescendentArrays(const LLUUID& cat_id, - cat_array_t*& categories, - item_array_t*& items); - void unlockDirectDescendentArrays(const LLUUID& cat_id); - // Starting with the object specified, add its descendents to the // array provided, but do not add the inventory object specified - // by id. There is no guaranteed order. Neither array will be - // erased before adding objects to it. Do not store a copy of the - // pointers collected - use them, and collect them again later if - // you need to reference the same objects. - enum { EXCLUDE_TRASH = FALSE, INCLUDE_TRASH = TRUE }; + // by id. There is no guaranteed order. + // NOTE: Neither array will be erased before adding objects to it. + // Do not store a copy of the pointers collected - use them, and + // collect them again later if you need to reference the same objects. + enum { + EXCLUDE_TRASH = FALSE, + INCLUDE_TRASH = TRUE + }; void collectDescendents(const LLUUID& id, cat_array_t& categories, item_array_t& items, @@ -173,156 +220,163 @@ public: // Assumes item_id is itself not a linked item. item_array_t collectLinkedItems(const LLUUID& item_id, const LLUUID& start_folder_id = LLUUID::null); + + + // Check if one object has a parent chain up to the category specified by UUID. + BOOL isObjectDescendentOf(const LLUUID& obj_id, const LLUUID& cat_id) const; + + //-------------------------------------------------------------------- + // Find + //-------------------------------------------------------------------- +public: + // Returns the uuid of the category that specifies 'type' as what it + // defaults to containing. The category is not necessarily only for that type. + // NOTE: If create_folder is true, this will create a new inventory category + // on the fly if one does not exist. *NOTE: if find_in_library is true it + // will search in the user's library folder instead of "My Inventory" + const LLUUID findCategoryUUIDForType(LLFolderType::EType preferred_type, + bool create_folder = true, + bool find_in_library = false); + + // Get whatever special folder this object is a child of, if any. + const LLViewerInventoryCategory *getFirstNondefaultParent(const LLUUID& obj_id) const; - // Get the inventoryID that this item points to, else just return item_id + // Get the object by id. Returns NULL if not found. + // NOTE: Use the pointer returned for read operations - do + // not modify the object values in place or you will break stuff. + LLInventoryObject* getObject(const LLUUID& id) const; + + // Get the item by id. Returns NULL if not found. + // NOTE: Use the pointer for read operations - use the + // updateItem() method to actually modify values. + LLViewerInventoryItem* getItem(const LLUUID& id) const; + + // Get the category by id. Returns NULL if not found. + // NOTE: Use the pointer for read operations - use the + // updateCategory() method to actually modify values. + LLViewerInventoryCategory* getCategory(const LLUUID& id) const; + + // Get the inventoryID or item that this item points to, else just return object_id const LLUUID& getLinkedItemID(const LLUUID& object_id) const; + LLViewerInventoryItem* getLinkedItem(const LLUUID& object_id) const; +private: + mutable LLPointer<LLViewerInventoryItem> mLastItem; // cache recent lookups - // The inventory model usage is sensitive to the initial construction of the - // model. - bool isInventoryUsable() const; + //-------------------------------------------------------------------- + // Count + //-------------------------------------------------------------------- +public: + // Return the number of items or categories + S32 getItemCount() const; + S32 getCategoryCount() const; + +/** Accessors + ** ** + *******************************************************************************/ - // - // Mutators - // +/******************************************************************************** + ** ** + ** MUTATORS + **/ - // Calling this method with an inventory item will either change - // an existing item with a matching item_id, or will add the item +public: + // Change an existing item with a matching item_id or add the item // to the current inventory. Returns the change mask generated by // the update. No notification will be sent to observers. This // method will only generate network traffic if the item had to be // reparented. - // *NOTE: In usage, you will want to perform cache accounting - // operations in LLInventoryModel::accountForUpdate() or - // LLViewerInventoryItem::updateServer() before calling this - // method. + // NOTE: In usage, you will want to perform cache accounting + // operations in LLInventoryModel::accountForUpdate() or + // LLViewerInventoryItem::updateServer() before calling this method. U32 updateItem(const LLViewerInventoryItem* item); - // Calling this method with an inventory category will either - // change an existing item with the matching id, or it will add + // Change an existing item with the matching id or add // the category. No notifcation will be sent to observers. This // method will only generate network traffic if the item had to be // reparented. - // *NOTE: In usage, you will want to perform cache accounting - // operations in LLInventoryModel::accountForUpdate() or - // LLViewerInventoryCategory::updateServer() before calling this - // method. + // NOTE: In usage, you will want to perform cache accounting + // operations in accountForUpdate() or LLViewerInventoryCategory:: + // updateServer() before calling this method. void updateCategory(const LLViewerInventoryCategory* cat); - // This method will move the specified object id to the specified - // category, update the internal structures. No cache accounting, + // Move the specified object id to the specified category and + // update the internal structures. No cache accounting, // observer notification, or server update is performed. void moveObject(const LLUUID& object_id, const LLUUID& cat_id); - // delete a particular inventory object by ID. This will purge one - // object from the internal data structures maintaining a + //-------------------------------------------------------------------- + // Delete + //-------------------------------------------------------------------- +public: + // Delete a particular inventory object by ID. Will purge one + // object from the internal data structures, maintaining a // consistent internal state. No cache accounting, observer - // notification, or server update is performed. Purges linked items. + // notification, or server update is performed. void deleteObject(const LLUUID& id); + void removeItem(const LLUUID& item_id); - // delete a particular inventory object by ID, and delete it from - // the server. Also updates linked items. + // Delete a particular inventory object by ID, and delete it from + // the server. Also updates linked items. void purgeObject(const LLUUID& id); - void updateLinkedObjectsFromPurge(const LLUUID& baseobj_id); - // This is a method which collects the descendants of the id + // Collects and purges the descendants of the id // provided. If the category is not found, no action is // taken. This method goes through the long winded process of // removing server representation of folders and items while doing // cache accounting in a fairly efficient manner. This method does // not notify observers (though maybe it should...) void purgeDescendentsOf(const LLUUID& id); +protected: + void updateLinkedObjectsFromPurge(const LLUUID& baseobj_id); + + //-------------------------------------------------------------------- + // Reorder + //-------------------------------------------------------------------- +public: + // Changes items order by insertion of the item identified by src_item_id + // before the item identified by dest_item_id. Both items must exist in items array. + // Sorting is stored after method is finished. Only src_item_id is moved before dest_item_id. + static void updateItemsOrder(LLInventoryModel::item_array_t& items, + const LLUUID& src_item_id, + const LLUUID& dest_item_id); + + // Saves current order of the passed items using inventory item sort field. + // Resets 'items' sort fields and saves them on server. + // Is used to save order for Favorites folder. + void saveItemsOrder(const LLInventoryModel::item_array_t& items); - // This method optimally removes the referenced categories and - // items from the current agent's inventory in the database. It - // performs all of the during deletion. The local representation - // is not removed. - void deleteFromServer(LLDynamicArray<LLUUID>& category_ids, - LLDynamicArray<LLUUID>& item_ids); - - // Add/remove an observer. If the observer is destroyed, be sure - // to remove it. - void addObserver(LLInventoryObserver* observer); - void removeObserver(LLInventoryObserver* observer); - BOOL containsObserver(LLInventoryObserver* observer) const; - - // - // Misc Methods - // - - // findCategoryUUIDForType() returns the uuid of the category that - // specifies 'type' as what it defaults to containing. The - // category is not necessarily only for that type. *NOTE: If create_folder is true, this - // will create a new inventory category on the fly if one does not exist. *NOTE: if find_in_library is - // true it will search in the user's library folder instead of "My Inventory" - // SDK: Added flag to specify whether the folder should be created if not found. This fixes the horrible - // multiple trash can bug. - const LLUUID findCategoryUUIDForType(LLFolderType::EType preferred_type, bool create_folder = true, bool find_in_library = false); - - // This gets called by the idle loop. It only updates if new - // state is detected. Call notifyObservers() manually to update - // regardless of whether state change has been indicated. - void idleNotifyObservers(); - - // Call this method to explicitly update everyone on a new state. - // The optional argument 'service_name' is used by Agent Inventory Service [DEV-20328] - void notifyObservers(const std::string service_name=""); - - // This allows outsiders to tell the inventory if something has - // been changed 'under the hood', but outside the control of the - // inventory. For example, if we grant someone modify permissions, - // then that changes the data structures for LLAvatarTracker, but - // potentially affects inventory observers. This API makes sure - // that the next notify will include that notification. - void addChangedMask(U32 mask, const LLUUID& referent); - - const changed_items_t& getChangedIDs() const { return mChangedItemIDs; } - - // This method to prepares a set of mock inventory which provides - // minimal functionality before the actual arrival of inventory. - //void mock(const LLUUID& root_id); - - // Make sure we have the descendents in the structure. Returns true - // if a fetch was performed. - bool fetchDescendentsOf(const LLUUID& folder_id); - - // call this method to request the inventory. - //void requestFromServer(const LLUUID& agent_id); - - // call this method on logout to save a terse representation - void cache(const LLUUID& parent_folder_id, const LLUUID& agent_id); - - // Generates a string containing the path to the item specified by - // item_id. - void appendPath(const LLUUID& id, std::string& path) const; - - // message handling functionality - static void registerCallbacks(LLMessageSystem* msg); + // Rearranges Landmarks inside Favorites folder. + // Moves source landmark before target one. + void rearrangeFavoriteLandmarks(const LLUUID& source_item_id, const LLUUID& target_item_id); - // Convenience function to create a new category. You could call - // updateCatgory() with a newly generated UUID category, but this - // version will take care of details like what the name should be - // based on preferred type. Returns the UUID of the new - // category. If you want to use the default name based on type, - // pass in a NULL to the 'name parameter. + //-------------------------------------------------------------------- + // Creation + //-------------------------------------------------------------------- +public: + // Returns the UUID of the new category. If you want to use the default + // name based on type, pass in a NULL to the 'name' parameter. LLUUID createNewCategory(const LLUUID& parent_id, LLFolderType::EType preferred_type, const std::string& name); +protected: + // Internal methods that add inventory and make sure that all of + // the internal data structures are consistent. These methods + // should be passed pointers of newly created objects, and the + // instance will take over the memory management from there. + void addCategory(LLViewerInventoryCategory* category); + void addItem(LLViewerInventoryItem* item); + +/** Mutators + ** ** + *******************************************************************************/ - // methods to load up inventory skeleton & meat. These are used - // during authentication. return true if everything parsed. - bool loadSkeleton(const LLSD& options, const LLUUID& owner_id); - bool loadMeat(const LLSD& options, const LLUUID& owner_id); - - // This is a brute force method to rebuild the entire parent-child - // relations. - void buildParentChildMap(); - - // - // Category accounting. - // +/******************************************************************************** + ** ** + ** CATEGORY ACCOUNTING + **/ - // This structure represents the number of items added or removed - // from a category. +public: + // Represents the number of items added or removed from a category. struct LLCategoryUpdate { LLCategoryUpdate() : mDescendentDelta(0) {} @@ -334,8 +388,7 @@ public: }; typedef std::vector<LLCategoryUpdate> update_list_t; - // This structure eixts to make it easier to account for deltas in - // a map. + // This exists to make it easier to account for deltas in a map. struct LLInitializedS32 { LLInitializedS32() : mValue(0) {} @@ -346,104 +399,89 @@ public: }; typedef std::map<LLUUID, LLInitializedS32> update_map_t; - // Call these methods when there are category updates, but call - // them *before* the actual update so the method can do descendent - // accounting correctly. + // Call when there are category updates. Call them *before* the + // actual update so the method can do descendent accounting correctly. void accountForUpdate(const LLCategoryUpdate& update) const; void accountForUpdate(const update_list_t& updates); void accountForUpdate(const update_map_t& updates); - // Return child status of category children. yes/no/maybe + // Return (yes/no/maybe) child status of category children. EHasChildren categoryHasChildren(const LLUUID& cat_id) const; - // returns true iff category version is known and theoretical + // Returns true iff category version is known and theoretical // descendents == actual descendents. bool isCategoryComplete(const LLUUID& cat_id) const; - // callbacks - // Trigger a notification and empty the folder type (FT_TRASH or FT_LOST_AND_FOUND) if confirmed - void emptyFolderType(const std::string notification, LLFolderType::EType folder_type); - bool callbackEmptyFolderType(const LLSD& notification, const LLSD& response, LLFolderType::EType preferred_type); - - // Utility Functions - void removeItem(const LLUUID& item_id); - - static void findLostItems(); - - // Data about the agent's root folder and root library folder - // are stored here, rather than in LLAgent where it used to be, because - // gInventory is a singleton and represents the agent's inventory. - // The "library" is actually the inventory of a special agent, - // usually Alexandria Linden. - const LLUUID &getRootFolderID() const; - const LLUUID &getLibraryOwnerID() const; - const LLUUID &getLibraryRootFolderID() const; - - // These are set during login with data from the server - void setRootFolderID(const LLUUID& id); - void setLibraryOwnerID(const LLUUID& id); - void setLibraryRootFolderID(const LLUUID& id); +/** Category Accounting + ** ** + *******************************************************************************/ +/******************************************************************************** + ** ** + ** NOTIFICATIONS + **/ - /** - * Changes items order by insertion of the item identified by src_item_id - * BEFORE the item identified by dest_item_id. Both items must exist in items array. - * - * Sorting is stored after method is finished. Only src_item_id is moved before dest_item_id. - * - * @param[in, out] items - vector with items to be updated. It should be sorted in a right way - * before calling this method. - * @param src_item_id - LLUUID of inventory item to be moved in new position - * @param dest_item_id - LLUUID of inventory item before which source item should be placed. - */ - static void updateItemsOrder(LLInventoryModel::item_array_t& items, const LLUUID& src_item_id, const LLUUID& dest_item_id); - - /** - * Saves current order of the passed items using inventory item sort field. - * - * It reset items' sort fields and saves them on server. - * Is used to save order for Favorites folder. - * - * @param[in] items vector of items in order to be saved. - */ - void saveItemsOrder(const LLInventoryModel::item_array_t& items); +public: + // Called by the idle loop. Only updates if new state is detected. Call + // notifyObservers() manually to update regardless of whether state change + // has been indicated. + void idleNotifyObservers(); - /** - * Rearranges Landmarks inside Favorites folder. - * Moves source landmark before target one. - * - * @param source_item_id - LLUUID of the source item to be moved into new position - * @param target_item_id - LLUUID of the target item before which source item should be placed. - */ - void rearrangeFavoriteLandmarks(const LLUUID& source_item_id, const LLUUID& target_item_id); + // Call to explicitly update everyone on a new state. The optional argument + // 'service_name' is used by Agent Inventory Service [DEV-20328] + void notifyObservers(const std::string service_name=""); + // Allows outsiders to tell the inventory if something has + // been changed 'under the hood', but outside the control of the + // inventory. The next notify will include that notification. + void addChangedMask(U32 mask, const LLUUID& referent); + const changed_items_t& getChangedIDs() const { return mChangedItemIDs; } protected: + // Updates all linked items pointing to this id. + void addChangedMaskForLinks(const LLUUID& object_id, U32 mask); +private: + // Flag set when notifyObservers is being called, to look for bugs + // where it's called recursively. + BOOL mIsNotifyObservers; + // Variables used to track what has changed since the last notify. + U32 mModifyMask; + changed_items_t mChangedItemIDs; + + //-------------------------------------------------------------------- + // Observers + //-------------------------------------------------------------------- +public: + // If the observer is destroyed, be sure to remove it. + void addObserver(LLInventoryObserver* observer); + void removeObserver(LLInventoryObserver* observer); + BOOL containsObserver(LLInventoryObserver* observer) const; +private: + typedef std::set<LLInventoryObserver*> observer_list_t; + observer_list_t mObservers; + +/** Notifications + ** ** + *******************************************************************************/ - // Internal methods which add inventory and make sure that all of - // the internal data structures are consistent. These methods - // should be passed pointers of newly created objects, and the - // instance will take over the memory management from there. - void addCategory(LLViewerInventoryCategory* category); - void addItem(LLViewerInventoryItem* item); - - // ! DEPRECRATE ! Remove this and add it into findCategoryUUIDForType, - // since that's the only function that uses this. It's too confusing - // having both methods. - // - // Internal method which looks for a category with the specified - // preferred type. Returns LLUUID::null if not found - const LLUUID &findCatUUID(LLFolderType::EType preferred_type, bool find_in_library = false) const; - // Empty the entire contents - void empty(); +/******************************************************************************** + ** ** + ** MISCELLANEOUS + **/ - // Given the current state of the inventory items, figure out the - // clone information. *FIX: This is sub-optimal, since we can - // insert this information snurgically, but this makes sure the - // implementation works before we worry about optimization. - //void recalculateCloneInformation(); + //-------------------------------------------------------------------- + // Callbacks + //-------------------------------------------------------------------- +public: + // Trigger a notification and empty the folder type (FT_TRASH or FT_LOST_AND_FOUND) if confirmed + void emptyFolderType(const std::string notification, LLFolderType::EType folder_type); + bool callbackEmptyFolderType(const LLSD& notification, const LLSD& response, LLFolderType::EType preferred_type); + static void registerCallbacks(LLMessageSystem* msg); - // file import/export. + //-------------------------------------------------------------------- + // File I/O + //-------------------------------------------------------------------- +protected: static bool loadFromFile(const std::string& filename, cat_array_t& categories, item_array_t& items, @@ -452,360 +490,50 @@ protected: const cat_array_t& categories, const item_array_t& items); - // message handling functionality - //static void processUseCachedInventory(LLMessageSystem* msg, void**); + //-------------------------------------------------------------------- + // Message handling functionality + //-------------------------------------------------------------------- +public: static void processUpdateCreateInventoryItem(LLMessageSystem* msg, void**); static void processRemoveInventoryItem(LLMessageSystem* msg, void**); static void processUpdateInventoryFolder(LLMessageSystem* msg, void**); static void processRemoveInventoryFolder(LLMessageSystem* msg, void**); - //static void processExchangeCallingcard(LLMessageSystem* msg, void**); - //static void processAddCallingcard(LLMessageSystem* msg, void**); - //static void processDeclineCallingcard(LLMessageSystem* msg, void**); static void processSaveAssetIntoInventory(LLMessageSystem* msg, void**); static void processBulkUpdateInventory(LLMessageSystem* msg, void**); static void processInventoryDescendents(LLMessageSystem* msg, void**); static void processMoveInventoryItem(LLMessageSystem* msg, void**); static void processFetchInventoryReply(LLMessageSystem* msg, void**); - +protected: bool messageUpdateCore(LLMessageSystem* msg, bool do_accounting); - // Updates all linked items pointing to this id. - void addChangedMaskForLinks(const LLUUID& object_id, U32 mask); - + //-------------------------------------------------------------------- + // Locks + //-------------------------------------------------------------------- +public: + void lockDirectDescendentArrays(const LLUUID& cat_id, + cat_array_t*& categories, + item_array_t*& items); + void unlockDirectDescendentArrays(const LLUUID& cat_id); protected: cat_array_t* getUnlockedCatArray(const LLUUID& id); item_array_t* getUnlockedItemArray(const LLUUID& id); - private: - // Variables used to track what has changed since the last notify. - U32 mModifyMask; - changed_items_t mChangedItemIDs; - std::map<LLUUID, bool> mCategoryLock; std::map<LLUUID, bool> mItemLock; - // cache recent lookups - mutable LLPointer<LLViewerInventoryItem> mLastItem; - - // This last set of indices is used to map parents to children. - typedef std::map<LLUUID, cat_array_t*> parent_cat_map_t; - typedef std::map<LLUUID, item_array_t*> parent_item_map_t; - parent_cat_map_t mParentChildCategoryTree; - parent_item_map_t mParentChildItemTree; - - typedef std::set<LLInventoryObserver*> observer_list_t; - observer_list_t mObservers; - - // Agent inventory folder information. - LLUUID mRootFolderID; - LLUUID mLibraryRootFolderID; - LLUUID mLibraryOwnerID; - - static BOOL sTimelyFetchPending; - static S32 sNumFetchRetries; - static LLFrameTimer sFetchTimer; - static F32 sMinTimeBetweenFetches; - static F32 sMaxTimeBetweenFetches; - - // Expected inventory cache version - const static S32 sCurrentInvCacheVersion; - - // This flag is used to handle an invalid inventory state. - bool mIsAgentInvUsable; - -private: - // Information for tracking the actual inventory. We index this - // information in a lot of different ways so we can access - // the inventory using several different identifiers. - // mInventory member data is the 'master' list of inventory, and - // mCategoryMap and mItemMap store uuid->object mappings. - typedef std::map<LLUUID, LLPointer<LLViewerInventoryCategory> > cat_map_t; - typedef std::map<LLUUID, LLPointer<LLViewerInventoryItem> > item_map_t; - //inv_map_t mInventory; - cat_map_t mCategoryMap; - item_map_t mItemMap; - - // Flag set when notifyObservers is being called, to look for bugs - // where it's called recursively. - BOOL mIsNotifyObservers; + //-------------------------------------------------------------------- + // Debugging + //-------------------------------------------------------------------- public: - // *NOTE: DEBUG functionality void dumpInventory() const; - - //////////////////////////////////////////////////////////////////////////////// - // Bulk fetch -public: - // Start and stop background breadth-first fetching of inventory contents. - // This gets triggered when performing a filter-search - void startBackgroundFetch(const LLUUID& cat_id = LLUUID::null); - static BOOL backgroundFetchActive(); - static bool isEverythingFetched(); - static void backgroundFetch(void*); // background fetch idle function - static void incrBulkFetch(S16 fetching) { sBulkFetchCount+=fetching; if (sBulkFetchCount<0) sBulkFetchCount=0; } - static void stopBackgroundFetch(); // stop fetch process - static bool isBulkFetchProcessingComplete(); - - // Add categories to a list to be fetched in bulk. - static void bulkFetch(std::string url); - - static bool libraryFetchStarted(); - static bool libraryFetchCompleted(); - static bool libraryFetchInProgress(); - - static bool myInventoryFetchStarted(); - static bool myInventoryFetchCompleted(); - static bool myInventoryFetchInProgress(); - -private: - static BOOL sMyInventoryFetchStarted; - static BOOL sLibraryFetchStarted; - static BOOL sAllFoldersFetched; - static void setAllFoldersFetched(); - - // completing the fetch once per session should be sufficient - static BOOL sBackgroundFetchActive; - static S16 sBulkFetchCount; - - //////////////////////////////////////////////////////////////////////////////// - // Login status -public: - static BOOL getIsFirstTimeInViewer2(); -private: - static BOOL sFirstTimeInViewer2; +/** Miscellaneous + ** ** + *******************************************************************************/ }; // a special inventory model for the agent extern LLInventoryModel gInventory; -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// Class LLInventoryCollectFunctor -// -// Base class for LLInventoryModel::collectDescendentsIf() method -// which accepts an instance of one of these objects to use as the -// function to determine if it should be added. Derive from this class -// and override the () operator to return TRUE if you want to collect -// the category or item passed in. -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -class LLInventoryCollectFunctor -{ -public: - virtual ~LLInventoryCollectFunctor(){}; - virtual bool operator()(LLInventoryCategory* cat, LLInventoryItem* item) = 0; - - static bool itemTransferCommonlyAllowed(LLInventoryItem* item); -}; - - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// Class LLAssetIDMatches -// -// This functor finds inventory items pointing to the specified asset -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -class LLViewerInventoryItem; - -class LLAssetIDMatches : public LLInventoryCollectFunctor -{ -public: - LLAssetIDMatches(const LLUUID& asset_id) : mAssetID(asset_id) {} - virtual ~LLAssetIDMatches() {} - bool operator()(LLInventoryCategory* cat, LLInventoryItem* item); - -protected: - LLUUID mAssetID; -}; - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// Class LLLinkedItemIDMatches -// -// This functor finds inventory items linked to the specific inventory id. -// Assumes the inventory id is itself not a linked item. -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -class LLLinkedItemIDMatches : public LLInventoryCollectFunctor -{ -public: - LLLinkedItemIDMatches(const LLUUID& item_id) : mBaseItemID(item_id) {} - virtual ~LLLinkedItemIDMatches() {} - bool operator()(LLInventoryCategory* cat, LLInventoryItem* item); - -protected: - LLUUID mBaseItemID; -}; - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// Class LLIsType -// -// Implementation of a LLInventoryCollectFunctor which returns TRUE if -// the type is the type passed in during construction. -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -class LLIsType : public LLInventoryCollectFunctor -{ -public: - LLIsType(LLAssetType::EType type) : mType(type) {} - virtual ~LLIsType() {} - virtual bool operator()(LLInventoryCategory* cat, - LLInventoryItem* item); -protected: - LLAssetType::EType mType; -}; - - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// Class LLIsNotType -// -// Implementation of a LLInventoryCollectFunctor which returns FALSE if the -// type is the type passed in during construction, otherwise false. -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -class LLIsNotType : public LLInventoryCollectFunctor -{ -public: - LLIsNotType(LLAssetType::EType type) : mType(type) {} - virtual ~LLIsNotType() {} - virtual bool operator()(LLInventoryCategory* cat, - LLInventoryItem* item); -protected: - LLAssetType::EType mType; -}; - -class LLIsTypeWithPermissions : public LLInventoryCollectFunctor -{ -public: - LLIsTypeWithPermissions(LLAssetType::EType type, const PermissionBit perms, const LLUUID &agent_id, const LLUUID &group_id) - : mType(type), mPerm(perms), mAgentID(agent_id), mGroupID(group_id) {} - virtual ~LLIsTypeWithPermissions() {} - virtual bool operator()(LLInventoryCategory* cat, - LLInventoryItem* item); -protected: - LLAssetType::EType mType; - PermissionBit mPerm; - LLUUID mAgentID; - LLUUID mGroupID; -}; - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// Class LLIsClone -// -// Implementation of a LLInventoryCollectFunctor which returns TRUE if -// the object is a clone of the item passed in during -// construction. -// -// *NOTE: Since clone information is determined based off of asset id -// (or creator with calling cards), if the id is NULL, it has no -// clones - even itself. -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -//class LLIsClone : public LLInventoryCollectFunctor -//{ -//public: -// LLIsClone(LLViewerInventoryItem* item) : mItem(item) {} -// virtual ~LLIsClone() {} -// virtual bool operator()(LLViewerInventoryCategory* cat, -// LLViewerInventoryItem* item); -//protected: -// LLPointer<LLViewerInventoryItem> mItem; -//}; - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// Class LLBuddyCollector -// -// Simple class that collects calling cards that are not null, and not -// the agent. Duplicates are possible. -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -class LLBuddyCollector : public LLInventoryCollectFunctor -{ -public: - LLBuddyCollector() {} - virtual ~LLBuddyCollector() {} - virtual bool operator()(LLInventoryCategory* cat, - LLInventoryItem* item); -}; - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// Class LLUniqueBuddyCollector -// -// Simple class that collects calling cards that are not null, and not -// the agent. Duplicates are discarded. -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -class LLUniqueBuddyCollector : public LLInventoryCollectFunctor -{ -public: - LLUniqueBuddyCollector() {} - virtual ~LLUniqueBuddyCollector() {} - virtual bool operator()(LLInventoryCategory* cat, - LLInventoryItem* item); - -protected: - std::set<LLUUID> mSeen; -}; - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// Class LLParticularBuddyCollector -// -// Simple class that collects calling cards that match a particular uuid -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -class LLParticularBuddyCollector : public LLInventoryCollectFunctor -{ -public: - LLParticularBuddyCollector(const LLUUID& id) : mBuddyID(id) {} - virtual ~LLParticularBuddyCollector() {} - virtual bool operator()(LLInventoryCategory* cat, - LLInventoryItem* item); -protected: - LLUUID mBuddyID; -}; - - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// Class LLNameCategoryCollector -// -// Collects categories based on case-insensitive match of prefix -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -class LLNameCategoryCollector : public LLInventoryCollectFunctor -{ -public: - LLNameCategoryCollector(const std::string& name) : mName(name) {} - virtual ~LLNameCategoryCollector() {} - virtual bool operator()(LLInventoryCategory* cat, - LLInventoryItem* item); -protected: - std::string mName; -}; - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// Class LLFindCOFValidItems -// -// Collects items that can be legitimately linked to in the COF. -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -class LLFindCOFValidItems : public LLInventoryCollectFunctor -{ -public: - LLFindCOFValidItems() {} - virtual ~LLFindCOFValidItems() {} - virtual bool operator()(LLInventoryCategory* cat, - LLInventoryItem* item); - -}; - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// Class LLFindWearables -// -// Collects wearables based on item type. -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -class LLFindWearables : public LLInventoryCollectFunctor -{ -public: - LLFindWearables() {} - virtual ~LLFindWearables() {} - virtual bool operator()(LLInventoryCategory* cat, - LLInventoryItem* item); -}; - #endif // LL_LLINVENTORYMODEL_H diff --git a/indra/newview/llinventorymodelbackgroundfetch.cpp b/indra/newview/llinventorymodelbackgroundfetch.cpp new file mode 100644 index 0000000000..ce44e37017 --- /dev/null +++ b/indra/newview/llinventorymodelbackgroundfetch.cpp @@ -0,0 +1,638 @@ +/** + * @file llinventorymodel.cpp + * @brief Implementation of the inventory model used to track agent inventory. + * + * $LicenseInfo:firstyear=2002&license=viewergpl$ + * + * Copyright (c) 2002-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" +#include "llinventorymodelbackgroundfetch.h" + +#include "llagent.h" +#include "llappviewer.h" +#include "llcallbacklist.h" +#include "llinventorypanel.h" +#include "llviewercontrol.h" +#include "llviewermessage.h" +#include "llviewerregion.h" +#include "llviewerwindow.h" + +const F32 MAX_TIME_FOR_SINGLE_FETCH = 10.f; +const S32 MAX_FETCH_RETRIES = 10; + +LLInventoryModelBackgroundFetch::LLInventoryModelBackgroundFetch() : + mBackgroundFetchActive(FALSE), + mAllFoldersFetched(FALSE), + mRecursiveInventoryFetchStarted(FALSE), + mRecursiveLibraryFetchStarted(FALSE), + mNumFetchRetries(0), + mMinTimeBetweenFetches(0.3f), + mMaxTimeBetweenFetches(10.f), + mTimelyFetchPending(FALSE), + mBulkFetchCount(0) +{ +} + +LLInventoryModelBackgroundFetch::~LLInventoryModelBackgroundFetch() +{ +} + +bool LLInventoryModelBackgroundFetch::isBulkFetchProcessingComplete() const +{ + return mFetchQueue.empty() && mBulkFetchCount<=0; +} + +bool LLInventoryModelBackgroundFetch::libraryFetchStarted() const +{ + return mRecursiveLibraryFetchStarted; +} + +bool LLInventoryModelBackgroundFetch::libraryFetchCompleted() const +{ + return libraryFetchStarted() && fetchQueueContainsNoDescendentsOf(gInventory.getLibraryRootFolderID()); +} + +bool LLInventoryModelBackgroundFetch::libraryFetchInProgress() const +{ + return libraryFetchStarted() && !libraryFetchCompleted(); +} + +bool LLInventoryModelBackgroundFetch::inventoryFetchStarted() const +{ + return mRecursiveInventoryFetchStarted; +} + +bool LLInventoryModelBackgroundFetch::inventoryFetchCompleted() const +{ + return inventoryFetchStarted() && fetchQueueContainsNoDescendentsOf(gInventory.getRootFolderID()); +} + +bool LLInventoryModelBackgroundFetch::inventoryFetchInProgress() const +{ + return inventoryFetchStarted() && !inventoryFetchCompleted(); +} + +bool LLInventoryModelBackgroundFetch::isEverythingFetched() const +{ + return mAllFoldersFetched; +} + +BOOL LLInventoryModelBackgroundFetch::backgroundFetchActive() const +{ + return mBackgroundFetchActive; +} + +void LLInventoryModelBackgroundFetch::start(const LLUUID& cat_id, BOOL recursive) +{ + if (!mAllFoldersFetched) + { + LL_DEBUGS("InventoryFetch") << "Start fetching category: " << cat_id << ", recursive: " << recursive << LL_ENDL; + + mBackgroundFetchActive = TRUE; + if (cat_id.isNull()) + { + if (!mRecursiveInventoryFetchStarted) + { + mRecursiveInventoryFetchStarted |= recursive; + mFetchQueue.push_back(FetchQueueInfo(gInventory.getRootFolderID(), recursive)); + gIdleCallbacks.addFunction(&LLInventoryModelBackgroundFetch::backgroundFetchCB, NULL); + } + if (!mRecursiveLibraryFetchStarted) + { + mRecursiveLibraryFetchStarted |= recursive; + mFetchQueue.push_back(FetchQueueInfo(gInventory.getLibraryRootFolderID(), recursive)); + gIdleCallbacks.addFunction(&LLInventoryModelBackgroundFetch::backgroundFetchCB, NULL); + } + } + else + { + // Specific folder requests go to front of queue. + if (mFetchQueue.empty() || mFetchQueue.front().mCatUUID != cat_id) + { + mFetchQueue.push_front(FetchQueueInfo(cat_id, recursive)); + gIdleCallbacks.addFunction(&LLInventoryModelBackgroundFetch::backgroundFetchCB, NULL); + } + if (cat_id == gInventory.getLibraryRootFolderID()) + { + mRecursiveLibraryFetchStarted |= recursive; + } + if (cat_id == gInventory.getRootFolderID()) + { + mRecursiveInventoryFetchStarted |= recursive; + } + } + } +} + +void LLInventoryModelBackgroundFetch::findLostItems() +{ + mBackgroundFetchActive = TRUE; + mFetchQueue.push_back(FetchQueueInfo(LLUUID::null, TRUE)); + gIdleCallbacks.addFunction(&LLInventoryModelBackgroundFetch::backgroundFetchCB, NULL); +} + +void LLInventoryModelBackgroundFetch::stopBackgroundFetch() +{ + if (mBackgroundFetchActive) + { + mBackgroundFetchActive = FALSE; + gIdleCallbacks.deleteFunction(&LLInventoryModelBackgroundFetch::backgroundFetchCB, NULL); + mBulkFetchCount=0; + mMinTimeBetweenFetches=0.0f; + } +} + +void LLInventoryModelBackgroundFetch::setAllFoldersFetched() +{ + if (mRecursiveInventoryFetchStarted && + mRecursiveLibraryFetchStarted) + { + mAllFoldersFetched = TRUE; + } + stopBackgroundFetch(); +} + +void LLInventoryModelBackgroundFetch::backgroundFetchCB(void *) +{ + LLInventoryModelBackgroundFetch::instance().backgroundFetch(); +} + +void LLInventoryModelBackgroundFetch::backgroundFetch() +{ + if (mBackgroundFetchActive && gAgent.getRegion()) + { + // If we'll be using the capability, we'll be sending batches and the background thing isn't as important. + std::string url = gAgent.getRegion()->getCapability("WebFetchInventoryDescendents"); + if (!url.empty()) + { + bulkFetch(url); + return; + } + +#if 1 + //-------------------------------------------------------------------------------- + // DEPRECATED OLD CODE + // + + // No more categories to fetch, stop fetch process. + if (mFetchQueue.empty()) + { + llinfos << "Inventory fetch completed" << llendl; + + setAllFoldersFetched(); + return; + } + + F32 fast_fetch_time = lerp(mMinTimeBetweenFetches, mMaxTimeBetweenFetches, 0.1f); + F32 slow_fetch_time = lerp(mMinTimeBetweenFetches, mMaxTimeBetweenFetches, 0.5f); + if (mTimelyFetchPending && mFetchTimer.getElapsedTimeF32() > slow_fetch_time) + { + // Double timeouts on failure. + mMinTimeBetweenFetches = llmin(mMinTimeBetweenFetches * 2.f, 10.f); + mMaxTimeBetweenFetches = llmin(mMaxTimeBetweenFetches * 2.f, 120.f); + llinfos << "Inventory fetch times grown to (" << mMinTimeBetweenFetches << ", " << mMaxTimeBetweenFetches << ")" << llendl; + // fetch is no longer considered "timely" although we will wait for full time-out. + mTimelyFetchPending = FALSE; + } + + while(1) + { + if (mFetchQueue.empty()) + { + break; + } + + if(gDisconnected) + { + // Just bail if we are disconnected. + break; + } + + const FetchQueueInfo info = mFetchQueue.front(); + LLViewerInventoryCategory* cat = gInventory.getCategory(info.mCatUUID); + + // Category has been deleted, remove from queue. + if (!cat) + { + mFetchQueue.pop_front(); + continue; + } + + if (mFetchTimer.getElapsedTimeF32() > mMinTimeBetweenFetches && + LLViewerInventoryCategory::VERSION_UNKNOWN == cat->getVersion()) + { + // Category exists but has no children yet, fetch the descendants + // for now, just request every time and rely on retry timer to throttle. + if (cat->fetch()) + { + mFetchTimer.reset(); + mTimelyFetchPending = TRUE; + } + else + { + // The catagory also tracks if it has expired and here it says it hasn't + // yet. Get out of here because nothing is going to happen until we + // update the timers. + break; + } + } + // Do I have all my children? + else if (gInventory.isCategoryComplete(info.mCatUUID)) + { + // Finished with this category, remove from queue. + mFetchQueue.pop_front(); + + // Add all children to queue. + LLInventoryModel::cat_array_t* categories; + LLInventoryModel::item_array_t* items; + gInventory.getDirectDescendentsOf(cat->getUUID(), categories, items); + for (LLInventoryModel::cat_array_t::const_iterator it = categories->begin(); + it != categories->end(); + ++it) + { + mFetchQueue.push_back(FetchQueueInfo((*it)->getUUID(),info.mRecursive)); + } + + // We received a response in less than the fast time. + if (mTimelyFetchPending && mFetchTimer.getElapsedTimeF32() < fast_fetch_time) + { + // Shrink timeouts based on success. + mMinTimeBetweenFetches = llmax(mMinTimeBetweenFetches * 0.8f, 0.3f); + mMaxTimeBetweenFetches = llmax(mMaxTimeBetweenFetches * 0.8f, 10.f); + //llinfos << "Inventory fetch times shrunk to (" << mMinTimeBetweenFetches << ", " << mMaxTimeBetweenFetches << ")" << llendl; + } + + mTimelyFetchPending = FALSE; + continue; + } + else if (mFetchTimer.getElapsedTimeF32() > mMaxTimeBetweenFetches) + { + // Received first packet, but our num descendants does not match db's num descendants + // so try again later. + mFetchQueue.pop_front(); + + if (mNumFetchRetries++ < MAX_FETCH_RETRIES) + { + // push on back of queue + mFetchQueue.push_back(info); + } + mTimelyFetchPending = FALSE; + mFetchTimer.reset(); + break; + } + + // Not enough time has elapsed to do a new fetch + break; + } + + // + // DEPRECATED OLD CODE + //-------------------------------------------------------------------------------- +#endif + } +} + +void LLInventoryModelBackgroundFetch::incrBulkFetch(S16 fetching) +{ + mBulkFetchCount += fetching; + if (mBulkFetchCount < 0) + { + mBulkFetchCount = 0; + } +} + + +class LLInventoryModelFetchDescendentsResponder: public LLHTTPClient::Responder +{ +public: + LLInventoryModelFetchDescendentsResponder(const LLSD& request_sd, uuid_vec_t recursive_cats) : + mRequestSD(request_sd), + mRecursiveCatUUIDs(recursive_cats) + {}; + //LLInventoryModelFetchDescendentsResponder() {}; + void result(const LLSD& content); + void error(U32 status, const std::string& reason); +protected: + BOOL getIsRecursive(const LLUUID& cat_id) const; +private: + LLSD mRequestSD; + uuid_vec_t mRecursiveCatUUIDs; // hack for storing away which cat fetches are recursive +}; + +// If we get back a normal response, handle it here. +void LLInventoryModelFetchDescendentsResponder::result(const LLSD& content) +{ + LLInventoryModelBackgroundFetch *fetcher = LLInventoryModelBackgroundFetch::getInstance(); + if (content.has("folders")) + { + + for(LLSD::array_const_iterator folder_it = content["folders"].beginArray(); + folder_it != content["folders"].endArray(); + ++folder_it) + { + LLSD folder_sd = *folder_it; + + + //LLUUID agent_id = folder_sd["agent_id"]; + + //if(agent_id != gAgent.getID()) //This should never happen. + //{ + // llwarns << "Got a UpdateInventoryItem for the wrong agent." + // << llendl; + // break; + //} + + LLUUID parent_id = folder_sd["folder_id"]; + LLUUID owner_id = folder_sd["owner_id"]; + S32 version = (S32)folder_sd["version"].asInteger(); + S32 descendents = (S32)folder_sd["descendents"].asInteger(); + LLPointer<LLViewerInventoryCategory> tcategory = new LLViewerInventoryCategory(owner_id); + + if (parent_id.isNull()) + { + LLPointer<LLViewerInventoryItem> titem = new LLViewerInventoryItem; + for(LLSD::array_const_iterator item_it = folder_sd["items"].beginArray(); + item_it != folder_sd["items"].endArray(); + ++item_it) + { + const LLUUID lost_uuid = gInventory.findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND); + if (lost_uuid.notNull()) + { + LLSD item = *item_it; + titem->unpackMessage(item); + + LLInventoryModel::update_list_t update; + LLInventoryModel::LLCategoryUpdate new_folder(lost_uuid, 1); + update.push_back(new_folder); + gInventory.accountForUpdate(update); + + titem->setParent(lost_uuid); + titem->updateParentOnServer(FALSE); + gInventory.updateItem(titem); + gInventory.notifyObservers("fetchDescendents"); + + } + } + } + + LLViewerInventoryCategory* pcat = gInventory.getCategory(parent_id); + if (!pcat) + { + continue; + } + + for(LLSD::array_const_iterator category_it = folder_sd["categories"].beginArray(); + category_it != folder_sd["categories"].endArray(); + ++category_it) + { + LLSD category = *category_it; + tcategory->fromLLSD(category); + + const BOOL recursive = getIsRecursive(tcategory->getUUID()); + + if (recursive) + { + fetcher->mFetchQueue.push_back(LLInventoryModelBackgroundFetch::FetchQueueInfo(tcategory->getUUID(), recursive)); + } + else if ( !gInventory.isCategoryComplete(tcategory->getUUID()) ) + { + gInventory.updateCategory(tcategory); + } + + } + LLPointer<LLViewerInventoryItem> titem = new LLViewerInventoryItem; + for(LLSD::array_const_iterator item_it = folder_sd["items"].beginArray(); + item_it != folder_sd["items"].endArray(); + ++item_it) + { + LLSD item = *item_it; + titem->unpackMessage(item); + + gInventory.updateItem(titem); + } + + // Set version and descendentcount according to message. + LLViewerInventoryCategory* cat = gInventory.getCategory(parent_id); + if(cat) + { + cat->setVersion(version); + cat->setDescendentCount(descendents); + cat->determineFolderType(); + } + + } + } + + if (content.has("bad_folders")) + { + for(LLSD::array_const_iterator folder_it = content["bad_folders"].beginArray(); + folder_it != content["bad_folders"].endArray(); + ++folder_it) + { + LLSD folder_sd = *folder_it; + + // These folders failed on the dataserver. We probably don't want to retry them. + llinfos << "Folder " << folder_sd["folder_id"].asString() + << "Error: " << folder_sd["error"].asString() << llendl; + } + } + + fetcher->incrBulkFetch(-1); + + if (fetcher->isBulkFetchProcessingComplete()) + { + llinfos << "Inventory fetch completed" << llendl; + fetcher->setAllFoldersFetched(); + } + + gInventory.notifyObservers("fetchDescendents"); +} + +// If we get back an error (not found, etc...), handle it here. +void LLInventoryModelFetchDescendentsResponder::error(U32 status, const std::string& reason) +{ + LLInventoryModelBackgroundFetch *fetcher = LLInventoryModelBackgroundFetch::getInstance(); + + llinfos << "LLInventoryModelFetchDescendentsResponder::error " + << status << ": " << reason << llendl; + + fetcher->incrBulkFetch(-1); + + if (status==499) // timed out + { + for(LLSD::array_const_iterator folder_it = mRequestSD["folders"].beginArray(); + folder_it != mRequestSD["folders"].endArray(); + ++folder_it) + { + LLSD folder_sd = *folder_it; + LLUUID folder_id = folder_sd["folder_id"]; + const BOOL recursive = getIsRecursive(folder_id); + fetcher->mFetchQueue.push_front(LLInventoryModelBackgroundFetch::FetchQueueInfo(folder_id, recursive)); + } + } + else + { + if (fetcher->isBulkFetchProcessingComplete()) + { + fetcher->setAllFoldersFetched(); + } + } + gInventory.notifyObservers("fetchDescendents"); +} + +BOOL LLInventoryModelFetchDescendentsResponder::getIsRecursive(const LLUUID& cat_id) const +{ + return (std::find(mRecursiveCatUUIDs.begin(),mRecursiveCatUUIDs.end(), cat_id) != mRecursiveCatUUIDs.end()); +} + +// Bundle up a bunch of requests to send all at once. +// static +void LLInventoryModelBackgroundFetch::bulkFetch(std::string url) +{ + //Background fetch is called from gIdleCallbacks in a loop until background fetch is stopped. + //If there are items in mFetchQueue, we want to check the time since the last bulkFetch was + //sent. If it exceeds our retry time, go ahead and fire off another batch. + //Stopbackgroundfetch will be run from the Responder instead of here. + + S16 max_concurrent_fetches=8; + F32 new_min_time = 0.5f; //HACK! Clean this up when old code goes away entirely. + if (mMinTimeBetweenFetches < new_min_time) + { + mMinTimeBetweenFetches=new_min_time; //HACK! See above. + } + + if (gDisconnected || + (mBulkFetchCount > max_concurrent_fetches) || + (mFetchTimer.getElapsedTimeF32() < mMinTimeBetweenFetches)) + { + return; // just bail if we are disconnected + } + + U32 folder_count=0; + U32 max_batch_size=5; + + U32 sort_order = gSavedSettings.getU32(LLInventoryPanel::DEFAULT_SORT_ORDER) & 0x1; + + uuid_vec_t recursive_cats; + + LLSD body; + LLSD body_lib; + + while (!(mFetchQueue.empty()) && (folder_count < max_batch_size)) + { + const FetchQueueInfo& fetch_info = mFetchQueue.front(); + const LLUUID &cat_id = fetch_info.mCatUUID; + if (cat_id.isNull()) //DEV-17797 + { + LLSD folder_sd; + folder_sd["folder_id"] = LLUUID::null.asString(); + folder_sd["owner_id"] = gAgent.getID(); + folder_sd["sort_order"] = (LLSD::Integer)sort_order; + folder_sd["fetch_folders"] = (LLSD::Boolean)FALSE; + folder_sd["fetch_items"] = (LLSD::Boolean)TRUE; + body["folders"].append(folder_sd); + folder_count++; + } + else + { + const LLViewerInventoryCategory* cat = gInventory.getCategory(cat_id); + + if (cat) + { + if (LLViewerInventoryCategory::VERSION_UNKNOWN == cat->getVersion()) + { + LLSD folder_sd; + folder_sd["folder_id"] = cat->getUUID(); + folder_sd["owner_id"] = cat->getOwnerID(); + folder_sd["sort_order"] = (LLSD::Integer)sort_order; + folder_sd["fetch_folders"] = TRUE; //(LLSD::Boolean)sFullFetchStarted; + folder_sd["fetch_items"] = (LLSD::Boolean)TRUE; + + if (ALEXANDRIA_LINDEN_ID == cat->getOwnerID()) + body_lib["folders"].append(folder_sd); + else + body["folders"].append(folder_sd); + folder_count++; + } + // May already have this folder, but append child folders to list. + if (fetch_info.mRecursive) + { + LLInventoryModel::cat_array_t* categories; + LLInventoryModel::item_array_t* items; + gInventory.getDirectDescendentsOf(cat->getUUID(), categories, items); + for (LLInventoryModel::cat_array_t::const_iterator it = categories->begin(); + it != categories->end(); + ++it) + { + mFetchQueue.push_back(FetchQueueInfo((*it)->getUUID(), fetch_info.mRecursive)); + } + } + } + } + if (fetch_info.mRecursive) + recursive_cats.push_back(cat_id); + + mFetchQueue.pop_front(); + } + + if (folder_count > 0) + { + mBulkFetchCount++; + if (body["folders"].size()) + { + LLInventoryModelFetchDescendentsResponder *fetcher = new LLInventoryModelFetchDescendentsResponder(body, recursive_cats); + LLHTTPClient::post(url, body, fetcher, 300.0); + } + if (body_lib["folders"].size()) + { + std::string url_lib = gAgent.getRegion()->getCapability("FetchLibDescendents"); + + LLInventoryModelFetchDescendentsResponder *fetcher = new LLInventoryModelFetchDescendentsResponder(body_lib, recursive_cats); + LLHTTPClient::post(url_lib, body_lib, fetcher, 300.0); + } + mFetchTimer.reset(); + } + else if (isBulkFetchProcessingComplete()) + { + setAllFoldersFetched(); + } +} + +bool LLInventoryModelBackgroundFetch::fetchQueueContainsNoDescendentsOf(const LLUUID& cat_id) const +{ + for (fetch_queue_t::const_iterator it = mFetchQueue.begin(); + it != mFetchQueue.end(); ++it) + { + const LLUUID& fetch_id = (*it).mCatUUID; + if (gInventory.isObjectDescendentOf(fetch_id, cat_id)) + return false; + } + return true; +} + + diff --git a/indra/newview/llinventorymodelbackgroundfetch.h b/indra/newview/llinventorymodelbackgroundfetch.h new file mode 100644 index 0000000000..04f96586d7 --- /dev/null +++ b/indra/newview/llinventorymodelbackgroundfetch.h @@ -0,0 +1,108 @@ +/** + * @file llinventorymodelbackgroundfetch.h + * @brief LLInventoryModelBackgroundFetch class header file + * + * $LicenseInfo:firstyear=2002&license=viewergpl$ + * + * Copyright (c) 2002-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLINVENTORYMODELBACKGROUNDFETCH_H +#define LL_LLINVENTORYMODELBACKGROUNDFETCH_H + +#include "llsingleton.h" +#include "lluuid.h" + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Class LLInventoryModelBackgroundFetch +// +// This class handles background fetches, which are fetches of +// inventory folder. Fetches can be recursive or not. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +class LLInventoryModelBackgroundFetch : public LLSingleton<LLInventoryModelBackgroundFetch> +{ + friend class LLInventoryModelFetchDescendentsResponder; + +public: + LLInventoryModelBackgroundFetch(); + ~LLInventoryModelBackgroundFetch(); + + // Start and stop background breadth-first fetching of inventory contents. + // This gets triggered when performing a filter-search. + void start(const LLUUID& cat_id = LLUUID::null, BOOL recursive = TRUE); + + BOOL backgroundFetchActive() const; + bool isEverythingFetched() const; // completing the fetch once per session should be sufficient + + bool libraryFetchStarted() const; + bool libraryFetchCompleted() const; + bool libraryFetchInProgress() const; + + bool inventoryFetchStarted() const; + bool inventoryFetchCompleted() const; + bool inventoryFetchInProgress() const; + + void findLostItems(); +protected: + void incrBulkFetch(S16 fetching); + bool isBulkFetchProcessingComplete() const; + void bulkFetch(std::string url); + + void backgroundFetch(); + static void backgroundFetchCB(void*); // background fetch idle function + void stopBackgroundFetch(); // stop fetch process + + void setAllFoldersFetched(); + bool fetchQueueContainsNoDescendentsOf(const LLUUID& cat_id) const; +private: + BOOL mRecursiveInventoryFetchStarted; + BOOL mRecursiveLibraryFetchStarted; + BOOL mAllFoldersFetched; + + BOOL mBackgroundFetchActive; + S16 mBulkFetchCount; + BOOL mTimelyFetchPending; + S32 mNumFetchRetries; + + LLFrameTimer mFetchTimer; + F32 mMinTimeBetweenFetches; + F32 mMaxTimeBetweenFetches; + + struct FetchQueueInfo + { + FetchQueueInfo(const LLUUID& id, BOOL recursive) : + mCatUUID(id), mRecursive(recursive) + { + } + LLUUID mCatUUID; + BOOL mRecursive; + }; + typedef std::deque<FetchQueueInfo> fetch_queue_t; + fetch_queue_t mFetchQueue; +}; + +#endif // LL_LLINVENTORYMODELBACKGROUNDFETCH_H + diff --git a/indra/newview/llinventoryobserver.cpp b/indra/newview/llinventoryobserver.cpp index 2fb8aea4e9..bd6877d9d3 100644 --- a/indra/newview/llinventoryobserver.cpp +++ b/indra/newview/llinventoryobserver.cpp @@ -54,7 +54,6 @@ #include "llappviewer.h" #include "lldbstrings.h" #include "llviewerstats.h" -#include "llmutelist.h" #include "llnotificationsutil.h" #include "llcallbacklist.h" #include "llpreview.h" @@ -63,6 +62,9 @@ #include "llsdutil.h" #include <deque> +const F32 LLInventoryFetchItemsObserver::FETCH_TIMER_EXPIRY = 60.0f; + + LLInventoryObserver::LLInventoryObserver() { } @@ -72,21 +74,51 @@ LLInventoryObserver::~LLInventoryObserver() { } +LLInventoryFetchObserver::LLInventoryFetchObserver(const LLUUID& id) +{ + mIDs.clear(); + if (id != LLUUID::null) + { + setFetchID(id); + } +} + +LLInventoryFetchObserver::LLInventoryFetchObserver(const uuid_vec_t& ids) +{ + setFetchIDs(ids); +} + +BOOL LLInventoryFetchObserver::isFinished() const +{ + return mIncomplete.empty(); +} + +void LLInventoryFetchObserver::setFetchIDs(const uuid_vec_t& ids) +{ + mIDs = ids; +} +void LLInventoryFetchObserver::setFetchID(const LLUUID& id) +{ + mIDs.clear(); + mIDs.push_back(id); +} + + void LLInventoryCompletionObserver::changed(U32 mask) { // scan through the incomplete items and move or erase them as // appropriate. - if(!mIncomplete.empty()) + if (!mIncomplete.empty()) { - for(item_ref_t::iterator it = mIncomplete.begin(); it < mIncomplete.end(); ) + for (uuid_vec_t::iterator it = mIncomplete.begin(); it < mIncomplete.end(); ) { - LLViewerInventoryItem* item = gInventory.getItem(*it); - if(!item) + const LLViewerInventoryItem* item = gInventory.getItem(*it); + if (!item) { it = mIncomplete.erase(it); continue; } - if(item->isComplete()) + if (item->isFinished()) { mComplete.push_back(*it); it = mIncomplete.erase(it); @@ -94,7 +126,7 @@ void LLInventoryCompletionObserver::changed(U32 mask) } ++it; } - if(mIncomplete.empty()) + if (mIncomplete.empty()) { done(); } @@ -103,65 +135,79 @@ void LLInventoryCompletionObserver::changed(U32 mask) void LLInventoryCompletionObserver::watchItem(const LLUUID& id) { - if(id.notNull()) + if (id.notNull()) { mIncomplete.push_back(id); } } +LLInventoryFetchItemsObserver::LLInventoryFetchItemsObserver(const LLUUID& item_id) : + LLInventoryFetchObserver(item_id) +{ + mIDs.clear(); + mIDs.push_back(item_id); +} -void LLInventoryFetchObserver::changed(U32 mask) +LLInventoryFetchItemsObserver::LLInventoryFetchItemsObserver(const uuid_vec_t& item_ids) : + LLInventoryFetchObserver(item_ids) { +} + +void LLInventoryFetchItemsObserver::changed(U32 mask) +{ + lldebugs << this << " remaining incomplete " << mIncomplete.size() + << " complete " << mComplete.size() + << " wait period " << mFetchingPeriod.getRemainingTimeF32() + << llendl; + // scan through the incomplete items and move or erase them as // appropriate. - if(!mIncomplete.empty()) + if (!mIncomplete.empty()) { - for(item_ref_t::iterator it = mIncomplete.begin(); it < mIncomplete.end(); ) + + // Have we exceeded max wait time? + bool timeout_expired = mFetchingPeriod.hasExpired(); + + for (uuid_vec_t::iterator it = mIncomplete.begin(); it < mIncomplete.end(); ) { - LLViewerInventoryItem* item = gInventory.getItem(*it); - if(!item) + const LLUUID& item_id = (*it); + LLViewerInventoryItem* item = gInventory.getItem(item_id); + if (item && item->isFinished()) { - if (mRetryIfMissing) + mComplete.push_back(item_id); + it = mIncomplete.erase(it); + } + else + { + if (timeout_expired) { - // BAP changed to skip these items, so we should keep retrying until they arrive. - // Did not make this the default behavior because of uncertainty about impact - - // could cause some observers that currently complete to wait forever. - ++it; + // Just concede that this item hasn't arrived in reasonable time and continue on. + llwarns << "Fetcher timed out when fetching inventory item UUID: " << item_id << LL_ENDL; + it = mIncomplete.erase(it); } else { - // BUG: This can cause done() to get called prematurely below. - // This happens with the LLGestureInventoryFetchObserver that - // loads gestures at startup. JC - it = mIncomplete.erase(it); + // Keep trying. + ++it; } - continue; } - if(item->isComplete()) - { - mComplete.push_back(*it); - it = mIncomplete.erase(it); - continue; - } - ++it; - } - if(mIncomplete.empty()) - { - done(); } + } - //llinfos << "LLInventoryFetchObserver::changed() mComplete size " << mComplete.size() << llendl; - //llinfos << "LLInventoryFetchObserver::changed() mIncomplete size " << mIncomplete.size() << llendl; -} -bool LLInventoryFetchObserver::isEverythingComplete() const -{ - return mIncomplete.empty(); + if (mIncomplete.empty()) + { + lldebugs << this << " done at remaining incomplete " + << mIncomplete.size() << " complete " << mComplete.size() << llendl; + done(); + } + //llinfos << "LLInventoryFetchItemsObserver::changed() mComplete size " << mComplete.size() << llendl; + //llinfos << "LLInventoryFetchItemsObserver::changed() mIncomplete size " << mIncomplete.size() << llendl; } void fetch_items_from_llsd(const LLSD& items_llsd) { - if (!items_llsd.size()) return; + if (!items_llsd.size() || gDisconnected) return; LLSD body; body[0]["cap_name"] = "FetchInventory"; body[1]["cap_name"] = "FetchLib"; @@ -181,6 +227,11 @@ void fetch_items_from_llsd(const LLSD& items_llsd) for (S32 i=0; i<body.size(); i++) { + if(!gAgent.getRegion()) + { + llwarns<<"Agent's region is null"<<llendl; + break; + } if (0 >= body[i].size()) continue; std::string url = gAgent.getRegion()->getCapability(body[i]["cap_name"].asString()); @@ -196,7 +247,7 @@ void fetch_items_from_llsd(const LLSD& items_llsd) for (S32 j=0; j<body[i]["items"].size(); j++) { LLSD item_entry = body[i]["items"][j]; - if(start_new_message) + if (start_new_message) { start_new_message = FALSE; msg->newMessageFast(_PREHASH_FetchInventory); @@ -207,30 +258,29 @@ void fetch_items_from_llsd(const LLSD& items_llsd) msg->nextBlockFast(_PREHASH_InventoryData); msg->addUUIDFast(_PREHASH_OwnerID, item_entry["owner_id"].asUUID()); msg->addUUIDFast(_PREHASH_ItemID, item_entry["item_id"].asUUID()); - if(msg->isSendFull(NULL)) + if (msg->isSendFull(NULL)) { start_new_message = TRUE; gAgent.sendReliableMessage(); } } - if(!start_new_message) + if (!start_new_message) { gAgent.sendReliableMessage(); } } } -void LLInventoryFetchObserver::fetchItems( - const LLInventoryFetchObserver::item_ref_t& ids) +void LLInventoryFetchItemsObserver::startFetch() { LLUUID owner_id; LLSD items_llsd; - for(item_ref_t::const_iterator it = ids.begin(); it < ids.end(); ++it) + for (uuid_vec_t::const_iterator it = mIDs.begin(); it < mIDs.end(); ++it) { LLViewerInventoryItem* item = gInventory.getItem(*it); - if(item) + if (item) { - if(item->isComplete()) + if (item->isFinished()) { // It's complete, so put it on the complete container. mComplete.push_back(*it); @@ -246,7 +296,16 @@ void LLInventoryFetchObserver::fetchItems( // assume it's agent inventory. owner_id = gAgent.getID(); } - + + // Ignore categories since they're not items. We + // could also just add this to mComplete but not sure what the + // side-effects would be, so ignoring to be safe. + LLViewerInventoryCategory* cat = gInventory.getCategory(*it); + if (cat) + { + continue; + } + // It's incomplete, so put it on the incomplete container, and // pack this on the message. mIncomplete.push_back(*it); @@ -257,87 +316,95 @@ void LLInventoryFetchObserver::fetchItems( item_entry["item_id"] = (*it); items_llsd.append(item_entry); } + + mFetchingPeriod.reset(); + mFetchingPeriod.setTimerExpirySec(FETCH_TIMER_EXPIRY); + fetch_items_from_llsd(items_llsd); } +LLInventoryFetchDescendentsObserver::LLInventoryFetchDescendentsObserver(const LLUUID& cat_id) : + LLInventoryFetchObserver(cat_id) +{ +} + +LLInventoryFetchDescendentsObserver::LLInventoryFetchDescendentsObserver(const uuid_vec_t& cat_ids) : + LLInventoryFetchObserver(cat_ids) +{ +} + // virtual void LLInventoryFetchDescendentsObserver::changed(U32 mask) { - for(folder_ref_t::iterator it = mIncompleteFolders.begin(); it < mIncompleteFolders.end();) + for (uuid_vec_t::iterator it = mIncomplete.begin(); it < mIncomplete.end();) { - LLViewerInventoryCategory* cat = gInventory.getCategory(*it); - if(!cat) + const LLViewerInventoryCategory* cat = gInventory.getCategory(*it); + if (!cat) { - it = mIncompleteFolders.erase(it); + it = mIncomplete.erase(it); continue; } - if(isComplete(cat)) + if (isCategoryComplete(cat)) { - mCompleteFolders.push_back(*it); - it = mIncompleteFolders.erase(it); + mComplete.push_back(*it); + it = mIncomplete.erase(it); continue; } ++it; } - if(mIncompleteFolders.empty()) + if (mIncomplete.empty()) { done(); } } -void LLInventoryFetchDescendentsObserver::fetchDescendents( - const folder_ref_t& ids) +void LLInventoryFetchDescendentsObserver::startFetch() { - for(folder_ref_t::const_iterator it = ids.begin(); it != ids.end(); ++it) + for (uuid_vec_t::const_iterator it = mIDs.begin(); it != mIDs.end(); ++it) { LLViewerInventoryCategory* cat = gInventory.getCategory(*it); - if(!cat) continue; - if(!isComplete(cat)) + if (!cat) continue; + if (!isCategoryComplete(cat)) { - cat->fetchDescendents(); //blindly fetch it without seeing if anything else is fetching it. - mIncompleteFolders.push_back(*it); //Add to list of things being downloaded for this observer. + cat->fetch(); //blindly fetch it without seeing if anything else is fetching it. + mIncomplete.push_back(*it); //Add to list of things being downloaded for this observer. } else { - mCompleteFolders.push_back(*it); + mComplete.push_back(*it); } } } -bool LLInventoryFetchDescendentsObserver::isEverythingComplete() const -{ - return mIncompleteFolders.empty(); -} - -bool LLInventoryFetchDescendentsObserver::isComplete(LLViewerInventoryCategory* cat) +BOOL LLInventoryFetchDescendentsObserver::isCategoryComplete(const LLViewerInventoryCategory* cat) const { const S32 version = cat->getVersion(); const S32 expected_num_descendents = cat->getDescendentCount(); if ((version == LLViewerInventoryCategory::VERSION_UNKNOWN) || (expected_num_descendents == LLViewerInventoryCategory::DESCENDENT_COUNT_UNKNOWN)) { - return false; + return FALSE; } // it might be complete - check known descendents against // currently available. LLInventoryModel::cat_array_t* cats; LLInventoryModel::item_array_t* items; gInventory.getDirectDescendentsOf(cat->getUUID(), cats, items); - if(!cats || !items) + if (!cats || !items) { llwarns << "Category '" << cat->getName() << "' descendents corrupted, fetch failed." << llendl; // NULL means the call failed -- cats/items map doesn't exist (note: this does NOT mean // that the cat just doesn't have any items or subfolders). // Unrecoverable, so just return done so that this observer can be cleared // from memory. - return true; + return TRUE; } const S32 current_num_known_descendents = cats->count() + items->count(); // Got the number of descendents that we were expecting, so we're done. if (current_num_known_descendents == expected_num_descendents) { - return true; + return TRUE; } // Error condition, but recoverable. This happens if something was added to the @@ -346,125 +413,62 @@ bool LLInventoryFetchDescendentsObserver::isComplete(LLViewerInventoryCategory* if (current_num_known_descendents >= expected_num_descendents) { llwarns << "Category '" << cat->getName() << "' expected descendentcount:" << expected_num_descendents << " descendents but got descendentcount:" << current_num_known_descendents << llendl; - cat->setDescendentCount(current_num_known_descendents); - return true; + const_cast<LLViewerInventoryCategory *>(cat)->setDescendentCount(current_num_known_descendents); + return TRUE; } - return false; + return FALSE; } -void LLInventoryFetchComboObserver::changed(U32 mask) +LLInventoryFetchComboObserver::LLInventoryFetchComboObserver(const uuid_vec_t& folder_ids, + const uuid_vec_t& item_ids) { - if(!mIncompleteItems.empty()) - { - for(item_ref_t::iterator it = mIncompleteItems.begin(); it < mIncompleteItems.end(); ) - { - LLViewerInventoryItem* item = gInventory.getItem(*it); - if(!item) - { - it = mIncompleteItems.erase(it); - continue; - } - if(item->isComplete()) - { - mCompleteItems.push_back(*it); - it = mIncompleteItems.erase(it); - continue; - } - ++it; - } - } - if(!mIncompleteFolders.empty()) + mFetchDescendents = new LLInventoryFetchDescendentsObserver(folder_ids); + + uuid_vec_t pruned_item_ids; + for (uuid_vec_t::const_iterator item_iter = item_ids.begin(); + item_iter != item_ids.end(); + ++item_iter) { - for(folder_ref_t::iterator it = mIncompleteFolders.begin(); it < mIncompleteFolders.end();) + const LLUUID& item_id = (*item_iter); + const LLViewerInventoryItem* item = gInventory.getItem(item_id); + if (item && std::find(folder_ids.begin(), folder_ids.end(), item->getParentUUID()) == folder_ids.end()) { - LLViewerInventoryCategory* cat = gInventory.getCategory(*it); - if(!cat) - { - it = mIncompleteFolders.erase(it); - continue; - } - if(gInventory.isCategoryComplete(*it)) - { - mCompleteFolders.push_back(*it); - it = mIncompleteFolders.erase(it); - continue; - } - ++it; + continue; } + pruned_item_ids.push_back(item_id); } - if(!mDone && mIncompleteItems.empty() && mIncompleteFolders.empty()) - { - mDone = true; - done(); - } + + mFetchItems = new LLInventoryFetchItemsObserver(pruned_item_ids); + mFetchDescendents = new LLInventoryFetchDescendentsObserver(folder_ids); } -void LLInventoryFetchComboObserver::fetch( - const folder_ref_t& folder_ids, - const item_ref_t& item_ids) +LLInventoryFetchComboObserver::~LLInventoryFetchComboObserver() { - lldebugs << "LLInventoryFetchComboObserver::fetch()" << llendl; - for(folder_ref_t::const_iterator fit = folder_ids.begin(); fit != folder_ids.end(); ++fit) - { - LLViewerInventoryCategory* cat = gInventory.getCategory(*fit); - if(!cat) continue; - if(!gInventory.isCategoryComplete(*fit)) - { - cat->fetchDescendents(); - lldebugs << "fetching folder " << *fit <<llendl; - mIncompleteFolders.push_back(*fit); - } - else - { - mCompleteFolders.push_back(*fit); - lldebugs << "completing folder " << *fit <<llendl; - } - } + mFetchItems->done(); + mFetchDescendents->done(); + delete mFetchItems; + delete mFetchDescendents; +} - // Now for the items - we fetch everything which is not a direct - // descendent of an incomplete folder because the item will show - // up in an inventory descendents message soon enough so we do not - // have to fetch it individually. - LLSD items_llsd; - LLUUID owner_id; - for(item_ref_t::const_iterator iit = item_ids.begin(); iit != item_ids.end(); ++iit) +void LLInventoryFetchComboObserver::changed(U32 mask) +{ + mFetchItems->changed(mask); + mFetchDescendents->changed(mask); + if (mFetchItems->isFinished() && mFetchDescendents->isFinished()) { - LLViewerInventoryItem* item = gInventory.getItem(*iit); - if(!item) - { - lldebugs << "uanble to find item " << *iit << llendl; - continue; - } - if(item->isComplete()) - { - // It's complete, so put it on the complete container. - mCompleteItems.push_back(*iit); - lldebugs << "completing item " << *iit << llendl; - continue; - } - else - { - mIncompleteItems.push_back(*iit); - owner_id = item->getPermissions().getOwner(); - } - if(std::find(mIncompleteFolders.begin(), mIncompleteFolders.end(), item->getParentUUID()) == mIncompleteFolders.end()) - { - LLSD item_entry; - item_entry["owner_id"] = owner_id; - item_entry["item_id"] = (*iit); - items_llsd.append(item_entry); - } - else - { - lldebugs << "not worrying about " << *iit << llendl; - } + done(); } - fetch_items_from_llsd(items_llsd); +} + +void LLInventoryFetchComboObserver::startFetch() +{ + mFetchItems->startFetch(); + mFetchDescendents->startFetch(); } void LLInventoryExistenceObserver::watchItem(const LLUUID& id) { - if(id.notNull()) + if (id.notNull()) { mMIA.push_back(id); } @@ -474,12 +478,12 @@ void LLInventoryExistenceObserver::changed(U32 mask) { // scan through the incomplete items and move or erase them as // appropriate. - if(!mMIA.empty()) + if (!mMIA.empty()) { - for(item_ref_t::iterator it = mMIA.begin(); it < mMIA.end(); ) + for (uuid_vec_t::iterator it = mMIA.begin(); it < mMIA.end(); ) { LLViewerInventoryItem* item = gInventory.getItem(*it); - if(!item) + if (!item) { ++it; continue; @@ -487,20 +491,89 @@ void LLInventoryExistenceObserver::changed(U32 mask) mExist.push_back(*it); it = mMIA.erase(it); } - if(mMIA.empty()) + if (mMIA.empty()) { done(); } } } -void LLInventoryAddedObserver::changed(U32 mask) +void LLInventoryAddItemByAssetObserver::changed(U32 mask) { if(!(mask & LLInventoryObserver::ADD)) { return; } + // nothing is watched + if (mWatchedAssets.size() == 0) + { + return; + } + + LLMessageSystem* msg = gMessageSystem; + if (!(msg->getMessageName() && (0 == strcmp(msg->getMessageName(), "UpdateCreateInventoryItem")))) + { + // this is not our message + return; // to prevent a crash. EXT-7921; + } + + LLPointer<LLViewerInventoryItem> item = new LLViewerInventoryItem; + S32 num_blocks = msg->getNumberOfBlocksFast(_PREHASH_InventoryData); + for(S32 i = 0; i < num_blocks; ++i) + { + item->unpackMessage(msg, _PREHASH_InventoryData, i); + const LLUUID& asset_uuid = item->getAssetUUID(); + if (item->getUUID().notNull() && asset_uuid.notNull()) + { + if (isAssetWatched(asset_uuid)) + { + LL_DEBUGS("Inventory_Move") << "Found asset UUID: " << asset_uuid << LL_ENDL; + mAddedItems.push_back(item->getUUID()); + } + } + } + + if (mAddedItems.size() == mWatchedAssets.size()) + { + done(); + LL_DEBUGS("Inventory_Move") << "All watched items are added & processed." << LL_ENDL; + mAddedItems.clear(); + + // Unable to clean watched items here due to somebody can require to check them in current frame. + // set dirty state to clean them while next watch cycle. + mIsDirty = true; + } +} + +void LLInventoryAddItemByAssetObserver::watchAsset(const LLUUID& asset_id) +{ + if(asset_id.notNull()) + { + if (mIsDirty) + { + LL_DEBUGS("Inventory_Move") << "Watched items are dirty. Clean them." << LL_ENDL; + mWatchedAssets.clear(); + mIsDirty = false; + } + + mWatchedAssets.push_back(asset_id); + onAssetAdded(asset_id); + } +} + +bool LLInventoryAddItemByAssetObserver::isAssetWatched( const LLUUID& asset_id ) +{ + return std::find(mWatchedAssets.begin(), mWatchedAssets.end(), asset_id) != mWatchedAssets.end(); +} + +void LLInventoryAddedObserver::changed(U32 mask) +{ + if (!(mask & LLInventoryObserver::ADD)) + { + return; + } + // *HACK: If this was in response to a packet off // the network, figure out which item was updated. LLMessageSystem* msg = gMessageSystem; @@ -528,7 +601,7 @@ void LLInventoryAddedObserver::changed(U32 mask) LLPointer<LLViewerInventoryItem> titem = new LLViewerInventoryItem; S32 num_blocks = msg->getNumberOfBlocksFast(_PREHASH_InventoryData); - for(S32 i = 0; i < num_blocks; ++i) + for (S32 i = 0; i < num_blocks; ++i) { titem->unpackMessage(msg, _PREHASH_InventoryData, i); if (!(titem->getUUID().isNull())) @@ -543,46 +616,45 @@ void LLInventoryAddedObserver::changed(U32 mask) } } -LLInventoryTransactionObserver::LLInventoryTransactionObserver( - const LLTransactionID& transaction_id) : +LLInventoryTransactionObserver::LLInventoryTransactionObserver(const LLTransactionID& transaction_id) : mTransactionID(transaction_id) { } void LLInventoryTransactionObserver::changed(U32 mask) { - if(mask & LLInventoryObserver::ADD) + if (mask & LLInventoryObserver::ADD) { // This could be it - see if we are processing a bulk update LLMessageSystem* msg = gMessageSystem; - if(msg->getMessageName() + if (msg->getMessageName() && (0 == strcmp(msg->getMessageName(), "BulkUpdateInventory"))) { // we have a match for the message - now check the // transaction id. LLUUID id; msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_TransactionID, id); - if(id == mTransactionID) + if (id == mTransactionID) { // woo hoo, we found it - folder_ref_t folders; - item_ref_t items; + uuid_vec_t folders; + uuid_vec_t items; S32 count; count = msg->getNumberOfBlocksFast(_PREHASH_FolderData); S32 i; - for(i = 0; i < count; ++i) + for (i = 0; i < count; ++i) { msg->getUUIDFast(_PREHASH_FolderData, _PREHASH_FolderID, id, i); - if(id.notNull()) + if (id.notNull()) { folders.push_back(id); } } count = msg->getNumberOfBlocksFast(_PREHASH_ItemData); - for(i = 0; i < count; ++i) + for (i = 0; i < count; ++i) { msg->getUUIDFast(_PREHASH_ItemData, _PREHASH_ItemID, id, i); - if(id.notNull()) + if (id.notNull()) { items.push_back(id); } @@ -594,3 +666,105 @@ void LLInventoryTransactionObserver::changed(U32 mask) } } } + +void LLInventoryCategoriesObserver::changed(U32 mask) +{ + if (!mCategoryMap.size()) + return; + + for (category_map_t::iterator iter = mCategoryMap.begin(); + iter != mCategoryMap.end(); + ++iter) + { + LLViewerInventoryCategory* category = gInventory.getCategory((*iter).first); + if (!category) + continue; + + const S32 version = category->getVersion(); + const S32 expected_num_descendents = category->getDescendentCount(); + if ((version == LLViewerInventoryCategory::VERSION_UNKNOWN) || + (expected_num_descendents == LLViewerInventoryCategory::DESCENDENT_COUNT_UNKNOWN)) + { + continue; + } + + // Check number of known descendents to find out whether it has changed. + LLInventoryModel::cat_array_t* cats; + LLInventoryModel::item_array_t* items; + gInventory.getDirectDescendentsOf((*iter).first, cats, items); + if (!cats || !items) + { + llwarns << "Category '" << category->getName() << "' descendents corrupted, fetch failed." << llendl; + // NULL means the call failed -- cats/items map doesn't exist (note: this does NOT mean + // that the cat just doesn't have any items or subfolders). + // Unrecoverable, so just skip this category. + + llassert(cats != NULL && items != NULL); + + continue; + } + + const S32 current_num_known_descendents = cats->count() + items->count(); + + LLCategoryData cat_data = (*iter).second; + + // If category version or descendents count has changed + // update category data in mCategoryMap and fire a callback. + if (version != cat_data.mVersion || current_num_known_descendents != cat_data.mDescendentsCount) + { + cat_data.mVersion = version; + cat_data.mDescendentsCount = current_num_known_descendents; + + cat_data.mCallback(); + } + } +} + +bool LLInventoryCategoriesObserver::addCategory(const LLUUID& cat_id, callback_t cb) +{ + S32 version = LLViewerInventoryCategory::VERSION_UNKNOWN; + S32 current_num_known_descendents = LLViewerInventoryCategory::DESCENDENT_COUNT_UNKNOWN; + bool can_be_added = true; + + LLViewerInventoryCategory* category = gInventory.getCategory(cat_id); + // If category could not be retrieved it might mean that + // inventory is unusable at the moment so the category is + // stored with VERSION_UNKNOWN and DESCENDENT_COUNT_UNKNOWN, + // it may be updated later. + if (category) + { + // Inventory category version is used to find out if some changes + // to a category have been made. + version = category->getVersion(); + + LLInventoryModel::cat_array_t* cats; + LLInventoryModel::item_array_t* items; + gInventory.getDirectDescendentsOf(cat_id, cats, items); + if (!cats || !items) + { + llwarns << "Category '" << category->getName() << "' descendents corrupted, fetch failed." << llendl; + // NULL means the call failed -- cats/items map doesn't exist (note: this does NOT mean + // that the cat just doesn't have any items or subfolders). + // Unrecoverable, so just return "false" meaning that the category can't be observed. + can_be_added = false; + + llassert(cats != NULL && items != NULL); + } + else + { + current_num_known_descendents = cats->count() + items->count(); + } + } + + if (can_be_added) + { + mCategoryMap.insert(category_map_value_t(cat_id, LLCategoryData(cb, version, current_num_known_descendents))); + } + + return can_be_added; +} + +void LLInventoryCategoriesObserver::removeCategory(const LLUUID& cat_id) +{ + mCategoryMap.erase(cat_id); +} diff --git a/indra/newview/llinventoryobserver.h b/indra/newview/llinventoryobserver.h index d6dded52d4..4a88a65bf8 100644 --- a/indra/newview/llinventoryobserver.h +++ b/indra/newview/llinventoryobserver.h @@ -42,10 +42,9 @@ class LLViewerInventoryCategory; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Class LLInventoryObserver // -// This class is designed to be a simple abstract base class which can -// relay messages when the inventory changes. +// A simple abstract base class that can relay messages when the inventory +// changes. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - class LLInventoryObserver { public: @@ -54,17 +53,17 @@ public: // chaged() to see if the observer is interested in the change. enum { - NONE = 0, - LABEL = 1, // name changed - INTERNAL = 2, // internal change (e.g. asset uuid different) - ADD = 4, // something added - REMOVE = 8, // something deleted - STRUCTURE = 16, // structural change (eg item or folder moved) - CALLING_CARD = 32, // (eg online, grant status, cancel) - GESTURE = 64, - REBUILD = 128, // item UI changed (eg item type different) - SORT = 256, // folder needs to be resorted. - ALL = 0xffffffff + NONE = 0, + LABEL = 1, // Name changed + INTERNAL = 2, // Internal change (e.g. asset uuid different) + ADD = 4, // Something added + REMOVE = 8, // Something deleted + STRUCTURE = 16, // Structural change (e.g. item or folder moved) + CALLING_CARD = 32, // Calling card change (e.g. online, grant status, cancel) + GESTURE = 64, + REBUILD = 128, // Item UI changed (e.g. item type different) + SORT = 256, // Folder needs to be resorted. + ALL = 0xffffffff }; LLInventoryObserver(); virtual ~LLInventoryObserver(); @@ -73,182 +72,243 @@ public: }; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// Class LLInventoryCompletionObserver +// Class LLInventoryFetchObserver // -// Class which can be used as a base class for doing something when -// when all observed items are locally complete. This class implements -// the changed() method of LLInventoryObserver and declares a new -// method named done() which is called when all watched items have -// complete information in the inventory model. +// Abstract class to handle fetching items, folders, etc. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -class LLInventoryCompletionObserver : public LLInventoryObserver +class LLInventoryFetchObserver : public LLInventoryObserver { public: - LLInventoryCompletionObserver() {} - virtual void changed(U32 mask); + LLInventoryFetchObserver(const LLUUID& id = LLUUID::null); // single item + LLInventoryFetchObserver(const uuid_vec_t& ids); // multiple items + void setFetchID(const LLUUID& id); + void setFetchIDs(const uuid_vec_t& ids); - void watchItem(const LLUUID& id); + BOOL isFinished() const; + virtual void startFetch() = 0; + virtual void changed(U32 mask) = 0; + virtual void done() {}; protected: - virtual void done() = 0; - - typedef std::vector<LLUUID> item_ref_t; - item_ref_t mComplete; - item_ref_t mIncomplete; + uuid_vec_t mComplete; + uuid_vec_t mIncomplete; + uuid_vec_t mIDs; }; - //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// Class LLInventoryFetchObserver +// Class LLInventoryFetchItemsObserver // -// This class is much like the LLInventoryCompletionObserver, except -// that it handles all the the fetching necessary. Override the done() -// method to do the thing you want. +// Fetches inventory items, calls done() when all inventory has arrived. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -class LLInventoryFetchObserver : public LLInventoryObserver +class LLInventoryFetchItemsObserver : public LLInventoryFetchObserver { public: - LLInventoryFetchObserver(bool retry_if_missing = false): mRetryIfMissing(retry_if_missing) {} - virtual void changed(U32 mask); - - typedef std::vector<LLUUID> item_ref_t; - - bool isEverythingComplete() const; - void fetchItems(const item_ref_t& ids); - virtual void done() {}; - -protected: - bool mRetryIfMissing; - item_ref_t mComplete; - item_ref_t mIncomplete; + LLInventoryFetchItemsObserver(const LLUUID& item_id = LLUUID::null); + LLInventoryFetchItemsObserver(const uuid_vec_t& item_ids); + + /*virtual*/ void startFetch(); + /*virtual*/ void changed(U32 mask); +private: + LLTimer mFetchingPeriod; + + /** + * Period of waiting a notification when requested items get added into inventory. + */ + static const F32 FETCH_TIMER_EXPIRY; }; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Class LLInventoryFetchDescendentsObserver // -// This class is much like the LLInventoryCompletionObserver, except -// that it handles fetching based on category. Override the done() -// method to do the thing you want. +// Fetches children of a category/folder, calls done() when all +// inventory has arrived. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -class LLInventoryFetchDescendentsObserver : public LLInventoryObserver +class LLInventoryFetchDescendentsObserver : public LLInventoryFetchObserver { public: - LLInventoryFetchDescendentsObserver() {} - virtual void changed(U32 mask); - - typedef std::vector<LLUUID> folder_ref_t; - void fetchDescendents(const folder_ref_t& ids); - bool isEverythingComplete() const; - virtual void done() = 0; + LLInventoryFetchDescendentsObserver(const LLUUID& cat_id = LLUUID::null); + LLInventoryFetchDescendentsObserver(const uuid_vec_t& cat_ids); + /*virtual*/ void startFetch(); + /*virtual*/ void changed(U32 mask); protected: - bool isComplete(LLViewerInventoryCategory* cat); - folder_ref_t mIncompleteFolders; - folder_ref_t mCompleteFolders; + BOOL isCategoryComplete(const LLViewerInventoryCategory* cat) const; }; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Class LLInventoryFetchComboObserver // -// This class does an appropriate combination of fetch descendents and -// item fetches based on completion of categories and items. Much like -// the fetch and fetch descendents, this will call done() when everything -// has arrived. +// Does an appropriate combination of fetch descendents and +// item fetches based on completion of categories and items. This is optimized +// to not fetch item_ids that are descendents of any of the folder_ids. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ class LLInventoryFetchComboObserver : public LLInventoryObserver { public: - LLInventoryFetchComboObserver() : mDone(false) {} - virtual void changed(U32 mask); - - typedef std::vector<LLUUID> folder_ref_t; - typedef std::vector<LLUUID> item_ref_t; - void fetch(const folder_ref_t& folder_ids, const item_ref_t& item_ids); + LLInventoryFetchComboObserver(const uuid_vec_t& folder_ids, + const uuid_vec_t& item_ids); + ~LLInventoryFetchComboObserver(); + /*virtual*/ void changed(U32 mask); + void startFetch(); virtual void done() = 0; - protected: - bool mDone; - folder_ref_t mCompleteFolders; - folder_ref_t mIncompleteFolders; - item_ref_t mCompleteItems; - item_ref_t mIncompleteItems; + LLInventoryFetchItemsObserver *mFetchItems; + LLInventoryFetchDescendentsObserver *mFetchDescendents; }; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Class LLInventoryExistenceObserver // -// This class is used as a base class for doing somethign when all the -// observed item ids exist in the inventory somewhere. You can derive -// a class from this class and implement the done() method to do -// something useful. +// Used as a base class for doing something when all the +// observed item ids exist in the inventory somewhere. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - class LLInventoryExistenceObserver : public LLInventoryObserver { public: LLInventoryExistenceObserver() {} - virtual void changed(U32 mask); + /*virtual*/ void changed(U32 mask); void watchItem(const LLUUID& id); +protected: + virtual void done() = 0; + uuid_vec_t mExist; + uuid_vec_t mMIA; +}; + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Class LLInventoryMovedObserver +// +// This class is used as a base class for doing something when all the +// item for observed asset ids were added into the inventory. +// Derive a class from this class and implement the done() method to do +// something useful. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +class LLInventoryAddItemByAssetObserver : public LLInventoryObserver +{ +public: + LLInventoryAddItemByAssetObserver() : mIsDirty(false) {} + virtual void changed(U32 mask); + + void watchAsset(const LLUUID& asset_id); + bool isAssetWatched(const LLUUID& asset_id); protected: + virtual void onAssetAdded(const LLUUID& asset_id) {} virtual void done() = 0; typedef std::vector<LLUUID> item_ref_t; - item_ref_t mExist; - item_ref_t mMIA; + item_ref_t mAddedItems; + item_ref_t mWatchedAssets; + +private: + bool mIsDirty; }; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Class LLInventoryAddedObserver // -// This class is used as a base class for doing something when -// a new item arrives in inventory. -// It does not watch for a certain UUID, rather it acts when anything is added -// Derive a class from this class and implement the done() method to do -// something useful. +// Base class for doing something when a new item arrives in inventory. +// It does not watch for a certain UUID, rather it acts when anything is added //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - class LLInventoryAddedObserver : public LLInventoryObserver { public: LLInventoryAddedObserver() : mAdded() {} - virtual void changed(U32 mask); + /*virtual*/ void changed(U32 mask); protected: virtual void done() = 0; - typedef std::vector<LLUUID> item_ref_t; - item_ref_t mAdded; + uuid_vec_t mAdded; }; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Class LLInventoryTransactionObserver // -// Class which can be used as a base class for doing something when an -// inventory transaction completes. -// -// *NOTE: This class is not quite complete. Avoid using unless you fix up it's -// functionality gaps. +// Base class for doing something when an inventory transaction completes. +// NOTE: This class is not quite complete. Avoid using unless you fix up its +// functionality gaps. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - class LLInventoryTransactionObserver : public LLInventoryObserver { public: LLInventoryTransactionObserver(const LLTransactionID& transaction_id); - virtual void changed(U32 mask); + /*virtual*/ void changed(U32 mask); protected: - typedef std::vector<LLUUID> folder_ref_t; - typedef std::vector<LLUUID> item_ref_t; - virtual void done(const folder_ref_t& folders, const item_ref_t& items) = 0; + virtual void done(const uuid_vec_t& folders, const uuid_vec_t& items) = 0; LLTransactionID mTransactionID; }; +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Class LLInventoryCompletionObserver +// +// Base class for doing something when when all observed items are locally +// complete. Implements the changed() method of LLInventoryObserver +// and declares a new method named done() which is called when all watched items +// have complete information in the inventory model. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +class LLInventoryCompletionObserver : public LLInventoryObserver +{ +public: + LLInventoryCompletionObserver() {} + /*virtual*/ void changed(U32 mask); -#endif // LL_LLINVENTORYOBSERVERS_H + void watchItem(const LLUUID& id); +protected: + virtual void done() = 0; + + uuid_vec_t mComplete; + uuid_vec_t mIncomplete; +}; + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Class LLInventoryCategoriesObserver +// +// This class is used for monitoring a list of inventory categories +// and firing a callback when there are changes in any of them. +// Categories are identified by their UUIDs. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +class LLInventoryCategoriesObserver : public LLInventoryObserver +{ +public: + typedef boost::function<void()> callback_t; + + LLInventoryCategoriesObserver() {}; + virtual void changed(U32 mask); + + /** + * Add cat_id to the list of observed categories with a + * callback fired on category being changed. + * + * @return "true" if category was added, "false" if it could + * not be found. + */ + bool addCategory(const LLUUID& cat_id, callback_t cb); + void removeCategory(const LLUUID& cat_id); + +protected: + struct LLCategoryData + { + LLCategoryData(callback_t cb, S32 version, S32 num_descendents) + : mCallback(cb) + , mVersion(version) + , mDescendentsCount(num_descendents) + {} + + callback_t mCallback; + S32 mVersion; + S32 mDescendentsCount; + }; + + typedef std::map<LLUUID, LLCategoryData> category_map_t; + typedef category_map_t::value_type category_map_value_t; + + category_map_t mCategoryMap; +}; + +#endif // LL_LLINVENTORYOBSERVERS_H diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index a6d63e58f5..72d35af3b7 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -38,14 +38,18 @@ #include "llagent.h" #include "llagentwearables.h" #include "llappearancemgr.h" +#include "llavataractions.h" #include "llfloaterinventory.h" #include "llfloaterreg.h" #include "llimfloater.h" #include "llimview.h" #include "llinventorybridge.h" +#include "llinventoryfunctions.h" +#include "llinventorymodelbackgroundfetch.h" #include "llsidepanelinventory.h" #include "llsidetray.h" #include "llscrollcontainer.h" +#include "llviewerattachmenu.h" #include "llviewerfoldertype.h" #include "llvoavatarself.h" @@ -78,11 +82,12 @@ protected: LLInventoryPanel::LLInventoryPanel(const LLInventoryPanel::Params& p) : LLPanel(p), mInventoryObserver(NULL), - mFolders(NULL), + mFolderRoot(NULL), mScroller(NULL), mSortOrderSetting(p.sort_order_setting), mInventory(p.inventory), mAllowMultiSelect(p.allow_multi_select), + mShowItemLinkOverlays(p.show_item_link_overlays), mViewsInitialized(false), mStartFolderString(p.start_folder), mBuildDefaultHierarchy(true), @@ -97,6 +102,7 @@ LLInventoryPanel::LLInventoryPanel(const LLInventoryPanel::Params& p) : mCommitCallbackRegistrar.add("Inventory.DoCreate", boost::bind(&LLInventoryPanel::doCreate, this, _2)); mCommitCallbackRegistrar.add("Inventory.AttachObject", boost::bind(&LLInventoryPanel::attachObject, this, _2)); mCommitCallbackRegistrar.add("Inventory.BeginIMSession", boost::bind(&LLInventoryPanel::beginIMSession, this)); + mCommitCallbackRegistrar.add("Inventory.Share", boost::bind(&LLAvatarActions::shareWithAvatars)); if (mStartFolderString != "") { @@ -104,7 +110,7 @@ LLInventoryPanel::LLInventoryPanel(const LLInventoryPanel::Params& p) : } } -BOOL LLInventoryPanel::postBuild() +void LLInventoryPanel::initFromParams(const LLInventoryPanel::Params& params) { LLMemType mt(LLMemType::MTYPE_INVENTORY_POST_BUILD); @@ -118,16 +124,18 @@ BOOL LLInventoryPanel::postBuild() 0); LLFolderView::Params p; p.name = getName(); + p.title = getLabel(); p.rect = folder_rect; p.parent_panel = this; p.tool_tip = p.name; - mFolders = LLUICtrlFactory::create<LLFolderView>(p); - mFolders->setAllowMultiSelect(mAllowMultiSelect); + p.use_label_suffix = params.use_label_suffix; + mFolderRoot = LLUICtrlFactory::create<LLFolderView>(p); + mFolderRoot->setAllowMultiSelect(mAllowMultiSelect); } mCommitCallbackRegistrar.popScope(); - mFolders->setCallbackRegistrar(&mCommitCallbackRegistrar); + mFolderRoot->setCallbackRegistrar(&mCommitCallbackRegistrar); // Scroller { @@ -141,8 +149,9 @@ BOOL LLInventoryPanel::postBuild() p.tab_stop(true); mScroller = LLUICtrlFactory::create<LLScrollContainer>(p); addChild(mScroller); - mScroller->addChild(mFolders); - mFolders->setScrollContainer(mScroller); + mScroller->addChild(mFolderRoot); + mFolderRoot->setScrollContainer(mScroller); + mFolderRoot->addChild(mFolderRoot->mStatusTextBox); } // Set up the callbacks from the inventory we're viewing, and then build everything. @@ -165,22 +174,22 @@ BOOL LLInventoryPanel::postBuild() { setSortOrder(gSavedSettings.getU32(DEFAULT_SORT_ORDER)); } - mFolders->setSortOrder(getFilter()->getSortOrder()); - - return TRUE; + mFolderRoot->setSortOrder(getFilter()->getSortOrder()); } LLInventoryPanel::~LLInventoryPanel() { - if (mFolders) + if (mFolderRoot) { - U32 sort_order = mFolders->getSortOrder(); + U32 sort_order = mFolderRoot->getSortOrder(); if (mSortOrderSetting != INHERIT_SORT_ORDER) { gSavedSettings.setU32(mSortOrderSetting, sort_order); } } + gIdleCallbacks.deleteFunction(onIdle, this); + // LLView destructor will take care of the sub-views. mInventory->removeObserver(mInventoryObserver); delete mInventoryObserver; @@ -190,15 +199,15 @@ LLInventoryPanel::~LLInventoryPanel() void LLInventoryPanel::draw() { // Select the desired item (in case it wasn't loaded when the selection was requested) - mFolders->updateSelection(); + mFolderRoot->updateSelection(); LLPanel::draw(); } LLInventoryFilter* LLInventoryPanel::getFilter() { - if (mFolders) + if (mFolderRoot) { - return mFolders->getFilter(); + return mFolderRoot->getFilter(); } return NULL; } @@ -216,6 +225,11 @@ void LLInventoryPanel::setFilterPermMask(PermissionMask filter_perm_mask) getFilter()->setFilterPermissions(filter_perm_mask); } +void LLInventoryPanel::setFilterWearableTypes(U64 types) +{ + getFilter()->setFilterWearableTypes(types); +} + void LLInventoryPanel::setFilterSubString(const std::string& string) { getFilter()->setFilterSubString(string); @@ -226,9 +240,9 @@ void LLInventoryPanel::setSortOrder(U32 order) getFilter()->setSortOrder(order); if (getFilter()->isModified()) { - mFolders->setSortOrder(order); + mFolderRoot->setSortOrder(order); // try to keep selection onscreen, even if it wasn't to start with - mFolders->scrollToShowSelection(); + mFolderRoot->scrollToShowSelection(); } } @@ -242,6 +256,11 @@ void LLInventoryPanel::setHoursAgo(U32 hours) getFilter()->setHoursAgo(hours); } +void LLInventoryPanel::setIncludeLinks(BOOL include_links) +{ + getFilter()->setIncludeLinks(include_links); +} + void LLInventoryPanel::setShowFolderState(LLInventoryFilter::EFolderShow show) { getFilter()->setShowFolderState(show); @@ -273,8 +292,8 @@ void LLInventoryPanel::modelChanged(U32 mask) { const LLUUID& item_id = (*items_iter); const LLInventoryObject* model_item = model->getObject(item_id); - LLFolderViewItem* view_item = mFolders->getItemByID(item_id); - LLFolderViewFolder* view_folder = mFolders->getFolderByID(item_id); + LLFolderViewItem* view_item = mFolderRoot->getItemByID(item_id); + LLFolderViewFolder* view_folder = mFolderRoot->getFolderByID(item_id); ////////////////////////////// // LABEL Operation @@ -289,8 +308,9 @@ void LLInventoryPanel::modelChanged(U32 mask) if(bridge) { // Clear the display name first, so it gets properly re-built during refresh() bridge->clearDisplayName(); + + view_item->refresh(); } - view_item->refresh(); } } @@ -348,7 +368,7 @@ void LLInventoryPanel::modelChanged(U32 mask) // Add the UI element for this item. buildNewViews(item_id); // Select any newly created object that has the auto rename at top of folder root set. - if(mFolders->getRoot()->needsAutoRename()) + if(mFolderRoot->getRoot()->needsAutoRename()) { setSelection(item_id, FALSE); } @@ -363,7 +383,7 @@ void LLInventoryPanel::modelChanged(U32 mask) // model_item's parent will be NULL. if (view_item->getRoot() != view_item->getParent()) { - LLFolderViewFolder* new_parent = (LLFolderViewFolder*)mFolders->getItemByID(model_item->getParentUUID()); + LLFolderViewFolder* new_parent = (LLFolderViewFolder*)mFolderRoot->getItemByID(model_item->getParentUUID()); // Item has been moved. if (view_item->getParentFolder() != new_parent) { @@ -371,7 +391,7 @@ void LLInventoryPanel::modelChanged(U32 mask) { // Item is to be moved and we found its new parent in the panel's directory, so move the item's UI. view_item->getParentFolder()->extractItem(view_item); - view_item->addToFolder(new_parent, mFolders); + view_item->addToFolder(new_parent, mFolderRoot); } else { @@ -439,14 +459,14 @@ void LLInventoryPanel::initializeViews() if (gAgent.isFirstLogin()) { // Auto open the user's library - LLFolderViewFolder* lib_folder = mFolders->getFolderByID(gInventory.getLibraryRootFolderID()); + LLFolderViewFolder* lib_folder = mFolderRoot->getFolderByID(gInventory.getLibraryRootFolderID()); if (lib_folder) { lib_folder->setOpen(TRUE); } // Auto close the user's my inventory folder - LLFolderViewFolder* my_inv_folder = mFolders->getFolderByID(gInventory.getRootFolderID()); + LLFolderViewFolder* my_inv_folder = mFolderRoot->getFolderByID(gInventory.getRootFolderID()); if (my_inv_folder) { my_inv_folder->setOpenArrangeRecursively(FALSE, LLFolderViewFolder::RECURSE_DOWN); @@ -457,7 +477,7 @@ void LLInventoryPanel::initializeViews() void LLInventoryPanel::rebuildViewsFor(const LLUUID& id) { // Destroy the old view for this ID so we can rebuild it. - LLFolderViewItem* old_view = mFolders->getItemByID(id); + LLFolderViewItem* old_view = mFolderRoot->getItemByID(id); if (old_view && id.notNull()) { old_view->destroyView(); @@ -474,10 +494,10 @@ void LLInventoryPanel::buildNewViews(const LLUUID& id) if (objectp) { const LLUUID &parent_id = objectp->getParentUUID(); - LLFolderViewFolder* parent_folder = (LLFolderViewFolder*)mFolders->getItemByID(parent_id); + LLFolderViewFolder* parent_folder = (LLFolderViewFolder*)mFolderRoot->getItemByID(parent_id); if (id == mStartFolderID) { - parent_folder = mFolders; + parent_folder = mFolderRoot; } else if ((mStartFolderID != LLUUID::null) && (!gInventory.isObjectDescendentOf(id, mStartFolderID))) { @@ -501,19 +521,23 @@ void LLInventoryPanel::buildNewViews(const LLUUID& id) objectp->getType(), LLInventoryType::IT_CATEGORY, this, + mFolderRoot, objectp->getUUID()); - if (new_listener) { LLFolderViewFolder::Params params; params.name = new_listener->getDisplayName(); params.icon = new_listener->getIcon(); params.icon_open = new_listener->getOpenIcon(); - params.root = mFolders; + if (mShowItemLinkOverlays) // if false, then links show up just like normal items + { + params.icon_overlay = LLUI::getUIImage("Inv_Link"); + } + params.root = mFolderRoot; params.listener = new_listener; params.tool_tip = params.name; LLFolderViewFolder* folderp = LLUICtrlFactory::create<LLFolderViewFolder>(params); - folderp->setItemSortOrder(mFolders->getSortOrder()); + folderp->setItemSortOrder(mFolderRoot->getSortOrder()); itemp = folderp; // Hide the root folder, so we can show the contents of a folder flat @@ -522,6 +546,11 @@ void LLInventoryPanel::buildNewViews(const LLUUID& id) { folderp->setHidden(TRUE); } + const LLViewerInventoryCategory *cat = dynamic_cast<LLViewerInventoryCategory *>(objectp); + if (cat && getIsHiddenFolderType(cat->getPreferredType())) + { + folderp->setHidden(TRUE); + } } } else @@ -532,6 +561,7 @@ void LLInventoryPanel::buildNewViews(const LLUUID& id) item->getActualType(), item->getInventoryType(), this, + mFolderRoot, item->getUUID(), item->getFlags()); @@ -541,8 +571,12 @@ void LLInventoryPanel::buildNewViews(const LLUUID& id) params.name = new_listener->getDisplayName(); params.icon = new_listener->getIcon(); params.icon_open = new_listener->getOpenIcon(); + if (mShowItemLinkOverlays) // if false, then links show up just like normal items + { + params.icon_overlay = LLUI::getUIImage("Inv_Link"); + } params.creation_date = new_listener->getCreationDate(); - params.root = mFolders; + params.root = mFolderRoot; params.listener = new_listener; params.rect = LLRect (0, 0, 0, 0); params.tool_tip = params.name; @@ -552,7 +586,13 @@ void LLInventoryPanel::buildNewViews(const LLUUID& id) if (itemp) { - itemp->addToFolder(parent_folder, mFolders); + itemp->addToFolder(parent_folder, mFolderRoot); + + // Don't add children of hidden folders unless this is the panel's root folder. + if (itemp->getHidden() && (id != mStartFolderID)) + { + return; + } } } @@ -595,19 +635,19 @@ void LLInventoryPanel::openStartFolderOrMyInventory() { if (mStartFolderString != "") { - mFolders->openFolder(mStartFolderString); + mFolderRoot->openFolder(mStartFolderString); } else { // Find My Inventory folder and open it up by name - for (LLView *child = mFolders->getFirstChild(); child; child = mFolders->findNextSibling(child)) + for (LLView *child = mFolderRoot->getFirstChild(); child; child = mFolderRoot->findNextSibling(child)) { LLFolderViewFolder *fchild = dynamic_cast<LLFolderViewFolder*>(child); if (fchild && fchild->getListener() && (fchild->getListener()->getUUID() == gInventory.getRootFolderID())) { const std::string& child_name = child->getName(); - mFolders->openFolder(child_name); + mFolderRoot->openFolder(child_name); break; } } @@ -616,7 +656,7 @@ void LLInventoryPanel::openStartFolderOrMyInventory() void LLInventoryPanel::openSelected() { - LLFolderViewItem* folder_item = mFolders->getCurSelectedItem(); + LLFolderViewItem* folder_item = mFolderRoot->getCurSelectedItem(); if(!folder_item) return; LLInvFVBridge* bridge = (LLInvFVBridge*)folder_item->getListener(); if(!bridge) return; @@ -629,7 +669,7 @@ BOOL LLInventoryPanel::handleHover(S32 x, S32 y, MASK mask) if(handled) { ECursorType cursor = getWindow()->getCursor(); - if (LLInventoryModel::backgroundFetchActive() && cursor == UI_CURSOR_ARROW) + if (LLInventoryModelBackgroundFetch::instance().backgroundFetchActive() && cursor == UI_CURSOR_ARROW) { // replace arrow cursor with arrow and hourglass cursor getWindow()->setCursor(UI_CURSOR_WORKING); @@ -652,23 +692,39 @@ BOOL LLInventoryPanel::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, // If folder view is empty the (x, y) point won't be in its rect // so the handler must be called explicitly. - if (!mFolders->hasVisibleChildren()) + // but only if was not handled before. See EXT-6746. + if (!handled && !mFolderRoot->hasVisibleChildren()) { - handled = mFolders->handleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg); + handled = mFolderRoot->handleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg); } if (handled) { - mFolders->setDragAndDropThisFrame(); + mFolderRoot->setDragAndDropThisFrame(); } return handled; } +// virtual +void LLInventoryPanel::onMouseEnter(S32 x, S32 y, MASK mask) +{ + LLPanel::onMouseEnter(x, y, mask); + // don't auto-scroll a list when cursor is over Inventory. See EXT-3981. + mFolderRoot->setEnableScroll(false); +} + +// virtual +void LLInventoryPanel::onMouseLeave(S32 x, S32 y, MASK mask) +{ + LLPanel::onMouseLeave(x, y, mask); + mFolderRoot->setEnableScroll(true); +} + void LLInventoryPanel::onFocusLost() { // inventory no longer handles cut/copy/paste/delete - if (LLEditMenuHandler::gEditMenuHandler == mFolders) + if (LLEditMenuHandler::gEditMenuHandler == mFolderRoot) { LLEditMenuHandler::gEditMenuHandler = NULL; } @@ -679,39 +735,39 @@ void LLInventoryPanel::onFocusLost() void LLInventoryPanel::onFocusReceived() { // inventory now handles cut/copy/paste/delete - LLEditMenuHandler::gEditMenuHandler = mFolders; + LLEditMenuHandler::gEditMenuHandler = mFolderRoot; LLPanel::onFocusReceived(); } void LLInventoryPanel::openAllFolders() { - mFolders->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_DOWN); - mFolders->arrangeAll(); + mFolderRoot->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_DOWN); + mFolderRoot->arrangeAll(); } void LLInventoryPanel::setSelection(const LLUUID& obj_id, BOOL take_keyboard_focus) { // Don't select objects in COF (e.g. to prevent refocus when items are worn). const LLInventoryObject *obj = gInventory.getObject(obj_id); - if (obj && obj->getParentUUID() == LLAppearanceManager::instance().getCOF()) + if (obj && obj->getParentUUID() == LLAppearanceMgr::instance().getCOF()) { return; } - mFolders->setSelectionByID(obj_id, take_keyboard_focus); + mFolderRoot->setSelectionByID(obj_id, take_keyboard_focus); } void LLInventoryPanel::setSelectCallback(const LLFolderView::signal_t::slot_type& cb) { - if (mFolders) + if (mFolderRoot) { - mFolders->setSelectCallback(cb); + mFolderRoot->setSelectCallback(cb); } } void LLInventoryPanel::clearSelection() { - mFolders->clearSelection(); + mFolderRoot->clearSelection(); } void LLInventoryPanel::onSelectionChange(const std::deque<LLFolderViewItem*>& items, BOOL user_action) @@ -725,23 +781,21 @@ void LLInventoryPanel::onSelectionChange(const std::deque<LLFolderViewItem*>& it fv->startRenamingSelectedItem(); } } - // Seraph - Put determineFolderType in here for ensemble typing? } void LLInventoryPanel::doToSelected(const LLSD& userdata) { - mFolders->doToSelected(&gInventory, userdata); + mFolderRoot->doToSelected(&gInventory, userdata); } void LLInventoryPanel::doCreate(const LLSD& userdata) { - menu_create_inventory_item(mFolders, LLFolderBridge::sSelf, userdata); + menu_create_inventory_item(mFolderRoot, LLFolderBridge::sSelf, userdata); } bool LLInventoryPanel::beginIMSession() { - std::set<LLUUID> selected_items; - mFolders->getSelectionList(selected_items); + std::set<LLUUID> selected_items = mFolderRoot->getSelectionList(); std::string name; static int session_num = 1; @@ -754,7 +808,7 @@ bool LLInventoryPanel::beginIMSession() { LLUUID item = *iter; - LLFolderViewItem* folder_item = mFolders->getItemByID(item); + LLFolderViewItem* folder_item = mFolderRoot->getItemByID(item); if(folder_item) { @@ -796,7 +850,7 @@ bool LLInventoryPanel::beginIMSession() } else { - LLFolderViewItem* folder_item = mFolders->getItemByID(item); + LLFolderViewItem* folder_item = mFolderRoot->getItemByID(item); if(!folder_item) return true; LLInvFVBridge* listenerp = (LLInvFVBridge*)folder_item->getListener(); @@ -838,50 +892,19 @@ bool LLInventoryPanel::beginIMSession() bool LLInventoryPanel::attachObject(const LLSD& userdata) { - std::set<LLUUID> selected_items; - mFolders->getSelectionList(selected_items); - - std::string joint_name = userdata.asString(); - LLVOAvatar *avatarp = static_cast<LLVOAvatar*>(gAgent.getAvatarObject()); - LLViewerJointAttachment* attachmentp = NULL; - for (LLVOAvatar::attachment_map_t::iterator iter = avatarp->mAttachmentPoints.begin(); - iter != avatarp->mAttachmentPoints.end(); ) - { - LLVOAvatar::attachment_map_t::iterator curiter = iter++; - LLViewerJointAttachment* attachment = curiter->second; - if (attachment->getName() == joint_name) - { - attachmentp = attachment; - break; - } - } - if (attachmentp == NULL) - { - return true; - } - + // Copy selected item UUIDs to a vector. + std::set<LLUUID> selected_items = mFolderRoot->getSelectionList(); + uuid_vec_t items; for (std::set<LLUUID>::const_iterator set_iter = selected_items.begin(); set_iter != selected_items.end(); ++set_iter) { - const LLUUID &id = *set_iter; - LLViewerInventoryItem* item = (LLViewerInventoryItem*)gInventory.getItem(id); - if(item && gInventory.isObjectDescendentOf(id, gInventory.getRootFolderID())) - { - rez_attachment(item, attachmentp); - } - else if(item && item->isComplete()) - { - // must be in library. copy it to our inventory and put it on. - LLPointer<LLInventoryCallback> cb = new RezAttachmentCallback(attachmentp); - copy_inventory_item(gAgent.getID(), - item->getPermissions().getOwner(), - item->getUUID(), - LLUUID::null, - std::string(), - cb); - } + items.push_back(*set_iter); } + + // Attach selected items. + LLViewerAttachMenu::attachObjects(items, userdata.asString()); + gFocusMgr.setKeyboardFocus(NULL); return true; @@ -897,7 +920,7 @@ BOOL LLInventoryPanel::getSinceLogoff() void LLInventoryPanel::dumpSelectionInformation(void* user_data) { LLInventoryPanel* iv = (LLInventoryPanel*)user_data; - iv->mFolders->dumpSelectionInformation(); + iv->mFolderRoot->dumpSelectionInformation(); } BOOL is_inventorysp_active() @@ -954,3 +977,43 @@ LLInventoryPanel* LLInventoryPanel::getActiveInventoryPanel(BOOL auto_open) return NULL; } + +void LLInventoryPanel::addHideFolderType(LLFolderType::EType folder_type) +{ + if (!getIsHiddenFolderType(folder_type)) + { + mHiddenFolderTypes.push_back(folder_type); + } +} + +BOOL LLInventoryPanel::getIsHiddenFolderType(LLFolderType::EType folder_type) const +{ + return (std::find(mHiddenFolderTypes.begin(), mHiddenFolderTypes.end(), folder_type) != mHiddenFolderTypes.end()); +} + + +/************************************************************************/ +/* Recent Inventory Panel related class */ +/************************************************************************/ +class LLInventoryRecentItemsPanel; +static LLDefaultChildRegistry::Register<LLInventoryRecentItemsPanel> t_recent_inventory_panel("recent_inventory_panel"); + +static const LLRecentInventoryBridgeBuilder RECENT_ITEMS_BUILDER; +class LLInventoryRecentItemsPanel : public LLInventoryPanel +{ +public: + struct Params : public LLInitParam::Block<Params, LLInventoryPanel::Params> + {}; + +protected: + LLInventoryRecentItemsPanel (const Params&); + friend class LLUICtrlFactory; +}; + +LLInventoryRecentItemsPanel::LLInventoryRecentItemsPanel( const Params& params) +: LLInventoryPanel(params) +{ + // replace bridge builder to have necessary View bridges. + mInvFVBridgeBuilder = &RECENT_ITEMS_BUILDER; +} + diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h index ccff795a51..84603e8b4f 100644 --- a/indra/newview/llinventorypanel.h +++ b/indra/newview/llinventorypanel.h @@ -61,11 +61,10 @@ class LLTabContainer; class LLInventoryPanel : public LLPanel { + //-------------------------------------------------------------------- + // Data + //-------------------------------------------------------------------- public: - static const std::string DEFAULT_SORT_ORDER; - static const std::string RECENTITEMS_SORT_ORDER; - static const std::string INHERIT_SORT_ORDER; - struct Filter : public LLInitParam::Block<Filter> { Optional<U32> sort_order; @@ -85,29 +84,35 @@ public: Optional<std::string> sort_order_setting; Optional<LLInventoryModel*> inventory; Optional<bool> allow_multi_select; + Optional<bool> show_item_link_overlays; Optional<Filter> filter; Optional<std::string> start_folder; + Optional<bool> use_label_suffix; Params() : sort_order_setting("sort_order_setting"), inventory("", &gInventory), allow_multi_select("allow_multi_select", true), + show_item_link_overlays("show_item_link_overlays", false), filter("filter"), - start_folder("start_folder") + start_folder("start_folder"), + use_label_suffix("use_label_suffix", true) {} }; + //-------------------------------------------------------------------- + // Initialization + //-------------------------------------------------------------------- protected: LLInventoryPanel(const Params&); + void initFromParams(const Params&); friend class LLUICtrlFactory; - public: virtual ~LLInventoryPanel(); +public: LLInventoryModel* getModel() { return mInventory; } - BOOL postBuild(); - // LLView methods void draw(); BOOL handleHover(S32 x, S32 y, MASK mask); @@ -116,6 +121,10 @@ public: void* cargo_data, EAcceptance* accept, std::string& tooltip_msg); + + void onMouseEnter(S32 x, S32 y, MASK mask); + void onMouseLeave(S32 x, S32 y, MASK mask); + // LLUICtrl methods /*virtual*/ void onFocusLost(); /*virtual*/ void onFocusReceived(); @@ -127,23 +136,23 @@ public: void clearSelection(); LLInventoryFilter* getFilter(); void setFilterTypes(U64 filter, LLInventoryFilter::EFilterType = LLInventoryFilter::FILTERTYPE_OBJECT); - U32 getFilterObjectTypes() const { return mFolders->getFilterObjectTypes(); } + U32 getFilterObjectTypes() const { return mFolderRoot->getFilterObjectTypes(); } void setFilterPermMask(PermissionMask filter_perm_mask); - U32 getFilterPermMask() const { return mFolders->getFilterPermissions(); } + U32 getFilterPermMask() const { return mFolderRoot->getFilterPermissions(); } + void setFilterWearableTypes(U64 filter); void setFilterSubString(const std::string& string); - const std::string getFilterSubString() { return mFolders->getFilterSubString(); } - void setSortOrder(U32 order); - U32 getSortOrder() { return mFolders->getSortOrder(); } + const std::string getFilterSubString() { return mFolderRoot->getFilterSubString(); } void setSinceLogoff(BOOL sl); void setHoursAgo(U32 hours); BOOL getSinceLogoff(); - + void setIncludeLinks(BOOL include_links); + void setShowFolderState(LLInventoryFilter::EFolderShow show); LLInventoryFilter::EFolderShow getShowFolderState(); - void setAllowMultiSelect(BOOL allow) { mFolders->setAllowMultiSelect(allow); } + void setAllowMultiSelect(BOOL allow) { mFolderRoot->setAllowMultiSelect(allow); } // This method is called when something has changed about the inventory. void modelChanged(U32 mask); - LLFolderView* getRootFolder() { return mFolders; } + LLFolderView* getRootFolder() { return mFolderRoot; } LLScrollContainer* getScrollableContainer() { return mScroller; } void onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action); @@ -158,7 +167,7 @@ public: static void dumpSelectionInformation(void* user_data); void openSelected(); - void unSelectAll() { mFolders->setSelection(NULL, FALSE, FALSE); } + void unSelectAll() { mFolderRoot->setSelection(NULL, FALSE, FALSE); } static void onIdle(void* user_data); @@ -172,9 +181,9 @@ protected: LLInventoryModel* mInventory; LLInventoryObserver* mInventoryObserver; BOOL mAllowMultiSelect; - std::string mSortOrderSetting; + BOOL mShowItemLinkOverlays; // Shows link graphic over inventory item icons - LLFolderView* mFolders; + LLFolderView* mFolderRoot; LLScrollContainer* mScroller; /** @@ -186,6 +195,30 @@ protected: */ const LLInventoryFVBridgeBuilder* mInvFVBridgeBuilder; + + //-------------------------------------------------------------------- + // Sorting + //-------------------------------------------------------------------- +public: + static const std::string DEFAULT_SORT_ORDER; + static const std::string RECENTITEMS_SORT_ORDER; + static const std::string INHERIT_SORT_ORDER; + + void setSortOrder(U32 order); + U32 getSortOrder() const { return mFolderRoot->getSortOrder(); } +private: + std::string mSortOrderSetting; + + //-------------------------------------------------------------------- + // Hidden folders + //-------------------------------------------------------------------- +public: + void addHideFolderType(LLFolderType::EType folder_type); +protected: + BOOL getIsHiddenFolderType(LLFolderType::EType folder_type) const; +private: + std::vector<LLFolderType::EType> mHiddenFolderTypes; + //-------------------------------------------------------------------- // Initialization routines for building up the UI ("views") //-------------------------------------------------------------------- diff --git a/indra/newview/lljoystickbutton.cpp b/indra/newview/lljoystickbutton.cpp index 2cc5c8335d..c2a1923dfe 100644 --- a/indra/newview/lljoystickbutton.cpp +++ b/indra/newview/lljoystickbutton.cpp @@ -42,6 +42,7 @@ // Project includes #include "llui.h" #include "llagent.h" +#include "llagentcamera.h" #include "llviewertexture.h" #include "llviewertexturelist.h" #include "llviewerwindow.h" @@ -52,7 +53,6 @@ static LLDefaultChildRegistry::Register<LLJoystickAgentSlide> r1("joystick_slide"); static LLDefaultChildRegistry::Register<LLJoystickAgentTurn> r2("joystick_turn"); static LLDefaultChildRegistry::Register<LLJoystickCameraRotate> r3("joystick_rotate"); -static LLDefaultChildRegistry::Register<LLJoystickCameraZoom> r4("joystick_zoom"); static LLDefaultChildRegistry::Register<LLJoystickCameraTrack> r5("joystick_track"); @@ -482,25 +482,25 @@ void LLJoystickCameraRotate::onHeldDown() // left-right rotation if (dx > mHorizSlopNear) { - gAgent.unlockView(); - gAgent.setOrbitLeftKey(getOrbitRate()); + gAgentCamera.unlockView(); + gAgentCamera.setOrbitLeftKey(getOrbitRate()); } else if (dx < -mHorizSlopNear) { - gAgent.unlockView(); - gAgent.setOrbitRightKey(getOrbitRate()); + gAgentCamera.unlockView(); + gAgentCamera.setOrbitRightKey(getOrbitRate()); } // over/under rotation if (dy > mVertSlopNear) { - gAgent.unlockView(); - gAgent.setOrbitUpKey(getOrbitRate()); + gAgentCamera.unlockView(); + gAgentCamera.setOrbitUpKey(getOrbitRate()); } else if (dy < -mVertSlopNear) { - gAgent.unlockView(); - gAgent.setOrbitDownKey(getOrbitRate()); + gAgentCamera.unlockView(); + gAgentCamera.setOrbitDownKey(getOrbitRate()); } } @@ -625,176 +625,24 @@ void LLJoystickCameraTrack::onHeldDown() if (dx > mVertSlopNear) { - gAgent.unlockView(); - gAgent.setPanRightKey(getOrbitRate()); + gAgentCamera.unlockView(); + gAgentCamera.setPanRightKey(getOrbitRate()); } else if (dx < -mVertSlopNear) { - gAgent.unlockView(); - gAgent.setPanLeftKey(getOrbitRate()); + gAgentCamera.unlockView(); + gAgentCamera.setPanLeftKey(getOrbitRate()); } // over/under rotation if (dy > mVertSlopNear) { - gAgent.unlockView(); - gAgent.setPanUpKey(getOrbitRate()); + gAgentCamera.unlockView(); + gAgentCamera.setPanUpKey(getOrbitRate()); } else if (dy < -mVertSlopNear) { - gAgent.unlockView(); - gAgent.setPanDownKey(getOrbitRate()); - } -} - - - -//------------------------------------------------------------------------------- -// LLJoystickCameraZoom -//------------------------------------------------------------------------------- - -LLJoystickCameraZoom::LLJoystickCameraZoom(const LLJoystickCameraZoom::Params& p) -: LLJoystick(p), - mInTop( FALSE ), - mInBottom( FALSE ), - mPlusInImage(p.plus_image), - mMinusInImage(p.minus_image) -{ -} - -BOOL LLJoystickCameraZoom::handleMouseDown(S32 x, S32 y, MASK mask) -{ - BOOL handled = LLJoystick::handleMouseDown(x, y, mask); - - if( handled ) - { - if (mFirstMouse.mY > getRect().getHeight() / 2) - { - mInitialQuadrant = JQ_UP; - } - else - { - mInitialQuadrant = JQ_DOWN; - } - } - return handled; -} - - -void LLJoystickCameraZoom::onHeldDown() -{ - updateSlop(); - - const F32 FAST_RATE = 2.5f; // two and a half times the normal rate - - S32 dy = mLastMouse.mY - mFirstMouse.mY + mInitialOffset.mY; - - if (dy > mVertSlopFar) - { - // Zoom in fast - gAgent.unlockView(); - gAgent.setOrbitInKey(FAST_RATE); - } - else if (dy > mVertSlopNear) - { - // Zoom in slow - gAgent.unlockView(); - gAgent.setOrbitInKey(getOrbitRate()); - } - else if (dy < -mVertSlopFar) - { - // Zoom out fast - gAgent.unlockView(); - gAgent.setOrbitOutKey(FAST_RATE); - } - else if (dy < -mVertSlopNear) - { - // Zoom out slow - gAgent.unlockView(); - gAgent.setOrbitOutKey(getOrbitRate()); - } -} - -// Only used for drawing -void LLJoystickCameraZoom::setToggleState( BOOL top, BOOL bottom ) -{ - mInTop = top; - mInBottom = bottom; -} - -void LLJoystickCameraZoom::draw() -{ - if( mInTop ) - { - mPlusInImage->draw(0,0); - } - else - if( mInBottom ) - { - mMinusInImage->draw(0,0); - } - else - { - getImageUnselected()->draw( 0, 0 ); - } -} - -void LLJoystickCameraZoom::updateSlop() -{ - mVertSlopNear = getRect().getHeight() / 4; - mVertSlopFar = getRect().getHeight() / 2; - - mHorizSlopNear = getRect().getWidth() / 4; - mHorizSlopFar = getRect().getWidth() / 2; - - // Compute initial mouse offset based on initial quadrant. - // Place the mouse evenly between the near and far zones. - switch (mInitialQuadrant) - { - case JQ_ORIGIN: - mInitialOffset.set(0, 0); - break; - - case JQ_UP: - mInitialOffset.mX = 0; - mInitialOffset.mY = (mVertSlopNear + mVertSlopFar) / 2; - break; - - case JQ_DOWN: - mInitialOffset.mX = 0; - mInitialOffset.mY = - (mVertSlopNear + mVertSlopFar) / 2; - break; - - case JQ_LEFT: - mInitialOffset.mX = - (mHorizSlopNear + mHorizSlopFar) / 2; - mInitialOffset.mY = 0; - break; - - case JQ_RIGHT: - mInitialOffset.mX = (mHorizSlopNear + mHorizSlopFar) / 2; - mInitialOffset.mY = 0; - break; - - default: - llerrs << "LLJoystick::LLJoystick() - bad switch case" << llendl; - break; - } - - return; -} - - -F32 LLJoystickCameraZoom::getOrbitRate() -{ - F32 time = getElapsedHeldDownTime(); - if( time < NUDGE_TIME ) - { - F32 rate = ORBIT_NUDGE_RATE + time * (1 - ORBIT_NUDGE_RATE)/ NUDGE_TIME; -// llinfos << "rate " << rate << " time " << time << llendl; - return rate; - } - else - { - return 1; + gAgentCamera.unlockView(); + gAgentCamera.setPanDownKey(getOrbitRate()); } } diff --git a/indra/newview/lljoystickbutton.h b/indra/newview/lljoystickbutton.h index 2b071a8999..1dd30036ab 100644 --- a/indra/newview/lljoystickbutton.h +++ b/indra/newview/lljoystickbutton.h @@ -183,44 +183,4 @@ public: virtual void onHeldDown(); }; - -// Zoom the camera in and out -class LLJoystickCameraZoom -: public LLJoystick -{ -public: - struct Params - : public LLInitParam::Block<Params, LLJoystick::Params> - { - Optional<LLUIImage*> plus_image; - Optional<LLUIImage*> minus_image; - - Params() - : plus_image ("plus_image", NULL), - minus_image ("minus_image", NULL) - { - held_down_delay.seconds(0.0); - } - }; - LLJoystickCameraZoom(const Params&); - - virtual void setToggleState( BOOL top, BOOL bottom ); - - virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask); - virtual void onHeldDown(); - virtual void draw(); - -protected: - virtual void updateSlop(); - F32 getOrbitRate(); - -protected: - BOOL mInTop; - BOOL mInBottom; - LLUIImagePtr mPlusInImage; - LLUIImagePtr mMinusInImage; -}; - - - #endif // LL_LLJOYSTICKBUTTON_H diff --git a/indra/newview/lllandmarkactions.cpp b/indra/newview/lllandmarkactions.cpp index f25d2ef574..539ca97a93 100644 --- a/indra/newview/lllandmarkactions.cpp +++ b/indra/newview/lllandmarkactions.cpp @@ -36,6 +36,7 @@ #include "roles_constants.h" #include "llinventory.h" +#include "llinventoryfunctions.h" #include "lllandmark.h" #include "llparcel.h" #include "llregionhandle.h" @@ -298,7 +299,7 @@ void LLLandmarkActions::getSLURLfromPosGlobal(const LLVector3d& global_pos, slur bool gotSimName = LLWorldMap::getInstance()->simNameFromPosGlobal(global_pos, sim_name); if (gotSimName) { - std::string slurl = LLSLURL::buildSLURLfromPosGlobal(sim_name, global_pos, escaped); + std::string slurl = LLSLURL(sim_name, global_pos).getSLURLString(); cb(slurl); return; @@ -350,7 +351,7 @@ void LLLandmarkActions::onRegionResponseSLURL(slurl_callback_t cb, bool gotSimName = LLWorldMap::getInstance()->simNameFromPosGlobal(global_pos, sim_name); if (gotSimName) { - slurl = LLSLURL::buildSLURLfromPosGlobal(sim_name, global_pos, escaped); + slurl = LLSLURL(sim_name, global_pos).getSLURLString(); } else { diff --git a/indra/newview/lllistcontextmenu.cpp b/indra/newview/lllistcontextmenu.cpp new file mode 100644 index 0000000000..50e969f6bc --- /dev/null +++ b/indra/newview/lllistcontextmenu.cpp @@ -0,0 +1,125 @@ +/** + * @file lllistcontextmenu.cpp + * @brief Base class of misc lists' context menus + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + + +#include "llviewerprecompiledheaders.h" + +#include "lllistcontextmenu.h" + +// libs +#include "llmenugl.h" // for LLContextMenu + +// newview +#include "llviewermenu.h" // for LLViewerMenuHolderGL + +LLListContextMenu::LLListContextMenu() +: mMenu(NULL) +{ +} + +LLListContextMenu::~LLListContextMenu() +{ + // do not forget delete LLContextMenu* mMenu. + // It can have registered Enable callbacks which are called from the LLMenuHolderGL::draw() + // via selected item (menu_item_call) by calling LLMenuItemCallGL::buildDrawLabel. + // we can have a crash via using callbacks of deleted instance of ContextMenu. EXT-4725 + + // menu holder deletes its menus on viewer exit, so we have no way to determine if instance + // of mMenu has already been deleted except of using LLHandle. EXT-4762. + if (!mMenuHandle.isDead()) + { + mMenu->die(); + mMenu = NULL; + } +} + +void LLListContextMenu::show(LLView* spawning_view, const uuid_vec_t& uuids, S32 x, S32 y) +{ + if (mMenu) + { + //preventing parent (menu holder) from deleting already "dead" context menus on exit + LLView* parent = mMenu->getParent(); + if (parent) + { + parent->removeChild(mMenu); + } + delete mMenu; + mMenu = NULL; + mUUIDs.clear(); + } + + if ( uuids.empty() ) + { + return; + } + + mUUIDs.resize(uuids.size()); + std::copy(uuids.begin(), uuids.end(), mUUIDs.begin()); + + mMenu = createMenu(); + if (!mMenu) + { + llwarns << "Context menu creation failed" << llendl; + return; + } + + mMenuHandle = mMenu->getHandle(); + mMenu->show(x, y); + LLMenuGL::showPopup(spawning_view, mMenu, x, y); +} + +void LLListContextMenu::hide() +{ + if(mMenu) + { + mMenu->hide(); + } +} + +// static +void LLListContextMenu::handleMultiple(functor_t functor, const uuid_vec_t& ids) +{ + uuid_vec_t::const_iterator it; + for (it = ids.begin(); it != ids.end(); ++it) + { + functor(*it); + } +} + +// static +LLContextMenu* LLListContextMenu::createFromFile(const std::string& filename) +{ + return LLUICtrlFactory::getInstance()->createFromFile<LLContextMenu>( + filename, LLContextMenu::sMenuContainer, LLViewerMenuHolderGL::child_registry_t::instance()); +} + +// EOF diff --git a/indra/newview/lllistcontextmenu.h b/indra/newview/lllistcontextmenu.h new file mode 100644 index 0000000000..09540a833f --- /dev/null +++ b/indra/newview/lllistcontextmenu.h @@ -0,0 +1,84 @@ +/** + * @file lllistcontextmenu.h + * @brief Base class of misc lists' context menus + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLLISTCONTEXTMENU_H +#define LL_LLLISTCONTEXTMENU_H + +#include "llhandle.h" +#include "lluuid.h" +#include "llview.h" + +class LLView; +class LLContextMenu; + +/** + * Context menu for single or multiple list items. + * + * Derived classes must implement contextMenu(). + * + * Typical usage: + * <code> + * my_context_menu->show(parent_view, selected_list_items_ids, x, y); + * </code> + */ +class LLListContextMenu +{ +public: + LLListContextMenu(); + virtual ~LLListContextMenu(); + + /** + * Show the menu at specified coordinates. + * + * @param spawning_view View to spawn at. + * @param uuids An array of list items ids. + * @param x Horizontal coordinate in the spawn_view's coordinate frame. + * @param y Vertical coordinate in the spawn_view's coordinate frame. + */ + virtual void show(LLView* spawning_view, const uuid_vec_t& uuids, S32 x, S32 y); + + virtual void hide(); + +protected: + typedef boost::function<void (const LLUUID& id)> functor_t; + + virtual LLContextMenu* createMenu() = 0; + + static LLContextMenu* createFromFile(const std::string& filename); + static void handleMultiple(functor_t functor, const uuid_vec_t& ids); + + uuid_vec_t mUUIDs; + LLContextMenu* mMenu; + LLHandle<LLView> mMenuHandle; +}; + +#endif // LL_LLLISTCONTEXTMENU_H diff --git a/indra/newview/lllocaltextureobject.cpp b/indra/newview/lllocaltextureobject.cpp index 69eb5fce2f..116d9bc446 100644 --- a/indra/newview/lllocaltextureobject.cpp +++ b/indra/newview/lllocaltextureobject.cpp @@ -70,6 +70,7 @@ LLLocalTextureObject::LLLocalTextureObject(const LLLocalTextureObject& lto) : if (!original_layer) { llerrs << "could not clone Local Texture Object: unable to extract texlayer!" << llendl; + continue; } LLTexLayer* new_layer = new LLTexLayer(*original_layer); diff --git a/indra/newview/lllocationhistory.cpp b/indra/newview/lllocationhistory.cpp index df93930d33..7906d9b20f 100644 --- a/indra/newview/lllocationhistory.cpp +++ b/indra/newview/lllocationhistory.cpp @@ -63,6 +63,7 @@ void LLLocationHistory::addItem(const LLLocationHistoryItem& item) { mItems.erase(mItems.begin(), mItems.end()-max_items); } llassert((S32)mItems.size() <= max_items); + mChangedSignal(ADD); } /* @@ -87,9 +88,10 @@ bool LLLocationHistory::touchItem(const LLLocationHistoryItem& item) { void LLLocationHistory::removeItems() { mItems.clear(); + mChangedSignal(CLEAR); } -bool LLLocationHistory::getMatchingItems(std::string substring, location_list_t& result) const +bool LLLocationHistory::getMatchingItems(const std::string& substring, location_list_t& result) const { // *TODO: an STL algorithm would look nicer result.clear(); @@ -160,7 +162,7 @@ void LLLocationHistory::load() return; } - removeItems(); + mItems.clear();// need to use a direct call of clear() method to avoid signal invocation // add each line in the file to the list std::string line; @@ -179,5 +181,5 @@ void LLLocationHistory::load() file.close(); - mLoadedSignal(); + mChangedSignal(LOAD); } diff --git a/indra/newview/lllocationhistory.h b/indra/newview/lllocationhistory.h index 5f9976f87a..fb71fbaa0f 100644 --- a/indra/newview/lllocationhistory.h +++ b/indra/newview/lllocationhistory.h @@ -41,11 +41,13 @@ #include <boost/function.hpp> class LLSD; - +/** + * This enum is responsible for identifying of history item. + */ enum ELocationType { - TYPED_REGION_SURL//region name or surl - ,LANDMARK // name of landmark - ,TELEPORT_HISTORY + TYPED_REGION_SLURL//item added after the user had typed a region name or slurl + ,LANDMARK // item has been loaded from landmark folder + ,TELEPORT_HISTORY // item from session teleport history }; class LLLocationHistoryItem { @@ -109,9 +111,16 @@ class LLLocationHistory: public LLSingleton<LLLocationHistory> LOG_CLASS(LLLocationHistory); public: + enum EChangeType + { + ADD + ,CLEAR + ,LOAD + }; + typedef std::vector<LLLocationHistoryItem> location_list_t; - typedef boost::function<void()> loaded_callback_t; - typedef boost::signals2::signal<void()> loaded_signal_t; + typedef boost::function<void(EChangeType event)> history_changed_callback_t; + typedef boost::signals2::signal<void(EChangeType event)> history_changed_signal_t; LLLocationHistory(); @@ -120,8 +129,8 @@ public: void removeItems(); size_t getItemCount() const { return mItems.size(); } const location_list_t& getItems() const { return mItems; } - bool getMatchingItems(std::string substring, location_list_t& result) const; - boost::signals2::connection setLoadedCallback(loaded_callback_t cb) { return mLoadedSignal.connect(cb); } + bool getMatchingItems(const std::string& substring, location_list_t& result) const; + boost::signals2::connection setChangedCallback(history_changed_callback_t cb) { return mChangedSignal.connect(cb); } void save() const; void load(); @@ -131,7 +140,7 @@ private: location_list_t mItems; std::string mFilename; /// File to store the history to. - loaded_signal_t mLoadedSignal; + history_changed_signal_t mChangedSignal; }; #endif diff --git a/indra/newview/lllocationinputctrl.cpp b/indra/newview/lllocationinputctrl.cpp index 1b7ad6ab7e..53a11eff04 100644 --- a/indra/newview/lllocationinputctrl.cpp +++ b/indra/newview/lllocationinputctrl.cpp @@ -38,6 +38,7 @@ // common includes #include "llbutton.h" #include "llfocusmgr.h" +#include "llhelp.h" #include "llmenugl.h" #include "llparcel.h" #include "llstring.h" @@ -52,7 +53,6 @@ #include "llinventoryobserver.h" #include "lllandmarkactions.h" #include "lllandmarklist.h" -#include "lllocationhistory.h" #include "llteleporthistory.h" #include "llsidetray.h" #include "llslurl.h" @@ -109,7 +109,7 @@ public: private: /*virtual*/ void done() { - std::vector<LLUUID>::const_iterator it = mAdded.begin(), end = mAdded.end(); + uuid_vec_t::const_iterator it = mAdded.begin(), end = mAdded.end(); for(; it != end; ++it) { LLInventoryItem* item = gInventory.getItem(*it); @@ -176,7 +176,10 @@ private: static LLDefaultChildRegistry::Register<LLLocationInputCtrl> r("location_input"); LLLocationInputCtrl::Params::Params() -: add_landmark_image_enabled("add_landmark_image_enabled"), +: icon_maturity_general("icon_maturity_general"), + icon_maturity_adult("icon_maturity_adult"), + icon_maturity_moderate("icon_maturity_moderate"), + add_landmark_image_enabled("add_landmark_image_enabled"), add_landmark_image_disabled("add_landmark_image_disabled"), add_landmark_image_hover("add_landmark_image_hover"), add_landmark_image_selected("add_landmark_image_selected"), @@ -185,13 +188,15 @@ LLLocationInputCtrl::Params::Params() add_landmark_button("add_landmark_button"), for_sale_button("for_sale_button"), info_button("info_button"), + maturity_button("maturity_button"), voice_icon("voice_icon"), fly_icon("fly_icon"), push_icon("push_icon"), build_icon("build_icon"), scripts_icon("scripts_icon"), damage_icon("damage_icon"), - damage_text("damage_text") + damage_text("damage_text"), + maturity_help_topic("maturity_help_topic") { } @@ -204,7 +209,11 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p) mForSaleBtn(NULL), mInfoBtn(NULL), mLandmarkImageOn(NULL), - mLandmarkImageOff(NULL) + mLandmarkImageOff(NULL), + mIconMaturityGeneral(NULL), + mIconMaturityAdult(NULL), + mIconMaturityModerate(NULL), + mMaturityHelpTopic(p.maturity_help_topic) { // Lets replace default LLLineEditor with LLLocationLineEditor // to make needed escaping while copying and cutting url @@ -223,7 +232,6 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p) params.default_text(LLStringUtil::null); params.max_length_bytes(p.max_chars); params.keystroke_callback(boost::bind(&LLComboBox::onTextEntry, this, _1)); - params.handle_edit_keys_directly(true); params.commit_on_focus_lost(false); params.follows.flags(FOLLOWS_ALL); mTextEntry = LLUICtrlFactory::create<LLURLLineEditor>(params); @@ -264,7 +272,25 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p) mAddLandmarkBtn = LLUICtrlFactory::create<LLButton>(al_params); enableAddLandmarkButton(true); addChild(mAddLandmarkBtn); - + + if (p.icon_maturity_general()) + { + mIconMaturityGeneral = p.icon_maturity_general; + } + if (p.icon_maturity_adult()) + { + mIconMaturityAdult = p.icon_maturity_adult; + } + if(p.icon_maturity_moderate()) + { + mIconMaturityModerate = p.icon_maturity_moderate; + } + + LLButton::Params maturity_button = p.maturity_button; + mMaturityButton = LLUICtrlFactory::create<LLButton>(maturity_button); + addChild(mMaturityButton); + mMaturityButton->setClickedCallback(boost::bind(&LLLocationInputCtrl::onMaturityButtonClicked, this)); + LLButton::Params for_sale_button = p.for_sale_button; for_sale_button.tool_tip = LLTrans::getString("LocationCtrlForSaleTooltip"); for_sale_button.click_callback.function( @@ -340,14 +366,29 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p) getTextEntry()->setRightMouseUpCallback(boost::bind(&LLLocationInputCtrl::onTextEditorRightClicked,this,_2,_3,_4)); updateWidgetlayout(); + // Connecting signal for updating location on "Show Coordinates" setting change. + LLControlVariable* coordinates_control = gSavedSettings.getControl("NavBarShowCoordinates").get(); + if (coordinates_control) + { + mCoordinatesControlConnection = coordinates_control->getSignal()->connect(boost::bind(&LLLocationInputCtrl::refreshLocation, this)); + } + + // Connecting signal for updating parcel icons on "Show Parcel Properties" setting change. + LLControlVariable* parcel_properties_control = gSavedSettings.getControl("NavBarShowParcelProperties").get(); + if (parcel_properties_control) + { + mParcelPropertiesControlConnection = parcel_properties_control->getSignal()->connect(boost::bind(&LLLocationInputCtrl::refreshParcelIcons, this)); + } + // - Make the "Add landmark" button updated when either current parcel gets changed // or a landmark gets created or removed from the inventory. // - Update the location string on parcel change. mParcelMgrConnection = LLViewerParcelMgr::getInstance()->addAgentParcelChangedCallback( boost::bind(&LLLocationInputCtrl::onAgentParcelChange, this)); - - mLocationHistoryConnection = LLLocationHistory::getInstance()->setLoadedCallback( - boost::bind(&LLLocationInputCtrl::onLocationHistoryLoaded, this)); + // LLLocationHistory instance is being created before the location input control, so we have to update initial state of button manually. + mButton->setEnabled(LLLocationHistory::instance().getItemCount() > 0); + mLocationHistoryConnection = LLLocationHistory::getInstance()->setChangedCallback( + boost::bind(&LLLocationInputCtrl::onLocationHistoryChanged, this,_1)); mRemoveLandmarkObserver = new LLRemoveLandmarkObserver(this); mAddLandmarkObserver = new LLAddLandmarkObserver(this); @@ -359,8 +400,8 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p) mAddLandmarkTooltip = LLTrans::getString("LocationCtrlAddLandmarkTooltip"); mEditLandmarkTooltip = LLTrans::getString("LocationCtrlEditLandmarkTooltip"); - getChild<LLView>("Location History")->setToolTip(LLTrans::getString("LocationCtrlComboBtnTooltip")); - getChild<LLView>("Place Information")->setToolTip(LLTrans::getString("LocationCtrlInfoBtnTooltip")); + mButton->setToolTip(LLTrans::getString("LocationCtrlComboBtnTooltip")); + mInfoBtn->setToolTip(LLTrans::getString("LocationCtrlInfoBtnTooltip")); } LLLocationInputCtrl::~LLLocationInputCtrl() @@ -373,6 +414,8 @@ LLLocationInputCtrl::~LLLocationInputCtrl() LLViewerParcelMgr::getInstance()->removeObserver(mParcelChangeObserver); delete mParcelChangeObserver; + mCoordinatesControlConnection.disconnect(); + mParcelPropertiesControlConnection.disconnect(); mParcelMgrConnection.disconnect(); mLocationHistoryConnection.disconnect(); } @@ -439,6 +482,7 @@ BOOL LLLocationInputCtrl::handleKeyHere(KEY key, MASK mask) void LLLocationInputCtrl::onTextEntry(LLLineEditor* line_editor) { KEY key = gKeyboard->currentKey(); + MASK mask = gKeyboard->currentMask(TRUE); if (line_editor->getText().empty()) { @@ -446,7 +490,7 @@ void LLLocationInputCtrl::onTextEntry(LLLineEditor* line_editor) hideList(); } // Typing? (moving cursor should not affect showing the list) - else if (key != KEY_LEFT && key != KEY_RIGHT && key != KEY_HOME && key != KEY_END) + else if (mask != MASK_CONTROL && key != KEY_LEFT && key != KEY_RIGHT && key != KEY_HOME && key != KEY_END) { prearrangeList(line_editor->getText()); if (mList->getItemCount() != 0) @@ -471,7 +515,10 @@ void LLLocationInputCtrl::onTextEntry(LLLineEditor* line_editor) */ void LLLocationInputCtrl::setText(const LLStringExplicit& text) { - mTextEntry->setText(text); + if (mTextEntry) + { + mTextEntry->setText(text); + } mHasAutocompletedText = FALSE; } @@ -480,7 +527,9 @@ void LLLocationInputCtrl::setFocus(BOOL b) LLComboBox::setFocus(b); if (mTextEntry && b && !mList->getVisible()) + { mTextEntry->setFocus(TRUE); + } } void LLLocationInputCtrl::handleLoginComplete() @@ -522,6 +571,25 @@ void LLLocationInputCtrl::draw() LLComboBox::draw(); } +void LLLocationInputCtrl::reshape(S32 width, S32 height, BOOL called_from_parent) +{ + LLComboBox::reshape(width, height, called_from_parent); + + // Setting cursor to 0 to show the left edge of the text. See EXT-4967. + mTextEntry->setCursor(0); + if (mTextEntry->hasSelection()) + { + // Deselecting because selection position is changed together with + // cursor position change. + mTextEntry->deselect(); + } + + if (isHumanReadableLocationVisible) + { + refreshMaturityButton(); + } +} + void LLLocationInputCtrl::onInfoButtonClicked() { LLSideTray::getInstance()->showPanel("panel_places", LLSD().with("type", "agent")); @@ -555,15 +623,24 @@ void LLLocationInputCtrl::onAgentParcelChange() refresh(); } +void LLLocationInputCtrl::onMaturityButtonClicked() +{ + LLUI::sHelpImpl->showTopic(mMaturityHelpTopic); +} + void LLLocationInputCtrl::onLandmarkLoaded(LLLandmark* lm) { (void) lm; updateAddLandmarkButton(); } -void LLLocationInputCtrl::onLocationHistoryLoaded() +void LLLocationInputCtrl::onLocationHistoryChanged(LLLocationHistory::EChangeType event) { - rebuildLocationHistory(); + if(event == LLLocationHistory::LOAD) + { + rebuildLocationHistory(); + } + mButton->setEnabled(LLLocationHistory::instance().getItemCount() > 0); } void LLLocationInputCtrl::onLocationPrearrange(const LLSD& data) @@ -607,8 +684,7 @@ void LLLocationInputCtrl::onLocationPrearrange(const LLSD& data) value["global_pos"] = result->mGlobalPos.getValue(); std::string region_name = result->mTitle.substr(0, result->mTitle.find(',')); //TODO*: add Surl to teleportitem or parse region name from title - value["tooltip"] = LLSLURL::buildSLURLfromPosGlobal(region_name, - result->mGlobalPos, false); + value["tooltip"] = LLSLURL(region_name, result->mGlobalPos).getSLURLString(); add(result->getTitle(), value); } result = std::find_if(result + 1, th_items.end(), boost::bind( @@ -651,8 +727,8 @@ void LLLocationInputCtrl::refreshLocation() { // Is one of our children focused? if (LLUICtrl::hasFocus() || mButton->hasFocus() || mList->hasFocus() || - (mTextEntry && mTextEntry->hasFocus()) || (mAddLandmarkBtn->hasFocus())) - + (mTextEntry && mTextEntry->hasFocus()) || + (mAddLandmarkBtn->hasFocus())) { llwarns << "Location input should not be refreshed when having focus" << llendl; return; @@ -672,6 +748,9 @@ void LLLocationInputCtrl::refreshLocation() // store human-readable location to compare it in changeLocationPresentation() mHumanReadableLocation = location_name; setText(location_name); + isHumanReadableLocationVisible = true; + + refreshMaturityButton(); } // returns new right edge @@ -692,17 +771,20 @@ void LLLocationInputCtrl::refreshParcelIcons() { // Our "cursor" moving right to left S32 x = mAddLandmarkBtn->getRect().mLeft; - - static LLUICachedControl<bool> show_properties("NavBarShowParcelProperties", false); - if (show_properties) - { - LLViewerParcelMgr* vpm = LLViewerParcelMgr::getInstance(); - LLViewerRegion* agent_region = gAgent.getRegion(); - LLParcel* agent_parcel = vpm->getAgentParcel(); - if (!agent_region || !agent_parcel) - return; + LLViewerParcelMgr* vpm = LLViewerParcelMgr::getInstance(); + LLViewerRegion* agent_region = gAgent.getRegion(); + LLParcel* agent_parcel = vpm->getAgentParcel(); + if (!agent_region || !agent_parcel) + return; + + mForSaleBtn->setVisible(vpm->canAgentBuyParcel(agent_parcel, false)); + + x = layout_widget(mForSaleBtn, x); + + if (gSavedSettings.getBOOL("NavBarShowParcelProperties")) + { LLParcel* current_parcel; LLViewerRegion* selection_region = vpm->getSelectionRegion(); LLParcel* selected_parcel = vpm->getParcelSelection()->getParcel(); @@ -722,7 +804,6 @@ void LLLocationInputCtrl::refreshParcelIcons() current_parcel = agent_parcel; } - bool allow_buy = vpm->canAgentBuyParcel(current_parcel, false); bool allow_voice = vpm->allowAgentVoice(agent_region, current_parcel); bool allow_fly = vpm->allowAgentFly(agent_region, current_parcel); bool allow_push = vpm->allowAgentPush(agent_region, current_parcel); @@ -731,7 +812,6 @@ void LLLocationInputCtrl::refreshParcelIcons() bool allow_damage = vpm->allowAgentDamage(agent_region, current_parcel); // Most icons are "block this ability" - mForSaleBtn->setVisible(allow_buy); mParcelIcon[VOICE_ICON]->setVisible( !allow_voice ); mParcelIcon[FLY_ICON]->setVisible( !allow_fly ); mParcelIcon[PUSH_ICON]->setVisible( !allow_push ); @@ -739,11 +819,10 @@ void LLLocationInputCtrl::refreshParcelIcons() mParcelIcon[SCRIPTS_ICON]->setVisible( !allow_scripts ); mParcelIcon[DAMAGE_ICON]->setVisible( allow_damage ); mDamageText->setVisible(allow_damage); - - x = layout_widget(mForSaleBtn, x); + // Padding goes to left of both landmark star and for sale btn x -= mAddLandmarkHPad; - + // Slide the parcel icons rect from right to left, adjusting rectangles for (S32 i = 0; i < ICON_COUNT; ++i) { @@ -755,18 +834,20 @@ void LLLocationInputCtrl::refreshParcelIcons() } else { - mForSaleBtn->setVisible(false); for (S32 i = 0; i < ICON_COUNT; ++i) { mParcelIcon[i]->setVisible(false); } mDamageText->setVisible(false); } - - S32 left_pad, right_pad; - mTextEntry->getTextPadding(&left_pad, &right_pad); - right_pad = mTextEntry->getRect().mRight - x; - mTextEntry->setTextPadding(left_pad, right_pad); + + if (mTextEntry) + { + S32 left_pad, right_pad; + mTextEntry->getTextPadding(&left_pad, &right_pad); + right_pad = mTextEntry->getRect().mRight - x; + mTextEntry->setTextPadding(left_pad, right_pad); + } } void LLLocationInputCtrl::refreshHealth() @@ -785,7 +866,73 @@ void LLLocationInputCtrl::refreshHealth() } } -void LLLocationInputCtrl::rebuildLocationHistory(std::string filter) +void LLLocationInputCtrl::refreshMaturityButton() +{ + // Updating maturity rating icon. + LLViewerRegion* region = gAgent.getRegion(); + if (!region) + return; + + bool button_visible = true; + LLPointer<LLUIImage> rating_image = NULL; + std::string rating_tooltip; + + U8 sim_access = region->getSimAccess(); + switch(sim_access) + { + case SIM_ACCESS_PG: + rating_image = mIconMaturityGeneral; + rating_tooltip = LLTrans::getString("LocationCtrlGeneralIconTooltip"); + break; + + case SIM_ACCESS_ADULT: + rating_image = mIconMaturityAdult; + rating_tooltip = LLTrans::getString("LocationCtrlAdultIconTooltip"); + break; + + case SIM_ACCESS_MATURE: + rating_image = mIconMaturityModerate; + rating_tooltip = LLTrans::getString("LocationCtrlModerateIconTooltip"); + break; + + default: + button_visible = false; + break; + } + + mMaturityButton->setVisible(button_visible); + mMaturityButton->setToolTip(rating_tooltip); + if(rating_image) + { + mMaturityButton->setImageUnselected(rating_image); + mMaturityButton->setImagePressed(rating_image); + } + if (mMaturityButton->getVisible()) + { + positionMaturityButton(); + } +} + +void LLLocationInputCtrl::positionMaturityButton() +{ + const LLFontGL* font = mTextEntry->getFont(); + if (!font) + return; + + S32 left_pad, right_pad; + mTextEntry->getTextPadding(&left_pad, &right_pad); + + // Calculate the right edge of rendered text + a whitespace. + left_pad = left_pad + font->getWidth(mTextEntry->getText()) + font->getWidth(" "); + + LLRect rect = mMaturityButton->getRect(); + mMaturityButton->setRect(rect.setOriginAndSize(left_pad, rect.mBottom, rect.getWidth(), rect.getHeight())); + + // Hide icon if it text area is not width enough to display it, show otherwise. + mMaturityButton->setVisible(rect.mRight < mTextEntry->getRect().getWidth() - right_pad); +} + +void LLLocationInputCtrl::rebuildLocationHistory(const std::string& filter) { LLLocationHistory::location_list_t filtered_items; const LLLocationHistory::location_list_t* itemsp = NULL; @@ -807,7 +954,7 @@ void LLLocationInputCtrl::rebuildLocationHistory(std::string filter) LLSD value; value["tooltip"] = it->getToolTip(); //location history can contain only typed locations - value["item_type"] = TYPED_REGION_SURL; + value["item_type"] = TYPED_REGION_SLURL; value["global_pos"] = it->mGlobalPos.getValue(); add(it->getLocation(), value); } @@ -885,16 +1032,25 @@ void LLLocationInputCtrl::updateWidgetlayout() void LLLocationInputCtrl::changeLocationPresentation() { - //change location presentation only if user does not select/past anything and - //human-readable region name is being displayed + if (!mTextEntry) + return; + + //change location presentation only if user does not select/paste anything and + //human-readable region name is being displayed std::string text = mTextEntry->getText(); LLStringUtil::trim(text); - if(mTextEntry && !mTextEntry->hasSelection() && text == mHumanReadableLocation ) + if(!mTextEntry->hasSelection() && text == mHumanReadableLocation) { //needs unescaped one - mTextEntry->setText(LLAgentUI::buildSLURL(false)); + LLSLURL slurl; + LLAgentUI::buildSLURL(slurl, false); + mTextEntry->setText(slurl.getSLURLString()); mTextEntry->selectAll(); - } + + mMaturityButton->setVisible(FALSE); + + isHumanReadableLocationVisible = false; + } } void LLLocationInputCtrl::onLocationContextMenuItemClicked(const LLSD& userdata) @@ -909,7 +1065,6 @@ void LLLocationInputCtrl::onLocationContextMenuItemClicked(const LLSD& userdata) { gSavedSettings.setBOOL("NavBarShowParcelProperties", !gSavedSettings.getBOOL("NavBarShowParcelProperties")); - refreshParcelIcons(); } else if (item == "landmark") { diff --git a/indra/newview/lllocationinputctrl.h b/indra/newview/lllocationinputctrl.h index a830b33f6f..fc7adf60b0 100644 --- a/indra/newview/lllocationinputctrl.h +++ b/indra/newview/lllocationinputctrl.h @@ -36,6 +36,7 @@ #include "llcombobox.h" #include "lliconctrl.h" // Params #include "lltextbox.h" // Params +#include "lllocationhistory.h" class LLLandmark; @@ -63,13 +64,18 @@ public: struct Params : public LLInitParam::Block<Params, LLComboBox::Params> { - Optional<LLUIImage*> add_landmark_image_enabled, + Optional<LLUIImage*> icon_maturity_general, + icon_maturity_adult, + icon_maturity_moderate, + add_landmark_image_enabled, add_landmark_image_disabled, add_landmark_image_hover, add_landmark_image_selected; + Optional<std::string> maturity_help_topic; Optional<S32> icon_hpad, add_landmark_hpad; - Optional<LLButton::Params> add_landmark_button, + Optional<LLButton::Params> maturity_button, + add_landmark_button, for_sale_button, info_button; Optional<LLIconCtrl::Params> voice_icon, @@ -89,6 +95,7 @@ public: /*virtual*/ void onFocusReceived(); /*virtual*/ void onFocusLost(); /*virtual*/ void draw(); + /*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE); //======================================================================== // LLUICtrl interface @@ -131,8 +138,10 @@ private: void refreshParcelIcons(); // Refresh the value in the health percentage text field void refreshHealth(); + void refreshMaturityButton(); + void positionMaturityButton(); - void rebuildLocationHistory(std::string filter = ""); + void rebuildLocationHistory(const std::string& filter = LLStringUtil::null); bool findTeleportItemsByTitle(const LLTeleportHistoryItem& item, const std::string& filter); void setText(const LLStringExplicit& text); void updateAddLandmarkButton(); @@ -142,13 +151,14 @@ private: void changeLocationPresentation(); void onInfoButtonClicked(); - void onLocationHistoryLoaded(); + void onLocationHistoryChanged(LLLocationHistory::EChangeType event); void onLocationPrearrange(const LLSD& data); void onTextEditorRightClicked(S32 x, S32 y, MASK mask); void onLandmarkLoaded(LLLandmark* lm); void onForSaleButtonClicked(); void onAddLandmarkButtonClicked(); void onAgentParcelChange(); + void onMaturityButtonClicked(); // callbacks bool onLocationContextMenuItemEnabled(const LLSD& userdata); void onLocationContextMenuItemClicked(const LLSD& userdata); @@ -160,7 +170,8 @@ private: LLButton* mInfoBtn; S32 mIconHPad; // pad between all icons S32 mAddLandmarkHPad; // pad to left of landmark star - + + LLButton* mMaturityButton; LLIconCtrl* mParcelIcon[ICON_COUNT]; LLTextBox* mDamageText; @@ -168,15 +179,22 @@ private: LLRemoveLandmarkObserver* mRemoveLandmarkObserver; LLParcelChangeObserver* mParcelChangeObserver; + boost::signals2::connection mCoordinatesControlConnection; + boost::signals2::connection mParcelPropertiesControlConnection; boost::signals2::connection mParcelMgrConnection; boost::signals2::connection mLocationHistoryConnection; LLUIImage* mLandmarkImageOn; LLUIImage* mLandmarkImageOff; + LLPointer<LLUIImage> mIconMaturityGeneral; + LLPointer<LLUIImage> mIconMaturityAdult; + LLPointer<LLUIImage> mIconMaturityModerate; std::string mAddLandmarkTooltip; std::string mEditLandmarkTooltip; // this field holds a human-readable form of the location string, it is needed to be able to compare copy-pated value and real location std::string mHumanReadableLocation; + bool isHumanReadableLocationVisible; + std::string mMaturityHelpTopic; }; #endif diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp index 96ce01c05f..be8b2363ad 100644 --- a/indra/newview/lllogchat.cpp +++ b/indra/newview/lllogchat.cpp @@ -39,12 +39,27 @@ #include "llviewercontrol.h" #include "llinstantmessage.h" +#include "llsingleton.h" // for LLSingleton #include <boost/algorithm/string/trim.hpp> #include <boost/algorithm/string/replace.hpp> #include <boost/regex.hpp> #include <boost/regex/v4/match_results.hpp> +#if LL_MSVC +// disable warning about boost::lexical_cast unreachable code +// when it fails to parse the string +#pragma warning (disable:4702) +#endif + +#include <boost/date_time/gregorian/gregorian.hpp> +#if LL_MSVC +#pragma warning(pop) // Restore all warnings to the previous state +#endif + +#include <boost/date_time/posix_time/posix_time.hpp> +#include <boost/date_time/local_time_adjustor.hpp> + const S32 LOG_RECALL_SIZE = 2048; const static std::string IM_TIME("time"); @@ -69,6 +84,8 @@ const static std::string MULTI_LINE_PREFIX(" "); * Katar Ivercourt is Offline * [3:00] Katar Ivercourt is Offline * [2009/11/20 3:01] Corba ProductEngine is Offline + * + * Note: "You" was used as an avatar names in viewers of previous versions */ const static boost::regex TIMESTAMP_AND_STUFF("^(\\[\\d{4}/\\d{1,2}/\\d{1,2}\\s+\\d{1,2}:\\d{2}\\]\\s+|\\[\\d{1,2}:\\d{2}\\]\\s+)?(.*)$"); @@ -78,11 +95,96 @@ const static boost::regex TIMESTAMP_AND_STUFF("^(\\[\\d{4}/\\d{1,2}/\\d{1,2}\\s+ */ const static boost::regex NAME_AND_TEXT("(You:|Second Life:|[^\\s:]+\\s*[:]{1}|\\S+\\s+[^\\s:]+[:]{1})?(\\s*)(.*)"); +//is used to parse complex object names like "Xstreet SL Terminal v2.2.5 st" +const static std::string NAME_TEXT_DIVIDER(": "); + +// is used for timestamps adjusting +const static char* DATE_FORMAT("%Y/%m/%d %H:%M"); +const static char* TIME_FORMAT("%H:%M"); + const static int IDX_TIMESTAMP = 1; const static int IDX_STUFF = 2; const static int IDX_NAME = 1; const static int IDX_TEXT = 3; +using namespace boost::posix_time; +using namespace boost::gregorian; + +class LLLogChatTimeScanner: public LLSingleton<LLLogChatTimeScanner> +{ +public: + LLLogChatTimeScanner() + { + // Note, date/time facets will be destroyed by string streams + mDateStream.imbue(std::locale(mDateStream.getloc(), new date_input_facet(DATE_FORMAT))); + mTimeStream.imbue(std::locale(mTimeStream.getloc(), new time_facet(TIME_FORMAT))); + mTimeStream.imbue(std::locale(mTimeStream.getloc(), new time_input_facet(DATE_FORMAT))); + } + + date getTodayPacificDate() + { + typedef boost::date_time::local_adjustor<ptime, -8, no_dst> pst; + typedef boost::date_time::local_adjustor<ptime, -7, no_dst> pdt; + time_t t_time = time(NULL); + ptime p_time = LLStringOps::getPacificDaylightTime() + ? pdt::utc_to_local(from_time_t(t_time)) + : pst::utc_to_local(from_time_t(t_time)); + struct tm s_tm = to_tm(p_time); + return date_from_tm(s_tm); + } + + void checkAndCutOffDate(std::string& time_str) + { + // Cuts off the "%Y/%m/%d" from string for todays timestamps. + // Assume that passed string has at least "%H:%M" time format. + date log_date(not_a_date_time); + date today(getTodayPacificDate()); + + // Parse the passed date + mDateStream.str(LLStringUtil::null); + mDateStream << time_str; + mDateStream >> log_date; + mDateStream.clear(); + + days zero_days(0); + days days_alive = today - log_date; + + if ( days_alive == zero_days ) + { + // Yep, today's so strip "%Y/%m/%d" info + ptime stripped_time(not_a_date_time); + + mTimeStream.str(LLStringUtil::null); + mTimeStream << time_str; + mTimeStream >> stripped_time; + mTimeStream.clear(); + + time_str.clear(); + + mTimeStream.str(LLStringUtil::null); + mTimeStream << stripped_time; + mTimeStream >> time_str; + mTimeStream.clear(); + } + + LL_DEBUGS("LLChatLogParser") + << " log_date: " + << log_date + << " today: " + << today + << " days alive: " + << days_alive + << " new time: " + << time_str + << LL_ENDL; + } + + +private: + std::stringstream mDateStream; + std::stringstream mTimeStream; +}; + //static std::string LLLogChat::makeLogFileName(std::string filename) { @@ -160,10 +262,19 @@ void LLLogChat::saveHistory(const std::string& filename, if (gSavedPerAccountSettings.getBOOL("LogTimestamp")) item["time"] = LLLogChat::timestamp(gSavedPerAccountSettings.getBOOL("LogTimestampDate")); - item["from"] = from; item["from_id"] = from_id; item["message"] = line; + //adding "Second Life:" for all system messages to make chat log history parsing more reliable + if (from.empty() && from_id.isNull()) + { + item["from"] = SYSTEM_FROM; + } + else + { + item["from"] = from; + } + file << LLChatLogFormatter(item) << std::endl; file.close(); @@ -363,7 +474,8 @@ bool LLChatLogParser::parse(std::string& raw, LLSD& im) boost::trim(timestamp); timestamp.erase(0, 1); timestamp.erase(timestamp.length()-1, 1); - im[IM_TIME] = timestamp; + LLLogChatTimeScanner::instance().checkAndCutOffDate(timestamp); + im[IM_TIME] = timestamp; } else { @@ -398,6 +510,18 @@ bool LLChatLogParser::parse(std::string& raw, LLSD& im) im[IM_FROM_ID] = LLUUID::null; } + //possibly a case of complex object names consisting of 3+ words + if (!has_name) + { + U32 divider_pos = stuff.find(NAME_TEXT_DIVIDER); + if (divider_pos != std::string::npos && divider_pos < (stuff.length() - NAME_TEXT_DIVIDER.length())) + { + im[IM_FROM] = stuff.substr(0, divider_pos); + im[IM_TEXT] = stuff.substr(divider_pos + NAME_TEXT_DIVIDER.length()); + return true; + } + } + if (!has_name) { //text is mandatory diff --git a/indra/newview/llloginhandler.cpp b/indra/newview/llloginhandler.cpp index 1be3430e07..4e0a7594ba 100644 --- a/indra/newview/llloginhandler.cpp +++ b/indra/newview/llloginhandler.cpp @@ -35,12 +35,14 @@ #include "llloginhandler.h" // viewer includes +#include "llsecapi.h" +#include "lllogininstance.h" // to check if logged in yet #include "llpanellogin.h" // save_password_to_disk() #include "llstartup.h" // getStartupState() -#include "llurlsimstring.h" +#include "llslurl.h" #include "llviewercontrol.h" // gSavedSettings #include "llviewernetwork.h" // EGridInfo -#include "llviewerwindow.h" // getWindow() +#include "llviewerwindow.h" // getWindow() // library includes #include "llmd5.h" @@ -59,109 +61,33 @@ bool LLLoginHandler::parseDirectLogin(std::string url) LLURI uri(url); parse(uri.queryMap()); - if (/*mWebLoginKey.isNull() ||*/ - mFirstName.empty() || - mLastName.empty()) - { - return false; - } - else - { - return true; - } + // NOTE: Need to add direct login as per identity evolution + return true; } - void LLLoginHandler::parse(const LLSD& queryMap) { - //mWebLoginKey = queryMap["web_login_key"].asUUID(); - mFirstName = queryMap["first_name"].asString(); - mLastName = queryMap["last_name"].asString(); - EGridInfo grid_choice = GRID_INFO_NONE; - if (queryMap["grid"].asString() == "aditi") - { - grid_choice = GRID_INFO_ADITI; - } - else if (queryMap["grid"].asString() == "agni") - { - grid_choice = GRID_INFO_AGNI; - } - else if (queryMap["grid"].asString() == "siva") - { - grid_choice = GRID_INFO_SIVA; - } - else if (queryMap["grid"].asString() == "damballah") - { - grid_choice = GRID_INFO_DAMBALLAH; - } - else if (queryMap["grid"].asString() == "durga") - { - grid_choice = GRID_INFO_DURGA; - } - else if (queryMap["grid"].asString() == "shakti") - { - grid_choice = GRID_INFO_SHAKTI; - } - else if (queryMap["grid"].asString() == "soma") - { - grid_choice = GRID_INFO_SOMA; - } - else if (queryMap["grid"].asString() == "ganga") - { - grid_choice = GRID_INFO_GANGA; - } - else if (queryMap["grid"].asString() == "vaak") - { - grid_choice = GRID_INFO_VAAK; - } - else if (queryMap["grid"].asString() == "uma") - { - grid_choice = GRID_INFO_UMA; - } - else if (queryMap["grid"].asString() == "mohini") - { - grid_choice = GRID_INFO_MOHINI; - } - else if (queryMap["grid"].asString() == "yami") - { - grid_choice = GRID_INFO_YAMI; - } - else if (queryMap["grid"].asString() == "nandi") - { - grid_choice = GRID_INFO_NANDI; - } - else if (queryMap["grid"].asString() == "mitra") + if (queryMap.has("grid")) { - grid_choice = GRID_INFO_MITRA; + LLGridManager::getInstance()->setGridChoice(queryMap["grid"].asString()); } - else if (queryMap["grid"].asString() == "radha") - { - grid_choice = GRID_INFO_RADHA; - } - else if (queryMap["grid"].asString() == "ravi") - { - grid_choice = GRID_INFO_RAVI; - } - else if (queryMap["grid"].asString() == "aruna") - { - grid_choice = GRID_INFO_ARUNA; - } - - if(grid_choice != GRID_INFO_NONE) - { - LLViewerLogin::getInstance()->setGridChoice(grid_choice); - } - + + std::string startLocation = queryMap["location"].asString(); - + if (startLocation == "specify") { - LLURLSimString::setString(queryMap["region"].asString()); + LLStartUp::setStartSLURL(LLSLURL(LLGridManager::getInstance()->getGridLoginID(), + queryMap["region"].asString())); + } + else if (startLocation == "home") + { + LLStartUp::setStartSLURL(LLSLURL(LLSLURL::SIM_LOCATION_HOME)); } - else if (!startLocation.empty()) // "last" or "home" or ??? (let LLURLSimString figure it out) + else if (startLocation == "last") { - LLURLSimString::setString(startLocation); + LLStartUp::setStartSLURL(LLSLURL(LLSLURL::SIM_LOCATION_LAST)); } } @@ -169,6 +95,13 @@ bool LLLoginHandler::handle(const LLSD& tokens, const LLSD& query_map, LLMediaCtrl* web) { + // do nothing if we are already logged in + if (LLLoginInstance::getInstance()->authSuccess()) + { + LL_WARNS_ONCE("SLURL") << "Already logged in! Ignoring login SLapp." << LL_ENDL; + return true; + } + if (tokens.size() == 1 && tokens[0].asString() == "show") { @@ -212,40 +145,65 @@ bool LLLoginHandler::handle(const LLSD& tokens, return true; } - std::string password = query_map["password"].asString(); - - if (!password.empty()) + if (LLStartUp::getStartupState() < STATE_LOGIN_CLEANUP) //on splash page { - gSavedSettings.setBOOL("RememberPassword", TRUE); - - if (password.substr(0,3) != "$1$") - { - LLMD5 pass((unsigned char*)password.c_str()); - char md5pass[33]; /* Flawfinder: ignore */ - pass.hex_digest(md5pass); - std::string hashed_password = ll_safe_string(md5pass, 32); - LLStartUp::savePasswordToDisk(hashed_password); - } + // as the login page may change from grid to grid, as well as + // things like username/password/etc, we simply refresh the + // login page to make sure everything is set up correctly + LLPanelLogin::loadLoginPage(); + LLStartUp::setStartupState( STATE_LOGIN_CLEANUP ); } - + return true; +} + - if (LLStartUp::getStartupState() < STATE_LOGIN_CLEANUP) //on splash page + +// Initialize the credentials +// If the passed in URL contains login info, parse +// that into a credential and web login key. Otherwise +// check the command line. If the command line +// does not contain any login creds, load the last saved +// ones from the protected credential store. +// This always returns with a credential structure set in the +// login handler +LLPointer<LLCredential> LLLoginHandler::initializeLoginInfo() +{ + LLPointer<LLCredential> result = NULL; + // so try to load it from the UserLoginInfo + result = loadSavedUserLoginInfo(); + if (result.isNull()) + { + result = gSecAPIHandler->loadCredential(LLGridManager::getInstance()->getGrid()); + } + + return result; +} + + +LLPointer<LLCredential> LLLoginHandler::loadSavedUserLoginInfo() +{ + // load the saved user login info into a LLCredential. + // perhaps this should be moved. + LLSD cmd_line_login = gSavedSettings.getLLSD("UserLoginInfo"); + if (cmd_line_login.size() == 3) { - if (!mFirstName.empty() || !mLastName.empty()) - { - // Fill in the name, and maybe the password - LLPanelLogin::setFields(mFirstName, mLastName, password); - } - - //if (mWebLoginKey.isNull()) - //{ - // LLPanelLogin::loadLoginPage(); - //} - //else - //{ - // LLStartUp::setStartupState( STATE_LOGIN_CLEANUP ); - //} - LLStartUp::setStartupState( STATE_LOGIN_CLEANUP ); - } - return true; + + LLMD5 pass((unsigned char*)cmd_line_login[2].asString().c_str()); + char md5pass[33]; /* Flawfinder: ignore */ + pass.hex_digest(md5pass); + LLSD identifier = LLSD::emptyMap(); + identifier["type"] = "agent"; + identifier["first_name"] = cmd_line_login[0]; + identifier["last_name"] = cmd_line_login[1]; + + LLSD authenticator = LLSD::emptyMap(); + authenticator["type"] = "hash"; + authenticator["algorithm"] = "md5"; + authenticator["secret"] = md5pass; + // yuck, we'll fix this with mani's changes. + gSavedSettings.setBOOL("AutoLogin", TRUE); + return gSecAPIHandler->createCredential(LLGridManager::getInstance()->getGrid(), + identifier, authenticator); + } + return NULL; } diff --git a/indra/newview/llloginhandler.h b/indra/newview/llloginhandler.h index ac4648761b..c15b998c91 100644 --- a/indra/newview/llloginhandler.h +++ b/indra/newview/llloginhandler.h @@ -34,6 +34,7 @@ #define LLLOGINHANDLER_H #include "llcommandhandler.h" +#include "llsecapi.h" class LLLoginHandler : public LLCommandHandler { @@ -46,19 +47,15 @@ class LLLoginHandler : public LLCommandHandler // secondlife:///app/login?first=Bob&last=Dobbs bool parseDirectLogin(std::string url); - std::string getFirstName() const { return mFirstName; } - std::string getLastName() const { return mLastName; } - // Web-based login unsupported //LLUUID getWebLoginKey() const { return mWebLoginKey; } + LLPointer<LLCredential> loadSavedUserLoginInfo(); + LLPointer<LLCredential> initializeLoginInfo(); + private: void parse(const LLSD& queryMap); -private: - std::string mFirstName; - std::string mLastName; - //LLUUID mWebLoginKey; }; extern LLLoginHandler gLoginHandler; diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp index 24c72c65ce..71604291e1 100644 --- a/indra/newview/lllogininstance.cpp +++ b/indra/newview/lllogininstance.cpp @@ -48,13 +48,16 @@ // newview #include "llviewernetwork.h" #include "llviewercontrol.h" -#include "llurlsimstring.h" +#include "llslurl.h" +#include "llstartup.h" #include "llfloaterreg.h" #include "llnotifications.h" #include "llwindow.h" #if LL_LINUX || LL_SOLARIS #include "lltrans.h" #endif +#include "llsecapi.h" +#include "llstartup.h" static const char * const TOS_REPLY_PUMP = "lllogininstance_tos_callback"; static const char * const TOS_LISTENER_NAME = "lllogininstance_tos"; @@ -83,14 +86,14 @@ LLLoginInstance::~LLLoginInstance() { } -void LLLoginInstance::connect(const LLSD& credentials) +void LLLoginInstance::connect(LLPointer<LLCredential> credentials) { std::vector<std::string> uris; - LLViewerLogin::getInstance()->getLoginURIs(uris); + LLGridManager::getInstance()->getLoginURIs(uris); connect(uris.front(), credentials); } -void LLLoginInstance::connect(const std::string& uri, const LLSD& credentials) +void LLLoginInstance::connect(const std::string& uri, LLPointer<LLCredential> credentials) { mAttemptComplete = false; // Reset attempt complete at this point! constructAuthParams(credentials); @@ -102,7 +105,7 @@ void LLLoginInstance::reconnect() // Sort of like connect, only using the pre-existing // request params. std::vector<std::string> uris; - LLViewerLogin::getInstance()->getLoginURIs(uris); + LLGridManager::getInstance()->getLoginURIs(uris); mLoginModule->connect(uris.front(), mRequestData); } @@ -118,7 +121,7 @@ LLSD LLLoginInstance::getResponse() return mResponseData; } -void LLLoginInstance::constructAuthParams(const LLSD& credentials) +void LLLoginInstance::constructAuthParams(LLPointer<LLCredential> user_credential) { // Set up auth request options. //#define LL_MINIMIAL_REQUESTED_OPTIONS @@ -145,8 +148,11 @@ void LLLoginInstance::constructAuthParams(const LLSD& credentials) requested_options.append("adult_compliant"); //requested_options.append("inventory-targets"); requested_options.append("buddy-list"); + requested_options.append("newuser-config"); requested_options.append("ui-config"); #endif + requested_options.append("map-server-url"); + requested_options.append("voice-config"); requested_options.append("tutorial_setting"); requested_options.append("login-flags"); requested_options.append("global-textures"); @@ -155,20 +161,18 @@ void LLLoginInstance::constructAuthParams(const LLSD& credentials) gSavedSettings.setBOOL("UseDebugMenus", TRUE); requested_options.append("god-connect"); } + + // (re)initialize the request params with creds. + LLSD request_params = user_credential->getLoginParams(); char hashed_mac_string[MD5HEX_STR_SIZE]; /* Flawfinder: ignore */ LLMD5 hashed_mac; - hashed_mac.update( gMACAddress, MAC_ADDRESS_BYTES ); + unsigned char MACAddress[MAC_ADDRESS_BYTES]; + LLUUID::getNodeID(MACAddress); + hashed_mac.update( MACAddress, MAC_ADDRESS_BYTES ); hashed_mac.finalize(); hashed_mac.hex_digest(hashed_mac_string); - - // prepend "$1$" to the password to indicate its the md5'd version. - std::string dpasswd("$1$"); - dpasswd.append(credentials["passwd"].asString()); - - // (re)initialize the request params with creds. - LLSD request_params(credentials); - request_params["passwd"] = dpasswd; + request_params["start"] = construct_start_string(); request_params["skipoptional"] = mSkipOptionalUpdate; request_params["agree_to_tos"] = false; // Always false here. Set true in @@ -247,6 +251,15 @@ void LLLoginInstance::handleLoginFailure(const LLSD& event) LLSD data(LLSD::emptyMap()); data["message"] = message_response; data["reply_pump"] = TOS_REPLY_PUMP; + if(response.has("error_code")) + { + data["error_code"] = response["error_code"]; + } + if(response.has("certificate")) + { + data["certificate"] = response["certificate"]; + } + LLFloaterReg::showInstance("message_critical", data); LLEventPumps::instance().obtain(TOS_REPLY_PUMP) .listen(TOS_LISTENER_NAME, @@ -352,20 +365,18 @@ void LLLoginInstance::updateApp(bool mandatory, const std::string& auth_msg) payload["mandatory"] = mandatory; /* - We're constructing one of the following 6 strings here: + We're constructing one of the following 9 strings here: "DownloadWindowsMandatory" "DownloadWindowsReleaseForDownload" "DownloadWindows" "DownloadMacMandatory" "DownloadMacReleaseForDownload" "DownloadMac" + "DownloadLinuxMandatory" + "DownloadLinuxReleaseForDownload" + "DownloadLinux" I've called them out explicitly in this comment so that they can be grepped for. - - Also, we assume that if we're not Windows we're Mac. If we ever intend to support - Linux with autoupdate, this should be an explicit #elif LL_DARWIN, but - we'd rather deliver the wrong message than no message, so until Linux is supported - we'll leave it alone. */ std::string notification_name = "Download"; @@ -454,20 +465,31 @@ bool LLLoginInstance::updateDialogCallback(const LLSD& notification, const LLSD& std::string construct_start_string() { std::string start; - if (LLURLSimString::parse()) + LLSLURL start_slurl = LLStartUp::getStartSLURL(); + switch(start_slurl.getType()) { - // a startup URL was specified - std::string unescaped_start = + case LLSLURL::LOCATION: + { + // a startup URL was specified + LLVector3 position = start_slurl.getPosition(); + std::string unescaped_start = STRINGIZE( "uri:" - << LLURLSimString::sInstance.mSimName << "&" - << LLURLSimString::sInstance.mX << "&" - << LLURLSimString::sInstance.mY << "&" - << LLURLSimString::sInstance.mZ); - start = xml_escape_string(unescaped_start); - } - else - { - start = gSavedSettings.getString("LoginLocation"); + << start_slurl.getRegion() << "&" + << position[VX] << "&" + << position[VY] << "&" + << position[VZ]); + start = xml_escape_string(unescaped_start); + break; + } + case LLSLURL::HOME_LOCATION: + { + start = "home"; + break; + } + default: + { + start = "last"; + } } return start; } diff --git a/indra/newview/lllogininstance.h b/indra/newview/lllogininstance.h index c8704eddb4..44271bb75e 100644 --- a/indra/newview/lllogininstance.h +++ b/indra/newview/lllogininstance.h @@ -36,6 +36,7 @@ #include "lleventdispatcher.h" #include <boost/scoped_ptr.hpp> #include <boost/function.hpp> +#include "llsecapi.h" class LLLogin; class LLEventStream; class LLNotificationsInterface; @@ -48,8 +49,8 @@ public: LLLoginInstance(); ~LLLoginInstance(); - void connect(const LLSD& credential); // Connect to the current grid choice. - void connect(const std::string& uri, const LLSD& credential); // Connect to the given uri. + void connect(LLPointer<LLCredential> credentials); // Connect to the current grid choice. + void connect(const std::string& uri, LLPointer<LLCredential> credentials); // Connect to the given uri. void reconnect(); // reconnect using the current credentials. void disconnect(); @@ -81,7 +82,7 @@ public: void setUpdaterLauncher(const UpdaterLauncherCallback& ulc) { mUpdaterLauncher = ulc; } private: - void constructAuthParams(const LLSD& credentials); + void constructAuthParams(LLPointer<LLCredential> user_credentials); void updateApp(bool mandatory, const std::string& message); bool updateDialogCallback(const LLSD& notification, const LLSD& response); diff --git a/indra/newview/llmachineid.cpp b/indra/newview/llmachineid.cpp new file mode 100644 index 0000000000..53243e9807 --- /dev/null +++ b/indra/newview/llmachineid.cpp @@ -0,0 +1,269 @@ +/** + * @file llmachineid.cpp + * @brief retrieves unique machine ids + * + * $LicenseInfo:firstyear=2009&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" +#include "lluuid.h" +#include "llmachineid.h" +#if LL_WINDOWS +#define _WIN32_DCOM +#include <iostream> +using namespace std; +#include <comdef.h> +#include <Wbemidl.h> +#endif +unsigned char static_unique_id[] = {0,0,0,0,0,0}; +bool static has_static_unique_id = false; + +// get an unique machine id. +// NOT THREAD SAFE - do before setting up threads. +// MAC Address doesn't work for Windows 7 since the first returned hardware MAC address changes with each reboot, Go figure?? + +S32 LLMachineID::init() +{ + memset(static_unique_id,0,sizeof(static_unique_id)); + S32 ret_code = 0; +#if LL_WINDOWS +# pragma comment(lib, "wbemuuid.lib") + size_t len = sizeof(static_unique_id); + + // algorithm to detect BIOS serial number found at: + // http://msdn.microsoft.com/en-us/library/aa394077%28VS.85%29.aspx + // we can't use the MAC address since on Windows 7, the first returned MAC address changes with every reboot. + + + HRESULT hres; + + // Step 1: -------------------------------------------------- + // Initialize COM. ------------------------------------------ + + hres = CoInitializeEx(0, COINIT_MULTITHREADED); + if (FAILED(hres)) + { + LL_DEBUGS("AppInit") << "Failed to initialize COM library. Error code = 0x" << hex << hres << LL_ENDL; + return 1; // Program has failed. + } + + // Step 2: -------------------------------------------------- + // Set general COM security levels -------------------------- + // Note: If you are using Windows 2000, you need to specify - + // the default authentication credentials for a user by using + // a SOLE_AUTHENTICATION_LIST structure in the pAuthList ---- + // parameter of CoInitializeSecurity ------------------------ + + hres = CoInitializeSecurity( + NULL, + -1, // COM authentication + NULL, // Authentication services + NULL, // Reserved + RPC_C_AUTHN_LEVEL_DEFAULT, // Default authentication + RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation + NULL, // Authentication info + EOAC_NONE, // Additional capabilities + NULL // Reserved + ); + + + if (FAILED(hres)) + { + LL_DEBUGS("AppInit") << "Failed to initialize security. Error code = 0x" << hex << hres << LL_ENDL; + CoUninitialize(); + return 1; // Program has failed. + } + + // Step 3: --------------------------------------------------- + // Obtain the initial locator to WMI ------------------------- + + IWbemLocator *pLoc = NULL; + + hres = CoCreateInstance( + CLSID_WbemLocator, + 0, + CLSCTX_INPROC_SERVER, + IID_IWbemLocator, (LPVOID *) &pLoc); + + if (FAILED(hres)) + { + LL_DEBUGS("AppInit") << "Failed to create IWbemLocator object." << " Err code = 0x" << hex << hres << LL_ENDL; + CoUninitialize(); + return 1; // Program has failed. + } + + // Step 4: ----------------------------------------------------- + // Connect to WMI through the IWbemLocator::ConnectServer method + + IWbemServices *pSvc = NULL; + + // Connect to the root\cimv2 namespace with + // the current user and obtain pointer pSvc + // to make IWbemServices calls. + hres = pLoc->ConnectServer( + _bstr_t(L"ROOT\\CIMV2"), // Object path of WMI namespace + NULL, // User name. NULL = current user + NULL, // User password. NULL = current + 0, // Locale. NULL indicates current + NULL, // Security flags. + 0, // Authority (e.g. Kerberos) + 0, // Context object + &pSvc // pointer to IWbemServices proxy + ); + + if (FAILED(hres)) + { + LL_DEBUGS("AppInit") << "Could not connect. Error code = 0x" << hex << hres << LL_ENDL; + pLoc->Release(); + CoUninitialize(); + return 1; // Program has failed. + } + + LL_DEBUGS("AppInit") << "Connected to ROOT\\CIMV2 WMI namespace" << LL_ENDL; + + + // Step 5: -------------------------------------------------- + // Set security levels on the proxy ------------------------- + + hres = CoSetProxyBlanket( + pSvc, // Indicates the proxy to set + RPC_C_AUTHN_WINNT, // RPC_C_AUTHN_xxx + RPC_C_AUTHZ_NONE, // RPC_C_AUTHZ_xxx + NULL, // Server principal name + RPC_C_AUTHN_LEVEL_CALL, // RPC_C_AUTHN_LEVEL_xxx + RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx + NULL, // client identity + EOAC_NONE // proxy capabilities + ); + + if (FAILED(hres)) + { + LL_DEBUGS("AppInit") << "Could not set proxy blanket. Error code = 0x" << hex << hres << LL_ENDL; + pSvc->Release(); + pLoc->Release(); + CoUninitialize(); + return 1; // Program has failed. + } + + // Step 6: -------------------------------------------------- + // Use the IWbemServices pointer to make requests of WMI ---- + + // For example, get the name of the operating system + IEnumWbemClassObject* pEnumerator = NULL; + hres = pSvc->ExecQuery( + bstr_t("WQL"), + bstr_t("SELECT * FROM Win32_OperatingSystem"), + WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, + NULL, + &pEnumerator); + + if (FAILED(hres)) + { + LL_DEBUGS("AppInit") << "Query for operating system name failed." << " Error code = 0x" << hex << hres << LL_ENDL; + pSvc->Release(); + pLoc->Release(); + CoUninitialize(); + return 1; // Program has failed. + } + + // Step 7: ------------------------------------------------- + // Get the data from the query in step 6 ------------------- + + IWbemClassObject *pclsObj = NULL; + ULONG uReturn = 0; + + while (pEnumerator) + { + HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, + &pclsObj, &uReturn); + + if(0 == uReturn) + { + break; + } + + VARIANT vtProp; + + // Get the value of the Name property + hr = pclsObj->Get(L"SerialNumber", 0, &vtProp, 0, 0); + LL_DEBUGS("AppInit") << " Serial Number : " << vtProp.bstrVal << LL_ENDL; + // use characters in the returned Serial Number to create a byte array of size len + BSTR serialNumber ( vtProp.bstrVal); + unsigned int j = 0; + while( vtProp.bstrVal[j] != 0) + { + for (unsigned int i = 0; i < len; i++) + { + if (vtProp.bstrVal[j] == 0) + break; + + static_unique_id[i] = (unsigned int)(static_unique_id[i] + serialNumber[j]); + j++; + } + } + VariantClear(&vtProp); + + pclsObj->Release(); + pclsObj = NULL; + break; + } + + // Cleanup + // ======== + + if (pSvc) + pSvc->Release(); + if (pLoc) + pLoc->Release(); + if (pEnumerator) + pEnumerator->Release(); + CoUninitialize(); + ret_code=0; +#else + unsigned char * staticPtr = (unsigned char *)(&static_unique_id[0]); + ret_code = LLUUID::getNodeID(staticPtr); +#endif + has_static_unique_id = true; + return ret_code; +} + + +S32 LLMachineID::getUniqueID(unsigned char *unique_id, size_t len) +{ + if (has_static_unique_id) + { + memcpy ( unique_id, &static_unique_id, len); + LL_DEBUGS("AppInit") << "UniqueID: " << unique_id[0] << unique_id[1]<< unique_id[2] << unique_id[3] << unique_id[4] << unique_id [5] << LL_ENDL; + return 1; + } + return 0; +} + + + + diff --git a/indra/newview/llmachineid.h b/indra/newview/llmachineid.h new file mode 100644 index 0000000000..8160309b47 --- /dev/null +++ b/indra/newview/llmachineid.h @@ -0,0 +1,56 @@ +/** + * @file llmachineid.h + * @brief retrieves unique machine ids + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLMACHINEID_H +#define LL_LLMACHINEID_H + + +class LLMachineID +{ +public: + LLMachineID(); + virtual ~LLMachineID(); + static S32 getUniqueID(unsigned char *unique_id, size_t len); + static S32 init(); + +protected: + +private: + + +}; + + + + + +#endif // LL_LLMACHINEID_H diff --git a/indra/newview/llmanip.cpp b/indra/newview/llmanip.cpp index a96240e31c..957e88960d 100644 --- a/indra/newview/llmanip.cpp +++ b/indra/newview/llmanip.cpp @@ -43,6 +43,7 @@ #include "llviewertexturelist.h" #include "llagent.h" +#include "llagentcamera.h" #include "llviewercontrol.h" #include "lldrawable.h" #include "llfontgl.h" @@ -180,7 +181,7 @@ F32 LLManip::getSubdivisionLevel(const LLVector3 &reference_point, const LLVecto LLVector3 cam_to_reference; if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD) { - cam_to_reference = LLVector3(1.f / gAgent.mHUDCurZoom, 0.f, 0.f); + cam_to_reference = LLVector3(1.f / gAgentCamera.mHUDCurZoom, 0.f, 0.f); } else { @@ -265,8 +266,8 @@ BOOL LLManip::getMousePointOnPlaneGlobal(LLVector3d& point, S32 x, S32 y, LLVect if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD) { BOOL result = FALSE; - F32 mouse_x = ((F32)x / gViewerWindow->getWorldViewWidthScaled() - 0.5f) * LLViewerCamera::getInstance()->getAspect() / gAgent.mHUDCurZoom; - F32 mouse_y = ((F32)y / gViewerWindow->getWorldViewHeightScaled() - 0.5f) / gAgent.mHUDCurZoom; + F32 mouse_x = ((F32)x / gViewerWindow->getWorldViewWidthScaled() - 0.5f) * LLViewerCamera::getInstance()->getAspect() / gAgentCamera.mHUDCurZoom; + F32 mouse_y = ((F32)y / gViewerWindow->getWorldViewHeightScaled() - 0.5f) / gAgentCamera.mHUDCurZoom; LLVector3 origin_agent = gAgent.getPosAgentFromGlobal(origin); LLVector3 mouse_pos = LLVector3(0.f, -mouse_x, mouse_y); @@ -304,15 +305,15 @@ BOOL LLManip::nearestPointOnLineFromMouse( S32 x, S32 y, const LLVector3& b1, co if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD) { - F32 mouse_x = (((F32)x / gViewerWindow->getWindowWidthScaled()) - 0.5f) * LLViewerCamera::getInstance()->getAspect() / gAgent.mHUDCurZoom; - F32 mouse_y = (((F32)y / gViewerWindow->getWindowHeightScaled()) - 0.5f) / gAgent.mHUDCurZoom; + F32 mouse_x = (((F32)x / gViewerWindow->getWindowWidthScaled()) - 0.5f) * LLViewerCamera::getInstance()->getAspect() / gAgentCamera.mHUDCurZoom; + F32 mouse_y = (((F32)y / gViewerWindow->getWindowHeightScaled()) - 0.5f) / gAgentCamera.mHUDCurZoom; a1 = LLVector3(llmin(b1.mV[VX] - 0.1f, b2.mV[VX] - 0.1f, 0.f), -mouse_x, mouse_y); a2 = a1 + LLVector3(1.f, 0.f, 0.f); } else { - a1 = gAgent.getCameraPositionAgent(); - a2 = gAgent.getCameraPositionAgent() + LLVector3(gViewerWindow->mouseDirectionGlobal(x, y)); + a1 = gAgentCamera.getCameraPositionAgent(); + a2 = gAgentCamera.getCameraPositionAgent() + LLVector3(gViewerWindow->mouseDirectionGlobal(x, y)); } BOOL parallel = TRUE; @@ -491,7 +492,7 @@ void LLManip::renderTickText(const LLVector3& pos, const std::string& text, cons LLVector3 render_pos = pos; if (hud_selection) { - F32 zoom_amt = gAgent.mHUDCurZoom; + F32 zoom_amt = gAgentCamera.mHUDCurZoom; F32 inv_zoom_amt = 1.f / zoom_amt; // scale text back up to counter-act zoom level render_pos = pos * zoom_amt; @@ -549,7 +550,7 @@ void LLManip::renderTickValue(const LLVector3& pos, F32 value, const std::string LLVector3 render_pos = pos; if (hud_selection) { - F32 zoom_amt = gAgent.mHUDCurZoom; + F32 zoom_amt = gAgentCamera.mHUDCurZoom; F32 inv_zoom_amt = 1.f / zoom_amt; // scale text back up to counter-act zoom level render_pos = pos * zoom_amt; diff --git a/indra/newview/llmaniprotate.cpp b/indra/newview/llmaniprotate.cpp index 8535d52015..6747bcb9c9 100644 --- a/indra/newview/llmaniprotate.cpp +++ b/indra/newview/llmaniprotate.cpp @@ -45,6 +45,7 @@ // viewer includes #include "llagent.h" +#include "llagentcamera.h" #include "llbox.h" #include "llbutton.h" #include "llviewercontrol.h" @@ -64,6 +65,7 @@ #include "lldrawable.h" #include "llglheaders.h" #include "lltrans.h" +#include "llvoavatarself.h" const F32 RADIUS_PIXELS = 100.f; // size in screen space const F32 SQ_RADIUS = RADIUS_PIXELS * RADIUS_PIXELS; @@ -138,7 +140,7 @@ void LLManipRotate::render() glPushMatrix(); if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD) { - F32 zoom = gAgent.mHUDCurZoom; + F32 zoom = gAgentCamera.mHUDCurZoom; glScalef(zoom, zoom, zoom); } @@ -690,7 +692,7 @@ void LLManipRotate::drag( S32 x, S32 y ) LLSelectMgr::getInstance()->updateSelectionCenter(); // RN: just clear focus so camera doesn't follow spurious object updates - gAgent.clearFocusObject(); + gAgentCamera.clearFocusObject(); dialog_refresh_all(); } @@ -730,7 +732,7 @@ void LLManipRotate::renderSnapGuides() } else { - cam_at_axis = center - gAgent.getCameraPositionAgent(); + cam_at_axis = center - gAgentCamera.getCameraPositionAgent(); cam_at_axis.normVec(); } @@ -738,7 +740,7 @@ void LLManipRotate::renderSnapGuides() LLVector3 test_axis = constraint_axis; BOOL constrain_to_ref_object = FALSE; - if (mObjectSelection->getSelectType() == SELECT_TYPE_ATTACHMENT && gAgent.getAvatarObject()) + if (mObjectSelection->getSelectType() == SELECT_TYPE_ATTACHMENT && isAgentAvatarValid()) { test_axis = test_axis * ~grid_rotation; } @@ -765,7 +767,7 @@ void LLManipRotate::renderSnapGuides() } LLVector3 projected_snap_axis = world_snap_axis; - if (mObjectSelection->getSelectType() == SELECT_TYPE_ATTACHMENT && gAgent.getAvatarObject()) + if (mObjectSelection->getSelectType() == SELECT_TYPE_ATTACHMENT && isAgentAvatarValid()) { projected_snap_axis = projected_snap_axis * grid_rotation; } @@ -1097,12 +1099,12 @@ BOOL LLManipRotate::updateVisiblity() LLVector3 center = gAgent.getPosAgentFromGlobal( mRotationCenter ); if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD) { - mCenterToCam = LLVector3(-1.f / gAgent.mHUDCurZoom, 0.f, 0.f); + mCenterToCam = LLVector3(-1.f / gAgentCamera.mHUDCurZoom, 0.f, 0.f); mCenterToCamNorm = mCenterToCam; mCenterToCamMag = mCenterToCamNorm.normVec(); mRadiusMeters = RADIUS_PIXELS / (F32) LLViewerCamera::getInstance()->getViewHeightInPixels(); - mRadiusMeters /= gAgent.mHUDCurZoom; + mRadiusMeters /= gAgentCamera.mHUDCurZoom; mCenterToProfilePlaneMag = mRadiusMeters * mRadiusMeters / mCenterToCamMag; mCenterToProfilePlane = -mCenterToProfilePlaneMag * mCenterToCamNorm; @@ -1110,8 +1112,8 @@ BOOL LLManipRotate::updateVisiblity() // x axis range is (-aspect * 0.5f, +aspect * 0.5) // y axis range is (-0.5, 0.5) // so use getWorldViewHeightRaw as scale factor when converting to pixel coordinates - mCenterScreen.set((S32)((0.5f - center.mV[VY]) / gAgent.mHUDCurZoom * gViewerWindow->getWorldViewHeightScaled()), - (S32)((center.mV[VZ] + 0.5f) / gAgent.mHUDCurZoom * gViewerWindow->getWorldViewHeightScaled())); + mCenterScreen.set((S32)((0.5f - center.mV[VY]) / gAgentCamera.mHUDCurZoom * gViewerWindow->getWorldViewHeightScaled()), + (S32)((center.mV[VZ] + 0.5f) / gAgentCamera.mHUDCurZoom * gViewerWindow->getWorldViewHeightScaled())); visible = TRUE; } else @@ -1119,7 +1121,7 @@ BOOL LLManipRotate::updateVisiblity() visible = LLViewerCamera::getInstance()->projectPosAgentToScreen(center, mCenterScreen ); if( visible ) { - mCenterToCam = gAgent.getCameraPositionAgent() - center; + mCenterToCam = gAgentCamera.getCameraPositionAgent() - center; mCenterToCamNorm = mCenterToCam; mCenterToCamMag = mCenterToCamNorm.normVec(); LLVector3 cameraAtAxis = LLViewerCamera::getInstance()->getAtAxis(); @@ -1165,7 +1167,7 @@ BOOL LLManipRotate::updateVisiblity() LLQuaternion LLManipRotate::dragUnconstrained( S32 x, S32 y ) { - LLVector3 cam = gAgent.getCameraPositionAgent(); + LLVector3 cam = gAgentCamera.getCameraPositionAgent(); LLVector3 center = gAgent.getPosAgentFromGlobal( mRotationCenter ); mMouseCur = intersectMouseWithSphere( x, y, center, mRadiusMeters); @@ -1281,7 +1283,7 @@ LLQuaternion LLManipRotate::dragConstrained( S32 x, S32 y ) LLVector3 axis2; LLVector3 test_axis = constraint_axis; - if (mObjectSelection->getSelectType() == SELECT_TYPE_ATTACHMENT && gAgent.getAvatarObject()) + if (mObjectSelection->getSelectType() == SELECT_TYPE_ATTACHMENT && isAgentAvatarValid()) { test_axis = test_axis * ~grid_rotation; } @@ -1305,7 +1307,7 @@ LLQuaternion LLManipRotate::dragConstrained( S32 x, S32 y ) axis1 = LLVector3::x_axis; } - if (mObjectSelection->getSelectType() == SELECT_TYPE_ATTACHMENT && gAgent.getAvatarObject()) + if (mObjectSelection->getSelectType() == SELECT_TYPE_ATTACHMENT && isAgentAvatarValid()) { axis1 = axis1 * grid_rotation; } @@ -1333,7 +1335,7 @@ LLQuaternion LLManipRotate::dragConstrained( S32 x, S32 y ) } else { - cam_to_snap_plane = snap_plane_center - gAgent.getCameraPositionAgent(); + cam_to_snap_plane = snap_plane_center - gAgentCamera.getCameraPositionAgent(); cam_to_snap_plane.normVec(); } @@ -1383,7 +1385,7 @@ LLQuaternion LLManipRotate::dragConstrained( S32 x, S32 y ) } else { - cam_to_snap_plane = snap_plane_center - gAgent.getCameraPositionAgent(); + cam_to_snap_plane = snap_plane_center - gAgentCamera.getCameraPositionAgent(); cam_to_snap_plane.normVec(); } @@ -1430,7 +1432,7 @@ LLQuaternion LLManipRotate::dragConstrained( S32 x, S32 y ) } else { - cam_at_axis = snap_plane_center - gAgent.getCameraPositionAgent(); + cam_at_axis = snap_plane_center - gAgentCamera.getCameraPositionAgent(); cam_at_axis.normVec(); } @@ -1627,15 +1629,15 @@ void LLManipRotate::mouseToRay( S32 x, S32 y, LLVector3* ray_pt, LLVector3* ray_ { if (LLSelectMgr::getInstance()->getSelection()->getSelectType() == SELECT_TYPE_HUD) { - F32 mouse_x = (((F32)x / gViewerWindow->getWorldViewRectScaled().getWidth()) - 0.5f) / gAgent.mHUDCurZoom; - F32 mouse_y = ((((F32)y) / gViewerWindow->getWorldViewRectScaled().getHeight()) - 0.5f) / gAgent.mHUDCurZoom; + F32 mouse_x = (((F32)x / gViewerWindow->getWorldViewRectScaled().getWidth()) - 0.5f) / gAgentCamera.mHUDCurZoom; + F32 mouse_y = ((((F32)y) / gViewerWindow->getWorldViewRectScaled().getHeight()) - 0.5f) / gAgentCamera.mHUDCurZoom; *ray_pt = LLVector3(-1.f, -mouse_x, mouse_y); *ray_dir = LLVector3(1.f, 0.f, 0.f); } else { - *ray_pt = gAgent.getCameraPositionAgent(); + *ray_pt = gAgentCamera.getCameraPositionAgent(); LLViewerCamera::getInstance()->projectScreenToPosAgent(x, y, ray_dir); *ray_dir -= *ray_pt; ray_dir->normVec(); diff --git a/indra/newview/llmanipscale.cpp b/indra/newview/llmanipscale.cpp index ee3ffa2450..63643a7fc6 100644 --- a/indra/newview/llmanipscale.cpp +++ b/indra/newview/llmanipscale.cpp @@ -45,6 +45,7 @@ // viewer includes #include "llagent.h" +#include "llagentcamera.h" #include "llbbox.h" #include "llbox.h" #include "llviewercontrol.h" @@ -210,7 +211,7 @@ void LLManipScale::render() glPushMatrix(); if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD) { - F32 zoom = gAgent.mHUDCurZoom; + F32 zoom = gAgentCamera.mHUDCurZoom; glScalef(zoom, zoom, zoom); } @@ -227,11 +228,11 @@ void LLManipScale::render() if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD) { mBoxHandleSize = BOX_HANDLE_BASE_SIZE * BOX_HANDLE_BASE_FACTOR / (F32) LLViewerCamera::getInstance()->getViewHeightInPixels(); - mBoxHandleSize /= gAgent.mHUDCurZoom; + mBoxHandleSize /= gAgentCamera.mHUDCurZoom; } else { - range = dist_vec(gAgent.getCameraPositionAgent(), center_agent); + range = dist_vec(gAgentCamera.getCameraPositionAgent(), center_agent); range_from_agent = dist_vec(gAgent.getPositionAgent(), center_agent); // Don't draw manip if object too far away @@ -438,7 +439,7 @@ void LLManipScale::highlightManipulators(S32 x, S32 y) LLMatrix4 cfr(OGL_TO_CFR_ROTATION); transform *= cfr; LLMatrix4 window_scale; - F32 zoom_level = 2.f * gAgent.mHUDCurZoom; + F32 zoom_level = 2.f * gAgentCamera.mHUDCurZoom; window_scale.initAll(LLVector3(zoom_level / LLViewerCamera::getInstance()->getAspect(), zoom_level, 0.f), LLQuaternion::DEFAULT, LLVector3::zero); @@ -635,7 +636,7 @@ void LLManipScale::renderFaces( const LLBBox& bbox ) } // Find nearest vertex - LLVector3 orientWRTHead = bbox.agentToLocalBasis( bbox.getCenterAgent() - gAgent.getCameraPositionAgent() ); + LLVector3 orientWRTHead = bbox.agentToLocalBasis( bbox.getCenterAgent() - gAgentCamera.getCameraPositionAgent() ); U32 nearest = (orientWRTHead.mV[0] < 0.0f ? 1 : 0) + (orientWRTHead.mV[1] < 0.0f ? 2 : 0) + @@ -825,7 +826,7 @@ void LLManipScale::drag( S32 x, S32 y ) } LLSelectMgr::getInstance()->updateSelectionCenter(); - gAgent.clearFocusObject(); + gAgentCamera.clearFocusObject(); } // Scale around the @@ -1364,7 +1365,7 @@ void LLManipScale::updateSnapGuides(const LLBBox& bbox) if(mObjectSelection->getSelectType() == SELECT_TYPE_HUD) { - mSnapRegimeOffset = SNAP_GUIDE_SCREEN_OFFSET / gAgent.mHUDCurZoom; + mSnapRegimeOffset = SNAP_GUIDE_SCREEN_OFFSET / gAgentCamera.mHUDCurZoom; } else @@ -1377,7 +1378,7 @@ void LLManipScale::updateSnapGuides(const LLBBox& bbox) if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD) { cam_at_axis.setVec(1.f, 0.f, 0.f); - snap_guide_length = SNAP_GUIDE_SCREEN_LENGTH / gAgent.mHUDCurZoom; + snap_guide_length = SNAP_GUIDE_SCREEN_LENGTH / gAgentCamera.mHUDCurZoom; } else { diff --git a/indra/newview/llmaniptranslate.cpp b/indra/newview/llmaniptranslate.cpp index 52fe31fbba..5f0c5e1795 100644 --- a/indra/newview/llmaniptranslate.cpp +++ b/indra/newview/llmaniptranslate.cpp @@ -42,6 +42,7 @@ #include "llrender.h" #include "llagent.h" +#include "llagentcamera.h" #include "llbbox.h" #include "llbox.h" #include "llviewercontrol.h" @@ -437,12 +438,12 @@ BOOL LLManipTranslate::handleHover(S32 x, S32 y, MASK mask) { if (x < ROTATE_H_MARGIN) { - gAgent.cameraOrbitAround(rotate_angle); + gAgentCamera.cameraOrbitAround(rotate_angle); rotated = TRUE; } else if (x > world_rect.getWidth() - ROTATE_H_MARGIN) { - gAgent.cameraOrbitAround(-rotate_angle); + gAgentCamera.cameraOrbitAround(-rotate_angle); rotated = TRUE; } } @@ -713,7 +714,7 @@ BOOL LLManipTranslate::handleHover(S32 x, S32 y, MASK mask) // in position changes even when the mouse moves object->setPosition(new_position_local); rebuild(object); - gAgent.getAvatarObject()->clampAttachmentPositions(); + gAgentAvatarp->clampAttachmentPositions(); new_position_local = object->getPosition(); if (selectNode->mIndividualSelection) @@ -789,7 +790,7 @@ BOOL LLManipTranslate::handleHover(S32 x, S32 y, MASK mask) } LLSelectMgr::getInstance()->updateSelectionCenter(); - gAgent.clearFocusObject(); + gAgentCamera.clearFocusObject(); dialog_refresh_all(); // ??? is this necessary? lldebugst(LLERR_USER_INPUT) << "hover handled by LLManipTranslate (active)" << llendl; @@ -830,7 +831,7 @@ void LLManipTranslate::highlightManipulators(S32 x, S32 y) LLMatrix4 cfr(OGL_TO_CFR_ROTATION); transform *= cfr; LLMatrix4 window_scale; - F32 zoom_level = 2.f * gAgent.mHUDCurZoom; + F32 zoom_level = 2.f * gAgentCamera.mHUDCurZoom; window_scale.initAll(LLVector3(zoom_level / LLViewerCamera::getInstance()->getAspect(), zoom_level, 0.f), LLQuaternion::DEFAULT, LLVector3::zero); @@ -1075,7 +1076,7 @@ void LLManipTranslate::render() gGL.pushMatrix(); if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD) { - F32 zoom = gAgent.mHUDCurZoom; + F32 zoom = gAgentCamera.mHUDCurZoom; glScalef(zoom, zoom, zoom); } { @@ -1239,7 +1240,7 @@ void LLManipTranslate::renderSnapGuides() if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD) { - guide_size_meters = 1.f / gAgent.mHUDCurZoom; + guide_size_meters = 1.f / gAgentCamera.mHUDCurZoom; mSnapOffsetMeters = mArrowLengthMeters * 1.5f; } else @@ -1822,11 +1823,11 @@ void LLManipTranslate::renderTranslationHandles() if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD) { mArrowLengthMeters = mAxisArrowLength / gViewerWindow->getWorldViewHeightRaw(); - mArrowLengthMeters /= gAgent.mHUDCurZoom; + mArrowLengthMeters /= gAgentCamera.mHUDCurZoom; } else { - LLVector3 camera_pos_agent = gAgent.getCameraPositionAgent(); + LLVector3 camera_pos_agent = gAgentCamera.getCameraPositionAgent(); F32 range = dist_vec(camera_pos_agent, selection_center); F32 range_from_agent = dist_vec(gAgent.getPositionAgent(), selection_center); @@ -2108,7 +2109,7 @@ void LLManipTranslate::renderTranslationHandles() // Copied from LLDrawable::updateGeometry LLVector3 pos_agent = first_object->getPositionAgent(); - LLVector3 camera_agent = gAgent.getCameraPositionAgent(); + LLVector3 camera_agent = gAgentCamera.getCameraPositionAgent(); LLVector3 headPos = pos_agent - camera_agent; LLVector3 orientWRTHead = headPos * invRotation; @@ -2150,7 +2151,7 @@ void LLManipTranslate::renderTranslationHandles() } else { - camera_axis.setVec(gAgent.getCameraPositionAgent() - first_object->getPositionAgent()); + camera_axis.setVec(gAgentCamera.getCameraPositionAgent() - first_object->getPositionAgent()); } for (U32 i = 0; i < NUM_AXES*2; i++) diff --git a/indra/newview/llmediactrl.cpp b/indra/newview/llmediactrl.cpp index 3c34d26692..7a4ed74c4c 100644 --- a/indra/newview/llmediactrl.cpp +++ b/indra/newview/llmediactrl.cpp @@ -78,10 +78,8 @@ LLMediaCtrl::LLMediaCtrl( const Params& p) : mBorder(NULL), mFrequentUpdates( true ), mForceUpdate( false ), - mOpenLinksInExternalBrowser( false ), - mOpenLinksInInternalBrowser( false ), - mTrusted( false ), mHomePageUrl( "" ), + mTrusted(false), mIgnoreUIScale( true ), mAlwaysRefresh( false ), mMediaSource( 0 ), @@ -167,22 +165,12 @@ void LLMediaCtrl::setTakeFocusOnClick( bool take_focus ) } //////////////////////////////////////////////////////////////////////////////// -// set flag that forces the embedded browser to open links in the external system browser -void LLMediaCtrl::setOpenInExternalBrowser( bool valIn ) -{ - mOpenLinksInExternalBrowser = valIn; -}; - -//////////////////////////////////////////////////////////////////////////////// -// set flag that forces the embedded browser to open links in the internal browser floater -void LLMediaCtrl::setOpenInInternalBrowser( bool valIn ) -{ - mOpenLinksInInternalBrowser = valIn; -}; - -//////////////////////////////////////////////////////////////////////////////// void LLMediaCtrl::setTrusted( bool valIn ) { + if(mMediaSource) + { + mMediaSource->setTrustedBrowser(valIn); + } mTrusted = valIn; } @@ -632,6 +620,7 @@ bool LLMediaCtrl::ensureMediaSourceExists() mMediaSource->setVisible( getVisible() ); mMediaSource->addObserver( this ); mMediaSource->setBackgroundColor( getBackgroundColor() ); + mMediaSource->setTrustedBrowser(mTrusted); if(mClearCache) { mMediaSource->clearCache(); @@ -724,14 +713,14 @@ void LLMediaCtrl::draw() LLGLSUIDefault gls_ui; LLGLDisable gls_alphaTest( GL_ALPHA_TEST ); - gGL.pushMatrix(); + gGL.pushUIMatrix(); { if (mIgnoreUIScale) { - glLoadIdentity(); + gGL.loadUIIdentity(); // font system stores true screen origin, need to scale this by UI scale factor // to get render origin for this view (with unit scale) - gGL.translatef(floorf(LLFontGL::sCurOrigin.mX * LLUI::sGLScaleFactor.mV[VX]), + gGL.translateUI(floorf(LLFontGL::sCurOrigin.mX * LLUI::sGLScaleFactor.mV[VX]), floorf(LLFontGL::sCurOrigin.mY * LLUI::sGLScaleFactor.mV[VY]), LLFontGL::sCurOrigin.mZ); } @@ -825,7 +814,7 @@ void LLMediaCtrl::draw() gGL.end(); gGL.setSceneBlendType(LLRender::BT_ALPHA); } - gGL.popMatrix(); + gGL.popUIMatrix(); } else @@ -939,14 +928,12 @@ void LLMediaCtrl::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event) case MEDIA_EVENT_CLICK_LINK_HREF: { LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_CLICK_LINK_HREF, target is \"" << self->getClickTarget() << "\", uri is " << self->getClickURL() << LL_ENDL; - onClickLinkHref(self); }; break; case MEDIA_EVENT_CLICK_LINK_NOFOLLOW: { LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_CLICK_LINK_NOFOLLOW, uri is " << self->getClickURL() << LL_ENDL; - onClickLinkNoFollow(self); }; break; @@ -975,100 +962,6 @@ void LLMediaCtrl::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event) //////////////////////////////////////////////////////////////////////////////// // -void LLMediaCtrl::onClickLinkHref( LLPluginClassMedia* self ) -{ - // retrieve the event parameters - std::string url = self->getClickURL(); - U32 target_type = self->getClickTargetType(); - - // is there is a target specified for the link? - if (gSavedSettings.getBOOL("UseExternalBrowser") || target_type == LLPluginClassMedia::TARGET_EXTERNAL) - { - LLSD payload; - payload["url"] = url; - payload["target_type"] = LLSD::Integer(target_type); - LLNotificationsUtil::add( "WebLaunchExternalTarget", LLSD(), payload, onClickLinkExternalTarget); - } - else if (target_type == LLPluginClassMedia::TARGET_BLANK) - { - clickLinkWithTarget(url, target_type); - } - else { - const std::string protocol1( "http://" ); - const std::string protocol2( "https://" ); - if( mOpenLinksInExternalBrowser ) - { - if ( !url.empty() ) - { - if ( LLStringUtil::compareInsensitive( url.substr( 0, protocol1.length() ), protocol1 ) == 0 || - LLStringUtil::compareInsensitive( url.substr( 0, protocol2.length() ), protocol2 ) == 0 ) - { - LLWeb::loadURLExternal( url ); - } - } - } - else - if( mOpenLinksInInternalBrowser ) - { - if ( !url.empty() ) - { - if ( LLStringUtil::compareInsensitive( url.substr( 0, protocol1.length() ), protocol1 ) == 0 || - LLStringUtil::compareInsensitive( url.substr( 0, protocol2.length() ), protocol2 ) == 0 ) - { - llwarns << "Dead, unimplemented path that we used to send to the built-in browser long ago." << llendl; - } - } - } - } -} - -//////////////////////////////////////////////////////////////////////////////// -// static -bool LLMediaCtrl::onClickLinkExternalTarget(const LLSD& notification, const LLSD& response ) -{ - S32 option = LLNotificationsUtil::getSelectedOption(notification, response); - if ( 0 == option ) - { - LLSD payload = notification["payload"]; - std::string url = payload["url"].asString(); - S32 target_type = payload["target_type"].asInteger(); - clickLinkWithTarget(url, target_type); - } - return false; -} - - -//////////////////////////////////////////////////////////////////////////////// -// static -void LLMediaCtrl::clickLinkWithTarget(const std::string& url, const S32& target_type ) -{ - if (gSavedSettings.getBOOL("UseExternalBrowser") || target_type == LLPluginClassMedia::TARGET_EXTERNAL) - { - // load target in an external browser - LLWeb::loadURLExternal(url); - } - else if (target_type == LLPluginClassMedia::TARGET_BLANK) - { - // load target in the user's preferred browser - LLWeb::loadURL(url); - } - else { - // unsupported link target - shouldn't happen - LL_WARNS("LinkTarget") << "Unsupported link target type" << LL_ENDL; - } -} - -//////////////////////////////////////////////////////////////////////////////// -// -void LLMediaCtrl::onClickLinkNoFollow( LLPluginClassMedia* self ) -{ - // let the dispatcher handle blocking/throttling of SLURLs - std::string url = self->getClickURL(); - LLURLDispatcher::dispatch(url, this, mTrusted); -} - -//////////////////////////////////////////////////////////////////////////////// -// std::string LLMediaCtrl::getCurrentNavUrl() { return mCurrentNavUrl; diff --git a/indra/newview/llmediactrl.h b/indra/newview/llmediactrl.h index 60e0c4073b..310492fe02 100644 --- a/indra/newview/llmediactrl.h +++ b/indra/newview/llmediactrl.h @@ -99,8 +99,6 @@ public: void navigateToLocalPage( const std::string& subdir, const std::string& filename_in ); bool canNavigateBack(); bool canNavigateForward(); - void setOpenInExternalBrowser( bool valIn ); - void setOpenInInternalBrowser( bool valIn ); std::string getCurrentNavUrl(); // By default, we do not handle "secondlife:///app/" SLURLs, because @@ -162,25 +160,17 @@ public: // Incoming media event dispatcher virtual void handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event); - // handlers for individual events (could be done inside the switch in handleMediaEvent, they're just individual functions for clarity) - void onClickLinkHref( LLPluginClassMedia* self ); - void onClickLinkNoFollow( LLPluginClassMedia* self ); - protected: void convertInputCoords(S32& x, S32& y); private: void onVisibilityChange ( const LLSD& new_visibility ); - static bool onClickLinkExternalTarget( const LLSD&, const LLSD& ); - static void clickLinkWithTarget(const std::string& url, const S32& target_type ); const S32 mTextureDepthBytes; LLUUID mMediaTextureID; LLViewBorder* mBorder; bool mFrequentUpdates; bool mForceUpdate; - bool mOpenLinksInExternalBrowser; - bool mOpenLinksInInternalBrowser; bool mTrusted; std::string mHomePageUrl; std::string mCurrentNavUrl; diff --git a/indra/newview/llmediadataclient.h b/indra/newview/llmediadataclient.h index 75d32e707b..8dd72cb595 100755 --- a/indra/newview/llmediadataclient.h +++ b/indra/newview/llmediadataclient.h @@ -37,7 +37,7 @@ #include <queue> #include "llrefcount.h" #include "llpointer.h" -#include "lltimer.h" +#include "lleventtimer.h" // Link seam for LLVOVolume diff --git a/indra/newview/llmenucommands.cpp b/indra/newview/llmenucommands.cpp index 8d950f072d..e6ca0dabda 100644 --- a/indra/newview/llmenucommands.cpp +++ b/indra/newview/llmenucommands.cpp @@ -42,7 +42,7 @@ #include "llstring.h" #include "message.h" -#include "llagent.h" +#include "llagentcamera.h" #include "llcallingcard.h" #include "llviewercontrol.h" //#include "llfirstuse.h" @@ -66,7 +66,7 @@ void handle_mouselook(void*) { - gAgent.changeCameraToMouselook(); + gAgentCamera.changeCameraToMouselook(); } diff --git a/indra/newview/llmimetypes.cpp b/indra/newview/llmimetypes.cpp index 235487cf46..7bddc0d84c 100644 --- a/indra/newview/llmimetypes.cpp +++ b/indra/newview/llmimetypes.cpp @@ -34,6 +34,7 @@ #include "llviewerprecompiledheaders.h" #include "llmimetypes.h" +#include "lltrans.h" #include "llxmlnode.h" #include "lluictrlfactory.h" @@ -49,6 +50,7 @@ std::string sDefaultImpl; // Returned when we don't know what impl to use std::string sXMLFilename; // Squirrel away XML filename so we know how to reset +std::string DEFAULT_MIME_TYPE = "none/none"; ///////////////////////////////////////////////////////////////////////////// @@ -212,7 +214,7 @@ std::string LLMIMETypes::findIcon(const std::string& mime_type) // static std::string LLMIMETypes::findDefaultMimeType(const std::string& widget_type) { - std::string mime_type = "none/none"; + std::string mime_type = getDefaultMimeType(); mime_widget_set_map_t::iterator it = sWidgetMap.find(widget_type); if(it != sWidgetMap.end()) { @@ -222,6 +224,18 @@ std::string LLMIMETypes::findDefaultMimeType(const std::string& widget_type) } // static +const std::string& LLMIMETypes::getDefaultMimeType() +{ + return DEFAULT_MIME_TYPE; +} + +const std::string& LLMIMETypes::getDefaultMimeTypeTranslation() +{ + static std::string mime_type = LLTrans::getString("DefaultMimeType"); + return mime_type; +} + +// static std::string LLMIMETypes::findToolTip(const std::string& mime_type) { std::string tool_tip = ""; diff --git a/indra/newview/llmimetypes.h b/indra/newview/llmimetypes.h index b217ce7a81..3461769ff3 100644 --- a/indra/newview/llmimetypes.h +++ b/indra/newview/llmimetypes.h @@ -66,6 +66,10 @@ public: static std::string findDefaultMimeType(const std::string& widget_type); // Canonical mime type associated with this widget set + static const std::string& getDefaultMimeType(); + + static const std::string& getDefaultMimeTypeTranslation(); + static bool findAllowResize(const std::string& mime_type); // accessor for flag to enable/disable media size edit fields diff --git a/indra/newview/llmorphview.cpp b/indra/newview/llmorphview.cpp index b95e8bd3a2..4c28e98e62 100644 --- a/indra/newview/llmorphview.cpp +++ b/indra/newview/llmorphview.cpp @@ -37,11 +37,11 @@ #include "lljoint.h" #include "llagent.h" +#include "llagentcamera.h" #include "lldrawable.h" #include "lldrawpoolavatar.h" #include "llface.h" //#include "llfirstuse.h" -#include "llfloatercustomize.h" #include "llfloatertools.h" #include "llresmgr.h" #include "lltoolmgr.h" @@ -88,15 +88,14 @@ void LLMorphView::initialize() mCameraYaw = 0.f; mCameraDist = -1.f; - LLVOAvatar *avatarp = gAgent.getAvatarObject(); - if (!avatarp || avatarp->isDead()) + if (!isAgentAvatarValid() || gAgentAvatarp->isDead()) { - gAgent.changeCameraToDefault(); + gAgentCamera.changeCameraToDefault(); return; } - avatarp->stopMotion( ANIM_AGENT_BODY_NOISE ); - avatarp->mSpecialRenderMode = 3; + gAgentAvatarp->stopMotion( ANIM_AGENT_BODY_NOISE ); + gAgentAvatarp->mSpecialRenderMode = 3; // set up camera for close look at avatar mOldCameraNearClip = LLViewerCamera::getInstance()->getNear(); @@ -110,11 +109,10 @@ void LLMorphView::shutdown() { LLVOAvatarSelf::onCustomizeEnd(); - LLVOAvatar *avatarp = gAgent.getAvatarObject(); - if(avatarp && !avatarp->isDead()) + if (isAgentAvatarValid()) { - avatarp->startMotion( ANIM_AGENT_BODY_NOISE ); - avatarp->mSpecialRenderMode = 0; + gAgentAvatarp->startMotion( ANIM_AGENT_BODY_NOISE ); + gAgentAvatarp->mSpecialRenderMode = 0; // reset camera LLViewerCamera::getInstance()->setNear(mOldCameraNearClip); } @@ -132,14 +130,7 @@ void LLMorphView::setVisible(BOOL visible) if (visible) { - llassert( !gFloaterCustomize ); - gFloaterCustomize = new LLFloaterCustomize(); - gFloaterCustomize->fetchInventory(); - gFloaterCustomize->openFloater(); - - // Must do this _after_ gFloaterView is initialized. - gFloaterCustomize->switchToDefaultSubpart(); - + // TODO: verify some user action has already opened outfit editor? - Nyx initialize(); // First run dialog @@ -147,13 +138,7 @@ void LLMorphView::setVisible(BOOL visible) } else { - if( gFloaterCustomize ) - { - gFloaterView->removeChild( gFloaterCustomize ); - delete gFloaterCustomize; - gFloaterCustomize = NULL; - } - + // TODO: verify some user action has already closed outfit editor ? - Nyx shutdown(); } } @@ -163,15 +148,11 @@ void LLMorphView::updateCamera() { if (!mCameraTargetJoint) { - setCameraTargetJoint(gAgent.getAvatarObject()->getJoint("mHead")); - } - - LLVOAvatar* avatar = gAgent.getAvatarObject(); - if( !avatar ) - { - return; - } - LLJoint* root_joint = avatar->getRootJoint(); + setCameraTargetJoint(gAgentAvatarp->getJoint("mHead")); + } + if (!isAgentAvatarValid()) return; + + LLJoint* root_joint = gAgentAvatarp->getRootJoint(); if( !root_joint ) { return; @@ -187,7 +168,7 @@ void LLMorphView::updateCamera() LLVector3d camera_pos = joint_pos + mCameraOffset * camera_rot_pitch * camera_rot_yaw * avatar_rot; - gAgent.setCameraPosAndFocusGlobal( camera_pos, target_pos, gAgent.getID() ); + gAgentCamera.setCameraPosAndFocusGlobal( camera_pos, target_pos, gAgent.getID() ); } void LLMorphView::setCameraDrivenByKeys(BOOL b) diff --git a/indra/newview/llmoveview.cpp b/indra/newview/llmoveview.cpp index 4bf2bac649..afca9daa67 100644 --- a/indra/newview/llmoveview.cpp +++ b/indra/newview/llmoveview.cpp @@ -41,7 +41,8 @@ // Viewer includes #include "llagent.h" -#include "llvoavatarself.h" // to check gAgent.getAvatarObject()->isSitting() +#include "llagentcamera.h" +#include "llvoavatarself.h" // to check gAgentAvatarp->isSitting() #include "llbottomtray.h" #include "llbutton.h" #include "llfloaterreg.h" @@ -77,7 +78,6 @@ LLFloaterMove::LLFloaterMove(const LLSD& key) mTurnRightButton(NULL), mMoveUpButton(NULL), mMoveDownButton(NULL), - mStopFlyingButton(NULL), mModeActionsPanel(NULL), mCurrentMode(MM_WALK) { @@ -87,15 +87,24 @@ LLFloaterMove::LLFloaterMove(const LLSD& key) BOOL LLFloaterMove::postBuild() { setIsChrome(TRUE); + setTitleVisible(TRUE); // restore title visibility after chrome applying LLDockableFloater::postBuild(); + // Code that implements floater buttons toggling when user moves via keyboard is located in LLAgent::propagate() + mForwardButton = getChild<LLJoystickAgentTurn>("forward btn"); mForwardButton->setHeldDownDelay(MOVE_BUTTON_DELAY); mBackwardButton = getChild<LLJoystickAgentTurn>("backward btn"); mBackwardButton->setHeldDownDelay(MOVE_BUTTON_DELAY); + mSlideLeftButton = getChild<LLJoystickAgentSlide>("move left btn"); + mSlideLeftButton->setHeldDownDelay(MOVE_BUTTON_DELAY); + + mSlideRightButton = getChild<LLJoystickAgentSlide>("move right btn"); + mSlideRightButton->setHeldDownDelay(MOVE_BUTTON_DELAY); + mTurnLeftButton = getChild<LLButton>("turn left btn"); mTurnLeftButton->setHeldDownDelay(MOVE_BUTTON_DELAY); mTurnLeftButton->setHeldDownCallback(boost::bind(&LLFloaterMove::turnLeft, this)); @@ -112,8 +121,6 @@ BOOL LLFloaterMove::postBuild() mMoveDownButton->setHeldDownCallback(boost::bind(&LLFloaterMove::moveDown, this)); - mStopFlyingButton = getChild<LLButton>("stop_fly_btn"); - mModeActionsPanel = getChild<LLPanel>("panel_modes"); LLButton* btn; @@ -126,13 +133,6 @@ BOOL LLFloaterMove::postBuild() btn = getChild<LLButton>("mode_fly_btn"); btn->setCommitCallback(boost::bind(&LLFloaterMove::onFlyButtonClick, this)); - btn = getChild<LLButton>("stop_fly_btn"); - btn->setCommitCallback(boost::bind(&LLFloaterMove::onStopFlyingButtonClick, this)); - - - - showFlyControls(false); - initModeTooltips(); initModeButtonMap(); @@ -206,7 +206,12 @@ void LLFloaterMove::setFlyingMode(BOOL fly) if (instance) { instance->setFlyingModeImpl(fly); - instance->showModeButtons(!fly); + LLVOAvatarSelf* avatar_object = gAgentAvatarp; + bool is_sitting = avatar_object + && (avatar_object->getRegion() != NULL) + && (!avatar_object->isDead()) + && avatar_object->isSitting(); + instance->showModeButtons(!fly && !is_sitting); } if (fly) { @@ -250,6 +255,12 @@ void LLFloaterMove::setSittingMode(BOOL bSitting) else { LLPanelStandStopFlying::clearStandStopFlyingMode(LLPanelStandStopFlying::SSFM_STAND); + + // show "Stop Flying" button if needed. EXT-871 + if (gAgent.getFlying()) + { + LLPanelStandStopFlying::setStandStopFlyingMode(LLPanelStandStopFlying::SSFM_STOP_FLYING); + } } enableInstance(!bSitting); } @@ -298,10 +309,6 @@ void LLFloaterMove::onFlyButtonClick() { setMovementMode(MM_FLY); } -void LLFloaterMove::onStopFlyingButtonClick() -{ - setMovementMode(gAgent.getAlwaysRun() ? MM_RUN : MM_WALK); -} void LLFloaterMove::setMovementMode(const EMovementMode mode) { @@ -336,7 +343,7 @@ void LLFloaterMove::setMovementMode(const EMovementMode mode) updateButtonsWithMovementMode(mode); bool bHideModeButtons = MM_FLY == mode - || (gAgent.getAvatarObject() && gAgent.getAvatarObject()->isSitting()); + || (isAgentAvatarValid() && gAgentAvatarp->isSitting()); showModeButtons(!bHideModeButtons); @@ -344,19 +351,9 @@ void LLFloaterMove::setMovementMode(const EMovementMode mode) void LLFloaterMove::updateButtonsWithMovementMode(const EMovementMode newMode) { - showFlyControls(MM_FLY == newMode); setModeTooltip(newMode); setModeButtonToggleState(newMode); -} - -void LLFloaterMove::showFlyControls(bool bShow) -{ - mMoveUpButton->setVisible(bShow); - mMoveDownButton->setVisible(bShow); - - // *TODO: mantipov: mStopFlyingButton from the FloaterMove is not used now. - // It was not completly removed until functionality is reviewed by LL - mStopFlyingButton->setVisible(FALSE); + setModeTitle(newMode); } void LLFloaterMove::initModeTooltips() @@ -364,16 +361,28 @@ void LLFloaterMove::initModeTooltips() control_tooltip_map_t walkTipMap; walkTipMap.insert(std::make_pair(mForwardButton, getString("walk_forward_tooltip"))); walkTipMap.insert(std::make_pair(mBackwardButton, getString("walk_back_tooltip"))); + walkTipMap.insert(std::make_pair(mSlideLeftButton, getString("walk_left_tooltip"))); + walkTipMap.insert(std::make_pair(mSlideRightButton, getString("walk_right_tooltip"))); + walkTipMap.insert(std::make_pair(mMoveUpButton, getString("jump_tooltip"))); + walkTipMap.insert(std::make_pair(mMoveDownButton, getString("crouch_tooltip"))); mModeControlTooltipsMap[MM_WALK] = walkTipMap; control_tooltip_map_t runTipMap; runTipMap.insert(std::make_pair(mForwardButton, getString("run_forward_tooltip"))); runTipMap.insert(std::make_pair(mBackwardButton, getString("run_back_tooltip"))); + runTipMap.insert(std::make_pair(mSlideLeftButton, getString("run_left_tooltip"))); + runTipMap.insert(std::make_pair(mSlideRightButton, getString("run_right_tooltip"))); + runTipMap.insert(std::make_pair(mMoveUpButton, getString("jump_tooltip"))); + runTipMap.insert(std::make_pair(mMoveDownButton, getString("crouch_tooltip"))); mModeControlTooltipsMap[MM_RUN] = runTipMap; control_tooltip_map_t flyTipMap; flyTipMap.insert(std::make_pair(mForwardButton, getString("fly_forward_tooltip"))); flyTipMap.insert(std::make_pair(mBackwardButton, getString("fly_back_tooltip"))); + flyTipMap.insert(std::make_pair(mSlideLeftButton, getString("fly_left_tooltip"))); + flyTipMap.insert(std::make_pair(mSlideRightButton, getString("fly_right_tooltip"))); + flyTipMap.insert(std::make_pair(mMoveUpButton, getString("fly_up_tooltip"))); + flyTipMap.insert(std::make_pair(mMoveDownButton, getString("fly_down_tooltip"))); mModeControlTooltipsMap[MM_FLY] = flyTipMap; setModeTooltip(MM_WALK); @@ -395,9 +404,9 @@ void LLFloaterMove::initMovementMode() } setMovementMode(initMovementMode); - if (gAgent.getAvatarObject()) + if (isAgentAvatarValid()) { - setEnabled(!gAgent.getAvatarObject()->isSitting()); + setEnabled(!gAgentAvatarp->isSitting()); } } @@ -414,11 +423,30 @@ void LLFloaterMove::setModeTooltip(const EMovementMode mode) } } +void LLFloaterMove::setModeTitle(const EMovementMode mode) +{ + std::string title; + switch(mode) + { + case MM_WALK: + title = getString("walk_title"); + break; + case MM_RUN: + title = getString("run_title"); + break; + case MM_FLY: + title = getString("fly_title"); + break; + default: + // title should be provided for all modes + llassert(false); + break; + } + setTitle(title); +} + /** * Updates position of the floater to be center aligned with Move button. - * - * Because Tip floater created as dependent floater this method - * must be called before "showQuickTips()" to get Tip floater be positioned at the right side of the floater */ void LLFloaterMove::updatePosition() { @@ -479,7 +507,7 @@ void LLFloaterMove::onOpen(const LLSD& key) showModeButtons(FALSE); } - if (gAgent.getAvatarObject() && gAgent.getAvatarObject()->isSitting()) + if (isAgentAvatarValid() && gAgentAvatarp->isSitting()) { setSittingMode(TRUE); showModeButtons(FALSE); @@ -582,7 +610,7 @@ BOOL LLPanelStandStopFlying::postBuild() void LLPanelStandStopFlying::setVisible(BOOL visible) { //we dont need to show the panel if these buttons are not activated - if (gAgent.getCameraMode() == CAMERA_MODE_MOUSELOOK) visible = false; + if (gAgentCamera.getCameraMode() == CAMERA_MODE_MOUSELOOK) visible = false; if (visible) { @@ -684,10 +712,7 @@ void LLPanelStandStopFlying::onStandButtonClick() gAgent.setControlFlags(AGENT_CONTROL_STAND_UP); setFocus(FALSE); // EXT-482 - - BOOL fly = gAgent.getFlying(); - mStopFlyingButton->setVisible(fly); - setVisible(fly); + mStandButton->setVisible(FALSE); // force visibility changing to avoid seeing Stand & Move buttons at once. } void LLPanelStandStopFlying::onStopFlyingButtonClick() diff --git a/indra/newview/llmoveview.h b/indra/newview/llmoveview.h index 06463f02af..fcf643f050 100644 --- a/indra/newview/llmoveview.h +++ b/indra/newview/llmoveview.h @@ -86,13 +86,11 @@ private: void onWalkButtonClick(); void onRunButtonClick(); void onFlyButtonClick(); - void onStopFlyingButtonClick(); void initMovementMode(); void setMovementMode(const EMovementMode mode); - void showFlyControls(bool bShow); void initModeTooltips(); void setModeTooltip(const EMovementMode mode); - void showQuickTips(const EMovementMode mode); + void setModeTitle(const EMovementMode mode); void initModeButtonMap(); void setModeButtonToggleState(const EMovementMode mode); void updateButtonsWithMovementMode(const EMovementMode newMode); @@ -103,12 +101,13 @@ public: LLJoystickAgentTurn* mForwardButton; LLJoystickAgentTurn* mBackwardButton; + LLJoystickAgentSlide* mSlideLeftButton; + LLJoystickAgentSlide* mSlideRightButton; LLButton* mTurnLeftButton; LLButton* mTurnRightButton; LLButton* mMoveUpButton; LLButton* mMoveDownButton; private: - LLButton* mStopFlyingButton; LLPanel* mModeActionsPanel; typedef std::map<LLView*, std::string> control_tooltip_map_t; diff --git a/indra/newview/llmutelist.cpp b/indra/newview/llmutelist.cpp index 2d3c4b187e..7cb192e026 100644 --- a/indra/newview/llmutelist.cpp +++ b/indra/newview/llmutelist.cpp @@ -128,68 +128,29 @@ LLMute::LLMute(const LLUUID& id, const std::string& name, EType type, U32 flags) } -std::string LLMute::getDisplayName() const +std::string LLMute::getDisplayType() const { - std::string name_with_suffix = mName; switch (mType) { case BY_NAME: default: - name_with_suffix += " " + LLTrans::getString("MuteByName"); + return LLTrans::getString("MuteByName"); break; case AGENT: - name_with_suffix += " " + LLTrans::getString("MuteAgent"); + return LLTrans::getString("MuteAgent"); break; case OBJECT: - name_with_suffix += " " + LLTrans::getString("MuteObject"); + return LLTrans::getString("MuteObject"); break; case GROUP: - name_with_suffix += " " + LLTrans::getString("MuteGroup"); + return LLTrans::getString("MuteGroup"); + break; + case EXTERNAL: + return LLTrans::getString("MuteExternal"); break; } - return name_with_suffix; } -void LLMute::setFromDisplayName(const std::string& display_name) -{ - size_t pos = 0; - mName = display_name; - - pos = mName.rfind(" " + LLTrans::getString("MuteGroup")); - if (pos != std::string::npos) - { - mName.erase(pos); - mType = GROUP; - return; - } - - pos = mName.rfind(" " + LLTrans::getString("MuteObject")); - if (pos != std::string::npos) - { - mName.erase(pos); - mType = OBJECT; - return; - } - - pos = mName.rfind(" " + LLTrans::getString("MuteAgent")); - if (pos != std::string::npos) - { - mName.erase(pos); - mType = AGENT; - return; - } - - pos = mName.rfind(" " + LLTrans::getString("MuteByName")); - if (pos != std::string::npos) - { - mName.erase(pos); - mType = BY_NAME; - return; - } - - llwarns << "Unable to set mute from display name " << display_name << llendl; - return; -} /* static */ LLMuteList* LLMuteList::getInstance() @@ -345,6 +306,12 @@ BOOL LLMuteList::add(const LLMute& mute, U32 flags) void LLMuteList::updateAdd(const LLMute& mute) { + // External mutes (e.g. Avaline callers) are local only, don't send them to the server. + if (mute.mType == LLMute::EXTERNAL) + { + return; + } + // Update the database LLMessageSystem* msg = gMessageSystem; msg->newMessageFast(_PREHASH_UpdateMuteListEntry); @@ -432,6 +399,12 @@ BOOL LLMuteList::remove(const LLMute& mute, U32 flags) void LLMuteList::updateRemove(const LLMute& mute) { + // External mutes are not sent to the server anyway, no need to remove them. + if (mute.mType == LLMute::EXTERNAL) + { + return; + } + LLMessageSystem* msg = gMessageSystem; msg->newMessageFast(_PREHASH_RemoveMuteListEntry); msg->nextBlockFast(_PREHASH_AgentData); @@ -615,9 +588,14 @@ BOOL LLMuteList::saveToFile(const std::string& filename) it != mMutes.end(); ++it) { - it->mID.toString(id_string); - const std::string& name = it->mName; - fprintf(fp, "%d %s %s|%u\n", (S32)it->mType, id_string.c_str(), name.c_str(), it->mFlags); + // Don't save external mutes as they are not sent to the server and probably won't + //be valid next time anyway. + if (it->mType != LLMute::EXTERNAL) + { + it->mID.toString(id_string); + const std::string& name = it->mName; + fprintf(fp, "%d %s %s|%u\n", (S32)it->mType, id_string.c_str(), name.c_str(), it->mFlags); + } } fclose(fp); return TRUE; diff --git a/indra/newview/llmutelist.h b/indra/newview/llmutelist.h index e1e81a24b4..79b556bdbb 100644 --- a/indra/newview/llmutelist.h +++ b/indra/newview/llmutelist.h @@ -45,7 +45,8 @@ class LLMute { public: // Legacy mutes are BY_NAME and have null UUID. - enum EType { BY_NAME = 0, AGENT = 1, OBJECT = 2, GROUP = 3, COUNT = 4 }; + // EXTERNAL mutes are only processed through an external system (e.g. Voice) and not stored. + enum EType { BY_NAME = 0, AGENT = 1, OBJECT = 2, GROUP = 3, EXTERNAL = 4, COUNT = 5 }; // Bits in the mute flags. For backwards compatibility (since any mute list entries that were created before the flags existed // will have a flags field of 0), some of the flags are "inverted". @@ -63,14 +64,8 @@ public: LLMute(const LLUUID& id, const std::string& name = std::string(), EType type = BY_NAME, U32 flags = 0); - // Returns name + suffix based on type - // For example: "James Tester (resident)" - std::string getDisplayName() const; - - // Converts a UI name into just the agent or object name - // For example: "James Tester (resident)" sets the name to "James Tester" - // and the type to AGENT. - void setFromDisplayName(const std::string& display_name); + // Returns localized type name of muted item + std::string getDisplayType() const; public: LLUUID mID; // agent or object id diff --git a/indra/newview/llnamelistctrl.cpp b/indra/newview/llnamelistctrl.cpp index d579058c32..d09f729943 100644 --- a/indra/newview/llnamelistctrl.cpp +++ b/indra/newview/llnamelistctrl.cpp @@ -47,6 +47,8 @@ static LLDefaultChildRegistry::Register<LLNameListCtrl> r("name_list"); +static const S32 info_icon_size = 16; + void LLNameListCtrl::NameTypeNames::declareValues() { declare("INDIVIDUAL", LLNameListCtrl::INDIVIDUAL); @@ -70,7 +72,7 @@ LLNameListCtrl::LLNameListCtrl(const LLNameListCtrl::Params& p) // public void LLNameListCtrl::addNameItem(const LLUUID& agent_id, EAddPosition pos, - BOOL enabled, std::string& suffix) + BOOL enabled, const std::string& suffix) { //llinfos << "LLNameListCtrl::addNameItem " << agent_id << llendl; @@ -79,7 +81,7 @@ void LLNameListCtrl::addNameItem(const LLUUID& agent_id, EAddPosition pos, item.enabled = enabled; item.target = INDIVIDUAL; - addNameItemRow(item, pos); + addNameItemRow(item, pos, suffix); } // virtual, public @@ -138,6 +140,44 @@ void LLNameListCtrl::showInspector(const LLUUID& avatar_id, bool is_group) LLFloaterReg::showInstance("inspect_avatar", LLSD().with("avatar_id", avatar_id)); } +void LLNameListCtrl::mouseOverHighlightNthItem( S32 target_index ) +{ + S32 cur_index = getHighlightedItemInx(); + if (cur_index != target_index) + { + if(0 <= cur_index && cur_index < (S32)getItemList().size()) + { + LLScrollListItem* item = getItemList()[cur_index]; + if (item) + { + LLScrollListText* cell = dynamic_cast<LLScrollListText*>(item->getColumn(mNameColumnIndex)); + if (cell) + cell->setTextWidth(cell->getTextWidth() + info_icon_size); + } + else + { + llwarns << "highlighted name list item is NULL" << llendl; + } + } + if(target_index != -1) + { + LLScrollListItem* item = getItemList()[target_index]; + LLScrollListText* cell = dynamic_cast<LLScrollListText*>(item->getColumn(mNameColumnIndex)); + if (item) + { + if (cell) + cell->setTextWidth(cell->getTextWidth() - info_icon_size); + } + else + { + llwarns << "target name item is NULL" << llendl; + } + } + } + + LLScrollListCtrl::mouseOverHighlightNthItem(target_index); +} + //virtual BOOL LLNameListCtrl::handleToolTip(S32 x, S32 y, MASK mask) { @@ -164,7 +204,7 @@ BOOL LLNameListCtrl::handleToolTip(S32 x, S32 y, MASK mask) // Spawn at right side of cell LLPointer<LLUIImage> icon = LLUI::getUIImage("Info_Small"); - LLCoordGL pos( sticky_rect.mRight - 16, sticky_rect.mTop - (sticky_rect.getHeight() - icon->getHeight())/2 ); + LLCoordGL pos( sticky_rect.mRight - info_icon_size, sticky_rect.mTop - (sticky_rect.getHeight() - icon->getHeight())/2 ); // Should we show a group or an avatar inspector? bool is_group = hit_item->getValue()["is_group"].asBoolean(); @@ -228,7 +268,7 @@ LLScrollListItem* LLNameListCtrl::addElement(const LLSD& element, EAddPosition p LLScrollListItem* LLNameListCtrl::addNameItemRow( const LLNameListCtrl::NameItem& name_item, EAddPosition pos, - std::string& suffix) + const std::string& suffix) { LLUUID id = name_item.value().asUUID(); LLNameListItem* item = NULL; @@ -339,8 +379,7 @@ void LLNameListCtrl::refresh(const LLUUID& id, const std::string& first, LLScrollListItem* item = *iter; if (item->getUUID() == id) { - LLScrollListCell* cell = (LLScrollListCell*)item->getColumn(0); - cell = item->getColumn(mNameColumnIndex); + LLScrollListCell* cell = item->getColumn(mNameColumnIndex); if (cell) { cell->setValue(fullname); @@ -356,8 +395,9 @@ void LLNameListCtrl::refresh(const LLUUID& id, const std::string& first, void LLNameListCtrl::refreshAll(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group) { + LLInstanceTrackerScopedGuard guard; LLInstanceTracker<LLNameListCtrl>::instance_iter it; - for (it = beginInstances(); it != endInstances(); ++it) + for (it = guard.beginInstances(); it != guard.endInstances(); ++it) { LLNameListCtrl& ctrl = *it; ctrl.refresh(id, first, last, is_group); diff --git a/indra/newview/llnamelistctrl.h b/indra/newview/llnamelistctrl.h index 23b1cb6897..ee71db7540 100644 --- a/indra/newview/llnamelistctrl.h +++ b/indra/newview/llnamelistctrl.h @@ -90,11 +90,11 @@ public: // Add a user to the list by name. It will be added, the name // requested from the cache, and updated as necessary. void addNameItem(const LLUUID& agent_id, EAddPosition pos = ADD_BOTTOM, - BOOL enabled = TRUE, std::string& suffix = LLStringUtil::null); + BOOL enabled = TRUE, const std::string& suffix = LLStringUtil::null); void addNameItem(NameItem& item, EAddPosition pos = ADD_BOTTOM); /*virtual*/ LLScrollListItem* addElement(const LLSD& element, EAddPosition pos = ADD_BOTTOM, void* userdata = NULL); - LLScrollListItem* addNameItemRow(const NameItem& value, EAddPosition pos = ADD_BOTTOM, std::string& suffix = LLStringUtil::null); + LLScrollListItem* addNameItemRow(const NameItem& value, EAddPosition pos = ADD_BOTTOM, const std::string& suffix = LLStringUtil::null); // Add a user to the list by name. It will be added, the name // requested from the cache, and updated as necessary. @@ -120,6 +120,8 @@ public: void setAllowCallingCardDrop(BOOL b) { mAllowCallingCardDrop = b; } /*virtual*/ void updateColumns(); + + /*virtual*/ void mouseOverHighlightNthItem( S32 index ); private: void showInspector(const LLUUID& avatar_id, bool is_group); diff --git a/indra/newview/llnavigationbar.cpp b/indra/newview/llnavigationbar.cpp index 46cab0d868..fce666c9d4 100644 --- a/indra/newview/llnavigationbar.cpp +++ b/indra/newview/llnavigationbar.cpp @@ -48,11 +48,11 @@ #include "lllandmarkactions.h" #include "lllocationhistory.h" #include "lllocationinputctrl.h" +#include "llpaneltopinfobar.h" #include "llteleporthistory.h" #include "llsearchcombobox.h" #include "llsidetray.h" #include "llslurl.h" -#include "llurlsimstring.h" #include "llurlregistry.h" #include "llurldispatcher.h" #include "llviewerinventory.h" @@ -375,7 +375,6 @@ void LLNavigationBar::draw() if(mPurgeTPHistoryItems) { LLTeleportHistory::getInstance()->purgeItems(); - onTeleportHistoryChanged(); mPurgeTPHistoryItems = false; } @@ -449,8 +448,20 @@ void LLNavigationBar::onLocationSelection() // Will not teleport to empty location. if (typed_location.empty()) return; - + //get selected item from combobox item LLSD value = mCmbLocation->getSelectedValue(); + if(value.isUndefined() && !mCmbLocation->getTextEntry()->isDirty()) + { + // At this point we know that: there is no selected item in list and text field has NOT been changed + // So there is no sense to try to change the location + return; + } + /* since navbar list support autocompletion it contains several types of item: landmark, teleport hystory item, + * typed by user slurl or region name. Let's find out which type of item the user has selected + * to make decision about adding this location into typed history. see mSaveToLocationHistory + * Note: + * Only TYPED_REGION_SLURL item will be added into LLLocationHistory + */ if(value.has("item_type")) { @@ -480,7 +491,7 @@ void LLNavigationBar::onLocationSelection() case TELEPORT_HISTORY: //in case of teleport item was selected, teleport by position too. - case TYPED_REGION_SURL: + case TYPED_REGION_SLURL: if(value.has("global_pos")) { gAgent.teleportViaLocation(LLVector3d(value["global_pos"])); @@ -492,23 +503,38 @@ void LLNavigationBar::onLocationSelection() break; } } - //Let's parse surl or region name + //Let's parse slurl or region name std::string region_name; LLVector3 local_coords(128, 128, 0); - S32 x = 0, y = 0, z = 0; // Is the typed location a SLURL? - if (LLSLURL::isSLURL(typed_location)) + LLSLURL slurl = LLSLURL(typed_location); + if (slurl.getType() == LLSLURL::LOCATION) { - // Yes. Extract region name and local coordinates from it. - if (LLURLSimString::parse(LLSLURL::stripProtocol(typed_location), ®ion_name, &x, &y, &z)) - local_coords.set(x, y, z); - else - return; - }else + region_name = slurl.getRegion(); + local_coords = slurl.getPosition(); + } + else if(!slurl.isValid()) { - // assume that an user has typed the {region name} or possible {region_name, parcel} - region_name = typed_location.substr(0,typed_location.find(',')); + // we have to do this check after previous, because LLUrlRegistry contains handlers for slurl too + // but we need to know whether typed_location is a simple http url. + if (LLUrlRegistry::instance().isUrl(typed_location)) + { + // display http:// URLs in the media browser, or + // anything else is sent to the search floater + LLWeb::loadURL(typed_location); + return; + } + else + { + // assume that an user has typed the {region name} or possible {region_name, parcel} + region_name = typed_location.substr(0,typed_location.find(',')); + } + } + else + { + // was an app slurl, home, whatever. Bail + return; } // Resolve the region name to its global coordinates. @@ -531,7 +557,7 @@ void LLNavigationBar::onTeleportFinished(const LLVector3d& global_agent_pos) return; LLLocationHistory* lh = LLLocationHistory::getInstance(); - //TODO*: do we need convert surl into readable format? + //TODO*: do we need convert slurl into readable format? std::string location; /*NOTE: * We can't use gAgent.getPositionAgent() in case of local teleport to build location. @@ -540,10 +566,10 @@ void LLNavigationBar::onTeleportFinished(const LLVector3d& global_agent_pos) */ LLAgentUI::buildLocationString(location, LLAgentUI::LOCATION_FORMAT_NO_MATURITY, gAgent.getPosAgentFromGlobal(global_agent_pos)); - std::string tooltip (LLSLURL::buildSLURLfromPosGlobal(gAgent.getRegion()->getName(), global_agent_pos, false)); + std::string tooltip (LLSLURL(gAgent.getRegion()->getName(), global_agent_pos).getSLURLString()); LLLocationHistoryItem item (location, - global_agent_pos, tooltip,TYPED_REGION_SURL);// we can add into history only TYPED location + global_agent_pos, tooltip,TYPED_REGION_SLURL);// we can add into history only TYPED location //Touch it, if it is at list already, add new location otherwise if ( !lh->touchItem(item) ) { lh->addItem(item); @@ -621,20 +647,7 @@ void LLNavigationBar::onRegionNameResponse( // Invalid location? if (!region_handle) { - // handle any secondlife:// SLapps, or - // display http:// URLs in the media browser, or - // anything else is sent to the search floater - if (LLUrlRegistry::instance().isUrl(typed_location)) - { - if (! LLURLDispatcher::dispatchFromTextEditor(typed_location)) - { - LLWeb::loadURL(typed_location); - } - } - else - { - invokeSearch(typed_location); - } + invokeSearch(typed_location); return; } @@ -642,7 +655,7 @@ void LLNavigationBar::onRegionNameResponse( LLVector3d region_pos = from_region_handle(region_handle); LLVector3d global_pos = region_pos + (LLVector3d) local_coords; - llinfos << "Teleporting to: " << LLSLURL::buildSLURLfromPosGlobal(region_name, global_pos, false) << llendl; + llinfos << "Teleporting to: " << LLSLURL(region_name, global_pos).getSLURLString() << llendl; gAgent.teleportViaLocation(global_pos); } @@ -701,6 +714,8 @@ void LLNavigationBar::onNavigationButtonHeldUp(LLButton* nav_button) void LLNavigationBar::handleLoginComplete() { + LLTeleportHistory::getInstance()->handleLoginComplete(); + LLPanelTopInfoBar::instance().handleLoginComplete(); mCmbLocation->handleLoginComplete(); } diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp index 8fc11d3929..1beaaf3cb4 100644 --- a/indra/newview/llnearbychat.cpp +++ b/indra/newview/llnearbychat.cpp @@ -49,7 +49,6 @@ #include "llchannelmanager.h" #include "llagent.h" // gAgent -#include "llfloaterscriptdebug.h" #include "llchathistory.h" #include "llstylemap.h" @@ -107,7 +106,9 @@ BOOL LLNearbyChat::postBuild() getDockTongue(), LLDockControl::TOP, boost::bind(&LLNearbyChat::getAllowedRect, this, _1))); } - setIsChrome(true); + //fix for EXT-4621 + //chrome="true" prevents floater from stilling capture + setIsChrome(true); //chrome="true" hides floater caption if (mDragHandle) mDragHandle->setTitleVisible(TRUE); @@ -161,25 +162,6 @@ std::string appendTime() void LLNearbyChat::addMessage(const LLChat& chat,bool archive,const LLSD &args) { - if (chat.mChatType == CHAT_TYPE_DEBUG_MSG) - { - if(gSavedSettings.getBOOL("ShowScriptErrors") == FALSE) - return; - if (gSavedSettings.getS32("ShowScriptErrorsLocation")== 1)// show error in window //("ScriptErrorsAsChat")) - { - - LLColor4 txt_color; - - LLViewerChat::getChatColor(chat,txt_color); - - LLFloaterScriptDebug::addScriptLine(chat.mText, - chat.mFromName, - txt_color, - chat.mFromID); - return; - } - } - LLChat& tmp_chat = const_cast<LLChat&>(chat); if(tmp_chat.mTimeStr.empty()) @@ -207,7 +189,7 @@ void LLNearbyChat::addMessage(const LLChat& chat,bool archive,const LLSD &args) return; } - if (gSavedPerAccountSettings.getBOOL("LogChat")) + if (gSavedPerAccountSettings.getBOOL("LogNearbyChat")) { LLLogChat::saveHistory("chat", chat.mFromName, chat.mFromID, chat.mText); } @@ -278,6 +260,13 @@ void LLNearbyChat::processChatHistoryStyleUpdate(const LLSD& newvalue) nearby_chat->updateChatHistoryStyle(); } +bool isTwoWordsName(const std::string& name) +{ + //checking for a single space + S32 pos = name.find(' ', 0); + return std::string::npos != pos && name.rfind(' ', name.length()) == pos && 0 != pos && name.length()-1 != pos; +} + void LLNearbyChat::loadHistory() { LLSD do_not_log; @@ -303,6 +292,19 @@ void LLNearbyChat::loadHistory() chat.mFromID = from_id; chat.mText = msg[IM_TEXT].asString(); chat.mTimeStr = msg[IM_TIME].asString(); + chat.mChatStyle = CHAT_STYLE_HISTORY; + + chat.mSourceType = CHAT_SOURCE_AGENT; + if (from_id.isNull() && SYSTEM_FROM == from) + { + chat.mSourceType = CHAT_SOURCE_SYSTEM; + + } + else if (from_id.isNull()) + { + chat.mSourceType = isTwoWordsName(from) ? CHAT_SOURCE_UNKNOWN : CHAT_SOURCE_OBJECT; + } + addMessage(chat, true, do_not_log); it++; @@ -331,3 +333,14 @@ void LLNearbyChat::onFocusLost() LLPanel::onFocusLost(); } +BOOL LLNearbyChat::handleMouseDown(S32 x, S32 y, MASK mask) +{ + //fix for EXT-6625 + //highlight NearbyChat history whenever mouseclick happen in NearbyChat + //setting focus to eidtor will force onFocusLost() call that in its turn will change + //background opaque. This all happenn since NearByChat is "chrome" and didn't process focus change. + + if(mChatHistory) + mChatHistory->setFocus(TRUE); + return LLDockableFloater::handleMouseDown(x, y, mask); +} diff --git a/indra/newview/llnearbychat.h b/indra/newview/llnearbychat.h index 6ef2a1fee3..3c116dbe83 100644 --- a/indra/newview/llnearbychat.h +++ b/indra/newview/llnearbychat.h @@ -53,6 +53,8 @@ public: void onNearbyChatContextMenuItemClicked(const LLSD& userdata); bool onNearbyChatCheckContextMenuItem(const LLSD& userdata); + virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask); + // focus overrides /*virtual*/ void onFocusLost(); /*virtual*/ void onFocusReceived(); diff --git a/indra/newview/llnearbychatbar.cpp b/indra/newview/llnearbychatbar.cpp index ad98a29fb2..a300e15edd 100644 --- a/indra/newview/llnearbychatbar.cpp +++ b/indra/newview/llnearbychatbar.cpp @@ -34,6 +34,7 @@ #include "message.h" +#include "llappviewer.h" #include "llfloaterreg.h" #include "lltrans.h" @@ -69,6 +70,33 @@ static LLChatTypeTrigger sChatTypeTriggers[] = { { "/shout" , CHAT_TYPE_SHOUT} }; +//ext-7367 +//Problem: gesture list control (actually LLScrollListCtrl) didn't actually process mouse wheel message. +// introduce new gesture list subclass to "eat" mouse wheel messages (and probably some other messages) +class LLGestureScrollListCtrl: public LLScrollListCtrl +{ +protected: + friend class LLUICtrlFactory; + LLGestureScrollListCtrl(const LLScrollListCtrl::Params& params) + :LLScrollListCtrl(params) + { + } +public: + BOOL handleScrollWheel(S32 x, S32 y, S32 clicks) + { + LLScrollListCtrl::handleScrollWheel( x, y, clicks ); + return TRUE; + } + //See EXT-6598 + //Mouse hover over separator will result in not processing tooltip message + //So eat this message + BOOL handleToolTip(S32 x, S32 y, MASK mask) + { + LLScrollListCtrl::handleToolTip( x, y, mask ); + return TRUE; + } +}; + LLGestureComboList::Params::Params() : combo_button("combo_button"), combo_list("combo_list") @@ -79,6 +107,7 @@ LLGestureComboList::LLGestureComboList(const LLGestureComboList::Params& p) : LLUICtrl(p) , mLabel(p.label) , mViewAllItemIndex(0) + , mGetMoreItemIndex(0) { LLButton::Params button_params = p.combo_button; button_params.follows.flags(FOLLOWS_LEFT|FOLLOWS_BOTTOM|FOLLOWS_RIGHT); @@ -89,25 +118,22 @@ LLGestureComboList::LLGestureComboList(const LLGestureComboList::Params& p) addChild(mButton); - LLScrollListCtrl::Params params = p.combo_list; + LLGestureScrollListCtrl::Params params(p.combo_list); + params.name("GestureComboList"); params.commit_callback.function(boost::bind(&LLGestureComboList::onItemSelected, this, _2)); params.visible(false); params.commit_on_keyboard_movement(false); - mList = LLUICtrlFactory::create<LLScrollListCtrl>(params); - - // *HACK: adding list as a child to FloaterViewHolder to make it fully visible without - // making it top control (because it would cause problems). - gViewerWindow->getFloaterViewHolder()->addChild(mList); - mList->setVisible(FALSE); + mList = LLUICtrlFactory::create<LLGestureScrollListCtrl>(params); + addChild(mList); //****************************Gesture Part********************************/ setCommitCallback(boost::bind(&LLGestureComboList::onCommitGesture, this)); // now register us as observer since we have a place to put the results - LLGestureManager::instance().addObserver(this); + LLGestureMgr::instance().addObserver(this); // refresh list from current active gestures refreshGestures(); @@ -115,7 +141,7 @@ LLGestureComboList::LLGestureComboList(const LLGestureComboList::Params& p) setFocusLostCallback(boost::bind(&LLGestureComboList::hideList, this)); } -BOOL LLGestureComboList::handleKey(KEY key, MASK mask, BOOL called_from_parent) +BOOL LLGestureComboList::handleKeyHere(KEY key, MASK mask) { BOOL handled = FALSE; @@ -126,7 +152,7 @@ BOOL LLGestureComboList::handleKey(KEY key, MASK mask, BOOL called_from_parent) } else { - handled = mList->handleKey(key, mask, called_from_parent); + handled = mList->handleKeyHere(key, mask); } return handled; @@ -135,18 +161,17 @@ BOOL LLGestureComboList::handleKey(KEY key, MASK mask, BOOL called_from_parent) void LLGestureComboList::showList() { LLRect rect = mList->getRect(); - LLRect screen; - mButton->localRectToScreen(getRect(), &screen); + LLRect button_rect = mButton->getRect(); // Calculating amount of space between the navigation bar and gestures combo LLNavigationBar* nb = LLNavigationBar::getInstance(); S32 x, nb_bottom; - nb->localPointToScreen(0, 0, &x, &nb_bottom); + nb->localPointToOtherView(0, 0, &x, &nb_bottom, this); - S32 max_height = nb_bottom - screen.mTop; + S32 max_height = nb_bottom - button_rect.mTop; mList->calcColumnWidths(); - rect.setOriginAndSize(screen.mLeft, screen.mTop, llmax(mList->getMaxContentWidth(),mButton->getRect().getWidth()), max_height); + rect.setOriginAndSize(button_rect.mLeft, button_rect.mTop, llmax(mList->getMaxContentWidth(),mButton->getRect().getWidth()), max_height); mList->setRect(rect); mList->fitContents( llmax(mList->getMaxContentWidth(),mButton->getRect().getWidth()), max_height); @@ -156,6 +181,7 @@ void LLGestureComboList::showList() // Show the list and push the button down mButton->setToggleState(TRUE); mList->setVisible(TRUE); + LLUI::addPopup(mList); } void LLGestureComboList::onButtonCommit() @@ -188,6 +214,7 @@ void LLGestureComboList::hideList() mButton->setToggleState(FALSE); mList->setVisible(FALSE); mList->mouseOverHighlightNthItem(-1); + LLUI::removePopup(mList); gFocusMgr.setKeyboardFocus(NULL); } } @@ -247,8 +274,8 @@ void LLGestureComboList::refreshGestures() mList->clearRows(); mGestures.clear(); - LLGestureManager::item_map_t::const_iterator it; - const LLGestureManager::item_map_t& active_gestures = LLGestureManager::instance().getActiveGestures(); + LLGestureMgr::item_map_t::const_iterator it; + const LLGestureMgr::item_map_t& active_gestures = LLGestureMgr::instance().getActiveGestures(); LLSD::Integer idx(0); for (it = active_gestures.begin(); it != active_gestures.end(); ++it) { @@ -263,9 +290,12 @@ void LLGestureComboList::refreshGestures() sortByName(); - // store index followed by the last added Gesture and add View All item at bottom - mViewAllItemIndex = idx; - + // store indices for Get More and View All items (idx is the index followed by the last added Gesture) + mGetMoreItemIndex = idx; + mViewAllItemIndex = idx + 1; + + // add Get More and View All items at the bottom + mList->addSimpleElement(LLTrans::getString("GetMoreGestures"), ADD_BOTTOM, LLSD(mGetMoreItemIndex)); mList->addSimpleElement(LLTrans::getString("ViewAllGestures"), ADD_BOTTOM, LLSD(mViewAllItemIndex)); // Insert label after sorting, at top, with separator below it @@ -292,7 +322,7 @@ void LLGestureComboList::refreshGestures() gesture = mGestures.at(index); } - if(gesture && LLGestureManager::instance().isGesturePlaying(gesture)) + if(gesture && LLGestureMgr::instance().isGesturePlaying(gesture)) { return; } @@ -321,10 +351,16 @@ void LLGestureComboList::onCommitGesture() return; } + if (mGetMoreItemIndex == index) + { + LLWeb::loadURLExternal(gSavedSettings.getString("GesturesMarketplaceURL")); + return; + } + LLMultiGesture* gesture = mGestures.at(index); if(gesture) { - LLGestureManager::instance().playGesture(gesture); + LLGestureMgr::instance().playGesture(gesture); if(!gesture->mReplaceText.empty()) { LLNearbyChatBar::sendChatFromViewer(gesture->mReplaceText, CHAT_TYPE_NORMAL, FALSE); @@ -335,7 +371,7 @@ void LLGestureComboList::onCommitGesture() LLGestureComboList::~LLGestureComboList() { - LLGestureManager::instance().removeObserver(this); + LLGestureMgr::instance().removeObserver(this); } LLNearbyChatBar::LLNearbyChatBar() @@ -353,6 +389,7 @@ BOOL LLNearbyChatBar::postBuild() mChatBox->setCommitCallback(boost::bind(&LLNearbyChatBar::onChatBoxCommit, this)); mChatBox->setKeystrokeCallback(&onChatBoxKeystroke, this); mChatBox->setFocusLostCallback(boost::bind(&onChatBoxFocusLost, _1, this)); + mChatBox->setFocusReceivedCallback(boost::bind(&LLNearbyChatBar::onChatBoxFocusReceived, this)); mChatBox->setIgnoreArrowKeys( FALSE ); mChatBox->setCommitOnFocusLost( FALSE ); @@ -396,7 +433,6 @@ BOOL LLNearbyChatBar::handleKeyHere( KEY key, MASK mask ) { BOOL handled = FALSE; - // ALT-RETURN is reserved for windowed/fullscreen toggle if( KEY_RETURN == key && mask == MASK_CONTROL) { // shout @@ -407,32 +443,6 @@ BOOL LLNearbyChatBar::handleKeyHere( KEY key, MASK mask ) return handled; } -S32 LLNearbyChatBar::getMinWidth() const -{ - static S32 min_width = -1; - - if (min_width < 0) - { - const std::string& s = getString("min_width"); - min_width = !s.empty() ? atoi(s.c_str()) : 300; - } - - return min_width; -} - -S32 LLNearbyChatBar::getMaxWidth() const -{ - static S32 max_width = -1; - - if (max_width < 0) - { - const std::string& s = getString("max_width"); - max_width = !s.empty() ? atoi(s.c_str()) : 510; - } - - return max_width; -} - BOOL LLNearbyChatBar::matchChatTypeTrigger(const std::string& in_str, std::string* out_str) { U32 in_len = in_str.length(); @@ -505,7 +515,7 @@ void LLNearbyChatBar::onChatBoxKeystroke(LLLineEditor* caller, void* userdata) std::string utf8_trigger = wstring_to_utf8str(raw_text); std::string utf8_out_str(utf8_trigger); - if (LLGestureManager::instance().matchPrefix(utf8_trigger, &utf8_out_str)) + if (LLGestureMgr::instance().matchPrefix(utf8_trigger, &utf8_out_str)) { std::string rest_of_match = utf8_out_str.substr(utf8_trigger.size()); self->mChatBox->setText(utf8_trigger + rest_of_match); // keep original capitalization for user-entered part @@ -536,6 +546,11 @@ void LLNearbyChatBar::onChatBoxFocusLost(LLFocusableElement* caller, void* userd gAgent.stopTyping(); } +void LLNearbyChatBar::onChatBoxFocusReceived() +{ + mChatBox->setEnabled(!gDisconnected); +} + EChatType LLNearbyChatBar::processChatTypeTriggers(EChatType type, std::string &str) { U32 length = str.length(); @@ -587,7 +602,7 @@ void LLNearbyChatBar::sendChat( EChatType type ) if (0 == channel) { // discard returned "found" boolean - LLGestureManager::instance().triggerAndReviseString(utf8text, &utf8_revised_text); + LLGestureMgr::instance().triggerAndReviseString(utf8text, &utf8_revised_text); } else { @@ -836,8 +851,11 @@ public: { if (tokens.size() < 2) return false; S32 channel = tokens[0].asInteger(); - std::string mesg = tokens[1].asString(); - send_chat_from_viewer(mesg, CHAT_TYPE_NORMAL, channel); + + // Send unescaped message, see EXT-6353. + std::string unescaped_mesg (LLURI::unescape(tokens[1].asString())); + + send_chat_from_viewer(unescaped_mesg, CHAT_TYPE_NORMAL, channel); return true; } }; diff --git a/indra/newview/llnearbychatbar.h b/indra/newview/llnearbychatbar.h index d9a7403611..83c174fd10 100644 --- a/indra/newview/llnearbychatbar.h +++ b/indra/newview/llnearbychatbar.h @@ -62,6 +62,7 @@ protected: std::vector<LLMultiGesture*> mGestures; std::string mLabel; LLSD::Integer mViewAllItemIndex; + LLSD::Integer mGetMoreItemIndex; public: @@ -70,7 +71,7 @@ public: LLCtrlListInterface* getListInterface() { return (LLCtrlListInterface*)mList; }; virtual void showList(); virtual void hideList(); - virtual BOOL handleKey(KEY key, MASK mask, BOOL called_from_parent); + virtual BOOL handleKeyHere(KEY key, MASK mask); S32 getCurrentIndex() const; void onItemSelected(const LLSD& data); @@ -117,13 +118,11 @@ public: static void sendChatFromViewer(const std::string &utf8text, EChatType type, BOOL animate); static void sendChatFromViewer(const LLWString &wtext, EChatType type, BOOL animate); - S32 getMinWidth() const; - S32 getMaxWidth() const; - protected: static BOOL matchChatTypeTrigger(const std::string& in_str, std::string* out_str); static void onChatBoxKeystroke(LLLineEditor* caller, void* userdata); static void onChatBoxFocusLost(LLFocusableElement* caller, void* userdata); + void onChatBoxFocusReceived(); void sendChat( EChatType type ); void onChatBoxCommit(); diff --git a/indra/newview/llnearbychathandler.cpp b/indra/newview/llnearbychathandler.cpp index be48770567..1fadb126e4 100644 --- a/indra/newview/llnearbychathandler.cpp +++ b/indra/newview/llnearbychathandler.cpp @@ -32,9 +32,12 @@ #include "llviewerprecompiledheaders.h" +#include "llagentdata.h" // for gAgentID #include "llnearbychathandler.h" +#include "llbottomtray.h" #include "llchatitemscontainerctrl.h" +#include "llfloaterscriptdebug.h" #include "llnearbychat.h" #include "llrecentpeople.h" @@ -55,7 +58,6 @@ LLToastPanelBase* createToastPanel() return item; } - class LLNearbyChatScreenChannel: public LLScreenChannelBase { public: @@ -87,11 +89,7 @@ public: { for(std::vector<LLToast*>::iterator it = m_active_toasts.begin(); it != m_active_toasts.end(); ++it) { - LLToast* toast = (*it); - toast->setVisible(FALSE); - toast->stopTimer(); - m_toast_pool.push_back(toast); - + addToToastPool((*it)); } m_active_toasts.clear(); }; @@ -104,6 +102,14 @@ public: } protected: + void addToToastPool(LLToast* toast) + { + toast->setVisible(FALSE); + toast->stopTimer(); + toast->setIsHidden(true); + m_toast_pool.push_back(toast); + } + void createOverflowToast(S32 bottom, F32 timer); create_toast_panel_callback_t m_create_toast_panel_callback_t; @@ -131,11 +137,12 @@ void LLNearbyChatScreenChannel::onToastFade(LLToast* toast) //fade mean we put toast to toast pool if(!toast) return; - m_toast_pool.push_back(toast); std::vector<LLToast*>::iterator pos = std::find(m_active_toasts.begin(),m_active_toasts.end(),toast); if(pos!=m_active_toasts.end()) m_active_toasts.erase(pos); + + addToToastPool(toast); arrangeToasts(); } @@ -175,10 +182,11 @@ void LLNearbyChatScreenChannel::addNotification(LLSD& notification) if(m_active_toasts.size()) { LLUUID fromID = notification["from_id"].asUUID(); // agent id or object id + std::string from = notification["from"].asString(); LLToast* toast = m_active_toasts[0]; LLNearbyChatToastPanel* panel = dynamic_cast<LLNearbyChatToastPanel*>(toast->getPanel()); - if(panel && panel->messageID() == fromID && panel->canAddText()) + if(panel && panel->messageID() == fromID && panel->getFromName() == from && panel->canAddText()) { panel->addMessage(notification); toast->reshapeToPanel(); @@ -226,7 +234,7 @@ void LLNearbyChatScreenChannel::addNotification(LLSD& notification) toast->reshapeToPanel(); toast->resetTimer(); - m_active_toasts.insert(m_active_toasts.begin(),toast); + m_active_toasts.push_back(toast); arrangeToasts(); } @@ -238,7 +246,14 @@ void LLNearbyChatScreenChannel::arrangeToasts() hideToastsFromScreen(); - showToastsBottom(); + showToastsBottom(); +} + +int sort_toasts_predicate(LLToast* first,LLToast* second) +{ + F32 v1 = first->getTimer()->getEventTimer().getElapsedTimeF32(); + F32 v2 = second->getTimer()->getEventTimer().getElapsedTimeF32(); + return v1 < v2; } void LLNearbyChatScreenChannel::showToastsBottom() @@ -250,40 +265,41 @@ void LLNearbyChatScreenChannel::showToastsBottom() S32 bottom = getRect().mBottom; S32 margin = gSavedSettings.getS32("ToastGap"); + //sort active toasts + std::sort(m_active_toasts.begin(),m_active_toasts.end(),sort_toasts_predicate); + + //calc max visible item and hide other toasts. + for(std::vector<LLToast*>::iterator it = m_active_toasts.begin(); it != m_active_toasts.end(); ++it) { - LLToast* toast = (*it); - S32 toast_top = bottom + toast->getRect().getHeight() + margin; + S32 toast_top = bottom + (*it)->getRect().getHeight() + margin; if(toast_top > gFloaterView->getRect().getHeight()) { while(it!=m_active_toasts.end()) { - toast->setVisible(FALSE); - toast->stopTimer(); - m_toast_pool.push_back(toast); + addToToastPool((*it)); it=m_active_toasts.erase(it); } break; } - else - { - toast_rect = toast->getRect(); - toast_rect.setLeftTopAndSize(getRect().mLeft , toast_top, toast_rect.getWidth() ,toast_rect.getHeight()); - - toast->setRect(toast_rect); - toast->setIsHidden(false); - toast->setVisible(TRUE); + LLToast* toast = (*it); + + toast_rect = toast->getRect(); + toast_rect.setLeftTopAndSize(getRect().mLeft , bottom + toast_rect.getHeight(), toast_rect.getWidth() ,toast_rect.getHeight()); + + toast->setRect(toast_rect); + bottom += toast_rect.getHeight() - toast->getTopPad() + margin; + } + + // use reverse order to provide correct z-order and avoid toast blinking + + for(std::vector<LLToast*>::reverse_iterator it = m_active_toasts.rbegin(); it != m_active_toasts.rend(); ++it) + { + LLToast* toast = (*it); + toast->setIsHidden(false); + toast->setVisible(TRUE); - if(!toast->hasFocus()) - { - // Fixing Z-order of toasts (EXT-4862) - // Next toast will be positioned under this one. - gFloaterView->sendChildToBack(toast); - } - - bottom = toast->getRect().mTop; - } } } @@ -319,9 +335,9 @@ LLNearbyChatHandler::~LLNearbyChatHandler() void LLNearbyChatHandler::initChannel() { LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD()); + LLView* chat_box = LLBottomTray::getInstance()->getChildView("chat_box"); S32 channel_right_bound = nearby_chat->getRect().mRight; - S32 channel_width = nearby_chat->getRect().mRight; - mChannel->init(channel_right_bound - channel_width, channel_right_bound); + mChannel->init(chat_box->getRect().mLeft, channel_right_bound); } @@ -344,9 +360,41 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg, const LLSD &args) //if(tmp_chat.mFromName.empty() && tmp_chat.mFromID!= LLUUID::null) // tmp_chat.mFromName = tmp_chat.mFromID.asString(); } + + // don't show toast and add message to chat history on receive debug message + // with disabled setting showing script errors or enabled setting to show script + // errors in separate window. + if (chat_msg.mChatType == CHAT_TYPE_DEBUG_MSG) + { + if(gSavedSettings.getBOOL("ShowScriptErrors") == FALSE) + return; + + // don't process debug messages from not owned objects, see EXT-7762 + if (gAgentID != chat_msg.mOwnerID) + { + return; + } + + if (gSavedSettings.getS32("ShowScriptErrorsLocation")== 1)// show error in window //("ScriptErrorsAsChat")) + { + + LLColor4 txt_color; + + LLViewerChat::getChatColor(chat_msg,txt_color); + + LLFloaterScriptDebug::addScriptLine(chat_msg.mText, + chat_msg.mFromName, + txt_color, + chat_msg.mFromID); + return; + } + } + nearby_chat->addMessage(chat_msg, true, args); - if(nearby_chat->getVisible()) - return;//no need in toast if chat is visible + if( nearby_chat->getVisible() + || ( chat_msg.mSourceType == CHAT_SOURCE_AGENT + && gSavedSettings.getBOOL("UseChatBubbles") ) ) + return;//no need in toast if chat is visible or if bubble chat is enabled // Handle irc styled messages for toast panel if (tmp_chat.mChatStyle == CHAT_STYLE_IRC) diff --git a/indra/newview/llnetmap.cpp b/indra/newview/llnetmap.cpp index 234fe13217..a8dee8a24a 100644 --- a/indra/newview/llnetmap.cpp +++ b/indra/newview/llnetmap.cpp @@ -49,6 +49,7 @@ // Viewer includes #include "llagent.h" +#include "llagentcamera.h" #include "llappviewer.h" // for gDisconnected #include "llcallingcard.h" // LLAvatarTracker #include "lltracker.h" @@ -87,7 +88,7 @@ LLNetMap::LLNetMap (const Params & p) mCurPanX(0.f), mCurPanY(0.f), mUpdateNow(FALSE), - mObjectImageCenterGlobal( gAgent.getCameraPositionGlobal() ), + mObjectImageCenterGlobal( gAgentCamera.getCameraPositionGlobal() ), mObjectRawImagep(), mObjectImagep(), mClosestAgentToCursor(), @@ -153,6 +154,18 @@ void LLNetMap::draw() // Prepare a scissor region F32 rotation = 0; + gGL.pushMatrix(); + gGL.pushUIMatrix(); + + LLVector3 offset = gGL.getUITranslation(); + LLVector3 scale = gGL.getUIScale(); + + glLoadIdentity(); + gGL.loadUIIdentity(); + + glScalef(scale.mV[0], scale.mV[1], scale.mV[2]); + gGL.translatef(offset.mV[0], offset.mV[1], offset.mV[2]); + { LLLocalClipRect clip(getLocalRect()); { @@ -191,7 +204,7 @@ void LLNetMap::draw() LLViewerRegion* regionp = *iter; // Find x and y position relative to camera's center. LLVector3 origin_agent = regionp->getOriginAgent(); - LLVector3 rel_region_pos = origin_agent - gAgent.getCameraPositionAgent(); + LLVector3 rel_region_pos = origin_agent - gAgentCamera.getCameraPositionAgent(); F32 relative_x = (rel_region_pos.mV[0] / region_width) * mScale; F32 relative_y = (rel_region_pos.mV[1] / region_width) * mScale; @@ -252,7 +265,7 @@ void LLNetMap::draw() LLVector3d old_center = mObjectImageCenterGlobal; - LLVector3d new_center = gAgent.getCameraPositionGlobal(); + LLVector3d new_center = gAgentCamera.getCameraPositionGlobal(); new_center.mdV[0] = (5.f/mObjectMapTPM)*floor(0.2f*mObjectMapTPM*new_center.mdV[0]); new_center.mdV[1] = (5.f/mObjectMapTPM)*floor(0.2f*mObjectMapTPM*new_center.mdV[1]); @@ -277,7 +290,7 @@ void LLNetMap::draw() } LLVector3 map_center_agent = gAgent.getPosAgentFromGlobal(mObjectImageCenterGlobal); - map_center_agent -= gAgent.getCameraPositionAgent(); + map_center_agent -= gAgentCamera.getCameraPositionAgent(); map_center_agent.mV[VX] *= mScale/region_width; map_center_agent.mV[VY] *= mScale/region_width; @@ -435,6 +448,9 @@ void LLNetMap::draw() } } + gGL.popMatrix(); + gGL.popUIMatrix(); + LLUICtrl::draw(); } @@ -446,7 +462,7 @@ void LLNetMap::reshape(S32 width, S32 height, BOOL called_from_parent) LLVector3 LLNetMap::globalPosToView( const LLVector3d& global_pos ) { - LLVector3d relative_pos_global = global_pos - gAgent.getCameraPositionGlobal(); + LLVector3d relative_pos_global = global_pos - gAgentCamera.getCameraPositionGlobal(); LLVector3 pos_local; pos_local.setVec(relative_pos_global); // convert to floats from doubles @@ -514,7 +530,7 @@ LLVector3d LLNetMap::viewPosToGlobal( S32 x, S32 y ) LLVector3d pos_global; pos_global.setVec( pos_local ); - pos_global += gAgent.getCameraPositionGlobal(); + pos_global += gAgentCamera.getCameraPositionGlobal(); return pos_global; } diff --git a/indra/newview/llnetmap.h b/indra/newview/llnetmap.h index 3d7f3233ac..eb53d295b2 100644 --- a/indra/newview/llnetmap.h +++ b/indra/newview/llnetmap.h @@ -46,10 +46,6 @@ class LLImageRaw; class LLTextBox; class LLViewerTexture; -const F32 MAP_SCALE_MIN = 64.f; -const F32 MAP_SCALE_MID = 172.f; -const F32 MAP_SCALE_MAX = 512.f; - class LLNetMap : public LLUICtrl { public: diff --git a/indra/newview/llnotificationalerthandler.cpp b/indra/newview/llnotificationalerthandler.cpp index 52de8355e9..60e41b64ac 100644 --- a/indra/newview/llnotificationalerthandler.cpp +++ b/indra/newview/llnotificationalerthandler.cpp @@ -36,6 +36,7 @@ #include "llnotificationhandler.h" #include "llnotifications.h" +#include "llprogressview.h" #include "lltoastnotifypanel.h" #include "llviewercontrol.h" #include "llviewerwindow.h" @@ -116,6 +117,11 @@ bool LLAlertHandler::processNotification(const LLSD& notify) p.is_modal = mIsModal; p.on_delete_toast = boost::bind(&LLAlertHandler::onDeleteToast, this, _1); + // Show alert in middle of progress view (during teleport) (EXT-1093) + LLProgressView* progress = gViewerWindow->getProgressView(); + LLRect rc = progress && progress->getVisible() ? progress->getRect() : gViewerWindow->getWorldViewRectScaled(); + mChannel->updatePositionAndSize(rc, rc); + LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel); if(channel) channel->addToast(p); diff --git a/indra/newview/llnotificationhandler.h b/indra/newview/llnotificationhandler.h index 5f4768e321..99a1fedcf3 100644 --- a/indra/newview/llnotificationhandler.h +++ b/indra/newview/llnotificationhandler.h @@ -42,6 +42,8 @@ #include "llinstantmessage.h" #include "llnotificationptr.h" +class LLIMFloater; + namespace LLNotificationsUI { // ENotificationType enumerates all possible types of notifications that could be met @@ -122,9 +124,17 @@ protected: class LLSysHandler : public LLEventHandler { public: + LLSysHandler(); virtual ~LLSysHandler() {}; virtual bool processNotification(const LLSD& notify)=0; + +protected : + static void init(); + void removeExclusiveNotifications(const LLNotificationPtr& notif); + + typedef std::list< std::set<std::string> > exclusive_notif_sets; + static exclusive_notif_sets sExclusiveNotificationGroups; }; /** @@ -171,6 +181,7 @@ public: protected: virtual void onDeleteToast(LLToast* toast); + virtual void onRejectToast(const LLUUID& id); virtual void initChannel(); }; @@ -282,6 +293,11 @@ public: static bool canAddNotifPanelToIM(const LLNotificationPtr& notification); /** + * Checks whether notification can be used multiple times or not. + */ + static bool isNotificationReusable(const LLNotificationPtr& notification); + + /** * Checks if passed notification can create IM session and be written into it. * * This method uses canLogToIM() & canSpawnIMSession(). @@ -289,6 +305,21 @@ public: static bool canSpawnSessionAndLogToIM(const LLNotificationPtr& notification); /** + * Checks if passed notification can create toast. + */ + static bool canSpawnToast(const LLNotificationPtr& notification); + + /** + * Determines whether IM floater is opened. + */ + static bool isIMFloaterOpened(const LLNotificationPtr& notification); + + /** + * Determines whether IM floater is focused. + */ + static bool isIMFloaterFocused(const LLNotificationPtr& notification); + + /** * Writes notification message to IM session. */ static void logToIM(const EInstantMessage& session_type, @@ -336,9 +367,27 @@ public: static void addNotifPanelToIM(const LLNotificationPtr& notification); /** - * Reloads IM floater messages. + * Updates messages of IM floater. + */ + static void updateIMFLoaterMesages(const LLUUID& session_id); + + /** + * Updates messages of visible IM floater. + */ + static void updateVisibleIMFLoaterMesages(const LLNotificationPtr& notification); + + /** + * Decrements counter of IM messages. + */ + static void decIMMesageCounter(const LLNotificationPtr& notification); + +private: + + /** + * Find IM floater based on "from_id" */ - static void reloadIMFloaterMessages(const LLNotificationPtr& notification); + static LLIMFloater* findIMFloater(const LLNotificationPtr& notification); + }; } diff --git a/indra/newview/llnotificationhandlerutil.cpp b/indra/newview/llnotificationhandlerutil.cpp index b8e0892b02..95b946f307 100644 --- a/indra/newview/llnotificationhandlerutil.cpp +++ b/indra/newview/llnotificationhandlerutil.cpp @@ -43,10 +43,78 @@ using namespace LLNotificationsUI; +// static +std::list< std::set<std::string> > LLSysHandler::sExclusiveNotificationGroups; + +// static +void LLSysHandler::init() +{ + std::set<std::string> online_offline_group; + online_offline_group.insert("FriendOnline"); + online_offline_group.insert("FriendOffline"); + + sExclusiveNotificationGroups.push_back(online_offline_group); +} + +LLSysHandler::LLSysHandler() +{ + if(sExclusiveNotificationGroups.empty()) + { + init(); + } +} + +void LLSysHandler::removeExclusiveNotifications(const LLNotificationPtr& notif) +{ + LLScreenChannel* channel = dynamic_cast<LLScreenChannel *>(mChannel); + if (channel == NULL) + { + return; + } + + class ExclusiveMatcher: public LLScreenChannel::Matcher + { + public: + ExclusiveMatcher(const std::set<std::string>& excl_group, + const std::string& from_name) : + mExclGroup(excl_group), mFromName(from_name) + { + } + bool matches(const LLNotificationPtr notification) const + { + for (std::set<std::string>::const_iterator it = mExclGroup.begin(); it + != mExclGroup.end(); it++) + { + std::string from_name = LLHandlerUtil::getSubstitutionName(notification); + if (notification->getName() == *it && from_name == mFromName) + { + return true; + } + } + return false; + } + private: + const std::set<std::string>& mExclGroup; + const std::string& mFromName; + }; + + + for (exclusive_notif_sets::iterator it = sExclusiveNotificationGroups.begin(); it + != sExclusiveNotificationGroups.end(); it++) + { + std::set<std::string> group = *it; + std::set<std::string>::iterator g_it = group.find(notif->getName()); + if (g_it != group.end()) + { + channel->killMatchedToasts(ExclusiveMatcher(group, + LLHandlerUtil::getSubstitutionName(notif))); + } + } +} + const static std::string GRANTED_MODIFY_RIGHTS("GrantedModifyRights"), REVOKED_MODIFY_RIGHTS("RevokedModifyRights"), OBJECT_GIVE_ITEM( - "ObjectGiveItem"), OBJECT_GIVE_ITEM_UNKNOWN_USER( - "ObjectGiveItemUnknownUser"), PAYMENT_RECIVED("PaymentRecived"), + "ObjectGiveItem"), PAYMENT_RECIVED("PaymentRecived"), ADD_FRIEND_WITH_MESSAGE("AddFriendWithMessage"), USER_GIVE_ITEM("UserGiveItem"), INVENTORY_ACCEPTED("InventoryAccepted"), @@ -54,9 +122,14 @@ const static std::string GRANTED_MODIFY_RIGHTS("GrantedModifyRights"), OFFER_FRIENDSHIP("OfferFriendship"), FRIENDSHIP_ACCEPTED("FriendshipAccepted"), FRIENDSHIP_OFFERED("FriendshipOffered"), + FRIENDSHIP_ACCEPTED_BYME("FriendshipAcceptedByMe"), + FRIENDSHIP_DECLINED_BYME("FriendshipDeclinedByMe"), FRIEND_ONLINE("FriendOnline"), FRIEND_OFFLINE("FriendOffline"), SERVER_OBJECT_MESSAGE("ServerObjectMessage"), - TELEPORT_OFFERED("TeleportOffered"); + TELEPORT_OFFERED("TeleportOffered"), + TELEPORT_OFFER_SENT("TeleportOfferSent"), + IM_SYSTEM_MESSAGE_TIP("IMSystemMessageTip"); + // static bool LLHandlerUtil::canLogToIM(const LLNotificationPtr& notification) @@ -66,9 +139,16 @@ bool LLHandlerUtil::canLogToIM(const LLNotificationPtr& notification) || PAYMENT_RECIVED == notification->getName() || OFFER_FRIENDSHIP == notification->getName() || FRIENDSHIP_OFFERED == notification->getName() + || FRIENDSHIP_ACCEPTED == notification->getName() + || FRIENDSHIP_ACCEPTED_BYME == notification->getName() + || FRIENDSHIP_DECLINED_BYME == notification->getName() || SERVER_OBJECT_MESSAGE == notification->getName() || INVENTORY_ACCEPTED == notification->getName() - || INVENTORY_DECLINED == notification->getName(); + || INVENTORY_DECLINED == notification->getName() + || USER_GIVE_ITEM == notification->getName() + || TELEPORT_OFFERED == notification->getName() + || TELEPORT_OFFER_SENT == notification->getName() + || IM_SYSTEM_MESSAGE_TIP == notification->getName(); } // static @@ -78,25 +158,33 @@ bool LLHandlerUtil::canLogToNearbyChat(const LLNotificationPtr& notification) && FRIEND_ONLINE != notification->getName() && FRIEND_OFFLINE != notification->getName() && INVENTORY_ACCEPTED != notification->getName() - && INVENTORY_DECLINED != notification->getName(); + && INVENTORY_DECLINED != notification->getName() + && IM_SYSTEM_MESSAGE_TIP != notification->getName(); } // static bool LLHandlerUtil::canSpawnIMSession(const LLNotificationPtr& notification) { return OFFER_FRIENDSHIP == notification->getName() - || FRIENDSHIP_ACCEPTED == notification->getName() || USER_GIVE_ITEM == notification->getName() - || INVENTORY_ACCEPTED == notification->getName() - || INVENTORY_DECLINED == notification->getName(); + || TELEPORT_OFFERED == notification->getName(); } // static bool LLHandlerUtil::canAddNotifPanelToIM(const LLNotificationPtr& notification) { - return OFFER_FRIENDSHIP == notification->getName(); + return OFFER_FRIENDSHIP == notification->getName() + || USER_GIVE_ITEM == notification->getName() + || TELEPORT_OFFERED == notification->getName(); } +// static +bool LLHandlerUtil::isNotificationReusable(const LLNotificationPtr& notification) +{ + return OFFER_FRIENDSHIP == notification->getName() + || USER_GIVE_ITEM == notification->getName() + || TELEPORT_OFFERED == notification->getName(); +} // static bool LLHandlerUtil::canSpawnSessionAndLogToIM(const LLNotificationPtr& notification) @@ -105,18 +193,91 @@ bool LLHandlerUtil::canSpawnSessionAndLogToIM(const LLNotificationPtr& notificat } // static +bool LLHandlerUtil::canSpawnToast(const LLNotificationPtr& notification) +{ + if(INVENTORY_DECLINED == notification->getName() + || INVENTORY_ACCEPTED == notification->getName()) + { + // return false for inventory accepted/declined notifications if respective IM window is open (EXT-5909) + return ! isIMFloaterOpened(notification); + } + + if(FRIENDSHIP_ACCEPTED == notification->getName()) + { + // don't show FRIENDSHIP_ACCEPTED if IM window is opened and focused - EXT-6441 + return ! isIMFloaterFocused(notification); + } + + if(OFFER_FRIENDSHIP == notification->getName() + || USER_GIVE_ITEM == notification->getName() + || TELEPORT_OFFERED == notification->getName()) + { + // When ANY offer arrives, show toast, unless IM window is already open - EXT-5904 + return ! isIMFloaterOpened(notification); + } + + return true; +} + +// static +LLIMFloater* LLHandlerUtil::findIMFloater(const LLNotificationPtr& notification) +{ + LLUUID from_id = notification->getPayload()["from_id"]; + LLUUID session_id = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL, from_id); + return LLFloaterReg::findTypedInstance<LLIMFloater>("impanel", session_id); +} + +// static +bool LLHandlerUtil::isIMFloaterOpened(const LLNotificationPtr& notification) +{ + bool res = false; + + LLIMFloater* im_floater = findIMFloater(notification); + if (im_floater != NULL) + { + res = im_floater->getVisible() == TRUE; + } + + return res; +} + +bool LLHandlerUtil::isIMFloaterFocused(const LLNotificationPtr& notification) +{ + bool res = false; + + LLIMFloater* im_floater = findIMFloater(notification); + if (im_floater != NULL) + { + res = im_floater->hasFocus() == TRUE; + } + + return res; +} + +// static void LLHandlerUtil::logToIM(const EInstantMessage& session_type, const std::string& session_name, const std::string& from_name, const std::string& message, const LLUUID& session_owner_id, const LLUUID& from_id) { + std::string from = from_name; + if (from_name.empty()) + { + from = SYSTEM_FROM; + } + LLUUID session_id = LLIMMgr::computeSessionID(session_type, session_owner_id); LLIMModel::LLIMSession* session = LLIMModel::instance().findIMSession( session_id); if (session == NULL) { - LLIMModel::instance().logToFile(session_name, from_name, from_id, message); + // replace interactive system message marker with correct from string value + if (INTERACTIVE_SYSTEM_FROM == from_name) + { + from = SYSTEM_FROM; + } + LLIMModel::instance().logToFile(session_name, from, from_id, message); } else { @@ -127,8 +288,16 @@ void LLHandlerUtil::logToIM(const EInstantMessage& session_type, // set searched session as active to avoid IM toast popup LLIMModel::instance().setActiveSessionID(session_id); - LLIMModel::instance().addMessage(session_id, from_name, from_id, + S32 unread = session->mNumUnread; + S32 participant_unread = session->mParticipantUnreadMessageCount; + LLIMModel::instance().addMessageSilently(session_id, from, from_id, message); + // we shouldn't increment counters when logging, so restore them + session->mNumUnread = unread; + session->mParticipantUnreadMessageCount = participant_unread; + + // update IM floater messages + updateIMFLoaterMesages(session_id); // restore active session id if (active_session_id.isNull()) @@ -153,21 +322,14 @@ void LLHandlerUtil::logToIMP2P(const LLNotificationPtr& notification, bool to_fi { const std::string name = LLHandlerUtil::getSubstitutionName(notification); - std::string session_name = notification->getPayload().has( + const std::string& session_name = notification->getPayload().has( "SESSION_NAME") ? notification->getPayload()["SESSION_NAME"].asString() : name; // don't create IM p2p session with objects, it's necessary condition to log - if (notification->getName() != OBJECT_GIVE_ITEM && notification->getName() - != OBJECT_GIVE_ITEM_UNKNOWN_USER) + if (notification->getName() != OBJECT_GIVE_ITEM) { LLUUID from_id = notification->getPayload()["from_id"]; - //*HACK for ServerObjectMessage the sesson name is really weird, see EXT-4779 - if (SERVER_OBJECT_MESSAGE == notification->getName()) - { - session_name = "chat"; - } - //there still appears a log history file with weird name " .txt" if (" " == session_name || "{waiting}" == session_name || "{nobody}" == session_name) { @@ -176,13 +338,13 @@ void LLHandlerUtil::logToIMP2P(const LLNotificationPtr& notification, bool to_fi if(to_file_only) { - logToIM(IM_NOTHING_SPECIAL, session_name, name, notification->getMessage(), + logToIM(IM_NOTHING_SPECIAL, session_name, "", notification->getMessage(), LLUUID(), LLUUID()); } else { - logToIM(IM_NOTHING_SPECIAL, session_name, name, notification->getMessage(), - from_id, from_id); + logToIM(IM_NOTHING_SPECIAL, session_name, INTERACTIVE_SYSTEM_FROM, notification->getMessage(), + from_id, LLUUID()); } } } @@ -199,6 +361,7 @@ void LLHandlerUtil::logGroupNoticeToIMGroup( llwarns << "Group notice for unkown group: " << payload["group_id"].asUUID() << llendl; + return; } const std::string group_name = groupData.mName; @@ -220,6 +383,8 @@ void LLHandlerUtil::logToNearbyChat(const LLNotificationPtr& notification, EChat { LLChat chat_msg(notification->getMessage()); chat_msg.mSourceType = type; + chat_msg.mFromName = SYSTEM_FROM; + chat_msg.mFromID = LLUUID::null; nearby_chat->addMessage(chat_msg); } } @@ -242,9 +407,24 @@ LLUUID LLHandlerUtil::spawnIMSession(const std::string& name, const LLUUID& from // static std::string LLHandlerUtil::getSubstitutionName(const LLNotificationPtr& notification) { - return notification->getSubstitutions().has("NAME") + std::string res = notification->getSubstitutions().has("NAME") ? notification->getSubstitutions()["NAME"] : notification->getSubstitutions()["[NAME]"]; + if (res.empty()) + { + LLUUID from_id = notification->getPayload()["FROM_ID"]; + + //*TODO all keys everywhere should be made of the same case, there is a mix of keys in lower and upper cases + if (from_id.isNull()) + { + from_id = notification->getPayload()["from_id"]; + } + if(!gCacheName->getFullName(from_id, res)) + { + res = ""; + } + } + return res; } // static @@ -261,34 +441,60 @@ void LLHandlerUtil::addNotifPanelToIM(const LLNotificationPtr& notification) LLSD offer; offer["notification_id"] = notification->getID(); - offer["from_id"] = notification->getPayload()["from_id"]; - offer["from"] = name; - offer["time"] = LLLogChat::timestamp(true); + offer["from"] = SYSTEM_FROM; + offer["time"] = LLLogChat::timestamp(false); + offer["index"] = (LLSD::Integer)session->mMsgs.size(); session->mMsgs.push_front(offer); - LLIMFloater::show(session_id); + + // update IM floater and counters + LLSD arg; + arg["session_id"] = session_id; + arg["num_unread"] = ++(session->mNumUnread); + arg["participant_unread"] = ++(session->mParticipantUnreadMessageCount); + LLIMModel::getInstance()->mNewMsgSignal(arg); } // static -void LLHandlerUtil::reloadIMFloaterMessages( - const LLNotificationPtr& notification) +void LLHandlerUtil::updateIMFLoaterMesages(const LLUUID& session_id) { + LLIMFloater* im_floater = LLIMFloater::findInstance(session_id); + if (im_floater != NULL && im_floater->getVisible()) + { + im_floater->updateMessages(); + } +} + +// static +void LLHandlerUtil::updateVisibleIMFLoaterMesages(const LLNotificationPtr& notification) +{ + const std::string name = LLHandlerUtil::getSubstitutionName(notification); + LLUUID from_id = notification->getPayload()["from_id"]; + LLUUID session_id = spawnIMSession(name, from_id); + + updateIMFLoaterMesages(session_id); +} + +// static +void LLHandlerUtil::decIMMesageCounter(const LLNotificationPtr& notification) +{ + const std::string name = LLHandlerUtil::getSubstitutionName(notification); LLUUID from_id = notification->getPayload()["from_id"]; LLUUID session_id = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL, from_id); - LLIMFloater* im_floater = LLFloaterReg::findTypedInstance<LLIMFloater>( - "impanel", session_id); - if (im_floater != NULL) - { - LLIMModel::LLIMSession * session = LLIMModel::getInstance()->findIMSession( - session_id); - if(session != NULL) - { - session->mMsgs.clear(); - std::list<LLSD> chat_history; - LLLogChat::loadAllHistory(session->mHistoryFileName, chat_history); - session->addMessagesFromHistory(chat_history); - } - im_floater->reloadMessages(); + LLIMModel::LLIMSession * session = LLIMModel::getInstance()->findIMSession( + session_id); + + if (session == NULL) + { + return; } + + LLSD arg; + arg["session_id"] = session_id; + session->mNumUnread--; + arg["num_unread"] = session->mNumUnread; + session->mParticipantUnreadMessageCount--; + arg["participant_unread"] = session->mParticipantUnreadMessageCount; + LLIMModel::getInstance()->mNewMsgSignal(arg); } diff --git a/indra/newview/llnotificationofferhandler.cpp b/indra/newview/llnotificationofferhandler.cpp index 8c13b0fafa..c5960a9040 100644 --- a/indra/newview/llnotificationofferhandler.cpp +++ b/indra/newview/llnotificationofferhandler.cpp @@ -103,6 +103,8 @@ bool LLOfferHandler::processNotification(const LLSD& notify) } else { + notification->setReusable(LLHandlerUtil::isNotificationReusable(notification)); + LLUUID session_id; if (LLHandlerUtil::canSpawnIMSession(notification)) { @@ -113,35 +115,54 @@ bool LLOfferHandler::processNotification(const LLSD& notify) session_id = LLHandlerUtil::spawnIMSession(name, from_id); } - if (LLHandlerUtil::canAddNotifPanelToIM(notification)) + bool show_toast = LLHandlerUtil::canSpawnToast(notification); + bool add_notid_to_im = LLHandlerUtil::canAddNotifPanelToIM(notification); + if (add_notid_to_im) { LLHandlerUtil::addNotifPanelToIM(notification); - LLHandlerUtil::logToIMP2P(notification, true); } - else if (notification->getPayload().has("SUPPRESS_TOAST") + + if (notification->getPayload().has("SUPPRESS_TOAST") && notification->getPayload()["SUPPRESS_TOAST"]) { - LLHandlerUtil::logToIMP2P(notification); LLNotificationsUtil::cancel(notification); } - else + else if(show_toast) { LLToastNotifyPanel* notify_box = new LLToastNotifyPanel(notification); - + // don't close notification on panel destroy since it will be used by IM floater + notify_box->setCloseNotificationOnDestroy(!add_notid_to_im); LLToast::Params p; p.notif_id = notification->getID(); p.notification = notification; p.panel = notify_box; p.on_delete_toast = boost::bind(&LLOfferHandler::onDeleteToast, this, _1); + // we not save offer notifications to the syswell floater that should be added to the IM floater + p.can_be_stored = !add_notid_to_im; LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel); if(channel) channel->addToast(p); - LLHandlerUtil::logToIMP2P(notification); + // if we not add notification to IM - add it to notification well + if (!add_notid_to_im) + { + // send a signal to the counter manager + mNewNotificationSignal(); + } + } - // send a signal to the counter manager - mNewNotificationSignal(); + if (LLHandlerUtil::canLogToIM(notification)) + { + // log only to file if notif panel can be embedded to IM and IM is opened + if (add_notid_to_im && LLHandlerUtil::isIMFloaterOpened(notification)) + { + LLHandlerUtil::logToIMP2P(notification, true); + } + else + { + LLHandlerUtil::logToIMP2P(notification); + } } } } @@ -155,9 +176,10 @@ bool LLOfferHandler::processNotification(const LLSD& notify) } else { - if (LLHandlerUtil::canAddNotifPanelToIM(notification)) + if (LLHandlerUtil::canAddNotifPanelToIM(notification) + && !LLHandlerUtil::isIMFloaterOpened(notification)) { - LLHandlerUtil::reloadIMFloaterMessages(notification); + LLHandlerUtil::decIMMesageCounter(notification); } mChannel->killToastByNotificationID(notification->getID()); } @@ -170,8 +192,11 @@ bool LLOfferHandler::processNotification(const LLSD& notify) void LLOfferHandler::onDeleteToast(LLToast* toast) { - // send a signal to the counter manager - mDelNotificationSignal(); + if (!LLHandlerUtil::canAddNotifPanelToIM(toast->getNotification())) + { + // send a signal to the counter manager + mDelNotificationSignal(); + } // send a signal to a listener to let him perform some action // in this case listener is a SysWellWindow and it will remove a corresponding item from its list @@ -185,7 +210,9 @@ void LLOfferHandler::onRejectToast(LLUUID& id) if (notification && LLNotificationManager::getInstance()->getHandlerForNotification( - notification->getType()) == this) + notification->getType()) == this + // don't delete notification since it may be used by IM floater + && !LLHandlerUtil::canAddNotifPanelToIM(notification)) { LLNotifications::instance().cancel(notification); } diff --git a/indra/newview/llnotificationstorage.cpp b/indra/newview/llnotificationstorage.cpp new file mode 100644 index 0000000000..20b40b4e1d --- /dev/null +++ b/indra/newview/llnotificationstorage.cpp @@ -0,0 +1,227 @@ +/** +* @file llnotificationstorage.cpp +* @brief LLPersistentNotificationStorage class implementation +* +* $LicenseInfo:firstyear=2010&license=viewergpl$ +* +* Copyright (c) 2010, Linden Research, Inc. +* +* Second Life Viewer Source Code +* The source code in this file ("Source Code") is provided by Linden Lab +* to you under the terms of the GNU General Public License, version 2.0 +* ("GPL"), unless you have obtained a separate licensing agreement +* ("Other License"), formally executed by you and Linden Lab. Terms of +* the GPL can be found in doc/GPL-license.txt in this distribution, or +* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 +* +* There are special exceptions to the terms and conditions of the GPL as +* it is applied to this Source Code. View the full text of the exception +* in the file doc/FLOSS-exception.txt in this software distribution, or +* online at +* http://secondlifegrid.net/programs/open_source/licensing/flossexception +* +* By copying, modifying or distributing this software, you acknowledge +* that you have read and understood your obligations described above, +* and agree to abide by those obligations. +* +* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO +* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, +* COMPLETENESS OR PERFORMANCE. +* $/LicenseInfo$ +*/ + +#include "llviewerprecompiledheaders.h" // must be first include +#include "llnotificationstorage.h" + +#include "llxmlnode.h" // for linux compilers + +#include "llchannelmanager.h" +#include "llscreenchannel.h" +#include "llscriptfloater.h" +#include "llsdserialize.h" +#include "llviewermessage.h" + +////////////////////////////////////////////////////////////////////////// + +class LLResponderRegistry +{ +public: + + static void registerResponders(); + + static LLNotificationResponderInterface* createResponder(const std::string& notification_name, const LLSD& params); + +private: + + template<typename RESPONDER_TYPE> + static LLNotificationResponderInterface* create(const LLSD& params) + { + RESPONDER_TYPE* responder = new RESPONDER_TYPE(); + responder->fromLLSD(params); + return responder; + } + + typedef boost::function<LLNotificationResponderInterface* (const LLSD& params)> responder_constructor_t; + + static void add(const std::string& notification_name, const responder_constructor_t& ctr); + +private: + + typedef std::map<std::string, responder_constructor_t> build_map_t; + + static build_map_t sBuildMap; +}; + +////////////////////////////////////////////////////////////////////////// + +LLPersistentNotificationStorage::LLPersistentNotificationStorage() +{ + mFileName = gDirUtilp->getExpandedFilename ( LL_PATH_PER_SL_ACCOUNT, "open_notifications.xml" ); +} + +bool LLPersistentNotificationStorage::onPersistentChannelChanged(const LLSD& payload) +{ + // we ignore "load" messages, but rewrite the persistence file on any other + const std::string sigtype = payload["sigtype"].asString(); + if ("load" != sigtype) + { + saveNotifications(); + } + return false; +} + +void LLPersistentNotificationStorage::saveNotifications() +{ + // TODO - think about save optimization. + + llofstream notify_file(mFileName.c_str()); + if (!notify_file.is_open()) + { + llwarns << "Failed to open " << mFileName << llendl; + return; + } + + LLSD output; + LLSD& data = output["data"]; + + LLNotificationChannelPtr history_channel = LLNotifications::instance().getChannel("Persistent"); + LLNotificationSet::iterator it = history_channel->begin(); + + for ( ; history_channel->end() != it; ++it) + { + LLNotificationPtr notification = *it; + + // After a notification was placed in Persist channel, it can become + // responded, expired or canceled - in this case we are should not save it + if(notification->isRespondedTo() || notification->isCancelled() + || notification->isExpired()) + { + continue; + } + + data.append(notification->asLLSD()); + } + + LLPointer<LLSDFormatter> formatter = new LLSDXMLFormatter(); + formatter->format(output, notify_file, LLSDFormatter::OPTIONS_PRETTY); +} + +void LLPersistentNotificationStorage::loadNotifications() +{ + LLResponderRegistry::registerResponders(); + + LLNotifications::instance().getChannel("Persistent")-> + connectChanged(boost::bind(&LLPersistentNotificationStorage::onPersistentChannelChanged, this, _1)); + + llifstream notify_file(mFileName.c_str()); + if (!notify_file.is_open()) + { + llwarns << "Failed to open " << mFileName << llendl; + return; + } + + LLSD input; + LLPointer<LLSDParser> parser = new LLSDXMLParser(); + if (parser->parse(notify_file, input, LLSDSerialize::SIZE_UNLIMITED) < 0) + { + llwarns << "Failed to parse open notifications" << llendl; + return; + } + + if (input.isUndefined()) + { + return; + } + + LLSD& data = input["data"]; + if (data.isUndefined()) + { + return; + } + + using namespace LLNotificationsUI; + LLScreenChannel* notification_channel = dynamic_cast<LLScreenChannel*>(LLChannelManager::getInstance()-> + findChannelByID(LLUUID(gSavedSettings.getString("NotificationChannelUUID")))); + + LLNotifications& instance = LLNotifications::instance(); + + for (LLSD::array_const_iterator notification_it = data.beginArray(); + notification_it != data.endArray(); + ++notification_it) + { + LLSD notification_params = *notification_it; + LLNotificationPtr notification(new LLNotification(notification_params)); + + LLNotificationResponderPtr responder(LLResponderRegistry:: + createResponder(notification_params["name"], notification_params["responder"])); + notification->setResponseFunctor(responder); + + instance.add(notification); + + // hide script floaters so they don't confuse the user and don't overlap startup toast + LLScriptFloaterManager::getInstance()->setFloaterVisible(notification->getID(), false); + + if(notification_channel) + { + // hide saved toasts so they don't confuse the user + notification_channel->hideToast(notification->getID()); + } + } +} + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +LLResponderRegistry::build_map_t LLResponderRegistry::sBuildMap; + +void LLResponderRegistry::registerResponders() +{ + sBuildMap.clear(); + + add("ObjectGiveItem", &create<LLOfferInfo>); + add("UserGiveItem", &create<LLOfferInfo>); +} + +LLNotificationResponderInterface* LLResponderRegistry::createResponder(const std::string& notification_name, const LLSD& params) +{ + build_map_t::const_iterator it = sBuildMap.find(notification_name); + if(sBuildMap.end() == it) + { + return NULL; + } + responder_constructor_t ctr = it->second; + return ctr(params); +} + +void LLResponderRegistry::add(const std::string& notification_name, const responder_constructor_t& ctr) +{ + if(sBuildMap.find(notification_name) != sBuildMap.end()) + { + llwarns << "Responder is already registered : " << notification_name << llendl; + llassert(!"Responder already registered"); + } + sBuildMap[notification_name] = ctr; +} + +// EOF diff --git a/indra/newview/llnotificationstorage.h b/indra/newview/llnotificationstorage.h new file mode 100644 index 0000000000..5050781a85 --- /dev/null +++ b/indra/newview/llnotificationstorage.h @@ -0,0 +1,65 @@ +/** +* @file llnotificationstorage.h +* @brief LLNotificationStorage class declaration +* +* $LicenseInfo:firstyear=2010&license=viewergpl$ +* +* Copyright (c) 2010, Linden Research, Inc. +* +* Second Life Viewer Source Code +* The source code in this file ("Source Code") is provided by Linden Lab +* to you under the terms of the GNU General Public License, version 2.0 +* ("GPL"), unless you have obtained a separate licensing agreement +* ("Other License"), formally executed by you and Linden Lab. Terms of +* the GPL can be found in doc/GPL-license.txt in this distribution, or +* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 +* +* There are special exceptions to the terms and conditions of the GPL as +* it is applied to this Source Code. View the full text of the exception +* in the file doc/FLOSS-exception.txt in this software distribution, or +* online at +* http://secondlifegrid.net/programs/open_source/licensing/flossexception +* +* By copying, modifying or distributing this software, you acknowledge +* that you have read and understood your obligations described above, +* and agree to abide by those obligations. +* +* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO +* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, +* COMPLETENESS OR PERFORMANCE. +* $/LicenseInfo$ +*/ + +#ifndef LL_NOTIFICATIONSTORAGE_H +#define LL_NOTIFICATIONSTORAGE_H + +#include "llnotifications.h" + +// Class that saves not responded(unread) notifications. +// Unread notifications are saved in open_notifications.xml in SL account folder +// +// Notifications that should be saved(if unread) are marked with persist="true" in notifications.xml +// Notifications using functor responders are saved automatically (see llviewermessage.cpp +// lure_callback_reg for example). +// Notifications using object responders(LLOfferInfo) need additional tuning. Responder object should +// be a) serializable(implement LLNotificationResponderInterface), +// b) registered with LLResponderRegistry (found in llnotificationstorage.cpp). +class LLPersistentNotificationStorage : public LLSingleton<LLPersistentNotificationStorage> +{ + LOG_CLASS(LLPersistentNotificationStorage); +public: + + LLPersistentNotificationStorage(); + + void saveNotifications(); + + void loadNotifications(); + +private: + + bool onPersistentChannelChanged(const LLSD& payload); + + std::string mFileName; +}; + +#endif // LL_NOTIFICATIONSTORAGE_H diff --git a/indra/newview/llnotificationtiphandler.cpp b/indra/newview/llnotificationtiphandler.cpp index 83a2215ac6..a06a5770a2 100644 --- a/indra/newview/llnotificationtiphandler.cpp +++ b/indra/newview/llnotificationtiphandler.cpp @@ -40,10 +40,11 @@ #include "lltoastnotifypanel.h" #include "llviewercontrol.h" #include "llviewerwindow.h" +#include "llnotificationmanager.h" +#include "llpaneltiptoast.h" using namespace LLNotificationsUI; - //-------------------------------------------------------------------------- LLTipHandler::LLTipHandler(e_notification_type type, const LLSD& id) { @@ -51,6 +52,10 @@ LLTipHandler::LLTipHandler(e_notification_type type, const LLSD& id) // Getting a Channel for our notifications mChannel = LLChannelManager::getInstance()->createNotificationChannel(); + + LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel); + if(channel) + channel->setOnRejectToastCallback(boost::bind(&LLTipHandler::onRejectToast, this, _1)); } //-------------------------------------------------------------------------- @@ -101,11 +106,16 @@ bool LLTipHandler::processNotification(const LLSD& notify) } } + std::string session_name = notification->getPayload()["SESSION_NAME"]; const std::string name = notification->getSubstitutions()["NAME"]; + if (session_name.empty()) + { + session_name = name; + } LLUUID from_id = notification->getPayload()["from_id"]; if (LLHandlerUtil::canLogToIM(notification)) { - LLHandlerUtil::logToIM(IM_NOTHING_SPECIAL, name, name, + LLHandlerUtil::logToIM(IM_NOTHING_SPECIAL, session_name, name, notification->getMessage(), from_id, from_id); } @@ -114,7 +124,13 @@ bool LLTipHandler::processNotification(const LLSD& notify) LLHandlerUtil::spawnIMSession(name, from_id); } - LLToastNotifyPanel* notify_box = new LLToastNotifyPanel(notification); + // don't spawn toast for inventory accepted/declined offers if respective IM window is open (EXT-5909) + if (!LLHandlerUtil::canSpawnToast(notification)) + { + return true; + } + + LLToastPanel* notify_box = LLToastPanel::buidPanelFromNotification(notification); LLToast::Params p; p.notif_id = notification->getID(); @@ -124,6 +140,8 @@ bool LLTipHandler::processNotification(const LLSD& notify) p.is_tip = true; p.can_be_stored = false; + removeExclusiveNotifications(notification); + LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel); if(channel) channel->addToast(p); @@ -142,4 +160,14 @@ void LLTipHandler::onDeleteToast(LLToast* toast) //-------------------------------------------------------------------------- +void LLTipHandler::onRejectToast(const LLUUID& id) +{ + LLNotificationPtr notification = LLNotifications::instance().find(id); + if (notification + && LLNotificationManager::getInstance()->getHandlerForNotification( + notification->getType()) == this) + { + LLNotifications::instance().cancel(notification); + } +} diff --git a/indra/newview/lloutfitobserver.cpp b/indra/newview/lloutfitobserver.cpp new file mode 100644 index 0000000000..03414b9964 --- /dev/null +++ b/indra/newview/lloutfitobserver.cpp @@ -0,0 +1,147 @@ +/** + * @file lloutfitobserver.cpp + * @brief Outfit observer facade. + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llappearancemgr.h" +#include "lloutfitobserver.h" +#include "llinventorymodel.h" +#include "llviewerinventory.h" + +LLOutfitObserver::LLOutfitObserver() : + mCOFLastVersion(LLViewerInventoryCategory::VERSION_UNKNOWN) +{ + gInventory.addObserver(this); +} + +LLOutfitObserver::~LLOutfitObserver() +{ + if (gInventory.containsObserver(this)) + { + gInventory.removeObserver(this); + } +} + +void LLOutfitObserver::changed(U32 mask) +{ + if (!gInventory.isInventoryUsable()) + return; + + checkCOF(); + + checkBaseOutfit(); +} + +// static +S32 LLOutfitObserver::getCategoryVersion(const LLUUID& cat_id) +{ + LLViewerInventoryCategory* cat = gInventory.getCategory(cat_id); + if (!cat) + return LLViewerInventoryCategory::VERSION_UNKNOWN; + + return cat->getVersion(); +} + +// static +const std::string& LLOutfitObserver::getCategoryName(const LLUUID& cat_id) +{ + LLViewerInventoryCategory* cat = gInventory.getCategory(cat_id); + if (!cat) + return LLStringUtil::null; + + return cat->getName(); +} + +bool LLOutfitObserver::checkCOF() +{ + LLUUID cof = LLAppearanceMgr::getInstance()->getCOF(); + if (cof.isNull()) + return false; + + S32 cof_version = getCategoryVersion(cof); + + if (cof_version == mCOFLastVersion) + return false; + + mCOFLastVersion = cof_version; + + // dirtiness state should be updated before sending signal + LLAppearanceMgr::getInstance()->updateIsDirty(); + mCOFChanged(); + + return true; +} + +void LLOutfitObserver::checkBaseOutfit() +{ + LLUUID baseoutfit_id = + LLAppearanceMgr::getInstance()->getBaseOutfitUUID(); + + if (baseoutfit_id == mBaseOutfitId) + { + if (baseoutfit_id.isNull()) + return; + + const S32 baseoutfit_ver = getCategoryVersion(baseoutfit_id); + const std::string& baseoutfit_name = getCategoryName(baseoutfit_id); + + if (baseoutfit_ver == mBaseOutfitLastVersion + // renaming category doesn't change version, so it's need to check it + && baseoutfit_name == mLastBaseOutfitName) + return; + } + else + { + mBaseOutfitId = baseoutfit_id; + mBOFReplaced(); + + if (baseoutfit_id.isNull()) + return; + } + + mBaseOutfitLastVersion = getCategoryVersion(mBaseOutfitId); + mLastBaseOutfitName = getCategoryName(baseoutfit_id); + + LLAppearanceMgr& app_mgr = LLAppearanceMgr::instance(); + // dirtiness state should be updated before sending signal + app_mgr.updateIsDirty(); + mBOFChanged(); + + if (mLastOutfitDirtiness != app_mgr.isOutfitDirty()) + { + if(!app_mgr.isOutfitDirty()) + { + mCOFSaved(); + } + mLastOutfitDirtiness = app_mgr.isOutfitDirty(); + } +} diff --git a/indra/newview/lloutfitobserver.h b/indra/newview/lloutfitobserver.h new file mode 100644 index 0000000000..3a66b5ea9f --- /dev/null +++ b/indra/newview/lloutfitobserver.h @@ -0,0 +1,99 @@ +/** + * @file lloutfitobserver.h + * @brief Outfit observer facade. + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_OUTFITOBSERVER_H +#define LL_OUTFITOBSERVER_H + +#include "llsingleton.h" + +/** + * Outfit observer facade that provides simple possibility to subscribe on + * BOF(base outfit) replaced, BOF changed, COF(current outfit) changed events. + */ +class LLOutfitObserver: public LLInventoryObserver, public LLSingleton<LLOutfitObserver> +{ +public: + virtual ~LLOutfitObserver(); + + friend class LLSingleton<LLOutfitObserver>; + + virtual void changed(U32 mask); + + void notifyOutfitLockChanged() { mOutfitLockChanged(); } + + typedef boost::signals2::signal<void (void)> signal_t; + + void addBOFReplacedCallback(const signal_t::slot_type& cb) { mBOFReplaced.connect(cb); } + + void addBOFChangedCallback(const signal_t::slot_type& cb) { mBOFChanged.connect(cb); } + + void addCOFChangedCallback(const signal_t::slot_type& cb) { mCOFChanged.connect(cb); } + + void addCOFSavedCallback(const signal_t::slot_type& cb) { mCOFSaved.connect(cb); } + + void addOutfitLockChangedCallback(const signal_t::slot_type& cb) { mOutfitLockChanged.connect(cb); } + +protected: + LLOutfitObserver(); + + /** Get a version of an inventory category specified by its UUID */ + static S32 getCategoryVersion(const LLUUID& cat_id); + + static const std::string& getCategoryName(const LLUUID& cat_id); + + bool checkCOF(); + + void checkBaseOutfit(); + + //last version number of a COF category + S32 mCOFLastVersion; + + LLUUID mBaseOutfitId; + + S32 mBaseOutfitLastVersion; + std::string mLastBaseOutfitName; + + bool mLastOutfitDirtiness; + +private: + signal_t mBOFReplaced; + signal_t mBOFChanged; + signal_t mCOFChanged; + signal_t mCOFSaved; + + /** + * Signal for changing state of outfit lock. + */ + signal_t mOutfitLockChanged; +}; + +#endif /* LL_OUTFITOBSERVER_H */ diff --git a/indra/newview/lloutfitslist.cpp b/indra/newview/lloutfitslist.cpp new file mode 100644 index 0000000000..c5043e1c3d --- /dev/null +++ b/indra/newview/lloutfitslist.cpp @@ -0,0 +1,750 @@ +/** + * @file lloutfitslist.cpp + * @brief List of agent's outfits for My Appearance side panel. + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "lloutfitslist.h" + +// llcommon +#include "llcommonutils.h" + +#include "llaccordionctrl.h" +#include "llaccordionctrltab.h" +#include "llagentwearables.h" +#include "llappearancemgr.h" +#include "llinventoryfunctions.h" +#include "llinventorymodel.h" +#include "lllistcontextmenu.h" +#include "llnotificationsutil.h" +#include "lloutfitobserver.h" +#include "llsidetray.h" +#include "lltransutil.h" +#include "llviewermenu.h" +#include "llvoavatar.h" +#include "llvoavatarself.h" +#include "llwearableitemslist.h" + +static bool is_tab_header_clicked(LLAccordionCtrlTab* tab, S32 y); + +static const LLOutfitTabNameComparator OUTFIT_TAB_NAME_COMPARATOR; + +/*virtual*/ +bool LLOutfitTabNameComparator::compare(const LLAccordionCtrlTab* tab1, const LLAccordionCtrlTab* tab2) const +{ + std::string name1 = tab1->getTitle(); + std::string name2 = tab2->getTitle(); + + LLStringUtil::toUpper(name1); + LLStringUtil::toUpper(name2); + + return name1 < name2; +} + +////////////////////////////////////////////////////////////////////////// + +class OutfitContextMenu : public LLListContextMenu +{ +protected: + /* virtual */ LLContextMenu* createMenu() + { + LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar; + LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar; + LLUUID selected_id = mUUIDs.front(); + + registrar.add("Outfit.WearReplace", + boost::bind(&LLAppearanceMgr::replaceCurrentOutfit, &LLAppearanceMgr::instance(), selected_id)); + registrar.add("Outfit.WearAdd", + boost::bind(&LLAppearanceMgr::addCategoryToCurrentOutfit, &LLAppearanceMgr::instance(), selected_id)); + registrar.add("Outfit.TakeOff", + boost::bind(&LLAppearanceMgr::takeOffOutfit, &LLAppearanceMgr::instance(), selected_id)); + registrar.add("Outfit.Edit", boost::bind(editOutfit)); + registrar.add("Outfit.Rename", boost::bind(renameOutfit, selected_id)); + registrar.add("Outfit.Delete", boost::bind(deleteOutfit, selected_id)); + + enable_registrar.add("Outfit.OnEnable", boost::bind(&OutfitContextMenu::onEnable, this, _2)); + enable_registrar.add("Outfit.OnVisible", boost::bind(&OutfitContextMenu::onVisible, this, _2)); + + return createFromFile("menu_outfit_tab.xml"); + } + + bool onEnable(LLSD::String param) + { + LLUUID outfit_cat_id = mUUIDs.back(); + + if ("rename" == param) + { + return get_is_category_renameable(&gInventory, outfit_cat_id); + } + else if ("wear_add" == param) + { + return LLAppearanceMgr::getCanAddToCOF(outfit_cat_id); + } + else if ("take_off" == param) + { + return LLAppearanceMgr::getCanRemoveFromCOF(outfit_cat_id); + } + + return true; + } + + bool onVisible(LLSD::String param) + { + LLUUID outfit_cat_id = mUUIDs.back(); + bool is_worn = LLAppearanceMgr::instance().getBaseOutfitUUID() == outfit_cat_id; + + if ("edit" == param) + { + return is_worn; + } + else if ("wear_replace" == param) + { + return !is_worn; + } + else if ("delete" == param) + { + return LLAppearanceMgr::instance().getCanRemoveOutfit(outfit_cat_id); + } + + return true; + } + + static void editOutfit() + { + LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD().with("type", "edit_outfit")); + } + + static void renameOutfit(const LLUUID& outfit_cat_id) + { + LLAppearanceMgr::instance().renameOutfit(outfit_cat_id); + } + + static void deleteOutfit(const LLUUID& outfit_cat_id) + { + remove_category(&gInventory, outfit_cat_id); + } +}; + +////////////////////////////////////////////////////////////////////////// + +static LLRegisterPanelClassWrapper<LLOutfitsList> t_outfits_list("outfits_list"); + +LLOutfitsList::LLOutfitsList() + : LLPanel() + , mAccordion(NULL) + , mListCommands(NULL) + , mIsInitialized(false) + , mItemSelected(false) +{ + mCategoriesObserver = new LLInventoryCategoriesObserver(); + + mOutfitMenu = new OutfitContextMenu(); +} + +LLOutfitsList::~LLOutfitsList() +{ + delete mOutfitMenu; + + if (gInventory.containsObserver(mCategoriesObserver)) + { + gInventory.removeObserver(mCategoriesObserver); + delete mCategoriesObserver; + } +} + +BOOL LLOutfitsList::postBuild() +{ + mAccordion = getChild<LLAccordionCtrl>("outfits_accordion"); + mAccordion->setComparator(&OUTFIT_TAB_NAME_COMPARATOR); + + return TRUE; +} + +//virtual +void LLOutfitsList::onOpen(const LLSD& /*info*/) +{ + if (!mIsInitialized) + { + // *TODO: I'm not sure is this check necessary but it never match while developing. + if (!gInventory.isInventoryUsable()) + return; + + const LLUUID outfits = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS); + + // *TODO: I'm not sure is this check necessary but it never match while developing. + LLViewerInventoryCategory* category = gInventory.getCategory(outfits); + if (!category) + return; + + gInventory.addObserver(mCategoriesObserver); + + // Start observing changes in "My Outfits" category. + mCategoriesObserver->addCategory(outfits, + boost::bind(&LLOutfitsList::refreshList, this, outfits)); + + const LLUUID cof = gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT); + + // Start observing changes in Current Outfit category. + mCategoriesObserver->addCategory(cof, boost::bind(&LLOutfitsList::onCOFChanged, this)); + + LLOutfitObserver::instance().addBOFChangedCallback(boost::bind(&LLOutfitsList::highlightBaseOutfit, this)); + LLOutfitObserver::instance().addBOFReplacedCallback(boost::bind(&LLOutfitsList::highlightBaseOutfit, this)); + + // Fetch "My Outfits" contents and refresh the list to display + // initially fetched items. If not all items are fetched now + // the observer will refresh the list as soon as the new items + // arrive. + category->fetch(); + refreshList(outfits); + highlightBaseOutfit(); + + mIsInitialized = true; + } +} + +void LLOutfitsList::refreshList(const LLUUID& category_id) +{ + LLInventoryModel::cat_array_t cat_array; + LLInventoryModel::item_array_t item_array; + + // Collect all sub-categories of a given category. + LLIsType is_category(LLAssetType::AT_CATEGORY); + gInventory.collectDescendentsIf( + category_id, + cat_array, + item_array, + LLInventoryModel::EXCLUDE_TRASH, + is_category); + + uuid_vec_t vadded; + uuid_vec_t vremoved; + + // Create added and removed items vectors. + computeDifference(cat_array, vadded, vremoved); + + // Handle added tabs. + for (uuid_vec_t::const_iterator iter = vadded.begin(); + iter != vadded.end(); + ++iter) + { + const LLUUID cat_id = (*iter); + LLViewerInventoryCategory *cat = gInventory.getCategory(cat_id); + if (!cat) continue; + + std::string name = cat->getName(); + + static LLXMLNodePtr accordionXmlNode = getAccordionTabXMLNode(); + LLAccordionCtrlTab* tab = LLUICtrlFactory::defaultBuilder<LLAccordionCtrlTab>(accordionXmlNode, NULL, NULL); + + tab->setName(name); + tab->setTitle(name); + + // *TODO: LLUICtrlFactory::defaultBuilder does not use "display_children" from xml. Should be investigated. + tab->setDisplayChildren(false); + mAccordion->addCollapsibleCtrl(tab); + + // Start observing the new outfit category. + LLWearableItemsList* list = tab->getChild<LLWearableItemsList>("wearable_items_list"); + if (!mCategoriesObserver->addCategory(cat_id, boost::bind(&LLWearableItemsList::updateList, list, cat_id))) + { + // Remove accordion tab if category could not be added to observer. + mAccordion->removeCollapsibleCtrl(tab); + continue; + } + + // Map the new tab with outfit category UUID. + mOutfitsMap.insert(LLOutfitsList::outfits_map_value_t(cat_id, tab)); + + tab->setRightMouseDownCallback(boost::bind(&LLOutfitsList::onAccordionTabRightClick, this, + _1, _2, _3, cat_id)); + + // Setting tab focus callback to monitor currently selected outfit. + tab->setFocusReceivedCallback(boost::bind(&LLOutfitsList::changeOutfitSelection, this, list, cat_id)); + + // Setting list commit callback to monitor currently selected wearable item. + list->setCommitCallback(boost::bind(&LLOutfitsList::onSelectionChange, this, _1)); + + // Setting list refresh callback to apply filter on list change. + list->setRefreshCompleteCallback(boost::bind(&LLOutfitsList::onFilteredWearableItemsListRefresh, this, _1)); + + list->setRightMouseDownCallback(boost::bind(&LLOutfitsList::onWearableItemsListRightClick, this, _1, _2, _3)); + + // Fetch the new outfit contents. + cat->fetch(); + + // Refresh the list of outfit items after fetch(). + // Further list updates will be triggered by the category observer. + list->updateList(cat_id); + + // If filter is currently applied we store the initial tab state and + // open it to show matched items if any. + if (!mFilterSubString.empty()) + { + tab->notifyChildren(LLSD().with("action","store_state")); + tab->setDisplayChildren(true); + + // Setting mForceRefresh flag will make the list refresh its contents + // even if it is not currently visible. This is required to apply the + // filter to the newly added list. + list->setForceRefresh(true); + + list->setFilterSubString(mFilterSubString); + } + } + + // Handle removed tabs. + for (uuid_vec_t::const_iterator iter=vremoved.begin(); iter != vremoved.end(); iter++) + { + outfits_map_t::iterator outfits_iter = mOutfitsMap.find((*iter)); + if (outfits_iter != mOutfitsMap.end()) + { + const LLUUID& outfit_id = outfits_iter->first; + LLAccordionCtrlTab* tab = outfits_iter->second; + + // An outfit is removed from the list. Do the following: + // 1. Remove outfit category from observer to stop monitoring its changes. + mCategoriesObserver->removeCategory(outfit_id); + + // 2. Remove the outfit from selection. + deselectOutfit(outfit_id); + + // 3. Remove category UUID to accordion tab mapping. + mOutfitsMap.erase(outfits_iter); + + // 4. Remove outfit tab from accordion. + mAccordion->removeCollapsibleCtrl(tab); + } + } + + // Get changed items from inventory model and update outfit tabs + // which might have been renamed. + const LLInventoryModel::changed_items_t& changed_items = gInventory.getChangedIDs(); + for (LLInventoryModel::changed_items_t::const_iterator items_iter = changed_items.begin(); + items_iter != changed_items.end(); + ++items_iter) + { + updateOutfitTab(*items_iter); + } + + mAccordion->sort(); +} + +void LLOutfitsList::highlightBaseOutfit() +{ + // id of base outfit + LLUUID base_id = LLAppearanceMgr::getInstance()->getBaseOutfitUUID(); + if (base_id != mHighlightedOutfitUUID) + { + if (mOutfitsMap[mHighlightedOutfitUUID]) + { + mOutfitsMap[mHighlightedOutfitUUID]->setTitleFontStyle("NORMAL"); + } + + mHighlightedOutfitUUID = base_id; + } + if (mOutfitsMap[base_id]) + { + mOutfitsMap[base_id]->setTitleFontStyle("BOLD"); + } +} + +void LLOutfitsList::onSelectionChange(LLUICtrl* ctrl) +{ + LLWearableItemsList* list = dynamic_cast<LLWearableItemsList*>(ctrl); + if (!list) return; + + LLViewerInventoryItem *item = gInventory.getItem(list->getSelectedUUID()); + if (!item) return; + + changeOutfitSelection(list, item->getParentUUID()); +} + +void LLOutfitsList::performAction(std::string action) +{ + if (mSelectedOutfitUUID.isNull()) return; + + LLViewerInventoryCategory* cat = gInventory.getCategory(mSelectedOutfitUUID); + if (!cat) return; + + if ("replaceoutfit" == action) + { + LLAppearanceMgr::instance().wearInventoryCategory( cat, FALSE, FALSE ); + } + else if ("addtooutfit" == action) + { + LLAppearanceMgr::instance().wearInventoryCategory( cat, FALSE, TRUE ); + } + else if ("rename_outfit" == action) + { + LLAppearanceMgr::instance().renameOutfit(mSelectedOutfitUUID); + } +} + +void LLOutfitsList::setFilterSubString(const std::string& string) +{ + applyFilter(string); + + mFilterSubString = string; +} + +boost::signals2::connection LLOutfitsList::addSelectionChangeCallback(selection_change_callback_t cb) +{ + return mSelectionChangeSignal.connect(cb); +} + +bool LLOutfitsList::hasItemSelected() +{ + return mItemSelected; +} + +////////////////////////////////////////////////////////////////////////// +// Private methods +////////////////////////////////////////////////////////////////////////// +LLXMLNodePtr LLOutfitsList::getAccordionTabXMLNode() +{ + LLXMLNodePtr xmlNode = NULL; + bool success = LLUICtrlFactory::getLayeredXMLNode("outfit_accordion_tab.xml", xmlNode); + if (!success) + { + llwarns << "Failed to read xml of Outfit's Accordion Tab from outfit_accordion_tab.xml" << llendl; + return NULL; + } + + return xmlNode; +} + +void LLOutfitsList::computeDifference( + const LLInventoryModel::cat_array_t& vcats, + uuid_vec_t& vadded, + uuid_vec_t& vremoved) +{ + uuid_vec_t vnew; + // Creating a vector of newly collected sub-categories UUIDs. + for (LLInventoryModel::cat_array_t::const_iterator iter = vcats.begin(); + iter != vcats.end(); + iter++) + { + vnew.push_back((*iter)->getUUID()); + } + + uuid_vec_t vcur; + // Creating a vector of currently displayed sub-categories UUIDs. + for (outfits_map_t::const_iterator iter = mOutfitsMap.begin(); + iter != mOutfitsMap.end(); + iter++) + { + vcur.push_back((*iter).first); + } + + LLCommonUtils::computeDifference(vnew, vcur, vadded, vremoved); +} + +void LLOutfitsList::updateOutfitTab(const LLUUID& category_id) +{ + outfits_map_t::iterator outfits_iter = mOutfitsMap.find(category_id); + if (outfits_iter != mOutfitsMap.end()) + { + LLViewerInventoryCategory *cat = gInventory.getCategory(category_id); + if (!cat) return; + + std::string name = cat->getName(); + + // Update tab name with the new category name. + LLAccordionCtrlTab* tab = outfits_iter->second; + if (tab) + { + tab->setName(name); + tab->setTitle(name); + } + } +} + +void LLOutfitsList::changeOutfitSelection(LLWearableItemsList* list, const LLUUID& category_id) +{ + MASK mask = gKeyboard->currentMask(TRUE); + + // Reset selection in all previously selected tabs except for the current + // if new selection is started. + if (list && !(mask & MASK_CONTROL)) + { + for (wearables_lists_map_t::iterator iter = mSelectedListsMap.begin(); + iter != mSelectedListsMap.end(); + ++iter) + { + LLWearableItemsList* selected_list = (*iter).second; + if (selected_list != list) + { + selected_list->resetSelection(); + } + } + + // Clear current selection. + mSelectedListsMap.clear(); + } + + mItemSelected = list && (list->getSelectedItem() != NULL); + + mSelectedListsMap.insert(wearables_lists_map_value_t(category_id, list)); + setSelectedOutfitUUID(category_id); +} + +void LLOutfitsList::setSelectedOutfitUUID(const LLUUID& category_id) +{ + mSelectionChangeSignal(mSelectedOutfitUUID = category_id); +} + +void LLOutfitsList::deselectOutfit(const LLUUID& category_id) +{ + // Remove selected lists map entry. + mSelectedListsMap.erase(category_id); + + // Reset selection if the outfit is selected. + if (category_id == mSelectedOutfitUUID) + { + setSelectedOutfitUUID(LLUUID::null); + } +} + +void LLOutfitsList::restoreOutfitSelection(LLAccordionCtrlTab* tab, const LLUUID& category_id) +{ + // Try restoring outfit selection after filtering. + if (mAccordion->getSelectedTab() == tab) + { + setSelectedOutfitUUID(category_id); + } +} + +void LLOutfitsList::onFilteredWearableItemsListRefresh(LLUICtrl* ctrl) +{ + if (!ctrl || mFilterSubString.empty()) + return; + + for (outfits_map_t::iterator + iter = mOutfitsMap.begin(), + iter_end = mOutfitsMap.end(); + iter != iter_end; ++iter) + { + LLAccordionCtrlTab* tab = iter->second; + if (!tab) continue; + + LLWearableItemsList* list = dynamic_cast<LLWearableItemsList*>(tab->getAccordionView()); + if (list != ctrl) continue; + + applyFilterToTab(iter->first, tab, mFilterSubString); + } +} + +void LLOutfitsList::applyFilter(const std::string& new_filter_substring) +{ + mAccordion->setFilterSubString(new_filter_substring); + + for (outfits_map_t::iterator + iter = mOutfitsMap.begin(), + iter_end = mOutfitsMap.end(); + iter != iter_end; ++iter) + { + LLAccordionCtrlTab* tab = iter->second; + if (!tab) continue; + + bool more_restrictive = mFilterSubString.size() < new_filter_substring.size() && !new_filter_substring.substr(0, mFilterSubString.size()).compare(mFilterSubString); + + // Restore tab visibility in case of less restrictive filter + // to compare it with updated string if it was previously hidden. + if (!more_restrictive) + { + tab->setVisible(TRUE); + } + + LLWearableItemsList* list = dynamic_cast<LLWearableItemsList*>(tab->getAccordionView()); + if (list) + { + list->setFilterSubString(new_filter_substring); + } + + if(mFilterSubString.empty() && !new_filter_substring.empty()) + { + //store accordion tab state when filter is not empty + tab->notifyChildren(LLSD().with("action","store_state")); + } + + if (!new_filter_substring.empty()) + { + applyFilterToTab(iter->first, tab, new_filter_substring); + + if (tab->getVisible()) + { + // Open tab if it has passed the filter. + tab->setDisplayChildren(true); + } + else + { + // Set force refresh flag to refresh not visible list + // when some changes occur in it. + list->setForceRefresh(true); + } + } + else + { + // restore tab title when filter is empty + tab->setTitle(tab->getTitle()); + + //restore accordion state after all those accodrion tab manipulations + tab->notifyChildren(LLSD().with("action","restore_state")); + + // Try restoring the tab selection. + restoreOutfitSelection(tab, iter->first); + } + } +} + +void LLOutfitsList::applyFilterToTab( + const LLUUID& category_id, + LLAccordionCtrlTab* tab, + const std::string& filter_substring) +{ + if (!tab) return; + LLWearableItemsList* list = dynamic_cast<LLWearableItemsList*>(tab->getAccordionView()); + if (!list) return; + + std::string title = tab->getTitle(); + LLStringUtil::toUpper(title); + + std::string cur_filter = filter_substring; + LLStringUtil::toUpper(cur_filter); + + tab->setTitle(tab->getTitle(), cur_filter); + + if (std::string::npos == title.find(cur_filter)) + { + // hide tab if its title doesn't pass filter + // and it has no visible items + tab->setVisible(list->size() > 0); + + // remove title highlighting because it might + // have been previously highlighted by less restrictive filter + tab->setTitle(tab->getTitle()); + + // Remove the tab from selection. + deselectOutfit(category_id); + } + else + { + // Try restoring the tab selection. + restoreOutfitSelection(tab, category_id); + } +} + +void LLOutfitsList::onAccordionTabRightClick(LLUICtrl* ctrl, S32 x, S32 y, const LLUUID& cat_id) +{ + LLAccordionCtrlTab* tab = dynamic_cast<LLAccordionCtrlTab*>(ctrl); + if(mOutfitMenu && is_tab_header_clicked(tab, y) && cat_id.notNull()) + { + // Focus tab header to trigger tab selection change. + LLUICtrl* header = tab->findChild<LLUICtrl>("dd_header"); + if (header) + { + header->setFocus(TRUE); + } + + uuid_vec_t selected_uuids; + selected_uuids.push_back(cat_id); + mOutfitMenu->show(ctrl, selected_uuids, x, y); + } +} + +void LLOutfitsList::onWearableItemsListRightClick(LLUICtrl* ctrl, S32 x, S32 y) +{ + LLWearableItemsList* list = dynamic_cast<LLWearableItemsList*>(ctrl); + if (!list) return; + + uuid_vec_t selected_uuids; + + // Collect seleted items from all selected lists. + for (wearables_lists_map_t::iterator iter = mSelectedListsMap.begin(); + iter != mSelectedListsMap.end(); + ++iter) + { + uuid_vec_t uuids; + (*iter).second->getSelectedUUIDs(uuids); + + S32 prev_size = selected_uuids.size(); + selected_uuids.resize(prev_size + uuids.size()); + std::copy(uuids.begin(), uuids.end(), selected_uuids.begin() + prev_size); + } + + LLWearableItemsList::ContextMenu::instance().show(list, selected_uuids, x, y); +} + +void LLOutfitsList::onCOFChanged() +{ + LLInventoryModel::changed_items_t changed_linked_items; + + const LLInventoryModel::changed_items_t& changed_items = gInventory.getChangedIDs(); + for (LLInventoryModel::changed_items_t::const_iterator iter = changed_items.begin(); + iter != changed_items.end(); + ++iter) + { + LLViewerInventoryItem* item = gInventory.getItem(*iter); + if (item) + { + // From gInventory we get the UUIDs of new links added to COF + // or removed from COF. These links UUIDs are not the same UUIDs + // that we have in each wearable items list. So we collect base items + // UUIDs to find all items or links that point to same base items in wearable + // items lists and update their worn state there. + changed_linked_items.insert(item->getLinkedUUID()); + } + } + + for (outfits_map_t::iterator iter = mOutfitsMap.begin(); + iter != mOutfitsMap.end(); + ++iter) + { + LLAccordionCtrlTab* tab = iter->second; + if (!tab) continue; + + LLWearableItemsList* list = dynamic_cast<LLWearableItemsList*>(tab->getAccordionView()); + if (!list) continue; + + // Every list updates the labels of changed items or + // the links that point to these items. + list->updateChangedItems(changed_linked_items); + } +} + +bool is_tab_header_clicked(LLAccordionCtrlTab* tab, S32 y) +{ + if(!tab || !tab->getHeaderVisible()) return false; + + S32 header_bottom = tab->getLocalRect().getHeight() - tab->getHeaderHeight(); + return y >= header_bottom; +} + +// EOF diff --git a/indra/newview/lloutfitslist.h b/indra/newview/lloutfitslist.h new file mode 100644 index 0000000000..df65f7187b --- /dev/null +++ b/indra/newview/lloutfitslist.h @@ -0,0 +1,197 @@ +/** + * @file lloutfitslist.h + * @brief List of agent's outfits for My Appearance side panel. + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLOUTFITSLIST_H +#define LL_LLOUTFITSLIST_H + +#include "llaccordionctrl.h" +#include "llpanel.h" + +// newview +#include "llinventorymodel.h" +#include "llinventoryobserver.h" + +class LLAccordionCtrlTab; +class LLWearableItemsList; +class LLListContextMenu; + +/** + * @class LLOutfitTabNameComparator + * + * Comparator of outfit tabs. + */ +class LLOutfitTabNameComparator : public LLAccordionCtrl::LLTabComparator +{ + LOG_CLASS(LLOutfitTabNameComparator); + +public: + LLOutfitTabNameComparator() {}; + virtual ~LLOutfitTabNameComparator() {}; + + /*virtual*/ bool compare(const LLAccordionCtrlTab* tab1, const LLAccordionCtrlTab* tab2) const; +}; + +/** + * @class LLOutfitsList + * + * A list of agents's outfits from "My Outfits" inventory category + * which displays each outfit in an accordion tab with a flat list + * of items inside it. + * + * Starts fetching nevessary inventory content on first openning. + */ +class LLOutfitsList : public LLPanel +{ +public: + typedef boost::function<void (const LLUUID&)> selection_change_callback_t; + typedef boost::signals2::signal<void (const LLUUID&)> selection_change_signal_t; + + LLOutfitsList(); + virtual ~LLOutfitsList(); + + /*virtual*/ BOOL postBuild(); + + /*virtual*/ void onOpen(const LLSD& info); + + void refreshList(const LLUUID& category_id); + + // highlits currently worn outfit tab text and unhighlights previously worn + void highlightBaseOutfit(); + + void performAction(std::string action); + + void setFilterSubString(const std::string& string); + + const LLUUID& getSelectedOutfitUUID() const { return mSelectedOutfitUUID; } + + boost::signals2::connection addSelectionChangeCallback(selection_change_callback_t cb); + + /** + * Returns true if there is a selection inside currently selected outfit + */ + bool hasItemSelected(); + +private: + /** + * Reads xml with accordion tab and Flat list from xml file. + * + * @return LLPointer to XMLNode with accordion tab and flat list. + */ + LLXMLNodePtr getAccordionTabXMLNode(); + + /** + * Wrapper for LLCommonUtils::computeDifference. @see LLCommonUtils::computeDifference + */ + void computeDifference(const LLInventoryModel::cat_array_t& vcats, uuid_vec_t& vadded, uuid_vec_t& vremoved); + + /** + * Updates tab displaying outfit identified by category_id. + */ + void updateOutfitTab(const LLUUID& category_id); + + /** + * Resets previous selection and stores newly selected list and outfit id. + */ + void changeOutfitSelection(LLWearableItemsList* list, const LLUUID& category_id); + + /** + * Saves newly selected outfit ID. + */ + void setSelectedOutfitUUID(const LLUUID& category_id); + + /** + * Removes the outfit from selection. + */ + void deselectOutfit(const LLUUID& category_id); + + /** + * Try restoring selection for a temporary hidden tab. + * + * A tab may be hidden if it doesn't match current filter. + */ + void restoreOutfitSelection(LLAccordionCtrlTab* tab, const LLUUID& category_id); + + /** + * Called upon list refresh event to update tab visibility depending on + * the results of applying filter to the title and list items of the tab. + */ + void onFilteredWearableItemsListRefresh(LLUICtrl* ctrl); + + /** + * Highlights filtered items and hides tabs which haven't passed filter. + */ + void applyFilter(const std::string& new_filter_substring); + + /** + * Applies filter to the given tab + * + * @see applyFilter() + */ + void applyFilterToTab(const LLUUID& category_id, LLAccordionCtrlTab* tab, const std::string& filter_substring); + + void onAccordionTabRightClick(LLUICtrl* ctrl, S32 x, S32 y, const LLUUID& cat_id); + void onWearableItemsListRightClick(LLUICtrl* ctrl, S32 x, S32 y); + void onCOFChanged(); + + void onSelectionChange(LLUICtrl* ctrl); + + static void onOutfitRename(const LLSD& notification, const LLSD& response); + + LLInventoryCategoriesObserver* mCategoriesObserver; + + LLAccordionCtrl* mAccordion; + LLPanel* mListCommands; + + typedef std::map<LLUUID, LLWearableItemsList*> wearables_lists_map_t; + typedef wearables_lists_map_t::value_type wearables_lists_map_value_t; + wearables_lists_map_t mSelectedListsMap; + + LLUUID mSelectedOutfitUUID; + // id of currently highlited outfit + LLUUID mHighlightedOutfitUUID; + selection_change_signal_t mSelectionChangeSignal; + + std::string mFilterSubString; + + typedef std::map<LLUUID, LLAccordionCtrlTab*> outfits_map_t; + typedef outfits_map_t::value_type outfits_map_value_t; + outfits_map_t mOutfitsMap; + + LLListContextMenu* mOutfitMenu; + + bool mIsInitialized; + /** + * True if there is a selection inside currently selected outfit + */ + bool mItemSelected; +}; + +#endif //LL_LLOUTFITSLIST_H diff --git a/indra/newview/lloutputmonitorctrl.cpp b/indra/newview/lloutputmonitorctrl.cpp index 388fdeea7a..197a0ef728 100644 --- a/indra/newview/lloutputmonitorctrl.cpp +++ b/indra/newview/lloutputmonitorctrl.cpp @@ -142,7 +142,7 @@ void LLOutputMonitorCtrl::draw() // Copied from llmediaremotectrl.cpp // *TODO: Give the LLOutputMonitorCtrl an agent-id to monitor, then - // call directly into gVoiceClient to ask if that agent-id is muted, is + // call directly into LLVoiceClient::getInstance() to ask if that agent-id is muted, is // speaking, and what power. This avoids duplicating data, which can get // out of sync. const F32 LEVEL_0 = LLVoiceClient::OVERDRIVEN_POWER_LEVEL / 3.f; @@ -151,14 +151,14 @@ void LLOutputMonitorCtrl::draw() if (getVisible() && mAutoUpdate && !mIsMuted && mSpeakerId.notNull()) { - setPower(gVoiceClient->getCurrentPower(mSpeakerId)); + setPower(LLVoiceClient::getInstance()->getCurrentPower(mSpeakerId)); if(mIsAgentControl) { - setIsTalking(gVoiceClient->getUserPTTState()); + setIsTalking(LLVoiceClient::getInstance()->getUserPTTState()); } else { - setIsTalking(gVoiceClient->getIsSpeaking(mSpeakerId)); + setIsTalking(LLVoiceClient::getInstance()->getIsSpeaking(mSpeakerId)); } } @@ -247,8 +247,13 @@ void LLOutputMonitorCtrl::draw() gl_rect_2d(0, monh, monw, 0, sColorBound, FALSE); } -void LLOutputMonitorCtrl::setSpeakerId(const LLUUID& speaker_id) +void LLOutputMonitorCtrl::setSpeakerId(const LLUUID& speaker_id, const LLUUID& session_id/* = LLUUID::null*/) { + if (speaker_id.isNull() && mSpeakerId.notNull()) + { + LLSpeakingIndicatorManager::unregisterSpeakingIndicator(mSpeakerId, this); + } + if (speaker_id.isNull() || speaker_id == mSpeakerId) return; if (mSpeakerId.notNull()) @@ -256,8 +261,9 @@ void LLOutputMonitorCtrl::setSpeakerId(const LLUUID& speaker_id) // Unregister previous registration to avoid crash. EXT-4782. LLSpeakingIndicatorManager::unregisterSpeakingIndicator(mSpeakerId, this); } + mSpeakerId = speaker_id; - LLSpeakingIndicatorManager::registerSpeakingIndicator(mSpeakerId, this); + LLSpeakingIndicatorManager::registerSpeakingIndicator(mSpeakerId, this, session_id); //mute management if (mAutoUpdate) @@ -297,7 +303,7 @@ void LLOutputMonitorCtrl::switchIndicator(bool switch_on) } // otherwise remember necessary state and mark itself as dirty. - // State will be applied i next draw when parents chain became visible. + // State will be applied in next draw when parents chain becomes visible. else { LL_DEBUGS("SpeakingIndicator") << "Indicator is not in visible chain, parent won't be notified: " << mSpeakerId << LL_ENDL; @@ -311,7 +317,7 @@ void LLOutputMonitorCtrl::switchIndicator(bool switch_on) ////////////////////////////////////////////////////////////////////////// void LLOutputMonitorCtrl::notifyParentVisibilityChanged() { - LL_DEBUGS("SpeakingIndicator") << "Notify parent that visibility was changed: " << mSpeakerId << " ,new_visibility: " << getVisible() << LL_ENDL; + LL_DEBUGS("SpeakingIndicator") << "Notify parent that visibility was changed: " << mSpeakerId << ", new_visibility: " << getVisible() << LL_ENDL; LLSD params = LLSD().with("visibility_changed", getVisible()); diff --git a/indra/newview/lloutputmonitorctrl.h b/indra/newview/lloutputmonitorctrl.h index 2bbfa251e9..3a83da67e2 100644 --- a/indra/newview/lloutputmonitorctrl.h +++ b/indra/newview/lloutputmonitorctrl.h @@ -86,7 +86,15 @@ public: void setIsTalking(bool val) { mIsTalking = val; } - void setSpeakerId(const LLUUID& speaker_id); + /** + * Sets avatar UUID to interact with voice channel. + * + * @param speaker_id LLUUID of an avatar whose voice level is displayed. + * @param session_id session UUID for which indicator should be shown only. Passed to LLSpeakingIndicatorManager + * If this parameter is set registered indicator will be shown only in voice channel + * which has the same session id (EXT-5562). + */ + void setSpeakerId(const LLUUID& speaker_id, const LLUUID& session_id = LLUUID::null); //called by mute list virtual void onChange(); @@ -135,7 +143,7 @@ private: LLPointer<LLUIImage> mImageLevel2; LLPointer<LLUIImage> mImageLevel3; - /** whether to deal with gVoiceClient directly */ + /** whether to deal with LLVoiceClient::getInstance() directly */ bool mAutoUpdate; /** uuid of a speaker being monitored */ diff --git a/indra/newview/lloverlaybar.cpp b/indra/newview/lloverlaybar.cpp index 67e048885f..3f1b23ba14 100644 --- a/indra/newview/lloverlaybar.cpp +++ b/indra/newview/lloverlaybar.cpp @@ -258,7 +258,7 @@ void LLOverlayBar::refresh() { // update "remotes" childSetVisible("media_remote_container", TRUE); - childSetVisible("voice_remote_container", LLVoiceClient::voiceEnabled()); + childSetVisible("voice_remote_container", LLVoiceClient::getInstance()->voiceEnabled()); childSetVisible("state_buttons", TRUE); } diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp index 4a7cdfc856..0b31ffc9a0 100644 --- a/indra/newview/llpanelavatar.cpp +++ b/indra/newview/llpanelavatar.cpp @@ -47,12 +47,11 @@ #include "lltooldraganddrop.h" #include "llscrollcontainer.h" #include "llavatariconctrl.h" -#include "llweb.h" -#include "llfloaterworldmap.h" #include "llfloaterreg.h" #include "llnotificationsutil.h" #include "llvoiceclient.h" #include "llnamebox.h" +#include "lltrans.h" //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Class LLDropTarget @@ -165,7 +164,7 @@ BOOL LLPanelAvatarNotes::postBuild() resetControls(); resetData(); - gVoiceClient->addObserver((LLVoiceClientStatusObserver*)this); + LLVoiceClient::getInstance()->addObserver((LLVoiceClientStatusObserver*)this); return TRUE; } @@ -196,10 +195,9 @@ void LLPanelAvatarNotes::fillRightsData() childSetValue("map_check",LLRelationship::GRANT_MAP_LOCATION & rights ? TRUE : FALSE); childSetValue("objects_check",LLRelationship::GRANT_MODIFY_OBJECTS & rights ? TRUE : FALSE); - childSetEnabled("status_check",TRUE); - childSetEnabled("map_check",TRUE); - childSetEnabled("objects_check",TRUE); } + + enableCheckboxes(NULL != relation); } void LLPanelAvatarNotes::onCommitNotes() @@ -250,6 +248,17 @@ void LLPanelAvatarNotes::confirmModifyRights(bool grant, S32 rights) void LLPanelAvatarNotes::onCommitRights() { + const LLRelationship* buddy_relationship = + LLAvatarTracker::instance().getBuddyInfo(getAvatarId()); + + if (NULL == buddy_relationship) + { + // Lets have a warning log message instead of having a crash. EXT-4947. + llwarns << "Trying to modify rights for non-friend avatar. Skipped." << llendl; + return; + } + + S32 rights = 0; if(childGetValue("status_check").asBoolean()) @@ -259,8 +268,6 @@ void LLPanelAvatarNotes::onCommitRights() if(childGetValue("objects_check").asBoolean()) rights |= LLRelationship::GRANT_MODIFY_OBJECTS; - const LLRelationship* buddy_relationship = - LLAvatarTracker::instance().getBuddyInfo(getAvatarId()); bool allow_modify_objects = childGetValue("objects_check").asBoolean(); // if modify objects checkbox clicked @@ -304,9 +311,7 @@ void LLPanelAvatarNotes::resetControls() //Disable "Add Friend" button for friends. childSetEnabled("add_friend", TRUE); - childSetEnabled("status_check",FALSE); - childSetEnabled("map_check",FALSE); - childSetEnabled("objects_check",FALSE); + enableCheckboxes(false); } void LLPanelAvatarNotes::onAddFriendButtonClick() @@ -334,13 +339,22 @@ void LLPanelAvatarNotes::onShareButtonClick() //*TODO not implemented. } +void LLPanelAvatarNotes::enableCheckboxes(bool enable) +{ + childSetEnabled("status_check", enable); + childSetEnabled("map_check", enable); + childSetEnabled("objects_check", enable); +} + LLPanelAvatarNotes::~LLPanelAvatarNotes() { if(getAvatarId().notNull()) { LLAvatarTracker::instance().removeParticularFriendObserver(getAvatarId(), this); - if(LLVoiceClient::getInstance()) + if(LLVoiceClient::instanceExists()) + { LLVoiceClient::getInstance()->removeObserver((LLVoiceClientStatusObserver*)this); + } } } @@ -348,6 +362,9 @@ LLPanelAvatarNotes::~LLPanelAvatarNotes() void LLPanelAvatarNotes::changed(U32 mask) { childSetEnabled("teleport", LLAvatarTracker::instance().isBuddyOnline(getAvatarId())); + + // update rights to avoid have checkboxes enabled when friendship is terminated. EXT-4947. + fillRightsData(); } // virtual @@ -358,7 +375,7 @@ void LLPanelAvatarNotes::onChange(EStatusType status, const std::string &channel return; } - childSetEnabled("call", LLVoiceClient::voiceEnabled() && gVoiceClient->voiceWorking()); + childSetEnabled("call", LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking()); } void LLPanelAvatarNotes::setAvatarId(const LLUUID& id) @@ -431,26 +448,25 @@ void LLPanelProfileTab::scrollToTop() void LLPanelProfileTab::onMapButtonClick() { - std::string name; - gCacheName->getFullName(getAvatarId(), name); - gFloaterWorldMap->trackAvatar(getAvatarId(), name); - LLFloaterReg::showInstance("world_map"); + LLAvatarActions::showOnMap(getAvatarId()); } void LLPanelProfileTab::updateButtons() { - bool is_avatar_online = LLAvatarTracker::instance().isBuddyOnline(getAvatarId()); + bool is_buddy_online = LLAvatarTracker::instance().isBuddyOnline(getAvatarId()); if(LLAvatarActions::isFriend(getAvatarId())) { - childSetEnabled("teleport", is_avatar_online); + childSetEnabled("teleport", is_buddy_online); } else { childSetEnabled("teleport", true); } - bool enable_map_btn = is_avatar_online && gAgent.isGodlike() || is_agent_mappable(getAvatarId()); + bool enable_map_btn = (is_buddy_online && + is_agent_mappable(getAvatarId())) + || gAgent.isGodlike(); childSetEnabled("show_on_map_btn", enable_map_btn); } @@ -470,7 +486,6 @@ LLPanelAvatarProfile::LLPanelAvatarProfile() BOOL LLPanelAvatarProfile::postBuild() { - childSetActionTextbox("homepage_edit", boost::bind(&LLPanelAvatarProfile::onHomepageTextboxClicked, this)); childSetCommitCallback("add_friend",(boost::bind(&LLPanelAvatarProfile::onAddFriendButtonClick,this)),NULL); childSetCommitCallback("im",(boost::bind(&LLPanelAvatarProfile::onIMButtonClick,this)),NULL); childSetCommitCallback("call",(boost::bind(&LLPanelAvatarProfile::onCallButtonClick,this)),NULL); @@ -481,6 +496,7 @@ BOOL LLPanelAvatarProfile::postBuild() &LLPanelAvatarProfile::onMapButtonClick, this)), NULL); LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar; + registrar.add("Profile.ShowOnMap", boost::bind(&LLPanelAvatarProfile::onMapButtonClick, this)); registrar.add("Profile.Pay", boost::bind(&LLPanelAvatarProfile::pay, this)); registrar.add("Profile.Share", boost::bind(&LLPanelAvatarProfile::share, this)); registrar.add("Profile.BlockUnblock", boost::bind(&LLPanelAvatarProfile::toggleBlock, this)); @@ -490,9 +506,10 @@ BOOL LLPanelAvatarProfile::postBuild() registrar.add("Profile.CSR", boost::bind(&LLPanelAvatarProfile::csr, this)); LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable; + enable.add("Profile.EnableShowOnMap", boost::bind(&LLPanelAvatarProfile::enableShowOnMap, this)); enable.add("Profile.EnableGod", boost::bind(&enable_god)); - enable.add("Profile.CheckItem", boost::bind(&LLPanelAvatarProfile::checkOverflowMenuItem, this, _2)); - enable.add("Profile.EnableItem", boost::bind(&LLPanelAvatarProfile::enableOverflowMenuItem, this, _2)); + enable.add("Profile.EnableBlock", boost::bind(&LLPanelAvatarProfile::enableBlock, this)); + enable.add("Profile.EnableUnblock", boost::bind(&LLPanelAvatarProfile::enableUnblock, this)); mProfileMenu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_profile_overflow.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); @@ -502,7 +519,7 @@ BOOL LLPanelAvatarProfile::postBuild() pic = getChild<LLTextureCtrl>("real_world_pic"); pic->setFallbackImageName("default_profile_picture.j2c"); - gVoiceClient->addObserver((LLVoiceClientStatusObserver*)this); + LLVoiceClient::getInstance()->addObserver((LLVoiceClientStatusObserver*)this); resetControls(); resetData(); @@ -629,7 +646,11 @@ void LLPanelAvatarProfile::fillCommonData(const LLAvatarData* avatar_data) LLAvatarIconIDCache::getInstance()->remove(avatar_data->avatar_id); LLStringUtil::format_map_t args; - args["[REG_DATE]"] = avatar_data->born_on; + { + std::string birth_date = LLTrans::getString("AvatarBirthDateFormat"); + LLStringUtil::format(birth_date, LLSD().with("datetime", (S32) avatar_data->born_on.secondsSinceEpoch())); + args["[REG_DATE]"] = birth_date; + } args["[AGE]"] = LLDateUtil::ageFromDate( avatar_data->born_on, LLDate::now()); std::string register_date = getString("RegisterDateFormat", args); childSetValue("register_date", register_date ); @@ -669,39 +690,38 @@ void LLPanelAvatarProfile::fillAccountStatus(const LLAvatarData* avatar_data) childSetValue("acc_status_text", caption_text); } -bool LLPanelAvatarProfile::checkOverflowMenuItem(const LLSD& param) +void LLPanelAvatarProfile::pay() { - std::string item = param.asString(); - - if (item == "is_blocked") - return LLAvatarActions::isBlocked(getAvatarId()); - - return false; + LLAvatarActions::pay(getAvatarId()); } -bool LLPanelAvatarProfile::enableOverflowMenuItem(const LLSD& param) +void LLPanelAvatarProfile::share() { - std::string item = param.asString(); - - if (item == "can_block") - return LLAvatarActions::canBlock(getAvatarId()); + LLAvatarActions::share(getAvatarId()); +} - return false; +void LLPanelAvatarProfile::toggleBlock() +{ + LLAvatarActions::toggleBlock(getAvatarId()); } -void LLPanelAvatarProfile::pay() +bool LLPanelAvatarProfile::enableShowOnMap() { - LLAvatarActions::pay(getAvatarId()); + bool is_buddy_online = LLAvatarTracker::instance().isBuddyOnline(getAvatarId()); + + bool enable_map_btn = (is_buddy_online && is_agent_mappable(getAvatarId())) + || gAgent.isGodlike(); + return enable_map_btn; } -void LLPanelAvatarProfile::share() +bool LLPanelAvatarProfile::enableBlock() { - LLAvatarActions::share(getAvatarId()); + return LLAvatarActions::canBlock(getAvatarId()) && !LLAvatarActions::isBlocked(getAvatarId()); } -void LLPanelAvatarProfile::toggleBlock() +bool LLPanelAvatarProfile::enableUnblock() { - LLAvatarActions::toggleBlock(getAvatarId()); + return LLAvatarActions::isBlocked(getAvatarId()); } void LLPanelAvatarProfile::kick() @@ -726,20 +746,6 @@ void LLPanelAvatarProfile::csr() LLAvatarActions::csr(getAvatarId(), name); } -void LLPanelAvatarProfile::onUrlTextboxClicked(const std::string& url) -{ - LLWeb::loadURL(url); -} - -void LLPanelAvatarProfile::onHomepageTextboxClicked() -{ - std::string url = childGetValue("homepage_edit").asString(); - if(!url.empty()) - { - onUrlTextboxClicked(url); - } -} - void LLPanelAvatarProfile::onAddFriendButtonClick() { LLAvatarActions::requestFriendshipDialog(getAvatarId()); @@ -787,8 +793,10 @@ LLPanelAvatarProfile::~LLPanelAvatarProfile() if(getAvatarId().notNull()) { LLAvatarTracker::instance().removeParticularFriendObserver(getAvatarId(), this); - if(LLVoiceClient::getInstance()) + if(LLVoiceClient::instanceExists()) + { LLVoiceClient::getInstance()->removeObserver((LLVoiceClientStatusObserver*)this); + } } } @@ -806,7 +814,7 @@ void LLPanelAvatarProfile::onChange(EStatusType status, const std::string &chann return; } - childSetEnabled("call", LLVoiceClient::voiceEnabled() && gVoiceClient->voiceWorking()); + childSetEnabled("call", LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking()); } void LLPanelAvatarProfile::setAvatarId(const LLUUID& id) diff --git a/indra/newview/llpanelavatar.h b/indra/newview/llpanelavatar.h index 632590aa27..bb8df2ff9c 100644 --- a/indra/newview/llpanelavatar.h +++ b/indra/newview/llpanelavatar.h @@ -202,13 +202,12 @@ protected: void unfreeze(); void csr(); - bool checkOverflowMenuItem(const LLSD& param); - bool enableOverflowMenuItem(const LLSD& param); + bool enableShowOnMap(); + bool enableBlock(); + bool enableUnblock(); bool enableGod(); - void onUrlTextboxClicked(const std::string& url); - void onHomepageTextboxClicked(); void onAddFriendButtonClick(); void onIMButtonClick(); void onCallButtonClick(); @@ -259,8 +258,8 @@ private: }; /** -* Panel for displaying Avatar's notes and modifying friend's rights. -*/ + * Panel for displaying Avatar's notes and modifying friend's rights. + */ class LLPanelAvatarNotes : public LLPanelProfileTab , public LLFriendObserver @@ -311,6 +310,7 @@ protected: void onCallButtonClick(); void onTeleportButtonClick(); void onShareButtonClick(); + void enableCheckboxes(bool enable); }; #endif // LL_LLPANELAVATAR_H diff --git a/indra/newview/llpanelblockedlist.cpp b/indra/newview/llpanelblockedlist.cpp index 362657a458..c72f0f8012 100644 --- a/indra/newview/llpanelblockedlist.cpp +++ b/indra/newview/llpanelblockedlist.cpp @@ -119,8 +119,13 @@ void LLPanelBlockedList::refreshBlockedList() std::vector<LLMute>::iterator it; for (it = mutes.begin(); it != mutes.end(); ++it) { - std::string display_name = it->getDisplayName(); - mBlockedList->addStringUUIDItem(display_name, it->mID, ADD_BOTTOM, TRUE); + LLScrollListItem::Params item_p; + item_p.enabled(TRUE); + item_p.value(it->mID); // link UUID of blocked item with ScrollListItem + item_p.columns.add().column("item_name").value(it->mName);//.type("text"); + item_p.columns.add().column("item_type").value(it->getDisplayType());//.type("text").width(111); + + mBlockedList->addRow(item_p, ADD_BOTTOM); } } @@ -145,9 +150,7 @@ void LLPanelBlockedList::onRemoveBtnClick() { std::string name = mBlockedList->getSelectedItemLabel(); LLUUID id = mBlockedList->getStringUUIDSelectedItem(); - LLMute mute(id); - mute.setFromDisplayName(name); - // now mute.mName has the suffix trimmed off + LLMute mute(id, name); S32 last_selected = mBlockedList->getFirstSelectedIndex(); if (LLMuteList::getInstance()->remove(mute)) @@ -183,7 +186,7 @@ void LLPanelBlockedList::onBlockByNameClick() LLFloaterGetBlockedObjectName::show(&LLPanelBlockedList::callbackBlockByName); } -void LLPanelBlockedList::callbackBlockPicked(const std::vector<std::string>& names, const std::vector<LLUUID>& ids) +void LLPanelBlockedList::callbackBlockPicked(const std::vector<std::string>& names, const uuid_vec_t& ids) { if (names.empty() || ids.empty()) return; LLMute mute(ids[0], names[0], LLMute::AGENT); diff --git a/indra/newview/llpanelblockedlist.h b/indra/newview/llpanelblockedlist.h index 1ef16a02f4..a100577e43 100644 --- a/indra/newview/llpanelblockedlist.h +++ b/indra/newview/llpanelblockedlist.h @@ -78,7 +78,7 @@ private: void onPickBtnClick(); void onBlockByNameClick(); - void callbackBlockPicked(const std::vector<std::string>& names, const std::vector<LLUUID>& ids); + void callbackBlockPicked(const std::vector<std::string>& names, const uuid_vec_t& ids); static void callbackBlockByName(const std::string& text); private: diff --git a/indra/newview/llpanelclassified.cpp b/indra/newview/llpanelclassified.cpp index 1e46827c1a..70a7bf644b 100644 --- a/indra/newview/llpanelclassified.cpp +++ b/indra/newview/llpanelclassified.cpp @@ -41,6 +41,7 @@ #include "lldir.h" #include "lldispatcher.h" #include "llfloaterreg.h" +#include "llhttpclient.h" #include "llnotifications.h" #include "llnotificationsutil.h" #include "llparcel.h" @@ -72,6 +73,7 @@ #include "llviewerwindow.h" // for window width, height #include "llappviewer.h" // abortQuit() #include "lltrans.h" +#include "llscrollcontainer.h" #include "llstatusbar.h" const S32 MINIMUM_PRICE_FOR_LISTING = 50; // L$ @@ -82,6 +84,7 @@ const S32 DECLINE_TO_STATE = 0; //static std::list<LLPanelClassified*> LLPanelClassified::sAllPanels; +std::list<LLPanelClassifiedInfo*> LLPanelClassifiedInfo::sAllPanels; // "classifiedclickthrough" // strings[0] = classified_id @@ -102,15 +105,32 @@ public: S32 teleport_clicks = atoi(strings[1].c_str()); S32 map_clicks = atoi(strings[2].c_str()); S32 profile_clicks = atoi(strings[3].c_str()); - LLPanelClassified::setClickThrough(classified_id, teleport_clicks, - map_clicks, - profile_clicks, - false); + + LLPanelClassifiedInfo::setClickThrough( + classified_id, teleport_clicks, map_clicks, profile_clicks, false); + return true; } }; static LLDispatchClassifiedClickThrough sClassifiedClickThrough; +// Just to debug errors. Can be thrown away later. +class LLClassifiedClickMessageResponder : public LLHTTPClient::Responder +{ + LOG_CLASS(LLClassifiedClickMessageResponder); + +public: + // If we get back an error (not found, etc...), handle it here + virtual void errorWithContent( + U32 status, + const std::string& reason, + const LLSD& content) + { + llwarns << "Sending click message failed (" << status << "): [" << reason << "]" << llendl; + llwarns << "Content: [" << content << "]" << llendl; + } +}; + /* Re-expose this if we need to have classified ad HTML detail pages. JC @@ -242,7 +262,7 @@ BOOL LLPanelClassified::postBuild() mNameEditor->setCommitOnFocusLost(TRUE); mNameEditor->setFocusReceivedCallback(boost::bind(focusReceived, _1, this)); mNameEditor->setCommitCallback(onCommitAny, this); - mNameEditor->setPrevalidate( LLLineEditor::prevalidateASCII ); + mNameEditor->setPrevalidate( LLTextValidate::validateASCII ); mDescEditor = getChild<LLTextEditor>("desc_editor"); mDescEditor->setCommitOnFocusLost(TRUE); @@ -496,7 +516,7 @@ void LLPanelClassified::sendClassifiedInfoRequest() if (!url.empty()) { llinfos << "Classified stat request via capability" << llendl; - LLHTTPClient::post(url, body, new LLClassifiedStatsResponder(((LLView*)this)->getHandle(), mClassifiedID)); + LLHTTPClient::post(url, body, new LLClassifiedStatsResponder(mClassifiedID)); } } } @@ -1072,7 +1092,7 @@ BOOL LLFloaterPriceForListing::postBuild() LLLineEditor* edit = getChild<LLLineEditor>("price_edit"); if (edit) { - edit->setPrevalidate(LLLineEditor::prevalidateNonNegativeS32); + edit->setPrevalidate(LLTextValidate::validateNonNegativeS32); std::string min_price = llformat("%d", MINIMUM_PRICE_FOR_LISTING); edit->setText(min_price); edit->selectAll(); @@ -1152,11 +1172,25 @@ void LLPanelClassified::setDefaultAccessCombo() LLPanelClassifiedInfo::LLPanelClassifiedInfo() : LLPanel() , mInfoLoaded(false) -{ + , mScrollingPanel(NULL) + , mScrollContainer(NULL) + , mScrollingPanelMinHeight(0) + , mScrollingPanelWidth(0) + , mSnapshotStreched(false) + , mTeleportClicksOld(0) + , mMapClicksOld(0) + , mProfileClicksOld(0) + , mTeleportClicksNew(0) + , mMapClicksNew(0) + , mProfileClicksNew(0) + , mSnapshotCtrl(NULL) +{ + sAllPanels.push_back(this); } LLPanelClassifiedInfo::~LLPanelClassifiedInfo() { + sAllPanels.remove(this); } // static @@ -1173,6 +1207,15 @@ BOOL LLPanelClassifiedInfo::postBuild() childSetAction("show_on_map_btn", boost::bind(&LLPanelClassifiedInfo::onMapClick, this)); childSetAction("teleport_btn", boost::bind(&LLPanelClassifiedInfo::onTeleportClick, this)); + mScrollingPanel = getChild<LLPanel>("scroll_content_panel"); + mScrollContainer = getChild<LLScrollContainer>("profile_scroll"); + + mScrollingPanelMinHeight = mScrollContainer->getScrolledViewRect().getHeight(); + mScrollingPanelWidth = mScrollingPanel->getRect().getWidth(); + + mSnapshotCtrl = getChild<LLTextureCtrl>("classified_snapshot"); + mSnapshotRect = getDefaultSnapshotRect(); + return TRUE; } @@ -1186,9 +1229,32 @@ void LLPanelClassifiedInfo::setEditClassifiedCallback(const commit_callback_t& c getChild<LLButton>("edit_btn")->setClickedCallback(cb); } +void LLPanelClassifiedInfo::reshape(S32 width, S32 height, BOOL called_from_parent /* = TRUE */) +{ + LLPanel::reshape(width, height, called_from_parent); + + if (!mScrollContainer || !mScrollingPanel) + return; + + static LLUICachedControl<S32> scrollbar_size ("UIScrollbarSize", 0); + + S32 scroll_height = mScrollContainer->getRect().getHeight(); + if (mScrollingPanelMinHeight >= scroll_height) + { + mScrollingPanel->reshape(mScrollingPanelWidth, mScrollingPanelMinHeight); + } + else + { + mScrollingPanel->reshape(mScrollingPanelWidth + scrollbar_size, scroll_height); + } + + mSnapshotRect = getDefaultSnapshotRect(); + stretchSnapshot(); +} + void LLPanelClassifiedInfo::onOpen(const LLSD& key) { - LLUUID avatar_id = key["avatar_id"]; + LLUUID avatar_id = key["classified_creator_id"]; if(avatar_id.isNull()) { return; @@ -1203,14 +1269,35 @@ void LLPanelClassifiedInfo::onOpen(const LLSD& key) resetData(); resetControls(); + scrollToTop(); setClassifiedId(key["classified_id"]); - setClassifiedName(key["name"]); - setDescription(key["desc"]); - setSnapshotId(key["snapshot_id"]); + setClassifiedName(key["classified_name"]); + setDescription(key["classified_desc"]); + setSnapshotId(key["classified_snapshot_id"]); + setFromSearch(key["from_search"]); + + llinfos << "Opening classified [" << getClassifiedName() << "] (" << getClassifiedId() << ")" << llendl; LLAvatarPropertiesProcessor::getInstance()->addObserver(getAvatarId(), this); LLAvatarPropertiesProcessor::getInstance()->sendClassifiedInfoRequest(getClassifiedId()); + gGenericDispatcher.addHandler("classifiedclickthrough", &sClassifiedClickThrough); + + // While we're at it let's get the stats from the new table if that + // capability exists. + std::string url = gAgent.getRegion()->getCapability("SearchStatRequest"); + if (!url.empty()) + { + llinfos << "Classified stat request via capability" << llendl; + LLSD body; + body["classified_id"] = getClassifiedId(); + LLHTTPClient::post(url, body, new LLClassifiedStatsResponder(getClassifiedId())); + } + + // Update classified click stats. + // *TODO: Should we do this when opening not from search? + sendClickMessage("profile"); + setInfoLoaded(false); } @@ -1226,20 +1313,32 @@ void LLPanelClassifiedInfo::processProperties(void* data, EAvatarProcessorType t setSnapshotId(c_info->snapshot_id); setParcelId(c_info->parcel_id); setPosGlobal(c_info->pos_global); + setSimName(c_info->sim_name); + setClassifiedLocation(createLocationText(c_info->parcel_name, c_info->sim_name, c_info->pos_global)); childSetValue("category", LLClassifiedInfo::sCategories[c_info->category]); static std::string mature_str = getString("type_mature"); static std::string pg_str = getString("type_pg"); static LLUIString price_str = getString("l$_price"); + static std::string date_fmt = getString("date_fmt"); bool mature = is_cf_mature(c_info->flags); childSetValue("content_type", mature ? mature_str : pg_str); - childSetValue("auto_renew", is_cf_auto_renew(c_info->flags)); + getChild<LLIconCtrl>("content_type_moderate")->setVisible(mature); + getChild<LLIconCtrl>("content_type_general")->setVisible(!mature); + + std::string auto_renew_str = is_cf_auto_renew(c_info->flags) ? + getString("auto_renew_on") : getString("auto_renew_off"); + childSetValue("auto_renew", auto_renew_str); price_str.setArg("[PRICE]", llformat("%d", c_info->price_for_listing)); childSetValue("price_for_listing", LLSD(price_str)); + std::string date_str = date_fmt; + LLStringUtil::format(date_str, LLSD().with("datetime", (S32) c_info->creation_date)); + childSetText("creation_date", date_str); + setInfoLoaded(true); } } @@ -1252,23 +1351,38 @@ void LLPanelClassifiedInfo::resetData() setClassifiedLocation(LLStringUtil::null); setClassifiedId(LLUUID::null); setSnapshotId(LLUUID::null); - mPosGlobal.clearVec(); - childSetValue("category", LLStringUtil::null); - childSetValue("content_type", LLStringUtil::null); + setPosGlobal(LLVector3d::zero); + setParcelId(LLUUID::null); + setSimName(LLStringUtil::null); + setFromSearch(false); + + // reset click stats + mTeleportClicksOld = 0; + mMapClicksOld = 0; + mProfileClicksOld = 0; + mTeleportClicksNew = 0; + mMapClicksNew = 0; + mProfileClicksNew = 0; + + childSetText("category", LLStringUtil::null); + childSetText("content_type", LLStringUtil::null); + childSetText("click_through_text", LLStringUtil::null); + childSetText("price_for_listing", LLStringUtil::null); + childSetText("auto_renew", LLStringUtil::null); + childSetText("creation_date", LLStringUtil::null); + childSetText("click_through_text", LLStringUtil::null); + getChild<LLIconCtrl>("content_type_moderate")->setVisible(FALSE); + getChild<LLIconCtrl>("content_type_general")->setVisible(FALSE); } void LLPanelClassifiedInfo::resetControls() { - if(getAvatarId() == gAgent.getID()) - { - childSetEnabled("edit_btn", TRUE); - childSetVisible("edit_btn", TRUE); - } - else - { - childSetEnabled("edit_btn", FALSE); - childSetVisible("edit_btn", FALSE); - } + bool is_self = getAvatarId() == gAgent.getID(); + + childSetEnabled("edit_btn", is_self); + childSetVisible("edit_btn", is_self); + childSetVisible("price_layout_panel", is_self); + childSetVisible("clickthrough_layout_panel", is_self); } void LLPanelClassifiedInfo::setClassifiedName(const std::string& name) @@ -1296,9 +1410,27 @@ void LLPanelClassifiedInfo::setClassifiedLocation(const std::string& location) childSetValue("classified_location", location); } +std::string LLPanelClassifiedInfo::getClassifiedLocation() +{ + return childGetValue("classified_location").asString(); +} + void LLPanelClassifiedInfo::setSnapshotId(const LLUUID& id) { - childSetValue("classified_snapshot", id); + mSnapshotCtrl->setValue(id); + mSnapshotStreched = false; +} + +void LLPanelClassifiedInfo::draw() +{ + LLPanel::draw(); + + // Stretch in draw because it takes some time to load a texture, + // going to try to stretch snapshot until texture is loaded + if(!mSnapshotStreched) + { + stretchSnapshot(); + } } LLUUID LLPanelClassifiedInfo::getSnapshotId() @@ -1307,6 +1439,69 @@ LLUUID LLPanelClassifiedInfo::getSnapshotId() } // static +void LLPanelClassifiedInfo::setClickThrough( + const LLUUID& classified_id, + S32 teleport, + S32 map, + S32 profile, + bool from_new_table) +{ + llinfos << "Click-through data for classified " << classified_id << " arrived: [" + << teleport << ", " << map << ", " << profile << "] (" + << (from_new_table ? "new" : "old") << ")" << llendl; + + for (panel_list_t::iterator iter = sAllPanels.begin(); iter != sAllPanels.end(); ++iter) + { + LLPanelClassifiedInfo* self = *iter; + if (self->getClassifiedId() != classified_id) + { + continue; + } + + // *HACK: Skip LLPanelClassifiedEdit instances: they don't display clicks data. + // Those instances should not be in the list at all. + if (typeid(*self) != typeid(LLPanelClassifiedInfo)) + { + continue; + } + + llinfos << "Updating classified info panel" << llendl; + + // We need to check to see if the data came from the new stat_table + // or the old classified table. We also need to cache the data from + // the two separate sources so as to display the aggregate totals. + + if (from_new_table) + { + self->mTeleportClicksNew = teleport; + self->mMapClicksNew = map; + self->mProfileClicksNew = profile; + } + else + { + self->mTeleportClicksOld = teleport; + self->mMapClicksOld = map; + self->mProfileClicksOld = profile; + } + + static LLUIString ct_str = self->getString("click_through_text_fmt"); + + ct_str.setArg("[TELEPORT]", llformat("%d", self->mTeleportClicksNew + self->mTeleportClicksOld)); + ct_str.setArg("[MAP]", llformat("%d", self->mMapClicksNew + self->mMapClicksOld)); + ct_str.setArg("[PROFILE]", llformat("%d", self->mProfileClicksNew + self->mProfileClicksOld)); + + self->childSetText("click_through_text", ct_str.getString()); + // *HACK: remove this when there is enough room for click stats in the info panel + self->childSetToolTip("click_through_text", ct_str.getString()); + + llinfos << "teleport: " << llformat("%d", self->mTeleportClicksNew + self->mTeleportClicksOld) + << ", map: " << llformat("%d", self->mMapClicksNew + self->mMapClicksOld) + << ", profile: " << llformat("%d", self->mProfileClicksNew + self->mProfileClicksOld) + << llendl; + } +} + +// static std::string LLPanelClassifiedInfo::createLocationText( const std::string& original_name, const std::string& sim_name, @@ -1337,8 +1532,100 @@ std::string LLPanelClassifiedInfo::createLocationText( return location_text; } +void LLPanelClassifiedInfo::stretchSnapshot() +{ + // *NOTE dzaporozhan + // Could be moved to LLTextureCtrl + + LLViewerFetchedTexture* texture = mSnapshotCtrl->getTexture(); + + if(!texture) + { + return; + } + + if(0 == texture->getOriginalWidth() || 0 == texture->getOriginalHeight()) + { + // looks like texture is not loaded yet + return; + } + + LLRect rc = mSnapshotRect; + // *HACK dzaporozhan + // LLTextureCtrl uses BTN_HEIGHT_SMALL as bottom for texture which causes + // drawn texture to be smaller than expected. (see LLTextureCtrl::draw()) + // Lets increase texture height to force texture look as expected. + rc.mBottom -= BTN_HEIGHT_SMALL; + + F32 t_width = texture->getFullWidth(); + F32 t_height = texture->getFullHeight(); + + F32 ratio = llmin<F32>( (rc.getWidth() / t_width), (rc.getHeight() / t_height) ); + + t_width *= ratio; + t_height *= ratio; + + rc.setCenterAndSize(rc.getCenterX(), rc.getCenterY(), llfloor(t_width), llfloor(t_height)); + mSnapshotCtrl->setShape(rc); + + mSnapshotStreched = true; +} + +LLRect LLPanelClassifiedInfo::getDefaultSnapshotRect() +{ + // Using scroll container makes getting default rect a hard task + // because rect in postBuild() and in first reshape() is not the same. + // Using snapshot_panel makes it easier to reshape snapshot. + return getChild<LLUICtrl>("snapshot_panel")->getLocalRect(); +} + +void LLPanelClassifiedInfo::scrollToTop() +{ + LLScrollContainer* scrollContainer = findChild<LLScrollContainer>("profile_scroll"); + if (scrollContainer) + scrollContainer->goToTop(); +} + +// static +// *TODO: move out of the panel +void LLPanelClassifiedInfo::sendClickMessage( + const std::string& type, + bool from_search, + const LLUUID& classified_id, + const LLUUID& parcel_id, + const LLVector3d& global_pos, + const std::string& sim_name) +{ + // You're allowed to click on your own ads to reassure yourself + // that the system is working. + LLSD body; + body["type"] = type; + body["from_search"] = from_search; + body["classified_id"] = classified_id; + body["parcel_id"] = parcel_id; + body["dest_pos_global"] = global_pos.getValue(); + body["region_name"] = sim_name; + + std::string url = gAgent.getRegion()->getCapability("SearchStatTracking"); + llinfos << "Sending click msg via capability (url=" << url << ")" << llendl; + llinfos << "body: [" << body << "]" << llendl; + LLHTTPClient::post(url, body, new LLClassifiedClickMessageResponder()); +} + +void LLPanelClassifiedInfo::sendClickMessage(const std::string& type) +{ + sendClickMessage( + type, + fromSearch(), + getClassifiedId(), + getParcelId(), + getPosGlobal(), + getSimName()); +} + void LLPanelClassifiedInfo::onMapClick() { + sendClickMessage("map"); LLFloaterWorldMap::getInstance()->trackLocation(getPosGlobal()); LLFloaterReg::showInstance("world_map", "center"); } @@ -1347,6 +1634,7 @@ void LLPanelClassifiedInfo::onTeleportClick() { if (!getPosGlobal().isExactlyZero()) { + sendClickMessage("teleport"); gAgent.teleportViaLocation(getPosGlobal()); LLFloaterWorldMap::getInstance()->trackLocation(getPosGlobal()); } @@ -1355,6 +1643,7 @@ void LLPanelClassifiedInfo::onTeleportClick() void LLPanelClassifiedInfo::onExit() { LLAvatarPropertiesProcessor::getInstance()->removeObserver(getAvatarId(), this); + gGenericDispatcher.addHandler("classifiedclickthrough", NULL); // deregister our handler } ////////////////////////////////////////////////////////////////////////// @@ -1367,7 +1656,9 @@ static const S32 CB_ITEM_PG = 1; LLPanelClassifiedEdit::LLPanelClassifiedEdit() : LLPanelClassifiedInfo() , mIsNew(false) + , mIsNewWithErrors(false) , mCanClose(false) + , mPublishFloater(NULL) { } @@ -1419,22 +1710,17 @@ BOOL LLPanelClassifiedEdit::postBuild() childSetAction("save_changes_btn", boost::bind(&LLPanelClassifiedEdit::onSaveClick, this)); childSetAction("set_to_curr_location_btn", boost::bind(&LLPanelClassifiedEdit::onSetLocationClick, this)); + mSnapshotCtrl->setOnSelectCallback(boost::bind(&LLPanelClassifiedEdit::onTextureSelected, this)); + return TRUE; } -void LLPanelClassifiedEdit::onOpen(const LLSD& key) +void LLPanelClassifiedEdit::fillIn(const LLSD& key) { - LLUUID classified_id = key["classified_id"]; - - mIsNew = classified_id.isNull(); + setAvatarId(gAgent.getID()); - if(mIsNew) + if(key.isUndefined()) { - setAvatarId(gAgent.getID()); - - resetData(); - resetControls(); - setPosGlobal(gAgent.getPositionGlobal()); LLUUID snapshot_id = LLUUID::null; @@ -1457,22 +1743,55 @@ void LLPanelClassifiedEdit::onOpen(const LLSD& key) childSetValue("classified_name", makeClassifiedName()); childSetValue("classified_desc", desc); setSnapshotId(snapshot_id); - setClassifiedLocation(createLocationText(getLocationNotice(), region_name, getPosGlobal())); - // server will set valid parcel id setParcelId(LLUUID::null); + } + else + { + setClassifiedId(key["classified_id"]); + setClassifiedName(key["name"]); + setDescription(key["desc"]); + setSnapshotId(key["snapshot_id"]); + setCategory((U32)key["category"].asInteger()); + setContentType((U32)key["content_type"].asInteger()); + setClassifiedLocation(key["location_text"]); + childSetValue("auto_renew", key["auto_renew"]); + childSetValue("price_for_listing", key["price_for_listing"].asInteger()); + } +} + +void LLPanelClassifiedEdit::onOpen(const LLSD& key) +{ + mIsNew = key.isUndefined(); + + scrollToTop(); + + // classified is not created yet + bool is_new = isNew() || isNewWithErrors(); + + if(is_new) + { + resetData(); + resetControls(); - enableVerbs(true); - enableEditing(true); + fillIn(key); + + if(isNew()) + { + LLAvatarPropertiesProcessor::getInstance()->addObserver(getAvatarId(), this); + } } else { LLPanelClassifiedInfo::onOpen(key); - enableVerbs(false); - enableEditing(false); } + std::string save_btn_label = is_new ? getString("publish_label") : getString("save_label"); + childSetLabelArg("save_changes_btn", "[LABEL]", save_btn_label); + + enableVerbs(is_new); + enableEditing(is_new); resetDirty(); setInfoLoaded(false); } @@ -1484,6 +1803,14 @@ void LLPanelClassifiedEdit::processProperties(void* data, EAvatarProcessorType t LLAvatarClassifiedInfo* c_info = static_cast<LLAvatarClassifiedInfo*>(data); if(c_info && getClassifiedId() == c_info->classified_id) { + // see LLPanelClassifiedEdit::sendUpdate() for notes + mIsNewWithErrors = false; + // for just created classified - panel will probably be closed when we get here. + if(!getVisible()) + { + return; + } + enableEditing(true); setClassifiedName(c_info->name); @@ -1492,18 +1819,23 @@ void LLPanelClassifiedEdit::processProperties(void* data, EAvatarProcessorType t setPosGlobal(c_info->pos_global); setClassifiedLocation(createLocationText(c_info->parcel_name, c_info->sim_name, c_info->pos_global)); - getChild<LLComboBox>("category")->setCurrentByIndex(c_info->category + 1); - getChild<LLComboBox>("category")->resetDirty(); + // *HACK see LLPanelClassifiedEdit::sendUpdate() + setCategory(c_info->category - 1); bool mature = is_cf_mature(c_info->flags); bool auto_renew = is_cf_auto_renew(c_info->flags); - getChild<LLComboBox>("content_type")->setCurrentByIndex(mature ? CB_ITEM_MATURE : CB_ITEM_PG); + setContentType(mature ? CB_ITEM_MATURE : CB_ITEM_PG); childSetValue("auto_renew", auto_renew); childSetValue("price_for_listing", c_info->price_for_listing); + childSetEnabled("price_for_listing", isNew()); resetDirty(); setInfoLoaded(true); + enableVerbs(false); + + // for just created classified - in case user opened edit panel before processProperties() callback + childSetLabelArg("save_changes_btn", "[LABEL]", getString("save_label")); } } } @@ -1534,19 +1866,24 @@ void LLPanelClassifiedEdit::resetDirty() LLPanelClassifiedInfo::resetDirty(); getChild<LLUICtrl>("classified_snapshot")->resetDirty(); getChild<LLUICtrl>("classified_name")->resetDirty(); - getChild<LLUICtrl>("classified_desc")->resetDirty(); + + LLTextEditor* desc = getChild<LLTextEditor>("classified_desc"); + // call blockUndo() to really reset dirty(and make isDirty work as intended) + desc->blockUndo(); + desc->resetDirty(); + getChild<LLUICtrl>("category")->resetDirty(); getChild<LLUICtrl>("content_type")->resetDirty(); getChild<LLUICtrl>("auto_renew")->resetDirty(); getChild<LLUICtrl>("price_for_listing")->resetDirty(); } -void LLPanelClassifiedEdit::setSaveCallback(const commit_callback_t& cb) +void LLPanelClassifiedEdit::setSaveCallback(const commit_signal_t::slot_type& cb) { - getChild<LLButton>("save_changes_btn")->setClickedCallback(cb); + mSaveButtonClickedSignal.connect(cb); } -void LLPanelClassifiedEdit::setCancelCallback(const commit_callback_t& cb) +void LLPanelClassifiedEdit::setCancelCallback(const commit_signal_t::slot_type& cb) { getChild<LLButton>("cancel_btn")->setClickedCallback(cb); } @@ -1559,6 +1896,7 @@ void LLPanelClassifiedEdit::resetControls() getChild<LLComboBox>("content_type")->setCurrentByIndex(0); childSetValue("auto_renew", false); childSetValue("price_for_listing", MINIMUM_PRICE_FOR_LISTING); + childSetEnabled("price_for_listing", TRUE); } bool LLPanelClassifiedEdit::canClose() @@ -1566,20 +1904,54 @@ bool LLPanelClassifiedEdit::canClose() return mCanClose; } +void LLPanelClassifiedEdit::draw() +{ + LLPanel::draw(); + + // Need to re-stretch on every draw because LLTextureCtrl::onSelectCallback + // does not trigger callbacks when user navigates through images. + stretchSnapshot(); +} + +void LLPanelClassifiedEdit::stretchSnapshot() +{ + LLPanelClassifiedInfo::stretchSnapshot(); + + getChild<LLUICtrl>("edit_icon")->setShape(mSnapshotCtrl->getRect()); +} + +U32 LLPanelClassifiedEdit::getContentType() +{ + LLComboBox* ct_cb = getChild<LLComboBox>("content_type"); + return ct_cb->getCurrentIndex(); +} + +void LLPanelClassifiedEdit::setContentType(U32 content_type) +{ + LLComboBox* ct_cb = getChild<LLComboBox>("content_type"); + ct_cb->setCurrentByIndex(content_type); + ct_cb->resetDirty(); +} + +bool LLPanelClassifiedEdit::getAutoRenew() +{ + return childGetValue("auto_renew").asBoolean(); +} + void LLPanelClassifiedEdit::sendUpdate() { LLAvatarClassifiedInfo c_data; if(getClassifiedId().isNull()) { - LLUUID id; - id.generate(); - setClassifiedId(id); + setClassifiedId(LLUUID::generateNewID()); } c_data.agent_id = gAgent.getID(); c_data.classified_id = getClassifiedId(); - c_data.category = getCategory(); + // *HACK + // Categories on server start with 1 while combo-box index starts with 0 + c_data.category = getCategory() + 1; c_data.name = getClassifiedName(); c_data.description = getDescription(); c_data.parcel_id = getParcelId(); @@ -1589,12 +1961,27 @@ void LLPanelClassifiedEdit::sendUpdate() c_data.price_for_listing = getPriceForListing(); LLAvatarPropertiesProcessor::getInstance()->sendClassifiedInfoUpdate(&c_data); + + if(isNew()) + { + // Lets assume there will be some error. + // Successful sendClassifiedInfoUpdate will trigger processProperties and + // let us know there was no error. + mIsNewWithErrors = true; + } } U32 LLPanelClassifiedEdit::getCategory() { LLComboBox* cat_cb = getChild<LLComboBox>("category"); - return cat_cb->getCurrentIndex() + 1; + return cat_cb->getCurrentIndex(); +} + +void LLPanelClassifiedEdit::setCategory(U32 category) +{ + LLComboBox* cat_cb = getChild<LLComboBox>("category"); + cat_cb->setCurrentByIndex(category); + cat_cb->resetDirty(); } U8 LLPanelClassifiedEdit::getFlags() @@ -1653,6 +2040,11 @@ S32 LLPanelClassifiedEdit::getPriceForListing() return childGetValue("price_for_listing").asInteger(); } +void LLPanelClassifiedEdit::setPriceForListing(S32 price) +{ + childSetValue("price_for_listing", price); +} + void LLPanelClassifiedEdit::onSetLocationClick() { setPosGlobal(gAgent.getPositionGlobal()); @@ -1687,18 +2079,51 @@ void LLPanelClassifiedEdit::onSaveClick() notifyInvalidName(); return; } - if(isNew()) + if(isNew() || isNewWithErrors()) { if(gStatusBar->getBalance() < getPriceForListing()) { LLNotificationsUtil::add("ClassifiedInsufficientFunds"); return; } + + mPublishFloater = LLFloaterReg::findTypedInstance<LLPublishClassifiedFloater>( + "publish_classified", LLSD()); + + if(!mPublishFloater) + { + mPublishFloater = LLFloaterReg::getTypedInstance<LLPublishClassifiedFloater>( + "publish_classified", LLSD()); + + mPublishFloater->setPublishClickedCallback(boost::bind + (&LLPanelClassifiedEdit::onPublishFloaterPublishClicked, this)); + } + + // set spinner value before it has focus or value wont be set + mPublishFloater->setPrice(getPriceForListing()); + mPublishFloater->openFloater(mPublishFloater->getKey()); + mPublishFloater->center(); + } + else + { + doSave(); } +} +void LLPanelClassifiedEdit::doSave() +{ mCanClose = true; sendUpdate(); resetDirty(); + + mSaveButtonClickedSignal(this, LLSD()); +} + +void LLPanelClassifiedEdit::onPublishFloaterPublishClicked() +{ + setPriceForListing(mPublishFloater->getPrice()); + + doSave(); } std::string LLPanelClassifiedEdit::getLocationNotice() @@ -1745,4 +2170,52 @@ void LLPanelClassifiedEdit::onTexturePickerMouseLeave(LLUICtrl* ctrl) ctrl->setVisible(FALSE); } +void LLPanelClassifiedEdit::onTextureSelected() +{ + setSnapshotId(mSnapshotCtrl->getValue().asUUID()); +} + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +LLPublishClassifiedFloater::LLPublishClassifiedFloater(const LLSD& key) + : LLFloater(key) +{ +} + +LLPublishClassifiedFloater::~LLPublishClassifiedFloater() +{ +} + +BOOL LLPublishClassifiedFloater::postBuild() +{ + LLFloater::postBuild(); + + childSetAction("publish_btn", boost::bind(&LLFloater::closeFloater, this, false)); + childSetAction("cancel_btn", boost::bind(&LLFloater::closeFloater, this, false)); + + return TRUE; +} + +void LLPublishClassifiedFloater::setPrice(S32 price) +{ + childSetValue("price_for_listing", price); +} + +S32 LLPublishClassifiedFloater::getPrice() +{ + return childGetValue("price_for_listing").asInteger(); +} + +void LLPublishClassifiedFloater::setPublishClickedCallback(const commit_signal_t::slot_type& cb) +{ + getChild<LLButton>("publish_btn")->setClickedCallback(cb); +} + +void LLPublishClassifiedFloater::setCancelClickedCallback(const commit_signal_t::slot_type& cb) +{ + getChild<LLButton>("cancel_btn")->setClickedCallback(cb); +} + //EOF diff --git a/indra/newview/llpanelclassified.h b/indra/newview/llpanelclassified.h index e46806f576..1157649a16 100644 --- a/indra/newview/llpanelclassified.h +++ b/indra/newview/llpanelclassified.h @@ -55,6 +55,7 @@ class LLTextEditor; class LLTextureCtrl; class LLUICtrl; class LLMessageSystem; +class LLScrollContainer; // *TODO deprecated, should be removed. // New class implemented in ticket EXT-2095 @@ -201,8 +202,26 @@ private: void* mUserData; }; +class LLPublishClassifiedFloater : public LLFloater +{ +public: + LLPublishClassifiedFloater(const LLSD& key); + virtual ~LLPublishClassifiedFloater(); + + /*virtual*/ BOOL postBuild(); + + void setPrice(S32 price); + S32 getPrice(); + + void setPublishClickedCallback(const commit_signal_t::slot_type& cb); + void setCancelClickedCallback(const commit_signal_t::slot_type& cb); + +private: +}; + class LLPanelClassifiedInfo : public LLPanel, public LLAvatarPropertiesObserver { + LOG_CLASS(LLPanelClassifiedInfo); public: static LLPanelClassifiedInfo* create(); @@ -237,6 +256,8 @@ public: void setClassifiedLocation(const std::string& location); + std::string getClassifiedLocation(); + void setPosGlobal(const LLVector3d& pos) { mPosGlobal = pos; } LLVector3d& getPosGlobal() { return mPosGlobal; } @@ -245,14 +266,41 @@ public: LLUUID getParcelId() { return mParcelId; } + void setSimName(const std::string& sim_name) { mSimName = sim_name; } + + std::string getSimName() { return mSimName; } + + void setFromSearch(bool val) { mFromSearch = val; } + + bool fromSearch() { return mFromSearch; } + bool getInfoLoaded() { return mInfoLoaded; } void setInfoLoaded(bool loaded) { mInfoLoaded = loaded; } + static void setClickThrough( + const LLUUID& classified_id, + S32 teleport, + S32 map, + S32 profile, + bool from_new_table); + + static void sendClickMessage( + const std::string& type, + bool from_search, + const LLUUID& classified_id, + const LLUUID& parcel_id, + const LLVector3d& global_pos, + const std::string& sim_name); + void setExitCallback(const commit_callback_t& cb); void setEditClassifiedCallback(const commit_callback_t& cb); + /*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE); + + /*virtual*/ void draw(); + protected: LLPanelClassifiedInfo(); @@ -266,21 +314,52 @@ protected: const std::string& sim_name, const LLVector3d& pos_global); + void stretchSnapshot(); + void sendClickMessage(const std::string& type); + + LLRect getDefaultSnapshotRect(); + + void scrollToTop(); + void onMapClick(); void onTeleportClick(); void onExit(); + bool mSnapshotStreched; + LLRect mSnapshotRect; + LLTextureCtrl* mSnapshotCtrl; + private: LLUUID mAvatarId; LLUUID mClassifiedId; LLVector3d mPosGlobal; LLUUID mParcelId; + std::string mSimName; + bool mFromSearch; bool mInfoLoaded; + + LLScrollContainer* mScrollContainer; + LLPanel* mScrollingPanel; + + S32 mScrollingPanelMinHeight; + S32 mScrollingPanelWidth; + + // Needed for stat tracking + S32 mTeleportClicksOld; + S32 mMapClicksOld; + S32 mProfileClicksOld; + S32 mTeleportClicksNew; + S32 mMapClicksNew; + S32 mProfileClicksNew; + + typedef std::list<LLPanelClassifiedInfo*> panel_list_t; + static panel_list_t sAllPanels; }; class LLPanelClassifiedEdit : public LLPanelClassifiedInfo { + LOG_CLASS(LLPanelClassifiedEdit); public: static LLPanelClassifiedEdit* create(); @@ -289,6 +368,8 @@ public: /*virtual*/ BOOL postBuild(); + void fillIn(const LLSD& key); + /*virtual*/ void onOpen(const LLSD& key); /*virtual*/ void processProperties(void* data, EAvatarProcessorType type); @@ -297,31 +378,47 @@ public: /*virtual*/ void resetDirty(); - void setSaveCallback(const commit_callback_t& cb); + void setSaveCallback(const commit_signal_t::slot_type& cb); - void setCancelCallback(const commit_callback_t& cb); + void setCancelCallback(const commit_signal_t::slot_type& cb); /*virtual*/ void resetControls(); bool isNew() { return mIsNew; } + bool isNewWithErrors() { return mIsNewWithErrors; } + bool canClose(); + void draw(); + + void stretchSnapshot(); + + U32 getCategory(); + + void setCategory(U32 category); + + U32 getContentType(); + + void setContentType(U32 content_type); + + bool getAutoRenew(); + + S32 getPriceForListing(); + protected: LLPanelClassifiedEdit(); void sendUpdate(); - U32 getCategory(); - void enableVerbs(bool enable); void enableEditing(bool enable); std::string makeClassifiedName(); - S32 getPriceForListing(); + void setPriceForListing(S32 price); U8 getFlags(); @@ -335,12 +432,23 @@ protected: void onChange(); void onSaveClick(); + void doSave(); + + void onPublishFloaterPublishClicked(); + void onTexturePickerMouseEnter(LLUICtrl* ctrl); void onTexturePickerMouseLeave(LLUICtrl* ctrl); + void onTextureSelected(); + private: bool mIsNew; + bool mIsNewWithErrors; bool mCanClose; + + LLPublishClassifiedFloater* mPublishFloater; + + commit_signal_t mSaveButtonClickedSignal; }; #endif // LL_LLPANELCLASSIFIED_H diff --git a/indra/newview/llpanelcontents.cpp b/indra/newview/llpanelcontents.cpp index 2a7d097f94..f4c0a842e7 100644 --- a/indra/newview/llpanelcontents.cpp +++ b/indra/newview/llpanelcontents.cpp @@ -40,6 +40,7 @@ #include "llerror.h" #include "llfloaterreg.h" #include "llfontgl.h" +#include "llinventorydefines.h" #include "llmaterialtable.h" #include "llpermissionsflags.h" #include "llrect.h" @@ -180,7 +181,7 @@ void LLPanelContents::onClickNewScript(void *userdata) LLTrans::getString("PanelContentsNewScript"), desc, LLSaleInfo::DEFAULT, - LLViewerInventoryItem::II_FLAGS_NONE, + LLInventoryItemFlags::II_FLAGS_NONE, time_corrected()); object->saveScript(new_item, TRUE, true); diff --git a/indra/newview/llpaneleditwearable.cpp b/indra/newview/llpaneleditwearable.cpp index e7acc68b93..4402b2130f 100644 --- a/indra/newview/llpaneleditwearable.cpp +++ b/indra/newview/llpaneleditwearable.cpp @@ -50,6 +50,19 @@ #include "llaccordionctrltab.h" #include "llagentwearables.h" #include "llscrollingpanelparam.h" +#include "llradiogroup.h" +#include "llnotificationsutil.h" + +#include "llcolorswatch.h" +#include "lltexturectrl.h" +#include "lltextureentry.h" +#include "llviewercontrol.h" // gSavedSettings +#include "llviewertexturelist.h" +#include "llagentcamera.h" +#include "llmorphview.h" + +#include "llcommandhandler.h" +#include "lltextutil.h" // register panel with appropriate XML static LLRegisterPanelClassWrapper<LLPanelEditWearable> t_edit_wearable("panel_edit_wearable"); @@ -88,6 +101,8 @@ enum ESubpart { SUBPART_TATTOO }; +using namespace LLVOAvatarDefines; + typedef std::vector<ESubpart> subpart_vec_t; // Locally defined classes @@ -107,25 +122,28 @@ public: public: struct WearableEntry : public LLDictionaryEntry { - WearableEntry(EWearableType type, + WearableEntry(LLWearableType::EType type, const std::string &title, const std::string &desc_title, - U8 num_subparts, ... ); // number of subparts followed by a list of ESubparts + U8 num_color_swatches, // number of 'color_swatches' + U8 num_texture_pickers, // number of 'texture_pickers' + U8 num_subparts, ... ); // number of subparts followed by a list of ETextureIndex and ESubparts - const EWearableType mWearableType; + const LLWearableType::EType mWearableType; const std::string mTitle; const std::string mDescTitle; subpart_vec_t mSubparts; - + texture_vec_t mColorSwatchCtrls; + texture_vec_t mTextureCtrls; }; - struct Wearables : public LLDictionary<EWearableType, WearableEntry> + struct Wearables : public LLDictionary<LLWearableType::EType, WearableEntry> { Wearables(); } mWearables; - const WearableEntry* getWearable(EWearableType type) const { return mWearables.lookup(type); } + const WearableEntry* getWearable(LLWearableType::EType type) const { return mWearables.lookup(type); } //-------------------------------------------------------------------- // Subparts @@ -158,6 +176,35 @@ public: } mSubparts; const SubpartEntry* getSubpart(ESubpart subpart) const { return mSubparts.lookup(subpart); } + + //-------------------------------------------------------------------- + // Picker Control Entries + //-------------------------------------------------------------------- +public: + struct PickerControlEntry : public LLDictionaryEntry + { + PickerControlEntry(ETextureIndex tex_index, + const std::string name, + const LLUUID default_image_id = LLUUID::null, + const bool allow_no_texture = false); + ETextureIndex mTextureIndex; + const std::string mControlName; + const LLUUID mDefaultImageId; + const bool mAllowNoTexture; + }; + + struct ColorSwatchCtrls : public LLDictionary<ETextureIndex, PickerControlEntry> + { + ColorSwatchCtrls(); + } mColorSwatchCtrls; + + struct TextureCtrls : public LLDictionary<ETextureIndex, PickerControlEntry> + { + TextureCtrls(); + } mTextureCtrls; + + const PickerControlEntry* getTexturePicker(ETextureIndex index) const { return mTextureCtrls.lookup(index); } + const PickerControlEntry* getColorSwatch(ETextureIndex index) const { return mColorSwatchCtrls.lookup(index); } }; LLEditWearableDictionary::LLEditWearableDictionary() @@ -172,26 +219,31 @@ LLEditWearableDictionary::~LLEditWearableDictionary() LLEditWearableDictionary::Wearables::Wearables() { - addEntry(WT_SHAPE, new WearableEntry(WT_SHAPE,"edit_shape_title","shape_desc_text",9, SUBPART_SHAPE_HEAD, SUBPART_SHAPE_EYES, SUBPART_SHAPE_EARS, SUBPART_SHAPE_NOSE, SUBPART_SHAPE_MOUTH, SUBPART_SHAPE_CHIN, SUBPART_SHAPE_TORSO, SUBPART_SHAPE_LEGS, SUBPART_SHAPE_WHOLE)); - addEntry(WT_SKIN, new WearableEntry(WT_SKIN,"edit_skin_title","skin_desc_text",4, SUBPART_SKIN_COLOR, SUBPART_SKIN_FACEDETAIL, SUBPART_SKIN_MAKEUP, SUBPART_SKIN_BODYDETAIL)); - addEntry(WT_HAIR, new WearableEntry(WT_HAIR,"edit_hair_title","hair_desc_text",4, SUBPART_HAIR_COLOR, SUBPART_HAIR_STYLE, SUBPART_HAIR_EYEBROWS, SUBPART_HAIR_FACIAL)); - addEntry(WT_EYES, new WearableEntry(WT_EYES,"edit_eyes_title","eyes_desc_text",1, SUBPART_EYES)); - addEntry(WT_SHIRT, new WearableEntry(WT_SHIRT,"edit_shirt_title","shirt_desc_text",1, SUBPART_SHIRT)); - addEntry(WT_PANTS, new WearableEntry(WT_PANTS,"edit_pants_title","pants_desc_text",1, SUBPART_PANTS)); - addEntry(WT_SHOES, new WearableEntry(WT_SHOES,"edit_shoes_title","shoes_desc_text",1, SUBPART_SHOES)); - addEntry(WT_SOCKS, new WearableEntry(WT_SOCKS,"edit_socks_title","socks_desc_text",1, SUBPART_SOCKS)); - addEntry(WT_JACKET, new WearableEntry(WT_JACKET,"edit_jacket_title","jacket_desc_text",1, SUBPART_JACKET)); - addEntry(WT_GLOVES, new WearableEntry(WT_GLOVES,"edit_gloves_title","gloves_desc_text",1, SUBPART_GLOVES)); - addEntry(WT_UNDERSHIRT, new WearableEntry(WT_UNDERSHIRT,"edit_undershirt_title","undershirt_desc_text",1, SUBPART_UNDERSHIRT)); - addEntry(WT_UNDERPANTS, new WearableEntry(WT_UNDERPANTS,"edit_underpants_title","underpants_desc_text",1, SUBPART_UNDERPANTS)); - addEntry(WT_SKIRT, new WearableEntry(WT_SKIRT,"edit_skirt_title","skirt_desc_text",1, SUBPART_SKIRT)); - addEntry(WT_ALPHA, new WearableEntry(WT_ALPHA,"edit_alpha_title","alpha_desc_text",1, SUBPART_ALPHA)); - addEntry(WT_TATTOO, new WearableEntry(WT_TATTOO,"edit_tattoo_title","tattoo_desc_text",1, SUBPART_TATTOO)); -} - -LLEditWearableDictionary::WearableEntry::WearableEntry(EWearableType type, + // note the subpart that is listed first is treated as "default", regardless of what order is in enum. + // Please match the order presented in XUI. -Nyx + // this will affect what camera angle is shown when first editing a wearable + addEntry(LLWearableType::WT_SHAPE, new WearableEntry(LLWearableType::WT_SHAPE,"edit_shape_title","shape_desc_text",0,0,9, SUBPART_SHAPE_WHOLE, SUBPART_SHAPE_HEAD, SUBPART_SHAPE_EYES, SUBPART_SHAPE_EARS, SUBPART_SHAPE_NOSE, SUBPART_SHAPE_MOUTH, SUBPART_SHAPE_CHIN, SUBPART_SHAPE_TORSO, SUBPART_SHAPE_LEGS )); + addEntry(LLWearableType::WT_SKIN, new WearableEntry(LLWearableType::WT_SKIN,"edit_skin_title","skin_desc_text",0,3,4, TEX_HEAD_BODYPAINT, TEX_UPPER_BODYPAINT, TEX_LOWER_BODYPAINT, SUBPART_SKIN_COLOR, SUBPART_SKIN_FACEDETAIL, SUBPART_SKIN_MAKEUP, SUBPART_SKIN_BODYDETAIL)); + addEntry(LLWearableType::WT_HAIR, new WearableEntry(LLWearableType::WT_HAIR,"edit_hair_title","hair_desc_text",0,1,4, TEX_HAIR, SUBPART_HAIR_COLOR, SUBPART_HAIR_STYLE, SUBPART_HAIR_EYEBROWS, SUBPART_HAIR_FACIAL)); + addEntry(LLWearableType::WT_EYES, new WearableEntry(LLWearableType::WT_EYES,"edit_eyes_title","eyes_desc_text",0,1,1, TEX_EYES_IRIS, SUBPART_EYES)); + addEntry(LLWearableType::WT_SHIRT, new WearableEntry(LLWearableType::WT_SHIRT,"edit_shirt_title","shirt_desc_text",1,1,1, TEX_UPPER_SHIRT, TEX_UPPER_SHIRT, SUBPART_SHIRT)); + addEntry(LLWearableType::WT_PANTS, new WearableEntry(LLWearableType::WT_PANTS,"edit_pants_title","pants_desc_text",1,1,1, TEX_LOWER_PANTS, TEX_LOWER_PANTS, SUBPART_PANTS)); + addEntry(LLWearableType::WT_SHOES, new WearableEntry(LLWearableType::WT_SHOES,"edit_shoes_title","shoes_desc_text",1,1,1, TEX_LOWER_SHOES, TEX_LOWER_SHOES, SUBPART_SHOES)); + addEntry(LLWearableType::WT_SOCKS, new WearableEntry(LLWearableType::WT_SOCKS,"edit_socks_title","socks_desc_text",1,1,1, TEX_LOWER_SOCKS, TEX_LOWER_SOCKS, SUBPART_SOCKS)); + addEntry(LLWearableType::WT_JACKET, new WearableEntry(LLWearableType::WT_JACKET,"edit_jacket_title","jacket_desc_text",1,2,1, TEX_UPPER_JACKET, TEX_UPPER_JACKET, TEX_LOWER_JACKET, SUBPART_JACKET)); + addEntry(LLWearableType::WT_GLOVES, new WearableEntry(LLWearableType::WT_GLOVES,"edit_gloves_title","gloves_desc_text",1,1,1, TEX_UPPER_GLOVES, TEX_UPPER_GLOVES, SUBPART_GLOVES)); + addEntry(LLWearableType::WT_UNDERSHIRT, new WearableEntry(LLWearableType::WT_UNDERSHIRT,"edit_undershirt_title","undershirt_desc_text",1,1,1, TEX_UPPER_UNDERSHIRT, TEX_UPPER_UNDERSHIRT, SUBPART_UNDERSHIRT)); + addEntry(LLWearableType::WT_UNDERPANTS, new WearableEntry(LLWearableType::WT_UNDERPANTS,"edit_underpants_title","underpants_desc_text",1,1,1, TEX_LOWER_UNDERPANTS, TEX_LOWER_UNDERPANTS, SUBPART_UNDERPANTS)); + addEntry(LLWearableType::WT_SKIRT, new WearableEntry(LLWearableType::WT_SKIRT,"edit_skirt_title","skirt_desc_text",1,1,1, TEX_SKIRT, TEX_SKIRT, SUBPART_SKIRT)); + addEntry(LLWearableType::WT_ALPHA, new WearableEntry(LLWearableType::WT_ALPHA,"edit_alpha_title","alpha_desc_text",0,5,1, TEX_LOWER_ALPHA, TEX_UPPER_ALPHA, TEX_HEAD_ALPHA, TEX_EYES_ALPHA, TEX_HAIR_ALPHA, SUBPART_ALPHA)); + addEntry(LLWearableType::WT_TATTOO, new WearableEntry(LLWearableType::WT_TATTOO,"edit_tattoo_title","tattoo_desc_text",1,3,1, TEX_HEAD_TATTOO, TEX_LOWER_TATTOO, TEX_UPPER_TATTOO, TEX_HEAD_TATTOO, SUBPART_TATTOO)); +} + +LLEditWearableDictionary::WearableEntry::WearableEntry(LLWearableType::EType type, const std::string &title, const std::string &desc_title, + U8 num_color_swatches, + U8 num_texture_pickers, U8 num_subparts, ... ) : LLDictionaryEntry(title), mWearableType(type), @@ -201,6 +253,18 @@ LLEditWearableDictionary::WearableEntry::WearableEntry(EWearableType type, va_list argp; va_start(argp, num_subparts); + for (U8 i = 0; i < num_color_swatches; ++i) + { + ETextureIndex index = (ETextureIndex)va_arg(argp,int); + mColorSwatchCtrls.push_back(index); + } + + for (U8 i = 0; i < num_texture_pickers; ++i) + { + ETextureIndex index = (ETextureIndex)va_arg(argp,int); + mTextureCtrls.push_back(index); + } + for (U8 i = 0; i < num_subparts; ++i) { ESubpart part = (ESubpart)va_arg(argp,int); @@ -265,12 +329,280 @@ LLEditWearableDictionary::SubpartEntry::SubpartEntry(ESubpart part, { } +LLEditWearableDictionary::ColorSwatchCtrls::ColorSwatchCtrls() +{ + addEntry ( TEX_UPPER_SHIRT, new PickerControlEntry (TEX_UPPER_SHIRT, "Color/Tint" )); + addEntry ( TEX_LOWER_PANTS, new PickerControlEntry (TEX_LOWER_PANTS, "Color/Tint" )); + addEntry ( TEX_LOWER_SHOES, new PickerControlEntry (TEX_LOWER_SHOES, "Color/Tint" )); + addEntry ( TEX_LOWER_SOCKS, new PickerControlEntry (TEX_LOWER_SOCKS, "Color/Tint" )); + addEntry ( TEX_UPPER_JACKET, new PickerControlEntry (TEX_UPPER_JACKET, "Color/Tint" )); + addEntry ( TEX_SKIRT, new PickerControlEntry (TEX_SKIRT, "Color/Tint" )); + addEntry ( TEX_UPPER_GLOVES, new PickerControlEntry (TEX_UPPER_GLOVES, "Color/Tint" )); + addEntry ( TEX_UPPER_UNDERSHIRT, new PickerControlEntry (TEX_UPPER_UNDERSHIRT, "Color/Tint" )); + addEntry ( TEX_LOWER_UNDERPANTS, new PickerControlEntry (TEX_LOWER_UNDERPANTS, "Color/Tint" )); + addEntry ( TEX_HEAD_TATTOO, new PickerControlEntry(TEX_HEAD_TATTOO, "Color/Tint" )); +} + +LLEditWearableDictionary::TextureCtrls::TextureCtrls() +{ + addEntry ( TEX_HEAD_BODYPAINT, new PickerControlEntry (TEX_HEAD_BODYPAINT, "Head Tattoos", LLUUID::null, TRUE )); + addEntry ( TEX_UPPER_BODYPAINT, new PickerControlEntry (TEX_UPPER_BODYPAINT, "Upper Tattoos", LLUUID::null, TRUE )); + addEntry ( TEX_LOWER_BODYPAINT, new PickerControlEntry (TEX_LOWER_BODYPAINT, "Lower Tattoos", LLUUID::null, TRUE )); + addEntry ( TEX_HAIR, new PickerControlEntry (TEX_HAIR, "Texture", LLUUID( gSavedSettings.getString( "UIImgDefaultHairUUID" ) ), FALSE )); + addEntry ( TEX_EYES_IRIS, new PickerControlEntry (TEX_EYES_IRIS, "Iris", LLUUID( gSavedSettings.getString( "UIImgDefaultEyesUUID" ) ), FALSE )); + addEntry ( TEX_UPPER_SHIRT, new PickerControlEntry (TEX_UPPER_SHIRT, "Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultShirtUUID" ) ), FALSE )); + addEntry ( TEX_LOWER_PANTS, new PickerControlEntry (TEX_LOWER_PANTS, "Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultPantsUUID" ) ), FALSE )); + addEntry ( TEX_LOWER_SHOES, new PickerControlEntry (TEX_LOWER_SHOES, "Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultShoesUUID" ) ), FALSE )); + addEntry ( TEX_LOWER_SOCKS, new PickerControlEntry (TEX_LOWER_SOCKS, "Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultSocksUUID" ) ), FALSE )); + addEntry ( TEX_UPPER_JACKET, new PickerControlEntry (TEX_UPPER_JACKET, "Upper Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultJacketUUID" ) ), FALSE )); + addEntry ( TEX_LOWER_JACKET, new PickerControlEntry (TEX_LOWER_JACKET, "Lower Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultJacketUUID" ) ), FALSE )); + addEntry ( TEX_SKIRT, new PickerControlEntry (TEX_SKIRT, "Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultSkirtUUID" ) ), FALSE )); + addEntry ( TEX_UPPER_GLOVES, new PickerControlEntry (TEX_UPPER_GLOVES, "Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultGlovesUUID" ) ), FALSE )); + addEntry ( TEX_UPPER_UNDERSHIRT, new PickerControlEntry (TEX_UPPER_UNDERSHIRT, "Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultUnderwearUUID" ) ), FALSE )); + addEntry ( TEX_LOWER_UNDERPANTS, new PickerControlEntry (TEX_LOWER_UNDERPANTS, "Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultUnderwearUUID" ) ), FALSE )); + addEntry ( TEX_LOWER_ALPHA, new PickerControlEntry (TEX_LOWER_ALPHA, "Lower Alpha", LLUUID( gSavedSettings.getString( "UIImgDefaultAlphaUUID" ) ), TRUE )); + addEntry ( TEX_UPPER_ALPHA, new PickerControlEntry (TEX_UPPER_ALPHA, "Upper Alpha", LLUUID( gSavedSettings.getString( "UIImgDefaultAlphaUUID" ) ), TRUE )); + addEntry ( TEX_HEAD_ALPHA, new PickerControlEntry (TEX_HEAD_ALPHA, "Head Alpha", LLUUID( gSavedSettings.getString( "UIImgDefaultAlphaUUID" ) ), TRUE )); + addEntry ( TEX_EYES_ALPHA, new PickerControlEntry (TEX_EYES_ALPHA, "Eye Alpha", LLUUID( gSavedSettings.getString( "UIImgDefaultAlphaUUID" ) ), TRUE )); + addEntry ( TEX_HAIR_ALPHA, new PickerControlEntry (TEX_HAIR_ALPHA, "Hair Alpha", LLUUID( gSavedSettings.getString( "UIImgDefaultAlphaUUID" ) ), TRUE )); + addEntry ( TEX_LOWER_TATTOO, new PickerControlEntry (TEX_LOWER_TATTOO, "Lower Tattoo", LLUUID::null, TRUE )); + addEntry ( TEX_UPPER_TATTOO, new PickerControlEntry (TEX_UPPER_TATTOO, "Upper Tattoo", LLUUID::null, TRUE )); + addEntry ( TEX_HEAD_TATTOO, new PickerControlEntry (TEX_HEAD_TATTOO, "Head Tattoo", LLUUID::null, TRUE )); +} + +LLEditWearableDictionary::PickerControlEntry::PickerControlEntry(ETextureIndex tex_index, + const std::string name, + const LLUUID default_image_id, + const bool allow_no_texture) : + LLDictionaryEntry(name), + mTextureIndex(tex_index), + mControlName(name), + mDefaultImageId(default_image_id), + mAllowNoTexture(allow_no_texture) +{ +} + +// Helper functions. +static const texture_vec_t null_texture_vec; + +// Specializations of this template function return a vector of texture indexes of particular control type +// (i.e. LLColorSwatchCtrl or LLTextureCtrl) which are contained in given WearableEntry. +template <typename T> +const texture_vec_t& +get_pickers_indexes(const LLEditWearableDictionary::WearableEntry *wearable_entry) { return null_texture_vec; } + +// Specializations of this template function return picker control entry for particular control type. +template <typename T> +const LLEditWearableDictionary::PickerControlEntry* +get_picker_entry (const ETextureIndex index) { return NULL; } + +typedef boost::function<void(LLPanel* panel, const LLEditWearableDictionary::PickerControlEntry*)> function_t; + +typedef struct PickerControlEntryNamePredicate +{ + PickerControlEntryNamePredicate(const std::string name) : mName (name) {}; + bool operator()(const LLEditWearableDictionary::PickerControlEntry* entry) const + { + return (entry && entry->mName == mName); + } +private: + const std::string mName; +} PickerControlEntryNamePredicate; + +// A full specialization of get_pickers_indexes for LLColorSwatchCtrl +template <> +const texture_vec_t& +get_pickers_indexes<LLColorSwatchCtrl> (const LLEditWearableDictionary::WearableEntry *wearable_entry) +{ + if (!wearable_entry) + { + llwarns << "could not get LLColorSwatchCtrl indexes for null wearable entry." << llendl; + return null_texture_vec; + } + return wearable_entry->mColorSwatchCtrls; +} + +// A full specialization of get_pickers_indexes for LLTextureCtrl +template <> +const texture_vec_t& +get_pickers_indexes<LLTextureCtrl> (const LLEditWearableDictionary::WearableEntry *wearable_entry) +{ + if (!wearable_entry) + { + llwarns << "could not get LLTextureCtrl indexes for null wearable entry." << llendl; + return null_texture_vec; + } + return wearable_entry->mTextureCtrls; +} + +// A full specialization of get_picker_entry for LLColorSwatchCtrl +template <> +const LLEditWearableDictionary::PickerControlEntry* +get_picker_entry<LLColorSwatchCtrl> (const ETextureIndex index) +{ + return LLEditWearableDictionary::getInstance()->getColorSwatch(index); +} + +// A full specialization of get_picker_entry for LLTextureCtrl +template <> +const LLEditWearableDictionary::PickerControlEntry* +get_picker_entry<LLTextureCtrl> (const ETextureIndex index) +{ + return LLEditWearableDictionary::getInstance()->getTexturePicker(index); +} + +template <typename CtrlType, class Predicate> +const LLEditWearableDictionary::PickerControlEntry* +find_picker_ctrl_entry_if(LLWearableType::EType type, const Predicate pred) +{ + const LLEditWearableDictionary::WearableEntry *wearable_entry + = LLEditWearableDictionary::getInstance()->getWearable(type); + if (!wearable_entry) + { + llwarns << "could not get wearable dictionary entry for wearable of type: " << type << llendl; + return NULL; + } + const texture_vec_t& indexes = get_pickers_indexes<CtrlType>(wearable_entry); + for (texture_vec_t::const_iterator + iter = indexes.begin(), + iter_end = indexes.end(); + iter != iter_end; ++iter) + { + const ETextureIndex te = *iter; + const LLEditWearableDictionary::PickerControlEntry* entry + = get_picker_entry<CtrlType>(te); + if (!entry) + { + llwarns << "could not get picker dictionary entry (" << te << ") for wearable of type: " << type << llendl; + continue; + } + if (pred(entry)) + { + return entry; + } + } + return NULL; +} + +template <typename CtrlType> +void +for_each_picker_ctrl_entry(LLPanel* panel, LLWearableType::EType type, function_t fun) +{ + if (!panel) + { + llwarns << "the panel wasn't passed for wearable of type: " << type << llendl; + return; + } + const LLEditWearableDictionary::WearableEntry *wearable_entry + = LLEditWearableDictionary::getInstance()->getWearable(type); + if (!wearable_entry) + { + llwarns << "could not get wearable dictionary entry for wearable of type: " << type << llendl; + return; + } + const texture_vec_t& indexes = get_pickers_indexes<CtrlType>(wearable_entry); + for (texture_vec_t::const_iterator + iter = indexes.begin(), + iter_end = indexes.end(); + iter != iter_end; ++iter) + { + const ETextureIndex te = *iter; + const LLEditWearableDictionary::PickerControlEntry* entry + = get_picker_entry<CtrlType>(te); + if (!entry) + { + llwarns << "could not get picker dictionary entry (" << te << ") for wearable of type: " << type << llendl; + continue; + } + fun (panel, entry); + } +} + +// The helper functions for pickers management +static void init_color_swatch_ctrl(LLPanelEditWearable* self, LLPanel* panel, const LLEditWearableDictionary::PickerControlEntry* entry) +{ + LLColorSwatchCtrl* color_swatch_ctrl = panel->getChild<LLColorSwatchCtrl>(entry->mControlName); + if (color_swatch_ctrl) + { + // Can't get the color from the wearable here, since the wearable may not be set when this is called. + color_swatch_ctrl->setOriginal(LLColor4::white); + } +} + +static void init_texture_ctrl(LLPanelEditWearable* self, LLPanel* panel, const LLEditWearableDictionary::PickerControlEntry* entry) +{ + LLTextureCtrl* texture_ctrl = panel->getChild<LLTextureCtrl>(entry->mControlName); + if (texture_ctrl) + { + texture_ctrl->setDefaultImageAssetID(entry->mDefaultImageId); + texture_ctrl->setAllowNoTexture(entry->mAllowNoTexture); + // Don't allow (no copy) or (notransfer) textures to be selected. + texture_ctrl->setImmediateFilterPermMask(PERM_NONE); + texture_ctrl->setNonImmediateFilterPermMask(PERM_NONE); + } +} + +static void update_color_swatch_ctrl(LLPanelEditWearable* self, LLPanel* panel, const LLEditWearableDictionary::PickerControlEntry* entry) +{ + LLColorSwatchCtrl* color_swatch_ctrl = panel->getChild<LLColorSwatchCtrl>(entry->mControlName); + if (color_swatch_ctrl) + { + color_swatch_ctrl->set(self->getWearable()->getClothesColor(entry->mTextureIndex)); + } +} + +static void update_texture_ctrl(LLPanelEditWearable* self, LLPanel* panel, const LLEditWearableDictionary::PickerControlEntry* entry) +{ + LLTextureCtrl* texture_ctrl = panel->getChild<LLTextureCtrl>(entry->mControlName); + if (texture_ctrl) + { + LLUUID new_id; + LLLocalTextureObject *lto = self->getWearable()->getLocalTextureObject(entry->mTextureIndex); + if( lto && (lto->getID() != IMG_DEFAULT_AVATAR) ) + { + new_id = lto->getID(); + } + else + { + new_id = LLUUID::null; + } + LLUUID old_id = texture_ctrl->getImageAssetID(); + if (old_id != new_id) + { + // texture has changed, close the floater to avoid DEV-22461 + texture_ctrl->closeDependentFloater(); + } + texture_ctrl->setImageAssetID(new_id); + } +} + +static void set_enabled_color_swatch_ctrl(bool enabled, LLPanel* panel, const LLEditWearableDictionary::PickerControlEntry* entry) +{ + LLColorSwatchCtrl* color_swatch_ctrl = panel->getChild<LLColorSwatchCtrl>(entry->mControlName); + if (color_swatch_ctrl) + { + color_swatch_ctrl->setEnabled(enabled); + } +} + +static void set_enabled_texture_ctrl(bool enabled, LLPanel* panel, const LLEditWearableDictionary::PickerControlEntry* entry) +{ + LLTextureCtrl* texture_ctrl = panel->getChild<LLTextureCtrl>(entry->mControlName); + if (texture_ctrl) + { + texture_ctrl->setEnabled(enabled); + } +} // LLPanelEditWearable LLPanelEditWearable::LLPanelEditWearable() : LLPanel() + , mWearablePtr(NULL) + , mWearableItem(NULL) { + mCommitCallbackRegistrar.add("ColorSwatch.Commit", boost::bind(&LLPanelEditWearable::onColorSwatchCommit, this, _1)); + mCommitCallbackRegistrar.add("TexturePicker.Commit", boost::bind(&LLPanelEditWearable::onTexturePickerCommit, this, _1)); } //virtual @@ -279,6 +611,36 @@ LLPanelEditWearable::~LLPanelEditWearable() } +bool LLPanelEditWearable::changeHeightUnits(const LLSD& new_value) +{ + updateMetricLayout( new_value.asBoolean() ); + updateTypeSpecificControls(LLWearableType::WT_SHAPE); + return true; +} + +void LLPanelEditWearable::updateMetricLayout(BOOL new_value) +{ + LLUIString current_metric, replacment_metric; + current_metric = new_value ? mMeters : mFeet; + replacment_metric = new_value ? mFeet : mMeters; + mHeigthValue.setArg( "[METRIC1]", current_metric.getString() ); + mReplacementMetricUrl.setArg( "[URL_METRIC2]", std::string("[secondlife:///app/metricsystem ") + replacment_metric.getString() + std::string("]")); +} + +void LLPanelEditWearable::updateAvatarHeightLabel() +{ + mTxtAvatarHeight->setText(LLStringUtil::null); + LLStyle::Params param; + param.color = mAvatarHeigthLabelColor; + mTxtAvatarHeight->appendText(mHeigth, false, param); + param.color = mAvatarHeigthValueLabelColor; + mTxtAvatarHeight->appendText(mHeigthValue, false, param); + param.color = mAvatarHeigthLabelColor; // using mAvatarHeigthLabelColor for '/' separator + mTxtAvatarHeight->appendText(" / ", false, param); + mTxtAvatarHeight->appendText(this->mReplacementMetricUrl, false, param); +} + + // virtual BOOL LLPanelEditWearable::postBuild() { @@ -290,11 +652,14 @@ BOOL LLPanelEditWearable::postBuild() // handled at appearance panel level? //mBtnBack->setClickedCallback(boost::bind(&LLPanelEditWearable::onBackButtonClicked, this)); - mTextEditor = getChild<LLTextEditor>("description"); + mNameEditor = getChild<LLLineEditor>("description"); mPanelTitle = getChild<LLTextBox>("edit_wearable_title"); mDescTitle = getChild<LLTextBox>("description_text"); + getChild<LLRadioGroup>("sex_radio")->setCommitCallback(boost::bind(&LLPanelEditWearable::onCommitSexChange, this)); + getChild<LLButton>("save_as_button")->setCommitCallback(boost::bind(&LLPanelEditWearable::onSaveAsButtonClicked, this)); + // The following panels will be shown/hidden based on what wearable we're editing // body parts mPanelShape = getChild<LLPanel>("edit_shape_panel"); @@ -315,8 +680,73 @@ BOOL LLPanelEditWearable::postBuild() mPanelAlpha = getChild<LLPanel>("edit_alpha_panel"); mPanelTattoo = getChild<LLPanel>("edit_tattoo_panel"); + mTxtAvatarHeight = mPanelShape->getChild<LLTextBox>("avatar_height"); + mWearablePtr = NULL; + configureAlphaCheckbox(LLVOAvatarDefines::TEX_LOWER_ALPHA, "lower alpha texture invisible"); + configureAlphaCheckbox(LLVOAvatarDefines::TEX_UPPER_ALPHA, "upper alpha texture invisible"); + configureAlphaCheckbox(LLVOAvatarDefines::TEX_HEAD_ALPHA, "head alpha texture invisible"); + configureAlphaCheckbox(LLVOAvatarDefines::TEX_EYES_ALPHA, "eye alpha texture invisible"); + configureAlphaCheckbox(LLVOAvatarDefines::TEX_HAIR_ALPHA, "hair alpha texture invisible"); + + // configure tab expanded callbacks + for (U32 type_index = 0; type_index < (U32)LLWearableType::WT_COUNT; ++type_index) + { + LLWearableType::EType type = (LLWearableType::EType) type_index; + const LLEditWearableDictionary::WearableEntry *wearable_entry = LLEditWearableDictionary::getInstance()->getWearable(type); + if (!wearable_entry) + { + llwarns << "could not get wearable dictionary entry for wearable of type: " << type << llendl; + continue; + } + U8 num_subparts = wearable_entry->mSubparts.size(); + + for (U8 index = 0; index < num_subparts; ++index) + { + // dive into data structures to get the panel we need + ESubpart subpart_e = wearable_entry->mSubparts[index]; + const LLEditWearableDictionary::SubpartEntry *subpart_entry = LLEditWearableDictionary::getInstance()->getSubpart(subpart_e); + + if (!subpart_entry) + { + llwarns << "could not get wearable subpart dictionary entry for subpart: " << subpart_e << llendl; + continue; + } + + const std::string accordion_tab = subpart_entry->mAccordionTab; + + LLAccordionCtrlTab *tab = getChild<LLAccordionCtrlTab>(accordion_tab); + + if (!tab) + { + llwarns << "could not get llaccordionctrltab from UI with name: " << accordion_tab << llendl; + continue; + } + + // initialize callback to ensure camera view changes appropriately. + tab->setDropDownStateChangedCallback(boost::bind(&LLPanelEditWearable::onTabExpandedCollapsed,this,_2,index)); + } + + // initialize texture and color picker controls + for_each_picker_ctrl_entry <LLColorSwatchCtrl> (getPanel(type), type, boost::bind(init_color_swatch_ctrl, this, _1, _2)); + for_each_picker_ctrl_entry <LLTextureCtrl> (getPanel(type), type, boost::bind(init_texture_ctrl, this, _1, _2)); + } + + // init all strings + mMeters = mPanelShape->getString("meters"); + mFeet = mPanelShape->getString("feet"); + mHeigth = mPanelShape->getString("height") + " "; + mHeigthValue = "[HEIGHT] [METRIC1]"; + mReplacementMetricUrl = "[URL_METRIC2]"; + + std::string color = mPanelShape->getString("heigth_label_color"); + mAvatarHeigthLabelColor = LLUIColorTable::instance().getColor(color, LLColor4::green); + color = mPanelShape->getString("heigth_value_label_color"); + mAvatarHeigthValueLabelColor = LLUIColorTable::instance().getColor(color, LLColor4::green); + gSavedSettings.getControl("HeightUnits")->getSignal()->connect(boost::bind(&LLPanelEditWearable::changeHeightUnits, this, _2)); + updateMetricLayout(gSavedSettings.getBOOL("HeightUnits")); + return TRUE; } @@ -328,7 +758,7 @@ BOOL LLPanelEditWearable::isDirty() const if (mWearablePtr) { if (mWearablePtr->isDirty() || - mWearablePtr->getName().compare(mTextEditor->getText()) != 0) + mWearablePtr->getName().compare(mNameEditor->getText()) != 0) { isDirty = TRUE; } @@ -338,8 +768,12 @@ BOOL LLPanelEditWearable::isDirty() const //virtual void LLPanelEditWearable::draw() { - BOOL is_dirty = isDirty(); - mBtnRevert->setEnabled(is_dirty); + updateVerbs(); + if (getWearable() && getWearable()->getType() == LLWearableType::WT_SHAPE) + { + //updating avatar height + updateTypeSpecificControls(LLWearableType::WT_SHAPE); + } LLPanel::draw(); } @@ -349,10 +783,9 @@ void LLPanelEditWearable::setWearable(LLWearable *wearable) showWearable(mWearablePtr, FALSE); mWearablePtr = wearable; showWearable(mWearablePtr, TRUE); - - initializePanel(); } + //static void LLPanelEditWearable::onRevertButtonClicked(void* userdata) { @@ -360,6 +793,158 @@ void LLPanelEditWearable::onRevertButtonClicked(void* userdata) panel->revertChanges(); } +void LLPanelEditWearable::onSaveAsButtonClicked() +{ + LLSD args; + args["DESC"] = mNameEditor->getText(); + + LLNotificationsUtil::add("SaveWearableAs", args, LLSD(), boost::bind(&LLPanelEditWearable::saveAsCallback, this, _1, _2)); +} + +void LLPanelEditWearable::saveAsCallback(const LLSD& notification, const LLSD& response) +{ + S32 option = LLNotificationsUtil::getSelectedOption(notification, response); + if (0 == option) + { + std::string wearable_name = response["message"].asString(); + LLStringUtil::trim(wearable_name); + if( !wearable_name.empty() ) + { + mNameEditor->setText(wearable_name); + saveChanges(); + } + } +} + +void LLPanelEditWearable::onCommitSexChange() +{ + if (!isAgentAvatarValid()) return; + + LLWearableType::EType type = mWearablePtr->getType(); + U32 index = gAgentWearables.getWearableIndex(mWearablePtr); + + if( !gAgentWearables.isWearableModifiable(type, index)) + { + return; + } + + LLViewerVisualParam* param = static_cast<LLViewerVisualParam*>(gAgentAvatarp->getVisualParam( "male" )); + if( !param ) + { + return; + } + + bool is_new_sex_male = (gSavedSettings.getU32("AvatarSex") ? SEX_MALE : SEX_FEMALE) == SEX_MALE; + LLWearable* wearable = gAgentWearables.getWearable(type, index); + if (wearable) + { + wearable->setVisualParamWeight(param->getID(), is_new_sex_male, FALSE); + } + param->setWeight( is_new_sex_male, FALSE ); + + gAgentAvatarp->updateSexDependentLayerSets( FALSE ); + + gAgentAvatarp->updateVisualParams(); + + updateScrollingPanelUI(); +} + +void LLPanelEditWearable::onTexturePickerCommit(const LLUICtrl* ctrl) +{ + const LLTextureCtrl* texture_ctrl = dynamic_cast<const LLTextureCtrl*>(ctrl); + if (!texture_ctrl) + { + llwarns << "got commit signal from not LLTextureCtrl." << llendl; + return; + } + + if (getWearable()) + { + LLWearableType::EType type = getWearable()->getType(); + const PickerControlEntryNamePredicate name_pred(texture_ctrl->getName()); + const LLEditWearableDictionary::PickerControlEntry* entry + = find_picker_ctrl_entry_if<LLTextureCtrl, PickerControlEntryNamePredicate>(type, name_pred); + if (entry) + { + // Set the new version + LLViewerFetchedTexture* image = LLViewerTextureManager::getFetchedTexture(texture_ctrl->getImageAssetID()); + if( image->getID().isNull() ) + { + image = LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT_AVATAR); + } + if (getWearable()) + { + U32 index = gAgentWearables.getWearableIndex(getWearable()); + gAgentAvatarp->setLocalTexture(entry->mTextureIndex, image, FALSE, index); + LLVisualParamHint::requestHintUpdates(); + gAgentAvatarp->wearableUpdated(type, FALSE); + } + } + else + { + llwarns << "could not get texture picker dictionary entry for wearable of type: " << type << llendl; + } + } +} + +void LLPanelEditWearable::onColorSwatchCommit(const LLUICtrl* ctrl) +{ + if (getWearable()) + { + LLWearableType::EType type = getWearable()->getType(); + const PickerControlEntryNamePredicate name_pred(ctrl->getName()); + const LLEditWearableDictionary::PickerControlEntry* entry + = find_picker_ctrl_entry_if<LLColorSwatchCtrl, PickerControlEntryNamePredicate>(type, name_pred); + if (entry) + { + const LLColor4& old_color = getWearable()->getClothesColor(entry->mTextureIndex); + const LLColor4& new_color = LLColor4(ctrl->getValue()); + if( old_color != new_color ) + { + getWearable()->setClothesColor(entry->mTextureIndex, new_color, TRUE); + LLVisualParamHint::requestHintUpdates(); + gAgentAvatarp->wearableUpdated(getWearable()->getType(), FALSE); + } + } + else + { + llwarns << "could not get color swatch dictionary entry for wearable of type: " << type << llendl; + } + } +} + +void LLPanelEditWearable::updatePanelPickerControls(LLWearableType::EType type) +{ + LLPanel* panel = getPanel(type); + if (!panel) + return; + + bool is_modifiable = false; + bool is_complete = false; + bool is_copyable = false; + + if(mWearableItem) + { + const LLPermissions& perm = mWearableItem->getPermissions(); + is_modifiable = perm.allowModifyBy(gAgent.getID(), gAgent.getGroupID()); + is_copyable = perm.allowCopyBy(gAgent.getID(), gAgent.getGroupID()); + is_complete = mWearableItem->isFinished(); + } + + if (is_modifiable && is_complete) + { + // Update picker controls + for_each_picker_ctrl_entry <LLColorSwatchCtrl> (panel, type, boost::bind(update_color_swatch_ctrl, this, _1, _2)); + for_each_picker_ctrl_entry <LLTextureCtrl> (panel, type, boost::bind(update_texture_ctrl, this, _1, _2)); + } + + if (!is_modifiable || !is_complete || !is_copyable) + { + // Disable controls + for_each_picker_ctrl_entry <LLColorSwatchCtrl> (panel, type, boost::bind(set_enabled_color_swatch_ctrl, false, _1, _2)); + for_each_picker_ctrl_entry <LLTextureCtrl> (panel, type, boost::bind(set_enabled_texture_ctrl, false, _1, _2)); + } +} void LLPanelEditWearable::saveChanges() { @@ -371,10 +956,10 @@ void LLPanelEditWearable::saveChanges() U32 index = gAgentWearables.getWearableIndex(mWearablePtr); - if (mWearablePtr->getName().compare(mTextEditor->getText()) != 0) + if (mWearablePtr->getName().compare(mNameEditor->getText()) != 0) { // the name of the wearable has changed, re-save wearable with new name - gAgentWearables.saveWearableAs(mWearablePtr->getType(), index, mTextEditor->getText(), FALSE); + gAgentWearables.saveWearableAs(mWearablePtr->getType(), index, mNameEditor->getText(), FALSE); } else { @@ -391,7 +976,7 @@ void LLPanelEditWearable::revertChanges() } mWearablePtr->revertValues(); - mTextEditor->setText(mWearablePtr->getName()); + mNameEditor->setText(mWearablePtr->getName()); } void LLPanelEditWearable::showWearable(LLWearable* wearable, BOOL show) @@ -401,95 +986,198 @@ void LLPanelEditWearable::showWearable(LLWearable* wearable, BOOL show) return; } - EWearableType type = wearable->getType(); + mWearableItem = gInventory.getItem(mWearablePtr->getItemID()); + llassert(mWearableItem); + + LLWearableType::EType type = wearable->getType(); LLPanel *targetPanel = NULL; std::string title; std::string description_title; - const LLEditWearableDictionary::WearableEntry *entry = LLEditWearableDictionary::getInstance()->getWearable(type); - if (!entry) + const LLEditWearableDictionary::WearableEntry *wearable_entry = LLEditWearableDictionary::getInstance()->getWearable(type); + if (!wearable_entry) { llwarns << "called LLPanelEditWearable::showWearable with an invalid wearable type! (" << type << ")" << llendl; return; } targetPanel = getPanel(type); - title = getString(entry->mTitle); - description_title = getString(entry->mDescTitle); + title = getString(wearable_entry->mTitle); + description_title = getString(wearable_entry->mDescTitle); + + // Update picker controls state + for_each_picker_ctrl_entry <LLColorSwatchCtrl> (targetPanel, type, boost::bind(set_enabled_color_swatch_ctrl, show, _1, _2)); + for_each_picker_ctrl_entry <LLTextureCtrl> (targetPanel, type, boost::bind(set_enabled_texture_ctrl, show, _1, _2)); targetPanel->setVisible(show); + toggleTypeSpecificControls(type); + if (show) { mPanelTitle->setText(title); mDescTitle->setText(description_title); + + // set name + mNameEditor->setText(wearable->getName()); + + updatePanelPickerControls(type); + updateTypeSpecificControls(type); + + // clear and rebuild visual param list + U8 num_subparts = wearable_entry->mSubparts.size(); + + for (U8 index = 0; index < num_subparts; ++index) + { + // dive into data structures to get the panel we need + ESubpart subpart_e = wearable_entry->mSubparts[index]; + const LLEditWearableDictionary::SubpartEntry *subpart_entry = LLEditWearableDictionary::getInstance()->getSubpart(subpart_e); + + if (!subpart_entry) + { + llwarns << "could not get wearable subpart dictionary entry for subpart: " << subpart_e << llendl; + continue; + } + + const std::string scrolling_panel = subpart_entry->mParamList; + const std::string accordion_tab = subpart_entry->mAccordionTab; + + LLScrollingPanelList *panel_list = getChild<LLScrollingPanelList>(scrolling_panel); + LLAccordionCtrlTab *tab = getChild<LLAccordionCtrlTab>(accordion_tab); + + if (!panel_list) + { + llwarns << "could not get scrolling panel list: " << scrolling_panel << llendl; + continue; + } + + if (!tab) + { + llwarns << "could not get llaccordionctrltab from UI with name: " << accordion_tab << llendl; + continue; + } + + // what edit group do we want to extract params for? + const std::string edit_group = subpart_entry->mEditGroup; + + // storage for ordered list of visual params + value_map_t sorted_params; + getSortedParams(sorted_params, edit_group); + + LLJoint* jointp = gAgentAvatarp->getJoint( subpart_entry->mTargetJoint ); + if (!jointp) + { + jointp = gAgentAvatarp->getJoint("mHead"); + } + + buildParamList(panel_list, sorted_params, tab, jointp); + + updateScrollingPanelUI(); + } + showDefaultSubpart(); + + updateVerbs(); } +} +void LLPanelEditWearable::showDefaultSubpart() +{ + changeCamera(0); } -void LLPanelEditWearable::initializePanel() +void LLPanelEditWearable::onTabExpandedCollapsed(const LLSD& param, U8 index) { - if (!mWearablePtr) + bool expanded = param.asBoolean(); + + if (!mWearablePtr || !gAgentCamera.cameraCustomizeAvatar()) { - // cannot initialize with a null reference. + // we don't have a valid wearable we're editing, or we've left the wearable editor return; } - EWearableType type = mWearablePtr->getType(); + if (expanded) + { + changeCamera(index); + } - // set name - mTextEditor->setText(mWearablePtr->getName()); +} - // clear and rebuild visual param list - const LLEditWearableDictionary::WearableEntry *wearable_entry = LLEditWearableDictionary::getInstance()->getWearable(type); +void LLPanelEditWearable::changeCamera(U8 subpart) +{ + const LLEditWearableDictionary::WearableEntry *wearable_entry = LLEditWearableDictionary::getInstance()->getWearable(mWearablePtr->getType()); if (!wearable_entry) { - llwarns << "could not get wearable dictionary entry for wearable of type: " << type << llendl; + llinfos << "could not get wearable dictionary entry for wearable type: " << mWearablePtr->getType() << llendl; return; } - U8 num_subparts = wearable_entry->mSubparts.size(); - for (U8 index = 0; index < num_subparts; ++index) + if (subpart >= wearable_entry->mSubparts.size()) { - // dive into data structures to get the panel we need - ESubpart subpart_e = wearable_entry->mSubparts[index]; - const LLEditWearableDictionary::SubpartEntry *subpart_entry = LLEditWearableDictionary::getInstance()->getSubpart(subpart_e); + llinfos << "accordion tab expanded for invalid subpart. Wearable type: " << mWearablePtr->getType() << " subpart num: " << subpart << llendl; + return; + } - if (!subpart_entry) - { - llwarns << "could not get wearable subpart dictionary entry for subpart: " << subpart_e << llendl; - continue; - } + ESubpart subpart_e = wearable_entry->mSubparts[subpart]; + const LLEditWearableDictionary::SubpartEntry *subpart_entry = LLEditWearableDictionary::getInstance()->getSubpart(subpart_e); - const std::string scrolling_panel = subpart_entry->mParamList; - const std::string accordion_tab = subpart_entry->mAccordionTab; + if (!subpart_entry) + { + llwarns << "could not get wearable subpart dictionary entry for subpart: " << subpart_e << llendl; + return; + } - LLScrollingPanelList *panel_list = getChild<LLScrollingPanelList>(scrolling_panel); - LLAccordionCtrlTab *tab = getChild<LLAccordionCtrlTab>(accordion_tab); + // Update the camera + gMorphView->setCameraDistToDefault(); + gMorphView->setCameraTargetJoint( gAgentAvatarp->getJoint( subpart_entry->mTargetJoint ) ); + gMorphView->setCameraTargetOffset( subpart_entry->mTargetOffset ); + gMorphView->setCameraOffset( subpart_entry->mCameraOffset ); + if (gSavedSettings.getBOOL("AppearanceCameraMovement")) + { + gMorphView->updateCamera(); + } +} - if (!panel_list) - { - llwarns << "could not get scrolling panel list: " << scrolling_panel << llendl; - continue; - } +void LLPanelEditWearable::updateScrollingPanelList() +{ + updateScrollingPanelUI(); +} + +void LLPanelEditWearable::toggleTypeSpecificControls(LLWearableType::EType type) +{ + // Toggle controls specific to shape editing panel. + { + bool is_shape = (type == LLWearableType::WT_SHAPE); + childSetVisible("sex_radio", is_shape); + childSetVisible("female_icon", is_shape); + childSetVisible("male_icon", is_shape); + } +} - if (!tab) +void LLPanelEditWearable::updateTypeSpecificControls(LLWearableType::EType type) +{ + const F32 ONE_METER = 1.0; + const F32 ONE_FOOT = 0.3048 * ONE_METER; // in meters + // Update controls specific to shape editing panel. + if (type == LLWearableType::WT_SHAPE) + { + // Update avatar height + F32 new_size = gAgentAvatarp->mBodySize.mV[VZ]; + if (gSavedSettings.getBOOL("HeightUnits") == FALSE) { - llwarns << "could not get llaccordionctrltab from UI with name: " << accordion_tab << llendl; - continue; + // convert meters to feet + new_size = new_size / ONE_FOOT; } - // what edit group do we want to extract params for? - const std::string edit_group = subpart_entry->mEditGroup; - - // storage for ordered list of visual params - value_map_t sorted_params; - getSortedParams(sorted_params, edit_group); + std::string avatar_height_str = llformat("%.2f", new_size); + mHeigthValue.setArg("[HEIGHT]", avatar_height_str); + updateAvatarHeightLabel(); + } - buildParamList(panel_list, sorted_params, tab); + if (LLWearableType::WT_ALPHA == type) + { + updateAlphaCheckboxes(); - updateScrollingPanelUI(); + initPreviousAlphaTextures(); } - } void LLPanelEditWearable::updateScrollingPanelUI() @@ -500,12 +1188,14 @@ void LLPanelEditWearable::updateScrollingPanelUI() return; } - EWearableType type = mWearablePtr->getType(); + LLWearableType::EType type = mWearablePtr->getType(); LLPanel *panel = getPanel(type); if(panel && (mWearablePtr->getItemID().notNull())) { const LLEditWearableDictionary::WearableEntry *wearable_entry = LLEditWearableDictionary::getInstance()->getWearable(type); + llassert(wearable_entry); + if (!wearable_entry) return; U8 num_subparts = wearable_entry->mSubparts.size(); LLScrollingPanelParam::sUpdateDelayFrames = 0; @@ -530,67 +1220,67 @@ void LLPanelEditWearable::updateScrollingPanelUI() } } -LLPanel* LLPanelEditWearable::getPanel(EWearableType type) +LLPanel* LLPanelEditWearable::getPanel(LLWearableType::EType type) { switch (type) { - case WT_SHAPE: + case LLWearableType::WT_SHAPE: return mPanelShape; break; - case WT_SKIN: + case LLWearableType::WT_SKIN: return mPanelSkin; break; - case WT_HAIR: + case LLWearableType::WT_HAIR: return mPanelHair; break; - case WT_EYES: + case LLWearableType::WT_EYES: return mPanelEyes; break; - case WT_SHIRT: + case LLWearableType::WT_SHIRT: return mPanelShirt; break; - case WT_PANTS: + case LLWearableType::WT_PANTS: return mPanelPants; break; - case WT_SHOES: + case LLWearableType::WT_SHOES: return mPanelShoes; break; - case WT_SOCKS: + case LLWearableType::WT_SOCKS: return mPanelSocks; break; - case WT_JACKET: + case LLWearableType::WT_JACKET: return mPanelJacket; break; - case WT_GLOVES: + case LLWearableType::WT_GLOVES: return mPanelGloves; break; - case WT_UNDERSHIRT: + case LLWearableType::WT_UNDERSHIRT: return mPanelUndershirt; break; - case WT_UNDERPANTS: + case LLWearableType::WT_UNDERPANTS: return mPanelUnderpants; break; - case WT_SKIRT: + case LLWearableType::WT_SKIRT: return mPanelSkirt; break; - case WT_ALPHA: + case LLWearableType::WT_ALPHA: return mPanelAlpha; break; - case WT_TATTOO: + case LLWearableType::WT_TATTOO: return mPanelTattoo; break; default: @@ -602,7 +1292,7 @@ LLPanel* LLPanelEditWearable::getPanel(EWearableType type) void LLPanelEditWearable::getSortedParams(value_map_t &sorted_params, const std::string &edit_group) { LLWearable::visual_param_vec_t param_list; - ESex avatar_sex = gAgent.getAvatarObject()->getSex(); + ESex avatar_sex = gAgentAvatarp->getSex(); mWearablePtr->getVisualParams(param_list); @@ -626,7 +1316,7 @@ void LLPanelEditWearable::getSortedParams(value_map_t &sorted_params, const std: } } -void LLPanelEditWearable::buildParamList(LLScrollingPanelList *panel_list, value_map_t &sorted_params, LLAccordionCtrlTab *tab) +void LLPanelEditWearable::buildParamList(LLScrollingPanelList *panel_list, value_map_t &sorted_params, LLAccordionCtrlTab *tab, LLJoint* jointp) { // sorted_params is sorted according to magnitude of effect from // least to greatest. Adding to the front of the child list @@ -640,18 +1330,129 @@ void LLPanelEditWearable::buildParamList(LLScrollingPanelList *panel_list, value { LLPanel::Params p; p.name("LLScrollingPanelParam"); - p.rect(LLRect(0, LLScrollingPanelParam::PARAM_PANEL_HEIGHT, LLScrollingPanelParam::PARAM_PANEL_WIDTH, 0 )); - LLScrollingPanelParam* panel_param = new LLScrollingPanelParam( p, NULL, (*it).second, TRUE, this->getWearable()); + LLScrollingPanelParam* panel_param = new LLScrollingPanelParam( p, NULL, (*it).second, TRUE, this->getWearable(), jointp); height = panel_list->addPanel( panel_param ); } - - S32 width = tab->getRect().getWidth(); - - tab->reshape(width,height + tab->getHeaderHeight()+10,FALSE); } } +void LLPanelEditWearable::updateVerbs() +{ + bool can_copy = false; + if(mWearableItem) + { + can_copy = mWearableItem->getPermissions().allowCopyBy(gAgentID); + } + BOOL is_dirty = isDirty(); + + mBtnRevert->setEnabled(is_dirty); + childSetEnabled("save_as_button", is_dirty && can_copy); + + if(isAgentAvatarValid()) + { + // Update viewer's radio buttons (of RadioGroup with control_name="AvatarSex") of Avatar's gender + // with value from "AvatarSex" setting + gSavedSettings.setU32("AvatarSex", (gAgentAvatarp->getSex() == SEX_MALE) ); + } + +} + +void LLPanelEditWearable::configureAlphaCheckbox(LLVOAvatarDefines::ETextureIndex te, const std::string& name) +{ + LLCheckBoxCtrl* checkbox = mPanelAlpha->getChild<LLCheckBoxCtrl>(name); + checkbox->setCommitCallback(boost::bind(&LLPanelEditWearable::onInvisibilityCommit, this, checkbox, te)); + + mAlphaCheckbox2Index[name] = te; +} + +void LLPanelEditWearable::onInvisibilityCommit(LLCheckBoxCtrl* checkbox_ctrl, LLVOAvatarDefines::ETextureIndex te) +{ + if (!checkbox_ctrl) return; + if (!getWearable()) return; + + llinfos << "onInvisibilityCommit, self " << this << " checkbox_ctrl " << checkbox_ctrl << llendl; + + bool new_invis_state = checkbox_ctrl->get(); + if (new_invis_state) + { + LLLocalTextureObject *lto = getWearable()->getLocalTextureObject(te); + mPreviousAlphaTexture[te] = lto->getID(); + + LLViewerFetchedTexture* image = LLViewerTextureManager::getFetchedTexture( IMG_INVISIBLE ); + U32 index = gAgentWearables.getWearableIndex(getWearable()); + gAgentAvatarp->setLocalTexture(te, image, FALSE, index); + gAgentAvatarp->wearableUpdated(getWearable()->getType(), FALSE); + } + else + { + // Try to restore previous texture, if any. + LLUUID prev_id = mPreviousAlphaTexture[te]; + if (prev_id.isNull() || (prev_id == IMG_INVISIBLE)) + { + prev_id = LLUUID( gSavedSettings.getString( "UIImgDefaultAlphaUUID" ) ); + } + if (prev_id.isNull()) return; + + LLViewerFetchedTexture* image = LLViewerTextureManager::getFetchedTexture(prev_id); + if (!image) return; + + U32 index = gAgentWearables.getWearableIndex(getWearable()); + gAgentAvatarp->setLocalTexture(te, image, FALSE, index); + gAgentAvatarp->wearableUpdated(getWearable()->getType(), FALSE); + } + + updatePanelPickerControls(getWearable()->getType()); +} + +void LLPanelEditWearable::updateAlphaCheckboxes() +{ + for(string_texture_index_map_t::iterator iter = mAlphaCheckbox2Index.begin(); + iter != mAlphaCheckbox2Index.end(); ++iter ) + { + LLVOAvatarDefines::ETextureIndex te = (LLVOAvatarDefines::ETextureIndex)iter->second; + LLCheckBoxCtrl* ctrl = mPanelAlpha->getChild<LLCheckBoxCtrl>(iter->first); + if (ctrl) + { + ctrl->set(!gAgentAvatarp->isTextureVisible(te, mWearablePtr)); + } + } +} + +void LLPanelEditWearable::initPreviousAlphaTextures() +{ + initPreviousAlphaTextureEntry(TEX_LOWER_ALPHA); + initPreviousAlphaTextureEntry(TEX_UPPER_ALPHA); + initPreviousAlphaTextureEntry(TEX_HEAD_ALPHA); + initPreviousAlphaTextureEntry(TEX_EYES_ALPHA); + initPreviousAlphaTextureEntry(TEX_LOWER_ALPHA); +} + +void LLPanelEditWearable::initPreviousAlphaTextureEntry(LLVOAvatarDefines::ETextureIndex te) +{ + LLLocalTextureObject *lto = getWearable()->getLocalTextureObject(te); + if (lto) + { + mPreviousAlphaTexture[te] = lto->getID(); + } +} + +// handle secondlife:///app/metricsystem +class LLMetricSystemHandler : public LLCommandHandler +{ +public: + LLMetricSystemHandler() : LLCommandHandler("metricsystem", UNTRUSTED_THROTTLE) { } + + bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web) + { + // change height units TRUE for meters and FALSE for feet + BOOL new_value = (gSavedSettings.getBOOL("HeightUnits") == FALSE) ? TRUE : FALSE; + gSavedSettings.setBOOL("HeightUnits", new_value); + return true; + } +}; +LLMetricSystemHandler gMetricSystemHandler; +// EOF diff --git a/indra/newview/llpaneleditwearable.h b/indra/newview/llpaneleditwearable.h index 4178659617..61441435cd 100644 --- a/indra/newview/llpaneleditwearable.h +++ b/indra/newview/llpaneleditwearable.h @@ -1,6 +1,6 @@ /** - * @file llfloatercustomize.h - * @brief The customize avatar floater, triggered by "Appearance..." + * @file llpaneleditwearable.h + * @brief A LLPanel dedicated to the editing of wearables. * * $LicenseInfo:firstyear=2009&license=viewergpl$ * @@ -36,15 +36,19 @@ #include "llpanel.h" #include "llscrollingpanellist.h" #include "llmodaldialog.h" -#include "llwearabledictionary.h" +#include "llvoavatardefines.h" +#include "llwearabletype.h" +class LLCheckBoxCtrl; class LLWearable; -class LLTextEditor; class LLTextBox; +class LLViewerInventoryItem; class LLViewerVisualParam; class LLVisualParamHint; class LLViewerJointMesh; class LLAccordionCtrlTab; +class LLJoint; +class LLLineEditor; class LLPanelEditWearable : public LLPanel { @@ -62,20 +66,56 @@ public: void saveChanges(); void revertChanges(); + void showDefaultSubpart(); + void onTabExpandedCollapsed(const LLSD& param, U8 index); + + void updateScrollingPanelList(); + static void onRevertButtonClicked(void* userdata); + void onCommitSexChange(); + void onSaveAsButtonClicked(); + void saveAsCallback(const LLSD& notification, const LLSD& response); + private: typedef std::map<F32, LLViewerVisualParam*> value_map_t; void showWearable(LLWearable* wearable, BOOL show); - void initializePanel(); void updateScrollingPanelUI(); - LLPanel* getPanel(EWearableType type); + LLPanel* getPanel(LLWearableType::EType type); void getSortedParams(value_map_t &sorted_params, const std::string &edit_group); - void buildParamList(LLScrollingPanelList *panel_list, value_map_t &sorted_params, LLAccordionCtrlTab *tab); + void buildParamList(LLScrollingPanelList *panel_list, value_map_t &sorted_params, LLAccordionCtrlTab *tab, LLJoint* jointp); + // update bottom bar buttons ("Save", "Revert", etc) + void updateVerbs(); + + void onColorSwatchCommit(const LLUICtrl*); + void onTexturePickerCommit(const LLUICtrl*); + void updatePanelPickerControls(LLWearableType::EType type); + void toggleTypeSpecificControls(LLWearableType::EType type); + void updateTypeSpecificControls(LLWearableType::EType type); + + // changes camera angle to default for selected subpart + void changeCamera(U8 subpart); + + //alpha mask checkboxes + void configureAlphaCheckbox(LLVOAvatarDefines::ETextureIndex te, const std::string& name); + void onInvisibilityCommit(LLCheckBoxCtrl* checkbox_ctrl, LLVOAvatarDefines::ETextureIndex te); + void updateAlphaCheckboxes(); + void initPreviousAlphaTextures(); + void initPreviousAlphaTextureEntry(LLVOAvatarDefines::ETextureIndex te); + + // callback for HeightUnits parameter. + bool changeHeightUnits(const LLSD& new_value); + + // updates current metric and replacemet metric label text + void updateMetricLayout(BOOL new_value); + + // updates avatar height label + void updateAvatarHeightLabel(); // the pointer to the wearable we're editing. NULL means we're not editing a wearable. LLWearable *mWearablePtr; + LLViewerInventoryItem* mWearableItem; // these are constant no matter what wearable we're editing LLButton *mBtnRevert; @@ -83,11 +123,24 @@ private: LLTextBox *mPanelTitle; LLTextBox *mDescTitle; + LLTextBox *mTxtAvatarHeight; + // localized and parametrized strings that used to build avatar_height_label + std::string mMeters; + std::string mFeet; + std::string mHeigth; + LLUIString mHeigthValue; + LLUIString mReplacementMetricUrl; + + // color for mHeigth string + LLUIColor mAvatarHeigthLabelColor; + // color for mHeigthValue string + LLUIColor mAvatarHeigthValueLabelColor; + // This text editor reference will change each time we edit a new wearable - // it will be grabbed from the currently visible panel - LLTextEditor *mTextEditor; + LLLineEditor *mNameEditor; // The following panels will be shown/hidden based on what wearable we're editing // body parts @@ -109,6 +162,11 @@ private: LLPanel *mPanelAlpha; LLPanel *mPanelTattoo; + typedef std::map<std::string, LLVOAvatarDefines::ETextureIndex> string_texture_index_map_t; + string_texture_index_map_t mAlphaCheckbox2Index; + + typedef std::map<LLVOAvatarDefines::ETextureIndex, LLUUID> s32_uuid_map_t; + s32_uuid_map_t mPreviousAlphaTexture; }; #endif diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp index 8c5208678e..b50c6442e1 100644 --- a/indra/newview/llpanelface.cpp +++ b/indra/newview/llpanelface.cpp @@ -265,10 +265,13 @@ void LLPanelFace::sendAlpha() void LLPanelFace::sendGlow() { - LLSpinCtrl* mCtrlGlow = getChild<LLSpinCtrl>("glow"); - F32 glow = mCtrlGlow->get(); - - LLSelectMgr::getInstance()->selectionSetGlow( glow ); + LLSpinCtrl* mCtrlGlow = getChild<LLSpinCtrl>("glow"); + llassert(mCtrlGlow); + if (mCtrlGlow) + { + F32 glow = mCtrlGlow->get(); + LLSelectMgr::getInstance()->selectionSetGlow( glow ); + } } struct LLPanelFaceSetTEFunctor : public LLSelectedTEFunctor @@ -286,6 +289,9 @@ struct LLPanelFaceSetTEFunctor : public LLSelectedTEFunctor LLCheckBoxCtrl* checkFlipScaleS = mPanel->getChild<LLCheckBoxCtrl>("checkbox flip s"); LLCheckBoxCtrl* checkFlipScaleT = mPanel->getChild<LLCheckBoxCtrl>("checkbox flip t"); LLComboBox* comboTexGen = mPanel->getChild<LLComboBox>("combobox texgen"); + llassert(comboTexGen); + llassert(object); + if (ctrlTexScaleS) { valid = !ctrlTexScaleS->getTentative() || !checkFlipScaleS->getTentative(); @@ -296,7 +302,8 @@ struct LLPanelFaceSetTEFunctor : public LLSelectedTEFunctor { value = -value; } - if (comboTexGen->getCurrentIndex() == 1) + if (comboTexGen && + comboTexGen->getCurrentIndex() == 1) { value *= 0.5f; } @@ -314,7 +321,8 @@ struct LLPanelFaceSetTEFunctor : public LLSelectedTEFunctor { value = -value; } - if (comboTexGen->getCurrentIndex() == 1) + if (comboTexGen && + comboTexGen->getCurrentIndex() == 1) { value *= 0.5f; } diff --git a/indra/newview/llpanelgenerictip.cpp b/indra/newview/llpanelgenerictip.cpp new file mode 100644 index 0000000000..e0658554a4 --- /dev/null +++ b/indra/newview/llpanelgenerictip.cpp @@ -0,0 +1,51 @@ +/** + * @file llpanelgenerictip.cpp + * @brief Represents a generic panel for a notifytip notifications. As example: + * "SystemMessageTip", "Cancelled", "UploadWebSnapshotDone". + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llpanelgenerictip.h" +#include "llnotifications.h" + + +LLPanelGenericTip::LLPanelGenericTip( + const LLNotificationPtr& notification) : + LLPanelTipToast(notification) +{ + LLUICtrlFactory::getInstance()->buildPanel(this, "panel_generic_tip.xml"); + + childSetValue("message", notification->getMessage()); + + // set line max count to 3 in case of a very long name + snapToMessageHeight(getChild<LLTextBox> ("message"), 3); +} + diff --git a/indra/newview/llpanelgenerictip.h b/indra/newview/llpanelgenerictip.h new file mode 100644 index 0000000000..defa069727 --- /dev/null +++ b/indra/newview/llpanelgenerictip.h @@ -0,0 +1,57 @@ +/** + * @file llpanelgenerictip.h + * @brief Represents a generic panel for a notifytip notifications. As example: + * "SystemMessageTip", "Cancelled", "UploadWebSnapshotDone". + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_PANELGENERICTIP_H +#define LL_PANELGENERICTIP_H + +#include "llpaneltiptoast.h" + +/** + * Represents tip toast panel that contains only one child element - message text. + * This panel can be used for different cases of tip notifications. + */ +class LLPanelGenericTip: public LLPanelTipToast +{ + // disallow instantiation of this class +private: + // grant privileges to instantiate this class to LLToastPanel + friend class LLToastPanel; + /** + * Generic toast tip panel. + * This is particular case of toast panel that decoupled from LLToastNotifyPanel. + * From now LLToastNotifyPanel is deprecated and will be removed after all panel + * types are represented in separate classes. + */ + LLPanelGenericTip(const LLNotificationPtr& notification); +}; +#endif /* LL_PANELGENERICTIP_H */ diff --git a/indra/newview/llpanelgroup.cpp b/indra/newview/llpanelgroup.cpp index 469f1c1739..d997b83cbb 100644 --- a/indra/newview/llpanelgroup.cpp +++ b/indra/newview/llpanelgroup.cpp @@ -59,6 +59,8 @@ #include "llaccordionctrltab.h" #include "llaccordionctrl.h" +#include "lltrans.h" + static LLRegisterPanelClassWrapper<LLPanelGroup> t_panel_group("panel_group_info_sidetray"); @@ -90,7 +92,7 @@ LLPanelGroup::LLPanelGroup() : LLPanel(), LLGroupMgrObserver( LLUUID() ), mSkipRefresh(FALSE), - mShowingNotifyDialog(false) + mButtonJoin(NULL) { // Set up the factory callbacks. // Roles sub tabs @@ -101,8 +103,10 @@ LLPanelGroup::LLPanelGroup() LLPanelGroup::~LLPanelGroup() { LLGroupMgr::getInstance()->removeObserver(this); - if(LLVoiceClient::getInstance()) + if(LLVoiceClient::instanceExists()) + { LLVoiceClient::getInstance()->removeObserver(this); + } } void LLPanelGroup::onOpen(const LLSD& key) @@ -159,10 +163,6 @@ BOOL LLPanelGroup::postBuild() button = getChild<LLButton>("btn_chat"); button->setClickedCallback(onBtnGroupChatClicked, this); - button = getChild<LLButton>("btn_join"); - button->setVisible(false); - button->setEnabled(true); - button = getChild<LLButton>("btn_cancel"); button->setVisible(false); button->setEnabled(true); @@ -174,7 +174,7 @@ BOOL LLPanelGroup::postBuild() childSetCommitCallback("back",boost::bind(&LLPanelGroup::onBackBtnClick,this),NULL); childSetCommitCallback("btn_create",boost::bind(&LLPanelGroup::onBtnCreate,this),NULL); - childSetCommitCallback("btn_join",boost::bind(&LLPanelGroup::onBtnJoin,this),NULL); + childSetCommitCallback("btn_cancel",boost::bind(&LLPanelGroup::onBtnCancel,this),NULL); LLPanelGroupTab* panel_general = findChild<LLPanelGroupTab>("group_general_tab_panel"); @@ -188,9 +188,19 @@ BOOL LLPanelGroup::postBuild() if(panel_land) mTabs.push_back(panel_land); if(panel_general) + { panel_general->setupCtrls(this); + button = panel_general->getChild<LLButton>("btn_join"); + button->setVisible(false); + button->setEnabled(true); + + mButtonJoin = button; + mButtonJoin->setCommitCallback(boost::bind(&LLPanelGroup::onBtnJoin,this)); - gVoiceClient->addObserver(this); + mJoinText = panel_general->getChild<LLUICtrl>("join_cost_text"); + } + + LLVoiceClient::getInstance()->addObserver(this); return TRUE; } @@ -311,7 +321,7 @@ void LLPanelGroup::onChange(EStatusType status, const std::string &channelURI, b return; } - childSetEnabled("btn_call", LLVoiceClient::voiceEnabled() && gVoiceClient->voiceWorking()); + childSetEnabled("btn_call", LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking()); } void LLPanelGroup::notifyObservers() @@ -324,18 +334,16 @@ void LLPanelGroup::update(LLGroupChange gc) LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mID); if(gdatap) { - childSetValue("group_name", gdatap->mName); - childSetToolTip("group_name",gdatap->mName); - - LLButton* btn_join = getChild<LLButton>("btn_join"); - LLUICtrl* join_text = getChild<LLUICtrl>("join_cost_text"); - + std::string group_name = gdatap->mName.empty() ? LLTrans::getString("LoadingData") : gdatap->mName; + childSetValue("group_name", group_name); + childSetToolTip("group_name",group_name); + LLGroupData agent_gdatap; - bool is_member = gAgent.getGroupData(mID,agent_gdatap); + bool is_member = gAgent.getGroupData(mID,agent_gdatap) || gAgent.isGodlike(); bool join_btn_visible = !is_member && gdatap->mOpenEnrollment; - btn_join->setVisible(join_btn_visible); - join_text->setVisible(join_btn_visible); + mButtonJoin->setVisible(join_btn_visible); + mJoinText->setVisible(join_btn_visible); if(join_btn_visible) { @@ -351,7 +359,7 @@ void LLPanelGroup::update(LLGroupChange gc) { fee_buff = getString("group_join_free", string_args); } - childSetValue("join_cost_text",fee_buff); + mJoinText->setValue(fee_buff); } } } @@ -373,14 +381,15 @@ void LLPanelGroup::setGroupID(const LLUUID& group_id) LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mID); if(gdatap) { - childSetValue("group_name", gdatap->mName); - childSetToolTip("group_name",gdatap->mName); + std::string group_name = gdatap->mName.empty() ? LLTrans::getString("LoadingData") : gdatap->mName; + childSetValue("group_name", group_name); + childSetToolTip("group_name",group_name); } LLButton* button_apply = findChild<LLButton>("btn_apply"); LLButton* button_refresh = findChild<LLButton>("btn_refresh"); LLButton* button_create = findChild<LLButton>("btn_create"); - LLButton* button_join = findChild<LLButton>("btn_join"); + LLButton* button_cancel = findChild<LLButton>("btn_cancel"); LLButton* button_call = findChild<LLButton>("btn_call"); LLButton* button_chat = findChild<LLButton>("btn_chat"); @@ -417,8 +426,8 @@ void LLPanelGroup::setGroupID(const LLUUID& group_id) if(!tab_general || !tab_roles || !tab_notices || !tab_land) return; - if(button_join) - button_join->setVisible(false); + if(mButtonJoin) + mButtonJoin->setVisible(false); if(is_null_group_id)//creating new group @@ -460,7 +469,7 @@ void LLPanelGroup::setGroupID(const LLUUID& group_id) } LLGroupData agent_gdatap; - bool is_member = gAgent.getGroupData(mID,agent_gdatap); + bool is_member = gAgent.getGroupData(mID,agent_gdatap) || gAgent.isGodlike(); tab_roles->setVisible(is_member); tab_notices->setVisible(is_member); @@ -478,6 +487,7 @@ void LLPanelGroup::setGroupID(const LLUUID& group_id) } reposButtons(); + update(GC_ALL);//show/hide "join" button if data is already ready } bool LLPanelGroup::apply(LLPanelGroupTab* tab) @@ -618,69 +628,4 @@ void LLPanelGroup::showNotice(const std::string& subject, } -bool LLPanelGroup::canClose() -{ - if(getVisible() == false) - return true; - - bool need_save = false; - std::string mesg; - for(std::vector<LLPanelGroupTab* >::iterator it = mTabs.begin();it!=mTabs.end();++it) - if(need_save|=(*it)->needsApply(mesg)) - break; - if(!need_save) - return false; - // If no message was provided, give a generic one. - if (mesg.empty()) - { - mesg = mDefaultNeedsApplyMesg; - } - // Create a notify box, telling the user about the unapplied tab. - LLSD args; - args["NEEDS_APPLY_MESSAGE"] = mesg; - args["WANT_APPLY_MESSAGE"] = mWantApplyMesg; - - LLNotificationsUtil::add("SaveChanges", args, LLSD(), boost::bind(&LLPanelGroup::handleNotifyCallback,this, _1, _2)); - - mShowingNotifyDialog = true; - - return false; -} - -bool LLPanelGroup::notifyChildren(const LLSD& info) -{ - if(info.has("request") && mID.isNull() ) - { - std::string str_action = info["request"]; - - if (str_action == "quit" ) - { - canClose(); - return true; - } - if(str_action == "wait_quit") - return mShowingNotifyDialog; - } - return false; -} -bool LLPanelGroup::handleNotifyCallback(const LLSD& notification, const LLSD& response) -{ - S32 option = LLNotificationsUtil::getSelectedOption(notification, response); - mShowingNotifyDialog = false; - switch (option) - { - case 0: // "Apply Changes" - apply(); - break; - case 1: // "Ignore Changes" - break; - case 2: // "Cancel" - default: - // Do nothing. The user is canceling the action. - // If we were quitting, we didn't really mean it. - LLAppViewer::instance()->abortQuit(); - break; - } - return false; -} diff --git a/indra/newview/llpanelgroup.h b/indra/newview/llpanelgroup.h index 6e23eedffb..13a03b0713 100644 --- a/indra/newview/llpanelgroup.h +++ b/indra/newview/llpanelgroup.h @@ -37,7 +37,7 @@ #include "lltimer.h" #include "llvoiceclient.h" -struct LLOfferInfo; +class LLOfferInfo; const S32 UPDATE_MEMBERS_PER_FRAME = 500; @@ -95,9 +95,6 @@ public: LLOfferInfo* inventory_offer); - bool notifyChildren (const LLSD& info); - bool handleNotifyCallback(const LLSD&, const LLSD&); - protected: virtual void update(LLGroupChange gc); @@ -117,9 +114,6 @@ protected: protected: bool apply(LLPanelGroupTab* tab); - bool canClose(); - - bool mShowingNotifyDialog; LLTimer mRefreshTimer; @@ -130,6 +124,9 @@ protected: std::vector<LLPanelGroupTab* > mTabs; + LLButton* mButtonJoin; + LLUICtrl* mJoinText; + }; class LLPanelGroupTab : public LLPanel diff --git a/indra/newview/llpanelgroupgeneral.cpp b/indra/newview/llpanelgroupgeneral.cpp index 51fc670d87..555248e31a 100644 --- a/indra/newview/llpanelgroupgeneral.cpp +++ b/indra/newview/llpanelgroupgeneral.cpp @@ -111,6 +111,8 @@ BOOL LLPanelGroupGeneral::postBuild() { mListVisibleMembers->setDoubleClickCallback(openProfile, this); mListVisibleMembers->setContextMenu(LLScrollListCtrl::MENU_AVATAR); + + mListVisibleMembers->setSortCallback(boost::bind(&LLPanelGroupGeneral::sortMembersList,this,_1,_2,_3)); } // Options @@ -206,15 +208,18 @@ BOOL LLPanelGroupGeneral::postBuild() void LLPanelGroupGeneral::setupCtrls(LLPanel* panel_group) { - mInsignia = panel_group->getChild<LLTextureCtrl>("insignia"); + mInsignia = getChild<LLTextureCtrl>("insignia"); if (mInsignia) { mInsignia->setCommitCallback(onCommitAny, this); - mDefaultIconID = mInsignia->getImageAssetID(); } - mFounderName = panel_group->getChild<LLNameBox>("founder_name"); + mFounderName = getChild<LLNameBox>("founder_name"); + + mGroupNameEditor = panel_group->getChild<LLLineEditor>("group_name_editor"); - mGroupNameEditor->setPrevalidate( LLLineEditor::prevalidateASCII ); + mGroupNameEditor->setPrevalidate( LLTextValidate::validateASCII ); + + } // static @@ -650,7 +655,7 @@ void LLPanelGroupGeneral::update(LLGroupChange gc) } else { - mInsignia->setImageAssetID(mDefaultIconID); + mInsignia->setImageAssetName(mInsignia->getDefaultImageName()); } } @@ -814,15 +819,15 @@ void LLPanelGroupGeneral::reset() mCtrlListGroup->set(true); - mCtrlReceiveNotices->setEnabled(true); + mCtrlReceiveNotices->setEnabled(false); mCtrlReceiveNotices->setVisible(true); - mCtrlListGroup->setEnabled(true); + mCtrlListGroup->setEnabled(false); mGroupNameEditor->setEnabled(TRUE); mEditCharter->setEnabled(TRUE); - mCtrlShowInGroupList->setEnabled(TRUE); + mCtrlShowInGroupList->setEnabled(false); mComboMature->setEnabled(TRUE); mCtrlOpenEnrollment->setEnabled(TRUE); @@ -840,6 +845,8 @@ void LLPanelGroupGeneral::reset() mInsignia->setEnabled(true); + mInsignia->setImageAssetName(mInsignia->getDefaultImageName()); + { std::string empty_str = ""; mEditCharter->setText(empty_str); @@ -928,6 +935,8 @@ void LLPanelGroupGeneral::setGroupID(const LLUUID& id) mCtrlListGroup->setEnabled(data.mID.notNull()); } + mCtrlShowInGroupList->setEnabled(data.mID.notNull()); + mActiveTitleLabel = getChild<LLTextBox>("active_title_label"); mComboActiveTitle = getChild<LLComboBox>("active_title"); @@ -940,4 +949,18 @@ void LLPanelGroupGeneral::setGroupID(const LLUUID& id) activate(); } +S32 LLPanelGroupGeneral::sortMembersList(S32 col_idx,const LLScrollListItem* i1,const LLScrollListItem* i2) +{ + const LLScrollListCell *cell1 = i1->getColumn(col_idx); + const LLScrollListCell *cell2 = i2->getColumn(col_idx); + + if(col_idx == 2) + { + if(LLStringUtil::compareDict(cell1->getValue().asString(),"Online") == 0 ) + return 1; + if(LLStringUtil::compareDict(cell2->getValue().asString(),"Online") == 0 ) + return -1; + } + return LLStringUtil::compareDict(cell1->getValue().asString(), cell2->getValue().asString()); +} diff --git a/indra/newview/llpanelgroupgeneral.h b/indra/newview/llpanelgroupgeneral.h index 7e90e43cf9..6f4fa994da 100644 --- a/indra/newview/llpanelgroupgeneral.h +++ b/indra/newview/llpanelgroupgeneral.h @@ -83,6 +83,8 @@ private: static void onReceiveNotices(LLUICtrl* ctrl, void* data); static void openProfile(void* data); + S32 sortMembersList(S32,const LLScrollListItem*,const LLScrollListItem*); + static bool joinDlgCB(const LLSD& notification, const LLSD& response); void updateMembers(); @@ -93,7 +95,6 @@ private: BOOL mChanged; BOOL mFirstUse; std::string mIncompleteMemberDataStr; - LLUUID mDefaultIconID; // Group information (include any updates in updateChanged) LLLineEditor *mGroupNameEditor; diff --git a/indra/newview/llpanelgroupinvite.cpp b/indra/newview/llpanelgroupinvite.cpp index 06a682c905..11d3768a3d 100644 --- a/indra/newview/llpanelgroupinvite.cpp +++ b/indra/newview/llpanelgroupinvite.cpp @@ -36,6 +36,7 @@ #include "llagent.h" #include "llfloateravatarpicker.h" #include "llbutton.h" +#include "llcallingcard.h" #include "llcombobox.h" #include "llgroupactions.h" #include "llgroupmgr.h" @@ -56,7 +57,7 @@ public: ~impl(); void addUsers(const std::vector<std::string>& names, - const std::vector<LLUUID>& agent_ids); + const uuid_vec_t& agent_ids); void submitInvitations(); void addRoleNames(LLGroupMgrGroupData* gdatap); void handleRemove(); @@ -68,7 +69,7 @@ public: static void callbackClickRemove(void* userdata); static void callbackSelect(LLUICtrl* ctrl, void* userdata); static void callbackAddUsers(const std::vector<std::string>& names, - const std::vector<LLUUID>& agent_ids, + const uuid_vec_t& agent_ids, void* user_data); bool inviteOwnerCallback(const LLSD& notification, const LLSD& response); @@ -110,7 +111,7 @@ LLPanelGroupInvite::impl::~impl() } void LLPanelGroupInvite::impl::addUsers(const std::vector<std::string>& names, - const std::vector<LLUUID>& agent_ids) + const uuid_vec_t& agent_ids) { std::string name; LLUUID id; @@ -360,7 +361,7 @@ void LLPanelGroupInvite::impl::callbackClickOK(void* userdata) //static void LLPanelGroupInvite::impl::callbackAddUsers(const std::vector<std::string>& names, - const std::vector<LLUUID>& ids, + const uuid_vec_t& ids, void* user_data) { impl* selfp = (impl*) user_data; @@ -398,23 +399,20 @@ void LLPanelGroupInvite::clear() mImplementation->mOKButton->setEnabled(FALSE); } -void LLPanelGroupInvite::addUsers(std::vector<LLUUID>& agent_ids) +void LLPanelGroupInvite::addUsers(uuid_vec_t& agent_ids) { std::vector<std::string> names; for (S32 i = 0; i < (S32)agent_ids.size(); i++) { LLUUID agent_id = agent_ids[i]; LLViewerObject* dest = gObjectList.findObject(agent_id); + std::string fullname; if(dest && dest->isAvatar()) { - std::string fullname; - LLSD args; LLNameValue* nvfirst = dest->getNVPair("FirstName"); LLNameValue* nvlast = dest->getNVPair("LastName"); if(nvfirst && nvlast) { - args["FIRST"] = std::string(nvfirst->getString()); - args["LAST"] = std::string(nvlast->getString()); fullname = std::string(nvfirst->getString()) + " " + std::string(nvlast->getString()); } if (!fullname.empty()) @@ -427,10 +425,44 @@ void LLPanelGroupInvite::addUsers(std::vector<LLUUID>& agent_ids) names.push_back("(Unknown)"); } } + else + { + //looks like user try to invite offline friend + //for offline avatar_id gObjectList.findObject() will return null + //so we need to do this additional search in avatar tracker, see EXT-4732 + if (LLAvatarTracker::instance().isBuddy(agent_id)) + { + if (!gCacheName->getFullName(agent_id, fullname)) + { + // actually it should happen, just in case + gCacheName->get(LLUUID(agent_id), false, boost::bind( + &LLPanelGroupInvite::addUserCallback, this, _1, _2, + _3)); + // for this special case! + //when there is no cached name we should remove resident from agent_ids list to avoid breaking of sequence + // removed id will be added in callback + agent_ids.erase(agent_ids.begin() + i); + } + else + { + names.push_back(fullname); + } + } + } } mImplementation->addUsers(names, agent_ids); } +void LLPanelGroupInvite::addUserCallback(const LLUUID& id, const std::string& first_name, const std::string& last_name) +{ + std::vector<std::string> names; + uuid_vec_t agent_ids; + std::string full_name = first_name + " " + last_name; + agent_ids.push_back(id); + names.push_back(first_name + " " + last_name); + + mImplementation->addUsers(names, agent_ids); +} void LLPanelGroupInvite::draw() { LLPanel::draw(); diff --git a/indra/newview/llpanelgroupinvite.h b/indra/newview/llpanelgroupinvite.h index 37135b488a..2ed443ed46 100644 --- a/indra/newview/llpanelgroupinvite.h +++ b/indra/newview/llpanelgroupinvite.h @@ -42,7 +42,11 @@ public: LLPanelGroupInvite(const LLUUID& group_id); ~LLPanelGroupInvite(); - void addUsers(std::vector<LLUUID>& agent_ids); + void addUsers(uuid_vec_t& agent_ids); + /** + * this callback is being used to add a user whose fullname isn't been loaded before invoking of addUsers(). + */ + void addUserCallback(const LLUUID& id, const std::string& first_name, const std::string& last_name); void clear(); void update(); diff --git a/indra/newview/llpanelgrouplandmoney.cpp b/indra/newview/llpanelgrouplandmoney.cpp index 9023afc602..65fe7165c2 100644 --- a/indra/newview/llpanelgrouplandmoney.cpp +++ b/indra/newview/llpanelgrouplandmoney.cpp @@ -236,6 +236,7 @@ public: std::string mCantViewParcelsText; std::string mCantViewAccountsText; + std::string mEmptyParcelsText; }; //******************************************* @@ -452,6 +453,7 @@ void LLPanelGroupLandMoney::impl::processGroupLand(LLMessageSystem* msg) // This power was removed to make group roles simpler //if ( !gAgent.hasPowerInGroup(mGroupID, GP_LAND_VIEW_OWNED) ) return; if (!gAgent.isInGroup(mPanel.mGroupID)) return; + mGroupParcelsp->setCommentText(mEmptyParcelsText); std::string name; std::string desc; @@ -696,6 +698,7 @@ BOOL LLPanelGroupLandMoney::postBuild() mImplementationp->mCantViewParcelsText = getString("cant_view_group_land_text"); mImplementationp->mCantViewAccountsText = getString("cant_view_group_accounting_text"); + mImplementationp->mEmptyParcelsText = getString("epmty_view_group_land_text"); if ( mImplementationp->mMapButtonp ) { @@ -1600,6 +1603,8 @@ void LLPanelGroupLandMoney::setGroupID(const LLUUID& id) mImplementationp->mMoneySalesTabEHp->setGroupID(mGroupID); } + mImplementationp->mBeenActivated = false; + activate(); } diff --git a/indra/newview/llpanelgroupnotices.cpp b/indra/newview/llpanelgroupnotices.cpp index 6210973dae..ba50081fb2 100644 --- a/indra/newview/llpanelgroupnotices.cpp +++ b/indra/newview/llpanelgroupnotices.cpp @@ -38,12 +38,12 @@ #include "llinventory.h" #include "llviewerinventory.h" +#include "llinventorydefines.h" #include "llinventoryfunctions.h" #include "llinventorymodel.h" #include "llfloaterinventory.h" #include "llagent.h" #include "llagentui.h" -#include "lltooldraganddrop.h" #include "lllineeditor.h" #include "lltexteditor.h" @@ -59,6 +59,7 @@ #include "llviewerwindow.h" #include "llviewermessage.h" #include "llnotificationsutil.h" +#include "llgiveinventory.h" static LLRegisterPanelClassWrapper<LLPanelGroupNotices> t_panel_group_notices("panel_group_notices"); @@ -161,7 +162,7 @@ BOOL LLGroupDropTarget::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, { LLViewerInventoryItem* inv_item = (LLViewerInventoryItem*)cargo_data; if(gInventory.getItem(inv_item->getUUID()) - && LLToolDragAndDrop::isInventoryGroupGiveAcceptable(inv_item)) + && LLGiveInventory::isInventoryGroupGiveAcceptable(inv_item)) { // *TODO: get multiple object transfers working *accept = ACCEPT_YES_COPY_SINGLE; @@ -329,12 +330,12 @@ void LLPanelGroupNotices::setItem(LLPointer<LLInventoryItem> inv_item) mInventoryItem = inv_item; BOOL item_is_multi = FALSE; - if ( inv_item->getFlags() & LLInventoryItem::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS ) + if ( inv_item->getFlags() & LLInventoryItemFlags::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS ) { item_is_multi = TRUE; }; - std::string icon_name = get_item_icon_name(inv_item->getType(), + std::string icon_name = LLInventoryIcon::getIconName(inv_item->getType(), inv_item->getInventoryType(), inv_item->getFlags(), item_is_multi ); @@ -516,6 +517,11 @@ void LLPanelGroupNotices::processNotices(LLMessageSystem* msg) mNoticesList->setEnabled(TRUE); + //save sort state and set unsorted state to prevent unnecessary + //sorting while adding notices + bool save_sort = mNoticesList->isSorted(); + mNoticesList->setNeedsSort(false); + for (;i<count;++i) { msg->getUUID("Data","NoticeID",id,i); @@ -526,6 +532,13 @@ void LLPanelGroupNotices::processNotices(LLMessageSystem* msg) mNoticesList->setEnabled(FALSE); return; } + + //with some network delays we can receive notice list more then once... + //so add only unique notices + S32 pos = mNoticesList->getItemIndex(id); + + if(pos!=-1)//if items with this ID already in the list - skip it + continue; msg->getString("Data","Subject",subj,i); msg->getString("Data","FromName",name,i); @@ -539,9 +552,9 @@ void LLPanelGroupNotices::processNotices(LLMessageSystem* msg) row["columns"][0]["column"] = "icon"; if (has_attachment) { - std::string icon_name = get_item_icon_name( + std::string icon_name = LLInventoryIcon::getIconName( (LLAssetType::EType)asset_type, - LLInventoryType::IT_NONE,FALSE, FALSE); + LLInventoryType::IT_NONE); row["columns"][0]["type"] = "icon"; row["columns"][0]["value"] = icon_name; } @@ -561,6 +574,7 @@ void LLPanelGroupNotices::processNotices(LLMessageSystem* msg) mNoticesList->addElement(row, ADD_BOTTOM); } + mNoticesList->setNeedsSort(save_sort); mNoticesList->updateSort(); } @@ -606,9 +620,8 @@ void LLPanelGroupNotices::showNotice(const std::string& subject, { mInventoryOffer = inventory_offer; - std::string icon_name = get_item_icon_name(mInventoryOffer->mType, - LLInventoryType::IT_TEXTURE, - 0, FALSE); + std::string icon_name = LLInventoryIcon::getIconName(mInventoryOffer->mType, + LLInventoryType::IT_TEXTURE); mViewInventoryIcon->setValue(icon_name); mViewInventoryIcon->setVisible(TRUE); @@ -652,6 +665,12 @@ void LLPanelGroupNotices::setGroupID(const LLUUID& id) LLGroupDropTarget* target = getChild<LLGroupDropTarget> ("drop_target"); target->setPanel (this); target->setGroup (mGroupID); + + if(mViewMessage) + mViewMessage->clear(); + + if(mViewInventoryName) + mViewInventoryName->clear(); activate(); } diff --git a/indra/newview/llpanelgrouproles.cpp b/indra/newview/llpanelgrouproles.cpp index c6287472fe..26e8a932aa 100644 --- a/indra/newview/llpanelgrouproles.cpp +++ b/indra/newview/llpanelgrouproles.cpp @@ -118,8 +118,7 @@ LLPanelGroupRoles::LLPanelGroupRoles() mCurrentTab(NULL), mRequestedTab( NULL ), mSubTabContainer( NULL ), - mFirstUse( TRUE ), - mIgnoreTransition( FALSE ) + mFirstUse( TRUE ) { } @@ -145,8 +144,6 @@ BOOL LLPanelGroupRoles::postBuild() llwarns << "Invalid subtab panel: " << panel->getName() << llendl; return FALSE; } - // Add click callbacks to all the tabs. - mSubTabContainer->setCommitCallback(boost::bind(&LLPanelGroupRoles::handleClickSubTab, this)); // Hand the subtab a pointer to this LLPanelGroupRoles, so that it can // look around for the widgets it is interested in. @@ -155,6 +152,8 @@ BOOL LLPanelGroupRoles::postBuild() //subtabp->addObserver(this); } + // Add click callbacks to tab switching. + mSubTabContainer->setValidateBeforeCommit(boost::bind(&LLPanelGroupRoles::handleSubTabSwitch, this, _1)); // Set the current tab to whatever is currently being shown. mCurrentTab = (LLPanelGroupTab*) mSubTabContainer->getCurrentPanel(); @@ -196,30 +195,17 @@ BOOL LLPanelGroupRoles::isVisibleByAgent(LLAgent* agentp) } -void LLPanelGroupRoles::handleClickSubTab() +bool LLPanelGroupRoles::handleSubTabSwitch(const LLSD& data) { - // If we are already handling a transition, - // ignore this. - if (mIgnoreTransition) - { - return; - } - - mRequestedTab = (LLPanelGroupTab*) mSubTabContainer->getCurrentPanel(); - - // Make sure they aren't just clicking the same tab... - if (mRequestedTab == mCurrentTab) + std::string panel_name = data.asString(); + + if(mRequestedTab != NULL)//we already have tab change request { - return; + return false; } - // Try to switch from the current panel to the panel the user selected. - attemptTransition(); -} + mRequestedTab = static_cast<LLPanelGroupTab*>(mSubTabContainer->getPanelByName(panel_name)); -BOOL LLPanelGroupRoles::attemptTransition() -{ - // Check if the current tab needs to be applied. std::string mesg; if (mCurrentTab && mCurrentTab->needsApply(mesg)) { @@ -235,26 +221,14 @@ BOOL LLPanelGroupRoles::attemptTransition() LLNotificationsUtil::add("PanelGroupApply", args, LLSD(), boost::bind(&LLPanelGroupRoles::handleNotifyCallback, this, _1, _2)); mHasModal = TRUE; - // We need to reselect the current tab, since it isn't finished. - if (mSubTabContainer) - { - mIgnoreTransition = TRUE; - mSubTabContainer->selectTabPanel( mCurrentTab ); - mIgnoreTransition = FALSE; - } + // Returning FALSE will block a close action from finishing until // we get a response back from the user. - return FALSE; - } - else - { - // The current panel didn't have anything it needed to apply. - if (mRequestedTab) - { - transitionToTab(); - } - return TRUE; + return false; } + + transitionToTab(); + return true; } void LLPanelGroupRoles::transitionToTab() @@ -271,6 +245,7 @@ void LLPanelGroupRoles::transitionToTab() // This is now the current tab; mCurrentTab = mRequestedTab; mCurrentTab->activate(); + mRequestedTab = 0; } } @@ -278,6 +253,7 @@ bool LLPanelGroupRoles::handleNotifyCallback(const LLSD& notification, const LLS { S32 option = LLNotificationsUtil::getSelectedOption(notification, response); mHasModal = FALSE; + LLPanelGroupTab* transition_tab = mRequestedTab; switch (option) { case 0: // "Apply Changes" @@ -297,26 +273,20 @@ bool LLPanelGroupRoles::handleNotifyCallback(const LLSD& notification, const LLS // Skip switching tabs. break; } - - // This panel's info successfully applied. - // Switch to the next panel. - // No break! Continue into 'Ignore Changes' which just switches tabs. - mIgnoreTransition = TRUE; - mSubTabContainer->selectTabPanel( mRequestedTab ); - mIgnoreTransition = FALSE; transitionToTab(); + mSubTabContainer->selectTabPanel( transition_tab ); + break; } case 1: // "Ignore Changes" // Switch to the requested panel without applying changes cancel(); - mIgnoreTransition = TRUE; - mSubTabContainer->selectTabPanel( mRequestedTab ); - mIgnoreTransition = FALSE; transitionToTab(); + mSubTabContainer->selectTabPanel( transition_tab ); break; case 2: // "Cancel" default: + mRequestedTab = NULL; // Do nothing. The user is canceling the action. break; } @@ -827,8 +797,39 @@ BOOL LLPanelGroupMembersSubTab::postBuildSubTab(LLView* root) void LLPanelGroupMembersSubTab::setGroupID(const LLUUID& id) { + //clear members list + if(mMembersList) mMembersList->deleteAllItems(); + if(mAssignedRolesList) mAssignedRolesList->deleteAllItems(); + if(mAllowedActionsList) mAllowedActionsList->deleteAllItems(); + LLPanelGroupSubTab::setGroupID(id); +} + +void LLPanelGroupRolesSubTab::setGroupID(const LLUUID& id) +{ + if(mRolesList) mRolesList->deleteAllItems(); + if(mAssignedMembersList) mAssignedMembersList->deleteAllItems(); + if(mAllowedActionsList) mAllowedActionsList->deleteAllItems(); + + if(mRoleName) mRoleName->clear(); + if(mRoleDescription) mRoleDescription->clear(); + if(mRoleTitle) mRoleTitle->clear(); + + mHasRoleChange = FALSE; + + setFooterEnabled(FALSE); + LLPanelGroupSubTab::setGroupID(id); +} +void LLPanelGroupActionsSubTab::setGroupID(const LLUUID& id) +{ + if(mActionList) mActionList->deleteAllItems(); + if(mActionRoles) mActionRoles->deleteAllItems(); + if(mActionMembers) mActionMembers->deleteAllItems(); + + if(mActionDescription) mActionDescription->clear(); + + LLPanelGroupSubTab::setGroupID(id); } @@ -859,7 +860,7 @@ void LLPanelGroupMembersSubTab::handleMemberSelect() if (selection.empty()) return; // Build a vector of all selected members, and gather allowed actions. - std::vector<LLUUID> selected_members; + uuid_vec_t selected_members; U64 allowed_by_all = 0xffffffffffffLL; U64 allowed_by_some = 0; @@ -925,8 +926,8 @@ void LLPanelGroupMembersSubTab::handleMemberSelect() if (cb_enable && (count > 0) && role_id == gdatap->mOwnerRole) { // Check if any owners besides this agent are selected. - std::vector<LLUUID>::const_iterator member_iter; - std::vector<LLUUID>::const_iterator member_end = + uuid_vec_t::const_iterator member_iter; + uuid_vec_t::const_iterator member_end = selected_members.end(); for (member_iter = selected_members.begin(); member_iter != member_end; @@ -952,7 +953,7 @@ void LLPanelGroupMembersSubTab::handleMemberSelect() //now see if there are any role changes for the selected //members and remember to include them - std::vector<LLUUID>::iterator sel_mem_iter = selected_members.begin(); + uuid_vec_t::iterator sel_mem_iter = selected_members.begin(); for (; sel_mem_iter != selected_members.end(); sel_mem_iter++) { LLRoleMemberChangeType type; @@ -1009,7 +1010,7 @@ void LLPanelGroupMembersSubTab::handleMemberSelect() check->setTentative( (0 != count) && (selected_members.size() != - (std::vector<LLUUID>::size_type)count)); + (uuid_vec_t::size_type)count)); //NOTE: as of right now a user can break the group //by removing himself from a role if he is the @@ -1084,7 +1085,7 @@ void LLPanelGroupMembersSubTab::onEjectMembers(void *userdata) void LLPanelGroupMembersSubTab::handleEjectMembers() { //send down an eject message - std::vector<LLUUID> selected_members; + uuid_vec_t selected_members; std::vector<LLScrollListItem*> selection = mMembersList->getAllSelected(); if (selection.empty()) return; @@ -1105,13 +1106,13 @@ void LLPanelGroupMembersSubTab::handleEjectMembers() selected_members); } -void LLPanelGroupMembersSubTab::sendEjectNotifications(const LLUUID& group_id, const std::vector<LLUUID>& selected_members) +void LLPanelGroupMembersSubTab::sendEjectNotifications(const LLUUID& group_id, const uuid_vec_t& selected_members) { LLGroupMgrGroupData* group_data = LLGroupMgr::getInstance()->getGroupData(group_id); if (group_data) { - for (std::vector<LLUUID>::const_iterator i = selected_members.begin(); i != selected_members.end(); ++i) + for (uuid_vec_t::const_iterator i = selected_members.begin(); i != selected_members.end(); ++i) { LLSD args; std::string name; @@ -1437,7 +1438,7 @@ U64 LLPanelGroupMembersSubTab::getAgentPowersBasedOnRoleChanges(const LLUUID& ag if ( role_change_datap ) { - std::vector<LLUUID> roles_to_be_removed; + uuid_vec_t roles_to_be_removed; for (role_change_data_map_t::iterator role = role_change_datap->begin(); role != role_change_datap->end(); ++ role) @@ -1750,8 +1751,7 @@ BOOL LLPanelGroupRolesSubTab::postBuildSubTab(LLView* root) mRoleTitle->setKeystrokeCallback(onPropertiesKey, this); mRoleDescription->setCommitOnFocusLost(TRUE); - mRoleDescription->setCommitCallback(onDescriptionCommit, this); - mRoleDescription->setFocusReceivedCallback(boost::bind(onDescriptionFocus, _1, this)); + mRoleDescription->setKeystrokeCallback(boost::bind(&LLPanelGroupRolesSubTab::onDescriptionKeyStroke, this, _1)); setFooterEnabled(FALSE); @@ -2086,8 +2086,8 @@ void LLPanelGroupRolesSubTab::buildMembersList() LLGroupRoleData* rdatap = (*rit).second; if (rdatap) { - std::vector<LLUUID>::const_iterator mit = rdatap->getMembersBegin(); - std::vector<LLUUID>::const_iterator end = rdatap->getMembersEnd(); + uuid_vec_t::const_iterator mit = rdatap->getMembersBegin(); + uuid_vec_t::const_iterator end = rdatap->getMembersEnd(); for ( ; mit != end; ++mit) { mAssignedMembersList->addNameItem((*mit)); @@ -2207,14 +2207,10 @@ void LLPanelGroupRolesSubTab::onPropertiesKey(LLLineEditor* ctrl, void* user_dat self->notifyObservers(); } -// static -void LLPanelGroupRolesSubTab::onDescriptionFocus(LLFocusableElement* ctrl, void* user_data) +void LLPanelGroupRolesSubTab::onDescriptionKeyStroke(LLTextEditor* caller) { - LLPanelGroupRolesSubTab* self = static_cast<LLPanelGroupRolesSubTab*>(user_data); - if (!self) return; - - self->mHasRoleChange = TRUE; - self->notifyObservers(); + mHasRoleChange = TRUE; + notifyObservers(); } // static diff --git a/indra/newview/llpanelgrouproles.h b/indra/newview/llpanelgrouproles.h index eac22a6338..cb7941ad9e 100644 --- a/indra/newview/llpanelgrouproles.h +++ b/indra/newview/llpanelgrouproles.h @@ -65,7 +65,7 @@ public: virtual BOOL isVisibleByAgent(LLAgent* agentp); - void handleClickSubTab(); + bool handleSubTabSwitch(const LLSD& data); // Checks if the current tab needs to be applied, and tries to switch to the requested tab. BOOL attemptTransition(); @@ -93,7 +93,6 @@ protected: LLPanelGroupTab* mRequestedTab; LLTabContainer* mSubTabContainer; BOOL mFirstUse; - BOOL mIgnoreTransition; std::string mDefaultNeedsApplyMesg; std::string mWantApplyMesg; @@ -173,7 +172,7 @@ public: static void onEjectMembers(void*); void handleEjectMembers(); - void sendEjectNotifications(const LLUUID& group_id, const std::vector<LLUUID>& selected_members); + void sendEjectNotifications(const LLUUID& group_id, const uuid_vec_t& selected_members); static void onRoleCheck(LLUICtrl* check, void* user_data); void handleRoleCheck(const LLUUID& role_id, @@ -245,8 +244,9 @@ public: static void onPropertiesKey(LLLineEditor*, void*); + void onDescriptionKeyStroke(LLTextEditor* caller); + static void onDescriptionCommit(LLUICtrl*, void*); - static void onDescriptionFocus(LLFocusableElement*, void*); static void onMemberVisibilityChange(LLUICtrl*, void*); void handleMemberVisibilityChange(bool value); @@ -258,6 +258,8 @@ public: void handleDeleteRole(); void saveRoleChanges(); + + virtual void setGroupID(const LLUUID& id); protected: void handleActionCheck(LLUICtrl* ctrl, bool force); LLSD createRoleItem(const LLUUID& role_id, std::string name, std::string title, S32 members); @@ -295,6 +297,8 @@ public: virtual void update(LLGroupChange gc); void handleActionSelect(); + + virtual void setGroupID(const LLUUID& id); protected: LLScrollListCtrl* mActionList; LLScrollListCtrl* mActionRoles; diff --git a/indra/newview/llpanelimcontrolpanel.cpp b/indra/newview/llpanelimcontrolpanel.cpp index cbd6f64a48..709bb83fe4 100644 --- a/indra/newview/llpanelimcontrolpanel.cpp +++ b/indra/newview/llpanelimcontrolpanel.cpp @@ -81,7 +81,8 @@ void LLPanelChatControlPanel::onVoiceChannelStateChanged(const LLVoiceChannel::E void LLPanelChatControlPanel::updateCallButton() { - bool voice_enabled = LLVoiceClient::voiceEnabled() && gVoiceClient->voiceWorking(); + // hide/show call button + bool voice_enabled = LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking(); LLIMModel::LLIMSession* session = LLIMModel::getInstance()->findIMSession(mSessionId); @@ -112,8 +113,10 @@ void LLPanelChatControlPanel::updateButtons(bool is_call_started) LLPanelChatControlPanel::~LLPanelChatControlPanel() { mVoiceChannelStateChangeConnection.disconnect(); - if(LLVoiceClient::getInstance()) + if(LLVoiceClient::instanceExists()) + { LLVoiceClient::getInstance()->removeObserver(this); + } } BOOL LLPanelChatControlPanel::postBuild() @@ -122,7 +125,7 @@ BOOL LLPanelChatControlPanel::postBuild() childSetAction("end_call_btn", boost::bind(&LLPanelChatControlPanel::onEndCallButtonClicked, this)); childSetAction("voice_ctrls_btn", boost::bind(&LLPanelChatControlPanel::onOpenVoiceControlsClicked, this)); - gVoiceClient->addObserver(this); + LLVoiceClient::getInstance()->addObserver(this); return TRUE; } @@ -224,14 +227,6 @@ void LLPanelIMControlPanel::setSessionId(const LLUUID& session_id) childSetEnabled("share_btn", FALSE); childSetEnabled("teleport_btn", FALSE); childSetEnabled("pay_btn", FALSE); - - getChild<LLTextBox>("avatar_name")->setValue(im_session->mName); - getChild<LLTextBox>("avatar_name")->setToolTip(im_session->mName); - } - else - { - // If the participant is an avatar, fetch the currect name - gCacheName->get(mAvatarID, FALSE, boost::bind(&LLPanelIMControlPanel::nameUpdatedCallback, this, _1, _2, _3, _4)); } } @@ -247,19 +242,6 @@ void LLPanelIMControlPanel::changed(U32 mask) } } -void LLPanelIMControlPanel::nameUpdatedCallback(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group) -{ - if ( id == mAvatarID ) - { - std::string avatar_name; - avatar_name.assign(first); - avatar_name.append(" "); - avatar_name.append(last); - getChild<LLTextBox>("avatar_name")->setValue(avatar_name); - getChild<LLTextBox>("avatar_name")->setToolTip(avatar_name); - } -} - LLPanelGroupControlPanel::LLPanelGroupControlPanel(const LLUUID& session_id): mParticipantList(NULL) { diff --git a/indra/newview/llpanelimcontrolpanel.h b/indra/newview/llpanelimcontrolpanel.h index 3ab505a084..ce8fc58e56 100644 --- a/indra/newview/llpanelimcontrolpanel.h +++ b/indra/newview/llpanelimcontrolpanel.h @@ -89,9 +89,6 @@ public: // LLFriendObserver trigger virtual void changed(U32 mask); -protected: - void nameUpdatedCallback(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group); - private: void onViewProfileButtonClicked(); void onAddFriendButtonClicked(); diff --git a/indra/newview/llpanellandaudio.cpp b/indra/newview/llpanellandaudio.cpp index 6a4c909759..a92b4357ed 100644 --- a/indra/newview/llpanellandaudio.cpp +++ b/indra/newview/llpanellandaudio.cpp @@ -153,6 +153,13 @@ void LLPanelLandAudio::refresh() mCheckParcelEnableVoice->set(allow_voice); mCheckParcelVoiceLocal->set(!parcel->getParcelFlagUseEstateVoiceChannel()); + // don't display urls if you're not able to change it + // much requested change in forums so people can't 'steal' urls + // NOTE: bug#2009 means this is still vunerable - however, bug + // should be closed since this bug opens up major security issues elsewhere. + bool obscure_music = ! can_change_media && parcel->getObscureMusic(); + + mMusicURLEdit->setDrawAsterixes(obscure_music); mMusicURLEdit->setText(parcel->getMusicURL()); mMusicURLEdit->setEnabled( can_change_media ); } diff --git a/indra/newview/llpanellandmarkinfo.cpp b/indra/newview/llpanellandmarkinfo.cpp index 36a542cfa0..4ffd43cb0f 100644 --- a/indra/newview/llpanellandmarkinfo.cpp +++ b/indra/newview/llpanellandmarkinfo.cpp @@ -36,6 +36,7 @@ #include "llcombobox.h" #include "lliconctrl.h" +#include "llinventoryfunctions.h" #include "lllineeditor.h" #include "lltextbox.h" #include "lltexteditor.h" @@ -376,21 +377,53 @@ void LLPanelLandmarkInfo::createLandmark(const LLUUID& folder_id) // static std::string LLPanelLandmarkInfo::getFullFolderName(const LLViewerInventoryCategory* cat) { - std::string name = cat->getName(); + std::string name; LLUUID parent_id; - // translate category name, if it's right below the root - // FIXME: it can throw notification about non existent string in strings.xml - if (cat->getParentUUID().notNull() && cat->getParentUUID() == gInventory.getRootFolderID()) + llassert(cat); + if (cat) { - LLTrans::findString(name, "InvFolder " + name); - } + name = cat->getName(); + parent_id = cat->getParentUUID(); + bool is_under_root_category = parent_id == gInventory.getRootFolderID(); - // we don't want "My Inventory" to appear in the name - while ((parent_id = cat->getParentUUID()).notNull() && parent_id != gInventory.getRootFolderID()) - { - cat = gInventory.getCategory(parent_id); - name = cat->getName() + "/" + name; + // we don't want "My Inventory" to appear in the name + while ((parent_id = cat->getParentUUID()).notNull()) + { + cat = gInventory.getCategory(parent_id); + llassert(cat); + if (cat) + { + if (is_under_root_category || cat->getParentUUID() == gInventory.getRootFolderID()) + { + std::string localized_name; + + // Looking for translation only for protected type categories + // to avoid warnings about non existent string in strings.xml. + bool is_protected_type = LLFolderType::lookupIsProtectedType(cat->getPreferredType()); + + if (is_under_root_category) + { + // translate category name, if it's right below the root + bool is_found = is_protected_type && LLTrans::findString(localized_name, "InvFolder " + name); + name = is_found ? localized_name : name; + } + else + { + bool is_found = is_protected_type && LLTrans::findString(localized_name, "InvFolder " + cat->getName()); + + // add translated category name to folder's full name + name = (is_found ? localized_name : cat->getName()) + "/" + name; + } + + break; + } + else + { + name = cat->getName() + "/" + name; + } + } + } } return name; @@ -406,21 +439,24 @@ void LLPanelLandmarkInfo::populateFoldersList() // Put the "Landmarks" folder first in list. LLUUID landmarks_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK); - const LLViewerInventoryCategory* cat = gInventory.getCategory(landmarks_id); - if (!cat) + const LLViewerInventoryCategory* lmcat = gInventory.getCategory(landmarks_id); + if (!lmcat) { llwarns << "Cannot find the landmarks folder" << llendl; } - std::string cat_full_name = getFullFolderName(cat); - mFolderCombo->add(cat_full_name, cat->getUUID()); + else + { + std::string cat_full_name = getFullFolderName(lmcat); + mFolderCombo->add(cat_full_name, lmcat->getUUID()); + } typedef std::vector<folder_pair_t> folder_vec_t; folder_vec_t folders; // Sort the folders by their full name. for (S32 i = 0; i < cats.count(); i++) { - cat = cats.get(i); - cat_full_name = getFullFolderName(cat); + const LLViewerInventoryCategory* cat = cats.get(i); + std::string cat_full_name = getFullFolderName(cat); folders.push_back(folder_pair_t(cat->getUUID(), cat_full_name)); } sort(folders.begin(), folders.end(), cmp_folders); diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp index 7c1b0f6234..ce1131f45c 100644 --- a/indra/newview/llpanellandmarks.cpp +++ b/indra/newview/llpanellandmarks.cpp @@ -49,6 +49,7 @@ #include "lldndbutton.h" #include "llfloaterworldmap.h" #include "llfolderviewitem.h" +#include "llinventorymodelbackgroundfetch.h" #include "llinventorypanel.h" #include "lllandmarkactions.h" #include "llplacesinventorybridge.h" @@ -69,6 +70,10 @@ static const std::string TRASH_BUTTON_NAME = "trash_btn"; // helper functions static void filter_list(LLPlacesInventoryPanel* inventory_list, const std::string& string); static bool category_has_descendents(LLPlacesInventoryPanel* inventory_list); +static void collapse_all_folders(LLFolderView* root_folder); +static void expand_all_folders(LLFolderView* root_folder); +static bool has_expanded_folders(LLFolderView* root_folder); +static bool has_collapsed_folders(LLFolderView* root_folder); /** * Functor counting expanded and collapsed folders in folder view tree to know @@ -111,25 +116,76 @@ void LLCheckFolderState::doFolder(LLFolderViewFolder* folder) } } +// Functor searching and opening a folder specified by UUID +// in a folder view tree. +class LLOpenFolderByID : public LLFolderViewFunctor +{ +public: + LLOpenFolderByID(const LLUUID& folder_id) + : mFolderID(folder_id) + , mIsFolderOpen(false) + {} + virtual ~LLOpenFolderByID() {} + /*virtual*/ void doFolder(LLFolderViewFolder* folder); + /*virtual*/ void doItem(LLFolderViewItem* item) {} + + bool isFolderOpen() { return mIsFolderOpen; } + +private: + bool mIsFolderOpen; + LLUUID mFolderID; +}; + +// virtual +void LLOpenFolderByID::doFolder(LLFolderViewFolder* folder) +{ + if (folder->getListener() && folder->getListener()->getUUID() == mFolderID) + { + if (!folder->isOpen()) + { + folder->setOpen(TRUE); + mIsFolderOpen = true; + } + } +} + /** * Bridge to support knowing when the inventory has changed to update Landmarks tab * ShowFolderState filter setting to show all folders when the filter string is empty and * empty folder message when Landmarks inventory category has no children. + * Ensures that "Landmarks" folder in the Library is open on strart up. */ class LLLandmarksPanelObserver : public LLInventoryObserver { public: - LLLandmarksPanelObserver(LLLandmarksPanel* lp) : mLP(lp) {} + LLLandmarksPanelObserver(LLLandmarksPanel* lp) + : mLP(lp), + mIsLibraryLandmarksOpen(false) + {} virtual ~LLLandmarksPanelObserver() {} /*virtual*/ void changed(U32 mask); private: LLLandmarksPanel* mLP; + bool mIsLibraryLandmarksOpen; }; void LLLandmarksPanelObserver::changed(U32 mask) { mLP->updateShowFolderState(); + + LLPlacesInventoryPanel* library = mLP->getLibraryInventoryPanel(); + if (!mIsLibraryLandmarksOpen && library) + { + // Search for "Landmarks" folder in the Library and open it once on start up. See EXT-4827. + const LLUUID &landmarks_cat = gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK, false, true); + if (landmarks_cat.notNull()) + { + LLOpenFolderByID opener(landmarks_cat); + library->getRootFolder()->applyFunctorRecursively(opener); + mIsLibraryLandmarksOpen = opener.isFolderOpen(); + } + } } LLLandmarksPanel::LLLandmarksPanel() @@ -165,8 +221,6 @@ BOOL LLLandmarksPanel::postBuild() // mast be called before any other initXXX methods to init Gear menu initListCommandsHandlers(); - U32 sort_order = gSavedSettings.getU32(LLInventoryPanel::DEFAULT_SORT_ORDER); - mSortByDate = sort_order & LLInventoryFilter::SO_DATE; initFavoritesInventoryPanel(); initLandmarksInventoryPanel(); initMyInventoryPanel(); @@ -224,6 +278,17 @@ void LLLandmarksPanel::onShowOnMap() doActionOnCurSelectedLandmark(boost::bind(&LLLandmarksPanel::doShowOnMap, this, _1)); } +//virtual +void LLLandmarksPanel::onShowProfile() +{ + LLFolderViewItem* cur_item = getCurSelectedItem(); + + if(!cur_item) + return; + + cur_item->getListener()->performAction(mCurrentSelectedList->getModel(),"about"); +} + // virtual void LLLandmarksPanel::onTeleport() { @@ -242,6 +307,25 @@ void LLLandmarksPanel::onTeleport() } // virtual +bool LLLandmarksPanel::isSingleItemSelected() +{ + bool result = false; + + if (mCurrentSelectedList != NULL) + { + LLPlacesFolderView* root_view = + static_cast<LLPlacesFolderView*>(mCurrentSelectedList->getRootFolder()); + + if (root_view->getSelectedCount() == 1) + { + result = isLandmarkSelected(); + } + } + + return result; +} + +// virtual void LLLandmarksPanel::updateVerbs() { if (!isTabVisible()) @@ -249,6 +333,7 @@ void LLLandmarksPanel::updateVerbs() bool landmark_selected = isLandmarkSelected(); mTeleportBtn->setEnabled(landmark_selected && isActionEnabled("teleport")); + mShowProfile->setEnabled(landmark_selected && isActionEnabled("more_info")); mShowOnMapBtn->setEnabled(landmark_selected && isActionEnabled("show_on_map")); // TODO: mantipov: Uncomment when mShareBtn is supported @@ -379,9 +464,9 @@ LLFolderViewItem* LLLandmarksPanel::selectItemInAccordionTab(LLPlacesInventoryPa if (!inventory_list) return NULL; - LLFolderView* folder_view = inventory_list->getRootFolder(); + LLFolderView* root = inventory_list->getRootFolder(); - LLFolderViewItem* item = folder_view->getItemByID(obj_id); + LLFolderViewItem* item = root->getItemByID(obj_id); if (!item) return NULL; @@ -391,7 +476,7 @@ LLFolderViewItem* LLLandmarksPanel::selectItemInAccordionTab(LLPlacesInventoryPa tab->changeOpenClose(false); } - folder_view->setSelection(item, FALSE, take_keyboard_focus); + root->setSelection(item, FALSE, take_keyboard_focus); LLAccordionCtrl* accordion = getChild<LLAccordionCtrl>("landmarks_accordion"); LLRect screen_rc; @@ -479,7 +564,7 @@ void LLLandmarksPanel::initLandmarksInventoryPanel() // subscribe to have auto-rename functionality while creating New Folder mLandmarksInventoryPanel->setSelectCallback(boost::bind(&LLInventoryPanel::onSelectionChange, mLandmarksInventoryPanel, _1, _2)); - initAccordion("tab_landmarks", mLandmarksInventoryPanel, true); + mMyLandmarksAccordionTab = initAccordion("tab_landmarks", mLandmarksInventoryPanel, true); } void LLLandmarksPanel::initMyInventoryPanel() @@ -501,7 +586,7 @@ void LLLandmarksPanel::initLibraryInventoryPanel() const LLUUID &landmarks_cat = gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK, false, true); if (landmarks_cat.notNull()) { - gInventory.startBackgroundFetch(landmarks_cat); + LLInventoryModelBackgroundFetch::instance().start(landmarks_cat); } // Expanding "Library" tab for new users who have no landmarks in "My Inventory". @@ -515,24 +600,27 @@ void LLLandmarksPanel::initLandmarksPanel(LLPlacesInventoryPanel* inventory_list if (!inventory_list->getFilter()) return; + inventory_list->getFilter()->setEmptyLookupMessage("PlacesNoMatchingItems"); inventory_list->setFilterTypes(0x1 << LLInventoryType::IT_LANDMARK); inventory_list->setSelectCallback(boost::bind(&LLLandmarksPanel::onSelectionChange, this, inventory_list, _1, _2)); inventory_list->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS); - updateSortOrder(inventory_list, mSortByDate); + bool sorting_order = gSavedSettings.getBOOL("LandmarksSortedByDate"); + updateSortOrder(inventory_list, sorting_order); LLPlacesFolderView* root_folder = dynamic_cast<LLPlacesFolderView*>(inventory_list->getRootFolder()); if (root_folder) { root_folder->setupMenuHandle(LLInventoryType::IT_CATEGORY, mGearFolderMenu->getHandle()); root_folder->setupMenuHandle(LLInventoryType::IT_LANDMARK, mGearLandmarkMenu->getHandle()); + + root_folder->setParentLandmarksPanel(this); } - root_folder->setParentLandmarksPanel(this); inventory_list->saveFolderState(); } -void LLLandmarksPanel::initAccordion(const std::string& accordion_tab_name, LLPlacesInventoryPanel* inventory_list, bool expand_tab) +LLAccordionCtrlTab* LLLandmarksPanel::initAccordion(const std::string& accordion_tab_name, LLPlacesInventoryPanel* inventory_list, bool expand_tab) { LLAccordionCtrlTab* accordion_tab = getChild<LLAccordionCtrlTab>(accordion_tab_name); @@ -540,6 +628,7 @@ void LLLandmarksPanel::initAccordion(const std::string& accordion_tab_name, LLPl accordion_tab->setDropDownStateChangedCallback( boost::bind(&LLLandmarksPanel::onAccordionExpandedCollapsed, this, _2, inventory_list)); accordion_tab->setDisplayChildren(expand_tab); + return accordion_tab; } void LLLandmarksPanel::onAccordionExpandedCollapsed(const LLSD& param, LLPlacesInventoryPanel* inventory_list) @@ -563,7 +652,7 @@ void LLLandmarksPanel::onAccordionExpandedCollapsed(const LLSD& param, LLPlacesI if (!gInventory.isCategoryComplete(cat_id)) */ { - gInventory.startBackgroundFetch(cat_id); + LLInventoryModelBackgroundFetch::instance().start(cat_id); } // Apply filter substring because it might have been changed @@ -600,14 +689,12 @@ void LLLandmarksPanel::initListCommandsHandlers() mListCommands->childSetAction(OPTIONS_BUTTON_NAME, boost::bind(&LLLandmarksPanel::onActionsButtonClick, this)); mListCommands->childSetAction(TRASH_BUTTON_NAME, boost::bind(&LLLandmarksPanel::onTrashButtonClick, this)); - mListCommands->getChild<LLButton>(ADD_BUTTON_NAME)->setHeldDownCallback(boost::bind(&LLLandmarksPanel::onAddButtonHeldDown, this)); - static const LLSD add_landmark_command("add_landmark"); - mListCommands->childSetAction(ADD_BUTTON_NAME, boost::bind(&LLLandmarksPanel::onAddAction, this, add_landmark_command)); LLDragAndDropButton* trash_btn = mListCommands->getChild<LLDragAndDropButton>(TRASH_BUTTON_NAME); trash_btn->setDragAndDropHandler(boost::bind(&LLLandmarksPanel::handleDragAndDropToTrash, this , _4 // BOOL drop , _5 // EDragAndDropType cargo_type + , _6 // void* cargo_data , _7 // EAcceptance* accept )); @@ -620,6 +707,8 @@ void LLLandmarksPanel::initListCommandsHandlers() mGearLandmarkMenu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_places_gear_landmark.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); mGearFolderMenu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_places_gear_folder.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); mMenuAdd = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_place_add_button.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); + + mListCommands->childSetAction(ADD_BUTTON_NAME, boost::bind(&LLLandmarksPanel::showActionMenu, this, mMenuAdd, ADD_BUTTON_NAME)); } @@ -631,37 +720,30 @@ void LLLandmarksPanel::updateListCommands() // keep Options & Add Landmark buttons always enabled mListCommands->childSetEnabled(ADD_FOLDER_BUTTON_NAME, add_folder_enabled); mListCommands->childSetEnabled(TRASH_BUTTON_NAME, trash_enabled); - mListCommands->childSetEnabled(OPTIONS_BUTTON_NAME,getCurSelectedItem() != NULL); } void LLLandmarksPanel::onActionsButtonClick() { + LLMenuGL* menu = mGearFolderMenu; + LLFolderViewItem* cur_item = NULL; if(mCurrentSelectedList) - cur_item = mCurrentSelectedList->getRootFolder()->getCurSelectedItem(); - - if(!cur_item) - return; - - LLFolderViewEventListener* listenerp = cur_item->getListener(); - - LLMenuGL* menu =NULL; - if (listenerp->getInventoryType() == LLInventoryType::IT_LANDMARK) { - menu = mGearLandmarkMenu; - } - else if (listenerp->getInventoryType() == LLInventoryType::IT_CATEGORY) - { - mGearFolderMenu->getChild<LLMenuItemCallGL>("expand")->setVisible(!cur_item->isOpen()); - mGearFolderMenu->getChild<LLMenuItemCallGL>("collapse")->setVisible(cur_item->isOpen()); - menu = mGearFolderMenu; + cur_item = mCurrentSelectedList->getRootFolder()->getCurSelectedItem(); + if(!cur_item) + return; + + LLFolderViewEventListener* listenerp = cur_item->getListener(); + if(!listenerp) + return; + + if (listenerp->getInventoryType() == LLInventoryType::IT_LANDMARK) + { + menu = mGearLandmarkMenu; + } } - showActionMenu(menu,OPTIONS_BUTTON_NAME); -} -void LLLandmarksPanel::onAddButtonHeldDown() -{ - showActionMenu(mMenuAdd,ADD_BUTTON_NAME); + showActionMenu(menu,OPTIONS_BUTTON_NAME); } void LLLandmarksPanel::showActionMenu(LLMenuGL* menu, std::string spawning_view_name) @@ -723,6 +805,17 @@ void LLLandmarksPanel::onAddAction(const LLSD& userdata) const "category"), gInventory.findCategoryUUIDForType( LLFolderType::FT_LANDMARK)); } + else + { + //in case My Landmarks tab is completely empty (thus cannot be determined as being selected) + menu_create_inventory_item(mLandmarksInventoryPanel->getRootFolder(), NULL, LLSD("category"), + gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK)); + + if (mMyLandmarksAccordionTab) + { + mMyLandmarksAccordionTab->changeOpenClose(false); + } + } } } @@ -753,35 +846,47 @@ void LLLandmarksPanel::onClipboardAction(const LLSD& userdata) const void LLLandmarksPanel::onFoldingAction(const LLSD& userdata) { - if(!mCurrentSelectedList) return; - - LLFolderView* root_folder = mCurrentSelectedList->getRootFolder(); std::string command_name = userdata.asString(); if ("expand_all" == command_name) { - root_folder->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_DOWN); - root_folder->arrangeAll(); + expand_all_folders(mFavoritesInventoryPanel->getRootFolder()); + expand_all_folders(mLandmarksInventoryPanel->getRootFolder()); + expand_all_folders(mMyInventoryPanel->getRootFolder()); + expand_all_folders(mLibraryInventoryPanel->getRootFolder()); + + for (accordion_tabs_t::const_iterator iter = mAccordionTabs.begin(); iter != mAccordionTabs.end(); ++iter) + { + (*iter)->changeOpenClose(false); + } } else if ("collapse_all" == command_name) { - root_folder->setOpenArrangeRecursively(FALSE, LLFolderViewFolder::RECURSE_DOWN); + collapse_all_folders(mFavoritesInventoryPanel->getRootFolder()); + collapse_all_folders(mLandmarksInventoryPanel->getRootFolder()); + collapse_all_folders(mMyInventoryPanel->getRootFolder()); + collapse_all_folders(mLibraryInventoryPanel->getRootFolder()); - // The top level folder is invisible, it must be open to - // display its sub-folders. - root_folder->openTopLevelFolders(); - root_folder->arrangeAll(); + for (accordion_tabs_t::const_iterator iter = mAccordionTabs.begin(); iter != mAccordionTabs.end(); ++iter) + { + (*iter)->changeOpenClose(true); + } } - else if ( "sort_by_date" == command_name) + else if ("sort_by_date" == command_name) { - mSortByDate = !mSortByDate; - updateSortOrder(mLandmarksInventoryPanel, mSortByDate); - updateSortOrder(mMyInventoryPanel, mSortByDate); - updateSortOrder(mLibraryInventoryPanel, mSortByDate); + bool sorting_order = gSavedSettings.getBOOL("LandmarksSortedByDate"); + sorting_order=!sorting_order; + gSavedSettings.setBOOL("LandmarksSortedByDate",sorting_order); + updateSortOrder(mLandmarksInventoryPanel, sorting_order); + updateSortOrder(mMyInventoryPanel, sorting_order); + updateSortOrder(mLibraryInventoryPanel, sorting_order); } else { - root_folder->doToSelected(&gInventory, userdata); + if(mCurrentSelectedList) + { + mCurrentSelectedList->getRootFolder()->doToSelected(&gInventory, userdata); + } } } @@ -791,7 +896,8 @@ bool LLLandmarksPanel::isActionChecked(const LLSD& userdata) const if ( "sort_by_date" == command_name) { - return mSortByDate; + bool sorting_order = gSavedSettings.getBOOL("LandmarksSortedByDate"); + return sorting_order; } return false; @@ -801,53 +907,82 @@ bool LLLandmarksPanel::isActionEnabled(const LLSD& userdata) const { std::string command_name = userdata.asString(); - - LLPlacesFolderView* rootFolderView = mCurrentSelectedList ? + LLPlacesFolderView* root_folder_view = mCurrentSelectedList ? static_cast<LLPlacesFolderView*>(mCurrentSelectedList->getRootFolder()) : NULL; - if (NULL == rootFolderView) return false; - - // disable some commands for multi-selection. EXT-1757 - if (rootFolderView->getSelectedCount() > 1) + if ("collapse_all" == command_name) { - if ( "teleport" == command_name - || "more_info" == command_name - || "rename" == command_name - || "show_on_map" == command_name - || "copy_slurl" == command_name - ) + bool disable_collapse_all = !has_expanded_folders(mFavoritesInventoryPanel->getRootFolder()) + && !has_expanded_folders(mLandmarksInventoryPanel->getRootFolder()) + && !has_expanded_folders(mMyInventoryPanel->getRootFolder()) + && !has_expanded_folders(mLibraryInventoryPanel->getRootFolder()); + if (disable_collapse_all) { - return false; + for (accordion_tabs_t::const_iterator iter = mAccordionTabs.begin(); iter != mAccordionTabs.end(); ++iter) + { + if ((*iter)->isExpanded()) + { + disable_collapse_all = false; + break; + } + } } + return !disable_collapse_all; } + else if ("expand_all" == command_name) + { + bool disable_expand_all = !has_collapsed_folders(mFavoritesInventoryPanel->getRootFolder()) + && !has_collapsed_folders(mLandmarksInventoryPanel->getRootFolder()) + && !has_collapsed_folders(mMyInventoryPanel->getRootFolder()) + && !has_collapsed_folders(mLibraryInventoryPanel->getRootFolder()); + if (disable_expand_all) + { + for (accordion_tabs_t::const_iterator iter = mAccordionTabs.begin(); iter != mAccordionTabs.end(); ++iter) + { + if (!(*iter)->isExpanded()) + { + disable_expand_all = false; + break; + } + } + } - // disable some commands for Favorites accordion. EXT-1758 - if (mCurrentSelectedList == mFavoritesInventoryPanel) + return !disable_expand_all; + } + else if ("sort_by_date" == command_name) { - if ( "expand_all" == command_name - || "collapse_all" == command_name - || "sort_by_date" == command_name - ) + // disable "sort_by_date" for Favorites accordion because + // it has its own items order. EXT-1758 + if (mCurrentSelectedList == mFavoritesInventoryPanel) + { return false; + } } - - LLCheckFolderState checker; - rootFolderView->applyFunctorRecursively(checker); - - // We assume that the root folder is always expanded so we enable "collapse_all" - // command when we have at least one more expanded folder. - if (checker.getExpandedFolders() < 2 && "collapse_all" == command_name) + else if ( "paste" == command_name + || "cut" == command_name + || "copy" == command_name + || "delete" == command_name + || "collapse" == command_name + || "expand" == command_name + ) { - return false; + return canSelectedBeModified(command_name); } - - if (checker.getCollapsedFolders() < 1 && "expand_all" == command_name) + else if ( "teleport" == command_name + || "more_info" == command_name + || "show_on_map" == command_name + || "copy_slurl" == command_name + ) { - return false; + // disable some commands for multi-selection. EXT-1757 + return root_folder_view && root_folder_view->getSelectedCount() == 1; } - - if("category" == command_name) + else if ("rename" == command_name) + { + return root_folder_view && root_folder_view->getSelectedCount() == 1 && canSelectedBeModified(command_name); + } + else if("category" == command_name) { // we can add folder only in Landmarks Accordion if (mCurrentSelectedList == mLandmarksInventoryPanel) @@ -855,18 +990,18 @@ bool LLLandmarksPanel::isActionEnabled(const LLSD& userdata) const // ... but except Received folder return !isReceivedFolderSelected(); } - else return false; - } - else if("paste" == command_name || "rename" == command_name || "cut" == command_name || "delete" == command_name) - { - return canSelectedBeModified(command_name); + //"Add a folder" is enabled by default (case when My Landmarks is empty) + else return true; } else if("create_pick" == command_name) { - std::set<LLUUID> selection; - if ( mCurrentSelectedList && mCurrentSelectedList->getRootFolder()->getSelectionList(selection) ) + if (mCurrentSelectedList) { - return ( 1 == selection.size() && !LLAgentPicksInfo::getInstance()->isPickLimitReached() ); + std::set<LLUUID> selection = mCurrentSelectedList->getRootFolder()->getSelectionList(); + if (!selection.empty()) + { + return ( 1 == selection.size() && !LLAgentPicksInfo::getInstance()->isPickLimitReached() ); + } } return false; } @@ -880,13 +1015,10 @@ bool LLLandmarksPanel::isActionEnabled(const LLSD& userdata) const void LLLandmarksPanel::onCustomAction(const LLSD& userdata) { - LLFolderViewItem* cur_item = getCurSelectedItem(); - if(!cur_item) - return; std::string command_name = userdata.asString(); if("more_info" == command_name) { - cur_item->getListener()->performAction(mCurrentSelectedList->getRootFolder(),mCurrentSelectedList->getModel(),"about"); + onShowProfile(); } else if ("teleport" == command_name) { @@ -918,6 +1050,9 @@ bool LLLandmarksPanel::canSelectedBeModified(const std::string& command_name) co { // validate own rules first + LLFolderViewItem* selected = getCurSelectedItem(); + if (!selected) return false; + // nothing can be modified in Library if (mLibraryInventoryPanel == mCurrentSelectedList) return false; @@ -944,24 +1079,41 @@ bool LLLandmarksPanel::canSelectedBeModified(const std::string& command_name) co } // then ask LLFolderView permissions + + LLFolderView* root_folder = mCurrentSelectedList->getRootFolder(); + + if ("copy" == command_name) + { + return root_folder->canCopy(); + } + else if ("collapse" == command_name) + { + return selected->isOpen(); + } + else if ("expand" == command_name) + { + return !selected->isOpen(); + } + if (can_be_modified) { - LLFolderViewItem* selected = getCurSelectedItem(); + LLFolderViewEventListener* listenerp = selected->getListener(); + if ("cut" == command_name) { - can_be_modified = mCurrentSelectedList->getRootFolder()->canCut(); + can_be_modified = root_folder->canCut(); } else if ("rename" == command_name) { - can_be_modified = selected ? selected->getListener()->isItemRenameable() : false; + can_be_modified = listenerp ? listenerp->isItemRenameable() : false; } else if ("delete" == command_name) { - can_be_modified = selected ? selected->getListener()->isItemRemovable(): false; + can_be_modified = listenerp ? listenerp->isItemRemovable() && !listenerp->isItemInTrash() : false; } else if("paste" == command_name) { - return mCurrentSelectedList->getRootFolder()->canPaste(); + can_be_modified = root_folder->canPaste(); } else { @@ -983,7 +1135,7 @@ void LLLandmarksPanel::onPickPanelExit( LLPanelPickEdit* pick_panel, LLView* own pick_panel = NULL; } -bool LLLandmarksPanel::handleDragAndDropToTrash(BOOL drop, EDragAndDropType cargo_type, EAcceptance* accept) +bool LLLandmarksPanel::handleDragAndDropToTrash(BOOL drop, EDragAndDropType cargo_type, void* cargo_data , EAcceptance* accept) { *accept = ACCEPT_NO; @@ -999,7 +1151,21 @@ bool LLLandmarksPanel::handleDragAndDropToTrash(BOOL drop, EDragAndDropType carg if (is_enabled && drop) { - onClipboardAction("delete"); + // don't call onClipboardAction("delete") + // this lead to removing (N * 2 - 1) items if drag N>1 items into trash. EXT-6757 + // So, let remove items one by one. + LLInventoryItem* item = static_cast<LLInventoryItem*>(cargo_data); + if (item) + { + LLFolderViewItem* fv_item = (mCurrentSelectedList && mCurrentSelectedList->getRootFolder()) ? + mCurrentSelectedList->getRootFolder()->getItemByID(item->getUUID()) : NULL; + + if (fv_item) + { + // is Item Removable checked inside of remove() + fv_item->remove(); + } + } } } break; @@ -1145,4 +1311,54 @@ static bool category_has_descendents(LLPlacesInventoryPanel* inventory_list) return false; } + +static void collapse_all_folders(LLFolderView* root_folder) +{ + if (!root_folder) + return; + + root_folder->setOpenArrangeRecursively(FALSE, LLFolderViewFolder::RECURSE_DOWN); + + // The top level folder is invisible, it must be open to + // display its sub-folders. + root_folder->openTopLevelFolders(); + root_folder->arrangeAll(); +} + +static void expand_all_folders(LLFolderView* root_folder) +{ + if (!root_folder) + return; + + root_folder->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_DOWN); + root_folder->arrangeAll(); +} + +static bool has_expanded_folders(LLFolderView* root_folder) +{ + LLCheckFolderState checker; + root_folder->applyFunctorRecursively(checker); + + // We assume that the root folder is always expanded so we enable "collapse_all" + // command when we have at least one more expanded folder. + if (checker.getExpandedFolders() < 2) + { + return false; + } + + return true; +} + +static bool has_collapsed_folders(LLFolderView* root_folder) +{ + LLCheckFolderState checker; + root_folder->applyFunctorRecursively(checker); + + if (checker.getCollapsedFolders() < 1) + { + return false; + } + + return true; +} // EOF diff --git a/indra/newview/llpanellandmarks.h b/indra/newview/llpanellandmarks.h index cbbd10ac26..0e70c72f11 100644 --- a/indra/newview/llpanellandmarks.h +++ b/indra/newview/llpanellandmarks.h @@ -57,8 +57,10 @@ public: /*virtual*/ BOOL postBuild(); /*virtual*/ void onSearchEdit(const std::string& string); /*virtual*/ void onShowOnMap(); + /*virtual*/ void onShowProfile(); /*virtual*/ void onTeleport(); /*virtual*/ void updateVerbs(); + /*virtual*/ bool isSingleItemSelected(); void onSelectionChange(LLPlacesInventoryPanel* inventory_list, const std::deque<LLFolderViewItem*> &items, BOOL user_action); void onSelectorButtonClicked(); @@ -78,6 +80,8 @@ public: */ void setItemSelected(const LLUUID& obj_id, BOOL take_keyboard_focus); + LLPlacesInventoryPanel* getLibraryInventoryPanel() { return mLibraryInventoryPanel; } + protected: /** * @return true - if current selected panel is not null and selected item is a landmark @@ -110,7 +114,7 @@ private: void initMyInventoryPanel(); void initLibraryInventoryPanel(); void initLandmarksPanel(LLPlacesInventoryPanel* inventory_list); - void initAccordion(const std::string& accordion_tab_name, LLPlacesInventoryPanel* inventory_list, bool expand_tab); + LLAccordionCtrlTab* initAccordion(const std::string& accordion_tab_name, LLPlacesInventoryPanel* inventory_list, bool expand_tab); void onAccordionExpandedCollapsed(const LLSD& param, LLPlacesInventoryPanel* inventory_list); void deselectOtherThan(const LLPlacesInventoryPanel* inventory_list); @@ -119,7 +123,6 @@ private: void updateListCommands(); void onActionsButtonClick(); void showActionMenu(LLMenuGL* menu, std::string spawning_view_name); - void onAddButtonHeldDown(); void onTrashButtonClick() const; void onAddAction(const LLSD& command_name) const; void onClipboardAction(const LLSD& command_name) const; @@ -140,7 +143,7 @@ private: /** * Processes drag-n-drop of the Landmarks and folders into trash button. */ - bool handleDragAndDropToTrash(BOOL drop, EDragAndDropType cargo_type, EAcceptance* accept); + bool handleDragAndDropToTrash(BOOL drop, EDragAndDropType cargo_type, void* cargo_data, EAcceptance* accept); /** * Landmark actions callbacks. Fire when a landmark is loaded from the list. @@ -153,21 +156,22 @@ private: void doCreatePick(LLLandmark* landmark); private: - LLPlacesInventoryPanel* mFavoritesInventoryPanel; - LLPlacesInventoryPanel* mLandmarksInventoryPanel; - LLPlacesInventoryPanel* mMyInventoryPanel; - LLPlacesInventoryPanel* mLibraryInventoryPanel; + LLPlacesInventoryPanel* mFavoritesInventoryPanel; + LLPlacesInventoryPanel* mLandmarksInventoryPanel; + LLPlacesInventoryPanel* mMyInventoryPanel; + LLPlacesInventoryPanel* mLibraryInventoryPanel; LLMenuGL* mGearLandmarkMenu; LLMenuGL* mGearFolderMenu; LLMenuGL* mMenuAdd; - LLPlacesInventoryPanel* mCurrentSelectedList; + LLPlacesInventoryPanel* mCurrentSelectedList; LLInventoryObserver* mInventoryObserver; LLPanel* mListCommands; - bool mSortByDate; typedef std::vector<LLAccordionCtrlTab*> accordion_tabs_t; accordion_tabs_t mAccordionTabs; + + LLAccordionCtrlTab* mMyLandmarksAccordionTab; }; #endif //LL_LLPANELLANDMARKS_H diff --git a/indra/newview/llpanellandmedia.cpp b/indra/newview/llpanellandmedia.cpp index 42ad9820a8..e834e229cd 100644 --- a/indra/newview/llpanellandmedia.cpp +++ b/indra/newview/llpanellandmedia.cpp @@ -153,7 +153,7 @@ void LLPanelLandMedia::refresh() std::string mime_type = parcel->getMediaType(); if (mime_type.empty()) { - mime_type = "none/none"; + mime_type = LLMIMETypes::getDefaultMimeTypeTranslation(); } setMediaType(mime_type); mMediaTypeCombo->setEnabled( can_change_media ); @@ -218,7 +218,7 @@ void LLPanelLandMedia::refresh() void LLPanelLandMedia::populateMIMECombo() { - std::string default_mime_type = "none/none"; + std::string default_mime_type = LLMIMETypes::getDefaultMimeType(); std::string default_label; LLMIMETypes::mime_widget_set_map_t::const_iterator it; for (it = LLMIMETypes::sWidgetMap.begin(); it != LLMIMETypes::sWidgetMap.end(); ++it) @@ -235,8 +235,7 @@ void LLPanelLandMedia::populateMIMECombo() mMediaTypeCombo->add(info.mLabel, mime_type); } } - // *TODO: The sort order is based on std::map key, which is - // ASCII-sorted and is wrong in other languages. TRANSLATE + mMediaTypeCombo->add( default_label, default_mime_type, ADD_BOTTOM ); } @@ -248,7 +247,15 @@ void LLPanelLandMedia::setMediaType(const std::string& mime_type) std::string media_key = LLMIMETypes::widgetType(mime_type); mMediaTypeCombo->setValue(media_key); - childSetText("mime_type", mime_type); + + std::string mime_str = mime_type; + if(LLMIMETypes::getDefaultMimeType() == mime_type) + { + // Instead of showing predefined "none/none" we are going to show something + // localizable - "none" for example (see EXT-6542) + mime_str = LLMIMETypes::getDefaultMimeTypeTranslation(); + } + childSetText("mime_type", mime_str); } void LLPanelLandMedia::setMediaURL(const std::string& media_url) diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp index df9002facc..144839b554 100644 --- a/indra/newview/llpanellogin.cpp +++ b/indra/newview/llpanellogin.cpp @@ -51,11 +51,12 @@ #include "llfocusmgr.h" #include "lllineeditor.h" #include "llnotificationsutil.h" +#include "llsecapi.h" #include "llstartup.h" #include "lltextbox.h" #include "llui.h" #include "lluiconstants.h" -#include "llurlsimstring.h" +#include "llslurl.h" #include "llversioninfo.h" #include "llviewerhelp.h" #include "llviewertexturelist.h" @@ -77,6 +78,7 @@ #pragma warning(disable: 4355) // 'this' used in initializer list #endif // LL_WINDOWS +#include "llsdserialize.h" #define USE_VIEWER_AUTH 0 const S32 BLACK_BORDER_HEIGHT = 160; @@ -104,7 +106,6 @@ public: LLLoginRefreshHandler gLoginRefreshHandler; - // helper class that trys to download a URL from a web site and calls a method // on parent class indicating if the web server is working or not class LLIamHereLogin : public LLHTTPClient::Responder @@ -153,10 +154,6 @@ namespace { boost::intrusive_ptr< LLIamHereLogin > gResponsePtr = 0; }; -void set_start_location(LLUICtrl* ctrl, void* data) -{ - LLURLSimString::setString(ctrl->getValue().asString()); -} //--------------------------------------------------------------------------- // Public methods @@ -187,6 +184,7 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect, delete LLPanelLogin::sInstance; } + mPasswordModified = FALSE; LLPanelLogin::sInstance = this; // add to front so we are the bottom-most child @@ -213,41 +211,27 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect, } #if !USE_VIEWER_AUTH - childSetPrevalidate("first_name_edit", LLLineEditor::prevalidateASCIIPrintableNoSpace); - childSetPrevalidate("last_name_edit", LLLineEditor::prevalidateASCIIPrintableNoSpace); - - childSetCommitCallback("password_edit", mungePassword, this); + childSetPrevalidate("username_edit", LLTextValidate::validateASCIIPrintableNoPipe); getChild<LLLineEditor>("password_edit")->setKeystrokeCallback(onPassKey, this); // change z sort of clickable text to be behind buttons - sendChildToBack(getChildView("channel_text")); + //sendChildToBack(getChildView("channel_text")); sendChildToBack(getChildView("forgot_password_text")); LLLineEditor* edit = getChild<LLLineEditor>("password_edit"); if (edit) edit->setDrawAsterixes(TRUE); - LLComboBox* combo = getChild<LLComboBox>("start_location_combo"); - - std::string sim_string = LLURLSimString::sInstance.mSimString; - if(sim_string.empty()) - { - LLURLSimString::setString(gSavedSettings.getString("LoginLocation")); - } - - if (!sim_string.empty()) + if(LLStartUp::getStartSLURL().getType() != LLSLURL::LOCATION) { - // Replace "<Type region name>" with this region name - combo->remove(2); - combo->add( sim_string ); - combo->setTextEntry(sim_string); - combo->setCurrentByIndex( 2 ); + LLSLURL slurl(gSavedSettings.getString("LoginLocation")); + LLStartUp::setStartSLURL(slurl); } - - combo->setCommitCallback( &set_start_location, NULL ); + updateLocationCombo(false); LLComboBox* server_choice_combo = sInstance->getChild<LLComboBox>("server_combo"); server_choice_combo->setCommitCallback(onSelectServer, NULL); server_choice_combo->setFocusLostCallback(boost::bind(onServerComboLostFocus, _1)); + updateServerCombo(); childSetAction("connect_btn", onClickConnect, this); @@ -257,10 +241,10 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect, std::string version = llformat("%s (%d)", LLVersionInfo::getShortVersion().c_str(), LLVersionInfo::getBuild()); - LLTextBox* channel_text = getChild<LLTextBox>("channel_text"); - channel_text->setTextArg("[CHANNEL]", channel); // though not displayed - channel_text->setTextArg("[VERSION]", version); - channel_text->setClickedCallback(onClickVersion, this); + //LLTextBox* channel_text = getChild<LLTextBox>("channel_text"); + //channel_text->setTextArg("[CHANNEL]", channel); // though not displayed + //channel_text->setTextArg("[VERSION]", version); + //channel_text->setClickedCallback(onClickVersion, this); LLTextBox* forgot_password_text = getChild<LLTextBox>("forgot_password_text"); forgot_password_text->setClickedCallback(onClickForgotPassword, NULL); @@ -286,34 +270,14 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect, web_browser->setTabStop(FALSE); // web_browser->navigateToLocalPage( "loading", "loading.html" ); - if (gSavedSettings.getBOOL("RegInClient")) - { - // need to follow links in the internal browser - web_browser->setOpenInExternalBrowser( false ); - - getChild<LLView>("login_widgets")->setVisible(false); - } - else - { - // make links open in external browser - web_browser->setOpenInExternalBrowser( true ); - - reshapeBrowser(); - } + reshapeBrowser(); // kick off a request to grab the url manually gResponsePtr = LLIamHereLogin::build( this ); - std::string login_page = gSavedSettings.getString("LoginPage"); - if (login_page.empty()) - { - login_page = getString( "real_url" ); - } - LLHTTPClient::head( login_page, gResponsePtr ); -#if !USE_VIEWER_AUTH - // Initialize visibility (and don't force visibility - use prefs) - refreshLocation( false ); -#endif + LLHTTPClient::head( LLGridManager::getInstance()->getLoginPage(), gResponsePtr ); + + updateLocationCombo(false); } @@ -377,21 +341,6 @@ void LLPanelLogin::setSiteIsAlive( bool alive ) } } -void LLPanelLogin::mungePassword(LLUICtrl* caller, void* user_data) -{ - LLPanelLogin* self = (LLPanelLogin*)user_data; - LLLineEditor* editor = (LLLineEditor*)caller; - std::string password = editor->getText(); - - // Re-md5 if we've changed at all - if (password != self->mIncomingPassword) - { - LLMD5 pass((unsigned char *)password.c_str()); - char munged_password[MD5HEX_STR_SIZE]; - pass.hex_digest(munged_password); - self->mMungedPassword = munged_password; - } -} LLPanelLogin::~LLPanelLogin() { @@ -454,12 +403,6 @@ void LLPanelLogin::draw() // virtual BOOL LLPanelLogin::handleKeyHere(KEY key, MASK mask) { - if (( KEY_RETURN == key ) && (MASK_ALT == mask)) - { - gViewerWindow->toggleFullscreen(FALSE); - return TRUE; - } - if ( KEY_F1 == key ) { LLViewerHelp* vhelp = LLViewerHelp::getInstance(); @@ -498,14 +441,14 @@ void LLPanelLogin::giveFocus() if( sInstance ) { // Grab focus and move cursor to first blank input field - std::string first = sInstance->childGetText("first_name_edit"); + std::string username = sInstance->childGetText("username_edit"); std::string pass = sInstance->childGetText("password_edit"); - BOOL have_first = !first.empty(); + BOOL have_username = !username.empty(); BOOL have_pass = !pass.empty(); LLLineEditor* edit = NULL; - if (have_first && !have_pass) + if (have_username && !have_pass) { // User saved his name but not his password. Move // focus to password field. @@ -514,7 +457,7 @@ void LLPanelLogin::giveFocus() else { // User doesn't have a name, so start there. - edit = sInstance->getChild<LLLineEditor>("first_name_edit"); + edit = sInstance->getChild<LLLineEditor>("username_edit"); } if (edit) @@ -531,13 +474,12 @@ void LLPanelLogin::showLoginWidgets() { sInstance->childSetVisible("login_widgets", true); LLMediaCtrl* web_browser = sInstance->getChild<LLMediaCtrl>("login_html"); - web_browser->setOpenInExternalBrowser( true ); sInstance->reshapeBrowser(); // *TODO: Append all the usual login parameters, like first_login=Y etc. std::string splash_screen_url = sInstance->getString("real_url"); web_browser->navigateTo( splash_screen_url, "text/html" ); - LLUICtrl* first_name_edit = sInstance->getChild<LLUICtrl>("first_name_edit"); - first_name_edit->setFocus(TRUE); + LLUICtrl* username_edit = sInstance->getChild<LLUICtrl>("username_edit"); + username_edit->setFocus(TRUE); } // static @@ -559,77 +501,127 @@ void LLPanelLogin::show(const LLRect &rect, } // static -void LLPanelLogin::setFields(const std::string& firstname, - const std::string& lastname, - const std::string& password) +void LLPanelLogin::setFields(LLPointer<LLCredential> credential, + BOOL remember) { if (!sInstance) { llwarns << "Attempted fillFields with no login view shown" << llendl; return; } + LL_INFOS("Credentials") << "Setting login fields to " << *credential << LL_ENDL; - sInstance->childSetText("first_name_edit", firstname); - sInstance->childSetText("last_name_edit", lastname); - - // Max "actual" password length is 16 characters. - // Hex digests are always 32 characters. - if (password.length() == 32) + LLSD identifier = credential->getIdentifier(); + if((std::string)identifier["type"] == "agent") + { + sInstance->childSetText("username_edit", (std::string)identifier["first_name"] + " " + + (std::string)identifier["last_name"]); + } + else if((std::string)identifier["type"] == "account") + { + sInstance->childSetText("username_edit", (std::string)identifier["account_name"]); + } + else + { + sInstance->childSetText("username_edit", std::string()); + } + // if the password exists in the credential, set the password field with + // a filler to get some stars + LLSD authenticator = credential->getAuthenticator(); + LL_INFOS("Credentials") << "Setting authenticator field " << authenticator["type"].asString() << LL_ENDL; + if(authenticator.isMap() && + authenticator.has("secret") && + (authenticator["secret"].asString().size() > 0)) { + // This is a MD5 hex digest of a password. // We don't actually use the password input field, // fill it with MAX_PASSWORD characters so we get a // nice row of asterixes. const std::string filler("123456789!123456"); - sInstance->childSetText("password_edit", filler); - sInstance->mIncomingPassword = filler; - sInstance->mMungedPassword = password; + sInstance->childSetText("password_edit", std::string("123456789!123456")); } else { - // this is a normal text password - sInstance->childSetText("password_edit", password); - sInstance->mIncomingPassword = password; - LLMD5 pass((unsigned char *)password.c_str()); - char munged_password[MD5HEX_STR_SIZE]; - pass.hex_digest(munged_password); - sInstance->mMungedPassword = munged_password; + sInstance->childSetText("password_edit", std::string()); } + sInstance->childSetValue("remember_check", remember); } // static -void LLPanelLogin::addServer(const std::string& server, S32 domain_name) +void LLPanelLogin::getFields(LLPointer<LLCredential>& credential, + BOOL& remember) { if (!sInstance) { - llwarns << "Attempted addServer with no login view shown" << llendl; + llwarns << "Attempted getFields with no login view shown" << llendl; return; } + + // load the credential so we can pass back the stored password or hash if the user did + // not modify the password field. + + credential = gSecAPIHandler->loadCredential(LLGridManager::getInstance()->getGrid()); - LLComboBox* combo = sInstance->getChild<LLComboBox>("server_combo"); - combo->add(server, LLSD(domain_name) ); - combo->setCurrentByIndex(0); -} - -// static -void LLPanelLogin::getFields(std::string *firstname, - std::string *lastname, - std::string *password) -{ - if (!sInstance) + LLSD identifier = LLSD::emptyMap(); + LLSD authenticator = LLSD::emptyMap(); + + if(credential.notNull()) { - llwarns << "Attempted getFields with no login view shown" << llendl; - return; + authenticator = credential->getAuthenticator(); } - *firstname = sInstance->childGetText("first_name_edit"); - LLStringUtil::trim(*firstname); - - *lastname = sInstance->childGetText("last_name_edit"); - LLStringUtil::trim(*lastname); + std::string username = sInstance->childGetText("username_edit"); + LLStringUtil::trim(username); + std::string password = sInstance->childGetText("password_edit"); - *password = sInstance->mMungedPassword; + LL_INFOS2("Credentials", "Authentication") << "retrieving username:" << username << LL_ENDL; + // determine if the username is a first/last form or not. + size_t separator_index = username.find_first_of(' '); + if (separator_index == username.npos) + { + LL_INFOS2("Credentials", "Authentication") << "account: " << username << LL_ENDL; + // single username, so this is a 'clear' identifier + identifier["type"] = CRED_IDENTIFIER_TYPE_ACCOUNT; + identifier["account_name"] = username; + + if (LLPanelLogin::sInstance->mPasswordModified) + { + authenticator = LLSD::emptyMap(); + // password is plaintext + authenticator["type"] = CRED_AUTHENTICATOR_TYPE_CLEAR; + authenticator["secret"] = password; + } + } + else + { + std::string first = username.substr(0, separator_index); + std::string last = username.substr(separator_index, username.npos); + LLStringUtil::trim(last); + + if (last.find_first_of(' ') == last.npos) + { + LL_INFOS2("Credentials", "Authentication") << "agent: " << username << LL_ENDL; + // traditional firstname / lastname + identifier["type"] = CRED_IDENTIFIER_TYPE_AGENT; + identifier["first_name"] = first; + identifier["last_name"] = last; + + if (LLPanelLogin::sInstance->mPasswordModified) + { + authenticator = LLSD::emptyMap(); + authenticator["type"] = CRED_AUTHENTICATOR_TYPE_HASH; + authenticator["algorithm"] = "md5"; + LLMD5 pass((const U8 *)password.c_str()); + char md5pass[33]; /* Flawfinder: ignore */ + pass.hex_digest(md5pass); + authenticator["secret"] = md5pass; + } + } + } + credential = gSecAPIHandler->createCredential(LLGridManager::getInstance()->getGrid(), identifier, authenticator); + remember = sInstance->childGetValue("remember_check"); } // static @@ -649,62 +641,112 @@ BOOL LLPanelLogin::isGridComboDirty() } // static -void LLPanelLogin::getLocation(std::string &location) +BOOL LLPanelLogin::areCredentialFieldsDirty() { if (!sInstance) { - llwarns << "Attempted getLocation with no login view shown" << llendl; - return; + llwarns << "Attempted getServer with no login view shown" << llendl; } - - LLComboBox* combo = sInstance->getChild<LLComboBox>("start_location_combo"); - location = combo->getValue().asString(); + else + { + std::string username = sInstance->childGetText("username_edit"); + LLStringUtil::trim(username); + std::string password = sInstance->childGetText("password_edit"); + LLLineEditor* ctrl = sInstance->getChild<LLLineEditor>("username_edit"); + if(ctrl && ctrl->isDirty()) + { + return true; + } + ctrl = sInstance->getChild<LLLineEditor>("password_edit"); + if(ctrl && ctrl->isDirty()) + { + return true; + } + } + return false; } + // static -void LLPanelLogin::refreshLocation( bool force_visible ) +void LLPanelLogin::updateLocationCombo( bool force_visible ) { - if (!sInstance) return; - -#if USE_VIEWER_AUTH - loadLoginPage(); -#else - BOOL show_start = TRUE; - - if ( ! force_visible ) + if (!sInstance) + { + return; + } + + LLComboBox* combo = sInstance->getChild<LLComboBox>("start_location_combo"); + + switch(LLStartUp::getStartSLURL().getType()) { - // Don't show on first run after install - // Otherwise ShowStartLocation defaults to true. - show_start = gSavedSettings.getBOOL("ShowStartLocation") - && gSavedSettings.getBOOL("HadFirstSuccessfulLogin"); + case LLSLURL::LOCATION: + { + + combo->setCurrentByIndex( 2 ); + combo->setTextEntry(LLStartUp::getStartSLURL().getLocationString()); + break; + } + case LLSLURL::HOME_LOCATION: + combo->setCurrentByIndex(1); + break; + default: + combo->setCurrentByIndex(0); + break; } - + + BOOL show_start = TRUE; + + if ( ! force_visible ) + show_start = gSavedSettings.getBOOL("ShowStartLocation"); + sInstance->childSetVisible("start_location_combo", show_start); sInstance->childSetVisible("start_location_text", show_start); - + BOOL show_server = gSavedSettings.getBOOL("ForceShowGrid"); + sInstance->childSetVisible("server_combo_text", show_server); sInstance->childSetVisible("server_combo", show_server); - -#endif } // static -void LLPanelLogin::updateLocationUI() +void LLPanelLogin::updateStartSLURL() { if (!sInstance) return; - std::string sim_string = LLURLSimString::sInstance.mSimString; - if (!sim_string.empty()) + LLComboBox* combo = sInstance->getChild<LLComboBox>("start_location_combo"); + S32 index = combo->getCurrentIndex(); + + switch (index) { - // Replace "<Type region name>" with this region name - LLComboBox* combo = sInstance->getChild<LLComboBox>("start_location_combo"); - combo->remove(2); - combo->add( sim_string ); - combo->setTextEntry(sim_string); - combo->setCurrentByIndex( 2 ); + case 0: + { + LLStartUp::setStartSLURL(LLSLURL(LLSLURL::SIM_LOCATION_LAST)); + break; + } + case 1: + { + LLStartUp::setStartSLURL(LLSLURL(LLSLURL::SIM_LOCATION_HOME)); + break; + } + default: + { + LLSLURL slurl = LLSLURL(combo->getValue().asString()); + if(slurl.getType() == LLSLURL::LOCATION) + { + // we've changed the grid, so update the grid selection + LLStartUp::setStartSLURL(slurl); + } + break; + } } } + +void LLPanelLogin::setLocation(const LLSLURL& slurl) +{ + LLStartUp::setStartSLURL(slurl); + updateServer(); +} + // static void LLPanelLogin::closePanel() { @@ -738,15 +780,13 @@ void LLPanelLogin::loadLoginPage() std::ostringstream oStr; - std::string login_page = gSavedSettings.getString("LoginPage"); - if (login_page.empty()) - { - login_page = sInstance->getString( "real_url" ); - } + std::string login_page = LLGridManager::getInstance()->getLoginPage(); + oStr << login_page; // Use the right delimeter depending on how LLURI parses the URL LLURI login_page_uri = LLURI(login_page); + std::string first_query_delimiter = "&"; if (login_page_uri.queryMap().size() == 0) { @@ -778,11 +818,10 @@ void LLPanelLogin::loadLoginPage() curl_free(curl_version); // Grid - char* curl_grid = curl_escape(LLViewerLogin::getInstance()->getGridLabel().c_str(), 0); + char* curl_grid = curl_escape(LLGridManager::getInstance()->getGridLoginID().c_str(), 0); oStr << "&grid=" << curl_grid; curl_free(curl_grid); - - gViewerWindow->setMenuBackgroundColor(false, !LLViewerLogin::getInstance()->isInProductionGrid()); + gViewerWindow->setMenuBackgroundColor(false, !LLGridManager::getInstance()->isInProductionGrid()); gLoginMenuBarView->setBackgroundColor(gMenuBarView->getBackgroundColor()); @@ -807,30 +846,20 @@ void LLPanelLogin::loadLoginPage() location = gSavedSettings.getString("LoginLocation"); } - std::string firstname, lastname; + std::string username; if(gSavedSettings.getLLSD("UserLoginInfo").size() == 3) { LLSD cmd_line_login = gSavedSettings.getLLSD("UserLoginInfo"); - firstname = cmd_line_login[0].asString(); - lastname = cmd_line_login[1].asString(); + username = cmd_line_login[0].asString() + " " + cmd_line_login[1]; password = cmd_line_login[2].asString(); } - if (firstname.empty()) - { - firstname = gSavedSettings.getString("FirstName"); - } - - if (lastname.empty()) - { - lastname = gSavedSettings.getString("LastName"); - } char* curl_region = curl_escape(region.c_str(), 0); - oStr <<"firstname=" << firstname << - "&lastname=" << lastname << "&location=" << location << "®ion=" << curl_region; + oStr <<"username=" << username << + "&location=" << location << "®ion=" << curl_region; curl_free(curl_region); @@ -846,8 +875,7 @@ void LLPanelLogin::loadLoginPage() { oStr << "&auto_login=TRUE"; } - if (gSavedSettings.getBOOL("ShowStartLocation") - && gSavedSettings.getBOOL("HadFirstSuccessfulLogin")) + if (gSavedSettings.getBOOL("ShowStartLocation")) { oStr << "&show_start_location=TRUE"; } @@ -864,7 +892,7 @@ void LLPanelLogin::loadLoginPage() #endif LLMediaCtrl* web_browser = sInstance->getChild<LLMediaCtrl>("login_html"); - + // navigate to the "real" page if (gSavedSettings.getBOOL("RegInClient")) { @@ -913,39 +941,66 @@ void LLPanelLogin::onClickConnect(void *) // JC - Make sure the fields all get committed. sInstance->setFocus(FALSE); - std::string first = sInstance->childGetText("first_name_edit"); - std::string last = sInstance->childGetText("last_name_edit"); - LLComboBox* combo = sInstance->getChild<LLComboBox>("start_location_combo"); - std::string combo_text = combo->getSimple(); - - bool has_first_and_last = !(first.empty() || last.empty()); - bool has_location = false; - - if(combo_text=="<Type region name>" || combo_text =="") + LLComboBox* combo = sInstance->getChild<LLComboBox>("server_combo"); + LLSD combo_val = combo->getSelectedValue(); + if (combo_val.isUndefined()) { - // *NOTE: Mani - Location field is not always committed by this point! - // This may be duplicate work, but better than not doing the work! - LLURLSimString::sInstance.setString(""); + combo_val = combo->getValue(); } - else + if(combo_val.isUndefined()) { - // *NOTE: Mani - Location field is not always committed by this point! - LLURLSimString::sInstance.setString(combo_text); - has_location = true; + LLNotificationsUtil::add("StartRegionEmpty"); + return; + } + try + { + LLGridManager::getInstance()->setGridChoice(combo_val.asString()); } - - if(!has_first_and_last) + catch (LLInvalidGridName ex) { - LLNotificationsUtil::add("MustHaveAccountToLogIn"); + LLSD args; + args["GRID"] = combo_val.asString(); + LLNotificationsUtil::add("InvalidGrid", args); + return; } - else if(!has_location) + updateStartSLURL(); + std::string username = sInstance->childGetText("username_edit"); + + + if(username.empty()) { - LLNotificationsUtil::add("StartRegionEmpty"); + // user must type in something into the username field + LLNotificationsUtil::add("MustHaveAccountToLogIn"); } else { - // has both first and last name typed - sInstance->mCallback(0, sInstance->mCallbackData); + LLPointer<LLCredential> cred; + BOOL remember; + getFields(cred, remember); + std::string identifier_type; + cred->identifierType(identifier_type); + LLSD allowed_credential_types; + LLGridManager::getInstance()->getLoginIdentifierTypes(allowed_credential_types); + + // check the typed in credential type against the credential types expected by the server. + for(LLSD::array_iterator i = allowed_credential_types.beginArray(); + i != allowed_credential_types.endArray(); + i++) + { + + if(i->asString() == identifier_type) + { + // yay correct credential type + sInstance->mCallback(0, sInstance->mCallbackData); + return; + } + } + + // Right now, maingrid is the only thing that is picky about + // credential format, as it doesn't yet allow account (single username) + // format creds. - Rox. James, we wanna fix the message when we change + // this. + LLNotificationsUtil::add("InvalidCredentialFormat"); } } } @@ -1003,66 +1058,105 @@ void LLPanelLogin::onClickHelp(void*) // static void LLPanelLogin::onPassKey(LLLineEditor* caller, void* user_data) { + LLPanelLogin *This = (LLPanelLogin *) user_data; + This->mPasswordModified = TRUE; if (gKeyboard->getKeyDown(KEY_CAPSLOCK) && sCapslockDidNotification == FALSE) { - LLNotificationsUtil::add("CapsKeyOn"); +// *TODO: use another way to notify user about enabled caps lock, see EXT-6858 sCapslockDidNotification = TRUE; } } -// static -void LLPanelLogin::onSelectServer(LLUICtrl*, void*) -{ - // *NOTE: The paramters for this method are ignored. - // LLPanelLogin::onServerComboLostFocus(LLFocusableElement* fe, void*) - // calls this method. - // The user twiddled with the grid choice ui. - // apply the selection to the grid setting. - std::string grid_label; - S32 grid_index; - - LLComboBox* combo = sInstance->getChild<LLComboBox>("server_combo"); - LLSD combo_val = combo->getValue(); - - if (LLSD::TypeInteger == combo_val.type()) +void LLPanelLogin::updateServer() +{ + try { - grid_index = combo->getValue().asInteger(); - if ((S32)GRID_INFO_OTHER == grid_index) + updateServerCombo(); + // if they've selected another grid, we should load the credentials + // for that grid and set them to the UI. + if(sInstance && !sInstance->areCredentialFieldsDirty()) { - // This happens if the user specifies a custom grid - // via command line. - grid_label = combo->getSimple(); + LLPointer<LLCredential> credential = gSecAPIHandler->loadCredential(LLGridManager::getInstance()->getGrid()); + bool remember = sInstance->childGetValue("remember_check"); + sInstance->setFields(credential, remember); } + // grid changed so show new splash screen (possibly) + loadLoginPage(); + updateLocationCombo(LLStartUp::getStartSLURL().getType() == LLSLURL::LOCATION); } - else + catch (LLInvalidGridName ex) { - // no valid selection, return other - grid_index = (S32)GRID_INFO_OTHER; - grid_label = combo_val.asString(); + // do nothing } +} - // This new seelction will override preset uris - // from the command line. - LLViewerLogin* vl = LLViewerLogin::getInstance(); - vl->resetURIs(); - if(grid_index != GRID_INFO_OTHER) +void LLPanelLogin::updateServerCombo() +{ + if (!sInstance) { - vl->setGridChoice((EGridInfo)grid_index); + return; } - else + // We add all of the possible values, sorted, and then add a bar and the current value at the top + LLComboBox* server_choice_combo = sInstance->getChild<LLComboBox>("server_combo"); + server_choice_combo->removeall(); + + std::map<std::string, std::string> known_grids = LLGridManager::getInstance()->getKnownGrids(!gSavedSettings.getBOOL("ShowBetaGrids")); + + for (std::map<std::string, std::string>::iterator grid_choice = known_grids.begin(); + grid_choice != known_grids.end(); + grid_choice++) { - vl->setGridChoice(grid_label); + if (!grid_choice->first.empty()) + { + server_choice_combo->add(grid_choice->second, grid_choice->first, ADD_SORTED); + } } + + server_choice_combo->addSeparator(ADD_TOP); + + server_choice_combo->add(LLGridManager::getInstance()->getGridLabel(), + LLGridManager::getInstance()->getGrid(), ADD_TOP); + + server_choice_combo->selectFirstItem(); +} - // grid changed so show new splash screen (possibly) - loadLoginPage(); +// static +void LLPanelLogin::onSelectServer(LLUICtrl*, void*) +{ + // *NOTE: The paramters for this method are ignored. + // LLPanelLogin::onServerComboLostFocus(LLFocusableElement* fe, void*) + // calls this method. + LL_INFOS("AppInit") << "onSelectServer" << LL_ENDL; + // The user twiddled with the grid choice ui. + // apply the selection to the grid setting. + LLPointer<LLCredential> credential; + + LLComboBox* combo = sInstance->getChild<LLComboBox>("server_combo"); + LLSD combo_val = combo->getSelectedValue(); + if (combo_val.isUndefined()) + { + combo_val = combo->getValue(); + } + + combo = sInstance->getChild<LLComboBox>("start_location_combo"); + combo->setCurrentByIndex(1); + LLStartUp::setStartSLURL(LLSLURL(gSavedSettings.getString("LoginLocation"))); + LLGridManager::getInstance()->setGridChoice(combo_val.asString()); + // This new selection will override preset uris + // from the command line. + updateServer(); + updateLocationCombo(false); + updateLoginPanelLinks(); } void LLPanelLogin::onServerComboLostFocus(LLFocusableElement* fe) { - if (!sInstance) return; + if (!sInstance) + { + return; + } LLComboBox* combo = sInstance->getChild<LLComboBox>("server_combo"); if(fe == combo) @@ -1070,3 +1164,15 @@ void LLPanelLogin::onServerComboLostFocus(LLFocusableElement* fe) onSelectServer(combo, NULL); } } + +void LLPanelLogin::updateLoginPanelLinks() +{ + LLSD grid_data; + LLGridManager::getInstance()->getGridInfo(grid_data); + bool system_grid = grid_data.has(GRID_IS_SYSTEM_GRID_VALUE); + + // need to call through sInstance, as it's called from onSelectServer, which + // is static. + sInstance->childSetVisible("create_new_account_text", system_grid); + sInstance->childSetVisible("forgot_password_text", system_grid); +} diff --git a/indra/newview/llpanellogin.h b/indra/newview/llpanellogin.h index 1fdc3a9361..aa6884ea97 100644 --- a/indra/newview/llpanellogin.h +++ b/indra/newview/llpanellogin.h @@ -41,6 +41,8 @@ class LLLineEditor; class LLUIImage; class LLPanelLoginListener; +class LLSLURL; +class LLCredential; class LLPanelLogin: public LLPanel, @@ -65,20 +67,15 @@ public: void (*callback)(S32 option, void* user_data), void* callback_data); - // Remember password checkbox is set via gSavedSettings "RememberPassword" - static void setFields(const std::string& firstname, const std::string& lastname, - const std::string& password); + static void setFields(LLPointer<LLCredential> credential, BOOL remember); - static void addServer(const std::string& server, S32 domain_name); - static void refreshLocation( bool force_visible ); - static void updateLocationUI(); - - static void getFields(std::string *firstname, std::string *lastname, - std::string *password); + static void getFields(LLPointer<LLCredential>& credential, BOOL& remember); static BOOL isGridComboDirty(); - static void getLocation(std::string &location); - + static BOOL areCredentialFieldsDirty(); + static void setLocation(const LLSLURL& slurl); + + static void updateLocationCombo(bool force_visible); // simply update the combo box static void closePanel(); void setSiteIsAlive( bool alive ); @@ -86,10 +83,10 @@ public: static void loadLoginPage(); static void giveFocus(); static void setAlwaysRefresh(bool refresh); - static void mungePassword(LLUICtrl* caller, void* user_data); // inherited from LLViewerMediaObserver /*virtual*/ void handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event); + static void updateServer(); // update the combo box, change the login page to the new server, clear the combo private: friend class LLPanelLoginListener; @@ -103,6 +100,10 @@ private: static void onPassKey(LLLineEditor* caller, void* user_data); static void onSelectServer(LLUICtrl*, void*); static void onServerComboLostFocus(LLFocusableElement*); + static void updateServerCombo(); + static void updateStartSLURL(); + + static void updateLoginPanelLinks(); private: LLPointer<LLUIImage> mLogoImage; @@ -111,8 +112,7 @@ private: void (*mCallback)(S32 option, void *userdata); void* mCallbackData; - std::string mIncomingPassword; - std::string mMungedPassword; + BOOL mPasswordModified; static LLPanelLogin* sInstance; static BOOL sCapslockDidNotification; diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index 1895993a8e..9eece81861 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -34,16 +34,19 @@ #include "llpanelmaininventory.h" #include "llagent.h" +#include "llavataractions.h" #include "lldndbutton.h" #include "lleconomy.h" #include "llfilepicker.h" #include "llfloaterinventory.h" #include "llinventorybridge.h" #include "llinventoryfunctions.h" +#include "llinventorymodelbackgroundfetch.h" #include "llinventorypanel.h" #include "llfiltereditor.h" #include "llfloaterreg.h" #include "llpreviewtexture.h" +#include "llresmgr.h" #include "llscrollcontainer.h" #include "llsdserialize.h" #include "llspinctrl.h" @@ -114,10 +117,11 @@ LLPanelMainInventory::LLPanelMainInventory() mCommitCallbackRegistrar.add("Inventory.ShowFilters", boost::bind(&LLPanelMainInventory::toggleFindOptions, this)); mCommitCallbackRegistrar.add("Inventory.ResetFilters", boost::bind(&LLPanelMainInventory::resetFilters, this)); mCommitCallbackRegistrar.add("Inventory.SetSortBy", boost::bind(&LLPanelMainInventory::setSortBy, this, _2)); + mCommitCallbackRegistrar.add("Inventory.Share", boost::bind(&LLAvatarActions::shareWithAvatars)); // Controls // *TODO: Just use persistant settings for each of these - U32 sort_order = gSavedSettings.getU32("InventorySortOrder"); + U32 sort_order = gSavedSettings.getU32(LLInventoryPanel::DEFAULT_SORT_ORDER); BOOL sort_by_name = ! ( sort_order & LLInventoryFilter::SO_DATE ); BOOL sort_folders_by_name = ( sort_order & LLInventoryFilter::SO_FOLDERS_BY_NAME ); BOOL sort_system_folders_to_top = ( sort_order & LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP ); @@ -145,7 +149,7 @@ BOOL LLPanelMainInventory::postBuild() if (mActivePanel) { // "All Items" is the previous only view, so it gets the InventorySortOrder - mActivePanel->setSortOrder(gSavedSettings.getU32("InventorySortOrder")); + mActivePanel->setSortOrder(gSavedSettings.getU32(LLInventoryPanel::DEFAULT_SORT_ORDER)); mActivePanel->getFilter()->markDefault(); mActivePanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState); mActivePanel->setSelectCallback(boost::bind(&LLPanelMainInventory::onSelectionChange, this, mActivePanel, _1, _2)); @@ -163,7 +167,7 @@ BOOL LLPanelMainInventory::postBuild() // Now load the stored settings from disk, if available. std::ostringstream filterSaveName; filterSaveName << gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, FILTERS_FILENAME); - llinfos << "LLPanelMainInventory::init: reading from " << filterSaveName << llendl; + llinfos << "LLPanelMainInventory::init: reading from " << filterSaveName.str() << llendl; llifstream file(filterSaveName.str()); LLSD savedFilterState; if (file.is_open()) @@ -418,12 +422,10 @@ void LLPanelMainInventory::onFilterEdit(const std::string& search_string ) return; } - gInventory.startBackgroundFetch(); + LLInventoryModelBackgroundFetch::instance().start(); - std::string uppercase_search_string = search_string; - LLStringUtil::toUpper(uppercase_search_string); - mFilterSubString = uppercase_search_string; - if (mActivePanel->getFilterSubString().empty() && uppercase_search_string.empty()) + mFilterSubString = search_string; + if (mActivePanel->getFilterSubString().empty() && mFilterSubString.empty()) { // current filter and new filter empty, do nothing return; @@ -437,7 +439,7 @@ void LLPanelMainInventory::onFilterEdit(const std::string& search_string ) } // set new filter string - mActivePanel->setFilterSubString(mFilterSubString); + setFilterSubString(mFilterSubString); } @@ -490,6 +492,10 @@ void LLPanelMainInventory::onFilterSelected() { return; } + + BOOL recent_active = ("Recent Items" == mActivePanel->getName()); + childSetVisible("add_btn_panel", !recent_active); + setFilterSubString(mFilterSubString); LLInventoryFilter* filter = mActivePanel->getFilter(); LLFloaterInventoryFinder *finder = getFinder(); @@ -500,7 +506,7 @@ void LLPanelMainInventory::onFilterSelected() if (filter->isActive()) { // If our filter is active we may be the first thing requiring a fetch so we better start it here. - gInventory.startBackgroundFetch(); + LLInventoryModelBackgroundFetch::instance().start(); } setFilterTextFromFilter(); } @@ -540,7 +546,7 @@ BOOL LLPanelMainInventory::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, // virtual void LLPanelMainInventory::changed(U32) { - // empty, but must have this defined for abstract base class. + updateItemcountText(); } @@ -552,6 +558,34 @@ void LLPanelMainInventory::draw() mFilterEditor->setText(mFilterSubString); } LLPanel::draw(); + updateItemcountText(); +} + +void LLPanelMainInventory::updateItemcountText() +{ + LLLocale locale(LLLocale::USER_LOCALE); + std::string item_count_string; + LLResMgr::getInstance()->getIntegerString(item_count_string, gInventory.getItemCount()); + + LLStringUtil::format_map_t string_args; + string_args["[ITEM_COUNT]"] = item_count_string; + string_args["[FILTER]"] = getFilterText(); + + std::string text = ""; + + if (LLInventoryModelBackgroundFetch::instance().backgroundFetchActive()) + { + text = getString("ItemcountFetching", string_args); + } + else if (LLInventoryModelBackgroundFetch::instance().isEverythingFetched()) + { + text = getString("ItemcountCompleted", string_args); + } + else + { + text = getString("ItemcountUnknown"); + } + childSetText("ItemcountText",text); } void LLPanelMainInventory::setFilterTextFromFilter() @@ -570,10 +604,10 @@ void LLPanelMainInventory::toggleFindOptions() finder->openFloater(); LLFloater* parent_floater = gFloaterView->getParentFloater(this); - if (parent_floater) // Seraph: Fix this, shouldn't be null even for sidepanel + if (parent_floater) parent_floater->addDependentFloater(mFinderHandle); // start background fetch of folders - gInventory.startBackgroundFetch(); + LLInventoryModelBackgroundFetch::instance().start(); } else { @@ -866,14 +900,12 @@ void LLFloaterInventoryFinder::selectNoTypes(void* user_data) void LLPanelMainInventory::initListCommandsHandlers() { - mListCommands = getChild<LLPanel>("bottom_panel"); - - mListCommands->childSetAction("options_gear_btn", boost::bind(&LLPanelMainInventory::onGearButtonClick, this)); - mListCommands->childSetAction("trash_btn", boost::bind(&LLPanelMainInventory::onTrashButtonClick, this)); - mListCommands->childSetAction("add_btn", boost::bind(&LLPanelMainInventory::onAddButtonClick, this)); + childSetAction("options_gear_btn", boost::bind(&LLPanelMainInventory::onGearButtonClick, this)); + childSetAction("trash_btn", boost::bind(&LLPanelMainInventory::onTrashButtonClick, this)); + childSetAction("add_btn", boost::bind(&LLPanelMainInventory::onAddButtonClick, this)); - LLDragAndDropButton* trash_btn = mListCommands->getChild<LLDragAndDropButton>("trash_btn"); - trash_btn->setDragAndDropHandler(boost::bind(&LLPanelMainInventory::handleDragAndDropToTrash, this + mTrashButton = getChild<LLDragAndDropButton>("trash_btn"); + mTrashButton->setDragAndDropHandler(boost::bind(&LLPanelMainInventory::handleDragAndDropToTrash, this , _4 // BOOL drop , _5 // EDragAndDropType cargo_type , _7 // EAcceptance* accept @@ -889,7 +921,7 @@ void LLPanelMainInventory::updateListCommands() { bool trash_enabled = isActionEnabled("delete"); - mListCommands->childSetEnabled("trash_btn", trash_enabled); + mTrashButton->setEnabled(trash_enabled); } void LLPanelMainInventory::onGearButtonClick() @@ -1003,7 +1035,10 @@ void LLPanelMainInventory::onCustomAction(const LLSD& userdata) } const LLUUID item_id = current_item->getListener()->getUUID(); LLViewerInventoryItem *item = gInventory.getItem(item_id); - item->regenerateLink(); + if (item) + { + item->regenerateLink(); + } active_panel->setSelection(item_id, TAKE_FOCUS_NO); } if (command_name == "find_original") @@ -1013,7 +1048,7 @@ void LLPanelMainInventory::onCustomAction(const LLSD& userdata) { return; } - current_item->getListener()->performAction(getActivePanel()->getRootFolder(), getActivePanel()->getModel(), "goto"); + current_item->getListener()->performAction(getActivePanel()->getModel(), "goto"); } if (command_name == "find_links") @@ -1058,19 +1093,18 @@ BOOL LLPanelMainInventory::isActionEnabled(const LLSD& userdata) if (command_name == "delete") { BOOL can_delete = FALSE; - LLFolderView *folder = getActivePanel()->getRootFolder(); - if (folder) + LLFolderView* root = getActivePanel()->getRootFolder(); + if (root) { can_delete = TRUE; - std::set<LLUUID> selection_set; - folder->getSelectionList(selection_set); + std::set<LLUUID> selection_set = root->getSelectionList(); if (selection_set.empty()) return FALSE; for (std::set<LLUUID>::iterator iter = selection_set.begin(); iter != selection_set.end(); ++iter) { const LLUUID &item_id = (*iter); - LLFolderViewItem *item = folder->getItemByID(item_id); + LLFolderViewItem *item = root->getItemByID(item_id); const LLFolderViewEventListener *listener = item->getListener(); llassert(listener); if (!listener) return FALSE; @@ -1153,7 +1187,7 @@ void LLPanelMainInventory::setUploadCostIfNeeded() LLMenuItemBranchGL* upload_menu = mMenuAdd->findChild<LLMenuItemBranchGL>("upload"); if(upload_menu) { - S32 upload_cost = -1;//LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(); + S32 upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(); std::string cost_str; // getPriceUpload() returns -1 if no data available yet. diff --git a/indra/newview/llpanelmaininventory.h b/indra/newview/llpanelmaininventory.h index d9ea0da2da..82b72ac224 100644 --- a/indra/newview/llpanelmaininventory.h +++ b/indra/newview/llpanelmaininventory.h @@ -36,6 +36,7 @@ #include "llpanel.h" #include "llinventoryobserver.h" +#include "lldndbutton.h" #include "llfolderview.h" @@ -83,6 +84,7 @@ public: void setSelectCallback(const LLFolderView::signal_t::slot_type& cb); + void onFilterEdit(const std::string& search_string ); protected: // // Misc functions @@ -97,7 +99,7 @@ protected: void onClearSearch(); static void onFoldersByName(void *user_data); static BOOL checkFoldersByName(void *user_data); - void onFilterEdit(const std::string& search_string ); + static BOOL incrementalFind(LLFolderViewItem* first_item, const char *find_text, BOOL backward); void onFilterSelected(); @@ -113,7 +115,8 @@ protected: void setSortBy(const LLSD& userdata); void saveTexture(const LLSD& userdata); bool isSaveTextureEnabled(const LLSD& userdata); - + void updateItemcountText(); + private: LLFloaterInventoryFinder* getFinder(); @@ -144,7 +147,7 @@ protected: */ void setUploadCostIfNeeded(); private: - LLPanel* mListCommands; + LLDragAndDropButton* mTrashButton; LLMenuGL* mMenuGearDefault; LLMenuGL* mMenuAdd; diff --git a/indra/newview/llpanelme.cpp b/indra/newview/llpanelme.cpp index a68552a91e..3f620869e0 100644 --- a/indra/newview/llpanelme.cpp +++ b/indra/newview/llpanelme.cpp @@ -36,11 +36,13 @@ #include "llavatarconstants.h" #include "llpanelme.h" #include "llagent.h" +#include "llagentcamera.h" #include "llagentwearables.h" #include "lliconctrl.h" #include "llsidetray.h" #include "lltabcontainer.h" #include "lltexturectrl.h" +#include "llviewercontrol.h" #define PICKER_SECOND_LIFE "2nd_life_pic" #define PICKER_FIRST_LIFE "real_world_pic" @@ -61,7 +63,6 @@ BOOL LLPanelMe::postBuild() LLPanelProfile::postBuild(); getTabContainer()[PANEL_PROFILE]->childSetAction("edit_profile_btn", boost::bind(&LLPanelMe::onEditProfileClicked, this), this); - getTabContainer()[PANEL_PROFILE]->childSetAction("edit_appearance_btn", boost::bind(&LLPanelMe::onEditAppearanceClicked, this), this); return TRUE; } @@ -70,18 +71,16 @@ void LLPanelMe::onOpen(const LLSD& key) { LLPanelProfile::onOpen(key); - if(key.isUndefined() || key.has("edit_my_profile")) + // Force Edit My Profile if this is the first time when user is opening Me Panel (EXT-5068) + bool opened = gSavedSettings.getBOOL("MePanelOpened"); + // In some cases Side Tray my call onOpen() twice, check getCollapsed() to be sure this + // is the last time onOpen() is called + if( !opened && !LLSideTray::getInstance()->getCollapsed() ) { - // Open Edit My Profile panel by default (through Side Tray -> My Profile) (EXT-4823) buildEditPanel(); openPanel(mEditPanel, getAvatarId()); - } - else if(mEditPanel) - { - // When opening Me Panel through Side Tray LLPanelMe::onOpen() is called twice. - // First time key can be undefined and second time - key may contain some data. - // Lets close Edit Panel if key does contain some data on second call. - closePanel(mEditPanel); + + gSavedSettings.setBOOL("MePanelOpened", true); } } @@ -141,14 +140,6 @@ void LLPanelMe::onEditProfileClicked() togglePanel(mEditPanel, getAvatarId()); // open } -void LLPanelMe::onEditAppearanceClicked() -{ - if (gAgentWearables.areWearablesLoaded()) - { - gAgent.changeCameraToCustomizeAvatar(); - } -} - void LLPanelMe::onSaveChangesClicked() { LLAvatarData data = LLAvatarData(); diff --git a/indra/newview/llpanelme.h b/indra/newview/llpanelme.h index 1325192bbf..f2b38de3d6 100644 --- a/indra/newview/llpanelme.h +++ b/indra/newview/llpanelme.h @@ -63,7 +63,6 @@ private: void buildEditPanel(); void onEditProfileClicked(); - void onEditAppearanceClicked(); void onSaveChangesClicked(); void onCancelClicked(); diff --git a/indra/newview/llpanelnearbymedia.cpp b/indra/newview/llpanelnearbymedia.cpp new file mode 100644 index 0000000000..6411cd802d --- /dev/null +++ b/indra/newview/llpanelnearbymedia.cpp @@ -0,0 +1,1243 @@ +/** + * @file llpanelnearbymedia.cpp + * @brief Management interface for muting and controlling nearby media + * + * $LicenseInfo:firstyear=2005&license=viewergpl$ + * + * Copyright (c) 2005-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llpanelnearbymedia.h" + +#include "llaudioengine.h" +#include "llcheckboxctrl.h" +#include "llcombobox.h" +#include "llresizebar.h" +#include "llresizehandle.h" +#include "llscrolllistctrl.h" +#include "llscrolllistitem.h" +#include "llscrolllistcell.h" +#include "llslider.h" +#include "llsliderctrl.h" +#include "llagent.h" +#include "llagentui.h" +#include "llbutton.h" +#include "lltextbox.h" +#include "llviewermedia.h" +#include "llviewerparcelmedia.h" +#include "llviewerregion.h" +#include "llviewermediafocus.h" +#include "llviewerparcelmgr.h" +#include "llparcel.h" +#include "llpluginclassmedia.h" +#include "llvovolume.h" +#include "llstatusbar.h" +#include "llsdutil.h" + +#include "llfloaterreg.h" +#include "llfloaterpreference.h" // for the gear icon +#include "lltabcontainer.h" + +#include <stringize.h> + +extern LLControlGroup gSavedSettings; + +static const LLUUID PARCEL_MEDIA_LIST_ITEM_UUID = LLUUID("CAB5920F-E484-4233-8621-384CF373A321"); +static const LLUUID PARCEL_AUDIO_LIST_ITEM_UUID = LLUUID("DF4B020D-8A24-4B95-AB5D-CA970D694822"); + +// +// LLPanelNearByMedia +// + + +LLPanelNearByMedia::LLPanelNearByMedia() +: mMediaList(NULL), + mEnableAllCtrl(NULL), + mAllMediaDisabled(false), + mDebugInfoVisible(false), + mParcelMediaItem(NULL), + mParcelAudioItem(NULL) +{ + mHoverTimer.stop(); + + mParcelAudioAutoStart = gSavedSettings.getBOOL(LLViewerMedia::AUTO_PLAY_MEDIA_SETTING) && + gSavedSettings.getBOOL("MediaTentativeAutoPlay"); + + gSavedSettings.getControl(LLViewerMedia::AUTO_PLAY_MEDIA_SETTING)->getSignal()->connect(boost::bind(&LLPanelNearByMedia::handleMediaAutoPlayChanged, this, _2)); + + mCommitCallbackRegistrar.add("MediaListCtrl.EnableAll", boost::bind(&LLPanelNearByMedia::onClickEnableAll, this)); + mCommitCallbackRegistrar.add("MediaListCtrl.DisableAll", boost::bind(&LLPanelNearByMedia::onClickDisableAll, this)); + mCommitCallbackRegistrar.add("MediaListCtrl.GoMediaPrefs", boost::bind(&LLPanelNearByMedia::onAdvancedButtonClick, this)); + mCommitCallbackRegistrar.add("MediaListCtrl.MoreLess", boost::bind(&LLPanelNearByMedia::onMoreLess, this)); + mCommitCallbackRegistrar.add("SelectedMediaCtrl.Stop", boost::bind(&LLPanelNearByMedia::onClickSelectedMediaStop, this)); + mCommitCallbackRegistrar.add("SelectedMediaCtrl.Play", boost::bind(&LLPanelNearByMedia::onClickSelectedMediaPlay, this)); + mCommitCallbackRegistrar.add("SelectedMediaCtrl.Pause", boost::bind(&LLPanelNearByMedia::onClickSelectedMediaPause, this)); + mCommitCallbackRegistrar.add("SelectedMediaCtrl.Mute", boost::bind(&LLPanelNearByMedia::onClickSelectedMediaMute, this)); + mCommitCallbackRegistrar.add("SelectedMediaCtrl.Volume", boost::bind(&LLPanelNearByMedia::onCommitSelectedMediaVolume, this)); + mCommitCallbackRegistrar.add("SelectedMediaCtrl.Zoom", boost::bind(&LLPanelNearByMedia::onClickSelectedMediaZoom, this)); + mCommitCallbackRegistrar.add("SelectedMediaCtrl.Unzoom", boost::bind(&LLPanelNearByMedia::onClickSelectedMediaUnzoom, this)); + + LLUICtrlFactory::instance().buildPanel(this, "panel_nearby_media.xml"); +} + +LLPanelNearByMedia::~LLPanelNearByMedia() +{ +} + +BOOL LLPanelNearByMedia::postBuild() +{ + LLPanel::postBuild(); + + const S32 RESIZE_BAR_THICKNESS = 6; + LLResizeBar::Params p; + p.rect = LLRect(0, RESIZE_BAR_THICKNESS, getRect().getWidth(), 0); + p.name = "resizebar_bottom"; + p.min_size = getRect().getHeight(); + p.side = LLResizeBar::BOTTOM; + p.resizing_view = this; + addChild( LLUICtrlFactory::create<LLResizeBar>(p) ); + + p.rect = LLRect( 0, getRect().getHeight(), RESIZE_BAR_THICKNESS, 0); + p.name = "resizebar_left"; + p.min_size = getRect().getWidth(); + p.side = LLResizeBar::LEFT; + addChild( LLUICtrlFactory::create<LLResizeBar>(p) ); + + LLResizeHandle::Params resize_handle_p; + resize_handle_p.rect = LLRect( 0, RESIZE_HANDLE_HEIGHT, RESIZE_HANDLE_WIDTH, 0 ); + resize_handle_p.mouse_opaque(false); + resize_handle_p.min_width(getRect().getWidth()); + resize_handle_p.min_height(getRect().getHeight()); + resize_handle_p.corner(LLResizeHandle::LEFT_BOTTOM); + addChild(LLUICtrlFactory::create<LLResizeHandle>(resize_handle_p)); + + mNearbyMediaPanel = getChild<LLUICtrl>("nearby_media_panel"); + mMediaList = getChild<LLScrollListCtrl>("media_list"); + mEnableAllCtrl = getChild<LLUICtrl>("all_nearby_media_enable_btn"); + mDisableAllCtrl = getChild<LLUICtrl>("all_nearby_media_disable_btn"); + mShowCtrl = getChild<LLComboBox>("show_combo"); + + // Dynamic (selection-dependent) controls + mStopCtrl = getChild<LLUICtrl>("stop"); + mPlayCtrl = getChild<LLUICtrl>("play"); + mPauseCtrl = getChild<LLUICtrl>("pause"); + mMuteCtrl = getChild<LLUICtrl>("mute"); + mVolumeSliderCtrl = getChild<LLUICtrl>("volume_slider_ctrl"); + mZoomCtrl = getChild<LLUICtrl>("zoom"); + mUnzoomCtrl = getChild<LLUICtrl>("unzoom"); + mVolumeSlider = getChild<LLSlider>("volume_slider"); + mMuteBtn = getChild<LLButton>("mute_btn"); + + mEmptyNameString = getString("empty_item_text"); + mParcelMediaName = getString("parcel_media_name"); + mParcelAudioName = getString("parcel_audio_name"); + mPlayingString = getString("playing_suffix"); + + mMediaList->setDoubleClickCallback(onZoomMedia, this); + mMediaList->sortByColumnIndex(PROXIMITY_COLUMN, TRUE); + mMediaList->sortByColumnIndex(VISIBILITY_COLUMN, FALSE); + + refreshList(); + updateControls(); + updateColumns(); + + LLView* minimized_controls = getChildView("minimized_controls"); + mMoreRect = getRect(); + mLessRect = getRect(); + mLessRect.mBottom = minimized_controls->getRect().mBottom; + + getChild<LLUICtrl>("more_btn")->setVisible(false); + onMoreLess(); + + return TRUE; +} + +void LLPanelNearByMedia::handleMediaAutoPlayChanged(const LLSD& newvalue) +{ + // update mParcelAudioAutoStart if AUTO_PLAY_MEDIA_SETTING changes + mParcelAudioAutoStart = gSavedSettings.getBOOL(LLViewerMedia::AUTO_PLAY_MEDIA_SETTING) && + gSavedSettings.getBOOL("MediaTentativeAutoPlay"); +} + +/*virtual*/ +void LLPanelNearByMedia::onMouseEnter(S32 x, S32 y, MASK mask) +{ + mHoverTimer.stop(); + LLPanel::onMouseEnter(x,y,mask); +} + + +/*virtual*/ +void LLPanelNearByMedia::onMouseLeave(S32 x, S32 y, MASK mask) +{ + mHoverTimer.start(); + LLPanel::onMouseLeave(x,y,mask); +} + +/*virtual*/ +void LLPanelNearByMedia::onTopLost() +{ + setVisible(FALSE); +} + + +/*virtual*/ +void LLPanelNearByMedia::handleVisibilityChange ( BOOL new_visibility ) +{ + if (new_visibility) + { + mHoverTimer.start(); // timer will be stopped when mouse hovers over panel + } + else + { + mHoverTimer.stop(); + } +} + +/*virtual*/ +void LLPanelNearByMedia::reshape(S32 width, S32 height, BOOL called_from_parent) +{ + LLPanel::reshape(width, height, called_from_parent); + + LLButton* more_less_btn = getChild<LLButton>("more_less_btn"); + if (more_less_btn->getValue().asBoolean()) + { + mMoreRect = getRect(); + } + +} + +const F32 AUTO_CLOSE_FADE_TIME_START= 4.0f; +const F32 AUTO_CLOSE_FADE_TIME_END = 5.0f; + +/*virtual*/ +void LLPanelNearByMedia::draw() +{ + // keep bottom of panel on screen + LLRect screen_rect = calcScreenRect(); + if (screen_rect.mBottom < 0) + { + LLRect new_rect = getRect(); + new_rect.mBottom += 0 - screen_rect.mBottom; + setShape(new_rect); + } + + refreshList(); + updateControls(); + + F32 alpha = mHoverTimer.getStarted() + ? clamp_rescale(mHoverTimer.getElapsedTimeF32(), AUTO_CLOSE_FADE_TIME_START, AUTO_CLOSE_FADE_TIME_END, 1.f, 0.f) + : 1.0f; + LLViewDrawContext context(alpha); + + LLPanel::draw(); + + if (alpha == 0.f) + { + setVisible(false); + } +} + +/*virtual*/ +BOOL LLPanelNearByMedia::handleHover(S32 x, S32 y, MASK mask) +{ + LLPanel::handleHover(x, y, mask); + + // If we are hovering over this panel, make sure to clear any hovered media + // ID. Note that the more general solution would be to clear this ID when + // the mouse leaves the in-scene view, but that proved to be problematic. + // See EXT-5517 + LLViewerMediaFocus::getInstance()->clearHover(); + + // Always handle + return true; +} + +bool LLPanelNearByMedia::getParcelAudioAutoStart() +{ + return mParcelAudioAutoStart; +} + +LLScrollListItem* LLPanelNearByMedia::addListItem(const LLUUID &id) +{ + if (NULL == mMediaList) return NULL; + + // Just set up the columns -- the values will be filled in by updateListItem(). + + LLSD row; + row["id"] = id; + + LLSD &columns = row["columns"]; + + columns[CHECKBOX_COLUMN]["column"] = "media_checkbox_ctrl"; + columns[CHECKBOX_COLUMN]["type"] = "checkbox"; + //if(mDebugInfoVisible) + { + columns[PROXIMITY_COLUMN]["column"] = "media_proximity"; + columns[PROXIMITY_COLUMN]["value"] = ""; + columns[VISIBILITY_COLUMN]["column"] = "media_visibility"; + columns[VISIBILITY_COLUMN]["value"] = ""; + columns[CLASS_COLUMN]["column"] = "media_class"; + columns[CLASS_COLUMN]["type"] = "text"; + columns[CLASS_COLUMN]["value"] = ""; + } + columns[NAME_COLUMN]["column"] = "media_name"; + columns[NAME_COLUMN]["type"] = "text"; + columns[NAME_COLUMN]["value"] = ""; + //if(mDebugInfoVisible) + { + columns[DEBUG_COLUMN]["column"] = "media_debug"; + columns[DEBUG_COLUMN]["type"] = "text"; + columns[DEBUG_COLUMN]["value"] = ""; + } + + LLScrollListItem* new_item = mMediaList->addElement(row); + if (NULL != new_item) + { + LLScrollListCheck* scroll_list_check = dynamic_cast<LLScrollListCheck*>(new_item->getColumn(CHECKBOX_COLUMN)); + if (scroll_list_check) + { + LLCheckBoxCtrl *check = scroll_list_check->getCheckBox(); + check->setCommitCallback(boost::bind(&LLPanelNearByMedia::onCheckItem, this, _1, id)); + } + } + return new_item; +} + +void LLPanelNearByMedia::updateListItem(LLScrollListItem* item, LLViewerMediaImpl* impl) +{ + std::string item_name; + std::string item_tooltip; + std::string debug_str; + LLPanelNearByMedia::MediaClass media_class = MEDIA_CLASS_ALL; + + getNameAndUrlHelper(impl, item_name, item_tooltip, mEmptyNameString); + // Focused + if (impl->hasFocus()) + { + media_class = MEDIA_CLASS_FOCUSED; + } + // Is attached to another avatar? + else if (impl->isAttachedToAnotherAvatar()) + { + media_class = MEDIA_CLASS_ON_OTHERS; + } + // Outside agent parcel + else if (!impl->isInAgentParcel()) + { + media_class = MEDIA_CLASS_OUTSIDE_PARCEL; + } + else { + // inside parcel + media_class = MEDIA_CLASS_WITHIN_PARCEL; + } + + if(mDebugInfoVisible) + { + debug_str += llformat("%g/", (float)impl->getInterest()); + + // proximity distance is actually distance squared -- display it as straight distance. + debug_str += llformat("%g/", fsqrtf(impl->getProximityDistance())); + + // s += llformat("%g/", (float)impl->getCPUUsage()); + // s += llformat("%g/", (float)impl->getApproximateTextureInterest()); + debug_str += llformat("%g/", (float)(NULL == impl->getSomeObject()) ? 0.0 : impl->getSomeObject()->getPixelArea()); + + debug_str += LLPluginClassMedia::priorityToString(impl->getPriority()); + + if(impl->hasMedia()) + { + debug_str += '@'; + } + else if(impl->isPlayable()) + { + debug_str += '+'; + } + else if(impl->isForcedUnloaded()) + { + debug_str += '!'; + } + } + + updateListItem(item, + item_name, + item_tooltip, + impl->getProximity(), + impl->isMediaDisabled(), + impl->hasMedia(), + impl->isMediaTimeBased() && impl->isMediaPlaying(), + media_class, + debug_str); +} + +void LLPanelNearByMedia::updateListItem(LLScrollListItem* item, + const std::string &item_name, + const std::string &item_tooltip, + S32 proximity, + bool is_disabled, + bool has_media, + bool is_time_based_and_playing, + LLPanelNearByMedia::MediaClass media_class, + const std::string &debug_str) +{ + LLScrollListCell* cell = item->getColumn(PROXIMITY_COLUMN); + if(cell) + { + // since we are forced to sort by text, encode sort order as string + std::string proximity_string = STRINGIZE(proximity); + std::string old_proximity_string = cell->getValue().asString(); + if(proximity_string != old_proximity_string) + { + cell->setValue(proximity_string); + mMediaList->setNeedsSort(true); + } + } + + cell = item->getColumn(CHECKBOX_COLUMN); + if(cell) + { + cell->setValue(!is_disabled); + } + + cell = item->getColumn(VISIBILITY_COLUMN); + if(cell) + { + S32 old_visibility = cell->getValue(); + // *HACK ALERT: force ordering of Media before Audio before the rest of the list + S32 new_visibility = + item->getUUID() == PARCEL_MEDIA_LIST_ITEM_UUID ? 3 + : item->getUUID() == PARCEL_AUDIO_LIST_ITEM_UUID ? 2 + : (has_media) ? 1 + : ((is_disabled) ? 0 + : -1); + cell->setValue(STRINGIZE(new_visibility)); + if (new_visibility != old_visibility) + { + mMediaList->setNeedsSort(true); + } + } + + cell = item->getColumn(NAME_COLUMN); + if(cell) + { + std::string name = item_name; + std::string old_name = cell->getValue().asString(); + if (has_media) + { + name += " " + mPlayingString; + } + if (name != old_name) + { + cell->setValue(name); + } + cell->setToolTip(item_tooltip); + + // *TODO: Make these font styles/colors configurable via XUI + U8 font_style = LLFontGL::NORMAL; + LLColor4 cell_color = LLColor4::white; + + // Only colorize by class in debug + if (mDebugInfoVisible) + { + switch (media_class) { + case MEDIA_CLASS_FOCUSED: + cell_color = LLColor4::yellow; + break; + case MEDIA_CLASS_ON_OTHERS: + cell_color = LLColor4::red; + break; + case MEDIA_CLASS_OUTSIDE_PARCEL: + cell_color = LLColor4::orange; + break; + case MEDIA_CLASS_WITHIN_PARCEL: + default: + break; + } + } + if (is_disabled) + { + if (mDebugInfoVisible) + { + font_style |= LLFontGL::ITALIC; + cell_color = LLColor4::black; + } + else { + // Dim it if it is disabled + cell_color.setAlpha(0.25); + } + } + // Dim it if it isn't "showing" + else if (!has_media) + { + cell_color.setAlpha(0.25); + } + // Bold it if it is time-based media and it is playing + else if (is_time_based_and_playing) + { + if (mDebugInfoVisible) font_style |= LLFontGL::BOLD; + } + cell->setColor(cell_color); + LLScrollListText *text_cell = dynamic_cast<LLScrollListText*> (cell); + if (text_cell) + { + text_cell->setFontStyle(font_style); + } + } + + cell = item->getColumn(CLASS_COLUMN); + if(cell) + { + // TODO: clean this up! + cell->setValue(STRINGIZE(media_class)); + } + + if(mDebugInfoVisible) + { + cell = item->getColumn(DEBUG_COLUMN); + if(cell) + { + cell->setValue(debug_str); + } + } +} + +void LLPanelNearByMedia::removeListItem(const LLUUID &id) +{ + if (NULL == mMediaList) return; + + mMediaList->deleteSingleItem(mMediaList->getItemIndex(id)); +} + +void LLPanelNearByMedia::refreshParcelItems() +{ + // + // First add/remove the "fake" items Parcel Media and Parcel Audio. + // These items will have special UUIDs + // PARCEL_MEDIA_LIST_ITEM_UUID + // PARCEL_AUDIO_LIST_ITEM_UUID + // + // Get the filter choice. + const LLSD &choice_llsd = mShowCtrl->getSelectedValue(); + MediaClass choice = (MediaClass)choice_llsd.asInteger(); + // Only show "special parcel items" if "All" or "Within" filter + // (and if media is "enabled") + bool should_include = (choice == MEDIA_CLASS_ALL || choice == MEDIA_CLASS_WITHIN_PARCEL); + + // First Parcel Media: add or remove it as necessary + if (gSavedSettings.getBOOL("AudioStreamingMedia") &&should_include && LLViewerMedia::hasParcelMedia()) + { + // Yes, there is parcel media. + if (NULL == mParcelMediaItem) + { + mParcelMediaItem = addListItem(PARCEL_MEDIA_LIST_ITEM_UUID); + mMediaList->setNeedsSort(true); + } + } + else { + if (NULL != mParcelMediaItem) { + removeListItem(PARCEL_MEDIA_LIST_ITEM_UUID); + mParcelMediaItem = NULL; + mMediaList->setNeedsSort(true); + } + } + + // ... then update it + if (NULL != mParcelMediaItem) + { + std::string name, url, tooltip; + if (!LLViewerParcelMgr::getInstance()->getAgentParcel()->getObscureMedia()) + { + getNameAndUrlHelper(LLViewerParcelMedia::getParcelMedia(), name, url, ""); + if (name.empty() || name == url) + { + tooltip = url; + } + else { + tooltip = name + " : " + url; + } + } + LLViewerMediaImpl *impl = LLViewerParcelMedia::getParcelMedia(); + updateListItem(mParcelMediaItem, + mParcelMediaName, + tooltip, + -2, // Proximity closer than anything else, before Parcel Audio + impl == NULL || impl->isMediaDisabled(), + impl != NULL && !LLViewerParcelMedia::getURL().empty(), + impl != NULL && impl->isMediaTimeBased() && impl->isMediaPlaying(), + MEDIA_CLASS_ALL, + "parcel media"); + } + + // Next Parcel Audio: add or remove it as necessary (don't show if disabled in prefs) + if (should_include && LLViewerMedia::hasParcelAudio() && gSavedSettings.getBOOL("AudioStreamingMusic")) + { + // Yes, there is parcel audio. + if (NULL == mParcelAudioItem) + { + mParcelAudioItem = addListItem(PARCEL_AUDIO_LIST_ITEM_UUID); + mMediaList->setNeedsSort(true); + } + } + else { + if (NULL != mParcelAudioItem) { + removeListItem(PARCEL_AUDIO_LIST_ITEM_UUID); + mParcelAudioItem = NULL; + mMediaList->setNeedsSort(true); + } + } + + // ... then update it + if (NULL != mParcelAudioItem) + { + bool is_playing = LLViewerMedia::isParcelAudioPlaying(); + + std::string url; + if (!LLViewerParcelMgr::getInstance()->getAgentParcel()->getObscureMusic()) + { + url = LLViewerMedia::getParcelAudioURL(); + } + updateListItem(mParcelAudioItem, + mParcelAudioName, + url, + -1, // Proximity after Parcel Media, but closer than anything else + (!is_playing), + is_playing, + is_playing, + MEDIA_CLASS_ALL, + "parcel audio"); + } +} + +void LLPanelNearByMedia::refreshList() +{ + bool all_items_deleted = false; + + if(!mMediaList) + { + // None of this makes any sense if the media list isn't there. + return; + } + + // Check whether the debug column has been shown/hidden. + bool debug_info_visible = gSavedSettings.getBOOL("MediaPerformanceManagerDebug"); + if(debug_info_visible != mDebugInfoVisible) + { + mDebugInfoVisible = debug_info_visible; + + // Clear all items so the list gets regenerated. + mMediaList->deleteAllItems(); + mParcelAudioItem = NULL; + mParcelMediaItem = NULL; + all_items_deleted = true; + + updateColumns(); + } + + refreshParcelItems(); + + // Get the canonical list from LLViewerMedia + LLViewerMedia::impl_list impls = LLViewerMedia::getPriorityList(); + LLViewerMedia::impl_list::iterator priority_iter; + + U32 enabled_count = 0; + U32 disabled_count = 0; + + // iterate over the impl list, creating rows as necessary. + for(priority_iter = impls.begin(); priority_iter != impls.end(); priority_iter++) + { + LLViewerMediaImpl *impl = *priority_iter; + + // If we just emptied out the list, every flag needs to be reset. + if(all_items_deleted) + { + impl->setInNearbyMediaList(false); + } + + if (!impl->isParcelMedia()) + { + LLUUID media_id = impl->getMediaTextureID(); + S32 proximity = impl->getProximity(); + // This is expensive (i.e. a linear search) -- don't use it here. We now use mInNearbyMediaList instead. + //S32 index = mMediaList->getItemIndex(media_id); + if (proximity < 0 || !shouldShow(impl)) + { + if (impl->getInNearbyMediaList()) + { + // There's a row for this impl -- remove it. + removeListItem(media_id); + impl->setInNearbyMediaList(false); + } + } + else + { + if (!impl->getInNearbyMediaList()) + { + // We don't have a row for this impl -- add one. + addListItem(media_id); + impl->setInNearbyMediaList(true); + } + } + // Update counts + if (impl->isMediaDisabled()) + { + disabled_count++; + } + else { + enabled_count++; + } + } + } + mDisableAllCtrl->setEnabled((gSavedSettings.getBOOL("AudioStreamingMusic") || + gSavedSettings.getBOOL("AudioStreamingMedia")) && + (LLViewerMedia::isAnyMediaShowing() || + LLViewerMedia::isParcelMediaPlaying() || + LLViewerMedia::isParcelAudioPlaying())); + + mEnableAllCtrl->setEnabled( (gSavedSettings.getBOOL("AudioStreamingMusic") || + gSavedSettings.getBOOL("AudioStreamingMedia")) && + (disabled_count > 0 || + // parcel media (if we have it, and it isn't playing, enable "start") + (LLViewerMedia::hasParcelMedia() && ! LLViewerMedia::isParcelMediaPlaying()) || + // parcel audio (if we have it, and it isn't playing, enable "start") + (LLViewerMedia::hasParcelAudio() && ! LLViewerMedia::isParcelAudioPlaying()))); + + // Iterate over the rows in the control, updating ones whose impl exists, and deleting ones whose impl has gone away. + std::vector<LLScrollListItem*> items = mMediaList->getAllData(); + + for (std::vector<LLScrollListItem*>::iterator item_it = items.begin(); + item_it != items.end(); + ++item_it) + { + LLScrollListItem* item = (*item_it); + LLUUID row_id = item->getUUID(); + + if (row_id != PARCEL_MEDIA_LIST_ITEM_UUID && + row_id != PARCEL_AUDIO_LIST_ITEM_UUID) + { + LLViewerMediaImpl* impl = LLViewerMedia::getMediaImplFromTextureID(row_id); + if(impl) + { + updateListItem(item, impl); + } + else + { + // This item's impl has been deleted -- remove the row. + // Removing the row won't throw off our iteration, since we have a local copy of the array. + // We just need to make sure we don't access this item after the delete. + removeListItem(row_id); + } + } + } + + // Set the selection to whatever media impl the media focus/hover is on. + // This is an experiment, and can be removed by ifdefing out these 4 lines. + LLUUID media_target = LLViewerMediaFocus::getInstance()->getControlsMediaID(); + if(media_target.notNull()) + { + mMediaList->selectByID(media_target); + } +} + +void LLPanelNearByMedia::updateColumns() +{ + if (!mDebugInfoVisible) + { + if (mMediaList->getColumn(CHECKBOX_COLUMN)) mMediaList->getColumn(VISIBILITY_COLUMN)->setWidth(-1); + if (mMediaList->getColumn(VISIBILITY_COLUMN)) mMediaList->getColumn(VISIBILITY_COLUMN)->setWidth(-1); + if (mMediaList->getColumn(PROXIMITY_COLUMN)) mMediaList->getColumn(PROXIMITY_COLUMN)->setWidth(-1); + if (mMediaList->getColumn(CLASS_COLUMN)) mMediaList->getColumn(CLASS_COLUMN)->setWidth(-1); + if (mMediaList->getColumn(DEBUG_COLUMN)) mMediaList->getColumn(DEBUG_COLUMN)->setWidth(-1); + } + else { + if (mMediaList->getColumn(CHECKBOX_COLUMN)) mMediaList->getColumn(VISIBILITY_COLUMN)->setWidth(20); + if (mMediaList->getColumn(VISIBILITY_COLUMN)) mMediaList->getColumn(VISIBILITY_COLUMN)->setWidth(20); + if (mMediaList->getColumn(PROXIMITY_COLUMN)) mMediaList->getColumn(PROXIMITY_COLUMN)->setWidth(30); + if (mMediaList->getColumn(CLASS_COLUMN)) mMediaList->getColumn(CLASS_COLUMN)->setWidth(20); + if (mMediaList->getColumn(DEBUG_COLUMN)) mMediaList->getColumn(DEBUG_COLUMN)->setWidth(200); + } +} + +void LLPanelNearByMedia::onClickEnableAll() +{ + LLViewerMedia::setAllMediaEnabled(true); +} + +void LLPanelNearByMedia::onClickDisableAll() +{ + LLViewerMedia::setAllMediaEnabled(false); +} + +void LLPanelNearByMedia::onClickEnableParcelMedia() +{ + if ( ! LLViewerMedia::isParcelMediaPlaying() ) + { + LLViewerParcelMedia::play(LLViewerParcelMgr::getInstance()->getAgentParcel()); + } +} + +void LLPanelNearByMedia::onClickDisableParcelMedia() +{ + // This actually unloads the impl, as opposed to "stop"ping the media + LLViewerParcelMedia::stop(); +} + +void LLPanelNearByMedia::onCheckItem(LLUICtrl* ctrl, const LLUUID &row_id) +{ + LLCheckBoxCtrl* check = static_cast<LLCheckBoxCtrl*>(ctrl); + + setDisabled(row_id, ! check->getValue()); +} + +bool LLPanelNearByMedia::setDisabled(const LLUUID &row_id, bool disabled) +{ + if (row_id == PARCEL_AUDIO_LIST_ITEM_UUID) + { + if (disabled) onClickParcelAudioStop(); + else onClickParcelAudioStart(); + return true; + } + else if (row_id == PARCEL_MEDIA_LIST_ITEM_UUID) + { + if (disabled) onClickDisableParcelMedia(); + else onClickEnableParcelMedia(); + return true; + } + else { + LLViewerMediaImpl* impl = LLViewerMedia::getMediaImplFromTextureID(row_id); + if(impl) + { + impl->setDisabled(disabled, true); + return true; + } + } + return false; +} + +//static +void LLPanelNearByMedia::onZoomMedia(void* user_data) +{ + LLPanelNearByMedia* panelp = (LLPanelNearByMedia*)user_data; + LLUUID media_id = panelp->mMediaList->getValue().asUUID(); + + LLViewerMediaFocus::getInstance()->focusZoomOnMedia(media_id); +} + +void LLPanelNearByMedia::onClickParcelMediaPlay() +{ + LLViewerParcelMedia::play(LLViewerParcelMgr::getInstance()->getAgentParcel()); +} + +void LLPanelNearByMedia::onClickParcelMediaStop() +{ + if (LLViewerParcelMedia::getParcelMedia()) + { + // This stops the media playing, as opposed to unloading it like + // LLViewerParcelMedia::stop() does + LLViewerParcelMedia::getParcelMedia()->stop(); + } +} + +void LLPanelNearByMedia::onClickParcelMediaPause() +{ + LLViewerParcelMedia::pause(); +} + +void LLPanelNearByMedia::onClickParcelAudioStart() +{ + // User *explicitly* started the internet stream, so keep the stream + // playing and updated as they cross to other parcels etc. + mParcelAudioAutoStart = true; + + if (!gAudiop) + return; + + gAudiop->startInternetStream(LLViewerMedia::getParcelAudioURL()); +} + +void LLPanelNearByMedia::onClickParcelAudioPlay() +{ + // User *explicitly* started the internet stream, so keep the stream + // playing and updated as they cross to other parcels etc. + mParcelAudioAutoStart = true; + + if (!gAudiop) + return; + + if (LLAudioEngine::AUDIO_PAUSED == gAudiop->isInternetStreamPlaying()) + { + // 'false' means unpause + gAudiop->pauseInternetStream(false); + } + else { + gAudiop->startInternetStream(LLViewerMedia::getParcelAudioURL()); + } +} + +void LLPanelNearByMedia::onClickParcelAudioStop() +{ + // User *explicitly* stopped the internet stream, so don't + // re-start audio when i.e. they move to another parcel, until + // they explicitly start it again. + mParcelAudioAutoStart = false; + + if (!gAudiop) + return; + + gAudiop->stopInternetStream(); +} + +void LLPanelNearByMedia::onClickParcelAudioPause() +{ + if (!gAudiop) + return; + + // 'true' means pause + gAudiop->pauseInternetStream(true); +} + +bool LLPanelNearByMedia::shouldShow(LLViewerMediaImpl* impl) +{ + const LLSD &choice_llsd = mShowCtrl->getSelectedValue(); + MediaClass choice = (MediaClass)choice_llsd.asInteger(); + + switch (choice) + { + case MEDIA_CLASS_ALL: + return true; + break; + case MEDIA_CLASS_WITHIN_PARCEL: + return impl->isInAgentParcel(); + break; + case MEDIA_CLASS_OUTSIDE_PARCEL: + return ! impl->isInAgentParcel(); + break; + case MEDIA_CLASS_ON_OTHERS: + return impl->isAttachedToAnotherAvatar(); + break; + default: + break; + } + return true; +} + +void LLPanelNearByMedia::onAdvancedButtonClick() +{ + // bring up the prefs floater + LLFloaterPreference* prefsfloater = dynamic_cast<LLFloaterPreference*>(LLFloaterReg::showInstance("preferences")); + if (prefsfloater) + { + // grab the 'audio' panel from the preferences floater and + // bring it the front! + LLTabContainer* tabcontainer = prefsfloater->getChild<LLTabContainer>("pref core"); + LLPanel* audiopanel = prefsfloater->getChild<LLPanel>("audio"); + if (tabcontainer && audiopanel) + { + tabcontainer->selectTabPanel(audiopanel); + } + } +} + +void LLPanelNearByMedia::onMoreLess() +{ + bool is_more = getChild<LLUICtrl>("more_btn")->getVisible(); + mNearbyMediaPanel->setVisible(is_more); + + // enable resizing when expanded + getChildView("resizebar_bottom")->setEnabled(is_more); + + LLRect new_rect = is_more ? mMoreRect : mLessRect; + new_rect.translate(getRect().mRight - new_rect.mRight, getRect().mTop - new_rect.mTop); + + setShape(new_rect); + + getChild<LLUICtrl>("more_btn")->setVisible(!is_more); + getChild<LLUICtrl>("less_btn")->setVisible(is_more); +} + +void LLPanelNearByMedia::updateControls() +{ + LLUUID selected_media_id = mMediaList->getValue().asUUID(); + + if (selected_media_id == PARCEL_AUDIO_LIST_ITEM_UUID) + { + if (!LLViewerMedia::hasParcelAudio() || !gSavedSettings.getBOOL("AudioStreamingMusic")) + { + // disable controls if audio streaming music is disabled from preference + showDisabledControls(); + } + else { + showTimeBasedControls(LLViewerMedia::isParcelAudioPlaying(), + false, // include_zoom + false, // is_zoomed + gSavedSettings.getBOOL("MuteMusic"), + gSavedSettings.getF32("AudioLevelMusic") ); + } + } + else if (selected_media_id == PARCEL_MEDIA_LIST_ITEM_UUID) + { + if (!LLViewerMedia::hasParcelMedia() || !gSavedSettings.getBOOL("AudioStreamingMedia")) + { + // disable controls if audio streaming media is disabled from preference + showDisabledControls(); + } + else { + LLViewerMediaImpl* impl = LLViewerParcelMedia::getParcelMedia(); + if (NULL == impl) + { + // Just means it hasn't started yet + showBasicControls(false, false, false, false, 0); + } + else if (impl->isMediaTimeBased()) + { + showTimeBasedControls(impl->isMediaPlaying(), + false, // include_zoom + false, // is_zoomed + impl->getVolume() == 0.0, + impl->getVolume() ); + } + else { + // non-time-based parcel media + showBasicControls(LLViewerMedia::isParcelMediaPlaying(), + false, + false, + impl->getVolume() == 0.0, + impl->getVolume()); + } + } + } + else { + LLViewerMediaImpl* impl = LLViewerMedia::getMediaImplFromTextureID(selected_media_id); + + if (NULL == impl || !gSavedSettings.getBOOL("AudioStreamingMedia")) + { + showDisabledControls(); + } + else { + if (impl->isMediaTimeBased()) + { + showTimeBasedControls(impl->isMediaPlaying(), + ! impl->isParcelMedia(), // include_zoom + LLViewerMediaFocus::getInstance()->isZoomed(), + impl->getVolume() == 0.0, + impl->getVolume()); + } + else { + showBasicControls(!impl->isMediaDisabled(), + ! impl->isParcelMedia(), // include_zoom + LLViewerMediaFocus::getInstance()->isZoomed(), + impl->getVolume() == 0.0, + impl->getVolume()); + } + } + } +} + +void LLPanelNearByMedia::showBasicControls(bool playing, bool include_zoom, bool is_zoomed, bool muted, F32 volume) +{ + mStopCtrl->setVisible(playing); + mPlayCtrl->setVisible(!playing); + mPauseCtrl->setVisible(false); + mVolumeSliderCtrl->setVisible(true); + mMuteCtrl->setVisible(true); + mMuteBtn->setValue(muted); + mVolumeSlider->setValue(volume); + mZoomCtrl->setVisible(include_zoom && !is_zoomed); + mUnzoomCtrl->setVisible(include_zoom && is_zoomed); + mStopCtrl->setEnabled(true); + mZoomCtrl->setEnabled(true); +} + +void LLPanelNearByMedia::showTimeBasedControls(bool playing, bool include_zoom, bool is_zoomed, bool muted, F32 volume) +{ + mStopCtrl->setVisible(true); + mPlayCtrl->setVisible(!playing); + mPauseCtrl->setVisible(playing); + mMuteCtrl->setVisible(true); + mVolumeSliderCtrl->setVisible(true); + mZoomCtrl->setVisible(include_zoom); + mZoomCtrl->setVisible(include_zoom && !is_zoomed); + mUnzoomCtrl->setVisible(include_zoom && is_zoomed); + mStopCtrl->setEnabled(true); + mZoomCtrl->setEnabled(true); + mMuteBtn->setValue(muted); + mVolumeSlider->setValue(volume); +} + +void LLPanelNearByMedia::showDisabledControls() +{ + mStopCtrl->setVisible(true); + mPlayCtrl->setVisible(false); + mPauseCtrl->setVisible(false); + mMuteCtrl->setVisible(false); + mVolumeSliderCtrl->setVisible(false); + mZoomCtrl->setVisible(true); + mUnzoomCtrl->setVisible(false); + mStopCtrl->setEnabled(false); + mZoomCtrl->setEnabled(false); +} + +void LLPanelNearByMedia::onClickSelectedMediaStop() +{ + setDisabled(mMediaList->getValue().asUUID(), true); +} + +void LLPanelNearByMedia::onClickSelectedMediaPlay() +{ + LLUUID selected_media_id = mMediaList->getValue().asUUID(); + + // First enable it + setDisabled(selected_media_id, false); + + // Special code to make play "unpause" if time-based and playing + if (selected_media_id != PARCEL_AUDIO_LIST_ITEM_UUID) + { + LLViewerMediaImpl *impl = (selected_media_id == PARCEL_MEDIA_LIST_ITEM_UUID) ? + ((LLViewerMediaImpl*)LLViewerParcelMedia::getParcelMedia()) : LLViewerMedia::getMediaImplFromTextureID(selected_media_id); + if (NULL != impl) + { + if (impl->isMediaTimeBased() && impl->isMediaPaused()) + { + // Aha! It's really time-based media that's paused, so unpause + impl->play(); + return; + } + else if (impl->isParcelMedia()) + { + LLViewerParcelMedia::play(LLViewerParcelMgr::getInstance()->getAgentParcel()); + } + } + } +} + +void LLPanelNearByMedia::onClickSelectedMediaPause() +{ + LLUUID selected_media_id = mMediaList->getValue().asUUID(); + if (selected_media_id == PARCEL_AUDIO_LIST_ITEM_UUID) + { + onClickParcelAudioPause(); + } + else if (selected_media_id == PARCEL_MEDIA_LIST_ITEM_UUID) + { + onClickParcelMediaPause(); + } + else { + LLViewerMediaImpl* impl = LLViewerMedia::getMediaImplFromTextureID(selected_media_id); + if (NULL != impl && impl->isMediaTimeBased() && impl->isMediaPlaying()) + { + impl->pause(); + } + } +} + +void LLPanelNearByMedia::onClickSelectedMediaMute() +{ + LLUUID selected_media_id = mMediaList->getValue().asUUID(); + if (selected_media_id == PARCEL_AUDIO_LIST_ITEM_UUID) + { + gSavedSettings.setBOOL("MuteMusic", mMuteBtn->getValue()); + } + else { + LLViewerMediaImpl* impl = (selected_media_id == PARCEL_MEDIA_LIST_ITEM_UUID) ? + ((LLViewerMediaImpl*)LLViewerParcelMedia::getParcelMedia()) : LLViewerMedia::getMediaImplFromTextureID(selected_media_id); + if (NULL != impl) + { + F32 volume = impl->getVolume(); + if(volume > 0.0) + { + impl->setVolume(0.0); + } + else if (mVolumeSlider->getValueF32() == 0.0) + { + impl->setVolume(1.0); + mVolumeSlider->setValue(1.0); + } + else + { + impl->setVolume(mVolumeSlider->getValueF32()); + } + } + } +} + +void LLPanelNearByMedia::onCommitSelectedMediaVolume() +{ + LLUUID selected_media_id = mMediaList->getValue().asUUID(); + if (selected_media_id == PARCEL_AUDIO_LIST_ITEM_UUID) + { + F32 vol = mVolumeSlider->getValueF32(); + gSavedSettings.setF32("AudioLevelMusic", vol); + } + else { + LLViewerMediaImpl* impl = (selected_media_id == PARCEL_MEDIA_LIST_ITEM_UUID) ? + ((LLViewerMediaImpl*)LLViewerParcelMedia::getParcelMedia()) : LLViewerMedia::getMediaImplFromTextureID(selected_media_id); + if (NULL != impl) + { + impl->setVolume(mVolumeSlider->getValueF32()); + } + } +} + +void LLPanelNearByMedia::onClickSelectedMediaZoom() +{ + LLUUID selected_media_id = mMediaList->getValue().asUUID(); + if (selected_media_id == PARCEL_AUDIO_LIST_ITEM_UUID || selected_media_id == PARCEL_MEDIA_LIST_ITEM_UUID) + return; + LLViewerMediaFocus::getInstance()->focusZoomOnMedia(selected_media_id); +} + +void LLPanelNearByMedia::onClickSelectedMediaUnzoom() +{ + LLViewerMediaFocus::getInstance()->unZoom(); +} + + +// static +void LLPanelNearByMedia::getNameAndUrlHelper(LLViewerMediaImpl* impl, std::string& name, std::string & url, const std::string &defaultName) +{ + if (NULL == impl) return; + + name = impl->getName(); + url = impl->getCurrentMediaURL(); // This is the URL the media impl actually has loaded + if (url.empty()) + { + url = impl->getMediaEntryURL(); // This is the current URL from the media data + } + if (url.empty()) + { + url = impl->getHomeURL(); // This is the home URL from the media data + } + if (name.empty()) + { + name = url; + } + if (name.empty()) + { + name = defaultName; + } +} + diff --git a/indra/newview/llpanelnearbymedia.h b/indra/newview/llpanelnearbymedia.h new file mode 100644 index 0000000000..3cecf8e40c --- /dev/null +++ b/indra/newview/llpanelnearbymedia.h @@ -0,0 +1,189 @@ +/** + * @file llpanelnearbymedia.h + * @brief Management interface for muting and controlling nearby media + * + * $LicenseInfo:firstyear=2005&license=viewergpl$ + * + * Copyright (c) 2005-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLPANELNEARBYMEDIA_H +#define LL_LLPANELNEARBYMEDIA_H + +#include "llpanel.h" + +class LLPanelNearbyMedia; +class LLButton; +class LLScrollListCtrl; +class LLSlider; +class LLSliderCtrl; +class LLCheckBoxCtrl; +class LLTextBox; +class LLComboBox; +class LLViewerMediaImpl; + +class LLPanelNearByMedia : public LLPanel +{ +public: + + /*virtual*/ BOOL postBuild(); + /*virtual*/ void draw(); + /*virtual*/ void onMouseEnter(S32 x, S32 y, MASK mask); + /*virtual*/ void onMouseLeave(S32 x, S32 y, MASK mask); + /*virtual*/ void onTopLost(); + /*virtual*/ void handleVisibilityChange ( BOOL new_visibility ); + /*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent); + /*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask); + + // this is part of the nearby media *dialog* so we can track whether + // the user *implicitly* wants audio on or off via their *explicit* + // interaction with our buttons. + bool getParcelAudioAutoStart(); + + // callback for when the auto play media preference changes + // to update mParcelAudioAutoStart + void handleMediaAutoPlayChanged(const LLSD& newvalue); + + LLPanelNearByMedia(); + virtual ~LLPanelNearByMedia(); + +private: + + enum ColumnIndex { + CHECKBOX_COLUMN = 0, + PROXIMITY_COLUMN = 1, + VISIBILITY_COLUMN = 2, + CLASS_COLUMN = 3, + NAME_COLUMN = 4, + DEBUG_COLUMN = 5 + }; + + // Media "class" enumeration + enum MediaClass { + MEDIA_CLASS_ALL = 0, + MEDIA_CLASS_FOCUSED = 1, + MEDIA_CLASS_WITHIN_PARCEL = 2, + MEDIA_CLASS_OUTSIDE_PARCEL = 3, + MEDIA_CLASS_ON_OTHERS = 4 + }; + + // Add/remove an LLViewerMediaImpl to/from the list + LLScrollListItem* addListItem(const LLUUID &id); + void updateListItem(LLScrollListItem* item, LLViewerMediaImpl* impl); + void updateListItem(LLScrollListItem* item, + const std::string &item_name, + const std::string &item_tooltip, + S32 proximity, + bool is_disabled, + bool has_media, + bool is_time_based_and_playing, + MediaClass media_class, + const std::string &debug_str); + void removeListItem(const LLUUID &id); + + // Refresh the list in the UI + void refreshList(); + + void refreshParcelItems(); + + // UI Callbacks + void onClickEnableAll(); + void onClickDisableAll(); + void onClickEnableParcelMedia(); + void onClickDisableParcelMedia(); + void onClickMuteParcelMedia(); + void onParcelMediaVolumeSlider(); + void onClickParcelMediaPlay(); + void onClickParcelMediaStop(); + void onClickParcelMediaPause(); + void onClickParcelAudioPlay(); + void onClickParcelAudioStop(); + void onClickParcelAudioStart(); + void onClickParcelAudioPause(); + void onCheckAutoPlay(); + void onAdvancedButtonClick(); + void onMoreLess(); + + void onCheckItem(LLUICtrl* ctrl, const LLUUID &row_id); + + static void onZoomMedia(void* user_data); + +private: + bool setDisabled(const LLUUID &id, bool disabled); + + static void getNameAndUrlHelper(LLViewerMediaImpl* impl, std::string& name, std::string & url, const std::string &defaultName); + + void updateColumns(); + + bool shouldShow(LLViewerMediaImpl* impl); + + void showBasicControls(bool playing, bool include_zoom, bool is_zoomed, bool muted, F32 volume); + void showTimeBasedControls(bool playing, bool include_zoom, bool is_zoomed, bool muted, F32 volume); + void showDisabledControls(); + void updateControls(); + + void onClickSelectedMediaStop(); + void onClickSelectedMediaPlay(); + void onClickSelectedMediaPause(); + void onClickSelectedMediaMute(); + void onCommitSelectedMediaVolume(); + void onClickSelectedMediaZoom(); + void onClickSelectedMediaUnzoom(); + + LLUICtrl* mNearbyMediaPanel; + LLScrollListCtrl* mMediaList; + LLUICtrl* mEnableAllCtrl; + LLUICtrl* mDisableAllCtrl; + LLComboBox* mShowCtrl; + + // Dynamic (selection-dependent) controls + LLUICtrl* mStopCtrl; + LLUICtrl* mPlayCtrl; + LLUICtrl* mPauseCtrl; + LLUICtrl* mMuteCtrl; + LLUICtrl* mVolumeSliderCtrl; + LLUICtrl* mZoomCtrl; + LLUICtrl* mUnzoomCtrl; + LLSlider* mVolumeSlider; + LLButton* mMuteBtn; + + bool mAllMediaDisabled; + bool mDebugInfoVisible; + bool mParcelAudioAutoStart; + std::string mEmptyNameString; + std::string mPlayingString; + std::string mParcelMediaName; + std::string mParcelAudioName; + + LLRect mMoreRect; + LLRect mLessRect; + LLFrameTimer mHoverTimer; + LLScrollListItem* mParcelMediaItem; + LLScrollListItem* mParcelAudioItem; +}; + + +#endif // LL_LLPANELNEARBYMEDIA_H diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp index e8ae006968..ca1361c84b 100644 --- a/indra/newview/llpanelobjectinventory.cpp +++ b/indra/newview/llpanelobjectinventory.cpp @@ -46,10 +46,12 @@ #include "roles_constants.h" #include "llagent.h" +#include "llavataractions.h" #include "llcallbacklist.h" -#include "llfloaterbuycurrency.h" +#include "llbuycurrencyhtml.h" #include "llfloaterreg.h" #include "llinventorybridge.h" +#include "llinventorydefines.h" #include "llinventoryfilter.h" #include "llinventoryfunctions.h" #include "llpreviewanim.h" @@ -81,16 +83,17 @@ protected: mutable std::string mDisplayName; LLPanelObjectInventory* mPanel; U32 mFlags; + LLAssetType::EType mAssetType; + LLInventoryType::EType mInventoryType; LLInventoryItem* findItem() const; public: - LLTaskInvFVBridge( - LLPanelObjectInventory* panel, - const LLUUID& uuid, - const std::string& name, - U32 flags=0); - virtual ~LLTaskInvFVBridge( void ) {} + LLTaskInvFVBridge(LLPanelObjectInventory* panel, + const LLUUID& uuid, + const std::string& name, + U32 flags=0); + virtual ~LLTaskInvFVBridge() {} virtual LLFontGL::StyleFlags getLabelStyle() const { return LLFontGL::NORMAL; } virtual std::string getLabelSuffix() const { return LLStringUtil::null; } @@ -111,6 +114,7 @@ public: virtual time_t getCreationDate() const; virtual LLUIImagePtr getIcon() const; virtual void openItem(); + virtual BOOL canOpenItem() const { return FALSE; } virtual void closeItem() {} virtual void previewItem(); virtual void selectItem() {} @@ -128,10 +132,12 @@ public: virtual void pasteFromClipboard(); virtual void pasteLinkFromClipboard(); virtual void buildContextMenu(LLMenuGL& menu, U32 flags); - virtual void performAction(LLFolderView* folder, LLInventoryModel* model, std::string action); + virtual void performAction(LLInventoryModel* model, std::string action); virtual BOOL isUpToDate() const { return TRUE; } virtual BOOL hasChildren() const { return FALSE; } virtual LLInventoryType::EType getInventoryType() const { return LLInventoryType::IT_NONE; } + virtual LLWearableType::EType getWearableType() const { return LLWearableType::WT_NONE; } + // LLDragAndDropBridge functionality virtual BOOL startDrag(EDragAndDropType* type, LLUUID* id) const; virtual BOOL dragOrDrop(MASK mask, BOOL drop, @@ -147,9 +153,16 @@ LLTaskInvFVBridge::LLTaskInvFVBridge( mUUID(uuid), mName(name), mPanel(panel), - mFlags(flags) + mFlags(flags), + mAssetType(LLAssetType::AT_NONE), + mInventoryType(LLInventoryType::IT_NONE) { - + const LLInventoryItem *item = findItem(); + if (item) + { + mAssetType = item->getType(); + mInventoryType = item->getInventoryType(); + } } LLInventoryItem* LLTaskInvFVBridge::findItem() const @@ -164,20 +177,7 @@ LLInventoryItem* LLTaskInvFVBridge::findItem() const void LLTaskInvFVBridge::showProperties() { - LLSD key; - key["object"] = mPanel->getTaskUUID(); - key["id"] = mUUID; - LLSideTray::getInstance()->showPanel("sidepanel_inventory", key); - - - // Disable old properties floater; this is replaced by the sidepanel. - /* - LLFloaterProperties* floater = LLFloaterReg::showTypedInstance<LLFloaterProperties>("properties", mUUID); - if (floater) - { - floater->setObjectID(mPanel->getTaskUUID()); - } - */ + show_task_item_profile(mUUID, mPanel->getTaskUUID()); } struct LLBuyInvItemData @@ -343,13 +343,9 @@ time_t LLTaskInvFVBridge::getCreationDate() const LLUIImagePtr LLTaskInvFVBridge::getIcon() const { - BOOL item_is_multi = FALSE; - if ( mFlags & LLInventoryItem::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS ) - { - item_is_multi = TRUE; - } + const BOOL item_is_multi = (mFlags & LLInventoryItemFlags::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS); - return get_item_icon(LLAssetType::AT_OBJECT, LLInventoryType::IT_OBJECT, 0, item_is_multi ); + return LLInventoryIcon::getIcon(mAssetType, mInventoryType, 0, item_is_multi ); } void LLTaskInvFVBridge::openItem() @@ -369,8 +365,7 @@ BOOL LLTaskInvFVBridge::isItemRenameable() const LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID()); if(object) { - LLInventoryItem* item; - item = (LLInventoryItem*)(object->getInventoryObject(mUUID)); + LLInventoryItem* item = (LLInventoryItem*)(object->getInventoryObject(mUUID)); if(item && gAgent.allowOperation(PERM_MODIFY, item->getPermissions(), GP_OBJECT_MANIPULATE, GOD_LIKE)) { @@ -595,7 +590,7 @@ BOOL LLTaskInvFVBridge::dragOrDrop(MASK mask, BOOL drop, } // virtual -void LLTaskInvFVBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) +void LLTaskInvFVBridge::performAction(LLInventoryModel* model, std::string action) { if (action == "task_buy") { @@ -609,7 +604,9 @@ void LLTaskInvFVBridge::performAction(LLFolderView* folder, LLInventoryModel* mo { if (price > 0 && price > gStatusBar->getBalance()) { - LLFloaterBuyCurrency::buyCurrency("This costs", price); + LLStringUtil::format_map_t args; + args["AMOUNT"] = llformat("%d", price); + LLBuyCurrencyHTML::openCurrencyFloater( LLTrans::getString("this_costs", args), price ); } else { @@ -671,7 +668,7 @@ void LLTaskInvFVBridge::buildContextMenu(LLMenuGL& menu, U32 flags) } } } - else + else if (canOpenItem()) { items.push_back(std::string("Task Open")); if (!isItemCopyable()) @@ -717,6 +714,8 @@ public: virtual BOOL dragOrDrop(MASK mask, BOOL drop, EDragAndDropType cargo_type, void* cargo_data); + virtual BOOL canOpenItem() const { return TRUE; } + virtual void openItem(); }; LLTaskCategoryBridge::LLTaskCategoryBridge( @@ -751,7 +750,8 @@ void LLTaskCategoryBridge::buildContextMenu(LLMenuGL& menu, U32 flags) { std::vector<std::string> items; std::vector<std::string> disabled_items; - items.push_back(std::string("Task Open")); + items.push_back(std::string("--no options--")); + disabled_items.push_back(std::string("--no options--")); hide_context_entries(menu, items, disabled_items); } @@ -762,6 +762,10 @@ BOOL LLTaskCategoryBridge::hasChildren() const return FALSE; } +void LLTaskCategoryBridge::openItem() +{ +} + BOOL LLTaskCategoryBridge::startDrag(EDragAndDropType* type, LLUUID* id) const { //llinfos << "LLTaskInvFVBridge::startDrag()" << llendl; @@ -770,8 +774,8 @@ BOOL LLTaskCategoryBridge::startDrag(EDragAndDropType* type, LLUUID* id) const LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID()); if(object) { - LLInventoryItem* inv = NULL; - if((inv = (LLInventoryItem*)object->getInventoryObject(mUUID))) + const LLInventoryItem *inv = dynamic_cast<LLInventoryItem*>(object->getInventoryObject(mUUID)); + if (inv) { const LLPermissions& perm = inv->getPermissions(); bool can_copy = gAgent.allowOperation(PERM_COPY, perm, @@ -863,33 +867,15 @@ BOOL LLTaskCategoryBridge::dragOrDrop(MASK mask, BOOL drop, class LLTaskTextureBridge : public LLTaskInvFVBridge { public: - LLTaskTextureBridge( - LLPanelObjectInventory* panel, - const LLUUID& uuid, - const std::string& name, - LLInventoryType::EType it); + LLTaskTextureBridge(LLPanelObjectInventory* panel, + const LLUUID& uuid, + const std::string& name) : + LLTaskInvFVBridge(panel, uuid, name) {} - virtual LLUIImagePtr getIcon() const; + virtual BOOL canOpenItem() const { return TRUE; } virtual void openItem(); -protected: - LLInventoryType::EType mInventoryType; }; -LLTaskTextureBridge::LLTaskTextureBridge( - LLPanelObjectInventory* panel, - const LLUUID& uuid, - const std::string& name, - LLInventoryType::EType it) : - LLTaskInvFVBridge(panel, uuid, name), - mInventoryType(it) -{ -} - -LLUIImagePtr LLTaskTextureBridge::getIcon() const -{ - return get_item_icon(LLAssetType::AT_TEXTURE, mInventoryType, 0, FALSE); -} - void LLTaskTextureBridge::openItem() { llinfos << "LLTaskTextureBridge::openItem()" << llendl; @@ -908,31 +894,18 @@ void LLTaskTextureBridge::openItem() class LLTaskSoundBridge : public LLTaskInvFVBridge { public: - LLTaskSoundBridge( - LLPanelObjectInventory* panel, - const LLUUID& uuid, - const std::string& name); + LLTaskSoundBridge(LLPanelObjectInventory* panel, + const LLUUID& uuid, + const std::string& name) : + LLTaskInvFVBridge(panel, uuid, name) {} - virtual LLUIImagePtr getIcon() const; + virtual BOOL canOpenItem() const { return TRUE; } virtual void openItem(); - virtual void performAction(LLFolderView* folder, LLInventoryModel* model, std::string action); + virtual void performAction(LLInventoryModel* model, std::string action); virtual void buildContextMenu(LLMenuGL& menu, U32 flags); static void openSoundPreview(void* data); }; -LLTaskSoundBridge::LLTaskSoundBridge( - LLPanelObjectInventory* panel, - const LLUUID& uuid, - const std::string& name) : - LLTaskInvFVBridge(panel, uuid, name) -{ -} - -LLUIImagePtr LLTaskSoundBridge::getIcon() const -{ - return get_item_icon(LLAssetType::AT_SOUND, LLInventoryType::IT_SOUND, 0, FALSE); -} - void LLTaskSoundBridge::openItem() { openSoundPreview((void*)this); @@ -952,7 +925,7 @@ void LLTaskSoundBridge::openSoundPreview(void* data) } // virtual -void LLTaskSoundBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) +void LLTaskSoundBridge::performAction(LLInventoryModel* model, std::string action) { if (action == "task_play") { @@ -962,7 +935,7 @@ void LLTaskSoundBridge::performAction(LLFolderView* folder, LLInventoryModel* mo send_sound_trigger(item->getAssetUUID(), 1.0); } } - LLTaskInvFVBridge::performAction(folder, model, action); + LLTaskInvFVBridge::performAction(model, action); } void LLTaskSoundBridge::buildContextMenu(LLMenuGL& menu, U32 flags) @@ -1003,9 +976,8 @@ void LLTaskSoundBridge::buildContextMenu(LLMenuGL& menu, U32 flags) } } } - else + else if (canOpenItem()) { - items.push_back(std::string("Task Open")); if (!isItemCopyable()) { disabled_items.push_back(std::string("Task Open")); @@ -1034,28 +1006,12 @@ void LLTaskSoundBridge::buildContextMenu(LLMenuGL& menu, U32 flags) class LLTaskLandmarkBridge : public LLTaskInvFVBridge { public: - LLTaskLandmarkBridge( - LLPanelObjectInventory* panel, - const LLUUID& uuid, - const std::string& name); - - virtual LLUIImagePtr getIcon() const; + LLTaskLandmarkBridge(LLPanelObjectInventory* panel, + const LLUUID& uuid, + const std::string& name) : + LLTaskInvFVBridge(panel, uuid, name) {} }; -LLTaskLandmarkBridge::LLTaskLandmarkBridge( - LLPanelObjectInventory* panel, - const LLUUID& uuid, - const std::string& name) : - LLTaskInvFVBridge(panel, uuid, name) -{ -} - -LLUIImagePtr LLTaskLandmarkBridge::getIcon() const -{ - return get_item_icon(LLAssetType::AT_LANDMARK, LLInventoryType::IT_LANDMARK, 0, FALSE); -} - - ///---------------------------------------------------------------------------- /// Class LLTaskCallingCardBridge ///---------------------------------------------------------------------------- @@ -1063,29 +1019,15 @@ LLUIImagePtr LLTaskLandmarkBridge::getIcon() const class LLTaskCallingCardBridge : public LLTaskInvFVBridge { public: - LLTaskCallingCardBridge( - LLPanelObjectInventory* panel, - const LLUUID& uuid, - const std::string& name); + LLTaskCallingCardBridge(LLPanelObjectInventory* panel, + const LLUUID& uuid, + const std::string& name) : + LLTaskInvFVBridge(panel, uuid, name) {} - virtual LLUIImagePtr getIcon() const; virtual BOOL isItemRenameable() const; virtual BOOL renameItem(const std::string& new_name); }; -LLTaskCallingCardBridge::LLTaskCallingCardBridge( - LLPanelObjectInventory* panel, - const LLUUID& uuid, - const std::string& name) : - LLTaskInvFVBridge(panel, uuid, name) -{ -} - -LLUIImagePtr LLTaskCallingCardBridge::getIcon() const -{ - return get_item_icon(LLAssetType::AT_CALLINGCARD, LLInventoryType::IT_CALLINGCARD, 0, FALSE); -} - BOOL LLTaskCallingCardBridge::isItemRenameable() const { return FALSE; @@ -1104,37 +1046,23 @@ BOOL LLTaskCallingCardBridge::renameItem(const std::string& new_name) class LLTaskScriptBridge : public LLTaskInvFVBridge { public: - LLTaskScriptBridge( - LLPanelObjectInventory* panel, - const LLUUID& uuid, - const std::string& name); + LLTaskScriptBridge(LLPanelObjectInventory* panel, + const LLUUID& uuid, + const std::string& name) : + LLTaskInvFVBridge(panel, uuid, name) {} - virtual LLUIImagePtr getIcon() const; //static BOOL enableIfCopyable( void* userdata ); }; -LLTaskScriptBridge::LLTaskScriptBridge( - LLPanelObjectInventory* panel, - const LLUUID& uuid, - const std::string& name) : - LLTaskInvFVBridge(panel, uuid, name) -{ -} - -LLUIImagePtr LLTaskScriptBridge::getIcon() const -{ - return get_item_icon(LLAssetType::AT_SCRIPT, LLInventoryType::IT_LSL, 0, FALSE); -} - - class LLTaskLSLBridge : public LLTaskScriptBridge { public: - LLTaskLSLBridge( - LLPanelObjectInventory* panel, - const LLUUID& uuid, - const std::string& name); + LLTaskLSLBridge(LLPanelObjectInventory* panel, + const LLUUID& uuid, + const std::string& name) : + LLTaskScriptBridge(panel, uuid, name) {} + virtual BOOL canOpenItem() const { return TRUE; } virtual void openItem(); virtual BOOL removeItem(); //virtual void buildContextMenu(LLMenuGL& menu); @@ -1142,14 +1070,6 @@ public: //static void copyToInventory(void* userdata); }; -LLTaskLSLBridge::LLTaskLSLBridge( - LLPanelObjectInventory* panel, - const LLUUID& uuid, - const std::string& name) : - LLTaskScriptBridge(panel, uuid, name) -{ -} - void LLTaskLSLBridge::openItem() { llinfos << "LLTaskLSLBridge::openItem() " << mUUID << llendl; @@ -1185,33 +1105,13 @@ BOOL LLTaskLSLBridge::removeItem() class LLTaskObjectBridge : public LLTaskInvFVBridge { public: - LLTaskObjectBridge( - LLPanelObjectInventory* panel, - const LLUUID& uuid, - const std::string& name); - - virtual LLUIImagePtr getIcon() const; + LLTaskObjectBridge(LLPanelObjectInventory* panel, + const LLUUID& uuid, + const std::string& name, + U32 flags = 0) : + LLTaskInvFVBridge(panel, uuid, name, flags) {} }; -LLTaskObjectBridge::LLTaskObjectBridge( - LLPanelObjectInventory* panel, - const LLUUID& uuid, - const std::string& name) : - LLTaskInvFVBridge(panel, uuid, name) -{ -} - -LLUIImagePtr LLTaskObjectBridge::getIcon() const -{ - BOOL item_is_multi = FALSE; - if ( mFlags & LLInventoryItem::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS ) - { - item_is_multi = TRUE; - } - - return get_item_icon(LLAssetType::AT_OBJECT, LLInventoryType::IT_OBJECT, 0, item_is_multi); -} - ///---------------------------------------------------------------------------- /// Class LLTaskNotecardBridge ///---------------------------------------------------------------------------- @@ -1219,29 +1119,16 @@ LLUIImagePtr LLTaskObjectBridge::getIcon() const class LLTaskNotecardBridge : public LLTaskInvFVBridge { public: - LLTaskNotecardBridge( - LLPanelObjectInventory* panel, - const LLUUID& uuid, - const std::string& name); + LLTaskNotecardBridge(LLPanelObjectInventory* panel, + const LLUUID& uuid, + const std::string& name) : + LLTaskInvFVBridge(panel, uuid, name) {} - virtual LLUIImagePtr getIcon() const; + virtual BOOL canOpenItem() const { return TRUE; } virtual void openItem(); virtual BOOL removeItem(); }; -LLTaskNotecardBridge::LLTaskNotecardBridge( - LLPanelObjectInventory* panel, - const LLUUID& uuid, - const std::string& name) : - LLTaskInvFVBridge(panel, uuid, name) -{ -} - -LLUIImagePtr LLTaskNotecardBridge::getIcon() const -{ - return get_item_icon(LLAssetType::AT_NOTECARD, LLInventoryType::IT_NOTECARD, 0, FALSE); -} - void LLTaskNotecardBridge::openItem() { LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID()); @@ -1272,29 +1159,16 @@ BOOL LLTaskNotecardBridge::removeItem() class LLTaskGestureBridge : public LLTaskInvFVBridge { public: - LLTaskGestureBridge( - LLPanelObjectInventory* panel, - const LLUUID& uuid, - const std::string& name); + LLTaskGestureBridge(LLPanelObjectInventory* panel, + const LLUUID& uuid, + const std::string& name) : + LLTaskInvFVBridge(panel, uuid, name) {} - virtual LLUIImagePtr getIcon() const; + virtual BOOL canOpenItem() const { return TRUE; } virtual void openItem(); virtual BOOL removeItem(); }; -LLTaskGestureBridge::LLTaskGestureBridge( - LLPanelObjectInventory* panel, - const LLUUID& uuid, - const std::string& name) : - LLTaskInvFVBridge(panel, uuid, name) -{ -} - -LLUIImagePtr LLTaskGestureBridge::getIcon() const -{ - return get_item_icon(LLAssetType::AT_GESTURE, LLInventoryType::IT_GESTURE, 0, FALSE); -} - void LLTaskGestureBridge::openItem() { LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID()); @@ -1319,29 +1193,16 @@ BOOL LLTaskGestureBridge::removeItem() class LLTaskAnimationBridge : public LLTaskInvFVBridge { public: - LLTaskAnimationBridge( - LLPanelObjectInventory* panel, - const LLUUID& uuid, - const std::string& name); + LLTaskAnimationBridge(LLPanelObjectInventory* panel, + const LLUUID& uuid, + const std::string& name) : + LLTaskInvFVBridge(panel, uuid, name) {} - virtual LLUIImagePtr getIcon() const; + virtual BOOL canOpenItem() const { return TRUE; } virtual void openItem(); virtual BOOL removeItem(); }; -LLTaskAnimationBridge::LLTaskAnimationBridge( - LLPanelObjectInventory* panel, - const LLUUID& uuid, - const std::string& name) : - LLTaskInvFVBridge(panel, uuid, name) -{ -} - -LLUIImagePtr LLTaskAnimationBridge::getIcon() const -{ - return get_item_icon(LLAssetType::AT_ANIMATION, LLInventoryType::IT_ANIMATION, 0, FALSE); -} - void LLTaskAnimationBridge::openItem() { LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID()); @@ -1370,33 +1231,18 @@ BOOL LLTaskAnimationBridge::removeItem() class LLTaskWearableBridge : public LLTaskInvFVBridge { public: - LLTaskWearableBridge( - LLPanelObjectInventory* panel, - const LLUUID& uuid, - const std::string& name, - LLAssetType::EType asset_type, - U32 flags); + LLTaskWearableBridge(LLPanelObjectInventory* panel, + const LLUUID& uuid, + const std::string& name, + U32 flags) : + LLTaskInvFVBridge(panel, uuid, name, flags) {} virtual LLUIImagePtr getIcon() const; - -protected: - LLAssetType::EType mAssetType; }; -LLTaskWearableBridge::LLTaskWearableBridge( - LLPanelObjectInventory* panel, - const LLUUID& uuid, - const std::string& name, - LLAssetType::EType asset_type, - U32 flags) : - LLTaskInvFVBridge(panel, uuid, name, flags), - mAssetType( asset_type ) -{ -} - LLUIImagePtr LLTaskWearableBridge::getIcon() const { - return get_item_icon(mAssetType, LLInventoryType::IT_WEARABLE, mFlags, FALSE ); + return LLInventoryIcon::getIcon(mAssetType, mInventoryType, mFlags, FALSE ); } @@ -1408,31 +1254,31 @@ LLTaskInvFVBridge* LLTaskInvFVBridge::createObjectBridge(LLPanelObjectInventory* LLInventoryObject* object) { LLTaskInvFVBridge* new_bridge = NULL; + const LLInventoryItem* item = dynamic_cast<LLInventoryItem*>(object); + const U32 itemflags = ( NULL == item ? 0 : item->getFlags() ); LLAssetType::EType type = object->getType(); - LLInventoryItem* item = NULL; + switch(type) { case LLAssetType::AT_TEXTURE: - item = (LLInventoryItem*)object; new_bridge = new LLTaskTextureBridge(panel, - object->getUUID(), - object->getName(), - item->getInventoryType()); + object->getUUID(), + object->getName()); break; case LLAssetType::AT_SOUND: new_bridge = new LLTaskSoundBridge(panel, - object->getUUID(), - object->getName()); + object->getUUID(), + object->getName()); break; case LLAssetType::AT_LANDMARK: new_bridge = new LLTaskLandmarkBridge(panel, - object->getUUID(), - object->getName()); + object->getUUID(), + object->getName()); break; case LLAssetType::AT_CALLINGCARD: new_bridge = new LLTaskCallingCardBridge(panel, - object->getUUID(), - object->getName()); + object->getUUID(), + object->getName()); break; case LLAssetType::AT_SCRIPT: // OLD SCRIPTS DEPRECATED - JC @@ -1443,44 +1289,41 @@ LLTaskInvFVBridge* LLTaskInvFVBridge::createObjectBridge(LLPanelObjectInventory* break; case LLAssetType::AT_OBJECT: new_bridge = new LLTaskObjectBridge(panel, - object->getUUID(), - object->getName()); + object->getUUID(), + object->getName(), + itemflags); break; case LLAssetType::AT_NOTECARD: new_bridge = new LLTaskNotecardBridge(panel, - object->getUUID(), - object->getName()); + object->getUUID(), + object->getName()); break; case LLAssetType::AT_ANIMATION: new_bridge = new LLTaskAnimationBridge(panel, - object->getUUID(), - object->getName()); + object->getUUID(), + object->getName()); break; case LLAssetType::AT_GESTURE: new_bridge = new LLTaskGestureBridge(panel, - object->getUUID(), - object->getName()); + object->getUUID(), + object->getName()); break; case LLAssetType::AT_CLOTHING: case LLAssetType::AT_BODYPART: - item = (LLInventoryItem*)object; new_bridge = new LLTaskWearableBridge(panel, - object->getUUID(), - object->getName(), - type, - item->getFlags()); + object->getUUID(), + object->getName(), + itemflags); break; case LLAssetType::AT_CATEGORY: new_bridge = new LLTaskCategoryBridge(panel, - object->getUUID(), - object->getName()); + object->getUUID(), + object->getName()); break; case LLAssetType::AT_LSL_TEXT: new_bridge = new LLTaskLSLBridge(panel, - object->getUUID(), - object->getName()); - break; - + object->getUUID(), + object->getName()); break; default: llinfos << "Unhandled inventory type (llassetstorage.h): " @@ -1517,6 +1360,7 @@ LLPanelObjectInventory::LLPanelObjectInventory(const LLPanelObjectInventory::Par mCommitCallbackRegistrar.add("Inventory.DoCreate", boost::bind(&do_nothing)); mCommitCallbackRegistrar.add("Inventory.AttachObject", boost::bind(&do_nothing)); mCommitCallbackRegistrar.add("Inventory.BeginIMSession", boost::bind(&do_nothing)); + mCommitCallbackRegistrar.add("Inventory.Share", boost::bind(&LLAvatarActions::shareWithAvatars)); } // Destroys the object @@ -1568,25 +1412,32 @@ void LLPanelObjectInventory::reset() { clearContents(); - setBorderVisible(FALSE); + //setBorderVisible(FALSE); mCommitCallbackRegistrar.pushScope(); // push local callbacks LLRect dummy_rect(0, 1, 1, 0); LLFolderView::Params p; p.name = "task inventory"; + p.title = "task inventory"; p.task_id = getTaskUUID(); p.parent_panel = this; - p.tool_tip= p.name; + p.tool_tip= LLTrans::getString("PanelContentsTooltip"); mFolders = LLUICtrlFactory::create<LLFolderView>(p); // this ensures that we never say "searching..." or "no items found" mFolders->getFilter()->setShowFolderState(LLInventoryFilter::SHOW_ALL_FOLDERS); mFolders->setCallbackRegistrar(&mCommitCallbackRegistrar); + if (hasFocus()) + { + LLEditMenuHandler::gEditMenuHandler = mFolders; + } + LLRect scroller_rect(0, getRect().getHeight(), getRect().getWidth(), 0); LLScrollContainer::Params scroll_p; scroll_p.name("task inventory scroller"); scroll_p.rect(scroller_rect); + scroll_p.tab_stop(true); scroll_p.follows.flags(FOLLOWS_ALL); mScroller = LLUICtrlFactory::create<LLScrollContainer>(scroll_p); addChild(mScroller); @@ -1598,7 +1449,7 @@ void LLPanelObjectInventory::reset() } void LLPanelObjectInventory::inventoryChanged(LLViewerObject* object, - InventoryObjectList* inventory, + LLInventoryObject::object_list_t* inventory, S32 serial_num, void* data) { @@ -1615,7 +1466,7 @@ void LLPanelObjectInventory::inventoryChanged(LLViewerObject* object, // refresh any properties floaters that are hanging around. if(inventory) { - for (InventoryObjectList::const_iterator iter = inventory->begin(); + for (LLInventoryObject::object_list_t::const_iterator iter = inventory->begin(); iter != inventory->end(); ) { LLInventoryObject* item = *iter++; @@ -1636,9 +1487,9 @@ void LLPanelObjectInventory::updateInventory() // We're still interested in this task's inventory. std::set<LLUUID> selected_items; BOOL inventory_has_focus = FALSE; - if (mHaveInventory && mFolders->getNumSelectedDescendants()) + if (mHaveInventory) { - mFolders->getSelectionList(selected_items); + selected_items = mFolders->getSelectionList(); inventory_has_focus = gFocusMgr.childHasKeyboardFocus(mFolders); } @@ -1648,7 +1499,7 @@ void LLPanelObjectInventory::updateInventory() if (objectp) { LLInventoryObject* inventory_root = objectp->getInventoryRoot(); - InventoryObjectList contents; + LLInventoryObject::object_list_t contents; objectp->getInventoryContents(contents); if (inventory_root) { @@ -1702,7 +1553,7 @@ void LLPanelObjectInventory::updateInventory() // leads to an N^2 based on the category count. This could be greatly // speeded with an efficient multimap implementation, but we don't // have that in our current arsenal. -void LLPanelObjectInventory::createFolderViews(LLInventoryObject* inventory_root, InventoryObjectList& contents) +void LLPanelObjectInventory::createFolderViews(LLInventoryObject* inventory_root, LLInventoryObject::object_list_t& contents) { if (!inventory_root) { @@ -1731,7 +1582,7 @@ void LLPanelObjectInventory::createFolderViews(LLInventoryObject* inventory_root typedef std::pair<LLInventoryObject*, LLFolderViewFolder*> obj_folder_pair; -void LLPanelObjectInventory::createViewsForCategory(InventoryObjectList* inventory, +void LLPanelObjectInventory::createViewsForCategory(LLInventoryObject::object_list_t* inventory, LLInventoryObject* parent, LLFolderViewFolder* folder) { @@ -1740,8 +1591,8 @@ void LLPanelObjectInventory::createViewsForCategory(InventoryObjectList* invento LLTaskInvFVBridge* bridge; LLFolderViewItem* view; - InventoryObjectList::iterator it = inventory->begin(); - InventoryObjectList::iterator end = inventory->end(); + LLInventoryObject::object_list_t::iterator it = inventory->begin(); + LLInventoryObject::object_list_t::iterator end = inventory->end(); for( ; it != end; ++it) { LLInventoryObject* obj = *it; diff --git a/indra/newview/llpanelobjectinventory.h b/indra/newview/llpanelobjectinventory.h index bc339ece35..d015929841 100644 --- a/indra/newview/llpanelobjectinventory.h +++ b/indra/newview/llpanelobjectinventory.h @@ -82,12 +82,12 @@ public: protected: void reset(); /*virtual*/ void inventoryChanged(LLViewerObject* object, - InventoryObjectList* inventory, + LLInventoryObject::object_list_t* inventory, S32 serial_num, void* user_data); void updateInventory(); - void createFolderViews(LLInventoryObject* inventory_root, InventoryObjectList& contents); - void createViewsForCategory(InventoryObjectList* inventory, + void createFolderViews(LLInventoryObject* inventory_root, LLInventoryObject::object_list_t& contents); + void createViewsForCategory(LLInventoryObject::object_list_t* inventory, LLInventoryObject* parent, LLFolderViewFolder* folder); void clearContents(); diff --git a/indra/newview/llpanelonlinestatus.cpp b/indra/newview/llpanelonlinestatus.cpp new file mode 100644 index 0000000000..6ba015b11c --- /dev/null +++ b/indra/newview/llpanelonlinestatus.cpp @@ -0,0 +1,60 @@ +/** + * @file llpanelonlinestatus.cpp + * @brief Represents a class of online status tip toast panels. + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llnotifications.h" +#include "llpanelonlinestatus.h" + +LLPanelOnlineStatus::LLPanelOnlineStatus( + const LLNotificationPtr& notification) : + LLPanelTipToast(notification) +{ + + LLUICtrlFactory::getInstance()->buildPanel(this, + "panel_online_status_toast.xml"); + + + childSetValue("avatar_icon", notification->getPayload()["FROM_ID"]); + childSetValue("message", notification->getMessage()); + + if (notification->getPayload().has("respond_on_mousedown") + && notification->getPayload()["respond_on_mousedown"]) + { + setMouseDownCallback(boost::bind(&LLNotification::respond, + notification, notification->getResponseTemplate())); + } + + // set line max count to 3 in case of a very long name + snapToMessageHeight(getChild<LLTextBox> ("message"), 3); + +} diff --git a/indra/newview/llpanelonlinestatus.h b/indra/newview/llpanelonlinestatus.h new file mode 100644 index 0000000000..b47050c3a2 --- /dev/null +++ b/indra/newview/llpanelonlinestatus.h @@ -0,0 +1,53 @@ +/** + * @file llpanelonlinestatus.h + * @brief Represents a class of online status tip toast panels. + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + + +#include "llpaneltiptoast.h" + +#ifndef LL_PANELONLINESTATUS_H +#define LL_PANELONLINESTATUS_H + +/** + * Represents online tip toast panel. + */ +class LLPanelOnlineStatus : public LLPanelTipToast +{ + // disallow instantiation of this class +private: + // grant privileges to instantiate this class to LLToastPanel + friend class LLToastPanel; + + LLPanelOnlineStatus(const LLNotificationPtr& notification); + virtual ~LLPanelOnlineStatus() {} +}; + +#endif /* LL_PANELONLINESTATUS_H */ diff --git a/indra/newview/llpaneloutfitedit.cpp b/indra/newview/llpaneloutfitedit.cpp new file mode 100644 index 0000000000..5fac7efb84 --- /dev/null +++ b/indra/newview/llpaneloutfitedit.cpp @@ -0,0 +1,932 @@ +/** + * @file llpaneloutfitedit.cpp + * @brief Displays outfit edit information in Side Tray. + * + * $LicenseInfo:firstyear=2009&license=viewergpl$ + * + * Copyright (c) 2004-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llpaneloutfitedit.h" + +// *TODO: reorder includes to match the coding standard +#include "llagent.h" +#include "llagentcamera.h" +#include "llagentwearables.h" +#include "llappearancemgr.h" +#include "lloutfitobserver.h" +#include "llcofwearables.h" +#include "llfilteredwearablelist.h" +#include "llinventory.h" +#include "llinventoryitemslist.h" +#include "llviewercontrol.h" +#include "llui.h" +#include "llfloater.h" +#include "llfloaterreg.h" +#include "llinventoryfunctions.h" +#include "llinventorypanel.h" +#include "llviewermenu.h" +#include "llviewerwindow.h" +#include "llviewerinventory.h" +#include "llbutton.h" +#include "llcombobox.h" +#include "llfiltereditor.h" +#include "llfloaterinventory.h" +#include "llinventorybridge.h" +#include "llinventorymodel.h" +#include "llinventorymodelbackgroundfetch.h" +#include "llloadingindicator.h" +#include "llpaneloutfitsinventory.h" +#include "lluiconstants.h" +#include "llsaveoutfitcombobtn.h" +#include "llscrolllistctrl.h" +#include "lltextbox.h" +#include "lltrans.h" +#include "lluictrlfactory.h" +#include "llsdutil.h" +#include "llsidepanelappearance.h" +#include "lltoggleablemenu.h" +#include "llwearablelist.h" +#include "llwearableitemslist.h" +#include "llwearabletype.h" +#include "llweb.h" + +static LLRegisterPanelClassWrapper<LLPanelOutfitEdit> t_outfit_edit("panel_outfit_edit"); + +const U64 WEARABLE_MASK = (1LL << LLInventoryType::IT_WEARABLE); +const U64 ATTACHMENT_MASK = (1LL << LLInventoryType::IT_ATTACHMENT) | (1LL << LLInventoryType::IT_OBJECT); +const U64 ALL_ITEMS_MASK = WEARABLE_MASK | ATTACHMENT_MASK; + +static const std::string REVERT_BTN("revert_btn"); + +class LLShopURLDispatcher +{ +public: + std::string resolveURL(LLWearableType::EType wearable_type, ESex sex); + std::string resolveURL(LLAssetType::EType asset_type, ESex sex); +}; + +std::string LLShopURLDispatcher::resolveURL(LLWearableType::EType wearable_type, ESex sex) +{ + const std::string prefix = "MarketplaceURL"; + const std::string sex_str = (sex == SEX_MALE) ? "Male" : "Female"; + const std::string type_str = LLWearableType::getTypeName(wearable_type); + + std::string setting_name = prefix; + + switch (wearable_type) + { + case LLWearableType::WT_ALPHA: + case LLWearableType::WT_NONE: + case LLWearableType::WT_INVALID: // just in case, this shouldn't happen + case LLWearableType::WT_COUNT: // just in case, this shouldn't happen + break; + + default: + setting_name += '_'; + setting_name += type_str; + setting_name += sex_str; + break; + } + + return gSavedSettings.getString(setting_name); +} + +std::string LLShopURLDispatcher::resolveURL(LLAssetType::EType asset_type, ESex sex) +{ + const std::string prefix = "MarketplaceURL"; + const std::string sex_str = (sex == SEX_MALE) ? "Male" : "Female"; + const std::string type_str = LLAssetType::lookup(asset_type); + + std::string setting_name = prefix; + + switch (asset_type) + { + case LLAssetType::AT_CLOTHING: + case LLAssetType::AT_OBJECT: + case LLAssetType::AT_BODYPART: + setting_name += '_'; + setting_name += type_str; + setting_name += sex_str; + break; + + // to suppress warnings + default: + break; + } + + return gSavedSettings.getString(setting_name); +} + +class LLPanelOutfitEditGearMenu +{ +public: + static LLMenuGL* create() + { + LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar; + + registrar.add("Wearable.Create", boost::bind(onCreate, _2)); + + LLMenuGL* menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>( + "menu_cof_gear.xml", LLMenuGL::sMenuContainer, LLViewerMenuHolderGL::child_registry_t::instance()); + llassert(menu); + if (menu) + { + populateCreateWearableSubmenus(menu); + menu->buildDrawLabels(); + } + + return menu; + } + +private: + static void onCreate(const LLSD& param) + { + LLWearableType::EType type = LLWearableType::typeNameToType(param.asString()); + if (type == LLWearableType::WT_NONE) + { + llwarns << "Invalid wearable type" << llendl; + return; + } + + LLAgentWearables::createWearable(type, true); + } + + // Populate the menu with items like "New Skin", "New Pants", etc. + static void populateCreateWearableSubmenus(LLMenuGL* menu) + { + LLView* menu_clothes = gMenuHolder->findChildView("COF.Gear.New_Clothes", FALSE); + LLView* menu_bp = gMenuHolder->findChildView("COF.Geear.New_Body_Parts", FALSE); + + if (!menu_clothes || !menu_bp) + { + llassert(menu_clothes && menu_bp); + return; + } + + for (U8 i = LLWearableType::WT_SHAPE; i != (U8) LLWearableType::WT_COUNT; ++i) + { + LLWearableType::EType type = (LLWearableType::EType) i; + const std::string& type_name = LLWearableType::getTypeName(type); + + LLMenuItemCallGL::Params p; + p.name = type_name; + p.label = LLWearableType::getTypeDefaultNewName(type); + p.on_click.function_name = "Wearable.Create"; + p.on_click.parameter = LLSD(type_name); + + LLView* parent = LLWearableType::getAssetType(type) == LLAssetType::AT_CLOTHING ? + menu_clothes : menu_bp; + LLUICtrlFactory::create<LLMenuItemCallGL>(p, parent); + } + } +}; + +class LLCOFDragAndDropObserver : public LLInventoryAddItemByAssetObserver +{ +public: + LLCOFDragAndDropObserver(LLInventoryModel* model); + + virtual ~LLCOFDragAndDropObserver(); + + virtual void done(); + +private: + LLInventoryModel* mModel; +}; + +inline LLCOFDragAndDropObserver::LLCOFDragAndDropObserver(LLInventoryModel* model): + mModel(model) +{ + if (model != NULL) + { + model->addObserver(this); + } +} + +inline LLCOFDragAndDropObserver::~LLCOFDragAndDropObserver() +{ + if (mModel != NULL && mModel->containsObserver(this)) + { + mModel->removeObserver(this); + } +} + +void LLCOFDragAndDropObserver::done() +{ + LLAppearanceMgr::instance().updateAppearanceFromCOF(); +} + +LLPanelOutfitEdit::LLPanelOutfitEdit() +: LLPanel(), + mSearchFilter(NULL), + mCOFWearables(NULL), + mInventoryItemsPanel(NULL), + mGearMenu(NULL), + mCOFDragAndDropObserver(NULL), + mInitialized(false), + mAddWearablesPanel(NULL), + mFolderViewFilterCmbBox(NULL), + mListViewFilterCmbBox(NULL) +{ + mSavedFolderState = new LLSaveFolderState(); + mSavedFolderState->setApply(FALSE); + + + LLOutfitObserver& observer = LLOutfitObserver::instance(); + observer.addBOFReplacedCallback(boost::bind(&LLPanelOutfitEdit::updateCurrentOutfitName, this)); + observer.addBOFChangedCallback(boost::bind(&LLPanelOutfitEdit::updateVerbs, this)); + observer.addOutfitLockChangedCallback(boost::bind(&LLPanelOutfitEdit::updateVerbs, this)); + observer.addCOFChangedCallback(boost::bind(&LLPanelOutfitEdit::update, this)); + + gAgentWearables.addLoadingStartedCallback(boost::bind(&LLPanelOutfitEdit::onOutfitChanging, this, true)); + gAgentWearables.addLoadedCallback(boost::bind(&LLPanelOutfitEdit::onOutfitChanging, this, false)); + + mFolderViewItemTypes.reserve(NUM_FOLDER_VIEW_ITEM_TYPES); + for (U32 i = 0; i < NUM_FOLDER_VIEW_ITEM_TYPES; i++) + { + mFolderViewItemTypes.push_back(LLLookItemType()); + } + +} + +LLPanelOutfitEdit::~LLPanelOutfitEdit() +{ + delete mSavedFolderState; + + delete mCOFDragAndDropObserver; + + while (!mListViewItemTypes.empty()) { + delete mListViewItemTypes.back(); + mListViewItemTypes.pop_back(); + } +} + +BOOL LLPanelOutfitEdit::postBuild() +{ + // gInventory.isInventoryUsable() no longer needs to be tested per Richard's fix for race conditions between inventory and panels + + mFolderViewItemTypes[FVIT_ALL] = LLLookItemType(getString("Filter.All"), ALL_ITEMS_MASK); + mFolderViewItemTypes[FVIT_WEARABLE] = LLLookItemType(getString("Filter.Clothes/Body"), WEARABLE_MASK); + mFolderViewItemTypes[FVIT_ATTACHMENT] = LLLookItemType(getString("Filter.Objects"), ATTACHMENT_MASK); + + //order is important, see EListViewItemType for order information + mListViewItemTypes.push_back(new LLFilterItem(getString("Filter.All"), new LLFindByMask(ALL_ITEMS_MASK))); + mListViewItemTypes.push_back(new LLFilterItem(getString("Filter.Clothing"), new LLIsType(LLAssetType::AT_CLOTHING))); + mListViewItemTypes.push_back(new LLFilterItem(getString("Filter.Bodyparts"), new LLIsType(LLAssetType::AT_BODYPART))); + mListViewItemTypes.push_back(new LLFilterItem(getString("Filter.Objects"), new LLFindByMask(ATTACHMENT_MASK)));; + mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("shape"), new LLFindActualWearablesOfType(LLWearableType::WT_SHAPE))); + mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("skin"), new LLFindActualWearablesOfType(LLWearableType::WT_SKIN))); + mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("hair"), new LLFindActualWearablesOfType(LLWearableType::WT_HAIR))); + mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("eyes"), new LLFindActualWearablesOfType(LLWearableType::WT_EYES))); + mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("shirt"), new LLFindActualWearablesOfType(LLWearableType::WT_SHIRT))); + mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("pants"), new LLFindActualWearablesOfType(LLWearableType::WT_PANTS))); + mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("shoes"), new LLFindActualWearablesOfType(LLWearableType::WT_SHOES))); + mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("socks"), new LLFindActualWearablesOfType(LLWearableType::WT_SOCKS))); + mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("jacket"), new LLFindActualWearablesOfType(LLWearableType::WT_JACKET))); + mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("gloves"), new LLFindActualWearablesOfType(LLWearableType::WT_GLOVES))); + mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("undershirt"), new LLFindActualWearablesOfType(LLWearableType::WT_UNDERSHIRT))); + mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("underpants"), new LLFindActualWearablesOfType(LLWearableType::WT_UNDERPANTS))); + mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("skirt"), new LLFindActualWearablesOfType(LLWearableType::WT_SKIRT))); + mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("alpha"), new LLFindActualWearablesOfType(LLWearableType::WT_ALPHA))); + mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("tattoo"), new LLFindActualWearablesOfType(LLWearableType::WT_TATTOO))); + + mCurrentOutfitName = getChild<LLTextBox>("curr_outfit_name"); + mStatus = getChild<LLTextBox>("status"); + + mFolderViewBtn = getChild<LLButton>("folder_view_btn"); + mListViewBtn = getChild<LLButton>("list_view_btn"); + + childSetCommitCallback("filter_button", boost::bind(&LLPanelOutfitEdit::showWearablesFilter, this), NULL); + childSetCommitCallback("folder_view_btn", boost::bind(&LLPanelOutfitEdit::showWearablesFolderView, this), NULL); + childSetCommitCallback("list_view_btn", boost::bind(&LLPanelOutfitEdit::showWearablesListView, this), NULL); + childSetCommitCallback("wearables_gear_menu_btn", boost::bind(&LLPanelOutfitEdit::onGearButtonClick, this, _1), NULL); + childSetCommitCallback("gear_menu_btn", boost::bind(&LLPanelOutfitEdit::onGearButtonClick, this, _1), NULL); + childSetCommitCallback("shop_btn", boost::bind(&LLPanelOutfitEdit::onShopButtonClicked, this), NULL); + + mCOFWearables = getChild<LLCOFWearables>("cof_wearables_list"); + mCOFWearables->setCommitCallback(boost::bind(&LLPanelOutfitEdit::filterWearablesBySelectedItem, this)); + + mCOFWearables->getCOFCallbacks().mAddWearable = boost::bind(&LLPanelOutfitEdit::onAddWearableClicked, this); + mCOFWearables->getCOFCallbacks().mEditWearable = boost::bind(&LLPanelOutfitEdit::onEditWearableClicked, this); + mCOFWearables->getCOFCallbacks().mDeleteWearable = boost::bind(&LLPanelOutfitEdit::onRemoveFromOutfitClicked, this); + mCOFWearables->getCOFCallbacks().mMoveWearableCloser = boost::bind(&LLPanelOutfitEdit::moveWearable, this, true); + mCOFWearables->getCOFCallbacks().mMoveWearableFurther = boost::bind(&LLPanelOutfitEdit::moveWearable, this, false); + + mAddWearablesPanel = getChild<LLPanel>("add_wearables_panel"); + + mInventoryItemsPanel = getChild<LLInventoryPanel>("folder_view"); + mInventoryItemsPanel->setFilterTypes(ALL_ITEMS_MASK); + mInventoryItemsPanel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS); + mInventoryItemsPanel->setSelectCallback(boost::bind(&LLPanelOutfitEdit::onInventorySelectionChange, this, _1, _2)); + mInventoryItemsPanel->getRootFolder()->setReshapeCallback(boost::bind(&LLPanelOutfitEdit::onInventorySelectionChange, this, _1, _2)); + + mCOFDragAndDropObserver = new LLCOFDragAndDropObserver(mInventoryItemsPanel->getModel()); + + mFolderViewFilterCmbBox = getChild<LLComboBox>("folder_view_filter_combobox"); + mFolderViewFilterCmbBox->setCommitCallback(boost::bind(&LLPanelOutfitEdit::onFolderViewFilterCommitted, this, _1)); + mFolderViewFilterCmbBox->removeall(); + for (U32 i = 0; i < mFolderViewItemTypes.size(); ++i) + { + mFolderViewFilterCmbBox->add(mFolderViewItemTypes[i].displayName); + } + mFolderViewFilterCmbBox->setCurrentByIndex(FVIT_ALL); + + mListViewFilterCmbBox = getChild<LLComboBox>("list_view_filter_combobox"); + mListViewFilterCmbBox->setCommitCallback(boost::bind(&LLPanelOutfitEdit::onListViewFilterCommitted, this, _1)); + mListViewFilterCmbBox->removeall(); + for (U32 i = 0; i < mListViewItemTypes.size(); ++i) + { + mListViewFilterCmbBox->add(mListViewItemTypes[i]->displayName); + } + mListViewFilterCmbBox->setCurrentByIndex(LVIT_ALL); + + mSearchFilter = getChild<LLFilterEditor>("look_item_filter"); + mSearchFilter->setCommitCallback(boost::bind(&LLPanelOutfitEdit::onSearchEdit, this, _2)); + + childSetAction("show_add_wearables_btn", boost::bind(&LLPanelOutfitEdit::onAddMoreButtonClicked, this)); + + childSetAction("add_to_outfit_btn", boost::bind(&LLPanelOutfitEdit::onAddToOutfitClicked, this)); + + mEditWearableBtn = getChild<LLButton>("edit_wearable_btn"); + mEditWearableBtn->setEnabled(FALSE); + mEditWearableBtn->setVisible(FALSE); + mEditWearableBtn->setCommitCallback(boost::bind(&LLPanelOutfitEdit::onEditWearableClicked, this)); + + childSetAction(REVERT_BTN, boost::bind(&LLAppearanceMgr::wearBaseOutfit, LLAppearanceMgr::getInstance())); + + mWearablesListViewPanel = getChild<LLPanel>("filtered_wearables_panel"); + mWearableItemsList = getChild<LLInventoryItemsList>("list_view"); + + mSaveComboBtn.reset(new LLSaveOutfitComboBtn(this)); + return TRUE; +} + +// virtual +void LLPanelOutfitEdit::onOpen(const LLSD& key) +{ + if (!mInitialized) + { + // *TODO: this method is called even panel is not visible to user because its parent layout panel is hidden. + // So, we can defer initializing a bit. + mWearableListManager = new LLFilteredWearableListManager(mWearableItemsList, mListViewItemTypes[LVIT_ALL]->collector); + mWearableListManager->populateList(); + displayCurrentOutfit(); + mInitialized = true; + } +} + +void LLPanelOutfitEdit::moveWearable(bool closer_to_body) +{ + LLUUID item_id = mCOFWearables->getSelectedUUID(); + if (item_id.isNull()) return; + + LLViewerInventoryItem* wearable_to_move = gInventory.getItem(item_id); + LLAppearanceMgr::getInstance()->moveWearable(wearable_to_move, closer_to_body); +} + +void LLPanelOutfitEdit::toggleAddWearablesPanel() +{ + BOOL current_visibility = mAddWearablesPanel->getVisible(); + showAddWearablesPanel(!current_visibility); +} + +void LLPanelOutfitEdit::showAddWearablesPanel(bool show_add_wearables) +{ + mAddWearablesPanel->setVisible(show_add_wearables); + + childSetValue("show_add_wearables_btn", show_add_wearables); + + updateFiltersVisibility(); + childSetVisible("filter_button", show_add_wearables); + + //search filter should be disabled + if (!show_add_wearables) + { + childSetValue("filter_button", false); + + mFolderViewFilterCmbBox->setVisible(false); + mListViewFilterCmbBox->setVisible(false); + + showWearablesFilter(); + } + + //switching button bars + childSetVisible("no_add_wearables_button_bar", !show_add_wearables); + childSetVisible("add_wearables_button_bar", show_add_wearables); +} + +void LLPanelOutfitEdit::showWearablesFilter() +{ + bool filter_visible = childGetValue("filter_button"); + + childSetVisible("filter_panel", filter_visible); + + if(!filter_visible) + { + mSearchFilter->clear(); + onSearchEdit(LLStringUtil::null); + } +} + +void LLPanelOutfitEdit::showWearablesListView() +{ + if(switchPanels(mInventoryItemsPanel, mWearablesListViewPanel)) + { + mFolderViewBtn->setToggleState(FALSE); + mFolderViewBtn->setImageOverlay(getString("folder_view_off"), mFolderViewBtn->getImageOverlayHAlign()); + mListViewBtn->setImageOverlay(getString("list_view_on"), mListViewBtn->getImageOverlayHAlign()); + updateFiltersVisibility(); + } + mListViewBtn->setToggleState(TRUE); +} + +void LLPanelOutfitEdit::showWearablesFolderView() +{ + if(switchPanels(mWearablesListViewPanel, mInventoryItemsPanel)) + { + mListViewBtn->setToggleState(FALSE); + mListViewBtn->setImageOverlay(getString("list_view_off"), mListViewBtn->getImageOverlayHAlign()); + mFolderViewBtn->setImageOverlay(getString("folder_view_on"), mFolderViewBtn->getImageOverlayHAlign()); + updateFiltersVisibility(); + } + mFolderViewBtn->setToggleState(TRUE); +} + +void LLPanelOutfitEdit::updateFiltersVisibility() +{ + mListViewFilterCmbBox->setVisible(mWearablesListViewPanel->getVisible()); + mFolderViewFilterCmbBox->setVisible(mInventoryItemsPanel->getVisible()); +} + +void LLPanelOutfitEdit::onFolderViewFilterCommitted(LLUICtrl* ctrl) +{ + S32 curr_filter_type = mFolderViewFilterCmbBox->getCurrentIndex(); + if (curr_filter_type < 0) return; + + mInventoryItemsPanel->setFilterTypes(mFolderViewItemTypes[curr_filter_type].inventoryMask); + + mSavedFolderState->setApply(TRUE); + mInventoryItemsPanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState); + + LLOpenFoldersWithSelection opener; + mInventoryItemsPanel->getRootFolder()->applyFunctorRecursively(opener); + mInventoryItemsPanel->getRootFolder()->scrollToShowSelection(); + + LLInventoryModelBackgroundFetch::instance().start(); +} + +void LLPanelOutfitEdit::onListViewFilterCommitted(LLUICtrl* ctrl) +{ + S32 curr_filter_type = mListViewFilterCmbBox->getCurrentIndex(); + if (curr_filter_type < 0) return; + + mWearableListManager->setFilterCollector(mListViewItemTypes[curr_filter_type]->collector); +} + +void LLPanelOutfitEdit::onSearchEdit(const std::string& string) +{ + if (mSearchString != string) + { + mSearchString = string; + + // Searches are case-insensitive + LLStringUtil::toUpper(mSearchString); + LLStringUtil::trimHead(mSearchString); + } + + if (mSearchString == "") + { + mInventoryItemsPanel->setFilterSubString(LLStringUtil::null); + mWearableItemsList->setFilterSubString(LLStringUtil::null); + // re-open folders that were initially open + mSavedFolderState->setApply(TRUE); + mInventoryItemsPanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState); + LLOpenFoldersWithSelection opener; + mInventoryItemsPanel->getRootFolder()->applyFunctorRecursively(opener); + mInventoryItemsPanel->getRootFolder()->scrollToShowSelection(); + } + + LLInventoryModelBackgroundFetch::instance().start(); + + if (mInventoryItemsPanel->getFilterSubString().empty() && mSearchString.empty()) + { + // current filter and new filter empty, do nothing + return; + } + + // save current folder open state if no filter currently applied + if (mInventoryItemsPanel->getRootFolder()->getFilterSubString().empty()) + { + mSavedFolderState->setApply(FALSE); + mInventoryItemsPanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState); + } + + // set new filter string + mInventoryItemsPanel->setFilterSubString(mSearchString); + mWearableItemsList->setFilterSubString(mSearchString); + +} + +void LLPanelOutfitEdit::onAddToOutfitClicked(void) +{ + LLUUID selected_id; + if (mInventoryItemsPanel->getVisible()) + { + LLFolderViewItem* curr_item = mInventoryItemsPanel->getRootFolder()->getCurSelectedItem(); + if (!curr_item) return; + + LLFolderViewEventListener* listenerp = curr_item->getListener(); + if (!listenerp) return; + + selected_id = listenerp->getUUID(); + } + else if (mWearablesListViewPanel->getVisible()) + { + selected_id = mWearableItemsList->getSelectedUUID(); + } + + if (selected_id.isNull()) return; + + LLAppearanceMgr::getInstance()->wearItemOnAvatar(selected_id); +} + +void LLPanelOutfitEdit::onAddWearableClicked(void) +{ + LLPanelDummyClothingListItem* item = dynamic_cast<LLPanelDummyClothingListItem*>(mCOFWearables->getSelectedItem()); + + if(item) + { + showFilteredWearablesListView(item->getWearableType()); + } +} + +void LLPanelOutfitEdit::onReplaceBodyPartMenuItemClicked(LLUUID selected_item_id) +{ + LLViewerInventoryItem* item = gInventory.getLinkedItem(selected_item_id); + + if (item && item->getType() == LLAssetType::AT_BODYPART) + { + showFilteredWearablesListView(item->getWearableType()); + } +} + +void LLPanelOutfitEdit::onShopButtonClicked() +{ + static LLShopURLDispatcher url_resolver; + + std::string url; + std::vector<LLPanel*> selected_items; + mCOFWearables->getSelectedItems(selected_items); + + ESex sex = gSavedSettings.getU32("AvatarSex") ? SEX_MALE : SEX_FEMALE; + + if (selected_items.size() == 1) + { + LLWearableType::EType type = LLWearableType::WT_NONE; + LLPanel* item = selected_items.front(); + + // LLPanelDummyClothingListItem is lower then LLPanelInventoryListItemBase in hierarchy tree + if (LLPanelDummyClothingListItem* dummy_item = dynamic_cast<LLPanelDummyClothingListItem*>(item)) + { + type = dummy_item->getWearableType(); + } + else if (LLPanelInventoryListItemBase* real_item = dynamic_cast<LLPanelInventoryListItemBase*>(item)) + { + type = real_item->getWearableType(); + } + + // WT_INVALID comes for attachments + if (type != LLWearableType::WT_INVALID) + { + url = url_resolver.resolveURL(type, sex); + } + } + + if (url.empty()) + { + url = url_resolver.resolveURL(mCOFWearables->getExpandedAccordionAssetType(), sex); + } + + LLWeb::loadURLExternal(url); +} + +void LLPanelOutfitEdit::onRemoveFromOutfitClicked(void) +{ + LLUUID id_to_remove = mCOFWearables->getSelectedUUID(); + + LLAppearanceMgr::getInstance()->removeItemFromAvatar(id_to_remove); +} + + +void LLPanelOutfitEdit::onEditWearableClicked(void) +{ + LLUUID selected_item_id = mCOFWearables->getSelectedUUID(); + if (selected_item_id.notNull()) + { + gAgentWearables.editWearable(selected_item_id); + } +} + +void LLPanelOutfitEdit::onInventorySelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action) +{ + LLFolderViewItem* current_item = mInventoryItemsPanel->getRootFolder()->getCurSelectedItem(); + if (!current_item) + { + return; + } + + LLViewerInventoryItem* item = current_item->getInventoryItem(); + if (!item) return; + + switch (item->getType()) + { + case LLAssetType::AT_CLOTHING: + case LLAssetType::AT_BODYPART: + case LLAssetType::AT_OBJECT: + default: + break; + } + + /* Removing add to look inline button (not part of mvp for viewer 2) + LLRect btn_rect(current_item->getLocalRect().mRight - 50, + current_item->getLocalRect().mTop, + current_item->getLocalRect().mRight - 30, + current_item->getLocalRect().mBottom); + + mAddToLookBtn->setRect(btn_rect); + mAddToLookBtn->setEnabled(TRUE); + if (!mAddToLookBtn->getVisible()) + { + mAddToLookBtn->setVisible(TRUE); + } + + current_item->addChild(mAddToLookBtn); */ +} + + +void LLPanelOutfitEdit::applyFolderViewFilter(EFolderViewItemType type) +{ + mFolderViewFilterCmbBox->setCurrentByIndex(type); + mFolderViewFilterCmbBox->onCommit(); +} + +void LLPanelOutfitEdit::applyListViewFilter(EListViewItemType type) +{ + mListViewFilterCmbBox->setCurrentByIndex(type); + mListViewFilterCmbBox->onCommit(); +} + +void LLPanelOutfitEdit::filterWearablesBySelectedItem(void) +{ + if (!mAddWearablesPanel->getVisible()) return; + + uuid_vec_t ids; + mCOFWearables->getSelectedUUIDs(ids); + + bool nothing_selected = ids.empty(); + bool one_selected = ids.size() == 1; + bool more_than_one_selected = ids.size() > 1; + bool is_dummy_item = (ids.size() && dynamic_cast<LLPanelDummyClothingListItem*>(mCOFWearables->getSelectedItem())); + + //resetting selection if no item is selected or than one item is selected + if (nothing_selected || more_than_one_selected) + { + if (nothing_selected) + { + showWearablesFolderView(); + applyFolderViewFilter(FVIT_ALL); + } + + if (more_than_one_selected) + { + showWearablesListView(); + applyListViewFilter(LVIT_ALL); + } + + return; + } + + + //filter wearables by a type represented by a dummy item + if (one_selected && is_dummy_item) + { + onAddWearableClicked(); + return; + } + + LLViewerInventoryItem* item = gInventory.getItem(ids[0]); + if (!item && ids[0].notNull()) + { + //Inventory misses an item with non-zero id + showWearablesListView(); + applyListViewFilter(LVIT_ALL); + return; + } + + if (one_selected && !is_dummy_item) + { + if (item->isWearableType()) + { + //single clothing or bodypart item is selected + showFilteredWearablesListView(item->getWearableType()); + return; + } + else + { + //attachment is selected + showWearablesListView(); + applyListViewFilter(LVIT_ATTACHMENT); + return; + } + } + +} + + + +void LLPanelOutfitEdit::update() +{ + mCOFWearables->refresh(); + + updateVerbs(); +} + +BOOL LLPanelOutfitEdit::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, + EDragAndDropType cargo_type, + void* cargo_data, + EAcceptance* accept, + std::string& tooltip_msg) +{ + if (cargo_data == NULL) + { + llwarns << "cargo_data is NULL" << llendl; + return TRUE; + } + + switch (cargo_type) + { + case DAD_BODYPART: + case DAD_CLOTHING: + case DAD_OBJECT: + case DAD_LINK: + *accept = ACCEPT_YES_MULTI; + break; + default: + *accept = ACCEPT_NO; + } + + if (drop) + { + LLInventoryItem* item = static_cast<LLInventoryItem*>(cargo_data); + + if (LLAssetType::lookupIsAssetIDKnowable(item->getType())) + { + mCOFDragAndDropObserver->watchAsset(item->getAssetUUID()); + + /* + * Adding request to wear item. If the item is a link, then getLinkedUUID() will + * return the ID of the linked item. Otherwise it will return the item's ID. The + * second argument is used to delay the appearance update until all dragged items + * are added to optimize user experience. + */ + LLAppearanceMgr::instance().addCOFItemLink(item->getLinkedUUID(), false); + } + else + { + // if asset id is not available for the item we must wear it immediately (attachments only) + LLAppearanceMgr::instance().addCOFItemLink(item->getLinkedUUID(), true); + } + } + + return TRUE; +} + +void LLPanelOutfitEdit::displayCurrentOutfit() +{ + if (!getVisible()) + { + setVisible(TRUE); + } + + updateCurrentOutfitName(); + + update(); +} + +void LLPanelOutfitEdit::updateCurrentOutfitName() +{ + std::string current_outfit_name; + if (LLAppearanceMgr::getInstance()->getBaseOutfitName(current_outfit_name)) + { + mCurrentOutfitName->setText(current_outfit_name); + } + else + { + mCurrentOutfitName->setText(getString("No Outfit")); + } +} + +//private +void LLPanelOutfitEdit::updateVerbs() +{ + bool outfit_is_dirty = LLAppearanceMgr::getInstance()->isOutfitDirty(); + bool outfit_locked = LLAppearanceMgr::getInstance()->isOutfitLocked(); + bool has_baseoutfit = LLAppearanceMgr::getInstance()->getBaseOutfitUUID().notNull(); + + mSaveComboBtn->setSaveBtnEnabled(!outfit_locked && outfit_is_dirty); + childSetEnabled(REVERT_BTN, outfit_is_dirty && has_baseoutfit); + + mSaveComboBtn->setMenuItemEnabled("save_outfit", !outfit_locked && outfit_is_dirty); + + mStatus->setText(outfit_is_dirty ? getString("unsaved_changes") : getString("now_editing")); + + updateCurrentOutfitName(); +} + +bool LLPanelOutfitEdit::switchPanels(LLPanel* switch_from_panel, LLPanel* switch_to_panel) +{ + if(switch_from_panel && switch_to_panel && !switch_to_panel->getVisible()) + { + switch_from_panel->setVisible(FALSE); + switch_to_panel->setVisible(TRUE); + return true; + } + return false; +} + +void LLPanelOutfitEdit::onGearButtonClick(LLUICtrl* clicked_button) +{ + if(!mGearMenu) + { + mGearMenu = LLPanelOutfitEditGearMenu::create(); + } + + S32 menu_y = mGearMenu->getRect().getHeight() + clicked_button->getRect().getHeight(); + LLMenuGL::showPopup(clicked_button, mGearMenu, 0, menu_y); +} + +void LLPanelOutfitEdit::onAddMoreButtonClicked() +{ + toggleAddWearablesPanel(); + filterWearablesBySelectedItem(); +} + +void LLPanelOutfitEdit::showFilteredWearablesListView(LLWearableType::EType type) +{ + showAddWearablesPanel(true); + showWearablesListView(); + + //e_list_view_item_type implicitly contains LLWearableType::EType starting from LVIT_SHAPE + applyListViewFilter((EListViewItemType) (LVIT_SHAPE + type)); +} + +static void update_status_widget_rect(LLView * widget, S32 right_border) +{ + LLRect rect = widget->getRect(); + rect.mRight = right_border; + + widget->setShape(rect); +} + +void LLPanelOutfitEdit::onOutfitChanging(bool started) +{ + static LLLoadingIndicator* indicator = getChild<LLLoadingIndicator>("edit_outfit_loading_indicator"); + static LLView* status_panel = getChild<LLView>("outfit_name_and_status"); + static S32 indicator_delta = status_panel->getRect().getWidth() - indicator->getRect().mLeft; + + S32 delta = started ? indicator_delta : 0; + S32 right_border = status_panel->getRect().getWidth() - delta; + + update_status_widget_rect(mCurrentOutfitName, right_border); + update_status_widget_rect(mStatus, right_border); + + indicator->setVisible(started); +} + +// EOF diff --git a/indra/newview/llpaneloutfitedit.h b/indra/newview/llpaneloutfitedit.h new file mode 100644 index 0000000000..484f3fcb9f --- /dev/null +++ b/indra/newview/llpaneloutfitedit.h @@ -0,0 +1,229 @@ +/** + * @file llpaneloutfitedit.h + * @brief Displays outfit edit information in Side Tray. + * + * $LicenseInfo:firstyear=2009&license=viewergpl$ + * + * Copyright (c) 2004-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLPANELOUTFITEDIT_H +#define LL_LLPANELOUTFITEDIT_H + +#include "llpanel.h" + +#include "v3dmath.h" +#include "lluuid.h" + +#include "lliconctrl.h" + +#include "llremoteparcelrequest.h" +#include "llinventory.h" +#include "llinventoryfunctions.h" +#include "llinventoryitemslist.h" +#include "llinventorymodel.h" + +class LLButton; +class LLCOFWearables; +class LLComboBox; +class LLTextBox; +class LLInventoryCategory; +class LLOutfitObserver; +class LLCOFDragAndDropObserver; +class LLInventoryPanel; +class LLSaveFolderState; +class LLFolderViewItem; +class LLScrollListCtrl; +class LLToggleableMenu; +class LLFilterEditor; +class LLFilteredWearableListManager; +class LLMenuGL; +class LLFindNonLinksByMask; +class LLFindWearablesOfType; +class LLSaveOutfitComboBtn; + +class LLPanelOutfitEdit : public LLPanel +{ + LOG_CLASS(LLPanelOutfitEdit); +public: + + // NOTE: initialize mFolderViewItemTypes at the index of any new enum you add in the LLPanelOutfitEdit() constructor + typedef enum e_folder_view_item_type + { + FVIT_ALL = 0, + FVIT_WEARABLE, // clothing or shape + FVIT_ATTACHMENT, + NUM_FOLDER_VIEW_ITEM_TYPES + } EFolderViewItemType; + + //should reflect order from LLWearableType::EType + typedef enum e_list_view_item_type + { + LVIT_ALL = 0, + LVIT_CLOTHING, + LVIT_BODYPART, + LVIT_ATTACHMENT, + LVIT_SHAPE, + LVIT_SKIN, + LVIT_HAIR, + LVIT_EYES, + LVIT_SHIRT, + LVIT_PANTS, + LVIT_SHOES, + LVIT_SOCKS, + LVIT_JACKET, + LVIT_GLOVES, + LVIT_UNDERSHIRT, + LVIT_UNDERPANTS, + LVIT_SKIRT, + LVIT_ALPHA, + LVIT_TATTOO, + NUM_LIST_VIEW_ITEM_TYPES + } EListViewItemType; + + struct LLLookItemType { + std::string displayName; + U64 inventoryMask; + LLLookItemType() : displayName("NONE"), inventoryMask(0) {} + LLLookItemType(std::string name, U64 mask) : displayName(name), inventoryMask(mask) {} + }; + + struct LLFilterItem { + std::string displayName; + LLInventoryCollectFunctor* collector; + LLFilterItem() : displayName("NONE"), collector(NULL) {} + LLFilterItem(std::string name, LLInventoryCollectFunctor* _collector) : displayName(name), collector(_collector) {} + ~LLFilterItem() { delete collector; } + + //the struct is not supposed to by copied, either way the destructor kills collector + //LLPointer is not used as it requires LLInventoryCollectFunctor to extend LLRefCount what it doesn't do + private: + LLFilterItem(const LLFilterItem& filter_item) {}; + }; + + LLPanelOutfitEdit(); + /*virtual*/ ~LLPanelOutfitEdit(); + + /*virtual*/ BOOL postBuild(); + /*virtual*/ void onOpen(const LLSD& key); + + void moveWearable(bool closer_to_body); + + void toggleAddWearablesPanel(); + void showAddWearablesPanel(bool show__add_wearables); + + //following methods operate with "add wearables" panel + void showWearablesFilter(); + void showWearablesListView(); + void showWearablesFolderView(); + + void updateFiltersVisibility(); + + void onFolderViewFilterCommitted(LLUICtrl* ctrl); + void onListViewFilterCommitted(LLUICtrl* ctrl); + void onSearchEdit(const std::string& string); + void onInventorySelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action); + void onAddToOutfitClicked(void); + + void applyFolderViewFilter(EFolderViewItemType type); + void applyListViewFilter(EListViewItemType type); + + /** + * Filter items in views of Add Wearables Panel and show appropriate view depending on currently selected COF item(s) + * No COF items selected - shows the folder view, reset filter + * 1 COF item selected - shows the list view and filters wearables there by a wearable type of the selected item + * More than 1 COF item selected - shows the list view and filters it by a type of the selected item (attachment or clothing) + */ + void filterWearablesBySelectedItem(void); + + void onRemoveFromOutfitClicked(void); + void onEditWearableClicked(void); + void onAddWearableClicked(void); + void onReplaceBodyPartMenuItemClicked(LLUUID selected_item_id); + void onShopButtonClicked(); + + void displayCurrentOutfit(); + void updateCurrentOutfitName(); + + void update(); + + void updateVerbs(); + /** + * @brief Helper function. Shows one panel instead of another. + * If panels already switched does nothing and returns false. + * @param switch_from_panel panel to hide + * @param switch_to_panel panel to show + * @retun returns true if switching happened, false if not. + */ + bool switchPanels(LLPanel* switch_from_panel, LLPanel* switch_to_panel); + + virtual BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, + EDragAndDropType cargo_type, + void* cargo_data, + EAcceptance* accept, + std::string& tooltip_msg); + +private: + + void onGearButtonClick(LLUICtrl* clicked_button); + void onAddMoreButtonClicked(); + void showFilteredWearablesListView(LLWearableType::EType type); + void onOutfitChanging(bool started); + + + LLTextBox* mCurrentOutfitName; + LLTextBox* mStatus; + LLInventoryPanel* mInventoryItemsPanel; + LLFilterEditor* mSearchFilter; + LLSaveFolderState* mSavedFolderState; + std::string mSearchString; + LLButton* mEditWearableBtn; + LLButton* mFolderViewBtn; + LLButton* mListViewBtn; + LLPanel* mAddWearablesPanel; + + LLComboBox* mFolderViewFilterCmbBox; + LLComboBox* mListViewFilterCmbBox; + + LLFilteredWearableListManager* mWearableListManager; + LLInventoryItemsList* mWearableItemsList; + LLPanel* mWearablesListViewPanel; + + LLCOFDragAndDropObserver* mCOFDragAndDropObserver; + + std::vector<LLLookItemType> mFolderViewItemTypes; + std::vector<LLFilterItem*> mListViewItemTypes; + + LLCOFWearables* mCOFWearables; + LLMenuGL* mGearMenu; + bool mInitialized; + std::auto_ptr<LLSaveOutfitComboBtn> mSaveComboBtn; + + + +}; + +#endif // LL_LLPANELOUTFITEDIT_H diff --git a/indra/newview/llpaneloutfitsinventory.cpp b/indra/newview/llpaneloutfitsinventory.cpp index c2f2d32142..714d9cd4c5 100644 --- a/indra/newview/llpaneloutfitsinventory.cpp +++ b/indra/newview/llpaneloutfitsinventory.cpp @@ -42,11 +42,17 @@ #include "llfloaterworldmap.h" #include "llfloaterinventory.h" #include "llfoldervieweventlistener.h" +#include "llinventorybridge.h" #include "llinventoryfunctions.h" +#include "llinventorymodelbackgroundfetch.h" #include "llinventorypanel.h" #include "lllandmark.h" #include "lllineeditor.h" #include "llmodaldialog.h" +#include "llnotificationsutil.h" +#include "lloutfitobserver.h" +#include "lloutfitslist.h" +#include "llsaveoutfitcombobtn.h" #include "llsidepanelappearance.h" #include "llsidetray.h" #include "lltabcontainer.h" @@ -65,97 +71,214 @@ static const std::string OUTFITS_TAB_NAME = "outfitslist_tab"; static const std::string COF_TAB_NAME = "cof_tab"; static LLRegisterPanelClassWrapper<LLPanelOutfitsInventory> t_inventory("panel_outfits_inventory"); -bool LLPanelOutfitsInventory::sShowDebugEditor = false; -class LLOutfitSaveAsDialog : public LLModalDialog +class LLOutfitListGearMenu { +public: + LLOutfitListGearMenu(LLOutfitsList* olist) + : mOutfitList(olist), + mMenu(NULL) + { + llassert_always(mOutfitList); + + LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar; + LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar; + + registrar.add("Gear.Wear", boost::bind(&LLOutfitListGearMenu::onWear, this)); + registrar.add("Gear.TakeOff", boost::bind(&LLOutfitListGearMenu::onTakeOff, this)); + registrar.add("Gear.Delete", boost::bind(&LLOutfitListGearMenu::onDelete, this)); + registrar.add("Gear.Create", boost::bind(&LLOutfitListGearMenu::onCreate, this, _2)); + + enable_registrar.add("Gear.OnEnable", boost::bind(&LLOutfitListGearMenu::onEnable, this, _2)); + enable_registrar.add("Gear.OnVisible", boost::bind(&LLOutfitListGearMenu::onVisible, this, _2)); + + mMenu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>( + "menu_outfit_gear.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); + llassert(mMenu); + } + + LLMenuGL* getMenu() { return mMenu; } + + void show(LLView* spawning_view) + { + if (!mMenu) return; + + updateItemsVisibility(); + mMenu->buildDrawLabels(); + mMenu->updateParent(LLMenuGL::sMenuContainer); + S32 menu_x = 0; + S32 menu_y = spawning_view->getRect().getHeight() + mMenu->getRect().getHeight(); + LLMenuGL::showPopup(spawning_view, mMenu, menu_x, menu_y); + } + + void updateItemsVisibility() + { + if (!mMenu) return; + + bool have_selection = getSelectedOutfitID().notNull(); + mMenu->setItemVisible("sepatator1", have_selection); + mMenu->setItemVisible("sepatator2", have_selection); + mMenu->arrangeAndClear(); // update menu height + } + private: - std::string mItemName; - std::string mTempItemName; - - boost::signals2::signal<void (const std::string&)> mSaveAsSignal; + const LLUUID& getSelectedOutfitID() + { + return mOutfitList->getSelectedOutfitUUID(); + } -public: - LLOutfitSaveAsDialog( const LLSD& key ) - : LLModalDialog( key ), - mTempItemName(key.asString()) + LLViewerInventoryCategory* getSelectedOutfit() + { + const LLUUID& selected_outfit_id = getSelectedOutfitID(); + if (selected_outfit_id.isNull()) + { + return NULL; + } + + LLViewerInventoryCategory* cat = gInventory.getCategory(selected_outfit_id); + return cat; + } + + void onWear() { + LLViewerInventoryCategory* selected_outfit = getSelectedOutfit(); + if (selected_outfit) + { + LLAppearanceMgr::instance().wearInventoryCategory( + selected_outfit, /*copy=*/ FALSE, /*append=*/ FALSE); + } } - - BOOL postBuild() + + void onTakeOff() { - getChild<LLUICtrl>("Save")->setCommitCallback(boost::bind(&LLOutfitSaveAsDialog::onSave, this )); - getChild<LLUICtrl>("Cancel")->setCommitCallback(boost::bind(&LLOutfitSaveAsDialog::onCancel, this )); - - childSetTextArg("name ed", "[DESC]", mTempItemName); - return TRUE; + const LLUUID& selected_outfit_id = getSelectedOutfitID(); + if (selected_outfit_id.notNull()) + { + LLAppearanceMgr::instance().takeOffOutfit(selected_outfit_id); + } } - void setSaveAsCommit( const boost::signals2::signal<void (const std::string&)>::slot_type& cb ) + void onDelete() { - mSaveAsSignal.connect(cb); + const LLUUID& selected_outfit_id = getSelectedOutfitID(); + if (selected_outfit_id.notNull()) + { + remove_category(&gInventory, selected_outfit_id); + } } - virtual void onOpen(const LLSD& key) + void onCreate(const LLSD& data) { - LLLineEditor* edit = getChild<LLLineEditor>("name ed"); - if (edit) + LLWearableType::EType type = LLWearableType::typeNameToType(data.asString()); + if (type == LLWearableType::WT_NONE) { - edit->setFocus(TRUE); - edit->selectAll(); + llwarns << "Invalid wearable type" << llendl; + return; } + + LLAgentWearables::createWearable(type, true); } - void onSave() + bool onEnable(LLSD::String param) { - mItemName = childGetValue("name ed").asString(); - LLStringUtil::trim(mItemName); - if( !mItemName.empty() ) + const LLUUID& selected_outfit_id = getSelectedOutfitID(); + if (selected_outfit_id.isNull()) // no selection or invalid outfit selected { - mSaveAsSignal(mItemName); - closeFloater(); // destroys this object + return false; } + + if ("delete" == param) + { + return LLAppearanceMgr::instance().getCanRemoveOutfit(selected_outfit_id); + } + else if ("take_off" == param) + { + return LLAppearanceMgr::getCanRemoveFromCOF(selected_outfit_id); + } + + return true; } - void onCancel() + bool onVisible(LLSD::String param) { - closeFloater(); // destroys this object + const LLUUID& selected_outfit_id = getSelectedOutfitID(); + if (selected_outfit_id.isNull()) // no selection or invalid outfit selected + { + return false; + } + + bool is_worn = LLAppearanceMgr::instance().getBaseOutfitUUID() == selected_outfit_id; + + if ("wear" == param) + { + return !is_worn; + } + + return true; } + + LLOutfitsList* mOutfitList; + LLMenuGL* mMenu; }; - + LLPanelOutfitsInventory::LLPanelOutfitsInventory() : - mActivePanel(NULL), - mParent(NULL) + mMyOutfitsPanel(NULL), + mCurrentOutfitPanel(NULL), + mGearMenu(NULL), + mInitialized(false) { mSavedFolderState = new LLSaveFolderState(); mSavedFolderState->setApply(FALSE); + gAgentWearables.addLoadedCallback(boost::bind(&LLPanelOutfitsInventory::onWearablesLoaded, this)); + gAgentWearables.addLoadingStartedCallback(boost::bind(&LLPanelOutfitsInventory::onWearablesLoading, this)); - static bool registered_dialog = false; - if (!registered_dialog) - { - LLFloaterReg::add("outfit_save_as", "floater_outfit_save_as.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLOutfitSaveAsDialog>); - registered_dialog = true; - } + LLOutfitObserver& observer = LLOutfitObserver::instance(); + observer.addBOFChangedCallback(boost::bind(&LLPanelOutfitsInventory::updateVerbs, this)); + observer.addCOFChangedCallback(boost::bind(&LLPanelOutfitsInventory::updateVerbs, this)); + observer.addOutfitLockChangedCallback(boost::bind(&LLPanelOutfitsInventory::updateVerbs, this)); } LLPanelOutfitsInventory::~LLPanelOutfitsInventory() { + delete mGearMenu; delete mSavedFolderState; } // virtual BOOL LLPanelOutfitsInventory::postBuild() { - sShowDebugEditor = gSavedSettings.getBOOL("ShowDebugAppearanceEditor"); initTabPanels(); initListCommandsHandlers(); + // Fetch your outfits folder so that the links are in memory. + // ( This is only necessary if we want to show a warning if a user deletes an item that has a + // a link in an outfit, see "ConfirmItemDeleteHasLinks". ) + const LLUUID &outfits_cat = gInventory.findCategoryUUIDForType(LLFolderType::FT_OUTFIT, false); + if (outfits_cat.notNull()) + { + LLInventoryModelBackgroundFetch::instance().start(outfits_cat); + } + + mSaveComboBtn.reset(new LLSaveOutfitComboBtn(this, true)); + return TRUE; } // virtual void LLPanelOutfitsInventory::onOpen(const LLSD& key) { + if (!mInitialized) + { + LLSidepanelAppearance* panel_appearance = getAppearanceSP(); + if (panel_appearance) + { + // *TODO: move these methods to LLPanelOutfitsInventory? + panel_appearance->fetchInventory(); + panel_appearance->refreshCurrentOutfitName(); + } + mInitialized = true; + } + // Make sure we know which tab is selected, update the filter, // and update verbs. onTabChange(); @@ -184,30 +307,27 @@ void LLPanelOutfitsInventory::onOpen(const LLSD& key) void LLPanelOutfitsInventory::updateVerbs() { - if (mParent) - { - mParent->updateVerbs(); - } - if (mListCommands) { - mListCommands->childSetVisible("look_edit_btn",sShowDebugEditor); updateListCommands(); } } -void LLPanelOutfitsInventory::setParent(LLSidepanelAppearance* parent) -{ - mParent = parent; -} - // virtual void LLPanelOutfitsInventory::onSearchEdit(const std::string& string) { mFilterSubString = string; + + // TODO: add handling "My Outfits" tab. + if (!isCOFPanelActive()) + { + mMyOutfitsPanel->setFilterSubString(string); + return; + } + if (string == "") { - mActivePanel->setFilterSubString(LLStringUtil::null); + getActivePanel()->setFilterSubString(LLStringUtil::null); // re-open folders that were initially open mSavedFolderState->setApply(TRUE); @@ -217,9 +337,9 @@ void LLPanelOutfitsInventory::onSearchEdit(const std::string& string) getRootFolder()->scrollToShowSelection(); } - gInventory.startBackgroundFetch(); + LLInventoryModelBackgroundFetch::instance().start(); - if (mActivePanel->getFilterSubString().empty() && string.empty()) + if (getActivePanel()->getFilterSubString().empty() && string.empty()) { // current filter and new filter empty, do nothing return; @@ -233,24 +353,42 @@ void LLPanelOutfitsInventory::onSearchEdit(const std::string& string) } // set new filter string - mActivePanel->setFilterSubString(string); + getActivePanel()->setFilterSubString(string); } void LLPanelOutfitsInventory::onWearButtonClick() { - LLFolderViewEventListener* listenerp = getCorrectListenerForAction(); - if (listenerp) + // TODO: Remove if/else, add common interface + // for "My Outfits" and "Wearing" tabs. + if (!isCOFPanelActive()) + { + mMyOutfitsPanel->performAction("replaceoutfit"); + } + else { - listenerp->performAction(NULL, NULL,"replaceoutfit"); + LLFolderViewEventListener* listenerp = getCorrectListenerForAction(); + if (listenerp) + { + listenerp->performAction(NULL, "replaceoutfit"); + } } } void LLPanelOutfitsInventory::onAdd() { - LLFolderViewEventListener* listenerp = getCorrectListenerForAction(); - if (listenerp) + // TODO: Remove if/else, add common interface + // for "My Outfits" and "Wearing" tabs. + if (!isCOFPanelActive()) + { + mMyOutfitsPanel->performAction("addtooutfit"); + } + else { - listenerp->performAction(NULL, NULL,"addtooutfit"); + LLFolderViewEventListener* listenerp = getCorrectListenerForAction(); + if (listenerp) + { + listenerp->performAction(NULL, "addtooutfit"); + } } } @@ -259,7 +397,7 @@ void LLPanelOutfitsInventory::onRemove() LLFolderViewEventListener* listenerp = getCorrectListenerForAction(); if (listenerp) { - listenerp->performAction(NULL, NULL,"removefromoutfit"); + listenerp->performAction(NULL, "removefromoutfit"); } } @@ -267,37 +405,70 @@ void LLPanelOutfitsInventory::onEdit() { } +bool LLPanelOutfitsInventory::onSaveCommit(const LLSD& notification, const LLSD& response) +{ + S32 option = LLNotificationsUtil::getSelectedOption(notification, response); + if (0 == option) + { + std::string outfit_name = response["message"].asString(); + LLStringUtil::trim(outfit_name); + if( !outfit_name.empty() ) + { + LLUUID outfit_folder = LLAppearanceMgr::getInstance()->makeNewOutfitLinks(outfit_name); + + LLSidepanelAppearance* panel_appearance = getAppearanceSP(); + if (panel_appearance) + { + panel_appearance->showOutfitsInventoryPanel(); + } + + if (mAppearanceTabs) + { + mAppearanceTabs->selectTabByName(OUTFITS_TAB_NAME); + } + } + } + + return false; +} + + + void LLPanelOutfitsInventory::onSave() { std::string outfit_name; - if (!LLAppearanceManager::getInstance()->getBaseOutfitName(outfit_name)) + if (!LLAppearanceMgr::getInstance()->getBaseOutfitName(outfit_name)) { outfit_name = LLViewerFolderType::lookupNewCategoryName(LLFolderType::FT_OUTFIT); } + LLSD args; + args["DESC"] = outfit_name; + + LLSD payload; + //payload["ids"].append(*it); + + LLNotificationsUtil::add("SaveOutfitAs", args, payload, boost::bind(&LLPanelOutfitsInventory::onSaveCommit, this, _1, _2)); + + //) + +/* LLOutfitSaveAsDialog* save_as_dialog = LLFloaterReg::showTypedInstance<LLOutfitSaveAsDialog>("outfit_save_as", LLSD(outfit_name), TRUE); if (save_as_dialog) { save_as_dialog->setSaveAsCommit(boost::bind(&LLPanelOutfitsInventory::onSaveCommit, this, _1 )); - } -} - -void LLPanelOutfitsInventory::onSaveCommit(const std::string& outfit_name) -{ - LLUUID outfit_folder = gAgentWearables.makeNewOutfitLinks(outfit_name); - LLSD key; - LLSideTray::getInstance()->showPanel("panel_outfits_inventory", key); - - if (mAppearanceTabs) - { - mAppearanceTabs->selectTabByName(OUTFITS_TAB_NAME); - } + }*/ } void LLPanelOutfitsInventory::onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action) { updateVerbs(); + + // TODO: add handling "My Outfits" tab. + if (!isCOFPanelActive()) + return; + if (getRootFolder()->needsAutoRename() && items.size()) { getRootFolder()->startRenamingSelectedItem(); @@ -305,23 +476,12 @@ void LLPanelOutfitsInventory::onSelectionChange(const std::deque<LLFolderViewIte } } -void LLPanelOutfitsInventory::onSelectorButtonClicked() -{ - LLFolderViewItem* cur_item = getRootFolder()->getCurSelectedItem(); - - LLFolderViewEventListener* listenerp = cur_item->getListener(); - if (getIsCorrectType(listenerp)) - { - LLSD key; - key["type"] = "look"; - key["id"] = listenerp->getUUID(); - - LLSideTray::getInstance()->showPanel("sidepanel_appearance", key); - } -} - LLFolderViewEventListener *LLPanelOutfitsInventory::getCorrectListenerForAction() { + // TODO: add handling "My Outfits" tab. + if (!isCOFPanelActive()) + return NULL; + LLFolderViewItem* current_item = getRootFolder()->getCurSelectedItem(); if (!current_item) return NULL; @@ -349,7 +509,13 @@ bool LLPanelOutfitsInventory::getIsCorrectType(const LLFolderViewEventListener * LLFolderView *LLPanelOutfitsInventory::getRootFolder() { - return mActivePanel->getRootFolder(); + return getActivePanel()->getRootFolder(); +} + +//static +LLPanelOutfitsInventory* LLPanelOutfitsInventory::findInstance() +{ + return dynamic_cast<LLPanelOutfitsInventory*>(LLSideTray::getInstance()->getPanel("panel_outfits_inventory")); } ////////////////////////////////////////////////////////////////////////////////// @@ -359,13 +525,10 @@ void LLPanelOutfitsInventory::initListCommandsHandlers() { mListCommands = getChild<LLPanel>("bottom_panel"); - mListCommands->childSetAction("options_gear_btn", boost::bind(&LLPanelOutfitsInventory::onGearButtonClick, this)); + mListCommands->childSetAction("options_gear_btn", boost::bind(&LLPanelOutfitsInventory::showGearMenu, this)); mListCommands->childSetAction("trash_btn", boost::bind(&LLPanelOutfitsInventory::onTrashButtonClick, this)); - mListCommands->childSetAction("make_outfit_btn", boost::bind(&LLPanelOutfitsInventory::onAddButtonClick, this)); mListCommands->childSetAction("wear_btn", boost::bind(&LLPanelOutfitsInventory::onWearButtonClick, this)); - mListCommands->childSetAction("look_edit_btn", boost::bind(&LLPanelOutfitsInventory::onSelectorButtonClicked, this)); - LLDragAndDropButton* trash_btn = mListCommands->getChild<LLDragAndDropButton>("trash_btn"); trash_btn->setDragAndDropHandler(boost::bind(&LLPanelOutfitsInventory::handleDragAndDropToTrash, this , _4 // BOOL drop @@ -373,48 +536,28 @@ void LLPanelOutfitsInventory::initListCommandsHandlers() , _7 // EAcceptance* accept )); - mCommitCallbackRegistrar.add("panel_outfits_inventory_gear_default.Custom.Action", - boost::bind(&LLPanelOutfitsInventory::onCustomAction, this, _2)); - mEnableCallbackRegistrar.add("panel_outfits_inventory_gear_default.Enable", - boost::bind(&LLPanelOutfitsInventory::isActionEnabled, this, _2)); - mMenuGearDefault = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("panel_outfits_inventory_gear_default.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); + mGearMenu = new LLOutfitListGearMenu(mMyOutfitsPanel); } void LLPanelOutfitsInventory::updateListCommands() { bool trash_enabled = isActionEnabled("delete"); - bool wear_enabled = isActionEnabled("wear"); - bool make_outfit_enabled = isActionEnabled("make_outfit"); + bool wear_enabled = !gAgentWearables.isCOFChangeInProgress() && isActionEnabled("wear"); + bool wear_visible = !isCOFPanelActive(); + bool make_outfit_enabled = isActionEnabled("save_outfit"); mListCommands->childSetEnabled("trash_btn", trash_enabled); mListCommands->childSetEnabled("wear_btn", wear_enabled); - mListCommands->childSetVisible("wear_btn", wear_enabled); - mListCommands->childSetEnabled("make_outfit_btn", make_outfit_enabled); -} - -void LLPanelOutfitsInventory::onGearButtonClick() -{ - showActionMenu(mMenuGearDefault,"options_gear_btn"); + mListCommands->childSetVisible("wear_btn", wear_visible); + mSaveComboBtn->setMenuItemEnabled("save_outfit", make_outfit_enabled); } -void LLPanelOutfitsInventory::onAddButtonClick() +void LLPanelOutfitsInventory::showGearMenu() { - onSave(); -} + if (!mGearMenu) return; -void LLPanelOutfitsInventory::showActionMenu(LLMenuGL* menu, std::string spawning_view_name) -{ - if (menu) - { - menu->buildDrawLabels(); - menu->updateParent(LLMenuGL::sMenuContainer); - LLView* spawning_view = getChild<LLView> (spawning_view_name); - S32 menu_x, menu_y; - //show menu in co-ordinates of panel - spawning_view->localPointToOtherView(0, spawning_view->getRect().getHeight(), &menu_x, &menu_y, this); - menu_y += menu->getRect().getHeight(); - LLMenuGL::showPopup(this, menu, menu_x, menu_y); - } + LLView* spawning_view = getChild<LLView>("options_gear_btn"); + mGearMenu->show(spawning_view); } void LLPanelOutfitsInventory::onTrashButtonClick() @@ -425,7 +568,25 @@ void LLPanelOutfitsInventory::onTrashButtonClick() void LLPanelOutfitsInventory::onClipboardAction(const LLSD& userdata) { std::string command_name = userdata.asString(); - getActivePanel()->getRootFolder()->doToSelected(getActivePanel()->getModel(),command_name); + if (isCOFPanelActive()) + { + getActivePanel()->getRootFolder()->doToSelected(getActivePanel()->getModel(),command_name); + } + else // "My Outfits" tab active + { + if (command_name == "delete") + { + const LLUUID& selected_outfit_id = mMyOutfitsPanel->getSelectedOutfitUUID(); + if (selected_outfit_id.notNull()) + { + remove_category(&gInventory, selected_outfit_id); + } + } + else + { + llwarns << "Unrecognized action" << llendl; + } + } updateListCommands(); updateVerbs(); } @@ -479,32 +640,40 @@ BOOL LLPanelOutfitsInventory::isActionEnabled(const LLSD& userdata) if (command_name == "delete" || command_name == "remove") { BOOL can_delete = FALSE; - LLFolderView *folder = getActivePanel()->getRootFolder(); - if (folder) + + if (isCOFPanelActive()) { - std::set<LLUUID> selection_set; - folder->getSelectionList(selection_set); - can_delete = (selection_set.size() > 0); - for (std::set<LLUUID>::iterator iter = selection_set.begin(); - iter != selection_set.end(); - ++iter) + LLFolderView* root = getActivePanel()->getRootFolder(); + if (root) { - const LLUUID &item_id = (*iter); - LLFolderViewItem *item = folder->getItemByID(item_id); - can_delete &= item->getListener()->isItemRemovable(); + std::set<LLUUID> selection_set = root->getSelectionList(); + can_delete = (selection_set.size() > 0); + for (std::set<LLUUID>::iterator iter = selection_set.begin(); + iter != selection_set.end(); + ++iter) + { + const LLUUID &item_id = (*iter); + LLFolderViewItem *item = root->getItemByID(item_id); + can_delete &= item->getListener()->isItemRemovable(); + } } - return can_delete; } - return FALSE; + else // "My Outfits" tab active + { + const LLUUID& selected_outfit = mMyOutfitsPanel->getSelectedOutfitUUID(); + // first condition prevents trash btn from enabling when items are selected inside outfit (EXT-7847) + can_delete = !mMyOutfitsPanel->hasItemSelected() && LLAppearanceMgr::instance().getCanRemoveOutfit(selected_outfit); + } + + return can_delete; } if (command_name == "remove_link") { BOOL can_delete = FALSE; - LLFolderView *folder = getActivePanel()->getRootFolder(); - if (folder) + LLFolderView* root = getActivePanel()->getRootFolder(); + if (root) { - std::set<LLUUID> selection_set; - folder->getSelectionList(selection_set); + std::set<LLUUID> selection_set = root->getSelectionList(); can_delete = (selection_set.size() > 0); for (std::set<LLUUID>::iterator iter = selection_set.begin(); iter != selection_set.end(); @@ -531,10 +700,14 @@ BOOL LLPanelOutfitsInventory::isActionEnabled(const LLSD& userdata) { return FALSE; } + return hasItemsSelected(); } - if (command_name == "make_outfit") + if (command_name == "save_outfit") { - return TRUE; + bool outfit_locked = LLAppearanceMgr::getInstance()->isOutfitLocked(); + bool outfit_dirty =LLAppearanceMgr::getInstance()->isOutfitDirty(); + // allow save only if outfit isn't locked and is dirty + return !outfit_locked && outfit_dirty; } if (command_name == "edit" || @@ -549,12 +722,19 @@ BOOL LLPanelOutfitsInventory::isActionEnabled(const LLSD& userdata) bool LLPanelOutfitsInventory::hasItemsSelected() { bool has_items_selected = false; - LLFolderView *folder = getActivePanel()->getRootFolder(); - if (folder) + + if (isCOFPanelActive()) + { + LLFolderView* root = getActivePanel()->getRootFolder(); + if (root) + { + std::set<LLUUID> selection_set = root->getSelectionList(); + has_items_selected = (selection_set.size() > 0); + } + } + else // My Outfits Tab is active { - std::set<LLUUID> selection_set; - folder->getSelectionList(selection_set); - has_items_selected = (selection_set.size() > 0); + has_items_selected = mMyOutfitsPanel->getSelectedOutfitUUID().notNull(); } return has_items_selected; } @@ -581,74 +761,84 @@ bool LLPanelOutfitsInventory::handleDragAndDropToTrash(BOOL drop, EDragAndDropTy void LLPanelOutfitsInventory::initTabPanels() { - LLInventoryPanel *cof_panel = getChild<LLInventoryPanel>(COF_TAB_NAME); - cof_panel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS); - mTabPanels.push_back(cof_panel); + mCurrentOutfitPanel = getChild<LLInventoryPanel>(COF_TAB_NAME); + mCurrentOutfitPanel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS); + mCurrentOutfitPanel->setSelectCallback(boost::bind(&LLPanelOutfitsInventory::onTabSelectionChange, this, mCurrentOutfitPanel, _1, _2)); - LLInventoryPanel *myoutfits_panel = getChild<LLInventoryPanel>(OUTFITS_TAB_NAME); - myoutfits_panel->setFilterTypes(1LL << LLFolderType::FT_OUTFIT, LLInventoryFilter::FILTERTYPE_CATEGORY); - myoutfits_panel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS); - mTabPanels.push_back(myoutfits_panel); - - for (tabpanels_vec_t::iterator iter = mTabPanels.begin(); - iter != mTabPanels.end(); - ++iter) - { - LLInventoryPanel *panel = (*iter); - panel->setSelectCallback(boost::bind(&LLPanelOutfitsInventory::onTabSelectionChange, this, panel, _1, _2)); - } + mMyOutfitsPanel = getChild<LLOutfitsList>(OUTFITS_TAB_NAME); + mMyOutfitsPanel->addSelectionChangeCallback(boost::bind(&LLPanelOutfitsInventory::updateVerbs, this)); mAppearanceTabs = getChild<LLTabContainer>("appearance_tabs"); mAppearanceTabs->setCommitCallback(boost::bind(&LLPanelOutfitsInventory::onTabChange, this)); - mActivePanel = (LLInventoryPanel*)mAppearanceTabs->getCurrentPanel(); } void LLPanelOutfitsInventory::onTabSelectionChange(LLInventoryPanel* tab_panel, const std::deque<LLFolderViewItem*> &items, BOOL user_action) { if (user_action && items.size() > 0) { - for (tabpanels_vec_t::iterator iter = mTabPanels.begin(); - iter != mTabPanels.end(); - ++iter) + // TODO: add handling "My Outfits" tab. + if (isCOFPanelActive()) { - LLInventoryPanel *panel = (*iter); - if (panel == tab_panel) - { - mActivePanel = panel; - } - else - { - panel->getRootFolder()->clearSelection(); - } + onSelectionChange(items, user_action); + } + else + { + mCurrentOutfitPanel->getRootFolder()->clearSelection(); } } - onSelectionChange(items, user_action); } void LLPanelOutfitsInventory::onTabChange() { - mActivePanel = (LLInventoryPanel*)childGetVisibleTab("appearance_tabs"); - if (!mActivePanel) + // TODO: add handling "My Outfits" tab. + if (isCOFPanelActive()) { - return; + mCurrentOutfitPanel->setFilterSubString(mFilterSubString); + } + else + { + mMyOutfitsPanel->setFilterSubString(mFilterSubString); + mMyOutfitsPanel->onOpen(LLSD()); } - mActivePanel->setFilterSubString(mFilterSubString); + updateVerbs(); } BOOL LLPanelOutfitsInventory::isTabPanel(LLInventoryPanel *panel) const { - for(tabpanels_vec_t::const_iterator it = mTabPanels.begin(); - it != mTabPanels.end(); - ++it) + // TODO: add handling "My Outfits" tab. + if (mCurrentOutfitPanel == panel) { - if (*it == panel) - return TRUE; + return TRUE; } return FALSE; } BOOL LLPanelOutfitsInventory::isCOFPanelActive() const { - return (getActivePanel()->getName() == COF_TAB_NAME); + return (childGetVisibleTab("appearance_tabs")->getName() == COF_TAB_NAME); +} + +void LLPanelOutfitsInventory::setWearablesLoading(bool val) +{ + mListCommands->childSetEnabled("wear_btn", !val); +} + +void LLPanelOutfitsInventory::onWearablesLoaded() +{ + setWearablesLoading(false); +} + +void LLPanelOutfitsInventory::onWearablesLoading() +{ + setWearablesLoading(true); +} + +// static +LLSidepanelAppearance* LLPanelOutfitsInventory::getAppearanceSP() +{ + static LLSidepanelAppearance* panel_appearance = + dynamic_cast<LLSidepanelAppearance*> + (LLSideTray::getInstance()->getPanel("sidepanel_appearance")); + return panel_appearance; } diff --git a/indra/newview/llpaneloutfitsinventory.h b/indra/newview/llpaneloutfitsinventory.h index ab25ef0a49..eabfda7f8c 100644 --- a/indra/newview/llpaneloutfitsinventory.h +++ b/indra/newview/llpaneloutfitsinventory.h @@ -40,14 +40,18 @@ class LLFolderView; class LLFolderViewItem; class LLFolderViewEventListener; class LLInventoryPanel; +class LLOutfitsList; class LLSaveFolderState; class LLButton; class LLMenuGL; class LLSidepanelAppearance; class LLTabContainer; +class LLSaveOutfitComboBtn; +class LLOutfitListGearMenu; class LLPanelOutfitsInventory : public LLPanel { + LOG_CLASS(LLPanelOutfitsInventory); public: LLPanelOutfitsInventory(); virtual ~LLPanelOutfitsInventory(); @@ -61,45 +65,46 @@ public: void onEdit(); void onSave(); - void onSaveCommit(const std::string& item_name); + bool onSaveCommit(const LLSD& notification, const LLSD& response); void onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action); - void onSelectorButtonClicked(); // If a compatible listener type is selected, then return a pointer to that. // Otherwise, return NULL. LLFolderViewEventListener* getCorrectListenerForAction(); - void setParent(LLSidepanelAppearance *parent); LLFolderView* getRootFolder(); + static LLSidepanelAppearance* getAppearanceSP(); + + static LLPanelOutfitsInventory* findInstance(); protected: void updateVerbs(); bool getIsCorrectType(const LLFolderViewEventListener *listenerp) const; private: - LLSidepanelAppearance* mParent; LLSaveFolderState* mSavedFolderState; LLTabContainer* mAppearanceTabs; std::string mFilterSubString; - + std::auto_ptr<LLSaveOutfitComboBtn> mSaveComboBtn; public: ////////////////////////////////////////////////////////////////////////////////// // tab panels - LLInventoryPanel* getActivePanel() { return mActivePanel; } - const LLInventoryPanel* getActivePanel() const { return mActivePanel; } + // TODO: change getActivePanel() to return the active tab instead of returning + // a pointer to "Wearing" inventory panel. + LLInventoryPanel* getActivePanel() { return mCurrentOutfitPanel; } + BOOL isTabPanel(LLInventoryPanel *panel) const; - + BOOL isCOFPanelActive() const; + protected: void initTabPanels(); void onTabSelectionChange(LLInventoryPanel* tab_panel, const std::deque<LLFolderViewItem*> &items, BOOL user_action); void onTabChange(); - BOOL isCOFPanelActive() const; private: - LLInventoryPanel* mActivePanel; - typedef std::vector<LLInventoryPanel *> tabpanels_vec_t; - tabpanels_vec_t mTabPanels; + LLOutfitsList* mMyOutfitsPanel; + LLInventoryPanel* mCurrentOutfitPanel; // tab panels // //////////////////////////////////////////////////////////////////////////////// @@ -110,25 +115,26 @@ private: protected: void initListCommandsHandlers(); void updateListCommands(); - void onGearButtonClick(); void onWearButtonClick(); - void onAddButtonClick(); - void showActionMenu(LLMenuGL* menu, std::string spawning_view_name); + void showGearMenu(); void onTrashButtonClick(); void onClipboardAction(const LLSD& userdata); BOOL isActionEnabled(const LLSD& command_name); void onCustomAction(const LLSD& command_name); bool handleDragAndDropToTrash(BOOL drop, EDragAndDropType cargo_type, EAcceptance* accept); bool hasItemsSelected(); + void setWearablesLoading(bool val); + void onWearablesLoaded(); + void onWearablesLoading(); private: LLPanel* mListCommands; - LLMenuGL* mMenuGearDefault; + LLOutfitListGearMenu* mGearMenu; LLMenuGL* mMenuAdd; // List Commands // //////////////////////////////////////////////////////////////////////////////// /// -public: - static bool sShowDebugEditor; + + bool mInitialized; }; #endif //LL_LLPANELOUTFITSINVENTORY_H diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp index 423ee61e25..6dd800c0c6 100644 --- a/indra/newview/llpanelpeople.cpp +++ b/indra/newview/llpanelpeople.cpp @@ -36,6 +36,7 @@ #include "llfloaterreg.h" #include "llmenugl.h" #include "llnotificationsutil.h" +#include "lleventtimer.h" #include "llfiltereditor.h" #include "lltabcontainer.h" #include "lluictrlfactory.h" @@ -133,13 +134,13 @@ public: typedef std::map < LLUUID, LLVector3d > id_to_pos_map_t; LLAvatarItemDistanceComparator() {}; - void updateAvatarsPositions(std::vector<LLVector3d>& positions, std::vector<LLUUID>& uuids) + void updateAvatarsPositions(std::vector<LLVector3d>& positions, uuid_vec_t& uuids) { std::vector<LLVector3d>::const_iterator pos_it = positions.begin(), pos_end = positions.end(); - std::vector<LLUUID>::const_iterator + uuid_vec_t::const_iterator id_it = uuids.begin(), id_end = uuids.end(); @@ -177,8 +178,8 @@ public: protected: virtual bool doCompare(const LLAvatarListItem* item1, const LLAvatarListItem* item2) const { - LLPointer<LLSpeaker> lhs = LLLocalSpeakerMgr::instance().findSpeaker(item1->getAvatarId()); - LLPointer<LLSpeaker> rhs = LLLocalSpeakerMgr::instance().findSpeaker(item2->getAvatarId()); + LLPointer<LLSpeaker> lhs = LLActiveSpeakerMgr::instance().findSpeaker(item1->getAvatarId()); + LLPointer<LLSpeaker> rhs = LLActiveSpeakerMgr::instance().findSpeaker(item2->getAvatarId()); if ( lhs.notNull() && rhs.notNull() ) { // Compare by last speaking time @@ -442,6 +443,7 @@ public: LLPanelPeople::LLPanelPeople() : LLPanel(), mFilterSubString(LLStringUtil::null), + mFilterSubStringOrig(LLStringUtil::null), mFilterEditor(NULL), mTabContainer(NULL), mOnlineFriendList(NULL), @@ -462,8 +464,10 @@ LLPanelPeople::~LLPanelPeople() delete mFriendListUpdater; delete mRecentListUpdater; - if(LLVoiceClient::getInstance()) + if(LLVoiceClient::instanceExists()) + { LLVoiceClient::getInstance()->removeObserver(this); + } LLView::deleteViewByHandle(mGroupPlusMenuHandle); LLView::deleteViewByHandle(mNearbyViewSortMenuHandle); @@ -509,13 +513,19 @@ BOOL LLPanelPeople::postBuild() mNearbyList = getChild<LLPanel>(NEARBY_TAB_NAME)->getChild<LLAvatarList>("avatar_list"); mNearbyList->setNoItemsCommentText(getString("no_one_near")); + mNearbyList->setNoItemsMsg(getString("no_one_near")); + mNearbyList->setNoFilteredItemsMsg(getString("no_one_filtered_near")); mNearbyList->setShowIcons("NearbyListShowIcons"); mRecentList = getChild<LLPanel>(RECENT_TAB_NAME)->getChild<LLAvatarList>("avatar_list"); - mRecentList->setNoItemsCommentText(getString("no_people")); + mRecentList->setNoItemsCommentText(getString("no_recent_people")); + mRecentList->setNoItemsMsg(getString("no_recent_people")); + mRecentList->setNoFilteredItemsMsg(getString("no_filtered_recent_people")); mRecentList->setShowIcons("RecentListShowIcons"); mGroupList = getChild<LLGroupList>("group_list"); + mGroupList->setNoItemsMsg(getString("no_groups_msg")); + mGroupList->setNoFilteredItemsMsg(getString("no_filtered_groups_msg")); mNearbyList->setContextMenu(&LLPanelPeopleMenus::gNearbyMenu); mRecentList->setContextMenu(&LLPanelPeopleMenus::gNearbyMenu); @@ -614,7 +624,7 @@ BOOL LLPanelPeople::postBuild() if(recent_view_sort) mRecentViewSortMenuHandle = recent_view_sort->getHandle(); - gVoiceClient->addObserver(this); + LLVoiceClient::getInstance()->addObserver(this); // call this method in case some list is empty and buttons can be in inconsistent state updateButtons(); @@ -636,6 +646,25 @@ void LLPanelPeople::onChange(EStatusType status, const std::string &channelURI, updateButtons(); } +void LLPanelPeople::updateFriendListHelpText() +{ + // show special help text for just created account to help finding friends. EXT-4836 + static LLTextBox* no_friends_text = getChild<LLTextBox>("no_friends_help_text"); + + // Seems sometimes all_friends can be empty because of issue with Inventory loading (clear cache, slow connection...) + // So, lets check all lists to avoid overlapping the text with online list. See EXT-6448. + bool any_friend_exists = mAllFriendList->filterHasMatches() || mOnlineFriendList->filterHasMatches(); + no_friends_text->setVisible(!any_friend_exists); + if (no_friends_text->getVisible()) + { + //update help text for empty lists + std::string message_name = mFilterSubString.empty() ? "no_friends_msg" : "no_filtered_friends_msg"; + LLStringUtil::format_map_t args; + args["[SEARCH_TERM]"] = LLURI::escape(mFilterSubStringOrig); + no_friends_text->setText(getString(message_name, args)); + } +} + void LLPanelPeople::updateFriendList() { if (!mOnlineFriendList || !mAllFriendList) @@ -647,8 +676,8 @@ void LLPanelPeople::updateFriendList() av_tracker.copyBuddyList(all_buddies); // save them to the online and all friends vectors - LLAvatarList::uuid_vector_t& online_friendsp = mOnlineFriendList->getIDs(); - LLAvatarList::uuid_vector_t& all_friendsp = mAllFriendList->getIDs(); + uuid_vec_t& online_friendsp = mOnlineFriendList->getIDs(); + uuid_vec_t& all_friendsp = mAllFriendList->getIDs(); all_friendsp.clear(); online_friendsp.clear(); @@ -667,11 +696,6 @@ void LLPanelPeople::updateFriendList() lldebugs << "Friends Cards were not found" << llendl; } - // show special help text for just created account to help found friends. EXT-4836 - static LLTextBox* no_friends_text = getChild<LLTextBox>("no_friends_msg"); - no_friends_text->setVisible(all_friendsp.size() == 0); - - LLAvatarTracker::buddy_map_t::const_iterator buddy_it = all_buddies.begin(); for (; buddy_it != all_buddies.end(); ++buddy_it) { @@ -680,9 +704,15 @@ void LLPanelPeople::updateFriendList() online_friendsp.push_back(buddy_id); } - mOnlineFriendList->setDirty(); - mAllFriendList->setDirty(); - + /* + * Avatarlists will be hidden by showFriendsAccordionsIfNeeded(), if they do not have items. + * But avatarlist can be updated only if it is visible @see LLAvatarList::draw(); + * So we need to do force update of lists to avoid inconsistency of data and view of avatarlist. + */ + mOnlineFriendList->setDirty(true, !mOnlineFriendList->filterHasMatches());// do force update if list do NOT have items + mAllFriendList->setDirty(true, !mAllFriendList->filterHasMatches()); + //update trash and other buttons according to a selected item + updateButtons(); showFriendsAccordionsIfNeeded(); } @@ -697,7 +727,7 @@ void LLPanelPeople::updateNearbyList() mNearbyList->setDirty(); DISTANCE_COMPARATOR.updateAvatarsPositions(positions, mNearbyList->getIDs()); - LLLocalSpeakerMgr::instance().update(TRUE); + LLActiveSpeakerMgr::instance().update(TRUE); } void LLPanelPeople::updateRecentList() @@ -732,7 +762,7 @@ void LLPanelPeople::buttonSetAction(const std::string& btn_name, const commit_si bool LLPanelPeople::isFriendOnline(const LLUUID& id) { - LLAvatarList::uuid_vector_t ids = mOnlineFriendList->getIDs(); + uuid_vec_t ids = mOnlineFriendList->getIDs(); return std::find(ids.begin(), ids.end(), id) != ids.end(); } @@ -745,7 +775,7 @@ void LLPanelPeople::updateButtons() //bool recent_tab_active = (cur_tab == RECENT_TAB_NAME); LLUUID selected_id; - std::vector<LLUUID> selected_uuids; + uuid_vec_t selected_uuids; getCurrentItemIDs(selected_uuids); bool item_selected = (selected_uuids.size() == 1); bool multiple_selected = (selected_uuids.size() >= 1); @@ -795,7 +825,7 @@ void LLPanelPeople::updateButtons() } } - bool enable_calls = gVoiceClient->voiceWorking() && gVoiceClient->voiceEnabled(); + bool enable_calls = LLVoiceClient::getInstance()->isVoiceWorking() && LLVoiceClient::getInstance()->voiceEnabled(); buttonSetEnabled("teleport_btn", friends_tab_active && item_selected && isFriendOnline(selected_uuids.front())); buttonSetEnabled("view_profile_btn", item_selected); @@ -841,7 +871,7 @@ LLUUID LLPanelPeople::getCurrentItemID() const return LLUUID::null; } -void LLPanelPeople::getCurrentItemIDs(std::vector<LLUUID>& selected_uuids) const +void LLPanelPeople::getCurrentItemIDs(uuid_vec_t& selected_uuids) const { std::string cur_tab = getActiveTabName(); @@ -954,10 +984,11 @@ bool LLPanelPeople::isRealGroup() void LLPanelPeople::onFilterEdit(const std::string& search_string) { - std::string search_upper = search_string; + mFilterSubStringOrig = search_string; + LLStringUtil::trimHead(mFilterSubStringOrig); // Searches are case-insensitive + std::string search_upper = mFilterSubStringOrig; LLStringUtil::toUpper(search_upper); - LLStringUtil::trimHead(search_upper); if (mFilterSubString == search_upper) return; @@ -972,11 +1003,11 @@ void LLPanelPeople::onFilterEdit(const std::string& search_string) // Apply new filter. - mNearbyList->setNameFilter(mFilterSubString); - mOnlineFriendList->setNameFilter(mFilterSubString); - mAllFriendList->setNameFilter(mFilterSubString); - mRecentList->setNameFilter(mFilterSubString); - mGroupList->setNameFilter(mFilterSubString); + mNearbyList->setNameFilter(mFilterSubStringOrig); + mOnlineFriendList->setNameFilter(mFilterSubStringOrig); + mAllFriendList->setNameFilter(mFilterSubStringOrig); + mRecentList->setNameFilter(mFilterSubStringOrig); + mGroupList->setNameFilter(mFilterSubStringOrig); setAccordionCollapsedByUser("tab_online", false); setAccordionCollapsedByUser("tab_all", false); @@ -1052,10 +1083,10 @@ void LLPanelPeople::onAddFriendButtonClicked() } } -bool LLPanelPeople::isItemsFreeOfFriends(const std::vector<LLUUID>& uuids) +bool LLPanelPeople::isItemsFreeOfFriends(const uuid_vec_t& uuids) { const LLAvatarTracker& av_tracker = LLAvatarTracker::instance(); - for ( std::vector<LLUUID>::const_iterator + for ( uuid_vec_t::const_iterator id = uuids.begin(), id_end = uuids.end(); id != id_end; ++id ) @@ -1083,7 +1114,7 @@ void LLPanelPeople::onAddFriendWizButtonClicked() void LLPanelPeople::onDeleteFriendButtonClicked() { - std::vector<LLUUID> selected_uuids; + uuid_vec_t selected_uuids; getCurrentItemIDs(selected_uuids); if (selected_uuids.size() == 1) @@ -1110,7 +1141,7 @@ void LLPanelPeople::onChatButtonClicked() void LLPanelPeople::onImButtonClicked() { - std::vector<LLUUID> selected_uuids; + uuid_vec_t selected_uuids; getCurrentItemIDs(selected_uuids); if ( selected_uuids.size() == 1 ) { @@ -1132,7 +1163,7 @@ void LLPanelPeople::onActivateButtonClicked() // static void LLPanelPeople::onAvatarPicked( const std::vector<std::string>& names, - const std::vector<LLUUID>& ids) + const uuid_vec_t& ids) { if (!names.empty() && !ids.empty()) LLAvatarActions::requestFriendshipDialog(ids[0], names[0]); @@ -1282,7 +1313,7 @@ bool LLPanelPeople::onRecentViewSortMenuItemCheck(const LLSD& userdata) void LLPanelPeople::onCallButtonClicked() { - std::vector<LLUUID> selected_uuids; + uuid_vec_t selected_uuids; getCurrentItemIDs(selected_uuids); if (selected_uuids.size() == 1) @@ -1418,6 +1449,11 @@ void LLPanelPeople::showFriendsAccordionsIfNeeded() // Rearrange accordions LLAccordionCtrl* accordion = getChild<LLAccordionCtrl>("friends_accordion"); accordion->arrange(); + + // *TODO: new no_matched_tabs_text attribute was implemented in accordion (EXT-7368). + // this code should be refactored to use it + // keep help text in a synchronization with accordions visibility. + updateFriendListHelpText(); } } @@ -1431,9 +1467,6 @@ void LLPanelPeople::onFriendListRefreshComplete(LLUICtrl*ctrl, const LLSD& param { showAccordion("tab_all", param.asInteger()); } - - LLAccordionCtrl* accordion = getChild<LLAccordionCtrl>("friends_accordion"); - accordion->arrange(); } void LLPanelPeople::setAccordionCollapsedByUser(LLUICtrl* acc_tab, bool collapsed) diff --git a/indra/newview/llpanelpeople.h b/indra/newview/llpanelpeople.h index 6d3d436156..17c45a034b 100644 --- a/indra/newview/llpanelpeople.h +++ b/indra/newview/llpanelpeople.h @@ -73,17 +73,18 @@ private: } ESortOrder; // methods indirectly called by the updaters + void updateFriendListHelpText(); void updateFriendList(); void updateNearbyList(); void updateRecentList(); bool isFriendOnline(const LLUUID& id); - bool isItemsFreeOfFriends(const std::vector<LLUUID>& uuids); + bool isItemsFreeOfFriends(const uuid_vec_t& uuids); void updateButtons(); std::string getActiveTabName() const; LLUUID getCurrentItemID() const; - void getCurrentItemIDs(std::vector<LLUUID>& selected_uuids) const; + void getCurrentItemIDs(uuid_vec_t& selected_uuids) const; void buttonSetVisible(std::string btn_name, BOOL visible); void buttonSetEnabled(const std::string& btn_name, bool enabled); void buttonSetAction(const std::string& btn_name, const commit_signal_t::slot_type& cb); @@ -134,7 +135,7 @@ private: // misc callbacks static void onAvatarPicked( const std::vector<std::string>& names, - const std::vector<LLUUID>& ids); + const uuid_vec_t& ids); void onFriendsAccordionExpandedCollapsed(LLUICtrl* ctrl, const LLSD& param, LLAvatarList* avatar_list); @@ -168,6 +169,7 @@ private: Updater* mRecentListUpdater; std::string mFilterSubString; + std::string mFilterSubStringOrig; }; #endif //LL_LLPANELPEOPLE_H diff --git a/indra/newview/llpanelpeoplemenus.cpp b/indra/newview/llpanelpeoplemenus.cpp index 7e184c78a8..93be0bda9e 100644 --- a/indra/newview/llpanelpeoplemenus.cpp +++ b/indra/newview/llpanelpeoplemenus.cpp @@ -39,8 +39,10 @@ #include "llpanelpeoplemenus.h" // newview +#include "llagent.h" #include "llagentdata.h" // for gAgentID #include "llavataractions.h" +#include "llcallingcard.h" // for LLAvatarTracker #include "llviewermenu.h" // for gMenuHolder namespace LLPanelPeopleMenus @@ -48,64 +50,6 @@ namespace LLPanelPeopleMenus NearbyMenu gNearbyMenu; -//== ContextMenu ============================================================== - -ContextMenu::ContextMenu() -: mMenu(NULL) -{ -} - -ContextMenu::~ContextMenu() -{ - // do not forget delete LLContextMenu* mMenu. - // It can have registered Enable callbacks which are called from the LLMenuHolderGL::draw() - // via selected item (menu_item_call) by calling LLMenuItemCallGL::buildDrawLabel. - // we can have a crash via using callbacks of deleted instance of ContextMenu. EXT-4725 - - // menu holder deletes its menus on viewer exit, so we have no way to determine if instance - // of mMenu has already been deleted except of using LLHandle. EXT-4762. - if (!mMenuHandle.isDead()) - { - mMenu->die(); - mMenu = NULL; - } -} - -void ContextMenu::show(LLView* spawning_view, const std::vector<LLUUID>& uuids, S32 x, S32 y) -{ - if (mMenu) - { - //preventing parent (menu holder) from deleting already "dead" context menus on exit - LLView* parent = mMenu->getParent(); - if (parent) - { - parent->removeChild(mMenu); - } - delete mMenu; - mMenu = NULL; - mUUIDs.clear(); - } - - if ( uuids.empty() ) - return; - - mUUIDs.resize(uuids.size()); - std::copy(uuids.begin(), uuids.end(), mUUIDs.begin()); - - mMenu = createMenu(); - mMenuHandle = mMenu->getHandle(); - mMenu->show(x, y); - LLMenuGL::showPopup(spawning_view, mMenu, x, y); -} - -void ContextMenu::hide() -{ - if(mMenu) - { - mMenu->hide(); - } -} - //== NearbyMenu =============================================================== LLContextMenu* NearbyMenu::createMenu() @@ -121,10 +65,11 @@ LLContextMenu* NearbyMenu::createMenu() const LLUUID& id = mUUIDs.front(); registrar.add("Avatar.Profile", boost::bind(&LLAvatarActions::showProfile, id)); registrar.add("Avatar.AddFriend", boost::bind(&LLAvatarActions::requestFriendshipDialog, id)); + registrar.add("Avatar.RemoveFriend", boost::bind(&LLAvatarActions::removeFriendDialog, id)); registrar.add("Avatar.IM", boost::bind(&LLAvatarActions::startIM, id)); registrar.add("Avatar.Call", boost::bind(&LLAvatarActions::startCall, id)); registrar.add("Avatar.OfferTeleport", boost::bind(&NearbyMenu::offerTeleport, this)); - registrar.add("Avatar.ShowOnMap", boost::bind(&LLAvatarActions::startIM, id)); // *TODO: unimplemented + registrar.add("Avatar.ShowOnMap", boost::bind(&LLAvatarActions::showOnMap, id)); registrar.add("Avatar.Share", boost::bind(&LLAvatarActions::share, id)); registrar.add("Avatar.Pay", boost::bind(&LLAvatarActions::pay, id)); registrar.add("Avatar.BlockUnblock", boost::bind(&LLAvatarActions::toggleBlock, id)); @@ -133,8 +78,7 @@ LLContextMenu* NearbyMenu::createMenu() enable_registrar.add("Avatar.CheckItem", boost::bind(&NearbyMenu::checkContextMenuItem, this, _2)); // create the context menu from the XUI - return LLUICtrlFactory::getInstance()->createFromFile<LLContextMenu>( - "menu_people_nearby.xml", LLMenuGL::sMenuContainer, LLViewerMenuHolderGL::child_registry_t::instance()); + return createFromFile("menu_people_nearby.xml"); } else { @@ -143,14 +87,13 @@ LLContextMenu* NearbyMenu::createMenu() // registrar.add("Avatar.AddFriend", boost::bind(&LLAvatarActions::requestFriendshipDialog, mUUIDs)); // *TODO: unimplemented registrar.add("Avatar.IM", boost::bind(&LLAvatarActions::startConference, mUUIDs)); registrar.add("Avatar.Call", boost::bind(&LLAvatarActions::startAdhocCall, mUUIDs)); + registrar.add("Avatar.RemoveFriend",boost::bind(&LLAvatarActions::removeFriendsDialog, mUUIDs)); // registrar.add("Avatar.Share", boost::bind(&LLAvatarActions::startIM, mUUIDs)); // *TODO: unimplemented // registrar.add("Avatar.Pay", boost::bind(&LLAvatarActions::pay, mUUIDs)); // *TODO: unimplemented enable_registrar.add("Avatar.EnableItem", boost::bind(&NearbyMenu::enableContextMenuItem, this, _2)); // create the context menu from the XUI - return LLUICtrlFactory::getInstance()->createFromFile<LLContextMenu> - ("menu_people_nearby_multiselect.xml", LLMenuGL::sMenuContainer, LLViewerMenuHolderGL::child_registry_t::instance()); - + return createFromFile("menu_people_nearby_multiselect.xml"); } } @@ -172,9 +115,15 @@ bool NearbyMenu::enableContextMenuItem(const LLSD& userdata) // - there are selected people // - and there are no friends among selection yet. + //EXT-7389 - disable for more than 1 + if(mUUIDs.size() > 1) + { + return false; + } + bool result = (mUUIDs.size() > 0); - std::vector<LLUUID>::const_iterator + uuid_vec_t::const_iterator id = mUUIDs.begin(), uuids_end = mUUIDs.end(); @@ -191,13 +140,43 @@ bool NearbyMenu::enableContextMenuItem(const LLSD& userdata) } else if (item == std::string("can_delete")) { - const LLUUID& id = mUUIDs.front(); - return LLAvatarActions::isFriend(id); + // We can remove friends if: + // - there are selected people + // - and there are only friends among selection. + + bool result = (mUUIDs.size() > 0); + + uuid_vec_t::const_iterator + id = mUUIDs.begin(), + uuids_end = mUUIDs.end(); + + for (;id != uuids_end; ++id) + { + if ( !LLAvatarActions::isFriend(*id) ) + { + result = false; + break; + } + } + + return result; } else if (item == std::string("can_call")) { return LLAvatarActions::canCall(); } + else if (item == std::string("can_show_on_map")) + { + const LLUUID& id = mUUIDs.front(); + + return (LLAvatarTracker::instance().isBuddyOnline(id) && is_agent_mappable(id)) + || gAgent.isGodlike(); + } + else if(item == std::string("can_offer_teleport")) + { + const LLUUID& id = mUUIDs.front(); + return LLAvatarActions::canOfferTeleport(id); + } return false; } diff --git a/indra/newview/llpanelpeoplemenus.h b/indra/newview/llpanelpeoplemenus.h index 913638d8c8..e1f8790135 100644 --- a/indra/newview/llpanelpeoplemenus.h +++ b/indra/newview/llpanelpeoplemenus.h @@ -33,42 +33,15 @@ #ifndef LL_LLPANELPEOPLEMENUS_H #define LL_LLPANELPEOPLEMENUS_H -#include "llavatarlistitem.h" +#include "lllistcontextmenu.h" namespace LLPanelPeopleMenus { /** - * Base context menu. - */ -class ContextMenu : public LLAvatarListItem::ContextMenu -{ -public: - ContextMenu(); - virtual ~ContextMenu(); - - /** - * Show the menu at specified coordinates. - * - * @param uuids - an array of avatar or group ids - */ - /*virtual*/ void show(LLView* spawning_view, const std::vector<LLUUID>& uuids, S32 x, S32 y); - - virtual void hide(); - -protected: - - virtual LLContextMenu* createMenu() = 0; - - std::vector<LLUUID> mUUIDs; - LLContextMenu* mMenu; - LLHandle<LLView> mMenuHandle; -}; - -/** * Menu used in the nearby people list. */ -class NearbyMenu : public ContextMenu +class NearbyMenu : public LLListContextMenu { public: /*virtual*/ LLContextMenu* createMenu(); diff --git a/indra/newview/llpanelpermissions.cpp b/indra/newview/llpanelpermissions.cpp index 8b8b1bed37..71d16a08b4 100644 --- a/indra/newview/llpanelpermissions.cpp +++ b/indra/newview/llpanelpermissions.cpp @@ -142,9 +142,9 @@ LLPanelPermissions::LLPanelPermissions() : BOOL LLPanelPermissions::postBuild() { childSetCommitCallback("Object Name",LLPanelPermissions::onCommitName,this); - childSetPrevalidate("Object Name",LLLineEditor::prevalidateASCIIPrintableNoPipe); + childSetPrevalidate("Object Name",LLTextValidate::validateASCIIPrintableNoPipe); childSetCommitCallback("Object Description",LLPanelPermissions::onCommitDesc,this); - childSetPrevalidate("Object Description",LLLineEditor::prevalidateASCIIPrintableNoPipe); + childSetPrevalidate("Object Description",LLTextValidate::validateASCIIPrintableNoPipe); getChild<LLUICtrl>("button set group")->setCommitCallback(boost::bind(&LLPanelPermissions::onClickGroup,this)); @@ -195,8 +195,8 @@ void LLPanelPermissions::disableAll() childSetEnabled("Owner Name", FALSE); childSetEnabled("Group:", FALSE); - childSetText("Group Name", LLStringUtil::null); - childSetEnabled("Group Name", FALSE); + childSetText("Group Name Proxy", LLStringUtil::null); + childSetEnabled("Group Name Proxy", FALSE); childSetEnabled("button set group", FALSE); childSetText("Object Name", LLStringUtil::null); diff --git a/indra/newview/llpanelpick.cpp b/indra/newview/llpanelpick.cpp index 5ac0587550..f0dc493ebe 100644 --- a/indra/newview/llpanelpick.cpp +++ b/indra/newview/llpanelpick.cpp @@ -72,12 +72,6 @@ #define XML_BTN_ON_TXTR "edit_icon" #define XML_BTN_SAVE "save_changes_btn" -#define SAVE_BTN_LABEL "[WHAT]" -#define LABEL_PICK = "Pick" -#define LABEL_CHANGES = "Changes" - -std::string SET_LOCATION_NOTICE("(will update after save)"); - ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// @@ -150,8 +144,6 @@ BOOL LLPanelPickInfo::postBuild() { mSnapshotCtrl = getChild<LLTextureCtrl>(XML_SNAPSHOT); - childSetLabelArg(XML_BTN_SAVE, SAVE_BTN_LABEL, std::string("Pick")); - childSetAction("teleport_btn", boost::bind(&LLPanelPickInfo::onClickTeleport, this)); childSetAction("show_on_map_btn", boost::bind(&LLPanelPickInfo::onClickMap, this)); childSetAction("back_btn", boost::bind(&LLPanelPickInfo::onClickBack, this)); @@ -410,7 +402,7 @@ void LLPanelPickEdit::onOpen(const LLSD& key) childSetValue("pick_name", pick_name.empty() ? region_name : pick_name); childSetValue("pick_desc", pick_desc); setSnapshotId(snapshot_id); - setPickLocation(createLocationText(SET_LOCATION_NOTICE, pick_name, region_name, getPosGlobal())); + setPickLocation(createLocationText(getLocationNotice(), pick_name, region_name, getPosGlobal())); enableSaveButton(true); } @@ -578,7 +570,7 @@ void LLPanelPickEdit::onClickSetLocation() region_name = region->getName(); } - setPickLocation(createLocationText(SET_LOCATION_NOTICE, parcel_name, region_name, getPosGlobal())); + setPickLocation(createLocationText(getLocationNotice(), parcel_name, region_name, getPosGlobal())); mLocationChanged = true; enableSaveButton(TRUE); @@ -595,6 +587,12 @@ void LLPanelPickEdit::onClickSave() notifyParent(params); } +std::string LLPanelPickEdit::getLocationNotice() +{ + static std::string notice = getString("location_notice"); + return notice; +} + void LLPanelPickEdit::processProperties(void* data, EAvatarProcessorType type) { if(mNeedData) diff --git a/indra/newview/llpanelpick.h b/indra/newview/llpanelpick.h index 4f27760a8d..94ee2f83ab 100644 --- a/indra/newview/llpanelpick.h +++ b/indra/newview/llpanelpick.h @@ -248,6 +248,8 @@ protected: */ void onClickSave(); + std::string getLocationNotice(); + protected: bool mLocationChanged; diff --git a/indra/newview/llpanelpicks.cpp b/indra/newview/llpanelpicks.cpp index ada65c98a4..bde8d02885 100644 --- a/indra/newview/llpanelpicks.cpp +++ b/indra/newview/llpanelpicks.cpp @@ -140,10 +140,11 @@ public: params["open_tab_name"] = "panel_picks"; params["show_tab_panel"] = "classified_details"; params["classified_id"] = c_info->classified_id; - params["classified_avatar_id"] = c_info->creator_id; + params["classified_creator_id"] = c_info->creator_id; params["classified_snapshot_id"] = c_info->snapshot_id; params["classified_name"] = c_info->name; params["classified_desc"] = c_info->description; + params["from_search"] = true; LLSideTray::getInstance()->showPanel("panel_profile_view", params); } @@ -174,31 +175,6 @@ LLClassifiedHandler gClassifiedHandler; ////////////////////////////////////////////////////////////////////////// -/** - * Copy&Pasted from old LLPanelClassified. This class does nothing at the moment. - * Subscribing to "classifiedclickthrough" removes a few warnings. - */ -class LLClassifiedClickThrough : public LLDispatchHandler -{ -public: - - // "classifiedclickthrough" - // strings[0] = classified_id - // strings[1] = teleport_clicks - // strings[2] = map_clicks - // strings[3] = profile_clicks - virtual bool operator()( - const LLDispatcher* dispatcher, - const std::string& key, - const LLUUID& invoice, - const sparam_t& strings) - { - if (strings.size() != 4) - return false; - - return true; - } -}; //----------------------------------------------------------------------------- // LLPanelPicks @@ -216,13 +192,9 @@ LLPanelPicks::LLPanelPicks() mPicksAccTab(NULL), mClassifiedsAccTab(NULL), mPanelClassifiedInfo(NULL), - mPanelClassifiedEdit(NULL), - mClickThroughDisp(NULL), mNoClassifieds(false), mNoPicks(false) { - mClickThroughDisp = new LLClassifiedClickThrough(); - gGenericDispatcher.addHandler("classifiedclickthrough", mClickThroughDisp); } LLPanelPicks::~LLPanelPicks() @@ -231,8 +203,6 @@ LLPanelPicks::~LLPanelPicks() { LLAvatarPropertiesProcessor::getInstance()->removeObserver(getAvatarId(),this); } - - delete mClickThroughDisp; } void* LLPanelPicks::create(void* data /* = NULL */) @@ -318,7 +288,8 @@ void LLPanelPicks::processProperties(void* data, EAvatarProcessorType type) LLAvatarClassifieds* c_info = static_cast<LLAvatarClassifieds*>(data); if(c_info && getAvatarId() == c_info->target_id) { - mClassifiedsList->clear(); + // do not clear classified list in case we will receive two or more data packets. + // list has been cleared in updateData(). (fix for EXT-6436) LLAvatarClassifieds::classifieds_list_t::const_iterator it = c_info->classifieds_list.begin(); for(; c_info->classifieds_list.end() != it; ++it) @@ -351,7 +322,14 @@ void LLPanelPicks::processProperties(void* data, EAvatarProcessorType type) if (mNoPicks && mNoClassifieds) { - childSetValue("picks_panel_text", LLTrans::getString("NoPicksClassifiedsText")); + if(getAvatarId() == gAgentID) + { + childSetValue("picks_panel_text", LLTrans::getString("NoPicksClassifiedsText")); + } + else + { + childSetValue("picks_panel_text", LLTrans::getString("NoAvatarPicksClassifiedsText")); + } } } @@ -407,6 +385,9 @@ BOOL LLPanelPicks::postBuild() registar.add("Pick.Teleport", boost::bind(&LLPanelPicks::onClickTeleport, this)); registar.add("Pick.Map", boost::bind(&LLPanelPicks::onClickMap, this)); registar.add("Pick.Delete", boost::bind(&LLPanelPicks::onClickDelete, this)); + LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registar; + enable_registar.add("Pick.Enable", boost::bind(&LLPanelPicks::onEnableMenuItem, this, _2)); + mPopupMenu = LLUICtrlFactory::getInstance()->createFromFile<LLContextMenu>("menu_picks.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); LLUICtrl::CommitCallbackRegistry::ScopedRegistrar plus_registar; @@ -443,6 +424,22 @@ bool LLPanelPicks::isActionEnabled(const LLSD& userdata) const return true; } +bool LLPanelPicks::isClassifiedPublished(LLClassifiedItem* c_item) +{ + if(c_item) + { + LLPanelClassifiedEdit* panel = mEditClassifiedPanels[c_item->getClassifiedId()]; + if(panel) + { + return !panel->isNewWithErrors(); + } + + // we've got this classified from server - it's published + return true; + } + return false; +} + void LLPanelPicks::onAccordionStateChanged(const LLAccordionCtrlTab* acc_tab) { if(!mPicksAccTab->getDisplayChildren()) @@ -600,7 +597,11 @@ void LLPanelPicks::onClickTeleport() if(pick_item) pos = pick_item->getPosGlobal(); else if(c_item) + { pos = c_item->getPosGlobal(); + LLPanelClassifiedInfo::sendClickMessage("teleport", false, + c_item->getClassifiedId(), LLUUID::null, pos, LLStringUtil::null); + } if (!pos.isExactlyZero()) { @@ -619,7 +620,11 @@ void LLPanelPicks::onClickMap() if (pick_item) pos = pick_item->getPosGlobal(); else if(c_item) + { + LLPanelClassifiedInfo::sendClickMessage("map", false, + c_item->getClassifiedId(), LLUUID::null, pos, LLStringUtil::null); pos = c_item->getPosGlobal(); + } LLFloaterWorldMap::getInstance()->trackLocation(pos); LLFloaterReg::showInstance("world_map", "center"); @@ -671,6 +676,12 @@ void LLPanelPicks::updateButtons() childSetEnabled(XML_BTN_INFO, has_selected); childSetEnabled(XML_BTN_TELEPORT, has_selected); childSetEnabled(XML_BTN_SHOW_ON_MAP, has_selected); + + LLClassifiedItem* c_item = dynamic_cast<LLClassifiedItem*>(mClassifiedsList->getSelectedItem()); + if(c_item) + { + childSetEnabled(XML_BTN_INFO, isClassifiedPublished(c_item)); + } } void LLPanelPicks::setProfilePanel(LLPanelProfile* profile_panel) @@ -707,9 +718,10 @@ void LLPanelPicks::createNewPick() void LLPanelPicks::createNewClassified() { - createClassifiedEditPanel(); + LLPanelClassifiedEdit* panel = NULL; + createClassifiedEditPanel(&panel); - getProfilePanel()->openPanel(mPanelClassifiedEdit, LLSD()); + getProfilePanel()->openPanel(panel, LLSD()); } void LLPanelPicks::onClickInfo() @@ -749,26 +761,20 @@ void LLPanelPicks::openClassifiedInfo() if (selected_value.isUndefined()) return; LLClassifiedItem* c_item = getSelectedClassifiedItem(); + LLSD params; + params["classified_id"] = c_item->getClassifiedId(); + params["classified_creator_id"] = c_item->getAvatarId(); + params["classified_snapshot_id"] = c_item->getSnapshotId(); + params["classified_name"] = c_item->getClassifiedName(); + params["classified_desc"] = c_item->getDescription(); + params["from_search"] = false; - openClassifiedInfo(c_item->getClassifiedId(), c_item->getAvatarId(), - c_item->getSnapshotId(), c_item->getClassifiedName(), - c_item->getDescription()); + openClassifiedInfo(params); } -void LLPanelPicks::openClassifiedInfo(const LLUUID &classified_id, - const LLUUID &avatar_id, - const LLUUID &snapshot_id, - const std::string &name, const std::string &desc) +void LLPanelPicks::openClassifiedInfo(const LLSD ¶ms) { createClassifiedInfoPanel(); - - LLSD params; - params["classified_id"] = classified_id; - params["avatar_id"] = avatar_id; - params["snapshot_id"] = snapshot_id; - params["name"] = name; - params["desc"] = desc; - getProfilePanel()->openPanel(mPanelClassifiedInfo, params); } @@ -800,11 +806,10 @@ void LLPanelPicks::onPanelClassifiedSave(LLPanelClassifiedEdit* panel) if(panel->isNew()) { + mEditClassifiedPanels[panel->getClassifiedId()] = panel; + LLClassifiedItem* c_item = new LLClassifiedItem(getAvatarId(), panel->getClassifiedId()); - - c_item->setClassifiedName(panel->getClassifiedName()); - c_item->setDescription(panel->getDescription()); - c_item->setSnapshotId(panel->getSnapshotId()); + c_item->fillIn(panel); LLSD c_value; c_value.insert(CLASSIFIED_ID, c_item->getClassifiedId()); @@ -820,6 +825,15 @@ void LLPanelPicks::onPanelClassifiedSave(LLPanelClassifiedEdit* panel) mClassifiedsAccTab->changeOpenClose(false); showAccordion("tab_classifieds", true); } + else if(panel->isNewWithErrors()) + { + LLClassifiedItem* c_item = dynamic_cast<LLClassifiedItem*>(mClassifiedsList->getSelectedItem()); + llassert(c_item); + if (c_item) + { + c_item->fillIn(panel); + } + } else { onPanelClassifiedClose(panel); @@ -843,10 +857,13 @@ void LLPanelPicks::onPanelClassifiedClose(LLPanelClassifiedInfo* panel) { LLClassifiedItem* c_item = dynamic_cast<LLClassifiedItem*>( mClassifiedsList->getItemByValue(values[n])); - - c_item->setClassifiedName(panel->getClassifiedName()); - c_item->setDescription(panel->getDescription()); - c_item->setSnapshotId(panel->getSnapshotId()); + llassert(c_item); + if (c_item) + { + c_item->setClassifiedName(panel->getClassifiedName()); + c_item->setDescription(panel->getDescription()); + c_item->setSnapshotId(panel->getSnapshotId()); + } } } } @@ -877,15 +894,16 @@ void LLPanelPicks::createClassifiedInfoPanel() } } -void LLPanelPicks::createClassifiedEditPanel() +void LLPanelPicks::createClassifiedEditPanel(LLPanelClassifiedEdit** panel) { - if(!mPanelClassifiedEdit) + if(panel) { - mPanelClassifiedEdit = LLPanelClassifiedEdit::create(); - mPanelClassifiedEdit->setExitCallback(boost::bind(&LLPanelPicks::onPanelClassifiedClose, this, mPanelClassifiedEdit)); - mPanelClassifiedEdit->setSaveCallback(boost::bind(&LLPanelPicks::onPanelClassifiedSave, this, mPanelClassifiedEdit)); - mPanelClassifiedEdit->setCancelCallback(boost::bind(&LLPanelPicks::onPanelClassifiedClose, this, mPanelClassifiedEdit)); - mPanelClassifiedEdit->setVisible(FALSE); + LLPanelClassifiedEdit* new_panel = LLPanelClassifiedEdit::create(); + new_panel->setExitCallback(boost::bind(&LLPanelPicks::onPanelClassifiedClose, this, new_panel)); + new_panel->setSaveCallback(boost::bind(&LLPanelPicks::onPanelClassifiedSave, this, new_panel)); + new_panel->setCancelCallback(boost::bind(&LLPanelPicks::onPanelClassifiedClose, this, new_panel)); + new_panel->setVisible(FALSE); + *panel = new_panel; } } @@ -957,17 +975,32 @@ void LLPanelPicks::onPanelClassifiedEdit() } LLClassifiedItem* c_item = dynamic_cast<LLClassifiedItem*>(mClassifiedsList->getSelectedItem()); - - createClassifiedEditPanel(); + llassert(c_item); + if (!c_item) + { + return; + } LLSD params; params["classified_id"] = c_item->getClassifiedId(); - params["avatar_id"] = c_item->getAvatarId(); + params["classified_creator_id"] = c_item->getAvatarId(); params["snapshot_id"] = c_item->getSnapshotId(); params["name"] = c_item->getClassifiedName(); params["desc"] = c_item->getDescription(); - - getProfilePanel()->openPanel(mPanelClassifiedEdit, params); + params["category"] = (S32)c_item->getCategory(); + params["content_type"] = (S32)c_item->getContentType(); + params["auto_renew"] = c_item->getAutoRenew(); + params["price_for_listing"] = c_item->getPriceForListing(); + params["location_text"] = c_item->getLocationText(); + + LLPanelClassifiedEdit* panel = mEditClassifiedPanels[c_item->getClassifiedId()]; + if(!panel) + { + createClassifiedEditPanel(&panel); + mEditClassifiedPanels[c_item->getClassifiedId()] = panel; + } + getProfilePanel()->openPanel(panel, params); + panel->setPosGlobal(c_item->getPosGlobal()); } void LLPanelPicks::onClickMenuEdit() @@ -982,6 +1015,20 @@ void LLPanelPicks::onClickMenuEdit() } } +bool LLPanelPicks::onEnableMenuItem(const LLSD& user_data) +{ + std::string param = user_data.asString(); + + LLClassifiedItem* c_item = dynamic_cast<LLClassifiedItem*>(mClassifiedsList->getSelectedItem()); + if(c_item && "info" == param) + { + // dont show Info panel if classified was not created + return isClassifiedPublished(c_item); + } + + return true; +} + inline LLPanelProfile* LLPanelPicks::getProfilePanel() { llassert_always(NULL != mProfilePanel); @@ -1170,6 +1217,24 @@ void LLClassifiedItem::setValue(const LLSD& value) childSetVisible("selected_icon", value["selected"]); } +void LLClassifiedItem::fillIn(LLPanelClassifiedEdit* panel) +{ + if(!panel) + { + return; + } + + setClassifiedName(panel->getClassifiedName()); + setDescription(panel->getDescription()); + setSnapshotId(panel->getSnapshotId()); + setCategory(panel->getCategory()); + setContentType(panel->getContentType()); + setAutoRenew(panel->getAutoRenew()); + setPriceForListing(panel->getPriceForListing()); + setPosGlobal(panel->getPosGlobal()); + setLocationText(panel->getClassifiedLocation()); +} + void LLClassifiedItem::setClassifiedName(const std::string& name) { childSetValue("name", name); diff --git a/indra/newview/llpanelpicks.h b/indra/newview/llpanelpicks.h index 3f757e482e..a98b8c413e 100644 --- a/indra/newview/llpanelpicks.h +++ b/indra/newview/llpanelpicks.h @@ -55,7 +55,6 @@ class LLPanelPickEdit; class LLToggleableMenu; class LLPanelClassifiedInfo; class LLPanelClassifiedEdit; -class LLClassifiedClickThrough; // *TODO // Panel Picks has been consolidated with Classifieds (EXT-2095), give LLPanelPicks @@ -99,6 +98,8 @@ private: void onPlusMenuItemClicked(const LLSD& param); bool isActionEnabled(const LLSD& userdata) const; + bool isClassifiedPublished(LLClassifiedItem* c_item); + void onListCommit(const LLFlatListView* f_list); void onAccordionStateChanged(const LLAccordionCtrlTab* acc_tab); @@ -115,14 +116,14 @@ private: void onPanelClassifiedEdit(); void onClickMenuEdit(); + bool onEnableMenuItem(const LLSD& user_data); + void createNewPick(); void createNewClassified(); void openPickInfo(); void openClassifiedInfo(); - void openClassifiedInfo(const LLUUID &classified_id, const LLUUID &avatar_id, - const LLUUID &snapshot_id, const std::string &name, - const std::string &desc); + void openClassifiedInfo(const LLSD& params); friend class LLPanelProfile; void showAccordion(const std::string& name, bool show); @@ -143,7 +144,7 @@ private: void createPickInfoPanel(); void createPickEditPanel(); void createClassifiedInfoPanel(); - void createClassifiedEditPanel(); + void createClassifiedEditPanel(LLPanelClassifiedEdit** panel); LLMenuGL* mPopupMenu; LLPanelProfile* mProfilePanel; @@ -152,15 +153,19 @@ private: LLFlatListView* mClassifiedsList; LLPanelPickInfo* mPanelPickInfo; LLPanelClassifiedInfo* mPanelClassifiedInfo; - LLPanelClassifiedEdit* mPanelClassifiedEdit; LLPanelPickEdit* mPanelPickEdit; LLToggleableMenu* mPlusMenu; + // <classified_id, edit_panel> + typedef std::map<LLUUID, LLPanelClassifiedEdit*> panel_classified_edit_map_t; + + // This map is needed for newly created classifieds. The purpose of panel is to + // sit in this map and listen to LLPanelClassifiedEdit::processProperties callback. + panel_classified_edit_map_t mEditClassifiedPanels; + LLAccordionCtrlTab* mPicksAccTab; LLAccordionCtrlTab* mClassifiedsAccTab; - LLClassifiedClickThrough* mClickThroughDisp; - //true if picks list is empty after processing picks bool mNoPicks; //true if classifieds list is empty after processing classifieds @@ -250,6 +255,8 @@ public: /*virtual*/ void setValue(const LLSD& value); + void fillIn(LLPanelClassifiedEdit* panel); + LLUUID getAvatarId() {return mAvatarId;} void setAvatarId(const LLUUID& avatar_id) {mAvatarId = avatar_id;} @@ -260,7 +267,11 @@ public: void setPosGlobal(const LLVector3d& pos) { mPosGlobal = pos; } - const LLVector3d& getPosGlobal() { return mPosGlobal; } + const LLVector3d getPosGlobal() { return mPosGlobal; } + + void setLocationText(const std::string location) { mLocationText = location; } + + std::string getLocationText() { return mLocationText; } void setClassifiedName (const std::string& name); @@ -274,10 +285,31 @@ public: LLUUID getSnapshotId(); + void setCategory(U32 cat) { mCategory = cat; } + + U32 getCategory() { return mCategory; } + + void setContentType(U32 ct) { mContentType = ct; } + + U32 getContentType() { return mContentType; } + + void setAutoRenew(U32 renew) { mAutoRenew = renew; } + + bool getAutoRenew() { return mAutoRenew; } + + void setPriceForListing(S32 price) { mPriceForListing = price; } + + S32 getPriceForListing() { return mPriceForListing; } + private: LLUUID mAvatarId; LLUUID mClassifiedId; LLVector3d mPosGlobal; + std::string mLocationText; + U32 mCategory; + U32 mContentType; + bool mAutoRenew; + S32 mPriceForListing; }; #endif // LL_LLPANELPICKS_H diff --git a/indra/newview/llpanelplaceinfo.cpp b/indra/newview/llpanelplaceinfo.cpp index 9ebc8ca2b9..f6133d4446 100644 --- a/indra/newview/llpanelplaceinfo.cpp +++ b/indra/newview/llpanelplaceinfo.cpp @@ -256,7 +256,7 @@ void LLPanelPlaceInfo::reshape(S32 width, S32 height, BOOL called_from_parent) static LLUICachedControl<S32> scrollbar_size ("UIScrollbarSize", 0); S32 scroll_height = mScrollContainer->getRect().getHeight(); - if (mScrollingPanelMinHeight >= scroll_height) + if (mScrollingPanelMinHeight > scroll_height) { mScrollingPanel->reshape(mScrollingPanelWidth, mScrollingPanelMinHeight); } diff --git a/indra/newview/llpanelplaceprofile.cpp b/indra/newview/llpanelplaceprofile.cpp index 9e5f9da0ea..1f979b0ef1 100644 --- a/indra/newview/llpanelplaceprofile.cpp +++ b/indra/newview/llpanelplaceprofile.cpp @@ -50,7 +50,7 @@ #include "llagentui.h" #include "llappviewer.h" #include "llcallbacklist.h" -#include "llfloaterbuycurrency.h" +#include "llbuycurrencyhtml.h" #include "llstatusbar.h" #include "llviewercontrol.h" #include "llviewerparcelmgr.h" @@ -84,7 +84,9 @@ LLPanelPlaceProfile::LLPanelPlaceProfile() // virtual LLPanelPlaceProfile::~LLPanelPlaceProfile() -{} +{ + gIdleCallbacks.deleteFunction(&LLPanelPlaceProfile::updateYouAreHereBanner, this); +} // virtual BOOL LLPanelPlaceProfile::postBuild() @@ -567,9 +569,13 @@ void LLPanelPlaceProfile::onForSaleBannerClick() if(parcel->getLocalID() == mSelectedParcelID && mLastSelectedRegionID ==selected_region->getRegionID()) { - if(parcel->getSalePrice() - gStatusBar->getBalance() > 0) + S32 price = parcel->getSalePrice(); + + if(price - gStatusBar->getBalance() > 0) { - LLFloaterBuyCurrency::buyCurrency("Buying selected land ", parcel->getSalePrice()); + LLStringUtil::format_map_t args; + args["AMOUNT"] = llformat("%d", price); + LLBuyCurrencyHTML::openCurrencyFloater( LLTrans::getString("buying_selected_land", args), price ); } else { diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp index a49386cb5c..705b196ef1 100644 --- a/indra/newview/llpanelplaces.cpp +++ b/indra/newview/llpanelplaces.cpp @@ -252,6 +252,9 @@ BOOL LLPanelPlaces::postBuild() mOverflowBtn = getChild<LLButton>("overflow_btn"); mOverflowBtn->setClickedCallback(boost::bind(&LLPanelPlaces::onOverflowButtonClicked, this)); + mPlaceInfoBtn = getChild<LLButton>("profile_btn"); + mPlaceInfoBtn->setClickedCallback(boost::bind(&LLPanelPlaces::onProfileButtonClicked, this)); + LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar; registrar.add("Places.OverflowMenu.Action", boost::bind(&LLPanelPlaces::onOverflowMenuItemClicked, this, _2)); LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar; @@ -278,6 +281,11 @@ BOOL LLPanelPlaces::postBuild() mFilterEditor = getChild<LLFilterEditor>("Filter"); if (mFilterEditor) { + //when list item is being clicked the filter editor looses focus + //committing on focus lost leads to detaching list items + //BUT a detached list item cannot be made selected and must not be clicked onto + mFilterEditor->setCommitOnFocusLost(false); + mFilterEditor->setCommitCallback(boost::bind(&LLPanelPlaces::onFilterEdit, this, _2, false)); } @@ -520,8 +528,7 @@ void LLPanelPlaces::onFilterEdit(const std::string& search_string, bool force_fi std::string string = search_string; // Searches are case-insensitive - LLStringUtil::toUpper(string); - LLStringUtil::trimHead(string); + // but we don't convert the typed string to upper-case so that it can be fed to the web search as-is. mActivePanel->onSearchEdit(string); } @@ -546,7 +553,9 @@ void LLPanelPlaces::onTeleportButtonClicked() { LLSD payload; payload["asset_id"] = mItem->getAssetUUID(); - LLNotificationsUtil::add("TeleportFromLandmark", LLSD(), payload); + LLSD args; + args["LOCATION"] = mItem->getName(); + LLNotificationsUtil::add("TeleportFromLandmark", args, payload); } else if (mPlaceInfoType == AGENT_INFO_TYPE || mPlaceInfoType == REMOTE_PLACE_INFO_TYPE || @@ -606,8 +615,21 @@ void LLPanelPlaces::onShowOnMapButtonClicked() } else { - if (mActivePanel) + if (mActivePanel && mActivePanel->isSingleItemSelected()) + { mActivePanel->onShowOnMap(); + } + else + { + LLFloaterWorldMap* worldmap_instance = LLFloaterWorldMap::getInstance(); + LLVector3d global_pos = gAgent.getPositionGlobal(); + + if (!global_pos.isExactlyZero() && worldmap_instance) + { + worldmap_instance->trackLocation(global_pos); + LLFloaterReg::showInstance("world_map", "center"); + } + } } } @@ -738,6 +760,14 @@ void LLPanelPlaces::onOverflowButtonClicked() LLMenuGL::showPopup(this, menu, rect.mRight, rect.mTop); } +void LLPanelPlaces::onProfileButtonClicked() +{ + if (!mActivePanel) + return; + + mActivePanel->onShowProfile(); +} + bool LLPanelPlaces::onOverflowMenuItemEnable(const LLSD& param) { std::string value = param.asString(); @@ -1001,21 +1031,22 @@ void LLPanelPlaces::changedGlobalPos(const LLVector3d &global_pos) updateVerbs(); } -void LLPanelPlaces::showAddedLandmarkInfo(const std::vector<LLUUID>& items) +void LLPanelPlaces::showAddedLandmarkInfo(const uuid_vec_t& items) { - for (std::vector<LLUUID>::const_iterator item_iter = items.begin(); + for (uuid_vec_t::const_iterator item_iter = items.begin(); item_iter != items.end(); ++item_iter) { const LLUUID& item_id = (*item_iter); - if(!highlight_offered_item(item_id)) + if(!highlight_offered_object(item_id)) { continue; } LLInventoryItem* item = gInventory.getItem(item_id); - if (LLAssetType::AT_LANDMARK == item->getType()) + llassert(item); + if (item && (LLAssetType::AT_LANDMARK == item->getType()) ) { // Created landmark is passed to Places panel to allow its editing. // If the panel is closed we don't reopen it until created landmark is loaded. @@ -1023,7 +1054,6 @@ void LLPanelPlaces::showAddedLandmarkInfo(const std::vector<LLUUID>& items) { setItem(item); } - break; } } } @@ -1048,14 +1078,14 @@ void LLPanelPlaces::updateVerbs() mTeleportBtn->setVisible(!is_create_landmark_visible && !isLandmarkEditModeOn); mShowOnMapBtn->setVisible(!is_create_landmark_visible && !isLandmarkEditModeOn); - mOverflowBtn->setVisible(!is_create_landmark_visible && !isLandmarkEditModeOn); + mOverflowBtn->setVisible(is_place_info_visible && !is_create_landmark_visible && !isLandmarkEditModeOn); mEditBtn->setVisible(mPlaceInfoType == LANDMARK_INFO_TYPE && !isLandmarkEditModeOn); mSaveBtn->setVisible(isLandmarkEditModeOn); mCancelBtn->setVisible(isLandmarkEditModeOn); mCloseBtn->setVisible(is_create_landmark_visible && !isLandmarkEditModeOn); + mPlaceInfoBtn->setVisible(!is_place_info_visible && !is_create_landmark_visible && !isLandmarkEditModeOn); - mShowOnMapBtn->setEnabled(!is_create_landmark_visible && !isLandmarkEditModeOn && have_3d_pos); - mOverflowBtn->setEnabled(is_place_info_visible && !is_create_landmark_visible); + mPlaceInfoBtn->setEnabled(!is_create_landmark_visible && !isLandmarkEditModeOn && have_3d_pos); if (is_place_info_visible) { diff --git a/indra/newview/llpanelplaces.h b/indra/newview/llpanelplaces.h index 78fcbbb11d..7a77fc9300 100644 --- a/indra/newview/llpanelplaces.h +++ b/indra/newview/llpanelplaces.h @@ -73,7 +73,7 @@ public: void changedGlobalPos(const LLVector3d &global_pos); // Opens landmark info panel when agent creates or receives landmark. - void showAddedLandmarkInfo(const std::vector<LLUUID>& items); + void showAddedLandmarkInfo(const uuid_vec_t& items); void setItem(LLInventoryItem* item); @@ -98,6 +98,7 @@ private: bool onOverflowMenuItemEnable(const LLSD& param); void onCreateLandmarkButtonClicked(const LLUUID& folder_id); void onBackButtonClicked(); + void onProfileButtonClicked(); void toggleMediaPanel(); void togglePickPanel(BOOL visible); @@ -128,6 +129,7 @@ private: LLButton* mCancelBtn; LLButton* mCloseBtn; LLButton* mOverflowBtn; + LLButton* mPlaceInfoBtn; LLPlacesInventoryObserver* mInventoryObserver; LLPlacesParcelObserver* mParcelObserver; diff --git a/indra/newview/llpanelplacestab.cpp b/indra/newview/llpanelplacestab.cpp index 9806b8c64d..0f3c51fb4f 100644 --- a/indra/newview/llpanelplacestab.cpp +++ b/indra/newview/llpanelplacestab.cpp @@ -56,6 +56,7 @@ void LLPanelPlacesTab::setPanelPlacesButtons(LLPanelPlaces* panel) { mTeleportBtn = panel->getChild<LLButton>("teleport_btn"); mShowOnMapBtn = panel->getChild<LLButton>("map_btn"); + mShowProfile = panel->getChild<LLButton>("profile_btn"); } void LLPanelPlacesTab::onRegionResponse(const LLVector3d& landmark_global_pos, @@ -70,10 +71,7 @@ void LLPanelPlacesTab::onRegionResponse(const LLVector3d& landmark_global_pos, std::string sl_url; if ( gotSimName ) { - F32 region_x = (F32)fmod( landmark_global_pos.mdV[VX], (F64)REGION_WIDTH_METERS ); - F32 region_y = (F32)fmod( landmark_global_pos.mdV[VY], (F64)REGION_WIDTH_METERS ); - - sl_url = LLSLURL::buildSLURL(sim_name, llround(region_x), llround(region_y), llround((F32)landmark_global_pos.mdV[VZ])); + sl_url = LLSLURL(sim_name, landmark_global_pos).getSLURLString(); } else { diff --git a/indra/newview/llpanelplacestab.h b/indra/newview/llpanelplacestab.h index ce77a42259..4a155afd71 100644 --- a/indra/newview/llpanelplacestab.h +++ b/indra/newview/llpanelplacestab.h @@ -45,7 +45,9 @@ public: virtual void onSearchEdit(const std::string& string) = 0; virtual void updateVerbs() = 0; // Updates buttons at the bottom of Places panel virtual void onShowOnMap() = 0; + virtual void onShowProfile() = 0; virtual void onTeleport() = 0; + virtual bool isSingleItemSelected() = 0; bool isTabVisible(); // Check if parent TabContainer is visible. @@ -62,6 +64,7 @@ public: protected: LLButton* mTeleportBtn; LLButton* mShowOnMapBtn; + LLButton* mShowProfile; // Search string for filtering landmarks and teleport history locations static std::string sFilterSubString; diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp index 2dc3a62637..0648d99685 100644 --- a/indra/newview/llpanelprimmediacontrols.cpp +++ b/indra/newview/llpanelprimmediacontrols.cpp @@ -31,8 +31,8 @@ #include "llviewerprecompiledheaders.h" -//LLPanelPrimMediaControls #include "llagent.h" +#include "llagentcamera.h" #include "llparcel.h" #include "llpanel.h" #include "llselectmgr.h" @@ -64,7 +64,6 @@ #include "llvovolume.h" #include "llweb.h" #include "llwindow.h" - #include "llfloatertools.h" // to enable hide if build tools are up // Functions pulled from pipeline.cpp @@ -351,6 +350,11 @@ void LLPanelPrimMediaControls::updateShape() mHomeCtrl->setEnabled(has_focus && can_navigate); LLPluginClassMediaOwner::EMediaStatus result = ((media_impl != NULL) && media_impl->hasMedia()) ? media_plugin->getStatus() : LLPluginClassMediaOwner::MEDIA_NONE; + mVolumeCtrl->setVisible(has_focus); + mVolumeCtrl->setEnabled(has_focus); + mVolumeSliderCtrl->setEnabled(has_focus && shouldVolumeSliderBeVisible()); + mVolumeSliderCtrl->setVisible(has_focus && shouldVolumeSliderBeVisible()); + if(media_plugin && media_plugin->pluginSupportsMediaTime()) { mReloadCtrl->setEnabled(false); @@ -463,11 +467,15 @@ void LLPanelPrimMediaControls::updateShape() mSkipBackCtrl->setVisible(FALSE); mSkipBackCtrl->setEnabled(FALSE); - mVolumeCtrl->setVisible(FALSE); - mVolumeSliderCtrl->setVisible(FALSE); - mVolumeCtrl->setEnabled(FALSE); - mVolumeSliderCtrl->setEnabled(FALSE); - + if(media_impl->getVolume() <= 0.0) + { + mMuteBtn->setToggleState(true); + } + else + { + mMuteBtn->setToggleState(false); + } + if (mMediaPanelScroll) { mMediaPanelScroll->setVisible(has_focus); @@ -724,10 +732,10 @@ void LLPanelPrimMediaControls::draw() mMediaControlsStack->updateLayout(); // adjust for layout stack spacing - S32 space = mMediaControlsStack->getPanelSpacing() + 1; + S32 space = mMediaControlsStack->getPanelSpacing() + 2; LLRect controls_bg_area = mMediaControlsStack->getRect(); - controls_bg_area.mTop += space; + controls_bg_area.mTop += space + 2; // adjust to ignore space from volume slider controls_bg_area.mBottom += mVolumeSliderCtrl->getRect().getHeight(); @@ -736,7 +744,7 @@ void LLPanelPrimMediaControls::draw() controls_bg_area.mLeft += mLeftBookend->getRect().getWidth() - space; // ignore space from right bookend padding - controls_bg_area.mRight -= mRightBookend->getRect().getWidth() - space; + controls_bg_area.mRight -= mRightBookend->getRect().getWidth() - space - 2; // draw control background UI image mBackgroundImage->draw( controls_bg_area, UI_VERTEX_COLOR % alpha); @@ -1010,7 +1018,7 @@ void LLPanelPrimMediaControls::updateZoom() { case ZOOM_NONE: { - gAgent.setFocusOnAvatar(TRUE, ANIMATE); + gAgentCamera.setFocusOnAvatar(TRUE, ANIMATE); break; } case ZOOM_FAR: @@ -1030,14 +1038,15 @@ void LLPanelPrimMediaControls::updateZoom() } default: { - gAgent.setFocusOnAvatar(TRUE, ANIMATE); + gAgentCamera.setFocusOnAvatar(TRUE, ANIMATE); break; } } if (zoom_padding > 0.0f) - { - LLViewerMediaFocus::setCameraZoom(getTargetObject(), mTargetObjectNormal, zoom_padding); + { + // since we only zoom into medium for now, always set zoom_in constraint to true + LLViewerMediaFocus::setCameraZoom(getTargetObject(), mTargetObjectNormal, zoom_padding, true); } // Remember the object ID/face we zoomed into, so we can update the zoom icon appropriately diff --git a/indra/newview/llpanelprimmediacontrols.h b/indra/newview/llpanelprimmediacontrols.h index 743cec70a1..2e0de7866c 100644 --- a/indra/newview/llpanelprimmediacontrols.h +++ b/indra/newview/llpanelprimmediacontrols.h @@ -58,6 +58,16 @@ public: void updateShape(); bool isMouseOver(); + + enum EZoomLevel + { + ZOOM_NONE = 0, + ZOOM_FAR, + ZOOM_MEDIUM, + ZOOM_NEAR + }; + + EZoomLevel getZoomLevel() const { return mCurrentZoom; } void nextZoomLevel(); void resetZoomLevel(bool reset_camera = true); void close(); @@ -66,13 +76,6 @@ public: void setMediaFace(LLPointer<LLViewerObject> objectp, S32 face, viewer_media_t media_impl, LLVector3 pick_normal = LLVector3::zero); - enum EZoomLevel - { - ZOOM_NONE = 0, - ZOOM_FAR, - ZOOM_MEDIUM, - ZOOM_NEAR - }; static const EZoomLevel kZoomLevels[]; static const int kNumZoomLevels; diff --git a/indra/newview/llpanelprofile.cpp b/indra/newview/llpanelprofile.cpp index b5d85dfd4b..18da8dd48c 100644 --- a/indra/newview/llpanelprofile.cpp +++ b/indra/newview/llpanelprofile.cpp @@ -171,15 +171,13 @@ void LLPanelProfile::onOpen(const LLSD& key) } else if (panel == "classified_details") { - LLUUID classified_id = key["classified_id"].asUUID(); - LLUUID avatar_id = key["classified_avatar_id"].asUUID(); - LLUUID snapshot_id = key["classified_snapshot_id"].asUUID(); - std::string name = key["classified_name"].asString(); - std::string desc = key["classified_desc"].asString(); LLPanelPicks* picks = dynamic_cast<LLPanelPicks *>(getTabContainer()[PANEL_PICKS]); if (picks) { - picks->openClassifiedInfo(classified_id, avatar_id, snapshot_id, name, desc); + LLSD params = key; + params.erase("show_tab_panel"); + params.erase("open_tab_name"); + picks->openClassifiedInfo(params); } } } diff --git a/indra/newview/llpanelteleporthistory.cpp b/indra/newview/llpanelteleporthistory.cpp index 90c8f2551f..1048e3fcc0 100644 --- a/indra/newview/llpanelteleporthistory.cpp +++ b/indra/newview/llpanelteleporthistory.cpp @@ -348,7 +348,7 @@ LLContextMenu* LLTeleportHistoryPanel::ContextMenu::createMenu() void LLTeleportHistoryPanel::ContextMenu::onTeleport() { - LLTeleportHistoryStorage::getInstance()->goToItem(mIndex); + confirmTeleport(mIndex); } void LLTeleportHistoryPanel::ContextMenu::onInfo() @@ -477,6 +477,12 @@ void LLTeleportHistoryPanel::onSearchEdit(const std::string& string) } // virtual +bool LLTeleportHistoryPanel::isSingleItemSelected() +{ + return mLastSelectedFlatlList && mLastSelectedFlatlList->getSelectedItem(); +} + +// virtual void LLTeleportHistoryPanel::onShowOnMap() { if (!mLastSelectedFlatlList) @@ -496,6 +502,20 @@ void LLTeleportHistoryPanel::onShowOnMap() } } +//virtual +void LLTeleportHistoryPanel::onShowProfile() +{ + if (!mLastSelectedFlatlList) + return; + + LLTeleportHistoryFlatItem* itemp = dynamic_cast<LLTeleportHistoryFlatItem *> (mLastSelectedFlatlList->getSelectedItem()); + + if(!itemp) + return; + + LLTeleportHistoryFlatItem::showPlaceInfoPanel(itemp->getIndex()); +} + // virtual void LLTeleportHistoryPanel::onTeleport() { @@ -507,7 +527,7 @@ void LLTeleportHistoryPanel::onTeleport() return; // teleport to existing item in history, so we don't add it again - mTeleportHistory->goToItem(itemp->getIndex()); + confirmTeleport(itemp->getIndex()); } /* @@ -543,6 +563,7 @@ void LLTeleportHistoryPanel::updateVerbs() if (!mLastSelectedFlatlList) { mTeleportBtn->setEnabled(false); + mShowProfile->setEnabled(false); mShowOnMapBtn->setEnabled(false); return; } @@ -550,6 +571,7 @@ void LLTeleportHistoryPanel::updateVerbs() LLTeleportHistoryFlatItem* itemp = dynamic_cast<LLTeleportHistoryFlatItem *> (mLastSelectedFlatlList->getSelectedItem()); mTeleportBtn->setEnabled(NULL != itemp); + mShowProfile->setEnabled(NULL != itemp); mShowOnMapBtn->setEnabled(NULL != itemp); } @@ -626,16 +648,18 @@ void LLTeleportHistoryPanel::refresh() LLDate tab_boundary_date = LLDate::now(); LLFlatListView* curr_flat_view = NULL; + std::string filter_string = sFilterSubString; + LLStringUtil::toUpper(filter_string); U32 added_items = 0; while (mCurrentItem >= 0) { // Filtering - if (!sFilterSubString.empty()) + if (!filter_string.empty()) { std::string landmark_title(items[mCurrentItem].mTitle); LLStringUtil::toUpper(landmark_title); - if( std::string::npos == landmark_title.find(sFilterSubString) ) + if( std::string::npos == landmark_title.find(filter_string) ) { mCurrentItem--; continue; @@ -684,7 +708,7 @@ void LLTeleportHistoryPanel::refresh() .getFlatItemForPersistentItem(&mContextMenu, items[mCurrentItem], mCurrentItem, - sFilterSubString); + filter_string); if ( !curr_flat_view->addItem(item, LLUUID::null, ADD_BOTTOM, false) ) llerrs << "Couldn't add flat item to teleport history." << llendl; if (mLastSelectedItemIndex == mCurrentItem) @@ -707,6 +731,8 @@ void LLTeleportHistoryPanel::refresh() } } + mHistoryAccordion->setFilterSubString(sFilterSubString); + mHistoryAccordion->arrange(); updateVerbs(); @@ -1058,3 +1084,27 @@ void LLTeleportHistoryPanel::onAccordionExpand(LLUICtrl* ctrl, const LLSD& param mLastSelectedFlatlList->resetSelection(); } } + +// static +void LLTeleportHistoryPanel::confirmTeleport(S32 hist_idx) +{ + LLSD args; + args["HISTORY_ENTRY"] = LLTeleportHistoryStorage::getInstance()->getItems()[hist_idx].mTitle; + LLNotificationsUtil::add("TeleportToHistoryEntry", args, LLSD(), + boost::bind(&LLTeleportHistoryPanel::onTeleportConfirmation, _1, _2, hist_idx)); +} + +// Called when user reacts upon teleport confirmation dialog. +// static +bool LLTeleportHistoryPanel::onTeleportConfirmation(const LLSD& notification, const LLSD& response, S32 hist_idx) +{ + S32 option = LLNotificationsUtil::getSelectedOption(notification, response); + + if (0 == option) + { + // Teleport to given history item. + LLTeleportHistoryStorage::getInstance()->goToItem(hist_idx); + } + + return false; +} diff --git a/indra/newview/llpanelteleporthistory.h b/indra/newview/llpanelteleporthistory.h index 4eeaec7705..87e7044222 100644 --- a/indra/newview/llpanelteleporthistory.h +++ b/indra/newview/llpanelteleporthistory.h @@ -47,6 +47,7 @@ class LLFlatListView; class LLTeleportHistoryPanel : public LLPanelPlacesTab { public: + // *TODO: derive from LLListContextMenu? class ContextMenu { public: @@ -73,9 +74,11 @@ public: /*virtual*/ void onSearchEdit(const std::string& string); /*virtual*/ void onShowOnMap(); + /*virtual*/ void onShowProfile(); /*virtual*/ void onTeleport(); ///*virtual*/ void onCopySLURL(); /*virtual*/ void updateVerbs(); + /*virtual*/ bool isSingleItemSelected(); private: @@ -103,6 +106,9 @@ private: bool isAccordionCollapsedByUser(LLUICtrl* acc_tab); void onAccordionExpand(LLUICtrl* ctrl, const LLSD& param); + static void confirmTeleport(S32 hist_idx); + static bool onTeleportConfirmation(const LLSD& notification, const LLSD& response, S32 hist_idx); + LLTeleportHistoryStorage* mTeleportHistory; LLAccordionCtrl* mHistoryAccordion; @@ -119,4 +125,6 @@ private: LLHandle<LLView> mGearMenuHandle; }; + + #endif //LL_LLPANELTELEPORTHISTORY_H diff --git a/indra/newview/llpaneltiptoast.cpp b/indra/newview/llpaneltiptoast.cpp new file mode 100644 index 0000000000..23367df41a --- /dev/null +++ b/indra/newview/llpaneltiptoast.cpp @@ -0,0 +1,69 @@ +/** + * @file llpaneltiptoast.cpp + * @brief Represents a base class of tip toast panels. + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llpaneltiptoast.h" + +BOOL LLPanelTipToast::postBuild() +{ + mMessageText= findChild<LLUICtrl>("message"); + + if (mMessageText != NULL) + { + mMessageText->setMouseUpCallback(boost::bind(&LLPanelTipToast::onMessageTextClick,this)); + setMouseUpCallback(boost::bind(&LLPanelTipToast::onPanelClick, this, _2, _3, _4)); + } + else + { + llassert(!"Can't find child 'message' text box."); + return FALSE; + } + + return TRUE; +} + +void LLPanelTipToast::onMessageTextClick() +{ + // notify parent toast about need hide + LLSD info; + info["action"] = "hide_toast"; + notifyParent(info); +} + +void LLPanelTipToast::onPanelClick(S32 x, S32 y, MASK mask) +{ + if (!mMessageText->getRect().pointInRect(x, y)) + { + onMessageTextClick(); + } +} diff --git a/indra/newview/llpaneltiptoast.h b/indra/newview/llpaneltiptoast.h new file mode 100644 index 0000000000..e8678aa1d3 --- /dev/null +++ b/indra/newview/llpaneltiptoast.h @@ -0,0 +1,57 @@ +/** + * @file llpaneltiptoast.h + * @brief Represents a base class of tip toast panels. + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + + +#include "lltoastpanel.h" + +#ifndef LL_PANELTOASTTIP_H +#define LL_PANELTOASTTIP_H + +/** + * Base class for tip toast panels. + * + * Tip toast panels are required to have text message box named as 'message'. + */ +class LLPanelTipToast : public LLToastPanel +{ + LOG_CLASS(LLPanelTipToast); +public: + LLPanelTipToast(const LLNotificationPtr& notification): LLToastPanel(notification) {} + virtual BOOL postBuild(); +private: + void onMessageTextClick(); + void onPanelClick(S32 x, S32 y, MASK mask); + + LLUICtrl* mMessageText; +}; + +#endif /* LL_PANELTOASTTIP_H */ diff --git a/indra/newview/llpaneltopinfobar.cpp b/indra/newview/llpaneltopinfobar.cpp new file mode 100644 index 0000000000..68dc1cdf71 --- /dev/null +++ b/indra/newview/llpaneltopinfobar.cpp @@ -0,0 +1,426 @@ +/** + * @file llpaneltopinfobar.cpp + * @brief Coordinates and Parcel Settings information panel definition + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llpaneltopinfobar.h" + +#include "llagent.h" +#include "llagentui.h" +#include "llclipboard.h" +#include "lllandmarkactions.h" +#include "lllocationinputctrl.h" +#include "llnotificationsutil.h" +#include "llparcel.h" +#include "llsidetray.h" +#include "llslurl.h" +#include "llstatusbar.h" +#include "llviewercontrol.h" +#include "llviewerinventory.h" +#include "llviewermenu.h" +#include "llviewerparcelmgr.h" +#include "llviewerregion.h" + +class LLPanelTopInfoBar::LLParcelChangeObserver : public LLParcelObserver +{ +public: + LLParcelChangeObserver(LLPanelTopInfoBar* topInfoBar) : mTopInfoBar(topInfoBar) {} + +private: + /*virtual*/ void changed() + { + if (mTopInfoBar) + { + mTopInfoBar->updateParcelIcons(); + } + } + + LLPanelTopInfoBar* mTopInfoBar; +}; + +LLPanelTopInfoBar::LLPanelTopInfoBar(): mParcelChangedObserver(0) +{ + LLUICtrl::CommitCallbackRegistry::currentRegistrar() + .add("TopInfoBar.Action", boost::bind(&LLPanelTopInfoBar::onContextMenuItemClicked, this, _2)); + + LLUICtrlFactory::getInstance()->buildPanel(this, "panel_topinfo_bar.xml"); +} + +LLPanelTopInfoBar::~LLPanelTopInfoBar() +{ + if (mParcelChangedObserver) + { + LLViewerParcelMgr::getInstance()->removeObserver(mParcelChangedObserver); + delete mParcelChangedObserver; + } + + if (mParcelPropsCtrlConnection.connected()) + { + mParcelPropsCtrlConnection.disconnect(); + } + + if (mParcelMgrConnection.connected()) + { + mParcelMgrConnection.disconnect(); + } + + if (mShowCoordsCtrlConnection.connected()) + { + mShowCoordsCtrlConnection.disconnect(); + } +} + +void LLPanelTopInfoBar::initParcelIcons() +{ + mParcelIcon[VOICE_ICON] = getChild<LLIconCtrl>("voice_icon"); + mParcelIcon[FLY_ICON] = getChild<LLIconCtrl>("fly_icon"); + mParcelIcon[PUSH_ICON] = getChild<LLIconCtrl>("push_icon"); + mParcelIcon[BUILD_ICON] = getChild<LLIconCtrl>("build_icon"); + mParcelIcon[SCRIPTS_ICON] = getChild<LLIconCtrl>("scripts_icon"); + mParcelIcon[DAMAGE_ICON] = getChild<LLIconCtrl>("damage_icon"); + + mParcelIcon[VOICE_ICON]->setMouseDownCallback(boost::bind(&LLPanelTopInfoBar::onParcelIconClick, this, VOICE_ICON)); + mParcelIcon[FLY_ICON]->setMouseDownCallback(boost::bind(&LLPanelTopInfoBar::onParcelIconClick, this, FLY_ICON)); + mParcelIcon[PUSH_ICON]->setMouseDownCallback(boost::bind(&LLPanelTopInfoBar::onParcelIconClick, this, PUSH_ICON)); + mParcelIcon[BUILD_ICON]->setMouseDownCallback(boost::bind(&LLPanelTopInfoBar::onParcelIconClick, this, BUILD_ICON)); + mParcelIcon[SCRIPTS_ICON]->setMouseDownCallback(boost::bind(&LLPanelTopInfoBar::onParcelIconClick, this, SCRIPTS_ICON)); + mParcelIcon[DAMAGE_ICON]->setMouseDownCallback(boost::bind(&LLPanelTopInfoBar::onParcelIconClick, this, DAMAGE_ICON)); + + mDamageText->setText(LLStringExplicit("100%")); +} + +void LLPanelTopInfoBar::handleLoginComplete() +{ + // An agent parcel update hasn't occurred yet, so + // we have to manually set location and the icons. + update(); +} + +BOOL LLPanelTopInfoBar::handleRightMouseDown(S32 x, S32 y, MASK mask) +{ + show_topinfobar_context_menu(this, x, y); + return TRUE; +} + +BOOL LLPanelTopInfoBar::postBuild() +{ + mInfoBtn = getChild<LLButton>("place_info_btn"); + mInfoBtn->setClickedCallback(boost::bind(&LLPanelTopInfoBar::onInfoButtonClicked, this)); + + mParcelInfoText = getChild<LLTextBox>("parcel_info_text"); + mDamageText = getChild<LLTextBox>("damage_text"); + + initParcelIcons(); + + mParcelChangedObserver = new LLParcelChangeObserver(this); + LLViewerParcelMgr::getInstance()->addObserver(mParcelChangedObserver); + + // Connecting signal for updating parcel icons on "Show Parcel Properties" setting change. + LLControlVariable* ctrl = gSavedSettings.getControl("NavBarShowParcelProperties").get(); + if (ctrl) + { + mParcelPropsCtrlConnection = ctrl->getSignal()->connect(boost::bind(&LLPanelTopInfoBar::updateParcelIcons, this)); + } + + // Connecting signal for updating parcel text on "Show Coordinates" setting change. + ctrl = gSavedSettings.getControl("NavBarShowCoordinates").get(); + if (ctrl) + { + mShowCoordsCtrlConnection = ctrl->getSignal()->connect(boost::bind(&LLPanelTopInfoBar::onNavBarShowParcelPropertiesCtrlChanged, this)); + } + + mParcelMgrConnection = LLViewerParcelMgr::getInstance()->addAgentParcelChangedCallback( + boost::bind(&LLPanelTopInfoBar::onAgentParcelChange, this)); + + return TRUE; +} + +void LLPanelTopInfoBar::onNavBarShowParcelPropertiesCtrlChanged() +{ + std::string new_text; + + // don't need to have separate show_coords variable; if user requested the coords to be shown + // they will be added during the next call to the draw() method. + buildLocationString(new_text, false); + setParcelInfoText(new_text); +} + +void LLPanelTopInfoBar::draw() +{ + updateParcelInfoText(); + updateHealth(); + + LLPanel::draw(); +} + +void LLPanelTopInfoBar::buildLocationString(std::string& loc_str, bool show_coords) +{ + LLAgentUI::ELocationFormat format = + (show_coords ? LLAgentUI::LOCATION_FORMAT_FULL : LLAgentUI::LOCATION_FORMAT_NO_COORDS); + + if (!LLAgentUI::buildLocationString(loc_str, format)) + { + loc_str = "???"; + } +} + +void LLPanelTopInfoBar::setParcelInfoText(const std::string& new_text) +{ + const LLFontGL* font = mParcelInfoText->getDefaultFont(); + S32 new_text_width = font->getWidth(new_text); + + mParcelInfoText->setText(new_text); + + LLRect rect = mParcelInfoText->getRect(); + rect.setOriginAndSize(rect.mLeft, rect.mBottom, new_text_width, rect.getHeight()); + + mParcelInfoText->reshape(rect.getWidth(), rect.getHeight(), TRUE); + mParcelInfoText->setRect(rect); + layoutParcelIcons(); +} + +void LLPanelTopInfoBar::update() +{ + std::string new_text; + + // don't need to have separate show_coords variable; if user requested the coords to be shown + // they will be added during the next call to the draw() method. + buildLocationString(new_text, false); + setParcelInfoText(new_text); + + updateParcelIcons(); +} + +void LLPanelTopInfoBar::updateParcelInfoText() +{ + static LLUICachedControl<bool> show_coords("NavBarShowCoordinates", false); + + if (show_coords) + { + std::string new_text; + + buildLocationString(new_text, show_coords); + setParcelInfoText(new_text); + } +} + +void LLPanelTopInfoBar::updateParcelIcons() +{ + LLViewerParcelMgr* vpm = LLViewerParcelMgr::getInstance(); + + LLViewerRegion* agent_region = gAgent.getRegion(); + LLParcel* agent_parcel = vpm->getAgentParcel(); + if (!agent_region || !agent_parcel) + return; + + if (gSavedSettings.getBOOL("NavBarShowParcelProperties")) + { + LLParcel* current_parcel; + LLViewerRegion* selection_region = vpm->getSelectionRegion(); + LLParcel* selected_parcel = vpm->getParcelSelection()->getParcel(); + + // If agent is in selected parcel we use its properties because + // they are updated more often by LLViewerParcelMgr than agent parcel properties. + // See LLViewerParcelMgr::processParcelProperties(). + // This is needed to reflect parcel restrictions changes without having to leave + // the parcel and then enter it again. See EXT-2987 + if (selected_parcel && selected_parcel->getLocalID() == agent_parcel->getLocalID() + && selection_region == agent_region) + { + current_parcel = selected_parcel; + } + else + { + current_parcel = agent_parcel; + } + + bool allow_voice = vpm->allowAgentVoice(agent_region, current_parcel); + bool allow_fly = vpm->allowAgentFly(agent_region, current_parcel); + bool allow_push = vpm->allowAgentPush(agent_region, current_parcel); + bool allow_build = vpm->allowAgentBuild(current_parcel); // true when anyone is allowed to build. See EXT-4610. + bool allow_scripts = vpm->allowAgentScripts(agent_region, current_parcel); + bool allow_damage = vpm->allowAgentDamage(agent_region, current_parcel); + + // Most icons are "block this ability" + mParcelIcon[VOICE_ICON]->setVisible( !allow_voice ); + mParcelIcon[FLY_ICON]->setVisible( !allow_fly ); + mParcelIcon[PUSH_ICON]->setVisible( !allow_push ); + mParcelIcon[BUILD_ICON]->setVisible( !allow_build ); + mParcelIcon[SCRIPTS_ICON]->setVisible( !allow_scripts ); + mParcelIcon[DAMAGE_ICON]->setVisible( allow_damage ); + mDamageText->setVisible(allow_damage); + + layoutParcelIcons(); + } + else + { + for (S32 i = 0; i < ICON_COUNT; ++i) + { + mParcelIcon[i]->setVisible(false); + } + mDamageText->setVisible(false); + } +} + +void LLPanelTopInfoBar::updateHealth() +{ + static LLUICachedControl<bool> show_icons("NavBarShowParcelProperties", false); + + // *FIXME: Status bar owns health information, should be in agent + if (show_icons && gStatusBar) + { + static S32 last_health = -1; + S32 health = gStatusBar->getHealth(); + if (health != last_health) + { + std::string text = llformat("%d%%", health); + mDamageText->setText(text); + last_health = health; + } + } +} + +void LLPanelTopInfoBar::layoutParcelIcons() +{ + // TODO: remove hard-coded values and read them as xml parameters + static const int FIRST_ICON_HPAD = 32; + static const int LAST_ICON_HPAD = 11; + + S32 left = mParcelInfoText->getRect().mRight + FIRST_ICON_HPAD; + + left = layoutWidget(mDamageText, left); + + for (int i = ICON_COUNT - 1; i >= 0; --i) + { + left = layoutWidget(mParcelIcon[i], left); + } + + LLRect rect = getRect(); + rect.set(rect.mLeft, rect.mTop, left + LAST_ICON_HPAD, rect.mBottom); + setRect(rect); +} + +S32 LLPanelTopInfoBar::layoutWidget(LLUICtrl* ctrl, S32 left) +{ + // TODO: remove hard-coded values and read them as xml parameters + static const int ICON_HPAD = 2; + + if (ctrl->getVisible()) + { + LLRect rect = ctrl->getRect(); + rect.mRight = left + rect.getWidth(); + rect.mLeft = left; + + ctrl->setRect(rect); + left += rect.getWidth() + ICON_HPAD; + } + + return left; +} + +void LLPanelTopInfoBar::onParcelIconClick(EParcelIcon icon) +{ + switch (icon) + { + case VOICE_ICON: + LLNotificationsUtil::add("NoVoice"); + break; + case FLY_ICON: + LLNotificationsUtil::add("NoFly"); + break; + case PUSH_ICON: + LLNotificationsUtil::add("PushRestricted"); + break; + case BUILD_ICON: + LLNotificationsUtil::add("NoBuild"); + break; + case SCRIPTS_ICON: + { + LLViewerRegion* region = gAgent.getRegion(); + if(region && region->getRegionFlags() & REGION_FLAGS_ESTATE_SKIP_SCRIPTS) + { + LLNotificationsUtil::add("ScriptsStopped"); + } + else if(region && region->getRegionFlags() & REGION_FLAGS_SKIP_SCRIPTS) + { + LLNotificationsUtil::add("ScriptsNotRunning"); + } + else + { + LLNotificationsUtil::add("NoOutsideScripts"); + } + break; + } + case DAMAGE_ICON: + LLNotificationsUtil::add("NotSafe"); + break; + case ICON_COUNT: + break; + // no default to get compiler warning when a new icon gets added + } +} + +void LLPanelTopInfoBar::onAgentParcelChange() +{ + update(); +} + +void LLPanelTopInfoBar::onContextMenuItemClicked(const LLSD::String& item) +{ + if (item == "landmark") + { + LLViewerInventoryItem* landmark = LLLandmarkActions::findLandmarkForAgentPos(); + + if(landmark == NULL) + { + LLSideTray::getInstance()->showPanel("panel_places", LLSD().with("type", "create_landmark")); + } + else + { + LLSideTray::getInstance()->showPanel("panel_places", + LLSD().with("type", "landmark").with("id",landmark->getUUID())); + } + } + else if (item == "copy") + { + LLSLURL slurl; + LLAgentUI::buildSLURL(slurl, false); + LLUIString location_str(slurl.getSLURLString()); + + gClipboard.copyFromString(location_str); + } +} + +void LLPanelTopInfoBar::onInfoButtonClicked() +{ + LLSideTray::getInstance()->showPanel("panel_places", LLSD().with("type", "agent")); +} diff --git a/indra/newview/llpaneltopinfobar.h b/indra/newview/llpaneltopinfobar.h new file mode 100644 index 0000000000..e417a06a64 --- /dev/null +++ b/indra/newview/llpaneltopinfobar.h @@ -0,0 +1,159 @@ +/** + * @file llpaneltopinfobar.h + * @brief Coordinates and Parcel Settings information panel definition + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LLPANELTOPINFOBAR_H_ +#define LLPANELTOPINFOBAR_H_ + +#include "llpanel.h" + +class LLButton; +class LLTextBox; +class LLIconCtrl; +class LLParcelChangeObserver; + +class LLPanelTopInfoBar : public LLPanel, public LLSingleton<LLPanelTopInfoBar> +{ + LOG_CLASS(LLPanelTopInfoBar); + +public: + LLPanelTopInfoBar(); + ~LLPanelTopInfoBar(); + + /*virtual*/ BOOL postBuild(); + /*virtual*/ void draw(); + + /** + * Updates location and parcel icons on login complete + */ + void handleLoginComplete(); + +private: + class LLParcelChangeObserver; + + friend class LLParcelChangeObserver; + + enum EParcelIcon + { + VOICE_ICON = 0, + FLY_ICON, + PUSH_ICON, + BUILD_ICON, + SCRIPTS_ICON, + DAMAGE_ICON, + ICON_COUNT + }; + + /** + * Initializes parcel icons controls. Called from the constructor. + */ + void initParcelIcons(); + + BOOL handleRightMouseDown(S32 x, S32 y, MASK mask); + + /** + * Handles clicks on the parcel icons. + */ + void onParcelIconClick(EParcelIcon icon); + + /** + * Handles clicks on the info buttons. + */ + void onInfoButtonClicked(); + + /** + * Called when agent changes the parcel. + */ + void onAgentParcelChange(); + + /** + * Called when context menu item is clicked. + */ + void onContextMenuItemClicked(const LLSD::String& userdata); + + /** + * Called when user checks/unchecks Show Coordinates menu item. + */ + void onNavBarShowParcelPropertiesCtrlChanged(); + + /** + * Shorthand to call updateParcelInfoText() and updateParcelIcons(). + */ + void update(); + + /** + * Updates parcel info text (mParcelInfoText). + */ + void updateParcelInfoText(); + + /** + * Updates parcel icons (mParcelIcon[]). + */ + void updateParcelIcons(); + + /** + * Updates health information (mDamageText). + */ + void updateHealth(); + + /** + * Lays out all parcel icons starting from right edge of the mParcelInfoText + 11px + * (see screenshots in EXT-5808 for details). + */ + void layoutParcelIcons(); + + /** + * Lays out a widget. Widget's rect mLeft becomes equal to the 'left' argument. + */ + S32 layoutWidget(LLUICtrl* ctrl, S32 left); + + /** + * Generates location string and returns it in the loc_str parameter. + */ + void buildLocationString(std::string& loc_str, bool show_coords); + + /** + * Sets new value to the mParcelInfoText and updates the size of the top bar. + */ + void setParcelInfoText(const std::string& new_text); + + LLButton* mInfoBtn; + LLTextBox* mParcelInfoText; + LLTextBox* mDamageText; + LLIconCtrl* mParcelIcon[ICON_COUNT]; + LLParcelChangeObserver* mParcelChangedObserver; + + boost::signals2::connection mParcelPropsCtrlConnection; + boost::signals2::connection mShowCoordsCtrlConnection; + boost::signals2::connection mParcelMgrConnection; +}; + +#endif /* LLPANELTOPINFOBAR_H_ */ diff --git a/indra/newview/llpanelvoiceeffect.cpp b/indra/newview/llpanelvoiceeffect.cpp new file mode 100644 index 0000000000..fd470798ee --- /dev/null +++ b/indra/newview/llpanelvoiceeffect.cpp @@ -0,0 +1,169 @@ +/** + * @file llpanelvoiceeffect.cpp + * @author Aimee + * @brief Panel to select Voice Morphs. + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llpanelvoiceeffect.h" + +#include "llcombobox.h" +#include "llfloaterreg.h" +#include "llpanel.h" +#include "lltrans.h" +#include "lltransientfloatermgr.h" +#include "llvoiceclient.h" + +static LLRegisterPanelClassWrapper<LLPanelVoiceEffect> t_panel_voice_effect("panel_voice_effect"); + +LLPanelVoiceEffect::LLPanelVoiceEffect() + : mVoiceEffectCombo(NULL) +{ + mCommitCallbackRegistrar.add("Voice.CommitVoiceEffect", boost::bind(&LLPanelVoiceEffect::onCommitVoiceEffect, this)); +} + +LLPanelVoiceEffect::~LLPanelVoiceEffect() +{ + LLView* combo_list_view = mVoiceEffectCombo->getChildView("ComboBox"); + LLTransientFloaterMgr::getInstance()->removeControlView(combo_list_view); + + if(LLVoiceClient::instanceExists()) + { + LLVoiceEffectInterface* effect_interface = LLVoiceClient::instance().getVoiceEffectInterface(); + if (effect_interface) + { + effect_interface->removeObserver(this); + } + } +} + +// virtual +BOOL LLPanelVoiceEffect::postBuild() +{ + mVoiceEffectCombo = getChild<LLComboBox>("voice_effect"); + + // Need to tell LLTransientFloaterMgr about the combo list, otherwise it can't + // be clicked while in a docked floater as it extends outside the floater area. + LLView* combo_list_view = mVoiceEffectCombo->getChildView("ComboBox"); + LLTransientFloaterMgr::getInstance()->addControlView(combo_list_view); + + LLVoiceEffectInterface* effect_interface = LLVoiceClient::instance().getVoiceEffectInterface(); + if (effect_interface) + { + effect_interface->addObserver(this); + } + + update(true); + + return TRUE; +} + +////////////////////////////////////////////////////////////////////////// +/// PRIVATE SECTION +////////////////////////////////////////////////////////////////////////// + +void LLPanelVoiceEffect::onCommitVoiceEffect() +{ + LLVoiceEffectInterface* effect_interface = LLVoiceClient::instance().getVoiceEffectInterface(); + if (!effect_interface) + { + mVoiceEffectCombo->setEnabled(false); + return; + } + + LLSD value = mVoiceEffectCombo->getValue(); + if (value.asInteger() == PREVIEW_VOICE_EFFECTS) + { + // Open the Voice Morph preview floater + LLFloaterReg::showInstance("voice_effect"); + } + else if (value.asInteger() == GET_VOICE_EFFECTS) + { + // Open the voice morphing info web page + LLWeb::loadURL(LLTrans::getString("voice_morphing_url")); + } + else + { + effect_interface->setVoiceEffect(value.asUUID()); + } + + mVoiceEffectCombo->setValue(effect_interface->getVoiceEffect()); +} + +// virtual +void LLPanelVoiceEffect::onVoiceEffectChanged(bool effect_list_updated) +{ + update(effect_list_updated); +} + +void LLPanelVoiceEffect::update(bool list_updated) +{ + if (mVoiceEffectCombo) + { + LLVoiceEffectInterface* effect_interface = LLVoiceClient::instance().getVoiceEffectInterface(); + if (list_updated) + { + // Add the default "No Voice Morph" entry. + mVoiceEffectCombo->removeall(); + mVoiceEffectCombo->add(getString("no_voice_effect"), LLUUID::null); + mVoiceEffectCombo->addSeparator(); + + // Add entries for each Voice Morph. + const voice_effect_list_t& effect_list = effect_interface->getVoiceEffectList(); + if (!effect_list.empty()) + { + for (voice_effect_list_t::const_iterator it = effect_list.begin(); it != effect_list.end(); ++it) + { + mVoiceEffectCombo->add(it->first, it->second, ADD_BOTTOM); + } + + mVoiceEffectCombo->addSeparator(); + } + + // Add the fixed entries to go to the preview floater or marketing page. + mVoiceEffectCombo->add(getString("preview_voice_effects"), PREVIEW_VOICE_EFFECTS); + mVoiceEffectCombo->add(getString("get_voice_effects"), GET_VOICE_EFFECTS); + } + + if (effect_interface && LLVoiceClient::instance().isVoiceWorking()) + { + // Select the current Voice Morph. + mVoiceEffectCombo->setValue(effect_interface->getVoiceEffect()); + mVoiceEffectCombo->setEnabled(true); + } + else + { + // If voice isn't working or Voice Effects are not supported disable the control. + mVoiceEffectCombo->setValue(LLUUID::null); + mVoiceEffectCombo->setEnabled(false); + } + } +} diff --git a/indra/newview/llpanelvoiceeffect.h b/indra/newview/llpanelvoiceeffect.h new file mode 100644 index 0000000000..b5bf2f05a8 --- /dev/null +++ b/indra/newview/llpanelvoiceeffect.h @@ -0,0 +1,73 @@ +/** + * @file llpanelvoiceeffect.h + * @author Aimee + * @brief Panel to select Voice Effects. + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_PANELVOICEEFFECT_H +#define LL_PANELVOICEEFFECT_H + +#include "llpanel.h" +#include "llvoiceclient.h" + +class LLComboBox; + +class LLPanelVoiceEffect + : public LLPanel + , public LLVoiceEffectObserver +{ +public: + LOG_CLASS(LLPanelVoiceEffect); + + LLPanelVoiceEffect(); + virtual ~LLPanelVoiceEffect(); + + virtual BOOL postBuild(); + +private: + void onCommitVoiceEffect(); + void update(bool list_updated); + + /// Called by voice effect provider when voice effect list is changed. + virtual void onVoiceEffectChanged(bool effect_list_updated); + + // Fixed entries in the Voice Morph list + typedef enum e_voice_effect_combo_items + { + NO_VOICE_EFFECT = 0, + PREVIEW_VOICE_EFFECTS = 1, + GET_VOICE_EFFECTS = 2 + } EVoiceEffectComboItems; + + LLComboBox* mVoiceEffectCombo; +}; + + +#endif //LL_PANELVOICEEFFECT_H diff --git a/indra/newview/llpanelvolumepulldown.cpp b/indra/newview/llpanelvolumepulldown.cpp index 74e37efe4e..ae52bd3703 100644 --- a/indra/newview/llpanelvolumepulldown.cpp +++ b/indra/newview/llpanelvolumepulldown.cpp @@ -56,6 +56,8 @@ // Default constructor LLPanelVolumePulldown::LLPanelVolumePulldown() { + mHoverTimer.stop(); + mCommitCallbackRegistrar.add("Vol.setControlFalse", boost::bind(&LLPanelVolumePulldown::setControlFalse, this, _2)); mCommitCallbackRegistrar.add("Vol.GoAudioPrefs", boost::bind(&LLPanelVolumePulldown::onAdvancedButtonClick, this, _2)); LLUICtrlFactory::instance().buildPanel(this, "panel_volume_pulldown.xml"); @@ -77,6 +79,11 @@ void LLPanelVolumePulldown::onMouseEnter(S32 x, S32 y, MASK mask) LLPanel::onMouseEnter(x,y,mask); } +/*virtual*/ +void LLPanelVolumePulldown::onTopLost() +{ + setVisible(FALSE); +} /*virtual*/ void LLPanelVolumePulldown::onMouseLeave(S32 x, S32 y, MASK mask) @@ -91,19 +98,12 @@ void LLPanelVolumePulldown::handleVisibilityChange ( BOOL new_visibility ) if (new_visibility) { mHoverTimer.start(); // timer will be stopped when mouse hovers over panel - gFocusMgr.setTopCtrl(this); } else { mHoverTimer.stop(); - gFocusMgr.setTopCtrl(NULL); - } -} -/*virtual*/ -void LLPanelVolumePulldown::onTopLost() -{ - setVisible(FALSE); + } } void LLPanelVolumePulldown::onAdvancedButtonClick(const LLSD& user_data) diff --git a/indra/newview/llpanelvolumepulldown.h b/indra/newview/llpanelvolumepulldown.h index 9f20caa1a8..7fb025f329 100644 --- a/indra/newview/llpanelvolumepulldown.h +++ b/indra/newview/llpanelvolumepulldown.h @@ -47,8 +47,8 @@ class LLPanelVolumePulldown : public LLPanel /*virtual*/ void draw(); /*virtual*/ void onMouseEnter(S32 x, S32 y, MASK mask); /*virtual*/ void onMouseLeave(S32 x, S32 y, MASK mask); - /*virtual*/ void handleVisibilityChange ( BOOL new_visibility ); /*virtual*/ void onTopLost(); + /*virtual*/ void handleVisibilityChange ( BOOL new_visibility ); /*virtual*/ BOOL postBuild(); private: diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp index 1c4004c37a..8fe78a0f81 100644 --- a/indra/newview/llparticipantlist.cpp +++ b/indra/newview/llparticipantlist.cpp @@ -37,8 +37,11 @@ #include "llavataractions.h" #include "llagent.h" +#include "llimview.h" +#include "llnotificationsutil.h" #include "llparticipantlist.h" #include "llspeakers.h" +#include "llviewercontrol.h" #include "llviewermenu.h" #include "llvoiceclient.h" @@ -49,8 +52,159 @@ static const LLAvatarItemAgentOnTopComparator AGENT_ON_TOP_NAME_COMPARATOR; +// helper function to update AvatarList Item's indicator in the voice participant list +static void update_speaker_indicator(const LLAvatarList* const avatar_list, const LLUUID& avatar_uuid, bool is_muted) +{ + LLAvatarListItem* item = dynamic_cast<LLAvatarListItem*>(avatar_list->getItemByValue(avatar_uuid)); + if (item) + { + LLOutputMonitorCtrl* indicator = item->getChild<LLOutputMonitorCtrl>("speaking_indicator"); + indicator->setIsMuted(is_muted); + } +} + + +// See EXT-4301. +/** + * class LLAvalineUpdater - observe the list of voice participants in session and check + * presence of Avaline Callers among them. + * + * LLAvalineUpdater is a LLVoiceClientParticipantObserver. It provides two kinds of validation: + * - whether Avaline caller presence among participants; + * - whether watched Avaline caller still exists in voice channel. + * Both validations have callbacks which will notify subscriber if any of event occur. + * + * @see findAvalineCaller() + * @see checkIfAvalineCallersExist() + */ +class LLAvalineUpdater : public LLVoiceClientParticipantObserver +{ +public: + typedef boost::function<void(const LLUUID& speaker_id)> process_avaline_callback_t; + + LLAvalineUpdater(process_avaline_callback_t found_cb, process_avaline_callback_t removed_cb) + : mAvalineFoundCallback(found_cb) + , mAvalineRemovedCallback(removed_cb) + { + LLVoiceClient::getInstance()->addObserver(this); + } + ~LLAvalineUpdater() + { + if (LLVoiceClient::instanceExists()) + { + LLVoiceClient::getInstance()->removeObserver(this); + } + } + + /** + * Adds UUID of Avaline caller to watch. + * + * @see checkIfAvalineCallersExist(). + */ + void watchAvalineCaller(const LLUUID& avaline_caller_id) + { + mAvalineCallers.insert(avaline_caller_id); + } + + void onParticipantsChanged() + { + uuid_set_t participant_uuids; + LLVoiceClient::getInstance()->getParticipantList(participant_uuids); + + + // check whether Avaline caller exists among voice participants + // and notify Participant List + findAvalineCaller(participant_uuids); + + // check whether watched Avaline callers still present among voice participant + // and remove if absents. + checkIfAvalineCallersExist(participant_uuids); + } + +private: + typedef std::set<LLUUID> uuid_set_t; + + /** + * Finds Avaline callers among voice participants and calls mAvalineFoundCallback. + * + * When Avatar is in group call with Avaline caller and then ends call Avaline caller stays + * in Group Chat floater (exists in LLSpeakerMgr). If Avatar starts call with that group again + * Avaline caller is added to voice channel AFTER Avatar is connected to group call. + * But Voice Control Panel (VCP) is filled from session LLSpeakerMgr and there is no information + * if a speaker is Avaline caller. + * + * In this case this speaker is created as avatar and will be recreated when it appears in + * Avatar's Voice session. + * + * @see LLParticipantList::onAvalineCallerFound() + */ + void findAvalineCaller(const uuid_set_t& participant_uuids) + { + uuid_set_t::const_iterator it = participant_uuids.begin(), it_end = participant_uuids.end(); + + for(; it != it_end; ++it) + { + const LLUUID& participant_id = *it; + if (!LLVoiceClient::getInstance()->isParticipantAvatar(participant_id)) + { + LL_DEBUGS("Avaline") << "Avaline caller found among voice participants: " << participant_id << LL_ENDL; + + if (mAvalineFoundCallback) + { + mAvalineFoundCallback(participant_id); + } + } + } + } + + /** + * Finds Avaline callers which are not anymore among voice participants and calls mAvalineRemovedCallback. + * + * The problem is when Avaline caller ends a call it is removed from Voice Client session but + * still exists in LLSpeakerMgr. Server does not send such information. + * This method implements a HUCK to notify subscribers that watched Avaline callers by class + * are not anymore in the call. + * + * @see LLParticipantList::onAvalineCallerRemoved() + */ + void checkIfAvalineCallersExist(const uuid_set_t& participant_uuids) + { + uuid_set_t::iterator it = mAvalineCallers.begin(); + uuid_set_t::const_iterator participants_it_end = participant_uuids.end(); + + while (it != mAvalineCallers.end()) + { + const LLUUID participant_id = *it; + LL_DEBUGS("Avaline") << "Check avaline caller: " << participant_id << LL_ENDL; + bool not_found = participant_uuids.find(participant_id) == participants_it_end; + if (not_found) + { + LL_DEBUGS("Avaline") << "Watched Avaline caller is not found among voice participants: " << participant_id << LL_ENDL; + + // notify Participant List + if (mAvalineRemovedCallback) + { + mAvalineRemovedCallback(participant_id); + } + + // remove from the watch list + mAvalineCallers.erase(it++); + } + else + { + ++it; + } + } + } + + process_avaline_callback_t mAvalineFoundCallback; + process_avaline_callback_t mAvalineRemovedCallback; + + uuid_set_t mAvalineCallers; +}; + LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* avatar_list, bool use_context_menu/* = true*/, - bool exclude_agent /*= true*/): + bool exclude_agent /*= true*/, bool can_toggle_icons /*= true*/): mSpeakerMgr(data_source), mAvatarList(avatar_list), mSortOrder(E_SORT_BY_NAME) @@ -58,6 +212,9 @@ LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* av , mExcludeAgent(exclude_agent) , mValidateSpeakerCallback(NULL) { + mAvalineUpdater = new LLAvalineUpdater(boost::bind(&LLParticipantList::onAvalineCallerFound, this, _1), + boost::bind(&LLParticipantList::onAvalineCallerRemoved, this, _1)); + mSpeakerAddListener = new SpeakerAddListener(*this); mSpeakerRemoveListener = new SpeakerRemoveListener(*this); mSpeakerClearListener = new SpeakerClearListener(*this); @@ -70,6 +227,8 @@ LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* av mSpeakerMgr->addListener(mSpeakerModeratorListener, "update_moderator"); mAvatarList->setNoItemsCommentText(LLTrans::getString("LoadingData")); + LL_DEBUGS("SpeakingIndicator") << "Set session for speaking indicators: " << mSpeakerMgr->getSessionID() << LL_ENDL; + mAvatarList->setSessionID(mSpeakerMgr->getSessionID()); mAvatarListDoubleClickConnection = mAvatarList->setItemDoubleClickCallback(boost::bind(&LLParticipantList::onAvatarListDoubleClicked, this, _1)); mAvatarListRefreshConnection = mAvatarList->setRefreshCompleteCallback(boost::bind(&LLParticipantList::onAvatarListRefreshed, this, _1, _2)); // Set onAvatarListDoubleClicked as default on_return action. @@ -85,6 +244,12 @@ LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* av mAvatarList->setContextMenu(NULL); } + if (use_context_menu && can_toggle_icons) + { + mAvatarList->setShowIcons("ParticipantListShowIcons"); + mAvatarListToggleIconsConnection = gSavedSettings.getControl("ParticipantListShowIcons")->getSignal()->connect(boost::bind(&LLAvatarList::toggleIcons, mAvatarList)); + } + //Lets fill avatarList with existing speakers LLSpeakerMgr::speaker_list_t speaker_list; mSpeakerMgr->getSpeakerList(&speaker_list, true); @@ -111,6 +276,7 @@ LLParticipantList::~LLParticipantList() mAvatarListDoubleClickConnection.disconnect(); mAvatarListRefreshConnection.disconnect(); mAvatarListReturnConnection.disconnect(); + mAvatarListToggleIconsConnection.disconnect(); // It is possible Participant List will be re-created from LLCallFloater::onCurrentChannelChanged() // See ticket EXT-3427 @@ -127,6 +293,9 @@ LLParticipantList::~LLParticipantList() } mAvatarList->setContextMenu(NULL); + mAvatarList->setComparator(NULL); + + delete mAvalineUpdater; } void LLParticipantList::setSpeakingIndicatorsVisible(BOOL visible) @@ -197,9 +366,72 @@ void LLParticipantList::onAvatarListRefreshed(LLUICtrl* ctrl, const LLSD& param) } } } + + // update voice mute state of all items. See EXT-7235 + LLSpeakerMgr::speaker_list_t speaker_list; + + // Use also participants which are not in voice session now (the second arg is TRUE). + // They can already have mModeratorMutedVoice set from the previous voice session + // and LLSpeakerVoiceModerationEvent will not be sent when speaker manager is updated next time. + mSpeakerMgr->getSpeakerList(&speaker_list, TRUE); + for(LLSpeakerMgr::speaker_list_t::iterator it = speaker_list.begin(); it != speaker_list.end(); it++) + { + const LLPointer<LLSpeaker>& speakerp = *it; + + update_speaker_indicator(list, speakerp->mID, speakerp->mModeratorMutedVoice); + } } } +/* +Seems this method is not necessary after onAvalineCallerRemoved was implemented; + +It does nothing because list item is always created with correct class type for Avaline caller. +For now Avaline Caller is removed from the LLSpeakerMgr List when it is removed from the Voice Client +session. +This happens in two cases: if Avaline Caller ends call itself or if Resident ends group call. + +Probably Avaline caller should be removed from the LLSpeakerMgr list ONLY if it ends call itself. +Asked in EXT-4301. +*/ +void LLParticipantList::onAvalineCallerFound(const LLUUID& participant_id) +{ + LLPanel* item = mAvatarList->getItemByValue(participant_id); + + if (NULL == item) + { + LL_WARNS("Avaline") << "Something wrong. Unable to find item for: " << participant_id << LL_ENDL; + return; + } + + if (typeid(*item) == typeid(LLAvalineListItem)) + { + LL_DEBUGS("Avaline") << "Avaline caller has already correct class type for: " << participant_id << LL_ENDL; + // item representing an Avaline caller has a correct type already. + return; + } + + LL_DEBUGS("Avaline") << "remove item from the list and re-add it: " << participant_id << LL_ENDL; + + // remove UUID from LLAvatarList::mIDs to be able add it again. + uuid_vec_t& ids = mAvatarList->getIDs(); + uuid_vec_t::iterator pos = std::find(ids.begin(), ids.end(), participant_id); + ids.erase(pos); + + // remove item directly + mAvatarList->removeItem(item); + + // re-add avaline caller with a correct class instance. + addAvatarIDExceptAgent(participant_id); +} + +void LLParticipantList::onAvalineCallerRemoved(const LLUUID& participant_id) +{ + LL_DEBUGS("Avaline") << "Removing avaline caller from the list: " << participant_id << LL_ENDL; + + mSpeakerMgr->removeAvalineSpeaker(participant_id); +} + void LLParticipantList::setSortOrder(EParticipantSortOrder order) { if ( mSortOrder != order ) @@ -246,8 +478,8 @@ bool LLParticipantList::onAddItemEvent(LLPointer<LLOldEvents::LLEvent> event, co bool LLParticipantList::onRemoveItemEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata) { - LLAvatarList::uuid_vector_t& group_members = mAvatarList->getIDs(); - LLAvatarList::uuid_vector_t::iterator pos = std::find(group_members.begin(), group_members.end(), event->getValue().asUUID()); + uuid_vec_t& group_members = mAvatarList->getIDs(); + uuid_vec_t::iterator pos = std::find(group_members.begin(), group_members.end(), event->getValue().asUUID()); if(pos != group_members.end()) { group_members.erase(pos); @@ -258,7 +490,7 @@ bool LLParticipantList::onRemoveItemEvent(LLPointer<LLOldEvents::LLEvent> event, bool LLParticipantList::onClearListEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata) { - LLAvatarList::uuid_vector_t& group_members = mAvatarList->getIDs(); + uuid_vec_t& group_members = mAvatarList->getIDs(); group_members.clear(); mAvatarList->setDirty(); return true; @@ -300,12 +532,7 @@ bool LLParticipantList::onSpeakerMuteEvent(LLPointer<LLOldEvents::LLEvent> event // update UI on confirmation of moderator mutes if (event->getValue().asString() == "voice") { - LLAvatarListItem* item = dynamic_cast<LLAvatarListItem*>(mAvatarList->getItemByValue(speakerp->mID)); - if (item) - { - LLOutputMonitorCtrl* indicator = item->getChild<LLOutputMonitorCtrl>("speaking_indicator"); - indicator->setIsMuted(speakerp->mModeratorMutedVoice); - } + update_speaker_indicator(mAvatarList, speakerp->mID, speakerp->mModeratorMutedVoice); } return true; } @@ -345,8 +572,19 @@ void LLParticipantList::addAvatarIDExceptAgent(const LLUUID& avatar_id) if (mExcludeAgent && gAgent.getID() == avatar_id) return; if (mAvatarList->contains(avatar_id)) return; - mAvatarList->getIDs().push_back(avatar_id); - mAvatarList->setDirty(); + bool is_avatar = LLVoiceClient::getInstance()->isParticipantAvatar(avatar_id); + + if (is_avatar) + { + mAvatarList->getIDs().push_back(avatar_id); + mAvatarList->setDirty(); + } + else + { + std::string display_name = LLVoiceClient::getInstance()->getDisplayName(avatar_id); + mAvatarList->addAvalineItem(avatar_id, mSpeakerMgr->getSessionID(), display_name.empty() ? display_name : LLTrans::getString("AvatarNameWaiting")); + mAvalineUpdater->watchAvalineCaller(avatar_id); + } adjustParticipant(avatar_id); } @@ -427,40 +665,41 @@ LLContextMenu* LLParticipantList::LLParticipantListMenu::createMenu() registrar.add("ParticipantList.ModerateVoice", boost::bind(&LLParticipantList::LLParticipantListMenu::moderateVoice, this, _2)); enable_registrar.add("ParticipantList.EnableItem", boost::bind(&LLParticipantList::LLParticipantListMenu::enableContextMenuItem, this, _2)); + enable_registrar.add("ParticipantList.EnableItem.Moderate", boost::bind(&LLParticipantList::LLParticipantListMenu::enableModerateContextMenuItem, this, _2)); enable_registrar.add("ParticipantList.CheckItem", boost::bind(&LLParticipantList::LLParticipantListMenu::checkContextMenuItem, this, _2)); // create the context menu from the XUI - LLContextMenu* main_menu = LLUICtrlFactory::getInstance()->createFromFile<LLContextMenu>( - "menu_participant_list.xml", LLMenuGL::sMenuContainer, LLViewerMenuHolderGL::child_registry_t::instance()); + LLContextMenu* main_menu = createFromFile("menu_participant_list.xml"); // Don't show sort options for P2P chat bool is_sort_visible = (mParent.mAvatarList && mParent.mAvatarList->size() > 1); main_menu->setItemVisible("SortByName", is_sort_visible); main_menu->setItemVisible("SortByRecentSpeakers", is_sort_visible); + main_menu->setItemVisible("Moderator Options Separator", isGroupModerator()); main_menu->setItemVisible("Moderator Options", isGroupModerator()); + main_menu->setItemVisible("View Icons Separator", mParent.mAvatarListToggleIconsConnection.connected()); + main_menu->setItemVisible("View Icons", mParent.mAvatarListToggleIconsConnection.connected()); main_menu->arrangeAndClear(); return main_menu; } -void LLParticipantList::LLParticipantListMenu::show(LLView* spawning_view, const std::vector<LLUUID>& uuids, S32 x, S32 y) +void LLParticipantList::LLParticipantListMenu::show(LLView* spawning_view, const uuid_vec_t& uuids, S32 x, S32 y) { - LLPanelPeopleMenus::ContextMenu::show(spawning_view, uuids, x, y); - if (uuids.size() == 0) return; - const LLUUID speaker_id = mUUIDs.front(); + LLListContextMenu::show(spawning_view, uuids, x, y); + + const LLUUID& speaker_id = mUUIDs.front(); BOOL is_muted = isMuted(speaker_id); if (is_muted) { LLMenuGL::sMenuContainer->childSetVisible("ModerateVoiceMuteSelected", false); - LLMenuGL::sMenuContainer->childSetVisible("ModerateVoiceMuteOthers", false); } else { LLMenuGL::sMenuContainer->childSetVisible("ModerateVoiceUnMuteSelected", false); - LLMenuGL::sMenuContainer->childSetVisible("ModerateVoiceUnMuteOthers", false); } } @@ -500,10 +739,26 @@ void LLParticipantList::LLParticipantListMenu::toggleMute(const LLSD& userdata, { return; } + LLAvatarListItem* item = dynamic_cast<LLAvatarListItem*>(mParent.mAvatarList->getItemByValue(speaker_id)); + if (NULL == item) return; - name = speakerp->mDisplayName; + name = item->getAvatarName(); - LLMute mute(speaker_id, name, speakerp->mType == LLSpeaker::SPEAKER_AGENT ? LLMute::AGENT : LLMute::OBJECT); + LLMute::EType mute_type; + switch (speakerp->mType) + { + case LLSpeaker::SPEAKER_AGENT: + mute_type = LLMute::AGENT; + break; + case LLSpeaker::SPEAKER_OBJECT: + mute_type = LLMute::OBJECT; + break; + case LLSpeaker::SPEAKER_EXTERNAL: + default: + mute_type = LLMute::EXTERNAL; + break; + } + LLMute mute(speaker_id, name, mute_type); if (!is_muted) { @@ -549,16 +804,17 @@ void LLParticipantList::LLParticipantListMenu::moderateVoice(const LLSD& userdat if (!gAgent.getRegion()) return; bool moderate_selected = userdata.asString() == "selected"; - const LLUUID& selected_avatar_id = mUUIDs.front(); - bool is_muted = isMuted(selected_avatar_id); if (moderate_selected) { + const LLUUID& selected_avatar_id = mUUIDs.front(); + bool is_muted = isMuted(selected_avatar_id); moderateVoiceParticipant(selected_avatar_id, is_muted); } else { - moderateVoiceOtherParticipants(selected_avatar_id, is_muted); + bool unmute_all = userdata.asString() == "unmute_all"; + moderateVoiceAllParticipants(unmute_all); } } @@ -571,40 +827,62 @@ void LLParticipantList::LLParticipantListMenu::moderateVoiceParticipant(const LL } } -void LLParticipantList::LLParticipantListMenu::moderateVoiceOtherParticipants(const LLUUID& excluded_avatar_id, bool unmute) +void LLParticipantList::LLParticipantListMenu::moderateVoiceAllParticipants(bool unmute) { LLIMSpeakerMgr* mgr = dynamic_cast<LLIMSpeakerMgr*>(mParent.mSpeakerMgr); if (mgr) { - mgr->moderateVoiceOtherParticipants(excluded_avatar_id, unmute); + if (!unmute) + { + LLSD payload; + payload["session_id"] = mgr->getSessionID(); + LLNotificationsUtil::add("ConfirmMuteAll", LLSD(), payload, confirmMuteAllCallback); + return; + } + + mgr->moderateVoiceAllParticipants(unmute); + } +} + +// static +void LLParticipantList::LLParticipantListMenu::confirmMuteAllCallback(const LLSD& notification, const LLSD& response) +{ + S32 option = LLNotificationsUtil::getSelectedOption(notification, response); + // if Cancel pressed + if (option == 1) + { + return; + } + + const LLSD& payload = notification["payload"]; + const LLUUID& session_id = payload["session_id"]; + + LLIMSpeakerMgr * speaker_manager = dynamic_cast<LLIMSpeakerMgr*> ( + LLIMModel::getInstance()->getSpeakerManager(session_id)); + if (speaker_manager) + { + speaker_manager->moderateVoiceAllParticipants(false); } + + return; } + bool LLParticipantList::LLParticipantListMenu::enableContextMenuItem(const LLSD& userdata) { std::string item = userdata.asString(); + const LLUUID& participant_id = mUUIDs.front(); + + // For now non of "can_view_profile" action and menu actions listed below except "can_block" + // can be performed for Avaline callers. + bool is_participant_avatar = LLVoiceClient::getInstance()->isParticipantAvatar(participant_id); + if (!is_participant_avatar && "can_block" != item) return false; + if (item == "can_mute_text" || "can_block" == item || "can_share" == item || "can_im" == item || "can_pay" == item) { return mUUIDs.front() != gAgentID; } - else if (item == "can_allow_text_chat") - { - return isGroupModerator(); - } - else if ("can_moderate_voice" == item) - { - if (isGroupModerator()) - { - LLPointer<LLSpeaker> speakerp = mParent.mSpeakerMgr->findSpeaker(mUUIDs.front()); - if (speakerp.notNull()) - { - // not in voice participants can not be moderated - return speakerp->isInVoiceChannel(); - } - } - return false; - } else if (item == std::string("can_add")) { // We can add friends if: @@ -613,7 +891,7 @@ bool LLParticipantList::LLParticipantListMenu::enableContextMenuItem(const LLSD& bool result = (mUUIDs.size() > 0); - std::vector<LLUUID>::const_iterator + uuid_vec_t::const_iterator id = mUUIDs.begin(), uuids_end = mUUIDs.end(); @@ -630,13 +908,43 @@ bool LLParticipantList::LLParticipantListMenu::enableContextMenuItem(const LLSD& else if (item == "can_call") { bool not_agent = mUUIDs.front() != gAgentID; - bool can_call = not_agent && LLVoiceClient::voiceEnabled() && gVoiceClient->voiceWorking(); + bool can_call = not_agent && LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking(); return can_call; } return true; } +/* +Processed menu items with such parameters: + can_allow_text_chat + can_moderate_voice +*/ +bool LLParticipantList::LLParticipantListMenu::enableModerateContextMenuItem(const LLSD& userdata) +{ + // only group moderators can perform actions related to this "enable callback" + if (!isGroupModerator()) return false; + + const LLUUID& participant_id = mUUIDs.front(); + LLPointer<LLSpeaker> speakerp = mParent.mSpeakerMgr->findSpeaker(participant_id); + + // not in voice participants can not be moderated + bool speaker_in_voice = speakerp.notNull() && speakerp->isInVoiceChannel(); + + const std::string& item = userdata.asString(); + + if ("can_moderate_voice" == item) + { + return speaker_in_voice; + } + + // For now non of menu actions except "can_moderate_voice" can be performed for Avaline callers. + bool is_participant_avatar = LLVoiceClient::getInstance()->isParticipantAvatar(participant_id); + if (!is_participant_avatar) return false; + + return true; +} + bool LLParticipantList::LLParticipantListMenu::checkContextMenuItem(const LLSD& userdata) { std::string item = userdata.asString(); diff --git a/indra/newview/llparticipantlist.h b/indra/newview/llparticipantlist.h index e1b1b5af00..3fe45fa591 100644 --- a/indra/newview/llparticipantlist.h +++ b/indra/newview/llparticipantlist.h @@ -32,12 +32,13 @@ #include "llviewerprecompiledheaders.h" #include "llevent.h" -#include "llpanelpeoplemenus.h" #include "llavatarlist.h" // for LLAvatarItemRecentSpeakerComparator +#include "lllistcontextmenu.h" class LLSpeakerMgr; class LLAvatarList; class LLUICtrl; +class LLAvalineUpdater; class LLParticipantList { @@ -46,7 +47,7 @@ class LLParticipantList typedef boost::function<bool (const LLUUID& speaker_id)> validate_speaker_callback_t; - LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* avatar_list, bool use_context_menu = true, bool exclude_agent = true); + LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* avatar_list, bool use_context_menu = true, bool exclude_agent = true, bool can_toggle_icons = true); ~LLParticipantList(); void setSpeakingIndicatorsVisible(BOOL visible); @@ -147,16 +148,17 @@ class LLParticipantList /** * Menu used in the participant list. */ - class LLParticipantListMenu : public LLPanelPeopleMenus::ContextMenu + class LLParticipantListMenu : public LLListContextMenu { public: LLParticipantListMenu(LLParticipantList& parent):mParent(parent){}; /*virtual*/ LLContextMenu* createMenu(); - /*virtual*/ void show(LLView* spawning_view, const std::vector<LLUUID>& uuids, S32 x, S32 y); + /*virtual*/ void show(LLView* spawning_view, const uuid_vec_t& uuids, S32 x, S32 y); protected: LLParticipantList& mParent; private: bool enableContextMenuItem(const LLSD& userdata); + bool enableModerateContextMenuItem(const LLSD& userdata); bool checkContextMenuItem(const LLSD& userdata); void sortParticipantList(const LLSD& userdata); @@ -185,7 +187,7 @@ class LLParticipantList * @param userdata can be "selected" or "others". * * @see moderateVoiceParticipant() - * @see moderateVoiceOtherParticipants() + * @see moderateVoiceAllParticipants() */ void moderateVoice(const LLSD& userdata); @@ -198,22 +200,22 @@ class LLParticipantList * @param[in] avatar_id UUID of avatar to be processed * @param[in] unmute if true - specified avatar will be muted, otherwise - unmuted. * - * @see moderateVoiceOtherParticipants() + * @see moderateVoiceAllParticipants() */ void moderateVoiceParticipant(const LLUUID& avatar_id, bool unmute); /** - * Mutes/Unmutes all avatars except specified for current group voice chat. + * Mutes/Unmutes all avatars for current group voice chat. * * It only marks avatars as muted for session and does not use local Agent's Block list. - * It based call moderateVoiceParticipant() for each avatar should be muted/unmuted. * - * @param[in] excluded_avatar_id UUID of avatar NOT to be processed * @param[in] unmute if true - avatars will be muted, otherwise - unmuted. * * @see moderateVoiceParticipant() */ - void moderateVoiceOtherParticipants(const LLUUID& excluded_avatar_id, bool unmute); + void moderateVoiceAllParticipants(bool unmute); + + static void confirmMuteAllCallback(const LLSD& notification, const LLSD& response); }; /** @@ -235,6 +237,9 @@ class LLParticipantList void onAvatarListDoubleClicked(LLUICtrl* ctrl); void onAvatarListRefreshed(LLUICtrl* ctrl, const LLSD& param); + void onAvalineCallerFound(const LLUUID& participant_id); + void onAvalineCallerRemoved(const LLUUID& participant_id); + /** * Adjusts passed participant to work properly. * @@ -268,7 +273,9 @@ class LLParticipantList boost::signals2::connection mAvatarListDoubleClickConnection; boost::signals2::connection mAvatarListRefreshConnection; boost::signals2::connection mAvatarListReturnConnection; + boost::signals2::connection mAvatarListToggleIconsConnection; LLPointer<LLAvatarItemRecentSpeakerComparator> mSortByRecentSpeakers; validate_speaker_callback_t mValidateSpeakerCallback; + LLAvalineUpdater* mAvalineUpdater; }; diff --git a/indra/newview/llplacesinventorybridge.cpp b/indra/newview/llplacesinventorybridge.cpp index 4fe69f295c..f59a55cb8b 100644 --- a/indra/newview/llplacesinventorybridge.cpp +++ b/indra/newview/llplacesinventorybridge.cpp @@ -122,7 +122,7 @@ void LLPlacesFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags) } //virtual -void LLPlacesFolderBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) +void LLPlacesFolderBridge::performAction(LLInventoryModel* model, std::string action) { if ("expand" == action) { @@ -136,7 +136,7 @@ void LLPlacesFolderBridge::performAction(LLFolderView* folder, LLInventoryModel* } else { - LLFolderBridge::performAction(folder, model, action); + LLFolderBridge::performAction(model, action); } } @@ -158,6 +158,7 @@ LLInvFVBridge* LLPlacesInventoryBridgeBuilder::createBridge( LLAssetType::EType actual_asset_type, LLInventoryType::EType inv_type, LLInventoryPanel* inventory, + LLFolderView* root, const LLUUID& uuid, U32 flags/* = 0x00*/) const { @@ -167,9 +168,9 @@ LLInvFVBridge* LLPlacesInventoryBridgeBuilder::createBridge( case LLAssetType::AT_LANDMARK: if(!(inv_type == LLInventoryType::IT_LANDMARK)) { - llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; + llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << LLInventoryType::lookupHumanReadable(inv_type) << " on uuid " << uuid << llendl; } - new_listener = new LLPlacesLandmarkBridge(inv_type, inventory, uuid, flags); + new_listener = new LLPlacesLandmarkBridge(inv_type, inventory, root, uuid, flags); break; case LLAssetType::AT_CATEGORY: if (actual_asset_type == LLAssetType::AT_LINK_FOLDER) @@ -180,11 +181,12 @@ LLInvFVBridge* LLPlacesInventoryBridgeBuilder::createBridge( actual_asset_type, inv_type, inventory, + root, uuid, flags); break; } - new_listener = new LLPlacesFolderBridge(inv_type, inventory, uuid); + new_listener = new LLPlacesFolderBridge(inv_type, inventory, root, uuid); break; default: new_listener = LLInventoryFVBridgeBuilder::createBridge( @@ -192,6 +194,7 @@ LLInvFVBridge* LLPlacesInventoryBridgeBuilder::createBridge( actual_asset_type, inv_type, inventory, + root, uuid, flags); } diff --git a/indra/newview/llplacesinventorybridge.h b/indra/newview/llplacesinventorybridge.h index 66a8e8e54d..7e5170cc33 100644 --- a/indra/newview/llplacesinventorybridge.h +++ b/indra/newview/llplacesinventorybridge.h @@ -48,8 +48,15 @@ public: /*virtual*/ void buildContextMenu(LLMenuGL& menu, U32 flags); protected: - LLPlacesLandmarkBridge(LLInventoryType::EType type, LLInventoryPanel* inventory, const LLUUID& uuid, U32 flags = 0x00) - : LLLandmarkBridge(inventory, uuid, flags) {mInvType = type;} + LLPlacesLandmarkBridge(LLInventoryType::EType type, + LLInventoryPanel* inventory, + LLFolderView* root, + const LLUUID& uuid, + U32 flags = 0x00) : + LLLandmarkBridge(inventory, root, uuid, flags) + { + mInvType = type; + } }; /** @@ -61,12 +68,17 @@ class LLPlacesFolderBridge : public LLFolderBridge public: /*virtual*/ void buildContextMenu(LLMenuGL& menu, U32 flags); - /*virtual*/ void performAction(LLFolderView* folder, LLInventoryModel* model, std::string action); + /*virtual*/ void performAction(LLInventoryModel* model, std::string action); protected: - LLPlacesFolderBridge(LLInventoryType::EType type, LLInventoryPanel* inventory, const LLUUID& uuid) - : LLFolderBridge(inventory, uuid) {mInvType = type;} - + LLPlacesFolderBridge(LLInventoryType::EType type, + LLInventoryPanel* inventory, + LLFolderView* root, + const LLUUID& uuid) : + LLFolderBridge(inventory, root, uuid) + { + mInvType = type; + } LLFolderViewFolder* getFolder(); }; @@ -79,13 +91,13 @@ protected: class LLPlacesInventoryBridgeBuilder : public LLInventoryFVBridgeBuilder { public: - /*virtual*/ LLInvFVBridge* createBridge( - LLAssetType::EType asset_type, - LLAssetType::EType actual_asset_type, - LLInventoryType::EType inv_type, - LLInventoryPanel* inventory, - const LLUUID& uuid, - U32 flags = 0x00) const; + /*virtual*/ LLInvFVBridge* createBridge(LLAssetType::EType asset_type, + LLAssetType::EType actual_asset_type, + LLInventoryType::EType inv_type, + LLInventoryPanel* inventory, + LLFolderView* root, + const LLUUID& uuid, + U32 flags = 0x00) const; }; #endif // LL_LLPLACESINVENTORYBRIDGE_H diff --git a/indra/newview/llplacesinventorypanel.cpp b/indra/newview/llplacesinventorypanel.cpp index 8edeebaeeb..0930a7be7f 100644 --- a/indra/newview/llplacesinventorypanel.cpp +++ b/indra/newview/llplacesinventorypanel.cpp @@ -68,9 +68,9 @@ BOOL LLPlacesInventoryPanel::postBuild() // clear Contents(); { - mFolders->destroyView(); - mFolders->getParent()->removeChild(mFolders); - mFolders->die(); + mFolderRoot->destroyView(); + mFolderRoot->getParent()->removeChild(mFolderRoot); + mFolderRoot->die(); if( mScroller ) { @@ -78,7 +78,7 @@ BOOL LLPlacesInventoryPanel::postBuild() mScroller->die(); mScroller = NULL; } - mFolders = NULL; + mFolderRoot = NULL; } @@ -92,15 +92,16 @@ BOOL LLPlacesInventoryPanel::postBuild() 0); LLPlacesFolderView::Params p; p.name = getName(); + p.title = getLabel(); p.rect = folder_rect; p.parent_panel = this; - mFolders = (LLFolderView*)LLUICtrlFactory::create<LLPlacesFolderView>(p); - mFolders->setAllowMultiSelect(mAllowMultiSelect); + mFolderRoot = (LLFolderView*)LLUICtrlFactory::create<LLPlacesFolderView>(p); + mFolderRoot->setAllowMultiSelect(mAllowMultiSelect); } mCommitCallbackRegistrar.popScope(); - mFolders->setCallbackRegistrar(&mCommitCallbackRegistrar); + mFolderRoot->setCallbackRegistrar(&mCommitCallbackRegistrar); // scroller { @@ -115,13 +116,14 @@ BOOL LLPlacesInventoryPanel::postBuild() mScroller = LLUICtrlFactory::create<LLScrollContainer>(p); } addChild(mScroller); - mScroller->addChild(mFolders); + mScroller->addChild(mFolderRoot); - mFolders->setScrollContainer(mScroller); + mFolderRoot->setScrollContainer(mScroller); + mFolderRoot->addChild(mFolderRoot->mStatusTextBox); // cut subitems - mFolders->setUseEllipses(true); + mFolderRoot->setUseEllipses(true); return TRUE; } @@ -130,17 +132,17 @@ BOOL LLPlacesInventoryPanel::postBuild() void LLPlacesInventoryPanel::saveFolderState() { mSavedFolderState->setApply(FALSE); - getRootFolder()->applyFunctorRecursively(*mSavedFolderState); + mFolderRoot->applyFunctorRecursively(*mSavedFolderState); } // re-open folders which state was saved void LLPlacesInventoryPanel::restoreFolderState() { mSavedFolderState->setApply(TRUE); - getRootFolder()->applyFunctorRecursively(*mSavedFolderState); + mFolderRoot->applyFunctorRecursively(*mSavedFolderState); LLOpenFoldersWithSelection opener; - getRootFolder()->applyFunctorRecursively(opener); - getRootFolder()->scrollToShowSelection(); + mFolderRoot->applyFunctorRecursively(opener); + mFolderRoot->scrollToShowSelection(); } S32 LLPlacesInventoryPanel::notify(const LLSD& info) @@ -150,11 +152,11 @@ S32 LLPlacesInventoryPanel::notify(const LLSD& info) std::string str_action = info["action"]; if(str_action == "select_first") { - return getRootFolder()->notify(info); + return mFolderRoot->notify(info); } else if(str_action == "select_last") { - return getRootFolder()->notify(info); + return mFolderRoot->notify(info); } } return 0; @@ -174,6 +176,15 @@ S32 LLPlacesInventoryPanel::notify(const LLSD& info) // PUBLIC METHODS ////////////////////////////////////////////////////////////////////////// +LLPlacesFolderView::LLPlacesFolderView(const LLFolderView::Params& p) +: LLFolderView(p) +{ + // we do not need auto select functionality in places landmarks, so override default behavior. + // this disables applying of the LLSelectFirstFilteredItem in LLFolderView::doIdle. + // Fixed issues: EXT-1631, EXT-4994. + mAutoSelectOverride = TRUE; +} + BOOL LLPlacesFolderView::handleRightMouseDown(S32 x, S32 y, MASK mask) { // let children to change selection first diff --git a/indra/newview/llplacesinventorypanel.h b/indra/newview/llplacesinventorypanel.h index 86937e7c7f..04c6758eae 100644 --- a/indra/newview/llplacesinventorypanel.h +++ b/indra/newview/llplacesinventorypanel.h @@ -67,7 +67,7 @@ private: class LLPlacesFolderView : public LLFolderView { public: - LLPlacesFolderView(const LLFolderView::Params& p) : LLFolderView(p) {}; + LLPlacesFolderView(const LLFolderView::Params& p); /** * Handles right mouse down * diff --git a/indra/newview/llpopupview.cpp b/indra/newview/llpopupview.cpp new file mode 100644 index 0000000000..4523bf2ba4 --- /dev/null +++ b/indra/newview/llpopupview.cpp @@ -0,0 +1,238 @@ +/** + * @file llpopupview.cpp + * @brief Holds transient popups + * + * $LicenseInfo:firstyear=2001&license=viewergpl$ + * + * Copyright (c) 2001-2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ +#include "llviewerprecompiledheaders.h" + +#include "llpopupview.h" + +static LLRegisterPanelClassWrapper<LLPopupView> r("popup_holder"); + +bool view_visible_and_enabled(LLView* viewp) +{ + return viewp->getVisible() && viewp->getEnabled(); +} + +bool view_visible(LLView* viewp) +{ + return viewp->getVisible(); +} + + +LLPopupView::LLPopupView() +{ + // register ourself as handler of UI popups + LLUI::setPopupFuncs(boost::bind(&LLPopupView::addPopup, this, _1), boost::bind(&LLPopupView::removePopup, this, _1), boost::bind(&LLPopupView::clearPopups, this)); +} + +LLPopupView::~LLPopupView() +{ + // set empty callback function so we can't handle popups anymore + LLUI::setPopupFuncs(LLUI::add_popup_t(), LLUI::remove_popup_t(), LLUI::clear_popups_t()); +} + +void LLPopupView::draw() +{ + S32 screen_x, screen_y; + + // remove dead popups + for (popup_list_t::iterator popup_it = mPopups.begin(); + popup_it != mPopups.end();) + { + if (!popup_it->get()) + { + mPopups.erase(popup_it++); + } + else + { + popup_it++; + } + } + + // draw in reverse order (most recent is on top) + for (popup_list_t::reverse_iterator popup_it = mPopups.rbegin(); + popup_it != mPopups.rend();) + { + LLView* popup = popup_it->get(); + + if (popup->getVisible()) + { + popup->localPointToScreen(0, 0, &screen_x, &screen_y); + + LLUI::pushMatrix(); + { + LLUI::translate( (F32) screen_x, (F32) screen_y, 0.f); + popup->draw(); + } + LLUI::popMatrix(); + } + ++popup_it; + } + + LLPanel::draw(); +} + +BOOL LLPopupView::handleMouseEvent(boost::function<BOOL(LLView*, S32, S32)> func, + boost::function<bool(LLView*)> predicate, + S32 x, S32 y, + bool close_popups) +{ + BOOL handled = FALSE; + + // make a copy of list of popups, in case list is modified during mouse event handling + popup_list_t popups(mPopups); + for (popup_list_t::iterator popup_it = popups.begin(), popup_end = popups.end(); + popup_it != popup_end; + ++popup_it) + { + LLView* popup = popup_it->get(); + if (!popup + || !predicate(popup)) + { + continue; + } + + S32 popup_x, popup_y; + if (localPointToOtherView(x, y, &popup_x, &popup_y, popup) + && popup->pointInView(popup_x, popup_y)) + { + if (func(popup, popup_x, popup_y)) + { + handled = TRUE; + break; + } + } + + if (close_popups) + { + mPopups.remove(*popup_it); + popup->onTopLost(); + } + } + + return handled; +} + + +BOOL LLPopupView::handleMouseDown(S32 x, S32 y, MASK mask) +{ + if (!handleMouseEvent(boost::bind(&LLMouseHandler::handleMouseDown, _1, _2, _3, mask), view_visible_and_enabled, x, y, true)) + { + return FALSE; + } + return TRUE; +} + +BOOL LLPopupView::handleMouseUp(S32 x, S32 y, MASK mask) +{ + return handleMouseEvent(boost::bind(&LLMouseHandler::handleMouseUp, _1, _2, _3, mask), view_visible_and_enabled, x, y, false); +} + +BOOL LLPopupView::handleMiddleMouseDown(S32 x, S32 y, MASK mask) +{ + if (!handleMouseEvent(boost::bind(&LLMouseHandler::handleMiddleMouseDown, _1, _2, _3, mask), view_visible_and_enabled, x, y, true)) + { + return FALSE; + } + return TRUE; +} + +BOOL LLPopupView::handleMiddleMouseUp(S32 x, S32 y, MASK mask) +{ + return handleMouseEvent(boost::bind(&LLMouseHandler::handleMiddleMouseUp, _1, _2, _3, mask), view_visible_and_enabled, x, y, false); +} + +BOOL LLPopupView::handleRightMouseDown(S32 x, S32 y, MASK mask) +{ + if (!handleMouseEvent(boost::bind(&LLMouseHandler::handleRightMouseDown, _1, _2, _3, mask), view_visible_and_enabled, x, y, true)) + { + return FALSE; + } + return TRUE; +} + +BOOL LLPopupView::handleRightMouseUp(S32 x, S32 y, MASK mask) +{ + return handleMouseEvent(boost::bind(&LLMouseHandler::handleRightMouseUp, _1, _2, _3, mask), view_visible_and_enabled, x, y, false); +} + +BOOL LLPopupView::handleDoubleClick(S32 x, S32 y, MASK mask) +{ + return handleMouseEvent(boost::bind(&LLMouseHandler::handleDoubleClick, _1, _2, _3, mask), view_visible_and_enabled, x, y, false); +} + +BOOL LLPopupView::handleHover(S32 x, S32 y, MASK mask) +{ + return handleMouseEvent(boost::bind(&LLMouseHandler::handleHover, _1, _2, _3, mask), view_visible_and_enabled, x, y, false); +} + +BOOL LLPopupView::handleScrollWheel(S32 x, S32 y, S32 clicks) +{ + return handleMouseEvent(boost::bind(&LLMouseHandler::handleScrollWheel, _1, _2, _3, clicks), view_visible_and_enabled, x, y, false); +} + +BOOL LLPopupView::handleToolTip(S32 x, S32 y, MASK mask) +{ + return handleMouseEvent(boost::bind(&LLMouseHandler::handleToolTip, _1, _2, _3, mask), view_visible, x, y, false); +} + +void LLPopupView::addPopup(LLView* popup) +{ + if (popup) + { + mPopups.remove(popup->getHandle()); + mPopups.push_front(popup->getHandle()); + } +} + +void LLPopupView::removePopup(LLView* popup) +{ + if (popup) + { + mPopups.remove(popup->getHandle()); + popup->onTopLost(); + } +} + +void LLPopupView::clearPopups() +{ + for (popup_list_t::iterator popup_it = mPopups.begin(); + popup_it != mPopups.end();) + { + LLView* popup = popup_it->get(); + + popup_list_t::iterator cur_popup_it = popup_it; + ++popup_it; + + mPopups.erase(cur_popup_it); + popup->onTopLost(); + } +} + diff --git a/indra/newview/llpopupview.h b/indra/newview/llpopupview.h new file mode 100644 index 0000000000..1ec61d5450 --- /dev/null +++ b/indra/newview/llpopupview.h @@ -0,0 +1,67 @@ +/** + * @file llpopupview.h + * @brief Holds transient popups + * + * $LicenseInfo:firstyear=2001&license=viewergpl$ + * + * Copyright (c) 2001-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLPOPUPVIEW_H +#define LL_LLPOPUPVIEW_H + +#include "llpanel.h" + +class LLPopupView : public LLPanel +{ +public: + LLPopupView(); + ~LLPopupView(); + + /*virtual*/ void draw(); + /*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask); + /*virtual*/ BOOL handleMouseUp(S32 x, S32 y, MASK mask); + /*virtual*/ BOOL handleMiddleMouseDown(S32 x, S32 y, MASK mask); + /*virtual*/ BOOL handleMiddleMouseUp(S32 x, S32 y, MASK mask); + /*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask); + /*virtual*/ BOOL handleRightMouseUp(S32 x, S32 y, MASK mask); + /*virtual*/ BOOL handleDoubleClick(S32 x, S32 y, MASK mask); + /*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask); + /*virtual*/ BOOL handleScrollWheel(S32 x, S32 y, S32 clicks); + /*virtual*/ BOOL handleToolTip(S32 x, S32 y, MASK mask); + + void addPopup(LLView* popup); + void removePopup(LLView* popup); + void clearPopups(); + + typedef std::list<LLHandle<LLView> > popup_list_t; + popup_list_t getCurrentPopups() { return mPopups; } + +private: + BOOL handleMouseEvent(boost::function<BOOL(LLView*, S32, S32)>, boost::function<bool(LLView*)>, S32 x, S32 y, bool close_popups); + popup_list_t mPopups; +}; +#endif //LL_LLROOTVIEW_H diff --git a/indra/newview/llpreview.cpp b/indra/newview/llpreview.cpp index 0b0c03e9e9..dd31a62642 100644 --- a/indra/newview/llpreview.cpp +++ b/indra/newview/llpreview.cpp @@ -36,7 +36,7 @@ #include "llpreview.h" #include "lllineeditor.h" -#include "llinventory.h" +#include "llinventorydefines.h" #include "llinventorymodel.h" #include "llresmgr.h" #include "lltextbox.h" @@ -138,7 +138,7 @@ void LLPreview::onCommit() const LLViewerInventoryItem *item = dynamic_cast<const LLViewerInventoryItem*>(getItem()); if(item) { - if (!item->isComplete()) + if (!item->isFinished()) { // We are attempting to save an item that was never loaded llwarns << "LLPreview::onCommit() called with mIsComplete == FALSE" @@ -179,10 +179,9 @@ void LLPreview::onCommit() // update the object itself. if( item->getType() == LLAssetType::AT_OBJECT ) { - LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); - if( avatar ) + if (isAgentAvatarValid()) { - LLViewerObject* obj = avatar->getWornAttachment( item->getUUID() ); + LLViewerObject* obj = gAgentAvatarp->getWornAttachment( item->getUUID() ); if( obj ) { LLSelectMgr::getInstance()->deselectAll(); diff --git a/indra/newview/llpreviewanim.cpp b/indra/newview/llpreviewanim.cpp index 92bd4dc62b..262961b73b 100644 --- a/indra/newview/llpreviewanim.cpp +++ b/indra/newview/llpreviewanim.cpp @@ -71,7 +71,7 @@ BOOL LLPreviewAnim::postBuild() const LLInventoryItem* item = getItem(); if(item) { - gAgent.getAvatarObject()->createMotion(item->getAssetUUID()); // preload the animation + gAgentAvatarp->createMotion(item->getAssetUUID()); // preload the animation childSetText("desc", item->getDescription()); } @@ -79,7 +79,7 @@ BOOL LLPreviewAnim::postBuild() childSetAction("Anim audition btn",auditionAnim, this); childSetCommitCallback("desc", LLPreview::onText, this); - childSetPrevalidate("desc", &LLLineEditor::prevalidateASCIIPrintableNoPipe); + childSetPrevalidate("desc", &LLTextValidate::validateASCIIPrintableNoPipe); return LLPreview::postBuild(); } @@ -125,10 +125,7 @@ void LLPreviewAnim::playAnim( void *userdata ) { self->mPauseRequest = NULL; gAgent.sendAnimationRequest(itemID, ANIM_REQUEST_START); - - LLVOAvatar* avatar = gAgent.getAvatarObject(); - LLMotion* motion = avatar->findMotion(itemID); - + LLMotion* motion = gAgentAvatarp->findMotion(itemID); if (motion) { motion->setDeactivateCallback(&endAnimCallback, (void *)(new LLHandle<LLFloater>(self->getHandle()))); @@ -136,7 +133,7 @@ void LLPreviewAnim::playAnim( void *userdata ) } else { - gAgent.getAvatarObject()->stopMotion(itemID); + gAgentAvatarp->stopMotion(itemID); gAgent.sendAnimationRequest(itemID, ANIM_REQUEST_STOP); } } @@ -161,10 +158,8 @@ void LLPreviewAnim::auditionAnim( void *userdata ) if (self->childGetValue("Anim audition btn").asBoolean() ) { self->mPauseRequest = NULL; - gAgent.getAvatarObject()->startMotion(item->getAssetUUID()); - - LLVOAvatar* avatar = gAgent.getAvatarObject(); - LLMotion* motion = avatar->findMotion(itemID); + gAgentAvatarp->startMotion(item->getAssetUUID()); + LLMotion* motion = gAgentAvatarp->findMotion(itemID); if (motion) { @@ -173,7 +168,7 @@ void LLPreviewAnim::auditionAnim( void *userdata ) } else { - gAgent.getAvatarObject()->stopMotion(itemID); + gAgentAvatarp->stopMotion(itemID); gAgent.sendAnimationRequest(itemID, ANIM_REQUEST_STOP); } } @@ -186,11 +181,9 @@ void LLPreviewAnim::onClose(bool app_quitting) if(item) { - gAgent.getAvatarObject()->stopMotion(item->getAssetUUID()); + gAgentAvatarp->stopMotion(item->getAssetUUID()); gAgent.sendAnimationRequest(item->getAssetUUID(), ANIM_REQUEST_STOP); - - LLVOAvatar* avatar = gAgent.getAvatarObject(); - LLMotion* motion = avatar->findMotion(item->getAssetUUID()); + LLMotion* motion = gAgentAvatarp->findMotion(item->getAssetUUID()); if (motion) { diff --git a/indra/newview/llpreviewgesture.cpp b/indra/newview/llpreviewgesture.cpp index 53e351e66e..ff315d3c53 100644 --- a/indra/newview/llpreviewgesture.cpp +++ b/indra/newview/llpreviewgesture.cpp @@ -31,52 +31,31 @@ */ #include "llviewerprecompiledheaders.h" - #include "llpreviewgesture.h" -#include <algorithm> - -// libraries -#include "lldatapacker.h" -#include "lldarray.h" -#include "llstring.h" -#include "lldir.h" -#include "llfloaterreg.h" -#include "llmultigesture.h" -#include "llnotificationsutil.h" -#include "llvfile.h" - -// newview -#include "llagent.h" // todo: remove +#include "llagent.h" +#include "llanimstatelabels.h" #include "llanimationstates.h" +#include "llappviewer.h" // gVFS #include "llassetuploadresponders.h" -#include "llbutton.h" #include "llcheckboxctrl.h" #include "llcombobox.h" #include "lldelayedgestureerror.h" -#include "llfloatergesture.h" // for some label constants +#include "llfloaterreg.h" #include "llgesturemgr.h" +#include "llinventorydefines.h" +#include "llinventoryfunctions.h" #include "llinventorymodel.h" -#include "llkeyboard.h" -#include "lllineeditor.h" +#include "llinventorymodelbackgroundfetch.h" +#include "llmultigesture.h" +#include "llnotificationsutil.h" #include "llradiogroup.h" -#include "llscrolllistctrl.h" -#include "llscrolllistitem.h" -#include "llscrolllistcell.h" -#include "lltextbox.h" -#include "lluictrlfactory.h" -#include "llviewerinventory.h" -#include "llviewerobject.h" +#include "llresmgr.h" +#include "lltrans.h" +#include "llvfile.h" #include "llviewerobjectlist.h" #include "llviewerregion.h" #include "llviewerstats.h" -#include "llviewerwindow.h" // busycount -#include "llvoavatarself.h" -#include "llappviewer.h" // gVFS -#include "llanimstatelabels.h" -#include "llresmgr.h" -#include "lltrans.h" - std::string NONE_LABEL; std::string SHIFT_LABEL; @@ -97,7 +76,7 @@ protected: void LLInventoryGestureAvailable::done() { - for(item_ref_t::iterator it = mComplete.begin(); it != mComplete.end(); ++it) + for(uuid_vec_t::iterator it = mComplete.begin(); it != mComplete.end(); ++it) { LLPreviewGesture* preview = LLFloaterReg::findTypedInstance<LLPreviewGesture>("preview_gesture", *it); if(preview) @@ -131,14 +110,14 @@ LLPreviewGesture* LLPreviewGesture::show(const LLUUID& item_id, const LLUUID& ob // Start speculative download of sounds and animations const LLUUID animation_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_ANIMATION); - gInventory.startBackgroundFetch(animation_folder_id); + LLInventoryModelBackgroundFetch::instance().start(animation_folder_id); const LLUUID sound_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_SOUND); - gInventory.startBackgroundFetch(sound_folder_id); + LLInventoryModelBackgroundFetch::instance().start(sound_folder_id); // this will call refresh when we have everything. LLViewerInventoryItem* item = (LLViewerInventoryItem*)preview->getItem(); - if (item && !item->isComplete()) + if (item && !item->isFinished()) { LLInventoryGestureAvailable* observer; observer = new LLInventoryGestureAvailable(); @@ -269,7 +248,7 @@ BOOL LLPreviewGesture::canClose() // virtual void LLPreviewGesture::onClose(bool app_quitting) { - LLGestureManager::instance().stopGesture(mPreviewGesture); + LLGestureMgr::instance().stopGesture(mPreviewGesture); } // virtual @@ -293,13 +272,13 @@ bool LLPreviewGesture::handleSaveChangesDialog(const LLSD& notification, const L switch(option) { case 0: // "Yes" - LLGestureManager::instance().stopGesture(mPreviewGesture); + LLGestureMgr::instance().stopGesture(mPreviewGesture); mCloseAfterSave = TRUE; onClickSave(this); break; case 1: // "No" - LLGestureManager::instance().stopGesture(mPreviewGesture); + LLGestureMgr::instance().stopGesture(mPreviewGesture); mDirty = FALSE; // Force the dirty flag because user has clicked NO on confirm save dialog... closeFloater(); break; @@ -472,7 +451,7 @@ BOOL LLPreviewGesture::postBuild() edit = getChild<LLLineEditor>("wait_time_editor"); edit->setEnabled(FALSE); edit->setVisible(FALSE); - edit->setPrevalidate(LLLineEditor::prevalidateFloat); + edit->setPrevalidate(LLTextValidate::validateFloat); // edit->setKeystrokeCallback(onKeystrokeCommit, this); edit->setCommitOnFocusLost(TRUE); edit->setCommitCallback(onCommitWaitTime, this); @@ -504,10 +483,10 @@ BOOL LLPreviewGesture::postBuild() if (item) { childSetText("desc", item->getDescription()); - childSetPrevalidate("desc", &LLLineEditor::prevalidateASCIIPrintableNoPipe); + childSetPrevalidate("desc", &LLTextValidate::validateASCIIPrintableNoPipe); childSetText("name", item->getName()); - childSetPrevalidate("name", &LLLineEditor::prevalidateASCIIPrintableNoPipe); + childSetPrevalidate("name", &LLTextValidate::validateASCIIPrintableNoPipe); } return LLPreview::postBuild(); @@ -645,7 +624,7 @@ void LLPreviewGesture::refresh() LLPreview::refresh(); // If previewing or item is incomplete, all controls are disabled LLViewerInventoryItem* item = (LLViewerInventoryItem*)getItem(); - bool is_complete = (item && item->isComplete()) ? true : false; + bool is_complete = (item && item->isFinished()) ? true : false; if (mPreviewGesture || !is_complete) { @@ -784,7 +763,7 @@ void LLPreviewGesture::refresh() mOptionsText->setText(optionstext); - BOOL active = LLGestureManager::instance().isGestureActive(mItemUUID); + BOOL active = LLGestureMgr::instance().isGestureActive(mItemUUID); mActiveCheck->set(active); // Can only preview if there are steps @@ -829,7 +808,9 @@ void LLPreviewGesture::loadAsset() const LLInventoryItem* item = getItem(); if (!item) { - mAssetStatus = PREVIEW_ASSET_ERROR; + // Don't set asset status here; we may not have set the item id yet + // (e.g. when this gets called initially) + //mAssetStatus = PREVIEW_ASSET_ERROR; return; } @@ -1138,10 +1119,10 @@ void LLPreviewGesture::saveIfNeeded() // If this gesture is active, then we need to update the in-memory // active map with the new pointer. - if (!delayedUpload && LLGestureManager::instance().isGestureActive(mItemUUID)) + if (!delayedUpload && LLGestureMgr::instance().isGestureActive(mItemUUID)) { // gesture manager now owns the pointer - LLGestureManager::instance().replaceGesture(mItemUUID, gesture, asset_id); + LLGestureMgr::instance().replaceGesture(mItemUUID, gesture, asset_id); // replaceGesture may deactivate other gestures so let the // inventory know. @@ -1702,13 +1683,13 @@ void LLPreviewGesture::onClickDelete(void* data) void LLPreviewGesture::onCommitActive(LLUICtrl* ctrl, void* data) { LLPreviewGesture* self = (LLPreviewGesture*)data; - if (!LLGestureManager::instance().isGestureActive(self->mItemUUID)) + if (!LLGestureMgr::instance().isGestureActive(self->mItemUUID)) { - LLGestureManager::instance().activateGesture(self->mItemUUID); + LLGestureMgr::instance().activateGesture(self->mItemUUID); } else { - LLGestureManager::instance().deactivateGesture(self->mItemUUID); + LLGestureMgr::instance().deactivateGesture(self->mItemUUID); } // Make sure the (active) label in the inventory gets updated. @@ -1747,14 +1728,14 @@ void LLPreviewGesture::onClickPreview(void* data) self->mPreviewBtn->setLabel(self->getString("stop_txt")); // play it, and delete when done - LLGestureManager::instance().playGesture(self->mPreviewGesture); + LLGestureMgr::instance().playGesture(self->mPreviewGesture); self->refresh(); } else { // Will call onDonePreview() below - LLGestureManager::instance().stopGesture(self->mPreviewGesture); + LLGestureMgr::instance().stopGesture(self->mPreviewGesture); self->refresh(); } diff --git a/indra/newview/llpreviewgesture.h b/indra/newview/llpreviewgesture.h index 5968e936ef..b141b14445 100644 --- a/indra/newview/llpreviewgesture.h +++ b/indra/newview/llpreviewgesture.h @@ -34,10 +34,9 @@ #define LL_LLPREVIEWGESTURE_H #include "llassettype.h" -#include "llmultigesture.h" #include "llpreview.h" +#include "llmultigesture.h" -class LLMultiGesture; class LLLineEditor; class LLTextBox; class LLCheckBoxCtrl; @@ -45,7 +44,6 @@ class LLComboBox; class LLScrollListCtrl; class LLScrollListItem; class LLButton; -class LLGestureStep; class LLRadioGroup; class LLVFS; @@ -140,7 +138,7 @@ protected: static void onDonePreview(LLMultiGesture* gesture, void* data); -protected: +private: // LLPreview contains mDescEditor LLLineEditor* mTriggerEditor; LLTextBox* mReplaceText; @@ -173,4 +171,4 @@ protected: BOOL mDirty; }; -#endif +#endif // LL_LLPREVIEWGESTURE_H diff --git a/indra/newview/llpreviewnotecard.cpp b/indra/newview/llpreviewnotecard.cpp index cc70360528..fb7ac0d86b 100644 --- a/indra/newview/llpreviewnotecard.cpp +++ b/indra/newview/llpreviewnotecard.cpp @@ -35,12 +35,15 @@ #include "llpreviewnotecard.h" #include "llinventory.h" +#include "llinventoryfunctions.h" // for change_item_parent() #include "llagent.h" #include "llassetuploadresponders.h" +#include "lldraghandle.h" #include "llviewerwindow.h" #include "llbutton.h" #include "llfloaterreg.h" +#include "llinventorydefines.h" #include "llinventorymodel.h" #include "lllineeditor.h" #include "llnotificationsutil.h" @@ -90,12 +93,18 @@ BOOL LLPreviewNotecard::postBuild() childSetAction("Save", onClickSave, this); childSetVisible("lock", FALSE); + childSetAction("Delete", onClickDelete, this); + childSetEnabled("Delete", false); + const LLInventoryItem* item = getItem(); childSetCommitCallback("desc", LLPreview::onText, this); if (item) + { childSetText("desc", item->getDescription()); - childSetPrevalidate("desc", &LLLineEditor::prevalidateASCIIPrintableNoPipe); + childSetEnabled("Delete", true); + } + childSetPrevalidate("desc", &LLTextValidate::validateASCIIPrintableNoPipe); return LLPreview::postBuild(); } @@ -188,6 +197,20 @@ void LLPreviewNotecard::refreshFromInventory(const LLUUID& new_item_id) loadAsset(); } +void LLPreviewNotecard::updateTitleButtons() +{ + LLPreview::updateTitleButtons(); + + LLUICtrl* lock_btn = getChild<LLUICtrl>("lock"); + if(lock_btn->getVisible() && !isMinimized()) // lock button stays visible if floater is minimized. + { + LLRect lock_rc = lock_btn->getRect(); + LLRect buttons_rect = getDragHandle()->getButtonsRect(); + buttons_rect.mLeft = lock_rc.mLeft; + getDragHandle()->setButtonsRect(buttons_rect); + } +} + void LLPreviewNotecard::loadAsset() { // request the asset. @@ -358,6 +381,17 @@ void LLPreviewNotecard::onClickSave(void* user_data) } } + +// static +void LLPreviewNotecard::onClickDelete(void* user_data) +{ + LLPreviewNotecard* preview = (LLPreviewNotecard*)user_data; + if(preview) + { + preview->deleteNotecard(); + } +} + struct LLSaveNotecardInfo { LLPreviewNotecard* mSelf; @@ -450,6 +484,18 @@ bool LLPreviewNotecard::saveIfNeeded(LLInventoryItem* copyitem) return true; } +void LLPreviewNotecard::deleteNotecard() +{ + LLViewerInventoryItem* item = gInventory.getItem(mItemUUID); + if (item != NULL) + { + const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH); + change_item_parent(&gInventory, item, trash_id, FALSE); + } + + closeFloater(); +} + // static void LLPreviewNotecard::onSaveComplete(const LLUUID& asset_uuid, void* user_data, S32 status, LLExtStat ext_status) // StoreAssetData callback (fixed) { diff --git a/indra/newview/llpreviewnotecard.h b/indra/newview/llpreviewnotecard.h index 5b8cf1c2f6..98de99aa33 100644 --- a/indra/newview/llpreviewnotecard.h +++ b/indra/newview/llpreviewnotecard.h @@ -79,9 +79,12 @@ public: protected: + void updateTitleButtons(); virtual void loadAsset(); bool saveIfNeeded(LLInventoryItem* copyitem = NULL); + void deleteNotecard(); + static void onLoadComplete(LLVFS *vfs, const LLUUID& asset_uuid, LLAssetType::EType type, @@ -89,6 +92,8 @@ protected: static void onClickSave(void* data); + static void onClickDelete(void* data); + static void onSaveComplete(const LLUUID& asset_uuid, void* user_data, S32 status, LLExtStat ext_status); diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp index 7bcbe334ff..7b926f468d 100644 --- a/indra/newview/llpreviewscript.cpp +++ b/indra/newview/llpreviewscript.cpp @@ -41,6 +41,7 @@ #include "llcombobox.h" #include "lldir.h" #include "llfloaterreg.h" +#include "llinventorydefines.h" #include "llinventorymodel.h" #include "llkeyboard.h" #include "lllineeditor.h" @@ -661,7 +662,9 @@ void LLScriptEdCore::onBtnDynamicHelp() live_help_floater = new LLFloater(LLSD()); LLUICtrlFactory::getInstance()->buildFloater(live_help_floater, "floater_lsl_guide.xml", NULL); LLFloater* parent = dynamic_cast<LLFloater*>(getParent()); - parent->addDependentFloater(live_help_floater, TRUE); + llassert(parent); + if (parent) + parent->addDependentFloater(live_help_floater, TRUE); live_help_floater->childSetCommitCallback("lock_check", onCheckLock, this); live_help_floater->childSetValue("lock_check", gSavedSettings.getBOOL("ScriptHelpFollowsCursor")); live_help_floater->childSetCommitCallback("history_combo", onHelpComboCommit, this); @@ -953,9 +956,13 @@ BOOL LLPreviewLSL::postBuild() { const LLInventoryItem* item = getItem(); + llassert(item); + if (item) + { + childSetText("desc", item->getDescription()); + } childSetCommitCallback("desc", LLPreview::onText, this); - childSetText("desc", item->getDescription()); - childSetPrevalidate("desc", &LLLineEditor::prevalidateASCIIPrintableNoPipe); + childSetPrevalidate("desc", &LLTextValidate::validateASCIIPrintableNoPipe); return LLPreview::postBuild(); } @@ -1084,8 +1091,7 @@ void LLPreviewLSL::onSave(void* userdata, BOOL close_after_save) // Save needs to compile the text in the buffer. If the compile // succeeds, then save both assets out to the database. If the compile -// fails, go ahead and save the text anyway so that the user doesn't -// get too fucked. +// fails, go ahead and save the text anyway. void LLPreviewLSL::saveIfNeeded() { // llinfos << "LLPreviewLSL::saveIfNeeded()" << llendl; @@ -1573,7 +1579,7 @@ void LLLiveLSLEditor::loadAsset() DEFAULT_SCRIPT_NAME, DEFAULT_SCRIPT_DESC, LLSaleInfo::DEFAULT, - LLInventoryItem::II_FLAGS_NONE, + LLInventoryItemFlags::II_FLAGS_NONE, time_corrected()); mAssetStatus = PREVIEW_ASSET_LOADED; } @@ -1817,7 +1823,7 @@ void LLLiveLSLEditor::saveIfNeeded() return; } - if(mItem.isNull() || !mItem->isComplete()) + if(mItem.isNull() || !mItem->isFinished()) { // $NOTE: While the error message may not be exactly correct, // it's pretty close. diff --git a/indra/newview/llpreviewsound.cpp b/indra/newview/llpreviewsound.cpp index d7fd252fb6..44b828854b 100644 --- a/indra/newview/llpreviewsound.cpp +++ b/indra/newview/llpreviewsound.cpp @@ -75,7 +75,7 @@ BOOL LLPreviewSound::postBuild() button->setSoundFlags(LLView::SILENT); childSetCommitCallback("desc", LLPreview::onText, this); - childSetPrevalidate("desc", &LLLineEditor::prevalidateASCIIPrintableNoPipe); + childSetPrevalidate("desc", &LLTextValidate::validateASCIIPrintableNoPipe); return LLPreview::postBuild(); } diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp index dfc67d0126..22a1ef94a7 100644 --- a/indra/newview/llpreviewtexture.cpp +++ b/indra/newview/llpreviewtexture.cpp @@ -116,7 +116,8 @@ BOOL LLPreviewTexture::postBuild() } childSetAction("save_tex_btn", LLPreviewTexture::onSaveAsBtn, this); - childSetVisible("save_tex_btn", canSaveAs()); + childSetVisible("save_tex_btn", true); + childSetEnabled("save_tex_btn", canSaveAs()); if (!mCopyToInv) { @@ -126,7 +127,7 @@ BOOL LLPreviewTexture::postBuild() { childSetCommitCallback("desc", LLPreview::onText, this); childSetText("desc", item->getDescription()); - childSetPrevalidate("desc", &LLLineEditor::prevalidateASCIIPrintableNoPipe); + childSetPrevalidate("desc", &LLTextValidate::validateASCIIPrintableNoPipe); } } @@ -248,6 +249,7 @@ void LLPreviewTexture::draw() } } } + } @@ -282,18 +284,52 @@ void LLPreviewTexture::saveAs() // virtual void LLPreviewTexture::reshape(S32 width, S32 height, BOOL called_from_parent) { -// mLastHeight = 0; -// mLastWidth = 0; - mUpdateDimensions = TRUE; LLPreview::reshape(width, height, called_from_parent); + + LLRect dim_rect; + childGetRect("dimensions", dim_rect); + + S32 horiz_pad = 2 * (LLPANEL_BORDER_WIDTH + PREVIEW_PAD) + PREVIEW_RESIZE_HANDLE_SIZE; + + // add space for dimensions and aspect ratio + S32 info_height = dim_rect.mTop + CLIENT_RECT_VPAD; + + LLRect client_rect(horiz_pad, getRect().getHeight(), getRect().getWidth() - horiz_pad, 0); + client_rect.mTop -= (PREVIEW_HEADER_SIZE + CLIENT_RECT_VPAD); + client_rect.mBottom += PREVIEW_BORDER + CLIENT_RECT_VPAD + info_height ; + + S32 client_width = client_rect.getWidth(); + S32 client_height = client_rect.getHeight(); + + if (mAspectRatio > 0.f) + { + if(mAspectRatio > 1.f) + { + client_height = llceil((F32)client_width / mAspectRatio); + if(client_height > client_rect.getHeight()) + { + client_height = client_rect.getHeight(); + client_width = llceil((F32)client_height * mAspectRatio); + } + } + else//mAspectRatio < 1.f + { + client_width = llceil((F32)client_height * mAspectRatio); + if(client_width > client_rect.getWidth()) + { + client_width = client_rect.getWidth(); + client_height = llceil((F32)client_width / mAspectRatio); + } + } + } + + mClientRect.setLeftTopAndSize(client_rect.getCenterX() - (client_width / 2), client_rect.getCenterY() + (client_height / 2), client_width, client_height); + } // virtual void LLPreviewTexture::onFocusReceived() { - mLastHeight = 0; - mLastWidth = 0; - mUpdateDimensions = TRUE; LLPreview::onFocusReceived(); } @@ -304,12 +340,12 @@ void LLPreviewTexture::openToSave() // static void LLPreviewTexture::onFileLoadedForSave(BOOL success, - LLViewerFetchedTexture *src_vi, - LLImageRaw* src, - LLImageRaw* aux_src, - S32 discard_level, - BOOL final, - void* userdata) + LLViewerFetchedTexture *src_vi, + LLImageRaw* src, + LLImageRaw* aux_src, + S32 discard_level, + BOOL final, + void* userdata) { LLUUID* item_uuid = (LLUUID*) userdata; @@ -364,13 +400,19 @@ void LLPreviewTexture::updateDimensions() { if (!mImage) return; + + if(mImage->getFullWidth() == 0 || mImage->getFullHeight() == 0) + { + return; + } + mUpdateDimensions = FALSE; - - // set text on dimensions display (should be moved out of here and into a callback of some sort) + childSetTextArg("dimensions", "[WIDTH]", llformat("%d", mImage->getFullWidth())); childSetTextArg("dimensions", "[HEIGHT]", llformat("%d", mImage->getFullHeight())); + LLRect dim_rect; childGetRect("dimensions", dim_rect); @@ -379,34 +421,68 @@ void LLPreviewTexture::updateDimensions() // add space for dimensions and aspect ratio S32 info_height = dim_rect.mTop + CLIENT_RECT_VPAD; - LLRect client_rect(horiz_pad, getRect().getHeight(), getRect().getWidth() - horiz_pad, 0); - client_rect.mTop -= (PREVIEW_HEADER_SIZE + CLIENT_RECT_VPAD); - client_rect.mBottom += PREVIEW_BORDER + CLIENT_RECT_VPAD + info_height ; + S32 screen_width = gFloaterView->getSnapRect().getWidth(); + S32 screen_height = gFloaterView->getSnapRect().getHeight(); - S32 client_width = client_rect.getWidth(); - S32 client_height = client_rect.getHeight(); + S32 max_image_width = screen_width - 2*horiz_pad; + S32 max_image_height = screen_height - (PREVIEW_HEADER_SIZE + CLIENT_RECT_VPAD) + - (PREVIEW_BORDER + CLIENT_RECT_VPAD + info_height); + + S32 client_width = llmin(max_image_width,mImage->getFullWidth()); + S32 client_height = llmin(max_image_height,mImage->getFullHeight()); if (mAspectRatio > 0.f) { if(mAspectRatio > 1.f) { client_height = llceil((F32)client_width / mAspectRatio); - if(client_height > client_rect.getHeight()) + if(client_height > max_image_height) { - client_height = client_rect.getHeight(); + client_height = max_image_height; client_width = llceil((F32)client_height * mAspectRatio); } } - else + else//mAspectRatio < 1.f { client_width = llceil((F32)client_height * mAspectRatio); - if(client_width > client_rect.getWidth()) + if(client_width > max_image_width) { - client_width = client_rect.getWidth(); + client_width = max_image_width; client_height = llceil((F32)client_width / mAspectRatio); } } } + else + { + + if(client_height > max_image_height) + { + F32 ratio = (F32)max_image_height/client_height; + client_height = max_image_height; + client_width = llceil((F32)client_height * ratio); + } + + if(client_width > max_image_width) + { + F32 ratio = (F32)max_image_width/client_width; + client_width = max_image_width; + client_height = llceil((F32)client_width * ratio); + } + } + + //now back to whole floater + S32 floater_width = llmax(getMinWidth(),client_width + 2*horiz_pad); + S32 floater_height = llmax(getMinHeight(),client_height + (PREVIEW_HEADER_SIZE + CLIENT_RECT_VPAD) + + (PREVIEW_BORDER + CLIENT_RECT_VPAD + info_height)); + + //reshape floater + reshape( floater_width, floater_height ); + gFloaterView->adjustToFitScreen(this, FALSE); + + //setup image rect... + LLRect client_rect(horiz_pad, getRect().getHeight(), getRect().getWidth() - horiz_pad, 0); + client_rect.mTop -= (PREVIEW_HEADER_SIZE + CLIENT_RECT_VPAD); + client_rect.mBottom += PREVIEW_BORDER + CLIENT_RECT_VPAD + info_height ; mClientRect.setLeftTopAndSize(client_rect.getCenterX() - (client_width / 2), client_rect.getCenterY() + (client_height / 2), client_width, client_height); @@ -468,8 +544,9 @@ void LLPreviewTexture::loadAsset() mImage->setBoostLevel(LLViewerTexture::BOOST_PREVIEW); mImage->forceToSaveRawImage(0) ; mAssetStatus = PREVIEW_ASSET_LOADING; + mUpdateDimensions = TRUE; updateDimensions(); - childSetVisible("save_tex_btn", canSaveAs()); + childSetEnabled("save_tex_btn", canSaveAs()); } LLPreview::EAssetStatus LLPreviewTexture::getAssetStatus() @@ -487,7 +564,12 @@ void LLPreviewTexture::updateImageID() if(item) { mImageID = item->getAssetUUID(); - mShowKeepDiscard = item->getPermissions().getCreator() != gAgent.getID(); + + // here's the old logic... + //mShowKeepDiscard = item->getPermissions().getCreator() != gAgent.getID(); + // here's the new logic... 'cos we hate disappearing buttons. + mShowKeepDiscard = TRUE; + mCopyToInv = FALSE; mIsCopyable = item->checkPermissionsSet(PERM_ITEM_UNRESTRICTED); } diff --git a/indra/newview/llprogressview.cpp b/indra/newview/llprogressview.cpp index 7a48f890e0..9b5e38d0aa 100644 --- a/indra/newview/llprogressview.cpp +++ b/indra/newview/llprogressview.cpp @@ -68,15 +68,16 @@ const F32 TOTAL_LOGIN_TIME = 10.f; // seconds, wild guess at time from GL contex S32 gLastStartAnimationFrame = 0; // human-style indexing, first image = 1 const S32 ANIMATION_FRAMES = 1; //13; +static LLRegisterPanelClassWrapper<LLProgressView> r("progress_view"); + + // XUI: Translate -LLProgressView::LLProgressView(const LLRect &rect) +LLProgressView::LLProgressView() : LLPanel(), mPercentDone( 0.f ), mMouseDownInActiveArea( false ), mUpdateEvents("LLProgressView") { - LLUICtrlFactory::getInstance()->buildPanel(this, "panel_progress.xml"); - reshape(rect.getWidth(), rect.getHeight()); mUpdateEvents.listen("self", boost::bind(&LLProgressView::handleUpdate, this, _1)); } @@ -92,6 +93,9 @@ BOOL LLProgressView::postBuild() getChild<LLTextBox>("message_text")->setClickedCallback(onClickMessage, this); + // hidden initially, until we need it + LLPanel::setVisible(FALSE); + sInstance = this; return TRUE; } @@ -126,17 +130,23 @@ BOOL LLProgressView::handleKeyHere(KEY key, MASK mask) void LLProgressView::setVisible(BOOL visible) { + // hiding progress view if (getVisible() && !visible) { mFadeTimer.start(); + // hiding progress view, so show menu bars + LLUI::getRootView()->getChildView("menu_bar_holder")->setVisible(TRUE); } + // showing progress view else if (!getVisible() && visible) { - gFocusMgr.setTopCtrl(this); + // showing progress view, so hide menu bars + LLUI::getRootView()->getChildView("menu_bar_holder")->setVisible(FALSE); + setFocus(TRUE); mFadeTimer.stop(); mProgressTimer.start(); - LLPanel::setVisible(visible); + LLPanel::setVisible(TRUE); } } @@ -146,7 +156,7 @@ void LLProgressView::draw() static LLTimer timer; // Paint bitmap if we've got one - glPushMatrix(); + glPushMatrix(); if (gStartTexture) { LLGLSUIDefault gls_ui; @@ -187,6 +197,8 @@ void LLProgressView::draw() // Fade is complete, release focus gFocusMgr.releaseFocusIfNeeded( this ); LLPanel::setVisible(FALSE); + mFadeTimer.stop(); + gStartTexture = NULL; } return; @@ -223,7 +235,10 @@ void LLProgressView::setCancelButtonVisible(BOOL b, const std::string& label) // static void LLProgressView::onCancelButtonClicked(void*) { - if (gAgent.getTeleportState() == LLAgent::TELEPORT_NONE) + // Quitting viewer here should happen only when "Quit" button is pressed while starting up. + // Check for startup state is used here instead of teleport state to avoid quitting when + // cancel is pressed while teleporting inside region (EXT-4911) + if (LLStartUp::getStartupState() < STATE_STARTED) { LLAppViewer::instance()->requestQuit(); } diff --git a/indra/newview/llprogressview.h b/indra/newview/llprogressview.h index 6853674d88..374b14be83 100644 --- a/indra/newview/llprogressview.h +++ b/indra/newview/llprogressview.h @@ -44,7 +44,7 @@ class LLProgressBar; class LLProgressView : public LLPanel { public: - LLProgressView(const LLRect& rect); + LLProgressView(); virtual ~LLProgressView(); BOOL postBuild(); diff --git a/indra/newview/llrecentpeople.cpp b/indra/newview/llrecentpeople.cpp index bd46b5b56a..62c2ddfd9f 100644 --- a/indra/newview/llrecentpeople.cpp +++ b/indra/newview/llrecentpeople.cpp @@ -63,7 +63,7 @@ bool LLRecentPeople::contains(const LLUUID& id) const return mPeople.find(id) != mPeople.end(); } -void LLRecentPeople::get(std::vector<LLUUID>& result) const +void LLRecentPeople::get(uuid_vec_t& result) const { result.clear(); for (recent_people_t::const_iterator pos = mPeople.begin(); pos != mPeople.end(); ++pos) diff --git a/indra/newview/llrecentpeople.h b/indra/newview/llrecentpeople.h index e0f2faaec5..c718997f7e 100644 --- a/indra/newview/llrecentpeople.h +++ b/indra/newview/llrecentpeople.h @@ -79,7 +79,7 @@ public: * * @param result where to put the result. */ - void get(std::vector<LLUUID>& result) const; + void get(uuid_vec_t& result) const; const LLDate& getDate(const LLUUID& id) const; diff --git a/indra/newview/llrootview.h b/indra/newview/llrootview.h index 760b1a7a4c..38029e3a9d 100644 --- a/indra/newview/llrootview.h +++ b/indra/newview/llrootview.h @@ -35,6 +35,7 @@ #include "llview.h" #include "lluictrlfactory.h" +#include "lltooltip.h" class LLRootViewRegistry : public LLChildRegistry<LLRootViewRegistry> {}; diff --git a/indra/newview/llsaveoutfitcombobtn.cpp b/indra/newview/llsaveoutfitcombobtn.cpp new file mode 100644 index 0000000000..9518b0cbb3 --- /dev/null +++ b/indra/newview/llsaveoutfitcombobtn.cpp @@ -0,0 +1,98 @@ +/** + * @file llsaveoutfitcombobtn.cpp + * @brief Represents outfit save/save as combo button. + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llappearancemgr.h" +#include "llpaneloutfitsinventory.h" +#include "llsidepanelappearance.h" +#include "llsaveoutfitcombobtn.h" +#include "llviewermenu.h" + +static const std::string SAVE_BTN("save_btn"); +static const std::string SAVE_FLYOUT_BTN("save_flyout_btn"); + +LLSaveOutfitComboBtn::LLSaveOutfitComboBtn(LLPanel* parent, bool saveAsDefaultAction): + mParent(parent), mSaveAsDefaultAction(saveAsDefaultAction) +{ + // register action mapping before creating menu + LLUICtrl::CommitCallbackRegistry::ScopedRegistrar save_registar; + save_registar.add("Outfit.Save.Action", boost::bind( + &LLSaveOutfitComboBtn::saveOutfit, this, false)); + save_registar.add("Outfit.SaveAs.Action", boost::bind( + &LLSaveOutfitComboBtn::saveOutfit, this, true)); + + mParent->childSetAction(SAVE_BTN, boost::bind(&LLSaveOutfitComboBtn::saveOutfit, this, mSaveAsDefaultAction)); + mParent->childSetAction(SAVE_FLYOUT_BTN, boost::bind(&LLSaveOutfitComboBtn::showSaveMenu, this)); + + mSaveMenu = LLUICtrlFactory::getInstance()->createFromFile< + LLToggleableMenu> ("menu_save_outfit.xml", gMenuHolder, + LLViewerMenuHolderGL::child_registry_t::instance()); +} + +void LLSaveOutfitComboBtn::showSaveMenu() +{ + S32 x, y; + LLUI::getMousePositionLocal(mParent, &x, &y); + + mSaveMenu->updateParent(LLMenuGL::sMenuContainer); + LLMenuGL::showPopup(mParent, mSaveMenu, x, y); +} + +void LLSaveOutfitComboBtn::saveOutfit(bool as_new) +{ + if (!as_new && LLAppearanceMgr::getInstance()->updateBaseOutfit()) + { + // we don't need to ask for an outfit name, and updateBaseOutfit() successfully saved. + // If updateBaseOutfit fails, ask for an outfit name anyways + return; + } + + LLPanelOutfitsInventory* panel_outfits_inventory = + LLPanelOutfitsInventory::findInstance(); + if (panel_outfits_inventory) + { + panel_outfits_inventory->onSave(); + } + + //*TODO how to get to know when base outfit is updated or new outfit is created? +} + +void LLSaveOutfitComboBtn::setMenuItemEnabled(const std::string& item, bool enabled) +{ + mSaveMenu->setItemEnabled("save_outfit", enabled); +} + +void LLSaveOutfitComboBtn::setSaveBtnEnabled(bool enabled) +{ + mParent->childSetEnabled(SAVE_BTN, enabled); +} diff --git a/indra/newview/llsaveoutfitcombobtn.h b/indra/newview/llsaveoutfitcombobtn.h new file mode 100644 index 0000000000..fec7122194 --- /dev/null +++ b/indra/newview/llsaveoutfitcombobtn.h @@ -0,0 +1,60 @@ +/** + * @file llsaveoutfitcombobtn.h + * @brief Represents outfit save/save as combo button. + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLSAVEOUTFITCOMBOBTN_H +#define LL_LLSAVEOUTFITCOMBOBTN_H + +class LLButton; + +#include "lltoggleablemenu.h" + +/** + * Represents outfit Save/Save As combo button. + */ +class LLSaveOutfitComboBtn +{ + LOG_CLASS(LLSaveOutfitComboBtn); +public: + LLSaveOutfitComboBtn(LLPanel* parent, bool saveAsDefaultAction = false); + + void showSaveMenu(); + void saveOutfit(bool as_new = false); + void setMenuItemEnabled(const std::string& item, bool enabled); + void setSaveBtnEnabled(bool enabled); + +private: + bool mSaveAsDefaultAction; + LLPanel* mParent; + LLToggleableMenu* mSaveMenu; +}; + +#endif // LL_LLSAVEOUTFITCOMBOBTN_H diff --git a/indra/newview/llscreenchannel.cpp b/indra/newview/llscreenchannel.cpp index 7c2e7e3319..de1da248c1 100644 --- a/indra/newview/llscreenchannel.cpp +++ b/indra/newview/llscreenchannel.cpp @@ -47,7 +47,6 @@ #include "llsyswellwindow.h" #include "llimfloater.h" #include "llscriptfloater.h" -#include "llfontgl.h" #include <algorithm> @@ -79,17 +78,12 @@ LLScreenChannelBase::~LLScreenChannelBase() bool LLScreenChannelBase::isHovering() { - bool res = mHoveredToast != NULL; - if (!res) + if (!mHoveredToast) { - return res; + return false; } - S32 x, y; - mHoveredToast->screenPointToLocal(gViewerWindow->getCurrentMouseX(), - gViewerWindow->getCurrentMouseY(), &x, &y); - res = mHoveredToast->pointInView(x, y) == TRUE; - return res; + return mHoveredToast->isHovered(); } void LLScreenChannelBase::updatePositionAndSize(LLRect old_world_rect, LLRect new_world_rect) @@ -479,12 +473,15 @@ void LLScreenChannel::showToastsBottom() { if(it != mToastList.rbegin()) { - bottom = (*(it-1)).toast->getRect().mTop; + LLToast* toast = (*(it-1)).toast; + bottom = toast->getRect().mTop - toast->getTopPad(); toast_margin = gSavedSettings.getS32("ToastGap"); } toast_rect = (*it).toast->getRect(); - toast_rect.setOriginAndSize(getRect().mLeft, bottom + toast_margin, toast_rect.getWidth() ,toast_rect.getHeight()); + toast_rect.setOriginAndSize(getRect().mRight - toast_rect.getWidth(), + bottom + toast_margin, toast_rect.getWidth(), + toast_rect.getHeight()); (*it).toast->setRect(toast_rect); if(floater && floater->overlapsScreenChannel()) @@ -584,7 +581,6 @@ void LLScreenChannel::showToastsTop() void LLScreenChannel::createStartUpToast(S32 notif_num, F32 timer) { LLRect toast_rect; - LLRect tbox_rect; LLToast::Params p; p.lifetime_secs = timer; p.enable_hide_btn = false; @@ -595,34 +591,26 @@ void LLScreenChannel::createStartUpToast(S32 notif_num, F32 timer) mStartUpToastPanel->setOnFadeCallback(boost::bind(&LLScreenChannel::onStartUpToastHide, this)); + LLPanel* wrapper_panel = mStartUpToastPanel->getChild<LLPanel>("wrapper_panel"); LLTextBox* text_box = mStartUpToastPanel->getChild<LLTextBox>("toast_text"); std::string text = LLTrans::getString("StartUpNotifications"); - tbox_rect = text_box->getRect(); - S32 tbox_width = tbox_rect.getWidth(); - S32 tbox_vpad = text_box->getVPad(); - S32 text_width = text_box->getDefaultFont()->getWidth(text); - S32 text_height = text_box->getTextPixelHeight(); - - // EXT - 3703 (Startup toast message doesn't fit toast width) - // Calculating TextBox HEIGHT needed to include the whole string according to the given WIDTH of the TextBox. - S32 new_tbox_height = (text_width/tbox_width + 1) * text_height; - // Calculating TOP position of TextBox - S32 new_tbox_top = new_tbox_height + tbox_vpad + gSavedSettings.getS32("ToastGap"); - // Calculating toast HEIGHT according to the new TextBox size - S32 toast_height = new_tbox_height + tbox_vpad * 2; - - tbox_rect.setLeftTopAndSize(tbox_rect.mLeft, new_tbox_top, tbox_rect.getWidth(), new_tbox_height); - text_box->setRect(tbox_rect); - toast_rect = mStartUpToastPanel->getRect(); mStartUpToastPanel->reshape(getRect().getWidth(), toast_rect.getHeight(), true); - toast_rect.setLeftTopAndSize(0, toast_height + gSavedSettings.getS32("ToastGap"), getRect().getWidth(), toast_height); - mStartUpToastPanel->setRect(toast_rect); text_box->setValue(text); text_box->setVisible(TRUE); + + S32 old_height = text_box->getRect().getHeight(); + text_box->reshapeToFitText(); + text_box->setOrigin(text_box->getRect().mLeft, (wrapper_panel->getRect().getHeight() - text_box->getRect().getHeight())/2); + S32 new_height = text_box->getRect().getHeight(); + S32 height_delta = new_height - old_height; + + toast_rect.setLeftTopAndSize(0, toast_rect.getHeight() + height_delta +gSavedSettings.getS32("ToastGap"), getRect().getWidth(), toast_rect.getHeight()); + mStartUpToastPanel->setRect(toast_rect); + addChild(mStartUpToastPanel); mStartUpToastPanel->setVisible(TRUE); @@ -691,7 +679,10 @@ void LLNotificationsUI::LLScreenChannel::startFadingToasts() while (it != mToastList.end()) { ToastElem& elem = *it; - elem.toast->startFading(); + if (elem.toast->getVisible()) + { + elem.toast->startFading(); + } ++it; } } @@ -711,9 +702,32 @@ void LLScreenChannel::hideToast(const LLUUID& notification_id) if(mToastList.end() != it) { ToastElem te = *it; - te.toast->setVisible(FALSE); - te.toast->stopTimer(); - mToastList.erase(it); + te.toast->hide(); + } +} + +void LLScreenChannel::closeHiddenToasts(const Matcher& matcher) +{ + // since we can't guarantee that close toast operation doesn't change mToastList + // we collect matched toasts that should be closed into separate list + std::list<ToastElem> toasts; + for (std::vector<ToastElem>::iterator it = mToastList.begin(); it + != mToastList.end(); it++) + { + LLToast * toast = it->toast; + // add to list valid toast that match to provided matcher criteria + if (toast != NULL && !toast->isDead() && toast->getNotification() != NULL + && !toast->getVisible() && matcher.matches(toast->getNotification())) + { + toasts.push_back(*it); + } + } + + // close collected toasts + for (std::list<ToastElem>::iterator it = toasts.begin(); it + != toasts.end(); it++) + { + it->toast->closeFloater(); } } @@ -777,23 +791,16 @@ void LLScreenChannel::onToastHover(LLToast* toast, bool mouse_enter) { // because of LLViewerWindow::updateUI() that NOT ALWAYS calls onMouseEnter BEFORE onMouseLeave // we must check hovering directly to prevent incorrect setting for hovering in a channel - S32 x,y; if (mouse_enter) { - toast->screenPointToLocal(gViewerWindow->getCurrentMouseX(), - gViewerWindow->getCurrentMouseY(), &x, &y); - bool hover = toast->pointInView(x, y) == TRUE; - if (hover) + if (toast->isHovered()) { mHoveredToast = toast; } } else if (mHoveredToast != NULL) { - mHoveredToast->screenPointToLocal(gViewerWindow->getCurrentMouseX(), - gViewerWindow->getCurrentMouseY(), &x, &y); - bool hover = mHoveredToast->pointInView(x, y) == TRUE; - if (!hover) + if (!mHoveredToast->isHovered()) { mHoveredToast = NULL; } diff --git a/indra/newview/llscreenchannel.h b/indra/newview/llscreenchannel.h index 88053d87d9..46c5fed7b6 100644 --- a/indra/newview/llscreenchannel.h +++ b/indra/newview/llscreenchannel.h @@ -173,6 +173,12 @@ public: void hideToastsFromScreen(); // hide toast by notification id void hideToast(const LLUUID& notification_id); + + /** + * Closes hidden matched toasts from channel. + */ + void closeHiddenToasts(const Matcher& matcher); + // removes all toasts from a channel void removeToastsFromChannel(); // show all toasts in a channel diff --git a/indra/newview/llscriptfloater.cpp b/indra/newview/llscriptfloater.cpp index 0d9cf06bc3..b68fc3b002 100644 --- a/indra/newview/llscriptfloater.cpp +++ b/indra/newview/llscriptfloater.cpp @@ -38,9 +38,11 @@ #include "llchiclet.h" #include "llfloaterreg.h" #include "llnotifications.h" +#include "llnotificationsutil.h" #include "llscreenchannel.h" #include "llsyswellwindow.h" #include "lltoastnotifypanel.h" +#include "lltrans.h" #include "llviewerwindow.h" #include "llimfloater.h" @@ -65,17 +67,14 @@ LLUUID notification_id_to_object_id(const LLUUID& notification_id) LLScriptFloater::LLScriptFloater(const LLSD& key) : LLDockableFloater(NULL, true, key) , mScriptForm(NULL) +, mSaveFloaterPosition(false) { setMouseDownCallback(boost::bind(&LLScriptFloater::onMouseDown, this)); setOverlapsScreenChannel(true); } -bool LLScriptFloater::toggle(const LLUUID& object_id) +bool LLScriptFloater::toggle(const LLUUID& notification_id) { - // Force chiclet toggle on here because first onFocusReceived() will not toggle it on. - LLBottomTray::getInstance()->getChicletPanel()->setChicletToggleState(object_id, true); - - LLUUID notification_id = LLScriptFloaterManager::getInstance()->findNotificationId(object_id); LLScriptFloater* floater = LLFloaterReg::findTypedInstance<LLScriptFloater>("script_floater", notification_id); // show existing floater @@ -89,51 +88,57 @@ bool LLScriptFloater::toggle(const LLUUID& object_id) else { floater->setVisible(TRUE); - floater->setFocus(TRUE); - return true; + floater->setFocus(FALSE); } } // create and show new floater else { - show(object_id); - return true; + show(notification_id); } + + LLBottomTray::getInstance()->getChicletPanel()->setChicletToggleState(notification_id, true); + return true; } -LLScriptFloater* LLScriptFloater::show(const LLUUID& object_id) +LLScriptFloater* LLScriptFloater::show(const LLUUID& notification_id) { - LLUUID notification_id = LLScriptFloaterManager::getInstance()->findNotificationId(object_id); - - LLScriptFloater* floater = LLFloaterReg::showTypedInstance<LLScriptFloater>("script_floater", notification_id); - floater->setObjectId(object_id); - floater->createForm(object_id); + LLScriptFloater* floater = LLFloaterReg::getTypedInstance<LLScriptFloater>("script_floater", notification_id); + floater->setNotificationId(notification_id); + floater->createForm(notification_id); - if (floater->getDockControl() == NULL) - { - LLChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLChiclet>(object_id); - if (chiclet == NULL) - { - llerror("Dock chiclet for LLScriptFloater doesn't exist", 0); - } - else - { - LLBottomTray::getInstance()->getChicletPanel()->scrollToChiclet(chiclet); - } + //LLDialog(LLGiveInventory and LLLoadURL) should no longer steal focus (see EXT-5445) + floater->setAutoFocus(FALSE); - floater->setDockControl(new LLDockControl(chiclet, floater, floater->getDockTongue(), - LLDockControl::TOP, boost::bind(&LLScriptFloater::getAllowedRect, floater, _1))); + if(LLScriptFloaterManager::OBJ_SCRIPT == LLScriptFloaterManager::getObjectType(notification_id)) + { + floater->setSavePosition(true); + floater->restorePosition(); + } + else + { + floater->dockToChiclet(true); } + //LLDialog(LLGiveInventory and LLLoadURL) should no longer steal focus (see EXT-5445) + LLFloaterReg::showTypedInstance<LLScriptFloater>("script_floater", notification_id, FALSE); + return floater; } +void LLScriptFloater::setNotificationId(const LLUUID& id) +{ + mNotificationId = id; + // Lets save object id now while notification exists + mObjectId = notification_id_to_object_id(id); +} + void LLScriptFloater::getAllowedRect(LLRect& rect) { - rect = gViewerWindow->getWorldViewRectRaw(); + rect = gViewerWindow->getWorldViewRectScaled(); } -void LLScriptFloater::createForm(const LLUUID& object_id) +void LLScriptFloater::createForm(const LLUUID& notification_id) { // delete old form if(mScriptForm) @@ -142,22 +147,24 @@ void LLScriptFloater::createForm(const LLUUID& object_id) mScriptForm->die(); } - LLNotificationPtr notification = LLNotifications::getInstance()->find( - LLScriptFloaterManager::getInstance()->findNotificationId(object_id)); + LLNotificationPtr notification = LLNotifications::getInstance()->find(notification_id); if(NULL == notification) { return; } // create new form - mScriptForm = new LLToastNotifyPanel(notification); + LLRect toast_rect = getRect(); + // LLToastNotifyPanel will fit own content in vertical direction, + // but it needs an initial rect to properly calculate its width + // Use an initial rect of the script floater to make the floater window more configurable. + mScriptForm = new LLToastNotifyPanel(notification, toast_rect); addChild(mScriptForm); // position form on floater mScriptForm->setOrigin(0, 0); // make floater size fit form size - LLRect toast_rect = getRect(); LLRect panel_rect = mScriptForm->getRect(); toast_rect.setLeftTopAndSize(toast_rect.mLeft, toast_rect.mTop, panel_rect.getWidth(), panel_rect.getHeight() + getHeaderHeight()); setShape(toast_rect); @@ -165,9 +172,11 @@ void LLScriptFloater::createForm(const LLUUID& object_id) void LLScriptFloater::onClose(bool app_quitting) { - if(getObjectId().notNull()) + savePosition(); + + if(getNotificationId().notNull()) { - LLScriptFloaterManager::getInstance()->removeNotificationByObjectId(getObjectId()); + LLScriptFloaterManager::getInstance()->onRemoveNotification(getNotificationId()); } } @@ -175,6 +184,8 @@ void LLScriptFloater::setDocked(bool docked, bool pop_on_undock /* = true */) { LLDockableFloater::setDocked(docked, pop_on_undock); + savePosition(); + hideToastsIfNeeded(); } @@ -186,7 +197,7 @@ void LLScriptFloater::setVisible(BOOL visible) if(!visible) { - LLIMChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(getObjectId()); + LLIMChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(getNotificationId()); if(chiclet) { chiclet->setToggleState(false); @@ -196,10 +207,10 @@ void LLScriptFloater::setVisible(BOOL visible) void LLScriptFloater::onMouseDown() { - if(getObjectId().notNull()) + if(getNotificationId().notNull()) { // Remove new message icon - LLIMChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(getObjectId()); + LLIMChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(getNotificationId()); if (chiclet == NULL) { llerror("Dock chiclet for LLScriptFloater doesn't exist", 0); @@ -211,17 +222,76 @@ void LLScriptFloater::onMouseDown() } } +void LLScriptFloater::savePosition() +{ + if(getSavePosition() && mObjectId.notNull()) + { + LLScriptFloaterManager::FloaterPositionInfo fpi = {getRect(), isDocked()}; + LLScriptFloaterManager::getInstance()->saveFloaterPosition(mObjectId, fpi); + } +} + +void LLScriptFloater::restorePosition() +{ + LLScriptFloaterManager::FloaterPositionInfo fpi; + if(LLScriptFloaterManager::getInstance()->getFloaterPosition(mObjectId, fpi)) + { + dockToChiclet(fpi.mDockState); + if(!fpi.mDockState) + { + // Un-docked floater is opened in 0,0, now move it to saved position + translate(fpi.mRect.mLeft - getRect().mLeft, fpi.mRect.mTop - getRect().mTop); + } + } + else + { + dockToChiclet(true); + } +} + void LLScriptFloater::onFocusLost() { - LLBottomTray::getInstance()->getChicletPanel()->setChicletToggleState(getObjectId(), false); + if(getNotificationId().notNull()) + { + LLBottomTray::getInstance()->getChicletPanel()->setChicletToggleState(getNotificationId(), false); + } } void LLScriptFloater::onFocusReceived() { // first focus will be received before setObjectId() call - don't toggle chiclet - if(getObjectId().notNull()) + if(getNotificationId().notNull()) + { + LLBottomTray::getInstance()->getChicletPanel()->setChicletToggleState(getNotificationId(), true); + } +} + +void LLScriptFloater::dockToChiclet(bool dock) +{ + if (getDockControl() == NULL) { - LLBottomTray::getInstance()->getChicletPanel()->setChicletToggleState(getObjectId(), true); + LLChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLChiclet>(getNotificationId()); + if (chiclet == NULL) + { + llwarns << "Dock chiclet for LLScriptFloater doesn't exist" << llendl; + return; + } + else + { + LLBottomTray::getInstance()->getChicletPanel()->scrollToChiclet(chiclet); + } + + // Stop saving position while we dock floater + bool save = getSavePosition(); + setSavePosition(false); + + setDockControl(new LLDockControl(chiclet, this, getDockTongue(), + LLDockControl::TOP, boost::bind(&LLScriptFloater::getAllowedRect, this, _1))); + + setDocked(dock); + + // Restore saving + setSavePosition(save); } } @@ -246,200 +316,237 @@ void LLScriptFloater::hideToastsIfNeeded() void LLScriptFloaterManager::onAddNotification(const LLUUID& notification_id) { - // get scripted Object's ID - LLUUID object_id = notification_id_to_object_id(notification_id); - if(object_id.isNull()) + if(notification_id.isNull()) { - llwarns << "Invalid notification, no object id" << llendl; + llwarns << "Invalid notification ID" << llendl; return; } + // get scripted Object's ID + LLUUID object_id = notification_id_to_object_id(notification_id); + // Need to indicate of "new message" for object chiclets according to requirements // specified in the Message Bar design specification. See EXT-3142. bool set_new_message = false; + EObjectType obj_type = getObjectType(notification_id); - // If an Object spawns more-than-one floater, only the newest one is shown. - // The previous is automatically closed. - script_notification_map_t::iterator it = mNotifications.find(object_id); - if(it != mNotifications.end()) + // LLDialog can spawn only one instance, LLLoadURL and LLGiveInventory can spawn unlimited number of instances + if(OBJ_SCRIPT == obj_type) { - LLIMChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(object_id); - if(chiclet) + // If an Object spawns more-than-one floater, only the newest one is shown. + // The previous is automatically closed. + script_notification_map_t::const_iterator it = findUsingObjectId(object_id); + if(it != mNotifications.end()) { - // Pass the new_message icon state further. - set_new_message = chiclet->getShowNewMessagesIcon(); - } + LLIMChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(it->first); + if(chiclet) + { + // Pass the new_message icon state further. + set_new_message = chiclet->getShowNewMessagesIcon(); + } - LLScriptFloater* floater = LLFloaterReg::findTypedInstance<LLScriptFloater>("script_floater", it->second.notification_id); - if(floater) - { - // Generate chiclet with a "new message" indicator if a docked window was opened but not in focus. See EXT-3142. - set_new_message |= !floater->hasFocus(); - } + LLScriptFloater* floater = LLFloaterReg::findTypedInstance<LLScriptFloater>("script_floater", it->first); + if(floater) + { + // Generate chiclet with a "new message" indicator if a docked window was opened but not in focus. See EXT-3142. + set_new_message |= !floater->hasFocus(); + } - onRemoveNotification(it->second.notification_id); + onRemoveNotification(it->first); + } } - LLNotificationData nd = {notification_id}; - mNotifications.insert(std::make_pair(object_id, nd)); + mNotifications.insert(std::make_pair(notification_id, object_id)); // Create inventory offer chiclet for offer type notifications - LLNotificationPtr notification = LLNotifications::getInstance()->find(notification_id); - if( notification && notification->getType() == "offer" ) + if( OBJ_GIVE_INVENTORY == obj_type ) { - LLBottomTray::instance().getChicletPanel()->createChiclet<LLInvOfferChiclet>(object_id); + LLBottomTray::instance().getChicletPanel()->createChiclet<LLInvOfferChiclet>(notification_id); } else { - LLBottomTray::getInstance()->getChicletPanel()->createChiclet<LLScriptChiclet>(object_id); + LLBottomTray::getInstance()->getChicletPanel()->createChiclet<LLScriptChiclet>(notification_id); } - LLIMWellWindow::getInstance()->addObjectRow(object_id, set_new_message); + LLIMWellWindow::getInstance()->addObjectRow(notification_id, set_new_message); LLSD data; - data["object_id"] = object_id; + data["notification_id"] = notification_id; data["new_message"] = set_new_message; data["unread"] = 1; // each object has got only one floater mNewObjectSignal(data); - toggleScriptFloater(object_id, set_new_message); + toggleScriptFloater(notification_id, set_new_message); } void LLScriptFloaterManager::onRemoveNotification(const LLUUID& notification_id) { - LLUUID object_id = findObjectId(notification_id); - if(object_id.isNull()) + if(notification_id.isNull()) { - llwarns << "Invalid notification, no object id" << llendl; + llwarns << "Invalid notification ID" << llendl; return; } - using namespace LLNotificationsUI; - - // remove related toast - LLUUID channel_id(gSavedSettings.getString("NotificationChannelUUID")); - LLScreenChannel* channel = dynamic_cast<LLScreenChannel*> - (LLChannelManager::getInstance()->findChannelByID(channel_id)); - LLUUID n_toast_id = findNotificationToastId(object_id); - if(channel && n_toast_id.notNull()) - { - channel->killToastByNotificationID(n_toast_id); - } - // remove related chiclet - LLBottomTray::getInstance()->getChicletPanel()->removeChiclet(object_id); + LLBottomTray::getInstance()->getChicletPanel()->removeChiclet(notification_id); - LLIMWellWindow::getInstance()->removeObjectRow(object_id); + LLIMWellWindow::getInstance()->removeObjectRow(notification_id); // close floater LLScriptFloater* floater = LLFloaterReg::findTypedInstance<LLScriptFloater>("script_floater", notification_id); if(floater) { - floater->setObjectId(LLUUID::null); + floater->savePosition(); + floater->setNotificationId(LLUUID::null); floater->closeFloater(); } - mNotifications.erase(object_id); -} - -void LLScriptFloaterManager::removeNotificationByObjectId(const LLUUID& object_id) -{ - // Check we have not removed notification yet - LLNotificationPtr notification = LLNotifications::getInstance()->find( - findNotificationId(object_id)); - if(notification) - { - onRemoveNotification(notification->getID()); - } + mNotifications.erase(notification_id); } -void LLScriptFloaterManager::toggleScriptFloater(const LLUUID& object_id, bool set_new_message) +void LLScriptFloaterManager::toggleScriptFloater(const LLUUID& notification_id, bool set_new_message) { - // kill toast - using namespace LLNotificationsUI; - LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(LLChannelManager::getInstance()->findChannelByID( - LLUUID(gSavedSettings.getString("NotificationChannelUUID")))); - if(channel) - { - channel->killToastByNotificationID(findNotificationToastId(object_id)); - } - LLSD data; - data["object_id"] = object_id; + data["notification_id"] = notification_id; data["new_message"] = set_new_message; mToggleFloaterSignal(data); // toggle floater - LLScriptFloater::toggle(object_id); + LLScriptFloater::toggle(notification_id); } -void LLScriptFloaterManager::setNotificationToastId(const LLUUID& object_id, const LLUUID& notification_id) +LLUUID LLScriptFloaterManager::findObjectId(const LLUUID& notification_id) { - script_notification_map_t::iterator it = mNotifications.find(object_id); + script_notification_map_t::const_iterator it = mNotifications.find(notification_id); if(mNotifications.end() != it) { - it->second.toast_notification_id = notification_id; + return it->second; } + return LLUUID::null; } -LLUUID LLScriptFloaterManager::findObjectId(const LLUUID& notification_id) +LLUUID LLScriptFloaterManager::findNotificationId(const LLUUID& object_id) { - if(notification_id.notNull()) + if(object_id.notNull()) { - script_notification_map_t::const_iterator it = mNotifications.begin(); - for(; mNotifications.end() != it; ++it) + script_notification_map_t::const_iterator it = findUsingObjectId(object_id); + if(mNotifications.end() != it) { - if(notification_id == it->second.notification_id) - { - return it->first; - } + return it->first; } } return LLUUID::null; } -LLUUID LLScriptFloaterManager::findNotificationId(const LLUUID& object_id) +// static +LLScriptFloaterManager::EObjectType LLScriptFloaterManager::getObjectType(const LLUUID& notification_id) { - script_notification_map_t::const_iterator it = mNotifications.find(object_id); - if(mNotifications.end() != it) + if(notification_id.isNull()) { - return it->second.notification_id; + llwarns << "Invalid notification ID" << llendl; + return OBJ_UNKNOWN; } - return LLUUID::null; -} -LLUUID LLScriptFloaterManager::findNotificationToastId(const LLUUID& object_id) -{ - script_notification_map_t::const_iterator it = mNotifications.find(object_id); - if(mNotifications.end() != it) + static const object_type_map TYPE_MAP = initObjectTypeMap(); + + LLNotificationPtr notification = LLNotificationsUtil::find(notification_id); + object_type_map::const_iterator it = TYPE_MAP.find(notification->getName()); + if(it != TYPE_MAP.end()) { - return it->second.toast_notification_id; + return it->second; } - return LLUUID::null; + + llwarns << "Unknown object type" << llendl; + return OBJ_UNKNOWN; } -//static -void LLScriptFloaterManager::onToastButtonClick(const LLSD¬ification, const LLSD&response) +// static +std::string LLScriptFloaterManager::getObjectName(const LLUUID& notification_id) { - S32 option = LLNotification::getSelectedOption(notification, response); - LLUUID object_id = notification["payload"]["object_id"].asUUID(); + using namespace LLNotificationsUI; + LLNotificationPtr notification = LLNotifications::getInstance()->find(notification_id); + if(!notification) + { + llwarns << "Invalid notification" << llendl; + return LLStringUtil::null; + } - switch(option) + std::string text; + + switch(LLScriptFloaterManager::getObjectType(notification_id)) { - case 0: // "Open" - LLScriptFloaterManager::getInstance()->toggleScriptFloater(object_id); + case LLScriptFloaterManager::OBJ_SCRIPT: + text = notification->getSubstitutions()["TITLE"].asString(); break; - case 1: // "Ignore" - LLScriptFloaterManager::getInstance()->removeNotificationByObjectId(object_id); + case LLScriptFloaterManager::OBJ_LOAD_URL: + text = notification->getSubstitutions()["OBJECTNAME"].asString(); break; - case 2: // "Block" - LLMuteList::getInstance()->add(LLMute(object_id, notification["substitutions"]["TITLE"], LLMute::OBJECT)); - LLScriptFloaterManager::getInstance()->removeNotificationByObjectId(object_id); + case LLScriptFloaterManager::OBJ_GIVE_INVENTORY: + text = notification->getSubstitutions()["OBJECTFROMNAME"].asString(); break; default: - llwarns << "Unexpected value" << llendl; + text = LLTrans::getString("object"); break; } + + return text; +} + +//static +LLScriptFloaterManager::object_type_map LLScriptFloaterManager::initObjectTypeMap() +{ + object_type_map type_map; + type_map["ScriptDialog"] = OBJ_SCRIPT; + type_map["ScriptDialogGroup"] = OBJ_SCRIPT; + type_map["LoadWebPage"] = OBJ_LOAD_URL; + type_map["ObjectGiveItem"] = OBJ_GIVE_INVENTORY; + return type_map; +} + +LLScriptFloaterManager::script_notification_map_t::const_iterator LLScriptFloaterManager::findUsingObjectId(const LLUUID& object_id) +{ + script_notification_map_t::const_iterator it = mNotifications.begin(); + for(; mNotifications.end() != it; ++it) + { + if(object_id == it->second) + { + return it; + } + } + return mNotifications.end(); +} + +void LLScriptFloaterManager::saveFloaterPosition(const LLUUID& object_id, const FloaterPositionInfo& fpi) +{ + if(object_id.notNull()) + { + LLScriptFloaterManager::getInstance()->mFloaterPositions[object_id] = fpi; + } + else + { + llwarns << "Invalid object id" << llendl; + } +} + +bool LLScriptFloaterManager::getFloaterPosition(const LLUUID& object_id, FloaterPositionInfo& fpi) +{ + floater_position_map_t::const_iterator it = mFloaterPositions.find(object_id); + if(LLScriptFloaterManager::getInstance()->mFloaterPositions.end() != it) + { + fpi = it->second; + return true; + } + return false; +} + +void LLScriptFloaterManager::setFloaterVisible(const LLUUID& notification_id, bool visible) +{ + LLScriptFloater* floater = LLFloaterReg::findTypedInstance<LLScriptFloater>( + "script_floater", notification_id); + if(floater) + { + floater->setVisible(visible); + } } // EOF diff --git a/indra/newview/llscriptfloater.h b/indra/newview/llscriptfloater.h index f86605c5d1..dc0cfc2400 100644 --- a/indra/newview/llscriptfloater.h +++ b/indra/newview/llscriptfloater.h @@ -48,6 +48,15 @@ class LLScriptFloaterManager : public LLSingleton<LLScriptFloaterManager> // know how script notifications should look like. public: + typedef enum e_object_type + { + OBJ_SCRIPT, + OBJ_GIVE_INVENTORY, + OBJ_LOAD_URL, + + OBJ_UNKNOWN + }EObjectType; + /** * Handles new notifications. * Saves notification and object ids, removes old notification if needed, creates script chiclet @@ -62,11 +71,6 @@ public: void onRemoveNotification(const LLUUID& notification_id); /** - * Wrapper for onRemoveNotification, removes notification by object id. - */ - void removeNotificationByObjectId(const LLUUID& object_id); - - /** * Toggles script floater. * Removes "new message" icon from chiclet and removes notification toast. */ @@ -76,38 +80,49 @@ public: LLUUID findNotificationId(const LLUUID& object_id); - LLUUID findNotificationToastId(const LLUUID& object_id); + static EObjectType getObjectType(const LLUUID& notification_id); - /** - * Associate notification toast id with object id. - */ - void setNotificationToastId(const LLUUID& object_id, const LLUUID& notification_id); - - /** - * Callback for notification toast buttons. - */ - static void onToastButtonClick(const LLSD¬ification, const LLSD&response); + static std::string getObjectName(const LLUUID& notification_id); typedef boost::signals2::signal<void(const LLSD&)> object_signal_t; boost::signals2::connection addNewObjectCallback(const object_signal_t::slot_type& cb) { return mNewObjectSignal.connect(cb); } boost::signals2::connection addToggleObjectFloaterCallback(const object_signal_t::slot_type& cb) { return mToggleFloaterSignal.connect(cb); } -private: - - struct LLNotificationData + struct FloaterPositionInfo { - LLUUID notification_id; - LLUUID toast_notification_id; + LLRect mRect; + bool mDockState; }; - // <object_id, notification_data> - typedef std::map<LLUUID, LLNotificationData> script_notification_map_t; + void saveFloaterPosition(const LLUUID& object_id, const FloaterPositionInfo& fpi); + + bool getFloaterPosition(const LLUUID& object_id, FloaterPositionInfo& fpi); + + void setFloaterVisible(const LLUUID& notification_id, bool visible); + +protected: + + typedef std::map<std::string, EObjectType> object_type_map; + + static object_type_map initObjectTypeMap(); + + // <notification_id, object_id> + typedef std::map<LLUUID, LLUUID> script_notification_map_t; + + script_notification_map_t::const_iterator findUsingObjectId(const LLUUID& object_id); + +private: script_notification_map_t mNotifications; object_signal_t mNewObjectSignal; object_signal_t mToggleFloaterSignal; + + // <object_id, floater position> + typedef std::map<LLUUID, FloaterPositionInfo> floater_position_map_t; + + floater_position_map_t mFloaterPositions; }; /** @@ -136,9 +151,9 @@ public: */ static LLScriptFloater* show(const LLUUID& object_id); - const LLUUID& getObjectId() { return mObjectId; } + const LLUUID& getNotificationId() { return mNotificationId; } - void setObjectId(const LLUUID& id) { mObjectId = id; } + void setNotificationId(const LLUUID& id); /** * Close notification if script floater is closed. @@ -155,6 +170,14 @@ public: */ /*virtual*/ void setVisible(BOOL visible); + bool getSavePosition() { return mSaveFloaterPosition; } + + void setSavePosition(bool save) { mSaveFloaterPosition = save; } + + void savePosition(); + + void restorePosition(); + protected: /** @@ -178,9 +201,13 @@ protected: /*virtual*/ void onFocusReceived(); + void dockToChiclet(bool dock); + private: LLToastNotifyPanel* mScriptForm; + LLUUID mNotificationId; LLUUID mObjectId; + bool mSaveFloaterPosition; }; #endif //LL_SCRIPTFLOATER_H diff --git a/indra/newview/llscrollingpanelparam.cpp b/indra/newview/llscrollingpanelparam.cpp index 32a915608e..6f5238f0a1 100644 --- a/indra/newview/llscrollingpanelparam.cpp +++ b/indra/newview/llscrollingpanelparam.cpp @@ -42,24 +42,21 @@ #include "llbutton.h" #include "llsliderctrl.h" #include "llagent.h" +#include "llviewborder.h" #include "llvoavatarself.h" // Constants for LLPanelVisualParam const F32 LLScrollingPanelParam::PARAM_STEP_TIME_THRESHOLD = 0.25f; -const S32 LLScrollingPanelParam::BTN_BORDER = 2; const S32 LLScrollingPanelParam::PARAM_HINT_WIDTH = 128; const S32 LLScrollingPanelParam::PARAM_HINT_HEIGHT = 128; -const S32 LLScrollingPanelParam::PARAM_HINT_LABEL_HEIGHT = 16; -const S32 LLScrollingPanelParam::PARAM_PANEL_WIDTH = 2 * (3* BTN_BORDER + PARAM_HINT_WIDTH + LLPANEL_BORDER_WIDTH); -const S32 LLScrollingPanelParam::PARAM_PANEL_HEIGHT = 2 * BTN_BORDER + PARAM_HINT_HEIGHT + PARAM_HINT_LABEL_HEIGHT + 4 * LLPANEL_BORDER_WIDTH; // LLScrollingPanelParam //static S32 LLScrollingPanelParam::sUpdateDelayFrames = 0; LLScrollingPanelParam::LLScrollingPanelParam( const LLPanel::Params& panel_params, - LLViewerJointMesh* mesh, LLViewerVisualParam* param, BOOL allow_modify, LLWearable* wearable ) + LLViewerJointMesh* mesh, LLViewerVisualParam* param, BOOL allow_modify, LLWearable* wearable, LLJoint* jointp ) : LLScrollingPanel( panel_params ), mParam(param), mAllowModify(allow_modify), @@ -67,15 +64,18 @@ LLScrollingPanelParam::LLScrollingPanelParam( const LLPanel::Params& panel_param { LLUICtrlFactory::getInstance()->buildPanel(this, "panel_scrolling_param.xml"); + // *HACK To avoid hard coding texture position, lets use border's position for texture. + LLViewBorder* left_border = getChild<LLViewBorder>("left_border"); + static LLUICachedControl<S32> slider_ctrl_height ("UISliderctrlHeight", 0); - S32 pos_x = 2 * LLPANEL_BORDER_WIDTH; - S32 pos_y = 3 * LLPANEL_BORDER_WIDTH + slider_ctrl_height; + S32 pos_x = left_border->getRect().mLeft + left_border->getBorderWidth(); + S32 pos_y = left_border->getRect().mBottom + left_border->getBorderWidth(); F32 min_weight = param->getMinWeight(); F32 max_weight = param->getMaxWeight(); - mHintMin = new LLVisualParamHint( pos_x, pos_y, PARAM_HINT_WIDTH, PARAM_HINT_HEIGHT, mesh, (LLViewerVisualParam*) wearable->getVisualParam(param->getID()), min_weight); - pos_x += PARAM_HINT_WIDTH + 3 * BTN_BORDER; - mHintMax = new LLVisualParamHint( pos_x, pos_y, PARAM_HINT_WIDTH, PARAM_HINT_HEIGHT, mesh, (LLViewerVisualParam*) wearable->getVisualParam(param->getID()), max_weight ); + mHintMin = new LLVisualParamHint( pos_x, pos_y, PARAM_HINT_WIDTH, PARAM_HINT_HEIGHT, mesh, (LLViewerVisualParam*) wearable->getVisualParam(param->getID()), wearable, min_weight, jointp); + pos_x = getChild<LLViewBorder>("right_border")->getRect().mLeft + left_border->getBorderWidth(); + mHintMax = new LLVisualParamHint( pos_x, pos_y, PARAM_HINT_WIDTH, PARAM_HINT_HEIGHT, mesh, (LLViewerVisualParam*) wearable->getVisualParam(param->getID()), wearable, max_weight, jointp ); mHintMin->setAllowsUpdates( FALSE ); mHintMax->setAllowsUpdates( FALSE ); @@ -162,39 +162,39 @@ void LLScrollingPanelParam::draw() childSetVisible("less", mHintMin->getVisible()); childSetVisible("more", mHintMax->getVisible()); + // hide borders if texture has been loaded + childSetVisible("left_border", !mHintMin->getVisible()); + childSetVisible("right_border", !mHintMax->getVisible()); + // Draw all the children except for the labels childSetVisible( "min param text", FALSE ); childSetVisible( "max param text", FALSE ); LLPanel::draw(); // Draw the hints over the "less" and "more" buttons. - glPushMatrix(); + gGL.pushUIMatrix(); { const LLRect& r = mHintMin->getRect(); - F32 left = (F32)(r.mLeft + BTN_BORDER); - F32 bot = (F32)(r.mBottom + BTN_BORDER); - glTranslatef(left, bot, 0.f); + gGL.translateUI((F32)r.mLeft, (F32)r.mBottom, 0.f); mHintMin->draw(); } - glPopMatrix(); + gGL.popUIMatrix(); - glPushMatrix(); + gGL.pushUIMatrix(); { const LLRect& r = mHintMax->getRect(); - F32 left = (F32)(r.mLeft + BTN_BORDER); - F32 bot = (F32)(r.mBottom + BTN_BORDER); - glTranslatef(left, bot, 0.f); + gGL.translateUI((F32)r.mLeft, (F32)r.mBottom, 0.f); mHintMax->draw(); } - glPopMatrix(); + gGL.popUIMatrix(); // Draw labels on top of the buttons childSetVisible( "min param text", TRUE ); - drawChild(getChild<LLView>("min param text"), BTN_BORDER, BTN_BORDER); + drawChild(getChild<LLView>("min param text")); childSetVisible( "max param text", TRUE ); - drawChild(getChild<LLView>("max param text"), BTN_BORDER, BTN_BORDER); + drawChild(getChild<LLView>("max param text")); } // static @@ -209,7 +209,7 @@ void LLScrollingPanelParam::onSliderMoved(LLUICtrl* ctrl, void* userdata) if (current_weight != new_weight ) { self->mWearable->setVisualParamWeight( param->getID(), new_weight, FALSE ); - gAgent.getAvatarObject()->updateVisualParams(); + gAgentAvatarp->updateVisualParams(); } } @@ -298,7 +298,7 @@ void LLScrollingPanelParam::onHintHeldDown( LLVisualParamHint* hint ) && new_percent < slider->getMaxValue()) { mWearable->setVisualParamWeight( hint->getVisualParam()->getID(), new_weight, FALSE); - gAgent.getAvatarObject()->updateVisualParams(); + gAgentAvatarp->updateVisualParams(); slider->setValue( weightToPercent( new_weight ) ); } @@ -344,8 +344,7 @@ void LLScrollingPanelParam::onHintMaxMouseUp( void* userdata ) F32 elapsed_time = self->mMouseDownTimer.getElapsedTimeF32(); - LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); - if (avatar) + if (isAgentAvatarValid()) { LLVisualParamHint* hint = self->mHintMax; diff --git a/indra/newview/llscrollingpanelparam.h b/indra/newview/llscrollingpanelparam.h index 8c5db64816..3cdfd188a8 100644 --- a/indra/newview/llscrollingpanelparam.h +++ b/indra/newview/llscrollingpanelparam.h @@ -42,12 +42,13 @@ class LLViewerVisualParam; class LLWearable; class LLVisualParamHint; class LLViewerVisualParam; +class LLJoint; class LLScrollingPanelParam : public LLScrollingPanel { public: LLScrollingPanelParam( const LLPanel::Params& panel_params, - LLViewerJointMesh* mesh, LLViewerVisualParam* param, BOOL allow_modify, LLWearable* wearable ); + LLViewerJointMesh* mesh, LLViewerVisualParam* param, BOOL allow_modify, LLWearable* wearable, LLJoint* jointp ); virtual ~LLScrollingPanelParam(); virtual void draw(); @@ -75,13 +76,8 @@ public: // Constants for LLPanelVisualParam const static F32 PARAM_STEP_TIME_THRESHOLD; - const static S32 BTN_BORDER; const static S32 PARAM_HINT_WIDTH; const static S32 PARAM_HINT_HEIGHT; - const static S32 PARAM_HINT_LABEL_HEIGHT; - const static S32 PARAM_PANEL_WIDTH; - const static S32 PARAM_PANEL_HEIGHT; - public: LLViewerVisualParam* mParam; diff --git a/indra/newview/llsearchcombobox.cpp b/indra/newview/llsearchcombobox.cpp index 93a70b6471..a130878176 100644 --- a/indra/newview/llsearchcombobox.cpp +++ b/indra/newview/llsearchcombobox.cpp @@ -78,6 +78,7 @@ LLSearchComboBox::LLSearchComboBox(const Params&p) button_params.click_callback.function(boost::bind(&LLSearchComboBox::onSelectionCommit, this)); mSearchButton = LLUICtrlFactory::create<LLButton>(button_params); mTextEntry->addChild(mSearchButton); + mTextEntry->setPassDelete(TRUE); setButtonVisible(p.dropdown_button_visible); mTextEntry->setCommitCallback(boost::bind(&LLComboBox::onTextCommit, this, _2)); diff --git a/indra/newview/llsecapi.cpp b/indra/newview/llsecapi.cpp new file mode 100644 index 0000000000..6389fd292c --- /dev/null +++ b/indra/newview/llsecapi.cpp @@ -0,0 +1,197 @@ +/** + * @file llsecapi.cpp + * @brief Security API for services such as certificate handling + * secure local storage, etc. + * + * $LicenseInfo:firstyear=2009&license=viewergpl$ + * + * Copyright (c) 2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlife.com/developers/opensource/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlife.com/developers/opensource/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + + +#include "llviewerprecompiledheaders.h" +#include "llsecapi.h" +#include "llsechandler_basic.h" +#include <openssl/evp.h> +#include <openssl/err.h> +#include <map> +#include "llhttpclient.h" + + + +std::map<std::string, LLPointer<LLSecAPIHandler> > gHandlerMap; +LLPointer<LLSecAPIHandler> gSecAPIHandler; + +void initializeSecHandler() +{ + ERR_load_crypto_strings(); + OpenSSL_add_all_algorithms(); + + gHandlerMap[BASIC_SECHANDLER] = new LLSecAPIBasicHandler(); + + + // Currently, we only have the Basic handler, so we can point the main sechandler + // pointer to the basic handler. Later, we'll create a wrapper handler that + // selects the appropriate sechandler as needed, for instance choosing the + // mac keyring handler, with fallback to the basic sechandler + gSecAPIHandler = gHandlerMap[BASIC_SECHANDLER]; + + // initialize all SecAPIHandlers + std::string exception_msg; + std::map<std::string, LLPointer<LLSecAPIHandler> >::const_iterator itr; + for(itr = gHandlerMap.begin(); itr != gHandlerMap.end(); ++itr) + { + LLPointer<LLSecAPIHandler> handler = (*itr).second; + try + { + handler->init(); + } + catch (LLProtectedDataException e) + { + exception_msg = e.getMessage(); + } + } + if (!exception_msg.empty()) // an exception was thrown. + { + throw LLProtectedDataException(exception_msg.c_str()); + } + +} +// start using a given security api handler. If the string is empty +// the default is used +LLPointer<LLSecAPIHandler> getSecHandler(const std::string& handler_type) +{ + if (gHandlerMap.find(handler_type) != gHandlerMap.end()) + { + return gHandlerMap[handler_type]; + } + else + { + return LLPointer<LLSecAPIHandler>(NULL); + } +} +// register a handler +void registerSecHandler(const std::string& handler_type, + LLPointer<LLSecAPIHandler>& handler) +{ + gHandlerMap[handler_type] = handler; +} + +std::ostream& operator <<(std::ostream& s, const LLCredential& cred) +{ + return s << (std::string)cred; +} + + +// secapiSSLCertVerifyCallback +// basic callback called when a cert verification is requested. +// calls SECAPI to validate the context +// not initialized in the above initialization function, due to unit tests +// see llappviewer + +int secapiSSLCertVerifyCallback(X509_STORE_CTX *ctx, void *param) +{ + LLURLRequest *req = (LLURLRequest *)param; + LLPointer<LLCertificateStore> store = gSecAPIHandler->getCertificateStore(""); + LLPointer<LLCertificateChain> chain = gSecAPIHandler->getCertificateChain(ctx); + LLSD validation_params = LLSD::emptyMap(); + LLURI uri(req->getURL()); + validation_params[CERT_HOSTNAME] = uri.hostName(); + try + { + // we rely on libcurl to validate the hostname, as libcurl does more extensive validation + // leaving our hostname validation call mechanism for future additions with respect to + // OS native (Mac keyring, windows CAPI) validation. + store->validate(VALIDATION_POLICY_SSL & (~VALIDATION_POLICY_HOSTNAME), chain, validation_params); + } + catch (LLCertValidationTrustException& cert_exception) + { + LL_WARNS("AppInit") << "Cert not trusted: " << cert_exception.getMessage() << LL_ENDL; + return 0; + } + catch (LLCertException& cert_exception) + { + LL_WARNS("AppInit") << "cert error " << cert_exception.getMessage() << LL_ENDL; + return 0; + } + catch (...) + { + LL_WARNS("AppInit") << "cert error " << LL_ENDL; + return 0; + } + return 1; +} + +LLSD LLCredential::getLoginParams() +{ + LLSD result = LLSD::emptyMap(); + try + { + if (mIdentifier["type"].asString() == "agent") + { + // legacy credential + result["passwd"] = "$1$" + mAuthenticator["secret"].asString(); + result["first"] = mIdentifier["first_name"]; + result["last"] = mIdentifier["last_name"]; + + } + else if (mIdentifier["type"].asString() == "account") + { + result["username"] = mIdentifier["account_name"]; + result["passwd"] = mAuthenticator["secret"]; + + } + } + catch (...) + { + // we could have corrupt data, so simply return a null login param if so + LL_WARNS("AppInit") << "Invalid credential" << LL_ENDL; + } + return result; +} + +void LLCredential::identifierType(std::string &idType) +{ + if(mIdentifier.has("type")) + { + idType = mIdentifier["type"].asString(); + } + else { + idType = std::string(); + + } +} + +void LLCredential::authenticatorType(std::string &idType) +{ + if(mAuthenticator.has("type")) + { + idType = mAuthenticator["type"].asString(); + } + else { + idType = std::string(); + + } +} diff --git a/indra/newview/llsecapi.h b/indra/newview/llsecapi.h new file mode 100644 index 0000000000..5a1a3879d4 --- /dev/null +++ b/indra/newview/llsecapi.h @@ -0,0 +1,498 @@ +/** + * @file llsecapi.h + * @brief Security API for services such as certificate handling + * secure local storage, etc. + * + * $LicenseInfo:firstyear=2009&license=viewergpl$ + * + * Copyright (c) 2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlife.com/developers/opensource/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlife.com/developers/opensource/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LLSECAPI_H +#define LLSECAPI_H +#include <vector> +#include <openssl/x509.h> +#include <ostream> + +#ifdef LL_WINDOWS +#pragma warning(disable:4250) +#endif // LL_WINDOWS + +// All error handling is via exceptions. + + +#define CERT_SUBJECT_NAME "subject_name" +#define CERT_ISSUER_NAME "issuer_name" +#define CERT_NAME_CN "commonName" + +#define CERT_SUBJECT_NAME_STRING "subject_name_string" +#define CERT_ISSUER_NAME_STRING "issuer_name_string" + +#define CERT_SERIAL_NUMBER "serial_number" + +#define CERT_VALID_FROM "valid_from" +#define CERT_VALID_TO "valid_to" +#define CERT_SHA1_DIGEST "sha1_digest" +#define CERT_MD5_DIGEST "md5_digest" +#define CERT_HOSTNAME "hostname" +#define CERT_BASIC_CONSTRAINTS "basicConstraints" +#define CERT_BASIC_CONSTRAINTS_CA "CA" +#define CERT_BASIC_CONSTRAINTS_PATHLEN "pathLen" + +#define CERT_KEY_USAGE "keyUsage" +#define CERT_KU_DIGITAL_SIGNATURE "digitalSignature" +#define CERT_KU_NON_REPUDIATION "nonRepudiation" +#define CERT_KU_KEY_ENCIPHERMENT "keyEncipherment" +#define CERT_KU_DATA_ENCIPHERMENT "dataEncipherment" +#define CERT_KU_KEY_AGREEMENT "keyAgreement" +#define CERT_KU_CERT_SIGN "certSigning" +#define CERT_KU_CRL_SIGN "crlSigning" +#define CERT_KU_ENCIPHER_ONLY "encipherOnly" +#define CERT_KU_DECIPHER_ONLY "decipherOnly" + +#define BASIC_SECHANDLER "BASIC_SECHANDLER" +#define CERT_VALIDATION_DATE "validation_date" + +#define CERT_EXTENDED_KEY_USAGE "extendedKeyUsage" +#define CERT_EKU_SERVER_AUTH SN_server_auth + +#define CERT_SUBJECT_KEY_IDENTFIER "subjectKeyIdentifier" +#define CERT_AUTHORITY_KEY_IDENTIFIER "authorityKeyIdentifier" +#define CERT_AUTHORITY_KEY_IDENTIFIER_ID "authorityKeyIdentifierId" +#define CERT_AUTHORITY_KEY_IDENTIFIER_NAME "authorityKeyIdentifierName" +#define CERT_AUTHORITY_KEY_IDENTIFIER_SERIAL "authorityKeyIdentifierSerial" + +// validate the current time lies within +// the validation period of the cert +#define VALIDATION_POLICY_TIME 1 + +// validate that the CA, or some cert in the chain +// lies within the certificate store +#define VALIDATION_POLICY_TRUSTED 2 + +// validate that the subject name of +// the cert contains the passed in hostname +// or validates against the hostname +#define VALIDATION_POLICY_HOSTNAME 4 + + +// validate that the cert contains the SSL EKU +#define VALIDATION_POLICY_SSL_KU 8 + +// validate that the cert contains the SSL EKU +#define VALIDATION_POLICY_CA_KU 16 + +#define VALIDATION_POLICY_CA_BASIC_CONSTRAINTS 32 + +// validate that the cert is correct for SSL +#define VALIDATION_POLICY_SSL (VALIDATION_POLICY_TIME | \ + VALIDATION_POLICY_HOSTNAME | \ + VALIDATION_POLICY_TRUSTED | \ + VALIDATION_POLICY_SSL_KU | \ + VALIDATION_POLICY_CA_BASIC_CONSTRAINTS | \ + VALIDATION_POLICY_CA_KU) + + + + + + +class LLProtectedDataException +{ +public: + LLProtectedDataException(const char *msg) + { + LL_WARNS("SECAPI") << "Protected Data Error: " << (std::string)msg << LL_ENDL; + mMsg = (std::string)msg; + } + std::string getMessage() { return mMsg; } +protected: + std::string mMsg; +}; + +// class LLCertificate +// parent class providing an interface for certifiate. +// LLCertificates are considered unmodifiable +// Certificates are pulled out of stores, or created via +// factory calls +class LLCertificate : public LLRefCount +{ + LOG_CLASS(LLCertificate); +public: + LLCertificate() {} + + virtual ~LLCertificate() {} + + // return a PEM encoded certificate. The encoding + // includes the -----BEGIN CERTIFICATE----- and end certificate elements + virtual std::string getPem() const=0; + + // return a DER encoded certificate + virtual std::vector<U8> getBinary() const=0; + + // return an LLSD object containing information about the certificate + // such as its name, signature, expiry time, serial number + virtual void getLLSD(LLSD& llsd)=0; + + // return an openSSL X509 struct for the certificate + virtual X509* getOpenSSLX509() const=0; + +}; + +// class LLCertificateVector +// base class for a list of certificates. + + +class LLCertificateVector : public LLRefCount +{ + +public: + + LLCertificateVector() {}; + virtual ~LLCertificateVector() {}; + + // base iterator implementation class, providing + // the functionality needed for the iterator class. + class iterator_impl : public LLRefCount + { + public: + iterator_impl() {}; + virtual ~iterator_impl() {}; + virtual void seek(bool incr)=0; + virtual LLPointer<iterator_impl> clone() const=0; + virtual bool equals(const LLPointer<iterator_impl>& _iter) const=0; + virtual LLPointer<LLCertificate> get()=0; + }; + + // iterator class + class iterator + { + public: + iterator(LLPointer<iterator_impl> impl) : mImpl(impl) {} + iterator() : mImpl(NULL) {} + iterator(const iterator& _iter) {mImpl = _iter.mImpl->clone(); } + ~iterator() {} + iterator& operator++() { if(mImpl.notNull()) mImpl->seek(true); return *this;} + iterator& operator--() { if(mImpl.notNull()) mImpl->seek(false); return *this;} + + iterator operator++(int) { iterator result = *this; if(mImpl.notNull()) mImpl->seek(true); return result;} + iterator operator--(int) { iterator result = *this; if(mImpl.notNull()) mImpl->seek(false); return result;} + LLPointer<LLCertificate> operator*() { return mImpl->get(); } + + LLPointer<iterator_impl> mImpl; + protected: + friend bool operator==(const LLCertificateVector::iterator& _lhs, const LLCertificateVector::iterator& _rhs); + bool equals(const iterator& _iter) const { return mImpl->equals(_iter.mImpl); } + }; + + // numeric indexer + virtual LLPointer<LLCertificate> operator[](int)=0; + + // Iteration + virtual iterator begin()=0; + + virtual iterator end()=0; + + // find a cert given params + virtual iterator find(const LLSD& params) =0; + + // return the number of certs in the store + virtual int size() const = 0; + + // append the cert to the store. if a copy of the cert already exists in the store, it is removed first + virtual void add(LLPointer<LLCertificate> cert)=0; + + // insert the cert to the store. if a copy of the cert already exists in the store, it is removed first + virtual void insert(iterator location, LLPointer<LLCertificate> cert)=0; + + // remove a certificate from the store + virtual LLPointer<LLCertificate> erase(iterator cert)=0; +}; + +// class LLCertificateChain +// Class representing a chain of certificates in order, with the +// first element being the child cert. +class LLCertificateChain : virtual public LLCertificateVector +{ + +public: + LLCertificateChain() {} + + virtual ~LLCertificateChain() {} + +}; + +// class LLCertificateStore +// represents a store of certificates, typically a store of root CA +// certificates. The store can be persisted, and can be used to validate +// a cert chain +// +class LLCertificateStore : virtual public LLCertificateVector +{ + +public: + + LLCertificateStore() {} + virtual ~LLCertificateStore() {} + + // persist the store + virtual void save()=0; + + // return the store id + virtual std::string storeId() const=0; + + // validate a certificate chain given the params. + // Will throw exceptions on error + + virtual void validate(int validation_policy, + LLPointer<LLCertificateChain> cert_chain, + const LLSD& validation_params) =0; + +}; + + +inline +bool operator==(const LLCertificateVector::iterator& _lhs, const LLCertificateVector::iterator& _rhs) +{ + return _lhs.equals(_rhs); +} +inline +bool operator!=(const LLCertificateVector::iterator& _lhs, const LLCertificateVector::iterator& _rhs) +{ + return !(_lhs == _rhs); +} + + +#define CRED_IDENTIFIER_TYPE_ACCOUNT "account" +#define CRED_IDENTIFIER_TYPE_AGENT "agent" +#define CRED_AUTHENTICATOR_TYPE_CLEAR "clear" +#define CRED_AUTHENTICATOR_TYPE_HASH "hash" +// +// LLCredential - interface for credentials providing the following functionality: +// * persistance of credential information based on grid (for saving username/password) +// * serialization to an OGP identifier/authenticator pair +// +class LLCredential : public LLRefCount +{ +public: + + LLCredential() {} + + LLCredential(const std::string& grid) + { + mGrid = grid; + mIdentifier = LLSD::emptyMap(); + mAuthenticator = LLSD::emptyMap(); + } + + virtual ~LLCredential() {} + + virtual void setCredentialData(const LLSD& identifier, const LLSD& authenticator) + { + mIdentifier = identifier; + mAuthenticator = authenticator; + } + virtual LLSD getIdentifier() { return mIdentifier; } + virtual void identifierType(std::string& idType); + virtual LLSD getAuthenticator() { return mAuthenticator; } + virtual void authenticatorType(std::string& authType); + virtual LLSD getLoginParams(); + virtual std::string getGrid() { return mGrid; } + + + virtual void clearAuthenticator() { mAuthenticator = LLSD(); } + virtual std::string userID() const { return std::string("unknown");} + virtual std::string asString() const { return std::string("unknown");} + operator std::string() const { return asString(); } +protected: + LLSD mIdentifier; + LLSD mAuthenticator; + std::string mGrid; +}; + +std::ostream& operator <<(std::ostream& s, const LLCredential& cred); + + +// All error handling is via exceptions. + +class LLCertException +{ +public: + LLCertException(LLPointer<LLCertificate> cert, const char* msg) + { + + mCert = cert; + + LL_WARNS("SECAPI") << "Certificate Error: " << (std::string)msg << LL_ENDL; + mMsg = (std::string)msg; + } + LLPointer<LLCertificate> getCert() { return mCert; } + std::string getMessage() { return mMsg; } +protected: + LLPointer<LLCertificate> mCert; + std::string mMsg; +}; + +class LLInvalidCertificate : public LLCertException +{ +public: + LLInvalidCertificate(LLPointer<LLCertificate> cert) : LLCertException(cert, "CertInvalid") + { + } +protected: +}; + +class LLCertValidationTrustException : public LLCertException +{ +public: + LLCertValidationTrustException(LLPointer<LLCertificate> cert) : LLCertException(cert, "CertUntrusted") + { + } +protected: +}; + +class LLCertValidationHostnameException : public LLCertException +{ +public: + LLCertValidationHostnameException(std::string hostname, + LLPointer<LLCertificate> cert) : LLCertException(cert, "CertInvalidHostname") + { + mHostname = hostname; + } + + std::string getHostname() { return mHostname; } +protected: + std::string mHostname; +}; + +class LLCertValidationExpirationException : public LLCertException +{ +public: + LLCertValidationExpirationException(LLPointer<LLCertificate> cert, + LLDate current_time) : LLCertException(cert, "CertExpired") + { + mTime = current_time; + } + LLDate GetTime() { return mTime; } +protected: + LLDate mTime; +}; + +class LLCertKeyUsageValidationException : public LLCertException +{ +public: + LLCertKeyUsageValidationException(LLPointer<LLCertificate> cert) : LLCertException(cert, "CertKeyUsage") + { + } +protected: +}; + +class LLCertBasicConstraintsValidationException : public LLCertException +{ +public: + LLCertBasicConstraintsValidationException(LLPointer<LLCertificate> cert) : LLCertException(cert, "CertBasicConstraints") + { + } +protected: +}; + +class LLCertValidationInvalidSignatureException : public LLCertException +{ +public: + LLCertValidationInvalidSignatureException(LLPointer<LLCertificate> cert) : LLCertException(cert, "CertInvalidSignature") + { + } +protected: +}; + +// LLSecAPIHandler Class +// Interface handler class for the various security storage handlers. +class LLSecAPIHandler : public LLRefCount +{ +public: + + + LLSecAPIHandler() {} + virtual ~LLSecAPIHandler() {} + + // initialize the SecAPIHandler + virtual void init() {}; + + // instantiate a certificate from a pem string + virtual LLPointer<LLCertificate> getCertificate(const std::string& pem_cert)=0; + + + + // instiate a certificate from an openssl X509 structure + virtual LLPointer<LLCertificate> getCertificate(X509* openssl_cert)=0; + + // instantiate a chain from an X509_STORE_CTX + virtual LLPointer<LLCertificateChain> getCertificateChain(const X509_STORE_CTX* chain)=0; + + // instantiate a cert store given it's id. if a persisted version + // exists, it'll be loaded. If not, one will be created (but not + // persisted) + virtual LLPointer<LLCertificateStore> getCertificateStore(const std::string& store_id)=0; + + // persist data in a protected store + virtual void setProtectedData(const std::string& data_type, + const std::string& data_id, + const LLSD& data)=0; + + // retrieve protected data + virtual LLSD getProtectedData(const std::string& data_type, + const std::string& data_id)=0; + + // delete a protected data item from the store + virtual void deleteProtectedData(const std::string& data_type, + const std::string& data_id)=0; + + virtual LLPointer<LLCredential> createCredential(const std::string& grid, + const LLSD& identifier, + const LLSD& authenticator)=0; + + virtual LLPointer<LLCredential> loadCredential(const std::string& grid)=0; + + virtual void saveCredential(LLPointer<LLCredential> cred, bool save_authenticator)=0; + + virtual void deleteCredential(LLPointer<LLCredential> cred)=0; + +}; + +void initializeSecHandler(); + +// retrieve a security api depending on the api type +LLPointer<LLSecAPIHandler> getSecHandler(const std::string& handler_type); + +void registerSecHandler(const std::string& handler_type, + LLPointer<LLSecAPIHandler>& handler); + +extern LLPointer<LLSecAPIHandler> gSecAPIHandler; + + +int secapiSSLCertVerifyCallback(X509_STORE_CTX *ctx, void *param); + + +#endif // LL_SECAPI_H diff --git a/indra/newview/llsechandler_basic.cpp b/indra/newview/llsechandler_basic.cpp new file mode 100644 index 0000000000..e191e50c4b --- /dev/null +++ b/indra/newview/llsechandler_basic.cpp @@ -0,0 +1,1665 @@ +/** + * @file llsechandler_basic.cpp + * @brief Security API for services such as certificate handling + * secure local storage, etc. + * + * $LicenseInfo:firstyear=2003&license=viewergpl$ + * + * Copyright (c) 2003-2000, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlife.com/developers/opensource/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlife.com/developers/opensource/flossexception + * +LLS * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + + +#include "llviewerprecompiledheaders.h" +#include "llsecapi.h" +#include "llsechandler_basic.h" +#include "llsdserialize.h" +#include "llviewernetwork.h" +#include "llxorcipher.h" +#include "llfile.h" +#include "lldir.h" +#include "llviewercontrol.h" +#include <vector> +#include <ios> +#include <openssl/ossl_typ.h> +#include <openssl/x509.h> +#include <openssl/x509v3.h> +#include <openssl/pem.h> +#include <openssl/asn1.h> +#include <openssl/rand.h> +#include <openssl/err.h> +#include <iostream> +#include <iomanip> +#include <time.h> +#include "llmachineid.h" + + + +// 128 bits of salt data... +#define STORE_SALT_SIZE 16 +#define BUFFER_READ_SIZE 256 +std::string cert_string_from_asn1_string(ASN1_STRING* value); +std::string cert_string_from_octet_string(ASN1_OCTET_STRING* value); + +LLSD _basic_constraints_ext(X509* cert); +LLSD _key_usage_ext(X509* cert); +LLSD _ext_key_usage_ext(X509* cert); +LLSD _subject_key_identifier_ext(X509 *cert); +LLSD _authority_key_identifier_ext(X509* cert); + +LLBasicCertificate::LLBasicCertificate(const std::string& pem_cert) +{ + + // BIO_new_mem_buf returns a read only bio, but takes a void* which isn't const + // so we need to cast it. + BIO * pem_bio = BIO_new_mem_buf((void*)pem_cert.c_str(), pem_cert.length()); + if(pem_bio == NULL) + { + LL_WARNS("SECAPI") << "Could not allocate an openssl memory BIO." << LL_ENDL; + throw LLInvalidCertificate(this); + } + mCert = NULL; + PEM_read_bio_X509(pem_bio, &mCert, 0, NULL); + BIO_free(pem_bio); + if (!mCert) + { + throw LLInvalidCertificate(this); + } +} + + +LLBasicCertificate::LLBasicCertificate(X509* pCert) +{ + if (!pCert || !pCert->cert_info) + { + throw LLInvalidCertificate(this); + } + mCert = X509_dup(pCert); +} + +LLBasicCertificate::~LLBasicCertificate() +{ + if(mCert) + { + X509_free(mCert); + } +} + +// +// retrieve the pem using the openssl functionality +std::string LLBasicCertificate::getPem() const +{ + char * pem_bio_chars = NULL; + // a BIO is the equivalent of a 'std::stream', and + // can be a file, mem stream, whatever. Grab a memory based + // BIO for the result + BIO *pem_bio = BIO_new(BIO_s_mem()); + if (!pem_bio) + { + LL_WARNS("SECAPI") << "Could not allocate an openssl memory BIO." << LL_ENDL; + return std::string(); + } + PEM_write_bio_X509(pem_bio, mCert); + int length = BIO_get_mem_data(pem_bio, &pem_bio_chars); + std::string result = std::string(pem_bio_chars, length); + BIO_free(pem_bio); + return result; +} + +// get the DER encoding for the cert +// DER is a binary encoding format for certs... +std::vector<U8> LLBasicCertificate::getBinary() const +{ + U8 * der_bio_data = NULL; + // get a memory bio + BIO *der_bio = BIO_new(BIO_s_mem()); + if (!der_bio) + { + LL_WARNS("SECAPI") << "Could not allocate an openssl memory BIO." << LL_ENDL; + return std::vector<U8>(); + } + i2d_X509_bio(der_bio, mCert); + int length = BIO_get_mem_data(der_bio, &der_bio_data); + std::vector<U8> result(length); + // vectors are guranteed to be a contiguous chunk of memory. + memcpy(&result[0], der_bio_data, length); + BIO_free(der_bio); + return result; +} + + +void LLBasicCertificate::getLLSD(LLSD &llsd) +{ + if (mLLSDInfo.isUndefined()) + { + _initLLSD(); + } + llsd = mLLSDInfo; +} + +// Initialize the LLSD info for the certificate +LLSD& LLBasicCertificate::_initLLSD() +{ + + // call the various helpers to build the LLSD + mLLSDInfo[CERT_SUBJECT_NAME] = cert_name_from_X509_NAME(X509_get_subject_name(mCert)); + mLLSDInfo[CERT_ISSUER_NAME] = cert_name_from_X509_NAME(X509_get_issuer_name(mCert)); + mLLSDInfo[CERT_SUBJECT_NAME_STRING] = cert_string_name_from_X509_NAME(X509_get_subject_name(mCert)); + mLLSDInfo[CERT_ISSUER_NAME_STRING] = cert_string_name_from_X509_NAME(X509_get_issuer_name(mCert)); + ASN1_INTEGER *sn = X509_get_serialNumber(mCert); + if (sn != NULL) + { + mLLSDInfo[CERT_SERIAL_NUMBER] = cert_string_from_asn1_integer(sn); + } + + mLLSDInfo[CERT_VALID_TO] = cert_date_from_asn1_time(X509_get_notAfter(mCert)); + mLLSDInfo[CERT_VALID_FROM] = cert_date_from_asn1_time(X509_get_notBefore(mCert)); + mLLSDInfo[CERT_SHA1_DIGEST] = cert_get_digest("sha1", mCert); + mLLSDInfo[CERT_MD5_DIGEST] = cert_get_digest("md5", mCert); + // add the known extensions + mLLSDInfo[CERT_BASIC_CONSTRAINTS] = _basic_constraints_ext(mCert); + mLLSDInfo[CERT_KEY_USAGE] = _key_usage_ext(mCert); + mLLSDInfo[CERT_EXTENDED_KEY_USAGE] = _ext_key_usage_ext(mCert); + mLLSDInfo[CERT_SUBJECT_KEY_IDENTFIER] = _subject_key_identifier_ext(mCert); + mLLSDInfo[CERT_AUTHORITY_KEY_IDENTIFIER] = _authority_key_identifier_ext(mCert); + return mLLSDInfo; +} + +// Retrieve the basic constraints info +LLSD _basic_constraints_ext(X509* cert) +{ + LLSD result; + BASIC_CONSTRAINTS *bs = (BASIC_CONSTRAINTS *)X509_get_ext_d2i(cert, NID_basic_constraints, NULL, NULL); + if(bs) + { + result = LLSD::emptyMap(); + // Determines whether the cert can be used as a CA + result[CERT_BASIC_CONSTRAINTS_CA] = (bool)bs->ca; + + if(bs->pathlen) + { + // the pathlen determines how deep a certificate chain can be from + // this CA + if((bs->pathlen->type == V_ASN1_NEG_INTEGER) + || !bs->ca) + { + result[CERT_BASIC_CONSTRAINTS_PATHLEN] = 0; + } + else + { + result[CERT_BASIC_CONSTRAINTS_PATHLEN] = (int)ASN1_INTEGER_get(bs->pathlen); + } + } + + } + return result; +} + +// retrieve the key usage, which specifies how the cert can be used. +// +LLSD _key_usage_ext(X509* cert) +{ + LLSD result; + ASN1_STRING *usage_str = (ASN1_STRING *)X509_get_ext_d2i(cert, NID_key_usage, NULL, NULL); + if(usage_str) + { + result = LLSD::emptyArray(); + long usage = 0; + if(usage_str->length > 0) + { + usage = usage_str->data[0]; + if(usage_str->length > 1) + { + usage |= usage_str->data[1] << 8; + } + } + ASN1_STRING_free(usage_str); + if(usage) + { + if(usage & KU_DIGITAL_SIGNATURE) result.append(LLSD((std::string)CERT_KU_DIGITAL_SIGNATURE)); + if(usage & KU_NON_REPUDIATION) result.append(LLSD((std::string)CERT_KU_NON_REPUDIATION)); + if(usage & KU_KEY_ENCIPHERMENT) result.append(LLSD((std::string)CERT_KU_KEY_ENCIPHERMENT)); + if(usage & KU_DATA_ENCIPHERMENT) result.append(LLSD((std::string)CERT_KU_DATA_ENCIPHERMENT)); + if(usage & KU_KEY_AGREEMENT) result.append(LLSD((std::string)CERT_KU_KEY_AGREEMENT)); + if(usage & KU_KEY_CERT_SIGN) result.append(LLSD((std::string)CERT_KU_CERT_SIGN)); + if(usage & KU_CRL_SIGN) result.append(LLSD((std::string)CERT_KU_CRL_SIGN)); + if(usage & KU_ENCIPHER_ONLY) result.append(LLSD((std::string)CERT_KU_ENCIPHER_ONLY)); + if(usage & KU_DECIPHER_ONLY) result.append(LLSD((std::string)CERT_KU_DECIPHER_ONLY)); + } + } + return result; +} + +// retrieve the extended key usage for the cert +LLSD _ext_key_usage_ext(X509* cert) +{ + LLSD result; + EXTENDED_KEY_USAGE *eku = (EXTENDED_KEY_USAGE *)X509_get_ext_d2i(cert, NID_ext_key_usage, NULL, NULL); + if(eku) + { + result = LLSD::emptyArray(); + while(sk_ASN1_OBJECT_num(eku)) + { + ASN1_OBJECT *usage = sk_ASN1_OBJECT_pop(eku); + if(usage) + { + int nid = OBJ_obj2nid(usage); + if (nid) + { + std::string sn = OBJ_nid2sn(nid); + result.append(sn); + } + ASN1_OBJECT_free(usage); + } + } + } + return result; +} + +// retrieve the subject key identifier of the cert +LLSD _subject_key_identifier_ext(X509 *cert) +{ + LLSD result; + ASN1_OCTET_STRING *skeyid = (ASN1_OCTET_STRING *)X509_get_ext_d2i(cert, NID_subject_key_identifier, NULL, NULL); + if(skeyid) + { + result = cert_string_from_octet_string(skeyid); + } + return result; +} + +// retrieve the authority key identifier of the cert +LLSD _authority_key_identifier_ext(X509* cert) +{ + LLSD result; + AUTHORITY_KEYID *akeyid = (AUTHORITY_KEYID *)X509_get_ext_d2i(cert, NID_authority_key_identifier, NULL, NULL); + if(akeyid) + { + result = LLSD::emptyMap(); + if(akeyid->keyid) + { + result[CERT_AUTHORITY_KEY_IDENTIFIER_ID] = cert_string_from_octet_string(akeyid->keyid); + } + if(akeyid->serial) + { + result[CERT_AUTHORITY_KEY_IDENTIFIER_SERIAL] = cert_string_from_asn1_integer(akeyid->serial); + } + } + + // we ignore the issuer name in the authority key identifier, we check the issue name via + // the the issuer name entry in the cert. + + + return result; +} + +// retrieve an openssl x509 object, +// which must be freed by X509_free +X509* LLBasicCertificate::getOpenSSLX509() const +{ + return X509_dup(mCert); +} + +// generate a single string containing the subject or issuer +// name of the cert. +std::string cert_string_name_from_X509_NAME(X509_NAME* name) +{ + char * name_bio_chars = NULL; + // get a memory bio + BIO *name_bio = BIO_new(BIO_s_mem()); + // stream the name into the bio. The name will be in the 'short name' format + X509_NAME_print_ex(name_bio, name, 0, XN_FLAG_RFC2253); + int length = BIO_get_mem_data(name_bio, &name_bio_chars); + std::string result = std::string(name_bio_chars, length); + BIO_free(name_bio); + return result; +} + +// generate an LLSD from a certificate name (issuer or subject name). +// the name will be strings indexed by the 'long form' +LLSD cert_name_from_X509_NAME(X509_NAME* name) +{ + LLSD result = LLSD::emptyMap(); + int name_entries = X509_NAME_entry_count(name); + for (int entry_index=0; entry_index < name_entries; entry_index++) + { + char buffer[32]; + X509_NAME_ENTRY *entry = X509_NAME_get_entry(name, entry_index); + + std::string name_value = std::string((const char*)M_ASN1_STRING_data(X509_NAME_ENTRY_get_data(entry)), + M_ASN1_STRING_length(X509_NAME_ENTRY_get_data(entry))); + + ASN1_OBJECT* name_obj = X509_NAME_ENTRY_get_object(entry); + OBJ_obj2txt(buffer, sizeof(buffer), name_obj, 0); + std::string obj_buffer_str = std::string(buffer); + result[obj_buffer_str] = name_value; + } + + return result; +} + +// Generate a string from an ASN1 integer. ASN1 Integers are +// bignums, so they can be 'infinitely' long, therefore we +// cannot simply use a conversion to U64 or something. +// We retrieve as a readable string for UI + +std::string cert_string_from_asn1_integer(ASN1_INTEGER* value) +{ + std::string result; + BIGNUM *bn = ASN1_INTEGER_to_BN(value, NULL); + if(bn) + { + char * ascii_bn = BN_bn2hex(bn); + + if(ascii_bn) + { + result = ascii_bn; + OPENSSL_free(ascii_bn); + } + BN_free(bn); + } + return result; +} + +// Generate a string from an OCTET string. +// we retrieve as a + +std::string cert_string_from_octet_string(ASN1_OCTET_STRING* value) +{ + + std::stringstream result; + result << std::hex << std::setprecision(2); + for (int i=0; i < value->length; i++) + { + if (i != 0) + { + result << ":"; + } + result << std::setfill('0') << std::setw(2) << (int)value->data[i]; + } + return result.str(); +} + +// Generate a string from an ASN1 integer. ASN1 Integers are +// bignums, so they can be 'infinitely' long, therefore we +// cannot simply use a conversion to U64 or something. +// We retrieve as a readable string for UI + +std::string cert_string_from_asn1_string(ASN1_STRING* value) +{ + char * string_bio_chars = NULL; + std::string result; + // get a memory bio + BIO *string_bio = BIO_new(BIO_s_mem()); + if(!string_bio) + { + // stream the name into the bio. The name will be in the 'short name' format + ASN1_STRING_print_ex(string_bio, value, ASN1_STRFLGS_RFC2253); + int length = BIO_get_mem_data(string_bio, &string_bio_chars); + result = std::string(string_bio_chars, length); + BIO_free(string_bio); + } + else + { + LL_WARNS("SECAPI") << "Could not allocate an openssl memory BIO." << LL_ENDL; + } + + return result; +} + +// retrieve a date structure from an ASN1 time, for +// validity checking. +LLDate cert_date_from_asn1_time(ASN1_TIME* asn1_time) +{ + + struct tm timestruct = {0}; + int i = asn1_time->length; + + if (i < 10) + { + return LLDate(); + } + // convert the date from the ASN1 time (which is a string in ZULU time), to + // a timeval. + timestruct.tm_year = (asn1_time->data[0]-'0') * 10 + (asn1_time->data[1]-'0'); + + /* Deal with Year 2000 */ + if (timestruct.tm_year < 70) + timestruct.tm_year += 100; + + timestruct.tm_mon = (asn1_time->data[2]-'0') * 10 + (asn1_time->data[3]-'0') - 1; + timestruct.tm_mday = (asn1_time->data[4]-'0') * 10 + (asn1_time->data[5]-'0'); + timestruct.tm_hour = (asn1_time->data[6]-'0') * 10 + (asn1_time->data[7]-'0'); + timestruct.tm_min = (asn1_time->data[8]-'0') * 10 + (asn1_time->data[9]-'0'); + timestruct.tm_sec = (asn1_time->data[10]-'0') * 10 + (asn1_time->data[11]-'0'); + +#if LL_WINDOWS + return LLDate((F64)_mkgmtime(×truct)); +#else // LL_WINDOWS + return LLDate((F64)timegm(×truct)); +#endif // LL_WINDOWS +} + + +// Generate a string containing a digest. The digest time is 'ssh1' or +// 'md5', and the resulting string is of the form "aa:12:5c:' and so on +std::string cert_get_digest(const std::string& digest_type, X509 *cert) +{ + unsigned char digest_data[BUFFER_READ_SIZE]; + unsigned int len = sizeof(digest_data); + std::stringstream result; + const EVP_MD* digest = NULL; + // we could use EVP_get_digestbyname, but that requires initializer code which + // would require us to complicate things by plumbing it into the system. + if (digest_type == "md5") + { + digest = EVP_md5(); + } + else if (digest_type == "sha1") + { + digest = EVP_sha1(); + } + else + { + return std::string(); + } + + X509_digest(cert, digest, digest_data, &len); + result << std::hex << std::setprecision(2); + for (unsigned int i=0; i < len; i++) + { + if (i != 0) + { + result << ":"; + } + result << std::setfill('0') << std::setw(2) << (int)digest_data[i]; + } + return result.str(); +} + + +// class LLBasicCertificateVector +// This class represents a list of certificates, implemented by a vector of certificate pointers. +// it contains implementations of the virtual functions for iterators, search, add, remove, etc. +// + +// Find a certificate in the list. +// It will find a cert that has minimally the params listed, with the values being the same +LLBasicCertificateVector::iterator LLBasicCertificateVector::find(const LLSD& params) +{ + BOOL found = FALSE; + // loop through the entire vector comparing the values in the certs + // against those passed in via the params. + // params should be a map. Only the items specified in the map will be + // checked, but they must match exactly, even if they're maps or arrays. + + for(iterator cert = begin(); + cert != end(); + cert++) + { + + found= TRUE; + LLSD cert_info; + (*cert)->getLLSD(cert_info); + for (LLSD::map_const_iterator param = params.beginMap(); + param != params.endMap(); + param++) + { + + if (!cert_info.has((std::string)param->first) || + (!valueCompareLLSD(cert_info[(std::string)param->first], param->second))) + { + found = FALSE; + break; + } + } + if (found) + { + return (cert); + } + } + return end(); +} + +// Insert a certificate into the store. If the certificate already +// exists in the store, nothing is done. +void LLBasicCertificateVector::insert(iterator _iter, + LLPointer<LLCertificate> cert) +{ + LLSD cert_info; + cert->getLLSD(cert_info); + if (cert_info.isMap() && cert_info.has(CERT_SHA1_DIGEST)) + { + LLSD existing_cert_info = LLSD::emptyMap(); + existing_cert_info[CERT_MD5_DIGEST] = cert_info[CERT_MD5_DIGEST]; + if(find(existing_cert_info) == end()) + { + BasicIteratorImpl *basic_iter = dynamic_cast<BasicIteratorImpl*>(_iter.mImpl.get()); + llassert(basic_iter); + if (basic_iter) + { + mCerts.insert(basic_iter->mIter, cert); + } + } + } +} + +// remove a certificate from the store +LLPointer<LLCertificate> LLBasicCertificateVector::erase(iterator _iter) +{ + + if (_iter != end()) + { + BasicIteratorImpl *basic_iter = dynamic_cast<BasicIteratorImpl*>(_iter.mImpl.get()); + LLPointer<LLCertificate> result = (*_iter); + mCerts.erase(basic_iter->mIter); + return result; + } + return NULL; +} + + +// +// LLBasicCertificateStore +// This class represents a store of CA certificates. The basic implementation +// uses a pem file such as the legacy CA.pem stored in the existing +// SL implementation. +LLBasicCertificateStore::LLBasicCertificateStore(const std::string& filename) +{ + mFilename = filename; + load_from_file(filename); +} + +void LLBasicCertificateStore::load_from_file(const std::string& filename) +{ + // scan the PEM file extracting each certificate + if (!LLFile::isfile(filename)) + { + return; + } + + BIO* file_bio = BIO_new(BIO_s_file()); + if(file_bio) + { + if (BIO_read_filename(file_bio, filename.c_str()) > 0) + { + X509 *cert_x509 = NULL; + while((PEM_read_bio_X509(file_bio, &cert_x509, 0, NULL)) && + (cert_x509 != NULL)) + { + try + { + add(new LLBasicCertificate(cert_x509)); + } + catch (...) + { + LL_WARNS("SECAPI") << "Failure creating certificate from the certificate store file." << LL_ENDL; + } + X509_free(cert_x509); + cert_x509 = NULL; + } + BIO_free(file_bio); + } + } + else + { + LL_WARNS("SECAPI") << "Could not allocate a file BIO" << LL_ENDL; + } +} + + +LLBasicCertificateStore::~LLBasicCertificateStore() +{ +} + + +// persist the store +void LLBasicCertificateStore::save() +{ + llofstream file_store(mFilename, llofstream::binary); + if(!file_store.fail()) + { + for(iterator cert = begin(); + cert != end(); + cert++) + { + std::string pem = (*cert)->getPem(); + if(!pem.empty()) + { + file_store << (*cert)->getPem() << std::endl; + } + } + file_store.close(); + } + else + { + LL_WARNS("SECAPI") << "Could not open certificate store " << mFilename << "for save" << LL_ENDL; + } +} + +// return the store id +std::string LLBasicCertificateStore::storeId() const +{ + // this is the basic handler which uses the CA.pem store, + // so we ignore this. + return std::string(""); +} + + +// +// LLBasicCertificateChain +// This class represents a chain of certs, each cert being signed by the next cert +// in the chain. Certs must be properly signed by the parent +LLBasicCertificateChain::LLBasicCertificateChain(const X509_STORE_CTX* store) +{ + + // we're passed in a context, which contains a cert, and a blob of untrusted + // certificates which compose the chain. + if((store == NULL) || (store->cert == NULL)) + { + LL_WARNS("SECAPI") << "An invalid store context was passed in when trying to create a certificate chain" << LL_ENDL; + return; + } + // grab the child cert + LLPointer<LLCertificate> current = new LLBasicCertificate(store->cert); + + add(current); + if(store->untrusted != NULL) + { + // if there are other certs in the chain, we build up a vector + // of untrusted certs so we can search for the parents of each + // consecutive cert. + LLBasicCertificateVector untrusted_certs; + for(int i = 0; i < sk_X509_num(store->untrusted); i++) + { + LLPointer<LLCertificate> cert = new LLBasicCertificate(sk_X509_value(store->untrusted, i)); + untrusted_certs.add(cert); + + } + while(untrusted_certs.size() > 0) + { + LLSD find_data = LLSD::emptyMap(); + LLSD cert_data; + current->getLLSD(cert_data); + // we simply build the chain via subject/issuer name as the + // client should not have passed in multiple CA's with the same + // subject name. If they did, it'll come out in the wash during + // validation. + find_data[CERT_SUBJECT_NAME_STRING] = cert_data[CERT_ISSUER_NAME_STRING]; + LLBasicCertificateVector::iterator issuer = untrusted_certs.find(find_data); + if (issuer != untrusted_certs.end()) + { + current = untrusted_certs.erase(issuer); + add(current); + } + else + { + break; + } + } + } +} + + +// subdomain wildcard specifiers can be divided into 3 parts +// the part before the first *, the part after the first * but before +// the second *, and the part after the second *. +// It then iterates over the second for each place in the string +// that it matches. ie if the subdomain was testfoofoobar, and +// the wildcard was test*foo*bar, it would match test, then +// recursively match foofoobar and foobar + +bool _cert_subdomain_wildcard_match(const std::string& subdomain, + const std::string& wildcard) +{ + // split wildcard into the portion before the *, and the portion after + + int wildcard_pos = wildcard.find_first_of('*'); + // check the case where there is no wildcard. + if(wildcard_pos == wildcard.npos) + { + return (subdomain == wildcard); + } + + // we need to match the first part of the subdomain string up to the wildcard + // position + if(subdomain.substr(0, wildcard_pos) != wildcard.substr(0, wildcard_pos)) + { + // the first portions of the strings didn't match + return FALSE; + } + + // as the portion of the wildcard string before the * matched, we need to check the + // portion afterwards. Grab that portion. + std::string new_wildcard_string = wildcard.substr( wildcard_pos+1, wildcard.npos); + if(new_wildcard_string.empty()) + { + // we had nothing after the *, so it's an automatic match + return TRUE; + } + + // grab the portion of the remaining wildcard string before the next '*'. We need to find this + // within the remaining subdomain string. and then recursively check. + std::string new_wildcard_match_string = new_wildcard_string.substr(0, new_wildcard_string.find_first_of('*')); + + // grab the portion of the subdomain after the part that matched the initial wildcard portion + std::string new_subdomain = subdomain.substr(wildcard_pos, subdomain.npos); + + // iterate through the current subdomain, finding instances of the match string. + int sub_pos = new_subdomain.find_first_of(new_wildcard_match_string); + while(sub_pos != std::string::npos) + { + new_subdomain = new_subdomain.substr(sub_pos, std::string::npos); + if(_cert_subdomain_wildcard_match(new_subdomain, new_wildcard_string)) + { + return TRUE; + } + sub_pos = new_subdomain.find_first_of(new_wildcard_match_string, 1); + + + } + // didn't find any instances of the match string that worked in the subdomain, so fail. + return FALSE; +} + + +// RFC2459 does not address wildcards as part of it's name matching +// specification, and there is no RFC specifying wildcard matching, +// RFC2818 does a few statements about wildcard matching, but is very +// general. Generally, wildcard matching is per implementation, although +// it's pretty similar. +// in our case, we use the '*' wildcard character only, within each +// subdomain. The hostname and the CN specification should have the +// same number of subdomains. +// We then iterate that algorithm over each subdomain. +bool _cert_hostname_wildcard_match(const std::string& hostname, const std::string& common_name) +{ + std::string new_hostname = hostname; + std::string new_cn = common_name; + + // find the last '.' in the hostname and the match name. + int subdomain_pos = new_hostname.find_last_of('.'); + int subcn_pos = new_cn.find_last_of('.'); + + // if the last char is a '.', strip it + if(subdomain_pos == (new_hostname.length()-1)) + { + new_hostname = new_hostname.substr(0, subdomain_pos); + subdomain_pos = new_hostname.find_last_of('.'); + } + if(subcn_pos == (new_cn.length()-1)) + { + new_cn = new_cn.substr(0, subcn_pos); + subcn_pos = new_cn.find_last_of('.'); + } + + // Check to see if there are any further '.' in the string. + while((subcn_pos != std::string::npos) && (subdomain_pos != std::string::npos)) + { + // snip out last subdomain in both the match string and the hostname + // The last bit for 'my.current.host.com' would be 'com' + std::string cn_part = new_cn.substr(subcn_pos+1, std::string::npos); + std::string hostname_part = new_hostname.substr(subdomain_pos+1, std::string::npos); + + if(!_cert_subdomain_wildcard_match(new_hostname.substr(subdomain_pos+1, std::string::npos), + cn_part)) + { + return FALSE; + } + new_hostname = new_hostname.substr(0, subdomain_pos); + new_cn = new_cn.substr(0, subcn_pos); + subdomain_pos = new_hostname.find_last_of('.'); + subcn_pos = new_cn.find_last_of('.'); + } + // check to see if the most significant portion of the common name is '*'. If so, we can + // simply return success as child domains are also matched. + if(new_cn == "*") + { + // if it's just a '*' we support all child domains as well, so '*. + return TRUE; + } + + return _cert_subdomain_wildcard_match(new_hostname, new_cn); + +} + +// validate that the LLSD array in llsd_set contains the llsd_value +bool _LLSDArrayIncludesValue(const LLSD& llsd_set, LLSD llsd_value) +{ + for(LLSD::array_const_iterator set_value = llsd_set.beginArray(); + set_value != llsd_set.endArray(); + set_value++) + { + if(valueCompareLLSD((*set_value), llsd_value)) + { + return TRUE; + } + } + return FALSE; +} + +void _validateCert(int validation_policy, + LLPointer<LLCertificate> cert, + const LLSD& validation_params, + int depth) +{ + + LLSD current_cert_info; + cert->getLLSD(current_cert_info); + // check basic properties exist in the cert + if(!current_cert_info.has(CERT_SUBJECT_NAME) || !current_cert_info.has(CERT_SUBJECT_NAME_STRING)) + { + throw LLCertException(cert, "Cert doesn't have a Subject Name"); + } + + if(!current_cert_info.has(CERT_ISSUER_NAME_STRING)) + { + throw LLCertException(cert, "Cert doesn't have an Issuer Name"); + } + + // check basic properties exist in the cert + if(!current_cert_info.has(CERT_VALID_FROM) || !current_cert_info.has(CERT_VALID_TO)) + { + throw LLCertException(cert, "Cert doesn't have an expiration period"); + } + if (!current_cert_info.has(CERT_SHA1_DIGEST)) + { + throw LLCertException(cert, "No SHA1 digest"); + } + + if (validation_policy & VALIDATION_POLICY_TIME) + { + + LLDate validation_date(time(NULL)); + if(validation_params.has(CERT_VALIDATION_DATE)) + { + validation_date = validation_params[CERT_VALIDATION_DATE]; + } + + if((validation_date < current_cert_info[CERT_VALID_FROM].asDate()) || + (validation_date > current_cert_info[CERT_VALID_TO].asDate())) + { + throw LLCertValidationExpirationException(cert, validation_date); + } + } + if (validation_policy & VALIDATION_POLICY_SSL_KU) + { + if (current_cert_info.has(CERT_KEY_USAGE) && current_cert_info[CERT_KEY_USAGE].isArray() && + (!(_LLSDArrayIncludesValue(current_cert_info[CERT_KEY_USAGE], + LLSD((std::string)CERT_KU_DIGITAL_SIGNATURE))) || + !(_LLSDArrayIncludesValue(current_cert_info[CERT_KEY_USAGE], + LLSD((std::string)CERT_KU_KEY_ENCIPHERMENT))))) + { + throw LLCertKeyUsageValidationException(cert); + } + // only validate EKU if the cert has it + if(current_cert_info.has(CERT_EXTENDED_KEY_USAGE) && current_cert_info[CERT_EXTENDED_KEY_USAGE].isArray() && + (!_LLSDArrayIncludesValue(current_cert_info[CERT_EXTENDED_KEY_USAGE], + LLSD((std::string)CERT_EKU_SERVER_AUTH)))) + { + throw LLCertKeyUsageValidationException(cert); + } + } + if (validation_policy & VALIDATION_POLICY_CA_KU) + { + if (current_cert_info.has(CERT_KEY_USAGE) && current_cert_info[CERT_KEY_USAGE].isArray() && + (!_LLSDArrayIncludesValue(current_cert_info[CERT_KEY_USAGE], + (std::string)CERT_KU_CERT_SIGN))) + { + throw LLCertKeyUsageValidationException(cert); + } + } + + // validate basic constraints + if ((validation_policy & VALIDATION_POLICY_CA_BASIC_CONSTRAINTS) && + current_cert_info.has(CERT_BASIC_CONSTRAINTS) && + current_cert_info[CERT_BASIC_CONSTRAINTS].isMap()) + { + if(!current_cert_info[CERT_BASIC_CONSTRAINTS].has(CERT_BASIC_CONSTRAINTS_CA) || + !current_cert_info[CERT_BASIC_CONSTRAINTS][CERT_BASIC_CONSTRAINTS_CA]) + { + throw LLCertBasicConstraintsValidationException(cert); + } + if (current_cert_info[CERT_BASIC_CONSTRAINTS].has(CERT_BASIC_CONSTRAINTS_PATHLEN) && + ((current_cert_info[CERT_BASIC_CONSTRAINTS][CERT_BASIC_CONSTRAINTS_PATHLEN].asInteger() != 0) && + (depth > current_cert_info[CERT_BASIC_CONSTRAINTS][CERT_BASIC_CONSTRAINTS_PATHLEN].asInteger()))) + { + throw LLCertBasicConstraintsValidationException(cert); + } + } +} + +bool _verify_signature(LLPointer<LLCertificate> parent, + LLPointer<LLCertificate> child) +{ + bool verify_result = FALSE; + LLSD cert1, cert2; + parent->getLLSD(cert1); + child->getLLSD(cert2); + X509 *signing_cert = parent->getOpenSSLX509(); + X509 *child_cert = child->getOpenSSLX509(); + if((signing_cert != NULL) && (child_cert != NULL)) + { + EVP_PKEY *pkey = X509_get_pubkey(signing_cert); + + + if(pkey) + { + int verify_code = X509_verify(child_cert, pkey); + verify_result = ( verify_code > 0); + EVP_PKEY_free(pkey); + } + else + { + LL_WARNS("SECAPI") << "Could not validate the cert chain signature, as the public key of the signing cert could not be retrieved" << LL_ENDL; + } + + } + else + { + LL_WARNS("SECAPI") << "Signature verification failed as there are no certs in the chain" << LL_ENDL; + } + if(child_cert) + { + X509_free(child_cert); + } + if(signing_cert) + { + X509_free(signing_cert); + } + return verify_result; +} + + +// validate the certificate chain against a store. +// There are many aspects of cert validatioin policy involved in +// trust validation. The policies in this validation algorithm include +// * Hostname matching for SSL certs +// * Expiration time matching +// * Signature validation +// * Chain trust (is the cert chain trusted against the store) +// * Basic constraints +// * key usage and extended key usage +// TODO: We should add 'authority key identifier' for chaining. +// This algorithm doesn't simply validate the chain by itself +// and verify the last cert is in the certificate store, or points +// to a cert in the store. It validates whether any cert in the chain +// is trusted in the store, even if it's not the last one. +void LLBasicCertificateStore::validate(int validation_policy, + LLPointer<LLCertificateChain> cert_chain, + const LLSD& validation_params) +{ + + if(cert_chain->size() < 1) + { + throw LLCertException(NULL, "No certs in chain"); + } + iterator current_cert = cert_chain->begin(); + LLSD current_cert_info; + LLSD validation_date; + if (validation_params.has(CERT_VALIDATION_DATE)) + { + validation_date = validation_params[CERT_VALIDATION_DATE]; + } + + if (validation_policy & VALIDATION_POLICY_HOSTNAME) + { + (*current_cert)->getLLSD(current_cert_info); + if(!validation_params.has(CERT_HOSTNAME)) + { + throw LLCertException((*current_cert), "No hostname passed in for validation"); + } + if(!current_cert_info.has(CERT_SUBJECT_NAME) || !current_cert_info[CERT_SUBJECT_NAME].has(CERT_NAME_CN)) + { + throw LLInvalidCertificate((*current_cert)); + } + + LL_DEBUGS("SECAPI") << "Validating the hostname " << validation_params[CERT_HOSTNAME].asString() << + "against the cert CN " << current_cert_info[CERT_SUBJECT_NAME][CERT_NAME_CN].asString() << LL_ENDL; + if(!_cert_hostname_wildcard_match(validation_params[CERT_HOSTNAME].asString(), + current_cert_info[CERT_SUBJECT_NAME][CERT_NAME_CN].asString())) + { + throw LLCertValidationHostnameException(validation_params[CERT_HOSTNAME].asString(), + (*current_cert)); + } + } + + // check the cache of already validated certs + X509* cert_x509 = (*current_cert)->getOpenSSLX509(); + if(!cert_x509) + { + throw LLInvalidCertificate((*current_cert)); + } + std::string sha1_hash((const char *)cert_x509->sha1_hash, SHA_DIGEST_LENGTH); + t_cert_cache::iterator cache_entry = mTrustedCertCache.find(sha1_hash); + if(cache_entry != mTrustedCertCache.end()) + { + LL_DEBUGS("SECAPI") << "Found cert in cache" << LL_ENDL; + // this cert is in the cache, so validate the time. + if (validation_policy & VALIDATION_POLICY_TIME) + { + LLDate validation_date(time(NULL)); + if(validation_params.has(CERT_VALIDATION_DATE)) + { + validation_date = validation_params[CERT_VALIDATION_DATE]; + } + + if((validation_date < cache_entry->second.first) || + (validation_date > cache_entry->second.second)) + { + throw LLCertValidationExpirationException((*current_cert), validation_date); + } + } + // successfully found in cache + return; + } + if(current_cert_info.isUndefined()) + { + (*current_cert)->getLLSD(current_cert_info); + } + LLDate from_time = current_cert_info[CERT_VALID_FROM].asDate(); + LLDate to_time = current_cert_info[CERT_VALID_TO].asDate(); + int depth = 0; + LLPointer<LLCertificate> previous_cert; + // loop through the cert chain, validating the current cert against the next one. + while(current_cert != cert_chain->end()) + { + + int local_validation_policy = validation_policy; + if(current_cert == cert_chain->begin()) + { + // for the child cert, we don't validate CA stuff + local_validation_policy &= ~(VALIDATION_POLICY_CA_KU | + VALIDATION_POLICY_CA_BASIC_CONSTRAINTS); + } + else + { + // for non-child certs, we don't validate SSL Key usage + local_validation_policy &= ~VALIDATION_POLICY_SSL_KU; + if(!_verify_signature((*current_cert), + previous_cert)) + { + throw LLCertValidationInvalidSignatureException(previous_cert); + } + } + _validateCert(local_validation_policy, + (*current_cert), + validation_params, + depth); + + // look for a CA in the CA store that may belong to this chain. + LLSD cert_search_params = LLSD::emptyMap(); + // is the cert itself in the store? + cert_search_params[CERT_SHA1_DIGEST] = current_cert_info[CERT_SHA1_DIGEST]; + LLCertificateStore::iterator found_store_cert = find(cert_search_params); + if(found_store_cert != end()) + { + mTrustedCertCache[sha1_hash] = std::pair<LLDate, LLDate>(from_time, to_time); + return; + } + + // is the parent in the cert store? + + cert_search_params = LLSD::emptyMap(); + cert_search_params[CERT_SUBJECT_NAME_STRING] = current_cert_info[CERT_ISSUER_NAME_STRING]; + if (current_cert_info.has(CERT_AUTHORITY_KEY_IDENTIFIER)) + { + LLSD cert_aki = current_cert_info[CERT_AUTHORITY_KEY_IDENTIFIER]; + if(cert_aki.has(CERT_AUTHORITY_KEY_IDENTIFIER_ID)) + { + cert_search_params[CERT_SUBJECT_KEY_IDENTFIER] = cert_aki[CERT_AUTHORITY_KEY_IDENTIFIER_ID]; + } + if(cert_aki.has(CERT_AUTHORITY_KEY_IDENTIFIER_SERIAL)) + { + cert_search_params[CERT_SERIAL_NUMBER] = cert_aki[CERT_AUTHORITY_KEY_IDENTIFIER_SERIAL]; + } + } + found_store_cert = find(cert_search_params); + + if(found_store_cert != end()) + { + // validate the store cert against the depth + _validateCert(validation_policy & VALIDATION_POLICY_CA_BASIC_CONSTRAINTS, + (*found_store_cert), + LLSD(), + depth); + + // verify the signature of the CA + if(!_verify_signature((*found_store_cert), + (*current_cert))) + { + throw LLCertValidationInvalidSignatureException(*current_cert); + } + // successfully validated. + mTrustedCertCache[sha1_hash] = std::pair<LLDate, LLDate>(from_time, to_time); + return; + } + previous_cert = (*current_cert); + current_cert++; + depth++; + if(current_cert != cert_chain->end()) + { + (*current_cert)->getLLSD(current_cert_info); + } + } + if (validation_policy & VALIDATION_POLICY_TRUSTED) + { + // we reached the end without finding a trusted cert. + throw LLCertValidationTrustException((*cert_chain)[cert_chain->size()-1]); + + } + mTrustedCertCache[sha1_hash] = std::pair<LLDate, LLDate>(from_time, to_time); +} + + +// LLSecAPIBasicHandler Class +// Interface handler class for the various security storage handlers. + +// We read the file on construction, and write it on destruction. This +// means multiple processes cannot modify the datastore. +LLSecAPIBasicHandler::LLSecAPIBasicHandler(const std::string& protected_data_file, + const std::string& legacy_password_path) +{ + mProtectedDataFilename = protected_data_file; + mProtectedDataMap = LLSD::emptyMap(); + mLegacyPasswordPath = legacy_password_path; + +} + +LLSecAPIBasicHandler::LLSecAPIBasicHandler() +{ +} + + +void LLSecAPIBasicHandler::init() +{ + mProtectedDataMap = LLSD::emptyMap(); + if (mProtectedDataFilename.length() == 0) + { + mProtectedDataFilename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, + "bin_conf.dat"); + mLegacyPasswordPath = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "password.dat"); + + mProtectedDataFilename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, + "bin_conf.dat"); + std::string store_file = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, + "CA.pem"); + + + LL_DEBUGS("SECAPI") << "Loading certificate store from " << store_file << LL_ENDL; + mStore = new LLBasicCertificateStore(store_file); + + // grab the application CA.pem file that contains the well-known certs shipped + // with the product + std::string ca_file_path = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "CA.pem"); + llinfos << "app path " << ca_file_path << llendl; + LLBasicCertificateStore app_ca_store = LLBasicCertificateStore(ca_file_path); + + // push the applicate CA files into the store, therefore adding any new CA certs that + // updated + for(LLCertificateVector::iterator i = app_ca_store.begin(); + i != app_ca_store.end(); + i++) + { + mStore->add(*i); + } + + } + _readProtectedData(); // initialize mProtectedDataMap + // may throw LLProtectedDataException if saved datamap is not decryptable +} +LLSecAPIBasicHandler::~LLSecAPIBasicHandler() +{ + _writeProtectedData(); +} + +void LLSecAPIBasicHandler::_readProtectedData() +{ + // attempt to load the file into our map + LLPointer<LLSDParser> parser = new LLSDXMLParser(); + llifstream protected_data_stream(mProtectedDataFilename.c_str(), + llifstream::binary); + + if (!protected_data_stream.fail()) { + int offset; + U8 salt[STORE_SALT_SIZE]; + U8 buffer[BUFFER_READ_SIZE]; + U8 decrypted_buffer[BUFFER_READ_SIZE]; + int decrypted_length; + unsigned char unique_id[MAC_ADDRESS_BYTES]; + LLMachineID::getUniqueID(unique_id, sizeof(unique_id)); + LLXORCipher cipher(unique_id, sizeof(unique_id)); + + // read in the salt and key + protected_data_stream.read((char *)salt, STORE_SALT_SIZE); + offset = 0; + if (protected_data_stream.gcount() < STORE_SALT_SIZE) + { + throw LLProtectedDataException("Config file too short."); + } + + cipher.decrypt(salt, STORE_SALT_SIZE); + + // totally lame. As we're not using the OS level protected data, we need to + // at least obfuscate the data. We do this by using a salt stored at the head of the file + // to encrypt the data, therefore obfuscating it from someone using simple existing tools. + // We do include the MAC address as part of the obfuscation, which would require an + // attacker to get the MAC address as well as the protected store, which improves things + // somewhat. It would be better to use the password, but as this store + // will be used to store the SL password when the user decides to have SL remember it, + // so we can't use that. OS-dependent store implementations will use the OS password/storage + // mechanisms and are considered to be more secure. + // We've a strong intent to move to OS dependent protected data stores. + + + // read in the rest of the file. + EVP_CIPHER_CTX ctx; + EVP_CIPHER_CTX_init(&ctx); + EVP_DecryptInit(&ctx, EVP_rc4(), salt, NULL); + // allocate memory: + std::string decrypted_data; + + while(protected_data_stream.good()) { + // read data as a block: + protected_data_stream.read((char *)buffer, BUFFER_READ_SIZE); + + EVP_DecryptUpdate(&ctx, decrypted_buffer, &decrypted_length, + buffer, protected_data_stream.gcount()); + decrypted_data.append((const char *)decrypted_buffer, protected_data_stream.gcount()); + } + + // RC4 is a stream cipher, so we don't bother to EVP_DecryptFinal, as there is + // no block padding. + EVP_CIPHER_CTX_cleanup(&ctx); + std::istringstream parse_stream(decrypted_data); + if (parser->parse(parse_stream, mProtectedDataMap, + LLSDSerialize::SIZE_UNLIMITED) == LLSDParser::PARSE_FAILURE) + { + throw LLProtectedDataException("Config file cannot be decrypted."); + } + } +} + +void LLSecAPIBasicHandler::_writeProtectedData() +{ + std::ostringstream formatted_data_ostream; + U8 salt[STORE_SALT_SIZE]; + U8 buffer[BUFFER_READ_SIZE]; + U8 encrypted_buffer[BUFFER_READ_SIZE]; + + + if(mProtectedDataMap.isUndefined()) + { + LLFile::remove(mProtectedDataFilename); + return; + } + // create a string with the formatted data. + LLSDSerialize::toXML(mProtectedDataMap, formatted_data_ostream); + std::istringstream formatted_data_istream(formatted_data_ostream.str()); + // generate the seed + RAND_bytes(salt, STORE_SALT_SIZE); + + + // write to a temp file so we don't clobber the initial file if there is + // an error. + std::string tmp_filename = mProtectedDataFilename + ".tmp"; + + llofstream protected_data_stream(tmp_filename.c_str(), + llofstream::binary); + try + { + + EVP_CIPHER_CTX ctx; + EVP_CIPHER_CTX_init(&ctx); + EVP_EncryptInit(&ctx, EVP_rc4(), salt, NULL); + unsigned char unique_id[MAC_ADDRESS_BYTES]; + LLMachineID::getUniqueID(unique_id, sizeof(unique_id)); + LLXORCipher cipher(unique_id, sizeof(unique_id)); + cipher.encrypt(salt, STORE_SALT_SIZE); + protected_data_stream.write((const char *)salt, STORE_SALT_SIZE); + + while (formatted_data_istream.good()) + { + formatted_data_istream.read((char *)buffer, BUFFER_READ_SIZE); + if(formatted_data_istream.gcount() == 0) + { + break; + } + int encrypted_length; + EVP_EncryptUpdate(&ctx, encrypted_buffer, &encrypted_length, + buffer, formatted_data_istream.gcount()); + protected_data_stream.write((const char *)encrypted_buffer, encrypted_length); + } + + // no EVP_EncrypteFinal, as this is a stream cipher + EVP_CIPHER_CTX_cleanup(&ctx); + + protected_data_stream.close(); + } + catch (...) + { + // it's good practice to clean up any secure information on error + // (even though this file isn't really secure. Perhaps in the future + // it may be, however. + LLFile::remove(tmp_filename); + throw LLProtectedDataException("Error writing Protected Data Store"); + } + + // move the temporary file to the specified file location. + if((((LLFile::isfile(mProtectedDataFilename) != 0) && + (LLFile::remove(mProtectedDataFilename) != 0))) || + (LLFile::rename(tmp_filename, mProtectedDataFilename))) + { + LLFile::remove(tmp_filename); + throw LLProtectedDataException("Could not overwrite protected data store"); + } +} + +// instantiate a certificate from a pem string +LLPointer<LLCertificate> LLSecAPIBasicHandler::getCertificate(const std::string& pem_cert) +{ + LLPointer<LLCertificate> result = new LLBasicCertificate(pem_cert); + return result; +} + + + +// instiate a certificate from an openssl X509 structure +LLPointer<LLCertificate> LLSecAPIBasicHandler::getCertificate(X509* openssl_cert) +{ + LLPointer<LLCertificate> result = new LLBasicCertificate(openssl_cert); + return result; +} + +// instantiate a chain from an X509_STORE_CTX +LLPointer<LLCertificateChain> LLSecAPIBasicHandler::getCertificateChain(const X509_STORE_CTX* chain) +{ + LLPointer<LLCertificateChain> result = new LLBasicCertificateChain(chain); + return result; +} + +// instantiate a cert store given it's id. if a persisted version +// exists, it'll be loaded. If not, one will be created (but not +// persisted) +LLPointer<LLCertificateStore> LLSecAPIBasicHandler::getCertificateStore(const std::string& store_id) +{ + return mStore; +} + +// retrieve protected data +LLSD LLSecAPIBasicHandler::getProtectedData(const std::string& data_type, + const std::string& data_id) +{ + + if (mProtectedDataMap.has(data_type) && + mProtectedDataMap[data_type].isMap() && + mProtectedDataMap[data_type].has(data_id)) + { + return mProtectedDataMap[data_type][data_id]; + } + + return LLSD(); +} + +void LLSecAPIBasicHandler::deleteProtectedData(const std::string& data_type, + const std::string& data_id) +{ + if (mProtectedDataMap.has(data_type) && + mProtectedDataMap[data_type].isMap() && + mProtectedDataMap[data_type].has(data_id)) + { + mProtectedDataMap[data_type].erase(data_id); + } +} + + +// +// persist data in a protected store +// +void LLSecAPIBasicHandler::setProtectedData(const std::string& data_type, + const std::string& data_id, + const LLSD& data) +{ + if (!mProtectedDataMap.has(data_type) || !mProtectedDataMap[data_type].isMap()) { + mProtectedDataMap[data_type] = LLSD::emptyMap(); + } + + mProtectedDataMap[data_type][data_id] = data; +} + +// +// Create a credential object from an identifier and authenticator. credentials are +// per grid. +LLPointer<LLCredential> LLSecAPIBasicHandler::createCredential(const std::string& grid, + const LLSD& identifier, + const LLSD& authenticator) +{ + LLPointer<LLSecAPIBasicCredential> result = new LLSecAPIBasicCredential(grid); + result->setCredentialData(identifier, authenticator); + return result; +} + +// Load a credential from the credential store, given the grid +LLPointer<LLCredential> LLSecAPIBasicHandler::loadCredential(const std::string& grid) +{ + LLSD credential = getProtectedData("credential", grid); + LLPointer<LLSecAPIBasicCredential> result = new LLSecAPIBasicCredential(grid); + if(credential.isMap() && + credential.has("identifier")) + { + + LLSD identifier = credential["identifier"]; + LLSD authenticator; + if (credential.has("authenticator")) + { + authenticator = credential["authenticator"]; + } + result->setCredentialData(identifier, authenticator); + } + else + { + // credential was not in protected storage, so pull the credential + // from the legacy store. + std::string first_name = gSavedSettings.getString("FirstName"); + std::string last_name = gSavedSettings.getString("LastName"); + + if ((first_name != "") && + (last_name != "")) + { + LLSD identifier = LLSD::emptyMap(); + LLSD authenticator; + identifier["type"] = "agent"; + identifier["first_name"] = first_name; + identifier["last_name"] = last_name; + + std::string legacy_password = _legacyLoadPassword(); + if (legacy_password.length() > 0) + { + authenticator = LLSD::emptyMap(); + authenticator["type"] = "hash"; + authenticator["algorithm"] = "md5"; + authenticator["secret"] = legacy_password; + } + result->setCredentialData(identifier, authenticator); + } + } + return result; +} + +// Save the credential to the credential store. Save the authenticator also if requested. +// That feature is used to implement the 'remember password' functionality. +void LLSecAPIBasicHandler::saveCredential(LLPointer<LLCredential> cred, bool save_authenticator) +{ + LLSD credential = LLSD::emptyMap(); + credential["identifier"] = cred->getIdentifier(); + if (save_authenticator) + { + credential["authenticator"] = cred->getAuthenticator(); + } + LL_DEBUGS("SECAPI") << "Saving Credential " << cred->getGrid() << ":" << cred->userID() << " " << save_authenticator << LL_ENDL; + setProtectedData("credential", cred->getGrid(), credential); + //*TODO: If we're saving Agni credentials, should we write the + // credentials to the legacy password.dat/etc? + _writeProtectedData(); +} + +// Remove a credential from the credential store. +void LLSecAPIBasicHandler::deleteCredential(LLPointer<LLCredential> cred) +{ + LLSD undefVal; + deleteProtectedData("credential", cred->getGrid()); + cred->setCredentialData(undefVal, undefVal); + _writeProtectedData(); +} + +// load the legacy hash for agni, and decrypt it given the +// mac address +std::string LLSecAPIBasicHandler::_legacyLoadPassword() +{ + const S32 HASHED_LENGTH = 32; + std::vector<U8> buffer(HASHED_LENGTH); + llifstream password_file(mLegacyPasswordPath, llifstream::binary); + + if(password_file.fail()) + { + return std::string(""); + } + + password_file.read((char*)&buffer[0], buffer.size()); + if(password_file.gcount() != buffer.size()) + { + return std::string(""); + } + + // Decipher with MAC address + unsigned char unique_id[MAC_ADDRESS_BYTES]; + LLMachineID::getUniqueID(unique_id, sizeof(unique_id)); + LLXORCipher cipher(unique_id, sizeof(unique_id)); + cipher.decrypt(&buffer[0], buffer.size()); + + return std::string((const char*)&buffer[0], buffer.size()); +} + + +// return an identifier for the user +std::string LLSecAPIBasicCredential::userID() const +{ + if (!mIdentifier.isMap()) + { + return mGrid + "(null)"; + } + else if ((std::string)mIdentifier["type"] == "agent") + { + return (std::string)mIdentifier["first_name"] + "_" + (std::string)mIdentifier["last_name"]; + } + else if ((std::string)mIdentifier["type"] == "account") + { + return (std::string)mIdentifier["account_name"]; + } + + return "unknown"; + +} + +// return a printable user identifier +std::string LLSecAPIBasicCredential::asString() const +{ + if (!mIdentifier.isMap()) + { + return mGrid + ":(null)"; + } + else if ((std::string)mIdentifier["type"] == "agent") + { + return mGrid + ":" + (std::string)mIdentifier["first_name"] + " " + (std::string)mIdentifier["last_name"]; + } + else if ((std::string)mIdentifier["type"] == "account") + { + return mGrid + ":" + (std::string)mIdentifier["account_name"]; + } + + return mGrid + ":(unknown type)"; +} + + +bool valueCompareLLSD(const LLSD& lhs, const LLSD& rhs) +{ + if (lhs.type() != rhs.type()) + { + return FALSE; + } + if (lhs.isMap()) + { + // iterate through the map, verifying the right hand side has all of the + // values that the left hand side has. + for (LLSD::map_const_iterator litt = lhs.beginMap(); + litt != lhs.endMap(); + litt++) + { + if (!rhs.has(litt->first)) + { + return FALSE; + } + } + + // Now validate that the left hand side has everything the + // right hand side has, and that the values are equal. + for (LLSD::map_const_iterator ritt = rhs.beginMap(); + ritt != rhs.endMap(); + ritt++) + { + if (!lhs.has(ritt->first)) + { + return FALSE; + } + if (!valueCompareLLSD(lhs[ritt->first], ritt->second)) + { + return FALSE; + } + } + return TRUE; + } + else if (lhs.isArray()) + { + LLSD::array_const_iterator ritt = rhs.beginArray(); + // iterate through the array, comparing + for (LLSD::array_const_iterator litt = lhs.beginArray(); + litt != lhs.endArray(); + litt++) + { + if (!valueCompareLLSD(*ritt, *litt)) + { + return FALSE; + } + ritt++; + } + + return (ritt == rhs.endArray()); + } + else + { + // simple type, compare as string + return (lhs.asString() == rhs.asString()); + } + +} diff --git a/indra/newview/llsechandler_basic.h b/indra/newview/llsechandler_basic.h new file mode 100644 index 0000000000..356ea7efcb --- /dev/null +++ b/indra/newview/llsechandler_basic.h @@ -0,0 +1,296 @@ +/** + * @file llsechandler_basic.h + * @brief Security API for services such as certificate handling + * secure local storage, etc. + * + * $LicenseInfo:firstyear=2009&license=viewergpl$ + * + * Copyright (c) 2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlife.com/developers/opensource/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlife.com/developers/opensource/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LLSECHANDLER_BASIC +#define LLSECHANDLER_BASIC + +#include "llsecapi.h" +#include <vector> +#include <openssl/x509.h> + +// helpers +extern LLSD cert_name_from_X509_NAME(X509_NAME* name); +extern std::string cert_string_name_from_X509_NAME(X509_NAME* name); +extern std::string cert_string_from_asn1_integer(ASN1_INTEGER* value); +extern LLDate cert_date_from_asn1_time(ASN1_TIME* asn1_time); +extern std::string cert_get_digest(const std::string& digest_type, X509 *cert); + + +// class LLCertificate +// +class LLBasicCertificate : public LLCertificate +{ +public: + LOG_CLASS(LLBasicCertificate); + + LLBasicCertificate(const std::string& pem_cert); + LLBasicCertificate(X509* openSSLX509); + + virtual ~LLBasicCertificate(); + + virtual std::string getPem() const; + virtual std::vector<U8> getBinary() const; + virtual void getLLSD(LLSD &llsd); + + virtual X509* getOpenSSLX509() const; + + // set llsd elements for testing + void setLLSD(const std::string name, const LLSD& value) { mLLSDInfo[name] = value; } + +protected: + + // certificates are stored as X509 objects, as validation and + // other functionality is via openssl + X509* mCert; + + LLSD& _initLLSD(); + LLSD mLLSDInfo; +}; + + +// class LLBasicCertificateVector +// Class representing a list of certificates +// This implementation uses a stl vector of certificates. +class LLBasicCertificateVector : virtual public LLCertificateVector +{ + +public: + LLBasicCertificateVector() {} + + virtual ~LLBasicCertificateVector() {} + + // Implementation of the basic iterator implementation. + // The implementation uses a vector iterator derived from + // the vector in the LLBasicCertificateVector class + class BasicIteratorImpl : public iterator_impl + { + public: + BasicIteratorImpl(std::vector<LLPointer<LLCertificate> >::iterator _iter) { mIter = _iter;} + virtual ~BasicIteratorImpl() {}; + // seek forward or back. Used by the operator++/operator-- implementations + virtual void seek(bool incr) + { + if(incr) + { + mIter++; + } + else + { + mIter--; + } + } + // create a copy of the iterator implementation class, used by the iterator copy constructor + virtual LLPointer<iterator_impl> clone() const + { + return new BasicIteratorImpl(mIter); + } + + virtual bool equals(const LLPointer<iterator_impl>& _iter) const + { + const BasicIteratorImpl *rhs_iter = dynamic_cast<const BasicIteratorImpl *>(_iter.get()); + llassert(rhs_iter); + if (!rhs_iter) return 0; + return (mIter == rhs_iter->mIter); + } + virtual LLPointer<LLCertificate> get() + { + return *mIter; + } + protected: + friend class LLBasicCertificateVector; + std::vector<LLPointer<LLCertificate> >::iterator mIter; + }; + + // numeric index of the vector + virtual LLPointer<LLCertificate> operator[](int _index) { return mCerts[_index];} + + // Iteration + virtual iterator begin() { return iterator(new BasicIteratorImpl(mCerts.begin())); } + + virtual iterator end() { return iterator(new BasicIteratorImpl(mCerts.end())); } + + // find a cert given params + virtual iterator find(const LLSD& params); + + // return the number of certs in the store + virtual int size() const { return mCerts.size(); } + + // insert the cert to the store. if a copy of the cert already exists in the store, it is removed first + virtual void add(LLPointer<LLCertificate> cert) { insert(end(), cert); } + + // insert the cert to the store. if a copy of the cert already exists in the store, it is removed first + virtual void insert(iterator _iter, LLPointer<LLCertificate> cert); + + // remove a certificate from the store + virtual LLPointer<LLCertificate> erase(iterator _iter); + +protected: + std::vector<LLPointer<LLCertificate> >mCerts; +}; + +// class LLCertificateStore +// represents a store of certificates, typically a store of root CA +// certificates. The store can be persisted, and can be used to validate +// a cert chain +// +class LLBasicCertificateStore : virtual public LLBasicCertificateVector, public LLCertificateStore +{ +public: + LLBasicCertificateStore(const std::string& filename); + void load_from_file(const std::string& filename); + + virtual ~LLBasicCertificateStore(); + + // persist the store + virtual void save(); + + // return the store id + virtual std::string storeId() const; + + // validate a certificate chain against a certificate store, using the + // given validation policy. + virtual void validate(int validation_policy, + LLPointer<LLCertificateChain> ca_chain, + const LLSD& validation_params); + +protected: + std::vector<LLPointer<LLCertificate> > mCerts; + + // cache of cert sha1 hashes to from/to date pairs, to improve + // performance of cert trust. Note, these are not the CA certs, + // but the certs that have been validated against this store. + typedef std::map<std::string, std::pair<LLDate, LLDate> > t_cert_cache; + t_cert_cache mTrustedCertCache; + + std::string mFilename; +}; + +// class LLCertificateChain +// Class representing a chain of certificates in order, with the +// first element being the child cert. +class LLBasicCertificateChain : virtual public LLBasicCertificateVector, public LLCertificateChain +{ + +public: + LLBasicCertificateChain(const X509_STORE_CTX * store); + + virtual ~LLBasicCertificateChain() {} + +}; + + + +// LLSecAPIBasicCredential class +class LLSecAPIBasicCredential : public LLCredential +{ +public: + LLSecAPIBasicCredential(const std::string& grid) : LLCredential(grid) {} + virtual ~LLSecAPIBasicCredential() {} + // return a value representing the user id, (could be guid, name, whatever) + virtual std::string userID() const; + + // printible string identifying the credential. + virtual std::string asString() const; +}; + +// LLSecAPIBasicHandler Class +// Interface handler class for the various security storage handlers. +class LLSecAPIBasicHandler : public LLSecAPIHandler +{ +public: + + LLSecAPIBasicHandler(const std::string& protected_data_filename, + const std::string& legacy_password_path); + LLSecAPIBasicHandler(); + + void init(); + + virtual ~LLSecAPIBasicHandler(); + + // instantiate a certificate from a pem string + virtual LLPointer<LLCertificate> getCertificate(const std::string& pem_cert); + + + // instiate a certificate from an openssl X509 structure + virtual LLPointer<LLCertificate> getCertificate(X509* openssl_cert); + + // instantiate a chain from an X509_STORE_CTX + virtual LLPointer<LLCertificateChain> getCertificateChain(const X509_STORE_CTX* chain); + + // instantiate a cert store given it's id. if a persisted version + // exists, it'll be loaded. If not, one will be created (but not + // persisted) + virtual LLPointer<LLCertificateStore> getCertificateStore(const std::string& store_id); + + // persist data in a protected store + virtual void setProtectedData(const std::string& data_type, + const std::string& data_id, + const LLSD& data); + + // retrieve protected data + virtual LLSD getProtectedData(const std::string& data_type, + const std::string& data_id); + + // delete a protected data item from the store + virtual void deleteProtectedData(const std::string& data_type, + const std::string& data_id); + + // credential management routines + + virtual LLPointer<LLCredential> createCredential(const std::string& grid, + const LLSD& identifier, + const LLSD& authenticator); + + virtual LLPointer<LLCredential> loadCredential(const std::string& grid); + + virtual void saveCredential(LLPointer<LLCredential> cred, bool save_authenticator); + + virtual void deleteCredential(LLPointer<LLCredential> cred); + +protected: + void _readProtectedData(); + void _writeProtectedData(); + std::string _legacyLoadPassword(); + + std::string mProtectedDataFilename; + LLSD mProtectedDataMap; + LLPointer<LLBasicCertificateStore> mStore; + + std::string mLegacyPasswordPath; +}; + +bool valueCompareLLSD(const LLSD& lhs, const LLSD& rhs); + +#endif // LLSECHANDLER_BASIC + + + diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index 9540894646..af16b962e6 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -56,6 +56,7 @@ // viewer includes #include "llagent.h" +#include "llagentcamera.h" #include "llviewerwindow.h" #include "lldrawable.h" #include "llfloaterinspect.h" @@ -1474,7 +1475,7 @@ void LLSelectMgr::selectionSetImage(const LLUUID& imageid) object->sendTEUpdate(); // 1 particle effect per object LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BEAM, TRUE); - effectp->setSourceObject(gAgent.getAvatarObject()); + effectp->setSourceObject(gAgentAvatarp); effectp->setTargetObject(object); effectp->setDuration(LL_HUD_DUR_SHORT); effectp->setColor(LLColor4U(gAgent.getEffectColor())); @@ -2434,7 +2435,7 @@ BOOL LLSelectMgr::selectGetCreator(LLUUID& result_id, std::string& name) if (identical) { - name = LLSLURL::buildCommand("agent", first_id, "inspect"); + name = LLSLURL("agent", first_id, "inspect").getSLURLString(); } else { @@ -2493,11 +2494,11 @@ BOOL LLSelectMgr::selectGetOwner(LLUUID& result_id, std::string& name) BOOL public_owner = (first_id.isNull() && !first_group_owned); if (first_group_owned) { - name = LLSLURL::buildCommand("group", first_id, "inspect"); + name = LLSLURL("group", first_id, "inspect").getSLURLString(); } else if(!public_owner) { - name = LLSLURL::buildCommand("agent", first_id, "inspect"); + name = LLSLURL("agent", first_id, "inspect").getSLURLString(); } else { @@ -2557,7 +2558,7 @@ BOOL LLSelectMgr::selectGetLastOwner(LLUUID& result_id, std::string& name) BOOL public_owner = (first_id.isNull()); if(!public_owner) { - name = LLSLURL::buildCommand("agent", first_id, "inspect"); + name = LLSLURL("agent", first_id, "inspect").getSLURLString(); } else { @@ -2872,7 +2873,7 @@ bool LLSelectMgr::confirmDelete(const LLSD& notification, const LLSD& response, effectp->setDuration(duration); } - gAgent.setLookAt(LOOKAT_TARGET_CLEAR); + gAgentCamera.setLookAt(LOOKAT_TARGET_CLEAR); // Keep track of how many objects have been deleted. F64 obj_delete_count = LLViewerStats::getInstance()->getStat(LLViewerStats::ST_OBJECT_DELETE_COUNT); @@ -3618,19 +3619,19 @@ void LLSelectMgr::sendAttach(U8 attachment_point) { LLViewerObject* attach_object = mSelectedObjects->getFirstRootObject(); - if (!attach_object || !gAgent.getAvatarObject() || mSelectedObjects->mSelectType != SELECT_TYPE_WORLD) + if (!attach_object || !isAgentAvatarValid() || mSelectedObjects->mSelectType != SELECT_TYPE_WORLD) { return; } -#if ENABLE_MULTIATTACHMENTS - attachment_point |= ATTACHMENT_ADD; -#endif BOOL build_mode = LLToolMgr::getInstance()->inEdit(); // Special case: Attach to default location for this object. if (0 == attachment_point || - get_if_there(gAgent.getAvatarObject()->mAttachmentPoints, (S32)attachment_point, (LLViewerJointAttachment*)NULL)) + get_if_there(gAgentAvatarp->mAttachmentPoints, (S32)attachment_point, (LLViewerJointAttachment*)NULL)) { +#if ENABLE_MULTIATTACHMENTS + attachment_point |= ATTACHMENT_ADD; +#endif sendListToRegions( "ObjectAttach", packAgentIDAndSessionAndAttachment, @@ -4391,7 +4392,7 @@ void LLSelectMgr::processObjectProperties(LLMessageSystem* msg, void** user_data msg->getStringFast(_PREHASH_ObjectData, _PREHASH_SitName, sit_name, i); //unpack TE IDs - std::vector<LLUUID> texture_ids; + uuid_vec_t texture_ids; S32 size = msg->getSizeFast(_PREHASH_ObjectData, i, _PREHASH_TextureID); if (size > 0) { @@ -4626,8 +4627,8 @@ void LLSelectMgr::updateSilhouettes() { S32 num_sils_genned = 0; - LLVector3d cameraPos = gAgent.getCameraPositionGlobal(); - F32 currentCameraZoom = gAgent.getCurrentCameraBuildOffset(); + LLVector3d cameraPos = gAgentCamera.getCameraPositionGlobal(); + F32 currentCameraZoom = gAgentCamera.getCurrentCameraBuildOffset(); if (!mSilhouetteImagep) { @@ -4648,7 +4649,7 @@ void LLSelectMgr::updateSilhouettes() } func; getSelection()->applyToObjects(&func); - mLastCameraPos = gAgent.getCameraPositionGlobal(); + mLastCameraPos = gAgentCamera.getCameraPositionGlobal(); } std::vector<LLViewerObject*> changed_objects; @@ -4910,22 +4911,23 @@ void LLSelectMgr::renderSilhouettes(BOOL for_hud) LLGLEnable blend(GL_BLEND); LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE); - LLVOAvatar* avatar = gAgent.getAvatarObject(); - if (for_hud && avatar) + if (isAgentAvatarValid() && for_hud) { - LLBBox hud_bbox = avatar->getHUDBBox(); + LLBBox hud_bbox = gAgentAvatarp->getHUDBBox(); - F32 cur_zoom = gAgent.mHUDCurZoom; + F32 cur_zoom = gAgentCamera.mHUDCurZoom; // set up transform to encompass bounding box of HUD glMatrixMode(GL_PROJECTION); - glPushMatrix(); + gGL.pushMatrix(); glLoadIdentity(); F32 depth = llmax(1.f, hud_bbox.getExtentLocal().mV[VX] * 1.1f); glOrtho(-0.5f * LLViewerCamera::getInstance()->getAspect(), 0.5f * LLViewerCamera::getInstance()->getAspect(), -0.5f, 0.5f, 0.f, depth); glMatrixMode(GL_MODELVIEW); - glPushMatrix(); + gGL.pushMatrix(); + gGL.pushUIMatrix(); + gGL.loadUIIdentity(); glLoadIdentity(); glLoadMatrixf(OGL_TO_CFR_ROTATION); // Load Cory's favorite reference frame glTranslatef(-hud_bbox.getCenterLocal().mV[VX] + (depth *0.5f), 0.f, 0.f); @@ -4934,17 +4936,18 @@ void LLSelectMgr::renderSilhouettes(BOOL for_hud) if (mSelectedObjects->getNumNodes()) { LLUUID inspect_item_id= LLUUID::null; -#if 0 LLFloaterInspect* inspect_instance = LLFloaterReg::getTypedInstance<LLFloaterInspect>("inspect"); - if(inspect_instance) + if(inspect_instance && inspect_instance->getVisible()) { inspect_item_id = inspect_instance->getSelectedUUID(); } -#endif - LLSidepanelTaskInfo *panel_task_info = LLSidepanelTaskInfo::getActivePanel(); - if (panel_task_info) + else { - inspect_item_id = panel_task_info->getSelectedUUID(); + LLSidepanelTaskInfo *panel_task_info = LLSidepanelTaskInfo::getActivePanel(); + if (panel_task_info) + { + inspect_item_id = panel_task_info->getSelectedUUID(); + } } LLUUID focus_item_id = LLViewerMediaFocus::getInstance()->getFocusedObjectID(); @@ -5019,13 +5022,14 @@ void LLSelectMgr::renderSilhouettes(BOOL for_hud) } } - if (for_hud && avatar) + if (isAgentAvatarValid() && for_hud) { glMatrixMode(GL_PROJECTION); - glPopMatrix(); + gGL.popMatrix(); glMatrixMode(GL_MODELVIEW); - glPopMatrix(); + gGL.popMatrix(); + gGL.popUIMatrix(); stop_glerror(); } @@ -5203,13 +5207,13 @@ void LLSelectNode::saveColors() } } -void LLSelectNode::saveTextures(const std::vector<LLUUID>& textures) +void LLSelectNode::saveTextures(const uuid_vec_t& textures) { if (mObject.notNull()) { mSavedTextures.clear(); - for (std::vector<LLUUID>::const_iterator texture_it = textures.begin(); + for (uuid_vec_t::const_iterator texture_it = textures.begin(); texture_it != textures.end(); ++texture_it) { mSavedTextures.push_back(*texture_it); @@ -5374,7 +5378,10 @@ void LLSelectNode::renderOneSilhouette(const LLColor4 &color) } glMatrixMode(GL_MODELVIEW); - glPushMatrix(); + gGL.pushMatrix(); + gGL.pushUIMatrix(); + gGL.loadUIIdentity(); + if (!is_hud_object) { glLoadIdentity(); @@ -5391,9 +5398,9 @@ void LLSelectNode::renderOneSilhouette(const LLColor4 &color) if (volume) { F32 silhouette_thickness; - if (is_hud_object && gAgent.getAvatarObject()) + if (isAgentAvatarValid() && is_hud_object) { - silhouette_thickness = LLSelectMgr::sHighlightThickness / gAgent.mHUDCurZoom; + silhouette_thickness = LLSelectMgr::sHighlightThickness / gAgentCamera.mHUDCurZoom; } else { @@ -5413,7 +5420,7 @@ void LLSelectNode::renderOneSilhouette(const LLColor4 &color) LLGLEnable fog(GL_FOG); glFogi(GL_FOG_MODE, GL_LINEAR); float d = (LLViewerCamera::getInstance()->getPointOfInterest()-LLViewerCamera::getInstance()->getOrigin()).magVec(); - LLColor4 fogCol = color * (F32)llclamp((LLSelectMgr::getInstance()->getSelectionCenterGlobal()-gAgent.getCameraPositionGlobal()).magVec()/(LLSelectMgr::getInstance()->getBBoxOfSelection().getExtentLocal().magVec()*4), 0.0, 1.0); + LLColor4 fogCol = color * (F32)llclamp((LLSelectMgr::getInstance()->getSelectionCenterGlobal()-gAgentCamera.getCameraPositionGlobal()).magVec()/(LLSelectMgr::getInstance()->getBBoxOfSelection().getExtentLocal().magVec()*4), 0.0, 1.0); glFogf(GL_FOG_START, d); glFogf(GL_FOG_END, d*(1 + (LLViewerCamera::getInstance()->getView() / LLViewerCamera::getInstance()->getDefaultFOV()))); glFogfv(GL_FOG_COLOR, fogCol.mV); @@ -5493,7 +5500,8 @@ void LLSelectNode::renderOneSilhouette(const LLColor4 &color) gGL.end(); gGL.flush(); } - glPopMatrix(); + gGL.popMatrix(); + gGL.popUIMatrix(); } // @@ -5527,13 +5535,12 @@ void dialog_refresh_all() LLFloaterProperties::dirtyAll(); -#if 0 LLFloaterInspect* inspect_instance = LLFloaterReg::getTypedInstance<LLFloaterInspect>("inspect"); if(inspect_instance) { inspect_instance->dirty(); } -#endif + LLSidepanelTaskInfo *panel_task_info = LLSidepanelTaskInfo::getActivePanel(); if (panel_task_info) { @@ -5601,20 +5608,20 @@ void LLSelectMgr::updateSelectionCenter() { mSelectedObjects->mSelectType = getSelectTypeForObject(object); - if (mSelectedObjects->mSelectType == SELECT_TYPE_ATTACHMENT && gAgent.getAvatarObject()) + if (mSelectedObjects->mSelectType == SELECT_TYPE_ATTACHMENT && isAgentAvatarValid()) { - mPauseRequest = gAgent.getAvatarObject()->requestPause(); + mPauseRequest = gAgentAvatarp->requestPause(); } else { mPauseRequest = NULL; } - if (mSelectedObjects->mSelectType != SELECT_TYPE_HUD && gAgent.getAvatarObject()) + if (mSelectedObjects->mSelectType != SELECT_TYPE_HUD && isAgentAvatarValid()) { // reset hud ZOOM - gAgent.mHUDTargetZoom = 1.f; - gAgent.mHUDCurZoom = 1.f; + gAgentCamera.mHUDTargetZoom = 1.f; + gAgentCamera.mHUDCurZoom = 1.f; } mShowSelection = FALSE; @@ -5633,10 +5640,10 @@ void LLSelectMgr::updateSelectionCenter() LLViewerObject* object = node->getObject(); if (!object) continue; - LLViewerObject *myAvatar = gAgent.getAvatarObject(); + LLViewerObject *root = object->getRootEdit(); if (mSelectedObjects->mSelectType == SELECT_TYPE_WORLD && // not an attachment - !root->isChild(myAvatar) && // not the object you're sitting on + !root->isChild(gAgentAvatarp) && // not the object you're sitting on !object->isAvatar()) // not another avatar { mShowSelection = TRUE; @@ -5706,26 +5713,26 @@ void LLSelectMgr::updatePointAt() select_offset.setVec(pick.mObjectOffset); select_offset.rotVec(~click_object->getRenderRotation()); - gAgent.setPointAt(POINTAT_TARGET_SELECT, click_object, select_offset); - gAgent.setLookAt(LOOKAT_TARGET_SELECT, click_object, select_offset); + gAgentCamera.setPointAt(POINTAT_TARGET_SELECT, click_object, select_offset); + gAgentCamera.setLookAt(LOOKAT_TARGET_SELECT, click_object, select_offset); } else { // didn't click on an object this time, revert to pointing at center of first object - gAgent.setPointAt(POINTAT_TARGET_SELECT, mSelectedObjects->getFirstObject()); - gAgent.setLookAt(LOOKAT_TARGET_SELECT, mSelectedObjects->getFirstObject()); + gAgentCamera.setPointAt(POINTAT_TARGET_SELECT, mSelectedObjects->getFirstObject()); + gAgentCamera.setLookAt(LOOKAT_TARGET_SELECT, mSelectedObjects->getFirstObject()); } } else { - gAgent.setPointAt(POINTAT_TARGET_CLEAR); - gAgent.setLookAt(LOOKAT_TARGET_CLEAR); + gAgentCamera.setPointAt(POINTAT_TARGET_CLEAR); + gAgentCamera.setLookAt(LOOKAT_TARGET_CLEAR); } } else { - gAgent.setPointAt(POINTAT_TARGET_CLEAR); - gAgent.setLookAt(LOOKAT_TARGET_CLEAR); + gAgentCamera.setPointAt(POINTAT_TARGET_CLEAR); + gAgentCamera.setLookAt(LOOKAT_TARGET_CLEAR); } } @@ -5915,20 +5922,20 @@ BOOL LLSelectMgr::setForceSelection(BOOL force) void LLSelectMgr::resetAgentHUDZoom() { - gAgent.mHUDTargetZoom = 1.f; - gAgent.mHUDCurZoom = 1.f; + gAgentCamera.mHUDTargetZoom = 1.f; + gAgentCamera.mHUDCurZoom = 1.f; } void LLSelectMgr::getAgentHUDZoom(F32 &target_zoom, F32 ¤t_zoom) const { - target_zoom = gAgent.mHUDTargetZoom; - current_zoom = gAgent.mHUDCurZoom; + target_zoom = gAgentCamera.mHUDTargetZoom; + current_zoom = gAgentCamera.mHUDCurZoom; } void LLSelectMgr::setAgentHUDZoom(F32 target_zoom, F32 current_zoom) { - gAgent.mHUDTargetZoom = target_zoom; - gAgent.mHUDCurZoom = current_zoom; + gAgentCamera.mHUDTargetZoom = target_zoom; + gAgentCamera.mHUDCurZoom = current_zoom; } ///////////////////////////////////////////////////////////////////////////// diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h index 00474827ca..668c04cf15 100644 --- a/indra/newview/llselectmgr.h +++ b/indra/newview/llselectmgr.h @@ -147,7 +147,7 @@ public: void setObject(LLViewerObject* object); // *NOTE: invalidate stored textures and colors when # faces change void saveColors(); - void saveTextures(const std::vector<LLUUID>& textures); + void saveTextures(const uuid_vec_t& textures); void saveTextureScaleRatios(); BOOL allowOperationOnNode(PermissionBit op, U64 group_proxy_power) const; @@ -183,7 +183,7 @@ public: std::string mSitName; U64 mCreationDate; std::vector<LLColor4> mSavedColors; - std::vector<LLUUID> mSavedTextures; + uuid_vec_t mSavedTextures; std::vector<LLVector3> mTextureScaleRatios; std::vector<LLVector3> mSilhouetteVertices; // array of vertices to render silhouette of object std::vector<LLVector3> mSilhouetteNormals; // array of normals to render silhouette of object @@ -257,7 +257,6 @@ public: LLObjectSelection(); void updateEffects(); - void cleanupNodes(); BOOL isEmpty() const; @@ -281,11 +280,6 @@ public: template <typename T> bool getSelectedTEValue(LLSelectedTEGetFunctor<T>* func, T& res); template <typename T> bool isMultipleTEValue(LLSelectedTEGetFunctor<T>* func, const T& ignore_value); - void addNode(LLSelectNode *nodep); - void addNodeAtEnd(LLSelectNode *nodep); - void moveNodeToFront(LLSelectNode *nodep); - void removeNode(LLSelectNode *nodep); - void deleteAllNodes(); // Delete all nodes S32 getNumNodes(); LLSelectNode* findNode(LLViewerObject* objectp); @@ -313,6 +307,15 @@ public: ESelectType getSelectType() const { return mSelectType; } private: + void addNode(LLSelectNode *nodep); + void addNodeAtEnd(LLSelectNode *nodep); + void moveNodeToFront(LLSelectNode *nodep); + void removeNode(LLSelectNode *nodep); + void deleteAllNodes(); + void cleanupNodes(); + + +private: list_t mList; const LLObjectSelection &operator=(const LLObjectSelection &); diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp index 43215f86bd..0d1be91125 100644 --- a/indra/newview/llsidepanelappearance.cpp +++ b/indra/newview/llsidepanelappearance.cpp @@ -34,6 +34,7 @@ #include "llaccordionctrltab.h" #include "llagent.h" +#include "llagentcamera.h" #include "llagentwearables.h" #include "llappearancemgr.h" #include "llinventorypanel.h" @@ -41,20 +42,25 @@ #include "llfloaterreg.h" #include "llfloaterworldmap.h" #include "llfoldervieweventlistener.h" +#include "lloutfitobserver.h" #include "llpaneleditwearable.h" #include "llpaneloutfitsinventory.h" +#include "llsidetray.h" #include "lltextbox.h" #include "lluictrlfactory.h" +#include "llviewercontrol.h" #include "llviewerregion.h" #include "llvoavatarself.h" #include "llwearable.h" static LLRegisterPanelClassWrapper<LLSidepanelAppearance> t_appearance("sidepanel_appearance"); -class LLCurrentlyWornFetchObserver : public LLInventoryFetchObserver +class LLCurrentlyWornFetchObserver : public LLInventoryFetchItemsObserver { public: - LLCurrentlyWornFetchObserver(LLSidepanelAppearance *panel) : + LLCurrentlyWornFetchObserver(const uuid_vec_t &ids, + LLSidepanelAppearance *panel) : + LLInventoryFetchItemsObserver(ids), mPanel(panel) {} ~LLCurrentlyWornFetchObserver() {} @@ -68,39 +74,25 @@ private: LLSidepanelAppearance *mPanel; }; -class LLWatchForOutfitRenameObserver : public LLInventoryObserver -{ -public: - LLWatchForOutfitRenameObserver(LLSidepanelAppearance *panel) : - mPanel(panel) - {} - virtual void changed(U32 mask); - -private: - LLSidepanelAppearance *mPanel; -}; - -void LLWatchForOutfitRenameObserver::changed(U32 mask) -{ - if (mask & LABEL) - { - mPanel->refreshCurrentOutfitName(); - } -} - LLSidepanelAppearance::LLSidepanelAppearance() : LLPanel(), mFilterSubString(LLStringUtil::null), mFilterEditor(NULL), - mLookInfo(NULL), - mCurrOutfitPanel(NULL) + mOutfitEdit(NULL), + mCurrOutfitPanel(NULL), + mOpened(false) { + LLOutfitObserver& outfit_observer = LLOutfitObserver::instance(); + outfit_observer.addBOFReplacedCallback(boost::bind(&LLSidepanelAppearance::refreshCurrentOutfitName, this, "")); + outfit_observer.addBOFChangedCallback(boost::bind(&LLSidepanelAppearance::refreshCurrentOutfitName, this, "")); + outfit_observer.addCOFChangedCallback(boost::bind(&LLSidepanelAppearance::refreshCurrentOutfitName, this, "")); + + gAgentWearables.addLoadingStartedCallback(boost::bind(&LLSidepanelAppearance::setWearablesLoading, this, true)); + gAgentWearables.addLoadedCallback(boost::bind(&LLSidepanelAppearance::setWearablesLoading, this, false)); } LLSidepanelAppearance::~LLSidepanelAppearance() { - gInventory.removeObserver(mOutfitRenameWatcher); - delete mOutfitRenameWatcher; } // virtual @@ -112,8 +104,7 @@ BOOL LLSidepanelAppearance::postBuild() mEditAppearanceBtn = getChild<LLButton>("editappearance_btn"); mEditAppearanceBtn->setClickedCallback(boost::bind(&LLSidepanelAppearance::onEditAppearanceButtonClicked, this)); - mEditBtn = getChild<LLButton>("edit_btn"); - mEditBtn->setClickedCallback(boost::bind(&LLSidepanelAppearance::onEditButtonClicked, this)); + childSetAction("edit_outfit_btn", boost::bind(&LLSidepanelAppearance::showOutfitEditPanel, this)); mNewOutfitBtn = getChild<LLButton>("newlook_btn"); mNewOutfitBtn->setClickedCallback(boost::bind(&LLSidepanelAppearance::onNewOutfitButtonClicked, this)); @@ -126,15 +117,14 @@ BOOL LLSidepanelAppearance::postBuild() } mPanelOutfitsInventory = dynamic_cast<LLPanelOutfitsInventory *>(getChild<LLPanel>("panel_outfits_inventory")); - mPanelOutfitsInventory->setParent(this); - mLookInfo = dynamic_cast<LLPanelLookInfo*>(getChild<LLPanel>("panel_look_info")); - if (mLookInfo) + mOutfitEdit = dynamic_cast<LLPanelOutfitEdit*>(getChild<LLPanel>("panel_outfit_edit")); + if (mOutfitEdit) { - LLButton* back_btn = mLookInfo->getChild<LLButton>("back_btn"); + LLButton* back_btn = mOutfitEdit->getChild<LLButton>("back_btn"); if (back_btn) { - back_btn->setClickedCallback(boost::bind(&LLSidepanelAppearance::onBackButtonClicked, this)); + back_btn->setClickedCallback(boost::bind(&LLSidepanelAppearance::showOutfitsInventoryPanel, this)); } } @@ -145,18 +135,18 @@ BOOL LLSidepanelAppearance::postBuild() LLButton* edit_wearable_back_btn = mEditWearable->getChild<LLButton>("back_btn"); if (edit_wearable_back_btn) { - edit_wearable_back_btn->setClickedCallback(boost::bind(&LLSidepanelAppearance::onEditWearBackClicked, this)); + edit_wearable_back_btn->setClickedCallback(boost::bind(&LLSidepanelAppearance::showOutfitEditPanel, this)); } } mCurrentLookName = getChild<LLTextBox>("currentlook_name"); - mOutfitDirtyTag = getChild<LLTextBox>("currentlook_title"); + mOutfitStatus = getChild<LLTextBox>("currentlook_status"); mCurrOutfitPanel = getChild<LLPanel>("panel_currentlook"); - mOutfitRenameWatcher = new LLWatchForOutfitRenameObserver(this); - gInventory.addObserver(mOutfitRenameWatcher); + + setVisibleCallback(boost::bind(&LLSidepanelAppearance::onVisibilityChange,this,_2)); return TRUE; } @@ -164,28 +154,57 @@ BOOL LLSidepanelAppearance::postBuild() // virtual void LLSidepanelAppearance::onOpen(const LLSD& key) { - fetchInventory(); - refreshCurrentOutfitName(); - updateVerbs(); - - if (mPanelOutfitsInventory) + if (!key.has("type")) { - mPanelOutfitsInventory->onOpen(key); + // No specific panel requested. + // If we're opened for the first time then show My Outfits. + // Else do nothing. + if (!mOpened) + { + showOutfitsInventoryPanel(); + } + } + else + { + // Switch to the requested panel. + // *TODO: replace this crap with LLSideTrayPanelContainer + std::string type = key["type"].asString(); + if (type == "my_outfits") + { + showOutfitsInventoryPanel(); + } + else if (type == "edit_outfit") + { + showOutfitEditPanel(); + } + else if (type == "edit_shape") + { + showWearableEditPanel(); + } } - if(key.size() == 0) - return; - - toggleLookInfoPanel(TRUE); - updateVerbs(); - - mLookInfoType = key["type"].asString(); + mOpened = true; +} - if (mLookInfoType == "look") +void LLSidepanelAppearance::onVisibilityChange(const LLSD &new_visibility) +{ + if (new_visibility.asBoolean()) { - LLInventoryCategory *pLook = gInventory.getCategory(key["id"].asUUID()); - if (pLook) - mLookInfo->displayLookInfo(pLook); + if ((mOutfitEdit && mOutfitEdit->getVisible()) || (mEditWearable && mEditWearable->getVisible())) + { + if (!gAgentCamera.cameraCustomizeAvatar() && gSavedSettings.getBOOL("AppearanceCameraMovement")) + { + gAgentCamera.changeCameraToCustomizeAvatar(); + } + } + } + else + { + if (gAgentCamera.cameraCustomizeAvatar() && gSavedSettings.getBOOL("AppearanceCameraMovement")) + { + gAgentCamera.changeCameraToDefault(); + gAgentCamera.resetView(); + } } } @@ -196,8 +215,7 @@ void LLSidepanelAppearance::onFilterEdit(const std::string& search_string) mFilterSubString = search_string; // Searches are case-insensitive - LLStringUtil::toUpper(mFilterSubString); - LLStringUtil::trimHead(mFilterSubString); + // but we don't convert the typed string to upper-case so that it can be fed to the web search as-is. mPanelOutfitsInventory->onSearchEdit(mFilterSubString); } @@ -205,7 +223,7 @@ void LLSidepanelAppearance::onFilterEdit(const std::string& search_string) void LLSidepanelAppearance::onOpenOutfitButtonClicked() { - const LLViewerInventoryItem *outfit_link = LLAppearanceManager::getInstance()->getBaseOutfitLink(); + const LLViewerInventoryItem *outfit_link = LLAppearanceMgr::getInstance()->getBaseOutfitLink(); if (!outfit_link) return; if (!outfit_link->getIsLinkType()) @@ -218,116 +236,162 @@ void LLSidepanelAppearance::onOpenOutfitButtonClicked() LLInventoryPanel *inventory_panel = tab_outfits->findChild<LLInventoryPanel>("outfitslist_tab"); if (inventory_panel) { - LLFolderView *folder = inventory_panel->getRootFolder(); - LLFolderViewItem *outfit_folder = folder->getItemByID(outfit_link->getLinkedUUID()); + LLFolderView* root = inventory_panel->getRootFolder(); + LLFolderViewItem *outfit_folder = root->getItemByID(outfit_link->getLinkedUUID()); if (outfit_folder) { outfit_folder->setOpen(!outfit_folder->isOpen()); - folder->setSelectionFromRoot(outfit_folder,TRUE); - folder->scrollToShowSelection(); + root->setSelectionFromRoot(outfit_folder,TRUE); + root->scrollToShowSelection(); } } } } +// *TODO: obsolete? void LLSidepanelAppearance::onEditAppearanceButtonClicked() { if (gAgentWearables.areWearablesLoaded()) { - gAgent.changeCameraToCustomizeAvatar(); + gAgentCamera.changeCameraToCustomizeAvatar(); } } -void LLSidepanelAppearance::onEditButtonClicked() -{ - toggleLookInfoPanel(FALSE); - toggleWearableEditPanel(TRUE, NULL); - /*if (mLookInfo->getVisible()) - { - } - else - { - mPanelOutfitsInventory->onEdit(); - }*/ -} - void LLSidepanelAppearance::onNewOutfitButtonClicked() { - if (!mLookInfo->getVisible()) + if (!mOutfitEdit->getVisible()) { mPanelOutfitsInventory->onSave(); } } +void LLSidepanelAppearance::showOutfitsInventoryPanel() +{ + toggleWearableEditPanel(FALSE); + toggleOutfitEditPanel(FALSE); + togglMyOutfitsPanel(TRUE); +} -void LLSidepanelAppearance::onBackButtonClicked() +void LLSidepanelAppearance::showOutfitEditPanel() { - toggleLookInfoPanel(FALSE); + togglMyOutfitsPanel(FALSE); + toggleWearableEditPanel(FALSE, NULL, TRUE); // don't switch out of edit appearance mode + toggleOutfitEditPanel(TRUE); } -void LLSidepanelAppearance::onEditWearBackClicked() +void LLSidepanelAppearance::showWearableEditPanel(LLWearable *wearable /* = NULL*/) { - mEditWearable->saveChanges(); - toggleWearableEditPanel(FALSE, NULL); - toggleLookInfoPanel(TRUE); + togglMyOutfitsPanel(FALSE); + toggleOutfitEditPanel(FALSE, TRUE); // don't switch out of edit appearance mode + toggleWearableEditPanel(TRUE, wearable); } -void LLSidepanelAppearance::toggleLookInfoPanel(BOOL visible) +void LLSidepanelAppearance::togglMyOutfitsPanel(BOOL visible) { - if (!mLookInfo) + if (!mPanelOutfitsInventory || mPanelOutfitsInventory->getVisible() == visible) + { + // visibility isn't changing, hence nothing to do return; + } + + mPanelOutfitsInventory->setVisible(visible); - mLookInfo->setVisible(visible); - mPanelOutfitsInventory->setVisible(!visible); - mFilterEditor->setVisible(!visible); - mEditBtn->setVisible(!visible); - mNewOutfitBtn->setVisible(!visible); - mCurrOutfitPanel->setVisible(!visible); + // *TODO: Move these controls to panel_outfits_inventory.xml + // so that we don't need to toggle them explicitly. + mFilterEditor->setVisible(visible); + mNewOutfitBtn->setVisible(visible); + mCurrOutfitPanel->setVisible(visible); + + if (visible) + { + mPanelOutfitsInventory->onOpen(LLSD()); + } } -void LLSidepanelAppearance::toggleWearableEditPanel(BOOL visible, LLWearable *wearable) +void LLSidepanelAppearance::toggleOutfitEditPanel(BOOL visible, BOOL disable_camera_switch) { + if (!mOutfitEdit || mOutfitEdit->getVisible() == visible) + { + // visibility isn't changing, hence nothing to do + return; + } + + mOutfitEdit->setVisible(visible); + + if (visible) + { + mOutfitEdit->onOpen(LLSD()); + if (!disable_camera_switch && gSavedSettings.getBOOL("AppearanceCameraMovement") ) + { + gAgentCamera.changeCameraToCustomizeAvatar(); + } + } + else if (!disable_camera_switch && gSavedSettings.getBOOL("AppearanceCameraMovement") ) + { + gAgentCamera.changeCameraToDefault(); + gAgentCamera.resetView(); + } +} + +void LLSidepanelAppearance::toggleWearableEditPanel(BOOL visible, LLWearable *wearable, BOOL disable_camera_switch) +{ + if (!mEditWearable || mEditWearable->getVisible() == visible) + { + // visibility isn't changing, hence nothing to do + return; + } + if (!wearable) { - wearable = gAgentWearables.getWearable(WT_SHAPE, 0); + wearable = gAgentWearables.getWearable(LLWearableType::WT_SHAPE, 0); } - if (!mEditWearable || !wearable) + if (!wearable) { return; } + // Toggle panel visibility. mEditWearable->setVisible(visible); - mFilterEditor->setVisible(!visible); - mPanelOutfitsInventory->setVisible(!visible); -} - -void LLSidepanelAppearance::updateVerbs() -{ - bool is_look_info_visible = mLookInfo->getVisible(); - if (!is_look_info_visible) + if (visible) { - const bool is_correct_type = (mPanelOutfitsInventory->getCorrectListenerForAction() != NULL); - mEditBtn->setEnabled(is_correct_type); + if (!disable_camera_switch && gSavedSettings.getBOOL("AppearanceCameraMovement") ) + { + gAgentCamera.changeCameraToCustomizeAvatar(); + } + mEditWearable->setWearable(wearable); + mEditWearable->onOpen(LLSD()); // currently no-op, just for consistency } else { - mEditBtn->setEnabled(FALSE); + // Save changes if closing. + mEditWearable->saveChanges(); + if (!disable_camera_switch && gSavedSettings.getBOOL("AppearanceCameraMovement") ) + { + gAgentCamera.changeCameraToDefault(); + gAgentCamera.resetView(); + } } } void LLSidepanelAppearance::refreshCurrentOutfitName(const std::string& name) { - mOutfitDirtyTag->setVisible(LLAppearanceManager::getInstance()->isOutfitDirty()); + // Set current outfit status (wearing/unsaved). + bool dirty = LLAppearanceMgr::getInstance()->isOutfitDirty(); + std::string cof_status_str = getString(dirty ? "Unsaved Changes" : "Now Wearing"); + mOutfitStatus->setText(cof_status_str); + if (name == "") { std::string outfit_name; - if (LLAppearanceManager::getInstance()->getBaseOutfitName(outfit_name)) + if (LLAppearanceMgr::getInstance()->getBaseOutfitName(outfit_name)) { mCurrentLookName->setText(outfit_name); return; } - mCurrentLookName->setText(getString("No Outfit")); + + std::string look_name = gAgentWearables.isCOFChangeInProgress() ? "" : getString("No Outfit"); + mCurrentLookName->setText(look_name); mOpenOutfitBtn->setEnabled(FALSE); } else @@ -339,11 +403,13 @@ void LLSidepanelAppearance::refreshCurrentOutfitName(const std::string& name) } //static -void LLSidepanelAppearance::editWearable(LLWearable *wearable, void *data) +void LLSidepanelAppearance::editWearable(LLWearable *wearable, LLView *data) { - LLSidepanelAppearance *panel = (LLSidepanelAppearance*) data; - panel->toggleLookInfoPanel(FALSE); - panel->toggleWearableEditPanel(TRUE, wearable); + LLSidepanelAppearance *panel = dynamic_cast<LLSidepanelAppearance*>(data); + if (panel) + { + panel->showWearableEditPanel(wearable); + } } // Fetch currently worn items and only enable the New Look button after everything's been @@ -352,23 +418,24 @@ void LLSidepanelAppearance::fetchInventory() { mNewOutfitBtn->setEnabled(false); - LLInventoryFetchObserver::item_ref_t ids; + uuid_vec_t ids; LLUUID item_id; - for(S32 type = (S32)WT_SHAPE; type < (S32)WT_COUNT; ++type) + for(S32 type = (S32)LLWearableType::WT_SHAPE; type < (S32)LLWearableType::WT_COUNT; ++type) { - // MULTI_WEARABLE: - item_id = gAgentWearables.getWearableItemID((EWearableType)type,0); - if(item_id.notNull()) + for (U32 index = 0; index < gAgentWearables.getWearableCount((LLWearableType::EType)type); ++index) { - ids.push_back(item_id); + item_id = gAgentWearables.getWearableItemID((LLWearableType::EType)type, index); + if(item_id.notNull()) + { + ids.push_back(item_id); + } } } - LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); - if( avatar ) + if (isAgentAvatarValid()) { - for (LLVOAvatar::attachment_map_t::const_iterator iter = avatar->mAttachmentPoints.begin(); - iter != avatar->mAttachmentPoints.end(); ++iter) + for (LLVOAvatar::attachment_map_t::const_iterator iter = gAgentAvatarp->mAttachmentPoints.begin(); + iter != gAgentAvatarp->mAttachmentPoints.end(); ++iter) { LLViewerJointAttachment* attachment = iter->second; if (!attachment) continue; @@ -385,11 +452,11 @@ void LLSidepanelAppearance::fetchInventory() } } - LLCurrentlyWornFetchObserver *fetch_worn = new LLCurrentlyWornFetchObserver(this); - fetch_worn->fetchItems(ids); + LLCurrentlyWornFetchObserver *fetch_worn = new LLCurrentlyWornFetchObserver(ids, this); + fetch_worn->startFetch(); // If no items to be fetched, done will never be triggered. - // TODO: Change LLInventoryFetchObserver::fetchItems to trigger done() on this condition. - if (fetch_worn->isEverythingComplete()) + // TODO: Change LLInventoryFetchItemsObserver::fetchItems to trigger done() on this condition. + if (fetch_worn->isFinished()) { fetch_worn->done(); } @@ -403,3 +470,25 @@ void LLSidepanelAppearance::inventoryFetched() { mNewOutfitBtn->setEnabled(true); } + +void LLSidepanelAppearance::setWearablesLoading(bool val) +{ + childSetVisible("wearables_loading_indicator", val); + childSetVisible("edit_outfit_btn", !val); +} + +void LLSidepanelAppearance::showDefaultSubpart() +{ + if (mEditWearable->getVisible()) + { + mEditWearable->showDefaultSubpart(); + } +} + +void LLSidepanelAppearance::updateScrollingPanelList() +{ + if (mEditWearable->getVisible()) + { + mEditWearable->updateScrollingPanelList(); + } +} diff --git a/indra/newview/llsidepanelappearance.h b/indra/newview/llsidepanelappearance.h index aa2e67fd16..812d6362ef 100644 --- a/indra/newview/llsidepanelappearance.h +++ b/indra/newview/llsidepanelappearance.h @@ -36,17 +36,17 @@ #include "llinventoryobserver.h" #include "llinventory.h" -#include "llpanellookinfo.h" +#include "llpaneloutfitedit.h" class LLFilterEditor; class LLCurrentlyWornFetchObserver; -class LLWatchForOutfitRenameObserver; class LLPanelEditWearable; class LLWearable; class LLPanelOutfitsInventory; class LLSidepanelAppearance : public LLPanel { + LOG_CLASS(LLSidepanelAppearance); public: LLSidepanelAppearance(); virtual ~LLSidepanelAppearance(); @@ -56,51 +56,52 @@ public: void refreshCurrentOutfitName(const std::string& name = ""); - static void editWearable(LLWearable *wearable, void *data); + static void editWearable(LLWearable *wearable, LLView *data); void fetchInventory(); void inventoryFetched(); - void updateVerbs(); void onNewOutfitButtonClicked(); + void showOutfitsInventoryPanel(); + void showOutfitEditPanel(); + void showWearableEditPanel(LLWearable *wearable = NULL); + void setWearablesLoading(bool val); + void showDefaultSubpart(); + void updateScrollingPanelList(); + private: void onFilterEdit(const std::string& search_string); + void onVisibilityChange ( const LLSD& new_visibility ); void onOpenOutfitButtonClicked(); void onEditAppearanceButtonClicked(); - void onEditButtonClicked(); - void onBackButtonClicked(); - void onEditWearBackClicked(); - void toggleLookInfoPanel(BOOL visible); - void toggleWearableEditPanel(BOOL visible, LLWearable* wearable); + + void togglMyOutfitsPanel(BOOL visible); + void toggleOutfitEditPanel(BOOL visible, BOOL disable_camera_switch = FALSE); + void toggleWearableEditPanel(BOOL visible, LLWearable* wearable = NULL, BOOL disable_camera_switch = FALSE); LLFilterEditor* mFilterEditor; LLPanelOutfitsInventory* mPanelOutfitsInventory; - LLPanelLookInfo* mLookInfo; + LLPanelOutfitEdit* mOutfitEdit; LLPanelEditWearable* mEditWearable; LLButton* mOpenOutfitBtn; LLButton* mEditAppearanceBtn; - LLButton* mEditBtn; LLButton* mNewOutfitBtn; LLPanel* mCurrOutfitPanel; LLTextBox* mCurrentLookName; - LLTextBox* mOutfitDirtyTag; + LLTextBox* mOutfitStatus; // Used to make sure the user's inventory is in memory. LLCurrentlyWornFetchObserver* mFetchWorn; - // Used to update title when currently worn outfit gets renamed. - LLWatchForOutfitRenameObserver* mOutfitRenameWatcher; - // Search string for filtering landmarks and teleport // history locations std::string mFilterSubString; - // Information type currently shown in Look Information panel - std::string mLookInfoType; - + // Gets set to true when we're opened for the first time. + bool mOpened; }; #endif //LL_LLSIDEPANELAPPEARANCE_H diff --git a/indra/newview/llsidepanelinventory.cpp b/indra/newview/llsidepanelinventory.cpp index 3fd5309947..63b6fe5ef0 100644 --- a/indra/newview/llsidepanelinventory.cpp +++ b/indra/newview/llsidepanelinventory.cpp @@ -33,6 +33,7 @@ #include "llsidepanelinventory.h" #include "llagent.h" +#include "llavataractions.h" #include "llbutton.h" #include "llinventorybridge.h" #include "llinventorypanel.h" @@ -41,6 +42,7 @@ #include "llsidepaneltaskinfo.h" #include "lltabcontainer.h" #include "llselectmgr.h" +#include "llweb.h" static LLRegisterPanelClassWrapper<LLSidepanelInventory> t_inventory("sidepanel_inventory"); @@ -62,13 +64,16 @@ BOOL LLSidepanelInventory::postBuild() // UI elements from inventory panel { mInventoryPanel = getChild<LLPanel>("sidepanel__inventory_panel"); - + mInfoBtn = mInventoryPanel->getChild<LLButton>("info_btn"); mInfoBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onInfoButtonClicked, this)); mShareBtn = mInventoryPanel->getChild<LLButton>("share_btn"); mShareBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onShareButtonClicked, this)); + LLButton* shop_btn = mInventoryPanel->getChild<LLButton>("shop_btn"); + shop_btn->setClickedCallback(boost::bind(&LLSidepanelInventory::onShopButtonClicked, this)); + mWearBtn = mInventoryPanel->getChild<LLButton>("wear_btn"); mWearBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onWearButtonClicked, this)); @@ -83,6 +88,16 @@ BOOL LLSidepanelInventory::postBuild() mPanelMainInventory = mInventoryPanel->getChild<LLPanelMainInventory>("panel_main_inventory"); mPanelMainInventory->setSelectCallback(boost::bind(&LLSidepanelInventory::onSelectionChange, this, _1, _2)); + LLTabContainer* tabs = mPanelMainInventory->getChild<LLTabContainer>("inventory filter tabs"); + tabs->setCommitCallback(boost::bind(&LLSidepanelInventory::updateVerbs, this)); + + /* + EXT-4846 : "Can we suppress the "Landmarks" and "My Favorites" folder since they have their own Task Panel?" + Deferring this until 2.1. + LLInventoryPanel *my_inventory_panel = mPanelMainInventory->getChild<LLInventoryPanel>("All Items"); + my_inventory_panel->addHideFolderType(LLFolderType::FT_LANDMARK); + my_inventory_panel->addHideFolderType(LLFolderType::FT_FAVORITE); + */ } // UI elements from item panel @@ -143,6 +158,12 @@ void LLSidepanelInventory::onInfoButtonClicked() void LLSidepanelInventory::onShareButtonClicked() { + LLAvatarActions::shareWithAvatars(); +} + +void LLSidepanelInventory::onShopButtonClicked() +{ + LLWeb::loadURLExternal(gSavedSettings.getString("MarketplaceURL")); } void LLSidepanelInventory::performActionOnSelection(const std::string &action) @@ -153,7 +174,7 @@ void LLSidepanelInventory::performActionOnSelection(const std::string &action) { return; } - current_item->getListener()->performAction(panel_main_inventory->getActivePanel()->getRootFolder(), panel_main_inventory->getActivePanel()->getModel(), action); + current_item->getListener()->performAction(panel_main_inventory->getActivePanel()->getModel(), action); } void LLSidepanelInventory::onWearButtonClicked() @@ -244,7 +265,9 @@ void LLSidepanelInventory::updateVerbs() mPlayBtn->setEnabled(FALSE); mTeleportBtn->setVisible(FALSE); mTeleportBtn->setEnabled(FALSE); - + + mShareBtn->setEnabled(canShare()); + const LLInventoryItem *item = getSelectedItem(); if (!item) return; @@ -252,7 +275,6 @@ void LLSidepanelInventory::updateVerbs() bool is_single_selection = getSelectedCount() == 1; mInfoBtn->setEnabled(is_single_selection); - mShareBtn->setEnabled(is_single_selection); switch(item->getInventoryType()) { @@ -277,6 +299,25 @@ void LLSidepanelInventory::updateVerbs() } } +bool LLSidepanelInventory::canShare() +{ + LLPanelMainInventory* panel_main_inventory = + mInventoryPanel->getChild<LLPanelMainInventory>("panel_main_inventory"); + + LLFolderView* root_folder = + panel_main_inventory->getActivePanel()->getRootFolder(); + + LLFolderViewItem* current_item = root_folder->hasVisibleChildren() + ? root_folder->getCurSelectedItem() + : NULL; + + LLInvFVBridge* bridge = current_item + ? dynamic_cast <LLInvFVBridge*> (current_item->getListener()) + : NULL; + + return bridge ? bridge->canShare() : false; +} + LLInventoryItem *LLSidepanelInventory::getSelectedItem() { LLPanelMainInventory *panel_main_inventory = mInventoryPanel->getChild<LLPanelMainInventory>("panel_main_inventory"); @@ -293,8 +334,7 @@ LLInventoryItem *LLSidepanelInventory::getSelectedItem() U32 LLSidepanelInventory::getSelectedCount() { LLPanelMainInventory *panel_main_inventory = mInventoryPanel->getChild<LLPanelMainInventory>("panel_main_inventory"); - std::set<LLUUID> selection_list; - panel_main_inventory->getActivePanel()->getRootFolder()->getSelectionList(selection_list); + std::set<LLUUID> selection_list = panel_main_inventory->getActivePanel()->getRootFolder()->getSelectionList(); return selection_list.size(); } diff --git a/indra/newview/llsidepanelinventory.h b/indra/newview/llsidepanelinventory.h index ee11fb6b54..13275d14c0 100644 --- a/indra/newview/llsidepanelinventory.h +++ b/indra/newview/llsidepanelinventory.h @@ -51,8 +51,13 @@ public: /*virtual*/ void onOpen(const LLSD& key); LLInventoryPanel* getActivePanel(); // Returns an active inventory panel, if any. + LLPanelMainInventory* getMainInventoryPanel() const { return mPanelMainInventory; } BOOL isMainInventoryPanelActive() const; + void showItemInfoPanel(); + void showTaskInfoPanel(); + void showInventoryPanel(); + protected: // Tracks highlighted (selected) item in inventory panel. LLInventoryItem *getSelectedItem(); @@ -60,10 +65,8 @@ protected: void onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action); // "wear", "teleport", etc. void performActionOnSelection(const std::string &action); + bool canShare(); - void showItemInfoPanel(); - void showTaskInfoPanel(); - void showInventoryPanel(); void updateVerbs(); // @@ -78,6 +81,7 @@ private: protected: void onInfoButtonClicked(); void onShareButtonClicked(); + void onShopButtonClicked(); void onWearButtonClicked(); void onPlayButtonClicked(); void onTeleportButtonClicked(); diff --git a/indra/newview/llsidepaneliteminfo.cpp b/indra/newview/llsidepaneliteminfo.cpp index 94fe95d215..0ec351965a 100644 --- a/indra/newview/llsidepaneliteminfo.cpp +++ b/indra/newview/llsidepaneliteminfo.cpp @@ -40,6 +40,7 @@ #include "llbutton.h" #include "llfloaterreg.h" #include "llgroupactions.h" +#include "llinventorydefines.h" #include "llinventorymodel.h" #include "llinventoryobserver.h" #include "lllineeditor.h" @@ -109,9 +110,9 @@ BOOL LLSidepanelItemInfo::postBuild() { LLSidepanelInventorySubpanel::postBuild(); - childSetPrevalidate("LabelItemName",&LLLineEditor::prevalidateASCIIPrintableNoPipe); + childSetPrevalidate("LabelItemName",&LLTextValidate::validateASCIIPrintableNoPipe); getChild<LLUICtrl>("LabelItemName")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitName,this)); - childSetPrevalidate("LabelItemDesc",&LLLineEditor::prevalidateASCIIPrintableNoPipe); + childSetPrevalidate("LabelItemDesc",&LLTextValidate::validateASCIIPrintableNoPipe); getChild<LLUICtrl>("LabelItemDesc")->setCommitCallback(boost::bind(&LLSidepanelItemInfo:: onCommitDescription, this)); // Creator information getChild<LLUICtrl>("BtnCreator")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onClickCreator,this)); @@ -231,20 +232,23 @@ void LLSidepanelItemInfo::refreshFromItem(LLViewerInventoryItem* item) // PERMISSIONS LOOKUP // //////////////////////// + llassert(item); + if (!item) return; + // do not enable the UI for incomplete items. - BOOL is_complete = item->isComplete(); + BOOL is_complete = item->isFinished(); const BOOL cannot_restrict_permissions = LLInventoryType::cannotRestrictPermissions(item->getInventoryType()); const BOOL is_calling_card = (item->getInventoryType() == LLInventoryType::IT_CALLINGCARD); const LLPermissions& perm = item->getPermissions(); const BOOL can_agent_manipulate = gAgent.allowOperation(PERM_OWNER, perm, - GP_OBJECT_MANIPULATE); + GP_OBJECT_MANIPULATE); const BOOL can_agent_sell = gAgent.allowOperation(PERM_OWNER, perm, - GP_OBJECT_SET_SALE) && + GP_OBJECT_SET_SALE) && !cannot_restrict_permissions; const BOOL is_link = item->getIsLinkType(); const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH); - bool not_in_trash = item && (item->getUUID() != trash_id) && !gInventory.isObjectDescendentOf(item->getUUID(), trash_id); + bool not_in_trash = (item->getUUID() != trash_id) && !gInventory.isObjectDescendentOf(item->getUUID(), trash_id); // You need permission to modify the object to modify an inventory // item in it. @@ -436,9 +440,9 @@ void LLSidepanelItemInfo::refreshFromItem(LLViewerInventoryItem* item) if (item->getType() == LLAssetType::AT_OBJECT) { U32 flags = item->getFlags(); - slam_perm = flags & LLInventoryItem::II_FLAGS_OBJECT_SLAM_PERM; - overwrite_everyone = flags & LLInventoryItem::II_FLAGS_OBJECT_PERM_OVERWRITE_EVERYONE; - overwrite_group = flags & LLInventoryItem::II_FLAGS_OBJECT_PERM_OVERWRITE_GROUP; + slam_perm = flags & LLInventoryItemFlags::II_FLAGS_OBJECT_SLAM_PERM; + overwrite_everyone = flags & LLInventoryItemFlags::II_FLAGS_OBJECT_PERM_OVERWRITE_EVERYONE; + overwrite_group = flags & LLInventoryItemFlags::II_FLAGS_OBJECT_PERM_OVERWRITE_GROUP; } std::string perm_string; @@ -739,7 +743,7 @@ void LLSidepanelItemInfo::onCommitPermissions() CheckNextOwnerTransfer->get(), PERM_TRANSFER); } if(perm != item->getPermissions() - && item->isComplete()) + && item->isFinished()) { LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item); new_item->setPermissions(perm); @@ -749,7 +753,7 @@ void LLSidepanelItemInfo::onCommitPermissions() if((perm.getMaskNextOwner()!=item->getPermissions().getMaskNextOwner()) && (item->getType() == LLAssetType::AT_OBJECT)) { - flags |= LLInventoryItem::II_FLAGS_OBJECT_SLAM_PERM; + flags |= LLInventoryItemFlags::II_FLAGS_OBJECT_SLAM_PERM; } // If everyone permissions have changed (and this is an object) // then set the overwrite everyone permissions flag so they @@ -757,7 +761,7 @@ void LLSidepanelItemInfo::onCommitPermissions() if ((perm.getMaskEveryone()!=item->getPermissions().getMaskEveryone()) && (item->getType() == LLAssetType::AT_OBJECT)) { - flags |= LLInventoryItem::II_FLAGS_OBJECT_PERM_OVERWRITE_EVERYONE; + flags |= LLInventoryItemFlags::II_FLAGS_OBJECT_PERM_OVERWRITE_EVERYONE; } // If group permissions have changed (and this is an object) // then set the overwrite group permissions flag so they @@ -765,7 +769,7 @@ void LLSidepanelItemInfo::onCommitPermissions() if ((perm.getMaskGroup()!=item->getPermissions().getMaskGroup()) && (item->getType() == LLAssetType::AT_OBJECT)) { - flags |= LLInventoryItem::II_FLAGS_OBJECT_PERM_OVERWRITE_GROUP; + flags |= LLInventoryItemFlags::II_FLAGS_OBJECT_PERM_OVERWRITE_GROUP; } new_item->setFlags(flags); if(mObjectID.isNull()) @@ -869,7 +873,7 @@ void LLSidepanelItemInfo::updateSaleInfo() sale_info.setSaleType(LLSaleInfo::FS_NOT); } if(sale_info != item->getSaleInfo() - && item->isComplete()) + && item->isFinished()) { LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item); @@ -877,7 +881,7 @@ void LLSidepanelItemInfo::updateSaleInfo() if (item->getType() == LLAssetType::AT_OBJECT) { U32 flags = new_item->getFlags(); - flags |= LLInventoryItem::II_FLAGS_OBJECT_SLAM_SALE; + flags |= LLInventoryItemFlags::II_FLAGS_OBJECT_SLAM_SALE; new_item->setFlags(flags); } diff --git a/indra/newview/llsidepaneltaskinfo.cpp b/indra/newview/llsidepaneltaskinfo.cpp index 0b8f66c5f3..3ab71eac64 100644 --- a/indra/newview/llsidepaneltaskinfo.cpp +++ b/indra/newview/llsidepaneltaskinfo.cpp @@ -80,6 +80,7 @@ static LLRegisterPanelClassWrapper<LLSidepanelTaskInfo> t_task_info("sidepanel_t LLSidepanelTaskInfo::LLSidepanelTaskInfo() { setMouseOpaque(FALSE); + LLSelectMgr::instance().mUpdateSignal.connect(boost::bind(&LLSidepanelTaskInfo::refreshAll, this)); } @@ -100,13 +101,15 @@ BOOL LLSidepanelTaskInfo::postBuild() mPayBtn->setClickedCallback(boost::bind(&LLSidepanelTaskInfo::onPayButtonClicked, this)); mBuyBtn = getChild<LLButton>("buy_btn"); mBuyBtn->setClickedCallback(boost::bind(&LLSidepanelTaskInfo::onBuyButtonClicked, this)); + mDetailsBtn = getChild<LLButton>("details_btn"); + mDetailsBtn->setClickedCallback(boost::bind(&LLSidepanelTaskInfo::onDetailsButtonClicked, this)); mLabelGroupName = getChild<LLNameBox>("Group Name Proxy"); childSetCommitCallback("Object Name", LLSidepanelTaskInfo::onCommitName,this); - childSetPrevalidate("Object Name", LLLineEditor::prevalidateASCIIPrintableNoPipe); + childSetPrevalidate("Object Name", LLTextValidate::validateASCIIPrintableNoPipe); childSetCommitCallback("Object Description", LLSidepanelTaskInfo::onCommitDesc,this); - childSetPrevalidate("Object Description", LLLineEditor::prevalidateASCIIPrintableNoPipe); + childSetPrevalidate("Object Description", LLTextValidate::validateASCIIPrintableNoPipe); getChild<LLUICtrl>("button set group")->setCommitCallback(boost::bind(&LLSidepanelTaskInfo::onClickGroup,this)); childSetCommitCallback("checkbox share with group", &LLSidepanelTaskInfo::onCommitGroupShare,this); childSetAction("button deed", &LLSidepanelTaskInfo::onClickDeedToGroup,this); @@ -123,10 +126,8 @@ BOOL LLSidepanelTaskInfo::postBuild() return TRUE; } -// virtual -void LLSidepanelTaskInfo::setVisible(BOOL visible) +/*virtual*/ void LLSidepanelTaskInfo::handleVisibilityChange ( BOOL visible ) { - LLPanel::setVisible(visible); if (visible) { sActivePanel = this; @@ -135,9 +136,12 @@ void LLSidepanelTaskInfo::setVisible(BOOL visible) else { sActivePanel = NULL; + // drop selection reference + mObjectSelection = NULL; } } + void LLSidepanelTaskInfo::disableAll() { childSetEnabled("perm_modify", FALSE); @@ -268,7 +272,6 @@ void LLSidepanelTaskInfo::refresh() // BUG: fails if a root and non-root are both single-selected. const BOOL is_perm_modify = (mObjectSelection->getFirstRootNode() && LLSelectMgr::getInstance()->selectGetRootsModify()) || LLSelectMgr::getInstance()->selectGetModify(); - const LLFocusableElement* keyboard_focus_view = gFocusMgr.getKeyboardFocus(); S32 string_index = 0; std::string MODIFY_INFO_STRINGS[] = @@ -362,14 +365,14 @@ void LLSidepanelTaskInfo::refresh() if (is_one_object) { - if (keyboard_focus_view != LineEditorObjectName) + if (!LineEditorObjectName->hasFocus()) { childSetText("Object Name",nodep->mName); } if (LineEditorObjectDesc) { - if (keyboard_focus_view != LineEditorObjectDesc) + if (!LineEditorObjectDesc->hasFocus()) { LineEditorObjectDesc->setText(nodep->mDescription); } @@ -1122,6 +1125,15 @@ void LLSidepanelTaskInfo::updateVerbs() //mEditBtn->setEnabled(obj && obj->permModify()); */ + LLSafeHandle<LLObjectSelection> object_selection = LLSelectMgr::getInstance()->getSelection(); + const BOOL multi_select = (object_selection->getNumNodes() > 1); + + mOpenBtn->setVisible(!multi_select); + mPayBtn->setVisible(!multi_select); + mBuyBtn->setVisible(!multi_select); + mDetailsBtn->setVisible(multi_select); + mDetailsBtn->setEnabled(multi_select); + mOpenBtn->setEnabled(enable_object_open()); mPayBtn->setEnabled(enable_pay_object()); mBuyBtn->setEnabled(enable_buy_object()); @@ -1145,6 +1157,11 @@ void LLSidepanelTaskInfo::onBuyButtonClicked() doClickAction(CLICK_ACTION_BUY); } +void LLSidepanelTaskInfo::onDetailsButtonClicked() +{ + LLFloaterReg::showInstance("inspect", LLSD()); +} + // virtual void LLSidepanelTaskInfo::save() { @@ -1161,9 +1178,30 @@ void LLSidepanelTaskInfo::save() onCommitIncludeInSearch(getChild<LLCheckBoxCtrl>("search_check"), this); } +// removes keyboard focus so that all fields can be updated +// and then restored focus +void LLSidepanelTaskInfo::refreshAll() +{ + // update UI as soon as we have an object + // but remove keyboard focus first so fields are free to update + LLFocusableElement* focus = NULL; + if (hasFocus()) + { + focus = gFocusMgr.getKeyboardFocus(); + setFocus(FALSE); + } + refresh(); + if (focus) + { + focus->setFocus(TRUE); + } +} + + void LLSidepanelTaskInfo::setObjectSelection(LLObjectSelectionHandle selection) { mObjectSelection = selection; + refreshAll(); } LLSidepanelTaskInfo* LLSidepanelTaskInfo::getActivePanel() diff --git a/indra/newview/llsidepaneltaskinfo.h b/indra/newview/llsidepaneltaskinfo.h index cf36c20767..010173e84e 100644 --- a/indra/newview/llsidepaneltaskinfo.h +++ b/indra/newview/llsidepaneltaskinfo.h @@ -54,7 +54,7 @@ public: virtual ~LLSidepanelTaskInfo(); /*virtual*/ BOOL postBuild(); - /*virtual*/ void setVisible(BOOL visible); + /*virtual*/ void handleVisibilityChange ( BOOL new_visibility ); void setObjectSelection(LLObjectSelectionHandle selection); @@ -67,6 +67,8 @@ protected: /*virtual*/ void save(); /*virtual*/ void updateVerbs(); + void refreshAll(); // ignore current keyboard focus and update all fields + // statics static void onClickClaim(void*); static void onClickRelease(void*); @@ -109,16 +111,18 @@ protected: void onOpenButtonClicked(); void onPayButtonClicked(); void onBuyButtonClicked(); + void onDetailsButtonClicked(); private: LLButton* mOpenBtn; LLButton* mPayBtn; LLButton* mBuyBtn; + LLButton* mDetailsBtn; protected: LLViewerObject* getObject(); private: LLViewerObject* mObject; - LLObjectSelectionHandle mObjectSelection; + LLObjectSelectionHandle mObjectSelection; static LLSidepanelTaskInfo* sActivePanel; }; diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp index 50c47e293e..fed39c362e 100644 --- a/indra/newview/llsidetray.cpp +++ b/indra/newview/llsidetray.cpp @@ -34,7 +34,8 @@ #include "lltextbox.h" -#include "llagent.h" +#include "llagentcamera.h" +#include "llappviewer.h" #include "llbottomtray.h" #include "llsidetray.h" #include "llviewerwindow.h" @@ -248,6 +249,11 @@ LLSideTray::LLSideTray(Params& params) // panel_name should be specified via "parameter" attribute. commit.add("SideTray.ShowPanel", boost::bind(&LLSideTray::showPanel, this, _2, LLUUID::null)); LLTransientFloaterMgr::getInstance()->addControlView(this); + LLView* side_bar_tabs = gViewerWindow->getRootView()->getChildView("side_bar_tabs"); + if (side_bar_tabs != NULL) + { + LLTransientFloaterMgr::getInstance()->addControlView(side_bar_tabs); + } LLPanel::Params p; p.name = "buttons_panel"; @@ -267,9 +273,18 @@ BOOL LLSideTray::postBuild() collapseSideBar(); setMouseOpaque(false); + + LLAppViewer::instance()->setOnLoginCompletedCallback(boost::bind(&LLSideTray::handleLoginComplete, this)); + return true; } +void LLSideTray::handleLoginComplete() +{ + //reset tab to "home" tab if it was changesd during login process + selectTabByName("sidebar_home"); +} + LLSideTrayTab* LLSideTray::getTab(const std::string& name) { return getChild<LLSideTrayTab>(name,false); @@ -464,6 +479,9 @@ void LLSideTray::reflectCollapseChange() } gFloaterView->refresh(); + + LLSD new_value = mCollapsed; + mCollapseSignal(this,new_value); } void LLSideTray::arrange() @@ -541,7 +559,6 @@ void LLSideTray::collapseSideBar() //mActiveTab->setVisible(FALSE); reflectCollapseChange(); setFocus( FALSE ); - } void LLSideTray::expandSideBar() @@ -566,7 +583,6 @@ void LLSideTray::expandSideBar() LLButton* btn = btn_it->second; btn->setImageOverlay( mActiveTab->mImageSelected ); } - } void LLSideTray::highlightFocused() @@ -633,6 +649,7 @@ LLPanel* LLSideTray::showPanel (const std::string& panel_name, const LLSD& para { panel->onOpen(params); } + return panel; } } @@ -715,17 +732,12 @@ bool LLSideTray::isPanelActive(const std::string& panel_name) return (panel->getName() == panel_name); } - -// *TODO: Eliminate magic constants. -static const S32 fake_offset = 132; -static const S32 fake_top_offset = 18; - void LLSideTray::updateSidetrayVisibility() { // set visibility of parent container based on collapsed state if (getParent()) { - getParent()->setVisible(!mCollapsed && !gAgent.cameraMouselook()); + getParent()->setVisible(!mCollapsed && !gAgentCamera.cameraMouselook()); } } diff --git a/indra/newview/llsidetray.h b/indra/newview/llsidetray.h index b1c8675793..3a8d308425 100644 --- a/indra/newview/llsidetray.h +++ b/indra/newview/llsidetray.h @@ -94,7 +94,7 @@ public: * if no such tab - return NULL, otherwise a pointer to the panel * Pass params as array, or they may be overwritten(example - params["name"]="nearby") */ - LLPanel* showPanel (const std::string& panel_name, const LLSD& params); + LLPanel* showPanel (const std::string& panel_name, const LLSD& params = LLSD()); /** * Toggling Side Tray tab which contains "sub_panel" child of "panel_name" panel. @@ -102,7 +102,7 @@ public: * otherwise Side Tray is collapsed. * params are passed to "panel_name" panel onOpen(). */ - void togglePanel (LLPanel* &sub_panel, const std::string& panel_name, const LLSD& params); + void togglePanel (LLPanel* &sub_panel, const std::string& panel_name, const LLSD& params = LLSD()); /* * get the panel (don't show it or do anything else with it) @@ -139,6 +139,8 @@ public: LLPanel* getButtonsPanel() { return mButtonsPanel; } + bool getCollapsed() { return mCollapsed; } + public: virtual ~LLSideTray(){}; @@ -157,6 +159,10 @@ public: void updateSidetrayVisibility(); + commit_signal_t& getCollapseSignal() { return mCollapseSignal; } + + void handleLoginComplete(); + protected: LLSideTrayTab* getTab (const std::string& name); @@ -185,6 +191,8 @@ private: child_vector_t mTabs; LLSideTrayTab* mActiveTab; + commit_signal_t mCollapseSignal; + LLButton* mCollapseButton; bool mCollapsed; diff --git a/indra/newview/llslurl.cpp b/indra/newview/llslurl.cpp index 3343ee88bd..0df7035f84 100644 --- a/indra/newview/llslurl.cpp +++ b/indra/newview/llslurl.cpp @@ -1,10 +1,11 @@ /** - * @file llslurl.cpp - * @brief SLURL manipulation + * @file llurlsimstring.cpp (was llsimurlstring.cpp) + * @brief Handles "SLURL fragments" like Ahern/123/45 for + * startup processing, login screen, prefs, etc. * - * $LicenseInfo:firstyear=2009&license=viewergpl$ + * $LicenseInfo:firstyear=2010&license=viewergpl$ * - * Copyright (c) 2009, Linden Research, Inc. + * Copyright (c) 2006-2010, Linden Research, Inc. * * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab @@ -12,13 +13,12 @@ * ("GPL"), unless you have obtained a separate licensing agreement * ("Other License"), formally executed by you and Linden Lab. Terms of * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * online at http://secondlife.com/developers/opensource/gplv2 * * There are special exceptions to the terms and conditions of the GPL as * it is applied to this Source Code. View the full text of the exception * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * online at http://secondlife.com/developers/opensource/flossexception * * By copying, modifying or distributing this software, you acknowledge * that you have read and understood your obligations described above, @@ -34,128 +34,453 @@ #include "llslurl.h" -#include "llweb.h" +#include "llpanellogin.h" +#include "llviewercontrol.h" +#include "llviewernetwork.h" +#include "llfiltersd2xmlrpc.h" +#include "curl/curl.h" +const char* LLSLURL::SLURL_HTTP_SCHEME = "http"; +const char* LLSLURL::SLURL_HTTPS_SCHEME = "https"; +const char* LLSLURL::SLURL_SECONDLIFE_SCHEME = "secondlife"; +const char* LLSLURL::SLURL_SECONDLIFE_PATH = "secondlife"; +const char* LLSLURL::SLURL_COM = "slurl.com"; +// For DnD - even though www.slurl.com redirects to slurl.com in a browser, you can copy and drag +// text with www.slurl.com or a link explicitly pointing at www.slurl.com so testing for this +// version is required also. -const std::string LLSLURL::PREFIX_SL_HELP = "secondlife://app."; -const std::string LLSLURL::PREFIX_SL = "sl://"; -const std::string LLSLURL::PREFIX_SECONDLIFE = "secondlife://"; -const std::string LLSLURL::PREFIX_SLURL_OLD = "http://slurl.com/secondlife/"; -const std::string LLSLURL::PREFIX_SLURL = "http://maps.secondlife.com/secondlife/"; +const char* LLSLURL::WWW_SLURL_COM = "www.slurl.com"; +const char* LLSLURL::SECONDLIFE_COM = "secondlife.com"; +const char* LLSLURL::MAPS_SECONDLIFE_COM = "maps.secondlife.com"; +const char* LLSLURL::SLURL_X_GRID_LOCATION_INFO_SCHEME = "x-grid-location-info"; +const char* LLSLURL::SLURL_APP_PATH = "app"; +const char* LLSLURL::SLURL_REGION_PATH = "region"; +const char* LLSLURL::SIM_LOCATION_HOME = "home"; +const char* LLSLURL::SIM_LOCATION_LAST = "last"; -const std::string LLSLURL::APP_TOKEN = "app/"; - -// static -std::string LLSLURL::stripProtocol(const std::string& url) +// resolve a simstring from a slurl +LLSLURL::LLSLURL(const std::string& slurl) { - std::string stripped = url; - if (matchPrefix(stripped, PREFIX_SL_HELP)) - { - stripped.erase(0, PREFIX_SL_HELP.length()); - } - else if (matchPrefix(stripped, PREFIX_SL)) - { - stripped.erase(0, PREFIX_SL.length()); - } - else if (matchPrefix(stripped, PREFIX_SECONDLIFE)) + // by default we go to agni. + mType = INVALID; + LL_INFOS("AppInit") << "SLURL: " << slurl << LL_ENDL; + if(slurl == SIM_LOCATION_HOME) { - stripped.erase(0, PREFIX_SECONDLIFE.length()); + mType = HOME_LOCATION; } - else if (matchPrefix(stripped, PREFIX_SLURL)) + else if(slurl.empty() || (slurl == SIM_LOCATION_LAST)) { - stripped.erase(0, PREFIX_SLURL.length()); + + mType = LAST_LOCATION; } - else if (matchPrefix(stripped, PREFIX_SLURL_OLD)) + else { - stripped.erase(0, PREFIX_SLURL_OLD.length()); + LLURI slurl_uri; + // parse the slurl as a uri + if(slurl.find(':') == std::string::npos) + { + // There may be no scheme ('secondlife:' etc.) passed in. In that case + // we want to normalize the slurl by putting the appropriate scheme + // in front of the slurl. So, we grab the appropriate slurl base + // from the grid manager which may be http://slurl.com/secondlife/ for maingrid, or + // https://<hostname>/region/ for Standalone grid (the word region, not the region name) + // these slurls are typically passed in from the 'starting location' box on the login panel, + // where the user can type in <regionname>/<x>/<y>/<z> + std::string fixed_slurl = LLGridManager::getInstance()->getSLURLBase(); + // the slurl that was passed in might have a prepended /, or not. So, + // we strip off the prepended '/' so we don't end up with http://slurl.com/secondlife/<region>/<x>/<y>/<z> + // or some such. + + if(slurl[0] == '/') + { + fixed_slurl += slurl.substr(1); + } + else + { + fixed_slurl += slurl; + } + // We then load the slurl into a LLURI form + slurl_uri = LLURI(fixed_slurl); + } + else + { + // as we did have a scheme, implying a URI style slurl, we + // simply parse it as a URI + slurl_uri = LLURI(slurl); + } + + LLSD path_array = slurl_uri.pathArray(); + + // determine whether it's a maingrid URI or an Standalone/open style URI + // by looking at the scheme. If it's a 'secondlife:' slurl scheme or + // 'sl:' scheme, we know it's maingrid + + // At the end of this if/else block, we'll have determined the grid, + // and the slurl type (APP or LOCATION) + if(slurl_uri.scheme() == LLSLURL::SLURL_SECONDLIFE_SCHEME) + { + // parse a maingrid style slurl. We know the grid is maingrid + // so grab it. + // A location slurl for maingrid (with the special schemes) can be in the form + // secondlife://<regionname>/<x>/<y>/<z> + // or + // secondlife://<Grid>/secondlife/<region>/<x>/<y>/<z> + // where if grid is empty, it specifies Agni + + // An app style slurl for maingrid can be + // secondlife://<Grid>/app/<app parameters> + // where an empty grid implies Agni + + // we'll start by checking the top of the 'path' which will be + // either 'app', 'secondlife', or <x>. + + // default to maingrid + + mGrid = MAINGRID; + + if ((path_array[0].asString() == LLSLURL::SLURL_SECONDLIFE_PATH) || + (path_array[0].asString() == LLSLURL::SLURL_APP_PATH)) + { + // it's in the form secondlife://<grid>/(app|secondlife) + // so parse the grid name to derive the grid ID + if (!slurl_uri.hostName().empty()) + { + mGrid = LLGridManager::getInstance()->getGridByLabel(slurl_uri.hostName()); + } + else if(path_array[0].asString() == LLSLURL::SLURL_SECONDLIFE_PATH) + { + // If the slurl is in the form secondlife:///secondlife/<region> form, + // then we are in fact on maingrid. + mGrid = MAINGRID; + } + else if(path_array[0].asString() == LLSLURL::SLURL_APP_PATH) + { + // for app style slurls, where no grid name is specified, assume the currently + // selected or logged in grid. + mGrid = LLGridManager::getInstance()->getGrid(); + } + + if(mGrid.empty()) + { + // we couldn't find the grid in the grid manager, so bail + return; + } + // set the type as appropriate. + if(path_array[0].asString() == LLSLURL::SLURL_SECONDLIFE_PATH) + { + mType = LOCATION; + } + else + { + mType = APP; + } + path_array.erase(0); + } + else + { + // it wasn't a /secondlife/<region> or /app/<params>, so it must be secondlife://<region> + // therefore the hostname will be the region name, and it's a location type + mType = LOCATION; + // 'normalize' it so the region name is in fact the head of the path_array + path_array.insert(0, slurl_uri.hostName()); + } + } + else if((slurl_uri.scheme() == LLSLURL::SLURL_HTTP_SCHEME) || + (slurl_uri.scheme() == LLSLURL::SLURL_HTTPS_SCHEME) || + (slurl_uri.scheme() == LLSLURL::SLURL_X_GRID_LOCATION_INFO_SCHEME)) + { + // *HACK: ignore http://secondlife.com/ URLs so that we can use + // http://secondlife.com/app/ redirect URLs + // This is only necessary while the server returns Release Note + // urls using this format rather that pointing to the wiki + if ((slurl_uri.scheme() == LLSLURL::SLURL_HTTP_SCHEME || + slurl_uri.scheme() == LLSLURL::SLURL_HTTPS_SCHEME) && + slurl_uri.hostName() == LLSLURL::SECONDLIFE_COM) + return; + + // We're dealing with either a Standalone style slurl or slurl.com slurl + if ((slurl_uri.hostName() == LLSLURL::SLURL_COM) || + (slurl_uri.hostName() == LLSLURL::WWW_SLURL_COM) || + (slurl_uri.hostName() == LLSLURL::MAPS_SECONDLIFE_COM)) + { + // slurl.com implies maingrid + mGrid = MAINGRID; + } + else + { + // As it's a Standalone grid/open, we will always have a hostname, as Standalone/open style + // urls are properly formed, unlike the stinky maingrid style + mGrid = slurl_uri.hostName(); + } + if (path_array.size() == 0) + { + // um, we need a path... + return; + } + + // we need to normalize the urls so + // the path portion starts with the 'command' that we want to do + // it can either be region or app. + if ((path_array[0].asString() == LLSLURL::SLURL_REGION_PATH) || + (path_array[0].asString() == LLSLURL::SLURL_SECONDLIFE_PATH)) + { + // strip off 'region' or 'secondlife' + path_array.erase(0); + // it's a location + mType = LOCATION; + } + else if (path_array[0].asString() == LLSLURL::SLURL_APP_PATH) + { + mType = APP; + path_array.erase(0); + // leave app appended. + } + else + { + // not a valid https/http/x-grid-location-info slurl, so it'll likely just be a URL + return; + } + } + else + { + // invalid scheme, so bail + return; + } + + + if(path_array.size() == 0) + { + // we gotta have some stuff after the specifier as to whether it's a region or command + return; + } + + // now that we know whether it's an app slurl or a location slurl, + // parse the slurl into the proper data structures. + if(mType == APP) + { + // grab the app command type and strip it (could be a command to jump somewhere, + // or whatever ) + mAppCmd = path_array[0].asString(); + path_array.erase(0); + + // Grab the parameters + mAppPath = path_array; + // and the query + mAppQuery = slurl_uri.query(); + mAppQueryMap = slurl_uri.queryMap(); + return; + } + else if(mType == LOCATION) + { + // at this point, head of the path array should be [ <region>, <x>, <y>, <z> ] where x, y and z + // are collectively optional + // are optional + mRegion = LLURI::unescape(path_array[0].asString()); + path_array.erase(0); + + // parse the x, y, z + if(path_array.size() >= 3) + { + + mPosition = LLVector3(path_array); + if((F32(mPosition[VX]) < 0.f) || + (mPosition[VX] > REGION_WIDTH_METERS) || + (F32(mPosition[VY]) < 0.f) || + (mPosition[VY] > REGION_WIDTH_METERS) || + (F32(mPosition[VZ]) < 0.f) || + (mPosition[VZ] > REGION_HEIGHT_METERS)) + { + mType = INVALID; + return; + } + + } + else + { + // if x, y and z were not fully passed in, go to the middle of the region. + // teleport will adjust the actual location to make sure you're on the ground + // and such + mPosition = LLVector3(REGION_WIDTH_METERS/2, REGION_WIDTH_METERS/2, 0); + } + } } +} - - return stripped; + +// Create a slurl for the middle of the region +LLSLURL::LLSLURL(const std::string& grid, + const std::string& region) +{ + mGrid = grid; + mRegion = region; + mType = LOCATION; + mPosition = LLVector3((F64)REGION_WIDTH_METERS/2, (F64)REGION_WIDTH_METERS/2, 0); } -// static -bool LLSLURL::isSLURL(const std::string& url) + + +// create a slurl given the position. The position will be modded with the region +// width handling global positions as well +LLSLURL::LLSLURL(const std::string& grid, + const std::string& region, + const LLVector3& position) { - if (matchPrefix(url, PREFIX_SL_HELP)) return true; - if (matchPrefix(url, PREFIX_SL)) return true; - if (matchPrefix(url, PREFIX_SECONDLIFE)) return true; - if (matchPrefix(url, PREFIX_SLURL)) return true; - if (matchPrefix(url, PREFIX_SLURL_OLD)) return true; - - return false; + mGrid = grid; + mRegion = region; + S32 x = llround( (F32)fmod( position[VX], (F32)REGION_WIDTH_METERS ) ); + S32 y = llround( (F32)fmod( position[VY], (F32)REGION_WIDTH_METERS ) ); + S32 z = llround( (F32)position[VZ] ); + mType = LOCATION; + mPosition = LLVector3(x, y, z); } -// static -bool LLSLURL::isSLURLCommand(const std::string& url) -{ - if (matchPrefix(url, PREFIX_SL + APP_TOKEN) || - matchPrefix(url, PREFIX_SECONDLIFE + "/" + APP_TOKEN) || - matchPrefix(url, PREFIX_SLURL + APP_TOKEN) || - matchPrefix(url, PREFIX_SLURL_OLD + APP_TOKEN) ) - { - return true; - } - return false; +// create a simstring +LLSLURL::LLSLURL(const std::string& region, + const LLVector3& position) +{ + *this = LLSLURL(LLGridManager::getInstance()->getGrid(), + region, position); } -// static -bool LLSLURL::isSLURLHelp(const std::string& url) +// create a slurl from a global position +LLSLURL::LLSLURL(const std::string& grid, + const std::string& region, + const LLVector3d& global_position) { - return matchPrefix(url, PREFIX_SL_HELP); + *this = LLSLURL(grid, + region, LLVector3(global_position.mdV[VX], + global_position.mdV[VY], + global_position.mdV[VZ])); } -// static -std::string LLSLURL::buildSLURL(const std::string& regionname, S32 x, S32 y, S32 z) +// create a slurl from a global position +LLSLURL::LLSLURL(const std::string& region, + const LLVector3d& global_position) { - std::string slurl = PREFIX_SLURL + regionname + llformat("/%d/%d/%d",x,y,z); - slurl = LLWeb::escapeURL( slurl ); - return slurl; + *this = LLSLURL(LLGridManager::getInstance()->getGrid(), + region, global_position); } -// static -std::string LLSLURL::buildCommand(const char* noun, const LLUUID& id, const char* verb) +LLSLURL::LLSLURL(const std::string& command, const LLUUID&id, const std::string& verb) { - std::string slurl = llformat("secondlife:///app/%s/%s/%s", - noun, id.asString().c_str(), verb); - return slurl; + mType = APP; + mAppCmd = command; + mAppPath = LLSD::emptyArray(); + mAppPath.append(LLSD(id)); + mAppPath.append(LLSD(verb)); } -// static -std::string LLSLURL::buildUnescapedSLURL(const std::string& regionname, S32 x, S32 y, S32 z) + +std::string LLSLURL::getSLURLString() const { - std::string unescapedslurl = PREFIX_SLURL + regionname + llformat("/%d/%d/%d",x,y,z); - return unescapedslurl; + switch(mType) + { + case HOME_LOCATION: + return SIM_LOCATION_HOME; + case LAST_LOCATION: + return SIM_LOCATION_LAST; + case LOCATION: + { + // lookup the grid + S32 x = llround( (F32)mPosition[VX] ); + S32 y = llround( (F32)mPosition[VY] ); + S32 z = llround( (F32)mPosition[VZ] ); + return LLGridManager::getInstance()->getSLURLBase(mGrid) + + LLURI::escape(mRegion) + llformat("/%d/%d/%d",x,y,z); + } + case APP: + { + std::ostringstream app_url; + app_url << LLGridManager::getInstance()->getAppSLURLBase() << "/" << mAppCmd; + for(LLSD::array_const_iterator i = mAppPath.beginArray(); + i != mAppPath.endArray(); + i++) + { + app_url << "/" << i->asString(); + } + if(mAppQuery.length() > 0) + { + app_url << "?" << mAppQuery; + } + return app_url.str(); + } + default: + LL_WARNS("AppInit") << "Unexpected SLURL type for SLURL string" << (int)mType << LL_ENDL; + return std::string(); + } } -// static -std::string LLSLURL::buildSLURLfromPosGlobal(const std::string& regionname, - const LLVector3d& global_pos, - bool escaped /*= true*/) +std::string LLSLURL::getLoginString() const { - S32 x, y, z; - globalPosToXYZ(global_pos, x, y, z); - if(escaped) + + std::stringstream unescaped_start; + switch(mType) { - return buildSLURL(regionname, x, y, z); + case LOCATION: + unescaped_start << "uri:" + << mRegion << "&" + << llround(mPosition[0]) << "&" + << llround(mPosition[1]) << "&" + << llround(mPosition[2]); + break; + case HOME_LOCATION: + unescaped_start << "home"; + break; + case LAST_LOCATION: + unescaped_start << "last"; + break; + default: + LL_WARNS("AppInit") << "Unexpected SLURL type for login string" << (int)mType << LL_ENDL; + break; } - else + return xml_escape_string(unescaped_start.str()); +} + +bool LLSLURL::operator==(const LLSLURL& rhs) +{ + if(rhs.mType != mType) return false; + switch(mType) { - return buildUnescapedSLURL(regionname, x, y, z); + case LOCATION: + return ((mGrid == rhs.mGrid) && + (mRegion == rhs.mRegion) && + (mPosition == rhs.mPosition)); + case APP: + return getSLURLString() == rhs.getSLURLString(); + + case HOME_LOCATION: + case LAST_LOCATION: + return true; + default: + return false; } } -// static -bool LLSLURL::matchPrefix(const std::string& url, const std::string& prefix) +bool LLSLURL::operator !=(const LLSLURL& rhs) { - std::string test_prefix = url.substr(0, prefix.length()); - LLStringUtil::toLower(test_prefix); - return test_prefix == prefix; + return !(*this == rhs); } -void LLSLURL::globalPosToXYZ(const LLVector3d& pos, S32& x, S32& y, S32& z) +std::string LLSLURL::getLocationString() const { - x = llround((F32)fmod(pos.mdV[VX], (F64)REGION_WIDTH_METERS)); - y = llround((F32)fmod(pos.mdV[VY], (F64)REGION_WIDTH_METERS)); - z = llround((F32)pos.mdV[VZ]); + return llformat("%s/%d/%d/%d", + mRegion.c_str(), + (int)llround(mPosition[0]), + (int)llround(mPosition[1]), + (int)llround(mPosition[2])); } +std::string LLSLURL::asString() const +{ + std::ostringstream result; + result << " mAppCmd:" << getAppCmd() << + " mAppPath:" + getAppPath().asString() << + " mAppQueryMap:" + getAppQueryMap().asString() << + " mAppQuery: " + getAppQuery() << + " mGrid: " + getGrid() << + " mRegion: " + getRegion() << + " mPosition: " << + " mType: " << mType << + " mPosition: " << mPosition; + return result.str(); +} + diff --git a/indra/newview/llslurl.h b/indra/newview/llslurl.h index 21b32ce409..e9b0e7f52a 100644 --- a/indra/newview/llslurl.h +++ b/indra/newview/llslurl.h @@ -1,10 +1,11 @@ -/** +/** * @file llslurl.h - * @brief SLURL manipulation + * @brief Handles "SLURL fragments" like Ahern/123/45 for + * startup processing, login screen, prefs, etc. * - * $LicenseInfo:firstyear=2009&license=viewergpl$ + * $LicenseInfo:firstyear=2010&license=viewergpl$ * - * Copyright (c) 2009, Linden Research, Inc. + * Copyright (c) 2006-2010, Linden Research, Inc. * * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab @@ -12,13 +13,12 @@ * ("GPL"), unless you have obtained a separate licensing agreement * ("Other License"), formally executed by you and Linden Lab. Terms of * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * online at http://secondlife.com/developers/opensource/gplv2 * * There are special exceptions to the terms and conditions of the GPL as * it is applied to this Source Code. View the full text of the exception * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * online at http://secondlife.com/developers/opensource/flossexception * * By copying, modifying or distributing this software, you acknowledge * that you have read and understood your obligations described above, @@ -29,79 +29,85 @@ * COMPLETENESS OR PERFORMANCE. * $/LicenseInfo$ */ +#ifndef LLSLURL_H +#define LLSLURL_H -#ifndef LL_SLURL_H -#define LL_SLURL_H +#include "llstring.h" -#include <string> -// IAN BUG: where should this live? -// IAN BUG: are static utility functions right? See LLUUID. -// question of whether to have a LLSLURL object or a -// some of this was moved from LLURLDispatcher +// represents a location in a grid -/** - * SLURL manipulation - */ class LLSLURL { public: - static const std::string PREFIX_SL_HELP; - static const std::string PREFIX_SL; - static const std::string PREFIX_SECONDLIFE; - static const std::string PREFIX_SLURL; - static const std::string PREFIX_SLURL_OLD; - - static const std::string APP_TOKEN; - - /** - * Is this any sort of secondlife:// or sl:// URL? - */ - static bool isSLURL(const std::string& url); - - /** - * Is this a special secondlife://app/ URL? - */ - static bool isSLURLCommand(const std::string& url); - - /** - * Not sure what it is. - */ - static bool isSLURLHelp(const std::string& url); - - /** - * builds: http://slurl.com/secondlife/Region%20Name/x/y/z/ escaping result url. - */ - static std::string buildSLURL(const std::string& regionname, S32 x, S32 y, S32 z); - - /// Build a SLURL like secondlife:///app/agent/<uuid>/inspect - static std::string buildCommand(const char* noun, const LLUUID& id, const char* verb); - - /** - * builds: http://slurl.com/secondlife/Region Name/x/y/z/ without escaping result url. - */ - static std::string buildUnescapedSLURL(const std::string& regionname, S32 x, S32 y, S32 z); - - /** - * builds SLURL from global position. Returns escaped or unescaped url. - * Returns escaped url by default. - */ - static std::string buildSLURLfromPosGlobal(const std::string& regionname, - const LLVector3d& global_pos, - bool escaped = true); - /** - * Strip protocol part from the URL. - */ - static std::string stripProtocol(const std::string& url); - - /** - * Convert global position to X, Y Z - */ - static void globalPosToXYZ(const LLVector3d& pos, S32& x, S32& y, S32& z); - -private: - static bool matchPrefix(const std::string& url, const std::string& prefix); - + static const char* SLURL_HTTPS_SCHEME; + static const char* SLURL_HTTP_SCHEME; + static const char* SLURL_SL_SCHEME; + static const char* SLURL_SECONDLIFE_SCHEME; + static const char* SLURL_SECONDLIFE_PATH; + static const char* SLURL_COM; + static const char* WWW_SLURL_COM; + static const char* SECONDLIFE_COM; + static const char* MAPS_SECONDLIFE_COM; + static const char* SLURL_X_GRID_LOCATION_INFO_SCHEME; + static LLSLURL START_LOCATION; + static const char* SIM_LOCATION_HOME; + static const char* SIM_LOCATION_LAST; + static const char* SLURL_APP_PATH; + static const char* SLURL_REGION_PATH; + + enum SLURL_TYPE { + INVALID, + LOCATION, + HOME_LOCATION, + LAST_LOCATION, + APP, + HELP + }; + + + LLSLURL(): mType(INVALID) { } + LLSLURL(const std::string& slurl); + LLSLURL(const std::string& grid, const std::string& region); + LLSLURL(const std::string& region, const LLVector3& position); + LLSLURL(const std::string& grid, const std::string& region, const LLVector3& position); + LLSLURL(const std::string& grid, const std::string& region, const LLVector3d& global_position); + LLSLURL(const std::string& region, const LLVector3d& global_position); + LLSLURL(const std::string& command, const LLUUID&id, const std::string& verb); + + SLURL_TYPE getType() const { return mType; } + + std::string getSLURLString() const; + std::string getLoginString() const; + std::string getLocationString() const; + std::string getGrid() const { return mGrid; } + std::string getRegion() const { return mRegion; } + LLVector3 getPosition() const { return mPosition; } + std::string getAppCmd() const { return mAppCmd; } + std::string getAppQuery() const { return mAppQuery; } + LLSD getAppQueryMap() const { return mAppQueryMap; } + LLSD getAppPath() const { return mAppPath; } + + bool isValid() const { return mType != INVALID; } + bool isSpatial() const { return (mType == LAST_LOCATION) || (mType == HOME_LOCATION) || (mType == LOCATION); } + + bool operator==(const LLSLURL& rhs); + bool operator!=(const LLSLURL&rhs); + + std::string asString() const ; + +protected: + SLURL_TYPE mType; + + // used for Apps and Help + std::string mAppCmd; + LLSD mAppPath; + LLSD mAppQueryMap; + std::string mAppQuery; + + std::string mGrid; // reference to grid manager grid + std::string mRegion; + LLVector3 mPosition; }; -#endif +#endif // LLSLURL_H diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp index 2a57d48f16..d6e9256fee 100644 --- a/indra/newview/llspatialpartition.cpp +++ b/indra/newview/llspatialpartition.cpp @@ -3380,7 +3380,8 @@ LLDrawInfo::LLDrawInfo(U16 start, U16 end, U32 count, U32 offset, mVSize(0.f), mGroup(NULL), mFace(NULL), - mDistance(0.f) + mDistance(0.f), + mDrawMode(LLRender::TRIANGLES) { mDebugColor = (rand() << 16) + rand(); if (mStart >= mVertexBuffer->getRequestedVerts() || diff --git a/indra/newview/llspatialpartition.h b/indra/newview/llspatialpartition.h index 64c2a9acbc..7896488379 100644 --- a/indra/newview/llspatialpartition.h +++ b/indra/newview/llspatialpartition.h @@ -93,6 +93,7 @@ public: LLFace* mFace; //associated face F32 mDistance; LLVector3 mExtents[2]; + U32 mDrawMode; struct CompareTexture { diff --git a/indra/newview/llspeakbutton.cpp b/indra/newview/llspeakbutton.cpp index c5c311ed33..d7de050636 100644 --- a/indra/newview/llspeakbutton.cpp +++ b/indra/newview/llspeakbutton.cpp @@ -59,9 +59,9 @@ LLSpeakButton::Params::Params() void LLSpeakButton::draw() { - // gVoiceClient is the authoritative global source of info regarding our open-mic state, we merely reflect that state. - bool openmic = gVoiceClient->getUserPTTState(); - bool voiceenabled = gVoiceClient->voiceEnabled(); + // LLVoiceClient::getInstance() is the authoritative global source of info regarding our open-mic state, we merely reflect that state. + bool openmic = LLVoiceClient::getInstance()->getUserPTTState(); + bool voiceenabled = LLVoiceClient::getInstance()->voiceEnabled(); mSpeakBtn->setToggleState(openmic && voiceenabled); mOutputMonitor->setIsMuted(!voiceenabled); LLUICtrl::draw(); @@ -176,11 +176,11 @@ void LLSpeakButton::setLabelVisible(bool visible) void LLSpeakButton::onMouseDown_SpeakBtn() { bool down = true; - gVoiceClient->inputUserControlState(down); // this method knows/care about whether this translates into a toggle-to-talk or down-to-talk + LLVoiceClient::getInstance()->inputUserControlState(down); // this method knows/care about whether this translates into a toggle-to-talk or down-to-talk } void LLSpeakButton::onMouseUp_SpeakBtn() { bool down = false; - gVoiceClient->inputUserControlState(down); + LLVoiceClient::getInstance()->inputUserControlState(down); } diff --git a/indra/newview/llspeakers.cpp b/indra/newview/llspeakers.cpp index 786fa24e65..bf00b47c21 100644 --- a/indra/newview/llspeakers.cpp +++ b/indra/newview/llspeakers.cpp @@ -37,7 +37,6 @@ #include "llagent.h" #include "llappviewer.h" #include "llimview.h" -#include "llmutelist.h" #include "llsdutil.h" #include "lluicolortable.h" #include "llviewerobjectlist.h" @@ -85,7 +84,7 @@ void LLSpeaker::onAvatarNameLookup(const LLUUID& id, const std::string& first, c bool LLSpeaker::isInVoiceChannel() { - return mStatus == LLSpeaker::STATUS_VOICE_ACTIVE || mStatus == LLSpeaker::STATUS_MUTED; + return mStatus <= LLSpeaker::STATUS_VOICE_ACTIVE || mStatus == LLSpeaker::STATUS_MUTED; } LLSpeakerUpdateModeratorEvent::LLSpeakerUpdateModeratorEvent(LLSpeaker* source) @@ -175,6 +174,11 @@ BOOL LLSpeakerActionTimer::tick() return TRUE; } +void LLSpeakerActionTimer::unset() +{ + mActionCallback = 0; +} + LLSpeakersDelayActionsStorage::LLSpeakersDelayActionsStorage(LLSpeakerActionTimer::action_callback_t action_cb, F32 action_delay) : mActionCallback(action_cb) , mActionDelay(action_delay) @@ -205,7 +209,7 @@ void LLSpeakersDelayActionsStorage::setActionTimer(const LLUUID& speaker_id) } } -void LLSpeakersDelayActionsStorage::unsetActionTimer(const LLUUID& speaker_id, bool delete_it) +void LLSpeakersDelayActionsStorage::unsetActionTimer(const LLUUID& speaker_id) { if (mActionTimersMap.size() == 0) return; @@ -213,10 +217,7 @@ void LLSpeakersDelayActionsStorage::unsetActionTimer(const LLUUID& speaker_id, b if (it_speaker != mActionTimersMap.end()) { - if (delete_it) - { - delete it_speaker->second; - } + it_speaker->second->unset(); mActionTimersMap.erase(it_speaker); } } @@ -233,8 +234,7 @@ void LLSpeakersDelayActionsStorage::removeAllTimers() bool LLSpeakersDelayActionsStorage::onTimerActionCallback(const LLUUID& speaker_id) { - bool delete_it = false; // we're *in* this timer, return true to delete it, don't manually delete it - unsetActionTimer(speaker_id, delete_it); + unsetActionTimer(speaker_id); if (mActionCallback) { @@ -251,6 +251,8 @@ bool LLSpeakersDelayActionsStorage::onTimerActionCallback(const LLUUID& speaker_ LLSpeakerMgr::LLSpeakerMgr(LLVoiceChannel* channelp) : mVoiceChannel(channelp) +, mVoiceModerated(false) +, mModerateModeHandledFirstTime(false) { static LLUICachedControl<F32> remove_delay ("SpeakerParticipantRemoveDelay", 10.0); @@ -293,15 +295,40 @@ LLPointer<LLSpeaker> LLSpeakerMgr::setSpeaker(const LLUUID& id, const std::strin } } - bool delete_it = true; - mSpeakerDelayRemover->unsetActionTimer(speakerp->mID, delete_it); - + mSpeakerDelayRemover->unsetActionTimer(speakerp->mID); return speakerp; } +// *TODO: Once way to request the current voice channel moderation mode is implemented +// this method with related code should be removed. +/* + Initializes "moderate_mode" of voice session on first join. + + This is WORKAROUND because a way to request the current voice channel moderation mode exists + but is not implemented in viewer yet. See EXT-6937. +*/ +void LLSpeakerMgr::initVoiceModerateMode() +{ + if (!mModerateModeHandledFirstTime && (mVoiceChannel && mVoiceChannel->isActive())) + { + LLPointer<LLSpeaker> speakerp; + + if (mSpeakers.find(gAgentID) != mSpeakers.end()) + { + speakerp = mSpeakers[gAgentID]; + } + + if (speakerp.notNull()) + { + mVoiceModerated = speakerp->mModeratorMutedVoice; + mModerateModeHandledFirstTime = true; + } + } +} + void LLSpeakerMgr::update(BOOL resort_ok) { - if (!gVoiceClient) + if (!LLVoiceClient::getInstance()) { return; } @@ -315,7 +342,7 @@ void LLSpeakerMgr::update(BOOL resort_ok) } // update status of all current speakers - BOOL voice_channel_active = (!mVoiceChannel && gVoiceClient->inProximalChannel()) || (mVoiceChannel && mVoiceChannel->isActive()); + BOOL voice_channel_active = (!mVoiceChannel && LLVoiceClient::getInstance()->inProximalChannel()) || (mVoiceChannel && mVoiceChannel->isActive()); for (speaker_map_t::iterator speaker_it = mSpeakers.begin(); speaker_it != mSpeakers.end();) { LLUUID speaker_id = speaker_it->first; @@ -323,21 +350,21 @@ void LLSpeakerMgr::update(BOOL resort_ok) speaker_map_t::iterator cur_speaker_it = speaker_it++; - if (voice_channel_active && gVoiceClient->getVoiceEnabled(speaker_id)) + if (voice_channel_active && LLVoiceClient::getInstance()->getVoiceEnabled(speaker_id)) { - speakerp->mSpeechVolume = gVoiceClient->getCurrentPower(speaker_id); - BOOL moderator_muted_voice = gVoiceClient->getIsModeratorMuted(speaker_id); + speakerp->mSpeechVolume = LLVoiceClient::getInstance()->getCurrentPower(speaker_id); + BOOL moderator_muted_voice = LLVoiceClient::getInstance()->getIsModeratorMuted(speaker_id); if (moderator_muted_voice != speakerp->mModeratorMutedVoice) { speakerp->mModeratorMutedVoice = moderator_muted_voice; speakerp->fireEvent(new LLSpeakerVoiceModerationEvent(speakerp)); } - if (gVoiceClient->getOnMuteList(speaker_id) || speakerp->mModeratorMutedVoice) + if (LLVoiceClient::getInstance()->getOnMuteList(speaker_id) || speakerp->mModeratorMutedVoice) { speakerp->mStatus = LLSpeaker::STATUS_MUTED; } - else if (gVoiceClient->getIsSpeaking(speaker_id)) + else if (LLVoiceClient::getInstance()->getIsSpeaking(speaker_id)) { // reset inactivity expiration if (speakerp->mStatus != LLSpeaker::STATUS_SPEAKING) @@ -419,19 +446,21 @@ void LLSpeakerMgr::update(BOOL resort_ok) void LLSpeakerMgr::updateSpeakerList() { // are we bound to the currently active voice channel? - if ((!mVoiceChannel && gVoiceClient->inProximalChannel()) || (mVoiceChannel && mVoiceChannel->isActive())) - { - LLVoiceClient::participantMap* participants = gVoiceClient->getParticipantList(); - if(participants) + if ((!mVoiceChannel && LLVoiceClient::getInstance()->inProximalChannel()) || (mVoiceChannel && mVoiceChannel->isActive())) + { + std::set<LLUUID> participants; + LLVoiceClient::getInstance()->getParticipantList(participants); + // add new participants to our list of known speakers + for (std::set<LLUUID>::iterator participant_it = participants.begin(); + participant_it != participants.end(); + ++participant_it) { - LLVoiceClient::participantMap::iterator participant_it; + setSpeaker(*participant_it, + LLVoiceClient::getInstance()->getDisplayName(*participant_it), + LLSpeaker::STATUS_VOICE_ACTIVE, + (LLVoiceClient::getInstance()->isParticipantAvatar(*participant_it)?LLSpeaker::SPEAKER_AGENT:LLSpeaker::SPEAKER_EXTERNAL)); + - // add new participants to our list of known speakers - for (participant_it = participants->begin(); participant_it != participants->end(); ++participant_it) - { - LLVoiceClient::participantState* participantp = participant_it->second; - setSpeaker(participantp->mAvatarID, participantp->mDisplayName, LLSpeaker::STATUS_VOICE_ACTIVE, (participantp->isAvatar()?LLSpeaker::SPEAKER_AGENT:LLSpeaker::SPEAKER_EXTERNAL)); - } } } } @@ -521,7 +550,7 @@ void LLSpeakerMgr::speakerChatted(const LLUUID& speaker_id) BOOL LLSpeakerMgr::isVoiceActive() { // mVoiceChannel = NULL means current voice channel, whatever it is - return LLVoiceClient::voiceEnabled() && mVoiceChannel && mVoiceChannel->isActive(); + return LLVoiceClient::getInstance()->voiceEnabled() && mVoiceChannel && mVoiceChannel->isActive(); } @@ -761,43 +790,26 @@ void LLIMSpeakerMgr::moderateVoiceParticipant(const LLUUID& avatar_id, bool unmu new ModerationResponder(getSessionID())); } -void LLIMSpeakerMgr::moderateVoiceOtherParticipants(const LLUUID& excluded_avatar_id, bool unmute_everyone_else) +void LLIMSpeakerMgr::moderateVoiceAllParticipants( bool unmute_everyone ) { - // *TODO: mantipov: add more intellectual processing of several following requests if it is needed. - /* - Such situation should be tested: - "Moderator sends the same second request before first response is come" - Moderator sends "mute everyone else" for A and then for B - two requests to disallow voice chat are sent - UUID of B is stored. - Then first response (to disallow voice chat) is come - request to allow voice for stored avatar (B) - Then second response (to disallow voice chat) is come - have nothing to do, the latest selected speaker is already enabled - - What can happen? - If request to allow voice for stored avatar (B) is processed on server BEFORE - second request to disallow voice chat all speakers will be disabled on voice. - But I'm not sure such situation is possible. - See EXT-3431. - */ - - mReverseVoiceModeratedAvatarID = excluded_avatar_id; - moderateVoiceSession(getSessionID(), !unmute_everyone_else); + if (mVoiceModerated == !unmute_everyone) + { + // session already in requested state. Just force participants which do not match it. + forceVoiceModeratedMode(mVoiceModerated); + } + else + { + // otherwise set moderated mode for a whole session. + moderateVoiceSession(getSessionID(), !unmute_everyone); + } } void LLIMSpeakerMgr::processSessionUpdate(const LLSD& session_update) { - if (mReverseVoiceModeratedAvatarID.isNull()) return; - if (session_update.has("moderated_mode") && session_update["moderated_mode"].has("voice")) { - BOOL voice_moderated = session_update["moderated_mode"]["voice"]; - - moderateVoiceParticipant(mReverseVoiceModeratedAvatarID, voice_moderated); - - mReverseVoiceModeratedAvatarID = LLUUID::null; + mVoiceModerated = session_update["moderated_mode"]["voice"]; } } @@ -817,6 +829,20 @@ void LLIMSpeakerMgr::moderateVoiceSession(const LLUUID& session_id, bool disallo LLHTTPClient::post(url, data, new ModerationResponder(session_id)); } +void LLIMSpeakerMgr::forceVoiceModeratedMode(bool should_be_muted) +{ + for (speaker_map_t::iterator speaker_it = mSpeakers.begin(); speaker_it != mSpeakers.end(); ++speaker_it) + { + LLUUID speaker_id = speaker_it->first; + LLSpeaker* speakerp = speaker_it->second; + + // participant does not match requested state + if (should_be_muted != (bool)speakerp->mModeratorMutedVoice) + { + moderateVoiceParticipant(speaker_id, !should_be_muted); + } + } +} // // LLActiveSpeakerMgr @@ -881,7 +907,7 @@ void LLLocalSpeakerMgr::updateSpeakerList() } // pick up non-voice speakers in chat range - std::vector<LLUUID> avatar_ids; + uuid_vec_t avatar_ids; std::vector<LLVector3d> positions; LLWorld::getInstance()->getAvatars(&avatar_ids, &positions, gAgent.getPositionGlobal(), CHAT_NORMAL_RADIUS); for(U32 i=0; i<avatar_ids.size(); i++) diff --git a/indra/newview/llspeakers.h b/indra/newview/llspeakers.h index ddc3632f07..4a250de82f 100644 --- a/indra/newview/llspeakers.h +++ b/indra/newview/llspeakers.h @@ -34,6 +34,7 @@ #define LL_LLSPEAKERS_H #include "llevent.h" +#include "lleventtimer.h" #include "llspeakers.h" #include "llvoicechannel.h" @@ -155,6 +156,13 @@ public: */ virtual BOOL tick(); + /** + * Clears the callback. + * + * Use this instead of deleteing this object. + * The next call to tick() will return true and that will destroy this object. + */ + void unset(); private: action_callback_t mActionCallback; LLUUID mSpeakerId; @@ -180,7 +188,7 @@ public: * * @see onTimerActionCallback() */ - void unsetActionTimer(const LLUUID& speaker_id, bool delete_it); + void unsetActionTimer(const LLUUID& speaker_id); void removeAllTimers(); private: @@ -188,7 +196,6 @@ private: * Callback of the each instance of LLSpeakerActionTimer. * * Unsets an appropriate timer instance and calls action callback for specified speacker_id. - * It always returns false to not use LLEventTimer::updateClass functionality of timer deleting. * * @see unsetActionTimer() */ @@ -227,6 +234,21 @@ public: LLVoiceChannel* getVoiceChannel() { return mVoiceChannel; } const LLUUID getSessionID(); + /** + * Removes avaline speaker. + * + * This is a HACK due to server does not send information that Avaline caller ends call. + * It can be removed when server is updated. See EXT-4301 for details + */ + bool removeAvalineSpeaker(const LLUUID& speaker_id) { return removeSpeaker(speaker_id); } + + /** + * Initializes mVoiceModerated depend on LLSpeaker::mModeratorMutedVoice of agent's participant. + * + * Is used only to implement workaround to initialize mVoiceModerated on first join to group chat. See EXT-6937 + */ + void initVoiceModerateMode(); + protected: virtual void updateSpeakerList(); void setSpeakerNotInChannel(LLSpeaker* speackerp); @@ -243,6 +265,14 @@ protected: * time out speakers when they are not part of current session */ LLSpeakersDelayActionsStorage* mSpeakerDelayRemover; + + // *TODO: should be moved back into LLIMSpeakerMgr when a way to request the current voice channel + // moderation mode is implemented: See EXT-6937 + bool mVoiceModerated; + + // *TODO: To be removed when a way to request the current voice channel + // moderation mode is implemented: See EXT-6937 + bool mModerateModeHandledFirstTime; }; class LLIMSpeakerMgr : public LLSpeakerMgr @@ -264,22 +294,21 @@ public: * @param[in] avatar_id UUID of avatar to be processed * @param[in] unmute if false - specified avatar will be muted, otherwise - unmuted. * - * @see moderateVoiceOtherParticipants() + * @see moderateVoiceAllParticipants() */ void moderateVoiceParticipant(const LLUUID& avatar_id, bool unmute); /** - * Mutes/Unmutes all avatars except specified for current group voice chat. + * Mutes/Unmutes all avatars for current group voice chat. * * It only marks avatars as muted for session and does not use local Agent's Block list. - * It based call moderateVoiceParticipant() for each avatar should be muted/unmuted. + * It calls forceVoiceModeratedMode() in case of session is already in requested state. * - * @param[in] excluded_avatar_id UUID of avatar NOT to be processed - * @param[in] unmute_everyone_else if false - avatars will be muted, otherwise - unmuted. + * @param[in] unmute_everyone if false - avatars will be muted, otherwise - unmuted. * * @see moderateVoiceParticipant() */ - void moderateVoiceOtherParticipants(const LLUUID& excluded_avatar_id, bool unmute_everyone_else); + void moderateVoiceAllParticipants(bool unmute_everyone); void processSessionUpdate(const LLSD& session_update); @@ -288,7 +317,11 @@ protected: void moderateVoiceSession(const LLUUID& session_id, bool disallow_voice); - LLUUID mReverseVoiceModeratedAvatarID; + /** + * Process all participants to mute/unmute them according to passed voice session state. + */ + void forceVoiceModeratedMode(bool should_be_muted); + }; class LLActiveSpeakerMgr : public LLSpeakerMgr, public LLSingleton<LLActiveSpeakerMgr> diff --git a/indra/newview/llspeakingindicatormanager.cpp b/indra/newview/llspeakingindicatormanager.cpp index d33c050ee4..ea7601517d 100644 --- a/indra/newview/llspeakingindicatormanager.cpp +++ b/indra/newview/llspeakingindicatormanager.cpp @@ -65,8 +65,12 @@ public: * * @param speaker_id LLUUID of an avatar whose speaking indicator is registered. * @param speaking_indicator instance of the speaking indicator to be registered. + * @param session_id session UUID for which indicator should be shown only. + * If this parameter is set registered indicator will be shown only in voice channel + * which has the same session id (EXT-5562). */ - void registerSpeakingIndicator(const LLUUID& speaker_id, LLSpeakingIndicator* const speaking_indicator); + void registerSpeakingIndicator(const LLUUID& speaker_id, LLSpeakingIndicator* const speaking_indicator, + const LLUUID& session_id = LLUUID::null); /** * Removes passed speaking indicator from observing. @@ -103,7 +107,7 @@ private: * So, method does not calculate difference between these list it only switches off already * switched on indicators and switches on indicators of voice channel participants */ - void onChange(); + void onParticipantsChanged(); /** * Changes state of indicators specified by LLUUIDs @@ -138,20 +142,23 @@ private: ////////////////////////////////////////////////////////////////////////// // PUBLIC SECTION ////////////////////////////////////////////////////////////////////////// -void SpeakingIndicatorManager::registerSpeakingIndicator(const LLUUID& speaker_id, LLSpeakingIndicator* const speaking_indicator) +void SpeakingIndicatorManager::registerSpeakingIndicator(const LLUUID& speaker_id, LLSpeakingIndicator* const speaking_indicator, + const LLUUID& session_id) { // do not exclude agent's indicators. They should be processed in the same way as others. See EXT-3889. - LL_DEBUGS("SpeakingIndicator") << "Registering indicator: " << speaker_id << "|"<< speaking_indicator << LL_ENDL; + LL_DEBUGS("SpeakingIndicator") << "Registering indicator: " << speaker_id << "|"<< speaking_indicator << ", session: " << session_id << LL_ENDL; ensureInstanceDoesNotExist(speaking_indicator); + speaking_indicator->setTargetSessionID(session_id); + speaking_indicator_value_t value_type(speaker_id, speaking_indicator); mSpeakingIndicators.insert(value_type); speaker_ids_t speakers_uuids; - BOOL is_in_same_voice = LLVoiceClient::getInstance()->findParticipantByID(speaker_id) != NULL; + BOOL is_in_same_voice = LLVoiceClient::getInstance()->isParticipant(speaker_id); speakers_uuids.insert(speaker_id); switchSpeakerIndicators(speakers_uuids, is_in_same_voice); @@ -198,12 +205,12 @@ void SpeakingIndicatorManager::sOnCurrentChannelChanged(const LLUUID& /*session_ mSwitchedIndicatorsOn.clear(); } -void SpeakingIndicatorManager::onChange() +void SpeakingIndicatorManager::onParticipantsChanged() { LL_DEBUGS("SpeakingIndicator") << "Voice participant list was changed, updating indicators" << LL_ENDL; speaker_ids_t speakers_uuids; - LLVoiceClient::getInstance()->getParticipantsUUIDSet(speakers_uuids); + LLVoiceClient::getInstance()->getParticipantList(speakers_uuids); LL_DEBUGS("SpeakingIndicator") << "Switching all OFF, count: " << mSwitchedIndicatorsOn.size() << LL_ENDL; // switch all indicators off @@ -217,6 +224,13 @@ void SpeakingIndicatorManager::onChange() void SpeakingIndicatorManager::switchSpeakerIndicators(const speaker_ids_t& speakers_uuids, BOOL switch_on) { + LLVoiceChannel* voice_channel = LLVoiceChannel::getCurrentVoiceChannel(); + LLUUID session_id; + if (voice_channel) + { + session_id = voice_channel->getSessionID(); + } + speaker_ids_t::const_iterator it_uuid = speakers_uuids.begin(); for (; it_uuid != speakers_uuids.end(); ++it_uuid) { @@ -224,18 +238,36 @@ void SpeakingIndicatorManager::switchSpeakerIndicators(const speaker_ids_t& spea indicator_range_t it_range = mSpeakingIndicators.equal_range(*it_uuid); indicator_const_iterator it_indicator = it_range.first; bool was_found = false; + bool was_switched_on = false; for (; it_indicator != it_range.second; ++it_indicator) { was_found = true; LLSpeakingIndicator* indicator = (*it_indicator).second; - indicator->switchIndicator(switch_on); + + BOOL switch_current_on = switch_on; + + // we should show indicator for specified voice session only if this is current channel. EXT-5562. + if (switch_current_on && indicator->getTargetSessionID().notNull()) + { + switch_current_on = indicator->getTargetSessionID() == session_id; + LL_DEBUGS("SpeakingIndicator") << "Session: " << session_id << ", target: " << indicator->getTargetSessionID() << ", the same? = " << switch_current_on << LL_ENDL; + } + was_switched_on = was_switched_on || switch_current_on; + + indicator->switchIndicator(switch_current_on); + } if (was_found) { LL_DEBUGS("SpeakingIndicator") << mSpeakingIndicators.count(*it_uuid) << " indicators where found" << LL_ENDL; - if (switch_on) + if (switch_on && !was_switched_on) + { + LL_DEBUGS("SpeakingIndicator") << "but non of them where switched on" << LL_ENDL; + } + + if (was_switched_on) { // store switched on indicator to be able switch it off mSwitchedIndicatorsOn.insert(*it_uuid); @@ -274,9 +306,10 @@ void SpeakingIndicatorManager::ensureInstanceDoesNotExist(LLSpeakingIndicator* c /* LLSpeakingIndicatorManager namespace implementation */ /************************************************************************/ -void LLSpeakingIndicatorManager::registerSpeakingIndicator(const LLUUID& speaker_id, LLSpeakingIndicator* const speaking_indicator) +void LLSpeakingIndicatorManager::registerSpeakingIndicator(const LLUUID& speaker_id, LLSpeakingIndicator* const speaking_indicator, + const LLUUID& session_id) { - SpeakingIndicatorManager::instance().registerSpeakingIndicator(speaker_id, speaking_indicator); + SpeakingIndicatorManager::instance().registerSpeakingIndicator(speaker_id, speaking_indicator, session_id); } void LLSpeakingIndicatorManager::unregisterSpeakingIndicator(const LLUUID& speaker_id, const LLSpeakingIndicator* const speaking_indicator) diff --git a/indra/newview/llspeakingindicatormanager.h b/indra/newview/llspeakingindicatormanager.h index ce0158f7d8..8d7aba1d6c 100644 --- a/indra/newview/llspeakingindicatormanager.h +++ b/indra/newview/llspeakingindicatormanager.h @@ -35,10 +35,28 @@ #ifndef LL_LLSPEAKINGINDICATORMANAGER_H #define LL_LLSPEAKINGINDICATORMANAGER_H +class SpeakingIndicatorManager; + class LLSpeakingIndicator { public: + virtual ~LLSpeakingIndicator(){} virtual void switchIndicator(bool switch_on) = 0; + +private: + friend class SpeakingIndicatorManager; + // Accessors for target voice session UUID. + // They are intended to be used only from SpeakingIndicatorManager to ensure target session is + // the same indicator was registered with. + void setTargetSessionID(const LLUUID& session_id) { mTargetSessionID = session_id; } + const LLUUID& getTargetSessionID() { return mTargetSessionID; } + + /** + * session UUID for which indicator should be shown only. + * If it is set, registered indicator will be shown only in voice channel + * which has the same session id (EXT-5562). + */ + LLUUID mTargetSessionID; }; // See EXT-3976. @@ -52,8 +70,12 @@ namespace LLSpeakingIndicatorManager * * @param speaker_id LLUUID of an avatar whose speaker indicator is registered. * @param speaking_indicator instance of the speaker indicator to be registered. + * @param session_id session UUID for which indicator should be shown only. + * If this parameter is set registered indicator will be shown only in voice channel + * which has the same session id (EXT-5562). */ - void registerSpeakingIndicator(const LLUUID& speaker_id, LLSpeakingIndicator* const speaking_indicator); + void registerSpeakingIndicator(const LLUUID& speaker_id, LLSpeakingIndicator* const speaking_indicator, + const LLUUID& session_id); /** * Removes passed speaking indicator from observing. diff --git a/indra/newview/llsplitbutton.cpp b/indra/newview/llsplitbutton.cpp index ffd9bc7624..e5323db466 100644 --- a/indra/newview/llsplitbutton.cpp +++ b/indra/newview/llsplitbutton.cpp @@ -165,7 +165,7 @@ void LLSplitButton::showButtons() // register ourselves as a "top" control // effectively putting us into a special draw layer - gFocusMgr.setTopCtrl(this); + gViewerWindow->addPopup(this); mItemsPanel->setFocus(TRUE); @@ -182,10 +182,7 @@ void LLSplitButton::hideButtons() mArrowBtn->setToggleState(FALSE); setUseBoundingRect(FALSE); - if(gFocusMgr.getTopCtrl() == this) - { - gFocusMgr.setTopCtrl(NULL); - } + gViewerWindow->removePopup(this); } diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index a402dfc3d1..96088fed9c 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -62,6 +62,7 @@ #include "llimfloater.h" #include "lllocationhistory.h" #include "llimageworker.h" + #include "llloginflags.h" #include "llmd5.h" #include "llmemorystream.h" @@ -88,6 +89,7 @@ #include "v3math.h" #include "llagent.h" +#include "llagentcamera.h" #include "llagentpicksinfo.h" #include "llagentwearables.h" #include "llagentpilot.h" @@ -115,15 +117,15 @@ #include "llimagebmp.h" #include "llinventorybridge.h" #include "llinventorymodel.h" +#include "llinventorymodelbackgroundfetch.h" #include "llfriendcard.h" #include "llkeyboard.h" #include "llloginhandler.h" // gLoginHandler, SLURL support #include "lllogininstance.h" // Host the login module. #include "llpanellogin.h" #include "llmutelist.h" -#include "llpanelavatar.h" #include "llavatarpropertiesprocessor.h" -#include "llpanelevent.h" +#include "llfloaterevent.h" #include "llpanelclassified.h" #include "llpanelpick.h" #include "llpanelplace.h" @@ -135,16 +137,17 @@ #include "llsecondlifeurls.h" #include "llselectmgr.h" #include "llsky.h" +#include "llsidetray.h" #include "llstatview.h" -#include "lltrans.h" #include "llstatusbar.h" // sendMoneyBalanceRequest(), owns L$ balance #include "llsurface.h" #include "lltexturecache.h" #include "lltexturefetch.h" #include "lltoolmgr.h" +#include "lltrans.h" #include "llui.h" #include "llurldispatcher.h" -#include "llurlsimstring.h" +#include "llslurl.h" #include "llurlhistory.h" #include "llurlwhitelist.h" #include "llvieweraudio.h" @@ -189,20 +192,16 @@ #include "llinventorybridge.h" #include "llappearancemgr.h" #include "llavatariconctrl.h" +#include "llvoicechannel.h" #include "lllogin.h" #include "llevents.h" #include "llstartuplistener.h" #if LL_WINDOWS -#include "llwindebug.h" #include "lldxhardware.h" #endif -#if (LL_LINUX || LL_SOLARIS) && LL_GTK -#include <glib/gspawn.h> -#endif - // // exported globals // @@ -225,15 +224,16 @@ extern S32 gStartImageHeight; static bool gGotUseCircuitCodeAck = false; static std::string sInitialOutfit; static std::string sInitialOutfitGender; // "male" or "female" +static boost::signals2::connection sWearablesLoadedCon; static bool gUseCircuitCallbackCalled = false; EStartupState LLStartUp::gStartupState = STATE_FIRST; +LLSLURL LLStartUp::sStartSLURL; -// *NOTE:Mani - to reconcile with giab changes... -static std::string gFirstname; -static std::string gLastname; -static std::string gPassword; +static LLPointer<LLCredential> gUserCredential; +static std::string gDisplayName; +static BOOL gRememberPassword = TRUE; static U64 gFirstSimHandle = 0; static LLHost gFirstSim; @@ -250,7 +250,6 @@ boost::scoped_ptr<LLStartupListener> LLStartUp::sListener(new LLStartupListener( void login_show(); void login_callback(S32 option, void* userdata); -bool is_hex_string(U8* str, S32 len); void show_first_run_dialog(); bool first_run_dialog_callback(const LLSD& notification, const LLSD& response); void set_startup_status(const F32 frac, const std::string& string, const std::string& msg); @@ -263,6 +262,9 @@ bool callback_choose_gender(const LLSD& notification, const LLSD& response); void init_start_screen(S32 location_id); void release_start_screen(); void reset_login(); +LLSD transform_cert_args(LLPointer<LLCertificate> cert); +void general_cert_done(const LLSD& notification, const LLSD& response); +void trust_cert_done(const LLSD& notification, const LLSD& response); void apply_udp_blacklist(const std::string& csv); bool process_login_success_response(); void transition_back_to_login_panel(const std::string& emsg); @@ -365,7 +367,7 @@ bool idle_startup() if ( STATE_FIRST == LLStartUp::getStartupState() ) { - gViewerWindow->showCursor(); + gViewerWindow->showCursor(); gViewerWindow->getWindow()->setCursor(UI_CURSOR_WAIT); ///////////////////////////////////////////////// @@ -382,13 +384,22 @@ bool idle_startup() { LLNotificationsUtil::add("DisplaySetToRecommended"); } + else if ((gSavedSettings.getS32("LastGPUClass") != LLFeatureManager::getInstance()->getGPUClass()) && + (gSavedSettings.getS32("LastGPUClass") != -1)) + { + LLNotificationsUtil::add("DisplaySetToRecommended"); + } else if (!gViewerWindow->getInitAlert().empty()) { LLNotificationsUtil::add(gViewerWindow->getInitAlert()); } gSavedSettings.setS32("LastFeatureVersion", LLFeatureManager::getInstance()->getVersion()); + gSavedSettings.setS32("LastGPUClass", LLFeatureManager::getInstance()->getGPUClass()); + // load dynamic GPU/feature tables from website (S3) + LLFeatureManager::getInstance()->fetchHTTPTables(); + std::string xml_file = LLUI::locateSkin("xui_version.xml"); LLXMLNodePtr root; bool xml_ok = false; @@ -565,7 +576,7 @@ bool idle_startup() gXferManager->setUseAckThrottling(TRUE); gXferManager->setAckThrottleBPS(xfer_throttle_bps); } - gAssetStorage = new LLViewerAssetStorage(msg, gXferManager, gVFS); + gAssetStorage = new LLViewerAssetStorage(msg, gXferManager, gVFS, gStaticVFS); F32 dropPercent = gSavedSettings.getF32("PacketDropPercentage"); @@ -663,69 +674,25 @@ bool idle_startup() // // Log on to system // - if (!LLStartUp::sSLURLCommand.empty()) - { - // this might be a secondlife:///app/login URL - gLoginHandler.parseDirectLogin(LLStartUp::sSLURLCommand); - } - if (!gLoginHandler.getFirstName().empty() - || !gLoginHandler.getLastName().empty() - /*|| !gLoginHandler.getWebLoginKey().isNull()*/ ) - { - // We have at least some login information on a SLURL - gFirstname = gLoginHandler.getFirstName(); - gLastname = gLoginHandler.getLastName(); - LL_DEBUGS("LLStartup") << "STATE_FIRST: setting gFirstname, gLastname from gLoginHandler: '" << gFirstname << "' '" << gLastname << "'" << LL_ENDL; - - // Show the login screen if we don't have everything - show_connect_box = - gFirstname.empty() || gLastname.empty(); - } - else if(gSavedSettings.getLLSD("UserLoginInfo").size() == 3) - { - LLSD cmd_line_login = gSavedSettings.getLLSD("UserLoginInfo"); - gFirstname = cmd_line_login[0].asString(); - gLastname = cmd_line_login[1].asString(); - LL_DEBUGS("LLStartup") << "Setting gFirstname, gLastname from gSavedSettings(\"UserLoginInfo\"): '" << gFirstname << "' '" << gLastname << "'" << LL_ENDL; - - LLMD5 pass((unsigned char*)cmd_line_login[2].asString().c_str()); - char md5pass[33]; /* Flawfinder: ignore */ - pass.hex_digest(md5pass); - gPassword = md5pass; - -#ifdef USE_VIEWER_AUTH - show_connect_box = true; -#else - show_connect_box = false; -#endif - gSavedSettings.setBOOL("AutoLogin", TRUE); - } - else if (gSavedSettings.getBOOL("AutoLogin")) - { - gFirstname = gSavedSettings.getString("FirstName"); - gLastname = gSavedSettings.getString("LastName"); - LL_DEBUGS("LLStartup") << "AutoLogin: setting gFirstname, gLastname from gSavedSettings(\"First|LastName\"): '" << gFirstname << "' '" << gLastname << "'" << LL_ENDL; - gPassword = LLStartUp::loadPasswordFromDisk(); - gSavedSettings.setBOOL("RememberPassword", TRUE); - -#ifdef USE_VIEWER_AUTH - show_connect_box = true; -#else - show_connect_box = false; -#endif + if (gUserCredential.isNull()) + { + gUserCredential = gLoginHandler.initializeLoginInfo(); } - else + if (gUserCredential.isNull()) { - // if not automatically logging in, display login dialog - // a valid grid is selected - gFirstname = gSavedSettings.getString("FirstName"); - gLastname = gSavedSettings.getString("LastName"); - LL_DEBUGS("LLStartup") << "normal login: setting gFirstname, gLastname from gSavedSettings(\"First|LastName\"): '" << gFirstname << "' '" << gLastname << "'" << LL_ENDL; - gPassword = LLStartUp::loadPasswordFromDisk(); - show_connect_box = true; + show_connect_box = TRUE; + } + else if (gSavedSettings.getBOOL("AutoLogin")) + { + gRememberPassword = TRUE; + gSavedSettings.setBOOL("RememberPassword", TRUE); + show_connect_box = false; + } + else + { + gRememberPassword = gSavedSettings.getBOOL("RememberPassword"); + show_connect_box = TRUE; } - - // Go to the next startup state LLStartUp::setStartupState( STATE_BROWSER_INIT ); return FALSE; @@ -757,8 +724,10 @@ bool idle_startup() // Load all the name information out of the login view // NOTE: Hits "Attempted getFields with no login view shown" warning, since we don't // show the login view until login_show() is called below. - // LLPanelLogin::getFields(gFirstname, gLastname, gPassword); - + if (gUserCredential.isNull()) + { + gUserCredential = gLoginHandler.initializeLoginInfo(); + } if (gNoRender) { LL_ERRS("AppInit") << "Need to autologin or use command line with norender!" << LL_ENDL; @@ -766,13 +735,19 @@ bool idle_startup() // Make sure the process dialog doesn't hide things gViewerWindow->setShowProgress(FALSE); + initialize_edit_menu(); + // Show the login dialog login_show(); // connect dialog is already shown, so fill in the names - LLPanelLogin::setFields( gFirstname, gLastname, gPassword); - + if (gUserCredential.notNull()) + { + LLPanelLogin::setFields( gUserCredential, gRememberPassword); + } LLPanelLogin::giveFocus(); + gSavedSettings.setBOOL("FirstRunThisInstall", FALSE); + LLStartUp::setStartupState( STATE_LOGIN_WAIT ); // Wait for user input } else @@ -798,13 +773,13 @@ bool idle_startup() gLoginMenuBarView->setVisible( TRUE ); gLoginMenuBarView->setEnabled( TRUE ); + // Hide the splash screen + LLSplashScreen::hide(); + // Push our window frontmost gViewerWindow->getWindow()->show(); display_startup(); - //DEV-10530. do cleanup. remove at some later date. jan-2009 - LLFloaterPreference::cleanupBadSetting(); - // DEV-16927. The following code removes errant keystrokes that happen while the window is being // first made visible. #ifdef _WIN32 @@ -832,42 +807,39 @@ bool idle_startup() gViewerWindow->moveProgressViewToFront(); //reset the values that could have come in from a slurl - // DEV-42215: Make sure they're not empty -- gFirstname and gLastname + // DEV-42215: Make sure they're not empty -- gUserCredential // might already have been set from gSavedSettings, and it's too bad // to overwrite valid values with empty strings. - if (! gLoginHandler.getFirstName().empty() && ! gLoginHandler.getLastName().empty()) - { - gFirstname = gLoginHandler.getFirstName(); - gLastname = gLoginHandler.getLastName(); - LL_DEBUGS("LLStartup") << "STATE_LOGIN_CLEANUP: setting gFirstname, gLastname from gLoginHandler: '" << gFirstname << "' '" << gLastname << "'" << LL_ENDL; - } if (show_connect_box) { // TODO if not use viewer auth // Load all the name information out of the login view - LLPanelLogin::getFields(&gFirstname, &gLastname, &gPassword); + LLPanelLogin::getFields(gUserCredential, gRememberPassword); // end TODO // HACK: Try to make not jump on login gKeyboard->resetKeys(); } - if (!gFirstname.empty() && !gLastname.empty()) - { - gSavedSettings.setString("FirstName", gFirstname); - gSavedSettings.setString("LastName", gLastname); - - LL_INFOS("AppInit") << "Attempting login as: " << gFirstname << " " << gLastname << LL_ENDL; - gDebugInfo["LoginName"] = gFirstname + " " + gLastname; + // save the credentials + std::string userid = "unknown"; + if(gUserCredential.notNull()) + { + userid = gUserCredential->userID(); + gSecAPIHandler->saveCredential(gUserCredential, gRememberPassword); } - + gSavedSettings.setBOOL("RememberPassword", gRememberPassword); + LL_INFOS("AppInit") << "Attempting login as: " << userid << LL_ENDL; + gDebugInfo["LoginName"] = userid; + // create necessary directories // *FIX: these mkdir's should error check - gDirUtilp->setLindenUserDir(gFirstname, gLastname); + gDirUtilp->setLindenUserDir(userid); LLFile::mkdir(gDirUtilp->getLindenUserDir()); - + // Set PerAccountSettingsFile to the default value. + std::string per_account_settings_file = LLAppViewer::instance()->getSettingsFilename("Default", "PerAccount"); gSavedSettings.setString("PerAccountSettingsFile", gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, LLAppViewer::instance()->getSettingsFilename("Default", "PerAccount"))); @@ -885,21 +857,19 @@ bool idle_startup() } //Default the path if one isn't set. - if (gSavedPerAccountSettings.getString("InstantMessageLogFolder").empty()) + // *NOTE: unable to check variable differ from "InstantMessageLogPath" because it was + // provided in pre 2.0 viewer. See EXT-6661 + if (gSavedPerAccountSettings.getString("InstantMessageLogPath").empty()) { gDirUtilp->setChatLogsDir(gDirUtilp->getOSUserAppDir()); - std::string chat_log_dir = gDirUtilp->getChatLogsDir(); - std::string chat_log_top_folder=gDirUtilp->getBaseFileName(chat_log_dir); - gSavedPerAccountSettings.setString("InstantMessageLogPath",chat_log_dir); - gSavedPerAccountSettings.setString("InstantMessageLogFolder",chat_log_top_folder); + gSavedPerAccountSettings.setString("InstantMessageLogPath", gDirUtilp->getChatLogsDir()); } else { gDirUtilp->setChatLogsDir(gSavedPerAccountSettings.getString("InstantMessageLogPath")); } + gDirUtilp->setPerAccountChatLogsDir(userid); - gDirUtilp->setPerAccountChatLogsDir(gFirstname, gLastname); - LLFile::mkdir(gDirUtilp->getChatLogsDir()); LLFile::mkdir(gDirUtilp->getPerAccountChatLogsDir()); @@ -920,11 +890,7 @@ bool idle_startup() if (show_connect_box) { - std::string location; - LLPanelLogin::getLocation( location ); - LLURLSimString::setString( location ); - - // END TODO + LLSLURL slurl; LLPanelLogin::closePanel(); } @@ -936,6 +902,9 @@ bool idle_startup() // Load Avatars icons cache LLAvatarIconIDCache::getInstance()->load(); + + // Load media plugin cookies + LLViewerMedia::loadCookieFile(); //------------------------------------------------- // Handle startup progress screen @@ -945,26 +914,21 @@ bool idle_startup() // their last location, or some URL "-url //sim/x/y[/z]" // All accounts have both a home and a last location, and we don't support // more locations than that. Choose the appropriate one. JC - if (LLURLSimString::parse()) - { - // a startup URL was specified - agent_location_id = START_LOCATION_ID_URL; - - // doesn't really matter what location_which is, since - // gAgentStartLookAt will be overwritten when the - // UserLoginLocationReply arrives - location_which = START_LOCATION_ID_LAST; - } - else if (gSavedSettings.getString("LoginLocation") == "last" ) - { - agent_location_id = START_LOCATION_ID_LAST; // last location - location_which = START_LOCATION_ID_LAST; - } - else - { - agent_location_id = START_LOCATION_ID_HOME; // home - location_which = START_LOCATION_ID_HOME; - } + switch (LLStartUp::getStartSLURL().getType()) + { + case LLSLURL::LOCATION: + agent_location_id = START_LOCATION_ID_URL; + location_which = START_LOCATION_ID_LAST; + break; + case LLSLURL::LAST_LOCATION: + agent_location_id = START_LOCATION_ID_LAST; + location_which = START_LOCATION_ID_LAST; + break; + default: + agent_location_id = START_LOCATION_ID_HOME; + location_which = START_LOCATION_ID_HOME; + break; + } gViewerWindow->getWindow()->setCursor(UI_CURSOR_WAIT); @@ -991,7 +955,7 @@ bool idle_startup() if(STATE_LOGIN_AUTH_INIT == LLStartUp::getStartupState()) { - gDebugInfo["GridName"] = LLViewerLogin::getInstance()->getGridLabel(); + gDebugInfo["GridName"] = LLGridManager::getInstance()->getGridLabel(); // Update progress status and the display loop. auth_desc = LLTrans::getString("LoginInProgress"); @@ -1015,11 +979,7 @@ bool idle_startup() // This call to LLLoginInstance::connect() starts the // authentication process. - LLSD credentials; - credentials["first"] = gFirstname; - credentials["last"] = gLastname; - credentials["passwd"] = gPassword; - login->connect(credentials); + login->connect(gUserCredential); LLStartUp::setStartupState( STATE_LOGIN_CURL_UNSTUCK ); return FALSE; @@ -1039,15 +999,16 @@ bool idle_startup() if(STATE_LOGIN_PROCESS_RESPONSE == LLStartUp::getStartupState()) { std::ostringstream emsg; - emsg << "Login failed.\n"; + emsg << LLTrans::getString("LoginFailed") << "\n"; if(LLLoginInstance::getInstance()->authFailure()) { LL_INFOS("LLStartup") << "Login failed, LLLoginInstance::getResponse(): " << LLLoginInstance::getInstance()->getResponse() << LL_ENDL; + LLSD response = LLLoginInstance::getInstance()->getResponse(); // Still have error conditions that may need some // sort of handling. - std::string reason_response = LLLoginInstance::getInstance()->getResponse("reason"); - std::string message_response = LLLoginInstance::getInstance()->getResponse("message"); + std::string reason_response = response["reason"]; + std::string message_response = response["message"]; if(!message_response.empty()) { @@ -1067,8 +1028,8 @@ bool idle_startup() if(reason_response == "key") { // Couldn't login because user/password is wrong - // Clear the password - gPassword = ""; + // Clear the credential + gUserCredential->clearAuthenticator(); } if(reason_response == "update" @@ -1081,18 +1042,65 @@ bool idle_startup() LLLoginInstance::getInstance()->disconnect(); LLAppViewer::instance()->forceQuit(); } - else + else { - // Don't pop up a notification in the TOS case because - // LLFloaterTOS::onCancel() already scolded the user. - if (reason_response != "tos") + if (reason_response != "tos") { - LLSD args; - args["ERROR_MESSAGE"] = emsg.str(); - LL_INFOS("LLStartup") << "Notification: " << args << LL_ENDL; - LLNotificationsUtil::add("ErrorMessage", args, LLSD(), login_alert_done); + // Don't pop up a notification in the TOS case because + // LLFloaterTOS::onCancel() already scolded the user. + std::string error_code; + if(response.has("errorcode")) + { + error_code = response["errorcode"].asString(); + } + if ((reason_response == "CURLError") && + (error_code == "SSL_CACERT" || error_code == "SSL_PEER_CERTIFICATE") && + response.has("certificate")) + { + // This was a certificate error, so grab the certificate + // and throw up the appropriate dialog. + LLPointer<LLCertificate> certificate = gSecAPIHandler->getCertificate(response["certificate"]); + if(certificate) + { + LLSD args = transform_cert_args(certificate); + + if(error_code == "SSL_CACERT") + { + // if we are handling an untrusted CA, throw up the dialog + // with the 'trust this CA' button. + LLNotificationsUtil::add("TrustCertificateError", args, response, + trust_cert_done); + + show_connect_box = true; + } + else + { + // the certificate exception returns a unique string for each type of exception. + // we grab this string via the LLUserAuth object, and use that to grab the localized + // string. + args["REASON"] = LLTrans::getString(message_response); + + LLNotificationsUtil::add("GeneralCertificateError", args, response, + general_cert_done); + + reset_login(); + gSavedSettings.setBOOL("AutoLogin", FALSE); + show_connect_box = true; + + } + + } + } + else + { + // This wasn't a certificate error, so throw up the normal + // notificatioin message. + LLSD args; + args["ERROR_MESSAGE"] = emsg.str(); + LL_INFOS("LLStartup") << "Notification: " << args << LL_ENDL; + LLNotificationsUtil::add("ErrorMessage", args, LLSD(), login_alert_done); + } } - //setup map of datetime strings to codes and slt & local time offset from utc // *TODO: Does this need to be here? LLStringOps::setupDatetimeInfo (false); @@ -1105,7 +1113,10 @@ bool idle_startup() if(process_login_success_response()) { // Pass the user information to the voice chat server interface. - gVoiceClient->userAuthorized(gFirstname, gLastname, gAgentID); + LLVoiceClient::getInstance()->userAuthorized(gUserCredential->userID(), gAgentID); + // create the default proximal channel + LLVoiceChannel::initClass(); + LLGridManager::getInstance()->setFavorite(); LLStartUp::setStartupState( STATE_WORLD_INIT); } else @@ -1116,6 +1127,7 @@ bool idle_startup() LLNotificationsUtil::add("ErrorMessage", args, LLSD(), login_alert_done); transition_back_to_login_panel(emsg.str()); show_connect_box = true; + return FALSE; } } return FALSE; @@ -1133,6 +1145,7 @@ bool idle_startup() // Finish agent initialization. (Requires gSavedSettings, builds camera) gAgent.init(); + gAgentCamera.init(); set_underclothes_menu_options(); // Since we connected, save off the settings so the user doesn't have to @@ -1171,7 +1184,7 @@ bool idle_startup() // World initialization must be done after above window init // User might have overridden far clip - LLWorld::getInstance()->setLandFarClip( gAgent.mDrawDistance ); + LLWorld::getInstance()->setLandFarClip(gAgentCamera.mDrawDistance); // Before we create the first region, we need to set the agent's mOriginGlobal // This is necessary because creating objects before this is set will result in a @@ -1196,6 +1209,7 @@ bool idle_startup() display_startup(); LLStartUp::setStartupState( STATE_MULTIMEDIA_INIT ); + return FALSE; } @@ -1284,6 +1298,10 @@ bool idle_startup() LLAppViewer::instance()->loadNameCache(); } + // update the voice settings *after* gCacheName initialization + // so that we can construct voice UI that relies on the name cache + LLVoiceClient::getInstance()->updateSettings(); + //gCacheName is required for nearby chat history loading //so I just moved nearby history loading a few states further if (!gNoRender && gSavedPerAccountSettings.getBOOL("LogShowHistory")) @@ -1334,8 +1352,8 @@ bool idle_startup() gAgent.setPositionAgent(agent_start_position_region); gAgent.resetAxes(gAgentStartLookAt); - gAgent.stopCameraAnimation(); - gAgent.resetCamera(); + gAgentCamera.stopCameraAnimation(); + gAgentCamera.resetCamera(); // Initialize global class data needed for surfaces (i.e. textures) if (!gNoRender) @@ -1698,6 +1716,13 @@ bool idle_startup() << " kbps" << LL_ENDL; gViewerThrottle.setMaxBandwidth(FAST_RATE_BPS / 1024.f); } + + // Set the show start location to true, now that the user has logged + // on with this install. + gSavedSettings.setBOOL("ShowStartLocation", TRUE); + + LLSideTray::getInstance()->showPanel("panel_home", LLSD()); + } // We're successfully logged in. @@ -1732,7 +1757,7 @@ bool idle_startup() { LL_DEBUGS("AppInit") << "Gesture Manager loading " << gesture_options.size() << LL_ENDL; - std::vector<LLUUID> item_ids; + uuid_vec_t item_ids; for(LLSD::array_const_iterator resp_it = gesture_options.beginArray(), end = gesture_options.endArray(); resp_it != end; ++resp_it) { @@ -1746,7 +1771,7 @@ bool idle_startup() // Could schedule and delay these for later. const BOOL no_inform_server = FALSE; const BOOL no_deactivate_similar = FALSE; - LLGestureManager::instance().activateGestureWithAsset(item_id, asset_id, + LLGestureMgr::instance().activateGestureWithAsset(item_id, asset_id, no_inform_server, no_deactivate_similar); // We need to fetch the inventory items for these gestures @@ -1755,7 +1780,8 @@ bool idle_startup() } } // no need to add gesture to inventory observer, it's already made in constructor - LLGestureManager::instance().fetchItems(item_ids); + LLGestureMgr::instance().setFetchIDs(item_ids); + LLGestureMgr::instance().startFetch(); } } gDisplaySwapBuffers = TRUE; @@ -1791,9 +1817,12 @@ bool idle_startup() // thus, do not show this alert. if (!gAgent.isFirstLogin()) { - bool url_ok = LLURLSimString::sInstance.parse(); - if ((url_ok && gAgentStartLocation == "url") || - (!url_ok && ((gAgentStartLocation == gSavedSettings.getString("LoginLocation"))))) + llinfos << "gAgentStartLocation : " << gAgentStartLocation << llendl; + LLSLURL start_slurl = LLStartUp::getStartSLURL(); + + if (((start_slurl.getType() == LLSLURL::LOCATION) && (gAgentStartLocation == "url")) || + ((start_slurl.getType() == LLSLURL::LAST_LOCATION) && (gAgentStartLocation == "last")) || + ((start_slurl.getType() == LLSLURL::HOME_LOCATION) && (gAgentStartLocation == "home"))) { // Start location is OK // Disabled code to restore camera location and focus if logging in to default location @@ -1801,38 +1830,44 @@ bool idle_startup() if (samename) { // restore old camera pos - gAgent.setFocusOnAvatar(FALSE, FALSE); - gAgent.setCameraPosAndFocusGlobal(gSavedSettings.getVector3d("CameraPosOnLogout"), gSavedSettings.getVector3d("FocusPosOnLogout"), LLUUID::null); + gAgentCamera.setFocusOnAvatar(FALSE, FALSE); + gAgentCamera.setCameraPosAndFocusGlobal(gSavedSettings.getVector3d("CameraPosOnLogout"), gSavedSettings.getVector3d("FocusPosOnLogout"), LLUUID::null); BOOL limit_hit = FALSE; - gAgent.calcCameraPositionTargetGlobal(&limit_hit); + gAgentCamera.calcCameraPositionTargetGlobal(&limit_hit); if (limit_hit) { - gAgent.setFocusOnAvatar(TRUE, FALSE); + gAgentCamera.setFocusOnAvatar(TRUE, FALSE); } - gAgent.stopCameraAnimation(); + gAgentCamera.stopCameraAnimation(); } } else { std::string msg; - if (url_ok) - { - msg = "AvatarMovedDesired"; - } - else if (gSavedSettings.getString("LoginLocation") == "home") + switch(start_slurl.getType()) { - msg = "AvatarMovedHome"; - } - else - { - msg = "AvatarMovedLast"; + case LLSLURL::LOCATION: + { + + msg = "AvatarMovedDesired"; + break; + } + case LLSLURL::HOME_LOCATION: + { + msg = "AvatarMovedHome"; + break; + } + default: + { + msg = "AvatarMovedLast"; + } } LLNotificationsUtil::add(msg); } } //DEV-17797. get null folder. Any items found here moved to Lost and Found - LLInventoryModel::findLostItems(); + LLInventoryModelBackgroundFetch::instance().findLostItems(); LLStartUp::setStartupState( STATE_PRECACHE ); timeout.reset(); @@ -1850,7 +1885,7 @@ bool idle_startup() if (gAgent.isFirstLogin() && !sInitialOutfit.empty() // registration set up an outfit && !sInitialOutfitGender.empty() // and a gender - && gAgent.getAvatarObject() // can't wear clothes without object + && isAgentAvatarValid() // can't wear clothes without object && !gAgent.isGenderChosen() ) // nothing already loading { // Start loading the wearables, textures, gestures @@ -1858,7 +1893,7 @@ bool idle_startup() } // wait precache-delay and for agent's avatar or a lot longer. - if(((timeout_frac > 1.f) && gAgent.getAvatarObject()) + if(((timeout_frac > 1.f) && isAgentAvatarValid()) || (timeout_frac > 3.f)) { LLStartUp::setStartupState( STATE_WEARABLES_WAIT ); @@ -1877,17 +1912,6 @@ bool idle_startup() } } - // If this is the very first time the user has logged into viewer2+ (from a legacy viewer, or new account) - // then auto-populate outfits from the library into the My Outfits folder. - static bool check_populate_my_outfits = true; - if (check_populate_my_outfits && - (LLInventoryModel::getIsFirstTimeInViewer2() - || gSavedSettings.getBOOL("MyOutfitsAutofill"))) - { - gAgentWearables.populateMyOutfitsFolder(); - } - check_populate_my_outfits = false; - return TRUE; } @@ -1925,8 +1949,8 @@ bool idle_startup() if (gAgent.isFirstLogin()) { // wait for avatar to be completely loaded - if (gAgent.getAvatarObject() - && gAgent.getAvatarObject()->isFullyLoaded()) + if (isAgentAvatarValid() + && gAgentAvatarp->isFullyLoaded()) { //llinfos << "avatar fully loaded" << llendl; LLStartUp::setStartupState( STATE_CLEANUP ); @@ -2006,9 +2030,6 @@ bool idle_startup() LLStartUp::setStartupState( STATE_STARTED ); - // Mark that we have successfully logged in at least once - gSavedSettings.setBOOL("HadFirstSuccessfulLogin", TRUE); - // Unmute audio if desired and setup volumes. // Unmute audio if desired and setup volumes. // This is a not-uncommon crash site, so surround it with @@ -2055,20 +2076,9 @@ void login_show() #endif LLPanelLogin::show( gViewerWindow->getWindowRectScaled(), - bUseDebugLogin, + bUseDebugLogin || gSavedSettings.getBOOL("SecondLifeEnterprise"), login_callback, NULL ); - // UI textures have been previously loaded in doPreloadImages() - - LL_DEBUGS("AppInit") << "Setting Servers" << LL_ENDL; - - LLPanelLogin::addServer(LLViewerLogin::getInstance()->getGridLabel(), LLViewerLogin::getInstance()->getGridChoice()); - - LLViewerLogin* vl = LLViewerLogin::getInstance(); - for(int grid_index = GRID_INFO_ADITI; grid_index < GRID_INFO_OTHER; ++grid_index) - { - LLPanelLogin::addServer(vl->getKnownGridLabel((EGridInfo)grid_index), grid_index); - } } // Callback for when login screen is closed. Option 0 = connect, option 1 = quit. @@ -2084,9 +2094,6 @@ void login_callback(S32 option, void *userdata) } else if (QUIT_OPTION == option) // *TODO: THIS CODE SEEMS TO BE UNREACHABLE!!!!! login_callback is never called with option equal to QUIT_OPTION { - // Make sure we don't save the password if the user is trying to clear it. - std::string first, last, password; - LLPanelLogin::getFields(&first, &last, &password); if (!gSavedSettings.getBOOL("RememberPassword")) { // turn off the setting and write out to disk @@ -2109,142 +2116,6 @@ void login_callback(S32 option, void *userdata) } } - -// static -std::string LLStartUp::loadPasswordFromDisk() -{ - // Only load password if we also intend to save it (otherwise the user - // wonders what we're doing behind his back). JC - BOOL remember_password = gSavedSettings.getBOOL("RememberPassword"); - if (!remember_password) - { - return std::string(""); - } - - std::string hashed_password(""); - - // Look for legacy "marker" password from settings.ini - hashed_password = gSavedSettings.getString("Marker"); - if (!hashed_password.empty()) - { - // Stomp the Marker entry. - gSavedSettings.setString("Marker", ""); - - // Return that password. - return hashed_password; - } - - std::string filepath = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, - "password.dat"); - LLFILE* fp = LLFile::fopen(filepath, "rb"); /* Flawfinder: ignore */ - if (!fp) - { - return hashed_password; - } - - // UUID is 16 bytes, written into ASCII is 32 characters - // without trailing \0 - const S32 HASHED_LENGTH = 32; - U8 buffer[HASHED_LENGTH+1]; - - if (1 != fread(buffer, HASHED_LENGTH, 1, fp)) - { - return hashed_password; - } - - fclose(fp); - - // Decipher with MAC address - LLXORCipher cipher(gMACAddress, 6); - cipher.decrypt(buffer, HASHED_LENGTH); - - buffer[HASHED_LENGTH] = '\0'; - - // Check to see if the mac address generated a bad hashed - // password. It should be a hex-string or else the mac adress has - // changed. This is a security feature to make sure that if you - // get someone's password.dat file, you cannot hack their account. - if(is_hex_string(buffer, HASHED_LENGTH)) - { - hashed_password.assign((char*)buffer); - } - - return hashed_password; -} - - -// static -void LLStartUp::savePasswordToDisk(const std::string& hashed_password) -{ - std::string filepath = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, - "password.dat"); - LLFILE* fp = LLFile::fopen(filepath, "wb"); /* Flawfinder: ignore */ - if (!fp) - { - return; - } - - // Encipher with MAC address - const S32 HASHED_LENGTH = 32; - U8 buffer[HASHED_LENGTH+1]; - - LLStringUtil::copy((char*)buffer, hashed_password.c_str(), HASHED_LENGTH+1); - - LLXORCipher cipher(gMACAddress, 6); - cipher.encrypt(buffer, HASHED_LENGTH); - - if (fwrite(buffer, HASHED_LENGTH, 1, fp) != 1) - { - LL_WARNS("AppInit") << "Short write" << LL_ENDL; - } - - fclose(fp); -} - - -// static -void LLStartUp::deletePasswordFromDisk() -{ - std::string filepath = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, - "password.dat"); - LLFile::remove(filepath); -} - - -bool is_hex_string(U8* str, S32 len) -{ - bool rv = true; - U8* c = str; - while(rv && len--) - { - switch(*c) - { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - ++c; - break; - default: - rv = false; - break; - } - } - return rv; -} - void show_first_run_dialog() { LLNotificationsUtil::add("FirstRun", LLSD(), LLSD(), first_run_dialog_callback); @@ -2286,7 +2157,7 @@ bool login_alert_status(const LLSD& notification, const LLSD& response) // break; case 2: // Teleport // Restart the login process, starting at our home locaton - LLURLSimString::setString("home"); + LLStartUp::setStartSLURL(LLSLURL(LLSLURL::SIM_LOCATION_HOME)); LLStartUp::setStartupState( STATE_LOGIN_CLEANUP ); break; default: @@ -2473,7 +2344,7 @@ void register_viewer_callbacks(LLMessageSystem* msg) msg->setHandlerFunc("MapBlockReply", LLWorldMapMessage::processMapBlockReply); msg->setHandlerFunc("MapItemReply", LLWorldMapMessage::processMapItemReply); - msg->setHandlerFunc("EventInfoReply", LLPanelEvent::processEventInfoReply); + msg->setHandlerFunc("EventInfoReply", LLFloaterEvent::processEventInfoReply); msg->setHandlerFunc("PickInfoReply", &LLAvatarPropertiesProcessor::processPickInfoReply); // msg->setHandlerFunc("ClassifiedInfoReply", LLPanelClassified::processClassifiedInfoReply); msg->setHandlerFunc("ClassifiedInfoReply", LLAvatarPropertiesProcessor::processClassifiedInfoReply); @@ -2503,84 +2374,163 @@ void asset_callback_nothing(LLVFS*, const LLUUID&, LLAssetType::EType, void*, S3 } // *HACK: Must match name in Library or agent inventory +const std::string ROOT_GESTURES_FOLDER = "Gestures"; const std::string COMMON_GESTURES_FOLDER = "Common Gestures"; const std::string MALE_GESTURES_FOLDER = "Male Gestures"; const std::string FEMALE_GESTURES_FOLDER = "Female Gestures"; -const std::string MALE_OUTFIT_FOLDER = "Male Shape & Outfit"; -const std::string FEMALE_OUTFIT_FOLDER = "Female Shape & Outfit"; +const std::string SPEECH_GESTURES_FOLDER = "Speech Gestures"; +const std::string OTHER_GESTURES_FOLDER = "Other Gestures"; const S32 OPT_CLOSED_WINDOW = -1; const S32 OPT_MALE = 0; const S32 OPT_FEMALE = 1; - +const S32 OPT_TRUST_CERT = 0; +const S32 OPT_CANCEL_TRUST = 1; + bool callback_choose_gender(const LLSD& notification, const LLSD& response) -{ - S32 option = LLNotificationsUtil::getSelectedOption(notification, response); +{ + + // These defaults are returned from the server on login. They are set in login.xml. + // If no default is returned from the server, they are retrieved from settings.xml. + + S32 option = LLNotification::getSelectedOption(notification, response); switch(option) { - case OPT_MALE: - LLStartUp::loadInitialOutfit( MALE_OUTFIT_FOLDER, "male" ); - break; - - case OPT_FEMALE: - case OPT_CLOSED_WINDOW: - default: - LLStartUp::loadInitialOutfit( FEMALE_OUTFIT_FOLDER, "female" ); - break; + case OPT_MALE: + LLStartUp::loadInitialOutfit( gSavedSettings.getString("DefaultMaleAvatar"), "male" ); + break; + + case OPT_FEMALE: + case OPT_CLOSED_WINDOW: + default: + LLStartUp::loadInitialOutfit( gSavedSettings.getString("DefaultFemaleAvatar"), "female" ); + break; } return false; } +void LLStartUp::copyLibraryGestures(const std::string& same_gender_gestures) +{ + llinfos << "Copying library gestures" << llendl; + + // Copy gestures + LLUUID lib_gesture_cat_id = + gInventory.findCategoryUUIDForType(LLFolderType::FT_GESTURE,false,true); + if (lib_gesture_cat_id.isNull()) + { + llwarns << "Unable to copy gestures, source category not found" << llendl; + } + LLUUID dst_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_GESTURE); + + std::vector<std::string> gesture_folders_to_copy; + gesture_folders_to_copy.push_back(MALE_GESTURES_FOLDER); + gesture_folders_to_copy.push_back(FEMALE_GESTURES_FOLDER); + gesture_folders_to_copy.push_back(COMMON_GESTURES_FOLDER); + gesture_folders_to_copy.push_back(SPEECH_GESTURES_FOLDER); + gesture_folders_to_copy.push_back(OTHER_GESTURES_FOLDER); + + for(std::vector<std::string>::iterator it = gesture_folders_to_copy.begin(); + it != gesture_folders_to_copy.end(); + ++it) + { + std::string& folder_name = *it; + + LLPointer<LLInventoryCallback> cb(NULL); + + if (folder_name == same_gender_gestures || + folder_name == COMMON_GESTURES_FOLDER || + folder_name == OTHER_GESTURES_FOLDER) + { + cb = new ActivateGestureCallback; + } + + + LLUUID cat_id = findDescendentCategoryIDByName(lib_gesture_cat_id,folder_name); + if (cat_id.isNull()) + { + llwarns << "failed to find gesture folder for " << folder_name << llendl; + } + else + { + llinfos << "initiating fetch and copy for " << folder_name << " cat_id " << cat_id << llendl; + LLAppearanceMgr* app_mgr = LLAppearanceMgr::getInstance(); + callAfterCategoryFetch(cat_id, + boost::bind(&LLAppearanceMgr::shallowCopyCategory, + app_mgr, + cat_id, + dst_id, + cb)); + } + } +} + void LLStartUp::loadInitialOutfit( const std::string& outfit_folder_name, const std::string& gender_name ) { + llinfos << "starting" << llendl; + // Not going through the processAgentInitialWearables path, so need to set this here. - LLAppearanceManager::instance().setAttachmentInvLinkEnable(true); + LLAppearanceMgr::instance().setAttachmentInvLinkEnable(true); // Initiate creation of COF, since we're also bypassing that. gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT); S32 gender = 0; - std::string gestures; + std::string same_gender_gestures; if (gender_name == "male") { gender = OPT_MALE; - gestures = MALE_GESTURES_FOLDER; + same_gender_gestures = MALE_GESTURES_FOLDER; } else { gender = OPT_FEMALE; - gestures = FEMALE_GESTURES_FOLDER; + same_gender_gestures = FEMALE_GESTURES_FOLDER; } // try to find the outfit - if not there, create some default // wearables. - LLInventoryModel::cat_array_t cat_array; - LLInventoryModel::item_array_t item_array; - LLNameCategoryCollector has_name(outfit_folder_name); - gInventory.collectDescendentsIf(gInventory.getLibraryRootFolderID(), - cat_array, - item_array, - LLInventoryModel::EXCLUDE_TRASH, - has_name); - if (0 == cat_array.count()) + LLUUID cat_id = findDescendentCategoryIDByName( + gInventory.getLibraryRootFolderID(), + outfit_folder_name); + if (cat_id.isNull()) { gAgentWearables.createStandardWearables(gender); } else { - LLInventoryCategory* cat = cat_array.get(0); + sWearablesLoadedCon = gAgentWearables.addLoadedCallback(LLStartUp::saveInitialOutfit); + bool do_copy = true; bool do_append = false; - LLAppearanceManager::instance().wearInventoryCategory(cat, do_copy, do_append); + LLViewerInventoryCategory *cat = gInventory.getCategory(cat_id); + LLAppearanceMgr::instance().wearInventoryCategory(cat, do_copy, do_append); } - LLAppearanceManager::instance().wearOutfitByName(gestures); - LLAppearanceManager::instance().wearOutfitByName(COMMON_GESTURES_FOLDER); + // Copy gestures + copyLibraryGestures(same_gender_gestures); + // This is really misnamed -- it means we have started loading // an outfit/shape that will give the avatar a gender eventually. JC gAgent.setGenderChosen(TRUE); } +//static +void LLStartUp::saveInitialOutfit() +{ + if (sInitialOutfit.empty()) return; + + if (sWearablesLoadedCon.connected()) + { + sWearablesLoadedCon.disconnect(); + } + LLAppearanceMgr::getInstance()->makeNewOutfitLinks(sInitialOutfit,false); +} + +std::string& LLStartUp::getInitialOutfitName() +{ + return sInitialOutfit; +} + // Loads a bitmap to display during load void init_start_screen(S32 location_id) { @@ -2696,6 +2646,8 @@ void LLStartUp::postStartupState() void reset_login() { + gAgentWearables.cleanup(); + gAgentCamera.cleanup(); gAgent.cleanup(); LLWorld::getInstance()->destroyClass(); @@ -2714,13 +2666,6 @@ void reset_login() //--------------------------------------------------------------------------- -std::string LLStartUp::sSLURLCommand; - -bool LLStartUp::canGoFullscreen() -{ - return gStartupState >= STATE_WORLD_INIT; -} - // Initialize all plug-ins except the web browser (which was initialized // early, before the login screen). JC void LLStartUp::multimediaInit() @@ -2747,41 +2692,146 @@ void LLStartUp::fontInit() bool LLStartUp::dispatchURL() { // ok, if we've gotten this far and have a startup URL - if (!sSLURLCommand.empty()) + if (!getStartSLURL().isValid()) { - LLMediaCtrl* web = NULL; - const bool trusted_browser = false; - LLURLDispatcher::dispatch(sSLURLCommand, web, trusted_browser); + return false; } - else if (LLURLSimString::parse()) - { + if(getStartSLURL().getType() != LLSLURL::APP) + { + // If we started with a location, but we're already // at that location, don't pop dialogs open. LLVector3 pos = gAgent.getPositionAgent(); - F32 dx = pos.mV[VX] - (F32)LLURLSimString::sInstance.mX; - F32 dy = pos.mV[VY] - (F32)LLURLSimString::sInstance.mY; + LLVector3 slurlpos = getStartSLURL().getPosition(); + F32 dx = pos.mV[VX] - slurlpos.mV[VX]; + F32 dy = pos.mV[VY] - slurlpos.mV[VY]; const F32 SLOP = 2.f; // meters - if( LLURLSimString::sInstance.mSimName != gAgent.getRegion()->getName() + if( getStartSLURL().getRegion() != gAgent.getRegion()->getName() || (dx*dx > SLOP*SLOP) || (dy*dy > SLOP*SLOP) ) { - std::string url = LLURLSimString::getURL(); - LLMediaCtrl* web = NULL; - const bool trusted_browser = false; - LLURLDispatcher::dispatch(url, web, trusted_browser); + LLURLDispatcher::dispatch(getStartSLURL().getSLURLString(), + NULL, false); } return true; } return false; } +void LLStartUp::setStartSLURL(const LLSLURL& slurl) +{ + sStartSLURL = slurl; + switch(slurl.getType()) + { + case LLSLURL::HOME_LOCATION: + { + gSavedSettings.setString("LoginLocation", LLSLURL::SIM_LOCATION_HOME); + break; + } + case LLSLURL::LAST_LOCATION: + { + gSavedSettings.setString("LoginLocation", LLSLURL::SIM_LOCATION_LAST); + break; + } + default: + LLGridManager::getInstance()->setGridChoice(slurl.getGrid()); + break; + } +} + bool login_alert_done(const LLSD& notification, const LLSD& response) { LLPanelLogin::giveFocus(); return false; } +// parse the certificate information into args for the +// certificate notifications +LLSD transform_cert_args(LLPointer<LLCertificate> cert) +{ + LLSD args = LLSD::emptyMap(); + std::string value; + LLSD cert_info; + cert->getLLSD(cert_info); + // convert all of the elements in the cert into + // args for the xml dialog, so we have flexability to + // display various parts of the cert by only modifying + // the cert alert dialog xml. + for(LLSD::map_iterator iter = cert_info.beginMap(); + iter != cert_info.endMap(); + iter++) + { + // key usage and extended key usage + // are actually arrays, and we want to format them as comma separated + // strings, so special case those. + LLSDSerialize::toXML(cert_info[iter->first], std::cout); + if((iter->first== std::string(CERT_KEY_USAGE)) | + (iter->first == std::string(CERT_EXTENDED_KEY_USAGE))) + { + value = ""; + LLSD usage = cert_info[iter->first]; + for (LLSD::array_iterator usage_iter = usage.beginArray(); + usage_iter != usage.endArray(); + usage_iter++) + { + + if(usage_iter != usage.beginArray()) + { + value += ", "; + } + + value += (*usage_iter).asString(); + } + + } + else + { + value = iter->second.asString(); + } + + std::string name = iter->first; + std::transform(name.begin(), name.end(), name.begin(), + (int(*)(int))toupper); + args[name.c_str()] = value; + } + return args; +} + + +// when we handle a cert error, give focus back to the login panel +void general_cert_done(const LLSD& notification, const LLSD& response) +{ + LLStartUp::setStartupState( STATE_LOGIN_SHOW ); + LLPanelLogin::giveFocus(); +} + +// check to see if the user wants to trust the cert. +// if they do, add it to the cert store and +void trust_cert_done(const LLSD& notification, const LLSD& response) +{ + S32 option = LLNotification::getSelectedOption(notification, response); + switch(option) + { + case OPT_TRUST_CERT: + { + LLPointer<LLCertificate> cert = gSecAPIHandler->getCertificate(notification["payload"]["certificate"]); + LLPointer<LLCertificateStore> store = gSecAPIHandler->getCertificateStore(gSavedSettings.getString("CertStore")); + store->add(cert); + store->save(); + LLStartUp::setStartupState( STATE_LOGIN_CLEANUP ); + break; + } + case OPT_CANCEL_TRUST: + reset_login(); + gSavedSettings.setBOOL("AutoLogin", FALSE); + LLStartUp::setStartupState( STATE_LOGIN_SHOW ); + default: + LLPanelLogin::giveFocus(); + break; + } + +} void apply_udp_blacklist(const std::string& csv) { @@ -2829,33 +2879,45 @@ bool process_login_success_response() text = response["secure_session_id"].asString(); if(!text.empty()) gAgent.mSecureSessionID.set(text); - text = response["first_name"].asString(); - if(!text.empty()) - { - // Remove quotes from string. Login.cgi sends these to force - // names that look like numbers into strings. - gFirstname.assign(text); - LLStringUtil::replaceChar(gFirstname, '"', ' '); - LLStringUtil::trim(gFirstname); - } - text = response["last_name"].asString(); - if(!text.empty()) + // if the response contains a display name, use that, + // otherwise if the response contains a first and/or last name, + // use those. Otherwise use the credential identifier + + gDisplayName = ""; + if (response.has("display_name")) { - gLastname.assign(text); + gDisplayName.assign(response["display_name"].asString()); + if(!gDisplayName.empty()) + { + // Remove quotes from string. Login.cgi sends these to force + // names that look like numbers into strings. + LLStringUtil::replaceChar(gDisplayName, '"', ' '); + LLStringUtil::trim(gDisplayName); + } } - gSavedSettings.setString("FirstName", gFirstname); - gSavedSettings.setString("LastName", gLastname); - - if (gSavedSettings.getBOOL("RememberPassword")) + if(gDisplayName.empty()) { - // Successful login means the password is valid, so save it. - LLStartUp::savePasswordToDisk(gPassword); + if(response.has("first_name")) + { + gDisplayName.assign(response["first_name"].asString()); + LLStringUtil::replaceChar(gDisplayName, '"', ' '); + LLStringUtil::trim(gDisplayName); + } + if(response.has("last_name")) + { + text.assign(response["last_name"].asString()); + LLStringUtil::replaceChar(text, '"', ' '); + LLStringUtil::trim(text); + if(!gDisplayName.empty()) + { + gDisplayName += " "; + } + gDisplayName += text; + } } - else + if(gDisplayName.empty()) { - // Don't leave password from previous session sitting around - // during this login session. - LLStartUp::deletePasswordFromDisk(); + gDisplayName.assign(gUserCredential->asString()); } // this is their actual ability to access content @@ -2871,7 +2933,9 @@ bool process_login_success_response() text = response["agent_region_access"].asString(); if (!text.empty()) { - int preferredMaturity = LLAgent::convertTextToMaturity(text[0]); + U32 preferredMaturity = + llmin((U32)LLAgent::convertTextToMaturity(text[0]), + gSavedSettings.getU32("PreferredMaturity")); gSavedSettings.setU32("PreferredMaturity", preferredMaturity); } // During the AO transition, this flag will be true. Then the flag will @@ -2947,7 +3011,7 @@ bool process_login_success_response() // replace the default help URL format gSavedSettings.setString("HelpURLFormat",text); - // don't fall back to Nebraska's pre-connection static help + // don't fall back to Standalone's pre-connection static help gSavedSettings.setBOOL("HelpUseLocal", false); } @@ -3010,6 +3074,37 @@ bool process_login_success_response() LLStringOps::setupDatetimeInfo(pacific_daylight_time); } + // set up the voice configuration. Ultimately, we should pass this up as part of each voice + // channel if we need to move to multiple voice servers per grid. + LLSD voice_config_info = response["voice-config"]; + if(voice_config_info.has("VoiceServerType")) + { + gSavedSettings.setString("VoiceServerType", voice_config_info["VoiceServerType"].asString()); + } + + // Request the map server url + std::string map_server_url = response["map-server-url"]; + if(!map_server_url.empty()) + { + gSavedSettings.setString("MapServerURL", map_server_url); + } + + // Default male and female avatars allowing the user to choose their avatar on first login. + // These may be passed up by SLE to allow choice of enterprise avatars instead of the standard + // "new ruth." Not to be confused with 'initial-outfit' below + LLSD newuser_config = response["newuser-config"][0]; + if(newuser_config.has("DefaultFemaleAvatar")) + { + gSavedSettings.setString("DefaultFemaleAvatar", newuser_config["DefaultFemaleAvatar"].asString()); + } + if(newuser_config.has("DefaultMaleAvatar")) + { + gSavedSettings.setString("DefaultMaleAvatar", newuser_config["DefaultMaleAvatar"].asString()); + } + + // Initial outfit for the user. + // QUESTION: Why can't we simply simply set the users outfit directly + // from a web page into the user info on the server? - Roxie LLSD initial_outfit = response["initial-outfit"][0]; if(initial_outfit.size()) { @@ -3053,10 +3148,17 @@ bool process_login_success_response() } } + // Start the process of fetching the OpenID session cookie for this user login + std::string openid_url = response["openid_url"]; + if(!openid_url.empty()) + { + std::string openid_token = response["openid_token"]; + LLViewerMedia::openIDSetup(openid_url, openid_token); + } bool success = false; // JC: gesture loading done below, when we have an asset system - // in place. Don't delete/clear user_credentials until then. + // in place. Don't delete/clear gUserCredentials until then. if(gAgentID.notNull() && gAgentSessionID.notNull() && gMessageSystem->mOurCircuitCode diff --git a/indra/newview/llstartup.h b/indra/newview/llstartup.h index 92fe9521d3..cf3c030f08 100644 --- a/indra/newview/llstartup.h +++ b/indra/newview/llstartup.h @@ -38,6 +38,7 @@ class LLViewerTexture ; class LLEventPump; class LLStartupListener; +class LLSLURL; // functions bool idle_startup(); @@ -80,9 +81,6 @@ extern LLPointer<LLViewerTexture> gStartTexture; class LLStartUp { public: - static bool canGoFullscreen(); - // returns true if we are far enough along in startup to allow - // going full screen // Always use this to set gStartupState so changes are logged static void setStartupState( EStartupState state ); @@ -95,32 +93,30 @@ public: // Load default fonts not already loaded at start screen static void fontInit(); + static void copyLibraryGestures(const std::string& same_gender_gestures); + // outfit_folder_name can be a folder anywhere in your inventory, // but the name must be a case-sensitive exact match. // gender_name is either "male" or "female" static void loadInitialOutfit( const std::string& outfit_folder_name, const std::string& gender_name ); - // Load MD5 of user's password from local disk file. - static std::string loadPasswordFromDisk(); - - // Record MD5 of user's password for subsequent login. - static void savePasswordToDisk(const std::string& hashed_password); - - // Delete the saved password local disk file. - static void deletePasswordFromDisk(); + //save loaded initial outfit into My Outfits category + static void saveInitialOutfit(); + + static std::string& getInitialOutfitName(); static bool dispatchURL(); // if we have a SLURL or sim string ("Ahern/123/45") that started // the viewer, dispatch it - static std::string sSLURLCommand; - // *HACK: On startup, if we were passed a secondlife://app/do/foo - // command URL, store it for later processing. - static void postStartupState(); + static void setStartSLURL(const LLSLURL& slurl); + static LLSLURL& getStartSLURL() { return sStartSLURL; } private: + static LLSLURL sStartSLURL; + static std::string startupStateToString(EStartupState state); static EStartupState gStartupState; // Do not set directly, use LLStartup::setStartupState static boost::scoped_ptr<LLEventPump> sStateWatcher; diff --git a/indra/newview/llstatusbar.cpp b/indra/newview/llstatusbar.cpp index bff32af228..8c8fbdc88c 100644 --- a/indra/newview/llstatusbar.cpp +++ b/indra/newview/llstatusbar.cpp @@ -36,11 +36,14 @@ // viewer includes #include "llagent.h" +#include "llagentcamera.h" #include "llbutton.h" #include "llcommandhandler.h" #include "llviewercontrol.h" #include "llfloaterbuycurrency.h" +#include "llbuycurrencyhtml.h" #include "llfloaterlagmeter.h" +#include "llpanelnearbymedia.h" #include "llpanelvolumepulldown.h" #include "llfloaterregioninfo.h" #include "llfloaterscriptdebug.h" @@ -49,6 +52,7 @@ #include "llkeyboard.h" #include "lllineeditor.h" #include "llmenugl.h" +#include "llrootview.h" #include "llsd.h" #include "lltextbox.h" #include "llui.h" @@ -61,6 +65,7 @@ #include "llresmgr.h" #include "llworld.h" #include "llstatgraph.h" +#include "llviewermedia.h" #include "llviewermenu.h" // for gMenuBarView #include "llviewerparcelmgr.h" #include "llviewerthrottle.h" @@ -130,7 +135,6 @@ LLStatusBar::LLStatusBar(const LLRect& rect) // status bar can possible overlay menus? setMouseOpaque(FALSE); - setIsChrome(TRUE); // size of day of the weeks and year sDays.reserve(7); @@ -140,9 +144,39 @@ LLStatusBar::LLStatusBar(const LLRect& rect) mHealthTimer = new LLFrameTimer(); LLUICtrlFactory::getInstance()->buildPanel(this,"panel_status_bar.xml"); +} + +LLStatusBar::~LLStatusBar() +{ + delete mBalanceTimer; + mBalanceTimer = NULL; + + delete mHealthTimer; + mHealthTimer = NULL; + + // LLView destructor cleans up children +} - // status bar can never get a tab - setFocusRoot(FALSE); +//----------------------------------------------------------------------- +// Overrides +//----------------------------------------------------------------------- + +// virtual +void LLStatusBar::draw() +{ + refresh(); + LLPanel::draw(); +} + +BOOL LLStatusBar::handleRightMouseDown(S32 x, S32 y, MASK mask) +{ + show_navbar_context_menu(this,x,y); + return TRUE; +} + +BOOL LLStatusBar::postBuild() +{ + gMenuBarView->setRightMouseDownCallback(boost::bind(&show_navbar_context_menu, _1, _2, _3)); // build date necessary data (must do after panel built) setupDate(); @@ -158,7 +192,10 @@ LLStatusBar::LLStatusBar(const LLRect& rect) mBtnVolume = getChild<LLButton>( "volume_btn" ); mBtnVolume->setClickedCallback( onClickVolume, this ); mBtnVolume->setMouseEnterCallback(boost::bind(&LLStatusBar::onMouseEnterVolume, this)); - mBtnVolume->setIsChrome(TRUE); + + mMediaToggle = getChild<LLButton>("media_toggle_btn"); + mMediaToggle->setClickedCallback( &LLStatusBar::onClickMediaToggle, this ); + mMediaToggle->setMouseEnterCallback(boost::bind(&LLStatusBar::onMouseEnterNearbyMedia, this)); gSavedSettings.getControl("MuteAudio")->getSignal()->connect(boost::bind(&LLStatusBar::onVolumeChanged, this, _2)); @@ -206,51 +243,13 @@ LLStatusBar::LLStatusBar(const LLRect& rect) mPanelVolumePulldown = new LLPanelVolumePulldown(); addChild(mPanelVolumePulldown); - - LLRect volume_pulldown_rect = mPanelVolumePulldown->getRect(); - LLButton* volbtn = getChild<LLButton>( "volume_btn" ); - volume_pulldown_rect.setLeftTopAndSize(volbtn->getRect().mLeft - - (volume_pulldown_rect.getWidth() - volbtn->getRect().getWidth())/2, - volbtn->calcScreenRect().mBottom, - volume_pulldown_rect.getWidth(), - volume_pulldown_rect.getHeight()); - - mPanelVolumePulldown->setShape(volume_pulldown_rect); mPanelVolumePulldown->setFollows(FOLLOWS_TOP|FOLLOWS_RIGHT); mPanelVolumePulldown->setVisible(FALSE); -} -LLStatusBar::~LLStatusBar() -{ - delete mBalanceTimer; - mBalanceTimer = NULL; - - delete mHealthTimer; - mHealthTimer = NULL; - - // LLView destructor cleans up children -} - -//----------------------------------------------------------------------- -// Overrides -//----------------------------------------------------------------------- - -// virtual -void LLStatusBar::draw() -{ - refresh(); - LLPanel::draw(); -} - -BOOL LLStatusBar::handleRightMouseDown(S32 x, S32 y, MASK mask) -{ - show_navbar_context_menu(this,x,y); - return TRUE; -} - -BOOL LLStatusBar::postBuild() -{ - gMenuBarView->setRightMouseDownCallback(boost::bind(&show_navbar_context_menu, _1, _2, _3)); + mPanelNearByMedia = new LLPanelNearByMedia(); + addChild(mPanelNearByMedia); + mPanelNearByMedia->setFollows(FOLLOWS_TOP|FOLLOWS_RIGHT); + mPanelNearByMedia->setVisible(FALSE); return TRUE; } @@ -316,7 +315,7 @@ void LLStatusBar::refresh() childSetVisible("scriptout", false); } - if (gAgent.getCameraMode() == CAMERA_MODE_MOUSELOOK && + if (gAgentCamera.getCameraMode() == CAMERA_MODE_MOUSELOOK && ((region && region->getAllowDamage()) || (parcel && parcel->getAllowDamage()))) { // set visibility based on flashing @@ -356,13 +355,25 @@ void LLStatusBar::refresh() // update the master volume button state bool mute_audio = LLAppViewer::instance()->getMasterSystemAudioMute(); mBtnVolume->setToggleState(mute_audio); + + // Disable media toggle if there's no media, parcel media, and no parcel audio + // (or if media is disabled) + bool button_enabled = (gSavedSettings.getBOOL("AudioStreamingMusic")||gSavedSettings.getBOOL("AudioStreamingMedia")) && + (LLViewerMedia::hasInWorldMedia() || LLViewerMedia::hasParcelMedia() || LLViewerMedia::hasParcelAudio()); + mMediaToggle->setEnabled(button_enabled); + // Note the "sense" of the toggle is opposite whether media is playing or not + bool any_media_playing = (LLViewerMedia::isAnyMediaShowing() || + LLViewerMedia::isParcelMediaPlaying() || + LLViewerMedia::isParcelAudioPlaying()); + mMediaToggle->setValue(!any_media_playing); } void LLStatusBar::setVisibleForMouselook(bool visible) { mTextTime->setVisible(visible); - getChild<LLUICtrl>("buycurrency")->setVisible(visible); - getChild<LLUICtrl>("buyL")->setVisible(visible); + getChild<LLUICtrl>("balance_bg")->setVisible(visible); + mBtnVolume->setVisible(visible); + mMediaToggle->setVisible(visible); mSGBandwidth->setVisible(visible); mSGPacketLoss->setVisible(visible); setBackgroundVisible(visible); @@ -382,18 +393,21 @@ void LLStatusBar::setBalance(S32 balance) { std::string money_str = LLResMgr::getInstance()->getMonetaryString( balance ); - LLButton* btn_buy_currency = getChild<LLButton>("buycurrency"); + LLTextBox* balance_box = getChild<LLTextBox>("balance"); LLStringUtil::format_map_t string_args; string_args["[AMT]"] = llformat("%s", money_str.c_str()); - std::string labe_str = getString("buycurrencylabel", string_args); - btn_buy_currency->setLabel(labe_str); + std::string label_str = getString("buycurrencylabel", string_args); + balance_box->setValue(label_str); - // Resize the balance button so that the label fits it, and the button expands to the left. - // *TODO: LLButton should have an option where to expand. + // Resize the L$ balance background to be wide enough for your balance plus the buy button { - S32 saved_right = btn_buy_currency->getRect().mRight; - btn_buy_currency->autoResize(); - btn_buy_currency->translate(saved_right - btn_buy_currency->getRect().mRight, 0); + const S32 HPAD = 24; + LLRect balance_rect = balance_box->getTextBoundingRect(); + LLRect buy_rect = getChildView("buyL")->getRect(); + LLView* balance_bg_view = getChildView("balance_bg"); + LLRect balance_bg_rect = balance_bg_view->getRect(); + balance_bg_rect.mLeft = balance_bg_rect.mRight - (buy_rect.getWidth() + balance_rect.getWidth() + HPAD); + balance_bg_view->setShape(balance_bg_rect); } if (mBalance && (fabs((F32)(mBalance - balance)) > gSavedSettings.getF32("UISndMoneyChangeThreshold"))) @@ -436,11 +450,9 @@ void LLStatusBar::setHealth(S32 health) { if (mHealth > (health + gSavedSettings.getF32("UISndHealthReductionThreshold"))) { - LLVOAvatar *me; - - if ((me = gAgent.getAvatarObject())) + if (isAgentAvatarValid()) { - if (me->getSex() == SEX_FEMALE) + if (gAgentAvatarp->getSex() == SEX_FEMALE) { make_ui_sound("UISndHealthReductionF"); } @@ -500,7 +512,9 @@ S32 LLStatusBar::getSquareMetersLeft() const void LLStatusBar::onClickBuyCurrency() { - LLFloaterBuyCurrency::buyCurrency(); + // open a currency floater - actual one open depends on + // value specified in settings.xml + LLBuyCurrencyHTML::openCurrencyFloater(); } static void onClickHealth(void* ) @@ -513,13 +527,51 @@ static void onClickScriptDebug(void*) LLFloaterScriptDebug::show(LLUUID::null); } -//static -void LLStatusBar::onMouseEnterVolume(LLUICtrl* ctrl) +void LLStatusBar::onMouseEnterVolume() { + LLButton* volbtn = getChild<LLButton>( "volume_btn" ); + LLRect vol_btn_rect = volbtn->getRect(); + LLRect volume_pulldown_rect = mPanelVolumePulldown->getRect(); + volume_pulldown_rect.setLeftTopAndSize(vol_btn_rect.mLeft - + (volume_pulldown_rect.getWidth() - vol_btn_rect.getWidth())/2, + vol_btn_rect.mBottom, + volume_pulldown_rect.getWidth(), + volume_pulldown_rect.getHeight()); + + mPanelVolumePulldown->setShape(volume_pulldown_rect); + + // show the master volume pull-down - gStatusBar->mPanelVolumePulldown->setVisible(TRUE); + LLUI::clearPopups(); + LLUI::addPopup(mPanelVolumePulldown); + mPanelNearByMedia->setVisible(FALSE); + mPanelVolumePulldown->setVisible(TRUE); } +void LLStatusBar::onMouseEnterNearbyMedia() +{ + LLView* popup_holder = gViewerWindow->getRootView()->getChildView("popup_holder"); + LLRect nearby_media_rect = mPanelNearByMedia->getRect(); + LLButton* nearby_media_btn = getChild<LLButton>( "media_toggle_btn" ); + LLRect nearby_media_btn_rect = nearby_media_btn->getRect(); + nearby_media_rect.setLeftTopAndSize(nearby_media_btn_rect.mLeft - + (nearby_media_rect.getWidth() - nearby_media_btn_rect.getWidth())/2, + nearby_media_btn_rect.mBottom, + nearby_media_rect.getWidth(), + nearby_media_rect.getHeight()); + // force onscreen + nearby_media_rect.translate(popup_holder->getRect().getWidth() - nearby_media_rect.mRight, 0); + + // show the master volume pull-down + mPanelNearByMedia->setShape(nearby_media_rect); + LLUI::clearPopups(); + LLUI::addPopup(mPanelNearByMedia); + + mPanelVolumePulldown->setVisible(FALSE); + mPanelNearByMedia->setVisible(TRUE); +} + + static void onClickVolume(void* data) { // toggle the master mute setting @@ -527,6 +579,15 @@ static void onClickVolume(void* data) LLAppViewer::instance()->setMasterSystemAudioMute(!mute_audio); } +//static +void LLStatusBar::onClickMediaToggle(void* data) +{ + LLStatusBar *status_bar = (LLStatusBar*)data; + // "Selected" means it was showing the "play" icon (so media was playing), and now it shows "pause", so turn off media + bool enable = ! status_bar->mMediaToggle->getValue(); + LLViewerMedia::setAllMediaEnabled(enable); +} + // sets the static variables necessary for the date void LLStatusBar::setupDate() { diff --git a/indra/newview/llstatusbar.h b/indra/newview/llstatusbar.h index 21a98dd753..e5240fcc3e 100644 --- a/indra/newview/llstatusbar.h +++ b/indra/newview/llstatusbar.h @@ -48,6 +48,7 @@ class LLUUID; class LLFrameTimer; class LLStatGraph; class LLPanelVolumePulldown; +class LLPanelNearByMedia; class LLStatusBar : public LLPanel @@ -87,6 +88,8 @@ public: S32 getSquareMetersCommitted() const; S32 getSquareMetersLeft() const; + LLPanelNearByMedia* getNearbyMediaPanel() { return mPanelNearByMedia; } + private: // simple method to setup the part that holds the date void setupDate(); @@ -94,9 +97,13 @@ private: void onClickBuyCurrency(); void onVolumeChanged(const LLSD& newvalue); - static void onMouseEnterVolume(LLUICtrl* ctrl); + void onMouseEnterVolume(); + void onMouseEnterNearbyMedia(); + void onClickScreen(S32 x, S32 y); static void onClickStatGraph(void* data); + static void onClickMediaToggle(void* data); + private: LLTextBox *mTextHealth; LLTextBox *mTextTime; @@ -105,6 +112,7 @@ private: LLStatGraph *mSGPacketLoss; LLButton *mBtnVolume; + LLButton *mMediaToggle; S32 mBalance; S32 mHealth; @@ -113,6 +121,7 @@ private: LLFrameTimer* mBalanceTimer; LLFrameTimer* mHealthTimer; LLPanelVolumePulldown* mPanelVolumePulldown; + LLPanelNearByMedia* mPanelNearByMedia; static std::vector<std::string> sDays; static std::vector<std::string> sMonths; static const U32 MAX_DATE_STRING_LENGTH; diff --git a/indra/newview/llstylemap.cpp b/indra/newview/llstylemap.cpp index 2485563cbc..8fab3bb361 100644 --- a/indra/newview/llstylemap.cpp +++ b/indra/newview/llstylemap.cpp @@ -49,13 +49,15 @@ const LLStyle::Params &LLStyleMap::lookupAgent(const LLUUID &source) if (source != LLUUID::null && source != gAgent.getID() ) { style_params.color.control = "HTMLLinkColor"; + style_params.readonly_color.control = "HTMLLinkColor"; style_params.link_href = - LLSLURL::buildCommand("agent", source, "inspect"); + LLSLURL("agent", source, "inspect").getSLURLString(); } else { // Make the resident's own name white and don't make the name clickable. style_params.color = LLColor4::white; + style_params.readonly_color = LLColor4::white; } mMap[source] = style_params; @@ -75,11 +77,13 @@ const LLStyle::Params &LLStyleMap::lookup(const LLUUID& id, const std::string& l if (id != LLUUID::null && !link.empty()) { style_params.color.control = "HTMLLinkColor"; + style_params.readonly_color.control = "HTMLLinkColor"; style_params.link_href = link; } else { style_params.color = LLColor4::white; + style_params.readonly_color = LLColor4::white; } mMap[id] = style_params; } diff --git a/indra/newview/llsurface.cpp b/indra/newview/llsurface.cpp index 1d479bac8c..ddb5d08e07 100644 --- a/indra/newview/llsurface.cpp +++ b/indra/newview/llsurface.cpp @@ -44,6 +44,7 @@ #include "llviewerobjectlist.h" #include "llregionhandle.h" #include "llagent.h" +#include "llagentcamera.h" #include "llappviewer.h" #include "llworld.h" #include "llviewercontrol.h" @@ -606,7 +607,7 @@ void LLSurface::moveZ(const S32 x, const S32 y, const F32 delta) void LLSurface::updatePatchVisibilities(LLAgent &agent) { - LLVector3 pos_region = mRegionp->getPosRegionFromGlobal(gAgent.getCameraPositionGlobal()); + LLVector3 pos_region = mRegionp->getPosRegionFromGlobal(gAgentCamera.getCameraPositionGlobal()); LLSurfacePatch *patchp; diff --git a/indra/newview/llsyswellwindow.cpp b/indra/newview/llsyswellwindow.cpp index ba15053381..cb65756764 100644 --- a/indra/newview/llsyswellwindow.cpp +++ b/indra/newview/llsyswellwindow.cpp @@ -56,13 +56,11 @@ LLSysWellWindow::LLSysWellWindow(const LLSD& key) : LLTransientDockableFloater(N mChannel(NULL), mMessageList(NULL), mSysWellChiclet(NULL), - mSeparator(NULL), NOTIFICATION_WELL_ANCHOR_NAME("notification_well_panel"), - IM_WELL_ANCHOR_NAME("im_well_panel") + IM_WELL_ANCHOR_NAME("im_well_panel"), + mIsReshapedByUser(false) { - mTypedItemsCount[IT_NOTIFICATION] = 0; - mTypedItemsCount[IT_INSTANT_MESSAGE] = 0; setOverlapsScreenChannel(true); } @@ -74,18 +72,6 @@ BOOL LLSysWellWindow::postBuild() // get a corresponding channel initChannel(); - LLPanel::Params params; - mSeparator = LLUICtrlFactory::create<LLPanel>(params); - LLUICtrlFactory::instance().buildPanel(mSeparator, "panel_separator.xml"); - - LLRect rc = mSeparator->getRect(); - rc.setOriginAndSize(0, 0, mMessageList->getItemsRect().getWidth(), rc.getHeight()); - mSeparator->setRect(rc); - mSeparator->setFollows(FOLLOWS_LEFT | FOLLOWS_RIGHT | FOLLOWS_TOP); - mSeparator->setVisible(FALSE); - - mMessageList->addItem(mSeparator); - // click on SysWell Window should clear "new message" state (and 'Lit' status). EXT-3147. // mouse up callback is not called in this case. setMouseDownCallback(boost::bind(&LLSysWellWindow::releaseNewMessagesState, this)); @@ -100,6 +86,13 @@ void LLSysWellWindow::setMinimized(BOOL minimize) } //--------------------------------------------------------------------------------- +void LLSysWellWindow::handleReshape(const LLRect& rect, bool by_user) +{ + mIsReshapedByUser |= by_user; // mark floater that it is reshaped by user + LLTransientDockableFloater::handleReshape(rect, by_user); +} + +//--------------------------------------------------------------------------------- void LLSysWellWindow::onStartUpToastClick(S32 x, S32 y, MASK mask) { // just set floater visible. Screen channels will be cleared. @@ -122,7 +115,7 @@ void LLSysWellWindow::removeItemByID(const LLUUID& id) { if(mMessageList->removeItemByValue(id)) { - handleItemRemoved(IT_NOTIFICATION); + mSysWellChiclet->updateWidget(isWindowEmpty()); reshapeWindow(); } else @@ -211,22 +204,25 @@ void LLSysWellWindow::reshapeWindow() // it includes height from floater top to list top and from floater bottom and list bottom static S32 parent_list_delta_height = getRect().getHeight() - mMessageList->getRect().getHeight(); - S32 notif_list_height = mMessageList->getItemsRect().getHeight() + 2 * mMessageList->getBorderWidth(); + if (!mIsReshapedByUser) // Don't reshape Well window, if it ever was reshaped by user. See EXT-5715. + { + S32 notif_list_height = mMessageList->getItemsRect().getHeight() + 2 * mMessageList->getBorderWidth(); - LLRect curRect = getRect(); + LLRect curRect = getRect(); - S32 new_window_height = notif_list_height + parent_list_delta_height; + S32 new_window_height = notif_list_height + parent_list_delta_height; - if (new_window_height > MAX_WINDOW_HEIGHT) - { - new_window_height = MAX_WINDOW_HEIGHT; - } - S32 newY = curRect.mTop + new_window_height - curRect.getHeight(); - S32 newWidth = curRect.getWidth() < MIN_WINDOW_WIDTH ? MIN_WINDOW_WIDTH + if (new_window_height > MAX_WINDOW_HEIGHT) + { + new_window_height = MAX_WINDOW_HEIGHT; + } + S32 newY = curRect.mTop + new_window_height - curRect.getHeight(); + S32 newWidth = curRect.getWidth() < MIN_WINDOW_WIDTH ? MIN_WINDOW_WIDTH : curRect.getWidth(); - curRect.setLeftTopAndSize(curRect.mLeft, newY, newWidth, new_window_height); - reshape(curRect.getWidth(), curRect.getHeight(), TRUE); - setRect(curRect); + curRect.setLeftTopAndSize(curRect.mLeft, newY, newWidth, new_window_height); + reshape(curRect.getWidth(), curRect.getHeight(), TRUE); + setRect(curRect); + } // update notification channel state // update on a window reshape is important only when a window is visible and docked @@ -247,76 +243,7 @@ void LLSysWellWindow::releaseNewMessagesState() //--------------------------------------------------------------------------------- bool LLSysWellWindow::isWindowEmpty() { - // keep in mind, mSeparator is always in the list - return mMessageList->size() == 1; -} - -// *TODO: mantipov: probably is deprecated -void LLSysWellWindow::handleItemAdded(EItemType added_item_type) -{ - bool should_be_shown = ++mTypedItemsCount[added_item_type] == 1 && anotherTypeExists(added_item_type); - - if (should_be_shown && !mSeparator->getVisible()) - { - mSeparator->setVisible(TRUE); - - // refresh list to recalculate mSeparator position - mMessageList->reshape(mMessageList->getRect().getWidth(), mMessageList->getRect().getHeight()); - } - - //fix for EXT-3254 - //set limits for min_height. - S32 parent_list_delta_height = getRect().getHeight() - mMessageList->getRect().getHeight(); - - std::vector<LLPanel*> items; - mMessageList->getItems(items); - - if(items.size()>1)//first item is separator - { - S32 min_height; - S32 min_width; - getResizeLimits(&min_width,&min_height); - - min_height = items[1]->getRect().getHeight() + 2 * mMessageList->getBorderWidth() + parent_list_delta_height; - - setResizeLimits(min_width,min_height); - } - mSysWellChiclet->updateWidget(isWindowEmpty()); -} - -void LLSysWellWindow::handleItemRemoved(EItemType removed_item_type) -{ - bool should_be_hidden = --mTypedItemsCount[removed_item_type] == 0; - - if (should_be_hidden && mSeparator->getVisible()) - { - mSeparator->setVisible(FALSE); - - // refresh list to recalculate mSeparator position - mMessageList->reshape(mMessageList->getRect().getWidth(), mMessageList->getRect().getHeight()); - } - mSysWellChiclet->updateWidget(isWindowEmpty()); -} - -bool LLSysWellWindow::anotherTypeExists(EItemType item_type) -{ - bool exists = false; - switch(item_type) - { - case IT_INSTANT_MESSAGE: - if (mTypedItemsCount[IT_NOTIFICATION] > 0) - { - exists = true; - } - break; - case IT_NOTIFICATION: - if (mTypedItemsCount[IT_INSTANT_MESSAGE] > 0) - { - exists = true; - } - break; - } - return exists; + return mMessageList->size() == 0; } /************************************************************************/ @@ -404,7 +331,10 @@ BOOL LLIMWellWindow::RowPanel::handleMouseDown(S32 x, S32 y, MASK mask) { // Pass the mouse down event to the chiclet (EXT-596). if (!mChiclet->pointInView(x, y) && !mCloseBtn->getRect().pointInRect(x, y)) // prevent double call of LLIMChiclet::onMouseDown() + { mChiclet->onMouseDown(); + return TRUE; + } return LLPanel::handleMouseDown(x, y, mask); } @@ -418,16 +348,16 @@ BOOL LLIMWellWindow::RowPanel::handleRightMouseDown(S32 x, S32 y, MASK mask) /* ObjectRowPanel implementation */ /************************************************************************/ -LLIMWellWindow::ObjectRowPanel::ObjectRowPanel(const LLUUID& object_id, bool new_message/* = false*/) +LLIMWellWindow::ObjectRowPanel::ObjectRowPanel(const LLUUID& notification_id, bool new_message/* = false*/) : LLPanel() , mChiclet(NULL) { LLUICtrlFactory::getInstance()->buildPanel(this, "panel_active_object_row.xml", NULL); - initChiclet(object_id); + initChiclet(notification_id); LLTextBox* obj_name = getChild<LLTextBox>("object_name"); - obj_name->setValue(getObjectName(object_id)); + obj_name->setValue(LLScriptFloaterManager::getObjectName(notification_id)); mCloseBtn = getChild<LLButton>("hide_btn"); mCloseBtn->setCommitCallback(boost::bind(&LLIMWellWindow::ObjectRowPanel::onClosePanel, this)); @@ -438,90 +368,18 @@ LLIMWellWindow::ObjectRowPanel::~ObjectRowPanel() { } -std::string LLIMWellWindow::ObjectRowPanel::getObjectName(const LLUUID& object_id) -{ - using namespace LLNotificationsUI; - LLUUID notification_id = LLScriptFloaterManager::getInstance()->findNotificationId(object_id); - LLNotificationPtr notification = LLNotifications::getInstance()->find(notification_id); - if(!notification) - { - llwarns << "Invalid notification" << llendl; - return LLStringUtil::null; - } - - std::string text; - - switch(getObjectType(notification)) - { - case OBJ_SCRIPT: - text = notification->getSubstitutions()["TITLE"].asString(); - break; - case OBJ_LOAD_URL: - text = notification->getSubstitutions()["OBJECTNAME"].asString(); - break; - case OBJ_GIVE_INVENTORY: - text = notification->getSubstitutions()["NAME"].asString(); - break; - default: - text = getString("unknown_obj"); - break; - } - - return text; -} - //--------------------------------------------------------------------------------- void LLIMWellWindow::ObjectRowPanel::onClosePanel() { - LLScriptFloaterManager::getInstance()->removeNotificationByObjectId(mChiclet->getSessionId()); -} - -//static -LLIMWellWindow::ObjectRowPanel::object_type_map LLIMWellWindow::ObjectRowPanel::initObjectTypeMap() -{ - object_type_map type_map; - type_map["ScriptDialog"] = OBJ_SCRIPT; - type_map["LoadWebPage"] = OBJ_LOAD_URL; - type_map["ObjectGiveItem"] = OBJ_GIVE_INVENTORY; - return type_map; + LLScriptFloaterManager::getInstance()->onRemoveNotification(mChiclet->getSessionId()); } -// static -LLIMWellWindow::ObjectRowPanel::EObjectType LLIMWellWindow::ObjectRowPanel::getObjectType(const LLNotificationPtr& notification) +void LLIMWellWindow::ObjectRowPanel::initChiclet(const LLUUID& notification_id, bool new_message/* = false*/) { - if(!notification) - { - llwarns << "Invalid notification" << llendl; - return OBJ_UNKNOWN; - } - - static object_type_map type_map = initObjectTypeMap(); - std::string name = notification->getName(); - object_type_map::const_iterator it = type_map.find(name); - if(it != type_map.end()) - { - return it->second; - } - - llwarns << "Unknown object type" << llendl; - return OBJ_UNKNOWN; -} - -void LLIMWellWindow::ObjectRowPanel::initChiclet(const LLUUID& object_id, bool new_message/* = false*/) -{ - using namespace LLNotificationsUI; - LLUUID notification_id = LLScriptFloaterManager::getInstance()->findNotificationId(object_id); - LLNotificationPtr notification = LLNotifications::getInstance()->find(notification_id); - if(!notification) - { - llwarns << "Invalid notification" << llendl; - return; - } - // Choose which of the pre-created chiclets to use. - switch(getObjectType(notification)) + switch(LLScriptFloaterManager::getObjectType(notification_id)) { - case OBJ_GIVE_INVENTORY: + case LLScriptFloaterManager::OBJ_GIVE_INVENTORY: mChiclet = getChild<LLInvOfferChiclet>("inv_offer_chiclet"); break; default: @@ -530,8 +388,7 @@ void LLIMWellWindow::ObjectRowPanel::initChiclet(const LLUUID& object_id, bool n } mChiclet->setVisible(true); - mChiclet->setSessionId(object_id); -// mChiclet->setShowNewMessagesIcon(new_message); + mChiclet->setSessionId(notification_id); } //--------------------------------------------------------------------------------- @@ -552,7 +409,10 @@ BOOL LLIMWellWindow::ObjectRowPanel::handleMouseDown(S32 x, S32 y, MASK mask) { // Pass the mouse down event to the chiclet (EXT-596). if (!mChiclet->pointInView(x, y) && !mCloseBtn->getRect().pointInRect(x, y)) // prevent double call of LLIMChiclet::onMouseDown() + { mChiclet->onMouseDown(); + return TRUE; + } return LLPanel::handleMouseDown(x, y, mask); } @@ -615,8 +475,7 @@ void LLNotificationWellWindow::addItem(LLSysWellItem::Params p) LLSysWellItem* new_item = new LLSysWellItem(p); if (mMessageList->addItem(new_item, value, ADD_TOP)) { - handleItemAdded(IT_NOTIFICATION); - + mSysWellChiclet->updateWidget(isWindowEmpty()); reshapeWindow(); new_item->setOnItemCloseCallback(boost::bind(&LLNotificationWellWindow::onItemClose, this, _1)); @@ -780,10 +639,10 @@ void LLIMWellWindow::sessionIDUpdated(const LLUUID& old_session_id, const LLUUID } } -LLChiclet* LLIMWellWindow::findObjectChiclet(const LLUUID& object_id) +LLChiclet* LLIMWellWindow::findObjectChiclet(const LLUUID& notification_id) { LLChiclet* res = NULL; - ObjectRowPanel* panel = mMessageList->getTypedItemByValue<ObjectRowPanel>(object_id); + ObjectRowPanel* panel = mMessageList->getTypedItemByValue<ObjectRowPanel>(notification_id); if (panel != NULL) { res = panel->mChiclet; @@ -811,9 +670,9 @@ void LLIMWellWindow::addIMRow(const LLUUID& sessionId, S32 chicletCounter, const std::string& name, const LLUUID& otherParticipantId) { RowPanel* item = new RowPanel(this, sessionId, chicletCounter, name, otherParticipantId); - if (mMessageList->insertItemAfter(mSeparator, item, sessionId)) + if (mMessageList->addItem(item, sessionId)) { - handleItemAdded(IT_INSTANT_MESSAGE); + mSysWellChiclet->updateWidget(isWindowEmpty()); } else { @@ -838,7 +697,7 @@ void LLIMWellWindow::delIMRow(const LLUUID& sessionId) if (mMessageList->removeItemByValue(sessionId)) { - handleItemRemoved(IT_INSTANT_MESSAGE); + mSysWellChiclet->updateWidget(isWindowEmpty()); } else { @@ -861,33 +720,33 @@ void LLIMWellWindow::delIMRow(const LLUUID& sessionId) } } -void LLIMWellWindow::addObjectRow(const LLUUID& object_id, bool new_message/* = false*/) +void LLIMWellWindow::addObjectRow(const LLUUID& notification_id, bool new_message/* = false*/) { - if (mMessageList->getItemByValue(object_id) == NULL) + if (mMessageList->getItemByValue(notification_id) == NULL) { - ObjectRowPanel* item = new ObjectRowPanel(object_id, new_message); - if (mMessageList->insertItemAfter(mSeparator, item, object_id)) + ObjectRowPanel* item = new ObjectRowPanel(notification_id, new_message); + if (mMessageList->addItem(item, notification_id)) { - handleItemAdded(IT_INSTANT_MESSAGE); + mSysWellChiclet->updateWidget(isWindowEmpty()); } else { - llwarns << "Unable to add Object Row into the list, objectID: " << object_id << llendl; + llwarns << "Unable to add Object Row into the list, notificationID: " << notification_id << llendl; item->die(); } reshapeWindow(); } } -void LLIMWellWindow::removeObjectRow(const LLUUID& object_id) +void LLIMWellWindow::removeObjectRow(const LLUUID& notification_id) { - if (mMessageList->removeItemByValue(object_id)) + if (mMessageList->removeItemByValue(notification_id)) { - handleItemRemoved(IT_INSTANT_MESSAGE); + mSysWellChiclet->updateWidget(isWindowEmpty()); } else { - llwarns << "Unable to remove Object Row from the list, objectID: " << object_id << llendl; + llwarns << "Unable to remove Object Row from the list, notificationID: " << notification_id << llendl; } reshapeWindow(); @@ -967,8 +826,7 @@ void LLIMWellWindow::closeAllImpl() ObjectRowPanel* obj_panel = dynamic_cast <ObjectRowPanel*> (panel); if (obj_panel) { - LLScriptFloaterManager::instance() - .removeNotificationByObjectId(*iter); + LLScriptFloaterManager::instance().onRemoveNotification(*iter); } } } diff --git a/indra/newview/llsyswellwindow.h b/indra/newview/llsyswellwindow.h index 0c81d1f369..c8215c71ee 100644 --- a/indra/newview/llsyswellwindow.h +++ b/indra/newview/llsyswellwindow.h @@ -70,6 +70,7 @@ public: /*virtual*/ void setDocked(bool docked, bool pop_on_undock = true); // override LLFloater's minimization according to EXT-1216 /*virtual*/ void setMinimized(BOOL minimize); + /*virtual*/ void handleReshape(const LLRect& rect, bool by_user); void onStartUpToastClick(S32 x, S32 y, MASK mask); @@ -81,20 +82,12 @@ public: protected: - typedef enum{ - IT_NOTIFICATION, - IT_INSTANT_MESSAGE - }EItemType; - // gets a rect that bounds possible positions for the SysWellWindow on a screen (EXT-1111) void getAllowedRect(LLRect& rect); // init Window's channel virtual void initChannel(); - void handleItemAdded(EItemType added_item_type); - void handleItemRemoved(EItemType removed_item_type); - bool anotherTypeExists(EItemType item_type) ; const std::string NOTIFICATION_WELL_ANCHOR_NAME; const std::string IM_WELL_ANCHOR_NAME; @@ -112,16 +105,7 @@ protected: */ LLSysWellChiclet* mSysWellChiclet; - /** - * Special panel which is used as separator of Notifications & IM Rows. - * It is always presents in the list and shown when it is necessary. - * It should be taken into account when reshaping and checking list size - */ - LLPanel* mSeparator; - - typedef std::map<EItemType, S32> typed_items_count_t; - typed_items_count_t mTypedItemsCount; - + bool mIsReshapedByUser; }; /** @@ -188,8 +172,8 @@ public: /*virtual*/ void sessionRemoved(const LLUUID& session_id); /*virtual*/ void sessionIDUpdated(const LLUUID& old_session_id, const LLUUID& new_session_id); - void addObjectRow(const LLUUID& object_id, bool new_message = false); - void removeObjectRow(const LLUUID& object_id); + void addObjectRow(const LLUUID& notification_id, bool new_message = false); + void removeObjectRow(const LLUUID& notification_id); void addIMRow(const LLUUID& session_id); bool hasIMRow(const LLUUID& session_id); @@ -201,7 +185,7 @@ protected: private: LLChiclet * findIMChiclet(const LLUUID& sessionId); - LLChiclet* findObjectChiclet(const LLUUID& object_id); + LLChiclet* findObjectChiclet(const LLUUID& notification_id); void addIMRow(const LLUUID& sessionId, S32 chicletCounter, const std::string& name, const LLUUID& otherParticipantId); void delIMRow(const LLUUID& sessionId); @@ -235,17 +219,8 @@ private: class ObjectRowPanel: public LLPanel { - typedef enum e_object_type - { - OBJ_UNKNOWN, - - OBJ_SCRIPT, - OBJ_GIVE_INVENTORY, - OBJ_LOAD_URL - }EObjectType; - public: - ObjectRowPanel(const LLUUID& object_id, bool new_message = false); + ObjectRowPanel(const LLUUID& notification_id, bool new_message = false); virtual ~ObjectRowPanel(); /*virtual*/ void onMouseEnter(S32 x, S32 y, MASK mask); /*virtual*/ void onMouseLeave(S32 x, S32 y, MASK mask); @@ -254,12 +229,8 @@ private: private: void onClosePanel(); - static EObjectType getObjectType(const LLNotificationPtr& notification); - void initChiclet(const LLUUID& object_id, bool new_message = false); - std::string getObjectName(const LLUUID& object_id); + void initChiclet(const LLUUID& notification_id, bool new_message = false); - typedef std::map<std::string, EObjectType> object_type_map; - static object_type_map initObjectTypeMap(); public: LLIMChiclet* mChiclet; private: diff --git a/indra/newview/llteleporthistory.cpp b/indra/newview/llteleporthistory.cpp index dcc85392f7..cac3b58464 100644 --- a/indra/newview/llteleporthistory.cpp +++ b/indra/newview/llteleporthistory.cpp @@ -38,6 +38,7 @@ #include "llsdserialize.h" #include "llagent.h" +#include "llvoavatarself.h" #include "llslurl.h" #include "llviewercontrol.h" // for gSavedSettings #include "llviewerparcelmgr.h" @@ -108,6 +109,16 @@ void LLTeleportHistory::onTeleportFailed() } } +void LLTeleportHistory::handleLoginComplete() +{ + if( mGotInitialUpdate ) + { + return; + } + updateCurrentLocation(gAgent.getPositionGlobal()); +} + + void LLTeleportHistory::updateCurrentLocation(const LLVector3d& new_pos) { if (mRequestedItem != -1) // teleport within the history in progress? @@ -117,6 +128,17 @@ void LLTeleportHistory::updateCurrentLocation(const LLVector3d& new_pos) } else { + //EXT-7034 + //skip initial update if agent avatar is no valid yet + //this may happen when updateCurrentLocation called while login process + //sometimes isAgentAvatarValid return false and in this case new_pos + //(which actually is gAgent.getPositionGlobal() ) is invalid + //if this position will be saved then teleport back will teleport user to wrong position + if ( !mGotInitialUpdate && !isAgentAvatarValid() ) + { + return ; + } + // If we're getting the initial location update // while we already have a (loaded) non-empty history, // there's no need to purge forward items or add a new item. @@ -136,6 +158,7 @@ void LLTeleportHistory::updateCurrentLocation(const LLVector3d& new_pos) if (mCurrentItem < 0 || mCurrentItem >= (int) mItems.size()) // sanity check { llwarns << "Invalid current item. (this should not happen)" << llendl; + llassert(!"Invalid current teleport histiry item"); return; } LLVector3 new_pos_local = gAgent.getPosAgentFromGlobal(new_pos); @@ -166,6 +189,17 @@ void LLTeleportHistory::onHistoryChanged() void LLTeleportHistory::purgeItems() { + if (mItems.size() == 0) // no entries yet (we're called before login) + { + // If we don't return here the history will get into inconsistent state, hence: + // 1) updateCurrentLocation() will malfunction, + // so further teleports will not properly update the history; + // 2) mHistoryChangedSignal subscribers will be notified + // of such an invalid change. (EXT-6798) + // Both should not happen. + return; + } + if (mItems.size() > 0) { mItems.erase(mItems.begin(), mItems.end()-1); diff --git a/indra/newview/llteleporthistory.h b/indra/newview/llteleporthistory.h index a82bec7c4f..e035451e71 100644 --- a/indra/newview/llteleporthistory.h +++ b/indra/newview/llteleporthistory.h @@ -136,6 +136,10 @@ public: * @see load() */ void dump() const; + /** + * Process login complete event. Basically put current location into history + */ + void handleLoginComplete(); private: diff --git a/indra/newview/llteleporthistorystorage.cpp b/indra/newview/llteleporthistorystorage.cpp index c635f91423..430d62e15e 100644 --- a/indra/newview/llteleporthistorystorage.cpp +++ b/indra/newview/llteleporthistorystorage.cpp @@ -89,6 +89,13 @@ void LLTeleportHistoryStorage::onTeleportHistoryChange() if (!th) return; + // Hacky sanity check. (EXT-6798) + if (th->getItems().size() == 0) + { + llassert(!"Inconsistent teleport history state"); + return; + } + const LLTeleportHistoryItem &item = th->getItems()[th->getCurrentItemIndex()]; addItem(item.mTitle, item.mGlobalPos); diff --git a/indra/newview/lltexglobalcolor.cpp b/indra/newview/lltexglobalcolor.cpp index d7840fb435..347f8bf627 100644 --- a/indra/newview/lltexglobalcolor.cpp +++ b/indra/newview/lltexglobalcolor.cpp @@ -1,6 +1,6 @@ /** * @file lltexlayerglobalcolor.cpp - * @brief SERAPH - ADD IN + * @brief Color for texture layers. * * $LicenseInfo:firstyear=2008&license=viewergpl$ * diff --git a/indra/newview/lltexlayer.cpp b/indra/newview/lltexlayer.cpp index ddb6405c41..5d51e32515 100644 --- a/indra/newview/lltexlayer.cpp +++ b/indra/newview/lltexlayer.cpp @@ -37,6 +37,7 @@ #include "llagent.h" #include "llimagej2c.h" #include "llimagetga.h" +#include "llnotificationsutil.h" #include "llvfile.h" #include "llvfs.h" #include "llviewerstats.h" @@ -49,12 +50,50 @@ #include "llui.h" #include "llagentwearables.h" #include "llwearable.h" +#include "llviewercontrol.h" #include "llviewervisualparam.h" //#include "../tools/imdebug/imdebug.h" using namespace LLVOAvatarDefines; +class LLTexLayerInfo +{ + friend class LLTexLayer; + friend class LLTexLayerTemplate; + friend class LLTexLayerInterface; +public: + LLTexLayerInfo(); + ~LLTexLayerInfo(); + + BOOL parseXml(LLXmlTreeNode* node); + BOOL createVisualParams(LLVOAvatar *avatar); + BOOL isUserSettable() { return mLocalTexture != -1; } + S32 getLocalTexture() const { return mLocalTexture; } + BOOL getOnlyAlpha() const { return mUseLocalTextureAlphaOnly; } + std::string getName() const { return mName; } + +private: + std::string mName; + + BOOL mWriteAllChannels; // Don't use masking. Just write RGBA into buffer, + LLTexLayerInterface::ERenderPass mRenderPass; + + std::string mGlobalColor; + LLColor4 mFixedColor; + + S32 mLocalTexture; + std::string mStaticImageFileName; + BOOL mStaticImageIsMask; + BOOL mUseLocalTextureAlphaOnly; // Ignore RGB channels from the input texture. Use alpha as a mask + BOOL mIsVisibilityMask; + + typedef std::vector< std::pair< std::string,BOOL > > morph_name_list_t; + morph_name_list_t mMorphNameList; + param_color_info_list_t mParamColorInfoList; + param_alpha_info_list_t mParamAlphaInfoList; +}; + //----------------------------------------------------------------------------- // LLBakedUploadData() //----------------------------------------------------------------------------- @@ -80,12 +119,14 @@ LLTexLayerSetBuffer::LLTexLayerSetBuffer(LLTexLayerSet* const owner, S32 width, S32 height) : // ORDER_LAST => must render these after the hints are created. LLViewerDynamicTexture( width, height, 4, LLViewerDynamicTexture::ORDER_LAST, TRUE ), - mNeedsUpdate( TRUE ), - mNeedsUpload( FALSE ), - mUploadPending( FALSE ), // Not used for any logic here, just to sync sending of updates + mNeedsUpdate(TRUE), + mNeedsUpload(FALSE), + mUploadPending(FALSE), // Not used for any logic here, just to sync sending of updates + mNumLowresUploads(0), mTexLayerSet(owner) { LLTexLayerSetBuffer::sGLByteCount += getSize(); + mNeedsUploadTimer.start(); } LLTexLayerSetBuffer::~LLTexLayerSetBuffer() @@ -99,6 +140,12 @@ LLTexLayerSetBuffer::~LLTexLayerSetBuffer() } //virtual +S8 LLTexLayerSetBuffer::getType() const +{ + return LLViewerDynamicTexture::LL_TEX_LAYER_SET_BUFFER ; +} + +//virtual void LLTexLayerSetBuffer::restoreGLTexture() { LLViewerDynamicTexture::restoreGLTexture() ; @@ -118,8 +165,8 @@ void LLTexLayerSetBuffer::dumpTotalByteCount() void LLTexLayerSetBuffer::requestUpdate() { + conditionalRestartUploadTimer(); mNeedsUpdate = TRUE; - // If we're in the middle of uploading a baked texture, we don't care about it any more. // When it's downloaded, ignore it. mUploadID.setNull(); @@ -127,20 +174,33 @@ void LLTexLayerSetBuffer::requestUpdate() void LLTexLayerSetBuffer::requestUpload() { - if (!mNeedsUpload) + conditionalRestartUploadTimer(); + mNeedsUpload = TRUE; + mNumLowresUploads = 0; + mUploadPending = TRUE; +} + +void LLTexLayerSetBuffer::conditionalRestartUploadTimer() +{ + // If we requested a new upload but haven't even uploaded + // a low res version of our last upload request, then + // keep the timer ticking instead of resetting it. + if (mNeedsUpload && (mNumLowresUploads == 0)) + { + mNeedsUploadTimer.unpause(); + } + else { - mNeedsUpload = TRUE; - mUploadPending = TRUE; + mNeedsUploadTimer.reset(); + mNeedsUploadTimer.start(); } } void LLTexLayerSetBuffer::cancelUpload() { - if (mNeedsUpload) - { - mNeedsUpload = FALSE; - } + mNeedsUpload = FALSE; mUploadPending = FALSE; + mNeedsUploadTimer.pause(); } void LLTexLayerSetBuffer::pushProjection() const @@ -166,12 +226,14 @@ void LLTexLayerSetBuffer::popProjection() const BOOL LLTexLayerSetBuffer::needsRender() { - const LLVOAvatarSelf* avatar = mTexLayerSet->getAvatar(); - BOOL upload_now = mNeedsUpload && mTexLayerSet->isLocalTextureDataFinal(); - BOOL needs_update = gAgentQueryManager.hasNoPendingQueries() && (mNeedsUpdate || upload_now) && !avatar->mAppearanceAnimating; + llassert(mTexLayerSet->getAvatar() == gAgentAvatarp); + if (!isAgentAvatarValid()) return FALSE; + + const BOOL upload_now = isReadyToUpload(); + BOOL needs_update = (mNeedsUpdate || upload_now) && !gAgentAvatarp->mAppearanceAnimating; if (needs_update) { - BOOL invalid_skirt = avatar->getBakedTE(mTexLayerSet) == LLVOAvatarDefines::TEX_SKIRT_BAKED && !avatar->isWearingWearableType(WT_SKIRT); + BOOL invalid_skirt = gAgentAvatarp->getBakedTE(mTexLayerSet) == LLVOAvatarDefines::TEX_SKIRT_BAKED && !gAgentAvatarp->isWearingWearableType(LLWearableType::WT_SKIRT); if (invalid_skirt) { // we were trying to create a skirt texture @@ -181,10 +243,10 @@ BOOL LLTexLayerSetBuffer::needsRender() } else { - needs_update &= (avatar->isSelf() || (avatar->isVisible() && !avatar->isCulled())); needs_update &= mTexLayerSet->isLocalTextureDataAvailable(); } } + return needs_update; } @@ -211,7 +273,7 @@ BOOL LLTexLayerSetBuffer::render() // do we need to upload, and do we have sufficient data to create an uploadable composite? // When do we upload the texture if gAgent.mNumPendingQueries is non-zero? - BOOL upload_now = (gAgentQueryManager.hasNoPendingQueries() && mNeedsUpload && mTexLayerSet->isLocalTextureDataFinal()); + const BOOL upload_now = isReadyToUpload(); BOOL success = TRUE; @@ -220,23 +282,25 @@ BOOL LLTexLayerSetBuffer::render() success &= mTexLayerSet->render( mOrigin.mX, mOrigin.mY, mFullWidth, mFullHeight ); gGL.flush(); - if( upload_now ) + if(upload_now) { if (!success) { - llinfos << "Failed attempt to bake " << mTexLayerSet->getBodyRegion() << llendl; + llinfos << "Failed attempt to bake " << mTexLayerSet->getBodyRegionName() << llendl; mUploadPending = FALSE; } else { if (mTexLayerSet->isVisible()) { + mTexLayerSet->getAvatar()->debugBakedTextureUpload(mTexLayerSet->getBakedTexIndex(), FALSE); // FALSE for start of upload, TRUE for finish. readBackAndUpload(); } else { mUploadPending = FALSE; mNeedsUpload = FALSE; + mNeedsUploadTimer.pause(); mTexLayerSet->getAvatar()->setNewBakedTexture(mTexLayerSet->getBakedTexIndex(),IMG_INVISIBLE); } } @@ -253,11 +317,50 @@ BOOL LLTexLayerSetBuffer::render() return success; } -bool LLTexLayerSetBuffer::isInitialized(void) const +BOOL LLTexLayerSetBuffer::isInitialized(void) const { return mGLTexturep.notNull() && mGLTexturep->isGLTextureCreated(); } +BOOL LLTexLayerSetBuffer::uploadPending() const +{ + return mUploadPending; +} + +BOOL LLTexLayerSetBuffer::uploadNeeded() const +{ + return mNeedsUpload; +} + +BOOL LLTexLayerSetBuffer::uploadInProgress() const +{ + return !mUploadID.isNull(); +} + +BOOL LLTexLayerSetBuffer::isReadyToUpload() const +{ + if (!mNeedsUpload) return FALSE; // Don't need to upload if we haven't requested one. + if (!gAgentQueryManager.hasNoPendingQueries()) return FALSE; // Can't upload if there are pending queries. + + // If we requested an upload and have the final LOD ready, then upload. + const BOOL can_highest_lod = mTexLayerSet->isLocalTextureDataFinal(); + if (can_highest_lod) return TRUE; + + const U32 texture_timeout = gSavedSettings.getU32("AvatarBakedTextureTimeout"); + if (texture_timeout) + { + // The timeout period increases exponentially between every lowres upload in order to prevent + // spamming the server with frequent uploads. + const U32 texture_timeout_threshold = texture_timeout*(1 << mNumLowresUploads); + + // If we hit our timeout and have textures available at even lower resolution, then upload. + const BOOL is_upload_textures_timeout = mNeedsUploadTimer.getElapsedTimeF32() >= texture_timeout_threshold; + const BOOL has_lower_lod = mTexLayerSet->isLocalTextureDataAvailable(); + if (has_lower_lod && is_upload_textures_timeout) return TRUE; + } + return FALSE; +} + BOOL LLTexLayerSetBuffer::updateImmediate() { mNeedsUpdate = TRUE; @@ -275,42 +378,33 @@ BOOL LLTexLayerSetBuffer::updateImmediate() void LLTexLayerSetBuffer::readBackAndUpload() { - // pointers for storing data to upload - U8* baked_color_data = new U8[ mFullWidth * mFullHeight * 4 ]; - - glReadPixels(mOrigin.mX, mOrigin.mY, mFullWidth, mFullHeight, GL_RGBA, GL_UNSIGNED_BYTE, baked_color_data ); - stop_glerror(); - - llinfos << "Baked " << mTexLayerSet->getBodyRegion() << llendl; + llinfos << "Uploading baked " << mTexLayerSet->getBodyRegionName() << llendl; LLViewerStats::getInstance()->incStat(LLViewerStats::ST_TEX_BAKES); - llassert( gAgent.getAvatarObject() == mTexLayerSet->getAvatar() ); - - // We won't need our caches since we're baked now. (Techically, we won't - // really be baked until this image is sent to the server and the Avatar - // Appearance message is received.) + // Don't need caches since we're baked now. (note: we won't *really* be baked + // until this image is sent to the server and the Avatar Appearance message is received.) mTexLayerSet->deleteCaches(); - LLGLSUIDefault gls_ui; + // Get the COLOR information from our texture + U8* baked_color_data = new U8[ mFullWidth * mFullHeight * 4 ]; + glReadPixels(mOrigin.mX, mOrigin.mY, mFullWidth, mFullHeight, GL_RGBA, GL_UNSIGNED_BYTE, baked_color_data ); + stop_glerror(); + // Get the MASK information from our texture + LLGLSUIDefault gls_ui; LLPointer<LLImageRaw> baked_mask_image = new LLImageRaw(mFullWidth, mFullHeight, 1 ); U8* baked_mask_data = baked_mask_image->getData(); - mTexLayerSet->gatherMorphMaskAlpha(baked_mask_data, mFullWidth, mFullHeight); - // writes into baked_color_data - const char* comment_text = NULL; - S32 baked_image_components = 5; // red green blue [bump] clothing + // Create the baked image from our color and mask information + const S32 baked_image_components = 5; // red green blue [bump] clothing LLPointer<LLImageRaw> baked_image = new LLImageRaw( mFullWidth, mFullHeight, baked_image_components ); U8* baked_image_data = baked_image->getData(); - - comment_text = LINDEN_J2C_COMMENT_PREFIX "RGBHM"; // 5 channels: rgb, heightfield/alpha, mask - S32 i = 0; - for( S32 u = 0; u < mFullWidth; u++ ) + for (S32 u=0; u < mFullWidth; u++) { - for( S32 v = 0; v < mFullHeight; v++ ) + for (S32 v=0; v < mFullHeight; v++) { baked_image_data[5*i + 0] = baked_color_data[4*i + 0]; baked_image_data[5*i + 1] = baked_color_data[4*i + 1]; @@ -323,21 +417,19 @@ void LLTexLayerSetBuffer::readBackAndUpload() LLPointer<LLImageJ2C> compressedImage = new LLImageJ2C; compressedImage->setRate(0.f); - LLTransactionID tid; - LLAssetID asset_id; - tid.generate(); - asset_id = tid.makeAssetID(gAgent.getSecureSessionID()); - - BOOL res = false; - if( compressedImage->encode(baked_image, comment_text)) + const char* comment_text = LINDEN_J2C_COMMENT_PREFIX "RGBHM"; // writes into baked_color_data. 5 channels (rgb, heightfield/alpha, mask) + if (compressedImage->encode(baked_image, comment_text)) { - res = LLVFile::writeFile(compressedImage->getData(), compressedImage->getDataSize(), - gVFS, asset_id, LLAssetType::AT_TEXTURE); - if (res) + LLTransactionID tid; + tid.generate(); + const LLAssetID asset_id = tid.makeAssetID(gAgent.getSecureSessionID()); + if (LLVFile::writeFile(compressedImage->getData(), compressedImage->getDataSize(), + gVFS, asset_id, LLAssetType::AT_TEXTURE)) { - LLPointer<LLImageJ2C> integrity_test = new LLImageJ2C; + // Read back the file and validate. BOOL valid = FALSE; - S32 file_size; + LLPointer<LLImageJ2C> integrity_test = new LLImageJ2C; + S32 file_size = 0; U8* data = LLVFile::readFile(gVFS, asset_id, LLAssetType::AT_TEXTURE, &file_size); if (data) { @@ -348,29 +440,26 @@ void LLTexLayerSetBuffer::readBackAndUpload() integrity_test->setLastError("Unable to read entire file"); } - if( valid ) + if (valid) { - // baked_upload_data is owned by the responder and deleted after the request completes - LLBakedUploadData* baked_upload_data = - new LLBakedUploadData(gAgent.getAvatarObject(), this->mTexLayerSet, asset_id); + // Baked_upload_data is owned by the responder and deleted after the request completes. + LLBakedUploadData* baked_upload_data = new LLBakedUploadData(gAgentAvatarp, + this->mTexLayerSet, + asset_id); mUploadID = asset_id; - - // upload the image - std::string url = gAgent.getRegion()->getCapability("UploadBakedTexture"); + // Upload the image + const std::string url = gAgent.getRegion()->getCapability("UploadBakedTexture"); if(!url.empty() - && !LLPipeline::sForceOldBakedUpload) // Toggle the debug setting UploadBakedTexOld to change between the new caps method and old method + && !LLPipeline::sForceOldBakedUpload) // toggle debug setting UploadBakedTexOld to change between the new caps method and old method { - llinfos << "Baked texture upload via capability of " << mUploadID << " to " << url << llendl; - LLSD body = LLSD::emptyMap(); + // The responder will call LLTexLayerSetBuffer::onTextureUploadComplete() LLHTTPClient::post(url, body, new LLSendTexLayerResponder(body, mUploadID, LLAssetType::AT_TEXTURE, baked_upload_data)); - // Responder will call LLTexLayerSetBuffer::onTextureUploadComplete() + llinfos << "Baked texture upload via capability of " << mUploadID << " to " << url << llendl; } else { - llinfos << "Baked texture upload via Asset Store." << llendl; - // gAssetStorage->storeAssetData(mTransactionID, LLAssetType::AT_IMAGE_JPEG, &uploadCallback, (void *)this, FALSE); gAssetStorage->storeAssetData(tid, LLAssetType::AT_TEXTURE, LLTexLayerSetBuffer::onTextureUploadComplete, @@ -378,23 +467,53 @@ void LLTexLayerSetBuffer::readBackAndUpload() TRUE, // temp_file TRUE, // is_priority TRUE); // store_local + llinfos << "Baked texture upload via Asset Store." << llendl; + } + + const BOOL highest_lod = mTexLayerSet->isLocalTextureDataFinal(); + if (highest_lod) + { + // Sending the final LOD for the baked texture. All done, pause + // the upload timer so we know how long it took. + mNeedsUpload = FALSE; + mNeedsUploadTimer.pause(); + } + else + { + // Sending a lower level LOD for the baked texture. Restart the upload timer. + mNumLowresUploads++; + mNeedsUploadTimer.unpause(); + mNeedsUploadTimer.reset(); + } + + // Print out notification that we uploaded this texture. + if (gSavedSettings.getBOOL("DebugAvatarRezTime")) + { + std::string lod_str = highest_lod ? "HighRes" : "LowRes"; + LLSD args; + args["EXISTENCE"] = llformat("%d",(U32)mTexLayerSet->getAvatar()->debugGetExistenceTimeElapsedF32()); + args["TIME"] = llformat("%d",(U32)mNeedsUploadTimer.getElapsedTimeF32()); + args["BODYREGION"] = mTexLayerSet->getBodyRegionName(); + args["RESOLUTION"] = lod_str; + LLNotificationsUtil::add("AvatarRezSelfBakeNotification",args); + llinfos << "Uploading [ name: " << mTexLayerSet->getBodyRegionName() << " res:" << lod_str << " time:" << (U32)mNeedsUploadTimer.getElapsedTimeF32() << " ]" << llendl; } - - mNeedsUpload = FALSE; } else { + // The read back and validate operation failed. Remove the uploaded file. mUploadPending = FALSE; - llinfos << "unable to create baked upload file: corrupted" << llendl; LLVFile file(gVFS, asset_id, LLAssetType::AT_TEXTURE, LLVFile::WRITE); file.remove(); + llinfos << "Unable to create baked upload file (reason: corrupted)." << llendl; } } } - if (!res) + else { + // The VFS write file operation failed. mUploadPending = FALSE; - llinfos << "unable to create baked upload file" << llendl; + llinfos << "Unable to create baked upload file (reason: failed to write file)" << llendl; } delete [] baked_color_data; @@ -409,14 +528,11 @@ void LLTexLayerSetBuffer::onTextureUploadComplete(const LLUUID& uuid, { LLBakedUploadData* baked_upload_data = (LLBakedUploadData*)userdata; - LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); - - if (0 == result && - avatar && - !avatar->isDead() && - baked_upload_data->mAvatar == avatar && // Sanity check: only the user's avatar should be uploading textures. - baked_upload_data->mTexLayerSet->hasComposite() - ) + if ((result == 0) && + isAgentAvatarValid() && + !gAgentAvatarp->isDead() && + (baked_upload_data->mAvatar == gAgentAvatarp) && // Sanity check: only the user's avatar should be uploading textures. + (baked_upload_data->mTexLayerSet->hasComposite())) { LLTexLayerSetBuffer* layerset_buffer = baked_upload_data->mTexLayerSet->getComposite(); @@ -435,15 +551,14 @@ void LLTexLayerSetBuffer::onTextureUploadComplete(const LLUUID& uuid, { // This is the upload we're currently waiting for. layerset_buffer->mUploadID.setNull(); - layerset_buffer->mUploadPending = FALSE; - if (result >= 0) { - LLVOAvatarDefines::ETextureIndex baked_te = avatar->getBakedTE(layerset_buffer->mTexLayerSet); + layerset_buffer->mUploadPending = FALSE; + LLVOAvatarDefines::ETextureIndex baked_te = gAgentAvatarp->getBakedTE(layerset_buffer->mTexLayerSet); // Update baked texture info with the new UUID U64 now = LLFrameTimer::getTotalTime(); // Record starting time llinfos << "Baked texture upload took " << (S32)((now - baked_upload_data->mStartTime) / 1000) << " ms" << llendl; - avatar->setNewBakedTexture(baked_te, uuid); + gAgentAvatarp->setNewBakedTexture(baked_te, uuid); } else { @@ -457,7 +572,7 @@ void LLTexLayerSetBuffer::onTextureUploadComplete(const LLUUID& uuid, llinfos << "Received baked texture out of date, ignored." << llendl; } - avatar->dirtyMesh(); + gAgentAvatarp->dirtyMesh(); } else { @@ -755,7 +870,7 @@ BOOL LLTexLayerSet::isBodyRegion(const std::string& region) const return mInfo->mBodyRegion == region; } -const std::string LLTexLayerSet::getBodyRegion() const +const std::string LLTexLayerSet::getBodyRegionName() const { return mInfo->mBodyRegion; } @@ -785,7 +900,7 @@ void LLTexLayerSet::cancelUpload() void LLTexLayerSet::createComposite() { - if( !mComposite ) + if(!mComposite) { S32 width = mInfo->mWidth; S32 height = mInfo->mHeight; @@ -820,7 +935,15 @@ void LLTexLayerSet::updateComposite() LLTexLayerSetBuffer* LLTexLayerSet::getComposite() { - createComposite(); + if (!mComposite) + { + createComposite(); + } + return mComposite; +} + +const LLTexLayerSetBuffer* LLTexLayerSet::getComposite() const +{ return mComposite; } @@ -903,11 +1026,11 @@ void LLTexLayerSet::applyMorphMask(U8* tex_data, S32 width, S32 height, S32 num_ mAvatar->applyMorphMask(tex_data, width, height, num_components, mBakedTexIndex); } -BOOL LLTexLayerSet::isMorphValid() +BOOL LLTexLayerSet::isMorphValid() const { - for( layer_list_t::iterator iter = mLayerList.begin(); iter != mLayerList.end(); iter++ ) + for(layer_list_t::const_iterator iter = mLayerList.begin(); iter != mLayerList.end(); iter++ ) { - LLTexLayerInterface* layer = *iter; + const LLTexLayerInterface* layer = *iter; if (layer && !layer->isMorphValid()) { return FALSE; @@ -1028,7 +1151,7 @@ BOOL LLTexLayerInfo::parseXml(LLXmlTreeNode* node) } if (mLocalTexture == TEX_NUM_INDICES) { - llwarns << "<texture> element has invalid local_texure attribute: " << mName << " " << local_texture_name << llendl; + llwarns << "<texture> element has invalid local_texture attribute: " << mName << " " << local_texture_name << llendl; return FALSE; } } @@ -1123,14 +1246,14 @@ BOOL LLTexLayerInfo::createVisualParams(LLVOAvatar *avatar) LLTexLayerInterface::LLTexLayerInterface(LLTexLayerSet* const layer_set): mTexLayerSet( layer_set ), mMorphMasksValid( FALSE ), - mStaticImageInvalid( FALSE ), mInfo(NULL), mHasMorph(FALSE) { } LLTexLayerInterface::LLTexLayerInterface(const LLTexLayerInterface &layer, LLWearable *wearable): - mTexLayerSet( layer.mTexLayerSet ) + mTexLayerSet( layer.mTexLayerSet ), + mInfo(NULL) { // don't add visual params for cloned layers setInfo(layer.getInfo(), wearable); @@ -1140,11 +1263,12 @@ LLTexLayerInterface::LLTexLayerInterface(const LLTexLayerInterface &layer, LLWea BOOL LLTexLayerInterface::setInfo(const LLTexLayerInfo *info, LLWearable* wearable ) // This sets mInfo and calls initialization functions { - //llassert(mInfo == NULL); // nyx says this is probably bogus but needs investigating - if (mInfo != NULL) // above llassert(), but softened into a warning - { - llwarns << "BAD STUFF! mInfo != NULL" << llendl; - } + // setInfo should only be called once. Code is not robust enough to handle redefinition of a texlayer. + // Not a critical warning, but could be useful for debugging later issues. -Nyx + if (mInfo != NULL) + { + llwarns << "mInfo != NULL" << llendl; + } mInfo = info; //mID = info->mID; // No ID @@ -1235,17 +1359,17 @@ void LLTexLayerInterface::invalidateMorphMasks() mMorphMasksValid = FALSE; } -LLViewerVisualParam* LLTexLayerInterface::getVisualParamPtr(S32 index) +LLViewerVisualParam* LLTexLayerInterface::getVisualParamPtr(S32 index) const { LLViewerVisualParam *result = NULL; - for (param_color_list_t::iterator color_iter = mParamColorList.begin(); color_iter != mParamColorList.end() && !result; ++color_iter) + for (param_color_list_t::const_iterator color_iter = mParamColorList.begin(); color_iter != mParamColorList.end() && !result; ++color_iter) { if ((*color_iter)->getID() == index) { result = *color_iter; } } - for (param_alpha_list_t::iterator alpha_iter = mParamAlphaList.begin(); alpha_iter != mParamAlphaList.end() && !result; ++alpha_iter) + for (param_alpha_list_t::const_iterator alpha_iter = mParamAlphaList.begin(); alpha_iter != mParamAlphaList.end() && !result; ++alpha_iter) { if ((*alpha_iter)->getID() == index) { @@ -1499,7 +1623,7 @@ BOOL LLTexLayer::render(S32 x, S32 y, S32 width, S32 height) return success; } -U8* LLTexLayer::getAlphaData() +const U8* LLTexLayer::getAlphaData() const { LLCRC alpha_mask_crc; const LLUUID& uuid = getUUID(); @@ -1515,7 +1639,7 @@ U8* LLTexLayer::getAlphaData() U32 cache_index = alpha_mask_crc.getCRC(); - alpha_cache_t::iterator iter2 = mAlphaCache.find(cache_index); + alpha_cache_t::const_iterator iter2 = mAlphaCache.find(cache_index); return (iter2 == mAlphaCache.end()) ? 0 : iter2->second; } @@ -1738,7 +1862,7 @@ BOOL LLTexLayer::renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLC void LLTexLayer::addAlphaMask(U8 *data, S32 originX, S32 originY, S32 width, S32 height) { S32 size = width * height; - U8* alphaData = getAlphaData(); + const U8* alphaData = getAlphaData(); if (!alphaData && hasAlphaParams()) { LLColor4 net_color; @@ -1761,7 +1885,7 @@ void LLTexLayer::addAlphaMask(U8 *data, S32 originX, S32 originY, S32 width, S32 } } -/*virtual*/ BOOL LLTexLayer::isInvisibleAlphaMask() +/*virtual*/ BOOL LLTexLayer::isInvisibleAlphaMask() const { if (mLocalTextureObject) { @@ -1774,8 +1898,7 @@ void LLTexLayer::addAlphaMask(U8 *data, S32 originX, S32 originY, S32 width, S32 return FALSE; } -// private helper function -LLUUID LLTexLayer::getUUID() +LLUUID LLTexLayer::getUUID() const { LLUUID uuid; if( getInfo()->mLocalTexture != -1 ) @@ -1834,7 +1957,7 @@ LLTexLayerTemplate::~LLTexLayerTemplate() return LLTexLayerInterface::setInfo(info, wearable); } -U32 LLTexLayerTemplate::updateWearableCache() +U32 LLTexLayerTemplate::updateWearableCache() const { mWearableCache.clear(); @@ -1844,7 +1967,7 @@ U32 LLTexLayerTemplate::updateWearableCache() //this isn't a cloneable layer return 0; } - EWearableType wearable_type = LLVOAvatarDictionary::getTEWearableType((ETextureIndex)te); + LLWearableType::EType wearable_type = LLVOAvatarDictionary::getTEWearableType((ETextureIndex)te); U32 num_wearables = gAgentWearables.getWearableCount(wearable_type); U32 added = 0; for (U32 i = 0; i < num_wearables; i++) @@ -1859,7 +1982,7 @@ U32 LLTexLayerTemplate::updateWearableCache() } return added; } -LLTexLayer* LLTexLayerTemplate::getLayer(U32 i) +LLTexLayer* LLTexLayerTemplate::getLayer(U32 i) const { if (mWearableCache.size() <= i) { @@ -1881,6 +2004,11 @@ LLTexLayer* LLTexLayerTemplate::getLayer(U32 i) /*virtual*/ BOOL LLTexLayerTemplate::render(S32 x, S32 y, S32 width, S32 height) { + if(!mInfo) + { + return FALSE ; + } + BOOL success = TRUE; updateWearableCache(); for (wearable_cache_t::const_iterator iter = mWearableCache.begin(); iter!= mWearableCache.end(); iter++) @@ -1963,7 +2091,7 @@ LLTexLayer* LLTexLayerTemplate::getLayer(U32 i) } } -/*virtual*/ BOOL LLTexLayerTemplate::isInvisibleAlphaMask() +/*virtual*/ BOOL LLTexLayerTemplate::isInvisibleAlphaMask() const { U32 num_wearables = updateWearableCache(); for (U32 i = 0; i < num_wearables; i++) @@ -1987,19 +2115,17 @@ LLTexLayer* LLTexLayerTemplate::getLayer(U32 i) //----------------------------------------------------------------------------- LLTexLayerInterface* LLTexLayerSet::findLayerByName(const std::string& name) { - for( layer_list_t::iterator iter = mLayerList.begin(); iter != mLayerList.end(); iter++ ) + for (layer_list_t::iterator iter = mLayerList.begin(); iter != mLayerList.end(); iter++ ) { LLTexLayerInterface* layer = *iter; - if (layer->getName() == name) { return layer; } } - for( layer_list_t::iterator iter = mMaskLayerList.begin(); iter != mMaskLayerList.end(); iter++ ) + for (layer_list_t::iterator iter = mMaskLayerList.begin(); iter != mMaskLayerList.end(); iter++ ) { LLTexLayerInterface* layer = *iter; - if (layer->getName() == name) { return layer; @@ -2044,7 +2170,7 @@ LLTexLayerStaticImageList::~LLTexLayerStaticImageList() deleteCachedImages(); } -void LLTexLayerStaticImageList::dumpByteCount() +void LLTexLayerStaticImageList::dumpByteCount() const { llinfos << "Avatar Static Textures " << "KB GL:" << (mGLBytes / 1024) << @@ -2159,4 +2285,23 @@ BOOL LLTexLayerStaticImageList::loadImageRaw(const std::string& file_name, LLIma return success; } +const std::string LLTexLayerSetBuffer::dumpTextureInfo() const +{ + if (!isAgentAvatarValid()) return ""; + + const BOOL is_high_res = !mNeedsUpload; + const U32 num_low_res = mNumLowresUploads; + const U32 upload_time = (U32)mNeedsUploadTimer.getElapsedTimeF32(); + const std::string local_texture_info = gAgentAvatarp->debugDumpLocalTextureDataInfo(mTexLayerSet); + + std::string status = "CREATING "; + if (!uploadNeeded()) status = "DONE "; + if (uploadInProgress()) status = "UPLOADING"; + std::string text = llformat("[%s] [HiRes:%d LoRes:%d] [Elapsed:%d] %s", + status.c_str(), + is_high_res, num_low_res, + upload_time, + local_texture_info.c_str()); + return text; +} diff --git a/indra/newview/lltexlayer.h b/indra/newview/lltexlayer.h index 5be58f64a9..cb2e1faaa6 100644 --- a/indra/newview/lltexlayer.h +++ b/indra/newview/lltexlayer.h @@ -1,6 +1,6 @@ /** * @file lltexlayer.h - * @brief A texture layer. Used for avatars. + * @brief Texture layer classes. Used for avatars. * * $LicenseInfo:firstyear=2002&license=viewergpl$ * @@ -35,40 +35,31 @@ #include <deque> #include "lldynamictexture.h" -#include "llwearable.h" #include "llvoavatardefines.h" +#include "lltexlayerparams.h" class LLVOAvatar; class LLVOAvatarSelf; class LLImageTGA; class LLImageRaw; class LLXmlTreeNode; -class LLPolyMorphTarget; class LLTexLayerSet; class LLTexLayerSetInfo; class LLTexLayerInfo; class LLTexLayerSetBuffer; -class LLTexLayerParamColor; -class LLTexLayerParamColorInfo; -class LLTexLayerParamAlpha; -class LLTexLayerParamAlphaInfo; class LLWearable; class LLViewerVisualParam; -typedef std::vector<LLTexLayerParamColor *> param_color_list_t; -typedef std::vector<LLTexLayerParamAlpha *> param_alpha_list_t; -typedef std::vector<LLTexLayerParamColorInfo *> param_color_info_list_t; -typedef std::vector<LLTexLayerParamAlphaInfo *> param_alpha_info_list_t; - - -//----------------------------------------------------------------------------- +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // LLTexLayerInterface -// Interface class to generalize functionality shared by LLTexLayer and LLTexLayerTemplate. - +// +// Interface class to generalize functionality shared by LLTexLayer +// and LLTexLayerTemplate. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ class LLTexLayerInterface { public: - enum ERenderPass + enum ERenderPass { RP_COLOR, RP_BUMP, @@ -79,84 +70,78 @@ public: LLTexLayerInterface(const LLTexLayerInterface &layer, LLWearable *wearable); virtual ~LLTexLayerInterface() {} - const LLTexLayerInfo* getInfo() const { return mInfo; } - virtual BOOL setInfo(const LLTexLayerInfo *info, LLWearable* wearable ); // This sets mInfo and calls initialization functions virtual BOOL render(S32 x, S32 y, S32 width, S32 height) = 0; - void requestUpdate(); - LLTexLayerSet* const getTexLayerSet() const { return mTexLayerSet; } - virtual void deleteCaches() = 0; - void invalidateMorphMasks(); - virtual void setHasMorph(BOOL newval) { mHasMorph = newval; } - BOOL hasMorph() { return mHasMorph; } - BOOL isMorphValid() { return mMorphMasksValid; } + virtual BOOL blendAlphaTexture(S32 x, S32 y, S32 width, S32 height) = 0; + virtual BOOL isInvisibleAlphaMask() const = 0; + + const LLTexLayerInfo* getInfo() const { return mInfo; } + virtual BOOL setInfo(const LLTexLayerInfo *info, LLWearable* wearable); // sets mInfo, calls initialization functions const std::string& getName() const; - ERenderPass getRenderPass() const; - const std::string& getGlobalColor() const; + const LLTexLayerSet* const getTexLayerSet() const { return mTexLayerSet; } + LLTexLayerSet* const getTexLayerSet() { return mTexLayerSet; } - virtual BOOL blendAlphaTexture( S32 x, S32 y, S32 width, S32 height) = 0; - virtual void gatherAlphaMasks(U8 *data, S32 originX, S32 originY, S32 width, S32 height) = 0; - BOOL hasAlphaParams() const { return !mParamAlphaList.empty(); } - BOOL isVisibilityMask() const; - virtual BOOL isInvisibleAlphaMask() = 0; + void invalidateMorphMasks(); + virtual void setHasMorph(BOOL newval) { mHasMorph = newval; } + BOOL hasMorph() const { return mHasMorph; } + BOOL isMorphValid() const { return mMorphMasksValid; } - LLTexLayerSet* getLayerSet() {return mTexLayerSet;} + void requestUpdate(); + virtual void gatherAlphaMasks(U8 *data, S32 originX, S32 originY, S32 width, S32 height) = 0; + BOOL hasAlphaParams() const { return !mParamAlphaList.empty(); } - LLViewerVisualParam* getVisualParamPtr(S32 index); + ERenderPass getRenderPass() const; + BOOL isVisibilityMask() const; +protected: + const std::string& getGlobalColor() const; + LLViewerVisualParam* getVisualParamPtr(S32 index) const; protected: - LLTexLayerSet* const mTexLayerSet; + LLTexLayerSet* const mTexLayerSet; + const LLTexLayerInfo* mInfo; + BOOL mMorphMasksValid; + BOOL mHasMorph; // Layers can have either mParamColorList, mGlobalColor, or mFixedColor. They are looked for in that order. param_color_list_t mParamColorList; + param_alpha_list_t mParamAlphaList; // mGlobalColor name stored in mInfo // mFixedColor value stored in mInfo - param_alpha_list_t mParamAlphaList; - - BOOL mMorphMasksValid; - BOOL mStaticImageInvalid; - - BOOL mHasMorph; - - const LLTexLayerInfo *mInfo; - }; -//----------------------------------------------------------------------------- +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // LLTexLayerTemplate -// Template class -// Only exists for llvoavatarself - +// +// Only exists for llvoavatarself. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ class LLTexLayerTemplate : public LLTexLayerInterface { public: LLTexLayerTemplate(LLTexLayerSet* const layer_set); LLTexLayerTemplate(const LLTexLayerTemplate &layer); /*virtual*/ ~LLTexLayerTemplate(); - /*virtual*/ BOOL render(S32 x, S32 y, S32 width, S32 height); - /*virtual*/ BOOL setInfo(const LLTexLayerInfo *info, LLWearable* wearable ); // This sets mInfo and calls initialization functions - /*virtual*/ BOOL blendAlphaTexture( S32 x, S32 y, S32 width, S32 height); // Multiplies a single alpha texture against the frame buffer + /*virtual*/ BOOL setInfo(const LLTexLayerInfo *info, LLWearable* wearable); // This sets mInfo and calls initialization functions + /*virtual*/ BOOL blendAlphaTexture(S32 x, S32 y, S32 width, S32 height); // Multiplies a single alpha texture against the frame buffer /*virtual*/ void gatherAlphaMasks(U8 *data, S32 originX, S32 originY, S32 width, S32 height); /*virtual*/ void setHasMorph(BOOL newval); /*virtual*/ void deleteCaches(); - /*virtual*/ BOOL isInvisibleAlphaMask(); - + /*virtual*/ BOOL isInvisibleAlphaMask() const; +protected: + U32 updateWearableCache() const; + LLTexLayer* getLayer(U32 i) const; private: - U32 updateWearableCache(); - LLTexLayer* getLayer(U32 i); typedef std::vector<LLWearable*> wearable_cache_t; - wearable_cache_t mWearableCache; - + mutable wearable_cache_t mWearableCache; // mutable b/c most get- require updating this cache }; -//----------------------------------------------------------------------------- +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // LLTexLayer -// A single texture layer -// Only exists for llvoavatarself - +// +// A single texture layer. Only exists for llvoavatarself. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ class LLTexLayer : public LLTexLayerInterface { public: @@ -165,79 +150,37 @@ public: LLTexLayer(const LLTexLayerTemplate &layer_template, LLLocalTextureObject *lto, LLWearable *wearable); /*virtual*/ ~LLTexLayer(); - /*virtual*/ BOOL setInfo(const LLTexLayerInfo *info, LLWearable* wearable ); // This sets mInfo and calls initialization functions + /*virtual*/ BOOL setInfo(const LLTexLayerInfo *info, LLWearable* wearable); // This sets mInfo and calls initialization functions /*virtual*/ BOOL render(S32 x, S32 y, S32 width, S32 height); /*virtual*/ void deleteCaches(); - U8* getAlphaData(); + const U8* getAlphaData() const; BOOL findNetColor(LLColor4* color) const; - /*virtual*/ BOOL blendAlphaTexture( S32 x, S32 y, S32 width, S32 height); // Multiplies a single alpha texture against the frame buffer + /*virtual*/ BOOL blendAlphaTexture(S32 x, S32 y, S32 width, S32 height); // Multiplies a single alpha texture against the frame buffer /*virtual*/ void gatherAlphaMasks(U8 *data, S32 originX, S32 originY, S32 width, S32 height); BOOL renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLColor4 &layer_color); void addAlphaMask(U8 *data, S32 originX, S32 originY, S32 width, S32 height); - /*virtual*/ BOOL isInvisibleAlphaMask(); + /*virtual*/ BOOL isInvisibleAlphaMask() const; - void setLTO(LLLocalTextureObject *lto) { mLocalTextureObject = lto; } - LLLocalTextureObject* getLTO() { return mLocalTextureObject; } - - static void calculateTexLayerColor(const param_color_list_t ¶m_list, LLColor4 &net_color); + void setLTO(LLLocalTextureObject *lto) { mLocalTextureObject = lto; } + LLLocalTextureObject* getLTO() { return mLocalTextureObject; } + static void calculateTexLayerColor(const param_color_list_t ¶m_list, LLColor4 &net_color); +protected: + LLUUID getUUID() const; private: - LLUUID getUUID(); - typedef std::map<U32, U8*> alpha_cache_t; alpha_cache_t mAlphaCache; - LLLocalTextureObject *mLocalTextureObject; -}; - -// Make private -class LLTexLayerInfo -{ - friend class LLTexLayer; - friend class LLTexLayerTemplate; - friend class LLTexLayerInterface; -public: - LLTexLayerInfo(); - ~LLTexLayerInfo(); - - BOOL parseXml(LLXmlTreeNode* node); - BOOL createVisualParams(LLVOAvatar *avatar); - BOOL isUserSettable() { return mLocalTexture != -1; } - S32 getLocalTexture() const { return mLocalTexture; } - BOOL getOnlyAlpha() const { return mUseLocalTextureAlphaOnly; } - std::string getName() const { return mName; } - -private: - std::string mName; - - BOOL mWriteAllChannels; // Don't use masking. Just write RGBA into buffer, - LLTexLayer::ERenderPass mRenderPass; - - std::string mGlobalColor; - LLColor4 mFixedColor; - - S32 mLocalTexture; - std::string mStaticImageFileName; - BOOL mStaticImageIsMask; - BOOL mUseLocalTextureAlphaOnly; // Ignore RGB channels from the input texture. Use alpha as a mask - BOOL mIsVisibilityMask; - - typedef std::vector< std::pair< std::string,BOOL > > morph_name_list_t; - morph_name_list_t mMorphNameList; - param_color_info_list_t mParamColorInfoList; - param_alpha_info_list_t mParamAlphaInfoList; + LLLocalTextureObject* mLocalTextureObject; }; -// -// LLTexLayer -//----------------------------------------------------------------------------- - -//----------------------------------------------------------------------------- +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // LLTexLayerSet -// An ordered set of texture layers that get composited into a single texture. -// Only exists for llvoavatarself - +// +// An ordered set of texture layers that gets composited into a single texture. +// Only exists for llvoavatarself. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ class LLTexLayerSet { friend class LLTexLayerSetBuffer; @@ -245,172 +188,171 @@ public: LLTexLayerSet(LLVOAvatarSelf* const avatar); ~LLTexLayerSet(); - const LLTexLayerSetInfo* getInfo() const { return mInfo; } - BOOL setInfo(const LLTexLayerSetInfo *info); // This sets mInfo and calls initialization functions - - BOOL render(S32 x, S32 y, S32 width, S32 height); - void renderAlphaMaskTextures(S32 x, S32 y, S32 width, S32 height, bool forceClear = false); - - BOOL isBodyRegion(const std::string& region) const; - LLTexLayerSetBuffer* getComposite(); - void requestUpdate(); - void requestUpload(); - void cancelUpload(); - void updateComposite(); - BOOL isLocalTextureDataAvailable() const; - BOOL isLocalTextureDataFinal() const; - void createComposite(); - void destroyComposite(); - void setUpdatesEnabled(BOOL b); - BOOL getUpdatesEnabled() const { return mUpdatesEnabled; } - void deleteCaches(); - void gatherMorphMaskAlpha(U8 *data, S32 width, S32 height); - void applyMorphMask(U8* tex_data, S32 width, S32 height, S32 num_components); - BOOL isMorphValid(); - void invalidateMorphMasks(); - LLTexLayerInterface* findLayerByName(const std::string& name); - void cloneTemplates(LLLocalTextureObject *lto, LLVOAvatarDefines::ETextureIndex tex_index, LLWearable* wearable); + const LLTexLayerSetInfo* getInfo() const { return mInfo; } + BOOL setInfo(const LLTexLayerSetInfo *info); // This sets mInfo and calls initialization functions + + BOOL render(S32 x, S32 y, S32 width, S32 height); + void renderAlphaMaskTextures(S32 x, S32 y, S32 width, S32 height, bool forceClear = false); + + BOOL isBodyRegion(const std::string& region) const; + LLTexLayerSetBuffer* getComposite(); + const LLTexLayerSetBuffer* getComposite() const; // Do not create one if it doesn't exist. + void requestUpdate(); + void requestUpload(); + void cancelUpload(); + void updateComposite(); + BOOL isLocalTextureDataAvailable() const; + BOOL isLocalTextureDataFinal() const; + void createComposite(); + void destroyComposite(); + void setUpdatesEnabled(BOOL b); + BOOL getUpdatesEnabled() const { return mUpdatesEnabled; } + void deleteCaches(); + void gatherMorphMaskAlpha(U8 *data, S32 width, S32 height); + void applyMorphMask(U8* tex_data, S32 width, S32 height, S32 num_components); + BOOL isMorphValid() const; + void invalidateMorphMasks(); + LLTexLayerInterface* findLayerByName(const std::string& name); + void cloneTemplates(LLLocalTextureObject *lto, LLVOAvatarDefines::ETextureIndex tex_index, LLWearable* wearable); - LLVOAvatarSelf* getAvatar() const { return mAvatar; } - const std::string getBodyRegion() const; - BOOL hasComposite() const { return (mComposite.notNull()); } + LLVOAvatarSelf* getAvatar() const { return mAvatar; } + const std::string getBodyRegionName() const; + BOOL hasComposite() const { return (mComposite.notNull()); } LLVOAvatarDefines::EBakedTextureIndex getBakedTexIndex() { return mBakedTexIndex; } - void setBakedTexIndex( LLVOAvatarDefines::EBakedTextureIndex index) { mBakedTexIndex = index; } - BOOL isVisible() const { return mIsVisible; } + void setBakedTexIndex(LLVOAvatarDefines::EBakedTextureIndex index) { mBakedTexIndex = index; } + BOOL isVisible() const { return mIsVisible; } -public: - static BOOL sHasCaches; - - typedef std::vector<LLTexLayerInterface *> layer_list_t; + static BOOL sHasCaches; private: - layer_list_t mLayerList; - layer_list_t mMaskLayerList; + typedef std::vector<LLTexLayerInterface *> layer_list_t; + layer_list_t mLayerList; + layer_list_t mMaskLayerList; LLPointer<LLTexLayerSetBuffer> mComposite; - LLVOAvatarSelf* const mAvatar; // Backlink only; don't make this an LLPointer. - BOOL mUpdatesEnabled; - BOOL mIsVisible; + LLVOAvatarSelf* const mAvatar; // note: backlink only; don't make this an LLPointer. + BOOL mUpdatesEnabled; + BOOL mIsVisible; LLVOAvatarDefines::EBakedTextureIndex mBakedTexIndex; - - const LLTexLayerSetInfo *mInfo; + const LLTexLayerSetInfo* mInfo; }; -// Contains shared layer set data +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// LLTexLayerSetInfo +// +// Contains shared layer set data. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ class LLTexLayerSetInfo { friend class LLTexLayerSet; public: LLTexLayerSetInfo(); ~LLTexLayerSetInfo(); - BOOL parseXml(LLXmlTreeNode* node); void createVisualParams(LLVOAvatar *avatar); - private: std::string mBodyRegion; S32 mWidth; S32 mHeight; std::string mStaticAlphaFileName; BOOL mClearAlpha; // Set alpha to 1 for this layerset (if there is no mStaticAlphaFileName) - typedef std::vector<LLTexLayerInfo*> layer_info_list_t; layer_info_list_t mLayerInfoList; }; +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// LLTexLayerSetBuffer +// // The composite image that a LLTexLayerSet writes to. Each LLTexLayerSet has one. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ class LLTexLayerSetBuffer : public LLViewerDynamicTexture { public: LLTexLayerSetBuffer(LLTexLayerSet* const owner, S32 width, S32 height); virtual ~LLTexLayerSetBuffer(); - + /*virtual*/ S8 getType() const; virtual void preRender(BOOL clear_depth); virtual void postRender(BOOL success); virtual BOOL render(); BOOL updateImmediate(); - bool isInitialized(void) const; - BOOL needsRender(); + + BOOL isInitialized(void) const; + BOOL uploadPending() const; // We are expecting a new texture to be uploaded at some point + BOOL uploadNeeded() const; // We need to upload a new texture + BOOL uploadInProgress() const; // We have started uploading a new texture and are awaiting the result + + /*virtual*/ BOOL needsRender(); void requestUpdate(); void requestUpload(); void cancelUpload(); - BOOL uploadPending() { return mUploadPending; } - BOOL render( S32 x, S32 y, S32 width, S32 height ); + BOOL render(S32 x, S32 y, S32 width, S32 height); void readBackAndUpload(); - static void onTextureUploadComplete(const LLUUID& uuid, void* userdata, S32 result, LLExtStat ext_status); static void dumpTotalByteCount(); + const std::string dumpTextureInfo() const; + virtual void restoreGLTexture(); + virtual void destroyGLTexture(); - virtual void restoreGLTexture(); - virtual void destroyGLTexture(); -private: +protected: void pushProjection() const; void popProjection() const; - + BOOL isReadyToUpload() const; + void conditionalRestartUploadTimer(); + private: LLTexLayerSet* const mTexLayerSet; - - BOOL mNeedsUpdate; - BOOL mNeedsUpload; - BOOL mUploadPending; - LLUUID mUploadID; // Identifys the current upload process (null if none). Used to avoid overlaps (eg, when the user rapidly makes two changes outside of Face Edit) - + BOOL mNeedsUpdate; // whether we need to update our baked textures + BOOL mNeedsUpload; // whether we need to send our baked textures to the server + U32 mNumLowresUploads; // number of times we've sent a lowres version of our baked textures to the server + BOOL mUploadPending; // whether we have received back the new baked textures + LLUUID mUploadID; // the current upload process (null if none). Used to avoid overlaps, e.g. when the user rapidly makes two changes outside of Face Edit. static S32 sGLByteCount; + LLFrameTimer mNeedsUploadTimer; // Tracks time since upload was requested }; -// -// LLTexLayerSet -//----------------------------------------------------------------------------- - -//----------------------------------------------------------------------------- +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // LLTexLayerStaticImageList // - +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ class LLTexLayerStaticImageList : public LLSingleton<LLTexLayerStaticImageList> { public: LLTexLayerStaticImageList(); ~LLTexLayerStaticImageList(); - LLViewerTexture* getTexture(const std::string& file_name, BOOL is_mask); - LLImageTGA* getImageTGA(const std::string& file_name); - - void deleteCachedImages(); - void dumpByteCount(); - -private: - BOOL loadImageRaw(const std::string& file_name, LLImageRaw* image_raw); - + LLImageTGA* getImageTGA(const std::string& file_name); + void deleteCachedImages(); + void dumpByteCount() const; +protected: + BOOL loadImageRaw(const std::string& file_name, LLImageRaw* image_raw); private: - LLStringTable mImageNames; - - typedef std::map< const char*, LLPointer<LLViewerTexture> > texture_map_t; - texture_map_t mStaticImageList; - typedef std::map< const char*, LLPointer<LLImageTGA> > image_tga_map_t; - image_tga_map_t mStaticImageListTGA; - - S32 mGLBytes; - S32 mTGABytes; + LLStringTable mImageNames; + typedef std::map<const char*, LLPointer<LLViewerTexture> > texture_map_t; + texture_map_t mStaticImageList; + typedef std::map<const char*, LLPointer<LLImageTGA> > image_tga_map_t; + image_tga_map_t mStaticImageListTGA; + S32 mGLBytes; + S32 mTGABytes; }; +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// LLBakedUploadData +// // Used by LLTexLayerSetBuffer for a callback. -// Note to anyone merging branches - this supercedes the previous fix -// for DEV-31590 "Heap corruption and crash after outfit changes", -// here and in lltexlayer.cpp. Equally correct and a bit simpler. -class LLBakedUploadData +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +struct LLBakedUploadData { -public: - LLBakedUploadData(const LLVOAvatarSelf* avatar, LLTexLayerSet* layerset, const LLUUID& id); + LLBakedUploadData(const LLVOAvatarSelf* avatar, + LLTexLayerSet* layerset, + const LLUUID& id); ~LLBakedUploadData() {} - const LLUUID mID; - const LLVOAvatarSelf* mAvatar; // just backlink, don't LLPointer + const LLVOAvatarSelf* mAvatar; // note: backlink only; don't LLPointer LLTexLayerSet* mTexLayerSet; - const U64 mStartTime; // Used to measure time baked texture upload requires + const U64 mStartTime; // for measuring baked texture upload time }; - #endif // LL_LLTEXLAYER_H diff --git a/indra/newview/lltexlayerparams.cpp b/indra/newview/lltexlayerparams.cpp index d55468841d..f2d1b5d032 100644 --- a/indra/newview/lltexlayerparams.cpp +++ b/indra/newview/lltexlayerparams.cpp @@ -1,6 +1,6 @@ /** * @file lltexlayerparams.cpp - * @brief SERAPH - ADD IN + * @brief Texture layer parameters * * $LicenseInfo:firstyear=2002&license=viewergpl$ * @@ -33,7 +33,7 @@ #include "lltexlayerparams.h" -#include "llagent.h" +#include "llagentcamera.h" #include "llimagetga.h" #include "lltexlayer.h" #include "llvoavatarself.h" @@ -180,7 +180,7 @@ void LLTexLayerParamAlpha::setWeight(F32 weight, BOOL upload_bake) if ((mAvatar->getSex() & getSex()) && (mAvatar->isSelf() && !mIsDummy)) // only trigger a baked texture update if we're changing a wearable's visual param. { - if (gAgent.cameraCustomizeAvatar()) + if (gAgentCamera.cameraCustomizeAvatar()) { upload_bake = FALSE; } @@ -234,8 +234,8 @@ BOOL LLTexLayerParamAlpha::getSkip() const } } - EWearableType type = (EWearableType)getWearableType(); - if ((type != WT_INVALID) && !avatar->isWearingWearableType(type)) + LLWearableType::EType type = (LLWearableType::EType)getWearableType(); + if ((type != LLWearableType::WT_INVALID) && !avatar->isWearingWearableType(type)) { return TRUE; } diff --git a/indra/newview/lltexlayerparams.h b/indra/newview/lltexlayerparams.h index 93d01352d4..7747ee1ebf 100644 --- a/indra/newview/lltexlayerparams.h +++ b/indra/newview/lltexlayerparams.h @@ -42,6 +42,10 @@ class LLViewerTexture; class LLVOAvatar; class LLWearable; +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// LLTexLayerParam +// +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ class LLTexLayerParam : public LLViewerVisualParam { public: @@ -55,9 +59,10 @@ protected: LLVOAvatar* mAvatar; }; -//----------------------------------------------------------------------------- +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // LLTexLayerParamAlpha // +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ class LLTexLayerParamAlpha : public LLTexLayerParam { public: @@ -124,9 +129,10 @@ private: // LLTexLayerParamAlpha //----------------------------------------------------------------------------- -//----------------------------------------------------------------------------- +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // LLTexLayerParamColor // +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ class LLTexLayerParamColor : public LLTexLayerParam { public: @@ -184,8 +190,9 @@ private: S32 mNumColors; }; -// -// LLTexLayerParamColor -//----------------------------------------------------------------------------- +typedef std::vector<LLTexLayerParamColor *> param_color_list_t; +typedef std::vector<LLTexLayerParamAlpha *> param_alpha_list_t; +typedef std::vector<LLTexLayerParamColorInfo *> param_color_info_list_t; +typedef std::vector<LLTexLayerParamAlphaInfo *> param_alpha_info_list_t; #endif diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp index a7f26f1df1..9ad2322765 100644 --- a/indra/newview/lltexturecache.cpp +++ b/indra/newview/lltexturecache.cpp @@ -51,7 +51,8 @@ // cache/textures/[0-F]/UUID.texture // Actual texture body files -const S32 TEXTURE_CACHE_ENTRY_SIZE = 1024; +//note: there is no good to define 1024 for TEXTURE_CACHE_ENTRY_SIZE while FIRST_PACKET_SIZE is 600 on sim side. +const S32 TEXTURE_CACHE_ENTRY_SIZE = FIRST_PACKET_SIZE;//1024; const F32 TEXTURE_CACHE_PURGE_AMOUNT = .20f; // % amount to reduce the cache by when it exceeds its limit const F32 TEXTURE_CACHE_LRU_SIZE = .10f; // % amount for LRU list (low overhead to regenerate) @@ -400,7 +401,8 @@ bool LLTextureCacheRemoteWorker::doRead() // Second state / stage : identify the cache or not... if (!done && (mState == CACHE)) { - idx = mCache->getHeaderCacheEntry(mID, mImageSize); + LLTextureCache::Entry entry ; + idx = mCache->getHeaderCacheEntry(mID, entry); if (idx < 0) { // The texture is *not* cached. We're done here... @@ -409,6 +411,7 @@ bool LLTextureCacheRemoteWorker::doRead() } else { + mImageSize = entry.mImageSize ; // If the read offset is bigger than the header cache, we read directly from the body // Note that currently, we *never* read with offset from the cache, so the result is *always* HEADER mState = mOffset < TEXTURE_CACHE_ENTRY_SIZE ? HEADER : BODY; @@ -530,13 +533,14 @@ bool LLTextureCacheRemoteWorker::doRead() bool LLTextureCacheRemoteWorker::doWrite() { bool done = false; - S32 idx = -1; + S32 idx = -1; // First state / stage : check that what we're trying to cache is in an OK shape if (mState == INIT) { llassert_always(mOffset == 0); // We currently do not support write offsets llassert_always(mDataSize > 0); // Things will go badly wrong if mDataSize is nul or negative... + llassert_always(mImageSize >= mDataSize); mState = CACHE; } @@ -546,14 +550,19 @@ bool LLTextureCacheRemoteWorker::doWrite() if (!done && (mState == CACHE)) { bool alreadyCached = false; - S32 cur_imagesize = 0; + LLTextureCache::Entry entry ; + // Checks if this image is already in the entry list - idx = mCache->getHeaderCacheEntry(mID, cur_imagesize); - if (idx >= 0 && (cur_imagesize >= 0)) + idx = mCache->getHeaderCacheEntry(mID, entry); + if(idx < 0) + { + idx = mCache->setHeaderCacheEntry(mID, entry, mImageSize, mDataSize); // create the new entry. + } + else { - alreadyCached = true; // already there and non empty + alreadyCached = mCache->updateEntry(idx, entry, mImageSize, mDataSize); // update the existing entry. } - idx = mCache->setHeaderCacheEntry(mID, mImageSize); // create or touch the entry + if (idx < 0) { llwarns << "LLTextureCacheWorker: " << mID @@ -563,10 +572,6 @@ bool LLTextureCacheRemoteWorker::doWrite() } else { - if (cur_imagesize > 0 && (mImageSize != cur_imagesize)) - { - alreadyCached = false; // re-write the header if the size changed in all cases - } if (alreadyCached && (mDataSize <= TEXTURE_CACHE_ENTRY_SIZE)) { // Small texture already cached case: we're done with writing @@ -629,7 +634,7 @@ bool LLTextureCacheRemoteWorker::doWrite() { llassert(mDataSize > TEXTURE_CACHE_ENTRY_SIZE); // wouldn't make sense to be here otherwise... S32 file_size = mDataSize - TEXTURE_CACHE_ENTRY_SIZE; - if ((file_size > 0) && mCache->updateTextureEntryList(mID, file_size)) + { // build the cache file name from the UUID std::string filename = mCache->getTextureFileName(mID); @@ -647,10 +652,7 @@ bool LLTextureCacheRemoteWorker::doWrite() done = true; } } - else - { - mDataSize = 0; // no data written - } + // Nothing else to do at that point... done = true; } @@ -741,7 +743,7 @@ LLTextureCache::LLTextureCache(bool threaded) mHeaderMutex(NULL), mListMutex(NULL), mHeaderAPRFile(NULL), - mReadOnly(FALSE), + mReadOnly(TRUE), //do not allow to change the texture cache until setReadOnly() is called. mTexturesSizeTotal(0), mDoPurge(FALSE) { @@ -749,6 +751,8 @@ LLTextureCache::LLTextureCache(bool threaded) LLTextureCache::~LLTextureCache() { + clearDeleteList() ; + writeUpdatedEntries() ; } ////////////////////////////////////////////////////////////////////////////// @@ -756,6 +760,9 @@ LLTextureCache::~LLTextureCache() //virtual S32 LLTextureCache::update(U32 max_time_ms) { + static LLFrameTimer timer ; + static const F32 MAX_TIME_INTERVAL = 300.f ; //seconds. + S32 res; res = LLWorkerThread::update(max_time_ms); @@ -791,6 +798,12 @@ S32 LLTextureCache::update(U32 max_time_ms) responder->completed(success); } + if(!res && timer.getElapsedTimeF32() > MAX_TIME_INTERVAL) + { + timer.reset() ; + writeUpdatedEntries() ; + } + return res; } @@ -813,58 +826,6 @@ std::string LLTextureCache::getTextureFileName(const LLUUID& id) return filename; } -bool LLTextureCache::updateTextureEntryList(const LLUUID& id, S32 bodysize) -{ - bool res = false; - bool purge = false; - { - LLMutexLock lock(&mHeaderMutex); - size_map_t::iterator iter1 = mTexturesSizeMap.find(id); - if (iter1 == mTexturesSizeMap.end() || iter1->second < bodysize) - { - llassert_always(bodysize > 0); - - S32 oldbodysize = 0; - if (iter1 != mTexturesSizeMap.end()) - { - oldbodysize = iter1->second; - } - - Entry entry; - S32 idx = openAndReadEntry(id, entry, false); - if (idx < 0) - { - llwarns << "Failed to open entry: " << id << llendl; - removeHeaderCacheEntry(id); - LLAPRFile::remove(getTextureFileName(id), getLocalAPRFilePool()); - return false; - } - else if (oldbodysize != entry.mBodySize) - { - // TODO: change to llwarns - llerrs << "Entry mismatch in mTextureSizeMap / mHeaderIDMap" - << " idx=" << idx << " oldsize=" << oldbodysize << " entrysize=" << entry.mBodySize << llendl; - } - entry.mBodySize = bodysize; - writeEntryAndClose(idx, entry); - - mTexturesSizeTotal -= oldbodysize; - mTexturesSizeTotal += bodysize; - - if (mTexturesSizeTotal > sCacheMaxTexturesSize) - { - purge = true; - } - res = true; - } - } - if (purge) - { - mDoPurge = TRUE; - } - return res; -} - //debug BOOL LLTextureCache::isInCache(const LLUUID& id) { @@ -922,13 +883,16 @@ U32 LLTextureCache::sCacheMaxEntries = MAX_REASONABLE_FILE_SIZE / TEXTURE_CACHE_ S64 LLTextureCache::sCacheMaxTexturesSize = 0; // no limit const char* entries_filename = "texture.entries"; const char* cache_filename = "texture.cache"; -const char* textures_dirname = "textures"; +const char* old_textures_dirname = "textures"; +//change the location of the texture cache to prevent from being deleted by old version viewers. +const char* textures_dirname = "texturecache"; void LLTextureCache::setDirNames(ELLPath location) { std::string delem = gDirUtilp->getDirDelimiter(); - mHeaderEntriesFileName = gDirUtilp->getExpandedFilename(location, entries_filename); - mHeaderDataFileName = gDirUtilp->getExpandedFilename(location, cache_filename); + + mHeaderEntriesFileName = gDirUtilp->getExpandedFilename(location, textures_dirname, entries_filename); + mHeaderDataFileName = gDirUtilp->getExpandedFilename(location, textures_dirname, cache_filename); mTexturesDirName = gDirUtilp->getExpandedFilename(location, textures_dirname); } @@ -940,16 +904,38 @@ void LLTextureCache::purgeCache(ELLPath location) { setDirNames(location); llassert_always(mHeaderAPRFile == NULL); - LLAPRFile::remove(mHeaderEntriesFileName, getLocalAPRFilePool()); - LLAPRFile::remove(mHeaderDataFileName, getLocalAPRFilePool()); + + //remove the legacy cache if exists + std::string texture_dir = mTexturesDirName ; + mTexturesDirName = gDirUtilp->getExpandedFilename(location, old_textures_dirname); + if(LLFile::isdir(mTexturesDirName)) + { + std::string file_name = gDirUtilp->getExpandedFilename(location, entries_filename); + LLAPRFile::remove(file_name, getLocalAPRFilePool()); + + file_name = gDirUtilp->getExpandedFilename(location, cache_filename); + LLAPRFile::remove(file_name, getLocalAPRFilePool()); + + purgeAllTextures(true); + } + mTexturesDirName = texture_dir ; } + + //remove the current texture cache. purgeAllTextures(true); } -S64 LLTextureCache::initCache(ELLPath location, S64 max_size, BOOL read_only) +//is called in the main thread before initCache(...) is called. +void LLTextureCache::setReadOnly(BOOL read_only) { - mReadOnly = read_only; - + mReadOnly = read_only ; +} + +//called in the main thread. +S64 LLTextureCache::initCache(ELLPath location, S64 max_size, BOOL disable_texture_cache) +{ + llassert_always(getPending() == 0) ; //should not start accessing the texture cache before initialized. + S64 header_size = (max_size * 2) / 10; S64 max_entries = header_size / TEXTURE_CACHE_ENTRY_SIZE; sCacheMaxEntries = (S32)(llmin((S64)sCacheMaxEntries, max_entries)); @@ -961,6 +947,15 @@ S64 LLTextureCache::initCache(ELLPath location, S64 max_size, BOOL read_only) sCacheMaxTexturesSize = max_size; max_size -= sCacheMaxTexturesSize; + if(disable_texture_cache) //the texture cache is disabled + { + llinfos << "The texture cache is disabled!" << llendl ; + setReadOnly(TRUE) ; + purgeAllTextures(true); + + return max_size ; + } + LL_INFOS("TextureCache") << "Headers: " << sCacheMaxEntries << " Textures size: " << sCacheMaxTexturesSize/(1024*1024) << " MB" << LL_ENDL; @@ -969,6 +964,7 @@ S64 LLTextureCache::initCache(ELLPath location, S64 max_size, BOOL read_only) if (!mReadOnly) { LLFile::mkdir(mTexturesDirName); + const char* subdirs = "0123456789abcdef"; for (S32 i=0; i<16; i++) { @@ -979,6 +975,8 @@ S64 LLTextureCache::initCache(ELLPath location, S64 max_size, BOOL read_only) readHeaderCache(); purgeTextures(true); // calc mTexturesSize and make some room in the texture cache if we need it + llassert_always(getPending() == 0) ; //should not start accessing the texture cache before initialized. + return max_size; // unused cache space } @@ -990,7 +988,10 @@ LLAPRFile* LLTextureCache::openHeaderEntriesFile(bool readonly, S32 offset) llassert_always(mHeaderAPRFile == NULL); apr_int32_t flags = readonly ? APR_READ|APR_BINARY : APR_READ|APR_WRITE|APR_BINARY; mHeaderAPRFile = new LLAPRFile(mHeaderEntriesFileName, flags, getLocalAPRFilePool()); - mHeaderAPRFile->seek(APR_SET, offset); + if(offset > 0) + { + mHeaderAPRFile->seek(APR_SET, offset); + } return mHeaderAPRFile; } @@ -1010,6 +1011,12 @@ void LLTextureCache::readEntriesHeader() LLAPRFile::readEx(mHeaderEntriesFileName, (U8*)&mHeaderEntriesInfo, 0, sizeof(EntriesInfo), getLocalAPRFilePool()); } + else //create an empty entries header. + { + mHeaderEntriesInfo.mVersion = sHeaderCacheVersion ; + mHeaderEntriesInfo.mEntries = 0 ; + writeEntriesHeader() ; + } } void LLTextureCache::writeEntriesHeader() @@ -1022,8 +1029,7 @@ void LLTextureCache::writeEntriesHeader() } } -static S32 mHeaderEntriesMaxWriteIdx = 0; - +//mHeaderMutex is locked before calling this. S32 LLTextureCache::openAndReadEntry(const LLUUID& id, Entry& entry, bool create) { S32 idx = -1; @@ -1063,8 +1069,7 @@ S32 LLTextureCache::openAndReadEntry(const LLUUID& id, Entry& entry, bool create if (iter3 != mHeaderIDMap.end() && iter3->second >= 0) { idx = iter3->second; - mHeaderIDMap.erase(oldid); - mTexturesSizeMap.erase(oldid); + removeCachedTexture(oldid) ;//remove the existing cached texture to release the entry index. break; } } @@ -1074,20 +1079,9 @@ S32 LLTextureCache::openAndReadEntry(const LLUUID& id, Entry& entry, bool create } if (idx >= 0) { - // Set the header index - mHeaderIDMap[id] = idx; - llassert_always(mTexturesSizeMap.erase(id) == 0); - // Initialize the entry (will get written later) - entry.init(id, time(NULL)); - // Update Header - writeEntriesHeader(); - // Write Entry - S32 offset = sizeof(EntriesInfo) + idx * sizeof(Entry); - LLAPRFile* aprfile = openHeaderEntriesFile(false, offset); - S32 bytes_written = aprfile->write((void*)&entry, (S32)sizeof(Entry)); - llassert_always(bytes_written == sizeof(Entry)); - mHeaderEntriesMaxWriteIdx = llmax(mHeaderEntriesMaxWriteIdx, idx); - closeHeaderEntriesFile(); + entry.mID = id ; + entry.mImageSize = -1 ; //mark it is a brand-new entry. + entry.mBodySize = 0 ; } } } @@ -1096,37 +1090,135 @@ S32 LLTextureCache::openAndReadEntry(const LLUUID& id, Entry& entry, bool create // Remove this entry from the LRU if it exists mLRU.erase(id); // Read the entry - S32 offset = sizeof(EntriesInfo) + idx * sizeof(Entry); - LLAPRFile* aprfile = openHeaderEntriesFile(true, offset); - S32 bytes_read = aprfile->read((void*)&entry, (S32)sizeof(Entry)); - llassert_always(bytes_read == sizeof(Entry)); - llassert_always(entry.mImageSize == 0 || entry.mImageSize == -1 || entry.mImageSize > entry.mBodySize); - closeHeaderEntriesFile(); + idx_entry_map_t::iterator iter = mUpdatedEntryMap.find(idx) ; + if(iter != mUpdatedEntryMap.end()) + { + entry = iter->second ; + } + else + { + readEntryFromHeaderImmediately(idx, entry) ; + } + if(entry.mImageSize <= entry.mBodySize)//it happens on 64-bit systems, do not know why + { + llwarns << "corrupted entry: " << id << " entry image size: " << entry.mImageSize << " entry body size: " << entry.mBodySize << llendl ; + + //erase this entry and the cached texture from the cache. + std::string tex_filename = getTextureFileName(id); + removeEntry(idx, entry, tex_filename) ; + mUpdatedEntryMap.erase(idx) ; + idx = -1 ; + } } return idx; } -void LLTextureCache::writeEntryAndClose(S32 idx, Entry& entry) +//mHeaderMutex is locked before calling this. +void LLTextureCache::writeEntryToHeaderImmediately(S32 idx, Entry& entry, bool write_header) +{ + LLAPRFile* aprfile ; + S32 bytes_written ; + S32 offset = sizeof(EntriesInfo) + idx * sizeof(Entry); + if(write_header) + { + aprfile = openHeaderEntriesFile(false, 0); + bytes_written = aprfile->write((U8*)&mHeaderEntriesInfo, sizeof(EntriesInfo)) ; + llassert_always(bytes_written == sizeof(EntriesInfo)); + mHeaderAPRFile->seek(APR_SET, offset); + } + else + { + aprfile = openHeaderEntriesFile(false, offset); + } + bytes_written = aprfile->write((void*)&entry, (S32)sizeof(Entry)); + llassert_always(bytes_written == sizeof(Entry)); + closeHeaderEntriesFile(); + mUpdatedEntryMap.erase(idx) ; +} + +//mHeaderMutex is locked before calling this. +void LLTextureCache::readEntryFromHeaderImmediately(S32 idx, Entry& entry) +{ + S32 offset = sizeof(EntriesInfo) + idx * sizeof(Entry); + LLAPRFile* aprfile = openHeaderEntriesFile(true, offset); + S32 bytes_read = aprfile->read((void*)&entry, (S32)sizeof(Entry)); + llassert_always(bytes_read == sizeof(Entry)); + closeHeaderEntriesFile(); +} + +//mHeaderMutex is locked before calling this. +//update an existing entry time stamp, delay writing. +void LLTextureCache::updateEntryTimeStamp(S32 idx, Entry& entry) { + static const U32 MAX_ENTRIES_WITHOUT_TIME_STAMP = (U32)(LLTextureCache::sCacheMaxEntries * 0.75f) ; + + if(mHeaderEntriesInfo.mEntries < MAX_ENTRIES_WITHOUT_TIME_STAMP) + { + return ; //there are enough empty entry index space, no need to stamp time. + } + if (idx >= 0) { if (!mReadOnly) { - entry.mTime = time(NULL); - llassert_always(entry.mImageSize == 0 || entry.mImageSize == -1 || entry.mImageSize > entry.mBodySize); - if (entry.mBodySize > 0) - { - mTexturesSizeMap[entry.mID] = entry.mBodySize; - } -// llinfos << "Updating TE: " << idx << ": " << id << " Size: " << entry.mBodySize << " Time: " << entry.mTime << llendl; - S32 offset = sizeof(EntriesInfo) + idx * sizeof(Entry); - LLAPRFile* aprfile = openHeaderEntriesFile(false, offset); - S32 bytes_written = aprfile->write((void*)&entry, (S32)sizeof(Entry)); - llassert_always(bytes_written == sizeof(Entry)); - mHeaderEntriesMaxWriteIdx = llmax(mHeaderEntriesMaxWriteIdx, idx); - closeHeaderEntriesFile(); + entry.mTime = time(NULL); + mUpdatedEntryMap[idx] = entry ; + } + } +} + +//update an existing entry, write to header file immediately. +bool LLTextureCache::updateEntry(S32 idx, Entry& entry, S32 new_image_size, S32 new_data_size) +{ + S32 new_body_size = llmax(0, new_data_size - TEXTURE_CACHE_ENTRY_SIZE) ; + + if(new_image_size == entry.mImageSize && new_body_size == entry.mBodySize) + { + return true ; //nothing changed. + } + else + { + bool purge = false ; + + lockHeaders() ; + + bool update_header = false ; + if(entry.mImageSize < 0) //is a brand-new entry + { + mHeaderIDMap[entry.mID] = idx; + mTexturesSizeMap[entry.mID] = new_body_size ; + mTexturesSizeTotal += new_body_size ; + + // Update Header + update_header = true ; + } + else if (entry.mBodySize != new_body_size) + { + //already in mHeaderIDMap. + mTexturesSizeMap[entry.mID] = new_body_size ; + mTexturesSizeTotal -= entry.mBodySize ; + mTexturesSizeTotal += new_body_size ; + } + entry.mTime = time(NULL); + entry.mImageSize = new_image_size ; + entry.mBodySize = new_body_size ; + + writeEntryToHeaderImmediately(idx, entry, update_header) ; + + if (mTexturesSizeTotal > sCacheMaxTexturesSize) + { + purge = true; + } + + unlockHeaders() ; + + if (purge) + { + mDoPurge = TRUE; } } + + return false ; } U32 LLTextureCache::openAndReadEntries(std::vector<Entry>& entries) @@ -1138,7 +1230,17 @@ U32 LLTextureCache::openAndReadEntries(std::vector<Entry>& entries) mFreeList.clear(); mTexturesSizeTotal = 0; - LLAPRFile* aprfile = openHeaderEntriesFile(false, (S32)sizeof(EntriesInfo)); + LLAPRFile* aprfile = NULL; + if(mUpdatedEntryMap.empty()) + { + aprfile = openHeaderEntriesFile(true, (S32)sizeof(EntriesInfo)); + } + else //update the header file first. + { + aprfile = openHeaderEntriesFile(false, 0); + updatedHeaderEntriesFile() ; + aprfile->seek(APR_SET, (S32)sizeof(EntriesInfo)); + } for (U32 idx=0; idx<num_entries; idx++) { Entry entry; @@ -1152,19 +1254,15 @@ U32 LLTextureCache::openAndReadEntries(std::vector<Entry>& entries) } entries.push_back(entry); // llinfos << "ENTRY: " << entry.mTime << " TEX: " << entry.mID << " IDX: " << idx << " Size: " << entry.mImageSize << llendl; - if (entry.mImageSize < 0) + if(entry.mImageSize > entry.mBodySize) { - mFreeList.insert(idx); + mHeaderIDMap[entry.mID] = idx; + mTexturesSizeMap[entry.mID] = entry.mBodySize; + mTexturesSizeTotal += entry.mBodySize; } else { - mHeaderIDMap[entry.mID] = idx; - if (entry.mBodySize > 0) - { - mTexturesSizeMap[entry.mID] = entry.mBodySize; - mTexturesSizeTotal += entry.mBodySize; - } - llassert_always(entry.mImageSize == 0 || entry.mImageSize > entry.mBodySize); + mFreeList.insert(idx); } } closeHeaderEntriesFile(); @@ -1184,11 +1282,51 @@ void LLTextureCache::writeEntriesAndClose(const std::vector<Entry>& entries) S32 bytes_written = aprfile->write((void*)(&entries[idx]), (S32)sizeof(Entry)); llassert_always(bytes_written == sizeof(Entry)); } - mHeaderEntriesMaxWriteIdx = llmax(mHeaderEntriesMaxWriteIdx, num_entries-1); closeHeaderEntriesFile(); } } +void LLTextureCache::writeUpdatedEntries() +{ + lockHeaders() ; + if (!mReadOnly && !mUpdatedEntryMap.empty()) + { + openHeaderEntriesFile(false, 0); + updatedHeaderEntriesFile() ; + closeHeaderEntriesFile(); + } + unlockHeaders() ; +} + +//mHeaderMutex is locked and mHeaderAPRFile is created before calling this. +void LLTextureCache::updatedHeaderEntriesFile() +{ + if (!mReadOnly && !mUpdatedEntryMap.empty() && mHeaderAPRFile) + { + //entriesInfo + mHeaderAPRFile->seek(APR_SET, 0); + S32 bytes_written = mHeaderAPRFile->write((U8*)&mHeaderEntriesInfo, sizeof(EntriesInfo)) ; + llassert_always(bytes_written == sizeof(EntriesInfo)); + + //write each updated entry + S32 entry_size = (S32)sizeof(Entry) ; + S32 prev_idx = -1 ; + S32 delta_idx ; + for (idx_entry_map_t::iterator iter = mUpdatedEntryMap.begin(); iter != mUpdatedEntryMap.end(); ++iter) + { + delta_idx = iter->first - prev_idx - 1; + prev_idx = iter->first ; + if(delta_idx) + { + mHeaderAPRFile->seek(APR_CUR, delta_idx * entry_size); + } + + bytes_written = mHeaderAPRFile->write((void*)(&iter->second), entry_size); + llassert_always(bytes_written == entry_size); + } + mUpdatedEntryMap.clear() ; + } +} //---------------------------------------------------------------------------- // Called from either the main thread or the worker thread @@ -1216,12 +1354,11 @@ void LLTextureCache::readHeaderCache() U32 empty_entries = 0; typedef std::pair<U32, S32> lru_data_t; std::set<lru_data_t> lru; - std::set<LLUUID> purge_list; + std::set<U32> purge_list; for (U32 i=0; i<num_entries; i++) { Entry& entry = entries[i]; - const LLUUID& id = entry.mID; - if (entry.mImageSize < 0) + if (entry.mImageSize <= 0) { // This will be in the Free List, don't put it in the LRU ++empty_entries; @@ -1234,9 +1371,8 @@ void LLTextureCache::readHeaderCache() if (entry.mBodySize > entry.mImageSize) { // Shouldn't happen, failsafe only - llwarns << "Bad entry: " << i << ": " << id << ": BodySize: " << entry.mBodySize << llendl; - purge_list.insert(entry.mID); - entry.mImageSize = -1; // empty/available + llwarns << "Bad entry: " << i << ": " << entry.mID << ": BodySize: " << entry.mBodySize << llendl; + purge_list.insert(i); } } } @@ -1251,14 +1387,9 @@ void LLTextureCache::readHeaderCache() { for (std::set<lru_data_t>::iterator iter = lru.begin(); iter != lru.end(); ++iter) { - S32 idx = iter->second; - if (entries[idx].mImageSize >= 0) - { - purge_list.insert(entries[idx].mID); - entries[idx].mImageSize = -1; - if (purge_list.size() >= entries_to_purge) - break; - } + purge_list.insert(iter->second); + if (purge_list.size() >= entries_to_purge) + break; } } llassert_always(purge_list.size() >= entries_to_purge); @@ -1268,9 +1399,7 @@ void LLTextureCache::readHeaderCache() S32 lru_entries = (S32)((F32)sCacheMaxEntries * TEXTURE_CACHE_LRU_SIZE); for (std::set<lru_data_t>::iterator iter = lru.begin(); iter != lru.end(); ++iter) { - S32 idx = iter->second; - const LLUUID& id = entries[idx].mID; - mLRU.insert(id); + mLRU.insert(entries[iter->second].mID); // llinfos << "LRU: " << iter->first << " : " << iter->second << llendl; if (--lru_entries <= 0) break; @@ -1279,12 +1408,10 @@ void LLTextureCache::readHeaderCache() if (purge_list.size() > 0) { - for (std::set<LLUUID>::iterator iter = purge_list.begin(); iter != purge_list.end(); ++iter) + for (std::set<U32>::iterator iter = purge_list.begin(); iter != purge_list.end(); ++iter) { - const LLUUID& id = *iter; - bool res = removeHeaderCacheEntry(id); // sets entry size on disk to -1 - llassert_always(res); - LLAPRFile::remove(getTextureFileName(id), getLocalAPRFilePool()); + std::string tex_filename = getTextureFileName(entries[*iter].mID); + removeEntry((S32)*iter, entries[*iter], tex_filename); } // If we removed any entries, we need to rebuild the entries list, // write the header, and call this again @@ -1292,13 +1419,14 @@ void LLTextureCache::readHeaderCache() for (U32 i=0; i<num_entries; i++) { const Entry& entry = entries[i]; - if (entry.mImageSize >=0) + if (entry.mImageSize > 0) { new_entries.push_back(entry); } } llassert_always(new_entries.size() <= sCacheMaxEntries); mHeaderEntriesInfo.mEntries = new_entries.size(); + writeEntriesHeader(); writeEntriesAndClose(new_entries); mHeaderMutex.unlock(); // unlock the mutex before calling again readHeaderCache(); // repeat with new entries file @@ -1306,7 +1434,7 @@ void LLTextureCache::readHeaderCache() } else { - writeEntriesAndClose(entries); + //entries are not changed, nothing here. } } } @@ -1334,8 +1462,9 @@ void LLTextureCache::purgeAllTextures(bool purge_directories) } if (purge_directories) { + gDirUtilp->deleteFilesInDir(mTexturesDirName, mask); LLFile::rmdir(mTexturesDirName); - } + } } mHeaderIDMap.clear(); mTexturesSizeMap.clear(); @@ -1371,7 +1500,6 @@ void LLTextureCache::purgeTextures(bool validate) U32 num_entries = openAndReadEntries(entries); if (!num_entries) { - writeEntriesAndClose(entries); return; // nothing to purge } @@ -1390,6 +1518,10 @@ void LLTextureCache::purgeTextures(bool validate) time_idx_set.insert(std::make_pair(entries[idx].mTime, idx)); // llinfos << "TIME: " << entries[idx].mTime << " TEX: " << entries[idx].mID << " IDX: " << idx << " Size: " << entries[idx].mImageSize << llendl; } + else + { + llerrs << "mTexturesSizeMap / mHeaderIDMap corrupted." << llendl ; + } } } @@ -1441,11 +1573,8 @@ void LLTextureCache::purgeTextures(bool validate) { purge_count++; LL_DEBUGS("TextureCache") << "PURGING: " << filename << LL_ENDL; - LLAPRFile::remove(filename, getLocalAPRFilePool()); + removeEntry(idx, entries[idx], filename) ; cache_size -= entries[idx].mBodySize; - mTexturesSizeTotal -= entries[idx].mBodySize; - entries[idx].mBodySize = 0; - mTexturesSizeMap.erase(entries[idx].mID); } } @@ -1492,40 +1621,37 @@ LLTextureCacheWorker* LLTextureCache::getWriter(handle_t handle) // Called from work thread // Reads imagesize from the header, updates timestamp -S32 LLTextureCache::getHeaderCacheEntry(const LLUUID& id, S32& imagesize) +S32 LLTextureCache::getHeaderCacheEntry(const LLUUID& id, Entry& entry) { - LLMutexLock lock(&mHeaderMutex); - Entry entry; + LLMutexLock lock(&mHeaderMutex); S32 idx = openAndReadEntry(id, entry, false); if (idx >= 0) - { - imagesize = entry.mImageSize; - writeEntryAndClose(idx, entry); // updates time + { + updateEntryTimeStamp(idx, entry); // updates time } return idx; } // Writes imagesize to the header, updates timestamp -S32 LLTextureCache::setHeaderCacheEntry(const LLUUID& id, S32 imagesize) +S32 LLTextureCache::setHeaderCacheEntry(const LLUUID& id, Entry& entry, S32 imagesize, S32 datasize) { mHeaderMutex.lock(); - llassert_always(imagesize >= 0); - Entry entry; S32 idx = openAndReadEntry(id, entry, true); + mHeaderMutex.unlock(); + if (idx >= 0) { - entry.mImageSize = imagesize; - writeEntryAndClose(idx, entry); - mHeaderMutex.unlock(); + updateEntry(idx, entry, imagesize, datasize); } else // retry { - mHeaderMutex.unlock(); readHeaderCache(); // We couldn't write an entry, so refresh the LRU + mHeaderMutex.lock(); llassert_always(!mLRU.empty() || mHeaderEntriesInfo.mEntries < sCacheMaxEntries); mHeaderMutex.unlock(); - idx = setHeaderCacheEntry(id, imagesize); // assert above ensures no inf. recursion + + idx = setHeaderCacheEntry(id, entry, imagesize, datasize); // assert above ensures no inf. recursion } return idx; } @@ -1573,6 +1699,11 @@ bool LLTextureCache::readComplete(handle_t handle, bool abort) { worker = iter->second; complete = worker->complete(); + + if(!complete && abort) + { + abortRequest(handle, true) ; + } } if (worker && (complete || abort)) { @@ -1649,34 +1780,56 @@ void LLTextureCache::addCompleted(Responder* responder, bool success) ////////////////////////////////////////////////////////////////////////////// -// Called from MAIN thread (endWork()) -// Ensure that mHeaderMutex is locked first! -bool LLTextureCache::removeHeaderCacheEntry(const LLUUID& id) +//called after mHeaderMutex is locked. +void LLTextureCache::removeCachedTexture(const LLUUID& id) { - Entry entry; - S32 idx = openAndReadEntry(id, entry, false); - if (idx >= 0) + if(mTexturesSizeMap.find(id) != mTexturesSizeMap.end()) + { + mTexturesSizeTotal -= mTexturesSizeMap[id] ; + mTexturesSizeMap.erase(id); + } + mHeaderIDMap.erase(id); + LLAPRFile::remove(getTextureFileName(id), getLocalAPRFilePool()); +} + +//called after mHeaderMutex is locked. +void LLTextureCache::removeEntry(S32 idx, Entry& entry, std::string& filename) +{ + if(idx >= 0) //valid entry { entry.mImageSize = -1; entry.mBodySize = 0; - writeEntryAndClose(idx, entry); - mFreeList.insert(idx); - mHeaderIDMap.erase(id); - mTexturesSizeMap.erase(id); - return true; + mHeaderIDMap.erase(entry.mID); + mTexturesSizeMap.erase(entry.mID); + + mTexturesSizeTotal -= entry.mBodySize; + mFreeList.insert(idx); } - return false; + + LLAPRFile::remove(filename, getLocalAPRFilePool()); } -void LLTextureCache::removeFromCache(const LLUUID& id) +bool LLTextureCache::removeFromCache(const LLUUID& id) { //llwarns << "Removing texture from cache: " << id << llendl; + bool ret = false ; if (!mReadOnly) { - LLMutexLock lock(&mHeaderMutex); - removeHeaderCacheEntry(id); - LLAPRFile::remove(getTextureFileName(id), getLocalAPRFilePool()); + lockHeaders() ; + + Entry entry; + S32 idx = openAndReadEntry(id, entry, false); + std::string tex_filename = getTextureFileName(id); + removeEntry(idx, entry, tex_filename) ; + if (idx >= 0) + { + writeEntryToHeaderImmediately(idx, entry); + ret = true; + } + + unlockHeaders() ; } + return ret ; } ////////////////////////////////////////////////////////////////////////////// diff --git a/indra/newview/lltexturecache.h b/indra/newview/lltexturecache.h index 64ec881fc3..0fceee3011 100644 --- a/indra/newview/lltexturecache.h +++ b/indra/newview/lltexturecache.h @@ -68,6 +68,7 @@ private: Entry(const LLUUID& id, S32 imagesize, S32 bodysize, U32 time) : mID(id), mImageSize(imagesize), mBodySize(bodysize), mTime(time) {} void init(const LLUUID& id, U32 time) { mID = id, mImageSize = 0; mBodySize = 0; mTime = time; } + Entry& operator=(const Entry& entry) {mID = entry.mID, mImageSize = entry.mImageSize; mBodySize = entry.mBodySize; mTime = entry.mTime; return *this;} LLUUID mID; // 16 bytes S32 mImageSize; // total size of image if known S32 mBodySize; // size of body file in body cache @@ -109,7 +110,8 @@ public: /*virtual*/ S32 update(U32 max_time_ms); void purgeCache(ELLPath location); - S64 initCache(ELLPath location, S64 maxsize, BOOL read_only); + void setReadOnly(BOOL read_only) ; + S64 initCache(ELLPath location, S64 maxsize, BOOL disable_texture_cache); handle_t readFromCache(const std::string& local_filename, const LLUUID& id, U32 priority, S32 offset, S32 size, ReadResponder* responder); @@ -122,7 +124,7 @@ public: bool writeComplete(handle_t handle, bool abort = false); void prioritizeWrite(handle_t handle); - void removeFromCache(const LLUUID& id); + bool removeFromCache(const LLUUID& id); // For LLTextureCacheWorker::Responder LLTextureCacheWorker* getReader(handle_t handle); @@ -142,7 +144,6 @@ public: protected: // Accessed by LLTextureCacheWorker - bool updateTextureEntryList(const LLUUID& id, S32 size); std::string getLocalFileName(const LLUUID& id); std::string getTextureFileName(const LLUUID& id); void addCompleted(Responder* responder, bool success); @@ -160,12 +161,18 @@ private: void readEntriesHeader(); void writeEntriesHeader(); S32 openAndReadEntry(const LLUUID& id, Entry& entry, bool create); - void writeEntryAndClose(S32 idx, Entry& entry); + bool updateEntry(S32 idx, Entry& entry, S32 new_image_size, S32 new_body_size); + void updateEntryTimeStamp(S32 idx, Entry& entry) ; U32 openAndReadEntries(std::vector<Entry>& entries); void writeEntriesAndClose(const std::vector<Entry>& entries); - S32 getHeaderCacheEntry(const LLUUID& id, S32& imagesize); - S32 setHeaderCacheEntry(const LLUUID& id, S32 imagesize); - bool removeHeaderCacheEntry(const LLUUID& id); + void readEntryFromHeaderImmediately(S32 idx, Entry& entry) ; + void writeEntryToHeaderImmediately(S32 idx, Entry& entry, bool write_header = false) ; + void removeEntry(S32 idx, Entry& entry, std::string& filename); + void removeCachedTexture(const LLUUID& id) ; + S32 getHeaderCacheEntry(const LLUUID& id, Entry& entry); + S32 setHeaderCacheEntry(const LLUUID& id, Entry& entry, S32 imagesize, S32 datasize); + void writeUpdatedEntries() ; + void updatedHeaderEntriesFile() ; void lockHeaders() { mHeaderMutex.lock(); } void unlockHeaders() { mHeaderMutex.unlock(); } @@ -204,6 +211,9 @@ private: S64 mTexturesSizeTotal; LLAtomic32<BOOL> mDoPurge; + typedef std::map<S32, Entry> idx_entry_map_t; + idx_entry_map_t mUpdatedEntryMap; + // Statics static F32 sHeaderCacheVersion; static U32 sCacheMaxEntries; diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp index 2b846d33fc..a1ab051021 100644 --- a/indra/newview/lltexturectrl.cpp +++ b/indra/newview/lltexturectrl.cpp @@ -48,6 +48,7 @@ #include "llfoldervieweventlistener.h" #include "llinventory.h" #include "llinventoryfunctions.h" +#include "llinventorymodelbackgroundfetch.h" #include "llinventoryobserver.h" #include "llinventorypanel.h" #include "llfloaterinventory.h" @@ -1053,7 +1054,7 @@ public: { // We need to find textures in all folders, so get the main // background download going. - gInventory.startBackgroundFetch(); + LLInventoryModelBackgroundFetch::instance().start(); gInventory.removeObserver(this); delete this; } @@ -1074,9 +1075,9 @@ BOOL LLTextureCtrl::handleMouseDown(S32 x, S32 y, MASK mask) { showPicker(FALSE); //grab textures first... - gInventory.startBackgroundFetch(gInventory.findCategoryUUIDForType(LLFolderType::FT_TEXTURE)); + LLInventoryModelBackgroundFetch::instance().start(gInventory.findCategoryUUIDForType(LLFolderType::FT_TEXTURE)); //...then start full inventory fetch. - gInventory.startBackgroundFetch(); + LLInventoryModelBackgroundFetch::instance().start(); handled = TRUE; } @@ -1136,6 +1137,20 @@ void LLTextureCtrl::onFloaterCommit(ETexturePickOp op) } } +void LLTextureCtrl::setImageAssetName(const std::string& name) +{ + LLPointer<LLUIImage> imagep = LLUI::getUIImage(name); + if(imagep) + { + LLViewerFetchedTexture* pTexture = dynamic_cast<LLViewerFetchedTexture*>(imagep->getImage().get()); + if(pTexture) + { + LLUUID id = pTexture->getID(); + setImageAssetID(id); + } + } +} + void LLTextureCtrl::setImageAssetID( const LLUUID& asset_id ) { if( mImageAssetID != asset_id ) @@ -1247,25 +1262,52 @@ void LLTextureCtrl::draw() mTentativeLabel->setVisible( !mTexturep.isNull() && getTentative() ); - // Show "Loading..." string on the top left corner while this texture is loading. // Using the discard level, do not show the string if the texture is almost but not // fully loaded. - if ( mTexturep.notNull() && - (!mTexturep->isFullyLoaded()) && - (mShowLoadingPlaceholder == TRUE) && - (mTexturep->getDiscardLevel() != 1) && - (mTexturep->getDiscardLevel() != 0)) + if (mTexturep.notNull() && + (!mTexturep->isFullyLoaded()) && + (mShowLoadingPlaceholder == TRUE)) { + U32 v_offset = 25; LLFontGL* font = LLFontGL::getFontSansSerif(); - font->renderUTF8( - mLoadingPlaceholderString, 0, - llfloor(interior.mLeft+3), - llfloor(interior.mTop-25), - LLColor4::white, - LLFontGL::LEFT, - LLFontGL::BASELINE, - LLFontGL::DROP_SHADOW); + + // Don't show as loaded if the texture is almost fully loaded (i.e. discard1) unless god + if ((mTexturep->getDiscardLevel() > 1) || gAgent.isGodlike()) + { + font->renderUTF8( + mLoadingPlaceholderString, + 0, + llfloor(interior.mLeft+3), + llfloor(interior.mTop-v_offset), + LLColor4::white, + LLFontGL::LEFT, + LLFontGL::BASELINE, + LLFontGL::DROP_SHADOW); + } + + // Optionally show more detailed information. + if (gSavedSettings.getBOOL("DebugAvatarRezTime")) + { + LLFontGL* font = LLFontGL::getFontSansSerif(); + std::string tdesc; + // Show what % the texture has loaded (0 to 100%, 100 is highest), and what level of detail (5 to 0, 0 is best). + + v_offset += 12; + tdesc = llformat(" PK : %d%%", U32(mTexturep->getDownloadProgress()*100.0)); + font->renderUTF8(tdesc, 0, llfloor(interior.mLeft+3), llfloor(interior.mTop-v_offset), + LLColor4::white, LLFontGL::LEFT, LLFontGL::BASELINE, LLFontGL::DROP_SHADOW); + + v_offset += 12; + tdesc = llformat(" LVL: %d", mTexturep->getDiscardLevel()); + font->renderUTF8(tdesc, 0, llfloor(interior.mLeft+3), llfloor(interior.mTop-v_offset), + LLColor4::white, LLFontGL::LEFT, LLFontGL::BASELINE, LLFontGL::DROP_SHADOW); + + v_offset += 12; + tdesc = llformat(" ID : %s...", (mImageAssetID.asString().substr(0,7)).c_str()); + font->renderUTF8(tdesc, 0, llfloor(interior.mLeft+3), llfloor(interior.mTop-v_offset), + LLColor4::white, LLFontGL::LEFT, LLFontGL::BASELINE, LLFontGL::DROP_SHADOW); + } } LLUICtrl::draw(); diff --git a/indra/newview/lltexturectrl.h b/indra/newview/lltexturectrl.h index 8ca92c3d87..bcd0a083f2 100644 --- a/indra/newview/lltexturectrl.h +++ b/indra/newview/lltexturectrl.h @@ -128,7 +128,7 @@ public: virtual void clear(); // Takes a UUID, wraps get/setImageAssetID - virtual void setValue(const LLSD& value ); + virtual void setValue(const LLSD& value); virtual LLSD getValue() const; // LLTextureCtrl interface @@ -142,6 +142,8 @@ public: const LLUUID& getImageItemID() { return mImageItemID; } + virtual void setImageAssetName(const std::string& name); + void setImageAssetID(const LLUUID &image_asset_id); const LLUUID& getImageAssetID() const { return mImageAssetID; } @@ -183,6 +185,8 @@ public: void setShowLoadingPlaceholder(BOOL showLoadingPlaceholder); + LLViewerFetchedTexture* getTexture() { return mTexturep; } + private: BOOL allowDrop(LLInventoryItem* item); BOOL doDrop(LLInventoryItem* item); diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp index 404b79bfaf..ceed90e210 100644 --- a/indra/newview/lltexturefetch.cpp +++ b/indra/newview/lltexturefetch.cpp @@ -73,13 +73,11 @@ private: } virtual void completed(bool success) { - mFetcher->lockQueue(); LLTextureFetchWorker* worker = mFetcher->getWorker(mID); if (worker) { worker->callbackCacheRead(success, mFormattedImage, mImageSize, mImageLocal); } - mFetcher->unlockQueue(); } private: LLTextureFetch* mFetcher; @@ -95,13 +93,11 @@ private: } virtual void completed(bool success) { - mFetcher->lockQueue(); LLTextureFetchWorker* worker = mFetcher->getWorker(mID); if (worker) { worker->callbackCacheWrite(success); } - mFetcher->unlockQueue(); } private: LLTextureFetch* mFetcher; @@ -117,13 +113,11 @@ private: } virtual void completed(bool success, LLImageRaw* raw, LLImageRaw* aux) { - mFetcher->lockQueue(); LLTextureFetchWorker* worker = mFetcher->getWorker(mID); if (worker) { worker->callbackDecoded(success, raw, aux); } - mFetcher->unlockQueue(); } private: LLTextureFetch* mFetcher; @@ -166,13 +160,16 @@ public: void setGetStatus(U32 status, const std::string& reason) { + LLMutexLock lock(&mWorkMutex); + mGetStatus = status; mGetReason = reason; } + void setCanUseHTTP(bool can_use_http) {mCanUseHTTP = can_use_http;} + bool getCanUseHTTP()const {return mCanUseHTTP ;} + protected: - LLTextureFetchWorker(LLTextureFetch* fetcher, const LLUUID& id, const LLHost& host, - F32 priority, S32 discard, S32 size); LLTextureFetchWorker(LLTextureFetch* fetcher, const std::string& url, const LLUUID& id, const LLHost& host, F32 priority, S32 discard, S32 size); @@ -219,8 +216,15 @@ private: QUEUED = 1, SENT_SIM = 2 }; + enum e_write_to_cache_state //mWriteToCacheState + { + NOT_WRITE = 0, + CAN_WRITE = 1, + SHOULD_WRITE = 2 + }; static const char* sStateDescs[]; e_state mState; + e_write_to_cache_state mWriteToCacheState; LLTextureFetch* mFetcher; LLPointer<LLImageFormatted> mFormattedImage; LLPointer<LLImageRaw> mRawImage; @@ -246,15 +250,17 @@ private: S32 mRequestedSize; S32 mDesiredSize; S32 mFileSize; - S32 mCachedSize; - BOOL mLoaded; + S32 mCachedSize; e_request_state mSentRequest; handle_t mDecodeHandle; + BOOL mLoaded; BOOL mDecoded; BOOL mWritten; BOOL mNeedsAux; BOOL mHaveAllData; BOOL mInLocalCache; + bool mCanUseHTTP ; + bool mCanUseNET ; //can get from asset server. S32 mHTTPFailCount; S32 mRetryAttempt; S32 mActiveCount; @@ -296,7 +302,10 @@ public: const LLChannelDescriptors& channels, const LLIOPipe::buffer_ptr_t& buffer) { - if ((gSavedSettings.getBOOL("LogTextureDownloadsToViewerLog")) || (gSavedSettings.getBOOL("LogTextureDownloadsToSimulator"))) + static LLCachedControl<bool> log_to_viewer_log(gSavedSettings,"LogTextureDownloadsToViewerLog"); + static LLCachedControl<bool> log_to_sim(gSavedSettings,"LogTextureDownloadsToSimulator"); + + if (log_to_viewer_log || log_to_sim) { mFetcher->mTextureInfo.setRequestStartTime(mID, mStartTime); U64 timeNow = LLTimer::getTotalTime(); @@ -307,7 +316,6 @@ public: } lldebugs << "HTTP COMPLETE: " << mID << llendl; - mFetcher->lockQueue(); LLTextureFetchWorker* worker = mFetcher->getWorker(mID); if (worker) { @@ -321,11 +329,7 @@ public: partial = true; } } - else - { - worker->setGetStatus(status, reason); -// llwarns << status << ": " << reason << llendl; - } + if (!success) { worker->setGetStatus(status, reason); @@ -339,7 +343,6 @@ public: mFetcher->removeFromHTTPQueue(mID); llwarns << "Worker not found: " << mID << llendl; } - mFetcher->unlockQueue(); } private: @@ -380,6 +383,7 @@ LLTextureFetchWorker::LLTextureFetchWorker(LLTextureFetch* fetcher, S32 size) // Desired size : LLWorkerClass(fetcher, "TextureFetch"), mState(INIT), + mWriteToCacheState(NOT_WRITE), mFetcher(fetcher), mID(id), mHost(host), @@ -408,6 +412,7 @@ LLTextureFetchWorker::LLTextureFetchWorker(LLTextureFetch* fetcher, mNeedsAux(FALSE), mHaveAllData(FALSE), mInLocalCache(FALSE), + mCanUseHTTP(true), mHTTPFailCount(0), mRetryAttempt(0), mActiveCount(0), @@ -418,6 +423,8 @@ LLTextureFetchWorker::LLTextureFetchWorker(LLTextureFetch* fetcher, mTotalPackets(0), mImageCodec(IMG_CODEC_INVALID) { + mCanUseNET = mUrl.empty() ; + calcWorkPriority(); mType = host.isOk() ? LLImageBase::TYPE_AVATAR_BAKE : LLImageBase::TYPE_NORMAL; // llinfos << "Create: " << mID << " mHost:" << host << " Discard=" << discard << llendl; @@ -437,11 +444,11 @@ LLTextureFetchWorker::~LLTextureFetchWorker() // << " Desired=" << mDesiredDiscard << llendl; llassert_always(!haveWork()); lockWorkMutex(); - if (mCacheReadHandle != LLTextureCache::nullHandle()) + if (mCacheReadHandle != LLTextureCache::nullHandle() && mFetcher->mTextureCache) { mFetcher->mTextureCache->readComplete(mCacheReadHandle, true); } - if (mCacheWriteHandle != LLTextureCache::nullHandle()) + if (mCacheWriteHandle != LLTextureCache::nullHandle() && mFetcher->mTextureCache) { mFetcher->mTextureCache->writeComplete(mCacheWriteHandle, true); } @@ -494,9 +501,10 @@ void LLTextureFetchWorker::setupPacketData() U32 LLTextureFetchWorker::calcWorkPriority() { -// llassert_always(mImagePriority >= 0 && mImagePriority <= LLViewerTexture::maxDecodePriority()); - static F32 PRIORITY_SCALE = (F32)LLWorkerThread::PRIORITY_LOWBITS / LLViewerFetchedTexture::maxDecodePriority(); - mWorkPriority = (U32)(mImagePriority * PRIORITY_SCALE); + //llassert_always(mImagePriority >= 0 && mImagePriority <= LLViewerFetchedTexture::maxDecodePriority()); + static const F32 PRIORITY_SCALE = (F32)LLWorkerThread::PRIORITY_LOWBITS / LLViewerFetchedTexture::maxDecodePriority(); + + mWorkPriority = llmin((U32)LLWorkerThread::PRIORITY_LOWBITS, (U32)(mImagePriority * PRIORITY_SCALE)); return mWorkPriority; } @@ -574,14 +582,26 @@ bool LLTextureFetchWorker::doWork(S32 param) { LLMutexLock lock(&mWorkMutex); - if ((mFetcher->isQuitting() || mImagePriority < 1.0f || getFlags(LLWorkerClass::WCF_DELETE_REQUESTED))) + if ((mFetcher->isQuitting() || getFlags(LLWorkerClass::WCF_DELETE_REQUESTED))) { - if (mState < WRITE_TO_CACHE) + if (mState < DECODE_IMAGE) { return true; // abort } } - + if(mImagePriority < 1.0f) + { + if (mState == INIT || mState == LOAD_FROM_NETWORK || mState == LOAD_FROM_SIMULATOR) + { + return true; // abort + } + } + if(mState > CACHE_POST && !mCanUseNET && !mCanUseHTTP) + { + //nowhere to get data, abort. + return true ; + } + if (mFetcher->mDebugPause) { return false; // debug: don't do any work @@ -597,7 +617,7 @@ bool LLTextureFetchWorker::doWork(S32 param) } if (mState == INIT) - { + { mRawImage = NULL ; mRequestedDiscard = -1; mLoadedDiscard = -1; @@ -636,23 +656,27 @@ bool LLTextureFetchWorker::doWork(S32 param) return false; } mFileSize = 0; - mLoaded = FALSE; - setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority); // Set priority first since Responder may change it - - CacheReadResponder* responder = new CacheReadResponder(mFetcher, mID, mFormattedImage); + mLoaded = FALSE; + if (mUrl.compare(0, 7, "file://") == 0) { + setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority); // Set priority first since Responder may change it + // read file from local disk std::string filename = mUrl.substr(7, std::string::npos); + CacheReadResponder* responder = new CacheReadResponder(mFetcher, mID, mFormattedImage); mCacheReadHandle = mFetcher->mTextureCache->readFromCache(filename, mID, cache_priority, offset, size, responder); } else if (mUrl.empty()) { + setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority); // Set priority first since Responder may change it + + CacheReadResponder* responder = new CacheReadResponder(mFetcher, mID, mFormattedImage); mCacheReadHandle = mFetcher->mTextureCache->readFromCache(mID, cache_priority, offset, size, responder); } - else + else if(mCanUseHTTP) { if (!(mUrl.compare(0, 7, "http://") == 0)) { @@ -661,8 +685,11 @@ bool LLTextureFetchWorker::doWork(S32 param) } setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority); mState = SEND_HTTP_REQ; - delete responder; - responder = NULL; + } + else + { + setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority); + mState = LOAD_FROM_NETWORK; } } @@ -696,6 +723,7 @@ bool LLTextureFetchWorker::doWork(S32 param) llassert_always(mFormattedImage->getDataSize() > 0); mLoadedDiscard = mDesiredDiscard; mState = DECODE_IMAGE; + mWriteToCacheState = NOT_WRITE ; LL_DEBUGS("Texture") << mID << ": Cached. Bytes: " << mFormattedImage->getDataSize() << " Size: " << llformat("%dx%d",mFormattedImage->getWidth(),mFormattedImage->getHeight()) << " Desired Discard: " << mDesiredDiscard << " Desired Size: " << mDesiredSize << LL_ENDL; @@ -720,10 +748,10 @@ bool LLTextureFetchWorker::doWork(S32 param) if (mState == LOAD_FROM_NETWORK) { - bool get_url = gSavedSettings.getBOOL("ImagePipelineUseHTTP"); - if (!mUrl.empty()) get_url = false; + static LLCachedControl<bool> use_http(gSavedSettings,"ImagePipelineUseHTTP"); + // if (mHost != LLHost::invalid) get_url = false; - if ( get_url ) + if ( use_http && mCanUseHTTP && mUrl.empty())//get http url. { LLViewerRegion* region = NULL; if (mHost == LLHost::invalid) @@ -733,28 +761,39 @@ bool LLTextureFetchWorker::doWork(S32 param) if (region) { - std::string http_url = region->getCapability("GetTexture"); + std::string http_url = region->getHttpUrl() ; if (!http_url.empty()) { mUrl = http_url + "/?texture_id=" + mID.asString().c_str(); + mWriteToCacheState = CAN_WRITE ; //because this texture has a fixed texture id. + } + else + { + mCanUseHTTP = false ; } } else { // This will happen if not logged in or if a region deoes not have HTTP Texture enabled //llwarns << "Region not found for host: " << mHost << llendl; + mCanUseHTTP = false; } } - if (!mUrl.empty()) + if (mCanUseHTTP && !mUrl.empty()) { mState = LLTextureFetchWorker::SEND_HTTP_REQ; setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority); + if(mWriteToCacheState != NOT_WRITE) + { + mWriteToCacheState = CAN_WRITE ; + } // don't return, fall through to next state } - else if (mSentRequest == UNSENT) + else if (mSentRequest == UNSENT && mCanUseNET) { // Add this to the network queue and sit here. // LLTextureFetch::update() will send off a request which will change our state + mWriteToCacheState = CAN_WRITE ; mRequestedSize = mDesiredSize; mRequestedDiscard = mDesiredDiscard; mSentRequest = QUEUED; @@ -791,6 +830,7 @@ bool LLTextureFetchWorker::doWork(S32 param) } setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority); mState = DECODE_IMAGE; + mWriteToCacheState = SHOULD_WRITE ; } else { @@ -802,6 +842,7 @@ bool LLTextureFetchWorker::doWork(S32 param) if (mState == SEND_HTTP_REQ) { + if(mCanUseHTTP) { const S32 HTTP_QUEUE_MAX_SIZE = 8; // *TODO: Integrate this with llviewerthrottle @@ -867,6 +908,10 @@ bool LLTextureFetchWorker::doWork(S32 param) } // fall through } + else //can not use http fetch. + { + return true ; //abort + } } if (mState == WAIT_HTTP_REQ) @@ -880,7 +925,16 @@ bool LLTextureFetchWorker::doWork(S32 param) if (mGetStatus == HTTP_NOT_FOUND) { mHTTPFailCount = max_attempts = 1; // Don't retry - llinfos << "Texture missing from server (404): " << mUrl << llendl; + llwarns << "Texture missing from server (404): " << mUrl << llendl; + + //roll back to try UDP + if(mCanUseNET) + { + mState = INIT ; + mCanUseHTTP = false ; + setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority); + return false ; + } } else if (mGetStatus == HTTP_SERVICE_UNAVAILABLE) { @@ -891,6 +945,17 @@ bool LLTextureFetchWorker::doWork(S32 param) max_attempts = mHTTPFailCount+1; // Keep retrying LL_INFOS_ONCE("Texture") << "Texture server busy (503): " << mUrl << LL_ENDL; } + else if(mGetStatus >= HTTP_MULTIPLE_CHOICES && mGetStatus < HTTP_BAD_REQUEST) //http re-direct + { + ++mHTTPFailCount; + max_attempts = 5 ; //try at most 5 times to avoid infinite redirection loop. + + llwarns << "HTTP GET failed because of redirection: " << mUrl + << " Status: " << mGetStatus << " Reason: '" << mGetReason << llendl ; + + //assign to the new url + mUrl = mGetReason ; + } else { const S32 HTTP_MAX_RETRY_COUNT = 3; @@ -900,6 +965,7 @@ bool LLTextureFetchWorker::doWork(S32 param) << " Status: " << mGetStatus << " Reason: '" << mGetReason << "'" << " Attempt:" << mHTTPFailCount+1 << "/" << max_attempts << llendl; } + if (mHTTPFailCount >= max_attempts) { if (cur_size > 0) @@ -934,10 +1000,15 @@ bool LLTextureFetchWorker::doWork(S32 param) } llassert_always(mBufferSize == cur_size + mRequestedSize); - if (mHaveAllData) + if (mHaveAllData && mRequestedDiscard == 0) //the image file is fully loaded. { mFileSize = mBufferSize; } + else //the file size is unknown. + { + mFileSize = mBufferSize + 1 ; //flag the file is not fully loaded. + } + U8* buffer = new U8[mBufferSize]; if (cur_size > 0) { @@ -952,6 +1023,10 @@ bool LLTextureFetchWorker::doWork(S32 param) mBufferSize = 0; mLoadedDiscard = mRequestedDiscard; mState = DECODE_IMAGE; + if(mWriteToCacheState != NOT_WRITE) + { + mWriteToCacheState = SHOULD_WRITE ; + } setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority); return false; } @@ -987,7 +1062,12 @@ bool LLTextureFetchWorker::doWork(S32 param) } if (mLoadedDiscard < 0) { - llerrs << "Decode entered with invalid mLoadedDiscard. ID = " << mID << llendl; + //llerrs << "Decode entered with invalid mLoadedDiscard. ID = " << mID << llendl; + + //abort, don't decode + mState = DONE; + setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority); + return true; } setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority); // Set priority first since Responder may change it mRawImage = NULL; @@ -1046,7 +1126,7 @@ bool LLTextureFetchWorker::doWork(S32 param) if (mState == WRITE_TO_CACHE) { - if (mInLocalCache || mSentRequest == UNSENT || mFormattedImage.isNull()) + if (mWriteToCacheState != SHOULD_WRITE || mFormattedImage.isNull()) { // If we're in a local cache or we didn't actually receive any new data, // or we failed to load anything, skip @@ -1054,6 +1134,17 @@ bool LLTextureFetchWorker::doWork(S32 param) return false; } S32 datasize = mFormattedImage->getDataSize(); + if(mFileSize < datasize)//This could happen when http fetching and sim fetching mixed. + { + if(mHaveAllData) + { + mFileSize = datasize ; + } + else + { + mFileSize = datasize + 1 ; //flag not fully loaded. + } + } llassert_always(datasize); setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority); // Set priority first since Responder may change it U32 cache_priority = mWorkPriority; @@ -1429,23 +1520,22 @@ LLTextureFetch::LLTextureFetch(LLTextureCache* cache, LLImageDecodeThread* image LLTextureFetch::~LLTextureFetch() { + clearDeleteList() ; + // ~LLQueuedThread() called here } bool LLTextureFetch::createRequest(const std::string& url, const LLUUID& id, const LLHost& host, F32 priority, - S32 w, S32 h, S32 c, S32 desired_discard, bool needs_aux) + S32 w, S32 h, S32 c, S32 desired_discard, bool needs_aux, bool can_use_http) { if (mDebugPause) { return false; } - LLTextureFetchWorker* worker = NULL; - LLMutexLock lock(&mQueueMutex); - map_t::iterator iter = mRequestMap.find(id); - if (iter != mRequestMap.end()) + LLTextureFetchWorker* worker = getWorker(id) ; + if (worker) { - worker = iter->second; if (worker->mHost != host) { llwarns << "LLTextureFetch::createRequest " << id << " called with multiple hosts: " @@ -1494,41 +1584,50 @@ bool LLTextureFetch::createRequest(const std::string& url, const LLUUID& id, con return false; // need to wait for previous aborted request to complete } worker->lockWorkMutex(); + worker->mActiveCount++; + worker->mNeedsAux = needs_aux; worker->setImagePriority(priority); worker->setDesiredDiscard(desired_discard, desired_size); - worker->unlockWorkMutex(); + worker->setCanUseHTTP(can_use_http) ; if (!worker->haveWork()) { worker->mState = LLTextureFetchWorker::INIT; + worker->unlockWorkMutex(); + worker->addWork(0, LLWorkerThread::PRIORITY_HIGH | worker->mWorkPriority); } + else + { + worker->unlockWorkMutex(); + } } else { worker = new LLTextureFetchWorker(this, url, id, host, priority, desired_discard, desired_size); + lockQueue() ; mRequestMap[id] = worker; + unlockQueue() ; + + worker->lockWorkMutex(); + worker->mActiveCount++; + worker->mNeedsAux = needs_aux; + worker->setCanUseHTTP(can_use_http) ; + worker->unlockWorkMutex(); } - worker->mActiveCount++; - worker->mNeedsAux = needs_aux; + // llinfos << "REQUESTED: " << id << " Discard: " << desired_discard << llendl; return true; } -void LLTextureFetch::deleteRequest(const LLUUID& id, bool cancel) -{ - LLMutexLock lock(&mQueueMutex); - LLTextureFetchWorker* worker = getWorker(id); - if (worker) - { - removeRequest(worker, cancel); - } -} - // protected void LLTextureFetch::addToNetworkQueue(LLTextureFetchWorker* worker) { + lockQueue() ; + bool in_request_map = (mRequestMap.find(worker->mID) != mRequestMap.end()) ; + unlockQueue() ; + LLMutexLock lock(&mNetworkQueueMutex); - if (mRequestMap.find(worker->mID) != mRequestMap.end()) + if (in_request_map) { // only add to the queue if in the request map // i.e. a delete has not been requested @@ -1564,10 +1663,34 @@ void LLTextureFetch::removeFromHTTPQueue(const LLUUID& id) mHTTPTextureQueue.erase(id); } -// call lockQueue() first! +void LLTextureFetch::deleteRequest(const LLUUID& id, bool cancel) +{ + lockQueue() ; + LLTextureFetchWorker* worker = getWorkerAfterLock(id); + if (worker) + { + size_t erased_1 = mRequestMap.erase(worker->mID); + unlockQueue() ; + + llassert_always(erased_1 > 0) ; + + removeFromNetworkQueue(worker, cancel); + llassert_always(!(worker->getFlags(LLWorkerClass::WCF_DELETE_REQUESTED))) ; + + worker->scheduleDelete(); + } + else + { + unlockQueue() ; + } +} + void LLTextureFetch::removeRequest(LLTextureFetchWorker* worker, bool cancel) { + lockQueue() ; size_t erased_1 = mRequestMap.erase(worker->mID); + unlockQueue() ; + llassert_always(erased_1 > 0) ; removeFromNetworkQueue(worker, cancel); llassert_always(!(worker->getFlags(LLWorkerClass::WCF_DELETE_REQUESTED))) ; @@ -1575,8 +1698,26 @@ void LLTextureFetch::removeRequest(LLTextureFetchWorker* worker, bool cancel) worker->scheduleDelete(); } +S32 LLTextureFetch::getNumRequests() +{ + lockQueue() ; + S32 size = (S32)mRequestMap.size(); + unlockQueue() ; + + return size ; +} + +S32 LLTextureFetch::getNumHTTPRequests() +{ + mNetworkQueueMutex.lock() ; + S32 size = (S32)mHTTPTextureQueue.size(); + mNetworkQueueMutex.unlock() ; + + return size ; +} + // call lockQueue() first! -LLTextureFetchWorker* LLTextureFetch::getWorker(const LLUUID& id) +LLTextureFetchWorker* LLTextureFetch::getWorkerAfterLock(const LLUUID& id) { LLTextureFetchWorker* res = NULL; map_t::iterator iter = mRequestMap.find(id); @@ -1587,12 +1728,18 @@ LLTextureFetchWorker* LLTextureFetch::getWorker(const LLUUID& id) return res; } +LLTextureFetchWorker* LLTextureFetch::getWorker(const LLUUID& id) +{ + LLMutexLock lock(&mQueueMutex) ; + + return getWorkerAfterLock(id) ; +} + bool LLTextureFetch::getRequestFinished(const LLUUID& id, S32& discard_level, LLPointer<LLImageRaw>& raw, LLPointer<LLImageRaw>& aux) { bool res = false; - LLMutexLock lock(&mQueueMutex); LLTextureFetchWorker* worker = getWorker(id); if (worker) { @@ -1644,7 +1791,6 @@ bool LLTextureFetch::getRequestFinished(const LLUUID& id, S32& discard_level, bool LLTextureFetch::updateRequestPriority(const LLUUID& id, F32 priority) { bool res = false; - LLMutexLock lock(&mQueueMutex); LLTextureFetchWorker* worker = getWorker(id); if (worker) { @@ -1664,7 +1810,8 @@ S32 LLTextureFetch::update(U32 max_time_ms) { S32 res; - mMaxBandwidth = gSavedSettings.getF32("ThrottleBandwidthKBPS"); + static LLCachedControl<F32> band_width(gSavedSettings,"ThrottleBandwidthKBPS"); + mMaxBandwidth = band_width ; res = LLWorkerThread::update(max_time_ms); @@ -1686,6 +1833,26 @@ S32 LLTextureFetch::update(U32 max_time_ms) return res; } +//called in the MAIN thread after the TextureCacheThread shuts down. +void LLTextureFetch::shutDownTextureCacheThread() +{ + if(mTextureCache) + { + llassert_always(mTextureCache->isQuitting() || mTextureCache->isStopped()) ; + mTextureCache = NULL ; + } +} + +//called in the MAIN thread after the ImageDecodeThread shuts down. +void LLTextureFetch::shutDownImageDecodeThread() +{ + if(mImageDecodeThread) + { + llassert_always(mImageDecodeThread->isQuitting() || mImageDecodeThread->isStopped()) ; + mImageDecodeThread = NULL ; + } +} + // WORKER THREAD void LLTextureFetch::startThread() { @@ -1760,8 +1927,6 @@ void LLTextureFetch::sendRequestListToSimulators() } timer.reset(); - LLMutexLock lock(&mQueueMutex); - // Send requests typedef std::set<LLTextureFetchWorker*,LLTextureFetchWorker::Compare> request_list_t; typedef std::map< LLHost, request_list_t > work_request_map_t; @@ -1852,7 +2017,9 @@ void LLTextureFetch::sendRequestListToSimulators() // llinfos << "IMAGE REQUEST: " << req->mID << " Discard: " << req->mDesiredDiscard // << " Packet: " << packet << " Priority: " << req->mImagePriority << llendl; - if ((gSavedSettings.getBOOL("LogTextureDownloadsToViewerLog")) || (gSavedSettings.getBOOL("LogTextureDownloadsToSimulator"))) + static LLCachedControl<bool> log_to_viewer_log(gSavedSettings,"LogTextureDownloadsToViewerLog"); + static LLCachedControl<bool> log_to_sim(gSavedSettings,"LogTextureDownloadsToSimulator"); + if (log_to_viewer_log || log_to_sim) { mTextureInfo.setRequestStartTime(req->mID, LLTimer::getTotalTime()); mTextureInfo.setRequestOffset(req->mID, 0); @@ -1970,7 +2137,6 @@ bool LLTextureFetchWorker::insertPacket(S32 index, U8* data, S32 size) bool LLTextureFetch::receiveImageHeader(const LLHost& host, const LLUUID& id, U8 codec, U16 packets, U32 totalbytes, U16 data_size, U8* data) { - LLMutexLock lock(&mQueueMutex); LLTextureFetchWorker* worker = getWorker(id); bool res = true; @@ -2003,7 +2169,9 @@ bool LLTextureFetch::receiveImageHeader(const LLHost& host, const LLUUID& id, U8 if (!res) { ++mBadPacketCount; + mNetworkQueueMutex.lock() ; mCancelQueue[host].insert(id); + mNetworkQueueMutex.unlock() ; return false; } @@ -2024,7 +2192,6 @@ bool LLTextureFetch::receiveImageHeader(const LLHost& host, const LLUUID& id, U8 bool LLTextureFetch::receiveImagePacket(const LLHost& host, const LLUUID& id, U16 packet_num, U16 data_size, U8* data) { - LLMutexLock lock(&mQueueMutex); LLTextureFetchWorker* worker = getWorker(id); bool res = true; @@ -2048,7 +2215,9 @@ bool LLTextureFetch::receiveImagePacket(const LLHost& host, const LLUUID& id, U1 if (!res) { ++mBadPacketCount; + mNetworkQueueMutex.lock() ; mCancelQueue[host].insert(id); + mNetworkQueueMutex.unlock() ; return false; } @@ -2071,7 +2240,10 @@ bool LLTextureFetch::receiveImagePacket(const LLHost& host, const LLUUID& id, U1 if(packet_num >= (worker->mTotalPackets - 1)) { - if ((gSavedSettings.getBOOL("LogTextureDownloadsToViewerLog")) || (gSavedSettings.getBOOL("LogTextureDownloadsToSimulator"))) + static LLCachedControl<bool> log_to_viewer_log(gSavedSettings,"LogTextureDownloadsToViewerLog"); + static LLCachedControl<bool> log_to_sim(gSavedSettings,"LogTextureDownloadsToSimulator"); + + if (log_to_viewer_log || log_to_sim) { U64 timeNow = LLTimer::getTotalTime(); mTextureInfo.setRequestSize(id, worker->mFileSize); @@ -2088,7 +2260,6 @@ BOOL LLTextureFetch::isFromLocalCache(const LLUUID& id) { BOOL from_cache = FALSE ; - LLMutexLock lock(&mQueueMutex); LLTextureFetchWorker* worker = getWorker(id); if (worker) { @@ -2101,7 +2272,7 @@ BOOL LLTextureFetch::isFromLocalCache(const LLUUID& id) } S32 LLTextureFetch::getFetchState(const LLUUID& id, F32& data_progress_p, F32& requested_priority_p, - U32& fetch_priority_p, F32& fetch_dtime_p, F32& request_dtime_p) + U32& fetch_priority_p, F32& fetch_dtime_p, F32& request_dtime_p, bool& can_use_http) { S32 state = LLTextureFetchWorker::INVALID; F32 data_progress = 0.0f; @@ -2110,7 +2281,6 @@ S32 LLTextureFetch::getFetchState(const LLUUID& id, F32& data_progress_p, F32& r F32 request_dtime = 999999.f; U32 fetch_priority = 0; - LLMutexLock lock(&mQueueMutex); LLTextureFetchWorker* worker = getWorker(id); if (worker && worker->haveWork()) { @@ -2140,6 +2310,7 @@ S32 LLTextureFetch::getFetchState(const LLUUID& id, F32& data_progress_p, F32& r requested_priority = worker->mImagePriority; } fetch_priority = worker->getPriority(); + can_use_http = worker->getCanUseHTTP() ; worker->unlockWorkMutex(); } data_progress_p = data_progress; diff --git a/indra/newview/lltexturefetch.h b/indra/newview/lltexturefetch.h index 373e38a83c..634e590fe0 100644 --- a/indra/newview/lltexturefetch.h +++ b/indra/newview/lltexturefetch.h @@ -58,9 +58,11 @@ public: ~LLTextureFetch(); /*virtual*/ S32 update(U32 max_time_ms); + void shutDownTextureCacheThread() ; //called in the main thread after the TextureCacheThread shuts down. + void shutDownImageDecodeThread() ; //called in the main thread after the ImageDecodeThread shuts down. bool createRequest(const std::string& url, const LLUUID& id, const LLHost& host, F32 priority, - S32 w, S32 h, S32 c, S32 discard, bool needs_aux); + S32 w, S32 h, S32 c, S32 discard, bool needs_aux, bool can_use_http); void deleteRequest(const LLUUID& id, bool cancel); bool getRequestFinished(const LLUUID& id, S32& discard_level, LLPointer<LLImageRaw>& raw, LLPointer<LLImageRaw>& aux); @@ -75,15 +77,16 @@ public: // Debug BOOL isFromLocalCache(const LLUUID& id); S32 getFetchState(const LLUUID& id, F32& decode_progress_p, F32& requested_priority_p, - U32& fetch_priority_p, F32& fetch_dtime_p, F32& request_dtime_p); + U32& fetch_priority_p, F32& fetch_dtime_p, F32& request_dtime_p, bool& can_use_http); void dump(); - S32 getNumRequests() { return mRequestMap.size(); } - S32 getNumHTTPRequests() { return mHTTPTextureQueue.size(); } + S32 getNumRequests() ; + S32 getNumHTTPRequests() ; // Public for access by callbacks void lockQueue() { mQueueMutex.lock(); } void unlockQueue() { mQueueMutex.unlock(); } LLTextureFetchWorker* getWorker(const LLUUID& id); + LLTextureFetchWorker* getWorkerAfterLock(const LLUUID& id); LLTextureInfo* getTextureInfo() { return &mTextureInfo; } @@ -92,7 +95,7 @@ protected: void removeFromNetworkQueue(LLTextureFetchWorker* worker, bool cancel); void addToHTTPQueue(const LLUUID& id); void removeFromHTTPQueue(const LLUUID& id); - S32 getHTTPQueueSize() { return (S32)mHTTPTextureQueue.size(); } + S32 getHTTPQueueSize() { return getNumHTTPRequests(); } void removeRequest(LLTextureFetchWorker* worker, bool cancel); // Called from worker thread (during doWork) void processCurlRequests(); @@ -111,8 +114,8 @@ public: S32 mBadPacketCount; private: - LLMutex mQueueMutex; - LLMutex mNetworkQueueMutex; + LLMutex mQueueMutex; //to protect mRequestMap only + LLMutex mNetworkQueueMutex; //to protect mNetworkQueue, mHTTPTextureQueue and mCancelQueue. LLTextureCache* mTextureCache; LLImageDecodeThread* mImageDecodeThread; diff --git a/indra/newview/lltextureview.cpp b/indra/newview/lltextureview.cpp index 98731f90f4..8ea4dbeb04 100644 --- a/indra/newview/lltextureview.cpp +++ b/indra/newview/lltextureview.cpp @@ -54,12 +54,19 @@ #include "llviewertexture.h" #include "llviewertexturelist.h" #include "llvovolume.h" + +// For avatar texture view +#include "llvoavatarself.h" +#include "lltexlayer.h" + extern F32 texmem_lower_bound_scale; LLTextureView *gTextureView = NULL; LLTextureSizeView *gTextureSizeView = NULL; LLTextureSizeView *gTextureCategoryView = NULL; +#define HIGH_PRIORITY 100000000.f + //static std::set<LLViewerFetchedTexture*> LLTextureView::sDebugImages; @@ -375,6 +382,105 @@ LLRect LLTextureBar::getRequiredRect() //////////////////////////////////////////////////////////////////////////// +class LLAvatarTexBar : public LLView +{ +public: + struct Params : public LLInitParam::Block<Params, LLView::Params> + { + Mandatory<LLTextureView*> texture_view; + Params() + : texture_view("texture_view") + { + S32 line_height = (S32)(LLFontGL::getFontMonospace()->getLineHeight() + .5f); + rect(LLRect(0,0,100,line_height * 4)); + } + }; + + LLAvatarTexBar(const Params& p) + : LLView(p), + mTextureView(p.texture_view) + {} + + virtual void draw(); + virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask); + virtual LLRect getRequiredRect(); // Return the height of this object, given the set options. + +private: + LLTextureView* mTextureView; +}; + +void LLAvatarTexBar::draw() +{ + if (!gSavedSettings.getBOOL("DebugAvatarRezTime")) return; + + LLVOAvatarSelf* avatarp = gAgentAvatarp; + if (!avatarp) return; + + const S32 line_height = (S32)(LLFontGL::getFontMonospace()->getLineHeight() + .5f); + const S32 v_offset = 0; + const S32 l_offset = 3; + + //---------------------------------------------------------------------------- + LLGLSUIDefault gls_ui; + LLColor4 color; + + U32 line_num = 1; + for (LLVOAvatarDefines::LLVOAvatarDictionary::BakedTextures::const_iterator baked_iter = LLVOAvatarDefines::LLVOAvatarDictionary::getInstance()->getBakedTextures().begin(); + baked_iter != LLVOAvatarDefines::LLVOAvatarDictionary::getInstance()->getBakedTextures().end(); + ++baked_iter) + { + const LLVOAvatarDefines::EBakedTextureIndex baked_index = baked_iter->first; + const LLTexLayerSet *layerset = avatarp->debugGetLayerSet(baked_index); + if (!layerset) continue; + const LLTexLayerSetBuffer *layerset_buffer = layerset->getComposite(); + if (!layerset_buffer) continue; + + LLColor4 text_color = LLColor4::white; + + if (layerset_buffer->uploadNeeded()) + { + text_color = LLColor4::red; + } + if (layerset_buffer->uploadInProgress()) + { + text_color = LLColor4::magenta; + } + std::string text = layerset_buffer->dumpTextureInfo(); + LLFontGL::getFontMonospace()->renderUTF8(text, 0, l_offset, v_offset + line_height*line_num, + text_color, LLFontGL::LEFT, LLFontGL::TOP); //, LLFontGL::BOLD, LLFontGL::DROP_SHADOW_SOFT); + line_num++; + } + const U32 texture_timeout = gSavedSettings.getU32("AvatarBakedTextureTimeout"); + const U32 override_tex_discard_level = gSavedSettings.getU32("TextureDiscardLevel"); + + LLColor4 header_color(1.f, 1.f, 1.f, 0.9f); + + const std::string texture_timeout_str = texture_timeout ? llformat("%d",texture_timeout) : "Disabled"; + const std::string override_tex_discard_level_str = override_tex_discard_level ? llformat("%d",override_tex_discard_level) : "Disabled"; + std::string header_text = llformat("[ Timeout('AvatarBakedTextureTimeout'):%s ] [ LOD_Override('TextureDiscardLevel'):%s ]", texture_timeout_str.c_str(), override_tex_discard_level_str.c_str()); + LLFontGL::getFontMonospace()->renderUTF8(header_text, 0, l_offset, v_offset + line_height*line_num, + header_color, LLFontGL::LEFT, LLFontGL::TOP); //, LLFontGL::BOLD, LLFontGL::DROP_SHADOW_SOFT); + line_num++; + std::string section_text = "Avatar Textures Information:"; + LLFontGL::getFontMonospace()->renderUTF8(section_text, 0, 0, v_offset + line_height*line_num, + header_color, LLFontGL::LEFT, LLFontGL::TOP, LLFontGL::BOLD, LLFontGL::DROP_SHADOW_SOFT); +} + +BOOL LLAvatarTexBar::handleMouseDown(S32 x, S32 y, MASK mask) +{ + return FALSE; +} + +LLRect LLAvatarTexBar::getRequiredRect() +{ + LLRect rect; + rect.mTop = 100; + if (!gSavedSettings.getBOOL("DebugAvatarRezTime")) rect.mTop = 0; + return rect; +} + +//////////////////////////////////////////////////////////////////////////// + class LLGLTexMemBar : public LLView { public: @@ -412,13 +518,17 @@ void LLGLTexMemBar::draw() F32 cache_usage = (F32)BYTES_TO_MEGA_BYTES(LLAppViewer::getTextureCache()->getUsage()) ; F32 cache_max_usage = (F32)BYTES_TO_MEGA_BYTES(LLAppViewer::getTextureCache()->getMaxUsage()) ; S32 line_height = (S32)(LLFontGL::getFontMonospace()->getLineHeight() + .5f); - S32 v_offset = (S32)((texture_bar_height + 2.5f) * mTextureView->mNumTextureBars + 2.5f); + S32 v_offset = (S32)((texture_bar_height + 2.2f) * mTextureView->mNumTextureBars + 2.0f); //---------------------------------------------------------------------------- LLGLSUIDefault gls_ui; LLColor4 text_color(1.f, 1.f, 1.f, 0.75f); LLColor4 color; - std::string text; + std::string text = ""; + + LLFontGL::getFontMonospace()->renderUTF8(text, 0, 0, v_offset + line_height*6, + text_color, LLFontGL::LEFT, LLFontGL::TOP); + text = llformat("GL Tot: %d/%d MB Bound: %d/%d MB Raw Tot: %d MB Bias: %.2f Cache: %.1f/%.1f MB", total_mem, max_total_mem, @@ -560,7 +670,8 @@ BOOL LLGLTexMemBar::handleMouseDown(S32 x, S32 y, MASK mask) LLRect LLGLTexMemBar::getRequiredRect() { LLRect rect; - rect.mTop = 8; + //rect.mTop = 50; + rect.mTop = 0; return rect; } @@ -640,6 +751,7 @@ LLTextureView::LLTextureView(const LLTextureView::Params& p) setDisplayChildren(TRUE); mGLTexMemBar = 0; + mAvatarTexBar = 0; } LLTextureView::~LLTextureView() @@ -647,6 +759,9 @@ LLTextureView::~LLTextureView() // Children all cleaned up by default view destructor. delete mGLTexMemBar; mGLTexMemBar = 0; + + delete mAvatarTexBar; + mAvatarTexBar = 0; } typedef std::pair<F32,LLViewerFetchedTexture*> decode_pair_t; @@ -658,6 +773,15 @@ struct compare_decode_pair } }; +struct KillView +{ + void operator()(LLView* viewp) + { + viewp->getParent()->removeChild(viewp); + viewp->die(); + } +}; + void LLTextureView::draw() { if (!mFreezeView) @@ -665,12 +789,23 @@ void LLTextureView::draw() // LLViewerObject *objectp; // S32 te; - for_each(mTextureBars.begin(), mTextureBars.end(), DeletePointer()); + for_each(mTextureBars.begin(), mTextureBars.end(), KillView()); mTextureBars.clear(); - - delete mGLTexMemBar; - mGLTexMemBar = 0; - + + if (mGLTexMemBar) + { + removeChild(mGLTexMemBar); + mGLTexMemBar->die(); + mGLTexMemBar = 0; + } + + if (mAvatarTexBar) + { + removeChild(mAvatarTexBar); + mAvatarTexBar->die(); + mAvatarTexBar = 0; + } + typedef std::multiset<decode_pair_t, compare_decode_pair > display_list_t; display_list_t display_image_list; @@ -683,6 +818,10 @@ void LLTextureView::draw() iter != gTextureList.mImageList.end(); ) { LLPointer<LLViewerFetchedTexture> imagep = *iter++; + if(!imagep->hasFetcher()) + { + continue ; + } S32 cur_discard = imagep->getDiscardLevel(); S32 desired_discard = imagep->mDesiredDiscardLevel; @@ -691,7 +830,7 @@ void LLTextureView::draw() { S32 tex_mem = imagep->hasGLTexture() ? imagep->getTextureMemory() : 0 ; llinfos << imagep->getID() - << "\t" << tex_mem + << "\t" << tex_mem << "\t" << imagep->getBoostLevel() << "\t" << imagep->getDecodePriority() << "\t" << imagep->getWidth() @@ -706,19 +845,6 @@ void LLTextureView::draw() ++debug_count; // for breakpoints } -#if 0 - if (imagep->getDontDiscard()) - { - continue; - } - - if (imagep->isMissingAsset()) - { - continue; - } -#endif - -#define HIGH_PRIORITY 100000000.f F32 pri; if (mOrderFetch) { @@ -737,59 +863,55 @@ void LLTextureView::draw() if (!mOrderFetch) { -#if 1 - if (pri < HIGH_PRIORITY && LLSelectMgr::getInstance()) - { - struct f : public LLSelectedTEFunctor + if (pri < HIGH_PRIORITY && LLSelectMgr::getInstance()) { - LLViewerFetchedTexture* mImage; - f(LLViewerFetchedTexture* image) : mImage(image) {} - virtual bool apply(LLViewerObject* object, S32 te) + struct f : public LLSelectedTEFunctor + { + LLViewerFetchedTexture* mImage; + f(LLViewerFetchedTexture* image) : mImage(image) {} + virtual bool apply(LLViewerObject* object, S32 te) + { + return (mImage == object->getTEImage(te)); + } + } func(imagep); + const bool firstonly = true; + bool match = LLSelectMgr::getInstance()->getSelection()->applyToTEs(&func, firstonly); + if (match) { - return (mImage == object->getTEImage(te)); + pri += 3*HIGH_PRIORITY; } - } func(imagep); - const bool firstonly = true; - bool match = LLSelectMgr::getInstance()->getSelection()->applyToTEs(&func, firstonly); - if (match) - { - pri += 3*HIGH_PRIORITY; } - } -#endif -#if 1 - if (pri < HIGH_PRIORITY && (cur_discard< 0 || desired_discard < cur_discard)) - { - LLSelectNode* hover_node = LLSelectMgr::instance().getHoverNode(); - if (hover_node) + + if (pri < HIGH_PRIORITY && (cur_discard< 0 || desired_discard < cur_discard)) { - LLViewerObject *objectp = hover_node->getObject(); - if (objectp) + LLSelectNode* hover_node = LLSelectMgr::instance().getHoverNode(); + if (hover_node) { - S32 tex_count = objectp->getNumTEs(); - for (S32 i = 0; i < tex_count; i++) + LLViewerObject *objectp = hover_node->getObject(); + if (objectp) { - if (imagep == objectp->getTEImage(i)) + S32 tex_count = objectp->getNumTEs(); + for (S32 i = 0; i < tex_count; i++) { - pri += 2*HIGH_PRIORITY; - break; + if (imagep == objectp->getTEImage(i)) + { + pri += 2*HIGH_PRIORITY; + break; + } } } } } - } -#endif -#if 1 - if (pri > 0.f && pri < HIGH_PRIORITY) - { - if (imagep->mLastPacketTimer.getElapsedTimeF32() < 1.f || - imagep->mFetchDeltaTime < 0.25f) + + if (pri > 0.f && pri < HIGH_PRIORITY) { - pri += 1*HIGH_PRIORITY; + if (imagep->mLastPacketTimer.getElapsedTimeF32() < 1.f || + imagep->mFetchDeltaTime < 0.25f) + { + pri += 1*HIGH_PRIORITY; + } } } -#endif - } if (pri > 0.0f) { @@ -830,11 +952,21 @@ void LLTextureView::draw() sortChildren(LLTextureBar::sort()); LLGLTexMemBar::Params tmbp; + LLRect tmbr; tmbp.name("gl texmem bar"); + tmbp.rect(tmbr); tmbp.texture_view(this); mGLTexMemBar = LLUICtrlFactory::create<LLGLTexMemBar>(tmbp); - addChild(mGLTexMemBar); - + addChildInBack(mGLTexMemBar); + + LLAvatarTexBar::Params atbp; + LLRect atbr; + atbp.name("gl avatartex bar"); + atbp.texture_view(this); + atbp.rect(atbr); + mAvatarTexBar = LLUICtrlFactory::create<LLAvatarTexBar>(atbp); + addChild(mAvatarTexBar); + reshape(getRect().getWidth(), getRect().getHeight(), TRUE); /* diff --git a/indra/newview/lltextureview.h b/indra/newview/lltextureview.h index 435a55df83..dfd9c42c2c 100644 --- a/indra/newview/lltextureview.h +++ b/indra/newview/lltextureview.h @@ -38,11 +38,13 @@ class LLViewerFetchedTexture; class LLTextureBar; class LLGLTexMemBar; +class LLAvatarTexBar; class LLTextureView : public LLContainerView { friend class LLTextureBar; friend class LLGLTexMemBar; + friend class LLAvatarTexBar; protected: LLTextureView(const Params&); friend class LLUICtrlFactory; @@ -73,7 +75,7 @@ private: U32 mNumTextureBars; LLGLTexMemBar* mGLTexMemBar; - + LLAvatarTexBar* mAvatarTexBar; public: static std::set<LLViewerFetchedTexture*> sDebugImages; }; diff --git a/indra/newview/lltoast.cpp b/indra/newview/lltoast.cpp index 110d158e2d..9abfab300c 100644 --- a/indra/newview/lltoast.cpp +++ b/indra/newview/lltoast.cpp @@ -41,6 +41,16 @@ using namespace LLNotificationsUI; +/*virtual*/ +BOOL LLToastLifeTimer::tick() +{ + if (mEventTimer.hasExpired()) + { + mToast->expire(); + } + return FALSE; +} + //-------------------------------------------------------------------------- LLToast::Params::Params() : can_fade("can_fade", true), @@ -68,12 +78,19 @@ LLToast::LLToast(const LLToast::Params& p) mNotification(p.notification), mIsHidden(false), mHideBtnPressed(false), - mIsTip(p.is_tip) + mIsTip(p.is_tip), + mWrapperPanel(NULL) { + mTimer.reset(new LLToastLifeTimer(this, p.lifetime_secs)); + LLUICtrlFactory::getInstance()->buildFloater(this, "panel_toast.xml", NULL); setCanDrag(FALSE); + mWrapperPanel = getChild<LLPanel>("wrapper_panel"); + mWrapperPanel->setMouseEnterCallback(boost::bind(&LLToast::onToastMouseEnter, this)); + mWrapperPanel->setMouseLeaveCallback(boost::bind(&LLToast::onToastMouseLeave, this)); + if(mPanel) { insertPanel(mPanel); @@ -83,6 +100,8 @@ LLToast::LLToast(const LLToast::Params& p) { mHideBtn = getChild<LLButton>("hide_btn"); mHideBtn->setClickedCallback(boost::bind(&LLToast::hide,this)); + mHideBtn->setMouseEnterCallback(boost::bind(&LLToast::onToastMouseEnter, this)); + mHideBtn->setMouseLeaveCallback(boost::bind(&LLToast::onToastMouseLeave, this)); } // init callbacks if present @@ -98,33 +117,13 @@ BOOL LLToast::postBuild() { if(!mCanFade) { - mTimer.stop(); - } - - if (mIsTip) - { - mTextEditor = mPanel->getChild<LLTextEditor>("text_editor_box"); - - if (mTextEditor) - { - mTextEditor->setMouseUpCallback(boost::bind(&LLToast::hide,this)); - mPanel->setMouseUpCallback(boost::bind(&LLToast::handleTipToastClick, this, _2, _3, _4)); - } + mTimer->stop(); } return TRUE; } //-------------------------------------------------------------------------- -void LLToast::handleTipToastClick(S32 x, S32 y, MASK mask) -{ - if (!mTextEditor->getRect().pointInRect(x, y)) - { - hide(); - } -} - -//-------------------------------------------------------------------------- void LLToast::setHideButtonEnabled(bool enabled) { if(mHideBtn) @@ -138,40 +137,48 @@ LLToast::~LLToast() } //-------------------------------------------------------------------------- -void LLToast::setAndStartTimer(F32 period) +void LLToast::hide() { - if(mCanFade) + setVisible(FALSE); + mTimer->stop(); + mIsHidden = true; + mOnFadeSignal(this); +} + +void LLToast::onFocusLost() +{ + if(mWrapperPanel && !isBackgroundVisible()) { - mToastLifetime = period; - mTimer.start(); + // Lets make wrapper panel behave like a floater + setBackgroundOpaque(FALSE); } } -//-------------------------------------------------------------------------- -bool LLToast::lifetimeHasExpired() +void LLToast::onFocusReceived() { - if (mTimer.getStarted()) + if(mWrapperPanel && !isBackgroundVisible()) { - F32 elapsed_time = mTimer.getElapsedTimeF32(); - if ((mToastLifetime - elapsed_time) <= mToastFadingTime) - { - setBackgroundOpaque(FALSE); - } - if (elapsed_time > mToastLifetime) - { - return true; - } + // Lets make wrapper panel behave like a floater + setBackgroundOpaque(TRUE); } - return false; } -//-------------------------------------------------------------------------- -void LLToast::hide() +S32 LLToast::getTopPad() { - setVisible(FALSE); - mTimer.stop(); - mIsHidden = true; - mOnFadeSignal(this); + if(mWrapperPanel) + { + return getRect().getHeight() - mWrapperPanel->getRect().getHeight(); + } + return 0; +} + +S32 LLToast::getRightPad() +{ + if(mWrapperPanel) + { + return getRect().getWidth() - mWrapperPanel->getRect().getWidth(); + } + return 0; } //-------------------------------------------------------------------------- @@ -179,12 +186,13 @@ void LLToast::setCanFade(bool can_fade) { mCanFade = can_fade; if(!mCanFade) - mTimer.stop(); + mTimer->stop(); } //-------------------------------------------------------------------------- -void LLToast::tick() +void LLToast::expire() { + // if toast has fade property - hide it if(mCanFade) { hide(); @@ -199,34 +207,48 @@ void LLToast::reshapeToPanel() if(!panel) return; - LLRect panel_rect; + LLRect panel_rect = panel->getRect(); - panel_rect = panel->getRect(); - reshape(panel_rect.getWidth(), panel_rect.getHeight()); panel_rect.setLeftTopAndSize(0, panel_rect.getHeight(), panel_rect.getWidth(), panel_rect.getHeight()); - panel->setRect(panel_rect); + panel->setShape(panel_rect); LLRect toast_rect = getRect(); - toast_rect.setLeftTopAndSize(toast_rect.mLeft,toast_rect.mTop,panel_rect.getWidth(), panel_rect.getHeight()); - setRect(toast_rect); + toast_rect.setLeftTopAndSize(toast_rect.mLeft, toast_rect.mTop, + panel_rect.getWidth() + getRightPad(), panel_rect.getHeight() + getTopPad()); + setShape(toast_rect); } void LLToast::insertPanel(LLPanel* panel) { - addChild(panel); + mWrapperPanel->addChild(panel); reshapeToPanel(); } //-------------------------------------------------------------------------- void LLToast::draw() { - if(lifetimeHasExpired()) + LLFloater::draw(); + + if(!isBackgroundVisible()) { - tick(); + // Floater background is invisible, lets make wrapper panel look like a + // floater - draw shadow. + drawShadow(mWrapperPanel); + + // Shadow will probably overlap close button, lets redraw the button + if(mHideBtn) + { + drawChild(mHideBtn); + } } - LLFloater::draw(); + // if timer started and remaining time <= fading time + if (mTimer->getStarted() && (mToastLifetime + - mTimer->getEventTimer().getElapsedTimeF32()) <= mToastFadingTime) + { + setBackgroundOpaque(FALSE); + } } //-------------------------------------------------------------------------- @@ -245,11 +267,20 @@ void LLToast::setVisible(BOOL show) if(show) { setBackgroundOpaque(TRUE); - if(!mTimer.getStarted() && mCanFade) + if(!mTimer->getStarted() && mCanFade) + { + mTimer->start(); + } + if (!getVisible()) { - mTimer.start(); + LLModalDialog::setFrontmost(FALSE); } - LLModalDialog::setFrontmost(FALSE); + } + else + { + //hide "hide" button in case toast was hidden without mouse_leave + if(mHideBtn) + mHideBtn->setVisible(show); } LLFloater::setVisible(show); if(mPanel) @@ -261,43 +292,78 @@ void LLToast::setVisible(BOOL show) } } -//-------------------------------------------------------------------------- -void LLToast::onMouseEnter(S32 x, S32 y, MASK mask) +void LLToast::onToastMouseEnter() { - mOnToastHoverSignal(this, MOUSE_ENTER); + LLRect panel_rc = mWrapperPanel->calcScreenRect(); + LLRect button_rc; + if(mHideBtn) + { + button_rc = mHideBtn->calcScreenRect(); + } - setBackgroundOpaque(TRUE); + S32 x, y; + LLUI::getMousePositionScreen(&x, &y); - //toasts fading is management by Screen Channel - - sendChildToFront(mHideBtn); - if(mHideBtn && mHideBtn->getEnabled()) - mHideBtn->setVisible(TRUE); - mOnMouseEnterSignal(this); + if(panel_rc.pointInRect(x, y) || button_rc.pointInRect(x, y)) + { + mOnToastHoverSignal(this, MOUSE_ENTER); - LLModalDialog::onMouseEnter(x, y, mask); + setBackgroundOpaque(TRUE); + + //toasts fading is management by Screen Channel + + sendChildToFront(mHideBtn); + if(mHideBtn && mHideBtn->getEnabled()) + { + mHideBtn->setVisible(TRUE); + } + mOnMouseEnterSignal(this); + mToastMouseEnterSignal(this, getValue()); + } } -//-------------------------------------------------------------------------- -void LLToast::onMouseLeave(S32 x, S32 y, MASK mask) -{ - mOnToastHoverSignal(this, MOUSE_LEAVE); +void LLToast::onToastMouseLeave() +{ + LLRect panel_rc = mWrapperPanel->calcScreenRect(); + LLRect button_rc; + if(mHideBtn) + { + button_rc = mHideBtn->calcScreenRect(); + } - //toasts fading is management by Screen Channel + S32 x, y; + LLUI::getMousePositionScreen(&x, &y); - if(mHideBtn && mHideBtn->getEnabled()) + if( !panel_rc.pointInRect(x, y) && !button_rc.pointInRect(x, y)) { - if( mHideBtnPressed ) + mOnToastHoverSignal(this, MOUSE_LEAVE); + + //toasts fading is management by Screen Channel + + if(mHideBtn && mHideBtn->getEnabled()) { - mHideBtnPressed = false; - return; + if( mHideBtnPressed ) + { + mHideBtnPressed = false; + return; + } + mHideBtn->setVisible(FALSE); } - mHideBtn->setVisible(FALSE); + mToastMouseLeaveSignal(this, getValue()); } - - LLModalDialog::onMouseLeave(x, y, mask); } +void LLToast::setBackgroundOpaque(BOOL b) +{ + if(mWrapperPanel && !isBackgroundVisible()) + { + mWrapperPanel->setBackgroundOpaque(b); + } + else + { + LLModalDialog::setBackgroundOpaque(b); + } +} void LLNotificationsUI::LLToast::stopFading() { @@ -315,6 +381,13 @@ void LLNotificationsUI::LLToast::startFading() } } +bool LLToast::isHovered() +{ + S32 x, y; + LLUI::getMousePositionScreen(&x, &y); + return mWrapperPanel->calcScreenRect().pointInRect(x, y); +} + //-------------------------------------------------------------------------- BOOL LLToast::handleMouseDown(S32 x, S32 y, MASK mask) @@ -339,4 +412,13 @@ bool LLToast::isNotificationValid() //-------------------------------------------------------------------------- +S32 LLToast::notifyParent(const LLSD& info) +{ + if (info.has("action") && "hide_toast" == info["action"].asString()) + { + hide(); + return 1; + } + return LLModalDialog::notifyParent(info); +} diff --git a/indra/newview/lltoast.h b/indra/newview/lltoast.h index 3d25fd4f02..4211f21ef1 100644 --- a/indra/newview/lltoast.h +++ b/indra/newview/lltoast.h @@ -36,7 +36,7 @@ #include "llpanel.h" #include "llmodaldialog.h" -#include "lltimer.h" +#include "lleventtimer.h" #include "llnotificationptr.h" #include "llviewercontrol.h" @@ -48,12 +48,34 @@ namespace LLNotificationsUI { +class LLToast; +/** + * Timer for toasts. + */ +class LLToastLifeTimer: public LLEventTimer +{ +public: + LLToastLifeTimer(LLToast* toast, F32 period) : mToast(toast), LLEventTimer(period){} + + /*virtual*/ + BOOL tick(); + void stop() { mEventTimer.stop(); } + void start() { mEventTimer.start(); } + void restart() {mEventTimer.reset(); } + BOOL getStarted() { return mEventTimer.getStarted(); } + + LLTimer& getEventTimer() { return mEventTimer;} +private : + LLToast* mToast; +}; + /** * Represents toast pop-up. * This is a parent view for all toast panels. */ class LLToast : public LLModalDialog { + friend class LLToastLifeTimer; public: typedef boost::function<void (LLToast* toast)> toast_callback_t; typedef boost::signals2::signal<void (LLToast* toast)> toast_signal_t; @@ -86,8 +108,6 @@ public: // Toast handlers virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask); - virtual void onMouseEnter(S32 x, S32 y, MASK mask); - virtual void onMouseLeave(S32 x, S32 y, MASK mask); //Fading @@ -97,6 +117,7 @@ public: /** Start fading timer */ virtual void startFading(); + bool isHovered(); // Operating with toasts // insert a panel to a toast @@ -108,20 +129,32 @@ public: LLPanel* getPanel() { return mPanel; } // enable/disable Toast's Hide button void setHideButtonEnabled(bool enabled); - // initialize and start Toast's timer - void setAndStartTimer(F32 period); // - void resetTimer() { mTimer.start(); } + void resetTimer() { mTimer->start(); } // - void stopTimer() { mTimer.stop(); } + void stopTimer() { mTimer->stop(); } + // + LLToastLifeTimer* getTimer() { return mTimer.get();} // virtual void draw(); // virtual void setVisible(BOOL show); + + /*virtual*/ void setBackgroundOpaque(BOOL b); // virtual void hide(); + /*virtual*/ void onFocusLost(); + /*virtual*/ void onFocusReceived(); + + /** + * Returns padding between floater top and wrapper_panel top. + * This padding should be taken into account when positioning or reshaping toasts + */ + S32 getTopPad(); + + S32 getRightPad(); // get/set Toast's flags or states // get information whether the notification corresponding to the toast is valid or not @@ -154,28 +187,33 @@ public: toast_hover_check_signal_t mOnToastHoverSignal; boost::signals2::connection setOnToastHoverCallback(toast_hover_check_callback_t cb) { return mOnToastHoverSignal.connect(cb); } + boost::signals2::connection setMouseEnterCallback( const commit_signal_t::slot_type& cb ) { return mToastMouseEnterSignal.connect(cb); }; + boost::signals2::connection setMouseLeaveCallback( const commit_signal_t::slot_type& cb ) { return mToastMouseLeaveSignal.connect(cb); }; + + virtual S32 notifyParent(const LLSD& info); private: - void handleTipToastClick(S32 x, S32 y, MASK mask); + void onToastMouseEnter(); + + void onToastMouseLeave(); - // check timer - bool lifetimeHasExpired(); - // on timer finished function - void tick(); + void expire(); LLUUID mNotificationID; LLUUID mSessionID; LLNotificationPtr mNotification; + LLPanel* mWrapperPanel; + // timer counts a lifetime of a toast - LLTimer mTimer; + std::auto_ptr<LLToastLifeTimer> mTimer; + F32 mToastLifetime; // in seconds F32 mToastFadingTime; // in seconds LLPanel* mPanel; LLButton* mHideBtn; - LLTextEditor* mTextEditor; LLColor4 mBgColor; bool mCanFade; @@ -184,6 +222,9 @@ private: bool mHideBtnPressed; bool mIsHidden; // this flag is TRUE when a toast has faded or was hidden with (x) button (EXT-1849) bool mIsTip; + + commit_signal_t mToastMouseEnterSignal; + commit_signal_t mToastMouseLeaveSignal; }; } diff --git a/indra/newview/lltoastalertpanel.cpp b/indra/newview/lltoastalertpanel.cpp index c3ccb9380b..7ba256c870 100644 --- a/indra/newview/lltoastalertpanel.cpp +++ b/indra/newview/lltoastalertpanel.cpp @@ -50,6 +50,8 @@ #include "llnotifications.h" #include "llfunctorregistry.h" #include "llrootview.h" +#include "lltransientfloatermgr.h" +#include "llviewercontrol.h" // for gSavedSettings const S32 MAX_ALLOWED_MSG_WIDTH = 400; const F32 DEFAULT_BUTTON_DELAY = 0.5f; @@ -170,6 +172,7 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal params.tab_stop(false); params.wrap(true); params.follows.flags(FOLLOWS_LEFT | FOLLOWS_TOP); + params.allow_scroll(true); LLTextBox * msg_box = LLUICtrlFactory::create<LLTextBox> (params); // Compute max allowable height for the dialog text, so we can allocate @@ -178,9 +181,16 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal gFloaterView->getRect().getHeight() - LINE_HEIGHT // title bar - 3*VPAD - BTN_HEIGHT; + // reshape to calculate real text width and height msg_box->reshape( MAX_ALLOWED_MSG_WIDTH, max_allowed_msg_height ); msg_box->setValue(msg); - msg_box->reshapeToFitText(); + + S32 pixel_width = msg_box->getTextPixelWidth(); + S32 pixel_height = msg_box->getTextPixelHeight(); + + // We should use some space to prevent set textbox's scroller visible when it is unnecessary. + msg_box->reshape( llmin(MAX_ALLOWED_MSG_WIDTH,pixel_width + 2 * msg_box->getHPad() + HPAD), + llmin(max_allowed_msg_height,pixel_height + 2 * msg_box->getVPad()) ) ; const LLRect& text_rect = msg_box->getRect(); S32 dialog_width = llmax( btn_total_width, text_rect.getWidth() ) + 2 * HPAD; @@ -237,13 +247,72 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal msg_box->setRect( rect ); LLToastPanel::addChild(msg_box); - // Buttons - S32 button_left = (LLToastPanel::getRect().getWidth() - btn_total_width) / 2; + // (Optional) Edit Box + if (!edit_text_name.empty()) + { + S32 y = VPAD + BTN_HEIGHT + VPAD/2; + mLineEditor = LLUICtrlFactory::getInstance()->createFromFile<LLLineEditor>("alert_line_editor.xml", this, LLPanel::child_registry_t::instance()); + if (mLineEditor) + { + LLRect leditor_rect = LLRect( HPAD, y+EDITOR_HEIGHT, dialog_width-HPAD, y); + mLineEditor->setName(edit_text_name); + mLineEditor->reshape(leditor_rect.getWidth(), leditor_rect.getHeight()); + mLineEditor->setRect(leditor_rect); + mLineEditor->setText(edit_text_contents); + + // decrease limit of line editor of teleport offer dialog to avoid truncation of + // location URL in invitation message, see EXT-6891 + if ("OfferTeleport" == mNotification->getName()) + { + mLineEditor->setMaxTextLength(gSavedSettings.getS32( + "teleport_offer_invitation_max_length")); + } + else + { + mLineEditor->setMaxTextLength(STD_STRING_STR_LEN - 1); + } + + LLToastPanel::addChild(mLineEditor); + + mLineEditor->setDrawAsterixes(is_password); + + setEditTextArgs(notification->getSubstitutions()); + + mLineEditor->setFollowsLeft(); + mLineEditor->setFollowsRight(); + + // find form text input field + LLSD form_text; + for (LLSD::array_const_iterator it = form_sd.beginArray(); it != form_sd.endArray(); ++it) + { + std::string type = (*it)["type"].asString(); + if (type == "text") + { + form_text = (*it); + } + } + + // if form text input field has width attribute + if (form_text.has("width")) + { + // adjust floater width to fit line editor + S32 editor_width = form_text["width"]; + LLRect editor_rect = mLineEditor->getRect(); + U32 width_delta = editor_width - editor_rect.getWidth(); + LLRect toast_rect = getRect(); + reshape(toast_rect.getWidth() + width_delta, toast_rect.getHeight()); + } + } + } + + // Buttons + S32 button_left = (LLToastPanel::getRect().getWidth() - btn_total_width) / 2; + for( S32 i = 0; i < num_options; i++ ) { LLRect button_rect; - + LLButton* btn = LLUICtrlFactory::getInstance()->createFromFile<LLButton>("alert_button.xml", this, LLPanel::child_registry_t::instance()); if(btn) { @@ -251,7 +320,7 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal btn->setRect(button_rect.setOriginAndSize( button_left, VPAD, button_width, BTN_HEIGHT )); btn->setLabel(options[i].second); btn->setFont(font); - + btn->setClickedCallback(boost::bind(&LLToastAlertPanel::onButtonPressed, this, _2, i)); mButtonData[i].mButton = btn; @@ -266,32 +335,6 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal button_left += button_width + BTN_HPAD; } - // (Optional) Edit Box - if (!edit_text_name.empty()) - { - S32 y = VPAD + BTN_HEIGHT + VPAD/2; - mLineEditor = LLUICtrlFactory::getInstance()->createFromFile<LLLineEditor>("alert_line_editor.xml", this, LLPanel::child_registry_t::instance()); - - if (mLineEditor) - { - LLRect leditor_rect = LLRect( HPAD, y+EDITOR_HEIGHT, dialog_width-HPAD, y); - mLineEditor->setName(edit_text_name); - mLineEditor->reshape(leditor_rect.getWidth(), leditor_rect.getHeight()); - mLineEditor->setRect(leditor_rect); - mLineEditor->setText(edit_text_contents); - mLineEditor->setMaxTextLength(STD_STRING_STR_LEN - 1); - - // make sure all edit keys get handled properly (DEV-22396) - mLineEditor->setHandleEditKeysDirectly(TRUE); - - LLToastPanel::addChild(mLineEditor); - - mLineEditor->setDrawAsterixes(is_password); - - setEditTextArgs(notification->getSubstitutions()); - } - } - std::string ignore_label; if (form->getIgnoreType() == LLNotificationForm::IGNORE_WITH_DEFAULT_RESPONSE) @@ -315,6 +358,9 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal mDefaultBtnTimer.start(); mDefaultBtnTimer.setTimerExpirySec(DEFAULT_BUTTON_DELAY); } + + LLTransientFloaterMgr::instance().addControlView( + LLTransientFloaterMgr::GLOBAL, this); } bool LLToastAlertPanel::setCheckBox( const std::string& check_title, const std::string& check_control ) @@ -368,6 +414,8 @@ void LLToastAlertPanel::setVisible( BOOL visible ) LLToastAlertPanel::~LLToastAlertPanel() { + LLTransientFloaterMgr::instance().removeControlView( + LLTransientFloaterMgr::GLOBAL, this); } BOOL LLToastAlertPanel::hasTitleBar() const diff --git a/indra/newview/lltoastgroupnotifypanel.cpp b/indra/newview/lltoastgroupnotifypanel.cpp index add61c00cf..7eac3867d5 100644 --- a/indra/newview/lltoastgroupnotifypanel.cpp +++ b/indra/newview/lltoastgroupnotifypanel.cpp @@ -133,9 +133,8 @@ LLToastGroupNotifyPanel::LLToastGroupNotifyPanel(LLNotificationPtr& notification childSetActionTextbox("attachment", boost::bind( &LLToastGroupNotifyPanel::onClickAttachment, this)); - LLUIImagePtr attachIconImg = get_item_icon(mInventoryOffer->mType, - LLInventoryType::IT_TEXTURE, - 0, FALSE); + LLUIImagePtr attachIconImg = LLInventoryIcon::getIcon(mInventoryOffer->mType, + LLInventoryType::IT_TEXTURE); pAttachIcon->setValue(attachIconImg->getName()); } diff --git a/indra/newview/lltoastimpanel.cpp b/indra/newview/lltoastimpanel.cpp index 7ae2404203..26d3bd5192 100644 --- a/indra/newview/lltoastimpanel.cpp +++ b/indra/newview/lltoastimpanel.cpp @@ -66,12 +66,13 @@ LLToastIMPanel::LLToastIMPanel(LLToastIMPanel::Params &p) : LLToastPanel(p.notif std::string font_size = LLFontGL::sizeFromFont(fontp); style_params.font.name(font_name); style_params.font.size(font_size); - style_params.font.style = "UNDERLINE"; + //Handle IRC styled /me messages. std::string prefix = p.message.substr(0, 4); if (prefix == "/me " || prefix == "/me'") { + //style_params.font.style = "UNDERLINE"; mMessage->clear(); style_params.font.style ="ITALIC"; @@ -82,7 +83,8 @@ LLToastIMPanel::LLToastIMPanel(LLToastIMPanel::Params &p) : LLToastPanel(p.notif } else { - mMessage->setValue(p.message); + style_params.font.style = "NORMAL"; + mMessage->setText(p.message, style_params); } mAvatarName->setValue(p.from); @@ -141,32 +143,6 @@ BOOL LLToastIMPanel::handleToolTip(S32 x, S32 y, MASK mask) return LLToastPanel::handleToolTip(x, y, mask); } -void LLToastIMPanel::showInspector() -{ - LLIMModel::LLIMSession* im_session = LLIMModel::getInstance()->findIMSession(mSessionID); - if(!im_session) - { - llwarns << "Invalid IM session" << llendl; - return; - } - - switch(im_session->mSessionType) - { - case LLIMModel::LLIMSession::P2P_SESSION: - LLFloaterReg::showInstance("inspect_avatar", LLSD().with("avatar_id", mAvatarID)); - break; - case LLIMModel::LLIMSession::GROUP_SESSION: - LLFloaterReg::showInstance("inspect_group", LLSD().with("group_id", mSessionID)); - break; - case LLIMModel::LLIMSession::ADHOC_SESSION: - LLFloaterReg::showInstance("inspect_avatar", LLSD().with("avatar_id", im_session->mOtherParticipantID)); - break; - default: - llwarns << "Unknown IM session type" << llendl; - break; - } -} - void LLToastIMPanel::spawnNameToolTip() { // Spawn at right side of the name textbox. @@ -176,7 +152,7 @@ void LLToastIMPanel::spawnNameToolTip() LLToolTip::Params params; params.background_visible(false); - params.click_callback(boost::bind(&LLToastIMPanel::showInspector, this)); + params.click_callback(boost::bind(&LLFloaterReg::showInstance, "inspect_avatar", LLSD().with("avatar_id", mAvatarID), FALSE)); params.delay_time(0.0f); // spawn instantly on hover params.image(LLUI::getUIImage("Info_Small")); params.message(""); @@ -201,7 +177,7 @@ void LLToastIMPanel::spawnGroupIconToolTip() LLInspector::Params params; params.fillFrom(LLUICtrlFactory::instance().getDefaultParams<LLInspector>()); - params.click_callback(boost::bind(&LLToastIMPanel::showInspector, this)); + params.click_callback(boost::bind(&LLFloaterReg::showInstance, "inspect_group", LLSD().with("group_id", mSessionID), FALSE)); params.delay_time(0.100f); params.image(LLUI::getUIImage("Info_Small")); params.message(g_data.mName); @@ -214,16 +190,15 @@ void LLToastIMPanel::spawnGroupIconToolTip() void LLToastIMPanel::initIcon() { - LLIconCtrl* sys_msg_icon = getChild<LLIconCtrl>("sys_msg_icon"); - mAvatarIcon->setVisible(FALSE); mGroupIcon->setVisible(FALSE); - sys_msg_icon->setVisible(FALSE); mAdhocIcon->setVisible(FALSE); if(mAvatarName->getValue().asString() == SYSTEM_FROM) { - sys_msg_icon->setVisible(TRUE); + // "sys_msg_icon" was disabled by Erica in the changeset: 5109 (85181bc92cbe) + // and "dummy widget" warnings appeared in log. + // It does not make sense to have such image with empty name. Removed for EXT-5057. } else { diff --git a/indra/newview/lltoastnotifypanel.cpp b/indra/newview/lltoastnotifypanel.cpp index 4d741456c4..38f67720b7 100644 --- a/indra/newview/lltoastnotifypanel.cpp +++ b/indra/newview/lltoastnotifypanel.cpp @@ -44,24 +44,34 @@ #include "llrect.h" #include "lltrans.h" #include "llnotificationsutil.h" +#include "llviewermessage.h" +#include "llimfloater.h" const S32 BOTTOM_PAD = VPAD * 3; +const S32 IGNORE_BTN_TOP_DELTA = 3*VPAD;//additional ignore_btn padding S32 BUTTON_WIDTH = 90; //static const LLFontGL* LLToastNotifyPanel::sFont = NULL; const LLFontGL* LLToastNotifyPanel::sFontSmall = NULL; -LLToastNotifyPanel::LLToastNotifyPanel(LLNotificationPtr& notification) : +LLToastNotifyPanel::button_click_signal_t LLToastNotifyPanel::sButtonClickSignal; + +LLToastNotifyPanel::LLToastNotifyPanel(LLNotificationPtr& notification, const LLRect& rect) : LLToastPanel(notification), mTextBox(NULL), mInfoPanel(NULL), mControlPanel(NULL), mNumOptions(0), mNumButtons(0), -mAddedDefaultBtn(false) +mAddedDefaultBtn(false), +mCloseNotificationOnDestroy(true) { LLUICtrlFactory::getInstance()->buildPanel(this, "panel_notification.xml"); + if(rect != LLRect::null) + { + this->setShape(rect); + } mInfoPanel = getChild<LLPanel>("info_panel"); mControlPanel = getChild<LLPanel>("control_panel"); BUTTON_WIDTH = gSavedSettings.getS32("ToastButtonWidth"); @@ -127,14 +137,6 @@ mAddedDefaultBtn(false) { std::vector<index_button_pair_t> buttons; buttons.reserve(mNumOptions); - for (S32 i = 0; i < mNumOptions; i++) - { - LLSD form_element = form->getElement(i); - if (form_element["type"].asString() != "button") - { - continue; - } - } S32 buttons_width = 0; // create all buttons and accumulate they total width to reshape mControlPanel for (S32 i = 0; i < mNumOptions; i++) @@ -155,27 +157,66 @@ mAddedDefaultBtn(false) } else { - //try get an average left_pad to spread out buttons - S32 left_pad = (getRect().getWidth() - buttons_width) / (S32(buttons.size() + 1)); - // left_pad can be < 2*HPAD if we have a lot of buttons. - if(left_pad < 2*HPAD) + const S32 button_panel_width = mControlPanel->getRect().getWidth();// do not change width of the panel + S32 button_panel_height = mControlPanel->getRect().getHeight(); + //try get an average h_pad to spread out buttons + S32 h_pad = (button_panel_width - buttons_width) / (S32(buttons.size())); + if(h_pad < 2*HPAD) + { + /* + * Probably it is a scriptdialog toast + * for a scriptdialog toast h_pad can be < 2*HPAD if we have a lot of buttons. + * In last case set default h_pad to avoid heaping of buttons + */ + S32 button_per_row = button_panel_width / BUTTON_WIDTH; + h_pad = (button_panel_width % BUTTON_WIDTH) / (button_per_row - 1);// -1 because we do not need space after last button in a row + if(h_pad < 2*HPAD) // still not enough space between buttons ? + { + h_pad = 2*HPAD; + } + } + if (mIsScriptDialog) { - //Probably it is a scriptdialog toast, set default left_pad - left_pad = 2*HPAD; + // we are using default width for script buttons so we can determinate button_rows + //to get a number of rows we divide the required width of the buttons to button_panel_width + S32 button_rows = llceil(F32(buttons.size() - 1) * (BUTTON_WIDTH + h_pad) / button_panel_width); + //S32 button_rows = (buttons.size() - 1) * (BUTTON_WIDTH + h_pad) / button_panel_width; + //reserve one row for the ignore_btn + button_rows++; + //calculate required panel height for scripdialog notification. + button_panel_height = button_rows * (BTN_HEIGHT + VPAD) + IGNORE_BTN_TOP_DELTA + BOTTOM_PAD; } - //how many rows we need to fit all buttons with current width of the panel - S32 button_rows = (buttons_width + left_pad * S32(buttons.size() + 1)) / getRect().getWidth() + 1; - //calculate required panel height - S32 button_panel_height = button_rows *( BTN_HEIGHT + VPAD) + BOTTOM_PAD; - - adjustPanelForScriptNotice(getRect().getWidth(), button_panel_height); - //we begin from lefttop angle and go to rightbottom. - updateButtonsLayout(buttons, left_pad, button_panel_height); + else + { + // in common case buttons can have different widths so we need to calculate button_rows according to buttons_width + //S32 button_rows = llceil(F32(buttons.size()) * (buttons_width + h_pad) / button_panel_width); + S32 button_rows = llceil(F32((buttons.size() - 1) * h_pad + buttons_width) / button_panel_width); + //calculate required panel height + button_panel_height = button_rows * (BTN_HEIGHT + VPAD) + BOTTOM_PAD; + } + + // we need to keep min width and max height to make visible all buttons, because width of the toast can not be changed + adjustPanelForScriptNotice(button_panel_width, button_panel_height); + updateButtonsLayout(buttons, h_pad); + // save buttons for later use in disableButtons() + mButtons.assign(buttons.begin(), buttons.end()); } } // adjust panel's height to the text size mInfoPanel->setFollowsAll(); snapToMessageHeight(mTextBox, MAX_LENGTH); + + if(notification->isReusable()) + { + mButtonClickConnection = sButtonClickSignal.connect( + boost::bind(&LLToastNotifyPanel::onToastPanelButtonClicked, this, _1, _2)); + + if(notification->isRespondedTo()) + { + // User selected an option in toast, now disable required buttons in IM window + disableRespondedOptions(notification); + } + } } void LLToastNotifyPanel::addDefaultButton() { @@ -202,7 +243,8 @@ LLButton* LLToastNotifyPanel::createButton(const LLSD& form_element, BOOL is_opt mBtnCallbackData.push_back(userdata); LLButton::Params p; - const LLFontGL* font = form_element["index"].asInteger() == -1 ? sFontSmall: sFont; // for ignore button in script dialog + bool is_ignore_btn = form_element["index"].asInteger() == -1; + const LLFontGL* font = is_ignore_btn ? sFontSmall: sFont; // for ignore button in script dialog p.name(form_element["name"].asString()); p.label(form_element["text"].asString()); p.font(font); @@ -210,18 +252,25 @@ LLButton* LLToastNotifyPanel::createButton(const LLSD& form_element, BOOL is_opt p.click_callback.function(boost::bind(&LLToastNotifyPanel::onClickButton, userdata)); p.rect.width = BUTTON_WIDTH; p.auto_resize = false; - p.follows.flags(FOLLOWS_RIGHT | FOLLOWS_LEFT | FOLLOWS_BOTTOM); + p.follows.flags(FOLLOWS_LEFT | FOLLOWS_BOTTOM); if (mIsCaution) { p.image_color(LLUIColorTable::instance().getColor("ButtonCautionImageColor")); p.image_color_disabled(LLUIColorTable::instance().getColor("ButtonCautionImageColor")); } + // for the scriptdialog buttons we use fixed button size. This is a limit! if (!mIsScriptDialog && font->getWidth(form_element["text"].asString()) > BUTTON_WIDTH) { p.rect.width = 1; p.auto_resize = true; } - + else if (mIsScriptDialog && is_ignore_btn) + { + // this is ignore button,make it smaller + p.rect.height = BTN_HEIGHT_SMALL; + p.rect.width = 1; + p.auto_resize = true; + } LLButton* btn = LLUICtrlFactory::create<LLButton>(p); mNumButtons++; btn->autoResize(); @@ -235,44 +284,61 @@ LLButton* LLToastNotifyPanel::createButton(const LLSD& form_element, BOOL is_opt LLToastNotifyPanel::~LLToastNotifyPanel() { + mButtonClickConnection.disconnect(); + std::for_each(mBtnCallbackData.begin(), mBtnCallbackData.end(), DeletePointer()); - if (LLNotificationsUtil::find(mNotification->getID()) != NULL) + if (mCloseNotificationOnDestroy && LLNotificationsUtil::find(mNotification->getID()) != NULL) { - LLNotifications::getInstance()->cancel(mNotification); + // let reusable notification be deleted + mNotification->setReusable(false); + if (!mNotification->isPersistent()) + { + LLNotifications::getInstance()->cancel(mNotification); + } } } -void LLToastNotifyPanel::updateButtonsLayout(const std::vector<index_button_pair_t>& buttons, S32 left_pad, S32 top) + +void LLToastNotifyPanel::updateButtonsLayout(const std::vector<index_button_pair_t>& buttons, S32 h_pad) { - S32 left = left_pad; + S32 left = 0; + //reserve place for ignore button + S32 bottom_offset = mIsScriptDialog ? (BTN_HEIGHT + IGNORE_BTN_TOP_DELTA + BOTTOM_PAD) : BOTTOM_PAD; + S32 max_width = mControlPanel->getRect().getWidth(); LLButton* ignore_btn = NULL; for (std::vector<index_button_pair_t>::const_iterator it = buttons.begin(); it != buttons.end(); it++) { - if(left + it->second->getRect().getWidth() + 2*HPAD > getRect().getWidth()) - { - // looks like we need to add button to the next row - left = left_pad; - top-= (BTN_HEIGHT + VPAD); - } - LLRect btn_rect(it->second->getRect()); - if(mIsScriptDialog && it->first == -1) + if (it->first == -1) { - //this is ignore button ( index == -1) we need to add it into new extra row at the end ignore_btn = it->second; continue; } - btn_rect.setLeftTopAndSize(left, top, btn_rect.getWidth(), btn_rect.getHeight()); - it->second->setRect(btn_rect); - left = btn_rect.mLeft + btn_rect.getWidth() + left_pad; - addChild(it->second, -1); + LLButton* btn = it->second; + LLRect btn_rect(btn->getRect()); + if (left + btn_rect.getWidth() > max_width)// whether there is still some place for button+h_pad in the mControlPanel + { + // looks like we need to add button to the next row + left = 0; + bottom_offset += (BTN_HEIGHT + VPAD); + } + //we arrange buttons from bottom to top for backward support of old script + btn_rect.setOriginAndSize(left, bottom_offset, btn_rect.getWidth(), btn_rect.getHeight()); + btn->setRect(btn_rect); + left = btn_rect.mLeft + btn_rect.getWidth() + h_pad; + mControlPanel->addChild(btn, -1); } - if(ignore_btn) + if (mIsScriptDialog && ignore_btn != NULL) { - LLRect btn_rect(ignore_btn->getRect()); - btn_rect.setOriginAndSize(getRect().getWidth() - btn_rect.getWidth() - left_pad, - BOTTOM_PAD,// move button at the bottom edge - btn_rect.getWidth(), btn_rect.getHeight()); - ignore_btn->setRect(btn_rect); - addChild(ignore_btn, -1); + LLRect ignore_btn_rect(ignore_btn->getRect()); + S32 buttons_per_row = max_width / BUTTON_WIDTH; //assume that h_pad far less than BUTTON_WIDTH + S32 ignore_btn_left = buttons_per_row * BUTTON_WIDTH + (buttons_per_row - 1) * h_pad - ignore_btn_rect.getWidth(); + if (ignore_btn_left + ignore_btn_rect.getWidth() > max_width)// make sure that the ignore button is in panel + { + ignore_btn_left = max_width - ignore_btn_rect.getWidth() - 2 * HPAD; + } + ignore_btn_rect.setOriginAndSize(ignore_btn_left, BOTTOM_PAD,// always move ignore button at the bottom + ignore_btn_rect.getWidth(), ignore_btn_rect.getHeight()); + ignore_btn->setRect(ignore_btn_rect); + mControlPanel->addChild(ignore_btn, -1); } } @@ -280,20 +346,124 @@ void LLToastNotifyPanel::adjustPanelForScriptNotice(S32 button_panel_width, S32 { //adjust layout // we need to keep min width and max height to make visible all buttons, because width of the toast can not be changed - LLRect button_rect = mControlPanel->getRect(); reshape(getRect().getWidth(), mInfoPanel->getRect().getHeight() + button_panel_height + VPAD); - button_rect.set(0, button_rect.mBottom + button_panel_height, button_rect.getWidth(), button_rect.mBottom); - mControlPanel->reshape(button_rect.getWidth(), button_panel_height); - mControlPanel->setRect(button_rect); + mControlPanel->reshape( button_panel_width, button_panel_height); } void LLToastNotifyPanel::adjustPanelForTipNotice() { LLRect info_rect = mInfoPanel->getRect(); LLRect this_rect = getRect(); - + //we don't need display ControlPanel for tips because they doesn't contain any buttons. mControlPanel->setVisible(FALSE); reshape(getRect().getWidth(), mInfoPanel->getRect().getHeight()); + + if (mNotification->getPayload().has("respond_on_mousedown") + && mNotification->getPayload()["respond_on_mousedown"] ) + { + mInfoPanel->setMouseDownCallback( + boost::bind(&LLNotification::respond, + mNotification, + mNotification->getResponseTemplate())); + } +} + +typedef std::set<std::string> button_name_set_t; +typedef std::map<std::string, button_name_set_t> disable_button_map_t; + +disable_button_map_t initUserGiveItemDisableButtonMap() +{ + // see EXT-5905 for disable rules + + disable_button_map_t disable_map; + button_name_set_t buttons; + + buttons.insert("Show"); + disable_map.insert(std::make_pair("Show", buttons)); + + buttons.insert("Discard"); + disable_map.insert(std::make_pair("Discard", buttons)); + + buttons.insert("Mute"); + disable_map.insert(std::make_pair("Mute", buttons)); + + return disable_map; +} + +disable_button_map_t initTeleportOfferedDisableButtonMap() +{ + disable_button_map_t disable_map; + button_name_set_t buttons; + + buttons.insert("Teleport"); + buttons.insert("Cancel"); + + disable_map.insert(std::make_pair("Teleport", buttons)); + disable_map.insert(std::make_pair("Cancel", buttons)); + + return disable_map; +} + +disable_button_map_t initFriendshipOfferedDisableButtonMap() +{ + disable_button_map_t disable_map; + button_name_set_t buttons; + + buttons.insert("Accept"); + buttons.insert("Decline"); + + disable_map.insert(std::make_pair("Accept", buttons)); + disable_map.insert(std::make_pair("Decline", buttons)); + + return disable_map; +} + +button_name_set_t getButtonDisableList(const std::string& notification_name, const std::string& button_name) +{ + static disable_button_map_t user_give_item_disable_map = initUserGiveItemDisableButtonMap(); + static disable_button_map_t teleport_offered_disable_map = initTeleportOfferedDisableButtonMap(); + static disable_button_map_t friendship_offered_disable_map = initFriendshipOfferedDisableButtonMap(); + + disable_button_map_t::const_iterator it; + disable_button_map_t::const_iterator it_end; + disable_button_map_t search_map; + + if("UserGiveItem" == notification_name) + { + search_map = user_give_item_disable_map; + } + else if("TeleportOffered" == notification_name) + { + search_map = teleport_offered_disable_map; + } + else if("OfferFriendship" == notification_name) + { + search_map = friendship_offered_disable_map; + } + + it = search_map.find(button_name); + it_end = search_map.end(); + + if(it_end != it) + { + return it->second; + } + return button_name_set_t(); +} + +void LLToastNotifyPanel::disableButtons(const std::string& notification_name, const std::string& selected_button) +{ + button_name_set_t buttons = getButtonDisableList(notification_name, selected_button); + + std::vector<index_button_pair_t>::const_iterator it = mButtons.begin(); + for ( ; it != mButtons.end(); it++) + { + LLButton* btn = it->second; + if(buttons.find(btn->getName()) != buttons.end()) + { + btn->setEnabled(FALSE); + } + } } // static @@ -308,5 +478,89 @@ void LLToastNotifyPanel::onClickButton(void* data) { response[button_name] = true; } + + bool is_reusable = self->mNotification->isReusable(); + // When we call respond(), LLOfferInfo will delete itself in inventory_offer_callback(), + // lets copy it while it's still valid. + LLOfferInfo* old_info = static_cast<LLOfferInfo*>(self->mNotification->getResponder()); + LLOfferInfo* new_info = NULL; + if(is_reusable && old_info) + { + new_info = new LLOfferInfo(*old_info); + self->mNotification->setResponder(new_info); + } + self->mNotification->respond(response); + + if(is_reusable) + { + sButtonClickSignal(self->mNotification->getID(), button_name); + } + else + { + // disable all buttons + self->mControlPanel->setEnabled(FALSE); + } +} + +void LLToastNotifyPanel::onToastPanelButtonClicked(const LLUUID& notification_id, const std::string btn_name) +{ + if(mNotification->getID() == notification_id) + { + disableButtons(mNotification->getName(), btn_name); + } +} + +void LLToastNotifyPanel::disableRespondedOptions(LLNotificationPtr& notification) +{ + LLSD response = notification->getResponse(); + for (LLSD::map_const_iterator response_it = response.beginMap(); + response_it != response.endMap(); ++response_it) + { + if (response_it->second.isBoolean() && response_it->second.asBoolean()) + { + // that after multiple responses there can be many pressed buttons + // need to process them all + disableButtons(notification->getName(), response_it->first); + } + } +} + + +////////////////////////////////////////////////////////////////////////// + +LLIMToastNotifyPanel::LLIMToastNotifyPanel(LLNotificationPtr& pNotification, const LLUUID& session_id, const LLRect& rect /* = LLRect::null */) + : mSessionID(session_id), LLToastNotifyPanel(pNotification, rect) +{ + mTextBox->setFollowsAll(); } + +LLIMToastNotifyPanel::~LLIMToastNotifyPanel() +{ + // We shouldn't delete notification when IM floater exists + // since that notification will be reused by IM floater. + // This may happened when IM floater reloads messages, exactly when user + // changes layout of IM chat log(disable/enable plaintext mode). + // See EXT-6500 + LLIMFloater* im_floater = LLIMFloater::findInstance(mSessionID); + if (im_floater != NULL && !im_floater->isDead()) + { + mCloseNotificationOnDestroy = false; + } +} + +void LLIMToastNotifyPanel::reshape(S32 width, S32 height, BOOL called_from_parent /* = TRUE */) +{ + S32 text_height = mTextBox->getTextBoundingRect().getHeight(); + S32 widget_height = mTextBox->getRect().getHeight(); + S32 delta = text_height - widget_height; + LLRect rc = getRect(); + + rc.setLeftTopAndSize(rc.mLeft, rc.mTop, width, height + delta); + height = rc.getHeight(); + width = rc.getWidth(); + + LLToastPanel::reshape(width, height, called_from_parent); +} + +// EOF diff --git a/indra/newview/lltoastnotifypanel.h b/indra/newview/lltoastnotifypanel.h index 1f50c21f6f..a6644c0a7a 100644 --- a/indra/newview/lltoastnotifypanel.h +++ b/indra/newview/lltoastnotifypanel.h @@ -49,13 +49,28 @@ class LLNotificationForm; * Notification panel should be used for notifications that require a response from the user. * * Replaces class LLNotifyBox. + * + * @deprecated this class will be removed after all toast panel types are + * implemented in separate classes. */ class LLToastNotifyPanel: public LLToastPanel { public: - LLToastNotifyPanel(LLNotificationPtr&); + /** + * Constructor for LLToastNotifyPanel. + * + * @param pNotification a shared pointer to LLNotification + * @param rect an initial rectangle of the toast panel. + * If it is null then a loaded from xml rectangle will be used. + * @see LLNotification + * @deprecated if you intend to instantiate LLToastNotifyPanel - it's point to + * implement right class for desired toast panel. @see LLGenericTipPanel as example. + */ + LLToastNotifyPanel(LLNotificationPtr& pNotification, const LLRect& rect = LLRect::null); virtual ~LLToastNotifyPanel(); + LLPanel * getControlPanel() { return mControlPanel; } + void setCloseNotificationOnDestroy(bool close) { mCloseNotificationOnDestroy = close; } protected: LLButton* createButton(const LLSD& form_element, BOOL is_option); @@ -67,13 +82,26 @@ protected: }; std::vector<InstanceAndS32*> mBtnCallbackData; -private: + bool mCloseNotificationOnDestroy; typedef std::pair<int,LLButton*> index_button_pair_t; void adjustPanelForScriptNotice(S32 max_width, S32 max_height); void adjustPanelForTipNotice(); void addDefaultButton(); - void updateButtonsLayout(const std::vector<index_button_pair_t>& buttons, S32 left_pad, S32 top); + /* + * It lays out buttons of the notification in mControlPanel. + * Buttons will be placed from BOTTOM to TOP. + * @param h_pad horizontal space between buttons. It is depend on number of buttons. + * @param buttons vector of button to be added. + */ + void updateButtonsLayout(const std::vector<index_button_pair_t>& buttons, S32 h_pad); + + /** + * Disable specific button(s) based on notification name and clicked button + */ + void disableButtons(const std::string& notification_name, const std::string& selected_button); + + std::vector<index_button_pair_t> mButtons; // panel elements LLTextBase* mTextBox; @@ -83,6 +111,21 @@ private: // internal handler for button being clicked static void onClickButton(void* data); + typedef boost::signals2::signal <void (const LLUUID& notification_id, const std::string btn_name)> + button_click_signal_t; + static button_click_signal_t sButtonClickSignal; + boost::signals2::connection mButtonClickConnection; + + /** + * handle sButtonClickSignal (to disable buttons) across all panels with given notification_id + */ + void onToastPanelButtonClicked(const LLUUID& notification_id, const std::string btn_name); + + /** + * Process response data. Will disable selected options + */ + void disableRespondedOptions(LLNotificationPtr& notification); + bool mIsTip; bool mAddedDefaultBtn; bool mIsScriptDialog; @@ -96,4 +139,18 @@ private: static const LLFontGL* sFontSmall; }; +class LLIMToastNotifyPanel : public LLToastNotifyPanel +{ +public: + + LLIMToastNotifyPanel(LLNotificationPtr& pNotification, const LLUUID& session_id, const LLRect& rect = LLRect::null); + + ~LLIMToastNotifyPanel(); + + /*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE); + +protected: + LLUUID mSessionID; +}; + #endif /* LLTOASTNOTIFYPANEL_H_ */ diff --git a/indra/newview/lltoastpanel.cpp b/indra/newview/lltoastpanel.cpp index 755e647777..71598b3169 100644 --- a/indra/newview/lltoastpanel.cpp +++ b/indra/newview/lltoastpanel.cpp @@ -32,14 +32,15 @@ #include "llviewerprecompiledheaders.h" -#include "lltoastpanel.h" - +#include "llpanelgenerictip.h" +#include "llpanelonlinestatus.h" #include "llnotifications.h" +#include "lltoastpanel.h" //static const S32 LLToastPanel::MIN_PANEL_HEIGHT = 40; // VPAD(4)*2 + ICON_HEIGHT(32) -LLToastPanel::LLToastPanel(LLNotificationPtr& notification) +LLToastPanel::LLToastPanel(const LLNotificationPtr& notification) { mNotification = notification; } @@ -91,3 +92,30 @@ void LLToastPanel::snapToMessageHeight(LLTextBase* message, S32 maxLineCount) } } +// static +LLToastPanel* LLToastPanel::buidPanelFromNotification( + const LLNotificationPtr& notification) +{ + LLToastPanel* res = NULL; + + //process tip toast panels + if ("notifytip" == notification->getType()) + { + // if it is online/offline notification + if ("FriendOffline" == notification->getName() || "FriendOnline" == notification->getName()) + { + res = new LLPanelOnlineStatus(notification); + } + // in all other case we use generic tip panel + else + { + res = new LLPanelGenericTip(notification); + } + } + /* + else if(...) + create all other specific non-public toast panel + */ + + return res; +} diff --git a/indra/newview/lltoastpanel.h b/indra/newview/lltoastpanel.h index f1dd7d7a86..54243e52fa 100644 --- a/indra/newview/lltoastpanel.h +++ b/indra/newview/lltoastpanel.h @@ -53,13 +53,21 @@ public: */ class LLToastPanel: public LLPanel { public: - LLToastPanel(LLNotificationPtr&); + LLToastPanel(const LLNotificationPtr&); virtual ~LLToastPanel() = 0; virtual std::string getTitle(); virtual const LLUUID& getID(); static const S32 MIN_PANEL_HEIGHT; + + /** + * Builder method for constructing notification specific panels. + * Normally type of created panels shouldn't be publicated and should be hidden + * from other functionality. + */ + static LLToastPanel* buidPanelFromNotification( + const LLNotificationPtr& notification); protected: LLNotificationPtr mNotification; void snapToMessageHeight(LLTextBase* message, S32 maxLineCount); diff --git a/indra/newview/lltoolbar.cpp b/indra/newview/lltoolbar.cpp index 404eab9249..d45915499a 100644 --- a/indra/newview/lltoolbar.cpp +++ b/indra/newview/lltoolbar.cpp @@ -212,23 +212,16 @@ void LLToolBar::layoutButtons() // this function may be called before postBuild(), in which case mResizeHandle won't have been set up yet. if(mResizeHandle != NULL) { - if(!gViewerWindow->getWindow()->getFullscreen()) - { - // Only when running in windowed mode on the Mac, leave room for a resize widget on the right edge of the bar. - width -= RESIZE_HANDLE_WIDTH; - - LLRect r; - r.mLeft = width - pad; - r.mBottom = 0; - r.mRight = r.mLeft + RESIZE_HANDLE_WIDTH; - r.mTop = r.mBottom + RESIZE_HANDLE_HEIGHT; - mResizeHandle->setRect(r); - mResizeHandle->setVisible(TRUE); - } - else - { - mResizeHandle->setVisible(FALSE); - } + // Only when running in windowed mode on the Mac, leave room for a resize widget on the right edge of the bar. + width -= RESIZE_HANDLE_WIDTH; + + LLRect r; + r.mLeft = width - pad; + r.mBottom = 0; + r.mRight = r.mLeft + RESIZE_HANDLE_WIDTH; + r.mTop = r.mBottom + RESIZE_HANDLE_HEIGHT; + mResizeHandle->setRect(r); + mResizeHandle->setVisible(TRUE); } #endif // LL_DARWIN } diff --git a/indra/newview/lltoolcomp.cpp b/indra/newview/lltoolcomp.cpp index fff18df442..d05bfc53e5 100644 --- a/indra/newview/lltoolcomp.cpp +++ b/indra/newview/lltoolcomp.cpp @@ -54,6 +54,7 @@ #include "llviewerobject.h" #include "llviewerwindow.h" #include "llagent.h" +#include "llagentcamera.h" #include "llfloatertools.h" #include "llviewercontrol.h" @@ -784,7 +785,7 @@ BOOL LLToolCompGun::handleScrollWheel(S32 x, S32 y, S32 clicks) { if (clicks > 0) { - gAgent.changeCameraToDefault(); + gAgentCamera.changeCameraToDefault(); } return TRUE; diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp index 125c62474e..c862c02b82 100644 --- a/indra/newview/lltooldraganddrop.cpp +++ b/indra/newview/lltooldraganddrop.cpp @@ -37,7 +37,7 @@ #include "llnotificationsutil.h" // project headers #include "llagent.h" -#include "llagentui.h" +#include "llagentcamera.h" #include "llagentwearables.h" #include "llappearancemgr.h" #include "lldictionary.h" @@ -45,29 +45,26 @@ #include "llfloaterreg.h" #include "llfloatertools.h" #include "llgesturemgr.h" +#include "llgiveinventory.h" #include "llhudmanager.h" #include "llhudeffecttrail.h" #include "llimview.h" #include "llinventorybridge.h" -#include "llmutelist.h" +#include "llinventorydefines.h" +#include "llinventoryfunctions.h" #include "llpreviewnotecard.h" -#include "llrecentpeople.h" #include "llrootview.h" #include "llselectmgr.h" #include "lltoolmgr.h" #include "lltooltip.h" #include "lltrans.h" #include "llviewerobjectlist.h" +#include "llviewerregion.h" #include "llviewerstats.h" #include "llviewerwindow.h" #include "llvoavatarself.h" #include "llworld.h" -// MAX ITEMS is based on (sizeof(uuid)+2) * count must be < MTUBYTES -// or 18 * count < 1200 => count < 1200/18 => 66. I've cut it down a -// bit from there to give some pad. -const S32 MAX_ITEMS = 42; - // syntactic sugar #define callMemberFunction(object,ptrToMember) ((object).*(ptrToMember)) @@ -79,7 +76,7 @@ public: virtual bool operator()(LLInventoryCategory* cat, LLInventoryItem* item) { - if(cat && (cat->getPreferredType() == LLFolderType::FT_NONE)) + if (cat && (cat->getPreferredType() == LLFolderType::FT_NONE)) { return true; } @@ -95,8 +92,8 @@ public: virtual bool operator()(LLInventoryCategory* cat, LLInventoryItem* item) { - if(item) return true; - if(cat && (cat->getPreferredType() == LLFolderType::FT_NONE)) + if (item) return true; + if (cat && (cat->getPreferredType() == LLFolderType::FT_NONE)) { return true; } @@ -123,18 +120,18 @@ bool LLDroppableItem::operator()(LLInventoryCategory* cat, LLInventoryItem* item) { bool allowed = false; - if(item) + if (item) { allowed = itemTransferCommonlyAllowed(item); - if(allowed + if (allowed && mIsTransfer && !item->getPermissions().allowOperationBy(PERM_TRANSFER, gAgent.getID())) { allowed = false; } - if(allowed && !item->getPermissions().allowCopyBy(gAgent.getID())) + if (allowed && !item->getPermissions().allowCopyBy(gAgent.getID())) { ++mCountLosing; } @@ -142,29 +139,6 @@ bool LLDroppableItem::operator()(LLInventoryCategory* cat, return allowed; } -class LLUncopyableItems : public LLInventoryCollectFunctor -{ -public: - LLUncopyableItems() {} - virtual ~LLUncopyableItems() {} - virtual bool operator()(LLInventoryCategory* cat, LLInventoryItem* item); -}; - -bool LLUncopyableItems::operator()(LLInventoryCategory* cat, - LLInventoryItem* item) -{ - bool uncopyable = false; - if(item) - { - if (itemTransferCommonlyAllowed(item) && - !item->getPermissions().allowCopyBy(gAgent.getID())) - { - uncopyable = true; - } - } - return uncopyable; -} - class LLDropCopyableItems : public LLInventoryCollectFunctor { public: @@ -179,10 +153,10 @@ bool LLDropCopyableItems::operator()( LLInventoryItem* item) { bool allowed = false; - if(item) + if (item) { allowed = itemTransferCommonlyAllowed(item); - if(allowed && + if (allowed && !item->getPermissions().allowCopyBy(gAgent.getID())) { // whoops, can't copy it - don't allow it. @@ -192,47 +166,16 @@ bool LLDropCopyableItems::operator()( return allowed; } -class LLGiveable : public LLInventoryCollectFunctor -{ -public: - LLGiveable() : mCountLosing(0) {} - virtual ~LLGiveable() {} - virtual bool operator()(LLInventoryCategory* cat, LLInventoryItem* item); - - S32 countNoCopy() const { return mCountLosing; } -protected: - S32 mCountLosing; -}; - -bool LLGiveable::operator()(LLInventoryCategory* cat, LLInventoryItem* item) -{ - // All categories can be given. - if (cat) - return true; - - bool allowed = false; - if(item) - { - allowed = itemTransferCommonlyAllowed(item); - if(allowed && - !item->getPermissions().allowOperationBy(PERM_TRANSFER, - gAgent.getID())) - { - allowed = FALSE; - } - if(allowed && - !item->getPermissions().allowCopyBy(gAgent.getID())) - { - ++mCountLosing; - } - } - return allowed; -} - +// Starts a fetch on folders and items. This is really not used +// as an observer in the traditional sense; we're just using it to +// request a fetch and we don't care about when/if the response arrives. class LLCategoryFireAndForget : public LLInventoryFetchComboObserver { public: - LLCategoryFireAndForget() {} + LLCategoryFireAndForget(const uuid_vec_t& folder_ids, + const uuid_vec_t& item_ids) : + LLInventoryFetchComboObserver(folder_ids, item_ids) + {} ~LLCategoryFireAndForget() {} virtual void done() { @@ -241,11 +184,13 @@ public: } }; -class LLCategoryDropObserver : public LLInventoryFetchObserver +class LLCategoryDropObserver : public LLInventoryFetchItemsObserver { public: LLCategoryDropObserver( + const uuid_vec_t& ids, const LLUUID& obj_id, LLToolDragAndDrop::ESource src) : + LLInventoryFetchItemsObserver(ids), mObjectID(obj_id), mSource(src) {} @@ -261,16 +206,16 @@ void LLCategoryDropObserver::done() { gInventory.removeObserver(this); LLViewerObject* dst_obj = gObjectList.findObject(mObjectID); - if(dst_obj) + if (dst_obj) { // *FIX: coalesce these... LLInventoryItem* item = NULL; - item_ref_t::iterator it = mComplete.begin(); - item_ref_t::iterator end = mComplete.end(); + uuid_vec_t::iterator it = mComplete.begin(); + uuid_vec_t::iterator end = mComplete.end(); for(; it < end; ++it) { item = gInventory.getItem(*it); - if(item) + if (item) { LLToolDragAndDrop::dropInventory( dst_obj, @@ -282,7 +227,7 @@ void LLCategoryDropObserver::done() } delete this; } - +/* Doesn't seem to be used anymore. class LLCategoryDropDescendentsObserver : public LLInventoryFetchDescendentsObserver { public: @@ -303,8 +248,8 @@ void LLCategoryDropDescendentsObserver::done() { gInventory.removeObserver(this); - folder_ref_t::iterator it = mCompleteFolders.begin(); - folder_ref_t::iterator end = mCompleteFolders.end(); + uuid_vec_t::iterator it = mComplete.begin(); + uuid_vec_t::iterator end = mComplete.end(); LLViewerInventoryCategory::cat_array_t cats; LLViewerInventoryItem::item_array_t items; for(; it != end; ++it) @@ -317,20 +262,20 @@ void LLCategoryDropDescendentsObserver::done() } S32 count = items.count(); - if(count) + if (count) { std::set<LLUUID> unique_ids; for(S32 i = 0; i < count; ++i) { unique_ids.insert(items.get(i)->getUUID()); } - LLInventoryFetchObserver::item_ref_t ids; - std::back_insert_iterator<LLInventoryFetchObserver::item_ref_t> copier(ids); + uuid_vec_t ids; + std::back_insert_iterator<uuid_vec_t> copier(ids); std::copy(unique_ids.begin(), unique_ids.end(), copier); LLCategoryDropObserver* dropper; - dropper = new LLCategoryDropObserver(mObjectID, mSource); - dropper->fetchItems(ids); - if(dropper->isEverythingComplete()) + dropper = new LLCategoryDropObserver(ids, mObjectID, mSource); + dropper->startFetch(); + if (dropper->isDone()) { dropper->done(); } @@ -341,6 +286,7 @@ void LLCategoryDropDescendentsObserver::done() } delete this; } +*/ LLToolDragAndDrop::DragAndDropEntry::DragAndDropEntry(dragOrDrop3dImpl f_none, dragOrDrop3dImpl f_self, @@ -410,9 +356,12 @@ void LLToolDragAndDrop::setDragStart(S32 x, S32 y) BOOL LLToolDragAndDrop::isOverThreshold(S32 x,S32 y) { - const S32 MIN_MANHATTAN_DIST = 3; - S32 manhattan_dist = llabs( x - mDragStartX ) + llabs( y - mDragStartY ); - return manhattan_dist >= MIN_MANHATTAN_DIST; + static LLCachedControl<S32> drag_and_drop_threshold(gSavedSettings,"DragAndDropDistanceThreshold"); + + S32 mouse_delta_x = x - mDragStartX; + S32 mouse_delta_y = y - mDragStartY; + + return (mouse_delta_x * mouse_delta_x) + (mouse_delta_y * mouse_delta_y) > drag_and_drop_threshold * drag_and_drop_threshold; } void LLToolDragAndDrop::beginDrag(EDragAndDropType type, @@ -421,7 +370,7 @@ void LLToolDragAndDrop::beginDrag(EDragAndDropType type, const LLUUID& source_id, const LLUUID& object_id) { - if(type == DAD_NONE) + if (type == DAD_NONE) { llwarns << "Attempted to start drag without a cargo type" << llendl; return; @@ -437,24 +386,24 @@ void LLToolDragAndDrop::beginDrag(EDragAndDropType type, setMouseCapture( TRUE ); LLToolMgr::getInstance()->setTransientTool( this ); mCursor = UI_CURSOR_NO; - if((mCargoTypes[0] == DAD_CATEGORY) + if ((mCargoTypes[0] == DAD_CATEGORY) && ((mSource == SOURCE_AGENT) || (mSource == SOURCE_LIBRARY))) { LLInventoryCategory* cat = gInventory.getCategory(cargo_id); // go ahead and fire & forget the descendents if we are not // dragging a protected folder. - if(cat) + if (cat) { LLViewerInventoryCategory::cat_array_t cats; LLViewerInventoryItem::item_array_t items; LLNoPreferredTypeOrItem is_not_preferred; - LLInventoryFetchComboObserver::folder_ref_t folder_ids; - LLInventoryFetchComboObserver::item_ref_t item_ids; - if(is_not_preferred(cat, NULL)) + uuid_vec_t folder_ids; + uuid_vec_t item_ids; + if (is_not_preferred(cat, NULL)) { folder_ids.push_back(cargo_id); } - gInventory.collectDescendentsIf( + gInventory.collectDescendentsIf ( cargo_id, cats, items, @@ -471,10 +420,11 @@ void LLToolDragAndDrop::beginDrag(EDragAndDropType type, { item_ids.push_back(items.get(i)->getUUID()); } - if(!folder_ids.empty() || !item_ids.empty()) + if (!folder_ids.empty() || !item_ids.empty()) { - LLCategoryFireAndForget fetcher; - fetcher.fetch(folder_ids, item_ids); + LLCategoryFireAndForget *fetcher = new LLCategoryFireAndForget(folder_ids, item_ids); + fetcher->startFetch(); + delete fetcher; } } } @@ -482,7 +432,7 @@ void LLToolDragAndDrop::beginDrag(EDragAndDropType type, void LLToolDragAndDrop::beginMultiDrag( const std::vector<EDragAndDropType> types, - const std::vector<LLUUID>& cargo_ids, + const uuid_vec_t& cargo_ids, ESource source, const LLUUID& source_id) { @@ -492,7 +442,7 @@ void LLToolDragAndDrop::beginMultiDrag( std::vector<EDragAndDropType>::const_iterator types_it; for (types_it = types.begin(); types_it != types.end(); ++types_it) { - if(DAD_NONE == *types_it) + if (DAD_NONE == *types_it) { llwarns << "Attempted to start drag without a cargo type" << llendl; return; @@ -506,7 +456,7 @@ void LLToolDragAndDrop::beginMultiDrag( setMouseCapture( TRUE ); LLToolMgr::getInstance()->setTransientTool( this ); mCursor = UI_CURSOR_NO; - if((mSource == SOURCE_AGENT) || (mSource == SOURCE_LIBRARY)) + if ((mSource == SOURCE_AGENT) || (mSource == SOURCE_LIBRARY)) { // find categories (i.e. inventory folders) in the cargo. LLInventoryCategory* cat = NULL; @@ -515,16 +465,16 @@ void LLToolDragAndDrop::beginMultiDrag( for(S32 i = 0; i < count; ++i) { cat = gInventory.getCategory(cargo_ids[i]); - if(cat) + if (cat) { LLViewerInventoryCategory::cat_array_t cats; LLViewerInventoryItem::item_array_t items; LLNoPreferredType is_not_preferred; - if(is_not_preferred(cat, NULL)) + if (is_not_preferred(cat, NULL)) { cat_ids.insert(cat->getUUID()); } - gInventory.collectDescendentsIf( + gInventory.collectDescendentsIf ( cat->getUUID(), cats, items, @@ -537,14 +487,13 @@ void LLToolDragAndDrop::beginMultiDrag( } } } - if(!cat_ids.empty()) + if (!cat_ids.empty()) { - LLInventoryFetchComboObserver::folder_ref_t folder_ids; - LLInventoryFetchComboObserver::item_ref_t item_ids; - std::back_insert_iterator<LLInventoryFetchDescendentsObserver::folder_ref_t> copier(folder_ids); + uuid_vec_t folder_ids; + uuid_vec_t item_ids; + std::back_insert_iterator<uuid_vec_t> copier(folder_ids); std::copy(cat_ids.begin(), cat_ids.end(), copier); - LLCategoryFireAndForget fetcher; - fetcher.fetch(folder_ids, item_ids); + LLCategoryFireAndForget fetcher(folder_ids, item_ids); } } } @@ -569,7 +518,7 @@ void LLToolDragAndDrop::onMouseCaptureLost() BOOL LLToolDragAndDrop::handleMouseUp( S32 x, S32 y, MASK mask ) { - if( hasMouseCapture() ) + if (hasMouseCapture()) { EAcceptance acceptance = ACCEPT_NO; dragOrDrop( x, y, mask, TRUE, &acceptance ); @@ -580,7 +529,7 @@ BOOL LLToolDragAndDrop::handleMouseUp( S32 x, S32 y, MASK mask ) ECursorType LLToolDragAndDrop::acceptanceToCursor( EAcceptance acceptance ) { - switch( acceptance ) + switch (acceptance) { case ACCEPT_YES_MULTI: if (mCargoIDs.size() > 1) @@ -697,7 +646,7 @@ void LLToolDragAndDrop::dragOrDrop( S32 x, S32 y, MASK mask, BOOL drop, mToolTipMsg.clear(); - if(top_view) + if (top_view) { handled = TRUE; @@ -762,7 +711,7 @@ void LLToolDragAndDrop::dragOrDrop( S32 x, S32 y, MASK mask, BOOL drop, } } - if(!handled) + if (!handled) { handled = TRUE; @@ -820,7 +769,7 @@ void LLToolDragAndDrop::dragOrDrop( S32 x, S32 y, MASK mask, BOOL drop, } } - if ( !handled ) + if (!handled) { dragOrDrop3D( x, y, mask, drop, acceptance ); } @@ -873,7 +822,7 @@ void LLToolDragAndDrop::pick(const LLPickInfo& pick_info) if (hit_obj->isAttachment() && !hit_obj->isHUDAttachment()) { LLVOAvatar* avatar = LLVOAvatar::findAvatarFromAttachment( hit_obj ); - if( !avatar ) + if (!avatar) { mLastAccept = ACCEPT_NO; mCursor = UI_CURSOR_NO; @@ -885,7 +834,7 @@ void LLToolDragAndDrop::pick(const LLPickInfo& pick_info) if (hit_obj->isAvatar()) { - if(((LLVOAvatar*) hit_obj)->isSelf()) + if (((LLVOAvatar*) hit_obj)->isSelf()) { target = DT_SELF; hit_face = -1; @@ -959,7 +908,7 @@ void LLToolDragAndDrop::pick(const LLPickInfo& pick_info) gViewerWindow->getWindow()->setCursor( cursor ); mLastHitPos = pick_info.mPosGlobal; - mLastCameraPos = gAgent.getCameraPositionGlobal(); + mLastCameraPos = gAgentCamera.getCameraPositionGlobal(); } // static @@ -971,7 +920,7 @@ BOOL LLToolDragAndDrop::handleDropTextureProtections(LLViewerObject* hit_obj, // Always succeed if.... // texture is from the library // or already in the contents of the object - if(SOURCE_LIBRARY == source) + if (SOURCE_LIBRARY == source) { // dropping a texture from the library always just works. return TRUE; @@ -999,7 +948,7 @@ BOOL LLToolDragAndDrop::handleDropTextureProtections(LLViewerObject* hit_obj, if (!item) return FALSE; LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item); - if(!item->getPermissions().allowOperationBy(PERM_COPY, gAgent.getID())) + if (!item->getPermissions().allowOperationBy(PERM_COPY, gAgent.getID())) { // Check that we can add the texture as inventory to the object if (willObjectAcceptInventory(hit_obj,item) < ACCEPT_YES_COPY_SINGLE ) @@ -1007,20 +956,20 @@ BOOL LLToolDragAndDrop::handleDropTextureProtections(LLViewerObject* hit_obj, return FALSE; } // make sure the object has the texture in it's inventory. - if(SOURCE_AGENT == source) + if (SOURCE_AGENT == source) { // Remove the texture from local inventory. The server // will actually remove the item from agent inventory. gInventory.deleteObject(item->getUUID()); gInventory.notifyObservers(); } - else if(SOURCE_WORLD == source) + else if (SOURCE_WORLD == source) { // *FIX: if the objects are in different regions, and the // source region has crashed, you can bypass these // permissions. LLViewerObject* src_obj = gObjectList.findObject(src_id); - if(src_obj) + if (src_obj) { src_obj->removeInventory(item->getUUID()); } @@ -1035,7 +984,7 @@ BOOL LLToolDragAndDrop::handleDropTextureProtections(LLViewerObject* hit_obj, // TODO: Check to see if adding the item was successful; if not, then // we should return false here. } - else if(!item->getPermissions().allowOperationBy(PERM_TRANSFER, + else if (!item->getPermissions().allowOperationBy(PERM_TRANSFER, gAgent.getID())) { // Check that we can add the texture as inventory to the object @@ -1067,7 +1016,7 @@ void LLToolDragAndDrop::dropTextureAllFaces(LLViewerObject* hit_obj, } LLUUID asset_id = item->getAssetUUID(); BOOL success = handleDropTextureProtections(hit_obj, item, source, src_id); - if(!success) + if (!success) { return; } @@ -1109,7 +1058,7 @@ void LLToolDragAndDrop::dropTextureOneFace(LLViewerObject* hit_obj, } LLUUID asset_id = item->getAssetUUID(); BOOL success = handleDropTextureProtections(hit_obj, item, source, src_id); - if(!success) + if (!success) { return; } @@ -1132,32 +1081,32 @@ void LLToolDragAndDrop::dropScript(LLViewerObject* hit_obj, { // *HACK: In order to resolve SL-22177, we need to block drags // from notecards and objects onto other objects. - if((SOURCE_WORLD == LLToolDragAndDrop::getInstance()->mSource) + if ((SOURCE_WORLD == LLToolDragAndDrop::getInstance()->mSource) || (SOURCE_NOTECARD == LLToolDragAndDrop::getInstance()->mSource)) { llwarns << "Call to LLToolDragAndDrop::dropScript() from world" << " or notecard." << llendl; return; } - if(hit_obj && item) + if (hit_obj && item) { LLPointer<LLViewerInventoryItem> new_script = new LLViewerInventoryItem(item); - if(!item->getPermissions().allowCopyBy(gAgent.getID())) + if (!item->getPermissions().allowCopyBy(gAgent.getID())) { - if(SOURCE_AGENT == source) + if (SOURCE_AGENT == source) { // Remove the script from local inventory. The server // will actually remove the item from agent inventory. gInventory.deleteObject(item->getUUID()); gInventory.notifyObservers(); } - else if(SOURCE_WORLD == source) + else if (SOURCE_WORLD == source) { // *FIX: if the objects are in different regions, and // the source region has crashed, you can bypass // these permissions. LLViewerObject* src_obj = gObjectList.findObject(src_id); - if(src_obj) + if (src_obj) { src_obj->removeInventory(item->getUUID()); } @@ -1173,7 +1122,7 @@ void LLToolDragAndDrop::dropScript(LLViewerObject* hit_obj, // VEFFECT: SetScript LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BEAM, TRUE); - effectp->setSourceObject(gAgent.getAvatarObject()); + effectp->setSourceObject(gAgentAvatarp); effectp->setTargetObject(hit_obj); effectp->setDuration(LL_HUD_DUR_SHORT); effectp->setColor(LLColor4U(gAgent.getEffectColor())); @@ -1197,7 +1146,7 @@ void LLToolDragAndDrop::dropObject(LLViewerObject* raycast_target, LLViewerInventoryItem* item; LLViewerInventoryCategory* cat; locateInventory(item, cat); - if(!item || !item->isComplete()) return; + if (!item || !item->isFinished()) return; //if (regionp // && (regionp->getRegionFlags() & REGION_FLAGS_SANDBOX)) @@ -1208,7 +1157,7 @@ void LLToolDragAndDrop::dropObject(LLViewerObject* raycast_target, // this will remove the object from inventory after rez. Only // bother with this check if we would not normally remove from // inventory. - if(!remove_from_inventory + if (!remove_from_inventory && !item->getPermissions().allowCopyBy(gAgent.getID())) { remove_from_inventory = TRUE; @@ -1219,7 +1168,7 @@ void LLToolDragAndDrop::dropObject(LLViewerObject* raycast_target, // hitting objects that were clipped by the near plane or culled // on the viewer. LLUUID ray_target_id; - if( raycast_target ) + if (raycast_target) { ray_target_id = raycast_target->getID(); } @@ -1231,7 +1180,7 @@ void LLToolDragAndDrop::dropObject(LLViewerObject* raycast_target, // Check if it's in the trash. bool is_in_trash = false; const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH); - if(gInventory.isObjectDescendentOf(item->getUUID(), trash_id)) + if (gInventory.isObjectDescendentOf(item->getUUID(), trash_id)) { is_in_trash = true; remove_from_inventory = TRUE; @@ -1289,7 +1238,7 @@ void LLToolDragAndDrop::dropObject(LLViewerObject* raycast_target, pack_permissions_slam(msg, item->getFlags(), item->getPermissions()); LLUUID folder_id = item->getParentUUID(); - if((SOURCE_LIBRARY == mSource) || (is_in_trash)) + if ((SOURCE_LIBRARY == mSource) || (is_in_trash)) { // since it's coming from the library or trash, we want to not // 'take' it back to the same place. @@ -1323,7 +1272,7 @@ void LLToolDragAndDrop::dropObject(LLViewerObject* raycast_target, gViewerWindow->getWindow()->incBusyCount(); } - if(remove_from_inventory) + if (remove_from_inventory) { // Delete it from inventory immediately so that users cannot // easily bypass copy protection in laggy situations. If the @@ -1334,7 +1283,7 @@ void LLToolDragAndDrop::dropObject(LLViewerObject* raycast_target, // VEFFECT: DropObject LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BEAM, TRUE); - effectp->setSourceObject(gAgent.getAvatarObject()); + effectp->setSourceObject(gAgentAvatarp); effectp->setPositionGlobal(mLastHitPos); effectp->setDuration(LL_HUD_DUR_SHORT); effectp->setColor(LLColor4U(gAgent.getEffectColor())); @@ -1349,7 +1298,7 @@ void LLToolDragAndDrop::dropInventory(LLViewerObject* hit_obj, { // *HACK: In order to resolve SL-22177, we need to block drags // from notecards and objects onto other objects. - if((SOURCE_WORLD == LLToolDragAndDrop::getInstance()->mSource) + if ((SOURCE_WORLD == LLToolDragAndDrop::getInstance()->mSource) || (SOURCE_NOTECARD == LLToolDragAndDrop::getInstance()->mSource)) { llwarns << "Call to LLToolDragAndDrop::dropInventory() from world" @@ -1361,9 +1310,9 @@ void LLToolDragAndDrop::dropInventory(LLViewerObject* hit_obj, time_t creation_date = time_corrected(); new_item->setCreationDate(creation_date); - if(!item->getPermissions().allowCopyBy(gAgent.getID())) + if (!item->getPermissions().allowCopyBy(gAgent.getID())) { - if(SOURCE_AGENT == source) + if (SOURCE_AGENT == source) { // Remove the inventory item from local inventory. The // server will actually remove the item from agent @@ -1371,13 +1320,13 @@ void LLToolDragAndDrop::dropInventory(LLViewerObject* hit_obj, gInventory.deleteObject(item->getUUID()); gInventory.notifyObservers(); } - else if(SOURCE_WORLD == source) + else if (SOURCE_WORLD == source) { // *FIX: if the objects are in different regions, and the // source region has crashed, you can bypass these // permissions. LLViewerObject* src_obj = gObjectList.findObject(src_id); - if(src_obj) + if (src_obj) { src_obj->removeInventory(item->getUUID()); } @@ -1397,423 +1346,13 @@ void LLToolDragAndDrop::dropInventory(LLViewerObject* hit_obj, // VEFFECT: AddToInventory LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BEAM, TRUE); - effectp->setSourceObject(gAgent.getAvatarObject()); + effectp->setSourceObject(gAgentAvatarp); effectp->setTargetObject(hit_obj); effectp->setDuration(LL_HUD_DUR_SHORT); effectp->setColor(LLColor4U(gAgent.getEffectColor())); gFloaterTools->dirty(); } -void LLToolDragAndDrop::giveInventory(const LLUUID& to_agent, - LLInventoryItem* item, - const LLUUID& im_session_id) - -{ - llinfos << "LLToolDragAndDrop::giveInventory()" << llendl; - if(!isInventoryGiveAcceptable(item)) - { - return; - } - if(item->getPermissions().allowCopyBy(gAgent.getID())) - { - // just give it away. - LLToolDragAndDrop::commitGiveInventoryItem(to_agent, item, im_session_id); - } - else - { - // ask if the agent is sure. - LLSD payload; - payload["agent_id"] = to_agent; - payload["item_id"] = item->getUUID(); - LLNotificationsUtil::add("CannotCopyWarning", LLSD(), payload, - &LLToolDragAndDrop::handleCopyProtectedItem); - } -} -// static -bool LLToolDragAndDrop::handleCopyProtectedItem(const LLSD& notification, const LLSD& response) -{ - S32 option = LLNotificationsUtil::getSelectedOption(notification, response); - LLInventoryItem* item = NULL; - switch(option) - { - case 0: // "Yes" - item = gInventory.getItem(notification["payload"]["item_id"].asUUID()); - if(item) - { - LLToolDragAndDrop::commitGiveInventoryItem(notification["payload"]["agent_id"].asUUID(), - item); - // delete it for now - it will be deleted on the server - // quickly enough. - gInventory.deleteObject(notification["payload"]["item_id"].asUUID()); - gInventory.notifyObservers(); - } - else - { - LLNotificationsUtil::add("CannotGiveItem"); - } - break; - - default: // no, cancel, whatever, who cares, not yes. - LLNotificationsUtil::add("TransactionCancelled"); - break; - } - return false; -} - -// static -void LLToolDragAndDrop::commitGiveInventoryItem(const LLUUID& to_agent, - LLInventoryItem* item, - const LLUUID& im_session_id) -{ - if(!item) return; - std::string name; - LLAgentUI::buildFullname(name); - LLUUID transaction_id; - transaction_id.generate(); - const S32 BUCKET_SIZE = sizeof(U8) + UUID_BYTES; - U8 bucket[BUCKET_SIZE]; - bucket[0] = (U8)item->getType(); - memcpy(&bucket[1], &(item->getUUID().mData), UUID_BYTES); /* Flawfinder: ignore */ - pack_instant_message( - gMessageSystem, - gAgent.getID(), - FALSE, - gAgent.getSessionID(), - to_agent, - name, - item->getName(), - IM_ONLINE, - IM_INVENTORY_OFFERED, - transaction_id, - 0, - LLUUID::null, - gAgent.getPositionAgent(), - NO_TIMESTAMP, - bucket, - BUCKET_SIZE); - gAgent.sendReliableMessage(); - - // VEFFECT: giveInventory - LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BEAM, TRUE); - effectp->setSourceObject(gAgent.getAvatarObject()); - effectp->setTargetObject(gObjectList.findObject(to_agent)); - effectp->setDuration(LL_HUD_DUR_SHORT); - effectp->setColor(LLColor4U(gAgent.getEffectColor())); - gFloaterTools->dirty(); - - LLMuteList::getInstance()->autoRemove(to_agent, LLMuteList::AR_INVENTORY); - - // If this item was given by drag-and-drop into an IM panel, log this action in the IM panel chat. - if (im_session_id != LLUUID::null) - { - LLSD args; - gIMMgr->addSystemMessage(im_session_id, "inventory_item_offered", args); - } - - // add buddy to recent people list - LLRecentPeople::instance().add(to_agent); -} - -void LLToolDragAndDrop::giveInventoryCategory(const LLUUID& to_agent, - LLInventoryCategory* cat, - const LLUUID& im_session_id) - -{ - if(!cat) return; - llinfos << "LLToolDragAndDrop::giveInventoryCategory() - " - << cat->getUUID() << llendl; - - LLVOAvatar* my_avatar = gAgent.getAvatarObject(); - if( !my_avatar ) - { - return; - } - - // Test out how many items are being given. - LLViewerInventoryCategory::cat_array_t cats; - LLViewerInventoryItem::item_array_t items; - LLGiveable giveable; - gInventory.collectDescendentsIf(cat->getUUID(), - cats, - items, - LLInventoryModel::EXCLUDE_TRASH, - giveable); - S32 count = cats.count(); - bool complete = true; - for(S32 i = 0; i < count; ++i) - { - if(!gInventory.isCategoryComplete(cats.get(i)->getUUID())) - { - complete = false; - break; - } - } - if(!complete) - { - LLNotificationsUtil::add("IncompleteInventory"); - return; - } - count = items.count() + cats.count(); - if(count > MAX_ITEMS) - { - LLNotificationsUtil::add("TooManyItems"); - return; - } - else if(count == 0) - { - LLNotificationsUtil::add("NoItems"); - return; - } - else - { - if(0 == giveable.countNoCopy()) - { - LLToolDragAndDrop::commitGiveInventoryCategory(to_agent, cat, im_session_id); - } - else - { - LLSD args; - args["COUNT"] = llformat("%d",giveable.countNoCopy()); - LLSD payload; - payload["agent_id"] = to_agent; - payload["folder_id"] = cat->getUUID(); - LLNotificationsUtil::add("CannotCopyCountItems", args, payload, &LLToolDragAndDrop::handleCopyProtectedCategory); - } - } -} - - -// static -bool LLToolDragAndDrop::handleCopyProtectedCategory(const LLSD& notification, const LLSD& response) -{ - S32 option = LLNotificationsUtil::getSelectedOption(notification, response); - LLInventoryCategory* cat = NULL; - switch(option) - { - case 0: // "Yes" - cat = gInventory.getCategory(notification["payload"]["folder_id"].asUUID()); - if(cat) - { - LLToolDragAndDrop::commitGiveInventoryCategory(notification["payload"]["agent_id"].asUUID(), - cat); - LLViewerInventoryCategory::cat_array_t cats; - LLViewerInventoryItem::item_array_t items; - LLUncopyableItems remove; - gInventory.collectDescendentsIf(cat->getUUID(), - cats, - items, - LLInventoryModel::EXCLUDE_TRASH, - remove); - S32 count = items.count(); - for(S32 i = 0; i < count; ++i) - { - gInventory.deleteObject(items.get(i)->getUUID()); - } - gInventory.notifyObservers(); - } - else - { - LLNotificationsUtil::add("CannotGiveCategory"); - } - break; - - default: // no, cancel, whatever, who cares, not yes. - LLNotificationsUtil::add("TransactionCancelled"); - break; - } - return false; -} - -// static -void LLToolDragAndDrop::commitGiveInventoryCategory(const LLUUID& to_agent, - LLInventoryCategory* cat, - const LLUUID& im_session_id) - -{ - if(!cat) return; - llinfos << "LLToolDragAndDrop::commitGiveInventoryCategory() - " - << cat->getUUID() << llendl; - - // add buddy to recent people list - LLRecentPeople::instance().add(to_agent); - - // Test out how many items are being given. - LLViewerInventoryCategory::cat_array_t cats; - LLViewerInventoryItem::item_array_t items; - LLGiveable giveable; - gInventory.collectDescendentsIf(cat->getUUID(), - cats, - items, - LLInventoryModel::EXCLUDE_TRASH, - giveable); - - // MAX ITEMS is based on (sizeof(uuid)+2) * count must be < - // MTUBYTES or 18 * count < 1200 => count < 1200/18 => - // 66. I've cut it down a bit from there to give some pad. - S32 count = items.count() + cats.count(); - if(count > MAX_ITEMS) - { - LLNotificationsUtil::add("TooManyItems"); - return; - } - else if(count == 0) - { - LLNotificationsUtil::add("NoItems"); - return; - } - else - { - std::string name; - LLAgentUI::buildFullname(name); - LLUUID transaction_id; - transaction_id.generate(); - S32 bucket_size = (sizeof(U8) + UUID_BYTES) * (count + 1); - U8* bucket = new U8[bucket_size]; - U8* pos = bucket; - U8 type = (U8)cat->getType(); - memcpy(pos, &type, sizeof(U8)); /* Flawfinder: ignore */ - pos += sizeof(U8); - memcpy(pos, &(cat->getUUID()), UUID_BYTES); /* Flawfinder: ignore */ - pos += UUID_BYTES; - S32 i; - count = cats.count(); - for(i = 0; i < count; ++i) - { - memcpy(pos, &type, sizeof(U8)); /* Flawfinder: ignore */ - pos += sizeof(U8); - memcpy(pos, &(cats.get(i)->getUUID()), UUID_BYTES); /* Flawfinder: ignore */ - pos += UUID_BYTES; - } - count = items.count(); - for(i = 0; i < count; ++i) - { - type = (U8)items.get(i)->getType(); - memcpy(pos, &type, sizeof(U8)); /* Flawfinder: ignore */ - pos += sizeof(U8); - memcpy(pos, &(items.get(i)->getUUID()), UUID_BYTES); /* Flawfinder: ignore */ - pos += UUID_BYTES; - } - pack_instant_message( - gMessageSystem, - gAgent.getID(), - FALSE, - gAgent.getSessionID(), - to_agent, - name, - cat->getName(), - IM_ONLINE, - IM_INVENTORY_OFFERED, - transaction_id, - 0, - LLUUID::null, - gAgent.getPositionAgent(), - NO_TIMESTAMP, - bucket, - bucket_size); - gAgent.sendReliableMessage(); - delete[] bucket; - - // VEFFECT: giveInventoryCategory - LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BEAM, TRUE); - effectp->setSourceObject(gAgent.getAvatarObject()); - effectp->setTargetObject(gObjectList.findObject(to_agent)); - effectp->setDuration(LL_HUD_DUR_SHORT); - effectp->setColor(LLColor4U(gAgent.getEffectColor())); - gFloaterTools->dirty(); - - LLMuteList::getInstance()->autoRemove(to_agent, LLMuteList::AR_INVENTORY); - - // If this item was given by drag-and-drop into an IM panel, log this action in the IM panel chat. - if (im_session_id != LLUUID::null) - { - LLSD args; - gIMMgr->addSystemMessage(im_session_id, "inventory_item_offered", args); - } - } -} - -// static -BOOL LLToolDragAndDrop::isInventoryGiveAcceptable(LLInventoryItem* item) -{ - if(!item) - { - return FALSE; - } - if(!item->getPermissions().allowOperationBy(PERM_TRANSFER, gAgent.getID())) - { - return FALSE; - } - BOOL copyable = FALSE; - if(item->getPermissions().allowCopyBy(gAgent.getID())) copyable = TRUE; - - LLVOAvatarSelf* my_avatar = gAgent.getAvatarObject(); - if(!my_avatar) - { - return FALSE; - } - - BOOL acceptable = TRUE; - switch(item->getType()) - { - case LLAssetType::AT_OBJECT: - if(my_avatar->isWearingAttachment(item->getUUID())) - { - acceptable = FALSE; - } - break; - case LLAssetType::AT_BODYPART: - case LLAssetType::AT_CLOTHING: - if(!copyable && gAgentWearables.isWearingItem(item->getUUID())) - { - acceptable = FALSE; - } - break; - default: - break; - } - return acceptable; -} - -// Static -BOOL LLToolDragAndDrop::isInventoryGroupGiveAcceptable(LLInventoryItem* item) -{ - if(!item) - { - return FALSE; - } - - // These permissions are double checked in the simulator in - // LLGroupNoticeInventoryItemFetch::result(). - if(!item->getPermissions().allowOperationBy(PERM_TRANSFER, gAgent.getID())) - { - return FALSE; - } - if(!item->getPermissions().allowCopyBy(gAgent.getID())) - { - return FALSE; - } - - LLVOAvatarSelf* my_avatar = gAgent.getAvatarObject(); - if(!my_avatar) - { - return FALSE; - } - - BOOL acceptable = TRUE; - switch(item->getType()) - { - case LLAssetType::AT_OBJECT: - if(my_avatar->isWearingAttachment(item->getUUID())) - { - acceptable = FALSE; - } - break; - default: - break; - } - return acceptable; -} - // accessor that looks at permissions, copyability, and names of // inventory items to determine if a drop would be ok. EAcceptance LLToolDragAndDrop::willObjectAcceptInventory(LLViewerObject* obj, LLInventoryItem* item) @@ -1822,14 +1361,14 @@ EAcceptance LLToolDragAndDrop::willObjectAcceptInventory(LLViewerObject* obj, LL if (!item || !obj) return ACCEPT_NO; // HACK: downcast LLViewerInventoryItem* vitem = (LLViewerInventoryItem*)item; - if (!vitem->isComplete()) return ACCEPT_NO; + if (!vitem->isFinished()) return ACCEPT_NO; if (vitem->getIsLinkType()) return ACCEPT_NO; // No giving away links // deny attempts to drop from an object onto itself. This is to // help make sure that drops that are from an object to an object // don't have to worry about order of evaluation. Think of this // like check for self in assignment. - if(obj->getID() == item->getParentUUID()) + if (obj->getID() == item->getParentUUID()) { return ACCEPT_NO; } @@ -1838,19 +1377,17 @@ EAcceptance LLToolDragAndDrop::willObjectAcceptInventory(LLViewerObject* obj, LL // gAgent.getGroupID()) // && (obj->mPermModify || obj->mFlagAllowInventoryAdd)); BOOL worn = FALSE; - LLVOAvatarSelf* my_avatar = NULL; switch(item->getType()) { case LLAssetType::AT_OBJECT: - my_avatar = gAgent.getAvatarObject(); - if(my_avatar && my_avatar->isWearingAttachment(item->getUUID())) + if (isAgentAvatarValid() && gAgentAvatarp->isWearingAttachment(item->getUUID())) { worn = TRUE; } break; case LLAssetType::AT_BODYPART: case LLAssetType::AT_CLOTHING: - if(gAgentWearables.isWearingItem(item->getUUID())) + if (gAgentWearables.isWearingItem(item->getUUID())) { worn = TRUE; } @@ -1861,7 +1398,7 @@ EAcceptance LLToolDragAndDrop::willObjectAcceptInventory(LLViewerObject* obj, LL const LLPermissions& perm = item->getPermissions(); BOOL modify = (obj->permModify() || obj->flagAllowInventoryAdd()); BOOL transfer = FALSE; - if((obj->permYouOwner() && (perm.getOwner() == gAgent.getID())) + if ((obj->permYouOwner() && (perm.getOwner() == gAgent.getID())) || perm.allowOperationBy(PERM_TRANSFER, gAgent.getID())) { transfer = TRUE; @@ -1869,15 +1406,15 @@ EAcceptance LLToolDragAndDrop::willObjectAcceptInventory(LLViewerObject* obj, LL BOOL volume = (LL_PCODE_VOLUME == obj->getPCode()); BOOL attached = obj->isAttachment(); BOOL unrestricted = ((perm.getMaskBase() & PERM_ITEM_UNRESTRICTED) == PERM_ITEM_UNRESTRICTED) ? TRUE : FALSE; - if(attached && !unrestricted) + if (attached && !unrestricted) { return ACCEPT_NO_LOCKED; } - else if(modify && transfer && volume && !worn) + else if (modify && transfer && volume && !worn) { return ACCEPT_YES_MULTI; } - else if(!modify) + else if (!modify) { return ACCEPT_NO_LOCKED; } @@ -1885,12 +1422,42 @@ EAcceptance LLToolDragAndDrop::willObjectAcceptInventory(LLViewerObject* obj, LL } +static void give_inventory_cb(const LLSD& notification, const LLSD& response) +{ + S32 option = LLNotificationsUtil::getSelectedOption(notification, response); + // if Cancel pressed + if (option == 1) + { + return; + } + + LLSD payload = notification["payload"]; + const LLUUID& session_id = payload["session_id"]; + const LLUUID& agent_id = payload["agent_id"]; + LLViewerInventoryItem * inv_item = gInventory.getItem(payload["item_id"]); + if (NULL == inv_item) + { + llassert(NULL != inv_item); + return; + } + + if (LLGiveInventory::doGiveInventoryItem(agent_id, inv_item, session_id)) + { + if ("avatarpicker" == payload["d&d_dest"].asString()) + { + LLFloaterReg::hideInstance("avatar_picker"); + } + LLNotificationsUtil::add("ItemsShared"); + } +} + // function used as drag-and-drop handler for simple agent give inventory requests //static bool LLToolDragAndDrop::handleGiveDragAndDrop(LLUUID dest_agent, LLUUID session_id, BOOL drop, EDragAndDropType cargo_type, void* cargo_data, - EAcceptance* accept) + EAcceptance* accept, + const LLSD& dest) { // check the type switch(cargo_type) @@ -1908,14 +1475,28 @@ bool LLToolDragAndDrop::handleGiveDragAndDrop(LLUUID dest_agent, LLUUID session_ case DAD_CALLINGCARD: { LLViewerInventoryItem* inv_item = (LLViewerInventoryItem*)cargo_data; - if(gInventory.getItem(inv_item->getUUID()) - && LLToolDragAndDrop::isInventoryGiveAcceptable(inv_item)) + if (gInventory.getItem(inv_item->getUUID()) + && LLGiveInventory::isInventoryGiveAcceptable(inv_item)) { // *TODO: get multiple object transfers working *accept = ACCEPT_YES_COPY_SINGLE; - if(drop) + if (drop) { - LLToolDragAndDrop::giveInventory(dest_agent, inv_item, session_id); + LLIMModel::LLIMSession * session = LLIMModel::instance().findIMSession(session_id); + if (NULL == session) + { + llassert(NULL != session); + return false; + } + LLSD substitutions; + substitutions["RESIDENTS"] = session->mName; + substitutions["ITEMS"] = inv_item->getName(); + LLSD payload; + payload["agent_id"] = dest_agent; + payload["item_id"] = inv_item->getUUID(); + payload["session_id"] = session_id; + payload["d&d_dest"] = dest.asString(); + LLNotificationsUtil::add("ShareItemsConfirmation", substitutions, payload, &give_inventory_cb); } } else @@ -1931,13 +1512,13 @@ bool LLToolDragAndDrop::handleGiveDragAndDrop(LLUUID dest_agent, LLUUID session_ case DAD_CATEGORY: { LLViewerInventoryCategory* inv_cat = (LLViewerInventoryCategory*)cargo_data; - if( gInventory.getCategory( inv_cat->getUUID() ) ) + if (gInventory.getCategory(inv_cat->getUUID())) { // *TODO: get multiple object transfers working *accept = ACCEPT_YES_COPY_SINGLE; - if(drop) + if (drop) { - LLToolDragAndDrop::giveInventoryCategory(dest_agent, inv_cat, session_id); + LLGiveInventory::doGiveInventoryCategory(dest_agent, inv_cat, session_id); } } else @@ -1976,7 +1557,7 @@ EAcceptance LLToolDragAndDrop::dad3dRezAttachmentFromInv( { lldebugs << "LLToolDragAndDrop::dad3dRezAttachmentFromInv()" << llendl; // must be in the user's inventory - if(mSource != SOURCE_AGENT && mSource != SOURCE_LIBRARY) + if (mSource != SOURCE_AGENT && mSource != SOURCE_LIBRARY) { return ACCEPT_NO; } @@ -1984,25 +1565,24 @@ EAcceptance LLToolDragAndDrop::dad3dRezAttachmentFromInv( LLViewerInventoryItem* item; LLViewerInventoryCategory* cat; locateInventory(item, cat); - if(!item || !item->isComplete()) return ACCEPT_NO; + if (!item || !item->isFinished()) return ACCEPT_NO; // must not be in the trash const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH); - if( gInventory.isObjectDescendentOf( item->getUUID(), trash_id ) ) + if (gInventory.isObjectDescendentOf(item->getUUID(), trash_id)) { return ACCEPT_NO; } // must not be already wearing it - LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); - if( !avatar || avatar->isWearingAttachment(item->getUUID()) ) + if (!isAgentAvatarValid() || gAgentAvatarp->isWearingAttachment(item->getUUID())) { return ACCEPT_NO; } - if( drop ) + if (drop) { - if(mSource == SOURCE_LIBRARY) + if (mSource == SOURCE_LIBRARY) { LLPointer<LLInventoryCallback> cb = new RezAttachmentCallback(0); copy_inventory_item( @@ -2034,10 +1614,9 @@ EAcceptance LLToolDragAndDrop::dad3dRezObjectOnLand( LLViewerInventoryItem* item; LLViewerInventoryCategory* cat; locateInventory(item, cat); - if(!item || !item->isComplete()) return ACCEPT_NO; + if (!item || !item->isFinished()) return ACCEPT_NO; - LLVOAvatarSelf* my_avatar = gAgent.getAvatarObject(); - if( !my_avatar || my_avatar->isWearingAttachment( item->getUUID() ) ) + if (!isAgentAvatarValid() || gAgentAvatarp->isWearingAttachment(item->getUUID())) { return ACCEPT_NO; } @@ -2062,7 +1641,7 @@ EAcceptance LLToolDragAndDrop::dad3dRezObjectOnLand( // check if the item can be copied. If not, send that to the sim // which will remove the inventory item. - if(!item->getPermissions().allowCopyBy(gAgent.getID())) + if (!item->getPermissions().allowCopyBy(gAgent.getID())) { accept = ACCEPT_YES_SINGLE; remove_inventory = TRUE; @@ -2070,13 +1649,13 @@ EAcceptance LLToolDragAndDrop::dad3dRezObjectOnLand( // Check if it's in the trash. const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH); - if(gInventory.isObjectDescendentOf(item->getUUID(), trash_id)) + if (gInventory.isObjectDescendentOf(item->getUUID(), trash_id)) { accept = ACCEPT_YES_SINGLE; remove_inventory = TRUE; } - if(drop) + if (drop) { dropObject(obj, TRUE, FALSE, remove_inventory); } @@ -2097,24 +1676,23 @@ EAcceptance LLToolDragAndDrop::dad3dRezObjectOnObject( LLViewerInventoryItem* item; LLViewerInventoryCategory* cat; locateInventory(item, cat); - if(!item || !item->isComplete()) return ACCEPT_NO; - LLVOAvatarSelf* my_avatar = gAgent.getAvatarObject(); - if( !my_avatar || my_avatar->isWearingAttachment( item->getUUID() ) ) + if (!item || !item->isFinished()) return ACCEPT_NO; + if (!isAgentAvatarValid() || gAgentAvatarp->isWearingAttachment(item->getUUID())) { return ACCEPT_NO; } - if((mask & MASK_CONTROL)) + if ((mask & MASK_CONTROL)) { // *HACK: In order to resolve SL-22177, we need to block drags // from notecards and objects onto other objects. - if(mSource == SOURCE_NOTECARD) + if (mSource == SOURCE_NOTECARD) { return ACCEPT_NO; } EAcceptance rv = willObjectAcceptInventory(obj, item); - if(drop && (ACCEPT_YES_SINGLE <= rv)) + if (drop && (ACCEPT_YES_SINGLE <= rv)) { dropInventory(obj, item, mSource, mSourceID); } @@ -2140,7 +1718,7 @@ EAcceptance LLToolDragAndDrop::dad3dRezObjectOnObject( // check if the item can be copied. If not, send that to the sim // which will remove the inventory item. - if(!item->getPermissions().allowCopyBy(gAgent.getID())) + if (!item->getPermissions().allowCopyBy(gAgent.getID())) { accept = ACCEPT_YES_SINGLE; remove_inventory = TRUE; @@ -2148,13 +1726,13 @@ EAcceptance LLToolDragAndDrop::dad3dRezObjectOnObject( // Check if it's in the trash. const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH); - if(gInventory.isObjectDescendentOf(item->getUUID(), trash_id)) + if (gInventory.isObjectDescendentOf(item->getUUID(), trash_id)) { accept = ACCEPT_YES_SINGLE; remove_inventory = TRUE; } - if(drop) + if (drop) { dropObject(obj, FALSE, FALSE, remove_inventory); } @@ -2169,7 +1747,7 @@ EAcceptance LLToolDragAndDrop::dad3dRezScript( // *HACK: In order to resolve SL-22177, we need to block drags // from notecards and objects onto other objects. - if((SOURCE_WORLD == mSource) || (SOURCE_NOTECARD == mSource)) + if ((SOURCE_WORLD == mSource) || (SOURCE_NOTECARD == mSource)) { return ACCEPT_NO; } @@ -2177,9 +1755,9 @@ EAcceptance LLToolDragAndDrop::dad3dRezScript( LLViewerInventoryItem* item; LLViewerInventoryCategory* cat; locateInventory(item, cat); - if(!item || !item->isComplete()) return ACCEPT_NO; + if (!item || !item->isFinished()) return ACCEPT_NO; EAcceptance rv = willObjectAcceptInventory(obj, item); - if(drop && (ACCEPT_YES_SINGLE <= rv)) + if (drop && (ACCEPT_YES_SINGLE <= rv)) { // rez in the script active by default, rez in inactive if the // control key is being held down. @@ -2207,7 +1785,7 @@ EAcceptance LLToolDragAndDrop::dad3dTextureObject( // *HACK: In order to resolve SL-22177, we need to block drags // from notecards and objects onto other objects. - if((SOURCE_WORLD == mSource) || (SOURCE_NOTECARD == mSource)) + if ((SOURCE_WORLD == mSource) || (SOURCE_NOTECARD == mSource)) { return ACCEPT_NO; } @@ -2215,29 +1793,29 @@ EAcceptance LLToolDragAndDrop::dad3dTextureObject( LLViewerInventoryItem* item; LLViewerInventoryCategory* cat; locateInventory(item, cat); - if(!item || !item->isComplete()) return ACCEPT_NO; + if (!item || !item->isFinished()) return ACCEPT_NO; EAcceptance rv = willObjectAcceptInventory(obj, item); - if((mask & MASK_CONTROL)) + if ((mask & MASK_CONTROL)) { - if((ACCEPT_YES_SINGLE <= rv) && drop) + if ((ACCEPT_YES_SINGLE <= rv) && drop) { dropInventory(obj, item, mSource, mSourceID); } return rv; } - if(!obj->permModify()) + if (!obj->permModify()) { return ACCEPT_NO_LOCKED; } //If texture !copyable don't texture or you'll never get it back. - if(!item->getPermissions().allowCopyBy(gAgent.getID())) + if (!item->getPermissions().allowCopyBy(gAgent.getID())) { return ACCEPT_NO; } - if(drop && (ACCEPT_YES_SINGLE <= rv)) + if (drop && (ACCEPT_YES_SINGLE <= rv)) { - if((mask & MASK_SHIFT)) + if ((mask & MASK_SHIFT)) { dropTextureAllFaces(obj, item, mSource, mSourceID); } @@ -2248,7 +1826,7 @@ EAcceptance LLToolDragAndDrop::dad3dTextureObject( // VEFFECT: SetTexture LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BEAM, TRUE); - effectp->setSourceObject(gAgent.getAvatarObject()); + effectp->setSourceObject(gAgentAvatarp); effectp->setTargetObject(obj); effectp->setDuration(LL_HUD_DUR_SHORT); effectp->setColor(LLColor4U(gAgent.getEffectColor())); @@ -2262,9 +1840,9 @@ EAcceptance LLToolDragAndDrop::dad3dTextureSelf( LLViewerObject* obj, S32 face, MASK mask, BOOL drop) { lldebugs << "LLToolDragAndDrop::dad3dTextureAvatar()" << llendl; - if(drop) + if (drop) { - if( !(mask & MASK_SHIFT) ) + if (!(mask & MASK_SHIFT)) { dropTextureOneFaceAvatar( (LLVOAvatar*)obj, face, (LLInventoryItem*)mCargoData); } @@ -2280,18 +1858,18 @@ EAcceptance LLToolDragAndDrop::dad3dWearItem( LLViewerInventoryItem* item; LLViewerInventoryCategory* cat; locateInventory(item, cat); - if(!item || !item->isComplete()) return ACCEPT_NO; + if (!item || !item->isFinished()) return ACCEPT_NO; - if(mSource == SOURCE_AGENT || mSource == SOURCE_LIBRARY) + if (mSource == SOURCE_AGENT || mSource == SOURCE_LIBRARY) { // it's in the agent inventory const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH); - if( gInventory.isObjectDescendentOf( item->getUUID(), trash_id ) ) + if (gInventory.isObjectDescendentOf(item->getUUID(), trash_id)) { return ACCEPT_NO; } - if( drop ) + if (drop) { // Don't wear anything until initial wearables are loaded, can // destroy clothing items. @@ -2300,24 +1878,7 @@ EAcceptance LLToolDragAndDrop::dad3dWearItem( LLNotificationsUtil::add("CanNotChangeAppearanceUntilLoaded"); return ACCEPT_NO; } - - if(mSource == SOURCE_LIBRARY) - { - // create item based on that one, and put it on if that - // was a success. - LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback(); - copy_inventory_item( - gAgent.getID(), - item->getPermissions().getOwner(), - item->getUUID(), - LLUUID::null, - std::string(), - cb); - } - else - { - wear_inventory_item_on_avatar( item ); - } + LLAppearanceMgr::instance().wearItemOnAvatar(item->getUUID(),true, !(mask & MASK_CONTROL)); } return ACCEPT_YES_MULTI; } @@ -2335,21 +1896,21 @@ EAcceptance LLToolDragAndDrop::dad3dActivateGesture( LLViewerInventoryItem* item; LLViewerInventoryCategory* cat; locateInventory(item, cat); - if(!item || !item->isComplete()) return ACCEPT_NO; + if (!item || !item->isFinished()) return ACCEPT_NO; - if(mSource == SOURCE_AGENT || mSource == SOURCE_LIBRARY) + if (mSource == SOURCE_AGENT || mSource == SOURCE_LIBRARY) { // it's in the agent inventory const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH); - if( gInventory.isObjectDescendentOf( item->getUUID(), trash_id ) ) + if (gInventory.isObjectDescendentOf(item->getUUID(), trash_id)) { return ACCEPT_NO; } - if( drop ) + if (drop) { LLUUID item_id; - if(mSource == SOURCE_LIBRARY) + if (mSource == SOURCE_LIBRARY) { // create item based on that one, and put it on if that // was a success. @@ -2364,7 +1925,7 @@ EAcceptance LLToolDragAndDrop::dad3dActivateGesture( } else { - LLGestureManager::instance().activateGesture(item->getUUID()); + LLGestureMgr::instance().activateGesture(item->getUUID()); gInventory.updateItem(item); gInventory.notifyObservers(); } @@ -2384,7 +1945,7 @@ EAcceptance LLToolDragAndDrop::dad3dWearCategory( LLViewerInventoryItem* item; LLViewerInventoryCategory* category; locateInventory(item, category); - if(!category) return ACCEPT_NO; + if (!category) return ACCEPT_NO; if (drop) { @@ -2397,26 +1958,26 @@ EAcceptance LLToolDragAndDrop::dad3dWearCategory( } } - if(mSource == SOURCE_AGENT) + if (mSource == SOURCE_AGENT) { const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH); - if( gInventory.isObjectDescendentOf( category->getUUID(), trash_id ) ) + if (gInventory.isObjectDescendentOf(category->getUUID(), trash_id)) { return ACCEPT_NO; } - if(drop) + if (drop) { BOOL append = ( (mask & MASK_SHIFT) ? TRUE : FALSE ); - LLAppearanceManager::instance().wearInventoryCategory(category, false, append); + LLAppearanceMgr::instance().wearInventoryCategory(category, false, append); } return ACCEPT_YES_MULTI; } - else if(mSource == SOURCE_LIBRARY) + else if (mSource == SOURCE_LIBRARY) { - if(drop) + if (drop) { - LLAppearanceManager::instance().wearInventoryCategory(category, true, false); + LLAppearanceMgr::instance().wearInventoryCategory(category, true, false); } return ACCEPT_YES_MULTI; } @@ -2435,7 +1996,7 @@ EAcceptance LLToolDragAndDrop::dad3dUpdateInventory( // *HACK: In order to resolve SL-22177, we need to block drags // from notecards and objects onto other objects. - if((SOURCE_WORLD == mSource) || (SOURCE_NOTECARD == mSource)) + if ((SOURCE_WORLD == mSource) || (SOURCE_NOTECARD == mSource)) { return ACCEPT_NO; } @@ -2443,7 +2004,7 @@ EAcceptance LLToolDragAndDrop::dad3dUpdateInventory( LLViewerInventoryItem* item; LLViewerInventoryCategory* cat; locateInventory(item, cat); - if(!item || !item->isComplete()) return ACCEPT_NO; + if (!item || !item->isFinished()) return ACCEPT_NO; LLViewerObject* root_object = obj; if (obj && obj->getParent()) { @@ -2455,7 +2016,7 @@ EAcceptance LLToolDragAndDrop::dad3dUpdateInventory( } EAcceptance rv = willObjectAcceptInventory(root_object, item); - if(root_object && drop && (ACCEPT_YES_COPY_SINGLE <= rv)) + if (root_object && drop && (ACCEPT_YES_COPY_SINGLE <= rv)) { dropInventory(root_object, item, mSource, mSourceID); } @@ -2499,7 +2060,7 @@ EAcceptance LLToolDragAndDrop::dad3dUpdateInventoryCategory( LLDroppableItem droppable(!obj->permYouOwner()); LLInventoryModel::cat_array_t cats; LLInventoryModel::item_array_t items; - gInventory.collectDescendentsIf(cat->getUUID(), + gInventory.collectDescendentsIf (cat->getUUID(), cats, items, LLInventoryModel::EXCLUDE_TRASH, @@ -2528,7 +2089,7 @@ EAcceptance LLToolDragAndDrop::dad3dUpdateInventoryCategory( { const LLViewerInventoryCategory *cat = (*cat_iter); rv = gInventory.isCategoryComplete(cat->getUUID()) ? ACCEPT_YES_MULTI : ACCEPT_NO; - if(rv < ACCEPT_YES_SINGLE) + if (rv < ACCEPT_YES_SINGLE) { lldebugs << "Category " << cat->getUUID() << "is not complete." << llendl; break; @@ -2561,7 +2122,7 @@ EAcceptance LLToolDragAndDrop::dad3dUpdateInventoryCategory( // If every item is accepted, send it on if (drop && (ACCEPT_YES_COPY_SINGLE <= rv)) { - LLInventoryFetchObserver::item_ref_t ids; + uuid_vec_t ids; for (LLInventoryModel::item_array_t::const_iterator item_iter = items.begin(); item_iter != items.end(); ++item_iter) @@ -2569,9 +2130,9 @@ EAcceptance LLToolDragAndDrop::dad3dUpdateInventoryCategory( const LLViewerInventoryItem *item = (*item_iter); ids.push_back(item->getUUID()); } - LLCategoryDropObserver* dropper = new LLCategoryDropObserver(obj->getID(), mSource); - dropper->fetchItems(ids); - if(dropper->isEverythingComplete()) + LLCategoryDropObserver* dropper = new LLCategoryDropObserver(ids, obj->getID(), mSource); + dropper->startFetch(); + if (dropper->isFinished()) { dropper->done(); } @@ -2596,29 +2157,28 @@ EAcceptance LLToolDragAndDrop::dad3dGiveInventoryObject( lldebugs << "LLToolDragAndDrop::dad3dGiveInventoryObject()" << llendl; // item has to be in agent inventory. - if(mSource != SOURCE_AGENT) return ACCEPT_NO; + if (mSource != SOURCE_AGENT) return ACCEPT_NO; // find the item now. LLViewerInventoryItem* item; LLViewerInventoryCategory* cat; locateInventory(item, cat); - if(!item || !item->isComplete()) return ACCEPT_NO; - if(!item->getPermissions().allowOperationBy(PERM_TRANSFER, gAgent.getID())) + if (!item || !item->isFinished()) return ACCEPT_NO; + if (!item->getPermissions().allowOperationBy(PERM_TRANSFER, gAgent.getID())) { // cannot give away no-transfer objects return ACCEPT_NO; } - LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); - if(avatar && avatar->isWearingAttachment( item->getUUID() ) ) + if (isAgentAvatarValid() && gAgentAvatarp->isWearingAttachment(item->getUUID())) { // You can't give objects that are attached to you return ACCEPT_NO; } - if( obj && avatar ) + if (obj && isAgentAvatarValid()) { - if(drop) + if (drop) { - giveInventory(obj->getID(), item ); + LLGiveInventory::doGiveInventoryItem(obj->getID(), item ); } // *TODO: deal with all the issues surrounding multi-object // inventory transfers. @@ -2633,18 +2193,18 @@ EAcceptance LLToolDragAndDrop::dad3dGiveInventory( { lldebugs << "LLToolDragAndDrop::dad3dGiveInventory()" << llendl; // item has to be in agent inventory. - if(mSource != SOURCE_AGENT) return ACCEPT_NO; + if (mSource != SOURCE_AGENT) return ACCEPT_NO; LLViewerInventoryItem* item; LLViewerInventoryCategory* cat; locateInventory(item, cat); - if(!item || !item->isComplete()) return ACCEPT_NO; - if(!isInventoryGiveAcceptable(item)) + if (!item || !item->isFinished()) return ACCEPT_NO; + if (!LLGiveInventory::isInventoryGiveAcceptable(item)) { return ACCEPT_NO; } - if(drop && obj) + if (drop && obj) { - giveInventory(obj->getID(), item); + LLGiveInventory::doGiveInventoryItem(obj->getID(), item); } // *TODO: deal with all the issues surrounding multi-object // inventory transfers. @@ -2655,13 +2215,13 @@ EAcceptance LLToolDragAndDrop::dad3dGiveInventoryCategory( LLViewerObject* obj, S32 face, MASK mask, BOOL drop) { lldebugs << "LLToolDragAndDrop::dad3dGiveInventoryCategory()" << llendl; - if(drop && obj) + if (drop && obj) { LLViewerInventoryItem* item; LLViewerInventoryCategory* cat; locateInventory(item, cat); - if(!cat) return ACCEPT_NO; - giveInventoryCategory(obj->getID(), cat); + if (!cat) return ACCEPT_NO; + LLGiveInventory::doGiveInventoryCategory(obj->getID(), cat); } // *TODO: deal with all the issues surrounding multi-object // inventory transfers. @@ -2676,14 +2236,14 @@ EAcceptance LLToolDragAndDrop::dad3dRezFromObjectOnLand( LLViewerInventoryItem* item = NULL; LLViewerInventoryCategory* cat = NULL; locateInventory(item, cat); - if(!item || !item->isComplete()) return ACCEPT_NO; + if (!item || !item->isFinished()) return ACCEPT_NO; - if(!gAgent.allowOperation(PERM_COPY, item->getPermissions()) + if (!gAgent.allowOperation(PERM_COPY, item->getPermissions()) || !item->getPermissions().allowTransferTo(LLUUID::null)) { return ACCEPT_NO_LOCKED; } - if(drop) + if (drop) { dropObject(obj, TRUE, TRUE, FALSE); } @@ -2697,8 +2257,8 @@ EAcceptance LLToolDragAndDrop::dad3dRezFromObjectOnObject( LLViewerInventoryItem* item; LLViewerInventoryCategory* cat; locateInventory(item, cat); - if(!item || !item->isComplete()) return ACCEPT_NO; - if((mask & MASK_CONTROL)) + if (!item || !item->isFinished()) return ACCEPT_NO; + if ((mask & MASK_CONTROL)) { // *HACK: In order to resolve SL-22177, we need to block drags // from notecards and objects onto other objects. @@ -2706,19 +2266,19 @@ EAcceptance LLToolDragAndDrop::dad3dRezFromObjectOnObject( // *HACK: uncomment this when appropriate //EAcceptance rv = willObjectAcceptInventory(obj, item); - //if(drop && (ACCEPT_YES_SINGLE <= rv)) + //if (drop && (ACCEPT_YES_SINGLE <= rv)) //{ // dropInventory(obj, item, mSource, mSourceID); //} //return rv; } - if(!item->getPermissions().allowCopyBy(gAgent.getID(), + if (!item->getPermissions().allowCopyBy(gAgent.getID(), gAgent.getGroupID()) || !item->getPermissions().allowTransferTo(LLUUID::null)) { return ACCEPT_NO_LOCKED; } - if(drop) + if (drop) { dropObject(obj, FALSE, TRUE, FALSE); } @@ -2734,23 +2294,23 @@ EAcceptance LLToolDragAndDrop::dad3dCategoryOnLand( LLInventoryItem* item; LLInventoryCategory* cat; locateInventory(item, cat); - if(!cat) return ACCEPT_NO; + if (!cat) return ACCEPT_NO; EAcceptance rv = ACCEPT_NO; // find all the items in the category LLViewerInventoryCategory::cat_array_t cats; LLViewerInventoryItem::item_array_t items; LLDropCopyableItems droppable; - gInventory.collectDescendentsIf(cat->getUUID(), + gInventory.collectDescendentsIf (cat->getUUID(), cats, items, LLInventoryModel::EXCLUDE_TRASH, droppable); - if(items.count() > 0) + if (items.count() > 0) { rv = ACCEPT_YES_SINGLE; } - if((rv >= ACCEPT_YES_COPY_SINGLE) && drop) + if ((rv >= ACCEPT_YES_COPY_SINGLE) && drop) { createContainer(items, cat->getName()); return ACCEPT_NO; @@ -2773,19 +2333,19 @@ EAcceptance LLToolDragAndDrop::dad3dAssetOnLand( LLViewerInventoryItem::item_array_t items; LLViewerInventoryItem::item_array_t copyable_items; locateMultipleInventory(items, cats); - if(!items.count()) return ACCEPT_NO; + if (!items.count()) return ACCEPT_NO; EAcceptance rv = ACCEPT_NO; for (S32 i = 0; i < items.count(); i++) { LLInventoryItem* item = items[i]; - if(item->getPermissions().allowCopyBy(gAgent.getID())) + if (item->getPermissions().allowCopyBy(gAgent.getID())) { copyable_items.put(item); rv = ACCEPT_YES_SINGLE; } } - if((rv >= ACCEPT_YES_COPY_SINGLE) && drop) + if ((rv >= ACCEPT_YES_COPY_SINGLE) && drop) { createContainer(copyable_items, NULL); } @@ -2800,20 +2360,20 @@ LLInventoryObject* LLToolDragAndDrop::locateInventory( { item = NULL; cat = NULL; - if(mCargoIDs.empty()) return NULL; - if((mSource == SOURCE_AGENT) || (mSource == SOURCE_LIBRARY)) + if (mCargoIDs.empty()) return NULL; + if ((mSource == SOURCE_AGENT) || (mSource == SOURCE_LIBRARY)) { // The object should be in user inventory. item = (LLViewerInventoryItem*)gInventory.getItem(mCargoIDs[mCurItemIndex]); cat = (LLViewerInventoryCategory*)gInventory.getCategory(mCargoIDs[mCurItemIndex]); } - else if(mSource == SOURCE_WORLD) + else if (mSource == SOURCE_WORLD) { // This object is in some task inventory somewhere. LLViewerObject* obj = gObjectList.findObject(mSourceID); - if(obj) + if (obj) { - if((mCargoTypes[mCurItemIndex] == DAD_CATEGORY) + if ((mCargoTypes[mCurItemIndex] == DAD_CATEGORY) || (mCargoTypes[mCurItemIndex] == DAD_ROOT_CATEGORY)) { cat = (LLViewerInventoryCategory*)obj->getInventoryObject(mCargoIDs[mCurItemIndex]); @@ -2824,16 +2384,16 @@ LLInventoryObject* LLToolDragAndDrop::locateInventory( } } } - else if(mSource == SOURCE_NOTECARD) + else if (mSource == SOURCE_NOTECARD) { LLPreviewNotecard* preview = LLFloaterReg::findTypedInstance<LLPreviewNotecard>("preview_notecard", mSourceID); - if(preview) + if (preview) { item = (LLViewerInventoryItem*)preview->getDragItem(); } } - if(item) return item; - if(cat) return cat; + if (item) return item; + if (cat) return cat; return NULL; } @@ -2841,8 +2401,8 @@ LLInventoryObject* LLToolDragAndDrop::locateInventory( LLInventoryObject* LLToolDragAndDrop::locateMultipleInventory(LLViewerInventoryCategory::cat_array_t& cats, LLViewerInventoryItem::item_array_t& items) { - if(mCargoIDs.count() == 0) return NULL; - if((mSource == SOURCE_AGENT) || (mSource == SOURCE_LIBRARY)) + if (mCargoIDs.count() == 0) return NULL; + if ((mSource == SOURCE_AGENT) || (mSource == SOURCE_LIBRARY)) { // The object should be in user inventory. for (S32 i = 0; i < mCargoIDs.count(); i++) @@ -2859,13 +2419,13 @@ LLInventoryObject* LLToolDragAndDrop::locateMultipleInventory(LLViewerInventoryC } } } - else if(mSource == SOURCE_WORLD) + else if (mSource == SOURCE_WORLD) { // This object is in some task inventory somewhere. LLViewerObject* obj = gObjectList.findObject(mSourceID); - if(obj) + if (obj) { - if((mCargoType == DAD_CATEGORY) + if ((mCargoType == DAD_CATEGORY) || (mCargoType == DAD_ROOT_CATEGORY)) { // The object should be in user inventory. @@ -2891,17 +2451,17 @@ LLInventoryObject* LLToolDragAndDrop::locateMultipleInventory(LLViewerInventoryC } } } - else if(mSource == SOURCE_NOTECARD) + else if (mSource == SOURCE_NOTECARD) { LLPreviewNotecard* card; card = (LLPreviewNotecard*)LLPreview::find(mSourceID); - if(card) + if (card) { items.put((LLInventoryItem*)card->getDragItem()); } } - if(items.count()) return items[0]; - if(cats.count()) return cats[0]; + if (items.count()) return items[0]; + if (cats.count()) return cats[0]; return NULL; } */ diff --git a/indra/newview/lltooldraganddrop.h b/indra/newview/lltooldraganddrop.h index 79b2bc32a3..36e69c1db3 100644 --- a/indra/newview/lltooldraganddrop.h +++ b/indra/newview/lltooldraganddrop.h @@ -81,7 +81,7 @@ public: const LLUUID& source_id = LLUUID::null, const LLUUID& object_id = LLUUID::null); void beginMultiDrag(const std::vector<EDragAndDropType> types, - const std::vector<LLUUID>& cargo_ids, + const uuid_vec_t& cargo_ids, ESource source, const LLUUID& source_id = LLUUID::null); void endDrag(); @@ -125,7 +125,7 @@ protected: std::vector<EDragAndDropType> mCargoTypes; //void* mCargoData; - std::vector<LLUUID> mCargoIDs; + uuid_vec_t mCargoIDs; ESource mSource; LLUUID mSourceID; LLUUID mObjectID; @@ -214,28 +214,10 @@ protected: LLToolDragAndDrop::ESource source, const LLUUID& src_id); - - // give inventory item functionality - static bool handleCopyProtectedItem(const LLSD& notification, const LLSD& response); - static void commitGiveInventoryItem(const LLUUID& to_agent, - LLInventoryItem* item, - const LLUUID &im_session_id = LLUUID::null); - - // give inventory category functionality - static bool handleCopyProtectedCategory(const LLSD& notification, const LLSD& response); - static void commitGiveInventoryCategory(const LLUUID& to_agent, - LLInventoryCategory* cat, - const LLUUID &im_session_id = LLUUID::null); - public: // helper functions static BOOL isInventoryDropAcceptable(LLViewerObject* obj, LLInventoryItem* item) { return (ACCEPT_YES_COPY_SINGLE <= willObjectAcceptInventory(obj, item)); } - // This simple helper function assumes you are attempting to - // transfer item. returns true if you can give, otherwise false. - static BOOL isInventoryGiveAcceptable(LLInventoryItem* item); - static BOOL isInventoryGroupGiveAcceptable(LLInventoryItem* item); - BOOL dadUpdateInventory(LLViewerObject* obj, BOOL drop); BOOL dadUpdateInventoryCategory(LLViewerObject* obj, BOOL drop); @@ -261,17 +243,11 @@ public: ESource source, const LLUUID& src_id); - static void giveInventory(const LLUUID& to_agent, - LLInventoryItem* item, - const LLUUID &session_id = LLUUID::null); - static void giveInventoryCategory(const LLUUID& to_agent, - LLInventoryCategory* item, - const LLUUID &session_id = LLUUID::null); - static bool handleGiveDragAndDrop(LLUUID agent, LLUUID session, BOOL drop, EDragAndDropType cargo_type, void* cargo_data, - EAcceptance* accept); + EAcceptance* accept, + const LLSD& dest = LLSD()); // Classes used for determining 3d drag and drop types. private: diff --git a/indra/newview/lltoolfocus.cpp b/indra/newview/lltoolfocus.cpp index 2320ae57df..032714cabf 100644 --- a/indra/newview/lltoolfocus.cpp +++ b/indra/newview/lltoolfocus.cpp @@ -42,6 +42,7 @@ // Viewer includes #include "llagent.h" +#include "llagentcamera.h" #include "llbutton.h" #include "llviewercontrol.h" #include "lldrawable.h" @@ -167,19 +168,17 @@ void LLToolCamera::pickCallback(const LLPickInfo& pick_info) } } - if( CAMERA_MODE_CUSTOMIZE_AVATAR == gAgent.getCameraMode() ) + if( CAMERA_MODE_CUSTOMIZE_AVATAR == gAgentCamera.getCameraMode() ) { BOOL good_customize_avatar_hit = FALSE; if( hit_obj ) { - LLVOAvatar* avatar = gAgent.getAvatarObject(); - if( hit_obj == avatar) + if (isAgentAvatarValid() && (hit_obj == gAgentAvatarp)) { // It's you good_customize_avatar_hit = TRUE; } - else - if( hit_obj->isAttachment() && hit_obj->permYouOwner() ) + else if (hit_obj->isAttachment() && hit_obj->permYouOwner()) { // It's an attachment that you're wearing good_customize_avatar_hit = TRUE; @@ -207,23 +206,23 @@ void LLToolCamera::pickCallback(const LLPickInfo& pick_info) // ...clicked on a world object, so focus at its position if (!hit_obj->isHUDAttachment()) { - gAgent.setFocusOnAvatar(FALSE, ANIMATE); - gAgent.setFocusGlobal(pick_info); + gAgentCamera.setFocusOnAvatar(FALSE, ANIMATE); + gAgentCamera.setFocusGlobal(pick_info); } } else if (!pick_info.mPosGlobal.isExactlyZero()) { // Hit the ground - gAgent.setFocusOnAvatar(FALSE, ANIMATE); - gAgent.setFocusGlobal(pick_info); + gAgentCamera.setFocusOnAvatar(FALSE, ANIMATE); + gAgentCamera.setFocusGlobal(pick_info); } if (!(pick_info.mKeyMask & MASK_ALT) && - gAgent.cameraThirdPerson() && + gAgentCamera.cameraThirdPerson() && gViewerWindow->getLeftMouseDown() && !gSavedSettings.getBOOL("FreezeTime") && - (hit_obj == gAgent.getAvatarObject() || - (hit_obj && hit_obj->isAttachment() && LLVOAvatar::findAvatarFromAttachment(hit_obj)->isSelf()))) + (hit_obj == gAgentAvatarp || + (hit_obj && hit_obj->isAttachment() && LLVOAvatar::findAvatarFromAttachment(hit_obj)->isSelf()))) { LLToolCamera::getInstance()->mMouseSteering = TRUE; } @@ -232,14 +231,14 @@ void LLToolCamera::pickCallback(const LLPickInfo& pick_info) LLToolCamera::getInstance()->mValidClickPoint = TRUE; - if( CAMERA_MODE_CUSTOMIZE_AVATAR == gAgent.getCameraMode() ) + if( CAMERA_MODE_CUSTOMIZE_AVATAR == gAgentCamera.getCameraMode() ) { - gAgent.setFocusOnAvatar(FALSE, FALSE); + gAgentCamera.setFocusOnAvatar(FALSE, FALSE); - LLVector3d cam_pos = gAgent.getCameraPositionGlobal(); - cam_pos -= LLVector3d(LLViewerCamera::getInstance()->getLeftAxis() * gAgent.calcCustomizeAvatarUIOffset( cam_pos )); + LLVector3d cam_pos = gAgentCamera.getCameraPositionGlobal(); + cam_pos -= LLVector3d(LLViewerCamera::getInstance()->getLeftAxis() * gAgentCamera.calcCustomizeAvatarUIOffset( cam_pos )); - gAgent.setCameraPosAndFocusGlobal( cam_pos, pick_info.mPosGlobal, pick_info.mObjectID); + gAgentCamera.setCameraPosAndFocusGlobal( cam_pos, pick_info.mPosGlobal, pick_info.mObjectID); } } @@ -280,10 +279,10 @@ BOOL LLToolCamera::handleMouseUp(S32 x, S32 y, MASK mask) { if (mValidClickPoint) { - if( CAMERA_MODE_CUSTOMIZE_AVATAR == gAgent.getCameraMode() ) + if( CAMERA_MODE_CUSTOMIZE_AVATAR == gAgentCamera.getCameraMode() ) { LLCoordGL mouse_pos; - LLVector3 focus_pos = gAgent.getPosAgentFromGlobal(gAgent.getFocusGlobal()); + LLVector3 focus_pos = gAgent.getPosAgentFromGlobal(gAgentCamera.getFocusGlobal()); BOOL success = LLViewerCamera::getInstance()->projectPosAgentToScreen(focus_pos, mouse_pos); if (success) { @@ -369,12 +368,12 @@ BOOL LLToolCamera::handleHover(S32 x, S32 y, MASK mask) if (dx != 0) { - gAgent.cameraOrbitAround( -dx * RADIANS_PER_PIXEL ); + gAgentCamera.cameraOrbitAround( -dx * RADIANS_PER_PIXEL ); } if (dy != 0) { - gAgent.cameraOrbitOver( -dy * RADIANS_PER_PIXEL ); + gAgentCamera.cameraOrbitOver( -dy * RADIANS_PER_PIXEL ); } gViewerWindow->moveCursorToCenter(); @@ -388,8 +387,8 @@ BOOL LLToolCamera::handleHover(S32 x, S32 y, MASK mask) // Pan tool if (hasMouseCapture()) { - LLVector3d camera_to_focus = gAgent.getCameraPositionGlobal(); - camera_to_focus -= gAgent.getFocusGlobal(); + LLVector3d camera_to_focus = gAgentCamera.getCameraPositionGlobal(); + camera_to_focus -= gAgentCamera.getFocusGlobal(); F32 dist = (F32) camera_to_focus.normVec(); // Fudge factor for pan @@ -397,12 +396,12 @@ BOOL LLToolCamera::handleHover(S32 x, S32 y, MASK mask) if (dx != 0) { - gAgent.cameraPanLeft( dx * meters_per_pixel ); + gAgentCamera.cameraPanLeft( dx * meters_per_pixel ); } if (dy != 0) { - gAgent.cameraPanUp( -dy * meters_per_pixel ); + gAgentCamera.cameraPanUp( -dy * meters_per_pixel ); } gViewerWindow->moveCursorToCenter(); @@ -419,7 +418,7 @@ BOOL LLToolCamera::handleHover(S32 x, S32 y, MASK mask) if (dx != 0) { - gAgent.cameraOrbitAround( -dx * RADIANS_PER_PIXEL ); + gAgentCamera.cameraOrbitAround( -dx * RADIANS_PER_PIXEL ); } const F32 IN_FACTOR = 0.99f; @@ -428,11 +427,11 @@ BOOL LLToolCamera::handleHover(S32 x, S32 y, MASK mask) { if (mMouseSteering) { - gAgent.cameraOrbitOver( -dy * RADIANS_PER_PIXEL ); + gAgentCamera.cameraOrbitOver( -dy * RADIANS_PER_PIXEL ); } else { - gAgent.cameraZoomIn( pow( IN_FACTOR, dy ) ); + gAgentCamera.cameraZoomIn( pow( IN_FACTOR, dy ) ); } } diff --git a/indra/newview/lltoolgrab.cpp b/indra/newview/lltoolgrab.cpp index d837a334f1..9bd08287f3 100644 --- a/indra/newview/lltoolgrab.cpp +++ b/indra/newview/lltoolgrab.cpp @@ -46,6 +46,7 @@ // newview headers #include "llagent.h" +#include "llagentcamera.h" #include "lldrawable.h" #include "llfloatertools.h" #include "llhudeffect.h" @@ -225,7 +226,7 @@ BOOL LLToolGrab::handleObjectHit(const LLPickInfo& info) // non-touchable objects. If it has a touch handler, we // do grab it (so llDetectedGrab works), but movement is // blocked on the server side. JC - if (gAgent.cameraMouselook()) + if (gAgentCamera.cameraMouselook()) { mMode = GRAB_LOCKED; } @@ -285,8 +286,8 @@ BOOL LLToolGrab::handleObjectHit(const LLPickInfo& info) LLVector3 local_edit_point = gAgent.getPosAgentFromGlobal(info.mPosGlobal); local_edit_point -= edit_object->getPositionAgent(); local_edit_point = local_edit_point * ~edit_object->getRenderRotation(); - gAgent.setPointAt(POINTAT_TARGET_GRAB, edit_object, local_edit_point ); - gAgent.setLookAt(LOOKAT_TARGET_SELECT, edit_object, local_edit_point ); + gAgentCamera.setPointAt(POINTAT_TARGET_GRAB, edit_object, local_edit_point ); + gAgentCamera.setLookAt(LOOKAT_TARGET_SELECT, edit_object, local_edit_point ); } // on transient grabs (clicks on world objects), kill the grab immediately @@ -390,7 +391,7 @@ void LLToolGrab::startGrab() // This planar drag starts at the grab point mDragStartPointGlobal = grab_start_global; - mDragStartFromCamera = grab_start_global - gAgent.getCameraPositionGlobal(); + mDragStartFromCamera = grab_start_global - gAgentCamera.getCameraPositionGlobal(); LLMessageSystem *msg = gMessageSystem; msg->newMessageFast(_PREHASH_ObjectGrab); @@ -502,7 +503,7 @@ void LLToolGrab::handleHoverActive(S32 x, S32 y, MASK mask) mVerticalDragging = FALSE; mDragStartPointGlobal = gViewerWindow->clickPointInWorldGlobal(x, y, objectp); - mDragStartFromCamera = mDragStartPointGlobal - gAgent.getCameraPositionGlobal(); + mDragStartFromCamera = mDragStartPointGlobal - gAgentCamera.getCameraPositionGlobal(); } else if (!mVerticalDragging && (mask == MASK_VERTICAL) ) { @@ -510,7 +511,7 @@ void LLToolGrab::handleHoverActive(S32 x, S32 y, MASK mask) mVerticalDragging = TRUE; mDragStartPointGlobal = gViewerWindow->clickPointInWorldGlobal(x, y, objectp); - mDragStartFromCamera = mDragStartPointGlobal - gAgent.getCameraPositionGlobal(); + mDragStartFromCamera = mDragStartPointGlobal - gAgentCamera.getCameraPositionGlobal(); } const F32 RADIANS_PER_PIXEL_X = 0.01f; @@ -598,7 +599,7 @@ void LLToolGrab::handleHoverActive(S32 x, S32 y, MASK mask) // need to return offset from mGrabStartPoint LLVector3d grab_point_global; - grab_point_global = gAgent.getCameraPositionGlobal() + mGrabHiddenOffsetFromCamera; + grab_point_global = gAgentCamera.getCameraPositionGlobal() + mGrabHiddenOffsetFromCamera; /* Snap to grid disabled for grab tool - very confusing // Handle snapping to grid, but only when the tool is formally selected. @@ -632,7 +633,7 @@ void LLToolGrab::handleHoverActive(S32 x, S32 y, MASK mask) grab_point_global = LLWorld::getInstance()->clipToVisibleRegions(mDragStartPointGlobal, grab_point_global); // propagate constrained grab point back to grab offset - mGrabHiddenOffsetFromCamera = grab_point_global - gAgent.getCameraPositionGlobal(); + mGrabHiddenOffsetFromCamera = grab_point_global - gAgentCamera.getCameraPositionGlobal(); // Handle auto-rotation at screen edge. LLVector3 grab_pos_agent = gAgent.getPosAgentFromGlobal( grab_point_global ); @@ -646,24 +647,24 @@ void LLToolGrab::handleHoverActive(S32 x, S32 y, MASK mask) // ...build mode moves camera about focus point if (grab_center_gl.mX < ROTATE_H_MARGIN) { - if (gAgent.getFocusOnAvatar()) + if (gAgentCamera.getFocusOnAvatar()) { gAgent.yaw(rotate_angle); } else { - gAgent.cameraOrbitAround(rotate_angle); + gAgentCamera.cameraOrbitAround(rotate_angle); } } else if (grab_center_gl.mX > gViewerWindow->getWorldViewWidthScaled() - ROTATE_H_MARGIN) { - if (gAgent.getFocusOnAvatar()) + if (gAgentCamera.getFocusOnAvatar()) { gAgent.yaw(-rotate_angle); } else { - gAgent.cameraOrbitAround(-rotate_angle); + gAgentCamera.cameraOrbitAround(-rotate_angle); } } @@ -705,17 +706,17 @@ void LLToolGrab::handleHoverActive(S32 x, S32 y, MASK mask) // once we've initiated a drag, lock the camera down if (mHasMoved) { - if (!gAgent.cameraMouselook() && + if (!gAgentCamera.cameraMouselook() && !objectp->isHUDAttachment() && - objectp->getRoot() == gAgent.getAvatarObject()->getRoot()) + objectp->getRoot() == gAgentAvatarp->getRoot()) { // force focus to point in space where we were looking previously - gAgent.setFocusGlobal(gAgent.calcFocusPositionTargetGlobal(), LLUUID::null); - gAgent.setFocusOnAvatar(FALSE, ANIMATE); + gAgentCamera.setFocusGlobal(gAgentCamera.calcFocusPositionTargetGlobal(), LLUUID::null); + gAgentCamera.setFocusOnAvatar(FALSE, ANIMATE); } else { - gAgent.clearFocusObject(); + gAgentCamera.clearFocusObject(); } } @@ -814,7 +815,7 @@ void LLToolGrab::handleHoverNonPhysical(S32 x, S32 y, MASK mask) } // need to return offset from mGrabStartPoint - LLVector3d grab_point_global = gAgent.getCameraPositionGlobal() + mGrabHiddenOffsetFromCamera; + LLVector3d grab_point_global = gAgentCamera.getCameraPositionGlobal() + mGrabHiddenOffsetFromCamera; grab_pos_region = objectp->getRegion()->getPosRegionFromGlobal( grab_point_global ); } @@ -872,8 +873,8 @@ void LLToolGrab::handleHoverNonPhysical(S32 x, S32 y, MASK mask) LLVector3 local_edit_point = pick.mIntersection; local_edit_point -= objectp->getPositionAgent(); local_edit_point = local_edit_point * ~objectp->getRenderRotation(); - gAgent.setPointAt(POINTAT_TARGET_GRAB, objectp, local_edit_point ); - gAgent.setLookAt(LOOKAT_TARGET_SELECT, objectp, local_edit_point ); + gAgentCamera.setPointAt(POINTAT_TARGET_GRAB, objectp, local_edit_point ); + gAgentCamera.setLookAt(LOOKAT_TARGET_SELECT, objectp, local_edit_point ); } @@ -885,28 +886,6 @@ void LLToolGrab::handleHoverNonPhysical(S32 x, S32 y, MASK mask) // Not dragging. Just showing affordances void LLToolGrab::handleHoverInactive(S32 x, S32 y, MASK mask) { - const F32 ROTATE_ANGLE_PER_SECOND = 40.f * DEG_TO_RAD; - const F32 rotate_angle = ROTATE_ANGLE_PER_SECOND / gFPSClamped; - - // Look for cursor against the edge of the screen - // Only works in fullscreen - if (gSavedSettings.getBOOL("WindowFullScreen")) - { - if (gAgent.cameraThirdPerson() ) - { - if (x == 0) - { - gAgent.yaw(rotate_angle); - //gAgent.setControlFlags(AGENT_CONTROL_YAW_POS); - } - else if (x == (gViewerWindow->getWorldViewWidthScaled() - 1) ) - { - gAgent.yaw(-rotate_angle); - //gAgent.setControlFlags(AGENT_CONTROL_YAW_NEG); - } - } - } - // JC - TODO - change cursor based on gGrabBtnVertical, gGrabBtnSpin lldebugst(LLERR_USER_INPUT) << "hover handled by LLToolGrab (inactive-not over editable object)" << llendl; gViewerWindow->setCursor(UI_CURSOR_TOOLGRAB); @@ -994,7 +973,7 @@ void LLToolGrab::onMouseCaptureLost() return; } // First, fix cursor placement - if( !gAgent.cameraMouselook() + if( !gAgentCamera.cameraMouselook() && (GRAB_ACTIVE_CENTER == mMode)) { if (objectp->isHUDAttachment()) @@ -1035,8 +1014,8 @@ void LLToolGrab::onMouseCaptureLost() mGrabPick.mObjectID.setNull(); LLSelectMgr::getInstance()->updateSelectionCenter(); - gAgent.setPointAt(POINTAT_TARGET_CLEAR); - gAgent.setLookAt(LOOKAT_TARGET_CLEAR); + gAgentCamera.setPointAt(POINTAT_TARGET_CLEAR); + gAgentCamera.setLookAt(LOOKAT_TARGET_CLEAR); dialog_refresh_all(); } @@ -1128,7 +1107,7 @@ LLVector3d LLToolGrab::getGrabPointGlobal() case GRAB_ACTIVE_CENTER: case GRAB_NONPHYSICAL: case GRAB_LOCKED: - return gAgent.getCameraPositionGlobal() + mGrabHiddenOffsetFromCamera; + return gAgentCamera.getCameraPositionGlobal() + mGrabHiddenOffsetFromCamera; case GRAB_NOOBJECT: case GRAB_INACTIVE: diff --git a/indra/newview/lltoolgun.cpp b/indra/newview/lltoolgun.cpp index a441d653c7..c815f1e96a 100644 --- a/indra/newview/lltoolgun.cpp +++ b/indra/newview/lltoolgun.cpp @@ -36,6 +36,7 @@ #include "llviewerwindow.h" #include "llagent.h" +#include "llagentcamera.h" #include "llviewercontrol.h" #include "llsky.h" #include "llappviewer.h" @@ -83,7 +84,7 @@ BOOL LLToolGun::handleMouseDown(S32 x, S32 y, MASK mask) BOOL LLToolGun::handleHover(S32 x, S32 y, MASK mask) { - if( gAgent.cameraMouselook() && mIsSelected ) + if( gAgentCamera.cameraMouselook() && mIsSelected ) { const F32 NOMINAL_MOUSE_SENSITIVITY = 0.0025f; diff --git a/indra/newview/lltoolmgr.cpp b/indra/newview/lltoolmgr.cpp index fd12163fd3..a8696c22ef 100644 --- a/indra/newview/lltoolmgr.cpp +++ b/indra/newview/lltoolmgr.cpp @@ -56,6 +56,7 @@ #include "lltoolobjpicker.h" #include "lltoolpipette.h" #include "llagent.h" +#include "llagentcamera.h" #include "llviewercontrol.h" #include "llviewerjoystick.h" #include "llviewermenu.h" @@ -262,7 +263,7 @@ void LLToolMgr::toggleBuildMode() else { // manually disable edit mode, but do not affect the camera - gAgent.resetView(false); + gAgentCamera.resetView(false); LLFloaterReg::hideInstance("build"); gViewerWindow->showCursor(); } @@ -271,7 +272,7 @@ void LLToolMgr::toggleBuildMode() } else { - ECameraMode camMode = gAgent.getCameraMode(); + ECameraMode camMode = gAgentCamera.getCameraMode(); if (CAMERA_MODE_MOUSELOOK == camMode || CAMERA_MODE_CUSTOMIZE_AVATAR == camMode) { // pull the user out of mouselook or appearance mode when entering build mode @@ -286,13 +287,13 @@ void LLToolMgr::toggleBuildMode() handle_toggle_flycam(); } - if (gAgent.getFocusOnAvatar()) + if (gAgentCamera.getFocusOnAvatar()) { // zoom in if we're looking at the avatar - gAgent.setFocusOnAvatar(FALSE, ANIMATE); - gAgent.setFocusGlobal(gAgent.getPositionGlobal() + 2.0 * LLVector3d(gAgent.getAtAxis())); - gAgent.cameraZoomIn(0.666f); - gAgent.cameraOrbitOver( 30.f * DEG_TO_RAD ); + gAgentCamera.setFocusOnAvatar(FALSE, ANIMATE); + gAgentCamera.setFocusGlobal(gAgent.getPositionGlobal() + 2.0 * LLVector3d(gAgent.getAtAxis())); + gAgentCamera.cameraZoomIn(0.666f); + gAgentCamera.cameraOrbitOver( 30.f * DEG_TO_RAD ); } } @@ -303,7 +304,7 @@ void LLToolMgr::toggleBuildMode() // Could be first use //LLFirstUse::useBuild(); - gAgent.resetView(false); + gAgentCamera.resetView(false); // avoid spurious avatar movements LLViewerJoystick::getInstance()->setNeedsReset(); @@ -317,7 +318,7 @@ bool LLToolMgr::inBuildMode() // cameraMouselook() actually starts returning true. Also, appearance edit // sets build mode to true, so let's exclude that. bool b=(inEdit() - && !gAgent.cameraMouselook() + && !gAgentCamera.cameraMouselook() && mCurrentToolset != gFaceEditToolset); return b; diff --git a/indra/newview/lltoolmorph.cpp b/indra/newview/lltoolmorph.cpp index 4fb75f7a49..fa21b1a866 100644 --- a/indra/newview/lltoolmorph.cpp +++ b/indra/newview/lltoolmorph.cpp @@ -49,7 +49,6 @@ #include "lldrawable.h" #include "lldrawpoolavatar.h" #include "llface.h" -#include "llfloatercustomize.h" #include "llmorphview.h" #include "llresmgr.h" #include "llselectmgr.h" @@ -79,22 +78,25 @@ LLVisualParamHint::LLVisualParamHint( S32 width, S32 height, LLViewerJointMesh *mesh, LLViewerVisualParam *param, - F32 param_weight) + LLWearable *wearable, + F32 param_weight, + LLJoint* jointp) : LLViewerDynamicTexture(width, height, 3, LLViewerDynamicTexture::ORDER_MIDDLE, TRUE ), mNeedsUpdate( TRUE ), mIsVisible( FALSE ), mJointMesh( mesh ), mVisualParam( param ), + mWearablePtr( wearable ), mVisualParamWeight( param_weight ), mAllowsUpdates( TRUE ), mDelayFrames( 0 ), mRect( pos_x, pos_y + height, pos_x + width, pos_y ), - mLastParamWeight(0.f) + mLastParamWeight(0.f), + mCamTargetJoint(jointp) { LLVisualParamHint::sInstances.insert( this ); - mBackgroundp = LLUI::getUIImage("avatar_thumb_bkgrnd.j2c"); - + mBackgroundp = LLUI::getUIImage("avatar_thumb_bkgrnd.png"); llassert(width != 0); llassert(height != 0); @@ -108,6 +110,12 @@ LLVisualParamHint::~LLVisualParamHint() LLVisualParamHint::sInstances.erase( this ); } +//virtual +S8 LLVisualParamHint::getType() const +{ + return LLViewerDynamicTexture::LL_VISUAL_PARAM_HINT ; +} + //----------------------------------------------------------------------------- // static // requestHintUpdates() @@ -139,22 +147,20 @@ void LLVisualParamHint::requestHintUpdates( LLVisualParamHint* exception1, LLVis BOOL LLVisualParamHint::needsRender() { - return mNeedsUpdate && mDelayFrames-- <= 0 && !gAgent.getAvatarObject()->mAppearanceAnimating && mAllowsUpdates; + return mNeedsUpdate && mDelayFrames-- <= 0 && !gAgentAvatarp->mAppearanceAnimating && mAllowsUpdates; } void LLVisualParamHint::preRender(BOOL clear_depth) { - LLVOAvatarSelf* avatarp = gAgent.getAvatarObject(); - mLastParamWeight = mVisualParam->getWeight(); - mVisualParam->setWeight(mVisualParamWeight, FALSE); - avatarp->setVisualParamWeight(mVisualParam->getID(), mVisualParamWeight, FALSE); - avatarp->setVisualParamWeight("Blink_Left", 0.f); - avatarp->setVisualParamWeight("Blink_Right", 0.f); - avatarp->updateComposites(); - avatarp->updateVisualParams(); - avatarp->updateGeometry(avatarp->mDrawable); - avatarp->updateLOD(); + mWearablePtr->setVisualParamWeight(mVisualParam->getID(), mVisualParamWeight, FALSE); + gAgentAvatarp->setVisualParamWeight(mVisualParam->getID(), mVisualParamWeight, FALSE); + gAgentAvatarp->setVisualParamWeight("Blink_Left", 0.f); + gAgentAvatarp->setVisualParamWeight("Blink_Right", 0.f); + gAgentAvatarp->updateComposites(); + gAgentAvatarp->updateVisualParams(); + gAgentAvatarp->updateGeometry(gAgentAvatarp->mDrawable); + gAgentAvatarp->updateLOD(); LLViewerDynamicTexture::preRender(clear_depth); } @@ -165,15 +171,17 @@ void LLVisualParamHint::preRender(BOOL clear_depth) BOOL LLVisualParamHint::render() { LLVisualParamReset::sDirty = TRUE; - LLVOAvatar* avatarp = gAgent.getAvatarObject(); + + gGL.pushUIMatrix(); + gGL.loadUIIdentity(); glMatrixMode(GL_PROJECTION); - glPushMatrix(); + gGL.pushMatrix(); glLoadIdentity(); glOrtho(0.0f, mFullWidth, 0.0f, mFullHeight, -1.0f, 1.0f); glMatrixMode(GL_MODELVIEW); - glPushMatrix(); + gGL.pushMatrix(); glLoadIdentity(); LLGLSUIDefault gls_ui; @@ -181,37 +189,22 @@ BOOL LLVisualParamHint::render() mBackgroundp->draw(0, 0, mFullWidth, mFullHeight); glMatrixMode(GL_PROJECTION); - glPopMatrix(); + gGL.popMatrix(); glMatrixMode(GL_MODELVIEW); - glPopMatrix(); + gGL.popMatrix(); mNeedsUpdate = FALSE; mIsVisible = TRUE; - LLViewerJointMesh* cam_target_joint = NULL; - const std::string& cam_target_mesh_name = mVisualParam->getCameraTargetName(); - if( !cam_target_mesh_name.empty() ) - { - cam_target_joint = (LLViewerJointMesh*)avatarp->getJoint( cam_target_mesh_name ); - } - if( !cam_target_joint ) - { - cam_target_joint = (LLViewerJointMesh*)gMorphView->getCameraTargetJoint(); - } - if( !cam_target_joint ) - { - cam_target_joint = (LLViewerJointMesh*)avatarp->getJoint("mHead"); - } - LLQuaternion avatar_rotation; - LLJoint* root_joint = avatarp->getRootJoint(); + LLJoint* root_joint = gAgentAvatarp->getRootJoint(); if( root_joint ) { avatar_rotation = root_joint->getWorldRotation(); } - LLVector3 target_joint_pos = cam_target_joint->getWorldPosition(); + LLVector3 target_joint_pos = mCamTargetJoint->getWorldPosition(); LLVector3 target_offset( 0, 0, mVisualParam->getCameraElevation() ); LLVector3 target_pos = target_joint_pos + (target_offset * avatar_rotation); @@ -227,26 +220,29 @@ BOOL LLVisualParamHint::render() LLViewerCamera::getInstance()->setAspect((F32)mFullWidth / (F32)mFullHeight); LLViewerCamera::getInstance()->setOriginAndLookAt( - camera_pos, // camera - LLVector3(0.f, 0.f, 1.f), // up - target_pos ); // point of interest + camera_pos, // camera + LLVector3::z_axis, // up + target_pos ); // point of interest LLViewerCamera::getInstance()->setPerspective(FALSE, mOrigin.mX, mOrigin.mY, mFullWidth, mFullHeight, FALSE); - if (avatarp->mDrawable.notNull()) + if (gAgentAvatarp->mDrawable.notNull()) { - LLDrawPoolAvatar *avatarPoolp = (LLDrawPoolAvatar *)avatarp->mDrawable->getFace(0)->getPool(); + LLDrawPoolAvatar *avatarPoolp = (LLDrawPoolAvatar *)gAgentAvatarp->mDrawable->getFace(0)->getPool(); LLGLDepthTest gls_depth(GL_TRUE, GL_TRUE); gGL.setAlphaRejectSettings(LLRender::CF_ALWAYS); gGL.setSceneBlendType(LLRender::BT_REPLACE); - avatarPoolp->renderAvatars(avatarp); // renders only one avatar + avatarPoolp->renderAvatars(gAgentAvatarp); // renders only one avatar gGL.setSceneBlendType(LLRender::BT_ALPHA); gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT); } - avatarp->setVisualParamWeight(mVisualParam->getID(), mLastParamWeight); - mVisualParam->setWeight(mLastParamWeight, FALSE); + gAgentAvatarp->setVisualParamWeight(mVisualParam->getID(), mLastParamWeight); + mWearablePtr->setVisualParamWeight(mVisualParam->getID(), mLastParamWeight, FALSE); + gAgentAvatarp->updateVisualParams(); gGL.color4f(1,1,1,1); mGLTexturep->setGLTextureCreated(true); + gGL.popUIMatrix(); + return TRUE; } @@ -286,6 +282,12 @@ LLVisualParamReset::LLVisualParamReset() : LLViewerDynamicTexture(1, 1, 1, ORDER { } +//virtual +S8 LLVisualParamReset::getType() const +{ + return LLViewerDynamicTexture::LL_VISUAL_PARAM_RESET ; +} + //----------------------------------------------------------------------------- // render() //----------------------------------------------------------------------------- @@ -293,10 +295,9 @@ BOOL LLVisualParamReset::render() { if (sDirty) { - LLVOAvatarSelf* avatarp = gAgent.getAvatarObject(); - avatarp->updateComposites(); - avatarp->updateVisualParams(); - avatarp->updateGeometry(avatarp->mDrawable); + gAgentAvatarp->updateComposites(); + gAgentAvatarp->updateVisualParams(); + gAgentAvatarp->updateGeometry(gAgentAvatarp->mDrawable); sDirty = FALSE; } diff --git a/indra/newview/lltoolmorph.h b/indra/newview/lltoolmorph.h index b7df718ba2..cbab5e765f 100644 --- a/indra/newview/lltoolmorph.h +++ b/indra/newview/lltoolmorph.h @@ -47,6 +47,7 @@ class LLViewerJointMesh; class LLPolyMesh; class LLViewerObject; +class LLJoint; //----------------------------------------------------------------------------- // LLVisualParamHint @@ -62,7 +63,11 @@ public: S32 width, S32 height, LLViewerJointMesh *mesh, LLViewerVisualParam *param, - F32 param_weight); + LLWearable *wearable, + F32 param_weight, + LLJoint* jointp); + + /*virtual*/ S8 getType() const ; BOOL needsRender(); void preRender(BOOL clear_depth); @@ -87,11 +92,13 @@ protected: BOOL mIsVisible; // is this distortion hint visible? LLViewerJointMesh* mJointMesh; // mesh that this distortion applies to LLViewerVisualParam* mVisualParam; // visual param applied by this hint + LLWearable* mWearablePtr; // wearable we're editing F32 mVisualParamWeight; // weight for this visual parameter BOOL mAllowsUpdates; // updates are blocked unless this is true S32 mDelayFrames; // updates are blocked for this many frames LLRect mRect; F32 mLastParamWeight; + LLJoint* mCamTargetJoint; // joint to target with preview camera LLUIImagePtr mBackgroundp; @@ -107,6 +114,7 @@ protected: public: LLVisualParamReset(); /*virtual */ BOOL render(); + /*virtual*/ S8 getType() const ; static BOOL sDirty; }; diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp index bf1e307d71..ae244cd8a1 100644 --- a/indra/newview/lltoolpie.cpp +++ b/indra/newview/lltoolpie.cpp @@ -39,6 +39,7 @@ #include "llparcel.h" #include "llagent.h" +#include "llagentcamera.h" #include "llviewercontrol.h" #include "llfocusmgr.h" //#include "llfirstuse.h" @@ -180,10 +181,10 @@ BOOL LLToolPie::pickLeftMouseDownCallback() parent = object->getRootEdit(); } - - BOOL touchable = (object && object->flagHandleTouch()) - || (parent && parent->flagHandleTouch()); - + if (handleMediaClick(mPick)) + { + return TRUE; + } // If it's a left-click, and we have a special action, do it. if (useClickAction(mask, object, parent)) @@ -204,15 +205,15 @@ BOOL LLToolPie::pickLeftMouseDownCallback() // touch behavior down below... break; case CLICK_ACTION_SIT: - - if ((gAgent.getAvatarObject() != NULL) && (!gAgent.getAvatarObject()->isSitting())) // agent not already sitting { - handle_object_sit_or_stand(); - // put focus in world when sitting on an object - gFocusMgr.setKeyboardFocus(NULL); - return TRUE; - } // else nothing (fall through to touch) - + if (isAgentAvatarValid() && !gAgentAvatarp->isSitting()) // agent not already sitting + { + handle_object_sit_or_stand(); + // put focus in world when sitting on an object + gFocusMgr.setKeyboardFocus(NULL); + return TRUE; + } // else nothing (fall through to touch) + } case CLICK_ACTION_PAY: if ((object && object->flagTakesMoney()) || (parent && parent->flagTakesMoney())) @@ -263,7 +264,7 @@ BOOL LLToolPie::pickLeftMouseDownCallback() if (object) { - gAgent.setFocusOnAvatar(FALSE, ANIMATE); + gAgentCamera.setFocusOnAvatar(FALSE, ANIMATE); LLBBox bbox = object->getBoundingBoxAgent() ; F32 angle_of_view = llmax(0.1f, LLViewerCamera::getInstance()->getAspect() > 1.f ? LLViewerCamera::getInstance()->getView() * LLViewerCamera::getInstance()->getAspect() : LLViewerCamera::getInstance()->getView()); @@ -273,7 +274,7 @@ BOOL LLToolPie::pickLeftMouseDownCallback() obj_to_cam.normVec(); LLVector3d object_center_global = gAgent.getPosGlobalFromAgent(bbox.getCenterAgent()); - gAgent.setCameraPosAndFocusGlobal(object_center_global + LLVector3d(obj_to_cam * distance), + gAgentCamera.setCameraPosAndFocusGlobal(object_center_global + LLVector3d(obj_to_cam * distance), object_center_global, mPick.mObjectID ); } @@ -285,14 +286,12 @@ BOOL LLToolPie::pickLeftMouseDownCallback() } } - if (handleMediaClick(mPick)) - { - return TRUE; - } - // put focus back "in world" gFocusMgr.setKeyboardFocus(NULL); + BOOL touchable = (object && object->flagHandleTouch()) + || (parent && parent->flagHandleTouch()); + // Switch to grab tool if physical or triggerable if (object && !object->isAvatar() && @@ -329,14 +328,14 @@ BOOL LLToolPie::pickLeftMouseDownCallback() } object = (LLViewerObject*)object->getParent(); } - if (object && object == gAgent.getAvatarObject()) + if (object && object == gAgentAvatarp) { // we left clicked on avatar, switch to focus mode LLToolMgr::getInstance()->setTransientTool(LLToolCamera::getInstance()); gViewerWindow->hideCursor(); LLToolCamera::getInstance()->setMouseCapture(TRUE); LLToolCamera::getInstance()->pickCallback(mPick); - gAgent.setFocusOnAvatar(TRUE, TRUE); + gAgentCamera.setFocusOnAvatar(TRUE, TRUE); return TRUE; } @@ -410,26 +409,28 @@ ECursorType cursor_from_object(LLViewerObject* object) switch(click_action) { case CLICK_ACTION_SIT: - if ((gAgent.getAvatarObject() != NULL) && (!gAgent.getAvatarObject()->isSitting())) // not already sitting? { - cursor = UI_CURSOR_HAND; + if (isAgentAvatarValid() && !gAgentAvatarp->isSitting()) // not already sitting? + { + cursor = UI_CURSOR_TOOLSIT; + } } break; case CLICK_ACTION_BUY: - cursor = UI_CURSOR_HAND; + cursor = UI_CURSOR_TOOLBUY; break; case CLICK_ACTION_OPEN: // Open always opens the parent. if (parent && parent->allowOpen()) { - cursor = UI_CURSOR_HAND; + cursor = UI_CURSOR_TOOLOPEN; } break; case CLICK_ACTION_PAY: if ((object && object->flagTakesMoney()) || (parent && parent->flagTakesMoney())) { - cursor = UI_CURSOR_HAND; + cursor = UI_CURSOR_TOOLBUY; } break; case CLICK_ACTION_ZOOM: @@ -496,6 +497,8 @@ void LLToolPie::selectionPropertiesReceived() BOOL LLToolPie::handleHover(S32 x, S32 y, MASK mask) { mHoverPick = gViewerWindow->pickImmediate(x, y, FALSE); + // perform a separate pick that detects transparent objects since they respond to 1-click actions + LLPickInfo click_action_pick = gViewerWindow->pickImmediate(x, y, TRUE); // Show screen-space highlight glow effect bool show_highlight = false; @@ -507,21 +510,23 @@ BOOL LLToolPie::handleHover(S32 x, S32 y, MASK mask) parent = object->getRootEdit(); } - if (object && useClickAction(mask, object, parent)) + LLViewerObject* click_action_object = click_action_pick.getObject(); + if (handleMediaHover(mHoverPick)) { + // *NOTE: If you think the hover glow conflicts with the media outline, you + // could disable it here. show_highlight = true; - ECursorType cursor = cursor_from_object(object); - gViewerWindow->setCursor(cursor); + // cursor set by media object lldebugst(LLERR_USER_INPUT) << "hover handled by LLToolPie (inactive)" << llendl; } - else if (handleMediaHover(mHoverPick)) + else if (click_action_object && useClickAction(mask, click_action_object, click_action_object->getRootEdit())) { - // *NOTE: If you think the hover glow conflicts with the media outline, you - // could disable it here. show_highlight = true; - // cursor set by media object + ECursorType cursor = cursor_from_object(click_action_object); + gViewerWindow->setCursor(cursor); lldebugst(LLERR_USER_INPUT) << "hover handled by LLToolPie (inactive)" << llendl; } + else if ((object && !object->isAvatar() && object->usePhysics()) || (parent && !parent->isAvatar() && parent->usePhysics())) { @@ -592,7 +597,7 @@ BOOL LLToolPie::handleMouseUp(S32 x, S32 y, MASK mask) mGrabMouseButtonDown = FALSE; LLToolMgr::getInstance()->clearTransientTool(); - gAgent.setLookAt(LOOKAT_TARGET_CONVERSATION, obj); // maybe look at object/person clicked on + gAgentCamera.setLookAt(LOOKAT_TARGET_CONVERSATION, obj); // maybe look at object/person clicked on return LLTool::handleMouseUp(x, y, mask); } @@ -901,6 +906,16 @@ BOOL LLToolPie::handleTooltipObject( LLViewerObject* hover_object, std::string l || !existing_inspector->getVisible() || existing_inspector->getKey()["object_id"].asUUID() != hover_object->getID())) { + + // Add price to tooltip for items on sale + bool for_sale = for_sale_selection(nodep); + if(for_sale) + { + LLStringUtil::format_map_t args; + args["[PRICE]"] = llformat ("%d", nodep->mSaleInfo.getSalePrice()); + tooltip_msg.append(LLTrans::getString("TooltipPrice", args) ); + } + if (nodep->mName.empty()) { tooltip_msg.append(LLTrans::getString("TooltipNoName")); @@ -931,7 +946,7 @@ BOOL LLToolPie::handleTooltipObject( LLViewerObject* hover_object, std::string l if (media_impl.notNull() && (media_impl->hasMedia())) { is_media_displaying = true; - LLStringUtil::format_map_t args; + //LLStringUtil::format_map_t args; media_plugin = media_impl->getMediaPlugin(); if(media_plugin) @@ -955,10 +970,13 @@ BOOL LLToolPie::handleTooltipObject( LLViewerObject* hover_object, std::string l } } - // Avoid showing tip over media that's displaying + + // Avoid showing tip over media that's displaying unless it's for sale // also check the primary node since sometimes it can have an action even though // the root node doesn't - bool needs_tip = !is_media_displaying && + + bool needs_tip = (!is_media_displaying || + for_sale) && (has_media || needs_tooltip(nodep) || needs_tooltip(LLSelectMgr::getInstance()->getPrimaryHoverNode())); @@ -1249,6 +1267,7 @@ bool LLToolPie::handleMediaClick(const LLPickInfo& pick) if (!parcel || objectp.isNull() || + objectp->isHUDAttachment() || pick.mObjectFace < 0 || pick.mObjectFace >= objectp->getNumTEs()) { @@ -1263,11 +1282,10 @@ bool LLToolPie::handleMediaClick(const LLPickInfo& pick) return false; LLMediaEntry* mep = (tep->hasMedia()) ? tep->getMediaData() : NULL; - if(!mep) return false; - viewer_media_t media_impl = mep ? LLViewerMedia::getMediaImplFromTextureID(mep->getMediaID()) : NULL; + viewer_media_t media_impl = LLViewerMedia::getMediaImplFromTextureID(mep->getMediaID()); if (gSavedSettings.getBOOL("MediaOnAPrimUI")) { @@ -1485,6 +1503,12 @@ BOOL LLToolPie::pickRightMouseDownCallback() while( object && object->isAttachment()) { object = (LLViewerObject*)object->getParent(); + llassert(object); + } + + if (!object) + { + return TRUE; // unexpected, but escape } // Object is an avatar, so check for mute by id. diff --git a/indra/newview/lltoolplacer.cpp b/indra/newview/lltoolplacer.cpp index 612bcc03bd..91f01f0b36 100644 --- a/indra/newview/lltoolplacer.cpp +++ b/indra/newview/lltoolplacer.cpp @@ -56,11 +56,13 @@ #include "llvolumemessage.h" #include "llhudmanager.h" #include "llagent.h" +#include "llagentcamera.h" #include "llaudioengine.h" #include "llhudeffecttrail.h" #include "llviewerobjectlist.h" #include "llviewercamera.h" #include "llviewerstats.h" +#include "llvoavatarself.h" // linden library headers #include "llprimitive.h" @@ -120,7 +122,7 @@ BOOL LLToolPlacer::raycastForNewObjPos( S32 x, S32 y, LLViewerObject** hit_obj, } // Make sure the surface isn't too far away. - LLVector3d ray_start_global = gAgent.getCameraPositionGlobal(); + LLVector3d ray_start_global = gAgentCamera.getCameraPositionGlobal(); F32 dist_to_surface_sq = (F32)((surface_pos_global - ray_start_global).magVecSquared()); if( dist_to_surface_sq > (max_dist_from_camera * max_dist_from_camera) ) { @@ -432,7 +434,7 @@ BOOL LLToolPlacer::addObject( LLPCode pcode, S32 x, S32 y, U8 use_physics ) // VEFFECT: AddObject LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BEAM, TRUE); - effectp->setSourceObject((LLViewerObject*)gAgent.getAvatarObject()); + effectp->setSourceObject((LLViewerObject*)gAgentAvatarp); effectp->setPositionGlobal(regionp->getPosGlobalFromRegion(ray_end_region)); effectp->setDuration(LL_HUD_DUR_SHORT); effectp->setColor(LLColor4U(gAgent.getEffectColor())); diff --git a/indra/newview/lltoolselect.cpp b/indra/newview/lltoolselect.cpp index 97e2865179..2065ba1791 100644 --- a/indra/newview/lltoolselect.cpp +++ b/indra/newview/lltoolselect.cpp @@ -35,6 +35,7 @@ #include "lltoolselect.h" #include "llagent.h" +#include "llagentcamera.h" #include "llviewercontrol.h" #include "lldrawable.h" #include "llmanip.h" @@ -167,9 +168,9 @@ LLObjectSelectionHandle LLToolSelect::handleObjectSelection(const LLPickInfo& pi LLSelectMgr::getInstance()->setAgentHUDZoom(target_zoom, current_zoom); } - if (!gAgent.getFocusOnAvatar() && // if camera not glued to avatar - LLVOAvatar::findAvatarFromAttachment(object) != gAgent.getAvatarObject() && // and it's not one of your attachments - object != gAgent.getAvatarObject()) // and it's not you + if (!gAgentCamera.getFocusOnAvatar() && // if camera not glued to avatar + LLVOAvatar::findAvatarFromAttachment(object) != gAgentAvatarp && // and it's not one of your attachments + object != gAgentAvatarp) // and it's not you { // have avatar turn to face the selected object(s) LLVector3d selection_center = LLSelectMgr::getInstance()->getSelectionCenterGlobal(); diff --git a/indra/newview/lltracker.cpp b/indra/newview/lltracker.cpp index 407cc23d0d..cc074287c4 100644 --- a/indra/newview/lltracker.cpp +++ b/indra/newview/lltracker.cpp @@ -39,6 +39,7 @@ #include "llgl.h" #include "llrender.h" #include "llinventory.h" +#include "llinventorydefines.h" #include "llpointer.h" #include "llstring.h" #include "lluuid.h" @@ -50,6 +51,7 @@ #include "llappviewer.h" #include "lltracker.h" #include "llagent.h" +#include "llagentcamera.h" #include "llcallingcard.h" #include "llfloaterworldmap.h" #include "llhudtext.h" @@ -480,14 +482,14 @@ void LLTracker::renderBeacon(LLVector3d pos_global, const std::string& label ) { sCheesyBeacon = gSavedSettings.getBOOL("CheesyBeacon"); - LLVector3d to_vec = pos_global - gAgent.getCameraPositionGlobal(); + LLVector3d to_vec = pos_global - gAgentCamera.getCameraPositionGlobal(); F32 dist = (F32)to_vec.magVec(); F32 color_frac = 1.f; if (dist > 0.99f * LLViewerCamera::getInstance()->getFar()) { color_frac = 0.4f; - // pos_global = gAgent.getCameraPositionGlobal() + 0.99f*(LLViewerCamera::getInstance()->getFar()/dist)*to_vec; + // pos_global = gAgentCamera.getCameraPositionGlobal() + 0.99f*(LLViewerCamera::getInstance()->getFar()/dist)*to_vec; } else { @@ -741,10 +743,10 @@ void LLTracker::setLandmarkVisited() LLInventoryItem* i = gInventory.getItem( mTrackedLandmarkItemID ); LLViewerInventoryItem* item = (LLViewerInventoryItem*)i; if ( item - && !(item->getFlags()&LLInventoryItem::II_FLAGS_LANDMARK_VISITED)) + && !(item->getFlags()&LLInventoryItemFlags::II_FLAGS_LANDMARK_VISITED)) { U32 flags = item->getFlags(); - flags |= LLInventoryItem::II_FLAGS_LANDMARK_VISITED; + flags |= LLInventoryItemFlags::II_FLAGS_LANDMARK_VISITED; item->setFlags(flags); LLMessageSystem* msg = gMessageSystem; msg->newMessage("ChangeInventoryItemFlags"); @@ -797,7 +799,7 @@ void LLTracker::cacheLandmarkPosition() mLandmarkHasBeenVisited = FALSE; LLInventoryItem* item = gInventory.getItem(mTrackedLandmarkItemID); if ( item - && item->getFlags()&LLInventoryItem::II_FLAGS_LANDMARK_VISITED) + && item->getFlags()&LLInventoryItemFlags::II_FLAGS_LANDMARK_VISITED) { mLandmarkHasBeenVisited = TRUE; } diff --git a/indra/newview/lluploaddialog.cpp b/indra/newview/lluploaddialog.cpp index 577b5952e5..22c7d670f8 100644 --- a/indra/newview/lluploaddialog.cpp +++ b/indra/newview/lluploaddialog.cpp @@ -91,7 +91,7 @@ LLUploadDialog::LLUploadDialog( const std::string& msg) setMessage(msg); // The dialog view is a root view - gFocusMgr.setTopCtrl( this ); + gViewerWindow->addPopup(this); } void LLUploadDialog::setMessage( const std::string& msg) diff --git a/indra/newview/llurl.cpp b/indra/newview/llurl.cpp index ab65ead4c5..83a5839a93 100644 --- a/indra/newview/llurl.cpp +++ b/indra/newview/llurl.cpp @@ -286,5 +286,11 @@ const char * LLURL::getFullPath() return(sReturnString); } +const char * LLURL::getAuthority() +{ + strncpy(LLURL::sReturnString,mAuthority, LL_MAX_PATH -1); /* Flawfinder: ignore */ + LLURL::sReturnString[LL_MAX_PATH -1] = '\0'; + return(sReturnString); +} char LLURL::sReturnString[LL_MAX_PATH] = ""; diff --git a/indra/newview/llurl.h b/indra/newview/llurl.h index 9a089dd835..e41b83d29f 100644 --- a/indra/newview/llurl.h +++ b/indra/newview/llurl.h @@ -79,6 +79,7 @@ public: virtual const char *getFQURL() const; virtual const char *getFullPath(); + virtual const char *getAuthority(); virtual const char *updateRelativePath(const LLURL &url); diff --git a/indra/newview/llurldispatcher.cpp b/indra/newview/llurldispatcher.cpp index 0b6bd4b401..cbaa7248a2 100644 --- a/indra/newview/llurldispatcher.cpp +++ b/indra/newview/llurldispatcher.cpp @@ -4,7 +4,7 @@ * * $LicenseInfo:firstyear=2007&license=viewergpl$ * - * Copyright (c) 2007-2009, Linden Research, Inc. + * Copyright (c) 2010, Linden Research, Inc. * * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab @@ -12,13 +12,12 @@ * ("GPL"), unless you have obtained a separate licensing agreement * ("Other License"), formally executed by you and Linden Lab. Terms of * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * online at http://secondlife.com/developers/opensource/gplv2 * * There are special exceptions to the terms and conditions of the GPL as * it is applied to this Source Code. View the full text of the exception * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * online at http://secondlife.com/developers/opensource/flossexception * * By copying, modifying or distributing this software, you acknowledge * that you have read and understood your obligations described above, @@ -45,10 +44,10 @@ #include "llsidetray.h" #include "llslurl.h" #include "llstartup.h" // gStartupState -#include "llurlsimstring.h" #include "llweb.h" #include "llworldmapmessage.h" #include "llurldispatcherlistener.h" +#include "llviewernetwork.h" // library includes #include "llnotificationsutil.h" @@ -59,25 +58,25 @@ static LLURLDispatcherListener sURLDispatcherListener; class LLURLDispatcherImpl { public: - static bool dispatch(const std::string& url, + static bool dispatch(const LLSLURL& slurl, LLMediaCtrl* web, bool trusted_browser); // returns true if handled or explicitly blocked. - static bool dispatchRightClick(const std::string& url); + static bool dispatchRightClick(const LLSLURL& slurl); private: - static bool dispatchCore(const std::string& url, + static bool dispatchCore(const LLSLURL& slurl, bool right_mouse, LLMediaCtrl* web, bool trusted_browser); // handles both left and right click - static bool dispatchHelp(const std::string& url, bool right_mouse); + static bool dispatchHelp(const LLSLURL& slurl, bool right_mouse); // Handles sl://app.floater.html.help by showing Help floater. // Returns true if handled. - static bool dispatchApp(const std::string& url, + static bool dispatchApp(const LLSLURL& slurl, bool right_mouse, LLMediaCtrl* web, bool trusted_browser); @@ -85,16 +84,16 @@ private: // by showing panel in Search floater. // Returns true if handled or explicitly blocked. - static bool dispatchRegion(const std::string& url, bool right_mouse); + static bool dispatchRegion(const LLSLURL& slurl, bool right_mouse); // handles secondlife://Ahern/123/45/67/ // Returns true if handled. - static void regionHandleCallback(U64 handle, const std::string& url, + static void regionHandleCallback(U64 handle, const LLSLURL& slurl, const LLUUID& snapshot_id, bool teleport); // Called by LLWorldMap when a location has been resolved to a // region name - static void regionNameCallback(U64 handle, const std::string& url, + static void regionNameCallback(U64 handle, const LLSLURL& slurl, const LLUUID& snapshot_id, bool teleport); // Called by LLWorldMap when a region name has been resolved to a // location in-world, used by places-panel display. @@ -103,65 +102,58 @@ private: }; // static -bool LLURLDispatcherImpl::dispatchCore(const std::string& url, +bool LLURLDispatcherImpl::dispatchCore(const LLSLURL& slurl, bool right_mouse, LLMediaCtrl* web, bool trusted_browser) { - if (url.empty()) return false; - //if (dispatchHelp(url, right_mouse)) return true; - if (dispatchApp(url, right_mouse, web, trusted_browser)) return true; - if (dispatchRegion(url, right_mouse)) return true; + //if (dispatchHelp(slurl, right_mouse)) return true; + switch(slurl.getType()) + { + case LLSLURL::APP: + return dispatchApp(slurl, right_mouse, web, trusted_browser); + case LLSLURL::LOCATION: + return dispatchRegion(slurl, right_mouse); + default: + return false; + } /* // Inform the user we can't handle this std::map<std::string, std::string> args; - args["SLURL"] = url; + args["SLURL"] = slurl; r; */ - - return false; } // static -bool LLURLDispatcherImpl::dispatch(const std::string& url, +bool LLURLDispatcherImpl::dispatch(const LLSLURL& slurl, LLMediaCtrl* web, bool trusted_browser) { - llinfos << "url: " << url << llendl; const bool right_click = false; - return dispatchCore(url, right_click, web, trusted_browser); + return dispatchCore(slurl, right_click, web, trusted_browser); } // static -bool LLURLDispatcherImpl::dispatchRightClick(const std::string& url) +bool LLURLDispatcherImpl::dispatchRightClick(const LLSLURL& slurl) { - llinfos << "url: " << url << llendl; const bool right_click = true; LLMediaCtrl* web = NULL; const bool trusted_browser = false; - return dispatchCore(url, right_click, web, trusted_browser); + return dispatchCore(slurl, right_click, web, trusted_browser); } // static -bool LLURLDispatcherImpl::dispatchApp(const std::string& url, +bool LLURLDispatcherImpl::dispatchApp(const LLSLURL& slurl, bool right_mouse, LLMediaCtrl* web, bool trusted_browser) { - // ensure the URL is in the secondlife:///app/ format - if (!LLSLURL::isSLURLCommand(url)) - { - return false; - } - - LLURI uri(url); - LLSD pathArray = uri.pathArray(); - pathArray.erase(0); // erase "app" - std::string cmd = pathArray.get(0); - pathArray.erase(0); // erase "cmd" + llinfos << "cmd: " << slurl.getAppCmd() << " path: " << slurl.getAppPath() << " query: " << slurl.getAppQuery() << llendl; + const LLSD& query_map = LLURI::queryMap(slurl.getAppQuery()); bool handled = LLCommandDispatcher::dispatch( - cmd, pathArray, uri.queryMap(), web, trusted_browser); + slurl.getAppCmd(), slurl.getAppPath(), query_map, web, trusted_browser); // alert if we didn't handle this secondlife:///app/ SLURL // (but still return true because it is a valid app SLURL) @@ -173,109 +165,73 @@ bool LLURLDispatcherImpl::dispatchApp(const std::string& url, } // static -bool LLURLDispatcherImpl::dispatchRegion(const std::string& url, bool right_mouse) +bool LLURLDispatcherImpl::dispatchRegion(const LLSLURL& slurl, bool right_mouse) { - if (!LLSLURL::isSLURL(url)) - { - return false; - } - + if(slurl.getType() != LLSLURL::LOCATION) + { + return false; + } // Before we're logged in, need to update the startup screen // to tell the user where they are going. if (LLStartUp::getStartupState() < STATE_LOGIN_CLEANUP) { - // Parse it and stash in globals, it will be dispatched in - // STATE_CLEANUP. - LLURLSimString::setString(url); // We're at the login screen, so make sure user can see // the login location box to know where they are going. - LLPanelLogin::refreshLocation( true ); + LLPanelLogin::setLocation(slurl); return true; } - std::string sim_string = LLSLURL::stripProtocol(url); - std::string region_name; - S32 x = 128; - S32 y = 128; - S32 z = 0; - LLURLSimString::parse(sim_string, ®ion_name, &x, &y, &z); - // LLFloaterURLDisplay functionality moved to LLPanelPlaces in Side Tray. - //LLFloaterURLDisplay* url_displayp = LLFloaterReg::getTypedInstance<LLFloaterURLDisplay>("preview_url",LLSD()); - //if(url_displayp) url_displayp->setName(region_name); + //LLFloaterURLDisplay* slurl_displayp = LLFloaterReg::getTypedInstance<LLFloaterURLDisplay>("preview_url",LLSD()); + //if(slurl_displayp) slurl_displayp->setName(region_name); // Request a region handle by name - LLWorldMapMessage::getInstance()->sendNamedRegionRequest(region_name, + LLWorldMapMessage::getInstance()->sendNamedRegionRequest(slurl.getRegion(), LLURLDispatcherImpl::regionNameCallback, - url, + slurl.getSLURLString(), false); // don't teleport return true; } /*static*/ -void LLURLDispatcherImpl::regionNameCallback(U64 region_handle, const std::string& url, const LLUUID& snapshot_id, bool teleport) +void LLURLDispatcherImpl::regionNameCallback(U64 region_handle, const LLSLURL& slurl, const LLUUID& snapshot_id, bool teleport) { - std::string sim_string = LLSLURL::stripProtocol(url); - std::string region_name; - S32 x = 128; - S32 y = 128; - S32 z = 0; - LLURLSimString::parse(sim_string, ®ion_name, &x, &y, &z); - - LLVector3 local_pos; - local_pos.mV[VX] = (F32)x; - local_pos.mV[VY] = (F32)y; - local_pos.mV[VZ] = (F32)z; + + if(slurl.getType() == LLSLURL::LOCATION) + { + regionHandleCallback(region_handle, slurl, snapshot_id, teleport); + } +} - - // determine whether the point is in this region - if ((x >= 0) && (x < REGION_WIDTH_UNITS) && - (y >= 0) && (y < REGION_WIDTH_UNITS)) - { - // if so, we're done - regionHandleCallback(region_handle, url, snapshot_id, teleport); - } +/* static */ +void LLURLDispatcherImpl::regionHandleCallback(U64 region_handle, const LLSLURL& slurl, const LLUUID& snapshot_id, bool teleport) +{ - else + // we can't teleport cross grid at this point + if((!LLGridManager::getInstance()->isSystemGrid(slurl.getGrid()) || !LLGridManager::getInstance()->isSystemGrid()) && + (slurl.getGrid() != LLGridManager::getInstance()->getGrid())) { - // otherwise find the new region from the location + LLSD args; + args["SLURL"] = slurl.getLocationString(); + args["CURRENT_GRID"] = LLGridManager::getInstance()->getGridLabel(); + LLSD grid_info; + LLGridManager::getInstance()->getGridInfo(slurl.getGrid(), grid_info); - // add the position to get the new region - LLVector3d global_pos = from_region_handle(region_handle) + LLVector3d(local_pos); - - U64 new_region_handle = to_region_handle(global_pos); - LLWorldMapMessage::getInstance()->sendHandleRegionRequest(new_region_handle, - LLURLDispatcherImpl::regionHandleCallback, - url, teleport); + if(grid_info.has(GRID_LABEL_VALUE)) + { + args["GRID"] = grid_info[GRID_LABEL_VALUE].asString(); + } + else + { + args["GRID"] = slurl.getGrid(); + } + LLNotificationsUtil::add("CantTeleportToGrid", args); + return; } -} - -/* static */ -void LLURLDispatcherImpl::regionHandleCallback(U64 region_handle, const std::string& url, const LLUUID& snapshot_id, bool teleport) -{ - std::string sim_string = LLSLURL::stripProtocol(url); - std::string region_name; - S32 x = 128; - S32 y = 128; - S32 z = 0; - LLURLSimString::parse(sim_string, ®ion_name, &x, &y, &z); - - // remap x and y to local coordinates - S32 local_x = x % REGION_WIDTH_UNITS; - S32 local_y = y % REGION_WIDTH_UNITS; - if (local_x < 0) - local_x += REGION_WIDTH_UNITS; - if (local_y < 0) - local_y += REGION_WIDTH_UNITS; - LLVector3 local_pos; - local_pos.mV[VX] = (F32)local_x; - local_pos.mV[VY] = (F32)local_y; - local_pos.mV[VZ] = (F32)z; - LLVector3d global_pos = from_region_handle(region_handle); - global_pos += LLVector3d(local_pos); + global_pos += LLVector3d(slurl.getPosition()); if (teleport) { @@ -299,8 +255,8 @@ void LLURLDispatcherImpl::regionHandleCallback(U64 region_handle, const std::str // LLFloaterURLDisplay functionality moved to LLPanelPlaces in Side Tray. // // display informational floater, allow user to click teleport btn -// LLFloaterURLDisplay* url_displayp = LLFloaterReg::getTypedInstance<LLFloaterURLDisplay>("preview_url",LLSD()); -// if(url_displayp) +// LLFloaterURLDisplay* slurl_displayp = LLFloaterReg::getTypedInstance<LLFloaterURLDisplay>("preview_url",LLSD()); +// if(slurl_displayp) // { // url_displayp->displayParcelInfo(region_handle, local_pos); // if(snapshot_id.notNull()) @@ -315,7 +271,7 @@ void LLURLDispatcherImpl::regionHandleCallback(U64 region_handle, const std::str //--------------------------------------------------------------------------- // Teleportation links are handled here because they are tightly coupled -// to URL parsing and sim-fragment parsing +// to SLURL parsing and sim-fragment parsing class LLTeleportHandler : public LLCommandHandler { public: @@ -331,18 +287,21 @@ public: // a global position, and teleport to it if (tokens.size() < 1) return false; - // Region names may be %20 escaped. - std::string region_name = LLURLSimString::unescapeRegionName(tokens[0]); - - // build secondlife://De%20Haro/123/45/67 for use in callback - std::string url = LLSLURL::PREFIX_SECONDLIFE; - for (int i = 0; i < tokens.size(); ++i) + LLVector3 coords(128, 128, 0); + if (tokens.size() <= 4) { - url += tokens[i].asString() + "/"; + coords = LLVector3(tokens[1].asReal(), + tokens[2].asReal(), + tokens[3].asReal()); } + + // Region names may be %20 escaped. + + std::string region_name = LLURI::unescape(tokens[0]); + LLWorldMapMessage::getInstance()->sendNamedRegionRequest(region_name, LLURLDispatcherImpl::regionHandleCallback, - url, + LLSLURL(region_name, coords).getSLURLString(), true); // teleport return true; } @@ -352,21 +311,21 @@ LLTeleportHandler gTeleportHandler; //--------------------------------------------------------------------------- // static -bool LLURLDispatcher::dispatch(const std::string& url, +bool LLURLDispatcher::dispatch(const std::string& slurl, LLMediaCtrl* web, bool trusted_browser) { - return LLURLDispatcherImpl::dispatch(url, web, trusted_browser); + return LLURLDispatcherImpl::dispatch(LLSLURL(slurl), web, trusted_browser); } // static -bool LLURLDispatcher::dispatchRightClick(const std::string& url) +bool LLURLDispatcher::dispatchRightClick(const std::string& slurl) { - return LLURLDispatcherImpl::dispatchRightClick(url); + return LLURLDispatcherImpl::dispatchRightClick(LLSLURL(slurl)); } // static -bool LLURLDispatcher::dispatchFromTextEditor(const std::string& url) +bool LLURLDispatcher::dispatchFromTextEditor(const std::string& slurl) { // *NOTE: Text editors are considered sources of trusted URLs // in order to make avatar profile links in chat history work. @@ -376,5 +335,7 @@ bool LLURLDispatcher::dispatchFromTextEditor(const std::string& url) // *TODO: Make this trust model more refined. JC const bool trusted_browser = true; LLMediaCtrl* web = NULL; - return LLURLDispatcherImpl::dispatch(url, web, trusted_browser); + return LLURLDispatcherImpl::dispatch(LLSLURL(slurl), web, trusted_browser); } + + diff --git a/indra/newview/llurldispatcher.h b/indra/newview/llurldispatcher.h index ff8a351253..407e417e58 100644 --- a/indra/newview/llurldispatcher.h +++ b/indra/newview/llurldispatcher.h @@ -2,9 +2,9 @@ * @file llurldispatcher.h * @brief Central registry for all SL URL handlers * - * $LicenseInfo:firstyear=2007&license=viewergpl$ + * $LicenseInfo:firstyear=2010&license=viewergpl$ * - * Copyright (c) 2007-2009, Linden Research, Inc. + * Copyright (c) 2007-2010, Linden Research, Inc. * * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab @@ -12,13 +12,12 @@ * ("GPL"), unless you have obtained a separate licensing agreement * ("Other License"), formally executed by you and Linden Lab. Terms of * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * online at http://secondlife.com/developers/opensource/gplv2 * * There are special exceptions to the terms and conditions of the GPL as * it is applied to this Source Code. View the full text of the exception * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * online at http://secondlife.com/developers/opensource/flossexception * * By copying, modifying or distributing this software, you acknowledge * that you have read and understood your obligations described above, @@ -31,16 +30,16 @@ */ #ifndef LLURLDISPATCHER_H #define LLURLDISPATCHER_H - class LLMediaCtrl; class LLURLDispatcher { public: - static bool dispatch(const std::string& url, + + static bool dispatch(const std::string& slurl, LLMediaCtrl* web, - bool trusted_browser); + bool trusted_browser); // At startup time and on clicks in internal web browsers, // teleport, open map, or run requested command. // @param url @@ -54,9 +53,9 @@ public: // that navigates to trusted (Linden Lab) pages. // Returns true if someone handled the URL. - static bool dispatchRightClick(const std::string& url); + static bool dispatchRightClick(const std::string& slurl); - static bool dispatchFromTextEditor(const std::string& url); + static bool dispatchFromTextEditor(const std::string& slurl); }; #endif diff --git a/indra/newview/llurllineeditorctrl.cpp b/indra/newview/llurllineeditorctrl.cpp index 258c3ddd75..8488527185 100644 --- a/indra/newview/llurllineeditorctrl.cpp +++ b/indra/newview/llurllineeditorctrl.cpp @@ -72,7 +72,7 @@ void LLURLLineEditor::cut() if( need_to_rollback ) { rollback.doRollback( this ); - reportBadKeystroke(); + LLUI::reportBadKeystroke(); } else if( mKeystrokeCallback ) @@ -89,15 +89,10 @@ void LLURLLineEditor::copyEscapedURLToClipboard() const std::string unescaped_text = wstring_to_utf8str(mText.getWString().substr(left_pos, length)); LLWString text_to_copy; - if (LLSLURL::isSLURL(unescaped_text)) + if (LLSLURL(unescaped_text).isValid()) text_to_copy = utf8str_to_wstring(LLWeb::escapeURL(unescaped_text)); else text_to_copy = utf8str_to_wstring(unescaped_text); gClipboard.copyFromString( text_to_copy ); } -// Makes UISndBadKeystroke sound -void LLURLLineEditor::reportBadKeystroke() -{ - make_ui_sound("UISndBadKeystroke"); -} diff --git a/indra/newview/llurllineeditorctrl.h b/indra/newview/llurllineeditorctrl.h index 618f29dfbf..ebe417e855 100644 --- a/indra/newview/llurllineeditorctrl.h +++ b/indra/newview/llurllineeditorctrl.h @@ -55,8 +55,6 @@ protected: private: // util function to escape selected text and copy it to clipboard void copyEscapedURLToClipboard(); - // send a beep signal if keystroke is bad. As it is private at LLLineEditor we need own function - void reportBadKeystroke(); // Helper class to do rollback if needed class LLURLLineEditorRollback diff --git a/indra/newview/llviewerassetstorage.cpp b/indra/newview/llviewerassetstorage.cpp index bb49804aff..c3a6b7111b 100644 --- a/indra/newview/llviewerassetstorage.cpp +++ b/indra/newview/llviewerassetstorage.cpp @@ -41,15 +41,16 @@ #include "llagent.h" LLViewerAssetStorage::LLViewerAssetStorage(LLMessageSystem *msg, LLXferManager *xfer, - LLVFS *vfs, const LLHost &upstream_host) - : LLAssetStorage(msg, xfer, vfs, upstream_host) + LLVFS *vfs, LLVFS *static_vfs, + const LLHost &upstream_host) + : LLAssetStorage(msg, xfer, vfs, static_vfs, upstream_host) { } LLViewerAssetStorage::LLViewerAssetStorage(LLMessageSystem *msg, LLXferManager *xfer, - LLVFS *vfs) - : LLAssetStorage(msg, xfer, vfs) + LLVFS *vfs, LLVFS *static_vfs) + : LLAssetStorage(msg, xfer, vfs, static_vfs) { } diff --git a/indra/newview/llviewerassetstorage.h b/indra/newview/llviewerassetstorage.h index 512b590a1b..8e7ea3471d 100644 --- a/indra/newview/llviewerassetstorage.h +++ b/indra/newview/llviewerassetstorage.h @@ -42,10 +42,10 @@ class LLViewerAssetStorage : public LLAssetStorage { public: LLViewerAssetStorage(LLMessageSystem *msg, LLXferManager *xfer, - LLVFS *vfs, const LLHost &upstream_host); + LLVFS *vfs, LLVFS *static_vfs, const LLHost &upstream_host); LLViewerAssetStorage(LLMessageSystem *msg, LLXferManager *xfer, - LLVFS *vfs); + LLVFS *vfs, LLVFS *static_vfs); using LLAssetStorage::storeAssetData; virtual void storeAssetData( diff --git a/indra/newview/llviewerattachmenu.cpp b/indra/newview/llviewerattachmenu.cpp new file mode 100644 index 0000000000..f7f5ec72fd --- /dev/null +++ b/indra/newview/llviewerattachmenu.cpp @@ -0,0 +1,139 @@ +/** + * @file llviewerattachmenu.cpp + * @brief "Attach to" / "Attach to HUD" submenus. + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llviewerattachmenu.h" + +// project includes +#include "llagent.h" +#include "llinventorybridge.h" // for rez_attachment() +#include "llinventorymodel.h" +#include "llviewerinventory.h" +#include "llviewermenu.h" // for gMenuHolder +#include "llvoavatarself.h" + +// linden libraries +#include "llmenugl.h" +#include "lltrans.h" + +// static +void LLViewerAttachMenu::populateMenus(const std::string& attach_to_menu_name, const std::string& attach_to_hud_menu_name) +{ + // *TODO: share this code with other similar menus + // (inventory panel context menu, in-world object menu). + + if (attach_to_menu_name.empty() || attach_to_hud_menu_name.empty() || !isAgentAvatarValid()) return; + + LLContextMenu* attach_menu = gMenuHolder->getChild<LLContextMenu>(attach_to_menu_name); + LLContextMenu* attach_hud_menu = gMenuHolder->getChild<LLContextMenu>(attach_to_hud_menu_name); + + if (!attach_menu || attach_menu->getChildCount() != 0 || + !attach_hud_menu || attach_hud_menu->getChildCount() != 0) + { + return; + } + + // Populate "Attach to..." / "Attach to HUD..." submenus. + for (LLVOAvatar::attachment_map_t::iterator iter = gAgentAvatarp->mAttachmentPoints.begin(); + iter != gAgentAvatarp->mAttachmentPoints.end(); ) + { + LLVOAvatar::attachment_map_t::iterator curiter = iter++; + LLViewerJointAttachment* attachment = curiter->second; + LLMenuItemCallGL::Params p; + std::string submenu_name = attachment->getName(); + std::string translated_submenu_name; + + if (LLTrans::findString(translated_submenu_name, submenu_name)) + { + p.name = (" ") + translated_submenu_name + " "; + } + else + { + p.name = submenu_name; + } + + LLSD cbparams; + cbparams["index"] = curiter->first; + cbparams["label"] = attachment->getName(); + p.on_click.function_name = "Object.Attach"; + p.on_click.parameter = LLSD(attachment->getName()); + p.on_enable.function_name = "Attachment.Label"; + p.on_enable.parameter = cbparams; + + LLMenuItemCallGL* item = LLUICtrlFactory::create<LLMenuItemCallGL>(p); + LLView* parent_menu = attachment->getIsHUDAttachment() ? attach_hud_menu : attach_menu; + parent_menu->addChild(item); + } +} + +// static +void LLViewerAttachMenu::attachObjects(const uuid_vec_t& items, const std::string& joint_name) +{ + LLViewerJointAttachment* attachmentp = NULL; + for (LLVOAvatar::attachment_map_t::iterator iter = gAgentAvatarp->mAttachmentPoints.begin(); + iter != gAgentAvatarp->mAttachmentPoints.end(); ) + { + LLVOAvatar::attachment_map_t::iterator curiter = iter++; + LLViewerJointAttachment* attachment = curiter->second; + if (attachment->getName() == joint_name) + { + attachmentp = attachment; + break; + } + } + if (attachmentp == NULL) + { + return; + } + + for (uuid_vec_t::const_iterator it = items.begin(); it != items.end(); ++it) + { + const LLUUID &id = *it; + LLViewerInventoryItem* item = (LLViewerInventoryItem*)gInventory.getLinkedItem(id); + if(item && gInventory.isObjectDescendentOf(id, gInventory.getRootFolderID())) + { + rez_attachment(item, attachmentp); + } + else if(item && item->isFinished()) + { + // must be in library. copy it to our inventory and put it on. + LLPointer<LLInventoryCallback> cb = new RezAttachmentCallback(attachmentp); + copy_inventory_item(gAgent.getID(), + item->getPermissions().getOwner(), + item->getUUID(), + LLUUID::null, + std::string(), + cb); + } + } +} diff --git a/indra/newview/llviewerattachmenu.h b/indra/newview/llviewerattachmenu.h new file mode 100644 index 0000000000..d1db9914f3 --- /dev/null +++ b/indra/newview/llviewerattachmenu.h @@ -0,0 +1,43 @@ +/** + * @file llviewerattachmenu.h + * @brief "Attach to" / "Attach to HUD" submenus. + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLVIEWERATTACHMENU_H +#define LL_LLVIEWERATTACHMENU_H + +class LLViewerAttachMenu +{ +public: + static void populateMenus(const std::string& attach_to_menu_name, const std::string& attach_to_hud_menu_name); + static void attachObjects(const uuid_vec_t& items, const std::string& joint_name); +}; + +#endif // LL_LLVIEWERATTACHMENU_H diff --git a/indra/newview/llvieweraudio.cpp b/indra/newview/llvieweraudio.cpp index 934981b0ad..1094f030bf 100644 --- a/indra/newview/llvieweraudio.cpp +++ b/indra/newview/llvieweraudio.cpp @@ -34,6 +34,7 @@ #include "llaudioengine.h" #include "llagent.h" +#include "llagentcamera.h" #include "llappviewer.h" #include "llvieweraudio.h" #include "llviewercamera.h" @@ -51,7 +52,7 @@ void init_audio() llwarns << "Failed to create an appropriate Audio Engine" << llendl; return; } - LLVector3d lpos_global = gAgent.getCameraPositionGlobal(); + LLVector3d lpos_global = gAgentCamera.getCameraPositionGlobal(); LLVector3 lpos_global_f; lpos_global_f.setVec(lpos_global); @@ -144,7 +145,7 @@ void audio_update_volume(bool force_update) { F32 music_volume = gSavedSettings.getF32("AudioLevelMusic"); BOOL music_muted = gSavedSettings.getBOOL("MuteMusic"); - music_volume = mute_volume * master_volume * (music_volume*music_volume); + music_volume = mute_volume * master_volume * music_volume; gAudiop->setInternetStreamGain ( music_muted ? 0.f : music_volume ); } @@ -152,25 +153,25 @@ void audio_update_volume(bool force_update) // Streaming Media F32 media_volume = gSavedSettings.getF32("AudioLevelMedia"); BOOL media_muted = gSavedSettings.getBOOL("MuteMedia"); - media_volume = mute_volume * master_volume * (media_volume*media_volume); + media_volume = mute_volume * master_volume * media_volume; LLViewerMedia::setVolume( media_muted ? 0.0f : media_volume ); // Voice - if (gVoiceClient) + if (LLVoiceClient::getInstance()) { F32 voice_volume = gSavedSettings.getF32("AudioLevelVoice"); voice_volume = mute_volume * master_volume * voice_volume; BOOL voice_mute = gSavedSettings.getBOOL("MuteVoice"); - gVoiceClient->setVoiceVolume(voice_mute ? 0.f : voice_volume); - gVoiceClient->setMicGain(voice_mute ? 0.f : gSavedSettings.getF32("AudioLevelMic")); + LLVoiceClient::getInstance()->setVoiceVolume(voice_mute ? 0.f : voice_volume); + LLVoiceClient::getInstance()->setMicGain(voice_mute ? 0.f : gSavedSettings.getF32("AudioLevelMic")); if (!gViewerWindow->getActive() && (gSavedSettings.getBOOL("MuteWhenMinimized"))) { - gVoiceClient->setMuteMic(true); + LLVoiceClient::getInstance()->setMuteMic(true); } else { - gVoiceClient->setMuteMic(false); + LLVoiceClient::getInstance()->setMuteMic(false); } } } @@ -180,7 +181,7 @@ void audio_update_listener() if (gAudiop) { // update listener position because agent has moved - LLVector3d lpos_global = gAgent.getCameraPositionGlobal(); + LLVector3d lpos_global = gAgentCamera.getCameraPositionGlobal(); LLVector3 lpos_global_f; lpos_global_f.setVec(lpos_global); @@ -203,7 +204,7 @@ void audio_update_wind(bool force_update) if (region) { static F32 last_camera_water_height = -1000.f; - LLVector3 camera_pos = gAgent.getCameraPositionAgent(); + LLVector3 camera_pos = gAgentCamera.getCameraPositionAgent(); F32 camera_water_height = camera_pos.mV[VZ] - region->getWaterHeight(); // @@ -251,7 +252,7 @@ void audio_update_wind(bool force_update) { // initialize wind volume (force_update) by using large volume_delta // which is sufficient to completely turn off or turn on wind noise - volume_delta = max_wind_volume; + volume_delta = 1.f; } // mute wind when not flying diff --git a/indra/newview/llviewercamera.cpp b/indra/newview/llviewercamera.cpp index bd4f172907..aa82c216d9 100644 --- a/indra/newview/llviewercamera.cpp +++ b/indra/newview/llviewercamera.cpp @@ -37,6 +37,7 @@ // Viewer includes #include "llagent.h" +#include "llagentcamera.h" #include "llviewercontrol.h" #include "llviewerobjectlist.h" #include "llviewerregion.h" @@ -338,7 +339,12 @@ void LLViewerCamera::setPerspective(BOOL for_selection, { // make a tiny little viewport // anything drawn into this viewport will be "selected" - GLint* viewport = (GLint*) gGLViewport; + + GLint viewport[4]; + viewport[0] = gViewerWindow->getWorldViewRectRaw().mLeft; + viewport[1] = gViewerWindow->getWorldViewRectRaw().mBottom; + viewport[2] = gViewerWindow->getWorldViewRectRaw().getWidth(); + viewport[3] = gViewerWindow->getWorldViewRectRaw().getHeight(); proj_mat = gl_pick_matrix(x+width/2.f, y_from_bot+height/2.f, (GLfloat) width, (GLfloat) height, viewport); @@ -349,7 +355,7 @@ void LLViewerCamera::setPerspective(BOOL for_selection, } else { - z_far = gAgent.mDrawDistance; + z_far = gAgentCamera.mDrawDistance; } } else @@ -405,6 +411,9 @@ void LLViewerCamera::setPerspective(BOOL for_selection, if (for_selection && (width > 1 || height > 1)) { + // NB: as of this writing, i believe the code below is broken (doesn't take into account the world view, assumes entire window) + // however, it is also unused (the GL matricies are used for selection, (see LLCamera::sphereInFrustum())) and so i'm not + // comfortable hacking on it. calculateFrustumPlanesFromWindow((F32)(x - width / 2) / (F32)gViewerWindow->getWindowWidthScaled() - 0.5f, (F32)(y_from_bot - height / 2) / (F32)gViewerWindow->getWindowHeightScaled() - 0.5f, (F32)(x + width / 2) / (F32)gViewerWindow->getWindowWidthScaled() - 0.5f, diff --git a/indra/newview/llviewerchat.cpp b/indra/newview/llviewerchat.cpp index 8de87eb602..320456e1e2 100644 --- a/indra/newview/llviewerchat.cpp +++ b/indra/newview/llviewerchat.cpp @@ -37,6 +37,7 @@ #include "llagent.h" // gAgent #include "lluicolortable.h" #include "llviewercontrol.h" // gSavedSettings +#include "llinstantmessage.h" //SYSTEM_FROM // LLViewerChat @@ -55,7 +56,7 @@ void LLViewerChat::getChatColor(const LLChat& chat, LLColor4& r_color) r_color = LLUIColorTable::instance().getColor("SystemChatColor"); break; case CHAT_SOURCE_AGENT: - if (chat.mFromID.isNull()) + if (chat.mFromID.isNull() || SYSTEM_FROM == chat.mFromName) { r_color = LLUIColorTable::instance().getColor("SystemChatColor"); } diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp index 64eabe65cf..f2c9fbf78d 100644 --- a/indra/newview/llviewercontrol.cpp +++ b/indra/newview/llviewercontrol.cpp @@ -41,6 +41,7 @@ // For Listeners #include "llaudioengine.h" #include "llagent.h" +#include "llagentcamera.h" #include "llconsole.h" #include "lldrawpoolterrain.h" #include "llflexibleobject.h" @@ -69,10 +70,11 @@ #include "llvosurfacepatch.h" #include "llvowlsky.h" #include "llrender.h" -#include "llbottomtray.h" #include "llnavigationbar.h" #include "llfloatertools.h" #include "llpaneloutfitsinventory.h" +#include "llpanellogin.h" +#include "llpaneltopinfobar.h" #ifdef TOGGLE_HACKED_GODLIKE_VIEWER BOOL gHackGodmode = FALSE; @@ -102,7 +104,7 @@ static bool handleRenderAvatarMouselookChanged(const LLSD& newvalue) static bool handleRenderFarClipChanged(const LLSD& newvalue) { F32 draw_distance = (F32) newvalue.asReal(); - gAgent.mDrawDistance = draw_distance; + gAgentCamera.mDrawDistance = draw_distance; LLWorld::getInstance()->setLandFarClip(draw_distance); return true; } @@ -411,10 +413,7 @@ bool handleHighResSnapshotChanged(const LLSD& newvalue) bool handleVoiceClientPrefsChanged(const LLSD& newvalue) { - if(gVoiceClient) - { - gVoiceClient->updateSettings(); - } + LLVoiceClient::getInstance()->updateSettings(); return true; } @@ -442,6 +441,12 @@ bool handleVelocityInterpolate(const LLSD& newvalue) return true; } +bool handleForceShowGrid(const LLSD& newvalue) +{ + LLPanelLogin::updateServer( ); + return true; +} + bool toggle_agent_pause(const LLSD& newvalue) { if ( newvalue.asBoolean() ) @@ -455,33 +460,13 @@ bool toggle_agent_pause(const LLSD& newvalue) return true; } -bool toggle_show_gesture_button(const LLSD& newvalue) -{ - LLBottomTray::getInstance()->showGestureButton(newvalue.asBoolean()); - return true; -} - -bool toggle_show_move_button(const LLSD& newvalue) -{ - LLBottomTray::getInstance()->showMoveButton(newvalue.asBoolean()); - return true; -} - -bool toggle_show_camera_button(const LLSD& newvalue) +bool toggle_show_navigation_panel(const LLSD& newvalue) { - LLBottomTray::getInstance()->showCameraButton(newvalue.asBoolean()); - return true; -} + bool value = newvalue.asBoolean(); -bool toggle_show_snapshot_button(const LLSD& newvalue) -{ - LLBottomTray::getInstance()->showSnapshotButton(newvalue.asBoolean()); - return true; -} + LLNavigationBar::getInstance()->showNavigationPanel(value); + gSavedSettings.setBOOL("ShowMiniLocationPanel", !value); -bool toggle_show_navigation_panel(const LLSD& newvalue) -{ - LLNavigationBar::getInstance()->showNavigationPanel(newvalue.asBoolean()); return true; } @@ -491,9 +476,13 @@ bool toggle_show_favorites_panel(const LLSD& newvalue) return true; } -bool toggle_show_appearance_editor(const LLSD& newvalue) +bool toggle_show_mini_location_panel(const LLSD& newvalue) { - LLPanelOutfitsInventory::sShowDebugEditor = newvalue.asBoolean(); + bool value = newvalue.asBoolean(); + + LLPanelTopInfoBar::getInstance()->setVisible(value); + gSavedSettings.setBOOL("ShowNavbarNavigationPanel", !value); + return true; } @@ -510,6 +499,7 @@ void settings_setup_listeners() gSavedSettings.getControl("FirstPersonAvatarVisible")->getSignal()->connect(boost::bind(&handleRenderAvatarMouselookChanged, _2)); gSavedSettings.getControl("RenderFarClip")->getSignal()->connect(boost::bind(&handleRenderFarClipChanged, _2)); gSavedSettings.getControl("RenderTerrainDetail")->getSignal()->connect(boost::bind(&handleTerrainDetailChanged, _2)); + gSavedSettings.getControl("RenderUseTriStrips")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _2)); gSavedSettings.getControl("RenderAnimateTrees")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _2)); gSavedSettings.getControl("RenderAvatarVP")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2)); gSavedSettings.getControl("VertexShaderEnable")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2)); @@ -638,14 +628,11 @@ void settings_setup_listeners() gSavedSettings.getControl("QAMode")->getSignal()->connect(boost::bind(&show_debug_menus)); gSavedSettings.getControl("UseDebugMenus")->getSignal()->connect(boost::bind(&show_debug_menus)); gSavedSettings.getControl("AgentPause")->getSignal()->connect(boost::bind(&toggle_agent_pause, _2)); - gSavedSettings.getControl("ShowGestureButton")->getSignal()->connect(boost::bind(&toggle_show_gesture_button, _2)); - gSavedSettings.getControl("ShowMoveButton")->getSignal()->connect(boost::bind(&toggle_show_move_button, _2)); - gSavedSettings.getControl("ShowCameraButton")->getSignal()->connect(boost::bind(&toggle_show_camera_button, _2)); - gSavedSettings.getControl("ShowSnapshotButton")->getSignal()->connect(boost::bind(&toggle_show_snapshot_button, _2)); gSavedSettings.getControl("ShowNavbarNavigationPanel")->getSignal()->connect(boost::bind(&toggle_show_navigation_panel, _2)); gSavedSettings.getControl("ShowNavbarFavoritesPanel")->getSignal()->connect(boost::bind(&toggle_show_favorites_panel, _2)); - gSavedSettings.getControl("ShowDebugAppearanceEditor")->getSignal()->connect(boost::bind(&toggle_show_appearance_editor, _2)); + gSavedSettings.getControl("ShowMiniLocationPanel")->getSignal()->connect(boost::bind(&toggle_show_mini_location_panel, _2)); gSavedSettings.getControl("ShowObjectRenderingCost")->getSignal()->connect(boost::bind(&toggle_show_object_render_cost, _2)); + gSavedSettings.getControl("ForceShowGrid")->getSignal()->connect(boost::bind(&handleForceShowGrid, _2)); } #if TEST_CACHED_CONTROL diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp index ba256d70e8..ab6ff88073 100644 --- a/indra/newview/llviewerdisplay.cpp +++ b/indra/newview/llviewerdisplay.cpp @@ -38,6 +38,7 @@ #include "llrender.h" #include "llglheaders.h" #include "llagent.h" +#include "llagentcamera.h" #include "llviewercontrol.h" #include "llcoord.h" #include "llcriticaldamp.h" @@ -113,7 +114,6 @@ void render_hud_attachments(); void render_ui_3d(); void render_ui_2d(); void render_disconnected_background(); -void render_hud_elements(); void display_startup() { @@ -169,14 +169,13 @@ void display_startup() void display_update_camera() { LLMemType mt_uc(LLMemType::MTYPE_DISPLAY_UPDATE_CAMERA); - llpushcallstacks ; // TODO: cut draw distance down if customizing avatar? // TODO: cut draw distance on per-parcel basis? // Cut draw distance in half when customizing avatar, // but on the viewer only. - F32 final_far = gAgent.mDrawDistance; - if (CAMERA_MODE_CUSTOMIZE_AVATAR == gAgent.getCameraMode()) + F32 final_far = gAgentCamera.mDrawDistance; + if (CAMERA_MODE_CUSTOMIZE_AVATAR == gAgentCamera.getCameraMode()) { final_far *= 0.5f; } @@ -345,9 +344,9 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) const F32 TELEPORT_ARRIVAL_DELAY = 2.f; // Time to preload the world before raising the curtain after we've actually already arrived. S32 attach_count = 0; - if (gAgent.getAvatarObject()) + if (isAgentAvatarValid()) { - attach_count = gAgent.getAvatarObject()->getAttachmentCount(); + attach_count = gAgentAvatarp->getAttachmentCount(); } F32 teleport_save_time = TELEPORT_EXPIRY + TELEPORT_EXPIRY_PER_ATTACHMENT * attach_count; F32 teleport_elapsed = gTeleportDisplayTimer.getElapsedTimeF32(); @@ -394,7 +393,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) gAgent.setTeleportMessage( LLAgent::sTeleportProgressMessages["arriving"]); gTextureList.mForceResetTextureStats = TRUE; - gAgent.resetView(TRUE, TRUE); + gAgentCamera.resetView(TRUE, TRUE); break; case LLAgent::TELEPORT_ARRIVING: @@ -598,7 +597,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) LLPipeline::sFastAlpha = gSavedSettings.getBOOL("RenderFastAlpha"); LLPipeline::sUseFarClip = gSavedSettings.getBOOL("RenderUseFarClip"); - LLVOAvatar::sMaxVisible = gSavedSettings.getS32("RenderAvatarMaxVisible"); + LLVOAvatar::sMaxVisible = (U32)gSavedSettings.getS32("RenderAvatarMaxVisible"); LLPipeline::sDelayVBUpdate = gSavedSettings.getBOOL("RenderDelayVBUpdate"); S32 occlusion = LLPipeline::sUseOcclusion; @@ -700,8 +699,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) // Doing this here gives hardware occlusion queries extra time to complete LLAppViewer::instance()->pingMainloopTimeout("Display:UpdateImages"); LLError::LLCallStacks::clear() ; - llpushcallstacks ; - + { LLMemType mt_iu(LLMemType::MTYPE_DISPLAY_IMAGE_UPDATE); LLFastTimer t(FTM_IMAGE_UPDATE); @@ -719,7 +717,6 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) LLImageGL::deleteDeadTextures(); stop_glerror(); } - llpushcallstacks ; /////////////////////////////////// // // StateSort @@ -732,6 +729,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) { LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_WORLD; LLMemType mt_ss(LLMemType::MTYPE_DISPLAY_STATE_SORT); + gPipeline.sAllowRebuildPriorityGroup = TRUE ; gPipeline.stateSort(*LLViewerCamera::getInstance(), result); stop_glerror(); @@ -921,9 +919,9 @@ void render_hud_attachments() glh::matrix4f current_mod = glh_get_current_modelview(); // clamp target zoom level to reasonable values - gAgent.mHUDTargetZoom = llclamp(gAgent.mHUDTargetZoom, 0.1f, 1.f); + gAgentCamera.mHUDTargetZoom = llclamp(gAgentCamera.mHUDTargetZoom, 0.1f, 1.f); // smoothly interpolate current zoom level - gAgent.mHUDCurZoom = lerp(gAgent.mHUDCurZoom, gAgent.mHUDTargetZoom, LLCriticalDamp::getInterpolant(0.03f)); + gAgentCamera.mHUDCurZoom = lerp(gAgentCamera.mHUDCurZoom, gAgentCamera.mHUDTargetZoom, LLCriticalDamp::getInterpolant(0.03f)); if (LLPipeline::sShowHUDAttachments && !gDisconnected && setup_hud_matrices()) { @@ -990,6 +988,7 @@ void render_hud_attachments() LLSpatialGroup::sNoDelete = FALSE; render_hud_elements(); + //restore type mask gPipeline.setRenderTypeMask(mask); if (has_ui) @@ -1031,11 +1030,10 @@ LLRect get_whole_screen_region() bool get_hud_matrices(const LLRect& screen_region, glh::matrix4f &proj, glh::matrix4f &model) { - LLVOAvatar* my_avatarp = gAgent.getAvatarObject(); - if (my_avatarp && my_avatarp->hasHUDAttachment()) + if (isAgentAvatarValid() && gAgentAvatarp->hasHUDAttachment()) { - F32 zoom_level = gAgent.mHUDCurZoom; - LLBBox hud_bbox = my_avatarp->getHUDBBox(); + F32 zoom_level = gAgentCamera.mHUDCurZoom; + LLBBox hud_bbox = gAgentAvatarp->getHUDBBox(); F32 hud_depth = llmax(1.f, hud_bbox.getExtentLocal().mV[VX] * 1.1f); proj = gl_ortho(-0.5f * LLViewerCamera::getInstance()->getAspect(), 0.5f * LLViewerCamera::getInstance()->getAspect(), -0.5f, 0.5f, 0.f, hud_depth); @@ -1129,7 +1127,6 @@ void render_ui(F32 zoom_factor, int subfield) } { - gGL.color4f(1,1,1,1); if (gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI)) { @@ -1300,14 +1297,14 @@ void render_ui_2d() gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT); // render outline for HUD - if (gAgent.getAvatarObject() && gAgent.mHUDCurZoom < 0.98f) + if (isAgentAvatarValid() && gAgentCamera.mHUDCurZoom < 0.98f) { glPushMatrix(); S32 half_width = (gViewerWindow->getWorldViewWidthScaled() / 2); S32 half_height = (gViewerWindow->getWorldViewHeightScaled() / 2); glScalef(LLUI::sGLScaleFactor.mV[0], LLUI::sGLScaleFactor.mV[1], 1.f); glTranslatef((F32)half_width, (F32)half_height, 0.f); - F32 zoom = gAgent.mHUDCurZoom; + F32 zoom = gAgentCamera.mHUDCurZoom; glScalef(zoom,zoom,1.f); gGL.color4fv(LLColor4::white.mV); gl_rect_2d(-half_width, half_height, half_width, -half_height, FALSE); diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp index 29114c33c5..efe59744bc 100644 --- a/indra/newview/llviewerfloaterreg.cpp +++ b/indra/newview/llviewerfloaterreg.cpp @@ -40,7 +40,6 @@ #include "llcompilequeue.h" #include "llcallfloater.h" #include "llfloaterabout.h" -#include "llfloateractivespeakers.h" #include "llfloateranimpreview.h" #include "llfloaterauction.h" #include "llfloateravatarpicker.h" @@ -50,11 +49,13 @@ #include "llfloaterbuy.h" #include "llfloaterbuycontents.h" #include "llfloaterbuycurrency.h" +#include "llfloaterbuycurrencyhtml.h" #include "llfloaterbuyland.h" #include "llfloaterbulkpermission.h" #include "llfloaterbump.h" #include "llfloatercamera.h" #include "llfloaterdaycycle.h" +#include "llfloaterevent.h" #include "llfloatersearch.h" #include "llfloaterenvsettings.h" #include "llfloaterfonttest.h" @@ -77,7 +78,6 @@ #include "llfloatermap.h" #include "llfloatermemleak.h" #include "llfloaternamedesc.h" -#include "llfloaternearbymedia.h" #include "llfloaternotificationsconsole.h" #include "llfloateropenobject.h" #include "llfloaterpay.h" @@ -103,6 +103,7 @@ #include "llfloateruipreview.h" #include "llfloaterurldisplay.h" #include "llfloatervoicedevicesettings.h" +#include "llfloatervoiceeffect.h" #include "llfloaterwater.h" #include "llfloaterwhitelistentry.h" #include "llfloaterwindlight.h" @@ -117,6 +118,7 @@ #include "llmoveview.h" #include "llnearbychat.h" #include "llpanelblockedlist.h" +#include "llpanelclassified.h" #include "llpreviewanim.h" #include "llpreviewgesture.h" #include "llpreviewnotecard.h" @@ -134,7 +136,6 @@ void LLViewerFloaterReg::registerFloaters() LLFloaterAboutUtil::registerFloater(); LLFloaterReg::add("about_land", "floater_about_land.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterLand>); - LLFloaterReg::add("active_speakers", "floater_active_speakers.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterActiveSpeakers>); LLFloaterReg::add("auction", "floater_auction.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAuction>); LLFloaterReg::add("avatar_picker", "floater_avatar_picker.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAvatarPicker>); LLFloaterReg::add("avatar_textures", "floater_avatar_textures.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAvatarTextures>); @@ -142,6 +143,7 @@ void LLViewerFloaterReg::registerFloaters() LLFloaterReg::add("beacons", "floater_beacons.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterBeacons>); LLFloaterReg::add("bulk_perms", "floater_bulk_perms.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterBulkPermission>); LLFloaterReg::add("buy_currency", "floater_buy_currency.xml", &LLFloaterBuyCurrency::buildFloater); + LLFloaterReg::add("buy_currency_html", "floater_buy_currency_html.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterBuyCurrencyHTML>); LLFloaterReg::add("buy_land", "floater_buy_land.xml", &LLFloaterBuyLand::buildFloater); LLFloaterReg::add("buy_object", "floater_buy_object.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterBuy>); LLFloaterReg::add("buy_object_contents", "floater_buy_contents.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterBuyContents>); @@ -150,7 +152,6 @@ void LLViewerFloaterReg::registerFloaters() LLFloaterReg::add("bumps", "floater_bumps.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterBump>); LLFloaterReg::add("camera", "floater_camera.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterCamera>); - //LLFloaterReg::add("chat", "floater_chat_history.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterChat>); LLFloaterReg::add("nearby_chat", "floater_nearby_chat.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLNearbyChat>); LLFloaterReg::add("compile_queue", "floater_script_queue.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterCompileQueue>); @@ -160,6 +161,8 @@ void LLViewerFloaterReg::registerFloaters() LLFloaterReg::add("env_settings", "floater_env_settings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterEnvSettings>); LLFloaterReg::add("env_water", "floater_water.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterWater>); LLFloaterReg::add("env_windlight", "floater_windlight_options.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterWindLight>); + + LLFloaterReg::add("event", "floater_event.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterEvent>); LLFloaterReg::add("font_test", "floater_font_test.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterFontTest>); @@ -194,7 +197,6 @@ void LLViewerFloaterReg::registerFloaters() LLFloaterReg::add("mute_object_by_name", "floater_mute_object.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterGetBlockedObjectName>); LLFloaterReg::add("mini_map", "floater_map.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterMap>); - LLFloaterReg::add("nearby_media", "floater_nearby_media.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterNearbyMedia>); LLFloaterReg::add("notifications_console", "floater_notifications_console.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterNotificationConsole>); LLFloaterReg::add("notification_well_window", "floater_sys_well.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLNotificationWellWindow>); @@ -218,6 +220,7 @@ void LLViewerFloaterReg::registerFloaters() LLFloaterReg::add("preview_sound", "floater_preview_sound.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLPreviewSound>, "preview"); LLFloaterReg::add("preview_texture", "floater_preview_texture.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLPreviewTexture>, "preview"); LLFloaterReg::add("properties", "floater_inventory_item_properties.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterProperties>); + LLFloaterReg::add("publish_classified", "floater_publish_classified.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLPublishClassifiedFloater>); LLFloaterReg::add("telehubs", "floater_telehub.xml",&LLFloaterReg::build<LLFloaterTelehub>); LLFloaterReg::add("test_inspectors", "floater_test_inspectors.xml", @@ -253,7 +256,8 @@ void LLViewerFloaterReg::registerFloaters() LLFloaterReg::add("upload_sound", "floater_sound_preview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSoundPreview>, "upload"); LLFloaterReg::add("voice_controls", "floater_voice_controls.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLCallFloater>); - + LLFloaterReg::add("voice_effect", "floater_voice_effect.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterVoiceEffect>); + LLFloaterReg::add("whitelist_entry", "floater_whitelist_entry.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterWhiteListEntry>); LLFloaterWindowSizeUtil::registerFloater(); LLFloaterReg::add("world_map", "floater_world_map.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterWorldMap>); diff --git a/indra/newview/llviewerfoldertype.cpp b/indra/newview/llviewerfoldertype.cpp index 033d35d80a..3105a6ec43 100644 --- a/indra/newview/llviewerfoldertype.cpp +++ b/indra/newview/llviewerfoldertype.cpp @@ -43,13 +43,16 @@ struct ViewerFolderEntry : public LLDictionaryEntry { // Constructor for non-ensembles ViewerFolderEntry(const std::string &new_category_name, // default name when creating a new category of this type - const std::string &icon_name, // name of the folder icon - BOOL is_quiet // folder doesn't need a UI update when changed + const std::string &icon_name_open, // name of the folder icon + const std::string &icon_name_closed, + BOOL is_quiet, // folder doesn't need a UI update when changed + const std::string &dictionary_name = empty_string // no reverse lookup needed on non-ensembles, so in most cases just leave this blank ) : - LLDictionaryEntry(empty_string), // no reverse lookup needed on non-ensembles, so just leave this blank - mIconName(icon_name), + LLDictionaryEntry(dictionary_name), mNewCategoryName(new_category_name), + mIconNameOpen(icon_name_open), + mIconNameClosed(icon_name_closed), mIsQuiet(is_quiet) { mAllowedNames.clear(); @@ -63,7 +66,11 @@ struct ViewerFolderEntry : public LLDictionaryEntry ) : LLDictionaryEntry(xui_name), - mIconName(icon_name), + /* Just use default icons until we actually support ensembles + mIconNameOpen(icon_name), + mIconNameClosed(icon_name), + */ + mIconNameOpen("Inv_FolderOpen"), mIconNameClosed("Inv_FolderClosed"), mNewCategoryName(new_category_name), mIsQuiet(FALSE) { @@ -84,7 +91,8 @@ struct ViewerFolderEntry : public LLDictionaryEntry } return false; } - const std::string mIconName; + const std::string mIconNameOpen; + const std::string mIconNameClosed; const std::string mNewCategoryName; typedef std::vector<std::string> name_vec_t; name_vec_t mAllowedNames; @@ -102,33 +110,40 @@ protected: LLViewerFolderDictionary::LLViewerFolderDictionary() { - initEnsemblesFromFile(); - - // NEW CATEGORY NAME FOLDER ICON NAME QUIET? - // |-------------------------|-------------------------------|-----------| - addEntry(LLFolderType::FT_TEXTURE, new ViewerFolderEntry("Textures", "inv_folder_texture.tga", FALSE)); - addEntry(LLFolderType::FT_SOUND, new ViewerFolderEntry("Sounds", "inv_folder_sound.tga", FALSE)); - addEntry(LLFolderType::FT_CALLINGCARD, new ViewerFolderEntry("Calling Cards", "inv_folder_callingcard.tga", FALSE)); - addEntry(LLFolderType::FT_LANDMARK, new ViewerFolderEntry("Landmarks", "inv_folder_landmark.tga", FALSE)); - addEntry(LLFolderType::FT_CLOTHING, new ViewerFolderEntry("Clothing", "inv_folder_clothing.tga", FALSE)); - addEntry(LLFolderType::FT_OBJECT, new ViewerFolderEntry("Objects", "inv_folder_object.tga", FALSE)); - addEntry(LLFolderType::FT_NOTECARD, new ViewerFolderEntry("Notecards", "inv_folder_notecard.tga", FALSE)); - addEntry(LLFolderType::FT_ROOT_INVENTORY, new ViewerFolderEntry("My Inventory", "", FALSE)); - addEntry(LLFolderType::FT_LSL_TEXT, new ViewerFolderEntry("Scripts", "inv_folder_script.tga", FALSE)); - addEntry(LLFolderType::FT_BODYPART, new ViewerFolderEntry("Body Parts", "inv_folder_bodypart.tga", FALSE)); - addEntry(LLFolderType::FT_TRASH, new ViewerFolderEntry("Trash", "inv_folder_trash.tga", TRUE)); - addEntry(LLFolderType::FT_SNAPSHOT_CATEGORY, new ViewerFolderEntry("Photo Album", "inv_folder_snapshot.tga", FALSE)); - addEntry(LLFolderType::FT_LOST_AND_FOUND, new ViewerFolderEntry("Lost And Found", "inv_folder_lostandfound.tga", TRUE)); - addEntry(LLFolderType::FT_ANIMATION, new ViewerFolderEntry("Animations", "inv_folder_animation.tga", FALSE)); - addEntry(LLFolderType::FT_GESTURE, new ViewerFolderEntry("Gestures", "inv_folder_gesture.tga", FALSE)); - addEntry(LLFolderType::FT_FAVORITE, new ViewerFolderEntry("Favorites", "inv_folder_plain_closed.tga", FALSE)); + // NEW CATEGORY NAME FOLDER OPEN FOLDER CLOSED QUIET? + // |-------------------------|-----------------------|----------------------|-----------| + addEntry(LLFolderType::FT_TEXTURE, new ViewerFolderEntry("Textures", "Inv_SysOpen", "Inv_SysClosed", FALSE)); + addEntry(LLFolderType::FT_SOUND, new ViewerFolderEntry("Sounds", "Inv_SysOpen", "Inv_SysClosed", FALSE)); + addEntry(LLFolderType::FT_CALLINGCARD, new ViewerFolderEntry("Calling Cards", "Inv_SysOpen", "Inv_SysClosed", FALSE)); + addEntry(LLFolderType::FT_LANDMARK, new ViewerFolderEntry("Landmarks", "Inv_SysOpen", "Inv_SysClosed", FALSE)); + addEntry(LLFolderType::FT_CLOTHING, new ViewerFolderEntry("Clothing", "Inv_SysOpen", "Inv_SysClosed", FALSE)); + addEntry(LLFolderType::FT_OBJECT, new ViewerFolderEntry("Objects", "Inv_SysOpen", "Inv_SysClosed", FALSE)); + addEntry(LLFolderType::FT_NOTECARD, new ViewerFolderEntry("Notecards", "Inv_SysOpen", "Inv_SysClosed", FALSE)); + addEntry(LLFolderType::FT_ROOT_INVENTORY, new ViewerFolderEntry("My Inventory", "Inv_SysOpen", "Inv_SysClosed", FALSE)); + addEntry(LLFolderType::FT_LSL_TEXT, new ViewerFolderEntry("Scripts", "Inv_SysOpen", "Inv_SysClosed", FALSE)); + addEntry(LLFolderType::FT_BODYPART, new ViewerFolderEntry("Body Parts", "Inv_SysOpen", "Inv_SysClosed", FALSE)); + addEntry(LLFolderType::FT_TRASH, new ViewerFolderEntry("Trash", "Inv_TrashOpen", "Inv_TrashClosed", TRUE)); + addEntry(LLFolderType::FT_SNAPSHOT_CATEGORY, new ViewerFolderEntry("Photo Album", "Inv_SysOpen", "Inv_SysClosed", FALSE)); + addEntry(LLFolderType::FT_LOST_AND_FOUND, new ViewerFolderEntry("Lost And Found", "Inv_LostOpen", "Inv_LostClosed", TRUE)); + addEntry(LLFolderType::FT_ANIMATION, new ViewerFolderEntry("Animations", "Inv_SysOpen", "Inv_SysClosed", FALSE)); + addEntry(LLFolderType::FT_GESTURE, new ViewerFolderEntry("Gestures", "Inv_SysOpen", "Inv_SysClosed", FALSE)); + addEntry(LLFolderType::FT_FAVORITE, new ViewerFolderEntry("Favorites", "Inv_SysOpen", "Inv_SysClosed", FALSE)); - addEntry(LLFolderType::FT_CURRENT_OUTFIT, new ViewerFolderEntry("Current Outfit", "inv_folder_current_outfit.tga",TRUE)); - addEntry(LLFolderType::FT_OUTFIT, new ViewerFolderEntry("New Outfit", "inv_folder_outfit.tga", TRUE)); - addEntry(LLFolderType::FT_MY_OUTFITS, new ViewerFolderEntry("My Outfits", "inv_folder_my_outfits.tga", TRUE)); - addEntry(LLFolderType::FT_INBOX, new ViewerFolderEntry("Inbox", "inv_folder_inbox.tga", FALSE)); + addEntry(LLFolderType::FT_CURRENT_OUTFIT, new ViewerFolderEntry("Current Outfit", "Inv_SysOpen", "Inv_SysClosed", TRUE)); + addEntry(LLFolderType::FT_OUTFIT, new ViewerFolderEntry("New Outfit", "Inv_LookFolderOpen", "Inv_LookFolderClosed", TRUE)); + addEntry(LLFolderType::FT_MY_OUTFITS, new ViewerFolderEntry("My Outfits", "Inv_SysOpen", "Inv_SysClosed", TRUE)); + addEntry(LLFolderType::FT_INBOX, new ViewerFolderEntry("Inbox", "Inv_SysOpen", "Inv_SysClosed", FALSE)); - addEntry(LLFolderType::FT_NONE, new ViewerFolderEntry("New Folder", "inv_folder_plain_closed.tga", FALSE)); + addEntry(LLFolderType::FT_NONE, new ViewerFolderEntry("New Folder", "Inv_FolderOpen", "Inv_FolderClosed", FALSE, "default")); + +#if SUPPORT_ENSEMBLES + initEnsemblesFromFile(); +#else + for (U32 type = (U32)LLFolderType::FT_ENSEMBLE_START; type <= (U32)LLFolderType::FT_ENSEMBLE_END; ++type) + { + addEntry((LLFolderType::EType)type, new ViewerFolderEntry("New Folder", "Inv_FolderOpen", "Inv_FolderClosed", FALSE)); + } +#endif } bool LLViewerFolderDictionary::initEnsemblesFromFile() @@ -213,13 +228,25 @@ LLFolderType::EType LLViewerFolderType::lookupTypeFromXUIName(const std::string return LLViewerFolderDictionary::getInstance()->lookup(name); } -const std::string &LLViewerFolderType::lookupIconName(LLFolderType::EType folder_type) +const std::string &LLViewerFolderType::lookupIconName(LLFolderType::EType folder_type, BOOL is_open) { const ViewerFolderEntry *entry = LLViewerFolderDictionary::getInstance()->lookup(folder_type); if (entry) { - return entry->mIconName; + if (is_open) + return entry->mIconNameOpen; + else + return entry->mIconNameClosed; + } + + // Error condition. Return something so that we don't show a grey box in inventory view. + const ViewerFolderEntry *default_entry = LLViewerFolderDictionary::getInstance()->lookup(LLFolderType::FT_NONE); + if (default_entry) + { + return default_entry->mIconNameClosed; } + + // Should not get here unless there's something corrupted with the FT_NONE entry. return badLookup(); } diff --git a/indra/newview/llviewerfoldertype.h b/indra/newview/llviewerfoldertype.h index dd9360da90..3744ac20f8 100644 --- a/indra/newview/llviewerfoldertype.h +++ b/indra/newview/llviewerfoldertype.h @@ -44,7 +44,7 @@ public: static const std::string& lookupXUIName(EType folder_type); // name used by the UI static LLFolderType::EType lookupTypeFromXUIName(const std::string& name); - static const std::string& lookupIconName(EType folder_type); // folder icon name + static const std::string& lookupIconName(EType folder_type, BOOL is_open = FALSE); // folder icon name static BOOL lookupIsQuietType(EType folder_type); // folder doesn't require UI update when changes have occured static const std::string& lookupNewCategoryName(EType folder_type); // default name when creating new category static LLFolderType::EType lookupTypeFromNewCategoryName(const std::string& name); // default name when creating new category diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp index 3001992630..3430f265ae 100644 --- a/indra/newview/llviewerinventory.cpp +++ b/indra/newview/llviewerinventory.cpp @@ -36,18 +36,23 @@ #include "llnotificationsutil.h" #include "llsdserialize.h" #include "message.h" -#include "indra_constants.h" #include "llagent.h" +#include "llagentcamera.h" +#include "llagentwearables.h" #include "llviewerfoldertype.h" #include "llfolderview.h" #include "llviewercontrol.h" #include "llconsole.h" +#include "llinventorydefines.h" +#include "llinventoryfunctions.h" #include "llinventorymodel.h" +#include "llinventorymodelbackgroundfetch.h" #include "llgesturemgr.h" #include "llsidetray.h" #include "llinventorybridge.h" +#include "llinventorypanel.h" #include "llfloaterinventory.h" #include "llviewerassettype.h" @@ -57,9 +62,79 @@ #include "llviewerwindow.h" #include "lltrans.h" #include "llappearancemgr.h" -#include "llfloatercustomize.h" #include "llcommandhandler.h" #include "llviewermessage.h" +#include "llsidepanelappearance.h" + +///---------------------------------------------------------------------------- +/// Helper class to store special inventory item names +///---------------------------------------------------------------------------- +class LLLocalizedInventoryItemsDictionary : public LLSingleton<LLLocalizedInventoryItemsDictionary> +{ +public: + std::map<std::string, std::string> mInventoryItemsDict; + + LLLocalizedInventoryItemsDictionary() + { + mInventoryItemsDict["New Shape"] = LLTrans::getString("New Shape"); + mInventoryItemsDict["New Skin"] = LLTrans::getString("New Skin"); + mInventoryItemsDict["New Hair"] = LLTrans::getString("New Hair"); + mInventoryItemsDict["New Eyes"] = LLTrans::getString("New Eyes"); + mInventoryItemsDict["New Shirt"] = LLTrans::getString("New Shirt"); + mInventoryItemsDict["New Pants"] = LLTrans::getString("New Pants"); + mInventoryItemsDict["New Shoes"] = LLTrans::getString("New Shoes"); + mInventoryItemsDict["New Socks"] = LLTrans::getString("New Socks"); + mInventoryItemsDict["New Jacket"] = LLTrans::getString("New Jacket"); + mInventoryItemsDict["New Gloves"] = LLTrans::getString("New Gloves"); + mInventoryItemsDict["New Undershirt"] = LLTrans::getString("New Undershirt"); + mInventoryItemsDict["New Underpants"] = LLTrans::getString("New Underpants"); + mInventoryItemsDict["New Skirt"] = LLTrans::getString("New Skirt"); + mInventoryItemsDict["New Alpha"] = LLTrans::getString("New Alpha"); + mInventoryItemsDict["New Tattoo"] = LLTrans::getString("New Tattoo"); + mInventoryItemsDict["Invalid Wearable"] = LLTrans::getString("Invalid Wearable"); + + mInventoryItemsDict["New Script"] = LLTrans::getString("New Script"); + mInventoryItemsDict["New Folder"] = LLTrans::getString("New Folder"); + mInventoryItemsDict["Contents"] = LLTrans::getString("Contents"); + + mInventoryItemsDict["Gesture"] = LLTrans::getString("Gesture"); + mInventoryItemsDict["Male Gestures"] = LLTrans::getString("Male Gestures"); + mInventoryItemsDict["Female Gestures"] = LLTrans::getString("Female Gestures"); + mInventoryItemsDict["Other Gestures"] = LLTrans::getString("Other Gestures"); + mInventoryItemsDict["Speech Gestures"] = LLTrans::getString("Speech Gestures"); + mInventoryItemsDict["Common Gestures"] = LLTrans::getString("Common Gestures"); + + //predefined gestures + + //male + mInventoryItemsDict["Male - Excuse me"] = LLTrans::getString("Male - Excuse me"); + mInventoryItemsDict["Male - Get lost"] = LLTrans::getString("Male - Get lost"); + mInventoryItemsDict["Male - Blow kiss"] = LLTrans::getString("Male - Blow kiss"); + mInventoryItemsDict["Male - Boo"] = LLTrans::getString("Male - Boo"); + mInventoryItemsDict["Male - Bored"] = LLTrans::getString("Male - Bored"); + mInventoryItemsDict["Male - Hey"] = LLTrans::getString("Male - Hey"); + mInventoryItemsDict["Male - Laugh"] = LLTrans::getString("Male - Laugh"); + mInventoryItemsDict["Male - Repulsed"] = LLTrans::getString("Male - Repulsed"); + mInventoryItemsDict["Male - Shrug"] = LLTrans::getString("Male - Shrug"); + mInventoryItemsDict["Male - Stick tougue out"] = LLTrans::getString("Male - Stick tougue out"); + mInventoryItemsDict["Male - Wow"] = LLTrans::getString("Male - Wow"); + + //female + mInventoryItemsDict["Female - Excuse me"] = LLTrans::getString("Female - Excuse me"); + mInventoryItemsDict["Female - Get lost"] = LLTrans::getString("Female - Get lost"); + mInventoryItemsDict["Female - Blow kiss"] = LLTrans::getString("Female - Blow kiss"); + mInventoryItemsDict["Female - Boo"] = LLTrans::getString("Female - Boo"); + mInventoryItemsDict["Female - Bored"] = LLTrans::getString("Female - Bored"); + mInventoryItemsDict["Female - Hey"] = LLTrans::getString("Female - Hey"); + mInventoryItemsDict["Female - Laugh"] = LLTrans::getString("Female - Laugh"); + mInventoryItemsDict["Female - Repulsed"] = LLTrans::getString("Female - Repulsed"); + mInventoryItemsDict["Female - Shrug"] = LLTrans::getString("Female - Shrug"); + mInventoryItemsDict["Female - Stick tougue out"]= LLTrans::getString("Female - Stick tougue out"); + mInventoryItemsDict["Female - Wow"] = LLTrans::getString("Female - Wow"); + + } +}; + ///---------------------------------------------------------------------------- /// Local function declarations, constants, enums, and typedefs @@ -100,7 +175,7 @@ public: const std::string verb = params[1].asString(); if (verb == "select") { - std::vector<LLUUID> items_to_open; + uuid_vec_t items_to_open; items_to_open.push_back(inventory_id); //inventory_handler is just a stub, because we don't know from who this offer open_inventory_offer(items_to_open, "inventory_handler"); @@ -260,10 +335,14 @@ void LLViewerInventoryItem::fetchFromServer(void) const // we have to check region. It can be null after region was destroyed. See EXT-245 if (region) { - if( ALEXANDRIA_LINDEN_ID.getString() == mPermissions.getOwner().getString()) - url = region->getCapability("FetchLib"); - else - url = region->getCapability("FetchInventory"); + if(gAgent.getID() != mPermissions.getOwner()) + { + url = region->getCapability("FetchLib"); + } + else + { + url = region->getCapability("FetchInventory"); + } } else { @@ -311,6 +390,18 @@ BOOL LLViewerInventoryItem::unpackMessage(LLSD item) BOOL LLViewerInventoryItem::unpackMessage(LLMessageSystem* msg, const char* block, S32 block_num) { BOOL rv = LLInventoryItem::unpackMessage(msg, block, block_num); + + std::string localized_str; + + std::map<std::string, std::string>::const_iterator dictionary_iter; + + dictionary_iter = LLLocalizedInventoryItemsDictionary::getInstance()->mInventoryItemsDict.find(mName); + + if(dictionary_iter != LLLocalizedInventoryItemsDictionary::getInstance()->mInventoryItemsDict.end()) + { + mName = dictionary_iter->second; + } + mIsComplete = TRUE; return rv; } @@ -511,11 +602,12 @@ void LLViewerInventoryCategory::removeFromServer( void ) gAgent.sendReliableMessage(); } -bool LLViewerInventoryCategory::fetchDescendents() +bool LLViewerInventoryCategory::fetch() { if((VERSION_UNKNOWN == mVersion) && mDescendentsRequested.hasExpired()) //Expired check prevents multiple downloads. { + LL_DEBUGS("InventoryFetch") << "Fetching category children: " << mName << ", UUID: " << mUUID << LL_ENDL; const F32 FETCH_TIMER_EXPIRY = 10.0f; mDescendentsRequested.reset(); mDescendentsRequested.setTimerExpirySec(FETCH_TIMER_EXPIRY); @@ -525,7 +617,7 @@ bool LLViewerInventoryCategory::fetchDescendents() // 2 = folders by date // Need to mask off anything but the first bit. // This comes from LLInventoryFilter from llfolderview.h - U32 sort_order = gSavedSettings.getU32("InventorySortOrder") & 0x1; + U32 sort_order = gSavedSettings.getU32(LLInventoryPanel::DEFAULT_SORT_ORDER) & 0x1; // *NOTE: For bug EXT-2879, originally commented out // gAgent.getRegion()->getCapability in order to use the old @@ -536,7 +628,7 @@ bool LLViewerInventoryCategory::fetchDescendents() std::string url = gAgent.getRegion()->getCapability("WebFetchInventoryDescendents"); if (!url.empty()) //Capability found. Build up LLSD and use it. { - gInventory.startBackgroundFetch(mUUID); + LLInventoryModelBackgroundFetch::instance().start(mUUID, false); } else { //Deprecated, but if we don't have a capability, use the old system. @@ -649,6 +741,8 @@ bool LLViewerInventoryCategory::exportFileLocal(LLFILE* fp) const void LLViewerInventoryCategory::determineFolderType() { + /* Do NOT uncomment this code. This is for future 2.1 support of ensembles. + llassert(FALSE); LLFolderType::EType original_type = getPreferredType(); if (LLFolderType::lookupIsProtectedType(original_type)) return; @@ -671,8 +765,8 @@ void LLViewerInventoryCategory::determineFolderType() return; if (item->isWearableType()) { - const EWearableType wearable_type = item->getWearableType(); - const std::string& wearable_name = LLWearableDictionary::getTypeName(wearable_type); + const LLWearableType::EType wearable_type = item->getWearableType(); + const std::string& wearable_name = LLWearableType::getTypeName(wearable_type); U64 valid_folder_types = LLViewerFolderType::lookupValidFolderTypes(wearable_name); folder_valid |= valid_folder_types; folder_invalid |= ~valid_folder_types; @@ -692,6 +786,8 @@ void LLViewerInventoryCategory::determineFolderType() { changeType(LLFolderType::FT_NONE); } + llassert(FALSE); + */ } void LLViewerInventoryCategory::changeType(LLFolderType::EType new_folder_type) @@ -779,19 +875,25 @@ void WearOnAvatarCallback::fire(const LLUUID& inv_item) LLViewerInventoryItem *item = gInventory.getItem(inv_item); if (item) { - wear_inventory_item_on_avatar(item); + LLAppearanceMgr::instance().wearItemOnAvatar(inv_item, true, mReplace); } } void ModifiedCOFCallback::fire(const LLUUID& inv_item) { - LLAppearanceManager::instance().updateAppearanceFromCOF(); - if( CAMERA_MODE_CUSTOMIZE_AVATAR == gAgent.getCameraMode() ) + LLAppearanceMgr::instance().updateAppearanceFromCOF(); + + // Start editing the item if previously requested. + gAgentWearables.editWearableIfRequested(inv_item); + + // TODO: camera mode may not be changed if a debug setting is tweaked + if( gAgentCamera.cameraCustomizeAvatar() ) { // If we're in appearance editing mode, the current tab may need to be refreshed - if (gFloaterCustomize) + LLSidepanelAppearance *panel = dynamic_cast<LLSidepanelAppearance*>(LLSideTray::getInstance()->getPanel("sidepanel_appearance")); + if (panel) { - gFloaterCustomize->switchToDefaultSubpart(); + panel->showDefaultSubpart(); } } } @@ -820,8 +922,13 @@ void ActivateGestureCallback::fire(const LLUUID& inv_item) { if (inv_item.isNull()) return; + LLViewerInventoryItem* item = gInventory.getItem(inv_item); + if (!item) + return; + if (item->getType() != LLAssetType::AT_GESTURE) + return; - LLGestureManager::instance().activateGesture(inv_item); + LLGestureMgr::instance().activateGesture(inv_item); } void CreateGestureCallback::fire(const LLUUID& inv_item) @@ -829,7 +936,7 @@ void CreateGestureCallback::fire(const LLUUID& inv_item) if (inv_item.isNull()) return; - LLGestureManager::instance().activateGesture(inv_item); + LLGestureMgr::instance().activateGesture(inv_item); LLViewerInventoryItem* item = gInventory.getItem(inv_item); if (!item) return; @@ -854,10 +961,29 @@ void create_inventory_item(const LLUUID& agent_id, const LLUUID& session_id, const LLUUID& parent, const LLTransactionID& transaction_id, const std::string& name, const std::string& desc, LLAssetType::EType asset_type, - LLInventoryType::EType inv_type, EWearableType wtype, + LLInventoryType::EType inv_type, LLWearableType::EType wtype, U32 next_owner_perm, LLPointer<LLInventoryCallback> cb) { + //check if name is equal to one of special inventory items names + //EXT-5839 + std::string server_name = name; + + { + std::map<std::string, std::string>::const_iterator dictionary_iter; + + for (dictionary_iter = LLLocalizedInventoryItemsDictionary::getInstance()->mInventoryItemsDict.begin(); + dictionary_iter != LLLocalizedInventoryItemsDictionary::getInstance()->mInventoryItemsDict.end(); + dictionary_iter++) + { + const std::string& localized_name = dictionary_iter->second; + if(localized_name == name) + { + server_name = dictionary_iter->first; + } + } + } + LLMessageSystem* msg = gMessageSystem; msg->newMessageFast(_PREHASH_CreateInventoryItem); msg->nextBlock(_PREHASH_AgentData); @@ -871,7 +997,7 @@ void create_inventory_item(const LLUUID& agent_id, const LLUUID& session_id, msg->addS8Fast(_PREHASH_Type, (S8)asset_type); msg->addS8Fast(_PREHASH_InvType, (S8)inv_type); msg->addU8Fast(_PREHASH_WearableType, (U8)wtype); - msg->addStringFast(_PREHASH_Name, name); + msg->addStringFast(_PREHASH_Name, server_name); msg->addStringFast(_PREHASH_Description, desc); gAgent.sendReliableMessage(); @@ -914,6 +1040,7 @@ void link_inventory_item( const LLUUID& item_id, const LLUUID& parent_id, const std::string& new_name, + const std::string& new_description, const LLAssetType::EType asset_type, LLPointer<LLInventoryCallback> cb) { @@ -939,7 +1066,6 @@ void link_inventory_item( } LLUUID transaction_id; - std::string desc = "Broken link"; // This should only show if the object can't find its baseobj. LLInventoryType::EType inv_type = LLInventoryType::IT_NONE; if (dynamic_cast<const LLInventoryCategory *>(baseobj)) { @@ -970,7 +1096,7 @@ void link_inventory_item( msg->addS8Fast(_PREHASH_Type, (S8)asset_type); msg->addS8Fast(_PREHASH_InvType, (S8)inv_type); msg->addStringFast(_PREHASH_Name, new_name); - msg->addStringFast(_PREHASH_Description, desc); + msg->addStringFast(_PREHASH_Description, new_description); } gAgent.sendReliableMessage(); } @@ -1066,7 +1192,7 @@ const std::string NEW_NOTECARD_NAME = "New Note"; // *TODO:Translate? (probably const std::string NEW_GESTURE_NAME = "New Gesture"; // *TODO:Translate? (probably not) // ! REFACTOR ! Really need to refactor this so that it's not a bunch of if-then statements... -void menu_create_inventory_item(LLFolderView* folder, LLFolderBridge *bridge, const LLSD& userdata, const LLUUID& default_parent_uuid) +void menu_create_inventory_item(LLFolderView* root, LLFolderBridge *bridge, const LLSD& userdata, const LLUUID& default_parent_uuid) { std::string type_name = userdata.asString(); @@ -1090,7 +1216,7 @@ void menu_create_inventory_item(LLFolderView* folder, LLFolderBridge *bridge, co LLUUID category = gInventory.createNewCategory(parent_id, preferred_type, LLStringUtil::null); gInventory.notifyObservers(); - folder->setSelectionByID(category, TRUE); + root->setSelectionByID(category, TRUE); } else if ("lsl" == type_name) { @@ -1122,20 +1248,18 @@ void menu_create_inventory_item(LLFolderView* folder, LLFolderBridge *bridge, co else { // Use for all clothing and body parts. Adding new wearable types requires updating LLWearableDictionary. - EWearableType wearable_type = LLWearableDictionary::typeNameToType(type_name); - if (wearable_type >= WT_SHAPE && wearable_type < WT_COUNT) + LLWearableType::EType wearable_type = LLWearableType::typeNameToType(type_name); + if (wearable_type >= LLWearableType::WT_SHAPE && wearable_type < LLWearableType::WT_COUNT) { - LLAssetType::EType asset_type = LLWearableDictionary::getAssetType(wearable_type); - LLFolderType::EType folder_type = LLFolderType::assetTypeToFolderType(asset_type); - const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(folder_type); - LLFolderBridge::createWearable(parent_id, wearable_type); + const LLUUID parent_id = bridge ? bridge->getUUID() : LLUUID::null; + LLAgentWearables::createWearable(wearable_type, false, parent_id); } else { llwarns << "Can't create unrecognized type " << type_name << llendl; } } - folder->setNeedsAutoRename(TRUE); + root->setNeedsAutoRename(TRUE); } LLAssetType::EType LLViewerInventoryItem::getType() const @@ -1161,6 +1285,40 @@ const LLUUID& LLViewerInventoryItem::getAssetUUID() const return LLInventoryItem::getAssetUUID(); } +const LLUUID& LLViewerInventoryItem::getProtectedAssetUUID() const +{ + if (const LLViewerInventoryItem *linked_item = getLinkedItem()) + { + return linked_item->getProtectedAssetUUID(); + } + + // check for conditions under which we may return a visible UUID to the user + bool item_is_fullperm = getIsFullPerm(); + bool agent_is_godlike = gAgent.isGodlikeWithoutAdminMenuFakery(); + if (item_is_fullperm || agent_is_godlike) + { + return LLInventoryItem::getAssetUUID(); + } + + return LLUUID::null; +} + +const bool LLViewerInventoryItem::getIsFullPerm() const +{ + LLPermissions item_permissions = getPermissions(); + + // modify-ok & copy-ok & transfer-ok + return ( item_permissions.allowOperationBy(PERM_MODIFY, + gAgent.getID(), + gAgent.getGroupID()) && + item_permissions.allowOperationBy(PERM_COPY, + gAgent.getID(), + gAgent.getGroupID()) && + item_permissions.allowOperationBy(PERM_TRANSFER, + gAgent.getID(), + gAgent.getGroupID()) ); +} + const std::string& LLViewerInventoryItem::getName() const { if (const LLViewerInventoryItem *linked_item = getLinkedItem()) @@ -1429,14 +1587,13 @@ bool LLViewerInventoryItem::isWearableType() const return (getInventoryType() == LLInventoryType::IT_WEARABLE); } -EWearableType LLViewerInventoryItem::getWearableType() const +LLWearableType::EType LLViewerInventoryItem::getWearableType() const { if (!isWearableType()) { - llwarns << "item is not a wearable" << llendl; - return WT_INVALID; + return LLWearableType::WT_INVALID; } - return EWearableType(getFlags() & LLInventoryItem::II_FLAGS_WEARABLES_MASK); + return LLWearableType::EType(getFlags() & LLInventoryItemFlags::II_FLAGS_WEARABLES_MASK); } @@ -1542,6 +1699,20 @@ bool LLViewerInventoryItem::checkPermissionsSet(PermissionMask mask) const return ((curr_mask & mask) == mask); } +PermissionMask LLViewerInventoryItem::getPermissionMask() const +{ + const LLPermissions& permissions = getPermissions(); + + BOOL copy = permissions.allowCopyBy(gAgent.getID()); + BOOL mod = permissions.allowModifyBy(gAgent.getID()); + BOOL xfer = permissions.allowOperationBy(PERM_TRANSFER, gAgent.getID()); + PermissionMask perm_mask = 0; + if (copy) perm_mask |= PERM_COPY; + if (mod) perm_mask |= PERM_MODIFY; + if (xfer) perm_mask |= PERM_TRANSFER; + return perm_mask; +} + //---------- void LLViewerInventoryItem::onCallingCardNameLookup(const LLUUID& id, const std::string& first_name, const std::string& last_name) diff --git a/indra/newview/llviewerinventory.h b/indra/newview/llviewerinventory.h index c24f76c87a..d0d3ad693e 100644 --- a/indra/newview/llviewerinventory.h +++ b/indra/newview/llviewerinventory.h @@ -63,16 +63,18 @@ protected: public: virtual LLAssetType::EType getType() const; virtual const LLUUID& getAssetUUID() const; + virtual const LLUUID& getProtectedAssetUUID() const; // returns LLUUID::null if current agent does not have permission to expose this asset's UUID to the user virtual const std::string& getName() const; virtual S32 getSortField() const; virtual void setSortField(S32 sortField); virtual const LLPermissions& getPermissions() const; + virtual const bool getIsFullPerm() const; // 'fullperm' in the popular sense: modify-ok & copy-ok & transfer-ok, no special god rules applied virtual const LLUUID& getCreatorUUID() const; virtual const std::string& getDescription() const; virtual const LLSaleInfo& getSaleInfo() const; virtual LLInventoryType::EType getInventoryType() const; virtual bool isWearableType() const; - virtual EWearableType getWearableType() const; + virtual LLWearableType::EType getWearableType() const; virtual U32 getFlags() const; virtual time_t getCreationDate() const; virtual U32 getCRC32() const; // really more of a checksum. @@ -136,7 +138,7 @@ public: bool importFileLocal(LLFILE* fp); // new methods - BOOL isComplete() const { return mIsComplete; } + BOOL isFinished() const { return mIsComplete; } void setComplete(BOOL complete) { mIsComplete = complete; } //void updateAssetOnServer() const; @@ -157,6 +159,7 @@ public: // Checks the items permissions (for owner, group, or everyone) and returns true if all mask bits are set. bool checkPermissionsSet(PermissionMask mask) const; + PermissionMask getPermissionMask() const; // callback void onCallingCardNameLookup(const LLUUID& id, const std::string& first_name, const std::string& last_name); @@ -210,7 +213,7 @@ public: void setVersion(S32 version) { mVersion = version; } // Returns true if a fetch was issued. - bool fetchDescendents(); + bool fetch(); // used to help make cacheing more robust - for example, if // someone is getting 4 packets but logs out after 3. the viewer @@ -240,7 +243,13 @@ public: class WearOnAvatarCallback : public LLInventoryCallback { +public: + WearOnAvatarCallback(bool do_replace = false) : mReplace(do_replace) {} + void fire(const LLUUID& inv_item); + +protected: + bool mReplace; }; class ModifiedCOFCallback : public LLInventoryCallback @@ -308,14 +317,14 @@ public: extern LLInventoryCallbackManager gInventoryCallbacks; -#define NOT_WEARABLE (EWearableType)0 +#define NOT_WEARABLE (LLWearableType::EType)0 // *TODO: Find a home for these void create_inventory_item(const LLUUID& agent_id, const LLUUID& session_id, const LLUUID& parent, const LLTransactionID& transaction_id, const std::string& name, const std::string& desc, LLAssetType::EType asset_type, - LLInventoryType::EType inv_type, EWearableType wtype, + LLInventoryType::EType inv_type, LLWearableType::EType wtype, U32 next_owner_perm, LLPointer<LLInventoryCallback> cb); @@ -337,6 +346,7 @@ void link_inventory_item( const LLUUID& item_id, const LLUUID& parent_id, const std::string& new_name, + const std::string& new_description, const LLAssetType::EType asset_type, LLPointer<LLInventoryCallback> cb); @@ -354,7 +364,7 @@ void copy_inventory_from_notecard(const LLUUID& object_id, U32 callback_id = 0); -void menu_create_inventory_item(LLFolderView* folder, +void menu_create_inventory_item(LLFolderView* root, LLFolderBridge* bridge, const LLSD& userdata, const LLUUID& default_parent_uuid = LLUUID::null); diff --git a/indra/newview/llviewerjointmesh.cpp b/indra/newview/llviewerjointmesh.cpp index 1a67fc0966..7225aa1523 100644 --- a/indra/newview/llviewerjointmesh.cpp +++ b/indra/newview/llviewerjointmesh.cpp @@ -626,7 +626,7 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass, BOOL is_dummy) mFace->mVertexBuffer->drawRange(LLRender::TRIANGLES, start, end, count, offset); glPopMatrix(); } - gPipeline.addTrianglesDrawn(count/3); + gPipeline.addTrianglesDrawn(count); triangle_count += count; diff --git a/indra/newview/llviewerjoystick.cpp b/indra/newview/llviewerjoystick.cpp index b593fbfb00..240a539f2e 100644 --- a/indra/newview/llviewerjoystick.cpp +++ b/indra/newview/llviewerjoystick.cpp @@ -43,6 +43,7 @@ #include "llselectmgr.h" #include "llviewermenu.h" #include "llagent.h" +#include "llagentcamera.h" #include "llfocusmgr.h" @@ -106,7 +107,7 @@ void LLViewerJoystick::setOverrideCamera(bool val) if (mOverrideCamera) { - gAgent.changeCameraToDefault(); + gAgentCamera.changeCameraToDefault(); } } @@ -162,7 +163,7 @@ LLViewerJoystick::LLViewerJoystick() memset(mBtn, 0, sizeof(mBtn)); // factor in bandwidth? bandwidth = gViewerStats->mKBitStat - mPerfScale = 4000.f / gSysCPU.getMhz(); + mPerfScale = 4000.f / gSysCPU.getMHz(); // hmm. why? } // ----------------------------------------------------------------------------- @@ -432,7 +433,7 @@ void LLViewerJoystick::agentPitch(F32 pitch_inc) void LLViewerJoystick::agentYaw(F32 yaw_inc) { // Cannot steer some vehicles in mouselook if the script grabs the controls - if (gAgent.cameraMouselook() && !gSavedSettings.getBOOL("JoystickMouselookYaw")) + if (gAgentCamera.cameraMouselook() && !gSavedSettings.getBOOL("JoystickMouselookYaw")) { gAgent.rotate(-yaw_inc, gAgent.getReferenceUpVector()); } @@ -1005,7 +1006,7 @@ bool LLViewerJoystick::toggleFlycam() if (!mOverrideCamera) { - gAgent.changeCameraToDefault(); + gAgentCamera.changeCameraToDefault(); } if (gAwayTimer.getElapsedTimeF32() > MIN_AFK_TIME) diff --git a/indra/newview/llviewerkeyboard.cpp b/indra/newview/llviewerkeyboard.cpp index f757155b94..dd7390a907 100644 --- a/indra/newview/llviewerkeyboard.cpp +++ b/indra/newview/llviewerkeyboard.cpp @@ -36,6 +36,7 @@ #include "llviewerkeyboard.h" #include "llmath.h" #include "llagent.h" +#include "llagentcamera.h" #include "llnearbychatbar.h" #include "llviewercontrol.h" #include "llfocusmgr.h" @@ -279,22 +280,22 @@ F32 get_orbit_rate() void camera_spin_around_ccw( EKeystate s ) { if( KEYSTATE_UP == s ) return; - gAgent.unlockView(); - gAgent.setOrbitLeftKey( get_orbit_rate() ); + gAgentCamera.unlockView(); + gAgentCamera.setOrbitLeftKey( get_orbit_rate() ); } void camera_spin_around_cw( EKeystate s ) { if( KEYSTATE_UP == s ) return; - gAgent.unlockView(); - gAgent.setOrbitRightKey( get_orbit_rate() ); + gAgentCamera.unlockView(); + gAgentCamera.setOrbitRightKey( get_orbit_rate() ); } void camera_spin_around_ccw_sitting( EKeystate s ) { if( KEYSTATE_UP == s ) return; - if (gAgent.rotateGrabbed() || gAgent.sitCameraEnabled()) + if (gAgent.rotateGrabbed() || gAgentCamera.sitCameraEnabled()) { //send keystrokes, but do not change camera agent_turn_right(s); @@ -302,7 +303,7 @@ void camera_spin_around_ccw_sitting( EKeystate s ) else { //change camera but do not send keystrokes - gAgent.setOrbitLeftKey( get_orbit_rate() ); + gAgentCamera.setOrbitLeftKey( get_orbit_rate() ); } } @@ -310,7 +311,7 @@ void camera_spin_around_ccw_sitting( EKeystate s ) void camera_spin_around_cw_sitting( EKeystate s ) { if( KEYSTATE_UP == s ) return; - if (gAgent.rotateGrabbed() || gAgent.sitCameraEnabled()) + if (gAgent.rotateGrabbed() || gAgentCamera.sitCameraEnabled()) { //send keystrokes, but do not change camera agent_turn_left(s); @@ -318,7 +319,7 @@ void camera_spin_around_cw_sitting( EKeystate s ) else { //change camera but do not send keystrokes - gAgent.setOrbitRightKey( get_orbit_rate() ); + gAgentCamera.setOrbitRightKey( get_orbit_rate() ); } } @@ -326,22 +327,22 @@ void camera_spin_around_cw_sitting( EKeystate s ) void camera_spin_over( EKeystate s ) { if( KEYSTATE_UP == s ) return; - gAgent.unlockView(); - gAgent.setOrbitUpKey( get_orbit_rate() ); + gAgentCamera.unlockView(); + gAgentCamera.setOrbitUpKey( get_orbit_rate() ); } void camera_spin_under( EKeystate s ) { if( KEYSTATE_UP == s ) return; - gAgent.unlockView(); - gAgent.setOrbitDownKey( get_orbit_rate() ); + gAgentCamera.unlockView(); + gAgentCamera.setOrbitDownKey( get_orbit_rate() ); } void camera_spin_over_sitting( EKeystate s ) { if( KEYSTATE_UP == s ) return; - if (gAgent.upGrabbed() || gAgent.sitCameraEnabled()) + if (gAgent.upGrabbed() || gAgentCamera.sitCameraEnabled()) { //send keystrokes, but do not change camera agent_jump(s); @@ -349,7 +350,7 @@ void camera_spin_over_sitting( EKeystate s ) else { //change camera but do not send keystrokes - gAgent.setOrbitUpKey( get_orbit_rate() ); + gAgentCamera.setOrbitUpKey( get_orbit_rate() ); } } @@ -357,7 +358,7 @@ void camera_spin_over_sitting( EKeystate s ) void camera_spin_under_sitting( EKeystate s ) { if( KEYSTATE_UP == s ) return; - if (gAgent.downGrabbed() || gAgent.sitCameraEnabled()) + if (gAgent.downGrabbed() || gAgentCamera.sitCameraEnabled()) { //send keystrokes, but do not change camera agent_push_down(s); @@ -365,35 +366,35 @@ void camera_spin_under_sitting( EKeystate s ) else { //change camera but do not send keystrokes - gAgent.setOrbitDownKey( get_orbit_rate() ); + gAgentCamera.setOrbitDownKey( get_orbit_rate() ); } } void camera_move_forward( EKeystate s ) { if( KEYSTATE_UP == s ) return; - gAgent.unlockView(); - gAgent.setOrbitInKey( get_orbit_rate() ); + gAgentCamera.unlockView(); + gAgentCamera.setOrbitInKey( get_orbit_rate() ); } void camera_move_backward( EKeystate s ) { if( KEYSTATE_UP == s ) return; - gAgent.unlockView(); - gAgent.setOrbitOutKey( get_orbit_rate() ); + gAgentCamera.unlockView(); + gAgentCamera.setOrbitOutKey( get_orbit_rate() ); } void camera_move_forward_sitting( EKeystate s ) { if( KEYSTATE_UP == s ) return; - if (gAgent.forwardGrabbed() || gAgent.sitCameraEnabled()) + if (gAgent.forwardGrabbed() || gAgentCamera.sitCameraEnabled()) { agent_push_forward(s); } else { - gAgent.setOrbitInKey( get_orbit_rate() ); + gAgentCamera.setOrbitInKey( get_orbit_rate() ); } } @@ -402,70 +403,70 @@ void camera_move_backward_sitting( EKeystate s ) { if( KEYSTATE_UP == s ) return; - if (gAgent.backwardGrabbed() || gAgent.sitCameraEnabled()) + if (gAgent.backwardGrabbed() || gAgentCamera.sitCameraEnabled()) { agent_push_backward(s); } else { - gAgent.setOrbitOutKey( get_orbit_rate() ); + gAgentCamera.setOrbitOutKey( get_orbit_rate() ); } } void camera_pan_up( EKeystate s ) { if( KEYSTATE_UP == s ) return; - gAgent.unlockView(); - gAgent.setPanUpKey( get_orbit_rate() ); + gAgentCamera.unlockView(); + gAgentCamera.setPanUpKey( get_orbit_rate() ); } void camera_pan_down( EKeystate s ) { if( KEYSTATE_UP == s ) return; - gAgent.unlockView(); - gAgent.setPanDownKey( get_orbit_rate() ); + gAgentCamera.unlockView(); + gAgentCamera.setPanDownKey( get_orbit_rate() ); } void camera_pan_left( EKeystate s ) { if( KEYSTATE_UP == s ) return; - gAgent.unlockView(); - gAgent.setPanLeftKey( get_orbit_rate() ); + gAgentCamera.unlockView(); + gAgentCamera.setPanLeftKey( get_orbit_rate() ); } void camera_pan_right( EKeystate s ) { if( KEYSTATE_UP == s ) return; - gAgent.unlockView(); - gAgent.setPanRightKey( get_orbit_rate() ); + gAgentCamera.unlockView(); + gAgentCamera.setPanRightKey( get_orbit_rate() ); } void camera_pan_in( EKeystate s ) { if( KEYSTATE_UP == s ) return; - gAgent.unlockView(); - gAgent.setPanInKey( get_orbit_rate() ); + gAgentCamera.unlockView(); + gAgentCamera.setPanInKey( get_orbit_rate() ); } void camera_pan_out( EKeystate s ) { if( KEYSTATE_UP == s ) return; - gAgent.unlockView(); - gAgent.setPanOutKey( get_orbit_rate() ); + gAgentCamera.unlockView(); + gAgentCamera.setPanOutKey( get_orbit_rate() ); } void camera_move_forward_fast( EKeystate s ) { if( KEYSTATE_UP == s ) return; - gAgent.unlockView(); - gAgent.setOrbitInKey(2.5f); + gAgentCamera.unlockView(); + gAgentCamera.setOrbitInKey(2.5f); } void camera_move_backward_fast( EKeystate s ) { if( KEYSTATE_UP == s ) return; - gAgent.unlockView(); - gAgent.setOrbitOutKey(2.5f); + gAgentCamera.unlockView(); + gAgentCamera.setOrbitOutKey(2.5f); } @@ -473,7 +474,7 @@ void edit_avatar_spin_ccw( EKeystate s ) { if( KEYSTATE_UP == s ) return; gMorphView->setCameraDrivenByKeys( TRUE ); - gAgent.setOrbitLeftKey( get_orbit_rate() ); + gAgentCamera.setOrbitLeftKey( get_orbit_rate() ); //gMorphView->orbitLeft( get_orbit_rate() ); } @@ -482,7 +483,7 @@ void edit_avatar_spin_cw( EKeystate s ) { if( KEYSTATE_UP == s ) return; gMorphView->setCameraDrivenByKeys( TRUE ); - gAgent.setOrbitRightKey( get_orbit_rate() ); + gAgentCamera.setOrbitRightKey( get_orbit_rate() ); //gMorphView->orbitRight( get_orbit_rate() ); } @@ -490,7 +491,7 @@ void edit_avatar_spin_over( EKeystate s ) { if( KEYSTATE_UP == s ) return; gMorphView->setCameraDrivenByKeys( TRUE ); - gAgent.setOrbitUpKey( get_orbit_rate() ); + gAgentCamera.setOrbitUpKey( get_orbit_rate() ); //gMorphView->orbitUp( get_orbit_rate() ); } @@ -499,7 +500,7 @@ void edit_avatar_spin_under( EKeystate s ) { if( KEYSTATE_UP == s ) return; gMorphView->setCameraDrivenByKeys( TRUE ); - gAgent.setOrbitDownKey( get_orbit_rate() ); + gAgentCamera.setOrbitDownKey( get_orbit_rate() ); //gMorphView->orbitDown( get_orbit_rate() ); } @@ -507,7 +508,7 @@ void edit_avatar_move_forward( EKeystate s ) { if( KEYSTATE_UP == s ) return; gMorphView->setCameraDrivenByKeys( TRUE ); - gAgent.setOrbitInKey( get_orbit_rate() ); + gAgentCamera.setOrbitInKey( get_orbit_rate() ); //gMorphView->orbitIn(); } @@ -516,7 +517,7 @@ void edit_avatar_move_backward( EKeystate s ) { if( KEYSTATE_UP == s ) return; gMorphView->setCameraDrivenByKeys( TRUE ); - gAgent.setOrbitOutKey( get_orbit_rate() ); + gAgentCamera.setOrbitOutKey( get_orbit_rate() ); //gMorphView->orbitOut(); } @@ -868,7 +869,7 @@ S32 LLViewerKeyboard::loadBindings(const std::string& filename) EKeyboardMode LLViewerKeyboard::getMode() { - if ( gAgent.cameraMouselook() ) + if ( gAgentCamera.cameraMouselook() ) { return MODE_FIRST_PERSON; } @@ -876,7 +877,7 @@ EKeyboardMode LLViewerKeyboard::getMode() { return MODE_EDIT_AVATAR; } - else if (gAgent.getAvatarObject() && gAgent.getAvatarObject()->isSitting()) + else if (isAgentAvatarValid() && gAgentAvatarp->isSitting()) { return MODE_SITTING; } diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index 9ced0194a2..d7190f26a3 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -33,6 +33,7 @@ #include "llviewerprecompiledheaders.h" #include "llagent.h" +#include "llagentcamera.h" #include "llviewermedia.h" #include "llviewermediafocus.h" #include "llmimetypes.h" @@ -45,11 +46,16 @@ #include "llviewertexturelist.h" #include "llvovolume.h" #include "llpluginclassmedia.h" +#include "llplugincookiestore.h" #include "llviewerwindow.h" #include "llfocusmgr.h" #include "llcallbacklist.h" #include "llparcel.h" #include "llaudioengine.h" // for gAudiop +#include "llurldispatcher.h" +#include "llvoavatar.h" +#include "llvoavatarself.h" +#include "llviewerregion.h" #include "llevent.h" // LLSimpleListener #include "llnotificationsutil.h" @@ -57,11 +63,16 @@ #include "llkeyboard.h" #include "llmutelist.h" //#include "llfirstuse.h" +#include "llwindow.h" #include <boost/bind.hpp> // for SkinFolder listener #include <boost/signals2.hpp> /*static*/ const char* LLViewerMedia::AUTO_PLAY_MEDIA_SETTING = "ParcelMediaAutoPlayEnable"; +/*static*/ const char* LLViewerMedia::SHOW_MEDIA_ON_OTHERS_SETTING = "MediaShowOnOthers"; +/*static*/ const char* LLViewerMedia::SHOW_MEDIA_WITHIN_PARCEL_SETTING = "MediaShowWithinParcel"; +/*static*/ const char* LLViewerMedia::SHOW_MEDIA_OUTSIDE_PARCEL_SETTING = "MediaShowOutsideParcel"; + // Move this to its own file. @@ -247,12 +258,53 @@ public: LLViewerMediaImpl *mMediaImpl; bool mInitialized; }; + +class LLViewerMediaOpenIDResponder : public LLHTTPClient::Responder +{ +LOG_CLASS(LLViewerMediaOpenIDResponder); +public: + LLViewerMediaOpenIDResponder( ) + { + } + + ~LLViewerMediaOpenIDResponder() + { + } + + /* virtual */ void completedHeader(U32 status, const std::string& reason, const LLSD& content) + { + LL_DEBUGS("MediaAuth") << "status = " << status << ", reason = " << reason << LL_ENDL; + LL_DEBUGS("MediaAuth") << content << LL_ENDL; + std::string cookie = content["set-cookie"].asString(); + + LLViewerMedia::openIDCookieResponse(cookie); + } + + /* virtual */ void completedRaw( + U32 status, + const std::string& reason, + const LLChannelDescriptors& channels, + const LLIOPipe::buffer_ptr_t& buffer) + { + // This is just here to disable the default behavior (attempting to parse the response as llsd). + // We don't care about the content of the response, only the set-cookie header. + } + +}; + +LLPluginCookieStore *LLViewerMedia::sCookieStore = NULL; +LLURL LLViewerMedia::sOpenIDURL; +std::string LLViewerMedia::sOpenIDCookie; static LLViewerMedia::impl_list sViewerMediaImplList; static LLViewerMedia::impl_id_map sViewerMediaTextureIDMap; static LLTimer sMediaCreateTimer; static const F32 LLVIEWERMEDIA_CREATE_DELAY = 1.0f; static F32 sGlobalVolume = 1.0f; static F64 sLowestLoadableImplInterest = 0.0f; +static bool sAnyMediaShowing = false; +static boost::signals2::connection sTeleportFinishConnection; +static std::string sUpdatedCookies; +static const char *PLUGIN_COOKIE_FILE_NAME = "plugin_cookies.txt"; ////////////////////////////////////////////////////////////////////////////////////////// static void add_media_impl(LLViewerMediaImpl* media) @@ -365,8 +417,7 @@ viewer_media_t LLViewerMedia::updateMediaImpl(LLMediaEntry* media_entry, const s // The current media URL is not empty. // If (the media was already loaded OR the media was set to autoplay) AND this update didn't come from this agent, // do a navigate. - bool auto_play = (media_impl->mMediaAutoPlay && gSavedSettings.getBOOL(AUTO_PLAY_MEDIA_SETTING)); - + bool auto_play = media_impl->isAutoPlayable(); if((was_loaded || auto_play) && !update_from_self) { needs_navigate = url_changed; @@ -389,8 +440,7 @@ viewer_media_t LLViewerMedia::updateMediaImpl(LLMediaEntry* media_entry, const s media_impl->setHomeURL(media_entry->getHomeURL()); media_impl->mMediaAutoPlay = media_entry->getAutoPlay(); media_impl->mMediaEntryURL = media_entry->getCurrentURL(); - - if(media_impl->mMediaAutoPlay && gSavedSettings.getBOOL(AUTO_PLAY_MEDIA_SETTING)) + if(media_impl->isAutoPlayable()) { needs_navigate = true; } @@ -683,16 +733,31 @@ static bool proximity_comparitor(const LLViewerMediaImpl* i1, const LLViewerMedi } } +static LLFastTimer::DeclareTimer FTM_MEDIA_UPDATE("Update Media"); + ////////////////////////////////////////////////////////////////////////////////////////// // static void LLViewerMedia::updateMedia(void *dummy_arg) { + LLFastTimer t1(FTM_MEDIA_UPDATE); + + // Enable/disable the plugin read thread + LLPluginProcessParent::setUseReadThread(gSavedSettings.getBOOL("PluginUseReadThread")); + + sAnyMediaShowing = false; + sUpdatedCookies = getCookieStore()->getChangedCookies(); + if(!sUpdatedCookies.empty()) + { + lldebugs << "updated cookies will be sent to all loaded plugins: " << llendl; + lldebugs << sUpdatedCookies << llendl; + } + impl_list::iterator iter = sViewerMediaImplList.begin(); impl_list::iterator end = sViewerMediaImplList.end(); - for(; iter != end; iter++) + for(; iter != end;) { - LLViewerMediaImpl* pimpl = *iter; + LLViewerMediaImpl* pimpl = *iter++; pimpl->update(); pimpl->calculateInterest(); } @@ -712,7 +777,7 @@ void LLViewerMedia::updateMedia(void *dummy_arg) std::vector<LLViewerMediaImpl*> proximity_order; bool inworld_media_enabled = gSavedSettings.getBOOL("AudioStreamingMedia"); - bool needs_first_run = LLViewerMedia::needsMediaFirstRun(); + bool inworld_audio_enabled = gSavedSettings.getBOOL("AudioStreamingMusic"); U32 max_instances = gSavedSettings.getU32("PluginInstancesTotal"); U32 max_normal = gSavedSettings.getU32("PluginInstancesNormal"); U32 max_low = gSavedSettings.getU32("PluginInstancesLow"); @@ -818,7 +883,7 @@ void LLViewerMedia::updateMedia(void *dummy_arg) impl_count_total++; } - + // Overrides if the window is minimized or we lost focus (taking care // not to accidentally "raise" the priority either) if (!gViewerWindow->getActive() /* viewer window minimized? */ @@ -838,15 +903,16 @@ void LLViewerMedia::updateMedia(void *dummy_arg) if(!pimpl->getUsedInUI()) { new_priority = LLPluginClassMedia::PRIORITY_UNLOADED; - if(needs_first_run) - { - // Don't do this more than once in this loop. - needs_first_run = false; - LLViewerMedia::displayMediaFirstRun(); - } } } - + // update the audio stream here as well + if( !inworld_audio_enabled) + { + if(LLViewerMedia::isParcelAudioPlaying() && gAudiop && LLViewerMedia::hasParcelAudio()) + { + gAudiop->stopInternetStream(); + } + } pimpl->setPriority(new_priority); if(pimpl->getUsedInUI()) @@ -860,6 +926,12 @@ void LLViewerMedia::updateMedia(void *dummy_arg) } total_cpu += pimpl->getCPUUsage(); + + if (!pimpl->getUsedInUI() && pimpl->hasMedia()) + { + sAnyMediaShowing = true; + } + } // Re-calculate this every time. @@ -901,70 +973,463 @@ void LLViewerMedia::updateMedia(void *dummy_arg) ////////////////////////////////////////////////////////////////////////////////////////// // static -void LLViewerMedia::initClass() +bool LLViewerMedia::isAnyMediaShowing() { - gIdleCallbacks.addFunction(LLViewerMedia::updateMedia, NULL); + return sAnyMediaShowing; } ////////////////////////////////////////////////////////////////////////////////////////// // static -void LLViewerMedia::cleanupClass() +void LLViewerMedia::setAllMediaEnabled(bool val) { - gIdleCallbacks.deleteFunction(LLViewerMedia::updateMedia, NULL); + // Set "tentative" autoplay first. We need to do this here or else + // re-enabling won't start up the media below. + gSavedSettings.setBOOL("MediaTentativeAutoPlay", val); + + // Then + impl_list::iterator iter = sViewerMediaImplList.begin(); + impl_list::iterator end = sViewerMediaImplList.end(); + + for(; iter != end; iter++) + { + LLViewerMediaImpl* pimpl = *iter; + if (!pimpl->getUsedInUI()) + { + pimpl->setDisabled(!val); + } + } + + // Also do Parcel Media and Parcel Audio + if (val) + { + if (!LLViewerMedia::isParcelMediaPlaying() && LLViewerMedia::hasParcelMedia()) + { + LLViewerParcelMedia::play(LLViewerParcelMgr::getInstance()->getAgentParcel()); + } + + if (gSavedSettings.getBOOL("AudioStreamingMusic") && + !LLViewerMedia::isParcelAudioPlaying() && + gAudiop && + LLViewerMedia::hasParcelAudio()) + { + gAudiop->startInternetStream(LLViewerMedia::getParcelAudioURL()); + } + } + else { + // This actually unloads the impl, as opposed to "stop"ping the media + LLViewerParcelMedia::stop(); + if (gAudiop) gAudiop->stopInternetStream(); + } } - ////////////////////////////////////////////////////////////////////////////////////////// // static -bool LLViewerMedia::needsMediaFirstRun() +bool LLViewerMedia::isParcelMediaPlaying() { - return gWarningSettings.getBOOL("FirstStreamingMedia"); + return (LLViewerMedia::hasParcelMedia() && LLViewerParcelMedia::getParcelMedia() && LLViewerParcelMedia::getParcelMedia()->hasMedia()); } -////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////// // static -void LLViewerMedia::displayMediaFirstRun() +bool LLViewerMedia::isParcelAudioPlaying() { - gWarningSettings.setBOOL("FirstStreamingMedia", FALSE); + return (LLViewerMedia::hasParcelAudio() && gAudiop && LLAudioEngine::AUDIO_PLAYING == gAudiop->isInternetStreamPlaying()); +} - LLNotificationsUtil::add("ParcelCanPlayMedia", LLSD(), LLSD(), - boost::bind(firstRunCallback, _1, _2)); +///////////////////////////////////////////////////////////////////////////////////////// +// static +void LLViewerMedia::clearAllCookies() +{ + // Clear all cookies for all plugins + impl_list::iterator iter = sViewerMediaImplList.begin(); + impl_list::iterator end = sViewerMediaImplList.end(); + for (; iter != end; iter++) + { + LLViewerMediaImpl* pimpl = *iter; + if(pimpl->mMediaSource) + { + pimpl->mMediaSource->clear_cookies(); + } + } + + // Clear all cookies from the cookie store + getCookieStore()->setAllCookies(""); + + // FIXME: this may not be sufficient, since the on-disk cookie file won't get written until some browser instance exits cleanly. + // It also won't clear cookies for other accounts, or for any account if we're not logged in, and won't do anything at all if there are no webkit plugins loaded. + // Until such time as we can centralize cookie storage, the following hack should cover these cases: + + // HACK: Look for cookie files in all possible places and delete them. + // NOTE: this assumes knowledge of what happens inside the webkit plugin (it's what adds 'browser_profile' to the path and names the cookie file) + + // Places that cookie files can be: + // <getOSUserAppDir>/browser_profile/cookies + // <getOSUserAppDir>/first_last/browser_profile/cookies (note that there may be any number of these!) + // <getOSUserAppDir>/first_last/plugin_cookies.txt (note that there may be any number of these!) + + std::string base_dir = gDirUtilp->getOSUserAppDir() + gDirUtilp->getDirDelimiter(); + std::string target; + std::string filename; + + lldebugs << "base dir = " << base_dir << llendl; + + // The non-logged-in version is easy + target = base_dir; + target += "browser_profile"; + target += gDirUtilp->getDirDelimiter(); + target += "cookies"; + lldebugs << "target = " << target << llendl; + if(LLFile::isfile(target)) + { + LLFile::remove(target); + } + + // the hard part: iterate over all user directories and delete the cookie file from each one + while(gDirUtilp->getNextFileInDir(base_dir, "*_*", filename, false)) + { + target = base_dir; + target += filename; + target += gDirUtilp->getDirDelimiter(); + target += "browser_profile"; + target += gDirUtilp->getDirDelimiter(); + target += "cookies"; + lldebugs << "target = " << target << llendl; + if(LLFile::isfile(target)) + { + LLFile::remove(target); + } + + // Other accounts may have new-style cookie files too -- delete them as well + target = base_dir; + target += filename; + target += gDirUtilp->getDirDelimiter(); + target += PLUGIN_COOKIE_FILE_NAME; + lldebugs << "target = " << target << llendl; + if(LLFile::isfile(target)) + { + LLFile::remove(target); + } + } + + // If we have an OpenID cookie, re-add it to the cookie store. + setOpenIDCookie(); +} + +///////////////////////////////////////////////////////////////////////////////////////// +// static +void LLViewerMedia::clearAllCaches() +{ + // Clear all plugins' caches + impl_list::iterator iter = sViewerMediaImplList.begin(); + impl_list::iterator end = sViewerMediaImplList.end(); + for (; iter != end; iter++) + { + LLViewerMediaImpl* pimpl = *iter; + pimpl->clearCache(); + } +} + +///////////////////////////////////////////////////////////////////////////////////////// +// static +void LLViewerMedia::setCookiesEnabled(bool enabled) +{ + // Set the "cookies enabled" flag for all loaded plugins + impl_list::iterator iter = sViewerMediaImplList.begin(); + impl_list::iterator end = sViewerMediaImplList.end(); + for (; iter != end; iter++) + { + LLViewerMediaImpl* pimpl = *iter; + if(pimpl->mMediaSource) + { + pimpl->mMediaSource->enable_cookies(enabled); + } + } +} + +///////////////////////////////////////////////////////////////////////////////////////// +// static +void LLViewerMedia::setProxyConfig(bool enable, const std::string &host, int port) +{ + // Set the proxy config for all loaded plugins + impl_list::iterator iter = sViewerMediaImplList.begin(); + impl_list::iterator end = sViewerMediaImplList.end(); + for (; iter != end; iter++) + { + LLViewerMediaImpl* pimpl = *iter; + if(pimpl->mMediaSource) + { + pimpl->mMediaSource->proxy_setup(enable, host, port); + } + } } -////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////// +// static +///////////////////////////////////////////////////////////////////////////////////////// // static -bool LLViewerMedia::firstRunCallback(const LLSD& notification, const LLSD& response) +LLPluginCookieStore *LLViewerMedia::getCookieStore() { - S32 option = LLNotificationsUtil::getSelectedOption(notification, response); - if (option == 0) + if(sCookieStore == NULL) { - // user has elected to automatically play media. - gSavedSettings.setBOOL(LLViewerMedia::AUTO_PLAY_MEDIA_SETTING, TRUE); - gSavedSettings.setBOOL("AudioStreamingMusic", TRUE); - gSavedSettings.setBOOL("AudioStreamingMedia", TRUE); + sCookieStore = new LLPluginCookieStore; + } + + return sCookieStore; +} - LLParcel *parcel = LLViewerParcelMgr::getInstance()->getAgentParcel(); - - if (parcel) +///////////////////////////////////////////////////////////////////////////////////////// +// static +void LLViewerMedia::loadCookieFile() +{ + // build filename for each user + std::string resolved_filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, PLUGIN_COOKIE_FILE_NAME); + + if (resolved_filename.empty()) + { + llinfos << "can't get path to plugin cookie file - probably not logged in yet." << llendl; + return; + } + + // open the file for reading + llifstream file(resolved_filename); + if (!file.is_open()) + { + llwarns << "can't load plugin cookies from file \"" << PLUGIN_COOKIE_FILE_NAME << "\"" << llendl; + return; + } + + getCookieStore()->readAllCookies(file, true); + + file.close(); + + // send the clear_cookies message to all loaded plugins + impl_list::iterator iter = sViewerMediaImplList.begin(); + impl_list::iterator end = sViewerMediaImplList.end(); + for (; iter != end; iter++) + { + LLViewerMediaImpl* pimpl = *iter; + if(pimpl->mMediaSource) { - // play media right now, if available - LLViewerParcelMedia::play(parcel); - - // play music right now, if available - std::string music_url = parcel->getMusicURL(); - if (gAudiop && !music_url.empty()) - gAudiop->startInternetStream(music_url); + pimpl->mMediaSource->clear_cookies(); } } - else + + // If we have an OpenID cookie, re-add it to the cookie store. + setOpenIDCookie(); +} + + +///////////////////////////////////////////////////////////////////////////////////////// +// static +void LLViewerMedia::saveCookieFile() +{ + // build filename for each user + std::string resolved_filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, PLUGIN_COOKIE_FILE_NAME); + + if (resolved_filename.empty()) + { + llinfos << "can't get path to plugin cookie file - probably not logged in yet." << llendl; + return; + } + + // open a file for writing + llofstream file (resolved_filename); + if (!file.is_open()) + { + llwarns << "can't open plugin cookie file \"" << PLUGIN_COOKIE_FILE_NAME << "\" for writing" << llendl; + return; + } + + getCookieStore()->writePersistentCookies(file); + + file.close(); +} + +///////////////////////////////////////////////////////////////////////////////////////// +// static +void LLViewerMedia::addCookie(const std::string &name, const std::string &value, const std::string &domain, const LLDate &expires, const std::string &path, bool secure) +{ + std::stringstream cookie; + + cookie << name << "=" << LLPluginCookieStore::quoteString(value); + + if(expires.notNull()) + { + cookie << "; expires=" << expires.asRFC1123(); + } + + cookie << "; domain=" << domain; + + cookie << "; path=" << path; + + if(secure) + { + cookie << "; secure"; + } + + getCookieStore()->setCookies(cookie.str()); +} + +///////////////////////////////////////////////////////////////////////////////////////// +// static +void LLViewerMedia::addSessionCookie(const std::string &name, const std::string &value, const std::string &domain, const std::string &path, bool secure) +{ + // A session cookie just has a NULL date. + addCookie(name, value, domain, LLDate(), path, secure); +} + +///////////////////////////////////////////////////////////////////////////////////////// +// static +void LLViewerMedia::removeCookie(const std::string &name, const std::string &domain, const std::string &path ) +{ + // To remove a cookie, add one with the same name, domain, and path that expires in the past. + + addCookie(name, "", domain, LLDate(LLDate::now().secondsSinceEpoch() - 1.0), path); +} + + +///////////////////////////////////////////////////////////////////////////////////////// +// static +void LLViewerMedia::setOpenIDCookie() +{ + if(!sOpenIDCookie.empty()) + { + // The LLURL can give me the 'authority', which is of the form: [username[:password]@]hostname[:port] + // We want just the hostname for the cookie code, but LLURL doesn't seem to have a way to extract that. + // We therefore do it here. + std::string authority = sOpenIDURL.mAuthority; + std::string::size_type host_start = authority.find('@'); + if(host_start == std::string::npos) + { + // no username/password + host_start = 0; + } + else + { + // Hostname starts after the @. + // (If the hostname part is empty, this may put host_start at the end of the string. In that case, it will end up passing through an empty hostname, which is correct.) + ++host_start; + } + std::string::size_type host_end = authority.rfind(':'); + if((host_end == std::string::npos) || (host_end < host_start)) + { + // no port + host_end = authority.size(); + } + + getCookieStore()->setCookiesFromHost(sOpenIDCookie, authority.substr(host_start, host_end - host_start)); + } +} + +///////////////////////////////////////////////////////////////////////////////////////// +// static +void LLViewerMedia::openIDSetup(const std::string &openid_url, const std::string &openid_token) +{ + LL_DEBUGS("MediaAuth") << "url = \"" << openid_url << "\", token = \"" << openid_token << "\"" << LL_ENDL; + + // post the token to the url + // the responder will need to extract the cookie(s). + + // Save the OpenID URL for later -- we may need the host when adding the cookie. + sOpenIDURL.init(openid_url.c_str()); + + // We shouldn't ever do this twice, but just in case this code gets repurposed later, clear existing cookies. + sOpenIDCookie.clear(); + + LLSD headers = LLSD::emptyMap(); + // Keep LLHTTPClient from adding an "Accept: application/llsd+xml" header + headers["Accept"] = "*/*"; + // and use the expected content-type for a post, instead of the LLHTTPClient::postRaw() default of "application/octet-stream" + headers["Content-Type"] = "application/x-www-form-urlencoded"; + + // postRaw() takes ownership of the buffer and releases it later, so we need to allocate a new buffer here. + size_t size = openid_token.size(); + U8 *data = new U8[size]; + memcpy(data, openid_token.data(), size); + + LLHTTPClient::postRaw( + openid_url, + data, + size, + new LLViewerMediaOpenIDResponder(), + headers); + +} + +///////////////////////////////////////////////////////////////////////////////////////// +// static +void LLViewerMedia::openIDCookieResponse(const std::string &cookie) +{ + LL_DEBUGS("MediaAuth") << "Cookie received: \"" << cookie << "\"" << LL_ENDL; + + sOpenIDCookie += cookie; + + setOpenIDCookie(); +} + +bool LLViewerMedia::hasInWorldMedia() +{ + if (sInWorldMediaDisabled) return false; + impl_list::iterator iter = sViewerMediaImplList.begin(); + impl_list::iterator end = sViewerMediaImplList.end(); + // This should be quick, because there should be very few non-in-world-media impls + for (; iter != end; iter++) { - gSavedSettings.setBOOL(LLViewerMedia::AUTO_PLAY_MEDIA_SETTING, FALSE); - gSavedSettings.setBOOL("AudioStreamingMedia", FALSE); - gSavedSettings.setBOOL("AudioStreamingMusic", FALSE); + LLViewerMediaImpl* pimpl = *iter; + if (!pimpl->getUsedInUI() && !pimpl->isParcelMedia()) + { + // Found an in-world media impl + return true; + } } return false; } +////////////////////////////////////////////////////////////////////////////////////////// +// static +bool LLViewerMedia::hasParcelMedia() +{ + return !LLViewerParcelMedia::getURL().empty(); +} + +////////////////////////////////////////////////////////////////////////////////////////// +// static +bool LLViewerMedia::hasParcelAudio() +{ + return !LLViewerMedia::getParcelAudioURL().empty(); +} + +////////////////////////////////////////////////////////////////////////////////////////// +// static +std::string LLViewerMedia::getParcelAudioURL() +{ + return LLViewerParcelMgr::getInstance()->getAgentParcel()->getMusicURL(); +} + +////////////////////////////////////////////////////////////////////////////////////////// +// static +void LLViewerMedia::initClass() +{ + gIdleCallbacks.addFunction(LLViewerMedia::updateMedia, NULL); + sTeleportFinishConnection = LLViewerParcelMgr::getInstance()-> + setTeleportFinishedCallback(boost::bind(&LLViewerMedia::onTeleportFinished)); +} + +////////////////////////////////////////////////////////////////////////////////////////// +// static +void LLViewerMedia::cleanupClass() +{ + gIdleCallbacks.deleteFunction(LLViewerMedia::updateMedia, NULL); + sTeleportFinishConnection.disconnect(); +} + +////////////////////////////////////////////////////////////////////////////////////////// +// static +void LLViewerMedia::onTeleportFinished() +{ + // On teleport, clear this setting (i.e. set it to true) + gSavedSettings.setBOOL("MediaTentativeAutoPlay", true); +} ////////////////////////////////////////////////////////////////////////////////////////// // LLViewerMediaImpl @@ -1011,7 +1476,8 @@ LLViewerMediaImpl::LLViewerMediaImpl( const LLUUID& texture_id, mBackgroundColor(LLColor4::white), mNavigateSuspended(false), mNavigateSuspendedDeferred(false), - mIsUpdated(false) + mIsUpdated(false), + mTrustedBrowser(false) { // Set up the mute list observer if it hasn't been set up already. @@ -1038,11 +1504,6 @@ LLViewerMediaImpl::LLViewerMediaImpl( const LLUUID& texture_id, ////////////////////////////////////////////////////////////////////////////////////////// LLViewerMediaImpl::~LLViewerMediaImpl() { - if( gEditMenuHandler == this ) - { - gEditMenuHandler = NULL; - } - destroyMediaSource(); LLViewerMediaTexture::removeMediaImplFromTexture(mTextureId) ; @@ -1102,7 +1563,10 @@ void LLViewerMediaImpl::createMediaSource() } else if(! mMimeType.empty()) { - initializeMedia(mMimeType); + if (!initializeMedia(mMimeType)) + { + LL_WARNS("Media") << "Failed to initialize media for mime type " << mMimeType << LL_ENDL; + } } } @@ -1122,6 +1586,7 @@ void LLViewerMediaImpl::destroyMediaSource() if(mMediaSource) { + mMediaSource->setDeleteOK(true) ; delete mMediaSource; mMediaSource = NULL; } @@ -1150,6 +1615,19 @@ LLPluginClassMedia* LLViewerMediaImpl::newSourceFromMediaType(std::string media_ std::string user_data_path = gDirUtilp->getOSUserAppDir(); user_data_path += gDirUtilp->getDirDelimiter(); + // Fix for EXT-5960 - make browser profile specific to user (cache, cookies etc.) + // If the linden username returned is blank, that can only mean we are + // at the login page displaying login Web page or Web browser test via Develop menu. + // In this case we just use whatever gDirUtilp->getOSUserAppDir() gives us (this + // is what we always used before this change) + std::string linden_user_dir = gDirUtilp->getLindenUserDir(); + if ( ! linden_user_dir.empty() ) + { + // gDirUtilp->getLindenUserDir() is whole path, not just Linden name + user_data_path = linden_user_dir; + user_data_path += gDirUtilp->getDirDelimiter(); + }; + // See if the plugin executable exists llstat s; if(LLFile::stat(launcher_name, &s)) @@ -1164,7 +1642,22 @@ LLPluginClassMedia* LLViewerMediaImpl::newSourceFromMediaType(std::string media_ { LLPluginClassMedia* media_source = new LLPluginClassMedia(owner); media_source->setSize(default_width, default_height); - if (media_source->init(launcher_name, plugin_name, gSavedSettings.getBOOL("PluginAttachDebuggerToPlugins"), user_data_path)) + media_source->setUserDataPath(user_data_path); + media_source->setLanguageCode(LLUI::getLanguage()); + + // collect 'cookies enabled' setting from prefs and send to embedded browser + bool cookies_enabled = gSavedSettings.getBOOL( "CookiesEnabled" ); + media_source->enable_cookies( cookies_enabled ); + + // collect 'plugins enabled' setting from prefs and send to embedded browser + bool plugins_enabled = gSavedSettings.getBOOL( "BrowserPluginsEnabled" ); + media_source->setPluginsEnabled( plugins_enabled ); + + // collect 'javascript enabled' setting from prefs and send to embedded browser + bool javascript_enabled = gSavedSettings.getBOOL( "BrowserJavascriptEnabled" ); + media_source->setJavascriptEnabled( javascript_enabled ); + + if (media_source->init(launcher_name, plugin_name, gSavedSettings.getBOOL("PluginAttachDebuggerToPlugins"))) { return media_source; } @@ -1225,14 +1718,27 @@ bool LLViewerMediaImpl::initializePlugin(const std::string& media_type) media_source->focus(mHasFocus); media_source->setBackgroundColor(mBackgroundColor); + media_source->proxy_setup(gSavedSettings.getBOOL("BrowserProxyEnabled"), gSavedSettings.getString("BrowserProxyAddress"), gSavedSettings.getS32("BrowserProxyPort")); + if(mClearCache) { mClearCache = false; media_source->clear_cache(); } + // TODO: Only send cookies to plugins that need them + // Ideally, the plugin should tell us whether it handles cookies or not -- either via the init response or through a separate message. + // Due to the ordering of messages, it's possible we wouldn't get that information back in time to send cookies before sending a navigate message, + // which could cause odd race conditions. + std::string all_cookies = LLViewerMedia::getCookieStore()->getAllCookies(); + lldebugs << "setting cookies: " << all_cookies << llendl; + if(!all_cookies.empty()) + { + media_source->set_cookies(all_cookies); + } + mMediaSource = media_source; - + mMediaSource->setDeleteOK(false) ; updateVolume(); return true; @@ -1249,6 +1755,9 @@ void LLViewerMediaImpl::loadURI() { if(mMediaSource) { + // trim whitespace from front and back of URL - fixes EXT-5363 + LLStringUtil::trim( mMediaURL ); + // *HACK: we don't know if the URI coming in is properly escaped // (the contract doesn't specify whether it is escaped or not. // but LLQtWebKit expects it to be, so we do our best to encode @@ -1267,29 +1776,22 @@ void LLViewerMediaImpl::loadURI() llinfos << "Asking media source to load URI: " << uri << llendl; mMediaSource->loadURI( uri ); - + + // A non-zero mPreviousMediaTime means that either this media was previously unloaded by the priority code while playing/paused, + // or a seek happened before the media loaded. In either case, seek to the saved time. + if(mPreviousMediaTime != 0.0f) + { + seek(mPreviousMediaTime); + } + if(mPreviousMediaState == MEDIA_PLAYING) { // This media was playing before this instance was unloaded. - - if(mPreviousMediaTime != 0.0f) - { - // Seek back to where we left off, if possible. - seek(mPreviousMediaTime); - } - start(); } else if(mPreviousMediaState == MEDIA_PAUSED) { // This media was paused before this instance was unloaded. - - if(mPreviousMediaTime != 0.0f) - { - // Seek back to where we left off, if possible. - seek(mPreviousMediaTime); - } - pause(); } else @@ -1348,6 +1850,10 @@ void LLViewerMediaImpl::pause() { mMediaSource->pause(); } + else + { + mPreviousMediaState = MEDIA_PAUSED; + } } ////////////////////////////////////////////////////////////////////////////////////////// @@ -1357,6 +1863,10 @@ void LLViewerMediaImpl::start() { mMediaSource->start(); } + else + { + mPreviousMediaState = MEDIA_PLAYING; + } } ////////////////////////////////////////////////////////////////////////////////////////// @@ -1366,6 +1876,11 @@ void LLViewerMediaImpl::seek(F32 time) { mMediaSource->seek(time); } + else + { + // Save the seek time to be set when the media is loaded. + mPreviousMediaTime = time; + } } ////////////////////////////////////////////////////////////////////////////////////////// @@ -1414,7 +1929,28 @@ void LLViewerMediaImpl::updateVolume() { if(mMediaSource) { - mMediaSource->setVolume(mRequestedVolume * LLViewerMedia::getVolume()); + // always scale the volume by the global media volume + F32 volume = mRequestedVolume * LLViewerMedia::getVolume(); + + if (mProximityCamera > 0) + { + if (mProximityCamera > gSavedSettings.getF32("MediaRollOffMax")) + { + volume = 0; + } + else if (mProximityCamera > gSavedSettings.getF32("MediaRollOffMin")) + { + // attenuated_volume = 1 / (roll_off_rate * (d - min))^2 + // the +1 is there so that for distance 0 the volume stays the same + F64 adjusted_distance = mProximityCamera - gSavedSettings.getF32("MediaRollOffMin"); + F64 attenuation = 1.0 + (gSavedSettings.getF32("MediaRollOffRate") * adjusted_distance); + attenuation = 1.0 / (attenuation * attenuation); + // the attenuation multiplier should never be more than one since that would increase volume + volume = volume * llmin(1.0, attenuation); + } + } + + mMediaSource->setVolume(volume); } } @@ -1745,7 +2281,7 @@ void LLViewerMediaImpl::navigateInternal() // This helps in supporting legacy media content where the server the media resides on returns a bogus MIME type // but the parcel owner has correctly set the MIME type in the parcel media settings. - if(!mMimeType.empty() && (mMimeType != "none/none")) + if(!mMimeType.empty() && (mMimeType != LLMIMETypes::getDefaultMimeType())) { std::string plugin_basename = LLMIMETypes::implType(mMimeType); if(!plugin_basename.empty()) @@ -1839,9 +2375,12 @@ bool LLViewerMediaImpl::handleKeyHere(KEY key, MASK mask) if(!result) { - result = mMediaSource->keyEvent(LLPluginClassMedia::KEY_EVENT_DOWN ,key, mask); + + LLSD native_key_data = gViewerWindow->getWindow()->getNativeKeyData(); + + result = mMediaSource->keyEvent(LLPluginClassMedia::KEY_EVENT_DOWN ,key, mask, native_key_data); // Since the viewer internal event dispatching doesn't give us key-up events, simulate one here. - (void)mMediaSource->keyEvent(LLPluginClassMedia::KEY_EVENT_UP ,key, mask); + (void)mMediaSource->keyEvent(LLPluginClassMedia::KEY_EVENT_UP ,key, mask, native_key_data); } } @@ -1859,7 +2398,9 @@ bool LLViewerMediaImpl::handleUnicodeCharHere(llwchar uni_char) if (uni_char >= 32 // discard 'control' characters && uni_char != 127) // SDL thinks this is 'delete' - yuck. { - mMediaSource->textInput(wstring_to_utf8str(LLWString(1, uni_char)), gKeyboard->currentMask(FALSE)); + LLSD native_key_data = gViewerWindow->getWindow()->getNativeKeyData(); + + mMediaSource->textInput(wstring_to_utf8str(LLWString(1, uni_char)), gKeyboard->currentMask(FALSE), native_key_data); } } @@ -1920,6 +2461,18 @@ void LLViewerMediaImpl::update() } } } + else + { + updateVolume(); + + // If we didn't just create the impl, it may need to get cookie updates. + if(!sUpdatedCookies.empty()) + { + // TODO: Only send cookies to plugins that need them + mMediaSource->set_cookies(sUpdatedCookies); + } + } + if(mMediaSource == NULL) { @@ -2111,6 +2664,21 @@ void LLViewerMediaImpl::scaleMouse(S32 *mouse_x, S32 *mouse_y) #endif } + + +////////////////////////////////////////////////////////////////////////////////////////// +bool LLViewerMediaImpl::isMediaTimeBased() +{ + bool result = false; + + if(mMediaSource) + { + result = mMediaSource->pluginSupportsMediaTime(); + } + + return result; +} + ////////////////////////////////////////////////////////////////////////////////////////// bool LLViewerMediaImpl::isMediaPlaying() { @@ -2157,7 +2725,7 @@ void LLViewerMediaImpl::resetPreviousMediaState() ////////////////////////////////////////////////////////////////////////////////////////// // -void LLViewerMediaImpl::setDisabled(bool disabled) +void LLViewerMediaImpl::setDisabled(bool disabled, bool forcePlayOnEnable) { if(mIsDisabled != disabled) { @@ -2172,7 +2740,7 @@ void LLViewerMediaImpl::setDisabled(bool disabled) else { // We just (re)enabled this media. Do a navigate if auto-play is in order. - if(mMediaAutoPlay && gSavedSettings.getBOOL(LLViewerMedia::AUTO_PLAY_MEDIA_SETTING)) + if(isAutoPlayable() || forcePlayOnEnable) { navigateTo(mMediaEntryURL, "", true, true); } @@ -2199,6 +2767,12 @@ bool LLViewerMediaImpl::isForcedUnloaded() const } } + // If this media's class is not supposed to be shown, unload + if (!shouldShowBasedOnClass()) + { + return true; + } + return false; } @@ -2232,6 +2806,41 @@ void LLViewerMediaImpl::handleMediaEvent(LLPluginClassMedia* plugin, LLPluginCla { switch(event) { + case MEDIA_EVENT_CLICK_LINK_NOFOLLOW: + { + LL_DEBUGS("Media") << "MEDIA_EVENT_CLICK_LINK_NOFOLLOW, uri is: " << plugin->getClickURL() << LL_ENDL; + std::string url = plugin->getClickURL(); + LLURLDispatcher::dispatch(url, NULL, mTrustedBrowser); + + } + break; + case MEDIA_EVENT_CLICK_LINK_HREF: + { + LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_CLICK_LINK_HREF, target is \"" << plugin->getClickTarget() << "\", uri is " << plugin->getClickURL() << LL_ENDL; + // retrieve the event parameters + std::string url = plugin->getClickURL(); + U32 target_type = plugin->getClickTargetType(); + + switch (target_type) + { + case LLPluginClassMedia::TARGET_EXTERNAL: + // force url to external browser + LLWeb::loadURLExternal(url); + break; + case LLPluginClassMedia::TARGET_BLANK: + // open in SL media browser or external browser based on user pref + LLWeb::loadURL(url); + break; + case LLPluginClassMedia::TARGET_NONE: + // ignore this click and let media plugin handle it + break; + case LLPluginClassMedia::TARGET_OTHER: + LL_WARNS("LinkTarget") << "Unsupported link target type" << LL_ENDL; + break; + default: break; + } + }; + break; case MEDIA_EVENT_PLUGIN_FAILED_LAUNCH: { // The plugin failed to load properly. Make sure the timer doesn't retry. @@ -2353,6 +2962,13 @@ void LLViewerMediaImpl::handleMediaEvent(LLPluginClassMedia* plugin, LLPluginCla //////////////////////////////////////////////////////////////////////////////// // virtual +void LLViewerMediaImpl::handleCookieSet(LLPluginClassMedia* self, const std::string &cookie) +{ + LLViewerMedia::getCookieStore()->setCookies(cookie); +} + +//////////////////////////////////////////////////////////////////////////////// +// virtual void LLViewerMediaImpl::cut() { @@ -2440,8 +3056,17 @@ void LLViewerMediaImpl::calculateInterest() if(!mObjectList.empty()) { // Just use the first object in the list. We could go through the list and find the closest object, but this should work well enough. - LLVector3d global_delta = gAgent.getPositionGlobal() - (*mObjectList.begin())->getPositionGlobal(); + std::list< LLVOVolume* >::iterator iter = mObjectList.begin() ; + LLVOVolume* objp = *iter ; + llassert_always(objp != NULL) ; + + LLVector3d obj_global = objp->getPositionGlobal() ; + LLVector3d agent_global = gAgent.getPositionGlobal() ; + LLVector3d global_delta = agent_global - obj_global ; mProximityDistance = global_delta.magVecSquared(); // use distance-squared because it's cheaper and sorts the same. + + LLVector3d camera_delta = gAgentCamera.getCameraPositionGlobal() - obj_global; + mProximityCamera = camera_delta.magVec(); } if(mNeedsMuteCheck) @@ -2453,16 +3078,25 @@ void LLViewerMediaImpl::calculateInterest() for(; iter != mObjectList.end() ; ++iter) { LLVOVolume *obj = *iter; - if(LLMuteList::getInstance()->isMuted(obj->getID())) + llassert(obj); + if (!obj) continue; + if(LLMuteList::getInstance() && + LLMuteList::getInstance()->isMuted(obj->getID())) + { mIsMuted = true; + } else { // We won't have full permissions data for all objects. Attempt to mute objects when we can tell their owners are muted. - LLPermissions* obj_perm = LLSelectMgr::getInstance()->findObjectPermissions(obj); - if(obj_perm) + if (LLSelectMgr::getInstance()) { - if(LLMuteList::getInstance()->isMuted(obj_perm->getOwner())) - mIsMuted = true; + LLPermissions* obj_perm = LLSelectMgr::getInstance()->findObjectPermissions(obj); + if(obj_perm) + { + if(LLMuteList::getInstance() && + LLMuteList::getInstance()->isMuted(obj_perm->getOwner())) + mIsMuted = true; + } } } } @@ -2684,3 +3318,113 @@ void LLViewerMediaImpl::setTextureID(LLUUID id) } } +////////////////////////////////////////////////////////////////////////////////////////// +// +bool LLViewerMediaImpl::isAutoPlayable() const +{ + return (mMediaAutoPlay && + gSavedSettings.getBOOL(LLViewerMedia::AUTO_PLAY_MEDIA_SETTING) && + gSavedSettings.getBOOL("MediaTentativeAutoPlay")); +} + +////////////////////////////////////////////////////////////////////////////////////////// +// +bool LLViewerMediaImpl::shouldShowBasedOnClass() const +{ + // If this is parcel media or in the UI, return true always + if (getUsedInUI() || isParcelMedia()) return true; + + bool attached_to_another_avatar = isAttachedToAnotherAvatar(); + bool inside_parcel = isInAgentParcel(); + + // llinfos << " hasFocus = " << hasFocus() << + // " others = " << (attached_to_another_avatar && gSavedSettings.getBOOL(LLViewerMedia::SHOW_MEDIA_ON_OTHERS_SETTING)) << + // " within = " << (inside_parcel && gSavedSettings.getBOOL(LLViewerMedia::SHOW_MEDIA_WITHIN_PARCEL_SETTING)) << + // " outside = " << (!inside_parcel && gSavedSettings.getBOOL(LLViewerMedia::SHOW_MEDIA_OUTSIDE_PARCEL_SETTING)) << llendl; + + // If it has focus, we should show it + // This is incorrect, and causes EXT-6750 (disabled attachment media still plays) +// if (hasFocus()) +// return true; + + // If it is attached to an avatar and the pref is off, we shouldn't show it + if (attached_to_another_avatar) + return gSavedSettings.getBOOL(LLViewerMedia::SHOW_MEDIA_ON_OTHERS_SETTING); + + if (inside_parcel) + return gSavedSettings.getBOOL(LLViewerMedia::SHOW_MEDIA_WITHIN_PARCEL_SETTING); + else + return gSavedSettings.getBOOL(LLViewerMedia::SHOW_MEDIA_OUTSIDE_PARCEL_SETTING); +} + +////////////////////////////////////////////////////////////////////////////////////////// +// +bool LLViewerMediaImpl::isAttachedToAnotherAvatar() const +{ + bool result = false; + + std::list< LLVOVolume* >::const_iterator iter = mObjectList.begin(); + std::list< LLVOVolume* >::const_iterator end = mObjectList.end(); + for ( ; iter != end; iter++) + { + if (isObjectAttachedToAnotherAvatar(*iter)) + { + result = true; + break; + } + } + return result; +} + +////////////////////////////////////////////////////////////////////////////////////////// +// +//static +bool LLViewerMediaImpl::isObjectAttachedToAnotherAvatar(LLVOVolume *obj) +{ + bool result = false; + LLXform *xform = obj; + // Walk up parent chain + while (NULL != xform) + { + LLViewerObject *object = dynamic_cast<LLViewerObject*> (xform); + if (NULL != object) + { + LLVOAvatar *avatar = object->asAvatar(); + if ((NULL != avatar) && (avatar != gAgentAvatarp)) + { + result = true; + break; + } + } + xform = xform->getParent(); + } + return result; +} + +////////////////////////////////////////////////////////////////////////////////////////// +// +bool LLViewerMediaImpl::isInAgentParcel() const +{ + bool result = false; + + std::list< LLVOVolume* >::const_iterator iter = mObjectList.begin(); + std::list< LLVOVolume* >::const_iterator end = mObjectList.end(); + for ( ; iter != end; iter++) + { + LLVOVolume *object = *iter; + if (LLViewerMediaImpl::isObjectInAgentParcel(object)) + { + result = true; + break; + } + } + return result; +} + +////////////////////////////////////////////////////////////////////////////////////////// +// +// static +bool LLViewerMediaImpl::isObjectInAgentParcel(LLVOVolume *obj) +{ + return (LLViewerParcelMgr::getInstance()->inAgentParcel(obj->getPositionGlobal())); +} diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h index ff18ed605a..8626f4469e 100644 --- a/indra/newview/llviewermedia.h +++ b/indra/newview/llviewermedia.h @@ -44,12 +44,15 @@ #include "llpluginclassmedia.h" #include "v4color.h" +#include "llurl.h" + class LLViewerMediaImpl; class LLUUID; class LLViewerMediaTexture; class LLMediaEntry; -class LLVOVolume ; +class LLVOVolume; class LLMimeDiscoveryResponder; +class LLPluginCookieStore; typedef LLPointer<LLViewerMediaImpl> viewer_media_t; /////////////////////////////////////////////////////////////////////////////// @@ -73,55 +76,95 @@ class LLViewerMediaImpl; class LLViewerMedia { LOG_CLASS(LLViewerMedia); - public: - - // String to get/set media autoplay in gSavedSettings - static const char *AUTO_PLAY_MEDIA_SETTING; +public: - typedef std::vector<LLViewerMediaImpl*> impl_list; - - typedef std::map<LLUUID, LLViewerMediaImpl*> impl_id_map; - - // Special case early init for just web browser component - // so we can show login screen. See .cpp file for details. JC - - static viewer_media_t newMediaImpl(const LLUUID& texture_id, - S32 media_width = 0, - S32 media_height = 0, - U8 media_auto_scale = false, - U8 media_loop = false); - - static viewer_media_t updateMediaImpl(LLMediaEntry* media_entry, const std::string& previous_url, bool update_from_self); - static LLViewerMediaImpl* getMediaImplFromTextureID(const LLUUID& texture_id); - static std::string getCurrentUserAgent(); - static void updateBrowserUserAgent(); - static bool handleSkinCurrentChanged(const LLSD& /*newvalue*/); - static bool textureHasMedia(const LLUUID& texture_id); - static void setVolume(F32 volume); - - static void updateMedia(void* dummy_arg = NULL); - - static void initClass(); - static void cleanupClass(); - - static F32 getVolume(); - static void muteListChanged(); - static void setInWorldMediaDisabled(bool disabled); - static bool getInWorldMediaDisabled(); - - static bool isInterestingEnough(const LLVOVolume* object, const F64 &object_interest); + // String to get/set media autoplay in gSavedSettings + static const char* AUTO_PLAY_MEDIA_SETTING; + static const char* SHOW_MEDIA_ON_OTHERS_SETTING; + static const char* SHOW_MEDIA_WITHIN_PARCEL_SETTING; + static const char* SHOW_MEDIA_OUTSIDE_PARCEL_SETTING; - // Returns the priority-sorted list of all media impls. - static impl_list &getPriorityList(); - - // This is the comparitor used to sort the list. - static bool priorityComparitor(const LLViewerMediaImpl* i1, const LLViewerMediaImpl* i2); - - // For displaying the media first-run dialog. - static bool needsMediaFirstRun(); - static void displayMediaFirstRun(); - static bool firstRunCallback(const LLSD& notification, const LLSD& response); - + typedef std::vector<LLViewerMediaImpl*> impl_list; + + typedef std::map<LLUUID, LLViewerMediaImpl*> impl_id_map; + + // Special case early init for just web browser component + // so we can show login screen. See .cpp file for details. JC + + static viewer_media_t newMediaImpl(const LLUUID& texture_id, + S32 media_width = 0, + S32 media_height = 0, + U8 media_auto_scale = false, + U8 media_loop = false); + + static viewer_media_t updateMediaImpl(LLMediaEntry* media_entry, const std::string& previous_url, bool update_from_self); + static LLViewerMediaImpl* getMediaImplFromTextureID(const LLUUID& texture_id); + static std::string getCurrentUserAgent(); + static void updateBrowserUserAgent(); + static bool handleSkinCurrentChanged(const LLSD& /*newvalue*/); + static bool textureHasMedia(const LLUUID& texture_id); + static void setVolume(F32 volume); + + // Is any media currently "showing"? Includes Parcel Media. Does not include media in the UI. + static bool isAnyMediaShowing(); + // Set all media enabled or disabled, depending on val. Does not include media in the UI. + static void setAllMediaEnabled(bool val); + + static void updateMedia(void* dummy_arg = NULL); + + static void initClass(); + static void cleanupClass(); + + static F32 getVolume(); + static void muteListChanged(); + static void setInWorldMediaDisabled(bool disabled); + static bool getInWorldMediaDisabled(); + + static bool isInterestingEnough(const LLVOVolume* object, const F64 &object_interest); + + // Returns the priority-sorted list of all media impls. + static impl_list &getPriorityList(); + + // This is the comparitor used to sort the list. + static bool priorityComparitor(const LLViewerMediaImpl* i1, const LLViewerMediaImpl* i2); + + // These are just helper functions for the convenience of others working with media + static bool hasInWorldMedia(); + static std::string getParcelAudioURL(); + static bool hasParcelMedia(); + static bool hasParcelAudio(); + static bool isParcelMediaPlaying(); + static bool isParcelAudioPlaying(); + + // Clear all cookies for all plugins + static void clearAllCookies(); + + // Clear all plugins' caches + static void clearAllCaches(); + + // Set the "cookies enabled" flag for all loaded plugins + static void setCookiesEnabled(bool enabled); + + // Set the proxy config for all loaded plugins + static void setProxyConfig(bool enable, const std::string &host, int port); + + static LLPluginCookieStore *getCookieStore(); + static void loadCookieFile(); + static void saveCookieFile(); + static void addCookie(const std::string &name, const std::string &value, const std::string &domain, const LLDate &expires, const std::string &path = std::string("/"), bool secure = false ); + static void addSessionCookie(const std::string &name, const std::string &value, const std::string &domain, const std::string &path = std::string("/"), bool secure = false ); + static void removeCookie(const std::string &name, const std::string &domain, const std::string &path = std::string("/") ); + + static void openIDSetup(const std::string &openid_url, const std::string &openid_token); + static void openIDCookieResponse(const std::string &cookie); + +private: + static void setOpenIDCookie(); + static void onTeleportFinished(); + + static LLPluginCookieStore *sCookieStore; + static LLURL sOpenIDURL; + static std::string sOpenIDCookie; }; // Implementation functions not exported into header file @@ -204,18 +247,20 @@ public: void updateImagesMediaStreams(); LLUUID getMediaTextureID() const; - void suspendUpdates(bool suspend) { mSuspendUpdates = suspend; }; + void suspendUpdates(bool suspend) { mSuspendUpdates = suspend; } void setVisible(bool visible); - bool getVisible() const { return mVisible; }; + bool getVisible() const { return mVisible; } + bool isVisible() const { return mVisible; } + bool isMediaTimeBased(); bool isMediaPlaying(); bool isMediaPaused(); bool hasMedia() const; - bool isMediaFailed() const { return mMediaSourceFailed; }; + bool isMediaFailed() const { return mMediaSourceFailed; } void setMediaFailed(bool val) { mMediaSourceFailed = val; } void resetPreviousMediaState(); - void setDisabled(bool disabled); + void setDisabled(bool disabled, bool forcePlayOnEnable = false); bool isMediaDisabled() const { return mIsDisabled; }; void setInNearbyMediaList(bool in_list) { mInNearbyMediaList = in_list; } @@ -227,10 +272,10 @@ public: // returns true if this instance could be playable based on autoplay setting, current load state, etc. bool isPlayable() const; - void setIsParcelMedia(bool is_parcel_media) { mIsParcelMedia = is_parcel_media; }; - bool isParcelMedia() const { return mIsParcelMedia; }; + void setIsParcelMedia(bool is_parcel_media) { mIsParcelMedia = is_parcel_media; } + bool isParcelMedia() const { return mIsParcelMedia; } - ECursorType getLastSetCursor() { return mLastSetCursor; }; + ECursorType getLastSetCursor() { return mLastSetCursor; } // utility function to create a ready-to-use media instance from a desired media type. static LLPluginClassMedia* newSourceFromMediaType(std::string media_type, LLPluginClassMediaOwner *owner /* may be NULL */, S32 default_width, S32 default_height); @@ -267,6 +312,7 @@ public: // Inherited from LLPluginClassMediaOwner /*virtual*/ void handleMediaEvent(LLPluginClassMedia* plugin, LLPluginClassMediaOwner::EMediaEvent); + /*virtual*/ void handleCookieSet(LLPluginClassMedia* self, const std::string &cookie); // LLEditMenuHandler overrides /*virtual*/ void cut(); @@ -307,6 +353,9 @@ public: void setLowPrioritySizeLimit(int size); void setTextureID(LLUUID id = LLUUID::null); + + bool isTrustedBrowser() { return mTrustedBrowser; } + void setTrustedBrowser(bool trusted) { mTrustedBrowser = trusted; } typedef enum { @@ -331,6 +380,18 @@ public: void cancelMimeTypeProbe(); + // Is this media attached to an avatar *not* self + bool isAttachedToAnotherAvatar() const; + + // Is this media in the agent's parcel? + bool isInAgentParcel() const; + +private: + bool isAutoPlayable() const; + bool shouldShowBasedOnClass() const; + static bool isObjectAttachedToAnotherAvatar(LLVOVolume *obj); + static bool isObjectInAgentParcel(LLVOVolume *obj); + private: // a single media url with some data and an impl. LLPluginClassMedia* mMediaSource; @@ -370,14 +431,16 @@ private: bool mIsParcelMedia; S32 mProximity; F64 mProximityDistance; + F64 mProximityCamera; LLMimeDiscoveryResponder *mMimeTypeProbe; bool mMediaAutoPlay; std::string mMediaEntryURL; - bool mInNearbyMediaList; // used by LLFloaterNearbyMedia::refreshList() for performance reasons + bool mInNearbyMediaList; // used by LLPanelNearbyMedia::refreshList() for performance reasons bool mClearCache; LLColor4 mBackgroundColor; bool mNavigateSuspended; bool mNavigateSuspendedDeferred; + bool mTrustedBrowser; private: BOOL mIsUpdated ; diff --git a/indra/newview/llviewermediafocus.cpp b/indra/newview/llviewermediafocus.cpp index a0ac9c2091..02e450b223 100644 --- a/indra/newview/llviewermediafocus.cpp +++ b/indra/newview/llviewermediafocus.cpp @@ -38,6 +38,7 @@ #include "llpanelprimmediacontrols.h" #include "llpluginclassmedia.h" #include "llagent.h" +#include "llagentcamera.h" #include "lltoolpie.h" #include "llviewercamera.h" #include "llviewermedia.h" @@ -126,7 +127,7 @@ void LLViewerMediaFocus::setFocusFace(LLPointer<LLViewerObject> objectp, S32 fac if(face_auto_zoom && ! parcel->getMediaPreventCameraZoom()) { // Zoom in on this face - mMediaControls.get()->resetZoomLevel(); + mMediaControls.get()->resetZoomLevel(false); mMediaControls.get()->nextZoomLevel(); } else @@ -157,7 +158,6 @@ void LLViewerMediaFocus::setFocusFace(LLPointer<LLViewerObject> objectp, S32 fac mFocusedObjectFace = 0; } } - } void LLViewerMediaFocus::clearFocus() @@ -198,11 +198,11 @@ bool LLViewerMediaFocus::getFocus() } // This function selects an ideal viewing distance based on the focused object, pick normal, and padding value -void LLViewerMediaFocus::setCameraZoom(LLViewerObject* object, LLVector3 normal, F32 padding_factor) +void LLViewerMediaFocus::setCameraZoom(LLViewerObject* object, LLVector3 normal, F32 padding_factor, bool zoom_in_only) { if (object) { - gAgent.setFocusOnAvatar(FALSE, ANIMATE); + gAgentCamera.setFocusOnAvatar(FALSE, ANIMATE); LLBBox bbox = object->getBoundingBoxAgent(); LLVector3d center = gAgent.getPosGlobalFromAgent(bbox.getCenterAgent()); @@ -215,6 +215,8 @@ void LLViewerMediaFocus::setCameraZoom(LLViewerObject* object, LLVector3 normal, // We need the aspect ratio, and the 3 components of the bbox as height, width, and depth. F32 aspect_ratio = getBBoxAspectRatio(bbox, normal, &height, &width, &depth); F32 camera_aspect = LLViewerCamera::getInstance()->getAspect(); + + lldebugs << "normal = " << normal << ", aspect_ratio = " << aspect_ratio << ", camera_aspect = " << camera_aspect << llendl; // We will normally use the side of the volume aligned with the short side of the screen (i.e. the height for // a screen in a landscape aspect ratio), however there is an edge case where the aspect ratio of the object is @@ -231,11 +233,15 @@ void LLViewerMediaFocus::setCameraZoom(LLViewerObject* object, LLVector3 normal, { angle_of_view = llmax(0.1f, LLViewerCamera::getInstance()->getView() * LLViewerCamera::getInstance()->getAspect()); distance = width * 0.5 * padding_factor / tan(angle_of_view * 0.5f ); + + lldebugs << "using width (" << width << "), angle_of_view = " << angle_of_view << ", distance = " << distance << llendl; } else { angle_of_view = llmax(0.1f, LLViewerCamera::getInstance()->getView()); distance = height * 0.5 * padding_factor / tan(angle_of_view * 0.5f ); + + lldebugs << "using height (" << height << "), angle_of_view = " << angle_of_view << ", distance = " << distance << llendl; } distance += depth * 0.5; @@ -261,7 +267,7 @@ void LLViewerMediaFocus::setCameraZoom(LLViewerObject* object, LLVector3 normal, // orientation with respect to the face. In other words, if before zoom // the media appears "upside down" from the camera, after zooming it will // still be upside down, but at least it will not flip. - LLVector3d cur_camera_pos = LLVector3d(gAgent.getCameraPositionGlobal()); + LLVector3d cur_camera_pos = LLVector3d(gAgentCamera.getCameraPositionGlobal()); LLVector3d delta = (cur_camera_pos - camera_pos); F64 len = delta.length(); delta.normalize(); @@ -269,12 +275,21 @@ void LLViewerMediaFocus::setCameraZoom(LLViewerObject* object, LLVector3 normal, camera_pos += 0.01 * len * delta; } - gAgent.setCameraPosAndFocusGlobal(camera_pos, target_pos, object->getID() ); + // If we are not allowing zooming out and the old camera position is closer to + // the center then the new intended camera position, don't move camera and return + if (zoom_in_only && + (dist_vec_squared(gAgentCamera.getCameraPositionGlobal(), target_pos) < dist_vec_squared(camera_pos, target_pos))) + { + return; + } + + gAgentCamera.setCameraPosAndFocusGlobal(camera_pos, target_pos, object->getID() ); + } else { // If we have no object, focus back on the avatar. - gAgent.setFocusOnAvatar(TRUE, ANIMATE); + gAgentCamera.setFocusOnAvatar(TRUE, ANIMATE); } } void LLViewerMediaFocus::onFocusReceived() @@ -431,40 +446,38 @@ F32 LLViewerMediaFocus::getBBoxAspectRatio(const LLBBox& bbox, const LLVector3& LLVector3 bbox_max = bbox.getExtentLocal(); F32 dot1 = 0.f; F32 dot2 = 0.f; + + lldebugs << "bounding box local size = " << bbox_max << ", local_normal = " << local_normal << llendl; // The largest component of the localized normal vector is the depth component // meaning that the other two are the legs of the rectangle. local_normal.abs(); - if(local_normal.mV[VX] > local_normal.mV[VY]) + + // Using temporary variables for these makes the logic a bit more readable. + bool XgtY = (local_normal.mV[VX] > local_normal.mV[VY]); + bool XgtZ = (local_normal.mV[VX] > local_normal.mV[VZ]); + bool YgtZ = (local_normal.mV[VY] > local_normal.mV[VZ]); + + if(XgtY && XgtZ) { - if(local_normal.mV[VX] > local_normal.mV[VZ]) - { - // Use the y and z comps - comp1.mV[VY] = bbox_max.mV[VY]; - comp2.mV[VZ] = bbox_max.mV[VZ]; - *depth = bbox_max.mV[VX]; - } - else - { - // Use the x and y comps - comp1.mV[VY] = bbox_max.mV[VY]; - comp2.mV[VZ] = bbox_max.mV[VZ]; - *depth = bbox_max.mV[VZ]; - } + lldebugs << "x component of normal is longest, using y and z" << llendl; + comp1.mV[VY] = bbox_max.mV[VY]; + comp2.mV[VZ] = bbox_max.mV[VZ]; + *depth = bbox_max.mV[VX]; } - else if(local_normal.mV[VY] > local_normal.mV[VZ]) + else if(!XgtY && YgtZ) { - // Use the x and z comps + lldebugs << "y component of normal is longest, using x and z" << llendl; comp1.mV[VX] = bbox_max.mV[VX]; comp2.mV[VZ] = bbox_max.mV[VZ]; *depth = bbox_max.mV[VY]; } else { - // Use the x and y comps - comp1.mV[VY] = bbox_max.mV[VY]; - comp2.mV[VZ] = bbox_max.mV[VZ]; - *depth = bbox_max.mV[VX]; + lldebugs << "z component of normal is longest, using x and y" << llendl; + comp1.mV[VX] = bbox_max.mV[VX]; + comp2.mV[VY] = bbox_max.mV[VY]; + *depth = bbox_max.mV[VZ]; } // The height is the vector closest to vertical in the bbox coordinate space (highest dot product value) @@ -474,12 +487,20 @@ F32 LLViewerMediaFocus::getBBoxAspectRatio(const LLBBox& bbox, const LLVector3& { *height = comp1.length(); *width = comp2.length(); + + lldebugs << "comp1 = " << comp1 << ", height = " << *height << llendl; + lldebugs << "comp2 = " << comp2 << ", width = " << *width << llendl; } else { *height = comp2.length(); *width = comp1.length(); + + lldebugs << "comp2 = " << comp2 << ", height = " << *height << llendl; + lldebugs << "comp1 = " << comp1 << ", width = " << *width << llendl; } + + lldebugs << "returning " << (*width / *height) << llendl; // Return the aspect ratio. return *width / *height; @@ -551,6 +572,19 @@ void LLViewerMediaFocus::focusZoomOnMedia(LLUUID media_id) } } +void LLViewerMediaFocus::unZoom() +{ + if(mMediaControls.get()) + { + mMediaControls.get()->resetZoomLevel(); + } +} + +bool LLViewerMediaFocus::isZoomed() const +{ + return (mMediaControls.get() && mMediaControls.get()->getZoomLevel() != LLPanelPrimMediaControls::ZOOM_NONE); +} + LLUUID LLViewerMediaFocus::getControlsMediaID() { if(getFocusedMediaImpl()) diff --git a/indra/newview/llviewermediafocus.h b/indra/newview/llviewermediafocus.h index 89ee0ae283..d9ddc7432b 100644 --- a/indra/newview/llviewermediafocus.h +++ b/indra/newview/llviewermediafocus.h @@ -66,7 +66,7 @@ public: void update(); - static void setCameraZoom(LLViewerObject* object, LLVector3 normal, F32 padding_factor); + static void setCameraZoom(LLViewerObject* object, LLVector3 normal, F32 padding_factor, bool zoom_in_only = false); static F32 getBBoxAspectRatio(const LLBBox& bbox, const LLVector3& normal, F32* height, F32* width, F32* depth); bool isFocusedOnFace(LLPointer<LLViewerObject> objectp, S32 face); @@ -85,6 +85,9 @@ public: // Try to focus/zoom on the specified media (if it's on an object in world). void focusZoomOnMedia(LLUUID media_id); + // Are we zoomed in? + bool isZoomed() const; + void unZoom(); // Return the ID of the media instance the controls are currently attached to (either focus or hover). LLUUID getControlsMediaID(); diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index a83baf7f9a..635cc361f3 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -42,8 +42,10 @@ // newview includes #include "llagent.h" +#include "llagentcamera.h" #include "llagentwearables.h" #include "llagentpilot.h" +#include "llbottomtray.h" #include "llcompilequeue.h" #include "llconsole.h" #include "lldebugview.h" @@ -51,8 +53,7 @@ //#include "llfirstuse.h" #include "llfloaterbuy.h" #include "llfloaterbuycontents.h" -#include "llfloaterbuycurrency.h" -#include "llfloatercustomize.h" +#include "llbuycurrencyhtml.h" #include "llfloatergodtools.h" #include "llfloaterinventory.h" #include "llfloaterland.h" @@ -71,6 +72,8 @@ #include "llhudmanager.h" #include "llimview.h" #include "llinventorybridge.h" +#include "llinventorydefines.h" +#include "llinventoryfunctions.h" #include "llpanellogin.h" #include "llpanelblockedlist.h" #include "llmenucommands.h" @@ -85,6 +88,7 @@ #include "lltoolmgr.h" #include "lltoolpie.h" #include "lltoolselectland.h" +#include "lltrans.h" #include "llviewergenericmessage.h" #include "llviewerhelp.h" #include "llviewermenufile.h" // init_menu_file() @@ -102,6 +106,8 @@ #include "llfloatercamera.h" #include "lluilistener.h" #include "llappearancemgr.h" +#include "lltrans.h" +#include "lleconomy.h" using namespace LLVOAvatarDefines; @@ -131,6 +137,7 @@ extern BOOL gDebugWindowProc; LLMenuBarGL *gMenuBarView = NULL; LLViewerMenuHolderGL *gMenuHolder = NULL; LLMenuGL *gPopupMenuView = NULL; +LLMenuGL *gEditMenu = NULL; LLMenuBarGL *gLoginMenuBarView = NULL; // Pie menus @@ -285,8 +292,8 @@ void handle_toggle_pg(void*); void handle_dump_attachments(void *); void handle_dump_avatar_local_textures(void*); void handle_debug_avatar_textures(void*); -void handle_grab_texture(void*); -BOOL enable_grab_texture(void*); +void handle_grab_baked_texture(void*); +BOOL enable_grab_baked_texture(void*); void handle_dump_region_object_cache(void*); BOOL enable_save_into_inventory(void*); @@ -378,8 +385,10 @@ void init_menus() /// /// Context menus /// + const widget_registry_t& registry = LLViewerMenuHolderGL::child_registry_t::instance(); + gEditMenu = LLUICtrlFactory::createFromFile<LLMenuGL>("menu_edit.xml", gMenuHolder, registry); gMenuAvatarSelf = LLUICtrlFactory::createFromFile<LLContextMenu>( "menu_avatar_self.xml", gMenuHolder, registry); gMenuAvatarOther = LLUICtrlFactory::createFromFile<LLContextMenu>( @@ -421,7 +430,7 @@ void init_menus() gPopupMenuView->setBackgroundColor( color ); // If we are not in production, use a different color to make it apparent. - if (LLViewerLogin::getInstance()->isInProductionGrid()) + if (LLGridManager::getInstance()->isInProductionGrid()) { color = LLUIColorTable::instance().getColor( "MenuBarBgColor" ); } @@ -433,10 +442,11 @@ void init_menus() gMenuBarView->setRect(LLRect(0, top, 0, top - MENU_BAR_HEIGHT)); gMenuBarView->setBackgroundColor( color ); - gMenuHolder->addChild(gMenuBarView); + LLView* menu_bar_holder = gViewerWindow->getRootView()->getChildView("menu_bar_holder"); + menu_bar_holder->addChild(gMenuBarView); gViewerWindow->setMenuBackgroundColor(false, - LLViewerLogin::getInstance()->isInProductionGrid()); + LLGridManager::getInstance()->isInProductionGrid()); // Assume L$10 for now, the server will tell us the real cost at login // *TODO:Also fix cost in llfolderview.cpp for Inventory menus @@ -468,9 +478,10 @@ void init_menus() gLoginMenuBarView = LLUICtrlFactory::getInstance()->createFromFile<LLMenuBarGL>("menu_login.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); gLoginMenuBarView->arrangeAndClear(); LLRect menuBarRect = gLoginMenuBarView->getRect(); - gLoginMenuBarView->setRect(LLRect(menuBarRect.mLeft, menuBarRect.mTop, gViewerWindow->getRootView()->getRect().getWidth() - menuBarRect.mLeft, menuBarRect.mBottom)); + menuBarRect.setLeftTopAndSize(0, menu_bar_holder->getRect().getHeight(), menuBarRect.getWidth(), menuBarRect.getHeight()); + gLoginMenuBarView->setRect(menuBarRect); gLoginMenuBarView->setBackgroundColor( color ); - gMenuHolder->addChild(gLoginMenuBarView); + menu_bar_holder->addChild(gLoginMenuBarView); // tooltips are on top of EVERYTHING, including menus gViewerWindow->getRootView()->sendChildToFront(gToolTipView); @@ -1449,28 +1460,28 @@ class LLAdvancedGrabBakedTexture : public view_listener_t std::string texture_type = userdata.asString(); if ("iris" == texture_type) { - handle_grab_texture( (void*)TEX_EYES_BAKED ); + handle_grab_baked_texture( (void*)BAKED_EYES ); } else if ("head" == texture_type) { - handle_grab_texture( (void*)TEX_HEAD_BAKED ); + handle_grab_baked_texture( (void*)BAKED_HEAD ); } else if ("upper" == texture_type) { - handle_grab_texture( (void*)TEX_UPPER_BAKED ); + handle_grab_baked_texture( (void*)BAKED_UPPER ); } else if ("lower" == texture_type) { - handle_grab_texture( (void*)TEX_SKIRT_BAKED ); + handle_grab_baked_texture( (void*)BAKED_LOWER ); } else if ("skirt" == texture_type) { - handle_grab_texture( (void*)TEX_SKIRT_BAKED ); + handle_grab_baked_texture( (void*)BAKED_SKIRT ); } else if ("hair" == texture_type) { - handle_grab_texture( (void*)TEX_HAIR_BAKED ); -} + handle_grab_baked_texture( (void*)BAKED_HAIR ); + } return true; } @@ -1485,23 +1496,27 @@ class LLAdvancedEnableGrabBakedTexture : public view_listener_t if ("iris" == texture_type) { - new_value = enable_grab_texture( (void*)TEX_EYES_BAKED ); + new_value = enable_grab_baked_texture( (void*)BAKED_EYES ); } else if ("head" == texture_type) { - new_value = enable_grab_texture( (void*)TEX_HEAD_BAKED ); + new_value = enable_grab_baked_texture( (void*)BAKED_HEAD ); } else if ("upper" == texture_type) { - new_value = enable_grab_texture( (void*)TEX_UPPER_BAKED ); + new_value = enable_grab_baked_texture( (void*)BAKED_UPPER ); } else if ("lower" == texture_type) { - new_value = enable_grab_texture( (void*)TEX_LOWER_BAKED ); + new_value = enable_grab_baked_texture( (void*)BAKED_LOWER ); } else if ("skirt" == texture_type) { - new_value = enable_grab_texture( (void*)TEX_SKIRT_BAKED ); + new_value = enable_grab_baked_texture( (void*)BAKED_SKIRT ); + } + else if ("hair" == texture_type) + { + new_value = enable_grab_baked_texture( (void*)BAKED_HAIR ); } return new_value; @@ -1795,9 +1810,10 @@ class LLAdvancedDebugAvatarTextures : public view_listener_t { bool handleEvent(const LLSD& userdata) { -#ifndef LL_RELEASE_FOR_DOWNLOAD - handle_debug_avatar_textures(NULL); -#endif + if (gAgent.isGodlike()) + { + handle_debug_avatar_textures(NULL); + } return true; } }; @@ -2387,18 +2403,14 @@ void handle_object_touch() msg->sendMessage(object->getRegion()->getHost()); } -bool enable_object_touch() -{ - LLViewerObject* obj = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject(); - return obj && obj->flagHandleTouch(); -} - // One object must have touch sensor class LLObjectEnableTouch : public view_listener_t { bool handleEvent(const LLSD& userdata) { - bool new_value = enable_object_touch(); + LLViewerObject* obj = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject(); + + bool new_value = obj && obj->flagHandleTouch(); // Update label based on the node touch name if available. std::string touch_text; @@ -2477,18 +2489,18 @@ class LLObjectBuild : public view_listener_t { bool handleEvent(const LLSD& userdata) { - if (gAgent.getFocusOnAvatar() && !LLToolMgr::getInstance()->inEdit() && gSavedSettings.getBOOL("EditCameraMovement") ) + if (gAgentCamera.getFocusOnAvatar() && !LLToolMgr::getInstance()->inEdit() && gSavedSettings.getBOOL("EditCameraMovement") ) { // zoom in if we're looking at the avatar - gAgent.setFocusOnAvatar(FALSE, ANIMATE); - gAgent.setFocusGlobal(LLToolPie::getInstance()->getPick()); - gAgent.cameraZoomIn(0.666f); - gAgent.cameraOrbitOver( 30.f * DEG_TO_RAD ); + gAgentCamera.setFocusOnAvatar(FALSE, ANIMATE); + gAgentCamera.setFocusGlobal(LLToolPie::getInstance()->getPick()); + gAgentCamera.cameraZoomIn(0.666f); + gAgentCamera.cameraOrbitOver( 30.f * DEG_TO_RAD ); gViewerWindow->moveCursorToCenter(); } else if ( gSavedSettings.getBOOL("EditCameraMovement") ) { - gAgent.setFocusGlobal(LLToolPie::getInstance()->getPick()); + gAgentCamera.setFocusGlobal(LLToolPie::getInstance()->getPick()); gViewerWindow->moveCursorToCenter(); } @@ -2506,7 +2518,7 @@ void handle_object_edit() { LLViewerParcelMgr::getInstance()->deselectLand(); - if (gAgent.getFocusOnAvatar() && !LLToolMgr::getInstance()->inEdit()) + if (gAgentCamera.getFocusOnAvatar() && !LLToolMgr::getInstance()->inEdit()) { LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection(); @@ -2514,19 +2526,19 @@ void handle_object_edit() { // always freeze camera in space, even if camera doesn't move // so, for example, follow cam scripts can't affect you when in build mode - gAgent.setFocusGlobal(gAgent.calcFocusPositionTargetGlobal(), LLUUID::null); - gAgent.setFocusOnAvatar(FALSE, ANIMATE); + gAgentCamera.setFocusGlobal(gAgentCamera.calcFocusPositionTargetGlobal(), LLUUID::null); + gAgentCamera.setFocusOnAvatar(FALSE, ANIMATE); } else { - gAgent.setFocusOnAvatar(FALSE, ANIMATE); + gAgentCamera.setFocusOnAvatar(FALSE, ANIMATE); LLViewerObject* selected_objectp = selection->getFirstRootObject(); if (selected_objectp) { // zoom in on object center instead of where we clicked, as we need to see the manipulator handles - gAgent.setFocusGlobal(selected_objectp->getPositionGlobal(), selected_objectp->getID()); - gAgent.cameraZoomIn(0.666f); - gAgent.cameraOrbitOver( 30.f * DEG_TO_RAD ); + gAgentCamera.setFocusGlobal(selected_objectp->getPositionGlobal(), selected_objectp->getID()); + gAgentCamera.cameraZoomIn(0.666f); + gAgentCamera.cameraOrbitOver( 30.f * DEG_TO_RAD ); gViewerWindow->moveCursorToCenter(); } } @@ -2555,7 +2567,7 @@ void handle_object_inspect() key["task"] = "task"; LLSideTray::getInstance()->showPanel("sidepanel_inventory", key); } - + /* // Old floater properties LLFloaterReg::showInstance("inspect", LLSD()); @@ -2571,19 +2583,19 @@ class LLLandBuild : public view_listener_t { LLViewerParcelMgr::getInstance()->deselectLand(); - if (gAgent.getFocusOnAvatar() && !LLToolMgr::getInstance()->inEdit() && gSavedSettings.getBOOL("EditCameraMovement") ) + if (gAgentCamera.getFocusOnAvatar() && !LLToolMgr::getInstance()->inEdit() && gSavedSettings.getBOOL("EditCameraMovement") ) { // zoom in if we're looking at the avatar - gAgent.setFocusOnAvatar(FALSE, ANIMATE); - gAgent.setFocusGlobal(LLToolPie::getInstance()->getPick()); - gAgent.cameraZoomIn(0.666f); - gAgent.cameraOrbitOver( 30.f * DEG_TO_RAD ); + gAgentCamera.setFocusOnAvatar(FALSE, ANIMATE); + gAgentCamera.setFocusGlobal(LLToolPie::getInstance()->getPick()); + gAgentCamera.cameraZoomIn(0.666f); + gAgentCamera.cameraOrbitOver( 30.f * DEG_TO_RAD ); gViewerWindow->moveCursorToCenter(); } else if ( gSavedSettings.getBOOL("EditCameraMovement") ) { // otherwise just move focus - gAgent.setFocusGlobal(LLToolPie::getInstance()->getPick()); + gAgentCamera.setFocusGlobal(LLToolPie::getInstance()->getPick()); gViewerWindow->moveCursorToCenter(); } @@ -2686,11 +2698,10 @@ class LLSelfEnableRemoveAllAttachments : public view_listener_t bool handleEvent(const LLSD& userdata) { bool new_value = false; - if (gAgent.getAvatarObject()) + if (isAgentAvatarValid()) { - LLVOAvatar* avatarp = gAgent.getAvatarObject(); - for (LLVOAvatar::attachment_map_t::iterator iter = avatarp->mAttachmentPoints.begin(); - iter != avatarp->mAttachmentPoints.end(); ) + for (LLVOAvatar::attachment_map_t::iterator iter = gAgentAvatarp->mAttachmentPoints.begin(); + iter != gAgentAvatarp->mAttachmentPoints.end(); ) { LLVOAvatar::attachment_map_t::iterator curiter = iter++; LLViewerJointAttachment* attachment = curiter->second; @@ -2818,14 +2829,14 @@ bool handle_go_to() LLViewerParcelMgr::getInstance()->deselectLand(); - if (gAgent.getAvatarObject() && !gSavedSettings.getBOOL("AutoPilotLocksCamera")) + if (isAgentAvatarValid() && !gSavedSettings.getBOOL("AutoPilotLocksCamera")) { - gAgent.setFocusGlobal(gAgent.getFocusTargetGlobal(), gAgent.getAvatarObject()->getID()); + gAgentCamera.setFocusGlobal(gAgentCamera.getFocusTargetGlobal(), gAgentAvatarp->getID()); } else { // Snap camera back to behind avatar - gAgent.setFocusOnAvatar(TRUE, ANIMATE); + gAgentCamera.setFocusOnAvatar(TRUE, ANIMATE); } // Could be first use @@ -3267,14 +3278,6 @@ void handle_buy_object(LLSaleInfo sale_info) return; } - S32 price = sale_info.getSalePrice(); - - if (price > 0 && price > gStatusBar->getBalance()) - { - LLFloaterBuyCurrency::buyCurrency("This object costs", price); - return; - } - LLFloaterBuy::show(sale_info); } @@ -3357,7 +3360,7 @@ class LLSelfStandUp : public view_listener_t bool enable_standup_self() { - bool new_value = gAgent.getAvatarObject() && gAgent.getAvatarObject()->isSitting(); + bool new_value = isAgentAvatarValid() && gAgentAvatarp->isSitting(); return new_value; } @@ -3455,7 +3458,7 @@ void set_god_level(U8 god_level) if(gViewerWindow) { gViewerWindow->setMenuBackgroundColor(god_level > GOD_NOT, - LLViewerLogin::getInstance()->isInProductionGrid()); + LLGridManager::getInstance()->isInProductionGrid()); } LLSD args; @@ -3495,7 +3498,7 @@ BOOL check_toggle_hacked_godmode(void*) bool enable_toggle_hacked_godmode(void*) { - return !LLViewerLogin::getInstance()->isInProductionGrid(); + return !LLGridManager::getInstance()->isInProductionGrid(); } #endif @@ -3554,9 +3557,15 @@ bool LLHaveCallingcard::operator()(LLInventoryCategory* cat, BOOL is_agent_mappable(const LLUUID& agent_id) { - return (LLAvatarActions::isFriend(agent_id) && - LLAvatarTracker::instance().getBuddyInfo(agent_id)->isOnline() && - LLAvatarTracker::instance().getBuddyInfo(agent_id)->isRightGrantedFrom(LLRelationship::GRANT_MAP_LOCATION) + const LLRelationship* buddy_info = NULL; + bool is_friend = LLAvatarActions::isFriend(agent_id); + + if (is_friend) + buddy_info = LLAvatarTracker::instance().getBuddyInfo(agent_id); + + return (buddy_info && + buddy_info->isOnline() && + buddy_info->isRightGrantedFrom(LLRelationship::GRANT_MAP_LOCATION) ); } @@ -3610,6 +3619,14 @@ class LLEditEnableCustomizeAvatar : public view_listener_t } }; +class LLEnableEditShape : public view_listener_t +{ + bool handleEvent(const LLSD& userdata) + { + return gAgentWearables.isWearableModifiable(LLWearableType::WT_SHAPE, 0); + } +}; + bool enable_sit_object() { LLViewerObject* object = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject(); @@ -3680,9 +3697,9 @@ class LLLandSit : public view_listener_t LLVector3d posGlobal = LLToolPie::getInstance()->getPick().mPosGlobal; LLQuaternion target_rot; - if (gAgent.getAvatarObject()) + if (isAgentAvatarValid()) { - target_rot = gAgent.getAvatarObject()->getRotation(); + target_rot = gAgentAvatarp->getRotation(); } else { @@ -3704,17 +3721,15 @@ void reset_view_final( BOOL proceed ); void handle_reset_view() { - if( (CAMERA_MODE_CUSTOMIZE_AVATAR == gAgent.getCameraMode()) && gFloaterCustomize ) - { - // Show dialog box if needed. - gFloaterCustomize->askToSaveIfDirty( reset_view_final ); - } - else + if (gAgentCamera.cameraCustomizeAvatar()) { - gAgent.switchCameraPreset(CAMERA_PRESET_REAR_VIEW); - reset_view_final( TRUE ); - LLFloaterCamera::resetCameraMode(); + // switching to outfit selector should automagically save any currently edited wearable + LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD().with("type", "my_outfits")); } + + gAgentCamera.switchCameraPreset(CAMERA_PRESET_REAR_VIEW); + reset_view_final( TRUE ); + LLFloaterCamera::resetCameraMode(); } class LLViewResetView : public view_listener_t @@ -3734,15 +3749,15 @@ void reset_view_final( BOOL proceed ) return; } - gAgent.resetView(TRUE, TRUE); - gAgent.setLookAt(LOOKAT_TARGET_CLEAR); + gAgentCamera.resetView(TRUE, TRUE); + gAgentCamera.setLookAt(LOOKAT_TARGET_CLEAR); } class LLViewLookAtLastChatter : public view_listener_t { bool handleEvent(const LLSD& userdata) { - gAgent.lookAtLastChat(); + gAgentCamera.lookAtLastChat(); return true; } }; @@ -3751,27 +3766,18 @@ class LLViewMouselook : public view_listener_t { bool handleEvent(const LLSD& userdata) { - if (!gAgent.cameraMouselook()) + if (!gAgentCamera.cameraMouselook()) { - gAgent.changeCameraToMouselook(); + gAgentCamera.changeCameraToMouselook(); } else { - gAgent.changeCameraToDefault(); + gAgentCamera.changeCameraToDefault(); } return true; } }; -class LLViewFullscreen : public view_listener_t -{ - bool handleEvent(const LLSD& userdata) - { - gViewerWindow->toggleFullscreen(TRUE); - return true; - } -}; - class LLViewDefaultUISize : public view_listener_t { bool handleEvent(const LLSD& userdata) @@ -3845,15 +3851,15 @@ BOOL enable_deed_object_to_group(void*) * No longer able to support viewer side manipulations in this way * void god_force_inv_owner_permissive(LLViewerObject* object, - InventoryObjectList* inventory, + LLInventoryObject::object_list_t* inventory, S32 serial_num, void*) { typedef std::vector<LLPointer<LLViewerInventoryItem> > item_array_t; item_array_t items; - InventoryObjectList::const_iterator inv_it = inventory->begin(); - InventoryObjectList::const_iterator inv_end = inventory->end(); + LLInventoryObject::object_list_t::const_iterator inv_it = inventory->begin(); + LLInventoryObject::object_list_t::const_iterator inv_end = inventory->end(); for ( ; inv_it != inv_end; ++inv_it) { if(((*inv_it)->getType() != LLAssetType::AT_CATEGORY)) @@ -3976,9 +3982,9 @@ void handle_god_request_avatar_geometry(void *) void derez_objects(EDeRezDestination dest, const LLUUID& dest_id) { - if(gAgent.cameraMouselook()) + if(gAgentCamera.cameraMouselook()) { - gAgent.changeCameraToDefault(); + gAgentCamera.changeCameraToDefault(); } //gInventoryView->setPanelOpen(TRUE); @@ -4360,7 +4366,7 @@ BOOL enable_take() return TRUE; #else # ifdef TOGGLE_HACKED_GODLIKE_VIEWER - if (!LLViewerLogin::getInstance()->isInProductionGrid() + if (!LLGridManager::getInstance()->isInProductionGrid() && gAgent.isGodlike()) { return TRUE; @@ -4395,8 +4401,9 @@ void handle_buy_or_take() } else { - LLFloaterBuyCurrency::buyCurrency( - "Buying this costs", total_price); + LLStringUtil::format_map_t args; + args["AMOUNT"] = llformat("%d", total_price); + LLBuyCurrencyHTML::openCurrencyFloater( LLTrans::getString( "BuyingCosts", args ), total_price ); } } else @@ -4415,35 +4422,22 @@ bool visible_take_object() return !is_selection_buy_not_take() && enable_take(); } +bool tools_visible_buy_object() +{ + return is_selection_buy_not_take(); +} + +bool tools_visible_take_object() +{ + return !is_selection_buy_not_take(); +} + class LLToolsEnableBuyOrTake : public view_listener_t { bool handleEvent(const LLSD& userdata) { bool is_buy = is_selection_buy_not_take(); bool new_value = is_buy ? enable_buy_object() : enable_take(); - - // Update label - std::string label; - std::string buy_text; - std::string take_text; - std::string param = userdata.asString(); - std::string::size_type offset = param.find(","); - if (offset != param.npos) - { - buy_text = param.substr(0, offset); - take_text = param.substr(offset+1); - } - if (is_buy) - { - label = buy_text; - } - else - { - label = take_text; - } - gMenuHolder->childSetText("Pie Object Take", label); - gMenuHolder->childSetText("Menu Object Take", label); - return new_value; } }; @@ -4539,6 +4533,16 @@ void handle_buy() BOOL valid = LLSelectMgr::getInstance()->selectGetSaleInfo(sale_info); if (!valid) return; + S32 price = sale_info.getSalePrice(); + + if (price > 0 && price > gStatusBar->getBalance()) + { + LLStringUtil::format_map_t args; + args["AMOUNT"] = llformat("%d", price); + LLBuyCurrencyHTML::openCurrencyFloater( LLTrans::getString("this_object_costs", args), price ); + return; + } + if (sale_info.getSaleType() == LLSaleInfo::FS_CONTENTS) { handle_buy_contents(sale_info); @@ -4584,13 +4588,9 @@ BOOL sitting_on_selection() } // Need to determine if avatar is sitting on this object - LLVOAvatar* avatar = gAgent.getAvatarObject(); - if (!avatar) - { - return FALSE; - } + if (!isAgentAvatarValid()) return FALSE; - return (avatar->isSitting() && avatar->getRoot() == root_object); + return (gAgentAvatarp->isSitting() && gAgentAvatarp->getRoot() == root_object); } class LLToolsSaveToInventory : public view_listener_t @@ -4842,9 +4842,10 @@ class LLToolsEnableUnlink : public view_listener_t { bool handleEvent(const LLSD& userdata) { + LLViewerObject* first_editable_object = LLSelectMgr::getInstance()->getSelection()->getFirstEditableObject(); bool new_value = LLSelectMgr::getInstance()->selectGetAllRootsValid() && - LLSelectMgr::getInstance()->getSelection()->getFirstEditableObject() && - !LLSelectMgr::getInstance()->getSelection()->getFirstEditableObject()->isAttachment(); + first_editable_object && + !first_editable_object->isAttachment(); return new_value; } }; @@ -4987,7 +4988,7 @@ bool enable_object_delete() TRUE; #else # ifdef TOGGLE_HACKED_GODLIKE_VIEWER - (!LLViewerLogin::getInstance()->isInProductionGrid() + (!LLGridManager::getInstance()->isInProductionGrid() && gAgent.isGodlike()) || # endif LLSelectMgr::getInstance()->canDoDelete(); @@ -5031,7 +5032,7 @@ class LLViewEnableLastChatter : public view_listener_t bool handleEvent(const LLSD& userdata) { // *TODO: add check that last chatter is in range - bool new_value = (gAgent.cameraThirdPerson() && gAgent.getLastChatter().notNull()); + bool new_value = (gAgentCamera.cameraThirdPerson() && gAgent.getLastChatter().notNull()); return new_value; } }; @@ -5145,7 +5146,7 @@ void print_agent_nvpairs(void*) llinfos << "Can't find agent object" << llendl; } - llinfos << "Camera at " << gAgent.getCameraPositionGlobal() << llendl; + llinfos << "Camera at " << gAgentCamera.getCameraPositionGlobal() << llendl; } void show_debug_menus() @@ -5182,10 +5183,6 @@ void toggle_debug_menus(void*) { BOOL visible = ! gSavedSettings.getBOOL("UseDebugMenus"); gSavedSettings.setBOOL("UseDebugMenus", visible); - if(visible) - { - //LLFirstUse::useDebugMenus(); - } show_debug_menus(); } @@ -5330,13 +5327,23 @@ class LLWorldCreateLandmark : public view_listener_t } }; +class LLWorldPlaceProfile : public view_listener_t +{ + bool handleEvent(const LLSD& userdata) + { + LLSideTray::getInstance()->showPanel("panel_places", LLSD().with("type", "agent")); + + return true; + } +}; + void handle_look_at_selection(const LLSD& param) { - const F32 PADDING_FACTOR = 2.f; + const F32 PADDING_FACTOR = 1.75f; BOOL zoom = (param.asString() == "zoom"); if (!LLSelectMgr::getInstance()->getSelection()->isEmpty()) { - gAgent.setFocusOnAvatar(FALSE, ANIMATE); + gAgentCamera.setFocusOnAvatar(FALSE, ANIMATE); LLBBox selection_bbox = LLSelectMgr::getInstance()->getBBoxOfSelection(); F32 angle_of_view = llmax(0.1f, LLViewerCamera::getInstance()->getAspect() > 1.f ? LLViewerCamera::getInstance()->getView() * LLViewerCamera::getInstance()->getAspect() : LLViewerCamera::getInstance()->getView()); @@ -5352,14 +5359,19 @@ void handle_look_at_selection(const LLSD& param) } if (zoom) { - gAgent.setCameraPosAndFocusGlobal(LLSelectMgr::getInstance()->getSelectionCenterGlobal() + LLVector3d(obj_to_cam * distance), - LLSelectMgr::getInstance()->getSelectionCenterGlobal(), - object_id ); + // Make sure we are not increasing the distance between the camera and object + LLVector3d orig_distance = gAgentCamera.getCameraPositionGlobal() - LLSelectMgr::getInstance()->getSelectionCenterGlobal(); + distance = llmin(distance, (F32) orig_distance.length()); + + gAgentCamera.setCameraPosAndFocusGlobal(LLSelectMgr::getInstance()->getSelectionCenterGlobal() + LLVector3d(obj_to_cam * distance), + LLSelectMgr::getInstance()->getSelectionCenterGlobal(), + object_id ); + } else { - gAgent.setFocusGlobal( LLSelectMgr::getInstance()->getSelectionCenterGlobal(), object_id ); - } + gAgentCamera.setFocusGlobal( LLSelectMgr::getInstance()->getSelectionCenterGlobal(), object_id ); + } } } @@ -5371,7 +5383,7 @@ void handle_zoom_to_object(LLUUID object_id) if (object) { - gAgent.setFocusOnAvatar(FALSE, ANIMATE); + gAgentCamera.setFocusOnAvatar(FALSE, ANIMATE); LLBBox bbox = object->getBoundingBoxAgent() ; F32 angle_of_view = llmax(0.1f, LLViewerCamera::getInstance()->getAspect() > 1.f ? LLViewerCamera::getInstance()->getView() * LLViewerCamera::getInstance()->getAspect() : LLViewerCamera::getInstance()->getView()); @@ -5383,7 +5395,7 @@ void handle_zoom_to_object(LLUUID object_id) LLVector3d object_center_global = gAgent.getPosGlobalFromAgent(bbox.getCenterAgent()); - gAgent.setCameraPosAndFocusGlobal(object_center_global + LLVector3d(obj_to_cam * distance), + gAgentCamera.setCameraPosAndFocusGlobal(object_center_global + LLVector3d(obj_to_cam * distance), object_center_global, object_id ); } @@ -5501,6 +5513,37 @@ bool enable_pay_object() return false; } +bool visible_object_stand_up() +{ + // 'Object Stand Up' menu item is visible when agent is sitting on selection + return sitting_on_selection(); +} + +bool visible_object_sit() +{ + // 'Object Sit' menu item is visible when agent is not sitting on selection + bool is_sit_visible = !sitting_on_selection(); + if (is_sit_visible) + { + LLMenuItemGL* sit_menu_item = gMenuHolder->getChild<LLMenuItemGL>("Object Sit"); + // Init default 'Object Sit' menu item label + static const LLStringExplicit sit_text(sit_menu_item->getLabel()); + // Update label + std::string label; + LLSelectNode* node = LLSelectMgr::getInstance()->getSelection()->getFirstRootNode(); + if (node && node->mValid && !node->mSitName.empty()) + { + label.assign(node->mSitName); + } + else + { + label = sit_text; + } + sit_menu_item->setLabel(label); + } + return is_sit_visible; +} + class LLObjectEnableSitOrStand : public view_listener_t { bool handleEvent(const LLSD& userdata) @@ -5515,34 +5558,6 @@ class LLObjectEnableSitOrStand : public view_listener_t new_value = true; } } - // Update label - std::string label; - std::string sit_text; - std::string stand_text; - std::string param = userdata.asString(); - std::string::size_type offset = param.find(","); - if (offset != param.npos) - { - sit_text = param.substr(0, offset); - stand_text = param.substr(offset+1); - } - if (sitting_on_selection()) - { - label = stand_text; - } - else - { - LLSelectNode* node = LLSelectMgr::getInstance()->getSelection()->getFirstRootNode(); - if (node && node->mValid && !node->mSitName.empty()) - { - label.assign(node->mSitName); - } - else - { - label = sit_text; - } - } - gMenuHolder->childSetText("Object Sit", label); return new_value; } @@ -5576,10 +5591,17 @@ void handle_viewer_disable_message_log(void*) void handle_customize_avatar() { - if (gAgentWearables.areWearablesLoaded()) - { - gAgent.changeCameraToCustomizeAvatar(); - } + LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD().with("type", "my_outfits")); +} + +void handle_edit_outfit() +{ + LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD().with("type", "edit_outfit")); +} + +void handle_edit_shape() +{ + LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD().with("type", "edit_shape")); } void handle_report_abuse() @@ -5591,11 +5613,9 @@ void handle_report_abuse() void handle_buy_currency() { - LLFloaterBuyCurrency::buyCurrency(); + LLBuyCurrencyHTML::openCurrencyFloater(); } - - class LLFloaterVisible : public view_listener_t { bool handleEvent(const LLSD& userdata) @@ -5625,19 +5645,39 @@ class LLShowSidetrayPanel : public view_listener_t bool handleEvent(const LLSD& userdata) { std::string panel_name = userdata.asString(); - // Open up either the sidepanel or new floater. - if (LLSideTray::getInstance()->isPanelActive(panel_name)) + // Toggle the panel + if (!LLSideTray::getInstance()->isPanelActive(panel_name)) { - LLFloaterInventory::showAgentInventory(); + // LLFloaterInventory::showAgentInventory(); + LLSideTray::getInstance()->showPanel(panel_name, LLSD()); } else { - LLSideTray::getInstance()->showPanel(panel_name, LLSD()); + LLSideTray::getInstance()->collapseSideBar(); } return true; } }; +class LLSidetrayPanelVisible : public view_listener_t +{ + bool handleEvent(const LLSD& userdata) + { + std::string panel_name = userdata.asString(); + // Toggle the panel + if (LLSideTray::getInstance()->isPanelActive(panel_name)) + { + return true; + } + else + { + return false; + } + + } +}; + + bool callback_show_url(const LLSD& notification, const LLSD& response) { S32 option = LLNotificationsUtil::getSelectedOption(notification, response); @@ -5746,18 +5786,18 @@ class LLLandEdit : public view_listener_t { bool handleEvent(const LLSD& userdata) { - if (gAgent.getFocusOnAvatar() && gSavedSettings.getBOOL("EditCameraMovement") ) + if (gAgentCamera.getFocusOnAvatar() && gSavedSettings.getBOOL("EditCameraMovement") ) { // zoom in if we're looking at the avatar - gAgent.setFocusOnAvatar(FALSE, ANIMATE); - gAgent.setFocusGlobal(LLToolPie::getInstance()->getPick()); + gAgentCamera.setFocusOnAvatar(FALSE, ANIMATE); + gAgentCamera.setFocusGlobal(LLToolPie::getInstance()->getPick()); - gAgent.cameraOrbitOver( F_PI * 0.25f ); + gAgentCamera.cameraOrbitOver( F_PI * 0.25f ); gViewerWindow->moveCursorToCenter(); } else if ( gSavedSettings.getBOOL("EditCameraMovement") ) { - gAgent.setFocusGlobal(LLToolPie::getInstance()->getPick()); + gAgentCamera.setFocusGlobal(LLToolPie::getInstance()->getPick()); gViewerWindow->moveCursorToCenter(); } @@ -5816,7 +5856,7 @@ private: S32 index = userdata.asInteger(); LLViewerJointAttachment* attachment_point = NULL; if (index > 0) - attachment_point = get_if_there(gAgent.getAvatarObject()->mAttachmentPoints, index, (LLViewerJointAttachment*)NULL); + attachment_point = get_if_there(gAgentAvatarp->mAttachmentPoints, index, (LLViewerJointAttachment*)NULL); confirm_replace_attachment(0, attachment_point); } return true; @@ -5837,8 +5877,8 @@ void near_attach_object(BOOL success, void *user_data) U8 attachment_id = 0; if (attachment) { - for (LLVOAvatar::attachment_map_t::const_iterator iter = gAgent.getAvatarObject()->mAttachmentPoints.begin(); - iter != gAgent.getAvatarObject()->mAttachmentPoints.end(); ++iter) + for (LLVOAvatar::attachment_map_t::const_iterator iter = gAgentAvatarp->mAttachmentPoints.begin(); + iter != gAgentAvatarp->mAttachmentPoints.end(); ++iter) { if (iter->second == attachment) { @@ -5883,7 +5923,7 @@ void confirm_replace_attachment(S32 option, void* user_data) walkToSpot -= delta; gAgent.startAutoPilotGlobal(gAgent.getPosGlobalFromAgent(walkToSpot), "Attach", NULL, near_attach_object, user_data, stop_distance); - gAgent.clearFocusObject(); + gAgentCamera.clearFocusObject(); } } } @@ -5963,7 +6003,7 @@ class LLAttachmentDetachFromPoint : public view_listener_t { bool handleEvent(const LLSD& user_data) { - const LLViewerJointAttachment *attachment = get_if_there(gAgent.getAvatarObject()->mAttachmentPoints, user_data.asInteger(), (LLViewerJointAttachment*)NULL); + const LLViewerJointAttachment *attachment = get_if_there(gAgentAvatarp->mAttachmentPoints, user_data.asInteger(), (LLViewerJointAttachment*)NULL); if (attachment->getNumObjects() > 0) { gMessageSystem->newMessage("ObjectDetach"); @@ -5991,7 +6031,7 @@ static bool onEnableAttachmentLabel(LLUICtrl* ctrl, const LLSD& data) LLMenuItemGL* menu = dynamic_cast<LLMenuItemGL*>(ctrl); if (menu) { - const LLViewerJointAttachment *attachment = get_if_there(gAgent.getAvatarObject()->mAttachmentPoints, data["index"].asInteger(), (LLViewerJointAttachment*)NULL); + const LLViewerJointAttachment *attachment = get_if_there(gAgentAvatarp->mAttachmentPoints, data["index"].asInteger(), (LLViewerJointAttachment*)NULL); if (attachment) { label = data["label"].asString(); @@ -6069,10 +6109,12 @@ class LLAttachmentDetach : public view_listener_t //Adding an observer for a Jira 2422 and needs to be a fetch observer //for Jira 3119 -class LLWornItemFetchedObserver : public LLInventoryFetchObserver +class LLWornItemFetchedObserver : public LLInventoryFetchItemsObserver { public: - LLWornItemFetchedObserver() {} + LLWornItemFetchedObserver(const LLUUID& worn_item_id) : + LLInventoryFetchItemsObserver(worn_item_id) + {} virtual ~LLWornItemFetchedObserver() {} protected: @@ -6109,7 +6151,7 @@ class LLAttachmentEnableDrop : public view_listener_t if (object && LLSelectMgr::getInstance()->getSelection()->contains(object,SELECT_ALL_TES )) { S32 attachmentID = ATTACHMENT_ID_FROM_STATE(object->getState()); - attachment = get_if_there(gAgent.getAvatarObject()->mAttachmentPoints, attachmentID, (LLViewerJointAttachment*)NULL); + attachment = get_if_there(gAgentAvatarp->mAttachmentPoints, attachmentID, (LLViewerJointAttachment*)NULL); if (attachment) { @@ -6126,13 +6168,9 @@ class LLAttachmentEnableDrop : public view_listener_t // when the item finishes fetching worst case scenario // if a fetch is already out there (being sent from a slow sim) // we refetch and there are 2 fetches - LLWornItemFetchedObserver* wornItemFetched = new LLWornItemFetchedObserver(); - LLInventoryFetchObserver::item_ref_t items; //add item to the inventory item to be fetched - - items.push_back((*attachment_iter)->getItemID()); - - wornItemFetched->fetchItems(items); - gInventory.addObserver(wornItemFetched); + LLWornItemFetchedObserver* worn_item_fetched = new LLWornItemFetchedObserver((*attachment_iter)->getItemID()); + worn_item_fetched->startFetch(); + gInventory.addObserver(worn_item_fetched); } } } @@ -6241,8 +6279,8 @@ class LLAttachmentPointFilled : public view_listener_t bool handleEvent(const LLSD& user_data) { bool enable = false; - LLVOAvatar::attachment_map_t::iterator found_it = gAgent.getAvatarObject()->mAttachmentPoints.find(user_data.asInteger()); - if (found_it != gAgent.getAvatarObject()->mAttachmentPoints.end()) + LLVOAvatar::attachment_map_t::iterator found_it = gAgentAvatarp->mAttachmentPoints.find(user_data.asInteger()); + if (found_it != gAgentAvatarp->mAttachmentPoints.end()) { enable = found_it->second->getNumObjects() > 0; } @@ -6378,7 +6416,6 @@ class LLToolsSelectedScriptAction : public view_listener_t else { llwarns << "Failed to generate LLFloaterScriptQueue with action: " << action << llendl; - delete queue; } return true; } @@ -6439,13 +6476,13 @@ void handle_selected_texture_info(void*) void handle_test_male(void*) { - LLAppearanceManager::instance().wearOutfitByName("Male Shape & Outfit"); + LLAppearanceMgr::instance().wearOutfitByName("Male Shape & Outfit"); //gGestureList.requestResetFromServer( TRUE ); } void handle_test_female(void*) { - LLAppearanceManager::instance().wearOutfitByName("Female Shape & Outfit"); + LLAppearanceMgr::instance().wearOutfitByName("Female Shape & Outfit"); //gGestureList.requestResetFromServer( FALSE ); } @@ -6460,15 +6497,10 @@ void handle_toggle_pg(void*) void handle_dump_attachments(void*) { - LLVOAvatar* avatar = gAgent.getAvatarObject(); - if( !avatar ) - { - llinfos << "NO AVATAR" << llendl; - return; - } + if(!isAgentAvatarValid()) return; - for (LLVOAvatar::attachment_map_t::iterator iter = avatar->mAttachmentPoints.begin(); - iter != avatar->mAttachmentPoints.end(); ) + for (LLVOAvatar::attachment_map_t::iterator iter = gAgentAvatarp->mAttachmentPoints.begin(); + iter != gAgentAvatarp->mAttachmentPoints.end(); ) { LLVOAvatar::attachment_map_t::iterator curiter = iter++; LLViewerJointAttachment* attachment = curiter->second; @@ -6607,7 +6639,7 @@ bool enable_object_take_copy() all_valid = true; #ifndef HACKED_GODLIKE_VIEWER # ifdef TOGGLE_HACKED_GODLIKE_VIEWER - if (LLViewerLogin::getInstance()->isInProductionGrid() + if (LLGridManager::getInstance()->isInProductionGrid() || !gAgent.isGodlike()) # endif { @@ -6669,7 +6701,7 @@ BOOL enable_save_into_inventory(void*) return TRUE; #else # ifdef TOGGLE_HACKED_GODLIKE_VIEWER - if (!LLViewerLogin::getInstance()->isInProductionGrid() + if (!LLGridManager::getInstance()->isInProductionGrid() && gAgent.isGodlike()) { return TRUE; @@ -6730,7 +6762,7 @@ class LLViewEnableMouselook : public view_listener_t { // You can't go directly from customize avatar to mouselook. // TODO: write code with appropriate dialogs to handle this transition. - bool new_value = (CAMERA_MODE_CUSTOMIZE_AVATAR != gAgent.getCameraMode() && !gSavedSettings.getBOOL("FreezeTime")); + bool new_value = (CAMERA_MODE_CUSTOMIZE_AVATAR != gAgentCamera.getCameraMode() && !gSavedSettings.getBOOL("FreezeTime")); return new_value; } }; @@ -6867,7 +6899,8 @@ class LLToolsEditLinkedParts : public view_listener_t { bool handleEvent(const LLSD& userdata) { - BOOL select_individuals = gSavedSettings.getBOOL("EditLinkedParts"); + BOOL select_individuals = !gSavedSettings.getBOOL("EditLinkedParts"); + gSavedSettings.setBOOL( "EditLinkedParts", select_individuals ); if (select_individuals) { LLSelectMgr::getInstance()->demoteSelectionToIndividuals(); @@ -6887,7 +6920,7 @@ void reload_vertex_shader(void *) void handle_dump_avatar_local_textures(void*) { - gAgent.getAvatarObject()->dumpLocalTextures(); + gAgentAvatarp->dumpLocalTextures(); } void handle_dump_timers() @@ -6904,89 +6937,78 @@ void handle_debug_avatar_textures(void*) } } -void handle_grab_texture(void* data) +void handle_grab_baked_texture(void* data) { - ETextureIndex tex_index = (ETextureIndex)((intptr_t)data); - const LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); - if ( avatar ) - { - // MULTI-WEARABLE: change to support an index - const LLUUID& asset_id = avatar->grabLocalTexture(tex_index, 0); - LL_INFOS("texture") << "Adding baked texture " << asset_id << " to inventory." << llendl; - LLAssetType::EType asset_type = LLAssetType::AT_TEXTURE; - LLInventoryType::EType inv_type = LLInventoryType::IT_TEXTURE; - const LLUUID folder_id = gInventory.findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(asset_type)); - if(folder_id.notNull()) - { - std::string name = "Unknown"; - const LLVOAvatarDictionary::TextureEntry *texture_dict = LLVOAvatarDictionary::getInstance()->getTexture(tex_index); - if (texture_dict->mIsBakedTexture) - { - EBakedTextureIndex baked_index = texture_dict->mBakedTextureIndex; - name = "Baked " + LLVOAvatarDictionary::getInstance()->getBakedTexture(baked_index)->mNameCapitalized; - } - name += " Texture"; - - LLUUID item_id; - item_id.generate(); - LLPermissions perm; - perm.init(gAgentID, - gAgentID, - LLUUID::null, - LLUUID::null); - U32 next_owner_perm = PERM_MOVE | PERM_TRANSFER; - perm.initMasks(PERM_ALL, - PERM_ALL, - PERM_NONE, - PERM_NONE, - next_owner_perm); - time_t creation_date_now = time_corrected(); - LLPointer<LLViewerInventoryItem> item - = new LLViewerInventoryItem(item_id, - folder_id, - perm, - asset_id, - asset_type, - inv_type, - name, - LLStringUtil::null, - LLSaleInfo::DEFAULT, - LLInventoryItem::II_FLAGS_NONE, - creation_date_now); - - item->updateServer(TRUE); - gInventory.updateItem(item); - gInventory.notifyObservers(); - - // Show the preview panel for textures to let - // user know that the image is now in inventory. - LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel(); - if(active_panel) - { - LLFocusableElement* focus_ctrl = gFocusMgr.getKeyboardFocus(); + EBakedTextureIndex baked_tex_index = (EBakedTextureIndex)((intptr_t)data); + if (!isAgentAvatarValid()) return; - active_panel->setSelection(item_id, TAKE_FOCUS_NO); - active_panel->openSelected(); - //LLFloaterInventory::dumpSelectionInformation((void*)view); - // restore keyboard focus - gFocusMgr.setKeyboardFocus(focus_ctrl); - } - } - else - { - llwarns << "Can't find a folder to put it in" << llendl; + const LLUUID& asset_id = gAgentAvatarp->grabBakedTexture(baked_tex_index); + LL_INFOS("texture") << "Adding baked texture " << asset_id << " to inventory." << llendl; + LLAssetType::EType asset_type = LLAssetType::AT_TEXTURE; + LLInventoryType::EType inv_type = LLInventoryType::IT_TEXTURE; + const LLUUID folder_id = gInventory.findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(asset_type)); + if(folder_id.notNull()) + { + std::string name; + name = "Baked " + LLVOAvatarDictionary::getInstance()->getBakedTexture(baked_tex_index)->mNameCapitalized + " Texture"; + + LLUUID item_id; + item_id.generate(); + LLPermissions perm; + perm.init(gAgentID, + gAgentID, + LLUUID::null, + LLUUID::null); + U32 next_owner_perm = PERM_MOVE | PERM_TRANSFER; + perm.initMasks(PERM_ALL, + PERM_ALL, + PERM_NONE, + PERM_NONE, + next_owner_perm); + time_t creation_date_now = time_corrected(); + LLPointer<LLViewerInventoryItem> item + = new LLViewerInventoryItem(item_id, + folder_id, + perm, + asset_id, + asset_type, + inv_type, + name, + LLStringUtil::null, + LLSaleInfo::DEFAULT, + LLInventoryItemFlags::II_FLAGS_NONE, + creation_date_now); + + item->updateServer(TRUE); + gInventory.updateItem(item); + gInventory.notifyObservers(); + + // Show the preview panel for textures to let + // user know that the image is now in inventory. + LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel(); + if(active_panel) + { + LLFocusableElement* focus_ctrl = gFocusMgr.getKeyboardFocus(); + + active_panel->setSelection(item_id, TAKE_FOCUS_NO); + active_panel->openSelected(); + //LLFloaterInventory::dumpSelectionInformation((void*)view); + // restore keyboard focus + gFocusMgr.setKeyboardFocus(focus_ctrl); } } + else + { + llwarns << "Can't find a folder to put it in" << llendl; + } } -BOOL enable_grab_texture(void* data) +BOOL enable_grab_baked_texture(void* data) { - ETextureIndex index = (ETextureIndex)((intptr_t)data); - const LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); - if ( avatar ) + EBakedTextureIndex index = (EBakedTextureIndex)((intptr_t)data); + if (isAgentAvatarValid()) { - // MULTI-WEARABLE: - return avatar->canGrabLocalTexture(index,0); + return gAgentAvatarp->canGrabBakedTexture(index); } return FALSE; } @@ -7025,7 +7047,7 @@ LLVOAvatar* find_avatar_from_object( const LLUUID& object_id ) void handle_disconnect_viewer(void *) { - LLAppViewer::instance()->forceDisconnect("Testing viewer disconnect"); + LLAppViewer::instance()->forceDisconnect(LLTrans::getString("TestingDisconnect")); } void force_error_breakpoint(void *) @@ -7176,7 +7198,7 @@ void handle_web_browser_test(const LLSD& param) { url = "about:blank"; } - LLWeb::loadURL(url); + LLWeb::loadURLInternal(url); } void handle_buy_currency_test(void*) @@ -7197,12 +7219,11 @@ void handle_buy_currency_test(void*) void handle_rebake_textures(void*) { - LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); - if (!avatar) return; + if (!isAgentAvatarValid()) return; // Slam pending upload count to "unstick" things bool slam_for_debug = true; - avatar->forceBakeAllTextures(slam_for_debug); + gAgentAvatarp->forceBakeAllTextures(slam_for_debug); } void toggle_visibility(void* user_data) @@ -7446,8 +7467,8 @@ class LLEditEnableTakeOff : public view_listener_t bool handleEvent(const LLSD& userdata) { std::string clothing = userdata.asString(); - EWearableType type = LLWearableDictionary::typeNameToType(clothing); - if (type >= WT_SHAPE && type < WT_COUNT) + LLWearableType::EType type = LLWearableType::typeNameToType(clothing); + if (type >= LLWearableType::WT_SHAPE && type < LLWearableType::WT_COUNT) return LLAgentWearables::selfHasWearable(type); return false; } @@ -7462,11 +7483,14 @@ class LLEditTakeOff : public view_listener_t LLWearableBridge::removeAllClothesFromAvatar(); else { - EWearableType type = LLWearableDictionary::typeNameToType(clothing); - if (type >= WT_SHAPE && type < WT_COUNT) + LLWearableType::EType type = LLWearableType::typeNameToType(clothing); + if (type >= LLWearableType::WT_SHAPE + && type < LLWearableType::WT_COUNT + && (gAgentWearables.getWearableCount(type) > 0)) { - // MULTI-WEARABLES - LLViewerInventoryItem *item = dynamic_cast<LLViewerInventoryItem*>(gAgentWearables.getWearableInventoryItem(type,0)); + // MULTI-WEARABLES: assuming user wanted to remove top shirt. + U32 wearable_index = gAgentWearables.getWearableCount(type) - 1; + LLViewerInventoryItem *item = dynamic_cast<LLViewerInventoryItem*>(gAgentWearables.getWearableInventoryItem(type,wearable_index)); LLWearableBridge::removeItemFromAvatar(item); } @@ -7602,6 +7626,60 @@ class LLWorldDayCycle : public view_listener_t } }; +class LLWorldToggleMovementControls : public view_listener_t +{ + bool handleEvent(const LLSD& userdata) + { + LLBottomTray::getInstance()->toggleMovementControls(); + return true; + } +}; + +class LLWorldToggleCameraControls : public view_listener_t +{ + bool handleEvent(const LLSD& userdata) + { + LLBottomTray::getInstance()->toggleCameraControls(); + return true; + } +}; + +class LLUploadCostCalculator : public view_listener_t +{ + std::string mCostStr; + + bool handleEvent(const LLSD& userdata) + { + std::string menu_name = userdata.asString(); + gMenuHolder->childSetLabelArg(menu_name, "[COST]", mCostStr); + + return true; + } + + void calculateCost(); + +public: + LLUploadCostCalculator() + { + calculateCost(); + } +}; + +void LLUploadCostCalculator::calculateCost() +{ + S32 upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(); + + // getPriceUpload() returns -1 if no data available yet. + if(upload_cost >= 0) + { + mCostStr = llformat("%d", upload_cost); + } + else + { + mCostStr = llformat("%d", gSavedSettings.getU32("DefaultUploadCost")); + } +} + void show_navbar_context_menu(LLView* ctrl, S32 x, S32 y) { static LLMenuGL* show_navbar_context_menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_hide_navbar.xml", @@ -7615,6 +7693,55 @@ void show_navbar_context_menu(LLView* ctrl, S32 x, S32 y) LLMenuGL::showPopup(ctrl, show_navbar_context_menu, x, y); } +void show_topinfobar_context_menu(LLView* ctrl, S32 x, S32 y) +{ + static LLMenuGL* show_topbarinfo_context_menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_topinfobar.xml", + gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); + + LLMenuItemGL* landmark_item = show_topbarinfo_context_menu->getChild<LLMenuItemGL>("Landmark"); + if (!LLLandmarkActions::landmarkAlreadyExists()) + { + landmark_item->setLabel(LLTrans::getString("AddLandmarkNavBarMenu")); + } + else + { + landmark_item->setLabel(LLTrans::getString("EditLandmarkNavBarMenu")); + } + + if(gMenuHolder->hasVisibleMenu()) + { + gMenuHolder->hideMenus(); + } + + show_topbarinfo_context_menu->buildDrawLabels(); + show_topbarinfo_context_menu->updateParent(LLMenuGL::sMenuContainer); + LLMenuGL::showPopup(ctrl, show_topbarinfo_context_menu, x, y); +} + +void initialize_edit_menu() +{ + view_listener_t::addMenu(new LLEditUndo(), "Edit.Undo"); + view_listener_t::addMenu(new LLEditRedo(), "Edit.Redo"); + view_listener_t::addMenu(new LLEditCut(), "Edit.Cut"); + view_listener_t::addMenu(new LLEditCopy(), "Edit.Copy"); + view_listener_t::addMenu(new LLEditPaste(), "Edit.Paste"); + view_listener_t::addMenu(new LLEditDelete(), "Edit.Delete"); + view_listener_t::addMenu(new LLEditSelectAll(), "Edit.SelectAll"); + view_listener_t::addMenu(new LLEditDeselect(), "Edit.Deselect"); + view_listener_t::addMenu(new LLEditDuplicate(), "Edit.Duplicate"); + view_listener_t::addMenu(new LLEditTakeOff(), "Edit.TakeOff"); + view_listener_t::addMenu(new LLEditEnableUndo(), "Edit.EnableUndo"); + view_listener_t::addMenu(new LLEditEnableRedo(), "Edit.EnableRedo"); + view_listener_t::addMenu(new LLEditEnableCut(), "Edit.EnableCut"); + view_listener_t::addMenu(new LLEditEnableCopy(), "Edit.EnableCopy"); + view_listener_t::addMenu(new LLEditEnablePaste(), "Edit.EnablePaste"); + view_listener_t::addMenu(new LLEditEnableDelete(), "Edit.EnableDelete"); + view_listener_t::addMenu(new LLEditEnableSelectAll(), "Edit.EnableSelectAll"); + view_listener_t::addMenu(new LLEditEnableDeselect(), "Edit.EnableDeselect"); + view_listener_t::addMenu(new LLEditEnableDuplicate(), "Edit.EnableDuplicate"); + +} + void initialize_menus() { // A parameterized event handler used as ctrl-8/9/0 zoom controls below. @@ -7641,7 +7768,8 @@ void initialize_menus() // Generic enable and visible // Don't prepend MenuName.Foo because these can be used in any menu. enable.add("IsGodCustomerService", boost::bind(&is_god_customer_service)); - enable.add("IsGodCustomerService", boost::bind(&is_god_customer_service)); + + view_listener_t::addEnable(new LLUploadCostCalculator(), "Upload.CalculateCosts"); // Agent commit.add("Agent.toggleFlying", boost::bind(&LLAgent::toggleFlying)); @@ -7650,30 +7778,12 @@ void initialize_menus() // File menu init_menu_file(); - // Edit menu - view_listener_t::addMenu(new LLEditUndo(), "Edit.Undo"); - view_listener_t::addMenu(new LLEditRedo(), "Edit.Redo"); - view_listener_t::addMenu(new LLEditCut(), "Edit.Cut"); - view_listener_t::addMenu(new LLEditCopy(), "Edit.Copy"); - view_listener_t::addMenu(new LLEditPaste(), "Edit.Paste"); - view_listener_t::addMenu(new LLEditDelete(), "Edit.Delete"); - view_listener_t::addMenu(new LLEditSelectAll(), "Edit.SelectAll"); - view_listener_t::addMenu(new LLEditDeselect(), "Edit.Deselect"); - view_listener_t::addMenu(new LLEditDuplicate(), "Edit.Duplicate"); - view_listener_t::addMenu(new LLEditTakeOff(), "Edit.TakeOff"); - - view_listener_t::addMenu(new LLEditEnableUndo(), "Edit.EnableUndo"); - view_listener_t::addMenu(new LLEditEnableRedo(), "Edit.EnableRedo"); - view_listener_t::addMenu(new LLEditEnableCut(), "Edit.EnableCut"); - view_listener_t::addMenu(new LLEditEnableCopy(), "Edit.EnableCopy"); - view_listener_t::addMenu(new LLEditEnablePaste(), "Edit.EnablePaste"); - view_listener_t::addMenu(new LLEditEnableDelete(), "Edit.EnableDelete"); - view_listener_t::addMenu(new LLEditEnableSelectAll(), "Edit.EnableSelectAll"); - view_listener_t::addMenu(new LLEditEnableDeselect(), "Edit.EnableDeselect"); - view_listener_t::addMenu(new LLEditEnableDuplicate(), "Edit.EnableDuplicate"); view_listener_t::addMenu(new LLEditEnableTakeOff(), "Edit.EnableTakeOff"); view_listener_t::addMenu(new LLEditEnableCustomizeAvatar(), "Edit.EnableCustomizeAvatar"); + view_listener_t::addMenu(new LLEnableEditShape(), "Edit.EnableEditShape"); commit.add("CustomizeAvatar", boost::bind(&handle_customize_avatar)); + commit.add("EditOutfit", boost::bind(&handle_edit_outfit)); + commit.add("EditShape", boost::bind(&handle_edit_shape)); // View menu view_listener_t::addMenu(new LLViewMouselook(), "View.Mouselook"); @@ -7687,7 +7797,6 @@ void initialize_menus() view_listener_t::addMenu(new LLZoomer(1.2f), "View.ZoomOut"); view_listener_t::addMenu(new LLZoomer(1/1.2f), "View.ZoomIn"); view_listener_t::addMenu(new LLZoomer(DEFAULT_FIELD_OF_VIEW, false), "View.ZoomDefault"); - view_listener_t::addMenu(new LLViewFullscreen(), "View.Fullscreen"); view_listener_t::addMenu(new LLViewDefaultUISize(), "View.DefaultUISize"); view_listener_t::addMenu(new LLViewEnableMouselook(), "View.EnableMouselook"); @@ -7704,6 +7813,7 @@ void initialize_menus() commit.add("World.Chat", boost::bind(&handle_chat, (void*)NULL)); view_listener_t::addMenu(new LLWorldAlwaysRun(), "World.AlwaysRun"); view_listener_t::addMenu(new LLWorldCreateLandmark(), "World.CreateLandmark"); + view_listener_t::addMenu(new LLWorldPlaceProfile(), "World.PlaceProfile"); view_listener_t::addMenu(new LLWorldSetHomeLocation(), "World.SetHomeLocation"); view_listener_t::addMenu(new LLWorldTeleportHome(), "World.TeleportHome"); view_listener_t::addMenu(new LLWorldSetAway(), "World.SetAway"); @@ -7721,6 +7831,9 @@ void initialize_menus() view_listener_t::addMenu(new LLWorldPostProcess(), "World.PostProcess"); view_listener_t::addMenu(new LLWorldDayCycle(), "World.DayCycle"); + view_listener_t::addMenu(new LLWorldToggleMovementControls(), "World.Toggle.MovementControls"); + view_listener_t::addMenu(new LLWorldToggleCameraControls(), "World.Toggle.CameraControls"); + // Tools menu view_listener_t::addMenu(new LLToolsSelectTool(), "Tools.SelectTool"); view_listener_t::addMenu(new LLToolsSelectOnlyMyObjects(), "Tools.SelectOnlyMyObjects"); @@ -7750,12 +7863,11 @@ void initialize_menus() view_listener_t::addMenu(new LLToolsEnableUnlink(), "Tools.EnableUnlink"); view_listener_t::addMenu(new LLToolsEnableBuyOrTake(), "Tools.EnableBuyOrTake"); enable.add("Tools.EnableTakeCopy", boost::bind(&enable_object_take_copy)); + enable.add("Tools.VisibleBuyObject", boost::bind(&tools_visible_buy_object)); + enable.add("Tools.VisibleTakeObject", boost::bind(&tools_visible_take_object)); view_listener_t::addMenu(new LLToolsEnableSaveToInventory(), "Tools.EnableSaveToInventory"); view_listener_t::addMenu(new LLToolsEnableSaveToObjectInventory(), "Tools.EnableSaveToObjectInventory"); - /*view_listener_t::addMenu(new LLToolsVisibleBuyObject(), "Tools.VisibleBuyObject"); - view_listener_t::addMenu(new LLToolsVisibleTakeObject(), "Tools.VisibleTakeObject");*/ - // Help menu // most items use the ShowFloater method @@ -7950,7 +8062,6 @@ void initialize_menus() view_listener_t::addMenu(new LLAvatarEnableAddFriend(), "Avatar.EnableAddFriend"); enable.add("Avatar.EnableFreezeEject", boost::bind(&enable_freeze_eject, _2)); - enable.add("Avatar.EnableFreezeEject", boost::bind(&enable_freeze_eject, _2)); // Object pie menu view_listener_t::addMenu(new LLObjectBuild(), "Object.Build"); @@ -7972,12 +8083,14 @@ void initialize_menus() commit.add("Object.Open", boost::bind(&handle_object_open)); commit.add("Object.Take", boost::bind(&handle_take)); enable.add("Object.EnableOpen", boost::bind(&enable_object_open)); - enable.add("Object.EnableTouch", boost::bind(&enable_object_touch)); view_listener_t::addMenu(new LLObjectEnableTouch(), "Object.EnableTouch"); view_listener_t::addMenu(new LLObjectEnableSitOrStand(), "Object.EnableSitOrStand"); enable.add("Object.EnableDelete", boost::bind(&enable_object_delete)); enable.add("Object.EnableWear", boost::bind(&object_selected_and_point_valid)); + enable.add("Object.StandUpVisible", boost::bind(&visible_object_stand_up)); + enable.add("Object.SitVisible", boost::bind(&visible_object_sit)); + view_listener_t::addMenu(new LLObjectEnableReturn(), "Object.EnableReturn"); view_listener_t::addMenu(new LLObjectEnableReportAbuse(), "Object.EnableReportAbuse"); @@ -8022,6 +8135,7 @@ void initialize_menus() view_listener_t::addMenu(new LLFloaterVisible(), "FloaterVisible"); view_listener_t::addMenu(new LLShowSidetrayPanel(), "ShowSidetrayPanel"); + view_listener_t::addMenu(new LLSidetrayPanelVisible(), "SidetrayPanelVisible"); view_listener_t::addMenu(new LLSomethingSelected(), "SomethingSelected"); view_listener_t::addMenu(new LLSomethingSelectedNoHUD(), "SomethingSelectedNoHUD"); view_listener_t::addMenu(new LLEditableSelected(), "EditableSelected"); diff --git a/indra/newview/llviewermenu.h b/indra/newview/llviewermenu.h index d3c34f0de4..e0497139a5 100644 --- a/indra/newview/llviewermenu.h +++ b/indra/newview/llviewermenu.h @@ -44,6 +44,7 @@ class LLParcelSelection; class LLObjectSelection; class LLSelectNode; +void initialize_edit_menu(); void init_menus(); void cleanup_menus(); @@ -52,6 +53,7 @@ void toggle_debug_menus(void*); void show_context_menu( S32 x, S32 y, MASK mask ); void show_build_mode_context_menu(S32 x, S32 y, MASK mask); void show_navbar_context_menu(LLView* ctrl, S32 x, S32 y); +void show_topinfobar_context_menu(LLView* ctrl, S32 x, S32 y); BOOL enable_save_into_inventory(void*); void handle_reset_view(); void handle_cut(void*); @@ -157,6 +159,7 @@ extern const std::string SAVE_INTO_INVENTORY; extern LLMenuBarGL* gMenuBarView; //extern LLView* gMenuBarHolder; +extern LLMenuGL* gEditMenu; extern LLMenuGL* gPopupMenuView; extern LLViewerMenuHolderGL* gMenuHolder; extern LLMenuBarGL* gLoginMenuBarView; diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp index 6bad8843fd..f741e1bc10 100644 --- a/indra/newview/llviewermenufile.cpp +++ b/indra/newview/llviewermenufile.cpp @@ -36,9 +36,10 @@ // project includes #include "llagent.h" +#include "llagentcamera.h" #include "llfilepicker.h" #include "llfloaterreg.h" -#include "llfloaterbuycurrency.h" +#include "llbuycurrencyhtml.h" #include "llfloatersnapshot.h" #include "llimage.h" #include "llimagebmp.h" @@ -140,9 +141,9 @@ std::string build_extensions_string(LLFilePicker::ELoadFilter filter) **/ const std::string upload_pick(void* data) { - if( gAgent.cameraMouselook() ) + if( gAgentCamera.cameraMouselook() ) { - gAgent.changeCameraToDefault(); + gAgentCamera.changeCameraToDefault(); // This doesn't seem necessary. JC // display(); } @@ -289,9 +290,9 @@ class LLFileUploadBulk : public view_listener_t { bool handleEvent(const LLSD& userdata) { - if( gAgent.cameraMouselook() ) + if( gAgentCamera.cameraMouselook() ) { - gAgent.changeCameraToDefault(); + gAgentCamera.changeCameraToDefault(); } // TODO: @@ -411,7 +412,6 @@ class LLFileTakeSnapshotToDisk : public view_listener_t { gViewerWindow->playSnapshotAnimAndSound(); - LLImageBase::setSizeOverride(TRUE); LLPointer<LLImageFormatted> formatted; switch(LLFloaterSnapshot::ESnapshotFormat(gSavedSettings.getS32("SnapshotFormat"))) { @@ -426,12 +426,12 @@ class LLFileTakeSnapshotToDisk : public view_listener_t break; default: llwarns << "Unknown Local Snapshot format" << llendl; - LLImageBase::setSizeOverride(FALSE); return true; } + formatted->enableOverSize() ; formatted->encode(raw, 0); - LLImageBase::setSizeOverride(FALSE); + formatted->disableOverSize() ; gViewerWindow->saveImageNumbered(formatted); } return true; @@ -796,84 +796,88 @@ void upload_done_callback(const LLUUID& uuid, void* user_data, S32 result, LLExt //LLAssetType::EType pref_loc = data->mPreferredLocation; BOOL is_balance_sufficient = TRUE; - if(result >= 0) + if(data) { - LLFolderType::EType dest_loc = (data->mPreferredLocation == LLFolderType::FT_NONE) ? LLFolderType::assetTypeToFolderType(data->mAssetInfo.mType) : data->mPreferredLocation; - - if (LLAssetType::AT_SOUND == data->mAssetInfo.mType || - LLAssetType::AT_TEXTURE == data->mAssetInfo.mType || - LLAssetType::AT_ANIMATION == data->mAssetInfo.mType) + if (result >= 0) { - // Charge the user for the upload. - LLViewerRegion* region = gAgent.getRegion(); - - if(!(can_afford_transaction(expected_upload_cost))) - { - LLFloaterBuyCurrency::buyCurrency( - llformat(LLTrans::getString("UploadingCosts").c_str(), - data->mAssetInfo.getName().c_str()), - expected_upload_cost); - is_balance_sufficient = FALSE; - } - else if(region) + LLFolderType::EType dest_loc = (data->mPreferredLocation == LLFolderType::FT_NONE) ? LLFolderType::assetTypeToFolderType(data->mAssetInfo.mType) : data->mPreferredLocation; + + if (LLAssetType::AT_SOUND == data->mAssetInfo.mType || + LLAssetType::AT_TEXTURE == data->mAssetInfo.mType || + LLAssetType::AT_ANIMATION == data->mAssetInfo.mType) { - // Charge user for upload - gStatusBar->debitBalance(expected_upload_cost); + // Charge the user for the upload. + LLViewerRegion* region = gAgent.getRegion(); - LLMessageSystem* msg = gMessageSystem; - msg->newMessageFast(_PREHASH_MoneyTransferRequest); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - msg->nextBlockFast(_PREHASH_MoneyData); - msg->addUUIDFast(_PREHASH_SourceID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_DestID, LLUUID::null); - msg->addU8("Flags", 0); - // we tell the sim how much we were expecting to pay so it - // can respond to any discrepancy - msg->addS32Fast(_PREHASH_Amount, expected_upload_cost); - msg->addU8Fast(_PREHASH_AggregatePermNextOwner, (U8)LLAggregatePermissions::AP_EMPTY); - msg->addU8Fast(_PREHASH_AggregatePermInventory, (U8)LLAggregatePermissions::AP_EMPTY); - msg->addS32Fast(_PREHASH_TransactionType, TRANS_UPLOAD_CHARGE); - msg->addStringFast(_PREHASH_Description, NULL); - msg->sendReliable(region->getHost()); + if(!(can_afford_transaction(expected_upload_cost))) + { + LLStringUtil::format_map_t args; + args["NAME"] = data->mAssetInfo.getName(); + args["AMOUNT"] = llformat("%d", expected_upload_cost); + LLBuyCurrencyHTML::openCurrencyFloater( LLTrans::getString("UploadingCosts", args), expected_upload_cost ); + is_balance_sufficient = FALSE; + } + else if(region) + { + // Charge user for upload + gStatusBar->debitBalance(expected_upload_cost); + + LLMessageSystem* msg = gMessageSystem; + msg->newMessageFast(_PREHASH_MoneyTransferRequest); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + msg->nextBlockFast(_PREHASH_MoneyData); + msg->addUUIDFast(_PREHASH_SourceID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_DestID, LLUUID::null); + msg->addU8("Flags", 0); + // we tell the sim how much we were expecting to pay so it + // can respond to any discrepancy + msg->addS32Fast(_PREHASH_Amount, expected_upload_cost); + msg->addU8Fast(_PREHASH_AggregatePermNextOwner, (U8)LLAggregatePermissions::AP_EMPTY); + msg->addU8Fast(_PREHASH_AggregatePermInventory, (U8)LLAggregatePermissions::AP_EMPTY); + msg->addS32Fast(_PREHASH_TransactionType, TRANS_UPLOAD_CHARGE); + msg->addStringFast(_PREHASH_Description, NULL); + msg->sendReliable(region->getHost()); + } } - } - if(is_balance_sufficient) - { - // Actually add the upload to inventory - llinfos << "Adding " << uuid << " to inventory." << llendl; - const LLUUID folder_id = gInventory.findCategoryUUIDForType(dest_loc); - if(folder_id.notNull()) + if(is_balance_sufficient) { - U32 next_owner_perms = data->mNextOwnerPerm; - if(PERM_NONE == next_owner_perms) + // Actually add the upload to inventory + llinfos << "Adding " << uuid << " to inventory." << llendl; + const LLUUID folder_id = gInventory.findCategoryUUIDForType(dest_loc); + if(folder_id.notNull()) { - next_owner_perms = PERM_MOVE | PERM_TRANSFER; + U32 next_owner_perms = data->mNextOwnerPerm; + if(PERM_NONE == next_owner_perms) + { + next_owner_perms = PERM_MOVE | PERM_TRANSFER; + } + create_inventory_item(gAgent.getID(), gAgent.getSessionID(), + folder_id, data->mAssetInfo.mTransactionID, data->mAssetInfo.getName(), + data->mAssetInfo.getDescription(), data->mAssetInfo.mType, + data->mInventoryType, NOT_WEARABLE, next_owner_perms, + LLPointer<LLInventoryCallback>(NULL)); + } + else + { + llwarns << "Can't find a folder to put it in" << llendl; } - create_inventory_item(gAgent.getID(), gAgent.getSessionID(), - folder_id, data->mAssetInfo.mTransactionID, data->mAssetInfo.getName(), - data->mAssetInfo.getDescription(), data->mAssetInfo.mType, - data->mInventoryType, NOT_WEARABLE, next_owner_perms, - LLPointer<LLInventoryCallback>(NULL)); - } - else - { - llwarns << "Can't find a folder to put it in" << llendl; } } - } - else // if(result >= 0) - { - LLSD args; - args["FILE"] = LLInventoryType::lookupHumanReadable(data->mInventoryType); - args["REASON"] = std::string(LLAssetStorage::getErrorString(result)); - LLNotificationsUtil::add("CannotUploadReason", args); + else // if(result >= 0) + { + LLSD args; + args["FILE"] = LLInventoryType::lookupHumanReadable(data->mInventoryType); + args["REASON"] = std::string(LLAssetStorage::getErrorString(result)); + LLNotificationsUtil::add("CannotUploadReason", args); + } } LLUploadDialog::modalUploadFinished(); delete data; + data = NULL; // *NOTE: This is a pretty big hack. What this does is check the // file picker if there are any more pending uploads. If so, @@ -996,8 +1000,11 @@ void upload_new_resource(const LLTransactionID &tid, LLAssetType::EType asset_ty S32 balance = gStatusBar->getBalance(); if (balance < expected_upload_cost) { + LLStringUtil::format_map_t args; + args["NAME"] = name; + args["AMOUNT"] = llformat("%d", expected_upload_cost); // insufficient funds, bail on this upload - LLFloaterBuyCurrency::buyCurrency("Uploading costs", expected_upload_cost); + LLBuyCurrencyHTML::openCurrencyFloater( LLTrans::getString("UploadingCosts", args), expected_upload_cost ); return; } } diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 143d95d27e..bf4eb6ec33 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -32,14 +32,17 @@ #include "llviewerprecompiledheaders.h" #include "llviewermessage.h" +#include "boost/lexical_cast.hpp" #include "llanimationstates.h" #include "llaudioengine.h" #include "llavataractions.h" #include "lscript_byteformat.h" #include "lleconomy.h" +#include "lleventtimer.h" #include "llfloaterreg.h" #include "llfollowcamparams.h" +#include "llinventorydefines.h" #include "llregionhandle.h" #include "llsdserialize.h" #include "llteleportflags.h" @@ -50,9 +53,9 @@ #include "mean_collision_data.h" #include "llagent.h" +#include "llagentcamera.h" #include "llcallingcard.h" -//#include "llfirstuse.h" -#include "llfloaterbuycurrency.h" +#include "llbuycurrencyhtml.h" #include "llfloaterbuyland.h" #include "llfloaterland.h" #include "llfloaterregioninfo.h" @@ -61,13 +64,13 @@ #include "llfloaterpreference.h" #include "llhudeffecttrail.h" #include "llhudmanager.h" +#include "llinventoryfunctions.h" #include "llinventoryobserver.h" #include "llinventorypanel.h" #include "llnearbychat.h" #include "llnotifications.h" #include "llnotificationsutil.h" #include "llpanelgrouplandmoney.h" -#include "llpanelplaces.h" #include "llrecentpeople.h" #include "llscriptfloater.h" #include "llselectmgr.h" @@ -104,13 +107,15 @@ #include "llpanelplaceprofile.h" #include <boost/algorithm/string/split.hpp> // - -#if LL_WINDOWS // For Windows specific error handler -#include "llwindebug.h" // For the invalid message handler -#endif +#include <boost/regex.hpp> #include "llnotificationmanager.h" // +#if LL_MSVC +// disable boost::lexical_cast warning +#pragma warning (disable:4702) +#endif + // // Constants // @@ -192,9 +197,21 @@ bool friendship_offer_callback(const LLSD& notification, const LLSD& response) msg->nextBlockFast(_PREHASH_FolderData); msg->addUUIDFast(_PREHASH_FolderID, fid); msg->sendReliable(LLHost(payload["sender"].asString())); + + LLSD payload = notification["payload"]; + payload["SUPPRESS_TOAST"] = true; + LLNotificationsUtil::add("FriendshipAcceptedByMe", + notification["substitutions"], payload); break; } case 1: // Decline + { + LLSD payload = notification["payload"]; + payload["SUPPRESS_TOAST"] = true; + LLNotificationsUtil::add("FriendshipDeclinedByMe", + notification["substitutions"], payload); + } + // fall-through case 2: // Send IM - decline and start IM session { // decline @@ -259,7 +276,9 @@ void give_money(const LLUUID& uuid, LLViewerRegion* region, S32 amount, BOOL is_ } else { - LLFloaterBuyCurrency::buyCurrency("Giving", amount); + LLStringUtil::format_map_t args; + args["AMOUNT"] = llformat("%d", amount); + LLBuyCurrencyHTML::openCurrencyFloater( LLTrans::getString("giving", args), amount ); } } @@ -673,6 +692,52 @@ bool join_group_response(const LLSD& notification, const LLSD& response) return false; } + +static void highlight_inventory_items_in_panel(const std::vector<LLUUID>& items, LLInventoryPanel *inventory_panel) +{ + if (NULL == inventory_panel) return; + + for (std::vector<LLUUID>::const_iterator item_iter = items.begin(); + item_iter != items.end(); + ++item_iter) + { + const LLUUID& item_id = (*item_iter); + if(!highlight_offered_object(item_id)) + { + continue; + } + + LLInventoryItem* item = gInventory.getItem(item_id); + llassert(item); + if (!item) { + continue; + } + + LL_DEBUGS("Inventory_Move") << "Highlighting inventory item: " << item->getName() << ", " << item_id << LL_ENDL; + LLFolderView* fv = inventory_panel->getRootFolder(); + if (fv) + { + LLFolderViewItem* fv_item = fv->getItemByID(item_id); + if (fv_item) + { + LLFolderViewItem* fv_folder = fv_item->getParentFolder(); + if (fv_folder) + { + // Parent folders can be different in case of 2 consecutive drag and drop + // operations when the second one is started before the first one completes. + LL_DEBUGS("Inventory_Move") << "Open folder: " << fv_folder->getName() << LL_ENDL; + fv_folder->setOpen(TRUE); + if (fv_folder->isSelected()) + { + fv->changeSelection(fv_folder, FALSE); + } + } + fv->changeSelection(fv_item, TRUE); + } + } + } +} + static LLNotificationFunctorRegistration jgr_1("JoinGroup", join_group_response); static LLNotificationFunctorRegistration jgr_2("JoinedTooManyGroupsMember", join_group_response); static LLNotificationFunctorRegistration jgr_3("JoinGroupCanAfford", join_group_response); @@ -681,10 +746,25 @@ static LLNotificationFunctorRegistration jgr_3("JoinGroupCanAfford", join_group_ //----------------------------------------------------------------------------- // Instant Message //----------------------------------------------------------------------------- -class LLOpenAgentOffer : public LLInventoryFetchObserver +class LLOpenAgentOffer : public LLInventoryFetchItemsObserver { public: - LLOpenAgentOffer(const std::string& from_name) : mFromName(from_name) {} + LLOpenAgentOffer(const LLUUID& object_id, + const std::string& from_name) : + LLInventoryFetchItemsObserver(object_id), + mFromName(from_name) {} + /*virtual*/ void startFetch() + { + for (uuid_vec_t::const_iterator it = mIDs.begin(); it < mIDs.end(); ++it) + { + LLViewerInventoryCategory* cat = gInventory.getCategory(*it); + if (cat) + { + mComplete.push_back((*it)); + } + } + LLInventoryFetchItemsObserver::startFetch(); + } /*virtual*/ void done() { open_inventory_offer(mComplete, mFromName); @@ -695,6 +775,110 @@ private: std::string mFromName; }; +/** + * Class to observe adding of new items moved from the world to user's inventory to select them in inventory. + * + * We can't create it each time items are moved because "drop" event is sent separately for each + * element even while multi-dragging. We have to have the only instance of the observer. See EXT-4347. + */ +class LLViewerInventoryMoveFromWorldObserver : public LLInventoryAddItemByAssetObserver +{ +public: + LLViewerInventoryMoveFromWorldObserver() + : LLInventoryAddItemByAssetObserver() + , mActivePanel(NULL) + { + + } + + void setMoveIntoFolderID(const LLUUID& into_folder_uuid) {mMoveIntoFolderID = into_folder_uuid; } + +private: + /*virtual */void onAssetAdded(const LLUUID& asset_id) + { + // Store active Inventory panel. + mActivePanel = LLInventoryPanel::getActiveInventoryPanel(); + + // Store selected items (without destination folder) + mSelectedItems.clear(); + if (mActivePanel) + { + mSelectedItems = mActivePanel->getRootFolder()->getSelectionList(); + } + mSelectedItems.erase(mMoveIntoFolderID); + } + + /** + * Selects added inventory items watched by their Asset UUIDs if selection was not changed since + * all items were started to watch (dropped into a folder). + */ + void done() + { + // if selection is not changed since watch started lets hightlight new items. + if (mActivePanel && !isSelectionChanged()) + { + LL_DEBUGS("Inventory_Move") << "Selecting new items..." << LL_ENDL; + mActivePanel->clearSelection(); + highlight_inventory_items_in_panel(mAddedItems, mActivePanel); + } + } + + /** + * Returns true if selected inventory items were changed since moved inventory items were started to watch. + */ + bool isSelectionChanged() + { + const LLInventoryPanel * const current_active_panel = LLInventoryPanel::getActiveInventoryPanel(); + + if (NULL == mActivePanel || current_active_panel != mActivePanel) + { + return true; + } + + // get selected items (without destination folder) + selected_items_t selected_items = mActivePanel->getRootFolder()->getSelectionList(); + selected_items.erase(mMoveIntoFolderID); + + // compare stored & current sets of selected items + selected_items_t different_items; + std::set_symmetric_difference(mSelectedItems.begin(), mSelectedItems.end(), + selected_items.begin(), selected_items.end(), std::inserter(different_items, different_items.begin())); + + LL_DEBUGS("Inventory_Move") << "Selected firstly: " << mSelectedItems.size() + << ", now: " << selected_items.size() << ", difference: " << different_items.size() << LL_ENDL; + + return different_items.size() > 0; + } + + LLInventoryPanel *mActivePanel; + typedef std::set<LLUUID> selected_items_t; + selected_items_t mSelectedItems; + + /** + * UUID of FolderViewFolder into which watched items are moved. + * + * Destination FolderViewFolder becomes selected while mouse hovering (when dragged items are dropped). + * + * If mouse is moved out it set unselected and number of selected items is changed + * even if selected items in Inventory stay the same. + * So, it is used to update stored selection list. + * + * @see onAssetAdded() + * @see isSelectionChanged() + */ + LLUUID mMoveIntoFolderID; +}; + +LLViewerInventoryMoveFromWorldObserver* gInventoryMoveObserver = NULL; + +void set_dad_inventory_item(LLInventoryItem* inv_item, const LLUUID& into_folder_uuid) +{ + start_new_inventory_observer(); + + gInventoryMoveObserver->setMoveIntoFolderID(into_folder_uuid); + gInventoryMoveObserver->watchAsset(inv_item->getAssetUUID()); +} + //unlike the FetchObserver for AgentOffer, we only make one //instance of the AddedObserver for TaskOffers //and it never dies. We do this because we don't know the UUID of @@ -705,6 +889,33 @@ class LLOpenTaskOffer : public LLInventoryAddedObserver protected: /*virtual*/ void done() { + for (uuid_vec_t::iterator it = mAdded.begin(); it != mAdded.end();) + { + const LLUUID& item_uuid = *it; + bool was_moved = false; + LLInventoryObject* added_object = gInventory.getObject(item_uuid); + if (added_object) + { + // cast to item to get Asset UUID + LLInventoryItem* added_item = dynamic_cast<LLInventoryItem*>(added_object); + if (added_item) + { + const LLUUID& asset_uuid = added_item->getAssetUUID(); + if (gInventoryMoveObserver->isAssetWatched(asset_uuid)) + { + LL_DEBUGS("Inventory_Move") << "Found asset UUID: " << asset_uuid << LL_ENDL; + was_moved = true; + } + } + } + + if (was_moved) + { + it = mAdded.erase(it); + } + else ++it; + } + open_inventory_offer(mAdded, ""); mAdded.clear(); } @@ -733,13 +944,21 @@ void start_new_inventory_observer() gNewInventoryObserver = new LLOpenTaskOffer; gInventory.addObserver(gNewInventoryObserver); } + + if (!gInventoryMoveObserver) //inventory move from the world observer + { + // Observer is deleted by gInventory + gInventoryMoveObserver = new LLViewerInventoryMoveFromWorldObserver; + gInventory.addObserver(gInventoryMoveObserver); + } } -class LLDiscardAgentOffer : public LLInventoryFetchComboObserver +class LLDiscardAgentOffer : public LLInventoryFetchItemsObserver { LOG_CLASS(LLDiscardAgentOffer); public: LLDiscardAgentOffer(const LLUUID& folder_id, const LLUUID& object_id) : + LLInventoryFetchItemsObserver(object_id), mFolderID(folder_id), mObjectID(object_id) {} virtual ~LLDiscardAgentOffer() {} @@ -822,21 +1041,26 @@ bool check_offer_throttle(const std::string& from_name, bool check_only) { // Use the name of the last item giver, who is probably the person // spamming you. - std::ostringstream message; - message << LLAppViewer::instance()->getSecondLifeTitle(); + + LLStringUtil::format_map_t arg; + std::string log_msg; + std::ostringstream time ; + time<<OFFER_THROTTLE_TIME; + + arg["APP_NAME"] = LLAppViewer::instance()->getSecondLifeTitle(); + arg["TIME"] = time.str(); + if (!from_name.empty()) { - message << ": Items coming in too fast from " << from_name; + arg["FROM_NAME"] = from_name; + log_msg = LLTrans::getString("ItemsComingInTooFastFrom", arg); } else { - message << ": Items coming in too fast"; + log_msg = LLTrans::getString("ItemsComingInTooFast", arg); } - message << ", automatic preview disabled for " - << OFFER_THROTTLE_TIME << " seconds."; //this is kinda important, so actually put it on screen - std::string log_msg = message.str(); LLSD args; args["MESSAGE"] = log_msg; LLNotificationsUtil::add("SystemMessage", args); @@ -853,125 +1077,119 @@ bool check_offer_throttle(const std::string& from_name, bool check_only) } } -void open_inventory_offer(const std::vector<LLUUID>& items, const std::string& from_name) +void open_inventory_offer(const uuid_vec_t& objects, const std::string& from_name) { - for (std::vector<LLUUID>::const_iterator item_iter = items.begin(); - item_iter != items.end(); - ++item_iter) + for (uuid_vec_t::const_iterator obj_iter = objects.begin(); + obj_iter != objects.end(); + ++obj_iter) { - const LLUUID& item_id = (*item_iter); - if(!highlight_offered_item(item_id)) + const LLUUID& obj_id = (*obj_iter); + if(!highlight_offered_object(obj_id)) { continue; } - LLInventoryItem* item = gInventory.getItem(item_id); + const LLInventoryObject *obj = gInventory.getObject(obj_id); + if (!obj) + { + llwarns << "Cannot find object [ itemID:" << obj_id << " ] to open." << llendl; + continue; + } - //////////////////////////////////////////////////////////////////////////////// - // Special handling for various types. - const LLAssetType::EType asset_type = item->getType(); - if (check_offer_throttle(from_name, false)) // If we are throttled, don't display - { - LL_DEBUGS("Messaging") << "Highlighting inventory item: " << item->getUUID() << LL_ENDL; - // If we opened this ourselves, focus it - const BOOL take_focus = from_name.empty() ? TAKE_FOCUS_YES : TAKE_FOCUS_NO; - switch(asset_type) + const LLAssetType::EType asset_type = obj->getActualType(); + + // Either an inventory item or a category. + const LLInventoryItem* item = dynamic_cast<const LLInventoryItem*>(obj); + if (item) + { + //////////////////////////////////////////////////////////////////////////////// + // Special handling for various types. + if (check_offer_throttle(from_name, false)) // If we are throttled, don't display { - case LLAssetType::AT_NOTECARD: - { - LLFloaterReg::showInstance("preview_notecard", LLSD(item_id), take_focus); - break; - } - case LLAssetType::AT_LANDMARK: - { - LLInventoryCategory* parent_folder = gInventory.getCategory(item->getParentUUID()); - if ("inventory_handler" == from_name) - { - //we have to filter inventory_handler messages to avoid notification displaying - LLSideTray::getInstance()->showPanel("panel_places", - LLSD().with("type", "landmark").with("id", item->getUUID())); - } - else if("group_offer" == from_name) + LL_DEBUGS("Messaging") << "Highlighting inventory item: " << item->getUUID() << LL_ENDL; + // If we opened this ourselves, focus it + const BOOL take_focus = from_name.empty() ? TAKE_FOCUS_YES : TAKE_FOCUS_NO; + switch(asset_type) + { + case LLAssetType::AT_NOTECARD: { - // do not open inventory when we open group notice attachment because - // we already opened landmark info panel - // "group_offer" is passed by LLOpenTaskGroupOffer - - continue; + LLFloaterReg::showInstance("preview_notecard", LLSD(obj_id), take_focus); + break; } - else if(from_name.empty()) + case LLAssetType::AT_LANDMARK: { - // we receive a message from LLOpenTaskOffer, it mean that new landmark has been added. - LLSD args; - args["LANDMARK_NAME"] = item->getName(); - args["FOLDER_NAME"] = std::string(parent_folder ? parent_folder->getName() : "unknown"); - LLNotificationsUtil::add("LandmarkCreated", args); - // Created landmark is passed to Places panel to allow its editing. In fact panel should be already displayed. - // If the panel is closed we don't reopen it until created landmark is loaded. - //TODO*:: dserduk(7/12/09) remove LLPanelPlaces dependency from here - LLPanelPlaces *places_panel = dynamic_cast<LLPanelPlaces*>(LLSideTray::getInstance()->getPanel("panel_places")); - if (places_panel) + LLInventoryCategory* parent_folder = gInventory.getCategory(item->getParentUUID()); + if ("inventory_handler" == from_name) { - // Landmark creation handling is moved to LLPanelPlaces::showAddedLandmarkInfo() - // TODO* LLPanelPlaces dependency is going to be removed. See EXT-4347. - if("create_landmark" == places_panel->getPlaceInfoType() && !places_panel->getItem()) - { - //places_panel->setItem(item); - } - // we are opening a group notice attachment - else - { - LLSD args; - args["type"] = "landmark"; - args["id"] = item_id; - LLSideTray::getInstance()->showPanel("panel_places", args); - } + //we have to filter inventory_handler messages to avoid notification displaying + LLSideTray::getInstance()->showPanel("panel_places", + LLSD().with("type", "landmark").with("id", item->getUUID())); + } + else if("group_offer" == from_name) + { + // "group_offer" is passed by LLOpenTaskGroupOffer + // Notification about added landmark will be generated under the "from_name.empty()" called from LLOpenTaskOffer::done(). + LLSD args; + args["type"] = "landmark"; + args["id"] = obj_id; + LLSideTray::getInstance()->showPanel("panel_places", args); + + continue; + } + else if(from_name.empty()) + { + // we receive a message from LLOpenTaskOffer, it mean that new landmark has been added. + LLSD args; + args["LANDMARK_NAME"] = item->getName(); + args["FOLDER_NAME"] = std::string(parent_folder ? parent_folder->getName() : "unknown"); + LLNotificationsUtil::add("LandmarkCreated", args); } } + break; + case LLAssetType::AT_TEXTURE: + { + LLFloaterReg::showInstance("preview_texture", LLSD(obj_id), take_focus); + break; + } + case LLAssetType::AT_ANIMATION: + LLFloaterReg::showInstance("preview_anim", LLSD(obj_id), take_focus); + break; + case LLAssetType::AT_SCRIPT: + LLFloaterReg::showInstance("preview_script", LLSD(obj_id), take_focus); + break; + case LLAssetType::AT_SOUND: + LLFloaterReg::showInstance("preview_sound", LLSD(obj_id), take_focus); + break; + default: + break; } - break; - case LLAssetType::AT_TEXTURE: - { - LLFloaterReg::showInstance("preview_texture", LLSD(item_id), take_focus); - break; - } - case LLAssetType::AT_ANIMATION: - LLFloaterReg::showInstance("preview_anim", LLSD(item_id), take_focus); - break; - case LLAssetType::AT_SCRIPT: - LLFloaterReg::showInstance("preview_script", LLSD(item_id), take_focus); - break; - case LLAssetType::AT_SOUND: - LLFloaterReg::showInstance("preview_sound", LLSD(item_id), take_focus); - break; - default: - break; } } - + //////////////////////////////////////////////////////////////////////////////// // Highlight item if it's not in the trash, lost+found, or COF - const BOOL auto_open = gSavedSettings.getBOOL("ShowInInventory") && + const BOOL auto_open = + gSavedSettings.getBOOL("ShowInInventory") && (asset_type != LLAssetType::AT_CALLINGCARD) && - (item->getInventoryType() != LLInventoryType::IT_ATTACHMENT) && + !(item && item->getInventoryType() != LLInventoryType::IT_ATTACHMENT) && !from_name.empty(); LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel(auto_open); if(active_panel) { - LL_DEBUGS("Messaging") << "Highlighting" << item_id << LL_ENDL; + LL_DEBUGS("Messaging") << "Highlighting" << obj_id << LL_ENDL; LLFocusableElement* focus_ctrl = gFocusMgr.getKeyboardFocus(); - active_panel->setSelection(item_id, TAKE_FOCUS_NO); + active_panel->setSelection(obj_id, TAKE_FOCUS_NO); gFocusMgr.setKeyboardFocus(focus_ctrl); } } } -bool highlight_offered_item(const LLUUID& item_id) +bool highlight_offered_object(const LLUUID& obj_id) { - LLInventoryItem* item = gInventory.getItem(item_id); - if(!item) + const LLInventoryObject* obj = gInventory.getObject(obj_id); + if(!obj) { - LL_WARNS("Messaging") << "Unable to show inventory item: " << item_id << LL_ENDL; + LL_WARNS("Messaging") << "Unable to show inventory item: " << obj_id << LL_ENDL; return false; } @@ -980,7 +1198,7 @@ bool highlight_offered_item(const LLUUID& item_id) // notification (e.g. trash, cof, lost-and-found). if(!gAgent.getAFK()) { - const LLViewerInventoryCategory *parent = gInventory.getFirstNondefaultParent(item_id); + const LLViewerInventoryCategory *parent = gInventory.getFirstNondefaultParent(obj_id); if (parent) { const LLFolderType::EType parent_type = parent->getPreferredType(); @@ -1033,7 +1251,6 @@ void inventory_offer_mute_callback(const LLUUID& blocked_id, bool matches(const LLNotificationPtr notification) const { if(notification->getName() == "ObjectGiveItem" - || notification->getName() == "ObjectGiveItemUnknownUser" || notification->getName() == "UserGiveItem") { return (notification->getPayload()["from_id"].asUUID() == blocked_id); @@ -1048,6 +1265,16 @@ void inventory_offer_mute_callback(const LLUUID& blocked_id, gSavedSettings.getString("NotificationChannelUUID")), OfferMatcher(blocked_id)); } +LLOfferInfo::LLOfferInfo() + : LLNotificationResponderInterface() + , mFromGroup(FALSE) + , mFromObject(FALSE) + , mIM(IM_NOTHING_SPECIAL) + , mType(LLAssetType::AT_NONE) + , mPersist(false) +{ +} + LLOfferInfo::LLOfferInfo(const LLSD& sd) { mIM = (EInstantMessage)sd["im_type"].asInteger(); @@ -1061,6 +1288,23 @@ LLOfferInfo::LLOfferInfo(const LLSD& sd) mFromName = sd["from_name"].asString(); mDesc = sd["description"].asString(); mHost = LLHost(sd["sender"].asString()); + mPersist = sd["persist"].asBoolean(); +} + +LLOfferInfo::LLOfferInfo(const LLOfferInfo& info) +{ + mIM = info.mIM; + mFromID = info.mFromID; + mFromGroup = info.mFromGroup; + mFromObject = info.mFromObject; + mTransactionID = info.mTransactionID; + mFolderID = info.mFolderID; + mObjectID = info.mObjectID; + mType = info.mType; + mFromName = info.mFromName; + mDesc = info.mDesc; + mHost = info.mHost; + mPersist = info.mPersist; } LLSD LLOfferInfo::asLLSD() @@ -1077,9 +1321,15 @@ LLSD LLOfferInfo::asLLSD() sd["from_name"] = mFromName; sd["description"] = mDesc; sd["sender"] = mHost.getIPandPort(); + sd["persist"] = mPersist; return sd; } +void LLOfferInfo::fromLLSD(const LLSD& params) +{ + *this = params; +} + void LLOfferInfo::send_auto_receive_response(void) { LLMessageSystem* msg = gMessageSystem; @@ -1119,6 +1369,21 @@ void LLOfferInfo::send_auto_receive_response(void) } } +void LLOfferInfo::handleRespond(const LLSD& notification, const LLSD& response) +{ + initRespondFunctionMap(); + + const std::string name = notification["name"].asString(); + if(mRespondFunctions.find(name) == mRespondFunctions.end()) + { + llwarns << "Unexpected notification name : " << name << llendl; + llassert(!"Unexpected notification name"); + return; + } + + mRespondFunctions[name](notification, response); +} + bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD& response) { LLChat chat; @@ -1165,11 +1430,9 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD& // This is an offer from an agent. In this case, the back // end has already copied the items into your inventory, // so we can fetch it out of our inventory. - LLInventoryFetchObserver::item_ref_t items; - items.push_back(mObjectID); - LLOpenAgentOffer* open_agent_offer = new LLOpenAgentOffer(from_string); - open_agent_offer->fetchItems(items); - if(catp || (itemp && itemp->isComplete())) + LLOpenAgentOffer* open_agent_offer = new LLOpenAgentOffer(mObjectID, from_string); + open_agent_offer->startFetch(); + if(catp || (itemp && itemp->isFinished())) { open_agent_offer->done(); } @@ -1226,13 +1489,9 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD& // Disabled logging to old chat floater to fix crash in group notices - EXT-4149 // LLFloaterChat::addChatHistory(chat); - LLInventoryFetchComboObserver::folder_ref_t folders; - LLInventoryFetchComboObserver::item_ref_t items; - items.push_back(mObjectID); - LLDiscardAgentOffer* discard_agent_offer; - discard_agent_offer = new LLDiscardAgentOffer(mFolderID, mObjectID); - discard_agent_offer->fetch(folders, items); - if(catp || (itemp && itemp->isComplete())) + LLDiscardAgentOffer* discard_agent_offer = new LLDiscardAgentOffer(mFolderID, mObjectID); + discard_agent_offer->startFetch(); + if (catp || (itemp && itemp->isFinished())) { discard_agent_offer->done(); } @@ -1261,11 +1520,10 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD& gInventory.addObserver(opener); } - // Remove script dialog because there is no need in it no more. - LLUUID object_id = notification["payload"]["object_id"].asUUID(); - LLScriptFloaterManager::instance().removeNotificationByObjectId(object_id); - - delete this; + if(!mPersist) + { + delete this; + } return false; } @@ -1304,13 +1562,6 @@ bool LLOfferInfo::inventory_task_offer_callback(const LLSD& notification, const msg->addUUIDFast(_PREHASH_RegionID, LLUUID::null); msg->addVector3Fast(_PREHASH_Position, gAgent.getPositionAgent()); LLInventoryObserver* opener = NULL; - LLViewerInventoryCategory* catp = NULL; - catp = (LLViewerInventoryCategory*)gInventory.getCategory(mObjectID); - LLViewerInventoryItem* itemp = NULL; - if(!catp) - { - itemp = (LLViewerInventoryItem*)gInventory.getItem(mObjectID); - } std::string from_string; // Used in the pop-up. std::string chatHistory_string; // Used in chat history. @@ -1438,14 +1689,34 @@ bool LLOfferInfo::inventory_task_offer_callback(const LLSD& notification, const gInventory.addObserver(opener); } - // Remove script dialog because there is no need in it no more. - LLUUID object_id = notification["payload"]["object_id"].asUUID(); - LLScriptFloaterManager::instance().removeNotificationByObjectId(object_id); - - delete this; + if(!mPersist) + { + delete this; + } return false; } +class LLPostponedOfferNotification: public LLPostponedNotification +{ +protected: + /* virtual */ + void modifyNotificationParams() + { + LLSD substitutions = mParams.substitutions; + substitutions["NAME"] = mName; + mParams.substitutions = substitutions; + } +}; + +void LLOfferInfo::initRespondFunctionMap() +{ + if(mRespondFunctions.empty()) + { + mRespondFunctions["ObjectGiveItem"] = boost::bind(&LLOfferInfo::inventory_task_offer_callback, this, _1, _2); + mRespondFunctions["UserGiveItem"] = boost::bind(&LLOfferInfo::inventory_offer_callback, this, _1, _2); + } +} + void inventory_offer_handler(LLOfferInfo* info) { //Until throttling is implmented, busy mode should reject inventory instead of silently @@ -1497,7 +1768,9 @@ void inventory_offer_handler(LLOfferInfo* info) std::string typestr = ll_safe_string(LLAssetType::lookupHumanReadable(info->mType)); if (!typestr.empty()) { - args["OBJECTTYPE"] = typestr; + // human readable matches string name from strings.xml + // lets get asset type localized name + args["OBJECTTYPE"] = LLTrans::getString(typestr); } else { @@ -1510,30 +1783,6 @@ void inventory_offer_handler(LLOfferInfo* info) return; } - // Name cache callbacks don't store userdata, so can't save - // off the LLOfferInfo. Argh. - BOOL name_found = FALSE; - if (info->mFromGroup) - { - std::string group_name; - if (gCacheName->getGroupName(info->mFromID, group_name)) - { - args["FIRST"] = group_name; - args["LAST"] = ""; - name_found = TRUE; - } - } - else - { - std::string first_name, last_name; - if (gCacheName->getName(info->mFromID, first_name, last_name)) - { - args["FIRST"] = first_name; - args["LAST"] = last_name; - name_found = TRUE; - } - } - // If mObjectID is null then generate the object_id based on msg to prevent // multiple creation of chiclets for same object. LLUUID object_id = info->mObjectID; @@ -1548,9 +1797,9 @@ void inventory_offer_handler(LLOfferInfo* info) payload["give_inventory_notification"] = FALSE; args["OBJECTFROMNAME"] = info->mFromName; args["NAME"] = info->mFromName; - args["NAME_SLURL"] = LLSLURL::buildCommand("agent", info->mFromID, "about"); + args["NAME_SLURL"] = LLSLURL("agent", info->mFromID, "about").getSLURLString(); std::string verb = "select?name=" + LLURI::escape(msg); - args["ITEM_SLURL"] = LLSLURL::buildCommand("inventory", info->mObjectID, verb.c_str()); + args["ITEM_SLURL"] = LLSLURL("inventory", info->mObjectID, verb.c_str()).getSLURLString(); LLNotification::Params p("ObjectGiveItem"); @@ -1560,23 +1809,27 @@ void inventory_offer_handler(LLOfferInfo* info) // Inventory Slurls don't currently work for non agent transfers, so only display the object name. args["ITEM_SLURL"] = msg; // Note: sets inventory_task_offer_callback as the callback - p.substitutions(args).payload(payload).functor.function(boost::bind(&LLOfferInfo::inventory_task_offer_callback, info, _1, _2)); - p.name = name_found ? "ObjectGiveItem" : "ObjectGiveItemUnknownUser"; + p.substitutions(args).payload(payload).functor.responder(LLNotificationResponderPtr(info)); + info->mPersist = true; + p.name = "ObjectGiveItem"; // Pop up inv offer chiclet and let the user accept (keep), or reject (and silently delete) the inventory. - LLNotifications::instance().add(p); + LLPostponedNotification::add<LLPostponedOfferNotification>(p, info->mFromID, info->mFromGroup == TRUE); } else // Agent -> Agent Inventory Offer { + p.responder = info; // Note: sets inventory_offer_callback as the callback - p.substitutions(args).payload(payload).functor.function(boost::bind(&LLOfferInfo::inventory_offer_callback, info, _1, _2)); + // *TODO fix memory leak + // inventory_offer_callback() is not invoked if user received notification and + // closes viewer(without responding the notification) + p.substitutions(args).payload(payload).functor.responder(LLNotificationResponderPtr(info)); + info->mPersist = true; p.name = "UserGiveItem"; // Prefetch the item into your local inventory. - LLInventoryFetchObserver::item_ref_t items; - items.push_back(info->mObjectID); - LLInventoryFetchObserver* fetch_item = new LLInventoryFetchObserver(); - fetch_item->fetchItems(items); - if(fetch_item->isEverythingComplete()) + LLInventoryFetchItemsObserver* fetch_item = new LLInventoryFetchItemsObserver(info->mObjectID); + fetch_item->startFetch(); + if(fetch_item->isFinished()) { fetch_item->done(); } @@ -1591,8 +1844,8 @@ void inventory_offer_handler(LLOfferInfo* info) // Inform user that there is a script floater via toast system { payload["give_inventory_notification"] = TRUE; - LLNotificationPtr notification = LLNotifications::instance().add(p.payload(payload)); - LLScriptFloaterManager::getInstance()->setNotificationToastId(object_id, notification->getID()); + p.payload = payload; + LLPostponedNotification::add<LLPostponedOfferNotification>(p, info->mFromID, false); } } } @@ -1657,6 +1910,88 @@ bool inspect_remote_object_callback(const LLSD& notification, const LLSD& respon } static LLNotificationFunctorRegistration inspect_remote_object_callback_reg("ServerObjectMessage", inspect_remote_object_callback); +class LLPostponedServerObjectNotification: public LLPostponedNotification +{ +protected: + /* virtual */ + void modifyNotificationParams() + { + LLSD payload = mParams.payload; + payload["SESSION_NAME"] = mName; + mParams.payload = payload; + } +}; + +static bool parse_lure_bucket(const std::string& bucket, + U64& region_handle, + LLVector3& pos, + LLVector3& look_at, + U8& region_access) +{ + // tokenize the bucket + typedef boost::tokenizer<boost::char_separator<char> > tokenizer; + boost::char_separator<char> sep("|", "", boost::keep_empty_tokens); + tokenizer tokens(bucket, sep); + tokenizer::iterator iter = tokens.begin(); + + S32 gx,gy,rx,ry,rz,lx,ly,lz; + try + { + gx = boost::lexical_cast<S32>((*(iter)).c_str()); + gy = boost::lexical_cast<S32>((*(++iter)).c_str()); + rx = boost::lexical_cast<S32>((*(++iter)).c_str()); + ry = boost::lexical_cast<S32>((*(++iter)).c_str()); + rz = boost::lexical_cast<S32>((*(++iter)).c_str()); + lx = boost::lexical_cast<S32>((*(++iter)).c_str()); + ly = boost::lexical_cast<S32>((*(++iter)).c_str()); + lz = boost::lexical_cast<S32>((*(++iter)).c_str()); + } + catch( boost::bad_lexical_cast& ) + { + LL_WARNS("parse_lure_bucket") + << "Couldn't parse lure bucket." + << LL_ENDL; + return false; + } + // Grab region access + region_access = SIM_ACCESS_MIN; + if (++iter != tokens.end()) + { + std::string access_str((*iter).c_str()); + LLStringUtil::trim(access_str); + if ( access_str == "A" ) + { + region_access = SIM_ACCESS_ADULT; + } + else if ( access_str == "M" ) + { + region_access = SIM_ACCESS_MATURE; + } + else if ( access_str == "PG" ) + { + region_access = SIM_ACCESS_PG; + } + } + + pos.setVec((F32)rx, (F32)ry, (F32)rz); + look_at.setVec((F32)lx, (F32)ly, (F32)lz); + + region_handle = to_region_handle(gx, gy); + return true; +} + +class LLPostponedIMSystemTipNotification: public LLPostponedNotification +{ +protected: + /* virtual */ + void modifyNotificationParams() + { + LLSD payload = mParams.payload; + payload["SESSION_NAME"] = mName; + mParams.payload = payload; + } +}; + void process_improved_im(LLMessageSystem *msg, void **user_data) { if (gNoRender) @@ -1726,17 +2061,20 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) std::string separator_string(": "); LLSD args; + LLSD payload; + LLNotification::Params params; + switch(dialog) { case IM_CONSOLE_AND_CHAT_HISTORY: - // These are used for system messages, hence don't need the name, - // as it is always "Second Life". - // *TODO: Translate args["MESSAGE"] = message; + args["NAME"] = name; + payload["from_id"] = from_id; - // Note: don't put the message in the IM history, even though was sent - // via the IM mechanism. - LLNotificationsUtil::add("SystemMessageTip",args); + params.name = "IMSystemMessageTip"; + params.substitutions = args; + params.payload = payload; + LLPostponedNotification::add<LLPostponedIMSystemTipNotification>(params, from_id, false); break; case IM_NOTHING_SPECIAL: @@ -1758,7 +2096,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) // initiated by the other party) then... std::string my_name; LLAgentUI::buildFullname(my_name); - std::string response = gSavedPerAccountSettings.getString("BusyModeResponse2"); + std::string response = gSavedPerAccountSettings.getString("BusyModeResponse"); pack_instant_message( gMessageSystem, gAgent.getID(), @@ -1849,6 +2187,11 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) } else { + /* + EXT-5099 + currently there is no way to store in history only... + using LLNotificationsUtil::add will add message to Nearby Chat + // muted user, so don't start an IM session, just record line in chat // history. Pretend the chat is from a local agent, // so it will go into the history but not be shown on screen. @@ -1856,6 +2199,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) LLSD args; args["MESSAGE"] = buffer; LLNotificationsUtil::add("SystemMessageTip", args); + */ } } break; @@ -1953,7 +2297,6 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) // For requested notices, we don't want to send the popups. if (dialog != IM_GROUP_NOTICE_REQUESTED) { - LLSD payload; payload["subject"] = subj; payload["message"] = mes; payload["sender_name"] = name; @@ -2016,7 +2359,8 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) LLSD args; args["MESSAGE"] = message; - LLNotificationsUtil::add("JoinGroup", args, payload, join_group_response); + // we shouldn't pass callback functor since it is registered in LLFunctorRegistration + LLNotificationsUtil::add("JoinGroup", args, payload); } } break; @@ -2077,10 +2421,8 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) if (is_muted) { // Prefetch the offered item so that it can be discarded by the appropriate observer. (EXT-4331) - LLInventoryFetchObserver::item_ref_t items; - items.push_back(info->mObjectID); - LLInventoryFetchObserver* fetch_item = new LLInventoryFetchObserver(); - fetch_item->fetchItems(items); + LLInventoryFetchItemsObserver* fetch_item = new LLInventoryFetchItemsObserver(info->mObjectID); + fetch_item->startFetch(); delete fetch_item; // Same as closing window @@ -2186,10 +2528,13 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) chat.mFromID = from_id ^ gAgent.getSessionID(); } + chat.mSourceType = CHAT_SOURCE_OBJECT; + if(SYSTEM_FROM == name) { // System's UUID is NULL (fixes EXT-4766) - chat.mFromID = from_id = LLUUID::null; + chat.mFromID = LLUUID::null; + chat.mSourceType = CHAT_SOURCE_SYSTEM; } LLSD query_string; @@ -2201,22 +2546,19 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) query_string["groupowned"] = "true"; } - std::ostringstream link; - link << "secondlife:///app/objectim/" << session_id << LLURI::mapToQueryString(query_string); - - chat.mURL = link.str(); + chat.mURL = LLSLURL("objectim", session_id, "").getSLURLString(); chat.mText = message; - chat.mSourceType = CHAT_SOURCE_OBJECT; // Note: lie to Nearby Chat, pretending that this is NOT an IM, because // IMs from obejcts don't open IM sessions. LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD()); - if(nearby_chat) + if(SYSTEM_FROM != name && nearby_chat) { + chat.mOwnerID = from_id; LLSD args; - args["owner_id"] = from_id; args["slurl"] = location; - nearby_chat->addMessage(chat, true, args); + args["type"] = LLNotificationsUI::NT_NEARBYCHAT; + LLNotificationsUI::LLNotificationManager::instance().onChat(chat, args); } @@ -2234,13 +2576,16 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) payload["slurl"] = location; payload["name"] = name; std::string session_name; - gCacheName->getFullName(from_id, session_name); - payload["SESSION_NAME"] = session_name; if (from_group) { payload["group_owned"] = "true"; } - LLNotificationsUtil::add("ServerObjectMessage", substitutions, payload); + + LLNotification::Params params("ServerObjectMessage"); + params.substitutions = substitutions; + params.payload = payload; + + LLPostponedNotification::add<LLPostponedServerObjectNotification>(params, from_id, false); } break; case IM_FROM_TASK_AS_ALERT: @@ -2281,15 +2626,34 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) } else { + LLVector3 pos, look_at; + U64 region_handle; + U8 region_access; + std::string region_info = ll_safe_string((char*)binary_bucket, binary_bucket_size); + std::string region_access_str = LLStringUtil::null; + std::string region_access_icn = LLStringUtil::null; + + if (parse_lure_bucket(region_info, region_handle, pos, look_at, region_access)) + { + region_access_str = LLViewerRegion::accessToString(region_access); + region_access_icn = LLViewerRegion::getAccessIcon(region_access); + } + LLSD args; // *TODO: Translate -> [FIRST] [LAST] (maybe) - args["NAME"] = name; + args["NAME_SLURL"] = LLSLURL("agent", from_id, "about").getSLURLString(); args["MESSAGE"] = message; + args["MATURITY_STR"] = region_access_str; + args["MATURITY_ICON"] = region_access_icn; LLSD payload; payload["from_id"] = from_id; payload["lure_id"] = session_id; payload["godlike"] = FALSE; - LLNotificationsUtil::add("TeleportOffered", args, payload); + + LLNotification::Params params("TeleportOffered"); + params.substitutions = args; + params.payload = payload; + LLPostponedNotification::add<LLPostponedOfferNotification>( params, from_id, false); } } break; @@ -2349,7 +2713,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) } else { - args["[NAME]"] = name; + args["NAME_SLURL"] = LLSLURL("agent", from_id, "about").getSLURLString(); if(message.empty()) { //support for frienship offers from clients before July 2008 @@ -2358,7 +2722,10 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) else { args["[MESSAGE]"] = message; - LLNotificationsUtil::add("OfferFriendship", args, payload); + LLNotification::Params params("OfferFriendship"); + params.substitutions = args; + params.payload = payload; + LLPostponedNotification::add<LLPostponedOfferNotification>( params, from_id, false); } } } @@ -2402,7 +2769,7 @@ void busy_message (LLMessageSystem* msg, LLUUID from_id) { std::string my_name; LLAgentUI::buildFullname(my_name); - std::string response = gSavedPerAccountSettings.getString("BusyModeResponse2"); + std::string response = gSavedPerAccountSettings.getString("BusyModeResponse"); pack_instant_message( gMessageSystem, gAgent.getID(), @@ -2718,7 +3085,7 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data) // object inspect for an object that is chatting with you LLSD args; args["type"] = LLNotificationsUI::NT_NEARBYCHAT; - args["owner_id"] = owner_id; + chat.mOwnerID = owner_id; LLNotificationsUI::LLNotificationManager::instance().onChat(chat, args); } @@ -2799,7 +3166,9 @@ void process_teleport_progress(LLMessageSystem* msg, void**) class LLFetchInWelcomeArea : public LLInventoryFetchDescendentsObserver { public: - LLFetchInWelcomeArea() {} + LLFetchInWelcomeArea(const uuid_vec_t &ids) : + LLInventoryFetchDescendentsObserver(ids) + {} virtual void done() { LLIsType is_landmark(LLAssetType::AT_LANDMARK); @@ -2810,8 +3179,8 @@ public: LLInventoryModel::cat_array_t land_cats; LLInventoryModel::item_array_t land_items; - folder_ref_t::iterator it = mCompleteFolders.begin(); - folder_ref_t::iterator end = mCompleteFolders.end(); + uuid_vec_t::iterator it = mComplete.begin(); + uuid_vec_t::iterator end = mComplete.end(); for(; it != end; ++it) { gInventory.collectDescendentsIf( @@ -2872,7 +3241,7 @@ BOOL LLPostTeleportNotifiers::tick() if ( gAgent.getTeleportState() == LLAgent::TELEPORT_NONE ) { // get callingcards and landmarks available to the user arriving. - LLInventoryFetchDescendentsObserver::folder_ref_t folders; + uuid_vec_t folders; const LLUUID callingcard_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD); if(callingcard_id.notNull()) folders.push_back(callingcard_id); @@ -2881,9 +3250,9 @@ BOOL LLPostTeleportNotifiers::tick() folders.push_back(folder_id); if(!folders.empty()) { - LLFetchInWelcomeArea* fetcher = new LLFetchInWelcomeArea; - fetcher->fetchDescendents(folders); - if(fetcher->isEverythingComplete()) + LLFetchInWelcomeArea* fetcher = new LLFetchInWelcomeArea(folders); + fetcher->startFetch(); + if(fetcher->isFinished()) { fetcher->done(); } @@ -2912,6 +3281,9 @@ void process_teleport_finish(LLMessageSystem* msg, void**) LL_WARNS("Messaging") << "Got teleport notification for wrong agent!" << LL_ENDL; return; } + + // Teleport is finished; it can't be cancelled now. + gViewerWindow->setProgressCancelButtonVisible(FALSE); // Do teleport effect for where you're leaving // VEFFECT: TeleportStart @@ -2957,18 +3329,18 @@ void process_teleport_finish(LLMessageSystem* msg, void**) /* // send camera update to new region - gAgent.updateCamera(); + gAgentCamera.updateCamera(); // likewise make sure the camera is behind the avatar - gAgent.resetView(TRUE); + gAgentCamera.resetView(TRUE); LLVector3 shift_vector = regionp->getPosRegionFromGlobal(gAgent.getRegion()->getOriginGlobal()); gAgent.setRegion(regionp); gObjectList.shiftObjects(shift_vector); - if (gAgent.getAvatarObject()) + if (isAgentAvatarValid()) { - gAgent.getAvatarObject()->clearChatText(); - gAgent.slamLookAt(look_at); + gAgentAvatarp->clearChatText(); + gAgentCamera.slamLookAt(look_at); } gAgent.setPositionAgent(pos); gAssetStorage->setUpstream(sim); @@ -3047,8 +3419,7 @@ void process_agent_movement_complete(LLMessageSystem* msg, void**) std::string version_channel; msg->getString("SimData", "ChannelVersion", version_channel); - LLVOAvatar* avatarp = gAgent.getAvatarObject(); - if (!avatarp) + if (!isAgentAvatarValid()) { // Could happen if you were immediately god-teleported away on login, // maybe other cases. Continue, but warn. @@ -3069,7 +3440,7 @@ void process_agent_movement_complete(LLMessageSystem* msg, void**) << x << ":" << y << " current pos " << gAgent.getPositionGlobal() << LL_ENDL; - LLAppViewer::instance()->forceDisconnect("You were sent to an invalid region."); + LLAppViewer::instance()->forceDisconnect(LLTrans::getString("SentToInvalidRegion")); return; } @@ -3092,9 +3463,9 @@ void process_agent_movement_complete(LLMessageSystem* msg, void**) if( is_teleport ) { // Force the camera back onto the agent, don't animate. - gAgent.setFocusOnAvatar(TRUE, FALSE); - gAgent.slamLookAt(look_at); - gAgent.updateCamera(); + gAgentCamera.setFocusOnAvatar(TRUE, FALSE); + gAgentCamera.slamLookAt(look_at); + gAgentCamera.updateCamera(); gAgent.setTeleportState( LLAgent::TELEPORT_START_ARRIVAL ); @@ -3102,18 +3473,24 @@ void process_agent_movement_complete(LLMessageSystem* msg, void**) // know what you look like. gAgent.sendAgentSetAppearance(); - if (avatarp) + if (isAgentAvatarValid()) { // Chat the "back" SLURL. (DEV-4907) + LLSLURL slurl; + gAgent.getTeleportSourceSLURL(slurl); + LLSD substitution = LLSD().with("[T_SLURL]", slurl.getSLURLString()); + std::string completed_from = LLAgent::sTeleportProgressMessages["completed_from"]; + LLStringUtil::format(completed_from, substitution); + LLSD args; - args["MESSAGE"] = "Teleport completed from " + gAgent.getTeleportSourceSLURL(); + args["MESSAGE"] = completed_from; LLNotificationsUtil::add("SystemMessageTip", args); // Set the new position - avatarp->setPositionAgent(agent_pos); - avatarp->clearChat(); - avatarp->slamPosition(); + gAgentAvatarp->setPositionAgent(agent_pos); + gAgentAvatarp->clearChat(); + gAgentAvatarp->slamPosition(); } } else @@ -3139,7 +3516,7 @@ void process_agent_movement_complete(LLMessageSystem* msg, void**) global_agent_pos[1] += y; look_at = (LLVector3)beacon_pos - global_agent_pos; look_at.normVec(); - gAgent.slamLookAt(look_at); + gAgentCamera.slamLookAt(look_at); } } @@ -3173,9 +3550,9 @@ void process_agent_movement_complete(LLMessageSystem* msg, void**) gAgent.clearBusy(); } - if (avatarp) + if (isAgentAvatarValid()) { - avatarp->mFootPlane.clearVec(); + gAgentAvatarp->mFootPlane.clearVec(); } // send walk-vs-run status @@ -3316,7 +3693,7 @@ void send_agent_update(BOOL force_send, BOOL send_reliable) LLQuaternion body_rotation = gAgent.getFrameAgent().getQuaternion(); LLQuaternion head_rotation = gAgent.getHeadRotation(); - camera_pos_agent = gAgent.getCameraPositionAgent(); + camera_pos_agent = gAgentCamera.getCameraPositionAgent(); render_state = gAgent.getRenderState(); @@ -3439,7 +3816,7 @@ void send_agent_update(BOOL force_send, BOOL send_reliable) msg->addVector3Fast(_PREHASH_CameraAtAxis, LLViewerCamera::getInstance()->getAtAxis()); msg->addVector3Fast(_PREHASH_CameraLeftAxis, LLViewerCamera::getInstance()->getLeftAxis()); msg->addVector3Fast(_PREHASH_CameraUpAxis, LLViewerCamera::getInstance()->getUpAxis()); - msg->addF32Fast(_PREHASH_Far, gAgent.mDrawDistance); + msg->addF32Fast(_PREHASH_Far, gAgentCamera.mDrawDistance); msg->addU32Fast(_PREHASH_ControlFlags, control_flags); @@ -4076,7 +4453,7 @@ void process_avatar_appearance(LLMessageSystem *mesgsys, void **user_data) mesgsys->getUUIDFast(_PREHASH_Sender, _PREHASH_ID, uuid); LLVOAvatar* avatarp = (LLVOAvatar *)gObjectList.findObject(uuid); - if( avatarp ) + if (avatarp) { avatarp->processAvatarAppearance( mesgsys ); } @@ -4091,7 +4468,7 @@ void process_camera_constraint(LLMessageSystem *mesgsys, void **user_data) LLVector4 cameraCollidePlane; mesgsys->getVector4Fast(_PREHASH_CameraCollidePlane, _PREHASH_Plane, cameraCollidePlane); - gAgent.setCameraCollidePlane(cameraCollidePlane); + gAgentCamera.setCameraCollidePlane(cameraCollidePlane); } void near_sit_object(BOOL success, void *data) @@ -4124,20 +4501,21 @@ void process_avatar_sit_response(LLMessageSystem *mesgsys, void **user_data) BOOL force_mouselook; mesgsys->getBOOLFast(_PREHASH_SitTransform, _PREHASH_ForceMouselook, force_mouselook); - LLVOAvatar* avatar = gAgent.getAvatarObject(); - - if (avatar && dist_vec_squared(camera_eye, camera_at) > 0.0001f) + if (isAgentAvatarValid() && dist_vec_squared(camera_eye, camera_at) > 0.0001f) { - gAgent.setSitCamera(sitObjectID, camera_eye, camera_at); + gAgentCamera.setSitCamera(sitObjectID, camera_eye, camera_at); } - gAgent.setForceMouselook(force_mouselook); + gAgentCamera.setForceMouselook(force_mouselook); + // Forcing turning off flying here to prevent flying after pressing "Stand" + // to stand up from an object. See EXT-1655. + gAgent.setFlying(FALSE); LLViewerObject* object = gObjectList.findObject(sitObjectID); if (object) { LLVector3 sit_spot = object->getPositionAgent() + (sitPosition * object->getRotation()); - if (!use_autopilot || (avatar && avatar->isSitting() && avatar->getRoot() == object->getRoot())) + if (!use_autopilot || isAgentAvatarValid() && gAgentAvatarp->isSitting() && gAgentAvatarp->getRoot() == object->getRoot()) { //we're already sitting on this object, so don't autopilot } @@ -4445,27 +4823,103 @@ void process_money_balance_reply( LLMessageSystem* msg, void** ) // have missed something during an event. // *TODO: Translate LLSD args; - args["MESSAGE"] = desc; + // this is a marker to retrieve avatar name from server message: // "<avatar name> paid you L$" const std::string marker = "paid you L$"; + args["MESSAGE"] = desc; + // extract avatar name from system message - std::string name = desc.substr(0, desc.find(marker, 0)); + S32 marker_pos = desc.find(marker, 0); + + std::string base_name = desc.substr(0, marker_pos); + + std::string name = base_name; LLStringUtil::trim(name); // if name extracted and name cache contains avatar id send loggable notification LLUUID from_id; if(name.size() > 0 && gCacheName->getUUID(name, from_id)) { + //description always comes not localized. lets fix this + + //ammount paid + std::string ammount = desc.substr(marker_pos + marker.length(),desc.length() - marker.length() - marker_pos); + + //reform description + LLStringUtil::format_map_t str_args; + str_args["NAME"] = base_name; + str_args["AMOUNT"] = ammount; + std::string new_description = LLTrans::getString("paid_you_ldollars", str_args); + + + args["MESSAGE"] = new_description; args["NAME"] = name; LLSD payload; payload["from_id"] = from_id; LLNotificationsUtil::add("PaymentRecived", args, payload); } + //AD *HACK: Parsing incoming string to localize messages that come from server! EXT-5986 + // It's only a temporarily and ineffective measure. It doesn't affect performance much + // because we get here only for specific type of messages, but anyway it is not right to do it! + // *TODO: Server-side changes should be made and this code removed. else { + if(desc.find("You paid")==0) + { + // Regular expression for message parsing- change it in case of server-side changes. + // Each set of parenthesis will later be used to find arguments of message we generate + // in the end of this if- (.*) gives us name of money receiver, (\\d+)-amount of money we pay + // and ([^$]*)- reason of payment + boost::regex expr("You paid (?:.{0}|(.*) )L\\$(\\d+)\\s?([^$]*)\\."); + boost::match_results <std::string::const_iterator> matches; + if(boost::regex_match(desc, matches, expr)) + { + // Name of full localizable notification string + // there are four types of this string- with name of receiver and reason of payment, + // without name and without reason (both may also be absent simultaneously). + // example of string without name - You paid L$100 to create a group. + // example of string without reason - You paid Smdby Linden L$100. + // example of string with reason and name - You paid Smbdy Linden L$100 for a land access pass. + // example of string with no info - You paid L$50. + std::string line = "you_paid_ldollars_no_name"; + + // arguments of string which will be in notification + LLStringUtil::format_map_t str_args; + + // extracting amount of money paid (without L$ symbols). It is always present. + str_args["[AMOUNT]"] = std::string(matches[2]); + + // extracting name of person/group you are paying (it may be absent) + std::string name = std::string(matches[1]); + if(!name.empty()) + { + str_args["[NAME]"] = name; + line = "you_paid_ldollars"; + } + + // extracting reason of payment (it may be absent) + std::string reason = std::string(matches[3]); + if (reason.empty()) + { + line = name.empty() ? "you_paid_ldollars_no_info" : "you_paid_ldollars_no_reason"; + } + else + { + std::string localized_reason; + // if we haven't found localized string for reason of payment leave it as it was + str_args["[REASON]"] = LLTrans::findString(localized_reason, reason) ? localized_reason : reason; + } + + // forming final message string by retrieving localized version from xml + // and applying previously found arguments + line = LLTrans::getString(line, str_args); + args["MESSAGE"] = line; + } + } + LLNotificationsUtil::add("SystemMessage", args); } @@ -4494,6 +4948,10 @@ bool handle_special_notification_callback(const LLSD& notification, const LLSD& gSavedSettings.setU32("PreferredMaturity", preferredMaturity); gAgent.sendMaturityPreferenceToServer(preferredMaturity); + // notify user that the maturity preference has been changed + LLSD args; + args["RATING"] = LLViewerRegion::accessToString(preferredMaturity); + LLNotificationsUtil::add("PreferredMaturityChanged", args); } return false; @@ -5102,14 +5560,14 @@ void process_derez_container(LLMessageSystem *msg, void**) } void container_inventory_arrived(LLViewerObject* object, - InventoryObjectList* inventory, + LLInventoryObject::object_list_t* inventory, S32 serial_num, void* data) { LL_DEBUGS("Messaging") << "container_inventory_arrived()" << LL_ENDL; - if( gAgent.cameraMouselook() ) + if( gAgentCamera.cameraMouselook() ) { - gAgent.changeCameraToDefault(); + gAgentCamera.changeCameraToDefault(); } LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel(); @@ -5122,8 +5580,8 @@ void container_inventory_arrived(LLViewerObject* object, LLFolderType::FT_NONE, LLTrans::getString("AcquiredItems")); - InventoryObjectList::const_iterator it = inventory->begin(); - InventoryObjectList::const_iterator end = inventory->end(); + LLInventoryObject::object_list_t::const_iterator it = inventory->begin(); + LLInventoryObject::object_list_t::const_iterator end = inventory->end(); for ( ; it != end; ++it) { if ((*it)->getType() != LLAssetType::AT_CATEGORY) @@ -5159,7 +5617,7 @@ void container_inventory_arrived(LLViewerObject* object, { // we're going to get one fake root category as well as the // one actual object - InventoryObjectList::iterator it = inventory->begin(); + LLInventoryObject::object_list_t::iterator it = inventory->begin(); if ((*it)->getType() == LLAssetType::AT_CATEGORY) { @@ -5334,13 +5792,13 @@ void process_teleport_local(LLMessageSystem *msg,void**) } gAgent.setPositionAgent(pos); - gAgent.slamLookAt(look_at); + gAgentCamera.slamLookAt(look_at); // likewise make sure the camera is behind the avatar - gAgent.resetView(TRUE, TRUE); + gAgentCamera.resetView(TRUE, TRUE); // send camera update to new region - gAgent.updateCamera(); + gAgentCamera.updateCamera(); send_agent_update(TRUE, TRUE); @@ -5422,7 +5880,9 @@ void send_group_notice(const LLUUID& group_id, bool handle_lure_callback(const LLSD& notification, const LLSD& response) { std::string text = response["message"].asString(); - text.append("\r\n").append(LLAgentUI::buildSLURL()); + LLSLURL slurl; + LLAgentUI::buildSLURL(slurl); + text.append("\r\n").append(slurl.getSLURLString()); S32 option = LLNotificationsUtil::getSelectedOption(notification, response); if(0 == option) @@ -5452,6 +5912,8 @@ bool handle_lure_callback(const LLSD& notification, const LLSD& response) args["TO_NAME"] = target_name; LLSD payload; + + //*TODO please rewrite all keys to the same case, lower or upper payload["from_id"] = target_id; payload["SESSION_NAME"] = target_name; payload["SUPPRESS_TOAST"] = true; @@ -5472,8 +5934,12 @@ void handle_lure(const LLUUID& invitee) } // Prompt for a message to the invited user. -void handle_lure(const std::vector<LLUUID>& ids) +void handle_lure(const uuid_vec_t& ids) { + if (ids.empty()) return; + + if (!gAgent.getRegion()) return; + LLSD edit_args; edit_args["REGION"] = gAgent.getRegion()->getName(); @@ -5859,7 +6325,7 @@ void process_covenant_reply(LLMessageSystem* msg, void**) LLFloaterBuyLand::updateEstateName(estate_name); std::string owner_name = - LLSLURL::buildCommand("agent", estate_owner_id, "inspect"); + LLSLURL("agent", estate_owner_id, "inspect").getSLURLString(); LLPanelEstateCovenant::updateEstateOwnerName(owner_name); LLPanelLandCovenant::updateEstateOwnerName(owner_name); LLFloaterBuyLand::updateEstateOwnerName(owner_name); @@ -6039,3 +6505,4 @@ void LLOfferInfo::forceResponse(InventoryOfferResponse response) params.functor.function(boost::bind(&LLOfferInfo::inventory_offer_callback, this, _1, _2)); LLNotifications::instance().forceResponse(params, response); } + diff --git a/indra/newview/llviewermessage.h b/indra/newview/llviewermessage.h index 7dd629dcfd..eca253ee03 100644 --- a/indra/newview/llviewermessage.h +++ b/indra/newview/llviewermessage.h @@ -40,6 +40,7 @@ #include "lluuid.h" #include "message.h" #include "stdenums.h" +#include "llnotifications.h" // // Forward declarations @@ -129,7 +130,7 @@ void process_frozen_message(LLMessageSystem* msg, void**); void process_derez_container(LLMessageSystem *msg, void**); void container_inventory_arrived(LLViewerObject* object, - std::list<LLPointer<LLInventoryObject> >* inventory, //InventoryObjectList + std::list<LLPointer<LLInventoryObject> >* inventory, //LLInventoryObject::object_list_t S32 serial_num, void* data); @@ -157,7 +158,7 @@ void send_group_notice(const LLUUID& group_id, const LLInventoryItem* item); void handle_lure(const LLUUID& invitee); -void handle_lure(const std::vector<LLUUID>& ids); +void handle_lure(const uuid_vec_t& ids); // always from gAgent and // routes through the gAgent's current simulator @@ -201,20 +202,23 @@ void invalid_message_callback(LLMessageSystem*, void*, EMessageException); void process_initiate_download(LLMessageSystem* msg, void**); void start_new_inventory_observer(); -void open_inventory_offer(const std::vector<LLUUID>& items, const std::string& from_name); +void open_inventory_offer(const uuid_vec_t& items, const std::string& from_name); // Returns true if item is not in certain "quiet" folder which don't need UI // notification (e.g. trash, cof, lost-and-found) and agent is not AFK, false otherwise. // Returns false if item is not found. -bool highlight_offered_item(const LLUUID& item_id); +bool highlight_offered_object(const LLUUID& obj_id); -struct LLOfferInfo +void set_dad_inventory_item(LLInventoryItem* inv_item, const LLUUID& into_folder_uuid); + +class LLOfferInfo : public LLNotificationResponderInterface { - LLOfferInfo() - : mFromGroup(FALSE), mFromObject(FALSE), - mIM(IM_NOTHING_SPECIAL), mType(LLAssetType::AT_NONE) {}; +public: + LLOfferInfo(); LLOfferInfo(const LLSD& sd); + LLOfferInfo(const LLOfferInfo& info); + void forceResponse(InventoryOfferResponse response); EInstantMessage mIM; @@ -228,12 +232,27 @@ struct LLOfferInfo std::string mFromName; std::string mDesc; LLHost mHost; + bool mPersist; + + // LLNotificationResponderInterface implementation + /*virtual*/ LLSD asLLSD(); + /*virtual*/ void fromLLSD(const LLSD& params); + /*virtual*/ void handleRespond(const LLSD& notification, const LLSD& response); - LLSD asLLSD(); void send_auto_receive_response(void); + + // TODO - replace all references with handleRespond() bool inventory_offer_callback(const LLSD& notification, const LLSD& response); bool inventory_task_offer_callback(const LLSD& notification, const LLSD& response); +private: + + void initRespondFunctionMap(); + + typedef boost::function<bool (const LLSD&, const LLSD&)> respond_function_t; + typedef std::map<std::string, respond_function_t> respond_function_map_t; + + respond_function_map_t mRespondFunctions; }; void process_feature_disabled_message(LLMessageSystem* msg, void**); diff --git a/indra/newview/llviewernetwork.cpp b/indra/newview/llviewernetwork.cpp index 987d23630a..fec112b9e7 100644 --- a/indra/newview/llviewernetwork.cpp +++ b/indra/newview/llviewernetwork.cpp @@ -5,7 +5,7 @@ * * $LicenseInfo:firstyear=2006&license=viewergpl$ * - * Copyright (c) 2006-2009, Linden Research, Inc. + * Copyright (c) 2006-2010, Linden Research, Inc. * * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab @@ -13,13 +13,12 @@ * ("GPL"), unless you have obtained a separate licensing agreement * ("Other License"), formally executed by you and Linden Lab. Terms of * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * online at http://secondlife.com/developers/opensource/gplv2 * * There are special exceptions to the terms and conditions of the GPL as * it is applied to this Source Code. View the full text of the exception * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * online at http://secondlife.com/developers/opensource/flossexception * * By copying, modifying or distributing this software, you acknowledge * that you have read and understood your obligations described above, @@ -34,303 +33,542 @@ #include "llviewerprecompiledheaders.h" #include "llviewernetwork.h" +#include "llviewercontrol.h" +#include "llsdserialize.h" +#include "llsecapi.h" +#include "llweb.h" -#include "llevents.h" -#include "net.h" + +const char* DEFAULT_LOGIN_PAGE = "http://secondlife.com/app/login/"; -#include "llviewercontrol.h" -#include "lllogin.h" +const char* SYSTEM_GRID_SLURL_BASE = "secondlife://%s/secondlife/"; +const char* MAIN_GRID_SLURL_BASE = "http://maps.secondlife.com/secondlife/"; +const char* SYSTEM_GRID_APP_SLURL_BASE = "secondlife:///app"; -struct LLGridData -{ - const char* mLabel; - const char* mName; - const char* mLoginURI; - const char* mHelperURI; -}; +const char* DEFAULT_SLURL_BASE = "https://%s/region/"; +const char* DEFAULT_APP_SLURL_BASE = "x-grid-location-info://%s/app"; -static LLGridData gGridInfo[GRID_INFO_COUNT] = +LLGridManager::LLGridManager() { - { "None", "", "", ""}, - { "Aditi", - "util.aditi.lindenlab.com", - "https://login.aditi.lindenlab.com/cgi-bin/login.cgi", - "http://aditi-secondlife.webdev.lindenlab.com/helpers/" }, - { "Agni", - "util.agni.lindenlab.com", - "https://login.agni.lindenlab.com/cgi-bin/login.cgi", - "https://secondlife.com/helpers/" }, - { "Aruna", - "util.aruna.lindenlab.com", - "https://login.aruna.lindenlab.com/cgi-bin/login.cgi", - "http://aruna-secondlife.webdev.lindenlab.com/helpers/" }, - { "Bharati", - "util.bharati.lindenlab.com", - "https://login.bharati.lindenlab.com/cgi-bin/login.cgi", - "http://bharati-secondlife.webdev.lindenlab.com/helpers/" }, - { "Chandra", - "util.chandra.lindenlab.com", - "https://login.chandra.lindenlab.com/cgi-bin/login.cgi", - "http://chandra-secondlife.webdev.lindenlab.com/helpers/" }, - { "Damballah", - "util.damballah.lindenlab.com", - "https://login.damballah.lindenlab.com/cgi-bin/login.cgi", - "http://damballah-secondlife.webdev.lindenlab.com/helpers/" }, - { "Danu", - "util.danu.lindenlab.com", - "https://login.danu.lindenlab.com/cgi-bin/login.cgi", - "http://danu-secondlife.webdev.lindenlab.com/helpers/" }, - { "Durga", - "util.durga.lindenlab.com", - "https://login.durga.lindenlab.com/cgi-bin/login.cgi", - "http://durga-secondlife.webdev.lindenlab.com/helpers/" }, - { "Ganga", - "util.ganga.lindenlab.com", - "https://login.ganga.lindenlab.com/cgi-bin/login.cgi", - "http://ganga-secondlife.webdev.lindenlab.com/helpers/" }, - { "Mitra", - "util.mitra.lindenlab.com", - "https://login.mitra.lindenlab.com/cgi-bin/login.cgi", - "http://mitra-secondlife.webdev.lindenlab.com/helpers/" }, - { "Mohini", - "util.mohini.lindenlab.com", - "https://login.mohini.lindenlab.com/cgi-bin/login.cgi", - "http://mohini-secondlife.webdev.lindenlab.com/helpers/" }, - { "Nandi", - "util.nandi.lindenlab.com", - "https://login.nandi.lindenlab.com/cgi-bin/login.cgi", - "http://nandi-secondlife.webdev.lindenlab.com/helpers/" }, - { "Parvati", - "util.parvati.lindenlab.com", - "https://login.parvati.lindenlab.com/cgi-bin/login.cgi", - "http://parvati-secondlife.webdev.lindenlab.com/helpers/" }, - { "Radha", - "util.radha.lindenlab.com", - "https://login.radha.lindenlab.com/cgi-bin/login.cgi", - "http://radha-secondlife.webdev.lindenlab.com/helpers/" }, - { "Ravi", - "util.ravi.lindenlab.com", - "https://login.ravi.lindenlab.com/cgi-bin/login.cgi", - "http://ravi-secondlife.webdev.lindenlab.com/helpers/" }, - { "Siva", - "util.siva.lindenlab.com", - "https://login.siva.lindenlab.com/cgi-bin/login.cgi", - "http://siva-secondlife.webdev.lindenlab.com/helpers/" }, - { "Shakti", - "util.shakti.lindenlab.com", - "https://login.shakti.lindenlab.com/cgi-bin/login.cgi", - "http://shakti-secondlife.webdev.lindenlab.com/helpers/" }, - { "Skanda", - "util.skanda.lindenlab.com", - "https://login.skanda.lindenlab.com/cgi-bin/login.cgi", - "http://skanda-secondlife.webdev.lindenlab.com/helpers/" }, - { "Soma", - "util.soma.lindenlab.com", - "https://login.soma.lindenlab.com/cgi-bin/login.cgi", - "http://soma-secondlife.webdev.lindenlab.com/helpers/" }, - { "Uma", - "util.uma.lindenlab.com", - "https://login.uma.lindenlab.com/cgi-bin/login.cgi", - "http://uma-secondlife.webdev.lindenlab.com/helpers/" }, - { "Vaak", - "util.vaak.lindenlab.com", - "https://login.vaak.lindenlab.com/cgi-bin/login.cgi", - "http://vaak-secondlife.webdev.lindenlab.com/helpers/" }, - { "Yami", - "util.yami.lindenlab.com", - "https://login.yami.lindenlab.com/cgi-bin/login.cgi", - "http://yami-secondlife.webdev.lindenlab.com/helpers/" }, - { "Local", - "localhost", - "https://login.dmz.lindenlab.com/cgi-bin/login.cgi", - "" }, - { "Other", - "", - "https://login.dmz.lindenlab.com/cgi-bin/login.cgi", - "" } -}; - -const EGridInfo DEFAULT_GRID_CHOICE = GRID_INFO_AGNI; - - -unsigned char gMACAddress[MAC_ADDRESS_BYTES]; /* Flawfinder: ignore */ - -LLViewerLogin::LLViewerLogin() : - mGridChoice(DEFAULT_GRID_CHOICE) + // by default, we use the 'grids.xml' file in the user settings directory + // this file is an LLSD file containing multiple grid definitions. + // This file does not contain definitions for secondlife.com grids, + // as that would be a security issue when they are overwritten by + // an attacker. Don't want someone snagging a password. + std::string grid_file = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, + "grids.xml"); + initialize(grid_file); + +} + + +LLGridManager::LLGridManager(const std::string& grid_file) { + // initialize with an explicity grid file for testing. + initialize(grid_file); } - LLViewerLogin::~LLViewerLogin() - { - } +// +// LLGridManager - class for managing the list of known grids, and the current +// selection +// + + +// +// LLGridManager::initialze - initialize the list of known grids based +// on the fixed list of linden grids (fixed for security reasons) +// the grids.xml file +// and the command line. +void LLGridManager::initialize(const std::string& grid_file) +{ + // default grid list. + // Don't move to a modifiable file for security reasons, + mGrid.clear() ; + // set to undefined + mGridList = LLSD(); + mGridFile = grid_file; + // as we don't want an attacker to override our grid list + // to point the default grid to an invalid grid + addSystemGrid("None", "", "", "", DEFAULT_LOGIN_PAGE); + -void LLViewerLogin::setGridChoice(EGridInfo grid) -{ - if(grid < 0 || grid >= GRID_INFO_COUNT) - { - llerrs << "Invalid grid index specified." << llendl; - return; - } - if(mGridChoice != grid || gSavedSettings.getS32("ServerChoice") != grid) + addSystemGrid("Agni", + MAINGRID, + "https://login.agni.lindenlab.com/cgi-bin/login.cgi", + "https://secondlife.com/helpers/", + DEFAULT_LOGIN_PAGE); + addSystemGrid("Aditi", + "util.aditi.lindenlab.com", + "https://login.aditi.lindenlab.com/cgi-bin/login.cgi", + "http://aditi-secondlife.webdev.lindenlab.com/helpers/", + DEFAULT_LOGIN_PAGE); + addSystemGrid("Aruna", + "util.aruna.lindenlab.com", + "https://login.aruna.lindenlab.com/cgi-bin/login.cgi", + "http://aruna-secondlife.webdev.lindenlab.com/helpers/", + DEFAULT_LOGIN_PAGE); + addSystemGrid("Bharati", + "util.bharati.lindenlab.com", + "https://login.bharati.lindenlab.com/cgi-bin/login.cgi", + "http://bharati-secondlife.webdev.lindenlab.com/helpers/", + DEFAULT_LOGIN_PAGE); + addSystemGrid("Chandra", + "util.chandra.lindenlab.com", + "https://login.chandra.lindenlab.com/cgi-bin/login.cgi", + "http://chandra-secondlife.webdev.lindenlab.com/helpers/", + DEFAULT_LOGIN_PAGE); + addSystemGrid("Damballah", + "util.damballah.lindenlab.com", + "https://login.damballah.lindenlab.com/cgi-bin/login.cgi", + "http://damballah-secondlife.webdev.lindenlab.com/helpers/", + DEFAULT_LOGIN_PAGE); + addSystemGrid("Danu", + "util.danu.lindenlab.com", + "https://login.danu.lindenlab.com/cgi-bin/login.cgi", + "http://danu-secondlife.webdev.lindenlab.com/helpers/", + DEFAULT_LOGIN_PAGE); + addSystemGrid("Durga", + "util.durga.lindenlab.com", + "https://login.durga.lindenlab.com/cgi-bin/login.cgi", + "http://durga-secondlife.webdev.lindenlab.com/helpers/", + DEFAULT_LOGIN_PAGE); + addSystemGrid("Ganga", + "util.ganga.lindenlab.com", + "https://login.ganga.lindenlab.com/cgi-bin/login.cgi", + "http://ganga-secondlife.webdev.lindenlab.com/helpers/", + DEFAULT_LOGIN_PAGE); + addSystemGrid("Mitra", + "util.mitra.lindenlab.com", + "https://login.mitra.lindenlab.com/cgi-bin/login.cgi", + "http://mitra-secondlife.webdev.lindenlab.com/helpers/", + DEFAULT_LOGIN_PAGE); + addSystemGrid("Mohini", + "util.mohini.lindenlab.com", + "https://login.mohini.lindenlab.com/cgi-bin/login.cgi", + "http://mohini-secondlife.webdev.lindenlab.com/helpers/", + DEFAULT_LOGIN_PAGE); + addSystemGrid("Nandi", + "util.nandi.lindenlab.com", + "https://login.nandi.lindenlab.com/cgi-bin/login.cgi", + "http://nandi-secondlife.webdev.lindenlab.com/helpers/", + DEFAULT_LOGIN_PAGE); + addSystemGrid("Parvati", + "util.parvati.lindenlab.com", + "https://login.parvati.lindenlab.com/cgi-bin/login.cgi", + "http://parvati-secondlife.webdev.lindenlab.com/helpers/", + DEFAULT_LOGIN_PAGE); + addSystemGrid("Radha", + "util.radha.lindenlab.com", + "https://login.radha.lindenlab.com/cgi-bin/login.cgi", + "http://radha-secondlife.webdev.lindenlab.com/helpers/", + DEFAULT_LOGIN_PAGE); + addSystemGrid("Ravi", + "util.ravi.lindenlab.com", + "https://login.ravi.lindenlab.com/cgi-bin/login.cgi", + "http://ravi-secondlife.webdev.lindenlab.com/helpers/", + DEFAULT_LOGIN_PAGE); + addSystemGrid("Siva", + "util.siva.lindenlab.com", + "https://login.siva.lindenlab.com/cgi-bin/login.cgi", + "http://siva-secondlife.webdev.lindenlab.com/helpers/", + DEFAULT_LOGIN_PAGE); + addSystemGrid("Shakti", + "util.shakti.lindenlab.com", + "https://login.shakti.lindenlab.com/cgi-bin/login.cgi", + "http://shakti-secondlife.webdev.lindenlab.com/helpers/", + DEFAULT_LOGIN_PAGE); + addSystemGrid("Soma", + "util.soma.lindenlab.com", + "https://login.soma.lindenlab.com/cgi-bin/login.cgi", + "http://soma-secondlife.webdev.lindenlab.com/helpers/", + DEFAULT_LOGIN_PAGE); + addSystemGrid("Uma", + "util.uma.lindenlab.com", + "https://login.uma.lindenlab.com/cgi-bin/login.cgi", + "http://uma-secondlife.webdev.lindenlab.com/helpers/", + DEFAULT_LOGIN_PAGE); + addSystemGrid("Vaak", + "util.vaak.lindenlab.com", + "https://login.vaak.lindenlab.com/cgi-bin/login.cgi", + "http://vaak-secondlife.webdev.lindenlab.com/helpers/", + DEFAULT_LOGIN_PAGE); + addSystemGrid("Yami", + "util.yami.lindenlab.com", + "https://login.yami.lindenlab.com/cgi-bin/login.cgi", + "http://yami-secondlife.webdev.lindenlab.com/helpers/", + DEFAULT_LOGIN_PAGE); + addSystemGrid("Local (Linden)", + "localhost", + "https://login.dmz.lindenlab.com/cgi-bin/login.cgi", + "", + DEFAULT_LOGIN_PAGE); + + + LLSD other_grids; + llifstream llsd_xml; + if (!grid_file.empty()) { - mGridChoice = grid; - if(GRID_INFO_LOCAL == mGridChoice) - { - mGridName = LOOPBACK_ADDRESS_STRING; - } - else if(GRID_INFO_OTHER == mGridChoice) + llsd_xml.open( grid_file.c_str(), std::ios::in | std::ios::binary ); + + // parse through the gridfile, inserting grids into the list unless + // they overwrite a linden grid. + if( llsd_xml.is_open()) { - // *FIX:Mani - could this possibly be valid? - mGridName = "other"; - } - else + LLSDSerialize::fromXMLDocument( other_grids, llsd_xml ); + if(other_grids.isMap()) + { + for(LLSD::map_iterator grid_itr = other_grids.beginMap(); + grid_itr != other_grids.endMap(); + ++grid_itr) + { + LLSD::String key_name = grid_itr->first; + LLSD grid = grid_itr->second; + // TODO: Make sure gridfile specified label is not + // a system grid label + LL_DEBUGS("GridManager") << "reading: " << key_name << LL_ENDL; + if (mGridList.has(key_name) && + mGridList[key_name].has(GRID_IS_SYSTEM_GRID_VALUE)) + { + LL_DEBUGS("GridManager") << "Cannot override grid " << key_name << " as it's a system grid" << LL_ENDL; + // If the system grid does exist in the grids file, and it's marked as a favorite, set it as a favorite. + if(grid_itr->second.has(GRID_IS_FAVORITE_VALUE) && grid_itr->second[GRID_IS_FAVORITE_VALUE].asBoolean() ) + { + mGridList[key_name][GRID_IS_FAVORITE_VALUE] = TRUE; + } + } + else + { + try + { + addGrid(grid); + LL_DEBUGS("GridManager") << "Added grid: " << key_name << LL_ENDL; + } + catch (...) + { + } + } + } + llsd_xml.close(); + } + } + } + + // load a grid from the command line. + // if the actual grid name is specified from the command line, + // set it as the 'selected' grid. + std::string cmd_line_grid = gSavedSettings.getString("CmdLineGridChoice"); + if(!cmd_line_grid.empty()) + { + // try to find the grid assuming the command line parameter is + // the case-insensitive 'label' of the grid. ie 'Agni' + mGrid = getGridByLabel(cmd_line_grid); + if(mGrid.empty()) { - mGridName = gGridInfo[mGridChoice].mLabel; + // if we couldn't find it, assume the + // requested grid is the actual grid 'name' or index, + // which would be the dns name of the grid (for non + // linden hosted grids) + // If the grid isn't there, that's ok, as it will be + // automatically added later. + mGrid = cmd_line_grid; } + + } + else + { + // if a grid was not passed in via the command line, grab it from the CurrentGrid setting. + // if there's no current grid, that's ok as it'll be either set by the value passed + // in via the login uri if that's specified, or will default to maingrid + mGrid = gSavedSettings.getString("CurrentGrid"); + } + + if(mGrid.empty()) + { + // no grid was specified so default to maingrid + LL_DEBUGS("GridManager") << "Setting grid to MAINGRID as no grid has been specified " << LL_ENDL; + mGrid = MAINGRID; + + } + + // generate a 'grid list' entry for any command line parameter overrides + // or setting overides that we'll add to the grid list or override + // any grid list entries with. + LLSD grid = LLSD::emptyMap(); + + if(mGridList.has(mGrid)) + { + grid = mGridList[mGrid]; + } + else + { + grid[GRID_VALUE] = mGrid; + // add the grid with the additional values, or update the + // existing grid if it exists with the given values + addGrid(grid); + } - gSavedSettings.setS32("ServerChoice", mGridChoice); - gSavedSettings.setString("CustomServer", ""); + LL_DEBUGS("GridManager") << "Selected grid is " << mGrid << LL_ENDL; + setGridChoice(mGrid); + if(mGridList[mGrid][GRID_LOGIN_URI_VALUE].isArray()) + { + llinfos << "is array" << llendl; } } -void LLViewerLogin::setGridChoice(const std::string& grid_name) +LLGridManager::~LLGridManager() { - // Set the grid choice based on a string. - // The string can be: - // - a grid label from the gGridInfo table - // - an ip address - if(!grid_name.empty()) - { - // find the grid choice from the user setting. - int grid_index = GRID_INFO_NONE; - for(;grid_index < GRID_INFO_OTHER; ++grid_index) - { - if(0 == LLStringUtil::compareInsensitive(gGridInfo[grid_index].mLabel, grid_name)) - { - // Founding a matching label in the list... - setGridChoice((EGridInfo)grid_index); - break; - } - } - - if(GRID_INFO_OTHER == grid_index) - { - // *FIX:MEP Can and should we validate that this is an IP address? - mGridChoice = GRID_INFO_OTHER; - mGridName = grid_name; - gSavedSettings.setS32("ServerChoice", mGridChoice); - gSavedSettings.setString("CustomServer", mGridName); - } - } + saveFavorites(); } -void LLViewerLogin::resetURIs() +void LLGridManager::getGridInfo(const std::string &grid, LLSD& grid_info) { - // Clear URIs when picking a new server - gSavedSettings.setLLSD("CmdLineLoginURI", LLSD::emptyArray()); - gSavedSettings.setString("CmdLineHelperURI", ""); + + grid_info = mGridList[grid]; + + // override any grid data with the command line info. + + LLSD cmd_line_login_uri = gSavedSettings.getLLSD("CmdLineLoginURI"); + if (cmd_line_login_uri.isString()) + { + grid_info[GRID_LOGIN_URI_VALUE] = LLSD::emptyArray(); + grid_info[GRID_LOGIN_URI_VALUE].append(cmd_line_login_uri); + } + + // override the helper uri if it was passed in + std::string cmd_line_helper_uri = gSavedSettings.getString("CmdLineHelperURI"); + if(!cmd_line_helper_uri.empty()) + { + grid_info[GRID_HELPER_URI_VALUE] = cmd_line_helper_uri; + } + + // override the login page if it was passed in + std::string cmd_line_login_page = gSavedSettings.getString("LoginPage"); + if(!cmd_line_login_page.empty()) + { + grid_info[GRID_LOGIN_PAGE_VALUE] = cmd_line_login_page; + } } -EGridInfo LLViewerLogin::getGridChoice() const + +// +// LLGridManager::addGrid - add a grid to the grid list, populating the needed values +// if they're not populated yet. +// + +void LLGridManager::addGrid(LLSD& grid_data) { - return mGridChoice; + if (grid_data.isMap() && grid_data.has(GRID_VALUE)) + { + std::string grid = utf8str_tolower(grid_data[GRID_VALUE]); + + // grid should be in the form of a dns address + if (!grid.empty() && + grid.find_first_not_of("abcdefghijklmnopqrstuvwxyz1234567890-_. ") != std::string::npos) + { + printf("grid name: %s", grid.c_str()); + throw LLInvalidGridName(grid); + } + + // populate the other values if they don't exist + if (!grid_data.has(GRID_LABEL_VALUE)) + { + grid_data[GRID_LABEL_VALUE] = grid; + } + if (!grid_data.has(GRID_ID_VALUE)) + { + grid_data[GRID_ID_VALUE] = grid; + } + + // if the grid data doesn't include any of the URIs, then + // generate them from the grid, which should be a dns address + if (!grid_data.has(GRID_LOGIN_URI_VALUE)) + { + grid_data[GRID_LOGIN_URI_VALUE] = LLSD::emptyArray(); + grid_data[GRID_LOGIN_URI_VALUE].append(std::string("https://") + + grid + "/cgi-bin/login.cgi"); + } + // Populate to the default values + if (!grid_data.has(GRID_LOGIN_PAGE_VALUE)) + { + grid_data[GRID_LOGIN_PAGE_VALUE] = std::string("http://") + grid + "/app/login/"; + } + if (!grid_data.has(GRID_HELPER_URI_VALUE)) + { + grid_data[GRID_HELPER_URI_VALUE] = std::string("https://") + grid + "/helpers/"; + } + + if (!grid_data.has(GRID_LOGIN_IDENTIFIER_TYPES)) + { + // non system grids and grids that haven't already been configured with values + // get both types of credentials. + grid_data[GRID_LOGIN_IDENTIFIER_TYPES] = LLSD::emptyArray(); + grid_data[GRID_LOGIN_IDENTIFIER_TYPES].append(CRED_IDENTIFIER_TYPE_AGENT); + grid_data[GRID_LOGIN_IDENTIFIER_TYPES].append(CRED_IDENTIFIER_TYPE_ACCOUNT); + } + + LL_DEBUGS("GridManager") << "ADDING: " << grid << LL_ENDL; + mGridList[grid] = grid_data; + } } -std::string LLViewerLogin::getGridLabel() const +// +// LLGridManager::addSystemGrid - helper for adding a system grid. +void LLGridManager::addSystemGrid(const std::string& label, + const std::string& name, + const std::string& login, + const std::string& helper, + const std::string& login_page, + const std::string& login_id) { - if(mGridChoice == GRID_INFO_NONE) + LLSD grid = LLSD::emptyMap(); + grid[GRID_VALUE] = name; + grid[GRID_LABEL_VALUE] = label; + grid[GRID_HELPER_URI_VALUE] = helper; + grid[GRID_LOGIN_URI_VALUE] = LLSD::emptyArray(); + grid[GRID_LOGIN_URI_VALUE].append(login); + grid[GRID_LOGIN_PAGE_VALUE] = login_page; + grid[GRID_IS_SYSTEM_GRID_VALUE] = TRUE; + grid[GRID_LOGIN_IDENTIFIER_TYPES] = LLSD::emptyArray(); + grid[GRID_LOGIN_IDENTIFIER_TYPES].append(CRED_IDENTIFIER_TYPE_AGENT); + + grid[GRID_APP_SLURL_BASE] = SYSTEM_GRID_APP_SLURL_BASE; + if (login_id.empty()) + { + grid[GRID_ID_VALUE] = name; + } + else + { + grid[GRID_ID_VALUE] = login_id; + } + + // only add the system grids beyond agni to the visible list + // if we're building a debug version. + if (name == std::string(MAINGRID)) { - return "None"; + grid[GRID_SLURL_BASE] = MAIN_GRID_SLURL_BASE; + grid[GRID_IS_FAVORITE_VALUE] = TRUE; } - else if(mGridChoice < GRID_INFO_OTHER) + else { - return gGridInfo[mGridChoice].mLabel; + grid[GRID_SLURL_BASE] = llformat(SYSTEM_GRID_SLURL_BASE, label.c_str()); + } + addGrid(grid); +} + +// return a list of grid name -> grid label mappings for UI purposes +std::map<std::string, std::string> LLGridManager::getKnownGrids(bool favorite_only) +{ + std::map<std::string, std::string> result; + for(LLSD::map_iterator grid_iter = mGridList.beginMap(); + grid_iter != mGridList.endMap(); + grid_iter++) + { + if(!favorite_only || grid_iter->second.has(GRID_IS_FAVORITE_VALUE)) + { + result[grid_iter->first] = grid_iter->second[GRID_LABEL_VALUE].asString(); + } } - return mGridName; + return result; } -std::string LLViewerLogin::getKnownGridLabel(EGridInfo grid_index) const + +void LLGridManager::setGridChoice(const std::string& grid) { - if(grid_index > GRID_INFO_NONE && grid_index < GRID_INFO_OTHER) + // Set the grid choice based on a string. + // The string can be: + // - a grid label from the gGridInfo table + // - a hostname + // - an ip address + + // loop through. We could do just a hash lookup but we also want to match + // on label + std::string grid_name = grid; + if(!mGridList.has(grid_name)) + { + // case insensitive + grid_name = getGridByLabel(grid); + } + + if(grid_name.empty()) { - return gGridInfo[grid_index].mLabel; + // the grid was not in the list of grids. + LLSD grid_data = LLSD::emptyMap(); + grid_data[GRID_VALUE] = grid; + addGrid(grid_data); } - return gGridInfo[GRID_INFO_NONE].mLabel; + mGrid = grid; + gSavedSettings.setString("CurrentGrid", grid); } -void LLViewerLogin::getLoginURIs(std::vector<std::string>& uris) const +std::string LLGridManager::getGridByLabel( const std::string &grid_label, bool case_sensitive) { - // return the login uri set on the command line. - LLControlVariable* c = gSavedSettings.getControl("CmdLineLoginURI"); - if(c) + for(LLSD::map_iterator grid_iter = mGridList.beginMap(); + grid_iter != mGridList.endMap(); + grid_iter++) { - LLSD v = c->getValue(); - if(v.isArray()) + if (grid_iter->second.has(GRID_LABEL_VALUE)) { - for(LLSD::array_const_iterator itr = v.beginArray(); - itr != v.endArray(); ++itr) + if (0 == (case_sensitive?LLStringUtil::compareStrings(grid_label, grid_iter->second[GRID_LABEL_VALUE].asString()): + LLStringUtil::compareInsensitive(grid_label, grid_iter->second[GRID_LABEL_VALUE].asString()))) { - std::string uri = itr->asString(); - if(!uri.empty()) - { - uris.push_back(uri); - } - } - } - else - { - std::string uri = v.asString(); - if(!uri.empty()) - { - uris.push_back(uri); + return grid_iter->first; } } } + return std::string(); +} - // If there was no command line uri... - if(uris.empty()) +void LLGridManager::getLoginURIs(std::vector<std::string>& uris) +{ + uris.clear(); + LLSD cmd_line_login_uri = gSavedSettings.getLLSD("CmdLineLoginURI"); + if (cmd_line_login_uri.isString()) + { + uris.push_back(cmd_line_login_uri); + return; + } + for (LLSD::array_iterator llsd_uri = mGridList[mGrid][GRID_LOGIN_URI_VALUE].beginArray(); + llsd_uri != mGridList[mGrid][GRID_LOGIN_URI_VALUE].endArray(); + llsd_uri++) { - // If its a known grid choice, get the uri from the table, - // else try the grid name. - if(mGridChoice > GRID_INFO_NONE && mGridChoice < GRID_INFO_OTHER) - { - uris.push_back(gGridInfo[mGridChoice].mLoginURI); - } - else - { - uris.push_back(mGridName); - } + uris.push_back(llsd_uri->asString()); } } -std::string LLViewerLogin::getHelperURI() const +std::string LLGridManager::getHelperURI() { - std::string helper_uri = gSavedSettings.getString("CmdLineHelperURI"); - if (helper_uri.empty()) + std::string cmd_line_helper_uri = gSavedSettings.getString("CmdLineHelperURI"); + if(!cmd_line_helper_uri.empty()) { - // grab URI from selected grid - if(mGridChoice > GRID_INFO_NONE && mGridChoice < GRID_INFO_OTHER) - { - helper_uri = gGridInfo[mGridChoice].mHelperURI; - } - - if (helper_uri.empty()) - { - // what do we do with unnamed/miscellaneous grids? - // for now, operations that rely on the helper URI (currency/land purchasing) will fail - } + return cmd_line_helper_uri; } - return helper_uri; + return mGridList[mGrid][GRID_HELPER_URI_VALUE]; +} + +std::string LLGridManager::getLoginPage() +{ + // override the login page if it was passed in + std::string cmd_line_login_page = gSavedSettings.getString("LoginPage"); + if(!cmd_line_login_page.empty()) + { + return cmd_line_login_page; + } + + return mGridList[mGrid][GRID_LOGIN_PAGE_VALUE]; } -bool LLViewerLogin::isInProductionGrid() +bool LLGridManager::isInProductionGrid() { // *NOTE:Mani This used to compare GRID_INFO_AGNI to gGridChoice, // but it seems that loginURI trumps that. std::vector<std::string> uris; getLoginURIs(uris); + if (uris.size() < 1) + { + return 1; + } LLStringUtil::toLower(uris[0]); if((uris[0].find("agni") != std::string::npos)) { @@ -339,3 +577,51 @@ bool LLViewerLogin::isInProductionGrid() return false; } + +void LLGridManager::saveFavorites() +{ + // filter out just those marked as favorites + LLSD output_grid_list = LLSD::emptyMap(); + for(LLSD::map_iterator grid_iter = mGridList.beginMap(); + grid_iter != mGridList.endMap(); + grid_iter++) + { + if(grid_iter->second.has(GRID_IS_FAVORITE_VALUE)) + { + output_grid_list[grid_iter->first] = grid_iter->second; + } + } + llofstream llsd_xml; + llsd_xml.open( mGridFile.c_str(), std::ios::out | std::ios::binary); + LLSDSerialize::toPrettyXML(output_grid_list, llsd_xml); + llsd_xml.close(); +} + + +// build a slurl for the given region within the selected grid +std::string LLGridManager::getSLURLBase(const std::string& grid) +{ + std::string grid_base; + if(mGridList.has(grid) && mGridList[grid].has(GRID_SLURL_BASE)) + { + return mGridList[grid][GRID_SLURL_BASE].asString(); + } + else + { + return llformat(DEFAULT_SLURL_BASE, grid.c_str()); + } +} + +// build a slurl for the given region within the selected grid +std::string LLGridManager::getAppSLURLBase(const std::string& grid) +{ + std::string grid_base; + if(mGridList.has(grid) && mGridList[grid].has(GRID_APP_SLURL_BASE)) + { + return mGridList[grid][GRID_APP_SLURL_BASE].asString(); + } + else + { + return llformat(DEFAULT_APP_SLURL_BASE, grid.c_str()); + } +} diff --git a/indra/newview/llviewernetwork.h b/indra/newview/llviewernetwork.h index edae6dc47b..8c3a15b7cf 100644 --- a/indra/newview/llviewernetwork.h +++ b/indra/newview/llviewernetwork.h @@ -5,7 +5,7 @@ * * $LicenseInfo:firstyear=2006&license=viewergpl$ * - * Copyright (c) 2006-2009, Linden Research, Inc. + * Copyright (c) 2006-2010, Linden Research, Inc. * * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab @@ -13,13 +13,12 @@ * ("GPL"), unless you have obtained a separate licensing agreement * ("Other License"), formally executed by you and Linden Lab. Terms of * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * online at http://secondlife.com/developers/opensource/gplv2 * * There are special exceptions to the terms and conditions of the GPL as * it is applied to this Source Code. View the full text of the exception * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * online at http://secondlife.com/developers/opensource/flossexception * * By copying, modifying or distributing this software, you acknowledge * that you have read and understood your obligations described above, @@ -33,83 +32,124 @@ #ifndef LL_LLVIEWERNETWORK_H #define LL_LLVIEWERNETWORK_H + +extern const char* DEFAULT_LOGIN_PAGE; + +#define GRID_VALUE "name" +#define GRID_LABEL_VALUE "label" +#define GRID_ID_VALUE "grid_login_id" +#define GRID_LOGIN_URI_VALUE "login_uri" +#define GRID_HELPER_URI_VALUE "helper_uri" +#define GRID_LOGIN_PAGE_VALUE "login_page" +#define GRID_IS_SYSTEM_GRID_VALUE "system_grid" +#define GRID_IS_FAVORITE_VALUE "favorite" +#define MAINGRID "util.agni.lindenlab.com" +#define GRID_LOGIN_IDENTIFIER_TYPES "login_identifier_types" +// defines slurl formats associated with various grids. +// we need to continue to support existing forms, as slurls +// are shared between viewers that may not understand newer +// forms. +#define GRID_SLURL_BASE "slurl_base" +#define GRID_APP_SLURL_BASE "app_slurl_base" -#include <boost/scoped_ptr.hpp> - -class LLHost; -class LLLogin; - -enum EGridInfo +class LLInvalidGridName { - GRID_INFO_NONE, - GRID_INFO_ADITI, - GRID_INFO_AGNI, - GRID_INFO_ARUNA, - GRID_INFO_BHARATI, - GRID_INFO_CHANDRA, - GRID_INFO_DAMBALLAH, - GRID_INFO_DANU, - GRID_INFO_DURGA, - GRID_INFO_GANGA, - GRID_INFO_MITRA, - GRID_INFO_MOHINI, - GRID_INFO_NANDI, - GRID_INFO_PARVATI, - GRID_INFO_RADHA, - GRID_INFO_RAVI, - GRID_INFO_SIVA, - GRID_INFO_SHAKTI, - GRID_INFO_SKANDA, - GRID_INFO_SOMA, - GRID_INFO_UMA, - GRID_INFO_VAAK, - GRID_INFO_YAMI, - GRID_INFO_LOCAL, - GRID_INFO_OTHER, // IP address set via command line option - GRID_INFO_COUNT +public: + LLInvalidGridName(std::string grid) : mGrid(grid) + { + } +protected: + std::string mGrid; }; + /** - * @brief A class to manage the viewer's login state. + * @brief A class to manage the grids available to the viewer + * including persistance. This class also maintains the currently + * selected grid. * **/ -class LLViewerLogin : public LLSingleton<LLViewerLogin> +class LLGridManager : public LLSingleton<LLGridManager> { public: - LLViewerLogin(); - ~LLViewerLogin(); - - void setGridChoice(EGridInfo grid); - void setGridChoice(const std::string& grid_name); - void resetURIs(); + + // when the grid manager is instantiated, the default grids are automatically + // loaded, and the grids favorites list is loaded from the xml file. + LLGridManager(const std::string& grid_file); + LLGridManager(); + ~LLGridManager(); + + void initialize(const std::string& grid_file); + // grid list management + + // add a grid to the list of grids + void addGrid(LLSD& grid_info); - /** - * @brief Get the enumeration of the grid choice. - * Should only return values > 0 && < GRID_INFO_COUNT - **/ - EGridInfo getGridChoice() const; - - /** - * @brief Get a readable label for the grid choice. - * Returns the readable name for the grid choice. - * If the grid is 'other', returns something - * the string used to specifiy the grid. - **/ - std::string getGridLabel() const; - - std::string getKnownGridLabel(EGridInfo grid_index) const; - - void getLoginURIs(std::vector<std::string>& uris) const; - std::string getHelperURI() const; + // retrieve a map of grid-name <-> label + // by default only return the user visible grids + std::map<std::string, std::string> getKnownGrids(bool favorites_only=FALSE); + + void getGridInfo(const std::string& grid, LLSD &grid_info); + + // current grid management + // select a given grid as the current grid. If the grid + // is not a known grid, then it's assumed to be a dns name for the + // grid, and the various URIs will be automatically generated. + void setGridChoice(const std::string& grid); + + + std::string getGridLabel() { return mGridList[mGrid][GRID_LABEL_VALUE]; } + std::string getGrid() const { return mGrid; } + void getLoginURIs(std::vector<std::string>& uris); + std::string getHelperURI(); + std::string getLoginPage(); + std::string getGridLoginID() { return mGridList[mGrid][GRID_ID_VALUE]; } + std::string getLoginPage(const std::string& grid) { return mGridList[grid][GRID_LOGIN_PAGE_VALUE]; } + void getLoginIdentifierTypes(LLSD& idTypes) { idTypes = mGridList[mGrid][GRID_LOGIN_IDENTIFIER_TYPES]; } + + // build a slurl for the given region within the selected grid + std::string getSLURLBase(const std::string& grid); + std::string getSLURLBase() { return getSLURLBase(mGrid); } + + std::string getAppSLURLBase(const std::string& grid); + std::string getAppSLURLBase() { return getAppSLURLBase(mGrid); } + + void getGridInfo(LLSD &grid_info) { getGridInfo(mGrid, grid_info); } + + std::string getGridByLabel( const std::string &grid_label, bool case_sensitive = false); + + bool isSystemGrid(const std::string& grid) + { + return mGridList.has(grid) && + mGridList[grid].has(GRID_IS_SYSTEM_GRID_VALUE) && + mGridList[grid][GRID_IS_SYSTEM_GRID_VALUE].asBoolean(); + } + bool isSystemGrid() { return isSystemGrid(mGrid); } + // Mark this grid as a favorite that should be persisited on 'save' + // this is currently used to persist a grid after a successful login + void setFavorite() { mGridList[mGrid][GRID_IS_FAVORITE_VALUE] = TRUE; } + bool isInProductionGrid(); + void saveFavorites(); + void clearFavorites(); + +protected: -private: - EGridInfo mGridChoice; - std::string mGridName; + // helper function for adding the predefined grids + void addSystemGrid(const std::string& label, + const std::string& name, + const std::string& login, + const std::string& helper, + const std::string& login_page, + const std::string& login_id = ""); + + + std::string mGrid; + std::string mGridFile; + LLSD mGridList; }; const S32 MAC_ADDRESS_BYTES = 6; -extern unsigned char gMACAddress[MAC_ADDRESS_BYTES]; /* Flawfinder: ignore */ #endif diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 886f1d9ef5..ee89680fea 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -46,6 +46,7 @@ #include "llfontgl.h" #include "llframetimer.h" #include "llinventory.h" +#include "llinventorydefines.h" #include "llmaterialtable.h" #include "llmutelist.h" #include "llnamevalue.h" @@ -60,6 +61,7 @@ #include "llaudiosourcevo.h" #include "llagent.h" +#include "llagentcamera.h" #include "llbbox.h" #include "llbox.h" #include "llcylinder.h" @@ -133,7 +135,15 @@ LLViewerObject *LLViewerObject::createObject(const LLUUID &id, const LLPCode pco { if (id == gAgentID) { - res = new LLVOAvatarSelf(id, pcode, regionp); + if (!gAgentAvatarp) + { + gAgentAvatarp = new LLVOAvatarSelf(id, pcode, regionp); + } + else + { + gAgentAvatarp->updateRegion(regionp); + } + res = gAgentAvatarp; } else { @@ -222,7 +232,7 @@ LLViewerObject::LLViewerObject(const LLUUID &id, const LLPCode pcode, LLViewerRe mClickAction(0), mAttachmentItemID(LLUUID::null) { - if(!is_global) + if (!is_global) { llassert(mRegionp); } @@ -234,7 +244,7 @@ LLViewerObject::LLViewerObject(const LLUUID &id, const LLPCode pcode, LLViewerRe mPositionRegion = LLVector3(0.f, 0.f, 0.f); - if(!is_global) + if (!is_global && mRegionp) { mPositionAgent = mRegionp->getOriginAgent(); } @@ -376,11 +386,10 @@ void LLViewerObject::markDead() if (flagAnimSource()) { - LLVOAvatar* avatarp = gAgent.getAvatarObject(); - if (avatarp && !avatarp->isDead()) + if (isAgentAvatarValid()) { // stop motions associated with this object - avatarp->stopMotionFromSource(mID); + gAgentAvatarp->stopMotionFromSource(mID); } } @@ -2001,6 +2010,9 @@ BOOL LLViewerObject::isActive() const BOOL LLViewerObject::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) { + static LLFastTimer::DeclareTimer ftm("Viewer Object"); + LLFastTimer t(ftm); + if (mDead) { // It's dead. Don't update it. @@ -2166,8 +2178,8 @@ void LLViewerObject::deleteInventoryItem(const LLUUID& item_id) { if(mInventory) { - InventoryObjectList::iterator it = mInventory->begin(); - InventoryObjectList::iterator end = mInventory->end(); + LLInventoryObject::object_list_t::iterator it = mInventory->begin(); + LLInventoryObject::object_list_t::iterator end = mInventory->end(); for( ; it != end; ++it ) { if((*it)->getUUID() == item_id) @@ -2477,7 +2489,7 @@ void LLViewerObject::processTaskInv(LLMessageSystem* msg, void** user_data) } else { - object->mInventory = new InventoryObjectList(); + object->mInventory = new LLInventoryObject::object_list_t(); } LLPointer<LLInventoryObject> obj; obj = new LLInventoryObject(object->mID, LLUUID::null, @@ -2533,7 +2545,7 @@ void LLViewerObject::loadTaskInvFile(const std::string& filename) } else { - mInventory = new InventoryObjectList; + mInventory = new LLInventoryObject::object_list_t; } while(ifs.good()) { @@ -2666,8 +2678,8 @@ LLInventoryObject* LLViewerObject::getInventoryObject(const LLUUID& item_id) LLInventoryObject* rv = NULL; if(mInventory) { - InventoryObjectList::iterator it = mInventory->begin(); - InventoryObjectList::iterator end = mInventory->end(); + LLInventoryObject::object_list_t::iterator it = mInventory->begin(); + LLInventoryObject::object_list_t::iterator end = mInventory->end(); for ( ; it != end; ++it) { if((*it)->getUUID() == item_id) @@ -2680,12 +2692,12 @@ LLInventoryObject* LLViewerObject::getInventoryObject(const LLUUID& item_id) return rv; } -void LLViewerObject::getInventoryContents(InventoryObjectList& objects) +void LLViewerObject::getInventoryContents(LLInventoryObject::object_list_t& objects) { if(mInventory) { - InventoryObjectList::iterator it = mInventory->begin(); - InventoryObjectList::iterator end = mInventory->end(); + LLInventoryObject::object_list_t::iterator it = mInventory->begin(); + LLInventoryObject::object_list_t::iterator end = mInventory->end(); for( ; it != end; ++it) { if ((*it)->getType() != LLAssetType::AT_CATEGORY) @@ -2715,8 +2727,8 @@ LLViewerInventoryItem* LLViewerObject::getInventoryItemByAsset(const LLUUID& ass { LLViewerInventoryItem* item = NULL; - InventoryObjectList::iterator it = mInventory->begin(); - InventoryObjectList::iterator end = mInventory->end(); + LLInventoryObject::object_list_t::iterator it = mInventory->begin(); + LLInventoryObject::object_list_t::iterator end = mInventory->end(); for( ; it != end; ++it) { LLInventoryObject* obj = *it; @@ -2754,7 +2766,7 @@ void LLViewerObject::setPixelAreaAndAngle(LLAgent &agent) return; } - LLVector3 viewer_pos_agent = agent.getCameraPositionAgent(); + LLVector3 viewer_pos_agent = gAgentCamera.getCameraPositionAgent(); LLVector3 pos_agent = getRenderPosition(); F32 dx = viewer_pos_agent.mV[VX] - pos_agent.mV[VX]; @@ -4019,9 +4031,15 @@ LLBBox LLViewerObject::getBoundingBoxAgent() const { LLVector3 position_agent; LLQuaternion rot; + LLViewerObject* avatar_parent = NULL; LLViewerObject* root_edit = (LLViewerObject*)getRootEdit(); - LLViewerObject* avatar_parent = (LLViewerObject*)root_edit->getParent(); - if (avatar_parent && avatar_parent->isAvatar() && root_edit->mDrawable.notNull()) + if (root_edit) + { + avatar_parent = (LLViewerObject*)root_edit->getParent(); + } + + if (avatar_parent && avatar_parent->isAvatar() && + root_edit && root_edit->mDrawable.notNull() && root_edit->mDrawable->getXform()->getParent()) { LLXform* parent_xform = root_edit->mDrawable->getXform()->getParent(); position_agent = (getPositionEdit() * parent_xform->getWorldRotation()) + parent_xform->getWorldPosition(); @@ -4072,8 +4090,8 @@ S32 LLViewerObject::countInventoryContents(LLAssetType::EType type) S32 count = 0; if( mInventory ) { - InventoryObjectList::const_iterator it = mInventory->begin(); - InventoryObjectList::const_iterator end = mInventory->end(); + LLInventoryObject::object_list_t::const_iterator it = mInventory->begin(); + LLInventoryObject::object_list_t::const_iterator end = mInventory->end(); for( ; it != end ; ++it ) { if( (*it)->getType() == type ) @@ -4709,7 +4727,7 @@ BOOL LLViewerObject::permYouOwner() const return TRUE; #else # ifdef TOGGLE_HACKED_GODLIKE_VIEWER - if (!LLViewerLogin::getInstance()->isInProductionGrid() + if (!LLGridManager::getInstance()->isInProductionGrid() && (gAgent.getGodLevel() >= GOD_MAINTENANCE)) { return TRUE; @@ -4746,7 +4764,7 @@ BOOL LLViewerObject::permOwnerModify() const return TRUE; #else # ifdef TOGGLE_HACKED_GODLIKE_VIEWER - if (!LLViewerLogin::getInstance()->isInProductionGrid() + if (!LLGridManager::getInstance()->isInProductionGrid() && (gAgent.getGodLevel() >= GOD_MAINTENANCE)) { return TRUE; @@ -4770,7 +4788,7 @@ BOOL LLViewerObject::permModify() const return TRUE; #else # ifdef TOGGLE_HACKED_GODLIKE_VIEWER - if (!LLViewerLogin::getInstance()->isInProductionGrid() + if (!LLGridManager::getInstance()->isInProductionGrid() && (gAgent.getGodLevel() >= GOD_MAINTENANCE)) { return TRUE; @@ -4794,7 +4812,7 @@ BOOL LLViewerObject::permCopy() const return TRUE; #else # ifdef TOGGLE_HACKED_GODLIKE_VIEWER - if (!LLViewerLogin::getInstance()->isInProductionGrid() + if (!LLGridManager::getInstance()->isInProductionGrid() && (gAgent.getGodLevel() >= GOD_MAINTENANCE)) { return TRUE; @@ -4818,7 +4836,7 @@ BOOL LLViewerObject::permMove() const return TRUE; #else # ifdef TOGGLE_HACKED_GODLIKE_VIEWER - if (!LLViewerLogin::getInstance()->isInProductionGrid() + if (!LLGridManager::getInstance()->isInProductionGrid() && (gAgent.getGodLevel() >= GOD_MAINTENANCE)) { return TRUE; @@ -4842,7 +4860,7 @@ BOOL LLViewerObject::permTransfer() const return TRUE; #else # ifdef TOGGLE_HACKED_GODLIKE_VIEWER - if (!LLViewerLogin::getInstance()->isInProductionGrid() + if (!LLGridManager::getInstance()->isInProductionGrid() && (gAgent.getGodLevel() >= GOD_MAINTENANCE)) { return TRUE; @@ -4910,7 +4928,6 @@ void LLViewerObject::setIncludeInSearch(bool include_in_search) void LLViewerObject::setRegion(LLViewerRegion *regionp) { - llassert(regionp); mLatestRecvPacketID = 0; mRegionp = regionp; diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h index 266c40d493..be83fb7ef8 100644 --- a/indra/newview/llviewerobject.h +++ b/indra/newview/llviewerobject.h @@ -88,7 +88,7 @@ typedef enum e_object_update_type // callback typedef for inventory typedef void (*inventory_callback)(LLViewerObject*, - InventoryObjectList*, + LLInventoryObject::object_list_t*, S32 serial_num, void*); @@ -409,7 +409,7 @@ public: void updateInventory(LLViewerInventoryItem* item, U8 key, bool is_new); void updateInventoryLocal(LLInventoryItem* item, U8 key); // Update without messaging. LLInventoryObject* getInventoryObject(const LLUUID& item_id); - void getInventoryContents(InventoryObjectList& objects); + void getInventoryContents(LLInventoryObject::object_list_t& objects); LLInventoryObject* getInventoryRoot(); LLViewerInventoryItem* getInventoryItemByAsset(const LLUUID& asset_id); S16 getInventorySerial() const { return mInventorySerialNum; } @@ -629,7 +629,7 @@ protected: F32 mPixelArea; // Apparent area in pixels // This is the object's inventory from the viewer's perspective. - InventoryObjectList* mInventory; + LLInventoryObject::object_list_t* mInventory; class LLInventoryCallbackInfo { public: diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp index 96828ee1b6..752aeaaab0 100644 --- a/indra/newview/llviewerobjectlist.cpp +++ b/indra/newview/llviewerobjectlist.cpp @@ -47,6 +47,7 @@ #include "llviewerwindow.h" #include "llnetmap.h" #include "llagent.h" +#include "llagentcamera.h" #include "pipeline.h" #include "llspatialpartition.h" #include "lltooltip.h" @@ -93,7 +94,7 @@ extern LLPipeline gPipeline; // Statics for object lookup tables. U32 LLViewerObjectList::sSimulatorMachineIndex = 1; // Not zero deliberately, to speed up index check. -LLMap<U64, U32> LLViewerObjectList::sIPAndPortToIndex; +std::map<U64, U32> LLViewerObjectList::sIPAndPortToIndex; std::map<U64, LLUUID> LLViewerObjectList::sIndexAndLocalIDToUUID; LLViewerObjectList::LLViewerObjectList() @@ -288,7 +289,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, LLMemType mt(LLMemType::MTYPE_OBJECT_PROCESS_UPDATE); LLFastTimer t(FTM_PROCESS_OBJECTS); - LLVector3d camera_global = gAgent.getCameraPositionGlobal(); + LLVector3d camera_global = gAgentCamera.getCameraPositionGlobal(); LLViewerObject *objectp; S32 num_objects; U32 local_id; @@ -473,7 +474,6 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, if (objectp->getRegion() != regionp) { // Object changed region, so update it - objectp->setRegion(regionp); objectp->updateRegion(regionp); // for LLVOAvatar } } @@ -571,10 +571,9 @@ void LLViewerObjectList::processCachedObjectUpdate(LLMessageSystem *mesgsys, void LLViewerObjectList::dirtyAllObjectInventory() { - S32 count = mObjects.count(); - for(S32 i = 0; i < count; ++i) + for (vobj_list_t::iterator iter = mObjects.begin(); iter != mObjects.end(); ++iter) { - mObjects[i]->dirtyInventory(); + (*iter)->dirtyInventory(); } } @@ -587,14 +586,14 @@ void LLViewerObjectList::updateApparentAngles(LLAgent &agent) S32 num_updates, max_value; if (NUM_BINS - 1 == mCurBin) { - num_updates = mObjects.count() - mCurLazyUpdateIndex; - max_value = mObjects.count(); + num_updates = (S32) mObjects.size() - mCurLazyUpdateIndex; + max_value = (S32) mObjects.size(); gTextureList.setUpdateStats(TRUE); } else { - num_updates = (mObjects.count() / NUM_BINS) + 1; - max_value = llmin(mObjects.count(), mCurLazyUpdateIndex + num_updates); + num_updates = ((S32) mObjects.size() / NUM_BINS) + 1; + max_value = llmin((S32) mObjects.size(), mCurLazyUpdateIndex + num_updates); } @@ -615,7 +614,7 @@ void LLViewerObjectList::updateApparentAngles(LLAgent &agent) } // Focused - objectp = gAgent.getFocusObject(); + objectp = gAgentCamera.getFocusObject(); if (objectp) { objectp->boostTexturePriority(); @@ -647,7 +646,7 @@ void LLViewerObjectList::updateApparentAngles(LLAgent &agent) } mCurLazyUpdateIndex = max_value; - if (mCurLazyUpdateIndex == mObjects.count()) + if (mCurLazyUpdateIndex == mObjects.size()) { mCurLazyUpdateIndex = 0; } @@ -694,20 +693,26 @@ void LLViewerObjectList::update(LLAgent &agent, LLWorld &world) // Make a copy of the list in case something in idleUpdate() messes with it std::vector<LLViewerObject*> idle_list; - idle_list.reserve( mActiveObjects.size() ); + + static LLFastTimer::DeclareTimer idle_copy("Idle Copy"); - for (std::set<LLPointer<LLViewerObject> >::iterator active_iter = mActiveObjects.begin(); - active_iter != mActiveObjects.end(); active_iter++) { - objectp = *active_iter; - if (objectp) + LLFastTimer t(idle_copy); + idle_list.reserve( mActiveObjects.size() ); + + for (std::set<LLPointer<LLViewerObject> >::iterator active_iter = mActiveObjects.begin(); + active_iter != mActiveObjects.end(); active_iter++) { - idle_list.push_back( objectp ); - } - else - { // There shouldn't be any NULL pointers in the list, but they have caused - // crashes before. This may be idleUpdate() messing with the list. - llwarns << "LLViewerObjectList::update has a NULL objectp" << llendl; + objectp = *active_iter; + if (objectp) + { + idle_list.push_back( objectp ); + } + else + { // There shouldn't be any NULL pointers in the list, but they have caused + // crashes before. This may be idleUpdate() messing with the list. + llwarns << "LLViewerObjectList::update has a NULL objectp" << llendl; + } } } @@ -807,7 +812,7 @@ void LLViewerObjectList::update(LLAgent &agent, LLWorld &world) } */ - LLViewerStats::getInstance()->mNumObjectsStat.addValue(mObjects.count()); + LLViewerStats::getInstance()->mNumObjectsStat.addValue((S32) mObjects.size()); LLViewerStats::getInstance()->mNumActiveObjectsStat.addValue(num_active_objects); LLViewerStats::getInstance()->mNumSizeCulledStat.addValue(mNumSizeCulled); LLViewerStats::getInstance()->mNumVisCulledStat.addValue(mNumVisCulled); @@ -815,9 +820,9 @@ void LLViewerObjectList::update(LLAgent &agent, LLWorld &world) void LLViewerObjectList::clearDebugText() { - for (S32 i = 0; i < mObjects.count(); i++) + for (vobj_list_t::iterator iter = mObjects.begin(); iter != mObjects.end(); ++iter) { - mObjects[i]->setDebugText(""); + (*iter)->setDebugText(""); } } @@ -856,7 +861,7 @@ void LLViewerObjectList::cleanupReferences(LLViewerObject *objectp) if (objectp->isOnMap()) { - mMapObjects.removeObj(objectp); + removeFromMap(objectp); } // Don't clean up mObject references, these will be cleaned up more efficiently later! @@ -889,6 +894,13 @@ void LLViewerObjectList::removeDrawable(LLDrawable* drawablep) BOOL LLViewerObjectList::killObject(LLViewerObject *objectp) { + // Don't ever kill gAgentAvatarp, just mark it as null region instead. + if (objectp == gAgentAvatarp) + { + objectp->setRegion(NULL); + return FALSE; + } + // When we're killing objects, all we do is mark them as dead. // We clean up the dead objects later. @@ -913,10 +925,10 @@ void LLViewerObjectList::killObjects(LLViewerRegion *regionp) { LLViewerObject *objectp; - S32 i; - for (i = 0; i < mObjects.count(); i++) + + for (vobj_list_t::iterator iter = mObjects.begin(); iter != mObjects.end(); ++iter) { - objectp = mObjects[i]; + objectp = *iter; if (objectp->mRegionp == regionp) { @@ -933,19 +945,19 @@ void LLViewerObjectList::killAllObjects() // Used only on global destruction. LLViewerObject *objectp; - for (S32 i = 0; i < mObjects.count(); i++) + for (vobj_list_t::iterator iter = mObjects.begin(); iter != mObjects.end(); ++iter) { - objectp = mObjects[i]; - + objectp = *iter; killObject(objectp); - llassert(objectp->isDead()); + // Object must be dead, or it's the LLVOAvatarSelf which never dies. + llassert((objectp == gAgentAvatarp) || objectp->isDead()); } cleanDeadObjects(FALSE); if(!mObjects.empty()) { - llwarns << "LLViewerObjectList::killAllObjects still has entries in mObjects: " << mObjects.count() << llendl; + llwarns << "LLViewerObjectList::killAllObjects still has entries in mObjects: " << mObjects.size() << llendl; mObjects.clear(); } @@ -970,16 +982,15 @@ void LLViewerObjectList::cleanDeadObjects(BOOL use_timer) return; } - S32 i = 0; S32 num_removed = 0; LLViewerObject *objectp; - while (i < mObjects.count()) + for (vobj_list_t::iterator iter = mObjects.begin(); iter != mObjects.end(); ) { // Scan for all of the dead objects and remove any "global" references to them. - objectp = mObjects[i]; + objectp = *iter; if (objectp->isDead()) { - mObjects.remove(i); + iter = mObjects.erase(iter); num_removed++; if (num_removed == mNumDeadObjects) @@ -990,8 +1001,7 @@ void LLViewerObjectList::cleanDeadObjects(BOOL use_timer) } else { - // iterate, this isn't a dead object. - i++; + ++iter; } } @@ -1041,12 +1051,11 @@ void LLViewerObjectList::shiftObjects(const LLVector3 &offset) } LLViewerObject *objectp; - S32 i; - for (i = 0; i < mObjects.count(); i++) + for (vobj_list_t::iterator iter = mObjects.begin(); iter != mObjects.end(); ++iter) { - objectp = getObject(i); + objectp = *iter; // There could be dead objects on the object list, so don't update stuff if the object is dead. - if (objectp) + if (!objectp->isDead()) { objectp->updatePositionCaches(); @@ -1076,9 +1085,9 @@ void LLViewerObjectList::renderObjectsForMap(LLNetMap &netmap) F32 max_radius = gSavedSettings.getF32("MiniMapPrimMaxRadius"); - for (S32 i = 0; i < mMapObjects.count(); i++) + for (vobj_list_t::iterator iter = mMapObjects.begin(); iter != mMapObjects.end(); ++iter) { - LLViewerObject* objectp = mMapObjects[i]; + LLViewerObject* objectp = *iter; if (!objectp->getRegion() || objectp->isOrphaned() || objectp->isAttachment()) { continue; @@ -1144,21 +1153,14 @@ void LLViewerObjectList::renderObjectBounds(const LLVector3 ¢er) { } -void LLViewerObjectList::renderObjectsForSelect(LLCamera &camera, const LLRect& screen_rect, BOOL pick_parcel_wall, BOOL render_transparent) -{ - generatePickList(camera); - renderPickList(screen_rect, pick_parcel_wall, render_transparent); -} - void LLViewerObjectList::generatePickList(LLCamera &camera) { LLViewerObject *objectp; S32 i; // Reset all of the GL names to zero. - for (i = 0; i < mObjects.count(); i++) + for (vobj_list_t::iterator iter = mObjects.begin(); iter != mObjects.end(); ++iter) { - objectp = mObjects[i]; - objectp->mGLName = 0; + (*iter)->mGLName = 0; } mSelectPickList.clear(); @@ -1215,11 +1217,10 @@ void LLViewerObjectList::generatePickList(LLCamera &camera) } // add all hud objects to pick list - LLVOAvatar* avatarp = gAgent.getAvatarObject(); - if (avatarp) + if (isAgentAvatarValid()) { - for (LLVOAvatar::attachment_map_t::iterator iter = avatarp->mAttachmentPoints.begin(); - iter != avatarp->mAttachmentPoints.end(); ) + for (LLVOAvatar::attachment_map_t::iterator iter = gAgentAvatarp->mAttachmentPoints.begin(); + iter != gAgentAvatarp->mAttachmentPoints.end(); ) { LLVOAvatar::attachment_map_t::iterator curiter = iter++; LLViewerJointAttachment* attachment = curiter->second; @@ -1287,7 +1288,7 @@ void LLViewerObjectList::renderPickList(const LLRect& screen_rect, BOOL pick_par gViewerWindow->renderSelections( TRUE, pick_parcel_wall, FALSE ); //fix for DEV-19335. Don't pick hud objects when customizing avatar (camera mode doesn't play nice with nametags). - if (!gAgent.cameraCustomizeAvatar()) + if (!gAgentCamera.cameraCustomizeAvatar()) { // render pickable ui elements, like names, etc. LLHUDObject::renderAllForSelect(); @@ -1321,17 +1322,19 @@ void LLViewerObjectList::addDebugBeacon(const LLVector3 &pos_agent, const LLColor4 &text_color, S32 line_width) { - LLDebugBeacon *beaconp = mDebugBeacons.reserve_block(1); - beaconp->mPositionAgent = pos_agent; - beaconp->mString = string; - beaconp->mColor = color; - beaconp->mTextColor = text_color; - beaconp->mLineWidth = line_width; + LLDebugBeacon beacon; + beacon.mPositionAgent = pos_agent; + beacon.mString = string; + beacon.mColor = color; + beacon.mTextColor = text_color; + beacon.mLineWidth = line_width; + + mDebugBeacons.push_back(beacon); } void LLViewerObjectList::resetObjectBeacons() { - mDebugBeacons.reset(); + mDebugBeacons.clear(); } LLViewerObject *LLViewerObjectList::createObjectViewer(const LLPCode pcode, LLViewerRegion *regionp) @@ -1349,7 +1352,7 @@ LLViewerObject *LLViewerObjectList::createObjectViewer(const LLPCode pcode, LLVi mUUIDObjectMap[fullid] = objectp; - mObjects.put(objectp); + mObjects.push_back(objectp); updateActive(objectp); @@ -1388,7 +1391,7 @@ LLViewerObject *LLViewerObjectList::createObject(const LLPCode pcode, LLViewerRe gMessageSystem->getSenderIP(), gMessageSystem->getSenderPort()); - mObjects.put(objectp); + mObjects.push_back(objectp); updateActive(objectp); @@ -1411,11 +1414,11 @@ LLViewerObject *LLViewerObjectList::replaceObject(const LLUUID &id, const LLPCod S32 LLViewerObjectList::findReferences(LLDrawable *drawablep) const { LLViewerObject *objectp; - S32 i; S32 num_refs = 0; - for (i = 0; i < mObjects.count(); i++) + + for (vobj_list_t::const_iterator iter = mObjects.begin(); iter != mObjects.end(); ++iter) { - objectp = mObjects[i]; + objectp = *iter; if (objectp->mDrawable.notNull()) { num_refs += objectp->mDrawable->findReferences(drawablep); @@ -1460,15 +1463,15 @@ void LLViewerObjectList::orphanize(LLViewerObject *childp, U32 parent_id, U32 ip // Unknown parent, add to orpaned child list U64 parent_info = getIndex(parent_id, ip, port); - if (-1 == mOrphanParents.find(parent_info)) + if (std::find(mOrphanParents.begin(), mOrphanParents.end(), parent_info) == mOrphanParents.end()) { - mOrphanParents.put(parent_info); + mOrphanParents.push_back(parent_info); } LLViewerObjectList::OrphanInfo oi(parent_info, childp->mID); - if (-1 == mOrphanChildren.find(oi)) + if (std::find(mOrphanChildren.begin(), mOrphanChildren.end(), oi) == mOrphanChildren.end()) { - mOrphanChildren.put(oi); + mOrphanChildren.push_back(oi); mNumOrphans++; } } @@ -1491,28 +1494,29 @@ void LLViewerObjectList::findOrphans(LLViewerObject* objectp, U32 ip, U32 port) // See if we are a parent of an orphan. // Note: This code is fairly inefficient but it should happen very rarely. // It can be sped up if this is somehow a performance issue... - if (0 == mOrphanParents.count()) + if (mOrphanParents.empty()) { // no known orphan parents return; } - if (-1 == mOrphanParents.find(getIndex(objectp->mLocalID, ip, port))) + if (std::find(mOrphanParents.begin(), mOrphanParents.end(), getIndex(objectp->mLocalID, ip, port)) == mOrphanParents.end()) { // did not find objectp in OrphanParent list return; } - S32 i; U64 parent_info = getIndex(objectp->mLocalID, ip, port); BOOL orphans_found = FALSE; // Iterate through the orphan list, and set parents of matching children. - for (i = 0; i < mOrphanChildren.count(); i++) - { - if (mOrphanChildren[i].mParentInfo != parent_info) + + for (std::vector<OrphanInfo>::iterator iter = mOrphanChildren.begin(); iter != mOrphanChildren.end(); ) + { + if (iter->mParentInfo != parent_info) { + ++iter; continue; } - LLViewerObject *childp = findObject(mOrphanChildren[i].mChildInfo); + LLViewerObject *childp = findObject(iter->mChildInfo); if (childp) { if (childp == objectp) @@ -1546,29 +1550,35 @@ void LLViewerObjectList::findOrphans(LLViewerObject* objectp, U32 ip, U32 port) objectp->addChild(childp); orphans_found = TRUE; + ++iter; } else { llinfos << "Missing orphan child, removing from list" << llendl; - mOrphanChildren.remove(i); - i--; + + iter = mOrphanChildren.erase(iter); } } // Remove orphan parent and children from lists now that they've been found - mOrphanParents.remove(mOrphanParents.find(parent_info)); - - i = 0; - while (i < mOrphanChildren.count()) { - if (mOrphanChildren[i].mParentInfo == parent_info) + std::vector<U64>::iterator iter = std::find(mOrphanParents.begin(), mOrphanParents.end(), parent_info); + if (iter != mOrphanParents.end()) + { + mOrphanParents.erase(iter); + } + } + + for (std::vector<OrphanInfo>::iterator iter = mOrphanChildren.begin(); iter != mOrphanChildren.end(); ) + { + if (iter->mParentInfo == parent_info) { - mOrphanChildren.remove(i); + iter = mOrphanChildren.erase(iter); mNumOrphans--; } else { - i++; + ++iter; } } diff --git a/indra/newview/llviewerobjectlist.h b/indra/newview/llviewerobjectlist.h index ace5c5038e..706966deae 100644 --- a/indra/newview/llviewerobjectlist.h +++ b/indra/newview/llviewerobjectlist.h @@ -38,8 +38,6 @@ // common includes #include "llstat.h" -#include "lldarrayptr.h" -#include "llmap.h" // *TODO: switch to std::map #include "llstring.h" // project includes @@ -50,7 +48,7 @@ class LLNetMap; class LLDebugBeacon; const U32 CLOSE_BIN_SIZE = 10; -const U32 NUM_BINS = 16; +const U32 NUM_BINS = 128; // GL name = position in object list + GL_NAME_INDEX_OFFSET so that // we can have special numbers like zero. @@ -111,13 +109,12 @@ public: void updateAvatarVisibility(); // Selection related stuff - void renderObjectsForSelect(LLCamera &camera, const LLRect& screen_rect, BOOL pick_parcel_wall = FALSE, BOOL render_transparent = TRUE); void generatePickList(LLCamera &camera); void renderPickList(const LLRect& screen_rect, BOOL pick_parcel_wall, BOOL render_transparent); LLViewerObject *getSelectedObject(const U32 object_id); - inline S32 getNumObjects() { return mObjects.count(); } + inline S32 getNumObjects() { return (S32) mObjects.size(); } void addToMap(LLViewerObject *objectp); void removeFromMap(LLViewerObject *objectp); @@ -131,7 +128,7 @@ public: S32 findReferences(LLDrawable *drawablep) const; // Find references to drawable in all objects, and return value. - S32 getOrphanParentCount() const { return mOrphanParents.count(); } + S32 getOrphanParentCount() const { return (S32) mOrphanParents.size(); } S32 getOrphanCount() const { return mNumOrphans; } void orphanize(LLViewerObject *childp, U32 parent_id, U32 ip, U32 port); void findOrphans(LLViewerObject* objectp, U32 ip, U32 port); @@ -179,26 +176,28 @@ public: S32 mNumUnknownKills; S32 mNumDeadObjects; protected: - LLDynamicArray<U64> mOrphanParents; // LocalID/ip,port of orphaned objects - LLDynamicArray<OrphanInfo> mOrphanChildren; // UUID's of orphaned objects + std::vector<U64> mOrphanParents; // LocalID/ip,port of orphaned objects + std::vector<OrphanInfo> mOrphanChildren; // UUID's of orphaned objects S32 mNumOrphans; - LLDynamicArrayPtr<LLPointer<LLViewerObject>, 256> mObjects; + typedef std::vector<LLPointer<LLViewerObject> > vobj_list_t; + + vobj_list_t mObjects; std::set<LLPointer<LLViewerObject> > mActiveObjects; - LLDynamicArrayPtr<LLPointer<LLViewerObject> > mMapObjects; + vobj_list_t mMapObjects; typedef std::map<LLUUID, LLPointer<LLViewerObject> > vo_map; vo_map mDeadObjects; // Need to keep multiple entries per UUID std::map<LLUUID, LLPointer<LLViewerObject> > mUUIDObjectMap; - LLDynamicArray<LLDebugBeacon> mDebugBeacons; + std::vector<LLDebugBeacon> mDebugBeacons; S32 mCurLazyUpdateIndex; static U32 sSimulatorMachineIndex; - static LLMap<U64, U32> sIPAndPortToIndex; + static std::map<U64, U32> sIPAndPortToIndex; static std::map<U64, LLUUID> sIndexAndLocalIDToUUID; @@ -233,6 +232,10 @@ public: extern LLViewerObjectList gObjectList; // Inlines +/** + * Note: + * it will return NULL for offline avatar_id + */ inline LLViewerObject *LLViewerObjectList::findObject(const LLUUID &id) { std::map<LLUUID, LLPointer<LLViewerObject> >::iterator iter = mUUIDObjectMap.find(id); @@ -260,12 +263,16 @@ inline LLViewerObject *LLViewerObjectList::getObject(const S32 index) inline void LLViewerObjectList::addToMap(LLViewerObject *objectp) { - mMapObjects.put(objectp); + mMapObjects.push_back(objectp); } inline void LLViewerObjectList::removeFromMap(LLViewerObject *objectp) { - mMapObjects.removeObj(objectp); + std::vector<LLPointer<LLViewerObject> >::iterator iter = std::find(mMapObjects.begin(), mMapObjects.end(), objectp); + if (iter != mMapObjects.end()) + { + mMapObjects.erase(iter); + } } diff --git a/indra/newview/llviewerparcelmedia.cpp b/indra/newview/llviewerparcelmedia.cpp index c4fc2e5cab..202f8822e3 100644 --- a/indra/newview/llviewerparcelmedia.cpp +++ b/indra/newview/llviewerparcelmedia.cpp @@ -35,6 +35,7 @@ #include "llagent.h" #include "llaudioengine.h" +#include "llmimetypes.h" #include "llviewercontrol.h" #include "llviewermedia.h" #include "llviewerregion.h" @@ -105,15 +106,6 @@ void LLViewerParcelMedia::update(LLParcel* parcel) std::string mediaUrl = std::string ( parcel->getMediaURL () ); std::string mediaCurrentUrl = std::string( parcel->getMediaCurrentURL()); - // First use warning - if( (!mediaUrl.empty() || - !parcel->getMusicURL().empty()) - && LLViewerMedia::needsMediaFirstRun()) - { - LLViewerMedia::displayMediaFirstRun(); - return; - } - // if we have a current (link sharing) url, use it instead if (mediaCurrentUrl != "" && parcel->getMediaType() == "text/html") { @@ -219,25 +211,29 @@ void LLViewerParcelMedia::play(LLParcel* parcel) // A new impl will be created below. } } - - if(!sMediaImpl) + + // Don't ever try to play if the media type is set to "none/none" + if(stricmp(mime_type.c_str(), LLMIMETypes::getDefaultMimeType().c_str()) != 0) { - LL_DEBUGS("Media") << "new media impl with mime type " << mime_type << ", url " << media_url << LL_ENDL; - - // There is no media impl, make a new one - sMediaImpl = LLViewerMedia::newMediaImpl( - placeholder_texture_id, - media_width, - media_height, - media_auto_scale, - media_loop); - sMediaImpl->setIsParcelMedia(true); - sMediaImpl->navigateTo(media_url, mime_type, true); - } + if(!sMediaImpl) + { + LL_DEBUGS("Media") << "new media impl with mime type " << mime_type << ", url " << media_url << LL_ENDL; + + // There is no media impl, make a new one + sMediaImpl = LLViewerMedia::newMediaImpl( + placeholder_texture_id, + media_width, + media_height, + media_auto_scale, + media_loop); + sMediaImpl->setIsParcelMedia(true); + sMediaImpl->navigateTo(media_url, mime_type, true); + } - //LLFirstUse::useMedia(); + //LLFirstUse::useMedia(); - LLViewerParcelMediaAutoPlay::playStarted(); + LLViewerParcelMediaAutoPlay::playStarted(); + } } // static @@ -311,7 +307,7 @@ LLPluginClassMediaOwner::EMediaStatus LLViewerParcelMedia::getStatus() // static std::string LLViewerParcelMedia::getMimeType() { - return sMediaImpl.notNull() ? sMediaImpl->getMimeType() : "none/none"; + return sMediaImpl.notNull() ? sMediaImpl->getMimeType() : LLMIMETypes::getDefaultMimeType(); } //static @@ -321,11 +317,14 @@ std::string LLViewerParcelMedia::getURL() if(sMediaImpl.notNull()) url = sMediaImpl->getMediaURL(); - if (url.empty()) - url = LLViewerParcelMgr::getInstance()->getAgentParcel()->getMediaCurrentURL(); - - if (url.empty()) - url = LLViewerParcelMgr::getInstance()->getAgentParcel()->getMediaURL(); + if(stricmp(LLViewerParcelMgr::getInstance()->getAgentParcel()->getMediaType().c_str(), LLMIMETypes::getDefaultMimeType().c_str()) != 0) + { + if (url.empty()) + url = LLViewerParcelMgr::getInstance()->getAgentParcel()->getMediaCurrentURL(); + + if (url.empty()) + url = LLViewerParcelMgr::getInstance()->getAgentParcel()->getMediaURL(); + } return url; } diff --git a/indra/newview/llviewerparcelmediaautoplay.cpp b/indra/newview/llviewerparcelmediaautoplay.cpp index ad2723b66b..032ad6635a 100644 --- a/indra/newview/llviewerparcelmediaautoplay.cpp +++ b/indra/newview/llviewerparcelmediaautoplay.cpp @@ -42,6 +42,7 @@ #include "message.h" #include "llviewertexturelist.h" // for texture stats #include "llagent.h" +#include "llmimetypes.h" const F32 AUTOPLAY_TIME = 5; // how many seconds before we autoplay const F32 AUTOPLAY_SIZE = 24*24; // how big the texture must be (pixel area) before we autoplay @@ -86,6 +87,7 @@ BOOL LLViewerParcelMediaAutoPlay::tick() LLParcel *this_parcel = NULL; LLViewerRegion *this_region = NULL; std::string this_media_url; + std::string this_media_type; LLUUID this_media_texture_id; S32 this_parcel_id = 0; LLUUID this_region_id; @@ -101,7 +103,9 @@ BOOL LLViewerParcelMediaAutoPlay::tick() if (this_parcel) { - this_media_url = std::string(this_parcel->getMediaURL()); + this_media_url = this_parcel->getMediaURL(); + + this_media_type = this_parcel->getMediaType(); this_media_texture_id = this_parcel->getMediaID(); @@ -118,14 +122,15 @@ BOOL LLViewerParcelMediaAutoPlay::tick() mLastRegionID = this_region_id; } - mTimeInParcel += mPeriod; // increase mTimeInParcel by the amount of time between ticks + mTimeInParcel += mPeriod; // increase mTimeInParcel by the amount of time between ticks - if ((!mPlayed) && // if we've never played - (mTimeInParcel > AUTOPLAY_TIME) && // and if we've been here for so many seconds - (this_media_url.size() != 0) && // and if the parcel has media - (LLViewerParcelMedia::sMediaImpl.isNull())) // and if the media is not already playing + if ((!mPlayed) && // if we've never played + (mTimeInParcel > AUTOPLAY_TIME) && // and if we've been here for so many seconds + (!this_media_url.empty()) && // and if the parcel has media + (stricmp(this_media_type.c_str(), LLMIMETypes::getDefaultMimeType().c_str()) != 0) && + (LLViewerParcelMedia::sMediaImpl.isNull())) // and if the media is not already playing { - if (this_media_texture_id.notNull()) // and if the media texture is good + if (this_media_texture_id.notNull()) // and if the media texture is good { LLViewerMediaTexture *image = LLViewerTextureManager::getMediaTexture(this_media_texture_id, FALSE) ; diff --git a/indra/newview/llviewerparcelmediaautoplay.h b/indra/newview/llviewerparcelmediaautoplay.h index 1d80b4756c..40142c1dd1 100644 --- a/indra/newview/llviewerparcelmediaautoplay.h +++ b/indra/newview/llviewerparcelmediaautoplay.h @@ -33,7 +33,7 @@ #ifndef LLVIEWERPARCELMEDIAAUTOPLAY_H #define LLVIEWERPARCELMEDIAAUTOPLAY_H -#include "lltimer.h" +#include "lleventtimer.h" #include "lluuid.h" // timer to automatically play media diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp index a075a706e1..a591cc1e14 100644 --- a/indra/newview/llviewerparcelmgr.cpp +++ b/indra/newview/llviewerparcelmgr.cpp @@ -53,7 +53,7 @@ //#include "llfirstuse.h" #include "llfloaterbuyland.h" #include "llfloatergroups.h" -#include "llfloaternearbymedia.h" +#include "llpanelnearbymedia.h" #include "llfloatersellland.h" #include "llfloatertools.h" #include "llparcelselection.h" @@ -1762,6 +1762,12 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use { optionally_start_music(music_url); } + else + { + llinfos << "Stopping parcel music (invalid audio stream URL)" << llendl; + // clears the URL + gAudiop->startInternetStream(LLStringUtil::null); + } } else if (!gAudiop->getInternetStreamURL().empty()) { @@ -1789,12 +1795,13 @@ void optionally_start_music(const std::string& music_url) { // only play music when you enter a new parcel if the UI control for this // was not *explicitly* stopped by the user. (part of SL-4878) - LLFloaterNearbyMedia *nearby_media_floater = LLFloaterReg::findTypedInstance<LLFloaterNearbyMedia>("nearby_media"); - if ((nearby_media_floater && - nearby_media_floater->getParcelAudioAutoStart()) || + LLPanelNearByMedia* nearby_media_panel = gStatusBar->getNearbyMediaPanel();; + if ((nearby_media_panel && + nearby_media_panel->getParcelAudioAutoStart()) || // or they have expressed no opinion in the UI, but have autoplay on... - (!nearby_media_floater && - gSavedSettings.getBOOL(LLViewerMedia::AUTO_PLAY_MEDIA_SETTING))) + (!nearby_media_panel && + gSavedSettings.getBOOL(LLViewerMedia::AUTO_PLAY_MEDIA_SETTING) && + gSavedSettings.getBOOL("MediaTentativeAutoPlay"))) { llinfos << "Starting parcel music " << music_url << llendl; gAudiop->startInternetStream(music_url); @@ -2178,7 +2185,8 @@ bool LLViewerParcelMgr::canAgentBuyParcel(LLParcel* parcel, bool forGroup) const return true; // change this if want to make it gods only } - LLViewerRegion* regionp = LLViewerParcelMgr::getInstance()->getSelectionRegion(); + LLVector3 parcel_coord = parcel->getCenterpoint(); + LLViewerRegion* regionp = LLWorld::getInstance()->getRegionFromPosAgent(parcel_coord); if (regionp) { U8 sim_access = regionp->getSimAccess(); diff --git a/indra/newview/llviewerparceloverlay.cpp b/indra/newview/llviewerparceloverlay.cpp index 9de1ef7190..2d17ea7bcd 100644 --- a/indra/newview/llviewerparceloverlay.cpp +++ b/indra/newview/llviewerparceloverlay.cpp @@ -43,11 +43,11 @@ #include "v2math.h" // newview includes +#include "llagentcamera.h" #include "llviewertexture.h" #include "llviewercontrol.h" #include "llsurface.h" #include "llviewerregion.h" -#include "llagent.h" #include "llviewercamera.h" #include "llviewertexturelist.h" #include "llselectmgr.h" @@ -760,7 +760,7 @@ S32 LLViewerParcelOverlay::renderPropertyLines () LLGLDepthTest mDepthTest(GL_TRUE); // Find camera height off the ground (not from zero) - F32 ground_height_at_camera = land.resolveHeightGlobal( gAgent.getCameraPositionGlobal() ); + F32 ground_height_at_camera = land.resolveHeightGlobal( gAgentCamera.getCameraPositionGlobal() ); F32 camera_z = LLViewerCamera::getInstance()->getOrigin().mV[VZ]; F32 camera_height = camera_z - ground_height_at_camera; @@ -791,7 +791,7 @@ S32 LLViewerParcelOverlay::renderPropertyLines () const S32 vertex_per_edge = 3 + 2 * (GRID_STEP-1) + 3; // Stomp the camera into two dimensions - LLVector3 camera_region = mRegion->getPosRegionFromGlobal( gAgent.getCameraPositionGlobal() ); + LLVector3 camera_region = mRegion->getPosRegionFromGlobal( gAgentCamera.getCameraPositionGlobal() ); // Set up a cull plane 2 * PARCEL_GRID_STEP_METERS behind // the camera. The cull plane normal is the camera's at axis. diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index 77d2d493bd..da240cedbb 100644 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -47,8 +47,10 @@ #include "v4math.h" #include "llagent.h" +#include "llagentcamera.h" #include "llcallingcard.h" #include "llcaphttpsender.h" +#include "llcommandhandler.h" #include "lldir.h" #include "lleventpoll.h" #include "llfloatergodtools.h" @@ -58,6 +60,7 @@ #include "llsdutil.h" #include "llstartup.h" #include "lltrans.h" +#include "llurldispatcher.h" #include "llviewerobjectlist.h" #include "llviewerparceloverlay.h" #include "llvlmanager.h" @@ -82,6 +85,45 @@ extern BOOL gNoRender; const F32 WATER_TEXTURE_SCALE = 8.f; // Number of times to repeat the water texture across a region const S16 MAX_MAP_DIST = 10; +// support for secondlife:///app/region/{REGION} SLapps +// N.B. this is defined to work exactly like the classic secondlife://{REGION} +// However, the later syntax cannot support spaces in the region name because +// spaces (and %20 chars) are illegal in the hostname of an http URL. Some +// browsers let you get away with this, but some do not (such as Qt's Webkit). +// Hence we introduced the newer secondlife:///app/region alternative. +class LLRegionHandler : public LLCommandHandler +{ +public: + // requests will be throttled from a non-trusted browser + LLRegionHandler() : LLCommandHandler("region", UNTRUSTED_THROTTLE) {} + + bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web) + { + // make sure that we at least have a region name + int num_params = params.size(); + if (num_params < 1) + { + return false; + } + + // build a secondlife://{PLACE} SLurl from this SLapp + std::string url = "secondlife://"; + for (int i = 0; i < num_params; i++) + { + if (i > 0) + { + url += "/"; + } + url += params[i].asString(); + } + + // Process the SLapp as if it was a secondlife://{PLACE} SLurl + LLURLDispatcher::dispatch(url, web, true); + return true; + } +}; +LLRegionHandler gRegionHandler; + class BaseCapabilitiesComplete : public LLHTTPClient::Responder { LOG_CLASS(BaseCapabilitiesComplete); @@ -174,6 +216,7 @@ LLViewerRegion::LLViewerRegion(const U64 &handle, mColoName("unknown"), mProductSKU("unknown"), mProductName("unknown"), + mHttpUrl(""), mCacheLoaded(FALSE), mCacheEntriesCount(0), mCacheID(), @@ -585,6 +628,26 @@ std::string LLViewerRegion::accessToString(U8 sim_access) } // static +std::string LLViewerRegion::getAccessIcon(U8 sim_access) +{ + switch(sim_access) + { + case SIM_ACCESS_MATURE: + return "Parcel_M_Dark"; + + case SIM_ACCESS_ADULT: + return "Parcel_R_Light"; + + case SIM_ACCESS_PG: + return "Parcel_PG_Light"; + + case SIM_ACCESS_MIN: + default: + return ""; + } +} + +// static std::string LLViewerRegion::accessToShortString(U8 sim_access) { switch(sim_access) /* Flawfinder: ignore */ @@ -778,7 +841,7 @@ void LLViewerRegion::calculateCenterGlobal() void LLViewerRegion::calculateCameraDistance() { - mCameraDistanceSquared = (F32)(gAgent.getCameraPositionGlobal() - getCenterGlobal()).magVecSquared(); + mCameraDistanceSquared = (F32)(gAgentCamera.getCameraPositionGlobal() - getCenterGlobal()).magVecSquared(); } std::ostream& operator<<(std::ostream &s, const LLViewerRegion ®ion) @@ -1493,6 +1556,10 @@ void LLViewerRegion::setCapability(const std::string& name, const std::string& u else { mCapabilities[name] = url; + if(name == "GetTexture") + { + mHttpUrl = url ; + } } } diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h index 49d0900f2a..a9e7ef771c 100644 --- a/indra/newview/llviewerregion.h +++ b/indra/newview/llviewerregion.h @@ -203,6 +203,9 @@ public: // Returns "M", "PG", "A" etc. static std::string accessToShortString(U8 sim_access); + + // Return access icon name + static std::string getAccessIcon(U8 sim_access); // helper function which just makes sure all interested parties // can process the message. @@ -288,6 +291,7 @@ public: friend std::ostream& operator<<(std::ostream &s, const LLViewerRegion ®ion); /// implements LLCapabilityProvider virtual std::string getDescription() const; + std::string getHttpUrl() const { return mHttpUrl ;} LLSpatialPartition* getSpatialPartition(U32 type); public: @@ -380,6 +384,7 @@ private: std::string mColoName; std::string mProductSKU; std::string mProductName; + std::string mHttpUrl ; // Maps local ids to cache entries. diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp index 8059f866ba..bdc34d0f18 100644 --- a/indra/newview/llviewerstats.cpp +++ b/indra/newview/llviewerstats.cpp @@ -52,6 +52,7 @@ #include "llsurface.h" #include "llvlmanager.h" #include "llagent.h" +#include "llagentcamera.h" #include "llviewercontrol.h" #include "llfloatertools.h" #include "lldebugview.h" @@ -577,11 +578,11 @@ void update_statistics(U32 frame_count) // make sure we have a valid time delta for this frame if (gFrameIntervalSeconds > 0.f) { - if (gAgent.getCameraMode() == CAMERA_MODE_MOUSELOOK) + if (gAgentCamera.getCameraMode() == CAMERA_MODE_MOUSELOOK) { LLViewerStats::getInstance()->incStat(LLViewerStats::ST_MOUSELOOK_SECONDS, gFrameIntervalSeconds); } - else if (gAgent.getCameraMode() == CAMERA_MODE_CUSTOMIZE_AVATAR) + else if (gAgentCamera.getCameraMode() == CAMERA_MODE_CUSTOMIZE_AVATAR) { LLViewerStats::getInstance()->incStat(LLViewerStats::ST_AVATAR_EDIT_SECONDS, gFrameIntervalSeconds); } @@ -767,9 +768,11 @@ void send_stats() system["ram"] = (S32) gSysMemory.getPhysicalMemoryKB(); system["os"] = LLAppViewer::instance()->getOSInfo().getOSStringSimple(); system["cpu"] = gSysCPU.getCPUString(); + unsigned char MACAddress[MAC_ADDRESS_BYTES]; + LLUUID::getNodeID(MACAddress); std::string macAddressString = llformat("%02x-%02x-%02x-%02x-%02x-%02x", - gMACAddress[0],gMACAddress[1],gMACAddress[2], - gMACAddress[3],gMACAddress[4],gMACAddress[5]); + MACAddress[0],MACAddress[1],MACAddress[2], + MACAddress[3],MACAddress[4],MACAddress[5]); system["mac_address"] = macAddressString; system["serial_number"] = LLAppViewer::instance()->getSerialNumber(); std::string gpu_desc = llformat( @@ -827,7 +830,11 @@ void send_stats() S32 window_height = gViewerWindow->getWindowHeightRaw(); S32 window_size = (window_width * window_height) / 1024; misc["string_1"] = llformat("%d", window_size); - // misc["string_2"] = + if (gDebugTimers.find(0) != gDebugTimers.end() && gFrameTimeSeconds > 0) + { + misc["string_2"] = llformat("Texture Time: %.2f, Total Time: %.2f", gDebugTimers[0].getElapsedTimeF32(), gFrameTimeSeconds); + } + // misc["int_1"] = LLSD::Integer(gSavedSettings.getU32("RenderQualityPerformance")); // Steve: 1.21 // misc["int_2"] = LLSD::Integer(gFrameStalls); // Steve: 1.21 diff --git a/indra/newview/llviewertexteditor.cpp b/indra/newview/llviewertexteditor.cpp index ea8af223c3..59efae4cb2 100644 --- a/indra/newview/llviewertexteditor.cpp +++ b/indra/newview/llviewertexteditor.cpp @@ -40,8 +40,8 @@ #include "llfloaterreg.h" #include "llfloaterworldmap.h" #include "llfocusmgr.h" -#include "llinventory.h" #include "llinventorybridge.h" +#include "llinventorydefines.h" #include "llinventorymodel.h" #include "lllandmark.h" #include "lllandmarkactions.h" @@ -524,7 +524,10 @@ LLUIImagePtr LLEmbeddedItems::getItemImage(llwchar ext_char) const break; case LLAssetType::AT_SOUND: img_name = "Inv_Sound"; break; case LLAssetType::AT_CLOTHING: img_name = "Inv_Clothing"; break; - case LLAssetType::AT_OBJECT: img_name = "Inv_Object"; break; + case LLAssetType::AT_OBJECT: + img_name = LLInventoryItemFlags::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS & item->getFlags() ? + "Inv_Object_Multi" : "Inv_Object"; + break; case LLAssetType::AT_CALLINGCARD: img_name = "Inv_CallingCard"; break; case LLAssetType::AT_LANDMARK: img_name = "Inv_Landmark"; break; case LLAssetType::AT_NOTECARD: img_name = "Inv_Notecard"; break; diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index 0ad269392d..9b5b210bf7 100644 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -82,7 +82,7 @@ LLTexturePipelineTester* LLViewerTextureManager::sTesterp = NULL ; S32 LLViewerTexture::sImageCount = 0; S32 LLViewerTexture::sRawCount = 0; S32 LLViewerTexture::sAuxCount = 0; -LLTimer LLViewerTexture::sEvaluationTimer; +LLFrameTimer LLViewerTexture::sEvaluationTimer; F32 LLViewerTexture::sDesiredDiscardBias = 0.f; F32 LLViewerTexture::sDesiredDiscardScale = 1.1f; S32 LLViewerTexture::sBoundTextureMemoryInBytes = 0; @@ -102,7 +102,7 @@ F32 LLViewerTexture::sCurrentTime = 0.0f ; BOOL LLViewerTexture::sUseTextureAtlas = FALSE ; const F32 desired_discard_bias_min = -2.0f; // -max number of levels to improve image quality by -const F32 desired_discard_bias_max = 1.5f; // max number of levels to reduce image quality by +const F32 desired_discard_bias_max = (F32)MAX_DISCARD_LEVEL; // max number of levels to reduce image quality by const F64 log_2 = log(2.0); //---------------------------------------------------------------------------------------------- @@ -293,6 +293,8 @@ void LLViewerTextureManager::init() } } imagep->createGLTexture(0, image_raw); + //cache the raw image + imagep->setCachedRawImage(0, image_raw) ; image_raw = NULL; #else LLViewerFetchedTexture::sDefaultImagep = LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT, TRUE, LLViewerTexture::BOOST_UI); @@ -367,7 +369,7 @@ S32 LLViewerTexture::getCategoryFromIndex(S32 index) } // tuning params -const F32 discard_bias_delta = .05f; +const F32 discard_bias_delta = .25f; const F32 discard_delta_time = 0.5f; const S32 min_non_tex_system_mem = (128<<20); // 128 MB // non-const (used externally @@ -490,13 +492,16 @@ void LLViewerTexture::init(bool firstinit) mTextureState = NO_DELETE ; mDontDiscard = FALSE; + mCanResetMaxVirtualSize = true ; mMaxVirtualSize = 0.f; mNeedsGLTexture = FALSE ; mNeedsResetMaxVirtualSize = FALSE ; mAdditionalDecodePriority = 0.f ; mParcelMedia = NULL ; mNumFaces = 0 ; + mNumVolumes = 0; mFaceList.clear() ; + mVolumeList.clear(); } //virtual @@ -508,7 +513,7 @@ S8 LLViewerTexture::getType() const void LLViewerTexture::cleanup() { mFaceList.clear() ; - + mVolumeList.clear(); if(mGLTexturep) { mGLTexturep->cleanup(); @@ -586,6 +591,11 @@ void LLViewerTexture::forceImmediateUpdate() { } +void LLViewerTexture::setResetMaxVirtualSizeFlag(bool flag) +{ + mCanResetMaxVirtualSize = flag ; +} + void LLViewerTexture::addTextureStats(F32 virtual_size, BOOL needs_gltexture) const { if(needs_gltexture) @@ -609,7 +619,7 @@ void LLViewerTexture::addTextureStats(F32 virtual_size, BOOL needs_gltexture) co void LLViewerTexture::resetTextureStats() { - mMaxVirtualSize = 0.0f; + mMaxVirtualSize = 0.0f ; mAdditionalDecodePriority = 0.f ; mNeedsResetMaxVirtualSize = FALSE ; } @@ -661,6 +671,42 @@ S32 LLViewerTexture::getNumFaces() const return mNumFaces ; } + +//virtual +void LLViewerTexture::addVolume(LLVOVolume* volumep) +{ + if( mNumVolumes >= mVolumeList.size()) + { + mVolumeList.resize(2 * mNumVolumes + 1) ; + } + mVolumeList[mNumVolumes] = volumep ; + volumep->setIndexInTex(mNumVolumes) ; + mNumVolumes++ ; + mLastVolumeListUpdateTimer.reset() ; +} + +//virtual +void LLViewerTexture::removeVolume(LLVOVolume* volumep) +{ + if(mNumVolumes > 1) + { + S32 index = volumep->getIndexInTex() ; + mVolumeList[index] = mVolumeList[--mNumVolumes] ; + mVolumeList[index]->setIndexInTex(index) ; + } + else + { + mVolumeList.clear() ; + mNumVolumes = 0 ; + } + mLastVolumeListUpdateTimer.reset() ; +} + +S32 LLViewerTexture::getNumVolumes() const +{ + return mNumVolumes ; +} + void LLViewerTexture::reorganizeFaceList() { static const F32 MAX_WAIT_TIME = 20.f; // seconds @@ -680,6 +726,27 @@ void LLViewerTexture::reorganizeFaceList() mFaceList.erase(mFaceList.begin() + mNumFaces, mFaceList.end()); } +void LLViewerTexture::reorganizeVolumeList() +{ + static const F32 MAX_WAIT_TIME = 20.f; // seconds + static const U32 MAX_EXTRA_BUFFER_SIZE = 4 ; + + if(mNumVolumes + MAX_EXTRA_BUFFER_SIZE > mVolumeList.size()) + { + return ; + } + + if(mLastVolumeListUpdateTimer.getElapsedTimeF32() < MAX_WAIT_TIME) + { + return ; + } + + mLastVolumeListUpdateTimer.reset() ; + mVolumeList.erase(mVolumeList.begin() + mNumVolumes, mVolumeList.end()); +} + + + //virtual void LLViewerTexture::switchToCachedImage() { @@ -715,7 +782,7 @@ void LLViewerTexture::generateGLTexture() LLImageGL* LLViewerTexture::getGLTexture() const { - llassert_always(mGLTexturep.notNull()) ; + llassert(mGLTexturep.notNull()) ; return mGLTexturep ; } @@ -732,7 +799,7 @@ BOOL LLViewerTexture::createGLTexture() BOOL LLViewerTexture::createGLTexture(S32 discard_level, const LLImageRaw* imageraw, S32 usename, BOOL to_create, S32 category) { - llassert_always(mGLTexturep.notNull()) ; + llassert(mGLTexturep.notNull()) ; BOOL ret = mGLTexturep->createGLTexture(discard_level, imageraw, usename, to_create, category) ; @@ -740,63 +807,69 @@ BOOL LLViewerTexture::createGLTexture(S32 discard_level, const LLImageRaw* image { mFullWidth = mGLTexturep->getCurrentWidth() ; mFullHeight = mGLTexturep->getCurrentHeight() ; - mComponents = mGLTexturep->getComponents() ; + mComponents = mGLTexturep->getComponents() ; } return ret ; } +//virtual +void LLViewerTexture::setCachedRawImage(S32 discard_level, LLImageRaw* imageraw) +{ + //nothing here. +} + void LLViewerTexture::setExplicitFormat(LLGLint internal_format, LLGLenum primary_format, LLGLenum type_format, BOOL swap_bytes) { - llassert_always(mGLTexturep.notNull()) ; + llassert(mGLTexturep.notNull()) ; mGLTexturep->setExplicitFormat(internal_format, primary_format, type_format, swap_bytes) ; } void LLViewerTexture::setAddressMode(LLTexUnit::eTextureAddressMode mode) { - llassert_always(mGLTexturep.notNull()) ; + llassert(mGLTexturep.notNull()) ; mGLTexturep->setAddressMode(mode) ; } void LLViewerTexture::setFilteringOption(LLTexUnit::eTextureFilterOptions option) { - llassert_always(mGLTexturep.notNull()) ; + llassert(mGLTexturep.notNull()) ; mGLTexturep->setFilteringOption(option) ; } //virtual S32 LLViewerTexture::getWidth(S32 discard_level) const { - llassert_always(mGLTexturep.notNull()) ; + llassert(mGLTexturep.notNull()) ; return mGLTexturep->getWidth(discard_level) ; } //virtual S32 LLViewerTexture::getHeight(S32 discard_level) const { - llassert_always(mGLTexturep.notNull()) ; + llassert(mGLTexturep.notNull()) ; return mGLTexturep->getHeight(discard_level) ; } S32 LLViewerTexture::getMaxDiscardLevel() const { - llassert_always(mGLTexturep.notNull()) ; + llassert(mGLTexturep.notNull()) ; return mGLTexturep->getMaxDiscardLevel() ; } S32 LLViewerTexture::getDiscardLevel() const { - llassert_always(mGLTexturep.notNull()) ; + llassert(mGLTexturep.notNull()) ; return mGLTexturep->getDiscardLevel() ; } S8 LLViewerTexture::getComponents() const { - llassert_always(mGLTexturep.notNull()) ; + llassert(mGLTexturep.notNull()) ; return mGLTexturep->getComponents() ; } LLGLuint LLViewerTexture::getTexName() const { - llassert_always(mGLTexturep.notNull()) ; + llassert(mGLTexturep.notNull()) ; return mGLTexturep->getTexName() ; } @@ -821,124 +894,124 @@ BOOL LLViewerTexture::getBoundRecently() const LLTexUnit::eTextureType LLViewerTexture::getTarget(void) const { - llassert_always(mGLTexturep.notNull()) ; + llassert(mGLTexturep.notNull()) ; return mGLTexturep->getTarget() ; } BOOL LLViewerTexture::setSubImage(const LLImageRaw* imageraw, S32 x_pos, S32 y_pos, S32 width, S32 height) { - llassert_always(mGLTexturep.notNull()) ; + llassert(mGLTexturep.notNull()) ; return mGLTexturep->setSubImage(imageraw, x_pos, y_pos, width, height) ; } BOOL LLViewerTexture::setSubImage(const U8* datap, S32 data_width, S32 data_height, S32 x_pos, S32 y_pos, S32 width, S32 height) { - llassert_always(mGLTexturep.notNull()) ; + llassert(mGLTexturep.notNull()) ; return mGLTexturep->setSubImage(datap, data_width, data_height, x_pos, y_pos, width, height) ; } void LLViewerTexture::setGLTextureCreated (bool initialized) { - llassert_always(mGLTexturep.notNull()) ; + llassert(mGLTexturep.notNull()) ; mGLTexturep->setGLTextureCreated (initialized) ; } void LLViewerTexture::setCategory(S32 category) { - llassert_always(mGLTexturep.notNull()) ; + llassert(mGLTexturep.notNull()) ; mGLTexturep->setCategory(category) ; } LLTexUnit::eTextureAddressMode LLViewerTexture::getAddressMode(void) const { - llassert_always(mGLTexturep.notNull()) ; + llassert(mGLTexturep.notNull()) ; return mGLTexturep->getAddressMode() ; } S32 LLViewerTexture::getTextureMemory() const { - llassert_always(mGLTexturep.notNull()) ; + llassert(mGLTexturep.notNull()) ; return mGLTexturep->mTextureMemory ; } LLGLenum LLViewerTexture::getPrimaryFormat() const { - llassert_always(mGLTexturep.notNull()) ; + llassert(mGLTexturep.notNull()) ; return mGLTexturep->getPrimaryFormat() ; } BOOL LLViewerTexture::getIsAlphaMask() const { - llassert_always(mGLTexturep.notNull()) ; + llassert(mGLTexturep.notNull()) ; return mGLTexturep->getIsAlphaMask() ; } BOOL LLViewerTexture::getMask(const LLVector2 &tc) { - llassert_always(mGLTexturep.notNull()) ; + llassert(mGLTexturep.notNull()) ; return mGLTexturep->getMask(tc) ; } F32 LLViewerTexture::getTimePassedSinceLastBound() { - llassert_always(mGLTexturep.notNull()) ; + llassert(mGLTexturep.notNull()) ; return mGLTexturep->getTimePassedSinceLastBound() ; } BOOL LLViewerTexture::getMissed() const { - llassert_always(mGLTexturep.notNull()) ; + llassert(mGLTexturep.notNull()) ; return mGLTexturep->getMissed() ; } BOOL LLViewerTexture::isJustBound() const { - llassert_always(mGLTexturep.notNull()) ; + llassert(mGLTexturep.notNull()) ; return mGLTexturep->isJustBound() ; } void LLViewerTexture::forceUpdateBindStats(void) const { - llassert_always(mGLTexturep.notNull()) ; + llassert(mGLTexturep.notNull()) ; return mGLTexturep->forceUpdateBindStats() ; } U32 LLViewerTexture::getTexelsInAtlas() const { - llassert_always(mGLTexturep.notNull()) ; + llassert(mGLTexturep.notNull()) ; return mGLTexturep->getTexelsInAtlas() ; } U32 LLViewerTexture::getTexelsInGLTexture() const { - llassert_always(mGLTexturep.notNull()) ; + llassert(mGLTexturep.notNull()) ; return mGLTexturep->getTexelsInGLTexture() ; } BOOL LLViewerTexture::isGLTextureCreated() const { - llassert_always(mGLTexturep.notNull()) ; + llassert(mGLTexturep.notNull()) ; return mGLTexturep->isGLTextureCreated() ; } S32 LLViewerTexture::getDiscardLevelInAtlas() const { - llassert_always(mGLTexturep.notNull()) ; + llassert(mGLTexturep.notNull()) ; return mGLTexturep->getDiscardLevelInAtlas() ; } @@ -974,12 +1047,6 @@ void LLViewerTexture::updateBindStatsForTester() //start of LLViewerFetchedTexture //---------------------------------------------------------------------------------------------- -//static -F32 LLViewerFetchedTexture::maxDecodePriority() -{ - return 6000000.f; -} - LLViewerFetchedTexture::LLViewerFetchedTexture(const LLUUID& id, const LLHost& host, BOOL usemipmaps) : LLViewerTexture(id, usemipmaps), mTargetHost(host) @@ -1010,6 +1077,7 @@ void LLViewerFetchedTexture::init(bool firstinit) mRequestedDiscardLevel = -1; mRequestedDownloadPriority = 0.f; mFullyLoaded = FALSE; + mCanUseHTTP = true ; mDesiredDiscardLevel = MAX_DISCARD_LEVEL + 1; mMinDesiredDiscardLevel = MAX_DISCARD_LEVEL + 1; @@ -1196,20 +1264,30 @@ void LLViewerFetchedTexture::destroyTexture() mFullyLoaded = FALSE ; } -// -//do not change the discard level of the loaded texture image. -BOOL LLViewerFetchedTexture::keepReuestedDiscardLevel() +void LLViewerFetchedTexture::addToCreateTexture() { - if (!mLoadedCallbackList.empty()) + bool force_update = false ; + if (getComponents() != mRawImage->getComponents()) { - return TRUE ; - } + // We've changed the number of components, so we need to move any + // objects using this pool to a different pool. + mComponents = mRawImage->getComponents(); + mGLTexturep->setComponents(mComponents) ; + force_update = true ; - return FALSE ; -} + for(U32 i = 0 ; i < mNumFaces ; i++) + { + mFaceList[i]->dirtyTexture() ; + } + + //discard the cached raw image and the saved raw image + mCachedRawImageReady = FALSE ; + mCachedRawDiscardLevel = -1 ; + mCachedRawImage = NULL ; + mSavedRawDiscardLevel = -1 ; + mSavedRawImage = NULL ; + } -void LLViewerFetchedTexture::addToCreateTexture() -{ if(isForSculptOnly()) { //just update some variables, not to create a real GL texture. @@ -1217,6 +1295,11 @@ void LLViewerFetchedTexture::addToCreateTexture() mNeedsCreateTexture = FALSE ; destroyRawImage(); } + else if(!force_update && getDiscardLevel() > -1 && getDiscardLevel() <= mRawDiscardLevel) + { + mNeedsCreateTexture = FALSE ; + destroyRawImage(); + } else { #if 1 @@ -1225,7 +1308,7 @@ void LLViewerFetchedTexture::addToCreateTexture() //so do not scale down the over qualified image. //Note: scaling down image is expensensive. Do it only when very necessary. // - if(mRequestedDiscardLevel <= mDesiredDiscardLevel && !keepReuestedDiscardLevel()) + if(mRequestedDiscardLevel <= mDesiredDiscardLevel && !mForceToSaveRawImage) { S32 w = mFullWidth >> mRawDiscardLevel; S32 h = mFullHeight >> mRawDiscardLevel; @@ -1338,24 +1421,7 @@ BOOL LLViewerFetchedTexture::createTexture(S32 usename/*= 0*/) setActive() ; } - // - // Iterate through the list of image loading callbacks to see - // what sort of data they need. - // - // *TODO: Fix image callback code - BOOL imageraw_callbacks = FALSE; - for(callback_list_t::iterator iter = mLoadedCallbackList.begin(); - iter != mLoadedCallbackList.end(); ) - { - LLLoadedCallbackEntry *entryp = *iter++; - if (entryp->mNeedsImageRaw) - { - imageraw_callbacks = TRUE; - break; - } - } - - if (!imageraw_callbacks) + if (!mForceToSaveRawImage) { mNeedsAux = FALSE; destroyRawImage(); @@ -1367,22 +1433,28 @@ BOOL LLViewerFetchedTexture::createTexture(S32 usename/*= 0*/) //virtual void LLViewerFetchedTexture::setKnownDrawSize(S32 width, S32 height) { - if(mKnownDrawWidth != width || mKnownDrawHeight != height) + if(mKnownDrawWidth < width || mKnownDrawHeight < height) { - mKnownDrawWidth = width; - mKnownDrawHeight = height; + mKnownDrawWidth = llmax(mKnownDrawWidth, width) ; + mKnownDrawHeight = llmax(mKnownDrawHeight, height) ; mKnownDrawSizeChanged = TRUE ; mFullyLoaded = FALSE ; } - addTextureStats((F32)(width * height)); + addTextureStats((F32)(mKnownDrawWidth * mKnownDrawHeight)); } //virtual void LLViewerFetchedTexture::processTextureStats() { - if(mFullyLoaded)//already loaded + if(mFullyLoaded) { + if(mDesiredDiscardLevel <= mMinDesiredDiscardLevel)//already loaded + { + return ; + } + mDesiredDiscardLevel = llmin(mDesiredDiscardLevel, mMinDesiredDiscardLevel) ; + mFullyLoaded = FALSE ; return ; } @@ -1416,6 +1488,7 @@ void LLViewerFetchedTexture::processTextureStats() mDesiredDiscardLevel = (S8)llmin(log((F32)mFullWidth / mKnownDrawWidth) / log_2, log((F32)mFullHeight / mKnownDrawHeight) / log_2) ; mDesiredDiscardLevel = llclamp(mDesiredDiscardLevel, (S8)0, (S8)getMaxDiscardLevel()) ; + mDesiredDiscardLevel = llmin(mDesiredDiscardLevel, mMinDesiredDiscardLevel) ; } mKnownDrawSizeChanged = FALSE ; @@ -1426,6 +1499,13 @@ void LLViewerFetchedTexture::processTextureStats() } } +const F32 MAX_PRIORITY_PIXEL = 999.f ; //pixel area +const F32 PRIORITY_BOOST_LEVEL_FACTOR = 1000.f ; //boost level +const F32 PRIORITY_DELTA_DISCARD_LEVEL_FACTOR = 100000.f ; //delta discard +const S32 MAX_DELTA_DISCARD_LEVEL_FOR_PRIORITY = 4 ; +const F32 PRIORITY_ADDITIONAL_FACTOR = 1000000.f ; //additional +const S32 MAX_ADDITIONAL_LEVEL_FOR_PRIORITY = 8 ; +const F32 PRIORITY_BOOST_HIGH_FACTOR = 10000000.f ;//boost high F32 LLViewerFetchedTexture::calcDecodePriority() { #ifndef LL_RELEASE_FOR_DOWNLOAD @@ -1435,41 +1515,36 @@ F32 LLViewerFetchedTexture::calcDecodePriority() } #endif - if(mFullyLoaded)//already loaded for static texture - { - return -4.0f ; //alreay fetched - } - if (mNeedsCreateTexture) { return mDecodePriority; // no change while waiting to create } - if(mForceToSaveRawImage) + if(mFullyLoaded && !mForceToSaveRawImage)//already loaded for static texture { - return maxDecodePriority() ; + return -1.0f ; //alreay fetched } - - S32 cur_discard = getDiscardLevel(); + + S32 cur_discard = getCurrentDiscardLevelForFetching(); bool have_all_data = (cur_discard >= 0 && (cur_discard <= mDesiredDiscardLevel)); F32 pixel_priority = fsqrtf(mMaxVirtualSize); - F32 priority; + F32 priority = 0.f; if (mIsMissingAsset) { priority = 0.0f; } else if(mDesiredDiscardLevel >= cur_discard && cur_discard > -1) { - priority = -1.0f ; + priority = -2.0f ; } else if(mCachedRawDiscardLevel > -1 && mDesiredDiscardLevel >= mCachedRawDiscardLevel) { - priority = -1.0f; + priority = -3.0f; } else if (mDesiredDiscardLevel > getMaxDiscardLevel()) { // Don't decode anything we don't need - priority = -1.0f; + priority = -4.0f; } else if ((mBoostLevel == LLViewerTexture::BOOST_UI || mBoostLevel == LLViewerTexture::BOOST_ICON) && !have_all_data) { @@ -1483,10 +1558,14 @@ F32 LLViewerFetchedTexture::calcDecodePriority() // Always want high boosted images priority = 1.f; } + else if(mForceToSaveRawImage) + { + //force to fetch the raw image. + priority = 1.f; + } else { - // Leave the priority as-is - return mDecodePriority; + priority = -5.f; //stop fetching } } else if (cur_discard < 0) @@ -1496,17 +1575,13 @@ F32 LLViewerFetchedTexture::calcDecodePriority() static const F64 log_2 = log(2.0); F32 desired = (F32)(log(32.0/pixel_priority) / log_2); S32 ddiscard = MAX_DISCARD_LEVEL - (S32)desired; - ddiscard = llclamp(ddiscard, 0, 4); - priority = (ddiscard+1)*100000.f; + ddiscard = llclamp(ddiscard, 0, MAX_DELTA_DISCARD_LEVEL_FOR_PRIORITY); + priority = (ddiscard + 1) * PRIORITY_DELTA_DISCARD_LEVEL_FACTOR; } else if ((mMinDiscardLevel > 0) && (cur_discard <= mMinDiscardLevel)) { // larger mips are corrupted - priority = -3.0f; - } - else if (cur_discard <= mDesiredDiscardLevel) - { - priority = -4.0f; + priority = -6.0f; } else { @@ -1523,51 +1598,59 @@ F32 LLViewerFetchedTexture::calcDecodePriority() // We haven't rendered this in a while, de-prioritize it desired_discard += 2; } - //else - //{ - // // We haven't rendered this in the last half second, and we have a cached raw image, leave the desired discard as-is - // desired_discard = cur_discard; - //} + else + { + // We haven't rendered this in the last half second, and we have a cached raw image, leave the desired discard as-is + desired_discard = cur_discard; + } } S32 ddiscard = cur_discard - desired_discard; - ddiscard = llclamp(ddiscard, 0, 4); - priority = (ddiscard+1)*100000.f; + ddiscard = llclamp(ddiscard, -1, MAX_DELTA_DISCARD_LEVEL_FOR_PRIORITY); + priority = (ddiscard + 1) * PRIORITY_DELTA_DISCARD_LEVEL_FACTOR; } // Priority Formula: // BOOST_HIGH + ADDITIONAL PRI + DELTA DISCARD + BOOST LEVEL + PIXELS - // [10,000,000] + [1-9,000,000] + [1-400,000] + [1-20,000] + [0-999] + // [10,000,000] + [1,000,000-9,000,000] + [100,000-500,000] + [1-20,000] + [0-999] if (priority > 0.0f) { - pixel_priority = llclamp(pixel_priority, 0.0f, 999.f); + pixel_priority = llclamp(pixel_priority, 0.0f, MAX_PRIORITY_PIXEL); - priority = pixel_priority + 1000.f * mBoostLevel; + priority += pixel_priority + PRIORITY_BOOST_LEVEL_FACTOR * mBoostLevel; if ( mBoostLevel > BOOST_HIGH) { - priority += 10000000.f; + priority += PRIORITY_BOOST_HIGH_FACTOR; } if(mAdditionalDecodePriority > 0.0f) { - // 1-9 - S32 additional_priority = (S32)(1.0f + mAdditionalDecodePriority*8.0f + .5f); // round - // priority range += 0-9,000,000 - priority += 1000000.f * (F32)additional_priority; + // priority range += 1,000,000.f-9,000,000.f + priority += PRIORITY_ADDITIONAL_FACTOR * (1.0 + mAdditionalDecodePriority * MAX_ADDITIONAL_LEVEL_FOR_PRIORITY); } } return priority; } + +//static +F32 LLViewerFetchedTexture::maxDecodePriority() +{ + static const F32 max_priority = PRIORITY_BOOST_HIGH_FACTOR + //boost_high + PRIORITY_ADDITIONAL_FACTOR * (MAX_ADDITIONAL_LEVEL_FOR_PRIORITY + 1) + //additional (view dependent factors) + PRIORITY_DELTA_DISCARD_LEVEL_FACTOR * (MAX_DELTA_DISCARD_LEVEL_FOR_PRIORITY + 1) + //delta discard + PRIORITY_BOOST_LEVEL_FACTOR * (BOOST_MAX_LEVEL - 1) + //boost level + MAX_PRIORITY_PIXEL + 1.0f ; //pixel area. + + return max_priority ; +} + //============================================================================ void LLViewerFetchedTexture::setDecodePriority(F32 priority) { - //llassert(!mInImageList); // firing a lot, figure out why - if (mInImageList) // above llassert() softened to a warning - { - llwarns << "BAD STUFF! mInImageList" << llendl; - } + llassert(!mInImageList); + mDecodePriority = priority; } @@ -1587,6 +1670,11 @@ void LLViewerFetchedTexture::updateVirtualSize() addTextureStats(0.f, FALSE) ;//reset } + if(mForceToSaveRawImage) + { + setAdditionalDecodePriority(0.75f) ; //boost the fetching priority + } + for(U32 i = 0 ; i < mNumFaces ; i++) { LLFace* facep = mFaceList[i] ; @@ -1596,8 +1684,31 @@ void LLViewerFetchedTexture::updateVirtualSize() setAdditionalDecodePriority(facep->getImportanceToCamera()) ; } } - mNeedsResetMaxVirtualSize = TRUE ; + + if(mCanResetMaxVirtualSize) + { + mNeedsResetMaxVirtualSize = TRUE ; + } reorganizeFaceList() ; + reorganizeVolumeList(); +} + +S32 LLViewerFetchedTexture::getCurrentDiscardLevelForFetching() +{ + S32 current_discard = getDiscardLevel() ; + if(mForceToSaveRawImage) + { + if(mSavedRawDiscardLevel < 0 || current_discard < 0) + { + current_discard = -1 ; + } + else + { + current_discard = llmax(current_discard, mSavedRawDiscardLevel) ; + } + } + + return current_discard ; } bool LLViewerFetchedTexture::updateFetch() @@ -1636,7 +1747,7 @@ bool LLViewerFetchedTexture::updateFetch() return false; // process any raw image data in callbacks before replacing } - S32 current_discard = getDiscardLevel() ; + S32 current_discard = getCurrentDiscardLevelForFetching() ; S32 desired_discard = getDesiredDiscardLevel(); F32 decode_priority = getDecodePriority(); decode_priority = llmax(decode_priority, 0.0f); @@ -1646,14 +1757,6 @@ bool LLViewerFetchedTexture::updateFetch() // Sets mRawDiscardLevel, mRawImage, mAuxRawImage S32 fetch_discard = current_discard; - if(mForceToSaveRawImage) - { - if(fetch_discard >= 0) - { - fetch_discard = llmax(fetch_discard, mSavedRawDiscardLevel) ; - } - } - if (mRawImage.notNull()) sRawCount--; if (mAuxRawImage.notNull()) sAuxCount--; bool finished = LLAppViewer::getTextureFetch()->getRequestFinished(getID(), fetch_discard, mRawImage, mAuxRawImage); @@ -1666,7 +1769,7 @@ bool LLViewerFetchedTexture::updateFetch() else { mFetchState = LLAppViewer::getTextureFetch()->getFetchState(mID, mDownloadProgress, mRequestedDownloadPriority, - mFetchPriority, mFetchDeltaTime, mRequestDeltaTime); + mFetchPriority, mFetchDeltaTime, mRequestDeltaTime, mCanUseHTTP); } // We may have data ready regardless of whether or not we are finished (e.g. waiting on write) @@ -1681,18 +1784,6 @@ bool LLViewerFetchedTexture::updateFetch() if ((mRawImage->getDataSize() > 0 && mRawDiscardLevel >= 0) && (current_discard < 0 || mRawDiscardLevel < current_discard)) { - if (getComponents() != mRawImage->getComponents()) - { - // We've changed the number of components, so we need to move any - // objects using this pool to a different pool. - mComponents = mRawImage->getComponents(); - mGLTexturep->setComponents(mComponents) ; - - for(U32 i = 0 ; i < mNumFaces ; i++) - { - mFaceList[i]->dirtyTexture() ; - } - } mFullWidth = mRawImage->getWidth() << mRawDiscardLevel; mFullHeight = mRawImage->getHeight() << mRawDiscardLevel; @@ -1758,18 +1849,6 @@ bool LLViewerFetchedTexture::updateFetch() } } - if (!mDontDiscard) - { - if (mBoostLevel == 0) - { - desired_discard = llmax(desired_discard, current_discard-1); - } - else - { - desired_discard = llmax(desired_discard, current_discard-2); - } - } - bool make_request = true; if (decode_priority <= 0) { @@ -1787,8 +1866,20 @@ bool LLViewerFetchedTexture::updateFetch() //{ // make_request = false; //} - else + + if(make_request) { + //load the texture progressively. + S32 delta_level = (mBoostLevel > LLViewerTexture::BOOST_NONE) ? 2 : 1 ; + if(current_discard < 0) + { + desired_discard = llmax(desired_discard, getMaxDiscardLevel() - delta_level); + } + else + { + desired_discard = llmax(desired_discard, current_discard - delta_level); + } + if (mIsFetching) { if (mRequestedDiscardLevel <= desired_discard) @@ -1808,17 +1899,23 @@ bool LLViewerFetchedTexture::updateFetch() if (make_request) { S32 w=0, h=0, c=0; - if (current_discard >= 0) + if (getDiscardLevel() >= 0) { w = mGLTexturep->getWidth(0); h = mGLTexturep->getHeight(0); c = mComponents; } + + const U32 override_tex_discard_level = gSavedSettings.getU32("TextureDiscardLevel"); + if (override_tex_discard_level != 0) + { + desired_discard = override_tex_discard_level; + } // bypass texturefetch directly by pulling from LLTextureCache bool fetch_request_created = false; fetch_request_created = LLAppViewer::getTextureFetch()->createRequest(mUrl, getID(),getTargetHost(), decode_priority, - w, h, c, desired_discard, needsAux()); + w, h, c, desired_discard, needsAux(), mCanUseHTTP); if (fetch_request_created) { @@ -1826,7 +1923,7 @@ bool LLViewerFetchedTexture::updateFetch() mIsFetching = TRUE; mRequestedDiscardLevel = desired_discard; mFetchState = LLAppViewer::getTextureFetch()->getFetchState(mID, mDownloadProgress, mRequestedDownloadPriority, - mFetchPriority, mFetchDeltaTime, mRequestDeltaTime); + mFetchPriority, mFetchDeltaTime, mRequestDeltaTime, mCanUseHTTP); } // if createRequest() failed, we're finishing up a request for this UUID, @@ -1849,73 +1946,6 @@ bool LLViewerFetchedTexture::updateFetch() return mIsFetching ? true : false; } -// -//force to fetch a new raw image for this texture -// -BOOL LLViewerFetchedTexture::forceFetch() -{ - if(!mForceToSaveRawImage) - { - return false ; - } - //if(mDesiredSavedRawDiscardLevel < getDiscardLevel()) - { - //no need to force fetching. normal fetching flow will do the work. - //return false ; - } - //if (mNeedsCreateTexture) - { - // We may be fetching still (e.g. waiting on write) - // but don't check until we've processed the raw data we have - //return false; - } - if(mIsFetching) - { - return false ; - } - if (mIsMissingAsset) - { - mForceToSaveRawImage = false ; - llassert_always(!mHasFetcher); - return false; // skip - } - if (!mLoadedCallbackList.empty() && mRawImage.notNull()) - { - return false; // process any raw image data in callbacks before replacing - } - if(mRawImage.notNull() && mRawDiscardLevel <= mDesiredSavedRawDiscardLevel) - { - return false ; // mRawImage is enough - } - - S32 desired_discard = mDesiredSavedRawDiscardLevel ; - S32 current_discard = getDiscardLevel(); - - bool fetch_request_created = false; - S32 w=0, h=0, c=0; - if (current_discard >= 0) - { - w = getWidth(0); - h = getHeight(0); - c = getComponents(); - } - setDecodePriority(maxDecodePriority()) ; - fetch_request_created = LLAppViewer::getTextureFetch()->createRequest(mUrl, getID(),getTargetHost(), getDecodePriority(), - w, h, c, desired_discard, needsAux()); - - if (fetch_request_created) - { - mHasFetcher = TRUE; - mIsFetching = TRUE; - mRequestedDiscardLevel = desired_discard ; - - mFetchState = LLAppViewer::getTextureFetch()->getFetchState(mID, mDownloadProgress, mRequestedDownloadPriority, - mFetchPriority, mFetchDeltaTime, mRequestDeltaTime); - } - - return mIsFetching ? true : false; -} - void LLViewerFetchedTexture::setIsMissingAsset() { if (mUrl.empty()) @@ -1957,6 +1987,10 @@ void LLViewerFetchedTexture::setLoadedCallback( loaded_callback_func loaded_call LLLoadedCallbackEntry* entryp = new LLLoadedCallbackEntry(loaded_callback, discard_level, keep_imageraw, userdata); mLoadedCallbackList.push_back(entryp); mNeedsAux |= needs_aux; + if(keep_imageraw) + { + forceToSaveRawImage(discard_level) ; + } if (mNeedsAux && mAuxRawImage.isNull() && getDiscardLevel() >= 0) { // We need aux data, but we've already loaded the image, and it didn't have any @@ -2030,10 +2064,13 @@ bool LLViewerFetchedTexture::doLoadedCallbacks() bool run_raw_callbacks = false; bool need_readback = false; + mMinDesiredDiscardLevel = MAX_DISCARD_LEVEL + 1; for(callback_list_t::iterator iter = mLoadedCallbackList.begin(); iter != mLoadedCallbackList.end(); ) { LLLoadedCallbackEntry *entryp = *iter++; + mMinDesiredDiscardLevel = llmin(mMinDesiredDiscardLevel, (S8)entryp->mDesiredDiscard) ; + if (entryp->mNeedsImageRaw) { if (mNeedsAux) @@ -2165,6 +2202,7 @@ bool LLViewerFetchedTexture::doLoadedCallbacks() if (mLoadedCallbackList.empty()) { gTextureList.mCallbackList.erase(this); + mMinDesiredDiscardLevel = MAX_DISCARD_LEVEL + 1; } // Done with any raw image data at this point (will be re-created if we still have callbacks) @@ -2205,8 +2243,15 @@ LLImageRaw* LLViewerFetchedTexture::reloadRawImage(S8 discard_level) if(mSavedRawDiscardLevel >= 0 && mSavedRawDiscardLevel <= discard_level) { - mRawImage = new LLImageRaw(getWidth(discard_level), getHeight(discard_level), getComponents()) ; - mRawImage->copy(getSavedRawImage()) ; + if(mSavedRawDiscardLevel != discard_level) + { + mRawImage = new LLImageRaw(getWidth(discard_level), getHeight(discard_level), getComponents()) ; + mRawImage->copy(getSavedRawImage()) ; + } + else + { + mRawImage = getSavedRawImage() ; + } mRawDiscardLevel = discard_level ; } else @@ -2216,13 +2261,18 @@ LLImageRaw* LLViewerFetchedTexture::reloadRawImage(S8 discard_level) { mRawImage = mCachedRawImage ; mRawDiscardLevel = mCachedRawDiscardLevel; - - forceToSaveRawImage(discard_level) ; } else //cached raw image is good enough, copy it. { - mRawImage = new LLImageRaw(getWidth(discard_level), getHeight(discard_level), getComponents()) ; - mRawImage->copy(mCachedRawImage) ; + if(mCachedRawDiscardLevel != discard_level) + { + mRawImage = new LLImageRaw(getWidth(discard_level), getHeight(discard_level), getComponents()) ; + mRawImage->copy(mCachedRawImage) ; + } + else + { + mRawImage = mCachedRawImage ; + } mRawDiscardLevel = discard_level ; } } @@ -2238,24 +2288,22 @@ void LLViewerFetchedTexture::destroyRawImage() if (mRawImage.notNull()) { - sRawCount--; - setCachedRawImage() ; + sRawCount--; - if(mForceToSaveRawImage) + if(mIsRawImageValid) { - saveRawImage() ; - } + if(mForceToSaveRawImage) + { + saveRawImage() ; + } + setCachedRawImage() ; + } } mRawImage = NULL; mAuxRawImage = NULL; mIsRawImageValid = FALSE; mRawDiscardLevel = INVALID_DISCARD_LEVEL; - - if(mForceToSaveRawImage) - { - forceFetch() ; - } } //use the mCachedRawImage to (re)generate the gl texture. @@ -2282,6 +2330,18 @@ void LLViewerFetchedTexture::switchToCachedImage() } } +//cache the imageraw forcefully. +//virtual +void LLViewerFetchedTexture::setCachedRawImage(S32 discard_level, LLImageRaw* imageraw) +{ + if(imageraw != mRawImage.get()) + { + mCachedRawImage = imageraw ; + mCachedRawDiscardLevel = discard_level ; + mCachedRawImageReady = TRUE ; + } +} + void LLViewerFetchedTexture::setCachedRawImage() { if(mRawImage == mCachedRawImage) @@ -2330,17 +2390,12 @@ void LLViewerFetchedTexture::setCachedRawImage() { --i ; } - //if(mForSculpt) - //{ - // mRawImage->scaleDownWithoutBlending(w >> i, h >> i) ; - //} - //else - { - mRawImage->scale(w >> i, h >> i) ; - } + + mRawImage->scale(w >> i, h >> i) ; } mCachedRawImage = mRawImage ; - mCachedRawDiscardLevel = mRawDiscardLevel + i ; + mRawDiscardLevel += i ; + mCachedRawDiscardLevel = mRawDiscardLevel ; } } @@ -2361,7 +2416,7 @@ void LLViewerFetchedTexture::checkCachedRawSculptImage() void LLViewerFetchedTexture::saveRawImage() { - if(mRawImage.isNull() || mSavedRawDiscardLevel == mRawDiscardLevel) + if(mRawImage.isNull() || mRawImage == mSavedRawImage || (mSavedRawDiscardLevel >= 0 && mSavedRawDiscardLevel <= mRawDiscardLevel)) { return ; } @@ -2379,12 +2434,22 @@ void LLViewerFetchedTexture::saveRawImage() void LLViewerFetchedTexture::forceToSaveRawImage(S32 desired_discard) { - if(!mForceToSaveRawImage && (mDesiredSavedRawDiscardLevel < 0 || mDesiredSavedRawDiscardLevel > desired_discard)) + if(!mForceToSaveRawImage || mDesiredSavedRawDiscardLevel < 0 || mDesiredSavedRawDiscardLevel > desired_discard) { mForceToSaveRawImage = TRUE ; mDesiredSavedRawDiscardLevel = desired_discard ; - forceFetch() ; + //copy from the cached raw image if exists. + if(mCachedRawImage.notNull() && mRawImage.isNull() ) + { + mRawImage = mCachedRawImage ; + mRawDiscardLevel = mCachedRawDiscardLevel ; + + saveRawImage() ; + + mRawImage = NULL ; + mRawDiscardLevel = INVALID_DISCARD_LEVEL ; + } } } void LLViewerFetchedTexture::destroySavedRawImage() @@ -2410,7 +2475,7 @@ BOOL LLViewerFetchedTexture::hasSavedRawImage() const F32 LLViewerFetchedTexture::getElapsedLastReferencedSavedRawImageTime() const { - return mLastReferencedSavedRawImageTime - sCurrentTime ; + return sCurrentTime - mLastReferencedSavedRawImageTime ; } //---------------------------------------------------------------------------------------------- //atlasing @@ -2687,7 +2752,7 @@ void LLViewerLODTexture::processTextureStats() } else { - if(isLargeImage() && !isJustBound() && mAdditionalDecodePriority < 1.0f) + if(isLargeImage() && !isJustBound() && mAdditionalDecodePriority < 0.3f) { //if is a big image and not being used recently, nor close to the view point, do not load hi-res data. mMaxVirtualSize = llmin(mMaxVirtualSize, (F32)LLViewerTexture::sMinLargeImageSize) ; @@ -2707,7 +2772,7 @@ void LLViewerLODTexture::processTextureStats() mCalculatedDiscardLevel = discard_level; } } - if (mBoostLevel < LLViewerTexture::BOOST_HIGH) + if (mBoostLevel < LLViewerTexture::BOOST_SCULPTED) { discard_level += sDesiredDiscardBias; discard_level *= sDesiredDiscardScale; // scale @@ -2733,8 +2798,7 @@ void LLViewerLODTexture::processTextureStats() // S32 current_discard = getDiscardLevel(); - if ((sDesiredDiscardBias > 0.0f) && - (current_discard >= 0 && mDesiredDiscardLevel >= current_discard)) + if (sDesiredDiscardBias > 0.0f && mBoostLevel < LLViewerTexture::BOOST_SCULPTED && current_discard >= 0) { // Limit the amount of GL memory bound each frame if ( BYTES_TO_MEGA_BYTES(sBoundTextureMemoryInBytes) > sMaxBoundTextureMemInMegaBytes * texmem_middle_bound_scale && @@ -2751,6 +2815,11 @@ void LLViewerLODTexture::processTextureStats() } } } + + if(mForceToSaveRawImage && mDesiredSavedRawDiscardLevel >= 0) + { + mDesiredDiscardLevel = llmin(mDesiredDiscardLevel, (S8)mDesiredSavedRawDiscardLevel) ; + } } void LLViewerLODTexture::scaleDown() @@ -2873,12 +2942,11 @@ LLViewerMediaTexture::~LLViewerMediaTexture() void LLViewerMediaTexture::reinit(BOOL usemipmaps /* = TRUE */) { - mGLTexturep = NULL ; - init(false); + llassert(mGLTexturep.notNull()) ; + mUseMipMaps = usemipmaps ; getLastReferencedTimer()->reset() ; - - generateGLTexture() ; + mGLTexturep->setUseMipMaps(mUseMipMaps) ; mGLTexturep->setNeedsAlphaAndPickMask(FALSE) ; } @@ -2983,6 +3051,10 @@ void LLViewerMediaTexture::initVirtualSize() void LLViewerMediaTexture::addMediaToFace(LLFace* facep) { + if(facep) + { + facep->setHasMedia(true) ; + } if(!mIsPlaying) { return ; //no need to add the face because the media is not in playing. @@ -2993,14 +3065,16 @@ void LLViewerMediaTexture::addMediaToFace(LLFace* facep) void LLViewerMediaTexture::removeMediaFromFace(LLFace* facep) { - if(!mIsPlaying) - { - return ; //no need to remove the face because the media is not in playing. - } if(!facep) { return ; } + facep->setHasMedia(false) ; + + if(!mIsPlaying) + { + return ; //no need to remove the face because the media is not in playing. + } mIsPlaying = FALSE ; //set to remove the media from the face. switchTexture(facep) ; @@ -3250,8 +3324,12 @@ F32 LLViewerMediaTexture::getMaxVirtualSize() } } - mNeedsResetMaxVirtualSize = TRUE ; + if(mCanResetMaxVirtualSize) + { + mNeedsResetMaxVirtualSize = TRUE ; + } reorganizeFaceList() ; + reorganizeVolumeList(); return mMaxVirtualSize ; } diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h index 79d9c4e7bb..361f56e02f 100644 --- a/indra/newview/llviewertexture.h +++ b/indra/newview/llviewertexture.h @@ -134,7 +134,9 @@ public: static S32 getIndexFromCategory(S32 category) ; static S32 getCategoryFromIndex(S32 index) ; - typedef std::vector<LLFace*> ll_face_list_t ; + typedef std::vector<LLFace*> ll_face_list_t; + typedef std::vector<LLVOVolume*> ll_volume_list_t; + protected: virtual ~LLViewerTexture(); @@ -164,6 +166,7 @@ public: void addTextureStats(F32 virtual_size, BOOL needs_gltexture = TRUE) const; void resetTextureStats(); + void setResetMaxVirtualSizeFlag(bool flag) ; virtual F32 getMaxVirtualSize() ; @@ -178,6 +181,11 @@ public: S32 getNumFaces() const; const ll_face_list_t* getFaceList() const {return &mFaceList;} + virtual void addVolume(LLVOVolume* volumep); + virtual void removeVolume(LLVOVolume* volumep); + S32 getNumVolumes() const; + const ll_volume_list_t* getVolumeList() const { return &mVolumeList; } + void generateGLTexture() ; void destroyGLTexture() ; @@ -191,6 +199,7 @@ public: LLGLuint getTexName() const ; BOOL createGLTexture() ; BOOL createGLTexture(S32 discard_level, const LLImageRaw* imageraw, S32 usename = 0, BOOL to_create = TRUE, S32 category = LLViewerTexture::OTHER); + virtual void setCachedRawImage(S32 discard_level, LLImageRaw* imageraw) ; void setFilteringOption(LLTexUnit::eTextureFilterOptions option); void setExplicitFormat(LLGLint internal_format, LLGLenum primary_format, LLGLenum type_format = 0, BOOL swap_bytes = FALSE); @@ -242,7 +251,7 @@ protected: void cleanup() ; void init(bool firstinit) ; void reorganizeFaceList() ; - + void reorganizeVolumeList() ; private: //note: do not make this function public. /*virtual*/ LLImageGL* getGLTexture() const ; @@ -255,6 +264,7 @@ protected: S32 mFullHeight; BOOL mUseMipMaps ; S8 mComponents; + bool mCanResetMaxVirtualSize; mutable F32 mMaxVirtualSize; // The largest virtual size of the image, in pixels - how much data to we need? mutable S8 mNeedsGLTexture; mutable BOOL mNeedsResetMaxVirtualSize ; @@ -269,6 +279,10 @@ protected: U32 mNumFaces ; LLFrameTimer mLastFaceListUpdateTimer ; + ll_volume_list_t mVolumeList; + U32 mNumVolumes; + LLFrameTimer mLastVolumeListUpdateTimer; + //do not use LLPointer here. LLViewerMediaTexture* mParcelMedia ; @@ -280,15 +294,15 @@ protected: INACTIVE, //not be used for the last certain period (i.e., 30 seconds). ACTIVE, //just being used, can become inactive if not being used for a certain time (10 seconds). NO_DELETE = 99 //stay in memory, can not be removed. - } LLGLTexureState; - LLGLTexureState mTextureState ; + } LLGLTextureState; + LLGLTextureState mTextureState ; public: static const U32 sCurrentFileVersion; static S32 sImageCount; static S32 sRawCount; static S32 sAuxCount; - static LLTimer sEvaluationTimer; + static LLFrameTimer sEvaluationTimer; static F32 sDesiredDiscardBias; static F32 sDesiredDiscardScale; static S32 sBoundTextureMemoryInBytes; @@ -436,23 +450,26 @@ public: BOOL isCachedRawImageReady() const {return mCachedRawImageReady ;} BOOL isRawImageValid()const { return mIsRawImageValid ; } void forceToSaveRawImage(S32 desired_discard = 0) ; + /*virtual*/ void setCachedRawImage(S32 discard_level, LLImageRaw* imageraw) ; void destroySavedRawImage() ; LLImageRaw* getSavedRawImage() ; BOOL hasSavedRawImage() const ; F32 getElapsedLastReferencedSavedRawImageTime() const ; BOOL isFullyLoaded() const; + BOOL hasFetcher() const { return mHasFetcher;} + void setCanUseHTTP(bool can_use_http) {mCanUseHTTP = can_use_http;} + protected: /*virtual*/ void switchToCachedImage(); + S32 getCurrentDiscardLevelForFetching() ; private: void init(bool firstinit) ; void cleanup() ; void saveRawImage() ; - BOOL forceFetch() ; void setCachedRawImage() ; - BOOL keepReuestedDiscardLevel(); //for atlas void resetFaceAtlas() ; @@ -492,6 +509,7 @@ protected: S8 mIsRawImageValid; S8 mHasFetcher; // We've made a fecth request S8 mIsFetching; // Fetch request is active + bool mCanUseHTTP ; //This texture can be fetched through http if true. mutable S8 mIsMissingAsset; // True if we know that there is no image asset with this image id in the database. diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp index ee934ab9c5..1e3311dafe 100644 --- a/indra/newview/llviewertexturelist.cpp +++ b/indra/newview/llviewertexturelist.cpp @@ -478,7 +478,7 @@ LLViewerFetchedTexture* LLViewerTextureList::createImage(const LLUUID &image_id, } else { - //by default, the texure can not be removed from memory even if it is not used. + //by default, the texture can not be removed from memory even if it is not used. //here turn this off //if this texture should be set to NO_DELETE, call setNoDelete() afterwards. imagep->forceActive() ; @@ -502,10 +502,11 @@ void LLViewerTextureList::addImageToList(LLViewerFetchedTexture *image) { llerrs << "LLViewerTextureList::addImageToList - Image already in list" << llendl; } - if ((mImageList.insert(image)).second != true) + if((mImageList.insert(image)).second != true) { - llwarns << "BAD STUFF! (mImageList.insert(image)).second != true" << llendl; + llerrs << "Error happens when insert image to mImageList!" << llendl ; } + image->setInImageList(TRUE) ; } @@ -522,10 +523,11 @@ void LLViewerTextureList::removeImageFromList(LLViewerFetchedTexture *image) } llerrs << "LLViewerTextureList::removeImageFromList - Image not in list" << llendl; } - if (mImageList.erase(image) != 1) - { - llwarns << "BAD STUFF! mImageList.erase(image) != 1" << llendl; - } + if(mImageList.erase(image) != 1) + { + llerrs << "Error happens when remove image from mImageList!" << llendl ; + } + image->setInImageList(FALSE) ; } diff --git a/indra/newview/llviewervisualparam.cpp b/indra/newview/llviewervisualparam.cpp index fad398e00b..1dc09a64ac 100644 --- a/indra/newview/llviewervisualparam.cpp +++ b/indra/newview/llviewervisualparam.cpp @@ -45,7 +45,7 @@ //----------------------------------------------------------------------------- LLViewerVisualParamInfo::LLViewerVisualParamInfo() : - mWearableType( WT_INVALID ), + mWearableType( LLWearableType::WT_INVALID ), mCrossWearable(FALSE), mCamDist( 0.5f ), mCamAngle( 0.f ), @@ -77,7 +77,7 @@ BOOL LLViewerVisualParamInfo::parseXml(LLXmlTreeNode *node) static LLStdStringHandle wearable_string = LLXmlTree::addAttributeString("wearable"); if( node->getFastAttributeString( wearable_string, wearable) ) { - mWearableType = LLWearableDictionary::typeNameToType( wearable ); + mWearableType = LLWearableType::typeNameToType( wearable ); } static LLStdStringHandle edit_group_string = LLXmlTree::addAttributeString("edit_group"); @@ -99,8 +99,6 @@ BOOL LLViewerVisualParamInfo::parseXml(LLXmlTreeNode *node) node->getFastAttributeF32( camera_angle_string, mCamAngle ); // in degrees static LLStdStringHandle camera_elevation_string = LLXmlTree::addAttributeString("camera_elevation"); node->getFastAttributeF32( camera_elevation_string, mCamElevation ); - static LLStdStringHandle camera_target_string = LLXmlTree::addAttributeString("camera_target"); - node->getFastAttributeString( camera_target_string, mCamTargetName ); mCamAngle += 180; diff --git a/indra/newview/llviewervisualparam.h b/indra/newview/llviewervisualparam.h index 1a3975eb99..f38c01fa6c 100644 --- a/indra/newview/llviewervisualparam.h +++ b/indra/newview/llviewervisualparam.h @@ -60,7 +60,6 @@ protected: F32 mCamDist; F32 mCamAngle; // degrees F32 mCamElevation; - std::string mCamTargetName; F32 mEditGroupDisplayOrder; BOOL mShowSimple; // show edit controls when in "simple ui" mode? F32 mSimpleMin; // when in simple UI, apply this minimum, range 0.f to 100.f @@ -104,7 +103,6 @@ public: F32 getCameraDistance() const { return getInfo()->mCamDist; } F32 getCameraAngle() const { return getInfo()->mCamAngle; } // degrees F32 getCameraElevation() const { return getInfo()->mCamElevation; } - const std::string& getCameraTargetName() const { return getInfo()->mCamTargetName; } BOOL getShowSimple() const { return getInfo()->mShowSimple; } F32 getSimpleMin() const { return getInfo()->mSimpleMin; } diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 315b7c52cf..c9c0b72528 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -44,6 +44,8 @@ #include <fstream> #include <algorithm> +#include "llagent.h" +#include "llagentcamera.h" #include "llfloaterreg.h" #include "llpanellogin.h" #include "llviewerkeyboard.h" @@ -83,7 +85,6 @@ #include "lltooltip.h" #include "llmediaentry.h" #include "llurldispatcher.h" -#include "llurlsimstring.h" // newview includes #include "llagent.h" @@ -105,7 +106,6 @@ #include "llfloaterbuildoptions.h" #include "llfloaterbuyland.h" #include "llfloatercamera.h" -#include "llfloatercustomize.h" #include "llfloaterland.h" #include "llfloaterinspect.h" #include "llfloatermap.h" @@ -131,6 +131,7 @@ #include "llmorphview.h" #include "llmoveview.h" #include "llnavigationbar.h" +#include "llpopupview.h" #include "llpreviewtexture.h" #include "llprogressview.h" #include "llresmgr.h" @@ -200,6 +201,7 @@ #include "llnearbychat.h" #include "llviewerwindowlistener.h" +#include "llpaneltopinfobar.h" #if LL_WINDOWS #include <tchar.h> // For Unicode conversion methods @@ -362,9 +364,9 @@ public: agent_center_text = llformat("AgentCenter %f %f %f", (F32)(tvector.mdV[VX]), (F32)(tvector.mdV[VY]), (F32)(tvector.mdV[VZ])); - if (gAgent.getAvatarObject()) + if (isAgentAvatarValid()) { - tvector = gAgent.getPosGlobalFromAgent(gAgent.getAvatarObject()->mRoot.getWorldPosition()); + tvector = gAgent.getPosGlobalFromAgent(gAgentAvatarp->mRoot.getWorldPosition()); agent_root_center_text = llformat("AgentRootCenter %f %f %f", (F32)(tvector.mdV[VX]), (F32)(tvector.mdV[VY]), (F32)(tvector.mdV[VZ])); } @@ -382,7 +384,7 @@ public: agent_left_text = llformat("AgentLeftAxis %f %f %f", (F32)(tvector.mdV[VX]), (F32)(tvector.mdV[VY]), (F32)(tvector.mdV[VZ])); - tvector = gAgent.getCameraPositionGlobal(); + tvector = gAgentCamera.getCameraPositionGlobal(); camera_center_text = llformat("CameraCenter %f %f %f", (F32)(tvector.mdV[VX]), (F32)(tvector.mdV[VY]), (F32)(tvector.mdV[VZ])); @@ -486,6 +488,10 @@ public: } ypos += y_inc; + addText(xpos, ypos, llformat("UI Verts/Calls: %d/%d", LLRender::sUIVerts, LLRender::sUICalls)); + LLRender::sUICalls = LLRender::sUIVerts = 0; + ypos += y_inc; + addText(xpos,ypos, llformat("%d/%d Nodes visible", gPipeline.mNumVisibleNodes, LLSpatialGroup::sNodeCount)); ypos += y_inc; @@ -615,114 +621,112 @@ BOOL LLViewerWindow::handleAnyMouseClick(LLWindow *window, LLCoordGL pos, MASK x = llround((F32)x / mDisplayScale.mV[VX]); y = llround((F32)y / mDisplayScale.mV[VY]); - if (down) - { - buttonstatestr = "down" ; - } - else - { - buttonstatestr = "up" ; - } - - switch (clicktype) - { - case LLMouseHandler::CLICK_LEFT: - mLeftMouseDown = down; - buttonname = "Left"; - break; - case LLMouseHandler::CLICK_RIGHT: - mRightMouseDown = down; - buttonname = "Right"; - break; - case LLMouseHandler::CLICK_MIDDLE: - mMiddleMouseDown = down; - buttonname = "Middle"; - break; - case LLMouseHandler::CLICK_DOUBLELEFT: - mLeftMouseDown = down; - buttonname = "Left Double Click"; - break; - } - - LLView::sMouseHandlerMessage.clear(); + // only send mouse clicks to UI if UI is visible + if(gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI)) + { - if (gMenuBarView) - { - // stop ALT-key access to menu - gMenuBarView->resetMenuTrigger(); - } + if (down) + { + buttonstatestr = "down" ; + } + else + { + buttonstatestr = "up" ; + } + + switch (clicktype) + { + case LLMouseHandler::CLICK_LEFT: + mLeftMouseDown = down; + buttonname = "Left"; + break; + case LLMouseHandler::CLICK_RIGHT: + mRightMouseDown = down; + buttonname = "Right"; + break; + case LLMouseHandler::CLICK_MIDDLE: + mMiddleMouseDown = down; + buttonname = "Middle"; + break; + case LLMouseHandler::CLICK_DOUBLELEFT: + mLeftMouseDown = down; + buttonname = "Left Double Click"; + break; + } + + LLView::sMouseHandlerMessage.clear(); - if (gDebugClicks) - { - llinfos << "ViewerWindow " << buttonname << " mouse " << buttonstatestr << " at " << x << "," << y << llendl; - } + if (gMenuBarView) + { + // stop ALT-key access to menu + gMenuBarView->resetMenuTrigger(); + } - // Make sure we get a corresponding mouseup event, even if the mouse leaves the window - if (down) - mWindow->captureMouse(); - else - mWindow->releaseMouse(); + if (gDebugClicks) + { + llinfos << "ViewerWindow " << buttonname << " mouse " << buttonstatestr << " at " << x << "," << y << llendl; + } - // Indicate mouse was active - LLUI::resetMouseIdleTimer(); + // Make sure we get a corresponding mouseup event, even if the mouse leaves the window + if (down) + mWindow->captureMouse(); + else + mWindow->releaseMouse(); - // Don't let the user move the mouse out of the window until mouse up. - if( LLToolMgr::getInstance()->getCurrentTool()->clipMouseWhenDown() ) - { - mWindow->setMouseClipping(down); - } + // Indicate mouse was active + LLUI::resetMouseIdleTimer(); - LLMouseHandler* mouse_captor = gFocusMgr.getMouseCapture(); - if( mouse_captor ) - { - S32 local_x; - S32 local_y; - mouse_captor->screenPointToLocal( x, y, &local_x, &local_y ); - if (LLView::sDebugMouseHandling) + // Don't let the user move the mouse out of the window until mouse up. + if( LLToolMgr::getInstance()->getCurrentTool()->clipMouseWhenDown() ) { - llinfos << buttonname << " Mouse " << buttonstatestr << " handled by captor " << mouse_captor->getName() << llendl; + mWindow->setMouseClipping(down); } - return mouse_captor->handleAnyMouseClick(local_x, local_y, mask, clicktype, down); - } - // Topmost view gets a chance before the hierarchy - LLUICtrl* top_ctrl = gFocusMgr.getTopCtrl(); - if (top_ctrl) - { - S32 local_x, local_y; - top_ctrl->screenPointToLocal( x, y, &local_x, &local_y ); - if (down) + LLMouseHandler* mouse_captor = gFocusMgr.getMouseCapture(); + if( mouse_captor ) { - if (top_ctrl->pointInView(local_x, local_y)) - { - return top_ctrl->handleAnyMouseClick(local_x, local_y, mask, clicktype, down) ; - } - else + S32 local_x; + S32 local_y; + mouse_captor->screenPointToLocal( x, y, &local_x, &local_y ); + if (LLView::sDebugMouseHandling) { - gFocusMgr.setTopCtrl(NULL); + llinfos << buttonname << " Mouse " << buttonstatestr << " handled by captor " << mouse_captor->getName() << llendl; } + return mouse_captor->handleAnyMouseClick(local_x, local_y, mask, clicktype, down); } - else + + // Topmost view gets a chance before the hierarchy + //LLUICtrl* top_ctrl = gFocusMgr.getTopCtrl(); + //if (top_ctrl) + //{ + // S32 local_x, local_y; + // top_ctrl->screenPointToLocal( x, y, &local_x, &local_y ); + // if (top_ctrl->pointInView(local_x, local_y)) + // { + // return top_ctrl->handleAnyMouseClick(local_x, local_y, mask, clicktype, down) ; + // } + // else + // { + // if (down) + // { + // gFocusMgr.setTopCtrl(NULL); + // } + // } + //} + + // Give the UI views a chance to process the click + if( mRootView->handleAnyMouseClick(x, y, mask, clicktype, down) ) { - if (top_ctrl->pointInView(local_x, local_y) && top_ctrl->handleMouseUp(local_x, local_y, mask)) + if (LLView::sDebugMouseHandling) { - return TRUE; + llinfos << buttonname << " Mouse " << buttonstatestr << " " << LLView::sMouseHandlerMessage << llendl; } + return TRUE; } - } - - // Give the UI views a chance to process the click - if( mRootView->handleAnyMouseClick(x, y, mask, clicktype, down) ) - { - if (LLView::sDebugMouseHandling) + else if (LLView::sDebugMouseHandling) { - llinfos << buttonname << " Mouse " << buttonstatestr << " " << LLView::sMouseHandlerMessage << llendl; + llinfos << buttonname << " Mouse " << buttonstatestr << " not handled by view" << llendl; } - return TRUE; - } - else if (LLView::sDebugMouseHandling) - { - llinfos << buttonname << " Mouse " << buttonstatestr << " not handled by view" << llendl; } // Do not allow tool manager to handle mouseclicks if we have disconnected @@ -778,7 +782,7 @@ BOOL LLViewerWindow::handleRightMouseDown(LLWindow *window, LLCoordGL pos, MASK // *HACK: this should be rolled into the composite tool logic, not // hardcoded at the top level. - if (CAMERA_MODE_CUSTOMIZE_AVATAR != gAgent.getCameraMode() && LLToolMgr::getInstance()->getCurrentTool() != LLToolPie::getInstance()) + if (CAMERA_MODE_CUSTOMIZE_AVATAR != gAgentCamera.getCameraMode() && LLToolMgr::getInstance()->getCurrentTool() != LLToolPie::getInstance()) { // If the current tool didn't process the click, we should show // the pie menu. This can be done by passing the event to the pie @@ -799,7 +803,7 @@ BOOL LLViewerWindow::handleRightMouseUp(LLWindow *window, LLCoordGL pos, MASK m BOOL LLViewerWindow::handleMiddleMouseDown(LLWindow *window, LLCoordGL pos, MASK mask) { BOOL down = TRUE; - gVoiceClient->middleMouseState(true); + LLVoiceClient::getInstance()->middleMouseState(true); handleAnyMouseClick(window,pos,mask,LLMouseHandler::CLICK_MIDDLE,down); // Always handled as far as the OS is concerned. @@ -826,18 +830,16 @@ LLWindowCallbacks::DragNDropResult LLViewerWindow::handleDragNDrop( LLWindow *wi if (slurl_dnd_enabled) { - // special case SLURLs - if ( LLSLURL::isSLURL( data ) ) + LLSLURL dropped_slurl(data); + if(dropped_slurl.isSpatial()) { if (drop) { - LLURLDispatcher::dispatch( data, NULL, true ); - LLURLSimString::setStringRaw( LLSLURL::stripProtocol( data ) ); - LLPanelLogin::refreshLocation( true ); - LLPanelLogin::updateLocationUI(); + LLURLDispatcher::dispatch( dropped_slurl.getSLURLString(), NULL, true ); + return LLWindowCallbacks::DND_MOVE; } - return LLWindowCallbacks::DND_MOVE; - }; + return LLWindowCallbacks::DND_COPY; + } } if (prim_media_dnd_enabled) @@ -852,39 +854,51 @@ LLWindowCallbacks::DragNDropResult LLViewerWindow::handleDragNDrop( LLWindow *wi LLVOVolume *obj = dynamic_cast<LLVOVolume*>(static_cast<LLViewerObject*>(pick_info.getObject())); - if (obj && obj->permModify() && !obj->getRegion()->getCapability("ObjectMedia").empty()) + if (obj && !obj->getRegion()->getCapability("ObjectMedia").empty()) { LLTextureEntry *te = obj->getTE(object_face); - if (te) + + // can modify URL if we can modify the object or we have navigate permissions + bool allow_modify_url = obj->permModify() || obj->hasMediaPermission( te->getMediaData(), LLVOVolume::MEDIA_PERM_INTERACT ); + + if (te && allow_modify_url ) { if (drop) { - if (! te->hasMedia()) + // object does NOT have media already + if ( ! te->hasMedia() ) { - // Create new media entry - LLSD media_data; - // XXX Should we really do Home URL too? - media_data[LLMediaEntry::HOME_URL_KEY] = url; - media_data[LLMediaEntry::CURRENT_URL_KEY] = url; - media_data[LLMediaEntry::AUTO_PLAY_KEY] = true; - obj->syncMediaData(object_face, media_data, true, true); - // XXX This shouldn't be necessary, should it ?!? - if (obj->getMediaImpl(object_face)) - obj->getMediaImpl(object_face)->navigateReload(); - obj->sendMediaDataUpdate(); - - result = LLWindowCallbacks::DND_COPY; + // we are allowed to modify the object + if ( obj->permModify() ) + { + // Create new media entry + LLSD media_data; + // XXX Should we really do Home URL too? + media_data[LLMediaEntry::HOME_URL_KEY] = url; + media_data[LLMediaEntry::CURRENT_URL_KEY] = url; + media_data[LLMediaEntry::AUTO_PLAY_KEY] = true; + obj->syncMediaData(object_face, media_data, true, true); + // XXX This shouldn't be necessary, should it ?!? + if (obj->getMediaImpl(object_face)) + obj->getMediaImpl(object_face)->navigateReload(); + obj->sendMediaDataUpdate(); + + result = LLWindowCallbacks::DND_COPY; + } } - else { - // Check the whitelist - if (te->getMediaData()->checkCandidateUrl(url)) + else + // object HAS media already + { + // URL passes the whitelist + if (te->getMediaData()->checkCandidateUrl( url ) ) { // just navigate to the URL if (obj->getMediaImpl(object_face)) { obj->getMediaImpl(object_face)->navigateTo(url); } - else { + else + { // This is very strange. Navigation should // happen via the Impl, but we don't have one. // This sends it to the server, which /should/ @@ -895,13 +909,15 @@ LLWindowCallbacks::DragNDropResult LLViewerWindow::handleDragNDrop( LLWindow *wi obj->sendMediaDataUpdate(); } result = LLWindowCallbacks::DND_LINK; + } } LLSelectMgr::getInstance()->unhighlightObjectOnly(mDragHoveredObject); mDragHoveredObject = NULL; } - else { + else + { // Check the whitelist, if there's media (otherwise just show it) if (te->getMediaData() == NULL || te->getMediaData()->checkCandidateUrl(url)) { @@ -913,6 +929,7 @@ LLWindowCallbacks::DragNDropResult LLViewerWindow::handleDragNDrop( LLWindow *wi LLSelectMgr::getInstance()->highlightObjectOnly(mDragHoveredObject); } result = (! te->hasMedia()) ? LLWindowCallbacks::DND_COPY : LLWindowCallbacks::DND_LINK; + } } } @@ -940,7 +957,7 @@ LLWindowCallbacks::DragNDropResult LLViewerWindow::handleDragNDrop( LLWindow *wi BOOL LLViewerWindow::handleMiddleMouseUp(LLWindow *window, LLCoordGL pos, MASK mask) { BOOL down = FALSE; - gVoiceClient->middleMouseState(false); + LLVoiceClient::getInstance()->middleMouseState(false); handleAnyMouseClick(window,pos,mask,LLMouseHandler::CLICK_MIDDLE,down); // Always handled as far as the OS is concerned. @@ -982,6 +999,7 @@ void LLViewerWindow::handleMouseLeave(LLWindow *window) // Note: we won't get this if we have captured the mouse. llassert( gFocusMgr.getMouseCapture() == NULL ); mMouseInWindow = FALSE; + LLToolTipMgr::instance().blockToolTips(); } BOOL LLViewerWindow::handleCloseRequest(LLWindow *window) @@ -1056,7 +1074,7 @@ void LLViewerWindow::handleFocusLost(LLWindow *window) BOOL LLViewerWindow::handleTranslatedKeyDown(KEY key, MASK mask, BOOL repeated) { // Let the voice chat code check for its PTT key. Note that this never affects event processing. - gVoiceClient->keyDown(key, mask); + LLVoiceClient::getInstance()->keyDown(key, mask); if (gAwayTimer.getElapsedTimeF32() > MIN_AFK_TIME) { @@ -1078,7 +1096,7 @@ BOOL LLViewerWindow::handleTranslatedKeyDown(KEY key, MASK mask, BOOL repeated) BOOL LLViewerWindow::handleTranslatedKeyUp(KEY key, MASK mask) { // Let the voice chat code check for its PTT key. Note that this never affects event processing. - gVoiceClient->keyUp(key, mask); + LLVoiceClient::getInstance()->keyUp(key, mask); return FALSE; } @@ -1100,28 +1118,7 @@ BOOL LLViewerWindow::handleActivate(LLWindow *window, BOOL activated) mActive = TRUE; send_agent_resume(); gAgent.clearAFK(); - if (mWindow->getFullscreen() && !mIgnoreActivate) - { - if (!LLApp::isExiting() ) - { - if (LLStartUp::getStartupState() >= STATE_STARTED) - { - // if we're in world, show a progress bar to hide reloading of textures - llinfos << "Restoring GL during activate" << llendl; - restoreGL("Restoring..."); - } - else - { - // otherwise restore immediately - restoreGL(); - } - } - else - { - llwarns << "Activating while quitting" << llendl; - } - } - + // Unmute audio audio_update_volume(); } @@ -1135,18 +1132,13 @@ BOOL LLViewerWindow::handleActivate(LLWindow *window, BOOL activated) } // SL-53351: Make sure we're not in mouselook when minimised, to prevent control issues - if (gAgent.getCameraMode() == CAMERA_MODE_MOUSELOOK) + if (gAgentCamera.getCameraMode() == CAMERA_MODE_MOUSELOOK) { - gAgent.changeCameraToDefault(); + gAgentCamera.changeCameraToDefault(); } send_agent_pause(); - - if (mWindow->getFullscreen() && !mIgnoreActivate) - { - llinfos << "Stopping GL during deactivation" << llendl; - stopGL(); - } + // Mute audio audio_update_volume(); } @@ -1155,7 +1147,7 @@ BOOL LLViewerWindow::handleActivate(LLWindow *window, BOOL activated) BOOL LLViewerWindow::handleActivateApp(LLWindow *window, BOOL activating) { - //if (!activating) gAgent.changeCameraToDefault(); + //if (!activating) gAgentCamera.changeCameraToDefault(); LLViewerJoystick::getInstance()->setNeedsReset(true); return FALSE; @@ -1313,12 +1305,10 @@ LLViewerWindow::LLViewerWindow( const std::string& title, const std::string& name, S32 x, S32 y, S32 width, S32 height, - BOOL fullscreen, BOOL ignore_pixel_depth) + BOOL fullscreen, BOOL ignore_pixel_depth) // fullscreen is no longer used : mWindow(NULL), mActive(TRUE), - mWantFullscreen(fullscreen), - mShowFullscreenProgress(FALSE), mWindowRectRaw(0, height, width, 0), mWindowRectScaled(0, height, width, 0), mWorldViewRectRaw(0, height, width, 0), @@ -1333,9 +1323,9 @@ LLViewerWindow::LLViewerWindow( mIgnoreActivate( FALSE ), mResDirty(false), mStatesDirty(false), - mIsFullscreenChecked(false), mCurrResolutionIndex(0), - mViewerWindowListener(new LLViewerWindowListener(this)) + mViewerWindowListener(new LLViewerWindowListener(this)), + mProgressView(NULL) { LLNotificationChannel::buildChannel("VW_alerts", "Visible", LLNotificationFilters::filterBy<std::string>(&LLNotification::getType, "alert")); LLNotificationChannel::buildChannel("VW_alertmodal", "Visible", LLNotificationFilters::filterBy<std::string>(&LLNotification::getType, "alertmodal")); @@ -1368,7 +1358,7 @@ LLViewerWindow::LLViewerWindow( if (NULL == mWindow) { - LLSplashScreen::update("Shutting down..."); + LLSplashScreen::update(LLTrans::getString("ShuttingDown")); #if LL_LINUX || LL_SOLARIS llwarns << "Unable to create window, be sure screen is set at 32-bit color and your graphics driver is configured correctly. See README-linux.txt or README-solaris.txt for further information." << llendl; @@ -1414,6 +1404,7 @@ LLViewerWindow::LLViewerWindow( if (LLFeatureManager::getInstance()->isSafe() || (gSavedSettings.getS32("LastFeatureVersion") != LLFeatureManager::getInstance()->getVersion()) + || (gSavedSettings.getS32("LastGPUClass") != LLFeatureManager::getInstance()->getGPUClass()) || (gSavedSettings.getBOOL("ProbeHardwareOnStartup"))) { LLFeatureManager::getInstance()->applyRecommendedSettings(); @@ -1537,11 +1528,13 @@ void LLViewerWindow::initBase() mWorldViewPlaceholder = main_view->getChildView("world_view_rect")->getHandle(); mNonSideTrayView = main_view->getChildView("non_side_tray_view")->getHandle(); mFloaterViewHolder = main_view->getChildView("floater_view_holder")->getHandle(); + mPopupView = main_view->getChild<LLPopupView>("popup_holder"); // Constrain floaters to inside the menu and status bar regions. gFloaterView = main_view->getChild<LLFloaterView>("Floater View"); gSnapshotFloaterView = main_view->getChild<LLSnapshotFloaterView>("Snapshot Floater View"); + // Console llassert( !gConsole ); LLConsole::Params cp; @@ -1569,9 +1562,11 @@ void LLViewerWindow::initBase() gDebugView->init(); gToolTipView = getRootView()->getChild<LLToolTipView>("tooltip view"); + // Initialize busy response message when logged in + LLAppViewer::instance()->setOnLoginCompletedCallback(boost::bind(&LLFloaterPreference::initBusyResponse)); + // Add the progress bar view (startup view), which overrides everything - mProgressView = new LLProgressView(full_window); - getRootView()->addChild(mProgressView); + mProgressView = getRootView()->getChild<LLProgressView>("progress_view"); setShowProgress(FALSE); setProgressCancelButtonVisible(FALSE); @@ -1590,8 +1585,8 @@ void LLViewerWindow::initWorldUI() gIMMgr = LLIMMgr::getInstance(); - getRootView()->sendChildToFront(gFloaterView); - getRootView()->sendChildToFront(gSnapshotFloaterView); + //getRootView()->sendChildToFront(gFloaterView); + //getRootView()->sendChildToFront(gSnapshotFloaterView); // new bottom panel LLPanel* bottom_tray_container = getRootView()->getChild<LLPanel>("bottom_tray_container"); @@ -1649,24 +1644,18 @@ void LLViewerWindow::initWorldUI() navbar->showFavoritesPanel(FALSE); } - if (!gSavedSettings.getBOOL("ShowCameraButton")) - { - LLBottomTray::getInstance()->showCameraButton(FALSE); - } + // Top Info bar + LLPanel* topinfo_bar_container = getRootView()->getChild<LLPanel>("topinfo_bar_container"); + LLPanelTopInfoBar* topinfo_bar = LLPanelTopInfoBar::getInstance(); - if (!gSavedSettings.getBOOL("ShowSnapshotButton")) - { - LLBottomTray::getInstance()->showSnapshotButton(FALSE); - } + topinfo_bar->setShape(topinfo_bar_container->getLocalRect()); - if (!gSavedSettings.getBOOL("ShowMoveButton")) - { - LLBottomTray::getInstance()->showMoveButton(FALSE); - } + topinfo_bar_container->addChild(topinfo_bar); + topinfo_bar_container->setVisible(TRUE); - if (!gSavedSettings.getBOOL("ShowGestureButton")) + if (!gSavedSettings.getBOOL("ShowMiniLocationPanel")) { - LLBottomTray::getInstance()->showGestureButton(FALSE); + topinfo_bar->setVisible(FALSE); } if ( gHUDView == NULL ) @@ -1726,7 +1715,11 @@ void LLViewerWindow::shutdownViews() // destroy the nav bar, not currently part of gViewerWindow // *TODO: Make LLNavigationBar part of gViewerWindow delete LLNavigationBar::getInstance(); - + + // destroy menus after instantiating navbar above, as it needs + // access to gMenuHolder + cleanup_menus(); + // Delete all child views. delete mRootView; mRootView = NULL; @@ -1889,24 +1882,17 @@ void LLViewerWindow::reshape(S32 width, S32 height) sendShapeToSim(); - - // store the mode the user wants (even if not there yet) - gSavedSettings.setBOOL("WindowFullScreen", mWantFullscreen); - // store new settings for the mode we are in, regardless - if (!mWindow->getFullscreen()) - { - // Only save size if not maximized - BOOL maximized = mWindow->getMaximized(); - gSavedSettings.setBOOL("WindowMaximized", maximized); + // Only save size if not maximized + BOOL maximized = mWindow->getMaximized(); + gSavedSettings.setBOOL("WindowMaximized", maximized); - LLCoordScreen window_size; - if (!maximized - && mWindow->getSize(&window_size)) - { - gSavedSettings.setS32("WindowWidth", window_size.mX); - gSavedSettings.setS32("WindowHeight", window_size.mY); - } + LLCoordScreen window_size; + if (!maximized + && mWindow->getSize(&window_size)) + { + gSavedSettings.setS32("WindowWidth", window_size.mX); + gSavedSettings.setS32("WindowHeight", window_size.mY); } LLViewerStats::getInstance()->setStat(LLViewerStats::ST_WINDOW_WIDTH, (F64)width); @@ -1931,7 +1917,7 @@ void LLViewerWindow::setNormalControlsVisible( BOOL visible ) // ...and set the menu color appropriately. setMenuBackgroundColor(gAgent.getGodLevel() > GOD_NOT, - LLViewerLogin::getInstance()->isInProductionGrid()); + LLGridManager::getInstance()->isInProductionGrid()); } if ( gStatusBar ) @@ -1952,15 +1938,15 @@ void LLViewerWindow::setMenuBackgroundColor(bool god_mode, bool dev_grid) LLSD args; LLColor4 new_bg_color; - if(god_mode && LLViewerLogin::getInstance()->isInProductionGrid()) + if(god_mode && LLGridManager::getInstance()->isInProductionGrid()) { new_bg_color = LLUIColorTable::instance().getColor( "MenuBarGodBgColor" ); } - else if(god_mode && !LLViewerLogin::getInstance()->isInProductionGrid()) + else if(god_mode && !LLGridManager::getInstance()->isInProductionGrid()) { new_bg_color = LLUIColorTable::instance().getColor( "MenuNonProductionGodBgColor" ); } - else if(!god_mode && !LLViewerLogin::getInstance()->isInProductionGrid()) + else if(!god_mode && !LLGridManager::getInstance()->isInProductionGrid()) { new_bg_color = LLUIColorTable::instance().getColor( "MenuNonProductionBgColor" ); } @@ -1984,21 +1970,24 @@ void LLViewerWindow::drawDebugText() { gGL.color4f(1,1,1,1); gGL.pushMatrix(); + gGL.pushUIMatrix(); { // scale view by UI global scale factor and aspect ratio correction factor - glScalef(mDisplayScale.mV[VX], mDisplayScale.mV[VY], 1.f); + gGL.scaleUI(mDisplayScale.mV[VX], mDisplayScale.mV[VY], 1.f); mDebugText->draw(); } + gGL.popUIMatrix(); gGL.popMatrix(); + gGL.flush(); } void LLViewerWindow::draw() { -#if LL_DEBUG +//#if LL_DEBUG LLView::sIsDrawing = TRUE; -#endif +//#endif stop_glerror(); LLUI::setLineWidth(1.f); @@ -2037,9 +2026,11 @@ void LLViewerWindow::draw() // No translation needed, this view is glued to 0,0 gGL.pushMatrix(); + LLUI::pushMatrix(); { + // scale view by UI global scale factor and aspect ratio correction factor - glScalef(mDisplayScale.mV[VX], mDisplayScale.mV[VY], 1.f); + gGL.scaleUI(mDisplayScale.mV[VX], mDisplayScale.mV[VY], 1.f); LLVector2 old_scale_factor = LLUI::sGLScaleFactor; // apply camera zoom transform (for high res screenshots) @@ -2061,7 +2052,7 @@ void LLViewerWindow::draw() // Draw tool specific overlay on world LLToolMgr::getInstance()->getCurrentTool()->draw(); - if( gAgent.cameraMouselook() ) + if( gAgentCamera.cameraMouselook() || LLFloaterCamera::inFreeCameraMode() ) { drawMouselookInstructions(); stop_glerror(); @@ -2105,22 +2096,25 @@ void LLViewerWindow::draw() LLUI::sGLScaleFactor = old_scale_factor; } + LLUI::popMatrix(); gGL.popMatrix(); -#if LL_DEBUG +//#if LL_DEBUG LLView::sIsDrawing = FALSE; -#endif +//#endif } // Takes a single keydown event, usually when UI is visible BOOL LLViewerWindow::handleKey(KEY key, MASK mask) { + // hide tooltips on keypress + LLToolTipMgr::instance().blockToolTips(); + if (gFocusMgr.getKeyboardFocus() && !(mask & (MASK_CONTROL | MASK_ALT)) && !gFocusMgr.getKeystrokesOnly()) { // We have keyboard focus, and it's not an accelerator - if (key < 0x80) { // Not a special key, so likely (we hope) to generate a character. Let it fall through to character handler first. @@ -2128,68 +2122,48 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask) } } - // hide tooltips on keypress - LLToolTipMgr::instance().blockToolTips(); - - // Explicit hack for debug menu. - if ((MASK_ALT & mask) && - (MASK_CONTROL & mask) && - ('D' == key || 'd' == key)) + // let menus handle navigation keys for navigation + if ((gMenuBarView && gMenuBarView->handleKey(key, mask, TRUE)) + ||(gLoginMenuBarView && gLoginMenuBarView->handleKey(key, mask, TRUE)) + ||(gMenuHolder && gMenuHolder->handleKey(key, mask, TRUE))) { - toggle_debug_menus(NULL); + return TRUE; } - // Explicit hack for debug menu. - if ((mask == (MASK_SHIFT | MASK_CONTROL)) && - ('G' == key || 'g' == key)) + // give menus a chance to handle modified (Ctrl, Alt) shortcut keys before current focus + // as long as focus isn't locked + if (mask & (MASK_CONTROL | MASK_ALT) && !gFocusMgr.focusLocked()) { - if (LLStartUp::getStartupState() < STATE_LOGIN_CLEANUP) //on splash page + if ((gMenuBarView && gMenuBarView->handleAcceleratorKey(key, mask)) + ||(gLoginMenuBarView && gLoginMenuBarView->handleAcceleratorKey(key, mask))) { - BOOL visible = ! gSavedSettings.getBOOL("ForceShowGrid"); - gSavedSettings.setBOOL("ForceShowGrid", visible); - - // Initialize visibility (and don't force visibility - use prefs) - LLPanelLogin::refreshLocation( false ); + return TRUE; } } - // Debugging view for unified notifications: CTRL-SHIFT-5 - // *FIXME: Having this special-cased right here (just so this can be invoked from the login screen) sucks. - if ((MASK_SHIFT & mask) - && (!(MASK_ALT & mask)) - && (MASK_CONTROL & mask) - && ('5' == key)) + // give floaters first chance to handle TAB key + // so frontmost floater gets focus + // if nothing has focus, go to first or last UI element as appropriate + if (key == KEY_TAB && (mask & MASK_CONTROL || gFocusMgr.getKeyboardFocus() == NULL)) { - //LLFloaterNotificationConsole::showInstance(); - LLFloaterReg::showInstance("notifications_console"); - return TRUE; - } - - // handle escape key - //if (key == KEY_ESCAPE && mask == MASK_NONE) - //{ + if (gMenuHolder) gMenuHolder->hideMenus(); - // *TODO: get this to play well with mouselook and hidden - // cursor modes, etc, and re-enable. - //if (gFocusMgr.getMouseCapture()) - //{ - // gFocusMgr.setMouseCapture(NULL); - // return TRUE; - //} - //} + // if CTRL-tabbing (and not just TAB with no focus), go into window cycle mode + gFloaterView->setCycleMode((mask & MASK_CONTROL) != 0); - // let menus handle navigation keys - if (gMenuBarView && gMenuBarView->handleKey(key, mask, TRUE)) - { - return TRUE; - } - // let menus handle navigation keys - if (gLoginMenuBarView && gLoginMenuBarView->handleKey(key, mask, TRUE)) - { + // do CTRL-TAB and CTRL-SHIFT-TAB logic + if (mask & MASK_SHIFT) + { + mRootView->focusPrevRoot(); + } + else + { + mRootView->focusNextRoot(); + } return TRUE; } - //some of context menus use this container, let context menu handle navigation keys - if(gMenuHolder && gMenuHolder->handleKey(key, mask, TRUE)) + // hidden edit menu for cut/copy/paste + if (gEditMenu && gEditMenu->handleAcceleratorKey(key, mask)) { return TRUE; } @@ -2242,7 +2216,7 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask) } // Try for a new-format gesture - if (LLGestureManager::instance().triggerGesture(key, mask)) + if (LLGestureMgr::instance().triggerGesture(key, mask)) { return TRUE; } @@ -2254,50 +2228,10 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask) return TRUE; } - // Topmost view gets a chance before the hierarchy - // *FIX: get rid of this? - //LLUICtrl* top_ctrl = gFocusMgr.getTopCtrl(); - //if (top_ctrl) - //{ - // if( top_ctrl->handleKey( key, mask, TRUE ) ) - // { - // return TRUE; - // } - //} - - // give floaters first chance to handle TAB key - // so frontmost floater gets focus - if (key == KEY_TAB) - { - // if nothing has focus, go to first or last UI element as appropriate - if (mask & MASK_CONTROL || gFocusMgr.getKeyboardFocus() == NULL) - { - if (gMenuHolder) gMenuHolder->hideMenus(); - // if CTRL-tabbing (and not just TAB with no focus), go into window cycle mode - gFloaterView->setCycleMode((mask & MASK_CONTROL) != 0); - - // do CTRL-TAB and CTRL-SHIFT-TAB logic - if (mask & MASK_SHIFT) - { - mRootView->focusPrevRoot(); - } - else - { - mRootView->focusNextRoot(); - } - return TRUE; - } - } - - // give menus a chance to handle keys - if (gMenuBarView && gMenuBarView->handleAcceleratorKey(key, mask)) - { - return TRUE; - } - - // give menus a chance to handle keys - if (gLoginMenuBarView && gLoginMenuBarView->handleAcceleratorKey(key, mask)) + // give menus a chance to handle unmodified accelerator keys + if ((gMenuBarView && gMenuBarView->handleAcceleratorKey(key, mask)) + ||(gLoginMenuBarView && gLoginMenuBarView->handleAcceleratorKey(key, mask))) { return TRUE; } @@ -2396,11 +2330,35 @@ void LLViewerWindow::handleScrollWheel(S32 clicks) // Zoom the camera in and out behavior if(top_ctrl == 0 && getWorldViewRectScaled().pointInRect(mCurrentMousePoint.mX, mCurrentMousePoint.mY) ) - gAgent.handleScrollWheel(clicks); + gAgentCamera.handleScrollWheel(clicks); return; } +void LLViewerWindow::addPopup(LLView* popup) +{ + if (mPopupView) + { + mPopupView->addPopup(popup); + } +} + +void LLViewerWindow::removePopup(LLView* popup) +{ + if (mPopupView) + { + mPopupView->removePopup(popup); + } +} + +void LLViewerWindow::clearPopups() +{ + if (mPopupView) + { + mPopupView->clearPopups(); + } +} + void LLViewerWindow::moveCursorToCenter() { if (! gSavedSettings.getBOOL("DisableMouseWarp")) @@ -2457,12 +2415,19 @@ void append_xui_tooltip(LLView* viewp, LLToolTip::Params& params) // event processing. void LLViewerWindow::updateUI() { + static LLFastTimer::DeclareTimer ftm("Update UI"); + LLFastTimer t(ftm); + static std::string last_handle_msg; + LLConsole::updateClass(); + // animate layout stacks so we have up to date rect for world view LLLayoutStack::updateClass(); - updateWorldViewRect(); + // use full window for world view when not rendering UI + bool world_view_uses_full_window = gAgentCamera.cameraMouselook() || !gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI); + updateWorldViewRect(world_view_uses_full_window); LLView::sMouseHandlerMessage.clear(); @@ -2512,68 +2477,99 @@ void LLViewerWindow::updateUI() root_view = mRootView; } - // include all ancestors of captor_view as automatically having mouse - if (captor_view) + // only update mouse hover set when UI is visible (since we shouldn't send hover events to invisible UI + if (gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI)) { - LLView* captor_parent_view = captor_view->getParent(); - while(captor_parent_view) + // include all ancestors of captor_view as automatically having mouse + if (captor_view) { - mouse_hover_set.insert(captor_parent_view->getHandle()); - captor_parent_view = captor_parent_view->getParent(); + LLView* captor_parent_view = captor_view->getParent(); + while(captor_parent_view) + { + mouse_hover_set.insert(captor_parent_view->getHandle()); + captor_parent_view = captor_parent_view->getParent(); + } } - } - // aggregate visible views that contain mouse cursor in display order + // aggregate visible views that contain mouse cursor in display order + LLPopupView::popup_list_t popups = mPopupView->getCurrentPopups(); - // while the top_ctrl contains the mouse cursor, only it and its descendants will receive onMouseEnter events - if (top_ctrl && top_ctrl->calcScreenBoundingRect().pointInRect(x, y)) - { - // iterator over contents of top_ctrl, and throw into mouse_hover_set - for (LLView::tree_iterator_t it = top_ctrl->beginTreeDFS(); - it != top_ctrl->endTreeDFS(); - ++it) + for(LLPopupView::popup_list_t::iterator popup_it = popups.begin(); popup_it != popups.end(); ++popup_it) { - LLView* viewp = *it; - if (viewp->getVisible() - && viewp->calcScreenBoundingRect().pointInRect(x, y)) + LLView* popup = popup_it->get(); + if (popup && popup->calcScreenBoundingRect().pointInRect(x, y)) { - // we have a view that contains the mouse, add it to the set - mouse_hover_set.insert(viewp->getHandle()); + // iterator over contents of top_ctrl, and throw into mouse_hover_set + for (LLView::tree_iterator_t it = popup->beginTreeDFS(); + it != popup->endTreeDFS(); + ++it) + { + LLView* viewp = *it; + if (viewp->getVisible() + && viewp->calcScreenBoundingRect().pointInRect(x, y)) + { + // we have a view that contains the mouse, add it to the set + mouse_hover_set.insert(viewp->getHandle()); + } + else + { + // skip this view and all of its children + it.skipDescendants(); + } + } } - else + } + + // while the top_ctrl contains the mouse cursor, only it and its descendants will receive onMouseEnter events + if (top_ctrl && top_ctrl->calcScreenBoundingRect().pointInRect(x, y)) + { + // iterator over contents of top_ctrl, and throw into mouse_hover_set + for (LLView::tree_iterator_t it = top_ctrl->beginTreeDFS(); + it != top_ctrl->endTreeDFS(); + ++it) { - // skip this view and all of its children - it.skipDescendants(); + LLView* viewp = *it; + if (viewp->getVisible() + && viewp->calcScreenBoundingRect().pointInRect(x, y)) + { + // we have a view that contains the mouse, add it to the set + mouse_hover_set.insert(viewp->getHandle()); + } + else + { + // skip this view and all of its children + it.skipDescendants(); + } } } - } - else - { - // walk UI tree in depth-first order - for (LLView::tree_iterator_t it = root_view->beginTreeDFS(); - it != root_view->endTreeDFS(); - ++it) + else { - LLView* viewp = *it; - // calculating the screen rect involves traversing the parent, so this is less than optimal - if (viewp->getVisible() - && viewp->calcScreenBoundingRect().pointInRect(x, y)) + // walk UI tree in depth-first order + for (LLView::tree_iterator_t it = root_view->beginTreeDFS(); + it != root_view->endTreeDFS(); + ++it) { + LLView* viewp = *it; + // calculating the screen rect involves traversing the parent, so this is less than optimal + if (viewp->getVisible() + && viewp->calcScreenBoundingRect().pointInRect(x, y)) + { - // if this view is mouse opaque, nothing behind it should be in mouse_hover_set - if (viewp->getMouseOpaque()) + // if this view is mouse opaque, nothing behind it should be in mouse_hover_set + if (viewp->getMouseOpaque()) + { + // constrain further iteration to children of this widget + it = viewp->beginTreeDFS(); + } + + // we have a view that contains the mouse, add it to the set + mouse_hover_set.insert(viewp->getHandle()); + } + else { - // constrain further iteration to children of this widget - it = viewp->beginTreeDFS(); + // skip this view and all of its children + it.skipDescendants(); } - - // we have a view that contains the mouse, add it to the set - mouse_hover_set.insert(viewp->getHandle()); - } - else - { - // skip this view and all of its children - it.skipDescendants(); } } } @@ -2617,156 +2613,170 @@ void LLViewerWindow::updateUI() // store resulting hover set for next frame swap(mMouseHoverViews, mouse_hover_set); - if( mouse_captor ) - { - // Pass hover events to object capturing mouse events. - S32 local_x; - S32 local_y; - mouse_captor->screenPointToLocal( x, y, &local_x, &local_y ); - handled = mouse_captor->handleHover(local_x, local_y, mask); - if (LLView::sDebugMouseHandling) - { - llinfos << "Hover handled by captor " << mouse_captor->getName() << llendl; - } + // only handle hover events when UI is enabled + if (gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI)) + { - if( !handled ) + if( mouse_captor ) { - lldebugst(LLERR_USER_INPUT) << "hover not handled by mouse captor" << llendl; + // Pass hover events to object capturing mouse events. + S32 local_x; + S32 local_y; + mouse_captor->screenPointToLocal( x, y, &local_x, &local_y ); + handled = mouse_captor->handleHover(local_x, local_y, mask); + if (LLView::sDebugMouseHandling) + { + llinfos << "Hover handled by captor " << mouse_captor->getName() << llendl; + } + + if( !handled ) + { + lldebugst(LLERR_USER_INPUT) << "hover not handled by mouse captor" << llendl; + } } - } - else - { - if (top_ctrl) + else { - S32 local_x, local_y; - top_ctrl->screenPointToLocal( x, y, &local_x, &local_y ); - handled = top_ctrl->pointInView(local_x, local_y) && top_ctrl->handleHover(local_x, local_y, mask); - handled_by_top_ctrl = TRUE; - } + if (top_ctrl) + { + S32 local_x, local_y; + top_ctrl->screenPointToLocal( x, y, &local_x, &local_y ); + handled = top_ctrl->pointInView(local_x, local_y) && top_ctrl->handleHover(local_x, local_y, mask); + handled_by_top_ctrl = TRUE; + } - if ( !handled ) - { - // x and y are from last time mouse was in window - // mMouseInWindow tracks *actual* mouse location - if (mMouseInWindow && mRootView->handleHover(x, y, mask) ) + if ( !handled ) { - if (LLView::sDebugMouseHandling && LLView::sMouseHandlerMessage != last_handle_msg) + // x and y are from last time mouse was in window + // mMouseInWindow tracks *actual* mouse location + if (mMouseInWindow && mRootView->handleHover(x, y, mask) ) { - last_handle_msg = LLView::sMouseHandlerMessage; - llinfos << "Hover" << LLView::sMouseHandlerMessage << llendl; + if (LLView::sDebugMouseHandling && LLView::sMouseHandlerMessage != last_handle_msg) + { + last_handle_msg = LLView::sMouseHandlerMessage; + llinfos << "Hover" << LLView::sMouseHandlerMessage << llendl; + } + handled = TRUE; + } + else if (LLView::sDebugMouseHandling) + { + if (last_handle_msg != LLStringUtil::null) + { + last_handle_msg.clear(); + llinfos << "Hover not handled by view" << llendl; + } } - handled = TRUE; } - else if (LLView::sDebugMouseHandling) + + if (!handled) { - if (last_handle_msg != LLStringUtil::null) + LLTool *tool = LLToolMgr::getInstance()->getCurrentTool(); + + if(mMouseInWindow && tool) { - last_handle_msg.clear(); - llinfos << "Hover not handled by view" << llendl; + handled = tool->handleHover(x, y, mask); } } } - if (!handled) + // Show a new tool tip (or update one that is already shown) + BOOL tool_tip_handled = FALSE; + std::string tool_tip_msg; + if( handled + && !mWindow->isCursorHidden()) { - LLTool *tool = LLToolMgr::getInstance()->getCurrentTool(); + LLRect screen_sticky_rect = mRootView->getLocalRect(); + S32 local_x, local_y; - if(mMouseInWindow && tool) + if (gSavedSettings.getBOOL("DebugShowXUINames")) { - handled = tool->handleHover(x, y, mask); - } - } - } + LLToolTip::Params params; - // Show a new tool tip (or update one that is already shown) - BOOL tool_tip_handled = FALSE; - std::string tool_tip_msg; - if( handled - && !mWindow->isCursorHidden()) - { - LLRect screen_sticky_rect = mRootView->getLocalRect(); - S32 local_x, local_y; - - if (gSavedSettings.getBOOL("DebugShowXUINames")) - { - LLToolTip::Params params; - - LLView* tooltip_view = mRootView; - LLView::tree_iterator_t end_it = mRootView->endTreeDFS(); - for (LLView::tree_iterator_t it = mRootView->beginTreeDFS(); it != end_it; ++it) - { - LLView* viewp = *it; - LLRect screen_rect; - viewp->localRectToScreen(viewp->getLocalRect(), &screen_rect); - if (!(viewp->getVisible() - && screen_rect.pointInRect(x, y))) - { - it.skipDescendants(); - } - // only report xui names for LLUICtrls, - // and blacklist the various containers we don't care about - else if (dynamic_cast<LLUICtrl*>(viewp) - && viewp != gMenuHolder - && viewp != gFloaterView - && viewp != gConsole) + LLView* tooltip_view = mRootView; + LLView::tree_iterator_t end_it = mRootView->endTreeDFS(); + for (LLView::tree_iterator_t it = mRootView->beginTreeDFS(); it != end_it; ++it) { - if (dynamic_cast<LLFloater*>(viewp)) + LLView* viewp = *it; + LLRect screen_rect; + viewp->localRectToScreen(viewp->getLocalRect(), &screen_rect); + if (!(viewp->getVisible() + && screen_rect.pointInRect(x, y))) { - // constrain search to descendants of this (frontmost) floater - // by resetting iterator - it = viewp->beginTreeDFS(); + it.skipDescendants(); } - - // if we are in a new part of the tree (not a descendent of current tooltip_view) - // then push the results for tooltip_view and start with a new potential view - // NOTE: this emulates visiting only the leaf nodes that meet our criteria - if (!viewp->hasAncestor(tooltip_view)) + // only report xui names for LLUICtrls, + // and blacklist the various containers we don't care about + else if (dynamic_cast<LLUICtrl*>(viewp) + && viewp != gMenuHolder + && viewp != gFloaterView + && viewp != gConsole) { - append_xui_tooltip(tooltip_view, params); - screen_sticky_rect.intersectWith(tooltip_view->calcScreenRect()); + if (dynamic_cast<LLFloater*>(viewp)) + { + // constrain search to descendants of this (frontmost) floater + // by resetting iterator + it = viewp->beginTreeDFS(); + } + + // if we are in a new part of the tree (not a descendent of current tooltip_view) + // then push the results for tooltip_view and start with a new potential view + // NOTE: this emulates visiting only the leaf nodes that meet our criteria + if (!viewp->hasAncestor(tooltip_view)) + { + append_xui_tooltip(tooltip_view, params); + screen_sticky_rect.intersectWith(tooltip_view->calcScreenRect()); + } + tooltip_view = viewp; } - tooltip_view = viewp; } - } - append_xui_tooltip(tooltip_view, params); - screen_sticky_rect.intersectWith(tooltip_view->calcScreenRect()); - - params.sticky_rect = screen_sticky_rect; - params.max_width = 400; + append_xui_tooltip(tooltip_view, params); + screen_sticky_rect.intersectWith(tooltip_view->calcScreenRect()); + + params.sticky_rect = screen_sticky_rect; + params.max_width = 400; - LLToolTipMgr::instance().show(params); - } - // if there is a mouse captor, nothing else gets a tooltip - else if (mouse_captor) - { - mouse_captor->screenPointToLocal(x, y, &local_x, &local_y); - tool_tip_handled = mouse_captor->handleToolTip(local_x, local_y, mask); - } - else - { - // next is top_ctrl - if (!tool_tip_handled && top_ctrl) - { - top_ctrl->screenPointToLocal(x, y, &local_x, &local_y); - tool_tip_handled = top_ctrl->handleToolTip(local_x, local_y, mask ); + LLToolTipMgr::instance().show(params); } - - if (!tool_tip_handled) + // if there is a mouse captor, nothing else gets a tooltip + else if (mouse_captor) { - local_x = x; local_y = y; - tool_tip_handled = mRootView->handleToolTip(local_x, local_y, mask ); + mouse_captor->screenPointToLocal(x, y, &local_x, &local_y); + tool_tip_handled = mouse_captor->handleToolTip(local_x, local_y, mask); } - - LLTool* current_tool = LLToolMgr::getInstance()->getCurrentTool(); - if (!tool_tip_handled && current_tool) + else { - current_tool->screenPointToLocal(x, y, &local_x, &local_y); - tool_tip_handled = current_tool->handleToolTip(local_x, local_y, mask ); + // next is top_ctrl + if (!tool_tip_handled && top_ctrl) + { + top_ctrl->screenPointToLocal(x, y, &local_x, &local_y); + tool_tip_handled = top_ctrl->handleToolTip(local_x, local_y, mask ); + } + + if (!tool_tip_handled) + { + local_x = x; local_y = y; + tool_tip_handled = mRootView->handleToolTip(local_x, local_y, mask ); + } + + LLTool* current_tool = LLToolMgr::getInstance()->getCurrentTool(); + if (!tool_tip_handled && current_tool) + { + current_tool->screenPointToLocal(x, y, &local_x, &local_y); + tool_tip_handled = current_tool->handleToolTip(local_x, local_y, mask ); + } } + } + } + else + { // just have tools handle hover when UI is turned off + LLTool *tool = LLToolMgr::getInstance()->getCurrentTool(); + + if(mMouseInWindow && tool) + { + handled = tool->handleHover(x, y, mask); } - } - + } + updateLayout(); mLastMousePoint = mCurrentMousePoint; @@ -2882,6 +2892,11 @@ void LLViewerWindow::updateMouseDelta() void LLViewerWindow::updateKeyboardFocus() { + if (!gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI)) + { + gFocusMgr.setKeyboardFocus(NULL); + } + // clean up current focus LLUICtrl* cur_focus = dynamic_cast<LLUICtrl*>(gFocusMgr.getKeyboardFocus()); if (cur_focus) @@ -2984,19 +2999,24 @@ void LLViewerWindow::updateWorldViewRect(bool use_full_window) new_world_rect.mTop = llround((F32)new_world_rect.mTop * mDisplayScale.mV[VY]); } + if (gSavedSettings.getBOOL("SidebarCameraMovement") == FALSE) + { + // use right edge of window, ignoring sidebar + new_world_rect.mRight = mWindowRectRaw.mRight; + } + if (mWorldViewRectRaw != new_world_rect) { - LLRect old_world_rect = mWorldViewRectRaw; mWorldViewRectRaw = new_world_rect; gResizeScreenTexture = TRUE; LLViewerCamera::getInstance()->setViewHeightInPixels( mWorldViewRectRaw.getHeight() ); LLViewerCamera::getInstance()->setAspect( getWorldViewAspectRatio() ); + LLRect old_world_rect_scaled = mWorldViewRectScaled; mWorldViewRectScaled = calcScaledRect(mWorldViewRectRaw, mDisplayScale); // sending a signal with a new WorldView rect - old_world_rect = calcScaledRect(old_world_rect, mDisplayScale); - mOnWorldViewRectUpdated(old_world_rect, mWorldViewRectScaled); + mOnWorldViewRectUpdated(old_world_rect_scaled, mWorldViewRectScaled); } } @@ -3036,7 +3056,6 @@ void LLViewerWindow::saveLastMouse(const LLCoordGL &point) // Must be called after displayObjects is called, which sets the mGLName parameter // NOTE: This function gets called 3 times: // render_ui_3d: FALSE, FALSE, TRUE -// renderObjectsForSelect: TRUE, pick_parcel_wall, FALSE // render_hud_elements: FALSE, FALSE, FALSE void LLViewerWindow::renderSelections( BOOL for_gl_pick, BOOL pick_parcel_walls, BOOL for_hud ) { @@ -3066,7 +3085,7 @@ void LLViewerWindow::renderSelections( BOOL for_gl_pick, BOOL pick_parcel_walls, // setup HUD render if (selection->getSelectType() == SELECT_TYPE_HUD && LLSelectMgr::getInstance()->getSelection()->getObjectCount()) { - LLBBox hud_bbox = gAgent.getAvatarObject()->getHUDBBox(); + LLBBox hud_bbox = gAgentAvatarp->getHUDBBox(); // set up transform to encompass bounding box of HUD glMatrixMode(GL_PROJECTION); @@ -3093,7 +3112,7 @@ void LLViewerWindow::renderSelections( BOOL for_gl_pick, BOOL pick_parcel_walls, glPushMatrix(); if (selection->getSelectType() == SELECT_TYPE_HUD) { - F32 zoom = gAgent.mHUDCurZoom; + F32 zoom = gAgentCamera.mHUDCurZoom; glScalef(zoom, zoom, zoom); } @@ -3212,7 +3231,7 @@ LLVector3d LLViewerWindow::clickPointInWorldGlobal(S32 x, S32 y_from_bot, LLView // world at the location of the mouse click LLVector3 mouse_direction_global = mouseDirectionGlobal( x, y_from_bot ); - LLVector3d relative_object = clicked_object->getPositionGlobal() - gAgent.getCameraPositionGlobal(); + LLVector3d relative_object = clicked_object->getPositionGlobal() - gAgentCamera.getCameraPositionGlobal(); // make mouse vector as long as object vector, so it touchs a point near // where the user clicked on the object @@ -3221,7 +3240,7 @@ LLVector3d LLViewerWindow::clickPointInWorldGlobal(S32 x, S32 y_from_bot, LLView LLVector3d new_pos; new_pos.setVec(mouse_direction_global); // transform mouse vector back to world coords - new_pos += gAgent.getCameraPositionGlobal(); + new_pos += gAgentCamera.getCameraPositionGlobal(); return new_pos; } @@ -3488,7 +3507,7 @@ LLVector3 LLViewerWindow::mousePointHUD(const S32 x, const S32 y) const F32 hud_x = -((F32)x - center_x) / height; F32 hud_y = ((F32)y - center_y) / height; - return LLVector3(0.f, hud_x/gAgent.mHUDCurZoom, hud_y/gAgent.mHUDCurZoom); + return LLVector3(0.f, hud_x/gAgentCamera.mHUDCurZoom, hud_y/gAgentCamera.mHUDCurZoom); } // Returns unit vector relative to camera in camera space @@ -3535,7 +3554,7 @@ BOOL LLViewerWindow::mousePointOnPlaneGlobal(LLVector3d& point, const S32 x, con LLVector3d plane_normal_global_d; plane_normal_global_d.setVec(plane_normal_global); F64 plane_mouse_dot = (plane_normal_global_d * mouse_direction_global_d); - LLVector3d plane_origin_camera_rel = plane_point_global - gAgent.getCameraPositionGlobal(); + LLVector3d plane_origin_camera_rel = plane_point_global - gAgentCamera.getCameraPositionGlobal(); F64 mouse_look_at_scale = (plane_normal_global_d * plane_origin_camera_rel) / plane_mouse_dot; if (llabs(plane_mouse_dot) < 0.00001) @@ -3549,7 +3568,7 @@ BOOL LLViewerWindow::mousePointOnPlaneGlobal(LLVector3d& point, const S32 x, con mouse_look_at_scale = plane_origin_camera_rel.magVec() / (plane_origin_dir * mouse_direction_global_d); } - point = gAgent.getCameraPositionGlobal() + mouse_look_at_scale * mouse_direction_global_d; + point = gAgentCamera.getCameraPositionGlobal() + mouse_look_at_scale * mouse_direction_global_d; return mouse_look_at_scale > 0.0; } @@ -3567,12 +3586,12 @@ BOOL LLViewerWindow::mousePointOnLandGlobal(const S32 x, const S32 y, LLVector3d const F32 SECOND_PASS_STEP = 0.1f; // meters LLVector3d camera_pos_global; - camera_pos_global = gAgent.getCameraPositionGlobal(); + camera_pos_global = gAgentCamera.getCameraPositionGlobal(); LLVector3d probe_point_global; LLVector3 probe_point_region; // walk forwards to find the point - for (mouse_dir_scale = FIRST_PASS_STEP; mouse_dir_scale < gAgent.mDrawDistance; mouse_dir_scale += FIRST_PASS_STEP) + for (mouse_dir_scale = FIRST_PASS_STEP; mouse_dir_scale < gAgentCamera.mDrawDistance; mouse_dir_scale += FIRST_PASS_STEP) { LLVector3d mouse_direction_global_d; mouse_direction_global_d.setVec(mouse_direction_global * mouse_dir_scale); @@ -3751,18 +3770,7 @@ void LLViewerWindow::movieSize(S32 new_width, S32 new_height) BORDERHEIGHT = size.mY- y; LLCoordScreen new_size(new_width + BORDERWIDTH, new_height + BORDERHEIGHT); - BOOL disable_sync = gSavedSettings.getBOOL("DisableVerticalSync"); - if (gViewerWindow->mWindow->getFullscreen()) - { - gViewerWindow->changeDisplaySettings(FALSE, - new_size, - disable_sync, - TRUE); - } - else - { - gViewerWindow->mWindow->setSize(new_size); - } + gViewerWindow->mWindow->setSize(new_size); } } @@ -3956,9 +3964,6 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei // PRE SNAPSHOT gDisplaySwapBuffers = FALSE; - // if not showing ui, use full window to render world view - updateWorldViewRect(!show_ui); - glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); setCursor(UI_CURSOR_WAIT); @@ -4031,6 +4036,9 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei //else: keep the current scene scale, re-scale it if necessary after reading out. } + // if not showing ui, use full window to render world view + updateWorldViewRect(!show_ui); + S32 buffer_x_offset = llfloor(((window_width - snapshot_width) * scale_factor) / 2.f); S32 buffer_y_offset = llfloor(((window_height - snapshot_height) * scale_factor) / 2.f); @@ -4514,7 +4522,7 @@ void LLViewerWindow::restoreGL(const std::string& progress_message) gResizeScreenTexture = TRUE; - if (gFloaterCustomize && gFloaterCustomize->getVisible()) + if (gAgentCamera.cameraCustomizeAvatar()) { LLVisualParamHint::requestHintUpdates(); } @@ -4548,51 +4556,12 @@ void LLViewerWindow::initFonts(F32 zoom_factor) LLFontGL::loadDefaultFonts(); } -void LLViewerWindow::toggleFullscreen(BOOL show_progress) -{ - if (mWindow) - { - mWantFullscreen = mWindow->getFullscreen() ? FALSE : TRUE; - mIsFullscreenChecked = mWindow->getFullscreen() ? FALSE : TRUE; - mShowFullscreenProgress = show_progress; - } -} - -void LLViewerWindow::getTargetWindow(BOOL& fullscreen, S32& width, S32& height) const -{ - fullscreen = mWantFullscreen; - - if (mWindow - && mWindow->getFullscreen() == mWantFullscreen) - { - width = getWindowWidthRaw(); - height = getWindowHeightRaw(); - } - else if (mWantFullscreen) - { - width = gSavedSettings.getS32("FullScreenWidth"); - height = gSavedSettings.getS32("FullScreenHeight"); - } - else - { - width = gSavedSettings.getS32("WindowWidth"); - height = gSavedSettings.getS32("WindowHeight"); - } -} - void LLViewerWindow::requestResolutionUpdate() { mResDirty = true; } -void LLViewerWindow::requestResolutionUpdate(bool fullscreen_checked) -{ - mResDirty = true; - mWantFullscreen = fullscreen_checked; - mIsFullscreenChecked = fullscreen_checked; -} - -BOOL LLViewerWindow::checkSettings() +void LLViewerWindow::checkSettings() { if (mStatesDirty) { @@ -4604,70 +4573,9 @@ BOOL LLViewerWindow::checkSettings() // We want to update the resolution AFTER the states getting refreshed not before. if (mResDirty) { - if (gSavedSettings.getBOOL("FullScreenAutoDetectAspectRatio")) - { - getWindow()->setNativeAspectRatio(0.f); - } - else - { - getWindow()->setNativeAspectRatio(gSavedSettings.getF32("FullScreenAspectRatio")); - } - reshape(getWindowWidthRaw(), getWindowHeightRaw()); - - // force aspect ratio - if (mIsFullscreenChecked) - { - LLViewerCamera::getInstance()->setAspect( getWorldViewAspectRatio() ); - } - mResDirty = false; - } - - BOOL is_fullscreen = mWindow->getFullscreen(); - if(mWantFullscreen) - { - LLCoordScreen screen_size; - LLCoordScreen desired_screen_size(gSavedSettings.getS32("FullScreenWidth"), - gSavedSettings.getS32("FullScreenHeight")); - getWindow()->getSize(&screen_size); - if(!is_fullscreen || - screen_size.mX != desired_screen_size.mX - || screen_size.mY != desired_screen_size.mY) - { - if (!LLStartUp::canGoFullscreen()) - { - return FALSE; - } - - LLGLState::checkStates(); - LLGLState::checkTextureChannels(); - changeDisplaySettings(TRUE, - desired_screen_size, - gSavedSettings.getBOOL("DisableVerticalSync"), - mShowFullscreenProgress); - - LLGLState::checkStates(); - LLGLState::checkTextureChannels(); - mStatesDirty = true; - return TRUE; - } - } - else - { - if(is_fullscreen) - { - // Changing to windowed mode. - changeDisplaySettings(FALSE, - LLCoordScreen(gSavedSettings.getS32("WindowWidth"), - gSavedSettings.getS32("WindowHeight")), - TRUE, - mShowFullscreenProgress); - mStatesDirty = true; - return TRUE; - } - } - return FALSE; + } } void LLViewerWindow::restartDisplay(BOOL show_progress_bar) @@ -4676,7 +4584,7 @@ void LLViewerWindow::restartDisplay(BOOL show_progress_bar) stopGL(); if (show_progress_bar) { - restoreGL("Changing Resolution..."); + restoreGL(LLTrans::getString("ProgressChangingResolution")); } else { @@ -4684,38 +4592,23 @@ void LLViewerWindow::restartDisplay(BOOL show_progress_bar) } } -BOOL LLViewerWindow::changeDisplaySettings(BOOL fullscreen, LLCoordScreen size, BOOL disable_vsync, BOOL show_progress_bar) +BOOL LLViewerWindow::changeDisplaySettings(LLCoordScreen size, BOOL disable_vsync, BOOL show_progress_bar) { BOOL was_maximized = gSavedSettings.getBOOL("WindowMaximized"); - mWantFullscreen = fullscreen; - mShowFullscreenProgress = show_progress_bar; - gSavedSettings.setBOOL("WindowFullScreen", mWantFullscreen); //gResizeScreenTexture = TRUE; - BOOL old_fullscreen = mWindow->getFullscreen(); - if (!old_fullscreen && fullscreen && !LLStartUp::canGoFullscreen()) - { - // Not allowed to switch to fullscreen now, so exit early. - // *NOTE: This case should never be reached, but just-in-case. - return TRUE; - } - U32 fsaa = gSavedSettings.getU32("RenderFSAASamples"); U32 old_fsaa = mWindow->getFSAASamples(); - // going from windowed to windowed - if (!old_fullscreen && !fullscreen) + // if not maximized, use the request size + if (!mWindow->getMaximized()) { - // if not maximized, use the request size - if (!mWindow->getMaximized()) - { - mWindow->setSize(size); - } + mWindow->setSize(size); + } - if (fsaa == old_fsaa) - { - return TRUE; - } + if (fsaa == old_fsaa) + { + return TRUE; } // Close floaters that don't handle settings change @@ -4732,23 +4625,15 @@ BOOL LLViewerWindow::changeDisplaySettings(BOOL fullscreen, LLCoordScreen size, LLCoordScreen old_size; LLCoordScreen old_pos; mWindow->getSize(&old_size); - BOOL got_position = mWindow->getPosition(&old_pos); - if (!old_fullscreen && fullscreen && got_position) - { - // switching from windowed to fullscreen, so save window position - gSavedSettings.setS32("WindowX", old_pos.mX); - gSavedSettings.setS32("WindowY", old_pos.mY); - } - mWindow->setFSAASamples(fsaa); - result_first_try = mWindow->switchContext(fullscreen, size, disable_vsync); + result_first_try = mWindow->switchContext(false, size, disable_vsync); if (!result_first_try) { // try to switch back mWindow->setFSAASamples(old_fsaa); - result_second_try = mWindow->switchContext(old_fullscreen, old_size, disable_vsync); + result_second_try = mWindow->switchContext(false, old_size, disable_vsync); if (!result_second_try) { @@ -4763,7 +4648,7 @@ BOOL LLViewerWindow::changeDisplaySettings(BOOL fullscreen, LLCoordScreen size, llinfos << "Restoring GL during resolution change" << llendl; if (show_progress_bar) { - restoreGL("Changing Resolution..."); + restoreGL(LLTrans::getString("ProgressChangingResolution")); } else { @@ -4780,19 +4665,8 @@ BOOL LLViewerWindow::changeDisplaySettings(BOOL fullscreen, LLCoordScreen size, } BOOL success = result_first_try || result_second_try; - if (success) - { -#if LL_WINDOWS - // Only trigger a reshape after switching to fullscreen; otherwise rely on the windows callback - // (otherwise size is wrong; this is the entire window size, reshape wants the visible window size) - if (fullscreen && result_first_try) -#endif - { - reshape(size.mX, size.mY); - } - } - if (!mWindow->getFullscreen() && success) + if (success) { // maximize window if was maximized, else reposition if (was_maximized) @@ -4810,45 +4684,14 @@ BOOL LLViewerWindow::changeDisplaySettings(BOOL fullscreen, LLCoordScreen size, mIgnoreActivate = FALSE; gFocusMgr.setKeyboardFocus(keyboard_focus); - mWantFullscreen = mWindow->getFullscreen(); - mShowFullscreenProgress = FALSE; return success; } - -F32 LLViewerWindow::getDisplayAspectRatio() const -{ - if (mWindow->getFullscreen()) - { - if (gSavedSettings.getBOOL("FullScreenAutoDetectAspectRatio")) - { - return mWindow->getNativeAspectRatio(); - } - else - { - return gSavedSettings.getF32("FullScreenAspectRatio"); - } - } - else - { - return mWindow->getNativeAspectRatio(); - } -} - - F32 LLViewerWindow::getWorldViewAspectRatio() const { F32 world_aspect = (F32)mWorldViewRectRaw.getWidth() / (F32)mWorldViewRectRaw.getHeight(); - //F32 window_aspect = (F32)mWindowRectRaw.getWidth() / (F32)mWindowRectRaw.getHeight(); - if (mWindow->getFullscreen()) - { - return world_aspect * mWindow->getPixelAspectRatio(); - } - else - { - return world_aspect; - } + return world_aspect; } void LLViewerWindow::calcDisplayScale() @@ -4856,27 +4699,13 @@ void LLViewerWindow::calcDisplayScale() F32 ui_scale_factor = gSavedSettings.getF32("UIScaleFactor"); LLVector2 display_scale; display_scale.setVec(llmax(1.f / mWindow->getPixelAspectRatio(), 1.f), llmax(mWindow->getPixelAspectRatio(), 1.f)); - F32 height_normalization = gSavedSettings.getBOOL("UIAutoScale") ? ((F32)mWindowRectRaw.getHeight() / display_scale.mV[VY]) / 768.f : 1.f; - if(mWindow->getFullscreen()) - { - display_scale *= (ui_scale_factor * height_normalization); - } - else - { - display_scale *= ui_scale_factor; - } + display_scale *= ui_scale_factor; // limit minimum display scale if (display_scale.mV[VX] < MIN_DISPLAY_SCALE || display_scale.mV[VY] < MIN_DISPLAY_SCALE) { display_scale *= MIN_DISPLAY_SCALE / llmin(display_scale.mV[VX], display_scale.mV[VY]); } - - if (mWindow->getFullscreen()) - { - display_scale.mV[0] = llround(display_scale.mV[0], 2.0f/(F32) mWindowRectRaw.getWidth()); - display_scale.mV[1] = llround(display_scale.mV[1], 2.0f/(F32) mWindowRectRaw.getHeight()); - } if (display_scale != mDisplayScale) { @@ -4957,9 +4786,9 @@ bool LLViewerWindow::onAlert(const LLSD& notify) // If we're in mouselook, the mouse is hidden and so the user can't click // the dialog buttons. In that case, change to First Person instead. - if( gAgent.cameraMouselook() ) + if( gAgentCamera.cameraMouselook() ) { - gAgent.changeCameraToDefault(); + gAgentCamera.changeCameraToDefault(); } return false; } @@ -5071,7 +4900,7 @@ void LLPickInfo::fetchResults() { mPickType = PICK_OBJECT; } - mObjectOffset = gAgent.calcFocusOffset(objectp, intersection, mPickPt.mX, mPickPt.mY); + mObjectOffset = gAgentCamera.calcFocusOffset(objectp, intersection, mPickPt.mX, mPickPt.mY); mObjectID = objectp->mID; mObjectFace = (te_offset == NO_FACE) ? -1 : (S32)te_offset; diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h index bfce65f2ba..1e0200a075 100644 --- a/indra/newview/llviewerwindow.h +++ b/indra/newview/llviewerwindow.h @@ -69,6 +69,7 @@ class LLHUDIcon; class LLWindow; class LLRootView; class LLViewerWindowListener; +class LLPopupView; #define PICK_HALF_WIDTH 5 #define PICK_DIAMETER (2 * PICK_HALF_WIDTH + 1) @@ -261,10 +262,6 @@ public: // Is window of our application frontmost? BOOL getActive() const { return mActive; } - void getTargetWindow(BOOL& fullscreen, S32& width, S32& height) const; - // The 'target' is where the user wants the window to be. It may not be - // there yet, because we may be supressing fullscreen prior to login. - const std::string& getInitAlert() { return mInitAlert; } // @@ -300,6 +297,11 @@ public: BOOL handleKey(KEY key, MASK mask); void handleScrollWheel (S32 clicks); + // add and remove views from "popup" layer + void addPopup(LLView* popup); + void removePopup(LLView* popup); + void clearPopups(); + // Hide normal UI when a logon fails, re-show everything when logon is attempted again void setNormalControlsVisible( BOOL visible ); void setMenuBackgroundColor(bool god_mode = false, bool dev_grid = false); @@ -374,17 +376,12 @@ public: // Prints window implementation details void dumpState(); - // Request display setting changes - void toggleFullscreen(BOOL show_progress); - // handle shutting down GL and bringing it back up - void requestResolutionUpdate(bool fullscreen_checked); - void requestResolutionUpdate(); // doesn't affect fullscreen - BOOL checkSettings(); + void requestResolutionUpdate(); + void checkSettings(); void restartDisplay(BOOL show_progress_bar); - BOOL changeDisplaySettings(BOOL fullscreen, LLCoordScreen size, BOOL disable_vsync, BOOL show_progress_bar); + BOOL changeDisplaySettings(LLCoordScreen size, BOOL disable_vsync, BOOL show_progress_bar); BOOL getIgnoreDestroyWindow() { return mIgnoreActivate; } - F32 getDisplayAspectRatio() const; F32 getWorldViewAspectRatio() const; const LLVector2& getDisplayScale() const { return mDisplayScale; } void calcDisplayScale(); @@ -409,8 +406,6 @@ public: protected: BOOL mActive; - BOOL mWantFullscreen; - BOOL mShowFullscreenProgress; LLRect mWindowRectRaw; // whole window, including UI LLRect mWindowRectScaled; // whole window, scaled by UI size @@ -458,12 +453,12 @@ protected: LLHandle<LLView> mWorldViewPlaceholder; // widget that spans the portion of screen dedicated to rendering the 3d world LLHandle<LLView> mNonSideTrayView; // parent of world view + bottom bar, etc...everything but the side tray LLHandle<LLView> mFloaterViewHolder; // container for floater_view + LLPopupView* mPopupView; // container for transient popups class LLDebugText* mDebugText; // Internal class for debug text bool mResDirty; bool mStatesDirty; - bool mIsFullscreenChecked; // Did the user check the fullscreen checkbox in the display settings U32 mCurrResolutionIndex; boost::scoped_ptr<LLViewerWindowListener> mViewerWindowListener; @@ -477,7 +472,7 @@ protected: private: // Object temporarily hovered over while dragging LLPointer<LLViewerObject> mDragHoveredObject; -}; +}; void toggle_flying(void*); void toggle_first_person(); diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 4235f97eab..4ef166fb71 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -1,6 +1,6 @@ /** * @File llvoavatar.cpp - * @brief Implementation of LLVOAvatar class which is a derivation fo LLViewerObject + * @brief Implementation of LLVOAvatar class which is a derivation of LLViewerObject * * $LicenseInfo:firstyear=2001&license=viewergpl$ * @@ -48,6 +48,7 @@ #include "sound_ids.h" #include "llagent.h" // Get state values from here +#include "llagentcamera.h" #include "llagentwearables.h" #include "llanimationstates.h" #include "llavatarpropertiesprocessor.h" @@ -65,7 +66,9 @@ #include "llkeyframewalkmotion.h" #include "llmutelist.h" #include "llmoveview.h" +#include "llnotificationsutil.h" #include "llquantize.h" +#include "llrand.h" #include "llregionhandle.h" #include "llresmgr.h" #include "llselectmgr.h" @@ -93,6 +96,12 @@ #include "llvoiceclient.h" #include "llvoicevisualizer.h" // Ventrella +#include "lldebugmessagebox.h" +extern F32 SPEED_ADJUST_MAX; +extern F32 SPEED_ADJUST_MAX_SEC; +extern F32 ANIM_SPEED_MAX; +extern F32 ANIM_SPEED_MIN; + #if LL_MSVC // disable boost::lexical_cast warning #pragma warning (disable:4702) @@ -586,7 +595,7 @@ LLVOAvatarSkeletonInfo* LLVOAvatar::sAvatarSkeletonInfo = NULL; LLVOAvatar::LLVOAvatarXmlInfo* LLVOAvatar::sAvatarXmlInfo = NULL; LLVOAvatarDictionary *LLVOAvatar::sAvatarDictionary = NULL; S32 LLVOAvatar::sFreezeCounter = 0; -S32 LLVOAvatar::sMaxVisible = 50; +U32 LLVOAvatar::sMaxVisible = 12; F32 LLVOAvatar::sRenderDistance = 256.f; S32 LLVOAvatar::sNumVisibleAvatars = 0; S32 LLVOAvatar::sNumLODChangesThisFrame = 0; @@ -655,6 +664,7 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id, mNameMute(FALSE), mRenderGroupTitles(sRenderGroupTitles), mNameAppearance(FALSE), + mNameCloud(FALSE), mFirstTEMessageReceived( FALSE ), mFirstAppearanceMessageReceived( FALSE ), mCulled( FALSE ), @@ -664,6 +674,8 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id, mTexEyeColor( NULL ), mNeedsSkin(FALSE), mUpdatePeriod(1), + mFullyLoaded(FALSE), + mPreviousFullyLoaded(FALSE), mFullyLoadedInitialized(FALSE), mSupportsAlphaLayers(FALSE) { @@ -743,8 +755,11 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id, mOohMorph = NULL; mAahMorph = NULL; - mCurrentGesticulationLevel = 0; + mCurrentGesticulationLevel = 0; + mRuthTimer.reset(); + mRuthDebugTimer.reset(); + mDebugExistenceTimer.reset(); } //------------------------------------------------------------------------ @@ -752,12 +767,28 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id, //------------------------------------------------------------------------ LLVOAvatar::~LLVOAvatar() { - lldebugs << "LLVOAvatar Destructor (0x" << this << ") id:" << mID << llendl; - - if (isSelf()) + if (gSavedSettings.getBOOL("DebugAvatarRezTime")) { - gAgent.setAvatarObject(NULL); + if (!mFullyLoaded) + { + llinfos << "REZTIME: [ " << (U32)mDebugExistenceTimer.getElapsedTimeF32() << "sec ] Avatar '" << getFullname() << "' left after " << (U32)mRuthDebugTimer.getElapsedTimeF32() << " seconds as cloud." << llendl; + LLSD args; + args["EXISTENCE"] = llformat("%d",(U32)mDebugExistenceTimer.getElapsedTimeF32()); + args["TIME"] = llformat("%d",(U32)mRuthDebugTimer.getElapsedTimeF32()); + args["NAME"] = getFullname(); + LLNotificationsUtil::add("AvatarRezLeftCloudNotification",args); + } + else + { + llinfos << "REZTIME: [ " << (U32)mDebugExistenceTimer.getElapsedTimeF32() << "sec ] Avatar '" << getFullname() << "' left." << llendl; + LLSD args; + args["EXISTENCE"] = llformat("%d",(U32)mDebugExistenceTimer.getElapsedTimeF32()); + args["NAME"] = getFullname(); + LLNotificationsUtil::add("AvatarRezLeftNotification",args); + } + } + lldebugs << "LLVOAvatar Destructor (0x" << this << ") id:" << mID << llendl; mRoot.removeAllChildren(); @@ -828,7 +859,7 @@ BOOL LLVOAvatar::isFullyBaked() for (U32 i = 0; i < mBakedTextureDatas.size(); i++) { if (!isTextureDefined(mBakedTextureDatas[i].mTextureIndex) - && ( (i != BAKED_SKIRT) || isWearingWearableType(WT_SKIRT) ) ) + && ( (i != BAKED_SKIRT) || isWearingWearableType(LLWearableType::WT_SKIRT) ) ) { return FALSE; } @@ -885,7 +916,7 @@ BOOL LLVOAvatar::areAllNearbyInstancesBaked(S32& grey_avatars) // static void LLVOAvatar::dumpBakedStatus() { - LLVector3d camera_pos_global = gAgent.getCameraPositionGlobal(); + LLVector3d camera_pos_global = gAgentCamera.getCameraPositionGlobal(); for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin(); iter != LLCharacter::sInstances.end(); ++iter) @@ -964,15 +995,14 @@ void LLVOAvatar::dumpBakedStatus() //static void LLVOAvatar::restoreGL() { - LLVOAvatar* self = gAgent.getAvatarObject(); - if (!self) - return; - self->setCompositeUpdatesEnabled(TRUE); - for (U32 i = 0; i < self->mBakedTextureDatas.size(); i++) + if (!isAgentAvatarValid()) return; + + gAgentAvatarp->setCompositeUpdatesEnabled(TRUE); + for (U32 i = 0; i < gAgentAvatarp->mBakedTextureDatas.size(); i++) { - self->invalidateComposite(self->mBakedTextureDatas[i].mTexLayerSet, FALSE); + gAgentAvatarp->invalidateComposite(gAgentAvatarp->mBakedTextureDatas[i].mTexLayerSet, FALSE); } - self->updateMeshTextures(); + gAgentAvatarp->updateMeshTextures(); } //static @@ -1115,6 +1145,17 @@ void LLVOAvatar::initClass() { llerrs << "Error parsing skeleton node in avatar XML file: " << skeleton_path << llendl; } + + gAnimLibrary.animStateSetString(ANIM_AGENT_BODY_NOISE,"body_noise"); + gAnimLibrary.animStateSetString(ANIM_AGENT_BREATHE_ROT,"breathe_rot"); + gAnimLibrary.animStateSetString(ANIM_AGENT_EDITING,"editing"); + gAnimLibrary.animStateSetString(ANIM_AGENT_EYE,"eye"); + gAnimLibrary.animStateSetString(ANIM_AGENT_FLY_ADJUST,"fly_adjust"); + gAnimLibrary.animStateSetString(ANIM_AGENT_HAND_MOTION,"hand_motion"); + gAnimLibrary.animStateSetString(ANIM_AGENT_HEAD_ROT,"head_rot"); + gAnimLibrary.animStateSetString(ANIM_AGENT_PELVIS_FIX,"pelvis_fix"); + gAnimLibrary.animStateSetString(ANIM_AGENT_TARGET,"target"); + gAnimLibrary.animStateSetString(ANIM_AGENT_WALK_ADJUST,"walk_adjust"); } @@ -1226,7 +1267,11 @@ void LLVOAvatar::initInstance(void) registerMotion( ANIM_AGENT_EXPRESS_TOOTHSMILE, LLEmote::create ); registerMotion( ANIM_AGENT_EXPRESS_WINK, LLEmote::create ); registerMotion( ANIM_AGENT_EXPRESS_WORRY, LLEmote::create ); + registerMotion( ANIM_AGENT_FEMALE_RUN_NEW, LLKeyframeWalkMotion::create ); + registerMotion( ANIM_AGENT_FEMALE_WALK, LLKeyframeWalkMotion::create ); + registerMotion( ANIM_AGENT_FEMALE_WALK_NEW, LLKeyframeWalkMotion::create ); registerMotion( ANIM_AGENT_RUN, LLKeyframeWalkMotion::create ); + registerMotion( ANIM_AGENT_RUN_NEW, LLKeyframeWalkMotion::create ); registerMotion( ANIM_AGENT_STAND, LLKeyframeStandMotion::create ); registerMotion( ANIM_AGENT_STAND_1, LLKeyframeStandMotion::create ); registerMotion( ANIM_AGENT_STAND_2, LLKeyframeStandMotion::create ); @@ -1236,6 +1281,7 @@ void LLVOAvatar::initInstance(void) registerMotion( ANIM_AGENT_TURNLEFT, LLKeyframeWalkMotion::create ); registerMotion( ANIM_AGENT_TURNRIGHT, LLKeyframeWalkMotion::create ); registerMotion( ANIM_AGENT_WALK, LLKeyframeWalkMotion::create ); + registerMotion( ANIM_AGENT_WALK_NEW, LLKeyframeWalkMotion::create ); // motions without a start/stop bit registerMotion( ANIM_AGENT_BODY_NOISE, LLBodyNoiseMotion::create ); @@ -1271,7 +1317,8 @@ void LLVOAvatar::initInstance(void) //VTPause(); // VTune - mVoiceVisualizer->setVoiceEnabled( gVoiceClient->getVoiceEnabled( mID ) ); + mVoiceVisualizer->setVoiceEnabled( LLVoiceClient::getInstance()->getVoiceEnabled( mID ) ); + } const LLVector3 LLVOAvatar::getRenderPosition() const @@ -1492,9 +1539,9 @@ BOOL LLVOAvatar::parseSkeletonFile(const std::string& filename) //------------------------------------------------------------------------- // parse the file //------------------------------------------------------------------------- - BOOL success = sSkeletonXMLTree.parseFile( filename, FALSE ); + BOOL parsesuccess = sSkeletonXMLTree.parseFile( filename, FALSE ); - if (!success) + if (!parsesuccess) { llerrs << "Can't parse skeleton file: " << filename << llendl; return FALSE; @@ -1505,11 +1552,13 @@ BOOL LLVOAvatar::parseSkeletonFile(const std::string& filename) if (!root) { llerrs << "No root node found in avatar skeleton file: " << filename << llendl; + return FALSE; } if( !root->hasName( "linden_skeleton" ) ) { llerrs << "Invalid avatar skeleton file header: " << filename << llendl; + return FALSE; } std::string version; @@ -1517,6 +1566,7 @@ BOOL LLVOAvatar::parseSkeletonFile(const std::string& filename) if( !root->getFastAttributeString( version_string, version ) || (version != "1.0") ) { llerrs << "Invalid avatar skeleton file version: " << version << " in file: " << filename << llendl; + return FALSE; } return TRUE; @@ -2076,12 +2126,27 @@ U32 LLVOAvatar::processUpdateMessage(LLMessageSystem *mesgsys, LLMemType mt(LLMemType::MTYPE_AVATAR); LLVector3 old_vel = getVelocity(); + const BOOL has_name = !getNVPair("FirstName"); + // Do base class updates... U32 retval = LLViewerObject::processUpdateMessage(mesgsys, user_data, block_num, update_type, dp); + // Print out arrival information once we have name of avatar. + if (gSavedSettings.getBOOL("DebugAvatarRezTime")) + { + if (has_name && getNVPair("FirstName")) + { + mDebugExistenceTimer.reset(); + LLSD args; + args["EXISTENCE"] = llformat("%d",(U32)mDebugExistenceTimer.getElapsedTimeF32()); + args["NAME"] = getFullname(); + LLNotificationsUtil::add("AvatarRezArrivedNotification",args); + llinfos << "REZTIME: [ " << (U32)mDebugExistenceTimer.getElapsedTimeF32() << "sec ] Avatar '" << getFullname() << "' arrived." << llendl; + } + } if(retval & LLViewerObject::INVALID_UPDATE) { - if(this == gAgent.getAvatarObject()) + if (isSelf()) { //tell sim to cancel this update gAgent.teleportViaLocation(gAgent.getPositionGlobal()); @@ -2114,6 +2179,33 @@ static LLFastTimer::DeclareTimer FTM_AVATAR_UPDATE("Update Avatar"); static LLFastTimer::DeclareTimer FTM_JOINT_UPDATE("Update Joints"); //------------------------------------------------------------------------ +// LLVOAvatar::dumpAnimationState() +//------------------------------------------------------------------------ +void LLVOAvatar::dumpAnimationState() +{ + llinfos << "==============================================" << llendl; + for (LLVOAvatar::AnimIterator it = mSignaledAnimations.begin(); it != mSignaledAnimations.end(); ++it) + { + LLUUID id = it->first; + std::string playtag = ""; + if (mPlayingAnimations.find(id) != mPlayingAnimations.end()) + { + playtag = "*"; + } + llinfos << gAnimLibrary.animationName(id) << playtag << llendl; + } + for (LLVOAvatar::AnimIterator it = mPlayingAnimations.begin(); it != mPlayingAnimations.end(); ++it) + { + LLUUID id = it->first; + bool is_signaled = mSignaledAnimations.find(id) != mSignaledAnimations.end(); + if (!is_signaled) + { + llinfos << gAnimLibrary.animationName(id) << "!S" << llendl; + } + } +} + +//------------------------------------------------------------------------ // idleUpdate() //------------------------------------------------------------------------ BOOL LLVOAvatar::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) @@ -2192,13 +2284,16 @@ BOOL LLVOAvatar::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) // store off last frame's root position to be consistent with camera position LLVector3 root_pos_last = mRoot.getWorldPosition(); BOOL detailed_update = updateCharacter(agent); - BOOL voice_enabled = gVoiceClient->getVoiceEnabled( mID ) && gVoiceClient->inProximalChannel(); if (gNoRender) { return TRUE; } + static LLUICachedControl<bool> visualizers_in_calls("ShowVoiceVisualizersInCalls", false); + bool voice_enabled = (visualizers_in_calls || LLVoiceClient::getInstance()->inProximalChannel()) && + LLVoiceClient::getInstance()->getVoiceEnabled(mID); + idleUpdateVoiceVisualizer( voice_enabled ); idleUpdateMisc( detailed_update ); idleUpdateAppearanceAnimation(); @@ -2213,13 +2308,14 @@ BOOL LLVOAvatar::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) idleUpdateNameTag( root_pos_last ); idleUpdateRenderCost(); idleUpdateTractorBeam(); + return TRUE; } void LLVOAvatar::idleUpdateVoiceVisualizer(bool voice_enabled) { // disable voice visualizer when in mouselook - mVoiceVisualizer->setVoiceEnabled( voice_enabled && !(isSelf() && gAgent.cameraMouselook()) ); + mVoiceVisualizer->setVoiceEnabled( voice_enabled && !(isSelf() && gAgentCamera.cameraMouselook()) ); if ( voice_enabled ) { //---------------------------------------------------------------- @@ -2247,7 +2343,7 @@ void LLVOAvatar::idleUpdateVoiceVisualizer(bool voice_enabled) else { llinfos << "oops - CurrentGesticulationLevel can be only 0, 1, or 2" << llendl; } // this is the call that Karl S. created for triggering gestures from within the code. - LLGestureManager::instance().triggerAndReviseString( gestureString ); + LLGestureMgr::instance().triggerAndReviseString( gestureString ); } } @@ -2260,7 +2356,7 @@ void LLVOAvatar::idleUpdateVoiceVisualizer(bool voice_enabled) // Notice the calls to "gAwayTimer.reset()". This resets the timer that determines how long the avatar has been // "away", so that the avatar doesn't lapse into away-mode (and slump over) while the user is still talking. //----------------------------------------------------------------------------------------------------------------- - if (gVoiceClient->getIsSpeaking( mID )) + if (LLVoiceClient::getInstance()->getIsSpeaking( mID )) { if (!mVoiceVisualizer->getCurrentlySpeaking()) { @@ -2269,7 +2365,7 @@ void LLVOAvatar::idleUpdateVoiceVisualizer(bool voice_enabled) //printf( "gAwayTimer.reset();\n" ); } - mVoiceVisualizer->setSpeakingAmplitude( gVoiceClient->getCurrentPower( mID ) ); + mVoiceVisualizer->setSpeakingAmplitude( LLVoiceClient::getInstance()->getCurrentPower( mID ) ); if( isSelf() ) { @@ -2498,7 +2594,7 @@ F32 LLVOAvatar::calcMorphAmount() void LLVOAvatar::idleUpdateLipSync(bool voice_enabled) { // Use the Lipsync_Ooh and Lipsync_Aah morphs for lip sync - if ( voice_enabled && (gVoiceClient->lipSyncEnabled()) && gVoiceClient->getIsSpeaking( mID ) ) + if ( voice_enabled && (LLVoiceClient::getInstance()->lipSyncEnabled()) && LLVoiceClient::getInstance()->getIsSpeaking( mID ) ) { F32 ooh_morph_amount = 0.0f; F32 aah_morph_amount = 0.0f; @@ -2532,6 +2628,17 @@ void LLVOAvatar::idleUpdateLoadingEffect() // update visibility when avatar is partially loaded if (updateIsFullyLoaded()) // changed? { + if (isFullyLoaded() && isSelf()) + { + static bool first_fully_visible = true; + if (first_fully_visible) + { + llinfos << "self isFullyLoaded, first_fully_visible" << llendl; + + first_fully_visible = false; + LLAppearanceMgr::instance().onFirstFullyVisible(); + } + } if (isFullyLoaded()) { deleteParticleSource(); @@ -2654,7 +2761,7 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last) if (isSelf()) { render_name = render_name - && !gAgent.cameraMouselook() + && !gAgentCamera.cameraMouselook() && (visible_chat || (gSavedSettings.getBOOL("RenderNameShowSelf") && gSavedSettings.getS32("AvatarNameTagMode") )); } @@ -2752,17 +2859,33 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last) if (mNameText.notNull() && firstname && lastname) { - BOOL is_away = mSignaledAnimations.find(ANIM_AGENT_AWAY) != mSignaledAnimations.end(); - BOOL is_busy = mSignaledAnimations.find(ANIM_AGENT_BUSY) != mSignaledAnimations.end(); - BOOL is_appearance = mSignaledAnimations.find(ANIM_AGENT_CUSTOMIZE) != mSignaledAnimations.end(); - BOOL is_muted; - if (isSelf()) - { - is_muted = FALSE; - } - else + const BOOL is_away = mSignaledAnimations.find(ANIM_AGENT_AWAY) != mSignaledAnimations.end(); + const BOOL is_busy = mSignaledAnimations.find(ANIM_AGENT_BUSY) != mSignaledAnimations.end(); + const BOOL is_appearance = mSignaledAnimations.find(ANIM_AGENT_CUSTOMIZE) != mSignaledAnimations.end(); + const BOOL is_muted = isSelf() ? FALSE : LLMuteList::getInstance()->isMuted(getID()); + const BOOL is_cloud = getIsCloud(); + + if (gSavedSettings.getBOOL("DebugAvatarRezTime")) { - is_muted = LLMuteList::getInstance()->isMuted(getID()); + if (is_appearance != mNameAppearance) + { + if (is_appearance) + { + LLSD args; + args["EXISTENCE"] = llformat("%d",(U32)mDebugExistenceTimer.getElapsedTimeF32()); + args["NAME"] = getFullname(); + LLNotificationsUtil::add("AvatarRezEnteredAppearanceNotification",args); + llinfos << "REZTIME: [ " << (U32)mDebugExistenceTimer.getElapsedTimeF32() << "sec ] Avatar '" << getFullname() << "' entered appearance mode." << llendl; + } + else + { + LLSD args; + args["EXISTENCE"] = llformat("%d",(U32)mDebugExistenceTimer.getElapsedTimeF32()); + args["NAME"] = getFullname(); + LLNotificationsUtil::add("AvatarRezLeftAppearanceNotification",args); + llinfos << "REZTIME: [ " << (U32)mDebugExistenceTimer.getElapsedTimeF32() << "sec ] Avatar '" << getFullname() << "' left appearance mode." << llendl; + } + } } if (mNameString.empty() || @@ -2770,7 +2893,9 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last) (!title && !mTitle.empty()) || (title && mTitle != title->getString()) || (is_away != mNameAway || is_busy != mNameBusy || is_muted != mNameMute) - || is_appearance != mNameAppearance) + || is_appearance != mNameAppearance + || is_cloud != mNameCloud + ) { std::string line; if (!sRenderGroupTitles) @@ -2824,7 +2949,12 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last) } line += ")"; } - if (is_appearance) + if (is_cloud) + { + line += "\n"; + line += "(" + LLTrans::getString("LoadingData") + ")"; + } + else if (is_appearance) { line += "\n"; line += LLTrans::getString("AvatarEditingAppearance"); @@ -2833,6 +2963,7 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last) mNameBusy = is_busy; mNameMute = is_muted; mNameAppearance = is_appearance; + mNameCloud = is_cloud; mTitle = title ? title->getString() : ""; LLStringFn::replace_ascii_controlchars(mTitle,LL_UNKNOWN_CHAR); mNameString = utf8str_to_wstring(line); @@ -2917,14 +3048,7 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last) } else { - if (gSavedSettings.getBOOL("SmallAvatarNames")) - { - mNameText->setFont(LLFontGL::getFontSansSerif()); - } - else - { - mNameText->setFont(LLFontGL::getFontSansSerifBig()); - } + mNameText->setFont(LLFontGL::getFontSansSerif()); mNameText->setTextAlignment(LLHUDText::ALIGN_TEXT_CENTER); mNameText->setFadeDistance(CHAT_NORMAL_RADIUS, 5.f); mNameText->setVisibleOffScreen(FALSE); @@ -3049,23 +3173,23 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent) { // muted avatars update at 16 hz mUpdatePeriod = 16; } - else if (visible && mVisibilityRank <= LLVOAvatar::sMaxVisible * 0.25f) + else if (visible && mVisibilityRank <= LLVOAvatar::sMaxVisible) { //first 25% of max visible avatars are not impostored mUpdatePeriod = 1; } - else if (visible && mVisibilityRank > LLVOAvatar::sMaxVisible * 0.75f) - { //back 25% of max visible avatars are slow updating impostors - mUpdatePeriod = 8; - } - else if (visible && mVisibilityRank > (U32) LLVOAvatar::sMaxVisible) + else if (visible && mVisibilityRank > LLVOAvatar::sMaxVisible * 4) { //background avatars are REALLY slow updating impostors mUpdatePeriod = 16; } + else if (visible && mVisibilityRank > LLVOAvatar::sMaxVisible * 3) + { //back 25% of max visible avatars are slow updating impostors + mUpdatePeriod = 8; + } else if (visible && mImpostorPixelArea <= impostor_area) { // stuff in between gets an update period based on pixel area mUpdatePeriod = llclamp((S32) sqrtf(impostor_area*4.f/mImpostorPixelArea), 2, 8); } - else if (visible && mVisibilityRank > LLVOAvatar::sMaxVisible * 0.25f) + else if (visible && mVisibilityRank > LLVOAvatar::sMaxVisible) { // force nearby impostors in ultra crowded areas mUpdatePeriod = 2; } @@ -3079,7 +3203,7 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent) if (!visible) { - //updateMotions(LLCharacter::HIDDEN_UPDATE); + updateMotions(LLCharacter::HIDDEN_UPDATE); return FALSE; } @@ -3218,7 +3342,7 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent) } } LLVector3 fwdDir = lerp(primDir, velDir, clamp_rescale(speed, 0.5f, 2.0f, 0.0f, 1.0f)); - if (isSelf() && gAgent.cameraMouselook()) + if (isSelf() && gAgentCamera.cameraMouselook()) { // make sure fwdDir stays in same general direction as primdir if (gAgent.getFlying()) @@ -3249,7 +3373,7 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent) // When moving very slow, the pelvis is allowed to deviate from the // forward direction to allow it to hold it's position while the torso // and head turn. Once in motion, it must conform however. - BOOL self_in_mouselook = isSelf() && gAgent.cameraMouselook(); + BOOL self_in_mouselook = isSelf() && gAgentCamera.cameraMouselook(); LLVector3 pelvisDir( mRoot.getWorldMatrix().getFwdRow4().mV ); F32 pelvis_rot_threshold = clamp_rescale(speed, 0.1f, 1.0f, PELVIS_ROT_THRESHOLD_SLOW, PELVIS_ROT_THRESHOLD_FAST); @@ -3427,7 +3551,7 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent) // AUDIO_STEP_LO_SPEED, AUDIO_STEP_HI_SPEED, // AUDIO_STEP_LO_GAIN, AUDIO_STEP_HI_GAIN ); - const F32 STEP_VOLUME = 0.5f; + const F32 STEP_VOLUME = 0.1f; const LLUUID& step_sound_id = getStepSound(); LLVector3d foot_pos_global = gAgent.getPosGlobalFromAgent(foot_pos_agent); @@ -3660,7 +3784,7 @@ U32 LLVOAvatar::renderSkinned(EAvatarRenderPass pass) mMeshLOD[MESH_ID_LOWER_BODY]->updateJointGeometry(); mMeshLOD[MESH_ID_UPPER_BODY]->updateJointGeometry(); - if( isWearingWearableType( WT_SKIRT ) ) + if( isWearingWearableType( LLWearableType::WT_SKIRT ) ) { mMeshLOD[MESH_ID_SKIRT]->updateJointGeometry(); } @@ -3820,7 +3944,7 @@ U32 LLVOAvatar::renderSkinned(EAvatarRenderPass pass) U32 LLVOAvatar::renderTransparent(BOOL first_pass) { U32 num_indices = 0; - if( isWearingWearableType( WT_SKIRT ) && (mIsDummy || isTextureVisible(TEX_SKIRT_BAKED)) ) + if( isWearingWearableType( LLWearableType::WT_SKIRT ) && (mIsDummy || isTextureVisible(TEX_SKIRT_BAKED)) ) { gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.25f); num_indices += mMeshLOD[MESH_ID_SKIRT]->render(mAdjustedPixelArea, FALSE); @@ -4023,7 +4147,7 @@ void LLVOAvatar::updateTextures() mHasGrey = FALSE; // debug for (U32 texture_index = 0; texture_index < getNumTEs(); texture_index++) { - EWearableType wearable_type = LLVOAvatarDictionary::getTEWearableType((ETextureIndex)texture_index); + LLWearableType::EType wearable_type = LLVOAvatarDictionary::getTEWearableType((ETextureIndex)texture_index); U32 num_wearables = gAgentWearables.getWearableCount(wearable_type); const LLTextureEntry *te = getTE(texture_index); const F32 texel_area_ratio = fabs(te->mScaleS * te->mScaleT); @@ -4048,6 +4172,7 @@ void LLVOAvatar::updateTextures() // Spam if this is a baked texture, not set to default image, without valid host info if (isIndexBakedTexture((ETextureIndex)texture_index) && imagep->getID() != IMG_DEFAULT_AVATAR + && imagep->getID() != IMG_INVISIBLE && !imagep->getTargetHost().isOk()) { LL_WARNS_ONCE("Texture") << "LLVOAvatar::updateTextures No host for texture " @@ -4084,8 +4209,15 @@ void LLVOAvatar::addBakedTextureStats( LLViewerFetchedTexture* imagep, F32 pixel { mMaxPixelArea = llmax(pixel_area, mMaxPixelArea); mMinPixelArea = llmin(pixel_area, mMinPixelArea); + imagep->resetTextureStats(); + imagep->setResetMaxVirtualSizeFlag(false) ; + imagep->setCanUseHTTP(false) ; //turn off http fetching for baked textures. imagep->addTextureStats(pixel_area / texel_area_ratio); imagep->setBoostLevel(boost_level); + if(boost_level == LLViewerTexture::BOOST_AVATAR_BAKED_SELF) + { + imagep->setAdditionalDecodePriority(1.0f) ; + } } //virtual @@ -4358,34 +4490,79 @@ void LLVOAvatar::resetAnimations() flushAllMotions(); } -//----------------------------------------------------------------------------- -// startMotion() -// id is the asset if of the animation to start -// time_offset is the offset into the animation at which to start playing -//----------------------------------------------------------------------------- -BOOL LLVOAvatar::startMotion(const LLUUID& id, F32 time_offset) +// Override selectively based on avatar sex and whether we're using new +// animations. +LLUUID LLVOAvatar::remapMotionID(const LLUUID& id) { - LLMemType mt(LLMemType::MTYPE_AVATAR); - + BOOL use_new_walk_run = gSavedSettings.getBOOL("UseNewWalkRun"); + LLUUID result = id; + // start special case female walk for female avatars if (getSex() == SEX_FEMALE) { if (id == ANIM_AGENT_WALK) { - return LLCharacter::startMotion(ANIM_AGENT_FEMALE_WALK, time_offset); + if (use_new_walk_run) + result = ANIM_AGENT_FEMALE_WALK_NEW; + else + result = ANIM_AGENT_FEMALE_WALK; + } + else if (id == ANIM_AGENT_RUN) + { + // There is no old female run animation, so only override + // in one case. + if (use_new_walk_run) + result = ANIM_AGENT_FEMALE_RUN_NEW; } else if (id == ANIM_AGENT_SIT) { - return LLCharacter::startMotion(ANIM_AGENT_SIT_FEMALE, time_offset); + result = ANIM_AGENT_SIT_FEMALE; + } + } + else + { + // Male avatar. + if (id == ANIM_AGENT_WALK) + { + if (use_new_walk_run) + result = ANIM_AGENT_WALK_NEW; } + else if (id == ANIM_AGENT_RUN) + { + if (use_new_walk_run) + result = ANIM_AGENT_RUN_NEW; + } + } - if (isSelf() && id == ANIM_AGENT_AWAY) + return result; + +} + +//----------------------------------------------------------------------------- +// startMotion() +// id is the asset if of the animation to start +// time_offset is the offset into the animation at which to start playing +//----------------------------------------------------------------------------- +BOOL LLVOAvatar::startMotion(const LLUUID& id, F32 time_offset) +{ + LLMemType mt(LLMemType::MTYPE_AVATAR); + + lldebugs << "motion requested " << id.asString() << " " << gAnimLibrary.animationName(id) << llendl; + + LLUUID remap_id = remapMotionID(id); + + if (remap_id != id) + { + lldebugs << "motion resultant " << remap_id.asString() << " " << gAnimLibrary.animationName(remap_id) << llendl; + } + + if (isSelf() && remap_id == ANIM_AGENT_AWAY) { gAgent.setAFK(); } - return LLCharacter::startMotion(id, time_offset); + return LLCharacter::startMotion(remap_id, time_offset); } //----------------------------------------------------------------------------- @@ -4393,21 +4570,21 @@ BOOL LLVOAvatar::startMotion(const LLUUID& id, F32 time_offset) //----------------------------------------------------------------------------- BOOL LLVOAvatar::stopMotion(const LLUUID& id, BOOL stop_immediate) { - if (isSelf()) - { - gAgent.onAnimStop(id); - } + lldebugs << "motion requested " << id.asString() << " " << gAnimLibrary.animationName(id) << llendl; - if (id == ANIM_AGENT_WALK) + LLUUID remap_id = remapMotionID(id); + + if (remap_id != id) { - LLCharacter::stopMotion(ANIM_AGENT_FEMALE_WALK, stop_immediate); + lldebugs << "motion resultant " << remap_id.asString() << " " << gAnimLibrary.animationName(remap_id) << llendl; } - else if (id == ANIM_AGENT_SIT) + + if (isSelf()) { - LLCharacter::stopMotion(ANIM_AGENT_SIT_FEMALE, stop_immediate); + gAgent.onAnimStop(remap_id); } - return LLCharacter::stopMotion(id, stop_immediate); + return LLCharacter::stopMotion(remap_id, stop_immediate); } //----------------------------------------------------------------------------- @@ -4810,7 +4987,7 @@ BOOL LLVOAvatar::loadAvatar() } // Uncomment to enable avatar_lad.xml debugging. -/* std::ofstream file; + std::ofstream file; file.open("avatar_lad.log"); for( LLViewerVisualParam* param = (LLViewerVisualParam*) getFirstVisualParam(); param; @@ -4820,7 +4997,7 @@ BOOL LLVOAvatar::loadAvatar() file << std::endl; } - file.close();*/ + file.close(); return TRUE; } @@ -5188,7 +5365,7 @@ BOOL LLVOAvatar::updateJointLODs() { if (isSelf()) { - if(gAgent.cameraCustomizeAvatar() || gAgent.cameraMouselook()) + if(gAgentCamera.cameraCustomizeAvatar() || gAgentCamera.cameraMouselook()) { mAdjustedPixelArea = MAX_PIXEL_AREA; } @@ -5334,7 +5511,7 @@ void LLVOAvatar::updateShadowFaces() // Render sprite sprite.setNormal(normal); - if (isSelf() && gAgent.getCameraMode() == CAMERA_MODE_MOUSELOOK) + if (isSelf() && gAgentCamera.getCameraMode() == CAMERA_MODE_MOUSELOOK) { sprite.setColor(0.f, 0.f, 0.f, 0.f); } @@ -5367,7 +5544,7 @@ void LLVOAvatar::updateShadowFaces() // Render sprite sprite.setNormal(normal); - if (isSelf() && gAgent.getCameraMode() == CAMERA_MODE_MOUSELOOK) + if (isSelf() && gAgentCamera.getCameraMode() == CAMERA_MODE_MOUSELOOK) { sprite.setColor(0.f, 0.f, 0.f, 0.f); } @@ -5422,7 +5599,7 @@ BOOL LLVOAvatar::setParent(LLViewerObject* parent) ret = LLViewerObject::setParent(parent); if (isSelf()) { - gAgent.resetCamera(); + gAgentCamera.resetCamera(); } } else @@ -5462,6 +5639,14 @@ LLViewerJointAttachment* LLVOAvatar::getTargetAttachmentPoint(LLViewerObject* vi { S32 attachmentID = ATTACHMENT_ID_FROM_STATE(viewer_object->getState()); + // This should never happen unless the server didn't process the attachment point + // correctly, but putting this check in here to be safe. + if (attachmentID & ATTACHMENT_ADD) + { + llwarns << "Got an attachment with ATTACHMENT_ADD mask, removing ( attach pt:" << attachmentID << " )" << llendl; + attachmentID &= ~ATTACHMENT_ADD; + } + LLViewerJointAttachment* attachment = get_if_there(mAttachmentPoints, attachmentID, (LLViewerJointAttachment*)NULL); if (!attachment) @@ -5607,15 +5792,15 @@ void LLVOAvatar::sitOnObject(LLViewerObject *sit_object) //LLFirstUse::useSit(); gAgent.setFlying(FALSE); - gAgent.setThirdPersonHeadOffset(LLVector3::zero); + gAgentCamera.setThirdPersonHeadOffset(LLVector3::zero); //interpolate to new camera position - gAgent.startCameraAnimation(); + gAgentCamera.startCameraAnimation(); // make sure we are not trying to autopilot gAgent.stopAutoPilot(); - gAgent.setupSitCamera(); - if (gAgent.getForceMouselook()) + gAgentCamera.setupSitCamera(); + if (gAgentCamera.getForceMouselook()) { - gAgent.changeCameraToMouselook(); + gAgentCamera.changeCameraToMouselook(); } } @@ -5633,6 +5818,8 @@ void LLVOAvatar::sitOnObject(LLViewerObject *sit_object) mDrawable->mXform.setRotation(mDrawable->getWorldRotation() * inv_obj_rot); gPipeline.markMoved(mDrawable, TRUE); + // Notice that removing sitDown() from here causes avatars sitting on + // objects to be not rendered for new arrivals. See EXT-6835 and EXT-1655. sitDown(TRUE); mRoot.getXform()->setParent(&sit_object->mDrawable->mXform); // LLVOAvatar::sitOnObject mRoot.setPosition(getPosition()); @@ -5702,9 +5889,9 @@ void LLVOAvatar::getOffObject() //reset orientation // mRoot.setRotation(avWorldRot); - gAgent.setThirdPersonHeadOffset(LLVector3(0.f, 0.f, 1.f)); + gAgentCamera.setThirdPersonHeadOffset(LLVector3(0.f, 0.f, 1.f)); - gAgent.setSitCamera(LLUUID::null); + gAgentCamera.setSitCamera(LLUUID::null); } } @@ -5767,11 +5954,6 @@ void LLVOAvatar::invalidateAll() { } -// virtual -void LLVOAvatar::setCompositeUpdatesEnabled( BOOL b ) -{ -} - void LLVOAvatar::onGlobalColorChanged(const LLTexGlobalColor* global_color, BOOL upload_bake ) { if (global_color == mTexSkinColor) @@ -5810,27 +5992,29 @@ BOOL LLVOAvatar::isVisible() const && (mDrawable->isVisible() || mIsDummy); } -// call periodically to keep isFullyLoaded up to date. -// returns true if the value has changed. -BOOL LLVOAvatar::updateIsFullyLoaded() +// Determine if we have enough avatar data to render +BOOL LLVOAvatar::getIsCloud() { - // a "heuristic" to determine if we have enough avatar data to render - // (to avoid rendering a "Ruth" - DEV-3168) - BOOL loading = FALSE; - - // do we have a shape? + // Do we have a shape? if (visualParamWeightsAreDefault()) { - loading = TRUE; + return TRUE; } if (!isTextureDefined(TEX_LOWER_BAKED) || !isTextureDefined(TEX_UPPER_BAKED) || !isTextureDefined(TEX_HEAD_BAKED)) { - loading = TRUE; + return TRUE; } - + return FALSE; +} + +// call periodically to keep isFullyLoaded up to date. +// returns true if the value has changed. +BOOL LLVOAvatar::updateIsFullyLoaded() +{ + const BOOL loading = getIsCloud(); updateRuthTimer(loading); return processFullyLoadedChange(loading); } @@ -5845,19 +6029,28 @@ void LLVOAvatar::updateRuthTimer(bool loading) if (mPreviousFullyLoaded) { mRuthTimer.reset(); + if (gSavedSettings.getBOOL("DebugAvatarRezTime")) + { + llinfos << "REZTIME: [ " << (U32)mDebugExistenceTimer.getElapsedTimeF32() << "sec ] Avatar '" << getFullname() << "' became cloud." << llendl; + LLSD args; + args["EXISTENCE"] = llformat("%d",(U32)mDebugExistenceTimer.getElapsedTimeF32()); + args["TIME"] = llformat("%d",(U32)mRuthDebugTimer.getElapsedTimeF32()); + args["NAME"] = getFullname(); + LLNotificationsUtil::add("AvatarRezCloudNotification",args); + } + mRuthDebugTimer.reset(); } - const F32 LOADING_TIMEOUT = 120.f; - if (mRuthTimer.getElapsedTimeF32() > LOADING_TIMEOUT) + const F32 LOADING_TIMEOUT__SECONDS = 120.f; + if (mRuthTimer.getElapsedTimeF32() > LOADING_TIMEOUT__SECONDS) { - /* llinfos << "Ruth Timer timeout: Missing texture data for '" << getFullname() << "' " << "( Params loaded : " << !visualParamWeightsAreDefault() << " ) " << "( Lower : " << isTextureDefined(TEX_LOWER_BAKED) << " ) " << "( Upper : " << isTextureDefined(TEX_UPPER_BAKED) << " ) " << "( Head : " << isTextureDefined(TEX_HEAD_BAKED) << " )." << llendl; - */ + LLAvatarPropertiesProcessor::getInstance()->sendAvatarTexturesRequest(getID()); mRuthTimer.reset(); } @@ -5873,7 +6066,19 @@ BOOL LLVOAvatar::processFullyLoadedChange(bool loading) mFullyLoaded = (mFullyLoadedTimer.getElapsedTimeF32() > PAUSE); - + if (gSavedSettings.getBOOL("DebugAvatarRezTime")) + { + if (!mPreviousFullyLoaded && !loading && mFullyLoaded) + { + llinfos << "REZTIME: [ " << (U32)mDebugExistenceTimer.getElapsedTimeF32() << "sec ] Avatar '" << getFullname() << "' resolved in " << (U32)mRuthDebugTimer.getElapsedTimeF32() << " seconds." << llendl; + LLSD args; + args["EXISTENCE"] = llformat("%d",(U32)mDebugExistenceTimer.getElapsedTimeF32()); + args["TIME"] = llformat("%d",(U32)mRuthDebugTimer.getElapsedTimeF32()); + args["NAME"] = getFullname(); + LLNotificationsUtil::add("AvatarRezNotification",args); + } + } + // did our loading state "change" from last call? const S32 UPDATE_RATE = 30; BOOL changed = @@ -5924,7 +6129,7 @@ void LLVOAvatar::updateMeshTextures() } } - const BOOL self_customizing = isSelf() && gAgent.cameraCustomizeAvatar(); // During face edit mode, we don't use baked textures + const BOOL self_customizing = isSelf() && gAgentCamera.cameraCustomizeAvatar(); // During face edit mode, we don't use baked textures const BOOL other_culled = !isSelf() && mCulled; std::vector<BOOL> is_layer_baked; @@ -6177,7 +6382,7 @@ void LLVOAvatar::releaseComponentTextures() const LLVOAvatarDictionary::BakedEntry * bakedDicEntry = LLVOAvatarDictionary::getInstance()->getBakedTexture((EBakedTextureIndex)baked_index); // skip if this is a skirt and av is not wearing one, or if we don't have a baked texture UUID if (!isTextureDefined(bakedDicEntry->mTextureIndex) - && ( (baked_index != BAKED_SKIRT) || isWearingWearableType(WT_SKIRT) )) + && ( (baked_index != BAKED_SKIRT) || isWearingWearableType(LLWearableType::WT_SKIRT) )) { continue; } @@ -6250,6 +6455,14 @@ BOOL LLVOAvatar::teToColorParams( ETextureIndex te, U32 *param_name ) param_name[2] = 923; //"skirt_blue"; break; + case TEX_HEAD_TATTOO: + case TEX_LOWER_TATTOO: + case TEX_UPPER_TATTOO: + param_name[0] = 1071; //"tattoo_red"; + param_name[1] = 1072; //"tattoo_green"; + param_name[2] = 1073; //"tattoo_blue"; + break; + default: llassert(0); return FALSE; @@ -6290,16 +6503,13 @@ LLColor4 LLVOAvatar::getDummyColor() void LLVOAvatar::dumpAvatarTEs( const std::string& context ) const { - /* const char* te_name[] = { - "TEX_HEAD_BODYPAINT ", - "TEX_UPPER_SHIRT ", */ llinfos << (isSelf() ? "Self: " : "Other: ") << context << llendl; for (LLVOAvatarDictionary::Textures::const_iterator iter = LLVOAvatarDictionary::getInstance()->getTextures().begin(); iter != LLVOAvatarDictionary::getInstance()->getTextures().end(); ++iter) { const LLVOAvatarDictionary::TextureEntry *texture_dict = iter->second; - // TODO: handle multiple textures for self + // TODO: MULTI-WEARABLE: handle multiple textures for self const LLViewerTexture* te_image = getImage(iter->first,0); if( !te_image ) { @@ -6325,23 +6535,23 @@ void LLVOAvatar::dumpAvatarTEs( const std::string& context ) const } // Unlike most wearable functions, this works for both self and other. -BOOL LLVOAvatar::isWearingWearableType(EWearableType type) const +BOOL LLVOAvatar::isWearingWearableType(LLWearableType::EType type) const { if (mIsDummy) return TRUE; switch(type) { - case WT_SHAPE: - case WT_SKIN: - case WT_HAIR: - case WT_EYES: + case LLWearableType::WT_SHAPE: + case LLWearableType::WT_SKIN: + case LLWearableType::WT_HAIR: + case LLWearableType::WT_EYES: return TRUE; // everyone has all bodyparts default: break; // Do nothing } /* switch(type) - case WT_SHIRT: + case LLWearableType::WT_SHIRT: indicator_te = TEX_UPPER_SHIRT; */ for (LLVOAvatarDictionary::Textures::const_iterator tex_iter = LLVOAvatarDictionary::getInstance()->getTextures().begin(); tex_iter != LLVOAvatarDictionary::getInstance()->getTextures().end(); @@ -6479,6 +6689,41 @@ void LLVOAvatar::onFirstTEMessageReceived() } //----------------------------------------------------------------------------- +// bool visualParamWeightsAreDefault() +//----------------------------------------------------------------------------- +bool LLVOAvatar::visualParamWeightsAreDefault() +{ + bool rtn = true; + + bool is_wearing_skirt = isWearingWearableType(LLWearableType::WT_SKIRT); + for (LLVisualParam *param = getFirstVisualParam(); + param; + param = getNextVisualParam()) + { + if (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE) + { + LLViewerVisualParam* vparam = dynamic_cast<LLViewerVisualParam*>(param); + llassert(vparam); + bool is_skirt_param = vparam && + LLWearableType::WT_SKIRT == vparam->getWearableType(); + if (param->getWeight() != param->getDefaultWeight() && + // we have to not care whether skirt weights are default, if we're not actually wearing a skirt + (is_wearing_skirt || !is_skirt_param)) + { + //llinfos << "param '" << param->getName() << "'=" << param->getWeight() << " which differs from default=" << param->getDefaultWeight() << llendl; + rtn = false; + break; + } + } + } + + //llinfos << "params are default ? " << int(rtn) << llendl; + + return rtn; +} + + +//----------------------------------------------------------------------------- // processAvatarAppearance() //----------------------------------------------------------------------------- void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys ) @@ -6546,16 +6791,17 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys ) { releaseComponentTextures(); } - - + // parse visual params S32 num_blocks = mesgsys->getNumberOfBlocksFast(_PREHASH_VisualParam); - if( num_blocks > 1 ) + bool drop_visual_params_debug = gSavedSettings.getBOOL("BlockSomeAvatarAppearanceVisualParams") && (ll_rand(2) == 0); // pretend that ~12% of AvatarAppearance messages arrived without a VisualParam block, for testing + if( num_blocks > 1 && !drop_visual_params_debug) { BOOL params_changed = FALSE; BOOL interp_params = FALSE; LLVisualParam* param = getFirstVisualParam(); + llassert(param); // if this ever fires, we should do the same as when num_blocks<=1 if (!param) { llwarns << "No visual params!" << llendl; @@ -6571,8 +6817,8 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys ) if( !param ) { - llwarns << "Number of params in AvatarAppearance msg does not match number of params in avatar xml file." << llendl; - return; + // more visual params supplied than expected - just process what we know about + break; } U8 value; @@ -6597,14 +6843,10 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys ) } } - while( param && (param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE) ) - { - param = getNextVisualParam(); - } - if( param ) + const S32 expected_tweakable_count = getVisualParamCountInGroup(VISUAL_PARAM_GROUP_TWEAKABLE); + if (num_blocks != expected_tweakable_count) { - llwarns << "Number of params in AvatarAppearance msg does not match number of params in avatar xml file." << llendl; - return; + llinfos << "Number of params in AvatarAppearance msg (" << num_blocks << ") does not match number of tweakable params in avatar xml file (" << expected_tweakable_count << "). Processing what we can. object: " << getID() << llendl; } if (params_changed) @@ -6621,16 +6863,37 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys ) updateSexDependentLayerSets( FALSE ); } } + + llassert( getSex() == ((getVisualParamWeight( "male" ) > 0.5f) ? SEX_MALE : SEX_FEMALE) ); } else { - llwarns << "AvatarAppearance msg received without any parameters, object: " << getID() << llendl; + // AvatarAppearance message arrived without visual params + if (drop_visual_params_debug) + { + llinfos << "Debug-faked lack of parameters on AvatarAppearance for object: " << getID() << llendl; + } + else + { + llinfos << "AvatarAppearance msg received without any parameters, object: " << getID() << llendl; + } + + // this isn't really a problem if we already have a non-default shape + if (visualParamWeightsAreDefault()) + { + // re-request appearance, hoping that it comes back with a shape next time + llinfos << "Re-requesting AvatarAppearance for object: " << getID() << llendl; + LLAvatarPropertiesProcessor::getInstance()->sendAvatarTexturesRequest(getID()); + } + else + { + llinfos << "That's okay, we already have a non-default shape for object: " << getID() << llendl; + // we don't really care. + } } setCompositeUpdatesEnabled( TRUE ); - llassert( getSex() == ((getVisualParamWeight( "male" ) > 0.5f) ? SEX_MALE : SEX_FEMALE) ); - // If all of the avatars are completely baked, release the global image caches to conserve memory. LLVOAvatar::cullAvatarsByPixelArea(); @@ -6845,8 +7108,7 @@ void LLVOAvatar::useBakedTexture( const LLUUID& id ) // static void LLVOAvatar::dumpArchetypeXML( void* ) { - LLVOAvatar* avatar = gAgent.getAvatarObject(); - LLAPRFile outfile ; + LLAPRFile outfile; outfile.open(gDirUtilp->getExpandedFilename(LL_PATH_CHARACTER,"new archetype.xml"), LL_APR_WB ); apr_file_t* file = outfile.getFileHandle() ; if (!file) @@ -6859,12 +7121,12 @@ void LLVOAvatar::dumpArchetypeXML( void* ) apr_file_printf( file, "\n\t<archetype name=\"???\">\n" ); // only body parts, not clothing. - for (S32 type = WT_SHAPE; type <= WT_EYES; type++) + for (S32 type = LLWearableType::WT_SHAPE; type <= LLWearableType::WT_EYES; type++) { - const std::string& wearable_name = LLWearableDictionary::getTypeName((EWearableType)type); + const std::string& wearable_name = LLWearableType::getTypeName((LLWearableType::EType)type); apr_file_printf( file, "\n\t\t<!-- wearable: %s -->\n", wearable_name.c_str() ); - for (LLVisualParam* param = avatar->getFirstVisualParam(); param; param = avatar->getNextVisualParam()) + for (LLVisualParam* param = gAgentAvatarp->getFirstVisualParam(); param; param = gAgentAvatarp->getNextVisualParam()) { LLViewerVisualParam* viewer_param = (LLViewerVisualParam*)param; if( (viewer_param->getWearableType() == type) && @@ -6880,7 +7142,7 @@ void LLVOAvatar::dumpArchetypeXML( void* ) if (LLVOAvatarDictionary::getTEWearableType((ETextureIndex)te) == type) { // MULTIPLE_WEARABLES: extend to multiple wearables? - LLViewerTexture* te_image = avatar->getImage((ETextureIndex)te, 0); + LLViewerTexture* te_image = ((LLVOAvatar *)(gAgentAvatarp))->getImage((ETextureIndex)te, 0); if( te_image ) { std::string uuid_str; @@ -7655,6 +7917,8 @@ void LLVOAvatar::idleUpdateRenderCost() static const U32 ARC_BODY_PART_COST = 20; static const U32 ARC_LIMIT = 2048; + static std::set<LLUUID> all_textures; + if (!gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_SHAME)) { return; @@ -7667,7 +7931,7 @@ void LLVOAvatar::idleUpdateRenderCost() { const LLVOAvatarDictionary::BakedEntry *baked_dict = LLVOAvatarDictionary::getInstance()->getBakedTexture((EBakedTextureIndex)baked_index); ETextureIndex tex_index = baked_dict->mTextureIndex; - if ((tex_index != TEX_SKIRT_BAKED) || (isWearingWearableType(WT_SKIRT))) + if ((tex_index != TEX_SKIRT_BAKED) || (isWearingWearableType(LLWearableType::WT_SKIRT))) { if (isTextureVisible(tex_index)) { @@ -7700,7 +7964,45 @@ void LLVOAvatar::idleUpdateRenderCost() } } } + // Diagnostic output to identify all avatar-related textures. + // Does not affect rendering cost calculation. + // Could be wrapped in a debug option if output becomes problematic. + if (isSelf()) + { + // print any attachment textures we didn't already know about. + for (std::set<LLUUID>::iterator it = textures.begin(); it != textures.end(); ++it) + { + LLUUID image_id = *it; + if( image_id.isNull() || image_id == IMG_DEFAULT || image_id == IMG_DEFAULT_AVATAR) + continue; + if (all_textures.find(image_id) == all_textures.end()) + { + // attachment texture not previously seen. + llinfos << "attachment_texture: " << image_id.asString() << llendl; + all_textures.insert(image_id); + } + } + // print any avatar textures we didn't already know about + for (LLVOAvatarDictionary::Textures::const_iterator iter = LLVOAvatarDictionary::getInstance()->getTextures().begin(); + iter != LLVOAvatarDictionary::getInstance()->getTextures().end(); + ++iter) + { + const LLVOAvatarDictionary::TextureEntry *texture_dict = iter->second; + // TODO: MULTI-WEARABLE: handle multiple textures for self + const LLViewerTexture* te_image = getImage(iter->first,0); + if (!te_image) + continue; + LLUUID image_id = te_image->getID(); + if( image_id.isNull() || image_id == IMG_DEFAULT || image_id == IMG_DEFAULT_AVATAR) + continue; + if (all_textures.find(image_id) == all_textures.end()) + { + llinfos << "local_texture: " << texture_dict->mName << ": " << image_id << llendl; + all_textures.insert(image_id); + } + } + } cost += textures.size() * LLVOVolume::ARC_TEXTURE_COST; setDebugText(llformat("%d", cost)); @@ -7775,3 +8077,26 @@ BOOL LLVOAvatar::isTextureDefined(LLVOAvatarDefines::ETextureIndex te, U32 index getImage(te, index)->getID() != IMG_DEFAULT); } +//virtual +BOOL LLVOAvatar::isTextureVisible(LLVOAvatarDefines::ETextureIndex type, U32 index) const +{ + if (isIndexLocalTexture(type)) + { + return isTextureDefined(type, index); + } + else + { + // baked textures can use TE images directly + return ((isTextureDefined(type) || isSelf()) + && (getTEImage(type)->getID() != IMG_INVISIBLE + || LLDrawPoolAlpha::sShowDebugAlpha)); + } +} + +//virtual +BOOL LLVOAvatar::isTextureVisible(LLVOAvatarDefines::ETextureIndex type, LLWearable *wearable) const +{ + // non-self avatars don't have wearables + return FALSE; +} + diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index a5815df20a..4259bb8e73 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -1,6 +1,6 @@ /** * @file llvoavatar.h - * @brief Declaration of LLVOAvatar class which is a derivation fo + * @brief Declaration of LLVOAvatar class which is a derivation of * LLViewerObject * * $LicenseInfo:firstyear=2001&license=viewergpl$ @@ -71,9 +71,10 @@ class LLTexGlobalColor; class LLVOAvatarBoneInfo; class LLVOAvatarSkeletonInfo; -//------------------------------------------------------------------------ +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // LLVOAvatar -//------------------------------------------------------------------------ +// +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ class LLVOAvatar : public LLViewerObject, public LLCharacter @@ -138,13 +139,13 @@ public: virtual void updateSpatialExtents(LLVector3& newMin, LLVector3 &newMax); virtual void getSpatialExtents(LLVector3& newMin, LLVector3& newMax); virtual BOOL lineSegmentIntersect(const LLVector3& start, const LLVector3& end, - S32 face = -1, // which face to check, -1 = ALL_SIDES - BOOL pick_transparent = FALSE, - S32* face_hit = NULL, // which face was hit - LLVector3* intersection = NULL, // return the intersection point - LLVector2* tex_coord = NULL, // return the texture coordinates of the intersection point - LLVector3* normal = NULL, // return the surface normal at the intersection point - LLVector3* bi_normal = NULL); // return the surface bi-normal at the intersection point + S32 face = -1, // which face to check, -1 = ALL_SIDES + BOOL pick_transparent = FALSE, + S32* face_hit = NULL, // which face was hit + LLVector3* intersection = NULL, // return the intersection point + LLVector2* tex_coord = NULL, // return the texture coordinates of the intersection point + LLVector3* normal = NULL, // return the surface normal at the intersection point + LLVector3* bi_normal = NULL); // return the surface bi-normal at the intersection point //-------------------------------------------------------------------- // LLCharacter interface and related @@ -157,12 +158,14 @@ public: virtual LLJoint* getCharacterJoint(U32 num); virtual BOOL allocateCharacterJoints(U32 num); + virtual LLUUID remapMotionID(const LLUUID& id); virtual BOOL startMotion(const LLUUID& id, F32 time_offset = 0.f); virtual BOOL stopMotion(const LLUUID& id, BOOL stop_immediate = FALSE); virtual void stopMotionFromSource(const LLUUID& source_id); virtual void requestStopMotion(LLMotion* motion); LLMotion* findMotion(const LLUUID& id) const; void startDefaultMotions(); + void dumpAnimationState(); virtual LLJoint* getJoint(const std::string &name); virtual LLJoint* getRootJoint() { return &mRoot; } @@ -220,8 +223,8 @@ public: public: static S32 sRenderName; static BOOL sRenderGroupTitles; - static S32 sMaxVisible; - static F32 sRenderDistance; //distance at which avatars will render (affected by control "RenderAvatarMaxVisible") + static U32 sMaxVisible; //(affected by control "RenderAvatarMaxVisible") + static F32 sRenderDistance; //distance at which avatars will render. static BOOL sShowAnimationDebug; // show animation debug info static BOOL sUseImpostors; //use impostors for far away avatars static BOOL sShowFootPlane; // show foot collision plane reported by server @@ -246,8 +249,10 @@ public: //-------------------------------------------------------------------- public: BOOL isFullyLoaded() const; + bool visualParamWeightsAreDefault(); protected: - virtual BOOL updateIsFullyLoaded(); + virtual BOOL getIsCloud(); + BOOL updateIsFullyLoaded(); BOOL processFullyLoadedChange(bool loading); void updateRuthTimer(bool loading); F32 calcMorphAmount(); @@ -460,7 +465,9 @@ public: //-------------------------------------------------------------------- public: virtual BOOL isTextureDefined(LLVOAvatarDefines::ETextureIndex type, U32 index = 0) const; - BOOL isTextureVisible(LLVOAvatarDefines::ETextureIndex index) const; + virtual BOOL isTextureVisible(LLVOAvatarDefines::ETextureIndex type, U32 index = 0) const; + virtual BOOL isTextureVisible(LLVOAvatarDefines::ETextureIndex type, LLWearable *wearable) const; + protected: BOOL isFullyBaked(); static BOOL areAllNearbyInstancesBaked(S32& grey_avatars); @@ -526,7 +533,9 @@ protected: public: virtual void invalidateComposite(LLTexLayerSet* layerset, BOOL upload_result); virtual void invalidateAll(); - virtual void setCompositeUpdatesEnabled(BOOL b); + virtual void setCompositeUpdatesEnabled(bool b) {} + virtual void setCompositeUpdatesEnabled(U32 index, bool b) {} + virtual bool isCompositeUpdateEnabled(U32 index) { return false; } //-------------------------------------------------------------------- // Static texture/mesh/baked dictionary @@ -565,7 +574,7 @@ public: void updateMeshData(); protected: void releaseMeshData(); - /*virtual*/ void restoreMeshData(); + virtual void restoreMeshData(); private: BOOL mDirtyMesh; BOOL mMeshTexturesDirty; @@ -642,7 +651,7 @@ public: **/ public: - virtual BOOL isWearingWearableType(EWearableType type ) const; + virtual BOOL isWearingWearableType(LLWearableType::EType type ) const; //-------------------------------------------------------------------- // Attachments @@ -826,6 +835,7 @@ private: BOOL mNameBusy; BOOL mNameMute; BOOL mNameAppearance; + BOOL mNameCloud; BOOL mRenderGroupTitles; //-------------------------------------------------------------------- @@ -887,6 +897,9 @@ private: ** DIAGNOSTICS **/ + //-------------------------------------------------------------------- + // General + //-------------------------------------------------------------------- public: static void dumpArchetypeXML(void*); static void dumpBakedStatus(); @@ -906,6 +919,16 @@ private: F32 mAdjustedPixelArea; std::string mDebugText; + + //-------------------------------------------------------------------- + // Avatar Rez Metrics + //-------------------------------------------------------------------- +public: + F32 debugGetExistenceTimeElapsedF32() const { return mDebugExistenceTimer.getElapsedTimeF32(); } +protected: + LLFrameTimer mRuthDebugTimer; // For tracking how long it takes for av to rez + LLFrameTimer mDebugExistenceTimer; // Debugging for how long the avatar has been in memory. + /** Diagnostics ** ** *******************************************************************************/ @@ -1023,14 +1046,4 @@ protected: // Shared with LLVOAvatarSelf }; // LLVOAvatar -//------------------------------------------------------------------------ -// Inlines -//------------------------------------------------------------------------ -inline BOOL LLVOAvatar::isTextureVisible(LLVOAvatarDefines::ETextureIndex te) const -{ - return ((isTextureDefined(te) || isSelf()) - && (getTEImage(te)->getID() != IMG_INVISIBLE - || LLDrawPoolAlpha::sShowDebugAlpha)); -} - #endif // LL_VO_AVATAR_H diff --git a/indra/newview/llvoavatardefines.cpp b/indra/newview/llvoavatardefines.cpp index 49c4a1a6c8..ed0a4f147d 100644 --- a/indra/newview/llvoavatardefines.cpp +++ b/indra/newview/llvoavatardefines.cpp @@ -46,31 +46,31 @@ using namespace LLVOAvatarDefines; LLVOAvatarDictionary::Textures::Textures() { - addEntry(TEX_HEAD_BODYPAINT, new TextureEntry("head_bodypaint", TRUE, BAKED_NUM_INDICES, "", WT_SKIN)); - addEntry(TEX_UPPER_SHIRT, new TextureEntry("upper_shirt", TRUE, BAKED_NUM_INDICES, "UIImgDefaultShirtUUID", WT_SHIRT)); - addEntry(TEX_LOWER_PANTS, new TextureEntry("lower_pants", TRUE, BAKED_NUM_INDICES, "UIImgDefaultPantsUUID", WT_PANTS)); - addEntry(TEX_EYES_IRIS, new TextureEntry("eyes_iris", TRUE, BAKED_NUM_INDICES, "UIImgDefaultEyesUUID", WT_EYES)); - addEntry(TEX_HAIR, new TextureEntry("hair_grain", TRUE, BAKED_NUM_INDICES, "UIImgDefaultHairUUID", WT_HAIR)); - addEntry(TEX_UPPER_BODYPAINT, new TextureEntry("upper_bodypaint", TRUE, BAKED_NUM_INDICES, "", WT_SKIN)); - addEntry(TEX_LOWER_BODYPAINT, new TextureEntry("lower_bodypaint", TRUE, BAKED_NUM_INDICES, "", WT_SKIN)); - addEntry(TEX_LOWER_SHOES, new TextureEntry("lower_shoes", TRUE, BAKED_NUM_INDICES, "UIImgDefaultShoesUUID", WT_SHOES)); - addEntry(TEX_LOWER_SOCKS, new TextureEntry("lower_socks", TRUE, BAKED_NUM_INDICES, "UIImgDefaultSocksUUID", WT_SOCKS)); - addEntry(TEX_UPPER_JACKET, new TextureEntry("upper_jacket", TRUE, BAKED_NUM_INDICES, "UIImgDefaultJacketUUID", WT_JACKET)); - addEntry(TEX_LOWER_JACKET, new TextureEntry("lower_jacket", TRUE, BAKED_NUM_INDICES, "UIImgDefaultJacketUUID", WT_JACKET)); - addEntry(TEX_UPPER_GLOVES, new TextureEntry("upper_gloves", TRUE, BAKED_NUM_INDICES, "UIImgDefaultGlovesUUID", WT_GLOVES)); - addEntry(TEX_UPPER_UNDERSHIRT, new TextureEntry("upper_undershirt", TRUE, BAKED_NUM_INDICES, "UIImgDefaultUnderwearUUID", WT_UNDERSHIRT)); - addEntry(TEX_LOWER_UNDERPANTS, new TextureEntry("lower_underpants", TRUE, BAKED_NUM_INDICES, "UIImgDefaultUnderwearUUID", WT_UNDERPANTS)); - addEntry(TEX_SKIRT, new TextureEntry("skirt", TRUE, BAKED_NUM_INDICES, "UIImgDefaultSkirtUUID", WT_SKIRT)); + addEntry(TEX_HEAD_BODYPAINT, new TextureEntry("head_bodypaint", TRUE, BAKED_NUM_INDICES, "", LLWearableType::WT_SKIN)); + addEntry(TEX_UPPER_SHIRT, new TextureEntry("upper_shirt", TRUE, BAKED_NUM_INDICES, "UIImgDefaultShirtUUID", LLWearableType::WT_SHIRT)); + addEntry(TEX_LOWER_PANTS, new TextureEntry("lower_pants", TRUE, BAKED_NUM_INDICES, "UIImgDefaultPantsUUID", LLWearableType::WT_PANTS)); + addEntry(TEX_EYES_IRIS, new TextureEntry("eyes_iris", TRUE, BAKED_NUM_INDICES, "UIImgDefaultEyesUUID", LLWearableType::WT_EYES)); + addEntry(TEX_HAIR, new TextureEntry("hair_grain", TRUE, BAKED_NUM_INDICES, "UIImgDefaultHairUUID", LLWearableType::WT_HAIR)); + addEntry(TEX_UPPER_BODYPAINT, new TextureEntry("upper_bodypaint", TRUE, BAKED_NUM_INDICES, "", LLWearableType::WT_SKIN)); + addEntry(TEX_LOWER_BODYPAINT, new TextureEntry("lower_bodypaint", TRUE, BAKED_NUM_INDICES, "", LLWearableType::WT_SKIN)); + addEntry(TEX_LOWER_SHOES, new TextureEntry("lower_shoes", TRUE, BAKED_NUM_INDICES, "UIImgDefaultShoesUUID", LLWearableType::WT_SHOES)); + addEntry(TEX_LOWER_SOCKS, new TextureEntry("lower_socks", TRUE, BAKED_NUM_INDICES, "UIImgDefaultSocksUUID", LLWearableType::WT_SOCKS)); + addEntry(TEX_UPPER_JACKET, new TextureEntry("upper_jacket", TRUE, BAKED_NUM_INDICES, "UIImgDefaultJacketUUID", LLWearableType::WT_JACKET)); + addEntry(TEX_LOWER_JACKET, new TextureEntry("lower_jacket", TRUE, BAKED_NUM_INDICES, "UIImgDefaultJacketUUID", LLWearableType::WT_JACKET)); + addEntry(TEX_UPPER_GLOVES, new TextureEntry("upper_gloves", TRUE, BAKED_NUM_INDICES, "UIImgDefaultGlovesUUID", LLWearableType::WT_GLOVES)); + addEntry(TEX_UPPER_UNDERSHIRT, new TextureEntry("upper_undershirt", TRUE, BAKED_NUM_INDICES, "UIImgDefaultUnderwearUUID", LLWearableType::WT_UNDERSHIRT)); + addEntry(TEX_LOWER_UNDERPANTS, new TextureEntry("lower_underpants", TRUE, BAKED_NUM_INDICES, "UIImgDefaultUnderwearUUID", LLWearableType::WT_UNDERPANTS)); + addEntry(TEX_SKIRT, new TextureEntry("skirt", TRUE, BAKED_NUM_INDICES, "UIImgDefaultSkirtUUID", LLWearableType::WT_SKIRT)); - addEntry(TEX_LOWER_ALPHA, new TextureEntry("lower_alpha", TRUE, BAKED_NUM_INDICES, "UIImgDefaultAlphaUUID", WT_ALPHA)); - addEntry(TEX_UPPER_ALPHA, new TextureEntry("upper_alpha", TRUE, BAKED_NUM_INDICES, "UIImgDefaultAlphaUUID", WT_ALPHA)); - addEntry(TEX_HEAD_ALPHA, new TextureEntry("head_alpha", TRUE, BAKED_NUM_INDICES, "UIImgDefaultAlphaUUID", WT_ALPHA)); - addEntry(TEX_EYES_ALPHA, new TextureEntry("eyes_alpha", TRUE, BAKED_NUM_INDICES, "UIImgDefaultAlphaUUID", WT_ALPHA)); - addEntry(TEX_HAIR_ALPHA, new TextureEntry("hair_alpha", TRUE, BAKED_NUM_INDICES, "UIImgDefaultAlphaUUID", WT_ALPHA)); + addEntry(TEX_LOWER_ALPHA, new TextureEntry("lower_alpha", TRUE, BAKED_NUM_INDICES, "UIImgDefaultAlphaUUID", LLWearableType::WT_ALPHA)); + addEntry(TEX_UPPER_ALPHA, new TextureEntry("upper_alpha", TRUE, BAKED_NUM_INDICES, "UIImgDefaultAlphaUUID", LLWearableType::WT_ALPHA)); + addEntry(TEX_HEAD_ALPHA, new TextureEntry("head_alpha", TRUE, BAKED_NUM_INDICES, "UIImgDefaultAlphaUUID", LLWearableType::WT_ALPHA)); + addEntry(TEX_EYES_ALPHA, new TextureEntry("eyes_alpha", TRUE, BAKED_NUM_INDICES, "UIImgDefaultAlphaUUID", LLWearableType::WT_ALPHA)); + addEntry(TEX_HAIR_ALPHA, new TextureEntry("hair_alpha", TRUE, BAKED_NUM_INDICES, "UIImgDefaultAlphaUUID", LLWearableType::WT_ALPHA)); - addEntry(TEX_HEAD_TATTOO, new TextureEntry("head_tattoo", TRUE, BAKED_NUM_INDICES, "", WT_TATTOO)); - addEntry(TEX_UPPER_TATTOO, new TextureEntry("upper_tattoo", TRUE, BAKED_NUM_INDICES, "", WT_TATTOO)); - addEntry(TEX_LOWER_TATTOO, new TextureEntry("lower_tattoo", TRUE, BAKED_NUM_INDICES, "", WT_TATTOO)); + addEntry(TEX_HEAD_TATTOO, new TextureEntry("head_tattoo", TRUE, BAKED_NUM_INDICES, "", LLWearableType::WT_TATTOO)); + addEntry(TEX_UPPER_TATTOO, new TextureEntry("upper_tattoo", TRUE, BAKED_NUM_INDICES, "", LLWearableType::WT_TATTOO)); + addEntry(TEX_LOWER_TATTOO, new TextureEntry("lower_tattoo", TRUE, BAKED_NUM_INDICES, "", LLWearableType::WT_TATTOO)); addEntry(TEX_HEAD_BAKED, new TextureEntry("head-baked", FALSE, BAKED_HEAD)); addEntry(TEX_UPPER_BAKED, new TextureEntry("upper-baked", FALSE, BAKED_UPPER)); @@ -86,34 +86,34 @@ LLVOAvatarDictionary::BakedTextures::BakedTextures() addEntry(BAKED_HEAD, new BakedEntry(TEX_HEAD_BAKED, "head", "a4b9dc38-e13b-4df9-b284-751efb0566ff", 3, TEX_HEAD_BODYPAINT, TEX_HEAD_TATTOO, TEX_HEAD_ALPHA, - 5, WT_SHAPE, WT_SKIN, WT_HAIR, WT_TATTOO, WT_ALPHA)); + 5, LLWearableType::WT_SHAPE, LLWearableType::WT_SKIN, LLWearableType::WT_HAIR, LLWearableType::WT_TATTOO, LLWearableType::WT_ALPHA)); addEntry(BAKED_UPPER, new BakedEntry(TEX_UPPER_BAKED, "upper_body", "5943ff64-d26c-4a90-a8c0-d61f56bd98d4", 7, TEX_UPPER_SHIRT,TEX_UPPER_BODYPAINT, TEX_UPPER_JACKET, TEX_UPPER_GLOVES, TEX_UPPER_UNDERSHIRT, TEX_UPPER_TATTOO, TEX_UPPER_ALPHA, - 8, WT_SHAPE, WT_SKIN, WT_SHIRT, WT_JACKET, WT_GLOVES, WT_UNDERSHIRT, WT_TATTOO, WT_ALPHA)); + 8, LLWearableType::WT_SHAPE, LLWearableType::WT_SKIN, LLWearableType::WT_SHIRT, LLWearableType::WT_JACKET, LLWearableType::WT_GLOVES, LLWearableType::WT_UNDERSHIRT, LLWearableType::WT_TATTOO, LLWearableType::WT_ALPHA)); addEntry(BAKED_LOWER, new BakedEntry(TEX_LOWER_BAKED, "lower_body", "2944ee70-90a7-425d-a5fb-d749c782ed7d", 8, TEX_LOWER_PANTS,TEX_LOWER_BODYPAINT,TEX_LOWER_SHOES, TEX_LOWER_SOCKS, TEX_LOWER_JACKET, TEX_LOWER_UNDERPANTS, TEX_LOWER_TATTOO, TEX_LOWER_ALPHA, - 9, WT_SHAPE, WT_SKIN, WT_PANTS, WT_SHOES, WT_SOCKS, WT_JACKET, WT_UNDERPANTS, WT_TATTOO, WT_ALPHA)); + 9, LLWearableType::WT_SHAPE, LLWearableType::WT_SKIN, LLWearableType::WT_PANTS, LLWearableType::WT_SHOES, LLWearableType::WT_SOCKS, LLWearableType::WT_JACKET, LLWearableType::WT_UNDERPANTS, LLWearableType::WT_TATTOO, LLWearableType::WT_ALPHA)); addEntry(BAKED_EYES, new BakedEntry(TEX_EYES_BAKED, "eyes", "27b1bc0f-979f-4b13-95fe-b981c2ba9788", 2, TEX_EYES_IRIS, TEX_EYES_ALPHA, - 2, WT_EYES, WT_ALPHA)); + 2, LLWearableType::WT_EYES, LLWearableType::WT_ALPHA)); addEntry(BAKED_SKIRT, new BakedEntry(TEX_SKIRT_BAKED, "skirt", "03e7e8cb-1368-483b-b6f3-74850838ba63", 1, TEX_SKIRT, - 1, WT_SKIRT)); + 1, LLWearableType::WT_SKIRT)); addEntry(BAKED_HAIR, new BakedEntry(TEX_HAIR_BAKED, "hair", "a60e85a9-74e8-48d8-8a2d-8129f28d9b61", 2, TEX_HAIR, TEX_HAIR_ALPHA, - 2, WT_HAIR, WT_ALPHA)); + 2, LLWearableType::WT_HAIR, LLWearableType::WT_ALPHA)); } LLVOAvatarDictionary::Meshes::Meshes() @@ -170,7 +170,7 @@ LLVOAvatarDictionary::TextureEntry::TextureEntry(const std::string &name, bool is_local_texture, EBakedTextureIndex baked_texture_index, const std::string &default_image_name, - EWearableType wearable_type) : + LLWearableType::EType wearable_type) : LLDictionaryEntry(name), mIsLocalTexture(is_local_texture), mIsBakedTexture(!is_local_texture), @@ -216,7 +216,7 @@ LLVOAvatarDictionary::BakedEntry::BakedEntry(ETextureIndex tex_index, // Read in wearables for (U8 i=0; i < num_wearables; i++) { - EWearableType t = (EWearableType)va_arg(argp,int); + LLWearableType::EType t = (LLWearableType::EType)va_arg(argp,int); mWearables.push_back(t); } } @@ -261,7 +261,7 @@ const LLUUID LLVOAvatarDictionary::getDefaultTextureImageID(ETextureIndex index) } // static -EWearableType LLVOAvatarDictionary::getTEWearableType(ETextureIndex index ) +LLWearableType::EType LLVOAvatarDictionary::getTEWearableType(ETextureIndex index ) { return getInstance()->getTexture(index)->mWearableType; } diff --git a/indra/newview/llvoavatardefines.h b/indra/newview/llvoavatardefines.h index cf3d318159..9c4ee7e716 100644 --- a/indra/newview/llvoavatardefines.h +++ b/indra/newview/llvoavatardefines.h @@ -114,7 +114,7 @@ enum EMeshIndex typedef std::vector<ETextureIndex> texture_vec_t; typedef std::vector<EBakedTextureIndex> bakedtexture_vec_t; typedef std::vector<EMeshIndex> mesh_vec_t; -typedef std::vector<EWearableType> wearables_vec_t; +typedef std::vector<LLWearableType::EType> wearables_vec_t; //------------------------------------------------------------------------ // LLVOAvatarDictionary @@ -145,9 +145,9 @@ public: bool is_local_texture, EBakedTextureIndex baked_texture_index = BAKED_NUM_INDICES, const std::string& default_image_name = "", - EWearableType wearable_type = WT_INVALID); + LLWearableType::EType wearable_type = LLWearableType::WT_INVALID); const std::string mDefaultImageName; - const EWearableType mWearableType; + const LLWearableType::EType mWearableType; // It's either a local texture xor baked BOOL mIsLocalTexture; BOOL mIsBakedTexture; @@ -225,7 +225,7 @@ public: static const LLUUID getDefaultTextureImageID(ETextureIndex index); // Given a texture entry, determine which wearable type owns it. - static EWearableType getTEWearableType(ETextureIndex index); + static LLWearableType::EType getTEWearableType(ETextureIndex index); }; // End LLVOAvatarDictionary diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index b1ea8a1bbb..91af5fefde 100644 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -44,15 +44,19 @@ #include "pipeline.h" #include "llagent.h" // Get state values from here +#include "llagentcamera.h" #include "llagentwearables.h" #include "llhudeffecttrail.h" #include "llhudmanager.h" +#include "llinventoryfunctions.h" +#include "llnotificationsutil.h" #include "llselectmgr.h" #include "lltoolgrab.h" // for needsRenderBeam #include "lltoolmgr.h" // for needsRenderBeam #include "lltoolmorph.h" #include "lltrans.h" #include "llviewercamera.h" +#include "llviewercontrol.h" #include "llviewermenu.h" #include "llviewerobjectlist.h" #include "llviewerstats.h" @@ -66,6 +70,14 @@ #include <boost/lexical_cast.hpp> +LLVOAvatarSelf *gAgentAvatarp = NULL; +BOOL isAgentAvatarValid() +{ + return (gAgentAvatarp && + (gAgentAvatarp->getRegion() != NULL) && + (!gAgentAvatarp->isDead())); +} + using namespace LLVOAvatarDefines; /********************************************************************************* @@ -77,14 +89,14 @@ using namespace LLVOAvatarDefines; struct LocalTextureData { LocalTextureData() : - mIsBakedReady(FALSE), + mIsBakedReady(false), mDiscard(MAX_DISCARD_LEVEL+1), mImage(NULL), mWearableID(IMG_DEFAULT_AVATAR), mTexEntry(NULL) {} LLPointer<LLViewerFetchedTexture> mImage; - BOOL mIsBakedReady; + bool mIsBakedReady; S32 mDiscard; LLUUID mWearableID; // UUID of the wearable that this texture belongs to, not of the image itself LLTextureEntry *mTexEntry; @@ -93,15 +105,7 @@ struct LocalTextureData //----------------------------------------------------------------------------- // Callback data //----------------------------------------------------------------------------- -struct LLAvatarTexData -{ - LLAvatarTexData(const LLUUID& id, ETextureIndex index) : - mAvatarID(id), - mIndex(index) - {} - LLUUID mAvatarID; - ETextureIndex mIndex; -}; + /** ** @@ -132,9 +136,10 @@ LLVOAvatarSelf::LLVOAvatarSelf(const LLUUID& id, mLastRegionHandle(0), mRegionCrossingCount(0) { - gAgent.setAvatarObject(this); gAgentWearables.setAvatarObject(this); - + + mMotionController.mIsSelf = TRUE; + lldebugs << "Marking avatar as self " << id << llendl; } @@ -147,6 +152,23 @@ void LLVOAvatarSelf::initInstance() // adds attachment points to mScreen among other things LLVOAvatar::initInstance(); + llinfos << "Self avatar object created. Starting timer." << llendl; + mDebugSelfLoadTimer.reset(); + // clear all times to -1 for debugging + for (U32 i =0; i < LLVOAvatarDefines::TEX_NUM_INDICES; ++i) + { + for (U32 j = 0; j <= MAX_DISCARD_LEVEL; ++j) + { + mDebugTextureLoadTimes[i][j] = -1.0f; + } + } + + for (U32 i =0; i < LLVOAvatarDefines::BAKED_NUM_INDICES; ++i) + { + mDebugBakedTextureTimes[i][0] = -1.0f; + mDebugBakedTextureTimes[i][1] = -1.0f; + } + status &= buildMenus(); if (!status) { @@ -174,7 +196,7 @@ void LLVOAvatarSelf::markDead() param; param = (LLViewerVisualParam*) getNextVisualParam()) { - if (param->getWearableType() != WT_INVALID) + if (param->getWearableType() != LLWearableType::WT_INVALID) { param->setIsDummy(TRUE); } @@ -211,6 +233,8 @@ BOOL LLVOAvatarSelf::buildSkeletonSelf(const LLVOAvatarSkeletonInfo *info) LLVector3 scale(1.f, aspect, 1.f); mScreenp->setScale(scale); mScreenp->setWorldPosition(LLVector3::zero); + // need to update screen agressively when sidebar opens/closes, for example + mScreenp->mUpdateXform = TRUE; return TRUE; } @@ -487,7 +511,7 @@ BOOL LLVOAvatarSelf::buildMenus() { LLMenuItemCallGL::Params item_params; item_params.name = attachment->getName(); - item_params.label = attachment->getName(); + item_params.label = LLTrans::getString(attachment->getName()); item_params.on_click.function_name = "Object.AttachToAvatar"; item_params.on_click.parameter = attach_index; item_params.on_enable.function_name = "Object.EnableWear"; @@ -508,12 +532,17 @@ BOOL LLVOAvatarSelf::buildMenus() return TRUE; } +void LLVOAvatarSelf::cleanup() +{ + markDead(); + delete mScreenp; + mScreenp = NULL; + mRegionp = NULL; +} + LLVOAvatarSelf::~LLVOAvatarSelf() { - gAgent.setAvatarObject(NULL); - gAgentWearables.setAvatarObject(NULL); - delete mScreenp; - mScreenp = NULL; + cleanup(); } /** @@ -604,6 +633,17 @@ BOOL LLVOAvatarSelf::updateCharacter(LLAgent &agent) } // virtual +BOOL LLVOAvatarSelf::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) +{ + if (!isAgentAvatarValid()) + { + return TRUE; + } + LLVOAvatar::idleUpdate(agent, world, time); + return TRUE; +} + +// virtual LLJoint *LLVOAvatarSelf::getJoint(const std::string &name) { if (mScreenp) @@ -614,7 +654,8 @@ LLJoint *LLVOAvatarSelf::getJoint(const std::string &name) return LLVOAvatar::getJoint(name); } -/*virtual*/ BOOL LLVOAvatarSelf::setVisualParamWeight(LLVisualParam *which_param, F32 weight, BOOL upload_bake ) +// virtual +BOOL LLVOAvatarSelf::setVisualParamWeight(LLVisualParam *which_param, F32 weight, BOOL upload_bake ) { if (!which_param) { @@ -624,7 +665,8 @@ LLJoint *LLVOAvatarSelf::getJoint(const std::string &name) return setParamWeight(param,weight,upload_bake); } -/*virtual*/ BOOL LLVOAvatarSelf::setVisualParamWeight(const char* param_name, F32 weight, BOOL upload_bake ) +// virtual +BOOL LLVOAvatarSelf::setVisualParamWeight(const char* param_name, F32 weight, BOOL upload_bake ) { if (!param_name) { @@ -634,7 +676,8 @@ LLJoint *LLVOAvatarSelf::getJoint(const std::string &name) return setParamWeight(param,weight,upload_bake); } -/*virtual*/ BOOL LLVOAvatarSelf::setVisualParamWeight(S32 index, F32 weight, BOOL upload_bake ) +// virtual +BOOL LLVOAvatarSelf::setVisualParamWeight(S32 index, F32 weight, BOOL upload_bake ) { LLViewerVisualParam *param = (LLViewerVisualParam*) LLCharacter::getVisualParam(index); return setParamWeight(param,weight,upload_bake); @@ -649,7 +692,7 @@ BOOL LLVOAvatarSelf::setParamWeight(LLViewerVisualParam *param, F32 weight, BOOL if (param->getCrossWearable()) { - EWearableType type = (EWearableType)param->getWearableType(); + LLWearableType::EType type = (LLWearableType::EType)param->getWearableType(); U32 size = gAgentWearables.getWearableCount(type); for (U32 count = 0; count < size; ++count) { @@ -667,15 +710,6 @@ BOOL LLVOAvatarSelf::setParamWeight(LLViewerVisualParam *param, F32 weight, BOOL /*virtual*/ void LLVOAvatarSelf::updateVisualParams() { - for (U32 type = 0; type < WT_COUNT; type++) - { - LLWearable *wearable = gAgentWearables.getTopWearable((EWearableType)type); - if (wearable) - { - wearable->writeToAvatar(); - } - } - LLVOAvatar::updateVisualParams(); } @@ -686,7 +720,14 @@ void LLVOAvatarSelf::idleUpdateAppearanceAnimation() gAgentWearables.animateAllWearableParams(calcMorphAmount(), FALSE); // apply wearable visual params to avatar - updateVisualParams(); + for (U32 type = 0; type < LLWearableType::WT_COUNT; type++) + { + LLWearable *wearable = gAgentWearables.getTopWearable((LLWearableType::EType)type); + if (wearable) + { + wearable->writeToAvatar(); + } + } //allow avatar to process updates LLVOAvatar::idleUpdateAppearanceAnimation(); @@ -759,6 +800,7 @@ void LLVOAvatarSelf::removeMissingBakedTextures() { for (U32 i = 0; i < mBakedTextureDatas.size(); i++) { + mBakedTextureDatas[i].mTexLayerSet->setUpdatesEnabled(TRUE); invalidateComposite(mBakedTextureDatas[i].mTexLayerSet, FALSE); } updateMeshTextures(); @@ -769,7 +811,8 @@ void LLVOAvatarSelf::removeMissingBakedTextures() //virtual void LLVOAvatarSelf::updateRegion(LLViewerRegion *regionp) { - if (regionp->getHandle() != mLastRegionHandle) + setRegion(regionp); + if (!regionp || (regionp->getHandle() != mLastRegionHandle)) { if (mLastRegionHandle != 0) { @@ -783,7 +826,10 @@ void LLVOAvatarSelf::updateRegion(LLViewerRegion *regionp) max = llmax(delta, max); LLViewerStats::getInstance()->setStat(LLViewerStats::ST_CROSSING_MAX, max); } - mLastRegionHandle = regionp->getHandle(); + if (regionp) + { + mLastRegionHandle = regionp->getHandle(); + } } mRegionCrossingTimer.reset(); } @@ -812,10 +858,10 @@ void LLVOAvatarSelf::idleUpdateTractorBeam() { LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection(); - if (gAgent.mPointAt.notNull()) + if (gAgentCamera.mPointAt.notNull()) { // get point from pointat effect - mBeam->setPositionGlobal(gAgent.mPointAt->getPointAtPosGlobal()); + mBeam->setPositionGlobal(gAgentCamera.mPointAt->getPointAtPosGlobal()); mBeam->triggerLocal(); } else if (selection->getFirstRootObject() && @@ -866,7 +912,7 @@ void LLVOAvatarSelf::restoreMeshData() //llinfos << "Restoring" << llendl; mMeshValid = TRUE; updateJointLODs(); - updateAttachmentVisibility(gAgent.getCameraMode()); + updateAttachmentVisibility(gAgentCamera.getCameraMode()); // force mesh update as LOD might not have changed to trigger this gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_GEOMETRY, TRUE); @@ -910,17 +956,17 @@ void LLVOAvatarSelf::updateAttachmentVisibility(U32 camera_mode) } } -/*virtual*/ BOOL LLVOAvatarSelf::isWearingWearableType(EWearableType type ) const +/*virtual*/ BOOL LLVOAvatarSelf::isWearingWearableType(LLWearableType::EType type ) const { return gAgentWearables.getWearableCount(type) > 0; } //----------------------------------------------------------------------------- -// updatedWearable( EWearableType type ) +// updatedWearable( LLWearableType::EType type ) // forces an update to any baked textures relevant to type. // will force an upload of the resulting bake if the second parameter is TRUE //----------------------------------------------------------------------------- -void LLVOAvatarSelf::wearableUpdated( EWearableType type, BOOL upload_result ) +void LLVOAvatarSelf::wearableUpdated( LLWearableType::EType type, BOOL upload_result ) { for (LLVOAvatarDictionary::BakedTextures::const_iterator baked_iter = LLVOAvatarDictionary::getInstance()->getBakedTextures().begin(); baked_iter != LLVOAvatarDictionary::getInstance()->getBakedTextures().end(); @@ -928,17 +974,19 @@ void LLVOAvatarSelf::wearableUpdated( EWearableType type, BOOL upload_result ) { const LLVOAvatarDictionary::BakedEntry *baked_dict = baked_iter->second; const LLVOAvatarDefines::EBakedTextureIndex index = baked_iter->first; + if (baked_dict) { for (LLVOAvatarDefines::wearables_vec_t::const_iterator type_iter = baked_dict->mWearables.begin(); type_iter != baked_dict->mWearables.end(); ++type_iter) { - const EWearableType comp_type = *type_iter; + const LLWearableType::EType comp_type = *type_iter; if (comp_type == type) { if (mBakedTextureDatas[index].mTexLayerSet) { + mBakedTextureDatas[index].mTexLayerSet->setUpdatesEnabled(true); invalidateComposite(mBakedTextureDatas[index].mTexLayerSet, upload_result); } break; @@ -1012,7 +1060,7 @@ const LLViewerJointAttachment *LLVOAvatarSelf::attachObject(LLViewerObject *view return 0; } - updateAttachmentVisibility(gAgent.getCameraMode()); + updateAttachmentVisibility(gAgentCamera.getCameraMode()); // Then make sure the inventory is in sync with the avatar. @@ -1020,7 +1068,7 @@ const LLViewerJointAttachment *LLVOAvatarSelf::attachObject(LLViewerObject *view if (attachment->isObjectAttached(viewer_object)) { const LLUUID& attachment_id = viewer_object->getItemID(); - LLAppearanceManager::instance().registerAttachment(attachment_id); + LLAppearanceMgr::instance().registerAttachment(attachment_id); } return attachment; @@ -1053,13 +1101,13 @@ BOOL LLVOAvatarSelf::detachObject(LLViewerObject *viewer_object) // Make sure the inventory is in sync with the avatar. // Update COF contents, don't trigger appearance update. - if (gAgent.getAvatarObject() == NULL) + if (!isAgentAvatarValid()) { llinfos << "removeItemLinks skipped, avatar is under destruction" << llendl; } else { - LLAppearanceManager::instance().unregisterAttachment(attachment_id); + LLAppearanceMgr::instance().unregisterAttachment(attachment_id); } return TRUE; @@ -1069,19 +1117,19 @@ BOOL LLVOAvatarSelf::detachObject(LLViewerObject *viewer_object) U32 LLVOAvatarSelf::getNumWearables(LLVOAvatarDefines::ETextureIndex i) const { - EWearableType type = LLVOAvatarDictionary::getInstance()->getTEWearableType(i); + LLWearableType::EType type = LLVOAvatarDictionary::getInstance()->getTEWearableType(i); return gAgentWearables.getWearableCount(type); } // virtual void LLVOAvatarSelf::localTextureLoaded(BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src_raw, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata) { - //llinfos << "onLocalTextureLoaded: " << src_vi->getID() << llendl; const LLUUID& src_id = src_vi->getID(); LLAvatarTexData *data = (LLAvatarTexData *)userdata; ETextureIndex index = data->mIndex; if (!isIndexLocalTexture(index)) return; + LLLocalTextureObject *local_tex_obj = getLocalTextureObject(index, 0); // fix for EXT-268. Preventing using of NULL pointer @@ -1100,11 +1148,11 @@ void LLVOAvatarSelf::localTextureLoaded(BOOL success, LLViewerFetchedTexture *sr discard_level < local_tex_obj->getDiscard()) { local_tex_obj->setDiscard(discard_level); - if (!gAgent.cameraCustomizeAvatar()) + if (!gAgentCamera.cameraCustomizeAvatar()) { requestLayerSetUpdate(index); } - else if (gAgent.cameraCustomizeAvatar()) + else if (gAgentCamera.cameraCustomizeAvatar()) { LLVisualParamHint::requestHintUpdates(); } @@ -1197,7 +1245,7 @@ BOOL LLVOAvatarSelf::isLocalTextureDataAvailable(const LLTexLayerSet* layerset) ++local_tex_iter) { const ETextureIndex tex_index = *local_tex_iter; - const EWearableType wearable_type = LLVOAvatarDictionary::getTEWearableType(tex_index); + const LLWearableType::EType wearable_type = LLVOAvatarDictionary::getTEWearableType(tex_index); const U32 wearable_count = gAgentWearables.getWearableCount(wearable_type); for (U32 wearable_index = 0; wearable_index < wearable_count; wearable_index++) { @@ -1219,6 +1267,9 @@ BOOL LLVOAvatarSelf::isLocalTextureDataAvailable(const LLTexLayerSet* layerset) //----------------------------------------------------------------------------- BOOL LLVOAvatarSelf::isLocalTextureDataFinal(const LLTexLayerSet* layerset) const { + const U32 desired_tex_discard_level = gSavedSettings.getU32("TextureDiscardLevel"); + // const U32 desired_tex_discard_level = 0; // hack to not bake textures on lower discard levels. + for (U32 i = 0; i < mBakedTextureDatas.size(); i++) { if (layerset == mBakedTextureDatas[i].mTexLayerSet) @@ -1229,11 +1280,11 @@ BOOL LLVOAvatarSelf::isLocalTextureDataFinal(const LLTexLayerSet* layerset) cons ++local_tex_iter) { const ETextureIndex tex_index = *local_tex_iter; - const EWearableType wearable_type = LLVOAvatarDictionary::getTEWearableType(tex_index); + const LLWearableType::EType wearable_type = LLVOAvatarDictionary::getTEWearableType(tex_index); const U32 wearable_count = gAgentWearables.getWearableCount(wearable_type); for (U32 wearable_index = 0; wearable_index < wearable_count; wearable_index++) { - if (getLocalDiscardLevel(*local_tex_iter, wearable_index) != 0) + if (getLocalDiscardLevel(*local_tex_iter, wearable_index) > (S32)(desired_tex_discard_level)) { return FALSE; } @@ -1246,13 +1297,49 @@ BOOL LLVOAvatarSelf::isLocalTextureDataFinal(const LLTexLayerSet* layerset) cons return FALSE; } +BOOL LLVOAvatarSelf::isAllLocalTextureDataFinal() const +{ + const U32 desired_tex_discard_level = gSavedSettings.getU32("TextureDiscardLevel"); + // const U32 desired_tex_discard_level = 0; // hack to not bake textures on lower discard levels + + for (U32 i = 0; i < mBakedTextureDatas.size(); i++) + { + const LLVOAvatarDictionary::BakedEntry *baked_dict = LLVOAvatarDictionary::getInstance()->getBakedTexture((EBakedTextureIndex)i); + for (texture_vec_t::const_iterator local_tex_iter = baked_dict->mLocalTextures.begin(); + local_tex_iter != baked_dict->mLocalTextures.end(); + ++local_tex_iter) + { + const ETextureIndex tex_index = *local_tex_iter; + const LLWearableType::EType wearable_type = LLVOAvatarDictionary::getTEWearableType(tex_index); + const U32 wearable_count = gAgentWearables.getWearableCount(wearable_type); + for (U32 wearable_index = 0; wearable_index < wearable_count; wearable_index++) + { + if (getLocalDiscardLevel(*local_tex_iter, wearable_index) > (S32)(desired_tex_discard_level)) + { + return FALSE; + } + } + } + } + return TRUE; +} + +BOOL LLVOAvatarSelf::isBakedTextureFinal(const LLVOAvatarDefines::EBakedTextureIndex index) const +{ + const LLTexLayerSet *layerset = mBakedTextureDatas[index].mTexLayerSet; + if (!layerset) return FALSE; + const LLTexLayerSetBuffer *layerset_buffer = layerset->getComposite(); + if (!layerset_buffer) return FALSE; + return !layerset_buffer->uploadNeeded(); +} + BOOL LLVOAvatarSelf::isTextureDefined(LLVOAvatarDefines::ETextureIndex type, U32 index) const { LLUUID id; BOOL isDefined = TRUE; if (isIndexLocalTexture(type)) { - const EWearableType wearable_type = LLVOAvatarDictionary::getTEWearableType(type); + const LLWearableType::EType wearable_type = LLVOAvatarDictionary::getTEWearableType(type); const U32 wearable_count = gAgentWearables.getWearableCount(wearable_type); if (index >= wearable_count) { @@ -1278,20 +1365,50 @@ BOOL LLVOAvatarSelf::isTextureDefined(LLVOAvatarDefines::ETextureIndex type, U32 return isDefined; } +//virtual +BOOL LLVOAvatarSelf::isTextureVisible(LLVOAvatarDefines::ETextureIndex type, U32 index) const +{ + if (isIndexBakedTexture(type)) + { + return LLVOAvatar::isTextureVisible(type, (U32)0); + } + + LLUUID tex_id = getLocalTextureID(type,index); + return (tex_id != IMG_INVISIBLE) + || (LLDrawPoolAlpha::sShowDebugAlpha); +} + +//virtual +BOOL LLVOAvatarSelf::isTextureVisible(LLVOAvatarDefines::ETextureIndex type, LLWearable *wearable) const +{ + if (isIndexBakedTexture(type)) + { + return LLVOAvatar::isTextureVisible(type); + } + + U32 index = gAgentWearables.getWearableIndex(wearable); + return isTextureVisible(type,index); +} + + //----------------------------------------------------------------------------- -// virtual // requestLayerSetUploads() //----------------------------------------------------------------------------- void LLVOAvatarSelf::requestLayerSetUploads() { for (U32 i = 0; i < mBakedTextureDatas.size(); i++) { - ETextureIndex tex_index = mBakedTextureDatas[i].mTextureIndex; - BOOL layer_baked = isTextureDefined(tex_index, gAgentWearables.getWearableCount(tex_index)); - if (!layer_baked && mBakedTextureDatas[i].mTexLayerSet) - { - mBakedTextureDatas[i].mTexLayerSet->requestUpload(); - } + requestLayerSetUpload((EBakedTextureIndex)i); + } +} + +void LLVOAvatarSelf::requestLayerSetUpload(LLVOAvatarDefines::EBakedTextureIndex i) +{ + ETextureIndex tex_index = mBakedTextureDatas[i].mTextureIndex; + const BOOL layer_baked = isTextureDefined(tex_index, gAgentWearables.getWearableCount(tex_index)); + if (!layer_baked && mBakedTextureDatas[i].mTexLayerSet) + { + mBakedTextureDatas[i].mTexLayerSet->requestUpload(); } } @@ -1305,8 +1422,8 @@ bool LLVOAvatarSelf::hasPendingBakedUploads() const { for (U32 i = 0; i < mBakedTextureDatas.size(); i++) { - BOOL upload_pending = (mBakedTextureDatas[i].mTexLayerSet && mBakedTextureDatas[i].mTexLayerSet->getComposite()->uploadPending()); - if (upload_pending) + LLTexLayerSet* layerset = mBakedTextureDatas[i].mTexLayerSet; + if (layerset && layerset->getComposite() && layerset->getComposite()->uploadPending()) { return true; } @@ -1320,7 +1437,7 @@ void LLVOAvatarSelf::invalidateComposite( LLTexLayerSet* layerset, BOOL upload_r { return; } - // llinfos << "LLVOAvatar::invalidComposite() " << layerset->getBodyRegion() << llendl; + // llinfos << "LLVOAvatar::invalidComposite() " << layerset->getBodyRegionName() << llendl; layerset->requestUpdate(); layerset->invalidateMorphMasks(); @@ -1342,22 +1459,37 @@ void LLVOAvatarSelf::invalidateAll() { invalidateComposite(mBakedTextureDatas[i].mTexLayerSet, TRUE); } + mDebugSelfLoadTimer.reset(); } //----------------------------------------------------------------------------- // setCompositeUpdatesEnabled() //----------------------------------------------------------------------------- -void LLVOAvatarSelf::setCompositeUpdatesEnabled( BOOL b ) +void LLVOAvatarSelf::setCompositeUpdatesEnabled( bool b ) { for (U32 i = 0; i < mBakedTextureDatas.size(); i++) { - if (mBakedTextureDatas[i].mTexLayerSet ) - { - mBakedTextureDatas[i].mTexLayerSet->setUpdatesEnabled( b ); - } + setCompositeUpdatesEnabled(i, b); } } +void LLVOAvatarSelf::setCompositeUpdatesEnabled(U32 index, bool b) +{ + if (mBakedTextureDatas[index].mTexLayerSet ) + { + mBakedTextureDatas[index].mTexLayerSet->setUpdatesEnabled( b ); + } +} + +bool LLVOAvatarSelf::isCompositeUpdateEnabled(U32 index) +{ + if (mBakedTextureDatas[index].mTexLayerSet) + { + return mBakedTextureDatas[index].mTexLayerSet->getUpdatesEnabled(); + } + return false; +} + void LLVOAvatarSelf::setupComposites() { for (U32 i = 0; i < mBakedTextureDatas.size(); i++) @@ -1376,7 +1508,7 @@ void LLVOAvatarSelf::updateComposites() for (U32 i = 0; i < mBakedTextureDatas.size(); i++) { if (mBakedTextureDatas[i].mTexLayerSet - && ((i != BAKED_SKIRT) || isWearingWearableType(WT_SKIRT))) + && ((i != BAKED_SKIRT) || isWearingWearableType(LLWearableType::WT_SKIRT))) { mBakedTextureDatas[i].mTexLayerSet->updateComposite(); } @@ -1455,7 +1587,7 @@ void LLVOAvatarSelf::setLocalTexture(ETextureIndex type, LLViewerTexture* src_te llerrs << "Tried to set local texture with invalid type: (" << (U32) type << ", " << index << ")" << llendl; return; } - EWearableType wearable_type = LLVOAvatarDictionary::getInstance()->getTEWearableType(type); + LLWearableType::EType wearable_type = LLVOAvatarDictionary::getInstance()->getTEWearableType(type); if (!gAgentWearables.getWearable(wearable_type,index)) { // no wearable is loaded, cannot set the texture. @@ -1490,11 +1622,11 @@ void LLVOAvatarSelf::setLocalTexture(ETextureIndex type, LLViewerTexture* src_te if (tex_discard >= 0 && tex_discard <= desired_discard) { local_tex_obj->setDiscard(tex_discard); - if (isSelf() && !gAgent.cameraCustomizeAvatar()) + if (isSelf() && !gAgentCamera.cameraCustomizeAvatar()) { requestLayerSetUpdate(type); } - else if (isSelf() && gAgent.cameraCustomizeAvatar()) + else if (isSelf() && gAgentCamera.cameraCustomizeAvatar()) { LLVisualParamHint::requestHintUpdates(); } @@ -1634,23 +1766,24 @@ void LLVOAvatarSelf::onLocalTextureLoaded(BOOL success, LLViewerFetchedTexture * void LLVOAvatarSelf::dumpTotalLocalTextureByteCount() { S32 gl_bytes = 0; - gAgent.getAvatarObject()->getLocalTextureByteCount(&gl_bytes); + gAgentAvatarp->getLocalTextureByteCount(&gl_bytes); llinfos << "Total Avatar LocTex GL:" << (gl_bytes/1024) << "KB" << llendl; } -BOOL LLVOAvatarSelf::updateIsFullyLoaded() +BOOL LLVOAvatarSelf::getIsCloud() { - BOOL loading = FALSE; - - // do we have a shape? - if (visualParamWeightsAreDefault()) + // do we have our body parts? + if (gAgentWearables.getWearableCount(LLWearableType::WT_SHAPE) == 0 || + gAgentWearables.getWearableCount(LLWearableType::WT_HAIR) == 0 || + gAgentWearables.getWearableCount(LLWearableType::WT_EYES) == 0 || + gAgentWearables.getWearableCount(LLWearableType::WT_SKIN) == 0) { - loading = TRUE; + return TRUE; } if (!isTextureDefined(TEX_HAIR, 0)) { - loading = TRUE; + return TRUE; } if (!mPreviousFullyLoaded) @@ -1658,111 +1791,227 @@ BOOL LLVOAvatarSelf::updateIsFullyLoaded() if (!isLocalTextureDataAvailable(mBakedTextureDatas[BAKED_LOWER].mTexLayerSet) && (!isTextureDefined(TEX_LOWER_BAKED, 0))) { - loading = TRUE; + return TRUE; } if (!isLocalTextureDataAvailable(mBakedTextureDatas[BAKED_UPPER].mTexLayerSet) && (!isTextureDefined(TEX_UPPER_BAKED, 0))) { - loading = TRUE; + return TRUE; } for (U32 i = 0; i < mBakedTextureDatas.size(); i++) { - if (i == BAKED_SKIRT && !isWearingWearableType(WT_SKIRT)) + if (i == BAKED_SKIRT && !isWearingWearableType(LLWearableType::WT_SKIRT)) continue; - BakedTextureData& texture_data = mBakedTextureDatas[i]; + const BakedTextureData& texture_data = mBakedTextureDatas[i]; if (!isTextureDefined(texture_data.mTextureIndex, 0)) continue; // Check for the case that texture is defined but not sufficiently loaded to display anything. - LLViewerTexture* baked_img = getImage( texture_data.mTextureIndex, 0 ); + const LLViewerTexture* baked_img = getImage( texture_data.mTextureIndex, 0 ); if (!baked_img || !baked_img->hasGLTexture()) { - loading = TRUE; + return TRUE; } + } + + } + return FALSE; +} + +/*static*/ +void LLVOAvatarSelf::debugOnTimingLocalTexLoaded(BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata) +{ + gAgentAvatarp->debugTimingLocalTexLoaded(success, src_vi, src, aux_src, discard_level, final, userdata); +} + +void LLVOAvatarSelf::debugTimingLocalTexLoaded(BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata) +{ + LLAvatarTexData *data = (LLAvatarTexData *)userdata; + if (!data) + { + return; + } + + ETextureIndex index = data->mIndex; + + if (index < 0 || index >= TEX_NUM_INDICES) + { + return; + } + + if (discard_level >=0 && discard_level <= MAX_DISCARD_LEVEL) // ignore discard level -1, as it means we have no data. + { + mDebugTextureLoadTimes[(U32)index][(U32)discard_level] = mDebugSelfLoadTimer.getElapsedTimeF32(); + } + if (final) + { + delete data; + } +} +void LLVOAvatarSelf::debugBakedTextureUpload(EBakedTextureIndex index, BOOL finished) +{ + U32 done = 0; + if (finished) + { + done = 1; + } + mDebugBakedTextureTimes[index][done] = mDebugSelfLoadTimer.getElapsedTimeF32(); +} + +const std::string LLVOAvatarSelf::debugDumpLocalTextureDataInfo(const LLTexLayerSet* layerset) const +{ + std::string text=""; + + text = llformat("[Final:%d Avail:%d] ",isLocalTextureDataFinal(layerset), isLocalTextureDataAvailable(layerset)); + + /* if (layerset == mBakedTextureDatas[BAKED_HEAD].mTexLayerSet) + return getLocalDiscardLevel(TEX_HEAD_BODYPAINT) >= 0; */ + for (LLVOAvatarDictionary::BakedTextures::const_iterator baked_iter = LLVOAvatarDictionary::getInstance()->getBakedTextures().begin(); + baked_iter != LLVOAvatarDictionary::getInstance()->getBakedTextures().end(); + ++baked_iter) + { + const EBakedTextureIndex baked_index = baked_iter->first; + if (layerset == mBakedTextureDatas[baked_index].mTexLayerSet) + { + const LLVOAvatarDictionary::BakedEntry *baked_dict = baked_iter->second; + text += llformat("%d-%s ( ",baked_index, baked_dict->mName.c_str()); + for (texture_vec_t::const_iterator local_tex_iter = baked_dict->mLocalTextures.begin(); + local_tex_iter != baked_dict->mLocalTextures.end(); + ++local_tex_iter) + { + const ETextureIndex tex_index = *local_tex_iter; + const LLWearableType::EType wearable_type = LLVOAvatarDictionary::getTEWearableType(tex_index); + const U32 wearable_count = gAgentWearables.getWearableCount(wearable_type); + if (wearable_count > 0) + { + text += LLWearableType::getTypeName(wearable_type) + ":"; + for (U32 wearable_index = 0; wearable_index < wearable_count; wearable_index++) + { + const U32 discard_level = getLocalDiscardLevel(tex_index, wearable_index); + std::string discard_str = llformat("%d ",discard_level); + text += llformat("%d ",discard_level); + } + } + } + text += ")"; + break; } + } + return text; +} + +const std::string LLVOAvatarSelf::debugDumpAllLocalTextureDataInfo() const +{ + std::string text; + const U32 override_tex_discard_level = gSavedSettings.getU32("TextureDiscardLevel"); + for (U32 i = 0; i < mBakedTextureDatas.size(); i++) + { + const LLVOAvatarDictionary::BakedEntry *baked_dict = LLVOAvatarDictionary::getInstance()->getBakedTexture((EBakedTextureIndex)i); + BOOL is_texture_final = TRUE; + for (texture_vec_t::const_iterator local_tex_iter = baked_dict->mLocalTextures.begin(); + local_tex_iter != baked_dict->mLocalTextures.end(); + ++local_tex_iter) + { + const ETextureIndex tex_index = *local_tex_iter; + const LLWearableType::EType wearable_type = LLVOAvatarDictionary::getTEWearableType(tex_index); + const U32 wearable_count = gAgentWearables.getWearableCount(wearable_type); + for (U32 wearable_index = 0; wearable_index < wearable_count; wearable_index++) + { + is_texture_final &= (getLocalDiscardLevel(*local_tex_iter, wearable_index) <= (S32)(override_tex_discard_level)); + } + } + text += llformat("%s:%d ",baked_dict->mName.c_str(),is_texture_final); } - return processFullyLoadedChange(loading); + return text; } -const LLUUID& LLVOAvatarSelf::grabLocalTexture(ETextureIndex type, U32 index) const +const LLUUID& LLVOAvatarSelf::grabBakedTexture(EBakedTextureIndex baked_index) const { - if (canGrabLocalTexture(type, index)) + if (canGrabBakedTexture(baked_index)) { - return getTEImage( type )->getID(); + ETextureIndex tex_index = LLVOAvatarDictionary::bakedToLocalTextureIndex(baked_index); + if (tex_index == TEX_NUM_INDICES) + { + return LLUUID::null; + } + return getTEImage( tex_index )->getID(); } return LLUUID::null; } -BOOL LLVOAvatarSelf::canGrabLocalTexture(ETextureIndex type, U32 index) const +BOOL LLVOAvatarSelf::canGrabBakedTexture(EBakedTextureIndex baked_index) const { + ETextureIndex tex_index = LLVOAvatarDictionary::bakedToLocalTextureIndex(baked_index); + if (tex_index == TEX_NUM_INDICES) + { + return FALSE; + } // Check if the texture hasn't been baked yet. - if (!isTextureDefined(type, index)) + if (!isTextureDefined(tex_index, 0)) { - lldebugs << "getTEImage( " << (U32) type << ", " << index << " )->getID() == IMG_DEFAULT_AVATAR" << llendl; + lldebugs << "getTEImage( " << (U32) tex_index << " )->getID() == IMG_DEFAULT_AVATAR" << llendl; return FALSE; } - if (gAgent.isGodlike()) + if (gAgent.isGodlikeWithoutAdminMenuFakery()) return TRUE; // Check permissions of textures that show up in the // baked texture. We don't want people copying people's // work via baked textures. - /* switch(type) - case TEX_EYES_BAKED: - textures.push_back(TEX_EYES_IRIS); */ - const LLVOAvatarDictionary::TextureEntry *texture_dict = LLVOAvatarDictionary::getInstance()->getTexture(type); - if (!texture_dict->mIsUsedByBakedTexture) return FALSE; - const EBakedTextureIndex baked_index = texture_dict->mBakedTextureIndex; const LLVOAvatarDictionary::BakedEntry *baked_dict = LLVOAvatarDictionary::getInstance()->getBakedTexture(baked_index); for (texture_vec_t::const_iterator iter = baked_dict->mLocalTextures.begin(); iter != baked_dict->mLocalTextures.end(); ++iter) { const ETextureIndex t_index = (*iter); - lldebugs << "Checking index " << (U32) t_index << llendl; - // MULTI-WEARABLE: old method. replace. - const LLUUID& texture_id = getTEImage( t_index )->getID(); - if (texture_id != IMG_DEFAULT_AVATAR) - { - // Search inventory for this texture. - LLViewerInventoryCategory::cat_array_t cats; - LLViewerInventoryItem::item_array_t items; - LLAssetIDMatches asset_id_matches(texture_id); - gInventory.collectDescendentsIf(LLUUID::null, - cats, - items, - LLInventoryModel::INCLUDE_TRASH, - asset_id_matches); - - BOOL can_grab = FALSE; - lldebugs << "item count for asset " << texture_id << ": " << items.count() << llendl; - if (items.count()) + LLWearableType::EType wearable_type = LLVOAvatarDictionary::getTEWearableType(t_index); + U32 count = gAgentWearables.getWearableCount(wearable_type); + lldebugs << "Checking index " << (U32) t_index << " count: " << count << llendl; + + for (U32 wearable_index = 0; wearable_index < count; ++wearable_index) + { + LLWearable *wearable = gAgentWearables.getWearable(wearable_type, wearable_index); + if (wearable) { - // search for full permissions version - for (S32 i = 0; i < items.count(); i++) + const LLLocalTextureObject *texture = wearable->getLocalTextureObject((S32)t_index); + const LLUUID& texture_id = texture->getID(); + if (texture_id != IMG_DEFAULT_AVATAR) { - LLInventoryItem* itemp = items[i]; - LLPermissions item_permissions = itemp->getPermissions(); - if ( item_permissions.allowOperationBy( - PERM_MODIFY, gAgent.getID(), gAgent.getGroupID()) && - item_permissions.allowOperationBy( - PERM_COPY, gAgent.getID(), gAgent.getGroupID()) && - item_permissions.allowOperationBy( - PERM_TRANSFER, gAgent.getID(), gAgent.getGroupID()) ) + // Search inventory for this texture. + LLViewerInventoryCategory::cat_array_t cats; + LLViewerInventoryItem::item_array_t items; + LLAssetIDMatches asset_id_matches(texture_id); + gInventory.collectDescendentsIf(LLUUID::null, + cats, + items, + LLInventoryModel::INCLUDE_TRASH, + asset_id_matches); + + BOOL can_grab = FALSE; + lldebugs << "item count for asset " << texture_id << ": " << items.count() << llendl; + if (items.count()) { - can_grab = TRUE; - break; + // search for full permissions version + for (S32 i = 0; i < items.count(); i++) + { + LLViewerInventoryItem* itemp = items[i]; + if (itemp->getIsFullPerm()) + { + can_grab = TRUE; + break; + } + } } + if (!can_grab) return FALSE; } } - if (!can_grab) return FALSE; } } @@ -1781,7 +2030,11 @@ void LLVOAvatarSelf::addLocalTextureStats( ETextureIndex type, LLViewerFetchedTe F32 desired_pixels; desired_pixels = llmin(mPixelArea, (F32)getTexImageArea()); imagep->setBoostLevel(getAvatarBoostLevel()); + + imagep->resetTextureStats(); + imagep->setResetMaxVirtualSizeFlag(false) ; imagep->addTextureStats( desired_pixels / texel_area_ratio ); + imagep->setAdditionalDecodePriority(1.0f) ; imagep->forceUpdateBindStats() ; if (imagep->getDiscardLevel() < 0) { @@ -1798,7 +2051,7 @@ void LLVOAvatarSelf::addLocalTextureStats( ETextureIndex type, LLViewerFetchedTe LLLocalTextureObject* LLVOAvatarSelf::getLocalTextureObject(LLVOAvatarDefines::ETextureIndex i, U32 wearable_index) const { - EWearableType type = LLVOAvatarDictionary::getInstance()->getTEWearableType(i); + LLWearableType::EType type = LLVOAvatarDictionary::getInstance()->getTEWearableType(i); LLWearable* wearable = gAgentWearables.getWearable(type, wearable_index); if (wearable) { @@ -1853,6 +2106,7 @@ void LLVOAvatarSelf::setNewBakedTexture( ETextureIndex te, const LLUUID& uuid ) const LLVOAvatarDictionary::TextureEntry *texture_dict = LLVOAvatarDictionary::getInstance()->getTexture(te); if (texture_dict->mIsBakedTexture) { + debugBakedTextureUpload(texture_dict->mBakedTextureIndex, TRUE); // FALSE for start of upload, TRUE for finish. llinfos << "New baked texture: " << texture_dict->mName << " UUID: " << uuid <<llendl; } else @@ -1865,6 +2119,76 @@ void LLVOAvatarSelf::setNewBakedTexture( ETextureIndex te, const LLUUID& uuid ) if (!hasPendingBakedUploads()) { gAgent.sendAgentSetAppearance(); + + if (gSavedSettings.getBOOL("DebugAvatarRezTime")) + { + LLSD args; + args["EXISTENCE"] = llformat("%d",(U32)mDebugExistenceTimer.getElapsedTimeF32()); + args["TIME"] = llformat("%d",(U32)mDebugSelfLoadTimer.getElapsedTimeF32()); + if (isAllLocalTextureDataFinal()) + { + LLNotificationsUtil::add("AvatarRezSelfBakedDoneNotification",args); + } + else + { + args["STATUS"] = debugDumpAllLocalTextureDataInfo(); + LLNotificationsUtil::add("AvatarRezSelfBakedUpdateNotification",args); + } + } + + outputRezDiagnostics(); + } +} + +void LLVOAvatarSelf::outputRezDiagnostics() const +{ + const F32 final_time = mDebugSelfLoadTimer.getElapsedTimeF32(); + llinfos << "REZTIME: Myself rez stats:" << llendl; + llinfos << "\t Time from avatar creation to load wearables: " << (S32)mDebugTimeWearablesLoaded << llendl; + llinfos << "\t Time from avatar creation to de-cloud: " << (S32)mDebugTimeAvatarVisible << llendl; + llinfos << "\t Time from avatar creation to de-cloud for others: " << (S32)final_time << llendl; + llinfos << "\t Load time for each texture: " << llendl; + for (U32 i = 0; i < LLVOAvatarDefines::TEX_NUM_INDICES; ++i) + { + std::stringstream out; + out << "\t\t (" << i << ") "; + U32 j=0; + for (j=0; j <= MAX_DISCARD_LEVEL; j++) + { + out << "\t"; + S32 load_time = (S32)mDebugTextureLoadTimes[i][j]; + if (load_time == -1) + { + out << "*"; + if (j == 0) + break; + } + else + { + out << load_time; + } + } + + // Don't print out non-existent textures. + if (j != 0) + llinfos << out.str() << llendl; + } + llinfos << "\t Time points for each upload (start / finish)" << llendl; + for (U32 i = 0; i < LLVOAvatarDefines::BAKED_NUM_INDICES; ++i) + { + llinfos << "\t\t (" << i << ") \t" << (S32)mDebugBakedTextureTimes[i][0] << " / " << (S32)mDebugBakedTextureTimes[i][1] << llendl; + } + + for (LLVOAvatarDefines::LLVOAvatarDictionary::BakedTextures::const_iterator baked_iter = LLVOAvatarDefines::LLVOAvatarDictionary::getInstance()->getBakedTextures().begin(); + baked_iter != LLVOAvatarDefines::LLVOAvatarDictionary::getInstance()->getBakedTextures().end(); + ++baked_iter) + { + const LLVOAvatarDefines::EBakedTextureIndex baked_index = baked_iter->first; + const LLTexLayerSet *layerset = debugGetLayerSet(baked_index); + if (!layerset) continue; + const LLTexLayerSetBuffer *layerset_buffer = layerset->getComposite(); + if (!layerset_buffer) continue; + llinfos << layerset_buffer->dumpTextureInfo() << llendl; } } @@ -1894,9 +2218,7 @@ void LLVOAvatarSelf::processRebakeAvatarTextures(LLMessageSystem* msg, void**) { LLUUID texture_id; msg->getUUID("TextureData", "TextureID", texture_id); - - LLVOAvatarSelf* self = gAgent.getAvatarObject(); - if (!self) return; + if (!isAgentAvatarValid()) return; // If this is a texture corresponding to one of our baked entries, // just rebake that layer set. @@ -1913,13 +2235,13 @@ void LLVOAvatarSelf::processRebakeAvatarTextures(LLMessageSystem* msg, void**) const LLVOAvatarDictionary::TextureEntry *texture_dict = iter->second; if (texture_dict->mIsBakedTexture) { - if (texture_id == self->getTEImage(index)->getID()) + if (texture_id == gAgentAvatarp->getTEImage(index)->getID()) { - LLTexLayerSet* layer_set = self->getLayerSet(index); + LLTexLayerSet* layer_set = gAgentAvatarp->getLayerSet(index); if (layer_set) { llinfos << "TAT: rebake - matched entry " << (S32)index << llendl; - self->invalidateComposite(layer_set, TRUE); + gAgentAvatarp->invalidateComposite(layer_set, TRUE); found = TRUE; LLViewerStats::getInstance()->incStat(LLViewerStats::ST_TEX_REBAKES); } @@ -1930,12 +2252,12 @@ void LLVOAvatarSelf::processRebakeAvatarTextures(LLMessageSystem* msg, void**) // If texture not found, rebake all entries. if (!found) { - self->forceBakeAllTextures(); + gAgentAvatarp->forceBakeAllTextures(); } else { // Not sure if this is necessary, but forceBakeAllTextures() does it. - self->updateMeshTextures(); + gAgentAvatarp->updateMeshTextures(); } } @@ -1966,7 +2288,6 @@ void LLVOAvatarSelf::forceBakeAllTextures(bool slam_for_debug) // Don't know if this is needed updateMeshTextures(); - } //----------------------------------------------------------------------------- @@ -2015,10 +2336,9 @@ void LLVOAvatarSelf::onCustomizeStart() // static void LLVOAvatarSelf::onCustomizeEnd() { - LLVOAvatarSelf *avatarp = gAgent.getAvatarObject(); - if (avatarp) + if (isAgentAvatarValid()) { - avatarp->invalidateAll(); + gAgentAvatarp->invalidateAll(); } } @@ -2187,7 +2507,6 @@ LLGLuint LLVOAvatarSelf::getScratchTexName( LLGLenum format, S32& components, U3 { case GL_LUMINANCE: components = 1; internal_format = GL_LUMINANCE8; break; case GL_ALPHA: components = 1; internal_format = GL_ALPHA8; break; - case GL_COLOR_INDEX: components = 1; internal_format = GL_COLOR_INDEX8_EXT; break; case GL_LUMINANCE_ALPHA: components = 2; internal_format = GL_LUMINANCE8_ALPHA8; break; case GL_RGB: components = 3; internal_format = GL_RGB8; break; case GL_RGBA: components = 4; internal_format = GL_RGBA8; break; diff --git a/indra/newview/llvoavatarself.h b/indra/newview/llvoavatarself.h index dc70996f0b..55b4fd87c8 100644 --- a/indra/newview/llvoavatarself.h +++ b/indra/newview/llvoavatarself.h @@ -39,9 +39,10 @@ struct LocalTextureData; -//------------------------------------------------------------------------ +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // LLVOAvatarSelf -//------------------------------------------------------------------------ +// +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ class LLVOAvatarSelf : public LLVOAvatar { @@ -55,7 +56,8 @@ public: LLVOAvatarSelf(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp); virtual ~LLVOAvatarSelf(); virtual void markDead(); - virtual void initInstance(); // Called after construction to initialize the class. + virtual void initInstance(); // Called after construction to initialize the class. + void cleanup(); protected: /*virtual*/ BOOL loadAvatar(); BOOL loadAvatarSelf(); @@ -77,6 +79,7 @@ protected: //-------------------------------------------------------------------- public: /*virtual*/ void updateRegion(LLViewerRegion *regionp); + /*virtual*/ BOOL idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time); //-------------------------------------------------------------------- // LLCharacter interface and related @@ -120,9 +123,7 @@ public: // Loading state //-------------------------------------------------------------------- public: - /*virtual*/ BOOL updateIsFullyLoaded(); -private: - BOOL mIsBaked; // are the stored baked textures up to date? + /*virtual*/ BOOL getIsCloud(); //-------------------------------------------------------------------- // Region state @@ -176,8 +177,12 @@ public: bool areTexturesCurrent() const; BOOL isLocalTextureDataAvailable(const LLTexLayerSet* layerset) const; BOOL isLocalTextureDataFinal(const LLTexLayerSet* layerset) const; + BOOL isBakedTextureFinal(const LLVOAvatarDefines::EBakedTextureIndex index) const; // If you want to check all textures of a given type, pass gAgentWearables.getWearableCount() for index /*virtual*/ BOOL isTextureDefined(LLVOAvatarDefines::ETextureIndex type, U32 index) const; + /*virtual*/ BOOL isTextureVisible(LLVOAvatarDefines::ETextureIndex type, U32 index = 0) const; + /*virtual*/ BOOL isTextureVisible(LLVOAvatarDefines::ETextureIndex type, LLWearable *wearable) const; + //-------------------------------------------------------------------- // Local Textures @@ -187,8 +192,6 @@ public: LLViewerFetchedTexture* getLocalTextureGL(LLVOAvatarDefines::ETextureIndex type, U32 index) const; const LLUUID& getLocalTextureID(LLVOAvatarDefines::ETextureIndex type, U32 index) const; void setLocalTextureTE(U8 te, LLViewerTexture* image, U32 index); - const LLUUID& grabLocalTexture(LLVOAvatarDefines::ETextureIndex type, U32 index) const; - BOOL canGrabLocalTexture(LLVOAvatarDefines::ETextureIndex type, U32 index) const; /*virtual*/ void setLocalTexture(LLVOAvatarDefines::ETextureIndex type, LLViewerTexture* tex, BOOL baked_version_exits, U32 index); protected: /*virtual*/ void setBakedReady(LLVOAvatarDefines::ETextureIndex type, BOOL baked_version_exists, U32 index); @@ -222,6 +225,7 @@ protected: //-------------------------------------------------------------------- public: void requestLayerSetUploads(); + void requestLayerSetUpload(LLVOAvatarDefines::EBakedTextureIndex i); void requestLayerSetUpdate(LLVOAvatarDefines::ETextureIndex i); LLTexLayerSet* getLayerSet(LLVOAvatarDefines::ETextureIndex index) const; @@ -231,10 +235,16 @@ public: public: /* virtual */ void invalidateComposite(LLTexLayerSet* layerset, BOOL upload_result); /* virtual */ void invalidateAll(); - /* virtual */ void setCompositeUpdatesEnabled(BOOL b); // only works for self + /* virtual */ void setCompositeUpdatesEnabled(bool b); // only works for self + /* virtual */ void setCompositeUpdatesEnabled(U32 index, bool b); + /* virtual */ bool isCompositeUpdateEnabled(U32 index); void setupComposites(); void updateComposites(); + const LLUUID& grabBakedTexture(LLVOAvatarDefines::EBakedTextureIndex baked_index) const; + BOOL canGrabBakedTexture(LLVOAvatarDefines::EBakedTextureIndex baked_index) const; + + //-------------------------------------------------------------------- // Scratch textures (used for compositing) //-------------------------------------------------------------------- @@ -269,8 +279,8 @@ protected: **/ public: - /*virtual*/ BOOL isWearingWearableType(EWearableType type) const; - void wearableUpdated(EWearableType type, BOOL upload_result); + /*virtual*/ BOOL isWearingWearableType(LLWearableType::EType type) const; + void wearableUpdated(LLWearableType::EType type, BOOL upload_result); protected: U32 getNumWearables(LLVOAvatarDefines::ETextureIndex i) const; @@ -319,15 +329,54 @@ public: ** DIAGNOSTICS **/ + //-------------------------------------------------------------------- + // General + //-------------------------------------------------------------------- public: static void dumpTotalLocalTextureByteCount(); void dumpLocalTextures() const; static void dumpScratchTextureByteCount(); + //-------------------------------------------------------------------- + // Avatar Rez Metrics + //-------------------------------------------------------------------- +public: + struct LLAvatarTexData + { + LLAvatarTexData(const LLUUID& id, LLVOAvatarDefines::ETextureIndex index) : + mAvatarID(id), + mIndex(index) + {} + LLUUID mAvatarID; + LLVOAvatarDefines::ETextureIndex mIndex; + }; + void debugWearablesLoaded() { mDebugTimeWearablesLoaded = mDebugSelfLoadTimer.getElapsedTimeF32(); } + void debugAvatarVisible() { mDebugTimeAvatarVisible = mDebugSelfLoadTimer.getElapsedTimeF32(); } + void outputRezDiagnostics() const; + void debugBakedTextureUpload(LLVOAvatarDefines::EBakedTextureIndex index, BOOL finished); + static void debugOnTimingLocalTexLoaded(BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata); + + BOOL isAllLocalTextureDataFinal() const; + + const LLTexLayerSet* debugGetLayerSet(LLVOAvatarDefines::EBakedTextureIndex index) const { return mBakedTextureDatas[index].mTexLayerSet; } + const std::string debugDumpLocalTextureDataInfo(const LLTexLayerSet* layerset) const; // Lists out state of this particular baked texture layer + const std::string debugDumpAllLocalTextureDataInfo() const; // Lists out which baked textures are at highest LOD +private: + LLFrameTimer mDebugSelfLoadTimer; + F32 mDebugTimeWearablesLoaded; + F32 mDebugTimeAvatarVisible; + F32 mDebugTextureLoadTimes[LLVOAvatarDefines::TEX_NUM_INDICES][MAX_DISCARD_LEVEL+1]; // load time for each texture at each discard level + F32 mDebugBakedTextureTimes[LLVOAvatarDefines::BAKED_NUM_INDICES][2]; // time to start upload and finish upload of each baked texture + void debugTimingLocalTexLoaded(BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata); + /** Diagnostics ** ** *******************************************************************************/ }; +extern LLVOAvatarSelf *gAgentAvatarp; + +BOOL isAgentAvatarValid(); + #endif // LL_VO_AVATARSELF_H diff --git a/indra/newview/llvoclouds.cpp b/indra/newview/llvoclouds.cpp index 177cb16c50..5153cef709 100644 --- a/indra/newview/llvoclouds.cpp +++ b/indra/newview/llvoclouds.cpp @@ -77,9 +77,11 @@ BOOL LLVOClouds::isActive() const return TRUE; } - BOOL LLVOClouds::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) { + static LLFastTimer::DeclareTimer ftm("Idle Clouds"); + LLFastTimer t(ftm); + if (!(gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_CLOUDS))) { return TRUE; diff --git a/indra/newview/llvograss.cpp b/indra/newview/llvograss.cpp index e311f07912..a82afbeb76 100644 --- a/indra/newview/llvograss.cpp +++ b/indra/newview/llvograss.cpp @@ -37,7 +37,7 @@ #include "imageids.h" #include "llviewercontrol.h" -#include "llagent.h" +#include "llagentcamera.h" #include "llnotificationsutil.h" #include "lldrawable.h" #include "llface.h" @@ -306,7 +306,7 @@ BOOL LLVOGrass::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) void LLVOGrass::setPixelAreaAndAngle(LLAgent &agent) { // This should be the camera's center, as soon as we move to all region-local. - LLVector3 relative_position = getPositionAgent() - agent.getCameraPositionAgent(); + LLVector3 relative_position = getPositionAgent() - gAgentCamera.getCameraPositionAgent(); F32 range = relative_position.length(); F32 max_scale = getMaxScale(); diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp index bb09a18cc3..070663e22f 100644 --- a/indra/newview/llvoicechannel.cpp +++ b/indra/newview/llvoicechannel.cpp @@ -72,9 +72,9 @@ private: void LLVoiceCallCapResponder::error(U32 status, const std::string& reason) { - llwarns << "LLVoiceCallCapResponder::error(" + LL_WARNS("Voice") << "LLVoiceCallCapResponder::error(" << status << ": " << reason << ")" - << llendl; + << LL_ENDL; LLVoiceChannel* channelp = LLVoiceChannel::getChannelByID(mSessionID); if ( channelp ) { @@ -104,8 +104,8 @@ void LLVoiceCallCapResponder::result(const LLSD& content) LLSD::map_const_iterator iter; for(iter = content.beginMap(); iter != content.endMap(); ++iter) { - llinfos << "LLVoiceCallCapResponder::result got " - << iter->first << llendl; + LL_DEBUGS("Voice") << "LLVoiceCallCapResponder::result got " + << iter->first << LL_ENDL; } channelp->setChannelInfo( @@ -122,7 +122,8 @@ LLVoiceChannel::LLVoiceChannel(const LLUUID& session_id, const std::string& sess mState(STATE_NO_CHANNEL_INFO), mSessionName(session_name), mCallDirection(OUTGOING_CALL), - mIgnoreNextSessionLeave(FALSE) + mIgnoreNextSessionLeave(FALSE), + mCallEndedByAgent(false) { mNotifyArgs["VOICE_CHANNEL_NAME"] = mSessionName; @@ -130,18 +131,16 @@ LLVoiceChannel::LLVoiceChannel(const LLUUID& session_id, const std::string& sess { // a voice channel already exists for this session id, so this instance will be orphaned // the end result should simply be the failure to make voice calls - llwarns << "Duplicate voice channels registered for session_id " << session_id << llendl; + LL_WARNS("Voice") << "Duplicate voice channels registered for session_id " << session_id << LL_ENDL; } - - LLVoiceClient::getInstance()->addObserver(this); } LLVoiceChannel::~LLVoiceChannel() { - // Don't use LLVoiceClient::getInstance() here -- this can get called during atexit() time and that singleton MAY have already been destroyed. - if(gVoiceClient) + // Must check instance exists here, the singleton MAY have already been destroyed. + if(LLVoiceClient::instanceExists()) { - gVoiceClient->removeObserver(this); + LLVoiceClient::getInstance()->removeObserver(this); } sVoiceChannelMap.erase(mSessionID); @@ -161,13 +160,13 @@ void LLVoiceChannel::setChannelInfo( if (mURI.empty()) { LLNotificationsUtil::add("VoiceChannelJoinFailed", mNotifyArgs); - llwarns << "Received empty URI for channel " << mSessionName << llendl; + LL_WARNS("Voice") << "Received empty URI for channel " << mSessionName << LL_ENDL; deactivate(); } else if (mCredentials.empty()) { LLNotificationsUtil::add("VoiceChannelJoinFailed", mNotifyArgs); - llwarns << "Received empty credentials for channel " << mSessionName << llendl; + LL_WARNS("Voice") << "Received empty credentials for channel " << mSessionName << LL_ENDL; deactivate(); } else @@ -282,13 +281,14 @@ void LLVoiceChannel::deactivate() //Default mic is OFF when leaving voice calls if (gSavedSettings.getBOOL("AutoDisengageMic") && sCurrentVoiceChannel == this && - gVoiceClient->getUserPTTState()) + LLVoiceClient::getInstance()->getUserPTTState()) { gSavedSettings.setBOOL("PTTCurrentlyEnabled", true); - gVoiceClient->inputUserControlState(true); + LLVoiceClient::getInstance()->inputUserControlState(true); } } - + LLVoiceClient::getInstance()->removeObserver(this); + if (sCurrentVoiceChannel == this) { // default channel is proximal channel @@ -328,7 +328,9 @@ void LLVoiceChannel::activate() { setState(STATE_CALL_STARTED); } - + + LLVoiceClient::getInstance()->addObserver(this); + //do not send earlier, channel should be initialized, should not be in STATE_NO_CHANNEL_INFO state sCurrentVoiceChannelChangedSignal(this->mSessionID); } @@ -370,6 +372,11 @@ LLVoiceChannel* LLVoiceChannel::getChannelByURI(std::string uri) } } +LLVoiceChannel* LLVoiceChannel::getCurrentVoiceChannel() +{ + return sCurrentVoiceChannel; +} + void LLVoiceChannel::updateSessionID(const LLUUID& new_session_id) { sVoiceChannelMap.erase(sVoiceChannelMap.find(mSessionID)); @@ -412,7 +419,7 @@ void LLVoiceChannel::doSetState(const EState& new_state) EState old_state = mState; mState = new_state; if (!mStateChangedCallback.empty()) - mStateChangedCallback(old_state, mState, mCallDirection); + mStateChangedCallback(old_state, mState, mCallDirection, mCallEndedByAgent); } //static @@ -421,7 +428,6 @@ void LLVoiceChannel::initClass() sCurrentVoiceChannel = LLVoiceChannelProximal::getInstance(); } - //static void LLVoiceChannel::suspend() { @@ -437,7 +443,7 @@ void LLVoiceChannel::resume() { if (sSuspended) { - if (gVoiceClient->voiceEnabled()) + if (LLVoiceClient::getInstance()->voiceEnabled()) { if (sSuspendedVoiceChannel) { @@ -507,9 +513,9 @@ void LLVoiceChannelGroup::activate() #endif //Mic default state is OFF on initiating/joining Ad-Hoc/Group calls - if (gVoiceClient->getUserPTTState() && gVoiceClient->getPTTIsToggle()) + if (LLVoiceClient::getInstance()->getUserPTTState() && LLVoiceClient::getInstance()->getPTTIsToggle()) { - gVoiceClient->inputUserControlState(true); + LLVoiceClient::getInstance()->inputUserControlState(true); } } @@ -556,7 +562,7 @@ void LLVoiceChannelGroup::setChannelInfo( else { //*TODO: notify user - llwarns << "Received invalid credentials for channel " << mSessionName << llendl; + LL_WARNS("Voice") << "Received invalid credentials for channel " << mSessionName << LL_ENDL; deactivate(); } } @@ -655,7 +661,6 @@ void LLVoiceChannelGroup::setState(EState state) LLVoiceChannelProximal::LLVoiceChannelProximal() : LLVoiceChannel(LLUUID::null, LLStringUtil::null) { - activate(); } BOOL LLVoiceChannelProximal::isActive() @@ -667,13 +672,13 @@ void LLVoiceChannelProximal::activate() { if (callStarted()) return; - LLVoiceChannel::activate(); - - if (callStarted()) + if((LLVoiceChannel::sCurrentVoiceChannel != this) && (LLVoiceChannel::getState() == STATE_CONNECTED)) { - // this implicitly puts you back in the spatial channel - LLVoiceClient::getInstance()->leaveNonSpatialChannel(); + // we're connected to a non-spatial channel, so disconnect. + LLVoiceClient::getInstance()->leaveNonSpatialChannel(); } + LLVoiceChannel::activate(); + } void LLVoiceChannelProximal::onChange(EStatusType type, const std::string &channelURI, bool proximal) @@ -703,7 +708,7 @@ void LLVoiceChannelProximal::handleStatusChange(EStatusType status) return; case STATUS_VOICE_DISABLED: //skip showing "Voice not available at your current location" when agent voice is disabled (EXT-4749) - if(LLVoiceClient::voiceEnabled() && gVoiceClient->voiceWorking()) + if(LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking()) { //TODO: remove or redirect this call status notification // LLCallInfoDialog::show("unavailable", mNotifyArgs); @@ -763,7 +768,7 @@ LLVoiceChannelP2P::LLVoiceChannelP2P(const LLUUID& session_id, const std::string void LLVoiceChannelP2P::handleStatusChange(EStatusType type) { - llinfos << "P2P CALL CHANNEL STATUS CHANGE: incoming=" << int(mReceivedCall) << " newstatus=" << LLVoiceClientStatusObserver::status2string(type) << " (mState=" << mState << ")" << llendl; + LL_INFOS("Voice") << "P2P CALL CHANNEL STATUS CHANGE: incoming=" << int(mReceivedCall) << " newstatus=" << LLVoiceClientStatusObserver::status2string(type) << " (mState=" << mState << ")" << LL_ENDL; // status updates switch(type) @@ -779,12 +784,19 @@ void LLVoiceChannelP2P::handleStatusChange(EStatusType type) } else { - // other user hung up + // other user hung up, so we didn't end the call + mCallEndedByAgent = false; } deactivate(); } mIgnoreNextSessionLeave = FALSE; return; + case STATUS_JOINING: + // because we join session we expect to process session leave event in the future. EXT-7371 + // may be this should be done in the LLVoiceChannel::handleStatusChange. + mIgnoreNextSessionLeave = FALSE; + break; + default: break; } @@ -810,6 +822,9 @@ void LLVoiceChannelP2P::activate() { if (callStarted()) return; + //call will be counted as ended by user unless this variable is changed in handleStatusChange() + mCallEndedByAgent = true; + LLVoiceChannel::activate(); if (callStarted()) @@ -833,9 +848,9 @@ void LLVoiceChannelP2P::activate() LLRecentPeople::instance().add(mOtherUserID); //Default mic is ON on initiating/joining P2P calls - if (!gVoiceClient->getUserPTTState() && gVoiceClient->getPTTIsToggle()) + if (!LLVoiceClient::getInstance()->getUserPTTState() && LLVoiceClient::getInstance()->getPTTIsToggle()) { - gVoiceClient->inputUserControlState(true); + LLVoiceClient::getInstance()->inputUserControlState(true); } } } @@ -882,9 +897,9 @@ void LLVoiceChannelP2P::setSessionHandle(const std::string& handle, const std::s else { LL_WARNS("Voice") << "incoming SIP URL is not provided. Channel may not work properly." << LL_ENDL; - // In case of incoming AvaLine call generated URI will be differ from original one. - // This is because Avatar-2-Avatar URI is based on avatar UUID but Avaline is not. - // See LLVoiceClient::sessionAddedEvent() -> setUUIDFromStringHash() + // In the case of an incoming AvaLine call, the generated URI will be different from the + // original one. This is because the P2P URI is based on avatar UUID but Avaline is not. + // See LLVoiceClient::sessionAddedEvent() setURI(LLVoiceClient::getInstance()->sipURIFromID(mOtherUserID)); } @@ -898,7 +913,7 @@ void LLVoiceChannelP2P::setSessionHandle(const std::string& handle, const std::s void LLVoiceChannelP2P::setState(EState state) { - llinfos << "P2P CALL STATE CHANGE: incoming=" << int(mReceivedCall) << " oldstate=" << mState << " newstate=" << state << llendl; + LL_INFOS("Voice") << "P2P CALL STATE CHANGE: incoming=" << int(mReceivedCall) << " oldstate=" << mState << " newstate=" << state << LL_ENDL; if (mReceivedCall) // incoming call { diff --git a/indra/newview/llvoicechannel.h b/indra/newview/llvoicechannel.h index cb86671305..074f9b8bba 100644 --- a/indra/newview/llvoicechannel.h +++ b/indra/newview/llvoicechannel.h @@ -58,7 +58,7 @@ public: OUTGOING_CALL } EDirection; - typedef boost::signals2::signal<void(const EState& old_state, const EState& new_state, const EDirection& direction)> state_changed_signal_t; + typedef boost::signals2::signal<void(const EState& old_state, const EState& new_state, const EDirection& direction, bool ended_by_agent)> state_changed_signal_t; // on current channel changed signal typedef boost::function<void(const LLUUID& session_id)> channel_changed_callback_t; @@ -98,7 +98,8 @@ public: static LLVoiceChannel* getChannelByID(const LLUUID& session_id); static LLVoiceChannel* getChannelByURI(std::string uri); - static LLVoiceChannel* getCurrentVoiceChannel() { return sCurrentVoiceChannel; } + static LLVoiceChannel* getCurrentVoiceChannel(); + static void initClass(); static void suspend(); @@ -112,7 +113,7 @@ protected: void doSetState(const EState& state); void setURI(std::string uri); - // there can be two directions ICOMING and OUTGOING + // there can be two directions INCOMING and OUTGOING EDirection mCallDirection; std::string mURI; @@ -122,6 +123,8 @@ protected: std::string mSessionName; LLSD mNotifyArgs; LLSD mCallDialogPayload; + // true if call was ended by agent + bool mCallEndedByAgent; BOOL mIgnoreNextSessionLeave; LLHandle<LLPanel> mLoginNotificationHandle; diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp index f3bfc2e86c..e8635d7f1a 100644 --- a/indra/newview/llvoiceclient.cpp +++ b/indra/newview/llvoiceclient.cpp @@ -1,6 +1,6 @@ /** * @file llvoiceclient.cpp - * @brief Implementation of LLVoiceClient class which is the interface to the voice client process. + * @brief Voice client delegation class implementation. * * $LicenseInfo:firstyear=2001&license=viewergpl$ * @@ -17,8 +17,7 @@ * There are special exceptions to the terms and conditions of the GPL as * it is applied to this Source Code. View the full text of the exception * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception * * By copying, modifying or distributing this software, you acknowledge * that you have read and understood your obligations described above, @@ -32,5304 +31,348 @@ #include "llviewerprecompiledheaders.h" #include "llvoiceclient.h" - -#include <boost/tokenizer.hpp> - -// library includes -#include "llnotificationsutil.h" -#include "llsdserialize.h" -#include "llsdutil.h" - - -// project includes -#include "llvoavatar.h" -#include "llbufferstream.h" -#include "llfile.h" -#ifdef LL_STANDALONE -# include "expat.h" -#else -# include "expat/expat.h" -#endif -#include "llcallbacklist.h" -#include "llcallingcard.h" // for LLFriendObserver -#include "llviewerregion.h" -#include "llviewernetwork.h" // for gGridChoice -#include "llbase64.h" #include "llviewercontrol.h" -#include "llkeyboard.h" -#include "llappviewer.h" // for gDisconnected, gDisableVoice -#include "llmutelist.h" // to check for muted avatars -#include "llagent.h" -#include "llcachename.h" -#include "llimview.h" // for LLIMMgr -#include "llparcel.h" -#include "llviewerparcelmgr.h" -//#include "llfirstuse.h" -#include "llspeakers.h" -#include "lltrans.h" #include "llviewerwindow.h" -#include "llviewercamera.h" -#include "llvoavatarself.h" -#include "llvoicechannel.h" - -// for base64 decoding -#include "apr_base64.h" - -// for SHA1 hash -#include "apr_sha1.h" - -// for MD5 hash -#include "llmd5.h" - -#define USE_SESSION_GROUPS 0 - -static bool sConnectingToAgni = false; -F32 LLVoiceClient::OVERDRIVEN_POWER_LEVEL = 0.7f; - -const F32 SPEAKING_TIMEOUT = 1.f; - -const int VOICE_MAJOR_VERSION = 1; -const int VOICE_MINOR_VERSION = 0; - -LLVoiceClient *gVoiceClient = NULL; - -// Don't retry connecting to the daemon more frequently than this: -const F32 CONNECT_THROTTLE_SECONDS = 1.0f; - -// Don't send positional updates more frequently than this: -const F32 UPDATE_THROTTLE_SECONDS = 0.1f; - -const F32 LOGIN_RETRY_SECONDS = 10.0f; -const int MAX_LOGIN_RETRIES = 12; - -static void setUUIDFromStringHash(LLUUID &uuid, const std::string &str) -{ - LLMD5 md5_uuid; - md5_uuid.update((const unsigned char*)str.data(), str.size()); - md5_uuid.finalize(); - md5_uuid.raw_digest(uuid.mData); -} - -static int scale_mic_volume(float volume) -{ - // incoming volume has the range [0.0 ... 2.0], with 1.0 as the default. - // Map it to Vivox levels as follows: 0.0 -> 30, 1.0 -> 50, 2.0 -> 70 - return 30 + (int)(volume * 20.0f); -} - -static int scale_speaker_volume(float volume) -{ - // incoming volume has the range [0.0 ... 1.0], with 0.5 as the default. - // Map it to Vivox levels as follows: 0.0 -> 30, 0.5 -> 50, 1.0 -> 70 - return 30 + (int)(volume * 40.0f); -} - -class LLViewerVoiceAccountProvisionResponder : - public LLHTTPClient::Responder -{ -public: - LLViewerVoiceAccountProvisionResponder(int retries) - { - mRetries = retries; - } +#include "llvoicevivox.h" +#include "llviewernetwork.h" +#include "llcommandhandler.h" +#include "llhttpnode.h" +#include "llnotificationsutil.h" +#include "llsdserialize.h" +#include "llui.h" - virtual void error(U32 status, const std::string& reason) - { - if ( mRetries > 0 ) - { - LL_WARNS("Voice") << "ProvisionVoiceAccountRequest returned an error, retrying. status = " << status << ", reason = \"" << reason << "\"" << LL_ENDL; - if ( gVoiceClient ) gVoiceClient->requestVoiceAccountProvision( - mRetries - 1); - } - else - { - LL_WARNS("Voice") << "ProvisionVoiceAccountRequest returned an error, too many retries (giving up). status = " << status << ", reason = \"" << reason << "\"" << LL_ENDL; - if ( gVoiceClient ) gVoiceClient->giveUp(); - } - } +const F32 LLVoiceClient::OVERDRIVEN_POWER_LEVEL = 0.7f; - virtual void result(const LLSD& content) - { - if ( gVoiceClient ) - { - std::string voice_sip_uri_hostname; - std::string voice_account_server_uri; - - LL_DEBUGS("Voice") << "ProvisionVoiceAccountRequest response:" << ll_pretty_print_sd(content) << LL_ENDL; - - if(content.has("voice_sip_uri_hostname")) - voice_sip_uri_hostname = content["voice_sip_uri_hostname"].asString(); - - // this key is actually misnamed -- it will be an entire URI, not just a hostname. - if(content.has("voice_account_server_name")) - voice_account_server_uri = content["voice_account_server_name"].asString(); - - gVoiceClient->login( - content["username"].asString(), - content["password"].asString(), - voice_sip_uri_hostname, - voice_account_server_uri); - } - } +const F32 LLVoiceClient::VOLUME_MIN = 0.f; +const F32 LLVoiceClient::VOLUME_DEFAULT = 0.5f; +const F32 LLVoiceClient::VOLUME_MAX = 1.0f; -private: - int mRetries; -}; -/** - * @class LLVivoxProtocolParser - * @brief This class helps construct new LLIOPipe specializations - * @see LLIOPipe - * - * THOROUGH_DESCRIPTION - */ -class LLVivoxProtocolParser : public LLIOPipe +// Support for secondlife:///app/voice SLapps +class LLVoiceHandler : public LLCommandHandler { - LOG_CLASS(LLVivoxProtocolParser); public: - LLVivoxProtocolParser(); - virtual ~LLVivoxProtocolParser(); - -protected: - /* @name LLIOPipe virtual implementations - */ - //@{ - /** - * @brief Process the data in buffer - */ - virtual EStatus process_impl( - const LLChannelDescriptors& channels, - buffer_ptr_t& buffer, - bool& eos, - LLSD& context, - LLPumpIO* pump); - //@} - - std::string mInput; - - // Expat control members - XML_Parser parser; - int responseDepth; - bool ignoringTags; - bool isEvent; - int ignoreDepth; - - // Members for processing responses. The values are transient and only valid within a call to processResponse(). - bool squelchDebugOutput; - int returnCode; - int statusCode; - std::string statusString; - std::string requestId; - std::string actionString; - std::string connectorHandle; - std::string versionID; - std::string accountHandle; - std::string sessionHandle; - std::string sessionGroupHandle; - std::string alias; - std::string applicationString; - - // Members for processing events. The values are transient and only valid within a call to processResponse(). - std::string eventTypeString; - int state; - std::string uriString; - bool isChannel; - bool incoming; - bool enabled; - std::string nameString; - std::string audioMediaString; - std::string displayNameString; - std::string deviceString; - int participantType; - bool isLocallyMuted; - bool isModeratorMuted; - bool isSpeaking; - int volume; - F32 energy; - std::string messageHeader; - std::string messageBody; - std::string notificationType; - bool hasText; - bool hasAudio; - bool hasVideo; - bool terminated; - std::string blockMask; - std::string presenceOnly; - std::string autoAcceptMask; - std::string autoAddAsBuddy; - int numberOfAliases; - std::string subscriptionHandle; - std::string subscriptionType; - - - // Members for processing text between tags - std::string textBuffer; - bool accumulateText; - - void reset(); - - void processResponse(std::string tag); - -static void XMLCALL ExpatStartTag(void *data, const char *el, const char **attr); -static void XMLCALL ExpatEndTag(void *data, const char *el); -static void XMLCALL ExpatCharHandler(void *data, const XML_Char *s, int len); - - void StartTag(const char *tag, const char **attr); - void EndTag(const char *tag); - void CharData(const char *buffer, int length); - -}; - -LLVivoxProtocolParser::LLVivoxProtocolParser() -{ - parser = NULL; - parser = XML_ParserCreate(NULL); - - reset(); -} + // requests will be throttled from a non-trusted browser + LLVoiceHandler() : LLCommandHandler("voice", UNTRUSTED_THROTTLE) {} -void LLVivoxProtocolParser::reset() -{ - responseDepth = 0; - ignoringTags = false; - accumulateText = false; - energy = 0.f; - hasText = false; - hasAudio = false; - hasVideo = false; - terminated = false; - ignoreDepth = 0; - isChannel = false; - incoming = false; - enabled = false; - isEvent = false; - isLocallyMuted = false; - isModeratorMuted = false; - isSpeaking = false; - participantType = 0; - squelchDebugOutput = false; - returnCode = -1; - state = 0; - statusCode = 0; - volume = 0; - textBuffer.clear(); - alias.clear(); - numberOfAliases = 0; - applicationString.clear(); -} - -//virtual -LLVivoxProtocolParser::~LLVivoxProtocolParser() -{ - if (parser) - XML_ParserFree(parser); -} - -// virtual -LLIOPipe::EStatus LLVivoxProtocolParser::process_impl( - const LLChannelDescriptors& channels, - buffer_ptr_t& buffer, - bool& eos, - LLSD& context, - LLPumpIO* pump) -{ - LLBufferStream istr(channels, buffer.get()); - std::ostringstream ostr; - while (istr.good()) + bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web) { - char buf[1024]; - istr.read(buf, sizeof(buf)); - mInput.append(buf, istr.gcount()); - } - - // Look for input delimiter(s) in the input buffer. If one is found, send the message to the xml parser. - int start = 0; - int delim; - while((delim = mInput.find("\n\n\n", start)) != std::string::npos) - { - - // Reset internal state of the LLVivoxProtocolParser (no effect on the expat parser) - reset(); - - XML_ParserReset(parser, NULL); - XML_SetElementHandler(parser, ExpatStartTag, ExpatEndTag); - XML_SetCharacterDataHandler(parser, ExpatCharHandler); - XML_SetUserData(parser, this); - XML_Parse(parser, mInput.data() + start, delim - start, false); - - // If this message isn't set to be squelched, output the raw XML received. - if(!squelchDebugOutput) + if (params[0].asString() == "effects") { - LL_DEBUGS("Voice") << "parsing: " << mInput.substr(start, delim - start) << LL_ENDL; - } - - start = delim + 3; - } - - if(start != 0) - mInput = mInput.substr(start); - - LL_DEBUGS("VivoxProtocolParser") << "at end, mInput is: " << mInput << LL_ENDL; - - if(!gVoiceClient->mConnected) - { - // If voice has been disabled, we just want to close the socket. This does so. - LL_INFOS("Voice") << "returning STATUS_STOP" << LL_ENDL; - return STATUS_STOP; - } - - return STATUS_OK; -} - -void XMLCALL LLVivoxProtocolParser::ExpatStartTag(void *data, const char *el, const char **attr) -{ - if (data) - { - LLVivoxProtocolParser *object = (LLVivoxProtocolParser*)data; - object->StartTag(el, attr); - } -} - -// -------------------------------------------------------------------------------- - -void XMLCALL LLVivoxProtocolParser::ExpatEndTag(void *data, const char *el) -{ - if (data) - { - LLVivoxProtocolParser *object = (LLVivoxProtocolParser*)data; - object->EndTag(el); - } -} - -// -------------------------------------------------------------------------------- - -void XMLCALL LLVivoxProtocolParser::ExpatCharHandler(void *data, const XML_Char *s, int len) -{ - if (data) - { - LLVivoxProtocolParser *object = (LLVivoxProtocolParser*)data; - object->CharData(s, len); - } -} - -// -------------------------------------------------------------------------------- - - -void LLVivoxProtocolParser::StartTag(const char *tag, const char **attr) -{ - // Reset the text accumulator. We shouldn't have strings that are inturrupted by new tags - textBuffer.clear(); - // only accumulate text if we're not ignoring tags. - accumulateText = !ignoringTags; - - if (responseDepth == 0) - { - isEvent = !stricmp("Event", tag); - - if (!stricmp("Response", tag) || isEvent) - { - // Grab the attributes - while (*attr) + LLVoiceEffectInterface* effect_interface = LLVoiceClient::instance().getVoiceEffectInterface(); + // If the voice client doesn't support voice effects, we can't handle effects SLapps + if (!effect_interface) { - const char *key = *attr++; - const char *value = *attr++; - - if (!stricmp("requestId", key)) - { - requestId = value; - } - else if (!stricmp("action", key)) - { - actionString = value; - } - else if (!stricmp("type", key)) - { - eventTypeString = value; - } + return false; } - } - LL_DEBUGS("VivoxProtocolParser") << tag << " (" << responseDepth << ")" << LL_ENDL; - } - else - { - if (ignoringTags) - { - LL_DEBUGS("VivoxProtocolParser") << "ignoring tag " << tag << " (depth = " << responseDepth << ")" << LL_ENDL; - } - else - { - LL_DEBUGS("VivoxProtocolParser") << tag << " (" << responseDepth << ")" << LL_ENDL; - - // Ignore the InputXml stuff so we don't get confused - if (!stricmp("InputXml", tag)) - { - ignoringTags = true; - ignoreDepth = responseDepth; - accumulateText = false; - LL_DEBUGS("VivoxProtocolParser") << "starting ignore, ignoreDepth is " << ignoreDepth << LL_ENDL; - } - else if (!stricmp("CaptureDevices", tag)) - { - gVoiceClient->clearCaptureDevices(); - } - else if (!stricmp("RenderDevices", tag)) - { - gVoiceClient->clearRenderDevices(); - } - else if (!stricmp("CaptureDevice", tag)) - { - deviceString.clear(); - } - else if (!stricmp("RenderDevice", tag)) - { - deviceString.clear(); - } - else if (!stricmp("Buddies", tag)) + // Support secondlife:///app/voice/effects/refresh to update the voice effect list with new effects + if (params[1].asString() == "refresh") { - gVoiceClient->deleteAllBuddies(); + effect_interface->refreshVoiceEffectLists(false); + return true; } - else if (!stricmp("BlockRules", tag)) - { - gVoiceClient->deleteAllBlockRules(); - } - else if (!stricmp("AutoAcceptRules", tag)) - { - gVoiceClient->deleteAllAutoAcceptRules(); - } - - } - } - responseDepth++; -} - -// -------------------------------------------------------------------------------- - -void LLVivoxProtocolParser::EndTag(const char *tag) -{ - const std::string& string = textBuffer; - - responseDepth--; - - if (ignoringTags) - { - if (ignoreDepth == responseDepth) - { - LL_DEBUGS("VivoxProtocolParser") << "end of ignore" << LL_ENDL; - ignoringTags = false; - } - else - { - LL_DEBUGS("VivoxProtocolParser") << "ignoring tag " << tag << " (depth = " << responseDepth << ")" << LL_ENDL; - } - } - - if (!ignoringTags) - { - LL_DEBUGS("VivoxProtocolParser") << "processing tag " << tag << " (depth = " << responseDepth << ")" << LL_ENDL; - - // Closing a tag. Finalize the text we've accumulated and reset - if (!stricmp("ReturnCode", tag)) - returnCode = strtol(string.c_str(), NULL, 10); - else if (!stricmp("SessionHandle", tag)) - sessionHandle = string; - else if (!stricmp("SessionGroupHandle", tag)) - sessionGroupHandle = string; - else if (!stricmp("StatusCode", tag)) - statusCode = strtol(string.c_str(), NULL, 10); - else if (!stricmp("StatusString", tag)) - statusString = string; - else if (!stricmp("ParticipantURI", tag)) - uriString = string; - else if (!stricmp("Volume", tag)) - volume = strtol(string.c_str(), NULL, 10); - else if (!stricmp("Energy", tag)) - energy = (F32)strtod(string.c_str(), NULL); - else if (!stricmp("IsModeratorMuted", tag)) - isModeratorMuted = !stricmp(string.c_str(), "true"); - else if (!stricmp("IsSpeaking", tag)) - isSpeaking = !stricmp(string.c_str(), "true"); - else if (!stricmp("Alias", tag)) - alias = string; - else if (!stricmp("NumberOfAliases", tag)) - numberOfAliases = strtol(string.c_str(), NULL, 10); - else if (!stricmp("Application", tag)) - applicationString = string; - else if (!stricmp("ConnectorHandle", tag)) - connectorHandle = string; - else if (!stricmp("VersionID", tag)) - versionID = string; - else if (!stricmp("AccountHandle", tag)) - accountHandle = string; - else if (!stricmp("State", tag)) - state = strtol(string.c_str(), NULL, 10); - else if (!stricmp("URI", tag)) - uriString = string; - else if (!stricmp("IsChannel", tag)) - isChannel = !stricmp(string.c_str(), "true"); - else if (!stricmp("Incoming", tag)) - incoming = !stricmp(string.c_str(), "true"); - else if (!stricmp("Enabled", tag)) - enabled = !stricmp(string.c_str(), "true"); - else if (!stricmp("Name", tag)) - nameString = string; - else if (!stricmp("AudioMedia", tag)) - audioMediaString = string; - else if (!stricmp("ChannelName", tag)) - nameString = string; - else if (!stricmp("DisplayName", tag)) - displayNameString = string; - else if (!stricmp("Device", tag)) - deviceString = string; - else if (!stricmp("AccountName", tag)) - nameString = string; - else if (!stricmp("ParticipantType", tag)) - participantType = strtol(string.c_str(), NULL, 10); - else if (!stricmp("IsLocallyMuted", tag)) - isLocallyMuted = !stricmp(string.c_str(), "true"); - else if (!stricmp("MicEnergy", tag)) - energy = (F32)strtod(string.c_str(), NULL); - else if (!stricmp("ChannelName", tag)) - nameString = string; - else if (!stricmp("ChannelURI", tag)) - uriString = string; - else if (!stricmp("BuddyURI", tag)) - uriString = string; - else if (!stricmp("Presence", tag)) - statusString = string; - else if (!stricmp("CaptureDevice", tag)) - { - gVoiceClient->addCaptureDevice(deviceString); - } - else if (!stricmp("RenderDevice", tag)) - { - gVoiceClient->addRenderDevice(deviceString); - } - else if (!stricmp("Buddy", tag)) - { - gVoiceClient->processBuddyListEntry(uriString, displayNameString); - } - else if (!stricmp("BlockRule", tag)) - { - gVoiceClient->addBlockRule(blockMask, presenceOnly); - } - else if (!stricmp("BlockMask", tag)) - blockMask = string; - else if (!stricmp("PresenceOnly", tag)) - presenceOnly = string; - else if (!stricmp("AutoAcceptRule", tag)) - { - gVoiceClient->addAutoAcceptRule(autoAcceptMask, autoAddAsBuddy); - } - else if (!stricmp("AutoAcceptMask", tag)) - autoAcceptMask = string; - else if (!stricmp("AutoAddAsBuddy", tag)) - autoAddAsBuddy = string; - else if (!stricmp("MessageHeader", tag)) - messageHeader = string; - else if (!stricmp("MessageBody", tag)) - messageBody = string; - else if (!stricmp("NotificationType", tag)) - notificationType = string; - else if (!stricmp("HasText", tag)) - hasText = !stricmp(string.c_str(), "true"); - else if (!stricmp("HasAudio", tag)) - hasAudio = !stricmp(string.c_str(), "true"); - else if (!stricmp("HasVideo", tag)) - hasVideo = !stricmp(string.c_str(), "true"); - else if (!stricmp("Terminated", tag)) - terminated = !stricmp(string.c_str(), "true"); - else if (!stricmp("SubscriptionHandle", tag)) - subscriptionHandle = string; - else if (!stricmp("SubscriptionType", tag)) - subscriptionType = string; - - textBuffer.clear(); - accumulateText= false; - - if (responseDepth == 0) - { - // We finished all of the XML, process the data - processResponse(tag); - } - } -} - -// -------------------------------------------------------------------------------- - -void LLVivoxProtocolParser::CharData(const char *buffer, int length) -{ - /* - This method is called for anything that isn't a tag, which can be text you - want that lies between tags, and a lot of stuff you don't want like file formatting - (tabs, spaces, CR/LF, etc). - - Only copy text if we are in accumulate mode... - */ - if (accumulateText) - textBuffer.append(buffer, length); -} - -// -------------------------------------------------------------------------------- - -void LLVivoxProtocolParser::processResponse(std::string tag) -{ - LL_DEBUGS("VivoxProtocolParser") << tag << LL_ENDL; - - // SLIM SDK: the SDK now returns a statusCode of "200" (OK) for success. This is a change vs. previous SDKs. - // According to Mike S., "The actual API convention is that responses with return codes of 0 are successful, regardless of the status code returned", - // so I believe this will give correct behavior. - - if(returnCode == 0) - statusCode = 0; - - if (isEvent) - { - const char *eventTypeCstr = eventTypeString.c_str(); - if (!stricmp(eventTypeCstr, "AccountLoginStateChangeEvent")) - { - gVoiceClient->accountLoginStateChangeEvent(accountHandle, statusCode, statusString, state); - } - else if (!stricmp(eventTypeCstr, "SessionAddedEvent")) - { - /* - <Event type="SessionAddedEvent"> - <SessionGroupHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==_sg0</SessionGroupHandle> - <SessionHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==0</SessionHandle> - <Uri>sip:confctl-1408789@bhr.vivox.com</Uri> - <IsChannel>true</IsChannel> - <Incoming>false</Incoming> - <ChannelName /> - </Event> - */ - gVoiceClient->sessionAddedEvent(uriString, alias, sessionHandle, sessionGroupHandle, isChannel, incoming, nameString, applicationString); - } - else if (!stricmp(eventTypeCstr, "SessionRemovedEvent")) - { - gVoiceClient->sessionRemovedEvent(sessionHandle, sessionGroupHandle); - } - else if (!stricmp(eventTypeCstr, "SessionGroupAddedEvent")) - { - gVoiceClient->sessionGroupAddedEvent(sessionGroupHandle); - } - else if (!stricmp(eventTypeCstr, "MediaStreamUpdatedEvent")) - { - /* - <Event type="MediaStreamUpdatedEvent"> - <SessionGroupHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==_sg0</SessionGroupHandle> - <SessionHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==0</SessionHandle> - <StatusCode>200</StatusCode> - <StatusString>OK</StatusString> - <State>2</State> - <Incoming>false</Incoming> - </Event> - */ - gVoiceClient->mediaStreamUpdatedEvent(sessionHandle, sessionGroupHandle, statusCode, statusString, state, incoming); - } - else if (!stricmp(eventTypeCstr, "TextStreamUpdatedEvent")) - { - /* - <Event type="TextStreamUpdatedEvent"> - <SessionGroupHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==_sg1</SessionGroupHandle> - <SessionHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==1</SessionHandle> - <Enabled>true</Enabled> - <State>1</State> - <Incoming>true</Incoming> - </Event> - */ - gVoiceClient->textStreamUpdatedEvent(sessionHandle, sessionGroupHandle, enabled, state, incoming); - } - else if (!stricmp(eventTypeCstr, "ParticipantAddedEvent")) - { - /* - <Event type="ParticipantAddedEvent"> - <SessionGroupHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==_sg4</SessionGroupHandle> - <SessionHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==4</SessionHandle> - <ParticipantUri>sip:xI5auBZ60SJWIk606-1JGRQ==@bhr.vivox.com</ParticipantUri> - <AccountName>xI5auBZ60SJWIk606-1JGRQ==</AccountName> - <DisplayName /> - <ParticipantType>0</ParticipantType> - </Event> - */ - gVoiceClient->participantAddedEvent(sessionHandle, sessionGroupHandle, uriString, alias, nameString, displayNameString, participantType); - } - else if (!stricmp(eventTypeCstr, "ParticipantRemovedEvent")) - { - /* - <Event type="ParticipantRemovedEvent"> - <SessionGroupHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==_sg4</SessionGroupHandle> - <SessionHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==4</SessionHandle> - <ParticipantUri>sip:xtx7YNV-3SGiG7rA1fo5Ndw==@bhr.vivox.com</ParticipantUri> - <AccountName>xtx7YNV-3SGiG7rA1fo5Ndw==</AccountName> - </Event> - */ - gVoiceClient->participantRemovedEvent(sessionHandle, sessionGroupHandle, uriString, alias, nameString); - } - else if (!stricmp(eventTypeCstr, "ParticipantUpdatedEvent")) - { - /* - <Event type="ParticipantUpdatedEvent"> - <SessionGroupHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==_sg0</SessionGroupHandle> - <SessionHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==0</SessionHandle> - <ParticipantUri>sip:xFnPP04IpREWNkuw1cOXlhw==@bhr.vivox.com</ParticipantUri> - <IsModeratorMuted>false</IsModeratorMuted> - <IsSpeaking>true</IsSpeaking> - <Volume>44</Volume> - <Energy>0.0879437</Energy> - </Event> - */ - - // These happen so often that logging them is pretty useless. - squelchDebugOutput = true; - - gVoiceClient->participantUpdatedEvent(sessionHandle, sessionGroupHandle, uriString, alias, isModeratorMuted, isSpeaking, volume, energy); - } - else if (!stricmp(eventTypeCstr, "AuxAudioPropertiesEvent")) - { - gVoiceClient->auxAudioPropertiesEvent(energy); - } - else if (!stricmp(eventTypeCstr, "BuddyPresenceEvent")) - { - gVoiceClient->buddyPresenceEvent(uriString, alias, statusString, applicationString); - } - else if (!stricmp(eventTypeCstr, "BuddyAndGroupListChangedEvent")) - { - // The buddy list was updated during parsing. - // Need to recheck against the friends list. - gVoiceClient->buddyListChanged(); - } - else if (!stricmp(eventTypeCstr, "BuddyChangedEvent")) - { - /* - <Event type="BuddyChangedEvent"> - <AccountHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==</AccountHandle> - <BuddyURI>sip:x9fFHFZjOTN6OESF1DUPrZQ==@bhr.vivox.com</BuddyURI> - <DisplayName>Monroe Tester</DisplayName> - <BuddyData /> - <GroupID>0</GroupID> - <ChangeType>Set</ChangeType> - </Event> - */ - // TODO: Question: Do we need to process this at all? - } - else if (!stricmp(eventTypeCstr, "MessageEvent")) - { - gVoiceClient->messageEvent(sessionHandle, uriString, alias, messageHeader, messageBody, applicationString); - } - else if (!stricmp(eventTypeCstr, "SessionNotificationEvent")) - { - gVoiceClient->sessionNotificationEvent(sessionHandle, uriString, notificationType); - } - else if (!stricmp(eventTypeCstr, "SubscriptionEvent")) - { - gVoiceClient->subscriptionEvent(uriString, subscriptionHandle, alias, displayNameString, applicationString, subscriptionType); - } - else if (!stricmp(eventTypeCstr, "SessionUpdatedEvent")) - { - /* - <Event type="SessionUpdatedEvent"> - <SessionGroupHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==_sg0</SessionGroupHandle> - <SessionHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==0</SessionHandle> - <Uri>sip:confctl-9@bhd.vivox.com</Uri> - <IsMuted>0</IsMuted> - <Volume>50</Volume> - <TransmitEnabled>1</TransmitEnabled> - <IsFocused>0</IsFocused> - <SpeakerPosition><Position><X>0</X><Y>0</Y><Z>0</Z></Position></SpeakerPosition> - <SessionFontID>0</SessionFontID> - </Event> - */ - // We don't need to process this, but we also shouldn't warn on it, since that confuses people. - } - - else if (!stricmp(eventTypeCstr, "SessionGroupRemovedEvent")) - { - /* - <Event type="SessionGroupRemovedEvent"> - <SessionGroupHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==_sg0</SessionGroupHandle> - </Event> - */ - // We don't need to process this, but we also shouldn't warn on it, since that confuses people. - } - else - { - LL_WARNS("VivoxProtocolParser") << "Unknown event type " << eventTypeString << LL_ENDL; } + return false; } - else - { - const char *actionCstr = actionString.c_str(); - if (!stricmp(actionCstr, "Connector.Create.1")) - { - gVoiceClient->connectorCreateResponse(statusCode, statusString, connectorHandle, versionID); - } - else if (!stricmp(actionCstr, "Account.Login.1")) - { - gVoiceClient->loginResponse(statusCode, statusString, accountHandle, numberOfAliases); - } - else if (!stricmp(actionCstr, "Session.Create.1")) - { - gVoiceClient->sessionCreateResponse(requestId, statusCode, statusString, sessionHandle); - } - else if (!stricmp(actionCstr, "SessionGroup.AddSession.1")) - { - gVoiceClient->sessionGroupAddSessionResponse(requestId, statusCode, statusString, sessionHandle); - } - else if (!stricmp(actionCstr, "Session.Connect.1")) - { - gVoiceClient->sessionConnectResponse(requestId, statusCode, statusString); - } - else if (!stricmp(actionCstr, "Account.Logout.1")) - { - gVoiceClient->logoutResponse(statusCode, statusString); - } - else if (!stricmp(actionCstr, "Connector.InitiateShutdown.1")) - { - gVoiceClient->connectorShutdownResponse(statusCode, statusString); - } - else if (!stricmp(actionCstr, "Account.ListBlockRules.1")) - { - gVoiceClient->accountListBlockRulesResponse(statusCode, statusString); - } - else if (!stricmp(actionCstr, "Account.ListAutoAcceptRules.1")) - { - gVoiceClient->accountListAutoAcceptRulesResponse(statusCode, statusString); - } - else if (!stricmp(actionCstr, "Session.Set3DPosition.1")) - { - // We don't need to process these, but they're so spammy we don't want to log them. - squelchDebugOutput = true; - } -/* - else if (!stricmp(actionCstr, "Account.ChannelGetList.1")) - { - gVoiceClient->channelGetListResponse(statusCode, statusString); - } - else if (!stricmp(actionCstr, "Connector.AccountCreate.1")) - { - - } - else if (!stricmp(actionCstr, "Connector.MuteLocalMic.1")) - { - - } - else if (!stricmp(actionCstr, "Connector.MuteLocalSpeaker.1")) - { - - } - else if (!stricmp(actionCstr, "Connector.SetLocalMicVolume.1")) - { - - } - else if (!stricmp(actionCstr, "Connector.SetLocalSpeakerVolume.1")) - { - - } - else if (!stricmp(actionCstr, "Session.ListenerSetPosition.1")) - { - - } - else if (!stricmp(actionCstr, "Session.SpeakerSetPosition.1")) - { - - } - else if (!stricmp(actionCstr, "Session.AudioSourceSetPosition.1")) - { - - } - else if (!stricmp(actionCstr, "Session.GetChannelParticipants.1")) - { - - } - else if (!stricmp(actionCstr, "Account.ChannelCreate.1")) - { - - } - else if (!stricmp(actionCstr, "Account.ChannelUpdate.1")) - { - - } - else if (!stricmp(actionCstr, "Account.ChannelDelete.1")) - { - - } - else if (!stricmp(actionCstr, "Account.ChannelCreateAndInvite.1")) - { - - } - else if (!stricmp(actionCstr, "Account.ChannelFolderCreate.1")) - { - - } - else if (!stricmp(actionCstr, "Account.ChannelFolderUpdate.1")) - { - - } - else if (!stricmp(actionCstr, "Account.ChannelFolderDelete.1")) - { - - } - else if (!stricmp(actionCstr, "Account.ChannelAddModerator.1")) - { - - } - else if (!stricmp(actionCstr, "Account.ChannelDeleteModerator.1")) - { - - } -*/ - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////// - -class LLVoiceClientMuteListObserver : public LLMuteListObserver -{ - /* virtual */ void onChange() { gVoiceClient->muteListChanged();} -}; - -class LLVoiceClientFriendsObserver : public LLFriendObserver -{ -public: - /* virtual */ void changed(U32 mask) { gVoiceClient->updateFriends(mask);} -}; - -static LLVoiceClientMuteListObserver mutelist_listener; -static bool sMuteListListener_listening = false; - -static LLVoiceClientFriendsObserver *friendslist_listener = NULL; - -/////////////////////////////////////////////////////////////////////////////////////////////// - -class LLVoiceClientCapResponder : public LLHTTPClient::Responder -{ -public: - LLVoiceClientCapResponder(void){}; - - virtual void error(U32 status, const std::string& reason); // called with bad status codes - virtual void result(const LLSD& content); - -private: }; +LLVoiceHandler gVoiceHandler; -void LLVoiceClientCapResponder::error(U32 status, const std::string& reason) -{ - LL_WARNS("Voice") << "LLVoiceClientCapResponder::error(" - << status << ": " << reason << ")" - << LL_ENDL; -} - -void LLVoiceClientCapResponder::result(const LLSD& content) -{ - LLSD::map_const_iterator iter; - - LL_DEBUGS("Voice") << "ParcelVoiceInfoRequest response:" << ll_pretty_print_sd(content) << LL_ENDL; - if ( content.has("voice_credentials") ) - { - LLSD voice_credentials = content["voice_credentials"]; - std::string uri; - std::string credentials; - - if ( voice_credentials.has("channel_uri") ) - { - uri = voice_credentials["channel_uri"].asString(); - } - if ( voice_credentials.has("channel_credentials") ) - { - credentials = - voice_credentials["channel_credentials"].asString(); - } - - gVoiceClient->setSpatialChannel(uri, credentials); - } -} - - - -#if LL_WINDOWS -static HANDLE sGatewayHandle = 0; - -static bool isGatewayRunning() -{ - bool result = false; - if(sGatewayHandle != 0) - { - DWORD waitresult = WaitForSingleObject(sGatewayHandle, 0); - if(waitresult != WAIT_OBJECT_0) - { - result = true; - } - } - return result; -} -static void killGateway() -{ - if(sGatewayHandle != 0) - { - TerminateProcess(sGatewayHandle,0); - } -} - -#else // Mac and linux - -static pid_t sGatewayPID = 0; -static bool isGatewayRunning() -{ - bool result = false; - if(sGatewayPID != 0) - { - // A kill with signal number 0 has no effect, just does error checking. It should return an error if the process no longer exists. - if(kill(sGatewayPID, 0) == 0) - { - result = true; - } - } - return result; -} - -static void killGateway() -{ - if(sGatewayPID != 0) - { - kill(sGatewayPID, SIGTERM); - } -} - -#endif - -class LLSpeakerVolumeStorage : public LLSingleton<LLSpeakerVolumeStorage> -{ - LOG_CLASS(LLSpeakerVolumeStorage); -public: - - /** - * Sets internal voluem level for specified user. - * - * @param[in] speaker_id - LLUUID of user to store volume level for - * @param[in] volume - external (vivox) volume level to be stored for user. - */ - void storeSpeakerVolume(const LLUUID& speaker_id, F32 volume); - - /** - * Gets stored external (vivox) volume level for specified speaker and - * transforms it into internal (viewer) level. - * - * If specified user is not found default level will be returned. It is equivalent of - * external level 0.5 from the 0.0..1.0 range. - * Internal level is calculated as: internal = 400 * external^2 - * Maps 0.0 to 1.0 to internal values 0-400 with default 0.5 == 100 - * - * @param[in] speaker_id - LLUUID of user to get his volume level - */ - S32 getSpeakerVolume(const LLUUID& speaker_id); - -private: - friend class LLSingleton<LLSpeakerVolumeStorage>; - LLSpeakerVolumeStorage(); - ~LLSpeakerVolumeStorage(); - - const static std::string SETTINGS_FILE_NAME; - - void load(); - void save(); - - typedef std::map<LLUUID, F32> speaker_data_map_t; - speaker_data_map_t mSpeakersData; -}; - -const std::string LLSpeakerVolumeStorage::SETTINGS_FILE_NAME = "volume_settings.xml"; - -LLSpeakerVolumeStorage::LLSpeakerVolumeStorage() -{ - load(); -} - -LLSpeakerVolumeStorage::~LLSpeakerVolumeStorage() -{ - save(); -} - -void LLSpeakerVolumeStorage::storeSpeakerVolume(const LLUUID& speaker_id, F32 volume) -{ - mSpeakersData[speaker_id] = volume; -} - -S32 LLSpeakerVolumeStorage::getSpeakerVolume(const LLUUID& speaker_id) -{ - // default internal level of user voice. - const static LLUICachedControl<S32> DEFAULT_INTERNAL_VOLUME_LEVEL("VoiceDefaultInternalLevel", 100); - S32 ret_val = DEFAULT_INTERNAL_VOLUME_LEVEL; - speaker_data_map_t::const_iterator it = mSpeakersData.find(speaker_id); - - if (it != mSpeakersData.end()) - { - F32 f_val = it->second; - // volume can amplify by as much as 4x! - S32 ivol = (S32)(400.f * f_val * f_val); - ret_val = llclamp(ivol, 0, 400); - } - return ret_val; -} - -void LLSpeakerVolumeStorage::load() -{ - // load per-resident voice volume information - std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, SETTINGS_FILE_NAME); - - LLSD settings_llsd; - llifstream file; - file.open(filename); - if (file.is_open()) - { - LLSDSerialize::fromXML(settings_llsd, file); - } - - for (LLSD::map_const_iterator iter = settings_llsd.beginMap(); - iter != settings_llsd.endMap(); ++iter) - { - mSpeakersData.insert(std::make_pair(LLUUID(iter->first), (F32)iter->second.asReal())); - } -} - -void LLSpeakerVolumeStorage::save() -{ - // If we quit from the login screen we will not have an SL account - // name. Don't try to save, otherwise we'll dump a file in - // C:\Program Files\SecondLife\ or similar. JC - std::string user_dir = gDirUtilp->getLindenUserDir(); - if (!user_dir.empty()) - { - std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, SETTINGS_FILE_NAME); - LLSD settings_llsd; - - for(speaker_data_map_t::const_iterator iter = mSpeakersData.begin(); iter != mSpeakersData.end(); ++iter) - { - settings_llsd[iter->first.asString()] = iter->second; - } - - llofstream file; - file.open(filename); - LLSDSerialize::toPrettyXML(settings_llsd, file); - } -} - - -/////////////////////////////////////////////////////////////////////////////////////////////// - -LLVoiceClient::LLVoiceClient() : - mState(stateDisabled), - mSessionTerminateRequested(false), - mRelogRequested(false), - mConnected(false), - mPump(NULL), - - mTuningMode(false), - mTuningEnergy(0.0f), - mTuningMicVolume(0), - mTuningMicVolumeDirty(true), - mTuningSpeakerVolume(0), - mTuningSpeakerVolumeDirty(true), - mTuningExitState(stateDisabled), - - mAreaVoiceDisabled(false), - mAudioSession(NULL), - mAudioSessionChanged(false), - mNextAudioSession(NULL), - - mCurrentParcelLocalID(0), - mNumberOfAliases(0), - mCommandCookie(0), - mLoginRetryCount(0), - - mBuddyListMapPopulated(false), - mBlockRulesListReceived(false), - mAutoAcceptRulesListReceived(false), - mCaptureDeviceDirty(false), - mRenderDeviceDirty(false), - mSpatialCoordsDirty(false), - - mPTTDirty(true), - mPTT(true), - mUsePTT(true), - mPTTIsMiddleMouse(false), - mPTTKey(0), - mPTTIsToggle(false), - mUserPTTState(false), - mMuteMic(false), - mFriendsListDirty(true), - - mEarLocation(0), - mSpeakerVolumeDirty(true), - mSpeakerMuteDirty(true), - mMicVolume(0), - mMicVolumeDirty(true), - - mVoiceEnabled(false), - mWriteInProgress(false), - - mLipSyncEnabled(false) -{ - gVoiceClient = this; - - mAPIVersion = LLTrans::getString("NotConnected"); - - mSpeakerVolume = scale_speaker_volume(0); - -#if LL_DARWIN || LL_LINUX || LL_SOLARIS - // HACK: THIS DOES NOT BELONG HERE - // When the vivox daemon dies, the next write attempt on our socket generates a SIGPIPE, which kills us. - // This should cause us to ignore SIGPIPE and handle the error through proper channels. - // This should really be set up elsewhere. Where should it go? - signal(SIGPIPE, SIG_IGN); - - // Since we're now launching the gateway with fork/exec instead of system(), we need to deal with zombie processes. - // Ignoring SIGCHLD should prevent zombies from being created. Alternately, we could use wait(), but I'd rather not do that. - signal(SIGCHLD, SIG_IGN); -#endif - - // set up state machine - setState(stateDisabled); - - gIdleCallbacks.addFunction(idle, this); -} - -//--------------------------------------------------- - -LLVoiceClient::~LLVoiceClient() -{ -} - -//---------------------------------------------- - -void LLVoiceClient::init(LLPumpIO *pump) -{ - // constructor will set up gVoiceClient - LLVoiceClient::getInstance()->mPump = pump; - LLVoiceClient::getInstance()->updateSettings(); -} - -void LLVoiceClient::terminate() -{ - if(gVoiceClient) - { -// gVoiceClient->leaveAudioSession(); - gVoiceClient->logout(); - // As of SDK version 4885, this should no longer be necessary. It will linger after the socket close if it needs to. - // ms_sleep(2000); - gVoiceClient->connectorShutdown(); - gVoiceClient->closeSocket(); // Need to do this now -- bad things happen if the destructor does it later. - - // This will do unpleasant things on windows. -// killGateway(); - - // Don't do this anymore -- LLSingleton will take care of deleting the object. -// delete gVoiceClient; - - // Hint to other code not to access the voice client anymore. - gVoiceClient = NULL; - } -} - -//--------------------------------------------------- - -void LLVoiceClient::updateSettings() -{ - setVoiceEnabled(gSavedSettings.getBOOL("EnableVoiceChat")); - setUsePTT(gSavedSettings.getBOOL("PTTCurrentlyEnabled")); - std::string keyString = gSavedSettings.getString("PushToTalkButton"); - setPTTKey(keyString); - setPTTIsToggle(gSavedSettings.getBOOL("PushToTalkToggle")); - setEarLocation(gSavedSettings.getS32("VoiceEarLocation")); - - std::string inputDevice = gSavedSettings.getString("VoiceInputAudioDevice"); - setCaptureDevice(inputDevice); - std::string outputDevice = gSavedSettings.getString("VoiceOutputAudioDevice"); - setRenderDevice(outputDevice); - F32 mic_level = gSavedSettings.getF32("AudioLevelMic"); - setMicGain(mic_level); - setLipSyncEnabled(gSavedSettings.getBOOL("LipSyncEnabled")); -} - -///////////////////////////// -// utility functions - -bool LLVoiceClient::writeString(const std::string &str) -{ - bool result = false; - if(mConnected) - { - apr_status_t err; - apr_size_t size = (apr_size_t)str.size(); - apr_size_t written = size; - - //MARK: Turn this on to log outgoing XML -// LL_DEBUGS("Voice") << "sending: " << str << LL_ENDL; - - // check return code - sockets will fail (broken, etc.) - err = apr_socket_send( - mSocket->getSocket(), - (const char*)str.data(), - &written); - - if(err == 0) - { - // Success. - result = true; - } - // TODO: handle partial writes (written is number of bytes written) - // Need to set socket to non-blocking before this will work. -// else if(APR_STATUS_IS_EAGAIN(err)) -// { -// // -// } - else - { - // Assume any socket error means something bad. For now, just close the socket. - char buf[MAX_STRING]; - LL_WARNS("Voice") << "apr error " << err << " ("<< apr_strerror(err, buf, MAX_STRING) << ") sending data to vivox daemon." << LL_ENDL; - daemonDied(); - } - } - - return result; -} - - -///////////////////////////// -// session control messages -void LLVoiceClient::connectorCreate() -{ - std::ostringstream stream; - std::string logpath = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, ""); - std::string loglevel = "0"; - - // Transition to stateConnectorStarted when the connector handle comes back. - setState(stateConnectorStarting); - - std::string savedLogLevel = gSavedSettings.getString("VivoxDebugLevel"); - - if(savedLogLevel != "-1") - { - LL_DEBUGS("Voice") << "creating connector with logging enabled" << LL_ENDL; - loglevel = "10"; - } - - stream - << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Connector.Create.1\">" - << "<ClientName>V2 SDK</ClientName>" - << "<AccountManagementServer>" << mVoiceAccountServerURI << "</AccountManagementServer>" - << "<Mode>Normal</Mode>" - << "<Logging>" - << "<Folder>" << logpath << "</Folder>" - << "<FileNamePrefix>Connector</FileNamePrefix>" - << "<FileNameSuffix>.log</FileNameSuffix>" - << "<LogLevel>" << loglevel << "</LogLevel>" - << "</Logging>" - << "<Application>SecondLifeViewer.1</Application>" - << "</Request>\n\n\n"; - - writeString(stream.str()); -} - -void LLVoiceClient::connectorShutdown() -{ - setState(stateConnectorStopping); - - if(!mConnectorHandle.empty()) - { - std::ostringstream stream; - stream - << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Connector.InitiateShutdown.1\">" - << "<ConnectorHandle>" << mConnectorHandle << "</ConnectorHandle>" - << "</Request>" - << "\n\n\n"; - - mConnectorHandle.clear(); - - writeString(stream.str()); - } -} - -void LLVoiceClient::userAuthorized(const std::string& firstName, const std::string& lastName, const LLUUID &agentID) -{ - mAccountFirstName = firstName; - mAccountLastName = lastName; - - mAccountDisplayName = firstName; - mAccountDisplayName += " "; - mAccountDisplayName += lastName; - - LL_INFOS("Voice") << "name \"" << mAccountDisplayName << "\" , ID " << agentID << LL_ENDL; - - sConnectingToAgni = LLViewerLogin::getInstance()->isInProductionGrid(); - - mAccountName = nameFromID(agentID); -} - -void LLVoiceClient::requestVoiceAccountProvision(S32 retries) -{ - if ( gAgent.getRegion() && mVoiceEnabled ) - { - std::string url = - gAgent.getRegion()->getCapability( - "ProvisionVoiceAccountRequest"); - - if ( url == "" ) return; - - LLHTTPClient::post( - url, - LLSD(), - new LLViewerVoiceAccountProvisionResponder(retries)); - } -} - -void LLVoiceClient::login( - const std::string& account_name, - const std::string& password, - const std::string& voice_sip_uri_hostname, - const std::string& voice_account_server_uri) -{ - mVoiceSIPURIHostName = voice_sip_uri_hostname; - mVoiceAccountServerURI = voice_account_server_uri; - - if(!mAccountHandle.empty()) - { - // Already logged in. - LL_WARNS("Voice") << "Called while already logged in." << LL_ENDL; - - // Don't process another login. - return; - } - else if ( account_name != mAccountName ) - { - //TODO: error? - LL_WARNS("Voice") << "Wrong account name! " << account_name - << " instead of " << mAccountName << LL_ENDL; - } - else - { - mAccountPassword = password; - } - - std::string debugSIPURIHostName = gSavedSettings.getString("VivoxDebugSIPURIHostName"); - - if( !debugSIPURIHostName.empty() ) - { - mVoiceSIPURIHostName = debugSIPURIHostName; - } - - if( mVoiceSIPURIHostName.empty() ) - { - // we have an empty account server name - // so we fall back to hardcoded defaults - - if(sConnectingToAgni) - { - // Use the release account server - mVoiceSIPURIHostName = "bhr.vivox.com"; - } - else - { - // Use the development account server - mVoiceSIPURIHostName = "bhd.vivox.com"; - } - } - - std::string debugAccountServerURI = gSavedSettings.getString("VivoxDebugVoiceAccountServerURI"); - - if( !debugAccountServerURI.empty() ) - { - mVoiceAccountServerURI = debugAccountServerURI; - } - - if( mVoiceAccountServerURI.empty() ) - { - // If the account server URI isn't specified, construct it from the SIP URI hostname - mVoiceAccountServerURI = "https://www." + mVoiceSIPURIHostName + "/api2/"; - } -} - -void LLVoiceClient::idle(void* user_data) -{ - LLVoiceClient* self = (LLVoiceClient*)user_data; - self->stateMachine(); -} - -std::string LLVoiceClient::state2string(LLVoiceClient::state inState) -{ - std::string result = "UNKNOWN"; - - // Prevent copy-paste errors when updating this list... -#define CASE(x) case x: result = #x; break - - switch(inState) - { - CASE(stateDisableCleanup); - CASE(stateDisabled); - CASE(stateStart); - CASE(stateDaemonLaunched); - CASE(stateConnecting); - CASE(stateConnected); - CASE(stateIdle); - CASE(stateMicTuningStart); - CASE(stateMicTuningRunning); - CASE(stateMicTuningStop); - CASE(stateConnectorStart); - CASE(stateConnectorStarting); - CASE(stateConnectorStarted); - CASE(stateLoginRetry); - CASE(stateLoginRetryWait); - CASE(stateNeedsLogin); - CASE(stateLoggingIn); - CASE(stateLoggedIn); - CASE(stateCreatingSessionGroup); - CASE(stateNoChannel); - CASE(stateJoiningSession); - CASE(stateSessionJoined); - CASE(stateRunning); - CASE(stateLeavingSession); - CASE(stateSessionTerminated); - CASE(stateLoggingOut); - CASE(stateLoggedOut); - CASE(stateConnectorStopping); - CASE(stateConnectorStopped); - CASE(stateConnectorFailed); - CASE(stateConnectorFailedWaiting); - CASE(stateLoginFailed); - CASE(stateLoginFailedWaiting); - CASE(stateJoinSessionFailed); - CASE(stateJoinSessionFailedWaiting); - CASE(stateJail); - } - -#undef CASE - - return result; -} std::string LLVoiceClientStatusObserver::status2string(LLVoiceClientStatusObserver::EStatusType inStatus) { std::string result = "UNKNOWN"; - // Prevent copy-paste errors when updating this list... + // Prevent copy-paste errors when updating this list... #define CASE(x) case x: result = #x; break - + switch(inStatus) { - CASE(STATUS_LOGIN_RETRY); - CASE(STATUS_LOGGED_IN); - CASE(STATUS_JOINING); - CASE(STATUS_JOINED); - CASE(STATUS_LEFT_CHANNEL); - CASE(STATUS_VOICE_DISABLED); - CASE(STATUS_VOICE_ENABLED); - CASE(BEGIN_ERROR_STATUS); - CASE(ERROR_CHANNEL_FULL); - CASE(ERROR_CHANNEL_LOCKED); - CASE(ERROR_NOT_AVAILABLE); - CASE(ERROR_UNKNOWN); - default: - break; + CASE(STATUS_LOGIN_RETRY); + CASE(STATUS_LOGGED_IN); + CASE(STATUS_JOINING); + CASE(STATUS_JOINED); + CASE(STATUS_LEFT_CHANNEL); + CASE(STATUS_VOICE_DISABLED); + CASE(BEGIN_ERROR_STATUS); + CASE(ERROR_CHANNEL_FULL); + CASE(ERROR_CHANNEL_LOCKED); + CASE(ERROR_NOT_AVAILABLE); + CASE(ERROR_UNKNOWN); + default: + break; } - + #undef CASE return result; } -void LLVoiceClient::setState(state inState) -{ - LL_DEBUGS("Voice") << "entering state " << state2string(inState) << LL_ENDL; - - mState = inState; -} - -void LLVoiceClient::stateMachine() -{ - if(gDisconnected) - { - // The viewer has been disconnected from the sim. Disable voice. - setVoiceEnabled(false); - } - - if(mVoiceEnabled) - { - updatePosition(); - } - else if(mTuningMode) - { - // Tuning mode is special -- it needs to launch SLVoice even if voice is disabled. - } - else - { - if((getState() != stateDisabled) && (getState() != stateDisableCleanup)) - { - // User turned off voice support. Send the cleanup messages, close the socket, and reset. - if(!mConnected) - { - // if voice was turned off after the daemon was launched but before we could connect to it, we may need to issue a kill. - LL_INFOS("Voice") << "Disabling voice before connection to daemon, terminating." << LL_ENDL; - killGateway(); - } - - logout(); - connectorShutdown(); - - setState(stateDisableCleanup); - } - } - - // Check for parcel boundary crossing - { - LLViewerRegion *region = gAgent.getRegion(); - LLParcel *parcel = LLViewerParcelMgr::getInstance()->getAgentParcel(); - - if(region && parcel) - { - S32 parcelLocalID = parcel->getLocalID(); - std::string regionName = region->getName(); - std::string capURI = region->getCapability("ParcelVoiceInfoRequest"); - -// LL_DEBUGS("Voice") << "Region name = \"" << regionName << "\", parcel local ID = " << parcelLocalID << ", cap URI = \"" << capURI << "\"" << LL_ENDL; - - // The region name starts out empty and gets filled in later. - // Also, the cap gets filled in a short time after the region cross, but a little too late for our purposes. - // If either is empty, wait for the next time around. - if(!regionName.empty()) - { - if(!capURI.empty()) - { - if((parcelLocalID != mCurrentParcelLocalID) || (regionName != mCurrentRegionName)) - { - // We have changed parcels. Initiate a parcel channel lookup. - mCurrentParcelLocalID = parcelLocalID; - mCurrentRegionName = regionName; - - parcelChanged(); - } - } - else - { - LL_WARNS_ONCE("Voice") << "region doesn't have ParcelVoiceInfoRequest capability. This is normal for a short time after teleporting, but bad if it persists for very long." << LL_ENDL; - } - } - } - } - - switch(getState()) - { - //MARK: stateDisableCleanup - case stateDisableCleanup: - // Clean up and reset everything. - closeSocket(); - deleteAllSessions(); - deleteAllBuddies(); - - mConnectorHandle.clear(); - mAccountHandle.clear(); - mAccountPassword.clear(); - mVoiceAccountServerURI.clear(); - - setState(stateDisabled); - break; - - //MARK: stateDisabled - case stateDisabled: - if(mTuningMode || (mVoiceEnabled && !mAccountName.empty())) - { - setState(stateStart); - } - break; - - //MARK: stateStart - case stateStart: - if(gSavedSettings.getBOOL("CmdLineDisableVoice")) - { - // Voice is locked out, we must not launch the vivox daemon. - setState(stateJail); - } - else if(!isGatewayRunning()) - { - if(true) - { - // Launch the voice daemon - - // *FIX:Mani - Using the executable dir instead - // of mAppRODataDir, the working directory from which the app - // is launched. - //std::string exe_path = gDirUtilp->getAppRODataDir(); - std::string exe_path = gDirUtilp->getExecutableDir(); - exe_path += gDirUtilp->getDirDelimiter(); -#if LL_WINDOWS - exe_path += "SLVoice.exe"; -#elif LL_DARWIN - exe_path += "../Resources/SLVoice"; -#else - exe_path += "SLVoice"; -#endif - // See if the vivox executable exists - llstat s; - if(!LLFile::stat(exe_path, &s)) - { - // vivox executable exists. Build the command line and launch the daemon. - // SLIM SDK: these arguments are no longer necessary. -// std::string args = " -p tcp -h -c"; - std::string args; - std::string loglevel = gSavedSettings.getString("VivoxDebugLevel"); - - if(loglevel.empty()) - { - loglevel = "-1"; // turn logging off completely - } - - args += " -ll "; - args += loglevel; - - LL_DEBUGS("Voice") << "Args for SLVoice: " << args << LL_ENDL; - -#if LL_WINDOWS - PROCESS_INFORMATION pinfo; - STARTUPINFOW sinfo; - memset(&sinfo, 0, sizeof(sinfo)); - - std::string exe_dir = gDirUtilp->getExecutableDir(); - - llutf16string exe_path16 = utf8str_to_utf16str(exe_path); - llutf16string exe_dir16 = utf8str_to_utf16str(exe_dir); - llutf16string args16 = utf8str_to_utf16str(args); - // Create a writeable copy to keep Windows happy. - U16 *argscpy_16 = new U16[args16.size() + 1]; - wcscpy_s(argscpy_16,args16.size()+1,args16.c_str()); - if(!CreateProcessW(exe_path16.c_str(), argscpy_16, NULL, NULL, FALSE, 0, NULL, exe_dir16.c_str(), &sinfo, &pinfo)) - { -// DWORD dwErr = GetLastError(); - } - else - { - // foo = pinfo.dwProcessId; // get your pid here if you want to use it later on - // CloseHandle(pinfo.hProcess); // stops leaks - nothing else - sGatewayHandle = pinfo.hProcess; - CloseHandle(pinfo.hThread); // stops leaks - nothing else - } - - delete[] argscpy_16; -#else // LL_WINDOWS - // This should be the same for mac and linux - { - std::vector<std::string> arglist; - arglist.push_back(exe_path); - - // Split the argument string into separate strings for each argument - typedef boost::tokenizer<boost::char_separator<char> > tokenizer; - boost::char_separator<char> sep(" "); - tokenizer tokens(args, sep); - tokenizer::iterator token_iter; - - for(token_iter = tokens.begin(); token_iter != tokens.end(); ++token_iter) - { - arglist.push_back(*token_iter); - } - - // create an argv vector for the child process - char **fakeargv = new char*[arglist.size() + 1]; - int i; - for(i=0; i < arglist.size(); i++) - fakeargv[i] = const_cast<char*>(arglist[i].c_str()); - - fakeargv[i] = NULL; - - fflush(NULL); // flush all buffers before the child inherits them - pid_t id = vfork(); - if(id == 0) - { - // child - execv(exe_path.c_str(), fakeargv); - - // If we reach this point, the exec failed. - // Use _exit() instead of exit() per the vfork man page. - _exit(0); - } - - // parent - delete[] fakeargv; - sGatewayPID = id; - } -#endif // LL_WINDOWS - mDaemonHost = LLHost(gSavedSettings.getString("VoiceHost").c_str(), gSavedSettings.getU32("VoicePort")); - } - else - { - LL_INFOS("Voice") << exe_path << " not found." << LL_ENDL; - } - } - else - { - // SLIM SDK: port changed from 44124 to 44125. - // We can connect to a client gateway running on another host. This is useful for testing. - // To do this, launch the gateway on a nearby host like this: - // vivox-gw.exe -p tcp -i 0.0.0.0:44125 - // and put that host's IP address here. - mDaemonHost = LLHost(gSavedSettings.getString("VoiceHost"), gSavedSettings.getU32("VoicePort")); - } - - mUpdateTimer.start(); - mUpdateTimer.setTimerExpirySec(CONNECT_THROTTLE_SECONDS); - - setState(stateDaemonLaunched); - - // Dirty the states we'll need to sync with the daemon when it comes up. - mPTTDirty = true; - mMicVolumeDirty = true; - mSpeakerVolumeDirty = true; - mSpeakerMuteDirty = true; - // These only need to be set if they're not default (i.e. empty string). - mCaptureDeviceDirty = !mCaptureDevice.empty(); - mRenderDeviceDirty = !mRenderDevice.empty(); - - mMainSessionGroupHandle.clear(); - } - break; - - //MARK: stateDaemonLaunched - case stateDaemonLaunched: - if(mUpdateTimer.hasExpired()) - { - LL_DEBUGS("Voice") << "Connecting to vivox daemon" << LL_ENDL; - - mUpdateTimer.setTimerExpirySec(CONNECT_THROTTLE_SECONDS); - - if(!mSocket) - { - mSocket = LLSocket::create(gAPRPoolp, LLSocket::STREAM_TCP); - } - - mConnected = mSocket->blockingConnect(mDaemonHost); - if(mConnected) - { - setState(stateConnecting); - } - else - { - // If the connect failed, the socket may have been put into a bad state. Delete it. - closeSocket(); - } - } - break; - - //MARK: stateConnecting - case stateConnecting: - // Can't do this until we have the pump available. - if(mPump) - { - // MBW -- Note to self: pumps and pipes examples in - // indra/test/io.cpp - // indra/test/llpipeutil.{cpp|h} - - // Attach the pumps and pipes - - LLPumpIO::chain_t readChain; - - readChain.push_back(LLIOPipe::ptr_t(new LLIOSocketReader(mSocket))); - readChain.push_back(LLIOPipe::ptr_t(new LLVivoxProtocolParser())); - - mPump->addChain(readChain, NEVER_CHAIN_EXPIRY_SECS); - - setState(stateConnected); - } - - break; - - //MARK: stateConnected - case stateConnected: - // Initial devices query - getCaptureDevicesSendMessage(); - getRenderDevicesSendMessage(); - - mLoginRetryCount = 0; - - setState(stateIdle); - break; - - //MARK: stateIdle - case stateIdle: - // This is the idle state where we're connected to the daemon but haven't set up a connector yet. - if(mTuningMode) - { - mTuningExitState = stateIdle; - setState(stateMicTuningStart); - } - else if(!mVoiceEnabled) - { - // We never started up the connector. This will shut down the daemon. - setState(stateConnectorStopped); - } - else if(!mAccountName.empty()) - { - LLViewerRegion *region = gAgent.getRegion(); - - if(region) - { - if ( region->getCapability("ProvisionVoiceAccountRequest") != "" ) - { - if ( mAccountPassword.empty() ) - { - requestVoiceAccountProvision(); - } - setState(stateConnectorStart); - } - else - { - LL_WARNS_ONCE("Voice") << "region doesn't have ProvisionVoiceAccountRequest capability!" << LL_ENDL; - } - } - } - break; - - //MARK: stateMicTuningStart - case stateMicTuningStart: - if(mUpdateTimer.hasExpired()) - { - if(mCaptureDeviceDirty || mRenderDeviceDirty) - { - // These can't be changed while in tuning mode. Set them before starting. - std::ostringstream stream; - - buildSetCaptureDevice(stream); - buildSetRenderDevice(stream); - - if(!stream.str().empty()) - { - writeString(stream.str()); - } - - // This will come around again in the same state and start the capture, after the timer expires. - mUpdateTimer.start(); - mUpdateTimer.setTimerExpirySec(UPDATE_THROTTLE_SECONDS); - } - else - { - // duration parameter is currently unused, per Mike S. - tuningCaptureStartSendMessage(10000); - - setState(stateMicTuningRunning); - } - } - - break; - - //MARK: stateMicTuningRunning - case stateMicTuningRunning: - if(!mTuningMode || mCaptureDeviceDirty || mRenderDeviceDirty) - { - // All of these conditions make us leave tuning mode. - setState(stateMicTuningStop); - } - else - { - // process mic/speaker volume changes - if(mTuningMicVolumeDirty || mTuningSpeakerVolumeDirty) - { - std::ostringstream stream; - - if(mTuningMicVolumeDirty) - { - LL_INFOS("Voice") << "setting tuning mic level to " << mTuningMicVolume << LL_ENDL; - stream - << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Aux.SetMicLevel.1\">" - << "<Level>" << mTuningMicVolume << "</Level>" - << "</Request>\n\n\n"; - } - - if(mTuningSpeakerVolumeDirty) - { - stream - << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Aux.SetSpeakerLevel.1\">" - << "<Level>" << mTuningSpeakerVolume << "</Level>" - << "</Request>\n\n\n"; - } - - mTuningMicVolumeDirty = false; - mTuningSpeakerVolumeDirty = false; - - if(!stream.str().empty()) - { - writeString(stream.str()); - } - } - } - break; - - //MARK: stateMicTuningStop - case stateMicTuningStop: - { - // transition out of mic tuning - tuningCaptureStopSendMessage(); - - setState(mTuningExitState); - - // if we exited just to change devices, this will keep us from re-entering too fast. - mUpdateTimer.start(); - mUpdateTimer.setTimerExpirySec(UPDATE_THROTTLE_SECONDS); - - } - break; - - //MARK: stateConnectorStart - case stateConnectorStart: - if(!mVoiceEnabled) - { - // We were never logged in. This will shut down the connector. - setState(stateLoggedOut); - } - else if(!mVoiceAccountServerURI.empty()) - { - connectorCreate(); - } - break; - - //MARK: stateConnectorStarting - case stateConnectorStarting: // waiting for connector handle - // connectorCreateResponse() will transition from here to stateConnectorStarted. - break; - - //MARK: stateConnectorStarted - case stateConnectorStarted: // connector handle received - if(!mVoiceEnabled) - { - // We were never logged in. This will shut down the connector. - setState(stateLoggedOut); - } - else - { - // The connector is started. Send a login message. - setState(stateNeedsLogin); - } - break; - - //MARK: stateLoginRetry - case stateLoginRetry: - if(mLoginRetryCount == 0) - { - // First retry -- display a message to the user - notifyStatusObservers(LLVoiceClientStatusObserver::STATUS_LOGIN_RETRY); - } - - mLoginRetryCount++; - - if(mLoginRetryCount > MAX_LOGIN_RETRIES) - { - LL_WARNS("Voice") << "too many login retries, giving up." << LL_ENDL; - setState(stateLoginFailed); - } - else - { - LL_INFOS("Voice") << "will retry login in " << LOGIN_RETRY_SECONDS << " seconds." << LL_ENDL; - mUpdateTimer.start(); - mUpdateTimer.setTimerExpirySec(LOGIN_RETRY_SECONDS); - setState(stateLoginRetryWait); - } - break; - - //MARK: stateLoginRetryWait - case stateLoginRetryWait: - if(mUpdateTimer.hasExpired()) - { - setState(stateNeedsLogin); - } - break; - - //MARK: stateNeedsLogin - case stateNeedsLogin: - if(!mAccountPassword.empty()) - { - setState(stateLoggingIn); - loginSendMessage(); - } - break; - - //MARK: stateLoggingIn - case stateLoggingIn: // waiting for account handle - // loginResponse() will transition from here to stateLoggedIn. - break; - - //MARK: stateLoggedIn - case stateLoggedIn: // account handle received - - notifyStatusObservers(LLVoiceClientStatusObserver::STATUS_LOGGED_IN); - - // request the current set of block rules (we'll need them when updating the friends list) - accountListBlockRulesSendMessage(); - - // request the current set of auto-accept rules - accountListAutoAcceptRulesSendMessage(); - - // Set up the mute list observer if it hasn't been set up already. - if((!sMuteListListener_listening)) - { - LLMuteList::getInstance()->addObserver(&mutelist_listener); - sMuteListListener_listening = true; - } - - // Set up the friends list observer if it hasn't been set up already. - if(friendslist_listener == NULL) - { - friendslist_listener = new LLVoiceClientFriendsObserver; - LLAvatarTracker::instance().addObserver(friendslist_listener); - } - - // Set the initial state of mic mute, local speaker volume, etc. - { - std::ostringstream stream; - - buildLocalAudioUpdates(stream); - - if(!stream.str().empty()) - { - writeString(stream.str()); - } - } - -#if USE_SESSION_GROUPS - // create the main session group - sessionGroupCreateSendMessage(); - - setState(stateCreatingSessionGroup); -#else - // Not using session groups -- skip the stateCreatingSessionGroup state. - setState(stateNoChannel); - - // Initial kick-off of channel lookup logic - parcelChanged(); -#endif - break; - - //MARK: stateCreatingSessionGroup - case stateCreatingSessionGroup: - if(mSessionTerminateRequested || !mVoiceEnabled) - { - // TODO: Question: is this the right way out of this state - setState(stateSessionTerminated); - } - else if(!mMainSessionGroupHandle.empty()) - { - setState(stateNoChannel); - - // Start looped recording (needed for "panic button" anti-griefing tool) - recordingLoopStart(); - - // Initial kick-off of channel lookup logic - parcelChanged(); - } - break; - - //MARK: stateNoChannel - case stateNoChannel: - // Do this here as well as inside sendPositionalUpdate(). - // Otherwise, if you log in but don't join a proximal channel (such as when your login location has voice disabled), your friends list won't sync. - sendFriendsListUpdates(); - - if(mSessionTerminateRequested || !mVoiceEnabled) - { - // TODO: Question: Is this the right way out of this state? - setState(stateSessionTerminated); - } - else if(mTuningMode) - { - mTuningExitState = stateNoChannel; - setState(stateMicTuningStart); - } - else if(sessionNeedsRelog(mNextAudioSession)) - { - requestRelog(); - setState(stateSessionTerminated); - } - else if(mNextAudioSession) - { - sessionState *oldSession = mAudioSession; - - mAudioSession = mNextAudioSession; - if(!mAudioSession->mReconnect) - { - mNextAudioSession = NULL; - } - - // The old session may now need to be deleted. - reapSession(oldSession); - - if(!mAudioSession->mHandle.empty()) - { - // Connect to a session by session handle - - sessionMediaConnectSendMessage(mAudioSession); - } - else - { - // Connect to a session by URI - sessionCreateSendMessage(mAudioSession, true, false); - } - - notifyStatusObservers(LLVoiceClientStatusObserver::STATUS_JOINING); - setState(stateJoiningSession); - } - else if(!mSpatialSessionURI.empty()) - { - // If we're not headed elsewhere and have a spatial URI, return to spatial. - switchChannel(mSpatialSessionURI, true, false, false, mSpatialSessionCredentials); - } - break; - - //MARK: stateJoiningSession - case stateJoiningSession: // waiting for session handle - // joinedAudioSession() will transition from here to stateSessionJoined. - if(!mVoiceEnabled) - { - // User bailed out during connect -- jump straight to teardown. - setState(stateSessionTerminated); - } - else if(mSessionTerminateRequested) - { - if(mAudioSession && !mAudioSession->mHandle.empty()) - { - // Only allow direct exits from this state in p2p calls (for cancelling an invite). - // Terminating a half-connected session on other types of calls seems to break something in the vivox gateway. - if(mAudioSession->mIsP2P) - { - sessionMediaDisconnectSendMessage(mAudioSession); - setState(stateSessionTerminated); - } - } - } - break; - - //MARK: stateSessionJoined - case stateSessionJoined: // session handle received - // It appears that I need to wait for BOTH the SessionGroup.AddSession response and the SessionStateChangeEvent with state 4 - // before continuing from this state. They can happen in either order, and if I don't wait for both, things can get stuck. - // For now, the SessionGroup.AddSession response handler sets mSessionHandle and the SessionStateChangeEvent handler transitions to stateSessionJoined. - // This is a cheap way to make sure both have happened before proceeding. - if(mAudioSession && mAudioSession->mVoiceEnabled) - { - // Dirty state that may need to be sync'ed with the daemon. - mPTTDirty = true; - mSpeakerVolumeDirty = true; - mSpatialCoordsDirty = true; - - setState(stateRunning); - - // Start the throttle timer - mUpdateTimer.start(); - mUpdateTimer.setTimerExpirySec(UPDATE_THROTTLE_SECONDS); - - // Events that need to happen when a session is joined could go here. - // Maybe send initial spatial data? - notifyStatusObservers(LLVoiceClientStatusObserver::STATUS_JOINED); - - } - else if(!mVoiceEnabled) - { - // User bailed out during connect -- jump straight to teardown. - setState(stateSessionTerminated); - } - else if(mSessionTerminateRequested) - { - // Only allow direct exits from this state in p2p calls (for cancelling an invite). - // Terminating a half-connected session on other types of calls seems to break something in the vivox gateway. - if(mAudioSession && mAudioSession->mIsP2P) - { - sessionMediaDisconnectSendMessage(mAudioSession); - setState(stateSessionTerminated); - } - } - break; - - //MARK: stateRunning - case stateRunning: // steady state - // Disabling voice or disconnect requested. - if(!mVoiceEnabled || mSessionTerminateRequested) - { - leaveAudioSession(); - } - else - { - - // Figure out whether the PTT state needs to change - { - bool newPTT; - if(mUsePTT) - { - // If configured to use PTT, track the user state. - newPTT = mUserPTTState; - } - else - { - // If not configured to use PTT, it should always be true (otherwise the user will be unable to speak). - newPTT = true; - } - - if(mMuteMic) - { - // This always overrides any other PTT setting. - newPTT = false; - } - - // Dirty if state changed. - if(newPTT != mPTT) - { - mPTT = newPTT; - mPTTDirty = true; - } - } - - if(!inSpatialChannel()) - { - // When in a non-spatial channel, never send positional updates. - mSpatialCoordsDirty = false; - } - else - { - // Do the calculation that enforces the listener<->speaker tether (and also updates the real camera position) - enforceTether(); - } - - // Send an update if the ptt state has changed (which shouldn't be able to happen that often -- the user can only click so fast) - // or every 10hz, whichever is sooner. - if((mAudioSession && mAudioSession->mVolumeDirty) || mPTTDirty || mSpeakerVolumeDirty || mUpdateTimer.hasExpired()) - { - mUpdateTimer.setTimerExpirySec(UPDATE_THROTTLE_SECONDS); - sendPositionalUpdate(); - } - } - break; - - //MARK: stateLeavingSession - case stateLeavingSession: // waiting for terminate session response - // The handler for the Session.Terminate response will transition from here to stateSessionTerminated. - break; - - //MARK: stateSessionTerminated - case stateSessionTerminated: - - // Must do this first, since it uses mAudioSession. - notifyStatusObservers(LLVoiceClientStatusObserver::STATUS_LEFT_CHANNEL); - - if(mAudioSession) - { - sessionState *oldSession = mAudioSession; - - mAudioSession = NULL; - // We just notified status observers about this change. Don't do it again. - mAudioSessionChanged = false; - - // The old session may now need to be deleted. - reapSession(oldSession); - } - else - { - LL_WARNS("Voice") << "stateSessionTerminated with NULL mAudioSession" << LL_ENDL; - } - - // Always reset the terminate request flag when we get here. - mSessionTerminateRequested = false; - - if(mVoiceEnabled && !mRelogRequested) - { - // Just leaving a channel, go back to stateNoChannel (the "logged in but have no channel" state). - setState(stateNoChannel); - } - else - { - // Shutting down voice, continue with disconnecting. - logout(); - - // The state machine will take it from here - mRelogRequested = false; - } - - break; - - //MARK: stateLoggingOut - case stateLoggingOut: // waiting for logout response - // The handler for the AccountLoginStateChangeEvent will transition from here to stateLoggedOut. - break; - - //MARK: stateLoggedOut - case stateLoggedOut: // logout response received - - // Once we're logged out, all these things are invalid. - mAccountHandle.clear(); - deleteAllSessions(); - deleteAllBuddies(); - - if(mVoiceEnabled && !mRelogRequested) - { - // User was logged out, but wants to be logged in. Send a new login request. - setState(stateNeedsLogin); - } - else - { - // shut down the connector - connectorShutdown(); - } - break; - - //MARK: stateConnectorStopping - case stateConnectorStopping: // waiting for connector stop - // The handler for the Connector.InitiateShutdown response will transition from here to stateConnectorStopped. - break; - - //MARK: stateConnectorStopped - case stateConnectorStopped: // connector stop received - setState(stateDisableCleanup); - break; - - //MARK: stateConnectorFailed - case stateConnectorFailed: - setState(stateConnectorFailedWaiting); - break; - //MARK: stateConnectorFailedWaiting - case stateConnectorFailedWaiting: - if(!mVoiceEnabled) - { - setState(stateDisableCleanup); - } - break; - - //MARK: stateLoginFailed - case stateLoginFailed: - setState(stateLoginFailedWaiting); - break; - //MARK: stateLoginFailedWaiting - case stateLoginFailedWaiting: - if(!mVoiceEnabled) - { - setState(stateDisableCleanup); - } - break; - - //MARK: stateJoinSessionFailed - case stateJoinSessionFailed: - // Transition to error state. Send out any notifications here. - if(mAudioSession) - { - LL_WARNS("Voice") << "stateJoinSessionFailed: (" << mAudioSession->mErrorStatusCode << "): " << mAudioSession->mErrorStatusString << LL_ENDL; - } - else - { - LL_WARNS("Voice") << "stateJoinSessionFailed with no current session" << LL_ENDL; - } - - notifyStatusObservers(LLVoiceClientStatusObserver::ERROR_UNKNOWN); - setState(stateJoinSessionFailedWaiting); - break; - - //MARK: stateJoinSessionFailedWaiting - case stateJoinSessionFailedWaiting: - // Joining a channel failed, either due to a failed channel name -> sip url lookup or an error from the join message. - // Region crossings may leave this state and try the join again. - if(mSessionTerminateRequested) - { - setState(stateSessionTerminated); - } - break; - - //MARK: stateJail - case stateJail: - // We have given up. Do nothing. - break; - - } - - if(mAudioSession && mAudioSession->mParticipantsChanged) - { - mAudioSession->mParticipantsChanged = false; - mAudioSessionChanged = true; - } - - if(mAudioSessionChanged) - { - mAudioSessionChanged = false; - notifyParticipantObservers(); - } -} - -void LLVoiceClient::closeSocket(void) -{ - mSocket.reset(); - mConnected = false; -} - -void LLVoiceClient::loginSendMessage() -{ - std::ostringstream stream; - - bool autoPostCrashDumps = gSavedSettings.getBOOL("VivoxAutoPostCrashDumps"); - - stream - << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.Login.1\">" - << "<ConnectorHandle>" << mConnectorHandle << "</ConnectorHandle>" - << "<AccountName>" << mAccountName << "</AccountName>" - << "<AccountPassword>" << mAccountPassword << "</AccountPassword>" - << "<AudioSessionAnswerMode>VerifyAnswer</AudioSessionAnswerMode>" - << "<EnableBuddiesAndPresence>true</EnableBuddiesAndPresence>" - << "<BuddyManagementMode>Application</BuddyManagementMode>" - << "<ParticipantPropertyFrequency>5</ParticipantPropertyFrequency>" - << (autoPostCrashDumps?"<AutopostCrashDumps>true</AutopostCrashDumps>":"") - << "</Request>\n\n\n"; - - writeString(stream.str()); -} - -void LLVoiceClient::logout() -{ - // Ensure that we'll re-request provisioning before logging in again - mAccountPassword.clear(); - mVoiceAccountServerURI.clear(); - - setState(stateLoggingOut); - logoutSendMessage(); -} - -void LLVoiceClient::logoutSendMessage() -{ - if(!mAccountHandle.empty()) - { - std::ostringstream stream; - stream - << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.Logout.1\">" - << "<AccountHandle>" << mAccountHandle << "</AccountHandle>" - << "</Request>" - << "\n\n\n"; - - mAccountHandle.clear(); - writeString(stream.str()); - } -} -void LLVoiceClient::accountListBlockRulesSendMessage() -{ - if(!mAccountHandle.empty()) - { - std::ostringstream stream; - - LL_DEBUGS("Voice") << "requesting block rules" << LL_ENDL; - - stream - << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.ListBlockRules.1\">" - << "<AccountHandle>" << mAccountHandle << "</AccountHandle>" - << "</Request>" - << "\n\n\n"; - - writeString(stream.str()); - } -} - -void LLVoiceClient::accountListAutoAcceptRulesSendMessage() -{ - if(!mAccountHandle.empty()) - { - std::ostringstream stream; - - LL_DEBUGS("Voice") << "requesting auto-accept rules" << LL_ENDL; - - stream - << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.ListAutoAcceptRules.1\">" - << "<AccountHandle>" << mAccountHandle << "</AccountHandle>" - << "</Request>" - << "\n\n\n"; - - writeString(stream.str()); - } -} - -void LLVoiceClient::sessionGroupCreateSendMessage() -{ - if(!mAccountHandle.empty()) - { - std::ostringstream stream; - - LL_DEBUGS("Voice") << "creating session group" << LL_ENDL; - - stream - << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"SessionGroup.Create.1\">" - << "<AccountHandle>" << mAccountHandle << "</AccountHandle>" - << "<Type>Normal</Type>" - << "</Request>" - << "\n\n\n"; - - writeString(stream.str()); - } -} - -void LLVoiceClient::sessionCreateSendMessage(sessionState *session, bool startAudio, bool startText) -{ - LL_DEBUGS("Voice") << "requesting create: " << session->mSIPURI << LL_ENDL; - - session->mCreateInProgress = true; - if(startAudio) - { - session->mMediaConnectInProgress = true; - } - - std::ostringstream stream; - stream - << "<Request requestId=\"" << session->mSIPURI << "\" action=\"Session.Create.1\">" - << "<AccountHandle>" << mAccountHandle << "</AccountHandle>" - << "<URI>" << session->mSIPURI << "</URI>"; - - static const std::string allowed_chars = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" - "0123456789" - "-._~"; - - if(!session->mHash.empty()) - { - stream - << "<Password>" << LLURI::escape(session->mHash, allowed_chars) << "</Password>" - << "<PasswordHashAlgorithm>SHA1UserName</PasswordHashAlgorithm>"; - } - - stream - << "<ConnectAudio>" << (startAudio?"true":"false") << "</ConnectAudio>" - << "<ConnectText>" << (startText?"true":"false") << "</ConnectText>" - << "<Name>" << mChannelName << "</Name>" - << "</Request>\n\n\n"; - writeString(stream.str()); -} - -void LLVoiceClient::sessionGroupAddSessionSendMessage(sessionState *session, bool startAudio, bool startText) -{ - LL_DEBUGS("Voice") << "requesting create: " << session->mSIPURI << LL_ENDL; - - session->mCreateInProgress = true; - if(startAudio) - { - session->mMediaConnectInProgress = true; - } - - std::string password; - if(!session->mHash.empty()) - { - static const std::string allowed_chars = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" - "0123456789" - "-._~" - ; - password = LLURI::escape(session->mHash, allowed_chars); - } - - std::ostringstream stream; - stream - << "<Request requestId=\"" << session->mSIPURI << "\" action=\"SessionGroup.AddSession.1\">" - << "<SessionGroupHandle>" << session->mGroupHandle << "</SessionGroupHandle>" - << "<URI>" << session->mSIPURI << "</URI>" - << "<Name>" << mChannelName << "</Name>" - << "<ConnectAudio>" << (startAudio?"true":"false") << "</ConnectAudio>" - << "<ConnectText>" << (startText?"true":"false") << "</ConnectText>" - << "<Password>" << password << "</Password>" - << "<PasswordHashAlgorithm>SHA1UserName</PasswordHashAlgorithm>" - << "</Request>\n\n\n" - ; - - writeString(stream.str()); -} +/////////////////////////////////////////////////////////////////////////////////////////////// -void LLVoiceClient::sessionMediaConnectSendMessage(sessionState *session) +LLVoiceClient::LLVoiceClient() + : + mVoiceModule(NULL), + m_servicePump(NULL), + mVoiceEffectEnabled(LLCachedControl<bool>(gSavedSettings, "VoiceMorphingEnabled")), + mVoiceEffectDefault(LLCachedControl<std::string>(gSavedPerAccountSettings, "VoiceEffectDefault")) { - LL_DEBUGS("Voice") << "connecting audio to session handle: " << session->mHandle << LL_ENDL; - - session->mMediaConnectInProgress = true; - - std::ostringstream stream; - - stream - << "<Request requestId=\"" << session->mHandle << "\" action=\"Session.MediaConnect.1\">" - << "<SessionGroupHandle>" << session->mGroupHandle << "</SessionGroupHandle>" - << "<SessionHandle>" << session->mHandle << "</SessionHandle>" - << "<Media>Audio</Media>" - << "</Request>\n\n\n"; - - writeString(stream.str()); } -void LLVoiceClient::sessionTextConnectSendMessage(sessionState *session) -{ - LL_DEBUGS("Voice") << "connecting text to session handle: " << session->mHandle << LL_ENDL; - - std::ostringstream stream; - - stream - << "<Request requestId=\"" << session->mHandle << "\" action=\"Session.TextConnect.1\">" - << "<SessionGroupHandle>" << session->mGroupHandle << "</SessionGroupHandle>" - << "<SessionHandle>" << session->mHandle << "</SessionHandle>" - << "</Request>\n\n\n"; - - writeString(stream.str()); -} +//--------------------------------------------------- +// Basic setup/shutdown -void LLVoiceClient::sessionTerminate() +LLVoiceClient::~LLVoiceClient() { - mSessionTerminateRequested = true; } -void LLVoiceClient::requestRelog() +void LLVoiceClient::init(LLPumpIO *pump) { - mSessionTerminateRequested = true; - mRelogRequested = true; + // Initialize all of the voice modules + m_servicePump = pump; } - -void LLVoiceClient::leaveAudioSession() +void LLVoiceClient::userAuthorized(const std::string& user_id, const LLUUID &agentID) { - if(mAudioSession) + // In the future, we should change this to allow voice module registration + // with a table lookup of sorts. + std::string voice_server = gSavedSettings.getString("VoiceServerType"); + LL_DEBUGS("Voice") << "voice server type " << voice_server << LL_ENDL; + if(voice_server == "vivox") { - LL_DEBUGS("Voice") << "leaving session: " << mAudioSession->mSIPURI << LL_ENDL; - - switch(getState()) - { - case stateNoChannel: - // In this case, we want to pretend the join failed so our state machine doesn't get stuck. - // Skip the join failed transition state so we don't send out error notifications. - setState(stateJoinSessionFailedWaiting); - break; - case stateJoiningSession: - case stateSessionJoined: - case stateRunning: - if(!mAudioSession->mHandle.empty()) - { - -#if RECORD_EVERYTHING - // HACK: for testing only - // Save looped recording - std::string savepath("/tmp/vivoxrecording"); - { - time_t now = time(NULL); - const size_t BUF_SIZE = 64; - char time_str[BUF_SIZE]; /* Flawfinder: ignore */ - - strftime(time_str, BUF_SIZE, "%Y-%m-%dT%H:%M:%SZ", gmtime(&now)); - savepath += time_str; - } - recordingLoopSave(savepath); -#endif - - sessionMediaDisconnectSendMessage(mAudioSession); - setState(stateLeavingSession); - } - else - { - LL_WARNS("Voice") << "called with no session handle" << LL_ENDL; - setState(stateSessionTerminated); - } - break; - case stateJoinSessionFailed: - case stateJoinSessionFailedWaiting: - setState(stateSessionTerminated); - break; - - default: - LL_WARNS("Voice") << "called from unknown state" << LL_ENDL; - break; - } + mVoiceModule = (LLVoiceModuleInterface *)LLVivoxVoiceClient::getInstance(); } else { - LL_WARNS("Voice") << "called with no active session" << LL_ENDL; - setState(stateSessionTerminated); + mVoiceModule = NULL; + return; } + mVoiceModule->init(m_servicePump); + mVoiceModule->userAuthorized(user_id, agentID); } -void LLVoiceClient::sessionTerminateSendMessage(sessionState *session) -{ - std::ostringstream stream; - - LL_DEBUGS("Voice") << "Sending Session.Terminate with handle " << session->mHandle << LL_ENDL; - stream - << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Session.Terminate.1\">" - << "<SessionHandle>" << session->mHandle << "</SessionHandle>" - << "</Request>\n\n\n"; - - writeString(stream.str()); -} -void LLVoiceClient::sessionGroupTerminateSendMessage(sessionState *session) -{ - std::ostringstream stream; - - LL_DEBUGS("Voice") << "Sending SessionGroup.Terminate with handle " << session->mGroupHandle << LL_ENDL; - stream - << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"SessionGroup.Terminate.1\">" - << "<SessionGroupHandle>" << session->mGroupHandle << "</SessionGroupHandle>" - << "</Request>\n\n\n"; - - writeString(stream.str()); -} - -void LLVoiceClient::sessionMediaDisconnectSendMessage(sessionState *session) -{ - std::ostringstream stream; - - LL_DEBUGS("Voice") << "Sending Session.MediaDisconnect with handle " << session->mHandle << LL_ENDL; - stream - << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Session.MediaDisconnect.1\">" - << "<SessionGroupHandle>" << session->mGroupHandle << "</SessionGroupHandle>" - << "<SessionHandle>" << session->mHandle << "</SessionHandle>" - << "<Media>Audio</Media>" - << "</Request>\n\n\n"; - - writeString(stream.str()); - -} - -void LLVoiceClient::sessionTextDisconnectSendMessage(sessionState *session) -{ - std::ostringstream stream; - - LL_DEBUGS("Voice") << "Sending Session.TextDisconnect with handle " << session->mHandle << LL_ENDL; - stream - << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Session.TextDisconnect.1\">" - << "<SessionGroupHandle>" << session->mGroupHandle << "</SessionGroupHandle>" - << "<SessionHandle>" << session->mHandle << "</SessionHandle>" - << "</Request>\n\n\n"; - - writeString(stream.str()); -} - -void LLVoiceClient::getCaptureDevicesSendMessage() -{ - std::ostringstream stream; - stream - << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Aux.GetCaptureDevices.1\">" - << "</Request>\n\n\n"; - - writeString(stream.str()); -} - -void LLVoiceClient::getRenderDevicesSendMessage() -{ - std::ostringstream stream; - stream - << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Aux.GetRenderDevices.1\">" - << "</Request>\n\n\n"; - - writeString(stream.str()); -} - -void LLVoiceClient::clearCaptureDevices() -{ - LL_DEBUGS("Voice") << "called" << LL_ENDL; - mCaptureDevices.clear(); -} - -void LLVoiceClient::addCaptureDevice(const std::string& name) -{ - LL_DEBUGS("Voice") << name << LL_ENDL; - - mCaptureDevices.push_back(name); -} - -LLVoiceClient::deviceList *LLVoiceClient::getCaptureDevices() +void LLVoiceClient::terminate() { - return &mCaptureDevices; + if (mVoiceModule) mVoiceModule->terminate(); + mVoiceModule = NULL; } -void LLVoiceClient::setCaptureDevice(const std::string& name) +const LLVoiceVersionInfo LLVoiceClient::getVersion() { - if(name == "Default") + if (mVoiceModule) { - if(!mCaptureDevice.empty()) - { - mCaptureDevice.clear(); - mCaptureDeviceDirty = true; - } + return mVoiceModule->getVersion(); } else { - if(mCaptureDevice != name) - { - mCaptureDevice = name; - mCaptureDeviceDirty = true; - } + LLVoiceVersionInfo result; + result.serverVersion = std::string(); + result.serverType = std::string(); + return result; } } -void LLVoiceClient::clearRenderDevices() -{ - LL_DEBUGS("Voice") << "called" << LL_ENDL; - mRenderDevices.clear(); -} - -void LLVoiceClient::addRenderDevice(const std::string& name) -{ - LL_DEBUGS("Voice") << name << LL_ENDL; - mRenderDevices.push_back(name); -} - -LLVoiceClient::deviceList *LLVoiceClient::getRenderDevices() +void LLVoiceClient::updateSettings() { - return &mRenderDevices; + if (mVoiceModule) mVoiceModule->updateSettings(); } -void LLVoiceClient::setRenderDevice(const std::string& name) -{ - if(name == "Default") - { - if(!mRenderDevice.empty()) - { - mRenderDevice.clear(); - mRenderDeviceDirty = true; - } - } - else - { - if(mRenderDevice != name) - { - mRenderDevice = name; - mRenderDeviceDirty = true; - } - } - -} +//-------------------------------------------------- +// tuning void LLVoiceClient::tuningStart() { - mTuningMode = true; - if(getState() >= stateNoChannel) - { - sessionTerminate(); - } + if (mVoiceModule) mVoiceModule->tuningStart(); } void LLVoiceClient::tuningStop() { - mTuningMode = false; + if (mVoiceModule) mVoiceModule->tuningStop(); } bool LLVoiceClient::inTuningMode() { - bool result = false; - switch(getState()) - { - case stateMicTuningRunning: - result = true; - break; - default: - break; - } - return result; -} - -void LLVoiceClient::tuningRenderStartSendMessage(const std::string& name, bool loop) -{ - mTuningAudioFile = name; - std::ostringstream stream; - stream - << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Aux.RenderAudioStart.1\">" - << "<SoundFilePath>" << mTuningAudioFile << "</SoundFilePath>" - << "<Loop>" << (loop?"1":"0") << "</Loop>" - << "</Request>\n\n\n"; - - writeString(stream.str()); -} - -void LLVoiceClient::tuningRenderStopSendMessage() -{ - std::ostringstream stream; - stream - << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Aux.RenderAudioStop.1\">" - << "<SoundFilePath>" << mTuningAudioFile << "</SoundFilePath>" - << "</Request>\n\n\n"; - - writeString(stream.str()); -} - -void LLVoiceClient::tuningCaptureStartSendMessage(int duration) -{ - LL_DEBUGS("Voice") << "sending CaptureAudioStart" << LL_ENDL; - - std::ostringstream stream; - stream - << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Aux.CaptureAudioStart.1\">" - << "<Duration>" << duration << "</Duration>" - << "</Request>\n\n\n"; - - writeString(stream.str()); -} - -void LLVoiceClient::tuningCaptureStopSendMessage() -{ - LL_DEBUGS("Voice") << "sending CaptureAudioStop" << LL_ENDL; - - std::ostringstream stream; - stream - << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Aux.CaptureAudioStop.1\">" - << "</Request>\n\n\n"; - - writeString(stream.str()); - - mTuningEnergy = 0.0f; -} - -void LLVoiceClient::tuningSetMicVolume(float volume) -{ - int scaled_volume = scale_mic_volume(volume); - - if(scaled_volume != mTuningMicVolume) - { - mTuningMicVolume = scaled_volume; - mTuningMicVolumeDirty = true; - } -} - -void LLVoiceClient::tuningSetSpeakerVolume(float volume) -{ - int scaled_volume = scale_speaker_volume(volume); - - if(scaled_volume != mTuningSpeakerVolume) + if (mVoiceModule) { - mTuningSpeakerVolume = scaled_volume; - mTuningSpeakerVolumeDirty = true; + return mVoiceModule->inTuningMode(); } -} - -float LLVoiceClient::tuningGetEnergy(void) -{ - return mTuningEnergy; -} - -bool LLVoiceClient::deviceSettingsAvailable() -{ - bool result = true; - - if(!mConnected) - result = false; - - if(mRenderDevices.empty()) - result = false; - - return result; -} - -void LLVoiceClient::refreshDeviceLists(bool clearCurrentList) -{ - if(clearCurrentList) - { - clearCaptureDevices(); - clearRenderDevices(); - } - getCaptureDevicesSendMessage(); - getRenderDevicesSendMessage(); -} - -void LLVoiceClient::daemonDied() -{ - // The daemon died, so the connection is gone. Reset everything and start over. - LL_WARNS("Voice") << "Connection to vivox daemon lost. Resetting state."<< LL_ENDL; - - // Try to relaunch the daemon - setState(stateDisableCleanup); -} - -void LLVoiceClient::giveUp() -{ - // All has failed. Clean up and stop trying. - closeSocket(); - deleteAllSessions(); - deleteAllBuddies(); - - setState(stateJail); -} - -static void oldSDKTransform (LLVector3 &left, LLVector3 &up, LLVector3 &at, LLVector3d &pos, LLVector3 &vel) -{ - F32 nat[3], nup[3], nl[3], nvel[3]; // the new at, up, left vectors and the new position and velocity - F64 npos[3]; - - // The original XML command was sent like this: - /* - << "<Position>" - << "<X>" << pos[VX] << "</X>" - << "<Y>" << pos[VZ] << "</Y>" - << "<Z>" << pos[VY] << "</Z>" - << "</Position>" - << "<Velocity>" - << "<X>" << mAvatarVelocity[VX] << "</X>" - << "<Y>" << mAvatarVelocity[VZ] << "</Y>" - << "<Z>" << mAvatarVelocity[VY] << "</Z>" - << "</Velocity>" - << "<AtOrientation>" - << "<X>" << l.mV[VX] << "</X>" - << "<Y>" << u.mV[VX] << "</Y>" - << "<Z>" << a.mV[VX] << "</Z>" - << "</AtOrientation>" - << "<UpOrientation>" - << "<X>" << l.mV[VZ] << "</X>" - << "<Y>" << u.mV[VY] << "</Y>" - << "<Z>" << a.mV[VZ] << "</Z>" - << "</UpOrientation>" - << "<LeftOrientation>" - << "<X>" << l.mV [VY] << "</X>" - << "<Y>" << u.mV [VZ] << "</Y>" - << "<Z>" << a.mV [VY] << "</Z>" - << "</LeftOrientation>"; - */ - -#if 1 - // This was the original transform done when building the XML command - nat[0] = left.mV[VX]; - nat[1] = up.mV[VX]; - nat[2] = at.mV[VX]; - - nup[0] = left.mV[VZ]; - nup[1] = up.mV[VY]; - nup[2] = at.mV[VZ]; - - nl[0] = left.mV[VY]; - nl[1] = up.mV[VZ]; - nl[2] = at.mV[VY]; - - npos[0] = pos.mdV[VX]; - npos[1] = pos.mdV[VZ]; - npos[2] = pos.mdV[VY]; - - nvel[0] = vel.mV[VX]; - nvel[1] = vel.mV[VZ]; - nvel[2] = vel.mV[VY]; - - for(int i=0;i<3;++i) { - at.mV[i] = nat[i]; - up.mV[i] = nup[i]; - left.mV[i] = nl[i]; - pos.mdV[i] = npos[i]; - } - - // This was the original transform done in the SDK - nat[0] = at.mV[2]; - nat[1] = 0; // y component of at vector is always 0, this was up[2] - nat[2] = -1 * left.mV[2]; - - // We override whatever the application gives us - nup[0] = 0; // x component of up vector is always 0 - nup[1] = 1; // y component of up vector is always 1 - nup[2] = 0; // z component of up vector is always 0 - - nl[0] = at.mV[0]; - nl[1] = 0; // y component of left vector is always zero, this was up[0] - nl[2] = -1 * left.mV[0]; - - npos[2] = pos.mdV[2] * -1.0; - npos[1] = pos.mdV[1]; - npos[0] = pos.mdV[0]; - - for(int i=0;i<3;++i) { - at.mV[i] = nat[i]; - up.mV[i] = nup[i]; - left.mV[i] = nl[i]; - pos.mdV[i] = npos[i]; - } -#else - // This is the compose of the two transforms (at least, that's what I'm trying for) - nat[0] = at.mV[VX]; - nat[1] = 0; // y component of at vector is always 0, this was up[2] - nat[2] = -1 * up.mV[VZ]; - - // We override whatever the application gives us - nup[0] = 0; // x component of up vector is always 0 - nup[1] = 1; // y component of up vector is always 1 - nup[2] = 0; // z component of up vector is always 0 - - nl[0] = left.mV[VX]; - nl[1] = 0; // y component of left vector is always zero, this was up[0] - nl[2] = -1 * left.mV[VY]; - - npos[0] = pos.mdV[VX]; - npos[1] = pos.mdV[VZ]; - npos[2] = pos.mdV[VY] * -1.0; - - nvel[0] = vel.mV[VX]; - nvel[1] = vel.mV[VZ]; - nvel[2] = vel.mV[VY]; - - for(int i=0;i<3;++i) { - at.mV[i] = nat[i]; - up.mV[i] = nup[i]; - left.mV[i] = nl[i]; - pos.mdV[i] = npos[i]; - } - -#endif -} - -void LLVoiceClient::sendPositionalUpdate(void) -{ - std::ostringstream stream; - - if(mSpatialCoordsDirty) - { - LLVector3 l, u, a, vel; - LLVector3d pos; - - mSpatialCoordsDirty = false; - - // Always send both speaker and listener positions together. - stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Session.Set3DPosition.1\">" - << "<SessionHandle>" << getAudioSessionHandle() << "</SessionHandle>"; - - stream << "<SpeakerPosition>"; - -// LL_DEBUGS("Voice") << "Sending speaker position " << mAvatarPosition << LL_ENDL; - l = mAvatarRot.getLeftRow(); - u = mAvatarRot.getUpRow(); - a = mAvatarRot.getFwdRow(); - pos = mAvatarPosition; - vel = mAvatarVelocity; - - // SLIM SDK: the old SDK was doing a transform on the passed coordinates that the new one doesn't do anymore. - // The old transform is replicated by this function. - oldSDKTransform(l, u, a, pos, vel); - - stream - << "<Position>" - << "<X>" << pos.mdV[VX] << "</X>" - << "<Y>" << pos.mdV[VY] << "</Y>" - << "<Z>" << pos.mdV[VZ] << "</Z>" - << "</Position>" - << "<Velocity>" - << "<X>" << vel.mV[VX] << "</X>" - << "<Y>" << vel.mV[VY] << "</Y>" - << "<Z>" << vel.mV[VZ] << "</Z>" - << "</Velocity>" - << "<AtOrientation>" - << "<X>" << a.mV[VX] << "</X>" - << "<Y>" << a.mV[VY] << "</Y>" - << "<Z>" << a.mV[VZ] << "</Z>" - << "</AtOrientation>" - << "<UpOrientation>" - << "<X>" << u.mV[VX] << "</X>" - << "<Y>" << u.mV[VY] << "</Y>" - << "<Z>" << u.mV[VZ] << "</Z>" - << "</UpOrientation>" - << "<LeftOrientation>" - << "<X>" << l.mV [VX] << "</X>" - << "<Y>" << l.mV [VY] << "</Y>" - << "<Z>" << l.mV [VZ] << "</Z>" - << "</LeftOrientation>"; - - stream << "</SpeakerPosition>"; - - stream << "<ListenerPosition>"; - - LLVector3d earPosition; - LLVector3 earVelocity; - LLMatrix3 earRot; - - switch(mEarLocation) - { - case earLocCamera: - default: - earPosition = mCameraPosition; - earVelocity = mCameraVelocity; - earRot = mCameraRot; - break; - - case earLocAvatar: - earPosition = mAvatarPosition; - earVelocity = mAvatarVelocity; - earRot = mAvatarRot; - break; - - case earLocMixed: - earPosition = mAvatarPosition; - earVelocity = mAvatarVelocity; - earRot = mCameraRot; - break; - } - - l = earRot.getLeftRow(); - u = earRot.getUpRow(); - a = earRot.getFwdRow(); - pos = earPosition; - vel = earVelocity; - -// LL_DEBUGS("Voice") << "Sending listener position " << earPosition << LL_ENDL; - - oldSDKTransform(l, u, a, pos, vel); - - stream - << "<Position>" - << "<X>" << pos.mdV[VX] << "</X>" - << "<Y>" << pos.mdV[VY] << "</Y>" - << "<Z>" << pos.mdV[VZ] << "</Z>" - << "</Position>" - << "<Velocity>" - << "<X>" << vel.mV[VX] << "</X>" - << "<Y>" << vel.mV[VY] << "</Y>" - << "<Z>" << vel.mV[VZ] << "</Z>" - << "</Velocity>" - << "<AtOrientation>" - << "<X>" << a.mV[VX] << "</X>" - << "<Y>" << a.mV[VY] << "</Y>" - << "<Z>" << a.mV[VZ] << "</Z>" - << "</AtOrientation>" - << "<UpOrientation>" - << "<X>" << u.mV[VX] << "</X>" - << "<Y>" << u.mV[VY] << "</Y>" - << "<Z>" << u.mV[VZ] << "</Z>" - << "</UpOrientation>" - << "<LeftOrientation>" - << "<X>" << l.mV [VX] << "</X>" - << "<Y>" << l.mV [VY] << "</Y>" - << "<Z>" << l.mV [VZ] << "</Z>" - << "</LeftOrientation>"; - - - stream << "</ListenerPosition>"; - - stream << "</Request>\n\n\n"; - } - - if(mAudioSession && mAudioSession->mVolumeDirty) - { - participantMap::iterator iter = mAudioSession->mParticipantsByURI.begin(); - - mAudioSession->mVolumeDirty = false; - - for(; iter != mAudioSession->mParticipantsByURI.end(); iter++) - { - participantState *p = iter->second; - - if(p->mVolumeDirty) - { - // Can't set volume/mute for yourself - if(!p->mIsSelf) - { - int volume = 56; // nominal default value - bool mute = p->mOnMuteList; - - if(p->mUserVolume != -1) - { - // scale from user volume in the range 0-400 (with 100 as "normal") to vivox volume in the range 0-100 (with 56 as "normal") - if(p->mUserVolume < 100) - volume = (p->mUserVolume * 56) / 100; - else - volume = (((p->mUserVolume - 100) * (100 - 56)) / 300) + 56; - } - else if(p->mVolume != -1) - { - // Use the previously reported internal volume (comes in with a ParticipantUpdatedEvent) - volume = p->mVolume; - } - - - if(mute) - { - // SetParticipantMuteForMe doesn't work in p2p sessions. - // If we want the user to be muted, set their volume to 0 as well. - // This isn't perfect, but it will at least reduce their volume to a minimum. - volume = 0; - } - - if(volume == 0) - mute = true; - - LL_DEBUGS("Voice") << "Setting volume/mute for avatar " << p->mAvatarID << " to " << volume << (mute?"/true":"/false") << LL_ENDL; - - // SLIM SDK: Send both volume and mute commands. - - // Send a "volume for me" command for the user. - stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Session.SetParticipantVolumeForMe.1\">" - << "<SessionHandle>" << getAudioSessionHandle() << "</SessionHandle>" - << "<ParticipantURI>" << p->mURI << "</ParticipantURI>" - << "<Volume>" << volume << "</Volume>" - << "</Request>\n\n\n"; - - if(!mAudioSession->mIsP2P) - { - // Send a "mute for me" command for the user - // Doesn't work in P2P sessions - stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Session.SetParticipantMuteForMe.1\">" - << "<SessionHandle>" << getAudioSessionHandle() << "</SessionHandle>" - << "<ParticipantURI>" << p->mURI << "</ParticipantURI>" - << "<Mute>" << (mute?"1":"0") << "</Mute>" - << "<Scope>Audio</Scope>" - << "</Request>\n\n\n"; - } - } - - p->mVolumeDirty = false; - } - } - } - - buildLocalAudioUpdates(stream); - - if(!stream.str().empty()) + else { - writeString(stream.str()); + return false; } - - // Friends list updates can be huge, especially on the first voice login of an account with lots of friends. - // Batching them all together can choke SLVoice, so send them in separate writes. - sendFriendsListUpdates(); } -void LLVoiceClient::buildSetCaptureDevice(std::ostringstream &stream) +void LLVoiceClient::tuningSetMicVolume(float volume) { - if(mCaptureDeviceDirty) - { - LL_DEBUGS("Voice") << "Setting input device = \"" << mCaptureDevice << "\"" << LL_ENDL; - - stream - << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Aux.SetCaptureDevice.1\">" - << "<CaptureDeviceSpecifier>" << mCaptureDevice << "</CaptureDeviceSpecifier>" - << "</Request>" - << "\n\n\n"; - - mCaptureDeviceDirty = false; - } + if (mVoiceModule) mVoiceModule->tuningSetMicVolume(volume); } -void LLVoiceClient::buildSetRenderDevice(std::ostringstream &stream) +void LLVoiceClient::tuningSetSpeakerVolume(float volume) { - if(mRenderDeviceDirty) - { - LL_DEBUGS("Voice") << "Setting output device = \"" << mRenderDevice << "\"" << LL_ENDL; - - stream - << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Aux.SetRenderDevice.1\">" - << "<RenderDeviceSpecifier>" << mRenderDevice << "</RenderDeviceSpecifier>" - << "</Request>" - << "\n\n\n"; - mRenderDeviceDirty = false; - } + if (mVoiceModule) mVoiceModule->tuningSetSpeakerVolume(volume); } -void LLVoiceClient::buildLocalAudioUpdates(std::ostringstream &stream) -{ - buildSetCaptureDevice(stream); - - buildSetRenderDevice(stream); - - if(mPTTDirty) - { - mPTTDirty = false; - - // Send a local mute command. - // NOTE that the state of "PTT" is the inverse of "local mute". - // (i.e. when PTT is true, we send a mute command with "false", and vice versa) - - LL_DEBUGS("Voice") << "Sending MuteLocalMic command with parameter " << (mPTT?"false":"true") << LL_ENDL; - - stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Connector.MuteLocalMic.1\">" - << "<ConnectorHandle>" << mConnectorHandle << "</ConnectorHandle>" - << "<Value>" << (mPTT?"false":"true") << "</Value>" - << "</Request>\n\n\n"; - - } - - if(mSpeakerMuteDirty) - { - const char *muteval = ((mSpeakerVolume <= scale_speaker_volume(0))?"true":"false"); - - mSpeakerMuteDirty = false; - - LL_INFOS("Voice") << "Setting speaker mute to " << muteval << LL_ENDL; - - stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Connector.MuteLocalSpeaker.1\">" - << "<ConnectorHandle>" << mConnectorHandle << "</ConnectorHandle>" - << "<Value>" << muteval << "</Value>" - << "</Request>\n\n\n"; - - } - - if(mSpeakerVolumeDirty) - { - mSpeakerVolumeDirty = false; - - LL_INFOS("Voice") << "Setting speaker volume to " << mSpeakerVolume << LL_ENDL; - - stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Connector.SetLocalSpeakerVolume.1\">" - << "<ConnectorHandle>" << mConnectorHandle << "</ConnectorHandle>" - << "<Value>" << mSpeakerVolume << "</Value>" - << "</Request>\n\n\n"; - - } - - if(mMicVolumeDirty) - { - mMicVolumeDirty = false; - - LL_INFOS("Voice") << "Setting mic volume to " << mMicVolume << LL_ENDL; - - stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Connector.SetLocalMicVolume.1\">" - << "<ConnectorHandle>" << mConnectorHandle << "</ConnectorHandle>" - << "<Value>" << mMicVolume << "</Value>" - << "</Request>\n\n\n"; - } - - -} - -void LLVoiceClient::checkFriend(const LLUUID& id) +float LLVoiceClient::tuningGetEnergy(void) { - std::string name; - buddyListEntry *buddy = findBuddy(id); - - // Make sure we don't add a name before it's been looked up. - if(gCacheName->getFullName(id, name)) + if (mVoiceModule) { - - const LLRelationship* relationInfo = LLAvatarTracker::instance().getBuddyInfo(id); - bool canSeeMeOnline = false; - if(relationInfo && relationInfo->isRightGrantedTo(LLRelationship::GRANT_ONLINE_STATUS)) - canSeeMeOnline = true; - - // When we get here, mNeedsSend is true and mInSLFriends is false. Change them as necessary. - - if(buddy) - { - // This buddy is already in both lists. - - if(name != buddy->mDisplayName) - { - // The buddy is in the list with the wrong name. Update it with the correct name. - LL_WARNS("Voice") << "Buddy " << id << " has wrong name (\"" << buddy->mDisplayName << "\" should be \"" << name << "\"), updating."<< LL_ENDL; - buddy->mDisplayName = name; - buddy->mNeedsNameUpdate = true; // This will cause the buddy to be resent. - } - } - else - { - // This buddy was not in the vivox list, needs to be added. - buddy = addBuddy(sipURIFromID(id), name); - buddy->mUUID = id; - } - - // In all the above cases, the buddy is in the SL friends list (which is how we got here). - buddy->mInSLFriends = true; - buddy->mCanSeeMeOnline = canSeeMeOnline; - buddy->mNameResolved = true; - + return mVoiceModule->tuningGetEnergy(); } else { - // This name hasn't been looked up yet. Don't do anything with this buddy list entry until it has. - if(buddy) - { - buddy->mNameResolved = false; - } - - // Initiate a lookup. - // The "lookup completed" callback will ensure that the friends list is rechecked after it completes. - lookupName(id); + return 0.0; } } -void LLVoiceClient::clearAllLists() -{ - // FOR TESTING ONLY - - // This will send the necessary commands to delete ALL buddies, autoaccept rules, and block rules SLVoice tells us about. - buddyListMap::iterator buddy_it; - for(buddy_it = mBuddyListMap.begin(); buddy_it != mBuddyListMap.end();) - { - buddyListEntry *buddy = buddy_it->second; - buddy_it++; - - std::ostringstream stream; - - if(buddy->mInVivoxBuddies) - { - // delete this entry from the vivox buddy list - buddy->mInVivoxBuddies = false; - LL_DEBUGS("Voice") << "delete " << buddy->mURI << " (" << buddy->mDisplayName << ")" << LL_ENDL; - stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.BuddyDelete.1\">" - << "<AccountHandle>" << mAccountHandle << "</AccountHandle>" - << "<BuddyURI>" << buddy->mURI << "</BuddyURI>" - << "</Request>\n\n\n"; - } - - if(buddy->mHasBlockListEntry) - { - // Delete the associated block list entry (so the block list doesn't fill up with junk) - buddy->mHasBlockListEntry = false; - stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.DeleteBlockRule.1\">" - << "<AccountHandle>" << mAccountHandle << "</AccountHandle>" - << "<BlockMask>" << buddy->mURI << "</BlockMask>" - << "</Request>\n\n\n"; - } - if(buddy->mHasAutoAcceptListEntry) - { - // Delete the associated auto-accept list entry (so the auto-accept list doesn't fill up with junk) - buddy->mHasAutoAcceptListEntry = false; - stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.DeleteAutoAcceptRule.1\">" - << "<AccountHandle>" << mAccountHandle << "</AccountHandle>" - << "<AutoAcceptMask>" << buddy->mURI << "</AutoAcceptMask>" - << "</Request>\n\n\n"; - } - writeString(stream.str()); +//------------------------------------------------ +// devices - } -} - -void LLVoiceClient::sendFriendsListUpdates() +bool LLVoiceClient::deviceSettingsAvailable() { - if(mBuddyListMapPopulated && mBlockRulesListReceived && mAutoAcceptRulesListReceived && mFriendsListDirty) - { - mFriendsListDirty = false; - - if(0) - { - // FOR TESTING ONLY -- clear all buddy list, block list, and auto-accept list entries. - clearAllLists(); - return; - } - - LL_INFOS("Voice") << "Checking vivox buddy list against friends list..." << LL_ENDL; - - buddyListMap::iterator buddy_it; - for(buddy_it = mBuddyListMap.begin(); buddy_it != mBuddyListMap.end(); buddy_it++) - { - // reset the temp flags in the local buddy list - buddy_it->second->mInSLFriends = false; - } - - // correlate with the friends list - { - LLCollectAllBuddies collect; - LLAvatarTracker::instance().applyFunctor(collect); - LLCollectAllBuddies::buddy_map_t::const_iterator it = collect.mOnline.begin(); - LLCollectAllBuddies::buddy_map_t::const_iterator end = collect.mOnline.end(); - - for ( ; it != end; ++it) - { - checkFriend(it->second); - } - it = collect.mOffline.begin(); - end = collect.mOffline.end(); - for ( ; it != end; ++it) - { - checkFriend(it->second); - } - } - - LL_INFOS("Voice") << "Sending friend list updates..." << LL_ENDL; - - for(buddy_it = mBuddyListMap.begin(); buddy_it != mBuddyListMap.end();) - { - buddyListEntry *buddy = buddy_it->second; - buddy_it++; - - // Ignore entries that aren't resolved yet. - if(buddy->mNameResolved) - { - std::ostringstream stream; - - if(buddy->mInSLFriends && (!buddy->mInVivoxBuddies || buddy->mNeedsNameUpdate)) - { - if(mNumberOfAliases > 0) - { - // Add (or update) this entry in the vivox buddy list - buddy->mInVivoxBuddies = true; - buddy->mNeedsNameUpdate = false; - LL_DEBUGS("Voice") << "add/update " << buddy->mURI << " (" << buddy->mDisplayName << ")" << LL_ENDL; - stream - << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.BuddySet.1\">" - << "<AccountHandle>" << mAccountHandle << "</AccountHandle>" - << "<BuddyURI>" << buddy->mURI << "</BuddyURI>" - << "<DisplayName>" << buddy->mDisplayName << "</DisplayName>" - << "<BuddyData></BuddyData>" // Without this, SLVoice doesn't seem to parse the command. - << "<GroupID>0</GroupID>" - << "</Request>\n\n\n"; - } - } - else if(!buddy->mInSLFriends) - { - // This entry no longer exists in your SL friends list. Remove all traces of it from the Vivox buddy list. - if(buddy->mInVivoxBuddies) - { - // delete this entry from the vivox buddy list - buddy->mInVivoxBuddies = false; - LL_DEBUGS("Voice") << "delete " << buddy->mURI << " (" << buddy->mDisplayName << ")" << LL_ENDL; - stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.BuddyDelete.1\">" - << "<AccountHandle>" << mAccountHandle << "</AccountHandle>" - << "<BuddyURI>" << buddy->mURI << "</BuddyURI>" - << "</Request>\n\n\n"; - } - - if(buddy->mHasBlockListEntry) - { - // Delete the associated block list entry, if any - buddy->mHasBlockListEntry = false; - stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.DeleteBlockRule.1\">" - << "<AccountHandle>" << mAccountHandle << "</AccountHandle>" - << "<BlockMask>" << buddy->mURI << "</BlockMask>" - << "</Request>\n\n\n"; - } - if(buddy->mHasAutoAcceptListEntry) - { - // Delete the associated auto-accept list entry, if any - buddy->mHasAutoAcceptListEntry = false; - stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.DeleteAutoAcceptRule.1\">" - << "<AccountHandle>" << mAccountHandle << "</AccountHandle>" - << "<AutoAcceptMask>" << buddy->mURI << "</AutoAcceptMask>" - << "</Request>\n\n\n"; - } - } - - if(buddy->mInSLFriends) - { - - if(buddy->mCanSeeMeOnline) - { - // Buddy should not be blocked. - - // If this buddy doesn't already have either a block or autoaccept list entry, we'll update their status when we receive a SubscriptionEvent. - - // If the buddy has a block list entry, delete it. - if(buddy->mHasBlockListEntry) - { - buddy->mHasBlockListEntry = false; - stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.DeleteBlockRule.1\">" - << "<AccountHandle>" << mAccountHandle << "</AccountHandle>" - << "<BlockMask>" << buddy->mURI << "</BlockMask>" - << "</Request>\n\n\n"; - - - // If we just deleted a block list entry, add an auto-accept entry. - if(!buddy->mHasAutoAcceptListEntry) - { - buddy->mHasAutoAcceptListEntry = true; - stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.CreateAutoAcceptRule.1\">" - << "<AccountHandle>" << mAccountHandle << "</AccountHandle>" - << "<AutoAcceptMask>" << buddy->mURI << "</AutoAcceptMask>" - << "<AutoAddAsBuddy>0</AutoAddAsBuddy>" - << "</Request>\n\n\n"; - } - } - } - else - { - // Buddy should be blocked. - - // If this buddy doesn't already have either a block or autoaccept list entry, we'll update their status when we receive a SubscriptionEvent. - - // If this buddy has an autoaccept entry, delete it - if(buddy->mHasAutoAcceptListEntry) - { - buddy->mHasAutoAcceptListEntry = false; - stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.DeleteAutoAcceptRule.1\">" - << "<AccountHandle>" << mAccountHandle << "</AccountHandle>" - << "<AutoAcceptMask>" << buddy->mURI << "</AutoAcceptMask>" - << "</Request>\n\n\n"; - - // If we just deleted an auto-accept entry, add a block list entry. - if(!buddy->mHasBlockListEntry) - { - buddy->mHasBlockListEntry = true; - stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.CreateBlockRule.1\">" - << "<AccountHandle>" << mAccountHandle << "</AccountHandle>" - << "<BlockMask>" << buddy->mURI << "</BlockMask>" - << "<PresenceOnly>1</PresenceOnly>" - << "</Request>\n\n\n"; - } - } - } - - if(!buddy->mInSLFriends && !buddy->mInVivoxBuddies) - { - // Delete this entry from the local buddy list. This should NOT invalidate the iterator, - // since it has already been incremented to the next entry. - deleteBuddy(buddy->mURI); - } - - } - writeString(stream.str()); - } - } - } -} - -///////////////////////////// -// Response/Event handlers - -void LLVoiceClient::connectorCreateResponse(int statusCode, std::string &statusString, std::string &connectorHandle, std::string &versionID) -{ - if(statusCode != 0) - { - LL_WARNS("Voice") << "Connector.Create response failure: " << statusString << LL_ENDL; - setState(stateConnectorFailed); - } - else - { - // Connector created, move forward. - LL_INFOS("Voice") << "Connector.Create succeeded, Vivox SDK version is " << versionID << LL_ENDL; - mAPIVersion = versionID; - mConnectorHandle = connectorHandle; - if(getState() == stateConnectorStarting) - { - setState(stateConnectorStarted); - } - } -} - -void LLVoiceClient::loginResponse(int statusCode, std::string &statusString, std::string &accountHandle, int numberOfAliases) -{ - LL_DEBUGS("Voice") << "Account.Login response (" << statusCode << "): " << statusString << LL_ENDL; - - // Status code of 20200 means "bad password". We may want to special-case that at some point. - - if ( statusCode == 401 ) - { - // Login failure which is probably caused by the delay after a user's password being updated. - LL_INFOS("Voice") << "Account.Login response failure (" << statusCode << "): " << statusString << LL_ENDL; - setState(stateLoginRetry); - } - else if(statusCode != 0) + if (mVoiceModule) { - LL_WARNS("Voice") << "Account.Login response failure (" << statusCode << "): " << statusString << LL_ENDL; - setState(stateLoginFailed); + return mVoiceModule->deviceSettingsAvailable(); } else { - // Login succeeded, move forward. - mAccountHandle = accountHandle; - mNumberOfAliases = numberOfAliases; - // This needs to wait until the AccountLoginStateChangeEvent is received. -// if(getState() == stateLoggingIn) -// { -// setState(stateLoggedIn); -// } + return false; } } -void LLVoiceClient::sessionCreateResponse(std::string &requestId, int statusCode, std::string &statusString, std::string &sessionHandle) -{ - sessionState *session = findSessionBeingCreatedByURI(requestId); - - if(session) - { - session->mCreateInProgress = false; - } - - if(statusCode != 0) - { - LL_WARNS("Voice") << "Session.Create response failure (" << statusCode << "): " << statusString << LL_ENDL; - if(session) - { - session->mErrorStatusCode = statusCode; - session->mErrorStatusString = statusString; - if(session == mAudioSession) - { - setState(stateJoinSessionFailed); - } - else - { - reapSession(session); - } - } - } - else - { - LL_INFOS("Voice") << "Session.Create response received (success), session handle is " << sessionHandle << LL_ENDL; - if(session) - { - setSessionHandle(session, sessionHandle); - } - } -} - -void LLVoiceClient::sessionGroupAddSessionResponse(std::string &requestId, int statusCode, std::string &statusString, std::string &sessionHandle) -{ - sessionState *session = findSessionBeingCreatedByURI(requestId); - - if(session) - { - session->mCreateInProgress = false; - } - - if(statusCode != 0) - { - LL_WARNS("Voice") << "SessionGroup.AddSession response failure (" << statusCode << "): " << statusString << LL_ENDL; - if(session) - { - session->mErrorStatusCode = statusCode; - session->mErrorStatusString = statusString; - if(session == mAudioSession) - { - setState(stateJoinSessionFailed); - } - else - { - reapSession(session); - } - } - } - else - { - LL_DEBUGS("Voice") << "SessionGroup.AddSession response received (success), session handle is " << sessionHandle << LL_ENDL; - if(session) - { - setSessionHandle(session, sessionHandle); - } - } -} - -void LLVoiceClient::sessionConnectResponse(std::string &requestId, int statusCode, std::string &statusString) +void LLVoiceClient::refreshDeviceLists(bool clearCurrentList) { - sessionState *session = findSession(requestId); - if(statusCode != 0) - { - LL_WARNS("Voice") << "Session.Connect response failure (" << statusCode << "): " << statusString << LL_ENDL; - if(session) - { - session->mMediaConnectInProgress = false; - session->mErrorStatusCode = statusCode; - session->mErrorStatusString = statusString; - if(session == mAudioSession) - setState(stateJoinSessionFailed); - } - } - else - { - LL_DEBUGS("Voice") << "Session.Connect response received (success)" << LL_ENDL; - } + if (mVoiceModule) mVoiceModule->refreshDeviceLists(clearCurrentList); } -void LLVoiceClient::logoutResponse(int statusCode, std::string &statusString) -{ - if(statusCode != 0) - { - LL_WARNS("Voice") << "Account.Logout response failure: " << statusString << LL_ENDL; - // Should this ever fail? do we care if it does? - } -} - -void LLVoiceClient::connectorShutdownResponse(int statusCode, std::string &statusString) +void LLVoiceClient::setCaptureDevice(const std::string& name) { - if(statusCode != 0) - { - LL_WARNS("Voice") << "Connector.InitiateShutdown response failure: " << statusString << LL_ENDL; - // Should this ever fail? do we care if it does? - } + if (mVoiceModule) mVoiceModule->setCaptureDevice(name); - mConnected = false; - - if(getState() == stateConnectorStopping) - { - setState(stateConnectorStopped); - } } -void LLVoiceClient::sessionAddedEvent( - std::string &uriString, - std::string &alias, - std::string &sessionHandle, - std::string &sessionGroupHandle, - bool isChannel, - bool incoming, - std::string &nameString, - std::string &applicationString) +void LLVoiceClient::setRenderDevice(const std::string& name) { - sessionState *session = NULL; - - LL_INFOS("Voice") << "session " << uriString << ", alias " << alias << ", name " << nameString << " handle " << sessionHandle << LL_ENDL; - - session = addSession(uriString, sessionHandle); - if(session) - { - session->mGroupHandle = sessionGroupHandle; - session->mIsChannel = isChannel; - session->mIncoming = incoming; - session->mAlias = alias; - - // Generate a caller UUID -- don't need to do this for channels - if(!session->mIsChannel) - { - if(IDFromName(session->mSIPURI, session->mCallerID)) - { - // Normal URI(base64-encoded UUID) - } - else if(!session->mAlias.empty() && IDFromName(session->mAlias, session->mCallerID)) - { - // Wrong URI, but an alias is available. Stash the incoming URI as an alternate - session->mAlternateSIPURI = session->mSIPURI; - - // and generate a proper URI from the ID. - setSessionURI(session, sipURIFromID(session->mCallerID)); - } - else - { - LL_INFOS("Voice") << "Could not generate caller id from uri, using hash of uri " << session->mSIPURI << LL_ENDL; - setUUIDFromStringHash(session->mCallerID, session->mSIPURI); - session->mSynthesizedCallerID = true; - - // Can't look up the name in this case -- we have to extract it from the URI. - std::string namePortion = nameFromsipURI(session->mSIPURI); - if(namePortion.empty()) - { - // Didn't seem to be a SIP URI, just use the whole provided name. - namePortion = nameString; - } - - // Some incoming names may be separated with an underscore instead of a space. Fix this. - LLStringUtil::replaceChar(namePortion, '_', ' '); - - // Act like we just finished resolving the name (this stores it in all the right places) - avatarNameResolved(session->mCallerID, namePortion); - } - - LL_INFOS("Voice") << "caller ID: " << session->mCallerID << LL_ENDL; - - if(!session->mSynthesizedCallerID) - { - // If we got here, we don't have a proper name. Initiate a lookup. - lookupName(session->mCallerID); - } - } - } + if (mVoiceModule) mVoiceModule->setRenderDevice(name); } -void LLVoiceClient::sessionGroupAddedEvent(std::string &sessionGroupHandle) +const LLVoiceDeviceList& LLVoiceClient::getCaptureDevices() { - LL_DEBUGS("Voice") << "handle " << sessionGroupHandle << LL_ENDL; - -#if USE_SESSION_GROUPS - if(mMainSessionGroupHandle.empty()) + static LLVoiceDeviceList nullCaptureDevices; + if (mVoiceModule) { - // This is the first (i.e. "main") session group. Save its handle. - mMainSessionGroupHandle = sessionGroupHandle; + return mVoiceModule->getCaptureDevices(); } else { - LL_DEBUGS("Voice") << "Already had a session group handle " << mMainSessionGroupHandle << LL_ENDL; + return nullCaptureDevices; } -#endif } -void LLVoiceClient::joinedAudioSession(sessionState *session) -{ - if(mAudioSession != session) - { - sessionState *oldSession = mAudioSession; - - mAudioSession = session; - mAudioSessionChanged = true; - // The old session may now need to be deleted. - reapSession(oldSession); - } - - // This is the session we're joining. - if(getState() == stateJoiningSession) - { - setState(stateSessionJoined); - - // SLIM SDK: we don't always receive a participant state change for ourselves when joining a channel now. - // Add the current user as a participant here. - participantState *participant = session->addParticipant(sipURIFromName(mAccountName)); - if(participant) - { - participant->mIsSelf = true; - lookupName(participant->mAvatarID); - - LL_INFOS("Voice") << "added self as participant \"" << participant->mAccountName - << "\" (" << participant->mAvatarID << ")"<< LL_ENDL; - } - - if(!session->mIsChannel) - { - // this is a p2p session. Make sure the other end is added as a participant. - participantState *participant = session->addParticipant(session->mSIPURI); - if(participant) - { - if(participant->mAvatarIDValid) - { - lookupName(participant->mAvatarID); - } - else if(!session->mName.empty()) - { - participant->mDisplayName = session->mName; - avatarNameResolved(participant->mAvatarID, session->mName); - } - - // TODO: Question: Do we need to set up mAvatarID/mAvatarIDValid here? - LL_INFOS("Voice") << "added caller as participant \"" << participant->mAccountName - << "\" (" << participant->mAvatarID << ")"<< LL_ENDL; - } - } - } -} - -void LLVoiceClient::sessionRemovedEvent( - std::string &sessionHandle, - std::string &sessionGroupHandle) +const LLVoiceDeviceList& LLVoiceClient::getRenderDevices() { - LL_INFOS("Voice") << "handle " << sessionHandle << LL_ENDL; - - sessionState *session = findSession(sessionHandle); - if(session) + static LLVoiceDeviceList nullRenderDevices; + if (mVoiceModule) { - leftAudioSession(session); - - // This message invalidates the session's handle. Set it to empty. - setSessionHandle(session); - - // This also means that the session's session group is now empty. - // Terminate the session group so it doesn't leak. - sessionGroupTerminateSendMessage(session); - - // Reset the media state (we now have no info) - session->mMediaStreamState = streamStateUnknown; - session->mTextStreamState = streamStateUnknown; - - // Conditionally delete the session - reapSession(session); + return mVoiceModule->getRenderDevices(); } else { - LL_WARNS("Voice") << "unknown session " << sessionHandle << " removed" << LL_ENDL; + return nullRenderDevices; } } -void LLVoiceClient::reapSession(sessionState *session) -{ - if(session) - { - if(!session->mHandle.empty()) - { - LL_DEBUGS("Voice") << "NOT deleting session " << session->mSIPURI << " (non-null session handle)" << LL_ENDL; - } - else if(session->mCreateInProgress) - { - LL_DEBUGS("Voice") << "NOT deleting session " << session->mSIPURI << " (create in progress)" << LL_ENDL; - } - else if(session->mMediaConnectInProgress) - { - LL_DEBUGS("Voice") << "NOT deleting session " << session->mSIPURI << " (connect in progress)" << LL_ENDL; - } - else if(session == mAudioSession) - { - LL_DEBUGS("Voice") << "NOT deleting session " << session->mSIPURI << " (it's the current session)" << LL_ENDL; - } - else if(session == mNextAudioSession) - { - LL_DEBUGS("Voice") << "NOT deleting session " << session->mSIPURI << " (it's the next session)" << LL_ENDL; - } - else - { - // TODO: Question: Should we check for queued text messages here? - // We don't have a reason to keep tracking this session, so just delete it. - LL_DEBUGS("Voice") << "deleting session " << session->mSIPURI << LL_ENDL; - deleteSession(session); - session = NULL; - } - } - else - { -// LL_DEBUGS("Voice") << "session is NULL" << LL_ENDL; - } -} -// Returns true if the session seems to indicate we've moved to a region on a different voice server -bool LLVoiceClient::sessionNeedsRelog(sessionState *session) -{ - bool result = false; - - if(session != NULL) - { - // Only make this check for spatial channels (so it won't happen for group or p2p calls) - if(session->mIsSpatial) - { - std::string::size_type atsign; - - atsign = session->mSIPURI.find("@"); - - if(atsign != std::string::npos) - { - std::string urihost = session->mSIPURI.substr(atsign + 1); - if(stricmp(urihost.c_str(), mVoiceSIPURIHostName.c_str())) - { - // The hostname in this URI is different from what we expect. This probably means we need to relog. - - // We could make a ProvisionVoiceAccountRequest and compare the result with the current values of - // mVoiceSIPURIHostName and mVoiceAccountServerURI to be really sure, but this is a pretty good indicator. - - result = true; - } - } - } - } - - return result; -} +//-------------------------------------------------- +// participants -void LLVoiceClient::leftAudioSession( - sessionState *session) +void LLVoiceClient::getParticipantList(std::set<LLUUID> &participants) { - if(mAudioSession == session) + if (mVoiceModule) { - switch(getState()) - { - case stateJoiningSession: - case stateSessionJoined: - case stateRunning: - case stateLeavingSession: - case stateJoinSessionFailed: - case stateJoinSessionFailedWaiting: - // normal transition - LL_DEBUGS("Voice") << "left session " << session->mHandle << " in state " << state2string(getState()) << LL_ENDL; - setState(stateSessionTerminated); - break; - - case stateSessionTerminated: - // this will happen sometimes -- there are cases where we send the terminate and then go straight to this state. - LL_WARNS("Voice") << "left session " << session->mHandle << " in state " << state2string(getState()) << LL_ENDL; - break; - - default: - LL_WARNS("Voice") << "unexpected SessionStateChangeEvent (left session) in state " << state2string(getState()) << LL_ENDL; - setState(stateSessionTerminated); - break; - } - } -} - -void LLVoiceClient::accountLoginStateChangeEvent( - std::string &accountHandle, - int statusCode, - std::string &statusString, - int state) -{ - LL_DEBUGS("Voice") << "state is " << state << LL_ENDL; - /* - According to Mike S., status codes for this event are: - login_state_logged_out=0, - login_state_logged_in = 1, - login_state_logging_in = 2, - login_state_logging_out = 3, - login_state_resetting = 4, - login_state_error=100 - */ - - switch(state) - { - case 1: - if(getState() == stateLoggingIn) - { - setState(stateLoggedIn); - } - break; - - case 3: - // The user is in the process of logging out. - setState(stateLoggingOut); - break; - - case 0: - // The user has been logged out. - setState(stateLoggedOut); - break; - - default: - //Used to be a commented out warning - LL_DEBUGS("Voice") << "unknown state: " << state << LL_ENDL; - break; - } -} - -void LLVoiceClient::mediaStreamUpdatedEvent( - std::string &sessionHandle, - std::string &sessionGroupHandle, - int statusCode, - std::string &statusString, - int state, - bool incoming) -{ - sessionState *session = findSession(sessionHandle); - - LL_DEBUGS("Voice") << "session " << sessionHandle << ", status code " << statusCode << ", string \"" << statusString << "\"" << LL_ENDL; - - if(session) - { - // We know about this session - - // Save the state for later use - session->mMediaStreamState = state; - - switch(statusCode) - { - case 0: - case 200: - // generic success - // Don't change the saved error code (it may have been set elsewhere) - break; - default: - // save the status code for later - session->mErrorStatusCode = statusCode; - break; - } - - switch(state) - { - case streamStateIdle: - // Standard "left audio session" - session->mVoiceEnabled = false; - session->mMediaConnectInProgress = false; - leftAudioSession(session); - break; - - case streamStateConnected: - session->mVoiceEnabled = true; - session->mMediaConnectInProgress = false; - joinedAudioSession(session); - break; - - case streamStateRinging: - if(incoming) - { - // Send the voice chat invite to the GUI layer - // *TODO: Question: Should we correlate with the mute list here? - session->mIMSessionID = LLIMMgr::computeSessionID(IM_SESSION_P2P_INVITE, session->mCallerID); - session->mVoiceInvitePending = true; - if(session->mName.empty()) - { - lookupName(session->mCallerID); - } - else - { - // Act like we just finished resolving the name - avatarNameResolved(session->mCallerID, session->mName); - } - } - break; - - default: - LL_WARNS("Voice") << "unknown state " << state << LL_ENDL; - break; - - } - + mVoiceModule->getParticipantList(participants); } else { - LL_WARNS("Voice") << "session " << sessionHandle << "not found"<< LL_ENDL; + participants = std::set<LLUUID>(); } } -void LLVoiceClient::textStreamUpdatedEvent( - std::string &sessionHandle, - std::string &sessionGroupHandle, - bool enabled, - int state, - bool incoming) +bool LLVoiceClient::isParticipant(const LLUUID &speaker_id) { - sessionState *session = findSession(sessionHandle); - - if(session) - { - // Save the state for later use - session->mTextStreamState = state; - - // We know about this session - switch(state) - { - case 0: // We see this when the text stream closes - LL_DEBUGS("Voice") << "stream closed" << LL_ENDL; - break; - - case 1: // We see this on an incoming call from the Connector - // Try to send any text messages queued for this session. - sendQueuedTextMessages(session); - - // Send the text chat invite to the GUI layer - // TODO: Question: Should we correlate with the mute list here? - session->mTextInvitePending = true; - if(session->mName.empty()) - { - lookupName(session->mCallerID); - } - else - { - // Act like we just finished resolving the name - avatarNameResolved(session->mCallerID, session->mName); - } - break; - - default: - LL_WARNS("Voice") << "unknown state " << state << LL_ENDL; - break; - - } - } + if(mVoiceModule) + { + return mVoiceModule->isParticipant(speaker_id); + } + return false; } -void LLVoiceClient::participantAddedEvent( - std::string &sessionHandle, - std::string &sessionGroupHandle, - std::string &uriString, - std::string &alias, - std::string &nameString, - std::string &displayNameString, - int participantType) -{ - sessionState *session = findSession(sessionHandle); - if(session) - { - participantState *participant = session->addParticipant(uriString); - if(participant) - { - participant->mAccountName = nameString; - - LL_DEBUGS("Voice") << "added participant \"" << participant->mAccountName - << "\" (" << participant->mAvatarID << ")"<< LL_ENDL; - - if(participant->mAvatarIDValid) - { - // Initiate a lookup - lookupName(participant->mAvatarID); - } - else - { - // If we don't have a valid avatar UUID, we need to fill in the display name to make the active speakers floater work. - std::string namePortion = nameFromsipURI(uriString); - if(namePortion.empty()) - { - // Problem with the SIP URI, fall back to the display name - namePortion = displayNameString; - } - if(namePortion.empty()) - { - // Problems with both of the above, fall back to the account name - namePortion = nameString; - } - - // Set the display name (which is a hint to the active speakers window not to do its own lookup) - participant->mDisplayName = namePortion; - avatarNameResolved(participant->mAvatarID, namePortion); - } - } - } -} -void LLVoiceClient::participantRemovedEvent( - std::string &sessionHandle, - std::string &sessionGroupHandle, - std::string &uriString, - std::string &alias, - std::string &nameString) -{ - sessionState *session = findSession(sessionHandle); - if(session) - { - participantState *participant = session->findParticipant(uriString); - if(participant) - { - session->removeParticipant(participant); - } - else - { - LL_DEBUGS("Voice") << "unknown participant " << uriString << LL_ENDL; - } - } - else - { - LL_DEBUGS("Voice") << "unknown session " << sessionHandle << LL_ENDL; - } -} +//-------------------------------------------------- +// text chat -void LLVoiceClient::participantUpdatedEvent( - std::string &sessionHandle, - std::string &sessionGroupHandle, - std::string &uriString, - std::string &alias, - bool isModeratorMuted, - bool isSpeaking, - int volume, - F32 energy) +BOOL LLVoiceClient::isSessionTextIMPossible(const LLUUID& id) { - sessionState *session = findSession(sessionHandle); - if(session) + if (mVoiceModule) { - participantState *participant = session->findParticipant(uriString); - - if(participant) - { - participant->mIsSpeaking = isSpeaking; - participant->mIsModeratorMuted = isModeratorMuted; - - // SLIM SDK: convert range: ensure that energy is set to zero if is_speaking is false - if (isSpeaking) - { - participant->mSpeakingTimeout.reset(); - participant->mPower = energy; - } - else - { - participant->mPower = 0.0f; - } - participant->mVolume = volume; - - - // *HACK: mantipov: added while working on EXT-3544 - /* - Sometimes LLVoiceClient::participantUpdatedEvent callback is called BEFORE - LLViewerChatterBoxSessionAgentListUpdates::post() sometimes AFTER. - - participantUpdatedEvent updates voice participant state in particular participantState::mIsModeratorMuted - Originally we wanted to update session Speaker Manager to fire LLSpeakerVoiceModerationEvent to fix the EXT-3544 bug. - Calling of the LLSpeakerMgr::update() method was added into LLIMMgr::processAgentListUpdates. - - But in case participantUpdatedEvent() is called after LLViewerChatterBoxSessionAgentListUpdates::post() - voice participant mIsModeratorMuted is changed after speakers are updated in Speaker Manager - and event is not fired. - - So, we have to call LLSpeakerMgr::update() here. In any case it is better than call it - in LLCallFloater::draw() - */ - LLVoiceChannel* voice_cnl = LLVoiceChannel::getCurrentVoiceChannel(); - - // ignore session ID of local chat - if (voice_cnl && voice_cnl->getSessionID().notNull()) - { - LLSpeakerMgr* speaker_manager = LLIMModel::getInstance()->getSpeakerManager(voice_cnl->getSessionID()); - if (speaker_manager) - { - speaker_manager->update(true); - } - } - } - else - { - LL_WARNS("Voice") << "unknown participant: " << uriString << LL_ENDL; - } + return mVoiceModule->isSessionTextIMPossible(id); } else { - LL_INFOS("Voice") << "unknown session " << sessionHandle << LL_ENDL; - } + return FALSE; + } } -void LLVoiceClient::buddyPresenceEvent( - std::string &uriString, - std::string &alias, - std::string &statusString, - std::string &applicationString) +BOOL LLVoiceClient::isSessionCallBackPossible(const LLUUID& id) { - buddyListEntry *buddy = findBuddy(uriString); - - if(buddy) + if (mVoiceModule) { - LL_DEBUGS("Voice") << "Presence event for " << buddy->mDisplayName << " status \"" << statusString << "\", application \"" << applicationString << "\""<< LL_ENDL; - LL_DEBUGS("Voice") << "before: mOnlineSL = " << (buddy->mOnlineSL?"true":"false") << ", mOnlineSLim = " << (buddy->mOnlineSLim?"true":"false") << LL_ENDL; - - if(applicationString.empty()) - { - // This presence event is from a client that doesn't set up the Application string. Do things the old-skool way. - // NOTE: this will be needed to support people who aren't on the 3010-class SDK yet. - - if ( stricmp("Unknown", statusString.c_str())== 0) - { - // User went offline with a non-SLim-enabled viewer. - buddy->mOnlineSL = false; - } - else if ( stricmp("Online", statusString.c_str())== 0) - { - // User came online with a non-SLim-enabled viewer. - buddy->mOnlineSL = true; - } - else - { - // If the user is online through SLim, their status will be "Online-slc", "Away", or something else. - // NOTE: we should never see this unless someone is running an OLD version of SLim -- the versions that should be in use now all set the application string. - buddy->mOnlineSLim = true; - } - } - else if(applicationString.find("SecondLifeViewer") != std::string::npos) - { - // This presence event is from a viewer that sets the application string - if ( stricmp("Unknown", statusString.c_str())== 0) - { - // Viewer says they're offline - buddy->mOnlineSL = false; - } - else - { - // Viewer says they're online - buddy->mOnlineSL = true; - } - } - else - { - // This presence event is from something which is NOT the SL viewer (assume it's SLim). - if ( stricmp("Unknown", statusString.c_str())== 0) - { - // SLim says they're offline - buddy->mOnlineSLim = false; - } - else - { - // SLim says they're online - buddy->mOnlineSLim = true; - } - } - - LL_DEBUGS("Voice") << "after: mOnlineSL = " << (buddy->mOnlineSL?"true":"false") << ", mOnlineSLim = " << (buddy->mOnlineSLim?"true":"false") << LL_ENDL; - - // HACK -- increment the internal change serial number in the LLRelationship (without changing the actual status), so the UI notices the change. - LLAvatarTracker::instance().setBuddyOnline(buddy->mUUID,LLAvatarTracker::instance().isBuddyOnline(buddy->mUUID)); - - notifyFriendObservers(); + return mVoiceModule->isSessionCallBackPossible(id); } else { - LL_DEBUGS("Voice") << "Presence for unknown buddy " << uriString << LL_ENDL; + return FALSE; } } -void LLVoiceClient::messageEvent( - std::string &sessionHandle, - std::string &uriString, - std::string &alias, - std::string &messageHeader, - std::string &messageBody, - std::string &applicationString) +BOOL LLVoiceClient::sendTextMessage(const LLUUID& participant_id, const std::string& message) { - LL_DEBUGS("Voice") << "Message event, session " << sessionHandle << " from " << uriString << LL_ENDL; -// LL_DEBUGS("Voice") << " header " << messageHeader << ", body: \n" << messageBody << LL_ENDL; - - if(messageHeader.find("text/html") != std::string::npos) + if (mVoiceModule) { - std::string message; - - { - const std::string startMarker = "<body"; - const std::string startMarker2 = ">"; - const std::string endMarker = "</body>"; - const std::string startSpan = "<span"; - const std::string endSpan = "</span>"; - std::string::size_type start; - std::string::size_type end; - - // Default to displaying the raw string, so the message gets through. - message = messageBody; - - // Find the actual message text within the XML fragment - start = messageBody.find(startMarker); - start = messageBody.find(startMarker2, start); - end = messageBody.find(endMarker); - - if(start != std::string::npos) - { - start += startMarker2.size(); - - if(end != std::string::npos) - end -= start; - - message.assign(messageBody, start, end); - } - else - { - // Didn't find a <body>, try looking for a <span> instead. - start = messageBody.find(startSpan); - start = messageBody.find(startMarker2, start); - end = messageBody.find(endSpan); - - if(start != std::string::npos) - { - start += startMarker2.size(); - - if(end != std::string::npos) - end -= start; - - message.assign(messageBody, start, end); - } - } - } - -// LL_DEBUGS("Voice") << " raw message = \n" << message << LL_ENDL; - - // strip formatting tags - { - std::string::size_type start; - std::string::size_type end; - - while((start = message.find('<')) != std::string::npos) - { - if((end = message.find('>', start + 1)) != std::string::npos) - { - // Strip out the tag - message.erase(start, (end + 1) - start); - } - else - { - // Avoid an infinite loop - break; - } - } - } - - // Decode ampersand-escaped chars - { - std::string::size_type mark = 0; - - // The text may contain text encoded with <, >, and & - mark = 0; - while((mark = message.find("<", mark)) != std::string::npos) - { - message.replace(mark, 4, "<"); - mark += 1; - } - - mark = 0; - while((mark = message.find(">", mark)) != std::string::npos) - { - message.replace(mark, 4, ">"); - mark += 1; - } - - mark = 0; - while((mark = message.find("&", mark)) != std::string::npos) - { - message.replace(mark, 5, "&"); - mark += 1; - } - } - - // strip leading/trailing whitespace (since we always seem to get a couple newlines) - LLStringUtil::trim(message); - -// LL_DEBUGS("Voice") << " stripped message = \n" << message << LL_ENDL; - - sessionState *session = findSession(sessionHandle); - if(session) - { - bool is_busy = gAgent.getBusy(); - bool is_muted = LLMuteList::getInstance()->isMuted(session->mCallerID, session->mName, LLMute::flagTextChat); - bool is_linden = LLMuteList::getInstance()->isLinden(session->mName); - bool quiet_chat = false; - LLChat chat; - - chat.mMuted = is_muted && !is_linden; - - if(!chat.mMuted) - { - chat.mFromID = session->mCallerID; - chat.mFromName = session->mName; - chat.mSourceType = CHAT_SOURCE_AGENT; - - if(is_busy && !is_linden) - { - quiet_chat = true; - // TODO: Question: Return busy mode response here? Or maybe when session is started instead? - } - - LL_DEBUGS("Voice") << "adding message, name " << session->mName << " session " << session->mIMSessionID << ", target " << session->mCallerID << LL_ENDL; - gIMMgr->addMessage(session->mIMSessionID, - session->mCallerID, - session->mName.c_str(), - message.c_str(), - LLStringUtil::null, // default arg - IM_NOTHING_SPECIAL, // default arg - 0, // default arg - LLUUID::null, // default arg - LLVector3::zero, // default arg - true); // prepend name and make it a link to the user's profile - } - } - } -} - -void LLVoiceClient::sessionNotificationEvent(std::string &sessionHandle, std::string &uriString, std::string ¬ificationType) -{ - sessionState *session = findSession(sessionHandle); - - if(session) - { - participantState *participant = session->findParticipant(uriString); - if(participant) - { - if (!stricmp(notificationType.c_str(), "Typing")) - { - // Other end started typing - // TODO: The proper way to add a typing notification seems to be LLIMMgr::processIMTypingStart(). - // It requires an LLIMInfo for the message, which we don't have here. - } - else if (!stricmp(notificationType.c_str(), "NotTyping")) - { - // Other end stopped typing - // TODO: The proper way to remove a typing notification seems to be LLIMMgr::processIMTypingStop(). - // It requires an LLIMInfo for the message, which we don't have here. - } - else - { - LL_DEBUGS("Voice") << "Unknown notification type " << notificationType << "for participant " << uriString << " in session " << session->mSIPURI << LL_ENDL; - } - } - else - { - LL_DEBUGS("Voice") << "Unknown participant " << uriString << " in session " << session->mSIPURI << LL_ENDL; - } + return mVoiceModule->sendTextMessage(participant_id, message); } else { - LL_DEBUGS("Voice") << "Unknown session handle " << sessionHandle << LL_ENDL; - } -} - -void LLVoiceClient::subscriptionEvent(std::string &buddyURI, std::string &subscriptionHandle, std::string &alias, std::string &displayName, std::string &applicationString, std::string &subscriptionType) -{ - buddyListEntry *buddy = findBuddy(buddyURI); - - if(!buddy) - { - // Couldn't find buddy by URI, try converting the alias... - if(!alias.empty()) - { - LLUUID id; - if(IDFromName(alias, id)) - { - buddy = findBuddy(id); - } - } - } - - if(buddy) - { - std::ostringstream stream; - - if(buddy->mCanSeeMeOnline) - { - // Sending the response will create an auto-accept rule - buddy->mHasAutoAcceptListEntry = true; - } - else - { - // Sending the response will create a block rule - buddy->mHasBlockListEntry = true; - } - - if(buddy->mInSLFriends) - { - buddy->mInVivoxBuddies = true; - } - - stream - << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.SendSubscriptionReply.1\">" - << "<AccountHandle>" << mAccountHandle << "</AccountHandle>" - << "<BuddyURI>" << buddy->mURI << "</BuddyURI>" - << "<RuleType>" << (buddy->mCanSeeMeOnline?"Allow":"Hide") << "</RuleType>" - << "<AutoAccept>"<< (buddy->mInSLFriends?"1":"0")<< "</AutoAccept>" - << "<SubscriptionHandle>" << subscriptionHandle << "</SubscriptionHandle>" - << "</Request>" - << "\n\n\n"; - - writeString(stream.str()); - } -} - -void LLVoiceClient::auxAudioPropertiesEvent(F32 energy) -{ - LL_DEBUGS("Voice") << "got energy " << energy << LL_ENDL; - mTuningEnergy = energy; -} - -void LLVoiceClient::buddyListChanged() -{ - // This is called after we receive a BuddyAndGroupListChangedEvent. - mBuddyListMapPopulated = true; - mFriendsListDirty = true; -} - -void LLVoiceClient::muteListChanged() -{ - // The user's mute list has been updated. Go through the current participant list and sync it with the mute list. - if(mAudioSession) - { - participantMap::iterator iter = mAudioSession->mParticipantsByURI.begin(); - - for(; iter != mAudioSession->mParticipantsByURI.end(); iter++) - { - participantState *p = iter->second; - - // Check to see if this participant is on the mute list already - if(p->updateMuteState()) - mAudioSession->mVolumeDirty = true; - } - } -} - -void LLVoiceClient::updateFriends(U32 mask) -{ - if(mask & (LLFriendObserver::ADD | LLFriendObserver::REMOVE | LLFriendObserver::POWERS)) - { - // Just resend the whole friend list to the daemon - mFriendsListDirty = true; - } -} - -///////////////////////////// -// Managing list of participants -LLVoiceClient::participantState::participantState(const std::string &uri) : - mURI(uri), - mPTT(false), - mIsSpeaking(false), - mIsModeratorMuted(false), - mLastSpokeTimestamp(0.f), - mPower(0.f), - mVolume(-1), - mOnMuteList(false), - mUserVolume(-1), - mVolumeDirty(false), - mAvatarIDValid(false), - mIsSelf(false) -{ -} - -LLVoiceClient::participantState *LLVoiceClient::sessionState::addParticipant(const std::string &uri) -{ - participantState *result = NULL; - bool useAlternateURI = false; - - // Note: this is mostly the body of LLVoiceClient::sessionState::findParticipant(), but since we need to know if it - // matched the alternate SIP URI (so we can add it properly), we need to reproduce it here. - { - participantMap::iterator iter = mParticipantsByURI.find(&uri); - - if(iter == mParticipantsByURI.end()) - { - if(!mAlternateSIPURI.empty() && (uri == mAlternateSIPURI)) - { - // This is a p2p session (probably with the SLIM client) with an alternate URI for the other participant. - // Use mSIPURI instead, since it will be properly encoded. - iter = mParticipantsByURI.find(&(mSIPURI)); - useAlternateURI = true; - } - } - - if(iter != mParticipantsByURI.end()) - { - result = iter->second; - } - } - - if(!result) - { - // participant isn't already in one list or the other. - result = new participantState(useAlternateURI?mSIPURI:uri); - mParticipantsByURI.insert(participantMap::value_type(&(result->mURI), result)); - mParticipantsChanged = true; - - // Try to do a reverse transform on the URI to get the GUID back. - { - LLUUID id; - if(IDFromName(result->mURI, id)) - { - result->mAvatarIDValid = true; - result->mAvatarID = id; - - if(result->updateMuteState()) - mVolumeDirty = true; - } - else - { - // Create a UUID by hashing the URI, but do NOT set mAvatarIDValid. - // This tells both code in LLVoiceClient and code in llfloateractivespeakers.cpp that the ID will not be in the name cache. - setUUIDFromStringHash(result->mAvatarID, uri); - } - } - - mParticipantsByUUID.insert(participantUUIDMap::value_type(&(result->mAvatarID), result)); - - result->mUserVolume = LLSpeakerVolumeStorage::getInstance()->getSpeakerVolume(result->mAvatarID); - - LL_DEBUGS("Voice") << "participant \"" << result->mURI << "\" added." << LL_ENDL; - } - - return result; -} - -bool LLVoiceClient::participantState::updateMuteState() -{ - bool result = false; - - if(mAvatarIDValid) - { - bool isMuted = LLMuteList::getInstance()->isMuted(mAvatarID, LLMute::flagVoiceChat); - if(mOnMuteList != isMuted) - { - mOnMuteList = isMuted; - mVolumeDirty = true; - result = true; - } - } - return result; -} - -bool LLVoiceClient::participantState::isAvatar() -{ - return mAvatarIDValid; -} - -void LLVoiceClient::sessionState::removeParticipant(LLVoiceClient::participantState *participant) -{ - if(participant) - { - participantMap::iterator iter = mParticipantsByURI.find(&(participant->mURI)); - participantUUIDMap::iterator iter2 = mParticipantsByUUID.find(&(participant->mAvatarID)); - - LL_DEBUGS("Voice") << "participant \"" << participant->mURI << "\" (" << participant->mAvatarID << ") removed." << LL_ENDL; - - if(iter == mParticipantsByURI.end()) - { - LL_ERRS("Voice") << "Internal error: participant " << participant->mURI << " not in URI map" << LL_ENDL; - } - else if(iter2 == mParticipantsByUUID.end()) - { - LL_ERRS("Voice") << "Internal error: participant ID " << participant->mAvatarID << " not in UUID map" << LL_ENDL; - } - else if(iter->second != iter2->second) - { - LL_ERRS("Voice") << "Internal error: participant mismatch!" << LL_ENDL; - } - else - { - mParticipantsByURI.erase(iter); - mParticipantsByUUID.erase(iter2); - - delete participant; - mParticipantsChanged = true; - } - } -} - -void LLVoiceClient::sessionState::removeAllParticipants() -{ - LL_DEBUGS("Voice") << "called" << LL_ENDL; - - while(!mParticipantsByURI.empty()) - { - removeParticipant(mParticipantsByURI.begin()->second); - } - - if(!mParticipantsByUUID.empty()) - { - LL_ERRS("Voice") << "Internal error: empty URI map, non-empty UUID map" << LL_ENDL; - } -} - -LLVoiceClient::participantMap *LLVoiceClient::getParticipantList(void) -{ - participantMap *result = NULL; - if(mAudioSession) - { - result = &(mAudioSession->mParticipantsByURI); - } - return result; -} - -void LLVoiceClient::getParticipantsUUIDSet(std::set<LLUUID>& participant_uuids) -{ - if (NULL == mAudioSession) return; - - participantUUIDMap::const_iterator it = mAudioSession->mParticipantsByUUID.begin(), - it_end = mAudioSession->mParticipantsByUUID.end(); - for (; it != it_end; ++it) - { - participant_uuids.insert((*(*it).first)); - } -} - -LLVoiceClient::participantState *LLVoiceClient::sessionState::findParticipant(const std::string &uri) -{ - participantState *result = NULL; - - participantMap::iterator iter = mParticipantsByURI.find(&uri); - - if(iter == mParticipantsByURI.end()) - { - if(!mAlternateSIPURI.empty() && (uri == mAlternateSIPURI)) - { - // This is a p2p session (probably with the SLIM client) with an alternate URI for the other participant. - // Look up the other URI - iter = mParticipantsByURI.find(&(mSIPURI)); - } - } - - if(iter != mParticipantsByURI.end()) - { - result = iter->second; - } - - return result; + return FALSE; + } } -LLVoiceClient::participantState* LLVoiceClient::sessionState::findParticipantByID(const LLUUID& id) +void LLVoiceClient::endUserIMSession(const LLUUID& participant_id) { - participantState * result = NULL; - participantUUIDMap::iterator iter = mParticipantsByUUID.find(&id); - - if(iter != mParticipantsByUUID.end()) + if (mVoiceModule) { - result = iter->second; + mVoiceModule->endUserIMSession(participant_id); } - - return result; } -LLVoiceClient::participantState* LLVoiceClient::findParticipantByID(const LLUUID& id) -{ - participantState * result = NULL; - - if(mAudioSession) - { - result = mAudioSession->findParticipantByID(id); - } - - return result; -} - - -void LLVoiceClient::parcelChanged() -{ - if(getState() >= stateNoChannel) - { - // If the user is logged in, start a channel lookup. - LL_DEBUGS("Voice") << "sending ParcelVoiceInfoRequest (" << mCurrentRegionName << ", " << mCurrentParcelLocalID << ")" << LL_ENDL; - - std::string url = gAgent.getRegion()->getCapability("ParcelVoiceInfoRequest"); - LLSD data; - LLHTTPClient::post( - url, - data, - new LLVoiceClientCapResponder); - } - else - { - // The transition to stateNoChannel needs to kick this off again. - LL_INFOS("Voice") << "not logged in yet, deferring" << LL_ENDL; - } -} - -void LLVoiceClient::switchChannel( - std::string uri, - bool spatial, - bool no_reconnect, - bool is_p2p, - std::string hash) -{ - bool needsSwitch = false; - - LL_DEBUGS("Voice") - << "called in state " << state2string(getState()) - << " with uri \"" << uri << "\"" - << (spatial?", spatial is true":", spatial is false") - << LL_ENDL; - - switch(getState()) - { - case stateJoinSessionFailed: - case stateJoinSessionFailedWaiting: - case stateNoChannel: - // Always switch to the new URI from these states. - needsSwitch = true; - break; - - default: - if(mSessionTerminateRequested) - { - // If a terminate has been requested, we need to compare against where the URI we're already headed to. - if(mNextAudioSession) - { - if(mNextAudioSession->mSIPURI != uri) - needsSwitch = true; - } - else - { - // mNextAudioSession is null -- this probably means we're on our way back to spatial. - if(!uri.empty()) - { - // We do want to process a switch in this case. - needsSwitch = true; - } - } - } - else - { - // Otherwise, compare against the URI we're in now. - if(mAudioSession) - { - if(mAudioSession->mSIPURI != uri) - { - needsSwitch = true; - } - } - else - { - if(!uri.empty()) - { - // mAudioSession is null -- it's not clear what case would cause this. - // For now, log it as a warning and see if it ever crops up. - LL_WARNS("Voice") << "No current audio session." << LL_ENDL; - } - } - } - break; - } - - if(needsSwitch) - { - if(uri.empty()) - { - // Leave any channel we may be in - LL_DEBUGS("Voice") << "leaving channel" << LL_ENDL; - - sessionState *oldSession = mNextAudioSession; - mNextAudioSession = NULL; - - // The old session may now need to be deleted. - reapSession(oldSession); - - notifyStatusObservers(LLVoiceClientStatusObserver::STATUS_VOICE_DISABLED); - } - else - { - LL_DEBUGS("Voice") << "switching to channel " << uri << LL_ENDL; - - mNextAudioSession = addSession(uri); - mNextAudioSession->mHash = hash; - mNextAudioSession->mIsSpatial = spatial; - mNextAudioSession->mReconnect = !no_reconnect; - mNextAudioSession->mIsP2P = is_p2p; - } - - if(getState() <= stateNoChannel) - { - // We're already set up to join a channel, just needed to fill in the session URI - } - else - { - // State machine will come around and rejoin if uri/handle is not empty. - sessionTerminate(); - } - } -} +//---------------------------------------------- +// channels -void LLVoiceClient::joinSession(sessionState *session) +bool LLVoiceClient::inProximalChannel() { - mNextAudioSession = session; - - if(getState() <= stateNoChannel) + if (mVoiceModule) { - // We're already set up to join a channel, just needed to fill in the session handle + return mVoiceModule->inProximalChannel(); } else { - // State machine will come around and rejoin if uri/handle is not empty. - sessionTerminate(); + return false; } } @@ -5337,1905 +380,612 @@ void LLVoiceClient::setNonSpatialChannel( const std::string &uri, const std::string &credentials) { - switchChannel(uri, false, false, false, credentials); + if (mVoiceModule) mVoiceModule->setNonSpatialChannel(uri, credentials); } void LLVoiceClient::setSpatialChannel( const std::string &uri, const std::string &credentials) { - mSpatialSessionURI = uri; - mSpatialSessionCredentials = credentials; - mAreaVoiceDisabled = mSpatialSessionURI.empty(); - - LL_DEBUGS("Voice") << "got spatial channel uri: \"" << uri << "\"" << LL_ENDL; - - if((mAudioSession && !(mAudioSession->mIsSpatial)) || (mNextAudioSession && !(mNextAudioSession->mIsSpatial))) - { - // User is in a non-spatial chat or joining a non-spatial chat. Don't switch channels. - LL_INFOS("Voice") << "in non-spatial chat, not switching channels" << LL_ENDL; - } - else - { - switchChannel(mSpatialSessionURI, true, false, false, mSpatialSessionCredentials); - } + if (mVoiceModule) mVoiceModule->setSpatialChannel(uri, credentials); } -void LLVoiceClient::callUser(const LLUUID &uuid) +void LLVoiceClient::leaveNonSpatialChannel() { - std::string userURI = sipURIFromID(uuid); - - switchChannel(userURI, false, true, true); + if (mVoiceModule) mVoiceModule->leaveNonSpatialChannel(); } -LLVoiceClient::sessionState* LLVoiceClient::startUserIMSession(const LLUUID &uuid) -{ - // Figure out if a session with the user already exists - sessionState *session = findSession(uuid); - if(!session) - { - // No session with user, need to start one. - std::string uri = sipURIFromID(uuid); - session = addSession(uri); - session->mIsSpatial = false; - session->mReconnect = false; - session->mIsP2P = true; - session->mCallerID = uuid; - } - - if(session) - { - if(session->mHandle.empty()) - { - // Session isn't active -- start it up. - sessionCreateSendMessage(session, false, true); - } - else - { - // Session is already active -- start up text. - sessionTextConnectSendMessage(session); - } - } - - return session; -} - -bool LLVoiceClient::sendTextMessage(const LLUUID& participant_id, const std::string& message) +void LLVoiceClient::leaveChannel(void) { - bool result = false; - - // Attempt to locate the indicated session - sessionState *session = startUserIMSession(participant_id); - if(session) - { - // found the session, attempt to send the message - session->mTextMsgQueue.push(message); - - // Try to send queued messages (will do nothing if the session is not open yet) - sendQueuedTextMessages(session); - - // The message is queued, so we succeed. - result = true; - } - else - { - LL_DEBUGS("Voice") << "Session not found for participant ID " << participant_id << LL_ENDL; - } - - return result; + if (mVoiceModule) mVoiceModule->leaveChannel(); } -void LLVoiceClient::sendQueuedTextMessages(sessionState *session) +std::string LLVoiceClient::getCurrentChannel() { - if(session->mTextStreamState == 1) + if (mVoiceModule) { - if(!session->mTextMsgQueue.empty()) - { - std::ostringstream stream; - - while(!session->mTextMsgQueue.empty()) - { - std::string message = session->mTextMsgQueue.front(); - session->mTextMsgQueue.pop(); - stream - << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Session.SendMessage.1\">" - << "<SessionHandle>" << session->mHandle << "</SessionHandle>" - << "<MessageHeader>text/HTML</MessageHeader>" - << "<MessageBody>" << message << "</MessageBody>" - << "</Request>" - << "\n\n\n"; - } - writeString(stream.str()); - } + return mVoiceModule->getCurrentChannel(); } else { - // Session isn't connected yet, defer until later. + return std::string(); } } -void LLVoiceClient::endUserIMSession(const LLUUID &uuid) -{ - // Figure out if a session with the user exists - sessionState *session = findSession(uuid); - if(session) - { - // found the session - if(!session->mHandle.empty()) - { - sessionTextDisconnectSendMessage(session); - } - } - else - { - LL_DEBUGS("Voice") << "Session not found for participant ID " << uuid << LL_ENDL; - } -} - -bool LLVoiceClient::answerInvite(std::string &sessionHandle) -{ - // this is only ever used to answer incoming p2p call invites. - - sessionState *session = findSession(sessionHandle); - if(session) - { - session->mIsSpatial = false; - session->mReconnect = false; - session->mIsP2P = true; - joinSession(session); - return true; - } - - return false; -} +//--------------------------------------- +// invitations -bool LLVoiceClient::isOnlineSIP(const LLUUID &id) +void LLVoiceClient::callUser(const LLUUID &uuid) { - bool result = false; - buddyListEntry *buddy = findBuddy(id); - if(buddy) - { - result = buddy->mOnlineSLim; - LL_DEBUGS("Voice") << "Buddy " << buddy->mDisplayName << " is SIP " << (result?"online":"offline") << LL_ENDL; - } - - if(!result) - { - // This user isn't on the buddy list or doesn't show online status through the buddy list, but could be a participant in an existing session if they initiated a text IM. - sessionState *session = findSession(id); - if(session && !session->mHandle.empty()) - { - if((session->mTextStreamState != streamStateUnknown) || (session->mMediaStreamState > streamStateIdle)) - { - LL_DEBUGS("Voice") << "Open session with " << id << " found, returning SIP online state" << LL_ENDL; - // we have a p2p text session open with this user, so by definition they're online. - result = true; - } - } - } - - return result; + if (mVoiceModule) mVoiceModule->callUser(uuid); } -// Returns true if the indicated participant in the current audio session is really an SL avatar. -// Currently this will be false only for PSTN callers into group chats, and PSTN p2p calls. -bool LLVoiceClient::isParticipantAvatar(const LLUUID &id) +bool LLVoiceClient::isValidChannel(std::string &session_handle) { - bool result = true; - sessionState *session = findSession(id); - - if(session != NULL) + if (mVoiceModule) { - // this is a p2p session with the indicated caller, or the session with the specified UUID. - if(session->mSynthesizedCallerID) - result = false; + return mVoiceModule->isValidChannel(session_handle); } else { - // Didn't find a matching session -- check the current audio session for a matching participant - if(mAudioSession != NULL) - { - participantState *participant = findParticipantByID(id); - if(participant != NULL) - { - result = participant->isAvatar(); - } - } - } - - return result; -} - -// Returns true if calling back the session URI after the session has closed is possible. -// Currently this will be false only for PSTN P2P calls. -bool LLVoiceClient::isSessionCallBackPossible(const LLUUID &session_id) -{ - bool result = true; - sessionState *session = findSession(session_id); - - if(session != NULL) - { - result = session->isCallBackPossible(); - } - - return result; -} - -// Returns true if the session can accepte text IM's. -// Currently this will be false only for PSTN P2P calls. -bool LLVoiceClient::isSessionTextIMPossible(const LLUUID &session_id) -{ - bool result = true; - sessionState *session = findSession(session_id); - - if(session != NULL) - { - result = session->isTextIMPossible(); - } - - return result; -} - - -void LLVoiceClient::declineInvite(std::string &sessionHandle) -{ - sessionState *session = findSession(sessionHandle); - if(session) - { - sessionMediaDisconnectSendMessage(session); - } -} - -void LLVoiceClient::leaveNonSpatialChannel() -{ - LL_DEBUGS("Voice") - << "called in state " << state2string(getState()) - << LL_ENDL; - - // Make sure we don't rejoin the current session. - sessionState *oldNextSession = mNextAudioSession; - mNextAudioSession = NULL; - - // Most likely this will still be the current session at this point, but check it anyway. - reapSession(oldNextSession); - - verifySessionState(); - - sessionTerminate(); -} - -std::string LLVoiceClient::getCurrentChannel() -{ - std::string result; - - if((getState() == stateRunning) && !mSessionTerminateRequested) - { - result = getAudioSessionURI(); + return false; } - - return result; } -bool LLVoiceClient::inProximalChannel() +bool LLVoiceClient::answerInvite(std::string &channelHandle) { - bool result = false; - - if((getState() == stateRunning) && !mSessionTerminateRequested) + if (mVoiceModule) { - result = inSpatialChannel(); + return mVoiceModule->answerInvite(channelHandle); } - - return result; -} - -std::string LLVoiceClient::sipURIFromID(const LLUUID &id) -{ - std::string result; - result = "sip:"; - result += nameFromID(id); - result += "@"; - result += mVoiceSIPURIHostName; - - return result; -} - -std::string LLVoiceClient::sipURIFromAvatar(LLVOAvatar *avatar) -{ - std::string result; - if(avatar) - { - result = "sip:"; - result += nameFromID(avatar->getID()); - result += "@"; - result += mVoiceSIPURIHostName; - } - - return result; -} - -std::string LLVoiceClient::nameFromAvatar(LLVOAvatar *avatar) -{ - std::string result; - if(avatar) - { - result = nameFromID(avatar->getID()); - } - return result; -} - -std::string LLVoiceClient::nameFromID(const LLUUID &uuid) -{ - std::string result; - - if (uuid.isNull()) { - //VIVOX, the uuid emtpy look for the mURIString and return that instead. - //result.assign(uuid.mURIStringName); - LLStringUtil::replaceChar(result, '_', ' '); - return result; - } - // Prepending this apparently prevents conflicts with reserved names inside the vivox and diamondware code. - result = "x"; - - // Base64 encode and replace the pieces of base64 that are less compatible - // with e-mail local-parts. - // See RFC-4648 "Base 64 Encoding with URL and Filename Safe Alphabet" - result += LLBase64::encode(uuid.mData, UUID_BYTES); - LLStringUtil::replaceChar(result, '+', '-'); - LLStringUtil::replaceChar(result, '/', '_'); - - // If you need to transform a GUID to this form on the Mac OS X command line, this will do so: - // echo -n x && (echo e669132a-6c43-4ee1-a78d-6c82fff59f32 |xxd -r -p |openssl base64|tr '/+' '_-') - - // The reverse transform can be done with: - // echo 'x5mkTKmxDTuGnjWyC__WfMg==' |cut -b 2- -|tr '_-' '/+' |openssl base64 -d|xxd -p - - return result; -} - -bool LLVoiceClient::IDFromName(const std::string inName, LLUUID &uuid) -{ - bool result = false; - - // SLIM SDK: The "name" may actually be a SIP URI such as: "sip:xFnPP04IpREWNkuw1cOXlhw==@bhr.vivox.com" - // If it is, convert to a bare name before doing the transform. - std::string name = nameFromsipURI(inName); - - // Doesn't look like a SIP URI, assume it's an actual name. - if(name.empty()) - name = inName; - - // This will only work if the name is of the proper form. - // As an example, the account name for Monroe Linden (UUID 1673cfd3-8229-4445-8d92-ec3570e5e587) is: - // "xFnPP04IpREWNkuw1cOXlhw==" - - if((name.size() == 25) && (name[0] == 'x') && (name[23] == '=') && (name[24] == '=')) - { - // The name appears to have the right form. - - // Reverse the transforms done by nameFromID - std::string temp = name; - LLStringUtil::replaceChar(temp, '-', '+'); - LLStringUtil::replaceChar(temp, '_', '/'); - - U8 rawuuid[UUID_BYTES + 1]; - int len = apr_base64_decode_binary(rawuuid, temp.c_str() + 1); - if(len == UUID_BYTES) - { - // The decode succeeded. Stuff the bits into the result's UUID - memcpy(uuid.mData, rawuuid, UUID_BYTES); - result = true; - } - } - - if(!result) + else { - // VIVOX: not a standard account name, just copy the URI name mURIString field - // and hope for the best. bpj - uuid.setNull(); // VIVOX, set the uuid field to nulls + return false; } - - return result; -} - -std::string LLVoiceClient::displayNameFromAvatar(LLVOAvatar *avatar) -{ - return avatar->getFullname(); } -std::string LLVoiceClient::sipURIFromName(std::string &name) +void LLVoiceClient::declineInvite(std::string &channelHandle) { - std::string result; - result = "sip:"; - result += name; - result += "@"; - result += mVoiceSIPURIHostName; - -// LLStringUtil::toLower(result); - - return result; + if (mVoiceModule) mVoiceModule->declineInvite(channelHandle); } -std::string LLVoiceClient::nameFromsipURI(const std::string &uri) -{ - std::string result; - std::string::size_type sipOffset, atOffset; - sipOffset = uri.find("sip:"); - atOffset = uri.find("@"); - if((sipOffset != std::string::npos) && (atOffset != std::string::npos)) - { - result = uri.substr(sipOffset + 4, atOffset - (sipOffset + 4)); - } - - return result; -} +//------------------------------------------ +// Volume/gain -bool LLVoiceClient::inSpatialChannel(void) -{ - bool result = false; - - if(mAudioSession) - result = mAudioSession->mIsSpatial; - - return result; -} -std::string LLVoiceClient::getAudioSessionURI() +void LLVoiceClient::setVoiceVolume(F32 volume) { - std::string result; - - if(mAudioSession) - result = mAudioSession->mSIPURI; - - return result; + if (mVoiceModule) mVoiceModule->setVoiceVolume(volume); } -std::string LLVoiceClient::getAudioSessionHandle() +void LLVoiceClient::setMicGain(F32 volume) { - std::string result; - - if(mAudioSession) - result = mAudioSession->mHandle; - - return result; + if (mVoiceModule) mVoiceModule->setMicGain(volume); } -///////////////////////////// -// Sending updates of current state +//------------------------------------------ +// enable/disable voice features -void LLVoiceClient::enforceTether(void) +bool LLVoiceClient::voiceEnabled() { - LLVector3d tethered = mCameraRequestedPosition; - - // constrain 'tethered' to within 50m of mAvatarPosition. + if (mVoiceModule) { - F32 max_dist = 50.0f; - LLVector3d camera_offset = mCameraRequestedPosition - mAvatarPosition; - F32 camera_distance = (F32)camera_offset.magVec(); - if(camera_distance > max_dist) - { - tethered = mAvatarPosition + - (max_dist / camera_distance) * camera_offset; - } + return mVoiceModule->voiceEnabled(); } - - if(dist_vec(mCameraPosition, tethered) > 0.1) + else { - mCameraPosition = tethered; - mSpatialCoordsDirty = true; + return false; } } -void LLVoiceClient::updatePosition(void) -{ - - if(gVoiceClient) - { - LLVOAvatar *agent = gAgent.getAvatarObject(); - LLViewerRegion *region = gAgent.getRegion(); - if(region && agent) - { - LLMatrix3 rot; - LLVector3d pos; - - // TODO: If camera and avatar velocity are actually used by the voice system, we could compute them here... - // They're currently always set to zero. - - // Send the current camera position to the voice code - rot.setRows(LLViewerCamera::getInstance()->getAtAxis(), LLViewerCamera::getInstance()->getLeftAxis (), LLViewerCamera::getInstance()->getUpAxis()); - pos = gAgent.getRegion()->getPosGlobalFromRegion(LLViewerCamera::getInstance()->getOrigin()); - - gVoiceClient->setCameraPosition( - pos, // position - LLVector3::zero, // velocity - rot); // rotation matrix - - // Send the current avatar position to the voice code - rot = agent->getRootJoint()->getWorldRotation().getMatrix3(); - - pos = agent->getPositionGlobal(); - // TODO: Can we get the head offset from outside the LLVOAvatar? -// pos += LLVector3d(mHeadOffset); - pos += LLVector3d(0.f, 0.f, 1.f); - - gVoiceClient->setAvatarPosition( - pos, // position - LLVector3::zero, // velocity - rot); // rotation matrix - } - } -} - -void LLVoiceClient::setCameraPosition(const LLVector3d &position, const LLVector3 &velocity, const LLMatrix3 &rot) +void LLVoiceClient::setVoiceEnabled(bool enabled) { - mCameraRequestedPosition = position; - - if(mCameraVelocity != velocity) - { - mCameraVelocity = velocity; - mSpatialCoordsDirty = true; - } - - if(mCameraRot != rot) - { - mCameraRot = rot; - mSpatialCoordsDirty = true; - } + if (mVoiceModule) mVoiceModule->setVoiceEnabled(enabled); } -void LLVoiceClient::setAvatarPosition(const LLVector3d &position, const LLVector3 &velocity, const LLMatrix3 &rot) +void LLVoiceClient::setLipSyncEnabled(BOOL enabled) { - if(dist_vec(mAvatarPosition, position) > 0.1) - { - mAvatarPosition = position; - mSpatialCoordsDirty = true; - } - - if(mAvatarVelocity != velocity) - { - mAvatarVelocity = velocity; - mSpatialCoordsDirty = true; - } - - if(mAvatarRot != rot) - { - mAvatarRot = rot; - mSpatialCoordsDirty = true; - } + if (mVoiceModule) mVoiceModule->setLipSyncEnabled(enabled); } -bool LLVoiceClient::channelFromRegion(LLViewerRegion *region, std::string &name) +BOOL LLVoiceClient::lipSyncEnabled() { - bool result = false; - - if(region) + if (mVoiceModule) { - name = region->getName(); + return mVoiceModule->lipSyncEnabled(); } - - if(!name.empty()) - result = true; - - return result; -} - -void LLVoiceClient::leaveChannel(void) -{ - if(getState() == stateRunning) + else { - LL_DEBUGS("Voice") << "leaving channel for teleport/logout" << LL_ENDL; - mChannelName.clear(); - sessionTerminate(); + return false; } } void LLVoiceClient::setMuteMic(bool muted) { - mMuteMic = muted; + if (mVoiceModule) mVoiceModule->setMuteMic(muted); } -bool LLVoiceClient::getMuteMic() const -{ - return mMuteMic; -} + +// ---------------------------------------------- +// PTT void LLVoiceClient::setUserPTTState(bool ptt) { - mUserPTTState = ptt; + if (mVoiceModule) mVoiceModule->setUserPTTState(ptt); } bool LLVoiceClient::getUserPTTState() { - return mUserPTTState; -} - -void LLVoiceClient::toggleUserPTTState(void) -{ - mUserPTTState = !mUserPTTState; -} - -void LLVoiceClient::setVoiceEnabled(bool enabled) -{ - if (enabled != mVoiceEnabled) + if (mVoiceModule) { - mVoiceEnabled = enabled; - LLVoiceClientStatusObserver::EStatusType status; - - if (enabled) - { - LLVoiceChannel::getCurrentVoiceChannel()->activate(); - status = LLVoiceClientStatusObserver::STATUS_VOICE_ENABLED; - } - else - { - // Turning voice off looses your current channel -- this makes sure the UI isn't out of sync when you re-enable it. - LLVoiceChannel::getCurrentVoiceChannel()->deactivate(); - status = LLVoiceClientStatusObserver::STATUS_VOICE_DISABLED; - } - - notifyStatusObservers(status); - } -} - -bool LLVoiceClient::voiceEnabled() -{ - return gSavedSettings.getBOOL("EnableVoiceChat") && !gSavedSettings.getBOOL("CmdLineDisableVoice"); -} - -//AD *TODO: investigate possible merge of voiceWorking() and voiceEnabled() into one non-static method -bool LLVoiceClient::voiceWorking() -{ - //Added stateSessionTerminated state to avoid problems with call in parcels with disabled voice (EXT-4758) - return (stateLoggedIn <= mState) && (mState <= stateSessionTerminated); -} - -void LLVoiceClient::setLipSyncEnabled(BOOL enabled) -{ - mLipSyncEnabled = enabled; -} - -BOOL LLVoiceClient::lipSyncEnabled() -{ - - if ( mVoiceEnabled && stateDisabled != getState() ) - { - return mLipSyncEnabled; + return mVoiceModule->getUserPTTState(); } else { - return FALSE; + return false; } } void LLVoiceClient::setUsePTT(bool usePTT) { - if(usePTT && !mUsePTT) - { - // When the user turns on PTT, reset the current state. - mUserPTTState = false; - } - mUsePTT = usePTT; + if (mVoiceModule) mVoiceModule->setUsePTT(usePTT); } void LLVoiceClient::setPTTIsToggle(bool PTTIsToggle) { - if(!PTTIsToggle && mPTTIsToggle) - { - // When the user turns off toggle, reset the current state. - mUserPTTState = false; - } - - mPTTIsToggle = PTTIsToggle; + if (mVoiceModule) mVoiceModule->setPTTIsToggle(PTTIsToggle); } bool LLVoiceClient::getPTTIsToggle() { - return mPTTIsToggle; -} - -void LLVoiceClient::setPTTKey(std::string &key) -{ - if(key == "MiddleMouse") + if (mVoiceModule) { - mPTTIsMiddleMouse = true; + return mVoiceModule->getPTTIsToggle(); } - else - { - mPTTIsMiddleMouse = false; - if(!LLKeyboard::keyFromString(key, &mPTTKey)) - { - // If the call failed, don't match any key. - key = KEY_NONE; - } + else { + return false; } -} -void LLVoiceClient::setEarLocation(S32 loc) -{ - if(mEarLocation != loc) - { - LL_DEBUGS("Voice") << "Setting mEarLocation to " << loc << LL_ENDL; - - mEarLocation = loc; - mSpatialCoordsDirty = true; - } } -void LLVoiceClient::setVoiceVolume(F32 volume) +void LLVoiceClient::inputUserControlState(bool down) { - int scaled_volume = scale_speaker_volume(volume); - - if(scaled_volume != mSpeakerVolume) - { - int min_volume = scale_speaker_volume(0); - if((scaled_volume == min_volume) || (mSpeakerVolume == min_volume)) - { - mSpeakerMuteDirty = true; - } - - mSpeakerVolume = scaled_volume; - mSpeakerVolumeDirty = true; - } + if (mVoiceModule) mVoiceModule->inputUserControlState(down); } -void LLVoiceClient::setMicGain(F32 volume) +void LLVoiceClient::toggleUserPTTState(void) { - int scaled_volume = scale_mic_volume(volume); - - if(scaled_volume != mMicVolume) - { - mMicVolume = scaled_volume; - mMicVolumeDirty = true; - } + if (mVoiceModule) mVoiceModule->toggleUserPTTState(); } void LLVoiceClient::keyDown(KEY key, MASK mask) { - if (gKeyboard->getKeyRepeated(key)) - { - // ignore auto-repeat keys - return; - } - - if(!mPTTIsMiddleMouse) - { - bool down = (mPTTKey != KEY_NONE) - && gKeyboard->getKeyDown(mPTTKey); - inputUserControlState(down); - } + if (mVoiceModule) mVoiceModule->keyDown(key, mask); } void LLVoiceClient::keyUp(KEY key, MASK mask) { - if(!mPTTIsMiddleMouse) - { - bool down = (mPTTKey != KEY_NONE) - && gKeyboard->getKeyDown(mPTTKey); - inputUserControlState(down); - } -} -void LLVoiceClient::inputUserControlState(bool down) -{ - if(mPTTIsToggle) - { - if(down) // toggle open-mic state on 'down' - { - toggleUserPTTState(); - } - } - else // set open-mic state as an absolute - { - setUserPTTState(down); - } + if (mVoiceModule) mVoiceModule->keyUp(key, mask); } void LLVoiceClient::middleMouseState(bool down) { - if(mPTTIsMiddleMouse) - { - inputUserControlState(down); - } + if (mVoiceModule) mVoiceModule->middleMouseState(down); } -///////////////////////////// -// Accessors for data related to nearby speakers + +//------------------------------------------- +// nearby speaker accessors + BOOL LLVoiceClient::getVoiceEnabled(const LLUUID& id) { - BOOL result = FALSE; - participantState *participant = findParticipantByID(id); - if(participant) + if (mVoiceModule) { - // I'm not sure what the semantics of this should be. - // For now, if we have any data about the user that came through the chat channel, assume they're voice-enabled. - result = TRUE; - } - - return result; -} - -BOOL LLVoiceClient::getIsSpeaking(const LLUUID& id) -{ - BOOL result = FALSE; - - participantState *participant = findParticipantByID(id); - if(participant) + return mVoiceModule->getVoiceEnabled(id); + } + else { - if (participant->mSpeakingTimeout.getElapsedTimeF32() > SPEAKING_TIMEOUT) - { - participant->mIsSpeaking = FALSE; - } - result = participant->mIsSpeaking; + return FALSE; } - - return result; } -BOOL LLVoiceClient::getIsModeratorMuted(const LLUUID& id) +std::string LLVoiceClient::getDisplayName(const LLUUID& id) { - BOOL result = FALSE; - - participantState *participant = findParticipantByID(id); - if(participant) + if (mVoiceModule) { - result = participant->mIsModeratorMuted; + return mVoiceModule->getDisplayName(id); } - - return result; -} - -F32 LLVoiceClient::getCurrentPower(const LLUUID& id) -{ - F32 result = 0; - participantState *participant = findParticipantByID(id); - if(participant) + else { - result = participant->mPower; + return std::string(); } - - return result; } - -std::string LLVoiceClient::getDisplayName(const LLUUID& id) +bool LLVoiceClient::isVoiceWorking() const { - std::string result; - participantState *participant = findParticipantByID(id); - if(participant) + if (mVoiceModule) { - result = participant->mDisplayName; + return mVoiceModule->isVoiceWorking(); } - - return result; + return false; } - -BOOL LLVoiceClient::getUsingPTT(const LLUUID& id) +BOOL LLVoiceClient::isParticipantAvatar(const LLUUID& id) { - BOOL result = FALSE; - - participantState *participant = findParticipantByID(id); - if(participant) + if (mVoiceModule) { - // I'm not sure what the semantics of this should be. - // Does "using PTT" mean they're configured with a push-to-talk button? - // For now, we know there's no PTT mechanism in place, so nobody is using it. + return mVoiceModule->isParticipantAvatar(id); } - - return result; -} - -BOOL LLVoiceClient::getOnMuteList(const LLUUID& id) -{ - BOOL result = FALSE; - - participantState *participant = findParticipantByID(id); - if(participant) + else { - result = participant->mOnMuteList; + return FALSE; } - - return result; } -// External accessiors. Maps 0.0 to 1.0 to internal values 0-400 with .5 == 100 -// internal = 400 * external^2 -F32 LLVoiceClient::getUserVolume(const LLUUID& id) +BOOL LLVoiceClient::isOnlineSIP(const LLUUID& id) { - F32 result = 0.0f; - - participantState *participant = findParticipantByID(id); - if(participant) + if (mVoiceModule) { - S32 ires = 100; // nominal default volume - - if(participant->mIsSelf) - { - // Always make it look like the user's own volume is set at the default. - } - else if(participant->mUserVolume != -1) - { - // Use the internal volume - ires = participant->mUserVolume; - - // Enable this when debugging voice slider issues. It's way to spammy even for debug-level logging. -// LL_DEBUGS("Voice") << "mapping from mUserVolume " << ires << LL_ENDL; - } - else if(participant->mVolume != -1) - { - // Map backwards from vivox volume - - // Enable this when debugging voice slider issues. It's way to spammy even for debug-level logging. -// LL_DEBUGS("Voice") << "mapping from mVolume " << participant->mVolume << LL_ENDL; - - if(participant->mVolume < 56) - { - ires = (participant->mVolume * 100) / 56; - } - else - { - ires = (((participant->mVolume - 56) * 300) / (100 - 56)) + 100; - } - } - result = sqrtf(((F32)ires) / 400.f); + return mVoiceModule->isOnlineSIP(id); } - - // Enable this when debugging voice slider issues. It's way to spammy even for debug-level logging. -// LL_DEBUGS("Voice") << "returning " << result << LL_ENDL; - - return result; -} - -void LLVoiceClient::setUserVolume(const LLUUID& id, F32 volume) -{ - if(mAudioSession) + else { - participantState *participant = findParticipantByID(id); - if (participant) - { - // store this volume setting for future sessions - LLSpeakerVolumeStorage::getInstance()->storeSpeakerVolume(id, volume); - - // volume can amplify by as much as 4x! - S32 ivol = (S32)(400.f * volume * volume); - participant->mUserVolume = llclamp(ivol, 0, 400); - participant->mVolumeDirty = TRUE; - mAudioSession->mVolumeDirty = TRUE; - } + return FALSE; } } -std::string LLVoiceClient::getGroupID(const LLUUID& id) +BOOL LLVoiceClient::getIsSpeaking(const LLUUID& id) { - std::string result; - - participantState *participant = findParticipantByID(id); - if(participant) + if (mVoiceModule) { - result = participant->mGroupID; + return mVoiceModule->getIsSpeaking(id); } - - return result; -} - -BOOL LLVoiceClient::getAreaVoiceDisabled() -{ - return mAreaVoiceDisabled; -} - -void LLVoiceClient::recordingLoopStart(int seconds, int deltaFramesPerControlFrame) -{ -// LL_DEBUGS("Voice") << "sending SessionGroup.ControlRecording (Start)" << LL_ENDL; - - if(!mMainSessionGroupHandle.empty()) + else { - std::ostringstream stream; - stream - << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"SessionGroup.ControlRecording.1\">" - << "<SessionGroupHandle>" << mMainSessionGroupHandle << "</SessionGroupHandle>" - << "<RecordingControlType>Start</RecordingControlType>" - << "<DeltaFramesPerControlFrame>" << deltaFramesPerControlFrame << "</DeltaFramesPerControlFrame>" - << "<Filename>" << "" << "</Filename>" - << "<EnableAudioRecordingEvents>false</EnableAudioRecordingEvents>" - << "<LoopModeDurationSeconds>" << seconds << "</LoopModeDurationSeconds>" - << "</Request>\n\n\n"; - - - writeString(stream.str()); + return FALSE; } } -void LLVoiceClient::recordingLoopSave(const std::string& filename) +BOOL LLVoiceClient::getIsModeratorMuted(const LLUUID& id) { -// LL_DEBUGS("Voice") << "sending SessionGroup.ControlRecording (Flush)" << LL_ENDL; - - if(mAudioSession != NULL && !mAudioSession->mGroupHandle.empty()) + if (mVoiceModule) { - std::ostringstream stream; - stream - << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"SessionGroup.ControlRecording.1\">" - << "<SessionGroupHandle>" << mMainSessionGroupHandle << "</SessionGroupHandle>" - << "<RecordingControlType>Flush</RecordingControlType>" - << "<Filename>" << filename << "</Filename>" - << "</Request>\n\n\n"; - - writeString(stream.str()); + return mVoiceModule->getIsModeratorMuted(id); } -} - -void LLVoiceClient::recordingStop() -{ -// LL_DEBUGS("Voice") << "sending SessionGroup.ControlRecording (Stop)" << LL_ENDL; - - if(mAudioSession != NULL && !mAudioSession->mGroupHandle.empty()) + else { - std::ostringstream stream; - stream - << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"SessionGroup.ControlRecording.1\">" - << "<SessionGroupHandle>" << mMainSessionGroupHandle << "</SessionGroupHandle>" - << "<RecordingControlType>Stop</RecordingControlType>" - << "</Request>\n\n\n"; - - writeString(stream.str()); + return FALSE; } } -void LLVoiceClient::filePlaybackStart(const std::string& filename) -{ -// LL_DEBUGS("Voice") << "sending SessionGroup.ControlPlayback (Start)" << LL_ENDL; - - if(mAudioSession != NULL && !mAudioSession->mGroupHandle.empty()) +F32 LLVoiceClient::getCurrentPower(const LLUUID& id) +{ + if (mVoiceModule) { - std::ostringstream stream; - stream - << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"SessionGroup.ControlPlayback.1\">" - << "<SessionGroupHandle>" << mMainSessionGroupHandle << "</SessionGroupHandle>" - << "<RecordingControlType>Start</RecordingControlType>" - << "<Filename>" << filename << "</Filename>" - << "</Request>\n\n\n"; - - writeString(stream.str()); + return mVoiceModule->getCurrentPower(id); } -} - -void LLVoiceClient::filePlaybackStop() -{ -// LL_DEBUGS("Voice") << "sending SessionGroup.ControlPlayback (Stop)" << LL_ENDL; - - if(mAudioSession != NULL && !mAudioSession->mGroupHandle.empty()) + else { - std::ostringstream stream; - stream - << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"SessionGroup.ControlPlayback.1\">" - << "<SessionGroupHandle>" << mMainSessionGroupHandle << "</SessionGroupHandle>" - << "<RecordingControlType>Stop</RecordingControlType>" - << "</Request>\n\n\n"; - - writeString(stream.str()); + return 0.0; } } -void LLVoiceClient::filePlaybackSetPaused(bool paused) +BOOL LLVoiceClient::getOnMuteList(const LLUUID& id) { - // TODO: Implement once Vivox gives me a sample + if (mVoiceModule) + { + return mVoiceModule->getOnMuteList(id); + } + else + { + return FALSE; + } } -void LLVoiceClient::filePlaybackSetMode(bool vox, float speed) +F32 LLVoiceClient::getUserVolume(const LLUUID& id) { - // TODO: Implement once Vivox gives me a sample + if (mVoiceModule) + { + return mVoiceModule->getUserVolume(id); + } + else + { + return 0.0; + } } -LLVoiceClient::sessionState::sessionState() : - mErrorStatusCode(0), - mMediaStreamState(streamStateUnknown), - mTextStreamState(streamStateUnknown), - mCreateInProgress(false), - mMediaConnectInProgress(false), - mVoiceInvitePending(false), - mTextInvitePending(false), - mSynthesizedCallerID(false), - mIsChannel(false), - mIsSpatial(false), - mIsP2P(false), - mIncoming(false), - mVoiceEnabled(false), - mReconnect(false), - mVolumeDirty(false), - mParticipantsChanged(false) +void LLVoiceClient::setUserVolume(const LLUUID& id, F32 volume) { + if (mVoiceModule) mVoiceModule->setUserVolume(id, volume); } -LLVoiceClient::sessionState::~sessionState() -{ - removeAllParticipants(); -} +//-------------------------------------------------- +// status observers -bool LLVoiceClient::sessionState::isCallBackPossible() +void LLVoiceClient::addObserver(LLVoiceClientStatusObserver* observer) { - // This may change to be explicitly specified by vivox in the future... - // Currently, only PSTN P2P calls cannot be returned. - // Conveniently, this is also the only case where we synthesize a caller UUID. - return !mSynthesizedCallerID; + if (mVoiceModule) mVoiceModule->addObserver(observer); } -bool LLVoiceClient::sessionState::isTextIMPossible() +void LLVoiceClient::removeObserver(LLVoiceClientStatusObserver* observer) { - // This may change to be explicitly specified by vivox in the future... - return !mSynthesizedCallerID; + if (mVoiceModule) mVoiceModule->removeObserver(observer); } - -LLVoiceClient::sessionIterator LLVoiceClient::sessionsBegin(void) +void LLVoiceClient::addObserver(LLFriendObserver* observer) { - return mSessions.begin(); + if (mVoiceModule) mVoiceModule->addObserver(observer); } -LLVoiceClient::sessionIterator LLVoiceClient::sessionsEnd(void) +void LLVoiceClient::removeObserver(LLFriendObserver* observer) { - return mSessions.end(); + if (mVoiceModule) mVoiceModule->removeObserver(observer); } - -LLVoiceClient::sessionState *LLVoiceClient::findSession(const std::string &handle) +void LLVoiceClient::addObserver(LLVoiceClientParticipantObserver* observer) { - sessionState *result = NULL; - sessionMap::iterator iter = mSessionsByHandle.find(&handle); - if(iter != mSessionsByHandle.end()) - { - result = iter->second; - } - - return result; -} - -LLVoiceClient::sessionState *LLVoiceClient::findSessionBeingCreatedByURI(const std::string &uri) -{ - sessionState *result = NULL; - for(sessionIterator iter = sessionsBegin(); iter != sessionsEnd(); iter++) - { - sessionState *session = *iter; - if(session->mCreateInProgress && (session->mSIPURI == uri)) - { - result = session; - break; - } - } - - return result; + if (mVoiceModule) mVoiceModule->addObserver(observer); } -LLVoiceClient::sessionState *LLVoiceClient::findSession(const LLUUID &participant_id) +void LLVoiceClient::removeObserver(LLVoiceClientParticipantObserver* observer) { - sessionState *result = NULL; - - for(sessionIterator iter = sessionsBegin(); iter != sessionsEnd(); iter++) - { - sessionState *session = *iter; - if((session->mCallerID == participant_id) || (session->mIMSessionID == participant_id)) - { - result = session; - break; - } - } - - return result; + if (mVoiceModule) mVoiceModule->removeObserver(observer); } -LLVoiceClient::sessionState *LLVoiceClient::addSession(const std::string &uri, const std::string &handle) +std::string LLVoiceClient::sipURIFromID(const LLUUID &id) { - sessionState *result = NULL; - - if(handle.empty()) - { - // No handle supplied. - // Check whether there's already a session with this URI - for(sessionIterator iter = sessionsBegin(); iter != sessionsEnd(); iter++) - { - sessionState *s = *iter; - if((s->mSIPURI == uri) || (s->mAlternateSIPURI == uri)) - { - // TODO: I need to think about this logic... it's possible that this case should raise an internal error. - result = s; - break; - } - } - } - else // (!handle.empty()) + if (mVoiceModule) { - // Check for an existing session with this handle - sessionMap::iterator iter = mSessionsByHandle.find(&handle); - - if(iter != mSessionsByHandle.end()) - { - result = iter->second; - } - } - - if(!result) - { - // No existing session found. - - LL_DEBUGS("Voice") << "adding new session: handle " << handle << " URI " << uri << LL_ENDL; - result = new sessionState(); - result->mSIPURI = uri; - result->mHandle = handle; - - mSessions.insert(result); - - if(!result->mHandle.empty()) - { - mSessionsByHandle.insert(sessionMap::value_type(&(result->mHandle), result)); - } + return mVoiceModule->sipURIFromID(id); } else { - // Found an existing session - - if(uri != result->mSIPURI) - { - // TODO: Should this be an internal error? - LL_DEBUGS("Voice") << "changing uri from " << result->mSIPURI << " to " << uri << LL_ENDL; - setSessionURI(result, uri); - } - - if(handle != result->mHandle) - { - if(handle.empty()) - { - // There's at least one race condition where where addSession was clearing an existing session handle, which caused things to break. - LL_DEBUGS("Voice") << "NOT clearing handle " << result->mHandle << LL_ENDL; - } - else - { - // TODO: Should this be an internal error? - LL_DEBUGS("Voice") << "changing handle from " << result->mHandle << " to " << handle << LL_ENDL; - setSessionHandle(result, handle); - } - } - - LL_DEBUGS("Voice") << "returning existing session: handle " << handle << " URI " << uri << LL_ENDL; + return std::string(); } - - verifySessionState(); - - return result; } -void LLVoiceClient::setSessionHandle(sessionState *session, const std::string &handle) +LLVoiceEffectInterface* LLVoiceClient::getVoiceEffectInterface() const { - // Have to remove the session from the handle-indexed map before changing the handle, or things will break badly. - - if(!session->mHandle.empty()) - { - // Remove session from the map if it should have been there. - sessionMap::iterator iter = mSessionsByHandle.find(&(session->mHandle)); - if(iter != mSessionsByHandle.end()) - { - if(iter->second != session) - { - LL_ERRS("Voice") << "Internal error: session mismatch!" << LL_ENDL; - } - - mSessionsByHandle.erase(iter); - } - else - { - LL_ERRS("Voice") << "Internal error: session handle not found in map!" << LL_ENDL; - } - } - - session->mHandle = handle; - - if(!handle.empty()) - { - mSessionsByHandle.insert(sessionMap::value_type(&(session->mHandle), session)); - } - - verifySessionState(); + return getVoiceEffectEnabled() ? dynamic_cast<LLVoiceEffectInterface*>(mVoiceModule) : NULL; } -void LLVoiceClient::setSessionURI(sessionState *session, const std::string &uri) -{ - // There used to be a map of session URIs to sessions, which made this complex.... - session->mSIPURI = uri; +/////////////////// +// version checking - verifySessionState(); -} - -void LLVoiceClient::deleteSession(sessionState *session) +class LLViewerRequiredVoiceVersion : public LLHTTPNode { - // Remove the session from the handle map - if(!session->mHandle.empty()) + static BOOL sAlertedUser; + virtual void post( + LLHTTPNode::ResponsePtr response, + const LLSD& context, + const LLSD& input) const { - sessionMap::iterator iter = mSessionsByHandle.find(&(session->mHandle)); - if(iter != mSessionsByHandle.end()) + //You received this messsage (most likely on region cross or + //teleport) + if ( input.has("body") && input["body"].has("major_version") ) { - if(iter->second != session) + int major_voice_version = + input["body"]["major_version"].asInteger(); + // int minor_voice_version = + // input["body"]["minor_version"].asInteger(); + LLVoiceVersionInfo versionInfo = LLVoiceClient::getInstance()->getVersion(); + + if (major_voice_version > 1) { - LL_ERRS("Voice") << "Internal error: session mismatch" << LL_ENDL; + if (!sAlertedUser) + { + //sAlertedUser = TRUE; + LLNotificationsUtil::add("VoiceVersionMismatch"); + gSavedSettings.setBOOL("EnableVoiceChat", FALSE); // toggles listener + } } - mSessionsByHandle.erase(iter); } } +}; - // Remove the session from the URI map - mSessions.erase(session); - - // At this point, the session should be unhooked from all lists and all state should be consistent. - verifySessionState(); - - // If this is the current audio session, clean up the pointer which will soon be dangling. - if(mAudioSession == session) - { - mAudioSession = NULL; - mAudioSessionChanged = true; - } - - // ditto for the next audio session - if(mNextAudioSession == session) - { - mNextAudioSession = NULL; - } - - // delete the session - delete session; -} - -void LLVoiceClient::deleteAllSessions() -{ - LL_DEBUGS("Voice") << "called" << LL_ENDL; - - while(!mSessions.empty()) - { - deleteSession(*(sessionsBegin())); - } - - if(!mSessionsByHandle.empty()) - { - LL_ERRS("Voice") << "Internal error: empty session map, non-empty handle map" << LL_ENDL; - } -} - -void LLVoiceClient::verifySessionState(void) +class LLViewerParcelVoiceInfo : public LLHTTPNode { - // This is mostly intended for debugging problems with session state management. - LL_DEBUGS("Voice") << "Total session count: " << mSessions.size() << " , session handle map size: " << mSessionsByHandle.size() << LL_ENDL; - - for(sessionIterator iter = sessionsBegin(); iter != sessionsEnd(); iter++) + virtual void post( + LLHTTPNode::ResponsePtr response, + const LLSD& context, + const LLSD& input) const { - sessionState *session = *iter; - - LL_DEBUGS("Voice") << "session " << session << ": handle " << session->mHandle << ", URI " << session->mSIPURI << LL_ENDL; + //the parcel you are in has changed something about its + //voice information - if(!session->mHandle.empty()) + //this is a misnomer, as it can also be when you are not in + //a parcel at all. Should really be something like + //LLViewerVoiceInfoChanged..... + if ( input.has("body") ) { - // every session with a non-empty handle needs to be in the handle map - sessionMap::iterator i2 = mSessionsByHandle.find(&(session->mHandle)); - if(i2 == mSessionsByHandle.end()) - { - LL_ERRS("Voice") << "internal error (handle " << session->mHandle << " not found in session map)" << LL_ENDL; - } - else + LLSD body = input["body"]; + + //body has "region_name" (str), "parcel_local_id"(int), + //"voice_credentials" (map). + + //body["voice_credentials"] has "channel_uri" (str), + //body["voice_credentials"] has "channel_credentials" (str) + + //if we really wanted to be extra careful, + //we'd check the supplied + //local parcel id to make sure it's for the same parcel + //we believe we're in + if ( body.has("voice_credentials") ) { - if(i2->second != session) + LLSD voice_credentials = body["voice_credentials"]; + std::string uri; + std::string credentials; + + if ( voice_credentials.has("channel_uri") ) { - LL_ERRS("Voice") << "internal error (handle " << session->mHandle << " in session map points to another session)" << LL_ENDL; + uri = voice_credentials["channel_uri"].asString(); } + if ( voice_credentials.has("channel_credentials") ) + { + credentials = + voice_credentials["channel_credentials"].asString(); + } + + LLVoiceClient::getInstance()->setSpatialChannel(uri, credentials); } } } - - // check that every entry in the handle map points to a valid session in the session set - for(sessionMap::iterator iter = mSessionsByHandle.begin(); iter != mSessionsByHandle.end(); iter++) - { - sessionState *session = iter->second; - sessionIterator i2 = mSessions.find(session); - if(i2 == mSessions.end()) - { - LL_ERRS("Voice") << "internal error (session for handle " << session->mHandle << " not found in session map)" << LL_ENDL; - } - else - { - if(session->mHandle != (*i2)->mHandle) - { - LL_ERRS("Voice") << "internal error (session for handle " << session->mHandle << " points to session with different handle " << (*i2)->mHandle << ")" << LL_ENDL; - } - } - } -} +}; -LLVoiceClient::buddyListEntry::buddyListEntry(const std::string &uri) : - mURI(uri) -{ - mOnlineSL = false; - mOnlineSLim = false; - mCanSeeMeOnline = true; - mHasBlockListEntry = false; - mHasAutoAcceptListEntry = false; - mNameResolved = false; - mInVivoxBuddies = false; - mInSLFriends = false; - mNeedsNameUpdate = false; -} +const std::string LLSpeakerVolumeStorage::SETTINGS_FILE_NAME = "volume_settings.xml"; -void LLVoiceClient::processBuddyListEntry(const std::string &uri, const std::string &displayName) +LLSpeakerVolumeStorage::LLSpeakerVolumeStorage() { - buddyListEntry *buddy = addBuddy(uri, displayName); - buddy->mInVivoxBuddies = true; + load(); } -LLVoiceClient::buddyListEntry *LLVoiceClient::addBuddy(const std::string &uri) +LLSpeakerVolumeStorage::~LLSpeakerVolumeStorage() { - std::string empty; - buddyListEntry *buddy = addBuddy(uri, empty); - if(buddy->mDisplayName.empty()) - { - buddy->mNameResolved = false; - } - return buddy; + save(); } -LLVoiceClient::buddyListEntry *LLVoiceClient::addBuddy(const std::string &uri, const std::string &displayName) +void LLSpeakerVolumeStorage::storeSpeakerVolume(const LLUUID& speaker_id, F32 volume) { - buddyListEntry *result = NULL; - buddyListMap::iterator iter = mBuddyListMap.find(&uri); - - if(iter != mBuddyListMap.end()) - { - // Found a matching buddy already in the map. - LL_DEBUGS("Voice") << "adding existing buddy " << uri << LL_ENDL; - result = iter->second; - } - - if(!result) + if ((volume >= LLVoiceClient::VOLUME_MIN) && (volume <= LLVoiceClient::VOLUME_MAX)) { - // participant isn't already in one list or the other. - LL_DEBUGS("Voice") << "adding new buddy " << uri << LL_ENDL; - result = new buddyListEntry(uri); - result->mDisplayName = displayName; - - if(IDFromName(uri, result->mUUID)) - { - // Extracted UUID from name successfully. - } - else - { - LL_DEBUGS("Voice") << "Couldn't find ID for buddy " << uri << " (\"" << displayName << "\")" << LL_ENDL; - } + mSpeakersData[speaker_id] = volume; - mBuddyListMap.insert(buddyListMap::value_type(&(result->mURI), result)); + // Enable this when debugging voice slider issues. It's way to spammy even for debug-level logging. + // LL_DEBUGS("Voice") << "Stored volume = " << volume << " for " << id << LL_ENDL; } - - return result; -} - -LLVoiceClient::buddyListEntry *LLVoiceClient::findBuddy(const std::string &uri) -{ - buddyListEntry *result = NULL; - buddyListMap::iterator iter = mBuddyListMap.find(&uri); - if(iter != mBuddyListMap.end()) - { - result = iter->second; - } - - return result; -} - -LLVoiceClient::buddyListEntry *LLVoiceClient::findBuddy(const LLUUID &id) -{ - buddyListEntry *result = NULL; - buddyListMap::iterator iter; - - for(iter = mBuddyListMap.begin(); iter != mBuddyListMap.end(); iter++) + else { - if(iter->second->mUUID == id) - { - result = iter->second; - break; - } + LL_WARNS("Voice") << "Attempted to store out of range volume " << volume << " for " << speaker_id << LL_ENDL; + llassert(0); } - - return result; } -LLVoiceClient::buddyListEntry *LLVoiceClient::findBuddyByDisplayName(const std::string &name) +bool LLSpeakerVolumeStorage::getSpeakerVolume(const LLUUID& speaker_id, F32& volume) { - buddyListEntry *result = NULL; - buddyListMap::iterator iter; - - for(iter = mBuddyListMap.begin(); iter != mBuddyListMap.end(); iter++) - { - if(iter->second->mDisplayName == name) - { - result = iter->second; - break; - } - } + speaker_data_map_t::const_iterator it = mSpeakersData.find(speaker_id); - return result; -} - -void LLVoiceClient::deleteBuddy(const std::string &uri) -{ - buddyListMap::iterator iter = mBuddyListMap.find(&uri); - if(iter != mBuddyListMap.end()) - { - LL_DEBUGS("Voice") << "deleting buddy " << uri << LL_ENDL; - buddyListEntry *buddy = iter->second; - mBuddyListMap.erase(iter); - delete buddy; - } - else + if (it != mSpeakersData.end()) { - LL_DEBUGS("Voice") << "attempt to delete nonexistent buddy " << uri << LL_ENDL; - } - -} + volume = it->second; -void LLVoiceClient::deleteAllBuddies(void) -{ - while(!mBuddyListMap.empty()) - { - deleteBuddy(*(mBuddyListMap.begin()->first)); - } - - // Don't want to correlate with friends list when we've emptied the buddy list. - mBuddyListMapPopulated = false; - - // Don't want to correlate with friends list when we've reset the block rules. - mBlockRulesListReceived = false; - mAutoAcceptRulesListReceived = false; -} + // Enable this when debugging voice slider issues. It's way to spammy even for debug-level logging. + // LL_DEBUGS("Voice") << "Retrieved stored volume = " << volume << " for " << id << LL_ENDL; -void LLVoiceClient::deleteAllBlockRules(void) -{ - // Clear the block list entry flags from all local buddy list entries - buddyListMap::iterator buddy_it; - for(buddy_it = mBuddyListMap.begin(); buddy_it != mBuddyListMap.end(); buddy_it++) - { - buddy_it->second->mHasBlockListEntry = false; + return true; } -} -void LLVoiceClient::deleteAllAutoAcceptRules(void) -{ - // Clear the auto-accept list entry flags from all local buddy list entries - buddyListMap::iterator buddy_it; - for(buddy_it = mBuddyListMap.begin(); buddy_it != mBuddyListMap.end(); buddy_it++) - { - buddy_it->second->mHasAutoAcceptListEntry = false; - } + return false; } -void LLVoiceClient::addBlockRule(const std::string &blockMask, const std::string &presenceOnly) +void LLSpeakerVolumeStorage::removeSpeakerVolume(const LLUUID& speaker_id) { - buddyListEntry *buddy = NULL; - - // blockMask is the SIP URI of a friends list entry - buddyListMap::iterator iter = mBuddyListMap.find(&blockMask); - if(iter != mBuddyListMap.end()) - { - LL_DEBUGS("Voice") << "block list entry for " << blockMask << LL_ENDL; - buddy = iter->second; - } + mSpeakersData.erase(speaker_id); - if(buddy == NULL) - { - LL_DEBUGS("Voice") << "block list entry for unknown buddy " << blockMask << LL_ENDL; - buddy = addBuddy(blockMask); - } - - if(buddy != NULL) - { - buddy->mHasBlockListEntry = true; - } + // Enable this when debugging voice slider issues. It's way to spammy even for debug-level logging. + // LL_DEBUGS("Voice") << "Removing stored volume for " << id << LL_ENDL; } -void LLVoiceClient::addAutoAcceptRule(const std::string &autoAcceptMask, const std::string &autoAddAsBuddy) +/* static */ F32 LLSpeakerVolumeStorage::transformFromLegacyVolume(F32 volume_in) { - buddyListEntry *buddy = NULL; + // Convert to linear-logarithmic [0.0..1.0] with 0.5 = 0dB + // from legacy characteristic composed of two square-curves + // that intersect at volume_in = 0.5, volume_out = 0.56 - // blockMask is the SIP URI of a friends list entry - buddyListMap::iterator iter = mBuddyListMap.find(&autoAcceptMask); - if(iter != mBuddyListMap.end()) - { - LL_DEBUGS("Voice") << "auto-accept list entry for " << autoAcceptMask << LL_ENDL; - buddy = iter->second; - } + F32 volume_out = 0.f; + volume_in = llclamp(volume_in, 0.f, 1.0f); - if(buddy == NULL) + if (volume_in <= 0.5f) { - LL_DEBUGS("Voice") << "auto-accept list entry for unknown buddy " << autoAcceptMask << LL_ENDL; - buddy = addBuddy(autoAcceptMask); + volume_out = volume_in * volume_in * 4.f * 0.56f; } - - if(buddy != NULL) + else { - buddy->mHasAutoAcceptListEntry = true; + volume_out = (1.f - 0.56f) * (4.f * volume_in * volume_in - 1.f) / 3.f + 0.56f; } -} -void LLVoiceClient::accountListBlockRulesResponse(int statusCode, const std::string &statusString) -{ - // Block list entries were updated via addBlockRule() during parsing. Just flag that we're done. - mBlockRulesListReceived = true; + return volume_out; } -void LLVoiceClient::accountListAutoAcceptRulesResponse(int statusCode, const std::string &statusString) +/* static */ F32 LLSpeakerVolumeStorage::transformToLegacyVolume(F32 volume_in) { - // Block list entries were updated via addBlockRule() during parsing. Just flag that we're done. - mAutoAcceptRulesListReceived = true; -} + // Convert from linear-logarithmic [0.0..1.0] with 0.5 = 0dB + // to legacy characteristic composed of two square-curves + // that intersect at volume_in = 0.56, volume_out = 0.5 -void LLVoiceClient::addObserver(LLVoiceClientParticipantObserver* observer) -{ - mParticipantObservers.insert(observer); -} + F32 volume_out = 0.f; + volume_in = llclamp(volume_in, 0.f, 1.0f); -void LLVoiceClient::removeObserver(LLVoiceClientParticipantObserver* observer) -{ - mParticipantObservers.erase(observer); -} - -void LLVoiceClient::notifyParticipantObservers() -{ - for (observer_set_t::iterator it = mParticipantObservers.begin(); - it != mParticipantObservers.end(); - ) + if (volume_in <= 0.56f) { - LLVoiceClientParticipantObserver* observer = *it; - observer->onChange(); - // In case onChange() deleted an entry. - it = mParticipantObservers.upper_bound(observer); + volume_out = sqrt(volume_in / (4.f * 0.56f)); } -} - -void LLVoiceClient::addObserver(LLVoiceClientStatusObserver* observer) -{ - mStatusObservers.insert(observer); -} - -void LLVoiceClient::removeObserver(LLVoiceClientStatusObserver* observer) -{ - mStatusObservers.erase(observer); -} - -void LLVoiceClient::notifyStatusObservers(LLVoiceClientStatusObserver::EStatusType status) -{ - if(mAudioSession) - { - if(status == LLVoiceClientStatusObserver::ERROR_UNKNOWN) - { - switch(mAudioSession->mErrorStatusCode) - { - case 20713: status = LLVoiceClientStatusObserver::ERROR_CHANNEL_FULL; break; - case 20714: status = LLVoiceClientStatusObserver::ERROR_CHANNEL_LOCKED; break; - case 20715: - //invalid channel, we may be using a set of poorly cached - //info - status = LLVoiceClientStatusObserver::ERROR_NOT_AVAILABLE; - break; - case 1009: - //invalid username and password - status = LLVoiceClientStatusObserver::ERROR_NOT_AVAILABLE; - break; - } - - // Reset the error code to make sure it won't be reused later by accident. - mAudioSession->mErrorStatusCode = 0; - } - else if(status == LLVoiceClientStatusObserver::STATUS_LEFT_CHANNEL) - { - switch(mAudioSession->mErrorStatusCode) - { - case 404: // NOT_FOUND - case 480: // TEMPORARILY_UNAVAILABLE - case 408: // REQUEST_TIMEOUT - // call failed because other user was not available - // treat this as an error case - status = LLVoiceClientStatusObserver::ERROR_NOT_AVAILABLE; - - // Reset the error code to make sure it won't be reused later by accident. - mAudioSession->mErrorStatusCode = 0; - break; - } - } - } - - LL_DEBUGS("Voice") - << " " << LLVoiceClientStatusObserver::status2string(status) - << ", session URI " << getAudioSessionURI() - << (inSpatialChannel()?", proximal is true":", proximal is false") - << LL_ENDL; - - for (status_observer_set_t::iterator it = mStatusObservers.begin(); - it != mStatusObservers.end(); - ) + else { - LLVoiceClientStatusObserver* observer = *it; - observer->onChange(status, getAudioSessionURI(), inSpatialChannel()); - // In case onError() deleted an entry. - it = mStatusObservers.upper_bound(observer); + volume_out = sqrt((3.f * (volume_in - 0.56f) / (1.f - 0.56f) + 1.f) / 4.f); } + return volume_out; } -void LLVoiceClient::addObserver(LLFriendObserver* observer) -{ - mFriendObservers.insert(observer); -} - -void LLVoiceClient::removeObserver(LLFriendObserver* observer) -{ - mFriendObservers.erase(observer); -} - -void LLVoiceClient::notifyFriendObservers() +void LLSpeakerVolumeStorage::load() { - for (friend_observer_set_t::iterator it = mFriendObservers.begin(); - it != mFriendObservers.end(); - ) - { - LLFriendObserver* observer = *it; - it++; - // The only friend-related thing we notify on is online/offline transitions. - observer->changed(LLFriendObserver::ONLINE); - } -} + // load per-resident voice volume information + std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, SETTINGS_FILE_NAME); -void LLVoiceClient::lookupName(const LLUUID &id) -{ - BOOL is_group = FALSE; - gCacheName->get(id, is_group, &LLVoiceClient::onAvatarNameLookup); -} + LL_INFOS("Voice") << "Loading stored speaker volumes from: " << filename << LL_ENDL; -//static -void LLVoiceClient::onAvatarNameLookup(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group) -{ - if(gVoiceClient) + LLSD settings_llsd; + llifstream file; + file.open(filename); + if (file.is_open()) { - std::string name = llformat("%s %s", first.c_str(), last.c_str()); - gVoiceClient->avatarNameResolved(id, name); + LLSDSerialize::fromXML(settings_llsd, file); } -} -void LLVoiceClient::avatarNameResolved(const LLUUID &id, const std::string &name) -{ - // If the avatar whose name just resolved is on our friends list, resync the friends list. - if(LLAvatarTracker::instance().getBuddyInfo(id) != NULL) - { - mFriendsListDirty = true; - } - - // Iterate over all sessions. - for(sessionIterator iter = sessionsBegin(); iter != sessionsEnd(); iter++) + for (LLSD::map_const_iterator iter = settings_llsd.beginMap(); + iter != settings_llsd.endMap(); ++iter) { - sessionState *session = *iter; - - // Check for this user as a participant in this session - participantState *participant = session->findParticipantByID(id); - if(participant) - { - // Found -- fill in the name - participant->mAccountName = name; - // and post a "participants updated" message to listeners later. - session->mParticipantsChanged = true; - } - - // Check whether this is a p2p session whose caller name just resolved - if(session->mCallerID == id) - { - // this session's "caller ID" just resolved. Fill in the name. - session->mName = name; - if(session->mTextInvitePending) - { - session->mTextInvitePending = false; + // Maintain compatibility with 1.23 non-linear saved volume levels + F32 volume = transformFromLegacyVolume((F32)iter->second.asReal()); - // We don't need to call gIMMgr->addP2PSession() here. The first incoming message will create the panel. - } - if(session->mVoiceInvitePending) - { - session->mVoiceInvitePending = false; - - gIMMgr->inviteToSession( - session->mIMSessionID, - session->mName, - session->mCallerID, - session->mName, - IM_SESSION_P2P_INVITE, - LLIMMgr::INVITATION_TYPE_VOICE, - session->mHandle, - session->mSIPURI); - } - - } + storeSpeakerVolume(LLUUID(iter->first), volume); } } -class LLViewerParcelVoiceInfo : public LLHTTPNode +void LLSpeakerVolumeStorage::save() { - virtual void post( - LLHTTPNode::ResponsePtr response, - const LLSD& context, - const LLSD& input) const + // If we quit from the login screen we will not have an SL account + // name. Don't try to save, otherwise we'll dump a file in + // C:\Program Files\SecondLife\ or similar. JC + std::string user_dir = gDirUtilp->getLindenUserDir(); + if (!user_dir.empty()) { - //the parcel you are in has changed something about its - //voice information - - //this is a misnomer, as it can also be when you are not in - //a parcel at all. Should really be something like - //LLViewerVoiceInfoChanged..... - if ( input.has("body") ) - { - LLSD body = input["body"]; - - //body has "region_name" (str), "parcel_local_id"(int), - //"voice_credentials" (map). - - //body["voice_credentials"] has "channel_uri" (str), - //body["voice_credentials"] has "channel_credentials" (str) - - //if we really wanted to be extra careful, - //we'd check the supplied - //local parcel id to make sure it's for the same parcel - //we believe we're in - if ( body.has("voice_credentials") ) - { - LLSD voice_credentials = body["voice_credentials"]; - std::string uri; - std::string credentials; - - if ( voice_credentials.has("channel_uri") ) - { - uri = voice_credentials["channel_uri"].asString(); - } - if ( voice_credentials.has("channel_credentials") ) - { - credentials = - voice_credentials["channel_credentials"].asString(); - } + std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, SETTINGS_FILE_NAME); + LLSD settings_llsd; - gVoiceClient->setSpatialChannel(uri, credentials); - } - } - } -}; + LL_INFOS("Voice") << "Saving stored speaker volumes to: " << filename << LL_ENDL; -class LLViewerRequiredVoiceVersion : public LLHTTPNode -{ - static BOOL sAlertedUser; - virtual void post( - LLHTTPNode::ResponsePtr response, - const LLSD& context, - const LLSD& input) const - { - //You received this messsage (most likely on region cross or - //teleport) - if ( input.has("body") && input["body"].has("major_version") ) + for(speaker_data_map_t::const_iterator iter = mSpeakersData.begin(); iter != mSpeakersData.end(); ++iter) { - int major_voice_version = - input["body"]["major_version"].asInteger(); -// int minor_voice_version = -// input["body"]["minor_version"].asInteger(); + // Maintain compatibility with 1.23 non-linear saved volume levels + F32 volume = transformToLegacyVolume(iter->second); - if (gVoiceClient && - (major_voice_version > VOICE_MAJOR_VERSION) ) - { - if (!sAlertedUser) - { - //sAlertedUser = TRUE; - LLNotificationsUtil::add("VoiceVersionMismatch"); - gSavedSettings.setBOOL("EnableVoiceChat", FALSE); // toggles listener - } - } + settings_llsd[iter->first.asString()] = volume; } + + llofstream file; + file.open(filename); + LLSDSerialize::toPrettyXML(settings_llsd, file); } -}; +} + BOOL LLViewerRequiredVoiceVersion::sAlertedUser = FALSE; LLHTTPRegistration<LLViewerParcelVoiceInfo> - gHTTPRegistrationMessageParcelVoiceInfo( - "/message/ParcelVoiceInfo"); +gHTTPRegistrationMessageParcelVoiceInfo( + "/message/ParcelVoiceInfo"); LLHTTPRegistration<LLViewerRequiredVoiceVersion> - gHTTPRegistrationMessageRequiredVoiceVersion( - "/message/RequiredVoiceVersion"); +gHTTPRegistrationMessageRequiredVoiceVersion( + "/message/RequiredVoiceVersion"); diff --git a/indra/newview/llvoiceclient.h b/indra/newview/llvoiceclient.h index a96cf18e27..0e3d9a5435 100644 --- a/indra/newview/llvoiceclient.h +++ b/indra/newview/llvoiceclient.h @@ -17,8 +17,7 @@ * There are special exceptions to the terms and conditions of the GPL as * it is applied to this Source Code. View the full text of the exception * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception * * By copying, modifying or distributing this software, you acknowledge * that you have read and understood your obligations described above, @@ -33,7 +32,6 @@ #define LL_VOICE_CLIENT_H class LLVOAvatar; -class LLVivoxProtocolParser; #include "lliopipe.h" #include "llpumpio.h" @@ -42,16 +40,25 @@ class LLVivoxProtocolParser; #include "v3math.h" #include "llframetimer.h" #include "llviewerregion.h" -#include "m3math.h" // LLMatrix3 +#include "llcallingcard.h" // for LLFriendObserver +#include "llsecapi.h" +#include "llcontrol.h" + +// devices + +typedef std::vector<std::string> LLVoiceDeviceList; + -class LLFriendObserver; class LLVoiceClientParticipantObserver { public: virtual ~LLVoiceClientParticipantObserver() { } - virtual void onChange() = 0; + virtual void onParticipantsChanged() = 0; }; + +/////////////////////////////////// +/// @class LLVoiceClientStatusObserver class LLVoiceClientStatusObserver { public: @@ -65,11 +72,7 @@ public: STATUS_JOINED, STATUS_LEFT_CHANNEL, STATUS_VOICE_DISABLED, - - // Adding STATUS_VOICE_ENABLED as pair status for STATUS_VOICE_DISABLED - // See LLVoiceClient::setVoiceEnabled() STATUS_VOICE_ENABLED, - BEGIN_ERROR_STATUS, ERROR_CHANNEL_FULL, ERROR_CHANNEL_LOCKED, @@ -83,690 +86,447 @@ public: static std::string status2string(EStatusType inStatus); }; -class LLVoiceClient: public LLSingleton<LLVoiceClient> +struct LLVoiceVersionInfo { - LOG_CLASS(LLVoiceClient); - public: - LLVoiceClient(); - ~LLVoiceClient(); - - public: - static void init(LLPumpIO *pump); // Call this once at application startup (creates connector) - static void terminate(); // Call this to clean up during shutdown - - protected: - bool writeString(const std::string &str); - - public: - - static F32 OVERDRIVEN_POWER_LEVEL; + std::string serverType; + std::string serverVersion; +}; + +////////////////////////////////// +/// @class LLVoiceModuleInterface +/// @brief Voice module interface +/// +/// Voice modules should provide an implementation for this interface. +///////////////////////////////// - void updateSettings(); // call after loading settings and whenever they change +class LLVoiceModuleInterface +{ +public: + LLVoiceModuleInterface() {} + virtual ~LLVoiceModuleInterface() {} - void getCaptureDevicesSendMessage(); - void getRenderDevicesSendMessage(); - - void clearCaptureDevices(); - void addCaptureDevice(const std::string& name); - void setCaptureDevice(const std::string& name); - - void clearRenderDevices(); - void addRenderDevice(const std::string& name); - void setRenderDevice(const std::string& name); - - void tuningStart(); - void tuningStop(); - bool inTuningMode(); - bool inTuningStates(); - - void tuningRenderStartSendMessage(const std::string& name, bool loop); - void tuningRenderStopSendMessage(); + virtual void init(LLPumpIO *pump)=0; // Call this once at application startup (creates connector) + virtual void terminate()=0; // Call this to clean up during shutdown + + virtual void updateSettings()=0; // call after loading settings and whenever they change + + virtual bool isVoiceWorking() const = 0; // connected to a voice server and voice channel - void tuningCaptureStartSendMessage(int duration); - void tuningCaptureStopSendMessage(); - - void tuningSetMicVolume(float volume); - void tuningSetSpeakerVolume(float volume); - float tuningGetEnergy(void); - - // This returns true when it's safe to bring up the "device settings" dialog in the prefs. - // i.e. when the daemon is running and connected, and the device lists are populated. - bool deviceSettingsAvailable(); - - // Requery the vivox daemon for the current list of input/output devices. - // If you pass true for clearCurrentList, deviceSettingsAvailable() will be false until the query has completed - // (use this if you want to know when it's done). - // If you pass false, you'll have no way to know when the query finishes, but the device lists will not appear empty in the interim. - void refreshDeviceLists(bool clearCurrentList = true); - - // Call this if the connection to the daemon terminates unexpectedly. It will attempt to reset everything and relaunch. - void daemonDied(); + virtual const LLVoiceVersionInfo& getVersion()=0; + + ///////////////////// + /// @name Tuning + //@{ + virtual void tuningStart()=0; + virtual void tuningStop()=0; + virtual bool inTuningMode()=0; + + virtual void tuningSetMicVolume(float volume)=0; + virtual void tuningSetSpeakerVolume(float volume)=0; + virtual float tuningGetEnergy(void)=0; + //@} + + ///////////////////// + /// @name Devices + //@{ + // This returns true when it's safe to bring up the "device settings" dialog in the prefs. + // i.e. when the daemon is running and connected, and the device lists are populated. + virtual bool deviceSettingsAvailable()=0; + + // Requery the vivox daemon for the current list of input/output devices. + // If you pass true for clearCurrentList, deviceSettingsAvailable() will be false until the query has completed + // (use this if you want to know when it's done). + // If you pass false, you'll have no way to know when the query finishes, but the device lists will not appear empty in the interim. + virtual void refreshDeviceLists(bool clearCurrentList = true)=0; + + virtual void setCaptureDevice(const std::string& name)=0; + virtual void setRenderDevice(const std::string& name)=0; + + virtual LLVoiceDeviceList& getCaptureDevices()=0; + virtual LLVoiceDeviceList& getRenderDevices()=0; + + virtual void getParticipantList(std::set<LLUUID> &participants)=0; + virtual bool isParticipant(const LLUUID& speaker_id)=0; + //@} + + //////////////////////////// + /// @ name Channel stuff + //@{ + // returns true iff the user is currently in a proximal (local spatial) channel. + // Note that gestures should only fire if this returns true. + virtual bool inProximalChannel()=0; + + virtual void setNonSpatialChannel(const std::string &uri, + const std::string &credentials)=0; + + virtual void setSpatialChannel(const std::string &uri, + const std::string &credentials)=0; + + virtual void leaveNonSpatialChannel()=0; + + virtual void leaveChannel(void)=0; + + // Returns the URI of the current channel, or an empty string if not currently in a channel. + // NOTE that it will return an empty string if it's in the process of joining a channel. + virtual std::string getCurrentChannel()=0; + //@} + + + ////////////////////////// + /// @name invitations + //@{ + // start a voice channel with the specified user + virtual void callUser(const LLUUID &uuid)=0; + virtual bool isValidChannel(std::string& channelHandle)=0; + virtual bool answerInvite(std::string &channelHandle)=0; + virtual void declineInvite(std::string &channelHandle)=0; + //@} + + ///////////////////////// + /// @name Volume/gain + //@{ + virtual void setVoiceVolume(F32 volume)=0; + virtual void setMicGain(F32 volume)=0; + //@} + + ///////////////////////// + /// @name enable disable voice and features + //@{ + virtual bool voiceEnabled()=0; + virtual void setVoiceEnabled(bool enabled)=0; + virtual void setLipSyncEnabled(BOOL enabled)=0; + virtual BOOL lipSyncEnabled()=0; + virtual void setMuteMic(bool muted)=0; // Use this to mute the local mic (for when the client is minimized, etc), ignoring user PTT state. + //@} + + //////////////////////// + /// @name PTT + //@{ + virtual void setUserPTTState(bool ptt)=0; + virtual bool getUserPTTState()=0; + virtual void setUsePTT(bool usePTT)=0; + virtual void setPTTIsToggle(bool PTTIsToggle)=0; + virtual bool getPTTIsToggle()=0; + virtual void toggleUserPTTState(void)=0; + virtual void inputUserControlState(bool down)=0; // interpret any sort of up-down mic-open control input according to ptt-toggle prefs + + virtual void keyDown(KEY key, MASK mask)=0; + virtual void keyUp(KEY key, MASK mask)=0; + virtual void middleMouseState(bool down)=0; + //@} + + ////////////////////////// + /// @name nearby speaker accessors + //@{ + virtual BOOL getVoiceEnabled(const LLUUID& id)=0; // true if we've received data for this avatar + virtual std::string getDisplayName(const LLUUID& id)=0; + virtual BOOL isOnlineSIP(const LLUUID &id)=0; + virtual BOOL isParticipantAvatar(const LLUUID &id)=0; + virtual BOOL getIsSpeaking(const LLUUID& id)=0; + virtual BOOL getIsModeratorMuted(const LLUUID& id)=0; + virtual F32 getCurrentPower(const LLUUID& id)=0; // "power" is related to "amplitude" in a defined way. I'm just not sure what the formula is... + virtual BOOL getOnMuteList(const LLUUID& id)=0; + virtual F32 getUserVolume(const LLUUID& id)=0; + virtual void setUserVolume(const LLUUID& id, F32 volume)=0; // set's volume for specified agent, from 0-1 (where .5 is nominal) + //@} + + ////////////////////////// + /// @name text chat + //@{ + virtual BOOL isSessionTextIMPossible(const LLUUID& id)=0; + virtual BOOL isSessionCallBackPossible(const LLUUID& id)=0; + virtual BOOL sendTextMessage(const LLUUID& participant_id, const std::string& message)=0; + virtual void endUserIMSession(const LLUUID &uuid)=0; + //@} + + // authorize the user + virtual void userAuthorized(const std::string& user_id, + const LLUUID &agentID)=0; + + ////////////////////////////// + /// @name Status notification + //@{ + virtual void addObserver(LLVoiceClientStatusObserver* observer)=0; + virtual void removeObserver(LLVoiceClientStatusObserver* observer)=0; + virtual void addObserver(LLFriendObserver* observer)=0; + virtual void removeObserver(LLFriendObserver* observer)=0; + virtual void addObserver(LLVoiceClientParticipantObserver* observer)=0; + virtual void removeObserver(LLVoiceClientParticipantObserver* observer)=0; + //@} + + virtual std::string sipURIFromID(const LLUUID &id)=0; + //@} + +}; - // Call this if we're just giving up on voice (can't provision an account, etc.). It will clean up and go away. - void giveUp(); - - ///////////////////////////// - // Response/Event handlers - void connectorCreateResponse(int statusCode, std::string &statusString, std::string &connectorHandle, std::string &versionID); - void loginResponse(int statusCode, std::string &statusString, std::string &accountHandle, int numberOfAliases); - void sessionCreateResponse(std::string &requestId, int statusCode, std::string &statusString, std::string &sessionHandle); - void sessionGroupAddSessionResponse(std::string &requestId, int statusCode, std::string &statusString, std::string &sessionHandle); - void sessionConnectResponse(std::string &requestId, int statusCode, std::string &statusString); - void logoutResponse(int statusCode, std::string &statusString); - void connectorShutdownResponse(int statusCode, std::string &statusString); - - void accountLoginStateChangeEvent(std::string &accountHandle, int statusCode, std::string &statusString, int state); - void mediaStreamUpdatedEvent(std::string &sessionHandle, std::string &sessionGroupHandle, int statusCode, std::string &statusString, int state, bool incoming); - void textStreamUpdatedEvent(std::string &sessionHandle, std::string &sessionGroupHandle, bool enabled, int state, bool incoming); - void sessionAddedEvent(std::string &uriString, std::string &alias, std::string &sessionHandle, std::string &sessionGroupHandle, bool isChannel, bool incoming, std::string &nameString, std::string &applicationString); - void sessionGroupAddedEvent(std::string &sessionGroupHandle); - void sessionRemovedEvent(std::string &sessionHandle, std::string &sessionGroupHandle); - void participantAddedEvent(std::string &sessionHandle, std::string &sessionGroupHandle, std::string &uriString, std::string &alias, std::string &nameString, std::string &displayNameString, int participantType); - void participantRemovedEvent(std::string &sessionHandle, std::string &sessionGroupHandle, std::string &uriString, std::string &alias, std::string &nameString); - void participantUpdatedEvent(std::string &sessionHandle, std::string &sessionGroupHandle, std::string &uriString, std::string &alias, bool isModeratorMuted, bool isSpeaking, int volume, F32 energy); - void auxAudioPropertiesEvent(F32 energy); - void buddyPresenceEvent(std::string &uriString, std::string &alias, std::string &statusString, std::string &applicationString); - void messageEvent(std::string &sessionHandle, std::string &uriString, std::string &alias, std::string &messageHeader, std::string &messageBody, std::string &applicationString); - void sessionNotificationEvent(std::string &sessionHandle, std::string &uriString, std::string ¬ificationType); - void subscriptionEvent(std::string &buddyURI, std::string &subscriptionHandle, std::string &alias, std::string &displayName, std::string &applicationString, std::string &subscriptionType); - - void buddyListChanged(); - void muteListChanged(); - void updateFriends(U32 mask); - - ///////////////////////////// - // Sending updates of current state -static void updatePosition(void); - void setCameraPosition(const LLVector3d &position, const LLVector3 &velocity, const LLMatrix3 &rot); - void setAvatarPosition(const LLVector3d &position, const LLVector3 &velocity, const LLMatrix3 &rot); - bool channelFromRegion(LLViewerRegion *region, std::string &name); - void leaveChannel(void); // call this on logout or teleport begin - - void setMuteMic(bool muted); // Use this to mute the local mic (for when the client is minimized, etc), ignoring user PTT state. - bool getMuteMic() const; - void setUserPTTState(bool ptt); - bool getUserPTTState(); - void toggleUserPTTState(void); - void inputUserControlState(bool down); // interpret any sort of up-down mic-open control input according to ptt-toggle prefs - void setVoiceEnabled(bool enabled); - static bool voiceEnabled(); - // Checks is voice working judging from mState - // Returns true if vivox has successfully logged in and is not in error state - bool voiceWorking(); - void setUsePTT(bool usePTT); - void setPTTIsToggle(bool PTTIsToggle); - bool getPTTIsToggle(); - void setPTTKey(std::string &key); - void setEarLocation(S32 loc); - void setVoiceVolume(F32 volume); - void setMicGain(F32 volume); - void setUserVolume(const LLUUID& id, F32 volume); // sets volume for specified agent, from 0-1 (where .5 is nominal) - void setLipSyncEnabled(BOOL enabled); - BOOL lipSyncEnabled(); - - // PTT key triggering - void keyDown(KEY key, MASK mask); - void keyUp(KEY key, MASK mask); - void middleMouseState(bool down); - - // Return the version of the Vivox library - std::string getAPIVersion() const { return mAPIVersion; } - - ///////////////////////////// - // Accessors for data related to nearby speakers - BOOL getVoiceEnabled(const LLUUID& id); // true if we've received data for this avatar - BOOL getIsSpeaking(const LLUUID& id); - BOOL getIsModeratorMuted(const LLUUID& id); - F32 getCurrentPower(const LLUUID& id); // "power" is related to "amplitude" in a defined way. I'm just not sure what the formula is... - BOOL getOnMuteList(const LLUUID& id); - F32 getUserVolume(const LLUUID& id); - std::string getDisplayName(const LLUUID& id); - - // MBW -- XXX -- Not sure how to get this data out of the TVC - BOOL getUsingPTT(const LLUUID& id); - std::string getGroupID(const LLUUID& id); // group ID if the user is in group chat (empty string if not applicable) +////////////////////////////////// +/// @class LLVoiceEffectObserver +class LLVoiceEffectObserver +{ +public: + virtual ~LLVoiceEffectObserver() { } + virtual void onVoiceEffectChanged(bool effect_list_updated) = 0; +}; - ///////////////////////////// - BOOL getAreaVoiceDisabled(); // returns true if the area the avatar is in is speech-disabled. - // Use this to determine whether to show a "no speech" icon in the menu bar. - - ///////////////////////////// - // Recording controls - void recordingLoopStart(int seconds = 3600, int deltaFramesPerControlFrame = 200); - void recordingLoopSave(const std::string& filename); - void recordingStop(); - - // Playback controls - void filePlaybackStart(const std::string& filename); - void filePlaybackStop(); - void filePlaybackSetPaused(bool paused); - void filePlaybackSetMode(bool vox = false, float speed = 1.0f); - - - // This is used by the string-keyed maps below, to avoid storing the string twice. - // The 'const std::string *' in the key points to a string actually stored in the object referenced by the map. - // The add and delete operations for each map allocate and delete in the right order to avoid dangling references. - // The default compare operation would just compare pointers, which is incorrect, so they must use this comparitor instead. - struct stringMapComparitor - { - bool operator()(const std::string* a, const std::string * b) const - { - return a->compare(*b) < 0; - } - }; - - struct uuidMapComparitor - { - bool operator()(const LLUUID* a, const LLUUID * b) const - { - return *a < *b; - } - }; - - struct participantState - { - public: - participantState(const std::string &uri); - - bool updateMuteState(); - bool isAvatar(); - - std::string mURI; - LLUUID mAvatarID; - std::string mAccountName; - std::string mDisplayName; - LLFrameTimer mSpeakingTimeout; - F32 mLastSpokeTimestamp; - F32 mPower; - int mVolume; - std::string mGroupID; - int mUserVolume; - bool mPTT; - bool mIsSpeaking; - bool mIsModeratorMuted; - bool mOnMuteList; // true if this avatar is on the user's mute list (and should be muted) - bool mVolumeDirty; // true if this participant needs a volume command sent (either mOnMuteList or mUserVolume has changed) - bool mAvatarIDValid; - bool mIsSelf; - }; - typedef std::map<const std::string *, participantState*, stringMapComparitor> participantMap; - - typedef std::map<const LLUUID *, participantState*, uuidMapComparitor> participantUUIDMap; - - enum streamState - { - streamStateUnknown = 0, - streamStateIdle = 1, - streamStateConnected = 2, - streamStateRinging = 3, - }; - - struct sessionState - { - public: - sessionState(); - ~sessionState(); - - participantState *addParticipant(const std::string &uri); - // Note: after removeParticipant returns, the participant* that was passed to it will have been deleted. - // Take care not to use the pointer again after that. - void removeParticipant(participantState *participant); - void removeAllParticipants(); - - participantState *findParticipant(const std::string &uri); - participantState *findParticipantByID(const LLUUID& id); - - bool isCallBackPossible(); - bool isTextIMPossible(); - - std::string mHandle; - std::string mGroupHandle; - std::string mSIPURI; - std::string mAlias; - std::string mName; - std::string mAlternateSIPURI; - std::string mHash; // Channel password - std::string mErrorStatusString; - std::queue<std::string> mTextMsgQueue; - - LLUUID mIMSessionID; - LLUUID mCallerID; - int mErrorStatusCode; - int mMediaStreamState; - int mTextStreamState; - bool mCreateInProgress; // True if a Session.Create has been sent for this session and no response has been received yet. - bool mMediaConnectInProgress; // True if a Session.MediaConnect has been sent for this session and no response has been received yet. - bool mVoiceInvitePending; // True if a voice invite is pending for this session (usually waiting on a name lookup) - bool mTextInvitePending; // True if a text invite is pending for this session (usually waiting on a name lookup) - bool mSynthesizedCallerID; // True if the caller ID is a hash of the SIP URI -- this means we shouldn't do a name lookup. - bool mIsChannel; // True for both group and spatial channels (false for p2p, PSTN) - bool mIsSpatial; // True for spatial channels - bool mIsP2P; - bool mIncoming; - bool mVoiceEnabled; - bool mReconnect; // Whether we should try to reconnect to this session if it's dropped - // Set to true when the mute state of someone in the participant list changes. - // The code will have to walk the list to find the changed participant(s). - bool mVolumeDirty; - - bool mParticipantsChanged; - participantMap mParticipantsByURI; - participantUUIDMap mParticipantsByUUID; - }; - - participantState *findParticipantByID(const LLUUID& id); - participantMap *getParticipantList(void); - void getParticipantsUUIDSet(std::set<LLUUID>& participant_uuids); - - typedef std::map<const std::string*, sessionState*, stringMapComparitor> sessionMap; - typedef std::set<sessionState*> sessionSet; - - typedef sessionSet::iterator sessionIterator; - sessionIterator sessionsBegin(void); - sessionIterator sessionsEnd(void); - - sessionState *findSession(const std::string &handle); - sessionState *findSessionBeingCreatedByURI(const std::string &uri); - sessionState *findSession(const LLUUID &participant_id); - sessionState *findSessionByCreateID(const std::string &create_id); - - sessionState *addSession(const std::string &uri, const std::string &handle = LLStringUtil::null); - void setSessionHandle(sessionState *session, const std::string &handle = LLStringUtil::null); - void setSessionURI(sessionState *session, const std::string &uri); - void deleteSession(sessionState *session); - void deleteAllSessions(void); +typedef std::multimap<const std::string, const LLUUID, LLDictionaryLess> voice_effect_list_t; - void verifySessionState(void); +////////////////////////////////// +/// @class LLVoiceEffectInterface +/// @brief Voice effect module interface +/// +/// Voice effect modules should provide an implementation for this interface. +///////////////////////////////// - void joinedAudioSession(sessionState *session); - void leftAudioSession(sessionState *session); +class LLVoiceEffectInterface +{ +public: + LLVoiceEffectInterface() {} + virtual ~LLVoiceEffectInterface() {} + + ////////////////////////// + /// @name Accessors + //@{ + virtual bool setVoiceEffect(const LLUUID& id) = 0; + virtual const LLUUID getVoiceEffect() = 0; + virtual LLSD getVoiceEffectProperties(const LLUUID& id) = 0; + + virtual void refreshVoiceEffectLists(bool clear_lists) = 0; + virtual const voice_effect_list_t &getVoiceEffectList() const = 0; + virtual const voice_effect_list_t &getVoiceEffectTemplateList() const = 0; + //@} + + ////////////////////////////// + /// @name Status notification + //@{ + virtual void addObserver(LLVoiceEffectObserver* observer) = 0; + virtual void removeObserver(LLVoiceEffectObserver* observer) = 0; + //@} + + ////////////////////////////// + /// @name Preview buffer + //@{ + virtual void enablePreviewBuffer(bool enable) = 0; + virtual void recordPreviewBuffer() = 0; + virtual void playPreviewBuffer(const LLUUID& effect_id = LLUUID::null) = 0; + virtual void stopPreviewBuffer() = 0; + + virtual bool isPreviewRecording() = 0; + virtual bool isPreviewPlaying() = 0; + //@} +}; - // This is called in several places where the session _may_ need to be deleted. - // It contains logic for whether to delete the session or keep it around. - void reapSession(sessionState *session); - - // Returns true if the session seems to indicate we've moved to a region on a different voice server - bool sessionNeedsRelog(sessionState *session); - - struct buddyListEntry - { - buddyListEntry(const std::string &uri); - std::string mURI; - std::string mDisplayName; - LLUUID mUUID; - bool mOnlineSL; - bool mOnlineSLim; - bool mCanSeeMeOnline; - bool mHasBlockListEntry; - bool mHasAutoAcceptListEntry; - bool mNameResolved; - bool mInSLFriends; - bool mInVivoxBuddies; - bool mNeedsNameUpdate; - }; - - typedef std::map<const std::string*, buddyListEntry*, stringMapComparitor> buddyListMap; - - // This should be called when parsing a buddy list entry sent by SLVoice. - void processBuddyListEntry(const std::string &uri, const std::string &displayName); - - buddyListEntry *addBuddy(const std::string &uri); - buddyListEntry *addBuddy(const std::string &uri, const std::string &displayName); - buddyListEntry *findBuddy(const std::string &uri); - buddyListEntry *findBuddy(const LLUUID &id); - buddyListEntry *findBuddyByDisplayName(const std::string &name); - void deleteBuddy(const std::string &uri); - void deleteAllBuddies(void); - - void deleteAllBlockRules(void); - void addBlockRule(const std::string &blockMask, const std::string &presenceOnly); - void deleteAllAutoAcceptRules(void); - void addAutoAcceptRule(const std::string &autoAcceptMask, const std::string &autoAddAsBuddy); - void accountListBlockRulesResponse(int statusCode, const std::string &statusString); - void accountListAutoAcceptRulesResponse(int statusCode, const std::string &statusString); - - ///////////////////////////// - // session control messages - void connectorCreate(); - void connectorShutdown(); - - void requestVoiceAccountProvision(S32 retries = 3); - void userAuthorized( - const std::string& firstName, - const std::string& lastName, - const LLUUID &agentID); - void login( - const std::string& account_name, - const std::string& password, - const std::string& voice_sip_uri_hostname, - const std::string& voice_account_server_uri); - void loginSendMessage(); - void logout(); - void logoutSendMessage(); - - void accountListBlockRulesSendMessage(); - void accountListAutoAcceptRulesSendMessage(); - - void sessionGroupCreateSendMessage(); - void sessionCreateSendMessage(sessionState *session, bool startAudio = true, bool startText = false); - void sessionGroupAddSessionSendMessage(sessionState *session, bool startAudio = true, bool startText = false); - void sessionMediaConnectSendMessage(sessionState *session); // just joins the audio session - void sessionTextConnectSendMessage(sessionState *session); // just joins the text session - void sessionTerminateSendMessage(sessionState *session); - void sessionGroupTerminateSendMessage(sessionState *session); - void sessionMediaDisconnectSendMessage(sessionState *session); - void sessionTextDisconnectSendMessage(sessionState *session); - - // Pokes the state machine to leave the audio session next time around. - void sessionTerminate(); - - // Pokes the state machine to shut down the connector and restart it. - void requestRelog(); - - // Does the actual work to get out of the audio session - void leaveAudioSession(); - - void addObserver(LLVoiceClientParticipantObserver* observer); - void removeObserver(LLVoiceClientParticipantObserver* observer); - void addObserver(LLVoiceClientStatusObserver* observer); - void removeObserver(LLVoiceClientStatusObserver* observer); +class LLVoiceClient: public LLSingleton<LLVoiceClient> +{ + LOG_CLASS(LLVoiceClient); +public: + LLVoiceClient(); + ~LLVoiceClient(); - void addObserver(LLFriendObserver* observer); - void removeObserver(LLFriendObserver* observer); - - void lookupName(const LLUUID &id); - static void onAvatarNameLookup(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group); - void avatarNameResolved(const LLUUID &id, const std::string &name); - - typedef std::vector<std::string> deviceList; + void init(LLPumpIO *pump); // Call this once at application startup (creates connector) + void terminate(); // Call this to clean up during shutdown + + const LLVoiceVersionInfo getVersion(); + + static const F32 OVERDRIVEN_POWER_LEVEL; - deviceList *getCaptureDevices(); - deviceList *getRenderDevices(); - - void setNonSpatialChannel( - const std::string &uri, - const std::string &credentials); - void setSpatialChannel( - const std::string &uri, - const std::string &credentials); - // start a voice session with the specified user - void callUser(const LLUUID &uuid); - - // Send a text message to the specified user, initiating the session if necessary. - bool sendTextMessage(const LLUUID& participant_id, const std::string& message); - - // close any existing text IM session with the specified user - void endUserIMSession(const LLUUID &uuid); - - bool answerInvite(std::string &sessionHandle); - void declineInvite(std::string &sessionHandle); - void leaveNonSpatialChannel(); + static const F32 VOLUME_MIN; + static const F32 VOLUME_DEFAULT; + static const F32 VOLUME_MAX; - // Returns the URI of the current channel, or an empty string if not currently in a channel. - // NOTE that it will return an empty string if it's in the process of joining a channel. - std::string getCurrentChannel(); - - // returns true iff the user is currently in a proximal (local spatial) channel. - // Note that gestures should only fire if this returns true. - bool inProximalChannel(); + void updateSettings(); // call after loading settings and whenever they change - std::string sipURIFromID(const LLUUID &id); - - // Returns true if the indicated user is online via SIP presence according to SLVoice. - // Note that we only get SIP presence data for other users that are in our vivox buddy list. - bool isOnlineSIP(const LLUUID &id); - - // Returns true if the indicated participant is really an SL avatar. - // This should be used to control the state of the "profile" button. - // Currently this will be false only for PSTN callers into group chats, and PSTN p2p calls. - bool isParticipantAvatar(const LLUUID &id); - - // Returns true if calling back the session URI after the session has closed is possible. - // Currently this will be false only for PSTN P2P calls. - // NOTE: this will return true if the session can't be found. - bool isSessionCallBackPossible(const LLUUID &session_id); - - // Returns true if the session can accepte text IM's. - // Currently this will be false only for PSTN P2P calls. - // NOTE: this will return true if the session can't be found. - bool isSessionTextIMPossible(const LLUUID &session_id); - - private: - - // internal state for a simple state machine. This is used to deal with the asynchronous nature of some of the messages. - // Note: if you change this list, please make corresponding changes to LLVoiceClient::state2string(). - enum state - { - stateDisableCleanup, - stateDisabled, // Voice is turned off. - stateStart, // Class is initialized, socket is created - stateDaemonLaunched, // Daemon has been launched - stateConnecting, // connect() call has been issued - stateConnected, // connection to the daemon has been made, send some initial setup commands. - stateIdle, // socket is connected, ready for messaging - stateMicTuningStart, - stateMicTuningRunning, - stateMicTuningStop, - stateConnectorStart, // connector needs to be started - stateConnectorStarting, // waiting for connector handle - stateConnectorStarted, // connector handle received - stateLoginRetry, // need to retry login (failed due to changing password) - stateLoginRetryWait, // waiting for retry timer - stateNeedsLogin, // send login request - stateLoggingIn, // waiting for account handle - stateLoggedIn, // account handle received - stateCreatingSessionGroup, // Creating the main session group - stateNoChannel, // - stateJoiningSession, // waiting for session handle - stateSessionJoined, // session handle received - stateRunning, // in session, steady state - stateLeavingSession, // waiting for terminate session response - stateSessionTerminated, // waiting for terminate session response - - stateLoggingOut, // waiting for logout response - stateLoggedOut, // logout response received - stateConnectorStopping, // waiting for connector stop - stateConnectorStopped, // connector stop received - - // We go to this state if the login fails because the account needs to be provisioned. - - // error states. No way to recover from these yet. - stateConnectorFailed, - stateConnectorFailedWaiting, - stateLoginFailed, - stateLoginFailedWaiting, - stateJoinSessionFailed, - stateJoinSessionFailedWaiting, - - stateJail // Go here when all else has failed. Nothing will be retried, we're done. - }; - - state mState; - bool mSessionTerminateRequested; - bool mRelogRequested; - - void setState(state inState); - state getState(void) { return mState; }; - static std::string state2string(state inState); - - void stateMachine(); - static void idle(void *user_data); - - LLHost mDaemonHost; - LLSocket::ptr_t mSocket; - bool mConnected; - - void closeSocket(void); - - LLPumpIO *mPump; - friend class LLVivoxProtocolParser; + bool isVoiceWorking() const; // connected to a voice server and voice channel + + // tuning + void tuningStart(); + void tuningStop(); + bool inTuningMode(); - std::string mAccountName; - std::string mAccountPassword; - std::string mAccountDisplayName; - std::string mAccountFirstName; - std::string mAccountLastName; + void tuningSetMicVolume(float volume); + void tuningSetSpeakerVolume(float volume); + float tuningGetEnergy(void); - bool mTuningMode; - float mTuningEnergy; - std::string mTuningAudioFile; - int mTuningMicVolume; - bool mTuningMicVolumeDirty; - int mTuningSpeakerVolume; - bool mTuningSpeakerVolumeDirty; - state mTuningExitState; // state to return to when we leave tuning mode. + // devices + + // This returns true when it's safe to bring up the "device settings" dialog in the prefs. + // i.e. when the daemon is running and connected, and the device lists are populated. + bool deviceSettingsAvailable(); - std::string mSpatialSessionURI; - std::string mSpatialSessionCredentials; + // Requery the vivox daemon for the current list of input/output devices. + // If you pass true for clearCurrentList, deviceSettingsAvailable() will be false until the query has completed + // (use this if you want to know when it's done). + // If you pass false, you'll have no way to know when the query finishes, but the device lists will not appear empty in the interim. + void refreshDeviceLists(bool clearCurrentList = true); - std::string mMainSessionGroupHandle; // handle of the "main" session group. - - std::string mChannelName; // Name of the channel to be looked up - bool mAreaVoiceDisabled; - sessionState *mAudioSession; // Session state for the current audio session - bool mAudioSessionChanged; // set to true when the above pointer gets changed, so observers can be notified. + void setCaptureDevice(const std::string& name); + void setRenderDevice(const std::string& name); - sessionState *mNextAudioSession; // Session state for the audio session we're trying to join + const LLVoiceDeviceList& getCaptureDevices(); + const LLVoiceDeviceList& getRenderDevices(); -// std::string mSessionURI; // URI of the session we're in. -// std::string mSessionHandle; // returned by ? - - S32 mCurrentParcelLocalID; // Used to detect parcel boundary crossings - std::string mCurrentRegionName; // Used to detect parcel boundary crossings - - std::string mConnectorHandle; // returned by "Create Connector" message - std::string mAccountHandle; // returned by login message - int mNumberOfAliases; - U32 mCommandCookie; + //////////////////////////// + // Channel stuff + // + + // returns true iff the user is currently in a proximal (local spatial) channel. + // Note that gestures should only fire if this returns true. + bool inProximalChannel(); + void setNonSpatialChannel( + const std::string &uri, + const std::string &credentials); + void setSpatialChannel( + const std::string &uri, + const std::string &credentials); + void leaveNonSpatialChannel(); + + // Returns the URI of the current channel, or an empty string if not currently in a channel. + // NOTE that it will return an empty string if it's in the process of joining a channel. + std::string getCurrentChannel(); + // start a voice channel with the specified user + void callUser(const LLUUID &uuid); + bool isValidChannel(std::string& channelHandle); + bool answerInvite(std::string &channelHandle); + void declineInvite(std::string &channelHandle); + void leaveChannel(void); // call this on logout or teleport begin + + + ///////////////////////////// + // Sending updates of current state - std::string mVoiceAccountServerURI; - std::string mVoiceSIPURIHostName; - - int mLoginRetryCount; - - sessionMap mSessionsByHandle; // Active sessions, indexed by session handle. Sessions which are being initiated may not be in this map. - sessionSet mSessions; // All sessions, not indexed. This is the canonical session list. - - bool mBuddyListMapPopulated; - bool mBlockRulesListReceived; - bool mAutoAcceptRulesListReceived; - buddyListMap mBuddyListMap; - - deviceList mCaptureDevices; - deviceList mRenderDevices; - std::string mCaptureDevice; - std::string mRenderDevice; - bool mCaptureDeviceDirty; - bool mRenderDeviceDirty; - - // This should be called when the code detects we have changed parcels. - // It initiates the call to the server that gets the parcel channel. - void parcelChanged(); - - void switchChannel(std::string uri = std::string(), bool spatial = true, bool no_reconnect = false, bool is_p2p = false, std::string hash = ""); - void joinSession(sessionState *session); - -static std::string nameFromAvatar(LLVOAvatar *avatar); -static std::string nameFromID(const LLUUID &id); -static bool IDFromName(const std::string name, LLUUID &uuid); -static std::string displayNameFromAvatar(LLVOAvatar *avatar); - std::string sipURIFromAvatar(LLVOAvatar *avatar); - std::string sipURIFromName(std::string &name); - - // Returns the name portion of the SIP URI if the string looks vaguely like a SIP URI, or an empty string if not. -static std::string nameFromsipURI(const std::string &uri); + void setVoiceVolume(F32 volume); + void setMicGain(F32 volume); + void setUserVolume(const LLUUID& id, F32 volume); // set's volume for specified agent, from 0-1 (where .5 is nominal) + bool voiceEnabled(); + void setLipSyncEnabled(BOOL enabled); + void setMuteMic(bool muted); // Use this to mute the local mic (for when the client is minimized, etc), ignoring user PTT state. + void setUserPTTState(bool ptt); + bool getUserPTTState(); + void toggleUserPTTState(void); + void inputUserControlState(bool down); // interpret any sort of up-down mic-open control input according to ptt-toggle prefs + void setVoiceEnabled(bool enabled); + + void setUsePTT(bool usePTT); + void setPTTIsToggle(bool PTTIsToggle); + bool getPTTIsToggle(); + + BOOL lipSyncEnabled(); + + // PTT key triggering + void keyDown(KEY key, MASK mask); + void keyUp(KEY key, MASK mask); + void middleMouseState(bool down); + + + ///////////////////////////// + // Accessors for data related to nearby speakers + BOOL getVoiceEnabled(const LLUUID& id); // true if we've received data for this avatar + std::string getDisplayName(const LLUUID& id); + BOOL isOnlineSIP(const LLUUID &id); + BOOL isParticipantAvatar(const LLUUID &id); + BOOL getIsSpeaking(const LLUUID& id); + BOOL getIsModeratorMuted(const LLUUID& id); + F32 getCurrentPower(const LLUUID& id); // "power" is related to "amplitude" in a defined way. I'm just not sure what the formula is... + BOOL getOnMuteList(const LLUUID& id); + F32 getUserVolume(const LLUUID& id); + + ///////////////////////////// + BOOL getAreaVoiceDisabled(); // returns true if the area the avatar is in is speech-disabled. + // Use this to determine whether to show a "no speech" icon in the menu bar. + void getParticipantList(std::set<LLUUID> &participants); + bool isParticipant(const LLUUID& speaker_id); + + ////////////////////////// + /// @name text chat + //@{ + BOOL isSessionTextIMPossible(const LLUUID& id); + BOOL isSessionCallBackPossible(const LLUUID& id); + BOOL sendTextMessage(const LLUUID& participant_id, const std::string& message); + void endUserIMSession(const LLUUID &uuid); + //@} + - bool inSpatialChannel(void); - std::string getAudioSessionURI(); - std::string getAudioSessionHandle(); - - void sendPositionalUpdate(void); - - void buildSetCaptureDevice(std::ostringstream &stream); - void buildSetRenderDevice(std::ostringstream &stream); - void buildLocalAudioUpdates(std::ostringstream &stream); - - void clearAllLists(); - void checkFriend(const LLUUID& id); - void sendFriendsListUpdates(); - - // start a text IM session with the specified user - // This will be asynchronous, the session may be established at a future time. - sessionState* startUserIMSession(const LLUUID& uuid); - void sendQueuedTextMessages(sessionState *session); - - void enforceTether(void); - - bool mSpatialCoordsDirty; - - LLVector3d mCameraPosition; - LLVector3d mCameraRequestedPosition; - LLVector3 mCameraVelocity; - LLMatrix3 mCameraRot; - - LLVector3d mAvatarPosition; - LLVector3 mAvatarVelocity; - LLMatrix3 mAvatarRot; - - bool mPTTDirty; - bool mPTT; - - bool mUsePTT; - bool mPTTIsMiddleMouse; - KEY mPTTKey; - bool mPTTIsToggle; - bool mUserPTTState; - bool mMuteMic; - - // Set to true when the friends list is known to have changed. - bool mFriendsListDirty; - - enum - { - earLocCamera = 0, // ear at camera - earLocAvatar, // ear at avatar - earLocMixed // ear at avatar location/camera direction - }; - - S32 mEarLocation; - - bool mSpeakerVolumeDirty; - bool mSpeakerMuteDirty; - int mSpeakerVolume; + void userAuthorized(const std::string& user_id, + const LLUUID &agentID); + + void addObserver(LLVoiceClientStatusObserver* observer); + void removeObserver(LLVoiceClientStatusObserver* observer); + void addObserver(LLFriendObserver* observer); + void removeObserver(LLFriendObserver* observer); + void addObserver(LLVoiceClientParticipantObserver* observer); + void removeObserver(LLVoiceClientParticipantObserver* observer); + + std::string sipURIFromID(const LLUUID &id); - int mMicVolume; - bool mMicVolumeDirty; - - bool mVoiceEnabled; - bool mWriteInProgress; - std::string mWriteString; - - LLTimer mUpdateTimer; - - BOOL mLipSyncEnabled; + ////////////////////////// + /// @name Voice effects + //@{ + bool getVoiceEffectEnabled() const { return mVoiceEffectEnabled; }; + LLUUID getVoiceEffectDefault() const { return LLUUID(mVoiceEffectDefault); }; - std::string mAPIVersion; + // Returns NULL if voice effects are not supported, or not enabled. + LLVoiceEffectInterface* getVoiceEffectInterface() const; + //@} - typedef std::set<LLVoiceClientParticipantObserver*> observer_set_t; - observer_set_t mParticipantObservers; +protected: + LLVoiceModuleInterface* mVoiceModule; + LLPumpIO *m_servicePump; - void notifyParticipantObservers(); + LLCachedControl<bool> mVoiceEffectEnabled; + LLCachedControl<std::string> mVoiceEffectDefault; +}; - typedef std::set<LLVoiceClientStatusObserver*> status_observer_set_t; - status_observer_set_t mStatusObservers; - - void notifyStatusObservers(LLVoiceClientStatusObserver::EStatusType status); +/** + * Speaker volume storage helper class + **/ +class LLSpeakerVolumeStorage : public LLSingleton<LLSpeakerVolumeStorage> +{ + LOG_CLASS(LLSpeakerVolumeStorage); +public: - typedef std::set<LLFriendObserver*> friend_observer_set_t; - friend_observer_set_t mFriendObservers; - void notifyFriendObservers(); + /** + * Stores volume level for specified user. + * + * @param[in] speaker_id - LLUUID of user to store volume level for. + * @param[in] volume - volume level to be stored for user. + */ + void storeSpeakerVolume(const LLUUID& speaker_id, F32 volume); + + /** + * Gets stored volume level for specified speaker + * + * @param[in] speaker_id - LLUUID of user to retrieve volume level for. + * @param[out] volume - set to stored volume if found, otherwise unmodified. + * @return - true if a stored volume is found. + */ + bool getSpeakerVolume(const LLUUID& speaker_id, F32& volume); + + /** + * Removes stored volume level for specified user. + * + * @param[in] speaker_id - LLUUID of user to remove. + */ + void removeSpeakerVolume(const LLUUID& speaker_id); + +private: + friend class LLSingleton<LLSpeakerVolumeStorage>; + LLSpeakerVolumeStorage(); + ~LLSpeakerVolumeStorage(); + + const static std::string SETTINGS_FILE_NAME; + + void load(); + void save(); + + static F32 transformFromLegacyVolume(F32 volume_in); + static F32 transformToLegacyVolume(F32 volume_in); + + typedef std::map<LLUUID, F32> speaker_data_map_t; + speaker_data_map_t mSpeakersData; }; -extern LLVoiceClient *gVoiceClient; - #endif //LL_VOICE_CLIENT_H diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp new file mode 100644 index 0000000000..4dc9edb247 --- /dev/null +++ b/indra/newview/llvoicevivox.cpp @@ -0,0 +1,7879 @@ + /** + * @file LLVivoxVoiceClient.cpp + * @brief Implementation of LLVivoxVoiceClient class which is the interface to the voice client process. + * + * $LicenseInfo:firstyear=2001&license=viewergpl$ + * + * Copyright (c) 2001-2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" +#include "llvoicevivox.h" + +#include <boost/tokenizer.hpp> + +#include "llsdutil.h" + +#include "llvoavatarself.h" +#include "llbufferstream.h" +#include "llfile.h" +#ifdef LL_STANDALONE +# include "expat.h" +#else +# include "expat/expat.h" +#endif +#include "llcallbacklist.h" +#include "llviewerregion.h" +#include "llviewernetwork.h" // for gGridChoice +#include "llbase64.h" +#include "llviewercontrol.h" +#include "llkeyboard.h" +#include "llappviewer.h" // for gDisconnected, gDisableVoice +#include "llmutelist.h" // to check for muted avatars +#include "llagent.h" +#include "llcachename.h" +#include "llimview.h" // for LLIMMgr +#include "llparcel.h" +#include "llviewerparcelmgr.h" +//#include "llfirstuse.h" +#include "llspeakers.h" +#include "lltrans.h" +#include "llviewerwindow.h" +#include "llviewercamera.h" + +#include "llfloaterfriends.h" //VIVOX, inorder to refresh communicate panel +#include "llviewernetwork.h" +#include "llnotificationsutil.h" + +#include "stringize.h" + +// for base64 decoding +#include "apr_base64.h" + +#define USE_SESSION_GROUPS 0 + +const F32 VOLUME_SCALE_VIVOX = 0.01f; + +const F32 SPEAKING_TIMEOUT = 1.f; + +static const std::string VOICE_SERVER_TYPE = "Vivox"; + +// Don't retry connecting to the daemon more frequently than this: +const F32 CONNECT_THROTTLE_SECONDS = 1.0f; + +// Don't send positional updates more frequently than this: +const F32 UPDATE_THROTTLE_SECONDS = 0.1f; + +const F32 LOGIN_RETRY_SECONDS = 10.0f; +const int MAX_LOGIN_RETRIES = 12; + +// Defines the maximum number of times(in a row) "stateJoiningSession" case for spatial channel is reached in stateMachine() +// which is treated as normal. If this number is exceeded we suspect there is a problem with connection +// to voice server (EXT-4313). When voice works correctly, there is from 1 to 15 times. 50 was chosen +// to make sure we don't make mistake when slight connection problems happen- situation when connection to server is +// blocked is VERY rare and it's better to sacrifice response time in this situation for the sake of stability. +const int MAX_NORMAL_JOINING_SPATIAL_NUM = 50; + +// How often to check for expired voice fonts in seconds +const F32 VOICE_FONT_EXPIRY_INTERVAL = 10.f; +// Time of day at which Vivox expires voice font subscriptions. +// Used to replace the time portion of received expiry timestamps. +static const std::string VOICE_FONT_EXPIRY_TIME = "T05:00:00Z"; + +// Maximum length of capture buffer recordings in seconds. +const F32 CAPTURE_BUFFER_MAX_TIME = 10.f; + + +static int scale_mic_volume(float volume) +{ + // incoming volume has the range [0.0 ... 2.0], with 1.0 as the default. + // Map it to Vivox levels as follows: 0.0 -> 30, 1.0 -> 50, 2.0 -> 70 + return 30 + (int)(volume * 20.0f); +} + +static int scale_speaker_volume(float volume) +{ + // incoming volume has the range [0.0 ... 1.0], with 0.5 as the default. + // Map it to Vivox levels as follows: 0.0 -> 30, 0.5 -> 50, 1.0 -> 70 + return 30 + (int)(volume * 40.0f); + +} + +class LLVivoxVoiceAccountProvisionResponder : + public LLHTTPClient::Responder +{ +public: + LLVivoxVoiceAccountProvisionResponder(int retries) + { + mRetries = retries; + } + + virtual void error(U32 status, const std::string& reason) + { + if ( mRetries > 0 ) + { + LL_WARNS("Voice") << "ProvisionVoiceAccountRequest returned an error, retrying. status = " << status << ", reason = \"" << reason << "\"" << LL_ENDL; + LLVivoxVoiceClient::getInstance()->requestVoiceAccountProvision( + mRetries - 1); + } + else + { + LL_WARNS("Voice") << "ProvisionVoiceAccountRequest returned an error, too many retries (giving up). status = " << status << ", reason = \"" << reason << "\"" << LL_ENDL; + LLVivoxVoiceClient::getInstance()->giveUp(); + } + } + + virtual void result(const LLSD& content) + { + + std::string voice_sip_uri_hostname; + std::string voice_account_server_uri; + + LL_DEBUGS("Voice") << "ProvisionVoiceAccountRequest response:" << ll_pretty_print_sd(content) << LL_ENDL; + + if(content.has("voice_sip_uri_hostname")) + voice_sip_uri_hostname = content["voice_sip_uri_hostname"].asString(); + + // this key is actually misnamed -- it will be an entire URI, not just a hostname. + if(content.has("voice_account_server_name")) + voice_account_server_uri = content["voice_account_server_name"].asString(); + + LLVivoxVoiceClient::getInstance()->login( + content["username"].asString(), + content["password"].asString(), + voice_sip_uri_hostname, + voice_account_server_uri); + + } + +private: + int mRetries; +}; + + + +/////////////////////////////////////////////////////////////////////////////////////////////// + +class LLVivoxVoiceClientMuteListObserver : public LLMuteListObserver +{ + /* virtual */ void onChange() { LLVivoxVoiceClient::getInstance()->muteListChanged();} +}; + +class LLVivoxVoiceClientFriendsObserver : public LLFriendObserver +{ +public: + /* virtual */ void changed(U32 mask) { LLVivoxVoiceClient::getInstance()->updateFriends(mask);} +}; + +static LLVivoxVoiceClientMuteListObserver mutelist_listener; +static bool sMuteListListener_listening = false; + +static LLVivoxVoiceClientFriendsObserver *friendslist_listener = NULL; + +/////////////////////////////////////////////////////////////////////////////////////////////// + +class LLVivoxVoiceClientCapResponder : public LLHTTPClient::Responder +{ +public: + LLVivoxVoiceClientCapResponder(void){}; + + virtual void error(U32 status, const std::string& reason); // called with bad status codes + virtual void result(const LLSD& content); + +private: +}; + +void LLVivoxVoiceClientCapResponder::error(U32 status, const std::string& reason) +{ + LL_WARNS("Voice") << "LLVivoxVoiceClientCapResponder::error(" + << status << ": " << reason << ")" + << LL_ENDL; +} + +void LLVivoxVoiceClientCapResponder::result(const LLSD& content) +{ + LLSD::map_const_iterator iter; + + LL_DEBUGS("Voice") << "ParcelVoiceInfoRequest response:" << ll_pretty_print_sd(content) << LL_ENDL; + + if ( content.has("voice_credentials") ) + { + LLSD voice_credentials = content["voice_credentials"]; + std::string uri; + std::string credentials; + + if ( voice_credentials.has("channel_uri") ) + { + uri = voice_credentials["channel_uri"].asString(); + } + if ( voice_credentials.has("channel_credentials") ) + { + credentials = + voice_credentials["channel_credentials"].asString(); + } + + LLVivoxVoiceClient::getInstance()->setSpatialChannel(uri, credentials); + } +} + + + +#if LL_WINDOWS +static HANDLE sGatewayHandle = 0; + +static bool isGatewayRunning() +{ + bool result = false; + if(sGatewayHandle != 0) + { + DWORD waitresult = WaitForSingleObject(sGatewayHandle, 0); + if(waitresult != WAIT_OBJECT_0) + { + result = true; + } + } + return result; +} +static void killGateway() +{ + if(sGatewayHandle != 0) + { + TerminateProcess(sGatewayHandle,0); + } +} + +#else // Mac and linux + +static pid_t sGatewayPID = 0; +static bool isGatewayRunning() +{ + bool result = false; + if(sGatewayPID != 0) + { + // A kill with signal number 0 has no effect, just does error checking. It should return an error if the process no longer exists. + if(kill(sGatewayPID, 0) == 0) + { + result = true; + } + } + return result; +} + +static void killGateway() +{ + if(sGatewayPID != 0) + { + kill(sGatewayPID, SIGTERM); + } +} + +#endif + +/////////////////////////////////////////////////////////////////////////////////////////////// + +LLVivoxVoiceClient::LLVivoxVoiceClient() : + mState(stateDisabled), + mSessionTerminateRequested(false), + mRelogRequested(false), + mConnected(false), + mPump(NULL), + mSpatialJoiningNum(0), + + mTuningMode(false), + mTuningEnergy(0.0f), + mTuningMicVolume(0), + mTuningMicVolumeDirty(true), + mTuningSpeakerVolume(0), + mTuningSpeakerVolumeDirty(true), + mTuningExitState(stateDisabled), + + mAreaVoiceDisabled(false), + mAudioSession(NULL), + mAudioSessionChanged(false), + mNextAudioSession(NULL), + + mCurrentParcelLocalID(0), + mNumberOfAliases(0), + mCommandCookie(0), + mLoginRetryCount(0), + + mBuddyListMapPopulated(false), + mBlockRulesListReceived(false), + mAutoAcceptRulesListReceived(false), + + mCaptureDeviceDirty(false), + mRenderDeviceDirty(false), + mSpatialCoordsDirty(false), + + mPTTDirty(true), + mPTT(true), + mUsePTT(true), + mPTTIsMiddleMouse(false), + mPTTKey(0), + mPTTIsToggle(false), + mUserPTTState(false), + mMuteMic(false), + mFriendsListDirty(true), + + mEarLocation(0), + mSpeakerVolumeDirty(true), + mSpeakerMuteDirty(true), + mMicVolume(0), + mMicVolumeDirty(true), + + mVoiceEnabled(false), + mWriteInProgress(false), + + mLipSyncEnabled(false), + + mVoiceFontsReceived(false), + mVoiceFontsNew(false), + mVoiceFontListDirty(false), + + mCaptureBufferMode(false), + mCaptureBufferRecording(false), + mCaptureBufferRecorded(false), + mCaptureBufferPlaying(false), + mPlayRequestCount(0) +{ + mSpeakerVolume = scale_speaker_volume(0); + + mVoiceVersion.serverVersion = ""; + mVoiceVersion.serverType = VOICE_SERVER_TYPE; + + // gMuteListp isn't set up at this point, so we defer this until later. +// gMuteListp->addObserver(&mutelist_listener); + + +#if LL_DARWIN || LL_LINUX || LL_SOLARIS + // HACK: THIS DOES NOT BELONG HERE + // When the vivox daemon dies, the next write attempt on our socket generates a SIGPIPE, which kills us. + // This should cause us to ignore SIGPIPE and handle the error through proper channels. + // This should really be set up elsewhere. Where should it go? + signal(SIGPIPE, SIG_IGN); + + // Since we're now launching the gateway with fork/exec instead of system(), we need to deal with zombie processes. + // Ignoring SIGCHLD should prevent zombies from being created. Alternately, we could use wait(), but I'd rather not do that. + signal(SIGCHLD, SIG_IGN); +#endif + + // set up state machine + setState(stateDisabled); + + gIdleCallbacks.addFunction(idle, this); +} + +//--------------------------------------------------- + +LLVivoxVoiceClient::~LLVivoxVoiceClient() +{ +} + +//---------------------------------------------- + +void LLVivoxVoiceClient::init(LLPumpIO *pump) +{ + // constructor will set up LLVoiceClient::getInstance() + LLVivoxVoiceClient::getInstance()->mPump = pump; +} + +void LLVivoxVoiceClient::terminate() +{ + if(mConnected) + { + logout(); + connectorShutdown(); + closeSocket(); // Need to do this now -- bad things happen if the destructor does it later. + } + else + { + killGateway(); + } +} + +const LLVoiceVersionInfo& LLVivoxVoiceClient::getVersion() +{ + return mVoiceVersion; +} + +//--------------------------------------------------- + +void LLVivoxVoiceClient::updateSettings() +{ + setVoiceEnabled(gSavedSettings.getBOOL("EnableVoiceChat")); + setUsePTT(gSavedSettings.getBOOL("PTTCurrentlyEnabled")); + std::string keyString = gSavedSettings.getString("PushToTalkButton"); + setPTTKey(keyString); + setPTTIsToggle(gSavedSettings.getBOOL("PushToTalkToggle")); + setEarLocation(gSavedSettings.getS32("VoiceEarLocation")); + + std::string inputDevice = gSavedSettings.getString("VoiceInputAudioDevice"); + setCaptureDevice(inputDevice); + std::string outputDevice = gSavedSettings.getString("VoiceOutputAudioDevice"); + setRenderDevice(outputDevice); + F32 mic_level = gSavedSettings.getF32("AudioLevelMic"); + setMicGain(mic_level); + setLipSyncEnabled(gSavedSettings.getBOOL("LipSyncEnabled")); +} + +///////////////////////////// +// utility functions + +bool LLVivoxVoiceClient::writeString(const std::string &str) +{ + bool result = false; + if(mConnected) + { + apr_status_t err; + apr_size_t size = (apr_size_t)str.size(); + apr_size_t written = size; + + //MARK: Turn this on to log outgoing XML +// LL_DEBUGS("Voice") << "sending: " << str << LL_ENDL; + + // check return code - sockets will fail (broken, etc.) + err = apr_socket_send( + mSocket->getSocket(), + (const char*)str.data(), + &written); + + if(err == 0) + { + // Success. + result = true; + } + // TODO: handle partial writes (written is number of bytes written) + // Need to set socket to non-blocking before this will work. +// else if(APR_STATUS_IS_EAGAIN(err)) +// { +// // +// } + else + { + // Assume any socket error means something bad. For now, just close the socket. + char buf[MAX_STRING]; + LL_WARNS("Voice") << "apr error " << err << " ("<< apr_strerror(err, buf, MAX_STRING) << ") sending data to vivox daemon." << LL_ENDL; + daemonDied(); + } + } + + return result; +} + + +///////////////////////////// +// session control messages +void LLVivoxVoiceClient::connectorCreate() +{ + std::ostringstream stream; + std::string logpath = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, ""); + std::string loglevel = "0"; + + // Transition to stateConnectorStarted when the connector handle comes back. + setState(stateConnectorStarting); + + std::string savedLogLevel = gSavedSettings.getString("VivoxDebugLevel"); + + if(savedLogLevel != "-1") + { + LL_DEBUGS("Voice") << "creating connector with logging enabled" << LL_ENDL; + loglevel = "10"; + } + + stream + << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Connector.Create.1\">" + << "<ClientName>V2 SDK</ClientName>" + << "<AccountManagementServer>" << mVoiceAccountServerURI << "</AccountManagementServer>" + << "<Mode>Normal</Mode>" + << "<Logging>" + << "<Folder>" << logpath << "</Folder>" + << "<FileNamePrefix>Connector</FileNamePrefix>" + << "<FileNameSuffix>.log</FileNameSuffix>" + << "<LogLevel>" << loglevel << "</LogLevel>" + << "</Logging>" + << "<Application>SecondLifeViewer.1</Application>" + << "</Request>\n\n\n"; + + writeString(stream.str()); +} + +void LLVivoxVoiceClient::connectorShutdown() +{ + setState(stateConnectorStopping); + + if(!mConnectorHandle.empty()) + { + std::ostringstream stream; + stream + << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Connector.InitiateShutdown.1\">" + << "<ConnectorHandle>" << mConnectorHandle << "</ConnectorHandle>" + << "</Request>" + << "\n\n\n"; + + mConnectorHandle.clear(); + + writeString(stream.str()); + } +} + +void LLVivoxVoiceClient::userAuthorized(const std::string& user_id, const LLUUID &agentID) +{ + + mAccountDisplayName = user_id; + + LL_INFOS("Voice") << "name \"" << mAccountDisplayName << "\" , ID " << agentID << LL_ENDL; + + mAccountName = nameFromID(agentID); +} + +void LLVivoxVoiceClient::requestVoiceAccountProvision(S32 retries) +{ + if ( gAgent.getRegion() && mVoiceEnabled ) + { + std::string url = + gAgent.getRegion()->getCapability( + "ProvisionVoiceAccountRequest"); + + if ( url == "" ) return; + + LLHTTPClient::post( + url, + LLSD(), + new LLVivoxVoiceAccountProvisionResponder(retries)); + } +} + +void LLVivoxVoiceClient::login( + const std::string& account_name, + const std::string& password, + const std::string& voice_sip_uri_hostname, + const std::string& voice_account_server_uri) +{ + mVoiceSIPURIHostName = voice_sip_uri_hostname; + mVoiceAccountServerURI = voice_account_server_uri; + + if(!mAccountHandle.empty()) + { + // Already logged in. + LL_WARNS("Voice") << "Called while already logged in." << LL_ENDL; + + // Don't process another login. + return; + } + else if ( account_name != mAccountName ) + { + //TODO: error? + LL_WARNS("Voice") << "Wrong account name! " << account_name + << " instead of " << mAccountName << LL_ENDL; + } + else + { + mAccountPassword = password; + } + + std::string debugSIPURIHostName = gSavedSettings.getString("VivoxDebugSIPURIHostName"); + + if( !debugSIPURIHostName.empty() ) + { + mVoiceSIPURIHostName = debugSIPURIHostName; + } + + if( mVoiceSIPURIHostName.empty() ) + { + // we have an empty account server name + // so we fall back to hardcoded defaults + + if(LLGridManager::getInstance()->isInProductionGrid()) + { + // Use the release account server + mVoiceSIPURIHostName = "bhr.vivox.com"; + } + else + { + // Use the development account server + mVoiceSIPURIHostName = "bhd.vivox.com"; + } + } + + std::string debugAccountServerURI = gSavedSettings.getString("VivoxDebugVoiceAccountServerURI"); + + if( !debugAccountServerURI.empty() ) + { + mVoiceAccountServerURI = debugAccountServerURI; + } + + if( mVoiceAccountServerURI.empty() ) + { + // If the account server URI isn't specified, construct it from the SIP URI hostname + mVoiceAccountServerURI = "https://www." + mVoiceSIPURIHostName + "/api2/"; + } +} + +void LLVivoxVoiceClient::idle(void* user_data) +{ + LLVivoxVoiceClient* self = (LLVivoxVoiceClient*)user_data; + self->stateMachine(); +} + +std::string LLVivoxVoiceClient::state2string(LLVivoxVoiceClient::state inState) +{ + std::string result = "UNKNOWN"; + + // Prevent copy-paste errors when updating this list... +#define CASE(x) case x: result = #x; break + + switch(inState) + { + CASE(stateDisableCleanup); + CASE(stateDisabled); + CASE(stateStart); + CASE(stateDaemonLaunched); + CASE(stateConnecting); + CASE(stateConnected); + CASE(stateIdle); + CASE(stateMicTuningStart); + CASE(stateMicTuningRunning); + CASE(stateMicTuningStop); + CASE(stateCaptureBufferPaused); + CASE(stateCaptureBufferRecStart); + CASE(stateCaptureBufferRecording); + CASE(stateCaptureBufferPlayStart); + CASE(stateCaptureBufferPlaying); + CASE(stateConnectorStart); + CASE(stateConnectorStarting); + CASE(stateConnectorStarted); + CASE(stateLoginRetry); + CASE(stateLoginRetryWait); + CASE(stateNeedsLogin); + CASE(stateLoggingIn); + CASE(stateLoggedIn); + CASE(stateVoiceFontsWait); + CASE(stateVoiceFontsReceived); + CASE(stateCreatingSessionGroup); + CASE(stateNoChannel); + CASE(stateJoiningSession); + CASE(stateSessionJoined); + CASE(stateRunning); + CASE(stateLeavingSession); + CASE(stateSessionTerminated); + CASE(stateLoggingOut); + CASE(stateLoggedOut); + CASE(stateConnectorStopping); + CASE(stateConnectorStopped); + CASE(stateConnectorFailed); + CASE(stateConnectorFailedWaiting); + CASE(stateLoginFailed); + CASE(stateLoginFailedWaiting); + CASE(stateJoinSessionFailed); + CASE(stateJoinSessionFailedWaiting); + CASE(stateJail); + } + +#undef CASE + + return result; +} + + + +void LLVivoxVoiceClient::setState(state inState) +{ + LL_DEBUGS("Voice") << "entering state " << state2string(inState) << LL_ENDL; + + mState = inState; +} + +void LLVivoxVoiceClient::stateMachine() +{ + if(gDisconnected) + { + // The viewer has been disconnected from the sim. Disable voice. + setVoiceEnabled(false); + } + + if(mVoiceEnabled) + { + updatePosition(); + } + else if(mTuningMode) + { + // Tuning mode is special -- it needs to launch SLVoice even if voice is disabled. + } + else + { + if((getState() != stateDisabled) && (getState() != stateDisableCleanup)) + { + // User turned off voice support. Send the cleanup messages, close the socket, and reset. + if(!mConnected) + { + // if voice was turned off after the daemon was launched but before we could connect to it, we may need to issue a kill. + LL_INFOS("Voice") << "Disabling voice before connection to daemon, terminating." << LL_ENDL; + killGateway(); + } + + logout(); + connectorShutdown(); + + setState(stateDisableCleanup); + } + } + + // Check for parcel boundary crossing + { + LLViewerRegion *region = gAgent.getRegion(); + LLParcel *parcel = LLViewerParcelMgr::getInstance()->getAgentParcel(); + + if(region && parcel) + { + S32 parcelLocalID = parcel->getLocalID(); + std::string regionName = region->getName(); + std::string capURI = region->getCapability("ParcelVoiceInfoRequest"); + +// LL_DEBUGS("Voice") << "Region name = \"" << regionName << "\", parcel local ID = " << parcelLocalID << ", cap URI = \"" << capURI << "\"" << LL_ENDL; + + // The region name starts out empty and gets filled in later. + // Also, the cap gets filled in a short time after the region cross, but a little too late for our purposes. + // If either is empty, wait for the next time around. + if(!regionName.empty()) + { + if(!capURI.empty()) + { + if((parcelLocalID != mCurrentParcelLocalID) || (regionName != mCurrentRegionName)) + { + // We have changed parcels. Initiate a parcel channel lookup. + mCurrentParcelLocalID = parcelLocalID; + mCurrentRegionName = regionName; + + parcelChanged(); + } + } + else + { + LL_WARNS_ONCE("Voice") << "region doesn't have ParcelVoiceInfoRequest capability. This is normal for a short time after teleporting, but bad if it persists for very long." << LL_ENDL; + } + } + } + } + + switch(getState()) + { + //MARK: stateDisableCleanup + case stateDisableCleanup: + // Clean up and reset everything. + closeSocket(); + deleteAllSessions(); + deleteAllBuddies(); + deleteAllVoiceFonts(); + deleteVoiceFontTemplates(); + + mConnectorHandle.clear(); + mAccountHandle.clear(); + mAccountPassword.clear(); + mVoiceAccountServerURI.clear(); + + setState(stateDisabled); + break; + + //MARK: stateDisabled + case stateDisabled: + if(mTuningMode || (mVoiceEnabled && !mAccountName.empty())) + { + setState(stateStart); + } + break; + + //MARK: stateStart + case stateStart: + if(gSavedSettings.getBOOL("CmdLineDisableVoice")) + { + // Voice is locked out, we must not launch the vivox daemon. + setState(stateJail); + } + else if(!isGatewayRunning()) + { + if(true) + { + // Launch the voice daemon + + // *FIX:Mani - Using the executable dir instead + // of mAppRODataDir, the working directory from which the app + // is launched. + //std::string exe_path = gDirUtilp->getAppRODataDir(); + std::string exe_path = gDirUtilp->getExecutableDir(); + exe_path += gDirUtilp->getDirDelimiter(); +#if LL_WINDOWS + exe_path += "SLVoice.exe"; +#elif LL_DARWIN + exe_path += "../Resources/SLVoice"; +#else + exe_path += "SLVoice"; +#endif + // See if the vivox executable exists + llstat s; + if(!LLFile::stat(exe_path, &s)) + { + // vivox executable exists. Build the command line and launch the daemon. + // SLIM SDK: these arguments are no longer necessary. +// std::string args = " -p tcp -h -c"; + std::string args; + std::string cmd; + std::string loglevel = gSavedSettings.getString("VivoxDebugLevel"); + + if(loglevel.empty()) + { + loglevel = "-1"; // turn logging off completely + } + + args += " -ll "; + args += loglevel; + + LL_DEBUGS("Voice") << "Args for SLVoice: " << args << LL_ENDL; + +#if LL_WINDOWS + PROCESS_INFORMATION pinfo; + STARTUPINFOA sinfo; + + memset(&sinfo, 0, sizeof(sinfo)); + + std::string exe_dir = gDirUtilp->getAppRODataDir(); + cmd = "SLVoice.exe"; + cmd += args; + + // So retarded. Windows requires that the second parameter to CreateProcessA be writable (non-const) string... + char *args2 = new char[args.size() + 1]; + strcpy(args2, args.c_str()); + if(!CreateProcessA(exe_path.c_str(), args2, NULL, NULL, FALSE, 0, NULL, exe_dir.c_str(), &sinfo, &pinfo)) + { +// DWORD dwErr = GetLastError(); + } + else + { + // foo = pinfo.dwProcessId; // get your pid here if you want to use it later on + // CloseHandle(pinfo.hProcess); // stops leaks - nothing else + sGatewayHandle = pinfo.hProcess; + CloseHandle(pinfo.hThread); // stops leaks - nothing else + } + + delete[] args2; +#else // LL_WINDOWS + // This should be the same for mac and linux + { + std::vector<std::string> arglist; + arglist.push_back(exe_path); + + // Split the argument string into separate strings for each argument + typedef boost::tokenizer<boost::char_separator<char> > tokenizer; + boost::char_separator<char> sep(" "); + tokenizer tokens(args, sep); + tokenizer::iterator token_iter; + + for(token_iter = tokens.begin(); token_iter != tokens.end(); ++token_iter) + { + arglist.push_back(*token_iter); + } + + // create an argv vector for the child process + char **fakeargv = new char*[arglist.size() + 1]; + int i; + for(i=0; i < arglist.size(); i++) + fakeargv[i] = const_cast<char*>(arglist[i].c_str()); + + fakeargv[i] = NULL; + + fflush(NULL); // flush all buffers before the child inherits them + pid_t id = vfork(); + if(id == 0) + { + // child + execv(exe_path.c_str(), fakeargv); + + // If we reach this point, the exec failed. + // Use _exit() instead of exit() per the vfork man page. + _exit(0); + } + + // parent + delete[] fakeargv; + sGatewayPID = id; + } +#endif // LL_WINDOWS + mDaemonHost = LLHost(gSavedSettings.getString("VivoxVoiceHost").c_str(), gSavedSettings.getU32("VivoxVoicePort")); + } + else + { + LL_INFOS("Voice") << exe_path << " not found." << LL_ENDL; + } + } + else + { + // SLIM SDK: port changed from 44124 to 44125. + // We can connect to a client gateway running on another host. This is useful for testing. + // To do this, launch the gateway on a nearby host like this: + // vivox-gw.exe -p tcp -i 0.0.0.0:44125 + // and put that host's IP address here. + mDaemonHost = LLHost(gSavedSettings.getString("VivoxVoiceHost"), gSavedSettings.getU32("VivoxVoicePort")); + } + + mUpdateTimer.start(); + mUpdateTimer.setTimerExpirySec(CONNECT_THROTTLE_SECONDS); + + setState(stateDaemonLaunched); + + // Dirty the states we'll need to sync with the daemon when it comes up. + mPTTDirty = true; + mMicVolumeDirty = true; + mSpeakerVolumeDirty = true; + mSpeakerMuteDirty = true; + // These only need to be set if they're not default (i.e. empty string). + mCaptureDeviceDirty = !mCaptureDevice.empty(); + mRenderDeviceDirty = !mRenderDevice.empty(); + + mMainSessionGroupHandle.clear(); + } + break; + + //MARK: stateDaemonLaunched + case stateDaemonLaunched: + if(mUpdateTimer.hasExpired()) + { + LL_DEBUGS("Voice") << "Connecting to vivox daemon:" << mDaemonHost << LL_ENDL; + + mUpdateTimer.setTimerExpirySec(CONNECT_THROTTLE_SECONDS); + + if(!mSocket) + { + mSocket = LLSocket::create(gAPRPoolp, LLSocket::STREAM_TCP); + } + + mConnected = mSocket->blockingConnect(mDaemonHost); + if(mConnected) + { + setState(stateConnecting); + } + else + { + // If the connect failed, the socket may have been put into a bad state. Delete it. + closeSocket(); + } + } + break; + + //MARK: stateConnecting + case stateConnecting: + // Can't do this until we have the pump available. + if(mPump) + { + // MBW -- Note to self: pumps and pipes examples in + // indra/test/io.cpp + // indra/test/llpipeutil.{cpp|h} + + // Attach the pumps and pipes + + LLPumpIO::chain_t readChain; + + readChain.push_back(LLIOPipe::ptr_t(new LLIOSocketReader(mSocket))); + readChain.push_back(LLIOPipe::ptr_t(new LLVivoxProtocolParser())); + + mPump->addChain(readChain, NEVER_CHAIN_EXPIRY_SECS); + + setState(stateConnected); + } + + break; + + //MARK: stateConnected + case stateConnected: + // Initial devices query + getCaptureDevicesSendMessage(); + getRenderDevicesSendMessage(); + + mLoginRetryCount = 0; + + setState(stateIdle); + break; + + //MARK: stateIdle + case stateIdle: + // This is the idle state where we're connected to the daemon but haven't set up a connector yet. + if(mTuningMode) + { + mTuningExitState = stateIdle; + setState(stateMicTuningStart); + } + else if(!mVoiceEnabled) + { + // We never started up the connector. This will shut down the daemon. + setState(stateConnectorStopped); + } + else if(!mAccountName.empty()) + { + LLViewerRegion *region = gAgent.getRegion(); + + if(region) + { + if ( region->getCapability("ProvisionVoiceAccountRequest") != "" ) + { + if ( mAccountPassword.empty() ) + { + requestVoiceAccountProvision(); + } + setState(stateConnectorStart); + } + else + { + LL_WARNS_ONCE("Voice") << "region doesn't have ProvisionVoiceAccountRequest capability!" << LL_ENDL; + } + } + } + break; + + //MARK: stateMicTuningStart + case stateMicTuningStart: + if(mUpdateTimer.hasExpired()) + { + if(mCaptureDeviceDirty || mRenderDeviceDirty) + { + // These can't be changed while in tuning mode. Set them before starting. + std::ostringstream stream; + + buildSetCaptureDevice(stream); + buildSetRenderDevice(stream); + + if(!stream.str().empty()) + { + writeString(stream.str()); + } + + // This will come around again in the same state and start the capture, after the timer expires. + mUpdateTimer.start(); + mUpdateTimer.setTimerExpirySec(UPDATE_THROTTLE_SECONDS); + } + else + { + // duration parameter is currently unused, per Mike S. + tuningCaptureStartSendMessage(10000); + + setState(stateMicTuningRunning); + } + } + + break; + + //MARK: stateMicTuningRunning + case stateMicTuningRunning: + if(!mTuningMode || mCaptureDeviceDirty || mRenderDeviceDirty) + { + // All of these conditions make us leave tuning mode. + setState(stateMicTuningStop); + } + else + { + // process mic/speaker volume changes + if(mTuningMicVolumeDirty || mTuningSpeakerVolumeDirty) + { + std::ostringstream stream; + + if(mTuningMicVolumeDirty) + { + LL_INFOS("Voice") << "setting tuning mic level to " << mTuningMicVolume << LL_ENDL; + stream + << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Aux.SetMicLevel.1\">" + << "<Level>" << mTuningMicVolume << "</Level>" + << "</Request>\n\n\n"; + } + + if(mTuningSpeakerVolumeDirty) + { + stream + << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Aux.SetSpeakerLevel.1\">" + << "<Level>" << mTuningSpeakerVolume << "</Level>" + << "</Request>\n\n\n"; + } + + mTuningMicVolumeDirty = false; + mTuningSpeakerVolumeDirty = false; + + if(!stream.str().empty()) + { + writeString(stream.str()); + } + } + } + break; + + //MARK: stateMicTuningStop + case stateMicTuningStop: + { + // transition out of mic tuning + tuningCaptureStopSendMessage(); + + setState(mTuningExitState); + + // if we exited just to change devices, this will keep us from re-entering too fast. + mUpdateTimer.start(); + mUpdateTimer.setTimerExpirySec(UPDATE_THROTTLE_SECONDS); + + } + break; + + //MARK: stateCaptureBufferPaused + case stateCaptureBufferPaused: + if (!mCaptureBufferMode) + { + // Leaving capture mode. + + mCaptureBufferRecording = false; + mCaptureBufferRecorded = false; + mCaptureBufferPlaying = false; + + // Return to stateNoChannel to trigger reconnection to a channel. + setState(stateNoChannel); + } + else if (mCaptureBufferRecording) + { + setState(stateCaptureBufferRecStart); + } + else if (mCaptureBufferPlaying) + { + setState(stateCaptureBufferPlayStart); + } + break; + + //MARK: stateCaptureBufferRecStart + case stateCaptureBufferRecStart: + captureBufferRecordStartSendMessage(); + + // Flag that something is recorded to allow playback. + mCaptureBufferRecorded = true; + + // Start the timer, recording will be stopped when it expires. + mCaptureTimer.start(); + mCaptureTimer.setTimerExpirySec(CAPTURE_BUFFER_MAX_TIME); + + // Update UI, should really use a separate callback. + notifyVoiceFontObservers(); + + setState(stateCaptureBufferRecording); + break; + + //MARK: stateCaptureBufferRecording + case stateCaptureBufferRecording: + if (!mCaptureBufferMode || !mCaptureBufferRecording || + mCaptureBufferPlaying || mCaptureTimer.hasExpired()) + { + // Stop recording + captureBufferRecordStopSendMessage(); + mCaptureBufferRecording = false; + + // Update UI, should really use a separate callback. + notifyVoiceFontObservers(); + + setState(stateCaptureBufferPaused); + } + break; + + //MARK: stateCaptureBufferPlayStart + case stateCaptureBufferPlayStart: + captureBufferPlayStartSendMessage(mPreviewVoiceFont); + + // Store the voice font being previewed, so that we know to restart if it changes. + mPreviewVoiceFontLast = mPreviewVoiceFont; + + // Update UI, should really use a separate callback. + notifyVoiceFontObservers(); + + setState(stateCaptureBufferPlaying); + break; + + //MARK: stateCaptureBufferPlaying + case stateCaptureBufferPlaying: + if (mCaptureBufferPlaying && mPreviewVoiceFont != mPreviewVoiceFontLast) + { + // If the preview voice font changes, restart playing with the new font. + setState(stateCaptureBufferPlayStart); + } + else if (!mCaptureBufferMode || !mCaptureBufferPlaying || mCaptureBufferRecording) + { + // Stop playing. + captureBufferPlayStopSendMessage(); + mCaptureBufferPlaying = false; + + // Update UI, should really use a separate callback. + notifyVoiceFontObservers(); + + setState(stateCaptureBufferPaused); + } + break; + + //MARK: stateConnectorStart + case stateConnectorStart: + if(!mVoiceEnabled) + { + // We were never logged in. This will shut down the connector. + setState(stateLoggedOut); + } + else if(!mVoiceAccountServerURI.empty()) + { + connectorCreate(); + } + break; + + //MARK: stateConnectorStarting + case stateConnectorStarting: // waiting for connector handle + // connectorCreateResponse() will transition from here to stateConnectorStarted. + break; + + //MARK: stateConnectorStarted + case stateConnectorStarted: // connector handle received + if(!mVoiceEnabled) + { + // We were never logged in. This will shut down the connector. + setState(stateLoggedOut); + } + else + { + // The connector is started. Send a login message. + setState(stateNeedsLogin); + } + break; + + //MARK: stateLoginRetry + case stateLoginRetry: + if(mLoginRetryCount == 0) + { + // First retry -- display a message to the user + notifyStatusObservers(LLVoiceClientStatusObserver::STATUS_LOGIN_RETRY); + } + + mLoginRetryCount++; + + if(mLoginRetryCount > MAX_LOGIN_RETRIES) + { + LL_WARNS("Voice") << "too many login retries, giving up." << LL_ENDL; + setState(stateLoginFailed); + LLSD args; + std::stringstream errs; + errs << mVoiceAccountServerURI << "\n:UDP: 3478, 3479, 5060, 5062, 12000-17000"; + args["HOSTID"] = errs.str(); + if (LLGridManager::getInstance()->isSystemGrid()) + { + LLNotificationsUtil::add("NoVoiceConnect", args); + } + else + { + LLNotificationsUtil::add("NoVoiceConnect-GIAB", args); + } + } + else + { + LL_INFOS("Voice") << "will retry login in " << LOGIN_RETRY_SECONDS << " seconds." << LL_ENDL; + mUpdateTimer.start(); + mUpdateTimer.setTimerExpirySec(LOGIN_RETRY_SECONDS); + setState(stateLoginRetryWait); + } + break; + + //MARK: stateLoginRetryWait + case stateLoginRetryWait: + if(mUpdateTimer.hasExpired()) + { + setState(stateNeedsLogin); + } + break; + + //MARK: stateNeedsLogin + case stateNeedsLogin: + if(!mAccountPassword.empty()) + { + setState(stateLoggingIn); + loginSendMessage(); + } + break; + + //MARK: stateLoggingIn + case stateLoggingIn: // waiting for account handle + // loginResponse() will transition from here to stateLoggedIn. + break; + + //MARK: stateLoggedIn + case stateLoggedIn: // account handle received + + notifyStatusObservers(LLVoiceClientStatusObserver::STATUS_LOGGED_IN); + + if (LLVoiceClient::instance().getVoiceEffectEnabled()) + { + // Request the set of available voice fonts. + setState(stateVoiceFontsWait); + refreshVoiceEffectLists(true); + } + else + { + // If voice effects are disabled, pretend we've received them and carry on. + setState(stateVoiceFontsReceived); + } + + // request the current set of block rules (we'll need them when updating the friends list) + accountListBlockRulesSendMessage(); + + // request the current set of auto-accept rules + accountListAutoAcceptRulesSendMessage(); + + // Set up the mute list observer if it hasn't been set up already. + if((!sMuteListListener_listening)) + { + LLMuteList::getInstance()->addObserver(&mutelist_listener); + sMuteListListener_listening = true; + } + + // Set up the friends list observer if it hasn't been set up already. + if(friendslist_listener == NULL) + { + friendslist_listener = new LLVivoxVoiceClientFriendsObserver; + LLAvatarTracker::instance().addObserver(friendslist_listener); + } + + // Set the initial state of mic mute, local speaker volume, etc. + { + std::ostringstream stream; + + buildLocalAudioUpdates(stream); + + if(!stream.str().empty()) + { + writeString(stream.str()); + } + } + break; + + //MARK: stateVoiceFontsWait + case stateVoiceFontsWait: // Await voice font list + // accountGetSessionFontsResponse() will transition from here to + // stateVoiceFontsReceived, to ensure we have the voice font list + // before attempting to create a session. + break; + + //MARK: stateVoiceFontsReceived + case stateVoiceFontsReceived: // Voice font list received + // Set up the timer to check for expiring voice fonts + mVoiceFontExpiryTimer.start(); + mVoiceFontExpiryTimer.setTimerExpirySec(VOICE_FONT_EXPIRY_INTERVAL); + +#if USE_SESSION_GROUPS + // create the main session group + setState(stateCreatingSessionGroup); + sessionGroupCreateSendMessage(); +#else + // Not using session groups -- skip the stateCreatingSessionGroup state. + setState(stateNoChannel); + + // Initial kick-off of channel lookup logic + parcelChanged(); +#endif + break; + + //MARK: stateCreatingSessionGroup + case stateCreatingSessionGroup: + if(mSessionTerminateRequested || !mVoiceEnabled) + { + // *TODO: Question: is this the right way out of this state + setState(stateSessionTerminated); + } + else if(!mMainSessionGroupHandle.empty()) + { + setState(stateNoChannel); + + // Start looped recording (needed for "panic button" anti-griefing tool) + recordingLoopStart(); + + // Initial kick-off of channel lookup logic + parcelChanged(); + } + break; + + //MARK: stateNoChannel + case stateNoChannel: + + LL_DEBUGS("Voice") << "State No Channel" << LL_ENDL; + mSpatialJoiningNum = 0; + // Do this here as well as inside sendPositionalUpdate(). + // Otherwise, if you log in but don't join a proximal channel (such as when your login location has voice disabled), your friends list won't sync. + sendFriendsListUpdates(); + + if(mSessionTerminateRequested || !mVoiceEnabled) + { + // TODO: Question: Is this the right way out of this state? + setState(stateSessionTerminated); + } + else if(mTuningMode) + { + mTuningExitState = stateNoChannel; + setState(stateMicTuningStart); + } + else if(mCaptureBufferMode) + { + setState(stateCaptureBufferPaused); + } + else if(sessionNeedsRelog(mNextAudioSession)) + { + requestRelog(); + setState(stateSessionTerminated); + } + else if(mNextAudioSession) + { + sessionState *oldSession = mAudioSession; + + mAudioSession = mNextAudioSession; + mAudioSessionChanged = true; + if(!mAudioSession->mReconnect) + { + mNextAudioSession = NULL; + } + + // The old session may now need to be deleted. + reapSession(oldSession); + + if(!mAudioSession->mHandle.empty()) + { + // Connect to a session by session handle + + sessionMediaConnectSendMessage(mAudioSession); + } + else + { + // Connect to a session by URI + sessionCreateSendMessage(mAudioSession, true, false); + } + + notifyStatusObservers(LLVoiceClientStatusObserver::STATUS_JOINING); + setState(stateJoiningSession); + } + else if(!mSpatialSessionURI.empty()) + { + // If we're not headed elsewhere and have a spatial URI, return to spatial. + switchChannel(mSpatialSessionURI, true, false, false, mSpatialSessionCredentials); + } + break; + + //MARK: stateJoiningSession + case stateJoiningSession: // waiting for session handle + + // If this is true we have problem with connection to voice server (EXT-4313). + // See descriptions of mSpatialJoiningNum and MAX_NORMAL_JOINING_SPATIAL_NUM. + if(mSpatialJoiningNum == MAX_NORMAL_JOINING_SPATIAL_NUM) + { + // Notify observers to let them know there is problem with voice + notifyStatusObservers(LLVoiceClientStatusObserver::STATUS_VOICE_DISABLED); + llwarns << "There seems to be problem with connection to voice server. Disabling voice chat abilities." << llendl; + } + + // Increase mSpatialJoiningNum only for spatial sessions- it's normal to reach this case for + // example for p2p many times while waiting for response, so it can't be used to detect errors + if(mAudioSession && mAudioSession->mIsSpatial) + { + mSpatialJoiningNum++; + } + + // joinedAudioSession() will transition from here to stateSessionJoined. + if(!mVoiceEnabled) + { + // User bailed out during connect -- jump straight to teardown. + setState(stateSessionTerminated); + } + else if(mSessionTerminateRequested) + { + if(mAudioSession && !mAudioSession->mHandle.empty()) + { + // Only allow direct exits from this state in p2p calls (for cancelling an invite). + // Terminating a half-connected session on other types of calls seems to break something in the vivox gateway. + if(mAudioSession->mIsP2P) + { + sessionMediaDisconnectSendMessage(mAudioSession); + setState(stateSessionTerminated); + } + } + } + break; + + //MARK: stateSessionJoined + case stateSessionJoined: // session handle received + + mSpatialJoiningNum = 0; + // It appears that I need to wait for BOTH the SessionGroup.AddSession response and the SessionStateChangeEvent with state 4 + // before continuing from this state. They can happen in either order, and if I don't wait for both, things can get stuck. + // For now, the SessionGroup.AddSession response handler sets mSessionHandle and the SessionStateChangeEvent handler transitions to stateSessionJoined. + // This is a cheap way to make sure both have happened before proceeding. + if(mAudioSession && mAudioSession->mVoiceEnabled) + { + // Dirty state that may need to be sync'ed with the daemon. + mPTTDirty = true; + mSpeakerVolumeDirty = true; + mSpatialCoordsDirty = true; + + setState(stateRunning); + + // Start the throttle timer + mUpdateTimer.start(); + mUpdateTimer.setTimerExpirySec(UPDATE_THROTTLE_SECONDS); + + // Events that need to happen when a session is joined could go here. + // Maybe send initial spatial data? + notifyStatusObservers(LLVoiceClientStatusObserver::STATUS_JOINED); + + } + else if(!mVoiceEnabled) + { + // User bailed out during connect -- jump straight to teardown. + setState(stateSessionTerminated); + } + else if(mSessionTerminateRequested) + { + // Only allow direct exits from this state in p2p calls (for cancelling an invite). + // Terminating a half-connected session on other types of calls seems to break something in the vivox gateway. + if(mAudioSession && mAudioSession->mIsP2P) + { + sessionMediaDisconnectSendMessage(mAudioSession); + setState(stateSessionTerminated); + } + } + break; + + //MARK: stateRunning + case stateRunning: // steady state + // Disabling voice or disconnect requested. + if(!mVoiceEnabled || mSessionTerminateRequested) + { + leaveAudioSession(); + } + else + { + + // Figure out whether the PTT state needs to change + { + bool newPTT; + if(mUsePTT) + { + // If configured to use PTT, track the user state. + newPTT = mUserPTTState; + } + else + { + // If not configured to use PTT, it should always be true (otherwise the user will be unable to speak). + newPTT = true; + } + + if(mMuteMic) + { + // This always overrides any other PTT setting. + newPTT = false; + } + + // Dirty if state changed. + if(newPTT != mPTT) + { + mPTT = newPTT; + mPTTDirty = true; + } + } + + if(!inSpatialChannel()) + { + // When in a non-spatial channel, never send positional updates. + mSpatialCoordsDirty = false; + } + else + { + // Do the calculation that enforces the listener<->speaker tether (and also updates the real camera position) + enforceTether(); + } + + // Do notifications for expiring Voice Fonts. + if (mVoiceFontExpiryTimer.hasExpired()) + { + expireVoiceFonts(); + mVoiceFontExpiryTimer.setTimerExpirySec(VOICE_FONT_EXPIRY_INTERVAL); + } + + // Send an update only if the ptt or mute state has changed (which shouldn't be able to happen that often + // -- the user can only click so fast) or every 10hz, whichever is sooner. + // Sending for every volume update causes an excessive flood of messages whenever a volume slider is dragged. + if((mAudioSession && mAudioSession->mMuteDirty) || mPTTDirty || mUpdateTimer.hasExpired()) + { + mUpdateTimer.setTimerExpirySec(UPDATE_THROTTLE_SECONDS); + sendPositionalUpdate(); + } + } + break; + + //MARK: stateLeavingSession + case stateLeavingSession: // waiting for terminate session response + // The handler for the Session.Terminate response will transition from here to stateSessionTerminated. + break; + + //MARK: stateSessionTerminated + case stateSessionTerminated: + + // Must do this first, since it uses mAudioSession. + notifyStatusObservers(LLVoiceClientStatusObserver::STATUS_LEFT_CHANNEL); + + if(mAudioSession) + { + sessionState *oldSession = mAudioSession; + + mAudioSession = NULL; + // We just notified status observers about this change. Don't do it again. + mAudioSessionChanged = false; + + // The old session may now need to be deleted. + reapSession(oldSession); + } + else + { + LL_WARNS("Voice") << "stateSessionTerminated with NULL mAudioSession" << LL_ENDL; + } + + // Always reset the terminate request flag when we get here. + mSessionTerminateRequested = false; + + if(mVoiceEnabled && !mRelogRequested) + { + // Just leaving a channel, go back to stateNoChannel (the "logged in but have no channel" state). + setState(stateNoChannel); + } + else + { + // Shutting down voice, continue with disconnecting. + logout(); + + // The state machine will take it from here + mRelogRequested = false; + } + + break; + + //MARK: stateLoggingOut + case stateLoggingOut: // waiting for logout response + // The handler for the AccountLoginStateChangeEvent will transition from here to stateLoggedOut. + break; + + //MARK: stateLoggedOut + case stateLoggedOut: // logout response received + + // Once we're logged out, all these things are invalid. + mAccountHandle.clear(); + deleteAllSessions(); + deleteAllBuddies(); + deleteAllVoiceFonts(); + deleteVoiceFontTemplates(); + + if(mVoiceEnabled && !mRelogRequested) + { + // User was logged out, but wants to be logged in. Send a new login request. + setState(stateNeedsLogin); + } + else + { + // shut down the connector + connectorShutdown(); + } + break; + + //MARK: stateConnectorStopping + case stateConnectorStopping: // waiting for connector stop + // The handler for the Connector.InitiateShutdown response will transition from here to stateConnectorStopped. + break; + + //MARK: stateConnectorStopped + case stateConnectorStopped: // connector stop received + setState(stateDisableCleanup); + break; + + //MARK: stateConnectorFailed + case stateConnectorFailed: + setState(stateConnectorFailedWaiting); + break; + //MARK: stateConnectorFailedWaiting + case stateConnectorFailedWaiting: + if(!mVoiceEnabled) + { + setState(stateDisableCleanup); + } + break; + + //MARK: stateLoginFailed + case stateLoginFailed: + setState(stateLoginFailedWaiting); + break; + //MARK: stateLoginFailedWaiting + case stateLoginFailedWaiting: + if(!mVoiceEnabled) + { + setState(stateDisableCleanup); + } + break; + + //MARK: stateJoinSessionFailed + case stateJoinSessionFailed: + // Transition to error state. Send out any notifications here. + if(mAudioSession) + { + LL_WARNS("Voice") << "stateJoinSessionFailed: (" << mAudioSession->mErrorStatusCode << "): " << mAudioSession->mErrorStatusString << LL_ENDL; + } + else + { + LL_WARNS("Voice") << "stateJoinSessionFailed with no current session" << LL_ENDL; + } + + notifyStatusObservers(LLVoiceClientStatusObserver::ERROR_UNKNOWN); + setState(stateJoinSessionFailedWaiting); + break; + + //MARK: stateJoinSessionFailedWaiting + case stateJoinSessionFailedWaiting: + // Joining a channel failed, either due to a failed channel name -> sip url lookup or an error from the join message. + // Region crossings may leave this state and try the join again. + if(mSessionTerminateRequested) + { + setState(stateSessionTerminated); + } + break; + + //MARK: stateJail + case stateJail: + // We have given up. Do nothing. + break; + + } + + if (mAudioSessionChanged) + { + mAudioSessionChanged = false; + notifyParticipantObservers(); + notifyVoiceFontObservers(); + } + else if (mAudioSession && mAudioSession->mParticipantsChanged) + { + mAudioSession->mParticipantsChanged = false; + notifyParticipantObservers(); + } +} + +void LLVivoxVoiceClient::closeSocket(void) +{ + mSocket.reset(); + mConnected = false; +} + +void LLVivoxVoiceClient::loginSendMessage() +{ + std::ostringstream stream; + + bool autoPostCrashDumps = gSavedSettings.getBOOL("VivoxAutoPostCrashDumps"); + + stream + << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.Login.1\">" + << "<ConnectorHandle>" << mConnectorHandle << "</ConnectorHandle>" + << "<AccountName>" << mAccountName << "</AccountName>" + << "<AccountPassword>" << mAccountPassword << "</AccountPassword>" + << "<AudioSessionAnswerMode>VerifyAnswer</AudioSessionAnswerMode>" + << "<EnableBuddiesAndPresence>true</EnableBuddiesAndPresence>" + << "<BuddyManagementMode>Application</BuddyManagementMode>" + << "<ParticipantPropertyFrequency>5</ParticipantPropertyFrequency>" + << (autoPostCrashDumps?"<AutopostCrashDumps>true</AutopostCrashDumps>":"") + << "</Request>\n\n\n"; + + writeString(stream.str()); +} + +void LLVivoxVoiceClient::logout() +{ + // Ensure that we'll re-request provisioning before logging in again + mAccountPassword.clear(); + mVoiceAccountServerURI.clear(); + + setState(stateLoggingOut); + logoutSendMessage(); +} + +void LLVivoxVoiceClient::logoutSendMessage() +{ + if(!mAccountHandle.empty()) + { + std::ostringstream stream; + stream + << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.Logout.1\">" + << "<AccountHandle>" << mAccountHandle << "</AccountHandle>" + << "</Request>" + << "\n\n\n"; + + mAccountHandle.clear(); + + writeString(stream.str()); + } +} + +void LLVivoxVoiceClient::accountListBlockRulesSendMessage() +{ + if(!mAccountHandle.empty()) + { + std::ostringstream stream; + + LL_DEBUGS("Voice") << "requesting block rules" << LL_ENDL; + + stream + << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.ListBlockRules.1\">" + << "<AccountHandle>" << mAccountHandle << "</AccountHandle>" + << "</Request>" + << "\n\n\n"; + + writeString(stream.str()); + } +} + +void LLVivoxVoiceClient::accountListAutoAcceptRulesSendMessage() +{ + if(!mAccountHandle.empty()) + { + std::ostringstream stream; + + LL_DEBUGS("Voice") << "requesting auto-accept rules" << LL_ENDL; + + stream + << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.ListAutoAcceptRules.1\">" + << "<AccountHandle>" << mAccountHandle << "</AccountHandle>" + << "</Request>" + << "\n\n\n"; + + writeString(stream.str()); + } +} + +void LLVivoxVoiceClient::sessionGroupCreateSendMessage() +{ + if(!mAccountHandle.empty()) + { + std::ostringstream stream; + + LL_DEBUGS("Voice") << "creating session group" << LL_ENDL; + + stream + << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"SessionGroup.Create.1\">" + << "<AccountHandle>" << mAccountHandle << "</AccountHandle>" + << "<Type>Normal</Type>" + << "</Request>" + << "\n\n\n"; + + writeString(stream.str()); + } +} + +void LLVivoxVoiceClient::sessionCreateSendMessage(sessionState *session, bool startAudio, bool startText) +{ + LL_DEBUGS("Voice") << "Requesting create: " << session->mSIPURI << LL_ENDL; + + S32 font_index = getVoiceFontIndex(session->mVoiceFontID); + LL_DEBUGS("Voice") << "With voice font: " << session->mVoiceFontID << " (" << font_index << ")" << LL_ENDL; + + session->mCreateInProgress = true; + if(startAudio) + { + session->mMediaConnectInProgress = true; + } + + std::ostringstream stream; + stream + << "<Request requestId=\"" << session->mSIPURI << "\" action=\"Session.Create.1\">" + << "<AccountHandle>" << mAccountHandle << "</AccountHandle>" + << "<URI>" << session->mSIPURI << "</URI>"; + + static const std::string allowed_chars = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + "0123456789" + "-._~"; + + if(!session->mHash.empty()) + { + stream + << "<Password>" << LLURI::escape(session->mHash, allowed_chars) << "</Password>" + << "<PasswordHashAlgorithm>SHA1UserName</PasswordHashAlgorithm>"; + } + + stream + << "<ConnectAudio>" << (startAudio?"true":"false") << "</ConnectAudio>" + << "<ConnectText>" << (startText?"true":"false") << "</ConnectText>" + << "<VoiceFontID>" << font_index << "</VoiceFontID>" + << "<Name>" << mChannelName << "</Name>" + << "</Request>\n\n\n"; + writeString(stream.str()); +} + +void LLVivoxVoiceClient::sessionGroupAddSessionSendMessage(sessionState *session, bool startAudio, bool startText) +{ + LL_DEBUGS("Voice") << "Requesting create: " << session->mSIPURI << LL_ENDL; + + S32 font_index = getVoiceFontIndex(session->mVoiceFontID); + LL_DEBUGS("Voice") << "With voice font: " << session->mVoiceFontID << " (" << font_index << ")" << LL_ENDL; + + session->mCreateInProgress = true; + if(startAudio) + { + session->mMediaConnectInProgress = true; + } + + std::string password; + if(!session->mHash.empty()) + { + static const std::string allowed_chars = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + "0123456789" + "-._~" + ; + password = LLURI::escape(session->mHash, allowed_chars); + } + + std::ostringstream stream; + stream + << "<Request requestId=\"" << session->mSIPURI << "\" action=\"SessionGroup.AddSession.1\">" + << "<SessionGroupHandle>" << session->mGroupHandle << "</SessionGroupHandle>" + << "<URI>" << session->mSIPURI << "</URI>" + << "<Name>" << mChannelName << "</Name>" + << "<ConnectAudio>" << (startAudio?"true":"false") << "</ConnectAudio>" + << "<ConnectText>" << (startText?"true":"false") << "</ConnectText>" + << "<VoiceFontID>" << font_index << "</VoiceFontID>" + << "<Password>" << password << "</Password>" + << "<PasswordHashAlgorithm>SHA1UserName</PasswordHashAlgorithm>" + << "</Request>\n\n\n" + ; + + writeString(stream.str()); +} + +void LLVivoxVoiceClient::sessionMediaConnectSendMessage(sessionState *session) +{ + LL_DEBUGS("Voice") << "Connecting audio to session handle: " << session->mHandle << LL_ENDL; + + S32 font_index = getVoiceFontIndex(session->mVoiceFontID); + LL_DEBUGS("Voice") << "With voice font: " << session->mVoiceFontID << " (" << font_index << ")" << LL_ENDL; + + session->mMediaConnectInProgress = true; + + std::ostringstream stream; + + stream + << "<Request requestId=\"" << session->mHandle << "\" action=\"Session.MediaConnect.1\">" + << "<SessionGroupHandle>" << session->mGroupHandle << "</SessionGroupHandle>" + << "<SessionHandle>" << session->mHandle << "</SessionHandle>" + << "<VoiceFontID>" << font_index << "</VoiceFontID>" + << "<Media>Audio</Media>" + << "</Request>\n\n\n"; + + writeString(stream.str()); +} + +void LLVivoxVoiceClient::sessionTextConnectSendMessage(sessionState *session) +{ + LL_DEBUGS("Voice") << "connecting text to session handle: " << session->mHandle << LL_ENDL; + + std::ostringstream stream; + + stream + << "<Request requestId=\"" << session->mHandle << "\" action=\"Session.TextConnect.1\">" + << "<SessionGroupHandle>" << session->mGroupHandle << "</SessionGroupHandle>" + << "<SessionHandle>" << session->mHandle << "</SessionHandle>" + << "</Request>\n\n\n"; + + writeString(stream.str()); +} + +void LLVivoxVoiceClient::sessionTerminate() +{ + mSessionTerminateRequested = true; +} + +void LLVivoxVoiceClient::requestRelog() +{ + mSessionTerminateRequested = true; + mRelogRequested = true; +} + + +void LLVivoxVoiceClient::leaveAudioSession() +{ + if(mAudioSession) + { + LL_DEBUGS("Voice") << "leaving session: " << mAudioSession->mSIPURI << LL_ENDL; + + switch(getState()) + { + case stateNoChannel: + // In this case, we want to pretend the join failed so our state machine doesn't get stuck. + // Skip the join failed transition state so we don't send out error notifications. + setState(stateJoinSessionFailedWaiting); + break; + case stateJoiningSession: + case stateSessionJoined: + case stateRunning: + if(!mAudioSession->mHandle.empty()) + { + +#if RECORD_EVERYTHING + // HACK: for testing only + // Save looped recording + std::string savepath("/tmp/vivoxrecording"); + { + time_t now = time(NULL); + const size_t BUF_SIZE = 64; + char time_str[BUF_SIZE]; /* Flawfinder: ignore */ + + strftime(time_str, BUF_SIZE, "%Y-%m-%dT%H:%M:%SZ", gmtime(&now)); + savepath += time_str; + } + recordingLoopSave(savepath); +#endif + + sessionMediaDisconnectSendMessage(mAudioSession); + setState(stateLeavingSession); + } + else + { + LL_WARNS("Voice") << "called with no session handle" << LL_ENDL; + setState(stateSessionTerminated); + } + break; + case stateJoinSessionFailed: + case stateJoinSessionFailedWaiting: + setState(stateSessionTerminated); + break; + + default: + LL_WARNS("Voice") << "called from unknown state" << LL_ENDL; + break; + } + } + else + { + LL_WARNS("Voice") << "called with no active session" << LL_ENDL; + setState(stateSessionTerminated); + } +} + +void LLVivoxVoiceClient::sessionTerminateSendMessage(sessionState *session) +{ + std::ostringstream stream; + + LL_DEBUGS("Voice") << "Sending Session.Terminate with handle " << session->mHandle << LL_ENDL; + stream + << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Session.Terminate.1\">" + << "<SessionHandle>" << session->mHandle << "</SessionHandle>" + << "</Request>\n\n\n"; + + writeString(stream.str()); +} + +void LLVivoxVoiceClient::sessionGroupTerminateSendMessage(sessionState *session) +{ + std::ostringstream stream; + + LL_DEBUGS("Voice") << "Sending SessionGroup.Terminate with handle " << session->mGroupHandle << LL_ENDL; + stream + << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"SessionGroup.Terminate.1\">" + << "<SessionGroupHandle>" << session->mGroupHandle << "</SessionGroupHandle>" + << "</Request>\n\n\n"; + + writeString(stream.str()); +} + +void LLVivoxVoiceClient::sessionMediaDisconnectSendMessage(sessionState *session) +{ + std::ostringstream stream; + + LL_DEBUGS("Voice") << "Sending Session.MediaDisconnect with handle " << session->mHandle << LL_ENDL; + stream + << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Session.MediaDisconnect.1\">" + << "<SessionGroupHandle>" << session->mGroupHandle << "</SessionGroupHandle>" + << "<SessionHandle>" << session->mHandle << "</SessionHandle>" + << "<Media>Audio</Media>" + << "</Request>\n\n\n"; + + writeString(stream.str()); + +} + +void LLVivoxVoiceClient::sessionTextDisconnectSendMessage(sessionState *session) +{ + std::ostringstream stream; + + LL_DEBUGS("Voice") << "Sending Session.TextDisconnect with handle " << session->mHandle << LL_ENDL; + stream + << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Session.TextDisconnect.1\">" + << "<SessionGroupHandle>" << session->mGroupHandle << "</SessionGroupHandle>" + << "<SessionHandle>" << session->mHandle << "</SessionHandle>" + << "</Request>\n\n\n"; + + writeString(stream.str()); +} + +void LLVivoxVoiceClient::getCaptureDevicesSendMessage() +{ + std::ostringstream stream; + stream + << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Aux.GetCaptureDevices.1\">" + << "</Request>\n\n\n"; + + writeString(stream.str()); +} + +void LLVivoxVoiceClient::getRenderDevicesSendMessage() +{ + std::ostringstream stream; + stream + << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Aux.GetRenderDevices.1\">" + << "</Request>\n\n\n"; + + writeString(stream.str()); +} + +void LLVivoxVoiceClient::clearCaptureDevices() +{ + LL_DEBUGS("Voice") << "called" << LL_ENDL; + mCaptureDevices.clear(); +} + +void LLVivoxVoiceClient::addCaptureDevice(const std::string& name) +{ + LL_DEBUGS("Voice") << name << LL_ENDL; + + mCaptureDevices.push_back(name); +} + +LLVoiceDeviceList& LLVivoxVoiceClient::getCaptureDevices() +{ + return mCaptureDevices; +} + +void LLVivoxVoiceClient::setCaptureDevice(const std::string& name) +{ + if(name == "Default") + { + if(!mCaptureDevice.empty()) + { + mCaptureDevice.clear(); + mCaptureDeviceDirty = true; + } + } + else + { + if(mCaptureDevice != name) + { + mCaptureDevice = name; + mCaptureDeviceDirty = true; + } + } +} + +void LLVivoxVoiceClient::clearRenderDevices() +{ + LL_DEBUGS("Voice") << "called" << LL_ENDL; + mRenderDevices.clear(); +} + +void LLVivoxVoiceClient::addRenderDevice(const std::string& name) +{ + LL_DEBUGS("Voice") << name << LL_ENDL; + mRenderDevices.push_back(name); +} + +LLVoiceDeviceList& LLVivoxVoiceClient::getRenderDevices() +{ + return mRenderDevices; +} + +void LLVivoxVoiceClient::setRenderDevice(const std::string& name) +{ + if(name == "Default") + { + if(!mRenderDevice.empty()) + { + mRenderDevice.clear(); + mRenderDeviceDirty = true; + } + } + else + { + if(mRenderDevice != name) + { + mRenderDevice = name; + mRenderDeviceDirty = true; + } + } + +} + +void LLVivoxVoiceClient::tuningStart() +{ + mTuningMode = true; + LL_DEBUGS("Voice") << "Starting tuning" << LL_ENDL; + if(getState() >= stateNoChannel) + { + LL_DEBUGS("Voice") << "no channel" << LL_ENDL; + sessionTerminate(); + } +} + +void LLVivoxVoiceClient::tuningStop() +{ + mTuningMode = false; +} + +bool LLVivoxVoiceClient::inTuningMode() +{ + bool result = false; + switch(getState()) + { + case stateMicTuningRunning: + result = true; + break; + default: + break; + } + return result; +} + +void LLVivoxVoiceClient::tuningRenderStartSendMessage(const std::string& name, bool loop) +{ + mTuningAudioFile = name; + std::ostringstream stream; + stream + << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Aux.RenderAudioStart.1\">" + << "<SoundFilePath>" << mTuningAudioFile << "</SoundFilePath>" + << "<Loop>" << (loop?"1":"0") << "</Loop>" + << "</Request>\n\n\n"; + + writeString(stream.str()); +} + +void LLVivoxVoiceClient::tuningRenderStopSendMessage() +{ + std::ostringstream stream; + stream + << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Aux.RenderAudioStop.1\">" + << "<SoundFilePath>" << mTuningAudioFile << "</SoundFilePath>" + << "</Request>\n\n\n"; + + writeString(stream.str()); +} + +void LLVivoxVoiceClient::tuningCaptureStartSendMessage(int duration) +{ + LL_DEBUGS("Voice") << "sending CaptureAudioStart" << LL_ENDL; + + std::ostringstream stream; + stream + << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Aux.CaptureAudioStart.1\">" + << "<Duration>" << duration << "</Duration>" + << "</Request>\n\n\n"; + + writeString(stream.str()); +} + +void LLVivoxVoiceClient::tuningCaptureStopSendMessage() +{ + LL_DEBUGS("Voice") << "sending CaptureAudioStop" << LL_ENDL; + + std::ostringstream stream; + stream + << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Aux.CaptureAudioStop.1\">" + << "</Request>\n\n\n"; + + writeString(stream.str()); + + mTuningEnergy = 0.0f; +} + +void LLVivoxVoiceClient::tuningSetMicVolume(float volume) +{ + int scaled_volume = scale_mic_volume(volume); + + if(scaled_volume != mTuningMicVolume) + { + mTuningMicVolume = scaled_volume; + mTuningMicVolumeDirty = true; + } +} + +void LLVivoxVoiceClient::tuningSetSpeakerVolume(float volume) +{ + int scaled_volume = scale_speaker_volume(volume); + + if(scaled_volume != mTuningSpeakerVolume) + { + mTuningSpeakerVolume = scaled_volume; + mTuningSpeakerVolumeDirty = true; + } +} + +float LLVivoxVoiceClient::tuningGetEnergy(void) +{ + return mTuningEnergy; +} + +bool LLVivoxVoiceClient::deviceSettingsAvailable() +{ + bool result = true; + + if(!mConnected) + result = false; + + if(mRenderDevices.empty()) + result = false; + + return result; +} + +void LLVivoxVoiceClient::refreshDeviceLists(bool clearCurrentList) +{ + if(clearCurrentList) + { + clearCaptureDevices(); + clearRenderDevices(); + } + getCaptureDevicesSendMessage(); + getRenderDevicesSendMessage(); +} + +void LLVivoxVoiceClient::daemonDied() +{ + // The daemon died, so the connection is gone. Reset everything and start over. + LL_WARNS("Voice") << "Connection to vivox daemon lost. Resetting state."<< LL_ENDL; + + // Try to relaunch the daemon + setState(stateDisableCleanup); +} + +void LLVivoxVoiceClient::giveUp() +{ + // All has failed. Clean up and stop trying. + closeSocket(); + deleteAllSessions(); + deleteAllBuddies(); + + setState(stateJail); +} + +static void oldSDKTransform (LLVector3 &left, LLVector3 &up, LLVector3 &at, LLVector3d &pos, LLVector3 &vel) +{ + F32 nat[3], nup[3], nl[3], nvel[3]; // the new at, up, left vectors and the new position and velocity + F64 npos[3]; + + // The original XML command was sent like this: + /* + << "<Position>" + << "<X>" << pos[VX] << "</X>" + << "<Y>" << pos[VZ] << "</Y>" + << "<Z>" << pos[VY] << "</Z>" + << "</Position>" + << "<Velocity>" + << "<X>" << mAvatarVelocity[VX] << "</X>" + << "<Y>" << mAvatarVelocity[VZ] << "</Y>" + << "<Z>" << mAvatarVelocity[VY] << "</Z>" + << "</Velocity>" + << "<AtOrientation>" + << "<X>" << l.mV[VX] << "</X>" + << "<Y>" << u.mV[VX] << "</Y>" + << "<Z>" << a.mV[VX] << "</Z>" + << "</AtOrientation>" + << "<UpOrientation>" + << "<X>" << l.mV[VZ] << "</X>" + << "<Y>" << u.mV[VY] << "</Y>" + << "<Z>" << a.mV[VZ] << "</Z>" + << "</UpOrientation>" + << "<LeftOrientation>" + << "<X>" << l.mV [VY] << "</X>" + << "<Y>" << u.mV [VZ] << "</Y>" + << "<Z>" << a.mV [VY] << "</Z>" + << "</LeftOrientation>"; + */ + +#if 1 + // This was the original transform done when building the XML command + nat[0] = left.mV[VX]; + nat[1] = up.mV[VX]; + nat[2] = at.mV[VX]; + + nup[0] = left.mV[VZ]; + nup[1] = up.mV[VY]; + nup[2] = at.mV[VZ]; + + nl[0] = left.mV[VY]; + nl[1] = up.mV[VZ]; + nl[2] = at.mV[VY]; + + npos[0] = pos.mdV[VX]; + npos[1] = pos.mdV[VZ]; + npos[2] = pos.mdV[VY]; + + nvel[0] = vel.mV[VX]; + nvel[1] = vel.mV[VZ]; + nvel[2] = vel.mV[VY]; + + for(int i=0;i<3;++i) { + at.mV[i] = nat[i]; + up.mV[i] = nup[i]; + left.mV[i] = nl[i]; + pos.mdV[i] = npos[i]; + } + + // This was the original transform done in the SDK + nat[0] = at.mV[2]; + nat[1] = 0; // y component of at vector is always 0, this was up[2] + nat[2] = -1 * left.mV[2]; + + // We override whatever the application gives us + nup[0] = 0; // x component of up vector is always 0 + nup[1] = 1; // y component of up vector is always 1 + nup[2] = 0; // z component of up vector is always 0 + + nl[0] = at.mV[0]; + nl[1] = 0; // y component of left vector is always zero, this was up[0] + nl[2] = -1 * left.mV[0]; + + npos[2] = pos.mdV[2] * -1.0; + npos[1] = pos.mdV[1]; + npos[0] = pos.mdV[0]; + + for(int i=0;i<3;++i) { + at.mV[i] = nat[i]; + up.mV[i] = nup[i]; + left.mV[i] = nl[i]; + pos.mdV[i] = npos[i]; + } +#else + // This is the compose of the two transforms (at least, that's what I'm trying for) + nat[0] = at.mV[VX]; + nat[1] = 0; // y component of at vector is always 0, this was up[2] + nat[2] = -1 * up.mV[VZ]; + + // We override whatever the application gives us + nup[0] = 0; // x component of up vector is always 0 + nup[1] = 1; // y component of up vector is always 1 + nup[2] = 0; // z component of up vector is always 0 + + nl[0] = left.mV[VX]; + nl[1] = 0; // y component of left vector is always zero, this was up[0] + nl[2] = -1 * left.mV[VY]; + + npos[0] = pos.mdV[VX]; + npos[1] = pos.mdV[VZ]; + npos[2] = pos.mdV[VY] * -1.0; + + nvel[0] = vel.mV[VX]; + nvel[1] = vel.mV[VZ]; + nvel[2] = vel.mV[VY]; + + for(int i=0;i<3;++i) { + at.mV[i] = nat[i]; + up.mV[i] = nup[i]; + left.mV[i] = nl[i]; + pos.mdV[i] = npos[i]; + } + +#endif +} + +void LLVivoxVoiceClient::sendPositionalUpdate(void) +{ + std::ostringstream stream; + + if(mSpatialCoordsDirty) + { + LLVector3 l, u, a, vel; + LLVector3d pos; + + mSpatialCoordsDirty = false; + + // Always send both speaker and listener positions together. + stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Session.Set3DPosition.1\">" + << "<SessionHandle>" << getAudioSessionHandle() << "</SessionHandle>"; + + stream << "<SpeakerPosition>"; + +// LL_DEBUGS("Voice") << "Sending speaker position " << mAvatarPosition << LL_ENDL; + l = mAvatarRot.getLeftRow(); + u = mAvatarRot.getUpRow(); + a = mAvatarRot.getFwdRow(); + pos = mAvatarPosition; + vel = mAvatarVelocity; + + // SLIM SDK: the old SDK was doing a transform on the passed coordinates that the new one doesn't do anymore. + // The old transform is replicated by this function. + oldSDKTransform(l, u, a, pos, vel); + + stream + << "<Position>" + << "<X>" << pos.mdV[VX] << "</X>" + << "<Y>" << pos.mdV[VY] << "</Y>" + << "<Z>" << pos.mdV[VZ] << "</Z>" + << "</Position>" + << "<Velocity>" + << "<X>" << vel.mV[VX] << "</X>" + << "<Y>" << vel.mV[VY] << "</Y>" + << "<Z>" << vel.mV[VZ] << "</Z>" + << "</Velocity>" + << "<AtOrientation>" + << "<X>" << a.mV[VX] << "</X>" + << "<Y>" << a.mV[VY] << "</Y>" + << "<Z>" << a.mV[VZ] << "</Z>" + << "</AtOrientation>" + << "<UpOrientation>" + << "<X>" << u.mV[VX] << "</X>" + << "<Y>" << u.mV[VY] << "</Y>" + << "<Z>" << u.mV[VZ] << "</Z>" + << "</UpOrientation>" + << "<LeftOrientation>" + << "<X>" << l.mV [VX] << "</X>" + << "<Y>" << l.mV [VY] << "</Y>" + << "<Z>" << l.mV [VZ] << "</Z>" + << "</LeftOrientation>"; + + stream << "</SpeakerPosition>"; + + stream << "<ListenerPosition>"; + + LLVector3d earPosition; + LLVector3 earVelocity; + LLMatrix3 earRot; + + switch(mEarLocation) + { + case earLocCamera: + default: + earPosition = mCameraPosition; + earVelocity = mCameraVelocity; + earRot = mCameraRot; + break; + + case earLocAvatar: + earPosition = mAvatarPosition; + earVelocity = mAvatarVelocity; + earRot = mAvatarRot; + break; + + case earLocMixed: + earPosition = mAvatarPosition; + earVelocity = mAvatarVelocity; + earRot = mCameraRot; + break; + } + + l = earRot.getLeftRow(); + u = earRot.getUpRow(); + a = earRot.getFwdRow(); + pos = earPosition; + vel = earVelocity; + +// LL_DEBUGS("Voice") << "Sending listener position " << earPosition << LL_ENDL; + + oldSDKTransform(l, u, a, pos, vel); + + stream + << "<Position>" + << "<X>" << pos.mdV[VX] << "</X>" + << "<Y>" << pos.mdV[VY] << "</Y>" + << "<Z>" << pos.mdV[VZ] << "</Z>" + << "</Position>" + << "<Velocity>" + << "<X>" << vel.mV[VX] << "</X>" + << "<Y>" << vel.mV[VY] << "</Y>" + << "<Z>" << vel.mV[VZ] << "</Z>" + << "</Velocity>" + << "<AtOrientation>" + << "<X>" << a.mV[VX] << "</X>" + << "<Y>" << a.mV[VY] << "</Y>" + << "<Z>" << a.mV[VZ] << "</Z>" + << "</AtOrientation>" + << "<UpOrientation>" + << "<X>" << u.mV[VX] << "</X>" + << "<Y>" << u.mV[VY] << "</Y>" + << "<Z>" << u.mV[VZ] << "</Z>" + << "</UpOrientation>" + << "<LeftOrientation>" + << "<X>" << l.mV [VX] << "</X>" + << "<Y>" << l.mV [VY] << "</Y>" + << "<Z>" << l.mV [VZ] << "</Z>" + << "</LeftOrientation>"; + + + stream << "</ListenerPosition>"; + + stream << "</Request>\n\n\n"; + } + + if(mAudioSession && (mAudioSession->mVolumeDirty || mAudioSession->mMuteDirty)) + { + participantMap::iterator iter = mAudioSession->mParticipantsByURI.begin(); + + mAudioSession->mVolumeDirty = false; + mAudioSession->mMuteDirty = false; + + for(; iter != mAudioSession->mParticipantsByURI.end(); iter++) + { + participantState *p = iter->second; + + if(p->mVolumeDirty) + { + // Can't set volume/mute for yourself + if(!p->mIsSelf) + { + // scale from the range 0.0-1.0 to vivox volume in the range 0-100 + S32 volume = llround(p->mVolume / VOLUME_SCALE_VIVOX); + bool mute = p->mOnMuteList; + + if(mute) + { + // SetParticipantMuteForMe doesn't work in p2p sessions. + // If we want the user to be muted, set their volume to 0 as well. + // This isn't perfect, but it will at least reduce their volume to a minimum. + volume = 0; + // Mark the current volume level as set to prevent incoming events + // changing it to 0, so that we can return to it when unmuting. + p->mVolumeSet = true; + } + + if(volume == 0) + { + mute = true; + } + + LL_DEBUGS("Voice") << "Setting volume/mute for avatar " << p->mAvatarID << " to " << volume << (mute?"/true":"/false") << LL_ENDL; + + // SLIM SDK: Send both volume and mute commands. + + // Send a "volume for me" command for the user. + stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Session.SetParticipantVolumeForMe.1\">" + << "<SessionHandle>" << getAudioSessionHandle() << "</SessionHandle>" + << "<ParticipantURI>" << p->mURI << "</ParticipantURI>" + << "<Volume>" << volume << "</Volume>" + << "</Request>\n\n\n"; + + if(!mAudioSession->mIsP2P) + { + // Send a "mute for me" command for the user + // Doesn't work in P2P sessions + stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Session.SetParticipantMuteForMe.1\">" + << "<SessionHandle>" << getAudioSessionHandle() << "</SessionHandle>" + << "<ParticipantURI>" << p->mURI << "</ParticipantURI>" + << "<Mute>" << (mute?"1":"0") << "</Mute>" + << "<Scope>Audio</Scope>" + << "</Request>\n\n\n"; + } + } + + p->mVolumeDirty = false; + } + } + } + + buildLocalAudioUpdates(stream); + + if(!stream.str().empty()) + { + writeString(stream.str()); + } + + // Friends list updates can be huge, especially on the first voice login of an account with lots of friends. + // Batching them all together can choke SLVoice, so send them in separate writes. + sendFriendsListUpdates(); +} + +void LLVivoxVoiceClient::buildSetCaptureDevice(std::ostringstream &stream) +{ + if(mCaptureDeviceDirty) + { + LL_DEBUGS("Voice") << "Setting input device = \"" << mCaptureDevice << "\"" << LL_ENDL; + + stream + << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Aux.SetCaptureDevice.1\">" + << "<CaptureDeviceSpecifier>" << mCaptureDevice << "</CaptureDeviceSpecifier>" + << "</Request>" + << "\n\n\n"; + + mCaptureDeviceDirty = false; + } +} + +void LLVivoxVoiceClient::buildSetRenderDevice(std::ostringstream &stream) +{ + if(mRenderDeviceDirty) + { + LL_DEBUGS("Voice") << "Setting output device = \"" << mRenderDevice << "\"" << LL_ENDL; + + stream + << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Aux.SetRenderDevice.1\">" + << "<RenderDeviceSpecifier>" << mRenderDevice << "</RenderDeviceSpecifier>" + << "</Request>" + << "\n\n\n"; + mRenderDeviceDirty = false; + } +} + +void LLVivoxVoiceClient::buildLocalAudioUpdates(std::ostringstream &stream) +{ + buildSetCaptureDevice(stream); + + buildSetRenderDevice(stream); + + if(mPTTDirty) + { + mPTTDirty = false; + + // Send a local mute command. + // NOTE that the state of "PTT" is the inverse of "local mute". + // (i.e. when PTT is true, we send a mute command with "false", and vice versa) + + LL_DEBUGS("Voice") << "Sending MuteLocalMic command with parameter " << (mPTT?"false":"true") << LL_ENDL; + + stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Connector.MuteLocalMic.1\">" + << "<ConnectorHandle>" << mConnectorHandle << "</ConnectorHandle>" + << "<Value>" << (mPTT?"false":"true") << "</Value>" + << "</Request>\n\n\n"; + + } + + if(mSpeakerMuteDirty) + { + const char *muteval = ((mSpeakerVolume <= scale_speaker_volume(0))?"true":"false"); + + mSpeakerMuteDirty = false; + + LL_INFOS("Voice") << "Setting speaker mute to " << muteval << LL_ENDL; + + stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Connector.MuteLocalSpeaker.1\">" + << "<ConnectorHandle>" << mConnectorHandle << "</ConnectorHandle>" + << "<Value>" << muteval << "</Value>" + << "</Request>\n\n\n"; + + } + + if(mSpeakerVolumeDirty) + { + mSpeakerVolumeDirty = false; + + LL_INFOS("Voice") << "Setting speaker volume to " << mSpeakerVolume << LL_ENDL; + + stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Connector.SetLocalSpeakerVolume.1\">" + << "<ConnectorHandle>" << mConnectorHandle << "</ConnectorHandle>" + << "<Value>" << mSpeakerVolume << "</Value>" + << "</Request>\n\n\n"; + + } + + if(mMicVolumeDirty) + { + mMicVolumeDirty = false; + + LL_INFOS("Voice") << "Setting mic volume to " << mMicVolume << LL_ENDL; + + stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Connector.SetLocalMicVolume.1\">" + << "<ConnectorHandle>" << mConnectorHandle << "</ConnectorHandle>" + << "<Value>" << mMicVolume << "</Value>" + << "</Request>\n\n\n"; + } + + +} + +void LLVivoxVoiceClient::checkFriend(const LLUUID& id) +{ + std::string name; + buddyListEntry *buddy = findBuddy(id); + + // Make sure we don't add a name before it's been looked up. + if(gCacheName->getFullName(id, name)) + { + + const LLRelationship* relationInfo = LLAvatarTracker::instance().getBuddyInfo(id); + bool canSeeMeOnline = false; + if(relationInfo && relationInfo->isRightGrantedTo(LLRelationship::GRANT_ONLINE_STATUS)) + canSeeMeOnline = true; + + // When we get here, mNeedsSend is true and mInSLFriends is false. Change them as necessary. + + if(buddy) + { + // This buddy is already in both lists. + + if(name != buddy->mDisplayName) + { + // The buddy is in the list with the wrong name. Update it with the correct name. + LL_WARNS("Voice") << "Buddy " << id << " has wrong name (\"" << buddy->mDisplayName << "\" should be \"" << name << "\"), updating."<< LL_ENDL; + buddy->mDisplayName = name; + buddy->mNeedsNameUpdate = true; // This will cause the buddy to be resent. + } + } + else + { + // This buddy was not in the vivox list, needs to be added. + buddy = addBuddy(sipURIFromID(id), name); + buddy->mUUID = id; + } + + // In all the above cases, the buddy is in the SL friends list (which is how we got here). + buddy->mInSLFriends = true; + buddy->mCanSeeMeOnline = canSeeMeOnline; + buddy->mNameResolved = true; + + } + else + { + // This name hasn't been looked up yet. Don't do anything with this buddy list entry until it has. + if(buddy) + { + buddy->mNameResolved = false; + } + + // Initiate a lookup. + // The "lookup completed" callback will ensure that the friends list is rechecked after it completes. + lookupName(id); + } +} + +void LLVivoxVoiceClient::clearAllLists() +{ + // FOR TESTING ONLY + + // This will send the necessary commands to delete ALL buddies, autoaccept rules, and block rules SLVoice tells us about. + buddyListMap::iterator buddy_it; + for(buddy_it = mBuddyListMap.begin(); buddy_it != mBuddyListMap.end();) + { + buddyListEntry *buddy = buddy_it->second; + buddy_it++; + + std::ostringstream stream; + + if(buddy->mInVivoxBuddies) + { + // delete this entry from the vivox buddy list + buddy->mInVivoxBuddies = false; + LL_DEBUGS("Voice") << "delete " << buddy->mURI << " (" << buddy->mDisplayName << ")" << LL_ENDL; + stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.BuddyDelete.1\">" + << "<AccountHandle>" << mAccountHandle << "</AccountHandle>" + << "<BuddyURI>" << buddy->mURI << "</BuddyURI>" + << "</Request>\n\n\n"; + } + + if(buddy->mHasBlockListEntry) + { + // Delete the associated block list entry (so the block list doesn't fill up with junk) + buddy->mHasBlockListEntry = false; + stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.DeleteBlockRule.1\">" + << "<AccountHandle>" << mAccountHandle << "</AccountHandle>" + << "<BlockMask>" << buddy->mURI << "</BlockMask>" + << "</Request>\n\n\n"; + } + if(buddy->mHasAutoAcceptListEntry) + { + // Delete the associated auto-accept list entry (so the auto-accept list doesn't fill up with junk) + buddy->mHasAutoAcceptListEntry = false; + stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.DeleteAutoAcceptRule.1\">" + << "<AccountHandle>" << mAccountHandle << "</AccountHandle>" + << "<AutoAcceptMask>" << buddy->mURI << "</AutoAcceptMask>" + << "</Request>\n\n\n"; + } + + writeString(stream.str()); + + } +} + +void LLVivoxVoiceClient::sendFriendsListUpdates() +{ + if(mBuddyListMapPopulated && mBlockRulesListReceived && mAutoAcceptRulesListReceived && mFriendsListDirty) + { + mFriendsListDirty = false; + + if(0) + { + // FOR TESTING ONLY -- clear all buddy list, block list, and auto-accept list entries. + clearAllLists(); + return; + } + + LL_INFOS("Voice") << "Checking vivox buddy list against friends list..." << LL_ENDL; + + buddyListMap::iterator buddy_it; + for(buddy_it = mBuddyListMap.begin(); buddy_it != mBuddyListMap.end(); buddy_it++) + { + // reset the temp flags in the local buddy list + buddy_it->second->mInSLFriends = false; + } + + // correlate with the friends list + { + LLCollectAllBuddies collect; + LLAvatarTracker::instance().applyFunctor(collect); + LLCollectAllBuddies::buddy_map_t::const_iterator it = collect.mOnline.begin(); + LLCollectAllBuddies::buddy_map_t::const_iterator end = collect.mOnline.end(); + + for ( ; it != end; ++it) + { + checkFriend(it->second); + } + it = collect.mOffline.begin(); + end = collect.mOffline.end(); + for ( ; it != end; ++it) + { + checkFriend(it->second); + } + } + + LL_INFOS("Voice") << "Sending friend list updates..." << LL_ENDL; + + for(buddy_it = mBuddyListMap.begin(); buddy_it != mBuddyListMap.end();) + { + buddyListEntry *buddy = buddy_it->second; + buddy_it++; + + // Ignore entries that aren't resolved yet. + if(buddy->mNameResolved) + { + std::ostringstream stream; + + if(buddy->mInSLFriends && (!buddy->mInVivoxBuddies || buddy->mNeedsNameUpdate)) + { + if(mNumberOfAliases > 0) + { + // Add (or update) this entry in the vivox buddy list + buddy->mInVivoxBuddies = true; + buddy->mNeedsNameUpdate = false; + LL_DEBUGS("Voice") << "add/update " << buddy->mURI << " (" << buddy->mDisplayName << ")" << LL_ENDL; + stream + << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.BuddySet.1\">" + << "<AccountHandle>" << mAccountHandle << "</AccountHandle>" + << "<BuddyURI>" << buddy->mURI << "</BuddyURI>" + << "<DisplayName>" << buddy->mDisplayName << "</DisplayName>" + << "<BuddyData></BuddyData>" // Without this, SLVoice doesn't seem to parse the command. + << "<GroupID>0</GroupID>" + << "</Request>\n\n\n"; + } + } + else if(!buddy->mInSLFriends) + { + // This entry no longer exists in your SL friends list. Remove all traces of it from the Vivox buddy list. + if(buddy->mInVivoxBuddies) + { + // delete this entry from the vivox buddy list + buddy->mInVivoxBuddies = false; + LL_DEBUGS("Voice") << "delete " << buddy->mURI << " (" << buddy->mDisplayName << ")" << LL_ENDL; + stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.BuddyDelete.1\">" + << "<AccountHandle>" << mAccountHandle << "</AccountHandle>" + << "<BuddyURI>" << buddy->mURI << "</BuddyURI>" + << "</Request>\n\n\n"; + } + + if(buddy->mHasBlockListEntry) + { + // Delete the associated block list entry, if any + buddy->mHasBlockListEntry = false; + stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.DeleteBlockRule.1\">" + << "<AccountHandle>" << mAccountHandle << "</AccountHandle>" + << "<BlockMask>" << buddy->mURI << "</BlockMask>" + << "</Request>\n\n\n"; + } + if(buddy->mHasAutoAcceptListEntry) + { + // Delete the associated auto-accept list entry, if any + buddy->mHasAutoAcceptListEntry = false; + stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.DeleteAutoAcceptRule.1\">" + << "<AccountHandle>" << mAccountHandle << "</AccountHandle>" + << "<AutoAcceptMask>" << buddy->mURI << "</AutoAcceptMask>" + << "</Request>\n\n\n"; + } + } + + if(buddy->mInSLFriends) + { + + if(buddy->mCanSeeMeOnline) + { + // Buddy should not be blocked. + + // If this buddy doesn't already have either a block or autoaccept list entry, we'll update their status when we receive a SubscriptionEvent. + + // If the buddy has a block list entry, delete it. + if(buddy->mHasBlockListEntry) + { + buddy->mHasBlockListEntry = false; + stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.DeleteBlockRule.1\">" + << "<AccountHandle>" << mAccountHandle << "</AccountHandle>" + << "<BlockMask>" << buddy->mURI << "</BlockMask>" + << "</Request>\n\n\n"; + + + // If we just deleted a block list entry, add an auto-accept entry. + if(!buddy->mHasAutoAcceptListEntry) + { + buddy->mHasAutoAcceptListEntry = true; + stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.CreateAutoAcceptRule.1\">" + << "<AccountHandle>" << mAccountHandle << "</AccountHandle>" + << "<AutoAcceptMask>" << buddy->mURI << "</AutoAcceptMask>" + << "<AutoAddAsBuddy>0</AutoAddAsBuddy>" + << "</Request>\n\n\n"; + } + } + } + else + { + // Buddy should be blocked. + + // If this buddy doesn't already have either a block or autoaccept list entry, we'll update their status when we receive a SubscriptionEvent. + + // If this buddy has an autoaccept entry, delete it + if(buddy->mHasAutoAcceptListEntry) + { + buddy->mHasAutoAcceptListEntry = false; + stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.DeleteAutoAcceptRule.1\">" + << "<AccountHandle>" << mAccountHandle << "</AccountHandle>" + << "<AutoAcceptMask>" << buddy->mURI << "</AutoAcceptMask>" + << "</Request>\n\n\n"; + + // If we just deleted an auto-accept entry, add a block list entry. + if(!buddy->mHasBlockListEntry) + { + buddy->mHasBlockListEntry = true; + stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.CreateBlockRule.1\">" + << "<AccountHandle>" << mAccountHandle << "</AccountHandle>" + << "<BlockMask>" << buddy->mURI << "</BlockMask>" + << "<PresenceOnly>1</PresenceOnly>" + << "</Request>\n\n\n"; + } + } + } + + if(!buddy->mInSLFriends && !buddy->mInVivoxBuddies) + { + // Delete this entry from the local buddy list. This should NOT invalidate the iterator, + // since it has already been incremented to the next entry. + deleteBuddy(buddy->mURI); + } + + } + writeString(stream.str()); + } + } + } +} + +///////////////////////////// +// Response/Event handlers + +void LLVivoxVoiceClient::connectorCreateResponse(int statusCode, std::string &statusString, std::string &connectorHandle, std::string &versionID) +{ + if(statusCode != 0) + { + LL_WARNS("Voice") << "Connector.Create response failure: " << statusString << LL_ENDL; + setState(stateConnectorFailed); + LLSD args; + std::stringstream errs; + errs << mVoiceAccountServerURI << "\n:UDP: 3478, 3479, 5060, 5062, 12000-17000"; + args["HOSTID"] = errs.str(); + if (LLGridManager::getInstance()->isSystemGrid()) + { + LLNotificationsUtil::add("NoVoiceConnect", args); + } + else + { + LLNotificationsUtil::add("NoVoiceConnect-GIAB", args); + } + } + else + { + // Connector created, move forward. + LL_INFOS("Voice") << "Connector.Create succeeded, Vivox SDK version is " << versionID << LL_ENDL; + mVoiceVersion.serverVersion = versionID; + mConnectorHandle = connectorHandle; + if(getState() == stateConnectorStarting) + { + setState(stateConnectorStarted); + } + } +} + +void LLVivoxVoiceClient::loginResponse(int statusCode, std::string &statusString, std::string &accountHandle, int numberOfAliases) +{ + LL_DEBUGS("Voice") << "Account.Login response (" << statusCode << "): " << statusString << LL_ENDL; + + // Status code of 20200 means "bad password". We may want to special-case that at some point. + + if ( statusCode == 401 ) + { + // Login failure which is probably caused by the delay after a user's password being updated. + LL_INFOS("Voice") << "Account.Login response failure (" << statusCode << "): " << statusString << LL_ENDL; + setState(stateLoginRetry); + } + else if(statusCode != 0) + { + LL_WARNS("Voice") << "Account.Login response failure (" << statusCode << "): " << statusString << LL_ENDL; + setState(stateLoginFailed); + } + else + { + // Login succeeded, move forward. + mAccountHandle = accountHandle; + mNumberOfAliases = numberOfAliases; + // This needs to wait until the AccountLoginStateChangeEvent is received. +// if(getState() == stateLoggingIn) +// { +// setState(stateLoggedIn); +// } + } +} + +void LLVivoxVoiceClient::sessionCreateResponse(std::string &requestId, int statusCode, std::string &statusString, std::string &sessionHandle) +{ + sessionState *session = findSessionBeingCreatedByURI(requestId); + + if(session) + { + session->mCreateInProgress = false; + } + + if(statusCode != 0) + { + LL_WARNS("Voice") << "Session.Create response failure (" << statusCode << "): " << statusString << LL_ENDL; + if(session) + { + session->mErrorStatusCode = statusCode; + session->mErrorStatusString = statusString; + if(session == mAudioSession) + { + setState(stateJoinSessionFailed); + } + else + { + reapSession(session); + } + } + } + else + { + LL_INFOS("Voice") << "Session.Create response received (success), session handle is " << sessionHandle << LL_ENDL; + if(session) + { + setSessionHandle(session, sessionHandle); + } + } +} + +void LLVivoxVoiceClient::sessionGroupAddSessionResponse(std::string &requestId, int statusCode, std::string &statusString, std::string &sessionHandle) +{ + sessionState *session = findSessionBeingCreatedByURI(requestId); + + if(session) + { + session->mCreateInProgress = false; + } + + if(statusCode != 0) + { + LL_WARNS("Voice") << "SessionGroup.AddSession response failure (" << statusCode << "): " << statusString << LL_ENDL; + if(session) + { + session->mErrorStatusCode = statusCode; + session->mErrorStatusString = statusString; + if(session == mAudioSession) + { + setState(stateJoinSessionFailed); + } + else + { + reapSession(session); + } + } + } + else + { + LL_DEBUGS("Voice") << "SessionGroup.AddSession response received (success), session handle is " << sessionHandle << LL_ENDL; + if(session) + { + setSessionHandle(session, sessionHandle); + } + } +} + +void LLVivoxVoiceClient::sessionConnectResponse(std::string &requestId, int statusCode, std::string &statusString) +{ + sessionState *session = findSession(requestId); + if(statusCode != 0) + { + LL_WARNS("Voice") << "Session.Connect response failure (" << statusCode << "): " << statusString << LL_ENDL; + if(session) + { + session->mMediaConnectInProgress = false; + session->mErrorStatusCode = statusCode; + session->mErrorStatusString = statusString; + if(session == mAudioSession) + setState(stateJoinSessionFailed); + } + } + else + { + LL_DEBUGS("Voice") << "Session.Connect response received (success)" << LL_ENDL; + } +} + +void LLVivoxVoiceClient::logoutResponse(int statusCode, std::string &statusString) +{ + if(statusCode != 0) + { + LL_WARNS("Voice") << "Account.Logout response failure: " << statusString << LL_ENDL; + // Should this ever fail? do we care if it does? + } +} + +void LLVivoxVoiceClient::connectorShutdownResponse(int statusCode, std::string &statusString) +{ + if(statusCode != 0) + { + LL_WARNS("Voice") << "Connector.InitiateShutdown response failure: " << statusString << LL_ENDL; + // Should this ever fail? do we care if it does? + } + + mConnected = false; + + if(getState() == stateConnectorStopping) + { + setState(stateConnectorStopped); + } +} + +void LLVivoxVoiceClient::sessionAddedEvent( + std::string &uriString, + std::string &alias, + std::string &sessionHandle, + std::string &sessionGroupHandle, + bool isChannel, + bool incoming, + std::string &nameString, + std::string &applicationString) +{ + sessionState *session = NULL; + + LL_INFOS("Voice") << "session " << uriString << ", alias " << alias << ", name " << nameString << " handle " << sessionHandle << LL_ENDL; + + session = addSession(uriString, sessionHandle); + if(session) + { + session->mGroupHandle = sessionGroupHandle; + session->mIsChannel = isChannel; + session->mIncoming = incoming; + session->mAlias = alias; + + // Generate a caller UUID -- don't need to do this for channels + if(!session->mIsChannel) + { + if(IDFromName(session->mSIPURI, session->mCallerID)) + { + // Normal URI(base64-encoded UUID) + } + else if(!session->mAlias.empty() && IDFromName(session->mAlias, session->mCallerID)) + { + // Wrong URI, but an alias is available. Stash the incoming URI as an alternate + session->mAlternateSIPURI = session->mSIPURI; + + // and generate a proper URI from the ID. + setSessionURI(session, sipURIFromID(session->mCallerID)); + } + else + { + LL_INFOS("Voice") << "Could not generate caller id from uri, using hash of uri " << session->mSIPURI << LL_ENDL; + session->mCallerID.generate(session->mSIPURI); + session->mSynthesizedCallerID = true; + + // Can't look up the name in this case -- we have to extract it from the URI. + std::string namePortion = nameFromsipURI(session->mSIPURI); + if(namePortion.empty()) + { + // Didn't seem to be a SIP URI, just use the whole provided name. + namePortion = nameString; + } + + // Some incoming names may be separated with an underscore instead of a space. Fix this. + LLStringUtil::replaceChar(namePortion, '_', ' '); + + // Act like we just finished resolving the name (this stores it in all the right places) + avatarNameResolved(session->mCallerID, namePortion); + } + + LL_INFOS("Voice") << "caller ID: " << session->mCallerID << LL_ENDL; + + if(!session->mSynthesizedCallerID) + { + // If we got here, we don't have a proper name. Initiate a lookup. + lookupName(session->mCallerID); + } + } + } +} + +void LLVivoxVoiceClient::sessionGroupAddedEvent(std::string &sessionGroupHandle) +{ + LL_DEBUGS("Voice") << "handle " << sessionGroupHandle << LL_ENDL; + +#if USE_SESSION_GROUPS + if(mMainSessionGroupHandle.empty()) + { + // This is the first (i.e. "main") session group. Save its handle. + mMainSessionGroupHandle = sessionGroupHandle; + } + else + { + LL_DEBUGS("Voice") << "Already had a session group handle " << mMainSessionGroupHandle << LL_ENDL; + } +#endif +} + +void LLVivoxVoiceClient::joinedAudioSession(sessionState *session) +{ + LL_DEBUGS("Voice") << "Joined Audio Session" << LL_ENDL; + if(mAudioSession != session) + { + sessionState *oldSession = mAudioSession; + + mAudioSession = session; + mAudioSessionChanged = true; + + // The old session may now need to be deleted. + reapSession(oldSession); + } + + // This is the session we're joining. + if(getState() == stateJoiningSession) + { + setState(stateSessionJoined); + + // SLIM SDK: we don't always receive a participant state change for ourselves when joining a channel now. + // Add the current user as a participant here. + participantState *participant = session->addParticipant(sipURIFromName(mAccountName)); + if(participant) + { + participant->mIsSelf = true; + lookupName(participant->mAvatarID); + + LL_INFOS("Voice") << "added self as participant \"" << participant->mAccountName + << "\" (" << participant->mAvatarID << ")"<< LL_ENDL; + } + + if(!session->mIsChannel) + { + // this is a p2p session. Make sure the other end is added as a participant. + participantState *participant = session->addParticipant(session->mSIPURI); + if(participant) + { + if(participant->mAvatarIDValid) + { + lookupName(participant->mAvatarID); + } + else if(!session->mName.empty()) + { + participant->mDisplayName = session->mName; + avatarNameResolved(participant->mAvatarID, session->mName); + } + + // TODO: Question: Do we need to set up mAvatarID/mAvatarIDValid here? + LL_INFOS("Voice") << "added caller as participant \"" << participant->mAccountName + << "\" (" << participant->mAvatarID << ")"<< LL_ENDL; + } + } + } +} + +void LLVivoxVoiceClient::sessionRemovedEvent( + std::string &sessionHandle, + std::string &sessionGroupHandle) +{ + LL_INFOS("Voice") << "handle " << sessionHandle << LL_ENDL; + + sessionState *session = findSession(sessionHandle); + if(session) + { + leftAudioSession(session); + + // This message invalidates the session's handle. Set it to empty. + setSessionHandle(session); + + // This also means that the session's session group is now empty. + // Terminate the session group so it doesn't leak. + sessionGroupTerminateSendMessage(session); + + // Reset the media state (we now have no info) + session->mMediaStreamState = streamStateUnknown; + session->mTextStreamState = streamStateUnknown; + + // Conditionally delete the session + reapSession(session); + } + else + { + LL_WARNS("Voice") << "unknown session " << sessionHandle << " removed" << LL_ENDL; + } +} + +void LLVivoxVoiceClient::reapSession(sessionState *session) +{ + if(session) + { + if(!session->mHandle.empty()) + { + LL_DEBUGS("Voice") << "NOT deleting session " << session->mSIPURI << " (non-null session handle)" << LL_ENDL; + } + else if(session->mCreateInProgress) + { + LL_DEBUGS("Voice") << "NOT deleting session " << session->mSIPURI << " (create in progress)" << LL_ENDL; + } + else if(session->mMediaConnectInProgress) + { + LL_DEBUGS("Voice") << "NOT deleting session " << session->mSIPURI << " (connect in progress)" << LL_ENDL; + } + else if(session == mAudioSession) + { + LL_DEBUGS("Voice") << "NOT deleting session " << session->mSIPURI << " (it's the current session)" << LL_ENDL; + } + else if(session == mNextAudioSession) + { + LL_DEBUGS("Voice") << "NOT deleting session " << session->mSIPURI << " (it's the next session)" << LL_ENDL; + } + else + { + // TODO: Question: Should we check for queued text messages here? + // We don't have a reason to keep tracking this session, so just delete it. + LL_DEBUGS("Voice") << "deleting session " << session->mSIPURI << LL_ENDL; + deleteSession(session); + session = NULL; + } + } + else + { +// LL_DEBUGS("Voice") << "session is NULL" << LL_ENDL; + } +} + +// Returns true if the session seems to indicate we've moved to a region on a different voice server +bool LLVivoxVoiceClient::sessionNeedsRelog(sessionState *session) +{ + bool result = false; + + if(session != NULL) + { + // Only make this check for spatial channels (so it won't happen for group or p2p calls) + if(session->mIsSpatial) + { + std::string::size_type atsign; + + atsign = session->mSIPURI.find("@"); + + if(atsign != std::string::npos) + { + std::string urihost = session->mSIPURI.substr(atsign + 1); + if(stricmp(urihost.c_str(), mVoiceSIPURIHostName.c_str())) + { + // The hostname in this URI is different from what we expect. This probably means we need to relog. + + // We could make a ProvisionVoiceAccountRequest and compare the result with the current values of + // mVoiceSIPURIHostName and mVoiceAccountServerURI to be really sure, but this is a pretty good indicator. + + result = true; + } + } + } + } + + return result; +} + +void LLVivoxVoiceClient::leftAudioSession( + sessionState *session) +{ + if(mAudioSession == session) + { + switch(getState()) + { + case stateJoiningSession: + case stateSessionJoined: + case stateRunning: + case stateLeavingSession: + case stateJoinSessionFailed: + case stateJoinSessionFailedWaiting: + // normal transition + LL_DEBUGS("Voice") << "left session " << session->mHandle << " in state " << state2string(getState()) << LL_ENDL; + setState(stateSessionTerminated); + break; + + case stateSessionTerminated: + // this will happen sometimes -- there are cases where we send the terminate and then go straight to this state. + LL_WARNS("Voice") << "left session " << session->mHandle << " in state " << state2string(getState()) << LL_ENDL; + break; + + default: + LL_WARNS("Voice") << "unexpected SessionStateChangeEvent (left session) in state " << state2string(getState()) << LL_ENDL; + setState(stateSessionTerminated); + break; + } + } +} + +void LLVivoxVoiceClient::accountLoginStateChangeEvent( + std::string &accountHandle, + int statusCode, + std::string &statusString, + int state) +{ + /* + According to Mike S., status codes for this event are: + login_state_logged_out=0, + login_state_logged_in = 1, + login_state_logging_in = 2, + login_state_logging_out = 3, + login_state_resetting = 4, + login_state_error=100 + */ + + LL_DEBUGS("Voice") << "state change event: " << state << LL_ENDL; + switch(state) + { + case 1: + if(getState() == stateLoggingIn) + { + setState(stateLoggedIn); + } + break; + + case 3: + // The user is in the process of logging out. + setState(stateLoggingOut); + break; + + case 0: + // The user has been logged out. + setState(stateLoggedOut); + break; + + default: + //Used to be a commented out warning + LL_DEBUGS("Voice") << "unknown state: " << state << LL_ENDL; + break; + } +} + +void LLVivoxVoiceClient::mediaCompletionEvent(std::string &sessionGroupHandle, std::string &mediaCompletionType) +{ + if (mediaCompletionType == "AuxBufferAudioCapture") + { + mCaptureBufferRecording = false; + } + else if (mediaCompletionType == "AuxBufferAudioRender") + { + // Ignore all but the last stop event + if (--mPlayRequestCount <= 0) + { + mCaptureBufferPlaying = false; + } + } + else + { + LL_DEBUGS("Voice") << "Unknown MediaCompletionType: " << mediaCompletionType << LL_ENDL; + } +} + +void LLVivoxVoiceClient::mediaStreamUpdatedEvent( + std::string &sessionHandle, + std::string &sessionGroupHandle, + int statusCode, + std::string &statusString, + int state, + bool incoming) +{ + sessionState *session = findSession(sessionHandle); + + LL_DEBUGS("Voice") << "session " << sessionHandle << ", status code " << statusCode << ", string \"" << statusString << "\"" << LL_ENDL; + + if(session) + { + // We know about this session + + // Save the state for later use + session->mMediaStreamState = state; + + switch(statusCode) + { + case 0: + case 200: + // generic success + // Don't change the saved error code (it may have been set elsewhere) + break; + default: + // save the status code for later + session->mErrorStatusCode = statusCode; + break; + } + + switch(state) + { + case streamStateIdle: + // Standard "left audio session" + session->mVoiceEnabled = false; + session->mMediaConnectInProgress = false; + leftAudioSession(session); + break; + + case streamStateConnected: + session->mVoiceEnabled = true; + session->mMediaConnectInProgress = false; + joinedAudioSession(session); + break; + + case streamStateRinging: + if(incoming) + { + // Send the voice chat invite to the GUI layer + // TODO: Question: Should we correlate with the mute list here? + session->mIMSessionID = LLIMMgr::computeSessionID(IM_SESSION_P2P_INVITE, session->mCallerID); + session->mVoiceInvitePending = true; + if(session->mName.empty()) + { + lookupName(session->mCallerID); + } + else + { + // Act like we just finished resolving the name + avatarNameResolved(session->mCallerID, session->mName); + } + } + break; + + default: + LL_WARNS("Voice") << "unknown state " << state << LL_ENDL; + break; + + } + + } + else + { + LL_WARNS("Voice") << "session " << sessionHandle << "not found"<< LL_ENDL; + } +} + +void LLVivoxVoiceClient::textStreamUpdatedEvent( + std::string &sessionHandle, + std::string &sessionGroupHandle, + bool enabled, + int state, + bool incoming) +{ + sessionState *session = findSession(sessionHandle); + + if(session) + { + // Save the state for later use + session->mTextStreamState = state; + + // We know about this session + switch(state) + { + case 0: // We see this when the text stream closes + LL_DEBUGS("Voice") << "stream closed" << LL_ENDL; + break; + + case 1: // We see this on an incoming call from the Connector + // Try to send any text messages queued for this session. + sendQueuedTextMessages(session); + + // Send the text chat invite to the GUI layer + // TODO: Question: Should we correlate with the mute list here? + session->mTextInvitePending = true; + if(session->mName.empty()) + { + lookupName(session->mCallerID); + } + else + { + // Act like we just finished resolving the name + avatarNameResolved(session->mCallerID, session->mName); + } + break; + + default: + LL_WARNS("Voice") << "unknown state " << state << LL_ENDL; + break; + + } + } +} + +void LLVivoxVoiceClient::participantAddedEvent( + std::string &sessionHandle, + std::string &sessionGroupHandle, + std::string &uriString, + std::string &alias, + std::string &nameString, + std::string &displayNameString, + int participantType) +{ + sessionState *session = findSession(sessionHandle); + if(session) + { + participantState *participant = session->addParticipant(uriString); + if(participant) + { + participant->mAccountName = nameString; + + LL_DEBUGS("Voice") << "added participant \"" << participant->mAccountName + << "\" (" << participant->mAvatarID << ")"<< LL_ENDL; + + if(participant->mAvatarIDValid) + { + // Initiate a lookup + lookupName(participant->mAvatarID); + } + else + { + // If we don't have a valid avatar UUID, we need to fill in the display name to make the active speakers floater work. + std::string namePortion = nameFromsipURI(uriString); + if(namePortion.empty()) + { + // Problem with the SIP URI, fall back to the display name + namePortion = displayNameString; + } + if(namePortion.empty()) + { + // Problems with both of the above, fall back to the account name + namePortion = nameString; + } + + // Set the display name (which is a hint to the active speakers window not to do its own lookup) + participant->mDisplayName = namePortion; + avatarNameResolved(participant->mAvatarID, namePortion); + } + } + } +} + +void LLVivoxVoiceClient::participantRemovedEvent( + std::string &sessionHandle, + std::string &sessionGroupHandle, + std::string &uriString, + std::string &alias, + std::string &nameString) +{ + sessionState *session = findSession(sessionHandle); + if(session) + { + participantState *participant = session->findParticipant(uriString); + if(participant) + { + session->removeParticipant(participant); + } + else + { + LL_DEBUGS("Voice") << "unknown participant " << uriString << LL_ENDL; + } + } + else + { + LL_DEBUGS("Voice") << "unknown session " << sessionHandle << LL_ENDL; + } +} + + +void LLVivoxVoiceClient::participantUpdatedEvent( + std::string &sessionHandle, + std::string &sessionGroupHandle, + std::string &uriString, + std::string &alias, + bool isModeratorMuted, + bool isSpeaking, + int volume, + F32 energy) +{ + sessionState *session = findSession(sessionHandle); + if(session) + { + participantState *participant = session->findParticipant(uriString); + + if(participant) + { + participant->mIsSpeaking = isSpeaking; + participant->mIsModeratorMuted = isModeratorMuted; + + // SLIM SDK: convert range: ensure that energy is set to zero if is_speaking is false + if (isSpeaking) + { + participant->mSpeakingTimeout.reset(); + participant->mPower = energy; + } + else + { + participant->mPower = 0.0f; + } + + // Ignore incoming volume level if it has been explicitly set, or there + // is a volume or mute change pending. + if ( !participant->mVolumeSet && !participant->mVolumeDirty) + { + participant->mVolume = (F32)volume * VOLUME_SCALE_VIVOX; + } + + // *HACK: mantipov: added while working on EXT-3544 + /* + Sometimes LLVoiceClient::participantUpdatedEvent callback is called BEFORE + LLViewerChatterBoxSessionAgentListUpdates::post() sometimes AFTER. + + participantUpdatedEvent updates voice participant state in particular participantState::mIsModeratorMuted + Originally we wanted to update session Speaker Manager to fire LLSpeakerVoiceModerationEvent to fix the EXT-3544 bug. + Calling of the LLSpeakerMgr::update() method was added into LLIMMgr::processAgentListUpdates. + + But in case participantUpdatedEvent() is called after LLViewerChatterBoxSessionAgentListUpdates::post() + voice participant mIsModeratorMuted is changed after speakers are updated in Speaker Manager + and event is not fired. + + So, we have to call LLSpeakerMgr::update() here. In any case it is better than call it + in LLCallFloater::draw() + */ + LLVoiceChannel* voice_cnl = LLVoiceChannel::getCurrentVoiceChannel(); + + // ignore session ID of local chat + if (voice_cnl && voice_cnl->getSessionID().notNull()) + { + LLSpeakerMgr* speaker_manager = LLIMModel::getInstance()->getSpeakerManager(voice_cnl->getSessionID()); + if (speaker_manager) + { + speaker_manager->update(true); + + // also initialize voice moderate_mode depend on Agent's participant. See EXT-6937. + // *TODO: remove once a way to request the current voice channel moderation mode is implemented. + if (gAgentID == participant->mAvatarID) + { + speaker_manager->initVoiceModerateMode(); + } + } + } + } + else + { + LL_WARNS("Voice") << "unknown participant: " << uriString << LL_ENDL; + } + } + else + { + LL_INFOS("Voice") << "unknown session " << sessionHandle << LL_ENDL; + } +} + +void LLVivoxVoiceClient::buddyPresenceEvent( + std::string &uriString, + std::string &alias, + std::string &statusString, + std::string &applicationString) +{ + buddyListEntry *buddy = findBuddy(uriString); + + if(buddy) + { + LL_DEBUGS("Voice") << "Presence event for " << buddy->mDisplayName << " status \"" << statusString << "\", application \"" << applicationString << "\""<< LL_ENDL; + LL_DEBUGS("Voice") << "before: mOnlineSL = " << (buddy->mOnlineSL?"true":"false") << ", mOnlineSLim = " << (buddy->mOnlineSLim?"true":"false") << LL_ENDL; + + if(applicationString.empty()) + { + // This presence event is from a client that doesn't set up the Application string. Do things the old-skool way. + // NOTE: this will be needed to support people who aren't on the 3010-class SDK yet. + + if ( stricmp("Unknown", statusString.c_str())== 0) + { + // User went offline with a non-SLim-enabled viewer. + buddy->mOnlineSL = false; + } + else if ( stricmp("Online", statusString.c_str())== 0) + { + // User came online with a non-SLim-enabled viewer. + buddy->mOnlineSL = true; + } + else + { + // If the user is online through SLim, their status will be "Online-slc", "Away", or something else. + // NOTE: we should never see this unless someone is running an OLD version of SLim -- the versions that should be in use now all set the application string. + buddy->mOnlineSLim = true; + } + } + else if(applicationString.find("SecondLifeViewer") != std::string::npos) + { + // This presence event is from a viewer that sets the application string + if ( stricmp("Unknown", statusString.c_str())== 0) + { + // Viewer says they're offline + buddy->mOnlineSL = false; + } + else + { + // Viewer says they're online + buddy->mOnlineSL = true; + } + } + else + { + // This presence event is from something which is NOT the SL viewer (assume it's SLim). + if ( stricmp("Unknown", statusString.c_str())== 0) + { + // SLim says they're offline + buddy->mOnlineSLim = false; + } + else + { + // SLim says they're online + buddy->mOnlineSLim = true; + } + } + + LL_DEBUGS("Voice") << "after: mOnlineSL = " << (buddy->mOnlineSL?"true":"false") << ", mOnlineSLim = " << (buddy->mOnlineSLim?"true":"false") << LL_ENDL; + + // HACK -- increment the internal change serial number in the LLRelationship (without changing the actual status), so the UI notices the change. + LLAvatarTracker::instance().setBuddyOnline(buddy->mUUID,LLAvatarTracker::instance().isBuddyOnline(buddy->mUUID)); + + notifyFriendObservers(); + } + else + { + LL_DEBUGS("Voice") << "Presence for unknown buddy " << uriString << LL_ENDL; + } +} + +void LLVivoxVoiceClient::messageEvent( + std::string &sessionHandle, + std::string &uriString, + std::string &alias, + std::string &messageHeader, + std::string &messageBody, + std::string &applicationString) +{ + LL_DEBUGS("Voice") << "Message event, session " << sessionHandle << " from " << uriString << LL_ENDL; +// LL_DEBUGS("Voice") << " header " << messageHeader << ", body: \n" << messageBody << LL_ENDL; + + if(messageHeader.find("text/html") != std::string::npos) + { + std::string message; + + { + const std::string startMarker = "<body"; + const std::string startMarker2 = ">"; + const std::string endMarker = "</body>"; + const std::string startSpan = "<span"; + const std::string endSpan = "</span>"; + std::string::size_type start; + std::string::size_type end; + + // Default to displaying the raw string, so the message gets through. + message = messageBody; + + // Find the actual message text within the XML fragment + start = messageBody.find(startMarker); + start = messageBody.find(startMarker2, start); + end = messageBody.find(endMarker); + + if(start != std::string::npos) + { + start += startMarker2.size(); + + if(end != std::string::npos) + end -= start; + + message.assign(messageBody, start, end); + } + else + { + // Didn't find a <body>, try looking for a <span> instead. + start = messageBody.find(startSpan); + start = messageBody.find(startMarker2, start); + end = messageBody.find(endSpan); + + if(start != std::string::npos) + { + start += startMarker2.size(); + + if(end != std::string::npos) + end -= start; + + message.assign(messageBody, start, end); + } + } + } + +// LL_DEBUGS("Voice") << " raw message = \n" << message << LL_ENDL; + + // strip formatting tags + { + std::string::size_type start; + std::string::size_type end; + + while((start = message.find('<')) != std::string::npos) + { + if((end = message.find('>', start + 1)) != std::string::npos) + { + // Strip out the tag + message.erase(start, (end + 1) - start); + } + else + { + // Avoid an infinite loop + break; + } + } + } + + // Decode ampersand-escaped chars + { + std::string::size_type mark = 0; + + // The text may contain text encoded with <, >, and & + mark = 0; + while((mark = message.find("<", mark)) != std::string::npos) + { + message.replace(mark, 4, "<"); + mark += 1; + } + + mark = 0; + while((mark = message.find(">", mark)) != std::string::npos) + { + message.replace(mark, 4, ">"); + mark += 1; + } + + mark = 0; + while((mark = message.find("&", mark)) != std::string::npos) + { + message.replace(mark, 5, "&"); + mark += 1; + } + } + + // strip leading/trailing whitespace (since we always seem to get a couple newlines) + LLStringUtil::trim(message); + +// LL_DEBUGS("Voice") << " stripped message = \n" << message << LL_ENDL; + + sessionState *session = findSession(sessionHandle); + if(session) + { + bool is_busy = gAgent.getBusy(); + bool is_muted = LLMuteList::getInstance()->isMuted(session->mCallerID, session->mName, LLMute::flagTextChat); + bool is_linden = LLMuteList::getInstance()->isLinden(session->mName); + bool quiet_chat = false; + LLChat chat; + + chat.mMuted = is_muted && !is_linden; + + if(!chat.mMuted) + { + chat.mFromID = session->mCallerID; + chat.mFromName = session->mName; + chat.mSourceType = CHAT_SOURCE_AGENT; + + if(is_busy && !is_linden) + { + quiet_chat = true; + // TODO: Question: Return busy mode response here? Or maybe when session is started instead? + } + + LL_DEBUGS("Voice") << "adding message, name " << session->mName << " session " << session->mIMSessionID << ", target " << session->mCallerID << LL_ENDL; + gIMMgr->addMessage(session->mIMSessionID, + session->mCallerID, + session->mName.c_str(), + message.c_str(), + LLStringUtil::null, // default arg + IM_NOTHING_SPECIAL, // default arg + 0, // default arg + LLUUID::null, // default arg + LLVector3::zero, // default arg + true); // prepend name and make it a link to the user's profile + + } + } + } +} + +void LLVivoxVoiceClient::sessionNotificationEvent(std::string &sessionHandle, std::string &uriString, std::string ¬ificationType) +{ + sessionState *session = findSession(sessionHandle); + + if(session) + { + participantState *participant = session->findParticipant(uriString); + if(participant) + { + if (!stricmp(notificationType.c_str(), "Typing")) + { + // Other end started typing + // TODO: The proper way to add a typing notification seems to be LLIMMgr::processIMTypingStart(). + // It requires an LLIMInfo for the message, which we don't have here. + } + else if (!stricmp(notificationType.c_str(), "NotTyping")) + { + // Other end stopped typing + // TODO: The proper way to remove a typing notification seems to be LLIMMgr::processIMTypingStop(). + // It requires an LLIMInfo for the message, which we don't have here. + } + else + { + LL_DEBUGS("Voice") << "Unknown notification type " << notificationType << "for participant " << uriString << " in session " << session->mSIPURI << LL_ENDL; + } + } + else + { + LL_DEBUGS("Voice") << "Unknown participant " << uriString << " in session " << session->mSIPURI << LL_ENDL; + } + } + else + { + LL_DEBUGS("Voice") << "Unknown session handle " << sessionHandle << LL_ENDL; + } +} + +void LLVivoxVoiceClient::subscriptionEvent(std::string &buddyURI, std::string &subscriptionHandle, std::string &alias, std::string &displayName, std::string &applicationString, std::string &subscriptionType) +{ + buddyListEntry *buddy = findBuddy(buddyURI); + + if(!buddy) + { + // Couldn't find buddy by URI, try converting the alias... + if(!alias.empty()) + { + LLUUID id; + if(IDFromName(alias, id)) + { + buddy = findBuddy(id); + } + } + } + + if(buddy) + { + std::ostringstream stream; + + if(buddy->mCanSeeMeOnline) + { + // Sending the response will create an auto-accept rule + buddy->mHasAutoAcceptListEntry = true; + } + else + { + // Sending the response will create a block rule + buddy->mHasBlockListEntry = true; + } + + if(buddy->mInSLFriends) + { + buddy->mInVivoxBuddies = true; + } + + stream + << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.SendSubscriptionReply.1\">" + << "<AccountHandle>" << mAccountHandle << "</AccountHandle>" + << "<BuddyURI>" << buddy->mURI << "</BuddyURI>" + << "<RuleType>" << (buddy->mCanSeeMeOnline?"Allow":"Hide") << "</RuleType>" + << "<AutoAccept>"<< (buddy->mInSLFriends?"1":"0")<< "</AutoAccept>" + << "<SubscriptionHandle>" << subscriptionHandle << "</SubscriptionHandle>" + << "</Request>" + << "\n\n\n"; + + writeString(stream.str()); + } +} + +void LLVivoxVoiceClient::auxAudioPropertiesEvent(F32 energy) +{ + LL_DEBUGS("Voice") << "got energy " << energy << LL_ENDL; + mTuningEnergy = energy; +} + +void LLVivoxVoiceClient::buddyListChanged() +{ + // This is called after we receive a BuddyAndGroupListChangedEvent. + mBuddyListMapPopulated = true; + mFriendsListDirty = true; +} + +void LLVivoxVoiceClient::muteListChanged() +{ + // The user's mute list has been updated. Go through the current participant list and sync it with the mute list. + if(mAudioSession) + { + participantMap::iterator iter = mAudioSession->mParticipantsByURI.begin(); + + for(; iter != mAudioSession->mParticipantsByURI.end(); iter++) + { + participantState *p = iter->second; + + // Check to see if this participant is on the mute list already + if(p->updateMuteState()) + mAudioSession->mVolumeDirty = true; + } + } +} + +void LLVivoxVoiceClient::updateFriends(U32 mask) +{ + if(mask & (LLFriendObserver::ADD | LLFriendObserver::REMOVE | LLFriendObserver::POWERS)) + { + // Just resend the whole friend list to the daemon + mFriendsListDirty = true; + } +} + +///////////////////////////// +// Managing list of participants +LLVivoxVoiceClient::participantState::participantState(const std::string &uri) : + mURI(uri), + mPTT(false), + mIsSpeaking(false), + mIsModeratorMuted(false), + mLastSpokeTimestamp(0.f), + mPower(0.f), + mVolume(LLVoiceClient::VOLUME_DEFAULT), + mUserVolume(0), + mOnMuteList(false), + mVolumeSet(false), + mVolumeDirty(false), + mAvatarIDValid(false), + mIsSelf(false) +{ +} + +LLVivoxVoiceClient::participantState *LLVivoxVoiceClient::sessionState::addParticipant(const std::string &uri) +{ + participantState *result = NULL; + bool useAlternateURI = false; + + // Note: this is mostly the body of LLVivoxVoiceClient::sessionState::findParticipant(), but since we need to know if it + // matched the alternate SIP URI (so we can add it properly), we need to reproduce it here. + { + participantMap::iterator iter = mParticipantsByURI.find(uri); + + if(iter == mParticipantsByURI.end()) + { + if(!mAlternateSIPURI.empty() && (uri == mAlternateSIPURI)) + { + // This is a p2p session (probably with the SLIM client) with an alternate URI for the other participant. + // Use mSIPURI instead, since it will be properly encoded. + iter = mParticipantsByURI.find(mSIPURI); + useAlternateURI = true; + } + } + + if(iter != mParticipantsByURI.end()) + { + result = iter->second; + } + } + + if(!result) + { + // participant isn't already in one list or the other. + result = new participantState(useAlternateURI?mSIPURI:uri); + mParticipantsByURI.insert(participantMap::value_type(result->mURI, result)); + mParticipantsChanged = true; + + // Try to do a reverse transform on the URI to get the GUID back. + { + LLUUID id; + if(LLVivoxVoiceClient::getInstance()->IDFromName(result->mURI, id)) + { + result->mAvatarIDValid = true; + result->mAvatarID = id; + } + else + { + // Create a UUID by hashing the URI, but do NOT set mAvatarIDValid. + // This indicates that the ID will not be in the name cache. + result->mAvatarID.generate(uri); + } + } + + + if(result->updateMuteState()) + { + mMuteDirty = true; + } + + mParticipantsByUUID.insert(participantUUIDMap::value_type(result->mAvatarID, result)); + + if (LLSpeakerVolumeStorage::getInstance()->getSpeakerVolume(result->mAvatarID, result->mVolume)) + { + result->mVolumeDirty = true; + mVolumeDirty = true; + } + + LL_DEBUGS("Voice") << "participant \"" << result->mURI << "\" added." << LL_ENDL; + } + + return result; +} + +bool LLVivoxVoiceClient::participantState::updateMuteState() +{ + bool result = false; + + + + bool isMuted = LLMuteList::getInstance()->isMuted(mAvatarID, LLMute::flagVoiceChat); + if(mOnMuteList != isMuted) + { + mOnMuteList = isMuted; + mVolumeDirty = true; + result = true; + } + return result; +} + +bool LLVivoxVoiceClient::participantState::isAvatar() +{ + return mAvatarIDValid; +} + +void LLVivoxVoiceClient::sessionState::removeParticipant(LLVivoxVoiceClient::participantState *participant) +{ + if(participant) + { + participantMap::iterator iter = mParticipantsByURI.find(participant->mURI); + participantUUIDMap::iterator iter2 = mParticipantsByUUID.find(participant->mAvatarID); + + LL_DEBUGS("Voice") << "participant \"" << participant->mURI << "\" (" << participant->mAvatarID << ") removed." << LL_ENDL; + + if(iter == mParticipantsByURI.end()) + { + LL_ERRS("Voice") << "Internal error: participant " << participant->mURI << " not in URI map" << LL_ENDL; + } + else if(iter2 == mParticipantsByUUID.end()) + { + LL_ERRS("Voice") << "Internal error: participant ID " << participant->mAvatarID << " not in UUID map" << LL_ENDL; + } + else if(iter->second != iter2->second) + { + LL_ERRS("Voice") << "Internal error: participant mismatch!" << LL_ENDL; + } + else + { + mParticipantsByURI.erase(iter); + mParticipantsByUUID.erase(iter2); + + delete participant; + mParticipantsChanged = true; + } + } +} + +void LLVivoxVoiceClient::sessionState::removeAllParticipants() +{ + LL_DEBUGS("Voice") << "called" << LL_ENDL; + + while(!mParticipantsByURI.empty()) + { + removeParticipant(mParticipantsByURI.begin()->second); + } + + if(!mParticipantsByUUID.empty()) + { + LL_ERRS("Voice") << "Internal error: empty URI map, non-empty UUID map" << LL_ENDL; + } +} + +void LLVivoxVoiceClient::getParticipantList(std::set<LLUUID> &participants) +{ + if(mAudioSession) + { + for(participantUUIDMap::iterator iter = mAudioSession->mParticipantsByUUID.begin(); + iter != mAudioSession->mParticipantsByUUID.end(); + iter++) + { + participants.insert(iter->first); + } + } +} + +bool LLVivoxVoiceClient::isParticipant(const LLUUID &speaker_id) +{ + if(mAudioSession) + { + return (mAudioSession->mParticipantsByUUID.find(speaker_id) != mAudioSession->mParticipantsByUUID.end()); + } + return false; +} + + +LLVivoxVoiceClient::participantState *LLVivoxVoiceClient::sessionState::findParticipant(const std::string &uri) +{ + participantState *result = NULL; + + participantMap::iterator iter = mParticipantsByURI.find(uri); + + if(iter == mParticipantsByURI.end()) + { + if(!mAlternateSIPURI.empty() && (uri == mAlternateSIPURI)) + { + // This is a p2p session (probably with the SLIM client) with an alternate URI for the other participant. + // Look up the other URI + iter = mParticipantsByURI.find(mSIPURI); + } + } + + if(iter != mParticipantsByURI.end()) + { + result = iter->second; + } + + return result; +} + +LLVivoxVoiceClient::participantState* LLVivoxVoiceClient::sessionState::findParticipantByID(const LLUUID& id) +{ + participantState * result = NULL; + participantUUIDMap::iterator iter = mParticipantsByUUID.find(id); + + if(iter != mParticipantsByUUID.end()) + { + result = iter->second; + } + + return result; +} + +LLVivoxVoiceClient::participantState* LLVivoxVoiceClient::findParticipantByID(const LLUUID& id) +{ + participantState * result = NULL; + + if(mAudioSession) + { + result = mAudioSession->findParticipantByID(id); + } + + return result; +} + + +void LLVivoxVoiceClient::parcelChanged() +{ + if(getState() >= stateNoChannel) + { + // If the user is logged in, start a channel lookup. + LL_DEBUGS("Voice") << "sending ParcelVoiceInfoRequest (" << mCurrentRegionName << ", " << mCurrentParcelLocalID << ")" << LL_ENDL; + + std::string url = gAgent.getRegion()->getCapability("ParcelVoiceInfoRequest"); + LLSD data; + LLHTTPClient::post( + url, + data, + new LLVivoxVoiceClientCapResponder); + } + else + { + // The transition to stateNoChannel needs to kick this off again. + LL_INFOS("Voice") << "not logged in yet, deferring" << LL_ENDL; + } +} + +void LLVivoxVoiceClient::switchChannel( + std::string uri, + bool spatial, + bool no_reconnect, + bool is_p2p, + std::string hash) +{ + bool needsSwitch = false; + + LL_DEBUGS("Voice") + << "called in state " << state2string(getState()) + << " with uri \"" << uri << "\"" + << (spatial?", spatial is true":", spatial is false") + << LL_ENDL; + + switch(getState()) + { + case stateJoinSessionFailed: + case stateJoinSessionFailedWaiting: + case stateNoChannel: + // Always switch to the new URI from these states. + needsSwitch = true; + break; + + default: + if(mSessionTerminateRequested) + { + // If a terminate has been requested, we need to compare against where the URI we're already headed to. + if(mNextAudioSession) + { + if(mNextAudioSession->mSIPURI != uri) + needsSwitch = true; + } + else + { + // mNextAudioSession is null -- this probably means we're on our way back to spatial. + if(!uri.empty()) + { + // We do want to process a switch in this case. + needsSwitch = true; + } + } + } + else + { + // Otherwise, compare against the URI we're in now. + if(mAudioSession) + { + if(mAudioSession->mSIPURI != uri) + { + needsSwitch = true; + } + } + else + { + if(!uri.empty()) + { + // mAudioSession is null -- it's not clear what case would cause this. + // For now, log it as a warning and see if it ever crops up. + LL_WARNS("Voice") << "No current audio session." << LL_ENDL; + } + } + } + break; + } + + if(needsSwitch) + { + if(uri.empty()) + { + // Leave any channel we may be in + LL_DEBUGS("Voice") << "leaving channel" << LL_ENDL; + + sessionState *oldSession = mNextAudioSession; + mNextAudioSession = NULL; + + // The old session may now need to be deleted. + reapSession(oldSession); + + notifyStatusObservers(LLVoiceClientStatusObserver::STATUS_VOICE_DISABLED); + } + else + { + LL_DEBUGS("Voice") << "switching to channel " << uri << LL_ENDL; + + mNextAudioSession = addSession(uri); + mNextAudioSession->mHash = hash; + mNextAudioSession->mIsSpatial = spatial; + mNextAudioSession->mReconnect = !no_reconnect; + mNextAudioSession->mIsP2P = is_p2p; + } + + if(getState() <= stateNoChannel) + { + // We're already set up to join a channel, just needed to fill in the session URI + } + else + { + // State machine will come around and rejoin if uri/handle is not empty. + sessionTerminate(); + } + } +} + +void LLVivoxVoiceClient::joinSession(sessionState *session) +{ + mNextAudioSession = session; + + if(getState() <= stateNoChannel) + { + // We're already set up to join a channel, just needed to fill in the session handle + } + else + { + // State machine will come around and rejoin if uri/handle is not empty. + sessionTerminate(); + } +} + +void LLVivoxVoiceClient::setNonSpatialChannel( + const std::string &uri, + const std::string &credentials) +{ + switchChannel(uri, false, false, false, credentials); +} + +void LLVivoxVoiceClient::setSpatialChannel( + const std::string &uri, + const std::string &credentials) +{ + mSpatialSessionURI = uri; + mSpatialSessionCredentials = credentials; + mAreaVoiceDisabled = mSpatialSessionURI.empty(); + + LL_DEBUGS("Voice") << "got spatial channel uri: \"" << uri << "\"" << LL_ENDL; + + if((mAudioSession && !(mAudioSession->mIsSpatial)) || (mNextAudioSession && !(mNextAudioSession->mIsSpatial))) + { + // User is in a non-spatial chat or joining a non-spatial chat. Don't switch channels. + LL_INFOS("Voice") << "in non-spatial chat, not switching channels" << LL_ENDL; + } + else + { + switchChannel(mSpatialSessionURI, true, false, false, mSpatialSessionCredentials); + } +} + +void LLVivoxVoiceClient::callUser(const LLUUID &uuid) +{ + std::string userURI = sipURIFromID(uuid); + + switchChannel(userURI, false, true, true); +} + +LLVivoxVoiceClient::sessionState* LLVivoxVoiceClient::startUserIMSession(const LLUUID &uuid) +{ + // Figure out if a session with the user already exists + sessionState *session = findSession(uuid); + if(!session) + { + // No session with user, need to start one. + std::string uri = sipURIFromID(uuid); + session = addSession(uri); + + llassert(session); + if (!session) return NULL; + + session->mIsSpatial = false; + session->mReconnect = false; + session->mIsP2P = true; + session->mCallerID = uuid; + } + + if(session->mHandle.empty()) + { + // Session isn't active -- start it up. + sessionCreateSendMessage(session, false, true); + } + else + { + // Session is already active -- start up text. + sessionTextConnectSendMessage(session); + } + + return session; +} + +BOOL LLVivoxVoiceClient::sendTextMessage(const LLUUID& participant_id, const std::string& message) +{ + bool result = false; + + // Attempt to locate the indicated session + sessionState *session = startUserIMSession(participant_id); + if(session) + { + // found the session, attempt to send the message + session->mTextMsgQueue.push(message); + + // Try to send queued messages (will do nothing if the session is not open yet) + sendQueuedTextMessages(session); + + // The message is queued, so we succeed. + result = true; + } + else + { + LL_DEBUGS("Voice") << "Session not found for participant ID " << participant_id << LL_ENDL; + } + + return result; +} + +void LLVivoxVoiceClient::sendQueuedTextMessages(sessionState *session) +{ + if(session->mTextStreamState == 1) + { + if(!session->mTextMsgQueue.empty()) + { + std::ostringstream stream; + + while(!session->mTextMsgQueue.empty()) + { + std::string message = session->mTextMsgQueue.front(); + session->mTextMsgQueue.pop(); + stream + << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Session.SendMessage.1\">" + << "<SessionHandle>" << session->mHandle << "</SessionHandle>" + << "<MessageHeader>text/HTML</MessageHeader>" + << "<MessageBody>" << message << "</MessageBody>" + << "</Request>" + << "\n\n\n"; + } + writeString(stream.str()); + } + } + else + { + // Session isn't connected yet, defer until later. + } +} + +void LLVivoxVoiceClient::endUserIMSession(const LLUUID &uuid) +{ + // Figure out if a session with the user exists + sessionState *session = findSession(uuid); + if(session) + { + // found the session + if(!session->mHandle.empty()) + { + sessionTextDisconnectSendMessage(session); + } + } + else + { + LL_DEBUGS("Voice") << "Session not found for participant ID " << uuid << LL_ENDL; + } +} +bool LLVivoxVoiceClient::isValidChannel(std::string &sessionHandle) +{ + return(findSession(sessionHandle) != NULL); + +} +bool LLVivoxVoiceClient::answerInvite(std::string &sessionHandle) +{ + // this is only ever used to answer incoming p2p call invites. + + sessionState *session = findSession(sessionHandle); + if(session) + { + session->mIsSpatial = false; + session->mReconnect = false; + session->mIsP2P = true; + + joinSession(session); + return true; + } + + return false; +} + +BOOL LLVivoxVoiceClient::isOnlineSIP(const LLUUID &id) +{ + bool result = false; + buddyListEntry *buddy = findBuddy(id); + if(buddy) + { + result = buddy->mOnlineSLim; + LL_DEBUGS("Voice") << "Buddy " << buddy->mDisplayName << " is SIP " << (result?"online":"offline") << LL_ENDL; + } + + if(!result) + { + // This user isn't on the buddy list or doesn't show online status through the buddy list, but could be a participant in an existing session if they initiated a text IM. + sessionState *session = findSession(id); + if(session && !session->mHandle.empty()) + { + if((session->mTextStreamState != streamStateUnknown) || (session->mMediaStreamState > streamStateIdle)) + { + LL_DEBUGS("Voice") << "Open session with " << id << " found, returning SIP online state" << LL_ENDL; + // we have a p2p text session open with this user, so by definition they're online. + result = true; + } + } + } + + return result; +} + +bool LLVivoxVoiceClient::isVoiceWorking() const +{ + //Added stateSessionTerminated state to avoid problems with call in parcels with disabled voice (EXT-4758) + // Condition with joining spatial num was added to take into account possible problems with connection to voice + // server(EXT-4313). See bug descriptions and comments for MAX_NORMAL_JOINING_SPATIAL_NUM for more info. + return (mSpatialJoiningNum < MAX_NORMAL_JOINING_SPATIAL_NUM) && (stateLoggedIn <= mState) && (mState <= stateSessionTerminated); +} + +// Returns true if the indicated participant in the current audio session is really an SL avatar. +// Currently this will be false only for PSTN callers into group chats, and PSTN p2p calls. +BOOL LLVivoxVoiceClient::isParticipantAvatar(const LLUUID &id) +{ + BOOL result = TRUE; + sessionState *session = findSession(id); + + if(session != NULL) + { + // this is a p2p session with the indicated caller, or the session with the specified UUID. + if(session->mSynthesizedCallerID) + result = FALSE; + } + else + { + // Didn't find a matching session -- check the current audio session for a matching participant + if(mAudioSession != NULL) + { + participantState *participant = findParticipantByID(id); + if(participant != NULL) + { + result = participant->isAvatar(); + } + } + } + + return result; +} + +// Returns true if calling back the session URI after the session has closed is possible. +// Currently this will be false only for PSTN P2P calls. +BOOL LLVivoxVoiceClient::isSessionCallBackPossible(const LLUUID &session_id) +{ + BOOL result = TRUE; + sessionState *session = findSession(session_id); + + if(session != NULL) + { + result = session->isCallBackPossible(); + } + + return result; +} + +// Returns true if the session can accepte text IM's. +// Currently this will be false only for PSTN P2P calls. +BOOL LLVivoxVoiceClient::isSessionTextIMPossible(const LLUUID &session_id) +{ + bool result = TRUE; + sessionState *session = findSession(session_id); + + if(session != NULL) + { + result = session->isTextIMPossible(); + } + + return result; +} + + +void LLVivoxVoiceClient::declineInvite(std::string &sessionHandle) +{ + sessionState *session = findSession(sessionHandle); + if(session) + { + sessionMediaDisconnectSendMessage(session); + } +} + +void LLVivoxVoiceClient::leaveNonSpatialChannel() +{ + LL_DEBUGS("Voice") + << "called in state " << state2string(getState()) + << LL_ENDL; + + // Make sure we don't rejoin the current session. + sessionState *oldNextSession = mNextAudioSession; + mNextAudioSession = NULL; + + // Most likely this will still be the current session at this point, but check it anyway. + reapSession(oldNextSession); + + verifySessionState(); + + sessionTerminate(); +} + +std::string LLVivoxVoiceClient::getCurrentChannel() +{ + std::string result; + + if((getState() == stateRunning) && !mSessionTerminateRequested) + { + result = getAudioSessionURI(); + } + + return result; +} + +bool LLVivoxVoiceClient::inProximalChannel() +{ + bool result = false; + + if((getState() == stateRunning) && !mSessionTerminateRequested) + { + result = inSpatialChannel(); + } + + return result; +} + +std::string LLVivoxVoiceClient::sipURIFromID(const LLUUID &id) +{ + std::string result; + result = "sip:"; + result += nameFromID(id); + result += "@"; + result += mVoiceSIPURIHostName; + + return result; +} + +std::string LLVivoxVoiceClient::sipURIFromAvatar(LLVOAvatar *avatar) +{ + std::string result; + if(avatar) + { + result = "sip:"; + result += nameFromID(avatar->getID()); + result += "@"; + result += mVoiceSIPURIHostName; + } + + return result; +} + +std::string LLVivoxVoiceClient::nameFromAvatar(LLVOAvatar *avatar) +{ + std::string result; + if(avatar) + { + result = nameFromID(avatar->getID()); + } + return result; +} + +std::string LLVivoxVoiceClient::nameFromID(const LLUUID &uuid) +{ + std::string result; + + if (uuid.isNull()) { + //VIVOX, the uuid emtpy look for the mURIString and return that instead. + //result.assign(uuid.mURIStringName); + LLStringUtil::replaceChar(result, '_', ' '); + return result; + } + // Prepending this apparently prevents conflicts with reserved names inside the vivox code. + result = "x"; + + // Base64 encode and replace the pieces of base64 that are less compatible + // with e-mail local-parts. + // See RFC-4648 "Base 64 Encoding with URL and Filename Safe Alphabet" + result += LLBase64::encode(uuid.mData, UUID_BYTES); + LLStringUtil::replaceChar(result, '+', '-'); + LLStringUtil::replaceChar(result, '/', '_'); + + // If you need to transform a GUID to this form on the Mac OS X command line, this will do so: + // echo -n x && (echo e669132a-6c43-4ee1-a78d-6c82fff59f32 |xxd -r -p |openssl base64|tr '/+' '_-') + + // The reverse transform can be done with: + // echo 'x5mkTKmxDTuGnjWyC__WfMg==' |cut -b 2- -|tr '_-' '/+' |openssl base64 -d|xxd -p + + return result; +} + +bool LLVivoxVoiceClient::IDFromName(const std::string inName, LLUUID &uuid) +{ + bool result = false; + + // SLIM SDK: The "name" may actually be a SIP URI such as: "sip:xFnPP04IpREWNkuw1cOXlhw==@bhr.vivox.com" + // If it is, convert to a bare name before doing the transform. + std::string name = nameFromsipURI(inName); + + // Doesn't look like a SIP URI, assume it's an actual name. + if(name.empty()) + name = inName; + + // This will only work if the name is of the proper form. + // As an example, the account name for Monroe Linden (UUID 1673cfd3-8229-4445-8d92-ec3570e5e587) is: + // "xFnPP04IpREWNkuw1cOXlhw==" + + if((name.size() == 25) && (name[0] == 'x') && (name[23] == '=') && (name[24] == '=')) + { + // The name appears to have the right form. + + // Reverse the transforms done by nameFromID + std::string temp = name; + LLStringUtil::replaceChar(temp, '-', '+'); + LLStringUtil::replaceChar(temp, '_', '/'); + + U8 rawuuid[UUID_BYTES + 1]; + int len = apr_base64_decode_binary(rawuuid, temp.c_str() + 1); + if(len == UUID_BYTES) + { + // The decode succeeded. Stuff the bits into the result's UUID + memcpy(uuid.mData, rawuuid, UUID_BYTES); + result = true; + } + } + + if(!result) + { + // VIVOX: not a standard account name, just copy the URI name mURIString field + // and hope for the best. bpj + uuid.setNull(); // VIVOX, set the uuid field to nulls + } + + return result; +} + +std::string LLVivoxVoiceClient::displayNameFromAvatar(LLVOAvatar *avatar) +{ + return avatar->getFullname(); +} + +std::string LLVivoxVoiceClient::sipURIFromName(std::string &name) +{ + std::string result; + result = "sip:"; + result += name; + result += "@"; + result += mVoiceSIPURIHostName; + +// LLStringUtil::toLower(result); + + return result; +} + +std::string LLVivoxVoiceClient::nameFromsipURI(const std::string &uri) +{ + std::string result; + + std::string::size_type sipOffset, atOffset; + sipOffset = uri.find("sip:"); + atOffset = uri.find("@"); + if((sipOffset != std::string::npos) && (atOffset != std::string::npos)) + { + result = uri.substr(sipOffset + 4, atOffset - (sipOffset + 4)); + } + + return result; +} + +bool LLVivoxVoiceClient::inSpatialChannel(void) +{ + bool result = false; + + if(mAudioSession) + result = mAudioSession->mIsSpatial; + + return result; +} + +std::string LLVivoxVoiceClient::getAudioSessionURI() +{ + std::string result; + + if(mAudioSession) + result = mAudioSession->mSIPURI; + + return result; +} + +std::string LLVivoxVoiceClient::getAudioSessionHandle() +{ + std::string result; + + if(mAudioSession) + result = mAudioSession->mHandle; + + return result; +} + + +///////////////////////////// +// Sending updates of current state + +void LLVivoxVoiceClient::enforceTether(void) +{ + LLVector3d tethered = mCameraRequestedPosition; + + // constrain 'tethered' to within 50m of mAvatarPosition. + { + F32 max_dist = 50.0f; + LLVector3d camera_offset = mCameraRequestedPosition - mAvatarPosition; + F32 camera_distance = (F32)camera_offset.magVec(); + if(camera_distance > max_dist) + { + tethered = mAvatarPosition + + (max_dist / camera_distance) * camera_offset; + } + } + + if(dist_vec(mCameraPosition, tethered) > 0.1) + { + mCameraPosition = tethered; + mSpatialCoordsDirty = true; + } +} + +void LLVivoxVoiceClient::updatePosition(void) +{ + + LLViewerRegion *region = gAgent.getRegion(); + if(region && isAgentAvatarValid()) + { + LLMatrix3 rot; + LLVector3d pos; + + // TODO: If camera and avatar velocity are actually used by the voice system, we could compute them here... + // They're currently always set to zero. + + // Send the current camera position to the voice code + rot.setRows(LLViewerCamera::getInstance()->getAtAxis(), LLViewerCamera::getInstance()->getLeftAxis (), LLViewerCamera::getInstance()->getUpAxis()); + pos = gAgent.getRegion()->getPosGlobalFromRegion(LLViewerCamera::getInstance()->getOrigin()); + + LLVivoxVoiceClient::getInstance()->setCameraPosition( + pos, // position + LLVector3::zero, // velocity + rot); // rotation matrix + + // Send the current avatar position to the voice code + rot = gAgentAvatarp->getRootJoint()->getWorldRotation().getMatrix3(); + pos = gAgentAvatarp->getPositionGlobal(); + + // TODO: Can we get the head offset from outside the LLVOAvatar? + // pos += LLVector3d(mHeadOffset); + pos += LLVector3d(0.f, 0.f, 1.f); + + LLVivoxVoiceClient::getInstance()->setAvatarPosition( + pos, // position + LLVector3::zero, // velocity + rot); // rotation matrix + } +} + +void LLVivoxVoiceClient::setCameraPosition(const LLVector3d &position, const LLVector3 &velocity, const LLMatrix3 &rot) +{ + mCameraRequestedPosition = position; + + if(mCameraVelocity != velocity) + { + mCameraVelocity = velocity; + mSpatialCoordsDirty = true; + } + + if(mCameraRot != rot) + { + mCameraRot = rot; + mSpatialCoordsDirty = true; + } +} + +void LLVivoxVoiceClient::setAvatarPosition(const LLVector3d &position, const LLVector3 &velocity, const LLMatrix3 &rot) +{ + if(dist_vec(mAvatarPosition, position) > 0.1) + { + mAvatarPosition = position; + mSpatialCoordsDirty = true; + } + + if(mAvatarVelocity != velocity) + { + mAvatarVelocity = velocity; + mSpatialCoordsDirty = true; + } + + if(mAvatarRot != rot) + { + mAvatarRot = rot; + mSpatialCoordsDirty = true; + } +} + +bool LLVivoxVoiceClient::channelFromRegion(LLViewerRegion *region, std::string &name) +{ + bool result = false; + + if(region) + { + name = region->getName(); + } + + if(!name.empty()) + result = true; + + return result; +} + +void LLVivoxVoiceClient::leaveChannel(void) +{ + if(getState() == stateRunning) + { + LL_DEBUGS("Voice") << "leaving channel for teleport/logout" << LL_ENDL; + mChannelName.clear(); + sessionTerminate(); + } +} + +void LLVivoxVoiceClient::setMuteMic(bool muted) +{ + mMuteMic = muted; +} + +void LLVivoxVoiceClient::setUserPTTState(bool ptt) +{ + mUserPTTState = ptt; +} + +bool LLVivoxVoiceClient::getUserPTTState() +{ + return mUserPTTState; +} + +void LLVivoxVoiceClient::inputUserControlState(bool down) +{ + if(mPTTIsToggle) + { + if(down) // toggle open-mic state on 'down' + { + toggleUserPTTState(); + } + } + else // set open-mic state as an absolute + { + setUserPTTState(down); + } +} + + +void LLVivoxVoiceClient::toggleUserPTTState(void) +{ + mUserPTTState = !mUserPTTState; +} + +void LLVivoxVoiceClient::setVoiceEnabled(bool enabled) +{ + if (enabled != mVoiceEnabled) + { + // TODO: Refactor this so we don't call into LLVoiceChannel, but simply + // use the status observer + mVoiceEnabled = enabled; + LLVoiceClientStatusObserver::EStatusType status; + + + if (enabled) + { + LLVoiceChannel::getCurrentVoiceChannel()->activate(); + status = LLVoiceClientStatusObserver::STATUS_VOICE_ENABLED; + } + else + { + // Turning voice off looses your current channel -- this makes sure the UI isn't out of sync when you re-enable it. + LLVoiceChannel::getCurrentVoiceChannel()->deactivate(); + status = LLVoiceClientStatusObserver::STATUS_VOICE_DISABLED; + } + notifyStatusObservers(status); + } +} + +bool LLVivoxVoiceClient::voiceEnabled() +{ + return gSavedSettings.getBOOL("EnableVoiceChat") && !gSavedSettings.getBOOL("CmdLineDisableVoice"); +} + +void LLVivoxVoiceClient::setLipSyncEnabled(BOOL enabled) +{ + mLipSyncEnabled = enabled; +} + +BOOL LLVivoxVoiceClient::lipSyncEnabled() +{ + + if ( mVoiceEnabled && stateDisabled != getState() ) + { + return mLipSyncEnabled; + } + else + { + return FALSE; + } +} + +void LLVivoxVoiceClient::setUsePTT(bool usePTT) +{ + if(usePTT && !mUsePTT) + { + // When the user turns on PTT, reset the current state. + mUserPTTState = false; + } + mUsePTT = usePTT; +} + +void LLVivoxVoiceClient::setPTTIsToggle(bool PTTIsToggle) +{ + if(!PTTIsToggle && mPTTIsToggle) + { + // When the user turns off toggle, reset the current state. + mUserPTTState = false; + } + + mPTTIsToggle = PTTIsToggle; +} + +bool LLVivoxVoiceClient::getPTTIsToggle() +{ + return mPTTIsToggle; +} + +void LLVivoxVoiceClient::setPTTKey(std::string &key) +{ + if(key == "MiddleMouse") + { + mPTTIsMiddleMouse = true; + } + else + { + mPTTIsMiddleMouse = false; + if(!LLKeyboard::keyFromString(key, &mPTTKey)) + { + // If the call failed, don't match any key. + key = KEY_NONE; + } + } +} + +void LLVivoxVoiceClient::setEarLocation(S32 loc) +{ + if(mEarLocation != loc) + { + LL_DEBUGS("Voice") << "Setting mEarLocation to " << loc << LL_ENDL; + + mEarLocation = loc; + mSpatialCoordsDirty = true; + } +} + +void LLVivoxVoiceClient::setVoiceVolume(F32 volume) +{ + int scaled_volume = scale_speaker_volume(volume); + + if(scaled_volume != mSpeakerVolume) + { + int min_volume = scale_speaker_volume(0); + if((scaled_volume == min_volume) || (mSpeakerVolume == min_volume)) + { + mSpeakerMuteDirty = true; + } + + mSpeakerVolume = scaled_volume; + mSpeakerVolumeDirty = true; + } +} + +void LLVivoxVoiceClient::setMicGain(F32 volume) +{ + int scaled_volume = scale_mic_volume(volume); + + if(scaled_volume != mMicVolume) + { + mMicVolume = scaled_volume; + mMicVolumeDirty = true; + } +} + +void LLVivoxVoiceClient::keyDown(KEY key, MASK mask) +{ + if (gKeyboard->getKeyRepeated(key)) + { + // ignore auto-repeat keys + return; + } + + if(!mPTTIsMiddleMouse) + { + bool down = (mPTTKey != KEY_NONE) + && gKeyboard->getKeyDown(mPTTKey); + inputUserControlState(down); + } + + +} +void LLVivoxVoiceClient::keyUp(KEY key, MASK mask) +{ + if(!mPTTIsMiddleMouse) + { + bool down = (mPTTKey != KEY_NONE) + && gKeyboard->getKeyDown(mPTTKey); + inputUserControlState(down); + } + +} +void LLVivoxVoiceClient::middleMouseState(bool down) +{ + if(mPTTIsMiddleMouse) + { + if(mPTTIsMiddleMouse) + { + inputUserControlState(down); + } + } +} + +///////////////////////////// +// Accessors for data related to nearby speakers +BOOL LLVivoxVoiceClient::getVoiceEnabled(const LLUUID& id) +{ + BOOL result = FALSE; + participantState *participant = findParticipantByID(id); + if(participant) + { + // I'm not sure what the semantics of this should be. + // For now, if we have any data about the user that came through the chat channel, assume they're voice-enabled. + result = TRUE; + } + + return result; +} + +std::string LLVivoxVoiceClient::getDisplayName(const LLUUID& id) +{ + std::string result; + participantState *participant = findParticipantByID(id); + if(participant) + { + result = participant->mDisplayName; + } + + return result; +} + + + +BOOL LLVivoxVoiceClient::getIsSpeaking(const LLUUID& id) +{ + BOOL result = FALSE; + + participantState *participant = findParticipantByID(id); + if(participant) + { + if (participant->mSpeakingTimeout.getElapsedTimeF32() > SPEAKING_TIMEOUT) + { + participant->mIsSpeaking = FALSE; + } + result = participant->mIsSpeaking; + } + + return result; +} + +BOOL LLVivoxVoiceClient::getIsModeratorMuted(const LLUUID& id) +{ + BOOL result = FALSE; + + participantState *participant = findParticipantByID(id); + if(participant) + { + result = participant->mIsModeratorMuted; + } + + return result; +} + +F32 LLVivoxVoiceClient::getCurrentPower(const LLUUID& id) +{ + F32 result = 0; + participantState *participant = findParticipantByID(id); + if(participant) + { + result = participant->mPower; + } + + return result; +} + + + +BOOL LLVivoxVoiceClient::getUsingPTT(const LLUUID& id) +{ + BOOL result = FALSE; + + participantState *participant = findParticipantByID(id); + if(participant) + { + // I'm not sure what the semantics of this should be. + // Does "using PTT" mean they're configured with a push-to-talk button? + // For now, we know there's no PTT mechanism in place, so nobody is using it. + } + + return result; +} + +BOOL LLVivoxVoiceClient::getOnMuteList(const LLUUID& id) +{ + BOOL result = FALSE; + + participantState *participant = findParticipantByID(id); + if(participant) + { + result = participant->mOnMuteList; + } + + return result; +} + +// External accessors. +F32 LLVivoxVoiceClient::getUserVolume(const LLUUID& id) +{ + // Minimum volume will be returned for users with voice disabled + F32 result = LLVoiceClient::VOLUME_MIN; + + participantState *participant = findParticipantByID(id); + if(participant) + { + result = participant->mVolume; + + // Enable this when debugging voice slider issues. It's way to spammy even for debug-level logging. + // LL_DEBUGS("Voice") << "mVolume = " << result << " for " << id << LL_ENDL; + } + + return result; +} + +void LLVivoxVoiceClient::setUserVolume(const LLUUID& id, F32 volume) +{ + if(mAudioSession) + { + participantState *participant = findParticipantByID(id); + if (participant && !participant->mIsSelf) + { + if (!is_approx_equal(volume, LLVoiceClient::VOLUME_DEFAULT)) + { + // Store this volume setting for future sessions if it has been + // changed from the default + LLSpeakerVolumeStorage::getInstance()->storeSpeakerVolume(id, volume); + } + else + { + // Remove stored volume setting if it is returned to the default + LLSpeakerVolumeStorage::getInstance()->removeSpeakerVolume(id); + } + + participant->mVolume = llclamp(volume, LLVoiceClient::VOLUME_MIN, LLVoiceClient::VOLUME_MAX); + participant->mVolumeDirty = true; + mAudioSession->mVolumeDirty = true; + } + } +} + +std::string LLVivoxVoiceClient::getGroupID(const LLUUID& id) +{ + std::string result; + + participantState *participant = findParticipantByID(id); + if(participant) + { + result = participant->mGroupID; + } + + return result; +} + +BOOL LLVivoxVoiceClient::getAreaVoiceDisabled() +{ + return mAreaVoiceDisabled; +} + +void LLVivoxVoiceClient::recordingLoopStart(int seconds, int deltaFramesPerControlFrame) +{ +// LL_DEBUGS("Voice") << "sending SessionGroup.ControlRecording (Start)" << LL_ENDL; + + if(!mMainSessionGroupHandle.empty()) + { + std::ostringstream stream; + stream + << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"SessionGroup.ControlRecording.1\">" + << "<SessionGroupHandle>" << mMainSessionGroupHandle << "</SessionGroupHandle>" + << "<RecordingControlType>Start</RecordingControlType>" + << "<DeltaFramesPerControlFrame>" << deltaFramesPerControlFrame << "</DeltaFramesPerControlFrame>" + << "<Filename>" << "" << "</Filename>" + << "<EnableAudioRecordingEvents>false</EnableAudioRecordingEvents>" + << "<LoopModeDurationSeconds>" << seconds << "</LoopModeDurationSeconds>" + << "</Request>\n\n\n"; + + + writeString(stream.str()); + } +} + +void LLVivoxVoiceClient::recordingLoopSave(const std::string& filename) +{ +// LL_DEBUGS("Voice") << "sending SessionGroup.ControlRecording (Flush)" << LL_ENDL; + + if(mAudioSession != NULL && !mAudioSession->mGroupHandle.empty()) + { + std::ostringstream stream; + stream + << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"SessionGroup.ControlRecording.1\">" + << "<SessionGroupHandle>" << mMainSessionGroupHandle << "</SessionGroupHandle>" + << "<RecordingControlType>Flush</RecordingControlType>" + << "<Filename>" << filename << "</Filename>" + << "</Request>\n\n\n"; + + writeString(stream.str()); + } +} + +void LLVivoxVoiceClient::recordingStop() +{ +// LL_DEBUGS("Voice") << "sending SessionGroup.ControlRecording (Stop)" << LL_ENDL; + + if(mAudioSession != NULL && !mAudioSession->mGroupHandle.empty()) + { + std::ostringstream stream; + stream + << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"SessionGroup.ControlRecording.1\">" + << "<SessionGroupHandle>" << mMainSessionGroupHandle << "</SessionGroupHandle>" + << "<RecordingControlType>Stop</RecordingControlType>" + << "</Request>\n\n\n"; + + writeString(stream.str()); + } +} + +void LLVivoxVoiceClient::filePlaybackStart(const std::string& filename) +{ +// LL_DEBUGS("Voice") << "sending SessionGroup.ControlPlayback (Start)" << LL_ENDL; + + if(mAudioSession != NULL && !mAudioSession->mGroupHandle.empty()) + { + std::ostringstream stream; + stream + << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"SessionGroup.ControlPlayback.1\">" + << "<SessionGroupHandle>" << mMainSessionGroupHandle << "</SessionGroupHandle>" + << "<RecordingControlType>Start</RecordingControlType>" + << "<Filename>" << filename << "</Filename>" + << "</Request>\n\n\n"; + + writeString(stream.str()); + } +} + +void LLVivoxVoiceClient::filePlaybackStop() +{ +// LL_DEBUGS("Voice") << "sending SessionGroup.ControlPlayback (Stop)" << LL_ENDL; + + if(mAudioSession != NULL && !mAudioSession->mGroupHandle.empty()) + { + std::ostringstream stream; + stream + << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"SessionGroup.ControlPlayback.1\">" + << "<SessionGroupHandle>" << mMainSessionGroupHandle << "</SessionGroupHandle>" + << "<RecordingControlType>Stop</RecordingControlType>" + << "</Request>\n\n\n"; + + writeString(stream.str()); + } +} + +void LLVivoxVoiceClient::filePlaybackSetPaused(bool paused) +{ + // TODO: Implement once Vivox gives me a sample +} + +void LLVivoxVoiceClient::filePlaybackSetMode(bool vox, float speed) +{ + // TODO: Implement once Vivox gives me a sample +} + +LLVivoxVoiceClient::sessionState::sessionState() : + mErrorStatusCode(0), + mMediaStreamState(streamStateUnknown), + mTextStreamState(streamStateUnknown), + mCreateInProgress(false), + mMediaConnectInProgress(false), + mVoiceInvitePending(false), + mTextInvitePending(false), + mSynthesizedCallerID(false), + mIsChannel(false), + mIsSpatial(false), + mIsP2P(false), + mIncoming(false), + mVoiceEnabled(false), + mReconnect(false), + mVolumeDirty(false), + mMuteDirty(false), + mParticipantsChanged(false) +{ +} + +LLVivoxVoiceClient::sessionState::~sessionState() +{ + removeAllParticipants(); +} + +bool LLVivoxVoiceClient::sessionState::isCallBackPossible() +{ + // This may change to be explicitly specified by vivox in the future... + // Currently, only PSTN P2P calls cannot be returned. + // Conveniently, this is also the only case where we synthesize a caller UUID. + return !mSynthesizedCallerID; +} + +bool LLVivoxVoiceClient::sessionState::isTextIMPossible() +{ + // This may change to be explicitly specified by vivox in the future... + return !mSynthesizedCallerID; +} + + +LLVivoxVoiceClient::sessionIterator LLVivoxVoiceClient::sessionsBegin(void) +{ + return mSessions.begin(); +} + +LLVivoxVoiceClient::sessionIterator LLVivoxVoiceClient::sessionsEnd(void) +{ + return mSessions.end(); +} + + +LLVivoxVoiceClient::sessionState *LLVivoxVoiceClient::findSession(const std::string &handle) +{ + sessionState *result = NULL; + sessionMap::iterator iter = mSessionsByHandle.find(handle); + if(iter != mSessionsByHandle.end()) + { + result = iter->second; + } + + return result; +} + +LLVivoxVoiceClient::sessionState *LLVivoxVoiceClient::findSessionBeingCreatedByURI(const std::string &uri) +{ + sessionState *result = NULL; + for(sessionIterator iter = sessionsBegin(); iter != sessionsEnd(); iter++) + { + sessionState *session = *iter; + if(session->mCreateInProgress && (session->mSIPURI == uri)) + { + result = session; + break; + } + } + + return result; +} + +LLVivoxVoiceClient::sessionState *LLVivoxVoiceClient::findSession(const LLUUID &participant_id) +{ + sessionState *result = NULL; + + for(sessionIterator iter = sessionsBegin(); iter != sessionsEnd(); iter++) + { + sessionState *session = *iter; + if((session->mCallerID == participant_id) || (session->mIMSessionID == participant_id)) + { + result = session; + break; + } + } + + return result; +} + +LLVivoxVoiceClient::sessionState *LLVivoxVoiceClient::addSession(const std::string &uri, const std::string &handle) +{ + sessionState *result = NULL; + + if(handle.empty()) + { + // No handle supplied. + // Check whether there's already a session with this URI + for(sessionIterator iter = sessionsBegin(); iter != sessionsEnd(); iter++) + { + sessionState *s = *iter; + if((s->mSIPURI == uri) || (s->mAlternateSIPURI == uri)) + { + // TODO: I need to think about this logic... it's possible that this case should raise an internal error. + result = s; + break; + } + } + } + else // (!handle.empty()) + { + // Check for an existing session with this handle + sessionMap::iterator iter = mSessionsByHandle.find(handle); + + if(iter != mSessionsByHandle.end()) + { + result = iter->second; + } + } + + if(!result) + { + // No existing session found. + + LL_DEBUGS("Voice") << "adding new session: handle " << handle << " URI " << uri << LL_ENDL; + result = new sessionState(); + result->mSIPURI = uri; + result->mHandle = handle; + + if (LLVoiceClient::instance().getVoiceEffectEnabled()) + { + result->mVoiceFontID = LLVoiceClient::instance().getVoiceEffectDefault(); + } + + mSessions.insert(result); + + if(!result->mHandle.empty()) + { + mSessionsByHandle.insert(sessionMap::value_type(result->mHandle, result)); + } + } + else + { + // Found an existing session + + if(uri != result->mSIPURI) + { + // TODO: Should this be an internal error? + LL_DEBUGS("Voice") << "changing uri from " << result->mSIPURI << " to " << uri << LL_ENDL; + setSessionURI(result, uri); + } + + if(handle != result->mHandle) + { + if(handle.empty()) + { + // There's at least one race condition where where addSession was clearing an existing session handle, which caused things to break. + LL_DEBUGS("Voice") << "NOT clearing handle " << result->mHandle << LL_ENDL; + } + else + { + // TODO: Should this be an internal error? + LL_DEBUGS("Voice") << "changing handle from " << result->mHandle << " to " << handle << LL_ENDL; + setSessionHandle(result, handle); + } + } + + LL_DEBUGS("Voice") << "returning existing session: handle " << handle << " URI " << uri << LL_ENDL; + } + + verifySessionState(); + + return result; +} + +void LLVivoxVoiceClient::setSessionHandle(sessionState *session, const std::string &handle) +{ + // Have to remove the session from the handle-indexed map before changing the handle, or things will break badly. + + if(!session->mHandle.empty()) + { + // Remove session from the map if it should have been there. + sessionMap::iterator iter = mSessionsByHandle.find(session->mHandle); + if(iter != mSessionsByHandle.end()) + { + if(iter->second != session) + { + LL_ERRS("Voice") << "Internal error: session mismatch!" << LL_ENDL; + } + + mSessionsByHandle.erase(iter); + } + else + { + LL_ERRS("Voice") << "Internal error: session handle not found in map!" << LL_ENDL; + } + } + + session->mHandle = handle; + + if(!handle.empty()) + { + mSessionsByHandle.insert(sessionMap::value_type(session->mHandle, session)); + } + + verifySessionState(); +} + +void LLVivoxVoiceClient::setSessionURI(sessionState *session, const std::string &uri) +{ + // There used to be a map of session URIs to sessions, which made this complex.... + session->mSIPURI = uri; + + verifySessionState(); +} + +void LLVivoxVoiceClient::deleteSession(sessionState *session) +{ + // Remove the session from the handle map + if(!session->mHandle.empty()) + { + sessionMap::iterator iter = mSessionsByHandle.find(session->mHandle); + if(iter != mSessionsByHandle.end()) + { + if(iter->second != session) + { + LL_ERRS("Voice") << "Internal error: session mismatch" << LL_ENDL; + } + mSessionsByHandle.erase(iter); + } + } + + // Remove the session from the URI map + mSessions.erase(session); + + // At this point, the session should be unhooked from all lists and all state should be consistent. + verifySessionState(); + + // If this is the current audio session, clean up the pointer which will soon be dangling. + if(mAudioSession == session) + { + mAudioSession = NULL; + mAudioSessionChanged = true; + } + + // ditto for the next audio session + if(mNextAudioSession == session) + { + mNextAudioSession = NULL; + } + + // delete the session + delete session; +} + +void LLVivoxVoiceClient::deleteAllSessions() +{ + LL_DEBUGS("Voice") << "called" << LL_ENDL; + + while(!mSessions.empty()) + { + deleteSession(*(sessionsBegin())); + } + + if(!mSessionsByHandle.empty()) + { + LL_ERRS("Voice") << "Internal error: empty session map, non-empty handle map" << LL_ENDL; + } +} + +void LLVivoxVoiceClient::verifySessionState(void) +{ + // This is mostly intended for debugging problems with session state management. + LL_DEBUGS("Voice") << "Total session count: " << mSessions.size() << " , session handle map size: " << mSessionsByHandle.size() << LL_ENDL; + + for(sessionIterator iter = sessionsBegin(); iter != sessionsEnd(); iter++) + { + sessionState *session = *iter; + + LL_DEBUGS("Voice") << "session " << session << ": handle " << session->mHandle << ", URI " << session->mSIPURI << LL_ENDL; + + if(!session->mHandle.empty()) + { + // every session with a non-empty handle needs to be in the handle map + sessionMap::iterator i2 = mSessionsByHandle.find(session->mHandle); + if(i2 == mSessionsByHandle.end()) + { + LL_ERRS("Voice") << "internal error (handle " << session->mHandle << " not found in session map)" << LL_ENDL; + } + else + { + if(i2->second != session) + { + LL_ERRS("Voice") << "internal error (handle " << session->mHandle << " in session map points to another session)" << LL_ENDL; + } + } + } + } + + // check that every entry in the handle map points to a valid session in the session set + for(sessionMap::iterator iter = mSessionsByHandle.begin(); iter != mSessionsByHandle.end(); iter++) + { + sessionState *session = iter->second; + sessionIterator i2 = mSessions.find(session); + if(i2 == mSessions.end()) + { + LL_ERRS("Voice") << "internal error (session for handle " << session->mHandle << " not found in session map)" << LL_ENDL; + } + else + { + if(session->mHandle != (*i2)->mHandle) + { + LL_ERRS("Voice") << "internal error (session for handle " << session->mHandle << " points to session with different handle " << (*i2)->mHandle << ")" << LL_ENDL; + } + } + } +} + +LLVivoxVoiceClient::buddyListEntry::buddyListEntry(const std::string &uri) : + mURI(uri) +{ + mOnlineSL = false; + mOnlineSLim = false; + mCanSeeMeOnline = true; + mHasBlockListEntry = false; + mHasAutoAcceptListEntry = false; + mNameResolved = false; + mInVivoxBuddies = false; + mInSLFriends = false; + mNeedsNameUpdate = false; +} + +void LLVivoxVoiceClient::processBuddyListEntry(const std::string &uri, const std::string &displayName) +{ + buddyListEntry *buddy = addBuddy(uri, displayName); + buddy->mInVivoxBuddies = true; +} + +LLVivoxVoiceClient::buddyListEntry *LLVivoxVoiceClient::addBuddy(const std::string &uri) +{ + std::string empty; + buddyListEntry *buddy = addBuddy(uri, empty); + if(buddy->mDisplayName.empty()) + { + buddy->mNameResolved = false; + } + return buddy; +} + +LLVivoxVoiceClient::buddyListEntry *LLVivoxVoiceClient::addBuddy(const std::string &uri, const std::string &displayName) +{ + buddyListEntry *result = NULL; + buddyListMap::iterator iter = mBuddyListMap.find(uri); + + if(iter != mBuddyListMap.end()) + { + // Found a matching buddy already in the map. + LL_DEBUGS("Voice") << "adding existing buddy " << uri << LL_ENDL; + result = iter->second; + } + + if(!result) + { + // participant isn't already in one list or the other. + LL_DEBUGS("Voice") << "adding new buddy " << uri << LL_ENDL; + result = new buddyListEntry(uri); + result->mDisplayName = displayName; + + if(IDFromName(uri, result->mUUID)) + { + // Extracted UUID from name successfully. + } + else + { + LL_DEBUGS("Voice") << "Couldn't find ID for buddy " << uri << " (\"" << displayName << "\")" << LL_ENDL; + } + + mBuddyListMap.insert(buddyListMap::value_type(result->mURI, result)); + } + + return result; +} + +LLVivoxVoiceClient::buddyListEntry *LLVivoxVoiceClient::findBuddy(const std::string &uri) +{ + buddyListEntry *result = NULL; + buddyListMap::iterator iter = mBuddyListMap.find(uri); + if(iter != mBuddyListMap.end()) + { + result = iter->second; + } + + return result; +} + +LLVivoxVoiceClient::buddyListEntry *LLVivoxVoiceClient::findBuddy(const LLUUID &id) +{ + buddyListEntry *result = NULL; + buddyListMap::iterator iter; + + for(iter = mBuddyListMap.begin(); iter != mBuddyListMap.end(); iter++) + { + if(iter->second->mUUID == id) + { + result = iter->second; + break; + } + } + + return result; +} + +LLVivoxVoiceClient::buddyListEntry *LLVivoxVoiceClient::findBuddyByDisplayName(const std::string &name) +{ + buddyListEntry *result = NULL; + buddyListMap::iterator iter; + + for(iter = mBuddyListMap.begin(); iter != mBuddyListMap.end(); iter++) + { + if(iter->second->mDisplayName == name) + { + result = iter->second; + break; + } + } + + return result; +} + +void LLVivoxVoiceClient::deleteBuddy(const std::string &uri) +{ + buddyListMap::iterator iter = mBuddyListMap.find(uri); + if(iter != mBuddyListMap.end()) + { + LL_DEBUGS("Voice") << "deleting buddy " << uri << LL_ENDL; + buddyListEntry *buddy = iter->second; + mBuddyListMap.erase(iter); + delete buddy; + } + else + { + LL_DEBUGS("Voice") << "attempt to delete nonexistent buddy " << uri << LL_ENDL; + } + +} + +void LLVivoxVoiceClient::deleteAllBuddies(void) +{ + while(!mBuddyListMap.empty()) + { + deleteBuddy(mBuddyListMap.begin()->first); + } + + // Don't want to correlate with friends list when we've emptied the buddy list. + mBuddyListMapPopulated = false; + + // Don't want to correlate with friends list when we've reset the block rules. + mBlockRulesListReceived = false; + mAutoAcceptRulesListReceived = false; +} + +void LLVivoxVoiceClient::deleteAllBlockRules(void) +{ + // Clear the block list entry flags from all local buddy list entries + buddyListMap::iterator buddy_it; + for(buddy_it = mBuddyListMap.begin(); buddy_it != mBuddyListMap.end(); buddy_it++) + { + buddy_it->second->mHasBlockListEntry = false; + } +} + +void LLVivoxVoiceClient::deleteAllAutoAcceptRules(void) +{ + // Clear the auto-accept list entry flags from all local buddy list entries + buddyListMap::iterator buddy_it; + for(buddy_it = mBuddyListMap.begin(); buddy_it != mBuddyListMap.end(); buddy_it++) + { + buddy_it->second->mHasAutoAcceptListEntry = false; + } +} + +void LLVivoxVoiceClient::addBlockRule(const std::string &blockMask, const std::string &presenceOnly) +{ + buddyListEntry *buddy = NULL; + + // blockMask is the SIP URI of a friends list entry + buddyListMap::iterator iter = mBuddyListMap.find(blockMask); + if(iter != mBuddyListMap.end()) + { + LL_DEBUGS("Voice") << "block list entry for " << blockMask << LL_ENDL; + buddy = iter->second; + } + + if(buddy == NULL) + { + LL_DEBUGS("Voice") << "block list entry for unknown buddy " << blockMask << LL_ENDL; + buddy = addBuddy(blockMask); + } + + if(buddy != NULL) + { + buddy->mHasBlockListEntry = true; + } +} + +void LLVivoxVoiceClient::addAutoAcceptRule(const std::string &autoAcceptMask, const std::string &autoAddAsBuddy) +{ + buddyListEntry *buddy = NULL; + + // blockMask is the SIP URI of a friends list entry + buddyListMap::iterator iter = mBuddyListMap.find(autoAcceptMask); + if(iter != mBuddyListMap.end()) + { + LL_DEBUGS("Voice") << "auto-accept list entry for " << autoAcceptMask << LL_ENDL; + buddy = iter->second; + } + + if(buddy == NULL) + { + LL_DEBUGS("Voice") << "auto-accept list entry for unknown buddy " << autoAcceptMask << LL_ENDL; + buddy = addBuddy(autoAcceptMask); + } + + if(buddy != NULL) + { + buddy->mHasAutoAcceptListEntry = true; + } +} + +void LLVivoxVoiceClient::accountListBlockRulesResponse(int statusCode, const std::string &statusString) +{ + // Block list entries were updated via addBlockRule() during parsing. Just flag that we're done. + mBlockRulesListReceived = true; +} + +void LLVivoxVoiceClient::accountListAutoAcceptRulesResponse(int statusCode, const std::string &statusString) +{ + // Block list entries were updated via addBlockRule() during parsing. Just flag that we're done. + mAutoAcceptRulesListReceived = true; +} + +void LLVivoxVoiceClient::addObserver(LLVoiceClientParticipantObserver* observer) +{ + mParticipantObservers.insert(observer); +} + +void LLVivoxVoiceClient::removeObserver(LLVoiceClientParticipantObserver* observer) +{ + mParticipantObservers.erase(observer); +} + +void LLVivoxVoiceClient::notifyParticipantObservers() +{ + for (observer_set_t::iterator it = mParticipantObservers.begin(); + it != mParticipantObservers.end(); + ) + { + LLVoiceClientParticipantObserver* observer = *it; + observer->onParticipantsChanged(); + // In case onParticipantsChanged() deleted an entry. + it = mParticipantObservers.upper_bound(observer); + } +} + +void LLVivoxVoiceClient::addObserver(LLVoiceClientStatusObserver* observer) +{ + mStatusObservers.insert(observer); +} + +void LLVivoxVoiceClient::removeObserver(LLVoiceClientStatusObserver* observer) +{ + mStatusObservers.erase(observer); +} + +void LLVivoxVoiceClient::notifyStatusObservers(LLVoiceClientStatusObserver::EStatusType status) +{ + if(mAudioSession) + { + if(status == LLVoiceClientStatusObserver::ERROR_UNKNOWN) + { + switch(mAudioSession->mErrorStatusCode) + { + case 20713: status = LLVoiceClientStatusObserver::ERROR_CHANNEL_FULL; break; + case 20714: status = LLVoiceClientStatusObserver::ERROR_CHANNEL_LOCKED; break; + case 20715: + //invalid channel, we may be using a set of poorly cached + //info + status = LLVoiceClientStatusObserver::ERROR_NOT_AVAILABLE; + break; + case 1009: + //invalid username and password + status = LLVoiceClientStatusObserver::ERROR_NOT_AVAILABLE; + break; + } + + // Reset the error code to make sure it won't be reused later by accident. + mAudioSession->mErrorStatusCode = 0; + } + else if(status == LLVoiceClientStatusObserver::STATUS_LEFT_CHANNEL) + { + switch(mAudioSession->mErrorStatusCode) + { + case 404: // NOT_FOUND + case 480: // TEMPORARILY_UNAVAILABLE + case 408: // REQUEST_TIMEOUT + // call failed because other user was not available + // treat this as an error case + status = LLVoiceClientStatusObserver::ERROR_NOT_AVAILABLE; + + // Reset the error code to make sure it won't be reused later by accident. + mAudioSession->mErrorStatusCode = 0; + break; + } + } + } + + LL_DEBUGS("Voice") + << " " << LLVoiceClientStatusObserver::status2string(status) + << ", session URI " << getAudioSessionURI() + << (inSpatialChannel()?", proximal is true":", proximal is false") + << LL_ENDL; + + for (status_observer_set_t::iterator it = mStatusObservers.begin(); + it != mStatusObservers.end(); + ) + { + LLVoiceClientStatusObserver* observer = *it; + observer->onChange(status, getAudioSessionURI(), inSpatialChannel()); + // In case onError() deleted an entry. + it = mStatusObservers.upper_bound(observer); + } + +} + +void LLVivoxVoiceClient::addObserver(LLFriendObserver* observer) +{ + mFriendObservers.insert(observer); +} + +void LLVivoxVoiceClient::removeObserver(LLFriendObserver* observer) +{ + mFriendObservers.erase(observer); +} + +void LLVivoxVoiceClient::notifyFriendObservers() +{ + for (friend_observer_set_t::iterator it = mFriendObservers.begin(); + it != mFriendObservers.end(); + ) + { + LLFriendObserver* observer = *it; + it++; + // The only friend-related thing we notify on is online/offline transitions. + observer->changed(LLFriendObserver::ONLINE); + } +} + +void LLVivoxVoiceClient::lookupName(const LLUUID &id) +{ + BOOL is_group = FALSE; + gCacheName->get(id, is_group, &LLVivoxVoiceClient::onAvatarNameLookup); +} + +//static +void LLVivoxVoiceClient::onAvatarNameLookup(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group) +{ + std::string name = llformat("%s %s", first.c_str(), last.c_str()); + LLVivoxVoiceClient::getInstance()->avatarNameResolved(id, name); + +} + +void LLVivoxVoiceClient::avatarNameResolved(const LLUUID &id, const std::string &name) +{ + // If the avatar whose name just resolved is on our friends list, resync the friends list. + if(LLAvatarTracker::instance().getBuddyInfo(id) != NULL) + { + mFriendsListDirty = true; + } + // Iterate over all sessions. + for(sessionIterator iter = sessionsBegin(); iter != sessionsEnd(); iter++) + { + sessionState *session = *iter; + // Check for this user as a participant in this session + participantState *participant = session->findParticipantByID(id); + if(participant) + { + // Found -- fill in the name + participant->mAccountName = name; + // and post a "participants updated" message to listeners later. + session->mParticipantsChanged = true; + } + + // Check whether this is a p2p session whose caller name just resolved + if(session->mCallerID == id) + { + // this session's "caller ID" just resolved. Fill in the name. + session->mName = name; + if(session->mTextInvitePending) + { + session->mTextInvitePending = false; + + // We don't need to call gIMMgr->addP2PSession() here. The first incoming message will create the panel. + } + if(session->mVoiceInvitePending) + { + session->mVoiceInvitePending = false; + + gIMMgr->inviteToSession( + session->mIMSessionID, + session->mName, + session->mCallerID, + session->mName, + IM_SESSION_P2P_INVITE, + LLIMMgr::INVITATION_TYPE_VOICE, + session->mHandle, + session->mSIPURI); + } + + } + } +} + +bool LLVivoxVoiceClient::setVoiceEffect(const LLUUID& id) +{ + if (!mAudioSession) + { + return false; + } + + if (!id.isNull()) + { + if (mVoiceFontMap.empty()) + { + LL_DEBUGS("Voice") << "Voice fonts not available." << LL_ENDL; + return false; + } + else if (mVoiceFontMap.find(id) == mVoiceFontMap.end()) + { + LL_DEBUGS("Voice") << "Invalid voice font " << id << LL_ENDL; + return false; + } + } + + // *TODO: Check for expired fonts? + mAudioSession->mVoiceFontID = id; + + // *TODO: Separate voice font defaults for spatial chat and IM? + gSavedPerAccountSettings.setString("VoiceEffectDefault", id.asString()); + + sessionSetVoiceFontSendMessage(mAudioSession); + notifyVoiceFontObservers(); + + return true; +} + +const LLUUID LLVivoxVoiceClient::getVoiceEffect() +{ + return mAudioSession ? mAudioSession->mVoiceFontID : LLUUID::null; +} + +LLSD LLVivoxVoiceClient::getVoiceEffectProperties(const LLUUID& id) +{ + LLSD sd; + + voice_font_map_t::iterator iter = mVoiceFontMap.find(id); + if (iter != mVoiceFontMap.end()) + { + sd["template_only"] = false; + } + else + { + // Voice effect is not in the voice font map, see if there is a template + iter = mVoiceFontTemplateMap.find(id); + if (iter == mVoiceFontTemplateMap.end()) + { + LL_WARNS("Voice") << "Voice effect " << id << "not found." << LL_ENDL; + return sd; + } + sd["template_only"] = true; + } + + voiceFontEntry *font = iter->second; + sd["name"] = font->mName; + sd["expiry_date"] = font->mExpirationDate; + sd["is_new"] = font->mIsNew; + + return sd; +} + +LLVivoxVoiceClient::voiceFontEntry::voiceFontEntry(LLUUID& id) : + mID(id), + mFontIndex(0), + mFontType(VOICE_FONT_TYPE_NONE), + mFontStatus(VOICE_FONT_STATUS_NONE), + mIsNew(false) +{ + mExpiryTimer.stop(); + mExpiryWarningTimer.stop(); +} + +LLVivoxVoiceClient::voiceFontEntry::~voiceFontEntry() +{ +} + +void LLVivoxVoiceClient::refreshVoiceEffectLists(bool clear_lists) +{ + if (clear_lists) + { + mVoiceFontsReceived = false; + deleteAllVoiceFonts(); + deleteVoiceFontTemplates(); + } + + accountGetSessionFontsSendMessage(); + accountGetTemplateFontsSendMessage(); +} + +const voice_effect_list_t& LLVivoxVoiceClient::getVoiceEffectList() const +{ + return mVoiceFontList; +} + +const voice_effect_list_t& LLVivoxVoiceClient::getVoiceEffectTemplateList() const +{ + return mVoiceFontTemplateList; +} + +void LLVivoxVoiceClient::addVoiceFont(const S32 font_index, + const std::string &name, + const std::string &description, + const LLDate &expiration_date, + bool has_expired, + const S32 font_type, + const S32 font_status, + const bool template_font) +{ + // Vivox SessionFontIDs are not guaranteed to remain the same between + // sessions or grids so use a UUID for the name. + + // If received name is not a UUID, fudge one by hashing the name and type. + LLUUID font_id; + if (LLUUID::validate(name)) + { + font_id = LLUUID(name); + } + else + { + font_id.generate(STRINGIZE(font_type << ":" << name)); + } + + voiceFontEntry *font = NULL; + + voice_font_map_t& font_map = template_font ? mVoiceFontTemplateMap : mVoiceFontMap; + voice_effect_list_t& font_list = template_font ? mVoiceFontTemplateList : mVoiceFontList; + + // Check whether we've seen this font before. + voice_font_map_t::iterator iter = font_map.find(font_id); + bool new_font = (iter == font_map.end()); + + // Override the has_expired flag if we have passed the expiration_date as a double check. + if (expiration_date.secondsSinceEpoch() < (LLDate::now().secondsSinceEpoch() + VOICE_FONT_EXPIRY_INTERVAL)) + { + has_expired = true; + } + + if (has_expired) + { + LL_DEBUGS("Voice") << "Expired " << (template_font ? "Template " : "") + << expiration_date.asString() << " " << font_id + << " (" << font_index << ") " << name << LL_ENDL; + + // Remove existing session fonts that have expired since we last saw them. + if (!new_font && !template_font) + { + deleteVoiceFont(font_id); + } + return; + } + + if (new_font) + { + // If it is a new font create a new entry. + font = new voiceFontEntry(font_id); + } + else + { + // Not a new font, update the existing entry + font = iter->second; + } + + if (font) + { + font->mFontIndex = font_index; + // Use the description for the human readable name if available, as the + // "name" may be a UUID. + font->mName = description.empty() ? name : description; + font->mFontType = font_type; + font->mFontStatus = font_status; + + // If the font is new or the expiration date has changed the expiry timers need updating. + if (!template_font && (new_font || font->mExpirationDate != expiration_date)) + { + font->mExpirationDate = expiration_date; + + // Set the expiry timer to trigger a notification when the voice font can no longer be used. + font->mExpiryTimer.start(); + font->mExpiryTimer.setExpiryAt(expiration_date.secondsSinceEpoch() - VOICE_FONT_EXPIRY_INTERVAL); + + // Set the warning timer to some interval before actual expiry. + S32 warning_time = gSavedSettings.getS32("VoiceEffectExpiryWarningTime"); + if (warning_time != 0) + { + font->mExpiryWarningTimer.start(); + F64 expiry_time = (expiration_date.secondsSinceEpoch() - (F64)warning_time); + font->mExpiryWarningTimer.setExpiryAt(expiry_time - VOICE_FONT_EXPIRY_INTERVAL); + } + else + { + // Disable the warning timer. + font->mExpiryWarningTimer.stop(); + } + + // Only flag new session fonts after the first time we have fetched the list. + if (mVoiceFontsReceived) + { + font->mIsNew = true; + mVoiceFontsNew = true; + } + } + + LL_DEBUGS("Voice") << (template_font ? "Template " : "") + << font->mExpirationDate.asString() << " " << font->mID + << " (" << font->mFontIndex << ") " << name << LL_ENDL; + + if (new_font) + { + font_map.insert(voice_font_map_t::value_type(font->mID, font)); + font_list.insert(voice_effect_list_t::value_type(font->mName, font->mID)); + } + + mVoiceFontListDirty = true; + + // Debugging stuff + + if (font_type < VOICE_FONT_TYPE_NONE || font_type >= VOICE_FONT_TYPE_UNKNOWN) + { + LL_DEBUGS("Voice") << "Unknown voice font type: " << font_type << LL_ENDL; + } + if (font_status < VOICE_FONT_STATUS_NONE || font_status >= VOICE_FONT_STATUS_UNKNOWN) + { + LL_DEBUGS("Voice") << "Unknown voice font status: " << font_status << LL_ENDL; + } + } +} + +void LLVivoxVoiceClient::expireVoiceFonts() +{ + // *TODO: If we are selling voice fonts in packs, there are probably + // going to be a number of fonts with the same expiration time, so would + // be more efficient to just keep a list of expiration times rather + // than checking each font individually. + + bool have_expired = false; + bool will_expire = false; + bool expired_in_use = false; + + LLUUID current_effect = LLVoiceClient::instance().getVoiceEffectDefault(); + + voice_font_map_t::iterator iter; + for (iter = mVoiceFontMap.begin(); iter != mVoiceFontMap.end(); ++iter) + { + voiceFontEntry* voice_font = iter->second; + LLFrameTimer& expiry_timer = voice_font->mExpiryTimer; + LLFrameTimer& warning_timer = voice_font->mExpiryWarningTimer; + + // Check for expired voice fonts + if (expiry_timer.getStarted() && expiry_timer.hasExpired()) + { + // Check whether it is the active voice font + if (voice_font->mID == current_effect) + { + // Reset to no voice effect. + setVoiceEffect(LLUUID::null); + expired_in_use = true; + } + + LL_DEBUGS("Voice") << "Voice Font " << voice_font->mName << " has expired." << LL_ENDL; + deleteVoiceFont(voice_font->mID); + have_expired = true; + } + + // Check for voice fonts that will expire in less that the warning time + if (warning_timer.getStarted() && warning_timer.hasExpired()) + { + LL_DEBUGS("Voice") << "Voice Font " << voice_font->mName << " will expire soon." << LL_ENDL; + will_expire = true; + warning_timer.stop(); + } + } + + LLSD args; + args["URL"] = LLTrans::getString("voice_morphing_url"); + + // Give a notification if any voice fonts have expired. + if (have_expired) + { + if (expired_in_use) + { + LLNotificationsUtil::add("VoiceEffectsExpiredInUse", args); + } + else + { + LLNotificationsUtil::add("VoiceEffectsExpired", args); + } + + // Refresh voice font lists in the UI. + notifyVoiceFontObservers(); + } + + // Give a warning notification if any voice fonts are due to expire. + if (will_expire) + { + S32 seconds = gSavedSettings.getS32("VoiceEffectExpiryWarningTime"); + args["INTERVAL"] = llformat("%d", seconds / SEC_PER_DAY); + + LLNotificationsUtil::add("VoiceEffectsWillExpire", args); + } +} + +void LLVivoxVoiceClient::deleteVoiceFont(const LLUUID& id) +{ + // Remove the entry from the voice font list. + voice_effect_list_t::iterator list_iter = mVoiceFontList.begin(); + while (list_iter != mVoiceFontList.end()) + { + if (list_iter->second == id) + { + LL_DEBUGS("Voice") << "Removing " << id << " from the voice font list." << LL_ENDL; + mVoiceFontList.erase(list_iter++); + mVoiceFontListDirty = true; + } + else + { + ++list_iter; + } + } + + // Find the entry in the voice font map and erase its data. + voice_font_map_t::iterator map_iter = mVoiceFontMap.find(id); + if (map_iter != mVoiceFontMap.end()) + { + delete map_iter->second; + } + + // Remove the entry from the voice font map. + mVoiceFontMap.erase(map_iter); +} + +void LLVivoxVoiceClient::deleteAllVoiceFonts() +{ + mVoiceFontList.clear(); + + voice_font_map_t::iterator iter; + for (iter = mVoiceFontMap.begin(); iter != mVoiceFontMap.end(); ++iter) + { + delete iter->second; + } + mVoiceFontMap.clear(); +} + +void LLVivoxVoiceClient::deleteVoiceFontTemplates() +{ + mVoiceFontTemplateList.clear(); + + voice_font_map_t::iterator iter; + for (iter = mVoiceFontTemplateMap.begin(); iter != mVoiceFontTemplateMap.end(); ++iter) + { + delete iter->second; + } + mVoiceFontTemplateMap.clear(); +} + +S32 LLVivoxVoiceClient::getVoiceFontIndex(const LLUUID& id) const +{ + S32 result = 0; + if (!id.isNull()) + { + voice_font_map_t::const_iterator it = mVoiceFontMap.find(id); + if (it != mVoiceFontMap.end()) + { + result = it->second->mFontIndex; + } + else + { + LL_DEBUGS("Voice") << "Selected voice font " << id << " is not available." << LL_ENDL; + } + } + return result; +} + +S32 LLVivoxVoiceClient::getVoiceFontTemplateIndex(const LLUUID& id) const +{ + S32 result = 0; + if (!id.isNull()) + { + voice_font_map_t::const_iterator it = mVoiceFontTemplateMap.find(id); + if (it != mVoiceFontTemplateMap.end()) + { + result = it->second->mFontIndex; + } + else + { + LL_DEBUGS("Voice") << "Selected voice font template " << id << " is not available." << LL_ENDL; + } + } + return result; +} + +void LLVivoxVoiceClient::accountGetSessionFontsSendMessage() +{ + if(!mAccountHandle.empty()) + { + std::ostringstream stream; + + LL_DEBUGS("Voice") << "Requesting voice font list." << LL_ENDL; + + stream + << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.GetSessionFonts.1\">" + << "<AccountHandle>" << mAccountHandle << "</AccountHandle>" + << "</Request>" + << "\n\n\n"; + + writeString(stream.str()); + } +} + +void LLVivoxVoiceClient::accountGetTemplateFontsSendMessage() +{ + if(!mAccountHandle.empty()) + { + std::ostringstream stream; + + LL_DEBUGS("Voice") << "Requesting voice font template list." << LL_ENDL; + + stream + << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.GetTemplateFonts.1\">" + << "<AccountHandle>" << mAccountHandle << "</AccountHandle>" + << "</Request>" + << "\n\n\n"; + + writeString(stream.str()); + } +} + +void LLVivoxVoiceClient::sessionSetVoiceFontSendMessage(sessionState *session) +{ + S32 font_index = getVoiceFontIndex(session->mVoiceFontID); + LL_DEBUGS("Voice") << "Requesting voice font: " << session->mVoiceFontID << " (" << font_index << "), session handle: " << session->mHandle << LL_ENDL; + + std::ostringstream stream; + + stream + << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Session.SetVoiceFont.1\">" + << "<SessionHandle>" << session->mHandle << "</SessionHandle>" + << "<SessionFontID>" << font_index << "</SessionFontID>" + << "</Request>\n\n\n"; + + writeString(stream.str()); +} + +void LLVivoxVoiceClient::accountGetSessionFontsResponse(int statusCode, const std::string &statusString) +{ + // Voice font list entries were updated via addVoiceFont() during parsing. + if(getState() == stateVoiceFontsWait) + { + setState(stateVoiceFontsReceived); + } + + notifyVoiceFontObservers(); + mVoiceFontsReceived = true; +} + +void LLVivoxVoiceClient::accountGetTemplateFontsResponse(int statusCode, const std::string &statusString) +{ + // Voice font list entries were updated via addVoiceFont() during parsing. + notifyVoiceFontObservers(); +} +void LLVivoxVoiceClient::addObserver(LLVoiceEffectObserver* observer) +{ + mVoiceFontObservers.insert(observer); +} + +void LLVivoxVoiceClient::removeObserver(LLVoiceEffectObserver* observer) +{ + mVoiceFontObservers.erase(observer); +} + +void LLVivoxVoiceClient::notifyVoiceFontObservers() +{ + LL_DEBUGS("Voice") << "Notifying voice effect observers. Lists changed: " << mVoiceFontListDirty << LL_ENDL; + + for (voice_font_observer_set_t::iterator it = mVoiceFontObservers.begin(); + it != mVoiceFontObservers.end(); + ) + { + LLVoiceEffectObserver* observer = *it; + observer->onVoiceEffectChanged(mVoiceFontListDirty); + // In case onVoiceEffectChanged() deleted an entry. + it = mVoiceFontObservers.upper_bound(observer); + } + mVoiceFontListDirty = false; + + // If new Voice Fonts have been added notify the user. + if (mVoiceFontsNew) + { + if(mVoiceFontsReceived) + { + LLNotificationsUtil::add("VoiceEffectsNew"); + } + mVoiceFontsNew = false; + } +} + +void LLVivoxVoiceClient::enablePreviewBuffer(bool enable) +{ + mCaptureBufferMode = enable; + if(mCaptureBufferMode && getState() >= stateNoChannel) + { + LL_DEBUGS("Voice") << "no channel" << LL_ENDL; + sessionTerminate(); + } +} + +void LLVivoxVoiceClient::recordPreviewBuffer() +{ + if (!mCaptureBufferMode) + { + LL_DEBUGS("Voice") << "Not in voice effect preview mode, cannot start recording." << LL_ENDL; + mCaptureBufferRecording = false; + return; + } + + mCaptureBufferRecording = true; +} + +void LLVivoxVoiceClient::playPreviewBuffer(const LLUUID& effect_id) +{ + if (!mCaptureBufferMode) + { + LL_DEBUGS("Voice") << "Not in voice effect preview mode, no buffer to play." << LL_ENDL; + mCaptureBufferRecording = false; + return; + } + + if (!mCaptureBufferRecorded) + { + // Can't play until we have something recorded! + mCaptureBufferPlaying = false; + return; + } + + mPreviewVoiceFont = effect_id; + mCaptureBufferPlaying = true; +} + +void LLVivoxVoiceClient::stopPreviewBuffer() +{ + mCaptureBufferRecording = false; + mCaptureBufferPlaying = false; +} + +bool LLVivoxVoiceClient::isPreviewRecording() +{ + return (mCaptureBufferMode && mCaptureBufferRecording); +} + +bool LLVivoxVoiceClient::isPreviewPlaying() +{ + return (mCaptureBufferMode && mCaptureBufferPlaying); +} + +void LLVivoxVoiceClient::captureBufferRecordStartSendMessage() +{ if(!mAccountHandle.empty()) + { + std::ostringstream stream; + + LL_DEBUGS("Voice") << "Starting audio capture to buffer." << LL_ENDL; + + // Start capture + stream + << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Aux.StartBufferCapture.1\">" + << "</Request>" + << "\n\n\n"; + + // Unmute the mic + stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Connector.MuteLocalMic.1\">" + << "<ConnectorHandle>" << mConnectorHandle << "</ConnectorHandle>" + << "<Value>false</Value>" + << "</Request>\n\n\n"; + + // Dirty the PTT state so that it will get reset when we finishing previewing + mPTTDirty = true; + + writeString(stream.str()); + } +} + +void LLVivoxVoiceClient::captureBufferRecordStopSendMessage() +{ + if(!mAccountHandle.empty()) + { + std::ostringstream stream; + + LL_DEBUGS("Voice") << "Stopping audio capture to buffer." << LL_ENDL; + + // Mute the mic. PTT state was dirtied at recording start, so will be reset when finished previewing. + stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Connector.MuteLocalMic.1\">" + << "<ConnectorHandle>" << mConnectorHandle << "</ConnectorHandle>" + << "<Value>true</Value>" + << "</Request>\n\n\n"; + + // Stop capture + stream + << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Aux.CaptureAudioStop.1\">" + << "<AccountHandle>" << mAccountHandle << "</AccountHandle>" + << "</Request>" + << "\n\n\n"; + + writeString(stream.str()); + } +} + +void LLVivoxVoiceClient::captureBufferPlayStartSendMessage(const LLUUID& voice_font_id) +{ + if(!mAccountHandle.empty()) + { + // Track how may play requests are sent, so we know how many stop events to + // expect before play actually stops. + ++mPlayRequestCount; + + std::ostringstream stream; + + LL_DEBUGS("Voice") << "Starting audio buffer playback." << LL_ENDL; + + S32 font_index = getVoiceFontTemplateIndex(voice_font_id); + LL_DEBUGS("Voice") << "With voice font: " << voice_font_id << " (" << font_index << ")" << LL_ENDL; + + stream + << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Aux.PlayAudioBuffer.1\">" + << "<AccountHandle>" << mAccountHandle << "</AccountHandle>" + << "<TemplateFontID>" << font_index << "</TemplateFontID>" + << "<FontDelta />" + << "</Request>" + << "\n\n\n"; + + writeString(stream.str()); + } +} + +void LLVivoxVoiceClient::captureBufferPlayStopSendMessage() +{ + if(!mAccountHandle.empty()) + { + std::ostringstream stream; + + LL_DEBUGS("Voice") << "Stopping audio buffer playback." << LL_ENDL; + + stream + << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Aux.RenderAudioStop.1\">" + << "<AccountHandle>" << mAccountHandle << "</AccountHandle>" + << "</Request>" + << "\n\n\n"; + + writeString(stream.str()); + } +} + +LLVivoxProtocolParser::LLVivoxProtocolParser() +{ + parser = NULL; + parser = XML_ParserCreate(NULL); + + reset(); +} + +void LLVivoxProtocolParser::reset() +{ + responseDepth = 0; + ignoringTags = false; + accumulateText = false; + energy = 0.f; + hasText = false; + hasAudio = false; + hasVideo = false; + terminated = false; + ignoreDepth = 0; + isChannel = false; + incoming = false; + enabled = false; + isEvent = false; + isLocallyMuted = false; + isModeratorMuted = false; + isSpeaking = false; + participantType = 0; + squelchDebugOutput = false; + returnCode = -1; + state = 0; + statusCode = 0; + volume = 0; + textBuffer.clear(); + alias.clear(); + numberOfAliases = 0; + applicationString.clear(); +} + +//virtual +LLVivoxProtocolParser::~LLVivoxProtocolParser() +{ + if (parser) + XML_ParserFree(parser); +} + +// virtual +LLIOPipe::EStatus LLVivoxProtocolParser::process_impl( + const LLChannelDescriptors& channels, + buffer_ptr_t& buffer, + bool& eos, + LLSD& context, + LLPumpIO* pump) +{ + LLBufferStream istr(channels, buffer.get()); + std::ostringstream ostr; + while (istr.good()) + { + char buf[1024]; + istr.read(buf, sizeof(buf)); + mInput.append(buf, istr.gcount()); + } + + // Look for input delimiter(s) in the input buffer. If one is found, send the message to the xml parser. + int start = 0; + int delim; + while((delim = mInput.find("\n\n\n", start)) != std::string::npos) + { + + // Reset internal state of the LLVivoxProtocolParser (no effect on the expat parser) + reset(); + + XML_ParserReset(parser, NULL); + XML_SetElementHandler(parser, ExpatStartTag, ExpatEndTag); + XML_SetCharacterDataHandler(parser, ExpatCharHandler); + XML_SetUserData(parser, this); + XML_Parse(parser, mInput.data() + start, delim - start, false); + + // If this message isn't set to be squelched, output the raw XML received. + if(!squelchDebugOutput) + { + LL_DEBUGS("Voice") << "parsing: " << mInput.substr(start, delim - start) << LL_ENDL; + } + + start = delim + 3; + } + + if(start != 0) + mInput = mInput.substr(start); + + LL_DEBUGS("VivoxProtocolParser") << "at end, mInput is: " << mInput << LL_ENDL; + + if(!LLVivoxVoiceClient::getInstance()->mConnected) + { + // If voice has been disabled, we just want to close the socket. This does so. + LL_INFOS("Voice") << "returning STATUS_STOP" << LL_ENDL; + return STATUS_STOP; + } + + return STATUS_OK; +} + +void XMLCALL LLVivoxProtocolParser::ExpatStartTag(void *data, const char *el, const char **attr) +{ + if (data) + { + LLVivoxProtocolParser *object = (LLVivoxProtocolParser*)data; + object->StartTag(el, attr); + } +} + +// -------------------------------------------------------------------------------- + +void XMLCALL LLVivoxProtocolParser::ExpatEndTag(void *data, const char *el) +{ + if (data) + { + LLVivoxProtocolParser *object = (LLVivoxProtocolParser*)data; + object->EndTag(el); + } +} + +// -------------------------------------------------------------------------------- + +void XMLCALL LLVivoxProtocolParser::ExpatCharHandler(void *data, const XML_Char *s, int len) +{ + if (data) + { + LLVivoxProtocolParser *object = (LLVivoxProtocolParser*)data; + object->CharData(s, len); + } +} + +// -------------------------------------------------------------------------------- + + +void LLVivoxProtocolParser::StartTag(const char *tag, const char **attr) +{ + // Reset the text accumulator. We shouldn't have strings that are inturrupted by new tags + textBuffer.clear(); + // only accumulate text if we're not ignoring tags. + accumulateText = !ignoringTags; + + if (responseDepth == 0) + { + isEvent = !stricmp("Event", tag); + + if (!stricmp("Response", tag) || isEvent) + { + // Grab the attributes + while (*attr) + { + const char *key = *attr++; + const char *value = *attr++; + + if (!stricmp("requestId", key)) + { + requestId = value; + } + else if (!stricmp("action", key)) + { + actionString = value; + } + else if (!stricmp("type", key)) + { + eventTypeString = value; + } + } + } + LL_DEBUGS("VivoxProtocolParser") << tag << " (" << responseDepth << ")" << LL_ENDL; + } + else + { + if (ignoringTags) + { + LL_DEBUGS("VivoxProtocolParser") << "ignoring tag " << tag << " (depth = " << responseDepth << ")" << LL_ENDL; + } + else + { + LL_DEBUGS("VivoxProtocolParser") << tag << " (" << responseDepth << ")" << LL_ENDL; + + // Ignore the InputXml stuff so we don't get confused + if (!stricmp("InputXml", tag)) + { + ignoringTags = true; + ignoreDepth = responseDepth; + accumulateText = false; + + LL_DEBUGS("VivoxProtocolParser") << "starting ignore, ignoreDepth is " << ignoreDepth << LL_ENDL; + } + else if (!stricmp("CaptureDevices", tag)) + { + LLVivoxVoiceClient::getInstance()->clearCaptureDevices(); + } + else if (!stricmp("RenderDevices", tag)) + { + LLVivoxVoiceClient::getInstance()->clearRenderDevices(); + } + else if (!stricmp("CaptureDevice", tag)) + { + deviceString.clear(); + } + else if (!stricmp("RenderDevice", tag)) + { + deviceString.clear(); + } + else if (!stricmp("Buddies", tag)) + { + LLVivoxVoiceClient::getInstance()->deleteAllBuddies(); + } + else if (!stricmp("BlockRules", tag)) + { + LLVivoxVoiceClient::getInstance()->deleteAllBlockRules(); + } + else if (!stricmp("AutoAcceptRules", tag)) + { + LLVivoxVoiceClient::getInstance()->deleteAllAutoAcceptRules(); + } + else if (!stricmp("SessionFont", tag)) + { + id = 0; + nameString.clear(); + descriptionString.clear(); + expirationDate = LLDate(); + hasExpired = false; + fontType = 0; + fontStatus = 0; + } + else if (!stricmp("TemplateFont", tag)) + { + id = 0; + nameString.clear(); + descriptionString.clear(); + expirationDate = LLDate(); + hasExpired = false; + fontType = 0; + fontStatus = 0; + } + else if (!stricmp("MediaCompletionType", tag)) + { + mediaCompletionType.clear(); + } + } + } + responseDepth++; +} + +// -------------------------------------------------------------------------------- + +void LLVivoxProtocolParser::EndTag(const char *tag) +{ + const std::string& string = textBuffer; + + responseDepth--; + + if (ignoringTags) + { + if (ignoreDepth == responseDepth) + { + LL_DEBUGS("VivoxProtocolParser") << "end of ignore" << LL_ENDL; + ignoringTags = false; + } + else + { + LL_DEBUGS("VivoxProtocolParser") << "ignoring tag " << tag << " (depth = " << responseDepth << ")" << LL_ENDL; + } + } + + if (!ignoringTags) + { + LL_DEBUGS("VivoxProtocolParser") << "processing tag " << tag << " (depth = " << responseDepth << ")" << LL_ENDL; + + // Closing a tag. Finalize the text we've accumulated and reset + if (!stricmp("ReturnCode", tag)) + returnCode = strtol(string.c_str(), NULL, 10); + else if (!stricmp("SessionHandle", tag)) + sessionHandle = string; + else if (!stricmp("SessionGroupHandle", tag)) + sessionGroupHandle = string; + else if (!stricmp("StatusCode", tag)) + statusCode = strtol(string.c_str(), NULL, 10); + else if (!stricmp("StatusString", tag)) + statusString = string; + else if (!stricmp("ParticipantURI", tag)) + uriString = string; + else if (!stricmp("Volume", tag)) + volume = strtol(string.c_str(), NULL, 10); + else if (!stricmp("Energy", tag)) + energy = (F32)strtod(string.c_str(), NULL); + else if (!stricmp("IsModeratorMuted", tag)) + isModeratorMuted = !stricmp(string.c_str(), "true"); + else if (!stricmp("IsSpeaking", tag)) + isSpeaking = !stricmp(string.c_str(), "true"); + else if (!stricmp("Alias", tag)) + alias = string; + else if (!stricmp("NumberOfAliases", tag)) + numberOfAliases = strtol(string.c_str(), NULL, 10); + else if (!stricmp("Application", tag)) + applicationString = string; + else if (!stricmp("ConnectorHandle", tag)) + connectorHandle = string; + else if (!stricmp("VersionID", tag)) + versionID = string; + else if (!stricmp("AccountHandle", tag)) + accountHandle = string; + else if (!stricmp("State", tag)) + state = strtol(string.c_str(), NULL, 10); + else if (!stricmp("URI", tag)) + uriString = string; + else if (!stricmp("IsChannel", tag)) + isChannel = !stricmp(string.c_str(), "true"); + else if (!stricmp("Incoming", tag)) + incoming = !stricmp(string.c_str(), "true"); + else if (!stricmp("Enabled", tag)) + enabled = !stricmp(string.c_str(), "true"); + else if (!stricmp("Name", tag)) + nameString = string; + else if (!stricmp("AudioMedia", tag)) + audioMediaString = string; + else if (!stricmp("ChannelName", tag)) + nameString = string; + else if (!stricmp("DisplayName", tag)) + displayNameString = string; + else if (!stricmp("Device", tag)) + deviceString = string; + else if (!stricmp("AccountName", tag)) + nameString = string; + else if (!stricmp("ParticipantType", tag)) + participantType = strtol(string.c_str(), NULL, 10); + else if (!stricmp("IsLocallyMuted", tag)) + isLocallyMuted = !stricmp(string.c_str(), "true"); + else if (!stricmp("MicEnergy", tag)) + energy = (F32)strtod(string.c_str(), NULL); + else if (!stricmp("ChannelName", tag)) + nameString = string; + else if (!stricmp("ChannelURI", tag)) + uriString = string; + else if (!stricmp("BuddyURI", tag)) + uriString = string; + else if (!stricmp("Presence", tag)) + statusString = string; + else if (!stricmp("CaptureDevice", tag)) + { + LLVivoxVoiceClient::getInstance()->addCaptureDevice(deviceString); + } + else if (!stricmp("RenderDevice", tag)) + { + LLVivoxVoiceClient::getInstance()->addRenderDevice(deviceString); + } + else if (!stricmp("Buddy", tag)) + { + LLVivoxVoiceClient::getInstance()->processBuddyListEntry(uriString, displayNameString); + } + else if (!stricmp("BlockRule", tag)) + { + LLVivoxVoiceClient::getInstance()->addBlockRule(blockMask, presenceOnly); + } + else if (!stricmp("BlockMask", tag)) + blockMask = string; + else if (!stricmp("PresenceOnly", tag)) + presenceOnly = string; + else if (!stricmp("AutoAcceptRule", tag)) + { + LLVivoxVoiceClient::getInstance()->addAutoAcceptRule(autoAcceptMask, autoAddAsBuddy); + } + else if (!stricmp("AutoAcceptMask", tag)) + autoAcceptMask = string; + else if (!stricmp("AutoAddAsBuddy", tag)) + autoAddAsBuddy = string; + else if (!stricmp("MessageHeader", tag)) + messageHeader = string; + else if (!stricmp("MessageBody", tag)) + messageBody = string; + else if (!stricmp("NotificationType", tag)) + notificationType = string; + else if (!stricmp("HasText", tag)) + hasText = !stricmp(string.c_str(), "true"); + else if (!stricmp("HasAudio", tag)) + hasAudio = !stricmp(string.c_str(), "true"); + else if (!stricmp("HasVideo", tag)) + hasVideo = !stricmp(string.c_str(), "true"); + else if (!stricmp("Terminated", tag)) + terminated = !stricmp(string.c_str(), "true"); + else if (!stricmp("SubscriptionHandle", tag)) + subscriptionHandle = string; + else if (!stricmp("SubscriptionType", tag)) + subscriptionType = string; + else if (!stricmp("SessionFont", tag)) + { + LLVivoxVoiceClient::getInstance()->addVoiceFont(id, nameString, descriptionString, expirationDate, hasExpired, fontType, fontStatus, false); + } + else if (!stricmp("TemplateFont", tag)) + { + LLVivoxVoiceClient::getInstance()->addVoiceFont(id, nameString, descriptionString, expirationDate, hasExpired, fontType, fontStatus, true); + } + else if (!stricmp("ID", tag)) + { + id = strtol(string.c_str(), NULL, 10); + } + else if (!stricmp("Description", tag)) + { + descriptionString = string; + } + else if (!stricmp("ExpirationDate", tag)) + { + expirationDate = expiryTimeStampToLLDate(string); + } + else if (!stricmp("Expired", tag)) + { + hasExpired = !stricmp(string.c_str(), "1"); + } + else if (!stricmp("Type", tag)) + { + fontType = strtol(string.c_str(), NULL, 10); + } + else if (!stricmp("Status", tag)) + { + fontStatus = strtol(string.c_str(), NULL, 10); + } + else if (!stricmp("MediaCompletionType", tag)) + { + mediaCompletionType = string;; + } + + textBuffer.clear(); + accumulateText= false; + + if (responseDepth == 0) + { + // We finished all of the XML, process the data + processResponse(tag); + } + } +} + +// -------------------------------------------------------------------------------- + +void LLVivoxProtocolParser::CharData(const char *buffer, int length) +{ + /* + This method is called for anything that isn't a tag, which can be text you + want that lies between tags, and a lot of stuff you don't want like file formatting + (tabs, spaces, CR/LF, etc). + + Only copy text if we are in accumulate mode... + */ + if (accumulateText) + textBuffer.append(buffer, length); +} + +// -------------------------------------------------------------------------------- + +LLDate LLVivoxProtocolParser::expiryTimeStampToLLDate(const std::string& vivox_ts) +{ + // *HACK: Vivox reports the time incorrectly. LLDate also only parses a + // subset of valid ISO 8601 dates (only handles Z, not offsets). + // So just use the date portion and fix the time here. + std::string time_stamp = vivox_ts.substr(0, 10); + time_stamp += VOICE_FONT_EXPIRY_TIME; + + LL_DEBUGS("VivoxProtocolParser") << "Vivox timestamp " << vivox_ts << " modified to: " << time_stamp << LL_ENDL; + + return LLDate(time_stamp); +} + +// -------------------------------------------------------------------------------- + +void LLVivoxProtocolParser::processResponse(std::string tag) +{ + LL_DEBUGS("VivoxProtocolParser") << tag << LL_ENDL; + + // SLIM SDK: the SDK now returns a statusCode of "200" (OK) for success. This is a change vs. previous SDKs. + // According to Mike S., "The actual API convention is that responses with return codes of 0 are successful, regardless of the status code returned", + // so I believe this will give correct behavior. + + if(returnCode == 0) + statusCode = 0; + + if (isEvent) + { + const char *eventTypeCstr = eventTypeString.c_str(); + if (!stricmp(eventTypeCstr, "AccountLoginStateChangeEvent")) + { + LLVivoxVoiceClient::getInstance()->accountLoginStateChangeEvent(accountHandle, statusCode, statusString, state); + } + else if (!stricmp(eventTypeCstr, "SessionAddedEvent")) + { + /* + <Event type="SessionAddedEvent"> + <SessionGroupHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==_sg0</SessionGroupHandle> + <SessionHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==0</SessionHandle> + <Uri>sip:confctl-1408789@bhr.vivox.com</Uri> + <IsChannel>true</IsChannel> + <Incoming>false</Incoming> + <ChannelName /> + </Event> + */ + LLVivoxVoiceClient::getInstance()->sessionAddedEvent(uriString, alias, sessionHandle, sessionGroupHandle, isChannel, incoming, nameString, applicationString); + } + else if (!stricmp(eventTypeCstr, "SessionRemovedEvent")) + { + LLVivoxVoiceClient::getInstance()->sessionRemovedEvent(sessionHandle, sessionGroupHandle); + } + else if (!stricmp(eventTypeCstr, "SessionGroupAddedEvent")) + { + LLVivoxVoiceClient::getInstance()->sessionGroupAddedEvent(sessionGroupHandle); + } + else if (!stricmp(eventTypeCstr, "MediaStreamUpdatedEvent")) + { + /* + <Event type="MediaStreamUpdatedEvent"> + <SessionGroupHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==_sg0</SessionGroupHandle> + <SessionHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==0</SessionHandle> + <StatusCode>200</StatusCode> + <StatusString>OK</StatusString> + <State>2</State> + <Incoming>false</Incoming> + </Event> + */ + LLVivoxVoiceClient::getInstance()->mediaStreamUpdatedEvent(sessionHandle, sessionGroupHandle, statusCode, statusString, state, incoming); + } + else if (!stricmp(eventTypeCstr, "MediaCompletionEvent")) + { + /* + <Event type="MediaCompletionEvent"> + <SessionGroupHandle /> + <MediaCompletionType>AuxBufferAudioCapture</MediaCompletionType> + </Event> + */ + LLVivoxVoiceClient::getInstance()->mediaCompletionEvent(sessionGroupHandle, mediaCompletionType); + } + else if (!stricmp(eventTypeCstr, "TextStreamUpdatedEvent")) + { + /* + <Event type="TextStreamUpdatedEvent"> + <SessionGroupHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==_sg1</SessionGroupHandle> + <SessionHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==1</SessionHandle> + <Enabled>true</Enabled> + <State>1</State> + <Incoming>true</Incoming> + </Event> + */ + LLVivoxVoiceClient::getInstance()->textStreamUpdatedEvent(sessionHandle, sessionGroupHandle, enabled, state, incoming); + } + else if (!stricmp(eventTypeCstr, "ParticipantAddedEvent")) + { + /* + <Event type="ParticipantAddedEvent"> + <SessionGroupHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==_sg4</SessionGroupHandle> + <SessionHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==4</SessionHandle> + <ParticipantUri>sip:xI5auBZ60SJWIk606-1JGRQ==@bhr.vivox.com</ParticipantUri> + <AccountName>xI5auBZ60SJWIk606-1JGRQ==</AccountName> + <DisplayName /> + <ParticipantType>0</ParticipantType> + </Event> + */ + LLVivoxVoiceClient::getInstance()->participantAddedEvent(sessionHandle, sessionGroupHandle, uriString, alias, nameString, displayNameString, participantType); + } + else if (!stricmp(eventTypeCstr, "ParticipantRemovedEvent")) + { + /* + <Event type="ParticipantRemovedEvent"> + <SessionGroupHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==_sg4</SessionGroupHandle> + <SessionHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==4</SessionHandle> + <ParticipantUri>sip:xtx7YNV-3SGiG7rA1fo5Ndw==@bhr.vivox.com</ParticipantUri> + <AccountName>xtx7YNV-3SGiG7rA1fo5Ndw==</AccountName> + </Event> + */ + LLVivoxVoiceClient::getInstance()->participantRemovedEvent(sessionHandle, sessionGroupHandle, uriString, alias, nameString); + } + else if (!stricmp(eventTypeCstr, "ParticipantUpdatedEvent")) + { + /* + <Event type="ParticipantUpdatedEvent"> + <SessionGroupHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==_sg0</SessionGroupHandle> + <SessionHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==0</SessionHandle> + <ParticipantUri>sip:xFnPP04IpREWNkuw1cOXlhw==@bhr.vivox.com</ParticipantUri> + <IsModeratorMuted>false</IsModeratorMuted> + <IsSpeaking>true</IsSpeaking> + <Volume>44</Volume> + <Energy>0.0879437</Energy> + </Event> + */ + + // These happen so often that logging them is pretty useless. + squelchDebugOutput = true; + + LLVivoxVoiceClient::getInstance()->participantUpdatedEvent(sessionHandle, sessionGroupHandle, uriString, alias, isModeratorMuted, isSpeaking, volume, energy); + } + else if (!stricmp(eventTypeCstr, "AuxAudioPropertiesEvent")) + { + // These are really spammy in tuning mode + squelchDebugOutput = true; + + LLVivoxVoiceClient::getInstance()->auxAudioPropertiesEvent(energy); + } + else if (!stricmp(eventTypeCstr, "BuddyPresenceEvent")) + { + LLVivoxVoiceClient::getInstance()->buddyPresenceEvent(uriString, alias, statusString, applicationString); + } + else if (!stricmp(eventTypeCstr, "BuddyAndGroupListChangedEvent")) + { + // The buddy list was updated during parsing. + // Need to recheck against the friends list. + LLVivoxVoiceClient::getInstance()->buddyListChanged(); + } + else if (!stricmp(eventTypeCstr, "BuddyChangedEvent")) + { + /* + <Event type="BuddyChangedEvent"> + <AccountHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==</AccountHandle> + <BuddyURI>sip:x9fFHFZjOTN6OESF1DUPrZQ==@bhr.vivox.com</BuddyURI> + <DisplayName>Monroe Tester</DisplayName> + <BuddyData /> + <GroupID>0</GroupID> + <ChangeType>Set</ChangeType> + </Event> + */ + // TODO: Question: Do we need to process this at all? + } + else if (!stricmp(eventTypeCstr, "MessageEvent")) + { + LLVivoxVoiceClient::getInstance()->messageEvent(sessionHandle, uriString, alias, messageHeader, messageBody, applicationString); + } + else if (!stricmp(eventTypeCstr, "SessionNotificationEvent")) + { + LLVivoxVoiceClient::getInstance()->sessionNotificationEvent(sessionHandle, uriString, notificationType); + } + else if (!stricmp(eventTypeCstr, "SubscriptionEvent")) + { + LLVivoxVoiceClient::getInstance()->subscriptionEvent(uriString, subscriptionHandle, alias, displayNameString, applicationString, subscriptionType); + } + else if (!stricmp(eventTypeCstr, "SessionUpdatedEvent")) + { + /* + <Event type="SessionUpdatedEvent"> + <SessionGroupHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==_sg0</SessionGroupHandle> + <SessionHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==0</SessionHandle> + <Uri>sip:confctl-9@bhd.vivox.com</Uri> + <IsMuted>0</IsMuted> + <Volume>50</Volume> + <TransmitEnabled>1</TransmitEnabled> + <IsFocused>0</IsFocused> + <SpeakerPosition><Position><X>0</X><Y>0</Y><Z>0</Z></Position></SpeakerPosition> + <SessionFontID>0</SessionFontID> + </Event> + */ + // We don't need to process this, but we also shouldn't warn on it, since that confuses people. + } + + else if (!stricmp(eventTypeCstr, "SessionGroupRemovedEvent")) + { + /* + <Event type="SessionGroupRemovedEvent"> + <SessionGroupHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==_sg0</SessionGroupHandle> + </Event> + */ + // We don't need to process this, but we also shouldn't warn on it, since that confuses people. + } + else + { + LL_WARNS("VivoxProtocolParser") << "Unknown event type " << eventTypeString << LL_ENDL; + } + } + else + { + const char *actionCstr = actionString.c_str(); + if (!stricmp(actionCstr, "Connector.Create.1")) + { + LLVivoxVoiceClient::getInstance()->connectorCreateResponse(statusCode, statusString, connectorHandle, versionID); + } + else if (!stricmp(actionCstr, "Account.Login.1")) + { + LLVivoxVoiceClient::getInstance()->loginResponse(statusCode, statusString, accountHandle, numberOfAliases); + } + else if (!stricmp(actionCstr, "Session.Create.1")) + { + LLVivoxVoiceClient::getInstance()->sessionCreateResponse(requestId, statusCode, statusString, sessionHandle); + } + else if (!stricmp(actionCstr, "SessionGroup.AddSession.1")) + { + LLVivoxVoiceClient::getInstance()->sessionGroupAddSessionResponse(requestId, statusCode, statusString, sessionHandle); + } + else if (!stricmp(actionCstr, "Session.Connect.1")) + { + LLVivoxVoiceClient::getInstance()->sessionConnectResponse(requestId, statusCode, statusString); + } + else if (!stricmp(actionCstr, "Account.Logout.1")) + { + LLVivoxVoiceClient::getInstance()->logoutResponse(statusCode, statusString); + } + else if (!stricmp(actionCstr, "Connector.InitiateShutdown.1")) + { + LLVivoxVoiceClient::getInstance()->connectorShutdownResponse(statusCode, statusString); + } + else if (!stricmp(actionCstr, "Account.ListBlockRules.1")) + { + LLVivoxVoiceClient::getInstance()->accountListBlockRulesResponse(statusCode, statusString); + } + else if (!stricmp(actionCstr, "Account.ListAutoAcceptRules.1")) + { + LLVivoxVoiceClient::getInstance()->accountListAutoAcceptRulesResponse(statusCode, statusString); + } + else if (!stricmp(actionCstr, "Session.Set3DPosition.1")) + { + // We don't need to process these, but they're so spammy we don't want to log them. + squelchDebugOutput = true; + } + else if (!stricmp(actionCstr, "Account.GetSessionFonts.1")) + { + LLVivoxVoiceClient::getInstance()->accountGetSessionFontsResponse(statusCode, statusString); + } + else if (!stricmp(actionCstr, "Account.GetTemplateFonts.1")) + { + LLVivoxVoiceClient::getInstance()->accountGetTemplateFontsResponse(statusCode, statusString); + } + /* + else if (!stricmp(actionCstr, "Account.ChannelGetList.1")) + { + LLVoiceClient::getInstance()->channelGetListResponse(statusCode, statusString); + } + else if (!stricmp(actionCstr, "Connector.AccountCreate.1")) + { + + } + else if (!stricmp(actionCstr, "Connector.MuteLocalMic.1")) + { + + } + else if (!stricmp(actionCstr, "Connector.MuteLocalSpeaker.1")) + { + + } + else if (!stricmp(actionCstr, "Connector.SetLocalMicVolume.1")) + { + + } + else if (!stricmp(actionCstr, "Connector.SetLocalSpeakerVolume.1")) + { + + } + else if (!stricmp(actionCstr, "Session.ListenerSetPosition.1")) + { + + } + else if (!stricmp(actionCstr, "Session.SpeakerSetPosition.1")) + { + + } + else if (!stricmp(actionCstr, "Session.AudioSourceSetPosition.1")) + { + + } + else if (!stricmp(actionCstr, "Session.GetChannelParticipants.1")) + { + + } + else if (!stricmp(actionCstr, "Account.ChannelCreate.1")) + { + + } + else if (!stricmp(actionCstr, "Account.ChannelUpdate.1")) + { + + } + else if (!stricmp(actionCstr, "Account.ChannelDelete.1")) + { + + } + else if (!stricmp(actionCstr, "Account.ChannelCreateAndInvite.1")) + { + + } + else if (!stricmp(actionCstr, "Account.ChannelFolderCreate.1")) + { + + } + else if (!stricmp(actionCstr, "Account.ChannelFolderUpdate.1")) + { + + } + else if (!stricmp(actionCstr, "Account.ChannelFolderDelete.1")) + { + + } + else if (!stricmp(actionCstr, "Account.ChannelAddModerator.1")) + { + + } + else if (!stricmp(actionCstr, "Account.ChannelDeleteModerator.1")) + { + + } + */ + } +} + diff --git a/indra/newview/llvoicevivox.h b/indra/newview/llvoicevivox.h new file mode 100644 index 0000000000..f858f8f74e --- /dev/null +++ b/indra/newview/llvoicevivox.h @@ -0,0 +1,1053 @@ +/** + * @file llvoicevivox.h + * @brief Declaration of LLDiamondwareVoiceClient class which is the interface to the voice client process. + * + * $LicenseInfo:firstyear=2001&license=viewergpl$ + * + * Copyright (c) 2001-2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ +#ifndef LL_VOICE_VIVOX_H +#define LL_VOICE_VIVOX_H + +class LLVOAvatar; +class LLVivoxProtocolParser; + +#include "lliopipe.h" +#include "llpumpio.h" +#include "llchainio.h" +#include "lliosocket.h" +#include "v3math.h" +#include "llframetimer.h" +#include "llviewerregion.h" +#include "llcallingcard.h" // for LLFriendObserver + +#ifdef LL_STANDALONE +# include "expat.h" +#else +# include "expat/expat.h" +#endif +#include "llvoiceclient.h" + + +class LLVivoxVoiceAccountProvisionResponder; +class LLVivoxVoiceClientMuteListObserver; +class LLVivoxVoiceClientFriendsObserver; + + +class LLVivoxVoiceClient : public LLSingleton<LLVivoxVoiceClient>, + virtual public LLVoiceModuleInterface, + virtual public LLVoiceEffectInterface +{ + LOG_CLASS(LLVivoxVoiceClient); +public: + LLVivoxVoiceClient(); + virtual ~LLVivoxVoiceClient(); + + + /// @name LLVoiceModuleInterface virtual implementations + /// @see LLVoiceModuleInterface + //@{ + virtual void init(LLPumpIO *pump); // Call this once at application startup (creates connector) + virtual void terminate(); // Call this to clean up during shutdown + + virtual const LLVoiceVersionInfo& getVersion(); + + virtual void updateSettings(); // call after loading settings and whenever they change + + // Returns true if vivox has successfully logged in and is not in error state + virtual bool isVoiceWorking() const; + + ///////////////////// + /// @name Tuning + //@{ + virtual void tuningStart(); + virtual void tuningStop(); + virtual bool inTuningMode(); + + virtual void tuningSetMicVolume(float volume); + virtual void tuningSetSpeakerVolume(float volume); + virtual float tuningGetEnergy(void); + //@} + + ///////////////////// + /// @name Devices + //@{ + // This returns true when it's safe to bring up the "device settings" dialog in the prefs. + // i.e. when the daemon is running and connected, and the device lists are populated. + virtual bool deviceSettingsAvailable(); + + // Requery the vivox daemon for the current list of input/output devices. + // If you pass true for clearCurrentList, deviceSettingsAvailable() will be false until the query has completed + // (use this if you want to know when it's done). + // If you pass false, you'll have no way to know when the query finishes, but the device lists will not appear empty in the interim. + virtual void refreshDeviceLists(bool clearCurrentList = true); + + virtual void setCaptureDevice(const std::string& name); + virtual void setRenderDevice(const std::string& name); + + virtual LLVoiceDeviceList& getCaptureDevices(); + virtual LLVoiceDeviceList& getRenderDevices(); + //@} + + virtual void getParticipantList(std::set<LLUUID> &participants); + virtual bool isParticipant(const LLUUID& speaker_id); + + // Send a text message to the specified user, initiating the session if necessary. + virtual BOOL sendTextMessage(const LLUUID& participant_id, const std::string& message); + + // close any existing text IM session with the specified user + virtual void endUserIMSession(const LLUUID &uuid); + + // Returns true if calling back the session URI after the session has closed is possible. + // Currently this will be false only for PSTN P2P calls. + // NOTE: this will return true if the session can't be found. + virtual BOOL isSessionCallBackPossible(const LLUUID &session_id); + + // Returns true if the session can accepte text IM's. + // Currently this will be false only for PSTN P2P calls. + // NOTE: this will return true if the session can't be found. + virtual BOOL isSessionTextIMPossible(const LLUUID &session_id); + + + //////////////////////////// + /// @name Channel stuff + //@{ + // returns true iff the user is currently in a proximal (local spatial) channel. + // Note that gestures should only fire if this returns true. + virtual bool inProximalChannel(); + + virtual void setNonSpatialChannel(const std::string &uri, + const std::string &credentials); + + virtual void setSpatialChannel(const std::string &uri, + const std::string &credentials); + + virtual void leaveNonSpatialChannel(); + + virtual void leaveChannel(void); + + // Returns the URI of the current channel, or an empty string if not currently in a channel. + // NOTE that it will return an empty string if it's in the process of joining a channel. + virtual std::string getCurrentChannel(); + //@} + + + ////////////////////////// + /// @name invitations + //@{ + // start a voice channel with the specified user + virtual void callUser(const LLUUID &uuid); + virtual bool isValidChannel(std::string &channelHandle); + virtual bool answerInvite(std::string &channelHandle); + virtual void declineInvite(std::string &channelHandle); + //@} + + ///////////////////////// + /// @name Volume/gain + //@{ + virtual void setVoiceVolume(F32 volume); + virtual void setMicGain(F32 volume); + //@} + + ///////////////////////// + /// @name enable disable voice and features + //@{ + virtual bool voiceEnabled(); + virtual void setVoiceEnabled(bool enabled); + virtual BOOL lipSyncEnabled(); + virtual void setLipSyncEnabled(BOOL enabled); + virtual void setMuteMic(bool muted); // Use this to mute the local mic (for when the client is minimized, etc), ignoring user PTT state. + //@} + + //////////////////////// + /// @name PTT + //@{ + virtual void setUserPTTState(bool ptt); + virtual bool getUserPTTState(); + virtual void setUsePTT(bool usePTT); + virtual void setPTTIsToggle(bool PTTIsToggle); + virtual bool getPTTIsToggle(); + virtual void inputUserControlState(bool down); // interpret any sort of up-down mic-open control input according to ptt-toggle prefs + virtual void toggleUserPTTState(void); + + virtual void keyDown(KEY key, MASK mask); + virtual void keyUp(KEY key, MASK mask); + virtual void middleMouseState(bool down); + //@} + + ////////////////////////// + /// @name nearby speaker accessors + //@{ + virtual BOOL getVoiceEnabled(const LLUUID& id); // true if we've received data for this avatar + virtual std::string getDisplayName(const LLUUID& id); + virtual BOOL isOnlineSIP(const LLUUID &id); + virtual BOOL isParticipantAvatar(const LLUUID &id); + virtual BOOL getIsSpeaking(const LLUUID& id); + virtual BOOL getIsModeratorMuted(const LLUUID& id); + virtual F32 getCurrentPower(const LLUUID& id); // "power" is related to "amplitude" in a defined way. I'm just not sure what the formula is... + virtual BOOL getOnMuteList(const LLUUID& id); + virtual F32 getUserVolume(const LLUUID& id); + virtual void setUserVolume(const LLUUID& id, F32 volume); // set's volume for specified agent, from 0-1 (where .5 is nominal) + //@} + + // authorize the user + virtual void userAuthorized(const std::string& user_id, + const LLUUID &agentID); + + ////////////////////////////// + /// @name Status notification + //@{ + virtual void addObserver(LLVoiceClientStatusObserver* observer); + virtual void removeObserver(LLVoiceClientStatusObserver* observer); + virtual void addObserver(LLFriendObserver* observer); + virtual void removeObserver(LLFriendObserver* observer); + virtual void addObserver(LLVoiceClientParticipantObserver* observer); + virtual void removeObserver(LLVoiceClientParticipantObserver* observer); + //@} + + virtual std::string sipURIFromID(const LLUUID &id); + //@} + + /// @name LLVoiceEffectInterface virtual implementations + /// @see LLVoiceEffectInterface + //@{ + + ////////////////////////// + /// @name Accessors + //@{ + virtual bool setVoiceEffect(const LLUUID& id); + virtual const LLUUID getVoiceEffect(); + virtual LLSD getVoiceEffectProperties(const LLUUID& id); + + virtual void refreshVoiceEffectLists(bool clear_lists); + virtual const voice_effect_list_t& getVoiceEffectList() const; + virtual const voice_effect_list_t& getVoiceEffectTemplateList() const; + //@} + + ////////////////////////////// + /// @name Status notification + //@{ + virtual void addObserver(LLVoiceEffectObserver* observer); + virtual void removeObserver(LLVoiceEffectObserver* observer); + //@} + + ////////////////////////////// + /// @name Effect preview buffer + //@{ + virtual void enablePreviewBuffer(bool enable); + virtual void recordPreviewBuffer(); + virtual void playPreviewBuffer(const LLUUID& effect_id = LLUUID::null); + virtual void stopPreviewBuffer(); + + virtual bool isPreviewRecording(); + virtual bool isPreviewPlaying(); + //@} + + //@} + + +protected: + ////////////////////// + // Vivox Specific definitions + + friend class LLVivoxVoiceAccountProvisionResponder; + friend class LLVivoxVoiceClientMuteListObserver; + friend class LLVivoxVoiceClientFriendsObserver; + + enum streamState + { + streamStateUnknown = 0, + streamStateIdle = 1, + streamStateConnected = 2, + streamStateRinging = 3, + }; + struct participantState + { + public: + participantState(const std::string &uri); + + bool updateMuteState(); // true if mute state has changed + bool isAvatar(); + + std::string mURI; + LLUUID mAvatarID; + std::string mAccountName; + std::string mDisplayName; + LLFrameTimer mSpeakingTimeout; + F32 mLastSpokeTimestamp; + F32 mPower; + F32 mVolume; + std::string mGroupID; + int mUserVolume; + bool mPTT; + bool mIsSpeaking; + bool mIsModeratorMuted; + bool mOnMuteList; // true if this avatar is on the user's mute list (and should be muted) + bool mVolumeSet; // true if incoming volume messages should not change the volume + bool mVolumeDirty; // true if this participant needs a volume command sent (either mOnMuteList or mUserVolume has changed) + bool mAvatarIDValid; + bool mIsSelf; + }; + + typedef std::map<const std::string, participantState*> participantMap; + typedef std::map<const LLUUID, participantState*> participantUUIDMap; + + struct sessionState + { + public: + sessionState(); + ~sessionState(); + + participantState *addParticipant(const std::string &uri); + // Note: after removeParticipant returns, the participant* that was passed to it will have been deleted. + // Take care not to use the pointer again after that. + void removeParticipant(participantState *participant); + void removeAllParticipants(); + + participantState *findParticipant(const std::string &uri); + participantState *findParticipantByID(const LLUUID& id); + + bool isCallBackPossible(); + bool isTextIMPossible(); + + std::string mHandle; + std::string mGroupHandle; + std::string mSIPURI; + std::string mAlias; + std::string mName; + std::string mAlternateSIPURI; + std::string mHash; // Channel password + std::string mErrorStatusString; + std::queue<std::string> mTextMsgQueue; + + LLUUID mIMSessionID; + LLUUID mCallerID; + int mErrorStatusCode; + int mMediaStreamState; + int mTextStreamState; + bool mCreateInProgress; // True if a Session.Create has been sent for this session and no response has been received yet. + bool mMediaConnectInProgress; // True if a Session.MediaConnect has been sent for this session and no response has been received yet. + bool mVoiceInvitePending; // True if a voice invite is pending for this session (usually waiting on a name lookup) + bool mTextInvitePending; // True if a text invite is pending for this session (usually waiting on a name lookup) + bool mSynthesizedCallerID; // True if the caller ID is a hash of the SIP URI -- this means we shouldn't do a name lookup. + bool mIsChannel; // True for both group and spatial channels (false for p2p, PSTN) + bool mIsSpatial; // True for spatial channels + bool mIsP2P; + bool mIncoming; + bool mVoiceEnabled; + bool mReconnect; // Whether we should try to reconnect to this session if it's dropped + + // Set to true when the volume/mute state of someone in the participant list changes. + // The code will have to walk the list to find the changed participant(s). + bool mVolumeDirty; + bool mMuteDirty; + + bool mParticipantsChanged; + participantMap mParticipantsByURI; + participantUUIDMap mParticipantsByUUID; + + LLUUID mVoiceFontID; + }; + + // internal state for a simple state machine. This is used to deal with the asynchronous nature of some of the messages. + // Note: if you change this list, please make corresponding changes to LLVivoxVoiceClient::state2string(). + enum state + { + stateDisableCleanup, + stateDisabled, // Voice is turned off. + stateStart, // Class is initialized, socket is created + stateDaemonLaunched, // Daemon has been launched + stateConnecting, // connect() call has been issued + stateConnected, // connection to the daemon has been made, send some initial setup commands. + stateIdle, // socket is connected, ready for messaging + stateMicTuningStart, + stateMicTuningRunning, + stateMicTuningStop, + stateCaptureBufferPaused, + stateCaptureBufferRecStart, + stateCaptureBufferRecording, + stateCaptureBufferPlayStart, + stateCaptureBufferPlaying, + stateConnectorStart, // connector needs to be started + stateConnectorStarting, // waiting for connector handle + stateConnectorStarted, // connector handle received + stateLoginRetry, // need to retry login (failed due to changing password) + stateLoginRetryWait, // waiting for retry timer + stateNeedsLogin, // send login request + stateLoggingIn, // waiting for account handle + stateLoggedIn, // account handle received + stateVoiceFontsWait, // Awaiting the list of voice fonts + stateVoiceFontsReceived, // List of voice fonts received + stateCreatingSessionGroup, // Creating the main session group + stateNoChannel, // + stateJoiningSession, // waiting for session handle + stateSessionJoined, // session handle received + stateRunning, // in session, steady state + stateLeavingSession, // waiting for terminate session response + stateSessionTerminated, // waiting for terminate session response + + stateLoggingOut, // waiting for logout response + stateLoggedOut, // logout response received + stateConnectorStopping, // waiting for connector stop + stateConnectorStopped, // connector stop received + + // We go to this state if the login fails because the account needs to be provisioned. + + // error states. No way to recover from these yet. + stateConnectorFailed, + stateConnectorFailedWaiting, + stateLoginFailed, + stateLoginFailedWaiting, + stateJoinSessionFailed, + stateJoinSessionFailedWaiting, + + stateJail // Go here when all else has failed. Nothing will be retried, we're done. + }; + + typedef std::map<std::string, sessionState*> sessionMap; + + + + /////////////////////////////////////////////////////// + // Private Member Functions + ////////////////////////////////////////////////////// + + ////////////////////////////// + /// @name TVC/Server management and communication + //@{ + // Call this if the connection to the daemon terminates unexpectedly. It will attempt to reset everything and relaunch. + void daemonDied(); + + // Call this if we're just giving up on voice (can't provision an account, etc.). It will clean up and go away. + void giveUp(); + + // write to the tvc + bool writeString(const std::string &str); + + void connectorCreate(); + void connectorShutdown(); + void closeSocket(void); + + void requestVoiceAccountProvision(S32 retries = 3); + void login( + const std::string& account_name, + const std::string& password, + const std::string& voice_sip_uri_hostname, + const std::string& voice_account_server_uri); + void loginSendMessage(); + void logout(); + void logoutSendMessage(); + + + //@} + + //------------------------------------ + // tuning + + void tuningRenderStartSendMessage(const std::string& name, bool loop); + void tuningRenderStopSendMessage(); + + void tuningCaptureStartSendMessage(int duration); + void tuningCaptureStopSendMessage(); + + //---------------------------------- + // devices + void clearCaptureDevices(); + void addCaptureDevice(const std::string& name); + void clearRenderDevices(); + void addRenderDevice(const std::string& name); + void buildSetAudioDevices(std::ostringstream &stream); + + void getCaptureDevicesSendMessage(); + void getRenderDevicesSendMessage(); + + // local audio updates + void buildLocalAudioUpdates(std::ostringstream &stream); + + + ///////////////////////////// + // Response/Event handlers + void connectorCreateResponse(int statusCode, std::string &statusString, std::string &connectorHandle, std::string &versionID); + void loginResponse(int statusCode, std::string &statusString, std::string &accountHandle, int numberOfAliases); + void sessionCreateResponse(std::string &requestId, int statusCode, std::string &statusString, std::string &sessionHandle); + void sessionGroupAddSessionResponse(std::string &requestId, int statusCode, std::string &statusString, std::string &sessionHandle); + void sessionConnectResponse(std::string &requestId, int statusCode, std::string &statusString); + void logoutResponse(int statusCode, std::string &statusString); + void connectorShutdownResponse(int statusCode, std::string &statusString); + + void accountLoginStateChangeEvent(std::string &accountHandle, int statusCode, std::string &statusString, int state); + void mediaCompletionEvent(std::string &sessionGroupHandle, std::string &mediaCompletionType); + void mediaStreamUpdatedEvent(std::string &sessionHandle, std::string &sessionGroupHandle, int statusCode, std::string &statusString, int state, bool incoming); + void textStreamUpdatedEvent(std::string &sessionHandle, std::string &sessionGroupHandle, bool enabled, int state, bool incoming); + void sessionAddedEvent(std::string &uriString, std::string &alias, std::string &sessionHandle, std::string &sessionGroupHandle, bool isChannel, bool incoming, std::string &nameString, std::string &applicationString); + void sessionGroupAddedEvent(std::string &sessionGroupHandle); + void sessionRemovedEvent(std::string &sessionHandle, std::string &sessionGroupHandle); + void participantAddedEvent(std::string &sessionHandle, std::string &sessionGroupHandle, std::string &uriString, std::string &alias, std::string &nameString, std::string &displayNameString, int participantType); + void participantRemovedEvent(std::string &sessionHandle, std::string &sessionGroupHandle, std::string &uriString, std::string &alias, std::string &nameString); + void participantUpdatedEvent(std::string &sessionHandle, std::string &sessionGroupHandle, std::string &uriString, std::string &alias, bool isModeratorMuted, bool isSpeaking, int volume, F32 energy); + void auxAudioPropertiesEvent(F32 energy); + void buddyPresenceEvent(std::string &uriString, std::string &alias, std::string &statusString, std::string &applicationString); + void messageEvent(std::string &sessionHandle, std::string &uriString, std::string &alias, std::string &messageHeader, std::string &messageBody, std::string &applicationString); + void sessionNotificationEvent(std::string &sessionHandle, std::string &uriString, std::string ¬ificationType); + void subscriptionEvent(std::string &buddyURI, std::string &subscriptionHandle, std::string &alias, std::string &displayName, std::string &applicationString, std::string &subscriptionType); + + void buddyListChanged(); + void muteListChanged(); + void updateFriends(U32 mask); + + ///////////////////////////// + // Sending updates of current state + void updatePosition(void); + void setCameraPosition(const LLVector3d &position, const LLVector3 &velocity, const LLMatrix3 &rot); + void setAvatarPosition(const LLVector3d &position, const LLVector3 &velocity, const LLMatrix3 &rot); + bool channelFromRegion(LLViewerRegion *region, std::string &name); + + void setEarLocation(S32 loc); + + + ///////////////////////////// + // Accessors for data related to nearby speakers + + // MBW -- XXX -- Not sure how to get this data out of the TVC + BOOL getUsingPTT(const LLUUID& id); + std::string getGroupID(const LLUUID& id); // group ID if the user is in group chat (empty string if not applicable) + + ///////////////////////////// + BOOL getAreaVoiceDisabled(); // returns true if the area the avatar is in is speech-disabled. + // Use this to determine whether to show a "no speech" icon in the menu bar. + + + // PTT + void setPTTKey(std::string &key); + + ///////////////////////////// + // Recording controls + void recordingLoopStart(int seconds = 3600, int deltaFramesPerControlFrame = 200); + void recordingLoopSave(const std::string& filename); + void recordingStop(); + + // Playback controls + void filePlaybackStart(const std::string& filename); + void filePlaybackStop(); + void filePlaybackSetPaused(bool paused); + void filePlaybackSetMode(bool vox = false, float speed = 1.0f); + + participantState *findParticipantByID(const LLUUID& id); + + + //////////////////////////////////////// + // voice sessions. + typedef std::set<sessionState*> sessionSet; + + typedef sessionSet::iterator sessionIterator; + sessionIterator sessionsBegin(void); + sessionIterator sessionsEnd(void); + + sessionState *findSession(const std::string &handle); + sessionState *findSessionBeingCreatedByURI(const std::string &uri); + sessionState *findSession(const LLUUID &participant_id); + sessionState *findSessionByCreateID(const std::string &create_id); + + sessionState *addSession(const std::string &uri, const std::string &handle = LLStringUtil::null); + void setSessionHandle(sessionState *session, const std::string &handle = LLStringUtil::null); + void setSessionURI(sessionState *session, const std::string &uri); + void deleteSession(sessionState *session); + void deleteAllSessions(void); + + void verifySessionState(void); + + void joinedAudioSession(sessionState *session); + void leftAudioSession(sessionState *session); + + // This is called in several places where the session _may_ need to be deleted. + // It contains logic for whether to delete the session or keep it around. + void reapSession(sessionState *session); + + // Returns true if the session seems to indicate we've moved to a region on a different voice server + bool sessionNeedsRelog(sessionState *session); + + + ////////////////////////////////////// + // buddy list stuff, needed for SLIM later + struct buddyListEntry + { + buddyListEntry(const std::string &uri); + std::string mURI; + std::string mDisplayName; + LLUUID mUUID; + bool mOnlineSL; + bool mOnlineSLim; + bool mCanSeeMeOnline; + bool mHasBlockListEntry; + bool mHasAutoAcceptListEntry; + bool mNameResolved; + bool mInSLFriends; + bool mInVivoxBuddies; + bool mNeedsNameUpdate; + }; + + typedef std::map<std::string, buddyListEntry*> buddyListMap; + + // This should be called when parsing a buddy list entry sent by SLVoice. + void processBuddyListEntry(const std::string &uri, const std::string &displayName); + + buddyListEntry *addBuddy(const std::string &uri); + buddyListEntry *addBuddy(const std::string &uri, const std::string &displayName); + buddyListEntry *findBuddy(const std::string &uri); + buddyListEntry *findBuddy(const LLUUID &id); + buddyListEntry *findBuddyByDisplayName(const std::string &name); + void deleteBuddy(const std::string &uri); + void deleteAllBuddies(void); + + void deleteAllBlockRules(void); + void addBlockRule(const std::string &blockMask, const std::string &presenceOnly); + void deleteAllAutoAcceptRules(void); + void addAutoAcceptRule(const std::string &autoAcceptMask, const std::string &autoAddAsBuddy); + void accountListBlockRulesResponse(int statusCode, const std::string &statusString); + void accountListAutoAcceptRulesResponse(int statusCode, const std::string &statusString); + + ///////////////////////////// + // session control messages + + void accountListBlockRulesSendMessage(); + void accountListAutoAcceptRulesSendMessage(); + + void sessionGroupCreateSendMessage(); + void sessionCreateSendMessage(sessionState *session, bool startAudio = true, bool startText = false); + void sessionGroupAddSessionSendMessage(sessionState *session, bool startAudio = true, bool startText = false); + void sessionMediaConnectSendMessage(sessionState *session); // just joins the audio session + void sessionTextConnectSendMessage(sessionState *session); // just joins the text session + void sessionTerminateSendMessage(sessionState *session); + void sessionGroupTerminateSendMessage(sessionState *session); + void sessionMediaDisconnectSendMessage(sessionState *session); + void sessionTextDisconnectSendMessage(sessionState *session); + + // Pokes the state machine to leave the audio session next time around. + void sessionTerminate(); + + // Pokes the state machine to shut down the connector and restart it. + void requestRelog(); + + // Does the actual work to get out of the audio session + void leaveAudioSession(); + + void lookupName(const LLUUID &id); + static void onAvatarNameLookup(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group); + void avatarNameResolved(const LLUUID &id, const std::string &name); + + ///////////////////////////// + // Voice fonts + + void addVoiceFont(const S32 id, + const std::string &name, + const std::string &description, + const LLDate &expiration_date, + bool has_expired, + const S32 font_type, + const S32 font_status, + const bool template_font = false); + void accountGetSessionFontsResponse(int statusCode, const std::string &statusString); + void accountGetTemplateFontsResponse(int statusCode, const std::string &statusString); + +private: + LLVoiceVersionInfo mVoiceVersion; + + state mState; + bool mSessionTerminateRequested; + bool mRelogRequested; + // Number of times (in a row) "stateJoiningSession" case for spatial channel is reached in stateMachine(). + // The larger it is the greater is possibility there is a problem with connection to voice server. + // Introduced while fixing EXT-4313. + int mSpatialJoiningNum; + + void setState(state inState); + state getState(void) { return mState; }; + std::string state2string(state inState); + + void stateMachine(); + static void idle(void *user_data); + + LLHost mDaemonHost; + LLSocket::ptr_t mSocket; + bool mConnected; + + + LLPumpIO *mPump; + friend class LLVivoxProtocolParser; + + std::string mAccountName; + std::string mAccountPassword; + std::string mAccountDisplayName; + + bool mTuningMode; + float mTuningEnergy; + std::string mTuningAudioFile; + int mTuningMicVolume; + bool mTuningMicVolumeDirty; + int mTuningSpeakerVolume; + bool mTuningSpeakerVolumeDirty; + state mTuningExitState; // state to return to when we leave tuning mode. + + std::string mSpatialSessionURI; + std::string mSpatialSessionCredentials; + + std::string mMainSessionGroupHandle; // handle of the "main" session group. + + std::string mChannelName; // Name of the channel to be looked up + bool mAreaVoiceDisabled; + sessionState *mAudioSession; // Session state for the current audio session + bool mAudioSessionChanged; // set to true when the above pointer gets changed, so observers can be notified. + + sessionState *mNextAudioSession; // Session state for the audio session we're trying to join + +// std::string mSessionURI; // URI of the session we're in. +// std::string mSessionHandle; // returned by ? + + S32 mCurrentParcelLocalID; // Used to detect parcel boundary crossings + std::string mCurrentRegionName; // Used to detect parcel boundary crossings + + std::string mConnectorHandle; // returned by "Create Connector" message + std::string mAccountHandle; // returned by login message + int mNumberOfAliases; + U32 mCommandCookie; + + std::string mVoiceAccountServerURI; + std::string mVoiceSIPURIHostName; + + int mLoginRetryCount; + + sessionMap mSessionsByHandle; // Active sessions, indexed by session handle. Sessions which are being initiated may not be in this map. + sessionSet mSessions; // All sessions, not indexed. This is the canonical session list. + + bool mBuddyListMapPopulated; + bool mBlockRulesListReceived; + bool mAutoAcceptRulesListReceived; + buddyListMap mBuddyListMap; + + LLVoiceDeviceList mCaptureDevices; + LLVoiceDeviceList mRenderDevices; + + std::string mCaptureDevice; + std::string mRenderDevice; + bool mCaptureDeviceDirty; + bool mRenderDeviceDirty; + + // This should be called when the code detects we have changed parcels. + // It initiates the call to the server that gets the parcel channel. + void parcelChanged(); + + void switchChannel(std::string uri = std::string(), bool spatial = true, bool no_reconnect = false, bool is_p2p = false, std::string hash = ""); + void joinSession(sessionState *session); + + std::string nameFromAvatar(LLVOAvatar *avatar); + std::string nameFromID(const LLUUID &id); + bool IDFromName(const std::string name, LLUUID &uuid); + std::string displayNameFromAvatar(LLVOAvatar *avatar); + std::string sipURIFromAvatar(LLVOAvatar *avatar); + std::string sipURIFromName(std::string &name); + + // Returns the name portion of the SIP URI if the string looks vaguely like a SIP URI, or an empty string if not. + std::string nameFromsipURI(const std::string &uri); + + bool inSpatialChannel(void); + std::string getAudioSessionURI(); + std::string getAudioSessionHandle(); + + void sendPositionalUpdate(void); + + void buildSetCaptureDevice(std::ostringstream &stream); + void buildSetRenderDevice(std::ostringstream &stream); + + void clearAllLists(); + void checkFriend(const LLUUID& id); + void sendFriendsListUpdates(); + + // start a text IM session with the specified user + // This will be asynchronous, the session may be established at a future time. + sessionState* startUserIMSession(const LLUUID& uuid); + void sendQueuedTextMessages(sessionState *session); + + void enforceTether(void); + + bool mSpatialCoordsDirty; + + LLVector3d mCameraPosition; + LLVector3d mCameraRequestedPosition; + LLVector3 mCameraVelocity; + LLMatrix3 mCameraRot; + + LLVector3d mAvatarPosition; + LLVector3 mAvatarVelocity; + LLMatrix3 mAvatarRot; + + bool mPTTDirty; + bool mPTT; + + bool mUsePTT; + bool mPTTIsMiddleMouse; + KEY mPTTKey; + bool mPTTIsToggle; + bool mUserPTTState; + bool mMuteMic; + + // Set to true when the friends list is known to have changed. + bool mFriendsListDirty; + + enum + { + earLocCamera = 0, // ear at camera + earLocAvatar, // ear at avatar + earLocMixed // ear at avatar location/camera direction + }; + + S32 mEarLocation; + + bool mSpeakerVolumeDirty; + bool mSpeakerMuteDirty; + int mSpeakerVolume; + + int mMicVolume; + bool mMicVolumeDirty; + + bool mVoiceEnabled; + bool mWriteInProgress; + std::string mWriteString; + size_t mWriteOffset; + + LLTimer mUpdateTimer; + + BOOL mLipSyncEnabled; + + typedef std::set<LLVoiceClientParticipantObserver*> observer_set_t; + observer_set_t mParticipantObservers; + + void notifyParticipantObservers(); + + typedef std::set<LLVoiceClientStatusObserver*> status_observer_set_t; + status_observer_set_t mStatusObservers; + + void notifyStatusObservers(LLVoiceClientStatusObserver::EStatusType status); + + typedef std::set<LLFriendObserver*> friend_observer_set_t; + friend_observer_set_t mFriendObservers; + void notifyFriendObservers(); + + // Voice Fonts + + void expireVoiceFonts(); + void deleteVoiceFont(const LLUUID& id); + void deleteAllVoiceFonts(); + void deleteVoiceFontTemplates(); + + S32 getVoiceFontIndex(const LLUUID& id) const; + S32 getVoiceFontTemplateIndex(const LLUUID& id) const; + + void accountGetSessionFontsSendMessage(); + void accountGetTemplateFontsSendMessage(); + void sessionSetVoiceFontSendMessage(sessionState *session); + + void notifyVoiceFontObservers(); + + typedef enum e_voice_font_type + { + VOICE_FONT_TYPE_NONE = 0, + VOICE_FONT_TYPE_ROOT = 1, + VOICE_FONT_TYPE_USER = 2, + VOICE_FONT_TYPE_UNKNOWN + } EVoiceFontType; + + typedef enum e_voice_font_status + { + VOICE_FONT_STATUS_NONE = 0, + VOICE_FONT_STATUS_FREE = 1, + VOICE_FONT_STATUS_NOT_FREE = 2, + VOICE_FONT_STATUS_UNKNOWN + } EVoiceFontStatus; + + struct voiceFontEntry + { + voiceFontEntry(LLUUID& id); + ~voiceFontEntry(); + + LLUUID mID; + S32 mFontIndex; + std::string mName; + LLDate mExpirationDate; + S32 mFontType; + S32 mFontStatus; + bool mIsNew; + + LLFrameTimer mExpiryTimer; + LLFrameTimer mExpiryWarningTimer; + }; + + bool mVoiceFontsReceived; + bool mVoiceFontsNew; + bool mVoiceFontListDirty; + voice_effect_list_t mVoiceFontList; + voice_effect_list_t mVoiceFontTemplateList; + + typedef std::map<const LLUUID, voiceFontEntry*> voice_font_map_t; + voice_font_map_t mVoiceFontMap; + voice_font_map_t mVoiceFontTemplateMap; + + typedef std::set<LLVoiceEffectObserver*> voice_font_observer_set_t; + voice_font_observer_set_t mVoiceFontObservers; + + LLFrameTimer mVoiceFontExpiryTimer; + + + // Audio capture buffer + + void captureBufferRecordStartSendMessage(); + void captureBufferRecordStopSendMessage(); + void captureBufferPlayStartSendMessage(const LLUUID& voice_font_id = LLUUID::null); + void captureBufferPlayStopSendMessage(); + + bool mCaptureBufferMode; // Disconnected from voice channels while using the capture buffer. + bool mCaptureBufferRecording; // A voice sample is being captured. + bool mCaptureBufferRecorded; // A voice sample is captured in the buffer ready to play. + bool mCaptureBufferPlaying; // A voice sample is being played. + + LLTimer mCaptureTimer; + LLUUID mPreviewVoiceFont; + LLUUID mPreviewVoiceFontLast; + S32 mPlayRequestCount; +}; + +/** + * @class LLVivoxProtocolParser + * @brief This class helps construct new LLIOPipe specializations + * @see LLIOPipe + * + * THOROUGH_DESCRIPTION + */ +class LLVivoxProtocolParser : public LLIOPipe +{ + LOG_CLASS(LLVivoxProtocolParser); +public: + LLVivoxProtocolParser(); + virtual ~LLVivoxProtocolParser(); + +protected: + /* @name LLIOPipe virtual implementations + */ + //@{ + /** + * @brief Process the data in buffer + */ + virtual EStatus process_impl( + const LLChannelDescriptors& channels, + buffer_ptr_t& buffer, + bool& eos, + LLSD& context, + LLPumpIO* pump); + //@} + + std::string mInput; + + // Expat control members + XML_Parser parser; + int responseDepth; + bool ignoringTags; + bool isEvent; + int ignoreDepth; + + // Members for processing responses. The values are transient and only valid within a call to processResponse(). + bool squelchDebugOutput; + int returnCode; + int statusCode; + std::string statusString; + std::string requestId; + std::string actionString; + std::string connectorHandle; + std::string versionID; + std::string accountHandle; + std::string sessionHandle; + std::string sessionGroupHandle; + std::string alias; + std::string applicationString; + + // Members for processing events. The values are transient and only valid within a call to processResponse(). + std::string eventTypeString; + int state; + std::string uriString; + bool isChannel; + bool incoming; + bool enabled; + std::string nameString; + std::string audioMediaString; + std::string deviceString; + std::string displayNameString; + int participantType; + bool isLocallyMuted; + bool isModeratorMuted; + bool isSpeaking; + int volume; + F32 energy; + std::string messageHeader; + std::string messageBody; + std::string notificationType; + bool hasText; + bool hasAudio; + bool hasVideo; + bool terminated; + std::string blockMask; + std::string presenceOnly; + std::string autoAcceptMask; + std::string autoAddAsBuddy; + int numberOfAliases; + std::string subscriptionHandle; + std::string subscriptionType; + S32 id; + std::string descriptionString; + LLDate expirationDate; + bool hasExpired; + S32 fontType; + S32 fontStatus; + std::string mediaCompletionType; + + // Members for processing text between tags + std::string textBuffer; + bool accumulateText; + + void reset(); + + void processResponse(std::string tag); + + static void XMLCALL ExpatStartTag(void *data, const char *el, const char **attr); + static void XMLCALL ExpatEndTag(void *data, const char *el); + static void XMLCALL ExpatCharHandler(void *data, const XML_Char *s, int len); + + void StartTag(const char *tag, const char **attr); + void EndTag(const char *tag); + void CharData(const char *buffer, int length); + LLDate expiryTimeStampToLLDate(const std::string& vivox_ts); +}; + + +#endif //LL_VIVOX_VOICE_CLIENT_H + diff --git a/indra/newview/llvoinventorylistener.h b/indra/newview/llvoinventorylistener.h index 335e867fca..1531e6e339 100644 --- a/indra/newview/llvoinventorylistener.h +++ b/indra/newview/llvoinventorylistener.h @@ -42,7 +42,7 @@ class LLVOInventoryListener { public: virtual void inventoryChanged(LLViewerObject* object, - InventoryObjectList* inventory, + LLInventoryObject::object_list_t* inventory, S32 serial_num, void* user_data) = 0; diff --git a/indra/newview/llvopartgroup.cpp b/indra/newview/llvopartgroup.cpp index 139d2fbd88..3ba4ecad0c 100644 --- a/indra/newview/llvopartgroup.cpp +++ b/indra/newview/llvopartgroup.cpp @@ -40,7 +40,7 @@ #include "message.h" #include "v2math.h" -#include "llagent.h" +#include "llagentcamera.h" #include "lldrawable.h" #include "llface.h" #include "llsky.h" @@ -136,7 +136,7 @@ F32 LLVOPartGroup::getPartSize(S32 idx) LLVector3 LLVOPartGroup::getCameraPosition() const { - return gAgent.getCameraPositionAgent(); + return gAgentCamera.getCameraPositionAgent(); } static LLFastTimer::DeclareTimer FTM_UPDATE_PARTICLES("Update Particles"); diff --git a/indra/newview/llvosky.cpp b/indra/newview/llvosky.cpp index 0550ed770b..d73850cb49 100644 --- a/indra/newview/llvosky.cpp +++ b/indra/newview/llvosky.cpp @@ -41,6 +41,7 @@ #include "timing.h" #include "llagent.h" +#include "llagentcamera.h" #include "lldrawable.h" #include "llface.h" #include "llcubemap.h" @@ -357,7 +358,7 @@ LLVOSky::LLVOSky(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp) mFace[i] = NULL; } - mCameraPosAgent = gAgent.getCameraPositionAgent(); + mCameraPosAgent = gAgentCamera.getCameraPositionAgent(); mAtmHeight = ATM_HEIGHT; mEarthCenter = LLVector3(mCameraPosAgent.mV[0], mCameraPosAgent.mV[1], -EARTH_RADIUS); @@ -2034,7 +2035,7 @@ void LLVOSky::updateFog(const F32 distance) const F32 water_height = gAgent.getRegion() ? gAgent.getRegion()->getWaterHeight() : 0.f; // LLWorld::getInstance()->getWaterHeight(); - F32 camera_height = gAgent.getCameraPositionAgent().mV[2]; + F32 camera_height = gAgentCamera.getCameraPositionAgent().mV[2]; F32 near_clip_height = LLViewerCamera::getInstance()->getAtAxis().mV[VZ] * LLViewerCamera::getInstance()->getNear(); camera_height += near_clip_height; diff --git a/indra/newview/llvotextbubble.cpp b/indra/newview/llvotextbubble.cpp index 75beab519e..428ef20006 100644 --- a/indra/newview/llvotextbubble.cpp +++ b/indra/newview/llvotextbubble.cpp @@ -84,6 +84,9 @@ BOOL LLVOTextBubble::isActive() const BOOL LLVOTextBubble::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) { + static LLFastTimer::DeclareTimer ftm("Text Bubble"); + LLFastTimer t(ftm); + F32 dt = mUpdateTimer.getElapsedTimeF32(); // Die after a few seconds. if (dt > 1.5f) diff --git a/indra/newview/llvotree.cpp b/indra/newview/llvotree.cpp index 24f1c4bd24..eb5b6c6618 100644 --- a/indra/newview/llvotree.cpp +++ b/indra/newview/llvotree.cpp @@ -44,7 +44,7 @@ #include "material_codes.h" #include "object_flags.h" -#include "llagent.h" +#include "llagentcamera.h" #include "lldrawable.h" #include "llface.h" #include "llviewercamera.h" @@ -66,12 +66,14 @@ const F32 LEAF_TOP = 1.0f; const F32 LEAF_BOTTOM = 0.52f; const F32 LEAF_WIDTH = 1.f; -S32 LLVOTree::sLODVertexOffset[4]; -S32 LLVOTree::sLODVertexCount[4]; -S32 LLVOTree::sLODIndexOffset[4]; -S32 LLVOTree::sLODIndexCount[4]; -S32 LLVOTree::sLODSlices[4] = {10, 5, 4, 3}; -F32 LLVOTree::sLODAngles[4] = {30.f, 20.f, 15.f, 0.f}; +const S32 LLVOTree::sMAX_NUM_TREE_LOD_LEVELS = 4 ; + +S32 LLVOTree::sLODVertexOffset[sMAX_NUM_TREE_LOD_LEVELS]; +S32 LLVOTree::sLODVertexCount[sMAX_NUM_TREE_LOD_LEVELS]; +S32 LLVOTree::sLODIndexOffset[sMAX_NUM_TREE_LOD_LEVELS]; +S32 LLVOTree::sLODIndexCount[sMAX_NUM_TREE_LOD_LEVELS]; +S32 LLVOTree::sLODSlices[sMAX_NUM_TREE_LOD_LEVELS] = {10, 5, 4, 3}; +F32 LLVOTree::sLODAngles[sMAX_NUM_TREE_LOD_LEVELS] = {30.f, 20.f, 15.f, 0.00001f}; F32 LLVOTree::sTreeFactor = 1.f; @@ -373,12 +375,11 @@ BOOL LLVOTree::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) } } - S32 trunk_LOD = 0; + S32 trunk_LOD = sMAX_NUM_TREE_LOD_LEVELS ; F32 app_angle = getAppAngle()*LLVOTree::sTreeFactor; - for (S32 j = 0; j < 4; j++) + for (S32 j = 0; j < sMAX_NUM_TREE_LOD_LEVELS; j++) { - if (app_angle > LLVOTree::sLODAngles[j]) { trunk_LOD = j; @@ -444,17 +445,16 @@ void LLVOTree::setPixelAreaAndAngle(LLAgent &agent) // Re-calculate mPixelArea accurately // This should be the camera's center, as soon as we move to all region-local. - LLVector3 relative_position = getPositionAgent() - agent.getCameraPositionAgent(); - F32 range = relative_position.length(); // ugh, square root + LLVector3 relative_position = getPositionAgent() - gAgentCamera.getCameraPositionAgent(); + F32 range_squared = relative_position.lengthSquared() ; F32 max_scale = mBillboardScale * getMaxScale(); F32 area = max_scale * (max_scale*mBillboardRatio); // Compute pixels per meter at the given range - F32 pixels_per_meter = LLViewerCamera::getInstance()->getViewHeightInPixels() / - (tan(LLViewerCamera::getInstance()->getView()) * range); + F32 pixels_per_meter = LLViewerCamera::getInstance()->getViewHeightInPixels() / tan(LLViewerCamera::getInstance()->getView()); - mPixelArea = (pixels_per_meter) * (pixels_per_meter) * area; + mPixelArea = (pixels_per_meter) * (pixels_per_meter) * area / range_squared; #if 0 // mAppAngle is a bit of voodoo; // use the one calculated LLViewerObject::setPixelAreaAndAngle above @@ -506,6 +506,13 @@ BOOL LLVOTree::updateGeometry(LLDrawable *drawable) { LLFastTimer ftm(FTM_UPDATE_TREE); + if(mTrunkLOD >= sMAX_NUM_TREE_LOD_LEVELS) //do not display the tree. + { + mReferenceBuffer = NULL ; + mDrawable->getFace(0)->mVertexBuffer = NULL ; + return TRUE ; + } + if (mReferenceBuffer.isNull() || mDrawable->getFace(0)->mVertexBuffer.isNull()) { const F32 SRR3 = 0.577350269f; // sqrt(1/3) @@ -523,7 +530,7 @@ BOOL LLVOTree::updateGeometry(LLDrawable *drawable) face->mCenterAgent = getPositionAgent(); face->mCenterLocal = face->mCenterAgent; - for (lod = 0; lod < 4; lod++) + for (lod = 0; lod < sMAX_NUM_TREE_LOD_LEVELS; lod++) { slices = sLODSlices[lod]; sLODVertexOffset[lod] = max_vertices; @@ -700,7 +707,7 @@ BOOL LLVOTree::updateGeometry(LLDrawable *drawable) // Generate the vertices // Generate the indices - for (lod = 0; lod < 4; lod++) + for (lod = 0; lod < sMAX_NUM_TREE_LOD_LEVELS; lod++) { slices = sLODSlices[lod]; F32 base_radius = 0.65f; @@ -892,7 +899,6 @@ void LLVOTree::updateMesh() S32 stop_depth = 0; F32 alpha = 1.0; - U32 vert_count = 0; U32 index_count = 0; @@ -1141,7 +1147,7 @@ U32 LLVOTree::drawBranchPipeline(LLMatrix4& matrix, U16* indicesp, S32 trunk_LOD glLoadMatrixf((F32*) scale_mat.mMatrix); glDrawElements(GL_TRIANGLES, sLODIndexCount[trunk_LOD], GL_UNSIGNED_SHORT, indicesp + sLODIndexOffset[trunk_LOD]); - gPipeline.addTrianglesDrawn(LEAF_INDICES/3); + gPipeline.addTrianglesDrawn(LEAF_INDICES); stop_glerror(); ret += sLODIndexCount[trunk_LOD]; } @@ -1191,7 +1197,7 @@ U32 LLVOTree::drawBranchPipeline(LLMatrix4& matrix, U16* indicesp, S32 trunk_LOD glLoadMatrixf((F32*) scale_mat.mMatrix); glDrawElements(GL_TRIANGLES, LEAF_INDICES, GL_UNSIGNED_SHORT, indicesp); - gPipeline.addTrianglesDrawn(LEAF_INDICES/3); + gPipeline.addTrianglesDrawn(LEAF_INDICES); stop_glerror(); ret += LEAF_INDICES; } @@ -1216,7 +1222,7 @@ U32 LLVOTree::drawBranchPipeline(LLMatrix4& matrix, U16* indicesp, S32 trunk_LOD glLoadMatrixf((F32*) scale_mat.mMatrix); glDrawElements(GL_TRIANGLES, LEAF_INDICES, GL_UNSIGNED_SHORT, indicesp); - gPipeline.addTrianglesDrawn(LEAF_INDICES/3); + gPipeline.addTrianglesDrawn(LEAF_INDICES); stop_glerror(); ret += LEAF_INDICES; diff --git a/indra/newview/llvotree.h b/indra/newview/llvotree.h index feac9e0675..036ad692b1 100644 --- a/indra/newview/llvotree.h +++ b/indra/newview/llvotree.h @@ -152,6 +152,7 @@ public: }; static F32 sTreeFactor; // Tree level of detail factor + static const S32 sMAX_NUM_TREE_LOD_LEVELS ; friend class LLDrawPoolTree; protected: diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index bfe38c14ba..24e2f745d4 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -192,6 +192,7 @@ LLVOVolume::LLVOVolume(const LLUUID &id, const LLPCode pcode, LLViewerRegion *re mMediaImplList.resize(getNumTEs()); mLastFetchedMediaVersion = -1; + mIndexInTex = 0; } LLVOVolume::~LLVOVolume() @@ -226,6 +227,11 @@ void LLVOVolume::markDead() { removeMediaImpl(i); } + + if (mSculptTexture.notNull()) + { + mSculptTexture->removeVolume(this); + } } LLViewerObject::markDead(); @@ -363,7 +369,7 @@ U32 LLVOVolume::processUpdateMessage(LLMessageSystem *mesgsys, S32 res2 = unpackTEMessage(*dp); if (TEM_INVALID == res2) { - // Well, crap, there's something bogus in the data that we're unpacking. + // There's something bogus in the data that we're unpacking. dp->dumpBufferToLog(); llwarns << "Flushing cache files" << llendl; std::string mask; @@ -597,6 +603,9 @@ BOOL LLVOVolume::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) { LLViewerObject::idleUpdate(agent, world, time); + static LLFastTimer::DeclareTimer ftm("Volume"); + LLFastTimer t(ftm); + if (mDead || mDrawable.isNull()) { return TRUE; @@ -618,6 +627,18 @@ BOOL LLVOVolume::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) mVolumeImpl->doIdleUpdate(agent, world, time); } + const S32 MAX_ACTIVE_OBJECT_QUIET_FRAMES = 40; + + if (mDrawable->isActive()) + { + if (mDrawable->isRoot() && + mDrawable->mQuietCount++ > MAX_ACTIVE_OBJECT_QUIET_FRAMES && + (!mDrawable->getParent() || !mDrawable->getParent()->isActive())) + { + mDrawable->makeStatic(); + } + } + return TRUE; } @@ -679,6 +700,7 @@ void LLVOVolume::updateTextureVirtualSize() vsize = area; imagep->setBoostLevel(LLViewerTexture::BOOST_HUD); face->setPixelArea(area); // treat as full screen + face->setVirtualSize(vsize); } else { @@ -695,8 +717,7 @@ void LLVOVolume::updateTextureVirtualSize() gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_TCOORD, FALSE); } } - - face->setVirtualSize(vsize); + if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_TEXTURE_AREA)) { if (vsize < min_vsize) min_vsize = vsize; @@ -725,7 +746,9 @@ void LLVOVolume::updateTextureVirtualSize() { LLSculptParams *sculpt_params = (LLSculptParams *)getParameterEntry(LLNetworkData::PARAMS_SCULPT); LLUUID id = sculpt_params->getSculptTexture(); - mSculptTexture = LLViewerTextureManager::getFetchedTexture(id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); + + updateSculptTexture(); + if (mSculptTexture.notNull()) { mSculptTexture->setBoostLevel(llmax((S32)mSculptTexture->getBoostLevel(), @@ -914,35 +937,56 @@ BOOL LLVOVolume::setVolume(const LLVolumeParams &volume_params, const S32 detail { mVolumeImpl->onSetVolume(volume_params, detail); } - + + updateSculptTexture(); + if (isSculpted()) { - mSculptTexture = LLViewerTextureManager::getFetchedTexture(volume_params.getSculptID(), TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); + updateSculptTexture(); + if (mSculptTexture.notNull()) { - //ignore sculpt GL usage since bao fixed this in a separate branch - if (!gGLActive) - { - gGLActive = TRUE; - sculpt(); - gGLActive = FALSE; - } - else - { - sculpt(); - } + sculpt(); } } - else - { - mSculptTexture = NULL; - } return TRUE; } return FALSE; } +void LLVOVolume::updateSculptTexture() +{ + LLPointer<LLViewerFetchedTexture> old_sculpt = mSculptTexture; + + if (isSculpted()) + { + LLSculptParams *sculpt_params = (LLSculptParams *)getParameterEntry(LLNetworkData::PARAMS_SCULPT); + LLUUID id = sculpt_params->getSculptTexture(); + if (id.notNull()) + { + mSculptTexture = LLViewerTextureManager::getFetchedTexture(id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); + } + } + else + { + mSculptTexture = NULL; + } + + if (mSculptTexture != old_sculpt) + { + if (old_sculpt.notNull()) + { + old_sculpt->removeVolume(this); + } + if (mSculptTexture.notNull()) + { + mSculptTexture->addVolume(this); + } + } + +} + // sculpt replaces generate() for sculpted surfaces void LLVOVolume::sculpt() { @@ -983,6 +1027,8 @@ void LLVOVolume::sculpt() if(!raw_image) { + llassert(discard_level < 0) ; + sculpt_width = 0; sculpt_height = 0; sculpt_data = NULL ; @@ -1006,6 +1052,16 @@ void LLVOVolume::sculpt() } } getVolume()->sculpt(sculpt_width, sculpt_height, sculpt_components, sculpt_data, discard_level); + + //notify rebuild any other VOVolumes that reference this sculpty volume + for (S32 i = 0; i < mSculptTexture->getNumVolumes(); ++i) + { + LLVOVolume* volume = (*(mSculptTexture->getVolumeList()))[i]; + if (volume != this && volume->getVolume() == getVolume()) + { + gPipeline.markRebuild(volume->mDrawable, LLDrawable::REBUILD_GEOMETRY, FALSE); + } + } } } @@ -1035,7 +1091,7 @@ BOOL LLVOVolume::calcLOD() S32 cur_detail = 0; F32 radius = getVolume()->mLODScaleBias.scaledVec(getScale()).length(); - F32 distance = llmin(mDrawable->mDistanceWRTCamera, MAX_LOD_DISTANCE); + F32 distance = mDrawable->mDistanceWRTCamera; //llmin(mDrawable->mDistanceWRTCamera, MAX_LOD_DISTANCE); distance *= sDistanceFactor; F32 rampDist = LLVOVolume::sLODFactor * 2; @@ -1359,7 +1415,7 @@ BOOL LLVOVolume::updateGeometry(LLDrawable *drawable) return res; } - dirtySpatialGroup(); + dirtySpatialGroup(drawable->isState(LLDrawable::IN_REBUILD_Q1)); BOOL compiled = FALSE; @@ -1462,7 +1518,14 @@ void LLVOVolume::updateFaceSize(S32 idx) else { const LLVolumeFace& vol_face = getVolume()->getVolumeFace(idx); - facep->setSize(vol_face.mVertices.size(), vol_face.mIndices.size()); + if (LLPipeline::sUseTriStrips) + { + facep->setSize(vol_face.mVertices.size(), vol_face.mTriStrip.size()); + } + else + { + facep->setSize(vol_face.mVertices.size(), vol_face.mIndices.size()); + } } } @@ -1793,6 +1856,11 @@ void LLVOVolume::syncMediaData(S32 texture_index, const LLSD &media_data, bool m } LLTextureEntry *te = getTE(texture_index); + if(!te) + { + return ; + } + LL_DEBUGS("MediaOnAPrim") << "BEFORE: texture_index = " << texture_index << " hasMedia = " << te->hasMedia() << " : " << ((NULL == te->getMediaData()) ? "NULL MEDIA DATA" : ll_pretty_print_sd(te->getMediaData()->asLLSD())) << llendl; @@ -1910,9 +1978,13 @@ bool LLVOVolume::hasMediaPermission(const LLMediaEntry* media_entry, MediaPermTy } // Group permissions - else if (0 != (media_perms & LLMediaEntry::PERM_GROUP) && permGroupOwner()) + else if (0 != (media_perms & LLMediaEntry::PERM_GROUP)) { - return true; + LLPermissions* obj_perm = LLSelectMgr::getInstance()->findObjectPermissions(this); + if (obj_perm && gAgent.isInGroup(obj_perm->getGroup())) + { + return true; + } } // Owner permissions @@ -3212,6 +3284,11 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep, draw_info->mExtents[0] = facep->mExtents[0]; draw_info->mExtents[1] = facep->mExtents[1]; validate_draw_info(*draw_info); + + if (LLPipeline::sUseTriStrips) + { + draw_info->mDrawMode = LLRender::TRIANGLE_STRIP; + } } } @@ -3225,7 +3302,6 @@ static LLFastTimer::DeclareTimer FTM_REBUILD_VBO("VBO Rebuilt"); void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group) { - llpushcallstacks ; if (group->changeLOD()) { group->mLastUpdateDistance = group->mDistance; @@ -3296,7 +3372,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group) drawablep->updateFaceSize(i); LLFace* facep = drawablep->getFace(i); - if (cur_total > max_total) + if (cur_total > max_total || facep->getIndicesCount() <= 0 || facep->getGeomCount() <= 0) { facep->mVertexBuffer = NULL; facep->mLastVertexBuffer = NULL; @@ -3456,8 +3532,8 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group) static LLFastTimer::DeclareTimer FTM_VOLUME_GEOM("Volume Geometry"); void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group) { - llpushcallstacks ; - if (group->isState(LLSpatialGroup::MESH_DIRTY) && !group->isState(LLSpatialGroup::GEOM_DIRTY)) + llassert(group); + if (group && group->isState(LLSpatialGroup::MESH_DIRTY) && !group->isState(LLSpatialGroup::GEOM_DIRTY)) { LLFastTimer tm(FTM_VOLUME_GEOM); S32 num_mapped_veretx_buffer = LLVertexBuffer::sMappedCount ; @@ -3511,9 +3587,9 @@ void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group) } // don't forget alpha - if( group != NULL && - !group->mVertexBuffer.isNull() && - group->mVertexBuffer->isLocked()) + if(group != NULL && + !group->mVertexBuffer.isNull() && + group->mVertexBuffer->isLocked()) { group->mVertexBuffer->setBuffer(0); } @@ -3539,7 +3615,7 @@ void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group) group->clearState(LLSpatialGroup::MESH_DIRTY | LLSpatialGroup::NEW_DRAWINFO); } - if (group->isState(LLSpatialGroup::NEW_DRAWINFO)) + if (group && group->isState(LLSpatialGroup::NEW_DRAWINFO)) { llerrs << "WTF?" << llendl; } @@ -3547,7 +3623,6 @@ void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group) void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::vector<LLFace*>& faces, BOOL distance_sort) { - llpushcallstacks ; //calculate maximum number of vertices to store in a single buffer U32 max_vertices = (gSavedSettings.getS32("RenderMaxVBOSize")*1024)/LLVertexBuffer::calcStride(group->mSpatialPartition->mVertexDataMask); max_vertices = llmin(max_vertices, (U32) 65535); diff --git a/indra/newview/llvovolume.h b/indra/newview/llvovolume.h index a287d34402..a8bb597f93 100644 --- a/indra/newview/llvovolume.h +++ b/indra/newview/llvovolume.h @@ -179,8 +179,10 @@ public: /*virtual*/ BOOL setMaterial(const U8 material); void setTexture(const S32 face); - + S32 getIndexInTex() const {return mIndexInTex ;} /*virtual*/ BOOL setVolume(const LLVolumeParams &volume_params, const S32 detail, bool unique_volume = false); + void updateSculptTexture(); + void setIndexInTex(S32 index) { mIndexInTex = index ;} void sculpt(); void updateRelativeXform(); /*virtual*/ BOOL updateGeometry(LLDrawable *drawable); @@ -303,7 +305,7 @@ private: LLPointer<LLViewerFetchedTexture> mLightTexture; media_list_t mMediaImplList; S32 mLastFetchedMediaVersion; // as fetched from the server, starts as -1 - + S32 mIndexInTex; // statics public: static F32 sLODSlopDistanceFactor;// Changing this to zero, effectively disables the LOD transition slop diff --git a/indra/newview/llvowlsky.cpp b/indra/newview/llvowlsky.cpp index 0272a2ab34..1749ccef94 100644 --- a/indra/newview/llvowlsky.cpp +++ b/indra/newview/llvowlsky.cpp @@ -519,7 +519,7 @@ void LLVOWLSky::drawDome(void) LLRender::TRIANGLE_STRIP, 0, strips_segment->getRequestedVerts()-1, strips_segment->getRequestedIndices(), 0); - gPipeline.addTrianglesDrawn(strips_segment->getRequestedIndices() - 2); + gPipeline.addTrianglesDrawn(strips_segment->getRequestedIndices(), LLRender::TRIANGLE_STRIP); } #else diff --git a/indra/newview/llwaterparammanager.cpp b/indra/newview/llwaterparammanager.cpp index 8be8f494da..436cd478b4 100644 --- a/indra/newview/llwaterparammanager.cpp +++ b/indra/newview/llwaterparammanager.cpp @@ -54,6 +54,7 @@ #include "llviewercontrol.h" #include "lldrawpoolwater.h" #include "llagent.h" +#include "llagentcamera.h" #include "llviewerregion.h" #include "llwlparammanager.h" @@ -434,7 +435,7 @@ F32 LLWaterParamManager::getFogDensity(void) // modify if we're underwater const F32 water_height = gAgent.getRegion() ? gAgent.getRegion()->getWaterHeight() : 0.f; - F32 camera_height = gAgent.getCameraPositionAgent().mV[2]; + F32 camera_height = gAgentCamera.getCameraPositionAgent().mV[2]; if(camera_height <= water_height) { // raise it to the underwater fog density modifier diff --git a/indra/newview/llwearable.cpp b/indra/newview/llwearable.cpp index acfbc23f62..46c736c853 100644 --- a/indra/newview/llwearable.cpp +++ b/indra/newview/llwearable.cpp @@ -33,36 +33,64 @@ #include "llviewerprecompiledheaders.h" #include "llagent.h" +#include "llagentcamera.h" #include "llagentwearables.h" -#include "llfloatercustomize.h" +#include "lldictionary.h" #include "lllocaltextureobject.h" #include "llnotificationsutil.h" #include "llviewertexturelist.h" #include "llinventorymodel.h" #include "llinventoryobserver.h" +#include "llsidepanelappearance.h" +#include "llsidetray.h" +#include "lltexlayer.h" +#include "lltexglobalcolor.h" +#include "lltrans.h" #include "llviewerregion.h" +#include "llvisualparam.h" #include "llvoavatar.h" #include "llvoavatarself.h" #include "llvoavatardefines.h" #include "llwearable.h" -#include "lldictionary.h" -#include "lltrans.h" -#include "lltexlayer.h" -#include "llvisualparam.h" -#include "lltexglobalcolor.h" using namespace LLVOAvatarDefines; // static S32 LLWearable::sCurrentDefinitionVersion = 1; +// support class - remove for 2.1 (hackity hack hack) +class LLOverrideBakedTextureUpdate +{ +public: + LLOverrideBakedTextureUpdate(bool temp_state) + { + U32 num_bakes = (U32) LLVOAvatarDefines::BAKED_NUM_INDICES; + for( U32 index = 0; index < num_bakes; ++index ) + { + composite_enabled[index] = gAgentAvatarp->isCompositeUpdateEnabled(index); + } + gAgentAvatarp->setCompositeUpdatesEnabled(temp_state); + } + + ~LLOverrideBakedTextureUpdate() + { + U32 num_bakes = (U32)LLVOAvatarDefines::BAKED_NUM_INDICES; + for( U32 index = 0; index < num_bakes; ++index ) + { + gAgentAvatarp->setCompositeUpdatesEnabled(index, composite_enabled[index]); + } + } +private: + bool composite_enabled[LLVOAvatarDefines::BAKED_NUM_INDICES]; +}; + // Private local functions static std::string terse_F32_to_string(F32 f); static std::string asset_id_to_filename(const LLUUID &asset_id); LLWearable::LLWearable(const LLTransactionID& transaction_id) : mDefinitionVersion(LLWearable::sCurrentDefinitionVersion), - mType(WT_INVALID) + mType(LLWearableType::WT_INVALID) { mTransactionID = transaction_id; mAssetID = mTransactionID.makeAssetID(gAgent.getSecureSessionID()); @@ -70,7 +98,7 @@ LLWearable::LLWearable(const LLTransactionID& transaction_id) : LLWearable::LLWearable(const LLAssetID& asset_id) : mDefinitionVersion( LLWearable::sCurrentDefinitionVersion ), - mType(WT_INVALID) + mType(LLWearableType::WT_INVALID) { mAssetID = asset_id; mTransactionID.setNull(); @@ -82,17 +110,17 @@ LLWearable::~LLWearable() const std::string& LLWearable::getTypeLabel() const { - return LLWearableDictionary::getTypeLabel(mType); + return LLWearableType::getTypeLabel(mType); } const std::string& LLWearable::getTypeName() const { - return LLWearableDictionary::getTypeName(mType); + return LLWearableType::getTypeName(mType); } LLAssetType::EType LLWearable::getAssetType() const { - return LLWearableDictionary::getAssetType(mType); + return LLWearableType::getAssetType(mType); } BOOL LLWearable::exportFile(LLFILE* file) const @@ -176,10 +204,9 @@ BOOL LLWearable::exportFile(LLFILE* file) const void LLWearable::createVisualParams() { - LLVOAvatar* avatar = gAgent.getAvatarObject(); - for (LLViewerVisualParam* param = (LLViewerVisualParam*) avatar->getFirstVisualParam(); + for (LLViewerVisualParam* param = (LLViewerVisualParam*) gAgentAvatarp->getFirstVisualParam(); param; - param = (LLViewerVisualParam*) avatar->getNextVisualParam()) + param = (LLViewerVisualParam*) gAgentAvatarp->getNextVisualParam()) { if (param->getWearableType() == mType) { @@ -199,7 +226,7 @@ void LLWearable::createVisualParams() param->resetDrivenParams(); if(!param->linkDrivenParams(boost::bind(wearable_function,(LLWearable*)this, _1), false)) { - if( !param->linkDrivenParams(boost::bind(avatar_function,(LLVOAvatarSelf*)avatar,_1 ), true)) + if( !param->linkDrivenParams(boost::bind(avatar_function,gAgentAvatarp,_1 ), true)) { llwarns << "could not link driven params for wearable " << getName() << " id: " << param->getID() << llendl; continue; @@ -216,6 +243,10 @@ BOOL LLWearable::importFile( LLFILE* file ) char text_buffer[2048]; /* Flawfinder: ignore */ S32 fields_read = 0; + // suppress texlayerset updates while wearables are being imported. Layersets will be updated + // when the wearables are "worn", not loaded. Note state will be restored when this object is destroyed. + LLOverrideBakedTextureUpdate stop_bakes(false); + // read header and version fields_read = fscanf( file, "LLWearable version %d\n", &mDefinitionVersion ); if( fields_read != 1 ) @@ -334,13 +365,13 @@ BOOL LLWearable::importFile( LLFILE* file ) llwarns << "Bad Wearable asset: bad type" << llendl; return FALSE; } - if( 0 <= type && type < WT_COUNT ) + if( 0 <= type && type < LLWearableType::WT_COUNT ) { - setType((EWearableType)type); + setType((LLWearableType::EType)type); } else { - mType = WT_COUNT; + mType = LLWearableType::WT_COUNT; llwarns << "Bad Wearable asset: bad type #" << type << llendl; return FALSE; } @@ -413,6 +444,9 @@ BOOL LLWearable::importFile( LLFILE* file ) delete mSavedTEMap[te]; } + image->setLoadedCallback(LLVOAvatarSelf::debugOnTimingLocalTexLoaded,0,TRUE,FALSE, new LLVOAvatarSelf::LLAvatarTexData(id, (LLVOAvatarDefines::ETextureIndex)te)); + + LLUUID textureid(text_buffer); mTEMap[te] = new LLLocalTextureObject(image, textureid); mSavedTEMap[te] = new LLLocalTextureObject(image, textureid); @@ -431,12 +465,7 @@ BOOL LLWearable::importFile( LLFILE* file ) // since this wearable was created. BOOL LLWearable::isOldVersion() const { - LLVOAvatar* avatar = gAgent.getAvatarObject(); - llassert( avatar ); - if( !avatar ) - { - return FALSE; - } + if (!isAgentAvatarValid()) return FALSE; if( LLWearable::sCurrentDefinitionVersion < mDefinitionVersion ) { @@ -450,9 +479,9 @@ BOOL LLWearable::isOldVersion() const } S32 param_count = 0; - for( LLViewerVisualParam* param = (LLViewerVisualParam*) avatar->getFirstVisualParam(); + for( LLViewerVisualParam* param = (LLViewerVisualParam*) gAgentAvatarp->getFirstVisualParam(); param; - param = (LLViewerVisualParam*) avatar->getNextVisualParam() ) + param = (LLViewerVisualParam*) gAgentAvatarp->getNextVisualParam() ) { if( (param->getWearableType() == mType) && (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE ) ) { @@ -498,17 +527,11 @@ BOOL LLWearable::isOldVersion() const // only if those values are the same as the defaults. BOOL LLWearable::isDirty() const { - LLVOAvatar* avatar = gAgent.getAvatarObject(); - llassert( avatar ); - if( !avatar ) - { - return FALSE; - } + if (!isAgentAvatarValid()) return FALSE; - - for( LLViewerVisualParam* param = (LLViewerVisualParam*) avatar->getFirstVisualParam(); + for( LLViewerVisualParam* param = (LLViewerVisualParam*) gAgentAvatarp->getFirstVisualParam(); param; - param = (LLViewerVisualParam*) avatar->getNextVisualParam() ) + param = (LLViewerVisualParam*) gAgentAvatarp->getNextVisualParam() ) { if( (param->getWearableType() == mType) && (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE ) @@ -555,28 +578,15 @@ BOOL LLWearable::isDirty() const } } - //if( gFloaterCustomize ) - //{ - // if( mDescription != gFloaterCustomize->getWearableDescription( mType ) ) - // { - // return TRUE; - // } - //} - return FALSE; } void LLWearable::setParamsToDefaults() { - LLVOAvatar* avatar = gAgent.getAvatarObject(); - llassert( avatar ); - if( !avatar ) - { - return; - } + if (!isAgentAvatarValid()) return; - for( LLVisualParam* param = avatar->getFirstVisualParam(); param; param = avatar->getNextVisualParam() ) + for( LLVisualParam* param = gAgentAvatarp->getFirstVisualParam(); param; param = gAgentAvatarp->getNextVisualParam() ) { if( (((LLViewerVisualParam*)param)->getWearableType() == mType ) && (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE ) ) { @@ -612,18 +622,12 @@ void LLWearable::setTexturesToDefaults() // Updates the user's avatar's appearance void LLWearable::writeToAvatar() { - LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); - llassert( avatar ); - if( !avatar ) - { - llerrs << "could not get avatar object to write to for wearable " << this->getName() << llendl; - return; - } + if (!isAgentAvatarValid()) return; - ESex old_sex = avatar->getSex(); + ESex old_sex = gAgentAvatarp->getSex(); // Pull params - for( LLVisualParam* param = avatar->getFirstVisualParam(); param; param = avatar->getNextVisualParam() ) + for( LLVisualParam* param = gAgentAvatarp->getFirstVisualParam(); param; param = gAgentAvatarp->getNextVisualParam() ) { // cross-wearable parameters are not authoritative, as they are driven by a different wearable. So don't copy the values to the // avatar object if cross wearable. Cross wearable params get their values from the avatar, they shouldn't write the other way. @@ -632,7 +636,7 @@ void LLWearable::writeToAvatar() S32 param_id = param->getID(); F32 weight = getVisualParamWeight(param_id); - avatar->setVisualParamWeight( param_id, weight, FALSE ); + gAgentAvatarp->setVisualParamWeight( param_id, weight, FALSE ); } } @@ -652,15 +656,15 @@ void LLWearable::writeToAvatar() image_id = LLVOAvatarDictionary::getDefaultTextureImageID((ETextureIndex) te); } LLViewerTexture* image = LLViewerTextureManager::getFetchedTexture( image_id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE ); - // MULTI-WEARABLE: replace hard-coded 0 - avatar->setLocalTextureTE(te, image, 0); + // MULTI-WEARABLE: assume index 0 will be used when writing to avatar. TODO: eliminate the need for this. + gAgentAvatarp->setLocalTextureTE(te, image, 0); } } - ESex new_sex = avatar->getSex(); + ESex new_sex = gAgentAvatarp->getSex(); if( old_sex != new_sex ) { - avatar->updateSexDependentLayerSets( FALSE ); + gAgentAvatarp->updateSexDependentLayerSets( FALSE ); } // if( upload_bake ) @@ -672,41 +676,36 @@ void LLWearable::writeToAvatar() // Updates the user's avatar's appearance, replacing this wearables' parameters and textures with default values. // static -void LLWearable::removeFromAvatar( EWearableType type, BOOL upload_bake ) +void LLWearable::removeFromAvatar( LLWearableType::EType type, BOOL upload_bake ) { - LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); - llassert( avatar ); - if( !avatar ) - { - return; - } + if (!isAgentAvatarValid()) return; // You can't just remove body parts. - if( (type == WT_SHAPE) || - (type == WT_SKIN) || - (type == WT_HAIR) || - (type == WT_EYES) ) + if( (type == LLWearableType::WT_SHAPE) || + (type == LLWearableType::WT_SKIN) || + (type == LLWearableType::WT_HAIR) || + (type == LLWearableType::WT_EYES) ) { return; } // Pull params - for( LLVisualParam* param = avatar->getFirstVisualParam(); param; param = avatar->getNextVisualParam() ) + for( LLVisualParam* param = gAgentAvatarp->getFirstVisualParam(); param; param = gAgentAvatarp->getNextVisualParam() ) { if( (((LLViewerVisualParam*)param)->getWearableType() == type) && (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE ) ) { S32 param_id = param->getID(); - avatar->setVisualParamWeight( param_id, param->getDefaultWeight(), upload_bake ); + gAgentAvatarp->setVisualParamWeight( param_id, param->getDefaultWeight(), upload_bake ); } } - if( gFloaterCustomize ) + if( gAgentCamera.cameraCustomizeAvatar() ) { - gFloaterCustomize->setWearable(type, NULL, PERM_ALL, TRUE); + LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD().with("type", "edit_outfit")); } - avatar->updateVisualParams(); - avatar->wearableUpdated(type, TRUE); + gAgentAvatarp->updateVisualParams(); + gAgentAvatarp->wearableUpdated(type, FALSE); // if( upload_bake ) // { @@ -718,12 +717,7 @@ void LLWearable::removeFromAvatar( EWearableType type, BOOL upload_bake ) // Definition version is current: removes obsolete enties and creates default values for new ones. void LLWearable::copyDataFrom(const LLWearable* src) { - LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); - llassert( avatar ); - if( !avatar ) - { - return; - } + if (!isAgentAvatarValid()) return; mDefinitionVersion = LLWearable::sCurrentDefinitionVersion; @@ -736,9 +730,9 @@ void LLWearable::copyDataFrom(const LLWearable* src) mSavedVisualParamMap.clear(); // Deep copy of mVisualParamMap (copies only those params that are current, filling in defaults where needed) - for( LLViewerVisualParam* param = (LLViewerVisualParam*) avatar->getFirstVisualParam(); + for (LLViewerVisualParam* param = (LLViewerVisualParam*) gAgentAvatarp->getFirstVisualParam(); param; - param = (LLViewerVisualParam*) avatar->getNextVisualParam() ) + param = (LLViewerVisualParam*) gAgentAvatarp->getNextVisualParam() ) { if( (param->getWearableType() == mType) ) { @@ -750,7 +744,7 @@ void LLWearable::copyDataFrom(const LLWearable* src) destroyTextures(); // Deep copy of mTEMap (copies only those tes that are current, filling in defaults where needed) - for( S32 te = 0; te < TEX_NUM_INDICES; te++ ) + for (S32 te = 0; te < TEX_NUM_INDICES; te++) { if (LLVOAvatarDictionary::getTEWearableType((ETextureIndex) te) == mType) { @@ -759,12 +753,12 @@ void LLWearable::copyDataFrom(const LLWearable* src) LLViewerFetchedTexture *image = NULL; if(iter != src->mTEMap.end()) { - image = src->getConstLocalTextureObject(te)->getImage(); - image_id = src->getConstLocalTextureObject(te)->getID(); + image = src->getLocalTextureObject(te)->getImage(); + image_id = src->getLocalTextureObject(te)->getID(); mTEMap[te] = new LLLocalTextureObject(image, image_id); mSavedTEMap[te] = new LLLocalTextureObject(image, image_id); - mTEMap[te]->setBakedReady(src->getConstLocalTextureObject(te)->getBakedReady()); - mTEMap[te]->setDiscard(src->getConstLocalTextureObject(te)->getDiscard()); + mTEMap[te]->setBakedReady(src->getLocalTextureObject(te)->getBakedReady()); + mTEMap[te]->setDiscard(src->getLocalTextureObject(te)->getDiscard()); } else { @@ -792,7 +786,7 @@ const LLUUID& LLWearable::getItemID() const return mItemID; } -void LLWearable::setType(EWearableType type) +void LLWearable::setType(LLWearableType::EType type) { mType = type; createVisualParams(); @@ -809,7 +803,7 @@ LLLocalTextureObject* LLWearable::getLocalTextureObject(S32 index) return NULL; } -const LLLocalTextureObject* LLWearable::getConstLocalTextureObject(S32 index) const +const LLLocalTextureObject* LLWearable::getLocalTextureObject(S32 index) const { te_map_t::const_iterator iter = mTEMap.find(index); if( iter != mTEMap.end() ) @@ -843,14 +837,12 @@ void LLWearable::addVisualParam(LLVisualParam *param) void LLWearable::setVisualParams() { - LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); - for (visual_param_index_map_t::const_iterator iter = mVisualParamIndexMap.begin(); iter != mVisualParamIndexMap.end(); iter++) { S32 id = iter->first; LLVisualParam *wearable_param = iter->second; F32 value = wearable_param->getWeight(); - avatar->setVisualParamWeight(id, value, FALSE); + gAgentAvatarp->setVisualParamWeight(id, value, FALSE); } } @@ -978,9 +970,11 @@ void LLWearable::revertValues() syncImages(mSavedTEMap, mTEMap); - if( gFloaterCustomize ) + + LLSidepanelAppearance *panel = dynamic_cast<LLSidepanelAppearance*>(LLSideTray::getInstance()->getPanel("sidepanel_appearance")); + if( panel ) { - gFloaterCustomize->updateScrollingPanelList(TRUE); + panel->updateScrollingPanelList(); } } @@ -991,9 +985,8 @@ BOOL LLWearable::isOnTop() const void LLWearable::createLayers(S32 te) { - LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); - LLTexLayerSet *layer_set = avatar->getLayerSet((ETextureIndex)te); - if( layer_set ) + LLTexLayerSet *layer_set = gAgentAvatarp->getLayerSet((ETextureIndex)te); + if (layer_set) { layer_set->cloneTemplates(mTEMap[te], (ETextureIndex)te, this); } @@ -1018,9 +1011,11 @@ void LLWearable::saveValues() // Deep copy of mTEMap (copies only those tes that are current, filling in defaults where needed) syncImages(mTEMap, mSavedTEMap); - if( gFloaterCustomize ) + + LLSidepanelAppearance *panel = dynamic_cast<LLSidepanelAppearance*>(LLSideTray::getInstance()->getPanel("sidepanel_appearance")); + if( panel ) { - gFloaterCustomize->updateScrollingPanelList(TRUE); + panel->updateScrollingPanelList(); } } @@ -1090,10 +1085,9 @@ void LLWearable::destroyTextures() void LLWearable::pullCrossWearableValues() { // scan through all of the avatar's visual parameters - LLVOAvatar* avatar = gAgent.getAvatarObject(); - for (LLViewerVisualParam* param = (LLViewerVisualParam*) avatar->getFirstVisualParam(); + for (LLViewerVisualParam* param = (LLViewerVisualParam*) gAgentAvatarp->getFirstVisualParam(); param; - param = (LLViewerVisualParam*) avatar->getNextVisualParam()) + param = (LLViewerVisualParam*) gAgentAvatarp->getNextVisualParam()) { if( param ) { @@ -1125,7 +1119,7 @@ void LLWearable::refreshName() struct LLWearableSaveData { - EWearableType mType; + LLWearableType::EType mType; }; void LLWearable::saveNewAsset() const @@ -1188,7 +1182,7 @@ void LLWearable::saveNewAsset() const void LLWearable::onSaveNewAssetComplete(const LLUUID& new_asset_id, void* userdata, S32 status, LLExtStat ext_status) // StoreAssetData callback (fixed) { LLWearableSaveData* data = (LLWearableSaveData*)userdata; - const std::string& type_name = LLWearableDictionary::getTypeName(data->mType); + const std::string& type_name = LLWearableType::getTypeName(data->mType); if(0 == status) { // Success @@ -1214,7 +1208,7 @@ void LLWearable::onSaveNewAssetComplete(const LLUUID& new_asset_id, void* userda std::ostream& operator<<(std::ostream &s, const LLWearable &w) { - s << "wearable " << LLWearableDictionary::getTypeName(w.mType) << "\n"; + s << "wearable " << LLWearableType::getTypeName(w.mType) << "\n"; s << " Name: " << w.mName << "\n"; s << " Desc: " << w.mDescription << "\n"; //w.mPermissions diff --git a/indra/newview/llwearable.h b/indra/newview/llwearable.h index 7bd5305079..6b6067fd27 100644 --- a/indra/newview/llwearable.h +++ b/indra/newview/llwearable.h @@ -38,7 +38,7 @@ #include "llpermissions.h" #include "llsaleinfo.h" #include "llassetstorage.h" -#include "llwearabledictionary.h" +#include "llwearabletype.h" #include "llfile.h" #include "lllocaltextureobject.h" @@ -68,8 +68,8 @@ public: const LLUUID& getItemID() const; const LLAssetID& getAssetID() const { return mAssetID; } const LLTransactionID& getTransactionID() const { return mTransactionID; } - EWearableType getType() const { return mType; } - void setType(EWearableType type); + LLWearableType::EType getType() const { return mType; } + void setType(LLWearableType::EType type); const std::string& getName() const { return mName; } void setName(const std::string& name) { mName = name; } const std::string& getDescription() const { return mDescription; } @@ -81,7 +81,6 @@ public: const std::string& getTypeLabel() const; const std::string& getTypeName() const; LLAssetType::EType getAssetType() const; - LLLocalTextureObject* getLocalTextureObject(S32 index) const; S32 getDefinitionVersion() const { return mDefinitionVersion; } void setDefinitionVersion( S32 new_version ) { mDefinitionVersion = new_version; } @@ -93,7 +92,7 @@ public: void writeToAvatar(); void removeFromAvatar( BOOL upload_bake ) { LLWearable::removeFromAvatar( mType, upload_bake ); } - static void removeFromAvatar( EWearableType type, BOOL upload_bake ); + static void removeFromAvatar( LLWearableType::EType type, BOOL upload_bake ); BOOL exportFile(LLFILE* file) const; BOOL importFile(LLFILE* file); @@ -112,7 +111,7 @@ public: void setItemID(const LLUUID& item_id); LLLocalTextureObject* getLocalTextureObject(S32 index); - const LLLocalTextureObject* getConstLocalTextureObject(S32 index) const; + const LLLocalTextureObject* getLocalTextureObject(S32 index) const; void setLocalTextureObject(S32 index, LLLocalTextureObject <o); void addVisualParam(LLVisualParam *param); @@ -156,7 +155,7 @@ private: LLSaleInfo mSaleInfo; LLAssetID mAssetID; LLTransactionID mTransactionID; - EWearableType mType; + LLWearableType::EType mType; typedef std::map<S32, F32> param_map_t; param_map_t mSavedVisualParamMap; // last saved version of visual params diff --git a/indra/newview/llwearableitemslist.cpp b/indra/newview/llwearableitemslist.cpp new file mode 100644 index 0000000000..9c308359fa --- /dev/null +++ b/indra/newview/llwearableitemslist.cpp @@ -0,0 +1,768 @@ +/** + * @file llwearableitemslist.cpp + * @brief A flat list of wearable items. + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llwearableitemslist.h" + +#include "lliconctrl.h" + +#include "llagentwearables.h" +#include "llappearancemgr.h" +#include "llinventoryfunctions.h" +#include "llmenugl.h" // for LLContextMenu +#include "lltransutil.h" +#include "llviewerattachmenu.h" +#include "llvoavatarself.h" + +class LLFindOutfitItems : public LLInventoryCollectFunctor +{ +public: + LLFindOutfitItems() {} + virtual ~LLFindOutfitItems() {} + virtual bool operator()(LLInventoryCategory* cat, + LLInventoryItem* item); +}; + +bool LLFindOutfitItems::operator()(LLInventoryCategory* cat, + LLInventoryItem* item) +{ + if(item) + { + if((item->getType() == LLAssetType::AT_CLOTHING) + || (item->getType() == LLAssetType::AT_BODYPART) + || (item->getType() == LLAssetType::AT_OBJECT)) + { + return TRUE; + } + } + return FALSE; +} + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +void LLPanelWearableListItem::onMouseEnter(S32 x, S32 y, MASK mask) +{ + LLPanelInventoryListItemBase::onMouseEnter(x, y, mask); + setWidgetsVisible(true); + reshapeWidgets(); +} + +void LLPanelWearableListItem::onMouseLeave(S32 x, S32 y, MASK mask) +{ + LLPanelInventoryListItemBase::onMouseLeave(x, y, mask); + setWidgetsVisible(false); + reshapeWidgets(); +} + +LLPanelWearableListItem::LLPanelWearableListItem(LLViewerInventoryItem* item) +: LLPanelInventoryListItemBase(item) +{ +} + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +// static +LLPanelWearableOutfitItem* LLPanelWearableOutfitItem::create(LLViewerInventoryItem* item) +{ + LLPanelWearableOutfitItem* list_item = NULL; + if (item) + { + list_item = new LLPanelWearableOutfitItem(item); + list_item->init(); + } + return list_item; +} + +LLPanelWearableOutfitItem::LLPanelWearableOutfitItem(LLViewerInventoryItem* item) +: LLPanelInventoryListItemBase(item) +{ +} + +// virtual +void LLPanelWearableOutfitItem::updateItem(const std::string& name, + const LLStyle::Params& input_params) +{ + std::string search_label = name; + LLStyle::Params style_params = input_params; + + if (mItem && get_is_item_worn(mItem->getUUID())) + { + search_label += LLTrans::getString("worn"); + style_params.font.style("BOLD"); + } + + LLPanelInventoryListItemBase::updateItem(search_label, style_params); +} + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +// static +LLPanelClothingListItem* LLPanelClothingListItem::create(LLViewerInventoryItem* item) +{ + LLPanelClothingListItem* list_item = NULL; + if(item) + { + list_item = new LLPanelClothingListItem(item); + list_item->init(); + } + return list_item; +} + +LLPanelClothingListItem::LLPanelClothingListItem(LLViewerInventoryItem* item) + : LLPanelDeletableWearableListItem(item) +{ +} + +LLPanelClothingListItem::~LLPanelClothingListItem() +{ +} + +void LLPanelClothingListItem::init() +{ + LLUICtrlFactory::getInstance()->buildPanel(this, "panel_clothing_list_item.xml"); +} + +BOOL LLPanelClothingListItem::postBuild() +{ + LLPanelDeletableWearableListItem::postBuild(); + + addWidgetToRightSide("btn_move_up"); + addWidgetToRightSide("btn_move_down"); + addWidgetToRightSide("btn_lock"); + addWidgetToRightSide("btn_edit_panel"); + + setWidgetsVisible(false); + reshapeWidgets(); + + return TRUE; +} + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +// static +LLPanelBodyPartsListItem* LLPanelBodyPartsListItem::create(LLViewerInventoryItem* item) +{ + LLPanelBodyPartsListItem* list_item = NULL; + if(item) + { + list_item = new LLPanelBodyPartsListItem(item); + list_item->init(); + } + return list_item; +} + +LLPanelBodyPartsListItem::LLPanelBodyPartsListItem(LLViewerInventoryItem* item) +: LLPanelWearableListItem(item) +{ +} + +LLPanelBodyPartsListItem::~LLPanelBodyPartsListItem() +{ +} + +void LLPanelBodyPartsListItem::init() +{ + LLUICtrlFactory::getInstance()->buildPanel(this, "panel_body_parts_list_item.xml"); +} + +BOOL LLPanelBodyPartsListItem::postBuild() +{ + LLPanelInventoryListItemBase::postBuild(); + + addWidgetToRightSide("btn_lock"); + addWidgetToRightSide("btn_edit_panel"); + + return TRUE; +} + + +// static +LLPanelDeletableWearableListItem* LLPanelDeletableWearableListItem::create(LLViewerInventoryItem* item) +{ + LLPanelDeletableWearableListItem* list_item = NULL; + if(item) + { + list_item = new LLPanelDeletableWearableListItem(item); + list_item->init(); + } + return list_item; +} + +LLPanelDeletableWearableListItem::LLPanelDeletableWearableListItem(LLViewerInventoryItem* item) +: LLPanelWearableListItem(item) +{ +} + +void LLPanelDeletableWearableListItem::init() +{ + LLUICtrlFactory::getInstance()->buildPanel(this, "panel_deletable_wearable_list_item.xml"); +} + +BOOL LLPanelDeletableWearableListItem::postBuild() +{ + LLPanelWearableListItem::postBuild(); + + addWidgetToLeftSide("btn_delete"); + + LLButton* delete_btn = getChild<LLButton>("btn_delete"); + // Reserve space for 'delete' button event if it is invisible. + setLeftWidgetsWidth(delete_btn->getRect().mRight); + + setWidgetsVisible(false); + reshapeWidgets(); + + return TRUE; +} + + +// static +LLPanelAttachmentListItem* LLPanelAttachmentListItem::create(LLViewerInventoryItem* item) +{ + LLPanelAttachmentListItem* list_item = NULL; + if(item) + { + list_item = new LLPanelAttachmentListItem(item); + list_item->init(); + } + return list_item; +} + +void LLPanelAttachmentListItem::setTitle(const std::string& title, + const std::string& highlit_text, + const LLStyle::Params& input_params) +{ + std::string title_joint = title; + + if (mItem && isAgentAvatarValid() && gAgentAvatarp->isWearingAttachment(mItem->getLinkedUUID())) + { + std::string joint = LLTrans::getString(gAgentAvatarp->getAttachedPointName(mItem->getLinkedUUID())); + title_joint = title + " (" + joint + ")"; + } + + LLPanelDeletableWearableListItem::setTitle(title_joint, highlit_text, input_params); +} + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +LLPanelDummyClothingListItem* LLPanelDummyClothingListItem::create(LLWearableType::EType w_type) +{ + LLPanelDummyClothingListItem* list_item = new LLPanelDummyClothingListItem(w_type); + list_item->init(); + return list_item; +} + +BOOL LLPanelDummyClothingListItem::postBuild() +{ + LLIconCtrl* icon = getChild<LLIconCtrl>("item_icon"); + setIconCtrl(icon); + setTitleCtrl(getChild<LLTextBox>("item_name")); + + addWidgetToRightSide("btn_add_panel"); + + setIconImage(LLInventoryIcon::getIcon(LLAssetType::AT_CLOTHING, LLInventoryType::IT_NONE, mWearableType, FALSE)); + updateItem(wearableTypeToString(mWearableType)); + + // Make it look loke clothing item - reserve space for 'delete' button + setLeftWidgetsWidth(icon->getRect().mLeft); + + setWidgetsVisible(false); + reshapeWidgets(); + + return TRUE; +} + +LLWearableType::EType LLPanelDummyClothingListItem::getWearableType() const +{ + return mWearableType; +} + +LLPanelDummyClothingListItem::LLPanelDummyClothingListItem(LLWearableType::EType w_type) + : LLPanelWearableListItem(NULL) + , mWearableType(w_type) +{ +} + +void LLPanelDummyClothingListItem::init() +{ + LLUICtrlFactory::getInstance()->buildPanel(this, "panel_dummy_clothing_list_item.xml"); +} + +typedef std::map<LLWearableType::EType, std::string> clothing_to_string_map_t; + +clothing_to_string_map_t init_clothing_string_map() +{ + clothing_to_string_map_t w_map; + w_map.insert(std::make_pair(LLWearableType::WT_SHIRT, "shirt_not_worn")); + w_map.insert(std::make_pair(LLWearableType::WT_PANTS, "pants_not_worn")); + w_map.insert(std::make_pair(LLWearableType::WT_SHOES, "shoes_not_worn")); + w_map.insert(std::make_pair(LLWearableType::WT_SOCKS, "socks_not_worn")); + w_map.insert(std::make_pair(LLWearableType::WT_JACKET, "jacket_not_worn")); + w_map.insert(std::make_pair(LLWearableType::WT_GLOVES, "gloves_not_worn")); + w_map.insert(std::make_pair(LLWearableType::WT_UNDERSHIRT, "undershirt_not_worn")); + w_map.insert(std::make_pair(LLWearableType::WT_UNDERPANTS, "underpants_not_worn")); + w_map.insert(std::make_pair(LLWearableType::WT_SKIRT, "skirt_not_worn")); + w_map.insert(std::make_pair(LLWearableType::WT_ALPHA, "alpha_not_worn")); + w_map.insert(std::make_pair(LLWearableType::WT_TATTOO, "tattoo_not_worn")); + return w_map; +} + +std::string LLPanelDummyClothingListItem::wearableTypeToString(LLWearableType::EType w_type) +{ + static const clothing_to_string_map_t w_map = init_clothing_string_map(); + static const std::string invalid_str = LLTrans::getString("invalid_not_worn"); + + std::string type_str = invalid_str; + clothing_to_string_map_t::const_iterator it = w_map.find(w_type); + if(w_map.end() != it) + { + type_str = LLTrans::getString(it->second); + } + return type_str; +} + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +/*virtual*/ +bool LLWearableItemNameComparator::doCompare(const LLPanelInventoryListItemBase* wearable_item1, const LLPanelInventoryListItemBase* wearable_item2) const +{ + std::string name1 = wearable_item1->getItemName(); + std::string name2 = wearable_item2->getItemName(); + + LLStringUtil::toUpper(name1); + LLStringUtil::toUpper(name2); + + return name1 < name2; +} + +/*virtual*/ +bool LLWearableItemTypeNameComparator::doCompare(const LLPanelInventoryListItemBase* wearable_item1, const LLPanelInventoryListItemBase* wearable_item2) const +{ + const LLAssetType::EType item_type1 = wearable_item1->getType(); + const LLAssetType::EType item_type2 = wearable_item2->getType(); + + LLWearableItemTypeNameComparator::ETypeListOrder item_type_order1 = getTypeListOrder(item_type1); + LLWearableItemTypeNameComparator::ETypeListOrder item_type_order2 = getTypeListOrder(item_type2); + + if (item_type_order1 != item_type_order2) + { + // If items are of different asset types we can compare them + // by types order in the list. + return item_type_order1 < item_type_order2; + } + + if (item_type_order1 & TLO_NOT_CLOTHING) + { + // If both items are of the same asset type except AT_CLOTHING + // we can compare them by name. + return LLWearableItemNameComparator::doCompare(wearable_item1, wearable_item2); + } + + const LLWearableType::EType item_wearable_type1 = wearable_item1->getWearableType(); + const LLWearableType::EType item_wearable_type2 = wearable_item2->getWearableType(); + + if (item_wearable_type1 != item_wearable_type2) + { + // If items are of different clothing types they are compared + // by clothing types order determined in LLWearableType::EType. + return item_wearable_type1 < item_wearable_type2; + } + else + { + // If both items are of the same clothing type they are compared + // by description and place in reverse order i.e. outer layer item + // on top. + return wearable_item1->getDescription() > wearable_item2->getDescription(); + } +} + +// static +LLWearableItemTypeNameComparator::ETypeListOrder LLWearableItemTypeNameComparator::getTypeListOrder(LLAssetType::EType item_type) +{ + switch (item_type) + { + case LLAssetType::AT_OBJECT: + return TLO_ATTACHMENT; + + case LLAssetType::AT_CLOTHING: + return TLO_CLOTHING; + + case LLAssetType::AT_BODYPART: + return TLO_BODYPART; + + default: + return TLO_UNKNOWN; + } +} + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +static const LLWearableItemTypeNameComparator WEARABLE_TYPE_NAME_COMPARATOR; + +static const LLDefaultChildRegistry::Register<LLWearableItemsList> r("wearable_items_list"); + +LLWearableItemsList::Params::Params() +: standalone("standalone", true) +{} + +LLWearableItemsList::LLWearableItemsList(const LLWearableItemsList::Params& p) +: LLInventoryItemsList(p) +{ + setComparator(&WEARABLE_TYPE_NAME_COMPARATOR); + mIsStandalone = p.standalone; + if (mIsStandalone) + { + // Use built-in context menu. + setRightMouseDownCallback(boost::bind(&LLWearableItemsList::onRightClick, this, _2, _3)); + } +} + +// virtual +LLWearableItemsList::~LLWearableItemsList() +{} + +// virtual +void LLWearableItemsList::addNewItem(LLViewerInventoryItem* item, bool rearrange /*= true*/) +{ + if (!item) + { + llwarns << "No inventory item. Couldn't create flat list item." << llendl; + llassert(item != NULL); + } + + LLPanelWearableOutfitItem *list_item = LLPanelWearableOutfitItem::create(item); + if (!list_item) + return; + + bool is_item_added = addItem(list_item, item->getUUID(), ADD_BOTTOM, rearrange); + if (!is_item_added) + { + llwarns << "Couldn't add flat list item." << llendl; + llassert(is_item_added); + } +} + +void LLWearableItemsList::updateList(const LLUUID& category_id) +{ + LLInventoryModel::cat_array_t cat_array; + LLInventoryModel::item_array_t item_array; + + LLFindOutfitItems collector = LLFindOutfitItems(); + // collectDescendentsIf takes non-const reference: + gInventory.collectDescendentsIf( + category_id, + cat_array, + item_array, + LLInventoryModel::EXCLUDE_TRASH, + collector); + + refreshList(item_array); +} + +void LLWearableItemsList::updateChangedItems(const LLInventoryModel::changed_items_t& changed_items_uuids) +{ + typedef std::vector<LLPanel*> item_panel_list_t; + + item_panel_list_t items; + getItems(items); + + for (item_panel_list_t::iterator items_iter = items.begin(); + items_iter != items.end(); + ++items_iter) + { + LLPanelInventoryListItemBase* item = dynamic_cast<LLPanelInventoryListItemBase*>(*items_iter); + if (!item) continue; + + LLViewerInventoryItem* inv_item = item->getItem(); + if (!inv_item) continue; + + LLUUID linked_uuid = inv_item->getLinkedUUID(); + + for (LLInventoryModel::changed_items_t::const_iterator iter = changed_items_uuids.begin(); + iter != changed_items_uuids.end(); + ++iter) + { + if (linked_uuid == *iter) + { + item->setNeedsRefresh(true); + } + } + } +} + +void LLWearableItemsList::onRightClick(S32 x, S32 y) +{ + uuid_vec_t selected_uuids; + + getSelectedUUIDs(selected_uuids); + if (selected_uuids.empty()) + { + return; + } + + ContextMenu::instance().show(this, selected_uuids, x, y); +} + +////////////////////////////////////////////////////////////////////////// +/// ContextMenu +////////////////////////////////////////////////////////////////////////// + +LLWearableItemsList::ContextMenu::ContextMenu() +: mParent(NULL) +{ +} + +void LLWearableItemsList::ContextMenu::show(LLView* spawning_view, const uuid_vec_t& uuids, S32 x, S32 y) +{ + mParent = dynamic_cast<LLWearableItemsList*>(spawning_view); + LLListContextMenu::show(spawning_view, uuids, x, y); + mParent = NULL; // to avoid dereferencing an invalid pointer +} + +// virtual +LLContextMenu* LLWearableItemsList::ContextMenu::createMenu() +{ + LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar; + const uuid_vec_t& ids = mUUIDs; // selected items IDs + LLUUID selected_id = ids.front(); // ID of the first selected item + + functor_t wear = boost::bind(&LLAppearanceMgr::wearItemOnAvatar, LLAppearanceMgr::getInstance(), _1, true, true); + functor_t add = boost::bind(&LLAppearanceMgr::wearItemOnAvatar, LLAppearanceMgr::getInstance(), _1, true, false); + functor_t take_off = boost::bind(&LLAppearanceMgr::removeItemFromAvatar, LLAppearanceMgr::getInstance(), _1); + + // Register handlers common for all wearable types. + registrar.add("Wearable.Wear", boost::bind(handleMultiple, wear, ids)); + registrar.add("Wearable.Add", boost::bind(handleMultiple, add, ids)); + registrar.add("Wearable.Edit", boost::bind(handleMultiple, LLAgentWearables::editWearable, ids)); + registrar.add("Wearable.CreateNew", boost::bind(createNewWearable, selected_id)); + registrar.add("Wearable.ShowOriginal", boost::bind(show_item_original, selected_id)); + registrar.add("Wearable.TakeOffDetach", boost::bind(handleMultiple, take_off, ids)); + + // Register handlers for clothing. + registrar.add("Clothing.TakeOff", boost::bind(handleMultiple, take_off, ids)); + + // Register handlers for body parts. + + // Register handlers for attachments. + registrar.add("Attachment.Detach", boost::bind(handleMultiple, take_off, ids)); + registrar.add("Attachment.Profile", boost::bind(show_item_profile, selected_id)); + registrar.add("Object.Attach", boost::bind(LLViewerAttachMenu::attachObjects, ids, _2)); + + // Create the menu. + LLContextMenu* menu = createFromFile("menu_wearable_list_item.xml"); + + // Determine which items should be visible/enabled. + updateItemsVisibility(menu); + + // Update labels for the items requiring that. + updateItemsLabels(menu); + return menu; +} + +void LLWearableItemsList::ContextMenu::updateItemsVisibility(LLContextMenu* menu) +{ + if (!menu) + { + llwarns << "Invalid menu" << llendl; + return; + } + + const uuid_vec_t& ids = mUUIDs; // selected items IDs + U32 mask = 0; // mask of selected items' types + U32 n_items = ids.size(); // number of selected items + U32 n_worn = 0; // number of worn items among the selected ones + U32 n_links = 0; // number of links among the selected items + U32 n_editable = 0; // number of editable items among the selected ones + + for (uuid_vec_t::const_iterator it = ids.begin(); it != ids.end(); ++it) + { + LLUUID id = *it; + LLViewerInventoryItem* item = gInventory.getItem(id); + + if (!item) + { + llwarns << "Invalid item" << llendl; + // *NOTE: the logic below may not work in this case + continue; + } + + updateMask(mask, item->getType()); + + bool is_link = item->getIsLinkType(); + bool is_worn = get_is_item_worn(id); + bool is_editable = gAgentWearables.isWearableModifiable(id); + + if (is_worn) + { + ++n_worn; + } + if (is_editable) + { + ++n_editable; + } + if (is_link) + { + ++n_links; + } + } // for + + bool standalone = mParent ? mParent->isStandalone() : false; + + // *TODO: eliminate multiple traversals over the menu items + setMenuItemVisible(menu, "wear_add", mask == MASK_CLOTHING && n_worn == 0); + setMenuItemEnabled(menu, "wear_add", n_items == 1 && canAddWearable(ids.front())); + setMenuItemVisible(menu, "wear", n_worn == 0); + setMenuItemVisible(menu, "edit", !standalone && mask & (MASK_CLOTHING|MASK_BODYPART)); + setMenuItemEnabled(menu, "edit", n_editable == 1 && n_worn == 1 && n_items == 1); + setMenuItemVisible(menu, "create_new", mask & (MASK_CLOTHING|MASK_BODYPART) && n_items == 1); + setMenuItemVisible(menu, "show_original", !standalone); + setMenuItemEnabled(menu, "show_original", n_items == 1 && n_links == n_items); + setMenuItemVisible(menu, "take_off", mask == MASK_CLOTHING && n_worn == n_items); + setMenuItemVisible(menu, "detach", mask == MASK_ATTACHMENT && n_worn == n_items); + setMenuItemVisible(menu, "take_off_or_detach", mask == (MASK_ATTACHMENT|MASK_CLOTHING)); + setMenuItemEnabled(menu, "take_off_or_detach", n_worn == n_items); + setMenuItemVisible(menu, "object_profile", !standalone); + setMenuItemEnabled(menu, "object_profile", n_items == 1); + + // Populate or hide the "Attach to..." / "Attach to HUD..." submenus. + if (mask == MASK_ATTACHMENT && n_worn == 0) + { + LLViewerAttachMenu::populateMenus("wearable_attach_to", "wearable_attach_to_hud"); + } + else + { + setMenuItemVisible(menu, "wearable_attach_to", false); + setMenuItemVisible(menu, "wearable_attach_to_hud", false); + } + + if (mask & MASK_UNKNOWN) + { + llwarns << "Non-wearable items passed." << llendl; + } +} + +void LLWearableItemsList::ContextMenu::updateItemsLabels(LLContextMenu* menu) +{ + llassert(menu); + if (!menu) return; + + // Set proper label for the "Create new <WEARABLE_TYPE>" menu item. + LLViewerInventoryItem* item = gInventory.getLinkedItem(mUUIDs.back()); + if (!item || !item->isWearableType()) return; + + LLStringUtil::format_map_t args; + LLWearableType::EType w_type = item->getWearableType(); + args["[WEARABLE_TYPE]"] = LLWearableType::getTypeDefaultNewName(w_type); + std::string new_label = LLTrans::getString("CreateNewWearable", args); + + LLMenuItemGL* menu_item = menu->getChild<LLMenuItemGL>("create_new"); + menu_item->setLabel(new_label); +} + +// We need this method to convert non-zero BOOL values to exactly 1 (TRUE). +// Otherwise code relying on a BOOL value being TRUE may fail +// (I experienced a weird assert in LLView::drawChildren() because of that. +// static +void LLWearableItemsList::ContextMenu::setMenuItemVisible(LLContextMenu* menu, const std::string& name, bool val) +{ + menu->setItemVisible(name, val); +} + +// static +void LLWearableItemsList::ContextMenu::setMenuItemEnabled(LLContextMenu* menu, const std::string& name, bool val) +{ + menu->setItemEnabled(name, val); +} + +// static +void LLWearableItemsList::ContextMenu::updateMask(U32& mask, LLAssetType::EType at) +{ + if (at == LLAssetType::AT_CLOTHING) + { + mask |= MASK_CLOTHING; + } + else if (at == LLAssetType::AT_BODYPART) + { + mask |= MASK_BODYPART; + } + else if (at == LLAssetType::AT_OBJECT) + { + mask |= MASK_ATTACHMENT; + } + else + { + mask |= MASK_UNKNOWN; + } +} + +// static +void LLWearableItemsList::ContextMenu::createNewWearable(const LLUUID& item_id) +{ + LLViewerInventoryItem* item = gInventory.getLinkedItem(item_id); + if (!item || !item->isWearableType()) return; + + LLAgentWearables::createWearable(item->getWearableType(), true); +} + +// Can we wear another wearable of the given item's wearable type? +// static +bool LLWearableItemsList::ContextMenu::canAddWearable(const LLUUID& item_id) +{ + if (!gAgentWearables.areWearablesLoaded()) + { + return false; + } + + LLViewerInventoryItem* item = gInventory.getItem(item_id); + if (!item || item->getType() != LLAssetType::AT_CLOTHING) + { + return false; + } + + U32 wearable_count = gAgentWearables.getWearableCount(item->getWearableType()); + return wearable_count < LLAgentWearables::MAX_CLOTHING_PER_TYPE; +} + +// EOF diff --git a/indra/newview/llwearableitemslist.h b/indra/newview/llwearableitemslist.h new file mode 100644 index 0000000000..5dc06284c3 --- /dev/null +++ b/indra/newview/llwearableitemslist.h @@ -0,0 +1,382 @@ +/** + * @file llwearableitemslist.h + * @brief A flat list of wearable items. + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLWEARABLEITEMSLIST_H +#define LL_LLWEARABLEITEMSLIST_H + +// libs +#include "llpanel.h" +#include "llsingleton.h" + +// newview +#include "llinventoryitemslist.h" +#include "llinventorymodel.h" +#include "lllistcontextmenu.h" +#include "llwearabletype.h" + +/** + * @class LLPanelWearableListItem + * + * Extends LLPanelInventoryListItemBase: + * - makes side widgets show on mouse_enter and hide on + * mouse_leave events. + * - provides callback for button clicks + */ +class LLPanelWearableListItem : public LLPanelInventoryListItemBase +{ + LOG_CLASS(LLPanelWearableListItem); +public: + + /** + * Shows buttons when mouse is over + */ + /*virtual*/ void onMouseEnter(S32 x, S32 y, MASK mask); + + /** + * Hides buttons when mouse is out + */ + /*virtual*/ void onMouseLeave(S32 x, S32 y, MASK mask); + +protected: + + LLPanelWearableListItem(LLViewerInventoryItem* item); +}; + +/** + * @class LLPanelWearableOutfitItem + * + * Outfit item for "My Outfits" list. + * Extends LLPanelInventoryListItemBase with handling + * double click to wear the item. + */ +class LLPanelWearableOutfitItem : public LLPanelInventoryListItemBase +{ + LOG_CLASS(LLPanelWearableOutfitItem); +public: + static LLPanelWearableOutfitItem* create(LLViewerInventoryItem* item); + + /** + * Updates item name and (worn) suffix. + */ + /*virtual*/ void updateItem(const std::string& name, + const LLStyle::Params& input_params = LLStyle::Params()); + +protected: + LLPanelWearableOutfitItem(LLViewerInventoryItem* item); +}; + +class LLPanelDeletableWearableListItem : public LLPanelWearableListItem +{ + LOG_CLASS(LLPanelDeletableWearableListItem); +public: + + static LLPanelDeletableWearableListItem* create(LLViewerInventoryItem* item); + + virtual ~LLPanelDeletableWearableListItem() {}; + + /*virtual*/ BOOL postBuild(); + + /** + * Make button visible during mouse over event. + */ + inline void setShowDeleteButton(bool show) { setShowWidget("btn_delete", show); } + +protected: + LLPanelDeletableWearableListItem(LLViewerInventoryItem* item); + + /*virtual*/ void init(); +}; + +/** Outfit list item for an attachment */ +class LLPanelAttachmentListItem : public LLPanelDeletableWearableListItem +{ + LOG_CLASS(LLPanelAttachmentListItem); +public: + static LLPanelAttachmentListItem* create(LLViewerInventoryItem* item); + virtual ~LLPanelAttachmentListItem() {}; + + /** Set item title. Joint name is added to the title in parenthesis */ + /*virtual*/ void setTitle(const std::string& title, + const std::string& highlit_text, + const LLStyle::Params& input_params = LLStyle::Params()); + +protected: + LLPanelAttachmentListItem(LLViewerInventoryItem* item) : LLPanelDeletableWearableListItem(item) {}; +}; + +/** + * @class LLPanelClothingListItem + * + * Provides buttons for editing, moving, deleting a wearable. + */ +class LLPanelClothingListItem : public LLPanelDeletableWearableListItem +{ + LOG_CLASS(LLPanelClothingListItem); +public: + + static LLPanelClothingListItem* create(LLViewerInventoryItem* item); + + virtual ~LLPanelClothingListItem(); + + /*virtual*/ BOOL postBuild(); + + /** + * Make button visible during mouse over event. + */ + inline void setShowMoveUpButton(bool show) { setShowWidget("btn_move_up", show); } + + inline void setShowMoveDownButton(bool show) { setShowWidget("btn_move_down", show); } + inline void setShowLockButton(bool show) { setShowWidget("btn_lock", show); } + inline void setShowEditButton(bool show) { setShowWidget("btn_edit_panel", show); } + + +protected: + + LLPanelClothingListItem(LLViewerInventoryItem* item); + + /*virtual*/ void init(); +}; + +class LLPanelBodyPartsListItem : public LLPanelWearableListItem +{ + LOG_CLASS(LLPanelBodyPartsListItem); +public: + + static LLPanelBodyPartsListItem* create(LLViewerInventoryItem* item); + + virtual ~LLPanelBodyPartsListItem(); + + /*virtual*/ BOOL postBuild(); + + /** + * Make button visible during mouse over event. + */ + inline void setShowLockButton(bool show) { setShowWidget("btn_lock", show); } + inline void setShowEditButton(bool show) { setShowWidget("btn_edit_panel", show); } + +protected: + LLPanelBodyPartsListItem(LLViewerInventoryItem* item); + + /*virtual*/ void init(); +}; + + +/** + * @class LLPanelDummyClothingListItem + * + * A dummy item panel - displays grayed clothing icon, grayed title '<clothing> not worn' and 'add' button + */ +class LLPanelDummyClothingListItem : public LLPanelWearableListItem +{ +public: + static LLPanelDummyClothingListItem* create(LLWearableType::EType w_type); + + /*virtual*/ BOOL postBuild(); + LLWearableType::EType getWearableType() const; + +protected: + LLPanelDummyClothingListItem(LLWearableType::EType w_type); + + /*virtual*/ void init(); + + static std::string wearableTypeToString(LLWearableType::EType w_type); + +private: + LLWearableType::EType mWearableType; +}; + +/** + * @class LLWearableListItemComparator + * + * Abstract comparator of wearable list items. + */ +class LLWearableListItemComparator : public LLFlatListView::ItemComparator +{ + LOG_CLASS(LLWearableListItemComparator); + +public: + LLWearableListItemComparator() {}; + virtual ~LLWearableListItemComparator() {}; + + virtual bool compare(const LLPanel* item1, const LLPanel* item2) const + { + const LLPanelInventoryListItemBase* wearable_item1 = dynamic_cast<const LLPanelInventoryListItemBase*>(item1); + const LLPanelInventoryListItemBase* wearable_item2 = dynamic_cast<const LLPanelInventoryListItemBase*>(item2); + + if (!wearable_item1 || !wearable_item2) + { + llwarning("item1 and item2 cannot be null", 0); + return true; + } + + return doCompare(wearable_item1, wearable_item2); + } + +protected: + + /** + * Returns true if wearable_item1 < wearable_item2, false otherwise + * Implement this method in your particular comparator. + */ + virtual bool doCompare(const LLPanelInventoryListItemBase* wearable_item1, const LLPanelInventoryListItemBase* wearable_item2) const = 0; +}; + +/** + * @class LLWearableItemNameComparator + * + * Comparator for sorting wearable list items by name. + */ +class LLWearableItemNameComparator : public LLWearableListItemComparator +{ + LOG_CLASS(LLWearableItemNameComparator); + +public: + LLWearableItemNameComparator() {}; + virtual ~LLWearableItemNameComparator() {}; + +protected: + /*virtual*/ bool doCompare(const LLPanelInventoryListItemBase* wearable_item1, const LLPanelInventoryListItemBase* wearable_item2) const; +}; + +/** + * @class LLWearableItemTypeNameComparator + * + * Comparator for sorting wearable list items by type and name. + */ +class LLWearableItemTypeNameComparator : public LLWearableItemNameComparator +{ + LOG_CLASS(LLWearableItemTypeNameComparator); + +public: + LLWearableItemTypeNameComparator() {}; + virtual ~LLWearableItemTypeNameComparator() {}; + +protected: + /** + * Returns "true" if wearable_item1 is placed before wearable_item2 sorted by the following: + * - Attachments (abc order) + * - Clothing + * - by type (types order determined in LLWearableType::EType) + * - outer layer on top + * - Body Parts (abc order), + * "false" otherwise. + */ + /*virtual*/ bool doCompare(const LLPanelInventoryListItemBase* wearable_item1, const LLPanelInventoryListItemBase* wearable_item2) const; + +private: + enum ETypeListOrder + { + TLO_ATTACHMENT = 0x01, + TLO_CLOTHING = 0x02, + TLO_BODYPART = 0x04, + TLO_UNKNOWN = 0x08, + + TLO_NOT_CLOTHING = TLO_ATTACHMENT | TLO_BODYPART | TLO_UNKNOWN + }; + + static LLWearableItemTypeNameComparator::ETypeListOrder getTypeListOrder(LLAssetType::EType item_type); +}; + +/** + * @class LLWearableItemsList + * + * A flat list of wearable inventory items. + * Collects all items that can be a part of an outfit from + * an inventory category specified by UUID and displays them + * as a flat list. + */ +class LLWearableItemsList : public LLInventoryItemsList +{ +public: + /** + * Context menu. + * + * This menu is likely to be used from outside + * (e.g. for items selected across multiple wearable lists), + * so making it a singleton. + */ + class ContextMenu : public LLListContextMenu, public LLSingleton<ContextMenu> + { + public: + ContextMenu(); + /*virtual*/ void show(LLView* spawning_view, const uuid_vec_t& uuids, S32 x, S32 y); + + protected: + enum { + MASK_CLOTHING = 0x01, + MASK_BODYPART = 0x02, + MASK_ATTACHMENT = 0x04, + MASK_UNKNOWN = 0x08, + }; + + /* virtual */ LLContextMenu* createMenu(); + void updateItemsVisibility(LLContextMenu* menu); + void updateItemsLabels(LLContextMenu* menu); + static void setMenuItemVisible(LLContextMenu* menu, const std::string& name, bool val); + static void setMenuItemEnabled(LLContextMenu* menu, const std::string& name, bool val); + static void updateMask(U32& mask, LLAssetType::EType at); + static void createNewWearable(const LLUUID& item_id); + static bool canAddWearable(const LLUUID& item_id); + + LLWearableItemsList* mParent; + }; + + struct Params : public LLInitParam::Block<Params, LLInventoryItemsList::Params> + { + Optional<bool> standalone; + + Params(); + }; + + virtual ~LLWearableItemsList(); + + /*virtual*/ void addNewItem(LLViewerInventoryItem* item, bool rearrange = true); + + void updateList(const LLUUID& category_id); + + /** + * Update items that match UUIDs from changed_items_uuids + * or links that point at such items. + */ + void updateChangedItems(const LLInventoryModel::changed_items_t& changed_items_uuids); + + bool isStandalone() const { return mIsStandalone; } + +protected: + friend class LLUICtrlFactory; + LLWearableItemsList(const LLWearableItemsList::Params& p); + + void onRightClick(S32 x, S32 y); + + bool mIsStandalone; +}; + +#endif //LL_LLWEARABLEITEMSLIST_H diff --git a/indra/newview/llwearablelist.cpp b/indra/newview/llwearablelist.cpp index d6a9837b86..aedaeba42a 100644 --- a/indra/newview/llwearablelist.cpp +++ b/indra/newview/llwearablelist.cpp @@ -121,7 +121,7 @@ void LLWearableList::processGetAssetReply( const char* filename, const LLAssetID bool res = wearable->importFile( fp ); if (!res) { - if (wearable->getType() == WT_COUNT) + if (wearable->getType() == LLWearableType::WT_COUNT) { isNewWearable = TRUE; } @@ -228,15 +228,14 @@ LLWearable* LLWearableList::createCopy(const LLWearable* old_wearable, const std return wearable; } -LLWearable* LLWearableList::createNewWearable( EWearableType type ) +LLWearable* LLWearableList::createNewWearable( LLWearableType::EType type ) { lldebugs << "LLWearableList::createNewWearable()" << llendl; LLWearable *wearable = generateNewWearable(); wearable->setType( type ); - std::string name = "New "; - name.append( wearable->getTypeLabel() ); + std::string name = LLTrans::getString( LLWearableType::getTypeDefaultNewName(wearable->getType()) ); wearable->setName( name ); LLPermissions perm; diff --git a/indra/newview/llwearablelist.h b/indra/newview/llwearablelist.h index cf1a9bddff..16ef11b8bd 100644 --- a/indra/newview/llwearablelist.h +++ b/indra/newview/llwearablelist.h @@ -39,6 +39,12 @@ #include "llassetstorage.h" // Globally constructed; be careful that there's no dependency with gAgent. +/* + BUG: mList's system of mapping between assetIDs and wearables is flawed + since LLWearable* has an associated itemID, and you can have multiple + inventory items pointing to the same asset (i.e. more than one ItemID + per assetID). EXT-6252 +*/ class LLWearableList : public LLSingleton<LLWearableList> { public: @@ -55,7 +61,7 @@ public: void* userdata); LLWearable* createCopy(const LLWearable* old_wearable, const std::string& new_name = std::string()); - LLWearable* createNewWearable(EWearableType type); + LLWearable* createNewWearable(LLWearableType::EType type); // Callback static void processGetAssetReply(const char* filename, const LLAssetID& assetID, void* user_data, S32 status, LLExtStat ext_status); diff --git a/indra/newview/llwearabletype.cpp b/indra/newview/llwearabletype.cpp new file mode 100644 index 0000000000..2a14ace38c --- /dev/null +++ b/indra/newview/llwearabletype.cpp @@ -0,0 +1,138 @@ +/** + * @file llwearabletype.cpp + * @brief LLWearableType class implementation + * + * $LicenseInfo:firstyear=2002&license=viewergpl$ + * + * Copyright (c) 2002-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" +#include "llwearabletype.h" +#include "llinventoryfunctions.h" +#include "lltrans.h" + +struct WearableEntry : public LLDictionaryEntry +{ + WearableEntry(const std::string &name, + const std::string& default_new_name, + LLAssetType::EType assetType, + LLInventoryIcon::EIconName iconName); + const LLAssetType::EType mAssetType; + const std::string mLabel; + const std::string mDefaultNewName; //keep mLabel for backward compatibility + LLInventoryIcon::EIconName mIconName; +}; + +WearableEntry::WearableEntry(const std::string &name, + const std::string& default_new_name, + LLAssetType::EType assetType, + LLInventoryIcon::EIconName iconName) : + LLDictionaryEntry(name), + mAssetType(assetType), + mDefaultNewName(default_new_name), + mLabel(LLTrans::getString(name)), + mIconName(iconName) +{ +} + +class LLWearableDictionary : public LLSingleton<LLWearableDictionary>, + public LLDictionary<LLWearableType::EType, WearableEntry> +{ +public: + LLWearableDictionary(); +}; + +LLWearableDictionary::LLWearableDictionary() +{ + addEntry(LLWearableType::WT_SHAPE, new WearableEntry("shape", "New Shape", LLAssetType::AT_BODYPART, LLInventoryIcon::ICONNAME_BODYPART_SHAPE)); + addEntry(LLWearableType::WT_SKIN, new WearableEntry("skin", "New Skin", LLAssetType::AT_BODYPART, LLInventoryIcon::ICONNAME_BODYPART_SKIN)); + addEntry(LLWearableType::WT_HAIR, new WearableEntry("hair", "New Hair", LLAssetType::AT_BODYPART, LLInventoryIcon::ICONNAME_BODYPART_HAIR)); + addEntry(LLWearableType::WT_EYES, new WearableEntry("eyes", "New Eyes", LLAssetType::AT_BODYPART, LLInventoryIcon::ICONNAME_BODYPART_EYES)); + addEntry(LLWearableType::WT_SHIRT, new WearableEntry("shirt", "New Shirt", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_SHIRT)); + addEntry(LLWearableType::WT_PANTS, new WearableEntry("pants", "New Pants", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_PANTS)); + addEntry(LLWearableType::WT_SHOES, new WearableEntry("shoes", "New Shoes", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_SHOES)); + addEntry(LLWearableType::WT_SOCKS, new WearableEntry("socks", "New Socks", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_SOCKS)); + addEntry(LLWearableType::WT_JACKET, new WearableEntry("jacket", "New Jacket", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_JACKET)); + addEntry(LLWearableType::WT_GLOVES, new WearableEntry("gloves", "New Gloves", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_GLOVES)); + addEntry(LLWearableType::WT_UNDERSHIRT, new WearableEntry("undershirt", "New Undershirt", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_UNDERSHIRT)); + addEntry(LLWearableType::WT_UNDERPANTS, new WearableEntry("underpants", "New Underpants", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_UNDERPANTS)); + addEntry(LLWearableType::WT_SKIRT, new WearableEntry("skirt", "New Skirt", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_SKIRT)); + addEntry(LLWearableType::WT_ALPHA, new WearableEntry("alpha", "New Alpha", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_ALPHA)); + addEntry(LLWearableType::WT_TATTOO, new WearableEntry("tattoo", "New Tattoo", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_TATTOO)); + addEntry(LLWearableType::WT_INVALID, new WearableEntry("invalid", "Invalid Wearable", LLAssetType::AT_NONE, LLInventoryIcon::ICONNAME_NONE)); + addEntry(LLWearableType::WT_NONE, new WearableEntry("none", "Invalid Wearable", LLAssetType::AT_NONE, LLInventoryIcon::ICONNAME_NONE)); + addEntry(LLWearableType::WT_COUNT, new WearableEntry("count", "Invalid Wearable", LLAssetType::AT_NONE, LLInventoryIcon::ICONNAME_NONE)); +} + +// static +LLWearableType::EType LLWearableType::typeNameToType(const std::string& type_name) +{ + const LLWearableDictionary *dict = LLWearableDictionary::getInstance(); + const LLWearableType::EType wearable = dict->lookup(type_name); + return wearable; +} + +// static +const std::string& LLWearableType::getTypeName(LLWearableType::EType type) +{ + const LLWearableDictionary *dict = LLWearableDictionary::getInstance(); + const WearableEntry *entry = dict->lookup(type); + return entry->mName; +} + +//static +const std::string& LLWearableType::getTypeDefaultNewName(LLWearableType::EType type) +{ + const LLWearableDictionary *dict = LLWearableDictionary::getInstance(); + const WearableEntry *entry = dict->lookup(type); + return entry->mDefaultNewName; +} + +// static +const std::string& LLWearableType::getTypeLabel(LLWearableType::EType type) +{ + const LLWearableDictionary *dict = LLWearableDictionary::getInstance(); + const WearableEntry *entry = dict->lookup(type); + return entry->mLabel; +} + +// static +LLAssetType::EType LLWearableType::getAssetType(LLWearableType::EType type) +{ + const LLWearableDictionary *dict = LLWearableDictionary::getInstance(); + const WearableEntry *entry = dict->lookup(type); + return entry->mAssetType; +} + +// static +LLInventoryIcon::EIconName LLWearableType::getIconName(LLWearableType::EType type) +{ + const LLWearableDictionary *dict = LLWearableDictionary::getInstance(); + const WearableEntry *entry = dict->lookup(type); + return entry->mIconName; +} + diff --git a/indra/newview/llwearabletype.h b/indra/newview/llwearabletype.h new file mode 100644 index 0000000000..8090fd8df7 --- /dev/null +++ b/indra/newview/llwearabletype.h @@ -0,0 +1,78 @@ +/** + * @file llwearabletype.h + * @brief LLWearableType class header file + * + * $LicenseInfo:firstyear=2002&license=viewergpl$ + * + * Copyright (c) 2002-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLWEARABLETYPE_H +#define LL_LLWEARABLETYPE_H + +#include "llassettype.h" +#include "lldictionary.h" +#include "llinventoryicon.h" +#include "llsingleton.h" + +class LLWearableType +{ +public: + enum EType + { + WT_SHAPE = 0, + WT_SKIN = 1, + WT_HAIR = 2, + WT_EYES = 3, + WT_SHIRT = 4, + WT_PANTS = 5, + WT_SHOES = 6, + WT_SOCKS = 7, + WT_JACKET = 8, + WT_GLOVES = 9, + WT_UNDERSHIRT = 10, + WT_UNDERPANTS = 11, + WT_SKIRT = 12, + WT_ALPHA = 13, + WT_TATTOO = 14, + WT_COUNT = 15, + + WT_INVALID = 255, + WT_NONE = -1, + }; + + static const std::string& getTypeName(EType type); + static const std::string& getTypeDefaultNewName(EType type); + static const std::string& getTypeLabel(EType type); + static LLAssetType::EType getAssetType(EType type); + static EType typeNameToType(const std::string& type_name); + static LLInventoryIcon::EIconName getIconName(EType type); + +protected: + LLWearableType() {} + ~LLWearableType() {} +}; + +#endif // LL_LLWEARABLETYPE_H diff --git a/indra/newview/llweb.cpp b/indra/newview/llweb.cpp index 100ec0bb69..5c9633c036 100644 --- a/indra/newview/llweb.cpp +++ b/indra/newview/llweb.cpp @@ -54,6 +54,10 @@ #include "llviewerparcelmgr.h" #include "llviewerregion.h" #include "llviewerwindow.h" +#include "llnotificationsutil.h" + +bool on_load_url_external_response(const LLSD& notification, const LLSD& response, bool async ); + class URLLoader : public LLToastAlertPanel::URLLoader { @@ -103,8 +107,33 @@ void LLWeb::loadURLInternal(const std::string &url) // static void LLWeb::loadURLExternal(const std::string& url) { - std::string escaped_url = escapeURL(url); - gViewerWindow->getWindow()->spawnWebBrowser(escaped_url); + loadURLExternal(url, true); +} + + +// static +void LLWeb::loadURLExternal(const std::string& url, bool async) +{ + LLSD payload; + payload["url"] = url; + LLNotificationsUtil::add( "WebLaunchExternalTarget", LLSD(), payload, boost::bind(on_load_url_external_response, _1, _2, async)); +} + +// static +bool on_load_url_external_response(const LLSD& notification, const LLSD& response, bool async ) +{ + S32 option = LLNotificationsUtil::getSelectedOption(notification, response); + if ( 0 == option ) + { + LLSD payload = notification["payload"]; + std::string url = payload["url"].asString(); + std::string escaped_url = LLWeb::escapeURL(url); + if (gViewerWindow) + { + gViewerWindow->getWindow()->spawnWebBrowser(escaped_url, async); + } + } + return false; } @@ -145,9 +174,10 @@ std::string LLWeb::expandURLSubstitutions(const std::string &url, substitution["VERSION_PATCH"] = LLVersionInfo::getPatch(); substitution["VERSION_BUILD"] = LLVersionInfo::getBuild(); substitution["CHANNEL"] = LLVersionInfo::getChannel(); - substitution["GRID"] = LLViewerLogin::getInstance()->getGridLabel(); + substitution["GRID"] = LLGridManager::getInstance()->getGridLabel(); substitution["OS"] = LLAppViewer::instance()->getOSInfo().getOSStringSimple(); substitution["SESSION_ID"] = gAgent.getSessionID(); + substitution["FIRST_LOGIN"] = gAgent.isFirstLogin(); // work out the current language std::string lang = LLUI::getLanguage(); diff --git a/indra/newview/llweb.h b/indra/newview/llweb.h index f4666c9280..1119b80bb4 100644 --- a/indra/newview/llweb.h +++ b/indra/newview/llweb.h @@ -54,8 +54,10 @@ public: static void loadURL(const char* url) { loadURL( ll_safe_string(url) ); } /// Load the given url in the Second Life internal web browser static void loadURLInternal(const std::string &url); - /// Load the given url in the operating system's web browser + /// Load the given url in the operating system's web browser, async if we want to return immediately + /// before browser has spawned static void loadURLExternal(const std::string& url); + static void loadURLExternal(const std::string& url, bool async); /// Returns escaped url (eg, " " to "%20") - used by all loadURL methods static std::string escapeURL(const std::string& url); diff --git a/indra/newview/llwindebug.cpp b/indra/newview/llwindebug.cpp deleted file mode 100644 index 59bc9dc62b..0000000000 --- a/indra/newview/llwindebug.cpp +++ /dev/null @@ -1,912 +0,0 @@ -/** - * @file llwindebug.cpp - * @brief Windows debugging functions - * - * $LicenseInfo:firstyear=2004&license=viewergpl$ - * - * Copyright (c) 2004-2009, Linden Research, Inc. - * - * Second Life Viewer Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/programs/open_source/licensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - * $/LicenseInfo$ - */ - -#include "llviewerprecompiledheaders.h" - -#include <tchar.h> -#include <tlhelp32.h> -#include "llwindebug.h" -#include "llviewercontrol.h" -#include "lldir.h" -#include "llsd.h" -#include "llsdserialize.h" - -#pragma warning(disable: 4200) //nonstandard extension used : zero-sized array in struct/union -#pragma warning(disable: 4100) //unreferenced formal parameter - - -/* -LLSD Block for Windows Dump Information -<llsd> - <map> - <key>Platform</key> - <string></string> - <key>Process</key> - <string></string> - <key>Module</key> - <string></string> - <key>DateModified</key> - <string></string> - <key>ExceptionCode</key> - <string></string> - <key>ExceptionRead/WriteAddress</key> - <string></string> - <key>Instruction</key> - <string></string> - <key>Registers</key> - <map> - <!-- Continued for all registers --> - <key>EIP</key> - <string>...</string> - <!-- ... --> - </map> - <key>Call Stack</key> - <array> - <!-- One map per stack frame --> - <map> - <key>ModuleName</key> - <string></string> - <key>ModuleBaseAddress</key> - <string></string> - <key>ModuleOffsetAddress</key> - <string></string> - <key>Parameters</key> - <array> - <string></string> - </array> - </map> - <!-- ... --> - </array> - </map> -</llsd> - -*/ - - -extern void (*gCrashCallback)(void); - -// based on dbghelp.h -typedef BOOL (WINAPI *MINIDUMPWRITEDUMP)(HANDLE hProcess, DWORD dwPid, HANDLE hFile, MINIDUMP_TYPE DumpType, - CONST PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, - CONST PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, - CONST PMINIDUMP_CALLBACK_INFORMATION CallbackParam - ); - -MINIDUMPWRITEDUMP f_mdwp = NULL; - -#undef UNICODE - -static LPTOP_LEVEL_EXCEPTION_FILTER gFilterFunc = NULL; - -HMODULE hDbgHelp; - -// Tool Help functions. -typedef HANDLE (WINAPI * CREATE_TOOL_HELP32_SNAPSHOT)(DWORD dwFlags, DWORD th32ProcessID); -typedef BOOL (WINAPI * MODULE32_FIRST)(HANDLE hSnapshot, LPMODULEENTRY32 lpme); -typedef BOOL (WINAPI * MODULE32_NEST)(HANDLE hSnapshot, LPMODULEENTRY32 lpme); - -CREATE_TOOL_HELP32_SNAPSHOT CreateToolhelp32Snapshot_; -MODULE32_FIRST Module32First_; -MODULE32_NEST Module32Next_; - -#define DUMP_SIZE_MAX 8000 //max size of our dump -#define CALL_TRACE_MAX ((DUMP_SIZE_MAX - 2000) / (MAX_PATH + 40)) //max number of traced calls -#define NL L"\r\n" //new line - - -typedef struct STACK -{ - STACK * Ebp; - PBYTE Ret_Addr; - DWORD Param[0]; -} STACK, * PSTACK; - -BOOL WINAPI Get_Module_By_Ret_Addr(PBYTE Ret_Addr, LPWSTR Module_Name, PBYTE & Module_Addr); -void WINAPI Get_Call_Stack(const EXCEPTION_RECORD* exception_record, - const CONTEXT* context_record, - LLSD& info); - -void printError( CHAR* msg ) -{ - DWORD eNum; - TCHAR sysMsg[256]; - TCHAR* p; - - eNum = GetLastError( ); - FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, - NULL, eNum, - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language - sysMsg, 256, NULL ); - - // Trim the end of the line and terminate it with a null - p = sysMsg; - while( ( *p > 31 ) || ( *p == 9 ) ) - ++p; - do { *p-- = 0; } while( ( p >= sysMsg ) && - ( ( *p == '.' ) || ( *p < 33 ) ) ); - - // Display the message - printf( "\n WARNING: %s failed with error %d (%s)", msg, eNum, sysMsg ); -} - -BOOL GetProcessThreadIDs(DWORD process_id, std::vector<DWORD>& thread_ids) -{ - HANDLE hThreadSnap = INVALID_HANDLE_VALUE; - THREADENTRY32 te32; - - // Take a snapshot of all running threads - hThreadSnap = CreateToolhelp32Snapshot( TH32CS_SNAPTHREAD, 0 ); - if( hThreadSnap == INVALID_HANDLE_VALUE ) - return( FALSE ); - - // Fill in the size of the structure before using it. - te32.dwSize = sizeof(THREADENTRY32 ); - - // Retrieve information about the first thread, - // and exit if unsuccessful - if( !Thread32First( hThreadSnap, &te32 ) ) - { - printError( "Thread32First" ); // Show cause of failure - CloseHandle( hThreadSnap ); // Must clean up the snapshot object! - return( FALSE ); - } - - // Now walk the thread list of the system, - // and display information about each thread - // associated with the specified process - do - { - if( te32.th32OwnerProcessID == process_id ) - { - thread_ids.push_back(te32.th32ThreadID); - } - } while( Thread32Next(hThreadSnap, &te32 ) ); - -// Don't forget to clean up the snapshot object. - CloseHandle( hThreadSnap ); - return( TRUE ); -} - -BOOL GetThreadCallStack(DWORD thread_id, LLSD& info) -{ - if(GetCurrentThreadId() == thread_id) - { - // Early exit for the current thread. - // Suspending the current thread would be a bad idea. - // Plus you can't retrieve a valid current thread context. - return false; - } - - HANDLE thread_handle = INVALID_HANDLE_VALUE; - thread_handle = OpenThread(THREAD_ALL_ACCESS, FALSE, thread_id); - if(INVALID_HANDLE_VALUE == thread_handle) - { - return FALSE; - } - - BOOL result = false; - if(-1 != SuspendThread(thread_handle)) - { - CONTEXT context_struct; - context_struct.ContextFlags = CONTEXT_FULL; - if(GetThreadContext(thread_handle, &context_struct)) - { - Get_Call_Stack(NULL, &context_struct, info); - result = true; - } - ResumeThread(thread_handle); - } - else - { - // Couldn't suspend thread. - } - - CloseHandle(thread_handle); - return result; -} - - -//Windows Call Stack Construction idea from -//http://www.codeproject.com/tools/minidump.asp - -//**************************************************************************************** -BOOL WINAPI Get_Module_By_Ret_Addr(PBYTE Ret_Addr, LPWSTR Module_Name, PBYTE & Module_Addr) -//**************************************************************************************** -// Find module by Ret_Addr (address in the module). -// Return Module_Name (full path) and Module_Addr (start address). -// Return TRUE if found. -{ - MODULEENTRY32 M = {sizeof(M)}; - HANDLE hSnapshot; - - bool found = false; - - if (CreateToolhelp32Snapshot_) - { - hSnapshot = CreateToolhelp32Snapshot_(TH32CS_SNAPMODULE, 0); - - if ((hSnapshot != INVALID_HANDLE_VALUE) && - Module32First_(hSnapshot, &M)) - { - do - { - if (DWORD(Ret_Addr - M.modBaseAddr) < M.modBaseSize) - { - lstrcpyn(Module_Name, M.szExePath, MAX_PATH); - Module_Addr = M.modBaseAddr; - found = true; - break; - } - } while (Module32Next_(hSnapshot, &M)); - } - - CloseHandle(hSnapshot); - } - - return found; -} //Get_Module_By_Ret_Addr - -bool has_valid_call_before(PDWORD cur_stack_loc) -{ - PBYTE p_first_byte = (PBYTE)(*cur_stack_loc - 1); - PBYTE p_second_byte = (PBYTE)(*cur_stack_loc -2); - PBYTE p_fifth_byte = (PBYTE)(*cur_stack_loc - 5); - PBYTE p_sixth_byte = (PBYTE)(*cur_stack_loc - 6); - - // make sure we can read it - if(IsBadReadPtr(p_sixth_byte, 6 * sizeof(BYTE))) - { - return false; - } - - // check for 9a + 4 bytes - if(*p_fifth_byte == 0x9A) - { - return true; - } - - // Check for E8 + 4 bytes and last byte is 00 or FF - if(*p_fifth_byte == 0xE8 && (*p_first_byte == 0x00 || *p_first_byte == 0xFF)) - { - return true; - } - - // the other is six bytes - if(*p_sixth_byte == 0xFF || *p_second_byte == 0xFF) - { - return true; - } - - return false; -} - -PBYTE get_valid_frame(PBYTE esp) -{ - PDWORD cur_stack_loc = NULL; - const int max_search = 400; - WCHAR module_name[MAX_PATH]; - PBYTE module_addr = 0; - - // round to highest multiple of four - esp = (esp + (4 - ((int)esp % 4)) % 4); - - // scroll through stack a few hundred places. - for (cur_stack_loc = (PDWORD) esp; cur_stack_loc < (PDWORD)esp + max_search; cur_stack_loc += 1) - { - // if you can read the pointer, - if (IsBadReadPtr(cur_stack_loc, sizeof(PDWORD))) - { - continue; - } - - // check if it's in a module - if (!Get_Module_By_Ret_Addr((PBYTE)*cur_stack_loc, module_name, module_addr)) - { - continue; - } - - // check if the code before the instruction ptr is a call - if(!has_valid_call_before(cur_stack_loc)) - { - continue; - } - - // if these all pass, return that ebp, otherwise continue till we're dead - return (PBYTE)(cur_stack_loc - 1); - } - - return NULL; -} - -bool shouldUseStackWalker(PSTACK Ebp, int max_depth) -{ - WCHAR Module_Name[MAX_PATH]; - PBYTE Module_Addr = 0; - int depth = 0; - - while (depth < max_depth) - { - if (IsBadReadPtr(Ebp, sizeof(PSTACK)) || - IsBadReadPtr(Ebp->Ebp, sizeof(PSTACK)) || - Ebp->Ebp < Ebp || - Ebp->Ebp - Ebp > 0xFFFFFF || - IsBadCodePtr(FARPROC(Ebp->Ebp->Ret_Addr)) || - !Get_Module_By_Ret_Addr(Ebp->Ebp->Ret_Addr, Module_Name, Module_Addr)) - { - return true; - } - depth++; - Ebp = Ebp->Ebp; - } - - return false; -} - -//****************************************************************** -void WINAPI Get_Call_Stack(const EXCEPTION_RECORD* exception_record, - const CONTEXT* context_record, - LLSD& info) -//****************************************************************** -// Fill Str with call stack info. -// pException can be either GetExceptionInformation() or NULL. -// If pException = NULL - get current call stack. -{ - LPWSTR Module_Name = new WCHAR[MAX_PATH]; - PBYTE Module_Addr = 0; - LLSD params; - PBYTE Esp = NULL; - LLSD tmp_info; - - bool fake_frame = false; - bool ebp_used = false; - const int HEURISTIC_MAX_WALK = 20; - int heuristic_walk_i = 0; - int Ret_Addr_I = 0; - - STACK Stack = {0, 0}; - PSTACK Ebp; - - if (exception_record && context_record) //fake frame for exception address - { - Stack.Ebp = (PSTACK)(context_record->Ebp); - Stack.Ret_Addr = (PBYTE)exception_record->ExceptionAddress; - Ebp = &Stack; - Esp = (PBYTE) context_record->Esp; - fake_frame = true; - } - else if(context_record) - { - Ebp = (PSTACK)(context_record->Ebp); - Esp = (PBYTE)(context_record->Esp); - } - else - { - Ebp = (PSTACK)&exception_record - 1; //frame addr of Get_Call_Stack() - Esp = (PBYTE)&exception_record; - - // Skip frame of Get_Call_Stack(). - if (!IsBadReadPtr(Ebp, sizeof(PSTACK))) - Ebp = Ebp->Ebp; //caller ebp - } - - // Trace CALL_TRACE_MAX calls maximum - not to exceed DUMP_SIZE_MAX. - // Break trace on wrong stack frame. - for (Ret_Addr_I = 0; - heuristic_walk_i < HEURISTIC_MAX_WALK && - Ret_Addr_I < CALL_TRACE_MAX && !IsBadReadPtr(Ebp, sizeof(PSTACK)) && !IsBadCodePtr(FARPROC(Ebp->Ret_Addr)); - Ret_Addr_I++) - { - // If module with Ebp->Ret_Addr found. - if (Get_Module_By_Ret_Addr(Ebp->Ret_Addr, Module_Name, Module_Addr)) - { - // Save module's address and full path. - tmp_info["CallStack"][Ret_Addr_I]["ModuleName"] = ll_convert_wide_to_string(Module_Name); - tmp_info["CallStack"][Ret_Addr_I]["ModuleAddress"] = (int)Module_Addr; - tmp_info["CallStack"][Ret_Addr_I]["CallOffset"] = (int)(Ebp->Ret_Addr - Module_Addr); - - // Save 5 params of the call. We don't know the real number of params. - if (fake_frame && !Ret_Addr_I) //fake frame for exception address - params[0] = "Exception Offset"; - else if (!IsBadReadPtr(Ebp, sizeof(PSTACK) + 5 * sizeof(DWORD))) - { - for(int j = 0; j < 5; ++j) - { - params[j] = (int)Ebp->Param[j]; - } - } - tmp_info["CallStack"][Ret_Addr_I]["Parameters"] = params; - } - - tmp_info["CallStack"][Ret_Addr_I]["ReturnAddress"] = (int)Ebp->Ret_Addr; - - // get ready for next frame - // Set ESP to just after return address. Not the real esp, but just enough after the return address - if(!fake_frame) { - Esp = (PBYTE)Ebp + 8; - } - else - { - fake_frame = false; - } - - // is next ebp valid? - // only run if we've never found a good ebp - // and make sure the one after is valid as well - if( !ebp_used && - shouldUseStackWalker(Ebp, 2)) - { - heuristic_walk_i++; - PBYTE new_ebp = get_valid_frame(Esp); - if (new_ebp != NULL) - { - Ebp = (PSTACK)new_ebp; - } - } - else - { - ebp_used = true; - Ebp = Ebp->Ebp; - } - } -/* TODO remove or turn this code back on to edit the stack after i see a few raw ones. -Palmer - // Now go back through and edit out heuristic stacks that could very well be bogus. - // Leave the top and the last 3 stack chosen by the heuristic, however. - if(heuristic_walk_i > 2) - { - info["CallStack"][0] = tmp_info["CallStack"][0]; - std::string ttest = info["CallStack"][0]["ModuleName"]; - for(int cur_frame = 1; - (cur_frame + heuristic_walk_i - 2 < Ret_Addr_I); - ++cur_frame) - { - // edit out the middle heuristic found frames - info["CallStack"][cur_frame] = tmp_info["CallStack"][cur_frame + heuristic_walk_i - 2]; - } - } - else - { - info = tmp_info; - } -*/ - info = tmp_info; - info["HeuristicWalkI"] = heuristic_walk_i; - info["EbpUsed"] = ebp_used; - -} //Get_Call_Stack - -//*********************************** -void WINAPI Get_Version_Str(LLSD& info) -//*********************************** -// Fill Str with Windows version. -{ - OSVERSIONINFOEX V = {sizeof(OSVERSIONINFOEX)}; //EX for NT 5.0 and later - - if (!GetVersionEx((POSVERSIONINFO)&V)) - { - ZeroMemory(&V, sizeof(V)); - V.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); - GetVersionEx((POSVERSIONINFO)&V); - } - - if (V.dwPlatformId != VER_PLATFORM_WIN32_NT) - V.dwBuildNumber = LOWORD(V.dwBuildNumber); //for 9x HIWORD(dwBuildNumber) = 0x04xx - - info["Platform"] = llformat("Windows: %d.%d.%d, SP %d.%d, Product Type %d", //SP - service pack, Product Type - VER_NT_WORKSTATION,... - V.dwMajorVersion, V.dwMinorVersion, V.dwBuildNumber, V.wServicePackMajor, V.wServicePackMinor, V.wProductType); -} //Get_Version_Str - -//************************************************************* -LLSD WINAPI Get_Exception_Info(PEXCEPTION_POINTERS pException) -//************************************************************* -// Allocate Str[DUMP_SIZE_MAX] and return Str with dump, if !pException - just return call stack in Str. -{ - LLSD info; - LPWSTR Str; - int Str_Len; -// int i; - LPWSTR Module_Name = new WCHAR[MAX_PATH]; - PBYTE Module_Addr; - HANDLE hFile; - FILETIME Last_Write_Time; - FILETIME Local_File_Time; - SYSTEMTIME T; - - Str = new WCHAR[DUMP_SIZE_MAX]; - Str_Len = 0; - if (!Str) - return NULL; - - Get_Version_Str(info); - - GetModuleFileName(NULL, Str, MAX_PATH); - info["Process"] = ll_convert_wide_to_string(Str); - info["ThreadID"] = (S32)GetCurrentThreadId(); - - // If exception occurred. - if (pException) - { - EXCEPTION_RECORD & E = *pException->ExceptionRecord; - CONTEXT & C = *pException->ContextRecord; - - // If module with E.ExceptionAddress found - save its path and date. - if (Get_Module_By_Ret_Addr((PBYTE)E.ExceptionAddress, Module_Name, Module_Addr)) - { - info["Module"] = ll_convert_wide_to_string(Module_Name); - - if ((hFile = CreateFile(Module_Name, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, - FILE_ATTRIBUTE_NORMAL, NULL)) != INVALID_HANDLE_VALUE) - { - if (GetFileTime(hFile, NULL, NULL, &Last_Write_Time)) - { - FileTimeToLocalFileTime(&Last_Write_Time, &Local_File_Time); - FileTimeToSystemTime(&Local_File_Time, &T); - - info["DateModified"] = llformat("%02d/%02d/%d", T.wMonth, T.wDay, T.wYear); - } - CloseHandle(hFile); - } - } - else - { - info["ExceptionAddr"] = (int)E.ExceptionAddress; - } - - info["ExceptionCode"] = (int)E.ExceptionCode; - - /* - //TODO: Fix this - if (E.ExceptionCode == EXCEPTION_ACCESS_VIOLATION) - { - // Access violation type - Write/Read. - LLSD exception_info; - exception_info["Type"] = E.ExceptionInformation[0] ? "Write" : "Read"; - exception_info["Address"] = llformat("%08x", E.ExceptionInformation[1]); - info["Exception Information"] = exception_info; - } - */ - - - // Save instruction that caused exception. - /* - std::string str; - for (i = 0; i < 16; i++) - str += llformat(" %02X", PBYTE(E.ExceptionAddress)[i]); - info["Instruction"] = str; - */ - LLSD registers; - registers["EAX"] = (int)C.Eax; - registers["EBX"] = (int)C.Ebx; - registers["ECX"] = (int)C.Ecx; - registers["EDX"] = (int)C.Edx; - registers["ESI"] = (int)C.Esi; - registers["EDI"] = (int)C.Edi; - registers["ESP"] = (int)C.Esp; - registers["EBP"] = (int)C.Ebp; - registers["EIP"] = (int)C.Eip; - registers["EFlags"] = (int)C.EFlags; - info["Registers"] = registers; - } //if (pException) - - // Save call stack info. - Get_Call_Stack(pException->ExceptionRecord, pException->ContextRecord, info); - - return info; -} //Get_Exception_Info - -#define UNICODE - - -class LLMemoryReserve { -public: - LLMemoryReserve(); - ~LLMemoryReserve(); - void reserve(); - void release(); -protected: - unsigned char *mReserve; - static const size_t MEMORY_RESERVATION_SIZE; -}; - -LLMemoryReserve::LLMemoryReserve() : - mReserve(NULL) -{ -}; - -LLMemoryReserve::~LLMemoryReserve() -{ - release(); -} - -// I dunno - this just seemed like a pretty good value. -const size_t LLMemoryReserve::MEMORY_RESERVATION_SIZE = 5 * 1024 * 1024; - -void LLMemoryReserve::reserve() -{ - if(NULL == mReserve) - mReserve = new unsigned char[MEMORY_RESERVATION_SIZE]; -}; - -void LLMemoryReserve::release() -{ - delete [] mReserve; - mReserve = NULL; -}; - -static LLMemoryReserve gEmergencyMemoryReserve; - -#ifndef _M_IX86 - #error "The following code only works for x86!" -#endif -LPTOP_LEVEL_EXCEPTION_FILTER WINAPI MyDummySetUnhandledExceptionFilter( - LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter) -{ - if(lpTopLevelExceptionFilter == gFilterFunc) - return gFilterFunc; - - llinfos << "Someone tried to set the exception filter. Listing call stack modules" << llendl; - LLSD cs_info; - Get_Call_Stack(NULL, NULL, cs_info); - - if(cs_info.has("CallStack") && cs_info["CallStack"].isArray()) - { - LLSD cs = cs_info["CallStack"]; - for(LLSD::array_iterator i = cs.beginArray(); - i != cs.endArray(); - ++i) - { - llinfos << "Module: " << (*i)["ModuleName"] << llendl; - } - } - - return gFilterFunc; -} - -BOOL PreventSetUnhandledExceptionFilter() -{ - HMODULE hKernel32 = LoadLibrary(_T("kernel32.dll")); - if (hKernel32 == NULL) - return FALSE; - - void *pOrgEntry = GetProcAddress(hKernel32, "SetUnhandledExceptionFilter"); - if(pOrgEntry == NULL) - return FALSE; - - unsigned char newJump[ 100 ]; - DWORD dwOrgEntryAddr = (DWORD)pOrgEntry; - dwOrgEntryAddr += 5; // add 5 for 5 op-codes for jmp far - void *pNewFunc = &MyDummySetUnhandledExceptionFilter; - DWORD dwNewEntryAddr = (DWORD) pNewFunc; - DWORD dwRelativeAddr = dwNewEntryAddr - dwOrgEntryAddr; - - newJump[ 0 ] = 0xE9; // JMP absolute - memcpy(&newJump[ 1 ], &dwRelativeAddr, sizeof(pNewFunc)); - SIZE_T bytesWritten; - BOOL bRet = WriteProcessMemory(GetCurrentProcess(), - pOrgEntry, newJump, sizeof(pNewFunc) + 1, &bytesWritten); - return bRet; -} - -// static -void LLWinDebug::initExceptionHandler(LPTOP_LEVEL_EXCEPTION_FILTER filter_func) -{ - - static bool s_first_run = true; - // Load the dbghelp dll now, instead of waiting for the crash. - // Less potential for stack mangling - - if (s_first_run) - { - // First, try loading from the directory that the app resides in. - std::string local_dll_name = gDirUtilp->findFile("dbghelp.dll", gDirUtilp->getWorkingDir(), gDirUtilp->getExecutableDir()); - - HMODULE hDll = NULL; - hDll = LoadLibraryA(local_dll_name.c_str()); - if (!hDll) - { - hDll = LoadLibrary(L"dbghelp.dll"); - } - - if (!hDll) - { - LL_WARNS("AppInit") << "Couldn't find dbghelp.dll!" << LL_ENDL; - } - else - { - f_mdwp = (MINIDUMPWRITEDUMP) GetProcAddress(hDll, "MiniDumpWriteDump"); - - if (!f_mdwp) - { - FreeLibrary(hDll); - hDll = NULL; - } - } - - gEmergencyMemoryReserve.reserve(); - - s_first_run = false; - } - - // Try to get Tool Help library functions. - HMODULE hKernel32; - hKernel32 = GetModuleHandle(_T("KERNEL32")); - CreateToolhelp32Snapshot_ = (CREATE_TOOL_HELP32_SNAPSHOT)GetProcAddress(hKernel32, "CreateToolhelp32Snapshot"); - Module32First_ = (MODULE32_FIRST)GetProcAddress(hKernel32, "Module32FirstW"); - Module32Next_ = (MODULE32_NEST)GetProcAddress(hKernel32, "Module32NextW"); - - LPTOP_LEVEL_EXCEPTION_FILTER prev_filter; - prev_filter = SetUnhandledExceptionFilter(filter_func); - - // *REMOVE:Mani - //PreventSetUnhandledExceptionFilter(); - - if(prev_filter != gFilterFunc) - { - LL_WARNS("AppInit") - << "Replacing unknown exception (" << (void *)prev_filter << ") with (" << (void *)filter_func << ") !" << LL_ENDL; - } - - gFilterFunc = filter_func; -} - -bool LLWinDebug::checkExceptionHandler() -{ - bool ok = true; - LPTOP_LEVEL_EXCEPTION_FILTER prev_filter; - prev_filter = SetUnhandledExceptionFilter(gFilterFunc); - - if (prev_filter != gFilterFunc) - { - LL_WARNS("AppInit") << "Our exception handler (" << (void *)gFilterFunc << ") replaced with " << prev_filter << "!" << LL_ENDL; - ok = false; - } - - if (prev_filter == NULL) - { - ok = FALSE; - if (gFilterFunc == NULL) - { - LL_WARNS("AppInit") << "Exception handler uninitialized." << LL_ENDL; - } - else - { - LL_WARNS("AppInit") << "Our exception handler (" << (void *)gFilterFunc << ") replaced with NULL!" << LL_ENDL; - } - } - - return ok; -} - -void LLWinDebug::writeDumpToFile(MINIDUMP_TYPE type, MINIDUMP_EXCEPTION_INFORMATION *ExInfop, const std::string& filename) -{ - if(f_mdwp == NULL || gDirUtilp == NULL) - { - return; - //write_debug("No way to generate a minidump, no MiniDumpWriteDump function!\n"); - } - else - { - std::string dump_path = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, filename); - - HANDLE hFile = CreateFileA(dump_path.c_str(), - GENERIC_WRITE, - FILE_SHARE_WRITE, - NULL, - CREATE_ALWAYS, - FILE_ATTRIBUTE_NORMAL, - NULL); - - if (hFile != INVALID_HANDLE_VALUE) - { - // Write the dump, ignoring the return value - f_mdwp(GetCurrentProcess(), - GetCurrentProcessId(), - hFile, - type, - ExInfop, - NULL, - NULL); - - CloseHandle(hFile); - } - - } -} - -// static -void LLWinDebug::generateCrashStacks(struct _EXCEPTION_POINTERS *exception_infop) -{ - // *NOTE:Mani - This method is no longer the exception handler. - // Its called from viewer_windows_exception_handler() and other places. - - // - // Let go of a bunch of reserved memory to give library calls etc - // a chance to execute normally in the case that we ran out of - // memory. - // - LLSD info; - std::string dump_path = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, - "SecondLifeException"); - std::string log_path = dump_path + ".log"; - - if (exception_infop) - { - // Since there is exception info... Release the hounds. - gEmergencyMemoryReserve.release(); - - if(gSavedSettings.getControl("SaveMinidump").notNull() && gSavedSettings.getBOOL("SaveMinidump")) - { - _MINIDUMP_EXCEPTION_INFORMATION ExInfo; - - ExInfo.ThreadId = ::GetCurrentThreadId(); - ExInfo.ExceptionPointers = exception_infop; - ExInfo.ClientPointers = NULL; - - writeDumpToFile(MiniDumpNormal, &ExInfo, "SecondLife.dmp"); - writeDumpToFile((MINIDUMP_TYPE)(MiniDumpWithDataSegs | MiniDumpWithIndirectlyReferencedMemory), &ExInfo, "SecondLifePlus.dmp"); - } - - info = Get_Exception_Info(exception_infop); - } - - LLSD threads; - std::vector<DWORD> thread_ids; - GetProcessThreadIDs(GetCurrentProcessId(), thread_ids); - - for(std::vector<DWORD>::iterator th_itr = thread_ids.begin(); - th_itr != thread_ids.end(); - ++th_itr) - { - LLSD thread_info; - if(*th_itr != GetCurrentThreadId()) - { - GetThreadCallStack(*th_itr, thread_info); - } - - if(thread_info) - { - threads[llformat("ID %d", *th_itr)] = thread_info; - } - } - - info["Threads"] = threads; - - llofstream out_file(log_path); - LLSDSerialize::toPrettyXML(info, out_file); - out_file.close(); -} - -void LLWinDebug::clearCrashStacks() -{ - LLSD info; - std::string dump_path = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "SecondLifeException.log"); - LLFile::remove(dump_path); -} diff --git a/indra/newview/llwindebug.h b/indra/newview/llwindebug.h deleted file mode 100644 index f4a6a2d54d..0000000000 --- a/indra/newview/llwindebug.h +++ /dev/null @@ -1,75 +0,0 @@ -/** - * @file llwindebug.h - * @brief LLWinDebug class header file - * - * $LicenseInfo:firstyear=2004&license=viewergpl$ - * - * Copyright (c) 2004-2009, Linden Research, Inc. - * - * Second Life Viewer Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/programs/open_source/licensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - * $/LicenseInfo$ - */ - -#ifndef LL_LLWINDEBUG_H -#define LL_LLWINDEBUG_H - -#include "stdtypes.h" -#include <dbghelp.h> - -class LLWinDebug -{ -public: - - /** - * @brief initialize the llwindebug exception filter callback - * - * Hand a windows unhandled exception filter to LLWinDebug - * This method should only be called to change the - * exception filter used by llwindebug. - * - * Setting filter_func to NULL will clear any custom filters. - **/ - static void initExceptionHandler(LPTOP_LEVEL_EXCEPTION_FILTER filter_func); - - /** - * @brief check the status of the exception filter. - * - * Resets unhandled exception filter to the filter specified - * w/ initExceptionFilter). - * Returns false if the exception filter was modified. - * - * *NOTE:Mani In the past mozlib has been accused of - * overriding the exception filter. If the mozlib filter - * is required, perhaps we can chain calls from our - * filter to mozlib's. - **/ - static bool checkExceptionHandler(); - - static void generateCrashStacks(struct _EXCEPTION_POINTERS *pExceptionInfo = NULL); - static void clearCrashStacks(); // Delete the crash stack file(s). - - static void writeDumpToFile(MINIDUMP_TYPE type, MINIDUMP_EXCEPTION_INFORMATION *ExInfop, const std::string& filename); -private: -}; - -#endif // LL_LLWINDEBUG_H diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp index 118d7f8d08..f30567f481 100644 --- a/indra/newview/llworld.cpp +++ b/indra/newview/llworld.cpp @@ -45,6 +45,7 @@ #include "llhttpnode.h" #include "llregionhandle.h" #include "llsurface.h" +#include "lltrans.h" #include "llviewercamera.h" #include "llviewertexture.h" #include "llviewertexturelist.h" @@ -90,7 +91,8 @@ LLWorld::LLWorld() : mLastPacketsIn(0), mLastPacketsOut(0), mLastPacketsLost(0), - mSpaceTimeUSec(0) + mSpaceTimeUSec(0), + mClassicCloudsEnabled(TRUE) { for (S32 i = 0; i < 8; i++) { @@ -132,10 +134,11 @@ void LLWorld::destroyClass() LLViewerRegion* LLWorld::addRegion(const U64 ®ion_handle, const LLHost &host) { LLMemType mt(LLMemType::MTYPE_REGIONS); - + llinfos << "Add region with handle: " << region_handle << " on host " << host << llendl; LLViewerRegion *regionp = getRegionFromHandle(region_handle); if (regionp) { + llinfos << "Region exists, removing it " << llendl; LLHost old_host = regionp->getHost(); // region already exists! if (host == old_host && regionp->isAlive()) @@ -258,7 +261,7 @@ void LLWorld::removeRegion(const LLHost &host) llwarns << "gFrameTimeSeconds " << gFrameTimeSeconds << llendl; llwarns << "Disabling region " << regionp->getName() << " that agent is in!" << llendl; - LLAppViewer::instance()->forceDisconnect("You have been disconnected from the region you were in."); + LLAppViewer::instance()->forceDisconnect(LLTrans::getString("YouHaveBeenDisconnected")); return; } @@ -657,16 +660,44 @@ void LLWorld::updateParticles() void LLWorld::updateClouds(const F32 dt) { - if (gSavedSettings.getBOOL("FreezeTime") || - !gSavedSettings.getBOOL("SkyUseClassicClouds")) + static LLFastTimer::DeclareTimer ftm("World Clouds"); + LLFastTimer t(ftm); + + if ( gSavedSettings.getBOOL("FreezeTime") ) { // don't move clouds in snapshot mode return; } + + if ( + mClassicCloudsEnabled != + gSavedSettings.getBOOL("SkyUseClassicClouds") ) + { + // The classic cloud toggle has been flipped + // gotta update all of the cloud layers + mClassicCloudsEnabled = + gSavedSettings.getBOOL("SkyUseClassicClouds"); + + if ( !mClassicCloudsEnabled && mActiveRegionList.size() ) + { + // We've transitioned to having classic clouds disabled + // reset all cloud layers. + for ( + region_list_t::iterator iter = mActiveRegionList.begin(); + iter != mActiveRegionList.end(); + ++iter) + { + LLViewerRegion* regionp = *iter; + regionp->mCloudLayer.reset(); + } + + return; + } + } + else if ( !mClassicCloudsEnabled ) return; + if (mActiveRegionList.size()) { - // Update all the cloud puff positions, and timer based stuff - // such as death decay for (region_list_t::iterator iter = mActiveRegionList.begin(); iter != mActiveRegionList.end(); ++iter) { @@ -1205,7 +1236,7 @@ static LLVector3d unpackLocalToGlobalPosition(U32 compact_local, const LLVector3 return pos_global; } -void LLWorld::getAvatars(std::vector<LLUUID>* avatar_ids, std::vector<LLVector3d>* positions, const LLVector3d& relative_to, F32 radius) const +void LLWorld::getAvatars(uuid_vec_t* avatar_ids, std::vector<LLVector3d>* positions, const LLVector3d& relative_to, F32 radius) const { if(avatar_ids != NULL) { diff --git a/indra/newview/llworld.h b/indra/newview/llworld.h index 48025c700b..5310009d7c 100644 --- a/indra/newview/llworld.h +++ b/indra/newview/llworld.h @@ -158,7 +158,7 @@ public: // All arguments are optional. Given containers will be emptied and then filled. // Not supplying origin or radius input returns data on all avatars in the known regions. void getAvatars( - std::vector<LLUUID>* avatar_ids = NULL, + uuid_vec_t* avatar_ids = NULL, std::vector<LLVector3d>* positions = NULL, const LLVector3d& relative_to = LLVector3d(), F32 radius = FLT_MAX) const; @@ -184,6 +184,8 @@ private: U64 mSpaceTimeUSec; + BOOL mClassicCloudsEnabled; + //////////////////////////// // // Data for "Fake" objects diff --git a/indra/newview/llworldmap.h b/indra/newview/llworldmap.h index 7e37727b86..e4e677eb64 100644 --- a/indra/newview/llworldmap.h +++ b/indra/newview/llworldmap.h @@ -123,6 +123,7 @@ public: bool isName(const std::string& name) const; bool isDown() { return (mAccess == SIM_ACCESS_DOWN); } bool isPG() { return (mAccess <= SIM_ACCESS_PG); } + bool isAdult() { return (mAccess == SIM_ACCESS_ADULT); } // Debug only void dump() const; // Print the region info to the standard output diff --git a/indra/newview/llworldmapmessage.cpp b/indra/newview/llworldmapmessage.cpp index 06040a574c..09c5b9b196 100644 --- a/indra/newview/llworldmapmessage.cpp +++ b/indra/newview/llworldmapmessage.cpp @@ -193,6 +193,9 @@ void LLWorldMapMessage::processMapBlockReply(LLMessageSystem* msg, void**) U32 x_world = (U32)(x_regions) * REGION_WIDTH_UNITS; U32 y_world = (U32)(y_regions) * REGION_WIDTH_UNITS; + // name shouldn't be empty, see EXT-4568 + llassert(!name.empty()); + // Insert that region in the world map, if failure, flag it as a "null_sim" if (!(LLWorldMap::getInstance()->insertRegion(x_world, y_world, name, image_id, (U32)accesscode, region_flags))) { diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp index 1940d65ae4..081a3721b1 100644 --- a/indra/newview/llworldmapview.cpp +++ b/indra/newview/llworldmapview.cpp @@ -44,7 +44,9 @@ #include "lltooltip.h" #include "llagent.h" +#include "llagentcamera.h" #include "llcallingcard.h" +#include "llcommandhandler.h" #include "llviewercontrol.h" #include "llfloatermap.h" #include "llfloaterworldmap.h" @@ -128,10 +130,10 @@ void LLWorldMapView::initClass() sHomeImage = LLUI::getUIImage("map_home.tga"); sTelehubImage = LLUI::getUIImage("map_telehub.tga"); sInfohubImage = LLUI::getUIImage("map_infohub.tga"); - sEventImage = LLUI::getUIImage("map_event.tga"); - sEventMatureImage = LLUI::getUIImage("map_event_mature.tga"); + sEventImage = LLUI::getUIImage("Parcel_PG_Dark"); + sEventMatureImage = LLUI::getUIImage("Parcel_M_Dark"); // To Do: update the image resource for adult events. - sEventAdultImage = LLUI::getUIImage("map_event_adult.tga"); + sEventAdultImage = LLUI::getUIImage("Parcel_R_Dark"); sTrackCircleImage = LLUI::getUIImage("map_track_16.tga"); sTrackArrowImage = LLUI::getUIImage("direction_arrow.tga"); @@ -310,7 +312,7 @@ void LLWorldMapView::draw() const S32 height = getRect().getHeight(); const F32 half_width = F32(width) / 2.0f; const F32 half_height = F32(height) / 2.0f; - LLVector3d camera_global = gAgent.getCameraPositionGlobal(); + LLVector3d camera_global = gAgentCamera.getCameraPositionGlobal(); S32 level = LLWorldMipmap::scaleToLevel(sMapScale); @@ -884,35 +886,61 @@ void LLWorldMapView::drawFrustum() F32 half_width_meters = far_clip_meters * tan( horiz_fov / 2 ); F32 half_width_pixels = half_width_meters * meters_to_pixels; - F32 ctr_x = getRect().getWidth() * 0.5f + sPanX; - F32 ctr_y = getRect().getHeight() * 0.5f + sPanY; + F32 ctr_x = getLocalRect().getWidth() * 0.5f + sPanX; + F32 ctr_y = getLocalRect().getHeight() * 0.5f + sPanY; gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); // Since we don't rotate the map, we have to rotate the frustum. gGL.pushMatrix(); + { gGL.translatef( ctr_x, ctr_y, 0 ); - glRotatef( atan2( LLViewerCamera::getInstance()->getAtAxis().mV[VX], LLViewerCamera::getInstance()->getAtAxis().mV[VY] ) * RAD_TO_DEG, 0.f, 0.f, -1.f); // Draw triangle with more alpha in far pixels to make it // fade out in distance. gGL.begin( LLRender::TRIANGLES ); + { + // get camera look at and left axes + LLVector3 at_axis = LLViewerCamera::instance().getAtAxis(); + LLVector3 left_axis = LLViewerCamera::instance().getLeftAxis(); + + // grab components along XY plane + LLVector2 cam_lookat(at_axis.mV[VX], at_axis.mV[VY]); + LLVector2 cam_left(left_axis.mV[VX], left_axis.mV[VY]); + + // but, when looking near straight up or down... + if (is_approx_zero(cam_lookat.magVecSquared())) + { + //...just fall back to looking down the x axis + cam_lookat = LLVector2(1.f, 0.f); // x axis + cam_left = LLVector2(0.f, 1.f); // y axis + } + + // normalize to unit length + cam_lookat.normVec(); + cam_left.normVec(); + gGL.color4f(1.f, 1.f, 1.f, 0.25f); gGL.vertex2f( 0, 0 ); gGL.color4f(1.f, 1.f, 1.f, 0.02f); - gGL.vertex2f( -half_width_pixels, far_clip_pixels ); + + // use 2d camera vectors to render frustum triangle + LLVector2 vert = cam_lookat * far_clip_pixels + cam_left * half_width_pixels; + gGL.vertex2f(vert.mV[VX], vert.mV[VY]); - gGL.color4f(1.f, 1.f, 1.f, 0.02f); - gGL.vertex2f( half_width_pixels, far_clip_pixels ); + vert = cam_lookat * far_clip_pixels - cam_left * half_width_pixels; + gGL.vertex2f(vert.mV[VX], vert.mV[VY]); + } gGL.end(); + } gGL.popMatrix(); } LLVector3 LLWorldMapView::globalPosToView( const LLVector3d& global_pos ) { - LLVector3d relative_pos_global = global_pos - gAgent.getCameraPositionGlobal(); + LLVector3d relative_pos_global = global_pos - gAgentCamera.getCameraPositionGlobal(); LLVector3 pos_local; pos_local.setVec(relative_pos_global); // convert to floats from doubles @@ -1005,7 +1033,7 @@ LLVector3d LLWorldMapView::viewPosToGlobal( S32 x, S32 y ) LLVector3d pos_global; pos_global.setVec( pos_local ); - pos_global += gAgent.getCameraPositionGlobal(); + pos_global += gAgentCamera.getCameraPositionGlobal(); if(gAgent.isGodlike()) { pos_global.mdV[VZ] = GODLY_TELEPORT_HEIGHT; // Godly height should always be 200. @@ -1044,18 +1072,10 @@ BOOL LLWorldMapView::handleToolTip( S32 x, S32 y, MASK mask ) // zoomed out, so don't display anything about the count. JC if (agent_count > 0) { - // Merov: i18n horror!!! Even using gettext(), concatenating strings is not localizable. - // The singular/plural switch form here under might make no sense in some languages. Don't do that. - message += llformat("\n%d ", agent_count); - - if (agent_count == 1) - { - message += "person"; - } - else - { - message += "people"; - } + LLStringUtil::format_map_t string_args; + string_args["[NUMBER]"] = llformat("%d", agent_count); + message += '\n'; + message += getString((agent_count == 1 ? "world_map_person" : "world_map_people") , string_args); } } tooltip_msg.assign( message ); @@ -1637,7 +1657,7 @@ void LLWorldMapView::updateVisibleBlocks() // Load the blocks visible in the current World Map view // Get the World Map view coordinates and boundaries - LLVector3d camera_global = gAgent.getCameraPositionGlobal(); + LLVector3d camera_global = gAgentCamera.getCameraPositionGlobal(); const S32 width = getRect().getWidth(); const S32 height = getRect().getHeight(); const F32 half_width = F32(width) / 2.0f; @@ -1726,7 +1746,10 @@ BOOL LLWorldMapView::handleDoubleClick( S32 x, S32 y, MASK mask ) id.toString(uuid_str); uuid_str = uuid_str.substr(28); sscanf(uuid_str.c_str(), "%X", &event_id); - LLFloaterReg::showInstance("search", LLSD().with("category", "events").with("id", event_id)); + // Invoke the event details floater if someone is clicking on an event. + LLSD params(LLSD::emptyArray()); + params.append(event_id); + LLCommandDispatcher::dispatch("event", params, LLSD(), NULL, true); break; } case MAP_ITEM_LAND_FOR_SALE: diff --git a/indra/newview/llworldmipmap.cpp b/indra/newview/llworldmipmap.cpp index 1cdccd2baa..debd6b611f 100644 --- a/indra/newview/llworldmipmap.cpp +++ b/indra/newview/llworldmipmap.cpp @@ -33,6 +33,7 @@ #include "llviewerprecompiledheaders.h" #include "llworldmipmap.h" +#include "llviewercontrol.h" // LLControlGroup #include "llviewertexturelist.h" #include "math.h" // log() @@ -186,8 +187,8 @@ LLPointer<LLViewerFetchedTexture> LLWorldMipmap::getObjectsTile(U32 grid_x, U32 LLPointer<LLViewerFetchedTexture> LLWorldMipmap::loadObjectsTile(U32 grid_x, U32 grid_y, S32 level) { // Get the grid coordinates - std::string imageurl = llformat("http://map.secondlife.com.s3.amazonaws.com/map-%d-%d-%d-objects.jpg", - level, grid_x, grid_y); + std::string imageurl = gSavedSettings.getString("MapServerURL") + llformat("map-%d-%d-%d-objects.jpg", level, grid_x, grid_y); + // DO NOT COMMIT!! DEBUG ONLY!!! // Use a local jpeg for every tile to test map speed without S3 access diff --git a/indra/newview/llworldview.cpp b/indra/newview/llworldview.cpp new file mode 100644 index 0000000000..b44a365677 --- /dev/null +++ b/indra/newview/llworldview.cpp @@ -0,0 +1,67 @@ +/** + * @file llworldview.cpp + * @brief LLWorldView class implementation + * + * $LicenseInfo:firstyear=2001&license=viewergpl$ + * + * Copyright (c) 2001-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llworldview.h" + +#include "llviewercontrol.h" +#include "llsidetray.h" +///////////////////////////////////////////////////// +// LLFloaterView + +static LLDefaultChildRegistry::Register<LLWorldView> r("world_view"); + +LLWorldView::LLWorldView(const Params& p) +: LLUICtrl (p) +{ + gSavedSettings.getControl("SidebarCameraMovement")->getSignal()->connect(boost::bind(&LLWorldView::toggleSidebarCameraMovement, this, _2)); +} + +void LLWorldView::reshape(S32 width, S32 height, BOOL called_from_parent) +{ + //if (FALSE == gSavedSettings.getBOOL("SidebarCameraMovement") ) + //{ + // LLView* main_view = LLUI::getRootView()->findChild<LLView>("main_view"); + // if(main_view) + // { + // width = main_view->getRect().getWidth(); + // } + //} + + LLUICtrl::reshape(width, height, called_from_parent); +} +void LLWorldView::toggleSidebarCameraMovement(const LLSD::Boolean& new_visibility) +{ + reshape(getParent()->getRect().getWidth(),getRect().getHeight()); +} + diff --git a/indra/newview/llxmlrpclistener.cpp b/indra/newview/llxmlrpclistener.cpp index 15417614af..8237132ac5 100644 --- a/indra/newview/llxmlrpclistener.cpp +++ b/indra/newview/llxmlrpclistener.cpp @@ -28,6 +28,7 @@ #include "llerror.h" #include "stringize.h" #include "llxmlrpctransaction.h" +#include "llsecapi.h" #if LL_WINDOWS #pragma warning (disable : 4355) // 'this' used in initializer list: yes, intentionally @@ -356,7 +357,22 @@ public: << data["errorcode"].asString() << " (" << data["error"].asString() << ")" << LL_ENDL; - // In addition to CURLE_OK, LLUserAuth distinguishes different error + + switch (curlcode) + { + case CURLE_SSL_PEER_CERTIFICATE: + case CURLE_SSL_CACERT: + { + LLPointer<LLCertificate> error_cert(mTransaction->getErrorCert()); + if(error_cert) + { + data["certificate"] = error_cert->getPem(); + } + break; + } + default: + break; + } // values of 'curlcode': // CURLE_COULDNT_RESOLVE_HOST, // CURLE_SSL_PEER_CERTIFICATE, diff --git a/indra/newview/llxmlrpctransaction.cpp b/indra/newview/llxmlrpctransaction.cpp index c19be37e75..1d10ec7b28 100644 --- a/indra/newview/llxmlrpctransaction.cpp +++ b/indra/newview/llxmlrpctransaction.cpp @@ -31,6 +31,9 @@ */ #include "llviewerprecompiledheaders.h" +#include <openssl/x509_vfy.h> +#include <openssl/ssl.h> +#include "llsecapi.h" #include "llxmlrpctransaction.h" #include "llxmlrpclistener.h" @@ -42,6 +45,7 @@ #include <xmlrpc-epi/xmlrpc.h> #include "llappviewer.h" +#include "lltrans.h" // Static instance of LLXMLRPCListener declared here so that every time we // bring in this code, we instantiate a listener. If we put the static @@ -176,6 +180,8 @@ public: std::string mResponseText; XMLRPC_REQUEST mResponse; + std::string mCertStore; + LLPointer<LLCertificate> mErrorCert; Impl(const std::string& uri, XMLRPC_REQUEST request, bool useGzip); Impl(const std::string& uri, @@ -190,7 +196,8 @@ public: private: void init(XMLRPC_REQUEST request, bool useGzip); - + static int _sslCertVerifyCallback(X509_STORE_CTX *ctx, void *param); + static CURLcode _sslCtxFunction(CURL * curl, void *sslctx, void *param); static size_t curlDownloadCallback( char* data, size_t size, size_t nmemb, void* user_data); }; @@ -228,8 +235,75 @@ LLXMLRPCTransaction::Impl::Impl(const std::string& uri, XMLRPC_RequestFree(request, 1); } +// _sslCertVerifyCallback +// callback called when a cert verification is requested. +// calls SECAPI to validate the context +int LLXMLRPCTransaction::Impl::_sslCertVerifyCallback(X509_STORE_CTX *ctx, void *param) +{ + LLXMLRPCTransaction::Impl *transaction = (LLXMLRPCTransaction::Impl *)param; + LLPointer<LLCertificateStore> store = gSecAPIHandler->getCertificateStore(transaction->mCertStore); + LLPointer<LLCertificateChain> chain = gSecAPIHandler->getCertificateChain(ctx); + LLSD validation_params = LLSD::emptyMap(); + LLURI uri(transaction->mURI); + validation_params[CERT_HOSTNAME] = uri.hostName(); + try + { + // don't validate hostname. Let libcurl do it instead. That way, it'll handle redirects + store->validate(VALIDATION_POLICY_SSL & (~VALIDATION_POLICY_HOSTNAME), chain, validation_params); + } + catch (LLCertValidationTrustException& cert_exception) + { + // this exception is is handled differently than the general cert + // exceptions, as we allow the user to actually add the certificate + // for trust. + // therefore we pass back a different error code + // NOTE: We're currently 'wired' to pass around CURL error codes. This is + // somewhat clumsy, as we may run into errors that do not map directly to curl + // error codes. Should be refactored with login refactoring, perhaps. + transaction->mCurlCode = CURLE_SSL_CACERT; + // set the status directly. set curl status generates error messages and we want + // to use the fixed ones from the exceptions + transaction->setStatus(StatusCURLError, cert_exception.getMessage(), std::string()); + // We should probably have a more generic way of passing information + // back to the error handlers. + transaction->mErrorCert = cert_exception.getCert(); + return 0; + } + catch (LLCertException& cert_exception) + { + transaction->mCurlCode = CURLE_SSL_PEER_CERTIFICATE; + // set the status directly. set curl status generates error messages and we want + // to use the fixed ones from the exceptions + transaction->setStatus(StatusCURLError, cert_exception.getMessage(), std::string()); + transaction->mErrorCert = cert_exception.getCert(); + return 0; + } + catch (...) + { + // any other odd error, we just handle as a connect error. + transaction->mCurlCode = CURLE_SSL_CONNECT_ERROR; + transaction->setCurlStatus(CURLE_SSL_CONNECT_ERROR); + return 0; + } + return 1; +} +// _sslCtxFunction +// Callback function called when an SSL Context is created via CURL +// used to configure the context for custom cert validate(<, <#const & xs#>, <#T * #>, <#long #>)tion +// based on SECAPI +CURLcode LLXMLRPCTransaction::Impl::_sslCtxFunction(CURL * curl, void *sslctx, void *param) +{ + SSL_CTX * ctx = (SSL_CTX *) sslctx; + // disable any default verification for server certs + SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, NULL); + // set the verification callback. + SSL_CTX_set_cert_verify_callback(ctx, _sslCertVerifyCallback, param); + // the calls are void + return CURLE_OK; + +} void LLXMLRPCTransaction::Impl::init(XMLRPC_REQUEST request, bool useGzip) { @@ -237,6 +311,7 @@ void LLXMLRPCTransaction::Impl::init(XMLRPC_REQUEST request, bool useGzip) { mCurlRequest = new LLCurlEasyRequest(); } + mErrorCert = NULL; if (gSavedSettings.getBOOL("BrowserProxyEnabled")) { @@ -252,10 +327,13 @@ void LLXMLRPCTransaction::Impl::init(XMLRPC_REQUEST request, bool useGzip) // mCurlRequest->setopt(CURLOPT_VERBOSE, 1); // usefull for debugging mCurlRequest->setopt(CURLOPT_NOSIGNAL, 1); mCurlRequest->setWriteCallback(&curlDownloadCallback, (void*)this); - mCurlRequest->setopt(CURLOPT_SSL_VERIFYPEER, LLCurl::getSSLVerify()); - mCurlRequest->setopt(CURLOPT_SSL_VERIFYHOST, LLCurl::getSSLVerify() ? 2 : 0); + BOOL vefifySSLCert = !gSavedSettings.getBOOL("NoVerifySSLCert"); + mCertStore = gSavedSettings.getString("CertStore"); + mCurlRequest->setopt(CURLOPT_SSL_VERIFYPEER, vefifySSLCert); + mCurlRequest->setopt(CURLOPT_SSL_VERIFYHOST, vefifySSLCert ? 2 : 0); // Be a little impatient about establishing connections. mCurlRequest->setopt(CURLOPT_CONNECTTIMEOUT, 40L); + mCurlRequest->setSSLCtxCallback(_sslCtxFunction, (void *)this); /* Setting the DNS cache timeout to -1 disables it completely. This might help with bug #503 */ @@ -341,11 +419,19 @@ bool LLXMLRPCTransaction::Impl::process() { if (result != CURLE_OK) { - setCurlStatus(result); - llwarns << "LLXMLRPCTransaction CURL error " - << mCurlCode << ": " << mCurlRequest->getErrorString() << llendl; - llwarns << "LLXMLRPCTransaction request URI: " - << mURI << llendl; + if ((result != CURLE_SSL_PEER_CERTIFICATE) && + (result != CURLE_SSL_CACERT)) + { + // if we have a curl error that's not already been handled + // (a non cert error), then generate the error message as + // appropriate + setCurlStatus(result); + + llwarns << "LLXMLRPCTransaction CURL error " + << mCurlCode << ": " << mCurlRequest->getErrorString() << llendl; + llwarns << "LLXMLRPCTransaction request URI: " + << mURI << llendl; + } return true; } @@ -423,17 +509,11 @@ void LLXMLRPCTransaction::Impl::setStatus(EStatus status, case StatusComplete: mStatusMessage = "(done)"; break; - default: // Usually this means that there's a problem with the login server, // not with the client. Direct user to status page. - mStatusMessage = - "Despite our best efforts, something unexpected has gone wrong. \n" - " \n" - "Please check secondlife.com/status \n" - "to see if there is a known problem with the service."; - - mStatusURI = "http://secondlife.com/status/"; + mStatusMessage = LLTrans::getString("server_is_down"); + mStatusURI = "http://status.secondlifegrid.net/"; } } } @@ -467,7 +547,7 @@ void LLXMLRPCTransaction::Impl::setCurlStatus(CURLcode code) "Often this means that your computer\'s clock is set incorrectly.\n" "Please go to Control Panels and make sure the time and date\n" "are set correctly.\n" - "\n" + "Also check that your network and firewall are set up correctly.\n" "If you continue to receive this error, please go\n" "to the Support section of the SecondLife.com web site\n" "and report the problem."; @@ -539,6 +619,11 @@ std::string LLXMLRPCTransaction::statusMessage() return impl.mStatusMessage; } +LLPointer<LLCertificate> LLXMLRPCTransaction::getErrorCert() +{ + return impl.mErrorCert; +} + std::string LLXMLRPCTransaction::statusURI() { return impl.mStatusURI; diff --git a/indra/newview/llxmlrpctransaction.h b/indra/newview/llxmlrpctransaction.h index c835423d67..8beb2e2623 100644 --- a/indra/newview/llxmlrpctransaction.h +++ b/indra/newview/llxmlrpctransaction.h @@ -38,6 +38,7 @@ typedef struct _xmlrpc_request* XMLRPC_REQUEST; typedef struct _xmlrpc_value* XMLRPC_VALUE; // foward decl of types from xmlrpc.h (this usage is type safe) +class LLCertificate; class LLXMLRPCValue // a c++ wrapper around XMLRPC_VALUE @@ -115,6 +116,8 @@ public: EStatus status(int* curlCode); // return status, and extended CURL code, if code isn't null + + LLPointer<LLCertificate> getErrorCert(); std::string statusMessage(); // return a message string, suitable for showing the user std::string statusURI(); diff --git a/indra/newview/macview_Prefix.h b/indra/newview/macview_Prefix.h index a71362a139..07f8093426 100644 --- a/indra/newview/macview_Prefix.h +++ b/indra/newview/macview_Prefix.h @@ -65,7 +65,6 @@ #include "llfloater.h" #include "llfloaterbuildoptions.h" #include "llfloaterchat.h" -#include "llfloatercustomize.h" #include "llfloatergroups.h" #include "llfloaterworldmap.h" #include "llfloatermute.h" diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 4f4fc83819..ee3a2fc34f 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -56,6 +56,7 @@ // newview includes #include "llagent.h" +#include "llagentcamera.h" #include "lldrawable.h" #include "lldrawpoolalpha.h" #include "lldrawpoolavatar.h" @@ -116,7 +117,6 @@ const F32 BACKLIGHT_DAY_MAGNITUDE_AVATAR = 0.2f; const F32 BACKLIGHT_NIGHT_MAGNITUDE_AVATAR = 0.1f; const F32 BACKLIGHT_DAY_MAGNITUDE_OBJECT = 0.1f; const F32 BACKLIGHT_NIGHT_MAGNITUDE_OBJECT = 0.08f; -const S32 MAX_ACTIVE_OBJECT_QUIET_FRAMES = 40; const S32 MAX_OFFSCREEN_GEOMETRY_CHANGES_PER_FRAME = 10; const U32 REFLECTION_MAP_RES = 128; @@ -271,6 +271,7 @@ BOOL LLPipeline::sDelayVBUpdate = TRUE; BOOL LLPipeline::sFastAlpha = TRUE; BOOL LLPipeline::sDisableShaders = FALSE; BOOL LLPipeline::sRenderBump = TRUE; +BOOL LLPipeline::sUseTriStrips = TRUE; BOOL LLPipeline::sUseFarClip = TRUE; BOOL LLPipeline::sShadowRender = FALSE; BOOL LLPipeline::sWaterReflections = FALSE; @@ -283,6 +284,7 @@ BOOL LLPipeline::sRenderFrameTest = FALSE; BOOL LLPipeline::sRenderAttachedLights = TRUE; BOOL LLPipeline::sRenderAttachedParticles = TRUE; BOOL LLPipeline::sRenderDeferred = FALSE; +BOOL LLPipeline::sAllowRebuildPriorityGroup = FALSE ; S32 LLPipeline::sVisibleLightCount = 0; F32 LLPipeline::sMinRenderSize = 0.f; @@ -359,6 +361,7 @@ void LLPipeline::init() sDynamicLOD = gSavedSettings.getBOOL("RenderDynamicLOD"); sRenderBump = gSavedSettings.getBOOL("RenderObjectBump"); + sUseTriStrips = gSavedSettings.getBOOL("RenderUseTriStrips"); sRenderAttachedLights = gSavedSettings.getBOOL("RenderAttachedLights"); sRenderAttachedParticles = gSavedSettings.getBOOL("RenderAttachedParticles"); @@ -477,8 +480,6 @@ void LLPipeline::cleanup() releaseGLBuffers(); - mBloomImagep = NULL; - mBloomImage2p = NULL; mFaceSelectImagep = NULL; mMovedBridge.clear(); @@ -1355,6 +1356,7 @@ void LLPipeline::updateMoveNormalAsync(LLDrawable* drawablep) if (!drawablep) { llerrs << "updateMove called with NULL drawablep" << llendl; + return; } if (drawablep->isState(LLDrawable::EARLY_MOVE)) { @@ -1411,38 +1413,26 @@ void LLPipeline::updateMove() assertInitialized(); - for (LLDrawable::drawable_set_t::iterator iter = mRetexturedList.begin(); - iter != mRetexturedList.end(); ++iter) { - LLDrawable* drawablep = *iter; - if (drawablep && !drawablep->isDead()) - { - drawablep->updateTexture(); - } - } - mRetexturedList.clear(); - - updateMovedList(mMovedList); + static LLFastTimer::DeclareTimer ftm("Retexture"); + LLFastTimer t(ftm); - for (LLDrawable::drawable_set_t::iterator iter = mActiveQ.begin(); - iter != mActiveQ.end(); ) - { - LLDrawable::drawable_set_t::iterator curiter = iter++; - LLDrawable* drawablep = *curiter; - if (drawablep && !drawablep->isDead()) + for (LLDrawable::drawable_set_t::iterator iter = mRetexturedList.begin(); + iter != mRetexturedList.end(); ++iter) { - if (drawablep->isRoot() && - drawablep->mQuietCount++ > MAX_ACTIVE_OBJECT_QUIET_FRAMES && - (!drawablep->getParent() || !drawablep->getParent()->isActive())) + LLDrawable* drawablep = *iter; + if (drawablep && !drawablep->isDead()) { - drawablep->makeStatic(); // removes drawable and its children from mActiveQ - iter = mActiveQ.upper_bound(drawablep); // next valid entry + drawablep->updateTexture(); } } - else - { - mActiveQ.erase(curiter); - } + mRetexturedList.clear(); + } + + { + static LLFastTimer::DeclareTimer ftm("Moved List"); + LLFastTimer t(ftm); + updateMovedList(mMovedList); } //balance octrees @@ -1791,6 +1781,12 @@ void LLPipeline::updateGL() void LLPipeline::rebuildPriorityGroups() { + if(!sAllowRebuildPriorityGroup) + { + return ; + } + sAllowRebuildPriorityGroup = FALSE ; + LLTimer update_timer; LLMemType mt(LLMemType::MTYPE_PIPELINE); @@ -1810,7 +1806,6 @@ void LLPipeline::rebuildPriorityGroups() void LLPipeline::rebuildGroups() { - llpushcallstacks ; // Iterate through some drawables on the non-priority build queue S32 size = (S32) mGroupQ2.size(); S32 min_count = llclamp((S32) ((F32) (size * size)/4096*0.25f), 1, size); @@ -1970,7 +1965,7 @@ void LLPipeline::markVisible(LLDrawable *drawablep, LLCamera& camera) if (root && root->getParent() && root->getVObj() && root->getVObj()->isAttachment()) { LLVOAvatar* av = root->getParent()->getVObj()->asAvatar(); - if (av->isImpostor()) + if (av && av->isImpostor()) { return; } @@ -2212,7 +2207,6 @@ void LLPipeline::stateSort(LLCamera& camera, LLCullResult &result) //LLVertexBuffer::unbind(); grabReferences(result); - for (LLCullResult::sg_list_t::iterator iter = sCull->beginDrawableGroups(); iter != sCull->endDrawableGroups(); ++iter) { LLSpatialGroup* group = *iter; @@ -2230,7 +2224,6 @@ void LLPipeline::stateSort(LLCamera& camera, LLCullResult &result) } } } - for (LLCullResult::sg_list_t::iterator iter = sCull->beginVisibleGroups(); iter != sCull->endVisibleGroups(); ++iter) { LLSpatialGroup* group = *iter; @@ -2246,7 +2239,6 @@ void LLPipeline::stateSort(LLCamera& camera, LLCullResult &result) } } - if (LLViewerCamera::sCurCameraID == LLViewerCamera::CAMERA_WORLD) { for (LLCullResult::bridge_list_t::iterator i = sCull->beginVisibleBridge(); i != sCull->endVisibleBridge(); ++i) @@ -2260,7 +2252,7 @@ void LLPipeline::stateSort(LLCamera& camera, LLCullResult &result) } } } - + llpushcallstacks ; { LLFastTimer ftm(FTM_STATESORT_DRAWABLE); for (LLCullResult::drawable_list_t::iterator iter = sCull->beginVisibleList(); @@ -2273,13 +2265,15 @@ void LLPipeline::stateSort(LLCamera& camera, LLCullResult &result) } } } - + llpushcallstacks ; { LLFastTimer ftm(FTM_CLIENT_COPY); LLVertexBuffer::clientCopy(); } - + llpushcallstacks ; + postSort(camera); + llpushcallstacks ; } void LLPipeline::stateSort(LLSpatialGroup* group, LLCamera& camera) @@ -2789,10 +2783,8 @@ void render_hud_elements() LLViewerParcelMgr::getInstance()->render(); LLViewerParcelMgr::getInstance()->renderParcelCollision(); - // Render debugging beacons. - //gObjectList.renderObjectBeacons(); - //LLHUDObject::renderAll(); - //gObjectList.resetObjectBeacons(); + // Render name tags. + LLHUDObject::renderAll(); } else if (gForceRenderLandFence) { @@ -2971,6 +2963,9 @@ void LLPipeline::renderHighlights() } } +//debug use +U32 LLPipeline::sCurRenderPoolType = 0 ; + void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate) { LLMemType mt(LLMemType::MTYPE_PIPELINE_RENDER_GEOM); @@ -3058,12 +3053,6 @@ void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate) } } - if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_PICKING)) - { - LLAppViewer::instance()->pingMainloopTimeout("Pipeline:RenderForSelect"); - gObjectList.renderObjectsForSelect(camera, gViewerWindow->getWindowRectScaled()); - } - else { LLFastTimer t(FTM_POOLS); @@ -3086,6 +3075,9 @@ void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate) cur_type = poolp->getType(); + //debug use + sCurRenderPoolType = cur_type ; + if (occlude && cur_type >= LLDrawPool::POOL_GRASS) { occlude = FALSE; @@ -3203,7 +3195,6 @@ void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate) { // Render debugging beacons. gObjectList.renderObjectBeacons(); - LLHUDObject::renderAll(); gObjectList.resetObjectBeacons(); } @@ -3435,7 +3426,6 @@ void LLPipeline::renderGeomPostDeferred(LLCamera& camera) { // Render debugging beacons. gObjectList.renderObjectBeacons(); - LLHUDObject::renderAll(); gObjectList.resetObjectBeacons(); } @@ -3514,9 +3504,19 @@ void LLPipeline::renderGeomShadow(LLCamera& camera) } -void LLPipeline::addTrianglesDrawn(S32 count) +void LLPipeline::addTrianglesDrawn(S32 index_count, U32 render_type) { assertInitialized(); + S32 count = 0; + if (render_type == LLRender::TRIANGLE_STRIP) + { + count = index_count-2; + } + else + { + count = index_count/3; + } + mTrianglesDrawn += count; mBatchCount++; mMaxBatchSize = llmax(mMaxBatchSize, count); @@ -3867,15 +3867,14 @@ void LLPipeline::renderForSelect(std::set<LLViewerObject*>& objects, BOOL render } // pick HUD objects - LLVOAvatar* avatarp = gAgent.getAvatarObject(); - if (avatarp && sShowHUDAttachments) + if (isAgentAvatarValid() && sShowHUDAttachments) { glh::matrix4f save_proj(glh_get_current_projection()); glh::matrix4f save_model(glh_get_current_modelview()); setup_hud_matrices(screen_rect); - for (LLVOAvatar::attachment_map_t::iterator iter = avatarp->mAttachmentPoints.begin(); - iter != avatarp->mAttachmentPoints.end(); ) + for (LLVOAvatar::attachment_map_t::iterator iter = gAgentAvatarp->mAttachmentPoints.begin(); + iter != gAgentAvatarp->mAttachmentPoints.end(); ) { LLVOAvatar::attachment_map_t::iterator curiter = iter++; LLViewerJointAttachment* attachment = curiter->second; @@ -3975,9 +3974,9 @@ void LLPipeline::rebuildPools() max_count--; } - if (gAgent.getAvatarObject()) + if (isAgentAvatarValid()) { - gAgent.getAvatarObject()->rebuildHUD(); + gAgentAvatarp->rebuildHUD(); } } @@ -4373,7 +4372,7 @@ void LLPipeline::calcNearbyLights(LLCamera& camera) // mNearbyLight (and all light_set_t's) are sorted such that // begin() == the closest light and rbegin() == the farthest light const S32 MAX_LOCAL_LIGHTS = 6; -// LLVector3 cam_pos = gAgent.getCameraPositionAgent(); +// LLVector3 cam_pos = gAgentCamera.getCameraPositionAgent(); LLVector3 cam_pos = LLViewerJoystick::getInstance()->getOverrideCamera() ? camera.getOrigin() : gAgent.getPositionAgent(); @@ -4609,8 +4608,8 @@ void LLPipeline::setupHWLights(LLDrawPool* pool) glLightfv(gllight, GL_SPECULAR, LLColor4::black.mV); } - if (gAgent.getAvatarObject() && - gAgent.getAvatarObject()->mSpecialRenderMode == 3) + if (isAgentAvatarValid() && + gAgentAvatarp->mSpecialRenderMode == 3) { LLColor4 light_color = LLColor4::white; light_color.mV[3] = 0.0f; @@ -4719,15 +4718,13 @@ void LLPipeline::enableLightsDynamic() glColor4f(0.f, 0.f, 0.f, 1.f); // no local lighting by default } - LLVOAvatar* avatarp = gAgent.getAvatarObject(); - - if (avatarp && getLightingDetail() <= 0) + if (isAgentAvatarValid() && getLightingDetail() <= 0) { - if (avatarp->mSpecialRenderMode == 0) // normal + if (gAgentAvatarp->mSpecialRenderMode == 0) // normal { gPipeline.enableLightsAvatar(); } - else if (avatarp->mSpecialRenderMode >= 1) // anim preview + else if (gAgentAvatarp->mSpecialRenderMode >= 1) // anim preview { gPipeline.enableLightsAvatarEdit(LLColor4(0.7f, 0.6f, 0.3f, 1.f)); } @@ -4797,10 +4794,6 @@ void LLPipeline::findReferences(LLDrawable *drawablep) llinfos << "In mRetexturedList" << llendl; } - if (mActiveQ.find(drawablep) != mActiveQ.end()) - { - llinfos << "In mActiveQ" << llendl; - } if (std::find(mBuildQ1.begin(), mBuildQ1.end(), drawablep) != mBuildQ1.end()) { llinfos << "In mBuildQ1" << llendl; @@ -4957,19 +4950,6 @@ void LLPipeline::setLight(LLDrawable *drawablep, BOOL is_light) } } -void LLPipeline::setActive(LLDrawable *drawablep, BOOL active) -{ - assertInitialized(); - if (active) - { - mActiveQ.insert(drawablep); - } - else - { - mActiveQ.erase(drawablep); - } -} - //static void LLPipeline::toggleRenderType(U32 type) { @@ -5385,6 +5365,7 @@ void LLPipeline::resetVertexBuffers(LLDrawable* drawable) void LLPipeline::resetVertexBuffers() { sRenderBump = gSavedSettings.getBOOL("RenderObjectBump"); + sUseTriStrips = gSavedSettings.getBOOL("RenderUseTriStrips"); for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); iter != LLWorld::getInstance()->getRegionList().end(); ++iter) @@ -7125,18 +7106,18 @@ inline float sgn(float a) } void LLPipeline::generateWaterReflection(LLCamera& camera_in) -{ +{ if (LLPipeline::sWaterReflections && assertInitialized() && LLDrawPoolWater::sNeedsReflectionUpdate) { - LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); - if (gAgent.getCameraAnimating() || gAgent.getCameraMode() != CAMERA_MODE_MOUSELOOK) + BOOL skip_avatar_update = FALSE; + if (gAgentCamera.getCameraAnimating() || gAgentCamera.getCameraMode() != CAMERA_MODE_MOUSELOOK) { - avatar = NULL; + skip_avatar_update = TRUE; } - if (avatar) + if (!skip_avatar_update) { - avatar->updateAttachmentVisibility(CAMERA_MODE_THIRD_PERSON); + gAgentAvatarp->updateAttachmentVisibility(CAMERA_MODE_THIRD_PERSON); } LLVertexBuffer::unbind(); @@ -7221,7 +7202,6 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in) glCullFace(GL_FRONT); - static LLCullResult ref_result; U32 ref_mask = 0; if (LLDrawPoolWater::sNeedsDistortionUpdate) @@ -7273,7 +7253,6 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in) ref_mask = mRenderTypeMask; mRenderTypeMask = mask; } - if (LLDrawPoolWater::sNeedsDistortionUpdate) { mRenderTypeMask = ref_mask; @@ -7291,7 +7270,6 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in) } camera.setOrigin(camera_in.getOrigin()); - //render distortion map static BOOL last_update = TRUE; if (last_update) @@ -7348,7 +7326,6 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in) glClear(GL_DEPTH_BUFFER_BIT); } glClearColor(0.f, 0.f, 0.f, 0.f); - gViewerWindow->setup3DViewport(); mRenderTypeMask = type_mask; LLDrawPoolWater::sNeedsReflectionUpdate = FALSE; @@ -7360,9 +7337,9 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in) LLGLState::checkTextureChannels(); LLGLState::checkClientArrays(); - if (avatar) + if (!skip_avatar_update) { - avatar->updateAttachmentVisibility(gAgent.getCameraMode()); + gAgentAvatarp->updateAttachmentVisibility(gAgentCamera.getCameraMode()); } } } @@ -7861,7 +7838,6 @@ void LLPipeline::renderHighlight(const LLViewerObject* obj, F32 fade) void LLPipeline::generateHighlight(LLCamera& camera) { //render highlighted object as white into offscreen render target - if (mHighlightObject.notNull()) { mHighlightSet.insert(HighlightItem(mHighlightObject)); diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h index 67004a5f2d..89649a0682 100644 --- a/indra/newview/pipeline.h +++ b/indra/newview/pipeline.h @@ -270,15 +270,14 @@ public: void shiftObjects(const LLVector3 &offset); void setLight(LLDrawable *drawablep, BOOL is_light); - void setActive(LLDrawable *drawablep, BOOL active); - + BOOL hasRenderBatches(const U32 type) const; LLCullResult::drawinfo_list_t::iterator beginRenderMap(U32 type); LLCullResult::drawinfo_list_t::iterator endRenderMap(U32 type); LLCullResult::sg_list_t::iterator beginAlphaGroups(); LLCullResult::sg_list_t::iterator endAlphaGroups(); - void addTrianglesDrawn(S32 count); + void addTrianglesDrawn(S32 index_count, U32 render_type = LLRender::TRIANGLES); BOOL hasRenderType(const U32 type) const { return (type && (mRenderTypeMask & (1<<type))) ? TRUE : FALSE; } BOOL hasRenderDebugFeatureMask(const U32 mask) const { return (mRenderDebugFeatureMask & mask) ? TRUE : FALSE; } BOOL hasRenderDebugMask(const U32 mask) const { return (mRenderDebugMask & mask) ? TRUE : FALSE; } @@ -448,7 +447,7 @@ public: static BOOL sFastAlpha; static BOOL sDisableShaders; // if TRUE, rendering will be done without shaders static BOOL sRenderBump; - static BOOL sUseFBO; + static BOOL sUseTriStrips; static BOOL sUseFarClip; static BOOL sShadowRender; static BOOL sWaterReflections; @@ -463,6 +462,7 @@ public: static BOOL sRenderAttachedLights; static BOOL sRenderAttachedParticles; static BOOL sRenderDeferred; + static BOOL sAllowRebuildPriorityGroup; static S32 sVisibleLightCount; static F32 sMinRenderSize; @@ -589,8 +589,6 @@ protected: LLViewerObject::vobj_list_t mCreateQ; - LLDrawable::drawable_set_t mActiveQ; - LLDrawable::drawable_set_t mRetexturedList; class HighlightItem @@ -676,8 +674,6 @@ protected: std::vector<LLFace*> mSelectedFaces; LLPointer<LLViewerFetchedTexture> mFaceSelectImagep; - LLPointer<LLViewerTexture> mBloomImagep; - LLPointer<LLViewerTexture> mBloomImage2p; U32 mLightMask; U32 mLightMovingMask; @@ -691,9 +687,13 @@ protected: public: static BOOL sRenderBeacons; static BOOL sRenderHighlight; + + //debug use + static U32 sCurRenderPoolType ; }; void render_bbox(const LLVector3 &min, const LLVector3 &max); +void render_hud_elements(); extern LLPipeline gPipeline; extern BOOL gRenderForSelect; diff --git a/indra/newview/res-sdl/ll_icon.BMP b/indra/newview/res-sdl/ll_icon.BMP Binary files differindex 4a44aafbfa..6f9366df41 100644 --- a/indra/newview/res-sdl/ll_icon.BMP +++ b/indra/newview/res-sdl/ll_icon.BMP diff --git a/indra/newview/res-sdl/toolbuy.BMP b/indra/newview/res-sdl/toolbuy.BMP Binary files differnew file mode 100644 index 0000000000..07e9273721 --- /dev/null +++ b/indra/newview/res-sdl/toolbuy.BMP diff --git a/indra/newview/res-sdl/toolopen.BMP b/indra/newview/res-sdl/toolopen.BMP Binary files differnew file mode 100644 index 0000000000..5b87979304 --- /dev/null +++ b/indra/newview/res-sdl/toolopen.BMP diff --git a/indra/newview/res-sdl/toolsit.BMP b/indra/newview/res-sdl/toolsit.BMP Binary files differnew file mode 100644 index 0000000000..8ce59ae97a --- /dev/null +++ b/indra/newview/res-sdl/toolsit.BMP diff --git a/indra/newview/res/ll_icon.ico b/indra/newview/res/ll_icon.ico Binary files differindex c35a3fa3a3..87985b9285 100644 --- a/indra/newview/res/ll_icon.ico +++ b/indra/newview/res/ll_icon.ico diff --git a/indra/newview/res/ll_icon.png b/indra/newview/res/ll_icon.png Binary files differindex 414b703111..ae573b3874 100644 --- a/indra/newview/res/ll_icon.png +++ b/indra/newview/res/ll_icon.png diff --git a/indra/newview/res/resource.h b/indra/newview/res/resource.h index da27e47dfb..6cabd5e10b 100644 --- a/indra/newview/res/resource.h +++ b/indra/newview/res/resource.h @@ -170,14 +170,12 @@ #define IDC_COMBO1 1138 #define IDC_COMBO_FARM 1138 #define ID_TESTMENU_TEST 40001 -#define IDC_STATIC -1 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 159 -#define _APS_NEXT_RESOURCE_VALUE 167 +#define _APS_NEXT_RESOURCE_VALUE 173 #define _APS_NEXT_COMMAND_VALUE 40002 #define _APS_NEXT_CONTROL_VALUE 1139 #define _APS_NEXT_SYMED_VALUE 101 diff --git a/indra/newview/res/toolbuy.cur b/indra/newview/res/toolbuy.cur Binary files differnew file mode 100644 index 0000000000..a1bc278116 --- /dev/null +++ b/indra/newview/res/toolbuy.cur diff --git a/indra/newview/res/toolopen.cur b/indra/newview/res/toolopen.cur Binary files differnew file mode 100644 index 0000000000..a72cdfe4c0 --- /dev/null +++ b/indra/newview/res/toolopen.cur diff --git a/indra/newview/res/toolsit.cur b/indra/newview/res/toolsit.cur Binary files differnew file mode 100644 index 0000000000..6327bdb281 --- /dev/null +++ b/indra/newview/res/toolsit.cur diff --git a/indra/newview/res/viewerRes.rc b/indra/newview/res/viewerRes.rc index 38291e45c9..df2fb2a6ea 100644 --- a/indra/newview/res/viewerRes.rc +++ b/indra/newview/res/viewerRes.rc @@ -2,19 +2,12 @@ // #include "resource.h" -#ifdef IDC_STATIC -#undef IDC_STATIC -#endif -#define IDC_STATIC (-1) -#include "winresrc.h" - #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // -// Commented out because it only compiles if you have MFC installed. -//#include "winres.h" +#include "winres.h" ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS @@ -34,18 +27,18 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US // TEXTINCLUDE // -1 TEXTINCLUDE +1 TEXTINCLUDE BEGIN "resource.h\0" END -2 TEXTINCLUDE +2 TEXTINCLUDE BEGIN "#include ""winres.h""\r\n" "\0" END -3 TEXTINCLUDE +3 TEXTINCLUDE BEGIN "\r\n" "\0" @@ -84,9 +77,8 @@ END // #ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO +GUIDELINES DESIGNINFO BEGIN - "SPLASHSCREEN", DIALOG BEGIN LEFTMARGIN, 7 @@ -127,6 +119,9 @@ TOOLPIPETTE CURSOR "toolpipette.cur" TOOLPLAY CURSOR "toolplay.cur" TOOLPAUSE CURSOR "toolpause.cur" TOOLMEDIAOPEN CURSOR "toolmediaopen.cur" +TOOLBUY CURSOR "toolbuy.cur" +TOOLOPEN CURSOR "toolopen.cur" +TOOLSIT CURSOR "toolsit.cur" ///////////////////////////////////////////////////////////////////////////// // @@ -134,8 +129,8 @@ TOOLMEDIAOPEN CURSOR "toolmediaopen.cur" // VS_VERSION_INFO VERSIONINFO - FILEVERSION 2,0,0,200030 - PRODUCTVERSION 2,0,0,200030 + FILEVERSION 2,1,0,0 + PRODUCTVERSION 2,1,0,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -152,12 +147,12 @@ BEGIN BEGIN VALUE "CompanyName", "Linden Lab" VALUE "FileDescription", "Second Life" - VALUE "FileVersion", "2.0.0.200030" + VALUE "FileVersion", "2.1.0.0" VALUE "InternalName", "Second Life" VALUE "LegalCopyright", "Copyright © 2001-2008, Linden Research, Inc." VALUE "OriginalFilename", "SecondLife.exe" VALUE "ProductName", "Second Life" - VALUE "ProductVersion", "2.0.0.200030" + VALUE "ProductVersion", "2.1.0.0" END END BLOCK "VarFileInfo" @@ -166,12 +161,6 @@ BEGIN END END - -///////////////////////////////////////////////////////////////////////////// -// -// Bitmap -// - #endif // English (U.S.) resources ///////////////////////////////////////////////////////////////////////////// diff --git a/indra/newview/secondlife.icns b/indra/newview/secondlife.icns Binary files differindex ceb6036e0e..4560d4bb24 100644 --- a/indra/newview/secondlife.icns +++ b/indra/newview/secondlife.icns diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml index ca579616d8..e8a893e31b 100644 --- a/indra/newview/skins/default/colors.xml +++ b/indra/newview/skins/default/colors.xml @@ -61,7 +61,7 @@ value="0.26 0.345 0.263 1" /> <color name="Red" - value="0.729 0 0.121 1" /> + value="1 0 0 1" /> <color name="Blue" value="0 0 1 1" /> @@ -197,7 +197,7 @@ value="0.5 0.5 0.5 1" /> <color name="ColorPaletteEntry03" - value="0.3344 0.5456 0.5159 1" /> + value="0.5 0 0 1" /> <color name="ColorPaletteEntry04" value="0.5 0.5 0 1" /> @@ -239,7 +239,7 @@ reference="LtYellow" /> <color name="ColorPaletteEntry17" - reference="LtGreen" /> + reference="White" /> <color name="ColorPaletteEntry18" reference="LtGray" /> @@ -248,7 +248,7 @@ reference="Red" /> <color name="ColorPaletteEntry20" - reference=".5 .5 1 0" /> + reference="Yellow" /> <color name="ColorPaletteEntry21" reference="Green" /> @@ -286,6 +286,9 @@ name="ColorPaletteEntry32" reference="White" /> <color + name="ComboListBgColor" + reference="DkGray" /> + <color name="ConsoleBackground" reference="Black" /> <color @@ -341,7 +344,7 @@ value="0.92 0.92 1 0.78" /> <color name="GridlineColor" - reference="Red" /> + reference="White" /> <color name="GridlineShadowColor" value="0 0 0 0.31" /> @@ -356,7 +359,7 @@ reference="White"/> <color name="GroupNotifyDimmedTextColor" - reference="DkGray" /> + reference="LtGray" /> <color name="GroupOverTierColor" value="0.43 0.06 0.06 1" /> @@ -389,7 +392,7 @@ reference="Yellow" /> <color name="HighlightInspectColor" - value="1 0.5 0 1" /> + value="1 0 1 1" /> <color name="HighlightParentColor" value="0.67 0.83 0.96 1" /> @@ -418,6 +421,12 @@ name="InventoryItemSuffixColor" reference="White_25" /> <color + name="InventoryItemLibraryColor" + reference="EmphasisColor" /> + <color + name="InventoryItemLinkColor" + reference="LtGray_50" /> + <color name="InventorySearchStatusColor" reference="EmphasisColor" /> <color @@ -521,7 +530,7 @@ reference="Unused?" /> <color name="NetMapBackgroundColor" - value="0 0 0 0.3" /> + value="0 0 0 1" /> <color name="NetMapGroupOwnAboveWater" reference="Purple" /> @@ -554,7 +563,7 @@ reference="White" /> <color name="ObjectChatColor" - reference="EmphasisColor_35" /> + reference="EmphasisColor" /> <color name="OverdrivenColor" reference="Red" /> @@ -728,7 +737,10 @@ <color name="ChatToastAgentNameColor" reference="EmphasisColor" /> - <color + <color name="ColorSwatchBorderColor" value="0.45098 0.517647 0.607843 1"/> + <color + name="ChatTimestampColor" + reference="White" /> </colors> diff --git a/indra/newview/skins/default/html/da/loading/loading.html b/indra/newview/skins/default/html/da/loading/loading.html index cdad5702b9..5f3426eb60 100644 --- a/indra/newview/skins/default/html/da/loading/loading.html +++ b/indra/newview/skins/default/html/da/loading/loading.html @@ -1,10 +1,10 @@ -<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
-<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
-<table width="100%" height="100%" border="0">
- <tr>
- <td align="center" valign="middle" style="font-size:0.8em;">
- <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/> Indlæser...
- </td>
- </tr>
-</table>
-</body>
+<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head> +<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;"> +<table width="100%" height="100%" border="0"> + <tr> + <td align="center" valign="middle" style="font-size:0.8em;"> + <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/> Indlæser... + </td> + </tr> +</table> +</body> diff --git a/indra/newview/skins/default/html/de/loading/loading.html b/indra/newview/skins/default/html/de/loading/loading.html index 3eddbc24f5..44a621b216 100644 --- a/indra/newview/skins/default/html/de/loading/loading.html +++ b/indra/newview/skins/default/html/de/loading/loading.html @@ -1,10 +1,10 @@ -<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
-<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
-<table width="100%" height="100%" border="0">
- <tr>
- <td align="center" valign="middle" style="font-size:0.8em;">
- <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/> Wird geladen...
- </td>
- </tr>
-</table>
-</body>
+<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head> +<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;"> +<table width="100%" height="100%" border="0"> + <tr> + <td align="center" valign="middle" style="font-size:0.8em;"> + <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/> Wird geladen... + </td> + </tr> +</table> +</body> diff --git a/indra/newview/skins/default/html/en-us/loading/loading.html b/indra/newview/skins/default/html/en-us/loading/loading.html index 34e5c84c4d..1c62d2f73e 100644 --- a/indra/newview/skins/default/html/en-us/loading/loading.html +++ b/indra/newview/skins/default/html/en-us/loading/loading.html @@ -1,9 +1,9 @@ -<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
-<table width="100%" height="100%" border="0">
- <tr>
- <td align="center" valign="middle" style="font-size:0.8em;">
- <img src="sl_logo_rotate_black.gif" align="absmiddle"><br/> loading...
- </td>
- </tr>
-</table>
-</body>
+<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;"> +<table width="100%" height="100%" border="0"> + <tr> + <td align="center" valign="middle" style="font-size:0.8em;"> + <img src="sl_logo_rotate_black.gif" align="absmiddle"><br/> loading... + </td> + </tr> +</table> +</body> diff --git a/indra/newview/skins/default/html/es/loading/loading.html b/indra/newview/skins/default/html/es/loading/loading.html index f03284ba8c..c4260b34c0 100644 --- a/indra/newview/skins/default/html/es/loading/loading.html +++ b/indra/newview/skins/default/html/es/loading/loading.html @@ -1,10 +1,10 @@ -<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
-<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
-<table width="100%" height="100%" border="0">
- <tr>
- <td align="center" valign="middle" style="font-size:0.8em;">
- <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/> Cargando...
- </td>
- </tr>
-</table>
-</body>
+<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head> +<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;"> +<table width="100%" height="100%" border="0"> + <tr> + <td align="center" valign="middle" style="font-size:0.8em;"> + <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/> Cargando... + </td> + </tr> +</table> +</body> diff --git a/indra/newview/skins/default/html/fr/loading/loading.html b/indra/newview/skins/default/html/fr/loading/loading.html index 23c0ef03bc..b3953448e9 100644 --- a/indra/newview/skins/default/html/fr/loading/loading.html +++ b/indra/newview/skins/default/html/fr/loading/loading.html @@ -1,10 +1,10 @@ -<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
-<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
-<table width="100%" height="100%" border="0">
- <tr>
- <td align="center" valign="middle" style="font-size:0.8em;">
- <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/> Chargement...
- </td>
- </tr>
-</table>
-</body>
+<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head> +<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;"> +<table width="100%" height="100%" border="0"> + <tr> + <td align="center" valign="middle" style="font-size:0.8em;"> + <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/> Chargement... + </td> + </tr> +</table> +</body> diff --git a/indra/newview/skins/default/html/hu/loading/loading.html b/indra/newview/skins/default/html/hu/loading/loading.html index ade91f76c2..ab15a073ba 100644 --- a/indra/newview/skins/default/html/hu/loading/loading.html +++ b/indra/newview/skins/default/html/hu/loading/loading.html @@ -1,10 +1,10 @@ -<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
-<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
-<table width="100%" height="100%" border="0">
- <tr>
- <td align="center" valign="middle" style="font-size:0.8em;">
- <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/> Betöltés folyamatban...
- </td>
- </tr>
-</table>
-</body>
+<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head> +<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;"> +<table width="100%" height="100%" border="0"> + <tr> + <td align="center" valign="middle" style="font-size:0.8em;"> + <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/> Betöltés folyamatban... + </td> + </tr> +</table> +</body> diff --git a/indra/newview/skins/default/html/it/loading/loading.html b/indra/newview/skins/default/html/it/loading/loading.html index 0f9af31f6e..ab37e41f04 100644 --- a/indra/newview/skins/default/html/it/loading/loading.html +++ b/indra/newview/skins/default/html/it/loading/loading.html @@ -1,10 +1,10 @@ -<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
-<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
-<table width="100%" height="100%" border="0">
- <tr>
- <td align="center" valign="middle" style="font-size:0.8em;">
- <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/> Attendi...
- </td>
- </tr>
-</table>
-</body>
+<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head> +<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;"> +<table width="100%" height="100%" border="0"> + <tr> + <td align="center" valign="middle" style="font-size:0.8em;"> + <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/> Attendi... + </td> + </tr> +</table> +</body> diff --git a/indra/newview/skins/default/html/ja/loading/loading.html b/indra/newview/skins/default/html/ja/loading/loading.html index 069dc5d12f..35cf74a35f 100644 --- a/indra/newview/skins/default/html/ja/loading/loading.html +++ b/indra/newview/skins/default/html/ja/loading/loading.html @@ -1,10 +1,10 @@ -<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
-<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
-<table width="100%" height="100%" border="0">
- <tr>
- <td align="center" valign="middle" style="font-size:0.8em;">
- <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/> ãƒãƒ¼ãƒ‰ä¸...
- </td>
- </tr>
-</table>
-</body>
+<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head> +<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;"> +<table width="100%" height="100%" border="0"> + <tr> + <td align="center" valign="middle" style="font-size:0.8em;"> + <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/> ãƒãƒ¼ãƒ‰ä¸... + </td> + </tr> +</table> +</body> diff --git a/indra/newview/skins/default/html/nl/loading/loading.html b/indra/newview/skins/default/html/nl/loading/loading.html index 39a8691f3f..0215bd7e47 100644 --- a/indra/newview/skins/default/html/nl/loading/loading.html +++ b/indra/newview/skins/default/html/nl/loading/loading.html @@ -1,10 +1,10 @@ -<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
-<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
-<table width="100%" height="100%" border="0">
- <tr>
- <td align="center" valign="middle" style="font-size:0.8em;">
- <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/> Laden...
- </td>
- </tr>
-</table>
-</body>
+<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head> +<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;"> +<table width="100%" height="100%" border="0"> + <tr> + <td align="center" valign="middle" style="font-size:0.8em;"> + <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/> Laden... + </td> + </tr> +</table> +</body> diff --git a/indra/newview/skins/default/html/pl/loading/loading.html b/indra/newview/skins/default/html/pl/loading/loading.html index 515890c2d5..50f3dfb0c5 100644 --- a/indra/newview/skins/default/html/pl/loading/loading.html +++ b/indra/newview/skins/default/html/pl/loading/loading.html @@ -1,10 +1,10 @@ -<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
-<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
-<table width="100%" height="100%" border="0">
- <tr>
- <td align="center" valign="middle" style="font-size:0.8em;">
- <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/> Åadowanie...
- </td>
- </tr>
-</table>
-</body>
+<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head> +<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;"> +<table width="100%" height="100%" border="0"> + <tr> + <td align="center" valign="middle" style="font-size:0.8em;"> + <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/> Åadowanie... + </td> + </tr> +</table> +</body> diff --git a/indra/newview/skins/default/html/pt/loading/loading.html b/indra/newview/skins/default/html/pt/loading/loading.html index 635ea62406..a83e1123d0 100644 --- a/indra/newview/skins/default/html/pt/loading/loading.html +++ b/indra/newview/skins/default/html/pt/loading/loading.html @@ -1,10 +1,10 @@ -<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
-<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
-<table width="100%" height="100%" border="0">
- <tr>
- <td align="center" valign="middle" style="font-size:0.8em;">
- <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/> Carregando...
- </td>
- </tr>
-</table>
-</body>
+<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head> +<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;"> +<table width="100%" height="100%" border="0"> + <tr> + <td align="center" valign="middle" style="font-size:0.8em;"> + <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/> Carregando... + </td> + </tr> +</table> +</body> diff --git a/indra/newview/skins/default/html/ru/loading/loading.html b/indra/newview/skins/default/html/ru/loading/loading.html index dcc0d73c1a..892c0b9f7f 100644 --- a/indra/newview/skins/default/html/ru/loading/loading.html +++ b/indra/newview/skins/default/html/ru/loading/loading.html @@ -1,10 +1,10 @@ -<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
-<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
-<table width="100%" height="100%" border="0">
- <tr>
- <td align="center" valign="middle" style="font-size:0.8em;">
- <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/> Загрузка...
- </td>
- </tr>
-</table>
-</body>
+<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head> +<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;"> +<table width="100%" height="100%" border="0"> + <tr> + <td align="center" valign="middle" style="font-size:0.8em;"> + <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/> Загрузка... + </td> + </tr> +</table> +</body> diff --git a/indra/newview/skins/default/html/tr/loading/loading.html b/indra/newview/skins/default/html/tr/loading/loading.html index e7812e7c8e..1ac07bff34 100644 --- a/indra/newview/skins/default/html/tr/loading/loading.html +++ b/indra/newview/skins/default/html/tr/loading/loading.html @@ -1,10 +1,10 @@ -<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
-<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
-<table width="100%" height="100%" border="0">
- <tr>
- <td align="center" valign="middle" style="font-size:0.8em;">
- <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/> Yükleniyor...
- </td>
- </tr>
-</table>
-</body>
+<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head> +<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;"> +<table width="100%" height="100%" border="0"> + <tr> + <td align="center" valign="middle" style="font-size:0.8em;"> + <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/> Yükleniyor... + </td> + </tr> +</table> +</body> diff --git a/indra/newview/skins/default/html/uk/loading/loading.html b/indra/newview/skins/default/html/uk/loading/loading.html index 0f67994635..3b5b8679b4 100644 --- a/indra/newview/skins/default/html/uk/loading/loading.html +++ b/indra/newview/skins/default/html/uk/loading/loading.html @@ -1,10 +1,10 @@ -<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
-<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
-<table width="100%" height="100%" border="0">
- <tr>
- <td align="center" valign="middle" style="font-size:0.8em;">
- <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/> Завантаж...
- </td>
- </tr>
-</table>
-</body>
+<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head> +<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;"> +<table width="100%" height="100%" border="0"> + <tr> + <td align="center" valign="middle" style="font-size:0.8em;"> + <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/> Завантаж... + </td> + </tr> +</table> +</body> diff --git a/indra/newview/skins/default/html/zh/loading/loading.html b/indra/newview/skins/default/html/zh/loading/loading.html index 462ea291d9..d1d5d25c92 100644 --- a/indra/newview/skins/default/html/zh/loading/loading.html +++ b/indra/newview/skins/default/html/zh/loading/loading.html @@ -1,10 +1,10 @@ -<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
-<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
-<table width="100%" height="100%" border="0">
- <tr>
- <td align="center" valign="middle" style="font-size:0.8em;">
- <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/> 请ç‰å¾…...
- </td>
- </tr>
-</table>
-</body>
+<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head> +<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;"> +<table width="100%" height="100%" border="0"> + <tr> + <td align="center" valign="middle" style="font-size:0.8em;"> + <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/> 请ç‰å¾…... + </td> + </tr> +</table> +</body> diff --git a/indra/newview/skins/default/textures/avatar_thumb_bkgrnd.png b/indra/newview/skins/default/textures/avatar_thumb_bkgrnd.png Binary files differnew file mode 100644 index 0000000000..84cc2159c1 --- /dev/null +++ b/indra/newview/skins/default/textures/avatar_thumb_bkgrnd.png diff --git a/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Back_Off.png b/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Back_Off.png Binary files differindex 3cfe2e850e..00158a7bc2 100644 --- a/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Back_Off.png +++ b/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Back_Off.png diff --git a/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Back_On.png b/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Back_On.png Binary files differindex bb5d85e410..3748f5e190 100644 --- a/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Back_On.png +++ b/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Back_On.png diff --git a/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Front_Off.png b/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Front_Off.png Binary files differindex 9876aa456c..c49b8f9a27 100644 --- a/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Front_Off.png +++ b/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Front_Off.png diff --git a/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Front_On.png b/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Front_On.png Binary files differindex f481fed88c..bc8c4db04d 100644 --- a/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Front_On.png +++ b/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Front_On.png diff --git a/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Side_Off.png b/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Side_Off.png Binary files differindex d58b4ff990..b919a0a152 100644 --- a/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Side_Off.png +++ b/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Side_Off.png diff --git a/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Side_On.png b/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Side_On.png Binary files differindex 6e73898992..de9da359a0 100644 --- a/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Side_On.png +++ b/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Side_On.png diff --git a/indra/newview/skins/default/textures/bottomtray/Mouselook_View_Off.png b/indra/newview/skins/default/textures/bottomtray/Mouselook_View_Off.png Binary files differnew file mode 100644 index 0000000000..8d32cad95f --- /dev/null +++ b/indra/newview/skins/default/textures/bottomtray/Mouselook_View_Off.png diff --git a/indra/newview/skins/default/textures/bottomtray/Mouselook_View_On.png b/indra/newview/skins/default/textures/bottomtray/Mouselook_View_On.png Binary files differnew file mode 100644 index 0000000000..4c98e35868 --- /dev/null +++ b/indra/newview/skins/default/textures/bottomtray/Mouselook_View_On.png diff --git a/indra/newview/skins/default/textures/bottomtray/Movement_Down_Off.png b/indra/newview/skins/default/textures/bottomtray/Movement_Down_Off.png Binary files differindex 1b0192e685..2893c9a9f1 100644 --- a/indra/newview/skins/default/textures/bottomtray/Movement_Down_Off.png +++ b/indra/newview/skins/default/textures/bottomtray/Movement_Down_Off.png diff --git a/indra/newview/skins/default/textures/bottomtray/Movement_Down_On.png b/indra/newview/skins/default/textures/bottomtray/Movement_Down_On.png Binary files differindex 9f42b7d5b2..f7ed4c25fb 100644 --- a/indra/newview/skins/default/textures/bottomtray/Movement_Down_On.png +++ b/indra/newview/skins/default/textures/bottomtray/Movement_Down_On.png diff --git a/indra/newview/skins/default/textures/bottomtray/Movement_Left_Off.png b/indra/newview/skins/default/textures/bottomtray/Movement_Left_Off.png Binary files differnew file mode 100644 index 0000000000..3602efa9d9 --- /dev/null +++ b/indra/newview/skins/default/textures/bottomtray/Movement_Left_Off.png diff --git a/indra/newview/skins/default/textures/bottomtray/Movement_Left_On.png b/indra/newview/skins/default/textures/bottomtray/Movement_Left_On.png Binary files differnew file mode 100644 index 0000000000..2f81fb1588 --- /dev/null +++ b/indra/newview/skins/default/textures/bottomtray/Movement_Left_On.png diff --git a/indra/newview/skins/default/textures/bottomtray/Movement_Right_Off.png b/indra/newview/skins/default/textures/bottomtray/Movement_Right_Off.png Binary files differnew file mode 100644 index 0000000000..9c3fc37dfe --- /dev/null +++ b/indra/newview/skins/default/textures/bottomtray/Movement_Right_Off.png diff --git a/indra/newview/skins/default/textures/bottomtray/Movement_Right_On.png b/indra/newview/skins/default/textures/bottomtray/Movement_Right_On.png Binary files differnew file mode 100644 index 0000000000..4f86e81a15 --- /dev/null +++ b/indra/newview/skins/default/textures/bottomtray/Movement_Right_On.png diff --git a/indra/newview/skins/default/textures/bottomtray/Movement_Up_Off.png b/indra/newview/skins/default/textures/bottomtray/Movement_Up_Off.png Binary files differindex 9b9837cec1..a49c43c2cf 100644 --- a/indra/newview/skins/default/textures/bottomtray/Movement_Up_Off.png +++ b/indra/newview/skins/default/textures/bottomtray/Movement_Up_Off.png diff --git a/indra/newview/skins/default/textures/bottomtray/Movement_Up_On.png b/indra/newview/skins/default/textures/bottomtray/Movement_Up_On.png Binary files differindex c71d4a7854..ed4902f3ee 100644 --- a/indra/newview/skins/default/textures/bottomtray/Movement_Up_On.png +++ b/indra/newview/skins/default/textures/bottomtray/Movement_Up_On.png diff --git a/indra/newview/skins/default/textures/bottomtray/Object_View_Off.png b/indra/newview/skins/default/textures/bottomtray/Object_View_Off.png Binary files differnew file mode 100644 index 0000000000..e9dea7e17e --- /dev/null +++ b/indra/newview/skins/default/textures/bottomtray/Object_View_Off.png diff --git a/indra/newview/skins/default/textures/bottomtray/Object_View_On.png b/indra/newview/skins/default/textures/bottomtray/Object_View_On.png Binary files differnew file mode 100644 index 0000000000..7a348ba22e --- /dev/null +++ b/indra/newview/skins/default/textures/bottomtray/Object_View_On.png diff --git a/indra/newview/skins/default/textures/bottomtray/PanOrbit_Disabled.png b/indra/newview/skins/default/textures/bottomtray/PanOrbit_Disabled.png Binary files differnew file mode 100644 index 0000000000..20fa40e127 --- /dev/null +++ b/indra/newview/skins/default/textures/bottomtray/PanOrbit_Disabled.png diff --git a/indra/newview/skins/default/textures/bottomtray/PanOrbit_Off.png b/indra/newview/skins/default/textures/bottomtray/PanOrbit_Off.png Binary files differnew file mode 100644 index 0000000000..53efa3a9a9 --- /dev/null +++ b/indra/newview/skins/default/textures/bottomtray/PanOrbit_Off.png diff --git a/indra/newview/skins/default/textures/bottomtray/PanOrbit_Over.png b/indra/newview/skins/default/textures/bottomtray/PanOrbit_Over.png Binary files differnew file mode 100644 index 0000000000..f1420e0002 --- /dev/null +++ b/indra/newview/skins/default/textures/bottomtray/PanOrbit_Over.png diff --git a/indra/newview/skins/default/textures/bottomtray/PanOrbit_Press.png b/indra/newview/skins/default/textures/bottomtray/PanOrbit_Press.png Binary files differnew file mode 100644 index 0000000000..89a6269edc --- /dev/null +++ b/indra/newview/skins/default/textures/bottomtray/PanOrbit_Press.png diff --git a/indra/newview/skins/default/textures/containers/Toolbar_Left_Flash.png b/indra/newview/skins/default/textures/containers/Toolbar_Left_Flash.png Binary files differnew file mode 100644 index 0000000000..9f1e2a469d --- /dev/null +++ b/indra/newview/skins/default/textures/containers/Toolbar_Left_Flash.png diff --git a/indra/newview/skins/default/textures/containers/Toolbar_Middle_Flash.png b/indra/newview/skins/default/textures/containers/Toolbar_Middle_Flash.png Binary files differnew file mode 100644 index 0000000000..dd73d655e9 --- /dev/null +++ b/indra/newview/skins/default/textures/containers/Toolbar_Middle_Flash.png diff --git a/indra/newview/skins/default/textures/containers/Toolbar_Right_Flash.png b/indra/newview/skins/default/textures/containers/Toolbar_Right_Flash.png Binary files differnew file mode 100644 index 0000000000..f6b775c2a0 --- /dev/null +++ b/indra/newview/skins/default/textures/containers/Toolbar_Right_Flash.png diff --git a/indra/newview/skins/default/textures/icons/DownArrow_Off.png b/indra/newview/skins/default/textures/icons/DownArrow_Off.png Binary files differnew file mode 100644 index 0000000000..60f62eed4a --- /dev/null +++ b/indra/newview/skins/default/textures/icons/DownArrow_Off.png diff --git a/indra/newview/skins/default/textures/icons/Edit_Wrench.png b/indra/newview/skins/default/textures/icons/Edit_Wrench.png Binary files differnew file mode 100644 index 0000000000..1c43960d02 --- /dev/null +++ b/indra/newview/skins/default/textures/icons/Edit_Wrench.png diff --git a/indra/newview/skins/default/textures/icons/Female.png b/indra/newview/skins/default/textures/icons/Female.png Binary files differnew file mode 100644 index 0000000000..67b5653a94 --- /dev/null +++ b/indra/newview/skins/default/textures/icons/Female.png diff --git a/indra/newview/skins/default/textures/icons/Generic_Group.png b/indra/newview/skins/default/textures/icons/Generic_Group.png Binary files differindex fdd65b49e1..9d76f75d0f 100644 --- a/indra/newview/skins/default/textures/icons/Generic_Group.png +++ b/indra/newview/skins/default/textures/icons/Generic_Group.png diff --git a/indra/newview/skins/default/textures/icons/Generic_Group_Large.png b/indra/newview/skins/default/textures/icons/Generic_Group_Large.png Binary files differindex 4d4f1e1bee..de8a39fc8a 100644 --- a/indra/newview/skins/default/textures/icons/Generic_Group_Large.png +++ b/indra/newview/skins/default/textures/icons/Generic_Group_Large.png diff --git a/indra/newview/skins/default/textures/icons/Hierarchy_View_Disabled.png b/indra/newview/skins/default/textures/icons/Hierarchy_View_Disabled.png Binary files differnew file mode 100644 index 0000000000..fb370f98d5 --- /dev/null +++ b/indra/newview/skins/default/textures/icons/Hierarchy_View_Disabled.png diff --git a/indra/newview/skins/default/textures/icons/Hierarchy_View_On.png b/indra/newview/skins/default/textures/icons/Hierarchy_View_On.png Binary files differnew file mode 100644 index 0000000000..c590a5a5d3 --- /dev/null +++ b/indra/newview/skins/default/textures/icons/Hierarchy_View_On.png diff --git a/indra/newview/skins/default/textures/icons/Inv_Link.png b/indra/newview/skins/default/textures/icons/Inv_Link.png Binary files differnew file mode 100644 index 0000000000..c1543dacb5 --- /dev/null +++ b/indra/newview/skins/default/textures/icons/Inv_Link.png diff --git a/indra/newview/skins/default/textures/icons/Inv_LostClosed.png b/indra/newview/skins/default/textures/icons/Inv_LostClosed.png Binary files differnew file mode 100644 index 0000000000..a800217e0d --- /dev/null +++ b/indra/newview/skins/default/textures/icons/Inv_LostClosed.png diff --git a/indra/newview/skins/default/textures/icons/Inv_LostOpen.png b/indra/newview/skins/default/textures/icons/Inv_LostOpen.png Binary files differnew file mode 100644 index 0000000000..8c4a1a9ac0 --- /dev/null +++ b/indra/newview/skins/default/textures/icons/Inv_LostOpen.png diff --git a/indra/newview/skins/default/textures/icons/Inv_Object_Multi.png b/indra/newview/skins/default/textures/icons/Inv_Object_Multi.png Binary files differnew file mode 100644 index 0000000000..11f4871ad8 --- /dev/null +++ b/indra/newview/skins/default/textures/icons/Inv_Object_Multi.png diff --git a/indra/newview/skins/default/textures/icons/Inv_Shoe.png b/indra/newview/skins/default/textures/icons/Inv_Shoe.png Binary files differindex 51e1c7bbb7..1f52b0a6b6 100644 --- a/indra/newview/skins/default/textures/icons/Inv_Shoe.png +++ b/indra/newview/skins/default/textures/icons/Inv_Shoe.png diff --git a/indra/newview/skins/default/textures/icons/Inv_SysClosed.png b/indra/newview/skins/default/textures/icons/Inv_SysClosed.png Binary files differnew file mode 100644 index 0000000000..dcf998449f --- /dev/null +++ b/indra/newview/skins/default/textures/icons/Inv_SysClosed.png diff --git a/indra/newview/skins/default/textures/icons/Inv_SysOpen.png b/indra/newview/skins/default/textures/icons/Inv_SysOpen.png Binary files differnew file mode 100644 index 0000000000..0efd403c95 --- /dev/null +++ b/indra/newview/skins/default/textures/icons/Inv_SysOpen.png diff --git a/indra/newview/skins/default/textures/icons/Inv_TrashClosed.png b/indra/newview/skins/default/textures/icons/Inv_TrashClosed.png Binary files differnew file mode 100644 index 0000000000..c5201e6f9a --- /dev/null +++ b/indra/newview/skins/default/textures/icons/Inv_TrashClosed.png diff --git a/indra/newview/skins/default/textures/icons/Inv_TrashOpen.png b/indra/newview/skins/default/textures/icons/Inv_TrashOpen.png Binary files differnew file mode 100644 index 0000000000..4a886a3f37 --- /dev/null +++ b/indra/newview/skins/default/textures/icons/Inv_TrashOpen.png diff --git a/indra/newview/skins/default/textures/icons/List_View_Disabled.png b/indra/newview/skins/default/textures/icons/List_View_Disabled.png Binary files differnew file mode 100644 index 0000000000..155dee5047 --- /dev/null +++ b/indra/newview/skins/default/textures/icons/List_View_Disabled.png diff --git a/indra/newview/skins/default/textures/icons/List_View_On.png b/indra/newview/skins/default/textures/icons/List_View_On.png Binary files differnew file mode 100644 index 0000000000..9127c92c3b --- /dev/null +++ b/indra/newview/skins/default/textures/icons/List_View_On.png diff --git a/indra/newview/skins/default/textures/icons/Locked_Icon.png b/indra/newview/skins/default/textures/icons/Locked_Icon.png Binary files differnew file mode 100644 index 0000000000..8ead280794 --- /dev/null +++ b/indra/newview/skins/default/textures/icons/Locked_Icon.png diff --git a/indra/newview/skins/default/textures/icons/Male.png b/indra/newview/skins/default/textures/icons/Male.png Binary files differnew file mode 100644 index 0000000000..f3fad77fd0 --- /dev/null +++ b/indra/newview/skins/default/textures/icons/Male.png diff --git a/indra/newview/skins/default/textures/icons/Progress_1.png b/indra/newview/skins/default/textures/icons/Progress_1.png Binary files differindex 58b56003c4..5d6efbfa2a 100644 --- a/indra/newview/skins/default/textures/icons/Progress_1.png +++ b/indra/newview/skins/default/textures/icons/Progress_1.png diff --git a/indra/newview/skins/default/textures/icons/Progress_10.png b/indra/newview/skins/default/textures/icons/Progress_10.png Binary files differindex 07fe0be8a3..28203324f1 100644 --- a/indra/newview/skins/default/textures/icons/Progress_10.png +++ b/indra/newview/skins/default/textures/icons/Progress_10.png diff --git a/indra/newview/skins/default/textures/icons/Progress_11.png b/indra/newview/skins/default/textures/icons/Progress_11.png Binary files differindex 215d68cc46..6b87be0c3f 100644 --- a/indra/newview/skins/default/textures/icons/Progress_11.png +++ b/indra/newview/skins/default/textures/icons/Progress_11.png diff --git a/indra/newview/skins/default/textures/icons/Progress_12.png b/indra/newview/skins/default/textures/icons/Progress_12.png Binary files differindex d755588621..089d58b090 100644 --- a/indra/newview/skins/default/textures/icons/Progress_12.png +++ b/indra/newview/skins/default/textures/icons/Progress_12.png diff --git a/indra/newview/skins/default/textures/icons/Progress_2.png b/indra/newview/skins/default/textures/icons/Progress_2.png Binary files differindex 6640ee227b..94cb73b1f7 100644 --- a/indra/newview/skins/default/textures/icons/Progress_2.png +++ b/indra/newview/skins/default/textures/icons/Progress_2.png diff --git a/indra/newview/skins/default/textures/icons/Progress_3.png b/indra/newview/skins/default/textures/icons/Progress_3.png Binary files differindex 5decbe977e..a04a5b5263 100644 --- a/indra/newview/skins/default/textures/icons/Progress_3.png +++ b/indra/newview/skins/default/textures/icons/Progress_3.png diff --git a/indra/newview/skins/default/textures/icons/Progress_4.png b/indra/newview/skins/default/textures/icons/Progress_4.png Binary files differindex 56e81c17aa..a467098d82 100644 --- a/indra/newview/skins/default/textures/icons/Progress_4.png +++ b/indra/newview/skins/default/textures/icons/Progress_4.png diff --git a/indra/newview/skins/default/textures/icons/Progress_5.png b/indra/newview/skins/default/textures/icons/Progress_5.png Binary files differindex a89bf2ac62..ea64f1d907 100644 --- a/indra/newview/skins/default/textures/icons/Progress_5.png +++ b/indra/newview/skins/default/textures/icons/Progress_5.png diff --git a/indra/newview/skins/default/textures/icons/Progress_6.png b/indra/newview/skins/default/textures/icons/Progress_6.png Binary files differindex 233c479540..fe4447935f 100644 --- a/indra/newview/skins/default/textures/icons/Progress_6.png +++ b/indra/newview/skins/default/textures/icons/Progress_6.png diff --git a/indra/newview/skins/default/textures/icons/Progress_7.png b/indra/newview/skins/default/textures/icons/Progress_7.png Binary files differindex 631d7a6819..64fa294771 100644 --- a/indra/newview/skins/default/textures/icons/Progress_7.png +++ b/indra/newview/skins/default/textures/icons/Progress_7.png diff --git a/indra/newview/skins/default/textures/icons/Progress_8.png b/indra/newview/skins/default/textures/icons/Progress_8.png Binary files differindex ac0e3f13f7..a1c9a7f2eb 100644 --- a/indra/newview/skins/default/textures/icons/Progress_8.png +++ b/indra/newview/skins/default/textures/icons/Progress_8.png diff --git a/indra/newview/skins/default/textures/icons/Progress_9.png b/indra/newview/skins/default/textures/icons/Progress_9.png Binary files differindex 17fb4a0335..f3e9723184 100644 --- a/indra/newview/skins/default/textures/icons/Progress_9.png +++ b/indra/newview/skins/default/textures/icons/Progress_9.png diff --git a/indra/newview/skins/default/textures/icons/SL_Logo.png b/indra/newview/skins/default/textures/icons/SL_Logo.png Binary files differindex c9fbde987a..8342d7cfee 100644 --- a/indra/newview/skins/default/textures/icons/SL_Logo.png +++ b/indra/newview/skins/default/textures/icons/SL_Logo.png diff --git a/indra/newview/skins/default/textures/icons/Search_Icon.png b/indra/newview/skins/default/textures/icons/Search_Icon.png Binary files differnew file mode 100644 index 0000000000..541aa8f52a --- /dev/null +++ b/indra/newview/skins/default/textures/icons/Search_Icon.png diff --git a/indra/newview/skins/default/textures/icons/Shirt_Large.png b/indra/newview/skins/default/textures/icons/Shirt_Large.png Binary files differnew file mode 100644 index 0000000000..0f3846bccc --- /dev/null +++ b/indra/newview/skins/default/textures/icons/Shirt_Large.png diff --git a/indra/newview/skins/default/textures/icons/Shop.png b/indra/newview/skins/default/textures/icons/Shop.png Binary files differnew file mode 100644 index 0000000000..d7e0001dc6 --- /dev/null +++ b/indra/newview/skins/default/textures/icons/Shop.png diff --git a/indra/newview/skins/default/textures/icons/UpArrow_Off.png b/indra/newview/skins/default/textures/icons/UpArrow_Off.png Binary files differnew file mode 100644 index 0000000000..00015bce20 --- /dev/null +++ b/indra/newview/skins/default/textures/icons/UpArrow_Off.png diff --git a/indra/newview/skins/default/textures/icons/back_arrow_off.png b/indra/newview/skins/default/textures/icons/back_arrow_off.png Binary files differnew file mode 100644 index 0000000000..422f67cf83 --- /dev/null +++ b/indra/newview/skins/default/textures/icons/back_arrow_off.png diff --git a/indra/newview/skins/default/textures/icons/back_arrow_over.png b/indra/newview/skins/default/textures/icons/back_arrow_over.png Binary files differnew file mode 100644 index 0000000000..b4cc170f37 --- /dev/null +++ b/indra/newview/skins/default/textures/icons/back_arrow_over.png diff --git a/indra/newview/skins/default/textures/icons/back_arrow_press.png b/indra/newview/skins/default/textures/icons/back_arrow_press.png Binary files differnew file mode 100644 index 0000000000..a9e2f326a7 --- /dev/null +++ b/indra/newview/skins/default/textures/icons/back_arrow_press.png diff --git a/indra/newview/skins/default/textures/icons/object_icon.png b/indra/newview/skins/default/textures/icons/object_icon.png Binary files differnew file mode 100644 index 0000000000..223874e631 --- /dev/null +++ b/indra/newview/skins/default/textures/icons/object_icon.png diff --git a/indra/newview/skins/default/textures/icons/unknown_icon.png b/indra/newview/skins/default/textures/icons/unknown_icon.png Binary files differnew file mode 100644 index 0000000000..8441d86596 --- /dev/null +++ b/indra/newview/skins/default/textures/icons/unknown_icon.png diff --git a/indra/newview/skins/default/textures/map_infohub.tga b/indra/newview/skins/default/textures/map_infohub.tga Binary files differindex 545b8e532c..d0134fa5fe 100644 --- a/indra/newview/skins/default/textures/map_infohub.tga +++ b/indra/newview/skins/default/textures/map_infohub.tga diff --git a/indra/newview/skins/default/textures/navbar/BuyArrow_Over.png b/indra/newview/skins/default/textures/navbar/BuyArrow_Over.png Binary files differindex 41cb88628a..0b3f252ccf 100644 --- a/indra/newview/skins/default/textures/navbar/BuyArrow_Over.png +++ b/indra/newview/skins/default/textures/navbar/BuyArrow_Over.png diff --git a/indra/newview/skins/default/textures/navbar/BuyArrow_Press.png b/indra/newview/skins/default/textures/navbar/BuyArrow_Press.png Binary files differindex a02675502a..5c4c150bed 100644 --- a/indra/newview/skins/default/textures/navbar/BuyArrow_Press.png +++ b/indra/newview/skins/default/textures/navbar/BuyArrow_Press.png diff --git a/indra/newview/skins/default/textures/taskpanel/TabIcon_Home_Off.png b/indra/newview/skins/default/textures/taskpanel/TabIcon_Home_Off.png Binary files differindex 1e7d7beafa..421f5e1705 100644 --- a/indra/newview/skins/default/textures/taskpanel/TabIcon_Home_Off.png +++ b/indra/newview/skins/default/textures/taskpanel/TabIcon_Home_Off.png diff --git a/indra/newview/skins/default/textures/taskpanel/TabIcon_Home_Selected.png b/indra/newview/skins/default/textures/taskpanel/TabIcon_Home_Selected.png Binary files differindex a70d3abbbf..293aeef5e6 100644 --- a/indra/newview/skins/default/textures/taskpanel/TabIcon_Home_Selected.png +++ b/indra/newview/skins/default/textures/taskpanel/TabIcon_Home_Selected.png diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index ccf49f6a9f..cf632c085f 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -1,4 +1,4 @@ -<!-- +<!-- This file contains metadata about how to load, display, and scale textures for rendering in the UI. Images do *NOT* have to appear in this file in order to use them as textures in the UI...simply refer to them by filename (relative to textures directory). @@ -46,13 +46,9 @@ with the same filename but different name <texture name="AddItem_Press" file_name="icons/AddItem_Press.png" preload="false" /> <texture name="Arrow_Left_Off" file_name="navbar/Arrow_Left_Off.png" preload="true" /> - <texture name="Arrow_Left_Press" file_name="navbar/Arrow_Left_Press.png" preload="true" /> <texture name="Arrow_Right_Off" file_name="navbar/Arrow_Right_Off.png" preload="true" /> - <texture name="Arrow_Right_Press" file_name="navbar/Arrow_Right_Press.png" preload="true" /> <!-- - <texture name="Arrow_Left" file_name="widgets/Arrow_Left.png" preload="true" /> - <texture name="Arrow_Right" file_name="widgets/Arrow_Right.png" preload="true" /> --> <texture name="Arrow_Small_Up" file_name="widgets/Arrow_Small_Up.png" preload="true" /> @@ -64,49 +60,32 @@ with the same filename but different name <texture name="AudioMute_Off" file_name="icons/AudioMute_Off.png" preload="false" /> <texture name="AudioMute_Over" file_name="icons/AudioMute_Over.png" preload="false" /> - <texture name="AudioMute_Press" file_name="icons/AudioMute_Press.png" preload="false" /> <texture name="Audio_Off" file_name="icons/Audio_Off.png" preload="false" /> - <texture name="Audio_Over" file_name="icons/Audio_Over.png" preload="false" /> <texture name="Audio_Press" file_name="icons/Audio_Press.png" preload="false" /> <texture name="Avaline_Icon" file_name="icons/avaline_default_icon.jpg" preload="true" /> - <texture name="BackArrow_Disabled" file_name="icons/BackArrow_Disabled.png" preload="false" /> <texture name="BackArrow_Off" file_name="icons/BackArrow_Off.png" preload="false" /> - <texture name="BackArrow_Press" file_name="icons/BackArrow_Press.png" preload="false" /> + + <texture name="BackButton_Off" file_name="icons/back_arrow_off.png" preload="false" /> + <texture name="BackButton_Over" file_name="icons/back_arrow_over.png" preload="false" /> + <texture name="BackButton_Press" file_name="icons/back_arrow_press.png" preload="false" /> <texture name="Blank" file_name="Blank.png" preload="false" /> - <texture name="BottomTray_BG" file_name="bottomtray/BottomTray_BG.png" preload="false" /> - <texture name="BottomTray_Scroll_Right" file_name="navbar/Arrow_Right_Off.png" preload="false" /> - <texture name="BottomTray_Scroll_Left" file_name="navbar/Arrow_Left_Off.png" preload="false" /> - <texture name="BuyArrow_Off" file_name="navbar/BuyArrow_Off.png" preload="true" scale.left="1" scale.top="1" scale.right="0" scale.bottom="0" /> - <texture name="BuyArrow_Over" file_name="navbar/BuyArrow_Over.png" preload="true" scale.left="1" scale.top="1" scale.right="0" scale.bottom="0" /> + <texture name="BuyArrow_Over" file_name="navbar/BuyArrow_Over.png" preload="true" scale.left="0" scale.top="1" scale.right="0" scale.bottom="0" /> <texture name="BuyArrow_Press" file_name="navbar/BuyArrow_Press.png" preload="true" scale.left="1" scale.top="1" scale.right="0" scale.bottom="0" /> - <texture name="Cam_Avatar_Disabled" file_name="bottomtray/Cam_Avatar_Disabled.png" preload="false" /> - <texture name="Cam_Avatar_Over" file_name="bottomtray/Cam_Avatar_Over.png" preload="false" /> <texture name="Cam_Avatar_Off" file_name="bottomtray/Cam_Avatar_Off.png" preload="false" /> - <texture name="Cam_Avatar_Press" file_name="bottomtray/Cam_Avatar_Press.png" preload="false" /> - <texture name="Cam_FreeCam_Disabled" file_name="bottomtray/Cam_FreeCam_Disabled.png" preload="false" /> <texture name="Cam_FreeCam_Off" file_name="bottomtray/Cam_FreeCam_Off.png" preload="false" /> - <texture name="Cam_FreeCam_Over" file_name="bottomtray/Cam_FreeCam_Over.png" preload="false" /> - <texture name="Cam_FreeCam_Press" file_name="bottomtray/Cam_FreeCam_Press.png" preload="false" /> - <texture name="Cam_Orbit_Disabled" file_name="bottomtray/Cam_Orbit_Disabled.png" preload="false" /> <texture name="Cam_Orbit_Off" file_name="bottomtray/Cam_Orbit_Off.png" preload="false" /> - <texture name="Cam_Orbit_Over" file_name="bottomtray/Cam_Orbit_Over.png" preload="false" /> - <texture name="Cam_Orbit_Press" file_name="bottomtray/Cam_Orbit_Press.png" preload="false" /> - <texture name="Cam_Pan_Disabled" file_name="bottomtray/Cam_Pan_Disabled.png" preload="false" /> <texture name="Cam_Pan_Off" file_name="bottomtray/Cam_Pan_Off.png" preload="false" /> - <texture name="Cam_Pan_Over" file_name="bottomtray/CCam_Pan_Over.png" preload="false" /> - <texture name="Cam_Pan_Press" file_name="bottomtray/Cam_Pan_Press.png" preload="false" /> <texture name="Cam_Preset_Back_Off" file_name="bottomtray/Cam_Preset_Back_Off.png" preload="false" /> <texture name="Cam_Preset_Back_On" file_name="bottomtray/Cam_Preset_Back_On.png" preload="false" /> <texture name="Cam_Preset_Eye_Off" file_name="bottomtray/Cam_Preset_Eye_Off.png" preload="false" /> - <texture name="Cam_Preset_Eye_On" file_name="bottomtray/Cam_Preset_Eye_On.png" preload="false" /> <texture name="Cam_Preset_Front_Off" file_name="bottomtray/Cam_Preset_Front_Off.png" preload="false" /> <texture name="Cam_Preset_Front_On" file_name="bottomtray/Cam_Preset_Front_On.png" preload="false" /> <texture name="Cam_Preset_Side_Off" file_name="bottomtray/Cam_Preset_Side_Off.png" preload="false" /> @@ -116,8 +95,6 @@ with the same filename but different name <texture name="Cam_Rotate_Out" file_name="bottomtray/Cam_Rotate_Out.png" preload="false" /> <texture name="Cam_Tracking_In" file_name="bottomtray/Cam_Tracking_In.png" preload="false" /> <texture name="Cam_Tracking_Out" file_name="bottomtray/Cam_Tracking_Out.png" preload="false" /> - <texture name="CameraView_Off" file_name="bottomtray/CameraView_Off.png" preload="false" /> - <texture name="CameraView_Over" file_name="bottomtray/CameraView_Over.png" preload="false" /> <texture name="Checkbox_Off_Disabled" file_name="widgets/Checkbox_Disabled.png" preload="true" /> <texture name="Checkbox_On_Disabled" file_name="widgets/Checkbox_On_Disabled.png" preload="true" /> @@ -127,8 +104,6 @@ with the same filename but different name <texture name="Checkbox_Press" file_name="widgets/Checkbox_Press.png" preload="true" /> <texture name="ComboButton_Disabled" file_name="widgets/ComboButton_Disabled.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" /> - <texture name="ComboButton_Over" file_name="widgets/ComboButton_Over.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" /> - <texture name="ComboButton_Press" file_name="widgets/ComboButton_Press.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" /> <texture name="ComboButton_Selected" file_name="widgets/ComboButton_Selected.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" /> <texture name="ComboButton_UpSelected" file_name="widgets/ComboButton_UpSelected.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" /> <texture name="ComboButton_Up_On_Selected" file_name="widgets/ComboButton_Up_On_Selected.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" /> @@ -136,25 +111,21 @@ with the same filename but different name <texture name="ComboButton_UpOff" file_name="widgets/ComboButton_UpOff.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" /> <texture name="Container" file_name="containers/Container.png" preload="false" /> - <texture name="DisclosureArrow_Closed_Off" file_name="widgets/DisclosureArrow_Closed_Off.png" preload="true" /> - <texture name="DisclosureArrow_Closed_Press" file_name="widgets/DisclosureArrow_Closed_Press.png" preload="true" /> <texture name="DisclosureArrow_Opened_Off" file_name="widgets/DisclosureArrow_Opened_Off.png" preload="true" /> - <texture name="DisclosureArrow_Opened_Press" file_name="widgets/DisclosureArrow_Opened_Press.png" preload="true" /> <texture name="DownArrow" file_name="bottomtray/DownArrow.png" preload="false" /> + <texture name="DownArrow_Off" file_name="icons/DownArrow_Off.png" preload="false" /> + <texture name="Dragbar" file_name="windows/Dragbar.png" preload="false" scale.left="35" scale.top="5" scale.right="29" scale.bottom="5" /> - <texture name="DropDown_Disabled" file_name="widgets/DropDown_Disabled.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" /> - <texture name="DropDown_Over" file_name="widgets/DropDown_Over.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" /> - <texture name="DropDown_Press" file_name="widgets/DropDown_Press.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" /> - <texture name="DropDown_Selected" file_name="widgets/DropDown_Selected.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" /> - <texture name="DropDown_On" file_name="widgets/DropDown_On.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" /> - <texture name="DropDown_Off" file_name="widgets/DropDown_Off.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" /> + <texture name="DropDown_Disabled" file_name="widgets/DropDown_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="99" scale.bottom="4" /> + <texture name="DropDown_Press" file_name="widgets/DropDown_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="99" scale.bottom="4" /> + <texture name="DropDown_On" file_name="widgets/DropDown_On.png" preload="true" scale.left="4" scale.top="19" scale.right="99" scale.bottom="4" /> + <texture name="DropDown_Off" file_name="widgets/DropDown_Off.png" preload="true" scale.left="4" scale.top="19" scale.right="99" scale.bottom="4" /> <texture name="DropTarget" file_name="widgets/DropTarget.png" preload="false" /> <texture name="ExternalBrowser_Off" file_name="icons/ExternalBrowser_Off.png" preload="false" /> - <texture name="ExternalBrowser_Over" file_name="icons/ExternalBrowser_Over.png" preload="false" /> - <texture name="ExternalBrowser_Press" file_name="icons/ExternalBrowser_Press.png" preload="false" /> + <texture name="Edit_Wrench" file_name="icons/Edit_Wrench.png" preload="false" /> <texture name="Favorite_Star_Active" file_name="navbar/Favorite_Star_Active.png" preload="false" /> <texture name="Favorite_Star_Off" file_name="navbar/Favorite_Star_Off.png" preload="false" /> @@ -162,8 +133,6 @@ with the same filename but different name <texture name="Favorite_Star_Over" file_name="navbar/Favorite_Star_Over.png" preload="false" /> <texture name="Favorite_Link_Over" file_name="navbar/Favorite_Link_Over.png" preload="false" /> - <texture name="FileMenu_BarSelect" file_name="navbar/FileMenu_BarSelect.png" preload="false" scale.left="2" scale.top="0" scale.right="2" scale.bottom="0" /> - <texture name="FileMenu_BG" file_name="navbar/FileMenu_BG.png" preload="false" /> <texture name="Flag" file_name="navbar/Flag.png" preload="false" /> @@ -173,23 +142,19 @@ with the same filename but different name <texture name="ForwardArrow_Press" file_name="icons/ForwardArrow_Press.png" preload="false" /> <texture name="Generic_Group" file_name="icons/Generic_Group.png" preload="false" /> - <texture name="icon_group.tga" file_name="icons/Generic_Group.png" preload="false" /> <texture name="Generic_Group_Large" file_name="icons/Generic_Group_Large.png" preload="false" /> - <texture name="Generic_Object_Medium" file_name="icons/Generic_Object_Medium.png" preload="false" /> + <texture name="icon_group.tga" file_name="icons/Generic_Group.png" preload="false" /> <texture name="Generic_Object_Small" file_name="icons/Generic_Object_Small.png" preload="false" /> - <texture name="Generic_Object_Large" file_name="icons/Generic_Object_Large.png" preload="false" /> <texture name="Generic_Person" file_name="icons/Generic_Person.png" preload="false" /> <texture name="Generic_Person_Large" file_name="icons/Generic_Person_Large.png" preload="false" /> - <texture name="Health" file_name="icons/Health.png" preload="false" /> - - <texture name="Help_Off" file_name="navbar/Help_Off.png" preload="false" /> <texture name="Help_Press" file_name="navbar/Help_Press.png" preload="false" /> - <texture name="History_Arrow" file_name="navbar/History_Arrow.png" preload="true" /> + <texture name="Hierarchy_View_Disabled" file_name="icons/Hierarchy_View_Disabled.png" preload="false" /> + <texture name="Hierarchy_View_On" file_name="icons/Hierarchy_View_On.png" preload="false" /> + <texture name="Home_Off" file_name="navbar/Home_Off.png" preload="false" /> - <texture name="Home_Press" file_name="navbar/Home_Press.png" preload="false" /> <texture name="Icon_Close_Foreground" file_name="windows/Icon_Close_Foreground.png" preload="true" /> <texture name="Icon_Close_Press" file_name="windows/Icon_Close_Press.png" preload="true" /> @@ -206,7 +171,6 @@ with the same filename but different name <texture name="Icon_Help_Foreground" file_name="windows/Icon_Help_Foreground.png" preload="true" /> <texture name="Icon_Help_Press" file_name="windows/Icon_Help_Press.png" preload="true" /> - <texture name="Icon_Info" file_name="windows/Icon_Info.png" preload="false" /> <texture name="Icon_Minimize_Foreground" file_name="windows/Icon_Minimize_Foreground.png" preload="true" /> <texture name="Icon_Minimize_Press" file_name="windows/Icon_Minimize_Press.png" preload="true" /> @@ -225,13 +189,11 @@ with the same filename but different name <texture name="Inspector_Hover" file_name="windows/Inspector_Hover.png" preload="false" /> <texture name="Inspector_I" file_name="windows/Inspector_I.png" preload="false" /> - <texture name="Inv_Acessories" file_name="icons/Inv_Accessories.png" preload="false" /> <texture name="Inv_Alpha" file_name="icons/Inv_Alpha.png" preload="false" /> <texture name="Inv_Animation" file_name="icons/Inv_Animation.png" preload="false" /> <texture name="Inv_BodyShape" file_name="icons/Inv_BodyShape.png" preload="false" /> <texture name="Inv_CallingCard" file_name="icons/Inv_CallingCard.png" preload="false" /> <texture name="Inv_Clothing" file_name="icons/Inv_Clothing.png" preload="false" /> - <texture name="Inv_DangerousScript" file_name="icons/Inv_DangerousScript.png" preload="false" /> <texture name="Inv_Eye" file_name="icons/Inv_Eye.png" preload="false" /> <texture name="Inv_FolderClosed" file_name="icons/Inv_FolderClosed.png" preload="false" /> <texture name="Inv_FolderOpen" file_name="icons/Inv_FolderOpen.png" preload="false" /> @@ -239,14 +201,16 @@ with the same filename but different name <texture name="Inv_Gloves" file_name="icons/Inv_Gloves.png" preload="false" /> <texture name="Inv_Hair" file_name="icons/Inv_Hair.png" preload="false" /> <texture name="Inv_LinkItem" file_name="icons/Inv_LinkItem.png" preload="false" /> - <texture name="Inv_LinkItem_Broken" file_name="icons/Inv_LinkItem_Broken.png" preload="false" /> <texture name="Inv_LinkFolder" file_name="icons/Inv_LinkFolder.png" preload="false" /> <texture name="Inv_Jacket" file_name="icons/Inv_Jacket.png" preload="false" /> <texture name="Inv_LookFolderOpen" file_name="icons/Inv_LookFolderOpen.png" preload="false" /> <texture name="Inv_LookFolderClosed" file_name="icons/Inv_LookFolderClosed.png" preload="false" /> + <texture name="Inv_LostClosed" file_name="icons/Inv_LostClosed.png" preload="false" /> + <texture name="Inv_LostOpen" file_name="icons/Inv_LostOpen.png" preload="false" /> <texture name="Inv_Landmark" file_name="icons/Inv_Landmark.png" preload="false" /> <texture name="Inv_Notecard" file_name="icons/Inv_Notecard.png" preload="false" /> <texture name="Inv_Object" file_name="icons/Inv_Object.png" preload="false" /> + <texture name="Inv_Object_Multi" file_name="icons/Inv_Object_Multi.png" preload="false" /> <texture name="Inv_Pants" file_name="icons/Inv_Pants.png" preload="false" /> <texture name="Inv_Script" file_name="icons/Inv_Script.png" preload="false" /> <texture name="Inv_Shirt" file_name="icons/Inv_Shirt.png" preload="false" /> @@ -256,24 +220,31 @@ with the same filename but different name <texture name="Inv_Snapshot" file_name="icons/Inv_Snapshot.png" preload="false" /> <texture name="Inv_Socks" file_name="icons/Inv_Socks.png" preload="false" /> <texture name="Inv_Sound" file_name="icons/Inv_Sound.png" preload="false" /> + <texture name="Inv_SysClosed" file_name="icons/Inv_SysClosed.png" preload="false" /> + <texture name="Inv_SysOpen" file_name="icons/Inv_SysOpen.png" preload="false" /> <texture name="Inv_Tattoo" file_name="icons/Inv_Tattoo.png" preload="false" /> <texture name="Inv_Texture" file_name="icons/Inv_Texture.png" preload="false" /> - <texture name="Inv_Trash" file_name="icons/Inv_Trash.png" preload="false" /> + <texture name="Inv_TrashClosed" file_name="icons/Inv_TrashClosed.png" preload="false" /> + <texture name="Inv_TrashOpen" file_name="icons/Inv_TrashOpen.png" preload="false" /> <texture name="Inv_Underpants" file_name="icons/Inv_Underpants.png" preload="false" /> <texture name="Inv_Undershirt" file_name="icons/Inv_Undershirt.png" preload="false" /> + <texture name="Inv_Link" file_name="icons/Inv_Link.png" preload="false" /> <texture name="Linden_Dollar_Alert" file_name="widgets/Linden_Dollar_Alert.png"/> <texture name="Linden_Dollar_Background" file_name="widgets/Linden_Dollar_Background.png"/> - <texture name="ListItem_Select" file_name="widgets/ListItem_Select.png" preload="true" /> - <texture name="ListItem_Over" file_name="widgets/ListItem_Over.png" preload="true" /> + <texture name="ListItem_Select" file_name="widgets/ListItem_Select.png" preload="true" scale.left="2" scale.bottom="2" scale.top="22" scale.right="278" /> + <texture name="ListItem_Over" file_name="widgets/ListItem_Over.png" preload="true" scale.left="2" scale.bottom="2" scale.top="22" scale.right="278" /> + + <texture name="List_View_Disabled" file_name="icons/List_View_Disabled.png" preload="false" /> + <texture name="List_View_On" file_name="icons/List_View_On.png" preload="false" /> <texture name="Lock" file_name="icons/Lock.png" preload="false" /> <texture name="Lock2" file_name="navbar/Lock.png" preload="false" /> - <texture name="Login_Pod" file_name="windows/Login_Pod.png" preload="true" /> + <texture name="Locked_Icon" file_name="icons/Locked_Icon.png" preload="false" /> + - <texture name="Microphone_Mute" file_name="icons/Microphone_Mute.png" preload="false" /> <texture name="Microphone_On" file_name="icons/Microphone_On.png" preload="false" /> <texture name="MinusItem_Disabled" file_name="icons/MinusItem_Disabled.png" preload="false" /> @@ -282,24 +253,22 @@ with the same filename but different name <texture name="menu_separator" file_name="navbar/FileMenu_Divider.png" scale.left="4" scale.top="166" scale.right="0" scale.bottom="0" /> - <texture name="Move_Fly_Disabled" file_name="bottomtray/Move_Fly_Disabled.png" preload="false" /> + <texture name="MouseLook_View_Off" file_name="bottomtray/MouseLook_view_off.png" preload="false" /> + <texture name="MouseLook_View_On" file_name="bottomtray/MouseLook_view_on.png" preload="false" /> + <texture name="Move_Fly_Off" file_name="bottomtray/Move_Fly_Off.png" preload="false" /> - <texture name="Move_Fly_Over" file_name="bottomtray/Move_Fly_Over.png" preload="false" /> - <texture name="Move_Fly_Press" file_name="bottomtray/Move_Fly_Press.png" preload="false" /> - <texture name="Move_Run_Disabled" file_name="bottomtray/Move_Run_Disabled.png" preload="false" /> <texture name="Move_Run_Off" file_name="bottomtray/Move_Run_Off.png" preload="false" /> - <texture name="Move_Run_Over" file_name="bottomtray/Move_Run_Over.png" preload="false" /> - <texture name="Move_Run_Press" file_name="bottomtray/Move_Run_Press.png" preload="false" /> - <texture name="Move_Walk_Disabled" file_name="bottomtray/Move_Walk_Disabled.png" preload="false" /> <texture name="Move_Walk_Off" file_name="bottomtray/Move_Walk_Off.png" preload="false" /> - <texture name="Move_Walk_Over" file_name="bottomtray/Move_Walk_Over.png" preload="false" /> - <texture name="Move_Walk_Press" file_name="bottomtray/Move_Walk_Press.png" preload="false" /> <texture name="Movement_Backward_Off" file_name="bottomtray/Movement_Backward_Off.png" preload="false" /> <texture name="Movement_Backward_On" file_name="bottomtray/Movement_Backward_On.png" preload="false" /> <texture name="Movement_Down_Off" file_name="bottomtray/Movement_Down_Off.png" preload="false" /> <texture name="Movement_Down_On" file_name="bottomtray/Movement_Down_On.png" preload="false" /> <texture name="Movement_Forward_Off" file_name="bottomtray/Movement_Forward_Off.png" preload="false" /> <texture name="Movement_Forward_On" file_name="bottomtray/Movement_Forward_On.png" preload="false" /> + <texture name="Movement_Left_Off" file_name="bottomtray/Movement_Left_Off.png" preload="false" /> + <texture name="Movement_Left_On" file_name="bottomtray/Movement_Left_On.png" preload="false" /> + <texture name="Movement_Right_Off" file_name="bottomtray/Movement_Right_Off.png" preload="false" /> + <texture name="Movement_Right_On" file_name="bottomtray/Movement_Right_On.png" preload="false" /> <texture name="Movement_TurnLeft_Off" file_name="bottomtray/Movement_TurnLeft_Off.png" preload="false" /> <texture name="Movement_TurnLeft_On" file_name="bottomtray/Movement_TurnLeft_On.png" preload="false" /> <texture name="Movement_TurnRight_Off" file_name="bottomtray/Movement_TurnRight_Off.png" preload="false" /> @@ -310,10 +279,6 @@ with the same filename but different name <texture name="NavBar_BG_NoFav" file_name="navbar/NavBar_BG_NoFav.png" preload="true" scale.left="1" scale.top="1" scale.right="0" scale.bottom="0" /> <texture name="NavBar_BG" file_name="navbar/NavBar_BG.png" preload="true" scale.left="1" scale.top="1" scale.right="0" scale.bottom="0" /> - <texture name="NearbyVoice_Lvl1" file_name="bottomtray/NearbyVoice_Lvl1.png" preload="false" /> - <texture name="NearbyVoice_Lvl2" file_name="bottomtray/NearbyVoice_Lvl2.png" preload="false" /> - <texture name="NearbyVoice_Lvl3" file_name="bottomtray/NearbyVoice_Lvl3.png" preload="false" /> - <texture name="NearbyVoice_On" file_name="bottomtray/NearbyVoice_On.png" preload="false" /> <texture name="Notices_Unread" file_name="bottomtray/Notices_Unread.png" preload="true" /> @@ -351,31 +316,23 @@ with the same filename but different name <texture name="Object_Tube" file_name="build/Object_Tube.png" preload="false" /> <texture name="Object_Tube_Selected" file_name="build/Object_Tube_Selected.png" preload="false" /> + <texture name="Object_View_Off" file_name="bottomtray/Object_View_Off.png" preload="false" /> + <texture name="Object_View_On" file_name="bottomtray/Object_View_On.png" preload="false" /> + <texture name="OptionsMenu_Disabled" file_name="icons/OptionsMenu_Disabled.png" preload="false" /> <texture name="OptionsMenu_Off" file_name="icons/OptionsMenu_Off.png" preload="false" /> <texture name="OptionsMenu_Press" file_name="icons/OptionsMenu_Press.png" preload="false" /> - <texture name="Overhead_Arrow_L" file_name="world/Overhead_Arrow_L.png" preload="false" /> - <texture name="Overhead_Arrow_M" file_name="world/Overhead_Arrow_M.png" preload="false" /> - <texture name="Overhead_Arrow_S" file_name="world/Overhead_Arrow_S.png" preload="false" /> - <texture name="Overhead_L" file_name="world/Overhead_L.png" preload="false" /> - <texture name="Overhead_M" file_name="world/Overhead_M.png" preload="false" /> - <texture name="Overhead_S" file_name="world/Overhead_S.png" preload="false" /> + <texture name="PanOrbit_Off" file_name="bottomtray/PanOrbit_Off.png" preload="false" /> - <texture name="Parcel_Evry_Color" file_name="icons/Parcel_Evry_Color.png" preload="false" /> <texture name="Parcel_Exp_Color" file_name="icons/Parcel_Exp_Color.png" preload="false" /> - <texture name="Parcel_M_Color" file_name="icons/Parcel_M_Color.png" preload="false" /> <texture name="Parcel_Build_Dark" file_name="icons/Parcel_Build_Dark.png" preload="false" /> <texture name="Parcel_BuildNo_Dark" file_name="icons/Parcel_BuildNo_Dark.png" preload="false" /> <texture name="Parcel_Damage_Dark" file_name="icons/Parcel_Damage_Dark.png" preload="false" /> <texture name="Parcel_DamageNo_Dark" file_name="icons/Parcel_DamageNo_Dark.png" preload="false" /> - <texture name="Parcel_Evry_Dark" file_name="icons/Parcel_Evry_Dark.png" preload="false" /> - <texture name="Parcel_Exp_Dark" file_name="icons/Parcel_Exp_Dark.png" preload="false" /> <texture name="Parcel_Fly_Dark" file_name="icons/Parcel_Fly_Dark.png" preload="false" /> <texture name="Parcel_FlyNo_Dark" file_name="icons/Parcel_FlyNo_Dark.png" preload="false" /> - <texture name="Parcel_ForSale_Dark" file_name="icons/Parcel_ForSale_Dark.png" preload="false" /> - <texture name="Parcel_ForSaleNo_Dark" file_name="icons/Parcel_ForSaleNo_Dark.png" preload="false" /> <texture name="Parcel_Health_Dark" file_name="icons/Parcel_Health_Dark.png" preload="false" /> <texture name="Parcel_M_Dark" file_name="icons/Parcel_M_Dark.png" preload="false" /> <texture name="Parcel_PG_Dark" file_name="icons/Parcel_PG_Dark.png" preload="false" /> @@ -387,22 +344,13 @@ with the same filename but different name <texture name="Parcel_Voice_Dark" file_name="icons/Parcel_Voice_Dark.png" preload="false" /> <texture name="Parcel_VoiceNo_Dark" file_name="icons/Parcel_VoiceNo_Dark.png" preload="false" /> - <texture name="Parcel_Build_Light" file_name="icons/Parcel_Build_Light.png" preload="false" /> <texture name="Parcel_BuildNo_Light" file_name="icons/Parcel_BuildNo_Light.png" preload="false" /> - <texture name="Parcel_Damage_Light" file_name="icons/Parcel_Damage_Light.png" preload="false" /> - <texture name="Parcel_DamageNo_Light" file_name="icons/Parcel_DamageNo_Light.png" preload="false" /> - <texture name="Parcel_Evry_Light" file_name="icons/Parcel_Evry_Light.png" preload="false" /> - <texture name="Parcel_Exp_Light" file_name="icons/Parcel_Exp_Light.png" preload="false" /> - <texture name="Parcel_Fly_Light" file_name="icons/Parcel_Fly_Light.png" preload="false" /> <texture name="Parcel_FlyNo_Light" file_name="icons/Parcel_FlyNo_Light.png" preload="false" /> <texture name="Parcel_ForSale_Light" file_name="icons/Parcel_ForSale_Light.png" preload="false" /> - <texture name="Parcel_ForSaleNo_Light" file_name="icons/Parcel_ForSaleNo_Light.png" preload="false" /> <texture name="Parcel_M_Light" file_name="icons/Parcel_M_Light.png" preload="false" /> <texture name="Parcel_PG_Light" file_name="icons/Parcel_PG_Light.png" preload="false" /> - <texture name="Parcel_Push_Light" file_name="icons/Parcel_Push_Light.png" preload="false" /> <texture name="Parcel_PushNo_Light" file_name="icons/Parcel_PushNo_Light.png" preload="false" /> <texture name="Parcel_R_Light" file_name="icons/Parcel_R_Light.png" preload="false" /> - <texture name="Parcel_Scripts_Light" file_name="icons/Parcel_Scripts_Light.png" preload="false" /> <texture name="Parcel_ScriptsNo_Light" file_name="icons/Parcel_ScriptsNo_Dark.png" preload="false" /> <texture name="Parcel_Voice_Light" file_name="icons/Parcel_Voice_Light.png" preload="false" /> <texture name="Parcel_VoiceNo_Light" file_name="icons/Parcel_VoiceNo_Light.png" preload="false" /> @@ -414,18 +362,6 @@ with the same filename but different name <texture name="Play_Over" file_name="icons/Play_Over.png" preload="false" /> <texture name="Play_Press" file_name="icons/Play_Press.png" preload="false" /> - <texture name="Progress_1" file_name="icons/Progress_1.png" preload="false" /> - <texture name="Progress_2" file_name="icons/Progress_2.png" preload="false" /> - <texture name="Progress_3" file_name="icons/Progress_3.png" preload="false" /> - <texture name="Progress_4" file_name="icons/Progress_4.png" preload="false" /> - <texture name="Progress_5" file_name="icons/Progress_5.png" preload="false" /> - <texture name="Progress_6" file_name="icons/Progress_6.png" preload="false" /> - <texture name="Progress_7" file_name="icons/Progress_7.png" preload="false" /> - <texture name="Progress_8" file_name="icons/Progress_8.png" preload="false" /> - <texture name="Progress_9" file_name="icons/Progress_9.png" preload="false" /> - <texture name="Progress_10" file_name="icons/Progress_10.png" preload="false" /> - <texture name="Progress_11" file_name="icons/Progress_11.png" preload="false" /> - <texture name="Progress_12" file_name="icons/Progress_12.png" preload="false" /> <texture name="ProgressBar" file_name="widgets/ProgressBar.png" preload="true" scale.left="4" scale.top="10" scale.right="48" scale.bottom="2" /> <texture name="ProgressTrack" file_name="widgets/ProgressTrack.png" preload="true" scale.left="4" scale.top="13" scale.right="148" scale.bottom="2" /> @@ -434,7 +370,6 @@ with the same filename but different name <texture name="PushButton_Off" file_name="widgets/PushButton_Off.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" /> <texture name="PushButton_On" file_name="widgets/PushButton_On.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" /> <texture name="PushButton_On_Selected" file_name="widgets/PushButton_On_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" /> - <texture name="PushButton_On_Disabled" file_name="widgets/PushButton_On_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" /> <texture name="PushButton_Press" file_name="widgets/PushButton_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" /> <texture name="PushButton_Selected" file_name="widgets/PushButton_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" /> <texture name="PushButton_Selected_Press" file_name="widgets/PushButton_Selected_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" /> @@ -447,12 +382,8 @@ with the same filename but different name <texture name="RadioButton_Disabled" file_name="widgets/RadioButton_Disabled.png" preload="true" /> <texture name="RadioButton_On_Disabled" file_name="widgets/RadioButton_On_Disabled.png" preload="true" /> - <texture name="Rec_Off" file_name="icons/Rec_Off.png" preload="false" /> - <texture name="Rec_On" file_name="icons/Rec_On.png" preload="false" /> - <texture name="Refresh_Disabled" file_name="icons/Refresh_Disabled.png" preload="false" /> <texture name="Refresh_Off" file_name="icons/Refresh_Off.png" preload="false" /> - <texture name="Refresh_Press" file_name="icons/Refresh_Press.png" preload="false" /> <texture name="Resize_Corner" file_name="windows/Resize_Corner.png" preload="true" /> @@ -469,14 +400,11 @@ with the same filename but different name <texture name="ScrollTrack_Vert" file_name="widgets/ScrollTrack_Vert.png" preload="true" scale.left="2" scale.top="40" scale.bottom="13" scale.right="0" /> <texture name="ScrollTrack_Horiz" file_name="widgets/ScrollTrack_Horiz.png" preload="true" scale.left="4" scale.top="0" scale.bottom="0" scale.right="2" /> - <texture name="ScrubberThumb_Disabled" file_name="widgets/ScrubberThumb_Disabled.png" preload="false" /> - <texture name="ScrubberThumb_Focus" file_name="widgets/ScrubberThumb_Focus.png" preload="false" /> - <texture name="ScrubberThumb_Off" file_name="widgets/ScrubberThumb_Off.png" preload="false" /> - <texture name="ScrubberThumb_Over" file_name="widgets/ScrubberThumb_Over.png" preload="false" /> - <texture name="ScrubberThumb_Press" file_name="widgets/ScrubberThumb_Press.png" preload="false" /> <texture name="Search" file_name="navbar/Search.png" preload="false" /> + <texture name="Search_Icon" file_name="icons/Search_Icon.png" preload="false" /> + <texture name="SegmentedBtn_Left_Off" file_name="widgets/SegmentedBtn_Left_Off.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" /> <texture name="SegmentedBtn_Left_Over" file_name="widgets/SegmentedBtn_Left_Over.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" /> <texture name="SegmentedBtn_Left_Press" file_name="widgets/SegmentedBtn_Left_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" /> @@ -486,8 +414,6 @@ with the same filename but different name <texture name="SegmentedBtn_Left_Selected_Press" file_name="widgets/SegmentedBtn_Left_Selected_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" /> <texture name="SegmentedBtn_Left_Selected_Disabled" file_name="widgets/SegmentedBtn_Left_Selected_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" /> - <texture name="SegmentedBtn_Middle_Off" file_name="widgets/SegmentedBtn_Middle_Off.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" /> - <texture name="SegmentedBtn_Middle_Press" file_name="widgets/SegmentedBtn_Middle_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" /> <texture name="SegmentedBtn_Middle_Disabled" file_name="widgets/SegmentedBtn_Middle_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" /> <texture name="SegmentedBtn_Middle_Selected" file_name="widgets/SegmentedBtn_Middle_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" /> <texture name="SegmentedBtn_Middle_Selected_Press" file_name="widgets/SegmentedBtn_Middle_Selected_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" /> @@ -501,12 +427,11 @@ with the same filename but different name <texture name="SegmentedBtn_Right_Selected_Press" file_name="widgets/SegmentedBtn_Right_Selected_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" /> <texture name="SegmentedBtn_Right_Selected_Disabled" file_name="widgets/SegmentedBtn_Right_Selected_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" /> + <texture name="Shirt_Large" file_name="icons/Shirt_Large.png" preload="false" /> + <texture name="Shop" file_name="icons/Shop.png" preload="false" /> + <texture name="SkipBackward_Off" file_name="icons/SkipBackward_Off.png" preload="false" /> - <texture name="SkipBackward_Over" file_name="icons/SkipBackward_Over.png" preload="false" /> - <texture name="SkipBackward_Press" file_name="icons/SkipBackward_Press.png" preload="false" /> <texture name="SkipForward_Off" file_name="icons/SkipForward_Off.png" preload="false" /> - <texture name="SkipForward_Over" file_name="icons/SkipForward_Over.png" preload="false" /> - <texture name="SkipForward_Press" file_name="icons/SkipForward_Press.png" preload="false" /> <texture name="SliderTrack_Horiz" file_name="widgets/SliderTrack_Horiz.png" scale.left="4" scale.top="4" scale.right="100" scale.bottom="2" /> <texture name="SliderTrack_Vert" file_name="widgets/SliderTrack_Vert.png" scale.left="2" scale.top="100" scale.right="4" scale.bottom="4" /> @@ -515,65 +440,39 @@ with the same filename but different name <texture name="SliderThumb_Press" file_name="widgets/SliderThumb_Press.png" /> <texture name="SL_Logo" file_name="icons/SL_Logo.png" preload="true" /> + <texture name="OBJECT_Icon" file_name="icons/object_icon.png" preload="true" /> + <texture name="Unknown_Icon" file_name="icons/unknown_icon.png" preload="true" /> <texture name="Snapshot_Off" file_name="bottomtray/Snapshot_Off.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" /> - <texture name="Snapshot_Over" file_name="bottomtray/Snapshot_Over.png" preload="false" /> - <texture name="Snapshot_Press" file_name="bottomtray/Snapshot_Press.png" preload="false" /> <texture name="startup_logo" file_name="windows/startup_logo.png" preload="true" /> - <texture name="Stepper_Down_Disabled" file_name="widgets/Stepper_Down_Disabled.png" preload="false" /> <texture name="Stepper_Down_Off" file_name="widgets/Stepper_Down_Off.png" preload="false" /> <texture name="Stepper_Down_Press" file_name="widgets/Stepper_Down_Press.png" preload="false" /> - <texture name="Stepper_Up_Disabled" file_name="widgets/Stepper_Up_Disabled.png" preload="false" /> <texture name="Stepper_Up_Off" file_name="widgets/Stepper_Up_Off.png" preload="false" /> <texture name="Stepper_Up_Press" file_name="widgets/Stepper_Up_Press.png" preload="false" /> <texture name="Stop_Off" file_name="icons/Stop_Off.png" preload="false" /> - <texture name="Stop_Over" file_name="icons/Stop_Over.png" preload="false" /> - <texture name="Stop_Press" file_name="icons/Stop_Press.png" preload="false" /> <texture name="StopReload_Off" file_name="icons/StopReload_Off.png" preload="false" /> <texture name="StopReload_Over" file_name="icons/StopReload_Over.png" preload="false" /> - <texture name="StopReload_Press" file_name="icons/StopReload_Press.png" preload="false" /> - <texture name="TabIcon_Appearance_Large" file_name="taskpanel/TabIcon_Appearance_Large.png" preload="false" /> <texture name="TabIcon_Appearance_Off" file_name="taskpanel/TabIcon_Appearance_Off.png" preload="false" /> - <texture name="TabIcon_Appearance_Over" file_name="taskpanel/TabIcon_Appearance_Over.png" preload="false" /> <texture name="TabIcon_Appearance_Selected" file_name="taskpanel/TabIcon_Appearance_Selected.png" preload="false" /> <texture name="TabIcon_Close_Off" file_name="taskpanel/TabIcon_Close_Off.png" preload="false" /> - <texture name="TabIcon_Close_Over" file_name="taskpanel/TabIcon_Close_Over.png" preload="false" /> - <texture name="TabIcon_Inventory_Large" file_name="taskpanel/TabIcon_Inventory_Large.png" preload="false" /> - <texture name="TabIcon_Inventory_Off" file_name="taskpanel/TabIcon_Inventory_Off.png" preload="false" /> - <texture name="TabIcon_Inventory_Over" file_name="taskpanel/TabIcon_Inventory_Over.png" preload="false" /> - <texture name="TabIcon_Inventory_Selected" file_name="taskpanel/TabIcon_Inventory_Selected.png" preload="false" /> - <texture name="TabIcon_Home_Large" file_name="taskpanel/TabIcon_Home_Large.png" preload="false" /> <texture name="TabIcon_Home_Off" file_name="taskpanel/TabIcon_Home_Off.png" preload="false" /> - <texture name="TabIcon_Home_Over" file_name="taskpanel/TabIcon_Home_Over.png" preload="false" /> <texture name="TabIcon_Home_Selected" file_name="taskpanel/TabIcon_Home_Selected.png" preload="false" /> - <texture name="TabIcon_Me_Large" file_name="taskpanel/TabIcon_Me_Large.png" preload="false" /> <texture name="TabIcon_Me_Off" file_name="taskpanel/TabIcon_Me_Off.png" preload="false" /> - <texture name="TabIcon_Me_Over" file_name="taskpanel/TabIcon_Me_Over.png" preload="false" /> <texture name="TabIcon_Me_Selected" file_name="taskpanel/TabIcon_Me_Selected.png" preload="false" /> <texture name="TabIcon_Open_Off" file_name="taskpanel/TabIcon_Open_Off.png" preload="false" /> - <texture name="TabIcon_Open_Over" file_name="taskpanel/TabIcon_Open_Over.png" preload="false" /> - <texture name="TabIcon_People_Large" file_name="taskpanel/TabIcon_People_Large.png" preload="false" /> <texture name="TabIcon_People_Off" file_name="taskpanel/TabIcon_People_Off.png" preload="false" /> - <texture name="TabIcon_People_Over" file_name="taskpanel/TabIcon_People_Over.png" preload="false" /> <texture name="TabIcon_People_Selected" file_name="taskpanel/TabIcon_People_Selected.png" preload="false" /> <texture name="TabIcon_Places_Large" file_name="taskpanel/TabIcon_Places_Large.png" preload="false" /> <texture name="TabIcon_Places_Off" file_name="taskpanel/TabIcon_Places_Off.png" preload="false" /> - <texture name="TabIcon_Places_Over" file_name="taskpanel/TabIcon_Places_Over.png" preload="false" /> <texture name="TabIcon_Places_Selected" file_name="taskpanel/TabIcon_Places_Selected.png" preload="false" /> - <texture name="TabIcon_Things_Large" file_name="taskpanel/TabIcon_Things_Large.png" preload="false" /> <texture name="TabIcon_Things_Off" file_name="taskpanel/TabIcon_Things_Off.png" preload="false" /> - <texture name="TabIcon_Things_Over" file_name="taskpanel/TabIcon_Things_Over.png" preload="false" /> <texture name="TabIcon_Things_Selected" file_name="taskpanel/TabIcon_Things_Selected.png" preload="false" /> - <texture name="TabTop_Divider" file_name="containers/TabTop_Divider.png" preload="false" /> - <texture name="TabTop_Left_Press" file_name="containers/TabTop_Left_Press.png" preload="false" /> - <texture name="TabTop_Middle_Press" file_name="containers/TabTop_Middle_Press.png" preload="false" /> <texture name="TabTop_Right_Off" file_name="containers/TabTop_Right_Off.png" preload="false" scale.left="8" scale.top="8" scale.right="62" scale.bottom="9" /> - <texture name="TabTop_Right_Press" file_name="containers/TabTop_Right_Press.png" preload="false" /> <texture name="TabTop_Right_Selected" file_name="containers/TabTop_Right_Selected.png" preload="false" scale.left="8" scale.top="8" scale.right="62" scale.bottom="9" /> <texture name="TabTop_Middle_Off" file_name="containers/TabTop_Middle_Off.png" preload="false" scale.left="8" scale.top="8" scale.right="120" scale.bottom="9" /> <texture name="TabTop_Middle_Selected" file_name="containers/TabTop_Middle_Selected.png" preload="false" scale.left="8" scale.top="8" scale.right="96" scale.bottom="9" /> @@ -582,8 +481,6 @@ with the same filename but different name <texture name="TaskPanel_Tab_Off" file_name="taskpanel/TaskPanel_Tab_Off.png" preload="false" scale.left="4" scale.top="29" scale.right="36" scale.bottom="4" /> <texture name="TaskPanel_Tab_Selected" file_name="taskpanel/TaskPanel_Tab_Selected.png" preload="false" scale.left="5" scale.top="30" scale.right="36" scale.bottom="5" /> - <texture name="TaskPanel_BG" file_name="taskpanel/TaskPanel_BG.png" preload="false" scale.left="4" scale.top="146" scale.right="146" scale.bottom="4" /> - <texture name="TaskPanel_Tab_Unselected" file_name="taskpanel/TaskPanel_Tab_Over.png" preload="false" scale.left="5" scale.top="30" scale.right="36" scale.bottom="5" /> <texture name="TextField_Search_Disabled" file_name="widgets/TextField_Search_Disabled.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" /> <texture name="TextField_Off" file_name="widgets/TextField_Off.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" /> @@ -592,7 +489,6 @@ with the same filename but different name <texture name="TextField_Disabled" file_name="widgets/TextField_Disabled.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" /> <texture name="TextField_Active" file_name="widgets/TextField_Active.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" /> - <texture name="TimeBasedMediaBackground" file_name="windows/TimeBasedMediaBackground.png" preload="false" /> <texture name="Toast_CloseBtn" file_name="windows/Toast_CloseBtn.png" preload="true" /> <texture name="Toast_Background" file_name="windows/Toast_Background.png" preload="true" @@ -601,26 +497,23 @@ with the same filename but different name scale.left="4" scale.top="28" scale.right="60" scale.bottom="4" /> <texture name="Tool_Create" file_name="build/Tool_Create.png" preload="false" /> - <texture name="Tool_Create_Selected" file_name="build/Tool_Create_Selected.png" preload="false" /> <texture name="Tool_Dozer" file_name="build/Tool_Dozer.png" preload="false" /> - <texture name="Tool_Dozer_Selected" file_name="build/Tool_Dozer_Selected.png" preload="false" /> <texture name="Tool_Face" file_name="build/Tool_Face.png" preload="false" /> - <texture name="Tool_Face_Selected" file_name="build/Tool_Face_Selected.png" preload="false" /> <texture name="Tool_Grab" file_name="build/Tool_Grab.png" preload="false" /> - <texture name="Tool_Grab_Selected" file_name="build/Tool_Grab_Selected.png" preload="false" /> <texture name="Tool_Zoom" file_name="build/Tool_Zoom.png" preload="false" /> - <texture name="Tool_Zoom_Selected" file_name="build/Tool_Zoom_Selected.png" preload="false" /> - <texture name="Toolbar_Divider" file_name="containers/Toolbar_Divider.png" preload="false" /> + <texture name="Toolbar_Left_Flash" file_name="containers/Toolbar_Left_Flash.png" preload="false" scale.left="5" scale.bottom="4" scale.top="24" scale.right="30" /> <texture name="Toolbar_Left_Off" file_name="containers/Toolbar_Left_Off.png" preload="false" scale.left="5" scale.bottom="4" scale.top="24" scale.right="30" /> - <texture name="Toolbar_Left_Press" file_name="containers/Toolbar_Left_Press.png" preload="false" scale.left="5" scale.bottom="4" scale.top="24" scale.right="30" /> + <texture name="Toolbar_Left_Over" file_name="containers/Toolbar_Left_Over.png" preload="false" scale.left="5" scale.bottom="4" scale.top="24" scale.right="30" /> <texture name="Toolbar_Left_Selected" file_name="containers/Toolbar_Left_Selected.png" preload="false" scale.left="5" scale.bottom="4" scale.top="24" scale.right="30" /> <texture name="Toolbar_Middle_Off" file_name="containers/Toolbar_Middle_Off.png" preload="false" scale.left="1" scale.bottom="2" scale.top="24" scale.right="30" /> - <texture name="Toolbar_Middle_Press" file_name="containers/Toolbar_Middle_Press.png" preload="false" scale.left="1" scale.bottom="2" scale.top="24" scale.right="30" /> + <texture name="Toolbar_Middle_Over" file_name="containers/Toolbar_Middle_Over.png" preload="false" scale.left="1" scale.bottom="2" scale.top="24" scale.right="30" /> <texture name="Toolbar_Middle_Selected" file_name="containers/Toolbar_Middle_Selected.png" preload="false" scale.left="1" scale.bottom="2" scale.top="24" scale.right="30" /> + <texture name="Toolbar_Middle_Flash" file_name="containers/Toolbar_Middle_Flash.png" preload="false" scale.left="5" scale.bottom="4" scale.top="24" scale.right="30" /> <texture name="Toolbar_Right_Off" file_name="containers/Toolbar_Right_Off.png" preload="false" scale.left="1" scale.bottom="4" scale.top="24" scale.right="26" /> - <texture name="Toolbar_Right_Press" file_name="containers/Toolbar_Right_Press.png" preload="false" scale.left="1" scale.bottom="4" scale.top="24" scale.right="26" /> + <texture name="Toolbar_Right_Over" file_name="containers/Toolbar_Right_Over.png" preload="false" scale.left="1" scale.bottom="4" scale.top="24" scale.right="26" /> <texture name="Toolbar_Right_Selected" file_name="containers/Toolbar_Right_Selected.png" preload="false" scale.left="1" scale.bottom="4" scale.top="24" scale.right="26" /> + <texture name="Toolbar_Right_Flash" file_name="containers/Toolbar_Right_Flash.png" preload="false" scale.left="1" scale.bottom="4" scale.top="24" scale.right="26" /> <texture name="Tooltip" file_name="widgets/Tooltip.png" preload="true" scale.left="2" scale.top="16" scale.right="100" scale.bottom="3" /> @@ -629,11 +522,12 @@ with the same filename but different name <texture name="TrashItem_Press" file_name="icons/TrashItem_Press.png" preload="false" /> <texture name="Unread_Chiclet" file_name="bottomtray/Unread_Chiclet.png" preload="false" /> - <texture name="Unread_Msg" file_name="bottomtray/Unread_Msg.png" preload="false" /> <texture name="Unread_IM" file_name="bottomtray/Unread_IM.png" preload="false" /> - <texture name="WellButton_Lit" file_name="bottomtray/WellButton_Lit.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" /> - <texture name="WellButton_Lit_Selected" file_name="bottomtray/WellButton_Lit_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" /> + <texture name="UpArrow_Off" file_name="icons/UpArrow_Off.png" preload="false" /> + + <texture name="Volume_Background" file_name="windows/Volume_Background.png" preload="false" + scale.left="6" scale.top="33" scale.right="63" scale.bottom="10" /> <texture name="VoicePTT_Lvl1" file_name="bottomtray/VoicePTT_Lvl1.png" preload="false" /> <texture name="VoicePTT_Lvl2" file_name="bottomtray/VoicePTT_Lvl2.png" preload="false" /> @@ -641,10 +535,12 @@ with the same filename but different name <texture name="VoicePTT_Off" file_name="bottomtray/VoicePTT_Off.png" preload="false" /> <texture name="VoicePTT_On" file_name="bottomtray/VoicePTT_On.png" preload="false" /> - <texture name="WebBasedMediaBackground" file_name="windows/WebBasedMediaBackground.png" preload="false" /> + <texture name="Wearables_Divider" file_name="windows/Wearables_Divider.png" preload="false" /> + + <texture name="WellButton_Lit" file_name="bottomtray/WellButton_Lit.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" /> + <texture name="WellButton_Lit_Selected" file_name="bottomtray/WellButton_Lit_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" /> + - <texture name="Widget_DownArrow" file_name="icons/Widget_DownArrow.png" preload="true" /> - <texture name="Widget_UpArrow" file_name="icons/Widget_UpArrow.png" preload="true" /> <texture name="Window_Background" file_name="windows/Window_Background.png" preload="true" scale.left="4" scale.top="24" scale.right="26" scale.bottom="4" /> @@ -658,30 +554,18 @@ with the same filename but different name <texture name="YouAreHere_Badge" file_name="icons/YouAreHere_Badge.png" preload="false" /> <texture name="Zoom_Off" file_name="icons/Zoom_Off.png" preload="false" /> - <texture name="Zoom_Over" file_name="icons/Zoom_Over.png" preload="false" /> - <texture name="Zoom_Press" file_name="icons/Zoom_Press.png" preload="false" /> <texture name="UnZoom_Off" file_name="icons/UnZoom_Off.png" preload="false" /> - <texture name="UnZoom_Over" file_name="icons/UnZoom_Over.png" preload="false" /> - <texture name="UnZoom_Press" file_name="icons/UnZoom_Press.png" preload="false" /> - <texture name="PowerOn_Off" file_name="icons/PowerOn_Off.png" preload="false" /> - <texture name="PowerOn_Over" file_name="icons/PowerOn_Over.png" preload="false" /> - <texture name="PowerOn_Press" file_name="icons/PowerOn_Press.png" preload="false" /> - <texture name="PowerOff_Off" file_name="icons/PowerOff_Off.png" preload="false" /> - <texture name="PowerOff_Over" file_name="icons/PowerOff_Over.png" preload="false" /> - <texture name="PowerOff_Press" file_name="icons/PowerOff_Press.png" preload="false" /> <texture name="pixiesmall.j2c" use_mips="true" /> <texture name="script_error.j2c" use_mips="true" /> <texture name="silhouette.j2c" use_mips="true" /> <texture name="foot_shadow.j2c" use_mips="true" /> <texture name="cloud-particle.j2c" use_mips="true" /> + <texture name="transparent.j2c" use_mips="true" /> <!--WARNING OLD ART BELOW *do not use*--> - <texture name="icn_chatbar.tga" /> <texture name="icn_media_web.tga" preload="true" /> <texture name="icn_media_movie.tga" preload="true" /> - <texture name="icn_speaker-muted_dark.tga" /> - <texture name="icn_speaker_dark.tga" /> <texture name="icn_voice-localchat.tga" /> <texture name="icn_voice-groupfocus.tga" /> <texture name="icn_voice-pvtfocus.tga" /> @@ -703,12 +587,6 @@ with the same filename but different name <texture name="tearoffbox.tga" /> <texture name="tearoff_pressed.tga" /> - <texture name="icn_label_music.tga" /> - <texture name="icn_label_media.tga" /> - <texture name="icn_rounded-text-field.tga" scale.left="14" scale.bottom="16" scale.top="16" scale.right="114" /> - - <texture name="toggle_button_off" file_name="toggle_button_off.png" preload="true" /> - <texture name="toggle_button_selected" file_name="toggle_button_selected.png" preload="true" /> <texture name="color_swatch_alpha.tga" preload="true" /> <texture name="button_anim_pause.tga" /> @@ -718,15 +596,11 @@ with the same filename but different name <texture name="crosshairs.tga" /> <texture name="direction_arrow.tga" file_name="world/BeaconArrow.png" /> - <texture name="icon_auction.tga" /> <texture name="icon_avatar_offline.tga" /> <texture name="icon_avatar_online.tga" /> <texture name="icon_day_cycle.tga" /> <texture name="icon_diurnal.tga" /> - <texture name="icon_event.tga" /> - <texture name="icon_event_mature.tga" /> - <texture name="icon_for_sale.tga" /> - <texture name="icon_place_for_sale.tga" /> + <texture name="icon_for_sale.tga" file_name="icons/Icon_For_Sale.png" /> <texture name="icon_top_pick.tga" /> <texture name="lag_status_critical.tga" /> @@ -737,7 +611,6 @@ with the same filename but different name <texture name="map_avatar_16.tga" /> <texture name="map_avatar_8.tga" /> - <texture name="map_avatar_you_8.tga" /> <texture name="map_event.tga" /> <texture name="map_event_mature.tga" /> <texture name="map_home.tga" /> @@ -746,29 +619,27 @@ with the same filename but different name <texture name="map_track_16.tga" /> <texture name="notify_caution_icon.tga" /> - <texture name="notify_next.png" preload="true" /> - <texture name="notify_box_icon.tga" /> - - <texture name="icn_active-speakers-dot-lvl0.tga" /> - <texture name="icn_active-speakers-dot-lvl1.tga" /> - <texture name="icn_active-speakers-dot-lvl2.tga" /> - <texture name="icn_active-speakers-typing1.tga" /> - <texture name="icn_active-speakers-typing2.tga" /> - <texture name="icn_active-speakers-typing3.tga" /> - - <texture name="icn_voice_ptt-off.tga" /> - <texture name="icn_voice_ptt-on.tga" /> - <texture name="icn_voice_ptt-on-lvl1.tga" /> - <texture name="icn_voice_ptt-on-lvl2.tga" /> - <texture name="icn_voice_ptt-on-lvl3.tga" /> - <texture name="icn_voice-call-end.tga" /> - <texture name="icn_voice-call-start.tga" /> - - <texture name="mute_icon.tga" /> <texture name="default_land_picture.j2c" /> <texture name="default_profile_picture.j2c" /> <texture name="locked_image.j2c" /> - <texture name="media_floater_border_16.png" scale_top="12" scale_left="4" scale_bottom="4" scale_right="12" /> + <texture name="Progress_1" file_name="icons/Progress_1.png" preload="true" /> + <texture name="Progress_2" file_name="icons/Progress_2.png" preload="true" /> + <texture name="Progress_3" file_name="icons/Progress_3.png" preload="true" /> + <texture name="Progress_4" file_name="icons/Progress_4.png" preload="true" /> + <texture name="Progress_5" file_name="icons/Progress_5.png" preload="true" /> + <texture name="Progress_6" file_name="icons/Progress_6.png" preload="true" /> + <texture name="Progress_7" file_name="icons/Progress_7.png" preload="true" /> + <texture name="Progress_8" file_name="icons/Progress_8.png" preload="true" /> + <texture name="Progress_9" file_name="icons/Progress_9.png" preload="true" /> + <texture name="Progress_10" file_name="icons/Progress_10.png" preload="true" /> + <texture name="Progress_11" file_name="icons/Progress_11.png" preload="true" /> + <texture name="Progress_12" file_name="icons/Progress_12.png" preload="true" /> + + <texture name="bevel_background" file_name="widgets/bevel_background.png" preload="true" scale.left="12" scale.top="15" scale.right="108" scale.bottom="2"/> + <texture name="buy_off" file_name="widgets/buy_off.png" preload="true" scale.left="2" scale.top="15" scale.right="67" scale.bottom="4"/> + <texture name="buy_over" file_name="widgets/buy_over.png" preload="true" scale.left="2" scale.top="15" scale.right="67" scale.bottom="4"/> + <texture name="buy_press" file_name="widgets/buy_press.png" preload="true" scale.left="2" scale.top="15" scale.right="67" scale.bottom="4"/> + </textures> diff --git a/indra/newview/skins/default/textures/widgets/bevel_background.png b/indra/newview/skins/default/textures/widgets/bevel_background.png Binary files differnew file mode 100644 index 0000000000..fb5067503d --- /dev/null +++ b/indra/newview/skins/default/textures/widgets/bevel_background.png diff --git a/indra/newview/skins/default/textures/widgets/buy_off.png b/indra/newview/skins/default/textures/widgets/buy_off.png Binary files differnew file mode 100644 index 0000000000..ee5979046f --- /dev/null +++ b/indra/newview/skins/default/textures/widgets/buy_off.png diff --git a/indra/newview/skins/default/textures/widgets/buy_over.png b/indra/newview/skins/default/textures/widgets/buy_over.png Binary files differnew file mode 100644 index 0000000000..93adb68c86 --- /dev/null +++ b/indra/newview/skins/default/textures/widgets/buy_over.png diff --git a/indra/newview/skins/default/textures/widgets/buy_press.png b/indra/newview/skins/default/textures/widgets/buy_press.png Binary files differnew file mode 100644 index 0000000000..3f442d6eaa --- /dev/null +++ b/indra/newview/skins/default/textures/widgets/buy_press.png diff --git a/indra/newview/skins/default/textures/windows/Dragbar.png b/indra/newview/skins/default/textures/windows/Dragbar.png Binary files differnew file mode 100644 index 0000000000..d94dda1aae --- /dev/null +++ b/indra/newview/skins/default/textures/windows/Dragbar.png diff --git a/indra/newview/skins/default/textures/windows/Flyout_Pointer_Up.png b/indra/newview/skins/default/textures/windows/Flyout_Pointer_Up.png Binary files differnew file mode 100644 index 0000000000..361fab59e0 --- /dev/null +++ b/indra/newview/skins/default/textures/windows/Flyout_Pointer_Up.png diff --git a/indra/newview/skins/default/textures/windows/Icon_Gear_Background.png b/indra/newview/skins/default/textures/windows/Icon_Gear_Background.png Binary files differindex db74b93afd..93d62a8d4f 100644 --- a/indra/newview/skins/default/textures/windows/Icon_Gear_Background.png +++ b/indra/newview/skins/default/textures/windows/Icon_Gear_Background.png diff --git a/indra/newview/skins/default/textures/windows/Icon_Gear_Foreground.png b/indra/newview/skins/default/textures/windows/Icon_Gear_Foreground.png Binary files differindex 1032e45f7e..b2b2a77a88 100644 --- a/indra/newview/skins/default/textures/windows/Icon_Gear_Foreground.png +++ b/indra/newview/skins/default/textures/windows/Icon_Gear_Foreground.png diff --git a/indra/newview/skins/default/textures/windows/Icon_Gear_Over.png b/indra/newview/skins/default/textures/windows/Icon_Gear_Over.png Binary files differindex 01dbde102b..67bd399358 100644 --- a/indra/newview/skins/default/textures/windows/Icon_Gear_Over.png +++ b/indra/newview/skins/default/textures/windows/Icon_Gear_Over.png diff --git a/indra/newview/skins/default/textures/windows/Icon_Gear_Press.png b/indra/newview/skins/default/textures/windows/Icon_Gear_Press.png Binary files differindex 6614bdd165..6fc3744d6b 100644 --- a/indra/newview/skins/default/textures/windows/Icon_Gear_Press.png +++ b/indra/newview/skins/default/textures/windows/Icon_Gear_Press.png diff --git a/indra/newview/skins/default/textures/windows/Volume_Background.png b/indra/newview/skins/default/textures/windows/Volume_Background.png Binary files differnew file mode 100644 index 0000000000..43aaa441f5 --- /dev/null +++ b/indra/newview/skins/default/textures/windows/Volume_Background.png diff --git a/indra/newview/skins/default/textures/windows/Wearables_Divider.png b/indra/newview/skins/default/textures/windows/Wearables_Divider.png Binary files differnew file mode 100644 index 0000000000..9dce7bf45c --- /dev/null +++ b/indra/newview/skins/default/textures/windows/Wearables_Divider.png diff --git a/indra/newview/skins/default/textures/world/BeaconArrow.png b/indra/newview/skins/default/textures/world/BeaconArrow.png Binary files differindex 12dc246d51..54934f738a 100644 --- a/indra/newview/skins/default/textures/world/BeaconArrow.png +++ b/indra/newview/skins/default/textures/world/BeaconArrow.png diff --git a/indra/newview/skins/default/xui/da/floater_about.xml b/indra/newview/skins/default/xui/da/floater_about.xml index eb63b5c975..2e9d003848 100644 --- a/indra/newview/skins/default/xui/da/floater_about.xml +++ b/indra/newview/skins/default/xui/da/floater_about.xml @@ -8,7 +8,7 @@ Bygget med [COMPILER] version [COMPILER_VERSION] </floater.string> <floater.string name="AboutPosition"> - Du er ved [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] i [REGION] lokaliseret pÃ¥ [HOSTNAME] ([HOSTIP]) + Du er ved [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] i regionen [REGION] lokaliseret ved <nolink>[HOSTNAME]</nolink> ([HOSTIP]) [SERVER_VERSION] [[SERVER_RELEASE_NOTES_URL] [ReleaseNotes]] </floater.string> @@ -29,7 +29,7 @@ libcurl Version: [LIBCURL_VERSION] J2C Decoder Version: [J2C_VERSION] Audio Driver Version: [AUDIO_DRIVER_VERSION] Qt Webkit Version: [QT_WEBKIT_VERSION] -Vivox Version: [VIVOX_VERSION] +Voice Server Version: [VOICE_VERSION] </floater.string> <floater.string name="none"> (ingen) @@ -43,13 +43,14 @@ Vivox Version: [VIVOX_VERSION] </panel> <panel label="Tak til" name="credits_panel"> <text_editor name="credits_editor"> - Second Life er gjort muligt for dig af Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl and many others. + Second Life er lavet til dig af Philip, Tessa, Andrew, Cory, Ian, James, Phoenix, Ryan, Haney, Dan, Char, Ben, John, Tanya, Eddie, Richard, Mitch, Doug, Eric, Frank, Bruce, Aaron, Peter, Alice, Charlie, Debra, Eileen, Helen, Janet, Steffan, Steve, Tom, Mark, Hunter, Xenon, Burgess, Bill, Jim, Lee, Hamlet, Daniel, Jeff, Todd, Sarah, Tim, Stephanie, Colin, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Jack, Vektor, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Jesse, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Yuko, Makiko, Thomas, Harry, Seth, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Brad, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, Beez, Milo, Hermia, Red, Thrax, Gulliver, Joe, Sally, Paul, Jose, Rejean, Dore, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, Dustin, George, Del, Matthew, Cat, Jacqui, Adrian, Viola, Alfred, Noel, Irfan, Yool, Rika, Jane, Frontier, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Jeremy, JP, Jake, Anthony, Maurice, Madhavi, Leopard, Kyle, Joon, Bert, Belinda, Jon, Kristi, Bridie, Pramod, Socrates, Maria, Aric, Adreanne, Jay, Kari, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Colossus, Zen, BigPapi, Pastrami, Kurz, Mani, Neuro, Mel, Sardonyx, MJ, Rowan, Sgt, Elvis, Samuel, Leo, Bryan, Niko, Austin, Soft, Poppy, Rachel, Aki, Banzai, Alexa, Sue, Bender, CG, Angelo, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Rothman, Niall, Marin, Allison, Katie, Dawn, Dusty, Katt, Judy, Andrea, Ambroff, Infinity, Rico, Gail, Kalpana, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Maestro, Simone, Yang, T, Shannon, Nelson, Khanh, Scott, Courtney, Charlene, Quixote, Susan, Zed, Amanda, Katelin, Enkidu, Roxie, Esbee, JoRoan, Scarlet, Tay, Kevin, Wolfgang, Johnny, Ray, Andren, Merov, Bob, Rand, Howard, Callen, Heff, Galen, Newell, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl, Ashley, JessieAnn, Huseby, Karina, Paris, Kurt, Rick, Lis, Kotler, Theeba, Lynx, Murphy, Doten, Taka, Norm, Jillian, Marcus, Mae, Novack, Esther, Perry, Dana, Ducot, Javier, Porter, Madison, Gecko, Dough, JR, Gisele, Crimp, Norie, Arch, Kimi, Fisher, Barbara, Jason, Peggy, Bernard, Jules, Leroy, Eva, Khederian, Campbell, Vogt, Masido, Karel, Torres, Lo, Breezer, Delby, Rountree, Anna, Servus, Rue, Itiaes, Chuck, Luna, Novella, Zaza, Wen, Gino, Lex, Cassandra, Limey, Nancy, Anukul, Silver, Brodesky, Jinsai, Squid, Gez, Rakesh, Ladan, Edelman, Marcet, Squire, Tatem, Tony, Jerm, Tia, Falcon, BK, Tiggs, Driscoll, Bacon, Timothee, Cru, Carmilla, Coyot, Webb, Kazu, Rudas, LJ, Sea, Ali Wallace, Bewest, Pup, Drub, Dragon, Inoshiro, Byron, Rhett, Xandix, Aimee, Fredrik, Thor, Teddy, Baron, Nelly, Ghengis, Epic, Eli, Stone, Grapes, Irie, Prep, Scobu, Valerie, Alain, and many others. -Tak til følgende beboerne for at bidrage til at sikre, at dette er den bedste version til dato: able whitman, Adeon Writer, adonaira aabye, Aeron Kohime, Agathos Frascati, Aimee Trescothick, Aleric Inglewood, Alissa Sabre, Aminom Marvin, Angela Talamasca, Aralara Rajal, Armin Weatherwax, Ashrilyn Hayashida, Athanasius Skytower, Aura Dirval, Barney Boomslang, Biancaluce Robbiani, Biker Offcourse, Borg Capalini, Bulli Schumann, catherine pfeffer, Chalice Yao, Corre Porta, Court Goodman, Cummere Mayo, Dale Innis, Darien Caldwell, Darjeeling Schoonhoven, Daten Thielt, dimentox travanti, Dirk Talamasca, Drew Dwi, Duckless Vandyke, Elanthius Flagstaff, Electro Burnstein, emiley tomsen, Escort DeFarge, Eva Rau, Ezian Ecksol, Fire Centaur, Fluf Fredriksson, Francisco Koolhoven, Frontera Thor, Frungi Stastny, Gally Young, gearsawe stonecutter, Gigs Taggart, Gordon Wendt, Gudmund Shepherd, Gypsy Paz, Harleen Gretzky, Henri Beauchamp, Inma Rau, Irene Muni, Iskar Ariantho, Jacek Antonelli, JB Kraft, Jessicka Graves, Joeseph Albanese, Joshua Philgarlic, Khyota Wulluf, kirstenlee Cinquetti, Latif Khalifa, Lex Neva, Lilibeth Andree, Lisa Lowe, Lunita Savira, Loosey Demonia, lum pfohl, Marcos Fonzarelli, MartinRJ Fayray, Marusame Arai, Matthew Dowd, Maya Remblai, McCabe Maxsted, Meghan Dench, Melchoir Tokhes, Menos Short, Michelle2 Zenovka, Mimika Oh, Minerva Memel, Mm Alder, Ochi Wolfe, Omei Turnbull, Pesho Replacement, Phantom Ninetails, phoenixflames kukulcan, Polo Gufler, prez pessoa, princess niven, Prokofy Neva, Qie Niangao, Rem Beattie, RodneyLee Jessop, Saijanai Kuhn, Seg Baphomet, Sergen Davies, Shirley Marquez, SignpostMarv Martin, Sindy Tsure, Sira Arbizu, Skips Jigsaw, Sougent Harrop, Spritely Pixel, Squirrel Wood, StarSong Bright, Subversive Writer, Sugarcult Dagger, Sylumm Grigorovich, Tammy Nowotny, Tanooki Darkes, Tayra Dagostino, Theoretical Chemistry, Thickbrick Sleaford, valerie rosewood, Vex Streeter, Vixen Heron, Whoops Babii, Winter Ventura, Xiki Luik, Yann Dufaux, Yina Yao, Yukinoroh Kamachi, Zolute Infinity, Zwagoth Klaar +Tak til følgende beboere: Drew Dwi, Zai Lynch, Latif Khalifa, Ellla McMahon, Harleen Gretzky, Squirrel Wood, Malarthi Behemoth, Dante Tucker, Buckaroo Mu, Eddi Decosta, Dirk, Talamasca, Torben Trautman, Irene Muni, Lilly Zenovka, Vick Forcella, Sasy Scarborough, Gentle Welinder, Elric Anatine, Techwolf Lupindo, Dusan Writer, WolfPup Lowenhar, Marianne McCann, Fiachra Lach, Sitearm Madonna, Sudane Erato, Sahkolihaa Contepomi, Sachi Vixen, Questar Utu, Dimitrio Lewis, Matto Destiny, Scrim Pinion, Radio Signals, Psi Merlin, Pixel Gausman, Mel Vanbeeck, Laurent Bechir, Lamorna Proctor, Lares Carter, Gwyneth Llewelyn, Hydra Shaftoe, Holger Gilruth, Gentle Heron, Carla Broek, Boroondas Gupte, Fury Rosewood, Flower Ducatillon, Colpo Wexler, gwampa Lomu, Borg Capalini, Beansy Twine, Ardy Lay, , 45ms Zhong, Adeon Writer, Aeonix Aeon, Ai Austin, Aiko Ying, Alexandrea Fride, Alliez Mysterio, Annie Milestone, Annika Genezzia, Ansariel Hiller, ArminasX Saiman, Arya Braveheart, Asaeda Meltingdots, Asturkon Jua, Avallyn Oakleaf, Avatar Quinzet, BabyA Littlething, Bacchus Ireto, Bazaar, Riva, Benjamin Bigdipper, Beth Walcher, Bezilon Kasei, Biancaluce Robbiani, Bill Walach, blakopal Galicia, Blitzckreed Levenque, Bryn Oh, Callipygian Christensen, Cap Carver, Carr Arbenlow, Chantal Harvey, Charles Courtois, Charlie Sazaland, Cherry Cheevers, ChickyBabes Zuzu, Christopher Organiser, Ciaran Laval, Clara Young, Celierra Darling, Corinne Helendale, Corro Moseley, Coughdrop Littlething, Darien Caldwell, Dartagan Shepherd, Debs Regent, Decro Schmooz, Denim Kamachi, DiJodi Dubratt, Dil Spitz, Edgware Marker, Egehan Dryke, Emma Portilo, Emmie Fairymeadow, Evangelista Emerald, Faelon Swordthain, Frenchimmo Sabra, Gaberoonie Zanzibar, Ganymedes Costagravas, Gene Frostbite, GeneJ Composer, Giggles Littlebird, Grady Echegaray, Guni Greenstein, Gypsy Tripsa, Hackshaven Harford, Ham Rambler, Han Shuffle, Hanglow Short, Hatzfeld Runo, herina Bode, Horatio Freund, Hypatia Callisto, Hypatia Pickens, Identity Euler, Imnotgoing Sideways, Innula Zenovka, Iyoba Tarantal, Jack Abraham, Jagga Meredith, Jennifer Boyle, Jeremy Marquez, Jessica Qin, Jinx Nordberg, Jo Bernandes, Jocial Sonnenkern, Joel Savard, Jondan Lundquist, Josef Munster, Josette Windlow, Juilan Tripsa, Juro Kothari, Justin RiversRunRed, Kagehi Kohn, Kaimen Takahe, Keklily Longfall, Ken Lavender, Kestral Karas, Khisme Nitely, Kimar Coba, Kithrak Kirkorian, Kitty Barnett, Kolor Fall, Komiko Okamoto, Korvel Noh, Larry Pixel, Leal Choche, len Starship, Lenae Munz, Lexi Frua, Lillie Cordeaux, Lizzy Macarthur, LSL Scientist, Luban Yiyuan, Luc Starsider, Maccus McCullough, Madison Blanc, Maggie Darwin, Mallory Destiny, Manx Wharton, Marc Claridge, Marc2 Sands, Matthew Anthony, Maxim RiversRunRed, Medhue Simoni, Melinda Latynina, Mencius Watts, Michi Lumin, Midian Farspire, Miles Glaz, Mindy Mathy, Mitch Wagner, Mo Hax, Mourna Biziou, Nao Noe, naofan Teardrop, Naomah Beaumont, Nathiel Siamendes, Nber Medici, Neko Link, Netpat Igaly, Neutron Chesnokov, Newfie Pendragon, Nicholai Laviscu, Nick Rhodes, Nicoladie Gymnast, Ollie Kubrick, Orenj Marat, Orion Delphis, Oryx Tempel, Parvati Silverweb, PeterPunk Mooney, Pixel Scientist, Pounce Teazle, Professor Noarlunga, Quantum Destiny, Quicksilver Hermes, Ralf Setsuko, RAT Quan, RedMokum Bravin, Revolution Perenti, Rezit Sideways, Rich Grainger, Rosco Teardrop, Rose Evans, Rudee Voom, RufusTT Horsefly, Saii Hallard, SaintLEOlions Zimer, Samm Larkham, Satanello Miami, SexySteven Morrisey, Sheet Spotter, Shnurui Troughton, sicarius Thorne, Sicarius Toxx, Sini Nubalo, SLB Wirefly, snowy Sidran, Soupa Segura, ST Mensing, Starshine Halasy, Stickman Ingmann, Synystyr Texan, Takeda Terrawyng, Tali Rosca, Templar Merlin, Tezcatlipoca Bisiani, Tiel Stonecutter, Tony Kembia, TouchaHoney Perhaps, Trey Reanimator, TriloByte Zanzibar, Trinity Dechou, Trinity Dejavu, Unlikely Quintessa, UsikuFarasi Kanarik, Veritas Raymaker, Vex Streeter, Viaticus Speculaas, Villain Baroque, Vixie Durant, Void Singer, Watty Berkson, Westley Schridde, Westley Streeter, Whimsy Winx, Winter Ventura, Wundur Primbee, xstorm Radek, YongYong Francois, Zak Westminster, Zana Kohime, Zaren Alexander, Zeja Pyle, ZenMondo Wormser, Zoex Flanagan, and many others. -I get by with a little help from my friends. --Richard Starkey + +"The work goes on, the cause endures, the hope still lives, and the dreams shall never die" - Edward Kennedy </text_editor> </panel> <panel label="Licenser" name="licenses_panel"> diff --git a/indra/newview/skins/default/xui/da/floater_about_land.xml b/indra/newview/skins/default/xui/da/floater_about_land.xml index b4af427538..053fe4d9d9 100644 --- a/indra/newview/skins/default/xui/da/floater_about_land.xml +++ b/indra/newview/skins/default/xui/da/floater_about_land.xml @@ -1,5 +1,14 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="floaterland" title="OM LAND"> + <floater.string name="maturity_icon_general"> + "Parcel_PG_Dark" + </floater.string> + <floater.string name="maturity_icon_moderate"> + "Parcel_M_Dark" + </floater.string> + <floater.string name="maturity_icon_adult"> + "Parcel_R_Dark" + </floater.string> <floater.string name="Minutes"> [MINUTES] minutter </floater.string> @@ -15,7 +24,7 @@ <tab_container name="landtab"> <panel label="GENERELT" name="land_general_panel"> <panel.string name="new users only"> - Kun nye brugere + Kun nye beboere </panel.string> <panel.string name="anyone"> Alle @@ -54,6 +63,9 @@ Pacel ikke valgt. GÃ¥ til 'Verden' > 'Om land' eller vælg en anden parcel for at se detaljer. </panel.string> + <panel.string name="time_stamp_template"> + [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local] + </panel.string> <text name="Name:"> Navn: </text> @@ -81,9 +93,12 @@ GÃ¥ til 'Verden' > 'Om land' eller vælg en anden parcel <text name="Group:"> Gruppe: </text> - <button label="Vælg..." label_selected="Vælg..." name="Set..."/> + <text name="GroupText"> + Leyla Linden + </text> + <button label="Vælg" name="Set..."/> <check_box label="Tillad dedikering til gruppe" name="check deed" tool_tip="En gruppe administrator kan dedikere denne jord til gruppen, sÃ¥ det vil blive støttet af gruppen's jord tildeling."/> - <button label="Dedikér..." label_selected="Dedikér..." name="Deed..." tool_tip="Du kan kun dedikere jord, hvis du er en administrator i den valgte gruppe."/> + <button label="Dedikér" name="Deed..." tool_tip="Du kan kun dedikere jord, hvis du er en administrator i den valgte gruppe."/> <check_box label="Ejer bidrager ved dedikering" name="check contrib" tool_tip="NÃ¥r land dedikeres til gruppe, kan den tidligere bidrage med nok land til at dække krav."/> <text name="For Sale:"> Til salg: @@ -94,7 +109,7 @@ GÃ¥ til 'Verden' > 'Om land' eller vælg en anden parcel <text name="For Sale: Price L$[PRICE]."> Pris: L$[PRICE] (L$[PRICE_PER_SQM]/m²). </text> - <button label="Sælg land..." label_selected="Sælg land..." name="Sell Land..."/> + <button label="Sælg land" name="Sell Land..."/> <text name="For sale to"> Til salg til: [BUYER] </text> @@ -123,12 +138,13 @@ GÃ¥ til 'Verden' > 'Om land' eller vælg en anden parcel <text name="DwellText"> 0 </text> - <button label="Køb land..." label_selected="Køb land..." name="Buy Land..."/> - <button label="Køb til gruppe..." label_selected="Køb til gruppe..." name="Buy For Group..."/> - <button label="Køb adgang..." label_selected="Køb adgang..." name="Buy Pass..." tool_tip="Giver adgang til midlertidig adgang til dette omrÃ¥de."/> - <button label="Efterlad land..." label_selected="Efterlad land..." name="Abandon Land..."/> - <button label="Kræv tilbage..." label_selected="Kræv tilbage..." name="Reclaim Land..."/> - <button label="Linden salg..." label_selected="Linden salg..." name="Linden Sale..." tool_tip="Land skal være ejet, indholdsrating sat og ikke allerede pÃ¥ auktion."/> + <button label="Køb land" name="Buy Land..."/> + <button label="Script Info" name="Scripts..."/> + <button label="Køb til gruppe" name="Buy For Group..."/> + <button label="Køb adgang" name="Buy Pass..." tool_tip="Giver adgang til midlertidig adgang til dette omrÃ¥de."/> + <button label="Efterlad land" name="Abandon Land..."/> + <button label="Kræv tilbage" name="Reclaim Land..."/> + <button label="Linden salg" name="Linden Sale..." tool_tip="Land skal være ejet, indholdsrating sat og ikke allerede pÃ¥ auktion."/> </panel> <panel label="REGLER" name="land_covenant_panel"> <panel.string name="can_resell"> @@ -227,7 +243,7 @@ GÃ¥ til 'Verden' > 'Om land' eller vælg en anden parcel [COUNT] </text> <button label="Vis" label_selected="Vis" name="ShowOwner"/> - <button label="Returnér..." label_selected="Returnér..." name="ReturnOwner..." tool_tip="Returnér objekter til deres ejere."/> + <button label="Returnér" name="ReturnOwner..." tool_tip="Returnér objekter til deres ejere."/> <text name="Set to group:"> Sat til gruppe: </text> @@ -235,7 +251,7 @@ GÃ¥ til 'Verden' > 'Om land' eller vælg en anden parcel [COUNT] </text> <button label="Vis" label_selected="Vis" name="ShowGroup"/> - <button label="Returnér..." label_selected="Returnér..." name="ReturnGroup..." tool_tip="Returnér objekter til deres ejere."/> + <button label="Returnér" name="ReturnGroup..." tool_tip="Returnér objekter til deres ejere."/> <text name="Owned by others:"> Ejet af andre: </text> @@ -243,7 +259,7 @@ GÃ¥ til 'Verden' > 'Om land' eller vælg en anden parcel [COUNT] </text> <button label="Vis" label_selected="Vis" name="ShowOther"/> - <button label="Returnér..." label_selected="Returnér..." name="ReturnOther..." tool_tip="Returnér objekter til deres ejere."/> + <button label="Returnér" name="ReturnOther..." tool_tip="Returnér objekter til deres ejere."/> <text name="Selected / sat upon:"> Valgt/siddet pÃ¥: </text> @@ -257,7 +273,7 @@ GÃ¥ til 'Verden' > 'Om land' eller vælg en anden parcel Objekt ejere: </text> <button label="Gentegn liste" label_selected="Gentegn liste" name="Refresh List" tool_tip="Refresh Object List"/> - <button label="Returnér objekter..." label_selected="Returnér objekter..." name="Return objects..."/> + <button label="Returnér objekter" name="Return objects..."/> <name_list name="owner list"> <name_list.columns label="Type" name="type"/> <name_list.columns label="Navn" name="name"/> @@ -377,12 +393,9 @@ Kun større parceller kan vises i søgning. </text> <combo_box name="media type" tool_tip="Specificer om URL-adressen er til en film, hjemmeside eller et andet medie."/> <text left="4" name="at URL:"> - Medie URL: - </text> - <button label="Vælg..." label_selected="Vælg..." name="set_media_url"/> - <text name="CurrentURL:"> - Nuværende side: + Hjemmeside: </text> + <button label="Vælg" name="set_media_url"/> <check_box label="Skjul medie URL" name="hide_media_url" tool_tip="Klik her for at skjule medie adressen sÃ¥ det kun er dig og evt. parcel gruppens ejer/administratorer der kan se den."/> <text left="4" name="Description:"> Beskrivelse: @@ -393,8 +406,8 @@ Kun større parceller kan vises i søgning. </text> <texture_picker label="" name="media texture" tool_tip="Klik for at vælge billede"/> <text name="replace_texture_help"> - (Objekter der har denne tekstur vil vise filmen eller -web-siden, efter du klikker pÃ¥ play knappen.) + Objekter der har denne tekstur vil vise filmen eller web-siden, efter du klikker pÃ¥ play knappen. Vælg + Objects using this texture will show the movie or web page after you click the play arrow. Select the thumbnail for at vælge anden tekstur. </text> <check_box label="Auto skalér" name="media_auto_scale" tool_tip="Vælg denne mulighed for at skalere indholdet for dette parcel automatisk. Det kan være lidt langsommere og have lavere kvalitet, men ingen anden tekstur skalering eller tilpasning vil være nødvendigt."/> <text name="media_size" tool_tip="Størrelse for rendering af Web medie, benyt 0 for standard." width="105"> @@ -411,13 +424,18 @@ web-siden, efter du klikker pÃ¥ play knappen.) <check_box label="Gentag afspil" name="media_loop" tool_tip="Gentager automatisk medie, nÃ¥r det er færdigt med at spille starter det automatisk forfra."/> </panel> <panel label="LYD" name="land_audio_panel"> + <check_box label="Skjul URL" name="hide_music_url" tool_tip="Ved at vælge her, vil musik URL skjules for alle ikke autoriserede brugere der læser denne parcels information."/> <check_box label="Tillad stemmer" name="parcel_enable_voice_channel"/> <check_box label="Tillad stemmer (hÃ¥ndteret af estate)" name="parcel_enable_voice_channel_is_estate_disabled"/> + <check_box label="Begræns stemme chat til denne parcel" name="parcel_enable_voice_channel_local"/> </panel> <panel label="ADGANG" name="land_access_panel"> <panel.string name="access_estate_defined"> (Defineret via estate) </panel.string> + <panel.string name="allow_public_access"> + Tillad adgang for alle ([MATURITY]) + </panel.string> <panel.string name="estate_override"> En eller flere af disse valg er indstillet pÃ¥ estate niveau </panel.string> @@ -428,8 +446,8 @@ web-siden, efter du klikker pÃ¥ play knappen.) <text name="Only Allow"> Blokér adgang for:: </text> - <check_box label="Beboere der ikke har givet betalings oplysninger til Linden Lab [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="Blokér beboere der ikke har afgivet identifikationsoplysninger."/> - <check_box label="Alders verifikation [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="Blokér beboere der ikke har verificeret deres alder. Se support.secondlife.com for mere information."/> + <check_box label="Beboere der ikke har givet betalings oplysninger til Linden Lab [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="Blokér for uidentificerede beboere."/> + <check_box label="Alders verifikation [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="Blokér for beboere som ikke er alders-verificerede. Se [SUPPORT_SITE] for mere information."/> <check_box label="Tillad adgang til gruppen: [GROUP]" name="GroupCheck" tool_tip="Vælg gruppe under fanen 'generelt'."/> <check_box label="Sælg adgang til:" name="PassCheck" tool_tip="Tillader midlertidig adgang til denne parcel"/> <combo_box name="pass_combo"> diff --git a/indra/newview/skins/default/xui/da/floater_animation_preview.xml b/indra/newview/skins/default/xui/da/floater_animation_preview.xml index 47e02f0704..adf96841c0 100644 --- a/indra/newview/skins/default/xui/da/floater_animation_preview.xml +++ b/indra/newview/skins/default/xui/da/floater_animation_preview.xml @@ -106,6 +106,9 @@ Maksimal animations længde er [MAX_LENGTH] sekunder. <floater.string name="E_ST_NO_XLT_EMOTE"> kan ikke læse "emote" navn. </floater.string> + <floater.string name="E_ST_BAD_ROOT"> + Incorrect root joint name, use "hip". + </floater.string> <text name="name_label"> Navn: </text> @@ -138,35 +141,35 @@ Maksimal animations længde er [MAX_LENGTH] sekunder. Ansigtsudtryk </text> <combo_box label="" name="emote_combo" tool_tip="Angiver hvad ansigtet gør under animationen" width="140"> - <combo_box.item label="(Intet)" name="[None]"/> - <combo_box.item label="Aaaaah" name="Aaaaah"/> - <combo_box.item label="Bange" name="Afraid"/> - <combo_box.item label="Vred" name="Angry"/> - <combo_box.item label="Stort smil" name="BigSmile"/> - <combo_box.item label="Keder sig" name="Bored"/> - <combo_box.item label="Græder" name="Cry"/> - <combo_box.item label="Forarget" name="Disdain"/> - <combo_box.item label="Flov" name="Embarrassed"/> - <combo_box.item label="Skuler" name="Frown"/> - <combo_box.item label="Kysser" name="Kiss"/> - <combo_box.item label="Griner" name="Laugh"/> - <combo_box.item label="Plllppt" name="Plllppt"/> - <combo_box.item label="Frastødt" name="Repulsed"/> - <combo_box.item label="Ked af det" name="Sad"/> - <combo_box.item label="Skuldertræk" name="Shrug"/> - <combo_box.item label="Smil" name="Smile"/> - <combo_box.item label="Overrasket" name="Surprise"/> - <combo_box.item label="Blinker" name="Wink"/> - <combo_box.item label="Bekymret" name="Worry"/> + <item label="(Intet)" name="[None]" value=""/> + <item label="Aaaaah" name="Aaaaah" value="Aaaaah"/> + <item label="Bange" name="Afraid" value="Bange"/> + <item label="Vred" name="Angry" value="Vred"/> + <item label="Stort smil" name="BigSmile" value="Stort smil"/> + <item label="Keder sig" name="Bored" value="Keder sig"/> + <item label="Græder" name="Cry" value="Grædende"/> + <item label="Forarget" name="Disdain" value="Foragt"/> + <item label="Flov" name="Embarrassed" value="Embarrassed"/> + <item label="Skuler" name="Frown" value="Alvorlig"/> + <item label="Kysser" name="Kiss" value="Kys"/> + <item label="Griner" name="Laugh" value="Leende"/> + <item label="Plllppt" name="Plllppt" value="Plllppt"/> + <item label="Frastødt" name="Repulsed" value="Frastødt"/> + <item label="Ked af det" name="Sad" value="Ked af det"/> + <item label="Skuldertræk" name="Shrug" value="Skuldertræk"/> + <item label="Smil" name="Smile" value="Smilende"/> + <item label="Overrasket" name="Surprise" value="Overrasket"/> + <item label="Blinker" name="Wink" value="Blink"/> + <item label="Bekymret" name="Worry" value="Bekymret"/> </combo_box> <text name="preview_label"> Vis mens </text> <combo_box label="" name="preview_base_anim" tool_tip="Se hvordan animation ser ud i forskellige typiske avatar-situationer." width="140"> - <combo_box.item label="StÃ¥ende" name="Standing"/> - <combo_box.item label="GÃ¥ende" name="Walking"/> - <combo_box.item label="Sidder" name="Sitting"/> - <combo_box.item label="Flyver" name="Flying"/> + <item label="StÃ¥ende" name="Standing" value="StÃ¥ende"/> + <item label="GÃ¥ende" name="Walking" value="GÃ¥ende"/> + <item label="Sidder" name="Sitting" value="Siddende"/> + <item label="Flyver" name="Flying" value="Flyvende"/> </combo_box> <spinner label="start (sec)" name="ease_in_time" tool_tip="Tid (i sekunder) animationen bruger pÃ¥ at komme i gang."/> <spinner label="Afslut (sec)" name="ease_out_time" tool_tip="Tid (i sekunder) animationen bruger pÃ¥ at afslutte"/> diff --git a/indra/newview/skins/default/xui/da/floater_avatar_textures.xml b/indra/newview/skins/default/xui/da/floater_avatar_textures.xml index 1111c5e18b..d0d766eaab 100644 --- a/indra/newview/skins/default/xui/da/floater_avatar_textures.xml +++ b/indra/newview/skins/default/xui/da/floater_avatar_textures.xml @@ -3,30 +3,48 @@ <floater.string name="InvalidAvatar"> UGYLDING AVATAR </floater.string> - <text name="composite_label"> - Blandede teksturer - </text> - <button label="Drop" label_selected="Dump" name="Dump"/> - <texture_picker label="HÃ¥r" name="hair_grain"/> - <texture_picker label="Alpha - hÃ¥r" name="hair_alpha"/> - <texture_picker label="Makeup" name="head_bodypaint"/> - <texture_picker label="Alpha - hoved" name="head_alpha"/> - <texture_picker label="Tatovering hovede" name="head_tattoo"/> - <texture_picker label="Øje" name="eyes_iris"/> - <texture_picker label="Alpha - øjne" name="eyes_alpha"/> - <texture_picker label="Bodypaint - overkrop" name="upper_bodypaint"/> - <texture_picker label="Undertrøje" name="upper_undershirt"/> - <texture_picker label="Handsker" name="upper_gloves"/> - <texture_picker label="Trøje" name="upper_shirt"/> - <texture_picker label="Øvre jakke" name="upper_jacket"/> - <texture_picker label="Alpha - øvre" name="upper_alpha"/> - <texture_picker label="Øvre tatovering" name="upper_tattoo"/> - <texture_picker label="Bodypaint - underkrop" name="lower_bodypaint"/> - <texture_picker label="Undertøj" name="lower_underpants"/> - <texture_picker label="Strømper" name="lower_socks"/> - <texture_picker label="Sko" name="lower_shoes"/> - <texture_picker label="Bukser" name="lower_pants"/> - <texture_picker label="Jakke" name="lower_jacket"/> - <texture_picker label="Alpha - nedre" name="lower_alpha"/> - <texture_picker label="Nedre tatovering" name="lower_tattoo"/> + <scroll_container name="profile_scroll"> + <panel name="scroll_content_panel"> + <text name="label"> + Gemte +teksturer + </text> + <text name="composite_label"> + Sammensatte +teksturer + </text> + <button label="Vis IDs pÃ¥ skærm" label_selected="Dump" name="Dump"/> + <panel name="scroll_content_panel"> + <texture_picker label="HÃ¥r" name="hair-baked"/> + <texture_picker label="HÃ¥r" name="hair_grain"/> + <texture_picker label="Alpha - hÃ¥r" name="hair_alpha"/> + <texture_picker label="Hoved" name="head-baked"/> + <texture_picker label="Makeup" name="head_bodypaint"/> + <texture_picker label="Alpha - hoved" name="head_alpha"/> + <texture_picker label="Tatovering - hovede" name="head_tattoo"/> + <texture_picker label="Øjne" name="eyes-baked"/> + <texture_picker label="Øje" name="eyes_iris"/> + <texture_picker label="Alpha øjne" name="eyes_alpha"/> + <texture_picker label="Overkrop" name="upper-baked"/> + <texture_picker label="Øverste bodyPaint" name="upper_bodypaint"/> + <texture_picker label="Undertrøje" name="upper_undershirt"/> + <texture_picker label="Handsker" name="upper_gloves"/> + <texture_picker label="Trøje" name="upper_shirt"/> + <texture_picker label="Jakke øverst" name="upper_jacket"/> + <texture_picker label="Alpha - øverst" name="upper_alpha"/> + <texture_picker label="Tatovering - øverst" name="upper_tattoo"/> + <texture_picker label="Underkrop" name="lower-baked"/> + <texture_picker label="BodyPaint - nederst" name="lower_bodypaint"/> + <texture_picker label="Underbukser" name="lower_underpants"/> + <texture_picker label="Strømper" name="lower_socks"/> + <texture_picker label="Sko" name="lower_shoes"/> + <texture_picker label="Bukser" name="lower_pants"/> + <texture_picker label="Jakke" name="lower_jacket"/> + <texture_picker label="Alpha - nederst" name="lower_alpha"/> + <texture_picker label="Tatovering - nederst" name="lower_tattoo"/> + <texture_picker label="Nederdel" name="skirt-baked"/> + <texture_picker label="Nederdel" name="skirt"/> + </panel> + </panel> + </scroll_container> </floater> diff --git a/indra/newview/skins/default/xui/da/floater_beacons.xml b/indra/newview/skins/default/xui/da/floater_beacons.xml index d67d859e7b..8049b072ce 100644 --- a/indra/newview/skins/default/xui/da/floater_beacons.xml +++ b/indra/newview/skins/default/xui/da/floater_beacons.xml @@ -2,7 +2,7 @@ <floater name="beacons" title="PEJLELYS"> <panel name="beacons_panel"> <text name="label_show"> - Vis: + Vis : </text> <check_box label="Pejlelys" name="beacons"/> <check_box label="Fremhævninger" name="highlights"/> diff --git a/indra/newview/skins/default/xui/da/floater_build_options.xml b/indra/newview/skins/default/xui/da/floater_build_options.xml index 9196f19b78..d3c3ac1899 100644 --- a/indra/newview/skins/default/xui/da/floater_build_options.xml +++ b/indra/newview/skins/default/xui/da/floater_build_options.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="build options floater" title="GITTER VALG"> - <spinner label="Gitter enheder (meter)" label_width="136" name="GridResolution" width="200"/> - <spinner label="Gitter rækkevidde (meter)" label_width="136" name="GridDrawSize" width="200"/> + <spinner label="Enheder (meter)" label_width="136" name="GridResolution" width="200"/> + <spinner label="Rækkevidde (meter)" label_width="136" name="GridDrawSize" width="200"/> <check_box label="Aktivér lÃ¥sning til underenheder" name="GridSubUnit"/> <check_box label="Vis 'cross-sections'" name="GridCrossSection"/> <text name="grid_opacity_label" tool_tip="Gitter synlighed"> diff --git a/indra/newview/skins/default/xui/da/floater_bulk_perms.xml b/indra/newview/skins/default/xui/da/floater_bulk_perms.xml index 0dd1a4f6ba..58a1c1b73e 100644 --- a/indra/newview/skins/default/xui/da/floater_bulk_perms.xml +++ b/indra/newview/skins/default/xui/da/floater_bulk_perms.xml @@ -49,6 +49,6 @@ <check_box label="Redigere" name="next_owner_modify"/> <check_box label="Kopiére" name="next_owner_copy"/> <check_box initial_value="true" label="Overfør" name="next_owner_transfer" tool_tip="Næste ejer kan sælge eller forære dette objekt væk"/> - <button label="Ok" name="apply"/> + <button label="OK" name="apply"/> <button label="Annullér" name="close"/> </floater> diff --git a/indra/newview/skins/default/xui/da/floater_buy_currency.xml b/indra/newview/skins/default/xui/da/floater_buy_currency.xml index 18ee0e0597..ec6ac5b2a8 100644 --- a/indra/newview/skins/default/xui/da/floater_buy_currency.xml +++ b/indra/newview/skins/default/xui/da/floater_buy_currency.xml @@ -37,7 +37,7 @@ Estimerer... </text> <text name="buy_action"> - [NAME] L$ [PRICE] + [ACTION] </text> <text name="total_label"> Min nye beholdning vil være @@ -46,7 +46,7 @@ L$ [AMT] </text> <text name="currency_links"> - [http://www.secondlife.com/ payment method] | [http://www.secondlife.com/ currency] | [http://www.secondlife.com/my/account/exchange_rates.php exchange rate] + [http://www.secondlife.com/my/account/payment_method_management.php payment method] | [http://www.secondlife.com/my/account/currency.php currency] | [http://www.secondlife.com/my/account/exchange_rates.php exchange rate] </text> <text name="exchange_rate_note"> Indtast beløbet for at se nyeste valutakurs. diff --git a/indra/newview/skins/default/xui/da/floater_buy_currency_html.xml b/indra/newview/skins/default/xui/da/floater_buy_currency_html.xml new file mode 100644 index 0000000000..e32b25ca17 --- /dev/null +++ b/indra/newview/skins/default/xui/da/floater_buy_currency_html.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_buy_currency_html" title="KØB VALUTA"/> diff --git a/indra/newview/skins/default/xui/da/floater_buy_land.xml b/indra/newview/skins/default/xui/da/floater_buy_land.xml index 987ad6585f..f6ee78fa6d 100644 --- a/indra/newview/skins/default/xui/da/floater_buy_land.xml +++ b/indra/newview/skins/default/xui/da/floater_buy_land.xml @@ -1,5 +1,131 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="buy land" title="KØB LAND"> + <floater.string name="can_resell"> + Kan videresælges. + </floater.string> + <floater.string name="can_not_resell"> + Kan ikke videresælges. + </floater.string> + <floater.string name="can_change"> + Kan samles eller opdeles. + </floater.string> + <floater.string name="can_not_change"> + Kan ikke samles eller opdeles. + </floater.string> + <floater.string name="cant_buy_for_group"> + Du har ikke tilladelse til at købe land for din aktive gruppe. + </floater.string> + <floater.string name="no_land_selected"> + Intet land er valgt. + </floater.string> + <floater.string name="multiple_parcels_selected"> + Flere forskellige parceller er valgt. +Prøv at vælge et mindre omrÃ¥de. + </floater.string> + <floater.string name="no_permission"> + Du har ikke tilladelse til at købe jord for din aktive gruppe. + </floater.string> + <floater.string name="parcel_not_for_sale"> + Det udvalgte parcel er ikke til salg. + </floater.string> + <floater.string name="group_already_owns"> + Gruppen ejer allerede parcellet. + </floater.string> + <floater.string name="you_already_own"> + Du ejer allerede parcellet. + </floater.string> + <floater.string name="set_to_sell_to_other"> + Det udvalgte parcel er sat til salg til en anden. + </floater.string> + <floater.string name="no_public_land"> + Det valgte omrÃ¥de har ingen offentlige arealer. + </floater.string> + <floater.string name="not_owned_by_you"> + Land ejet af en anden beboer valgt. +Prøv at vælge et mindre omrÃ¥de. + </floater.string> + <floater.string name="processing"> + Forarbejder dit køb... + +(Dette kan tage et minut eller to.) + </floater.string> + <floater.string name="fetching_error"> + Der er sket en fejl under hentning af jord købs oplysninger. + </floater.string> + <floater.string name="buying_will"> + Køb af dette areal vil: + </floater.string> + <floater.string name="buying_for_group"> + Køb af dette areal vil: + </floater.string> + <floater.string name="cannot_buy_now"> + Kan ikke købe nu: + </floater.string> + <floater.string name="not_for_sale"> + Ikke til salg: + </floater.string> + <floater.string name="none_needed"> + ikke nødvendigt + </floater.string> + <floater.string name="must_upgrade"> + Din konto skal være opgraderet for at eje jord. + </floater.string> + <floater.string name="cant_own_land"> + Din konto kan eje jord. + </floater.string> + <floater.string name="land_holdings"> + Du ejer [BUYER] m² land. + </floater.string> + <floater.string name="pay_to_for_land"> + Betal L$ [AMOUNT] til [SELLER] for dette stykke jord + </floater.string> + <floater.string name="buy_for_US"> + Køb L$ [AMOUNT] for ca. [LOCAL_AMOUNT], + </floater.string> + <floater.string name="parcel_meters"> + Denne parcel er pÃ¥ [AMOUNT] m² + </floater.string> + <floater.string name="premium_land"> + Dette stykke jord er premium, og vil tælle som [AMOUNT] m². + </floater.string> + <floater.string name="discounted_land"> + Dette stykke jord er pÃ¥ tilbud, og vil tælle som [AMOUNT] m². + </floater.string> + <floater.string name="meters_supports_object"> + [AMOUNT] m² +kan indeholde [AMOUNT2] objekter + </floater.string> + <floater.string name="sold_with_objects"> + solgt med objekter + </floater.string> + <floater.string name="sold_without_objects"> + objekter ikke inkluderet + </floater.string> + <floater.string name="info_price_string"> + L$ [PRICE] +(L$ [PRICE_PER_SQM]/m²) +[SOLD_WITH_OBJECTS] + </floater.string> + <floater.string name="insufficient_land_credits"> + Gruppen [GROUP] skal bruge nok tildelt jord brugs +kredit for at dække dette parcel før købet vil blive +gennemført. + </floater.string> + <floater.string name="have_enough_lindens"> + Du har L$ [AMOUNT], hvilket er nok til at købe denne jord. + </floater.string> + <floater.string name="not_enough_lindens"> + Du har kun L$ [AMOUNT], og har brug for yderligere L$ [AMOUNT2]. + </floater.string> + <floater.string name="balance_left"> + Efter købet, vil du have L$ [AMOUNT] tilbage. + </floater.string> + <floater.string name="balance_needed"> + Du skal købe mindst L$ [AMOUNT] for at have rÃ¥d til denne jord. + </floater.string> + <floater.string name="no_parcel_selected"> + (intet parcel er valgt) + </floater.string> <text name="region_name_label"> Region: </text> @@ -107,133 +233,4 @@ Denne parcel er pÃ¥ 512 m². <check_box label="Fjern [AMOUNT] m² af bidrag fra gruppe." name="remove_contribution"/> <button label="Køb" name="buy_btn"/> <button label="Annullér" name="cancel_btn"/> - <string name="can_resell"> - Kan videresælges. - </string> - <string name="can_not_resell"> - Kan ikke videresælges. - </string> - <string name="can_change"> - Kan samles eller opdeles. - </string> - <string name="can_not_change"> - Kan ikke samles eller opdeles. - </string> - <string name="cant_buy_for_group"> - Du har ikke tilladelse til at købe land for din aktive gruppe. - </string> - <string name="no_land_selected"> - Intet land er valgt. - </string> - <string name="multiple_parcels_selected"> - Flere forskellige parceller er valgt. -Prøv at vælge et mindre omrÃ¥de. - </string> - <string name="no_permission"> - Du har ikke tilladelse til at købe jord for din aktive gruppe. - </string> - <string name="parcel_not_for_sale"> - Det udvalgte parcel er ikke til salg. - </string> - <string name="group_already_owns"> - Gruppen ejer allerede parcellet. - </string> - <string name="you_already_own"> - Du ejer allerede parcellet. - </string> - <string name="set_to_sell_to_other"> - Det udvalgte parcel er sat til salg til en anden. - </string> - <string name="no_public_land"> - Det valgte omrÃ¥de har ingen offentlige arealer. - </string> - <string name="not_owned_by_you"> - Jord, der ejes af en anden bruger er valgt. -Prøv at vælge et mindre omrÃ¥de. - </string> - <string name="processing"> - Forarbejder dit køb... - -(Dette kan tage et minut eller to.) - </string> - <string name="fetching_error"> - Der er sket en fejl under hentning af jord købs oplysninger. - </string> - <string name="buying_will"> - Køb af dette areal vil: - </string> - <string name="buying_for_group"> - Køb af dette areal vil: - </string> - <string name="cannot_buy_now"> - Kan ikke købe nu: - </string> - <string name="not_for_sale"> - Ikke til salg: - </string> - <string name="none_needed"> - ikke nødvendigt - </string> - <string name="must_upgrade"> - Din konto skal være opgraderet for at eje jord. - </string> - <string name="cant_own_land"> - Din konto kan eje jord. - </string> - <string name="land_holdings"> - Du ejer [BUYER] m² land. - </string> - <string name="pay_to_for_land"> - Betal L$ [AMOUNT] til [SELLER] for dette stykke jord - </string> - <string name="buy_for_US"> - Køb L$ [AMOUNT] for ca. [LOCAL_AMOUNT], - </string> - <string name="parcel_meters"> - Denne parcel er pÃ¥ [AMOUNT] m² - </string> - <string name="premium_land"> - Dette stykke jord er premium, og vil tælle som [AMOUNT] m². - </string> - <string name="discounted_land"> - Dette stykke jord er pÃ¥ tilbud, og vil tælle som [AMOUNT] m². - </string> - <string name="meters_supports_object"> - [AMOUNT] m² -kan indeholde [AMOUNT2] objekter - </string> - <string name="sold_with_objects"> - solgt med objekter - </string> - <string name="sold_without_objects"> - objekter ikke inkluderet - </string> - <string name="info_price_string"> - L$ [PRICE] -(L$ [PRICE_PER_SQM]/m²) -[SOLD_WITH_OBJECTS] - </string> - <string name="insufficient_land_credits"> - Gruppen [GROUP] skal bruge nok tildelt jord brugs -kredit for at dække dette parcel før købet vil blive -gennemført. - </string> - <string name="have_enough_lindens"> - Du har L$ [AMOUNT], hvilket er nok til at købe denne jord. - </string> - <string name="not_enough_lindens"> - Du har kun L$ [AMOUNT], og har brug for yderligere L$ [AMOUNT2]. - </string> - <string name="balance_left"> - Efter købet, vil du have L$ [AMOUNT] tilbage. - </string> - <string name="balance_needed"> - Du skal købe mindst L$ [AMOUNT] for at have rÃ¥d til denne jord. - </string> - <string name="no_parcel_selected"> - (intet parcel er valgt) - </string> - <string name="buy_currency"> - Køb L$ [LINDENS] for omkring US$ [USD] - </string> </floater> diff --git a/indra/newview/skins/default/xui/da/floater_camera.xml b/indra/newview/skins/default/xui/da/floater_camera.xml index 2596559609..37e3307960 100644 --- a/indra/newview/skins/default/xui/da/floater_camera.xml +++ b/indra/newview/skins/default/xui/da/floater_camera.xml @@ -9,6 +9,18 @@ <floater.string name="move_tooltip"> Flyt kamera op og ned, til venstre og højre </floater.string> + <floater.string name="orbit_mode_title"> + Kredsløb + </floater.string> + <floater.string name="pan_mode_title"> + Panorér + </floater.string> + <floater.string name="avatar_view_mode_title"> + Forvalg + </floater.string> + <floater.string name="free_mode_title"> + Se objekt + </floater.string> <panel name="controls"> <joystick_track name="cam_track_stick" tool_tip="Flyt kamera op og ned, til venstre og højre"/> <panel name="zoom" tool_tip="Zoom kamera mod fokus"> @@ -25,7 +37,7 @@ <panel name="buttons"> <button label="" name="orbit_btn" tool_tip="Rotér kamera"/> <button label="" name="pan_btn" tool_tip="Panorér kamera"/> - <button label="" name="avatarview_btn" tool_tip="Se som avatar"/> + <button label="" name="avatarview_btn" tool_tip="Forvalg"/> <button label="" name="freecamera_btn" tool_tip="Se objekt"/> </panel> </floater> diff --git a/indra/newview/skins/default/xui/da/floater_color_picker.xml b/indra/newview/skins/default/xui/da/floater_color_picker.xml index 514b2c4331..f744b06277 100644 --- a/indra/newview/skins/default/xui/da/floater_color_picker.xml +++ b/indra/newview/skins/default/xui/da/floater_color_picker.xml @@ -21,7 +21,7 @@ <check_box label="Benyt nu" name="apply_immediate"/> <button label="" label_selected="" name="color_pipette"/> <button label="Annullér" label_selected="Annullér" name="cancel_btn"/> - <button label="Ok" label_selected="Ok" name="select_btn"/> + <button label="OK" label_selected="OK" name="select_btn"/> <text name="Current color:"> Nuværende Farve: </text> diff --git a/indra/newview/skins/default/xui/da/floater_customize.xml b/indra/newview/skins/default/xui/da/floater_customize.xml index 379302ef6a..a47e0d33df 100644 --- a/indra/newview/skins/default/xui/da/floater_customize.xml +++ b/indra/newview/skins/default/xui/da/floater_customize.xml @@ -1,7 +1,9 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater customize" title="UDSEENDE" width="509"> - <tab_container name="customize tab container" width="507"> - <placeholder label="Krops Dele" name="body_parts_placeholder"/> +<floater name="floater customize" title="UDSEENDE"> + <tab_container name="customize tab container"> + <text label="Krops Dele" name="body_parts_placeholder"> + Kropsdele + </text> <panel label="Kropsbygning" name="Shape"> <button label="Annullér" label_selected="Annullér" name="Revert"/> <button label="Krop" label_selected="Krop" name="Body"/> @@ -14,8 +16,8 @@ <button label="Overkrop" label_selected="Overkrop" name="Torso"/> <button label="Ben" label_selected="Ben" name="Legs"/> <radio_group name="sex radio"> - <radio_item label="Kvinde" name="radio"/> - <radio_item label="Mand" name="radio2"/> + <radio_item label="Kvinde" name="radio" value="0"/> + <radio_item label="Mand" name="radio2" value="1"/> </radio_group> <text name="title"> [DESC] @@ -33,9 +35,7 @@ Fundet i [PATH] </text> <text name="not worn instructions"> - Vælg en ny krop ved at trække en sÃ¥dan fra din beholdning -over pÃ¥ din avatar. Du kan ogsÃ¥ oprette en fra bunden -og bagefter 'tage den pÃ¥'. + Vælg en ny kropsbygning ved at trække en sÃ¥dan fra din beholdning over pÃ¥ din avatar. Du kan ogsÃ¥ oprette en fra bunden og bagefter 'tage den pÃ¥'. </text> <text name="no modify instructions"> Du har ikke rettigheder til at redigere denne del. @@ -68,9 +68,7 @@ og bagefter 'tage den pÃ¥'. Fundet i [PATH] </text> <text name="not worn instructions"> - Tag en ny hud pÃ¥ ved at trække en sÃ¥dan fra din beholdning -over pÃ¥ din avatar. Du kan ogsÃ¥ oprette en hud fra bunden -og bagefter 'tage den pÃ¥'. + Vælg en ny hud ved at trække en sÃ¥dan fra din beholdning over pÃ¥ din avatar. Du kan ogsÃ¥ oprette en fra bunden og bagefter 'tage den pÃ¥'. </text> <text name="no modify instructions"> Du har ikke rettigheder til at redigere denne del. @@ -107,9 +105,7 @@ og bagefter 'tage den pÃ¥'. Fundet i [PATH] </text> <text name="not worn instructions"> - Tag et ny hÃ¥r pÃ¥ ved at trække et fra din beholdning -over pÃ¥ din avatar. Du kan ogsÃ¥ oprette et nyt hÃ¥r fra bunden -og bagefter 'tage det pÃ¥'. + Vælg et nyt hÃ¥r ved at trække et sÃ¥dant fra din beholdning over pÃ¥ din avatar. Du kan ogsÃ¥ oprette et fra bunden og bagefter 'tage det pÃ¥'. </text> <text name="no modify instructions"> Du har ikke rettigheder til at redigere denne del. @@ -140,9 +136,7 @@ og bagefter 'tage det pÃ¥'. Fundet i [PATH] </text> <text name="not worn instructions"> - Tag et ny sæt øjne pÃ¥ ved at trække et sæt fra din beholdning -over pÃ¥ din avatar. Du kan ogsÃ¥ oprette et nyt sæt øjne fra bunden -og bagefter 'tage dem pÃ¥'. + Vælg et nyt sæt øjne ved at trække et sÃ¥dant par fra din beholdning over pÃ¥ din avatar. Du kan ogsÃ¥ oprette et par fra bunden og bagefter 'tage dem pÃ¥'. </text> <text name="no modify instructions"> Du har ikke rettigheder til at redigere denne del. @@ -156,12 +150,14 @@ og bagefter 'tage dem pÃ¥'. <button label="Gem som..." label_selected="Gem som..." name="Save As"/> <button label="Annullér" label_selected="Annullér" name="Revert"/> </panel> - <placeholder label="Tøje" name="clothes_placeholder"/> + <text label="Tøje" name="clothes_placeholder"> + Tøj + </text> <panel label="Trøje" name="Shirt"> <texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge et billede"/> <color_swatch label="Farve" name="Color/Tint" tool_tip="Klik for at Ã¥bne farvevælger"/> - <button label="Lav ny trøje" label_selected="Lav ny trøje" name="Create New"/> <button label="Tag af" label_selected="Tag af" name="Take Off"/> + <button label="Lav ny trøje" label_selected="Lav ny trøje" name="Create New"/> <button label="Gem" label_selected="Gem" name="Save"/> <button label="Gem som..." label_selected="Gem som..." name="Save As"/> <button label="Annullér" label_selected="Annullér" name="Revert"/> @@ -181,8 +177,7 @@ og bagefter 'tage dem pÃ¥'. Fundet i [PATH] </text> <text name="not worn instructions"> - Tag en ny Tøje pÃ¥ ved at trække en fra din beholdning over pÃ¥ din avatar. -Du kan ogsÃ¥ oprette en ny Tøje fra bunden og bagefter 'tage den pÃ¥'. + Vælg en ny trøje ved at trække en fra din beholdning over pÃ¥ din avatar. Du kan ogsÃ¥ oprette en fra bunden og bagefter 'tage den pÃ¥'. </text> <text name="no modify instructions"> Du har ikke rettigheder til at redigere denne del. @@ -194,8 +189,8 @@ Du kan ogsÃ¥ oprette en ny Tøje fra bunden og bagefter 'tage den pÃ¥' <panel label="Bukser" name="Pants"> <texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge et billede"/> <color_swatch label="Farve" name="Color/Tint" tool_tip="Klik for at Ã¥bne farvevælger"/> - <button label="Lav nye bukser" label_selected="Lav nye bukser" name="Create New"/> <button label="Tag af" label_selected="Tag af" name="Take Off"/> + <button label="Lav nye bukser" label_selected="Lav nye bukser" name="Create New"/> <button label="Gem" label_selected="Gem" name="Save"/> <button label="Gem som..." label_selected="Gem som..." name="Save As"/> <button label="Annullér" label_selected="Annullér" name="Revert"/> @@ -215,9 +210,7 @@ Du kan ogsÃ¥ oprette en ny Tøje fra bunden og bagefter 'tage den pÃ¥' Fundet i [PATH] </text> <text name="not worn instructions"> - Tag nyr bukser pÃ¥ ved at trække dem fra din beholdning over pÃ¥ -din avatar. Du kan ogsÃ¥ oprette ny bukser fra bunden og bagefter -'tage dem pÃ¥'. + Vælg et nyt par bukser ved at trække et par fra din beholdning over pÃ¥ din avatar. Du kan ogsÃ¥ oprette et par fra bunden og bagefter 'tage dem pÃ¥'. </text> <text name="no modify instructions"> Du har ikke rettigheder til at redigere denne del. @@ -243,10 +236,9 @@ din avatar. Du kan ogsÃ¥ oprette ny bukser fra bunden og bagefter Fundet i [PATH] </text> <text name="not worn instructions"> - Tag et ny par sko pÃ¥ ved at trække dem fra din beholdning -over pÃ¥ din avatar. Du kan ogsÃ¥ oprette et nyt par sko fra bunden -og bagefter 'tage dem pÃ¥'. + Vælg et nyt par sko ved at trække et par fra din beholdning over pÃ¥ din avatar. Du kan ogsÃ¥ oprette et par fra bunden og bagefter 'tage dem pÃ¥'. </text> + <button label="Lav nye sko" label_selected="Lav nye sko" name="Create New"/> <text name="no modify instructions"> Du har ikke rettigheder til at redigere denne del. </text> @@ -255,7 +247,6 @@ og bagefter 'tage dem pÃ¥'. </text> <texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge et billede"/> <color_swatch label="Farve" name="Color/Tint" tool_tip="Klik for at Ã¥bne farvevælger"/> - <button label="Lav nye sko" label_selected="Lav nye sko" name="Create New"/> <button label="Tag af" label_selected="Tag af" name="Take Off"/> <button label="Gem" label_selected="Gem" name="Save"/> <button label="Gem som..." label_selected="Gem som..." name="Save As"/> @@ -278,10 +269,9 @@ og bagefter 'tage dem pÃ¥'. Fundet i [PATH] </text> <text name="not worn instructions"> - Tag et ny par Strømper pÃ¥ ved at trække dem fra din beholdning -over pÃ¥ din avatar. Du kan ogsÃ¥ oprette et nyt par Strømper fra bunden -og bagefter 'tage dem pÃ¥'. + Vælg et nyt par sokker ved at trække et par fra din beholdning over pÃ¥ din avatar. Du kan ogsÃ¥ oprette et par fra bunden og bagefter 'tage dem pÃ¥'. </text> + <button label="Lav nye strømper" label_selected="Lav nye strømper" name="Create New"/> <text name="no modify instructions"> Du har ikke rettigheder til at redigere denne del. </text> @@ -290,7 +280,6 @@ og bagefter 'tage dem pÃ¥'. </text> <texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge et billede"/> <color_swatch label="Farve" name="Color/Tint" tool_tip="Klik for at Ã¥bne farvevælger"/> - <button label="Lav nye strømper" label_selected="Lav nye strømper" name="Create New"/> <button label="Tag af" label_selected="Tag af" name="Take Off"/> <button label="Gem" label_selected="Gem" name="Save"/> <button label="Gem som..." label_selected="Gem som..." name="Save As"/> @@ -313,9 +302,9 @@ og bagefter 'tage dem pÃ¥'. Fundet i [PATH] </text> <text name="not worn instructions"> - Tag en ny jakke pÃ¥ ved at trække en fra din beholdning over pÃ¥ din avatar. -Du kan ogsÃ¥ oprette en ny jakke fra bunden og bagefter 'tage den pÃ¥'. + Vælg en ny jakke ved at trække en fra din beholdning over pÃ¥ din avatar. Du kan ogsÃ¥ oprette en fra bunden og bagefter 'tage den pÃ¥'. </text> + <button label="Lav ny jakke" label_selected="Lav ny jakke" name="Create New"/> <text name="no modify instructions"> Du har ikke rettigheder til at redigere denne del. </text> @@ -325,7 +314,6 @@ Du kan ogsÃ¥ oprette en ny jakke fra bunden og bagefter 'tage den pÃ¥' <texture_picker label="Stof øverst" name="Upper Fabric" tool_tip="Klik for at vælge et billede"/> <texture_picker label="Stof nederst" name="Lower Fabric" tool_tip="Klik for at vælge et billede"/> <color_swatch label="Farve" name="Color/Tint" tool_tip="Klik for at Ã¥bne farvevælger"/> - <button label="Lav ny jakke" label_selected="Lav ny jakke" name="Create New"/> <button label="Tag af" label_selected="Tag af" name="Take Off"/> <button label="Gem" label_selected="Gem" name="Save"/> <button label="Gem som..." label_selected="Gem som..." name="Save As"/> @@ -348,10 +336,9 @@ Du kan ogsÃ¥ oprette en ny jakke fra bunden og bagefter 'tage den pÃ¥' Fundet i [PATH] </text> <text name="not worn instructions"> - Tag nye handsker pÃ¥ ved at trække et par fra din beholdning over pÃ¥ -din avatar. Du kan ogsÃ¥ oprette nye handsker fra bunden -og bagefter 'tage dem pÃ¥'. + Vælg et sæt nye handsker ved at trække et par fra din beholdning over pÃ¥ din avatar. Du kan ogsÃ¥ oprette et par fra bunden og bagefter 'tage dem pÃ¥'. </text> + <button label="Lav nye handsker" label_selected="Lav nye handsker" name="Create New"/> <text name="no modify instructions"> Du har ikke rettigheder til at redigere denne del. </text> @@ -360,7 +347,6 @@ og bagefter 'tage dem pÃ¥'. </text> <texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge et billede"/> <color_swatch label="Farve" name="Color/Tint" tool_tip="Klik for at Ã¥bne farvevælger"/> - <button label="Lav nye handsker" label_selected="Lav nye handsker" name="Create New"/> <button label="Tag af" label_selected="Tag af" name="Take Off"/> <button label="Gem" label_selected="Gem" name="Save"/> <button label="Gem som..." label_selected="Gem som..." name="Save As"/> @@ -383,10 +369,9 @@ og bagefter 'tage dem pÃ¥'. Fundet i [PATH] </text> <text name="not worn instructions"> - Tag en ny undertrøje pÃ¥ ved at trække en fra din beholdning over pÃ¥ -din avatar. Du kan ogsÃ¥ oprette en ny undertrøje fra bunden -og bagefter 'tage den pÃ¥'. + Vælg en ny undertrøje ved at trække en fra din beholdning over pÃ¥ din avatar. Du kan ogsÃ¥ oprette en fra bunden og bagefter 'tage den pÃ¥'. </text> + <button label="Lav ny undertrøje" label_selected="Lav ny undertrøje" name="Create New"/> <text name="no modify instructions"> Du har ikke rettigheder til at redigere denne del. </text> @@ -395,7 +380,6 @@ og bagefter 'tage den pÃ¥'. </text> <texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge et billede"/> <color_swatch label="Farve" name="Color/Tint" tool_tip="Klik for at Ã¥bne farvevælger"/> - <button label="Lav ny undertrøje" label_selected="Lav ny undertrøje" name="Create New"/> <button label="Tag af" label_selected="Tag af" name="Take Off"/> <button label="Gem" label_selected="Gem" name="Save"/> <button label="Gem som..." label_selected="Gem som..." name="Save As"/> @@ -418,10 +402,9 @@ og bagefter 'tage den pÃ¥'. Fundet i [PATH] </text> <text name="not worn instructions"> - Tag nye underbukser pÃ¥ ved at trække dem fra din beholdning over pÃ¥ -din avatar. Du kan ogsÃ¥ oprette en par nye underbukser fra bunden -og bagefter 'tage dem pÃ¥'. + Vælg et nyt par underbukser ved at trække et par fra din beholdning over pÃ¥ din avatar. Du kan ogsÃ¥ oprette et par fra bunden og bagefter 'tage dem pÃ¥'. </text> + <button label="Lav nye underbukser" label_selected="Lav nye underbukser" name="Create New"/> <text name="no modify instructions"> Du har ikke rettigheder til at redigere denne del. </text> @@ -430,7 +413,6 @@ og bagefter 'tage dem pÃ¥'. </text> <texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge et billede"/> <color_swatch label="Farve" name="Color/Tint" tool_tip="Klik for at Ã¥bne farvevælger"/> - <button label="Lav nye underbukser" label_selected="Lav nye underbukser" name="Create New"/> <button label="Tag af" label_selected="Tag af" name="Take Off"/> <button label="Gem" label_selected="Gem" name="Save"/> <button label="Gem som..." label_selected="Gem som..." name="Save As"/> @@ -453,10 +435,9 @@ og bagefter 'tage dem pÃ¥'. Fundet i [PATH] </text> <text name="not worn instructions"> - Tag en ny nederdel pÃ¥ ved at trække en fra din beholdning over pÃ¥ -din avatar. Du kan ogsÃ¥ oprette en ny nederdel fra bunden -og bagefter 'tage den pÃ¥'. + Vælg en ny nederdel ved at trække en fra din beholdning over pÃ¥ din avatar. Du kan ogsÃ¥ oprette en fra bunden og bagefter 'tage den pÃ¥'. </text> + <button label="Lav ny nederdel" label_selected="Lav ny nederdel" name="Create New"/> <text name="no modify instructions"> Du har ikke rettigheder til at redigere denne del. </text> @@ -465,13 +446,12 @@ og bagefter 'tage den pÃ¥'. </text> <texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge et billede"/> <color_swatch label="Farve" name="Color/Tint" tool_tip="Klik for at Ã¥bne farvevælger"/> - <button label="Lav ny nederdel" label_selected="Lav ny nederdel" name="Create New"/> <button label="Tag af" label_selected="Tag af" name="Take Off"/> <button label="Gem" label_selected="Gem" name="Save"/> <button label="Gem som..." label_selected="Gem som..." name="Save As"/> <button label="Annullér" label_selected="Annullér" name="Revert"/> </panel> - <panel label="Alpha" name="Alpha"> + <panel label="Tatovering" name="Tattoo"> <text name="title"> [DESC] </text> @@ -488,27 +468,24 @@ og bagefter 'tage den pÃ¥'. Placeret i [PATH] </text> <text name="not worn instructions"> - Brug en ny "alpha mask" ved at trække en fra din beholding til din avatar. -Alternativt kan du lave en fra bunden og bære denne. + Vælg en ny tatovering ved at trække en fra din beholdning over pÃ¥ din avatar. Du kan ogsÃ¥ oprette en fra bunden og bagefter 'tage den pÃ¥'. </text> + <button label="lav ny tatovering" label_selected="Lav ny tatovering" name="Create New"/> <text name="no modify instructions"> Du har ikke rettigheder til at ændre denne. </text> <text name="Item Action Label"> - Alpha: + Tatovering: </text> - <texture_picker label="Alpha - nedre" name="Lower Alpha" tool_tip="Klik for at vælge et billede"/> - <texture_picker label="Øvre alpha" name="Upper Alpha" tool_tip="Klik for at vælge et billede"/> - <texture_picker label="Alpha - hoved" name="Head Alpha" tool_tip="Klik for at vælge et billede"/> - <texture_picker label="Alpha - øjne" name="Eye Alpha" tool_tip="Klik for at vælge et billede"/> - <texture_picker label="Alpha - hÃ¥r" name="Hair Alpha" tool_tip="Klik for at vælge et billede"/> - <button label="Lav ny "Alpha"" label_selected="Lav ny "Alpha"" name="Create New"/> + <texture_picker label="Tatovering - hovede" name="Head Tattoo" tool_tip="Klik for at vælge et billede"/> + <texture_picker label="Øvre tatovering" name="Upper Tattoo" tool_tip="Klik for at vælge et billede"/> + <texture_picker label="Nedre tatovering" name="Lower Tattoo" tool_tip="Klik for at vælge et billede"/> <button label="Tag af" label_selected="Tag af" name="Take Off"/> <button label="Gem" label_selected="Gem" name="Save"/> <button label="Gem som..." label_selected="Gem som..." name="Save As"/> <button label="Vend tilbage" label_selected="Vend tilbage" name="Revert"/> </panel> - <panel label="Tatovering" name="Tattoo"> + <panel label="Alpha" name="Alpha"> <text name="title"> [DESC] </text> @@ -525,26 +502,28 @@ Alternativt kan du lave en fra bunden og bære denne. Placeret i [PATH] </text> <text name="not worn instructions"> - Brug en ny tatovering ved at trække en fra din beholding til din avatar. -Alternativt kan du lave en fra bunden og bære denne. + Vælg en ny 'alpha maske' ved at trække en fra din beholdning over pÃ¥ din avatar. Du kan ogsÃ¥ oprette en fra bunden og bagefter 'tage den pÃ¥'. </text> + <button label="Lav ny "Alpha"" label_selected="Lav ny "Alpha"" name="Create New"/> <text name="no modify instructions"> Du har ikke rettigheder til at ændre denne. </text> <text name="Item Action Label"> - Tatovering: + Alpha: </text> - <texture_picker label="Tatovering - hovede" name="Head Tattoo" tool_tip="Klik for at vælge et billede"/> - <texture_picker label="Øvre tatovering" name="Upper Tattoo" tool_tip="Klik for at vælge et billede"/> - <texture_picker label="Nedre tatovering" name="Lower Tattoo" tool_tip="Klik for at vælge et billede"/> - <button label="lav ny tatovering" label_selected="Lav ny tatovering" name="Create New"/> + <texture_picker label="Alpha - nedre" name="Lower Alpha" tool_tip="Klik for at vælge et billede"/> + <texture_picker label="Øvre alpha" name="Upper Alpha" tool_tip="Klik for at vælge et billede"/> + <texture_picker label="Alpha - hoved" name="Head Alpha" tool_tip="Klik for at vælge et billede"/> + <texture_picker label="Alpha - øjne" name="Eye Alpha" tool_tip="Klik for at vælge et billede"/> + <texture_picker label="Alpha - hÃ¥r" name="Hair Alpha" tool_tip="Klik for at vælge et billede"/> <button label="Tag af" label_selected="Tag af" name="Take Off"/> <button label="Gem" label_selected="Gem" name="Save"/> <button label="Gem som..." label_selected="Gem som..." name="Save As"/> <button label="Vend tilbage" label_selected="Vend tilbage" name="Revert"/> </panel> </tab_container> - <scroll_container left="212" name="panel_container"/> + <scroll_container name="panel_container"/> + <button label="Script info" label_selected="Script info" name="script_info" tool_tip="Vis scripts vedhæftet pÃ¥ din avatar"/> <button label="Lav sæt" label_selected="Lav sæt" name="make_outfit_btn"/> <button label="Annullér" label_selected="Annullér" name="Cancel"/> <button label="OK" label_selected="OK" name="Ok"/> diff --git a/indra/newview/skins/default/xui/da/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/da/floater_day_cycle_options.xml index 94cf4546e3..ffae3d788f 100644 --- a/indra/newview/skins/default/xui/da/floater_day_cycle_options.xml +++ b/indra/newview/skins/default/xui/da/floater_day_cycle_options.xml @@ -1,10 +1,10 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="Day Cycle Floater" title="DAG CYKLUS OPSÆTNING"> <tab_container name="Day Cycle Tabs"> <panel label="Dag cyklus" name="Day Cycle"> - <button label="?" name="WLDayCycleHelp" /> - <multi_slider label="" name="WLTimeSlider" /> - <multi_slider label="" name="WLDayCycleKeys" /> + <button label="?" name="WLDayCycleHelp"/> + <multi_slider label="" name="WLTimeSlider"/> + <multi_slider label="" name="WLDayCycleKeys"/> <text name="WL12am"> 00:00 </text> @@ -59,39 +59,38 @@ <text name="WL12amHash2"> | </text> - <button label="Tilføj key" label_selected="Tilføj key" name="WLAddKey" /> - <button label="Slet key" label_selected="Slet key" name="WLDeleteKey" /> + <button label="Tilføj key" label_selected="Tilføj key" name="WLAddKey"/> + <button label="Slet key" label_selected="Slet key" name="WLDeleteKey"/> <text name="WLCurKeyFrameText"> Key-frame indstillinger: </text> <text name="WLCurKeyTimeText"> Key tid: </text> - <spinner label="Timer" name="WLCurKeyHour" /> - <spinner label="Min." name="WLCurKeyMin" /> + <spinner label="Timer" name="WLCurKeyHour"/> + <spinner label="Min." name="WLCurKeyMin"/> <text name="WLCurKeyTimeText2"> Key fast indstilling: </text> - <combo_box label="Faste" name="WLKeyPresets" /> + <combo_box label="Faste" name="WLKeyPresets"/> <text name="DayCycleText"> Snap: </text> - <combo_box label="5 min" name="WLSnapOptions" /> + <combo_box label="5 min" name="WLSnapOptions"/> <text name="DayCycleText2"> Cycluslængde: </text> - <spinner label="Timer" name="WLLengthOfDayHour" /> - <spinner label="Min." name="WLLengthOfDayMin" /> - <spinner label="Sek." name="WLLengthOfDaySec" /> + <spinner label="Timer" name="WLLengthOfDayHour"/> + <spinner label="Min." name="WLLengthOfDayMin"/> + <spinner label="Sek." name="WLLengthOfDaySec"/> <text name="DayCycleText3"> - Vis: - </text> - <button label="Afspil" label_selected="Afspil" name="WLAnimSky" /> - <button label="Stop!" label_selected="Stop" name="WLStopAnimSky" /> - <button label="Benyt estate tid" label_selected="GÃ¥ til estate tid" - name="WLUseLindenTime" /> - <button label="Gem test-dag" label_selected="Gem test-dag" name="WLSaveDayCycle" /> - <button label="Hent test-dag" label_selected="Hent test-dag" name="WLLoadDayCycle" /> + Vis : + </text> + <button label="Afspil" label_selected="Afspil" name="WLAnimSky"/> + <button label="Stop!" label_selected="Stop" name="WLStopAnimSky"/> + <button label="Benyt estate tid" label_selected="GÃ¥ til estate tid" name="WLUseLindenTime"/> + <button label="Gem test-dag" label_selected="Gem test-dag" name="WLSaveDayCycle"/> + <button label="Hent test-dag" label_selected="Hent test-dag" name="WLLoadDayCycle"/> </panel> </tab_container> </floater> diff --git a/indra/newview/skins/default/xui/da/floater_event.xml b/indra/newview/skins/default/xui/da/floater_event.xml new file mode 100644 index 0000000000..1816144b45 --- /dev/null +++ b/indra/newview/skins/default/xui/da/floater_event.xml @@ -0,0 +1,72 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater label="Event" name="Event" title="EVENT DETALJER"> + <floater.string name="none"> + ingen + </floater.string> + <floater.string name="notify"> + Meddel + </floater.string> + <floater.string name="dont_notify"> + Meddel ikke + </floater.string> + <floater.string name="moderate"> + Moderat + </floater.string> + <floater.string name="adult"> + Voksent + </floater.string> + <floater.string name="general"> + Generelt + </floater.string> + <floater.string name="unknown"> + Ukendt + </floater.string> + <layout_stack name="layout"> + <layout_panel name="profile_stack"> + <text name="event_name"> + Event uden navn. + </text> + <text name="event_category"> + (ingen kategori) + </text> + <text name="event_runby_label"> + Afholdt af: + </text> + <text initial_value="(henter)" name="event_runby"/> + <text name="event_date_label"> + Dato: + </text> + <text name="event_date"> + 10/10/2010 + </text> + <text name="event_duration_label"> + Varighed: + </text> + <text name="event_duration"> + 1 time + </text> + <text name="event_covercharge_label"> + Pris: + </text> + <text name="event_cover"> + Gratis + </text> + <text name="event_location_label"> + Lokation: + </text> + <text name="event_location" value="SampleParcel, Name Long (145, 228, 26)"/> + <text name="rating_label" value="Rating:"/> + <text name="rating_value" value="ukendt"/> + <expandable_text name="event_desc"> + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. + </expandable_text> + </layout_panel> + <layout_panel name="button_panel"> + <button name="create_event_btn" tool_tip="Opret event"/> + <button name="god_delete_event_btn" tool_tip="Slet event"/> + <button label="Giv besked" name="notify_btn"/> + <button label="Teleport" name="teleport_btn"/> + <button label="Kort" name="map_btn"/> + </layout_panel> + </layout_stack> +</floater> diff --git a/indra/newview/skins/default/xui/da/floater_god_tools.xml b/indra/newview/skins/default/xui/da/floater_god_tools.xml new file mode 100644 index 0000000000..5d3453e327 --- /dev/null +++ b/indra/newview/skins/default/xui/da/floater_god_tools.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="godtools floater" title="GOD TOOLS"> + <tab_container name="GodTools Tabs"> + <panel label="Grid" name="grid"/> + <panel label="Region" name="region"> + <text name="Region Name:"> + Region Name: + </text> + <check_box label="Reset Home On Teleport" name="check reset home" tool_tip="NÃ¥r beboere teleporterer væk, sÃ¥ sæt deres hjemmeadresse til deres destinations position."/> + </panel> + <panel label="Objects" name="objects"> + <text name="Region Name:"> + Region navn: + </text> + </panel> + </tab_container> +</floater> diff --git a/indra/newview/skins/default/xui/da/floater_help_browser.xml b/indra/newview/skins/default/xui/da/floater_help_browser.xml index fc52796344..4eba4aee1f 100644 --- a/indra/newview/skins/default/xui/da/floater_help_browser.xml +++ b/indra/newview/skins/default/xui/da/floater_help_browser.xml @@ -1,8 +1,9 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="floater_help_browser" title="HJÆLP"> + <floater.string name="loading_text"> + Henter... + </floater.string> <layout_stack name="stack1"> - <layout_panel name="external_controls"> - <button label="Ã…ben i min web browser" name="open_browser"/> - </layout_panel> + <layout_panel name="external_controls"/> </layout_stack> </floater> diff --git a/indra/newview/skins/default/xui/da/floater_im.xml b/indra/newview/skins/default/xui/da/floater_im.xml index 519a70d1d9..776bc9ab13 100644 --- a/indra/newview/skins/default/xui/da/floater_im.xml +++ b/indra/newview/skins/default/xui/da/floater_im.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <multi_floater name="im_floater" title="Personlig samtale (IM)"> <string name="only_user_message"> - Du er den eneste deltager i denne samtale + Du er den eneste beboer i denne session. </string> <string name="offline_message"> [FIRST] [LAST] er ikke logget pÃ¥. @@ -10,7 +10,7 @@ Tryk pÃ¥ [BUTTON NAME] knappen for at acceptére/tilslutte til denne stemme chat. </string> <string name="muted_message"> - Du har blokeret denne beboer. Hvis du sender besked vil denne blokering fjernes. + Du har blokeret denne beboer. Hvis du sender en besked til beboeren vil dette automatisk medføre fjernelse af blokeringen </string> <string name="generic_request_error"> Kunne ikke etablere forbindelse, prøv igen senere @@ -31,7 +31,7 @@ Du er blevet "blokeret". </string> <string name="add_session_event"> - Ikke muligt at tilføge brugere til samtale med [RECIPIENT]. + Kunne ikke tilføje beboere til chat session med [RECIPIENT]. </string> <string name="message_session_event"> Ikke muligt at sende din besked til samtalen med [RECIPIENT]. diff --git a/indra/newview/skins/default/xui/da/floater_im_container.xml b/indra/newview/skins/default/xui/da/floater_im_container.xml index da6f877f56..28b2f7f7eb 100644 --- a/indra/newview/skins/default/xui/da/floater_im_container.xml +++ b/indra/newview/skins/default/xui/da/floater_im_container.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<multi_floater name="floater_im_box" title="Personlige beskeder"/> +<multi_floater name="floater_im_box" title="SAMTALER"/> diff --git a/indra/newview/skins/default/xui/da/floater_image_preview.xml b/indra/newview/skins/default/xui/da/floater_image_preview.xml index 52fd9f80c0..5355127ef5 100644 --- a/indra/newview/skins/default/xui/da/floater_image_preview.xml +++ b/indra/newview/skins/default/xui/da/floater_image_preview.xml @@ -10,16 +10,16 @@ Se billede som: </text> <combo_box label="Tøj type" name="clothing_type_combo"> - <combo_box.item label="Billede" name="Image"/> - <combo_box.item label="HÃ¥r" name="Hair"/> - <combo_box.item label="Kvinde - hoved" name="FemaleHead"/> - <combo_box.item label="Kvinde - overkrop" name="FemaleUpperBody"/> - <combo_box.item label="Kvinde - underkrop" name="FemaleLowerBody"/> - <combo_box.item label="Mand - hoved" name="MaleHead"/> - <combo_box.item label="Mand - overkrop" name="MaleUpperBody"/> - <combo_box.item label="Mand - underkrop" name="MaleLowerBody"/> - <combo_box.item label="Nederdel" name="Skirt"/> - <combo_box.item label="Sculpted Prim" name="SculptedPrim"/> + <item label="Billede" name="Image" value="Billede"/> + <item label="HÃ¥r" name="Hair" value="HÃ¥r"/> + <item label="Kvinde - hoved" name="FemaleHead" value="Hoved - kvinde"/> + <item label="Kvinde - overkrop" name="FemaleUpperBody" value="Overkrop - kvinde"/> + <item label="Kvinde - underkrop" name="FemaleLowerBody" value="Underkrop - kvinde"/> + <item label="Mand - hoved" name="MaleHead" value="Hoved - mand"/> + <item label="Mand - overkrop" name="MaleUpperBody" value="Overkrop - mand"/> + <item label="Mand - underkrop" name="MaleLowerBody" value="Underkrop - mand"/> + <item label="Nederdel" name="Skirt" value="Nederdel"/> + <item label="Sculpted Prim" name="SculptedPrim" value="Sculpted prim"/> </combo_box> <text name="bad_image_text"> Kunne ikke læse billede. diff --git a/indra/newview/skins/default/xui/da/floater_incoming_call.xml b/indra/newview/skins/default/xui/da/floater_incoming_call.xml index 3a1ef2e47d..2349174db2 100644 --- a/indra/newview/skins/default/xui/da/floater_incoming_call.xml +++ b/indra/newview/skins/default/xui/da/floater_incoming_call.xml @@ -1,5 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="incoming call" title="UKENDT PERSON KALDER OP"> + <floater.string name="lifetime"> + 5 + </floater.string> <floater.string name="localchat"> Stemme chat nærved </floater.string> @@ -12,6 +15,9 @@ <floater.string name="VoiceInviteAdHoc"> har sluttet sig til stemme chat opkald med en konference chat. </floater.string> + <floater.string name="VoiceInviteGroup"> + deltager nu i Stemme chat opkald med denne gruppe [GROUP]. + </floater.string> <text name="question"> Ønsker du at forlade [CURRENT_CHAT] og slutte dig til denne stemme chat? </text> diff --git a/indra/newview/skins/default/xui/da/floater_inventory.xml b/indra/newview/skins/default/xui/da/floater_inventory.xml index d80051fb84..3a4b0fbd6b 100644 --- a/indra/newview/skins/default/xui/da/floater_inventory.xml +++ b/indra/newview/skins/default/xui/da/floater_inventory.xml @@ -1,13 +1,13 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Inventory" title="BEHOLDNING"> +<floater name="Inventory" title="MIN BEHOLDNING"> <floater.string name="Title"> - Beholdning + MIN BEHOLDNING </floater.string> <floater.string name="TitleFetching"> - Beholdning (henter [ITEM_COUNT] genstande...) [FILTER] + MIN BEHOLDNING (Henter [ITEM_COUNT] genstande...) [FILTER] </floater.string> <floater.string name="TitleCompleted"> - Beholdning ([ITEM_COUNT] genstande) [FILTER] + MIN BEHOLDNING ([ITEM_COUNT] genstande) [FILTER] </floater.string> <floater.string name="Fetched"> Hentet diff --git a/indra/newview/skins/default/xui/da/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/da/floater_live_lsleditor.xml index 4079ff9f38..0cc13fd736 100644 --- a/indra/newview/skins/default/xui/da/floater_live_lsleditor.xml +++ b/indra/newview/skins/default/xui/da/floater_live_lsleditor.xml @@ -7,7 +7,7 @@ Kører </floater.string> <floater.string name="Title"> - Script: [NAME] + SCRIPT: [NAME] </floater.string> <button label="Nulstil" label_selected="Reset" name="Reset"/> <check_box initial_value="true" label="Kører" name="running"/> diff --git a/indra/newview/skins/default/xui/da/floater_lsl_guide.xml b/indra/newview/skins/default/xui/da/floater_lsl_guide.xml index 2b008f133c..2594d6bb9d 100644 --- a/indra/newview/skins/default/xui/da/floater_lsl_guide.xml +++ b/indra/newview/skins/default/xui/da/floater_lsl_guide.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="script ed float" title="LSL WIKI"> +<floater name="script ed float" title="LSL REFERENCE"> <check_box label="Følg markøreren" name="lock_check"/> <combo_box label="LÃ¥s" left_delta="114" name="history_combo" width="70"/> <button label="Tilbage" name="back_btn"/> diff --git a/indra/newview/skins/default/xui/da/floater_map.xml b/indra/newview/skins/default/xui/da/floater_map.xml index f618548908..cd6c03058b 100644 --- a/indra/newview/skins/default/xui/da/floater_map.xml +++ b/indra/newview/skins/default/xui/da/floater_map.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Map"> +<floater name="Map" title=""> <floater.string name="mini_map_north"> N </floater.string> diff --git a/indra/newview/skins/default/xui/da/floater_media_browser.xml b/indra/newview/skins/default/xui/da/floater_media_browser.xml index 47667973ba..d3028c32f9 100644 --- a/indra/newview/skins/default/xui/da/floater_media_browser.xml +++ b/indra/newview/skins/default/xui/da/floater_media_browser.xml @@ -1,19 +1,19 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="floater_about" title="MEDIE VÆLGER"> <layout_stack name="stack1"> <layout_panel name="nav_controls"> - <button label="Tilbage" name="back" /> - <button label="Frem" name="forward" /> - <button label="Opdater" name="reload" /> - <button label="GÃ¥ til" name="go" /> + <button label="Tilbage" name="back"/> + <button label="Frem" name="forward"/> + <button label="Opdater" name="reload"/> + <button label="GÃ¥ til" name="go"/> </layout_panel> <layout_panel name="parcel_owner_controls"> - <button label="Send nuværende URL til parcel" name="assign" /> + <button label="Send denne side til parcel" name="assign"/> </layout_panel> <layout_panel name="external_controls"> - <button label="Ã…ben i min browser" name="open_browser" /> - <check_box label="Ã…ben altid i min browser" name="open_always" /> - <button label="Luk" name="close" /> + <button label="Ã…ben i min browser" name="open_browser"/> + <check_box label="Ã…ben altid i min browser" name="open_always"/> + <button label="Luk" name="close"/> </layout_panel> </layout_stack> </floater> diff --git a/indra/newview/skins/default/xui/da/floater_moveview.xml b/indra/newview/skins/default/xui/da/floater_moveview.xml index b00dc6bf4d..14d3604b43 100644 --- a/indra/newview/skins/default/xui/da/floater_moveview.xml +++ b/indra/newview/skins/default/xui/da/floater_moveview.xml @@ -6,24 +6,64 @@ <string name="walk_back_tooltip"> GÃ¥ baglæns (Tryk pÃ¥ Ned piletast eller S) </string> + <string name="walk_left_tooltip"> + GÃ¥ til venstre (tryk Shift + venstre pil eller A) + </string> + <string name="walk_right_tooltip"> + GÃ¥ til højre (tryk Shift + højre pil eller D) + </string> <string name="run_forward_tooltip"> Løb forlæns (Tryk pÃ¥ Op piletast eller W) </string> <string name="run_back_tooltip"> Løb baglæns (Tryk pÃ¥ Ned piletast eller S) </string> + <string name="run_left_tooltip"> + Løb til venstre (tryk Shift + venstre pil eller A) + </string> + <string name="run_right_tooltip"> + Løb til højre (tryk Shift + højre pil eller D) + </string> <string name="fly_forward_tooltip"> Flyv frem (Tryk pÃ¥ Op piletast eller W) </string> <string name="fly_back_tooltip"> Flyv baglæns (Tryk pÃ¥ Ned piletast eller S) </string> + <string name="fly_left_tooltip"> + Flyv til venstre (tryk Shift + venstre pil eller A) + </string> + <string name="fly_right_tooltip"> + Flyv til højre (tryk Shift + højre pil eller D) + </string> + <string name="fly_up_tooltip"> + Flyv op (tryk E) + </string> + <string name="fly_down_tooltip"> + Flyv ned (tryk C) + </string> + <string name="jump_tooltip"> + Hop (tryk E) + </string> + <string name="crouch_tooltip"> + Kryb (tryk C) + </string> + <string name="walk_title"> + GÃ¥ + </string> + <string name="run_title"> + Løb + </string> + <string name="fly_title"> + Flyv + </string> <panel name="panel_actions"> - <button label="" label_selected="" name="turn left btn" tool_tip="xxx - Drej til venstre (Tryk pÃ¥ venstre piletast eller A)"/> + <button label="" label_selected="" name="move up btn" tool_tip="Flyv op (tryk E)"/> + <button label="" label_selected="" name="turn left btn" tool_tip="xxx Drej til venstre (Tryk pÃ¥ venstre piletast eller A)"/> + <joystick_slide name="move left btn" tool_tip="GÃ¥ til venstre (tryk Shift + venstre pil eller A)"/> + <button label="" label_selected="" name="move down btn" tool_tip="Flyv ned (tryk C)"/> <button label="" label_selected="" name="turn right btn" tool_tip="Drej til højre (Tryk pÃ¥ højre piletast eller D)"/> - <button label="" label_selected="" name="move up btn" tool_tip="Flyv op, Tryk pÃ¥ "E""/> - <button label="" label_selected="" name="move down btn" tool_tip="Flyv ned, Tryk pÃ¥ "C""/> + <joystick_slide name="move right btn" tool_tip="GÃ¥ til højre (tryk Shift + højre pil eller D)"/> <joystick_turn name="forward btn" tool_tip="GÃ¥ frem (Tryk pÃ¥ Op piletast eller W)"/> <joystick_turn name="backward btn" tool_tip="GÃ¥ tilbage (Tryk pÃ¥ Ned piletast eller S)"/> </panel> @@ -31,6 +71,5 @@ <button label="" name="mode_walk_btn" tool_tip="GÃ¥ tilstand"/> <button label="" name="mode_run_btn" tool_tip="Løbe tilstand"/> <button label="" name="mode_fly_btn" tool_tip="Flyve tilstand"/> - <button label="Stop flyvning" name="stop_fly_btn" tool_tip="Stop flyvning"/> </panel> </floater> diff --git a/indra/newview/skins/default/xui/da/floater_outfit_save_as.xml b/indra/newview/skins/default/xui/da/floater_outfit_save_as.xml new file mode 100644 index 0000000000..0bcb96b151 --- /dev/null +++ b/indra/newview/skins/default/xui/da/floater_outfit_save_as.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="modal container" title="Gem sæt"> + <button label="Gem" label_selected="Gem" name="Save"/> + <button label="Annullér" label_selected="Annullér" name="Cancel"/> + <text name="Save item as:"> + Gem hvad jeg har pÃ¥ som et nyt sæt: + </text> + <line_editor name="name ed"> + [DESC] (ny) + </line_editor> +</floater> diff --git a/indra/newview/skins/default/xui/da/floater_outgoing_call.xml b/indra/newview/skins/default/xui/da/floater_outgoing_call.xml index 5c98d9855f..a5545668a2 100644 --- a/indra/newview/skins/default/xui/da/floater_outgoing_call.xml +++ b/indra/newview/skins/default/xui/da/floater_outgoing_call.xml @@ -1,5 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="outgoing call" title="KALDER"> + <floater.string name="lifetime"> + 5 + </floater.string> <floater.string name="localchat"> Stemme chat nærved </floater.string> @@ -21,6 +24,15 @@ <text name="noanswer"> Intet svar. Prøv igen senere. </text> + <text name="nearby"> + Du er blevet koblet af fra [VOICE_CHANNEL_NAME]. [RECONNECT_NEARBY] + </text> + <text name="nearby_P2P_by_other"> + Dit kald er afsluttet. [RECONNECT_NEARBY] + </text> + <text name="nearby_P2P_by_agent"> + Du har afsluttet opkaldet. [RECONNECT_NEARBY] + </text> <text name="leaving"> Forlader [CURRENT_CHAT]. </text> diff --git a/indra/newview/skins/default/xui/da/floater_pay_object.xml b/indra/newview/skins/default/xui/da/floater_pay_object.xml index f74e097da2..368d678681 100644 --- a/indra/newview/skins/default/xui/da/floater_pay_object.xml +++ b/indra/newview/skins/default/xui/da/floater_pay_object.xml @@ -15,7 +15,7 @@ </text> <icon name="icon_object" tool_tip="Objekter"/> <text name="object_name_text"> - ... + Mit fantastiske objekt med et virkeligt langt navn </text> <button label="L$1" label_selected="L$1" name="fastpay 1"/> <button label="L$5" label_selected="L$5" name="fastpay 5"/> diff --git a/indra/newview/skins/default/xui/da/floater_preferences.xml b/indra/newview/skins/default/xui/da/floater_preferences.xml index f0fe3472d0..a53586eaaf 100644 --- a/indra/newview/skins/default/xui/da/floater_preferences.xml +++ b/indra/newview/skins/default/xui/da/floater_preferences.xml @@ -6,7 +6,7 @@ <panel label="Generelt" name="general"/> <panel label="Grafik" name="display"/> <panel label="Privatliv" name="im"/> - <panel label="Sound" name="audio"/> + <panel label="Lyd & medier" name="audio"/> <panel label="Chat" name="chat"/> <panel label="Beskeder" name="msgs"/> <panel label="Opsætning" name="input"/> diff --git a/indra/newview/skins/default/xui/da/floater_preview_gesture.xml b/indra/newview/skins/default/xui/da/floater_preview_gesture.xml index bfa3c150a9..f49fd8c99a 100644 --- a/indra/newview/skins/default/xui/da/floater_preview_gesture.xml +++ b/indra/newview/skins/default/xui/da/floater_preview_gesture.xml @@ -24,6 +24,9 @@ <floater.string name="Title"> Bevægelse: [NAME] </floater.string> + <text name="name_text"> + Navn: + </text> <text name="desc_label"> Beskrivelse: </text> diff --git a/indra/newview/skins/default/xui/da/floater_preview_notecard.xml b/indra/newview/skins/default/xui/da/floater_preview_notecard.xml index 2ebec4462f..5a0f5a32c0 100644 --- a/indra/newview/skins/default/xui/da/floater_preview_notecard.xml +++ b/indra/newview/skins/default/xui/da/floater_preview_notecard.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="preview notecard" title="NOTE:"> <floater.string name="no_object"> - Kunne ikke finde objekt der indeholder denne note. + Kunne ikke finde objekt som indeholder denne note. </floater.string> <floater.string name="not_allowed"> Du har ikke rettigheder til at se denne note. @@ -9,9 +9,6 @@ <floater.string name="Title"> Note: [NAME] </floater.string> - <floater.string label="Gem" label_selected="Gem" name="Save"> - Gem - </floater.string> <text name="desc txt"> Beskrivelse: </text> @@ -19,4 +16,5 @@ Indlæser... </text_editor> <button label="Gem" label_selected="Gem" name="Save"/> + <button label="Slet" label_selected="Slet" name="Delete"/> </floater> diff --git a/indra/newview/skins/default/xui/da/floater_preview_texture.xml b/indra/newview/skins/default/xui/da/floater_preview_texture.xml index ab7ddbcc72..48cf53f563 100644 --- a/indra/newview/skins/default/xui/da/floater_preview_texture.xml +++ b/indra/newview/skins/default/xui/da/floater_preview_texture.xml @@ -12,6 +12,9 @@ <text name="dimensions"> [WIDTH]px x [HEIGHT]px </text> + <text name="aspect_ratio"> + Vis aspekt forhold + </text> <combo_box name="combo_aspect_ratio" tool_tip="ForhÃ¥ndsvisning med et bestemt billedformat"> <combo_item name="Unconstrained"> Ikke lÃ¥st @@ -38,7 +41,7 @@ 2:1 </combo_item> </combo_box> - <button label="OK" name="keep"/> - <button label="Annullér" name="discard"/> + <button label="OK" name="Keep"/> + <button label="Kassér" name="Discard"/> <button label="Gem som" name="save_tex_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/da/floater_publish_classified.xml b/indra/newview/skins/default/xui/da/floater_publish_classified.xml new file mode 100644 index 0000000000..220042f015 --- /dev/null +++ b/indra/newview/skins/default/xui/da/floater_publish_classified.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="publish_classified" title="Publicerer annoncer"> + <text name="explanation_text"> + Din annonce vil blive vist i en uge fra den dato den publiceres. + +Husk, annonceomkostninger kan ikke refunderes. + </text> + <spinner label="Pris for annonce:" name="price_for_listing" tool_tip="Pris for optagelse af annonce." value="50"/> + <text name="l$_text" value="L$"/> + <text name="more_info_text"> + Mere info (link til hjælp om annoncer) + </text> + <button label="Publicér" name="publish_btn"/> + <button label="Annullér" name="cancel_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/da/floater_report_abuse.xml b/indra/newview/skins/default/xui/da/floater_report_abuse.xml index 9ef17a3cbb..07978792b9 100644 --- a/indra/newview/skins/default/xui/da/floater_report_abuse.xml +++ b/indra/newview/skins/default/xui/da/floater_report_abuse.xml @@ -42,7 +42,7 @@ <combo_box.item label="Vælg kategori" name="Select_category"/> <combo_box.item label="Alder > Falsk alder" name="Age__Age_play"/> <combo_box.item label="Alder > Voksen beboer pÃ¥ Teen Second Life" name="Age__Adult_resident_on_Teen_Second_Life"/> - <combo_box.item label="Alder > MindreÃ¥rig beboer udenfor Teen Second Life" name="Age__Underage_resident_outside_of_Teen_Second_Life"/> + <combo_box.item label="Alder > MindreÃ¥rig beboer uden for Teen Second Life" name="Age__Underage_resident_outside_of_Teen_Second_Life"/> <combo_box.item label="Overfald > Kamp sandkasse / Usikkert omrÃ¥de" name="Assault__Combat_sandbox___unsafe_area"/> <combo_box.item label="Overfald > Sikkert omrÃ¥de" name="Assault__Safe_area"/> <combo_box.item label="Overfald > Sandkasse til vÃ¥bentest" name="Assault__Weapons_testing_sandbox"/> diff --git a/indra/newview/skins/default/xui/da/floater_script_limits.xml b/indra/newview/skins/default/xui/da/floater_script_limits.xml new file mode 100644 index 0000000000..a7f86a782a --- /dev/null +++ b/indra/newview/skins/default/xui/da/floater_script_limits.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="scriptlimits" title="SCRIPT INFORMATION"/> diff --git a/indra/newview/skins/default/xui/da/floater_script_preview.xml b/indra/newview/skins/default/xui/da/floater_script_preview.xml index 1e8d869716..1aacab6915 100644 --- a/indra/newview/skins/default/xui/da/floater_script_preview.xml +++ b/indra/newview/skins/default/xui/da/floater_script_preview.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="preview lsl text" title="SCRIPT: ROTATIONS SCRIPT"> <floater.string name="Title"> - Script: [NAME] + SCRIPT: [NAME] </floater.string> <text name="desc txt"> Beskrivelse: diff --git a/indra/newview/skins/default/xui/da/floater_select_key.xml b/indra/newview/skins/default/xui/da/floater_select_key.xml index fe0d31c6c3..9f7aad5e03 100644 --- a/indra/newview/skins/default/xui/da/floater_select_key.xml +++ b/indra/newview/skins/default/xui/da/floater_select_key.xml @@ -2,6 +2,6 @@ <floater name="modal container" title=""> <button label="Annullér" label_selected="Annullér" name="Cancel"/> <text name="Save item as:"> - Tryk pÃ¥ en taste for at sætte din "Tale" knap udløser. + Tryk en taste for at angive trigger til at tale. </text> </floater> diff --git a/indra/newview/skins/default/xui/da/floater_settings_debug.xml b/indra/newview/skins/default/xui/da/floater_settings_debug.xml index 41cf100d94..016e5af378 100644 --- a/indra/newview/skins/default/xui/da/floater_settings_debug.xml +++ b/indra/newview/skins/default/xui/da/floater_settings_debug.xml @@ -1,9 +1,9 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="settings_debug" title="DEBUG INDSTILLINGER"> - <combo_box name="boolean_combo"> - <combo_box.item label="SANDT" name="TRUE"/> - <combo_box.item label="FALSK" name="FALSE"/> - </combo_box> + <radio_group name="boolean_combo"> + <radio_item label="SANDT" name="TRUE" value="sand"/> + <radio_item label="FALSK" name="FALSE" value=""/> + </radio_group> <color_swatch label="Farve" name="val_color_swatch"/> <spinner label="x" name="val_spinner_1"/> <spinner label="x" name="val_spinner_2"/> diff --git a/indra/newview/skins/default/xui/da/floater_snapshot.xml b/indra/newview/skins/default/xui/da/floater_snapshot.xml index 5e8c64e21f..7f7fb8ddf0 100644 --- a/indra/newview/skins/default/xui/da/floater_snapshot.xml +++ b/indra/newview/skins/default/xui/da/floater_snapshot.xml @@ -1,79 +1,16 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Snapshot" title="FOTO FORHÃ…NDSVINSNING"> - <text name="type_label"> - Hvor skal foto hen? - </text> - <radio_group label="Snapshot type" name="snapshot_type_radio"> - <radio_item label="Send via e-mail" name="postcard"/> - <radio_item label="Gem i din beholdning (L$[AMOUNT])" name="texture"/> - <radio_item label="Gem pÃ¥ din computer" name="local"/> - </radio_group> - <text name="file_size_label"> - Fil størrelse: [SIZE] KB - </text> - <button label="Tag nyt foto" name="new_snapshot_btn"/> - <button label="Send" name="send_btn"/> - <button label="Gem (L$[AMOUNT])" name="upload_btn"/> - <flyout_button label="Gem" name="save_btn" tool_tip="Gem billede i pÃ¥ din computer"> - <flyout_button_item label="Gem" name="save_item"/> - <flyout_button_item label="Gem som..." name="saveas_item"/> - </flyout_button> - <button label="Annullér" name="discard_btn"/> - <button label="Mere >>" name="more_btn" tool_tip="Avancerede muligheder"/> - <button label="<< Mindre" name="less_btn" tool_tip="Avancerede muligheder"/> - <text name="type_label2"> - Størrelse - </text> - <text name="format_label"> - Format - </text> - <combo_box label="Opløsning" name="postcard_size_combo"> - <combo_box.item label="Aktuelle vindue" name="CurrentWindow"/> - <combo_box.item label="640x480" name="640x480"/> - <combo_box.item label="800x600" name="800x600"/> - <combo_box.item label="1024x768" name="1024x768"/> - <combo_box.item label="Manuel" name="Custom"/> - </combo_box> - <combo_box label="Opløsning" name="texture_size_combo"> - <combo_box.item label="Aktuelle vindue" name="CurrentWindow"/> - <combo_box.item label="Lille (128x128)" name="Small(128x128)"/> - <combo_box.item label="Medium (256x256)" name="Medium(256x256)"/> - <combo_box.item label="Stor (512x512)" name="Large(512x512)"/> - <combo_box.item label="Manuel" name="Custom"/> - </combo_box> - <combo_box label="Opløsning" name="local_size_combo"> - <combo_box.item label="Aktuelle vindue" name="CurrentWindow"/> - <combo_box.item label="320x240" name="320x240"/> - <combo_box.item label="640x480" name="640x480"/> - <combo_box.item label="800x600" name="800x600"/> - <combo_box.item label="1024x768" name="1024x768"/> - <combo_box.item label="1280x1024" name="1280x1024"/> - <combo_box.item label="1600x1200" name="1600x1200"/> - <combo_box.item label="Manuelt" name="Custom"/> - </combo_box> - <combo_box label="Fil-format" name="local_format_combo" width="76"> - <combo_box.item label="PNG" name="PNG"/> - <combo_box.item label="JPEG" name="JPEG"/> - <combo_box.item label="BMP" name="BMP"/> - </combo_box> - <spinner label="Bredde" label_width="41" name="snapshot_width" width="101"/> - <spinner label="Højde" label_width="32" left="117" name="snapshot_height" width="92"/> - <check_box label="Fasthold proportioner" name="keep_aspect_check"/> - <slider label="Billed-kvalitet" name="image_quality_slider"/> - <text name="layer_type_label"> - Benyt: - </text> - <combo_box label="Billedlag" name="layer_types"> - <combo_box.item label="Farver" name="Colors"/> - <combo_box.item label="Dybde" name="Depth"/> - <combo_box.item label="Materinger" name="ObjectMattes"/> - </combo_box> - <check_box label="Vis brugerflade pÃ¥ foto" name="ui_check"/> - <check_box label="Vis HUD objekter pÃ¥ foto" name="hud_check"/> - <check_box label="Luk ikke vindue ved gemning" name="keep_open_check"/> - <check_box label="Frys billede og vis" name="freeze_frame_check"/> - <check_box label="Auto-opdater" name="auto_snapshot_check"/> - <string name="unknown"> +<floater name="Snapshot" title="Foto"> + <floater.string name="unknown"> ukendt - </string> + </floater.string> + <button label="Tag nyt foto" name="new_snapshot_btn"/> + <line_editor label="Beskrivelse" name="description"/> + <button label="Del foto" name="share"/> + <button label="Del pÃ¥ internettet" name="share_to_web"/> + <button label="Gem til beholdning" name="save_to_inventory"/> + <button label="Gem foto" name="save"/> + <button label="Email foto" name="share_to_email"/> + <button label="Gem pÃ¥ computer" name="save_to_computer"/> + <button label="Sæt som profil billede" name="set_profile_pic"/> + <button label="Tilbage" name="cancel"/> </floater> diff --git a/indra/newview/skins/default/xui/da/floater_sys_well.xml b/indra/newview/skins/default/xui/da/floater_sys_well.xml index b5cecf93e9..f203c2504f 100644 --- a/indra/newview/skins/default/xui/da/floater_sys_well.xml +++ b/indra/newview/skins/default/xui/da/floater_sys_well.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="sys_well_window" title="BESKEDER"> <string name="title_im_well_window"> - IM SESSIONER + SAMTALER </string> <string name="title_notification_well_window"> BESKEDER diff --git a/indra/newview/skins/default/xui/da/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/da/floater_texture_ctrl.xml index 00b49a9df9..fbc7fe2319 100644 --- a/indra/newview/skins/default/xui/da/floater_texture_ctrl.xml +++ b/indra/newview/skins/default/xui/da/floater_texture_ctrl.xml @@ -17,7 +17,7 @@ <check_box label="Benyt ny" name="apply_immediate_check"/> <button label="" label_selected="" name="Pipette"/> <button label="Annullér" label_selected="Annullér" name="Cancel"/> - <button label="Ok" label_selected="Ok" name="Select"/> + <button label="OK" label_selected="OK" name="Select"/> <string name="pick title"> Vælg: </string> diff --git a/indra/newview/skins/default/xui/da/floater_tools.xml b/indra/newview/skins/default/xui/da/floater_tools.xml index 77459aca67..a84af9adc0 100644 --- a/indra/newview/skins/default/xui/da/floater_tools.xml +++ b/indra/newview/skins/default/xui/da/floater_tools.xml @@ -63,11 +63,14 @@ <radio_item label="Stræk (Ctrl+Shift)" name="radio stretch"/> <radio_item label="Vælg overflade" name="radio select face"/> </radio_group> - <check_box label="Redigér sammenlænkede dele" name="checkbox edit linked parts"/> + <check_box label="Redigér lænkede" name="checkbox edit linked parts"/> <text name="RenderingCost" tool_tip="Hvis beregnede rendering omkostninger for dette objekt"> þ: [COUNT] </text> - <check_box label="Stræk begge sider" name="checkbox uniform"/> + <check_box label="" name="checkbox uniform"/> + <text label="Stræk begge sider" name="checkbox uniform label"> + Stræk begge sider + </text> <check_box initial_value="true" label="Stræk teksturer" name="checkbox stretch textures"/> <check_box initial_value="true" label="Benyt gitter" name="checkbox snap to grid"/> <combo_box name="combobox grid mode" tool_tip="Vælg hvilken type lineal der skal bruges til positionering af objekt"> @@ -184,12 +187,12 @@ Klik for at: </text> <combo_box name="clickaction"> - <combo_box.item label="Rør (Standard)" name="Touch/grab(default)"/> - <combo_box.item label="Sid pÃ¥ objekt" name="Sitonobject"/> - <combo_box.item label="Køb objekt" name="Buyobject"/> - <combo_box.item label="Betal objekt" name="Payobject"/> - <combo_box.item label="Ã…ben" name="Open"/> - <combo_box.item label="Zoom" name="Zoom"/> + <combo_box.item label="Røre (Standard)" name="Touch/grab(default)"/> + <combo_box.item label="Sidde pÃ¥ objekt" name="Sitonobject"/> + <combo_box.item label="Købe objekt" name="Buyobject"/> + <combo_box.item label="Betale objekt" name="Payobject"/> + <combo_box.item label="Ã…bne" name="Open"/> + <combo_box.item label="Zoome" name="Zoom"/> </combo_box> <check_box label="Til salg:" name="checkbox for sale"/> <combo_box name="sale type"> @@ -206,14 +209,14 @@ <text name="Anyone can:"> Enhver: </text> - <check_box label="Flyt" name="checkbox allow everyone move"/> - <check_box label="Kopi" name="checkbox allow everyone copy"/> + <check_box label="Flytte" name="checkbox allow everyone move"/> + <check_box label="Kopiere" name="checkbox allow everyone copy"/> <text name="Next owner can:"> Næste ejer: </text> <check_box label="Redigére" name="checkbox next owner can modify"/> - <check_box label="Kopiére" left_delta="80" name="checkbox next owner can copy"/> - <check_box label="Sælge/give væk" left_delta="67" name="checkbox next owner can transfer" tool_tip="Næste ejer kan give væk eller sælge dette objekt"/> + <check_box label="Kopiére" name="checkbox next owner can copy"/> + <check_box label="Sælge/give væk" name="checkbox next owner can transfer" tool_tip="Næste ejer kan give væk eller sælge dette objekt"/> <text name="B:"> B: </text> @@ -417,21 +420,21 @@ <combo_box.item label="Ingen" name="None"/> <combo_box.item label="Lysintensitet" name="Brightness"/> <combo_box.item label="Mørke" name="Darkness"/> - <combo_box.item label="træårer" name="woodgrain"/> - <combo_box.item label="bark" name="bark"/> - <combo_box.item label="mursten" name="bricks"/> - <combo_box.item label="tern" name="checker"/> - <combo_box.item label="beton" name="concrete"/> - <combo_box.item label="rustik flise" name="crustytile"/> + <combo_box.item label="Træårer" name="woodgrain"/> + <combo_box.item label="Bark" name="bark"/> + <combo_box.item label="Mursten" name="bricks"/> + <combo_box.item label="Tern" name="checker"/> + <combo_box.item label="Beton" name="concrete"/> + <combo_box.item label="Rustik flise" name="crustytile"/> <combo_box.item label="SkÃ¥ret sten" name="cutstone"/> - <combo_box.item label="plader" name="discs"/> - <combo_box.item label="grus" name="gravel"/> - <combo_box.item label="petriskÃ¥l" name="petridish"/> - <combo_box.item label="udvendig beklædning" name="siding"/> - <combo_box.item label="stenflise" name="stonetile"/> - <combo_box.item label="puds" name="stucco"/> - <combo_box.item label="rør" name="suction"/> - <combo_box.item label="væv" name="weave"/> + <combo_box.item label="Plader" name="discs"/> + <combo_box.item label="Grus" name="gravel"/> + <combo_box.item label="PetriskÃ¥l" name="petridish"/> + <combo_box.item label="Udvendig beklædning" name="siding"/> + <combo_box.item label="Stenflise" name="stonetile"/> + <combo_box.item label="Puds" name="stucco"/> + <combo_box.item label="Rør" name="suction"/> + <combo_box.item label="Væv" name="weave"/> </combo_box> <text name="tex scale"> Gentagelser pÃ¥ overflade @@ -440,8 +443,6 @@ <check_box label="Vend" name="checkbox flip s"/> <spinner label="Lodret (V)" name="TexScaleV"/> <check_box label="Vend" name="checkbox flip t"/> - <spinner label="RotationËš" left="125" name="TexRot" width="55"/> - <spinner label="Gentagelser pr. meter" left="125" name="rptctrl" width="55"/> <button label="Gem" label_selected="Gem" left_delta="62" name="button apply"/> <text name="tex offset"> Tekstur offset @@ -474,21 +475,14 @@ Areal: [AREA] m² </text> <button label="Om land" label_selected="Om land" name="button about land"/> - <check_box label="Vis ejere" name="checkbox show owners" tool_tip="Farver grunde afhængigt af ejerskab: - -Grøn = Dit land -Turkis = Din gruppes land -Rød = Ejet af andre -Gul = Til salg -Lilla = PÃ¥ auktion -GrÃ¥ = Offentligt ejet"/> + <check_box label="Vis ejere" name="checkbox show owners" tool_tip="Farver grunde afhængigt af ejerskab: Grøn = Dit land Turkis = Din gruppes land Rød = Ejet af andre Gul = Til salg Lilla = PÃ¥ auktion GrÃ¥ = Offentligt ejet"/> <text name="label_parcel_modify"> Redigere grund </text> <button label="Opdel" label_selected="Opdel" name="button subdivide land"/> <button label="Saml" label_selected="Saml" name="button join land"/> <text name="label_parcel_trans"> - Transaktioner for land + Transaktioner - land </text> <button label="Køb land" label_selected="Køb land" name="button buy land"/> <button label="Efterlad land" label_selected="Efterlad land" name="button abandon land"/> diff --git a/indra/newview/skins/default/xui/da/floater_top_objects.xml b/indra/newview/skins/default/xui/da/floater_top_objects.xml index 3f19350e30..86c24d2c19 100644 --- a/indra/newview/skins/default/xui/da/floater_top_objects.xml +++ b/indra/newview/skins/default/xui/da/floater_top_objects.xml @@ -1,15 +1,40 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="top_objects" title="Top objekter"> + <floater.string name="top_scripts_title"> + Mest krævende scripts + </floater.string> + <floater.string name="top_scripts_text"> + [COUNT] scripts bruger ialt [TIME] ms + </floater.string> + <floater.string name="scripts_score_label"> + Tid + </floater.string> + <floater.string name="scripts_mono_time_label"> + Mono tid + </floater.string> + <floater.string name="top_colliders_title"> + Mest kolliderende + </floater.string> + <floater.string name="top_colliders_text"> + Top [COUNT] genstande der potentielt har mange kollisioner + </floater.string> + <floater.string name="colliders_score_label"> + Point + </floater.string> + <floater.string name="none_descriptor"> + Ingen fundet + </floater.string> <text name="title_text"> Henter... </text> <scroll_list name="objects_list"> - <column label="Point" name="score"/> - <column label="Navn" name="name"/> - <column label="Ejer" name="owner"/> - <column label="Lokation" name="location"/> - <column label="Tid" name="time"/> - <column label="Mono tid" name="mono_time"/> + <scroll_list.columns label="Point" name="score"/> + <scroll_list.columns label="Navn" name="name"/> + <scroll_list.columns label="Ejer" name="owner"/> + <scroll_list.columns label="Lokation" name="location"/> + <scroll_list.columns label="Tid" name="time"/> + <scroll_list.columns label="Mono tid" name="mono_time"/> + <scroll_list.columns label="URL'er" name="URLs"/> </scroll_list> <text name="id_text"> Objekt ID: @@ -23,33 +48,9 @@ Ejer: </text> <button label="Filter" name="filter_owner_btn"/> + <button label="Genopfrisk" name="refresh_btn"/> <button label="Returnér valgte" name="return_selected_btn"/> <button label="Returnér alle" name="return_all_btn"/> <button label="Afbryd valgte" name="disable_selected_btn"/> <button label="Afbryd alle" name="disable_all_btn"/> - <button label="Genopfrisk" name="refresh_btn"/> - <string name="top_scripts_title"> - Mest krævende scripts - </string> - <string name="top_scripts_text"> - [COUNT] scripts bruger ialt [TIME] ms - </string> - <string name="scripts_score_label"> - Tid - </string> - <string name="scripts_mono_time_label"> - Mono tid - </string> - <string name="top_colliders_title"> - Mest kolliderende - </string> - <string name="top_colliders_text"> - Top [COUNT] genstande der potentielt har mange kollisioner - </string> - <string name="colliders_score_label"> - Point - </string> - <string name="none_descriptor"> - Ingen fundet - </string> </floater> diff --git a/indra/newview/skins/default/xui/da/floater_tos.xml b/indra/newview/skins/default/xui/da/floater_tos.xml index 77906f0f46..760f60c996 100644 --- a/indra/newview/skins/default/xui/da/floater_tos.xml +++ b/indra/newview/skins/default/xui/da/floater_tos.xml @@ -1,15 +1,15 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="modal container" title=""> + <floater.string name="real_url"> + http://secondlife.com/app/tos/ + </floater.string> + <floater.string name="loading_url"> + data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Loading %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E + </floater.string> <button label="Fortsæt" label_selected="Fortsæt" name="Continue"/> <button label="Annullér" label_selected="Annullér" name="Cancel"/> - <check_box label="Jeg accepterer vilkÃ¥rene for brug af tjenesten" name="agree_chk"/> + <check_box label="Jeg er enig med "Terms of Service and Privacy Policy"" name="agree_chk"/> <text name="tos_heading"> - Læs venligst de almindelige bestemmelser og vilkÃ¥r igennem, for at fortsætte til [SECOND LIFE] skal du acceptere vilkÃ¥rene. + Læs venligst følgende "Terms of Service and Privacy Policy" grundigt. For at fortsætte med at logge pÃ¥ [SECOND_LIFE], skal du acceptere aftale. </text> - <text_editor name="tos_text"> - TOS_TEXT - </text_editor> - <string name="real_url"> - http://secondlife.com/app/tos/ - </string> </floater> diff --git a/indra/newview/skins/default/xui/da/floater_voice_controls.xml b/indra/newview/skins/default/xui/da/floater_voice_controls.xml index 8651851233..05e9eb6cdd 100644 --- a/indra/newview/skins/default/xui/da/floater_voice_controls.xml +++ b/indra/newview/skins/default/xui/da/floater_voice_controls.xml @@ -13,13 +13,14 @@ Opkald med [NAME] </string> <string name="no_one_near"> - Ingen nær + Ingen i nærheden har aktiveret stemmer </string> - <panel name="control_panel"> - <layout_stack> - <layout_panel name="leave_btn_panel"> - <button label="Forlad opkald" name="leave_call_btn"/> - </layout_panel> - </layout_stack> - </panel> + <layout_stack name="my_call_stack"> + <layout_panel name="my_panel"> + <text name="user_text" value="Min avatar:"/> + </layout_panel> + <layout_panel name="leave_call_btn_panel"> + <button label="Forlad opkald" name="leave_call_btn"/> + </layout_panel> + </layout_stack> </floater> diff --git a/indra/newview/skins/default/xui/da/floater_water.xml b/indra/newview/skins/default/xui/da/floater_water.xml index 103feaa879..aedd1b442c 100644 --- a/indra/newview/skins/default/xui/da/floater_water.xml +++ b/indra/newview/skins/default/xui/da/floater_water.xml @@ -7,7 +7,7 @@ <button label="Gem" label_selected="Gem" name="WaterSavePreset"/> <button label="Slet" label_selected="Slet" name="WaterDeletePreset"/> <tab_container name="Water Tabs"> - <panel label="Opsætning" name="Settings"> + <panel label="INDSTILLINGER" name="Settings"> <text name="BHText"> VandtÃ¥ge farve </text> @@ -65,7 +65,7 @@ <button label="?" name="WaterBlurMultiplierHelp"/> <slider label="" name="WaterBlurMult"/> </panel> - <panel label="Billede" name="Waves"> + <panel label="BILLEDE" name="Waves"> <text name="BHText"> Retning for store bølger </text> diff --git a/indra/newview/skins/default/xui/da/floater_wearable_save_as.xml b/indra/newview/skins/default/xui/da/floater_wearable_save_as.xml index a70db6a6f1..17d5b9c205 100644 --- a/indra/newview/skins/default/xui/da/floater_wearable_save_as.xml +++ b/indra/newview/skins/default/xui/da/floater_wearable_save_as.xml @@ -1,9 +1,9 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="modal container" title=""> - <button label="Gem" label_selected="Gem" name="Save" /> - <button label="Annullér" label_selected="Annullér" name="Cancel" /> + <button label="Gem" label_selected="Gem" name="Save"/> + <button label="Annullér" label_selected="Annullér" name="Cancel"/> <text name="Save item as:"> - Gem ting som:: + Gem genstand i min beholdning som: </text> <line_editor name="name ed"> Ny [DESC] diff --git a/indra/newview/skins/default/xui/da/floater_whitelist_entry.xml b/indra/newview/skins/default/xui/da/floater_whitelist_entry.xml index d2f618579d..443e84b64a 100644 --- a/indra/newview/skins/default/xui/da/floater_whitelist_entry.xml +++ b/indra/newview/skins/default/xui/da/floater_whitelist_entry.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="whitelist_entry"> +<floater name="whitelist_entry" title="GODKENDTE SIDER"> <text name="media_label"> Indtast en URL eller et URL mønster for at tilføje til listen med godkendte domæner </text> diff --git a/indra/newview/skins/default/xui/da/floater_windlight_options.xml b/indra/newview/skins/default/xui/da/floater_windlight_options.xml index 4786609b53..65f3f67a70 100644 --- a/indra/newview/skins/default/xui/da/floater_windlight_options.xml +++ b/indra/newview/skins/default/xui/da/floater_windlight_options.xml @@ -1,18 +1,18 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="WindLight floater" title="AVANCERET OPSÆTNING FOR HIMMEL"> <text name="KeyFramePresetsText"> Faste indstillinger: </text> - <button label="Ny" label_selected="Ny" name="WLNewPreset" /> - <button label="Gem" label_selected="Gem" name="WLSavePreset" /> - <button label="Slet" label_selected="Slet" name="WLDeletePreset" /> - <button label="Dags cyklus" label_selected="Dags cyklus" name="WLDayCycleMenuButton" /> + <button label="Ny" label_selected="Ny" name="WLNewPreset"/> + <button label="Gem" label_selected="Gem" name="WLSavePreset"/> + <button label="Slet" label_selected="Slet" name="WLDeletePreset"/> + <button label="Dags cyklus" label_selected="Dags cyklus" name="WLDayCycleMenuButton"/> <tab_container name="WindLight Tabs"> - <panel label="Atmosfære" name="Atmosphere"> + <panel label="ATMOSFÆRE" name="Atmosphere"> <text name="BHText"> BlÃ¥ - horisont </text> - <button label="?" name="WLBlueHorizonHelp" /> + <button label="?" name="WLBlueHorizonHelp"/> <text name="BHText2"> R </text> @@ -25,19 +25,19 @@ <text name="BHText5"> I </text> - <slider label="" name="WLBlueHorizonR" /> - <slider label="" name="WLBlueHorizonG" /> - <slider label="" name="WLBlueHorizonB" /> - <slider label="" name="WLBlueHorizonI" /> + <slider label="" name="WLBlueHorizonR"/> + <slider label="" name="WLBlueHorizonG"/> + <slider label="" name="WLBlueHorizonB"/> + <slider label="" name="WLBlueHorizonI"/> <text name="BDensText"> Dis - horisont </text> - <button label="?" name="WLHazeHorizonHelp" /> - <slider label="" name="WLHazeHorizon" /> + <button label="?" name="WLHazeHorizonHelp"/> + <slider label="" name="WLHazeHorizon"/> <text name="BDensText2"> BlÃ¥ - tæthed </text> - <button label="?" name="WLBlueDensityHelp" /> + <button label="?" name="WLBlueDensityHelp"/> <text name="BHText6"> R </text> @@ -50,36 +50,36 @@ <text name="BHText9"> I </text> - <slider label="" name="WLBlueDensityR" /> - <slider label="" name="WLBlueDensityG" /> - <slider label="" name="WLBlueDensityB" /> - <slider label="" name="WLBlueDensityI" /> + <slider label="" name="WLBlueDensityR"/> + <slider label="" name="WLBlueDensityG"/> + <slider label="" name="WLBlueDensityB"/> + <slider label="" name="WLBlueDensityI"/> <text name="HDText"> Dis - intensitet </text> - <button label="?" name="WLHazeDensityHelp" /> - <slider label="" name="WLHazeDensity" /> + <button label="?" name="WLHazeDensityHelp"/> + <slider label="" name="WLHazeDensity"/> <text name="DensMultText"> Densitet faktor </text> - <button label="?" name="WLDensityMultHelp" /> - <slider label="" name="WLDensityMult" /> + <button label="?" name="WLDensityMultHelp"/> + <slider label="" name="WLDensityMult"/> <text name="WLDistanceMultText"> Distance faktor </text> - <button label="?" name="WLDistanceMultHelp" /> - <slider label="" name="WLDistanceMult" /> + <button label="?" name="WLDistanceMultHelp"/> + <slider label="" name="WLDistanceMult"/> <text name="MaxAltText"> Maximum højde </text> - <button label="?" name="WLMaxAltitudeHelp" /> - <slider label="" name="WLMaxAltitude" /> + <button label="?" name="WLMaxAltitudeHelp"/> + <slider label="" name="WLMaxAltitude"/> </panel> - <panel label="Lys" name="Lighting"> + <panel label="LYS" name="Lighting"> <text name="SLCText"> Sol/MÃ¥ne farve </text> - <button label="?" name="WLSunlightColorHelp" /> + <button label="?" name="WLSunlightColorHelp"/> <text name="BHText"> R </text> @@ -92,19 +92,19 @@ <text name="BHText4"> I </text> - <slider label="" name="WLSunlightR" /> - <slider label="" name="WLSunlightG" /> - <slider label="" name="WLSunlightB" /> - <slider label="" name="WLSunlightI" /> + <slider label="" name="WLSunlightR"/> + <slider label="" name="WLSunlightG"/> + <slider label="" name="WLSunlightB"/> + <slider label="" name="WLSunlightI"/> <text name="TODText"> Sol/MÃ¥ne position </text> - <button label="?" name="WLTimeOfDayHelp" /> - <slider label="" name="WLSunAngle" /> + <button label="?" name="WLTimeOfDayHelp"/> + <slider label="" name="WLSunAngle"/> <text name="WLAmbientText"> Omgivende </text> - <button label="?" name="WLAmbientHelp" /> + <button label="?" name="WLAmbientHelp"/> <text name="BHText5"> R </text> @@ -117,37 +117,37 @@ <text name="BHText8"> I </text> - <slider label="" name="WLAmbientR" /> - <slider label="" name="WLAmbientG" /> - <slider label="" name="WLAmbientB" /> - <slider label="" name="WLAmbientI" /> + <slider label="" name="WLAmbientR"/> + <slider label="" name="WLAmbientG"/> + <slider label="" name="WLAmbientB"/> + <slider label="" name="WLAmbientI"/> <text name="WLEastAngleText"> Øst vinkel </text> - <button label="?" name="WLEastAngleHelp" /> - <slider label="" name="WLEastAngle" /> + <button label="?" name="WLEastAngleHelp"/> + <slider label="" name="WLEastAngle"/> <text name="SunGlowText"> Sol glød </text> - <button label="?" name="WLSunGlowHelp" /> - <slider label="Fokus " name="WLGlowB" /> - <slider label="Størr. " name="WLGlowR" /> + <button label="?" name="WLSunGlowHelp"/> + <slider label="Fokus " name="WLGlowB"/> + <slider label="Størr. " name="WLGlowR"/> <text name="SceneGammaText"> Lysintensitet (gamma) </text> - <button label="?" name="WLSceneGammaHelp" /> - <slider label="" name="WLGamma" /> + <button label="?" name="WLSceneGammaHelp"/> + <slider label="" name="WLGamma"/> <text name="WLStarText"> Stjerne intensitet </text> - <button label="?" name="WLStarBrightnessHelp" /> - <slider label="" name="WLStarAlpha" /> + <button label="?" name="WLStarBrightnessHelp"/> + <slider label="" name="WLStarAlpha"/> </panel> - <panel label="Skyer" name="Clouds"> + <panel label="SKYER" name="Clouds"> <text name="WLCloudColorText"> Farve pÃ¥ skyer </text> - <button label="?" name="WLCloudColorHelp" /> + <button label="?" name="WLCloudColorHelp"/> <text name="BHText"> R </text> @@ -160,14 +160,14 @@ <text name="BHText4"> I </text> - <slider label="" name="WLCloudColorR" /> - <slider label="" name="WLCloudColorG" /> - <slider label="" name="WLCloudColorB" /> - <slider label="" name="WLCloudColorI" /> + <slider label="" name="WLCloudColorR"/> + <slider label="" name="WLCloudColorG"/> + <slider label="" name="WLCloudColorB"/> + <slider label="" name="WLCloudColorI"/> <text name="WLCloudColorText2"> Skyer XY/Tæthed </text> - <button label="?" name="WLCloudDensityHelp" /> + <button label="?" name="WLCloudDensityHelp"/> <text name="BHText5"> X </text> @@ -177,23 +177,23 @@ <text name="BHText7"> T </text> - <slider label="" name="WLCloudX" /> - <slider label="" name="WLCloudY" /> - <slider label="" name="WLCloudDensity" /> + <slider label="" name="WLCloudX"/> + <slider label="" name="WLCloudY"/> + <slider label="" name="WLCloudDensity"/> <text name="WLCloudCoverageText"> Skydække </text> - <button label="?" name="WLCloudCoverageHelp" /> - <slider label="" name="WLCloudCoverage" /> + <button label="?" name="WLCloudCoverageHelp"/> + <slider label="" name="WLCloudCoverage"/> <text name="WLCloudScaleText"> Skystørrelse </text> - <button label="?" name="WLCloudScaleHelp" /> - <slider label="" name="WLCloudScale" /> + <button label="?" name="WLCloudScaleHelp"/> + <slider label="" name="WLCloudScale"/> <text name="WLCloudDetailText"> Sky detaljer(XY/tæthed) </text> - <button label="?" name="WLCloudDetailHelp" /> + <button label="?" name="WLCloudDetailHelp"/> <text name="BHText8"> X </text> @@ -203,23 +203,23 @@ <text name="BHText10"> T </text> - <slider label="" name="WLCloudDetailX" /> - <slider label="" name="WLCloudDetailY" /> - <slider label="" name="WLCloudDetailDensity" /> + <slider label="" name="WLCloudDetailX"/> + <slider label="" name="WLCloudDetailY"/> + <slider label="" name="WLCloudDetailDensity"/> <text name="WLCloudScrollXText"> Sky drift X </text> - <button label="?" name="WLCloudScrollXHelp" /> - <check_box label="LÃ¥s" name="WLCloudLockX" /> - <slider label="" name="WLCloudScrollX" /> + <button label="?" name="WLCloudScrollXHelp"/> + <check_box label="LÃ¥s" name="WLCloudLockX"/> + <slider label="" name="WLCloudScrollX"/> <text name="WLCloudScrollYText"> Sky drift Y </text> - <button label="?" name="WLCloudScrollYHelp" /> - <check_box label="LÃ¥s" name="WLCloudLockY" /> - <slider label="" name="WLCloudScrollY" /> - <check_box label="Benyt simple skyer" name="DrawClassicClouds" /> - <button label="?" name="WLClassicCloudsHelp" /> + <button label="?" name="WLCloudScrollYHelp"/> + <check_box label="LÃ¥s" name="WLCloudLockY"/> + <slider label="" name="WLCloudScrollY"/> + <check_box label="Benyt simple skyer" name="DrawClassicClouds"/> + <button label="?" name="WLClassicCloudsHelp"/> </panel> </tab_container> <string name="WLDefaultSkyNames"> diff --git a/indra/newview/skins/default/xui/da/floater_window_size.xml b/indra/newview/skins/default/xui/da/floater_window_size.xml new file mode 100644 index 0000000000..db8ead21bd --- /dev/null +++ b/indra/newview/skins/default/xui/da/floater_window_size.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="window_size" title="VINDUE STØRRELSE"> + <string name="resolution_format"> + [RES_X] x [RES_Y] + </string> + <text name="windowsize_text"> + Sæt størrelse pÃ¥ vindue: + </text> + <combo_box name="window_size_combo" tool_tip="bredde x højde"> + <combo_box.item label="1000 x 700 (standard)" name="item0"/> + <combo_box.item label="1024 x 768" name="item1"/> + <combo_box.item label="1280 x 720 (720p)" name="item2"/> + <combo_box.item label="1920 x 1080 (1080p)" name="item3"/> + </combo_box> + <button label="Sæt" name="set_btn"/> + <button label="Annullér" name="cancel_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/da/floater_world_map.xml b/indra/newview/skins/default/xui/da/floater_world_map.xml index 137e8509a4..4dec9a9ba7 100644 --- a/indra/newview/skins/default/xui/da/floater_world_map.xml +++ b/indra/newview/skins/default/xui/da/floater_world_map.xml @@ -5,65 +5,66 @@ Forklaring </text> </panel> - <panel> - <button label="Vis min position" label_selected="Vis min position" name="Show My Location" tool_tip="Centrér kort om min avatars position"/> - <text name="person_label"> + <panel name="layout_panel_2"> + <button name="Show My Location" tool_tip="Centrer kortet pÃ¥ din avatars lokation"/> + <text name="me_label"> Mig </text> - <check_box label="Beboer" name="people_chk"/> - <check_box label="Infohub" name="infohub_chk"/> + <text name="person_label"> + Person + </text> <text name="infohub_label"> Infohub </text> - <check_box label="Land til salg" name="land_for_sale_chk"/> <text name="land_sale_label"> Land til salg </text> + <text name="by_owner_label"> + efter ejer + </text> <text name="auction_label"> - af ejer + land auktion </text> - <button label="Tag hjem" label_selected="Tag hjem" name="Go Home" tool_tip="Teleportér til min hjemmelokation"/> + <button name="Go Home" tool_tip="Teleportér til min hjemmelokation"/> <text name="Home_label"> Hjem </text> <text name="events_label"> Events: </text> - <check_box label="PG" name="event_chk"/> - <check_box initial_value="true" label="Mature" name="event_mature_chk"/> + <text name="pg_label"> + Generelt + </text> + <check_box name="event_mature_chk"/> <text name="mature_label"> - Mature + Moderat + </text> + <text name="adult_label"> + Voksent </text> - <check_box label="Adult" name="event_adult_chk"/> </panel> - <panel> + <panel name="layout_panel_3"> <text name="find_on_map_label"> Find pÃ¥ kort </text> </panel> - <panel> - <combo_box label="Venner online" name="friend combo" tool_tip="Vis venner pÃ¥ kort"> - <combo_box.item label="Mine venner online" name="item1"/> + <panel name="layout_panel_4"> + <combo_box label="Venner online" name="friend combo" tool_tip="Vis venner pÃ¥ kortet"> + <combo_box.item label="Mine venner som er online" name="item1"/> </combo_box> <combo_box label="Mine landemærker" name="landmark combo" tool_tip="Landemærke der skal vises pÃ¥ kort"> <combo_box.item label="Mine landemærker" name="item1"/> </combo_box> - <search_editor label="Regioner efter navn" name="location" tool_tip="Skriv navnet pÃ¥ en region"/> - <button label="Find" name="DoSearch" tool_tip="Søg efter en region"/> - <scroll_list name="search_results"> - <scroll_list.columns label="" name="icon"/> - <scroll_list.columns label="" name="sim_name"/> - </scroll_list> - <button label="Teleport" label_selected="Teleport" name="Teleport" tool_tip="Teleportér til den valgte lokation"/> - <button label="Kopiér SLurl" name="copy_slurl" tool_tip="Kopierer denne lokation som SLurl der kan bruges pÃ¥ web."/> - <button label="Vis selektion" label_selected="Vis destination" name="Show Destination" tool_tip="Centrér kortet pÃ¥ valgte lokation"/> + <search_editor label="Regioner efter navn" name="location" tool_tip="Indtast navn pÃ¥ en region"/> + <button label="Find" name="DoSearch" tool_tip="Led efter region"/> + <button name="Clear" tool_tip="Fjern søgelinier og nulstil kort"/> + <button label="Teleport" name="Teleport" tool_tip="Teleportér til valgte sted"/> + <button label="Kopiér SLurl" name="copy_slurl" tool_tip="Kopierer nuværende lokation som SLurl der kan sendes pÃ¥ web."/> + <button label="Vis valgte" name="Show Destination" tool_tip="Centrér kortet pÃ¥ valgte lokation"/> </panel> - <panel> + <panel name="layout_panel_5"> <text name="zoom_label"> Zoom </text> </panel> - <panel> - <slider label="Zoom" name="zoom slider"/> - </panel> </floater> diff --git a/indra/newview/skins/default/xui/da/inspect_avatar.xml b/indra/newview/skins/default/xui/da/inspect_avatar.xml index 1b85544303..d4bc0813e5 100644 --- a/indra/newview/skins/default/xui/da/inspect_avatar.xml +++ b/indra/newview/skins/default/xui/da/inspect_avatar.xml @@ -13,7 +13,7 @@ <slider name="volume_slider" tool_tip="Stemme lydstyrke" value="0.5"/> <button label="Tilføj ven" name="add_friend_btn"/> <button label="IM" name="im_btn"/> - <button label="Mere" name="view_profile_btn"/> + <button label="Profil" name="view_profile_btn"/> <panel name="moderator_panel"> <button label="SlÃ¥ stemme-chat fra" name="disable_voice"/> <button label="SlÃ¥ stemme-chat til" name="enable_voice"/> diff --git a/indra/newview/skins/default/xui/da/language_settings.xml b/indra/newview/skins/default/xui/da/language_settings.xml index 71418d446a..fa8a788605 100644 --- a/indra/newview/skins/default/xui/da/language_settings.xml +++ b/indra/newview/skins/default/xui/da/language_settings.xml @@ -3,9 +3,9 @@ <strings> <!-- Locale Information --> - <string name="MicrosoftLocale">english</string> - <string name="DarwinLocale">C</string> - <string name="LinuxLocale">C</string> + <string name="MicrosoftLocale">danish</string> + <string name="DarwinLocale">da_DK.UTF-8</string> + <string name="LinuxLocale">da_DK.UTF-8</string> <!-- datetimeToCodes["wkday"] = "%a"; // Thu diff --git a/indra/newview/skins/default/xui/da/menu_attachment_other.xml b/indra/newview/skins/default/xui/da/menu_attachment_other.xml index 2cc23e27c7..ca7b184942 100644 --- a/indra/newview/skins/default/xui/da/menu_attachment_other.xml +++ b/indra/newview/skins/default/xui/da/menu_attachment_other.xml @@ -10,7 +10,7 @@ <menu_item_call label="Rapportér" name="abuse"/> <menu_item_call label="Frys" name="Freeze..."/> <menu_item_call label="Smid ud" name="Eject..."/> - <menu_item_call label="Debug" name="Debug..."/> + <menu_item_call label="Debug teksturer" name="Debug..."/> <menu_item_call label="Zoom ind" name="Zoom In"/> <menu_item_call label="Betal" name="Pay..."/> <menu_item_call label="Objekt profil" name="Object Inspect"/> diff --git a/indra/newview/skins/default/xui/da/menu_attachment_self.xml b/indra/newview/skins/default/xui/da/menu_attachment_self.xml index 306ae96d49..bf52e5d57f 100644 --- a/indra/newview/skins/default/xui/da/menu_attachment_self.xml +++ b/indra/newview/skins/default/xui/da/menu_attachment_self.xml @@ -5,8 +5,9 @@ <menu_item_call label="Tag af" name="Detach"/> <menu_item_call label="Smid" name="Drop"/> <menu_item_call label="StÃ¥ op" name="Stand Up"/> - <menu_item_call label="Udseende" name="Appearance..."/> + <menu_item_call label="Skift sæt" name="Change Outfit"/> <menu_item_call label="Venner" name="Friends..."/> <menu_item_call label="Grupper" name="Groups..."/> <menu_item_call label="Profil" name="Profile..."/> + <menu_item_call label="Debug teksturer" name="Debug..."/> </context_menu> diff --git a/indra/newview/skins/default/xui/da/menu_avatar_other.xml b/indra/newview/skins/default/xui/da/menu_avatar_other.xml index 66d357e7e2..a778dedf0b 100644 --- a/indra/newview/skins/default/xui/da/menu_avatar_other.xml +++ b/indra/newview/skins/default/xui/da/menu_avatar_other.xml @@ -10,7 +10,7 @@ <menu_item_call label="Rapportér" name="abuse"/> <menu_item_call label="Frys" name="Freeze..."/> <menu_item_call label="Smid ud" name="Eject..."/> - <menu_item_call label="Debug" name="Debug..."/> + <menu_item_call label="Debug Teksturer" name="Debug..."/> <menu_item_call label="Zoom ind" name="Zoom In"/> <menu_item_call label="Betal" name="Pay..."/> </context_menu> diff --git a/indra/newview/skins/default/xui/da/menu_avatar_self.xml b/indra/newview/skins/default/xui/da/menu_avatar_self.xml index 29620fca27..ec85bd05a5 100644 --- a/indra/newview/skins/default/xui/da/menu_avatar_self.xml +++ b/indra/newview/skins/default/xui/da/menu_avatar_self.xml @@ -1,8 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Self Pie"> <menu_item_call label="StÃ¥ op" name="Stand Up"/> - <context_menu label="Tag af >" name="Take Off >"> - <context_menu label="Tøj >" name="Clothes >"> + <context_menu label="Tag af â–¶" name="Take Off >"> + <context_menu label="Tøj â–¶" name="Clothes >"> <menu_item_call label="Trøje" name="Shirt"/> <menu_item_call label="Bukser" name="Pants"/> <menu_item_call label="Nederdel" name="Skirt"/> @@ -16,12 +16,15 @@ <menu_item_call label="Alpha" name="Self Alpha"/> <menu_item_call label="Alt tøj" name="All Clothes"/> </context_menu> - <context_menu label="HUD >" name="Object Detach HUD"/> - <context_menu label="Tag af >" name="Object Detach"/> + <context_menu label="HUD â–¶" name="Object Detach HUD"/> + <context_menu label="Tag af â–¶" name="Object Detach"/> <menu_item_call label="Tag alt af" name="Detach All"/> </context_menu> - <menu_item_call label="Udseende" name="Appearance..."/> + <menu_item_call label="Skift sæt" name="Chenge Outfit"/> + <menu_item_call label="Redigér mit sæt" name="Edit Outfit"/> + <menu_item_call label="Redigér min form" name="Edit My Shape"/> <menu_item_call label="Venner" name="Friends..."/> <menu_item_call label="Grupper" name="Groups..."/> <menu_item_call label="Profil" name="Profile..."/> + <menu_item_call label="Debug teksturer" name="Debug..."/> </context_menu> diff --git a/indra/newview/skins/default/xui/da/menu_bottomtray.xml b/indra/newview/skins/default/xui/da/menu_bottomtray.xml index dbdeefeaff..e979e35a91 100644 --- a/indra/newview/skins/default/xui/da/menu_bottomtray.xml +++ b/indra/newview/skins/default/xui/da/menu_bottomtray.xml @@ -4,6 +4,11 @@ <menu_item_check label="Bevægelse knap" name="ShowMoveButton"/> <menu_item_check label="Vis knap" name="ShowCameraButton"/> <menu_item_check label="Foto knap" name="ShowSnapshotButton"/> + <menu_item_check label="Sidepanel knap" name="ShowSidebarButton"/> + <menu_item_check label="Bygge knap" name="ShowBuildButton"/> + <menu_item_check label="Søge knap" name="ShowSearchButton"/> + <menu_item_check label="Kort knap" name="ShowWorldMapButton"/> + <menu_item_check label="Mini-Map button" name="ShowMiniMapButton"/> <menu_item_call label="Klip" name="NearbyChatBar_Cut"/> <menu_item_call label="Kopiér" name="NearbyChatBar_Copy"/> <menu_item_call label="Sæt ind" name="NearbyChatBar_Paste"/> diff --git a/indra/newview/skins/default/xui/da/menu_edit.xml b/indra/newview/skins/default/xui/da/menu_edit.xml new file mode 100644 index 0000000000..3752f42b1c --- /dev/null +++ b/indra/newview/skins/default/xui/da/menu_edit.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu label="Redigér" name="Edit"> + <menu_item_call label="Fortryd" name="Undo"/> + <menu_item_call label="Gendan" name="Redo"/> + <menu_item_call label="Klip" name="Cut"/> + <menu_item_call label="Kopiér" name="Copy"/> + <menu_item_call label="Sæt ind" name="Paste"/> + <menu_item_call label="Slet" name="Delete"/> + <menu_item_call label="Duplikér" name="Duplicate"/> + <menu_item_call label="Marker alt" name="Select All"/> + <menu_item_call label="Fjern markering" name="Deselect"/> +</menu> diff --git a/indra/newview/skins/default/xui/da/menu_im_well_button.xml b/indra/newview/skins/default/xui/da/menu_im_well_button.xml new file mode 100644 index 0000000000..4889230919 --- /dev/null +++ b/indra/newview/skins/default/xui/da/menu_im_well_button.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="IM Well Button Context Menu"> + <menu_item_call label="Luk alle" name="Close All"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/da/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/da/menu_inspect_avatar_gear.xml index 5b8089bfe0..89111d49f1 100644 --- a/indra/newview/skins/default/xui/da/menu_inspect_avatar_gear.xml +++ b/indra/newview/skins/default/xui/da/menu_inspect_avatar_gear.xml @@ -7,11 +7,13 @@ <menu_item_call label="Teleportér" name="teleport"/> <menu_item_call label="Invitér til gruppe" name="invite_to_group"/> <menu_item_call label="Blokér" name="block"/> + <menu_item_call label="Fjern blokering" name="unblock"/> <menu_item_call label="Rapportér" name="report"/> <menu_item_call label="Frys" name="freeze"/> <menu_item_call label="Smid ud" name="eject"/> - <menu_item_call label="Debug" name="debug"/> + <menu_item_call label="Debug teksturer" name="debug"/> <menu_item_call label="Find pÃ¥ kort" name="find_on_map"/> <menu_item_call label="Zoom ind" name="zoom_in"/> <menu_item_call label="Betal" name="pay"/> + <menu_item_call label="Del" name="share"/> </menu> diff --git a/indra/newview/skins/default/xui/da/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/da/menu_inspect_self_gear.xml index cfe455e21d..c226d06404 100644 --- a/indra/newview/skins/default/xui/da/menu_inspect_self_gear.xml +++ b/indra/newview/skins/default/xui/da/menu_inspect_self_gear.xml @@ -1,8 +1,9 @@ <?xml version="1.0" encoding="utf-8"?> <menu name="Gear Menu"> <menu_item_call label="StÃ¥ op" name="stand_up"/> - <menu_item_call label="Udseende" name="my_appearance"/> + <menu_item_call label="Skift sæt" name="change_outfit"/> <menu_item_call label="Profil" name="my_profile"/> <menu_item_call label="Venner" name="my_friends"/> <menu_item_call label="Grupper" name="my_groups"/> + <menu_item_call label="Debug teksturer" name="Debug..."/> </menu> diff --git a/indra/newview/skins/default/xui/da/menu_inv_offer_chiclet.xml b/indra/newview/skins/default/xui/da/menu_inv_offer_chiclet.xml new file mode 100644 index 0000000000..c3b03232bf --- /dev/null +++ b/indra/newview/skins/default/xui/da/menu_inv_offer_chiclet.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="InvOfferChiclet Menu"> + <menu_item_call label="Luk" name="Close"/> +</menu> diff --git a/indra/newview/skins/default/xui/da/menu_inventory.xml b/indra/newview/skins/default/xui/da/menu_inventory.xml index 376af507d0..ff70ec7886 100644 --- a/indra/newview/skins/default/xui/da/menu_inventory.xml +++ b/indra/newview/skins/default/xui/da/menu_inventory.xml @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="Popup"> + <menu_item_call label="Del" name="Share"/> <menu_item_call label="Køb" name="Task Buy"/> <menu_item_call label="Ã¥ben" name="Task Open"/> <menu_item_call label="Afspil" name="Task Play"/> @@ -46,10 +47,12 @@ <menu_item_call label="Teleport" name="Landmark Open"/> <menu_item_call label="Ã¥ben" name="Animation Open"/> <menu_item_call label="Ã¥ben" name="Sound Open"/> + <menu_item_call label="Erstat pÃ¥klædning" name="Replace Outfit"/> + <menu_item_call label="Tilføj til pÃ¥klædning" name="Add To Outfit"/> <menu_item_call label="Slet ting" name="Purge Item"/> <menu_item_call label="Genskab ting" name="Restore Item"/> - <menu_item_call label="GÃ¥ til link" name="Goto Link"/> <menu_item_call label="Ã¥ben" name="Open"/> + <menu_item_call label="Ã…ben original" name="Open Original"/> <menu_item_call label="Egenskaber" name="Properties"/> <menu_item_call label="Omdøb" name="Rename"/> <menu_item_call label="Kopiér asset UUID" name="Copy Asset UUID"/> @@ -57,13 +60,11 @@ <menu_item_call label="Indsæt" name="Paste"/> <menu_item_call label="Sæt ind som link" name="Paste As Link"/> <menu_item_call label="Slet" name="Delete"/> - <menu_item_call label="Tag ting af" name="Take Off Items"/> - <menu_item_call label="Tilføj til pÃ¥klædning" name="Add To Outfit"/> - <menu_item_call label="Erstat pÃ¥klædning" name="Replace Outfit"/> + <menu_item_call label="Slet systemfolder" name="Delete System Folder"/> <menu_item_call label="start konference chat" name="Conference Chat Folder"/> <menu_item_call label="Afspil" name="Sound Play"/> <menu_item_call label="Om landemærke" name="About Landmark"/> - <menu_item_call label="Afspil offentligt" name="Animation Play"/> + <menu_item_call label="Afspil i verden" name="Animation Play"/> <menu_item_call label="Afspil lokalt" name="Animation Audition"/> <menu_item_call label="Send privat besked (IM)" name="Send Instant Message"/> <menu_item_call label="Tilbyd teleport..." name="Offer Teleport..."/> diff --git a/indra/newview/skins/default/xui/da/menu_login.xml b/indra/newview/skins/default/xui/da/menu_login.xml index 0942f1b807..1231c4c08d 100644 --- a/indra/newview/skins/default/xui/da/menu_login.xml +++ b/indra/newview/skins/default/xui/da/menu_login.xml @@ -2,29 +2,22 @@ <menu_bar name="Login Menu"> <menu label="Mig" name="File"> <menu_item_call label="Indstillinger" name="Preferences..."/> - <menu_item_call label="Afslut" name="Quit"/> + <menu_item_call label="Afslut [APP_NAME]" name="Quit"/> </menu> <menu label="Hjælp" name="Help"> <menu_item_call label="[SECOND_LIFE] hjælp" name="Second Life Help"/> + <menu_item_call label="Om [APP_NAME]" name="About Second Life"/> </menu> + <menu_item_check label="Vis debug menu" name="Show Debug Menu"/> <menu label="Debug" name="Debug"> - <menu label="Redigér" name="Edit"> - <menu_item_call label="Fortryd" name="Undo"/> - <menu_item_call label="Gendan" name="Redo"/> - <menu_item_call label="Klip" name="Cut"/> - <menu_item_call label="Kopiér" name="Copy"/> - <menu_item_call label="Sæt ind" name="Paste"/> - <menu_item_call label="Slet" name="Delete"/> - <menu_item_call label="Duplikér" name="Duplicate"/> - <menu_item_call label="Vælg alle" name="Select All"/> - <menu_item_call label="Vælg intet" name="Deselect"/> - </menu> <menu_item_call label="Vis debug opsætning" name="Debug Settings"/> <menu_item_call label="UI/farve opsætning" name="UI/Color Settings"/> - <menu_item_call label="Vis sidebakke" name="Show Side Tray"/> <menu label="UI tests" name="UI Tests"/> + <menu_item_call label="Sæt vinduesstørrelse" name="Set Window Size..."/> <menu_item_call label="Vis betingelser" name="TOS"/> <menu_item_call label="Vis vigtig besked" name="Critical"/> <menu_item_call label="Test i web browser" name="Web Browser Test"/> + <menu_item_check label="Vis gitter vælger" name="Show Grid Picker"/> + <menu_item_call label="Vis notifikationskonsol" name="Show Notifications Console"/> </menu> </menu_bar> diff --git a/indra/newview/skins/default/xui/da/menu_mini_map.xml b/indra/newview/skins/default/xui/da/menu_mini_map.xml index 667638c529..38486cdecb 100644 --- a/indra/newview/skins/default/xui/da/menu_mini_map.xml +++ b/indra/newview/skins/default/xui/da/menu_mini_map.xml @@ -1,9 +1,9 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="popup"> +<menu name="Popup"> <menu_item_call label="Zoom tæt" name="Zoom Close"/> <menu_item_call label="Zoom mellem" name="Zoom Medium"/> <menu_item_call label="Zoom langt" name="Zoom Far"/> <menu_item_check label="Rotér kort" name="Rotate Map"/> - <menu_item_call label="Stop Tracking" name="Stop Tracking"/> + <menu_item_call label="Fjern ref." name="Stop Tracking"/> <menu_item_call label="Verdenskort" name="World Map"/> </menu> diff --git a/indra/newview/skins/default/xui/da/menu_notification_well_button.xml b/indra/newview/skins/default/xui/da/menu_notification_well_button.xml new file mode 100644 index 0000000000..40b35b5fdd --- /dev/null +++ b/indra/newview/skins/default/xui/da/menu_notification_well_button.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Notification Well Button Context Menu"> + <menu_item_call label="Luk alle" name="Close All"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/da/menu_object.xml b/indra/newview/skins/default/xui/da/menu_object.xml index 0714b67ec3..c98a07e140 100644 --- a/indra/newview/skins/default/xui/da/menu_object.xml +++ b/indra/newview/skins/default/xui/da/menu_object.xml @@ -5,19 +5,22 @@ <menu_item_call label="Byg" name="Build"/> <menu_item_call label="Ã…ben" name="Open"/> <menu_item_call label="Sid her" name="Object Sit"/> + <menu_item_call label="StÃ¥ op" name="Object Stand Up"/> <menu_item_call label="Objekt profil" name="Object Inspect"/> - <context_menu label="Sæt pÃ¥ >" name="Put On"> + <menu_item_call label="Zoom In" name="Zoom In"/> + <context_menu label="Tag pÃ¥ â–¶" name="Put On"> <menu_item_call label="Tag pÃ¥" name="Wear"/> - <context_menu label="Vedhæft >" name="Object Attach"/> - <context_menu label="Vedhæft HUD >" name="Object Attach HUD"/> + <context_menu label="Vedhæft â–¶" name="Object Attach"/> + <context_menu label="Vedhæft HUD â–¶" name="Object Attach HUD"/> </context_menu> - <context_menu label="Fjern >" name="Remove"> - <menu_item_call label="Tag" name="Pie Object Take"/> + <context_menu label="Fjern â–¶" name="Remove"> <menu_item_call label="Rapportér misbrug" name="Report Abuse..."/> <menu_item_call label="Blokér" name="Object Mute"/> <menu_item_call label="Returnér" name="Return..."/> <menu_item_call label="Slet" name="Delete"/> </context_menu> + <menu_item_call label="Køb" name="Pie Object Bye"/> + <menu_item_call label="Tag" name="Pie Object Take"/> <menu_item_call label="Tag kopi" name="Take Copy"/> <menu_item_call label="Betal" name="Pay..."/> <menu_item_call label="Køb" name="Buy..."/> diff --git a/indra/newview/skins/default/xui/da/menu_participant_list.xml b/indra/newview/skins/default/xui/da/menu_participant_list.xml index 44a016026c..2bd28e10de 100644 --- a/indra/newview/skins/default/xui/da/menu_participant_list.xml +++ b/indra/newview/skins/default/xui/da/menu_participant_list.xml @@ -1,16 +1,21 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Participant List Context Menu"> + <menu_item_check label="Sortér efter navn" name="SortByName"/> + <menu_item_check label="Sortér efter nylige talere" name="SortByRecentSpeakers"/> <menu_item_call label="Profil" name="View Profile"/> <menu_item_call label="Tilføj ven" name="Add Friend"/> <menu_item_call label="Send besked" name="IM"/> <menu_item_call label="Opkald" name="Call"/> <menu_item_call label="Del" name="Share"/> <menu_item_call label="Betal" name="Pay"/> - <menu_item_check label="Blokér/Fjern blokering" name="Block/Unblock"/> - <menu_item_check label="Sluk for tekst" name="MuteText"/> - <menu_item_check label="Tillad tekst chat" name="AllowTextChat"/> - <menu_item_call label="Sluk for denne deltager" name="ModerateVoiceMuteSelected"/> - <menu_item_call label="Sluk for alle andre" name="ModerateVoiceMuteOthers"/> - <menu_item_call label="Ã…ben for denne deltager" name="ModerateVoiceUnMuteSelected"/> - <menu_item_call label="Ã…ben for alle andre" name="ModerateVoiceUnMuteOthers"/> + <menu_item_check label="Se person ikoner" name="View Icons"/> + <menu_item_check label="Blokér stemme" name="Block/Unblock"/> + <menu_item_check label="Blokér tekst" name="MuteText"/> + <context_menu label="Moderator muligheder >" name="Moderator Options"> + <menu_item_check label="Tillad tekst chat" name="AllowTextChat"/> + <menu_item_call label="Sluk for denne deltager" name="ModerateVoiceMuteSelected"/> + <menu_item_call label="Fjern slukning for denne deltager" name="ModerateVoiceUnMuteSelected"/> + <menu_item_call label="Sluk lyd for alle" name="ModerateVoiceMute"/> + <menu_item_call label="Tænd lyd for alle" name="ModerateVoiceUnmute"/> + </context_menu> </context_menu> diff --git a/indra/newview/skins/default/xui/da/menu_people_groups.xml b/indra/newview/skins/default/xui/da/menu_people_groups.xml new file mode 100644 index 0000000000..841f58b619 --- /dev/null +++ b/indra/newview/skins/default/xui/da/menu_people_groups.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_group_plus"> + <menu_item_call label="Se info" name="View Info"/> + <menu_item_call label="Chat" name="Chat"/> + <menu_item_call label="Opkald" name="Call"/> + <menu_item_call label="Aktivér" name="Activate"/> + <menu_item_call label="Forlad" name="Leave"/> +</menu> diff --git a/indra/newview/skins/default/xui/da/menu_people_nearby.xml b/indra/newview/skins/default/xui/da/menu_people_nearby.xml index 224190149b..5470c32761 100644 --- a/indra/newview/skins/default/xui/da/menu_people_nearby.xml +++ b/indra/newview/skins/default/xui/da/menu_people_nearby.xml @@ -2,9 +2,12 @@ <context_menu name="Avatar Context Menu"> <menu_item_call label="Profil" name="View Profile"/> <menu_item_call label="Tilføj ven" name="Add Friend"/> + <menu_item_call label="Fjern ven" name="Remove Friend"/> <menu_item_call label="Besked" name="IM"/> <menu_item_call label="Opkald" name="Call"/> + <menu_item_call label="Kort" name="Map"/> <menu_item_call label="Del" name="Share"/> <menu_item_call label="Betal" name="Pay"/> <menu_item_check label="Blokér/Fjern blokering" name="Block/Unblock"/> + <menu_item_call label="Tilbyd teleport" name="teleport"/> </context_menu> diff --git a/indra/newview/skins/default/xui/da/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/da/menu_people_nearby_multiselect.xml index 92c6d2c960..08b7136b97 100644 --- a/indra/newview/skins/default/xui/da/menu_people_nearby_multiselect.xml +++ b/indra/newview/skins/default/xui/da/menu_people_nearby_multiselect.xml @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Multi-Selected People Context Menu"> <menu_item_call label="Tilføj venner" name="Add Friends"/> + <menu_item_call label="Fjern venner" name="Remove Friend"/> <menu_item_call label="Besked" name="IM"/> <menu_item_call label="Opkald" name="Call"/> <menu_item_call label="Del" name="Share"/> diff --git a/indra/newview/skins/default/xui/da/menu_profile_overflow.xml b/indra/newview/skins/default/xui/da/menu_profile_overflow.xml index 58fbc62643..6745007c99 100644 --- a/indra/newview/skins/default/xui/da/menu_profile_overflow.xml +++ b/indra/newview/skins/default/xui/da/menu_profile_overflow.xml @@ -1,5 +1,12 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <toggleable_menu name="profile_overflow_menu"> + <menu_item_call label="Kort" name="show_on_map"/> <menu_item_call label="Betal" name="pay"/> <menu_item_call label="Del" name="share"/> + <menu_item_call label="Blokér" name="block"/> + <menu_item_call label="Fjern blokering" name="unblock"/> + <menu_item_call label="Spark" name="kick"/> + <menu_item_call label="Frys" name="freeze"/> + <menu_item_call label="Fjern frys" name="unfreeze"/> + <menu_item_call label="Kundeservicemedarbejder (CSR)" name="csr"/> </toggleable_menu> diff --git a/indra/newview/skins/default/xui/da/menu_save_outfit.xml b/indra/newview/skins/default/xui/da/menu_save_outfit.xml new file mode 100644 index 0000000000..3d89715ea8 --- /dev/null +++ b/indra/newview/skins/default/xui/da/menu_save_outfit.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="save_outfit_menu"> + <menu_item_call label="Gem" name="save_outfit"/> + <menu_item_call label="Gem som ny" name="save_as_new_outfit"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/da/menu_script_chiclet.xml b/indra/newview/skins/default/xui/da/menu_script_chiclet.xml new file mode 100644 index 0000000000..cdd3212373 --- /dev/null +++ b/indra/newview/skins/default/xui/da/menu_script_chiclet.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="ScriptChiclet Menu"> + <menu_item_call label="Luk" name="Close"/> +</menu> diff --git a/indra/newview/skins/default/xui/da/menu_viewer.xml b/indra/newview/skins/default/xui/da/menu_viewer.xml index ec0631d54f..a061292eb0 100644 --- a/indra/newview/skins/default/xui/da/menu_viewer.xml +++ b/indra/newview/skins/default/xui/da/menu_viewer.xml @@ -5,10 +5,10 @@ <menu_item_call label="Mit instrumentpanel" name="Manage My Account"/> <menu_item_call label="Køb L$" name="Buy and Sell L$"/> <menu_item_call label="Profil" name="Profile"/> - <menu_item_call label="Udseende" name="Appearance"/> + <menu_item_call label="Skift sæt" name="ChangeOutfit"/> <menu_item_check label="Beholdning" name="Inventory"/> - <menu_item_call label="Vis beholdning i sidebakke" name="ShowSidetrayInventory"/> - <menu_item_call label="Mine bevægelser" name="Gestures"/> + <menu_item_check label="Min beholdning" name="ShowSidetrayInventory"/> + <menu_item_check label="Mine bevægelser" name="Gestures"/> <menu label="Min status" name="Status"> <menu_item_call label="Væk" name="Set Away"/> <menu_item_call label="Optaget" name="Set Busy"/> @@ -22,35 +22,37 @@ <menu_item_call label="Grupper" name="My Groups"/> <menu_item_check label="Chat i nærheden" name="Nearby Chat"/> <menu_item_call label="Personer tæt pÃ¥" name="Active Speakers"/> - <menu_item_check label="Media i nærheden" name="Nearby Media"/> </menu> <menu label="Verden" name="World"> - <menu_item_check label="Flyt" name="Movement Controls"/> - <menu_item_check label="Vis" name="Camera Controls"/> - <menu_item_call label="Om land" name="About Land"/> - <menu_item_call label="Region/Estate" name="Region/Estate"/> - <menu_item_call label="Køb land" name="Buy Land"/> + <menu_item_check label="Mini-kort" name="Mini-Map"/> + <menu_item_check label="Verdenskort" name="World Map"/> + <menu_item_call label="Foto" name="Take Snapshot"/> + <menu_item_call label="Opret landemærke for dette sted" name="Create Landmark Here"/> + <menu label="Profil for sted" name="Land"> + <menu_item_call label="Profil for sted" name="Place Profile"/> + <menu_item_call label="Om land" name="About Land"/> + <menu_item_call label="Region/Estate" name="Region/Estate"/> + </menu> + <menu_item_call label="Køb dette land" name="Buy Land"/> <menu_item_call label="Mit land" name="My Land"/> - <menu label="Vis" name="Land"> - <menu_item_check label="Ban Lines" name="Ban Lines"/> + <menu label="Vis" name="LandShow"> + <menu_item_check label="Bevægelses kontrol" name="Movement Controls"/> + <menu_item_check label="Kontroller" name="Camera Controls"/> + <menu_item_check label="'Ingen adgang' markering" name="Ban Lines"/> <menu_item_check label="Pejlelys" name="beacons"/> <menu_item_check label="Parcel skel" name="Property Lines"/> - <menu_item_check label="Land-ejere" name="Land Owners"/> + <menu_item_check label="Grundejere" name="Land Owners"/> + <menu_item_check label="Koordinater" name="Coordinates"/> + <menu_item_check label="Parcel egenskaber" name="Parcel Properties"/> </menu> - <menu label="Landemærker" name="Landmarks"> - <menu_item_call label="Opret landemærke her" name="Create Landmark Here"/> - <menu_item_call label="Sæt hjem til her" name="Set Home to Here"/> - </menu> - <menu_item_call label="Hjem" name="Teleport Home"/> - <menu_item_check label="Mini-kort" name="Mini-Map"/> - <menu_item_check label="Verdenskort" name="World Map"/> - <menu_item_call label="Foto" name="Take Snapshot"/> + <menu_item_call label="Teleport hjem" name="Teleport Home"/> + <menu_item_call label="Sæt dette sted som 'Hjem'" name="Set Home to Here"/> <menu label="Sol" name="Environment Settings"> <menu_item_call label="Solopgang" name="Sunrise"/> <menu_item_call label="Middag" name="Noon"/> <menu_item_call label="Solnedgang" name="Sunset"/> <menu_item_call label="Midnat" name="Midnight"/> - <menu_item_call label="Benyt tid fra estate" name="Revert to Region Default"/> + <menu_item_call label="Estate tid" name="Revert to Region Default"/> <menu_item_call label="Redigering af omgivelser" name="Environment Editor"/> </menu> </menu> @@ -63,77 +65,62 @@ <menu_item_call label="Byg værktøj" name="Create"/> <menu_item_call label="Land værktøj" name="Land"/> </menu> - <menu label="Redigér" name="Edit"> - <menu_item_call label="Fortryd" name="Undo"/> - <menu_item_call label="Gendan" name="Redo"/> - <menu_item_call label="Klip" name="Cut"/> - <menu_item_call label="Kopiér" name="Copy"/> - <menu_item_call label="Sæt ind" name="Paste"/> - <menu_item_call label="Slet" name="Delete"/> - <menu_item_call label="Duplikér" name="Duplicate"/> - <menu_item_call label="Vælg alt" name="Select All"/> - <menu_item_call label="Fravælg" name="Deselect"/> - </menu> - <menu_item_call label="Sammenkæde" name="Link"/> + <menu_item_call label="Sammenkæd" name="Link"/> <menu_item_call label="Adskil" name="Unlink"/> + <menu_item_check label="Redigér sammekædede objekter" name="Edit Linked Parts"/> <menu_item_call label="Fokusér pÃ¥ valgte" name="Focus on Selection"/> <menu_item_call label="Zoom til valgte" name="Zoom to Selection"/> <menu label="Objekt" name="Object"> - <menu_item_call label="Køb" name="Menu Object Take"/> + <menu_item_call label="Køb" name="Menu Object Buy"/> + <menu_item_call label="Tag" name="Menu Object Take"/> <menu_item_call label="Tag kopi" name="Take Copy"/> <menu_item_call label="Opdatér ændringer til beholdning" name="Save Object Back to My Inventory"/> <menu_item_call label="Opdater ændringer i indhold til objekt" name="Save Object Back to Object Contents"/> </menu> <menu label="Scripts" name="Scripts"> - <menu_item_call label="Rekompilér scripts (Mono)" name="Mono"/> + <menu_item_call label="Genoversæt scripts (Mono)" name="Mono"/> <menu_item_call label="Genoversæt scripts (LSL)" name="LSL"/> <menu_item_call label="Genstart scripts" name="Reset Scripts"/> - <menu_item_call label="sæt scripts til "Running"" name="Set Scripts to Running"/> + <menu_item_call label="Sæt scripts til "Running"" name="Set Scripts to Running"/> <menu_item_call label="Sæt scripts til "Not Running"" name="Set Scripts to Not Running"/> </menu> <menu label="Valg" name="Options"> - <menu_item_check label="Redigér sammenlænkede dele" name="Edit Linked Parts"/> <menu_item_call label="Sæt standard rettigheder" name="perm prefs"/> <menu_item_check label="Vis avancerede rettigheder" name="DebugPermissions"/> - <menu label="Selektion" name="Selection"> - <menu_item_check label="Vælg kun egne objekter" name="Select Only My Objects"/> - <menu_item_check label="Vælg kun flytbare objekter" name="Select Only Movable Objects"/> - <menu_item_check label="Vælg ved at omkrandse" name="Select By Surrounding"/> - </menu> - <menu label="Vis" name="Show"> - <menu_item_check label="Vis skjult selektion" name="Show Hidden Selection"/> - <menu_item_check label="Vis lys-radius for valgte" name="Show Light Radius for Selection"/> - <menu_item_check label="Vis udvælgelses strÃ¥le" name="Show Selection Beam"/> - </menu> - <menu label="Gitter" name="Grid"> - <menu_item_check label="Ret ind til gitter" name="Snap to Grid"/> - <menu_item_call label="Ret XY for objekt ind til gitter" name="Snap Object XY to Grid"/> - <menu_item_call label="Benyt valgte som grundlag for gitter" name="Use Selection for Grid"/> - <menu_item_call label="Gitter valg" name="Grid Options"/> - </menu> + <menu_item_check label="Vælg kun egne objekter" name="Select Only My Objects"/> + <menu_item_check label="Vis kun flytbare objekter" name="Select Only Movable Objects"/> + <menu_item_check label="Vælg ved at omkrandse" name="Select By Surrounding"/> + <menu_item_check label="Vis skjulte objekter" name="Show Hidden Selection"/> + <menu_item_check label="Vis lys-radius for valgte" name="Show Light Radius for Selection"/> + <menu_item_check label="Vis pejlelys for valgte" name="Show Selection Beam"/> + <menu_item_check label="Ret ind til gitter" name="Snap to Grid"/> + <menu_item_call label="Ret XY for objekt ind til gitter" name="Snap Object XY to Grid"/> + <menu_item_call label="Benyt valgte som grundlag for gitter" name="Use Selection for Grid"/> + <menu_item_call label="Gitter indstillinger" name="Grid Options"/> </menu> <menu label="Vis lænkede dele" name="Select Linked Parts"> <menu_item_call label="Vælg næste del" name="Select Next Part"/> <menu_item_call label="Vælg forrige del" name="Select Previous Part"/> - <menu_item_call label="Inkludér næste valg" name="Include Next Part"/> + <menu_item_call label="Inkludér næste del" name="Include Next Part"/> <menu_item_call label="Inkludér forrige del" name="Include Previous Part"/> </menu> </menu> <menu label="Hjælp" name="Help"> <menu_item_call label="[SECOND_LIFE] Help" name="Second Life Help"/> - <menu_item_call label="Tutorial" name="Tutorial"/> <menu_item_call label="Rapporter misbrug" name="Report Abuse"/> <menu_item_call label="Rapportér fejl" name="Report Bug"/> + <menu_item_call label="Om [APP_NAME]" name="About Second Life"/> </menu> <menu label="Avanceret" name="Advanced"> - <menu_item_check label="Sæt til "væk" efter 30 minutter" name="Go Away/AFK When Idle"/> + <menu_item_check label="Vis avanceret menu" name="Show Advanced Menu"/> <menu_item_call label="Stop animering af min avatar" name="Stop Animating My Avatar"/> <menu_item_call label="Gendan teksturer" name="Rebake Texture"/> <menu_item_call label="Sæt UI størrelse til standard" name="Set UI Size to Default"/> + <menu_item_call label="Vælg vinduesstørrelse..." name="Set Window Size..."/> <menu_item_check label="Begræns valg afstand" name="Limit Select Distance"/> <menu_item_check label="Fjern kamerabegrænsninger" name="Disable Camera Distance"/> <menu_item_check label="Højopløsningsfoto" name="HighResSnapshot"/> - <menu_item_check label="Lydløse foto's til disk" name="QuietSnapshotsToDisk"/> + <menu_item_check label="Lydløse fotos til disk" name="QuietSnapshotsToDisk"/> <menu_item_check label="Komprimér fotos til disk" name="CompressSnapshotsToDisk"/> <menu label="Værktøjer til ydelse" name="Performance Tools"> <menu_item_call label="Lag meter" name="Lag Meter"/> @@ -147,14 +134,13 @@ <menu_item_check label="Fremhæv gennemsigtigt" name="Highlight Transparent"/> <menu_item_check label="Vis HUD vedhæftninger" name="Show HUD Attachments"/> <menu_item_check label="Vis muse-sigte" name="ShowCrosshairs"/> - <menu_item_check label="Vis tips om land" name="Land Tips"/> </menu> <menu label="Gengivelsestyper" name="Rendering Types"> <menu_item_check label="Simpel" name="Simple"/> <menu_item_check label="Alpha" name="Alpha"/> <menu_item_check label="Træer" name="Tree"/> <menu_item_check label="Avatarer" name="Character"/> - <menu_item_check label="SurfacePath" name="SurfacePath"/> + <menu_item_check label="Overflade" name="SurfacePath"/> <menu_item_check label="Himmel" name="Sky"/> <menu_item_check label="Vand" name="Water"/> <menu_item_check label="Jord" name="Ground"/> @@ -173,11 +159,12 @@ <menu_item_check label="TÃ¥ge" name="Fog"/> <menu_item_check label="Fleksible objekter" name="Flexible Objects"/> </menu> - <menu_item_check label="Kør flere trÃ¥de" name="Run Multiple Threads"/> + <menu_item_check label="Kør flere 'threats'" name="Run Multiple Threads"/> + <menu_item_check label="Benyt "Plugin Read Thread"" name="Use Plugin Read Thread"/> <menu_item_call label="Tøm gruppe cache" name="ClearGroupCache"/> <menu_item_check label="Muse udjævning" name="Mouse Smoothing"/> - <menu_item_check label="Vis IM's i lokal chat" name="IMInChat"/> <menu label="Shortcuts" name="Shortcuts"> + <menu_item_call label="Billede (L$[COST])..." name="Upload Image"/> <menu_item_check label="Søg" name="Search"/> <menu_item_call label="Frigør taster" name="Release Keys"/> <menu_item_call label="Sæt UI størrelse til standard" name="Set UI Size to Default"/> @@ -200,7 +187,6 @@ <menu_item_call label="Zoom ind" name="Zoom In"/> <menu_item_call label="Zoom standard" name="Zoom Default"/> <menu_item_call label="Zoom ud" name="Zoom Out"/> - <menu_item_call label="Skift fuld-skærm" name="Toggle Fullscreen"/> </menu> <menu_item_call label="Vis debug valg" name="Debug Settings"/> <menu_item_check label="Vis udviklingsmenu" name="Debug Mode"/> @@ -217,6 +203,7 @@ <menu_item_call label="Vis Regionsinfo i debug-konsol" name="Region Info to Debug Console"/> <menu_item_check label="Kamera" name="Camera"/> <menu_item_check label="Vind" name="Wind"/> + <menu_item_check label="Badge" name="Badge"/> </menu> <menu label="Vis info" name="Display Info"> <menu_item_check label="Vis tid" name="Show Time"/> diff --git a/indra/newview/skins/default/xui/da/notifications.xml b/indra/newview/skins/default/xui/da/notifications.xml index 42eac1be7a..72a1ab6a29 100644 --- a/indra/newview/skins/default/xui/da/notifications.xml +++ b/indra/newview/skins/default/xui/da/notifications.xml @@ -11,18 +11,29 @@ </global> <template name="okbutton"> <form> - <button name="OK" text="$yestext"/> + <button name="OK_okbutton" text="$yestext"/> + </form> + </template> + <template name="okignore"> + <form> + <button name="OK_okignore" text="$yestext"/> </form> </template> - <template name="okignore"/> <template name="okcancelbuttons"> <form> - <button name="Cancel" text="$notext"/> + <button name="OK_okcancelbuttons" text="$yestext"/> + <button name="Cancel_okcancelbuttons" text="$notext"/> + </form> + </template> + <template name="okcancelignore"> + <form> + <button name="OK_okcancelignore" text="$yestext"/> + <button name="Cancel_okcancelignore" text="$notext"/> </form> </template> - <template name="okcancelignore"/> <template name="okhelpbuttons"> <form> + <button name="OK_okhelpbuttons" text="$yestext"/> <button name="Help" text="$helptext"/> </form> </template> @@ -30,6 +41,7 @@ <form> <button name="Yes" text="$yestext"/> <button name="No" text="$notext"/> + <button name="Cancel_yesnocancelbuttons" text="$canceltext"/> </form> </template> <notification functor="GenericAcknowledge" label="Ukendt notificeringsbesked" name="MissingAlert"> @@ -93,13 +105,17 @@ Vælg kun en genstand, og prøv igen. Gem alle ændringer til tøj/krops dele? <usetemplate canceltext="Annullér" name="yesnocancelbuttons" notext="Gem Ikke" yestext="Gem Alt"/> </notification> + <notification name="FriendsAndGroupsOnly"> + 'Ikke-venner' vil ikke vide, at du har valgt at ignorere deres opkald og personlige beskeder (IM) + <usetemplate name="okbutton" yestext="OK"/> + </notification> <notification name="GrantModifyRights"> - At give redigerings rettigheder til en anden beboer, giver dem mulighed for at ændre, slette eller tage alle genstande, du mÃ¥tte have i verden. Vær meget forsigtig nÃ¥r uddeler denne tilladelse. + At give redigerings rettigheder til en anden beboer, giver dem mulighed for at ændre, slette eller tage ALLE genstande, du mÃ¥tte have i verden. Vær MEGET forsigtig nÃ¥r uddeler denne tilladelse. Ønsker du at ændre rettigheder for [FIRST_NAME] [LAST_NAME]? <usetemplate name="okcancelbuttons" notext="Nej" yestext="Ja"/> </notification> <notification name="GrantModifyRightsMultiple"> - At give redigerings rettigheder til en anden beboer, giver dem mulighed for at ændre, slette eller tage alle genstande, du mÃ¥tte have i verden. Vær meget forsigtig nÃ¥r uddeler denne tilladelse. + At give redigerings rettigheder til en anden beboer, giver dem mulighed for at ændre, slette eller tage ALLE genstande, du mÃ¥tte have i verden. Vær MEGET forsigtig nÃ¥r uddeler denne tilladelse. Ønsker du at ændre rettigheder for de valgte beboere? <usetemplate name="okcancelbuttons" notext="Nej" yestext="Ja"/> </notification> @@ -142,8 +158,15 @@ Ethvert medlem i en rolle med denne evne kan tildele sig selv -- og et andet med Add this Ability to '[ROLE_NAME]'? <usetemplate name="okcancelbuttons" notext="Nej" yestext="Ja"/> </notification> - <notification name="ClickUnimplemented"> - Beklager, ikke implementeret endnu. + <notification name="AttachmentDrop"> + Du er ved at smide et vedhæng. + Er du sikker pÃ¥ at du vil fortsætte? + <usetemplate ignoretext="Bekræft før vedhæng smides" name="okcancelignore" notext="Nej" yestext="Ja"/> + </notification> + <notification name="JoinGroupNoCost"> + Du melder dig ind i gruppen [NAME]. +Ønsker du at fortsætte? + <usetemplate name="okcancelbuttons" notext="Annullér" yestext="Bliv medlem"/> </notification> <notification name="JoinGroupCannotAfford"> Tilmelding til denne gruppe koster L$[COST]. @@ -185,6 +208,9 @@ Du skal skrive bÃ¥de fornavn og efternavn pÃ¥ din figur. Du har brug for en konto for at logge ind i [SECOND_LIFE]. Vil du oprette en nu? <usetemplate name="okcancelbuttons" notext="Prøv igen" yestext="Lav ny konto"/> </notification> + <notification name="InvalidCredentialFormat"> + Du skal indtaste bÃ¥de fornavn og efternavn i din avatars brugernavn felt og derefter logge pÃ¥ igen. + </notification> <notification name="AddClassified"> Annoncer vil vises i 'Annoncer' sektionen i søge biblioteket og pÃ¥ [http://secondlife.com/community/classifieds secondlife.com] i en uge. Udfyld din annonce og klik pÃ¥ 'Udgiv...' for at tilf'je den til biblioteket. @@ -197,19 +223,18 @@ Jo mere du betaler, jo højere oppe pÃ¥ listen vises annoncen, og den vil ogsÃ¥ Er du sikker pÃ¥ at du vil fortsætte? <usetemplate ignoretext="Bekræft før jeg slette media i et objekt" name="okcancelignore" notext="Nej" yestext="Ja"/> </notification> - <notification name="ResetShowNextTimeDialogs"> - Vil du gerne genaktivere alle disse popups, som du tidligere har bedt om ikke at fÃ¥ vist? - <usetemplate name="okcancelbuttons" notext="Annullér" yestext="OK"/> + <notification name="ClassifiedInsufficientFunds"> + Ikke nok penge til at oprette annonce. + <usetemplate name="okbutton" yestext="OK"/> </notification> - <notification name="SkipShowNextTimeDialogs"> - Vil du deaktivere alle popups som kan undværes? - <usetemplate name="okcancelbuttons" notext="Annullér" yestext="OK"/> + <notification name="DeleteAvatarPick"> + Slet favorit <nolink>[PICK]</nolink>? </notification> <notification name="CacheWillClear"> Cache vil blive tømt ved næste genstart af [APP_NAME]. </notification> <notification name="CacheWillBeMoved"> - Cache vil blive flyttet ved næste genstart af [APP_NAME]. + Cache vil blive fjernet ved næste genstart af [APP_NAME]. Note: This will clear the cache. </notification> <notification name="ChangeConnectionPort"> @@ -224,11 +249,14 @@ Indtast venligst navn pÃ¥ region i Start lokation feltet eller vælg "Min s <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="UnsupportedHardware"> + Din computer opfylder ikke minimumskravene til [APP_NAME]. Du kan risikere nedsat hastighed. Desværre kan [SUPPORT_SITE] ikke tilbyde teknisk support til konfigurationer der ikke er understøttet. + +Besøg [_URL] for yderligere information? <usetemplate ignoretext="Din computer hardware understøttes ikke" name="okcancelignore" notext="No" yestext="Yes"/> </notification> <notification name="UnknownGPU"> - Dit system har et grafikkort som er ukendt for [APP_NAME] lige nu. -Dette er tilfældet med nyt hardware som endnu ikke er blevet testet med [APP_NAME]. [APP_NAME] vil sandsynligvis kunne køre normalt, men det kan være nødvendigt at justere opsætningen af grafik. + Dit system indeholder et grafikkort som [APP_NAME] ikke kan genkende. +Dette skyldes ofte nyt hardware som endnu ikke er blevet testet med [APP_NAME]. Kortet vil sandsynligvis virke fint, med det kan være nødvendigt at justere grafik opsætningen. (Mig > Indstillinger > Grafik). <form name="form"> <ignore name="ignore" text="Dit grafikkort kunne ikke identificeres"/> @@ -254,15 +282,28 @@ GÃ¥ til [_URL] for information om køb af L$? <notification name="CannotEncodeFile"> Kunne ikke 'forstÃ¥' filen: [FILE] </notification> + <notification name="CorruptedProtectedDataStore"> + Vi kan ikke læse dine beskyttede data sÃ¥ de nulstilles. + Dette kan ske hvis du ændrer din netværksopsætning. + <usetemplate name="okbutton" yestext="OK"/> + </notification> <notification name="DoNotSupportBulkAnimationUpload"> [APP_NAME] understøtter p.t. ikke at send flere animationsfiler ad gangen. </notification> <notification name="LandmarkCreated"> Du har tilføjet "[LANDMARK_NAME]" til din [FOLDER_NAME] mappe. </notification> + <notification name="LandmarkAlreadyExists"> + Du har allerede et landemærke for denne lokation. + <usetemplate name="okbutton" yestext="OK"/> + </notification> <notification name="CannotOpenScriptObjectNoMod"> Ikke muligt at Ã¥bne script i objekt uden 'Redigére' rettigheder. </notification> + <notification name="CouldNotTeleportReason"> + Teleport fejlede. +[REASON] + </notification> <notification name="invalid_tport"> Der opstod et problem ved din teleport. Det kan være nødvendigt at logge ind igen, før du kan teleporte. Hvis du bliver ved med at fÃ¥ denne fejl, check venligst [SUPPORT_SITE]. @@ -305,6 +346,10 @@ Prøv evt. igen om lidt. <notification name="no_inventory_host"> Beholdningssystemet er ikke tilgængelig lige nu. </notification> + <notification name="ForceOwnerAuctionWarning"> + Denne parcel er sat pÃ¥ auktion. Gennemtving ejerskab vil annullere denne auktion og mÃ¥ske irritere nogen beboere hvis bud allerede er afgivet. +Gennemtving ejerskab? + </notification> <notification name="CannotBuyLandNoRegion"> Ikke i stand til at købe land: Kan ikke finde region som dette land er i. @@ -316,13 +361,6 @@ Kan ikke finde region som dette land er i. Land kunne ikke dedikeres: Kunne ikke finde den region land ligger i. </notification> - <notification name="ParcelCanPlayMedia"> - Dette sted kan afspille 'streaming media'. -'Streaming media' kræver en hurtig internet opkobling. - -Afspil altid 'streaming media' nÃ¥r det er tilgængeligt? -(Du kan ændre dette valg senere under Indstillinger > Privatliv.) - </notification> <notification name="CannotReleaseLandRegionNotFound"> Kunne ikke efterlade land: Kan ikke finde den region landet ligger i. @@ -340,9 +378,8 @@ Kan ikke finde den region landet ligger i. Dette er typisk en midlertidig fejl. Venligst rediger og gem igen om et par minutter. </notification> <notification name="YouHaveBeenLoggedOut"> - Du er blevet logget af [SECOND_LIFE]: + Du er blevet logget af [SECOND_LIFE] [MESSAGE] -Du kan stadig se igangværende samtaler (IM) og chat ved at klikke pÃ¥ 'Se IM & chat. Ellers klik pÃ¥ 'Afslut' for at lukke [APP_NAME] med det samme. <usetemplate name="okcancelbuttons" notext="Afslut" yestext="Se PB & Chat"/> </notification> <notification label="Tilføj ven" name="AddFriend"> @@ -365,6 +402,25 @@ Tilbyd venskab til [NAME]? <button name="Cancel" text="Annullér"/> </form> </notification> + <notification label="Gem sæt" name="SaveOutfitAs"> + Gem det som jeg har pÃ¥ som nyt sæt: + <form name="form"> + <input name="message"> + [DESC] (ny) + </input> + <button name="Offer" text="OK"/> + <button name="Cancel" text="Annullér"/> + </form> + </notification> + <notification name="ConfirmItemDeleteHasLinks"> + Mindst en af genstandene har lænkede genstande der peger pÃ¥ den. Hvis du sletter denne genstand, vil lænkninger ikke virke mere. Det anbefales kraftigt at fjerne lænkninger først. + +Er du sikker pÃ¥ at du vil slette disse genstande? + <usetemplate name="okcancelbuttons" notext="Annullér" yestext="OK"/> + </notification> + <notification name="ErrorMessage"> + <usetemplate name="okbutton" yestext="OK"/> + </notification> <notification name="AvatarMovedDesired"> Den ønskede lokation er ikke tilgængelig lige nu. Du er blevet flyttet til en region in nærheden. @@ -396,6 +452,42 @@ Vend tilbage til [http://join.secondlife.com secondlife.com] for at oprette en n Du kan enten checke din Internet forbindelse og prøve igen om lidt, klikke pÃ¥ Hjælp for at se [SUPPORT_SITE] siden, eller klikke pÃ¥ Teleport for at forsøge at teleportere hjem. </notification> + <notification name="CantTeleportToGrid"> + Kunne ikke teleportere til [SLURL] da den er pÃ¥ et andet net ([GRID]) end det nuværende net ([CURRENT_GRID]). Luk venligst din klient og prøv igen. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="GeneralCertificateError"> + Kunne ikke opnÃ¥ forbindelse til server. +[REASON] + +Vedrørende: [SUBJECT_NAME_STRING] +Fra: [ISSUER_NAME_STRING] +Valid fra: [VALID_FROM] +Valid til: [VALID_TO] +MD5 Fingerprint: [SHA1_DIGEST] +SHA1 Fingerprint: [MD5_DIGEST] +Key Usage: [KEYUSAGE] +Extended Key Usage: [EXTENDEDKEYUSAGE] +Subject Key Identifier: [SUBJECTKEYIDENTIFIER] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="TrustCertificateError"> + Certifikationsmyndighed for denne server er ikke kendt. + +Certifikat information: +Vedrørende: [SUBJECT_NAME_STRING] +Fra: [ISSUER_NAME_STRING] +Valid fra: [VALID_FROM] +Valid til: [VALID_TO] +MD5 Fingerprint: [SHA1_DIGEST] +SHA1 Fingerprint: [MD5_DIGEST] +Key Usage: [KEYUSAGE] +Extended Key Usage: [EXTENDEDKEYUSAGE] +Subject Key Identifier: [SUBJECTKEYIDENTIFIER] + +Ønsker du at stole pÃ¥ denne myndighed? + <usetemplate name="okcancelbuttons" notext="Annullér" yestext="Stol pÃ¥"/> + </notification> <notification name="NotEnoughCurrency"> [NAME] L$ [PRICE] Du har ikke nok L$ til dette. </notification> @@ -496,6 +588,10 @@ Download til dit Program bibliotek? <notification name="ReturnToOwner"> <usetemplate ignoretext="Bekræft før objekter returneres til deres ejere" name="okcancelignore" notext="Cancel" yestext="OK"/> </notification> + <notification name="ConfirmKick"> + Er du SIKKER pÃ¥ at du vil sparke alle beboere ud? + <usetemplate name="okcancelbuttons" notext="Cancel" yestext="Spark alle beboere ud"/> + </notification> <notification name="MuteLinden"> Beklager, men du kan ikke blokere en Linden. </notification> @@ -511,9 +607,21 @@ Chat og personlige beskeder vil blive skjult. Personlige beskeder vil fÃ¥ din &a <usetemplate ignoretext="Jeg skrifter min status til 'optaget" name="okignore" yestext="OK"/> </notification> <notification name="JoinedTooManyGroupsMember"> - Du har nÃ¥et det maksimale antal grupper. Du skal forlade en anden gruppe for at kunne være med i denne - eller afvis tilbudet. -[NAME] har inviteret dig til at være medlem af en gruppe. -[INVITE] + Du er oppe pÃ¥ det maksimale antal grupper. Forlad venligst en anden gruppe inden du melder dig ind i denne, eller afvis tilbuddet. +[NAME] har inviteret dig til en gruppe. + </notification> + <notification name="JoinedTooManyGroups"> + Du er oppe pÃ¥ det maksimale antal grupper. Forlad venligst en gruppe inden du melder dig ind i enndnu en gruppe eller opretter en ny. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="KickUser"> + Spark beboere ud med hvilken besked? + </notification> + <notification name="FreezeUser"> + Frys beboeren med hvilken besked? + </notification> + <notification name="UnFreezeUser"> + Fjern frysning af beboeren med hvilken besked? </notification> <notification name="OfferTeleport"> <form name="form"> @@ -524,7 +632,11 @@ Chat og personlige beskeder vil blive skjult. Personlige beskeder vil fÃ¥ din &a <button name="Cancel" text="Annullér"/> </form> </notification> + <notification name="OfferTeleportFromGod"> + Tilkald beboer til din lokation? + </notification> <notification name="TeleportFromLandmark"> + Er du sikker pÃ¥ at du vil teleportere til <nolink>[LOCATION]</nolink>? <usetemplate ignoretext="Bekræft at jeg vil teleportere til et landemærke" name="okcancelignore" notext="Cancel" yestext="Teleport"/> </notification> <notification name="TeleportToPick"> @@ -535,6 +647,17 @@ Chat og personlige beskeder vil blive skjult. Personlige beskeder vil fÃ¥ din &a Teleport til [CLASSIFIED]? <usetemplate ignoretext="Bekræft at du ønsker at teleportere til lokation in annoncer" name="okcancelignore" notext="Annullér" yestext="Teleport"/> </notification> + <notification name="TeleportToHistoryEntry"> + Teleport til [HISTORY_ENTRY]? + <usetemplate ignoretext="Bekræft at du ønsker at teleportere til en lokation i din historik" name="okcancelignore" notext="Annullér" yestext="Teleport"/> + </notification> + <notification label="Change Linden Estate" name="ChangeLindenEstate"> + Du er i færd med at ændre et Linden ejet estate (mainland, teeen grid, orientation etc.). + +Dette er EKSTREMT FARLIGT da det kan ændre beboernes oplevelse fundamentalt. PÃ¥ mainland vil dette betyde ændring af tusinder af regioner og fÃ¥ spaceserveren til at kløjs i det. + +Fortsæt? + </notification> <notification name="RegionEntryAccessBlocked"> Du har ikke adgang til denne region pÃ¥ grund af din valgte indholdsrating. Dette kan skyldes manglende validering af din alder. @@ -554,15 +677,18 @@ GÃ¥ til 'Knowledge Base' for mere information om indholdsratings. Du har ikke adgang til denne region pÃ¥ grund af din valgte indholdsrating. </notification> <notification name="RegionEntryAccessBlocked_Change"> - Du har ikke adgang til denne region pÃ¥ grund af din indholdsrating præferencer. + Du har ikke adgang til den region, da din indholdsrating ikke tillader dette. -Du kan klikke pÃ¥ 'Ændre præference' for at ændre din indholdsrating nu og dermed opnÃ¥ adgang. Du vil sÃ¥ fÃ¥ mulighed for at søge og tilgÃ¥ [REGIONMATURITY] fra da af. Hvis du senere ønsker at ændre denne opsætning tilbage, gÃ¥ til Mig > Indstillinger > Generelt. +Klik pÃ¥ "Ændre præference" for at forhøje din indholdsrating for direkte adgang nu. Ved at gøre dette vil du fÃ¥ lov til at søge og fÃ¥ adgang til [REGIONMATURITY] indhold. Hvis du ønsker at ændre denne opsætning senere, kan du gøre dette fra Mig > Indstillinger > Generelt. <form name="form"> <button name="OK" text="Ændre indstillinger"/> <button name="Cancel" text="Luk"/> <ignore name="ignore" text="Din valgte indholdsrating forhindrer dig i at kommer til en region"/> </form> </notification> + <notification name="PreferredMaturityChanged"> + Din indholdsrating er nu [RATING]. + </notification> <notification name="LandClaimAccessBlocked"> Du kan ikke kræve dette land pÃ¥ grund af din nuværende indholdsrating indstillinge . Dette kan skyldes manglende validering af din alder. @@ -626,6 +752,12 @@ Du kan klikke pÃ¥ 'Ændre præference' for at ændre din indholdsratin Indeholder denne gruppe 'Mature' indhold? <usetemplate canceltext="Annullér" name="yesnocancelbuttons" notext="Nej" yestext="Ja"/> </notification> + <notification label="Changed Region Maturity" name="RegionMaturityChange"> + Ratingen for denne region er ændret. +Det kan tage noget tid inden ændringen slÃ¥r igennem pÃ¥ kortet. + +For at fÃ¥ adgang til voksen regioner, skal beboere være alders-checket, enten via aldersverifikation eller betalingsverifikation. + </notification> <notification label="Voice Version Mismatch" name="VoiceVersionMismatch"> Denne version af [APP_NAME] er ikke kompatibel med stemme chat funktionen i denne region. For at kunne fÃ¥ stemme chat til at fungere skal du opdatere [APP_NAME]. </notification> @@ -649,9 +781,9 @@ Du kan klikke pÃ¥ 'Ændre præference' for at ændre din indholdsratin <usetemplate ignoretext="Bekræft før jeg afslutter" name="okcancelignore" notext="Afslut ikke" yestext="Quit"/> </notification> <notification name="HelpReportAbuseEmailLL"> - Benyt dette værktøj til at rapportere Use this tool to report krænkelser af [http://secondlife.com/corporate/tos.php Terms of Service] og [http://secondlife.com/corporate/cs.php Community Standards]. + Benyt dette værktøj til at rapportere krænkninger af [http://secondlife.com/corporate/tos.php Terms of Service] og [http://secondlife.com/corporate/cs.php Community Standards]. -Alle indrapporterede krænkelser er undersøgt og and afgjort. Du kan se løsning ved at læse [http://secondlife.com/support/incidentreport.php Incident Report]. +Alle rapporter om krænkninger vil blive undersøgt og behandlet. </notification> <notification name="HelpReportAbuseContainsCopyright"> Kære beboer, @@ -751,6 +883,9 @@ Henvis til dette fra en hjemmeside for at give andre nem adgang til denne lokati <notification name="SystemMessageTip"> [MESSAGE] </notification> + <notification name="IMSystemMessageTip"> + [MESSAGE] + </notification> <notification name="Cancelled"> Annulléret </notification> @@ -776,6 +911,11 @@ Henvis til dette fra en hjemmeside for at give andre nem adgang til denne lokati Uploader billeder fra verdenen og www... (Tager omkring 5 minutter.) </notification> + <notification name="UploadConfirmation"> + Omkostninger ved at sende: L$[AMOUNT]. +Ønsker du at fortsætte? + <usetemplate name="okcancelbuttons" notext="Annullér" yestext="Send"/> + </notification> <notification name="UploadPayment"> Du betalte L$[AMOUNT] for at uploade. </notification> @@ -792,8 +932,7 @@ Henvis til dette fra en hjemmeside for at give andre nem adgang til denne lokati Bevægelsen [NAME] mangler i databasen. </notification> <notification name="UnableToLoadGesture"> - Ikke muligt at indlæse gestus [NAME]. -Prøv venligst igen. + Kunne ikke indlæse læse bevægelse [NAME]. </notification> <notification name="LandmarkMissing"> Landmærke mangler i databasen. @@ -885,10 +1024,9 @@ Click on any landmark to select it, then click 'Teleport' at the botto (You can also double-click on the landmark, or right-click it and choose 'Teleport'.) </notification> <notification name="TeleportToPerson"> - Du kan kontakte beboere som f.eks. '[NAME]' ved at Ã¥bne 'Personer' panelet til højre pÃ¥ skærmen. -Vælg beboeren fra listen og klik sÃ¥ pÃ¥ 'IM' i bunden af panelet. -(Du kan ogsÃ¥ dobbelt-klikke pÃ¥ navnet i listen eller højreklikke og vælge 'IM') -(You can also double-click on their name in the list, or right-click and choose 'IM'). + Du kan kontakte beboere som '[NAME]' ved at Ã¥bne Personer panelet til højre pÃ¥ skærmen. +Vælg beboeren fra listen og klik sÃ¥ 'IM' i bundet af panelet. +(Du kan ogsÃ¥ dobbelt-klikke pÃ¥ navnet i listen, eller højre-klikke og vælge 'IM'). </notification> <notification name="CantSelectLandFromMultipleRegions"> Kan ikke vælge land pÃ¥ tværs af grænser. @@ -959,7 +1097,7 @@ Prøv venligst at geninstallere plugin eller kontakt leverandøren hvis probleme Genstandene pÃ¥ det valgte stykke land der er ejet af [FIRST] [LAST] er blevet returneret til hans eller hendes beholdning. </notification> <notification name="OtherObjectsReturned2"> - Genstandene pÃ¥ det valgte stykke land der er ejet af beboeren '[NAME]' er blevet returneret til deres ejere. + Objekterne i den valgte parcel, ejet af beboeren '[NAME]', er blevet returneret til deres ejer. </notification> <notification name="GroupObjectsReturned"> Genstandene pÃ¥ det valgte stykke land, delt med gruppen [GROUPNAME], er blevet returneret til deres ejeres beholdninger. @@ -971,7 +1109,7 @@ Genstande, der ikke kan overføres og som er dedikeret til gruppen, er blevet sl </notification> <notification name="ServerObjectMessage"> Besked fra [NAME]: -[MSG] +<nolink>[MSG]</nolink> </notification> <notification name="NotSafe"> Dette land er Ã¥bnet for 'skade'. @@ -1080,16 +1218,7 @@ Prøv igen om lidt. No valid parcel could be found. </notification> <notification name="ObjectGiveItem"> - Et objekt med navnet [OBJECTFROMNAME], ejet af [NAME_SLURL], har givet dig [OBJECTTYPE]: -[ITEM_SLURL] - <form name="form"> - <button name="Keep" text="Behold"/> - <button name="Discard" text="Smid væk"/> - <button name="Mute" text="Blokér"/> - </form> - </notification> - <notification name="ObjectGiveItemUnknownUser"> - Et objekt med navnet [OBJECTFROMNAME], ejet af en ukendt beboer, har givet dig [OBJECTTYPE]: + Et objekt med navnet [OBJECTFROMNAME] ejet af [NAME_SLURL] har givet dig denne/dette [OBJECTTYPE]: [ITEM_SLURL] <form name="form"> <button name="Keep" text="Behold"/> @@ -1098,12 +1227,12 @@ Prøv igen om lidt. </form> </notification> <notification name="UserGiveItem"> - [NAME_SLURL] har givet dig [OBJECTTYPE]: + [NAME_SLURL] har givet dig denne/dette [OBJECTTYPE]: [ITEM_SLURL] <form name="form"> - <button name="Keep" text="Behold"/> <button name="Show" text="Vis"/> <button name="Discard" text="Smid væk"/> + <button name="Mute" text="Blokér"/> </form> </notification> <notification name="GodMessage"> @@ -1120,14 +1249,17 @@ Prøv igen om lidt. </form> </notification> <notification name="TeleportOffered"> - [NAME] har tilbudt dig en teleport til lokationen: + [NAME_SLURL] har tilbudt en teleport til deres lokation: -[MESSAGE] +[MESSAGE] - [MATURITY_STR] <icon>[MATURITY_ICON]</icon> <form name="form"> <button name="Teleport" text="Teleportér"/> <button name="Cancel" text="Annullér"/> </form> </notification> + <notification name="TeleportOfferSent"> + Tilbud om teleport sendt til [TO_NAME] + </notification> <notification name="GotoURL"> [MESSAGE] [URL] @@ -1137,9 +1269,11 @@ Prøv igen om lidt. </form> </notification> <notification name="OfferFriendship"> - [NAME] tilbyder venskab. + [NAME_SLURL] tilbyder venskab. -Som standard vil du kunne se andres onlinestatus. +[MESSAGE] + +(Som udgangspunkt vil I være i stand til at se hinandens online status.) <form name="form"> <button name="Accept" text="Acceptér"/> <button name="Decline" text="Afvis"/> @@ -1154,9 +1288,15 @@ Som standard vil du kunne se andres onlinestatus. <notification name="FriendshipDeclined"> [NAME] afviste dit tilbud om venskab. </notification> + <notification name="FriendshipAcceptedByMe"> + Tilbud om venskab accepteret. + </notification> + <notification name="FriendshipDeclinedByMe"> + Tilbud om venskab afvist. + </notification> <notification name="OfferCallingCard"> - [FIRST] [LAST] tilbyder vedkommendes visitkort. -Dette vil tilføje et bogmærke i din beholdning, sÃ¥ du hurtigt kan sende en personlig besked (IM) til denne beboer. + [FIRST] [LAST] tilbyder dig et visitkort. +Dette vil lave et bogmørke i din beholding, sÃ¥ du hurtigt kan sende en IM til denne beboer. <form name="form"> <button name="Accept" text="Acceptér"/> <button name="Decline" text="Afvis"/> @@ -1187,6 +1327,9 @@ Fra genstand: [OBJECTNAME], ejer: [NAME]? <notification name="FailedToFindWearable"> Det lykkedes ikke at finde [TYPE] med navnet [DESC] i databasen. </notification> + <notification name="ShareToWebFailed"> + Fejl ved afsendelse af billede til web. + </notification> <notification name="InvalidWearable"> Den genstand du prøver at tage pÃ¥ benytter en funktion din klient ikke kan forstÃ¥. Upgradér venligst din version af [APP_NAME] for at kunne tage denne genstand pÃ¥. </notification> @@ -1227,22 +1370,6 @@ Tillad denne anmodning? <button name="Ignore" text="Ignorér"/> </form> </notification> - <notification name="ScriptToast"> - [FIRST] [LAST]'s '[TITLE]' ønsker bruger-input. - <form name="form"> - <button name="Open" text="Ã…ben dialog"/> - <button name="Ignore" text="Ignorér"/> - <button name="Block" text="Blokér"/> - </form> - </notification> - <notification name="FirstBalanceIncrease"> - Du har netop modtaget [AMOUNT] L$. -Din balance vises øverst til højre. - </notification> - <notification name="FirstBalanceDecrease"> - Du har netop betalt [AMOUNT] L$. -Din balance vises øverst til højre. - </notification> <notification name="BuyLindenDollarSuccess"> Tak for din betaling! @@ -1250,58 +1377,17 @@ Din L$ balance vil blive opdateret nÃ¥r transaktionen er gennemført. Ved transa Status for din betaling kan ses i din 'Transaction History' side pÃ¥ din [http://secondlife.com/account/ Dashboard] </notification> - <notification name="FirstSit"> - Du sidder ned. -Benyt piletasterne (eller AWSD) til at se rundt. -Klik pÃ¥ 'StÃ¥ op' tasten for at rejse dig. - </notification> - <notification name="FirstMap"> - Klik og træk pÃ¥ kortet for at se rundt. -Dobbelt-klik for at teleportere. -Benyt kontrollerne til højre for at finde ting og se forskellige baggrunde. - </notification> - <notification name="FirstBuild"> - Du har Ã¥bnet bygge værktøjer. Alle objekter du ser omkring dig er lavet via disse værktøjer. - </notification> - <notification name="FirstTeleport"> - Du kan kun teleportere til bestemte omrÃ¥der i denne region. Pilen peger pÃ¥ din specifikke destination. Klik pÃ¥ pilen for at fjerne den. - </notification> <notification name="FirstOverrideKeys"> Dine bevælgelsestaster bliver nu hÃ¥ndteret af et objekt. Brug piletasterne eller AWSD for at se, hvad de gør. Nogle genstande (som skydevÃ¥ben) kræver at du gÃ¥r ind i musevisning for at bruge dem. Tryk pÃ¥ 'M' for at gÃ¥re det. </notification> - <notification name="FirstAppearance"> - Du redigerer dit udseende. -Benyt piletasterne til at se rundt. -NÃ¥r du er færdig, tryk pÃ¥ 'Gem alt'. - </notification> - <notification name="FirstInventory"> - Dette er din beholdning, som indeholder de genstande du ejer. - -* For at tage noget pÃ¥, træk det over pÃ¥ dig selv. -* For at 'rezze' noget, træk det over pÃ¥ jorden. -* For at læse en note, dobbelt-klik pÃ¥ den. - </notification> <notification name="FirstSandbox"> Dette er et sandkasse omrÃ¥de. Her kan beboere lære ast bygge. De ting du bygger vil blive slettet senere, sÃ¥ glem ikke at højre-klikke og vælge "Tag" for at tage en kopi af din kreation til din beholdning. </notification> - <notification name="FirstFlexible"> - Dette objekt er fleksibelt/blødt. SÃ¥danne objekter skal være 'uden masse' og ikke fysiske. - </notification> - <notification name="FirstDebugMenus"> - Du har Ã¥bnet menuen 'Avanceret'. - -For at slÃ¥ denne menu fra og til, - Windows: Ctrl+Alt+D - Mac: ⌥⌘D - </notification> - <notification name="FirstSculptedPrim"> - Du redigerer en 'Sculpted prim'. SÃ¥danne objekter kræver en speciel tekstur for at definere faconen. - </notification> <notification name="MaxListSelectMessage"> Du mÃ¥ kun vælge op til [MAX_SELECT] genstande pÃ¥ denne liste. </notification> @@ -1408,6 +1494,10 @@ De vil blive blokeret nogle fÃ¥ sekunder af sikkerhedsmæssige Ã¥rsager. <button name="respondbutton" text="Svar"/> </form> </notification> + <notification name="ConfirmCloseAll"> + Er du sikker pÃ¥ at du vil lukke alle personlige samtaler (IM)? + <usetemplate ignoretext="Bekræft før du lukker alle IMer" name="okcancelignore" notext="Annullér" yestext="OK"/> + </notification> <notification name="AttachmentSaved"> Vedhæng er blevet gemt. </notification> @@ -1435,6 +1525,57 @@ De vil blive blokeret nogle fÃ¥ sekunder af sikkerhedsmæssige Ã¥rsager. Den valgte knap kan ikke vises lige nu. Knappen vil blive vist nÃ¥r der er nok plads til den. </notification> + <notification name="ShareNotification"> + Træk genstande fra beholdning til en person i beboer vælgeren + </notification> + <notification name="DeedToGroupFail"> + Dedikering til gruppe fejlede. + </notification> + <notification name="AvatarRezNotification"> + ( [EXISTENCE] sekunder i live ) +Avatar '[NAME]' declouded in [TIME] seconds. + </notification> + <notification name="AvatarRezSelfNotification"> + ( [EXISTENCE] sekunder i live ) +Du afsluttede klargøring af dit sæt pÃ¥ [TIME] sekunder. + </notification> + <notification name="AvatarRezCloudNotification"> + ( [EXISTENCE] sekunder i live ) +Avatar '[NAME]' blev til "sky". + </notification> + <notification name="AvatarRezArrivedNotification"> + ( [EXISTENCE] sekunder i live ) +Avatar '[NAME]' appeared. + </notification> + <notification name="AvatarRezLeftCloudNotification"> + ( [EXISTENCE] sekunder i live ) +Avatar '[NAME]' forsvandt efter [TIME] sekunder som "sky". + </notification> + <notification name="AvatarRezEnteredAppearanceNotification"> + ( [EXISTENCE] sekunder i live ) +Avatar '[NAME]' skiftede til udseende modus. + </notification> + <notification name="AvatarRezLeftAppearanceNotification"> + ( [EXISTENCE] sekunder i live ) +Avatar '[NAME]' har forladt udseende modus. + </notification> + <notification name="AvatarRezLeftNotification"> + ( [EXISTENCE] sekunder i live ) +Avatar '[NAME]' forsvandt helt "uploaded". + </notification> + <notification name="ConfirmLeaveCall"> + Er du sikker pÃ¥ at du vil forlade dette opkald? + <usetemplate ignoretext="Bekræft før jeg forlader opkald" name="okcancelignore" notext="Nej" yestext="Ja"/> + </notification> + <notification name="ConfirmMuteAll"> + Du har valgt at slukke for lyden for alle deltagere i gruppeopkaldet. +Dette vil ogsÃ¥ betyde, at alle beboere der slutter sig til opkaldet +vil have lyden slukket - selv efter de har forladt kaldet. + + +Sluk for alles lyd? + <usetemplate ignoretext="Bekræft før jeg slukker for alle deltageres lyd i gruppe-kald" name="okcancelignore" notext="OK" yestext="Annullér"/> + </notification> <global name="UnsupportedGLRequirements"> Det ser ikke ud til at din hardware opfylder minimumskravene til [APP_NAME]. [APP_NAME] kræver et OpenGL grafikkort som understøter 'multitexture'. Check eventuelt om du har de nyeste drivere for grafikkortet, og de nyeste service-packs og patches til dit operativsystem. diff --git a/indra/newview/skins/default/xui/da/outfit_accordion_tab.xml b/indra/newview/skins/default/xui/da/outfit_accordion_tab.xml new file mode 100644 index 0000000000..e2d1f26d42 --- /dev/null +++ b/indra/newview/skins/default/xui/da/outfit_accordion_tab.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- *NOTE: mantipov: this xml is intended to be used inside panel_outfits_list.xml for each outfit folder--> +<!-- All accordion tabs in the My Appearance/My Outfits panel will be created from this one at runtume--> +<accordion_tab name="Mockup Tab" title="Model fane"/> diff --git a/indra/newview/skins/default/xui/da/panel_adhoc_control_panel.xml b/indra/newview/skins/default/xui/da/panel_adhoc_control_panel.xml index ab2e7a6e31..1953fad31f 100644 --- a/indra/newview/skins/default/xui/da/panel_adhoc_control_panel.xml +++ b/indra/newview/skins/default/xui/da/panel_adhoc_control_panel.xml @@ -1,8 +1,14 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="panel_im_control_panel"> - <panel name="panel_call_buttons"> - <button label="Opkald" name="call_btn"/> - <button label="Forlad samtale" name="end_call_btn"/> - <button label="Stemmekontroller" name="voice_ctrls_btn"/> - </panel> + <layout_stack name="vertical_stack"> + <layout_panel name="call_btn_panel"> + <button label="Opkald" name="call_btn"/> + </layout_panel> + <layout_panel name="end_call_btn_panel"> + <button label="Forlad opkald" name="end_call_btn"/> + </layout_panel> + <layout_panel name="voice_ctrls_btn_panel"> + <button label="Stemmekontroller" name="voice_ctrls_btn"/> + </layout_panel> + </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/da/panel_avatar_list_item.xml index a9d5ba73ac..56332c00e6 100644 --- a/indra/newview/skins/default/xui/da/panel_avatar_list_item.xml +++ b/indra/newview/skins/default/xui/da/panel_avatar_list_item.xml @@ -22,4 +22,5 @@ [COUNT]Ã¥ </string> <text name="avatar_name" value="Ukendt"/> + <button name="profile_btn" tool_tip="Vis profil"/> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_block_list_sidetray.xml b/indra/newview/skins/default/xui/da/panel_block_list_sidetray.xml index 986a4131de..4f5041ad54 100644 --- a/indra/newview/skins/default/xui/da/panel_block_list_sidetray.xml +++ b/indra/newview/skins/default/xui/da/panel_block_list_sidetray.xml @@ -1,10 +1,10 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="block_list_panel"> <text name="title_text"> - Blokérede avatarer + Blokerede </text> - <scroll_list name="blocked" tool_tip="Vis liste over blokerede avatarer"/> + <scroll_list name="blocked" tool_tip="Liste med beboerer der p.t. er blokeret"/> <button label="Blokér beboer..." label_selected="Blokér beboer..." name="Block resident..." tool_tip="Vælg en beboer der skal blokeres"/> <button label="Blokér objekt via navn..." label_selected="Blokér objekt via navn..." name="Block object by name..."/> - <button label="Fjern blokering" label_selected="Fjern blokering" name="Unblock" tool_tip="Fjern beboer fra liste med blokeringer"/> + <button label="Fjern blokering" label_selected="Fjern blokering" name="Unblock" tool_tip="Fjerm en beboer fra blokeringslisten"/> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_body_parts_list_item.xml b/indra/newview/skins/default/xui/da/panel_body_parts_list_item.xml new file mode 100644 index 0000000000..de764d8025 --- /dev/null +++ b/indra/newview/skins/default/xui/da/panel_body_parts_list_item.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="wearable_item"> + <text name="item_name" value="..."/> +</panel> diff --git a/indra/newview/skins/default/xui/da/panel_bodyparts_list_button_bar.xml b/indra/newview/skins/default/xui/da/panel_bodyparts_list_button_bar.xml new file mode 100644 index 0000000000..4cbcdebbe4 --- /dev/null +++ b/indra/newview/skins/default/xui/da/panel_bodyparts_list_button_bar.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="clothing_list_button_bar_panel"> + <button label="Skift" name="switch_btn"/> + <button label="Køb >" name="bodyparts_shop_btn"/> +</panel> diff --git a/indra/newview/skins/default/xui/da/panel_bottomtray.xml b/indra/newview/skins/default/xui/da/panel_bottomtray.xml index 2085840bb5..2d288a9494 100644 --- a/indra/newview/skins/default/xui/da/panel_bottomtray.xml +++ b/indra/newview/skins/default/xui/da/panel_bottomtray.xml @@ -1,14 +1,15 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="bottom_tray"> - <string name="SpeakBtnToolTip"> - Slukker/tænder mikrofon - </string> - <string name="VoiceControlBtnToolTip"> - Skjuler/viser stemme kontrol panel - </string> + <string name="SpeakBtnToolTip" value="SlÃ¥ mikrofon til/fra"/> + <string name="VoiceControlBtnToolTip" value="Vis/skjul stemme kontrolpanel"/> <layout_stack name="toolbar_stack"> + <layout_panel name="speak_panel"> + <talk_button name="talk"> + <speak_button label="Tal" label_selected="Tal" name="speak_btn"/> + </talk_button> + </layout_panel> <layout_panel name="gesture_panel"> - <gesture_combo_box label="Bevægelse" name="Gesture" tool_tip="Skjuler/viser bevægelser"/> + <gesture_combo_list label="Bevægelse" name="Gesture" tool_tip="Skjuler/viser bevægelser"/> </layout_panel> <layout_panel name="movement_panel"> <button label="Flyt" name="movement_btn" tool_tip="Vis/skjul bevægelseskontroller"/> @@ -19,5 +20,30 @@ <layout_panel name="snapshot_panel"> <button label="" name="snapshots" tool_tip="Tag foto"/> </layout_panel> + <layout_panel name="sidebar_btn_panel"> + <button label="Sidepanel" name="sidebar_btn" tool_tip="Vis/skjul sidepanel"/> + </layout_panel> + <layout_panel name="build_btn_panel"> + <button label="Byg" name="build_btn" tool_tip="Vis/skjul byggeværktøjer"/> + </layout_panel> + <layout_panel name="search_btn_panel"> + <button label="Søg" name="search_btn" tool_tip="Vis/skjul søgning"/> + </layout_panel> + <layout_panel name="world_map_btn_panel"> + <button label="Kort" name="world_map_btn" tool_tip="Vis/skjul verdenskort"/> + </layout_panel> + <layout_panel name="mini_map_btn_panel"> + <button label="Mini-kort" name="mini_map_btn" tool_tip="Vis/skjul Mini-kort"/> + </layout_panel> + <layout_panel name="im_well_panel"> + <chiclet_im_well name="im_well"> + <button name="Unread IM messages" tool_tip="Konversationer"/> + </chiclet_im_well> + </layout_panel> + <layout_panel name="notification_well_panel"> + <chiclet_notification name="notification_well"> + <button name="Unread" tool_tip="Notifikationer"/> + </chiclet_notification> + </layout_panel> </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_bottomtray_lite.xml b/indra/newview/skins/default/xui/da/panel_bottomtray_lite.xml new file mode 100644 index 0000000000..bd31253ca4 --- /dev/null +++ b/indra/newview/skins/default/xui/da/panel_bottomtray_lite.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="bottom_tray_lite"> + <layout_stack name="toolbar_stack_lite"> + <layout_panel name="gesture_panel"> + <gesture_combo_list label="Bevægelse" name="Gesture" tool_tip="Vis/skjul bevægelser"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/default/xui/da/panel_classified_info.xml b/indra/newview/skins/default/xui/da/panel_classified_info.xml index a9cce7bf45..28f8936457 100644 --- a/indra/newview/skins/default/xui/da/panel_classified_info.xml +++ b/indra/newview/skins/default/xui/da/panel_classified_info.xml @@ -1,17 +1,48 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="panel_classified_info"> + <panel.string name="l$_price"> + L$[PRICE] + </panel.string> + <panel.string name="click_through_text_fmt"> + [TELEPORT] teleport, [MAP] kort, [PROFILE] profil + </panel.string> + <panel.string name="date_fmt"> + [mthnum,datetime,slt]/[day,datetime,slt]/[year,datetime,slt] + </panel.string> + <panel.string name="auto_renew_on"> + Aktiv + </panel.string> + <panel.string name="auto_renew_off"> + Ikke aktiv + </panel.string> <text name="title" value="Annonce info"/> <scroll_container name="profile_scroll"> <panel name="scroll_content_panel"> - <text name="classified_name" value="[name]"/> - <text name="classified_location" value="[loading...]"/> - <text name="content_type" value="[content type]"/> - <text name="category" value="[category]"/> - <check_box label="Forny automatisk hver uge" name="auto_renew"/> - <text name="price_for_listing" tool_tip="Pris for optagelse."> - L$[PRICE] - </text> - <text name="classified_desc" value="[description]"/> + <text_editor name="classified_name" value="[name]"/> + <text name="classified_location_label" value="Sted:"/> + <text_editor name="classified_location" value="[loading...]"/> + <text name="content_type_label" value="Indholdsype:"/> + <text_editor name="content_type" value="[content type]"/> + <text name="category_label" value="Kategori:"/> + <text_editor name="category" value="[category]"/> + <text name="creation_date_label" value="Oprettet d.:"/> + <text_editor name="creation_date" tool_tip="Oprettet d." value="[date]"/> + <text name="price_for_listing_label" value="Pris for optagelse i lister:"/> + <text_editor name="price_for_listing" tool_tip="Pris for optagelse." value="[price]"/> + <layout_stack name="descr_stack"> + <layout_panel name="clickthrough_layout_panel"> + <text name="click_through_label" value="Klik:"/> + <text_editor name="click_through_text" tool_tip="Klik gennem data" value="[clicks]"/> + </layout_panel> + <layout_panel name="price_layout_panel"> + <text name="auto_renew_label" value="Forny automatisk:"/> + <text name="auto_renew" value="Aktiv"/> + </layout_panel> + <layout_panel name="descr_layout_panel"> + <text name="classified_desc_label" value="Beskrivelse:"/> + <text_editor name="classified_desc" value="[description]"/> + </layout_panel> + </layout_stack> </panel> </scroll_container> <panel name="buttons"> diff --git a/indra/newview/skins/default/xui/da/panel_clothing_list_button_bar.xml b/indra/newview/skins/default/xui/da/panel_clothing_list_button_bar.xml new file mode 100644 index 0000000000..c08d095c66 --- /dev/null +++ b/indra/newview/skins/default/xui/da/panel_clothing_list_button_bar.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="clothing_list_button_bar_panel"> + <button label="Tilføj +" name="add_btn"/> + <button label="Køb >" name="clothing_shop_btn"/> +</panel> diff --git a/indra/newview/skins/default/xui/da/panel_clothing_list_item.xml b/indra/newview/skins/default/xui/da/panel_clothing_list_item.xml new file mode 100644 index 0000000000..de764d8025 --- /dev/null +++ b/indra/newview/skins/default/xui/da/panel_clothing_list_item.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="wearable_item"> + <text name="item_name" value="..."/> +</panel> diff --git a/indra/newview/skins/default/xui/da/panel_cof_wearables.xml b/indra/newview/skins/default/xui/da/panel_cof_wearables.xml new file mode 100644 index 0000000000..92d78b01a2 --- /dev/null +++ b/indra/newview/skins/default/xui/da/panel_cof_wearables.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="cof_wearables"> + <accordion name="cof_wearables_accordion"> + <accordion_tab name="tab_attachments" title="Attachments"/> + <accordion_tab name="tab_clothing" title="Tøj"/> + <accordion_tab name="tab_body_parts" title="Kropsdele"/> + </accordion> +</panel> diff --git a/indra/newview/skins/default/xui/da/panel_deletable_wearable_list_item.xml b/indra/newview/skins/default/xui/da/panel_deletable_wearable_list_item.xml new file mode 100644 index 0000000000..91d90a5660 --- /dev/null +++ b/indra/newview/skins/default/xui/da/panel_deletable_wearable_list_item.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="deletable_wearable_item"> + <text name="item_name" value="..."/> +</panel> diff --git a/indra/newview/skins/default/xui/da/panel_dummy_clothing_list_item.xml b/indra/newview/skins/default/xui/da/panel_dummy_clothing_list_item.xml new file mode 100644 index 0000000000..6af84de0c7 --- /dev/null +++ b/indra/newview/skins/default/xui/da/panel_dummy_clothing_list_item.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="dummy_clothing_item"> + <text name="item_name" value="..."/> +</panel> diff --git a/indra/newview/skins/default/xui/da/panel_edit_classified.xml b/indra/newview/skins/default/xui/da/panel_edit_classified.xml index 18689105ae..7fb2f930fa 100644 --- a/indra/newview/skins/default/xui/da/panel_edit_classified.xml +++ b/indra/newview/skins/default/xui/da/panel_edit_classified.xml @@ -3,12 +3,20 @@ <panel.string name="location_notice"> (vil blive opdateret efter gemning) </panel.string> + <string name="publish_label"> + Publicér + </string> + <string name="save_label"> + Gem + </string> <text name="title"> Rediger annonce </text> <scroll_container name="profile_scroll"> <panel name="scroll_content_panel"> - <icon label="" name="edit_icon" tool_tip="Klik for at forstørre billede"/> + <panel name="snapshot_panel"> + <icon label="" name="edit_icon" tool_tip="Klik for at vælge et billede"/> + </panel> <text name="Name:"> Titel: </text> @@ -22,12 +30,19 @@ henter... </text> <button label="Sæt til nuværende lokation" name="set_to_curr_location_btn"/> + <text name="category_label" value="Kategori:"/> + <text name="content_type_label" value="Indholdstype:"/> + <icons_combo_box label="Generelt" name="content_type"> + <icons_combo_box.item label="Moderat" name="mature_ci" value="Voksent"/> + <icons_combo_box.item label="Generelt" name="pg_ci" value="PG"/> + </icons_combo_box> + <text name="price_for_listing_label" value="Pris for optagelse:"/> <spinner label="L$" name="price_for_listing" tool_tip="Pris for optagelse." value="50"/> <check_box label="Forny automatisk hver uge" name="auto_renew"/> </panel> </scroll_container> <panel label="bottom_panel" name="bottom_panel"> - <button label="Gem" name="save_changes_btn"/> + <button label="[LABEL]" name="save_changes_btn"/> <button label="Annullér" name="cancel_btn"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_edit_eyes.xml b/indra/newview/skins/default/xui/da/panel_edit_eyes.xml index 9c0d77c370..d801118cea 100644 --- a/indra/newview/skins/default/xui/da/panel_edit_eyes.xml +++ b/indra/newview/skins/default/xui/da/panel_edit_eyes.xml @@ -3,7 +3,9 @@ <panel name="avatar_eye_color_panel"> <texture_picker label="Iris" name="Iris" tool_tip="Klik for at vælge billede"/> </panel> - <accordion name="wearable_accordion"> - <accordion_tab name="eyes_main_tab" title="Øjne"/> - </accordion> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="eyes_main_tab" title="Øjne"/> + </accordion> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_edit_gloves.xml b/indra/newview/skins/default/xui/da/panel_edit_gloves.xml index 1d3ba061bc..837abdac80 100644 --- a/indra/newview/skins/default/xui/da/panel_edit_gloves.xml +++ b/indra/newview/skins/default/xui/da/panel_edit_gloves.xml @@ -4,7 +4,9 @@ <texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge bilede"/> <color_swatch label="Farve/nuance" name="Color/Tint" tool_tip="Klik for at Ã¥bne farvevælger"/> </panel> - <accordion name="wearable_accordion"> - <accordion_tab name="gloves_main_tab" title="Handsker"/> - </accordion> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="gloves_main_tab" title="Handsker"/> + </accordion> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_edit_hair.xml b/indra/newview/skins/default/xui/da/panel_edit_hair.xml index 14511d51d5..e91e6324e8 100644 --- a/indra/newview/skins/default/xui/da/panel_edit_hair.xml +++ b/indra/newview/skins/default/xui/da/panel_edit_hair.xml @@ -3,10 +3,12 @@ <panel name="avatar_hair_color_panel"> <texture_picker label="Tekstur" name="Texture" tool_tip="Klik for at vælge et billede"/> </panel> - <accordion name="wearable_accordion"> - <accordion_tab name="hair_color_tab" title="Farve"/> - <accordion_tab name="hair_style_tab" title="Stil"/> - <accordion_tab name="hair_eyebrows_tab" title="Øjenbryn"/> - <accordion_tab name="hair_facial_tab" title="Skæg"/> - </accordion> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="hair_color_tab" title="Farve"/> + <accordion_tab name="hair_style_tab" title="Stil"/> + <accordion_tab name="hair_eyebrows_tab" title="Øjenbryn"/> + <accordion_tab name="hair_facial_tab" title="Ansigt"/> + </accordion> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_edit_jacket.xml b/indra/newview/skins/default/xui/da/panel_edit_jacket.xml index 4c9973c0bd..62934e96c8 100644 --- a/indra/newview/skins/default/xui/da/panel_edit_jacket.xml +++ b/indra/newview/skins/default/xui/da/panel_edit_jacket.xml @@ -5,7 +5,9 @@ <texture_picker label="Stof forneden" name="Lower Fabric" tool_tip="Klik for at vælge et billede"/> <color_swatch label="Farve/nuance" name="Color/Tint" tool_tip="Klik for at Ã¥bne farvevælger"/> </panel> - <accordion name="wearable_accordion"> - <accordion_tab name="jacket_main_tab" title="Jakke"/> - </accordion> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="jacket_main_tab" title="Jakke"/> + </accordion> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_edit_pants.xml b/indra/newview/skins/default/xui/da/panel_edit_pants.xml index bcb1450258..36a9bc60a9 100644 --- a/indra/newview/skins/default/xui/da/panel_edit_pants.xml +++ b/indra/newview/skins/default/xui/da/panel_edit_pants.xml @@ -4,7 +4,9 @@ <texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge et bilede"/> <color_swatch label="Farve/Nuance" name="Color/Tint" tool_tip="Klik for at Ã¥bne farvevælger"/> </panel> - <accordion name="wearable_accordion"> - <accordion_tab name="pants_main_tab" title="Bukser"/> - </accordion> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="pants_main_tab" title="Bukser"/> + </accordion> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_edit_pick.xml b/indra/newview/skins/default/xui/da/panel_edit_pick.xml index 41db2be5e8..dcc4e7a4b6 100644 --- a/indra/newview/skins/default/xui/da/panel_edit_pick.xml +++ b/indra/newview/skins/default/xui/da/panel_edit_pick.xml @@ -1,5 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Redigér Pick" name="panel_edit_pick"> + <panel.string name="location_notice"> + (vil blive opdateret ved gemning) + </panel.string> <text name="title"> Redigér favorit </text> @@ -22,7 +25,7 @@ </panel> </scroll_container> <panel label="bottom_panel" name="bottom_panel"> - <button label="Gem [WHAT]" name="save_changes_btn"/> + <button label="Gem favorit Pick" name="save_changes_btn"/> <button label="Annullér" name="cancel_btn"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_edit_profile.xml b/indra/newview/skins/default/xui/da/panel_edit_profile.xml index d3cfdbba52..85461e23a7 100644 --- a/indra/newview/skins/default/xui/da/panel_edit_profile.xml +++ b/indra/newview/skins/default/xui/da/panel_edit_profile.xml @@ -35,9 +35,12 @@ </text> <check_box label="Vis mig i søgeresultater" name="show_in_search_checkbox"/> <text name="title_acc_status_text" value="Min konto:"/> + <text_editor name="acc_status_text" value="Beboer. Ingen betalingsinfo."/> <text name="my_account_link" value="[[URL] Go to My Dashboard]"/> - <text name="acc_status_text" value="Beboer. Ingen betalingsinfo."/> <text name="title_partner_text" value="Min partner:"/> + <panel name="partner_data_panel"> + <name_box initial_value="(henter)" name="partner_text"/> + </panel> <text name="partner_edit_link" value="[[URL] Edit]"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_edit_shape.xml b/indra/newview/skins/default/xui/da/panel_edit_shape.xml index 19c27748ca..4360fe35f5 100644 --- a/indra/newview/skins/default/xui/da/panel_edit_shape.xml +++ b/indra/newview/skins/default/xui/da/panel_edit_shape.xml @@ -1,23 +1,19 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="edit_shape_panel"> - <panel name="avatar_sex_panel"> - <text name="gender_text"> - Køn: - </text> - <radio_group name="sex_radio"> - <radio_item label="Kvinde" name="radio"/> - <radio_item label="Mand" name="radio2"/> - </radio_group> + <text name="avatar_height"> + [HEIGHT] meter høj + </text> + <panel label="Trøje" name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="shape_body_tab" title="Krop"/> + <accordion_tab name="shape_head_tab" title="Hoved"/> + <accordion_tab name="shape_eyes_tab" title="Øjne"/> + <accordion_tab name="shape_ears_tab" title="Ører"/> + <accordion_tab name="shape_nose_tab" title="Næse"/> + <accordion_tab name="shape_mouth_tab" title="Mund"/> + <accordion_tab name="shape_chin_tab" title="Hage"/> + <accordion_tab name="shape_torso_tab" title="Overkrop"/> + <accordion_tab name="shape_legs_tab" title="Ben"/> + </accordion> </panel> - <accordion name="wearable_accordion"> - <accordion_tab name="shape_body_tab" title="Krop"/> - <accordion_tab name="shape_head_tab" title="Hoved"/> - <accordion_tab name="shape_eyes_tab" title="Øjne"/> - <accordion_tab name="shape_ears_tab" title="Ører"/> - <accordion_tab name="shape_nose_tab" title="Næse"/> - <accordion_tab name="shape_mouth_tab" title="Mund"/> - <accordion_tab name="shape_chin_tab" title="Hage"/> - <accordion_tab name="shape_torso_tab" title="Overkrop"/> - <accordion_tab name="shape_legs_tab" title="Ben"/> - </accordion> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_edit_shirt.xml b/indra/newview/skins/default/xui/da/panel_edit_shirt.xml index cd2e8d8cb3..e49667dc8f 100644 --- a/indra/newview/skins/default/xui/da/panel_edit_shirt.xml +++ b/indra/newview/skins/default/xui/da/panel_edit_shirt.xml @@ -4,7 +4,9 @@ <texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge et billede"/> <color_swatch label="Farve/Nuance" name="Color/Tint" tool_tip="Klik for at Ã¥bne farvevælger"/> </panel> - <accordion name="wearable_accordion"> - <accordion_tab name="shirt_main_tab" title="Trøje"/> - </accordion> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="shirt_main_tab" title="Trøje"/> + </accordion> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_edit_shoes.xml b/indra/newview/skins/default/xui/da/panel_edit_shoes.xml index 54a0cc01a4..00d31da95a 100644 --- a/indra/newview/skins/default/xui/da/panel_edit_shoes.xml +++ b/indra/newview/skins/default/xui/da/panel_edit_shoes.xml @@ -4,7 +4,9 @@ <texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge et billede"/> <color_swatch label="Farve/nuance" name="Color/Tint" tool_tip="Klik for at Ã¥bne farvevælger"/> </panel> - <accordion name="wearable_accordion"> - <accordion_tab name="shoes_main_tab" title="Sko"/> - </accordion> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="shoes_main_tab" title="Shoes"/> + </accordion> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_edit_skin.xml b/indra/newview/skins/default/xui/da/panel_edit_skin.xml index 46dce354a9..608e1d6e0b 100644 --- a/indra/newview/skins/default/xui/da/panel_edit_skin.xml +++ b/indra/newview/skins/default/xui/da/panel_edit_skin.xml @@ -5,10 +5,12 @@ <texture_picker label="Øvre tatoveringer" name="Upper Tattoos" tool_tip="Klik for at vælge et bilede"/> <texture_picker label="Nedre tatoveringer" name="Lower Tattoos" tool_tip="Klik for at vælge et bilede"/> </panel> - <accordion name="wearable_accordion"> - <accordion_tab name="skin_color_tab" title="Hudfarve"/> - <accordion_tab name="skin_face_tab" title="Ansigtsdetaljer"/> - <accordion_tab name="skin_makeup_tab" title="Makeup"/> - <accordion_tab name="skin_body_tab" title="Kropsdetaljer"/> - </accordion> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="skin_color_tab" title="Hudfarve"/> + <accordion_tab name="skin_face_tab" title="Ansigtsdetaljer"/> + <accordion_tab name="skin_makeup_tab" title="Makeup"/> + <accordion_tab name="skin_body_tab" title="Kropsdetaljer"/> + </accordion> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_edit_skirt.xml b/indra/newview/skins/default/xui/da/panel_edit_skirt.xml index 4407c87d36..44a5beca45 100644 --- a/indra/newview/skins/default/xui/da/panel_edit_skirt.xml +++ b/indra/newview/skins/default/xui/da/panel_edit_skirt.xml @@ -4,7 +4,9 @@ <texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge et billede"/> <color_swatch label="Farve/Nuance" name="Color/Tint" tool_tip="Klik for at Ã¥bne farvevælger"/> </panel> - <accordion name="wearable_accordion"> - <accordion_tab name="skirt_main_tab" title="Nederdel"/> - </accordion> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="skirt_main_tab" title="Nederdel"/> + </accordion> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_edit_socks.xml b/indra/newview/skins/default/xui/da/panel_edit_socks.xml index 6ef6dad86c..b7abd9d1a0 100644 --- a/indra/newview/skins/default/xui/da/panel_edit_socks.xml +++ b/indra/newview/skins/default/xui/da/panel_edit_socks.xml @@ -4,7 +4,9 @@ <texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge et billede"/> <color_swatch label="Farve/Nuance" name="Color/Tint" tool_tip="Klik for at Ã¥bne farvevælger"/> </panel> - <accordion name="wearable_accordion"> - <accordion_tab name="socks_main_tab" title="Strømper"/> - </accordion> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="socks_main_tab" title="Strømper"/> + </accordion> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_edit_tattoo.xml b/indra/newview/skins/default/xui/da/panel_edit_tattoo.xml index 4a133d8693..d4a12209db 100644 --- a/indra/newview/skins/default/xui/da/panel_edit_tattoo.xml +++ b/indra/newview/skins/default/xui/da/panel_edit_tattoo.xml @@ -4,5 +4,6 @@ <texture_picker label="Hoved tatovering" name="Head Tattoo" tool_tip="Klik for at vælge et billede"/> <texture_picker label="Øvre tatovering" name="Upper Tattoo" tool_tip="Klik for at vælge et billede"/> <texture_picker label="Nedre tatovering" name="Lower Tattoo" tool_tip="Klik for at vælge et billede"/> + <color_swatch label="Farve/Nuance" name="Color/Tint" tool_tip="Klik for at Ã¥bne farvevælger"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_edit_underpants.xml b/indra/newview/skins/default/xui/da/panel_edit_underpants.xml index de52146e29..32596be57b 100644 --- a/indra/newview/skins/default/xui/da/panel_edit_underpants.xml +++ b/indra/newview/skins/default/xui/da/panel_edit_underpants.xml @@ -4,7 +4,9 @@ <texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge bilede"/> <color_swatch label="Farve/nuance" name="Color/Tint" tool_tip="Klik for at Ã¥bne farvevælger"/> </panel> - <accordion name="wearable_accordion"> - <accordion_tab name="underpants_main_tab" title="Underbukser"/> - </accordion> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="underpants_main_tab" title="Underbukser"/> + </accordion> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_edit_undershirt.xml b/indra/newview/skins/default/xui/da/panel_edit_undershirt.xml index 6c2e1f5833..14cf79b97f 100644 --- a/indra/newview/skins/default/xui/da/panel_edit_undershirt.xml +++ b/indra/newview/skins/default/xui/da/panel_edit_undershirt.xml @@ -4,7 +4,9 @@ <texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge bilede"/> <color_swatch label="Farve/nuance" name="Color/Tint" tool_tip="Klik for at Ã¥bne farvevælger"/> </panel> - <accordion name="wearable_accordion"> - <accordion_tab name="undershirt_main_tab" title="Undertrøje"/> - </accordion> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="undershirt_main_tab" title="Undertrøje"/> + </accordion> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_edit_wearable.xml b/indra/newview/skins/default/xui/da/panel_edit_wearable.xml index 12bc120c45..8e6990fe31 100644 --- a/indra/newview/skins/default/xui/da/panel_edit_wearable.xml +++ b/indra/newview/skins/default/xui/da/panel_edit_wearable.xml @@ -93,6 +93,17 @@ <text name="edit_wearable_title" value="Redigerer kropsbygning"/> <panel label="Trøje" name="wearable_type_panel"> <text name="description_text" value="Kropsbygning:"/> + <radio_group name="sex_radio"> + <radio_item label="" name="sex_male" tool_tip="Mand" value="1"/> + <radio_item label="" name="sex_female" tool_tip="Kvinde" value="0"/> + </radio_group> + <icon name="male_icon" tool_tip="Mandlig"/> + <icon name="female_icon" tool_tip="Kvindelig"/> + </panel> + <panel label="gear_buttom_panel" name="gear_buttom_panel"> + <button name="friends_viewsort_btn" tool_tip="Valg"/> + <button name="add_btn" tool_tip="TODO"/> + <button name="del_btn" tool_tip="TODO"/> </panel> <panel name="button_panel"> <button label="Gem som" name="save_as_button"/> diff --git a/indra/newview/skins/default/xui/da/panel_friends.xml b/indra/newview/skins/default/xui/da/panel_friends.xml index a41eaf20c1..a1a25bdc77 100644 --- a/indra/newview/skins/default/xui/da/panel_friends.xml +++ b/indra/newview/skins/default/xui/da/panel_friends.xml @@ -16,5 +16,5 @@ <button label="Teleport" name="offer_teleport_btn" tool_tip="Tilbyd denne ven at blive teleporteret til din nuværende position"/> <button label="Betal" name="pay_btn" tool_tip="Giv Linden dollars (L$) til denne ven"/> <button label="Fjern" name="remove_btn" tool_tip="Fjern denne beboer fra din venneliste"/> - <button label="Tilføj" name="add_btn" tool_tip="Tilbyd venskab til denne beboer"/> + <button label="Tilføj" name="add_btn" tool_tip="Tilbyd venskab til en beboer"/> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_group_control_panel.xml b/indra/newview/skins/default/xui/da/panel_group_control_panel.xml index 1db2db45af..26fe4f6ebe 100644 --- a/indra/newview/skins/default/xui/da/panel_group_control_panel.xml +++ b/indra/newview/skins/default/xui/da/panel_group_control_panel.xml @@ -1,9 +1,17 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="panel_im_control_panel"> - <button label="Group Profile" name="group_info_btn"/> - <panel name="panel_call_buttons"> - <button label="Opkaldsgruppe" name="call_btn"/> - <button label="Forlad samtale" name="end_call_btn"/> - <button label="Kontroller for Ã¥ben stemmechat" name="voice_ctrls_btn"/> - </panel> + <layout_stack name="vertical_stack"> + <layout_panel name="group_info_btn_panel"> + <button label="Gruppe profil" name="group_info_btn"/> + </layout_panel> + <layout_panel name="call_btn_panel"> + <button label="Opkald gruppe" name="call_btn"/> + </layout_panel> + <layout_panel name="end_call_btn_panel"> + <button label="Forlad opkald" name="end_call_btn"/> + </layout_panel> + <layout_panel name="voice_ctrls_btn_panel"> + <button label="Ã…ben stemmekontroller" name="voice_ctrls_btn"/> + </layout_panel> + </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_group_general.xml b/indra/newview/skins/default/xui/da/panel_group_general.xml index ec957e6094..3079a23d20 100644 --- a/indra/newview/skins/default/xui/da/panel_group_general.xml +++ b/indra/newview/skins/default/xui/da/panel_group_general.xml @@ -9,26 +9,47 @@ <panel.string name="incomplete_member_data_str"> Henter medlemsinformationer </panel.string> + <panel name="group_info_top"> + <texture_picker label="" name="insignia" tool_tip="Klik for at vælge et billede"/> + <text name="prepend_founded_by"> + Grundlagt af: + </text> + <name_box initial_value="(henter)" name="founder_name"/> + <text name="join_cost_text"> + Gratis + </text> + <button label="TILMELD NU!" name="btn_join"/> + </panel> <text_editor name="charter"> Gruppens formÃ¥l </text_editor> <name_list name="visible_members"> <name_list.columns label="Medlem" name="name"/> <name_list.columns label="Titel" name="title"/> + <name_list.columns label="Status" name="status"/> </name_list> + <text name="my_group_settngs_label"> + MeMig + </text> <text name="active_title_label"> - Min titel + Min titel: </text> <combo_box name="active_title" tool_tip="Angiver den titel der vises i din avatars navnefelt, nÃ¥r denne gruppe er aktiv"/> <check_box label="Modtag gruppeinformationer" name="receive_notices" tool_tip="Angiver om du vil modtage informationer fra denne gruppe. Fjern markeringen i boksen hvis gruppen spammer dig."/> <check_box label="Vis gruppen i min profil" name="list_groups_in_profile" tool_tip="Angiver om du vil vise denne gruppe i dine profilinformationer"/> <panel name="preferences_container"> + <text name="group_settngs_label"> + Gruppe + </text> <check_box label="Ã…ben tilmelding" name="open_enrollement" tool_tip="Angiver om denne gruppe tillader nye medlemmer at tilmelde sig, uden de er inviteret."/> <check_box label="Tilmeldingsgebyr" name="check_enrollment_fee" tool_tip="Angiver om der kræves et gebyr, for at tilmelde sig gruppen"/> <spinner label="L$" left_delta="130" name="spin_enrollment_fee" tool_tip="Nye medlemmer skal betale dette gebyr for at tilmelde sig gruppen, nÃ¥r "Tilmeldingsgebyr" er valgt." width="60"/> <combo_box name="group_mature_check" tool_tip="Angiver om din gruppes information anses som 'mature'." width="150"> - <combo_box.item label="PG indhold" name="pg"/> + <combo_item name="select_mature"> + - Vælg Mature - + </combo_item> <combo_box.item label="Mature indhold" name="mature"/> + <combo_box.item label="PG indhold" name="pg"/> </combo_box> <check_box initial_value="true" label="Vis i søgning" name="show_in_group_list" tool_tip="Lad folk se denne gruppe i søgeresultater."/> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/da/panel_group_info_sidetray.xml index 9940ebbd4d..a7aa842439 100644 --- a/indra/newview/skins/default/xui/da/panel_group_info_sidetray.xml +++ b/indra/newview/skins/default/xui/da/panel_group_info_sidetray.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Gruppe info" name="GroupInfo"> +<panel label="Gruppe profil" name="GroupInfo"> <panel.string name="default_needs_apply_text"> - Der er ændringer pÃ¥ denne fane der ikke er gemt + Der er ændringer der ikke er gemt </panel.string> <panel.string name="want_apply_text"> Ønsker du at gemme disse ændringer? @@ -12,25 +12,24 @@ <panel.string name="group_join_free"> Gratis </panel.string> - <text name="group_name" value="(Henter...)"/> - <line_editor label="Indtast dit nye gruppenavn her" name="group_name_editor"/> - <texture_picker label="" name="insignia" tool_tip="Klik for at vælge bilede"/> - <text name="prepend_founded_by"> - Grundlægger: - </text> - <name_box initial_value="(finder)" name="founder_name"/> - <text name="join_cost_text"> - Gratis - </text> - <button label="MELD IND NU!" name="btn_join"/> - <accordion name="groups_accordion"> - <accordion_tab name="group_general_tab" title="Generelt"/> - <accordion_tab name="group_roles_tab" title="Roller"/> - <accordion_tab name="group_notices_tab" title="Beskeder"/> - <accordion_tab name="group_land_tab" title="Land/Aktiver"/> - </accordion> - <panel name="button_row"> - <button label="Lav" label_selected="Ny gruppe" name="btn_create"/> - <button label="Gem" label_selected="Gem" name="btn_apply"/> + <panel name="group_info_top"> + <text name="group_name" value="(Henter...)"/> + <line_editor label="Indtast nyt gruppenavn her" name="group_name_editor"/> </panel> + <layout_stack name="layout"> + <layout_panel name="group_accordions"> + <accordion name="groups_accordion"> + <accordion_tab name="group_general_tab" title="Generelt"/> + <accordion_tab name="group_roles_tab" title="Roller"/> + <accordion_tab name="group_notices_tab" title="Noter"/> + <accordion_tab name="group_land_tab" title="Land/Aktiver"/> + </accordion> + </layout_panel> + <layout_panel name="button_row"> + <button label="Chat" name="btn_chat"/> + <button label="Gruppeopkald" name="btn_call" tool_tip="Opkald til denne gruppe"/> + <button label="Gem" label_selected="Save" name="btn_apply"/> + <button label="Opret gruppe" name="btn_create" tool_tip="Opret en ny gruppe"/> + </layout_panel> + </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_group_invite.xml b/indra/newview/skins/default/xui/da/panel_group_invite.xml index 1e00642c29..49daf6c9f2 100644 --- a/indra/newview/skins/default/xui/da/panel_group_invite.xml +++ b/indra/newview/skins/default/xui/da/panel_group_invite.xml @@ -7,17 +7,14 @@ (indlæser...) </panel.string> <panel.string name="already_in_group"> - Nogen af avatarerne var allerede i gruppen og blev ikke inviteret + Nogle af de beboere du vælger er allerede i gruppen, sÃ¥ de fÃ¥r ikke tilsendt en invitation. </panel.string> <text name="help_text"> - Du kan invitere flere beboere ad -gangen til at blive medlem af din -gruppe. Klik 'Ã…ben personvælger' for -at begynde. + Du kan invitere flere beboere ad gangen til at blive medlem af din gruppe. Klik 'Ã…ben personvælger' for at begynde. </text> <button bottom_delta="-30" label="Ã…ben personvælger" name="add_button"/> - <name_list name="invitee_list" tool_tip="Hold Ctrl knappen nede og klik pÃ¥ beboer navne for at vælge flere"/> - <button label="Fjern valgte fra listen" name="remove_button" tool_tip="Fjern beboere valgt ovenfor fra invitationslisten"/> + <name_list name="invitee_list" tool_tip="Hold Ctrl-tasten nede og klik pÃ¥ beboere for at vælge flere."/> + <button label="Fjern valgte fra listen" name="remove_button" tool_tip="Fjerner beboere, der er valgt pÃ¥ ovenstÃ¥ende invitationsliste."/> <text name="role_text"> Vælg hvilken rolle, du vil tildele dem: </text> diff --git a/indra/newview/skins/default/xui/da/panel_group_land_money.xml b/indra/newview/skins/default/xui/da/panel_group_land_money.xml index c73d7c807d..efad4d0c34 100644 --- a/indra/newview/skins/default/xui/da/panel_group_land_money.xml +++ b/indra/newview/skins/default/xui/da/panel_group_land_money.xml @@ -1,65 +1,65 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Land & L$" name="land_money_tab"> - <string name="help_text"> + <panel.string name="help_text"> En advarsel vises indtil Total land i brug er mindre end eller lig med det totale bidrag. - </string> - <button label="?" name="help_button"/> - <string name="cant_view_group_land_text"> + </panel.string> + <panel.string name="cant_view_group_land_text"> Du har ikke tilladelse til at se gruppeejet land. - </string> - <string name="cant_view_group_accounting_text"> + </panel.string> + <panel.string name="epmty_view_group_land_text"> + Intet indhold + </panel.string> + <panel.string name="cant_view_group_accounting_text"> Du har ikke tilladelse til at se gruppens økonomiinformationer. - </string> - <string name="loading_txt"> + </panel.string> + <panel.string name="loading_txt"> Indlæser... - </string> - <text name="group_land_heading"> - Gruppeejet land - </text> - <scroll_list name="group_parcel_list"> - <column label="Parcel" name="name"/> - <column label="Region" name="location"/> - <column label="Type" name="type"/> - <column label="OmrÃ¥de" name="area"/> - <column label="" name="hidden"/> - </scroll_list> - <button label="Kort" label_selected="Kort" name="map_button"/> - <text name="total_contributed_land_label"> - Totalt bidrag: - </text> - <text name="total_contributed_land_value"> - [AREA] m² - </text> - <text name="total_land_in_use_label"> - Totalt land i brug: - </text> - <text name="total_land_in_use_value"> - [AREA] m² - </text> - <text name="land_available_label"> - Ledigt land: - </text> - <text name="land_available_value"> - [AREA] m² - </text> - <text name="your_contribution_label"> - Dit bidrag: - </text> - <string name="land_contrib_error"> + </panel.string> + <panel.string name="land_contrib_error"> Ikke muligt at lave dit bidrag til landet - </string> - <text name="your_contribution_units"> - m² - </text> - <text name="your_contribution_max_value"> - ([AMOUNT] maks.) - </text> - <text name="group_over_limit_text"> - Gruppemedlemmer mÃ¥ bidrag med mere, for at understøtte med det land der bliver brugt - </text> - <text name="group_money_heading"> - Gruppe L$ - </text> + </panel.string> + <panel name="layout_panel_landmoney"> + <scroll_list name="group_parcel_list"> + <scroll_list.columns label="Parcel" name="name"/> + <scroll_list.columns label="Region" name="location"/> + <scroll_list.columns label="Type" name="type"/> + <scroll_list.columns label="Areal" name="area"/> + </scroll_list> + <text name="total_contributed_land_label"> + Totalt bidrag: + </text> + <text name="total_contributed_land_value"> + [AREA] m² + </text> + <button label="Kort" label_selected="Kort" name="map_button"/> + <text name="total_land_in_use_label"> + Totalt land i brug: + </text> + <text name="total_land_in_use_value"> + [AREA] m² + </text> + <text name="land_available_label"> + Land tilgængelgt: + </text> + <text name="land_available_value"> + [AREA] m² + </text> + <text name="your_contribution_label"> + Dit bidrag: + </text> + <text name="your_contribution_units"> + m² + </text> + <text name="your_contribution_max_value"> + ([BELØB] maks.) + </text> + <text name="group_over_limit_text"> + Der kræves flere penge for at supportere det land der er i brug + </text> + <text name="group_money_heading"> + Gruppe L$ + </text> + </panel> <tab_container name="group_money_tab_container"> <panel label="PLANLÆGNING" name="group_money_planning_tab"> <text_editor name="group_money_planning_text"> diff --git a/indra/newview/skins/default/xui/da/panel_group_list_item.xml b/indra/newview/skins/default/xui/da/panel_group_list_item.xml index bfffdccc5e..e77e548340 100644 --- a/indra/newview/skins/default/xui/da/panel_group_list_item.xml +++ b/indra/newview/skins/default/xui/da/panel_group_list_item.xml @@ -1,4 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="group_list_item"> <text name="group_name" value="Ukendt"/> + <button name="profile_btn" tool_tip="Se profil"/> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_group_notices.xml b/indra/newview/skins/default/xui/da/panel_group_notices.xml index ec503c37dc..d8e8cb3c2a 100644 --- a/indra/newview/skins/default/xui/da/panel_group_notices.xml +++ b/indra/newview/skins/default/xui/da/panel_group_notices.xml @@ -42,7 +42,8 @@ Maksimum er 200 pr. gruppe pr. dag <text name="string"> Træk og slip en gensand for at vedhæfte den: </text> - <button label="Fjern" label_selected="Fjern bilag" name="remove_attachment"/> + <button label="Beholdning" name="open_inventory" tool_tip="Ã…ben beholdning"/> + <button label="Fjern" label_selected="Fjern bilag" name="remove_attachment" tool_tip="Fjern vedhæng fra din note"/> <button label="Send" label_selected="Send" name="send_notice"/> <group_drop_target name="drop_target" tool_tip="Træk en genstand fra din beholdning til dette felt for at sende den med denne besked. Du skal have rettigheder til at kopiere og overdrage denne genstand for at kunne vedhæfte den."/> </panel> @@ -59,6 +60,6 @@ Maksimum er 200 pr. gruppe pr. dag <text name="lbl4"> Besked: </text> - <button label="Ã…ben bilag" label_selected="Ã¥ben bilag" name="open_attachment"/> + <button label="Ã…ben vedhæng" label_selected="Ã¥ben bilag" name="open_attachment"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_group_notify.xml b/indra/newview/skins/default/xui/da/panel_group_notify.xml index 43a84298e2..8a684ca031 100644 --- a/indra/newview/skins/default/xui/da/panel_group_notify.xml +++ b/indra/newview/skins/default/xui/da/panel_group_notify.xml @@ -4,5 +4,5 @@ <text name="title" value="Afsender navn / Gruppe navn"/> </panel> <text name="attachment" value="Bilag"/> - <button label="Ok" name="btn_ok"/> + <button label="OK" name="btn_ok"/> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_group_roles.xml b/indra/newview/skins/default/xui/da/panel_group_roles.xml index 74bea831fb..3ab3dd8bf8 100644 --- a/indra/newview/skins/default/xui/da/panel_group_roles.xml +++ b/indra/newview/skins/default/xui/da/panel_group_roles.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Medlemmer & roller" name="roles_tab"> <panel.string name="default_needs_apply_text"> - Der er ændringer her, der ikke er gemt. + Der er ændringer som ikke er gemt </panel.string> <panel.string name="want_apply_text"> Vil du gemme disse ændringer? @@ -58,7 +58,7 @@ ting i denne gruppe. Der er en bred vifte af rettigheder. </tab_container> <panel name="members_footer"> <text name="static"> - Medlemmer + Tildelte roller </text> <scroll_list name="member_assigned_roles"> <scroll_list.columns label="" name="checkbox"/> diff --git a/indra/newview/skins/default/xui/da/panel_im_control_panel.xml b/indra/newview/skins/default/xui/da/panel_im_control_panel.xml index 0384652e5d..5cecb93d40 100644 --- a/indra/newview/skins/default/xui/da/panel_im_control_panel.xml +++ b/indra/newview/skins/default/xui/da/panel_im_control_panel.xml @@ -1,13 +1,29 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="panel_im_control_panel"> - <text name="avatar_name" value="Ukendt"/> - <button label="Profil" name="view_profile_btn"/> - <button label="Tilføj ven" name="add_friend_btn"/> - <button label="Teleportér" name="teleport_btn"/> - <button label="Del" name="share_btn"/> - <panel name="panel_call_buttons"> - <button label="Opkald" name="call_btn"/> - <button label="Læg pÃ¥" name="end_call_btn"/> - <button label="Stemme opsætning" name="voice_ctrls_btn"/> - </panel> + <layout_stack name="button_stack"> + <layout_panel name="view_profile_btn_panel"> + <button label="Profil" name="view_profile_btn"/> + </layout_panel> + <layout_panel name="add_friend_btn_panel"> + <button label="Tilføj ven" name="add_friend_btn"/> + </layout_panel> + <layout_panel name="teleport_btn_panel"> + <button label="Teleport" name="teleport_btn" tool_tip="Tilbyd teleport til denne person"/> + </layout_panel> + <layout_panel name="share_btn_panel"> + <button label="Del" name="share_btn"/> + </layout_panel> + <layout_panel name="pay_btn_panel"> + <button label="Betal" name="pay_btn"/> + </layout_panel> + <layout_panel name="call_btn_panel"> + <button label="Opkald" name="call_btn"/> + </layout_panel> + <layout_panel name="end_call_btn_panel"> + <button label="Afslut kald" name="end_call_btn"/> + </layout_panel> + <layout_panel name="voice_ctrls_btn_panel"> + <button label="Stemme kontroller" name="voice_ctrls_btn"/> + </layout_panel> + </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_inventory_item.xml b/indra/newview/skins/default/xui/da/panel_inventory_item.xml new file mode 100644 index 0000000000..d18047fbcf --- /dev/null +++ b/indra/newview/skins/default/xui/da/panel_inventory_item.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="inventory_item"> + <text name="item_name" value="..."/> +</panel> diff --git a/indra/newview/skins/default/xui/da/panel_landmark_info.xml b/indra/newview/skins/default/xui/da/panel_landmark_info.xml index 202a4d4664..8503a41763 100644 --- a/indra/newview/skins/default/xui/da/panel_landmark_info.xml +++ b/indra/newview/skins/default/xui/da/panel_landmark_info.xml @@ -18,6 +18,7 @@ <string name="acquired_date"> [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local] </string> + <button name="back_btn" tool_tip="Tilbage"/> <text name="title" value="Sted profil"/> <scroll_container name="place_scroll"> <panel name="scrolling_panel"> diff --git a/indra/newview/skins/default/xui/da/panel_landmarks.xml b/indra/newview/skins/default/xui/da/panel_landmarks.xml index 47487832cb..9a0a2fb207 100644 --- a/indra/newview/skins/default/xui/da/panel_landmarks.xml +++ b/indra/newview/skins/default/xui/da/panel_landmarks.xml @@ -1,8 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="Landmarks"> <accordion name="landmarks_accordion"> - <accordion_tab name="tab_favorites" title="Favorites bjælke"/> - <accordion_tab name="tab_landmarks" title="Landemærker"/> + <accordion_tab name="tab_favorites" title="Favoritter"/> + <accordion_tab name="tab_landmarks" title="Mine landmærker"/> <accordion_tab name="tab_inventory" title="Min beholdning"/> <accordion_tab name="tab_library" title="Bibliotek"/> </accordion> diff --git a/indra/newview/skins/default/xui/da/panel_login.xml b/indra/newview/skins/default/xui/da/panel_login.xml index c8c275d84d..d4bf9a7d78 100644 --- a/indra/newview/skins/default/xui/da/panel_login.xml +++ b/indra/newview/skins/default/xui/da/panel_login.xml @@ -1,5 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="panel_login"> + <panel.string name="create_account_url"> + http://join.secondlife.com/ + </panel.string> <panel.string name="real_url"> http://secondlife.com/app/login/ </panel.string> @@ -8,24 +11,31 @@ </panel.string> <layout_stack name="login_widgets"> <layout_panel name="login"> - <text name="first_name_text"> - Fornavn: + <text name="username_text"> + Brugernavn: + </text> + <line_editor label="Brugernavn" name="username_edit" tool_tip="[SECOND_LIFE] Brugernavn"/> + <text name="password_text"> + Password: </text> - <line_editor label="Fornavn" name="first_name_edit" tool_tip="[SECOND_LIFE] First Name"/> - <line_editor label="Efternavn" name="last_name_edit" tool_tip="[SECOND_LIFE] Last Name"/> - <check_box label="Husk" name="remember_check"/> + <check_box label="Husk password" name="remember_check"/> + <button label="Log pÃ¥" name="connect_btn"/> <text name="start_location_text"> Start ved: </text> <combo_box name="start_location_combo"> + <combo_box.item label="Min sidste lokation" name="MyLastLocation"/> <combo_box.item label="Hjem" name="MyHome"/> + <combo_box.item label="<Indtast regionnavn>" name="Typeregionname"/> </combo_box> - <button label="Log pÃ¥" name="connect_btn"/> </layout_panel> <layout_panel name="links"> <text name="create_new_account_text"> Opret bruger </text> + <text name="forgot_password_text"> + Glemt navn eller password? + </text> <text name="login_help"> Hjælp til login </text> diff --git a/indra/newview/skins/default/xui/da/panel_main_inventory.xml b/indra/newview/skins/default/xui/da/panel_main_inventory.xml index ac3a2844db..d6406939c1 100644 --- a/indra/newview/skins/default/xui/da/panel_main_inventory.xml +++ b/indra/newview/skins/default/xui/da/panel_main_inventory.xml @@ -1,64 +1,28 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Ting" name="main inventory panel"> - <panel.string name="Title"> - Ting + <panel.string name="ItemcountFetching"> + Henter [ITEM_COUNT] Genstande... [FILTER] </panel.string> + <panel.string name="ItemcountCompleted"> + [ITEM_COUNT] Genstande [FILTER] + </panel.string> + <text name="ItemcountText"> + Genstande: + </text> <filter_editor label="Filter" name="inventory search editor"/> <tab_container name="inventory filter tabs"> <inventory_panel label="Alle ting" name="All Items"/> - <inventory_panel label="Nye ting" name="Recent Items"/> + <recent_inventory_panel label="Nye ting" name="Recent Items"/> </tab_container> - <panel name="bottom_panel"> - <button name="options_gear_btn" tool_tip="Vis flere valgmuligheder"/> - <button name="add_btn" tool_tip="Opret ny genstand"/> - <dnd_button name="trash_btn" tool_tip="Fjern valgt genstand"/> - </panel> - <menu_bar name="Inventory Menu"> - <menu label="Filer" name="File"> - <menu_item_call label="Ã…ben" name="Open"/> - <menu label="Send fil" name="upload"> - <menu_item_call label="Billede (L$[COST])..." name="Upload Image"/> - <menu_item_call label="Lyd (L$[COST])..." name="Upload Sound"/> - <menu_item_call label="Animation (L$[COST])..." name="Upload Animation"/> - <menu_item_call label="Flere filer (L$[COST] pr. fil)..." name="Bulk Upload"/> - </menu> - <menu_item_call label="Nyt vindue" name="New Window"/> - <menu_item_call label="Vis filtre" name="Show Filters"/> - <menu_item_call label="Nulstil filtre" name="Reset Current"/> - <menu_item_call label="Luk alle mapper" name="Close All Folders"/> - <menu_item_call label="Tøm papirkurv" name="Empty Trash"/> - <menu_item_call label="Tøm fundne genstande" name="Empty Lost And Found"/> - </menu> - <menu label="Opret" name="Create"> - <menu_item_call label="Ny mappe" name="New Folder"/> - <menu_item_call label="Nyt script" name="New Script"/> - <menu_item_call label="Ny note" name="New Note"/> - <menu_item_call label="Ny bevægelse" name="New Gesture"/> - <menu label="Nyt tøj" name="New Clothes"> - <menu_item_call label="Ny trøje" name="New Shirt"/> - <menu_item_call label="Nye bukser" name="New Pants"/> - <menu_item_call label="Nye sko" name="New Shoes"/> - <menu_item_call label="Nye strømper" name="New Socks"/> - <menu_item_call label="Ny jakke" name="New Jacket"/> - <menu_item_call label="Ny nederdel" name="New Skirt"/> - <menu_item_call label="Nye handsker" name="New Gloves"/> - <menu_item_call label="Ny undertrøje" name="New Undershirt"/> - <menu_item_call label="Nye underbukser" name="New Underpants"/> - <menu_item_call label="Nyt alpha lag" name="New Alpha"/> - <menu_item_call label="Ny tatovering" name="New Tattoo"/> - </menu> - <menu label="Nye kropsdele" name="New Body Parts"> - <menu_item_call label="Ny kropsbygning" name="New Shape"/> - <menu_item_call label="Ny hud" name="New Skin"/> - <menu_item_call label="Nyt hÃ¥r" name="New Hair"/> - <menu_item_call label="Nye øjne" name="New Eyes"/> - </menu> - </menu> - <menu label="Sortér" name="Sort"> - <menu_item_check label="Efter navn" name="By Name"/> - <menu_item_check label="Efter dato" name="By Date"/> - <menu_item_check label="Altid mapper efter navn" name="Folders Always By Name"/> - <menu_item_check label="System-mapper i toppen" name="System Folders To Top"/> - </menu> - </menu_bar> + <layout_stack name="bottom_panel"> + <layout_panel name="options_gear_btn_panel"> + <button name="options_gear_btn" tool_tip="Vis yderligere valg"/> + </layout_panel> + <layout_panel name="add_btn_panel"> + <button name="add_btn" tool_tip="Tilføj ny genstand"/> + </layout_panel> + <layout_panel name="trash_btn_panel"> + <dnd_button name="trash_btn" tool_tip="Fjern valgte genstand"/> + </layout_panel> + </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_me.xml b/indra/newview/skins/default/xui/da/panel_me.xml index 2cfd358d13..f98ced5f91 100644 --- a/indra/newview/skins/default/xui/da/panel_me.xml +++ b/indra/newview/skins/default/xui/da/panel_me.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Min profil" name="panel_me"> <tab_container name="tabs"> - <panel label="PROFIL" name="panel_profile"/> - <panel label="FAVORITTER" name="panel_picks"/> + <panel label="MIN PROFIL" name="panel_profile"/> + <panel label="MINE FAVORITTER" name="panel_picks"/> </tab_container> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_media_settings_general.xml b/indra/newview/skins/default/xui/da/panel_media_settings_general.xml index 7f1581888d..48f08b9dfd 100644 --- a/indra/newview/skins/default/xui/da/panel_media_settings_general.xml +++ b/indra/newview/skins/default/xui/da/panel_media_settings_general.xml @@ -4,16 +4,16 @@ Hjemmeside: </text> <text name="home_fails_whitelist_label"> - (Denne side optræder ikke i godkendte sider) + (Siden er ikke pÃ¥ listen med godkendte sider) </text> - <line_editor name="home_url" tool_tip="Hjemmesiden for kilden til dette media"/> + <line_editor name="home_url" tool_tip="Hjemmesiden for kilden til dette medie"/> <text name="preview_label"> Vis </text> <text name="current_url_label"> Nuværende side: </text> - <text name="current_url" tool_tip="Den nuværende hjemmeside for kilden til dette media" value=""/> + <text name="current_url" tool_tip="Nuværende side for kilden til dett medie" value=""/> <button label="Nulstil" name="current_url_reset_btn"/> <check_box initial_value="false" label="Gentag afspil" name="auto_loop"/> <check_box initial_value="false" label="Første klik medfører interaktion" name="first_click_interact"/> diff --git a/indra/newview/skins/default/xui/da/panel_media_settings_permissions.xml b/indra/newview/skins/default/xui/da/panel_media_settings_permissions.xml index 70570920cd..84468eb2a7 100644 --- a/indra/newview/skins/default/xui/da/panel_media_settings_permissions.xml +++ b/indra/newview/skins/default/xui/da/panel_media_settings_permissions.xml @@ -11,10 +11,19 @@ Mini </combo_item> </combo_box> + <text name="owner_label"> + Ejer + </text> <check_box initial_value="false" label="Tillad navigation og interaktion" name="perms_owner_interact"/> <check_box initial_value="false" label="Vis kontrol bjælke" name="perms_owner_control"/> + <text name="group_label"> + Gruppe: + </text> <check_box initial_value="false" label="Tillad navigation og interaktion" name="perms_group_interact"/> <check_box initial_value="false" label="Vis kontrol bjælke" name="perms_group_control"/> + <text name="anyone_label"> + Enhver + </text> <check_box initial_value="false" label="Tillad navigation og interaktion" name="perms_anyone_interact"/> <check_box initial_value="false" label="Vis kontrol bjælke" name="perms_anyone_control"/> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_media_settings_security.xml b/indra/newview/skins/default/xui/da/panel_media_settings_security.xml index ee341f9142..278fe0eeea 100644 --- a/indra/newview/skins/default/xui/da/panel_media_settings_security.xml +++ b/indra/newview/skins/default/xui/da/panel_media_settings_security.xml @@ -1,12 +1,12 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Sikkerhed" name="Media Settings Security"> - <check_box initial_value="false" label="Tillad kun adgang til specifikke URL'er (via "prefix")" name="whitelist_enable"/> + <check_box initial_value="false" label="Tillad kun adgang til angivne URL mønstre" name="whitelist_enable"/> <text name="home_url_fails_some_items_in_whitelist"> - Opslag som hjemmesiden fejler ved er markeret: + Angivelser som hjemmesiden fejler imod er markeret: </text> <button label="Tilføj" name="whitelist_add"/> <button label="Slet" name="whitelist_del"/> <text name="home_url_fails_whitelist"> - Advarsel: Hjemmesiden angive i "Generelt" fanen er ikke indeholdt i godkendte sider. Den er slÃ¥et fra, indtil en gyldig værdi er tilføjet. + Advarsel: hjemmesiden specificeret i Generelt fanen opfylder ikke krav pÃ¥ listen med godkendte URL. Den er de-aktiveret indtil en gyldig hjemmeside er tilføjet. </text> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_my_profile.xml b/indra/newview/skins/default/xui/da/panel_my_profile.xml index 1dffc73239..7eb3c9f4e5 100644 --- a/indra/newview/skins/default/xui/da/panel_my_profile.xml +++ b/indra/newview/skins/default/xui/da/panel_my_profile.xml @@ -1,37 +1,35 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Profil" name="panel_profile"> <string name="no_partner_text" value="Ingen"/> + <string name="no_group_text" value="Ingen"/> <string name="RegisterDateFormat"> [REG_DATE] ([AGE]) </string> - <scroll_container name="profile_scroll"> - <panel name="scroll_content_panel"> - <panel name="second_life_image_panel"> - <icon label="" name="2nd_life_edit_icon" tool_tip="Klik pÃ¥ Rediger Profil knappen nedenfor for at ændre billede"/> - </panel> - <panel name="first_life_image_panel"> - <icon label="" name="real_world_edit_icon" tool_tip="Klik pÃ¥ Rediger Profil knappen nedenfor for at ændre billede"/> - <text name="title_rw_descr_text" value="RL:"/> - </panel> - <text name="me_homepage_text"> - Web: - </text> - <text name="title_member_text" value="Medlem siden:"/> - <text name="title_acc_status_text" value="Konto:"/> - <text name="acc_status_text" value="Beboer. Ingen betalingsinfo"/> - <text name="title_partner_text" value="Partner:"/> - <text name="title_groups_text" value="Grupper:"/> - </panel> - </scroll_container> - <panel name="profile_buttons_panel"> - <button label="Tilføj ven" name="add_friend"/> - <button label="IM" name="im"/> - <button label="Opkald" name="call"/> - <button label="Kort" name="show_on_map_btn"/> - <button label="Teleportér" name="teleport"/> - </panel> - <panel name="profile_me_buttons_panel"> - <button label="Rediger profil" name="edit_profile_btn" tool_tip="Redigér personlig information"/> - <button label="Ændre udseende" name="edit_appearance_btn" tool_tip="Ændre dit udseende: fysiske data, tøj m.v."/> - </panel> + <layout_stack name="layout"> + <layout_panel name="profile_stack"> + <scroll_container name="profile_scroll"> + <panel name="scroll_content_panel"> + <panel name="second_life_image_panel"> + <icon label="" name="2nd_life_edit_icon" tool_tip="Klik pÃ¥ Redigér profil knappen forneden for at ændre billede"/> + <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/> + </panel> + <panel name="first_life_image_panel"> + <icon label="" name="real_world_edit_icon" tool_tip="Klik pÃ¥ Redigér profil knappen forneden for at ændre billede"/> + <text name="title_rw_descr_text" value="Real World:"/> + </panel> + <text name="title_member_text" value="Beboer siden:"/> + <text name="title_acc_status_text" value="Konto status:"/> + <text name="title_partner_text" value="Partner:"/> + <panel name="partner_data_panel"> + <name_box initial_value="(henter)" name="partner_text"/> + </panel> + <text name="title_groups_text" value="Grupper:"/> + </panel> + </scroll_container> + </layout_panel> + <layout_panel name="profile_me_buttons_panel"> + <button label="Redigér profil" name="edit_profile_btn" tool_tip="Redigér din personlige information"/> + <button label="Rediger udseende" name="edit_appearance_btn" tool_tip="Opret/tilret dit udseende: fysiske data, tøj m.v."/> + </layout_panel> + </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_navigation_bar.xml b/indra/newview/skins/default/xui/da/panel_navigation_bar.xml index 465bc75a1b..2ee87433a4 100644 --- a/indra/newview/skins/default/xui/da/panel_navigation_bar.xml +++ b/indra/newview/skins/default/xui/da/panel_navigation_bar.xml @@ -1,15 +1,18 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="navigation_bar"> <panel name="navigation_panel"> - <button name="back_btn" tool_tip="GÃ¥ tilbage til min forrige lokation"/> - <button name="forward_btn" tool_tip="GÃ¥ en lokation fremad"/> + <pull_button name="back_btn" tool_tip="GÃ¥ tilbage til min forrige lokation"/> + <pull_button name="forward_btn" tool_tip="GÃ¥ en lokation fremad"/> <button name="home_btn" tool_tip="Teleport til min hjemme lokation"/> <location_input label="Lokation" name="location_combo"/> <search_combo_box label="Søg" name="search_combo_box" tool_tip="Søg"> <combo_editor label="Søg [SECOND_LIFE]" name="search_combo_editor"/> </search_combo_box> </panel> - <favorites_bar name="favorite"> + <favorites_bar name="favorite" tool_tip="Træk landemærker hertil for at fÃ¥ hurtig adgang til dine favoritsteder i Second Life!"> + <label name="favorites_bar_label" tool_tip="Træk landemærker hertil for at fÃ¥ hurtig adgang til dine favoritsteder i Second Life!"> + Favoritter + </label> <chevron_button name=">>" tool_tip="Søg mere af mine favoritter"/> </favorites_bar> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/da/panel_nearby_chat_bar.xml index 2aa7ed7c6c..949cbcbd7b 100644 --- a/indra/newview/skins/default/xui/da/panel_nearby_chat_bar.xml +++ b/indra/newview/skins/default/xui/da/panel_nearby_chat_bar.xml @@ -1,11 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="chat_bar"> - <string name="min_width"> - 192 - </string> - <string name="max_width"> - 320 - </string> <line_editor label="Klik her for at chatte." name="chat_box" tool_tip="Tryk pÃ¥ enter for at tale, Ctrl-Enter for at rÃ¥be."/> <button name="show_nearby_chat" tool_tip="Viser/skjuler log for chat nærved"/> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_nearby_media.xml b/indra/newview/skins/default/xui/da/panel_nearby_media.xml new file mode 100644 index 0000000000..95bfc89f20 --- /dev/null +++ b/indra/newview/skins/default/xui/da/panel_nearby_media.xml @@ -0,0 +1,65 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="nearby_media"> + <string name="media_item_count_format"> + (%ld media items) + </string> + <string name="empty_item_text"> + <tom> + </string> + <string name="parcel_media_name"> + Streaming Media dette sted + </string> + <string name="parcel_audio_name"> + Streaming Audio dette sted + </string> + <string name="playing_suffix"> + (afspilles) + </string> + <panel name="minimized_controls"> + <button label="Stop alt" name="all_nearby_media_disable_btn" tool_tip="Stop al media tæt pÃ¥"/> + <button label="Start alt" name="all_nearby_media_enable_btn" tool_tip="Tænd al media tæt pÃ¥"/> + <button name="open_prefs_btn" tool_tip="Vis media preferencer"/> + <button label="Mere >>" label_selected="Mindre <<" name="more_btn" tool_tip="Advancerede kontroller"/> + <button label="Mere >>" label_selected="Mindre <<" name="less_btn" tool_tip="Advancerede kontroller"/> + </panel> + <panel name="nearby_media_panel"> + <combo_box name="show_combo"> + <combo_box.item label="Overalt" name="All"/> + <combo_box.item label="PÃ¥ dette sted" name="WithinParcel"/> + <combo_box.item label="Udenfor dette sted" name="OutsideParcel"/> + <combo_box.item label="PÃ¥ andre avatarer" name="OnOthers"/> + </combo_box> + <scroll_list name="media_list"> + <scroll_list.columns label="I nærheden" name="media_proximity"/> + <scroll_list.columns label="Synligt" name="media_visibility"/> + <scroll_list.columns label="Klasse" name="media_class"/> + <scroll_list.columns label="Navn" name="media_name"/> + <scroll_list.columns label="Debug" name="media_debug"/> + </scroll_list> + <panel> + <layout_stack name="media_controls"> + <layout_panel name="stop"> + <button name="stop_btn" tool_tip="Stop valgte medie"/> + </layout_panel> + <layout_panel name="play"> + <button name="play_btn" tool_tip="Afspil valgte medie"/> + </layout_panel> + <layout_panel name="pause"> + <button name="pause_btn" tool_tip="Pause valgt medie"/> + </layout_panel> + <layout_panel name="volume_slider_ctrl"> + <slider_bar initial_value="0.5" name="volume_slider" tool_tip="Lydstyrke for valgte medie"/> + </layout_panel> + <layout_panel name="mute"> + <button name="mute_btn" tool_tip="Sluk lyd fra valgte medie"/> + </layout_panel> + <layout_panel name="zoom"> + <button name="zoom_btn" tool_tip="Zoom til valgte medie"/> + </layout_panel> + <layout_panel name="unzoom"> + <button name="unzoom_btn" tool_tip="Zoom tilbage fra valgte medie"/> + </layout_panel> + </layout_stack> + </panel> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/da/panel_notes.xml b/indra/newview/skins/default/xui/da/panel_notes.xml index f8d911b9e5..5b3a2d0906 100644 --- a/indra/newview/skins/default/xui/da/panel_notes.xml +++ b/indra/newview/skins/default/xui/da/panel_notes.xml @@ -13,10 +13,10 @@ </scroll_container> </panel> <panel name="notes_buttons_panel"> - <button label="Tilføj" name="add_friend" tool_tip="Tilbyd venskab til beboeren"/> + <button label="Tilføj ven" name="add_friend" tool_tip="Tilbyd venskab til beboer"/> <button label="IM" name="im" tool_tip="Ã…ben session med personlig besked (IM)"/> <button label="Kald" name="call" tool_tip="Opkald til denne beboer"/> - <button label="Kort" name="show_on_map_btn" tool_tip="Vis beboeren pÃ¥ kortet"/> + <button label="Kort" name="show_on_map_btn" tool_tip="Vis beboer pÃ¥ kort"/> <button label="Teleport" name="teleport" tool_tip="Tilbyd teleport"/> </panel> </layout_stack> diff --git a/indra/newview/skins/default/xui/da/panel_online_status.xml b/indra/newview/skins/default/xui/da/panel_online_status.xml new file mode 100644 index 0000000000..fdc489f375 --- /dev/null +++ b/indra/newview/skins/default/xui/da/panel_online_status.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="friend_online_status" name="friend_online_status"/> diff --git a/indra/newview/skins/default/xui/da/panel_online_status_toast.xml b/indra/newview/skins/default/xui/da/panel_online_status_toast.xml new file mode 100644 index 0000000000..fdc489f375 --- /dev/null +++ b/indra/newview/skins/default/xui/da/panel_online_status_toast.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="friend_online_status" name="friend_online_status"/> diff --git a/indra/newview/skins/default/xui/da/panel_outfit_edit.xml b/indra/newview/skins/default/xui/da/panel_outfit_edit.xml new file mode 100644 index 0000000000..9aa9fd14cc --- /dev/null +++ b/indra/newview/skins/default/xui/da/panel_outfit_edit.xml @@ -0,0 +1,45 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- Side tray Outfit Edit panel --> +<panel label="Redigér sæt" name="outfit_edit"> + <string name="No Outfit" value="Intet sæt"/> + <string name="unsaved_changes" value="Ikke gemte ændringer"/> + <string name="now_editing" value="Redigerer nu"/> + <panel.string name="not_available"> + (Ikke relevant) + </panel.string> + <panel.string name="unknown"> + (ukendt) + </panel.string> + <string name="Filter.All" value="Alle"/> + <string name="Filter.Clothes/Body" value="Tøj/Krop"/> + <string name="Filter.Objects" value="Objekter"/> + <button label="redigér" name="edit_wearable_btn"/> + <text name="title" value="Redigér sæt"/> + <panel label="bottom_panel" name="header_panel"> + <panel label="bottom_panel" name="outfit_name_and_status"> + <text name="status" value="Redigerer nu..."/> + <text name="curr_outfit_name" value="[Current Outfit]"/> + </panel> + </panel> + <layout_stack name="im_panels"> + <layout_panel label="IM kontrolpanel" name="outfit_wearables_panel"> + <panel label="bottom_panel" name="edit_panel"/> + </layout_panel> + <layout_panel name="add_wearables_panel"> + <text name="add_to_outfit_label" value="Tilføj til sæt:"/> + <layout_stack name="filter_panels"> + <layout_panel label="IM kontrolpanel" name="filter_panel"> + <filter_editor label="Filter" name="look_item_filter"/> + </layout_panel> + </layout_stack> + <panel label="add_wearables_button_bar" name="add_wearables_button_bar"> + <button label="F" name="folder_view_btn"/> + <button label="L" name="list_view_btn"/> + </panel> + </layout_panel> + </layout_stack> + <panel name="save_revert_button_bar"> + <button label="Gem" name="save_btn"/> + <button label="Gendan" name="revert_btn"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/da/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/da/panel_outfits_inventory.xml index 7d6401283e..681701aba2 100644 --- a/indra/newview/skins/default/xui/da/panel_outfits_inventory.xml +++ b/indra/newview/skins/default/xui/da/panel_outfits_inventory.xml @@ -1,7 +1,14 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="Outfits"> - <accordion name="outfits_accordion"> - <accordion_tab name="tab_cof" title="Nuværende sæt"/> - <accordion_tab name="tab_outfits" title="Mine sæt"/> - </accordion> +<panel label="Ting" name="Outfits"> + <tab_container name="appearance_tabs"> + <panel label="MINE SÆT" name="outfitslist_tab"/> + <inventory_panel label="HAR PÃ…" name="cof_tab"/> + </tab_container> + <panel name="bottom_panel"> + <button name="options_gear_btn" tool_tip="Vis flere muligheder"/> + <dnd_button name="trash_btn" tool_tip="Fjern valgte genstand"/> + <button label="Gem sæt" name="make_outfit_btn" tool_tip="Gem udseende som nyt sæt"/> + <button label="Tag pÃ¥" name="wear_btn" tool_tip="Tag valgte sæt pÃ¥"/> + <button label="Redigér sæt" name="edit_current_outfit_btn"/> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_outfits_inventory_gear_default.xml b/indra/newview/skins/default/xui/da/panel_outfits_inventory_gear_default.xml index a6a796f612..7b6469023b 100644 --- a/indra/newview/skins/default/xui/da/panel_outfits_inventory_gear_default.xml +++ b/indra/newview/skins/default/xui/da/panel_outfits_inventory_gear_default.xml @@ -4,6 +4,6 @@ <menu_item_call label="Tilføj til nuværende sæt" name="add"/> <menu_item_call label="Fjern fra nuværende sæt" name="remove"/> <menu_item_call label="Omdøb" name="rename"/> - <menu_item_call label="Fjern" name="remove_link"/> - <menu_item_call label="Slet" name="delete"/> + <menu_item_call label="Fjern link" name="remove_link"/> + <menu_item_call label="Slet sæt" name="delete"/> </menu> diff --git a/indra/newview/skins/default/xui/da/panel_people.xml b/indra/newview/skins/default/xui/da/panel_people.xml index 07b7f60810..5d8474259c 100644 --- a/indra/newview/skins/default/xui/da/panel_people.xml +++ b/indra/newview/skins/default/xui/da/panel_people.xml @@ -1,33 +1,43 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <!-- Side tray panel --> <panel label="Personer" name="people_panel"> - <string name="no_people" value="Ingen personer"/> - <string name="no_one_near" value="Ingen tæt pÃ¥"/> + <string name="no_recent_people" value="Ingen tidligere personer. Leder du efter nogen at være sammen med? Prøv [secondlife:///app/search/people Search] eller [secondlife:///app/worldmap World Map]."/> + <string name="no_filtered_recent_people" value="Fandt du ikke det du søgte? Prøv [secondlife:///app/search/people/[SEARCH_TERM] Search]."/> + <string name="no_one_near" value="Ingen i nærheden. Leder du efter nogen at være sammen med? Prøv [secondlife:///app/search/people Search] eller [secondlife:///app/worldmap World Map]."/> + <string name="no_one_filtered_near" value="Fandt du ikke det du søgte? Prøv [secondlife:///app/search/people/[SEARCH_TERM] Search]."/> <string name="no_friends_online" value="Ingen venner online"/> <string name="no_friends" value="Ingen venner"/> - <string name="no_groups" value="Ingen grupper"/> + <string name="no_friends_msg"> + Find venner via [secondlife:///app/search/people Search] eller højre-klik pÃ¥ en beboer og tilføj dem som venner. +Leder du efter nogen at være sammen med? Prøv [secondlife:///app/worldmap World Map]. + </string> + <string name="no_filtered_friends_msg"> + Fandt du ikke det du søgte? Prøv [secondlife:///app/search/people/[SEARCH_TERM] Search]. + </string> <string name="people_filter_label" value="Filtrér personer"/> <string name="groups_filter_label" value="Filtrér grupper"/> + <string name="no_filtered_groups_msg" value="Fandt du ikke det du søgte? Prøv [secondlife:///app/search/groups/[SEARCH_TERM] Search]."/> + <string name="no_groups_msg" value="Leder du efter grupper at være med i? Prøv [secondlife:///app/search/groups Search]."/> <filter_editor label="Filtrér" name="filter_input"/> <tab_container name="tabs"> <panel label="TÆT PÃ…" name="nearby_panel"> <panel label="bottom_panel" name="bottom_panel"> <button name="nearby_view_sort_btn" tool_tip="Valg"/> - <button name="add_friend_btn" tool_tip="Tilføjer valgte beboere til din venneliste"/> + <button name="add_friend_btn" tool_tip="Tilføj valgte beboer til din venneliste"/> </panel> </panel> - <panel label="VENNER" name="friends_panel"> + <panel label="MINE VENNER" name="friends_panel"> <accordion name="friends_accordion"> <accordion_tab name="tab_online" title="Online"/> <accordion_tab name="tab_all" title="Alle"/> </accordion> <panel label="bottom_panel" name="bottom_panel"> <button name="friends_viewsort_btn" tool_tip="Valg"/> - <button name="add_btn" tool_tip="Tilbyd venskab til beboer"/> + <button name="add_btn" tool_tip="Tilbyd venskab til en beboer"/> <button name="del_btn" tool_tip="Fjern valgte person fra din venneliste"/> </panel> </panel> - <panel label="GRUPPER" name="groups_panel"> + <panel label="MINE GRUPPER" name="groups_panel"> <panel label="bottom_panel" name="bottom_panel"> <button name="groups_viewsort_btn" tool_tip="Valg"/> <button name="plus_btn" tool_tip="Bliv medlem af gruppe/Opret ny gruppe"/> @@ -37,17 +47,18 @@ <panel label="NYLIGE" name="recent_panel"> <panel label="bottom_panel" name="bottom_panel"> <button name="recent_viewsort_btn" tool_tip="Valg"/> - <button name="add_friend_btn" tool_tip="Tilføj valgte person til din venneliste"/> + <button name="add_friend_btn" tool_tip="Tilføj valgte beboer til din venneliste"/> </panel> </panel> </tab_container> <panel name="button_bar"> - <button label="Profil" name="view_profile_btn" tool_tip="Vis billede, grupper og anden information om beboer"/> + <button label="Profil" name="view_profile_btn" tool_tip="Vis billede, gruppe og anden information om beboer"/> <button label="IM" name="im_btn" tool_tip="Chat privat med denne person"/> <button label="Opkald" name="call_btn" tool_tip="Opkald til denne beboer"/> - <button label="Del" name="share_btn"/> + <button label="Del" name="share_btn" tool_tip="Del en genstand i beholdning"/> <button label="Teleport" name="teleport_btn" tool_tip="Tilbyd teleport"/> <button label="Group profil" name="group_info_btn" tool_tip="Vis gruppe information"/> <button label="Gruppe chat" name="chat_btn" tool_tip="Ã…ben chat session"/> + <button label="Gruppe opkald" name="group_call_btn" tool_tip="Opkald til denne gruppe"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_place_profile.xml b/indra/newview/skins/default/xui/da/panel_place_profile.xml index 24316fea14..05ef22328f 100644 --- a/indra/newview/skins/default/xui/da/panel_place_profile.xml +++ b/indra/newview/skins/default/xui/da/panel_place_profile.xml @@ -6,7 +6,7 @@ <string name="available" value="ledig"/> <string name="allocated" value="fordelt"/> <string name="title_place" value="Sted profil"/> - <string name="title_teleport_history" value="Teleport historik sted"/> + <string name="title_teleport_history" value="Teleport historik"/> <string name="not_available" value="(N\A)"/> <string name="unknown" value="(ukendt)"/> <string name="public" value="(offentlig)"/> @@ -41,6 +41,7 @@ <string name="acquired_date"> [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local] </string> + <button name="back_btn" tool_tip="Tilbage"/> <text name="title" value="Sted profil"/> <scroll_container name="place_scroll"> <panel name="scrolling_panel"> @@ -48,16 +49,16 @@ <text name="maturity_value" value="ukendt"/> <accordion name="advanced_info_accordion"> <accordion_tab name="parcel_characteristics_tab" title="Parcel"> - <panel> + <panel name="parcel_characteristics_panel"> <text name="rating_label" value="Rating:"/> <text name="rating_value" value="ukendt"/> - <text name="voice_label" value="Stem:"/> + <text name="voice_label" value="Stemme:"/> <text name="voice_value" value="Til"/> - <text name="fly_label" value="Flyve:"/> + <text name="fly_label" value="Flyv:"/> <text name="fly_value" value="Til"/> <text name="push_label" value="Skub:"/> <text name="push_value" value="Fra"/> - <text name="build_label" value="Byg:"/> + <text name="build_label" value="Bygge:"/> <text name="build_value" value="Til"/> <text name="scripts_label" value="Scripts:"/> <text name="scripts_value" value="Til"/> @@ -67,17 +68,24 @@ </panel> </accordion_tab> <accordion_tab name="region_information_tab" title="Region"> - <panel> + <panel name="region_information_panel"> <text name="region_name_label" value="Region:"/> + <text name="region_name" value="Mooseland"/> <text name="region_type_label" value="Type:"/> + <text name="region_type" value="Moose"/> <text name="region_rating_label" value="Rating:"/> + <text name="region_rating" value="Voksent"/> <text name="region_owner_label" value="Ejer:"/> + <text name="region_owner" value="moose Van Moose"/> <text name="region_group_label" value="Gruppe:"/> + <text name="region_group"> + The Mighty Moose of mooseville soundvillemoose + </text> <button label="Region/Estate" name="region_info_btn"/> </panel> </accordion_tab> <accordion_tab name="estate_information_tab" title="Estate"> - <panel> + <panel name="estate_information_panel"> <text name="estate_name_label" value="Estate:"/> <text name="estate_rating_label" value="Rating:"/> <text name="estate_owner_label" value="Ejer:"/> @@ -85,14 +93,14 @@ </panel> </accordion_tab> <accordion_tab name="sales_tab" title="Til salg"> - <panel> + <panel name="sales_panel"> <text name="sales_price_label" value="Pris:"/> <text name="area_label" value="Areal:"/> <text name="traffic_label" value="Trafik:"/> <text name="primitives_label" value="Prims:"/> <text name="parcel_scripts_label" value="Scripts:"/> - <text name="terraform_limits_label" value="Terraform begrænsninger:"/> - <text name="subdivide_label" value="Mulighed for at Opdele/samle:"/> + <text name="terraform_limits_label" value="Begræns terrænredigering:"/> + <text name="subdivide_label" value="Opdel/saml mulighed:"/> <text name="resale_label" value="Mulighed for videresalg:"/> <text name="sale_to_label" value="Til salg til:"/> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_places.xml b/indra/newview/skins/default/xui/da/panel_places.xml index 052bf749cb..c06176f994 100644 --- a/indra/newview/skins/default/xui/da/panel_places.xml +++ b/indra/newview/skins/default/xui/da/panel_places.xml @@ -2,13 +2,15 @@ <panel label="Steder" name="places panel"> <string name="landmarks_tab_title" value="MINE LANDEMÆRKER"/> <string name="teleport_history_tab_title" value="TELEPORT HISTORIK"/> - <filter_editor label="Filtrér steder" name="Filter"/> + <filter_editor label="Filtrér mine steder" name="Filter"/> <panel name="button_panel"> - <button label="Teleportér" name="teleport_btn"/> + <button label="Teleportér" name="teleport_btn" tool_tip="Teleportér til det valgte omrÃ¥de"/> <button label="Kort" name="map_btn"/> - <button label="Redigér" name="edit_btn"/> - <button label="Luk" name="close_btn"/> - <button label="Annullér" name="cancel_btn"/> + <button label="Redigér" name="edit_btn" tool_tip="Redigér landemærke information"/> + <button label="â–¼" name="overflow_btn" tool_tip="Vise flere valgmuligheder"/> <button label="Gem" name="save_btn"/> + <button label="Annullér" name="cancel_btn"/> + <button label="Luk" name="close_btn"/> + <button label="Profil" name="profile_btn"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/da/panel_preferences_advanced.xml index 87b749b4eb..807d7939b8 100644 --- a/indra/newview/skins/default/xui/da/panel_preferences_advanced.xml +++ b/indra/newview/skins/default/xui/da/panel_preferences_advanced.xml @@ -1,27 +1,11 @@ <?xml version="1.0" encoding="utf-8"?> -<panel name="advanced"> - <panel.string name="resolution_format"> - [RES_X] x [RES_Y] - </panel.string> +<panel label="Avanceret" name="advanced"> <panel.string name="aspect_ratio_text"> [NUM]:[DEN] </panel.string> - <check_box label="Talebobler" name="bubble_text_chat"/> - <color_swatch name="background" tool_tip="Vælg farve for talebobler"/> - <slider label="Gennemsigtighed" name="bubble_chat_opacity"/> - <text name="AspectRatioLabel1" tool_tip="bredde / højde"> - Format - </text> - <combo_box name="aspect_ratio" tool_tip="bredde/ højde"> - <combo_box.item label="4:3 (Standard CRT)" name="item1"/> - <combo_box.item label="5:4 (1280x1024 LCD)" name="item2"/> - <combo_box.item label="8:5 (Widescreen)" name="item3"/> - <combo_box.item label="16:9 (Widescreen)" name="item4"/> - </combo_box> - <check_box label="Registrér automatisk" name="aspect_auto_detect"/> - <text name="heading1"> - Kamera: - </text> + <panel.string name="middle_mouse"> + Midterste mus + </panel.string> <slider label="Synsvinkel" name="camera_fov"/> <slider label="Distance" name="camera_offset_scale"/> <text name="heading2"> @@ -29,20 +13,25 @@ </text> <check_box label="Byg/Redigér" name="edit_camera_movement" tool_tip="Benyt automatisk kamera positionering ved start og slut af editerings modus"/> <check_box label="Udseende" name="appearance_camera_movement" tool_tip="Benyt automatisk kamera positionering ved redigering"/> - <text name="heading3"> - Avatarer: - </text> + <check_box initial_value="1" label="Sidepanel" name="appearance_sidebar_positioning" tool_tip="Benyt automatisk positionering af kamera"/> <check_box label="Vis avatar i førsteperson" name="first_person_avatar_visible"/> <check_box label="Piletaster bruges altid til bevægelse" name="arrow_keys_move_avatar_check"/> <check_box label="Tast-tast-hold for at løbe" name="tap_tap_hold_to_run"/> <check_box label="Bevæg avatarlæber nÃ¥r der tales" name="enable_lip_sync"/> - <check_box label="Vis scriptfejl" name="show_script_errors"/> + <check_box label="Talebobler" name="bubble_text_chat"/> + <slider label="Synlighed" name="bubble_chat_opacity"/> + <color_swatch name="background" tool_tip="Vælg farve for talebobler"/> + <text name="UI Size:"> + Brugerflade størrelse + </text> + <check_box label="Vis script fejl i:" name="show_script_errors"/> <radio_group name="show_location"> - <radio_item label="I chat" name="0"/> - <radio_item label="I et vindue" name="1"/> + <radio_item label="Chat" name="0"/> + <radio_item label="Separat vindue" name="1"/> </radio_group> - <check_box label="Knap til aktivering af mikrofon:" name="push_to_talk_toggle_check" tool_tip="I walkie-talkie-modus sendes stemme kun nÃ¥r knappen er trykket ned, ellers vil tryk pÃ¥ knap tænde og slukke mikrofon."/> + <check_box label="Knap til aktiverering af mikrofon:" name="push_to_talk_toggle_check" tool_tip="I walkie-talkie-modus sendes stemme kun nÃ¥r knappen er trykket ned, ellers vil tryk pÃ¥ knap tænde og slukke mikrofon."/> <line_editor label="Brug walkie-talkie modus" name="modifier_combo"/> <button label="Angiv taste" name="set_voice_hotkey_button"/> - <button label="Midterste museknap" name="set_voice_middlemouse_button"/> + <button label="Midterste museknap" name="set_voice_middlemouse_button" tool_tip="Nulstil til midterste musetaste"/> + <button label="Andre enheder" name="joystick_setup_button"/> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_preferences_alerts.xml b/indra/newview/skins/default/xui/da/panel_preferences_alerts.xml index 4791033757..7caa17d514 100644 --- a/indra/newview/skins/default/xui/da/panel_preferences_alerts.xml +++ b/indra/newview/skins/default/xui/da/panel_preferences_alerts.xml @@ -4,11 +4,11 @@ Vis mig nÃ¥r: </text> <check_box label="NÃ¥r jeg bruger eller fÃ¥r L$" name="notify_money_change_checkbox"/> - <check_box label="NÃ¥r mine venner logger af eller pÃ¥" name="friends_online_notify_checkbox"/> + <check_box label="NÃ¥r mine venner logger pÃ¥ eller af" name="friends_online_notify_checkbox"/> <text name="show_label"> - Vis altid disse beskeder: + Vis altid: </text> <text name="dont_show_label"> - Vis aldrig disse beskeder: + Vis aldrig: </text> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_preferences_chat.xml b/indra/newview/skins/default/xui/da/panel_preferences_chat.xml index 609512bc1b..20a376f152 100644 --- a/indra/newview/skins/default/xui/da/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/da/panel_preferences_chat.xml @@ -1,10 +1,16 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Tekst chat" name="chat"> + <text name="font_size"> + Skriftstørrelse: + </text> <radio_group name="chat_font_size"> - <radio_item label="Lille" name="radio"/> - <radio_item label="Mellem" name="radio2"/> - <radio_item label="Stor" name="radio3"/> + <radio_item label="Lille" name="radio" value="0"/> + <radio_item label="Mellem" name="radio2" value="1"/> + <radio_item label="Stor" name="radio3" value="2"/> </radio_group> + <text name="font_colors"> + Skriftfarve: + </text> <color_swatch label="Dig" name="user"/> <text name="text_box1"> Dig @@ -39,8 +45,15 @@ </text> <check_box initial_value="true" label="Afspil skrive animation ved chat" name="play_typing_animation"/> <check_box label="Send e-mail til mig nÃ¥r jeg modtager IM og er offline" name="send_im_to_email"/> - <radio_group name="chat_window" tool_tip="Vis dine personlige beskeder i separate vinduer eller i ét vindue med mange faner (ændring kræver genstart)"> - <radio_item label="Flere vinduer" name="radio"/> - <radio_item label="Et vindue" name="radio2"/> + <check_box label="Ã…ben for almindelig tekst i IM og chat historik" name="plain_text_chat_history"/> + <text name="show_ims_in_label"> + Vis IM'er i: + </text> + <text name="requires_restart_label"> + (kræver genstart) + </text> + <radio_group name="chat_window" tool_tip="Vise dine personlige beskeder i separate vinduer, eller i ét vindue med flere faner (Kræver genstart)"> + <radio_item label="Separate vinduer" name="radio" value="0"/> + <radio_item label="Faner" name="radio2" value="1"/> </radio_group> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_preferences_general.xml b/indra/newview/skins/default/xui/da/panel_preferences_general.xml index e17ccca4a1..e70cb48262 100644 --- a/indra/newview/skins/default/xui/da/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/da/panel_preferences_general.xml @@ -23,7 +23,7 @@ <text name="maturity_desired_textbox"/> <combo_box name="maturity_desired_combobox"> <combo_box.item label="PG, Mature og Adult" name="Desired_Adult"/> - <combo_box.item label="PG and Mature" name="Desired_Mature"/> + <combo_box.item label="PG og Mature" name="Desired_Mature"/> <combo_box.item label="PG" name="Desired_PG"/> </combo_box> <text name="start_location_textbox"> @@ -38,9 +38,9 @@ Navneskilte: </text> <radio_group name="Name_Tag_Preference"> - <radio_item label="Skjul" name="radio"/> - <radio_item label="Vis" name="radio2"/> - <radio_item label="Vis et øjeblik" name="radio3"/> + <radio_item label="Skjul" name="radio" value="0"/> + <radio_item label="Vis" name="radio2" value="1"/> + <radio_item label="Vis et øjeblik" name="radio3" value="2"/> </radio_group> <check_box label="Vis mit navn" name="show_my_name_checkbox1"/> <check_box initial_value="true" label="SmÃ¥ avatar navne" name="small_avatar_names_checkbox"/> @@ -48,14 +48,17 @@ <text name="effects_color_textbox"> Farve til mine effekter: </text> - <color_swatch label="" name="effect_color_swatch" tool_tip="Klik for at Ã¥bne farvevælger"/> <text name="title_afk_text"> Tid inden "væk": </text> - <spinner label="Tid før inaktiv:" name="afk_timeout_spinner"/> - <text name="seconds_textbox"> - sekunder - </text> + <color_swatch label="" name="effect_color_swatch" tool_tip="Klik for at Ã¥bne farvevælger"/> + <combo_box label="Timeout før 'væk':" name="afk"> + <combo_box.item label="2 minutter" name="item0"/> + <combo_box.item label="5 minutter" name="item1"/> + <combo_box.item label="10 minutter" name="item2"/> + <combo_box.item label="30 minutter" name="item3"/> + <combo_box.item label="aldrig" name="item4"/> + </combo_box> <text name="text_box3"> Optaget autosvar: </text> diff --git a/indra/newview/skins/default/xui/da/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/da/panel_preferences_graphics1.xml index bb1cacc773..586896041d 100644 --- a/indra/newview/skins/default/xui/da/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/da/panel_preferences_graphics1.xml @@ -1,8 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Grafik" name="Display panel"> - <text name="UI Size:"> - UI størrelse: - </text> <text name="QualitySpeed"> Kvalitet og hastighed: </text> @@ -53,6 +50,10 @@ m </text> <slider label="Maks. antal partikler:" name="MaxParticleCount"/> + <slider label="Maks. avatar optegningsafstand:" name="MaxAvatarDrawDistance"/> + <text name="DrawDistanceMeterText3"> + m + </text> <slider label="Efterbehandlingskvalitet:" name="RenderPostProcess"/> <text name="MeshDetailText"> Netmaske detaljer: @@ -88,8 +89,8 @@ Lys detaljer: </text> <radio_group name="LightingDetailRadio"> - <radio_item label="Kun sol og mÃ¥ne" name="SunMoon"/> - <radio_item label="Lys i nærheden" name="LocalLights"/> + <radio_item label="Kun sol og mÃ¥ne" name="SunMoon" value="0"/> + <radio_item label="Lys i nærheden" name="LocalLights" value="1"/> </radio_group> <text name="TerrainDetailText"> Terræn detaljer: diff --git a/indra/newview/skins/default/xui/da/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/da/panel_preferences_privacy.xml index c382b222ea..cdb407dbad 100644 --- a/indra/newview/skins/default/xui/da/panel_preferences_privacy.xml +++ b/indra/newview/skins/default/xui/da/panel_preferences_privacy.xml @@ -3,7 +3,7 @@ <panel.string name="log_in_to_change"> log pÃ¥ for at ændre </panel.string> - <button label="Nulstil historik" name="clear_cache"/> + <button label="Nulstil historik" name="clear_cache" tool_tip="Fjern login billede, sidste lokation, teleport historik, samt web og tekstur cache"/> <text name="cache_size_label_l"> (Lokationer, billeder, web, søge historik) </text> @@ -11,7 +11,6 @@ <check_box label="Kun venner og grupper kan sende besked til mig" name="voice_call_friends_only_check"/> <check_box label="SlÃ¥ mikrofon fra nÃ¥r opkald slutter" name="auto_disengage_mic_check"/> <check_box label="Acceptér cookies" name="cookies_enabled"/> - <check_box label="Tillad media autoplay" name="autoplay_enabled"/> <text name="Logs:"> Logs: </text> @@ -19,7 +18,7 @@ <check_box label="Gem en log med private beskeder (IM) pÃ¥ min computer" name="log_instant_messages"/> <check_box label="Tilføj tidsstempel" name="show_timestamps_check_im"/> <text name="log_path_desc"> - Placering af logfiler + Placering af logfiler: </text> <button label="Ændre sti" label_selected="Ændre sti" left="150" name="log_path_button"/> <button label="Liste med blokeringer" name="block_list"/> diff --git a/indra/newview/skins/default/xui/da/panel_preferences_setup.xml b/indra/newview/skins/default/xui/da/panel_preferences_setup.xml index 2dd0b71d8f..38bc9c0a2a 100644 --- a/indra/newview/skins/default/xui/da/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/da/panel_preferences_setup.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Input og kamera" name="Input panel"> +<panel label="Opsætning" name="Input panel"> <button label="Andre enheder" name="joystick_setup_button"/> <text name="Mouselook:"> Første person: @@ -18,29 +18,32 @@ kbps </text> <check_box label="Speciel port" name="connection_port_enabled"/> - <spinner label="Port nummer:" name="web_proxy_port"/> + <spinner label="Port nummer:" name="connection_port"/> <text name="cache_size_label_l"> Cache størrelse </text> <text name="text_box5"> MB </text> - <button label="Vælg" label_selected="Vælg" name="set_cache"/> - <button label="Nulstil" label_selected="Gem" name="reset_cache"/> <text name="Cache location"> - Cache lokation + Cache placering: </text> + <button label="Vælg" label_selected="Vælg" name="set_cache"/> + <button label="Nulstil" label_selected="Nulstil" name="reset_cache"/> <text name="Web:"> Web: </text> <radio_group name="use_external_browser"> - <radio_item label="Benyt den indbyggede browser" name="internal" tool_tip="Brug den indbyggede web browser til hjælp, web links m.v. Denne browser Ã¥bner et nyt vindue i [APP_NAME]."/> - <radio_item label="Brug min normale browser (IE, Firefox)" name="external" tool_tip="Brug systemets standard web browser til hjælp, web links, m.v. Ikke anbefalet hvis du kører i fuld-skærm."/> + <radio_item label="Benyt min browser(IE, Firefox, Safari)" name="external" tool_tip="Brug systemets standard web browser til hjælp, web links, m.v. Ikke anbefalet hvis du kører i fuld-skærm." value="1"/> + <radio_item label="Benyt den indbyggede browser" name="internal" tool_tip="Brug den indbyggede web browser til hjælp, web links m.v. Denne browser Ã¥bner et nyt vindue i [APP_NAME]." value=""/> </radio_group> - <check_box initial_value="false" label="Web proxy" name="web_proxy_enabled"/> - <line_editor name="web_proxy_editor" tool_tip="Angiv navn eller IP addresse pÃ¥ den proxy du ønsker at anvende"/> - <button label="Vælg" label_selected="Vælg" name="set_proxy"/> + <check_box label="Aktivér plugins" name="browser_plugins_enabled"/> + <check_box label="Acceptér cookies" name="cookies_enabled"/> + <check_box label="Aktivér Javascript" name="browser_javascript_enabled"/> + <check_box label="Aktivér web proxy" name="web_proxy_enabled"/> <text name="Proxy location"> - Proxy placering + Proxy placering: </text> + <line_editor name="web_proxy_editor" tool_tip="Angiv navn eller IP addresse pÃ¥ den proxy du ønsker at anvende"/> + <spinner label="Port nummer:" name="web_proxy_port"/> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_preferences_sound.xml b/indra/newview/skins/default/xui/da/panel_preferences_sound.xml index ce77018f72..a1b47c3c1f 100644 --- a/indra/newview/skins/default/xui/da/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/da/panel_preferences_sound.xml @@ -1,14 +1,21 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Lyde" name="Preference Media panel"> <slider label="Generel" name="System Volume"/> - <check_box initial_value="true" label="Sluk lyd nÃ¥r vinduet er minimeret" name="mute_when_minimized"/> - <slider label="Omgivelser" name="Wind Volume"/> + <check_box initial_value="true" label="Sluk lyd nÃ¥r minimeret" name="mute_when_minimized"/> <slider label="Knapper" name="UI Volume"/> - <slider label="Media" name="Media Volume"/> - <slider label="Effekter" name="SFX Volume"/> + <slider label="Omgivelser" name="Wind Volume"/> + <slider label="Lyd effekter" name="SFX Volume"/> <slider label="Musik" name="Music Volume"/> - <check_box label="Tale" name="enable_voice_check"/> - <slider label="Tale" name="Voice Volume"/> + <check_box label="Aktiveret" name="music_enabled"/> + <slider label="Media" name="Media Volume"/> + <check_box label="Aktiveret" name="enable_media"/> + <slider label="Stemme chat" name="Voice Volume"/> + <check_box label="Aktiveret" name="enable_voice_check"/> + <check_box label="Tillad media at afspilles automatisk" name="media_auto_play_btn" tool_tip="Vælg dette for at media afspille automatisk hvis det ønsker det" /> + <check_box label="Afspil media vedhæftet andre avatarer" name="media_show_on_others_btn" tool_tip="Deaktiver dette for at skjule vedhæftet media for avatarer i nærheden" /> + <text name="voice_chat_settings"> + Stemme chat opsætning + </text> <text name="Listen from"> Hør stemmer fra: </text> diff --git a/indra/newview/skins/default/xui/da/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/da/panel_prim_media_controls.xml index 987ba2a3f8..d3b3c7e21e 100644 --- a/indra/newview/skins/default/xui/da/panel_prim_media_controls.xml +++ b/indra/newview/skins/default/xui/da/panel_prim_media_controls.xml @@ -1,6 +1,47 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="MediaControls"> + <string name="min_width"> + 300 + </string> + <string name="min_height"> + 75 + </string> + <string name="zoom_medium_padding"> + 1.1 + </string> + <string name="top_world_view_avoid_zone"> + 50 + </string> + <layout_stack name="progress_indicator_area"> + <panel name="media_progress_indicator"> + <progress_bar name="media_progress_bar" tool_tip="Medie hentes"/> + </panel> + </layout_stack> <layout_stack name="media_controls"> + <layout_panel name="back"> + <button name="back_btn" tool_tip="Navigér tilbage"/> + </layout_panel> + <layout_panel name="fwd"> + <button name="fwd_btn" tool_tip="Navigér frem"/> + </layout_panel> + <layout_panel name="home"> + <button name="home_btn" tool_tip="Hjemmeside"/> + </layout_panel> + <layout_panel name="media_stop"> + <button name="media_stop_btn" tool_tip="Stop medie"/> + </layout_panel> + <layout_panel name="reload"> + <button name="reload_btn" tool_tip="Indlæs igen"/> + </layout_panel> + <layout_panel name="stop"> + <button name="stop_btn" tool_tip="Stop indlæsning"/> + </layout_panel> + <layout_panel name="play"> + <button name="play_btn" tool_tip="Afspil medie"/> + </layout_panel> + <layout_panel name="pause"> + <button name="pause_btn" tool_tip="Pause medie"/> + </layout_panel> <layout_panel name="media_address"> <line_editor name="media_address_url" tool_tip="Media URL"/> <layout_stack name="media_address_url_icons"> @@ -15,14 +56,24 @@ <layout_panel name="media_play_position"> <slider_bar initial_value="0.5" name="media_play_slider" tool_tip="Filmafspilning fremskridt"/> </layout_panel> + <layout_panel name="skip_back"> + <button name="skip_back_btn" tool_tip="GÃ¥ tilbage"/> + </layout_panel> + <layout_panel name="skip_forward"> + <button name="skip_forward_btn" tool_tip="GÃ¥ frem"/> + </layout_panel> <layout_panel name="media_volume"> <button name="media_mute_button" tool_tip="Sluk for dette media"/> <slider name="volume_slider" tool_tip="Media lydstyrke"/> </layout_panel> - </layout_stack> - <layout_stack> - <panel name="media_progress_indicator"> - <progress_bar name="media_progress_bar" tool_tip="Media hentes"/> - </panel> + <layout_panel name="zoom_frame"> + <button name="zoom_frame_btn" tool_tip="Zoom til medie"/> + </layout_panel> + <layout_panel name="close"> + <button name="close_btn" tool_tip="Zoom tilbage"/> + </layout_panel> + <layout_panel name="new_window"> + <button name="new_window_btn" tool_tip="Ã…ben URL i browser"/> + </layout_panel> </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_profile.xml b/indra/newview/skins/default/xui/da/panel_profile.xml index ef7110ffcf..c5bfc3ae80 100644 --- a/indra/newview/skins/default/xui/da/panel_profile.xml +++ b/indra/newview/skins/default/xui/da/panel_profile.xml @@ -1,37 +1,41 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Profil" name="panel_profile"> <string name="no_partner_text" value="Ingen"/> + <string name="no_group_text" value="Ingen"/> <string name="RegisterDateFormat"> [REG_DATE] ([AGE]) </string> - <scroll_container name="profile_scroll"> - <panel name="scroll_content_panel"> - <panel name="second_life_image_panel"> - <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/> - </panel> - <panel name="first_life_image_panel"> - <text name="title_rw_descr_text" value="Real world:"/> - </panel> - <text name="me_homepage_text"> - Hjemmeside: - </text> - <text name="title_member_text" value="Medlem siden:"/> - <text name="title_acc_status_text" value="Konto status:"/> - <text name="acc_status_text" value="Beboer. Ingen betalingsinfo"/> - <text name="title_partner_text" value="Partner:"/> - <text name="title_groups_text" value="Grupper:"/> - </panel> - </scroll_container> - <panel name="profile_buttons_panel"> - <button label="Tilføj ven" name="add_friend" tool_tip="Tilbyd venskab til denne beboer"/> - <button label="IM" name="im" tool_tip="Skriv en personlig besked (IM)"/> - <button label="Opkald" name="call" tool_tip="Opkald til denne beboer"/> - <button label="Map" name="show_on_map_btn" tool_tip="Show the resident on the map"/> - <button label="Tilbyd teleport" name="teleport" tool_tip="Tilbyd en teleport til denne beboer"/> - <button label="â–¼" name="overflow_btn" tool_tip="Betal penge til eller del beholdning med denne beboer"/> - </panel> - <panel name="profile_me_buttons_panel"> - <button label="Redigér profil" name="edit_profile_btn"/> - <button label="Redigér udseende" name="edit_appearance_btn"/> - </panel> + <layout_stack name="layout"> + <layout_panel name="profile_stack"> + <scroll_container name="profile_scroll"> + <panel name="profile_scroll_panel"> + <panel name="second_life_image_panel"> + <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/> + </panel> + <panel name="first_life_image_panel"> + <text name="title_rw_descr_text" value="Real World:"/> + </panel> + <text name="title_member_text" value="Beboer siden:"/> + <text name="title_acc_status_text" value="Konto status:"/> + <text name="title_partner_text" value="Partner:"/> + <panel name="partner_data_panel"> + <name_box initial_value="(henter)" name="partner_text"/> + </panel> + <text name="title_groups_text" value="Grupper:"/> + </panel> + </scroll_container> + </layout_panel> + <layout_panel name="profile_buttons_panel"> + <button label="Tilføj ven" name="add_friend" tool_tip="Tilbyd venskab til beboeren"/> + <button label="IM" name="im" tool_tip="Ã…ben session med personlige beskeder (IM)"/> + <button label="Opkald" name="call" tool_tip="Opkald til denne beboer"/> + <button label="Kort" name="show_on_map_btn" tool_tip="Vis beboeren pÃ¥ kortet"/> + <button label="Teleport" name="teleport" tool_tip="Tilbyd teleport"/> + <button label="â–¼" name="overflow_btn" tool_tip="Betal penge til eller del beholdning med beboeren"/> + </layout_panel> + <layout_panel name="profile_me_buttons_panel"> + <button label="Redigér profil" name="edit_profile_btn" tool_tip="Redigér din personlige information"/> + <button label="Redigér udseende" name="edit_appearance_btn" tool_tip="Opret/redigér dit udseende: fysiske data, tøj m.v."/> + </layout_panel> + </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_region_covenant.xml b/indra/newview/skins/default/xui/da/panel_region_covenant.xml index 0e8ab7556f..4b9c7539ea 100644 --- a/indra/newview/skins/default/xui/da/panel_region_covenant.xml +++ b/indra/newview/skins/default/xui/da/panel_region_covenant.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Covenant" name="Covenant"> +<panel label="Regler" name="Covenant"> <text name="estate_section_lbl"> Estate </text> @@ -27,7 +27,7 @@ Ændringer i regler vil blive vist i alle parceller til denne estate. </text> <text name="covenant_instructions"> - Træk og slip en note for at ændre regler for denne estate. + Træk og slip et notecard her for at ændre regler for denne estate. </text> <text name="region_section_lbl"> Region diff --git a/indra/newview/skins/default/xui/da/panel_region_estate.xml b/indra/newview/skins/default/xui/da/panel_region_estate.xml index d726fedfe9..65948ce481 100644 --- a/indra/newview/skins/default/xui/da/panel_region_estate.xml +++ b/indra/newview/skins/default/xui/da/panel_region_estate.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Estate" name="Estate"> <text name="estate_help_text"> - Ændringer i dette afsnit vil pÃ¥virke alle -regioner i dette estate. + Ændringer her vil pÃ¥virke alle regioner i dette estate. </text> <text name="estate_text"> Estate: @@ -24,10 +23,10 @@ regioner i dette estate. <check_box label="Tillad offentlig adgang" name="externally_visible_check"/> <button label="?" name="externally_visible_help"/> <text name="Only Allow"> - Begræns adgang til: + Begræns adgang til konti bekræftet med: </text> - <check_box label="Beboere med betalingsoplysninger" name="limit_payment" tool_tip="Blokér for brugere uden identifikation"/> - <check_box label="Beboere der er godkendt som voksne" name="limit_age_verified" tool_tip="Blokér for brugere der ikke har verificéret deres alder. Se [SUPPORT_SITE] for mere information."/> + <check_box label="Beboere med betalingsoplysninger" name="limit_payment" tool_tip="Blokér for uidentificerede beboere"/> + <check_box label="Beboere der er godkendt som voksne" name="limit_age_verified" tool_tip="Blokér for beboere som ikke er blevet aldersverificeret. Se [SUPPORT_SITE] for mere information."/> <check_box label="Tillad stemme chat" name="voice_chat_check"/> <button label="?" name="voice_chat_help"/> <check_box label="Tillad direkte teleport" name="allow_direct_teleport"/> @@ -40,7 +39,7 @@ regioner i dette estate. </string> <button label="?" name="abuse_email_address_help"/> <button label="Gem" name="apply_btn"/> - <button label="Smid bruger ud fra estate..." name="kick_user_from_estate_btn"/> + <button label="Fjern en beboer fra estate..." name="kick_user_from_estate_btn"/> <button label="Send besked til estate..." name="message_estate_btn"/> <text name="estate_manager_label"> Administratorer: diff --git a/indra/newview/skins/default/xui/da/panel_region_general.xml b/indra/newview/skins/default/xui/da/panel_region_general.xml index 6ffe1f34f3..5b5dd411ac 100644 --- a/indra/newview/skins/default/xui/da/panel_region_general.xml +++ b/indra/newview/skins/default/xui/da/panel_region_general.xml @@ -19,35 +19,25 @@ ukendt </text> <check_box label="Blokér for redigering af terræn" name="block_terraform_check"/> - <button label="?" name="terraform_help"/> <check_box label="Blokér for flyvning" name="block_fly_check"/> - <button label="?" name="fly_help"/> <check_box label="Tillad skader" name="allow_damage_check"/> - <button label="?" name="damage_help"/> <check_box label="Begræns skubning" name="restrict_pushobject"/> - <button label="?" name="restrict_pushobject_help"/> <check_box label="Tillad at sælge land" name="allow_land_resell_check"/> - <button label="?" name="land_resell_help"/> <check_box label="Tillad at samle/dele land" name="allow_parcel_changes_check"/> - <button label="?" name="parcel_changes_help"/> <check_box label="Blokér visning af land i Søgning" name="block_parcel_search_check" tool_tip="Lad beboere se denne region og dens parceller i søgeresultater"/> - <button label="?" name="parcel_search_help"/> <spinner label="Max besøgende" name="agent_limit_spin"/> - <button label="?" name="agent_limit_help"/> <spinner label="Objekt bonus" name="object_bonus_spin"/> - <button label="?" name="object_bonus_help"/> <text label="Indhold" name="access_text"> Rating: </text> - <combo_box label="Mature" name="access_combo"> - <combo_box.item label="Adult" name="Adult"/> - <combo_box.item label="Mature" name="Mature"/> - <combo_box.item label="PG" name="PG"/> - </combo_box> - <button label="?" name="access_help"/> + <icons_combo_box label="Mature" name="access_combo"> + <icons_combo_box.item label="Adult" name="Adult" value="42"/> + <icons_combo_box.item label="Mature" name="Mature" value="21"/> + <icons_combo_box.item label="PG" name="PG" value="13"/> + </icons_combo_box> <button label="Gem" name="apply_btn"/> - <button label="Send en beboer hjem ..." name="kick_btn"/> - <button label="Send alle beboere hjem..." name="kick_all_btn"/> + <button label="Teleportér en beboer hjem..." name="kick_btn"/> + <button label="Teleportér alle beboere hjem..." name="kick_all_btn"/> <button label="Send besked til region..." name="im_btn"/> <button label="Vedligehold telehub..." name="manage_telehub_btn"/> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_region_general_layout.xml b/indra/newview/skins/default/xui/da/panel_region_general_layout.xml new file mode 100644 index 0000000000..f3c32d6169 --- /dev/null +++ b/indra/newview/skins/default/xui/da/panel_region_general_layout.xml @@ -0,0 +1,43 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Region" name="General"> + <text name="region_text_lbl"> + Region: + </text> + <text name="region_text"> + ukendt + </text> + <text name="version_channel_text_lbl"> + Version: + </text> + <text name="version_channel_text"> + ukendt + </text> + <text name="region_type_lbl"> + Type: + </text> + <text name="region_type"> + ukendt + </text> + <check_box label="Blokér for redigering af terræn" name="block_terraform_check"/> + <check_box label="Blokér for flyvning" name="block_fly_check"/> + <check_box label="Tillad skader" name="allow_damage_check"/> + <check_box label="Begræns skubning" name="restrict_pushobject"/> + <check_box label="Tillad at sælge land" name="allow_land_resell_check"/> + <check_box label="Tillad at samle/dele land" name="allow_parcel_changes_check"/> + <check_box label="Blokér visning af land i Søgning" name="block_parcel_search_check" tool_tip="Lad beboere se denne region og dens parceller i søgeresultater"/> + <spinner label="Max besøgende" name="agent_limit_spin"/> + <spinner label="Objekt bonus" name="object_bonus_spin"/> + <text label="Rating" name="access_text"> + Rating: + </text> + <combo_box label="Moderat" name="access_combo"> + <combo_box.item label="Voksent" name="Adult"/> + <combo_box.item label="Moderat" name="Mature"/> + <combo_box.item label="Generel" name="PG"/> + </combo_box> + <button label="Gem" name="apply_btn"/> + <button label="Teleportér en beboer hjem..." name="kick_btn"/> + <button label="Teleportér alle beboere hjem..." name="kick_all_btn"/> + <button label="Send besked til region..." name="im_btn"/> + <button label="Vedligehold telehub..." name="manage_telehub_btn"/> +</panel> diff --git a/indra/newview/skins/default/xui/da/panel_region_texture.xml b/indra/newview/skins/default/xui/da/panel_region_texture.xml index fc597eee15..45946fd222 100644 --- a/indra/newview/skins/default/xui/da/panel_region_texture.xml +++ b/indra/newview/skins/default/xui/da/panel_region_texture.xml @@ -25,16 +25,16 @@ Texture højde intervaller </text> <text name="height_text_lbl6"> - Sydvest + Nordvest </text> <text name="height_text_lbl7"> - Nordvest + Nordøst </text> <text name="height_text_lbl8"> - Sydøst + Sydvest </text> <text name="height_text_lbl9"> - Nordøst + Sydøst </text> <spinner label="Lav" name="height_start_spin_0"/> <spinner label="Lav" name="height_start_spin_1"/> @@ -45,10 +45,10 @@ <spinner label="Høj" name="height_range_spin_2"/> <spinner label="Høj" name="height_range_spin_3"/> <text name="height_text_lbl10"> - Disse værdier repræsenterer blandingsomrÃ¥der for teksturer ovenfor. + Disse værdier repræsenterer blandingsforhold for teksturer ovenfor. </text> <text name="height_text_lbl11"> - MÃ¥lt i meter, angiver LAV værdien MAKSIMUM højden for tekstur 1, og HØJ værdien er minimumshøjden for tekstur 4. + MÃ¥lt i meter, angiver LAV værdien MAKSIMUM højden for tekstur 1 og HØJ værdien er MINIMUMSshøjden for tekstur 4. </text> <text name="height_text_lbl12"> og HØJ værdien er MIMIMUM højde for texture nummer 4. diff --git a/indra/newview/skins/default/xui/da/panel_script_limits_my_avatar.xml b/indra/newview/skins/default/xui/da/panel_script_limits_my_avatar.xml new file mode 100644 index 0000000000..821c82ccda --- /dev/null +++ b/indra/newview/skins/default/xui/da/panel_script_limits_my_avatar.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="MIN AVATAR" name="script_limits_my_avatar_panel"> + <text name="script_memory"> + Avatar Script forbrug + </text> + <text name="loading_text"> + Henter... + </text> + <scroll_list name="scripts_list"> + <scroll_list.columns label="Størrelse (kb)" name="size"/> + <scroll_list.columns label="URL'er" name="urls"/> + <scroll_list.columns label="Objekt navn" name="name"/> + <scroll_list.columns label="Lokation" name="location"/> + </scroll_list> + <button label="Gentegn liste" name="refresh_list_btn"/> +</panel> diff --git a/indra/newview/skins/default/xui/da/panel_script_limits_region_memory.xml b/indra/newview/skins/default/xui/da/panel_script_limits_region_memory.xml new file mode 100644 index 0000000000..91fc76dbb4 --- /dev/null +++ b/indra/newview/skins/default/xui/da/panel_script_limits_region_memory.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="REGION MEMORY" name="script_limits_region_memory_panel"> + <text name="script_memory"> + Parcel script memory + </text> + <text name="loading_text"> + Henter... + </text> + <scroll_list name="scripts_list"> + <scroll_list.columns label="Størrelse (kb)" name="size"/> + <scroll_list.columns label="URL'er" name="urls"/> + <scroll_list.columns label="Objekt navn" name="name"/> + <scroll_list.columns label="Objekt ejer" name="owner"/> + <scroll_list.columns label="Parcel" name="parcel"/> + <scroll_list.columns label="Lokation" name="location"/> + </scroll_list> + <button label="Gentegn liste" name="refresh_list_btn"/> + <button label="Fremhæv" name="highlight_btn"/> + <button label="Retur" name="return_btn"/> +</panel> diff --git a/indra/newview/skins/default/xui/da/panel_side_tray.xml b/indra/newview/skins/default/xui/da/panel_side_tray.xml index ab4a2a134e..66c3e69904 100644 --- a/indra/newview/skins/default/xui/da/panel_side_tray.xml +++ b/indra/newview/skins/default/xui/da/panel_side_tray.xml @@ -2,25 +2,28 @@ <!-- Side tray cannot show background because it is always partially on screen to hold tab buttons. --> <side_tray name="sidebar"> - <sidetray_tab description="Hjem." name="sidebar_home"> + <sidetray_tab description="Ã…bn/luk sidebar" name="sidebar_openclose" tab_title="Ã…bn/luk sidebar"/> + <sidetray_tab description="Hjem." name="sidebar_home" tab_title="Hjem"> <panel label="hjem" name="panel_home"/> </sidetray_tab> - <sidetray_tab description="Find venner, kontakter og personer tæt pÃ¥." name="sidebar_people"> + <sidetray_tab description="Redigér din profile og favoritter." name="sidebar_me" tab_title="Min profil"> <panel_container name="panel_container"> - <panel label="Gruppe info" name="panel_group_info_sidetray"/> + <panel label="Mig" name="panel_me"/> + </panel_container> + </sidetray_tab> + <sidetray_tab description="Find venner, kontakter og personer tæt pÃ¥." name="sidebar_people" tab_title="Personer"> + <panel_container name="panel_container"> + <panel label="Gruppe profil" name="panel_group_info_sidetray"/> <panel label="Blokerede beboere og objekter" name="panel_block_list_sidetray"/> </panel_container> </sidetray_tab> - <sidetray_tab description="Find steder du vil hen og steder du har været før." label="Steder" name="sidebar_places"> + <sidetray_tab description="Find steder du vil hen og steder du har været før." label="Steder" name="sidebar_places" tab_title="Steder"> <panel label="Steder" name="panel_places"/> </sidetray_tab> - <sidetray_tab description="Redigér din profile og favoritter." name="sidebar_me"> - <panel label="Mig" name="panel_me"/> - </sidetray_tab> - <sidetray_tab description="Ændre dit nuværende udseende" name="sidebar_appearance"> - <panel label="Redigér fremtoning" name="sidepanel_appearance"/> - </sidetray_tab> - <sidetray_tab description="Browse din beholdning." name="sidebar_inventory"> + <sidetray_tab description="Browse din beholdning." name="sidebar_inventory" tab_title="Min beholdning"> <panel label="Redigér beholdning" name="sidepanel_inventory"/> </sidetray_tab> + <sidetray_tab description="Ændre dit nuværende udseende" name="sidebar_appearance" tab_title="Mit udseende"> + <panel label="Redigér udseende" name="sidepanel_appearance"/> + </sidetray_tab> </side_tray> diff --git a/indra/newview/skins/default/xui/da/panel_status_bar.xml b/indra/newview/skins/default/xui/da/panel_status_bar.xml index 4e45b7e328..08ffafd5a6 100644 --- a/indra/newview/skins/default/xui/da/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/da/panel_status_bar.xml @@ -21,9 +21,11 @@ <panel.string name="buycurrencylabel"> L$ [AMT] </panel.string> - <button label="" label_selected="" name="buycurrency" tool_tip="My Balance: Click to buy more L$"/> + <button label="" label_selected="" name="buycurrency" tool_tip="Min balance"/> + <button label="Køb L$" name="buyL" tool_tip="Klik for at købe flere L$"/> <text name="TimeText" tool_tip="Nuværende tid (Pacific)"> - 12:00 + 24:00 PST </text> + <button name="media_toggle_btn" tool_tip="Start/Stop Alle medier (musik, video, hjemmesider)"/> <button name="volume_btn" tool_tip="Kontrol for generel lydstyrke"/> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_teleport_history.xml b/indra/newview/skins/default/xui/da/panel_teleport_history.xml index 64b5ecf5cf..8a01659ffa 100644 --- a/indra/newview/skins/default/xui/da/panel_teleport_history.xml +++ b/indra/newview/skins/default/xui/da/panel_teleport_history.xml @@ -4,6 +4,7 @@ <accordion_tab name="today" title="I dag"/> <accordion_tab name="yesterday" title="I gÃ¥r"/> <accordion_tab name="2_days_ago" title="2 dage siden"/> + 5 <accordion_tab name="3_days_ago" title="3 dage siden"/> <accordion_tab name="4_days_ago" title="4 dage siden"/> <accordion_tab name="5_days_ago" title="5 dage siden"/> @@ -11,4 +12,7 @@ <accordion_tab name="1_month_and_older" title="1 mÃ¥ned eller ældre"/> <accordion_tab name="6_months_and_older" title="6 mÃ¥neder eller ældre"/> </accordion> + <panel name="bottom_panel"> + <button name="gear_btn" tool_tip="Vis flere valgmuligheder"/> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_teleport_history_item.xml b/indra/newview/skins/default/xui/da/panel_teleport_history_item.xml new file mode 100644 index 0000000000..8148588c86 --- /dev/null +++ b/indra/newview/skins/default/xui/da/panel_teleport_history_item.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="teleport_history_item"> + <button name="profile_btn" tool_tip="Vis info om genstand"/> +</panel> diff --git a/indra/newview/skins/default/xui/da/panel_world_map.xml b/indra/newview/skins/default/xui/da/panel_world_map.xml index bea5ea6b36..138b922df1 100644 --- a/indra/newview/skins/default/xui/da/panel_world_map.xml +++ b/indra/newview/skins/default/xui/da/panel_world_map.xml @@ -30,6 +30,12 @@ <panel.string name="world_map_northwest"> NV </panel.string> + <panel.string name="world_map_person"> + 1 person + </panel.string> + <panel.string name="world_map_people"> + [NUMBER] people + </panel.string> <text label="N" name="floater_map_north" text="N"> N </text> diff --git a/indra/newview/skins/default/xui/da/sidepanel_appearance.xml b/indra/newview/skins/default/xui/da/sidepanel_appearance.xml index 27708f5c7a..be049bea38 100644 --- a/indra/newview/skins/default/xui/da/sidepanel_appearance.xml +++ b/indra/newview/skins/default/xui/da/sidepanel_appearance.xml @@ -1,11 +1,14 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Sæt" name="appearance panel"> <string name="No Outfit" value="Intet sæt"/> - <filter_editor label="Filtrér sæt" name="Filter"/> - <panel name="bottom_panel"> - <button name="options_gear_btn" tool_tip="Vis flere muligheder"/> - <button name="newlook_btn" tool_tip="Tilføj nyt sæt"/> - <dnd_button name="trash_btn" tool_tip="Fjern valgte del"/> - <button label="Bær" name="wear_btn"/> + <string name="Unsaved Changes" value="Ikke gemte ændringer"/> + <string name="Now Wearing" value="Bærer nu..."/> + <panel name="panel_currentlook"> + <button label="E" name="editappearance_btn"/> + <button label="O" name="openoutfit_btn"/> + <text name="currentlook_status"> + (Status) + </text> </panel> + <filter_editor label="Filtrér sæt" name="Filter"/> </panel> diff --git a/indra/newview/skins/default/xui/da/sidepanel_inventory.xml b/indra/newview/skins/default/xui/da/sidepanel_inventory.xml index ae029f5939..767d74ca3f 100644 --- a/indra/newview/skins/default/xui/da/sidepanel_inventory.xml +++ b/indra/newview/skins/default/xui/da/sidepanel_inventory.xml @@ -3,6 +3,8 @@ <panel label="" name="sidepanel__inventory_panel"> <panel name="button_panel"> <button label="Profil" name="info_btn"/> + <button label="Del" name="share_btn"/> + <button label="Køb ind" name="shop_btn"/> <button label="Bær" name="wear_btn"/> <button label="Afspil" name="play_btn"/> <button label="Teleportér" name="teleport_btn"/> diff --git a/indra/newview/skins/default/xui/da/sidepanel_item_info.xml b/indra/newview/skins/default/xui/da/sidepanel_item_info.xml index 685601b922..701a59bade 100644 --- a/indra/newview/skins/default/xui/da/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/da/sidepanel_item_info.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="item properties" title="Egenskaber for beholdningsgenstand"> +<panel name="item properties" title="Objekt profil"> <panel.string name="unknown"> (ukendt) </panel.string> @@ -15,7 +15,8 @@ <panel.string name="acquiredDate"> [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local] </panel.string> - <text name="title" value="Egenskaber for genstand"/> + <text name="title" value="Objekt profil"/> + <text name="where" value="(Beholdning)"/> <panel label=""> <text name="LabelItemNameTitle"> Navn: @@ -37,34 +38,36 @@ <text name="LabelAcquiredDate"> Ons Maj 24 12:50:46 2006 </text> - <text name="OwnerLabel"> - Dig: - </text> - <check_box label="Editér" name="CheckOwnerModify"/> - <check_box label="Kopiér" name="CheckOwnerCopy"/> - <check_box label="Sælg" name="CheckOwnerTransfer"/> - <text name="AnyoneLabel"> - Enhver: - </text> - <check_box label="Kopiér" name="CheckEveryoneCopy"/> - <text name="GroupLabel"> - Gruppe: - </text> - <check_box label="Del" name="CheckShareWithGroup"/> - <text name="NextOwnerLabel"> - Næste ejer: - </text> - <check_box label="Editér" name="CheckNextOwnerModify"/> - <check_box label="Kopiér" name="CheckNextOwnerCopy"/> - <check_box label="Sælg" name="CheckNextOwnerTransfer"/> + <panel name="perms_inv"> + <text name="perm_modify"> + Du kan: + </text> + <check_box label="Redigere" name="CheckOwnerModify"/> + <check_box label="Kopiere" name="CheckOwnerCopy"/> + <check_box label="Give væk" name="CheckOwnerTransfer"/> + <text name="AnyoneLabel"> + Enhver: + </text> + <check_box label="Kopiere" name="CheckEveryoneCopy"/> + <text name="GroupLabel"> + Gruppe: + </text> + <check_box label="Dele" name="CheckShareWithGroup" tool_tip="Tillad alle medlemmer i den aktive gruppe at dele dine 'redigere' rettigheder for dette objekt. Du skal dedikere for at Ã¥bne for rolle begrænsninger."/> + <text name="NextOwnerLabel"> + Næste ejer: + </text> + <check_box label="Redigere" name="CheckNextOwnerModify"/> + <check_box label="Kopiere" name="CheckNextOwnerCopy"/> + <check_box label="Give væk" name="CheckNextOwnerTransfer" tool_tip="Næste ejer kan give væk eller sælge dette objekt"/> + </panel> <check_box label="Til salg" name="CheckPurchase"/> <combo_box name="combobox sale copy"> - <combo_box.item label="Kopiér" name="Copy"/> + <combo_box.item label="Kopi" name="Copy"/> <combo_box.item label="Original" name="Original"/> </combo_box> - <spinner label="Pris:" name="Edit Cost"/> - <text name="CurrencySymbol"> - L$ - </text> + <spinner label="Pris: L$" name="Edit Cost"/> + </panel> + <panel name="button_panel"> + <button label="Annullér" name="cancel_btn"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/da/sidepanel_task_info.xml b/indra/newview/skins/default/xui/da/sidepanel_task_info.xml index 6ade03ce56..bec97734e4 100644 --- a/indra/newview/skins/default/xui/da/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/da/sidepanel_task_info.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="object properties" title="Egenskaber for objekt"> +<panel name="object properties" title="Objekt profil"> <panel.string name="text deed continued"> Dedikér </panel.string> @@ -36,84 +36,94 @@ <panel.string name="Sale Mixed"> Blandet salg </panel.string> - <panel label=""> + <text name="title" value="Objekt profil"/> + <text name="where" value="(verden)"/> + <panel label="" name="properties_panel"> <text name="Name:"> Navn: </text> <text name="Description:"> Beskrivelse: </text> - <text name="Creator:"> + <text name="CreatorNameLabel"> Skaber: </text> + <text name="Creator Name"> + Erica Linden + </text> <text name="Owner:"> Ejer: </text> - <text name="Group:"> + <text name="Owner Name"> + Erica Linden + </text> + <text name="Group_label"> Gruppe: </text> - <button name="button set group" tool_tip="Vælg en gruppe der skal dele dette objekts rettigheder"/> + <button name="button set group" tool_tip="Vælg en gruppe for at dele dette objekts rettigheder"/> <name_box initial_value="Henter..." name="Group Name Proxy"/> - <button label="Dedikér" label_selected="Dedikér" name="button deed" tool_tip="Dedikering giver denne genstand væk med næste ejers rettigheder. Gruppedelte genstande kan dedikeres af en gruppeadministrator."/> - <check_box label="Del" name="checkbox share with group" tool_tip="Tillad alle medlemmer i den angivne gruppe at videregive dine "redigere" rettigheder for dette objekt. Du mÃ¥ dedikere for at tillade rolle begrænsninger."/> + <button label="Dedikér" label_selected="Dedikér" name="button deed" tool_tip="Dedikering giver denne genstand væk med den næste ejers rettigheder. Gruppe delte objekter kan dedikeres af en gruppe administrator."/> <text name="label click action"> Klik for at: </text> <combo_box name="clickaction"> - <combo_box.item label="Røre (standard)" name="Touch/grab(default)"/> + <combo_box.item label="Berøre (standard)" name="Touch/grab(default)"/> <combo_box.item label="Sidde pÃ¥ objekt" name="Sitonobject"/> <combo_box.item label="Købe objekt" name="Buyobject"/> - <combo_box.item label="Betale til objekt" name="Payobject"/> + <combo_box.item label="Betale objekt" name="Payobject"/> <combo_box.item label="Ã…bne" name="Open"/> </combo_box> - <check_box label="Til salg:" name="checkbox for sale"/> - <combo_box name="sale type"> - <combo_box.item label="Kopi" name="Copy"/> - <combo_box.item label="Indhold" name="Contents"/> - <combo_box.item label="Original" name="Original"/> - </combo_box> - <spinner label="Pris: L$" name="Edit Cost"/> - <check_box label="Vis i søgning" name="search_check" tool_tip="Lad personer se dette objekt i søgeresultater"/> - <panel name="perms_build"> + <panel name="perms_inv"> <text name="perm_modify"> Du kan redigere dette objekt </text> <text name="Anyone can:"> Enhver: </text> - <check_box label="Flytte" name="checkbox allow everyone move"/> <check_box label="Kopiere" name="checkbox allow everyone copy"/> - <text name="Next owner can:"> + <check_box label="Flytte" name="checkbox allow everyone move"/> + <text name="GroupLabel"> + Gruppe: + </text> + <check_box label="Dele" name="checkbox share with group" tool_tip="Tillad alle gruppemedlemmer i den valgte gruppe at dele dine redigeringsrettigheder for dette objekt. Du skal dedikere for at aktivere rollebegrænsninger"/> + <text name="NextOwnerLabel"> Næste ejer: </text> <check_box label="Redigere" name="checkbox next owner can modify"/> <check_box label="Kopiere" name="checkbox next owner can copy"/> - <check_box label="Overfør" name="checkbox next owner can transfer" tool_tip="Næste ejer kan sælge eller give dette objekt væk"/> - <text name="B:"> - B: - </text> - <text name="O:"> - Ã…: - </text> - <text name="G:"> - O: - </text> - <text name="E:"> - R: - </text> - <text name="N:"> - N: - </text> - <text name="F:"> - F: - </text> + <check_box label="Overføre" name="checkbox next owner can transfer" tool_tip="Næste ejer kan give væk eller sælge dette objekt"/> </panel> + <check_box label="Til salg" name="checkbox for sale"/> + <combo_box name="sale type"> + <combo_box.item label="Kopi" name="Copy"/> + <combo_box.item label="Indhold" name="Contents"/> + <combo_box.item label="Original" name="Original"/> + </combo_box> + <spinner label="Pris: L$" name="Edit Cost"/> + <check_box label="Vis i søgning" name="search_check" tool_tip="Lad personer se dette objekt i søgeresultater"/> + <text name="B:"> + S: + </text> + <text name="O:"> + E: + </text> + <text name="G:"> + G: + </text> + <text name="E:"> + A: + </text> + <text name="N:"> + N: + </text> + <text name="F:"> + F: + </text> </panel> <panel name="button_panel"> <button label="Ã…ben" name="open_btn"/> <button label="Betal" name="pay_btn"/> <button label="Køb" name="buy_btn"/> - <button label="Annullér" name="cancel_btn"/> - <button label="Gem" name="save_btn"/> + <button label="Detaljer" name="details_btn"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/da/strings.xml b/indra/newview/skins/default/xui/da/strings.xml index 493bb4cb20..5ceb0612a8 100644 --- a/indra/newview/skins/default/xui/da/strings.xml +++ b/indra/newview/skins/default/xui/da/strings.xml @@ -1,9 +1,12 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <!-- This file contains strings that used to be hardcoded in the source. It is only for those strings which do not belong in a floater. - For example, the strings used in avatar chat bubbles, and strings + For example, the strings used in avatar chat bubbles, and strings that are returned from one component and may appear in many places--> <strings> + <string name="CAPITALIZED_APP_NAME"> + SECOND LIFE + </string> <string name="SUPPORT_SITE"> Second Life Support Portal </string> @@ -11,7 +14,22 @@ Detekterer hardware... </string> <string name="StartupLoading"> - Indlæser + Henter [APP_NAME]... + </string> + <string name="StartupClearingCache"> + Tømmer cache... + </string> + <string name="StartupInitializingTextureCache"> + Initialiserer tekstur cache... + </string> + <string name="StartupInitializingVFS"> + Initialiserer VFS... + </string> + <string name="ProgressRestoring"> + Gendanner... + </string> + <string name="ProgressChangingResolution"> + Ændrer opløsning... </string> <string name="LoginInProgress"> Logger p. [APP_NAME] kan virke laast. Vent venligst. @@ -38,7 +56,7 @@ Klargør multimedia... </string> <string name="LoginInitializingFonts"> - Indlæser fonts... + Indlæser skriftstyper... </string> <string name="LoginVerifyingCache"> Checker cache filer (kan tage 60-90 sekunder)... @@ -70,15 +88,54 @@ <string name="LoginDownloadingClothing"> Henter tøj... </string> + <string name="InvalidCertificate"> + Serveren returnerede et ugyldigt eller ødelagt certifikat. Kontakt venligst administrator af dette net. + </string> + <string name="CertInvalidHostname"> + Et ugyldig hostnavn blev brugt for at fÃ¥ adgang til serveren. Check venligst din SLURL eller navnet pÃ¥ hosten. + </string> + <string name="CertExpired"> + Certifikat returneret fra nettet ser ud til at være udløbet. Check venligst din systemtid eller kontakt administratoren af dette net. + </string> + <string name="CertKeyUsage"> + Det certifikat der blev returneret af serveren kan ikke benyttes til SSL. Kontakt venligst administrator af dette net. + </string> + <string name="CertBasicConstraints"> + For mange certifikater i serverens certifikat streng. Kontakt venligst administrator af dette net. + </string> + <string name="CertInvalidSignature"> + Certifikat signaturen returneret pÃ¥ dette net kan ikke bekræftes. Kontakt venligst administrator af dette net. + </string> <string name="LoginFailedNoNetwork"> Netværksfejl: Kunne ikke etablere forbindelse, check venligst din netværksforbindelse. </string> + <string name="LoginFailed"> + Login fejlede. + </string> <string name="Quit"> Afslut </string> <string name="AgentLostConnection"> Denne region kan have problemer. Tjek venligst din forbindelse til internettet. </string> + <string name="SavingSettings"> + Gemmer indstillinger... + </string> + <string name="LoggingOut"> + Logger ud... + </string> + <string name="ShuttingDown"> + Lukker ned... + </string> + <string name="YouHaveBeenDisconnected"> + Du er blevet frakoblet den region du var i. + </string> + <string name="SentToInvalidRegion"> + Du blev sendt til en ugyldig region. + </string> + <string name="TestingDisconnect"> + Tester frakobling af klient + </string> <string name="TooltipPerson"> Person </string> @@ -131,7 +188,25 @@ Klik for at se information om denne lokation </string> <string name="TooltipAgentUrl"> - Klik for at denne beboers profil + Klik for at se beboers profil + </string> + <string name="TooltipAgentMute"> + Klik for at slukke for denne beboer + </string> + <string name="TooltipAgentUnmute"> + Klik for at fjern slukning for denne beboer + </string> + <string name="TooltipAgentIM"> + Klik for at sende IM til denne beboer + </string> + <string name="TooltipAgentPay"> + Klik for at betale denne beboer + </string> + <string name="TooltipAgentOfferTeleport"> + Klik for at tilbyde teleport til denne beboer + </string> + <string name="TooltipAgentRequestFriend"> + Klik for at sende venneforespørgsel </string> <string name="TooltipGroupUrl"> Klik for at se denne gruppes beskrivelse @@ -158,18 +233,40 @@ Klik for at starte secondlife:// kommando </string> <string name="CurrentURL" value=" Nuværende URL: [CurrentURL]"/> + <string name="TooltipPrice" value="L$[PRICE]-"/> <string name="SLurlLabelTeleport"> Teleportér til </string> <string name="SLurlLabelShowOnMap"> Vis kort for </string> + <string name="SLappAgentMute"> + Sluk + </string> + <string name="SLappAgentUnmute"> + Fjern sluk + </string> + <string name="SLappAgentIM"> + IM + </string> + <string name="SLappAgentPay"> + Betal + </string> + <string name="SLappAgentOfferTeleport"> + Tilbyd teleport til + </string> + <string name="SLappAgentRequestFriend"> + Venneforespørgsel + </string> <string name="BUTTON_CLOSE_DARWIN"> - Luk (⌘W) + Luk (⌘W) </string> <string name="BUTTON_CLOSE_WIN"> Luk (Ctrl+W) </string> + <string name="BUTTON_CLOSE_CHROME"> + Luk + </string> <string name="BUTTON_RESTORE"> Gendan </string> @@ -182,9 +279,6 @@ <string name="BUTTON_DOCK"> Fastgør </string> - <string name="BUTTON_UNDOCK"> - Frigør - </string> <string name="BUTTON_HELP"> Vis hjælp </string> @@ -209,12 +303,12 @@ <string name="AvatarNameWaiting"> (venter) </string> - <string name="AvatarNameHippos"> - (hippos) - </string> <string name="GroupNameNone"> (ingen) </string> + <string name="AvalineCaller"> + Avaline opkalder [ORDER] + </string> <string name="AssetErrorNone"> Ingen fejl </string> @@ -320,6 +414,9 @@ <string name="symbolic link"> link </string> + <string name="symbolic folder link"> + link til mappe + </string> <string name="AvatarAway"> Væk </string> @@ -572,6 +669,9 @@ <string name="hang_up"> Stemme chat er afbrudt </string> + <string name="reconnect_nearby"> + Du vil nu blive dirigeret til lokal stemme chat + </string> <string name="ScriptQuestionCautionChatGranted"> '[OBJECTNAME]', en genstand, ejet af '[OWNERNAME]', lokaliseret i [REGIONNAME] pÃ¥ [REGIONPOS], har fÃ¥et tilladelse til: [PERMISSIONS]. </string> @@ -734,6 +834,45 @@ <string name="invalid"> ugyldig </string> + <string name="shirt_not_worn"> + Trøje - ikke pÃ¥ + </string> + <string name="pants_not_worn"> + Bukser - ikke pÃ¥ + </string> + <string name="shoes_not_worn"> + Sko - ikke pÃ¥ + </string> + <string name="socks_not_worn"> + Strømper - ikke pÃ¥ + </string> + <string name="jacket_not_worn"> + Jakke - ikke pÃ¥ + </string> + <string name="gloves_not_worn"> + Handsker - ikke pÃ¥ + </string> + <string name="undershirt_not_worn"> + Undertrøje - ikke pÃ¥ + </string> + <string name="underpants_not_worn"> + Underbukser - ikke pÃ¥ + </string> + <string name="skirt_not_worn"> + Nederdel - ikke pÃ¥ + </string> + <string name="alpha_not_worn"> + Alpha ikke benyttet + </string> + <string name="tattoo_not_worn"> + Tatovering ikke benyttet + </string> + <string name="invalid_not_worn"> + ugyldig + </string> + <string name="NewWearable"> + Ny [WEARABLE_ITEM] + </string> <string name="next"> Næste </string> @@ -764,11 +903,8 @@ <string name="TeleportOffer"> Teleport tilbud </string> - <string name="StartUpNotification"> - %d nye besked modtaget mens du var væk... - </string> <string name="StartUpNotifications"> - %d nye beskeder modtaget mens du var væk...... + Nye beskeder modtaget mens du var væk...... </string> <string name="OverflowInfoChannelString"> Du har %d mere besked(er) @@ -804,18 +940,23 @@ Tryk ESC for at skift til normalt udsyn </string> <string name="InventoryNoMatchingItems"> - No matching items found in inventory. + Fandt du ikke hvad du søgte? Prøv [secondlife:///app/search/all/[SEARCH_TERM] Search]. + </string> + <string name="PlacesNoMatchingItems"> + Fandt du ikke hvad du søgte? Prøv [secondlife:///app/search/places/[SEARCH_TERM] Search]. + </string> + <string name="FavoritesNoMatchingItems"> + Træk et landemærke hertil for at tilføje den som favorit. </string> <string name="InventoryNoTexture"> - Du har ikke en kopi af denne -tekstur i din beholdning. + Du har ikke en kopi af denne tekstur i din beholdning </string> <string name="no_transfer" value=" (ikke overdragbar)"/> <string name="no_modify" value=" (ikke redigere)"/> <string name="no_copy" value=" (ikke kopiere)"/> <string name="worn" value=" (bÃ¥ret)"/> - <string name="link" value=" (sammenkæde)"/> - <string name="broken_link" value=" (brudt_kæde)"/> + <string name="link" value=" (link)"/> + <string name="broken_link" value=" (brudt link)"/> <string name="LoadingContents"> Henter indhold... </string> @@ -823,6 +964,7 @@ tekstur i din beholdning. Intet indhold </string> <string name="WornOnAttachmentPoint" value=" (bÃ¥ret pÃ¥ [ATTACHMENT_POINT])"/> + <string name="ActiveGesture" value="[GESLABEL] (aktiv)"/> <string name="Chat" value=" Chat : "/> <string name="Sound" value=" Lyd : "/> <string name="Wait" value=" --- Vent : "/> @@ -831,6 +973,7 @@ tekstur i din beholdning. <string name="Wave" value=" Vink "/> <string name="HelloAvatar" value=" Hej, avatar! "/> <string name="ViewAllGestures" value=" Se alle >>"/> + <string name="GetMoreGestures" value="FÃ¥ mere >>"/> <string name="Animations" value=" Animationer,"/> <string name="Calling Cards" value=" Visitkort,"/> <string name="Clothing" value=" Tøj,"/> @@ -916,6 +1059,9 @@ tekstur i din beholdning. <string name="InvFolder My Outfits"> Mine sæt </string> + <string name="InvFolder Accessories"> + Tilbehør + </string> <string name="InvFolder Friends"> Venner </string> @@ -1266,11 +1412,164 @@ tekstur i din beholdning. alle estates du administrerer for [OWNER] </string> <string name="RegionInfoAllowedResidents"> - Godkendte beboere: ([ALLOWEDAGENTS], max. [MAXACCESS]) + Godkendte beboere: ([ALLOWEDAGENTS], maks. [MAXACCESS]) </string> <string name="RegionInfoAllowedGroups"> Godkendte grupper: ([ALLOWEDGROUPS], max. [MAXACCESS]) </string> + <string name="ScriptLimitsParcelScriptMemory"> + Parcel script memory + </string> + <string name="ScriptLimitsParcelsOwned"> + Parceller listet: [PARCELS] + </string> + <string name="ScriptLimitsMemoryUsed"> + Memory brugt: [COUNT] kb ud af [MAX] kb; [AVAILABLE] kb tilgængeligt + </string> + <string name="ScriptLimitsMemoryUsedSimple"> + Memory brugt: [COUNT] kb + </string> + <string name="ScriptLimitsParcelScriptURLs"> + Parcel Script URL'er + </string> + <string name="ScriptLimitsURLsUsed"> + URL'er brugt: [COUNT] ud af [MAX]; [AVAILABLE] tilgængelige + </string> + <string name="ScriptLimitsURLsUsedSimple"> + URL'er brugt: [COUNT] + </string> + <string name="ScriptLimitsRequestError"> + Fejl ved anmodning om information + </string> + <string name="ScriptLimitsRequestNoParcelSelected"> + Ingen parcel valgt + </string> + <string name="ScriptLimitsRequestWrongRegion"> + Fejl: script information er kun tilgængelig i den nuværende region + </string> + <string name="ScriptLimitsRequestWaiting"> + Henter information... + </string> + <string name="ScriptLimitsRequestDontOwnParcel"> + Du har ikke rettigheder til at undersøge denne parcel + </string> + <string name="SITTING_ON"> + Sidder pÃ¥ + </string> + <string name="ATTACH_CHEST"> + Bryst + </string> + <string name="ATTACH_HEAD"> + Hoved + </string> + <string name="ATTACH_LSHOULDER"> + Venstre skulder + </string> + <string name="ATTACH_RSHOULDER"> + Højre skulder + </string> + <string name="ATTACH_LHAND"> + Venstre hÃ¥nd + </string> + <string name="ATTACH_RHAND"> + Højre hÃ¥nd + </string> + <string name="ATTACH_LFOOT"> + Venstre fod + </string> + <string name="ATTACH_RFOOT"> + Højre fod + </string> + <string name="ATTACH_BACK"> + Ryg + </string> + <string name="ATTACH_PELVIS"> + Bækken + </string> + <string name="ATTACH_MOUTH"> + Mund + </string> + <string name="ATTACH_CHIN"> + Hage + </string> + <string name="ATTACH_LEAR"> + Venstre øre + </string> + <string name="ATTACH_REAR"> + Højre øre + </string> + <string name="ATTACH_LEYE"> + Venstre øje + </string> + <string name="ATTACH_REYE"> + Højre øje + </string> + <string name="ATTACH_NOSE"> + Næse + </string> + <string name="ATTACH_RUARM"> + Højre overarm + </string> + <string name="ATTACH_RLARM"> + Højre underarm + </string> + <string name="ATTACH_LUARM"> + Venstre overarm + </string> + <string name="ATTACH_LLARM"> + Venstre underarm + </string> + <string name="ATTACH_RHIP"> + Højre hofte + </string> + <string name="ATTACH_RULEG"> + Højre lÃ¥r + </string> + <string name="ATTACH_RLLEG"> + Højre underben + </string> + <string name="ATTACH_LHIP"> + Venstre hofte + </string> + <string name="ATTACH_LULEG"> + Venste lÃ¥r + </string> + <string name="ATTACH_LLLEG"> + Venstre underben + </string> + <string name="ATTACH_BELLY"> + Mave + </string> + <string name="ATTACH_RPEC"> + Højre bryst + </string> + <string name="ATTACH_LPEC"> + Venstre bryst + </string> + <string name="ATTACH_HUD_CENTER_2"> + HUD Center 2 + </string> + <string name="ATTACH_HUD_TOP_RIGHT"> + HUD Øverst til højre + </string> + <string name="ATTACH_HUD_TOP_CENTER"> + HUD Foroven midtpÃ¥ + </string> + <string name="ATTACH_HUD_TOP_LEFT"> + HUD Øverst til venstre + </string> + <string name="ATTACH_HUD_CENTER_1"> + HUD Center 1 + </string> + <string name="ATTACH_HUD_BOTTOM_LEFT"> + HUD Nederst til venstre + </string> + <string name="ATTACH_HUD_BOTTOM"> + HUD For neden + </string> + <string name="ATTACH_HUD_BOTTOM_RIGHT"> + HUD Nederst til højre + </string> <string name="CursorPos"> Linie [LINE], Kolonne [COLUMN] </string> @@ -1280,17 +1579,26 @@ tekstur i din beholdning. <string name="PanelContentsNewScript"> Nyt script </string> + <string name="PanelContentsTooltip"> + Indhold i objekt + </string> + <string name="BusyModeResponseDefault"> + Beboeren du sendte en besked er 'optaget', hvilket betyder at han/hun ikke vil forstyrres. Din besked vil blive vis i hans/hendes IM panel til senere visning. + </string> <string name="MuteByName"> - (efter navn) + (Efter navn) </string> <string name="MuteAgent"> (beboer) </string> <string name="MuteObject"> - (objekt) + (Objekt) </string> <string name="MuteGroup"> - (gruppe) + (Gruppe) + </string> + <string name="MuteExternal"> + (Ekstern) </string> <string name="RegionNoCovenant"> Der er ingen regler for dette estate. @@ -1298,9 +1606,7 @@ tekstur i din beholdning. <string name="RegionNoCovenantOtherOwner"> Der er ingen regler for dette estate. Land pÃ¥ dette estate sælges af estate ejeren, ikke af Linden Lab. Kontakt venligst estate ejeren for detaljer om salg. </string> - <string name="covenant_last_modified"> - Sidst ændret: - </string> + <string name="covenant_last_modified" value="Sidst rettet:"/> <string name="none_text" value=" (ingen) "/> <string name="never_text" value=" (aldrig) "/> <string name="GroupOwned"> @@ -1315,6 +1621,15 @@ tekstur i din beholdning. <string name="ClassifiedUpdateAfterPublish"> (vil blive opdateret efter offentliggørelse) </string> + <string name="NoPicksClassifiedsText"> + Du har ikke oprettet nogen favoritter eller annoncer. Klik pÃ¥ plus knappen nedenfor for at oprette en favorit eller en annonce. + </string> + <string name="NoAvatarPicksClassifiedsText"> + Bruger har ingen favoritter eller annoncer + </string> + <string name="PicksClassifiedsLoadingText"> + Henter... + </string> <string name="MultiPreviewTitle"> Vis først </string> @@ -1385,22 +1700,36 @@ tekstur i din beholdning. Annullér </string> <string name="UploadingCosts"> - Uploader [%s] omkostninger + Uploader [NAME] pris L$ [AMOUNT] + </string> + <string name="BuyingCosts"> + At købe dette koster L$ [AMOUNT] </string> <string name="UnknownFileExtension"> Ukendt fil efternavn [.%s] Forventet .wav, .tga, .bmp, .jpg, .jpeg, or .bvh </string> + <string name="MuteObject2"> + Blokér + </string> <string name="AddLandmarkNavBarMenu"> Tilføj landemærke... </string> <string name="EditLandmarkNavBarMenu"> Redigér landemærke... </string> - <string name="accel-mac-control">⌃</string> - <string name="accel-mac-command">⌘</string> - <string name="accel-mac-option">⌥</string> - <string name="accel-mac-shift">⇧</string> + <string name="accel-mac-control"> + ⌃ + </string> + <string name="accel-mac-command"> + ⌘ + </string> + <string name="accel-mac-option"> + ⌥ + </string> + <string name="accel-mac-shift"> + ⇧ + </string> <string name="accel-win-control"> Ctrl+ </string> @@ -1531,7 +1860,7 @@ Forventet .wav, .tga, .bmp, .jpg, .jpeg, or .bvh Enhver </string> <string name="You"> - Dig + Du </string> <string name="Multiple Media"> Flere medietyper @@ -1655,39 +1984,15 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE]. <string name="Attached Earlobes"> Vedhæftede øreflipper </string> - <string name="Back Bangs"> - NakkehÃ¥r - </string> - <string name="Back Bangs Down"> - NakkehÃ¥r langt - </string> - <string name="Back Bangs Up"> - NakkehÃ¥r kort - </string> <string name="Back Fringe"> NakkehÃ¥r </string> - <string name="Back Hair"> - Volumen - </string> - <string name="Back Hair Down"> - Volumen nedad - </string> - <string name="Back Hair Up"> - Volumen op - </string> <string name="Baggy"> Posede </string> <string name="Bangs"> PandehÃ¥r </string> - <string name="Bangs Down"> - PandehÃ¥r ned - </string> - <string name="Bangs Up"> - PandehÃ¥r op - </string> <string name="Beady Eyes"> Stikkende øjne </string> @@ -1700,9 +2005,6 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE]. <string name="Big Butt"> Stor bagdel </string> - <string name="Big Eyeball"> - Store øjenæbler - </string> <string name="Big Hair Back"> Stort hÃ¥r: Bag </string> @@ -1877,9 +2179,6 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE]. <string name="Corner Down"> Nedadvendt </string> - <string name="Corner Normal"> - Normalt - </string> <string name="Corner Up"> Opadvendt </string> @@ -1889,9 +2188,6 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE]. <string name="Crooked Nose"> Skæv næse </string> - <string name="Cropped Hair"> - Kort hÃ¥r - </string> <string name="Cuff Flare"> Svaj </string> @@ -1910,15 +2206,9 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE]. <string name="Default Heels"> Standard hæle </string> - <string name="Default Toe"> - Standard snude - </string> <string name="Dense"> Tæt </string> - <string name="Dense hair"> - Tæt hÃ¥r - </string> <string name="Double Chin"> Dobbelthage </string> @@ -1964,9 +2254,6 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE]. <string name="Eye Spacing"> Øjenafstand </string> - <string name="Eyeball Size"> - Størrelse øjenæble - </string> <string name="Eyebrow Arc"> Bue pÃ¥ øjenbryn </string> @@ -1991,36 +2278,9 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE]. <string name="Eyeliner Color"> Eyeliner farve </string> - <string name="Eyes Back"> - Dybtliggende øjne - </string> <string name="Eyes Bugged"> UdstÃ¥ende øjne </string> - <string name="Eyes Forward"> - Øjne fremme - </string> - <string name="Eyes Long Head"> - Eyes Long Head - </string> - <string name="Eyes Shear Left Up"> - Eyes Shear Left Up - </string> - <string name="Eyes Shear Right Up"> - Eyes Shear Right Up - </string> - <string name="Eyes Short Head"> - Eyes Short Head - </string> - <string name="Eyes Spread"> - Stor afstand - </string> - <string name="Eyes Sunken"> - Indsunkne øjne - </string> - <string name="Eyes Together"> - Tætsiddende - </string> <string name="Face Shear"> Ansigts symmetri </string> @@ -2030,30 +2290,9 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE]. <string name="Far Set Eyes"> Stor afstand mellem øjne </string> - <string name="Fat"> - Tyk - </string> - <string name="Fat Head"> - Tykt hovede - </string> <string name="Fat Lips"> Tykke læber </string> - <string name="Fat Lower"> - Tyk nedre - </string> - <string name="Fat Lower Lip"> - Tyk underlæbe - </string> - <string name="Fat Torso"> - Tyk overkrop - </string> - <string name="Fat Upper"> - Tyk øvre - </string> - <string name="Fat Upper Lip"> - Tyk overlæbe - </string> <string name="Female"> Kvinde </string> @@ -2090,24 +2329,9 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE]. <string name="Freckles"> Fregner </string> - <string name="Front Bangs Down"> - PandehÃ¥r - ned - </string> - <string name="Front Bangs Up"> - PandehÃ¥r - op - </string> <string name="Front Fringe"> Frynser foran </string> - <string name="Front Hair"> - HÃ¥r foran - </string> - <string name="Front Hair Down"> - HÃ¥r foran - ned - </string> - <string name="Front Hair Up"> - HÃ¥r foran - op - </string> <string name="Full Back"> Langt ud bagtil </string> @@ -2381,9 +2605,6 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE]. <string name="Long arms"> Lange arme </string> - <string name="Longcuffs"> - Longcuffs - </string> <string name="Loose Pants"> Løse bukser </string> @@ -2448,7 +2669,7 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE]. Mere </string> <string name="More Gravity"> - More + Mere </string> <string name="More Lipstick"> Mere læbestift @@ -2546,9 +2767,6 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE]. <string name="No Eyeshadow"> Ingen øjenskygge </string> - <string name="No Heels"> - Ingen hæle - </string> <string name="No Lipgloss"> Ingen lipgloss </string> @@ -2606,9 +2824,6 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE]. <string name="Nostril Width"> Næsebor bredde </string> - <string name="Old"> - Gammel - </string> <string name="Opaque"> Uigennemsigtig </string> @@ -2708,9 +2923,6 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE]. <string name="Pointy Heels"> Spidse hæle </string> - <string name="Pointy Toe"> - Spids snude - </string> <string name="Ponytail"> Hestehale </string> @@ -2735,15 +2947,9 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE]. <string name="Red Hair"> Rødt hÃ¥r </string> - <string name="Red Skin"> - Rød hud - </string> <string name="Regular"> Almindelig </string> - <string name="Regular Muscles"> - Almindelige muskler - </string> <string name="Right Part"> Højre skildning </string> @@ -2753,9 +2959,6 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE]. <string name="Round"> Rund </string> - <string name="Round Forehead"> - Rund pande - </string> <string name="Ruddiness"> Rødmossethed </string> @@ -2768,24 +2971,12 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE]. <string name="Saddle Bags"> RidebukselÃ¥r </string> - <string name="Saddlebags"> - RidebukselÃ¥r - </string> - <string name="Scrawny"> - Radmager - </string> <string name="Scrawny Leg"> Magert ben </string> <string name="Separate"> Separat </string> - <string name="Shading"> - Skygger - </string> - <string name="Shadow hair"> - Skygge hÃ¥r - </string> <string name="Shallow"> Lille </string> @@ -2798,15 +2989,9 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE]. <string name="Shear Front"> "MÃ¥ne" </string> - <string name="Shear Left"> - Venstre - </string> <string name="Shear Left Up"> Venstre op </string> - <string name="Shear Right"> - Højre - </string> <string name="Shear Right Up"> Højre op </string> @@ -2867,15 +3052,6 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE]. <string name="Shoulders"> Skuldre </string> - <string name="Side Bangs"> - SidehÃ¥r - </string> - <string name="Side Bangs Down"> - Ned - </string> - <string name="Side Bangs Up"> - Op - </string> <string name="Side Fringe"> Side frynser </string> @@ -2891,9 +3067,6 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE]. <string name="Sides Hair Up"> Op </string> - <string name="Skinny"> - Tynd - </string> <string name="Skinny Neck"> Tynd hals </string> @@ -2942,9 +3115,6 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE]. <string name="Socks Length"> Strømper - længde </string> - <string name="Some"> - Nogen - </string> <string name="Soulpatch"> Soulpatch </string> @@ -2963,9 +3133,6 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE]. <string name="Squash Head"> Bredt hovede </string> - <string name="Squash/Stretch Head"> - Sammentryk/stræk hovede - </string> <string name="Stretch Head"> Stræk hovede </string> @@ -2984,18 +3151,6 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE]. <string name="Sweep Forward"> Stryge fremad </string> - <string name="Swept Back"> - Tilbagestrøget - </string> - <string name="Swept Back Hair"> - Tilbagestrøget hÃ¥r - </string> - <string name="Swept Forward"> - Fremadstrøget - </string> - <string name="Swept Forward Hair"> - Fremadstrøget hÃ¥r - </string> <string name="Tall"> Høj </string> @@ -3014,9 +3169,6 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE]. <string name="Thick Toe"> Bred snude </string> - <string name="Thickness"> - Tykkelse - </string> <string name="Thin"> Tynd </string> @@ -3047,12 +3199,6 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE]. <string name="Tight Sleeves"> Stramme ærmer </string> - <string name="Tilt Left"> - Hæld til venstre - </string> - <string name="Tilt Right"> - Hæld til højre - </string> <string name="Toe Shape"> Sko form </string> @@ -3137,6 +3283,15 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE]. <string name="LocationCtrlComboBtnTooltip"> Min lokationshistorik </string> + <string name="LocationCtrlAdultIconTooltip"> + Adult region + </string> + <string name="LocationCtrlModerateIconTooltip"> + Moderate region + </string> + <string name="LocationCtrlGeneralIconTooltip"> + Generel region + </string> <string name="UpdaterWindowTitle"> [APP_NAME] Opdatér </string> @@ -3167,6 +3322,12 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE]. <string name="UpdaterFailStartTitle"> Opstart af klient fejlede </string> + <string name="ItemsComingInTooFastFrom"> + [APP_NAME]: Genstande modtages for hurtigt fra [FROM_NAME], automatisk visning er slÃ¥et fra i [TIME] sekunder + </string> + <string name="ItemsComingInTooFast"> + [APP_NAME]: Genstande modtages for hurtigt, automatisk visning er slÃ¥et fra i [TIME] sekunder + </string> <string name="IM_logging_string"> -- Logning af IM aktiveret -- </string> @@ -3194,6 +3355,27 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE]. <string name="IM_moderator_label"> (Moderator) </string> + <string name="answered_call"> + Dit opkald er blevet besvaret + </string> + <string name="you_started_call"> + Du startede dette stemme kald + </string> + <string name="you_joined_call"> + Du er nu med i stemme opkald + </string> + <string name="name_started_call"> + [NAME] startede et stemmekald + </string> + <string name="ringing-im"> + Tilslutter stemme opkald... + </string> + <string name="connected-im"> + Forbundet, klik pÃ¥ Forlad for at lægge pÃ¥ + </string> + <string name="hang_up-im"> + Forladt stemme opkald + </string> <string name="only_user_message"> Du er den eneste deltager i denne samtale </string> @@ -3204,7 +3386,10 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE]. Tryk pÃ¥ [BUTTON NAME] knappen for at acceptére/tilslutte til denne stemme chat. </string> <string name="muted_message"> - Du har blokeret denne beboer. Hvis du starter en samtale vil denne blokering automatisk blive fjernet. + Du har blokeret denne beboer. Sendes en besked, vil beboeren fjernes fra blokeringslisten. + </string> + <string name="generic"> + Fejl ved anmodning, prøv venligst igen senere </string> <string name="generic_request_error"> Kunne ikke etablere forbindelse, prøv igen senere @@ -3224,19 +3409,252 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE]. <string name="not_a_mod_error"> Du er ikke moderator for denne samtale. </string> + <string name="muted"> + En gruppe moderator har deaktiveret din tekst chat. + </string> <string name="muted_error"> Du er blevet "blokeret". </string> <string name="add_session_event"> Ikke muligt at tilføge brugere til samtale med [RECIPIENT]. </string> + <string name="message"> + Kunne ikke sende din besked til session med [RECIPIENT]. + </string> <string name="message_session_event"> Ikke muligt at sende din besked til samtalen med [RECIPIENT]. </string> + <string name="mute"> + Fejl under moderation. + </string> + <string name="removed"> + Du er blevet fjernet fra denne gruppe. + </string> <string name="removed_from_group"> Du er blevet fjernet fra gruppen. </string> <string name="close_on_no_ability"> Du har ikke længere mulighed for at deltage i samtalen </string> + <string name="unread_chat_single"> + [SOURCES] har sagt noget nyt + </string> + <string name="unread_chat_multiple"> + [SOURCES] har sagt noget nyt + </string> + <string name="session_initialization_timed_out_error"> + Initialisering af session er "timed out" + </string> + <string name="paid_you_ldollars"> + [NAME] betalte dig L$[AMOUNT] + </string> + <string name="you_paid_ldollars"> + Du betalte [NAME] L$[AMOUNT] [REASON]. + </string> + <string name="you_paid_ldollars_no_info"> + Du betalte L$[AMOUNT]. + </string> + <string name="you_paid_ldollars_no_reason"> + Du betalte [NAME] L$[AMOUNT]. + </string> + <string name="you_paid_ldollars_no_name"> + Du betalte L$[AMOUNT] [REASON]. + </string> + <string name="for a parcel of land"> + for en parcel land + </string> + <string name="for a land access pass"> + for en billet til land + </string> + <string name="for deeding land"> + for dedikering af land + </string> + <string name="to create a group"> + for at oprette gruppe + </string> + <string name="to join a group"> + for at blive medlem i gruppe + </string> + <string name="to upload"> + for at uploade + </string> + <string name="giving"> + Giver L$ [AMOUNT] + </string> + <string name="uploading_costs"> + Pris for upload er L$ [AMOUNT] + </string> + <string name="this_costs"> + Prisen er L$ [AMOUNT] + </string> + <string name="buying_selected_land"> + Køber valgte land L$ [AMOUNT] + </string> + <string name="this_object_costs"> + Dette objekt koster L$ [AMOUNT] + </string> + <string name="group_role_everyone"> + Enhver + </string> + <string name="group_role_officers"> + Administratorer + </string> + <string name="group_role_owners"> + Ejere + </string> + <string name="uploading_abuse_report"> + Uploader... + +Krænkelsesanmeldelse + </string> + <string name="New Shape"> + Ny kropsbygning + </string> + <string name="New Skin"> + Ny hud + </string> + <string name="New Hair"> + Nyt hÃ¥r + </string> + <string name="New Eyes"> + Nye øjne + </string> + <string name="New Shirt"> + Ny trøje + </string> + <string name="New Pants"> + Nye bukser + </string> + <string name="New Shoes"> + Nye sko + </string> + <string name="New Socks"> + Nye strømper + </string> + <string name="New Jacket"> + Ny jakke + </string> + <string name="New Gloves"> + Nye handsker + </string> + <string name="New Undershirt"> + Ny undertrøje + </string> + <string name="New Underpants"> + Nye underbukser + </string> + <string name="New Skirt"> + Ny nederdel + </string> + <string name="New Alpha"> + Ny alpha + </string> + <string name="New Tattoo"> + Ny tatovering + </string> + <string name="Invalid Wearable"> + Kan ikke tages pÃ¥ + </string> + <string name="New Script"> + Nyt script + </string> + <string name="New Folder"> + Ny folder + </string> + <string name="Contents"> + Indhold + </string> + <string name="Gesture"> + Bevægelse + </string> + <string name="Male Gestures"> + Mandlige bevægelser + </string> + <string name="Female Gestures"> + Kvindelige bevægelser + </string> + <string name="Other Gestures"> + Andre bevægelser + </string> + <string name="Speech Gestures"> + Tale bevægelser + </string> + <string name="Common Gestures"> + Almindelige bevægelser + </string> + <string name="Male - Excuse me"> + Mand - Undskyld mig + </string> + <string name="Male - Get lost"> + Mand - Skrid! + </string> + <string name="Male - Blow kiss"> + Mand - Pust et kys + </string> + <string name="Male - Boo"> + Mand - Boo + </string> + <string name="Male - Bored"> + Mand - Keder sig + </string> + <string name="Male - Hey"> + Mand - Hey + </string> + <string name="Male - Laugh"> + Mand - Latter + </string> + <string name="Male - Repulsed"> + Mand - Frastødt + </string> + <string name="Male - Shrug"> + Mand - Skuldertræk + </string> + <string name="Male - Stick tougue out"> + Mand - Stik tunge ud + </string> + <string name="Male - Wow"> + Mand - Wow + </string> + <string name="FeMale - Excuse me"> + Kvinde - Undskyld mig + </string> + <string name="FeMale - Get lost"> + Kvinde - Skrid! + </string> + <string name="FeMale - Blow kiss"> + Kvinde - Pust et kys + </string> + <string name="FeMale - Boo"> + Kvinde - Boo + </string> + <string name="Female - Bored"> + Kvinde - Keder sig + </string> + <string name="Female - Hey"> + Kvinde - Hey + </string> + <string name="Female - Laugh"> + Kvinde - Latter + </string> + <string name="Female - Repulsed"> + Kvinde - Frastødt + </string> + <string name="Female - Shrug"> + Kvinde - Skuldertræk + </string> + <string name="Female - Stick tougue out"> + Kvinde - Stik tungen ud + </string> + <string name="Female - Wow"> + Kvinde - Wow + </string> + <string name="AvatarBirthDateFormat"> + [mthnum,datetime,slt]/[day,datetime,slt]/[year,datetime,slt] + </string> + <string name="DefaultMimeType"> + ingen/ingen + </string> + <string name="texture_load_dimensions_error"> + Kan ikke hente billeder større end [WIDTH]*[HEIGHT] + </string> </strings> diff --git a/indra/newview/skins/default/xui/da/teleport_strings.xml b/indra/newview/skins/default/xui/da/teleport_strings.xml index 43f8e5144d..071aab46f4 100644 --- a/indra/newview/skins/default/xui/da/teleport_strings.xml +++ b/indra/newview/skins/default/xui/da/teleport_strings.xml @@ -63,6 +63,9 @@ Prøv evt. igen om lidt. <message name="completing"> Fuldfører teleport. </message> + <message name="completed_from"> + Teleport fuldført fra [T_SLURL] + </message> <message name="resolving"> Finder destination. </message> diff --git a/indra/newview/skins/default/xui/de/floater_about.xml b/indra/newview/skins/default/xui/de/floater_about.xml index 0beb54032f..89f9f87043 100644 --- a/indra/newview/skins/default/xui/de/floater_about.xml +++ b/indra/newview/skins/default/xui/de/floater_about.xml @@ -8,7 +8,7 @@ Kompiliert mit [COMPILER] version [COMPILER_VERSION] </floater.string> <floater.string name="AboutPosition"> - Sie befinden sich in [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] in [REGION] auf [HOSTNAME] ([HOSTIP]) + Sie befinden sich in [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] in [REGION] auf <nolink>[HOSTNAME]</nolink> ([HOSTIP]) [SERVER_VERSION] [[SERVER_RELEASE_NOTES_URL] [ReleaseNotes]] </floater.string> @@ -43,13 +43,14 @@ Vivox-Version: [VIVOX_VERSION] </panel> <panel label="Danksagung" name="credits_panel"> <text_editor name="credits_editor"> - Second Life wird Ihnen präsentiert von Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl und vielen anderen. + Second Life wird Ihnen präsentiert von Philip, Tessa, Andrew, Cory, Ian, James, Phoenix, Ryan, Haney, Dan, Char, Ben, John, Tanya, Eddie, Richard, Mitch, Doug, Eric, Frank, Bruce, Aaron, Peter, Alice, Charlie, Debra, Eileen, Helen, Janet, Steffan, Steve, Tom, Mark, Hunter, Xenon, Burgess, Bill, Jim, Lee, Hamlet, Daniel, Jeff, Todd, Sarah, Tim, Stephanie, Colin, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Jack, Vektor, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Jesse, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Yuko, Makiko, Thomas, Harry, Seth, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Brad, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, Beez, Milo, Hermia, Red, Thrax, Gulliver, Joe, Sally, Paul, Jose, Rejean, Dore, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, Dustin, George, Del, Matthew, Cat, Jacqui, Adrian, Viola, Alfred, Noel, Irfan, Yool, Rika, Jane, Frontier, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Jeremy, JP, Jake, Anthony, Maurice, Madhavi, Leopard, Kyle, Joon, Bert, Belinda, Jon, Kristi, Bridie, Pramod, Socrates, Maria, Aric, Adreanne, Jay, Kari, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Colossus, Zen, BigPapi, Pastrami, Kurz, Mani, Neuro, Mel, Sardonyx, MJ, Rowan, Sgt, Elvis, Samuel, Leo, Bryan, Niko, Austin, Soft, Poppy, Rachel, Aki, Banzai, Alexa, Sue, Bender, CG, Angelo, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Rothman, Niall, Marin, Allison, Katie, Dawn, Dusty, Katt, Judy, Andrea, Ambroff, Infinity, Rico, Gail, Kalpana, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Maestro, Simone, Yang, T, Shannon, Nelson, Khanh, Scott, Courtney, Charlene, Quixote, Susan, Zed, Amanda, Katelin, Enkidu, Roxie, Esbee, JoRoan, Scarlet, Tay, Kevin, Wolfgang, Johnny, Ray, Andren, Merov, Bob, Rand, Howard, Callen, Heff, Galen, Newell, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl, Ashley, JessieAnn, Huseby, Karina, Paris, Kurt, Rick, Lis, Kotler, Theeba, Lynx, Murphy, Doten, Taka, Norm, Jillian, Marcus, Mae, Novack, Esther, Perry, Dana, Ducot, Javier, Porter, Madison, Gecko, Dough, JR, Gisele, Crimp, Norie, Arch, Kimi, Fisher, Barbara, Jason, Peggy, Bernard, Jules, Leroy, Eva, Khederian, Campbell, Vogt, Masido, Karel, Torres, Lo, Breezer, Delby, Rountree, Anna, Servus, Rue, Itiaes, Chuck, Luna, Novella, Zaza, Wen, Gino, Lex, Cassandra, Limey, Nancy, Anukul, Silver, Brodesky, Jinsai, Squid, Gez, Rakesh, Ladan, Edelman, Marcet, Squire, Tatem, Tony, Jerm, Tia, Falcon, BK, Tiggs, Driscoll, Bacon, Timothee, Cru, Carmilla, Coyot, Webb, Kazu, Rudas, LJ, Sea, Ali Wallace, Bewest, Pup, Drub, Dragon, Inoshiro, Byron, Rhett, Xandix, Aimee, Fredrik, Thor, Teddy, Baron, Nelly, Ghengis, Epic, Eli, Stone, Grapes, Irie, Prep, Scobu, Valerie, Alain und vielen anderen. -Vielen Dank den folgenden Einwohnern, die uns geholfen haben, dies zur bisher besten Version zu machen: able whitman, Adeon Writer, adonaira aabye, Aeron Kohime, Agathos Frascati, Aimee Trescothick, Aleric Inglewood, Alissa Sabre, Aminom Marvin, Angela Talamasca, Aralara Rajal, Armin Weatherwax, Ashrilyn Hayashida, Athanasius Skytower, Aura Dirval, Barney Boomslang, Biancaluce Robbiani, Biker Offcourse, Borg Capalini, Bulli Schumann, catherine pfeffer, Chalice Yao, Corre Porta, Court Goodman, Cummere Mayo, Dale Innis, Darien Caldwell, Darjeeling Schoonhoven, Daten Thielt, dimentox travanti, Dirk Talamasca, Drew Dwi, Duckless Vandyke, Elanthius Flagstaff, Electro Burnstein, emiley tomsen, Escort DeFarge, Eva Rau, Ezian Ecksol, Fire Centaur, Fluf Fredriksson, Francisco Koolhoven, Frontera Thor, Frungi Stastny, Gally Young, gearsawe stonecutter, Gigs Taggart, Gordon Wendt, Gudmund Shepherd, Gypsy Paz, Harleen Gretzky, Henri Beauchamp, Inma Rau, Irene Muni, Iskar Ariantho, Jacek Antonelli, JB Kraft, Jessicka Graves, Joeseph Albanese, Joshua Philgarlic, Khyota Wulluf, kirstenlee Cinquetti, Latif Khalifa, Lex Neva, Lilibeth Andree, Lisa Lowe, Lunita Savira, Loosey Demonia, lum pfohl, Marcos Fonzarelli, MartinRJ Fayray, Marusame Arai, Matthew Dowd, Maya Remblai, McCabe Maxsted, Meghan Dench, Melchoir Tokhes, Menos Short, Michelle2 Zenovka, Mimika Oh, Minerva Memel, Mm Alder, Ochi Wolfe, Omei Turnbull, Pesho Replacement, Phantom Ninetails, phoenixflames kukulcan, Polo Gufler, prez pessoa, princess niven, Prokofy Neva, Qie Niangao, Rem Beattie, RodneyLee Jessop, Saijanai Kuhn, Seg Baphomet, Sergen Davies, Shirley Marquez, SignpostMarv Martin, Sindy Tsure, Sira Arbizu, Skips Jigsaw, Sougent Harrop, Spritely Pixel, Squirrel Wood, StarSong Bright, Subversive Writer, Sugarcult Dagger, Sylumm Grigorovich, Tammy Nowotny, Tanooki Darkes, Tayra Dagostino, Theoretical Chemistry, Thickbrick Sleaford, valerie rosewood, Vex Streeter, Vixen Heron, Whoops Babii, Winter Ventura, Xiki Luik, Yann Dufaux, Yina Yao, Yukinoroh Kamachi, Zolute Infinity, Zwagoth Klaar +Wir bedanken uns bei folgenden Einwohnern, die uns geholfen haben, dies zur bisher besten Version zu machen: Drew Dwi, Zai Lynch, Latif Khalifa, Ellla McMahon, Harleen Gretzky, Squirrel Wood, Malarthi Behemoth, Dante Tucker, Buckaroo Mu, Eddi Decosta, Dirk, Talamasca, Torben Trautman, Irene Muni, Lilly Zenovka, Vick Forcella, Sasy Scarborough, Gentle Welinder, Elric Anatine, Techwolf Lupindo, Dusan Writer, WolfPup Lowenhar, Marianne McCann, Fiachra Lach, Sitearm Madonna, Sudane Erato, Sahkolihaa Contepomi, Sachi Vixen, Questar Utu, Dimitrio Lewis, Matto Destiny, Scrim Pinion, Radio Signals, Psi Merlin, Pixel Gausman, Mel Vanbeeck, Laurent Bechir, Lamorna Proctor, Lares Carter, Gwyneth Llewelyn, Hydra Shaftoe, Holger Gilruth, Gentle Heron, Carla Broek, Boroondas Gupte, Fury Rosewood, Flower Ducatillon, Colpo Wexler, gwampa Lomu, Borg Capalini, Beansy Twine, Ardy Lay, , 45ms Zhong, Adeon Writer, Aeonix Aeon, Ai Austin, Aiko Ying, Alexandrea Fride, Alliez Mysterio, Annie Milestone, Annika Genezzia, Ansariel Hiller, ArminasX Saiman, Arya Braveheart, Asaeda Meltingdots, Asturkon Jua, Avallyn Oakleaf, Avatar Quinzet, BabyA Littlething, Bacchus Ireto, Bazaar, Riva, Benjamin Bigdipper, Beth Walcher, Bezilon Kasei, Biancaluce Robbiani, Bill Walach, blakopal Galicia, Blitzckreed Levenque, Bryn Oh, Callipygian Christensen, Cap Carver, Carr Arbenlow, Chantal Harvey, Charles Courtois, Charlie Sazaland, Cherry Cheevers, ChickyBabes Zuzu, Christopher Organiser, Ciaran Laval, Clara Young, Celierra Darling, Corinne Helendale, Corro Moseley, Coughdrop Littlething, Darien Caldwell, Dartagan Shepherd, Debs Regent, Decro Schmooz, Denim Kamachi, DiJodi Dubratt, Dil Spitz, Edgware Marker, Egehan Dryke, Emma Portilo, Emmie Fairymeadow, Evangelista Emerald, Faelon Swordthain, Frenchimmo Sabra, Gaberoonie Zanzibar, Ganymedes Costagravas, Gene Frostbite, GeneJ Composer, Giggles Littlebird, Grady Echegaray, Guni Greenstein, Gypsy Tripsa, Hackshaven Harford, Ham Rambler, Han Shuffle, Hanglow Short, Hatzfeld Runo, herina Bode, Horatio Freund, Hypatia Callisto, Hypatia Pickens, Identity Euler, Imnotgoing Sideways, Innula Zenovka, Iyoba Tarantal, Jack Abraham, Jagga Meredith, Jennifer Boyle, Jeremy Marquez, Jessica Qin, Jinx Nordberg, Jo Bernandes, Jocial Sonnenkern, Joel Savard, Jondan Lundquist, Josef Munster, Josette Windlow, Juilan Tripsa, Juro Kothari, Justin RiversRunRed, Kagehi Kohn, Kaimen Takahe, Keklily Longfall, Ken Lavender, Kestral Karas, Khisme Nitely, Kimar Coba, Kithrak Kirkorian, Kitty Barnett, Kolor Fall, Komiko Okamoto, Korvel Noh, Larry Pixel, Leal Choche, len Starship, Lenae Munz, Lexi Frua, Lillie Cordeaux, Lizzy Macarthur, LSL Scientist, Luban Yiyuan, Luc Starsider, Maccus McCullough, Madison Blanc, Maggie Darwin, Mallory Destiny, Manx Wharton, Marc Claridge, Marc2 Sands, Matthew Anthony, Maxim RiversRunRed, Medhue Simoni, Melinda Latynina, Mencius Watts, Michi Lumin, Midian Farspire, Miles Glaz, Mindy Mathy, Mitch Wagner, Mo Hax, Mourna Biziou, Nao Noe, naofan Teardrop, Naomah Beaumont, Nathiel Siamendes, Nber Medici, Neko Link, Netpat Igaly, Neutron Chesnokov, Newfie Pendragon, Nicholai Laviscu, Nick Rhodes, Nicoladie Gymnast, Ollie Kubrick, Orenj Marat, Orion Delphis, Oryx Tempel, Parvati Silverweb, PeterPunk Mooney, Pixel Scientist, Pounce Teazle, Professor Noarlunga, Quantum Destiny, Quicksilver Hermes, Ralf Setsuko, RAT Quan, RedMokum Bravin, Revolution Perenti, Rezit Sideways, Rich Grainger, Rosco Teardrop, Rose Evans, Rudee Voom, RufusTT Horsefly, Saii Hallard, SaintLEOlions Zimer, Samm Larkham, Satanello Miami, SexySteven Morrisey, Sheet Spotter, Shnurui Troughton, sicarius Thorne, Sicarius Toxx, Sini Nubalo, SLB Wirefly, snowy Sidran, Soupa Segura, ST Mensing, Starshine Halasy, Stickman Ingmann, Synystyr Texan, Takeda Terrawyng, Tali Rosca, Templar Merlin, Tezcatlipoca Bisiani, Tiel Stonecutter, Tony Kembia, TouchaHoney Perhaps, Trey Reanimator, TriloByte Zanzibar, Trinity Dechou, Trinity Dejavu, Unlikely Quintessa, UsikuFarasi Kanarik, Veritas Raymaker, Vex Streeter, Viaticus Speculaas, Villain Baroque, Vixie Durant, Void Singer, Watty Berkson, Westley Schridde, Westley Streeter, Whimsy Winx, Winter Ventura, Wundur Primbee, xstorm Radek, YongYong Francois, Zak Westminster, Zana Kohime, Zaren Alexander, Zeja Pyle, ZenMondo Wormser, Zoex Flanagan und vielen anderen. -Um im Geschäftsleben erfolreich zu sein, sei kühn, sei schnell, sei anders. --Henry Marchant + +„Die Arbeit beginnt aufs Neue, die Hoffnung lebt weiter, und der Traum wird niemals sterben.“ - Edward Kennedy </text_editor> </panel> <panel label="Lizenzen" name="licenses_panel"> @@ -73,7 +74,8 @@ google-perftools Copyright (c) 2005, Google Inc. Alle Rechte vorbehalten. Details siehe licenses.txt. -Voice-Chat-Audiocoding: Polycom(R) Siren14(TM) (ITU-T Empf.G.722.1 Anhang C) +Voice-Chat-Audiocoding: Polycom(R) Siren14(TM) +(ITU-T Empf.G.722.1 Anhang C) </text_editor> </panel> </tab_container> diff --git a/indra/newview/skins/default/xui/de/floater_about_land.xml b/indra/newview/skins/default/xui/de/floater_about_land.xml index cd5abf86e0..3026ff64b2 100644 --- a/indra/newview/skins/default/xui/de/floater_about_land.xml +++ b/indra/newview/skins/default/xui/de/floater_about_land.xml @@ -1,5 +1,14 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="floaterland" title="LAND-INFO"> + <floater.string name="maturity_icon_general"> + "Parcel_PG_Dark" + </floater.string> + <floater.string name="maturity_icon_moderate"> + "Parcel_M_Dark" + </floater.string> + <floater.string name="maturity_icon_adult"> + "Parcel_R_Dark" + </floater.string> <floater.string name="Minutes"> [MINUTES] Minuten </floater.string> @@ -12,7 +21,7 @@ <floater.string name="Remaining"> Restzeit </floater.string> - <tab_container name="landtab"> + <tab_container name="landtab" tab_min_width="40" width="489"> <panel label="ALLGEMEIN" name="land_general_panel"> <panel.string name="new users only"> Nur neue Benutzer @@ -83,7 +92,7 @@ <text name="GroupText"> Leyla Linden </text> - <button label="Festlegen" label_selected="Einstellen..." name="Set..."/> + <button label="Festlegen" label_selected="Einstellen..." name="Set..." width="90"/> <check_box label="Übertragung an Gruppe zulassen" name="check deed" tool_tip="Ein Gruppen-Officer kann dieses Land der Gruppe übertragen. Das Land wird dann über die Landzuteilung der Gruppe verwaltet."/> <button label="Übertragung" label_selected="Übertragen..." name="Deed..." tool_tip="Sie können Land nur übertragen, wenn Sie in der ausgewählten Gruppe Officer sind."/> <check_box label="Eigentümer leistet Beitrag durch Übertragung" name="check contrib" tool_tip="Wenn das Land an die Gruppe übertragen wird, trägt der frühere Eigentümer ausreichend Landnutzungsrechte bei, um es zu halten."/> @@ -101,10 +110,10 @@ <text name="For sale to"> Zum Verkauf an: [BUYER] </text> - <text name="Sell with landowners objects in parcel." width="210"> + <text left_delta="-50" name="Sell with landowners objects in parcel." width="240"> Objekte sind im Verkauf eingeschlossen </text> - <text name="Selling with no objects in parcel." width="237"> + <text name="Selling with no objects in parcel." width="260"> Objekte sind im Verkauf nicht eingeschlossen </text> <button bottom="-222" label="Landverkauf abbrechen" label_selected="Landverkauf abbrechen" name="Cancel Land Sale"/> @@ -142,15 +151,13 @@ Gekauftes Land in dieser Region kann nicht wiederverkauft werden. </panel.string> <panel.string name="can_change"> - Gekauftes Land in dieser Region kann zusammengelegt und -geteilt werden. + Gekauftes Land in dieser Region kann zusammengelegt und geteilt werden. </panel.string> <panel.string name="can_not_change"> - Gekauftes Land in dieser Region kann nicht zusammengelegt -und geteilt werden. + Gekauftes Land in dieser Region kann nicht zusammengelegt und geteilt werden. </panel.string> <text name="estate_section_lbl"> - Grundstück: + Grundbesitz: </text> <text name="estate_name_text"> Mainland @@ -162,7 +169,7 @@ und geteilt werden. (keiner) </text> <text_editor name="covenant_editor"> - Für dieses Grundstück fehlt der Vertrag. + Für diesen Grundbesitz fehlt der Vertrag. </text_editor> <text name="covenant_timestamp_text"> Letzte Änderung am Mittwoch, den 31. Dez. 1969, 16:00:00 @@ -230,7 +237,7 @@ werden. <text left="14" name="Owned by parcel owner:" width="200"> Im Eigentum des Parzellenbesitzers: </text> - <text left="204" name="owner_objects_text" width="48"> + <text left="204" left_delta="200" name="owner_objects_text" width="48"> [COUNT] </text> <button label="Anzeigen" label_selected="Anzeigen" name="ShowOwner" right="-135" width="60"/> @@ -257,7 +264,7 @@ werden. <text left="204" name="selected_objects_text" width="48"> [COUNT] </text> - <text left="4" name="Autoreturn" width="380"> + <text name="Autoreturn"> Objekte anderer Einwohner automatisch zurückgeben (Minuten, 0 für aus): </text> <line_editor name="clean other time" right="-10" width="56"/> @@ -269,8 +276,8 @@ werden. <name_list name="owner list"> <name_list.columns label="Typ" name="type"/> <name_list.columns label="Name" name="name"/> - <name_list.columns label="Zählen" name="count"/> - <name_list.columns label="Aktuellster" name="mostrecent"/> + <name_list.columns label="Anzahl" name="count" width="80"/> + <name_list.columns label="Aktuellstes" name="mostrecent"/> </name_list> </panel> <panel label="OPTIONEN" name="land_options_panel"> @@ -328,8 +335,8 @@ Nur große Parzellen können in der Suche aufgeführt werden. <text name="land_options_label"> Landoptionen: </text> - <check_box label="Sicher (kein Schaden)" name="check safe" tool_tip="Falls aktiviert, wird Land auf Option „Sicher“ eingestellt, Kampfschäden sind deaktiviert. Falls nicht aktiviert, sind Kampfschäden aktiviert."/> - <check_box label="Kein Stoßen" name="PushRestrictCheck" tool_tip="Verhindert Skripte am Stoßen. Durch Aktivieren dieser Option verhindern Sie störendes Verhalten auf Ihrem Land."/> + <check_box label="Sicher (kein Schaden)" name="check safe" tool_tip="Falls aktiviert, wird Land auf Option „Sicher“ eingestellt, Kampfschäden sind deaktiviert. Ansonsten sind Kampfschäden aktiviert."/> + <check_box label="Kein Stoßen" name="PushRestrictCheck" tool_tip="Verhindert Stoßen durch Skripte. Durch Aktivieren dieser Option verhindern Sie störendes Verhalten auf Ihrem Land."/> <check_box label="Ort in Suche anzeigen (30 L$/Woche)" name="ShowDirectoryCheck" tool_tip="Diese Parzelle in Suchergebnissen anzeigen."/> <combo_box name="land category with adult"> <combo_box.item label="Alle Kategorien" name="item0"/> @@ -346,7 +353,7 @@ Nur große Parzellen können in der Suche aufgeführt werden. <combo_box.item label="Shopping" name="item11"/> <combo_box.item label="Sonstige" name="item12"/> </combo_box> - <combo_box left="266" name="land category" width="130"> + <combo_box name="land category"> <combo_box.item label="Alle Kategorien" name="item0"/> <combo_box.item label="Lindenort" name="item1"/> <combo_box.item label="Kunst und Kultur" name="item3"/> @@ -368,7 +375,7 @@ Nur große Parzellen können in der Suche aufgeführt werden. <text name="landing_point"> Landepunkt: [LANDING] </text> - <button label="Festlegen" label_selected="Festlegen" left="234" name="Set" tool_tip="Legt den Landepunkt fest, an dem Besucher ankommen. Legt die Position Ihres Avatars innerhalb dieser Parzelle fest." width="70"/> + <button label="Festlegen" label_selected="Festlegen" left="234" name="Set" right="-88" tool_tip="Legt Ihren Standort als Landepunkt fest, an dem Besucher ankommen. Legt die Position Ihres Avatars innerhalb dieser Parzelle fest." width="70"/> <button label="Löschen" label_selected="Löschen" left="312" name="Clear" tool_tip="Landepunkt löschen" width="70"/> <text name="Teleport Routing: "> Teleport-Route: @@ -387,11 +394,7 @@ Nur große Parzellen können in der Suche aufgeführt werden. <text name="at URL:"> Homepage: </text> - <button label="Festlegen" label_selected="Einstellen..." name="set_media_url"/> - <text name="CurrentURL:"> - Aktuelle Seite: - </text> - <button label="Zurücksetzen..." label_selected="Zurücksetzen..." name="reset_media_url" tool_tip="URL aktualisieren"/> + <button label="Festlegen" name="set_media_url"/> <check_box label="URL ausblenden" name="hide_media_url" tool_tip="Aktivieren Sie diese Option, wenn Sie nicht möchten, dass unautorisierte Personen die Medien-URL sehen können. Diese Option ist für HTML-Medien nicht verfügbar."/> <text name="Description:"> Inhalt: @@ -422,6 +425,7 @@ Nur große Parzellen können in der Suche aufgeführt werden. <text name="MusicURL:"> Musik-URL: </text> + <check_box label="URL ausblenden" name="hide_music_url" tool_tip="Aktivieren Sie diese Option, wenn Sie nicht möchten, dass unautorisierte Personen die Musik-URL sehen können"/> <text name="Sound:"> Sound: </text> @@ -430,25 +434,28 @@ Nur große Parzellen können in der Suche aufgeführt werden. Voice: </text> <check_box label="Voice aktivieren" name="parcel_enable_voice_channel"/> - <check_box label="Voice aktivieren (vom Grundstück eingerichtet)" name="parcel_enable_voice_channel_is_estate_disabled"/> - <check_box label="Voice auf diese Parzelle beschränken" name="parcel_enable_voice_channel_parcel"/> + <check_box label="Voice aktivieren (vom Grundbesitz eingerichtet)" name="parcel_enable_voice_channel_is_estate_disabled"/> + <check_box label="Voice auf diese Parzelle beschränken" name="parcel_enable_voice_channel_local"/> </panel> <panel label="ZUGANG" name="land_access_panel"> <panel.string name="access_estate_defined"> - (Durch Grundstück festgelegt) + (Durch Grundbesitz festgelegt) + </panel.string> + <panel.string name="allow_public_access"> + Öffentlichen Zugang erlauben ([MATURITY]) </panel.string> <panel.string name="estate_override"> - Eine oder mehrere dieser Optionen gelten auf Grundstücksebene + Eine oder mehrere dieser Optionen gelten auf Grundbesitzebene </panel.string> <text name="Limit access to this parcel to:"> Zugang zu dieser Parzelle </text> <check_box label="Öffentlichen Zugang erlauben [MATURITY]" name="public_access"/> - <text name="Only Allow"> + <text name="Only Allow" width="400"> Zugang auf Einwohner beschränken, die überprüft wurden von: </text> - <check_box label="Zahlungsinformation gespeichert [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="Nicht identifizierte Einwohner verbannen."/> - <check_box label="Altersüberprüfung [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="Einwohner ohne Altersüberprüfung verbannen. Weitere Informationen finden Sie auf [SUPPORT_SITE]."/> + <check_box label="Zahlungsinformation gespeichert [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="Einwohner ohne Zahlungsinformation nicht zulassen."/> + <check_box label="Altersüberprüfung [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="Einwohner ohne Altersüberprüfung nicht zulassen. Weitere Informationen finden Sie im [SUPPORT_SITE]."/> <check_box label="Gruppenzugang erlauben: [GROUP]" name="GroupCheck" tool_tip="Gruppe im Register „Allgemein“ festlegen."/> <check_box label="Pässe verkaufen an:" name="PassCheck" tool_tip="Ermöglicht befristeten Zugang zu dieser Parzelle"/> <combo_box name="pass_combo"> diff --git a/indra/newview/skins/default/xui/de/floater_animation_preview.xml b/indra/newview/skins/default/xui/de/floater_animation_preview.xml index ce971d158d..82a4a51d07 100644 --- a/indra/newview/skins/default/xui/de/floater_animation_preview.xml +++ b/indra/newview/skins/default/xui/de/floater_animation_preview.xml @@ -106,6 +106,9 @@ Maximal erlaubt sind [MAX_LENGTH] Sekunden. <floater.string name="E_ST_NO_XLT_EMOTE"> Emote-Name kann nicht gelesen werden. </floater.string> + <floater.string name="E_ST_BAD_ROOT"> + Falscher Root-Joint-Name, "hip" verwenden. + </floater.string> <text name="name_label"> Name: </text> @@ -139,35 +142,35 @@ Maximal erlaubt sind [MAX_LENGTH] Sekunden. Ausdruck </text> <combo_box label="" name="emote_combo" tool_tip="Steuert Gesichtsregungen während der Animation"> - <combo_box.item label="(Keiner)" name="[None]"/> - <combo_box.item label="Aaaaah" name="Aaaaah"/> - <combo_box.item label="Ängstlich" name="Afraid"/> - <combo_box.item label="Verärgert" name="Angry"/> - <combo_box.item label="Grinst" name="BigSmile"/> - <combo_box.item label="Gelangweilt" name="Bored"/> - <combo_box.item label="Weinen" name="Cry"/> - <combo_box.item label="Verachten" name="Disdain"/> - <combo_box.item label="Verlegen" name="Embarrassed"/> - <combo_box.item label="Stirnrunzeln" name="Frown"/> - <combo_box.item label="Küssen" name="Kiss"/> - <combo_box.item label="Lachen" name="Laugh"/> - <combo_box.item label="Bäääh" name="Plllppt"/> - <combo_box.item label="Angewidert" name="Repulsed"/> - <combo_box.item label="Traurig" name="Sad"/> - <combo_box.item label="Schulterzucken" name="Shrug"/> - <combo_box.item label="Lächeln" name="Smile"/> - <combo_box.item label="Überraschung" name="Surprise"/> - <combo_box.item label="Zwinkern" name="Wink"/> - <combo_box.item label="Sorgenvoll" name="Worry"/> + <item label="(Keiner)" name="[None]" value=""/> + <item label="Aaaaah" name="Aaaaah" value="Aaaaah"/> + <item label="Ängstlich" name="Afraid" value="Ängstlich"/> + <item label="Verärgert" name="Angry" value="Verärgert"/> + <item label="Grinst" name="BigSmile" value="Grinsend"/> + <item label="Gelangweilt" name="Bored" value="Gelangweilt"/> + <item label="Weinen" name="Cry" value="Weinen"/> + <item label="Verachten" name="Disdain" value="Verachten"/> + <item label="Verlegen" name="Embarrassed" value="Verlegen"/> + <item label="Stirnrunzeln" name="Frown" value="Stirnrunzeln"/> + <item label="Küssen" name="Kiss" value="Küssen"/> + <item label="Lachen" name="Laugh" value="Lachen"/> + <item label="Bäääh" name="Plllppt" value="Bäääh"/> + <item label="Angewidert" name="Repulsed" value="Angewidert"/> + <item label="Traurig" name="Sad" value="Traurig"/> + <item label="Schulterzucken" name="Shrug" value="Schulterzucken"/> + <item label="Lächeln" name="Smile" value="Lächeln"/> + <item label="Überraschung" name="Surprise" value="Überraschung"/> + <item label="Zwinkern" name="Wink" value="Zwinkern"/> + <item label="Sorgenvoll" name="Worry" value="Sorgenvoll"/> </combo_box> <text name="preview_label" width="97"> Vorschau während: </text> <combo_box label="" left_delta="107" name="preview_base_anim" tool_tip="Hiermit können Sie das Verhalten Ihres Avatars testen, während Ihr Avatar normale Bewegungen ausführt."> - <combo_box.item label="Stehend" name="Standing"/> - <combo_box.item label="Geht" name="Walking"/> - <combo_box.item label="Sitzt" name="Sitting"/> - <combo_box.item label="Fliegen" name="Flying"/> + <item label="Stehend" name="Standing" value="Stehend"/> + <item label="Geht" name="Walking" value="Gehend"/> + <item label="Sitzt" name="Sitting" value="Sitzend"/> + <item label="Fliegen" name="Flying" value="Fliegen"/> </combo_box> <spinner label="Eingang glätten (s)" label_width="105" name="ease_in_time" tool_tip="Einblendungsgeschwindigkeit von Animationen (in Sekunden)" width="175"/> <spinner bottom_delta="-20" label="Ausgang glätten (s)" label_width="105" left="10" name="ease_out_time" tool_tip="Ausblendegeschwindigkeit von Animationen (in Sekunden)" width="175"/> @@ -180,6 +183,6 @@ Maximal erlaubt sind [MAX_LENGTH] Sekunden. Wir empfehlen exportierte BVH-Dateien aus Poser 4. </text> - <button label="Hochladen ([AMOUNT] L$)" name="ok_btn"/> - <button label="Abbrechen" name="cancel_btn"/> + <button label="Hochladen ([AMOUNT] L$)" name="ok_btn" width="160"/> + <button label="Abbrechen" left="180" name="cancel_btn" width="88"/> </floater> diff --git a/indra/newview/skins/default/xui/de/floater_avatar_picker.xml b/indra/newview/skins/default/xui/de/floater_avatar_picker.xml index bc78ccd7f8..6eb99f8b42 100644 --- a/indra/newview/skins/default/xui/de/floater_avatar_picker.xml +++ b/indra/newview/skins/default/xui/de/floater_avatar_picker.xml @@ -21,11 +21,12 @@ <tab_container name="ResidentChooserTabs"> <panel label="Suchen" name="SearchPanel"> <text name="InstructSearchResidentName"> - Geben Sie einen Teil des Namens einer Person ein: + Geben Sie einen Teil des Namens einer +Person ein: </text> - <line_editor bottom_delta="-36" name="Edit"/> - <button label="Los" label_selected="Los" name="Find"/> - <scroll_list bottom_delta="-79" height="74" name="SearchResults"/> + <line_editor bottom_delta="-76" name="Edit" top_pad="16"/> + <button label="Los" label_selected="Los" name="Find" top="70"/> + <scroll_list top="80" height="54" name="SearchResults"/> </panel> <panel label="Freunde" name="FriendsPanel"> <text name="InstructSelectFriend"> @@ -40,8 +41,24 @@ <text name="meters"> Meter </text> - <button font="SansSerifSmall" label="Liste aktualisieren" label_selected="Liste aktualisieren" left_delta="10" name="Refresh" width="105"/> - <scroll_list bottom_delta="-169" height="159" name="NearMe"/> + <button + follows="top|left" + layout="topleft" + left_pad="0" + height="28" + width="28" + name="Refresh" + image_overlay="Refresh_Off" /> + <scroll_list + follows="all" + height="100" + border="false" + layout="topleft" + left="0" + name="NearMe" + sort_column="0" + top="50" + width="132" /> </panel> </tab_container> <button label="OK" label_selected="OK" name="ok_btn"/> diff --git a/indra/newview/skins/default/xui/de/floater_avatar_textures.xml b/indra/newview/skins/default/xui/de/floater_avatar_textures.xml index 3be5194a8f..92c0c4a27a 100644 --- a/indra/newview/skins/default/xui/de/floater_avatar_textures.xml +++ b/indra/newview/skins/default/xui/de/floater_avatar_textures.xml @@ -3,10 +3,10 @@ <floater.string name="InvalidAvatar"> UNGÜLTIGER AVATAR </floater.string> - <text name="label"> + <text name="label" width="120"> Gebackene Texturen </text> - <text name="composite_label" width="150"> + <text name="composite_label" width="170"> Zusammengesetzte Texturen </text> <button label="Läd IDs in Konsole ab" label_selected="Abladen" name="Dump"/> @@ -16,14 +16,15 @@ <texture_picker label="Haare" name="hair_grain"/> <texture_picker label="Alpha: Haare" name="hair_alpha"/> <texture_picker label="Kopf" name="head-baked"/> - <texture_picker label="Make-Uup" name="head_bodypaint"/> + <texture_picker label="Make-Up" name="head_bodypaint"/> <texture_picker label="Kopf: Alpha" name="head_alpha"/> <texture_picker label="Kopftattoo" name="head_tattoo"/> <texture_picker label="Augen" name="eyes-baked"/> <texture_picker label="Auge" name="eyes_iris"/> <texture_picker label="Alpha: Augen" name="eyes_alpha"/> <texture_picker label="Oberkörper" name="upper-baked"/> - <texture_picker label="Oberkörper: Körperfarbe" name="upper_bodypaint"/> + <texture_picker label="Oberkörper: Körperfarbe" name="upper_bodypaint" width= + "140"/> <texture_picker label="Unterhemd" name="upper_undershirt"/> <texture_picker label="Handschuhe" name="upper_gloves"/> <texture_picker label="Hemd" name="upper_shirt"/> @@ -31,7 +32,8 @@ <texture_picker label="Alpha: Oben" name="upper_alpha"/> <texture_picker label="Obere Tattoos" name="upper_tattoo"/> <texture_picker label="Unterkörper" name="lower-baked"/> - <texture_picker label="Unterkörper: Körperfarbe" name="lower_bodypaint"/> + <texture_picker label="Unterkörper: Körperfarbe" name="lower_bodypaint" width= + "140"/> <texture_picker label="Unterhose" name="lower_underpants"/> <texture_picker label="Socken" name="lower_socks"/> <texture_picker label="Schuhe" name="lower_shoes"/> diff --git a/indra/newview/skins/default/xui/de/floater_beacons.xml b/indra/newview/skins/default/xui/de/floater_beacons.xml index 50a4555ae0..6e83e0419b 100644 --- a/indra/newview/skins/default/xui/de/floater_beacons.xml +++ b/indra/newview/skins/default/xui/de/floater_beacons.xml @@ -5,7 +5,7 @@ Anzeigen: </text> <check_box label="Strahlen" name="beacons"/> - <check_box label="Glanzlichter" name="highlights"/> + <check_box label="Hervorhebung" name="highlights"/> <text name="beacon_width_label" tool_tip="Strahlbreite"> Breite: </text> diff --git a/indra/newview/skins/default/xui/de/floater_build_options.xml b/indra/newview/skins/default/xui/de/floater_build_options.xml index b70c859490..e90eb2c00b 100644 --- a/indra/newview/skins/default/xui/de/floater_build_options.xml +++ b/indra/newview/skins/default/xui/de/floater_build_options.xml @@ -2,7 +2,7 @@ <floater name="build options floater" title="RASTER-OPTIONEN"> <spinner label="Raster-Einheiten (Meter)" name="GridResolution"/> <spinner label="Rastergröße (Meter)" name="GridDrawSize"/> - <check_box label="Einrasten von Untereinheiten aktivieren" name="GridSubUnit"/> + <check_box label="An Untereinheiten ausrichten" name="GridSubUnit"/> <check_box label="Überschneidungen anzeigen" name="GridCrossSection"/> <text name="grid_opacity_label" tool_tip="Raster-Deckkraft"> Deckkraft: diff --git a/indra/newview/skins/default/xui/de/floater_bulk_perms.xml b/indra/newview/skins/default/xui/de/floater_bulk_perms.xml index 218c66d298..d3f0d6d78f 100644 --- a/indra/newview/skins/default/xui/de/floater_bulk_perms.xml +++ b/indra/newview/skins/default/xui/de/floater_bulk_perms.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floaterbulkperms" title="INHALTS-BERECHTIGUNGEN BEARBEITEN"> +<floater name="floaterbulkperms" title="BERECHTIGUNGEN BEARBEITEN"> <floater.string name="nothing_to_modify_text"> Auswahl enthält keinen Inhalt, der bearbeitet werden kann. </floater.string> @@ -43,7 +43,7 @@ Jeder: </text> <check_box label="Kopieren" name="everyone_copy"/> - <text name="NextOwnerLabel"> + <text name="NextOwnerLabel" top="160" left="10" width="200"> Nächster Eigentümer: </text> <check_box label="Bearbeiten" name="next_owner_modify"/> diff --git a/indra/newview/skins/default/xui/de/floater_buy_currency.xml b/indra/newview/skins/default/xui/de/floater_buy_currency.xml index aa6201ec26..f978b24d0d 100644 --- a/indra/newview/skins/default/xui/de/floater_buy_currency.xml +++ b/indra/newview/skins/default/xui/de/floater_buy_currency.xml @@ -18,13 +18,13 @@ <text name="balance_amount"> [AMT] L$ </text> - <text name="currency_action" width="90"> + <text name="currency_action"> Ich möchte kaufen </text> <text name="currency_label"> L$ </text> - <line_editor label="L$" left_delta="55" name="currency_amt"> + <line_editor label="L$" name="currency_amt"> 1234 </line_editor> <text name="buying_label"> @@ -37,7 +37,7 @@ Schätzung erfolgt... </text> <text name="buy_action"> - [NAME] L$ [PRICE] + [ACTION] </text> <text name="total_label"> Mein neuer Kontostand wird sein @@ -52,7 +52,7 @@ Geben Sie den Betrag erneut ein, um die aktuellste Umtauschrate anzuzeigen. </text> <text name="purchase_warning_repurchase"> - Nach Bestätigung dieses Kaufs werden nur L$ gekauft, nicht das Objekt. + Achtung: Sie kaufen L$, nicht das Objekt. </text> <text name="purchase_warning_notenough"> Sie kaufen nicht genügend L$. Bitte erhöhen Sie den Betrag. @@ -62,5 +62,5 @@ <text name="info_cannot_buy"> Kauf nicht möglich </text> - <button label="Weiter zum Internet" name="error_web"/> + <button label="Weiter zur Kontoseite" name="error_web"/> </floater> diff --git a/indra/newview/skins/default/xui/de/floater_buy_land.xml b/indra/newview/skins/default/xui/de/floater_buy_land.xml index 4c59f1e8e6..5369155cf9 100644 --- a/indra/newview/skins/default/xui/de/floater_buy_land.xml +++ b/indra/newview/skins/default/xui/de/floater_buy_land.xml @@ -1,43 +1,167 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="buy land" title="LAND KAUFEN"> + <floater.string name="can_resell"> + Verkauf möglich. + </floater.string> + <floater.string name="can_not_resell"> + Verkauf nicht möglich. + </floater.string> + <floater.string name="can_change"> + Zusammenlegen/unterteilen möglich. + </floater.string> + <floater.string name="can_not_change"> + Zusammenlegen/unterteilen nicht möglich. + </floater.string> + <floater.string name="cant_buy_for_group"> + Sie sind nicht berechtigt, Land für die aktive Gruppe zu kaufen. + </floater.string> + <floater.string name="no_land_selected"> + Kein Land ausgewählt. + </floater.string> + <floater.string name="multiple_parcels_selected"> + Mehrere unterschiedliche Parzellen ausgewählt. +Verkleinern Sie Ihre Auswahl. + </floater.string> + <floater.string name="no_permission"> + Sie sind nicht berechtigt, Land für die aktive Gruppe zu kaufen. + </floater.string> + <floater.string name="parcel_not_for_sale"> + Die ausgewählte Parzelle steht nicht zum Verkauf. + </floater.string> + <floater.string name="group_already_owns"> + Die Parzelle befindet sich bereits in Gruppenbesitz. + </floater.string> + <floater.string name="you_already_own"> + Die Parzelle gehört Ihnen bereits. + </floater.string> + <floater.string name="set_to_sell_to_other"> + Die ausgewählte Parzelle steht zum Verkauf an Dritte. + </floater.string> + <floater.string name="no_public_land"> + Das ausgewählte Land beinhaltet kein öffentliches Land. + </floater.string> + <floater.string name="not_owned_by_you"> + Sie haben Land ausgewählt, das einer anderen Person gehört. +Verkleinern Sie Ihre Auswahl. + </floater.string> + <floater.string name="processing"> + Kauf wird abgewickelt... + +(Dies kann 1 bis 2 Minuten dauern.) + </floater.string> + <floater.string name="fetching_error"> + Fehler bei Abfrage der Landkauf-Informationen. + </floater.string> + <floater.string name="buying_will"> + Bei Landkauf: + </floater.string> + <floater.string name="buying_for_group"> + Landkauf für Gruppe: + </floater.string> + <floater.string name="cannot_buy_now"> + Kaufen jetzt nicht möglich: + </floater.string> + <floater.string name="not_for_sale"> + Nicht zu verkaufen: + </floater.string> + <floater.string name="none_needed"> + nicht benötigt + </floater.string> + <floater.string name="must_upgrade"> + Sie müssen Ihr Konto upgraden, um Land kaufen zu können. + </floater.string> + <floater.string name="cant_own_land"> + Mit Ihrem Konto können Sie Land kaufen. + </floater.string> + <floater.string name="land_holdings"> + Sie besitzen [BUYER] m² Land. + </floater.string> + <floater.string name="pay_to_for_land"> + [SELLER] [AMOUNT] L$ für das Land bezahlen + </floater.string> + <floater.string name="buy_for_US"> + Kaufen Sie [AMOUNT] L$ für ca. [LOCAL_AMOUNT], + </floater.string> + <floater.string name="parcel_meters"> + Diese Parzelle ist [AMOUNT] m². + </floater.string> + <floater.string name="premium_land"> + Dieses Land ist eine Premium-Immobilie. Es wird mit [AMOUNT] m² angesetzt. + </floater.string> + <floater.string name="discounted_land"> + Dieses Land ist im Angebot. Es wird mit [AMOUNT] m² angesetzt. + </floater.string> + <floater.string name="meters_supports_object"> + [AMOUNT] m² +unterstützt [AMOUNT2] Objekte + </floater.string> + <floater.string name="sold_with_objects"> + mit Objekten verkauft + </floater.string> + <floater.string name="sold_without_objects"> + Objekte nicht im Verkauf mit eingeschlossen + </floater.string> + <floater.string name="info_price_string"> + [PRICE] L$ +([PRICE_PER_SQM] L$/m²) +[SOLD_WITH_OBJECTS] + </floater.string> + <floater.string name="insufficient_land_credits"> + Die Gruppe [GROUP] benötigt ausreichende gespendete Landnutzungsrechte, um die Parzelle abzudecken, bevor der Kauf abgeschlossen werden kann. + </floater.string> + <floater.string name="have_enough_lindens"> + Sie haben [AMOUNT] L$, genug zum Kauf dieses Landes. + </floater.string> + <floater.string name="not_enough_lindens"> + Sie haben nur [AMOUNT] L$, brauchen aber mindestens [AMOUNT2] L$. + </floater.string> + <floater.string name="balance_left"> + Nach dem Einkauf verbleiben Ihnen noch [AMOUNT] L$. + </floater.string> + <floater.string name="balance_needed"> + Für dieses Land müssen Sie mindestens [AMOUNT] L$ kaufen. + </floater.string> + <floater.string name="no_parcel_selected"> + (keine Parzelle ausgewählt) + </floater.string> <text name="region_name_label"> Region: </text> - <text left="580" name="region_name_text"> + <text left="680" left_delta="140" name="region_name_text"> (unbekannt) </text> <text name="region_type_label"> Typ: </text> - <text left="580" name="region_type_text"> + <text left="680" left_delta="140" name="region_type_text"> (unbekannt) </text> <text name="estate_name_label"> - Grundstück: + Grundbesitz: </text> - <text left="580" name="estate_name_text"> + <text left="680" left_delta="140" name="estate_name_text"> (unbekannt) </text> <text name="estate_owner_label" right="600" width="200"> - Grundstückseigentümer: + Grundbesitzer: </text> - <text left="580" name="estate_owner_text"> + <text left="680" left_delta="140" name="estate_owner_text"> (unbekannt) </text> - <text name="resellable_changeable_label"> + <text left="410" name="resellable_changeable_label"> Gekauftes Land in dieser Region: </text> - <text name="resellable_clause"> + <text left="410" name="resellable_clause"> Wiederverkauf möglich oder nicht möglich. </text> - <text name="changeable_clause"> + <text left="410" name="changeable_clause"> Darft oder darf nicht zusammengelegt/unterteilt werden. </text> - <text name="covenant_text"> - Sie müssen dem Grundstücksvertrag zustimmen: + <text left="410" name="covenant_text"> + Sie müssen dem Grundbesitzvertrag zustimmen: </text> <text left="470" name="covenant_timestamp_text"/> - <text_editor name="covenant_editor"> + <text_editor left="470" name="covenant_editor"> Wird geladen... </text_editor> <check_box label="Ich stimme dem obigen Vertrag zu." name="agree_covenant"/> @@ -67,7 +191,7 @@ Objekte im Verkauf eingeschlossen <text name="error_message"> Irgendetwas stimmt nicht. </text> - <button label="Gehe zu Website" name="error_web"/> + <button label="Gehe zu Website" name="error_web" top_delta="136"/> <text name="account_action"> Macht Sie zum Premium-Mitglied. </text> @@ -79,8 +203,9 @@ Objekte im Verkauf eingeschlossen <combo_box.item label="7,50 US$/Monat, vierteljährliche Abrechnung" name="US$7.50/month,billedquarterly"/> <combo_box.item label="6,00 US$/Monat, jährliche Abrechnung" name="US$6.00/month,billedannually"/> </combo_box> - <text name="land_use_action"> - Erhöhen Sie Ihre monatlichen Landnutzungsgebühren auf 40 US$/month. + <text height="36" name="land_use_action" top="270"> + Erhöhen Sie Ihre monatlichen Landnutzungsgebühren +auf 40 US$/month. </text> <text name="land_use_reason"> Sie besitzen 1309 m² Land. @@ -107,131 +232,4 @@ Diese Parzelle ist 512 m² gross. <check_box label="[AMOUNT] m² Beitrag von der Gruppe entfernen." name="remove_contribution"/> <button label="Kaufen" name="buy_btn"/> <button label="Abbrechen" name="cancel_btn"/> - <string name="can_resell"> - Verkauf möglich. - </string> - <string name="can_not_resell"> - Verkauf nicht möglich. - </string> - <string name="can_change"> - Zusammenlegen/unterteilen möglich. - </string> - <string name="can_not_change"> - Zusammenlegen/unterteilen nicht möglich. - </string> - <string name="cant_buy_for_group"> - Sie sind nicht berechtigt, Land für die aktive Gruppe zu kaufen. - </string> - <string name="no_land_selected"> - Kein Land ausgewählt. - </string> - <string name="multiple_parcels_selected"> - Mehrere unterschiedliche Parzellen ausgewählt. -Verkleinern Sie Ihre Auswahl. - </string> - <string name="no_permission"> - Sie sind nicht berechtigt, Land für die aktive Gruppe zu kaufen. - </string> - <string name="parcel_not_for_sale"> - Die ausgewählte Parzelle steht nicht zum Verkauf. - </string> - <string name="group_already_owns"> - Die Parzelle befindet sich bereits in Gruppenbesitz. - </string> - <string name="you_already_own"> - Die Parzelle gehört Ihnen bereits. - </string> - <string name="set_to_sell_to_other"> - Die ausgewählte Parzelle steht zum Verkauf an Dritte. - </string> - <string name="no_public_land"> - Das ausgewählte Land beinhaltet kein öffentliches Land. - </string> - <string name="not_owned_by_you"> - Sie haben Land ausgewählt, das einer anderen Person gehört. -Verkleinern Sie Ihre Auswahl. - </string> - <string name="processing"> - Kauf wird abgewickelt... - -(Dies kann 1 bis 2 Minuten dauern.) - </string> - <string name="fetching_error"> - Fehler bei Abfrage der Landkauf-Informationen. - </string> - <string name="buying_will"> - Bei Landkauf: - </string> - <string name="buying_for_group"> - Landkauf für Gruppe: - </string> - <string name="cannot_buy_now"> - Kaufen jetzt nicht möglich: - </string> - <string name="not_for_sale"> - Nicht zu verkaufen: - </string> - <string name="none_needed"> - nicht benötigt - </string> - <string name="must_upgrade"> - Sie müssen Ihr Konto upgraden, um Land kaufen zu können. - </string> - <string name="cant_own_land"> - Mit Ihrem Konto können Sie Land kaufen. - </string> - <string name="land_holdings"> - Sie besitzen [BUYER] m² Land. - </string> - <string name="pay_to_for_land"> - [SELLER] [AMOUNT] L$ für das Land bezahlen - </string> - <string name="buy_for_US"> - Kaufen Sie [AMOUNT] L$ für ca. [LOCAL_AMOUNT], - </string> - <string name="parcel_meters"> - Diese Parzelle ist [AMOUNT] m². - </string> - <string name="premium_land"> - Dieses Land ist eine Premium-Immobilie. Es wird mit [AMOUNT] m² angesetzt. - </string> - <string name="discounted_land"> - Dieses Land ist im Angebot. Es wird mit [AMOUNT] m² angesetzt. - </string> - <string name="meters_supports_object"> - [AMOUNT] m² -unterstützt [AMOUNT2] Objekte - </string> - <string name="sold_with_objects"> - mit Objekten verkauft - </string> - <string name="sold_without_objects"> - Objekte nicht im Verkauf mit eingeschlossen - </string> - <string name="info_price_string"> - [PRICE] L$ -([PRICE_PER_SQM] L$/m²) -[SOLD_WITH_OBJECTS] - </string> - <string name="insufficient_land_credits"> - Die Gruppe [GROUP] benötigt ausreichende gespendete Landnutzungsrechte, um die Parzelle abzudecken, bevor der Kauf abgeschlossen werden kann. - </string> - <string name="have_enough_lindens"> - Sie haben [AMOUNT] L$, genug zum Kauf dieses Landes. - </string> - <string name="not_enough_lindens"> - Sie haben nur [AMOUNT] L$, brauchen aber mindestens [AMOUNT2] L$. - </string> - <string name="balance_left"> - Nach dem Einkauf verbleiben Ihnen noch [AMOUNT] L$. - </string> - <string name="balance_needed"> - Für dieses Land müssen Sie mindestens [AMOUNT] L$ kaufen. - </string> - <string name="no_parcel_selected"> - (keine Parzelle ausgewählt) - </string> - <string name="buy_currency"> - [LINDENS] L$ für ca. [USD] US$ kaufen - </string> </floater> diff --git a/indra/newview/skins/default/xui/de/floater_buy_object.xml b/indra/newview/skins/default/xui/de/floater_buy_object.xml index b23163b4a3..c697014b04 100644 --- a/indra/newview/skins/default/xui/de/floater_buy_object.xml +++ b/indra/newview/skins/default/xui/de/floater_buy_object.xml @@ -6,7 +6,7 @@ <text name="buy_text"> [AMOUNT] L$ von [NAME] kaufen? </text> - <button label="Abbrechen" label_selected="Abbrechen" name="cancel_btn" width="73"/> + <button label="Abbrechen" label_selected="Abbrechen" name="cancel_btn"/> <button label="Kaufen" label_selected="Kaufen" name="buy_btn"/> <text name="title_buy_text"> Kaufen diff --git a/indra/newview/skins/default/xui/de/floater_camera.xml b/indra/newview/skins/default/xui/de/floater_camera.xml index b8616ea128..418e717bf6 100644 --- a/indra/newview/skins/default/xui/de/floater_camera.xml +++ b/indra/newview/skins/default/xui/de/floater_camera.xml @@ -9,23 +9,28 @@ <floater.string name="move_tooltip"> Kamera nach oben, unten, links und rechts bewegen </floater.string> + <floater.string name="camera_modes_title"> + Kameramodi + </floater.string> + <floater.string name="pan_mode_title"> + Kreisen - Zoomen - Schwenken + </floater.string> + <floater.string name="presets_mode_title"> + Ansichten + </floater.string> + <floater.string name="free_mode_title"> + Objekt ansehen + </floater.string> <panel name="controls"> - <joystick_track name="cam_track_stick" tool_tip="Kamera nach oben, unten, links und rechts bewegen"/> <panel name="zoom" tool_tip="Kamera auf Fokus zoomen"> + <joystick_rotate name="cam_rotate_stick" tool_tip="Kamera um Fokus kreisen"/> <slider_bar name="zoom_slider" tool_tip="Kamera auf Fokus zoomen"/> - </panel> - <joystick_rotate name="cam_rotate_stick" tool_tip="Kamera um Fokus kreisen"/> - <panel name="camera_presets"> - <button name="rear_view" tool_tip="Hinteransicht"/> - <button name="group_view" tool_tip="Gruppen-Ansicht"/> - <button name="front_view" tool_tip="Vorderansicht"/> - <button name="mouselook_view" tool_tip="Mouselook"/> + <joystick_track name="cam_track_stick" tool_tip="Kamera nach oben, unten, links und rechts bewegen"/> </panel> </panel> <panel name="buttons"> - <button label="" name="orbit_btn" tool_tip="Kamera kreisen"/> - <button label="" name="pan_btn" tool_tip="Kamera schwenken"/> - <button label="" name="avatarview_btn" tool_tip="Avatarsicht"/> - <button label="" name="freecamera_btn" tool_tip="Objekt ansehen"/> + <button label="" name="presets_btn" tool_tip="Ansichten"/> + <button label="" name="pan_btn" tool_tip="Kreisen - Zoomen - Schwenken"/> + <button label="" name="avatarview_btn" tool_tip="Kameramodi"/> </panel> </floater> diff --git a/indra/newview/skins/default/xui/de/floater_color_picker.xml b/indra/newview/skins/default/xui/de/floater_color_picker.xml index aed4bacb30..0fe154b531 100644 --- a/indra/newview/skins/default/xui/de/floater_color_picker.xml +++ b/indra/newview/skins/default/xui/de/floater_color_picker.xml @@ -18,7 +18,7 @@ <text name="l_val_text"> Hell.: </text> - <check_box label="Jetzt übernehmen" name="apply_immediate"/> + <check_box label="Sofort übernehmen" name="apply_immediate"/> <button label="" label_selected="" name="color_pipette"/> <button label="Abbrechen" label_selected="Abbrechen" name="cancel_btn"/> <button label="OK" label_selected="OK" name="select_btn"/> diff --git a/indra/newview/skins/default/xui/de/floater_customize.xml b/indra/newview/skins/default/xui/de/floater_customize.xml index a2bf45852a..3651577797 100644 --- a/indra/newview/skins/default/xui/de/floater_customize.xml +++ b/indra/newview/skins/default/xui/de/floater_customize.xml @@ -40,17 +40,17 @@ <text name="no modify instructions"> Sie sind nicht berechtigt, diese Kleidung zu bearbeiten. </text> - <text name="Item Action Label" right="100"> + <text name="Item Action Label"> Form: </text> <button label="Neue Form/Gestalt" label_selected="Neue Form/Gestalt" name="Create New"/> - <button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/> - <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." left="194" name="Save As" width="105"/> + <button font="SansSerifSmall" label="Speichern" label_selected="Speichern" name="Save"/> + <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/> </panel> <panel label="Haut" name="Skin"> <button label="Hautfarbe" label_selected="Hautfarbe" left="2" name="Skin Color" width="92"/> <button label="Gesichtsdetails" label_selected="Gesichtsdetails" left="2" name="Face Detail" width="92"/> - <button label="Make-Uup" label_selected="Make-Uup" left="2" name="Makeup" width="92"/> + <button label="Make-Up" label_selected="Make-Up" left="2" name="Makeup" width="92"/> <button label="Körperdetails" label_selected="Körperdetails" left="2" name="Body Detail" width="92"/> <text name="title"> [DESC] @@ -81,7 +81,7 @@ <texture_picker label="Untere Tattoos" name="Lower Tattoos" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/> <button label="Neue Haut" label_selected="Neue Haut" name="Create New"/> <button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/> - <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." left="194" name="Save As" width="105"/> + <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/> <button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/> </panel> <panel label="Haar" name="Hair"> @@ -105,7 +105,7 @@ In [PATH] </text> <text name="not worn instructions"> - Ziehen Sie Haar aus dem Inventar auf Ihren Avatar, um dieses anzulegen. Sie können aber auch eine neue erstellen und diese anlegen. + Ziehen Sie Haar aus dem Inventar auf Ihren Avatar, um dieses anzulegen. Sie können aber auch neues Haar erstellen und anlegen. </text> <text name="no modify instructions"> Sie sind nicht berechtigt, diese Kleidung zu bearbeiten. @@ -116,7 +116,7 @@ <texture_picker label="Textur" name="Texture" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/> <button label="Neue Haare" label_selected="Neue Haare" name="Create New"/> <button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/> - <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." left="194" name="Save As" width="105"/> + <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/> <button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/> </panel> <panel label="Augen" name="Eyes"> @@ -136,7 +136,7 @@ In [PATH] </text> <text name="not worn instructions"> - Ziehen Sie neue Augen aus dem Inventar auf Ihren Avatar, um diese anzulegen. Sie können aber auch eine neue erstellen und diese anlegen. + Ziehen Sie neue Augen aus dem Inventar auf Ihren Avatar, um diese anzulegen. Sie können aber auch neue Augen erstellen und diese anlegen. </text> <text name="no modify instructions"> Sie sind nicht berechtigt, diese Kleidung zu bearbeiten. @@ -147,7 +147,7 @@ <texture_picker label="Iris" name="Iris" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/> <button label="Neue Augen" label_selected="Neue Augen" name="Create New"/> <button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/> - <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." left="194" name="Save As" width="105"/> + <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/> <button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/> </panel> <text label="Kleidung" name="clothes_placeholder"> @@ -156,10 +156,10 @@ <panel label="Hemd" name="Shirt"> <texture_picker label="Stoff" name="Fabric" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/> <color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/> - <button label="Neues Hemd" label_selected="Neues Hemd" name="Create New"/> <button font="SansSerifSmall" label="Ausziehen" label_selected="Ausziehen" name="Take Off"/> + <button label="Neues Hemd" label_selected="Neues Hemd" name="Create New"/> <button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/> - <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." left="194" name="Save As" width="105"/> + <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/> <button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/> <text name="title"> [DESC] @@ -177,7 +177,7 @@ In [PATH] </text> <text name="not worn instructions"> - Ziehen Sie ein neues Hemd aus dem Inventar auf Ihren Avatar, um dieses anzuziehen. Sie können aber auch eine neue erstellen und diese anlegen. + Ziehen Sie ein neues Hemd aus dem Inventar auf Ihren Avatar, um dieses anzuziehen. Sie können aber auch ein neues Hemd erstellen und dieses anlegen. </text> <text name="no modify instructions"> Sie sind nicht berechtigt, diese Kleidung zu bearbeiten. @@ -189,10 +189,10 @@ <panel label="Hose" name="Pants"> <texture_picker label="Stoff" name="Fabric" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/> <color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/> - <button label="Neue Hose" label_selected="Neue Hose" name="Create New"/> <button font="SansSerifSmall" label="Ausziehen" label_selected="Ausziehen" name="Take Off"/> + <button label="Neue Hose" label_selected="Neue Hose" name="Create New"/> <button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/> - <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." left="194" name="Save As" width="105"/> + <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/> <button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/> <text name="title"> [DESC] @@ -210,7 +210,7 @@ In [PATH] </text> <text name="not worn instructions"> - Ziehen Sie eine neue Hose aus dem Inventar auf Ihren Avatar, um diese anzuziehen. Sie können aber auch eine neue erstellen und diese anlegen. + Ziehen Sie eine neue Hose aus dem Inventar auf Ihren Avatar, um diese anzuziehen. Sie können aber auch eine neue erstellen und diese anziehen. </text> <text name="no modify instructions"> Sie sind nicht berechtigt, diese Kleidung zu bearbeiten. @@ -236,8 +236,9 @@ In [PATH] </text> <text name="not worn instructions"> - Ziehen Sie neue Schuhe aus dem Inventar auf Ihren Avatar, um diese anzuziehen. Sie können aber auch eine neue erstellen und diese anlegen. + Ziehen Sie neue Schuhe aus dem Inventar auf Ihren Avatar, um diese anzuziehen. Sie können aber auch neue Schuhe erstellen und diese anlegen. </text> + <button label="Neue Schuhe" label_selected="Neue Schuhe" name="Create New"/> <text name="no modify instructions"> Sie sind nicht berechtigt, diese Kleidung zu bearbeiten. </text> @@ -246,10 +247,9 @@ </text> <texture_picker label="Stoff" name="Fabric" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/> <color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/> - <button label="Neue Schuhe" label_selected="Neue Schuhe" name="Create New"/> <button font="SansSerifSmall" label="Ausziehen" label_selected="Ausziehen" name="Take Off"/> <button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/> - <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." left="194" name="Save As" width="105"/> + <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/> <button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/> </panel> <panel label="Socken" name="Socks"> @@ -269,8 +269,9 @@ In [PATH] </text> <text name="not worn instructions"> - Ziehen Sie neue Strümpfe aus dem Inventar auf Ihren Avatar, um diese anzuziehen. Sie können aber auch eine neue erstellen und diese anlegen. + Ziehen Sie neue Socken aus dem Inventar auf Ihren Avatar, um diese anzuziehen. Sie können aber auch neue erstellen und diese anziehen. </text> + <button label="Neue Socken" label_selected="Neue Socken" name="Create New"/> <text name="no modify instructions"> Sie sind nicht berechtigt, diese Kleidung zu bearbeiten. </text> @@ -279,10 +280,9 @@ </text> <texture_picker label="Stoff" name="Fabric" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/> <color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/> - <button label="Neue Socken" label_selected="Neue Socken" name="Create New"/> <button font="SansSerifSmall" label="Ausziehen" label_selected="Ausziehen" name="Take Off"/> <button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/> - <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." left="194" name="Save As" width="105"/> + <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/> <button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/> </panel> <panel label="Jacke" name="Jacket"> @@ -302,21 +302,21 @@ In [PATH] </text> <text name="not worn instructions"> - Ziehen Sie eine neue Jacke aus dem Inventar auf Ihren Avatar, um diese anzuziehen. Sie können aber auch eine neue erstellen und diese anlegen. + Ziehen Sie eine neue Jacke aus dem Inventar auf Ihren Avatar, um diese anzuziehen. Sie können aber auch eine neue erstellen und diese anziehen. </text> + <button label="Neue Jacke" label_selected="Neue Jacke" name="Create New"/> <text name="no modify instructions"> Sie sind nicht berechtigt, diese Kleidung zu bearbeiten. </text> <text name="Item Action Label" right="100"> Jacke: </text> - <texture_picker label="Oberstoff" name="Upper Fabric" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/> - <texture_picker label="Unterstoff" name="Lower Fabric" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/> + <texture_picker label="Stoff: oben" name="Upper Fabric" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/> + <texture_picker label="Stoff: unten" name="Lower Fabric" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/> <color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/> - <button label="Neue Jacke" label_selected="Neue Jacke" name="Create New"/> <button font="SansSerifSmall" label="Ausziehen" label_selected="Ausziehen" name="Take Off"/> <button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/> - <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." left="194" name="Save As" width="105"/> + <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/> <button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/> </panel> <panel label="Handschuhe" name="Gloves"> @@ -336,8 +336,9 @@ In [PATH] </text> <text name="not worn instructions"> - Ziehen Sie neue Handschuhe aus dem Inventar auf Ihren Avatar, um diese anzuziehen. Sie können aber auch eine neue erstellen und diese anlegen. + Ziehen Sie neue Handschuhe aus dem Inventar auf Ihren Avatar, um diese anzuziehen. Sie können aber auch neue erstellen und diese anziehen. </text> + <button label="Neue Handschuhe" label_selected="Neue Handschuhe" name="Create New"/> <text name="no modify instructions"> Sie sind nicht berechtigt, diese Kleidung zu bearbeiten. </text> @@ -346,10 +347,9 @@ </text> <texture_picker label="Stoff" name="Fabric" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/> <color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/> - <button label="Neue Handschuhe" label_selected="Neue Handschuhe" name="Create New"/> <button font="SansSerifSmall" label="Ausziehen" label_selected="Ausziehen" name="Take Off"/> <button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/> - <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." left="194" name="Save As" width="105"/> + <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/> <button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/> </panel> <panel label="Unterhemd" name="Undershirt"> @@ -369,8 +369,9 @@ In [PATH] </text> <text name="not worn instructions"> - Ziehen Sie ein neues Unterhemd aus dem Inventar auf Ihren Avatar, um dieses anzuziehen. Sie können aber auch eine neue erstellen und diese anlegen. + Ziehen Sie ein neues Unterhemd aus dem Inventar auf Ihren Avatar, um dieses anzuziehen. Sie können aber auch ein neues Unterhemd erstellen und dieses anziehen. </text> + <button label="Neues Unterhemd" label_selected="Neues Unterhemd" name="Create New"/> <text name="no modify instructions"> Sie sind nicht berechtigt, diese Kleidung zu bearbeiten. </text> @@ -379,10 +380,9 @@ </text> <texture_picker label="Stoff" name="Fabric" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/> <color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/> - <button label="Neues Unterhemd" label_selected="Neues Unterhemd" name="Create New"/> <button font="SansSerifSmall" label="Ausziehen" label_selected="Ausziehen" name="Take Off"/> <button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/> - <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." left="194" name="Save As" width="105"/> + <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/> <button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/> </panel> <panel label="Unterhose" name="Underpants"> @@ -402,8 +402,9 @@ In [PATH] </text> <text name="not worn instructions"> - Ziehen Sie eine neue Unterhose aus dem Inventar auf Ihren Avatar, um diese anzuziehen. Sie können aber auch eine neue erstellen und diese anlegen. + Ziehen Sie eine neue Unterhose aus dem Inventar auf Ihren Avatar, um diese anzuziehen. Sie können aber auch eine neue erstellen und diese anziehen. </text> + <button label="Neue Unterhose" label_selected="Neue Unterhose" name="Create New"/> <text name="no modify instructions"> Sie sind nicht berechtigt, diese Kleidung zu bearbeiten. </text> @@ -412,10 +413,9 @@ </text> <texture_picker label="Stoff" name="Fabric" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/> <color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/> - <button label="Neue Unterhose" label_selected="Neue Unterhose" name="Create New"/> <button font="SansSerifSmall" label="Ausziehen" label_selected="Ausziehen" name="Take Off"/> <button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/> - <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." left="194" name="Save As" width="105"/> + <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/> <button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/> </panel> <panel label="Rock" name="Skirt"> @@ -435,8 +435,9 @@ In [PATH] </text> <text name="not worn instructions"> - Ziehen Sie einen neuen Rock aus dem Inventar auf Ihren Avatar, um diesen anzuziehen. Sie können aber auch eine neue erstellen und diese anlegen. + Ziehen Sie einen neuen Rock aus dem Inventar auf Ihren Avatar, um diesen anzuziehen. Sie können aber auch einen neuen Rock erstellen und diesen anziehen. </text> + <button label="Neuer Rock" label_selected="Neuer Rock" name="Create New"/> <text name="no modify instructions"> Sie sind nicht berechtigt, diese Kleidung zu bearbeiten. </text> @@ -445,15 +446,14 @@ </text> <texture_picker label="Stoff" name="Fabric" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/> <color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/> - <button label="Neuer Rock" label_selected="Neuer Rock" name="Create New"/> <button font="SansSerifSmall" label="Ausziehen" label_selected="Ausziehen" name="Take Off"/> <button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/> - <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." left="194" name="Save As" width="105"/> + <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/> <button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/> </panel> - <panel label="Alpha" name="Alpha"> + <panel label="Tätowierung" name="Tattoo"> <text name="title"> - [BESCHR] + Tätowierung </text> <text name="title_no_modify"> [BESCHR]: bearbeiten nicht möglich @@ -468,28 +468,26 @@ Befindet sich in [PATH] </text> <text name="not worn instructions"> - Sie können eine neue Alpha-Maske anlegen, indem Sie eine von Ihrem Inventar auf Ihren Avatar ziehen. Sie können aber auch eine neue erstellen und diese anlegen. + Ziehen Sie eine neue Tätowierung aus dem Inventar auf Ihren Avatar, um diese anzulegen. Sie können aber auch eine neue erstellen und diese anlegen. </text> + <button label="Neue Tätowierung erstellen" label_selected="Neue Tätowierung erstellen" name="Create New"/> <text name="no modify instructions"> Sie sind nicht berechtigt, diese Kleidung zu bearbeiten. </text> <text name="Item Action Label"> - Alpha: + Tätowierung: </text> - <texture_picker label="Alpha: Unten" name="Lower Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken"/> - <texture_picker label="Alpha: Oben" name="Upper Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken"/> - <texture_picker label="Kopf: Alpha" name="Head Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken"/> - <texture_picker label="Alpha: Augen" name="Eye Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken"/> - <texture_picker label="Alpha: Haare" name="Hair Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken"/> - <button label="Neue Alpha erstellen" label_selected="Neue Alpha erstellen" name="Create New"/> + <texture_picker label="Kopftattoo" name="Head Tattoo" tool_tip="Zum Auswählen eines Bildes hier klicken"/> + <texture_picker label="Obere Tattoos" name="Upper Tattoo" tool_tip="Zum Auswählen eines Bildes hier klicken"/> + <texture_picker label="Untere Tattoos" name="Lower Tattoo" tool_tip="Zum Auswählen eines Bildes hier klicken"/> <button label="Ausziehen" label_selected="Ausziehen" name="Take Off"/> <button label="Speichern" label_selected="Speichern" name="Save"/> <button label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/> <button label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/> </panel> - <panel label="Tätowierung" name="Tattoo"> + <panel label="Alpha" name="Alpha"> <text name="title"> - [BESCHR] + Alpha </text> <text name="title_no_modify"> [BESCHR]: bearbeiten nicht möglich @@ -504,25 +502,27 @@ Befindet sich in [PATH] </text> <text name="not worn instructions"> - Ziehen Sie eine neue Tätowierung aus dem Inventar auf Ihren Avatar, um diese anzulegen. Sie können aber auch eine neue erstellen und diese anlegen. + Sie können eine neue Alpha-Maske anlegen, indem Sie eine von Ihrem Inventar auf Ihren Avatar ziehen. Sie können aber auch eine neue erstellen und diese anlegen. </text> + <button label="Neue Alpha erstellen" label_selected="Neue Alpha erstellen" name="Create New"/> <text name="no modify instructions"> Sie sind nicht berechtigt, diese Kleidung zu bearbeiten. </text> <text name="Item Action Label"> - Tätowierung: + Alpha: </text> - <texture_picker label="Kopftattoo" name="Head Tattoo" tool_tip="Zum Auswählen eines Bildes hier klicken"/> - <texture_picker label="Obere Tattoos" name="Upper Tattoo" tool_tip="Zum Auswählen eines Bildes hier klicken"/> - <texture_picker label="Untere Tattoos" name="Lower Tattoo" tool_tip="Zum Auswählen eines Bildes hier klicken"/> - <button label="Neue Tätowierung erstellen" label_selected="Neue Tätowierung erstellen" name="Create New"/> + <texture_picker label="Alpha: Unten" name="Lower Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken"/> + <texture_picker label="Alpha: Oben" name="Upper Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken"/> + <texture_picker label="Kopf: Alpha" name="Head Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken"/> + <texture_picker label="Alpha: Augen" name="Eye Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken"/> + <texture_picker label="Alpha: Haare" name="Hair Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken"/> <button label="Ausziehen" label_selected="Ausziehen" name="Take Off"/> <button label="Speichern" label_selected="Speichern" name="Save"/> <button label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/> <button label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/> </panel> </tab_container> - <button label="Skriptinfo" label_selected="Skriptinfo" name="script_info"/> + <button label="Skriptinfo" label_selected="Skriptinfo" name="script_info" tool_tip="Skripts, die an Ihren Avatar angehängt sind, anzeigen"/> <button label="Outfit erstellen" label_selected="Outfit erstellen" name="make_outfit_btn"/> <button label="Abbrechen" label_selected="Abbrechen" name="Cancel"/> <button label="OK" label_selected="OK" name="Ok"/> diff --git a/indra/newview/skins/default/xui/de/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/de/floater_day_cycle_options.xml index 7f4dc4a79e..8599737106 100644 --- a/indra/newview/skins/default/xui/de/floater_day_cycle_options.xml +++ b/indra/newview/skins/default/xui/de/floater_day_cycle_options.xml @@ -1,8 +1,8 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="Day Cycle Floater" title="TAGESZYKLUS-EDITOR"> <tab_container name="Day Cycle Tabs"> <panel label="Tageszyklus" name="Day Cycle"> - <button label=" ?" name="WLDayCycleHelp" /> + <button label=" ?" name="WLDayCycleHelp"/> <text name="WL12am"> 24:00 </text> @@ -57,40 +57,38 @@ <text name="WL12amHash2"> | </text> - <button label="Key hinzu" label_selected="Key hinzu" name="WLAddKey" /> - <button label="Key löschen" label_selected="Key löschen" name="WLDeleteKey" /> + <button label="Key hinzu" label_selected="Key hinzu" name="WLAddKey"/> + <button label="Key löschen" label_selected="Key löschen" name="WLDeleteKey"/> <text name="WLCurKeyFrameText"> Keyframe-Einstellungen: </text> <text name="WLCurKeyTimeText"> Key-Zeit: </text> - <spinner label="Std." name="WLCurKeyHour" /> - <spinner label="Min." name="WLCurKeyMin" /> + <spinner label="Std." name="WLCurKeyHour"/> + <spinner label="Min." name="WLCurKeyMin"/> <text name="WLCurKeyTimeText2"> Key-Voreinstellung: </text> - <combo_box label="Voreinstellung" name="WLKeyPresets" /> + <combo_box label="Voreinstellung" name="WLKeyPresets"/> <text name="DayCycleText"> Einrasten: </text> - <combo_box label="5 min" name="WLSnapOptions" /> + <combo_box label="5 min" name="WLSnapOptions"/> <text name="DayCycleText2"> Zykluslänge: </text> - <spinner label="Std." name="WLLengthOfDayHour" /> - <spinner label="Min." name="WLLengthOfDayMin" /> - <spinner label="Sek." name="WLLengthOfDaySec" /> + <spinner label="Std." name="WLLengthOfDayHour"/> + <spinner label="Min." name="WLLengthOfDayMin"/> + <spinner label="Sek." name="WLLengthOfDaySec"/> <text name="DayCycleText3"> Vorschau: </text> - <button label="Start" label_selected="Start" name="WLAnimSky" /> - <button label="Stopp" label_selected="Stopp" name="WLStopAnimSky" /> - <button label="Grundstückszeit verw" label_selected="Zur Grundstückszeit" - name="WLUseLindenTime" /> - <button label="Testtag speichern" label_selected="Testtag speichern" - name="WLSaveDayCycle" /> - <button label="Testtag laden" label_selected="Testtag laden" name="WLLoadDayCycle" /> + <button label="Start" label_selected="Start" name="WLAnimSky"/> + <button label="Stopp" label_selected="Stopp" name="WLStopAnimSky"/> + <button label="Grundbesitzzeit verw" label_selected="Zur Grundbesitzzeit" name="WLUseLindenTime"/> + <button label="Testtag speichern" label_selected="Testtag speichern" name="WLSaveDayCycle"/> + <button label="Testtag laden" label_selected="Testtag laden" name="WLLoadDayCycle"/> </panel> </tab_container> </floater> diff --git a/indra/newview/skins/default/xui/de/floater_env_settings.xml b/indra/newview/skins/default/xui/de/floater_env_settings.xml index 0f2370771f..0c78909108 100644 --- a/indra/newview/skins/default/xui/de/floater_env_settings.xml +++ b/indra/newview/skins/default/xui/de/floater_env_settings.xml @@ -20,7 +20,7 @@ Wasser- trübung </text> - <button label="Grundstückszeit verw." name="EnvUseEstateTimeButton"/> + <button label="Grundbesitzzeit verw." name="EnvUseEstateTimeButton"/> <button label="Himmel (erweitert)" name="EnvAdvancedSkyButton"/> <button label="Wasser (erweitert)" name="EnvAdvancedWaterButton"/> </floater> diff --git a/indra/newview/skins/default/xui/de/floater_event.xml b/indra/newview/skins/default/xui/de/floater_event.xml new file mode 100644 index 0000000000..cf663e2e1b --- /dev/null +++ b/indra/newview/skins/default/xui/de/floater_event.xml @@ -0,0 +1,69 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater label="Event" name="Event" title="EVENT-DETAILS"> + <floater.string name="none"> + keines + </floater.string> + <floater.string name="notify"> + Benachrichtigen + </floater.string> + <floater.string name="dont_notify"> + Nicht benachrichtigen + </floater.string> + <floater.string name="moderate"> + Moderat + </floater.string> + <floater.string name="adult"> + Adult + </floater.string> + <floater.string name="general"> + Allgemein + </floater.string> + <floater.string name="unknown"> + Unbekannt + </floater.string> + <layout_stack name="layout"> + <layout_panel name="profile_stack"> + <text name="event_name"> + Namenloses Event....namenlos! Tadaaa! Tadatadaaaah! + </text> + <text name="event_category"> + (keine Kategorie) + </text> + <text name="event_runby_label"> + Ausgeführt von: + </text> + <text initial_value="(wird in Datenbank gesucht)" name="event_runby"/> + <text name="event_date_label"> + Datum: + </text> + <text name="event_date"> + 10/10/2010 + </text> + <text name="event_duration_label"> + Dauer: + </text> + <text name="event_duration"> + 1 Stunde + </text> + <text name="event_covercharge_label"> + Eintritt: + </text> + <text name="event_cover"> + Kostenlos + </text> + <text name="event_location_label"> + Standort: + </text> + <text name="event_location" value="SampleParcel, Name Long (145, 228, 26)"/> + <text name="rating_label" value="Einstufung:"/> + <text name="rating_value" value="unbekannt"/> + </layout_panel> + <layout_panel name="button_panel"> + <button name="create_event_btn" tool_tip="Event erstellen"/> + <button name="god_delete_event_btn" tool_tip="Event löschen"/> + <button label="Mich benachrichtigen" name="notify_btn"/> + <button label="Teleportieren" name="teleport_btn"/> + <button label="Karte" name="map_btn"/> + </layout_panel> + </layout_stack> +</floater> diff --git a/indra/newview/skins/default/xui/de/floater_gesture.xml b/indra/newview/skins/default/xui/de/floater_gesture.xml index 0b27b362c3..7b35da8d5c 100644 --- a/indra/newview/skins/default/xui/de/floater_gesture.xml +++ b/indra/newview/skins/default/xui/de/floater_gesture.xml @@ -9,7 +9,7 @@ <floater.string name="copy_name"> Kopie von [COPY_NAME] </floater.string> - <scroll_list bottom_delta="-385" height="360" name="gesture_list"> + <scroll_list name="gesture_list"> <scroll_list.columns label="Name" name="name"/> <scroll_list.columns label="Chat" name="trigger"/> <scroll_list.columns label="" name="key"/> diff --git a/indra/newview/skins/default/xui/de/floater_god_tools.xml b/indra/newview/skins/default/xui/de/floater_god_tools.xml index 716165bb6b..8cb1af9f7d 100644 --- a/indra/newview/skins/default/xui/de/floater_god_tools.xml +++ b/indra/newview/skins/default/xui/de/floater_god_tools.xml @@ -2,58 +2,57 @@ <floater name="godtools floater" title="GOTT-WERKZEUGE"> <tab_container name="GodTools Tabs"> <panel label="Raster" name="grid"> - <button label="Alle Benutzer hinauswerfen" label_selected="Alle Benutzer hinauswerfen" name="Kick all users" width="175"/> <button label="Sichtbarkeits-Cache dieser Regionskarte leeren" label_selected="Sichtbarkeits-Cache dieser Regionskarte leeren" name="Flush This Region's Map Visibility Caches" width="285"/> </panel> <panel label="Region" name="region"> - <text name="Sim Name:" width="55"> - Sim-Name: + <text name="Region Name:"> + Name der Region: </text> <check_box label="Startbereich Einleitung" name="check prelude" tool_tip="Diese Region zu einem Startbereich machen."/> - <check_box label="Sonne fest" name="check fixed sun" tool_tip="Fixiert den Sonnenstand (wie in „Region/Grundstück“ > „Terrain“."/> - <check_box height="32" label="Zuhause auf Teleport zurücksetzen" name="check reset home" tool_tip="Wenn Einwohner weg teleportieren, ihr Zuhause auf Zielposition setzen."/> - <check_box bottom_delta="-32" label="Sichtbar" name="check visible" tool_tip="Diese Region für Nicht-Götter sichtbar machen."/> + <check_box label="Sonne fest" name="check fixed sun" tool_tip="Fixiert den Sonnenstand (wie in „Region/Grundbesitz“ > „Terrain“."/> + <check_box label="Zuhause auf Teleport zurücksetzen" name="check reset home" tool_tip="Wenn Einwohner weg teleportieren, ihr Zuhause auf Zielposition setzen."/> + <check_box label="Sichtbar" name="check visible" tool_tip="Diese Region für Nicht-Götter sichtbar machen."/> <check_box label="Schaden" name="check damage" tool_tip="Schaden in dieser Region aktivieren."/> <check_box label="Trafficüberwachung blockieren" name="block dwell" tool_tip="In dieser Region die Traffic-Berechnung abschalten."/> <check_box label="Terraformen blockieren" name="block terraform" tool_tip="Das Terraformen von Land verbieten (Benutzen Sie dies um Leuten das Terraformen ihres Landes zu verbieten)"/> <check_box label="Sandkasten" name="is sandbox" tool_tip="Sandkastenregion ein-/ausschalten."/> - <button label="Terrain formen" label_selected="Terrain formen" name="Bake Terrain" tool_tip="Das aktuelle Terrain als Standard speichern." width="118"/> - <button label="Terrain zurücksetzen" label_selected="Terrain zurücksetzen" name="Revert Terrain" tool_tip="Das aktuelle Terrain mit dem Standard ersetzen." width="118"/> - <button label="Terrain tauschen" label_selected="Terrain tauschen" name="Swap Terrain" tool_tip="Aktuelles Terrain gegen Standard austauschen." width="118"/> + <button label="Terrain formen" label_selected="Terrain formen" name="Bake Terrain" tool_tip="Das aktuelle Terrain als Standard speichern." width="120"/> + <button label="Terrain zurücksetzen" label_selected="Terrain zurücksetzen" name="Revert Terrain" tool_tip="Das aktuelle Terrain mit dem Standard ersetzen." width="120"/> + <button label="Terrain tauschen" label_selected="Terrain tauschen" name="Swap Terrain" tool_tip="Aktuelles Terrain gegen Standard austauschen." width="120"/> <text name="estate id"> - Grundstücks-ID: + Grundbesitz-ID: </text> <text name="parent id"> Parent ID: </text> - <line_editor name="parentestate" tool_tip="Das übergeordnete Grundstück dieser Region"/> + <line_editor name="parentestate" tool_tip="Der übergeordnete Grundbesitz dieser Region"/> <text name="Grid Pos: "> Raster-Pos.: </text> <line_editor left_delta="110" name="gridposx" tool_tip="Die X-Rasterposition dieser Region" width="35"/> <line_editor left_delta="45" name="gridposy" tool_tip="Die Y-Rasterposition dieser Region" width="35"/> - <text name="Redirect to Grid: "> + <text name="Redirect to Grid: " width="110"> Auf Raster umleiten: </text> - <line_editor left_delta="110" name="redirectx" width="35"/> + <line_editor left_delta="110" left_pad="0" name="redirectx" width="35"/> <line_editor left_delta="45" name="redirecty" width="35"/> <text font="SansSerifSmall" name="billable factor text"> Abrechnungsfaktor: </text> <text name="land cost text"> - L$ pro qm: + L$ pro m²: </text> <button label="Aktualisieren" label_selected="Aktualisieren" name="Refresh" tool_tip="Klicken Sie hier, um die obigen Informationen zu aktualisieren."/> <button label="Übernehmen" label_selected="Übernehmen" name="Apply" tool_tip="Klicken Sie hier, um die obigen Änderungen zu übernehmen."/> - <button label="Region auswählen" label_selected="Region auswählen" left="136" name="Select Region" tool_tip="Die gesamte Region mit dem Landwerkzeug auswählen." width="130"/> - <button label="Automatisch speichern" label_selected="Automatisch speichern" left="136" name="Autosave now" tool_tip="gzipped-Status im Autosave-Verzeichnis speichern." width="130"/> + <button label="Region auswählen" label_selected="Region auswählen" left="136" name="Select Region" tool_tip="Die gesamte Region mit dem Landwerkzeug auswählen." width="132"/> + <button label="Automatisch speichern" label_selected="Automatisch speichern" left="136" name="Autosave now" tool_tip="gzipped-Status im Autosave-Verzeichnis speichern." width="132"/> </panel> <panel label="Objekte" name="objects"> <panel.string name="no_target"> (kein Ziel) </panel.string> - <text name="Sim Name:" width="55"> - Sim-Name: + <text name="Region Name:"> + Name der Region: </text> <text name="region name"> Welsh diff --git a/indra/newview/skins/default/xui/de/floater_hardware_settings.xml b/indra/newview/skins/default/xui/de/floater_hardware_settings.xml index d01ea145f1..d931596efe 100644 --- a/indra/newview/skins/default/xui/de/floater_hardware_settings.xml +++ b/indra/newview/skins/default/xui/de/floater_hardware_settings.xml @@ -22,7 +22,7 @@ VBO aktivieren: </text> <check_box initial_value="true" label="OpenGL Vertex-Buffer-Objekte aktivieren" name="vbo" tool_tip="Wenn Sie über moderne Grafikhardware verfügen, können Sie durch Aktivieren dieser Option die Geschwindigkeit verbessern. Bei alter Hardware sind die VBO oft schlecht implementiert, was zu Abstürzen führen kann, wenn diese Option aktiviert ist."/> - <slider label="Texturspeicher (MB):" name="GraphicsCardTextureMemory" tool_tip="Speicherplatz, der für Texturen zur Verfügung steht. In der Regel handelt es sich um Grafikkartenspeicher. Ein kleinerer Wert kann die Geschwindigkeit erhöhen, aber auch zu Texturunschärfen führen."/> + <slider label="Texturen-Cache (MB):" name="GraphicsCardTextureMemory" tool_tip="Speicherplatz, der für Texturen zur Verfügung steht. In der Regel handelt es sich um Grafikkartenspeicher. Ein kleinerer Wert kann die Geschwindigkeit erhöhen, aber auch zu Texturunschärfen führen."/> <spinner label="Nebeldistanzverhältnis:" name="fog"/> <button label="OK" label_selected="OK" name="OK"/> </floater> diff --git a/indra/newview/skins/default/xui/de/floater_help_browser.xml b/indra/newview/skins/default/xui/de/floater_help_browser.xml index bfefa57731..d55a3b0a26 100644 --- a/indra/newview/skins/default/xui/de/floater_help_browser.xml +++ b/indra/newview/skins/default/xui/de/floater_help_browser.xml @@ -1,14 +1,9 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="floater_help_browser" title="HILFE-BROWSER"> - <floater.string name="home_page_url"> - http://de.secondlife.com - </floater.string> - <floater.string name="support_page_url"> - http://de.secondlife.com/support + <floater.string name="loading_text"> + Wird geladen... </floater.string> <layout_stack name="stack1"> - <layout_panel name="external_controls"> - <button label="In meinem Browser öffnen" name="open_browser"/> - </layout_panel> + <layout_panel name="external_controls"/> </layout_stack> </floater> diff --git a/indra/newview/skins/default/xui/de/floater_im.xml b/indra/newview/skins/default/xui/de/floater_im.xml index 6aa35f2900..8ae8f120cf 100644 --- a/indra/newview/skins/default/xui/de/floater_im.xml +++ b/indra/newview/skins/default/xui/de/floater_im.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <multi_floater name="im_floater" title="Instant Message"> <string name="only_user_message"> - Sie sind der einzige Benutzer in dieser Sitzung. + Sie sind der einzige Einwohner in dieser Sitzung. </string> <string name="offline_message"> [FIRST] [LAST] ist offline. @@ -32,7 +32,7 @@ </string> <!-- ALL of the event strings should have [RECIPIENT] in them --> <string name="add_session_event"> - Es konnten keine Benutzer zur Chat-Sitzung mit [RECIPIENT] hinzugefügt werden. + Es konnten keine Einwohner zur Chat-Sitzung mit [RECIPIENT] hinzugefügt werden. </string> <string name="message_session_event"> Ihre Nachricht konnte nicht an die Chat-Sitzung mit [RECIPIENT] gesendet werden. diff --git a/indra/newview/skins/default/xui/de/floater_im_session.xml b/indra/newview/skins/default/xui/de/floater_im_session.xml index 7bde3a3453..c69bb600ea 100644 --- a/indra/newview/skins/default/xui/de/floater_im_session.xml +++ b/indra/newview/skins/default/xui/de/floater_im_session.xml @@ -3,7 +3,7 @@ <layout_stack name="im_panels"> <layout_panel label="IM Steuerkonsole" name="panel_im_control_panel"/> <layout_panel> - <line_editor label="Bis" name="chat_editor"/> + <line_editor label="An" name="chat_editor"/> </layout_panel> </layout_stack> </floater> diff --git a/indra/newview/skins/default/xui/de/floater_image_preview.xml b/indra/newview/skins/default/xui/de/floater_image_preview.xml index 7f66234dab..d581c6051b 100644 --- a/indra/newview/skins/default/xui/de/floater_image_preview.xml +++ b/indra/newview/skins/default/xui/de/floater_image_preview.xml @@ -10,16 +10,16 @@ Bildvorschau als: </text> <combo_box label="Kleidungstyp" name="clothing_type_combo"> - <combo_box.item label="Bild" name="Image"/> - <combo_box.item label="Haare" name="Hair"/> - <combo_box.item label="Kopf (Frau)" name="FemaleHead"/> - <combo_box.item label="Oberkörper (Frau)" name="FemaleUpperBody"/> - <combo_box.item label="Unterkörper (Frau)" name="FemaleLowerBody"/> - <combo_box.item label="Kopf (Mann)" name="MaleHead"/> - <combo_box.item label="Oberkörper (Mann)" name="MaleUpperBody"/> - <combo_box.item label="Unterkörper (Mann)" name="MaleLowerBody"/> - <combo_box.item label="Rock" name="Skirt"/> - <combo_box.item label="Geformtes Primitiv" name="SculptedPrim"/> + <item label="Bild" name="Image" value="Bild"/> + <item label="Haare" name="Hair" value="Haare"/> + <item label="Kopf (Frau)" name="FemaleHead" value="Kopf (Frau)"/> + <item label="Oberkörper (Frau)" name="FemaleUpperBody" value="Oberkörper (Frau)"/> + <item label="Unterkörper (Frau)" name="FemaleLowerBody" value="Unterkörper (Frau)"/> + <item label="Kopf (Mann)" name="MaleHead" value="Kopf (Mann)"/> + <item label="Oberkörper (Mann)" name="MaleUpperBody" value="Oberkörper (Mann)"/> + <item label="Unterkörper (Mann)" name="MaleLowerBody" value="Unterkörper (Mann)"/> + <item label="Rock" name="Skirt" value="Rock"/> + <item label="Geformtes Primitiv" name="SculptedPrim" value="Geformtes Primitiv"/> </combo_box> <text name="bad_image_text"> Bild kann nicht gelesen werden. @@ -28,5 +28,5 @@ Speichern Sie das Bild als 24 Bit Targa (.tga). </text> <check_box label="Verlustfreie Komprimierung verwenden" name="lossless_check"/> <button label="Abbrechen" name="cancel_btn"/> - <button label="Hochladen ([AMOUNT] L$)" name="ok_btn"/> + <button label="Hochladen ([AMOUNT] L$)" name="ok_btn" width="146"/> </floater> diff --git a/indra/newview/skins/default/xui/de/floater_incoming_call.xml b/indra/newview/skins/default/xui/de/floater_incoming_call.xml index 740085599f..0312f7dfe9 100644 --- a/indra/newview/skins/default/xui/de/floater_incoming_call.xml +++ b/indra/newview/skins/default/xui/de/floater_incoming_call.xml @@ -16,7 +16,13 @@ ist einem Voice-Konferenz-Chat beigetreten. </floater.string> <floater.string name="VoiceInviteGroup"> - ist einem Voice-Chat mit der Gruppe [GROUP] beigetreten. + ist dem '[GROUP]' Voice-Kanal beigetreten. + </floater.string> + <floater.string name="VoiceInviteQuestionGroup"> + Möchten Sie [CURRENT_CHAT] verlassen und dem Gespräch mit '[GROUP]' beitreten? + </floater.string> + <floater.string name="VoiceInviteQuestionDefault"> + Möchten Sie [CURRENT_CHAT] verlassen und diesem Voice-Chat beitreten? </floater.string> <text name="question"> Möchten Sie [CURRENT_CHAT] verlassen und diesem Voice-Chat beitreten? diff --git a/indra/newview/skins/default/xui/de/floater_inspect.xml b/indra/newview/skins/default/xui/de/floater_inspect.xml index 939aa964c0..da97ceb2d8 100644 --- a/indra/newview/skins/default/xui/de/floater_inspect.xml +++ b/indra/newview/skins/default/xui/de/floater_inspect.xml @@ -1,13 +1,13 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater min_width="450" name="inspect" title="OBJEKTE UNTERSUCHEN"> +<floater min_width="460" name="inspect" title="OBJEKTE UNTERSUCHEN" width="460"> <floater.string name="timeStamp"> [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local] </floater.string> <scroll_list name="object_list" tool_tip="Wählen Sie ein Objekt aus dieser Liste, um es in der Second Life-Welt zu markieren"> <scroll_list.columns label="Objektname" name="object_name"/> - <scroll_list.columns label="Besitzer" name="owner_name"/> + <scroll_list.columns label="Besitzer" name="owner_name" /> <scroll_list.columns label="Ersteller" name="creator_name"/> - <scroll_list.columns label="Erstellungsdatum" name="creation_date"/> + <scroll_list.columns label="Erstellungsdatum" name="creation_date" width="116"/> </scroll_list> <button label="Besitzerprofil einsehen..." name="button owner" tool_tip="Profil des Besitzers des markierten Objekts einsehen" width="155"/> <button label="Erstellerprofil einsehen..." left="175" name="button creator" tool_tip="Profil des ursprünglichen Erstellers des markierten Objekts einsehen" width="155"/> diff --git a/indra/newview/skins/default/xui/de/floater_inventory.xml b/indra/newview/skins/default/xui/de/floater_inventory.xml index d9014fc0ef..d9b7c30fd2 100644 --- a/indra/newview/skins/default/xui/de/floater_inventory.xml +++ b/indra/newview/skins/default/xui/de/floater_inventory.xml @@ -1,13 +1,13 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Inventory" title="INVENTAR"> +<floater name="Inventory" title="MEIN INVENTAR"> <floater.string name="Title"> - Inventar + MEIN INVENTAR </floater.string> <floater.string name="TitleFetching"> - Inventar ([ITEM_COUNT] Artikel werden abgerufen...) [FILTER] + MEIN INVENTAR ([ITEM_COUNT] Objekte werden abgerufen...) [FILTER] </floater.string> <floater.string name="TitleCompleted"> - Inventar ([ITEM_COUNT] Artikel) [FILTER] + MEIN INVENTAR ([ITEM_COUNT] Objekte) [FILTER] </floater.string> <floater.string name="Fetched"> Abgerufen diff --git a/indra/newview/skins/default/xui/de/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/de/floater_inventory_item_properties.xml index e894f666c9..f98e23bbc4 100644 --- a/indra/newview/skins/default/xui/de/floater_inventory_item_properties.xml +++ b/indra/newview/skins/default/xui/de/floater_inventory_item_properties.xml @@ -59,10 +59,10 @@ Nächster Eigentümer: </text> <check_box label="Bearbeiten" name="CheckNextOwnerModify"/> - <check_box label="Kopieren" left_delta="85" name="CheckNextOwnerCopy"/> + <check_box label="Kopieren" left_delta="55" name="CheckNextOwnerCopy"/> <check_box label="Wiederverkaufen" name="CheckNextOwnerTransfer"/> <check_box label="Zum Verkauf" name="CheckPurchase"/> - <combo_box name="combobox sale copy"> + <combo_box name="combobox sale copy" left_pad="25"> <combo_box.item label="Kopieren" name="Copy"/> <combo_box.item label="Original" name="Original"/> </combo_box> diff --git a/indra/newview/skins/default/xui/de/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/de/floater_live_lsleditor.xml index 248460af82..3b42a8b741 100644 --- a/indra/newview/skins/default/xui/de/floater_live_lsleditor.xml +++ b/indra/newview/skins/default/xui/de/floater_live_lsleditor.xml @@ -7,7 +7,7 @@ Läuft </floater.string> <floater.string name="Title"> - Skript: [NAME] + SKRIPT: [NAME] </floater.string> <button label="Zurücksetzen" label_selected="Zurücksetzen" name="Reset"/> <check_box initial_value="true" label="Läuft" name="running"/> diff --git a/indra/newview/skins/default/xui/de/floater_lsl_guide.xml b/indra/newview/skins/default/xui/de/floater_lsl_guide.xml index 1d6f690d3c..73c21edc67 100644 --- a/indra/newview/skins/default/xui/de/floater_lsl_guide.xml +++ b/indra/newview/skins/default/xui/de/floater_lsl_guide.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="script ed float" title="LSL-REFERENZ"> <check_box label="Cursor folgen" name="lock_check"/> - <combo_box label="Sperren" name="history_combo"/> + <combo_box label="Sperren" name="history_combo" left_pad="50" width="80"/> <button label="Zurück" name="back_btn"/> <button label="Weiter" name="fwd_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/de/floater_map.xml b/indra/newview/skins/default/xui/de/floater_map.xml index b985d1d187..a9a3149177 100644 --- a/indra/newview/skins/default/xui/de/floater_map.xml +++ b/indra/newview/skins/default/xui/de/floater_map.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Map"> +<floater name="Map" title="Minikarte"> <floater.string name="mini_map_north"> N </floater.string> diff --git a/indra/newview/skins/default/xui/de/floater_media_browser.xml b/indra/newview/skins/default/xui/de/floater_media_browser.xml index 18adb5ee7f..2d438dfe21 100644 --- a/indra/newview/skins/default/xui/de/floater_media_browser.xml +++ b/indra/newview/skins/default/xui/de/floater_media_browser.xml @@ -14,8 +14,8 @@ <button label="Los" name="go"/> </layout_panel> <layout_panel name="time_controls"> - <button label="zurückspulen" name="rewind"/> - <button label="anhalten" name="stop"/> + <button label="zurückspulen" name="rewind" width="100"/> + <button label="anhalten" name="stop" left_pad="20"/> <button label="vorwärts" name="seek"/> </layout_panel> <layout_panel name="parcel_owner_controls"> diff --git a/indra/newview/skins/default/xui/de/floater_mem_leaking.xml b/indra/newview/skins/default/xui/de/floater_mem_leaking.xml index b730146aa6..fdc9b950b6 100644 --- a/indra/newview/skins/default/xui/de/floater_mem_leaking.xml +++ b/indra/newview/skins/default/xui/de/floater_mem_leaking.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="MemLeak" title="SPEICHERVERLUST SIMULIEREN"> - <spinner label="Verlustgeschwindigkeit (Bytes pro Frame):" name="leak_speed"/> - <spinner label="Max. Speicherverlust (MB):" name="max_leak"/> + <spinner label="Verlustgeschwindigkeit (Bytes pro Frame):" name="leak_speed" label_width="224"/> + <spinner label="Max. Speicherverlust (MB):" name="max_leak" label_width="224"/> <text name="total_leaked_label"> Aktueller Speicherverlust:[SIZE] KB </text> diff --git a/indra/newview/skins/default/xui/de/floater_moveview.xml b/indra/newview/skins/default/xui/de/floater_moveview.xml index 03930c8ed6..b978322cef 100644 --- a/indra/newview/skins/default/xui/de/floater_moveview.xml +++ b/indra/newview/skins/default/xui/de/floater_moveview.xml @@ -18,6 +18,15 @@ <string name="fly_back_tooltip"> Rückwärts fliegen (Nach-Unten-Pfeil oder S drücken) </string> + <string name="walk_title"> + Gehen + </string> + <string name="run_title"> + Rennen + </string> + <string name="fly_title"> + Fliegen + </string> <panel name="panel_actions"> <button label="" label_selected="" name="turn left btn" tool_tip="Nach links (Links-Pfeil oder A drücken)"/> <button label="" label_selected="" name="turn right btn" tool_tip="Nach rechts (Rechts-Pfeil oder D drücken)"/> @@ -30,6 +39,5 @@ <button label="" name="mode_walk_btn" tool_tip="Gehen"/> <button label="" name="mode_run_btn" tool_tip="Rennen"/> <button label="" name="mode_fly_btn" tool_tip="Fliegen"/> - <button label="Landen" name="stop_fly_btn" tool_tip="Landen"/> </panel> </floater> diff --git a/indra/newview/skins/default/xui/de/floater_openobject.xml b/indra/newview/skins/default/xui/de/floater_openobject.xml index f0b6aa498b..c3e7052283 100644 --- a/indra/newview/skins/default/xui/de/floater_openobject.xml +++ b/indra/newview/skins/default/xui/de/floater_openobject.xml @@ -3,6 +3,6 @@ <text name="object_name"> [DESC]: </text> - <button label="In Inventar kopieren" label_selected="In Inventar kopieren" name="copy_to_inventory_button" width="132"/> - <button label="Kopieren und anziehen" label_selected="Kopieren und anziehen" left="150" name="copy_and_wear_button" width="132"/> + <button label="In Inventar kopieren" label_selected="In Inventar kopieren" name="copy_to_inventory_button" width="120"/> + <button label="Kopieren und anziehen" label_selected="Kopieren und anziehen" left_pad="6" name="copy_and_wear_button" width="136"/> </floater> diff --git a/indra/newview/skins/default/xui/de/floater_outfit_save_as.xml b/indra/newview/skins/default/xui/de/floater_outfit_save_as.xml index 42cb91ccbb..8c110e5516 100644 --- a/indra/newview/skins/default/xui/de/floater_outfit_save_as.xml +++ b/indra/newview/skins/default/xui/de/floater_outfit_save_as.xml @@ -1,11 +1,12 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="modal container"> +<floater name="modal container" title="Outfit speichern"> <button label="Speichern" label_selected="Speichern" name="Save"/> <button label="Abbrechen" label_selected="Abbrechen" name="Cancel"/> <text name="Save item as:"> - Outfit speichern als: + Meine aktuelle Kleidung +als neues Outfit speichern: </text> <line_editor name="name ed"> - [BESCHR] + [DESC] (neu) </line_editor> </floater> diff --git a/indra/newview/skins/default/xui/de/floater_outgoing_call.xml b/indra/newview/skins/default/xui/de/floater_outgoing_call.xml index 99ef0e900e..81079a3c52 100644 --- a/indra/newview/skins/default/xui/de/floater_outgoing_call.xml +++ b/indra/newview/skins/default/xui/de/floater_outgoing_call.xml @@ -25,10 +25,13 @@ Der Anruf wurde nicht entgegengenommen. Bitte versuchen Sie es später erneut. </text> <text name="nearby"> - Die Verbindung zu [VOICE_CHANNEL_NAME] wurde abgebrochen. Sie werden nun wieder mit dem Chat in Ihrer Nähe verbunden. + Die Verbindung zu [VOICE_CHANNEL_NAME] wurde abgebrochen. [RECONNECT_NEARBY] </text> - <text name="nearby_P2P"> - [VOICE_CHANNEL_NAME] hat den Anruf beendet. Sie werden nun wieder mit dem Chat in Ihrer Nähe verbunden. + <text name="nearby_P2P_by_other"> + Ihr Anfruf wurde beendet. [RECONNECT_NEARBY] + </text> + <text name="nearby_P2P_by_agent"> + Sie haben das Gespräch beendet. [RECONNECT_NEARBY] </text> <text name="leaving"> [CURRENT_CHAT] wird verlassen. diff --git a/indra/newview/skins/default/xui/de/floater_pay.xml b/indra/newview/skins/default/xui/de/floater_pay.xml index 6eb1d9472d..ec3c45dccf 100644 --- a/indra/newview/skins/default/xui/de/floater_pay.xml +++ b/indra/newview/skins/default/xui/de/floater_pay.xml @@ -7,7 +7,7 @@ Einwohner bezahlen </string> <text name="payee_label" width="130"> - Zahlen: + Bezahlen: </text> <icon name="icon_person" tool_tip="Person"/> <text left="130" name="payee_name"> @@ -18,8 +18,8 @@ <button label="10 L$" label_selected="10 L$" name="fastpay 10"/> <button label="20 L$" label_selected="20 L$" name="fastpay 20"/> <text name="amount text"> - Oder Betrag auswählen: + oder Betrag auswählen: </text> - <button label="Zahlen" label_selected="Zahlen" name="pay btn"/> + <button label="Bezahlen" label_selected="Bezahlen" name="pay btn"/> <button label="Abbrechen" label_selected="Abbrechen" name="cancel btn"/> </floater> diff --git a/indra/newview/skins/default/xui/de/floater_pay_object.xml b/indra/newview/skins/default/xui/de/floater_pay_object.xml index 92f5ea415e..59494cc100 100644 --- a/indra/newview/skins/default/xui/de/floater_pay_object.xml +++ b/indra/newview/skins/default/xui/de/floater_pay_object.xml @@ -17,13 +17,13 @@ <text left="105" name="object_name_text"> ... </text> - <button label="1 L$" label_selected="1 L$" left="105" name="fastpay 1"/> - <button label="5 L$" label_selected="5 L$" left="190" name="fastpay 5"/> - <button label="10 L$" label_selected="10 L$" left="105" name="fastpay 10"/> - <button label="20 L$" label_selected="20 L$" left="190" name="fastpay 20"/> + <button label="1 L$" label_selected="1 L$" name="fastpay 1"/> + <button label="5 L$" label_selected="5 L$" name="fastpay 5"/> + <button label="10 L$" label_selected="10 L$" name="fastpay 10"/> + <button label="20 L$" label_selected="20 L$" name="fastpay 20"/> <text name="amount text"> - Oder Betrag auswählen: + oder Betrag auswählen: </text> - <button label="Zahlen" label_selected="Zahlen" name="pay btn"/> + <button label="Bezahlen" label_selected="Bezahlen" name="pay btn"/> <button label="Abbrechen" label_selected="Abbrechen" name="cancel btn" width="76"/> </floater> diff --git a/indra/newview/skins/default/xui/de/floater_postcard.xml b/indra/newview/skins/default/xui/de/floater_postcard.xml index 37a0a0ad1d..91e0bb8133 100644 --- a/indra/newview/skins/default/xui/de/floater_postcard.xml +++ b/indra/newview/skins/default/xui/de/floater_postcard.xml @@ -3,19 +3,19 @@ <text name="to_label"> E-Mail des Empfängers: </text> - <line_editor left="145" name="to_form" width="125"/> + <line_editor left_delta="145" name="to_form" width="125"/> <text name="from_label"> Ihre E-Mail: </text> - <line_editor left="145" name="from_form" width="125"/> + <line_editor left_delta="145" name="from_form" width="125"/> <text name="name_label"> Ihr Name: </text> - <line_editor left="145" name="name_form" width="125"/> + <line_editor left_delta="145" name="name_form" width="125"/> <text name="subject_label"> Betreff: </text> - <line_editor label="Betreff hier eingeben." left="145" name="subject_form" width="125"/> + <line_editor label="Betreff hier eingeben." left_delta="145" name="subject_form" width="125"/> <text name="msg_label"> Nachricht: </text> @@ -25,7 +25,7 @@ <check_box label="Im Web veröffentlichen" name="allow_publish_check" tool_tip="Veröffentlicht diese Postkarte im Web."/> <check_box label="Ab-18-Inhalt" name="mature_check" tool_tip="Diese Postkarte enthält nicht jugendfreie Inhalte."/> <button label="?" name="publish_help_btn"/> - <text name="fine_print"> + <text name="fine_print" bottom_delta="21" height="140"> Wenn sich der Empfänger bei SL anmeldet, erhalten Sie einen Empfehlungsbonus. </text> <button label="Abbrechen" name="cancel_btn"/> diff --git a/indra/newview/skins/default/xui/de/floater_preferences.xml b/indra/newview/skins/default/xui/de/floater_preferences.xml index 106fd6dfd3..a2712c437b 100644 --- a/indra/newview/skins/default/xui/de/floater_preferences.xml +++ b/indra/newview/skins/default/xui/de/floater_preferences.xml @@ -6,10 +6,10 @@ <panel label="Allgemein" name="general"/> <panel label="Grafik" name="display"/> <panel label="Privatsphäre" name="im"/> - <panel label="Sound" name="audio"/> + <panel label="Sound & Medien" name="audio"/> <panel label="Chat" name="chat"/> - <panel label="Benachrichtigungen" name="msgs"/> - <panel label="Setup" name="input"/> + <panel label="Meldungen" name="msgs"/> + <panel label="Konfiguration" name="input"/> <panel label="Erweitert" name="advanced1"/> </tab_container> </floater> diff --git a/indra/newview/skins/default/xui/de/floater_preview_animation.xml b/indra/newview/skins/default/xui/de/floater_preview_animation.xml index e98faeb1f4..3dcdb52555 100644 --- a/indra/newview/skins/default/xui/de/floater_preview_animation.xml +++ b/indra/newview/skins/default/xui/de/floater_preview_animation.xml @@ -3,10 +3,10 @@ <floater.string name="Title"> Animation: [NAME] </floater.string> - <text name="desc txt"> + <text name="desc txt" width="140"> Beschreibung: </text> - <line_editor left="98" name="desc" width="189"/> - <button label="In Welt abspielen" label_selected="Stopp" name="Anim play btn" tool_tip="Diese Animation so wiedergeben, dass andere sie sehen können." width="116"/> - <button label="Lokal wiedergeben" label_selected="Stopp" left="171" name="Anim audition btn" tool_tip="Diese Animation so wiedergeben, dass nur Sie sie sehen." width="116"/> + <line_editor left="108" name="desc" width="160"/> + <button label="Inworld abspielen" label_selected="Stopp" name="Anim play btn" tool_tip="Diese Animation so wiedergeben, dass andere sie sehen können." width="116"/> + <button label="Lokal abspielen" label_selected="Stopp" left="171" name="Anim audition btn" tool_tip="Diese Animation so wiedergeben, dass nur Sie sie sehen." width="116"/> </floater> diff --git a/indra/newview/skins/default/xui/de/floater_preview_gesture.xml b/indra/newview/skins/default/xui/de/floater_preview_gesture.xml index 51c41a3209..48b1f1170c 100644 --- a/indra/newview/skins/default/xui/de/floater_preview_gesture.xml +++ b/indra/newview/skins/default/xui/de/floater_preview_gesture.xml @@ -7,7 +7,7 @@ Sound abspielen: </floater.string> <floater.string name="step_chat"> - Chat sprechen: + Im Chat anzeigen: </floater.string> <floater.string name="step_wait"> Warten: @@ -36,7 +36,7 @@ <text name="replace_text" tool_tip="Ersetzt den Auslösertext mit diesem Text. Wenn Sie zum Beispiel den Auslöser „hallo“ durch „wie geht's“ ersetzen, erscheint im Chat anstelle von „Ich wollte nur hallo sagen“ der Text „Ich wollte nur wie geht's sagen“ und die zugehörige Geste wird abgespielt."> Ersetzen mit: </text> - <line_editor name="replace_editor" tool_tip="Ersetzt den Auslösertext mit diesem Text. Wenn Sie zum Beispiel den Auslöser „hallo“ durch „wie geht's“ ersetzen, erscheint im Chat anstelle von „Ich wollte nur hallo sagen“ der Text „Ich wollte nur wie geht's sagen“ und die zugehörige Geste wird abgespielt."/> + <line_editor name="replace_editor" tool_tip="Ersetzt den Auslösertext mit diesem Text. Wenn Sie zum Beispiel den Auslöser „hallo“ durch „wie geht's“ ersetzen, erscheint im Chat anstelle von „Ich wollte nur hallo sagen“ der Text „Ich wollte nur wie geht's sagen“ und die zugehörige Geste wird abgespielt." left_delta="94" width="160"/> <text name="key_label"> Tastenkürzel: </text> @@ -45,8 +45,8 @@ <text name="library_label"> Bibliothek: </text> - <scroll_list name="library_list"/> - <button label="Hinzufügen >>" name="add_btn"/> + <scroll_list name="library_list" width="166"/> + <button label="Hinzufügen >>" name="add_btn" left_pad="6" width="94"/> <text name="steps_label"> Schritte: </text> diff --git a/indra/newview/skins/default/xui/de/floater_preview_sound.xml b/indra/newview/skins/default/xui/de/floater_preview_sound.xml index 17419548bc..4629ec4a04 100644 --- a/indra/newview/skins/default/xui/de/floater_preview_sound.xml +++ b/indra/newview/skins/default/xui/de/floater_preview_sound.xml @@ -6,6 +6,6 @@ <text name="desc txt"> Beschreibung: </text> - <button label="In Welt abspielen" label_selected="In Welt abspielen" name="Sound play btn" tool_tip="Gibt diesen Sound so wieder, dass andere ihn hören können."/> - <button label="Lokal wiedergeben" label_selected="Lokal wiedergeben" name="Sound audition btn" tool_tip="Gibt diesen Sound so wieder, dass nur Sie ihn hören."/> + <button label="Inworld abspielen" label_selected="Inworld abspielen" name="Sound play btn" tool_tip="Gibt diesen Sound so wieder, dass andere ihn hören können."/> + <button label="Lokal abspielen" label_selected="Lokal abspielen" name="Sound audition btn" tool_tip="Gibt diesen Sound so wieder, dass nur Sie ihn hören."/> </floater> diff --git a/indra/newview/skins/default/xui/de/floater_preview_texture.xml b/indra/newview/skins/default/xui/de/floater_preview_texture.xml index ac6a61cde6..526c0813bd 100644 --- a/indra/newview/skins/default/xui/de/floater_preview_texture.xml +++ b/indra/newview/skins/default/xui/de/floater_preview_texture.xml @@ -42,6 +42,6 @@ </combo_item> </combo_box> <button label="OK" name="Keep"/> - <button label="Abbrechen" name="Discard"/> + <button label="Verwerfen" name="Discard"/> <button label="Speichern unter" name="save_tex_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/de/floater_publish_classified.xml b/indra/newview/skins/default/xui/de/floater_publish_classified.xml new file mode 100644 index 0000000000..993382727b --- /dev/null +++ b/indra/newview/skins/default/xui/de/floater_publish_classified.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="publish_classified" title="Anzeige wird veröffentlicht"> + <text name="explanation_text"> + Ihr Anzeige wird für eine Woche veröffentlicht. + +Anzeigengebühren werden nicht zurückerstattet. + </text> + <spinner label="Anzeigenpreis:" name="price_for_listing" tool_tip="Preis für Anzeige." value="50"/> + <text name="l$_text" value="L$"/> + <text name="more_info_text"> + Weitere Infos (Link zur Hilfe) + </text> + <button label="Veröffentlichen" name="publish_btn"/> + <button label="Abbrechen" name="cancel_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/de/floater_region_info.xml b/indra/newview/skins/default/xui/de/floater_region_info.xml index 354cdaa272..c0dc47a67d 100644 --- a/indra/newview/skins/default/xui/de/floater_region_info.xml +++ b/indra/newview/skins/default/xui/de/floater_region_info.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="regioninfo" title="REGION/GRUNDSTÜCK"/> +<floater name="regioninfo" title="REGION/GRUNDBESITZ"/> diff --git a/indra/newview/skins/default/xui/de/floater_report_abuse.xml b/indra/newview/skins/default/xui/de/floater_report_abuse.xml index 3edf5959a2..e37e298478 100644 --- a/indra/newview/skins/default/xui/de/floater_report_abuse.xml +++ b/indra/newview/skins/default/xui/de/floater_report_abuse.xml @@ -23,7 +23,8 @@ {128.1, 128.1, 15.4} </text> <text bottom_delta="-38" height="32" name="select_object_label"> - Klicken Sie auf die Schaltfläche, dann auf das entsprechende Objekt: + Klicken Sie die Schaltfläche, dann das entsprechende +Objekt: </text> <button label="" label_selected="" name="pick_btn" tool_tip="Objektauswahl – Wählen Sie ein Objekt als Thema dieses Berichts aus"/> <text name="object_name_label"> @@ -40,11 +41,11 @@ </text> <combo_box name="category_combo" tool_tip="Kategorie -- wählen Sie die Kategorie aus, die am besten auf diesen Bericht zutrifft"> <combo_box.item label="Kategorie auswählen" name="Select_category"/> - <combo_box.item label="Alter> Age-Play" name="Age__Age_play"/> + <combo_box.item label="Alter > Age-Play" name="Age__Age_play"/> <combo_box.item label="Alter > Erwachsener Einwohner in Teen Second Life" name="Age__Adult_resident_on_Teen_Second_Life"/> <combo_box.item label="Alter > Minderjähriger Einwohner außerhalb Teen Second Life" name="Age__Underage_resident_outside_of_Teen_Second_Life"/> - <combo_box.item label="Angriff> Kampf-Sandbox / unsichere Region" name="Assault__Combat_sandbox___unsafe_area"/> - <combo_box.item label="Angriff> Sichere Region" name="Assault__Safe_area"/> + <combo_box.item label="Angriff > Kampf-Sandbox / unsichere Region" name="Assault__Combat_sandbox___unsafe_area"/> + <combo_box.item label="Angriff > Sichere Region" name="Assault__Safe_area"/> <combo_box.item label="Angriff > Sandbox für Waffentest" name="Assault__Weapons_testing_sandbox"/> <combo_box.item label="Handel > Produkt nicht geliefert oder Dienstleistung nicht erbracht" name="Commerce__Failure_to_deliver_product_or_service"/> <combo_box.item label="Offenlegung > Informationen aus realer Welt" name="Disclosure__Real_world_information"/> @@ -56,7 +57,7 @@ <combo_box.item label="Ruhestörung > Ständige Spam-Wiederholung" name="Disturbing_the_peace__Repetitive_spam"/> <combo_box.item label="Ruhestörung > Unerwünschte Spam-Werbung" name="Disturbing_the_peace__Unwanted_advert_spam"/> <combo_box.item label="Betrug > L$" name="Fraud__L$"/> - <combo_box.item label="Betrug> Land" name="Fraud__Land"/> + <combo_box.item label="Betrug > Land" name="Fraud__Land"/> <combo_box.item label="Betrug > Schneeballsystem oder Kettenbrief" name="Fraud__Pyramid_scheme_or_chain_letter"/> <combo_box.item label="Betrug > US$" name="Fraud__US$"/> <combo_box.item label="Belästigung > Werbefarmen / visueller Spam" name="Harassment__Advert_farms___visual_spam"/> @@ -93,9 +94,9 @@ Details: </text> <text name="bug_aviso"> - Bitte beschreiben Sie alles so genau wie möglich. + Detaillierte Beschreibung: </text> - <text_editor bottom_delta="-136" height="130" name="details_edit"/> + <text_editor bottom_delta="-136" height="70" name="details_edit"/> <text bottom_delta="-20" name="incomplete_title"> * Unvollständige Berichte werden nicht bearbeitet </text> diff --git a/indra/newview/skins/default/xui/de/floater_script_preview.xml b/indra/newview/skins/default/xui/de/floater_script_preview.xml index 27c40aff07..e0bcd42523 100644 --- a/indra/newview/skins/default/xui/de/floater_script_preview.xml +++ b/indra/newview/skins/default/xui/de/floater_script_preview.xml @@ -1,9 +1,9 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="preview lsl text" title="SKRIPT: ROTATIONS-SKRIPT"> <floater.string name="Title"> - Skript: [NAME] + SKRIPT: [NAME] </floater.string> - <text name="desc txt"> + <text name="desc txt" width="120"> Beschreibung: </text> </floater> diff --git a/indra/newview/skins/default/xui/de/floater_sell_land.xml b/indra/newview/skins/default/xui/de/floater_sell_land.xml index 2bc7356e65..8f67fae464 100644 --- a/indra/newview/skins/default/xui/de/floater_sell_land.xml +++ b/indra/newview/skins/default/xui/de/floater_sell_land.xml @@ -5,13 +5,13 @@ <text name="info_parcel_label"> Parzelle: </text> - <text bottom_delta="-5" height="16" name="info_parcel"> + <text bottom_delta="-5" height="16" name="info_parcel" left="70"> PARZELLENNAME </text> <text name="info_size_label"> Größe: </text> - <text bottom_delta="-21" height="32" name="info_size"> + <text bottom_delta="-21" height="32" name="info_size" left="70"> [AREA] m². </text> <text bottom_delta="-57" height="28" name="info_action"> @@ -20,8 +20,8 @@ <text name="price_label"> 1. Preis festlegen: </text> - <text name="price_text"> - Einen angemessenen Preis auswählen. + <text name="price_text" > + Preis eingeben </text> <text name="price_ld"> L$ @@ -36,12 +36,12 @@ 2. Land verkaufen an: </text> <text bottom_delta="-16" height="16" left="72" name="sell_to_text" right="-10"> - Wählen Sie, ob der Verkauf offen oder auf eine bestimmte Person beschränkt ist. + Offener Verkauf oder Verkauf an bestimmte Person? </text> <combo_box bottom_delta="-32" height="16" left="72" name="sell_to" width="140"> <combo_box.item label="-- Auswählen --" name="--selectone--"/> - <combo_box.item label="Jeder" name="Anyone"/> - <combo_box.item label="Bestimmte Person:" name="Specificuser:"/> + <combo_box.item label="An jeden" name="Anyone"/> + <combo_box.item label="An bestimmte Person:" name="Specificuser:"/> </combo_box> <button label="Auswählen" name="sell_to_select_agent"/> <text name="sell_objects_label"> @@ -58,7 +58,7 @@ <text name="nag_message_label"> ACHTUNG: Verkäufe sind endgültig. </text> - <button label="Land zum Verkauf freigeben" name="sell_btn" width="180"/> + <button label="Zum Verkauf freigeben" name="sell_btn" width="180"/> <button label="Abbrechen" name="cancel_btn"/> </panel> </scroll_container> diff --git a/indra/newview/skins/default/xui/de/floater_snapshot.xml b/indra/newview/skins/default/xui/de/floater_snapshot.xml index 80573d69ad..a656ffb894 100644 --- a/indra/newview/skins/default/xui/de/floater_snapshot.xml +++ b/indra/newview/skins/default/xui/de/floater_snapshot.xml @@ -1,79 +1,23 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Snapshot" title="FOTO-ANZEIGE"> - <text name="type_label"> - Zweck des Fotos - </text> - <radio_group label="Fototyp" name="snapshot_type_radio"> - <radio_item label="Email-Adresse" name="postcard"/> - <radio_item label="Mein Inventar ([AMOUNT] L$)" name="texture"/> - <radio_item label="Auf meinem Computer speichern" name="local"/> - </radio_group> - <text name="file_size_label"> - [SIZE] KB - </text> - <button label="Foto aktualisieren" name="new_snapshot_btn"/> - <button label="Senden" name="send_btn"/> - <button label="Speichern ([AMOUNT] L$)" name="upload_btn"/> - <flyout_button label="Speichern" name="save_btn" tool_tip="Bild als Datei speichern"> - <flyout_button_item label="Speichern" name="save_item"/> - <flyout_button_item label="Speichern unter..." name="saveas_item"/> - </flyout_button> - <button label="Abbrechen" name="discard_btn"/> - <button label="Mehr" name="more_btn" tool_tip="Erweiterte Optionen"/> - <button label="Weniger" name="less_btn" tool_tip="Erweiterte Optionen"/> - <text name="type_label2"> - Größe - </text> - <text name="format_label"> - Format - </text> - <combo_box label="Auflösung" name="postcard_size_combo"> - <combo_box.item label="Aktuelles Fenster" name="CurrentWindow"/> - <combo_box.item label="640x480" name="640x480"/> - <combo_box.item label="800x600" name="800x600"/> - <combo_box.item label="1024x768" name="1024x768"/> - <combo_box.item label="Benutzerdefiniert" name="Custom"/> - </combo_box> - <combo_box label="Auflösung" name="texture_size_combo"> - <combo_box.item label="Aktuelles Fenster" name="CurrentWindow"/> - <combo_box.item label="Klein (128x128)" name="Small(128x128)"/> - <combo_box.item label="Mittel (256x256)" name="Medium(256x256)"/> - <combo_box.item label="Groß (512x512)" name="Large(512x512)"/> - <combo_box.item label="Benutzerdefiniert" name="Custom"/> - </combo_box> - <combo_box label="Auflösung" name="local_size_combo"> - <combo_box.item label="Aktuelles Fenster" name="CurrentWindow"/> - <combo_box.item label="320x240" name="320x240"/> - <combo_box.item label="640x480" name="640x480"/> - <combo_box.item label="800x600" name="800x600"/> - <combo_box.item label="1024x768" name="1024x768"/> - <combo_box.item label="1280x1024" name="1280x1024"/> - <combo_box.item label="1600x1200" name="1600x1200"/> - <combo_box.item label="Benutzerdefiniert" name="Custom"/> - </combo_box> - <combo_box label="Format" name="local_format_combo"> - <combo_box.item label="PNG" name="PNG"/> - <combo_box.item label="JPEG" name="JPEG"/> - <combo_box.item label="BMP" name="BMP"/> - </combo_box> - <spinner label="Breite" name="snapshot_width"/> - <spinner label="Höhe" name="snapshot_height"/> - <check_box label="Seitenverhältnis beibehalten" name="keep_aspect_check"/> - <slider label="Bildqualität" name="image_quality_slider"/> - <text name="layer_type_label" width="63"> - Aufnehmen: - </text> - <combo_box label="Bildlayer" left="73" name="layer_types" width="132"> - <combo_box.item label="Farben" name="Colors"/> - <combo_box.item label="Tiefe" name="Depth"/> - <combo_box.item label="Objektmasken" name="ObjectMattes"/> - </combo_box> - <check_box label="Schnittstelle" name="ui_check"/> - <check_box label="HUDs" name="hud_check"/> - <check_box label="Nach dem Speichern offen lassen" name="keep_open_check"/> - <check_box label="Frame einfrieren (Vollbild)" name="freeze_frame_check"/> - <check_box label="Automatisch aktualisieren" name="auto_snapshot_check"/> - <string name="unknown"> +<floater name="Snapshot" title="Foto"> + <floater.string name="unknown"> unbekannt - </string> + </floater.string> + <button label="Foto aktualisieren" name="new_snapshot_btn"/> + <line_editor label="Beschreibung" name="description"/> + <panel name="panel_snapshot_main"> + <button label="Foto freigeben" name="share"/> + <button label="Foto speichern" name="save"/> + <button label="Als Profilbild festlegen" name="set_profile_pic"/> + </panel> + <panel name="panel_snapshot_share"> + <button label="Ins Internet stellen" name="share_to_web"/> + <button label="Foto per E-Mail senden" name="share_to_email"/> + <button label="Zurück" name="cancel_share"/> + </panel> + <panel name="panel_snapshot_save"> + <button label="Objekt in meinem Inventar speichern" name="save_to_inventory"/> + <button label="Auf meinem Computer speichern" name="save_to_computer"/> + <button label="Zurück" name="cancel_save"/> + </panel> </floater> diff --git a/indra/newview/skins/default/xui/de/floater_stats.xml b/indra/newview/skins/default/xui/de/floater_stats.xml index dcea484e13..1eb2dd4288 100644 --- a/indra/newview/skins/default/xui/de/floater_stats.xml +++ b/indra/newview/skins/default/xui/de/floater_stats.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Statistics" title="STATISTIKEN"> - <scroll_container name="statistics_scroll"> - <container_view name="statistics_view"> +<floater name="Statistics" title="STATISTIKEN" width="280"> + <scroll_container name="statistics_scroll" width="280"> + <container_view name="statistics_view" width="280"> <stat_view label="Basic" name="basic"> <stat_bar label="FPS" name="fps"/> <stat_bar label="Bandbreite" name="bandwidth"/> diff --git a/indra/newview/skins/default/xui/de/floater_sys_well.xml b/indra/newview/skins/default/xui/de/floater_sys_well.xml index 982786b66e..ec79b862b4 100644 --- a/indra/newview/skins/default/xui/de/floater_sys_well.xml +++ b/indra/newview/skins/default/xui/de/floater_sys_well.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="notification_chiclet" title="MELDUNGEN"> +<floater name="sys_well_window" title="MELDUNGEN"> <string name="title_im_well_window"> - IM-SITZUNGEN + GESPRÄCHE </string> <string name="title_notification_well_window"> BENACHRICHTIGUNGEN diff --git a/indra/newview/skins/default/xui/de/floater_telehub.xml b/indra/newview/skins/default/xui/de/floater_telehub.xml index 923b4c0079..83d37b2ce4 100644 --- a/indra/newview/skins/default/xui/de/floater_telehub.xml +++ b/indra/newview/skins/default/xui/de/floater_telehub.xml @@ -6,22 +6,22 @@ <text name="status_text_not_connected"> Kein Telehub verbunden. </text> - <text name="help_text_connected"> + <text name="help_text_connected" width="300"> Klicken Sie zum Entfernen auf „Trennen“. </text> <text bottom_delta="-18" height="38" name="help_text_not_connected"> Wählen Sie ein Objekt und klicken Sie auf „Mit Telehub verbinden“. </text> - <button label="Mit Telehub verbinden" name="connect_btn" width="122"/> - <button label="Trennen" left="142" name="disconnect_btn" width="98"/> + <button label="Mit Telehub verbinden" name="connect_btn" width="134"/> + <button label="Trennen" left="152" name="disconnect_btn" width="88"/> <text name="spawn_points_text" width="230"> Spawn-Punkte (Positionen, nicht Objekte): </text> <button label="Spawn hinzufügen" name="add_spawn_point_btn"/> <button label="Spawn entfernen" name="remove_spawn_point_btn"/> <text name="spawn_point_help"> - Wählen Sie ein Objekt und klicken zur Positionsangabe auf Spawn hinzufügen. + Wählen Sie ein Objekt und klicken Sie zur Positionsangabe auf Spawn hinzufügen. Anschließend können Sie das Objekt verschieben oder löschen. Positionsangaben sind relativ zum Telehub-Mittelpunkt. Wählen Sie ein Objekt aus der Liste aus, um dieses inworld zu markieren. diff --git a/indra/newview/skins/default/xui/de/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/de/floater_texture_ctrl.xml index 4e2d8a9274..8944c79c7d 100644 --- a/indra/newview/skins/default/xui/de/floater_texture_ctrl.xml +++ b/indra/newview/skins/default/xui/de/floater_texture_ctrl.xml @@ -1,10 +1,10 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="texture picker" title="AUSWÄHLEN: TEXTUR"> +<floater name="texture picker" title="TEXTUR AUSWÄHLEN"> <string name="choose_picture"> Zum Auswählen eines Bildes hier klicken </string> <text name="Multiple"> - Mehrer Texturen + Mehrere Texturen </text> <text name="unknown"> Größe: [DIMENSIONS] diff --git a/indra/newview/skins/default/xui/de/floater_tools.xml b/indra/newview/skins/default/xui/de/floater_tools.xml index b2f8cbed45..c5c11faf93 100644 --- a/indra/newview/skins/default/xui/de/floater_tools.xml +++ b/indra/newview/skins/default/xui/de/floater_tools.xml @@ -7,7 +7,7 @@ Klicken und ziehen, um die ausgewählte Seite zu dehnen </floater.string> <floater.string name="status_move"> - Maus verschiebt, Umschalt-Taste und Maus kopiert + Maus verschiebt, Umschalt + Maus kopiert </floater.string> <floater.string name="status_modifyland"> Klicken und halten, um das Land zu bearbeiten @@ -64,13 +64,16 @@ <radio_item label="Fläche auswählen" name="radio select face"/> </radio_group> <check_box label="Verknüpfte Teile bearbeiten" name="checkbox edit linked parts"/> - <text name="RenderingCost" tool_tip="Zeigt die errechneten Wiedergabekosten für diesen Objekt"> + <text name="RenderingCost" tool_tip="Zeigt die errechneten Wiedergabekosten für dieses Objekt"> þ: [COUNT] </text> - <check_box label="Beide Seiten dehnen" name="checkbox uniform"/> + <check_box name="checkbox uniform"/> + <text name="checkbox uniform label"> + Beide Seiten dehnen + </text> <check_box initial_value="true" label="Texturen dehnen" name="checkbox stretch textures"/> - <check_box initial_value="true" label="An Raster ausrichten" name="checkbox snap to grid"/> - <combo_box name="combobox grid mode" tool_tip="Wählen Sie das Rasterlineal aus, um das Objekt zu positionieren."> + <check_box initial_value="true" label="An Raster ausrichten" name="checkbox snap to grid" top_pad="10"/> + <combo_box name="combobox grid mode" tool_tip="Wählen Sie ein Rasterlineal zum Positionieren des Objekts aus."> <combo_box.item label="Globales Raster" name="World"/> <combo_box.item label="Lokales Raster" name="Local"/> <combo_box.item label="Referenzraster" name="Reference"/> @@ -196,7 +199,7 @@ </combo_box> <check_box label="Zum Verkauf:" name="checkbox for sale"/> <combo_box name="sale type"> - <combo_box.item label="Kopieren" name="Copy"/> + <combo_box.item label="Kopie" name="Copy"/> <combo_box.item label="Inhalt" name="Contents"/> <combo_box.item label="Original" name="Original"/> </combo_box> @@ -238,10 +241,10 @@ </panel> </panel> <panel label="Objekt" name="Object"> - <check_box label="Gesperrt" name="checkbox locked" tool_tip="Verhindert, dass Objekt verschoben oder gelöscht wird. Oft beim Bauen nützlich, um unbeabsichtigte Bearbeitungen zu vermeiden."/> - <check_box label="Physisch" name="Physical Checkbox Ctrl" tool_tip="Gestattet, das Objekt geschoben und von Schwerkraft beeinflusst wird"/> + <check_box label="Gesperrt" name="checkbox locked" tool_tip="Verhindert, dass das Objekt verschoben oder gelöscht wird. Oft beim Bauen nützlich, um unbeabsichtigte Bearbeitungen zu vermeiden."/> + <check_box label="Physisch" name="Physical Checkbox Ctrl" tool_tip="Gestattet, dass das Objekt geschoben und von Schwerkraft beeinflusst wird"/> <check_box label="Temporär" name="Temporary Checkbox Ctrl" tool_tip="Bewirkt, dass das Objekt 1 Minute nach seiner Erstellung gelöscht wird."/> - <check_box label="Phantom" name="Phantom Checkbox Ctrl" tool_tip="Verursacht, dass Objekt nicht mit anderen Objekten oder Avataren kollidiert"/> + <check_box label="Phantom" name="Phantom Checkbox Ctrl" tool_tip="Verhindert, dass das Objekt mit anderen Objekten oder Avataren kollidiert"/> <text name="label position"> Position (Meter) </text> @@ -363,15 +366,15 @@ <text name="edit_object"> Objekteigenschaften bearbeiten: </text> - <check_box label="Flexibler Weg" name="Flexible1D Checkbox Ctrl" tool_tip="Bewirkt, dass sich das Objekt um die Z-Achse biegen kann. (Nur Client-Seite)"/> + <check_box label="Flexibler Pfad" name="Flexible1D Checkbox Ctrl" tool_tip="Bewirkt, dass sich das Objekt um die Z-Achse biegen kann. (Nur Client-Seite)"/> <spinner label="Weichheit" name="FlexNumSections"/> <spinner label="Schwerkraft" name="FlexGravity"/> <spinner label="Ziehen" name="FlexFriction"/> <spinner label="Wind" name="FlexWind"/> <spinner label="Spannung" name="FlexTension"/> - <spinner label="Erzwingen X" name="FlexForceX"/> - <spinner label="Erzwingen Y" name="FlexForceY"/> - <spinner label="Erzwingen Z" name="FlexForceZ"/> + <spinner label="Kraft X" name="FlexForceX"/> + <spinner label="Kraft Y" name="FlexForceY"/> + <spinner label="Kraft Z" name="FlexForceZ"/> <check_box label="Licht" name="Light Checkbox Ctrl" tool_tip="Verursacht, dass Objekt Licht emittiert"/> <color_swatch label="" name="colorswatch" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/> <texture_picker label="" name="light texture control" tool_tip="Klicken, um eine Bild auszuwählen (dieser Effekt funktioniert nur, wenn zeitversetzte Wiedergabe aktiviert ist)"/> @@ -477,7 +480,7 @@ <text name="label_area"> Gebiet: [AREA] m². </text> - <button label="Über Land" label_selected="Über Land" name="button about land"/> + <button label="Land-Info" label_selected="Land-Info" name="button about land"/> <check_box label="Eigentümer anzeigen" name="checkbox show owners" tool_tip="Die Parzellen farblich nach Eigentümtertyp anzeigen Grün = Ihr Land Blau = Das Land Ihrer Gruppe Rot = Im Eigentum anderer Geld = Zum Verkauf Lila = Zur Auktion Grau = Öffentlich"/> <text name="label_parcel_modify"> Parzelle ändern diff --git a/indra/newview/skins/default/xui/de/floater_tos.xml b/indra/newview/skins/default/xui/de/floater_tos.xml index e11b453b41..1f3ef2f0b4 100644 --- a/indra/newview/skins/default/xui/de/floater_tos.xml +++ b/indra/newview/skins/default/xui/de/floater_tos.xml @@ -1,22 +1,15 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="modal container" title=" "> + <floater.string name="real_url"> + http://secondlife.com/app/tos/ + </floater.string> + <floater.string name="loading_url"> + data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Loading %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E + </floater.string> <button label="Weiter" label_selected="Weiter" name="Continue"/> <button label="Abbrechen" label_selected="Abbrechen" name="Cancel"/> - <radio_group name="tos_agreement"> - <radio_item label="Ich stimme den Nutzungsbedingungen nicht zu" name="radio_disagree"/> - <radio_item label="Ich stimme den Nutzungsbedingungen zu" name="radio_agree"/> - </radio_group> - <text name="tos_title"> - Nutzungsvereinbarung - </text> - <check_box label="Ich stimme den Nutzungsbedingungen zu" name="agree_chk"/> + <check_box label="Ich stimme den Servicebedingungen und Datenschutzbestimmungen zu." name="agree_chk"/> <text name="tos_heading"> - Lesen Sie die folgenden Servicebedingungen sorgfältig durch. Sie müssen den Servicebedinungen zustimmen, um [SECOND_LIFE] weiterhin verwenden zu können. - </text> - <text_editor name="tos_text"> - TOS_TEXT - </text_editor> - <text name="real_url"> - http://secondlife.com/app/tos/ + Lesen Sie die folgenden Servicebedingungen und Datenbestimmungen sorgfältig durch. Sie müssen den Servicebedingungen zustimmen, um sich bei [SECOND_LIFE] anmelden zu können. </text> </floater> diff --git a/indra/newview/skins/default/xui/de/floater_url_entry.xml b/indra/newview/skins/default/xui/de/floater_url_entry.xml index 392d53a33d..f5fa449c85 100644 --- a/indra/newview/skins/default/xui/de/floater_url_entry.xml +++ b/indra/newview/skins/default/xui/de/floater_url_entry.xml @@ -3,10 +3,10 @@ <text name="media_label"> Medien-URL: </text> - <button label="OK" name="ok_btn" /> - <button label="Abbrechen" name="cancel_btn" width="75" /> - <button label="Löschen" name="clear_btn" /> - <text name="loading_label"> + <button label="OK" name="ok_btn" width="30"/> + <button label="Abbrechen" name="cancel_btn" width="66" /> + <button label="Löschen" name="clear_btn" left_pad="100"/> + <text name="loading_label" left="120"> Wird geladen... </text> </floater> diff --git a/indra/newview/skins/default/xui/de/floater_voice_controls.xml b/indra/newview/skins/default/xui/de/floater_voice_controls.xml index f978042cc2..07b7689cd0 100644 --- a/indra/newview/skins/default/xui/de/floater_voice_controls.xml +++ b/indra/newview/skins/default/xui/de/floater_voice_controls.xml @@ -16,8 +16,13 @@ Es ist niemand in der Nähe, der Voice aktiviert hat. </string> <layout_stack name="my_call_stack"> - <layout_panel name="leave_call_btn_panel"> - <button label="Anruf beenden" name="leave_call_btn"/> + <layout_panel name="my_panel"> + <text name="user_text" value="Mein Avatar:"/> </layout_panel> + <layout_stack name="voice_effect_and_leave_call_stack"> + <layout_panel name="leave_call_btn_panel"> + <button label="Anruf beenden" name="leave_call_btn"/> + </layout_panel> + </layout_stack> </layout_stack> </floater> diff --git a/indra/newview/skins/default/xui/de/floater_voice_effect.xml b/indra/newview/skins/default/xui/de/floater_voice_effect.xml new file mode 100644 index 0000000000..8de0133ead --- /dev/null +++ b/indra/newview/skins/default/xui/de/floater_voice_effect.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater label="Orte" name="voice_effects" title="VOICE-MORPHING AUSPROBIEREN"> + <string name="no_voice_effect"> + (Kein Voice-Morphing) + </string> + <string name="active_voice_effect"> + (Aktiv) + </string> + <string name="unsubscribed_voice_effect"> + (nicht abonniert) + </string> + <string name="new_voice_effect"> + (Neu!) + </string> + <text name="status_text"> + Um die Voice-Morph-Effekte auszuprobieren, einfach auf die Schaltfläche „Aufnahme“ klicken und kurz ins Mikrofon sprechen. Klicken Sie dann auf einen beliebigen Effekt in der Liste, um zu hören, wie der Effekt Ihre Stimme verändert. + +Schließen Sie dieses Fenster, um wieder mit dem Voice-Chat in der Nähe verbunden zu werden. + </text> + <button label="Aufnahme" name="record_btn" tool_tip="Nehmen Sie Ihre Stimme auf."/> + <button label="Stopp" name="record_stop_btn"/> + <text name="voice_morphing_link"> + [[URL]Voice-Morphing abonnieren] + </text> + <scroll_list name="voice_effect_list" tool_tip="Nehmen Sie Ihre Stimme auf und klicken Sie dann auf einen Effekt, um diesen auszuprobieren."> + <scroll_list.columns label="Voice-Morphing" name="name"/> + <scroll_list.columns label="Gültig bis" name="expires"/> + </scroll_list> +</floater> diff --git a/indra/newview/skins/default/xui/de/floater_water.xml b/indra/newview/skins/default/xui/de/floater_water.xml index ed18dfdfff..097a60a444 100644 --- a/indra/newview/skins/default/xui/de/floater_water.xml +++ b/indra/newview/skins/default/xui/de/floater_water.xml @@ -3,14 +3,14 @@ <floater.string name="WLDefaultWaterNames"> Default:Glassy:Pond:Murky:Second Plague:SNAKE!!!:Valdez </floater.string> - <text name="KeyFramePresetsText"> + <text name="KeyFramePresetsText" width="116"> Voreinstellungen: </text> <button label="Neu" label_selected="Neu" name="WaterNewPreset"/> <button label="Speichern" label_selected="Speichern" name="WaterSavePreset"/> <button label="Löschen" label_selected="Löschen" name="WaterDeletePreset"/> <tab_container name="Water Tabs"> - <panel label="Einstellungen" name="Settings"> + <panel label="EINSTELLUNGEN" name="Settings"> <text name="BHText"> Wassertrübungsfarbe </text> @@ -44,7 +44,7 @@ Mischungsmultiplikator </text> </panel> - <panel label="Bild" name="Waves"> + <panel label="BILD" name="Waves"> <text name="BHText"> Richtung große Welle </text> diff --git a/indra/newview/skins/default/xui/de/floater_wearable_save_as.xml b/indra/newview/skins/default/xui/de/floater_wearable_save_as.xml index dad1b62975..f9b3552e8b 100644 --- a/indra/newview/skins/default/xui/de/floater_wearable_save_as.xml +++ b/indra/newview/skins/default/xui/de/floater_wearable_save_as.xml @@ -1,9 +1,9 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="modal container" title=" "> - <button label="Speichern" label_selected="Speichern" name="Save" /> - <button label="Abbrechen" label_selected="Abbrechen" name="Cancel" /> + <button label="Speichern" label_selected="Speichern" name="Save"/> + <button label="Abbrechen" label_selected="Abbrechen" name="Cancel"/> <text name="Save item as:"> - Objekt speichern als: + Objekt in meinem Inventar speichern als: </text> <line_editor name="name ed"> Neu [DESC] diff --git a/indra/newview/skins/default/xui/de/floater_whitelist_entry.xml b/indra/newview/skins/default/xui/de/floater_whitelist_entry.xml index 35a5ec35f7..1332509529 100644 --- a/indra/newview/skins/default/xui/de/floater_whitelist_entry.xml +++ b/indra/newview/skins/default/xui/de/floater_whitelist_entry.xml @@ -5,5 +5,5 @@ </text> <line_editor name="whitelist_entry" tool_tip="Eine URL oder URL-Patten in die Whitelist eingeben"/> <button label="OK" name="ok_btn"/> - <button label="Abbrechen" name="cancel_btn"/> + <button label="Abbrechen" name="cancel_btn" width="80"/> </floater> diff --git a/indra/newview/skins/default/xui/de/floater_windlight_options.xml b/indra/newview/skins/default/xui/de/floater_windlight_options.xml index 3e06d8f06b..5b59336f9d 100644 --- a/indra/newview/skins/default/xui/de/floater_windlight_options.xml +++ b/indra/newview/skins/default/xui/de/floater_windlight_options.xml @@ -8,7 +8,7 @@ <button label="Löschen" label_selected="Löschen" name="WLDeletePreset"/> <button label="Tageszyklus-Editor" label_selected="Tageszyklus-Editor" name="WLDayCycleMenuButton"/> <tab_container name="WindLight Tabs"> - <panel label="Atmosphäre" name="Atmosphere"> + <panel label="ATMOSPHÄRE" name="Atmosphere"> <text name="BHText"> Horizontfarbe </text> @@ -62,7 +62,7 @@ </text> <button label=" ?" name="WLMaxAltitudeHelp"/> </panel> - <panel label="Licht" name="Lighting"> + <panel label="LICHT" name="Lighting"> <text name="SLCText"> Sonne/Mond-Farbe </text> @@ -118,7 +118,7 @@ </text> <button label=" ?" name="WLStarBrightnessHelp"/> </panel> - <panel label="Wolken" name="Clouds"> + <panel label="WOLKEN" name="Clouds"> <text name="WLCloudColorText"> Wolkenfarbe </text> diff --git a/indra/newview/skins/default/xui/de/floater_world_map.xml b/indra/newview/skins/default/xui/de/floater_world_map.xml index accc023b8f..fb3a4ba9b5 100644 --- a/indra/newview/skins/default/xui/de/floater_world_map.xml +++ b/indra/newview/skins/default/xui/de/floater_world_map.xml @@ -5,7 +5,7 @@ Legende </text> </panel> - <panel> + <panel name="layout_panel_2"> <button label="Meine Position" label_selected="Wo bin ich?" name="Show My Location" tool_tip="Karte auf Position meines Avatars zentrieren"/> <text name="me_label"> Ich @@ -30,16 +30,16 @@ </text> <button label="Nach Hause" label_selected="Nach Hause" name="Go Home" tool_tip="Nach Hause teleportieren"/> <text name="Home_label"> - Startseite + Zuhause </text> <text name="events_label"> Events: </text> <check_box label="PG" name="event_chk"/> <text name="pg_label"> - Allgemein + Generell </text> - <check_box initial_value="true" label="Mature" name="event_mature_chk"/> + <check_box label="Mature" name="event_mature_chk"/> <text name="mature_label"> Moderat </text> @@ -48,12 +48,12 @@ Adult </text> </panel> - <panel> + <panel name="layout_panel_3"> <text name="find_on_map_label"> Auf Karte anzeigen </text> </panel> - <panel> + <panel name="layout_panel_4"> <combo_box label="Online-Freunde" name="friend combo" tool_tip="Freunde auf Karte anzeigen"> <combo_box.item label="Meine Freunde: Online" name="item1"/> </combo_box> @@ -62,6 +62,7 @@ </combo_box> <search_editor label="Regionen nach Name" name="location" tool_tip="Geben Sie den Namen einer Region ein"/> <button label="Suchen" name="DoSearch" tool_tip="Nach einer Region suchen"/> + <button name="Clear" tool_tip="Karte zurücksetzen"/> <scroll_list name="search_results"> <scroll_list.columns label="" name="icon"/> <scroll_list.columns label="" name="sim_name"/> @@ -70,12 +71,12 @@ <button font="SansSerifSmall" label="SLurl kopieren" name="copy_slurl" tool_tip="Kopiert die aktuelle Position als SLurl zur Verwendung im Web."/> <button label="Auswahl anzeigen" label_selected="Ziel anzeigen" name="Show Destination" tool_tip="Karte auf ausgewählte Position zentrieren"/> </panel> - <panel> + <panel name="layout_panel_5"> <text name="zoom_label"> Zoom </text> </panel> - <panel> + <panel name="layout_panel_6"> <slider label="Zoom" name="zoom slider"/> </panel> </floater> diff --git a/indra/newview/skins/default/xui/de/inspect_avatar.xml b/indra/newview/skins/default/xui/de/inspect_avatar.xml index 489e257867..a0bd24a69f 100644 --- a/indra/newview/skins/default/xui/de/inspect_avatar.xml +++ b/indra/newview/skins/default/xui/de/inspect_avatar.xml @@ -16,9 +16,9 @@ Dies ist meine Beschreibung und ich finde sie wirklich gut! </text> <slider name="volume_slider" tool_tip="Lautstärke" value="0.5"/> - <button label="Freund hinzufügen" name="add_friend_btn"/> + <button label="Freund hinzufügen" name="add_friend_btn" width="110"/> <button label="IM" name="im_btn"/> - <button label="Mehr" name="view_profile_btn"/> + <button label="Profil" left_delta="120" name="view_profile_btn" width="44"/> <panel name="moderator_panel"> <button label="Voice deaktivieren" name="disable_voice"/> <button label="Voice aktivieren" name="enable_voice"/> diff --git a/indra/newview/skins/default/xui/de/inspect_group.xml b/indra/newview/skins/default/xui/de/inspect_group.xml index 81d946be9d..badb47bf08 100644 --- a/indra/newview/skins/default/xui/de/inspect_group.xml +++ b/indra/newview/skins/default/xui/de/inspect_group.xml @@ -24,7 +24,7 @@ </text> <text name="group_details"> Eine Gruppe für Leute, die sich gerne mit Elchen unterhält. -Hoch solln sie leben! Elche forever! Und auch Mungos! +Hoch solln sie leben! Elche forever! Und auch Mungos! </text> <text name="group_cost"> Mitgliedschaft: 123 L$ diff --git a/indra/newview/skins/default/xui/de/inspect_object.xml b/indra/newview/skins/default/xui/de/inspect_object.xml index 61f2cc8dc9..72b8235828 100644 --- a/indra/newview/skins/default/xui/de/inspect_object.xml +++ b/indra/newview/skins/default/xui/de/inspect_object.xml @@ -8,7 +8,7 @@ Von [CREATOR] </string> <string name="CreatorAndOwner"> - von [CREATOR] + Von [CREATOR] Besitzer [OWNER] </string> <string name="Price"> @@ -23,23 +23,23 @@ Besitzer [OWNER] <string name="Sit"> Sitzen </string> - <text name="object_name" value="Wirklich langen Objektnamen als Test eingeben"/> + <text name="object_name" value="Test für ein Objektname der sehr lange ist und über zwei Zeilen geht."/> <text name="object_creator"> von secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about Besitzer secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about </text> <text name="price_text"> - 300.000 L$ + 30.000 L$ </text> <text name="object_description"> - Dies ist eine wirklich lange Beschreibung für ein Objekt, mindestens 80 Zeichen lang oder jetzt schon 120 Zeichen. Niemand weiß es genau. + Dies ist eine wirklich lange Beschreibung für ein Objekt, mindestens 80 Zeichen lang oder jetzt schon mindestens 120 Zeichen lang und länger als der englische Originaltext. Niemand weiß es genau. </text> <text name="object_media_url"> http://www.superdupertest.com </text> <button label="Kaufen" name="buy_btn"/> - <button label="Zahlen" name="pay_btn"/> - <button label="Kopie nehmen" name="take_free_copy_btn"/> + <button label="Bezahlen" name="pay_btn"/> + <button label="Kopie nehmen" name="take_free_copy_btn" width="100"/> <button label="Berühren" name="touch_btn"/> <button label="Sitzen" name="sit_btn"/> <button label="Öffnen" name="open_btn"/> diff --git a/indra/newview/skins/default/xui/de/language_settings.xml b/indra/newview/skins/default/xui/de/language_settings.xml index 71418d446a..3e357007ff 100644 --- a/indra/newview/skins/default/xui/de/language_settings.xml +++ b/indra/newview/skins/default/xui/de/language_settings.xml @@ -3,9 +3,9 @@ <strings> <!-- Locale Information --> - <string name="MicrosoftLocale">english</string> - <string name="DarwinLocale">C</string> - <string name="LinuxLocale">C</string> + <string name="MicrosoftLocale">german</string> + <string name="DarwinLocale">de_DE.UTF-8</string> + <string name="LinuxLocale">de_DE.UTF-8</string> <!-- datetimeToCodes["wkday"] = "%a"; // Thu diff --git a/indra/newview/skins/default/xui/de/menu_attachment_other.xml b/indra/newview/skins/default/xui/de/menu_attachment_other.xml index 33cff066a2..237c92f7d2 100644 --- a/indra/newview/skins/default/xui/de/menu_attachment_other.xml +++ b/indra/newview/skins/default/xui/de/menu_attachment_other.xml @@ -10,8 +10,8 @@ <menu_item_call label="Melden" name="abuse"/> <menu_item_call label="Einfrieren" name="Freeze..."/> <menu_item_call label="Hinauswerfen" name="Eject..."/> - <menu_item_call label="Debug" name="Debug..."/> + <menu_item_call label="Fehler in Texturen beseitigen" name="Debug..."/> <menu_item_call label="Hineinzoomen" name="Zoom In"/> - <menu_item_call label="Zahlen" name="Pay..."/> + <menu_item_call label="Bezahlen" name="Pay..."/> <menu_item_call label="Objektprofil" name="Object Inspect"/> </context_menu> diff --git a/indra/newview/skins/default/xui/de/menu_attachment_self.xml b/indra/newview/skins/default/xui/de/menu_attachment_self.xml index bc33b9b93d..3af69d2f31 100644 --- a/indra/newview/skins/default/xui/de/menu_attachment_self.xml +++ b/indra/newview/skins/default/xui/de/menu_attachment_self.xml @@ -9,4 +9,5 @@ <menu_item_call label="Meine Freunde" name="Friends..."/> <menu_item_call label="Meine Gruppen" name="Groups..."/> <menu_item_call label="Mein Profil" name="Profile..."/> + <menu_item_call label="Fehler in Texturen beseitigen" name="Debug..."/> </context_menu> diff --git a/indra/newview/skins/default/xui/de/menu_avatar_other.xml b/indra/newview/skins/default/xui/de/menu_avatar_other.xml index 85db648119..8aee0be3d2 100644 --- a/indra/newview/skins/default/xui/de/menu_avatar_other.xml +++ b/indra/newview/skins/default/xui/de/menu_avatar_other.xml @@ -10,7 +10,7 @@ <menu_item_call label="Melden" name="abuse"/> <menu_item_call label="Einfrieren" name="Freeze..."/> <menu_item_call label="Hinauswerfen" name="Eject..."/> - <menu_item_call label="Debug" name="Debug..."/> + <menu_item_call label="Fehler in Texturen beseitigen" name="Debug..."/> <menu_item_call label="Hineinzoomen" name="Zoom In"/> - <menu_item_call label="Zahlen" name="Pay..."/> + <menu_item_call label="Bezahlen" name="Pay..."/> </context_menu> diff --git a/indra/newview/skins/default/xui/de/menu_avatar_self.xml b/indra/newview/skins/default/xui/de/menu_avatar_self.xml index 5f9856a9cb..d310d10ea5 100644 --- a/indra/newview/skins/default/xui/de/menu_avatar_self.xml +++ b/indra/newview/skins/default/xui/de/menu_avatar_self.xml @@ -1,8 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Self Pie"> <menu_item_call label="Aufstehen" name="Stand Up"/> - <context_menu label="Ausziehen >" name="Take Off >"> - <context_menu label="Kleidung >" name="Clothes >"> + <context_menu label="Ausziehen â–¶" name="Take Off >"> + <context_menu label="Kleidung â–¶" name="Clothes >"> <menu_item_call label="Hemd" name="Shirt"/> <menu_item_call label="Hose" name="Pants"/> <menu_item_call label="Rock" name="Skirt"/> @@ -16,12 +16,13 @@ <menu_item_call label="Alpha" name="Self Alpha"/> <menu_item_call label="Alle Kleider" name="All Clothes"/> </context_menu> - <context_menu label="HUD >" name="Object Detach HUD"/> - <context_menu label="Abnehmen >" name="Object Detach"/> + <context_menu label="HUD â–¶" name="Object Detach HUD"/> + <context_menu label="Abnehmen â–¶" name="Object Detach"/> <menu_item_call label="Alles abnehmen" name="Detach All"/> </context_menu> <menu_item_call label="Mein Aussehen" name="Appearance..."/> <menu_item_call label="Meine Freunde" name="Friends..."/> <menu_item_call label="Meine Gruppen" name="Groups..."/> <menu_item_call label="Mein Profil" name="Profile..."/> + <menu_item_call label="Fehler in Texturen beseitigen" name="Debug..."/> </context_menu> diff --git a/indra/newview/skins/default/xui/de/menu_cof_attachment.xml b/indra/newview/skins/default/xui/de/menu_cof_attachment.xml new file mode 100644 index 0000000000..05d3dfca9d --- /dev/null +++ b/indra/newview/skins/default/xui/de/menu_cof_attachment.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="COF Attachment"> + <menu_item_call label="Abnehmen" name="detach"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/de/menu_cof_body_part.xml b/indra/newview/skins/default/xui/de/menu_cof_body_part.xml new file mode 100644 index 0000000000..07960a525c --- /dev/null +++ b/indra/newview/skins/default/xui/de/menu_cof_body_part.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="COF Body"> + <menu_item_call label="Ersetzen" name="replace"/> + <menu_item_call label="Bearbeiten" name="edit"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/de/menu_cof_clothing.xml b/indra/newview/skins/default/xui/de/menu_cof_clothing.xml new file mode 100644 index 0000000000..5cf31791ba --- /dev/null +++ b/indra/newview/skins/default/xui/de/menu_cof_clothing.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="COF Clothing"> + <menu_item_call label="Ausziehen" name="take_off"/> + <menu_item_call label="Eine Kategorie nach oben" name="move_up"/> + <menu_item_call label="Eine Kategorie nach unten" name="move_down"/> + <menu_item_call label="Bearbeiten" name="edit"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/de/menu_cof_gear.xml b/indra/newview/skins/default/xui/de/menu_cof_gear.xml new file mode 100644 index 0000000000..54b218d22f --- /dev/null +++ b/indra/newview/skins/default/xui/de/menu_cof_gear.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Gear COF"> + <menu label="Neue Kleider" name="COF.Gear.New_Clothes"/> + <menu label="Neue Körperteile" name="COF.Geear.New_Body_Parts"/> +</menu> diff --git a/indra/newview/skins/default/xui/de/menu_edit.xml b/indra/newview/skins/default/xui/de/menu_edit.xml new file mode 100644 index 0000000000..37f68d68d5 --- /dev/null +++ b/indra/newview/skins/default/xui/de/menu_edit.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu label="Bearbeiten" name="Edit"> + <menu_item_call label="Rückgängig" name="Undo"/> + <menu_item_call label="Wiederherstellen" name="Redo"/> + <menu_item_call label="Ausschneiden" name="Cut"/> + <menu_item_call label="Kopieren" name="Copy"/> + <menu_item_call label="Einfügen" name="Paste"/> + <menu_item_call label="Löschen" name="Delete"/> + <menu_item_call label="Duplizieren" name="Duplicate"/> + <menu_item_call label="Alle auswählen" name="Select All"/> + <menu_item_call label="Auswahl aufheben" name="Deselect"/> +</menu> diff --git a/indra/newview/skins/default/xui/de/menu_hide_navbar.xml b/indra/newview/skins/default/xui/de/menu_hide_navbar.xml index 32a6823b35..9acf96dc6d 100644 --- a/indra/newview/skins/default/xui/de/menu_hide_navbar.xml +++ b/indra/newview/skins/default/xui/de/menu_hide_navbar.xml @@ -2,4 +2,5 @@ <menu name="hide_navbar_menu"> <menu_item_check label="Navigationsleiste anzeigen" name="ShowNavbarNavigationPanel"/> <menu_item_check label="Favoritenleiste anzeigen" name="ShowNavbarFavoritesPanel"/> + <menu_item_check label="Mini-Standortleiste anzeigen" name="ShowMiniLocationPanel"/> </menu> diff --git a/indra/newview/skins/default/xui/de/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/de/menu_inspect_avatar_gear.xml index 9b6a6b2c4a..edad34a1d5 100644 --- a/indra/newview/skins/default/xui/de/menu_inspect_avatar_gear.xml +++ b/indra/newview/skins/default/xui/de/menu_inspect_avatar_gear.xml @@ -11,8 +11,9 @@ <menu_item_call label="Melden" name="report"/> <menu_item_call label="Einfrieren" name="freeze"/> <menu_item_call label="Hinauswerfen" name="eject"/> - <menu_item_call label="Debug" name="debug"/> + <menu_item_call label="Fehler in Texturen beseitigen" name="debug"/> <menu_item_call label="Auf Karte anzeigen" name="find_on_map"/> <menu_item_call label="Hineinzoomen" name="zoom_in"/> - <menu_item_call label="Zahlen" name="pay"/> + <menu_item_call label="Bezahlen" name="pay"/> + <menu_item_call label="Teilen" name="share"/> </menu> diff --git a/indra/newview/skins/default/xui/de/menu_inspect_object_gear.xml b/indra/newview/skins/default/xui/de/menu_inspect_object_gear.xml index 5efee8617b..634ef0b198 100644 --- a/indra/newview/skins/default/xui/de/menu_inspect_object_gear.xml +++ b/indra/newview/skins/default/xui/de/menu_inspect_object_gear.xml @@ -2,7 +2,7 @@ <menu name="Gear Menu"> <menu_item_call label="Berühren" name="touch"/> <menu_item_call label="Sitzen" name="sit"/> - <menu_item_call label="Zahlen" name="pay"/> + <menu_item_call label="Bezahlen" name="pay"/> <menu_item_call label="Kaufen" name="buy"/> <menu_item_call label="Nehmen" name="take"/> <menu_item_call label="Kopie nehmen" name="take_copy"/> diff --git a/indra/newview/skins/default/xui/de/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/de/menu_inspect_self_gear.xml index 383ee7831e..a74c41bb0c 100644 --- a/indra/newview/skins/default/xui/de/menu_inspect_self_gear.xml +++ b/indra/newview/skins/default/xui/de/menu_inspect_self_gear.xml @@ -5,4 +5,5 @@ <menu_item_call label="Mein Profil" name="my_profile"/> <menu_item_call label="Meine Freunde" name="my_friends"/> <menu_item_call label="Meine Gruppen" name="my_groups"/> + <menu_item_call label="Fehler in Texturen beseitigen" name="Debug..."/> </menu> diff --git a/indra/newview/skins/default/xui/de/menu_inv_offer_chiclet.xml b/indra/newview/skins/default/xui/de/menu_inv_offer_chiclet.xml new file mode 100644 index 0000000000..71cff7136b --- /dev/null +++ b/indra/newview/skins/default/xui/de/menu_inv_offer_chiclet.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="InvOfferChiclet Menu"> + <menu_item_call label="Schließen" name="Close"/> +</menu> diff --git a/indra/newview/skins/default/xui/de/menu_inventory.xml b/indra/newview/skins/default/xui/de/menu_inventory.xml index 77c012d045..f6139a0ea0 100644 --- a/indra/newview/skins/default/xui/de/menu_inventory.xml +++ b/indra/newview/skins/default/xui/de/menu_inventory.xml @@ -1,8 +1,9 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="Popup"> + <menu_item_call label="Teilen" name="Share"/> <menu_item_call label="Kaufen" name="Task Buy"/> <menu_item_call label="Öffnen" name="Task Open"/> - <menu_item_call label="Wiedergeben/Abspielen" name="Task Play"/> + <menu_item_call label="Abspielen" name="Task Play"/> <menu_item_call label="Eigenschaften" name="Task Properties"/> <menu_item_call label="Umbenennen" name="Task Rename"/> <menu_item_call label="Löschen" name="Task Remove"/> @@ -49,9 +50,9 @@ <menu_item_call label="Aktuelles Outfit ersetzen" name="Replace Outfit"/> <menu_item_call label="Zum aktuellen Outfit hinzufügen" name="Add To Outfit"/> <menu_item_call label="Vom aktuellen Outfit entfernen" name="Remove From Outfit"/> + <menu_item_call label="Original suchen" name="Find Original"/> <menu_item_call label="Objekt löschen" name="Purge Item"/> <menu_item_call label="Objekt wiederherstellen" name="Restore Item"/> - <menu_item_call label="Original suchen" name="Find Original"/> <menu_item_call label="Öffnen" name="Open"/> <menu_item_call label="Eigenschaften" name="Properties"/> <menu_item_call label="Umbenennen" name="Rename"/> @@ -65,8 +66,8 @@ <menu_item_call label="Konferenz-Chat starten" name="Conference Chat Folder"/> <menu_item_call label="Wiedergeben/Abspielen" name="Sound Play"/> <menu_item_call label="Landmarken-Info" name="About Landmark"/> - <menu_item_call label="In Welt abspielen" name="Animation Play"/> - <menu_item_call label="Lokal wiedergeben" name="Animation Audition"/> + <menu_item_call label="Inworld abspielen" name="Animation Play"/> + <menu_item_call label="Lokal abspielen" name="Animation Audition"/> <menu_item_call label="Instant Message senden" name="Send Instant Message"/> <menu_item_call label="Teleport anbieten..." name="Offer Teleport..."/> <menu_item_call label="Konferenz-Chat starten" name="Conference Chat"/> @@ -79,6 +80,7 @@ <menu label="An HUD hängen" name="Attach To HUD"/> <menu_item_call label="Bearbeiten" name="Wearable Edit"/> <menu_item_call label="Anziehen" name="Wearable Wear"/> + <menu_item_call label="Hinzufügen" name="Wearable Add"/> <menu_item_call label="Ausziehen" name="Take Off"/> <menu_item_call label="--keine Optionen--" name="--no options--"/> </menu> diff --git a/indra/newview/skins/default/xui/de/menu_inventory_add.xml b/indra/newview/skins/default/xui/de/menu_inventory_add.xml index 448b1d80bf..531edc02f1 100644 --- a/indra/newview/skins/default/xui/de/menu_inventory_add.xml +++ b/indra/newview/skins/default/xui/de/menu_inventory_add.xml @@ -20,7 +20,7 @@ <menu_item_call label="Neue Handschuhe" name="New Gloves"/> <menu_item_call label="Neues Unterhemd" name="New Undershirt"/> <menu_item_call label="Neue Unterhose" name="New Underpants"/> - <menu_item_call label="Alpha: Neu" name="New Alpha"/> + <menu_item_call label="Neues Alpha" name="New Alpha"/> <menu_item_call label="Neue Tätowierung" name="New Tattoo"/> </menu> <menu label="Neue Körperteile" name="New Body Parts"> diff --git a/indra/newview/skins/default/xui/de/menu_land.xml b/indra/newview/skins/default/xui/de/menu_land.xml index 9b1e6727b7..de679da3d8 100644 --- a/indra/newview/skins/default/xui/de/menu_land.xml +++ b/indra/newview/skins/default/xui/de/menu_land.xml @@ -5,5 +5,5 @@ <menu_item_call label="Dieses Land kaufen" name="Land Buy"/> <menu_item_call label="Pass kaufen" name="Land Buy Pass"/> <menu_item_call label="Bauen" name="Create"/> - <menu_item_call label="Terrain bearbeiten" name="Edit Terrain"/> + <menu_item_call label="Land bearbeiten" name="Edit Terrain"/> </context_menu> diff --git a/indra/newview/skins/default/xui/de/menu_login.xml b/indra/newview/skins/default/xui/de/menu_login.xml index fffa056cac..70d31f93de 100644 --- a/indra/newview/skins/default/xui/de/menu_login.xml +++ b/indra/newview/skins/default/xui/de/menu_login.xml @@ -8,18 +8,8 @@ <menu_item_call label="[SECOND_LIFE]-Hilfe" name="Second Life Help"/> <menu_item_call label="INFO ÜBER [APP_NAME]" name="About Second Life"/> </menu> + <menu_item_check label="Debug-Menü anzeigen" name="Show Debug Menu"/> <menu label="Debug" name="Debug"> - <menu label="Bearbeiten" name="Edit"> - <menu_item_call label="Rückgängig" name="Undo"/> - <menu_item_call label="Wiederherstellen" name="Redo"/> - <menu_item_call label="Ausschneiden" name="Cut"/> - <menu_item_call label="Kopieren" name="Copy"/> - <menu_item_call label="Einfügen" name="Paste"/> - <menu_item_call label="Löschen" name="Delete"/> - <menu_item_call label="Duplizieren" name="Duplicate"/> - <menu_item_call label="Alle auswählen" name="Select All"/> - <menu_item_call label="Auswahl aufheben" name="Deselect"/> - </menu> <menu_item_call label="Debug-Einstellungen anzeigen" name="Debug Settings"/> <menu_item_call label="UI/Farb-Einstellungen" name="UI/Color Settings"/> <menu_item_call label="XUI-Editor" name="UI Preview Tool"/> @@ -28,5 +18,7 @@ <menu_item_call label="Servicebedingungen anzeigen" name="TOS"/> <menu_item_call label="Wichtige Meldung anzeigen" name="Critical"/> <menu_item_call label="Web-Browser-Test" name="Web Browser Test"/> + <menu_item_check label="Grid-Auswahl anzeigen" name="Show Grid Picker"/> + <menu_item_call label="Benachrichtigungs-Konsole anzeigen" name="Show Notifications Console"/> </menu> </menu_bar> diff --git a/indra/newview/skins/default/xui/de/menu_mini_map.xml b/indra/newview/skins/default/xui/de/menu_mini_map.xml index a3ebfb3b10..7139b98965 100644 --- a/indra/newview/skins/default/xui/de/menu_mini_map.xml +++ b/indra/newview/skins/default/xui/de/menu_mini_map.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="popup"> +<menu name="Popup"> <menu_item_call label="Zoom Nah" name="Zoom Close"/> <menu_item_call label="Zoom Mittel" name="Zoom Medium"/> <menu_item_call label="Zoom Weit" name="Zoom Far"/> diff --git a/indra/newview/skins/default/xui/de/menu_object.xml b/indra/newview/skins/default/xui/de/menu_object.xml index 6f8d85ecb8..8bb7b66482 100644 --- a/indra/newview/skins/default/xui/de/menu_object.xml +++ b/indra/newview/skins/default/xui/de/menu_object.xml @@ -5,21 +5,23 @@ <menu_item_call label="Bauen" name="Build"/> <menu_item_call label="Öffnen" name="Open"/> <menu_item_call label="Hier sitzen" name="Object Sit"/> + <menu_item_call label="Aufstehen" name="Object Stand Up"/> <menu_item_call label="Objektprofil" name="Object Inspect"/> <menu_item_call label="Hineinzoomen" name="Zoom In"/> - <context_menu label="Anziehen >" name="Put On"> + <context_menu label="Anziehen â–¶" name="Put On"> <menu_item_call label="Anziehen" name="Wear"/> - <context_menu label="Anhängen >" name="Object Attach"/> - <context_menu label="HUD anhängen >" name="Object Attach HUD"/> + <context_menu label="Anhängen â–¶" name="Object Attach"/> + <context_menu label="HUD anhängen â–¶" name="Object Attach HUD"/> </context_menu> - <context_menu label="Entfernen >" name="Remove"> - <menu_item_call label="Nehmen" name="Pie Object Take"/> + <context_menu label="Entfernen â–¶" name="Remove"> <menu_item_call label="Missbrauch melden" name="Report Abuse..."/> <menu_item_call label="Ignorieren" name="Object Mute"/> <menu_item_call label="Zurückgeben" name="Return..."/> <menu_item_call label="Löschen" name="Delete"/> </context_menu> + <menu_item_call label="Kaufen" name="Pie Object Bye"/> + <menu_item_call label="Nehmen" name="Pie Object Take"/> <menu_item_call label="Kopie nehmen" name="Take Copy"/> - <menu_item_call label="Zahlen" name="Pay..."/> + <menu_item_call label="Bezahlen" name="Pay..."/> <menu_item_call label="Kaufen" name="Buy..."/> </context_menu> diff --git a/indra/newview/skins/default/xui/de/menu_outfit_gear.xml b/indra/newview/skins/default/xui/de/menu_outfit_gear.xml new file mode 100644 index 0000000000..411dfc42c0 --- /dev/null +++ b/indra/newview/skins/default/xui/de/menu_outfit_gear.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Gear Outfit"> + <menu_item_call label="Anziehen - Aktuelles Outfit ersetzen" name="wear"/> + <menu_item_call label="Ausziehen - Aus aktuellem Outfit entfernen" name="take_off"/> + <menu label="Neue Kleider" name="New Clothes"> + <menu_item_call label="Neues Hemd" name="New Shirt"/> + <menu_item_call label="Neue Hose" name="New Pants"/> + <menu_item_call label="Neue Schuhe" name="New Shoes"/> + <menu_item_call label="Neue Socken" name="New Socks"/> + <menu_item_call label="Neue Jacke" name="New Jacket"/> + <menu_item_call label="Neuer Rock" name="New Skirt"/> + <menu_item_call label="Neue Handschuhe" name="New Gloves"/> + <menu_item_call label="Neues Unterhemd" name="New Undershirt"/> + <menu_item_call label="Neue Unterhose" name="New Underpants"/> + <menu_item_call label="Neues Alpha" name="New Alpha"/> + <menu_item_call label="Neue Tätowierung" name="New Tattoo"/> + </menu> + <menu label="Neue Körperteile" name="New Body Parts"> + <menu_item_call label="Neue Form" name="New Shape"/> + <menu_item_call label="Neue Haut" name="New Skin"/> + <menu_item_call label="Neues Haar" name="New Hair"/> + <menu_item_call label="Neue Augen" name="New Eyes"/> + </menu> + <menu_item_call label="Outfit neu benennen" name="rename"/> + <menu_item_call label="Outfit löschen" name="delete_outfit"/> +</menu> diff --git a/indra/newview/skins/default/xui/de/menu_outfit_tab.xml b/indra/newview/skins/default/xui/de/menu_outfit_tab.xml new file mode 100644 index 0000000000..605dee9b33 --- /dev/null +++ b/indra/newview/skins/default/xui/de/menu_outfit_tab.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Outfit"> + <menu_item_call label="Anziehen - Aktuelles Outfit ersetzen" name="wear_replace"/> + <menu_item_call label="Anziehen - Aktuelles Outfit hinzufügen" name="wear_add"/> + <menu_item_call label="Ausziehen - Aus aktuellem Outfit entfernen" name="take_off"/> + <menu_item_call label="Outfit bearbeiten" name="edit"/> + <menu_item_call label="Umbenennen" name="rename"/> + <menu_item_call label="Outfit löschen" name="delete"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/de/menu_participant_list.xml b/indra/newview/skins/default/xui/de/menu_participant_list.xml index 15c957cee3..ca0d9f8c2d 100644 --- a/indra/newview/skins/default/xui/de/menu_participant_list.xml +++ b/indra/newview/skins/default/xui/de/menu_participant_list.xml @@ -7,7 +7,8 @@ <menu_item_call label="IM" name="IM"/> <menu_item_call label="Anrufen" name="Call"/> <menu_item_call label="Teilen" name="Share"/> - <menu_item_call label="Zahlen" name="Pay"/> + <menu_item_call label="Bezahlen" name="Pay"/> + <menu_item_check label="Symbole für Personen anzeigen" name="View Icons"/> <menu_item_check label="Voice ignorieren" name="Block/Unblock"/> <menu_item_check label="Text ignorieren" name="MuteText"/> <context_menu label="Moderator-Optionen >" name="Moderator Options"> diff --git a/indra/newview/skins/default/xui/de/menu_people_groups.xml b/indra/newview/skins/default/xui/de/menu_people_groups.xml index 87f43d27e6..76225ba241 100644 --- a/indra/newview/skins/default/xui/de/menu_people_groups.xml +++ b/indra/newview/skins/default/xui/de/menu_people_groups.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="menu_group_plus"> - <menu_item_call label="Ansichts-Info" name="View Info"/> + <menu_item_call label="Info anzeigen" name="View Info"/> <menu_item_call label="Chat" name="Chat"/> <menu_item_call label="Anrufen" name="Call"/> <menu_item_call label="Aktivieren" name="Activate"/> diff --git a/indra/newview/skins/default/xui/de/menu_people_nearby.xml b/indra/newview/skins/default/xui/de/menu_people_nearby.xml index 9fa5db5fa3..1db964357f 100644 --- a/indra/newview/skins/default/xui/de/menu_people_nearby.xml +++ b/indra/newview/skins/default/xui/de/menu_people_nearby.xml @@ -2,10 +2,12 @@ <context_menu name="Avatar Context Menu"> <menu_item_call label="Profil anzeigen" name="View Profile"/> <menu_item_call label="Freund hinzufügen" name="Add Friend"/> + <menu_item_call label="Freund entfernen" name="Remove Friend"/> <menu_item_call label="IM" name="IM"/> <menu_item_call label="Anrufen" name="Call"/> + <menu_item_call label="Karte" name="Map"/> <menu_item_call label="Teilen" name="Share"/> - <menu_item_call label="Zahlen" name="Pay"/> + <menu_item_call label="Bezahlen" name="Pay"/> <menu_item_check label="Ignorieren/Freischalten" name="Block/Unblock"/> <menu_item_call label="Teleport anbieten" name="teleport"/> </context_menu> diff --git a/indra/newview/skins/default/xui/de/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/de/menu_people_nearby_multiselect.xml index d572a8ca1c..d978d9e40c 100644 --- a/indra/newview/skins/default/xui/de/menu_people_nearby_multiselect.xml +++ b/indra/newview/skins/default/xui/de/menu_people_nearby_multiselect.xml @@ -1,8 +1,9 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Multi-Selected People Context Menu"> <menu_item_call label="Freunde hinzufügen" name="Add Friends"/> + <menu_item_call label="Freunde entfernen" name="Remove Friend"/> <menu_item_call label="IM" name="IM"/> <menu_item_call label="Anrufen" name="Call"/> <menu_item_call label="Teilen" name="Share"/> - <menu_item_call label="Zahlen" name="Pay"/> + <menu_item_call label="Bezahlen" name="Pay"/> </context_menu> diff --git a/indra/newview/skins/default/xui/de/menu_people_nearby_view_sort.xml b/indra/newview/skins/default/xui/de/menu_people_nearby_view_sort.xml index d0881ddd05..0f252ab46d 100644 --- a/indra/newview/skins/default/xui/de/menu_people_nearby_view_sort.xml +++ b/indra/newview/skins/default/xui/de/menu_people_nearby_view_sort.xml @@ -3,6 +3,6 @@ <menu_item_check label="Nach letzten Sprechern sortieren" name="sort_by_recent_speakers"/> <menu_item_check label="Nach Name sortieren" name="sort_name"/> <menu_item_check label="Nach Entfernung sortieren" name="sort_distance"/> - <menu_item_check label="Profilbilder anzeigen" name="view_icons"/> - <menu_item_call label="Zeige geblockte Einwohner & Objekte" name="show_blocked_list"/> + <menu_item_check label="Symbole für Personen anzeigen" name="view_icons"/> + <menu_item_call label="Ignorierte Einwohner & Objekte anzeigen" name="show_blocked_list"/> </menu> diff --git a/indra/newview/skins/default/xui/de/menu_people_recent_view_sort.xml b/indra/newview/skins/default/xui/de/menu_people_recent_view_sort.xml index 837983b716..1ef020f5e1 100644 --- a/indra/newview/skins/default/xui/de/menu_people_recent_view_sort.xml +++ b/indra/newview/skins/default/xui/de/menu_people_recent_view_sort.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="menu_group_plus"> - <menu_item_check label="Nach aktuellesten Objekten sortieren" name="sort_most"/> + <menu_item_check label="Nach aktuellesten Sprechern sortieren" name="sort_most"/> <menu_item_check label="Nach Name sortieren" name="sort_name"/> <menu_item_check label="Symbole für Personen anzeigen" name="view_icons"/> <menu_item_call label="Ignorierte Einwohner & Objekte anzeigen" name="show_blocked_list"/> diff --git a/indra/newview/skins/default/xui/de/menu_profile_overflow.xml b/indra/newview/skins/default/xui/de/menu_profile_overflow.xml index f5cedf5464..9f3fcbca1d 100644 --- a/indra/newview/skins/default/xui/de/menu_profile_overflow.xml +++ b/indra/newview/skins/default/xui/de/menu_profile_overflow.xml @@ -1,7 +1,10 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <toggleable_menu name="profile_overflow_menu"> - <menu_item_call label="Zahlen" name="pay"/> + <menu_item_call label="Karte" name="show_on_map"/> + <menu_item_call label="Bezahlen" name="pay"/> <menu_item_call label="Teilen" name="share"/> + <menu_item_call label="Ignorieren" name="block"/> + <menu_item_call label="Freischalten" name="unblock"/> <menu_item_call label="Hinauswerfen" name="kick"/> <menu_item_call label="Einfrieren" name="freeze"/> <menu_item_call label="Auftauen" name="unfreeze"/> diff --git a/indra/newview/skins/default/xui/de/menu_save_outfit.xml b/indra/newview/skins/default/xui/de/menu_save_outfit.xml new file mode 100644 index 0000000000..986c78b318 --- /dev/null +++ b/indra/newview/skins/default/xui/de/menu_save_outfit.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="save_outfit_menu"> + <menu_item_call label="Speichern" name="save_outfit"/> + <menu_item_call label="Speichern unter" name="save_as_new_outfit"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/de/menu_script_chiclet.xml b/indra/newview/skins/default/xui/de/menu_script_chiclet.xml new file mode 100644 index 0000000000..3256aa1a87 --- /dev/null +++ b/indra/newview/skins/default/xui/de/menu_script_chiclet.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="ScriptChiclet Menu"> + <menu_item_call label="Schließen" name="Close"/> +</menu> diff --git a/indra/newview/skins/default/xui/de/menu_viewer.xml b/indra/newview/skins/default/xui/de/menu_viewer.xml index c6bbea285f..38ef1b0421 100644 --- a/indra/newview/skins/default/xui/de/menu_viewer.xml +++ b/indra/newview/skins/default/xui/de/menu_viewer.xml @@ -7,10 +7,10 @@ </menu_item_call> <menu_item_call label="L$ kaufen" name="Buy and Sell L$"/> <menu_item_call label="Mein Profil" name="Profile"/> - <menu_item_call label="Mein Aussehen" name="Appearance"/> <menu_item_check label="Mein Inventar" name="Inventory"/> - <menu_item_call label="Inventar auf Seitenleiste anzeigen" name="ShowSidetrayInventory"/> - <menu_item_call label="Meine Gesten" name="Gestures"/> + <menu_item_check label="Mein Inventar" name="ShowSidetrayInventory"/> + <menu_item_check label="Meine Gesten" name="Gestures"/> + <menu_item_check label="Meine Stimme" name="ShowVoice"/> <menu label="Mein Status" name="Status"> <menu_item_call label="Abwesend" name="Set Away"/> <menu_item_call label="Beschäftigt" name="Set Busy"/> @@ -22,24 +22,30 @@ <menu label="Unterhalten" name="Communicate"> <menu_item_call label="Meine Freunde" name="My Friends"/> <menu_item_call label="Meine Gruppen" name="My Groups"/> - <menu_item_check label="Lokaler Chat" name="Nearby Chat"/> + <menu_item_check label="Chat in der Nähe" name="Nearby Chat"/> <menu_item_call label="Leute in der Nähe" name="Active Speakers"/> - <menu_item_check label="Medien in der Nähe" name="Nearby Media"/> </menu> <menu label="Welt" name="World"> <menu_item_check label="Minikarte" name="Mini-Map"/> - <menu_item_check label="Weltkarte" name="World Map"/> + <menu_item_check label="Karte" name="World Map"/> <menu_item_call label="Foto" name="Take Snapshot"/> <menu_item_call label="Landmarke für diesen Ort setzen" name="Create Landmark Here"/> <menu label="Ortsprofil" name="Land"> + <menu_item_call label="Ortsprofil" name="Place Profile"/> <menu_item_call label="Land-Info" name="About Land"/> - <menu_item_call label="Region/Grundstück" name="Region/Estate"/> + <menu_item_call label="Region/Grundbesitz" name="Region/Estate"/> </menu> <menu_item_call label="Dieses Land kaufen" name="Buy Land"/> <menu_item_call label="Mein Land" name="My Land"/> <menu label="Anzeigen" name="LandShow"> <menu_item_check label="Bewegungssteuerung" name="Movement Controls"/> <menu_item_check label="Ansichtsteuerung" name="Camera Controls"/> + <menu_item_check label="Bannlinien" name="Ban Lines"/> + <menu_item_check label="Strahlen" name="beacons"/> + <menu_item_check label="Grundstücksgrenzen" name="Property Lines"/> + <menu_item_check label="Landeigentümer" name="Land Owners"/> + <menu_item_check label="Koordinaten" name="Coordinates"/> + <menu_item_check label="Parzelleneigenschaften" name="Parcel Properties"/> </menu> <menu_item_call label="Teleport nach Hause" name="Teleport Home"/> <menu_item_call label="Hier als Zuhause wählen" name="Set Home to Here"/> @@ -48,36 +54,33 @@ <menu_item_call label="Mittag" name="Noon"/> <menu_item_call label="Sonnenuntergang" name="Sunset"/> <menu_item_call label="Mitternacht" name="Midnight"/> - <menu_item_call label="Grundstückszeit" name="Revert to Region Default"/> + <menu_item_call label="Grundbesitzzeit" name="Revert to Region Default"/> <menu_item_call label="Umwelt-Editor" name="Environment Editor"/> </menu> </menu> <menu label="Bauen" name="BuildTools"> <menu_item_check label="Bauen" name="Show Build Tools"/> <menu label="Bauwerkzeug auswählen" name="Select Tool"> - <menu_item_call label="Fokus-Werkzeug" name="Focus"/> - <menu_item_call label="Werkzeug „Bewegen“" name="Move"/> + <menu_item_call label="Fokus" name="Focus"/> + <menu_item_call label="Verschieben" name="Move"/> <menu_item_call label="Bearbeiten" name="Edit"/> - <menu_item_call label="Werkzeug „Erstellen"" name="Create"/> - <menu_item_call label="Land-Werkzeug" name="Land"/> - </menu> - <menu label="Bearbeiten" name="Edit"> - <menu_item_call label="Rückgängig" name="Undo"/> - <menu_item_call label="Wiederherstellen" name="Redo"/> - <menu_item_call label="Ausschneiden" name="Cut"/> - <menu_item_call label="Kopieren" name="Copy"/> - <menu_item_call label="Einfügen" name="Paste"/> - <menu_item_call label="Löschen" name="Delete"/> - <menu_item_call label="Duplizieren" name="Duplicate"/> - <menu_item_call label="Alle auswählen" name="Select All"/> - <menu_item_call label="Auswahl aufheben" name="Deselect"/> + <menu_item_call label="Erstellen" name="Create"/> + <menu_item_call label="Land" name="Land"/> </menu> <menu_item_call label="Verknüpfung" name="Link"/> <menu_item_call label="Verknüpfung auflösen" name="Unlink"/> + <menu_item_check label="Verknüpfte Teile bearbeiten" name="Edit Linked Parts"/> + <menu label="Verknüpfte Teile auswählen" name="Select Linked Parts"> + <menu_item_call label="Nächstes Teil auswählen" name="Select Next Part"/> + <menu_item_call label="Vorheriges Teil auswählen" name="Select Previous Part"/> + <menu_item_call label="Nächsten Teil mit einsschließen" name="Include Next Part"/> + <menu_item_call label="Vorherige Teile mit einschließen" name="Include Previous Part"/> + </menu> <menu_item_call label="Fokus auf Auswahl" name="Focus on Selection"/> <menu_item_call label="Auf Auswahl zoomen" name="Zoom to Selection"/> <menu label="Objekt" name="Object"> - <menu_item_call label="Kaufen" name="Menu Object Take"/> + <menu_item_call label="Kaufen" name="Menu Object Buy"/> + <menu_item_call label="Nehmen" name="Menu Object Take"/> <menu_item_call label="Kopie nehmen" name="Take Copy"/> <menu_item_call label="Objekt wieder in meinem Inventar speichern" name="Save Object Back to My Inventory"/> <menu_item_call label="Wieder in Objektinhalt speichern" name="Save Object Back to Object Contents"/> @@ -90,31 +93,24 @@ <menu_item_call label="Skripts auf nicht ausführen einstellen" name="Set Scripts to Not Running"/> </menu> <menu label="Optionen" name="Options"> - <menu_item_check label="Verknüpfte Teile bearbeiten" name="Edit Linked Parts"/> <menu_item_call label="Hochlade-Berechtigungen (Standard) festlegen" name="perm prefs"/> <menu_item_check label="Erweiterte Berechtigungen anzeigen" name="DebugPermissions"/> - <menu label="Auswahl" name="Selection"> - <menu_item_check label="Nur meine Objekte auswählen" name="Select Only My Objects"/> - <menu_item_check label="Nur bewegliche Objekte auswählen" name="Select Only Movable Objects"/> - <menu_item_check label="Nach Umgebung auswählen" name="Select By Surrounding"/> - </menu> - <menu label="Anzeigen" name="Show"> - <menu_item_check label="Ausgeblendete Auswahl anzeigen" name="Show Hidden Selection"/> - <menu_item_check label="Lichtradius für Auswahl anzeigen" name="Show Light Radius for Selection"/> - <menu_item_check label="Auswahlstrahl anzeigen" name="Show Selection Beam"/> - </menu> - <menu label="Raster" name="Grid"> - <menu_item_check label="An Raster ausrichten" name="Snap to Grid"/> - <menu_item_call label="Objekt-XY an Raster ausrichten" name="Snap Object XY to Grid"/> - <menu_item_call label="Auswahl für Raster verwenden" name="Use Selection for Grid"/> - <menu_item_call label="Rasteroptionen" name="Grid Options"/> - </menu> - </menu> - <menu label="Verknüpfte Teile auswählen" name="Select Linked Parts"> - <menu_item_call label="Nächstes Teil auswählen" name="Select Next Part"/> - <menu_item_call label="Vorheriges Teil auswählen" name="Select Previous Part"/> - <menu_item_call label="Nächsten Teil mit einsschließen" name="Include Next Part"/> - <menu_item_call label="Vorherige Teile mit einschließen" name="Include Previous Part"/> + <menu_item_check label="Nur meine Objekte auswählen" name="Select Only My Objects"/> + <menu_item_check label="Nur bewegliche Objekte auswählen" name="Select Only Movable Objects"/> + <menu_item_check label="Nach Umgebung auswählen" name="Select By Surrounding"/> + <menu_item_check label="Ausgeblendete Auswahl anzeigen" name="Show Hidden Selection"/> + <menu_item_check label="Lichtradius für Auswahl anzeigen" name="Show Light Radius for Selection"/> + <menu_item_check label="Auswahlstrahl anzeigen" name="Show Selection Beam"/> + <menu_item_check label="An Raster ausrichten" name="Snap to Grid"/> + <menu_item_call label="Objekt-XY an Raster ausrichten" name="Snap Object XY to Grid"/> + <menu_item_call label="Auswahl für Raster verwenden" name="Use Selection for Grid"/> + <menu_item_call label="Rasteroptionen" name="Grid Options"/> + </menu> + <menu label="Hochladen" name="Upload"> + <menu_item_call label="Bild ([COST] L$)..." name="Upload Image"/> + <menu_item_call label="Sound ([COST] L$)..." name="Upload Sound"/> + <menu_item_call label="Animation ([COST] L$)..." name="Upload Animation"/> + <menu_item_call label="Mehrfach-Upload ([COST] L$ pro Datei)..." name="Bulk Upload"/> </menu> </menu> <menu label="Hilfe" name="Help"> @@ -124,6 +120,7 @@ <menu_item_call label="INFO ÜBER [APP_NAME]" name="About Second Life"/> </menu> <menu label="Erweitert" name="Advanced"> + <menu_item_check label="Menü „Erweitert“ anzeigen" name="Show Advanced Menu"/> <menu_item_call label="Animation meines Avatars stoppen" name="Stop Animating My Avatar"/> <menu_item_call label="Textur neu laden" name="Rebake Texture"/> <menu_item_call label="UI-Größe auf Standard setzen" name="Set UI Size to Default"/> @@ -145,7 +142,6 @@ <menu_item_check label="Durchsichtig hervorheben" name="Highlight Transparent"/> <menu_item_check label="HUD-Anhänge anzeigen" name="Show HUD Attachments"/> <menu_item_check label="Fadenkreuz für Mouselook anzeigen" name="ShowCrosshairs"/> - <menu_item_check label="Land-Kurzinfos anzeigen" name="Land Tips"/> </menu> <menu label="Darstellungstypen" name="Rendering Types"> <menu_item_check label="Einfach" name="Simple"/> @@ -162,7 +158,7 @@ <menu_item_check label="Partikel" name="Particles"/> <menu_item_check label="Unebenheiten" name="Bump"/> </menu> - <menu label="Rederning-Eigenschaften" name="Rendering Features"> + <menu label="Rendering-Eigenschaften" name="Rendering Features"> <menu_item_check label="UI" name="UI"/> <menu_item_check label="Ausgewählt" name="Selected"/> <menu_item_check label="Farblich hervorgehoben" name="Highlighted"/> @@ -172,11 +168,11 @@ <menu_item_check label="FRInfo testen" name="Test FRInfo"/> <menu_item_check label="Flexible Objekte" name="Flexible Objects"/> </menu> - <menu_item_check label="Mehrer Threads ausführen" name="Run Multiple Threads"/> + <menu_item_check label="Mehrere Threads ausführen" name="Run Multiple Threads"/> <menu_item_call label="Gruppen-Cache löschen" name="ClearGroupCache"/> <menu_item_check label="Weiche Mausbewegung" name="Mouse Smoothing"/> - <menu_item_check label="IMs in lokalem Chat anzeigen" name="IMInChat"/> <menu label="Tastaturkürzel" name="Shortcuts"> + <menu_item_call label="Bild ([COST] L$)..." name="Upload Image"/> <menu_item_check label="Suchen" name="Search"/> <menu_item_call label="Tasten freigeben" name="Release Keys"/> <menu_item_call label="UI-Größe auf Standard setzen" name="Set UI Size to Default"/> @@ -199,7 +195,6 @@ <menu_item_call label="Hineinzoomen" name="Zoom In"/> <menu_item_call label="Zoom-Standard" name="Zoom Default"/> <menu_item_call label="Wegzoomen" name="Zoom Out"/> - <menu_item_call label="Vollbild" name="Toggle Fullscreen"/> </menu> <menu_item_call label="Debug-Einstellungen anzeigen" name="Debug Settings"/> <menu_item_check label="Menü „Entwickler“ anzeigen" name="Debug Mode"/> @@ -219,6 +214,7 @@ <menu_item_check label="Kamera" name="Camera"/> <menu_item_check label="Wind" name="Wind"/> <menu_item_check label="FOV" name="FOV"/> + <menu_item_check label="Gütesiegel" name="Badge"/> </menu> <menu label="Info anzeigen" name="Display Info"> <menu_item_check label="Zeit anzeigen" name="Show Time"/> @@ -384,7 +380,7 @@ <menu_item_call label="Temp-Asset-Daten ausgeben" name="Dump Temp Asset Data"/> <menu_item_call label="Regions-Status speichern" name="Save Region State"/> </menu> - <menu_item_call label="Gott-Tools" name="God Tools"/> + <menu_item_call label="Gott-Werkzeuge" name="God Tools"/> </menu> <menu label="Admin" name="Deprecated"> <menu label="Objekt anhängen" name="Attach Object"/> @@ -407,7 +403,7 @@ <menu_item_call label="Offizielles Linden-Blog" name="Official Linden Blog"/> <menu_item_call label="Scripting-Portal" name="Scripting Portal"/> <menu label="Fehlermeldungen" name="Bug Reporting"> - <menu_item_call label="Allgemeine Probleme-Tracker" name="Public Issue Tracker"/> + <menu_item_call label="Allgemeiner Probleme-Tracker" name="Public Issue Tracker"/> <menu_item_call label="Hilfe zum Allgemeinen Probleme-Tracker" name="Publc Issue Tracker Help"/> <menu_item_call label="Fehlermeldungs-1x1" name="Bug Reporing 101"/> <menu_item_call label="Sicherheitsfragen" name="Security Issues"/> diff --git a/indra/newview/skins/default/xui/de/menu_wearable_list_item.xml b/indra/newview/skins/default/xui/de/menu_wearable_list_item.xml new file mode 100644 index 0000000000..a4bf75a497 --- /dev/null +++ b/indra/newview/skins/default/xui/de/menu_wearable_list_item.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Outfit Wearable Context Menu"> + <menu_item_call label="Anziehen" name="wear"/> + <menu_item_call label="Hinzufügen" name="wear_add"/> + <menu_item_call label="Ausziehen / Abnehmen" name="take_off_or_detach"/> + <menu_item_call label="Abnehmen" name="detach"/> + <context_menu label="Anhängen an â–¶" name="wearable_attach_to"/> + <context_menu label="An HUD hängen â–¶" name="wearable_attach_to_hud"/> + <menu_item_call label="Ausziehen" name="take_off"/> + <menu_item_call label="Bearbeiten" name="edit"/> + <menu_item_call label="Objektprofil" name="object_profile"/> + <menu_item_call label="Original anzeigen" name="show_original"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/de/mime_types.xml b/indra/newview/skins/default/xui/de/mime_types.xml index e01649e911..de93107e94 100644 --- a/indra/newview/skins/default/xui/de/mime_types.xml +++ b/indra/newview/skins/default/xui/de/mime_types.xml @@ -22,14 +22,6 @@ Video wiedergeben </playtip> </widgetset> - <widgetset name="none"> - <label name="none_label"> - Keine Inhalte - </label> - <tooltip name="none_tooltip"> - Keine Medien gefunden - </tooltip> - </widgetset> <widgetset name="image"> <label name="image_label"> Bild diff --git a/indra/newview/skins/default/xui/de/notifications.xml b/indra/newview/skins/default/xui/de/notifications.xml index d94bbd8564..408ece9690 100644 --- a/indra/newview/skins/default/xui/de/notifications.xml +++ b/indra/newview/skins/default/xui/de/notifications.xml @@ -11,18 +11,29 @@ </global> <template name="okbutton"> <form> - <button name="OK" text="$yestext"/> + <button name="OK_okbutton" text="$yestext"/> + </form> + </template> + <template name="okignore"> + <form> + <button name="OK_okignore" text="$yestext"/> </form> </template> - <template name="okignore"/> <template name="okcancelbuttons"> <form> - <button name="Cancel" text="$notext"/> + <button name="OK_okcancelbuttons" text="$yestext"/> + <button name="Cancel_okcancelbuttons" text="$notext"/> + </form> + </template> + <template name="okcancelignore"> + <form> + <button name="OK_okcancelignore" text="$yestext"/> + <button name="Cancel_okcancelignore" text="$notext"/> </form> </template> - <template name="okcancelignore"/> <template name="okhelpbuttons"> <form> + <button name="OK_okhelpbuttons" text="$yestext"/> <button name="Help" text="$helptext"/> </form> </template> @@ -30,6 +41,7 @@ <form> <button name="Yes" text="$yestext"/> <button name="No" text="$notext"/> + <button name="Cancel_yesnocancelbuttons" text="$canceltext"/> </form> </template> <notification functor="GenericAcknowledge" label="Unbekannte Meldung" name="MissingAlert"> @@ -93,8 +105,12 @@ Wählen Sie ein einzelnes Objekt aus und versuchen Sie es erneut. Änderung an Kleidung/Körperteilen speichern? <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Nicht speichern" yestext="Alles speichern"/> </notification> + <notification name="FriendsAndGroupsOnly"> + Leute, die nicht auf Ihrer Freundesliste stehen, werden nicht wissen, dass Sie deren Anrufe oder Sofortnachrichten ignoriert haben. + <usetemplate name="okbutton" yestext="Ja"/> + </notification> <notification name="GrantModifyRights"> - Wenn Sie einem anderen Einwohner, das die Erlaubnis zum Bearbeiten erteilen, dann kann dieser JEDES Objekt, das Sie inworld besitzen, verändern, löschen oder nehmen. Seien Sie SEHR vorsichtig, wenn Sie diese Erlaubnis gewähren! + Wenn Sie einem anderen Einwohner die Erlaubnis zum Bearbeiten erteilen, dann kann dieser JEDES Objekt, das Sie inworld besitzen, verändern, löschen oder nehmen. Seien Sie SEHR vorsichtig, wenn Sie diese Erlaubnis gewähren! Möchten Sie [FIRST_NAME] [LAST_NAME] die Erlaubnis zum Bearbeiten gewähren? <usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/> </notification> @@ -161,14 +177,16 @@ Der Rolle „[ROLE_NAME]“ diese Fähigkeit zuweisen? Möchten Sie fortfahren? <usetemplate ignoretext="Bestätigen, bevor Anhänge fallen gelassen werden" name="okcancelignore" notext="Nein" yestext="Ja"/> </notification> - <notification name="ClickUnimplemented"> - Leider ist diese Funktion noch nicht implementiert. - </notification> <notification name="JoinGroupCanAfford"> Der Beitritt zu dieser Gruppe kostet [COST] L$. Fortfahren? <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Beitreten"/> </notification> + <notification name="JoinGroupNoCost"> + Sie treten der Gruppe [NAME] bei. +Fortfahren? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Beitreten"/> + </notification> <notification name="JoinGroupCannotAfford"> Der Beitritt zu dieser Gruppe kostet [COST] L$. Sie haben nicht genug L$, um dieser Gruppe beizutreten. @@ -189,15 +207,15 @@ Bitte laden Sie innerhalb von 48 Stunden Mitglieder in Ihre Gruppe ein. Wählen Sie eine bestimmte Person aus, wenn Sie für 0 L$ verkaufen. </notification> <notification name="ConfirmLandSaleChange"> - Die ausgewählten [LAND_SIZE] qm Land werden zum Verkauf freigegeben. -Der Verkaufspreis beträgt [SALE_PRICE] L$ und wird automatisch für den Verkauf an [NAME] autorisiert. + Die ausgewählten [LAND_SIZE] m² Land werden zum Verkauf freigegeben. +Der Verkaufspreis beträgt [SALE_PRICE] L$. Der Verkauf an [NAME] wird zu diesem Preis freigegeben. <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> </notification> <notification name="ConfirmLandSaleToAnyoneChange"> ACHTUNG: Wenn Sie auf An jeden verkaufen klicken, kann jeder in [SECOND_LIFE] Ihr Land kaufen, auch Einwohner in anderen Regionen. Die ausgewählten [LAND_SIZE] m² Land werden zum Verkauf freigegeben. -Der Verkaufspreis beträgt [SALE_PRICE] L$ und wird automatisch für den Verkauf an [NAME] autorisiert. +Der Verkaufspreis beträgt [SALE_PRICE] L$. Der Verkauf an [NAME] wird zu diesem Preis freigegeben. <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> </notification> <notification name="ReturnObjectsDeededToGroup"> @@ -318,7 +336,7 @@ Sie benötigen ein Benutzerkonto, um [SECOND_LIFE] betreten zu können. Möchten <notification name="AddClassified"> Anzeigen werden im Suchverzeichnis im Abschnitt „Anzeigen" und auf [http://secondlife.com/community/classifieds secondlife.com] für eine Woche angezeigt. Füllen Sie Ihre Anzeige aus und klicken Sie auf 'Veröffentlichen...', um sie zum Verzeichnis hinzuzufügen. -Sie werden gebeten, einen Preis zu bezahlen, wenn Sie auf 'Veröffentlichen' klicken. +Sie werden gebeten für die Anzeige zu bezahlen, wenn Sie auf 'Veröffentlichen' klicken. Wenn Sie mehr bezahlen, erscheint Ihre Anzeige weiter oben in der Liste, ebenso wenn ein Benutzer nach Ihren Suchbegriffen sucht. <usetemplate ignoretext="So wird eine neue Anzeige erstellt" name="okcancelignore" notext="Abbrechen" yestext="OK"/> </notification> @@ -336,8 +354,12 @@ Sind Sie sicher, dass Sie fortfahren wollen? Änderung an Anzeige [NAME] speichern? <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Nicht speichern" yestext="Speichern"/> </notification> + <notification name="ClassifiedInsufficientFunds"> + Sie haben nicht genügend Geld, um eine Anzeige zu erstellen. + <usetemplate name="okbutton" yestext="OK"/> + </notification> <notification name="DeleteAvatarPick"> - Auswahl [PICK] löschen? + Auswahl <nolink>[PICK]</nolink> löschen? <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> </notification> <notification name="PromptGoToEventsPage"> @@ -431,18 +453,17 @@ Das Objekt ist möglicherweise außer Reichweite oder wurde gelöscht. Datei [[FILE]] kann nicht geschrieben werden </notification> <notification name="UnsupportedHardware"> - Achtung: Ihr System erfüllt nicht die Mindestanforderungen von [APP_NAME]. Dies kann eine schlechte Darstellungsleistung in [APP_NAME] zur Folge haben. Bei nicht unterstützten Systemkonfigurationen kann Ihnen unsere [SUPPORT_SITE] leider nicht helfen. + Ihr Computer entspricht leider nicht den Mindestanforderungen von [APP_NAME]. Dies kann zur Folge haben, dass das Programm nicht sehr gut ausgeführt wird. Bei nicht unterstützten Systemkonfigurationen kann Ihnen unser [SUPPORT_SITE] leider nicht helfen. -MINDESTANF. -Die Seite [_URL] für weitere Informationen öffnen? +Weitere Informationen finden Sie auf [_URL]. <url name="url" option="0"> http://secondlife.com/support/sysreqs.php?lang=de </url> <usetemplate ignoretext="Meine Hardware wird nicht unterstützt" name="okcancelignore" notext="Nein" yestext="Ja"/> </notification> <notification name="UnknownGPU"> - Ihr System verwendet eine uns zurzeit unbekannte Grafikkarte. -Dies passiert dann, wenn die neue Hardware noch nicht mit [APP_NAME] getestet wurde. [APP_NAME] wird wahrscheinlich korrekt ausgeführt werden, jedoch sollten Sie Ihre Grafikeinstellungen anpassen, um eine bessere Darstellung zu erzielen. + Ihr System verwendet eine Grafikkarte, die [APP_NAME] nicht erkennt. +Dies passiert dann, wenn die neue Hardware noch nicht mit [APP_NAME] getestet wurde. Wahrscheinlich wird das Programm richtig ausgeführt, aber Sie müssen eventuell ein paar Grafikeinstellungen vornehmen. (Ich > Einstellungen > Grafik). <form name="form"> <ignore name="ignore" text="Meine Grafikkarte konnte nicht identifiziert werden."/> @@ -458,7 +479,9 @@ Sie können die Grafikqualität unter Einstellungen > Grafik wieder erhöhen. Die Region [REGION] erlaubt kein Terraforming. </notification> <notification name="CannotCopyWarning"> - Sie sind nicht berechtigt, dieses Objekt zu kopieren und verlieren es aus Ihrem Inventar, wenn Sie es weggeben. Möchten Sie dieses Objekt anbieten? + Sie sind nicht berechtigt, die folgenden Objekte zu kopieren: +[ITEMS] +Wenn Sie diese weitergeben, werden sie aus Ihrem Inventar entfernt. Möchten Sie diese Objekte wirklich weggeben? <usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/> </notification> <notification name="CannotGiveItem"> @@ -667,7 +690,7 @@ Ihre Suchanfrage: [FINALQUERY] Es wurde keine Suche durchgeführt. </notification> <notification name="CouldNotTeleportReason"> - Teleport fehlgeschlagen. + Teleport ist fehlgeschlagen. [REASON] </notification> <notification name="invalid_tport"> @@ -768,14 +791,6 @@ Mehrere Parzellen ausgewählt. Wählen Sie eine einzelne Parzelle. </notification> - <notification name="ParcelCanPlayMedia"> - Dieser Ort kann Streaming-Medien abspielen. -Streaming-Medien erfordern eine schnelle Internet-Verbindung. - -Streaming-Medien abspielen, wenn verfügbar? -(Sie können diese Option später unter Einstellungen > Datenschutz ändern.) - <usetemplate name="okcancelbuttons" notext="Deaktivieren" yestext="Medien wiedergeben"/> - </notification> <notification name="CannotDeedLandWaitingForServer"> Land kann nicht übertragen werden: Warte auf Server für Eigentümerinformationen. @@ -898,9 +913,8 @@ Land zusammenlegen? Dies ist ein temporärer Fehler. Bitte passen Sie das Kleidungsstück in einigen Minuten noch einmal an und speichern Sie es erneut. </notification> <notification name="YouHaveBeenLoggedOut"> - Sie wurden von [SECOND_LIFE] abgemeldet: + Es tut uns leid! Sie wurden von [SECOND_LIFE] abgemeldet. [MESSAGE] -Klicken Sie auf „IM & Chat anzeigen“, um vorhandene Nachrichten und Chat weiterhin anzuzeigen. Um [APP_NAME] zu schließen, auf „Beenden“ klicken. <usetemplate name="okcancelbuttons" notext="Beenden" yestext="IM & Chat anzeigen"/> </notification> <notification name="OnlyOfficerCanBuyLand"> @@ -908,13 +922,13 @@ Klicken Sie auf „IM & Chat anzeigen“, um vorhandene Nachrichten und Chat Sie sind nicht berechtigt, Land für die aktive Gruppe zu kaufen. </notification> <notification label="Freund hinzufügen" name="AddFriend"> - Freunde können sich gegenseitig die Berechtigung erteilen, sich auf der Karte zu verfolgen und Online-Status Benachrichtigungen zu empfangen. + Freunde können sich gegenseitig die Berechtigung erteilen, sich auf der Karte zu sehen und den Online-Status anzuzeigen. [NAME] Freundschaft anbieten? <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> </notification> <notification label="Freund hinzufügen" name="AddFriendWithMessage"> - Freunde können sich gegenseitig die Berechtigung erteilen, sich auf der Karte zu verfolgen und Online-Status Benachrichtigungen zu empfangen. + Freunde können sich gegenseitig die Berechtigung erteilen, sich auf der Karte zu sehen und den Online-Status anzuzeigen. [NAME] Freundschaft anbieten? <form name="form"> @@ -925,6 +939,36 @@ Sie sind nicht berechtigt, Land für die aktive Gruppe zu kaufen. <button name="Cancel" text="Abbrechen"/> </form> </notification> + <notification label="Outfit speichern" name="SaveOutfitAs"> + Mein aktuelles Outfit als neues Outfit speichern: + <form name="form"> + <input name="message"> + [DESC] (neu) + </input> + <button name="Offer" text="OK"/> + <button name="Cancel" text="Abbrechen"/> + </form> + </notification> + <notification label="Kleidungstyp speichern" name="SaveWearableAs"> + Objekt in meinem Inventar speichern als: + <form name="form"> + <input name="message"> + [DESC] (neu) + </input> + <button name="Offer" text="OK"/> + <button name="Cancel" text="Abbrechen"/> + </form> + </notification> + <notification label="Outfit neu benennen" name="RenameOutfit"> + Neuer Outfit-Name: + <form name="form"> + <input name="new_name"> + [NAME] + </input> + <button name="Offer" text="OK"/> + <button name="Cancel" text="Abbrechen"/> + </form> + </notification> <notification name="RemoveFromFriends"> Möchten Sie [FIRST_NAME] [LAST_NAME] aus Ihrer Freundesliste entfernen? <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> @@ -1058,6 +1102,7 @@ Der Gruppe „[GROUP_NAME]“ </notification> <notification name="ErrorMessage"> [ERROR_MESSAGE] + <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="AvatarMovedDesired"> Ihr gewünschter Zielort ist zurzeit nicht verfügbar. @@ -1068,9 +1113,9 @@ Sie wurden zur nächstgelegenen Region teleportiert. Sie wurden zur nächstgelegenen Region teleportiert. </notification> <notification name="AvatarMovedHome"> - Ihr Heimatort ist zurzeit nicht verfügbar. + Ihr Zuhause ist zurzeit nicht verfügbar. Sie wurden zur nächstgelegenen Region teleportiert. -Sie müssen eventuell einen neuen Heimatort festlegen. +Sie müssen eventuell ein neues Zuhause festlegen. </notification> <notification name="ClothingLoading"> Ihre Kleidung wird noch heruntergeladen. @@ -1176,7 +1221,7 @@ Ersetzen Sie die Textur [TEXTURE_NUM] mit einer Bilddatei von maximal 512x512 un Es sind maximal [MAX_MANAGER] verbannte Einwohner erlaub. </notification> <notification name="OwnerCanNotBeDenied"> - Der Eigentümer des Grundstücks kann nicht zur Liste der „Verbannten Einwohner“ hinzugefügt werden. + Der Eigentümer des Grundbesitzes kann nicht zur Liste der „Verbannten Einwohner“ hinzugefügt werden. </notification> <notification name="CanNotChangeAppearanceUntilLoaded"> Das Aussehen lässt sich erst ändern, wenn Kleider und Form/Gestalt geladen sind. @@ -1335,7 +1380,6 @@ Chat und Instant Messages werden ausgeblendet. Instant Messages (Sofortnachricht <notification name="JoinedTooManyGroupsMember"> Sie haben die maximale Anzahl an Gruppen erreicht. Bitte verlassen Sie eine andere Gruppe, um dieser beitreten zu können oder lehnen Sie das Angebot ab. [NAME] hat Sie eingeladen, einer Gruppe beizutreten. -[INVITE] <usetemplate name="okcancelbuttons" notext="Ablehnen" yestext="Beitreten"/> </notification> <notification name="JoinedTooManyGroups"> @@ -1393,7 +1437,7 @@ Chat und Instant Messages werden ausgeblendet. Instant Messages (Sofortnachricht </form> </notification> <notification name="OfferTeleportFromGod"> - Benutzer an Ihrem Standort herbeirufen? + Einwohner zu Ihrem Standort einladen? <form name="form"> <input name="message"> Triff mich in [REGION] @@ -1403,7 +1447,7 @@ Chat und Instant Messages werden ausgeblendet. Instant Messages (Sofortnachricht </form> </notification> <notification name="TeleportFromLandmark"> - Möchten Sie sich wirklich teleportieren? + Sind Sie sicher, dass Sie zu <nolink>[LOCATION]</nolink> teleportieren möchten? <usetemplate ignoretext="Bestätigen, dass ich zu einer Landmarke teleportieren möchte" name="okcancelignore" notext="Abbrechen" yestext="Teleportieren"/> </notification> <notification name="TeleportToPick"> @@ -1414,67 +1458,71 @@ Chat und Instant Messages werden ausgeblendet. Instant Messages (Sofortnachricht Zu [CLASSIFIED] teleportieren? <usetemplate ignoretext="Bestätigen, dass ich zu einer Position in Anzeigen teleportieren möchte." name="okcancelignore" notext="Abbrechen" yestext="Teleportieren"/> </notification> - <notification label="Nachricht an alle auf diesem Grundstück" name="MessageEstate"> - Geben Sie eine kurze Nachricht ein, die an jede Person auf Ihrem Grundstück gesendet wird. + <notification name="TeleportToHistoryEntry"> + Nach [HISTORY_ENTRY] teleportieren? + <usetemplate ignoretext="Bestätigen, dass ich zu einem Standort aus der Teleportliste teleportieren möchte" name="okcancelignore" notext="Abbrechen" yestext="Teleportieren"/> + </notification> + <notification label="Nachricht an alle auf diesem Grundbesitz" name="MessageEstate"> + Geben Sie eine kurze Nachricht ein, die an jede Person auf Ihrem Grundbesitz gesendet wird. <form name="form"> <input name="message"/> <button name="OK" text="OK"/> <button name="Cancel" text="Abbrechen"/> </form> </notification> - <notification label="Linden-Grundstück ändern" name="ChangeLindenEstate"> - Sie sind im Begriff, ein Grundstück in Linden-Besitz (Mainland, Teen-Raster, Orientierung usw.) zu verändern. + <notification label="Linden-Grundbesitz ändern" name="ChangeLindenEstate"> + Sie sind im Begriff, einen Grundbesitz in Linden-Besitz (Mainland, Teen-Raster, Orientierung usw.) zu verändern. Dies ist ÄUSSERST GEFÄHRLICH, da es grundlegende Auswirkungen auf das Benutzererlebnis hat. Auf dem Mainland werden tausende Regionen geändert, was den Spaceserver stark belastet. Fortfahren? <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> </notification> - <notification label="Zugang zu Linden-Grundstück ändern" name="ChangeLindenAccess"> - Sie sind im Begriff, die Zugangsliste für ein Grundstück in Linden-Besitz (Mainland, Teen-Raster, Orientierung usw.) zu verändern. + <notification label="Zugang zu Linden-Grundbesitz ändern" name="ChangeLindenAccess"> + Sie sind im Begriff, die Zugangsliste für einen Grundbesitz in Linden-Besitz (Mainland, Teen-Raster, Orientierung usw.) zu verändern. Dies ist GEFÄHRLICH und sollte nur erfolgen, um Objekte/L$ per Hack in und aus dem Raster zu entfernen. Tausende Regionen werden verändert und der Spaceserver wird dadurch stark belastet. <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> </notification> - <notification label="Grundstück wählen" name="EstateAllowedAgentAdd"> - Nur für dieses Grundstück oder für alle [ALL_ESTATES] zur Erlaubnisliste hinzufügen? - <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundstücke" yestext="Dieses Grundstück"/> + <notification label="Grundbesitz wählen" name="EstateAllowedAgentAdd"> + Nur für diesen Grundbesitz oder für alle [ALL_ESTATES] zur Erlaubnisliste hinzufügen? + <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundbesitze" yestext="Dieser Grundbesitz"/> </notification> - <notification label="Grundstück wählen" name="EstateAllowedAgentRemove"> - Nur für dieses Grundstück oder für alle [ALL_ESTATES] von Erlaubnisliste entfernen? - <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundstücke" yestext="Dieses Grundstück"/> + <notification label="Grundbesitz wählen" name="EstateAllowedAgentRemove"> + Nur für diesen Grundbesitz oder für alle [ALL_ESTATES] von Erlaubnisliste entfernen? + <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundbesitze" yestext="Diesen Grundbesitz"/> </notification> - <notification label="Grundstück wählen" name="EstateAllowedGroupAdd"> - Nur für dieses Grundstück oder für alle [ALL_ESTATES] zur Gruppen-Erlaubnisliste hinzufügen? - <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundstücke" yestext="Dieses Grundstück"/> + <notification label="Grundbesitz wählen" name="EstateAllowedGroupAdd"> + Nur für diesen Grundbesitz oder für alle [ALL_ESTATES] zur Gruppen-Erlaubnisliste hinzufügen? + <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundbesitze" yestext="Diesen Grundbesitz"/> </notification> - <notification label="Grundstück wählen" name="EstateAllowedGroupRemove"> - Nur für dieses Grundstück oder für alle [ALL_ESTATES] von Gruppen-Erlaubnisliste entfernen? - <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundstücke" yestext="Dieses Grundstück"/> + <notification label="Grundbesitz wählen" name="EstateAllowedGroupRemove"> + Nur für diesen Grundbesitz oder für alle [ALL_ESTATES] von Gruppen-Erlaubnisliste entfernen? + <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundbesitze" yestext="Diesen Grundbesitz"/> </notification> - <notification label="Grundstück wählen" name="EstateBannedAgentAdd"> - Zugang nur für dieses Grundstück oder für [ALL_ESTATES] verweigern? - <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundstücke" yestext="Dieses Grundstück"/> + <notification label="Grundbesitz wählen" name="EstateBannedAgentAdd"> + Zugang nur für diesen Grundbesitz oder für [ALL_ESTATES] verweigern? + <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundbesitze" yestext="Diesen Grundbesitz"/> </notification> - <notification label="Grundstück wählen" name="EstateBannedAgentRemove"> - Einwohner nur für dieses Grundstück oder für alle [ALL_ESTATES] von der Bannliste entfernen? - <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundstücke" yestext="Dieses Grundstück"/> + <notification label="Grundbesitz wählen" name="EstateBannedAgentRemove"> + Einwohner nur für diesen Grundbesitz oder für alle [ALL_ESTATES] von der Bannliste entfernen? + <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundbesitze" yestext="Diesen Grundbesitz"/> </notification> - <notification label="Grundstück wählen" name="EstateManagerAdd"> - Verwalter nur für dieses Grundstück oder für [ALL_ESTATES] festlegen? - <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundstücke" yestext="Dieses Grundstück"/> + <notification label="Grundbesitz wählen" name="EstateManagerAdd"> + Verwalter nur für diesen Grundbesitz oder für [ALL_ESTATES] festlegen? + <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundbesitze" yestext="Diesen Grundbesitz"/> </notification> - <notification label="Grundstück wählen" name="EstateManagerRemove"> - Verwalter nur für dieses Grundstück oder für [ALL_ESTATES] entfernen? - <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundstücke" yestext="Dieses Grundstück"/> + <notification label="Grundbesitz wählen" name="EstateManagerRemove"> + Verwalter nur für diesen Grundbesitz oder für [ALL_ESTATES] entfernen? + <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundbesitze" yestext="Diesen Grundbesitz"/> </notification> <notification label="Rauswurf bestätigen" name="EstateKickUser"> - Benutzer [EVIL_USER] von diesem Grundstück werfen? + Benutzer [EVIL_USER] von diesem Grundbesitz werfen? <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> </notification> <notification name="EstateChangeCovenant"> - Möchten Sie den Grundstücksvertrag wirklich ändern? + Möchten Sie den Grundbesitzvertrag wirklich ändern? <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> </notification> <notification name="RegionEntryAccessBlocked"> @@ -1496,15 +1544,18 @@ Möchten Sie unsere Knowledgebase besuchen, um mehr Informationen über Alterein Aufgrund Ihrer Alterseinstufung dürfen Sie diese Region nicht betreten. </notification> <notification name="RegionEntryAccessBlocked_Change"> - Sie dürfen diese Region aufgrund der Einstellung Ihrer Alterseinstufung nicht betreten. + Sie dürfen diese Region aufgrund der Einstellung Ihrer Inhaltseinstufung nicht betreten. -Klicken Sie auf „Einstellung ändern“, um Ihre Einstellung für Altereinstufung sofort zu ändern und Zugang zu erhalten. Sie können ab sofort [REGIONMATURITY]-Inhalt suchen und auf diesen zugreifen. Falls Sie diese Einstellung später rückgängig machen möchten, gehen Sie zu Bearbeiten > Einstellungen > Allgemein. +Bitte ändern Sie Ihre Einstellungen bezüglich der Inhaltseinstufung, um die gewünschte Region zu betreten. Danach können Sie nach [REGIONMATURITY]-Inhalt suchen und auf diesen zugreifen. Um die Veränderungen rückgängig zu machen, gehen Sie zu Ich > Einstellungen > Allgemein. <form name="form"> <button name="OK" text="Einstellung ändern"/> <button name="Cancel" text="Schließen"/> <ignore name="ignore" text="Meine Alterseinstufung lässt nicht zu, dass ich eine Region betrete."/> </form> </notification> + <notification name="PreferredMaturityChanged"> + Ihre Inhaltseinstufung ist jetzt [RATING]. + </notification> <notification name="LandClaimAccessBlocked"> Sie haben aufgrund Ihrer Alterseinstufung keinen Anspruch auf dieses Land. Der Grund hierfür ist möglicherweise, dass Sie nicht altersüberprüft sind. @@ -1558,14 +1609,14 @@ Klicken Sie auf „Einstellung ändern“, um Ihre Einstellung für Altereinstuf <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="ProblemImportingEstateCovenant"> - Problem beim Import des Grundstückvertrags. + Problem beim Import des Grundbesitzvertrags. <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="ProblemAddingEstateManager"> - Es gibt Probleme beim Hinzufügen eines neuen Grundstücksverwalters. Bei mindestens einem Grundstück ist die Verwalterliste voll. + Es gibt Probleme beim Hinzufügen eines neuen Grundbesitzverwalters. Bei mindestens einem Grundbesitz ist die Verwalterliste voll. </notification> <notification name="ProblemAddingEstateGeneric"> - Problem beim Hinzufügen zu dieser Grundstücksliste. Bei mindestens einem Grundstück ist die Liste voll. + Problem beim Hinzufügen zu dieser Grundbesitzliste. Bei mindestens einem Grundbesitz ist die Liste voll. </notification> <notification name="UnableToLoadNotecardAsset"> Notizkarten-Asset konnte nicht geladen werden. @@ -1713,7 +1764,7 @@ Inventarobjekt(e) verschieben? <notification name="ClickActionNotPayable"> Achtung: Die Klickaktion „Objekt bezahlen" wurde eingestellt. Diese funktioniert jedoch nicht, wenn ein Skript mit einer Geldtransaktion () hinzugefügt wird. <form name="form"> - <ignore name="ignore" text="I habe die Aktion „Objekt bezahlen" eingestellt, während ich ein Objekt gebaut habe, dass kein Geld()-Skript enthält."/> + <ignore name="ignore" text="Ich habe die Aktion „Objekt bezahlen" eingestellt, während ich ein Objekt gebaut habe, dass kein Geld()-Skript enthält."/> </form> </notification> <notification name="OpenObjectCannotCopy"> @@ -1728,9 +1779,9 @@ Inventarobjekt(e) verschieben? <usetemplate ignoretext="Bestätigen, bevor Sitzung beendet wird" name="okcancelignore" notext="Nicht beenden" yestext="Beenden"/> </notification> <notification name="HelpReportAbuseEmailLL"> - Mit dieser Funktion können Sie Verstöße gegen die [http://secondlife.com/corporate/tos.php Servicebedingungen (EN)] and [http://secondlife.com/corporate/cs.php Community-Standards] melden. + Mit dieser Funktion können Sie Verstöße gegen die [http://secondlife.com/corporate/tos.php Servicebedingungen (EN)] und [http://secondlife.com/corporate/cs.php Community-Standards] melden. -Alle gemeldeten Verstöße werden bearbeitet. Sie können auf der Seite [http://secondlife.com/support/incidentreport.php Verstoßmeldungen] nachverfolgen, welche Verstoßmeldungen bearbeitet wurden. +Alle gemeldeten Verstöße werden bearbeitet. </notification> <notification name="HelpReportAbuseSelectCategory"> Wählen Sie eine Missbrauchskategorie aus. @@ -1920,6 +1971,9 @@ Von einer Webseite zu diesem Formular linken, um anderen leichten Zugang zu dies <notification name="SystemMessageTip"> [MESSAGE] </notification> + <notification name="IMSystemMessageTip"> + [MESSAGE] + </notification> <notification name="Cancelled"> Abgebrochen </notification> @@ -1948,6 +2002,11 @@ Von einer Webseite zu diesem Formular linken, um anderen leichten Zugang zu dies In-Welt- und Website-Fotos werden hochgeladen... (Dauert ca. 5 Minuten.) </notification> + <notification name="UploadConfirmation"> + Kosten für Hochladen: [AMOUNT] L$. +Möchten Sie fortfahren? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Hochladen"/> + </notification> <notification name="UploadPayment"> Sie haben für das Hochladen [AMOUNT] L$ bezahlt. </notification> @@ -2049,9 +2108,9 @@ Wählen Sie ein einzelnes Objekt aus. Ihre Visitenkarte wurde abgelehnt. </notification> <notification name="TeleportToLandmark"> - Sie können an Positionen wie „[NAME]“ teleportieren, wenn Sie rechts in Ihrem Bildschirm die Tafel „Orte“ öffnen und dann die Registerkarte „Landmarken“ auswählen. -Klicken Sie auf eine Landmarke, um diese auszuwählen. Klicken Sie anschließend auf „Teleport“ unten in der Konsole. -(Sie können auch auf die Landmarke doppelt klicken oder mit rechts auf die Landmarke klicken und dann „Teleport“ auswählen). + Sie können an Positionen wie „[NAME]“ teleportieren, wenn Sie rechts in Ihrem Bildschirm die Tafel „Orte“ öffnen und dann die Registerkarte „Meine Landmarken“ auswählen. +Klicken Sie auf eine Landmarke, um diese auszuwählen. Klicken Sie anschließend auf unten in der Registerkarte auf „Teleportieren“. +(Sie können auch auf die Landmarke doppelt klicken oder mit rechts auf die Landmarke klicken und dann „Teleportieren“ auswählen). </notification> <notification name="TeleportToPerson"> Sie können Einwohner wie „[NAME]“ kontaktieren, wenn Sie die Tafel „Leute“ auf der rechten Seite Ihres Bildschirms öffnen. @@ -2066,7 +2125,7 @@ Wählen Sie eine kleinere Landfläche. Einige Begriffe in Ihrer Suchanfrage wurden ausgeschlossen, aufgrund von in den Community Standards definierten Inhaltsbeschränkungen. </notification> <notification name="NoContentToSearch"> - Bitte wählen Sie mindestens eine Inhaltsart für die Suche aus (Allgemein, Moderat oder Adult). + Bitte wählen Sie mindestens eine Inhaltsart für die Suche aus (Generell, Moderat oder Adult). </notification> <notification name="GroupVote"> [NAME] hat eine Abstimmung vorgeschlagen über: @@ -2140,7 +2199,7 @@ Nicht transferierbare an die Gruppe übertragene Objekte wurden gelöscht. </notification> <notification name="ServerObjectMessage"> Nachricht von [NAME]: -[MSG] +<nolink>[MSG]</nolink> </notification> <notification name="NotSafe"> Auf diesem Land ist Schaden aktiviert. @@ -2188,10 +2247,10 @@ Bitte besuchen Sie unsere Knowledgebase, um mehr Details über Zugang zu Regione Die für den Zutritt zu dieser Region erforderlichen Zahlungsinformationen liegen nicht vor. </notification> <notification name="MustGetAgeRgion"> - Sie müssen alterüberprüft sein, um diese Region betreten zu können. + Sie müssen altersüberprüft sein, um diese Region betreten zu können. </notification> <notification name="MustGetAgeParcel"> - Sie müssen alterüberprüft sein, um diese Parzelle betreten zu können. + Sie müssen altersüberprüft sein, um diese Parzelle betreten zu können. </notification> <notification name="NoDestRegion"> Keine Zielregion gefunden. @@ -2260,22 +2319,13 @@ Versuchen Sie es in einigen Minuten erneut. <button name="Mute" text="Ignorieren"/> </form> </notification> - <notification name="ObjectGiveItemUnknownUser"> - Ein Objekt namens [OBJECTFROMNAME] von (einem unbekannten Einwohner) hat Ihnen folgendes übergeben [OBJECTTYPE]: -[ITEM_SLURL] - <form name="form"> - <button name="Keep" text="Behalten"/> - <button name="Discard" text="Verwerfen"/> - <button name="Mute" text="Ignorieren"/> - </form> - </notification> <notification name="UserGiveItem"> [NAME_SLURL] hat Ihnen folgendes [OBJECTTYPE] übergeben: [ITEM_SLURL] <form name="form"> <button name="Show" text="Anzeigen"/> <button name="Discard" text="Verwerfen"/> - <button name="Mute" text="Ignorieren"/> + <button name="Mute" text="Blockieren"/> </form> </notification> <notification name="GodMessage"> @@ -2292,9 +2342,9 @@ Versuchen Sie es in einigen Minuten erneut. </form> </notification> <notification name="TeleportOffered"> - [NAME] hat Ihnen einen Teleport an seine/ihre Position angeboten: + [NAME_SLURL] hat Ihnen einen Teleport an seine/ihre Position angeboten: -[MESSAGE] +[MESSAGE] - [MATURITY_STR] <icon>[MATURITY_ICON]</icon> <form name="form"> <button name="Teleport" text="Teleportieren"/> <button name="Cancel" text="Abbrechen"/> @@ -2312,15 +2362,14 @@ Versuchen Sie es in einigen Minuten erneut. </form> </notification> <notification name="OfferFriendship"> - [NAME] bietet Ihnen die Freundschaft an. + [NAME_SLURL] bietet Ihnen die Freundschaft an. [MESSAGE] -(Standardmäßig werden Sie gegenseitig ihren Online-Status sehen können.) +(Standardmäßig können Sie gegenseitig ihren Online-Status sehen.) <form name="form"> <button name="Accept" text="Akzeptieren"/> <button name="Decline" text="Ablehnen"/> - <button name="Send IM" text="IM senden"/> </form> </notification> <notification name="FriendshipOffered"> @@ -2341,6 +2390,12 @@ Versuchen Sie es in einigen Minuten erneut. <notification name="FriendshipDeclined"> [NAME] hat Ihr Freundschaftsangebot abgelehnt. </notification> + <notification name="FriendshipAcceptedByMe"> + Ihr Freundschaftsangebot wurde angeommen. + </notification> + <notification name="FriendshipDeclinedByMe"> + Ihr Freundschaftsangebot wurde abgelehnt. + </notification> <notification name="OfferCallingCard"> [FIRST] [LAST] bietet Ihnen ihre/seine Visitenkarte an. Ihrem Inventar wird ein Lesezeichen erstellt, damit Sie diesem Einwohner einfach eine IM schicken können. @@ -2350,7 +2405,7 @@ Ihrem Inventar wird ein Lesezeichen erstellt, damit Sie diesem Einwohner einfach </form> </notification> <notification name="RegionRestartMinutes"> - Diese Region wird in [Minuten] neu gestartet. + Diese Region wird in [MINUTES] neu gestartet. Wenn Sie in dieser Region bleiben, werden Sie abgemeldet. </notification> <notification name="RegionRestartSeconds"> @@ -2374,6 +2429,9 @@ Von Objekt: [OBJECTNAME], Eigentümer: [NAME]? <notification name="FailedToFindWearable"> [TYPE] namens [DESC] nicht in Datenbank. </notification> + <notification name="ShareToWebFailed"> + Bild aus Internet konnte nicht hochgeladen werden. + </notification> <notification name="InvalidWearable"> Dieser Artikel verwendet eine Funktion, die Ihr Viewer nicht unterstützt. Bitte aktualisieren Sie Ihre Version von [APP_NAME], um dieses Objekt anziehen zu können. </notification> @@ -2415,14 +2473,6 @@ Anfrage gestatten? <button name="Ignore" text="Ignorieren"/> </form> </notification> - <notification name="ScriptToast"> - [FIRST] [LAST]s '[TITLE]' fordert Eingaben vom Benutzer an. - <form name="form"> - <button name="Open" text="Dialog öffnen"/> - <button name="Ignore" text="Ignorieren"/> - <button name="Block" text="Ignorieren"/> - </form> - </notification> <notification name="BuyLindenDollarSuccess"> Vielen Dank für Ihre Zahlung. @@ -2514,6 +2564,21 @@ Klicken Sie auf 'Akzeptieren ', um dem Chat beizutreten, oder auf &a <notification name="VoiceLoginRetry"> Wir erstellen einen Voice-Kanal für Sie. Bitte warten Sie einen Moment. </notification> + <notification name="VoiceEffectsExpired"> + Ein oder mehrere Ihrer Voice-Morph-Abos ist/sind abgelaufen. +[[URL] Hier klicken], um Ihr Abo zu erneuern. + </notification> + <notification name="VoiceEffectsExpiredInUse"> + Das aktive Voice-Morph-Abo ist abgelaufen. Ihre normalen Voice-Einstellungen werden angewendet. +[[URL] Hier klicken], um Ihr Abo zu erneuern. + </notification> + <notification name="VoiceEffectsWillExpire"> + Ein oder mehrere Ihrer Voice-Morph-Abos werden in weniger als [INTERVAL] Tagen ablaufen. +[[URL] Hier klicken], um Ihr Abo zu erneuern. + </notification> + <notification name="VoiceEffectsNew"> + Neue Voice-Morph-Effekte sind erhältlich! + </notification> <notification name="Cannot enter parcel: not a group member"> Nur Mitglieder einer bestimmten Gruppe dürfen diesen Bereich betreten. </notification> @@ -2550,7 +2615,7 @@ Diese werden für ein paar Sekunden sicherheitshalber gesperrt. </notification> <notification name="ConfirmCloseAll"> Möchten Sie wirklich alle IMs schließen? - <usetemplate name="okcancelignore" notext="Abbrechen" yestext="OK"/> + <usetemplate ignoretext="Bestätigen, bevor ich alle IMs schließe." name="okcancelignore" notext="Abbrechen" yestext="OK"/> </notification> <notification name="AttachmentSaved"> Der Anhang wurde gespeichert. @@ -2579,6 +2644,60 @@ Diese werden für ein paar Sekunden sicherheitshalber gesperrt. Die ausgewählte Schaltfläche kann zur Zeit nicht angezeigt werden. Die Schaltfläche wird angezeigt, wenn genügend Platz vorhanden ist. </notification> + <notification name="ShareNotification"> + Wählen Sie Einwohner aus, für die Sie das Objekt freigeben möchten. + </notification> + <notification name="ShareItemsConfirmation"> + Möchten Sie diese Objekte wirklich für andere freigeben: + +[ITEMS] + +Für folgende Einwohner: + +[RESIDENTS] + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="ItemsShared"> + Objekte wurden erfolgreich freigegeben. + </notification> + <notification name="AvatarRezNotification"> + (Seit [EXISTENCE] Sekunden inworld ) +Avatar '[NAME]' wurde in [TIME] Sekunden gerezzt. + </notification> + <notification name="AvatarRezSelfBakedDoneNotification"> + (Seit [EXISTENCE] Sekunden inworld ) +Ihr Outfit wurde in [TIME] Sekunden gebacken. + </notification> + <notification name="AvatarRezSelfBakedUpdateNotification"> + (Seit [EXISTENCE] Sekunden inworld ) +Nach [TIME] Sekunden wurde eine Aktualisierung Ihres Aussehens gesendet. +[STATUS] + </notification> + <notification name="NoConnect"> + Es gibt Probleme mit der Verbindung mit [PROTOCOL] [HOSTID]. +Bitte überprüfen Sie Ihre Netzwerk- und Firewalleinstellungen. + <form name="form"> + <button name="OK" text="OK"/> + </form> + </notification> + <notification name="NoVoiceConnect"> + Verbindung mit Voice-Server ist leider nicht möglich: + +[HOSTID] + +Voice-Kommunikation ist leider nicht verfügbar. +Bitte überprüfen Sie Ihr Netzwerk- und Firewall-Setup. + <form name="form"> + <button name="OK" text="OK"/> + </form> + </notification> + <notification name="AvatarRezSelfBakeNotification"> + (Seit [EXISTENCE] Sekunden inworld ) +Die [RESOLUTION]-gebakene Textur für '[BODYREGION]' wurde in [TIME] Sekunden hochgeladen. + </notification> + <notification name="ConfirmMuteAll"> + <usetemplate ignoretext="Confirm before I mute all participants in a group call" name="okcancelignore" notext="Abbrechen" yestext="OK"/> + </notification> <global name="UnsupportedCPU"> - Ihre CPU-Geschwindigkeit entspricht nicht den Mindestanforderungen. </global> @@ -2600,7 +2719,7 @@ Sollte das Problem fortbestehen, finden Sie weitere Hilfestellung unter [SUPPORT - Ihr Arbeitsspeicher entspricht nicht den Mindestanforderungen. </global> <global name="You can only set your 'Home Location' on your land or at a mainland Infohub."> - Wenn Sie ein Stück Land besitzen, können Sie dies als Ihren Heimatort festlegen. + Wenn Sie ein Stück Land besitzen, können Sie dies als Ihr Zuhause festlegen. Ansonsten können Sie auf der Karte nachsehen und dort Ort suchen, die als „Infohub“ gekennzeichnet sind. </global> </notifications> diff --git a/indra/newview/skins/default/xui/de/outfit_accordion_tab.xml b/indra/newview/skins/default/xui/de/outfit_accordion_tab.xml new file mode 100644 index 0000000000..bac885e5d8 --- /dev/null +++ b/indra/newview/skins/default/xui/de/outfit_accordion_tab.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- *NOTE: mantipov: this xml is intended to be used inside panel_outfits_list.xml for each outfit folder--> +<!-- All accordion tabs in the My Appearance/My Outfits panel will be created from this one at runtume--> +<accordion_tab name="Mockup Tab" title="Mockup Tab"/> diff --git a/indra/newview/skins/default/xui/de/panel_block_list_sidetray.xml b/indra/newview/skins/default/xui/de/panel_block_list_sidetray.xml index eb4832770e..2d140515d4 100644 --- a/indra/newview/skins/default/xui/de/panel_block_list_sidetray.xml +++ b/indra/newview/skins/default/xui/de/panel_block_list_sidetray.xml @@ -1,9 +1,9 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="block_list_panel"> - <text name="title_text"> +<panel name="block_list_panel" width="300"> + <text left_pad="5" name="title_text" width="260"> Liste der ignorierten Einwohner </text> - <scroll_list name="blocked" tool_tip="Liste der zur Zeit ignorierten Einwohner"/> + <scroll_list name="blocked" tool_tip="Liste der zur Zeit ignorierten Einwohner" width="290"/> <button label="Einwohner ignorieren" label_selected="Einwohner ignorieren..." name="Block resident..." tool_tip="Wählen Sie einen Einwohner, um ihn zu ignorieren"/> <button label="Objekt nach Name ignorieren" label_selected="Objekt nach Name ignorieren..." name="Block object by name..." tool_tip="Ein Objekt auswählen, um nach Namen zu ignorieren."/> <button label="Freischalten" label_selected="Freischalten" name="Unblock" tool_tip="Einwohner oder Objekt von der Liste der ignorierten Einwohner oder Objekte entfernen"/> diff --git a/indra/newview/skins/default/xui/de/panel_bottomtray.xml b/indra/newview/skins/default/xui/de/panel_bottomtray.xml index 7a627e32c8..83f67344ca 100644 --- a/indra/newview/skins/default/xui/de/panel_bottomtray.xml +++ b/indra/newview/skins/default/xui/de/panel_bottomtray.xml @@ -7,6 +7,11 @@ Voice-Chat-Steuerung anzeigen/ausblenden </string> <layout_stack name="toolbar_stack"> + <layout_panel name="speak_panel"> + <talk_button name="talk"> + <speak_button label="Sprechen" label_selected="Sprechen" name="speak_btn" /> + </talk_button> + </layout_panel> <layout_panel name="gesture_panel"> <gesture_combo_list label="Gesten" name="Gesture" tool_tip="Gesten anzeigen/ausblenden"/> </layout_panel> diff --git a/indra/newview/skins/default/xui/de/panel_bottomtray_lite.xml b/indra/newview/skins/default/xui/de/panel_bottomtray_lite.xml new file mode 100644 index 0000000000..9c84105254 --- /dev/null +++ b/indra/newview/skins/default/xui/de/panel_bottomtray_lite.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="bottom_tray_lite"> + <layout_stack name="toolbar_stack_lite"> + <layout_panel name="gesture_panel"> + <gesture_combo_list label="Gesten" name="Gesture" tool_tip="Gesten anzeigen/ausblenden"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/default/xui/de/panel_classified_info.xml b/indra/newview/skins/default/xui/de/panel_classified_info.xml index d45e28f0c8..ac1cd7ba88 100644 --- a/indra/newview/skins/default/xui/de/panel_classified_info.xml +++ b/indra/newview/skins/default/xui/de/panel_classified_info.xml @@ -4,20 +4,51 @@ Moderat </panel.string> <panel.string name="type_pg"> - Allgemeiner Inhalt + Genereller Inhalt </panel.string> - <text name="title" value="Informationen über Anzeige"/> + <panel.string name="l$_price"> + [PRICE] L$ + </panel.string> + <panel.string name="click_through_text_fmt"> + [TELEPORT] teleportieren, [MAP] Karte, [PROFILE] Profil + </panel.string> + <panel.string name="date_fmt"> + [mthnum,datetime,slt]/[day,datetime,slt]/[year,datetime,slt] + </panel.string> + <panel.string name="auto_renew_on"> + Aktiviert + </panel.string> + <panel.string name="auto_renew_off"> + Deaktiviert + </panel.string> + <text name="title" value="Anzeigen-Info"/> <scroll_container name="profile_scroll"> <panel name="scroll_content_panel"> - <text name="classified_name" value="[name]"/> - <text name="classified_location" value="[wird geladen...]"/> - <text name="content_type" value="[Inhalts-Art]"/> - <text name="category" value="[Kategorie]"/> - <check_box label="Jede Woche automatisch erneuern" name="auto_renew"/> - <text name="price_for_listing" tool_tip="Preis für Anzeige."> - [PRICE] L$ - </text> - <text name="classified_desc" value="[description]"/> + <text_editor name="classified_name" value="[name]"/> + <text name="classified_location_label" value="Standort:"/> + <text_editor name="classified_location" value="[loading...]"/> + <text name="content_type_label" value="Inhaltsart:"/> + <text_editor name="content_type" value="[Inhalts-Art]"/> + <text name="category_label" value="Kategorie:"/> + <text_editor name="category" value="[Kategorie]"/> + <text name="creation_date_label" value="Erstellungsdatum:"/> + <text_editor name="creation_date" tool_tip="Erstellungsdatum" value="[date]"/> + <text name="price_for_listing_label" value="Preis für Anzeige:"/> + <text_editor name="price_for_listing" tool_tip="Preis für Anzeige." value="[price]"/> + <layout_stack name="descr_stack"> + <layout_panel name="clickthrough_layout_panel"> + <text name="click_through_label" value="Klicks:"/> + <text_editor name="click_through_text" tool_tip="Click-Through-Daten" value="[clicks]"/> + </layout_panel> + <layout_panel name="price_layout_panel"> + <text name="auto_renew_label" value="Autom. erneuern:"/> + <text name="auto_renew" value="Aktiviert"/> + </layout_panel> + <layout_panel name="descr_layout_panel"> + <text name="classified_desc_label" value="Beschreibung:"/> + <text_editor name="classified_desc" value="[description]"/> + </layout_panel> + </layout_stack> </panel> </scroll_container> <panel name="buttons"> diff --git a/indra/newview/skins/default/xui/de/panel_edit_alpha.xml b/indra/newview/skins/default/xui/de/panel_edit_alpha.xml index 4b48950341..b6c53be778 100644 --- a/indra/newview/skins/default/xui/de/panel_edit_alpha.xml +++ b/indra/newview/skins/default/xui/de/panel_edit_alpha.xml @@ -1,10 +1,10 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="edit_alpha_panel"> - <panel name="avatar_alpha_color_panel"> - <texture_picker label="Alpha: Unten" name="Lower Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken"/> - <texture_picker label="Alpha: Oben" name="Upper Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken"/> +<panel name="edit_alpha_panel" width="320"> + <panel name="avatar_alpha_color_panel" width="300"> + <texture_picker label="Alpha: Unten" name="Lower Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken" width="70"/> + <texture_picker label="Alpha: Oben" name="Upper Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken" width="66"/> <texture_picker label="Kopf: Alpha" name="Head Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken"/> - <texture_picker label="Alpha: Augen" name="Eye Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken"/> - <texture_picker label="Alpha: Haare" name="Hair Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken"/> + <texture_picker label="Alpha: Augen" name="Eye Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken" width="72"/> + <texture_picker label="Alpha: Haare" name="Hair Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken" width="70"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/de/panel_edit_classified.xml b/indra/newview/skins/default/xui/de/panel_edit_classified.xml index a9b5da163f..0d9487e895 100644 --- a/indra/newview/skins/default/xui/de/panel_edit_classified.xml +++ b/indra/newview/skins/default/xui/de/panel_edit_classified.xml @@ -3,12 +3,20 @@ <panel.string name="location_notice"> (wird nach Speichern aktualisiert) </panel.string> + <string name="publish_label"> + Veröffentlichen + </string> + <string name="save_label"> + Speichern + </string> <text name="title"> Anzeige bearbeiten </text> <scroll_container name="profile_scroll"> <panel name="scroll_content_panel"> - <icon label="" name="edit_icon" tool_tip="Klicken, um ein Bild auszuwählen"/> + <panel name="snapshot_panel"> + <icon label="" name="edit_icon" tool_tip="Klicken, um ein Bild auszuwählen"/> + </panel> <text name="Name:"> Titel: </text> @@ -21,21 +29,20 @@ <text name="classified_location"> wird geladen... </text> - <button label="Auf aktuelle Position einstellen" name="set_to_curr_location_btn"/> - <combo_box name="content_type"> - <combo_item name="mature_ci"> - Moderater Inhalt - </combo_item> - <combo_item name="pg_ci"> - Allgemeiner Inhalt - </combo_item> - </combo_box> + <button label="Aktuellen Standort verwenden" name="set_to_curr_location_btn"/> + <text name="category_label" value="Kategorie:"/> + <text name="content_type_label" value="Inhaltsart:"/> + <icons_combo_box label="Genereller Inhalt" name="content_type"> + <icons_combo_box.item label="Moderater Inhalt" name="mature_ci" value="Moderat"/> + <icons_combo_box.item label="Genereller Inhalt" name="pg_ci" value="G"/> + </icons_combo_box> + <text name="price_for_listing_label" value="Preis für Anzeige:"/> <spinner label="L$" name="price_for_listing" tool_tip="Preis für Anzeige." value="50"/> <check_box label="Jede Woche automatisch erneuern" name="auto_renew"/> </panel> </scroll_container> <panel label="bottom_panel" name="bottom_panel"> - <button label="Speichern" name="save_changes_btn"/> + <button label="[LABEL]" name="save_changes_btn"/> <button label="Abbrechen" name="cancel_btn"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/de/panel_edit_eyes.xml b/indra/newview/skins/default/xui/de/panel_edit_eyes.xml index 31251ed48f..69bcf2fb71 100644 --- a/indra/newview/skins/default/xui/de/panel_edit_eyes.xml +++ b/indra/newview/skins/default/xui/de/panel_edit_eyes.xml @@ -3,7 +3,9 @@ <panel name="avatar_eye_color_panel"> <texture_picker label="Iris" name="Iris" tool_tip="Zum Auswählen eines Bildes hier klicken"/> </panel> - <accordion name="wearable_accordion"> - <accordion_tab name="eyes_main_tab" title="Augen"/> - </accordion> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="eyes_main_tab" title="Augen"/> + </accordion> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/de/panel_edit_gloves.xml b/indra/newview/skins/default/xui/de/panel_edit_gloves.xml index 2d11befbfd..ad87e432d6 100644 --- a/indra/newview/skins/default/xui/de/panel_edit_gloves.xml +++ b/indra/newview/skins/default/xui/de/panel_edit_gloves.xml @@ -4,7 +4,9 @@ <texture_picker label="Stoff" name="Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/> <color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/> </panel> - <accordion name="wearable_accordion"> - <accordion_tab name="gloves_main_tab" title="Handschuhe"/> - </accordion> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="gloves_main_tab" title="Handschuhe"/> + </accordion> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/de/panel_edit_hair.xml b/indra/newview/skins/default/xui/de/panel_edit_hair.xml index d255b1c16c..d6efde8306 100644 --- a/indra/newview/skins/default/xui/de/panel_edit_hair.xml +++ b/indra/newview/skins/default/xui/de/panel_edit_hair.xml @@ -3,10 +3,12 @@ <panel name="avatar_hair_color_panel"> <texture_picker label="Textur" name="Texture" tool_tip="Zum Auswählen eines Bildes hier klicken"/> </panel> - <accordion name="wearable_accordion"> - <accordion_tab name="hair_color_tab" title="Farbe"/> - <accordion_tab name="hair_style_tab" title="Stil"/> - <accordion_tab name="hair_eyebrows_tab" title="Augenbrauen"/> - <accordion_tab name="hair_facial_tab" title="Gesicht"/> - </accordion> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="hair_color_tab" title="Farbe"/> + <accordion_tab name="hair_style_tab" title="Stil"/> + <accordion_tab name="hair_eyebrows_tab" title="Augenbrauen"/> + <accordion_tab name="hair_facial_tab" title="Gesicht"/> + </accordion> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/de/panel_edit_jacket.xml b/indra/newview/skins/default/xui/de/panel_edit_jacket.xml index 3752faf48a..8fe76f6225 100644 --- a/indra/newview/skins/default/xui/de/panel_edit_jacket.xml +++ b/indra/newview/skins/default/xui/de/panel_edit_jacket.xml @@ -1,11 +1,13 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="edit_jacket_panel"> <panel name="avatar_jacket_color_panel"> - <texture_picker label="Oberstoff" name="Upper Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/> - <texture_picker label="Unterstoff" name="Lower Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/> + <texture_picker label="Stoff: oben" name="Upper Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/> + <texture_picker label="Stoff: unten" name="Lower Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/> <color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/> </panel> - <accordion name="wearable_accordion"> - <accordion_tab name="jacket_main_tab" title="Jacke"/> - </accordion> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="jacket_main_tab" title="Jacke"/> + </accordion> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/de/panel_edit_pants.xml b/indra/newview/skins/default/xui/de/panel_edit_pants.xml index 1ff439dc26..d40a27c5fd 100644 --- a/indra/newview/skins/default/xui/de/panel_edit_pants.xml +++ b/indra/newview/skins/default/xui/de/panel_edit_pants.xml @@ -4,7 +4,9 @@ <texture_picker label="Stoff" name="Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/> <color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/> </panel> - <accordion name="wearable_accordion"> - <accordion_tab name="pants_main_tab" title="Hose"/> - </accordion> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="pants_main_tab" title="Hose"/> + </accordion> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/de/panel_edit_pick.xml b/indra/newview/skins/default/xui/de/panel_edit_pick.xml index bd05a4151e..1ec4f09161 100644 --- a/indra/newview/skins/default/xui/de/panel_edit_pick.xml +++ b/indra/newview/skins/default/xui/de/panel_edit_pick.xml @@ -1,5 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Auswahl bearbeiten" name="panel_edit_pick"> + <panel.string name="location_notice"> + (wird nach Speichern aktualisiert) + </panel.string> <text name="title"> Auswahl bearbeiten </text> @@ -18,11 +21,11 @@ <text name="pick_location"> wird geladen... </text> - <button label="Auf aktuelle Position einstellen" name="set_to_curr_location_btn"/> + <button label="Aktuellen Standort verwenden" name="set_to_curr_location_btn"/> </panel> </scroll_container> <panel label="bottom_panel" name="bottom_panel"> - <button label="[WHAT] speichern" name="save_changes_btn"/> + <button label="Auswahl speichern" name="save_changes_btn"/> <button label="Abbrechen" name="cancel_btn"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/de/panel_edit_profile.xml b/indra/newview/skins/default/xui/de/panel_edit_profile.xml index f643115dbe..bf74abaeba 100644 --- a/indra/newview/skins/default/xui/de/panel_edit_profile.xml +++ b/indra/newview/skins/default/xui/de/panel_edit_profile.xml @@ -42,13 +42,13 @@ <line_editor name="homepage_edit" value="http://"/> <check_box label="In Suchergebnissen anzeigen" name="show_in_search_checkbox"/> <text name="title_acc_status_text" value="Mein Konto:"/> + <text_editor name="acc_status_text" value="Einwohner. Keine Zahlungsinfo archiviert."/> <text name="my_account_link" value="[[URL] Meine Startseite aufrufen]"/> - <text name="acc_status_text" value="Einwohner. Keine Zahlungsinfo archiviert."/> <text name="title_partner_text" value="Mein Partner:"/> - <text name="partner_edit_link" value="[[URL] bearbeiten]"/> <panel name="partner_data_panel"> - <name_box name="partner_text" value="[FIRST] [LAST]"/> + <name_box initial_value="(wird in Datenbank gesucht)" name="partner_text" value="[FIRST] [LAST]"/> </panel> + <text name="partner_edit_link" value="[[URL] bearbeiten]"/> </panel> </panel> </scroll_container> diff --git a/indra/newview/skins/default/xui/de/panel_edit_shape.xml b/indra/newview/skins/default/xui/de/panel_edit_shape.xml index 37be3c1d90..d04dba7a3b 100644 --- a/indra/newview/skins/default/xui/de/panel_edit_shape.xml +++ b/indra/newview/skins/default/xui/de/panel_edit_shape.xml @@ -1,23 +1,25 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="edit_shape_panel"> - <panel name="avatar_sex_panel"> - <text name="gender_text"> - Geschlecht: - </text> - <radio_group name="sex_radio"> - <radio_item label="weiblich" name="radio"/> - <radio_item label="Männlich" name="radio2"/> - </radio_group> + <string name="meters"> + Meter + </string> + <string name="feet"> + Fuß + </string> + <string name="height"> + Höhe: + </string> + <panel label="Hemd" name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="shape_body_tab" title="Körper"/> + <accordion_tab name="shape_head_tab" title="Kopf"/> + <accordion_tab name="shape_eyes_tab" title="Augen"/> + <accordion_tab name="shape_ears_tab" title="Ohren"/> + <accordion_tab name="shape_nose_tab" title="Nase"/> + <accordion_tab name="shape_mouth_tab" title="Mund"/> + <accordion_tab name="shape_chin_tab" title="Kinn"/> + <accordion_tab name="shape_torso_tab" title="Oberkörper"/> + <accordion_tab name="shape_legs_tab" title="Beine"/> + </accordion> </panel> - <accordion name="wearable_accordion"> - <accordion_tab name="shape_body_tab" title="Körper"/> - <accordion_tab name="shape_head_tab" title="Kopf"/> - <accordion_tab name="shape_eyes_tab" title="Augen"/> - <accordion_tab name="shape_ears_tab" title="Ohren"/> - <accordion_tab name="shape_nose_tab" title="Nase"/> - <accordion_tab name="shape_mouth_tab" title="Mund"/> - <accordion_tab name="shape_chin_tab" title="Kinn"/> - <accordion_tab name="shape_torso_tab" title="Oberkörper"/> - <accordion_tab name="shape_legs_tab" title="Beine"/> - </accordion> </panel> diff --git a/indra/newview/skins/default/xui/de/panel_edit_shirt.xml b/indra/newview/skins/default/xui/de/panel_edit_shirt.xml index 6025606777..344b0b412a 100644 --- a/indra/newview/skins/default/xui/de/panel_edit_shirt.xml +++ b/indra/newview/skins/default/xui/de/panel_edit_shirt.xml @@ -4,7 +4,9 @@ <texture_picker label="Stoff" name="Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/> <color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/> </panel> - <accordion name="wearable_accordion"> - <accordion_tab name="shirt_main_tab" title="Hemd"/> - </accordion> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="shirt_main_tab" title="Hemd"/> + </accordion> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/de/panel_edit_shoes.xml b/indra/newview/skins/default/xui/de/panel_edit_shoes.xml index 15e8a21dd7..56aee5d0fe 100644 --- a/indra/newview/skins/default/xui/de/panel_edit_shoes.xml +++ b/indra/newview/skins/default/xui/de/panel_edit_shoes.xml @@ -4,7 +4,9 @@ <texture_picker label="Stoff" name="Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/> <color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/> </panel> - <accordion name="wearable_accordion"> - <accordion_tab name="shoes_main_tab" title="Schuhe"/> - </accordion> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="shoes_main_tab" title="Schuhe"/> + </accordion> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/de/panel_edit_skin.xml b/indra/newview/skins/default/xui/de/panel_edit_skin.xml index 46bd1d9f4d..f167f45e98 100644 --- a/indra/newview/skins/default/xui/de/panel_edit_skin.xml +++ b/indra/newview/skins/default/xui/de/panel_edit_skin.xml @@ -5,10 +5,12 @@ <texture_picker label="Obere Tattoos" name="Upper Tattoos" tool_tip="Zum Auswählen eines Bildes hier klicken"/> <texture_picker label="Untere Tattoos" name="Lower Tattoos" tool_tip="Zum Auswählen eines Bildes hier klicken"/> </panel> - <accordion name="wearable_accordion"> - <accordion_tab name="skin_color_tab" title="Hautfarbe"/> - <accordion_tab name="skin_face_tab" title="Gesichtsdetails"/> - <accordion_tab name="skin_makeup_tab" title="Make-Uup"/> - <accordion_tab name="skin_body_tab" title="Körperdetails"/> - </accordion> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="skin_color_tab" title="Hautfarbe"/> + <accordion_tab name="skin_face_tab" title="Gesichtsdetails"/> + <accordion_tab name="skin_makeup_tab" title="Make-Up"/> + <accordion_tab name="skin_body_tab" title="Körperdetails"/> + </accordion> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/de/panel_edit_skirt.xml b/indra/newview/skins/default/xui/de/panel_edit_skirt.xml index 4fa9126c37..c8931bc947 100644 --- a/indra/newview/skins/default/xui/de/panel_edit_skirt.xml +++ b/indra/newview/skins/default/xui/de/panel_edit_skirt.xml @@ -4,7 +4,9 @@ <texture_picker label="Stoff" name="Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/> <color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/> </panel> - <accordion name="wearable_accordion"> - <accordion_tab name="skirt_main_tab" title="Rock"/> - </accordion> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="skirt_main_tab" title="Rock"/> + </accordion> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/de/panel_edit_socks.xml b/indra/newview/skins/default/xui/de/panel_edit_socks.xml index c2ecad8642..abbeefa44e 100644 --- a/indra/newview/skins/default/xui/de/panel_edit_socks.xml +++ b/indra/newview/skins/default/xui/de/panel_edit_socks.xml @@ -4,7 +4,9 @@ <texture_picker label="Stoff" name="Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/> <color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/> </panel> - <accordion name="wearable_accordion"> - <accordion_tab name="socks_main_tab" title="Socken"/> - </accordion> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="socks_main_tab" title="Strümpfe"/> + </accordion> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/de/panel_edit_tattoo.xml b/indra/newview/skins/default/xui/de/panel_edit_tattoo.xml index c05a3a6645..12649e9251 100644 --- a/indra/newview/skins/default/xui/de/panel_edit_tattoo.xml +++ b/indra/newview/skins/default/xui/de/panel_edit_tattoo.xml @@ -1,8 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="edit_tattoo_panel"> <panel name="avatar_tattoo_color_panel"> - <texture_picker label="Kopftattoo" name="Head Tattoo" tool_tip="Zum Auswählen eines Bildes hier klicken"/> - <texture_picker label="Obere Tattoos" name="Upper Tattoo" tool_tip="Zum Auswählen eines Bildes hier klicken"/> - <texture_picker label="Untere Tattoos" name="Lower Tattoo" tool_tip="Zum Auswählen eines Bildes hier klicken"/> + <texture_picker label="Kopftattoo" name="Head Tattoo" tool_tip="Zum Auswählen eines Bildes hier klicken" width="80"/> + <texture_picker label="Obere Tattoos" name="Upper Tattoo" tool_tip="Zum Auswählen eines Bildes hier klicken" width="80"/> + <texture_picker label="Untere Tattoos" name="Lower Tattoo" tool_tip="Zum Auswählen eines Bildes hier klicken" width="80"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/de/panel_edit_underpants.xml b/indra/newview/skins/default/xui/de/panel_edit_underpants.xml index 4484068c1d..03c61a495d 100644 --- a/indra/newview/skins/default/xui/de/panel_edit_underpants.xml +++ b/indra/newview/skins/default/xui/de/panel_edit_underpants.xml @@ -4,7 +4,9 @@ <texture_picker label="Stoff" name="Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/> <color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/> </panel> - <accordion name="wearable_accordion"> - <accordion_tab name="underpants_main_tab" title="Unterhose"/> - </accordion> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="underpants_main_tab" title="Unterhose"/> + </accordion> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/de/panel_edit_undershirt.xml b/indra/newview/skins/default/xui/de/panel_edit_undershirt.xml index 847f806fce..39919393e1 100644 --- a/indra/newview/skins/default/xui/de/panel_edit_undershirt.xml +++ b/indra/newview/skins/default/xui/de/panel_edit_undershirt.xml @@ -4,7 +4,9 @@ <texture_picker label="Stoff" name="Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/> <color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/> </panel> - <accordion name="wearable_accordion"> - <accordion_tab name="undershirt_main_tab" title="Unterhemd"/> - </accordion> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="undershirt_main_tab" title="Unterhemd"/> + </accordion> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/de/panel_edit_wearable.xml b/indra/newview/skins/default/xui/de/panel_edit_wearable.xml index c3ffb2f353..7294a0b34f 100644 --- a/indra/newview/skins/default/xui/de/panel_edit_wearable.xml +++ b/indra/newview/skins/default/xui/de/panel_edit_wearable.xml @@ -72,7 +72,7 @@ <string name="jacket_desc_text"> Jacke: </string> - <string name="skirt_skirt_desc_text"> + <string name="skirt_desc_text"> Rock: </string> <string name="gloves_desc_text"> diff --git a/indra/newview/skins/default/xui/de/panel_friends.xml b/indra/newview/skins/default/xui/de/panel_friends.xml index 10c5954775..50013a2b24 100644 --- a/indra/newview/skins/default/xui/de/panel_friends.xml +++ b/indra/newview/skins/default/xui/de/panel_friends.xml @@ -25,7 +25,7 @@ <button label="IM/Anruf" name="im_btn" tool_tip="Beginnt eine Instant Message-Sitzung"/> <button label="Profil" name="profile_btn" tool_tip="Bilder, Gruppen und andere Informationen anzeigen"/> <button label="Teleportieren" name="offer_teleport_btn" tool_tip="Bieten Sie diesem Freund einen Teleport an Ihre Position an"/> - <button label="Zahlen" name="pay_btn" tool_tip="Diesem Freund Linden-Dollar (L$) geben"/> + <button label="Bezahlen" name="pay_btn" tool_tip="Diesem Freund Linden-Dollar (L$) geben"/> <button label="Entfernen" name="remove_btn" tool_tip="Diese Person von Ihrer Freundesliste entfernen"/> <button label="Hinzufügen" name="add_btn" tool_tip="Bieten Sie einem Einwohner die Freundschaft an"/> </panel> diff --git a/indra/newview/skins/default/xui/de/panel_group_general.xml b/indra/newview/skins/default/xui/de/panel_group_general.xml index 8904193f18..9d4301de73 100644 --- a/indra/newview/skins/default/xui/de/panel_group_general.xml +++ b/indra/newview/skins/default/xui/de/panel_group_general.xml @@ -11,27 +11,48 @@ Bewegen Sie die Maus über die Optionen, um weitere Informationen anzuzeigen. <panel.string name="incomplete_member_data_str"> Mitgliedsdaten werden abgerufen </panel.string> + <panel name="group_info_top"> + <texture_picker label="" name="insignia" tool_tip="Klicken, um ein Bild auszuwählen"/> + <text name="prepend_founded_by"> + Gründer: + </text> + <name_box initial_value="(wird in Datenbank gesucht)" name="founder_name"/> + <text name="join_cost_text"> + Kostenlos + </text> + <button label="JETZT BEITRETEN!" name="btn_join"/> + </panel> <text_editor name="charter"> Gruppencharta </text_editor> <name_list name="visible_members"> <name_list.columns label="Mitglied" name="name" relwidth="0.40"/> <name_list.columns label="Titel" name="title" relwidth="0.25"/> + <name_list.columns label="Status" name="status"/> </name_list> + <text name="my_group_settngs_label"> + Ich + </text> <text name="active_title_label"> - Mein Titel + Mein Titel: </text> <combo_box name="active_title" tool_tip="Legt fest, was im Namensschild Ihres Avatars angezeigt wird, wenn diese Gruppe aktiviert ist."/> <check_box label="Gruppenmitteilungen erhalten" name="receive_notices" tool_tip="Festlegen, ob Sie von dieser Gruppe Mitteilungen erhalten können. Deaktivieren Sie diese Option, wenn Sie von der Gruppe Spam erhalten."/> <check_box label="In meinem Profil anzeigen" name="list_groups_in_profile" tool_tip="Steuert, ob diese Gruppe in Ihrem Profil angezeigt wird"/> <panel name="preferences_container"> - <check_box label="Registrierung offen" name="open_enrollement" tool_tip="Festlegen, ob der Gruppenbeitritt ohne Einladung zulässig ist."/> - <check_box label="Beitrittsgebühr" name="check_enrollment_fee" tool_tip="Festlegen, ob Neumitglieder eine Beitrittsgebühr zahlen müssen"/> + <text name="group_settngs_label"> + Gruppe + </text> + <check_box label="Jeder kann beitreten" name="open_enrollement" tool_tip="Festlegen, ob der Gruppenbeitritt ohne Einladung zulässig ist."/> + <check_box label="Kosten für Beitritt" name="check_enrollment_fee" tool_tip="Festlegen, ob Neumitglieder eine Beitrittsgebühr zahlen müssen"/> <spinner label="L$" name="spin_enrollment_fee" tool_tip="Wenn Beitrittsgebühr aktiviert ist, müssen neue Mitglieder diesen Betrag zahlen."/> - <check_box initial_value="true" label="In Suche anzeigen" name="show_in_group_list" tool_tip="Diese Gruppe in Suchergebnissen anzeigen"/> <combo_box name="group_mature_check" tool_tip="Legt fest, ob Ihre Gruppeninformation moderate Inhalte enthält"> - <combo_box.item label="Allgemeiner Inhalt" name="pg"/> + <combo_item name="select_mature"> + - Inhaltseinstufung auswählen - + </combo_item> <combo_box.item label="Moderater Inhalt" name="mature"/> + <combo_box.item label="Genereller Inhalt" name="pg"/> </combo_box> + <check_box initial_value="true" label="In Suche anzeigen" name="show_in_group_list" tool_tip="Diese Gruppe in Suchergebnissen anzeigen"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/de/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/de/panel_group_info_sidetray.xml index f70291c922..b89e4f90de 100644 --- a/indra/newview/skins/default/xui/de/panel_group_info_sidetray.xml +++ b/indra/newview/skins/default/xui/de/panel_group_info_sidetray.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Gruppeninfo" name="GroupInfo"> +<panel label="Gruppenprofil" name="GroupInfo"> <panel.string name="default_needs_apply_text"> - In der aktuellen Registerkarte befinden sich ungesicherte Änderungen + Diese Änderungen wurden nicht gespeichert. </panel.string> <panel.string name="want_apply_text"> Möchten Sie diese Änderungen speichern? @@ -12,27 +12,24 @@ <panel.string name="group_join_free"> Kostenlos </panel.string> - <text name="group_name" value="(Lädt...)"/> - <line_editor label="Geben Sie Ihren neuen Gruppennamen hier ein" name="group_name_editor"/> - <texture_picker label="" name="insignia" tool_tip="Klicken Sie, um ein Bild auszuwählen"/> - <text name="prepend_founded_by"> - Gründer: - </text> - <name_box initial_value="(empfange)" name="founder_name"/> - <text name="join_cost_text"> - Kostenlos - </text> - <button label="JETZT BEITRETEN!" name="btn_join"/> - <accordion name="groups_accordion"> - <accordion_tab name="group_general_tab" title="Allgemein"/> - <accordion_tab name="group_roles_tab" title="Rollen"/> - <accordion_tab name="group_notices_tab" title="Mitteilungen"/> - <accordion_tab name="group_land_tab" title="Land/Kapital"/> - </accordion> - <panel name="button_row"> - <button label="Erstellen" label_selected="Neue Gruppe" name="btn_create"/> - <button label="Gruppen-Chat" name="btn_chat"/> - <button label="Gruppe anrufen" name="btn_call"/> - <button label="Speichern" label_selected="Speichern" name="btn_apply"/> + <panel name="group_info_top"> + <text name="group_name" value="(wird geladen...)"/> + <line_editor label="Neuen Gruppennamen hier eingeben" name="group_name_editor"/> </panel> + <layout_stack name="layout"> + <layout_panel name="group_accordions"> + <accordion name="groups_accordion"> + <accordion_tab name="group_general_tab" title="Allgemein"/> + <accordion_tab name="group_roles_tab" title="Rollen"/> + <accordion_tab name="group_notices_tab" title="Mitteilungen"/> + <accordion_tab name="group_land_tab" title="Land/Kapital"/> + </accordion> + </layout_panel> + <layout_panel name="button_row"> + <button label="Chat" name="btn_chat"/> + <button label="Gruppe anrufen" name="btn_call" tool_tip="Diese Gruppe anrufen"/> + <button label="Speichern" label_selected="Speichern" name="btn_apply"/> + <button label="Gruppe erstellen" name="btn_create" tool_tip="Neue Gruppe erstellen"/> + </layout_panel> + </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/de/panel_group_invite.xml b/indra/newview/skins/default/xui/de/panel_group_invite.xml index 8e1fb5e4b2..4e3a304609 100644 --- a/indra/newview/skins/default/xui/de/panel_group_invite.xml +++ b/indra/newview/skins/default/xui/de/panel_group_invite.xml @@ -10,7 +10,7 @@ Einige der ausgewählten Einwohner sind bereits Gruppenmitglieder und haben aus diesem Grund keine Einladung erhalten. </panel.string> <text name="help_text"> - Sie können mehrere Einwohner auswählen, um diese in Ihre Gruppe einzuladen. Klicken Sie hierzu auf „Einwohnerliste öffnen“. + Sie können mehrere Einwohner Ihre Gruppe einladen. Klicken Sie hierzu auf „Einwohnerliste öffnen“. </text> <button label="Einwohnerliste öffnen" name="add_button" tool_tip=""/> <name_list name="invitee_list" tool_tip="Halten Sie zur Mehrfachauswahl die Strg-Taste gedrückt und klicken Sie auf die Namen."/> diff --git a/indra/newview/skins/default/xui/de/panel_group_land_money.xml b/indra/newview/skins/default/xui/de/panel_group_land_money.xml index e9743c5d5d..0c89946987 100644 --- a/indra/newview/skins/default/xui/de/panel_group_land_money.xml +++ b/indra/newview/skins/default/xui/de/panel_group_land_money.xml @@ -1,65 +1,62 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Land und L$" name="land_money_tab"> - <string name="help_text"> + <panel.string name="help_text"> Ein Warnhinweis wird angezeigt, solange der Wert für das insgesamt verwendete Land gleich oder weniger ist als der Gesamtbeitrag. - </string> - <button label="?" name="help_button"/> - <string name="cant_view_group_land_text"> + </panel.string> + <panel.string name="cant_view_group_land_text"> Sie sind nicht berechtigt, Landeigentum der Gruppe anzuzeigen. - </string> - <string name="cant_view_group_accounting_text"> + </panel.string> + <panel.string name="cant_view_group_accounting_text"> Sie sind nicht berechtigt, die Finanzinformationen der Gruppe anzuzeigen. - </string> - <string name="loading_txt"> + </panel.string> + <panel.string name="loading_txt"> Wird geladen... - </string> - <text name="group_land_heading"> - Land in Gruppenbesitz - </text> - <scroll_list name="group_parcel_list"> - <column label="Parzelle" name="name"/> - <column label="Region" name="location"/> - <column label="Typ" name="type"/> - <column label="Gebiet" name="area"/> - <column label="" name="hidden"/> - </scroll_list> - <button label="Karte" label_selected="Karte" name="map_button"/> - <text name="total_contributed_land_label"> - Gesamtbeitrag: - </text> - <text name="total_contributed_land_value"> - [AREA] m². - </text> - <text name="total_land_in_use_label"> - Insgesamt verwendetes Land: - </text> - <text name="total_land_in_use_value"> - [AREA] m². - </text> - <text name="land_available_label"> - Land verfügbar: - </text> - <text name="land_available_value"> - [AREA] m². - </text> - <text name="your_contribution_label"> - Ihr Beitrag: - </text> - <string name="land_contrib_error"> + </panel.string> + <panel.string name="land_contrib_error"> Ihr Landbeitrag kann nicht festgelegt werden. - </string> - <text name="your_contribution_units"> - m² - </text> - <text name="your_contribution_max_value"> - ([AMOUNT] max.) - </text> - <text name="group_over_limit_text"> - Um das benutzte Land zu unterstützen, sind weitere Landnutzungsrechte erforderlich. - </text> - <text name="group_money_heading"> - Gruppen-L$ - </text> + </panel.string> + <panel name="layout_panel_landmoney"> + <scroll_list name="group_parcel_list"> + <scroll_list.columns label="Parzelle" name="name"/> + <scroll_list.columns label="Region" name="location"/> + <scroll_list.columns label="Typ" name="type"/> + <scroll_list.columns label="Gebiet" name="area"/> + </scroll_list> + <text name="total_contributed_land_label"> + Gesamtbeitrag: + </text> + <text name="total_contributed_land_value"> + [AREA] m². + </text> + <button label="Karte" label_selected="Karte" name="map_button"/> + <text name="total_land_in_use_label"> + Insgesamt genutztes Land: + </text> + <text name="total_land_in_use_value"> + [AREA] m². + </text> + <text name="land_available_label"> + Land verfügbar: + </text> + <text name="land_available_value"> + [AREA] m². + </text> + <text name="your_contribution_label"> + Ihr Beitrag: + </text> + <text name="your_contribution_units"> + m² + </text> + <text name="your_contribution_max_value"> + ([AMOUNT] max.) + </text> + <text name="group_over_limit_text"> + Um das benutzte Land zu unterstützen, sind weitere Landnutzungsrechte erforderlich. + </text> + <text name="group_money_heading"> + Gruppen-L$ + </text> + </panel> <tab_container name="group_money_tab_container"> <panel label="PLANUNG" name="group_money_planning_tab"> <text_editor name="group_money_planning_text"> @@ -82,89 +79,3 @@ </panel> </tab_container> </panel> -<!-- - -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Land und L$" name="land_money_tab"> - <string name="help_text"> - Parzellen in Gruppenbesitz werden zusammen mit Beitragsdetails angezeigt. Ein Warnhinweis wird angezeigt, solange der Wert für das insgesamt verwendete Land gleich oder weniger ist als der Gesamtbeitrag. Die Registerkarten „Planung“, „Details“ und „Verkäufe“ enthalten Informationen über die Gruppenfinanzen. - </string> - <button label="?" name="help_button"/> - <string name="cant_view_group_land_text"> - Sie sind nicht berechtigt, Landeigentum der Gruppe anzuzeigen. - </string> - <string name="cant_view_group_accounting_text"> - Sie sind nicht berechtigt, die Finanzinformationen der Gruppe anzuzeigen. - </string> - <string name="loading_txt"> - Wird geladen... - </string> - <text name="group_land_heading"> - Land in Gruppenbesitz - </text> - <scroll_list name="group_parcel_list"> - <column label="Parzellenname" name="name"/> - <column label="Region" name="location"/> - <column label="Typ" name="type"/> - <column label="Gebiet" name="area"/> - <column label="" name="hidden"/> - </scroll_list> - <button label="Auf Karte" label_selected="Auf Karte" name="map_button"/> - <text name="total_contributed_land_label"> - Gesamtbeitrag: - </text> - <text name="total_contributed_land_value"> - [AREA] qm - </text> - <text name="total_land_in_use_label"> - Insgesamt verwendetes Land: - </text> - <text name="total_land_in_use_value"> - [AREA] qm - </text> - <text name="land_available_label"> - Land verfügbar: - </text> - <text name="land_available_value"> - [AREA] qm - </text> - <text name="your_contribution_label"> - Ihr Beitrag: - </text> - <string name="land_contrib_error"> - Ihr Landbeitrag kann nicht festgelegt werden. - </string> - <text name="your_contribution_max_value"> - qm (max. [AMOUNT]) - </text> - <text name="group_over_limit_text"> - Die Gruppenmitglieder müssen mehr Landnutzungsrechte spenden, damit -das verwendete Land gehalten werden kann. - </text> - <text name="group_money_heading"> - Gruppen-L$ - </text> - <tab_container name="group_money_tab_container"> - <panel label="Planung" name="group_money_planning_tab"> - <text_editor name="group_money_planning_text"> - Wird berechnet... - </text_editor> - </panel> - <panel label="Details" name="group_money_details_tab"> - <text_editor name="group_money_details_text"> - Wird berechnet... - </text_editor> - <button label="< Früher" label_selected="< Früher" name="earlier_details_button" tool_tip="Zurück in der Zeit"/> - <button label="Später >" label_selected="Später >" name="later_details_button" tool_tip="Weiter in der Zeit"/> - </panel> - <panel label="Verkäufe" name="group_money_sales_tab"> - <text_editor name="group_money_sales_text"> - Wird berechnet... - </text_editor> - <button label="< Früher" label_selected="< Früher" name="earlier_sales_button" tool_tip="Zurück in der Zeit"/> - <button label="Später >" label_selected="Später >" name="later_sales_button" tool_tip="Weiter in der Zeit"/> - </panel> - </tab_container> -</panel> - ---> diff --git a/indra/newview/skins/default/xui/de/panel_group_notices.xml b/indra/newview/skins/default/xui/de/panel_group_notices.xml index d2ba40ae2c..cc5664bd97 100644 --- a/indra/newview/skins/default/xui/de/panel_group_notices.xml +++ b/indra/newview/skins/default/xui/de/panel_group_notices.xml @@ -37,9 +37,9 @@ Maximal 200 pro Gruppe täglich Anhängen: </text> <text name="string"> - Das Objekt hierin ziehen und ablegen, um es anzuhängen: + Das Objekt hierhin ziehen und ablegen, um es anzuhängen: </text> - <button label="Entfernen" label_selected="Anhang entfernen" name="remove_attachment"/> + <button label="Entfernen" label_selected="Anhang entfernen" name="remove_attachment" tool_tip="Anhang von Ihrer Benachrichtigung entfernen"/> <button label="Senden" label_selected="Senden" name="send_notice"/> <group_drop_target name="drop_target" tool_tip="Ziehen Sie ein Objekt aus Ihrem Inventar auf dieses Feld, um es mit dieser Mitteilung zu versenden. Um das Objekt anhängen zu können, müssen Sie die Erlaubnis zum Kopieren und Übertragen besitzen."/> </panel> diff --git a/indra/newview/skins/default/xui/de/panel_group_notify.xml b/indra/newview/skins/default/xui/de/panel_group_notify.xml index cb4c6cdb39..9c05e99786 100644 --- a/indra/newview/skins/default/xui/de/panel_group_notify.xml +++ b/indra/newview/skins/default/xui/de/panel_group_notify.xml @@ -4,7 +4,7 @@ <string name="subject_font" value="SANSSERIF_BIG"/> <string name="date_font" value="SANSSERIF"/> <panel label="Überschrift" name="header"> - <text name="title" value="Name des Absenders / Gruppenname"/> + <text name="title" value="Absender/Gruppenname"/> </panel> <text_editor name="message" value="Nachricht"/> <text name="attachment" value="Anhang"/> diff --git a/indra/newview/skins/default/xui/de/panel_group_roles.xml b/indra/newview/skins/default/xui/de/panel_group_roles.xml index 3103fd65b1..db5186e081 100644 --- a/indra/newview/skins/default/xui/de/panel_group_roles.xml +++ b/indra/newview/skins/default/xui/de/panel_group_roles.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Mitglieder und Rollen" name="roles_tab"> <panel.string name="default_needs_apply_text"> - Die Registerkarte enthält nicht gespeicherte Änderungen. + Diese Änderungen wurden nicht gespeichert. </panel.string> <panel.string name="want_apply_text"> Möchten Sie Ihre Änderungen speichern? @@ -15,8 +15,8 @@ um mehrere Mitglieder auszuwählen. </panel.string> <filter_editor label="Mitglieder filtern" name="filter_input"/> <name_list name="member_list"> - <name_list.columns label="Mitglied" name="name"/> - <name_list.columns label="Übereignung" name="donated"/> + <name_list.columns label="Mitglied" name="name" relative_width="0.30"/> + <name_list.columns label="Übereignung" name="donated" relative_width="0.33"/> <name_list.columns label="Status" name="online"/> </name_list> <button label="Einladen" name="member_invite"/> diff --git a/indra/newview/skins/default/xui/de/panel_groups.xml b/indra/newview/skins/default/xui/de/panel_groups.xml index 95a2ef14f9..f857a6c7ac 100644 --- a/indra/newview/skins/default/xui/de/panel_groups.xml +++ b/indra/newview/skins/default/xui/de/panel_groups.xml @@ -1,9 +1,9 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel name="groups"> - <text name="groupdesc"> + <text name="groupdesc" width="300"> Die derzeit aktive Gruppe ist fett hervorgehoben. </text> - <text name="groupcount"> + <text name="groupcount" width="360"> Sie sind Mitglied bei [COUNT] Gruppen (von max. [MAX]). </text> <button label="IM/Anruf" name="IM" tool_tip="Beginnt eine Instant Message-Sitzung" /> diff --git a/indra/newview/skins/default/xui/de/panel_im_control_panel.xml b/indra/newview/skins/default/xui/de/panel_im_control_panel.xml index 8132f769cb..abf8011d9d 100644 --- a/indra/newview/skins/default/xui/de/panel_im_control_panel.xml +++ b/indra/newview/skins/default/xui/de/panel_im_control_panel.xml @@ -9,11 +9,14 @@ <button label="Freund hinzufügen" name="add_friend_btn"/> </layout_panel> <layout_panel name="teleport_btn_panel"> - <button label="Teleportieren" name="teleport_btn"/> + <button label="Teleportieren" name="teleport_btn" tool_tip="Dieser Person einen Teleport anbieten."/> </layout_panel> <layout_panel name="share_btn_panel"> <button label="Teilen" name="share_btn"/> </layout_panel> + <layout_panel name="pay_btn_panel"> + <button label="Bezahlen" name="pay_btn"/> + </layout_panel> <layout_panel name="call_btn_panel"> <button label="Anrufen" name="call_btn"/> </layout_panel> diff --git a/indra/newview/skins/default/xui/de/panel_inventory_item.xml b/indra/newview/skins/default/xui/de/panel_inventory_item.xml new file mode 100644 index 0000000000..d18047fbcf --- /dev/null +++ b/indra/newview/skins/default/xui/de/panel_inventory_item.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="inventory_item"> + <text name="item_name" value="..."/> +</panel> diff --git a/indra/newview/skins/default/xui/de/panel_landmark_info.xml b/indra/newview/skins/default/xui/de/panel_landmark_info.xml index 9cef7b6d35..10cf34c170 100644 --- a/indra/newview/skins/default/xui/de/panel_landmark_info.xml +++ b/indra/newview/skins/default/xui/de/panel_landmark_info.xml @@ -18,9 +18,6 @@ <string name="acquired_date"> [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local] </string> - <string name="icon_PG" value="parcel_drk_PG"/> - <string name="icon_M" value="parcel_drk_M"/> - <string name="icon_R" value="parcel_drk_R"/> <button name="back_btn" tool_tip="Hinten"/> <text name="title" value="Ortsprofil"/> <scroll_container name="place_scroll"> diff --git a/indra/newview/skins/default/xui/de/panel_landmarks.xml b/indra/newview/skins/default/xui/de/panel_landmarks.xml index 3336232782..db12462a31 100644 --- a/indra/newview/skins/default/xui/de/panel_landmarks.xml +++ b/indra/newview/skins/default/xui/de/panel_landmarks.xml @@ -2,7 +2,7 @@ <panel name="Landmarks"> <accordion name="landmarks_accordion"> <accordion_tab name="tab_favorites" title="Favoritenleiste"/> - <accordion_tab name="tab_landmarks" title="Landmarken"/> + <accordion_tab name="tab_landmarks" title="Meine Landmarken"/> <accordion_tab name="tab_inventory" title="Mein Inventar"/> <accordion_tab name="tab_library" title="Bibliothek"/> </accordion> diff --git a/indra/newview/skins/default/xui/de/panel_login.xml b/indra/newview/skins/default/xui/de/panel_login.xml index bd82fc6872..2a6ea42c73 100644 --- a/indra/newview/skins/default/xui/de/panel_login.xml +++ b/indra/newview/skins/default/xui/de/panel_login.xml @@ -23,7 +23,7 @@ <text name="start_location_text"> Hier anfangen: </text> - <combo_box name="start_location_combo"> + <combo_box name="start_location_combo" width="150"> <combo_box.item label="Mein letzter Standort" name="MyLastLocation"/> <combo_box.item label="Mein Zuhause" name="MyHome"/> <combo_box.item label="<Region eingeben>" name="Typeregionname"/> diff --git a/indra/newview/skins/default/xui/de/panel_main_inventory.xml b/indra/newview/skins/default/xui/de/panel_main_inventory.xml index aa0b43b550..d3eb9ae04c 100644 --- a/indra/newview/skins/default/xui/de/panel_main_inventory.xml +++ b/indra/newview/skins/default/xui/de/panel_main_inventory.xml @@ -1,18 +1,14 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Sonstiges" name="main inventory panel"> - <panel.string name="Title"> - Sonstiges + <panel.string name="ItemcountFetching"> + Inventar ([ITEM_COUNT] Artikel werden abgerufen... [FILTER] </panel.string> - <filter_editor label="Inventar filtern" name="inventory search editor"/> - <tab_container name="inventory filter tabs"> - <inventory_panel label="MEIN INVENTAR" name="All Items"/> - <inventory_panel label="AKTUELL" name="Recent Items"/> - </tab_container> - <panel name="bottom_panel"> - <button name="options_gear_btn" tool_tip="Zusätzliche Optionen anzeigen"/> - <button name="add_btn" tool_tip="Neues Objekt hinzufügen"/> - <dnd_button name="trash_btn" tool_tip="Auswahl löschen"/> - </panel> + <panel.string name="ItemcountCompleted"> + [ITEM_COUNT] Objekte [FILTER] + </panel.string> + <text name="ItemcountText"> + Objekte: + </text> <menu_bar name="Inventory Menu"> <menu label="Datei" name="File"> <menu_item_call label="Öffnen" name="Open"/> @@ -44,7 +40,7 @@ <menu_item_call label="Neue Handschuhe" name="New Gloves"/> <menu_item_call label="Neues Unterhemd" name="New Undershirt"/> <menu_item_call label="Neue Unterhose" name="New Underpants"/> - <menu_item_call label="Alpha: Neu" name="New Alpha"/> + <menu_item_call label="Neues Alpha" name="New Alpha"/> <menu_item_call label="Neue Tätowierung" name="New Tattoo"/> </menu> <menu label="Neue Körperteile" name="New Body Parts"> @@ -57,8 +53,18 @@ <menu label="Sortieren" name="Sort"> <menu_item_check label="Nach Name" name="By Name"/> <menu_item_check label="Nach Datum" name="By Date"/> - <menu_item_check label="Ordner immer nach Name" name="Folders Always By Name"/> + <menu_item_check label="Ordner immer nach Namen" name="Folders Always By Name"/> <menu_item_check label="Systemordner nach oben" name="System Folders To Top"/> </menu> </menu_bar> + <filter_editor label="Inventar filtern" name="inventory search editor"/> + <tab_container name="inventory filter tabs"> + <inventory_panel label="MEIN INVENTAR" name="All Items"/> + <inventory_panel label="AKTUELL" name="Recent Items"/> + </tab_container> + <panel name="bottom_panel"> + <button name="options_gear_btn" tool_tip="Zusätzliche Optionen anzeigen"/> + <button name="add_btn" tool_tip="Neues Objekt hinzufügen"/> + <dnd_button name="trash_btn" tool_tip="Auswahl löschen"/> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/de/panel_me.xml b/indra/newview/skins/default/xui/de/panel_me.xml index c61fc26f4c..26b9812212 100644 --- a/indra/newview/skins/default/xui/de/panel_me.xml +++ b/indra/newview/skins/default/xui/de/panel_me.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Mein Profil" name="panel_me"> <tab_container name="tabs"> - <panel label="PROFIL" name="panel_profile"/> - <panel label="AUSWAHL" name="panel_picks"/> + <panel label="MEIN PROFIL" name="panel_profile"/> + <panel label="MEINE AUSWAHL" name="panel_picks"/> </tab_container> </panel> diff --git a/indra/newview/skins/default/xui/de/panel_media_settings_permissions.xml b/indra/newview/skins/default/xui/de/panel_media_settings_permissions.xml index 7ee0074a3b..dd408b8275 100644 --- a/indra/newview/skins/default/xui/de/panel_media_settings_permissions.xml +++ b/indra/newview/skins/default/xui/de/panel_media_settings_permissions.xml @@ -11,10 +11,19 @@ Mini </combo_item> </combo_box> + <text name="owner_label"> + Eigentümer + </text> <check_box initial_value="false" label="Naviation & Interaktion zulassen" name="perms_owner_interact"/> <check_box initial_value="false" label="Steuerungsleiste anzeigen" name="perms_owner_control"/> + <text name="group_label"> + Gruppe: + </text> <check_box initial_value="false" label="Naviation & Interaktion zulassen" name="perms_group_interact"/> <check_box initial_value="false" label="Steuerungsleiste anzeigen" name="perms_group_control"/> + <text name="anyone_label"> + Jeder + </text> <check_box initial_value="false" label="Naviation & Interaktion zulassen" name="perms_anyone_interact"/> <check_box initial_value="false" label="Steuerungsleiste anzeigen" name="perms_anyone_control"/> </panel> diff --git a/indra/newview/skins/default/xui/de/panel_media_settings_security.xml b/indra/newview/skins/default/xui/de/panel_media_settings_security.xml index 8ff013f66b..adc0d22ce6 100644 --- a/indra/newview/skins/default/xui/de/panel_media_settings_security.xml +++ b/indra/newview/skins/default/xui/de/panel_media_settings_security.xml @@ -2,7 +2,8 @@ <panel label="Sicherheit" name="Media Settings Security"> <check_box initial_value="false" label="Nur Zugriff auf festgelegte URL-Muster zulassen" name="whitelist_enable"/> <text name="home_url_fails_some_items_in_whitelist"> - Einträge, die für die Startseite nicht akzeptiert werden, sind markiert: + Einträge, die für die Startseite nicht akzeptiert +werden, sind markiert: </text> <button label="Hinzufügen" name="whitelist_add"/> <button label="Löschen" name="whitelist_del"/> diff --git a/indra/newview/skins/default/xui/de/panel_my_profile.xml b/indra/newview/skins/default/xui/de/panel_my_profile.xml index 618ed88846..55eed89848 100644 --- a/indra/newview/skins/default/xui/de/panel_my_profile.xml +++ b/indra/newview/skins/default/xui/de/panel_my_profile.xml @@ -30,11 +30,14 @@ </panel> <text name="title_member_text" value="Einwohner seit:"/> <text name="title_acc_status_text" value="Kontostatus:"/> - <text name="acc_status_text"> + <text_editor name="acc_status_text"> Einwohner. Keine Zahlungsinfo archiviert. Linden. - </text> + </text_editor> <text name="title_partner_text" value="Partner:"/> + <panel name="partner_data_panel"> + <name_box initial_value="(wird in Datenbank gesucht)" name="partner_text"/> + </panel> <text name="title_groups_text" value="Gruppen:"/> </panel> </scroll_container> diff --git a/indra/newview/skins/default/xui/de/panel_navigation_bar.xml b/indra/newview/skins/default/xui/de/panel_navigation_bar.xml index ab59c207bf..99293edd0f 100644 --- a/indra/newview/skins/default/xui/de/panel_navigation_bar.xml +++ b/indra/newview/skins/default/xui/de/panel_navigation_bar.xml @@ -1,15 +1,18 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="navigation_bar"> <panel name="navigation_panel"> - <button name="back_btn" tool_tip="Zurück zum vorherigen Standort gehen"/> - <button name="forward_btn" tool_tip="Um einen Standort weiter gehen"/> - <button name="home_btn" tool_tip="Zu meinem Heimatort teleportieren"/> + <pull_button name="back_btn" tool_tip="Zurück zum vorherigen Standort gehen"/> + <pull_button name="forward_btn" tool_tip="Um einen Standort weiter gehen"/> + <button name="home_btn" tool_tip="Zu meinem Zuhause teleportieren"/> <location_input label="Standort" name="location_combo"/> <search_combo_box label="Suche" name="search_combo_box" tool_tip="Suche"> <combo_editor label="[SECOND_LIFE] durchsuchen" name="search_combo_editor"/> </search_combo_box> </panel> - <favorites_bar name="favorite"> + <favorites_bar name="favorite" tool_tip="Ziehen Sie Landmarken hier hin, damit Sie schnell zu Ihren Lieblingsplätzen in Second Life gelangen können!"> + <label name="favorites_bar_label" tool_tip="Ziehen Sie Landmarken hier hin, damit Sie schnell zu Ihren Lieblingsplätzen in Second Life gelangen können!"> + Favoritenleiste + </label> <chevron_button name=">>" tool_tip="Mehr meiner Favoriten anzeigen"/> </favorites_bar> </panel> diff --git a/indra/newview/skins/default/xui/de/panel_nearby_chat.xml b/indra/newview/skins/default/xui/de/panel_nearby_chat.xml index 699bddc6eb..3f4f5a71b5 100644 --- a/indra/newview/skins/default/xui/de/panel_nearby_chat.xml +++ b/indra/newview/skins/default/xui/de/panel_nearby_chat.xml @@ -2,7 +2,7 @@ <!-- All our XML is utf-8 encoded. --> <panel name="nearby_chat"> <panel name="chat_caption"> - <text name="sender_name"> + <text name="sender_name" width="200"> CHAT IN DER NÄHE </text> </panel> diff --git a/indra/newview/skins/default/xui/de/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/de/panel_nearby_chat_bar.xml index 5e6e460c65..08cc0b0ec8 100644 --- a/indra/newview/skins/default/xui/de/panel_nearby_chat_bar.xml +++ b/indra/newview/skins/default/xui/de/panel_nearby_chat_bar.xml @@ -1,11 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="chat_bar"> - <string name="min_width"> - 192 - </string> - <string name="max_width"> - 320 - </string> <line_editor label="Zum Chatten hier klicken." name="chat_box" tool_tip="Eingabe drücken, um zu sprechen, Strg-Eingabe drücken, um zu Rufen."/> <button name="show_nearby_chat" tool_tip="Protokoll des Chats in der Nähe anzeigen/ausblenden"/> </panel> diff --git a/indra/newview/skins/default/xui/de/panel_nearby_media.xml b/indra/newview/skins/default/xui/de/panel_nearby_media.xml new file mode 100644 index 0000000000..e633ae1dde --- /dev/null +++ b/indra/newview/skins/default/xui/de/panel_nearby_media.xml @@ -0,0 +1,65 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="nearby_media"> + <string name="media_item_count_format"> + (%ls Medien-Objekte) + </string> + <string name="empty_item_text"> + <leer> + </string> + <string name="parcel_media_name"> + Streaming-Medien auf Parzelle + </string> + <string name="parcel_audio_name"> + Streaming-Audio auf Parzelle + </string> + <string name="playing_suffix"> + (wird abgespielt) + </string> + <panel name="minimized_controls"> + <button label="Stoppen" name="all_nearby_media_disable_btn" tool_tip="Alle Medien in der Nähe ausschalten"/> + <button label="Starten" name="all_nearby_media_enable_btn" tool_tip="Alle Medien in der Nähe einschalten"/> + <button name="open_prefs_btn" tool_tip="Medien-Einstellungen öffnen"/> + <button label="Mehr >>" label_selected="Weniger <<" name="more_btn" tool_tip="Erweiterte Steuerung"/> + <button label="Mehr >>" label_selected="Weniger <<" name="less_btn" tool_tip="Erweiterte Steuerung"/> + </panel> + <panel name="nearby_media_panel"> + <combo_box name="show_combo"> + <combo_box.item label="Alle" name="All"/> + <combo_box.item label="Auf dieser Parzelle" name="WithinParcel"/> + <combo_box.item label="Außerhalb dieser Parzelle" name="OutsideParcel"/> + <combo_box.item label="An anderen Avataren" name="OnOthers"/> + </combo_box> + <scroll_list name="media_list"> + <scroll_list.columns label="Umgebung" name="media_proximity"/> + <scroll_list.columns label="Sichtbar" name="media_visibility"/> + <scroll_list.columns label="Klasse" name="media_class"/> + <scroll_list.columns label="Name" name="media_name"/> + <scroll_list.columns label="Fehler beseitigen" name="media_debug"/> + </scroll_list> + <panel> + <layout_stack name="media_controls"> + <layout_panel name="stop"> + <button name="stop_btn" tool_tip="Ausgewählte Medien stoppen"/> + </layout_panel> + <layout_panel name="play"> + <button name="play_btn" tool_tip="Ausgewählte Medien wiedergeben"/> + </layout_panel> + <layout_panel name="pause"> + <button name="pause_btn" tool_tip="Ausgewählte Medien pausieren"/> + </layout_panel> + <layout_panel name="volume_slider_ctrl"> + <slider_bar initial_value="0.5" name="volume_slider" tool_tip="Lautstärke für ausgewählte Medien"/> + </layout_panel> + <layout_panel name="mute"> + <button name="mute_btn" tool_tip="Audio für ausgewählte Medien stummschalten"/> + </layout_panel> + <layout_panel name="zoom"> + <button name="zoom_btn" tool_tip="Auf ausgewählte Medien zoomen"/> + </layout_panel> + <layout_panel name="unzoom"> + <button name="unzoom_btn" tool_tip="Von ausgewählten Medien wegzoomen"/> + </layout_panel> + </layout_stack> + </panel> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/de/panel_notes.xml b/indra/newview/skins/default/xui/de/panel_notes.xml index e6a63fc0c8..374c117cdd 100644 --- a/indra/newview/skins/default/xui/de/panel_notes.xml +++ b/indra/newview/skins/default/xui/de/panel_notes.xml @@ -13,10 +13,10 @@ </scroll_container> </layout_panel> <layout_panel name="notes_buttons_panel"> - <button label="Freund hinzufügen" name="add_friend" tool_tip="Bieten Sie dem Einwohner die Freundschaft an"/> - <button label="IM" name="im" tool_tip="Instant Messenger öffnen"/> + <button label="Freund hinzufügen" name="add_friend" tool_tip="Bieten Sie dem Einwohner die Freundschaft an" width="109"/> + <button label="IM" name="im" tool_tip="Instant Messenger öffnen" width="24"/> <button label="Anrufen" name="call" tool_tip="Diesen Einwohner anrufen"/> - <button label="Karte" name="show_on_map_btn" tool_tip="Einwohner auf Karte anzeigen"/> + <button label="Karte" name="show_on_map_btn" tool_tip="Einwohner auf Karte anzeigen" width="40"/> <button label="Teleportieren" name="teleport" tool_tip="Teleport anbieten"/> </layout_panel> </layout_stack> diff --git a/indra/newview/skins/default/xui/de/panel_online_status.xml b/indra/newview/skins/default/xui/de/panel_online_status.xml new file mode 100644 index 0000000000..7c7448c061 --- /dev/null +++ b/indra/newview/skins/default/xui/de/panel_online_status.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Freunde_online_Status" name="friend_online_status"/> diff --git a/indra/newview/skins/default/xui/de/panel_online_status_toast.xml b/indra/newview/skins/default/xui/de/panel_online_status_toast.xml new file mode 100644 index 0000000000..7c7448c061 --- /dev/null +++ b/indra/newview/skins/default/xui/de/panel_online_status_toast.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Freunde_online_Status" name="friend_online_status"/> diff --git a/indra/newview/skins/default/xui/de/panel_outfit_edit.xml b/indra/newview/skins/default/xui/de/panel_outfit_edit.xml new file mode 100644 index 0000000000..91ba94b3d6 --- /dev/null +++ b/indra/newview/skins/default/xui/de/panel_outfit_edit.xml @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- Side tray Outfit Edit panel --> +<panel label="Outfit bearbeiten" name="outfit_edit"> + <string name="No Outfit" value="Kein Outfit"/> + <panel.string name="not_available"> + k.A. + </panel.string> + <panel.string name="unknown"> + (unbekannt) + </panel.string> + <string name="Filter.All" value="Alle"/> + <string name="Filter.Clothes/Body" value="Kleider/Körper"/> + <string name="Filter.Objects" value="Objekte"/> + <string name="Filter.Custom" value="Benutzerspezifischer Filter"/> + <text name="title" value="Outfit bearbeiten"/> + <panel label="bottom_panel" name="header_panel"> + <panel label="bottom_panel" name="outfit_name_and_status"> + <text name="status" value="Wird bearbeitet..."/> + <text name="curr_outfit_name" value="[Aktuelles Outfit]"/> + </panel> + </panel> + <layout_stack name="im_panels"> + <layout_panel label="IM Steuerkonsole" name="outfit_wearables_panel"> + <layout_stack name="filter_panels"> + <layout_panel name="add_button_and_combobox"> + <button label="Mehr hinzufügen" name="show_add_wearables_btn"/> + </layout_panel> + <layout_panel name="filter_panel"> + <filter_editor label="Tragbare Inventarobjekte filtern" name="look_item_filter"/> + </layout_panel> + </layout_stack> + </layout_panel> + <layout_panel name="add_wearables_panel"/> + </layout_stack> + <panel name="save_revert_button_bar"> + <button label="Speichern" name="save_btn"/> + <button label="Zurücksetzen" name="revert_btn"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/de/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/de/panel_outfits_inventory.xml index 8d2dd84512..8b04cecd68 100644 --- a/indra/newview/skins/default/xui/de/panel_outfits_inventory.xml +++ b/indra/newview/skins/default/xui/de/panel_outfits_inventory.xml @@ -1,14 +1,13 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Sonstiges" name="Outfits"> <tab_container name="appearance_tabs"> - <inventory_panel label="MEINE OUTFITS" name="outfitslist_tab"/> - <inventory_panel label="AKTUELLES OUTFIT" name="cof_accordionpanel"/> + <panel label="MEINE OUTFITS" name="outfitslist_tab"/> + <inventory_panel label="AKTUELLES OUTFIT" name="cof_tab"/> </tab_container> <panel name="bottom_panel"> <button name="options_gear_btn" tool_tip="Zusätzliche Optionen anzeigen"/> <dnd_button name="trash_btn" tool_tip="Auswahl löschen"/> - <button label="Outfit speichern" name="make_outfit_btn" tool_tip="Aussehen als Outfit speichern"/> + <button label="Speichern unter" name="save_btn"/> <button label="Anziehen" name="wear_btn" tool_tip="Ausgewähltes Outfit tragen"/> - <button label="M" name="look_edit_btn"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/de/panel_people.xml b/indra/newview/skins/default/xui/de/panel_people.xml index 91a17e127a..59cc3a8b70 100644 --- a/indra/newview/skins/default/xui/de/panel_people.xml +++ b/indra/newview/skins/default/xui/de/panel_people.xml @@ -1,13 +1,23 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <!-- Side tray panel --> <panel label="Leute" name="people_panel"> - <string name="no_people" value="Keine Leute"/> - <string name="no_one_near" value="Keiner in der Nähe"/> + <string name="no_recent_people" value="Hier sind keine Leute. Sie suchen nach Leuten? Verwenden Sie die [secondlife:///app/search/people Suche] oder die [secondlife:///app/worldmap Karte]."/> + <string name="no_filtered_recent_people" value="Sie haben nicht das Richtige gefunden? Versuchen Sie es mit der [secondlife:///app/search/people Suche]."/> + <string name="no_one_near" value="Es ist niemand in der Nähe. Sie suchen nach Leuten? Verwenden Sie die [secondlife:///app/search/people Suche] oder die [secondlife:///app/worldmap Karte]."/> + <string name="no_one_filtered_near" value="Sie haben nicht das Richtige gefunden? Versuchen Sie es mit der [secondlife:///app/search/people Suche]."/> <string name="no_friends_online" value="Keine Freunde online"/> <string name="no_friends" value="Keine Freunde"/> - <string name="no_groups" value="Keine Gruppen"/> + <string name="no_friends_msg"> + Verwenden Sie die [secondlife:///app/search/people Suche], um Freunde zu finden. Oder klicken Sie mit rechts auf einen Einwohner und fügen Sie diesen als Freund hinzu. +Sie suchen nach Leuten? Verwenden Sie die [secondlife:///app/worldmap Karte]. + </string> + <string name="no_filtered_friends_msg"> + Sie haben nicht das Richtige gefunden? Versuchen Sie es mit der [secondlife:///app/search/people Suche]. + </string> <string name="people_filter_label" value="Nach Leuten filtern"/> <string name="groups_filter_label" value="Nach Gruppen filtern"/> + <string name="no_filtered_groups_msg" value="Sie haben nicht das Richtige gefunden? Versuchen Sie es mit der [secondlife:///app/search/groups Suche]."/> + <string name="no_groups_msg" value="Suchen Sie nach Gruppen? Versuchen Sie es mit der [secondlife:///app/search/groups Suche]."/> <filter_editor label="Filter" name="filter_input"/> <tab_container name="tabs"> <panel label="IN DER NÄHE" name="nearby_panel"> @@ -16,7 +26,7 @@ <button name="add_friend_btn" tool_tip="Ausgewählten Einwohner zur Freundeliste hinzufügen"/> </panel> </panel> - <panel label="FREUNDE" name="friends_panel"> + <panel label="MEINE FREUNDE" name="friends_panel"> <accordion name="friends_accordion"> <accordion_tab name="tab_online" title="Online"/> <accordion_tab name="tab_all" title="Alle"/> @@ -27,7 +37,7 @@ <button name="del_btn" tool_tip="Ausgewählte Person von Ihrer Freundesliste entfernen"/> </panel> </panel> - <panel label="GRUPPEN" name="groups_panel"> + <panel label="MEINE GRUPPEN" name="groups_panel"> <panel label="bottom_panel" name="bottom_panel"> <button name="groups_viewsort_btn" tool_tip="Optionen"/> <button name="plus_btn" tool_tip="Gruppe beitreten/Neue Gruppe erstellen"/> diff --git a/indra/newview/skins/default/xui/de/panel_picks.xml b/indra/newview/skins/default/xui/de/panel_picks.xml index a07bc170f6..df68381082 100644 --- a/indra/newview/skins/default/xui/de/panel_picks.xml +++ b/indra/newview/skins/default/xui/de/panel_picks.xml @@ -11,7 +11,7 @@ </panel> <panel name="buttons_cucks"> <button label="Info" name="info_btn" tool_tip="Auswahl-Information anzeigen"/> - <button label="Teleportieren" name="teleport_btn" tool_tip="Zu entsprechendem Standort teleportieren"/> + <button label="Teleportieren" name="teleport_btn" tool_tip="Zu entsprechendem Standort teleportieren" width="100"/> <button label="Karte" name="show_on_map_btn" tool_tip="Den entsprechenden Standort auf der Karte anzeigen"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/de/panel_place_profile.xml b/indra/newview/skins/default/xui/de/panel_place_profile.xml index 94a43833bf..9d1a582b7c 100644 --- a/indra/newview/skins/default/xui/de/panel_place_profile.xml +++ b/indra/newview/skins/default/xui/de/panel_place_profile.xml @@ -6,7 +6,7 @@ <string name="available" value="verfügbar"/> <string name="allocated" value="vergeben"/> <string name="title_place" value="Ortsprofil"/> - <string name="title_teleport_history" value="Speicherort der Teleport-Liste"/> + <string name="title_teleport_history" value="Teleport-Liste"/> <string name="not_available" value="k.A."/> <string name="unknown" value="(unbekannt)"/> <string name="public" value="(öffentlich)"/> @@ -41,21 +41,6 @@ <string name="acquired_date"> [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local] </string> - <string name="icon_PG" value="parcel_drk_PG"/> - <string name="icon_M" value="parcel_drk_M"/> - <string name="icon_R" value="parcel_drk_R"/> - <string name="icon_Voice" value="parcel_drk_Voice"/> - <string name="icon_VoiceNo" value="parcel_drk_VoiceNo"/> - <string name="icon_Fly" value="parcel_drk_Fly"/> - <string name="icon_FlyNo" value="parcel_drk_FlyNo"/> - <string name="icon_Push" value="parcel_drk_Push"/> - <string name="icon_PushNo" value="parcel_drk_PushNo"/> - <string name="icon_Build" value="parcel_drk_Build"/> - <string name="icon_BuildNo" value="parcel_drk_BuildNo"/> - <string name="icon_Scripts" value="parcel_drk_Scripts"/> - <string name="icon_ScriptsNo" value="parcel_drk_ScriptsNo"/> - <string name="icon_Damage" value="parcel_drk_Damage"/> - <string name="icon_DamageNo" value="parcel_drk_DamageNo"/> <button name="back_btn" tool_tip="Hinten"/> <text name="title" value="Ortsprofil"/> <scroll_container name="place_scroll"> @@ -68,7 +53,7 @@ <text name="maturity_value" value="unbekannt"/> <accordion name="advanced_info_accordion"> <accordion_tab name="parcel_characteristics_tab" title="Parzelle"> - <panel> + <panel name="parcel_characteristics_panel"> <text name="rating_label" value="Einstufung:"/> <text name="rating_value" value="unbekannt"/> <text name="voice_label" value="Voice:"/> @@ -87,7 +72,7 @@ </panel> </accordion_tab> <accordion_tab name="region_information_tab" title="Region"> - <panel> + <panel name="region_information_panel"> <text name="region_name_label" value="Region:"/> <text name="region_name" value="Mooseland"/> <text name="region_type_label" value="Typ:"/> @@ -100,19 +85,19 @@ <text name="region_group"> The Mighty Moose of mooseville soundvillemoose </text> - <button label="Region/Grundstück" name="region_info_btn"/> + <button label="Region/Grundbesitz" name="region_info_btn"/> </panel> </accordion_tab> - <accordion_tab name="estate_information_tab" title="Grundstück"> - <panel> - <text name="estate_name_label" value="Grundstück:"/> + <accordion_tab name="estate_information_tab" title="Grundbesitz"> + <panel name="estate_information_panel"> + <text name="estate_name_label" value="Grundbesitz:"/> <text name="estate_rating_label" value="Einstufung:"/> <text name="estate_owner_label" value="Eigentümer:"/> <text name="covenant_label" value="Vertrag:"/> </panel> </accordion_tab> <accordion_tab name="sales_tab" title="Zum Verkauf"> - <panel> + <panel name="sales_panel"> <text name="sales_price_label" value="Preis:"/> <text name="area_label" value="Gebiet:"/> <text name="traffic_label" value="Traffic:"/> diff --git a/indra/newview/skins/default/xui/de/panel_places.xml b/indra/newview/skins/default/xui/de/panel_places.xml index 8ee26f4e5f..bd5c1c8ffe 100644 --- a/indra/newview/skins/default/xui/de/panel_places.xml +++ b/indra/newview/skins/default/xui/de/panel_places.xml @@ -2,14 +2,15 @@ <panel label="Orte" name="places panel"> <string name="landmarks_tab_title" value="MEINE LANDMARKEN"/> <string name="teleport_history_tab_title" value="TELEPORT-LISTE"/> - <filter_editor label="Orte filtern" name="Filter"/> + <filter_editor label="Meine Orte filtern" name="Filter"/> <panel name="button_panel"> <button label="Teleportieren" name="teleport_btn" tool_tip="Zu ausgewähltem Standort teleportieren"/> - <button label="Karte" name="map_btn"/> + <button label="Karte" name="map_btn" tool_tip="Den entsprechenden Standort auf der Karte anzeigen" width="60"/> <button label="Bearbeiten" name="edit_btn" tool_tip="Landmarken-Info bearbeiten"/> - <button name="overflow_btn" tool_tip="Zusätzliche Optionen anzeigen"/> + <button label="â–¼" name="overflow_btn" tool_tip="Zusätzliche Optionen anzeigen"/> + <button label="Speichern" name="save_btn" width="66"/> + <button label="Abbrechen" name="cancel_btn" width="66"/> <button label="Schließen" name="close_btn"/> - <button label="Abbrechen" name="cancel_btn"/> - <button label="Speichern" name="save_btn"/> + <button label="Profil" name="profile_btn" tool_tip="Ortsprofil anzeigen"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/de/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/de/panel_preferences_advanced.xml index 14d4e01586..52e616a402 100644 --- a/indra/newview/skins/default/xui/de/panel_preferences_advanced.xml +++ b/indra/newview/skins/default/xui/de/panel_preferences_advanced.xml @@ -1,48 +1,37 @@ <?xml version="1.0" encoding="utf-8"?> -<panel name="advanced"> - <panel.string name="resolution_format"> - [RES_X] x [RES_Y] - </panel.string> +<panel label="Erweitert" name="advanced"> <panel.string name="aspect_ratio_text"> [NUM]:[DEN] </panel.string> - <check_box label="Blasen-Chat" name="bubble_text_chat"/> - <color_swatch name="background" tool_tip="Farbe für Blasen-Chat auswählen"/> - <slider label="Deckkraft" name="bubble_chat_opacity"/> - <text name="AspectRatioLabel1" tool_tip="Breite/Höhe"> - Seitenverhältnis - </text> - <combo_box name="aspect_ratio" tool_tip="Breite/Höhe"> - <combo_box.item label="4:3 (Standard-CRT)" name="item1"/> - <combo_box.item label="5:4 (1280x1024 LCD)" name="item2"/> - <combo_box.item label="8:5 (Widescreen)" name="item3"/> - <combo_box.item label="16:9 (Widescreen)" name="item4"/> - </combo_box> - <check_box label="Automatisch erkennen" name="aspect_auto_detect"/> - <text name="heading1"> - Kamera: - </text> + <panel.string name="middle_mouse"> + Mittlere Maustaste + </panel.string> <slider label="Sichtwinkel" name="camera_fov"/> <slider label="Abstand" name="camera_offset_scale"/> <text name="heading2"> - Automatische Positionierung: + Automatische Position für: </text> <check_box label="Bauen/Bearbeiten" name="edit_camera_movement" tool_tip="Automatische Kamerapositionierung bei Wechsel in und aus dem Bearbeitungsmodus verwenden"/> <check_box label="Aussehen" name="appearance_camera_movement" tool_tip="Automatische Kamerapositionierung im Bearbeitenmodus verwenden"/> - <text name="heading3"> - Avatare: - </text> + <check_box initial_value="true" label="Sidebar" name="appearance_sidebar_positioning" tool_tip="Use automatic camera positioning for sidebar"/> <check_box label="Mich im Mouselook anzeigen" name="first_person_avatar_visible"/> <check_box label="Mit Pfeiltasten bewegen" name="arrow_keys_move_avatar_check"/> <check_box label="2-mal-drücken-halten, um zu rennen" name="tap_tap_hold_to_run"/> <check_box label="Avatarlippen beim Sprechen bewegen" name="enable_lip_sync"/> - <check_box label="Skript-Fehler anzeigen" name="show_script_errors"/> + <check_box label="Blasen-Chat" name="bubble_text_chat"/> + <slider label="Deckkraft" label_width="66" name="bubble_chat_opacity"/> + <color_swatch left_pad="35" name="background" tool_tip="Farbe für Blasen-Chat auswählen"/> + <text name="UI Size:"> + UI-Größe + </text> + <check_box label="Skript-Fehler anzeigen:" name="show_script_errors"/> <radio_group name="show_location"> - <radio_item label="In Chat" name="0"/> - <radio_item label="In einem Fenster" name="1"/> + <radio_item label="Chat in der Nähe" name="0"/> + <radio_item label="Getrenntes Fenster" name="1"/> </radio_group> - <check_box label="Umschaltmodus für Mikrofon, wenn die Auslöste-Taste zum Sprechen gedrückt wird:" name="push_to_talk_toggle_check" tool_tip="Wenn der Umschaltmodus aktiviert ist, drücken Sie die Auslöse-Taste EINMAL, um Ihr Mikrofon an oder aus zu stellen. Wenn der Umschaltmodus nicht motiviert ist, ist das Mikro nur dann eingeschaltet, wenn Sie die Auslösetaste gedrückt halten."/> + <check_box label="Sprachfunktion ein-/ausschalten, wenn gedrückt wird:" name="push_to_talk_toggle_check" tool_tip="Wenn der Umschaltmodus aktiviert ist, drücken Sie die Auslöse-Taste EINMAL, um Ihr Mikrofon an oder aus zu stellen. Wenn der Umschaltmodus nicht motiviert ist, ist das Mikro nur dann eingeschaltet, wenn Sie die Auslösetaste gedrückt halten."/> <line_editor label="Auslöser für Zum-Sprechen-drücken:" name="modifier_combo"/> <button label="Taste festlegen" name="set_voice_hotkey_button"/> - <button label="Mittlere Maustaste" name="set_voice_middlemouse_button"/> + <button label="Mittlere Maustaste" name="set_voice_middlemouse_button" tool_tip="Auf mittlere Maustaste zurücksetzen"/> + <button label="Andere Geräte" name="joystick_setup_button"/> </panel> diff --git a/indra/newview/skins/default/xui/de/panel_preferences_alerts.xml b/indra/newview/skins/default/xui/de/panel_preferences_alerts.xml index def5fb3b1b..fcb45e26be 100644 --- a/indra/newview/skins/default/xui/de/panel_preferences_alerts.xml +++ b/indra/newview/skins/default/xui/de/panel_preferences_alerts.xml @@ -3,12 +3,12 @@ <text name="tell_me_label"> Anzeigen: </text> - <check_box label="Wenn ich Geld ausgebe oder L$ erhalte" name="notify_money_change_checkbox"/> - <check_box label="Wenn meinen Freund sich an- oder abmelden" name="friends_online_notify_checkbox"/> + <check_box label="Wenn ich L$ ausgebe oder erhalte" name="notify_money_change_checkbox"/> + <check_box label="Wenn meine Freunde sich an- oder abmelden" name="friends_online_notify_checkbox"/> <text name="show_label"> - Diese Warnhinweise immer anzeigen: + Immer anzeigen: </text> <text name="dont_show_label"> - Diese Benachrichtungen nie anzeigen: + Niemals anzeigen: </text> </panel> diff --git a/indra/newview/skins/default/xui/de/panel_preferences_chat.xml b/indra/newview/skins/default/xui/de/panel_preferences_chat.xml index cc0a09c06c..bf150daf87 100644 --- a/indra/newview/skins/default/xui/de/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/de/panel_preferences_chat.xml @@ -1,10 +1,16 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Text-Chat" name="chat"> + <text name="font_size"> + Schriftgröße: + </text> <radio_group name="chat_font_size"> <radio_item label="Klein" name="radio" value="0"/> <radio_item label="Mittel" name="radio2" value="1"/> <radio_item label="Groß" name="radio3" value="2"/> </radio_group> + <text name="font_colors"> + Schriftfarben: + </text> <color_swatch label="Sie" name="user"/> <text name="text_box1"> Ich @@ -39,9 +45,15 @@ </text> <check_box initial_value="true" label="Beim Chatten Tippanimation abspielen" name="play_typing_animation"/> <check_box label="IMs per Email zuschicken, wenn ich offline bin" name="send_im_to_email"/> - <check_box label="Text-Chatverlauf aktivieren" name="plain_text_chat_history"/> - <radio_group name="chat_window" tool_tip="Zeigen sie Ihre Sofortnachrichten (Instant Messages) in einem anderen Fenster oder in einem einzigen Fenster mit viele Registerkarten an (Neustart erforderlich)."> - <radio_item label="Mehrere Fenster" name="radio" value="0"/> - <radio_item label="Ein Fenster" name="radio2" value="1"/> + <check_box label="Kompakten Text-Chatverlauf aktivieren" name="plain_text_chat_history"/> + <text name="show_ims_in_label"> + IMs anzeigen in: + </text> + <text name="requires_restart_label"> + (Neustart erforderlich) + </text> + <radio_group name="chat_window" tool_tip="Zeigen Sie Ihre Sofortnachrichten (Instant Messages) in einem anderen Fenster oder in einem einzigen Fenster mit vielen Registerkarten an (Neustart erforderlich)."> + <radio_item label="Getrennte Fenster" name="radio" value="0"/> + <radio_item label="Registerkarten" name="radio2" value="1"/> </radio_group> </panel> diff --git a/indra/newview/skins/default/xui/de/panel_preferences_general.xml b/indra/newview/skins/default/xui/de/panel_preferences_general.xml index 490b0b296b..b59a779853 100644 --- a/indra/newview/skins/default/xui/de/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/de/panel_preferences_general.xml @@ -19,21 +19,21 @@ <text name="language_textbox2"> (Erfordert Neustart) </text> - <text name="maturity_desired_prompt"> - Ich möchte auf Inhalt mit folgender Alterseinstufung zugreifen: + <text name="maturity_desired_prompt" width="350"> + Ich möchte auf Inhalt mit folgender Einstufung zugreifen: </text> <text name="maturity_desired_textbox"/> <combo_box name="maturity_desired_combobox"> - <combo_box.item label="Allgemein, Moderat, Adult" name="Desired_Adult"/> - <combo_box.item label="Allgemein und Moderat" name="Desired_Mature"/> - <combo_box.item label="Allgemein" name="Desired_PG"/> + <combo_box.item label="Generell, Moderat, Adult" name="Desired_Adult"/> + <combo_box.item label="Generell und Moderat" name="Desired_Mature"/> + <combo_box.item label="Generell" name="Desired_PG"/> </combo_box> <text name="start_location_textbox"> Startstandort: </text> <combo_box name="start_location_combo"> <combo_box.item label="Mein letzter Standort" name="MyLastLocation" tool_tip="Als Standardeinstellung in letztem Standort anmelden."/> - <combo_box.item label="Mein Heimatort" name="MyHome" tool_tip="Als Standardeinstellung in Zuhauseposition anmelden."/> + <combo_box.item label="Mein Zuhause" name="MyHome" tool_tip="Als Standardeinstellung in Zuhauseposition anmelden."/> </combo_box> <check_box initial_value="true" label="Beim Anmelden anzeigen" name="show_location_checkbox"/> <text name="name_tags_textbox"> @@ -42,7 +42,7 @@ <radio_group name="Name_Tag_Preference"> <radio_item label="Aus" name="radio" value="0"/> <radio_item label="An" name="radio2" value="1"/> - <radio_item label="Vorübergehend anzeigen" name="radio3" value="2"/> + <radio_item label="Kurz anzeigen" name="radio3" value="2"/> </radio_group> <check_box label="Meinen Namen anzeigen" name="show_my_name_checkbox1"/> <check_box initial_value="true" label="Kleine Avatarnamen" name="small_avatar_names_checkbox"/> diff --git a/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml index e7bb768925..16b4598486 100644 --- a/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml @@ -55,7 +55,7 @@ <text name="AvatarRenderingText"> Avatar-Darstellung: </text> - <check_box initial_value="true" label="Scheinavatare" name="AvatarImpostors"/> + <check_box initial_value="true" label="Vereinfachte Avatardarstellung" name="AvatarImpostors"/> <check_box initial_value="true" label="Hardware-Hautberechnung" name="AvatarVertexProgram"/> <check_box initial_value="true" label="Avatar-Kleidung" name="AvatarCloth"/> <slider label="Sichtweite:" name="DrawDistance"/> diff --git a/indra/newview/skins/default/xui/de/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/de/panel_preferences_privacy.xml index 0c0924026e..42a625fbf6 100644 --- a/indra/newview/skins/default/xui/de/panel_preferences_privacy.xml +++ b/indra/newview/skins/default/xui/de/panel_preferences_privacy.xml @@ -3,7 +3,7 @@ <panel.string name="log_in_to_change"> Anmelden, um Änderungen vorzunehmen </panel.string> - <button label="Verlauf leeren" name="clear_cache"/> + <button label="Cache leeren" name="clear_cache" tool_tip="Bild bei Anmeldung, letzter Standort, Teleport-Liste, Internet- und Texturen-Cache löschen"/> <text name="cache_size_label_l"> (Standorte, Bilder, Web, Suchverlauf) </text> @@ -11,8 +11,6 @@ <check_box label="Nur Freunde und Gruppen können mich anrufen oder mir eine IM schicken" name="voice_call_friends_only_check"/> <check_box label="Mikrofon ausschalten, wenn Anrufe beendet werden" name="auto_disengage_mic_check"/> <check_box label="Cookies annehmen" name="cookies_enabled"/> - <check_box label="Medien aktiviert" name="media_enabled"/> - <check_box label="Automatische Wiedergabe zulassen" name="autoplay_enabled"/> <text name="Logs:"> Protokolle: </text> @@ -20,8 +18,8 @@ <check_box label="IM Protokolle auf meinem Computer speichern" name="log_instant_messages"/> <check_box label="Zeitstempel hinzufügen" name="show_timestamps_check_im"/> <text name="log_path_desc"> - Speicherort für Protokolle: + Protokolle speichern in: </text> <button label="Durchsuchen" label_selected="Durchsuchen" name="log_path_button"/> - <button label="Ignorierte Einwohner/Objekte" name="block_list"/> + <button label="Ignorierte Einwohner/Objekte" name="block_list" width="180"/> </panel> diff --git a/indra/newview/skins/default/xui/de/panel_preferences_setup.xml b/indra/newview/skins/default/xui/de/panel_preferences_setup.xml index 00be3920ca..02c6fb0606 100644 --- a/indra/newview/skins/default/xui/de/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/de/panel_preferences_setup.xml @@ -18,29 +18,32 @@ kbit/s </text> <check_box label="Eigener Port" name="connection_port_enabled"/> - <spinner label="Portnummer:" name="web_proxy_port"/> + <spinner label="Port-Nummer:" name="connection_port"/> <text name="cache_size_label_l"> Cachegröße </text> <text name="text_box5"> MB </text> - <button label="Durchsuchen" label_selected="Durchsuchen" name="set_cache"/> - <button label="Zurücksetzen" label_selected="Zurücksetzen" name="reset_cache"/> <text name="Cache location"> Cache-Ordner: </text> + <button label="Durchsuchen" label_selected="Durchsuchen" name="set_cache"/> + <button label="Zurücksetzen" label_selected="Zurücksetzen" name="reset_cache"/> <text name="Web:"> Web: </text> <radio_group name="use_external_browser"> - <radio_item label="Integrierten Browser verwenden" name="internal" tool_tip="Integrierten Webbrowser verwenden, um die Hilfe, Weblinks usw. anzuzeigen. Dieser Browser öffnet als neues Fenster innerhalb von [APP_NAME]."/> - <radio_item label="Meinen Browser verwenden (IE, Firefox)" name="external" tool_tip="Standard Webbrowser des Systems verwenden, um die Hilfe, Weblinks usw. anzuzeigen. Bei Vollbildmodus nicht empfohlen."/> + <radio_item label="Meinen Browser verwenden (IE, Firefox, Safari)" name="external" tool_tip="Standard Webbrowser des Systems verwenden, um die Hilfe, Weblinks usw. anzuzeigen. Bei Vollbildmodus nicht empfohlen." value="1"/> + <radio_item label="Integrierten Browser verwenden" name="internal" tool_tip="Integrierten Webbrowser verwenden, um die Hilfe, Weblinks usw. anzuzeigen. Dieser Browser öffnet als neues Fenster innerhalb von [APP_NAME]." value=""/> </radio_group> - <check_box initial_value="false" label="Web Proxy" name="web_proxy_enabled"/> - <line_editor name="web_proxy_editor" tool_tip="Name oder IP Adresse des Proxyservers, den Sie benutzen möchten"/> - <button label="Durchsuchen" label_selected="Durchsuchen" name="set_proxy"/> + <check_box initial_value="true" label="Plugins aktivieren" name="browser_plugins_enabled"/> + <check_box initial_value="true" label="Cookies annehmen" name="cookies_enabled"/> + <check_box initial_value="true" label="Javascript aktivieren" name="browser_javascript_enabled"/> + <check_box initial_value="false" label="Web-Proxy aktivieren" name="web_proxy_enabled"/> <text name="Proxy location"> Proxy-Standort: </text> + <line_editor name="web_proxy_editor" tool_tip="Name oder IP Adresse des Proxyservers, den Sie benutzen möchten"/> + <spinner label="Portnummer:" name="web_proxy_port"/> </panel> diff --git a/indra/newview/skins/default/xui/de/panel_preferences_sound.xml b/indra/newview/skins/default/xui/de/panel_preferences_sound.xml index 2398da71d0..44b2bd1f60 100644 --- a/indra/newview/skins/default/xui/de/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/de/panel_preferences_sound.xml @@ -1,14 +1,21 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Sounds" name="Preference Media panel"> <slider label="Master-Lautstärke" name="System Volume"/> - <check_box initial_value="true" label="Stummschalten, wenn verkleinert" name="mute_when_minimized"/> - <slider label="Umgebung" name="Wind Volume"/> + <check_box initial_value="true" label="Stummschalten, wenn minimiert" name="mute_when_minimized"/> <slider label="Schaltflächen" name="UI Volume"/> - <slider label="Medien" name="Media Volume"/> + <slider label="Umgebung" name="Wind Volume"/> <slider label="Soundeffekte" name="SFX Volume"/> <slider label="Musik wird gestreamt" name="Music Volume"/> - <check_box label="Voice aktivieren" name="enable_voice_check"/> - <slider label="Sprache" name="Voice Volume"/> + <check_box label="Aktiviert" name="music_enabled"/> + <slider label="Medien" name="Media Volume"/> + <check_box label="Aktiviert" name="enable_media"/> + <slider label="Voice-Chat" name="Voice Volume"/> + <check_box label="Aktiviert" name="enable_voice_check"/> + <check_box label="Automatische Wiedergabe zulassen" name="media_auto_play_btn" tool_tip="Hier aktivieren, um Medien automatisch wiederzugeben."/> + <check_box label="Medien, die an andere Avatare angehängt sind, wiedergeben." name="media_show_on_others_btn" tool_tip="Diese Option deaktivieren, um Medien für andere Avataren, die sich in der Nähe befinden, auszublenden."/> + <text name="voice_chat_settings"> + Voice-Chat-Einstellungen + </text> <text name="Listen from"> Zuhören von: </text> diff --git a/indra/newview/skins/default/xui/de/panel_profile.xml b/indra/newview/skins/default/xui/de/panel_profile.xml index 82467eb570..cda2788e40 100644 --- a/indra/newview/skins/default/xui/de/panel_profile.xml +++ b/indra/newview/skins/default/xui/de/panel_profile.xml @@ -28,11 +28,14 @@ </panel> <text name="title_member_text" value="Einwohner seit:"/> <text name="title_acc_status_text" value="Kontostatus:"/> - <text name="acc_status_text"> + <text_editor name="acc_status_text"> Einwohner. Keine Zahlungsinfo archiviert. Linden. - </text> + </text_editor> <text name="title_partner_text" value="Partner:"/> + <panel name="partner_data_panel"> + <name_box initial_value="(wird in Datenbank gesucht)" name="partner_text"/> + </panel> <text name="title_groups_text" value="Gruppen:"/> </panel> </scroll_container> @@ -43,6 +46,7 @@ <button label="Anrufen" name="call" tool_tip="Diesen Einwohner anrufen"/> <button label="Karte" name="show_on_map_btn" tool_tip="Einwohner auf Karte anzeigen"/> <button label="Teleportieren" name="teleport" tool_tip="Teleport anbieten"/> + <button label="â–¼" name="overflow_btn" tool_tip="Dem Einwohner Geld geben oder Inventar an den Einwohner schicken"/> </layout_panel> <layout_panel name="profile_me_buttons_panel"> <button label="Profil bearbeiten" name="edit_profile_btn" tool_tip="Ihre persönlichen Informationen bearbeiten"/> diff --git a/indra/newview/skins/default/xui/de/panel_profile_view.xml b/indra/newview/skins/default/xui/de/panel_profile_view.xml index 4d59c16e98..f02457dd80 100644 --- a/indra/newview/skins/default/xui/de/panel_profile_view.xml +++ b/indra/newview/skins/default/xui/de/panel_profile_view.xml @@ -8,7 +8,7 @@ </string> <text_editor name="user_name" value="(wird geladen...)"/> <text name="status" value="Online"/> - <tab_container name="tabs"> + <tab_container name="tabs" tab_min_width="60"> <panel label="PROFIL" name="panel_profile"/> <panel label="AUSWAHL" name="panel_picks"/> <panel label="NOTIZEN & PRIVATSPHÄRE" name="panel_notes"/> diff --git a/indra/newview/skins/default/xui/de/panel_region_covenant.xml b/indra/newview/skins/default/xui/de/panel_region_covenant.xml index 14be8def7e..225c98b84f 100644 --- a/indra/newview/skins/default/xui/de/panel_region_covenant.xml +++ b/indra/newview/skins/default/xui/de/panel_region_covenant.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Vertrag" name="Covenant"> <text name="estate_section_lbl"> - Grundstück + Grundbesitz </text> <text name="estate_name_lbl"> Name: @@ -18,20 +18,20 @@ <text name="estate_cov_lbl"> Vertrag: </text> - <text name="covenant_timestamp_text"> + <text name="covenant_timestamp_text" width="320"> Letzte Änderung am Mittwoch, den 31. Dez. 1969, 16:00:00 </text> <button label="?" name="covenant_help"/> <text_editor bottom="-247" height="162" name="covenant_editor"> - Für dieses Grundstück fehlt der Vertrag. + Für diesen Grundbesitz fehlt der Vertrag. </text_editor> <button label="Zurücksetzen" name="reset_covenant"/> <text name="covenant_help_text"> Änderungen am Vertrag werden für alle Parzellen auf dem - Grundstück übernommen. +Grundbesitz übernommen. </text> <text bottom_delta="-36" name="covenant_instructions"> - Ziehen Sie eine Notizkarte an diese Stelle, um den Vertrag für dieses Grundstück zu ändern. + Ziehen Sie eine Notizkarte an diese Stelle, um den Vertrag für diesen Grundbesitz zu ändern. </text> <text bottom_delta="-36" name="region_section_lbl"> Region @@ -63,7 +63,7 @@ <text name="changeable_lbl"> Unterteilen: </text> - <text name="changeable_clause"> + <text name="changeable_clause" width="366"> Land in dieser Region kann nicht zusammengelegt/geteilt werden. </text> <string name="can_resell"> diff --git a/indra/newview/skins/default/xui/de/panel_region_debug.xml b/indra/newview/skins/default/xui/de/panel_region_debug.xml index 40befab4dd..d1b8f0d78a 100644 --- a/indra/newview/skins/default/xui/de/panel_region_debug.xml +++ b/indra/newview/skins/default/xui/de/panel_region_debug.xml @@ -13,7 +13,7 @@ <check_box label="Physik deaktivieren" name="disable_physics_check" tool_tip="Physik in dieser Region deaktivieren"/> <button label="?" name="disable_physics_help"/> <button label="Übernehmen" name="apply_btn"/> - <text name="objret_text_lbl" width="105"> + <text name="objret_text_lbl" width="110"> Objekt zurückgeben </text> <text name="resident_text_lbl"> @@ -28,7 +28,7 @@ </text> <check_box label="Mit Skripten" name="return_scripts" tool_tip="Es werden nur die Objekte zurückgegeben, die über Skripte verfügen."/> <check_box label="Auf dem Land von jemand anderem" name="return_other_land" tool_tip="Es werden nur die Objekte zurückgegeben, die sich auf dem Land eines anderen Einwohners befinden"/> - <check_box label="In jeder Region auf diesem Grundstück" name="return_estate_wide" tool_tip="Es werden die Objekte in allen Regionen dieses Grundstücks zurückgegeben"/> + <check_box label="In jeder Region auf diesem Grundbesitz" name="return_estate_wide" tool_tip="Es werden die Objekte in allen Regionen dieses Grundbesitzes zurückgegeben"/> <button label="Zurückgeben" name="return_btn" width="90"/> <button label="Top-Kollisionsobjekte..." name="top_colliders_btn" tool_tip="Liste der Objekte mit den meisten potenziellen Kollisionen"/> <button label="?" name="top_colliders_help"/> diff --git a/indra/newview/skins/default/xui/de/panel_region_estate.xml b/indra/newview/skins/default/xui/de/panel_region_estate.xml index b0c6dce8cf..b93bd3e442 100644 --- a/indra/newview/skins/default/xui/de/panel_region_estate.xml +++ b/indra/newview/skins/default/xui/de/panel_region_estate.xml @@ -1,24 +1,24 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Grundstück" name="Estate"> +<panel label="Grundbesitz" name="Estate"> <text name="estate_help_text"> - Änderungen auf dieser Registerkarte wirken sich auf alle Regionen auf dem Grundstück aus. + Änderungen wirken sich auf alle Regionen des Grundbesitzes aus. </text> <text name="estate_text"> - Grundstück: + Grundbesitz: </text> <text name="estate_name"> (unbekannt) </text> <text name="owner_text"> - Grundstückseigentümer: + Grundbesitzer: </text> <text name="estate_owner"> (unbekannt) </text> <text name="Only Allow"> - Zugang auf Einwohner beschränken, die überprüft wurden von: + Zugang nur dann, wenn überprüft mit: </text> - <check_box label="Zahlungsinformation gespeichert" name="limit_payment" tool_tip="Nicht identifizierte Einwohner verbannen"/> + <check_box label="Zahlungsinformation gespeichert" name="limit_payment" tool_tip="Einwohner ohne Zahlungsinformation nicht zulassen."/> <check_box label="Altersüberprüfung" name="limit_age_verified" tool_tip="Einwohner ohne Altersüberprüfung verbannen. Weitere Informationen finden Sie auf [SUPPORT_SITE]."/> <check_box label="Voice-Chat erlauben" name="voice_chat_check"/> <button label="?" name="voice_chat_help"/> @@ -49,7 +49,7 @@ <check_box label="Verweigern - Zahlungsinfo verwendet" name="deny_transacted"/> <button label="Übernehmen" name="apply_btn"/> <text name="estate_manager_label"> - Grundstücksverwalter: + Grundbesitzsverwalter: </text> <text name="allow_resident_label"> Zulässige Einwohner: @@ -69,6 +69,6 @@ <button label="?" name="ban_resident_help"/> <button label="Hinzufügen..." name="add_banned_avatar_btn"/> <button label="Entfernen..." name="remove_banned_avatar_btn"/> - <button label="Nachricht an Grundstück senden..." name="message_estate_btn"/> - <button label="Benutzer von Grundstück werfen..." name="kick_user_from_estate_btn"/> + <button label="Nachricht an Grundbesitz" name="message_estate_btn"/> + <button label="Einwohner hinauswerfen" name="kick_user_from_estate_btn"/> </panel> diff --git a/indra/newview/skins/default/xui/de/panel_region_general.xml b/indra/newview/skins/default/xui/de/panel_region_general.xml index 978b701054..be8507ebbd 100644 --- a/indra/newview/skins/default/xui/de/panel_region_general.xml +++ b/indra/newview/skins/default/xui/de/panel_region_general.xml @@ -19,35 +19,25 @@ unbekannt </text> <check_box label="Terraformen blockieren" name="block_terraform_check"/> - <button label="?" name="terraform_help"/> <check_box label="Fliegen blockieren" name="block_fly_check"/> - <button label="?" name="fly_help"/> <check_box label="Schaden zulassen" name="allow_damage_check"/> - <button label="?" name="damage_help"/> <check_box label="Stoßen beschränken" name="restrict_pushobject"/> - <button label="?" name="restrict_pushobject_help"/> <check_box label="Landwiederverkauf zulassen" name="allow_land_resell_check"/> - <button label="?" name="land_resell_help"/> <check_box label="Landumverteilung zulassen" name="allow_parcel_changes_check"/> - <button label="?" name="parcel_changes_help"/> <check_box label="Landanzeige in Suche blockieren" name="block_parcel_search_check" tool_tip="Diese Region und ihre Parzellen in Suchergebnissen anzeigen"/> - <button label="?" name="parcel_search_help"/> <spinner label="Avatar-Limit" name="agent_limit_spin"/> - <button label="?" name="agent_limit_help"/> <spinner label="Objektbonus" name="object_bonus_spin"/> - <button label="?" name="object_bonus_help"/> - <text label="Alterseinstufung" name="access_text"> + <text label="Inhaltseinstufung" name="access_text"> Einstufung: </text> - <combo_box label="Moderat" name="access_combo"> - <combo_box.item label="Adult" name="Adult"/> - <combo_box.item label="Moderat" name="Mature"/> - <combo_box.item label="Allgemein" name="PG"/> - </combo_box> - <button label="?" name="access_help"/> + <icons_combo_box label="Moderat" name="access_combo"> + <icons_combo_box.item label="Adult" name="Adult" value="42"/> + <icons_combo_box.item label="Moderat" name="Mature" value="21"/> + <icons_combo_box.item label="Generell" name="PG" value="13"/> + </icons_combo_box> <button label="Übernehmen" name="apply_btn"/> - <button label="Einen Benutzer nach Hause teleportieren..." name="kick_btn"/> - <button label="Alle Benutzer nach Hause teleportieren..." name="kick_all_btn"/> + <button label="Einen Einwohner nach Hause teleportieren..." name="kick_btn"/> + <button label="Alle Einwohner nach Hause teleportieren..." name="kick_all_btn"/> <button label="Nachricht an Region senden..." name="im_btn"/> <button label="Telehub verwalten..." name="manage_telehub_btn"/> </panel> diff --git a/indra/newview/skins/default/xui/de/panel_region_general_layout.xml b/indra/newview/skins/default/xui/de/panel_region_general_layout.xml index 732249df35..09142ada6f 100644 --- a/indra/newview/skins/default/xui/de/panel_region_general_layout.xml +++ b/indra/newview/skins/default/xui/de/panel_region_general_layout.xml @@ -36,8 +36,8 @@ <combo_box.item label="Allgemein" name="PG"/> </combo_box> <button label="Übernehmen" name="apply_btn"/> - <button label="Einen Benutzer nach Hause teleportieren..." name="kick_btn"/> - <button label="Alle Benutzer nach Hause teleportieren..." name="kick_all_btn"/> + <button label="Einen Einwohner nach Hause teleportieren..." name="kick_btn"/> + <button label="Alle Einwohner nach Hause teleportieren..." name="kick_all_btn"/> <button label="Nachricht an Region senden..." name="im_btn"/> <button label="Telehub verwalten..." name="manage_telehub_btn"/> </panel> diff --git a/indra/newview/skins/default/xui/de/panel_region_terrain.xml b/indra/newview/skins/default/xui/de/panel_region_terrain.xml index e79c8584ba..01721791a7 100644 --- a/indra/newview/skins/default/xui/de/panel_region_terrain.xml +++ b/indra/newview/skins/default/xui/de/panel_region_terrain.xml @@ -12,17 +12,17 @@ <button label="?" name="terrain_raise_help" /> <spinner label="Untere Terraingrenze" name="terrain_lower_spin" /> <button label="?" name="terrain_lower_help" /> - <check_box label="Grundstücksonne verwenden" name="use_estate_sun_check" /> + <check_box label="Grundbesitzsonne verwenden" name="use_estate_sun_check" /> <button label="?" name="use_estate_sun_help" /> <check_box label="Sonne fest" name="fixed_sun_check" /> <button label="?" name="fixed_sun_help" /> <slider label="Phase" name="sun_hour_slider" /> <button label="Übernehmen" name="apply_btn" /> <button label="RAW-Terrain herunterladen..." name="download_raw_btn" - tool_tip="Nur für Grundstückseigentümer verfügbar, nicht für Verwalter" /> + tool_tip="Nur für Grundbesitzeigentümer verfügbar, nicht für Verwalter" /> <button label="?" name="download_raw_help" /> <button label="RAW-Terrain hochladen..." name="upload_raw_btn" - tool_tip="Nur für Grundstückseigentümer verfügbar, nicht für Verwalter" /> + tool_tip="Nur für Grundbesitzeigentümer verfügbar, nicht für Verwalter" /> <button label="?" name="upload_raw_help" /> <button label="Terrain formen" name="bake_terrain_btn" tool_tip="Das aktuelle Terrain zum Mittelpunkt für die oberen/unteren Terraingrenzen machen" /> diff --git a/indra/newview/skins/default/xui/de/panel_region_texture.xml b/indra/newview/skins/default/xui/de/panel_region_texture.xml index d489b5bac8..2f4904730b 100644 --- a/indra/newview/skins/default/xui/de/panel_region_texture.xml +++ b/indra/newview/skins/default/xui/de/panel_region_texture.xml @@ -25,25 +25,25 @@ Texturhöhenbereich </text> <text name="height_text_lbl6"> - Südwest + Nordwest </text> <text name="height_text_lbl7"> - Nordwest + Nordost </text> <text name="height_text_lbl8"> - Südost + Südwest </text> <text name="height_text_lbl9"> - Nordost + Südost </text> - <spinner label="Niedrig" name="height_start_spin_0"/> - <spinner label="Niedrig" name="height_start_spin_1"/> - <spinner label="Niedrig" name="height_start_spin_2"/> - <spinner label="Niedrig" name="height_start_spin_3"/> - <spinner label="Hoch" name="height_range_spin_0"/> - <spinner label="Hoch" name="height_range_spin_1"/> - <spinner label="Hoch" name="height_range_spin_2"/> - <spinner label="Hoch" name="height_range_spin_3"/> + <spinner label="Niedrig" label_width="40" name="height_start_spin_0"/> + <spinner label="Niedrig" label_width="40" name="height_start_spin_1"/> + <spinner label="Niedrig" label_width="40" name="height_start_spin_2"/> + <spinner label="Niedrig" label_width="40" name="height_start_spin_3"/> + <spinner label="Hoch" label_width="40" name="height_range_spin_0"/> + <spinner label="Hoch" label_width="40" name="height_range_spin_1"/> + <spinner label="Hoch" label_width="40" name="height_range_spin_2"/> + <spinner label="Hoch" label_width="40" name="height_range_spin_3"/> <text name="height_text_lbl10"> Diese Werte geben den Mischungsgrad für die obigen Texturen an. </text> diff --git a/indra/newview/skins/default/xui/de/panel_script_limits_my_avatar.xml b/indra/newview/skins/default/xui/de/panel_script_limits_my_avatar.xml index f6a1d7e9b5..c91eb98e9c 100644 --- a/indra/newview/skins/default/xui/de/panel_script_limits_my_avatar.xml +++ b/indra/newview/skins/default/xui/de/panel_script_limits_my_avatar.xml @@ -1,10 +1,13 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="MEIN AVATAR" name="script_limits_my_avatar_panel"> + <text name="script_memory"> + Avatar-Skript-Gebrauch + </text> <text name="loading_text"> Wird geladen... </text> <scroll_list name="scripts_list"> - <scroll_list.columns label="Größe (KB)" name="size"/> + <scroll_list.columns label="Größe (KB)" name="size" width="80"/> <scroll_list.columns label="URLs" name="urls"/> <scroll_list.columns label="Objektname" name="name"/> <scroll_list.columns label="Ort" name="location"/> diff --git a/indra/newview/skins/default/xui/de/panel_script_limits_region_memory.xml b/indra/newview/skins/default/xui/de/panel_script_limits_region_memory.xml index c466c04e86..8d7cc1bf9a 100644 --- a/indra/newview/skins/default/xui/de/panel_script_limits_region_memory.xml +++ b/indra/newview/skins/default/xui/de/panel_script_limits_region_memory.xml @@ -3,22 +3,20 @@ <text name="script_memory"> Parzellenskript-Speicher </text> - <text name="parcels_listed"> - Parzelleneigentümer: - </text> - <text name="memory_used"> - Verwendeter Speicher: - </text> + <text name="parcels_listed"/> + <text name="memory_used"/> <text name="loading_text"> Wird geladen... </text> <scroll_list name="scripts_list"> - <scroll_list.columns label="Größe (KB)" name="size"/> + <scroll_list.columns label="Größe (KB)" name="size" width="80"/> + <scroll_list.columns label="URLs" name="urls"/> <scroll_list.columns label="Objektname" name="name"/> - <scroll_list.columns label="Objekteigentümer" name="owner"/> - <scroll_list.columns label="Parzelle / Standort" name="location"/> + <scroll_list.columns label="Objekteigentümer" name="owner" width="130"/> + <scroll_list.columns label="Parzelle" name="parcel"/> + <scroll_list.columns label="Standort" name="location"/> </scroll_list> - <button label="Liste aktualisieren" name="refresh_list_btn"/> + <button label="Liste aktualisieren" name="refresh_list_btn" width="110"/> <button label="Markieren" name="highlight_btn"/> <button label="Zurückgeben" name="return_btn"/> </panel> diff --git a/indra/newview/skins/default/xui/de/panel_side_tray.xml b/indra/newview/skins/default/xui/de/panel_side_tray.xml index 2cd11cdcef..3c81636fa0 100644 --- a/indra/newview/skins/default/xui/de/panel_side_tray.xml +++ b/indra/newview/skins/default/xui/de/panel_side_tray.xml @@ -2,26 +2,28 @@ <!-- Side tray cannot show background because it is always partially on screen to hold tab buttons. --> <side_tray name="sidebar"> - <sidetray_tab description="Seitenleiste auf-/zuklappen." name="sidebar_openclose"/> - <sidetray_tab description="Startseite." name="sidebar_home"> + <sidetray_tab description="Seitenleiste auf-/zuklappen." name="sidebar_openclose" tab_title="Seitenleiste auf-/zuklappen"/> + <sidetray_tab description="Startseite." name="sidebar_home" tab_title="Startseite"> <panel label="Startseite" name="panel_home"/> </sidetray_tab> - <sidetray_tab description="Ihr öffentliches Profil und Auswahl bearbeiten." name="sidebar_me"> - <panel label="Ich" name="panel_me"/> + <sidetray_tab description="Ihr öffentliches Profil und Auswahl bearbeiten." name="sidebar_me" tab_title="Mein Profil"> + <panel_container name="panel_container"> + <panel label="Ich" name="panel_me"/> + </panel_container> </sidetray_tab> - <sidetray_tab description="Freunde, Kontakte und Leute in Ihrer Nähe finden." name="sidebar_people"> + <sidetray_tab description="Freunde, Kontakte und Leute in Ihrer Nähe finden." name="sidebar_people" tab_title="Leute"> <panel_container name="panel_container"> - <panel label="Gruppeninfo" name="panel_group_info_sidetray"/> + <panel label="Gruppenprofil" name="panel_group_info_sidetray"/> <panel label="Ignorierte Einwohner & Objekte" name="panel_block_list_sidetray"/> </panel_container> </sidetray_tab> - <sidetray_tab description="Hier finden Sie neue Orte und Orte, die Sie bereits besucht haben." label="Orte" name="sidebar_places"> + <sidetray_tab description="Hier finden Sie neue Orte und Orte, die Sie bereits besucht haben." label="Orte" name="sidebar_places" tab_title="Orte"> <panel label="Orte" name="panel_places"/> </sidetray_tab> - <sidetray_tab description="Inventar durchsuchen." name="sidebar_inventory"> + <sidetray_tab description="Inventar durchsuchen." name="sidebar_inventory" tab_title="Mein Inventar"> <panel label="Inventar bearbeiten" name="sidepanel_inventory"/> </sidetray_tab> - <sidetray_tab description="Ändern Sie Ihr Aussehen und Ihren aktuellen Look." name="sidebar_appearance"> + <sidetray_tab description="Ändern Sie Ihr Aussehen und Ihren aktuellen Look." name="sidebar_appearance" tab_title="Mein Aussehen"> <panel label="Aussehen bearbeiten" name="sidepanel_appearance"/> </sidetray_tab> </side_tray> diff --git a/indra/newview/skins/default/xui/de/panel_stand_stop_flying.xml b/indra/newview/skins/default/xui/de/panel_stand_stop_flying.xml index 5b8137af4a..be21429007 100644 --- a/indra/newview/skins/default/xui/de/panel_stand_stop_flying.xml +++ b/indra/newview/skins/default/xui/de/panel_stand_stop_flying.xml @@ -2,5 +2,5 @@ <!-- Width and height of this panel should be synchronized with "panel_modes" in the floater_moveview.xml--> <panel name="panel_stand_stop_flying"> <button label="Stehen" name="stand_btn" tool_tip="Klicken Sie hier, um aufzustehen."/> - <button label="Landen" name="stop_fly_btn" tool_tip="Landen"/> + <button label="Flug stoppen" name="stop_fly_btn" tool_tip="Flug stoppen"/> </panel> diff --git a/indra/newview/skins/default/xui/de/panel_status_bar.xml b/indra/newview/skins/default/xui/de/panel_status_bar.xml index 33fd0f6348..005290c1ff 100644 --- a/indra/newview/skins/default/xui/de/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/de/panel_status_bar.xml @@ -21,10 +21,13 @@ <panel.string name="buycurrencylabel"> [AMT] L$ </panel.string> - <button label="" label_selected="" name="buycurrency" tool_tip="Mein Kontostand"/> - <button label="L$ kaufen" name="buyL" tool_tip="Hier klicken, um mehr L$ zu kaufen"/> + <panel name="balance_bg"> + <text name="balance" tool_tip="Mein Kontostand" value="20 L$"/> + <button label="L$ kaufen" name="buyL" tool_tip="Hier klicken, um mehr L$ zu kaufen"/> + </panel> <text name="TimeText" tool_tip="Aktuelle Zeit (Pazifik)"> - 12:00 + 24:00 H PST </text> + <button name="media_toggle_btn" tool_tip="Alle Medien starten/stoppen (Musik, Video, Webseiten)"/> <button name="volume_btn" tool_tip="Steuerung der Gesamtlautstärke"/> </panel> diff --git a/indra/newview/skins/default/xui/de/panel_voice_effect.xml b/indra/newview/skins/default/xui/de/panel_voice_effect.xml new file mode 100644 index 0000000000..363ee013e3 --- /dev/null +++ b/indra/newview/skins/default/xui/de/panel_voice_effect.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_voice_effect"> + <string name="no_voice_effect"> + Kein Voice-Morphing + </string> + <string name="preview_voice_effects"> + Voice-Morphing ausprobieren â–¶ + </string> + <string name="get_voice_effects"> + Voice-Morphing abonnieren â–¶ + </string> + <combo_box name="voice_effect" tool_tip="Wählen Sie einen Voice-Morph-Effekt aus, um Ihre Stimme zu verändern."> + <combo_box.item label="Kein Voice-Morphing" name="no_voice_effect"/> + </combo_box> +</panel> diff --git a/indra/newview/skins/default/xui/de/panel_world_map.xml b/indra/newview/skins/default/xui/de/panel_world_map.xml index f7454dd634..35fe3d3ffc 100644 --- a/indra/newview/skins/default/xui/de/panel_world_map.xml +++ b/indra/newview/skins/default/xui/de/panel_world_map.xml @@ -30,6 +30,12 @@ <panel.string name="world_map_northwest"> NW </panel.string> + <panel.string name="world_map_person"> + 1 Person + </panel.string> + <panel.string name="world_map_people"> + [NUMBER] Leute + </panel.string> <text label="N" name="floater_map_north" text="N"> N </text> diff --git a/indra/newview/skins/default/xui/de/role_actions.xml b/indra/newview/skins/default/xui/de/role_actions.xml index 554a5c27a4..b20fcabc82 100644 --- a/indra/newview/skins/default/xui/de/role_actions.xml +++ b/indra/newview/skins/default/xui/de/role_actions.xml @@ -30,7 +30,7 @@ </action_set> <action_set description="Diese Fähigkeiten ermöglichen es, Parzellenoptionen wie „Objekte erstellen“, „Terrain bearbeiten“ sowie Musik- und Medieneinstellungen zu ändern." name="Parcel Settings"> <action description="Musik- und Medieneinstellungen ändern" longdescription="Die Einstellungen für Streaming-Musik und Filme finden Sie unter „Land-Info“ > „Medien“." name="land change media"/> - <action description="„Terrain bearbeiten“ ein/aus" longdescription="„Terrain bearbeiten“ ein/aus. *WARNUNG* „Land-Info“ > „Optionen“ > „Terrain bearbeiten“ ermöglicht jedem das Terraformen Ihres Grundstücks und das Setzen und Verschieben von Linden-Pflanzen. Überlegen Sie sich, wem Sie diese Fähigkeit verleihen. Diese Einstellung finden Sie unter „Land-Info“ > „Optionen“." name="land edit"/> + <action description="„Terrain bearbeiten“ ein/aus" longdescription="„Terrain bearbeiten“ ein/aus. *WARNUNG* „Land-Info“ > „Optionen“ > „Terrain bearbeiten“ ermöglicht jedem das Terraformen Ihres Grundbesitzes und das Setzen und Verschieben von Linden-Pflanzen. Überlegen Sie sich, wem Sie diese Fähigkeit verleihen. Diese Einstellung finden Sie unter „Land-Info“ > „Optionen“." name="land edit"/> <action description="„Land-Info“-Optionen einstellen" longdescription="„Sicher (kein Schaden)“ und „Fliegen“ ein- und ausschalten und Einwohnern folgende Aktionen erlauben: „Terrain bearbeiten“, „Bauen“, „Landmarken erstellen“ und „Skripts ausführen“ auf gruppeneigenem Land in „Land-Info“ > Registerkarte „Optionen“." name="land options"/> </action_set> <action_set description="Diese Fähigkeiten ermöglichen es, Mitgliedern das Umgehen von Restriktionen auf gruppeneigenen Parzellen zu erlauben." name="Parcel Powers"> @@ -46,7 +46,7 @@ <action description="Parzelleneinstellungen für „Pässe verkaufen“ ändern" longdescription="Die Parzellen-Einstellungen für „Pässe verkaufen“ ändern Sie unter „Land-Info“ > Registerkarte „Zugang“." name="land manage passes"/> <action description="Einwohner aus Parzellen werfen und einfrieren" longdescription="Mitglieder in einer Rolle mit dieser Fähigkeit können gegen unerwünschte Einwohner auf einer gruppeneigenen Parzelle Maßnahmen ergreifen. Klicken Sie den Einwohner mit rechts an und wählen Sie „Hinauswerfen“ oder „Einfrieren“." name="land admin"/> </action_set> - <action_set description="Diese Fähigkeiten ermöglichen es, Mitgliedern das Zurückgeben von Objekten sowie das Platzieren und Verschieben von Linden-Pflanzen zu erlauben. Mitglieder können das Grundstück aufräumen und an der Landschaftsgestaltung mitwirken. Aber Vorsicht: Zurückgegebene Objekte können nicht mehr zurückgeholt werden." name="Parcel Content"> + <action_set description="Diese Fähigkeiten ermöglichen es, Mitgliedern das Zurückgeben von Objekten sowie das Platzieren und Verschieben von Linden-Pflanzen zu erlauben. Mitglieder können den Grundbesitz aufräumen und an der Landschaftsgestaltung mitwirken. Aber Vorsicht: Zurückgegebene Objekte können nicht mehr zurückgeholt werden." name="Parcel Content"> <action description="Gruppeneigene Objekte zurückgeben" longdescription="Gruppeneigene Objekte auf gruppeneigenen Parzellen können Sie unter „Land-Info“ > „Objekte“ zurückgeben." name="land return group owned"/> <action description="Gruppenobjekte zurückgeben" longdescription="Gruppenobjekte auf gruppeneigenen Parzellen können Sie unter „Land-Info“ > „Objekte“ zurückgeben." name="land return group set"/> <action description="Gruppenfremde Objekte zurückgeben" longdescription="Objekte von gruppenfremden Personen auf gruppeneigenen Parzellen können Sie unter „Land-Info“ > „Objekte“ zurückgeben." name="land return non group"/> diff --git a/indra/newview/skins/default/xui/de/sidepanel_inventory.xml b/indra/newview/skins/default/xui/de/sidepanel_inventory.xml index f6cf911bb3..96dd181854 100644 --- a/indra/newview/skins/default/xui/de/sidepanel_inventory.xml +++ b/indra/newview/skins/default/xui/de/sidepanel_inventory.xml @@ -2,10 +2,12 @@ <panel label="Sonstiges" name="objects panel"> <panel label="" name="sidepanel__inventory_panel"> <panel name="button_panel"> - <button label="Profil" name="info_btn"/> - <button label="Anziehen" name="wear_btn"/> + <button label="Profil" name="info_btn" tool_tip="Objektprofil anzeigen"/> + <button label="Teilen" name="share_btn" tool_tip="Inventarobjekt teilen"/> + <button label="Shop" name="shop_btn" tool_tip="Marktplatz-Webseite öffnen"/> + <button label="Anziehen" name="wear_btn" tool_tip="Ausgewähltes Outfit tragen"/> <button label="Wiedergeben" name="play_btn"/> - <button label="Teleportieren" name="teleport_btn"/> + <button label="Teleportieren" name="teleport_btn" tool_tip="Zu ausgewähltem Standort teleportieren"/> </panel> </panel> </panel> diff --git a/indra/newview/skins/default/xui/de/sidepanel_task_info.xml b/indra/newview/skins/default/xui/de/sidepanel_task_info.xml index 9f8fdc085a..990543b725 100644 --- a/indra/newview/skins/default/xui/de/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/de/sidepanel_task_info.xml @@ -37,8 +37,8 @@ Mischverkauf </panel.string> <text name="title" value="Objektprofil"/> - <text name="where" value="(Inworld)"/> - <panel label=""> + <text name="where" value="(inworld)"/> + <panel label="" name="properties_panel"> <text name="Name:"> Name: </text> @@ -85,7 +85,7 @@ <text name="GroupLabel"> Gruppe: </text> - <check_box label="Teilen" name="checkbox share with group" tool_tip="Mit allen Mitgliedern der zugeordneten Gruppe, Ihre Berechtigungen dieses Objekt zu ändern teilen. Sie müssen Übereignen, um Rollenbeschränkungen zu aktivieren."/> + <check_box label="Teilen" name="checkbox share with group" tool_tip="Mit allen Mitgliedern der zugeordneten Gruppe, Ihre Berechtigungen dieses Objekt zu ändern, teilen. Sie müssen Übereignen, um Rollenbeschränkungen zu aktivieren."/> <text name="NextOwnerLabel"> Nächster Eigentümer: </text> @@ -96,7 +96,7 @@ <check_box label="Zum Verkauf" name="checkbox for sale"/> <combo_box name="sale type"> <combo_box.item label="Kopieren" name="Copy"/> - <combo_box.item label="Inhalte" name="Contents"/> + <combo_box.item label="Inhalt" name="Contents"/> <combo_box.item label="Original" name="Original"/> </combo_box> <spinner label="Preis: L$" name="Edit Cost"/> @@ -122,7 +122,8 @@ </panel> <panel name="button_panel"> <button label="Öffnen" name="open_btn"/> - <button label="Zahlen" name="pay_btn"/> + <button label="Bezahlen" name="pay_btn"/> <button label="Kaufen" name="buy_btn"/> + <button label="Details" name="details_btn"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml index 858bbf27b1..bc4f20df26 100644 --- a/indra/newview/skins/default/xui/de/strings.xml +++ b/indra/newview/skins/default/xui/de/strings.xml @@ -23,7 +23,22 @@ Hardware wird erfasst... </string> <string name="StartupLoading"> - Wird geladen + [APP_NAME] wird geladen... + </string> + <string name="StartupClearingCache"> + Cache wird gelöscht... + </string> + <string name="StartupInitializingTextureCache"> + Textur-Cache wird initialisiert... + </string> + <string name="StartupInitializingVFS"> + VFS wird initialisiert... + </string> + <string name="ProgressRestoring"> + Wird wiederhergestellt... + </string> + <string name="ProgressChangingResolution"> + Auflösung wird geändert... </string> <string name="Fullbright"> Fullbright (Legacy) @@ -85,9 +100,18 @@ <string name="LoginDownloadingClothing"> Kleidung wird geladen... </string> + <string name="CertExpired"> + Das vom Grid ausgegebene Zertifikate ist abgelaufen. Bitte überprüfen Sie Ihre Systemuhr oder kontaktieren Sie Ihren Grid-Administrator. + </string> + <string name="CertInvalidSignature"> + Die Zertifikatsunterschrift des Gridservers konnte nicht bestätigt werden. Bitte kontaktieren Sie Ihren Grid-Administrator. + </string> <string name="LoginFailedNoNetwork"> Netzwerk Fehler: Eine Verbindung konnte nicht hergestellt werden. Bitte überprüfen Sie Ihre Netzwerkverbindung. </string> + <string name="LoginFailed"> + Anmeldung fehlgeschlagen + </string> <string name="Quit"> Beenden </string> @@ -97,6 +121,24 @@ <string name="AgentLostConnection"> In dieser Region kann es zu Problemen kommen. Bitte überprüfen Sie Ihre Internetverbindung. </string> + <string name="SavingSettings"> + Ihr Einstellungen werden gespeichert... + </string> + <string name="LoggingOut"> + Abmeldung erfolgt... + </string> + <string name="ShuttingDown"> + Programm wird beendet... + </string> + <string name="YouHaveBeenDisconnected"> + Die Verbindung zu der Region ist abgebrochen. + </string> + <string name="SentToInvalidRegion"> + Sie wurden in eine ungültige Region geschickt. + </string> + <string name="TestingDisconnect"> + Verbindungsabbruch wird getestet + </string> <string name="TooltipPerson"> Person </string> @@ -151,6 +193,24 @@ <string name="TooltipAgentUrl"> Anklicken, um das Profil dieses Einwohners anzuzeigen </string> + <string name="TooltipAgentMute"> + Klicken, um diesen Einwohner stummzuschalten + </string> + <string name="TooltipAgentUnmute"> + Klicken, um diesen Einwohner freizuschalten + </string> + <string name="TooltipAgentIM"> + Klicken, um diesem Einwohner eine IM zu schicken. + </string> + <string name="TooltipAgentPay"> + Klicken, um diesen Einwohner zu bezahlen + </string> + <string name="TooltipAgentOfferTeleport"> + Klicken, um diesem Einwohner einen Teleport anzubieten. + </string> + <string name="TooltipAgentRequestFriend"> + Klicken, um diesem Einwohner ein Freundschaftsangebot zu schicken. + </string> <string name="TooltipGroupUrl"> Anklicken, um Beschreibung der Gruppe anzuzeigen </string> @@ -176,18 +236,40 @@ Anklicken, um Befehl secondlife:// auszuführen </string> <string name="CurrentURL" value=" CurrentURL: [CurrentURL]"/> + <string name="TooltipPrice" value="[PRICE] L$"/> <string name="SLurlLabelTeleport"> Teleportieren nach </string> <string name="SLurlLabelShowOnMap"> Karte anzeigen für </string> + <string name="SLappAgentMute"> + Stummschalten + </string> + <string name="SLappAgentUnmute"> + Stummschaltung aufheben + </string> + <string name="SLappAgentIM"> + IM + </string> + <string name="SLappAgentPay"> + Bezahlen + </string> + <string name="SLappAgentOfferTeleport"> + Teleportangebot an + </string> + <string name="SLappAgentRequestFriend"> + Freundschaftsangebot + </string> <string name="BUTTON_CLOSE_DARWIN"> Schließen (⌘W) </string> <string name="BUTTON_CLOSE_WIN"> Schließen (Strg+W) </string> + <string name="BUTTON_CLOSE_CHROME"> + Schließen + </string> <string name="BUTTON_RESTORE"> Wiederherstellen </string> @@ -227,12 +309,12 @@ <string name="AvatarNameMultiple"> (mehrere) </string> - <string name="AvatarNameHippos"> - (hippos) - </string> <string name="GroupNameNone"> (keiner) </string> + <string name="AvalineCaller"> + Avaline-Anfrufer [ORDER] + </string> <string name="AssetErrorNone"> Kein Fehler </string> @@ -338,6 +420,9 @@ <string name="symbolic link"> Link </string> + <string name="symbolic folder link"> + Link zu Ordner + </string> <string name="AvatarEditingAppearance"> (Aussehen wird bearbeitet) </string> @@ -593,6 +678,9 @@ <string name="hang_up"> Verbindung mit In-Welt-Voice-Chat getrennt </string> + <string name="reconnect_nearby"> + Sie werden nun wieder mit dem Chat in Ihrer Nähe verbunden + </string> <string name="ScriptQuestionCautionChatGranted"> Dem Objekt „[OBJECTNAME]“, ein Objekt von „[OWNERNAME]“, in [REGIONNAME] [REGIONPOS], wurde folgende Berechtigung erteilt: [PERMISSIONS]. </string> @@ -636,7 +724,7 @@ Nicht verbunden </string> <string name="SIM_ACCESS_PG"> - Allgemein + Generell </string> <string name="SIM_ACCESS_MATURE"> Moderat @@ -653,6 +741,12 @@ <string name="land_type_unknown"> (unbekannt) </string> + <string name="Estate / Full Region"> + Grundstück / Vollständige Region + </string> + <string name="Mainland / Full Region"> + Mainland / Vollständige Region + </string> <string name="all_files"> Alle Dateien </string> @@ -758,6 +852,12 @@ <string name="invalid"> ungültig </string> + <string name="NewWearable"> + Neue/r/s [WEARABLE_ITEM] + </string> + <string name="CreateNewWearable"> + [WEARABLE_TYPE] erstellen + </string> <string name="next"> Weiter </string> @@ -825,10 +925,10 @@ ESC drücken, um zur Normalansicht zurückzukehren </string> <string name="InventoryNoMatchingItems"> - Im Inventar wurden keine passenden Objekte gefunden. + Sie haben nicht das Richtige gefunden? Versuchen Sie es mit der [secondlife:///app/search/all Suche]. </string> <string name="FavoritesNoMatchingItems"> - Hier eine Landmarke hin ziehen, um diese zu Ihrem Favoriten hinzuzufügen. + Landmarke hier hin ziehen, um diese hinzuzufügen. </string> <string name="InventoryNoTexture"> Sie haben keine Kopie dieser Textur in Ihrem Inventar. @@ -846,6 +946,7 @@ Keine Inhalte </string> <string name="WornOnAttachmentPoint" value=" (getragen am [ATTACHMENT_POINT])"/> + <string name="ActiveGesture" value="[GESLABEL] (aktiviert)"/> <string name="PermYes"> Ja </string> @@ -945,6 +1046,9 @@ <string name="InvFolder My Outfits"> Meine Outfits </string> + <string name="InvFolder Accessories"> + Zubehör + </string> <string name="InvFolder Friends"> Freunde </string> @@ -979,7 +1083,7 @@ Gummi </string> <string name="Light"> - Licht + Hell </string> <string name="KBShift"> Umschalt-Taste @@ -1180,7 +1284,7 @@ Oben links </string> <string name="Center"> - Zentrieren + Mitte </string> <string name="Bottom Left"> Unten links @@ -1256,7 +1360,7 @@ (unbekannt) </string> <string name="SummaryForTheWeek" value="Zusammenfassung für diese Woche, beginnend am "/> - <string name="NextStipendDay" value="Der nächste Stipendium-Tag ist "/> + <string name="NextStipendDay" value=". Der nächste Stipendium-Tag ist "/> <string name="GroupIndividualShare" value=" Gruppenanteil Einzelanteil"/> <string name="Balance"> Kontostand @@ -1286,13 +1390,13 @@ Fehler </string> <string name="RegionInfoAllEstatesOwnedBy"> - alle Grundstücke gehören [OWNER] + alle Grundbesitze gehören [OWNER] </string> <string name="RegionInfoAllEstatesYouOwn"> - alle Grundstücke, die Sie besitzen + alle Grundbesitze, die Sie besitzen </string> <string name="RegionInfoAllEstatesYouManage"> - alle Grundstücke, die Sie für [OWNER] verwalten + alle Grundbesitze, die Sie für [OWNER] verwalten </string> <string name="RegionInfoAllowedResidents"> Zulässige Einwohner: ([ALLOWEDAGENTS], max [MAXACCESS]) @@ -1324,6 +1428,9 @@ <string name="ScriptLimitsRequestError"> Fehler bei Informationsabruf </string> + <string name="ScriptLimitsRequestNoParcelSelected"> + Keine Parzellen wurden ausgewählt + </string> <string name="ScriptLimitsRequestWrongRegion"> Fehler: Skriptinformationen sind nur für Ihre aktuelle Region verfügbar </string> @@ -1465,6 +1572,12 @@ <string name="PanelContentsNewScript"> Neues Skript </string> + <string name="PanelContentsTooltip"> + Objektinhalt + </string> + <string name="BusyModeResponseDefault"> + Der Einwohner/Die Einwohnerin ist „beschäftigtâ€, d.h. er/sie möchte im Moment nicht gestört werden. Ihre Nachricht wird dem Einwohner/der Einwohnerin als IM angezeigt, und kann später beantwortet werden. + </string> <string name="MuteByName"> (nach Namen) </string> @@ -1478,14 +1591,12 @@ (Gruppe) </string> <string name="RegionNoCovenant"> - Für dieses Grundstück liegt kein Vertrag vor. + Für diesen Grundbesitz liegt kein Vertrag vor. </string> <string name="RegionNoCovenantOtherOwner"> - Für dieses Grundstück liegt kein Vertrag vor. Das Land auf diesem Grundstück wird vom Grundstückseigentümer und nicht von Linden Lab verkauft. Für Informationen zum Verkauf setzen Sie sich bitte mit dem Grundstückseigentümer in Verbindung. - </string> - <string name="covenant_last_modified"> - Zuletzt geändert: + Für diesen Grundbesitz liegt kein Vertrag vor. Das Land auf diesem Grundbesitz wird vom Grundbesitzer und nicht von Linden Lab verkauft. Für Informationen zum Verkauf setzen Sie sich bitte mit dem Grundbesitzer in Verbindung. </string> + <string name="covenant_last_modified" value="Zuletzt geändert:"/> <string name="none_text" value=" (keiner) "/> <string name="never_text" value=" (nie) "/> <string name="GroupOwned"> @@ -1501,7 +1612,10 @@ (wird nach Veröffentlichung aktualisiert) </string> <string name="NoPicksClassifiedsText"> - Es wurde keine Auswahl getroffen/keine Anzeigen ausgewählt + Sie haben keine Auswahl oder Anzeigen erstelllt. Klicken Sie auf die „Plus"-Schaltfläche, um eine Auswahl oder Anzeige zu erstellen. + </string> + <string name="NoAvatarPicksClassifiedsText"> + Der Einwohner hat eine Auswahl oder Anzeigen im Profil. </string> <string name="PicksClassifiedsLoadingText"> Wird geladen... @@ -1576,7 +1690,10 @@ Abbrechen </string> <string name="UploadingCosts"> - Hochladen von %s kostet + Das Hochladen von [NAME] kostet [AMOUNT] L$ + </string> + <string name="BuyingCosts"> + Die Kosten betragen: [AMOUNT] L$ </string> <string name="UnknownFileExtension"> Unbekanntes Dateiformat .%s @@ -2053,7 +2170,7 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_ Kinn-Hals </string> <string name="Clear"> - Löschen + Transparent </string> <string name="Cleft"> Spalte @@ -2356,16 +2473,16 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_ Farbe Innenseite </string> <string name="In Shdw Opacity"> - Deckkraft: innerer Lidschatten + Deckkraft: innen </string> <string name="Inner Eye Corner"> Ecke: Nasenseite </string> <string name="Inner Eye Shadow"> - Innerer Lidschatten + Innenlid </string> <string name="Inner Shadow"> - Innerer Lidschatten + Innenlid </string> <string name="Jacket Length"> Jackenlänge @@ -2758,10 +2875,10 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_ Aus </string> <string name="Out Shdw Color"> - Farbe: Oberer Lidschatten + Farbe: Oben </string> <string name="Out Shdw Opacity"> - Deckkraft: Oberer Lidschatten + Deckkraft: Oben </string> <string name="Outer Eye Corner"> Äußerer Augenwinkel @@ -2932,7 +3049,7 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_ Schuhart </string> <string name="Short"> - Sandale + Klein </string> <string name="Short Arms"> Kurze Arme @@ -3061,7 +3178,7 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_ Nach vorne </string> <string name="Tall"> - Stiefel + Groß </string> <string name="Taper Back"> Ansatzbreite hinten @@ -3213,6 +3330,15 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_ <string name="LocationCtrlDamageTooltip"> Gesundheit </string> + <string name="LocationCtrlAdultIconTooltip"> + Adult-Region + </string> + <string name="LocationCtrlModerateIconTooltip"> + Moderate Region + </string> + <string name="LocationCtrlGeneralIconTooltip"> + Generelle Region + </string> <string name="UpdaterWindowTitle"> [APP_NAME] Aktualisierung </string> @@ -3243,6 +3369,12 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_ <string name="UpdaterFailStartTitle"> Viewer konnte nicht gestartet werden </string> + <string name="ItemsComingInTooFastFrom"> + [APP_NAME]: Zuviele Objekte auf einmal von [FROM_NAME]. Automaitsche Vorschau ist für [TIME] Sekunden nicht verfügbar. + </string> + <string name="ItemsComingInTooFast"> + [APP_NAME]: Zuviele Objekte auf einmal. Automaitsche Vorschau ist für [TIME] Sekunden nicht verfügbar. + </string> <string name="IM_logging_string"> -- Instant-Message-Protokoll aktiviert -- </string> @@ -3265,16 +3397,13 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_ Für Instant Message hier klicken. </string> <string name="IM_to_label"> - Bis + An </string> <string name="IM_moderator_label"> (Moderator) </string> - <string name="started_call"> - haben/hat einen Anruf initiiert - </string> - <string name="joined_call"> - ist dem Gespräch beigetreten + <string name="answered_call"> + Ihr Anruf wurde entgegengenommen </string> <string name="ringing-im"> Verbindung wird hergestellt... @@ -3363,4 +3492,178 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_ <string name="unread_chat_multiple"> [SOURCES] haben etwas Neues gesagt </string> + <string name="session_initialization_timed_out_error"> + Die Initialisierung der Sitzung ist fehlgeschlagen + </string> + <string name="voice_morphing_url"> + http://secondlife.com/landing/voicemorphing + </string> + <string name="paid_you_ldollars"> + [NAME] hat Ihnen [AMOUNT] L$ bezahlt. + </string> + <string name="you_paid_ldollars"> + Sie haben [REASON] [AMOUNT] L$ an [NAME] bezahlt. + </string> + <string name="you_paid_ldollars_no_info"> + Sie haben [AMOUNT] L$ bezahlt. + </string> + <string name="you_paid_ldollars_no_reason"> + Sie haben [AMOUNT] L$ an [NAME] bezahlt. + </string> + <string name="you_paid_ldollars_no_name"> + Sie haben [REASON] [AMOUNT] L$ bezahlt. + </string> + <string name="for a parcel of land"> + für eine Landparzelle + </string> + <string name="for a land access pass"> + für einen Pass + </string> + <string name="for deeding land"> + für die Landübertragung + </string> + <string name="to create a group"> + für die Gründung einer Gruppe + </string> + <string name="to join a group"> + für den Beitritt zur Gruppe + </string> + <string name="to upload"> + fürs Hochladen + </string> + <string name="giving"> + [AMOUNT] L$ werden bezahlt + </string> + <string name="uploading_costs"> + Kosten für Hochladen [AMOUNT] L$ + </string> + <string name="this_costs"> + Kosten: [AMOUNT] L$ + </string> + <string name="buying_selected_land"> + Ausgewähltes Land wird für [AMOUNT] L$ gekauft. + </string> + <string name="this_object_costs"> + Dieses Objekt kostet [AMOUNT] L$ + </string> + <string name="group_role_everyone"> + Jeder + </string> + <string name="group_role_officers"> + Offiziere + </string> + <string name="group_role_owners"> + Eigentümer + </string> + <string name="uploading_abuse_report"> + Bericht wird hochgeladen... + +Missbrauchsbericht + </string> + <string name="New Shape"> + Neue Form/Gestalt + </string> + <string name="New Skin"> + Neue Haut + </string> + <string name="New Hair"> + Neues Haar + </string> + <string name="New Eyes"> + Neue Augen + </string> + <string name="New Shirt"> + Neues Hemd + </string> + <string name="New Pants"> + Neue Hose + </string> + <string name="New Shoes"> + Neue Schuhe + </string> + <string name="New Socks"> + Neue Socken + </string> + <string name="New Jacket"> + Neue Jacke + </string> + <string name="New Gloves"> + Neue Handschuhe + </string> + <string name="New Undershirt"> + Neues Unterhemd + </string> + <string name="New Underpants"> + Neue Unterhose + </string> + <string name="New Skirt"> + Neuer Rock + </string> + <string name="New Alpha"> + Neues Alpha + </string> + <string name="New Tattoo"> + Neue Tätowierung + </string> + <string name="Invalid Wearable"> + Ungültiges Objekt + </string> + <string name="New Script"> + Neues Skript + </string> + <string name="New Folder"> + Neuer Ordner + </string> + <string name="Contents"> + Inhalt + </string> + <string name="Female - Excuse me"> + Weiblich - Räuspern + </string> + <string name="Female - Get lost"> + Weiblich - Get lost + </string> + <string name="Female - Blow kiss"> + Weiblich - Kusshand + </string> + <string name="Female - Boo"> + Weiblich - Buh + </string> + <string name="AvatarBirthDateFormat"> + [mthnum,datetime,slt]/[day,datetime,slt]/[year,datetime,slt] + </string> + <string name="DefaultMimeType"> + Keine/Keiner + </string> + <string name="texture_load_dimensions_error"> + Bilder, die größer sind als [WIDTH]*[HEIGHT] können nicht geladen werden + </string> + <string name="words_separator" value=","/> + <string name="server_is_down"> + Trotz all unserer Bemühungen ist ein unerwarteter Fehler aufgetreten. + + Bitte überprüfen Sie status.secondlifegrid.net, um festzustellen, ob ein Problem besteht. + Falls Sie weiterhin Problem haben, überprüfen Sie bitte Ihre Netzwerk- und Firewalleinstellungen. + </string> + <string name="dateTimeWeekdaysNames"> + Sonntag:Montag:Dienstag:Mittwoch:Donnerstag:Freitag:Samstag + </string> + <string name="dateTimeWeekdaysShortNames"> + So:Mo:Di:Mi:Do:Fr:Sa + </string> + <string name="dateTimeMonthNames"> + Januar:Februar:März:April:Mai:Juni:Juli:August:September:Oktober:November:Dezember + </string> + <string name="dateTimeMonthShortNames"> + Jan:Feb:Mär:Apr:Mai:Jun:Jul:Aug:Sep:Okt:Nov:Dez + </string> + <string name="dateTimeDayFormat"> + [MDAY] + </string> + <string name="dateTimeAM"> + Uhr + </string> + <string name="dateTimePM"> + Uhr + </string> </strings> diff --git a/indra/newview/skins/default/xui/de/teleport_strings.xml b/indra/newview/skins/default/xui/de/teleport_strings.xml index 2c56eff0a3..69c952c532 100644 --- a/indra/newview/skins/default/xui/de/teleport_strings.xml +++ b/indra/newview/skins/default/xui/de/teleport_strings.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<teleport_messages name=""> +<teleport_messages> <message_set name="errors"> <message name="invalid_tport"> Bei der Bearbeitung Ihrer Teleport-Anfrage ist ein Problem aufgetreten. Sie müssen sich zum Teleportieren eventuell neu anmelden. @@ -62,6 +62,9 @@ Ihre Teleport-Anfrage kann nicht sofort bearbeitet werden. Versuchen Sie es in e <message name="completing"> Teleport wird abgeschlossen. </message> + <message name="completed_from"> + Teleport aus [T_SLURL] wurde erfolgreich abgeschlossen. + </message> <message name="resolving"> Ziel wird ermittelt. </message> diff --git a/indra/newview/skins/default/xui/en/alert_line_editor.xml b/indra/newview/skins/default/xui/en/alert_line_editor.xml index 97991153d8..82bf5fc8da 100644 --- a/indra/newview/skins/default/xui/en/alert_line_editor.xml +++ b/indra/newview/skins/default/xui/en/alert_line_editor.xml @@ -1,7 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <line_editor select_on_focus="false" - handle_edit_keys_directly="false" revert_on_esc="true" commit_on_focus_lost="true" ignore_tab="true" diff --git a/indra/newview/skins/default/xui/en/floater_about.xml b/indra/newview/skins/default/xui/en/floater_about.xml index bc67621dfd..b5be03346e 100644 --- a/indra/newview/skins/default/xui/en/floater_about.xml +++ b/indra/newview/skins/default/xui/en/floater_about.xml @@ -49,7 +49,7 @@ libcurl Version: [LIBCURL_VERSION] J2C Decoder Version: [J2C_VERSION] Audio Driver Version: [AUDIO_DRIVER_VERSION] Qt Webkit Version: [QT_WEBKIT_VERSION] -Vivox Version: [VIVOX_VERSION] +Voice Server Version: [VOICE_VERSION] </floater.string> <floater.string name="none"> @@ -76,7 +76,7 @@ Packets Lost: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number allow_html="true" follows="top|left" font="SansSerif" - height="350" + height="343" bg_readonly_color="Transparent" left="5" max_length="65536" @@ -110,19 +110,14 @@ Packets Lost: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number top="5" width="435" word_wrap="true"> -Second Life is brought to you by Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les and many others. +Second Life is brought to you by Philip, Tessa, Andrew, Cory, Ian, James, Phoenix, Ryan, Haney, Dan, Char, Ben, John, Tanya, Eddie, Richard, Mitch, Doug, Eric, Frank, Bruce, Aaron, Peter, Alice, Charlie, Debra, Eileen, Helen, Janet, Steffan, Steve, Tom, Mark, Hunter, Xenon, Burgess, Bill, Jim, Lee, Hamlet, Daniel, Jeff, Todd, Sarah, Tim, Stephanie, Colin, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Jack, Vektor, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Jesse, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Yuko, Makiko, Thomas, Harry, Seth, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Brad, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, Beez, Milo, Hermia, Red, Thrax, Gulliver, Joe, Sally, Paul, Jose, Rejean, Dore, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, Dustin, George, Del, Matthew, Cat, Jacqui, Adrian, Viola, Alfred, Noel, Irfan, Yool, Rika, Jane, Frontier, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Jeremy, JP, Jake, Anthony, Maurice, Madhavi, Leopard, Kyle, Joon, Bert, Belinda, Jon, Kristi, Bridie, Pramod, Socrates, Maria, Aric, Adreanne, Jay, Kari, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Colossus, Zen, BigPapi, Pastrami, Kurz, Mani, Neuro, Mel, Sardonyx, MJ, Rowan, Sgt, Elvis, Samuel, Leo, Bryan, Niko, Austin, Soft, Poppy, Rachel, Aki, Banzai, Alexa, Sue, Bender, CG, Angelo, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Rothman, Niall, Marin, Allison, Katie, Dawn, Dusty, Katt, Judy, Andrea, Ambroff, Infinity, Rico, Gail, Kalpana, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Maestro, Simone, Yang, T, Shannon, Nelson, Khanh, Scott, Courtney, Charlene, Quixote, Susan, Zed, Amanda, Katelin, Enkidu, Roxie, Esbee, JoRoan, Scarlet, Tay, Kevin, Wolfgang, Johnny, Ray, Andren, Merov, Bob, Rand, Howard, Callen, Heff, Galen, Newell, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl, Ashley, JessieAnn, Huseby, Karina, Paris, Kurt, Rick, Lis, Kotler, Theeba, Lynx, Murphy, Doten, Taka, Norm, Jillian, Marcus, Mae, Novack, Esther, Perry, Dana, Ducot, Javier, Porter, Madison, Gecko, Dough, JR, Gisele, Crimp, Norie, Arch, Kimi, Fisher, Barbara, Jason, Peggy, Bernard, Jules, Leroy, Eva, Khederian, Campbell, Vogt, Masido, Karel, Torres, Lo, Breezer, Delby, Rountree, Anna, Servus, Rue, Itiaes, Chuck, Luna, Novella, Zaza, Wen, Gino, Lex, Cassandra, Limey, Nancy, Anukul, Silver, Brodesky, Jinsai, Squid, Gez, Rakesh, Ladan, Edelman, Marcet, Squire, Tatem, Tony, Jerm, Tia, Falcon, BK, Tiggs, Driscoll, Bacon, Timothee, Cru, Carmilla, Coyot, Webb, Kazu, Rudas, LJ, Sea, Ali Wallace, Bewest, Pup, Drub, Dragon, Inoshiro, Byron, Rhett, Xandix, Aimee, Fredrik, Thor, Teddy, Baron, Nelly, Ghengis, Epic, Eli, Stone, Grapes, Irie, Prep, Scobu, Valerie, Alain, and many others. -Thank you to the following Residents for helping to ensure that this is the best version yet: (in progress) +Thank you to the following Residents for helping to ensure that this is the best version yet: Drew Dwi, Zai Lynch, Latif Khalifa, Ellla McMahon, Harleen Gretzky, Squirrel Wood, Malarthi Behemoth, Dante Tucker, Buckaroo Mu, Eddi Decosta, Dirk, Talamasca, Torben Trautman, Irene Muni, Lilly Zenovka, Vick Forcella, Sasy Scarborough, Gentle Welinder, Elric Anatine, Techwolf Lupindo, Dusan Writer, WolfPup Lowenhar, Marianne McCann, Fiachra Lach, Sitearm Madonna, Sudane Erato, Sahkolihaa Contepomi, Sachi Vixen, Questar Utu, Dimitrio Lewis, Matto Destiny, Scrim Pinion, Radio Signals, Psi Merlin, Pixel Gausman, Mel Vanbeeck, Laurent Bechir, Lamorna Proctor, Lares Carter, Gwyneth Llewelyn, Hydra Shaftoe, Holger Gilruth, Gentle Heron, Carla Broek, Boroondas Gupte, Fury Rosewood, Flower Ducatillon, Colpo Wexler, gwampa Lomu, Borg Capalini, Beansy Twine, Ardy Lay, , 45ms Zhong, Adeon Writer, Aeonix Aeon, Ai Austin, Aiko Ying, Alexandrea Fride, Alliez Mysterio, Annie Milestone, Annika Genezzia, Ansariel Hiller, ArminasX Saiman, Arya Braveheart, Asaeda Meltingdots, Asturkon Jua, Avallyn Oakleaf, Avatar Quinzet, BabyA Littlething, Bacchus Ireto, Bazaar, Riva, Benjamin Bigdipper, Beth Walcher, Bezilon Kasei, Biancaluce Robbiani, Bill Walach, blakopal Galicia, Blitzckreed Levenque, Bryn Oh, Callipygian Christensen, Cap Carver, Carr Arbenlow, Chantal Harvey, Charles Courtois, Charlie Sazaland, Cherry Cheevers, ChickyBabes Zuzu, Christopher Organiser, Ciaran Laval, Clara Young, Celierra Darling, Corinne Helendale, Corro Moseley, Coughdrop Littlething, Darien Caldwell, Dartagan Shepherd, Debs Regent, Decro Schmooz, Denim Kamachi, DiJodi Dubratt, Dil Spitz, Edgware Marker, Egehan Dryke, Emma Portilo, Emmie Fairymeadow, Evangelista Emerald, Faelon Swordthain, Frenchimmo Sabra, Gaberoonie Zanzibar, Ganymedes Costagravas, Gene Frostbite, GeneJ Composer, Giggles Littlebird, Grady Echegaray, Guni Greenstein, Gypsy Tripsa, Hackshaven Harford, Ham Rambler, Han Shuffle, Hanglow Short, Hatzfeld Runo, herina Bode, Horatio Freund, Hypatia Callisto, Hypatia Pickens, Identity Euler, Imnotgoing Sideways, Innula Zenovka, Iyoba Tarantal, Jack Abraham, Jagga Meredith, Jennifer Boyle, Jeremy Marquez, Jessica Qin, Jinx Nordberg, Jo Bernandes, Jocial Sonnenkern, Joel Savard, Jondan Lundquist, Josef Munster, Josette Windlow, Juilan Tripsa, Juro Kothari, Justin RiversRunRed, Kagehi Kohn, Kaimen Takahe, Keklily Longfall, Ken Lavender, Kestral Karas, Khisme Nitely, Kimar Coba, Kithrak Kirkorian, Kitty Barnett, Kolor Fall, Komiko Okamoto, Korvel Noh, Larry Pixel, Leal Choche, len Starship, Lenae Munz, Lexi Frua, Lillie Cordeaux, Lizzy Macarthur, LSL Scientist, Luban Yiyuan, Luc Starsider, Maccus McCullough, Madison Blanc, Maggie Darwin, Mallory Destiny, Manx Wharton, Marc Claridge, Marc2 Sands, Matthew Anthony, Maxim RiversRunRed, Medhue Simoni, Melinda Latynina, Mencius Watts, Michi Lumin, Midian Farspire, Miles Glaz, Mindy Mathy, Mitch Wagner, Mo Hax, Mourna Biziou, Nao Noe, naofan Teardrop, Naomah Beaumont, Nathiel Siamendes, Nber Medici, Neko Link, Netpat Igaly, Neutron Chesnokov, Newfie Pendragon, Nicholai Laviscu, Nick Rhodes, Nicoladie Gymnast, Ollie Kubrick, Orenj Marat, Orion Delphis, Oryx Tempel, Parvati Silverweb, PeterPunk Mooney, Pixel Scientist, Pounce Teazle, Professor Noarlunga, Quantum Destiny, Quicksilver Hermes, Ralf Setsuko, RAT Quan, RedMokum Bravin, Revolution Perenti, Rezit Sideways, Rich Grainger, Rosco Teardrop, Rose Evans, Rudee Voom, RufusTT Horsefly, Saii Hallard, SaintLEOlions Zimer, Samm Larkham, Satanello Miami, SexySteven Morrisey, Sheet Spotter, Shnurui Troughton, sicarius Thorne, Sicarius Toxx, Sini Nubalo, SLB Wirefly, snowy Sidran, Soupa Segura, ST Mensing, Starshine Halasy, Stickman Ingmann, Synystyr Texan, Takeda Terrawyng, Tali Rosca, Templar Merlin, Tezcatlipoca Bisiani, Tiel Stonecutter, Tony Kembia, TouchaHoney Perhaps, Trey Reanimator, TriloByte Zanzibar, Trinity Dechou, Trinity Dejavu, Unlikely Quintessa, UsikuFarasi Kanarik, Veritas Raymaker, Vex Streeter, Viaticus Speculaas, Villain Baroque, Vixie Durant, Void Singer, Watty Berkson, Westley Schridde, Westley Streeter, Whimsy Winx, Winter Ventura, Wundur Primbee, xstorm Radek, YongYong Francois, Zak Westminster, Zana Kohime, Zaren Alexander, Zeja Pyle, ZenMondo Wormser, Zoex Flanagan, and many others. - - - - -It is a rare mind indeed that can render the hitherto non-existent blindingly obvious. The cry 'I could have thought of that' is a very popular and misleading one, for the fact is that they didn't, and a very significant and revealing fact it is too. - -- Douglas Adams +"The work goes on, the cause endures, the hope still lives, and the dreams shall never die" - Edward Kennedy </text_editor> </panel> <panel diff --git a/indra/newview/skins/default/xui/en/floater_about_land.xml b/indra/newview/skins/default/xui/en/floater_about_land.xml index 61ca783d14..b9489895ae 100644 --- a/indra/newview/skins/default/xui/en/floater_about_land.xml +++ b/indra/newview/skins/default/xui/en/floater_about_land.xml @@ -9,6 +9,18 @@ title="ABOUT LAND" width="490"> <floater.string + name="maturity_icon_general"> + "Parcel_PG_Dark" + </floater.string> + <floater.string + name="maturity_icon_moderate"> + "Parcel_M_Dark" + </floater.string> + <floater.string + name="maturity_icon_adult"> + "Parcel_R_Dark" + </floater.string> + <floater.string name="Minutes"> [MINUTES] minutes </floater.string> @@ -46,7 +58,7 @@ top="0"> <panel.string name="new users only"> - New users only + New Residents only </panel.string> <panel.string name="anyone"> @@ -96,6 +108,9 @@ name="no_selection_text"> No parcel selected. </panel.string> + <panel.string name="time_stamp_template"> + [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local] + </panel.string> <text type="string" length="1" @@ -263,7 +278,7 @@ Leyla Linden </text> left_pad="4" right="-10" name="Set..." - width="50" + width="90" top_delta="-2"/> <check_box enabled="false" @@ -369,7 +384,7 @@ Leyla Linden </text> layout="topleft" left_delta="0" name="Sell with landowners objects in parcel." - top_pad="-3" + top_pad="-2" width="186"> Objects included in sale </text> @@ -395,7 +410,7 @@ Leyla Linden </text> name="Cancel Land Sale" left_pad="5" top_pad="-25" - width="145" /> + width="180" /> <text type="string" length="1" @@ -474,10 +489,10 @@ Leyla Linden </text> height="23" label="Buy Land" layout="topleft" - left_delta="82" + left_delta="52" name="Buy Land..." top_pad="7" - width="100" /> + width="130" /> <button enabled="true" follows="left|top" @@ -487,7 +502,7 @@ Leyla Linden </text> left="10" name="Scripts..." top_pad="1" - width="100" /> + width="150" /> <button enabled="false" follows="left|top" @@ -504,11 +519,11 @@ Leyla Linden </text> height="23" label="Buy Pass" layout="topleft" - left_delta="-105" + left_delta="-135" name="Buy Pass..." tool_tip="A pass gives you temporary access to this land." top_delta="0" - width="100" /> + width="130" /> <button follows="left|top" height="23" @@ -547,21 +562,26 @@ Leyla Linden </text> left="0" top="0" help_topic="land_covenant_tab" - name="land_covenant_panel"> + name="land_covenant_panel" + word_wrap="true"> <panel.string - name="can_resell"> + name="can_resell" + word_wrap="true"> Purchased land in this region may be resold. </panel.string> <panel.string - name="can_not_resell"> + name="can_not_resell" + word_wrap="true"> Purchased land in this region may not be resold. </panel.string> <panel.string - name="can_change"> + name="can_change" + word_wrap="true"> Purchased land in this region may be joined or subdivided. </panel.string> <panel.string - name="can_not_change"> + name="can_not_change" + word_wrap="true"> Purchased land in this region may not be joined or subdivided. </panel.string> <text @@ -619,7 +639,6 @@ Leyla Linden </text> length="1" enabled="false" follows="all" - handle_edit_keys_directly="true" height="200" layout="topleft" left="10" @@ -736,7 +755,8 @@ Leyla Linden </text> left_pad="10" mouse_opaque="false" name="resellable_clause" - width="330"> + word_wrap="true" + width="360"> Land in this region may not be resold. </text> <text @@ -805,7 +825,7 @@ Leyla Linden </text> name="Simulator primitive usage:" top_pad="4" width="364"> - Primative usage: + Primitive usage: </text> <text type="string" @@ -1044,7 +1064,8 @@ Leyla Linden </text> left="10" name="Autoreturn" top_pad="0" - width="294"> + width="412" + wrap="true"> Auto return other Residents' objects (minutes, 0 for off): </text> <line_editor @@ -1056,9 +1077,9 @@ Leyla Linden </text> layout="topleft" max_length="6" name="clean other time" - right="-72" - width="56" - top_delta="-6"/> + left_pad="0" + width="46" + top_delta="-2"/> <text type="string" length="1" @@ -1107,7 +1128,7 @@ Leyla Linden </text> label="Type" name="type" sort_column="online_status" - width="24" /> + width="50" /> <name_list.columns name="online_status" width="-1" /> @@ -1222,7 +1243,7 @@ Only large parcels can be listed in search. layout="topleft" left_pad="2" name="edit objects check" - width="120" /> + width="130" /> <check_box height="16" label="Group" @@ -1248,7 +1269,7 @@ Only large parcels can be listed in search. left_pad="2" name="all object entry check" top_delta="0" - width="120" /> + width="130" /> <check_box height="16" label="Group" @@ -1275,7 +1296,7 @@ Only large parcels can be listed in search. left_pad="2" name="check other scripts" top_delta="0" - width="120" /> + width="130" /> <check_box height="16" label="Group" @@ -1329,7 +1350,7 @@ Only large parcels can be listed in search. left="30" name="land category with adult" visible="false" - width="130"> + width="140"> <combo_box.item label="Any Category" name="item0" @@ -1390,7 +1411,7 @@ Only large parcels can be listed in search. left="30" name="land category" visible="false" - width="130"> + width="140"> <combo_box.item label="Any Category" name="item0" @@ -1504,7 +1525,7 @@ Only large parcels can be listed in search. name="Clear" tool_tip="Clear the landing point" right="-10" - width="50" /> + width="55" /> <text type="string" length="1" @@ -1607,43 +1628,14 @@ Only large parcels can be listed in search. layout="topleft" left_pad="5" name="set_media_url" - width="50" + width="70" top_delta="0"/> - <text - type="string" - length="1" - follows="left|top" - height="20" - layout="topleft" - left="10" - name="CurrentURL:" - width="100" - top_pad="10"> - Current Page: - </text> - <button - follows="top|right" - height="23" - image_overlay="Refresh_Off" - layout="topleft" - name="reset_media_url" - left_pad="0" - tool_tip="Refresh URL" - width="23" - top_delta="0"/> - <text - follows="left|top" - height="16" - layout="topleft" - left_pad="10" - name="current_url" - width="300" /> <check_box follows="top|left" height="16" label="Hide URL" layout="topleft" - left_delta="-36" + left="110" name="hide_media_url" tool_tip="Checking this option will hide the media url to any non-authorized viewers of this parcel information. Note this is not available for HTML types." width="50" @@ -1825,6 +1817,15 @@ Only large parcels can be listed in search. top_delta="0" right="-15" select_on_focus="true" /> + <check_box + height="16" + label="Hide URL" + layout="topleft" + name="hide_music_url" + tool_tip="Checking this option will hide the music url to any non-authorized viewers of this parcel information." + left_delta="10" + top_pad="5" + width="292" /> <text type="string" length="1" @@ -1894,6 +1895,10 @@ Only large parcels can be listed in search. name="access_estate_defined"> (Defined by the Estate) </panel.string> + <panel.string + name="allow_public_access"> + Allow Public Access ([MATURITY]) + </panel.string> <panel.string name="estate_override"> One or more of these options is set at the estate level @@ -1914,7 +1919,6 @@ Only large parcels can be listed in search. <check_box follows="top|left" height="16" - label="Allow Public Access [MATURITY]" layout="topleft" left_delta="0" name="public_access" @@ -1929,7 +1933,7 @@ Only large parcels can be listed in search. left_delta="20" name="Only Allow" top="49" - width="278"> + width="325"> Restrict Access to Residents verified by: </text> <check_box diff --git a/indra/newview/skins/default/xui/en/floater_animation_preview.xml b/indra/newview/skins/default/xui/en/floater_animation_preview.xml index 1ffedde29b..cb6b2f6ebc 100644 --- a/indra/newview/skins/default/xui/en/floater_animation_preview.xml +++ b/indra/newview/skins/default/xui/en/floater_animation_preview.xml @@ -218,14 +218,14 @@ Maximum animation length is [MAX_LENGTH] seconds. increment="1" initial_value="0" label="In(%)" - label_width="49" + label_width="70" layout="topleft" top_pad="5" - left="30" + left="15" max_val="100" name="loop_in_point" tool_tip="Sets point in animation that looping returns to" - width="115" /> + width="130" /> <spinner bottom_delta="0" follows="left|top" @@ -238,8 +238,8 @@ Maximum animation length is [MAX_LENGTH] seconds. max_val="100" name="loop_out_point" tool_tip="Sets point in animation that ends a loop" - label_width="49" - width="115" /> + label_width="60" + width="120" /> <text type="string" length="1" @@ -256,10 +256,10 @@ Maximum animation length is [MAX_LENGTH] seconds. <combo_box height="23" layout="topleft" - left_pad="0" + left_pad="20" name="hand_pose_combo" tool_tip="Controls what hands do during animation" - width="150"> + width="130"> <combo_box.item label="Spread" name="Spread" @@ -328,71 +328,91 @@ Maximum animation length is [MAX_LENGTH] seconds. </text> <combo_box height="23" - width="150" + width="130" layout="topleft" - left_pad="0" + left_pad="20" name="emote_combo" tool_tip="Controls what face does during animation"> - <combo_box.item - label="(None)" - name="[None]" /> - <combo_box.item - label="Aaaaah" - name="Aaaaah" /> - <combo_box.item - label="Afraid" - name="Afraid" /> - <combo_box.item - label="Angry" - name="Angry" /> - <combo_box.item - label="Big Smile" - name="BigSmile" /> - <combo_box.item - label="Bored" - name="Bored" /> - <combo_box.item - label="Cry" - name="Cry" /> - <combo_box.item - label="Disdain" - name="Disdain" /> - <combo_box.item - label="Embarrassed" - name="Embarrassed" /> - <combo_box.item - label="Frown" - name="Frown" /> - <combo_box.item - label="Kiss" - name="Kiss" /> - <combo_box.item - label="Laugh" - name="Laugh" /> - <combo_box.item - label="Plllppt" - name="Plllppt" /> - <combo_box.item - label="Repulsed" - name="Repulsed" /> - <combo_box.item - label="Sad" - name="Sad" /> - <combo_box.item - label="Shrug" - name="Shrug" /> - <combo_box.item - label="Smile" - name="Smile" /> - <combo_box.item - label="Surprise" - name="Surprise" /> - <combo_box.item - label="Wink" - name="Wink" /> - <combo_box.item - label="Worry" - name="Worry" /> + <item + label="(None)" + value="" + name="[None]" /> + <item + label="Aaaaah" + value="Aaaaah" + name="Aaaaah" /> + <item + label="Afraid" + value="Afraid" + name="Afraid" /> + <item + label="Angry" + value="Angry" + name="Angry" /> + <item + label="Big Smile" + value="Big Smile" + name="BigSmile" /> + <item + label="Bored" + value="Bored" + name="Bored" /> + <item + label="Cry" + value="Cry" + name="Cry" /> + <item + label="Disdain" + value="Disdain" + name="Disdain" /> + <item + label="Embarrassed" + value="Embarrassed" + name="Embarrassed" /> + <item + label="Frown" + value="Frown" + name="Frown" /> + <item + label="Kiss" + value="Kiss" + name="Kiss" /> + <item + label="Laugh" + value="Laugh" + name="Laugh" /> + <item + label="Plllppt" + value="Plllppt" + name="Plllppt" /> + <item + label="Repulsed" + value="Repulsed" + name="Repulsed" /> + <item + label="Sad" + value="Sad" + name="Sad" /> + <item + label="Shrug" + value="Shrug" + name="Shrug" /> + <item + label="Smile" + value="Smile" + name="Smile" /> + <item + label="Surprise" + value="Surprise" + name="Surprise" /> + <item + label="Wink" + value="Wink" + name="Wink" /> + <item + label="Worry" + value="Worry" + name="Worry" /> </combo_box> <text type="string" @@ -409,22 +429,26 @@ Maximum animation length is [MAX_LENGTH] seconds. </text> <combo_box height="23" - width="150" + width="130" layout="topleft" - left_pad="0" + left_pad="20" name="preview_base_anim" tool_tip="Use this to test your animation behavior while your avatar performs common actions."> - <combo_box.item + <item label="Standing" + value="Standing" name="Standing" /> - <combo_box.item + <item label="Walking" + value="Walking" name="Walking" /> - <combo_box.item + <item label="Sitting" + value="Sitting" name="Sitting" /> - <combo_box.item + <item label="Flying" + value="Flying" name="Flying" /> </combo_box> <spinner @@ -433,27 +457,27 @@ Maximum animation length is [MAX_LENGTH] seconds. increment="0.01" initial_value="0" label="Ease In (sec)" - label_width="110" + label_width="140" layout="topleft" left="10" max_val="10" name="ease_in_time" tool_tip="Amount of time (in seconds) over which animations blends in" top_pad="10" - width="200" /> + width="210" /> <spinner follows="left|top" height="23" increment="0.01" initial_value="0" label="Ease Out (sec)" - label_width="110" + label_width="140" layout="topleft" top_pad="0" max_val="10" name="ease_out_time" tool_tip="Amount of time (in seconds) over which animations blends out" - width="200" /> + width="210" /> <button follows="top|right" height="23" diff --git a/indra/newview/skins/default/xui/en/floater_avatar_textures.xml b/indra/newview/skins/default/xui/en/floater_avatar_textures.xml index 54b6edb0ec..bac3ea86f1 100644 --- a/indra/newview/skins/default/xui/en/floater_avatar_textures.xml +++ b/indra/newview/skins/default/xui/en/floater_avatar_textures.xml @@ -1,306 +1,321 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <floater legacy_header_height="18" - height="650" + height="700" layout="topleft" name="avatar_texture_debug" help_topic="avatar_texture_debug" title="AVATAR TEXTURES" - width="1250"> + width="940" + can_resize="true"> <floater.string name="InvalidAvatar"> INVALID AVATAR </floater.string> + + <scroll_container + color="DkGray2" + opaque="true" + follows="all" + height="680" + layout="topleft" + left="5" + top_pad="15" + name="profile_scroll" + reserve_scroll_corner="false" + width="930"> + <panel + name="scroll_content_panel" + follows="left|top" + min_height="300" + layout="topleft" + top="0" + background_visible="false" + left="0" + height="680"> <text type="string" length="1" height="16" layout="topleft" - left="30" + left="15" name="label" - top="40" - width="80"> - Baked Textures + top="20" + width="90"> + Baked +Textures </text> <text type="string" length="1" height="16" layout="topleft" - left_pad="50" + left_pad="22" name="composite_label" top_delta="0" width="120"> - Composite Textures + Composite +Textures </text> <button - height="20" + height="40" label="Dump IDs to Console" label_selected="Dump" layout="topleft" - left_pad="530" name="Dump" top_delta="0" + right="-10" width="150" /> - <scroll_container - color="DkGray2" - opaque="true" - follows="all" - height="590" - layout="topleft" - left="5" - top_pad="5" - name="profile_scroll" - reserve_scroll_corner="false" - width="1240"> <panel name="scroll_content_panel" follows="left|top" min_height="300" layout="topleft" - top="0" + top="43" background_visible="false" - height="950" + height="930" left="0" - width="1250"> + width="1230"> + <texture_picker - height="143" + height="103" label="Hair" layout="topleft" left="10" name="hair-baked" top="17" - width="128" /> + width="92" /> <texture_picker - height="143" + height="103" label="Hair" layout="topleft" - left_pad="7" + left_pad="21" name="hair_grain" top_delta="0" - width="128" /> + width="92" /> <texture_picker - height="143" + height="103" label="Hair Alpha" layout="topleft" left_pad="7" name="hair_alpha" top_delta="0" - width="128" /> + width="92" /> <texture_picker - height="143" + height="103" label="Head" layout="topleft" left="10" name="head-baked" - top="167" - width="128" /> + top_delta="100" + width="92" /> <texture_picker - height="143" + height="103" label="Makeup" layout="topleft" - left_pad="7" + left_pad="21" name="head_bodypaint" top_delta="0" - width="128" /> + width="92" /> <texture_picker - height="143" + height="103" label="Head Alpha" layout="topleft" left_pad="7" name="head_alpha" top_delta="0" - width="128" /> + width="92" /> <texture_picker - height="143" + height="103" label="Head Tattoo" layout="topleft" left_pad="7" name="head_tattoo" top_delta="0" - width="128" /> + width="92" /> <texture_picker - height="143" + height="103" label="Eyes" layout="topleft" left="10" name="eyes-baked" - top="317" - width="128" /> + top_delta="100" + width="92" /> <texture_picker - height="143" + height="103" label="Eye" layout="topleft" - left_pad="7" + left_pad="21" name="eyes_iris" top_delta="0" - width="128" /> + width="92" /> <texture_picker - height="143" + height="103" label="Eyes Alpha" layout="topleft" left_pad="7" name="eyes_alpha" top_delta="0" - width="128" /> + width="92" /> <texture_picker - height="143" + height="103" label="Upper Body" layout="topleft" left="10" name="upper-baked" - top="467" - width="128" /> + top_delta="100" + width="92" /> <texture_picker - height="143" - label="Upper Body Bodypaint" + height="103" + label="Upper BodyPaint" layout="topleft" - left_pad="7" + left_pad="21" name="upper_bodypaint" top_delta="0" - width="128" /> + width="92" /> <texture_picker - height="143" + height="103" label="Undershirt" layout="topleft" left_pad="7" name="upper_undershirt" top_delta="0" - width="128" /> + width="92" /> <texture_picker - height="143" + height="103" label="Gloves" layout="topleft" left_pad="7" name="upper_gloves" top_delta="0" - width="128" /> + width="92" /> <texture_picker - height="143" + height="103" label="Shirt" layout="topleft" left_pad="7" name="upper_shirt" top_delta="0" - width="128" /> + width="92" /> <texture_picker - height="143" + height="103" label="Upper Jacket" layout="topleft" left_pad="7" name="upper_jacket" top_delta="0" - width="128" /> + width="92" /> <texture_picker - height="143" + height="103" label="Upper Alpha" layout="topleft" left_pad="7" name="upper_alpha" top_delta="0" - width="128" /> + width="92" /> <texture_picker - height="143" + height="103" label="Upper Tattoo" layout="topleft" left_pad="7" name="upper_tattoo" top_delta="0" - width="128" /> + width="92" /> <texture_picker - height="143" + height="103" label="Lower Body" layout="topleft" left="10" name="lower-baked" - top="617" - width="128" /> + top_delta="100" + width="92" /> <texture_picker - height="143" - label="Lower Body Bodypaint" + height="103" + label="Lower BodyPaint" layout="topleft" - left_pad="7" + left_pad="21" name="lower_bodypaint" top_delta="0" - width="128" /> + width="92" /> <texture_picker - height="143" + height="103" label="Underpants" layout="topleft" left_pad="7" name="lower_underpants" top_delta="0" - width="128" /> + width="92" /> <texture_picker - height="143" + height="103" label="Socks" layout="topleft" left_pad="7" name="lower_socks" top_delta="0" - width="128" /> + width="92" /> <texture_picker - height="143" + height="103" label="Shoes" layout="topleft" left_pad="7" name="lower_shoes" top_delta="0" - width="128" /> + width="92" /> <texture_picker - height="143" + height="103" label="Pants" layout="topleft" left_pad="7" name="lower_pants" top_delta="0" - width="128" /> + width="92" /> <texture_picker - height="143" + height="103" label="Jacket" layout="topleft" left_pad="7" name="lower_jacket" top_delta="0" - width="128" /> + width="92" /> <texture_picker - height="143" + height="103" label="Lower Alpha" layout="topleft" left_pad="7" name="lower_alpha" top_delta="0" - width="128" /> + width="92" /> <texture_picker - height="143" + height="103" label="Lower Tattoo" layout="topleft" left_pad="7" name="lower_tattoo" top_delta="0" - width="128" /> + width="92" /> <texture_picker - height="143" + height="103" label="Skirt" layout="topleft" left="10" name="skirt-baked" - top="767" - width="128" /> + top_delta="100" + width="92" /> <texture_picker - height="143" + height="103" label="Skirt" layout="topleft" - left_pad="7" + left_pad="21" name="skirt" top_delta="0" - width="128" /> + width="92" /> +</panel> </panel> </scroll_container> -</floater> +</floater>
\ No newline at end of file diff --git a/indra/newview/skins/default/xui/en/floater_buy_currency.xml b/indra/newview/skins/default/xui/en/floater_buy_currency.xml index 961bd6b5e4..637f9f55d4 100644 --- a/indra/newview/skins/default/xui/en/floater_buy_currency.xml +++ b/indra/newview/skins/default/xui/en/floater_buy_currency.xml @@ -24,13 +24,13 @@ <text type="string" length="1" - follows="top|left" + follows="top|left|right" font="SansSerifHuge" layout="topleft" left="20" height="30" top="25" - width="300" + width="340" name="info_need_more"> You need more L$ </text> @@ -55,7 +55,7 @@ left="20" height="30" top="25" - width="200" + width="300" name="info_buying"> Buy L$ </text> @@ -178,11 +178,11 @@ follows="top|left" height="16" halign="right" - left="140" - width="180" + left="20" + width="300" layout="topleft" name="buy_action"> - [NAME] L$ [PRICE] + [ACTION] </text> <text type="string" diff --git a/indra/newview/skins/default/xui/en/floater_buy_currency_html.xml b/indra/newview/skins/default/xui/en/floater_buy_currency_html.xml new file mode 100644 index 0000000000..4b990fa566 --- /dev/null +++ b/indra/newview/skins/default/xui/en/floater_buy_currency_html.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<floater + can_resize="false" + can_close="true" + width="422" + height="202" + layout="topleft" + name="floater_buy_currency_html" + help_topic="floater_buy_currency_html" + save_rect="true" + single_instance="true" + title="BUY CURRENCY" +> + <floater.string + name="buy_currency_url" translate="false"> + https://quick-buy.secondlife.com/[LANGUAGE]/display/?sa=[SPECIFIC_AMOUNT]&sum=[SUM]&msg=[MSG]&bal=[BAL] + </floater.string> + <web_browser + follows="all" + layout="topleft" + left="1" + right="-1" + top="1" + bottom="-1" + ignore_ui_scale="false" + name="browser"/> +</floater> diff --git a/indra/newview/skins/default/xui/en/floater_buy_land.xml b/indra/newview/skins/default/xui/en/floater_buy_land.xml index 6e0c3dfe54..acaa508792 100644 --- a/indra/newview/skins/default/xui/en/floater_buy_land.xml +++ b/indra/newview/skins/default/xui/en/floater_buy_land.xml @@ -64,7 +64,7 @@ Try selecting a smaller area. </floater.string> <floater.string name="not_owned_by_you"> - Land owned by another user is selected. + Land owned by another Resident is selected. Try selecting a smaller area. </floater.string> <floater.string @@ -172,6 +172,18 @@ supports [AMOUNT2] objects name="no_parcel_selected"> (no parcel selected) </floater.string> + <floater.string + name="icon_PG" + translate="false" + value="Parcel_PG_Dark"/> + <floater.string + name="icon_M" + translate="false" + value="Parcel_M_Dark"/> + <floater.string + name="icon_R" + translate="false" + value="Parcel_R_Dark"/> <text type="string" length="1" @@ -195,9 +207,17 @@ supports [AMOUNT2] objects left_delta="110" name="region_name_text" top_delta="0" - width="175"> + use_ellipses="true" + width="155"> (unknown) </text> + <icon + follows="left|top" + height="16" + layout="topleft" + name="rating_icon" + top_delta="-2" + width="18"/> <text type="string" length="1" @@ -339,7 +359,6 @@ supports [AMOUNT2] objects length="1" enabled="false" follows="top|right" - handle_edit_keys_directly="false" height="237" layout="topleft" left="444" diff --git a/indra/newview/skins/default/xui/en/floater_buy_object.xml b/indra/newview/skins/default/xui/en/floater_buy_object.xml index f0e5e30010..3d8f5d678b 100644 --- a/indra/newview/skins/default/xui/en/floater_buy_object.xml +++ b/indra/newview/skins/default/xui/en/floater_buy_object.xml @@ -5,7 +5,7 @@ height="290" layout="topleft" min_height="150" - min_width="200" + min_width="225" name="contents" help_topic="contents" save_rect="true" @@ -52,7 +52,7 @@ <text type="string" length="1" - follows="all" + follows="left|top|right" font="SansSerif" height="16" layout="topleft" @@ -90,7 +90,8 @@ name="buy_text" text_color="white" top_pad="5" - width="276"> + use_ellipses="true" + width="260"> Buy for L$[AMOUNT] from [NAME]? </text> <button diff --git a/indra/newview/skins/default/xui/en/floater_camera.xml b/indra/newview/skins/default/xui/en/floater_camera.xml index a797d54749..8c3aa2c9a4 100644 --- a/indra/newview/skins/default/xui/en/floater_camera.xml +++ b/indra/newview/skins/default/xui/en/floater_camera.xml @@ -4,16 +4,16 @@ can_dock="true" can_minimize="true" can_close="false" - center_horiz="true" follows="bottom" - height="152" + height="164" layout="topleft" name="camera_floater" help_topic="camera_floater" save_rect="true" save_visibility="true" + save_dock_state="true" single_instance="true" - width="150"> + width="228"> <floater.string name="rotate_tooltip"> Rotate Camera Around Focus @@ -26,41 +26,152 @@ name="move_tooltip"> Move Camera Up and Down, Left and Right </floater.string> + <floater.string + name="camera_modes_title"> + Camera modes + </floater.string> + <floater.string + name="pan_mode_title"> + Orbit Zoom Pan + </floater.string> + <floater.string + name="presets_mode_title"> + Preset Views + </floater.string> + <floater.string + name="free_mode_title"> + View Object + </floater.string> <panel border="false" - height="110" + height="123" layout="topleft" left="2" top="0" mouse_opaque="false" name="controls" - width="148"> - <joystick_track - follows="top|left" - height="78" - image_selected="Cam_Tracking_In" - image_unselected="Cam_Tracking_Out" + width="226"> + <panel + color="Transparent" + follows="all" + height="102" layout="topleft" - left="45" - name="cam_track_stick" - quadrant="left" - scale_image="false" - sound_flags="3" - tool_tip="Move camera up and down, left and right" - top="22" - visible="false" - width="78" /> + left="8" + name="preset_views_list" + opaque="true" + top="24" + width="212" + visible="false"> + <panel_camera_item + name="front_view"> + <panel_camera_item.mousedown_callback + function="CameraPresets.ChangeView" + parameter="front_view" /> + <panel_camera_item.picture + image_name="Cam_Preset_Front_Off" /> + <panel_camera_item.selected_picture + image_name="Cam_Preset_Front_On" /> + <panel_camera_item.text> + Front View + </panel_camera_item.text> + </panel_camera_item> + <panel_camera_item + name="group_view" + top_pad="4"> + <panel_camera_item.mousedown_callback + function="CameraPresets.ChangeView" + parameter="group_view" /> + <panel_camera_item.picture + image_name="Cam_Preset_Side_Off" /> + <panel_camera_item.selected_picture + image_name="Cam_Preset_Side_On" /> + <panel_camera_item.text> + Side View + </panel_camera_item.text> + </panel_camera_item> + <panel_camera_item + name="rear_view" + layout="topleft" + top_pad="4"> + <panel_camera_item.mousedown_callback + function="CameraPresets.ChangeView" + parameter="rear_view" /> + <panel_camera_item.picture + image_name="Cam_Preset_Back_Off" /> + <panel_camera_item.selected_picture + image_name="Cam_Preset_Back_On" /> + <panel_camera_item.text> + Rear View + </panel_camera_item.text> + </panel_camera_item> + </panel> + <panel + color="Transparent" + follows="all" + height="68" + item_pad="4" + layout="topleft" + left="8" + name="camera_modes_list" + opaque="true" + top="24" + width="212" + visible="false"> + <panel_camera_item + name="object_view"> + <panel_camera_item.mousedown_callback + function="CameraPresets.ChangeView" + parameter="object_view" /> + <panel_camera_item.text> + Object View + </panel_camera_item.text> + <panel_camera_item.picture + image_name="Object_View_Off" /> + <panel_camera_item.selected_picture + image_name="Object_View_On" /> + </panel_camera_item> + <panel_camera_item + name="mouselook_view" + layout="topleft"> + <panel_camera_item.mousedown_callback + function="CameraPresets.ChangeView" + parameter="mouselook_view" /> + <panel_camera_item.text> + Mouselook View + </panel_camera_item.text> + <panel_camera_item.picture + image_name="MouseLook_View_Off" /> + <panel_camera_item.selected_picture + image_name="MouseLook_View_On" /> + </panel_camera_item> + </panel> <!--TODO: replace + - images --> <panel border="false" class="camera_zoom_panel" - height="94" + height="114" layout="topleft" - left="7" + left="0" mouse_opaque="false" name="zoom" - top="22" - width="18"> + top="20" + width="226"> + <joystick_rotate + follows="top|left" + height="78" + image_selected="Cam_Rotate_In" + image_unselected="Cam_Rotate_Out" + layout="topleft" + left="7" + mouse_opaque="false" + name="cam_rotate_stick" + quadrant="left" + scale_image="false" + sound_flags="3" + visible="true" + tool_tip="Orbit camera around focus" + top="20" + width="78" /> <button follows="top|left" height="18" @@ -68,20 +179,24 @@ image_selected="AddItem_Press" image_unselected="AddItem_Off" layout="topleft" + left_pad="14" name="zoom_plus_btn" - width="18"> + width="18" + top="18"> <commit_callback function="Zoom.plus" /> <mouse_held_callback function="Zoom.plus" /> </button> <slider_bar - height="48" + height="50" layout="topleft" name="zoom_slider" orientation="vertical" tool_tip="Zoom camera toward focus" top_pad="0" + min_val="0" + max_val="1" width="18"> <commit_callback function="Slider.value_changed"/> </slider_bar> @@ -100,86 +215,20 @@ <mouse_held_callback function="Zoom.minus" /> </button> - </panel> - <joystick_rotate + <joystick_track follows="top|left" height="78" - image_selected="Cam_Rotate_In" - image_unselected="Cam_Rotate_Out" + image_selected="Cam_Tracking_In" + image_unselected="Cam_Tracking_Out" layout="topleft" - left="45" - mouse_opaque="false" - name="cam_rotate_stick" + left="133" + name="cam_track_stick" quadrant="left" scale_image="false" sound_flags="3" - visible="true" - tool_tip="Orbit camera around focus" - top="22" - width="78" /> - <panel - height="78" - layout="topleft" - left="36" - name="camera_presets" + tool_tip="Move camera up and down, left and right" top="20" - visible="false" - width="78"> - <button - height="40" - image_selected="Cam_Preset_Back_On" - image_unselected="Cam_Preset_Back_Off" - layout="topleft" - left="0" - name="rear_view" - tool_tip="Rear View" - top="2" - width="40"> - <click_callback - function="CameraPresets.ChangeView" - parameter="rear_view" /> - </button> - <button - height="40" - image_selected="Cam_Preset_Side_On" - image_unselected="Cam_Preset_Side_Off" - layout="topleft" - left_pad="5" - name="group_view" - tool_tip="Group View" - top="2" - width="40"> - <click_callback - function="CameraPresets.ChangeView" - parameter="group_view" /> - </button> - <button - height="40" - image_selected="Cam_Preset_Front_On" - image_unselected="Cam_Preset_Front_Off" - layout="topleft" - left="0" - name="front_view" - tool_tip="Front View" - top_pad="5" - width="40"> - <click_callback - function="CameraPresets.ChangeView" - parameter="front_view" /> - </button> - <button - height="40" - image_selected="Cam_Preset_Eye_Off" - image_unselected="Cam_Preset_Eye_Off" - layout="topleft" - left_pad="5" - name="mouselook_view" - tool_tip="Mouselook View" - width="40"> - <click_callback - function="CameraPresets.ChangeView" - parameter="mouselook_view" /> - </button> + width="78"/> </panel> </panel> <panel @@ -189,56 +238,44 @@ left="2" top_pad="0" name="buttons" - width="148"> + width="226"> <button height="23" label="" layout="topleft" - left="23" + left="70" is_toggle="true" - image_overlay="Cam_Orbit_Off" + image_overlay="Cam_Avatar_Off" image_selected="PushButton_Selected_Press" - name="orbit_btn" + name="presets_btn" tab_stop="false" - tool_tip="Orbit camera" + tool_tip="Preset Views" + top="13" width="25"> </button> <button height="23" label="" layout="topleft" - left_pad="0" + left_pad="1" is_toggle="true" - image_overlay="Cam_Pan_Off" + image_overlay="PanOrbit_Off" image_selected="PushButton_Selected_Press" name="pan_btn" tab_stop="false" - tool_tip="Pan camera" - width="25"> - </button> - <button - height="23" - label="" - layout="topleft" - left_pad="0" - image_overlay="Cam_Avatar_Off" - image_selected="PushButton_Selected_Press" - name="avatarview_btn" - tab_stop="false" - tool_tip="See as avatar" + tool_tip="Orbit Zoom Pan" width="25"> </button> <button height="23" label="" layout="topleft" - left_pad="0" - is_toggle="true" + left_pad="1" image_overlay="Cam_FreeCam_Off" image_selected="PushButton_Selected_Press" - name="freecamera_btn" + name="avatarview_btn" tab_stop="false" - tool_tip="View object" + tool_tip="Camera modes" width="25"> </button> </panel> diff --git a/indra/newview/skins/default/xui/en/floater_color_picker.xml b/indra/newview/skins/default/xui/en/floater_color_picker.xml index 2fa112af8c..421f3a72c6 100644 --- a/indra/newview/skins/default/xui/en/floater_color_picker.xml +++ b/indra/newview/skins/default/xui/en/floater_color_picker.xml @@ -213,7 +213,8 @@ left="10" name="(Drag below to save.)" top_pad="66" - width="130"> + width="130" + wrap="true"> (Drag below to save) </text> </floater> diff --git a/indra/newview/skins/default/xui/en/floater_critical.xml b/indra/newview/skins/default/xui/en/floater_critical.xml index 7b5451553f..05c958e051 100644 --- a/indra/newview/skins/default/xui/en/floater_critical.xml +++ b/indra/newview/skins/default/xui/en/floater_critical.xml @@ -6,6 +6,7 @@ height="500" layout="topleft" name="modal container" + open_centered="true" width="600"> <button height="20" @@ -16,15 +17,6 @@ name="Continue" top="465" width="100" /> - <button - height="20" - label="Cancel" - label_selected="Cancel" - layout="topleft" - left_delta="-468" - name="Cancel" - top_delta="0" - width="100" /> <text type="string" length="1" @@ -32,9 +24,9 @@ font="SansSerif" height="20" layout="topleft" - left_delta="4" + left="20" name="tos_heading" - top_delta="-450" + top="20" width="552"> Please read the following message carefully. </text> diff --git a/indra/newview/skins/default/xui/en/floater_customize.xml b/indra/newview/skins/default/xui/en/floater_customize.xml index b048eeceb6..01bced81d0 100644 --- a/indra/newview/skins/default/xui/en/floater_customize.xml +++ b/indra/newview/skins/default/xui/en/floater_customize.xml @@ -11,7 +11,7 @@ save_rect="true" title="APPEARANCE" top_delta="-185" - width="524"> + width="600"> <tab_container height="517" layout="topleft" @@ -21,7 +21,7 @@ tab_position="left" tab_height="50" top="26" - width="506"> + width="580"> <text type="string" length="1" @@ -65,15 +65,15 @@ mouse_opaque="true" width="16" /> <button - follows="right|bottom" + follows="left|top" height="23" - label="Revert" - label_selected="Revert" + label="Create New Shape" + label_selected="Create New Shape" layout="topleft" - right="390" - name="Revert" - top="477" - width="82" /> + left="10" + name="Create New" + top="104" + width="160" /> <button follows="left|top" height="23" @@ -280,46 +280,46 @@ type="string" length="1" top="488" - follows="left|top|right" + follows="left|top" font="SansSerif" halign="right" height="23" layout="topleft" + left="10" name="Item Action Label" - right="132" - width="100"> + width="130"> Shape: </text> <button - follows="left|top" - height="23" - label="Create New Shape" - label_selected="Create New Shape" - layout="topleft" - left="10" - name="Create New" - top="104" - width="160" /> - <button - follows="right|bottom" + follows="left|bottom" height="23" label="Save" label_selected="Save" layout="topleft" name="Save" - right="218" + left_pad="2" top="477" width="82" /> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Save As..." label_selected="Save As..." layout="topleft" name="Save As" top="477" - right="304" - width="82" /> + left_pad="3" + width="115" /> + <button + follows="left|bottom" + height="23" + label="Revert" + label_selected="Revert" + layout="topleft" + left_pad="3" + name="Revert" + top="477" + width="120" /> </panel> <panel border="false" @@ -352,6 +352,16 @@ <button follows="left|top" height="23" + label="Create New Skin" + label_selected="Create New Skin" + layout="topleft" + left_delta="0" + name="Create New" + top_delta="-249" + width="160" /> + <button + follows="left|top" + height="23" label="Skin Color" label_selected="Skin Color" layout="topleft" @@ -479,20 +489,6 @@ width="373"> You do not have permission to modify this wearable. </text> - <text - type="string" - length="1" - top="488" - follows="left|top|right" - font="SansSerif" - halign="right" - height="23" - layout="topleft" - name="Item Action Label" - right="132" - width="100"> - Skin: - </text> <texture_picker allow_no_texture="true" can_apply_immediately="true" @@ -532,46 +528,50 @@ tool_tip="Click to choose a picture" top_delta="102" width="82" /> - <button + <text + type="string" + length="1" + top="488" follows="left|top" + font="SansSerif" + halign="right" height="23" - label="Create New Skin" - label_selected="Create New Skin" layout="topleft" - left_delta="0" - name="Create New" - top_delta="-249" - width="160" /> + left="10" + name="Item Action Label" + width="130"> + Skin: + </text> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Save" label_selected="Save" layout="topleft" - right="218" + left_pad="2" name="Save" top="477" width="82" /> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Save As..." label_selected="Save As..." layout="topleft" - right="304" + left_pad="3" name="Save As" top="477" - width="82" /> + width="115" /> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Revert" label_selected="Revert" layout="topleft" - right="390" + left_pad="3" name="Revert" top="477" - width="82" /> + width="120" /> </panel> <panel border="false" @@ -729,20 +729,6 @@ width="373"> You do not have permission to modify this wearable. </text> - <text - type="string" - length="1" - top="488" - follows="left|top|right" - font="SansSerif" - halign="right" - height="23" - layout="topleft" - name="Item Action Label" - right="132" - width="100"> - Hair: - </text> <texture_picker can_apply_immediately="true" default_image_name="Default" @@ -765,36 +751,50 @@ name="Create New" top_delta="-89" width="160" /> + <text + type="string" + length="1" + top="488" + follows="left|top" + font="SansSerif" + halign="right" + height="23" + layout="topleft" + name="Item Action Label" + left="10" + width="130"> + Hair: + </text> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Save" label_selected="Save" layout="topleft" - right="218" + left_pad="2" name="Save" top="477" width="82" /> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Save As..." label_selected="Save As..." layout="topleft" - right="304" + left_pad="3" name="Save As" top="477" - width="82" /> + width="115" /> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Revert" label_selected="Revert" layout="topleft" - right="390" + left_pad="3" name="Revert" top="477" - width="82" /> + width="120" /> </panel> <panel border="false" @@ -914,20 +914,6 @@ width="373"> You do not have permission to modify this wearable. </text> - <text - type="string" - length="1" - bottom="4" - follows="left|bottom|right" - font="SansSerif" - halign="right" - height="23" - layout="bottomleft" - name="Item Action Label" - right="132" - width="100"> - Eyes: - </text> <texture_picker can_apply_immediately="true" default_image_name="Default" @@ -949,36 +935,50 @@ name="Create New" top="66" width="160" /> + <text + type="string" + length="1" + bottom="4" + follows="left|bottom" + font="SansSerif" + halign="right" + height="23" + layout="bottomleft" + name="Item Action Label" + left="10" + width="130"> + Eyes: + </text> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Save" label_selected="Save" layout="topleft" - right="218" + left_pad="2" name="Save" top="477" width="82" /> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Save As..." label_selected="Save As..." layout="topleft" - right="304" + left_pad="3" name="Save As" top="477" - width="82" /> + width="115" /> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Revert" label_selected="Revert" layout="topleft" - right="390" + left_pad="3" name="Revert" top="477" - width="82" /> + width="120" /> </panel> <text type="string" @@ -1063,36 +1063,50 @@ name="Create New" top="66" width="160" /> + <text + type="string" + length="1" + bottom="4" + follows="left|bottom" + font="SansSerif" + halign="right" + height="23" + layout="bottomleft" + name="Item Action Label" + left="10" + width="130"> + Shirt: + </text> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Save" label_selected="Save" layout="topleft" - right="218" + left_pad="2" name="Save" top="477" width="82" /> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Save As..." label_selected="Save As..." layout="topleft" - right="304" + left_pad="3" name="Save As" top="477" - width="82" /> + width="115" /> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Revert" label_selected="Revert" layout="topleft" - right="390" + left_pad="3" name="Revert" top="477" - width="82" /> + width="120" /> <text type="string" length="1" @@ -1183,20 +1197,6 @@ width="373"> You do not have permission to modify this wearable. </text> - <text - type="string" - length="1" - bottom="4" - follows="left|bottom|right" - font="SansSerif" - halign="right" - height="23" - layout="bottomleft" - name="Item Action Label" - right="132" - width="100"> - Shirt: - </text> </panel> <panel border="false" @@ -1266,36 +1266,50 @@ name="Create New" top="66" width="160" /> + <text + type="string" + length="1" + bottom="4" + follows="left|bottom" + font="SansSerif" + halign="right" + height="23" + layout="bottomleft" + name="Item Action Label" + left="10" + width="130"> + Pants: + </text> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Save" label_selected="Save" layout="topleft" - right="218" + left_pad="2" name="Save" top="477" width="82" /> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Save As..." label_selected="Save As..." layout="topleft" - right="304" + left_pad="3" name="Save As" top="477" - width="82" /> + width="115" /> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Revert" label_selected="Revert" layout="topleft" - right="390" + left_pad="3" name="Revert" top="477" - width="82" /> + width="120" /> <text type="string" length="1" @@ -1386,20 +1400,6 @@ width="373"> You do not have permission to modify this wearable. </text> - <text - type="string" - length="1" - bottom="4" - follows="left|bottom|right" - font="SansSerif" - halign="right" - height="23" - layout="bottomleft" - name="Item Action Label" - right="132" - width="100"> - Pants: - </text> </panel> <panel border="false" @@ -1528,20 +1528,6 @@ width="373"> You do not have permission to modify this wearable. </text> - <text - type="string" - length="1" - bottom="4" - follows="left|bottom|right" - font="SansSerif" - halign="right" - height="23" - layout="bottomleft" - name="Item Action Label" - right="132" - width="100"> - Shoes: - </text> <texture_picker can_apply_immediately="true" default_image_name="Default" @@ -1573,36 +1559,50 @@ name="Take Off" top_pad="4" width="82" /> + <text + type="string" + length="1" + bottom="4" + follows="left|bottom" + font="SansSerif" + halign="right" + height="23" + layout="bottomleft" + left="10" + name="Item Action Label" + width="130"> + Shoes: + </text> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Save" label_selected="Save" layout="topleft" - right="218" + left_pad="2" name="Save" top="477" width="82" /> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Save As..." label_selected="Save As..." layout="topleft" - right="304" + left_pad="3" name="Save As" top="477" - width="82" /> + width="115" /> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Revert" label_selected="Revert" layout="topleft" - right="390" + left_pad="3" name="Revert" top="477" - width="82" /> + width="120" /> </panel> <panel border="false" @@ -1731,20 +1731,6 @@ width="373"> You do not have permission to modify this wearable. </text> - <text - type="string" - length="1" - bottom="4" - follows="left|bottom|right" - font="SansSerif" - halign="right" - height="23" - layout="bottomleft" - name="Item Action Label" - right="132" - width="100"> - Socks: - </text> <texture_picker can_apply_immediately="true" default_image_name="Default" @@ -1776,36 +1762,50 @@ name="Take Off" top_pad="4" width="82" /> + <text + type="string" + length="1" + bottom="4" + follows="left|bottom" + font="SansSerif" + halign="right" + height="23" + layout="bottomleft" + left="10" + name="Item Action Label" + width="130"> + Socks: + </text> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Save" label_selected="Save" layout="topleft" - right="218" + left_pad="2" name="Save" top="477" width="82" /> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Save As..." label_selected="Save As..." layout="topleft" - right="304" + left_pad="3" name="Save As" top="477" - width="82" /> + width="115" /> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Revert" label_selected="Revert" layout="topleft" - right="390" + left_pad="3" name="Revert" top="477" - width="82" /> + width="120" /> </panel> <panel border="false" @@ -1934,20 +1934,6 @@ width="373"> You do not have permission to modify this wearable. </text> - <text - type="string" - length="1" - bottom="4" - follows="left|bottom|right" - font="SansSerif" - halign="right" - height="23" - layout="bottomleft" - name="Item Action Label" - right="132" - width="100"> - Jacket: - </text> <texture_picker can_apply_immediately="true" default_image_name="Default" @@ -1990,36 +1976,50 @@ name="Take Off" top_pad="4" width="82" /> + <text + type="string" + length="1" + bottom="4" + follows="left|bottom" + font="SansSerif" + halign="right" + height="23" + layout="bottomleft" + left="10" + name="Item Action Label" + width="130"> + Jacket: + </text> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Save" label_selected="Save" layout="topleft" - right="218" + left_pad="2" name="Save" top="477" width="82" /> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Save As..." label_selected="Save As..." layout="topleft" - right="304" + left_pad="3" name="Save As" top="477" - width="82" /> + width="115" /> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Revert" label_selected="Revert" layout="topleft" - right="390" + left_pad="3" name="Revert" top="477" - width="82" /> + width="120" /> </panel> <panel border="false" @@ -2148,20 +2148,6 @@ width="373"> You do not have permission to modify this wearable. </text> - <text - type="string" - length="1" - bottom="4" - follows="left|bottom|right" - font="SansSerif" - halign="right" - height="23" - layout="bottomleft" - name="Item Action Label" - right="132" - width="100"> - Gloves: - </text> <texture_picker can_apply_immediately="true" default_image_name="Default" @@ -2193,36 +2179,50 @@ name="Take Off" top_pad="4" width="82" /> + <text + type="string" + length="1" + bottom="4" + follows="left|bottom" + font="SansSerif" + halign="right" + height="23" + layout="bottomleft" + left="10" + name="Item Action Label" + width="130"> + Gloves: + </text> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Save" label_selected="Save" layout="topleft" - right="218" + left_pad="2" name="Save" top="477" width="82" /> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Save As..." label_selected="Save As..." layout="topleft" - right="304" + left_pad="3" name="Save As" top="477" - width="82" /> + width="115" /> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Revert" label_selected="Revert" layout="topleft" - right="390" + left_pad="3" name="Revert" top="477" - width="82" /> + width="120" /> </panel> <panel border="false" @@ -2351,20 +2351,6 @@ width="373"> You do not have permission to modify this wearable. </text> - <text - type="string" - length="1" - bottom="4" - follows="left|bottom|right" - font="SansSerif" - halign="right" - height="23" - layout="bottomleft" - name="Item Action Label" - right="132" - width="100"> - Undershirt: - </text> <texture_picker can_apply_immediately="true" default_image_name="Default" @@ -2396,36 +2382,50 @@ name="Take Off" top_pad="4" width="82" /> + <text + type="string" + length="1" + bottom="4" + follows="left|bottom" + font="SansSerif" + halign="right" + height="23" + layout="bottomleft" + left="10" + name="Item Action Label" + width="130"> + Undershirt: + </text> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Save" label_selected="Save" layout="topleft" - right="218" + left_pad="2" name="Save" top="477" width="82" /> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Save As..." label_selected="Save As..." layout="topleft" - right="304" + left_pad="3" name="Save As" top="477" - width="82" /> + width="115" /> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Revert" label_selected="Revert" layout="topleft" - right="390" + left_pad="3" name="Revert" top="477" - width="82" /> + width="120" /> </panel> <panel border="false" @@ -2554,20 +2554,6 @@ width="373"> You do not have permission to modify this wearable. </text> - <text - type="string" - length="1" - bottom="4" - follows="left|bottom|right" - font="SansSerif" - halign="right" - height="23" - layout="bottomleft" - name="Item Action Label" - right="132" - width="100"> - Underpants: - </text> <texture_picker can_apply_immediately="true" default_image_name="Default" @@ -2599,36 +2585,50 @@ name="Take Off" top_pad="4" width="82" /> + <text + type="string" + length="1" + bottom="4" + follows="left|bottom" + font="SansSerif" + halign="right" + height="23" + layout="bottomleft" + left="10" + name="Item Action Label" + width="130"> + Underpants: + </text> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Save" label_selected="Save" layout="topleft" - right="218" + left_pad="2" name="Save" top="477" width="82" /> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Save As..." label_selected="Save As..." layout="topleft" - right="304" + left_pad="3" name="Save As" top="477" - width="82" /> + width="115" /> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Revert" label_selected="Revert" layout="topleft" - right="390" + left_pad="3" name="Revert" top="477" - width="82" /> + width="120" /> </panel> <panel border="false" @@ -2757,20 +2757,6 @@ width="373"> You do not have permission to modify this wearable. </text> - <text - type="string" - length="1" - bottom="4" - follows="left|bottom|right" - font="SansSerif" - halign="right" - height="23" - layout="bottomleft" - name="Item Action Label" - right="132" - width="100"> - Skirt: - </text> <texture_picker can_apply_immediately="true" default_image_name="Default" @@ -2802,36 +2788,50 @@ name="Take Off" top_pad="4" width="82" /> + <text + type="string" + length="1" + bottom="4" + follows="left|bottom" + font="SansSerif" + halign="right" + height="23" + layout="bottomleft" + left="10" + name="Item Action Label" + width="130"> + Skirt: + </text> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Save" label_selected="Save" layout="topleft" - right="218" + left_pad="2" name="Save" top="477" width="82" /> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Save As..." label_selected="Save As..." layout="topleft" - right="304" + left_pad="3" name="Save As" top="477" - width="82" /> + width="115" /> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Revert" label_selected="Revert" layout="topleft" - right="390" + left_pad="3" name="Revert" top="477" - width="82" /> + width="120" /> </panel> <panel border="false" @@ -2960,20 +2960,6 @@ width="373"> You do not have permission to modify this wearable. </text> - <text - type="string" - length="1" - bottom="4" - follows="left|bottom|right" - font="SansSerif" - halign="right" - height="23" - layout="bottomleft" - name="Item Action Label" - right="132" - width="100"> - Tattoo: - </text> <texture_picker can_apply_immediately="true" default_image_name="Default" @@ -3018,36 +3004,50 @@ top_pad="4" left="10" width="82" /> + <text + type="string" + length="1" + bottom="4" + follows="left|bottom" + font="SansSerif" + halign="right" + height="23" + layout="bottomleft" + left="10" + name="Item Action Label" + width="130"> + Tattoo: + </text> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Save" label_selected="Save" layout="topleft" - right="218" + left_pad="2" name="Save" top="477" width="82" /> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Save As..." label_selected="Save As..." layout="topleft" - right="304" + left_pad="3" name="Save As" top="477" - width="82" /> + width="115" /> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Revert" label_selected="Revert" layout="topleft" - right="390" + left_pad="3" name="Revert" top="477" - width="82" /> + width="120" /> </panel> <panel border="false" @@ -3176,20 +3176,6 @@ width="373"> You do not have permission to modify this wearable. </text> - <text - type="string" - length="1" - bottom="4" - follows="left|bottom|right" - font="SansSerif" - halign="right" - height="23" - layout="bottomleft" - name="Item Action Label" - right="132" - width="100"> - Alpha: - </text> <texture_picker can_apply_immediately="true" default_image_name="Default" @@ -3299,47 +3285,61 @@ left="10" top_pad="20" width="82" /> + <text + type="string" + length="1" + bottom="4" + follows="left|bottom" + font="SansSerif" + halign="right" + height="23" + layout="bottomleft" + left="10" + name="Item Action Label" + width="130"> + Alpha: + </text> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Save" label_selected="Save" layout="topleft" - right="218" + left_pad="2" name="Save" top="477" width="82" /> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Save As..." label_selected="Save As..." layout="topleft" - right="304" + left_pad="3" name="Save As" top="477" - width="82" /> + width="115" /> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Revert" label_selected="Revert" layout="topleft" - right="390" + left_pad="3" name="Revert" top="477" - width="82" /> + width="120" /> </panel> </tab_container> <scroll_container follows="left|top|right|bottom" height="409" layout="topleft" - left="211" + left="247" mouse_opaque="false" name="panel_container" top="92" - width="292"> + width="330"> <scrolling_panel_list follows="left|bottom" layout="topleft" @@ -3355,7 +3355,7 @@ name="script_info" tool_tip="Show scripts attached to your avatar" left="13" - width="90" /> + width="90" ></button> <button bottom="574" follows="right|bottom" @@ -3365,7 +3365,7 @@ layout="topleft" name="make_outfit_btn" right="-218" - width="100" /> + width="120" /> <button bottom="574" follows="right|bottom" diff --git a/indra/newview/skins/default/xui/en/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/en/floater_day_cycle_options.xml index 8c5af2283d..42a9ff551e 100644 --- a/indra/newview/skins/default/xui/en/floater_day_cycle_options.xml +++ b/indra/newview/skins/default/xui/en/floater_day_cycle_options.xml @@ -7,7 +7,7 @@ help_topic="day_cycle_floater" save_rect="true" title="DAY CYCLE EDITOR" - width="646"> + width="658"> <tab_container follows="left|top" height="255" @@ -16,7 +16,7 @@ name="Day Cycle Tabs" tab_position="top" top="20" - width="644"> + width="656"> <panel border="true" follows="left|top|right|bottom" @@ -27,7 +27,7 @@ mouse_opaque="false" name="Day Cycle" top="0" - width="642"> + width="654"> <multi_slider can_edit_text="true" control_name="WLTimeSlider" @@ -313,7 +313,7 @@ left="555" name="WLAddKey" top="30" - width="80" /> + width="96" /> <button height="20" label="Delete Key" @@ -322,7 +322,7 @@ left_delta="0" name="WLDeleteKey" top_pad="5" - width="80" /> + width="96" /> <text type="string" length="1" @@ -334,7 +334,7 @@ left="20" name="WLCurKeyFrameText" top="104" - width="150"> + width="235"> Key Frame Settings: </text> <text @@ -348,7 +348,7 @@ left="30" name="WLCurKeyTimeText" top="124" - width="100"> + width="105"> Key Time: </text> <spinner @@ -361,11 +361,11 @@ label="Hour" label_width="30" layout="topleft" - left_delta="0" + left_delta="25" max_val="100" name="WLCurKeyHour" top_pad="4" - width="70" /> + width="74" /> <spinner control_name="WLCurKeyMin" decimal_digits="0" @@ -392,7 +392,7 @@ left="30" name="WLCurKeyTimeText2" top="169" - width="120"> + width="185"> Key Preset: </text> <combo_box @@ -402,7 +402,7 @@ left_delta="0" name="WLKeyPresets" top_pad="7" - width="155" /> + width="205" /> <view_border bevel_style="none" follows="top|left" @@ -410,7 +410,7 @@ layout="topleft" left="12" top="101" - width="190" /> + width="240" /> <text type="string" length="1" @@ -419,7 +419,7 @@ font="SansSerif" height="16" layout="topleft" - left="220" + left_pad="15" name="DayCycleText" top="114" width="120"> @@ -444,7 +444,7 @@ layout="topleft" left_delta="0" name="DayCycleText2" - top_pad="9" + top_pad="17" width="120"> Length of Cycle: </text> @@ -462,7 +462,7 @@ max_val="100" name="WLLengthOfDayHour" top_pad="4" - width="70" /> + width="74" /> <spinner control_name="WLLengthOfDayMin" decimal_digits="0" @@ -492,57 +492,58 @@ max_val="59" name="WLLengthOfDaySec" top_delta="0" - width="60" /> + width="60"/> <text type="string" + halign="right" length="1" border_visible="true" follows="left|top|right" font="SansSerif" height="16" layout="topleft" - left="310" + left_delta="-23" name="DayCycleText3" top="114" - width="120"> - Preview: + width="85"> + Preview : </text> <button height="20" label="Play" label_selected="Play" layout="topleft" - left_delta="60" + left="480" name="WLAnimSky" top_pad="5" - width="50" /> + width="83" /> <button height="20" label="Stop!" label_selected="Stop" layout="topleft" - left_pad="5" + left_pad="4" name="WLStopAnimSky" top_delta="0" - width="50" /> + width="83" /> <button height="20" label="Use Estate Time" label_selected="Go to Estate Time" layout="topleft" - left_pad="5" + left="480" name="WLUseLindenTime" - top_delta="0" - width="150" /> + top_pad="9" + width="170" /> <button height="20" label="Save Test Day" label_selected="Save Test Day" layout="topleft" - left="480" + left_delta="0" name="WLSaveDayCycle" - top="175" - width="150" /> + top_pad="9" + width="170" /> <button height="20" label="Load Test Day" @@ -550,8 +551,8 @@ layout="topleft" left_delta="0" name="WLLoadDayCycle" - top_pad="5" - width="150" /> + top_pad="3" + width="170" /> </panel> </tab_container> </floater> diff --git a/indra/newview/skins/default/xui/en/floater_env_settings.xml b/indra/newview/skins/default/xui/en/floater_env_settings.xml index 8c87bd42dd..14f9e2db95 100644 --- a/indra/newview/skins/default/xui/en/floater_env_settings.xml +++ b/indra/newview/skins/default/xui/en/floater_env_settings.xml @@ -135,28 +135,28 @@ width="210" /> <button follows="left|top" - height="20" + height="23" label="Use Estate Time" layout="topleft" - left="8" + left="10" name="EnvUseEstateTimeButton" top="120" width="137" /> <button follows="left|top" - height="20" + height="23" label="Advanced Sky" layout="topleft" - left_pad="9" + left_pad="3" name="EnvAdvancedSkyButton" top_delta="0" width="137" /> <button follows="left|top" - height="20" + height="23" label="Advanced Water" layout="topleft" - left_pad="9" + left_pad="3" name="EnvAdvancedWaterButton" top_delta="0" width="137" /> diff --git a/indra/newview/skins/default/xui/en/floater_event.xml b/indra/newview/skins/default/xui/en/floater_event.xml new file mode 100644 index 0000000000..d9c9d63c72 --- /dev/null +++ b/indra/newview/skins/default/xui/en/floater_event.xml @@ -0,0 +1,314 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<floater + follows="all" + height="350" + help_topic="event_details" + label="Event" + layout="topleft" + name="Event" + title="EVENT DETAILS" + width="330"> + <floater.string + name="none"> + none + </floater.string> + <floater.string + name="notify"> + Notify + </floater.string> + <floater.string + name="dont_notify"> + Don't Notify + </floater.string> + <floater.string + name="moderate"> + Moderate + </floater.string> + <floater.string + name="adult"> + Adult + </floater.string> + <floater.string + name="general"> + General + </floater.string> + <floater.string + name="unknown"> + Unknown + </floater.string> + <layout_stack + name="layout" + orientation="vertical" + follows="all" + layout="topleft" + left="0" + top="0" + height="350" + width="330" + border_size="0"> + <layout_panel + name="profile_stack" + follows="top|left" + layout="topleft" + top="0" + left="0" + height="305" + width="330"> + <text + follows="top|left|right" + font="SansSerifLarge" + text_color="white" + height="17" + layout="topleft" + left="10" + name="event_name" + top="5" + use_ellipses="true" + width="310"> + Nameless Event...of Doom! De doom! Doom doom. + </text> + <text + type="string" + length="1" + follows="top|left" + height="13" + text_color="LtGray_50" + layout="topleft" + left="25" + name="event_category" + width="300"> + (no category) + </text> + + <text + type="string" + length="1" + follows="top|left" + layout="topleft" + left="10" + top_pad="7" + name="event_runby_label" + width="90"> + Run by: + </text> + <text + follows="left|top" + height="20" + initial_value="(retrieving)" + layout="topleft" + left_pad="0" + link="true" + name="event_runby" + top_delta="0" + use_ellipses="true" + width="240" /> + <text + type="string" + length="1" + follows="top|left" + layout="topleft" + left="10" + top_pad="5" + name="event_date_label" + width="90"> + Date: + </text> + <text + type="string" + length="1" + left_pad="0" + height="17" + top_delta="0" + follows="top|left" + layout="topleft" + name="event_date" + width="240"> + 10/10/2010 + </text> + <text + type="string" + length="1" + follows="top|left" + layout="topleft" + left="10" + top_pad="5" + name="event_duration_label" + width="90"> + Duration: + </text> + <text + type="string" + height="14" + length="1" + left_pad="0" + follows="top|left" + layout="topleft" + name="event_duration" + top_delta="0" + width="240"> + 1 hour + </text> + <text + type="string" + length="1" + follows="top|left" + layout="topleft" + left="10" + top_pad="5" + name="event_covercharge_label" + width="90"> + Cover charge: + </text> + <text + type="string" + follows="left|top" + height="16" + layout="topleft" + left_pad="0" + name="event_cover" + visible="true" + width="240" + top_delta="0"> + Free + </text> + <text + type="string" + length="1" + follows="top|left" + layout="topleft" + left="10" + top_pad="5" + name="event_location_label" + width="90"> + Location: + </text> + <text + type="string" + length="1" + height="20" + left_pad="0" + follows="top|left" + layout="topleft" + name="event_location" + use_ellipses="true" + top_delta="0" + value="SampleParcel, Name Long (145, 228, 26)" + width="240" /> + <icon + follows="top|left" + height="16" + image_name="Parcel_PG_Dark" + layout="topleft" + left="10" + name="rating_icon_pg" + width="18" /> + <icon + follows="top|left" + height="16" + image_name="Parcel_M_Dark" + layout="topleft" + left="10" + name="rating_icon_m" + top_delta="0" + width="18" /> + <icon + follows="top|left" + height="16" + image_name="Parcel_R_Dark" + layout="topleft" + left="10" + name="rating_icon_r" + top_delta="0" + width="18" /> + <text + follows="left|top" + height="16" + layout="topleft" + left_pad="12" + name="rating_label" + top_delta="3" + value="Rating:" + width="90" /> + <text + follows="left|right|top" + height="16" + layout="topleft" + left_pad="2" + name="rating_value" + top_delta="0" + value="unknown" + width="240" /> + <expandable_text + follows="left|top|right" + height="65" + layout="topleft" + left="6" + name="event_desc" + textbox.label="More" + width="322"> + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</expandable_text> + </layout_panel> + <layout_panel + follows="left|right" + height="24" + layout="topleft" + mouse_opaque="false" + name="button_panel" + top="0" + left="0" + user_resize="false"> + <button + follows="left|top" + height="18" + image_selected="AddItem_Press" + image_unselected="AddItem_Off" + image_disabled="AddItem_Disabled" + layout="topleft" + left="6" + name="create_event_btn" + picture_style="true" + tool_tip="Create Event" + width="18" /> + <button + follows="left|top" + height="18" + image_selected="MinusItem_Press" + image_unselected="MinusItem_Off" + image_disabled="MinusItem_Disabled" + layout="topleft" + visible="false" + left="6" + top_pad="-7" + name="god_delete_event_btn" + picture_style="true" + tool_tip="Delete Event" + width="18" /> + <button + follows="left|top" + height="23" + label="Notify Me" + layout="topleft" + left_pad="3" + top_delta="-12" + name="notify_btn" + width="100" /> + <button + follows="left|top" + height="23" + label="Teleport" + layout="topleft" + left_pad="5" + name="teleport_btn" + width="100" /> + <button + follows="left|top" + height="23" + label="Map" + layout="topleft" + left_pad="5" + name="map_btn" + width="85" /> + </layout_panel> + </layout_stack> + </floater> + diff --git a/indra/newview/skins/default/xui/en/floater_god_tools.xml b/indra/newview/skins/default/xui/en/floater_god_tools.xml index 0fac6cd5f1..dfe3cf4485 100644 --- a/indra/newview/skins/default/xui/en/floater_god_tools.xml +++ b/indra/newview/skins/default/xui/en/floater_god_tools.xml @@ -31,19 +31,6 @@ <button follows="left|top" height="20" - label="Kick all users" - label_selected="Kick all users" - layout="topleft" - left="10" - name="Kick all users" - top="30" - width="120"> - <button.commit_callback - function="GridTools.KickAll" /> - </button> - <button - follows="left|top" - height="20" label="Flush This Region's Map Visibility Caches" label_selected="Flush This Region's Map Visibility Caches" layout="topleft" @@ -74,10 +61,10 @@ height="10" layout="topleft" left="10" - name="Sim Name:" + name="Region Name:" top="12" width="80"> - Sim Name: + Region Name: </text> <line_editor border_style="line" @@ -494,10 +481,10 @@ height="10" layout="topleft" left="10" - name="Sim Name:" + name="Region Name:" top="10" width="80"> - Sim Name: + Region Name: </text> <text type="string" diff --git a/indra/newview/skins/default/xui/en/floater_hardware_settings.xml b/indra/newview/skins/default/xui/en/floater_hardware_settings.xml index 1e2440580e..27f8b4bb39 100644 --- a/indra/newview/skins/default/xui/en/floater_hardware_settings.xml +++ b/indra/newview/skins/default/xui/en/floater_hardware_settings.xml @@ -6,7 +6,7 @@ name="Hardware Settings Floater" help_topic="hardware_settings_floater" title="HARDWARE SETTINGS" - width="500"> + width="615"> <text type="string" length="1" @@ -16,7 +16,7 @@ left="10" name="Filtering:" top="20" - width="128"> + width="188"> Filtering: </text> <check_box @@ -37,7 +37,7 @@ left="10" name="Antialiasing:" top_pad="7" - width="128"> + width="188"> Antialiasing: </text> <combo_box @@ -79,13 +79,13 @@ increment="0.01" initial_value="1" label="Gamma:" - label_width="138" + label_width="198" layout="topleft" left="10" max_val="2" name="gamma" top_pad="7" - width="202" /> + width="262" /> <text type="string" length="1" @@ -95,7 +95,7 @@ left_pad="10" name="(brightness, lower is brighter)" top_delta="2" - width="315"> + width="385"> (0 = default brightness, lower = brighter) </text> <text @@ -107,7 +107,7 @@ left="10" name="Enable VBO:" top_pad="10" - width="128"> + width="188"> Enable VBO: </text> <check_box @@ -128,14 +128,14 @@ increment="16" initial_value="32" label="Texture Memory (MB):" - label_width="135" + label_width="195" layout="topleft" left="10" max_val="4096" name="GraphicsCardTextureMemory" tool_tip="Amount of memory to allocate for textures. Defaults to video card memory. Reducing this may improve performance but may also make textures blurry." top_pad="10" - width="300" /> + width="360" /> <spinner control_name="RenderFogRatio" decimal_digits="1" @@ -143,14 +143,14 @@ height="22" initial_value="4" label="Fog Distance Ratio:" - label_width="138" + label_width="198" layout="topleft" left_delta="0" max_val="10" min_val="0.5" name="fog" top_pad="7" - width="202" /> + width="262" /> <button follows="right|bottom" height="22" diff --git a/indra/newview/skins/default/xui/en/floater_help_browser.xml b/indra/newview/skins/default/xui/en/floater_help_browser.xml index be32e917e5..214fb6ce54 100644 --- a/indra/newview/skins/default/xui/en/floater_help_browser.xml +++ b/indra/newview/skins/default/xui/en/floater_help_browser.xml @@ -2,7 +2,7 @@ <floater legacy_header_height="18" can_resize="true" - height="480" + height="600" layout="topleft" min_height="150" min_width="500" @@ -11,7 +11,7 @@ save_rect="true" single_instance="true" title="HELP BROWSER" - width="620"> + width="650"> <floater.string name="loading_text"> Loading... @@ -20,20 +20,20 @@ name="done_text"> </floater.string> <layout_stack - bottom="480" + bottom="600" follows="left|right|top|bottom" layout="topleft" left="5" name="stack1" top="20" - width="610"> + width="640"> <layout_panel layout="topleft" left_delta="0" top_delta="0" name="external_controls" user_resize="false" - width="590"> + width="620"> <web_browser bottom="-11" follows="left|right|top|bottom" @@ -41,8 +41,8 @@ left="0" name="browser" top="0" - height="500" - width="590" /> + height="610" + width="620" /> <text follows="bottom|left" height="16" diff --git a/indra/newview/skins/default/xui/en/floater_im.xml b/indra/newview/skins/default/xui/en/floater_im.xml index a21242ffe1..55efe83820 100644 --- a/indra/newview/skins/default/xui/en/floater_im.xml +++ b/indra/newview/skins/default/xui/en/floater_im.xml @@ -14,7 +14,7 @@ width="419"> <multi_floater.string name="only_user_message"> - You are the only user in this session. + You are the only Resident in this session. </multi_floater.string> <multi_floater.string name="offline_message"> @@ -54,7 +54,7 @@ </multi_floater.string> <multi_floater.string name="add_session_event"> - Unable to add users to chat session with [RECIPIENT]. + Unable to add Residents to chat session with [RECIPIENT]. </multi_floater.string> <multi_floater.string name="message_session_event"> diff --git a/indra/newview/skins/default/xui/en/floater_im_container.xml b/indra/newview/skins/default/xui/en/floater_im_container.xml index bd25288a9e..e123de46c2 100644 --- a/indra/newview/skins/default/xui/en/floater_im_container.xml +++ b/indra/newview/skins/default/xui/en/floater_im_container.xml @@ -11,7 +11,7 @@ save_visibility="true" single_instance="true" title="CONVERSATIONS" - width="392"> + width="396"> <tab_container follows="left|right|top|bottom" height="390" @@ -19,10 +19,22 @@ left="1" name="im_box_tab_container" tab_position="bottom" - tab_width="80" + tab_width="64" + tab_max_width = "134" tab_height="16" + use_custom_icon_ctrl="true" + tab_icon_ctrl_pad="2" + halign="left" + use_ellipses="true" top="0" - width="390" /> + width="394"> + <first_tab + tab_bottom_image_flash="Toolbar_Left_Flash"/> + <middle_tab + tab_bottom_image_flash="Toolbar_Middle_Flash"/> + <last_tab + tab_bottom_image_flash="Toolbar_Right_Flash"/> + </tab_container> <icon color="DefaultShadowLight" enabled="false" @@ -33,5 +45,5 @@ left="1" name="im_box_tab_container_icon" bottom="10" - width="390" /> + width="394" /> </multi_floater> diff --git a/indra/newview/skins/default/xui/en/floater_im_session.xml b/indra/newview/skins/default/xui/en/floater_im_session.xml index d2e5473157..c9b013099b 100644 --- a/indra/newview/skins/default/xui/en/floater_im_session.xml +++ b/indra/newview/skins/default/xui/en/floater_im_session.xml @@ -2,6 +2,7 @@ <floater legacy_header_height="18" background_visible="true" + default_tab_group="1" follows="all" height="350" layout="topleft" @@ -12,33 +13,36 @@ can_minimize="true" can_close="true" visible="false" - width="360" + width="394" can_resize="true" min_width="250" min_height="190"> <layout_stack animate="false" + default_tab_group="2" follows="all" height="320" - width="360" + width="394" layout="topleft" orientation="horizontal" name="im_panels" + tab_group="1" top="20" left="0"> <layout_panel name="panel_im_control_panel" layout="topleft" follows="left" - label="IM Control Panel" min_width="115" auto_resize="false" user_resize="true" /> <layout_panel + default_tab_group="3" left="0" + tab_group="2" top="0" height="200" - width="245" + width="254" user_resize="true"> <button height="20" @@ -65,7 +69,7 @@ parse_highlights="true" allow_html="true" left="1" - width="240"> + width="249"> </chat_history> <line_editor bottom="0" @@ -75,7 +79,8 @@ label="To" layout="bottomleft" name="chat_editor" - width="240"> + tab_group="3" + width="249"> </line_editor> </layout_panel> </layout_stack> diff --git a/indra/newview/skins/default/xui/en/floater_image_preview.xml b/indra/newview/skins/default/xui/en/floater_image_preview.xml index 6f8f272128..86232de1a4 100644 --- a/indra/newview/skins/default/xui/en/floater_image_preview.xml +++ b/indra/newview/skins/default/xui/en/floater_image_preview.xml @@ -64,35 +64,45 @@ name="clothing_type_combo" top_delta="3" width="160"> - <combo_box.item + <item label="Image" + value="Image" name="Image" /> - <combo_box.item + <item label="Hair" + value="Hair" name="Hair" /> - <combo_box.item + <item label="Female Head" + value="Female Head" name="FemaleHead" /> - <combo_box.item + <item label="Female Upper Body" + value="Female Upper Body" name="FemaleUpperBody" /> - <combo_box.item + <item label="Female Lower Body" + value="Female Lower Body" name="FemaleLowerBody" /> - <combo_box.item + <item label="Male Head" + value="Male Head" name="MaleHead" /> - <combo_box.item + <item label="Male Upper Body" + value="Male Upper Body" name="MaleUpperBody" /> - <combo_box.item + <item label="Male Lower Body" + value="Male Lower Body" name="MaleLowerBody" /> - <combo_box.item + <item label="Skirt" + value="Skirt" name="Skirt" /> - <combo_box.item + <item label="Sculpted Prim" + value="Sculpted Prim" name="SculptedPrim" /> </combo_box> <text diff --git a/indra/newview/skins/default/xui/en/floater_incoming_call.xml b/indra/newview/skins/default/xui/en/floater_incoming_call.xml index 1d67123726..24fff6d4ae 100644 --- a/indra/newview/skins/default/xui/en/floater_incoming_call.xml +++ b/indra/newview/skins/default/xui/en/floater_incoming_call.xml @@ -32,7 +32,15 @@ </floater.string> <floater.string name="VoiceInviteGroup"> - has joined a Voice Chat call with the group [GROUP]. + just joined '[GROUP]' voice channel. + </floater.string> + <floater.string + name="VoiceInviteQuestionGroup"> + Would you like to leave [CURRENT_CHAT] and join the call with '[GROUP]'? + </floater.string> + <floater.string + name="VoiceInviteQuestionDefault"> + Do you want to leave [CURRENT_CHAT] and join this voice chat? </floater.string> <avatar_icon enabled="false" diff --git a/indra/newview/skins/default/xui/en/floater_inspect.xml b/indra/newview/skins/default/xui/en/floater_inspect.xml index 3f7642fafe..bea35e5fc1 100644 --- a/indra/newview/skins/default/xui/en/floater_inspect.xml +++ b/indra/newview/skins/default/xui/en/floater_inspect.xml @@ -16,7 +16,7 @@ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local] </floater.string> <scroll_list - bottom="270" + bottom="268" column_padding="0" draw_heading="true" follows="top|right|left|bottom" @@ -47,23 +47,23 @@ </scroll_list> <button follows="left|bottom" - height="20" + height="23" label="See Owner Profile..." layout="topleft" - left_delta="0" + left_delta="-1" name="button owner" tool_tip="See profile of the highlighted object's owner" - top_pad="5" + top_pad="4" width="150"> <button.commit_callback function="Inspect.OwnerProfile" /> </button> <button follows="left|bottom" - height="20" + height="23" label="See Creator Profile..." layout="topleft" - left_pad="10" + left_pad="5" name="button creator" tool_tip="See profile of the highlighted object's original creator" top_delta="0" diff --git a/indra/newview/skins/default/xui/en/floater_inventory.xml b/indra/newview/skins/default/xui/en/floater_inventory.xml index e187eabd3a..ba2e0d3277 100644 --- a/indra/newview/skins/default/xui/en/floater_inventory.xml +++ b/indra/newview/skins/default/xui/en/floater_inventory.xml @@ -14,22 +14,6 @@ single_instance="false" title="MY INVENTORY" width="467"> - <floater.string - name="Title"> - MY INVENTORY - </floater.string> - <floater.string - name="TitleFetching"> - Inventory (Fetching [ITEM_COUNT] Items...) [FILTER] - </floater.string> - <floater.string - name="TitleCompleted"> - Inventory ([ITEM_COUNT] Items) [FILTER] - </floater.string> - <floater.string - name="Fetched"> - Fetched - </floater.string> <panel bottom="560" class="panel_main_inventory" diff --git a/indra/newview/skins/default/xui/en/floater_joystick.xml b/indra/newview/skins/default/xui/en/floater_joystick.xml index 4d67e4c343..6e1bb8fcd0 100644 --- a/indra/newview/skins/default/xui/en/floater_joystick.xml +++ b/indra/newview/skins/default/xui/en/floater_joystick.xml @@ -6,7 +6,7 @@ name="Joystick" help_topic="joystick" title="JOYSTICK CONFIGURATION" - width="550"> + width="569"> <floater.string name="NoDevice"> no device detected @@ -148,7 +148,7 @@ halign="right" height="10" layout="topleft" - left="12" + left="37" mouse_opaque="false" name="Control Modes:" top="110" @@ -161,7 +161,7 @@ halign="center" label="Avatar" layout="topleft" - left="125" + left="150" name="JoystickAvatarEnabled" width="60" /> <check_box @@ -170,7 +170,7 @@ halign="center" label="Build" layout="topleft" - left="194" + left="219" name="JoystickBuildEnabled" width="60" /> <check_box @@ -179,14 +179,14 @@ halign="center" label="Flycam" layout="topleft" - left="262" + left="289" name="JoystickFlycamEnabled" width="60" /> <stat_view height="250" label="Joystick Monitor" layout="topleft" - left="340" + left="359" name="axis_view" show_label="true" top="142" @@ -250,9 +250,9 @@ bottom="144" halign="right" layout="topleft" - left="20" + left="3" name="XScale" - width="94"> + width="140"> X Scale </text> <spinner @@ -261,7 +261,7 @@ decimal_digits="2" label_width="0" layout="topleft" - left="125" + left="150" max_val="50" min_val="-50" name="AvatarAxisScale1" @@ -272,7 +272,7 @@ decimal_digits="2" label_width="0" layout="topleft" - left="195" + left="220" max_val="1024" min_val="-1024" name="BuildAxisScale1" @@ -283,7 +283,7 @@ decimal_digits="2" label_width="0" layout="topleft" - left="265" + left="290" max_val="1024" min_val="-1024" name="FlycamAxisScale1" @@ -294,9 +294,9 @@ bottom="164" halign="right" layout="topleft" - left="20" + left="3" name="YScale" - width="94"> + width="140"> Y Scale </text> <spinner @@ -305,7 +305,7 @@ decimal_digits="2" label_width="0" layout="topleft" - left="125" + left="150" max_val="50" min_val="-50" name="AvatarAxisScale2" @@ -316,7 +316,7 @@ decimal_digits="2" label_width="0" layout="topleft" - left="195" + left="220" max_val="1024" min_val="-1024" name="BuildAxisScale2" @@ -327,7 +327,7 @@ decimal_digits="2" label_width="0" layout="topleft" - left="265" + left="290" max_val="1024" min_val="-1024" name="FlycamAxisScale2" @@ -338,9 +338,9 @@ bottom="184" halign="right" layout="topleft" - left="20" + left="3" name="ZScale" - width="94"> + width="140"> Z Scale </text> <spinner @@ -349,7 +349,7 @@ decimal_digits="2" label_width="0" layout="topleft" - left="125" + left="150" max_val="50" min_val="-50" name="AvatarAxisScale0" @@ -360,7 +360,7 @@ decimal_digits="2" label_width="0" layout="topleft" - left="195" + left="220" max_val="1024" min_val="-1024" name="BuildAxisScale0" @@ -371,7 +371,7 @@ decimal_digits="2" label_width="0" layout="topleft" - left="265" + left="290" max_val="1024" min_val="-1024" name="FlycamAxisScale0" @@ -382,9 +382,9 @@ bottom="204" halign="right" layout="topleft" - left="20" + left="3" name="PitchScale" - width="94"> + width="140"> Pitch Scale </text> <spinner @@ -393,7 +393,7 @@ decimal_digits="2" label_width="0" layout="topleft" - left="125" + left="150" max_val="1024" min_val="-1024" name="AvatarAxisScale4" @@ -404,7 +404,7 @@ decimal_digits="2" label_width="0" layout="topleft" - left="195" + left="220" max_val="1024" min_val="-1024" name="BuildAxisScale4" @@ -415,7 +415,7 @@ decimal_digits="2" label_width="0" layout="topleft" - left="265" + left="290" max_val="1024" min_val="-1024" name="FlycamAxisScale4" @@ -426,9 +426,9 @@ bottom="224" halign="right" layout="topleft" - left="20" + left="3" name="YawScale" - width="94"> + width="140"> Yaw Scale </text> <spinner @@ -437,7 +437,7 @@ decimal_digits="2" label_width="0" layout="topleft" - left="125" + left="150" max_val="1024" min_val="-1024" name="AvatarAxisScale5" @@ -448,7 +448,7 @@ decimal_digits="2" label_width="0" layout="topleft" - left="195" + left="220" max_val="1024" min_val="-1024" name="BuildAxisScale5" @@ -459,7 +459,7 @@ decimal_digits="2" label_width="0" layout="topleft" - left="265" + left="290" max_val="1024" min_val="-1024" name="FlycamAxisScale5" @@ -470,9 +470,9 @@ bottom="244" halign="right" layout="topleft" - left="20" + left="3" name="RollScale" - width="94"> + width="140"> Roll Scale </text> <spinner @@ -481,7 +481,7 @@ decimal_digits="2" label_width="0" layout="topleft" - left="195" + left="220" max_val="1024" min_val="-1024" name="BuildAxisScale3" @@ -492,7 +492,7 @@ decimal_digits="2" label_width="0" layout="topleft" - left="265" + left="290" max_val="1024" min_val="-1024" name="FlycamAxisScale3" @@ -503,9 +503,9 @@ bottom="274" halign="right" layout="topleft" - left="20" + left="3" name="XDeadZone" - width="94"> + width="140"> X Dead Zone </text> <spinner @@ -515,7 +515,7 @@ increment="0.01" label_width="0" layout="topleft" - left="125" + left="150" name="AvatarAxisDeadZone1" width="56" /> <spinner @@ -525,7 +525,7 @@ increment="0.01" label_width="0" layout="topleft" - left="195" + left="220" name="BuildAxisDeadZone1" width="56" /> <spinner @@ -535,7 +535,7 @@ increment="0.01" label_width="0" layout="topleft" - left="265" + left="290" name="FlycamAxisDeadZone1" width="56" /> <text @@ -544,9 +544,9 @@ bottom="294" halign="right" layout="topleft" - left="20" + left="3" name="YDeadZone" - width="94"> + width="140"> Y Dead Zone </text> <spinner @@ -556,7 +556,7 @@ increment="0.01" label_width="0" layout="topleft" - left="125" + left="150" name="AvatarAxisDeadZone2" width="56" /> <spinner @@ -566,7 +566,7 @@ increment="0.01" label_width="0" layout="topleft" - left="195" + left="220" name="BuildAxisDeadZone2" width="56" /> <spinner @@ -576,7 +576,7 @@ increment="0.01" label_width="0" layout="topleft" - left="265" + left="290" name="FlycamAxisDeadZone2" width="56" /> <text @@ -585,9 +585,9 @@ bottom="314" halign="right" layout="topleft" - left="20" + left="3" name="ZDeadZone" - width="94"> + width="140"> Z Dead Zone </text> <spinner @@ -597,7 +597,7 @@ increment="0.01" label_width="0" layout="topleft" - left="125" + left="150" name="AvatarAxisDeadZone0" width="56" /> <spinner @@ -607,7 +607,7 @@ increment="0.01" label_width="0" layout="topleft" - left="195" + left="220" name="BuildAxisDeadZone0" width="56" /> <spinner @@ -617,7 +617,7 @@ increment="0.01" label_width="0" layout="topleft" - left="265" + left="290" name="FlycamAxisDeadZone0" width="56" /> <text @@ -626,9 +626,9 @@ bottom="334" halign="right" layout="topleft" - left="20" + left="2" name="PitchDeadZone" - width="94"> + width="140"> Pitch Dead Zone </text> <spinner @@ -638,7 +638,7 @@ increment="0.01" label_width="0" layout="topleft" - left="125" + left="150" name="AvatarAxisDeadZone4" width="56" /> <spinner @@ -648,7 +648,7 @@ increment="0.01" label_width="0" layout="topleft" - left="195" + left="220" name="BuildAxisDeadZone4" width="56" /> <spinner @@ -658,7 +658,7 @@ increment="0.01" label_width="0" layout="topleft" - left="265" + left="290" name="FlycamAxisDeadZone4" width="56" /> <text @@ -667,9 +667,9 @@ bottom="354" halign="right" layout="topleft" - left="20" + left="3" name="YawDeadZone" - width="94"> + width="140"> Yaw Dead Zone </text> <spinner @@ -679,7 +679,7 @@ increment="0.01" label_width="0" layout="topleft" - left="125" + left="150" name="AvatarAxisDeadZone5" width="56" /> <spinner @@ -689,7 +689,7 @@ increment="0.01" label_width="0" layout="topleft" - left="195" + left="220" name="BuildAxisDeadZone5" width="56" /> <spinner @@ -699,7 +699,7 @@ increment="0.01" label_width="0" layout="topleft" - left="265" + left="290" name="FlycamAxisDeadZone5" width="56" /> <text @@ -708,9 +708,9 @@ bottom="374" halign="right" layout="topleft" - left="20" + left="3" name="RollDeadZone" - width="94"> + width="140"> Roll Dead Zone </text> <spinner @@ -720,7 +720,7 @@ increment="0.01" label_width="0" layout="topleft" - left="195" + left="220" name="BuildAxisDeadZone3" width="56" /> <spinner @@ -730,7 +730,7 @@ increment="0.01" label_width="0" layout="topleft" - left="265" + left="290" name="FlycamAxisDeadZone3" width="56" /> <text @@ -739,9 +739,9 @@ bottom="402" halign="right" layout="topleft" - left="20" + left="3" name="Feathering" - width="94"> + width="140"> Feathering </text> <slider @@ -752,7 +752,7 @@ increment="1" initial_value="0.7" layout="topleft" - left="116" + left="141" max_val="32" min_val="1" name="AvatarFeathering" @@ -795,9 +795,9 @@ bottom="430" halign="right" layout="topleft" - left="20" + left="3" name="ZoomScale2" - width="94"> + width="140"> Zoom Scale </text> <spinner @@ -806,7 +806,7 @@ decimal_digits="2" label_width="0" layout="topleft" - left="265" + left="290" max_val="1024" min_val="-1024" name="FlycamAxisScale6" @@ -817,9 +817,9 @@ bottom="450" halign="right" layout="topleft" - left="20" + left="3" name="ZoomDeadZone" - width="94"> + width="140"> Zoom Dead Zone </text> <spinner @@ -829,7 +829,7 @@ increment="0.01" label_width="0" layout="topleft" - left="265" + left="290" name="FlycamAxisDeadZone6" width="56" /> <button @@ -837,10 +837,10 @@ height="22" label="SpaceNavigator Defaults" layout="topleft" - left="340" + left="359" name="SpaceNavigatorDefaults" top="429" - width="184" /> + width="200" /> <button follows="right|bottom" height="20" @@ -850,7 +850,7 @@ left_delta="0" name="ok_btn" top_pad="9" - width="90" /> + width="98" /> <button follows="right|bottom" height="20" @@ -860,5 +860,5 @@ left_pad="4" name="cancel_btn" top_delta="0" - width="90" /> + width="98" /> </floater> diff --git a/indra/newview/skins/default/xui/en/floater_land_holdings.xml b/indra/newview/skins/default/xui/en/floater_land_holdings.xml index 06c766f744..0b9ae3c9f3 100644 --- a/indra/newview/skins/default/xui/en/floater_land_holdings.xml +++ b/indra/newview/skins/default/xui/en/floater_land_holdings.xml @@ -99,7 +99,7 @@ name="allowed_label" top="366" left="10" - width="290"> + width="365"> Allowed land holdings at current payment plan: </text> <text @@ -110,7 +110,7 @@ layout="topleft" name="allowed_text" top="366" - left="305" + left="380" width="290"> [AREA] m² </text> @@ -123,7 +123,7 @@ top="386" left="10" name="current_label" - width="290"> + width="365"> Current land holdings: </text> <text @@ -133,7 +133,7 @@ height="16" layout="topleft" top="386" - left="305" + left="380" name="current_text" width="290"> [AREA] m² @@ -148,7 +148,7 @@ top="406" left="10" name="available_label" - width="290"> + width="365"> Available for land purchases: </text> <text @@ -160,7 +160,7 @@ layout="topleft" name="available_text" top="406" - left="305" + left="380" width="290"> [AREA] m² </text> diff --git a/indra/newview/skins/default/xui/en/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/en/floater_live_lsleditor.xml index 990be55847..1f192f9b28 100644 --- a/indra/newview/skins/default/xui/en/floater_live_lsleditor.xml +++ b/indra/newview/skins/default/xui/en/floater_live_lsleditor.xml @@ -45,9 +45,9 @@ layout="topleft" name="Reset" left="10" - width="61" /> + width="85" /> <check_box - left_delta="71" + left_delta="90" top_delta="3" enabled="false" follows="left|bottom" @@ -57,9 +57,9 @@ label="Running" layout="topleft" name="running" - width="100" /> + width="205" /> <check_box - left_delta="75" + left_delta="140" enabled="true" follows="left|bottom" font="SansSerif" diff --git a/indra/newview/skins/default/xui/en/floater_map.xml b/indra/newview/skins/default/xui/en/floater_map.xml index 1903e7c714..a0e28f7a42 100644 --- a/indra/newview/skins/default/xui/en/floater_map.xml +++ b/indra/newview/skins/default/xui/en/floater_map.xml @@ -1,21 +1,22 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <floater - legacy_header_height="18" + bg_alpha_image_overlay="DkGray_66" + legacy_header_height="0" can_minimize="true" can_resize="true" - center_horiz="true" - center_vert="true" follows="top|right" - height="218" + height="174" layout="topleft" - min_height="60" + min_height="174" min_width="174" name="Map" - title="Mini Map" + title="" help_topic="map" save_rect="true" save_visibility="true" single_instance="true" + left="0" + top="0" width="200"> <floater.string name="mini_map_north"> @@ -61,8 +62,8 @@ mouse_opaque="false" name="Net Map" width="200" - height="200" - top="18"/> + height="218" + top="0"/> <text type="string" length="1" diff --git a/indra/newview/skins/default/xui/en/floater_media_browser.xml b/indra/newview/skins/default/xui/en/floater_media_browser.xml index 70dac7e41c..c02d607586 100644 --- a/indra/newview/skins/default/xui/en/floater_media_browser.xml +++ b/indra/newview/skins/default/xui/en/floater_media_browser.xml @@ -182,7 +182,7 @@ </button> </layout_panel> <layout_panel - height="20" + height="40" layout="topleft" left_delta="0" name="external_controls" @@ -190,7 +190,7 @@ user_resize="false" width="540"> <web_browser - bottom="-10" + bottom="-30" follows="left|right|top|bottom" layout="topleft" left="0" @@ -206,9 +206,9 @@ name="open_browser" top_pad="5" width="185"> - <button.commit_callback - function="MediaBrowser.OpenWebBrowser" /> - </button> + <button.commit_callback + function="MediaBrowser.OpenWebBrowser" /> + </button> <check_box control_name="UseExternalBrowser" follows="bottom|left" diff --git a/indra/newview/skins/default/xui/en/floater_moveview.xml b/indra/newview/skins/default/xui/en/floater_moveview.xml index 0bdcbf30df..6f29255a6b 100644 --- a/indra/newview/skins/default/xui/en/floater_moveview.xml +++ b/indra/newview/skins/default/xui/en/floater_moveview.xml @@ -4,7 +4,6 @@ can_dock="true" can_minimize="true" can_close="false" - center_horiz="true" follows="bottom" height="110" layout="topleft" @@ -12,7 +11,8 @@ help_topic="move_floater" save_rect="true" save_visibility="true" - width="115"> + save_dock_state="true" + width="133"> <string name="walk_forward_tooltip"> Walk Forward (press Up Arrow or W) @@ -22,6 +22,14 @@ Walk Backwards (press Down Arrow or S) </string> <string + name="walk_left_tooltip"> + Walk left (press Shift + Left Arrow or A) + </string> + <string + name="walk_right_tooltip"> + Walk right (press Shift + Right Arrow or D) + </string> + <string name="run_forward_tooltip"> Run Forward (press Up Arrow or W) </string> @@ -30,6 +38,14 @@ Run Backwards (press Down Arrow or S) </string> <string + name="run_left_tooltip"> + Run left (press Shift + Left Arrow or A) + </string> + <string + name="run_right_tooltip"> + Run right (press Shift + Right Arrow or D) + </string> + <string name="fly_forward_tooltip"> Fly Forward (press Up Arrow or W) </string> @@ -37,6 +53,42 @@ name="fly_back_tooltip"> Fly Backwards (press Down Arrow or S) </string> + <string + name="fly_left_tooltip"> + Fly left (press Shift + Left Arrow or A) + </string> + <string + name="fly_right_tooltip"> + Fly right (press Shift + Right Arrow or D) + </string> + <string + name="fly_up_tooltip"> + Fly up (press E) + </string> + <string + name="fly_down_tooltip"> + Fly down (press C) + </string> + <string + name="jump_tooltip"> + Jump (press E) + </string> + <string + name="crouch_tooltip"> + Crouch (press C) + </string> + <string + name="walk_title"> + Walk + </string> + <string + name="run_title"> + Run + </string> + <string + name="fly_title"> + Fly + </string> <panel border="false" height="83" @@ -46,76 +98,82 @@ mouse_opaque="false" name="panel_actions" top="0" - width="115"> + width="133"> + <!-- Buttons in panel are organized in 3 columns to enable their easy vertical adjustment via top_pad--> + <!-- Left column --> <button follows="left|bottom" - height="25" + height="24" image_selected="Movement_TurnLeft_On" image_pressed_selected="Movement_TurnLeft_On" image_unselected="Movement_TurnLeft_Off" layout="topleft" - left="17" + left="30" name="turn left btn" scale_image="false" tool_tip="Turn left (press Left Arrow or A)" - top="45" - width="25" /> + top="34" + width="24" /> + <joystick_slide + follows="left|bottom" + height="10" + image_selected="Movement_Left_On" + image_pressed_selected="Movement_Left_On" + image_unselected="Movement_Left_Off" + layout="topleft" + left_delta="4" + name="move left btn" + quadrant="left" + scale_image="false" + tool_tip="Walk left (press Shift + Left Arrow or A)" + top_pad="10" + width="19" /> + <!-- Right column --> <button follows="left|bottom" - height="25" + height="24" image_selected="Movement_TurnRight_On" image_pressed_selected="Movement_TurnRight_On" image_unselected="Movement_TurnRight_Off" layout="topleft" - left_pad="34" + right="-30" name="turn right btn" scale_image="false" tool_tip="Turn right (press Right Arrow or D)" - top_delta="0" - width="25" /> - <button - follows="left|bottom" - height="25" - image_selected="Movement_Up_On" - image_pressed_selected="Movement_Up_On" - image_unselected="Movement_Up_Off" - layout="topleft" - left="10" - name="move up btn" - scale_image="false" - tool_tip="Fly up, press "E"" - top="14" - width="25" /> - <button + top="34" + width="24" /> + <joystick_slide follows="left|bottom" - height="25" - image_selected="Movement_Down_On" - image_pressed_selected="Movement_Down_On" - image_unselected="Movement_Down_Off" + height="10" + image_selected="Movement_Right_On" + image_pressed_selected="Movement_Right_On" + image_unselected="Movement_Right_Off" layout="topleft" - left_pad="45" - name="move down btn" + name="move right btn" + quadrant="right" + right_delta="4" scale_image="false" - tool_tip="Fly down, press "C"" - top_delta="0" - width="20" /> + tool_tip="Walk right (press Shift + Right Arrow or D)" + top_pad="10" + width="19" /> + <!-- Middle column --> <joystick_turn follows="left|bottom" - height="25" + height="24" image_selected="Movement_Forward_On" image_pressed_selected="Movement_Forward_On" image_unselected="Movement_Forward_Off" layout="topleft" - left="46" + left="54" name="forward btn" quadrant="up" scale_image="false" tool_tip="Walk forward (press up arrow or W)" - top_delta="10" - width="21" /> + top="20" + width="24" /> <joystick_turn follows="left|bottom" - height="25" + height="24" image_selected="Movement_Backward_On" image_pressed_selected="Movement_Backward_On" image_unselected="Movement_Backward_Off" @@ -125,8 +183,35 @@ quadrant="down" scale_image="false" tool_tip="Walk backward (press down arrow or S)" - top_delta="30" - width="21" /> + top_pad="5" + width="24" /> + <!-- Fly up/down (jump/crouch) buttons --> + <button + follows="left|bottom" + height="19" + image_selected="Movement_Up_On" + image_pressed_selected="Movement_Up_On" + image_unselected="Movement_Up_Off" + layout="topleft" + right="-11" + name="move up btn" + scale_image="false" + tool_tip="Fly up (press E)" + top="22" + width="10" /> + <button + follows="left|bottom" + height="19" + image_selected="Movement_Down_On" + image_pressed_selected="Movement_Down_On" + image_unselected="Movement_Down_Off" + layout="topleft" + right_delta="0" + name="move down btn" + scale_image="false" + tool_tip="Fly down (press C)" + top_pad="10" + width="10" /> </panel> <!-- Width and height of this panel should be synchronized with panel_stand_stop_flying.xml --> <panel @@ -136,7 +221,7 @@ left="0" name="panel_modes" top_pad="0" - width="115"> + width="133"> <button follows="left|bottom" height="23" @@ -145,7 +230,7 @@ label="" layout="topleft" name="mode_walk_btn" - left="10" + left="20" pad_right="0" tool_tip="Walking mode" top="2" @@ -178,16 +263,5 @@ tool_tip="Flying mode" top="2" width="31" /> - <button - visible="false" - follows="left|bottom" - height="20" - label="Stop Flying" - layout="topleft" - left="0" - name="stop_fly_btn" - tool_tip="Stop flying" - top="2" - width="115" /> </panel> </floater> diff --git a/indra/newview/skins/default/xui/en/floater_nearby_chat.xml b/indra/newview/skins/default/xui/en/floater_nearby_chat.xml index ae686d9ab7..28616d503b 100644 --- a/indra/newview/skins/default/xui/en/floater_nearby_chat.xml +++ b/indra/newview/skins/default/xui/en/floater_nearby_chat.xml @@ -6,7 +6,7 @@ border="false" bg_opaque_image="Window_Foreground" bg_alpha_image="Window_Background" - bg_alpha_color="0 0 0 0" + bg_alpha_image_overlay="DkGray_66" legacy_header_height="18" can_minimize="true" can_tear_off="false" diff --git a/indra/newview/skins/default/xui/en/floater_outfit_save_as.xml b/indra/newview/skins/default/xui/en/floater_outfit_save_as.xml index 16079b30cb..1d73d516d0 100644 --- a/indra/newview/skins/default/xui/en/floater_outfit_save_as.xml +++ b/indra/newview/skins/default/xui/en/floater_outfit_save_as.xml @@ -4,6 +4,7 @@ can_minimize="false" height="100" layout="topleft" + title="Save Outfit" name="modal container" width="240"> <button @@ -44,7 +45,6 @@ as a new Outfit: border_style="line" border_thickness="1" follows="left|top" - handle_edit_keys_directly="true" height="23" layout="topleft" left_delta="0" diff --git a/indra/newview/skins/default/xui/en/floater_outgoing_call.xml b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml index eb772cc0bd..9db6568ee3 100644 --- a/indra/newview/skins/default/xui/en/floater_outgoing_call.xml +++ b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml @@ -89,18 +89,29 @@ No Answer. Please try again later. top="27" width="315" word_wrap="true"> - You have been disconnected from [VOICE_CHANNEL_NAME]. You will now be reconnected to Nearby Voice Chat. + You have been disconnected from [VOICE_CHANNEL_NAME]. [RECONNECT_NEARBY] </text> <text font="SansSerifLarge" height="40" layout="topleft" left="77" - name="nearby_P2P" + name="nearby_P2P_by_other" top="27" width="315" word_wrap="true"> - [VOICE_CHANNEL_NAME] has ended the call. You will now be reconnected to Nearby Voice Chat. + Your call has ended. [RECONNECT_NEARBY] + </text> + <text + font="SansSerifLarge" + height="40" + layout="topleft" + left="77" + name="nearby_P2P_by_agent" + top="27" + width="315" + word_wrap="true"> + You have ended the call. [RECONNECT_NEARBY] </text> <text font="SansSerif" @@ -108,7 +119,7 @@ No Answer. Please try again later. layout="topleft" left="77" name="leaving" - top="52" + top="62" width="315" word_wrap="true"> Leaving [CURRENT_CHAT]. diff --git a/indra/newview/skins/default/xui/en/floater_perm_prefs.xml b/indra/newview/skins/default/xui/en/floater_perm_prefs.xml index 4909b8988f..ff454e3ebf 100644 --- a/indra/newview/skins/default/xui/en/floater_perm_prefs.xml +++ b/indra/newview/skins/default/xui/en/floater_perm_prefs.xml @@ -44,7 +44,7 @@ left_delta="0" name="NextOwnerLabel" top_pad="5" - width="150"> + width="200"> Next owner can: </text> <check_box diff --git a/indra/newview/skins/default/xui/en/floater_postcard.xml b/indra/newview/skins/default/xui/en/floater_postcard.xml index 3a7b6cc832..6f78363b25 100644 --- a/indra/newview/skins/default/xui/en/floater_postcard.xml +++ b/indra/newview/skins/default/xui/en/floater_postcard.xml @@ -128,19 +128,9 @@ width="420"> Type your message here. </text_editor> - <text - type="string" - length="1" - bottom_delta="37" - follows="left|bottom" - layout="topleft" - left="12" - name="fine_print"> - If your recipient joins SL, you'll get a referral bonus. - </text> <button follows="right|bottom" - height="20" + height="23" label="Cancel" layout="topleft" name="cancel_btn" @@ -149,7 +139,7 @@ width="100" /> <button follows="right|bottom" - height="20" + height="23" label="Send" layout="topleft" left_delta="-106" diff --git a/indra/newview/skins/default/xui/en/floater_preferences.xml b/indra/newview/skins/default/xui/en/floater_preferences.xml index 05deca705a..50d0011338 100644 --- a/indra/newview/skins/default/xui/en/floater_preferences.xml +++ b/indra/newview/skins/default/xui/en/floater_preferences.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <floater legacy_header_height="18" - center_horiz="true" - center_vert="true" + open_centered="true" default_tab_group="1" height="460" layout="topleft" @@ -10,7 +9,7 @@ help_topic="preferences" single_instance="true" title="PREFERENCES" - width="620"> + width="658"> <button follows="right|bottom" height="23" @@ -39,6 +38,7 @@ </button> <tab_container follows="all" + halign="left" height="410" layout="topleft" left="0" @@ -46,8 +46,9 @@ tab_group="1" tab_position="left" tab_width="115" + tab_padding_right="0" top="21" - width="620"> + width="658"> <panel class="panel_preference" filename="panel_preferences_general.xml" @@ -72,7 +73,7 @@ <panel class="panel_preference" filename="panel_preferences_sound.xml" - label="Sound" + label="Sound & Media" layout="topleft" help_topic="preferences_audio_tab" name="audio" /> diff --git a/indra/newview/skins/default/xui/en/floater_preview_gesture.xml b/indra/newview/skins/default/xui/en/floater_preview_gesture.xml index 3dc546aee3..6281bc5272 100644 --- a/indra/newview/skins/default/xui/en/floater_preview_gesture.xml +++ b/indra/newview/skins/default/xui/en/floater_preview_gesture.xml @@ -39,28 +39,6 @@ name="Title"> Gesture: [NAME] </floater.string> - <text - type="string" - length="1" - follows="top|left" - font="SansSerifSmall" - height="10" - layout="topleft" - left="10" - name="name_text" - top="20" - font.style="BOLD" - width="100"> - Name: - </text> - <line_editor - follows="left|top" - height="20" - layout="topleft" - left_delta="84" - name="name" - top_delta="-4" - width="180" /> <text type="string" length="1" @@ -70,7 +48,7 @@ layout="topleft" left="10" name="desc_label" - top_pad="10" + top_pad="25" font.style="BOLD" width="100"> Description: @@ -79,10 +57,10 @@ follows="left|top" height="20" layout="topleft" - left_delta="84" + left_delta="89" name="desc" top_delta="-4" - width="180" /> + width="175" /> <text type="string" length="1" @@ -101,11 +79,11 @@ follows="left|top" height="20" layout="topleft" - left_delta="84" + left_delta="89" max_length="31" name="trigger_editor" top_delta="-4" - width="180" /> + width="175" /> <text type="string" length="1" @@ -125,12 +103,12 @@ follows="left|top" height="20" layout="topleft" - left_delta="84" + left_delta="89" max_length="31" name="replace_editor" tool_tip="Replace the trigger word(s) with these words. For example, trigger 'hello' replace with 'howdy' will turn the chat 'I wanted to say hello' into 'I wanted to say howdy' as well as playing the gesture" top_delta="-4" - width="180" /> + width="175" /> <text type="string" length="1" @@ -149,7 +127,7 @@ height="20" label="None" layout="topleft" - left_delta="84" + left_delta="89" name="modifier_combo" top_delta="-4" width="75" /> @@ -171,7 +149,7 @@ left="10" font.style="BOLD" name="library_label" - top="135" + top_delta="25" width="100"> Library: </text> @@ -181,7 +159,7 @@ layout="topleft" left="10" name="library_list" - top="150" + top_delta="15" width="180"> <scroll_list.rows value="Animation" /> @@ -199,7 +177,7 @@ layout="topleft" left_pad="10" name="add_btn" - top_delta="0" + top_delta="-1" width="70" /> <text type="string" @@ -230,7 +208,7 @@ layout="topleft" left_pad="10" name="up_btn" - top_delta="0" + top_delta="-1" width="70" /> <button follows="top|left" @@ -256,23 +234,25 @@ layout="topleft" left="15" name="options_text" - top="330" - width="205" /> + top="315" + width="205"> + (options) + </text> <combo_box follows="top|left" height="20" layout="topleft" left_delta="15" name="animation_list" - top="345" - width="100" /> + top="330" + width="100"/> <combo_box follows="top|left" height="20" layout="topleft" left_delta="0" name="sound_list" - top_delta="0" + top="330" width="100" /> <line_editor follows="top|left" @@ -281,7 +261,7 @@ left_delta="0" max_length="127" name="chat_editor" - top_delta="0" + top="330" width="100" /> <radio_group draw_border="false" @@ -290,7 +270,7 @@ layout="topleft" left_pad="8" name="animation_trigger_type" - top_delta="0" + top="330" width="80"> <radio_item height="16" @@ -298,7 +278,7 @@ layout="topleft" left="3" name="start" - top="-11" + top_delta="45" width="80" /> <radio_item height="16" @@ -306,7 +286,7 @@ layout="topleft" left_delta="0" name="stop" - top_pad="10" + top_pad="3" width="80" /> </radio_group> <check_box @@ -314,14 +294,14 @@ height="20" label="until animations are done" layout="topleft" - left="16" + left="28" name="wait_anim_check" - top="340" + top="330" width="100" /> <check_box follows="top|left" height="20" - label="time in seconds" + label="time in seconds:" layout="topleft" left_delta="0" name="wait_time_check" @@ -331,10 +311,10 @@ follows="top|left" height="20" layout="topleft" - left_pad="5" + left_pad="10" max_length="15" name="wait_time_editor" - top_delta="0" + top_delta="1" width="50" /> <text type="string" diff --git a/indra/newview/skins/default/xui/en/floater_preview_notecard.xml b/indra/newview/skins/default/xui/en/floater_preview_notecard.xml index ead5b8c8f2..0e8eef2a21 100644 --- a/indra/newview/skins/default/xui/en/floater_preview_notecard.xml +++ b/indra/newview/skins/default/xui/en/floater_preview_notecard.xml @@ -25,10 +25,6 @@ name="Title"> Notecard: [NAME] </floater.string> - <floater.string - name="Save"> - Save - </floater.string> <icon follows="top|right" height="18" @@ -76,7 +72,6 @@ max_length="65536" name="Notecard Editor" allow_html="false" - handle_edit_keys_directly="true" tab_group="1" top="46" width="392" @@ -89,8 +84,18 @@ label="Save" label_selected="Save" layout="topleft" - left="288" + left="178" name="Save" top="332" width="100" /> + <button + follows="right|bottom" + height="22" + label="Delete" + label_selected="Delete" + layout="topleft" + left="288" + name="Delete" + top="332" + width="100" /> </floater> diff --git a/indra/newview/skins/default/xui/en/floater_preview_texture.xml b/indra/newview/skins/default/xui/en/floater_preview_texture.xml index fc6f06ffd4..7fd7eab867 100644 --- a/indra/newview/skins/default/xui/en/floater_preview_texture.xml +++ b/indra/newview/skins/default/xui/en/floater_preview_texture.xml @@ -118,7 +118,7 @@ <button follows="right|bottom" height="22" - label="Cancel" + label="Discard" layout="topleft" left_pad="5" name="Discard" diff --git a/indra/newview/skins/default/xui/en/floater_publish_classified.xml b/indra/newview/skins/default/xui/en/floater_publish_classified.xml new file mode 100644 index 0000000000..3225843d09 --- /dev/null +++ b/indra/newview/skins/default/xui/en/floater_publish_classified.xml @@ -0,0 +1,82 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<floater + legacy_header_height="18" + can_minimize="false" + height="200" + layout="topleft" + name="publish_classified" + help_topic="price_for_listing" + title="Publishing Classified" + width="320"> + <text + top="20" + follows="top|left" + font="SansSerif" + height="60" + layout="topleft" + left="15" + word_wrap="true" + name="explanation_text"> + +Your classified ad will run for one week from the date it is published. + +Remember, Classified fees are non-refundable. + + </text> + <spinner + decimal_digits="0" + follows="left|top" + halign="left" + height="23" + increment="1" + label_width="70" + label="Price for Ad: " + v_pad="10" + layout="topleft" + left="15" + value="50" + min_val="50" + max_val="99999" + name="price_for_listing" + top_pad="10" + tool_tip="Price for listing." + width="150" /> + <text + follows="top|left" + font="SansSerif" + height="60" + layout="topleft" + left_pad="5" + top_delta="0" + word_wrap="true" + value="L$" + name="l$_text" /> + <text + follows="top|right" + font="SansSerif" + height="20" + layout="topleft" + left="15" + name="more_info_text" + top_pad="-20" + width="300"> +More info (link to classified help) + </text> + <button + follows="top|left" + height="22" + label="Publish" + layout="topleft" + left="105" + name="publish_btn" + top="160" + width="100" /> + <button + follows="top|left" + height="22" + label="Cancel" + layout="topleft" + left_pad="5" + name="cancel_btn" + width="100" /> +</floater> diff --git a/indra/newview/skins/default/xui/en/floater_region_info.xml b/indra/newview/skins/default/xui/en/floater_region_info.xml index 262bcd07a0..32fb6f97e7 100644 --- a/indra/newview/skins/default/xui/en/floater_region_info.xml +++ b/indra/newview/skins/default/xui/en/floater_region_info.xml @@ -7,7 +7,7 @@ name="regioninfo" save_rect="true" title="REGION/ESTATE" - width="480"> + width="530"> <tab_container bottom="555" follows="left|right|top|bottom" diff --git a/indra/newview/skins/default/xui/en/floater_report_abuse.xml b/indra/newview/skins/default/xui/en/floater_report_abuse.xml index ac0fca9cce..21c0bfef48 100644 --- a/indra/newview/skins/default/xui/en/floater_report_abuse.xml +++ b/indra/newview/skins/default/xui/en/floater_report_abuse.xml @@ -456,7 +456,7 @@ layout="topleft" left_delta="0" name="dscr_title" - top_pad="5" + top_pad="6" width="50"> Details: </text> @@ -464,11 +464,12 @@ type="string" length="1" follows="left|top" - height="16" + height="22" layout="topleft" name="bug_aviso" left_pad="10" - width="200"> + word_wrap="true" + width="270"> Please be as specific as possible </text> <text_editor diff --git a/indra/newview/skins/default/xui/en/floater_script.xml b/indra/newview/skins/default/xui/en/floater_script.xml index c3e974d978..12ade86b5f 100644 --- a/indra/newview/skins/default/xui/en/floater_script.xml +++ b/indra/newview/skins/default/xui/en/floater_script.xml @@ -3,16 +3,16 @@ legacy_header_height="18" background_visible="true" follows="left|top|right|bottom" - height="369" + height="250" layout="topleft" left="0" name="script_floater" top="0" can_dock="true" can_minimize="true" - visible="true" - width="520" - can_resize="true" + visible="false" + width="350" + can_resize="false" min_width="350" - min_height="369"> + min_height="200"> </floater> diff --git a/indra/newview/skins/default/xui/en/floater_script_debug_panel.xml b/indra/newview/skins/default/xui/en/floater_script_debug_panel.xml index bd9925be1d..d1db5c17ba 100644 --- a/indra/newview/skins/default/xui/en/floater_script_debug_panel.xml +++ b/indra/newview/skins/default/xui/en/floater_script_debug_panel.xml @@ -15,9 +15,10 @@ follows="left|top|right|bottom" height="176" layout="topleft" - max_length="10000" + max_length="2147483647" name="Chat History Editor" parse_highlights="true" + read_only="true" width="420" word_wrap="true" /> </floater> diff --git a/indra/newview/skins/default/xui/en/floater_search.xml b/indra/newview/skins/default/xui/en/floater_search.xml index 775e7d66f7..49b3b58113 100644 --- a/indra/newview/skins/default/xui/en/floater_search.xml +++ b/indra/newview/skins/default/xui/en/floater_search.xml @@ -2,16 +2,17 @@ <floater legacy_header_height="13" can_resize="true" - height="546" + height="600" layout="topleft" - min_height="546" - min_width="670" + min_height="400" + min_width="450" name="floater_search" help_topic="floater_search" save_rect="true" + save_visibility="true" single_instance="true" title="FIND" - width="670"> + width="650"> <floater.string name="loading_text"> Loading... @@ -21,20 +22,20 @@ Done </floater.string> <layout_stack - bottom="541" + bottom="595" follows="left|right|top|bottom" layout="topleft" left="10" name="stack1" top="20" - width="650"> + width="630"> <layout_panel layout="topleft" left_delta="0" top_delta="0" name="browser_layout" user_resize="false" - width="650"> + width="630"> <web_browser bottom="-10" follows="left|right|top|bottom" @@ -42,8 +43,8 @@ left="0" name="browser" top="0" - height="500" - width="650" /> + height="555" + width="630" /> <text follows="bottom|left" height="16" diff --git a/indra/newview/skins/default/xui/en/floater_sell_land.xml b/indra/newview/skins/default/xui/en/floater_sell_land.xml index afc44c41b8..4cae42bcfe 100644 --- a/indra/newview/skins/default/xui/en/floater_sell_land.xml +++ b/indra/newview/skins/default/xui/en/floater_sell_land.xml @@ -203,13 +203,13 @@ name="none" visible="false" /> <radio_item - bottom="20" + top_pad="10" height="16" label="No, keep ownership of objects" left="10" name="no" /> <radio_item - bottom="40" + top_pad="10" height="16" label="Yes, sell objects with land" left="10" diff --git a/indra/newview/skins/default/xui/en/floater_snapshot.xml b/indra/newview/skins/default/xui/en/floater_snapshot.xml index 2c9402f6cb..452b2ac664 100644 --- a/indra/newview/skins/default/xui/en/floater_snapshot.xml +++ b/indra/newview/skins/default/xui/en/floater_snapshot.xml @@ -11,7 +11,11 @@ save_rect="true" save_visibility="true" title="SNAPSHOT PREVIEW" - width="215"> + width="215"> + <floater.string + name="share_to_web_url" translate="false"> +http://pdp36.lindenlab.com:12777/ + </floater.string> <floater.string name="unknown"> unknown @@ -45,7 +49,7 @@ </radio_group> <ui_ctrl height="90" - width="90" + width="125" layout="topleft" name="thumbnail_placeholder" top_pad="6" @@ -105,9 +109,11 @@ width="100"> <flyout_button.item label="Save" + name="save_item" value="save" /> <flyout_button.item label="Save As..." + name="saveas_item" value="save as" /> </flyout_button> <button @@ -147,7 +153,7 @@ left="10" name="type_label2" top_pad="5" - width="120"> + width="127"> Size </text> <text @@ -197,7 +203,7 @@ left_delta="0" name="texture_size_combo" top_delta="0" - width="120"> + width="127"> <combo_box.item label="Current Window" name="CurrentWindow" @@ -226,7 +232,7 @@ left_delta="0" name="local_size_combo" top_delta="0" - width="120"> + width="127"> <combo_box.item label="Current Window" name="CurrentWindow" @@ -354,10 +360,6 @@ label="Depth" name="Depth" value="depth" /> - <combo_box.item - label="Object Mattes" - name="ObjectMattes" - value="objects" /> </combo_box> <check_box label="Interface" diff --git a/indra/newview/skins/default/xui/en/floater_test_inspectors.xml b/indra/newview/skins/default/xui/en/floater_test_inspectors.xml index 0f5c5f2be0..209285da2e 100644 --- a/indra/newview/skins/default/xui/en/floater_test_inspectors.xml +++ b/indra/newview/skins/default/xui/en/floater_test_inspectors.xml @@ -116,10 +116,10 @@ follows="left|top" font="SansSerif" height="20" - left="0" + left="10" max_length="65536" name="slurl" - top_pad="4" + top_pad="20" width="150"> secondlife:///app/agent/00000000-0000-0000-0000-000000000000/inspect </text> @@ -127,12 +127,11 @@ follows="left|top" font="SansSerif" height="20" - left="0" + left="10" max_length="65536" name="slurl_group" - top_pad="4" + top_pad="20" width="150"> secondlife:///app/group/00000000-0000-0000-0000-000000000000/inspect </text> - </floater> diff --git a/indra/newview/skins/default/xui/en/floater_test_text_editor.xml b/indra/newview/skins/default/xui/en/floater_test_text_editor.xml index dc8f00d5f3..548e24efba 100644 --- a/indra/newview/skins/default/xui/en/floater_test_text_editor.xml +++ b/indra/newview/skins/default/xui/en/floater_test_text_editor.xml @@ -14,6 +14,7 @@ name="test_text_editor" tool_tip="text editor" top="25" + word_wrap="true" width="200"> Text Editor </text_editor> @@ -28,4 +29,17 @@ width="200"> This contains long text and should scroll horizontally to the right </text_editor> + <text_editor + height="50" + follows="top|left|bottom" + font="SansSerif" + left="10" + name="numeric_text_editor" + tool_tip="text editor for numeric text entry only" + top_pad="10" + text_type="int" + width="200"> + This is text that is NOT a number, so shouldn't appear + </text_editor> + </floater> diff --git a/indra/newview/skins/default/xui/en/floater_test_widgets.xml b/indra/newview/skins/default/xui/en/floater_test_widgets.xml index 447bd7f599..fb583114c0 100644 --- a/indra/newview/skins/default/xui/en/floater_test_widgets.xml +++ b/indra/newview/skins/default/xui/en/floater_test_widgets.xml @@ -49,13 +49,10 @@ name="test_menu_bar" top="16"> <menu - height="16" label="Menu" layout="topleft" tear_off="true" - left="0" name="Menu" - top="-32" width="128"> <!-- menu_item_call will trigger a function call in the C++ code --> <menu_item_call @@ -88,7 +85,6 @@ <!-- First column --> <button - height="20" follows="top|left" label="Button" layout="topleft" @@ -100,7 +96,6 @@ <!-- "flyout_button" is a button that can spawn a menu --> <flyout_button follows="top|left" - height="20" label="Flyout" layout="topleft" left_delta="0" @@ -136,7 +131,6 @@ <combo_box bottom_delta="35" follows="top|left" - height="16" width="150" label="Combobox" layout="topleft" @@ -343,12 +337,10 @@ line to actually fit <tab_container follows="all" height="400" - halign="center" layout="topleft" left="525" name="group_tab_container" tab_position="top" - tab_height="20" tool_tip="tab container" top="80" width="300"> diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml index 5630dfbe8f..efc1a66d95 100644 --- a/indra/newview/skins/default/xui/en/floater_tools.xml +++ b/indra/newview/skins/default/xui/en/floater_tools.xml @@ -2,7 +2,7 @@ <floater legacy_header_height="18" follows="left|top|right" - height="570" + height="580" layout="topleft" bg_opaque_image="Window_NoTitle_Foreground" bg_alpha_image="Window_NoTitle_Background" @@ -11,8 +11,9 @@ save_rect="true" short_title="BUILD TOOLS" single_instance="true" + save_visibility="true" sound_flags="0" - width="280"> + width="295"> <floater.string name="status_rotate"> Drag colored bands to rotate object @@ -67,80 +68,75 @@ </floater.string> <button follows="left|top" - height="20" - image_disabled="Tool_Zoom" - image_disabled_selected="Tool_Zoom" - image_selected="Tool_Zoom_Selected" - image_unselected="Tool_Zoom" + height="25" + image_bottom_pad="1" + image_overlay="Tool_Zoom" + image_selected="PushButton_Selected_Press" layout="topleft" left="10" name="button focus" tool_tip="Focus" - width="20"> + width="35"> <button.commit_callback function="BuildTool.setTool" parameter="Focus" /> </button> <button follows="left|top" - height="20" - image_disabled="Tool_Grab" - image_disabled_selected="Tool_Grab" - image_selected="Tool_Grab_Selected" - image_unselected="Tool_Grab" + height="25" + image_bottom_pad="1" + image_overlay="Tool_Grab" + image_selected="PushButton_Selected_Press" layout="topleft" - left_pad="20" + left_pad="10" name="button move" tool_tip="Move" - width="20"> + width="35"> <button.commit_callback function="BuildTool.setTool" parameter="Move" /> </button> <button follows="left|top" - height="20" - image_disabled="Tool_Face" - image_disabled_selected="Tool_Face" - image_selected="Tool_Face_Selected" - image_unselected="Tool_Face" + height="25" + image_bottom_pad="1" + image_overlay="Tool_Face" + image_selected="PushButton_Selected_Press" layout="topleft" - left_pad="20" + left_pad="10" name="button edit" tool_tip="Edit" - width="20"> + width="35"> <button.commit_callback function="BuildTool.setTool" parameter="Edit" /> </button> <button follows="left|top" - height="20" - image_disabled="Tool_Create" - image_disabled_selected="Tool_Create" - image_selected="Tool_Create_Selected" - image_unselected="Tool_Create" + height="25" + image_bottom_pad="1" + image_overlay="Tool_Create" + image_selected="PushButton_Selected_Press" layout="topleft" - left_pad="20" + left_pad="10" name="button create" tool_tip="Create" - width="20"> + width="35"> <button.commit_callback function="BuildTool.setTool" parameter="Create" /> </button> <button follows="left|top" - height="20" - image_disabled="Tool_Dozer" - image_disabled_selected="Tool_Dozer" - image_selected="Tool_Dozer_Selected" - image_unselected="Tool_Dozer" + height="25" + image_bottom_pad="1" + image_overlay="Tool_Dozer" + image_selected="PushButton_Selected_Press" layout="topleft" - left_pad="20" + left_pad="10" name="button land" tool_tip="Land" - width="20"> + width="35"> <button.commit_callback function="BuildTool.setTool" parameter="Land" /> @@ -157,7 +153,7 @@ left="8" name="text status" top_pad="3" - width="275"> + width="285"> Drag to move, shift-drag to copy </text> <radio_group @@ -224,8 +220,8 @@ </radio_group> <radio_group follows="left|top" - left="10" - top="54" + left="5" + top="59" height="70" layout="topleft" name="edit_radio_group"> @@ -254,11 +250,12 @@ <check_box left="10" follows="left|top" - height="16" + height="28" control_name="EditLinkedParts" label="Edit linked" - layout="topleft" - name="checkbox edit linked parts" > + layout="topleft" + name="checkbox edit linked parts" + top_pad="0"> <check_box.commit_callback function="BuildTool.selectComponent"/> </check_box> @@ -270,7 +267,7 @@ left="13" name="RenderingCost" tool_tip="Shows the rendering cost calculated for this object" - top_pad="9" + top_pad="2" type="string" width="100"> þ: [COUNT] @@ -278,24 +275,35 @@ <check_box control_name="ScaleUniform" height="19" - label="Stretch Both Sides" + label="" layout="topleft" left="143" name="checkbox uniform" top="50" - width="134" /> + width="20" /> + <text + height="19" + label="Stretch Both Sides" + left="163" + name="checkbox uniform label" + top="55" + width="120" + wrap="true"> + Stretch Both Sides + </text> <check_box control_name="ScaleStretchTextures" height="19" initial_value="true" label="Stretch Textures" layout="topleft" + left="143" name="checkbox stretch textures" - top_pad="0" + top_pad="7" width="134" /> <check_box control_name="SnapEnabled" - height="20" + height="18" initial_value="true" label="Snap to grid" layout="topleft" @@ -308,6 +316,7 @@ follows="left|top" name="combobox grid mode" tool_tip="Choose the type of grid ruler for positioning the object" + top_pad="0" width="108"> <combo_box.item label="World grid" @@ -335,7 +344,7 @@ top_delta="0" right="-10" width="18" - height="19" > + height="23" > <button.commit_callback function="BuildTool.gridOptions"/> </button> @@ -347,7 +356,7 @@ image_selected="Object_Cube_Selected" image_unselected="Object_Cube" layout="topleft" - left="4" + left="10" name="ToolCube" tool_tip="Cube" top="51" @@ -360,7 +369,7 @@ image_selected="Object_Prism_Selected" image_unselected="Object_Prism" layout="topleft" - left_delta="26" + left_delta="29" name="ToolPrism" tool_tip="Prism" top_delta="0" @@ -373,7 +382,7 @@ image_selected="Object_Pyramid_Selected" image_unselected="Object_Pyramid" layout="topleft" - left_delta="26" + left_delta="29" name="ToolPyramid" tool_tip="Pyramid" top_delta="0" @@ -386,7 +395,7 @@ image_selected="Object_Tetrahedron_Selected" image_unselected="Object_Tetrahedron" layout="topleft" - left_delta="26" + left_delta="29" name="ToolTetrahedron" tool_tip="Tetrahedron" top_delta="0" @@ -399,7 +408,7 @@ image_selected="Object_Cylinder_Selected" image_unselected="Object_Cylinder" layout="topleft" - left_delta="26" + left_delta="29" name="ToolCylinder" tool_tip="Cylinder" top_delta="0" @@ -412,7 +421,7 @@ image_selected="Object_Hemi_Cylinder_Selected" image_unselected="Object_Hemi_Cylinder" layout="topleft" - left_delta="26" + left_delta="29" name="ToolHemiCylinder" tool_tip="Hemicylinder" top_delta="0" @@ -425,7 +434,7 @@ image_selected="Object_Cone_Selected" image_unselected="Object_Cone" layout="topleft" - left_delta="26" + left_delta="29" name="ToolCone" tool_tip="Cone" top_delta="0" @@ -438,7 +447,7 @@ image_selected="Object_Hemi_Cone_Selected" image_unselected="Object_Hemi_Cone" layout="topleft" - left_delta="26" + left_delta="29" name="ToolHemiCone" tool_tip="Hemicone" top_delta="0" @@ -451,7 +460,7 @@ image_selected="Object_Sphere_Selected" image_unselected="Object_Sphere" layout="topleft" - left_delta="26" + left_delta="29" name="ToolSphere" tool_tip="Sphere" top_delta="0" @@ -464,7 +473,7 @@ image_selected="Object_Hemi_Sphere_Selected" image_unselected="Object_Hemi_Sphere" layout="topleft" - left_delta="26" + left_delta="29" name="ToolHemiSphere" tool_tip="Hemisphere" top_delta="0" @@ -477,7 +486,7 @@ image_selected="Object_Torus_Selected" image_unselected="Object_Torus" layout="topleft" - left="4" + left="10" name="ToolTorus" tool_tip="Torus" top="77" @@ -490,7 +499,7 @@ image_selected="Object_Tube_Selected" image_unselected="Object_Tube" layout="topleft" - left_delta="26" + left_delta="29" name="ToolTube" tool_tip="Tube" top_delta="0" @@ -503,7 +512,7 @@ image_selected="Object_Ring_Selected" image_unselected="Object_Ring" layout="topleft" - left_delta="26" + left_delta="29" name="ToolRing" tool_tip="Ring" top_delta="0" @@ -516,7 +525,7 @@ image_selected="Object_Tree_Selected" image_unselected="Object_Tree" layout="topleft" - left_delta="26" + left_delta="29" name="ToolTree" tool_tip="Tree" top_delta="0" @@ -530,7 +539,7 @@ image_unselected="Object_Grass" image_overlay_color="Red" layout="topleft" - left_delta="26" + left_delta="29" name="ToolGrass" tool_tip="Grass" top_delta="0" @@ -585,8 +594,8 @@ layout="topleft" left="0" name="radio select land" - top="-1" - width="114" /> + top="-106" + width="134" /> <radio_item height="19" label="Flatten" @@ -644,7 +653,7 @@ follows="left|top" height="12" layout="topleft" - left="125" + left="135" name="Bulldozer:" top="57" width="100"> @@ -702,7 +711,7 @@ </slider_bar> <button follows="left|top" - height="19" + height="23" label="Apply" label_selected="Apply" top_pad="5" @@ -710,7 +719,7 @@ left="135" name="button apply to selection" tool_tip="Modify selected land" - width="78"> + width="82"> <button.commit_callback function="BuildTool.applyToSelection"/> </button> @@ -718,13 +727,13 @@ text_color="LtGray_50" type="string" length="1" - height="12" + height="10" follows="left|top" halign="right" layout="topleft" right="-10" name="obj_count" - top_pad="6" + top_pad="5" width="143"> Objects: [COUNT] </text> @@ -742,16 +751,16 @@ </text> <tab_container follows="left|top" - height="400" + height="410" halign="center" left="0" name="Object Info Tabs" - tab_max_width="54" + tab_max_width="100" tab_min_width="40" tab_position="top" tab_height="25" top="170" - width="280"> + width="295"> <panel border="false" follows="all" @@ -761,8 +770,8 @@ help_topic="toolbox_general_tab" name="General" top="16" - width="280"> - <panel.string + width="295"> +<panel.string name="text deed continued"> Deed </panel.string> @@ -927,13 +936,13 @@ width="150" /> <button follows="top|left" - height="20" + height="23" label="Deed" label_selected="Deed" layout="topleft" name="button deed" top_pad="0" - left="100" + left="108" tool_tip="Deeding gives this item away with next owner permissions. Group shared objects can be deeded by a group officer." width="80" /> <check_box @@ -954,12 +963,12 @@ top_pad="15" left="10" name="label click action" - width="90"> + width="98"> Click to: </text> <combo_box follows="left|top" - height="20" + height="23" layout="topleft" name="clickaction" width="168" @@ -990,25 +999,24 @@ value="Zoom" /> </combo_box> <check_box - height="16" - top_pad="15" + height="23" label="For Sale:" layout="topleft" name="checkbox for sale" - left="10" - width="90" /> + left="7" + width="100" /> <!-- NEW SALE TYPE COMBO BOX --> <combo_box left_pad="0" layout="topleft" follows="left|top" allow_text_entry="false" - height="20" + height="23" intial_value="2" max_chars="20" mouse_opaque="true" name="sale type" - width="158"> + width="168"> <combo_box.item name="Copy" label="Copy" @@ -1031,19 +1039,19 @@ even though the user gets a free copy. decimal_digits="0" increment="1" top_pad="8" - left="100" + left="108" control_name="Edit Cost" name="Edit Cost" label="Price: L$" label_width="65" - width="150" + width="165" min_val="0" height="20" max_val="999999999" /> <check_box height="15" width="110" - top_pad="3" + top_pad="5" label="Show in search" layout="topleft" left="100" @@ -1059,8 +1067,8 @@ even though the user gets a free copy. name="perms_build" left="0" top="241" - height="120" - width="278"> + height="130" + width="290"> <text type="string" length="1" @@ -1087,7 +1095,7 @@ even though the user gets a free copy. label="Move" layout="topleft" name="checkbox allow everyone move" - left="15" + left="10" width="85" /> <check_box height="19" @@ -1109,7 +1117,7 @@ even though the user gets a free copy. follows="left|top|right" label="Modify" layout="topleft" - left="15" + left="10" name="checkbox next owner can modify" width="85" /> <check_box @@ -1119,7 +1127,7 @@ even though the user gets a free copy. layout="topleft" left_pad="0" name="checkbox next owner can copy" - width="90" /> + width="80" /> <check_box follows="left|top|right" height="19" @@ -1129,7 +1137,7 @@ even though the user gets a free copy. left_pad="0" top_delta="0" tool_tip="Next owner can give away or resell this object" - width="90" /> + width="100" /> <text type="string" text_color="EmphasisColor" @@ -1140,7 +1148,7 @@ even though the user gets a free copy. left="10" name="B:" height="10" - width="45"> + width="80"> B: </text> <text @@ -1152,7 +1160,7 @@ even though the user gets a free copy. left_pad="0" name="O:" height="10" - width="44"> + width="80"> O: </text> <text @@ -1164,7 +1172,7 @@ even though the user gets a free copy. left_pad="0" name="G:" height="10" - width="43"> + width="80"> G: </text> <text @@ -1172,11 +1180,12 @@ even though the user gets a free copy. text_color="White" length="1" follows="left|top" - left_pad="0" + left="10" + top_pad="2" layout="topleft" name="E:" height="10" - width="43"> + width="80"> E: </text> <text @@ -1188,7 +1197,7 @@ even though the user gets a free copy. left_pad="0" name="N:" height="10" - width="48"> + width="80"> N: </text> <text @@ -1200,7 +1209,7 @@ even though the user gets a free copy. left_pad="0" name="F:" height="10" - width="50"> + width="80"> F: </text> </panel> @@ -1216,7 +1225,7 @@ even though the user gets a free copy. help_topic="toolbox_object_tab" name="Object" top="16" - width="280"> + width="295"> <check_box height="19" label="Locked" @@ -1557,7 +1566,7 @@ even though the user gets a free copy. layout="topleft" left="125" name="text hollow" - top_pad="5" + top_pad="6" width="68"> Hollow </text> @@ -1605,16 +1614,16 @@ even though the user gets a free copy. layout="topleft" left="125" name="Hollow Shape" - top_pad="0" + top_pad="4" width="150"> Hollow Shape </text> <combo_box - height="19" + height="23" layout="topleft" left_delta="0" name="hole" - top_pad="3" + top_pad="-2" width="150"> <combo_box.item label="Default" @@ -1886,7 +1895,7 @@ even though the user gets a free copy. layout="topleft" left="125" name="text radius delta" - top_pad="0" + top_pad="2" width="78"> Radius </text> @@ -2003,7 +2012,6 @@ even though the user gets a free copy. value="Cylinder" /> </combo_box> </panel> - <panel border="false" follows="all" @@ -2015,7 +2023,7 @@ even though the user gets a free copy. help_topic="toolbox_features_tab" name="Features" top_delta="0" - width="280"> + width="295"> <text type="string" length="1" @@ -2055,7 +2063,7 @@ even though the user gets a free copy. increment="1" initial_value="2" label="Softness" - label_width="65" + label_width="70" layout="topleft" left_delta="0" max_val="3" @@ -2068,7 +2076,7 @@ even though the user gets a free copy. increment="0.5" initial_value="0.3" label="Gravity" - label_width="65" + label_width="70" layout="topleft" left_delta="0" max_val="10" @@ -2082,7 +2090,7 @@ even though the user gets a free copy. increment="0.5" initial_value="2" label="Drag" - label_width="65" + label_width="70" layout="topleft" left_delta="0" max_val="10" @@ -2095,7 +2103,7 @@ even though the user gets a free copy. increment="0.5" initial_value="0" label="Wind" - label_width="65" + label_width="70" layout="topleft" left_delta="0" max_val="10" @@ -2108,7 +2116,7 @@ even though the user gets a free copy. increment="0.5" initial_value="1" label="Tension" - label_width="65" + label_width="70" layout="topleft" left_delta="0" max_val="10" @@ -2121,7 +2129,7 @@ even though the user gets a free copy. increment="0.01" initial_value="0" label="Force X" - label_width="65" + label_width="70" layout="topleft" left_delta="0" max_val="10" @@ -2135,7 +2143,7 @@ even though the user gets a free copy. increment="0.01" initial_value="0" label="Force Y" - label_width="65" + label_width="70" layout="topleft" left_delta="0" max_val="10" @@ -2149,7 +2157,7 @@ even though the user gets a free copy. increment="0.01" initial_value="0" label="Force Z" - label_width="65" + label_width="70" layout="topleft" left_delta="0" max_val="10" @@ -2253,7 +2261,7 @@ even though the user gets a free copy. help_topic="toolbox_texture_tab" name="Texture" top_delta="0" - width="280"> + width="295"> <panel.string name="string repeats per meter"> Repeats Per Meter @@ -2317,7 +2325,7 @@ even though the user gets a free copy. layout="topleft" left_delta="0" name="glow label" - top_pad="2" + top_pad="8" width="80"> Glow </text> @@ -2335,7 +2343,7 @@ even though the user gets a free copy. height="19" label="Full Bright" layout="topleft" - left_delta="0" + left_delta="-5" name="checkbox fullbright" top_pad="4" width="81" /> @@ -2348,7 +2356,7 @@ even though the user gets a free copy. left="10" name="tex gen" top_pad="5" - width="85"> + width="90"> Mapping </text> <combo_box @@ -2357,7 +2365,7 @@ even though the user gets a free copy. left_delta="0" name="combobox texgen" top_pad="4" - width="85"> + width="90"> <combo_box.item label="Default" name="Default" @@ -2376,7 +2384,7 @@ even though the user gets a free copy. name="label shininess" left_pad="4" top_pad="-36" - width="85"> + width="90"> Shininess </text> <combo_box @@ -2385,7 +2393,7 @@ even though the user gets a free copy. left_delta="0" name="combobox shininess" top_pad="4" - width="85"> + width="90"> <combo_box.item label="None" name="None" @@ -2412,7 +2420,7 @@ even though the user gets a free copy. left_pad="4" name="label bumpiness" top_pad="-36" - width="85"> + width="90"> Bumpiness </text> <combo_box @@ -2421,7 +2429,7 @@ even though the user gets a free copy. left_delta="0" name="combobox bumpiness" top_pad="4" - width="85"> + width="90"> <combo_box.item label="None" name="None" @@ -2537,7 +2545,7 @@ even though the user gets a free copy. layout="topleft" left="10" name="tex scale" - top_pad="5" + top_pad="4" width="200"> Repeats / Face </text> @@ -2546,18 +2554,18 @@ even though the user gets a free copy. height="19" initial_value="0" label="Horizontal (U)" - label_width="90" + label_width="125" layout="topleft" left="20" max_val="100" name="TexScaleU" top_pad="6" - width="160" /> + width="185" /> <check_box height="19" label="Flip" layout="topleft" - left_pad="10" + left_pad="5" name="checkbox flip s" top_delta="0" width="70" /> @@ -2566,22 +2574,20 @@ even though the user gets a free copy. height="19" initial_value="0" label="Vertical (V)" - label_width="90" + label_width="125" layout="topleft" left="20" max_val="100" name="TexScaleV" - top_pad="0" - width="160" /> + width="185" /> <check_box height="19" label="Flip" layout="topleft" - left_pad="10" + left_pad="5" name="checkbox flip t" top_delta="0" width="70" /> - <spinner decimal_digits="2" follows="left|top" @@ -2590,35 +2596,33 @@ even though the user gets a free copy. initial_value="0" label="Rotation˚" layout="topleft" - label_width="100" + label_width="135" left="10" max_val="9999" min_val="-9999" name="TexRot" - top_delta="25" - width="170" /> + width="195" /> <spinner decimal_digits="1" follows="left|top" - height="19" + height="23" initial_value="1" label="Repeats / Meter" layout="topleft" - label_width="100" + label_width="135" left="10" max_val="10" min_val="0.1" name="rptctrl" - top_delta="20" - width="170" /> + width="195" /> <button follows="left|top" height="23" label="Apply" label_selected="Apply" layout="topleft" - left_pad="10" + left_pad="5" name="button apply" width="75" /> <text @@ -2629,7 +2633,6 @@ even though the user gets a free copy. layout="topleft" left="10" name="tex offset" - top_delta="20" width="200"> Texture Offset </text> @@ -2638,25 +2641,24 @@ even though the user gets a free copy. height="19" initial_value="0" label="Horizontal (U)" - label_width="90" + label_width="125" layout="topleft" left="20" min_val="-1" name="TexOffsetU" - top_pad="6" - width="160" /> + width="185" /> <spinner follows="left|top" height="19" initial_value="0" label="Vertical (V)" - label_width="90" + label_width="125" layout="topleft" left_delta="0" min_val="-1" name="TexOffsetV" top_pad="1" - width="160" /> + width="185" /> <panel border="false" follows="left|top" @@ -2666,30 +2668,20 @@ even though the user gets a free copy. bg_alpha_color="DkGray" name="Add_Media" left="0" - top_pad="0" - height="75" - width="278"> + height="63" + width="290"> <text type="string" length="1" follows="left|top" - height="12" + height="18" layout="topleft" left="10" - top_pad="5" + top_pad="3" name="media_tex" - width="260"> + width="190"> Media </text> - <text - follows="left|top|right" - height="18" - layout="topleft" - left="10" - use_ellipses="true" - read_only="true" - name="media_info" - width="180" /> <button follows="top|left" height="18" @@ -2723,18 +2715,27 @@ even though the user gets a free copy. <button follows="top|left" tool_tip="Edit this Media" - height="18" - image_disabled="OptionsMenu_Disabled" - image_selected="OptionsMenu_Press" - image_unselected="OptionsMenu_Off" + height="12" + image_disabled="Icon_Gear_Foreground" + image_selected="Icon_Gear_Background" + image_unselected="Icon_Gear_Press" layout="topleft" left_pad="10" name="edit_media" - top_delta="0" - width="18"> + top_delta="3" + width="12"> <button.commit_callback function="BuildTool.EditMedia"/> </button> + <text + follows="left|top|right" + height="9" + layout="topleft" + left="10" + use_ellipses="true" + read_only="true" + name="media_info" + width="280" /> <web_browser visible="false" enabled="false" @@ -2748,16 +2749,15 @@ even though the user gets a free copy. start_url="about:blank" decouple_texture_size="true" /> <button - follows="left|top" - height="23" + follows="right|top" + height="22" label="Align" label_selected="Align Media" layout="topleft" - left="10" + right="-10" name="button align" - top_pad="5" tool_tip="Align media texture (must load first)" - width="100" /> + width="80" /> </panel> </panel> <panel @@ -2770,33 +2770,36 @@ even though the user gets a free copy. help_topic="toolbox_contents_tab" name="Contents" top_delta="0" - width="280"> + width="295"> <button follows="left|top" - height="19" + height="23" label="New Script" label_selected="New Script" layout="topleft" left="10" name="button new script" top="10" - width="120" /> + width="134" /> <button follows="left|top" - height="19" + height="23" label="Permissions" layout="topleft" left_pad="8" name="button permissions" - width="130" /> + width="134" /> <panel_inventory_object - follows="left|top" + border="true" + border_visible="true" + bevel_style="in" + follows="left|top|right" height="325" layout="topleft" left="10" name="contents_inventory" top="50" - width="260" /> + width="275" /> </panel> </tab_container> <panel @@ -2806,7 +2809,7 @@ even though the user gets a free copy. left_delta="0" name="land info panel" top_delta="0" - width="280"> + width="295"> <text type="string" length="1" @@ -2817,7 +2820,7 @@ even though the user gets a free copy. left="20" name="label_parcel_info" top="24" - width="150"> + width="240"> Parcel Information </text> <text @@ -2846,14 +2849,14 @@ even though the user gets a free copy. </text> <button follows="left|top" - height="20" + height="23" label="About Land" label_selected="About Land" layout="topleft" left_delta="0" name="button about land" top_pad="4" - width="112" /> + width="125" /> <check_box control_name="ShowParcelOwners" height="19" @@ -2874,29 +2877,29 @@ even though the user gets a free copy. left="20" name="label_parcel_modify" top="152" - width="150"> + width="240"> Modify Parcel </text> <button follows="left|top" - height="20" + height="23" label="Subdivide" label_selected="Subdivide" layout="topleft" left="30" name="button subdivide land" top="172" - width="112" /> + width="125" /> <button follows="left|top" - height="20" + height="23" label="Join" label_selected="Join" layout="topleft" left_delta="0" name="button join land" top_pad="4" - width="112" /> + width="125" /> <text type="string" length="1" @@ -2907,28 +2910,28 @@ even though the user gets a free copy. left="20" name="label_parcel_trans" top="256" - width="150"> + width="240"> Land Transactions </text> <button follows="left|top" - height="20" + height="23" label="Buy Land" label_selected="Buy Land" layout="topleft" left="30" name="button buy land" top="276" - width="112" /> + width="125" /> <button follows="left|top" - height="20" + height="23" label="Abandon Land" label_selected="Abandon Land" layout="topleft" left_delta="0" name="button abandon land" top_pad="4" - width="112" /> + width="125" /> </panel> </floater> diff --git a/indra/newview/skins/default/xui/en/floater_tos.xml b/indra/newview/skins/default/xui/en/floater_tos.xml index 5e168fe4aa..cbfaac958b 100644 --- a/indra/newview/skins/default/xui/en/floater_tos.xml +++ b/indra/newview/skins/default/xui/en/floater_tos.xml @@ -11,6 +11,10 @@ name="real_url"> http://secondlife.com/app/tos/ </floater.string> + <floater.string + name="loading_url"> + data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Loading %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E + </floater.string> <button enabled="false" height="20" @@ -33,7 +37,7 @@ <check_box follows="top|right" height="16" - label="I Agree to the Terms of Service" + label="I Agree to the Terms of Service and Privacy Policy" layout="topleft" left_delta="0" name="agree_chk" @@ -51,7 +55,7 @@ top_delta="-399" word_wrap="true" width="552"> - Please read the following Terms of Service carefully. To continue logging in to [SECOND_LIFE], you must accept the agreement. + Please read the following Terms of Service and Privacy Policy carefully. To continue logging in to [SECOND_LIFE], you must accept the agreement. </text> <web_browser follows="left|top" @@ -59,7 +63,6 @@ layout="topleft" left_delta="0" name="tos_html" - start_url="data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Loading %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E" top_delta="40" width="568" /> </floater> diff --git a/indra/newview/skins/default/xui/en/floater_ui_preview.xml b/indra/newview/skins/default/xui/en/floater_ui_preview.xml index e86cb23c1e..3b10a57c50 100644 --- a/indra/newview/skins/default/xui/en/floater_ui_preview.xml +++ b/indra/newview/skins/default/xui/en/floater_ui_preview.xml @@ -112,7 +112,7 @@ layout="topleft" left_pad="15" name="toggle_overlap_panel" - tool_tip="Toggle highlighting and display panel for overlapping elements; right click an element to select it for this feature. The selected element is marked by a red rectangle." + tool_tip="Toggle highlighting and display panel for overlapping elements; right-click an element to select it for this feature. The selected element is marked by a red rectangle." top_delta="0" width="30" /> <text @@ -238,7 +238,6 @@ border_thickness="1" follows="left|bottom" font="SansSerif" - handle_edit_keys_directly="true" height="20" layout="topleft" left_delta="100" @@ -278,7 +277,6 @@ border_thickness="1" follows="left|bottom" font="SansSerif" - handle_edit_keys_directly="true" height="20" layout="topleft" left_delta="100" @@ -320,7 +318,6 @@ border_thickness="1" follows="left|bottom" font="SansSerif" - handle_edit_keys_directly="true" height="20" layout="topleft" left_delta="65" diff --git a/indra/newview/skins/default/xui/en/floater_voice_controls.xml b/indra/newview/skins/default/xui/en/floater_voice_controls.xml index c4411db8c5..bf5bd87ad6 100644 --- a/indra/newview/skins/default/xui/en/floater_voice_controls.xml +++ b/indra/newview/skins/default/xui/en/floater_voice_controls.xml @@ -3,14 +3,16 @@ can_resize="true" can_minimize="true" can_close="false" - height="202" + height="205" layout="topleft" min_height="124" min_width="190" name="floater_voice_controls" help_topic="floater_voice_controls" title="Voice Controls" + save_dock_state="true" save_visibility="true" + save_rect="true" single_instance="true" width="282"> <string @@ -45,10 +47,10 @@ width="263"> <layout_panel follows="top|left|right" - user_resize="false" - auto_resize="false" + user_resize="false" + auto_resize="false" layout="topleft" - height="26" + height="20" name="my_panel"> <avatar_icon enabled="false" @@ -70,7 +72,7 @@ text_color="white" top="4" use_ellipses="true" - value="Mya Avatar:" + value="My Avatar:" width="210" /> <output_monitor auto_update="true" @@ -84,29 +86,44 @@ visible="true" width="20" /> </layout_panel> - <layout_panel - auto_resize="false" - user_resize="false" - follows="top|left" - height="26" - visible="true" - layout="topleft" - name="leave_call_btn_panel" - width="100"> - <button - follows="right|top" - height="23" - top_pad="0" - label="Leave Call" - name="leave_call_btn" - width="100" /> - </layout_panel> + <layout_stack + clip="true" + auto_resize="false" + follows="left|top|right" + height="26" + layout="topleft" + mouse_opaque="false" + name="voice_effect_and_leave_call_stack" + orientation="horizontal" + width="262"> + <panel + class="panel_voice_effect" + name="panel_voice_effect" + visiblity_control="VoiceMorphingEnabled" + filename="panel_voice_effect.xml" /> + <layout_panel + auto_resize="false" + user_resize="false" + follows="top|right" + height="23" + visible="true" + layout="topleft" + name="leave_call_btn_panel" + width="100"> + <button + follows="right|top" + height="23" + label="Leave Call" + name="leave_call_btn" + width="100" /> + </layout_panel> + </layout_stack> <layout_panel follows="all" layout="topleft" left="2" top_pad="0" - height="132" + height="132" name="callers_panel" user_resize="false" width="280"> diff --git a/indra/newview/skins/default/xui/en/floater_voice_effect.xml b/indra/newview/skins/default/xui/en/floater_voice_effect.xml new file mode 100644 index 0000000000..9bf9cc6c77 --- /dev/null +++ b/indra/newview/skins/default/xui/en/floater_voice_effect.xml @@ -0,0 +1,115 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<floater + legacy_header_height="27" + can_resize="true" + height="500" + name="voice_effects" + help_topic="voice_effects" + title="VOICE MORPHING" + background_visible="true" + follows="all" + label="Places" + layout="topleft" + min_height="360" + min_width="200" + width="300"> + <string name="no_voice_effect"> + (No Voice Morph) + </string> + <string name="active_voice_effect"> + (Active) + </string> + <string name="unsubscribed_voice_effect"> + (Unsubscribed) + </string> + <string name="new_voice_effect"> + (New!) + </string> + <text + height="16" + word_wrap="true" + use_ellipses="true" + type="string" + follows="left|top|right" + layout="topleft" + font="SansSerifBold" + color="White" + left="10" + name="preview_text" + right="-10" + top="27">To Preview + </text> + <text + height="23" + word_wrap="true" + use_ellipses="true" + type="string" + follows="left|top|right" + layout="topleft" + left="10" + name="status_text" + right="-5" + top_pad="0"> +Record a sample, then click on a voice to hear how it will sound. + </text> + <button + follows="left|top" + height="23" + label="Record" + layout="topleft" + left="10" + name="record_btn" + tool_tip="Record a sample of your voice." + top_pad="5" + width="100"> + <button.commit_callback + function="VoiceEffect.Record" /> + </button> + <button + follows="left|top" + height="23" + label="Stop" + layout="topleft" + left_delta="0" + name="record_stop_btn" + top_delta="0" + width="100"> + <button.commit_callback + function="VoiceEffect.Stop" /> + </button> + <text + height="23" + halign="right" + use_ellipses="true" + type="string" + follows="left|top|right" + layout="topleft" + left_pad="10" + top_delta="10" + name="voice_morphing_link" + right="-10"> + [[URL] Subscribe Now] + </text> + <scroll_list + bottom="-10" + draw_heading="true" + follows="all" + layout="topleft" + left="10" + multi_select="false" + name="voice_effect_list" + right="-10" + tool_tip="Record a sample of your voice, then click an effect to preview." + top="95"> + <scroll_list.columns + label="Voice Name" + name="name" + relative_width="0.60" /> + <scroll_list.columns + dynamic_width="true" + label="Expires" + name="expires" + relative_width="0.30" /> + </scroll_list> + +</floater> diff --git a/indra/newview/skins/default/xui/en/floater_water.xml b/indra/newview/skins/default/xui/en/floater_water.xml index 32739ac953..3a44ba3763 100644 --- a/indra/newview/skins/default/xui/en/floater_water.xml +++ b/indra/newview/skins/default/xui/en/floater_water.xml @@ -16,49 +16,49 @@ type="string" length="1" follows="left|top|right" - font.style="BOLD" height="16" layout="topleft" left="10" name="KeyFramePresetsText" top="34" - width="110"> + font="SansSerif" + width="85"> Water Presets: </text> <combo_box - height="18" + height="23" layout="topleft" - left_pad="10" + left_delta="95" name="WaterPresetsCombo" - top_delta="-2" + top_delta="-4" width="150" /> <button - height="20" + height="23" label="New" label_selected="New" layout="topleft" - left_pad="20" + left_pad="3" name="WaterNewPreset" - top_delta="1" - width="90" /> + top_delta="0" + width="70" /> <button - height="20" + height="23" label="Save" label_selected="Save" layout="topleft" - left_pad="10" + left_pad="3" name="WaterSavePreset" top_delta="0" - width="90" /> + width="70" /> <button - height="20" + height="23" label="Delete" label_selected="Delete" layout="topleft" - left_pad="10" + left_pad="3" name="WaterDeletePreset" top_delta="0" - width="90" /> + width="70" /> <tab_container border="false" follows="left|top" @@ -74,7 +74,7 @@ border="true" follows="all" height="180" - label="Settings" + label="SETTINGS" layout="topleft" left="0" mouse_opaque="false" @@ -331,7 +331,7 @@ border="true" follows="all" height="180" - label="Image" + label="IMAGE" layout="topleft" left="0" mouse_opaque="false" @@ -348,7 +348,7 @@ layout="topleft" left="10" name="BHText" - top="10" + top="4" width="200"> Big Wave Direction </text> @@ -361,23 +361,10 @@ layout="topleft" left="10" name="WaterWave1DirXText" - top_pad="4" + top_pad="5" width="10"> X </text> - <text - type="string" - length="1" - follows="left|top|right" - halign="center" - height="16" - layout="topleft" - left_delta="0" - name="WaterWave1DirYText" - top_delta="18" - width="10"> - Y - </text> <slider control_name="WaterWave1DirX" decimal_digits="2" @@ -390,8 +377,22 @@ max_val="4" min_val="-4" name="WaterWave1DirX" - top="55" + left_pad="3" + top_pad="6" width="200" /> + <text + type="string" + length="1" + follows="left|top|right" + halign="center" + height="16" + layout="topleft" + left_delta="-13" + name="WaterWave1DirYText" + top_pad="-15" + width="10"> + Y + </text> <slider control_name="WaterWave1DirY" decimal_digits="2" @@ -404,7 +405,8 @@ max_val="4" min_val="-4" name="WaterWave1DirY" - top_pad="5" + left_pad="3" + top_pad="6" width="200" /> <text type="string" @@ -413,9 +415,9 @@ font="SansSerif" height="16" layout="topleft" - left_delta="-14" + left_delta="-13" name="BHText2" - top_delta="3" + top_pad="-10" width="355"> Little Wave Direction </text> @@ -427,24 +429,12 @@ height="16" layout="topleft" left="10" + left_delta="0" name="WaterWave2DirXText" - top="90" + top_pad="5" width="10"> X </text> - <text - type="string" - length="1" - follows="left|top|right" - halign="center" - height="16" - layout="topleft" - left_delta="0" - name="WaterWave2DirYText" - top_delta="20" - width="10"> - Y - </text> <slider control_name="WaterWave2DirX" decimal_digits="2" @@ -457,8 +447,22 @@ max_val="4" min_val="-4" name="WaterWave2DirX" - top="115" + left_pad="3" + top_pad="6" width="200" /> + <text + type="string" + length="1" + follows="left|top|right" + halign="center" + height="16" + layout="topleft" + left_delta="-13" + name="WaterWave2DirYText" + top_pad="-15" + width="10"> + Y + </text> <slider control_name="WaterWave2DirY" decimal_digits="2" @@ -471,7 +475,8 @@ max_val="4" min_val="-4" name="WaterWave2DirY" - top_pad="10" + left_pad="3" + top_pad="6" width="200" /> <text type="string" diff --git a/indra/newview/skins/default/xui/en/floater_wearable_save_as.xml b/indra/newview/skins/default/xui/en/floater_wearable_save_as.xml index b4b57f2dbc..71812bd1a6 100644 --- a/indra/newview/skins/default/xui/en/floater_wearable_save_as.xml +++ b/indra/newview/skins/default/xui/en/floater_wearable_save_as.xml @@ -44,7 +44,6 @@ border_style="line" border_thickness="1" follows="left|top" - handle_edit_keys_directly="true" height="23" layout="topleft" left_delta="0" diff --git a/indra/newview/skins/default/xui/en/floater_windlight_options.xml b/indra/newview/skins/default/xui/en/floater_windlight_options.xml index 0cb7814c6a..85a5be369c 100644 --- a/indra/newview/skins/default/xui/en/floater_windlight_options.xml +++ b/indra/newview/skins/default/xui/en/floater_windlight_options.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <floater legacy_header_height="18" - height="220" + height="256" layout="topleft" name="WindLight floater" help_topic="windlight_floater" @@ -22,68 +22,64 @@ left="10" name="KeyFramePresetsText" top="34" - width="110"> + width="85"> Sky Presets: </text> <combo_box - height="18" + height="23" layout="topleft" - left_delta="110" + left_delta="85" name="WLPresetsCombo" - top_delta="-2" + top_delta="-4" width="150" /> <button - height="20" + height="23" label="New" label_selected="New" layout="topleft" - left_pad="20" + left_pad="3" name="WLNewPreset" - top_delta="1" width="70" /> <button - height="20" + height="23" label="Save" label_selected="Save" layout="topleft" - left_pad="10" + left_pad="3" name="WLSavePreset" - top_delta="0" width="70" /> <button - height="20" + height="23" label="Delete" label_selected="Delete" layout="topleft" - left_pad="10" + left_pad="3" name="WLDeletePreset" - top_delta="0" width="70" /> <button - height="20" + height="23" label="Day Cycle Editor" label_selected="Day Cycle Editor" layout="topleft" - left_pad="50" + right="-10" name="WLDayCycleMenuButton" - top_delta="0" + top_pad="-23" width="120" /> <tab_container follows="left|top" - height="160" + height="196" halign="center" layout="topleft" left="0" name="WindLight Tabs" tab_position="top" - tab_height="20" top="60" width="700"> <panel border="true" follows="left|top|right|bottom" - height="160" - label="Atmosphere" + height="196" + label="ATMOSPHERE" layout="topleft" left="1" mouse_opaque="false" @@ -113,10 +109,22 @@ layout="topleft" left="10" name="BHText2" - top="21" + top_pad="5" width="10"> R </text> + <slider + control_name="WLBlueHorizonR" + decimal_digits="2" + follows="left" + height="10" + increment="0.01" + initial_value="0.7" + layout="topleft" + left_pad="3" + top_pad="6" + name="WLBlueHorizonR" + width="200" /> <text type="string" length="1" @@ -124,12 +132,25 @@ halign="center" height="16" layout="topleft" - left_delta="0" + left="10" + top_pad="-15" name="BHText3" - top_delta="11" width="10"> G </text> + <slider + control_name="WLBlueHorizonG" + decimal_digits="2" + follows="left" + height="10" + increment="0.01" + initial_value="0.7" + layout="topleft" + left_delta="0" + name="WLBlueHorizonG" + left_pad="3" + top_pad="6" + width="200" /> <text type="string" length="1" @@ -137,12 +158,24 @@ halign="center" height="16" layout="topleft" - left_delta="0" name="BHText4" - top_delta="11" + left="10" + top_pad="-15" width="10"> B </text> + <slider + control_name="WLBlueHorizonB" + decimal_digits="2" + follows="left" + height="10" + increment="0.01" + initial_value="0.7" + layout="topleft" + name="WLBlueHorizonB" + left_pad="3" + top_pad="6" + width="200" /> <text type="string" length="1" @@ -150,49 +183,13 @@ halign="center" height="16" layout="topleft" - left_delta="0" name="BHText5" - top_delta="11" + left="10" + top_pad="-15" width="10"> I </text> <slider - control_name="WLBlueHorizonR" - decimal_digits="2" - follows="left" - height="10" - increment="0.01" - initial_value="0.7" - layout="topleft" - left="24" - name="WLBlueHorizonR" - top="40" - width="200" /> - <slider - control_name="WLBlueHorizonG" - decimal_digits="2" - follows="left" - height="10" - increment="0.01" - initial_value="0.7" - layout="topleft" - left_delta="0" - name="WLBlueHorizonG" - top_pad="1" - width="200" /> - <slider - control_name="WLBlueHorizonB" - decimal_digits="2" - follows="left" - height="10" - increment="0.01" - initial_value="0.7" - layout="topleft" - left_delta="0" - name="WLBlueHorizonB" - top_pad="1" - width="200" /> - <slider control_name="WLBlueHorizonI" decimal_digits="2" follows="left" @@ -200,9 +197,9 @@ increment="0.01" initial_value="1.0" layout="topleft" - left_delta="0" name="WLBlueHorizonI" - top_pad="1" + left_pad="3" + top_pad="6" width="200" /> <text type="string" @@ -211,9 +208,9 @@ font="SansSerif" height="16" layout="topleft" - left_delta="-14" + left="10" + top_pad="-10" name="BDensText" - top_delta="-2" width="355"> Haze Horizon </text> @@ -225,9 +222,10 @@ increment="0.01" initial_value="0.25" layout="topleft" - left="24" + left="23" + top_delta="0" + top_pad="27" name="WLHazeHorizon" - top="107" width="200" /> <text type="string" @@ -251,10 +249,22 @@ layout="topleft" left="245" name="BHText6" - top="21" + top_pad="5" width="10"> R </text> + <slider + control_name="WLBlueDensityR" + decimal_digits="2" + follows="left" + height="10" + increment="0.01" + initial_value="0.7" + layout="topleft" + left_pad="3" + top_pad="6" + name="WLBlueDensityR" + width="200" /> <text type="string" length="1" @@ -262,50 +272,12 @@ halign="center" height="16" layout="topleft" - left_delta="0" + left="245" name="BHText7" - top_delta="11" + top_pad="-15" width="10"> G </text> - <text - type="string" - length="1" - follows="left|top|right" - halign="center" - height="16" - layout="topleft" - left_delta="0" - name="BHText8" - top_delta="11" - width="10"> - B - </text> - <text - type="string" - length="1" - follows="left|top|right" - halign="center" - height="16" - layout="topleft" - left_delta="0" - name="BHText9" - top_delta="11" - width="10"> - I - </text> - <slider - control_name="WLBlueDensityR" - decimal_digits="2" - follows="left" - height="10" - increment="0.01" - initial_value="0.7" - layout="topleft" - left="259" - name="WLBlueDensityR" - top="40" - width="200" /> <slider control_name="WLBlueDensityG" decimal_digits="2" @@ -316,8 +288,22 @@ layout="topleft" left_delta="0" name="WLBlueDensityG" - top_pad="1" + left_pad="3" + top_pad="6" width="200" /> + <text + type="string" + length="1" + follows="left|top|right" + halign="center" + height="16" + layout="topleft" + left="245" + name="BHText8" + top_pad="-15" + width="10"> + B + </text> <slider control_name="WLBlueDensityB" decimal_digits="2" @@ -328,8 +314,22 @@ layout="topleft" left_delta="0" name="WLBlueDensityB" - top_pad="1" + left_pad="3" + top_pad="6" width="200" /> + <text + type="string" + length="1" + follows="left|top|right" + halign="center" + height="16" + layout="topleft" + left="245" + name="BHText9" + top_pad="-15" + width="10"> + I + </text> <slider control_name="WLBlueDensityI" decimal_digits="2" @@ -340,7 +340,8 @@ layout="topleft" left_delta="0" name="WLBlueDensityI" - top_pad="1" + left_pad="3" + top_pad="6" width="200" /> <text type="string" @@ -349,9 +350,9 @@ font="SansSerif" height="16" layout="topleft" - left_delta="-14" + left="245" name="HDText" - top_delta="-2" + top_pad="-10" width="355"> Haze Density </text> @@ -363,10 +364,10 @@ increment="0.01" initial_value="0.7" layout="topleft" - left="259" + left="258" max_val="4" name="WLHazeDensity" - top="107" + top_pad="27" width="200" /> <text type="string" @@ -389,10 +390,10 @@ increment="0.01" initial_value="0.1" layout="topleft" - left="494" + left_delta="13" max_val="0.9" name="WLDensityMult" - top="40" + top_pad="27" width="200" /> <text type="string" @@ -401,9 +402,9 @@ font="SansSerif" height="16" layout="topleft" - left_delta="-14" + left_delta="-13" name="WLDistanceMultText" - top_delta="-3" + top_pad="-10" width="355"> Distance Multiplier </text> @@ -414,11 +415,11 @@ height="10" initial_value="1.0" layout="topleft" - left="494" + left_delta="13" max_val="100" name="WLDistanceMult" - top="73" - width="207" /> + top_pad="27" + width="200" /> <text type="string" length="1" @@ -426,9 +427,9 @@ font="SansSerif" height="16" layout="topleft" - left_delta="-14" + left_delta="-13" name="MaxAltText" - top_delta="-2" + top_pad="-15" width="355"> Max Altitude </text> @@ -440,17 +441,17 @@ increment="1" initial_value="500" layout="topleft" - left="494" + left_delta="13" max_val="4000" name="WLMaxAltitude" - top="107" - width="205" /> + top_pad="27" + width="200" /> </panel> <panel border="true" follows="left|top|right|bottom" - height="160" - label="Lighting" + height="196" + label="LIGHTING" layout="topleft" left_delta="0" help_topic="windlight_lighting_tab" @@ -477,12 +478,24 @@ halign="center" height="16" layout="topleft" - left="10" + left_delta="0" name="BHText" - top="21" + top_pad="5" width="10"> R </text> + <slider + control_name="WLSunlightR" + decimal_digits="2" + follows="left" + height="10" + increment="0.01" + initial_value="0.7" + layout="topleft" + left_pad="3" + top_pad="6" + name="WLSunlightR" + width="200" /> <text type="string" length="1" @@ -490,50 +503,12 @@ halign="center" height="16" layout="topleft" - left_delta="0" + left_delta="-13" name="BHText2" - top_delta="11" + top_pad="-15" width="10"> G </text> - <text - type="string" - length="1" - follows="left|top|right" - halign="center" - height="16" - layout="topleft" - left_delta="0" - name="BHText3" - top_delta="11" - width="10"> - B - </text> - <text - type="string" - length="1" - follows="left|top|right" - halign="center" - height="16" - layout="topleft" - left_delta="0" - name="BHText4" - top_delta="11" - width="10"> - I - </text> - <slider - control_name="WLSunlightR" - decimal_digits="2" - follows="left" - height="10" - increment="0.01" - initial_value="0.7" - layout="topleft" - left="24" - name="WLSunlightR" - top="40" - width="200" /> <slider control_name="WLSunlightG" decimal_digits="2" @@ -544,8 +519,22 @@ layout="topleft" left_delta="0" name="WLSunlightG" - top_pad="1" + left_pad="3" + top_pad="6" width="200" /> + <text + type="string" + length="1" + follows="left|top|right" + halign="center" + height="16" + layout="topleft" + left_delta="-13" + name="BHText3" + top_pad="-15" + width="10"> + B + </text> <slider control_name="WLSunlightB" decimal_digits="2" @@ -556,8 +545,22 @@ layout="topleft" left_delta="0" name="WLSunlightB" - top_pad="1" + left_pad="3" + top_pad="6" width="200" /> + <text + type="string" + length="1" + follows="left|top|right" + halign="center" + height="16" + layout="topleft" + left_delta="-13" + name="BHText4" + top_pad="-15" + width="10"> + I + </text> <slider control_name="WLSunlightI" decimal_digits="2" @@ -568,7 +571,8 @@ layout="topleft" left_delta="0" name="WLSunlightI" - top_pad="1" + left_pad="3" + top_pad="6" width="200" /> <text type="string" @@ -577,9 +581,9 @@ font="SansSerif" height="16" layout="topleft" - left_delta="-14" + left_delta="-13" name="TODText" - top_delta="-2" + top_pad="-10" width="355"> Sun/Moon Position </text> @@ -587,9 +591,9 @@ height="20" image_name="icon_diurnal.tga" layout="topleft" - left="30" + left_delta="14" + top_pad="10" name="SkyDayCycle" - top="97" width="148" /> <slider control_name="WLSunAngle" @@ -598,10 +602,10 @@ increment="0.001" initial_value="0.7" layout="topleft" - left="24" + left_delta="-8" name="WLSunAngle" - top="137" - width="204" /> + top_pad="20" + width="207" /> <text type="string" length="1" @@ -622,12 +626,24 @@ halign="center" height="16" layout="topleft" - left="245" + left_delta="0" name="BHText5" - top="21" + top_pad="5" width="10"> R </text> + <slider + control_name="WLAmbientR" + decimal_digits="2" + follows="left" + height="10" + increment="0.01" + initial_value="0.7" + layout="topleft" + left_pad="3" + top_pad="6" + name="WLAmbientR" + width="200" /> <text type="string" length="1" @@ -635,50 +651,12 @@ halign="center" height="16" layout="topleft" - left_delta="0" + left_delta="-13" name="BHText6" - top_delta="11" + top_pad="-15" width="10"> G </text> - <text - type="string" - length="1" - follows="left|top|right" - halign="center" - height="16" - layout="topleft" - left_delta="0" - name="BHText7" - top_delta="11" - width="10"> - B - </text> - <text - type="string" - length="1" - follows="left|top|right" - halign="center" - height="16" - layout="topleft" - left_delta="0" - name="BHText8" - top_delta="11" - width="10"> - I - </text> - <slider - control_name="WLAmbientR" - decimal_digits="2" - follows="left" - height="10" - increment="0.01" - initial_value="0.7" - layout="topleft" - left="259" - name="WLAmbientR" - top="40" - width="200" /> <slider control_name="WLAmbientG" decimal_digits="2" @@ -689,8 +667,22 @@ layout="topleft" left_delta="0" name="WLAmbientG" - top_pad="1" + left_pad="3" + top_pad="6" width="200" /> + <text + type="string" + length="1" + follows="left|top|right" + halign="center" + height="16" + layout="topleft" + left_delta="-13" + name="BHText7" + top_pad="-15" + width="10"> + B + </text> <slider control_name="WLAmbientB" decimal_digits="2" @@ -701,8 +693,22 @@ layout="topleft" left_delta="0" name="WLAmbientB" - top_pad="1" + left_pad="3" + top_pad="6" width="200" /> + <text + type="string" + length="1" + follows="left|top|right" + halign="center" + height="16" + layout="topleft" + left_delta="-13" + name="BHText8" + top_pad="-15" + width="10"> + I + </text> <slider control_name="WLAmbientI" decimal_digits="2" @@ -713,7 +719,8 @@ layout="topleft" left_delta="0" name="WLAmbientI" - top_pad="1" + left_pad="3" + top_pad="6" width="200" /> <text type="string" @@ -722,9 +729,9 @@ font="SansSerif" height="16" layout="topleft" - left_delta="-14" + left_delta="-13" name="WLEastAngleText" - top_delta="-2" + top_pad="-10" width="355"> East Angle </text> @@ -736,9 +743,9 @@ increment="0.01" initial_value="0.0" layout="topleft" - left="259" + left_delta="13" name="WLEastAngle" - top="107" + top_pad="27" width="200" /> <text type="string" @@ -762,10 +769,10 @@ initial_value="0.1" label="Focus " layout="topleft" - left="494" + left_delta="0" max_val="0.5" name="WLGlowB" - top="40" + top_pad="27" width="200" /> <slider control_name="WLGlowR" @@ -780,7 +787,7 @@ max_val="1.99" min_val="1" name="WLGlowR" - top_pad="1" + top_pad="6" width="200" /> <text type="string" @@ -789,9 +796,9 @@ font="SansSerif" height="16" layout="topleft" - left_delta="-14" + left_delta="0" name="SceneGammaText" - top_delta="0" + top_pad="-10" width="200"> Scene Gamma </text> @@ -803,11 +810,11 @@ increment="0.01" initial_value="2.0" layout="topleft" - left="494" + left_delta="0" max_val="10" name="WLGamma" - top="87" - width="207" /> + top_pad="27" + width="200" /> <text type="string" length="1" @@ -815,9 +822,9 @@ font="SansSerif" height="16" layout="topleft" - left_delta="-14" + left_delta="0" name="WLStarText" - top_delta="-1" + top_pad="-10" width="355"> Star Brightness </text> @@ -829,17 +836,17 @@ increment="0.01" initial_value="0" layout="topleft" - left="494" + left_delta="0" max_val="2" name="WLStarAlpha" - top="122" + top_pad="27" width="200" /> </panel> <panel border="true" follows="left|top|right|bottom" - height="160" - label="Clouds" + height="196" + label="CLOUDS" layout="topleft" left_delta="0" mouse_opaque="false" @@ -867,12 +874,24 @@ halign="center" height="16" layout="topleft" - left="10" + left_delta="0" name="BHText" - top="21" + top_pad="5" width="10"> R </text> + <slider + control_name="WLCloudColorR" + decimal_digits="2" + follows="left" + height="10" + increment="0.01" + initial_value="0.7" + layout="topleft" + left_pad="3" + top_pad="6" + name="WLCloudColorR" + width="200" /> <text type="string" length="1" @@ -880,50 +899,12 @@ halign="center" height="16" layout="topleft" - left_delta="0" + left_delta="-13" name="BHText2" - top_delta="11" + top_pad="-15" width="10"> G </text> - <text - type="string" - length="1" - follows="left|top|right" - halign="center" - height="16" - layout="topleft" - left_delta="0" - name="BHText3" - top_delta="11" - width="10"> - B - </text> - <text - type="string" - length="1" - follows="left|top|right" - halign="center" - height="16" - layout="topleft" - left_delta="0" - name="BHText4" - top_delta="11" - width="10"> - I - </text> - <slider - control_name="WLCloudColorR" - decimal_digits="2" - follows="left" - height="10" - increment="0.01" - initial_value="0.7" - layout="topleft" - left="24" - name="WLCloudColorR" - top="40" - width="200" /> <slider control_name="WLCloudColorG" decimal_digits="2" @@ -934,8 +915,22 @@ layout="topleft" left_delta="0" name="WLCloudColorG" - top_pad="1" + left_pad="3" + top_pad="6" width="200" /> + <text + type="string" + length="1" + follows="left|top|right" + halign="center" + height="16" + layout="topleft" + left_delta="-13" + name="BHText3" + top_pad="-15" + width="10"> + B + </text> <slider control_name="WLCloudColorB" decimal_digits="2" @@ -946,8 +941,22 @@ layout="topleft" left_delta="0" name="WLCloudColorB" - top_pad="1" + left_pad="3" + top_pad="6" width="200" /> + <text + type="string" + length="1" + follows="left|top|right" + halign="center" + height="16" + layout="topleft" + left_delta="-13" + name="BHText4" + top_pad="-15" + width="10"> + I + </text> <slider control_name="WLCloudColorI" decimal_digits="2" @@ -958,7 +967,8 @@ layout="topleft" left_delta="0" name="WLCloudColorI" - top_pad="1" + left_pad="3" + top_pad="6" width="200" /> <text type="string" @@ -967,9 +977,9 @@ font="SansSerif" height="16" layout="topleft" - left_delta="-14" + left_delta="-13" name="WLCloudColorText2" - top_delta="-2" + top_pad="-10" width="355"> Cloud XY/Density </text> @@ -980,12 +990,24 @@ halign="center" height="16" layout="topleft" - left="10" + left_delta="0" name="BHText5" - top="87" + top_pad="5" width="10"> X </text> + <slider + control_name="WLCloudX" + decimal_digits="2" + follows="left" + height="10" + increment="0.01" + initial_value="0.5" + layout="topleft" + left_pad="3" + top_pad="6" + name="WLCloudX" + width="200" /> <text type="string" length="1" @@ -993,12 +1015,24 @@ halign="center" height="16" layout="topleft" - left_delta="0" + left_delta="-13" name="BHText6" - top_delta="11" + top_pad="-15" width="10"> Y </text> + <slider + control_name="WLCloudY" + decimal_digits="2" + follows="left" + height="10" + increment="0.01" + initial_value="0.5" + layout="topleft" + left_pad="3" + top_pad="6" + name="WLCloudY" + width="200" /> <text type="string" length="1" @@ -1006,37 +1040,13 @@ halign="center" height="16" layout="topleft" - left_delta="0" + left_delta="-13" name="BHText7" - top_delta="11" + top_pad="-15" width="10"> D </text> <slider - control_name="WLCloudX" - decimal_digits="2" - follows="left" - height="10" - increment="0.01" - initial_value="0.5" - layout="topleft" - left_pad="4" - name="WLCloudX" - top_delta="-2" - width="200" /> - <slider - control_name="WLCloudY" - decimal_digits="2" - follows="left" - height="10" - increment="0.01" - initial_value="0.5" - layout="topleft" - left_delta="0" - name="WLCloudY" - top_pad="1" - width="200" /> - <slider control_name="WLCloudDensity" decimal_digits="2" follows="left" @@ -1046,7 +1056,8 @@ layout="topleft" left_delta="0" name="WLCloudDensity" - top_pad="1" + left_pad="3" + top_pad="6" width="200" /> <text type="string" @@ -1069,9 +1080,9 @@ increment="0.01" initial_value="0.5" layout="topleft" - left="259" + left_delta="13" name="WLCloudCoverage" - top="40" + top_pad="27" width="200" /> <text type="string" @@ -1080,9 +1091,9 @@ font="SansSerif" height="16" layout="topleft" - left_delta="-14" + left_delta="-13" name="WLCloudScaleText" - top_delta="-1" + top_pad="-10" width="355"> Cloud Scale </text> @@ -1094,10 +1105,10 @@ increment="0.01" initial_value="1.0" layout="topleft" - left="259" + left_delta="13" min_val="0.01" name="WLCloudScale" - top="75" + top_pad="27" width="200" /> <text type="string" @@ -1106,9 +1117,9 @@ font="SansSerif" height="16" layout="topleft" - left_delta="-14" + left_delta="-13" name="WLCloudDetailText" - top_delta="-4" + top_pad="-10" width="355"> Cloud Detail (XY/Density) </text> @@ -1119,12 +1130,24 @@ halign="center" height="16" layout="topleft" - left="245" + left_delta="0" name="BHText8" - top="87" + top_pad="8" width="10"> X </text> + <slider + control_name="WLCloudDetailX" + decimal_digits="2" + follows="left" + height="10" + increment="0.01" + initial_value="0.5" + layout="topleft" + left_pad="3" + top_pad="8" + name="WLCloudDetailX" + width="200" /> <text type="string" length="1" @@ -1132,37 +1155,12 @@ halign="center" height="16" layout="topleft" - left_delta="0" + left_delta="-13" name="BHText9" - top_delta="11" + top_pad="-15" width="10"> Y </text> - <text - type="string" - length="1" - follows="left|top|right" - halign="center" - height="16" - layout="topleft" - left_delta="0" - name="BHText10" - top_delta="11" - width="10"> - D - </text> - <slider - control_name="WLCloudDetailX" - decimal_digits="2" - follows="left" - height="10" - increment="0.01" - initial_value="0.5" - layout="topleft" - left_pad="4" - name="WLCloudDetailX" - top_delta="-2" - width="200" /> <slider control_name="WLCloudDetailY" decimal_digits="2" @@ -1173,8 +1171,22 @@ layout="topleft" left_delta="0" name="WLCloudDetailY" - top_pad="1" + left_pad="3" + top_pad="6" width="200" /> + <text + type="string" + length="1" + follows="left|top|right" + halign="center" + height="16" + layout="topleft" + left_delta="-13" + name="BHText10" + top_pad="-15" + width="10"> + D + </text> <slider control_name="WLCloudDetailDensity" decimal_digits="2" @@ -1185,7 +1197,8 @@ layout="topleft" left_delta="0" name="WLCloudDetailDensity" - top_pad="1" + left_pad="3" + top_pad="6" width="200" /> <text type="string" diff --git a/indra/newview/skins/default/xui/en/floater_world_map.xml b/indra/newview/skins/default/xui/en/floater_world_map.xml index e1df50bf58..ece406f9b1 100644 --- a/indra/newview/skins/default/xui/en/floater_world_map.xml +++ b/indra/newview/skins/default/xui/en/floater_world_map.xml @@ -2,9 +2,8 @@ <floater legacy_header_height="18" can_resize="true" - center_horiz="true" - center_vert="true" - height="535" + open_centered="true" + height="600" layout="topleft" min_height="520" min_width="520" @@ -14,16 +13,16 @@ save_visibility="true" single_instance="true" title="WORLD MAP" - width="800"> + width="650"> <panel filename="panel_world_map.xml" follows="all" - height="500" + height="555" layout="topleft" left="10" name="objects_mapview" top="25" - width="542" /> + width="375" /> <panel name="layout_panel_1" height="22" @@ -53,7 +52,8 @@ follows="right|top" height="126" top_pad="0" - width="238"> + width="238" + name="layout_panel_2"> <button follows="right|top" height="22" @@ -178,16 +178,16 @@ width="90"> Land Sale </text> - <icon - color="1 1 0.25 1" + <icon + color="0.5 0.25 1 1" follows="top|right" height="16" image_name="legend.tga" layout="topleft" mouse_opaque="true" name="square2" - left="41" - top_pad="-2" + left="20" + top_pad="2" width="16" /> <text type="string" @@ -196,21 +196,21 @@ height="16" layout="topleft" left_pad="0" - name="by_owner_label" + name="auction_label" top_delta="3" - width="100"> - by owner + width="170"> + land auction </text> - <icon - color="0.5 0.25 1 1" + <icon + color="1 1 0.25 1" follows="top|right" height="16" image_name="legend.tga" layout="topleft" mouse_opaque="true" name="square2" - left="41" - top_pad="-3" + left="20" + top_pad="-5" width="16" /> <text type="string" @@ -219,10 +219,10 @@ height="16" layout="topleft" left_pad="0" - name="auction_label" + name="by_owner_label" top_delta="3" - width="170"> - land auction + width="100"> + by owner </text> <button @@ -279,12 +279,12 @@ <icon follows="top|right" height="16" - image_name="map_event.tga" + image_name="Parcel_PG_Dark" layout="topleft" mouse_opaque="true" name="event" left_pad="0" - width="16" /> + width="18" /> <text type="string" length="1" @@ -312,13 +312,13 @@ <icon follows="top|right" height="16" - image_name="map_event_mature.tga" + image_name="Parcel_M_Dark" layout="topleft" mouse_opaque="true" name="events_mature_icon" top_delta="0" left_pad="0" - width="16" /> + width="18" /> <text type="string" length="1" @@ -345,13 +345,13 @@ <icon follows="top|right" height="16" - image_name="map_event_adult.tga" + image_name="Parcel_R_Dark" layout="topleft" left_pad="0" mouse_opaque="true" name="events_adult_icon" top_delta="0" - width="16" /> + width="18" /> <text type="string" length="1" @@ -374,7 +374,8 @@ top_pad="0" width="238" background_visible="true" - bg_alpha_color="DkGray2"> + bg_alpha_color="DkGray2" + name="layout_panel_3"> <text text_color="White" font="SansSerifLarge" @@ -394,9 +395,10 @@ <panel follows="right|top|bottom" - height="270" + height="310" top_pad="0" - width="238"> + width="238" + name="layout_panel_4"> <icon color="0.5 0 0 1" follows="top|right" @@ -493,7 +495,7 @@ top_delta="-1" name="DoSearch" tool_tip="Search for region" - width="58"> + width="62"> <button.commit_callback function="WMap.Location" /> </button> @@ -514,7 +516,7 @@ draw_stripes="false" bg_writeable_color="MouseGray" follows="all" - height="115" + height="145" layout="topleft" left="28" name="search_results" @@ -535,6 +537,7 @@ <button follows="right|bottom" height="23" + image_unselected="PushButton_On" label="Teleport" layout="topleft" left="25" @@ -638,7 +641,8 @@ top_pad="0" width="238" background_visible="true" - bg_alpha_color="DkGray2"> + bg_alpha_color="DkGray2" + name="layout_panel_5"> <text text_color="White" font="SansSerifLarge" @@ -660,7 +664,8 @@ height="30" min_height="30" top_pad="0" - width="238"> + width="238" + name="layout_panel_6"> <icon follows="left|bottom" height="16" @@ -670,7 +675,7 @@ mouse_opaque="true" name="zoom_icon" top_pad="7" - width="16" /> + width="16" ></icon> <slider follows="left|bottom" height="16" diff --git a/indra/newview/skins/default/xui/en/inspect_avatar.xml b/indra/newview/skins/default/xui/en/inspect_avatar.xml index 9796f7b5b6..194ae151d2 100644 --- a/indra/newview/skins/default/xui/en/inspect_avatar.xml +++ b/indra/newview/skins/default/xui/en/inspect_avatar.xml @@ -123,7 +123,7 @@ <button follows="top|left" height="20" - label="More" + label="Profile" layout="topleft" name="view_profile_btn" left_delta="96" diff --git a/indra/newview/skins/default/xui/en/inspect_group.xml b/indra/newview/skins/default/xui/en/inspect_group.xml index 37ae5a64d7..bcdb63228d 100644 --- a/indra/newview/skins/default/xui/en/inspect_group.xml +++ b/indra/newview/skins/default/xui/en/inspect_group.xml @@ -79,7 +79,7 @@ L$123 to join height="23" label="Join" left="8" - top="286" + top="125" name="join_btn" width="103" commit_callback.function="InspectGroup.Join"/> @@ -88,7 +88,7 @@ L$123 to join height="23" label="Leave" left="8" - top="286" + top="125" name="leave_btn" width="103" commit_callback.function="InspectGroup.Leave"/> @@ -97,7 +97,7 @@ L$123 to join height="23" label="View Profile" name="view_profile_btn" - top="286" + top="125" left="117" width="103" commit_callback.function="InspectGroup.ViewProfile" /> diff --git a/indra/newview/skins/default/xui/en/inspect_object.xml b/indra/newview/skins/default/xui/en/inspect_object.xml index 00e00b9694..8aeec46ba3 100644 --- a/indra/newview/skins/default/xui/en/inspect_object.xml +++ b/indra/newview/skins/default/xui/en/inspect_object.xml @@ -18,71 +18,61 @@ width="228"> <string name="Creator">By [CREATOR]</string> <string name="CreatorAndOwner"> -by [CREATOR] -owner [OWNER] +By [CREATOR] +Owner [OWNER] </string> <string name="Price">L$[AMOUNT]</string> <string name="PriceFree">Free!</string> <string name="Touch">Touch</string> <string name="Sit">Sit</string> <text + allow_html="false" follows="all" font="SansSerifLarge" - height="16" + height="30" left="8" name="object_name" text_color="White" - top="10" + top="6" use_ellipses="true" - value="Test Object Name That Is Really Long" + word_wrap="true" width="220" /> <text follows="all" - height="33" + height="50" left="8" name="object_creator" - top_pad="0" + top_pad="6" use_ellipses="true" width="220"> by secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about owner secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about </text> - <!-- *TODO: Replace this icon --> - <icon - name="price_icon" - image_name="Icon_For_Sale" - right="-5" - width="16" - height="16" - top="56" - follows="left|top" - /> <text follows="all" font="SansSerifSmall" font.style="BOLD" - height="16" + height="14" halign="right" - left="5" + right="-5" name="price_text" text_color="white" - top="58" + top="60" font_shadow="none" - width="196"> -L$300,000 + width="60"> +L$30,000 </text> <text - clip_partial="true" + clip_partial="true" follows="all" font="SansSerifSmall" - height="37" + height="25" left="8" name="object_description" - top_pad="0" - use_ellipses="true" + top="76" + use_ellipses="true" width="220" word_wrap="true"> -This is a really long description for an object being as how it is at least 80 characters in length and maybe more like 120 at this point. Who knows, really? </text> <!-- Overlapping buttons for all default actions. Show "Buy" if for sale, "Sit" if can sit, etc. --> @@ -90,10 +80,9 @@ This is a really long description for an object being as how it is at least 80 c follows="all" font="SansSerifSmall" height="13" - left_delta="0" name="object_media_url" - bottom_pad="2" - width="200" + width="220" + top_pad="0" max_length = "50" use_ellipses="true"> http://www.superdupertest.com diff --git a/indra/newview/skins/default/xui/en/inspector_info_ctrl.xml b/indra/newview/skins/default/xui/en/inspector_info_ctrl.xml new file mode 100644 index 0000000000..a7ecc39ed8 --- /dev/null +++ b/indra/newview/skins/default/xui/en/inspector_info_ctrl.xml @@ -0,0 +1,9 @@ +<button + chrome="true" + image_selected="Info_Over" + image_unselected="Info_Over" + image_pressed="Info_Over" + height="12" + name="inspector_info_ctrl" + width="12" /> +
\ No newline at end of file diff --git a/indra/newview/skins/default/xui/en/main_view.xml b/indra/newview/skins/default/xui/en/main_view.xml index 1d4377e339..72ab6195bc 100644 --- a/indra/newview/skins/default/xui/en/main_view.xml +++ b/indra/newview/skins/default/xui/en/main_view.xml @@ -64,8 +64,7 @@ left="0" mouse_opaque="false" name="world_stack" - orientation="vertical" - tab_stop="false"> + orientation="vertical"> <panel auto_resize="true" follows="all" height="500" @@ -74,6 +73,17 @@ mouse_opaque="false" name="hud container" width="500"> + <panel auto_resize="false" + follows="left|top" + height="19" + left="0" + mouse_opaque="false" + name="topinfo_bar_container" + tab_stop="false" + top="0" + user_resize="false" + visible="false" + width="1024"/> <panel follows="right|top|bottom" height="500" mouse_opaque="false" @@ -143,35 +153,59 @@ <panel mouse_opaque="false" follows="left|right|top" name="status_bar_container" - tab_stop="false" + tab_stop="false" height="19" left="0" top="0" width="1024" visible="false"/> - <notify_box_view top="0" - follows="all" - height="768" - mouse_opaque="false" - name="notify_container" - tab_group="-2" - width="1024"/> + <view mouse_opaque="false" + follows="all" + name="menu_bar_holder" + left="0" + top="0" + width="1024" + height="768"/> + <panel top="0" + follows="all" + mouse_opaque="false" + left="0" + name="snapshot_floater_view_holder" + width="1024" + height="798"> + <snapshot_floater_view enabled="false" + follows="all" + height="768" + left="0" + mouse_opaque="false" + name="Snapshot Floater View" + tab_stop="false" + top="0" + visible="false" + width="1024"/> + </panel> + <panel top="0" + follows="all" + height="768" + mouse_opaque="true" + name="progress_view" + filename="panel_progress.xml" + class="progress_view" + width="1024" + visible="false"/> + <panel top="0" + follows="all" + height="768" + mouse_opaque="false" + name="popup_holder" + class="popup_holder" + width="1024"/> <menu_holder top="0" follows="all" height="768" mouse_opaque="false" name="Menu Holder" width="1024"/> - <snapshot_floater_view enabled="false" - follows="all" - height="768" - left="0" - mouse_opaque="false" - name="Snapshot Floater View" - tab_stop="false" - top="0" - visible="false" - width="1024"/> <tooltip_view top="0" follows="all" height="768" diff --git a/indra/newview/skins/default/xui/en/menu_attachment_other.xml b/indra/newview/skins/default/xui/en/menu_attachment_other.xml index c5b31c7f63..b46b62ec4d 100644 --- a/indra/newview/skins/default/xui/en/menu_attachment_other.xml +++ b/indra/newview/skins/default/xui/en/menu_attachment_other.xml @@ -72,7 +72,7 @@ function="Avatar.EnableFreezeEject"/> </menu_item_call> <menu_item_call - label="Debug" + label="Debug Textures" name="Debug..."> <menu_item_call.on_click function="Avatar.Debug" /> diff --git a/indra/newview/skins/default/xui/en/menu_attachment_self.xml b/indra/newview/skins/default/xui/en/menu_attachment_self.xml index 281ec5a7c3..7239b13466 100644 --- a/indra/newview/skins/default/xui/en/menu_attachment_self.xml +++ b/indra/newview/skins/default/xui/en/menu_attachment_self.xml @@ -44,60 +44,85 @@ <menu_item_call.on_enable function="Attachment.EnableDetach" /> </menu_item_call> - <menu_item_call - enabled="false" - label="Drop" - layout="topleft" - name="Drop"> - <menu_item_call.on_click - function="Attachment.Drop" /> - <menu_item_call.on_enable - function="Attachment.EnableDrop" /> - </menu_item_call> - <menu_item_separator - layout="topleft" /> - - <menu_item_call - label="Stand Up" - layout="topleft" - name="Stand Up"> - <menu_item_call.on_click - function="Self.StandUp" - parameter="" /> - <menu_item_call.on_enable - function="Self.EnableStandUp" /> - </menu_item_call> - <menu_item_call - label="My Appearance" - name="Appearance..."> - <menu_item_call.on_click - function="CustomizeAvatar" /> - <menu_item_call.on_enable - function="Edit.EnableCustomizeAvatar" /> - </menu_item_call> - <menu_item_call - label="My Friends" - layout="topleft" - name="Friends..."> - <menu_item_call.on_click - function="SideTray.PanelPeopleTab" - parameter="friends_panel" /> - </menu_item_call> - <menu_item_call - label="My Groups" - layout="topleft" - name="Groups..."> - <menu_item_call.on_click - function="SideTray.PanelPeopleTab" - parameter="groups_panel" /> - </menu_item_call> - <menu_item_call - label="My Profile" - layout="topleft" - name="Profile..."> - <menu_item_call.on_click - function="ShowAgentProfile" - parameter="agent" /> - </menu_item_call> - + <menu_item_separator + layout="topleft" /> + + <menu_item_call +label="Stand Up" +layout="topleft" +name="Stand Up"> + <menu_item_call.on_click + function="Self.StandUp" + parameter="" /> + <menu_item_call.on_enable + function="Self.EnableStandUp" /> + </menu_item_call> + <menu_item_call + label="Change Outfit" + name="Change Outfit"> + <menu_item_call.on_click + function="CustomizeAvatar" /> + <menu_item_call.on_enable + function="Edit.EnableCustomizeAvatar" /> + </menu_item_call> + <menu_item_call label="Edit My Outfit" +layout="topleft" +name="Edit Outfit"> + <menu_item_call.on_click + function="EditOutfit" /> + <menu_item_call.on_enable + function="Edit.EnableCustomizeAvatar" /> + </menu_item_call> + <menu_item_call label="Edit My Shape" + layout="topleft" + name="Edit My Shape"> + <menu_item_call.on_click + function="EditShape" /> + <menu_item_call.on_enable + function="Edit.EnableEditShape" /> + </menu_item_call> + <menu_item_call + label="My Friends" + layout="topleft" + name="Friends..."> + <menu_item_call.on_click + function="SideTray.PanelPeopleTab" + parameter="friends_panel" /> + </menu_item_call> + <menu_item_call + label="My Groups" + layout="topleft" + name="Groups..."> + <menu_item_call.on_click + function="SideTray.PanelPeopleTab" + parameter="groups_panel" /> + </menu_item_call> + <menu_item_call + label="My Profile" + layout="topleft" + name="Profile..."> + <menu_item_call.on_click + function="ShowAgentProfile" + parameter="agent" /> + </menu_item_call> + <menu_item_call + label="Debug Textures" + name="Debug..."> + <menu_item_call.on_click + function="Avatar.Debug" /> + <menu_item_call.on_visible + function="IsGodCustomerService"/> + </menu_item_call> + <menu_item_separator + layout="topleft" /> + <menu_item_call + enabled="false" + label="Drop" + layout="topleft" + name="Drop"> + <menu_item_call.on_click + function="Attachment.Drop" /> + <menu_item_call.on_enable + function="Attachment.EnableDrop" /> + </menu_item_call> </context_menu> diff --git a/indra/newview/skins/default/xui/en/menu_avatar_other.xml b/indra/newview/skins/default/xui/en/menu_avatar_other.xml index ac9101cfd9..276b5f106f 100644 --- a/indra/newview/skins/default/xui/en/menu_avatar_other.xml +++ b/indra/newview/skins/default/xui/en/menu_avatar_other.xml @@ -72,7 +72,7 @@ function="Avatar.EnableFreezeEject"/> </menu_item_call> <menu_item_call - label="Debug" + label="Debug Textures" name="Debug..."> <menu_item_call.on_click function="Avatar.Debug" /> diff --git a/indra/newview/skins/default/xui/en/menu_avatar_self.xml b/indra/newview/skins/default/xui/en/menu_avatar_self.xml index 1e32cfd9df..d5b993152a 100644 --- a/indra/newview/skins/default/xui/en/menu_avatar_self.xml +++ b/indra/newview/skins/default/xui/en/menu_avatar_self.xml @@ -183,14 +183,30 @@ </menu_item_call> </context_menu> <menu_item_call - label="My Appearance" + label="Change Outfit" layout="topleft" - name="Appearance..."> + name="Chenge Outfit"> <menu_item_call.on_click function="CustomizeAvatar" /> <menu_item_call.on_enable function="Edit.EnableCustomizeAvatar" /> </menu_item_call> + <menu_item_call label="Edit My Outfit" + layout="topleft" + name="Edit Outfit"> + <menu_item_call.on_click + function="EditOutfit" /> + <menu_item_call.on_enable + function="Edit.EnableCustomizeAvatar" /> + </menu_item_call> + <menu_item_call label="Edit My Shape" + layout="topleft" + name="Edit My Shape"> + <menu_item_call.on_click + function="EditShape" /> + <menu_item_call.on_enable + function="Edit.EnableEditShape" /> + </menu_item_call> <menu_item_call label="My Friends" layout="topleft" @@ -215,4 +231,12 @@ function="ShowAgentProfile" parameter="agent" /> </menu_item_call> + <menu_item_call + label="Debug Textures" + name="Debug..."> + <menu_item_call.on_click + function="Avatar.Debug" /> + <menu_item_call.on_visible + function="IsGodCustomerService"/> + </menu_item_call> </context_menu> diff --git a/indra/newview/skins/default/xui/en/menu_bottomtray.xml b/indra/newview/skins/default/xui/en/menu_bottomtray.xml index 7ef91a1d85..5beafef4e4 100644 --- a/indra/newview/skins/default/xui/en/menu_bottomtray.xml +++ b/indra/newview/skins/default/xui/en/menu_bottomtray.xml @@ -52,6 +52,50 @@ function="CheckControl" parameter="ShowSnapshotButton" /> </menu_item_check> + <menu_item_check + label="Build button" + layout="topleft" + name="ShowBuildButton"> + <menu_item_check.on_click + function="ToggleControl" + parameter="ShowBuildButton" /> + <menu_item_check.on_check + function="CheckControl" + parameter="ShowBuildButton" /> + </menu_item_check> + <menu_item_check + label="Search button" + layout="topleft" + name="ShowSearchButton"> + <menu_item_check.on_click + function="ToggleControl" + parameter="ShowSearchButton" /> + <menu_item_check.on_check + function="CheckControl" + parameter="ShowSearchButton" /> + </menu_item_check> + <menu_item_check + label="Map button" + layout="topleft" + name="ShowWorldMapButton"> + <menu_item_check.on_click + function="ToggleControl" + parameter="ShowWorldMapButton" /> + <menu_item_check.on_check + function="CheckControl" + parameter="ShowWorldMapButton" /> + </menu_item_check> + <menu_item_check + label="Mini-Map button" + layout="topleft" + name="ShowMiniMapButton"> + <menu_item_check.on_click + function="ToggleControl" + parameter="ShowMiniMapButton" /> + <menu_item_check.on_check + function="CheckControl" + parameter="ShowMiniMapButton" /> + </menu_item_check> <menu_item_separator name="Separator" /> <menu_item_call diff --git a/indra/newview/skins/default/xui/en/menu_cof_attachment.xml b/indra/newview/skins/default/xui/en/menu_cof_attachment.xml new file mode 100644 index 0000000000..c402100fb1 --- /dev/null +++ b/indra/newview/skins/default/xui/en/menu_cof_attachment.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<context_menu + layout="topleft" + name="COF Attachment"> + <menu_item_call + label="Detach" + layout="topleft" + name="detach"> + <on_click + function="Attachment.Detach" + parameter="detach"/> + </menu_item_call> +</context_menu> diff --git a/indra/newview/skins/default/xui/en/menu_cof_body_part.xml b/indra/newview/skins/default/xui/en/menu_cof_body_part.xml new file mode 100644 index 0000000000..f0e8461360 --- /dev/null +++ b/indra/newview/skins/default/xui/en/menu_cof_body_part.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<context_menu + layout="topleft" + name="COF Body"> + <menu_item_call + label="Replace" + layout="topleft" + name="replace"> + <on_click + function="BodyPart.Replace"/> + </menu_item_call> + <menu_item_call + label="Edit" + layout="topleft" + name="edit"> + <on_click + function="BodyPart.Edit"/> + <on_enable + function="BodyPart.OnEnable" + parameter="edit" /> + </menu_item_call> + <menu_item_call + label="Create New" + layout="topleft" + name="create_new" + translate="false"> + <on_click + function="BodyPart.Create"/> + <on_enable + function="BodyPart.OnEnable" + parameter="create" /> + </menu_item_call> +</context_menu> diff --git a/indra/newview/skins/default/xui/en/menu_cof_clothing.xml b/indra/newview/skins/default/xui/en/menu_cof_clothing.xml new file mode 100644 index 0000000000..12ee9b045b --- /dev/null +++ b/indra/newview/skins/default/xui/en/menu_cof_clothing.xml @@ -0,0 +1,56 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<context_menu + layout="topleft" + name="COF Clothing"> + <menu_item_call + label="Take Off" + layout="topleft" + name="take_off"> + <on_click + function="Clothing.TakeOff" /> + <on_enable + function="Clothing.OnEnable" + parameter="take_off" /> + </menu_item_call> + <menu_item_call + label="Move Up a Layer" + layout="topleft" + name="move_up"> + <on_click + function="Clothing.MoveUp" /> + <on_enable + function="Clothing.OnEnable" + parameter="move_up" /> + </menu_item_call> + <menu_item_call + label="Move Down a Layer" + layout="topleft" + name="move_down"> + <on_click + function="Clothing.MoveDown" /> + <on_enable + function="Clothing.OnEnable" + parameter="move_down" /> + </menu_item_call> + <menu_item_call + label="Edit" + layout="topleft" + name="edit"> + <on_click + function="Clothing.Edit" /> + <on_enable + function="Clothing.OnEnable" + parameter="edit" /> + </menu_item_call> + <menu_item_call + label="Create New" + layout="topleft" + name="create_new" + translate="false"> + <on_click + function="Clothing.Create"/> + <on_enable + function="Clothing.OnEnable" + parameter="create" /> + </menu_item_call> +</context_menu> diff --git a/indra/newview/skins/default/xui/en/menu_cof_gear.xml b/indra/newview/skins/default/xui/en/menu_cof_gear.xml new file mode 100644 index 0000000000..c2a11a64ec --- /dev/null +++ b/indra/newview/skins/default/xui/en/menu_cof_gear.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<menu + layout="topleft" + name="Gear COF"> + <menu + label="New Clothes" + layout="topleft" + name="COF.Gear.New_Clothes" /> + <menu + label="New Body Parts" + layout="topleft" + name="COF.Geear.New_Body_Parts" /> +</menu> diff --git a/indra/newview/skins/default/xui/en/menu_edit.xml b/indra/newview/skins/default/xui/en/menu_edit.xml new file mode 100644 index 0000000000..68f3cb532c --- /dev/null +++ b/indra/newview/skins/default/xui/en/menu_edit.xml @@ -0,0 +1,89 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<menu create_jump_keys="true" + label="Edit" + name="Edit" + visible="false"> + <menu_item_call + label="Undo" + name="Undo" + shortcut="control|Z"> + <menu_item_call.on_click + function="Edit.Undo" /> + <menu_item_call.on_enable + function="Edit.EnableUndo" /> + </menu_item_call> + <menu_item_call + label="Redo" + name="Redo" + shortcut="control|Y"> + <menu_item_call.on_click + function="Edit.Redo" /> + <menu_item_call.on_enable + function="Edit.EnableRedo" /> + </menu_item_call> + <menu_item_separator/> + <menu_item_call + label="Cut" + name="Cut" + shortcut="control|X"> + <menu_item_call.on_click + function="Edit.Cut" /> + <menu_item_call.on_enable + function="Edit.EnableCut" /> + </menu_item_call> + <menu_item_call + label="Copy" + name="Copy" + shortcut="control|C"> + <menu_item_call.on_click + function="Edit.Copy" /> + <menu_item_call.on_enable + function="Edit.EnableCopy" /> + </menu_item_call> + <menu_item_call + label="Paste" + name="Paste" + shortcut="control|V"> + <menu_item_call.on_click + function="Edit.Paste" /> + <menu_item_call.on_enable + function="Edit.EnablePaste" /> + </menu_item_call> + <menu_item_call + label="Delete" + name="Delete" + shortcut="Del"> + <menu_item_call.on_click + function="Edit.Delete" /> + <menu_item_call.on_enable + function="Edit.EnableDelete" /> + </menu_item_call> + <menu_item_call + label="Duplicate" + name="Duplicate" + shortcut="control|D"> + <menu_item_call.on_click + function="Edit.Duplicate" /> + <menu_item_call.on_enable + function="Edit.EnableDuplicate" /> + </menu_item_call> + <menu_item_separator/> + <menu_item_call + label="Select All" + name="Select All" + shortcut="control|A"> + <menu_item_call.on_click + function="Edit.SelectAll" /> + <menu_item_call.on_enable + function="Edit.EnableSelectAll" /> + </menu_item_call> + <menu_item_call + label="Deselect" + name="Deselect" + shortcut="control|E"> + <menu_item_call.on_click + function="Edit.Deselect" /> + <menu_item_call.on_enable + function="Edit.EnableDeselect" /> + </menu_item_call> +</menu>
\ No newline at end of file diff --git a/indra/newview/skins/default/xui/en/menu_group_plus.xml b/indra/newview/skins/default/xui/en/menu_group_plus.xml index e83d07baec..fce7414d80 100644 --- a/indra/newview/skins/default/xui/en/menu_group_plus.xml +++ b/indra/newview/skins/default/xui/en/menu_group_plus.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <menu name="menu_group_plus" left="0" bottom="0" visible="false" - mouse_opaque="false" opaque="true" color="MenuDefaultBgColor" drop_shadow="false"> + mouse_opaque="false"> <menu_item_call name="item_join" label="Join Group..."> <menu_item_call.on_click function="People.Group.Plus.Action" userdata="join_group" /> </menu_item_call> diff --git a/indra/newview/skins/default/xui/en/menu_hide_navbar.xml b/indra/newview/skins/default/xui/en/menu_hide_navbar.xml index a175b3103f..3f38d734b9 100644 --- a/indra/newview/skins/default/xui/en/menu_hide_navbar.xml +++ b/indra/newview/skins/default/xui/en/menu_hide_navbar.xml @@ -12,10 +12,10 @@ label="Show Navigation Bar" layout="topleft" name="ShowNavbarNavigationPanel"> - <menu_item_check.on_click + <on_click function="ToggleControl" parameter="ShowNavbarNavigationPanel" /> - <menu_item_check.on_check + <on_check function="CheckControl" parameter="ShowNavbarNavigationPanel" /> </menu_item_check> @@ -23,11 +23,22 @@ label="Show Favorites Bar" layout="topleft" name="ShowNavbarFavoritesPanel"> - <menu_item_check.on_click + <on_click function="ToggleControl" parameter="ShowNavbarFavoritesPanel" /> - <menu_item_check.on_check + <on_check function="CheckControl" parameter="ShowNavbarFavoritesPanel" /> </menu_item_check> + <menu_item_check + label="Show Mini-Location Bar" + layout="topleft" + name="ShowMiniLocationPanel"> + <on_click + function="ToggleControl" + parameter="ShowMiniLocationPanel" /> + <on_check + function="CheckControl" + parameter="ShowMiniLocationPanel" /> + </menu_item_check> </menu> diff --git a/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml index 85ec174829..334decdf58 100644 --- a/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml +++ b/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml @@ -40,6 +40,8 @@ name="teleport"> <menu_item_call.on_click function="InspectAvatar.Teleport"/> + <menu_item_call.on_enable + function="InspectAvatar.Gear.EnableTeleportOffer"/> </menu_item_call> <menu_item_call label="Invite to Group" @@ -87,7 +89,7 @@ function="InspectAvatar.VisibleFreezeEject"/> </menu_item_call> <menu_item_call - label="Debug" + label="Debug Textures" name="debug"> <menu_item_call.on_click function="Avatar.Debug"/> @@ -116,4 +118,10 @@ <menu_item_call.on_click function="InspectAvatar.Pay"/> </menu_item_call> + <menu_item_call + label="Share" + name="share"> + <menu_item_call.on_click + function="InspectAvatar.Share"/> + </menu_item_call> </menu> diff --git a/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml index 9dc2611663..ea18e02ca1 100644 --- a/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml +++ b/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml @@ -16,8 +16,8 @@ function="Self.EnableStandUp" /> </menu_item_call> <menu_item_call - label="My Appearance" - name="my_appearance"> + label="Change Outfit" + name="change_outfit"> <menu_item_call.on_click function="CustomizeAvatar" /> <menu_item_call.on_enable @@ -45,4 +45,12 @@ function="SideTray.PanelPeopleTab" parameter="groups_panel" /> </menu_item_call> + <menu_item_call + label="Debug Textures" + name="Debug..."> + <menu_item_call.on_click + function="Avatar.Debug" /> + <menu_item_call.on_visible + function="IsGodCustomerService"/> + </menu_item_call> </menu> diff --git a/indra/newview/skins/default/xui/en/menu_inv_offer_chiclet.xml b/indra/newview/skins/default/xui/en/menu_inv_offer_chiclet.xml new file mode 100644 index 0000000000..45a0a6635b --- /dev/null +++ b/indra/newview/skins/default/xui/en/menu_inv_offer_chiclet.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<menu + height="101" + layout="topleft" + left="100" + mouse_opaque="false" + name="InvOfferChiclet Menu" + top="724" + visible="false" + width="128"> + <menu_item_call + label="Close" + layout="topleft" + name="Close"> + <menu_item_call.on_click + function="InvOfferChiclet.Action" + parameter="end" /> + </menu_item_call> +</menu> diff --git a/indra/newview/skins/default/xui/en/menu_inventory.xml b/indra/newview/skins/default/xui/en/menu_inventory.xml index 2874151df5..221457ac1f 100644 --- a/indra/newview/skins/default/xui/en/menu_inventory.xml +++ b/indra/newview/skins/default/xui/en/menu_inventory.xml @@ -5,6 +5,14 @@ name="Popup" visible="false"> <menu_item_call + label="Share" + layout="topleft" + name="Share" + visible="true"> + <menu_item_call.on_click + function="Inventory.Share" /> + </menu_item_call> + <menu_item_call label="Buy" layout="topleft" name="Task Buy"> @@ -402,6 +410,14 @@ parameter="open" /> </menu_item_call> <menu_item_call + label="Open Original" + layout="topleft" + name="Open Original"> + <menu_item_call.on_click + function="Inventory.DoToSelected" + parameter="open_original" /> + </menu_item_call> + <menu_item_call label="Properties" layout="topleft" name="Properties"> @@ -646,6 +662,14 @@ parameter="wear" /> </menu_item_call> <menu_item_call + label="Add" + layout="topleft" + name="Wearable Add"> + <menu_item_call.on_click + function="Inventory.DoToSelected" + parameter="wear_add" /> + </menu_item_call> + <menu_item_call label="Take Off" layout="topleft" name="Take Off"> diff --git a/indra/newview/skins/default/xui/en/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/en/menu_inventory_gear_default.xml index 4e6a07d020..62365f7cc2 100644 --- a/indra/newview/skins/default/xui/en/menu_inventory_gear_default.xml +++ b/indra/newview/skins/default/xui/en/menu_inventory_gear_default.xml @@ -61,14 +61,6 @@ <menu_item_separator layout="topleft" /> <menu_item_call - label="Empty Trash" - layout="topleft" - name="empty_trash"> - <on_click - function="Inventory.GearDefault.Custom.Action" - parameter="empty_trash" /> - </menu_item_call> - <menu_item_call label="Empty Lost and Found" layout="topleft" name="empty_lostnfound"> @@ -111,4 +103,15 @@ function="Inventory.GearDefault.Enable" parameter="find_links" /> </menu_item_call> + <menu_item_separator + layout="topleft" /> + + <menu_item_call + label="Empty Trash" + layout="topleft" + name="empty_trash"> + <on_click + function="Inventory.GearDefault.Custom.Action" + parameter="empty_trash" /> + </menu_item_call> </menu> diff --git a/indra/newview/skins/default/xui/en/menu_login.xml b/indra/newview/skins/default/xui/en/menu_login.xml index ba74104594..9fac296e26 100644 --- a/indra/newview/skins/default/xui/en/menu_login.xml +++ b/indra/newview/skins/default/xui/en/menu_login.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <menu_bar - follows="left|top|right" + follows="left|top" height="18" layout="topleft" left_delta="0" @@ -22,21 +22,13 @@ </menu_item_call> <menu_item_separator /> <menu_item_call - label="Quit [APP_NAME]" + label="Exit [APP_NAME]" name="Quit" shortcut="control|Q"> <menu_item_call.on_click function="File.Quit" /> </menu_item_call> </menu> -<!-- Edit menu merged into the Me menu above - <menu - create_jump_keys="true" - label="Edit" - name="Edit" - width="153"> - </menu> ---> <menu create_jump_keys="true" label="Help" @@ -59,105 +51,24 @@ parameter="sl_about" /> </menu_item_call> </menu> + <menu_item_check + label="Show Debug Menu" + name="Show Debug Menu" + visible="false" + shortcut="control|alt|D"> + <on_check + function="CheckControl" + parameter="UseDebugMenus" /> + <on_click + function="ToggleControl" + parameter="UseDebugMenus" /> + </menu_item_check> <menu visible="false" create_jump_keys="true" label="Debug" name="Debug" tear_off="true"> - <!-- Need a copy of the edit menu here so keyboard shortcuts like - control-C work to copy text at login screen and About dialog (for QA) - --> - <menu - create_jump_keys="true" - label="Edit" - name="Edit" - tear_off="true"> - <menu_item_call - label="Undo" - name="Undo" - shortcut="control|Z"> - <menu_item_call.on_click - function="Edit.Undo" /> - <menu_item_call.on_enable - function="Edit.EnableUndo" /> - </menu_item_call> - <menu_item_call - label="Redo" - name="Redo" - shortcut="control|Y"> - <menu_item_call.on_click - function="Edit.Redo" /> - <menu_item_call.on_enable - function="Edit.EnableRedo" /> - </menu_item_call> - <menu_item_separator /> - <menu_item_call - label="Cut" - name="Cut" - shortcut="control|X"> - <menu_item_call.on_click - function="Edit.Cut" /> - <menu_item_call.on_enable - function="Edit.EnableCut" /> - </menu_item_call> - <menu_item_call - label="Copy" - name="Copy" - shortcut="control|C"> - <menu_item_call.on_click - function="Edit.Copy" /> - <menu_item_call.on_enable - function="Edit.EnableCopy" /> - </menu_item_call> - <menu_item_call - label="Paste" - name="Paste" - shortcut="control|V"> - <menu_item_call.on_click - function="Edit.Paste" /> - <menu_item_call.on_enable - function="Edit.EnablePaste" /> - </menu_item_call> - <menu_item_call - label="Delete" - name="Delete" - shortcut="Del"> - <menu_item_call.on_click - function="Edit.Delete" /> - <menu_item_call.on_enable - function="Edit.EnableDelete" /> - </menu_item_call> - <menu_item_call - label="Duplicate" - name="Duplicate" - shortcut="control|D"> - <menu_item_call.on_click - function="Edit.Duplicate" /> - <menu_item_call.on_enable - function="Edit.EnableDuplicate" /> - </menu_item_call> - <menu_item_separator /> - <menu_item_call - label="Select All" - name="Select All" - shortcut="control|A"> - <menu_item_call.on_click - function="Edit.SelectAll" /> - <menu_item_call.on_enable - function="Edit.EnableSelectAll" /> - </menu_item_call> - <menu_item_call - label="Deselect" - name="Deselect" - shortcut="control|E"> - <menu_item_call.on_click - function="Edit.Deselect" /> - <menu_item_call.on_enable - function="Edit.EnableDeselect" /> - </menu_item_call> - </menu> - <menu_item_separator /> <menu_item_call label="Show Debug Settings" name="Debug Settings"> @@ -270,5 +181,27 @@ function="Advanced.WebBrowserTest" parameter="http://join.secondlife.com/"/> </menu_item_call> + <menu_item_separator/> + <menu_item_check + label="Show Grid Picker" + name="Show Grid Picker" + visible="false" + shortcut="control|shift|G"> + <on_check + function="CheckControl" + parameter="ForceShowGrid" /> + <on_click + function="ToggleControl" + parameter="ForceShowGrid" /> + </menu_item_check> + <menu_item_call + label="Show Notifications Console" + name="Show Notifications Console" + visible="false" + shortcut="control|shift|5"> + <on_click + function="Floater.Toggle" + parameter="notifications_console" /> + </menu_item_call> </menu> </menu_bar> diff --git a/indra/newview/skins/default/xui/en/menu_object.xml b/indra/newview/skins/default/xui/en/menu_object.xml index 5a9509e284..6ca8766e3f 100644 --- a/indra/newview/skins/default/xui/en/menu_object.xml +++ b/indra/newview/skins/default/xui/en/menu_object.xml @@ -18,16 +18,16 @@ name="Edit..."> <menu_item_call.on_click function="Object.Edit" /> - <menu_item_call.on_visible + <menu_item_call.on_visible function="EnableEdit"/> </menu_item_call> <menu_item_call label="Build" name="Build"> <menu_item_call.on_click - function="Object.Edit" /> - <menu_item_call.on_visible - function="VisibleBuild"/> + function="Object.Build" /> + <menu_item_call.on_visible + function="EnableEdit"/> </menu_item_call> <menu_item_call enabled="false" @@ -44,11 +44,24 @@ name="Object Sit"> <menu_item_call.on_click function="Object.SitOrStand" /> + <menu_item_call.on_visible + function="Object.SitVisible" /> <menu_item_call.on_enable function="Object.EnableSitOrStand" - name="EnableSitOrStand" - parameter="Sit Here,Stand Up" /> - </menu_item_call> + name="EnableSitOrStand" /> + </menu_item_call> + <menu_item_call + enabled="false" + label="Stand Up" + name="Object Stand Up"> + <menu_item_call.on_click + function="Object.SitOrStand" /> + <menu_item_call.on_visible + function="Object.StandUpVisible" /> + <menu_item_call.on_enable + function="Object.EnableSitOrStand" + name="EnableSitOrStand" /> + </menu_item_call> <menu_item_call label="Object Profile" name="Object Inspect"> @@ -87,16 +100,6 @@ label="Remove â–¶" name="Remove"> <menu_item_call - enabled="false" - label="Take" - name="Pie Object Take"> - <menu_item_call.on_click - function="Tools.BuyOrTake" /> - <menu_item_call.on_enable - function="Tools.EnableBuyOrTake" - parameter="Buy,Take" /> - </menu_item_call> - <menu_item_call enabled="false" label="Report Abuse" name="Report Abuse..."> @@ -135,6 +138,15 @@ </context_menu> <menu_item_separator layout="topleft" /> <menu_item_call + label="Take" + layout="topleft" + name="Pie Object Take"> + <menu_item_call.on_click + function="Object.Take"/> + <menu_item_call.on_enable + function="Object.VisibleTake"/> + </menu_item_call> + <menu_item_call enabled="false" label="Take Copy" name="Take Copy"> diff --git a/indra/newview/skins/default/xui/en/menu_outfit_gear.xml b/indra/newview/skins/default/xui/en/menu_outfit_gear.xml new file mode 100644 index 0000000000..16b33eff89 --- /dev/null +++ b/indra/newview/skins/default/xui/en/menu_outfit_gear.xml @@ -0,0 +1,191 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<menu + layout="topleft" + name="Gear Outfit"> + <menu_item_call + label="Wear - Replace Current Outfit" + layout="topleft" + name="wear"> + <on_click + function="Gear.Wear" /> + <on_enable + function="Gear.OnEnable" + parameter="wear" /> + <on_visible + function="Gear.OnVisible" + parameter="wear" /> + </menu_item_call> + <menu_item_call + label="Take Off - Remove from Current Outfit" + layout="topleft" + name="take_off"> + <on_click + function="Gear.TakeOff" /> + <on_enable + function="Gear.OnEnable" + parameter="take_off" /> + <on_visible + function="Gear.OnVisible" + parameter="take_off" /> + </menu_item_call> + + <menu_item_separator name="sepatator1" /> + <!-- copied (with minor modifications) from menu_inventory_add.xml --> + <!-- *TODO: generate dynamically? --> + <menu + height="175" + label="New Clothes" + layout="topleft" + left_delta="0" + mouse_opaque="false" + name="New Clothes" + top_pad="514" + width="125"> + <menu_item_call + label="New Shirt" + layout="topleft" + name="New Shirt"> + <menu_item_call.on_click + function="Gear.Create" + parameter="shirt" /> + </menu_item_call> + <menu_item_call + label="New Pants" + layout="topleft" + name="New Pants"> + <menu_item_call.on_click + function="Gear.Create" + parameter="pants" /> + </menu_item_call> + <menu_item_call + label="New Shoes" + layout="topleft" + name="New Shoes"> + <menu_item_call.on_click + function="Gear.Create" + parameter="shoes" /> + </menu_item_call> + <menu_item_call + label="New Socks" + layout="topleft" + name="New Socks"> + <menu_item_call.on_click + function="Gear.Create" + parameter="socks" /> + </menu_item_call> + <menu_item_call + label="New Jacket" + layout="topleft" + name="New Jacket"> + <menu_item_call.on_click + function="Gear.Create" + parameter="jacket" /> + </menu_item_call> + <menu_item_call + label="New Skirt" + layout="topleft" + name="New Skirt"> + <menu_item_call.on_click + function="Gear.Create" + parameter="skirt" /> + </menu_item_call> + <menu_item_call + label="New Gloves" + layout="topleft" + name="New Gloves"> + <menu_item_call.on_click + function="Gear.Create" + parameter="gloves" /> + </menu_item_call> + <menu_item_call + label="New Undershirt" + layout="topleft" + name="New Undershirt"> + <menu_item_call.on_click + function="Gear.Create" + parameter="undershirt" /> + </menu_item_call> + <menu_item_call + label="New Underpants" + layout="topleft" + name="New Underpants"> + <menu_item_call.on_click + function="Gear.Create" + parameter="underpants" /> + </menu_item_call> + <menu_item_call + label="New Alpha" + layout="topleft" + name="New Alpha"> + <menu_item_call.on_click + function="Gear.Create" + parameter="alpha" /> + </menu_item_call> + <menu_item_call + label="New Tattoo" + layout="topleft" + name="New Tattoo"> + <menu_item_call.on_click + function="Gear.Create" + parameter="tattoo" /> + </menu_item_call> + </menu> + <menu + height="85" + label="New Body Parts" + layout="topleft" + left_delta="0" + mouse_opaque="false" + name="New Body Parts" + top_pad="514" + width="118"> + <menu_item_call + label="New Shape" + layout="topleft" + name="New Shape"> + <menu_item_call.on_click + function="Gear.Create" + parameter="shape" /> + </menu_item_call> + <menu_item_call + label="New Skin" + layout="topleft" + name="New Skin"> + <menu_item_call.on_click + function="Gear.Create" + parameter="skin" /> + </menu_item_call> + <menu_item_call + label="New Hair" + layout="topleft" + name="New Hair"> + <menu_item_call.on_click + function="Gear.Create" + parameter="hair" /> + </menu_item_call> + <menu_item_call + label="New Eyes" + layout="topleft" + name="New Eyes"> + <menu_item_call.on_click + function="Gear.Create" + parameter="eyes" /> + </menu_item_call> + </menu> + <!-- copied from menu_inventory_add.xml --> + + <menu_item_separator name="sepatator2" /> + <menu_item_call + label="Delete Outfit" + layout="topleft" + name="delete_outfit"> + <on_click + function="Gear.Delete" /> + <on_enable + function="Gear.OnEnable" + parameter="delete" /> + <on_visible + function="Gear.OnVisible" + parameter="delete" /> + </menu_item_call> +</menu> diff --git a/indra/newview/skins/default/xui/en/menu_outfit_tab.xml b/indra/newview/skins/default/xui/en/menu_outfit_tab.xml new file mode 100644 index 0000000000..9c3151fe07 --- /dev/null +++ b/indra/newview/skins/default/xui/en/menu_outfit_tab.xml @@ -0,0 +1,72 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<context_menu + layout="topleft" + name="Outfit"> + <menu_item_call + label="Wear - Replace Current Outfit" + layout="topleft" + name="wear_replace"> + <on_click + function="Outfit.WearReplace" /> + <on_visible + function="Outfit.OnVisible" + parameter="wear_replace" /> + </menu_item_call> + <menu_item_call + label="Wear - Add to Current Outfit" + layout="topleft" + name="wear_add"> + <on_click + function="Outfit.WearAdd" /> + <on_enable + function="Outfit.OnEnable" + parameter="wear_add" /> + <on_visible + function="Outfit.OnVisible" + parameter="wear_add" /> + </menu_item_call> + <menu_item_call + label="Take Off - Remove from Current Outfit" + layout="topleft" + name="take_off"> + <on_click + function="Outfit.TakeOff" /> + <on_enable + function="Outfit.OnEnable" + parameter="take_off" /> + <on_visible + function="Outfit.OnVisible" + parameter="take_off" /> + </menu_item_call> + <menu_item_call + label="Edit Outfit" + layout="topleft" + name="edit"> + <on_click + function="Outfit.Edit" /> + <on_visible + function="Outfit.OnVisible" + parameter="edit" /> + </menu_item_call> + <menu_item_separator /> + <menu_item_call + label="Rename Outfit" + layout="topleft" + name="rename"> + <on_click + function="Outfit.Rename" /> + <on_enable + function="Outfit.OnEnable" + parameter="rename" /> + </menu_item_call> + <menu_item_call + label="Delete Outfit" + layout="topleft" + name="delete"> + <on_click + function="Outfit.Delete" /> + <on_visible + function="Outfit.OnVisible" + parameter="delete" /> + </menu_item_call> +</context_menu> diff --git a/indra/newview/skins/default/xui/en/menu_participant_list.xml b/indra/newview/skins/default/xui/en/menu_participant_list.xml index d03a7e3d41..4ed5807808 100644 --- a/indra/newview/skins/default/xui/en/menu_participant_list.xml +++ b/indra/newview/skins/default/xui/en/menu_participant_list.xml @@ -6,38 +6,41 @@ label="Sort by Name" layout="topleft" name="SortByName"> - <menu_item_check.on_click - function="ParticipantList.Sort" - parameter="sort_by_name" /> - <menu_item_check.on_check + <on_check function="ParticipantList.CheckItem" parameter="is_sorted_by_name" /> + <on_click + function="ParticipantList.Sort" + parameter="sort_by_name" /> </menu_item_check> <menu_item_check label="Sort by Recent Speakers" layout="topleft" name="SortByRecentSpeakers"> - <menu_item_check.on_click - function="ParticipantList.Sort" - parameter="sort_by_recent_speakers" /> - <menu_item_check.on_check + <on_check function="ParticipantList.CheckItem" parameter="is_sorted_by_recent_speakers" /> + <on_click + function="ParticipantList.Sort" + parameter="sort_by_recent_speakers" /> </menu_item_check> <menu_item_call label="View Profile" layout="topleft" name="View Profile"> - <menu_item_call.on_click + <on_click function="Avatar.Profile" /> + <on_enable + function="ParticipantList.EnableItem" + parameter="can_view_profile" /> </menu_item_call> <menu_item_call label="Add Friend" layout="topleft" name="Add Friend"> - <menu_item_call.on_click + <on_click function="Avatar.AddFriend" /> - <menu_item_call.on_enable + <on_enable function="ParticipantList.EnableItem" parameter="can_add" /> </menu_item_call> @@ -45,9 +48,9 @@ label="IM" layout="topleft" name="IM"> - <menu_item_call.on_click + <on_click function="Avatar.IM" /> - <menu_item_call.on_enable + <on_enable function="ParticipantList.EnableItem" parameter="can_im" /> </menu_item_call> @@ -55,20 +58,19 @@ label="Call" layout="topleft" name="Call"> - <menu_item_call.on_click + <on_click function="Avatar.Call" /> - <menu_item_call.on_enable + <on_enable function="ParticipantList.EnableItem" parameter="can_call" /> </menu_item_call> <menu_item_call - enabled="true" label="Share" layout="topleft" name="Share"> - <menu_item_call.on_click + <on_click function="Avatar.Share" /> - <menu_item_call.on_enable + <on_enable function="ParticipantList.EnableItem" parameter="can_share" /> </menu_item_call> @@ -76,24 +78,38 @@ label="Pay" layout="topleft" name="Pay"> - <menu_item_call.on_click + <on_click function="Avatar.Pay" /> - <menu_item_call.on_enable + <on_enable function="ParticipantList.EnableItem" parameter="can_pay" /> </menu_item_call> - <menu_item_separator - layout="topleft" /> + <menu_item_separator + layout="topleft" + name="View Icons Separator" /> + <menu_item_check + label="View People Icons" + layout="topleft" + name="View Icons"> + <on_check + function="CheckControl" + parameter="ParticipantListShowIcons" /> + <on_click + function="ToggleControl" + parameter="ParticipantListShowIcons" /> + </menu_item_check> + <menu_item_separator + layout="topleft" /> <menu_item_check label="Block Voice" layout="topleft" name="Block/Unblock"> - <menu_item_check.on_click - function="Avatar.BlockUnblock" /> - <menu_item_check.on_check + <on_check function="ParticipantList.CheckItem" parameter="is_blocked" /> - <menu_item_check.on_enable + <on_click + function="Avatar.BlockUnblock" /> + <on_enable function="ParticipantList.EnableItem" parameter="can_block" /> </menu_item_check> @@ -110,71 +126,72 @@ function="ParticipantList.EnableItem" parameter="can_mute_text" /> </menu_item_check> - <menu_item_separator - layout="topleft" /> + <menu_item_separator + layout="topleft" + name="Moderator Options Separator"/> <context_menu label="Moderator Options >" layout="topleft" - name="Moderator Options" > - <menu_item_check - label="Allow text chat" - layout="topleft" - name="AllowTextChat"> - <on_check - function="ParticipantList.CheckItem" - parameter="is_allowed_text_chat" /> - <on_click - function="ParticipantList.ToggleAllowTextChat" /> - <on_enable - function="ParticipantList.EnableItem" - parameter="can_allow_text_chat" /> - </menu_item_check> - <menu_item_separator - layout="topleft" - name="moderate_voice_separator" /> - <menu_item_call - label="Mute this participant" - layout="topleft" - name="ModerateVoiceMuteSelected"> - <on_click - function="ParticipantList.ModerateVoice" - parameter="selected" /> - <on_enable - function="ParticipantList.EnableItem" - parameter="can_moderate_voice" /> - </menu_item_call> - <menu_item_call - label="Mute everyone else" - layout="topleft" - name="ModerateVoiceMuteOthers"> - <on_click - function="ParticipantList.ModerateVoice" - parameter="others" /> - <on_enable - function="ParticipantList.EnableItem" - parameter="can_moderate_voice" /> - </menu_item_call> - <menu_item_call - label="Unmute this participant" - layout="topleft" - name="ModerateVoiceUnMuteSelected"> - <on_click - function="ParticipantList.ModerateVoice" - parameter="selected" /> - <on_enable - function="ParticipantList.EnableItem" - parameter="can_moderate_voice" /> - </menu_item_call> - <menu_item_call - label="Unmute everyone else" - layout="topleft" - name="ModerateVoiceUnMuteOthers"> - <on_click - function="ParticipantList.ModerateVoice" - parameter="others" /> - <on_enable - function="ParticipantList.EnableItem" - parameter="can_moderate_voice" /> - </menu_item_call> + name="Moderator Options"> + <menu_item_check + label="Allow text chat" + layout="topleft" + name="AllowTextChat"> + <on_check + function="ParticipantList.CheckItem" + parameter="is_allowed_text_chat" /> + <on_click + function="ParticipantList.ToggleAllowTextChat" /> + <on_enable + function="ParticipantList.EnableItem" + parameter="can_allow_text_chat" /> + </menu_item_check> + <menu_item_separator + layout="topleft" + name="moderate_voice_separator" /> + <menu_item_call + label="Mute this participant" + layout="topleft" + name="ModerateVoiceMuteSelected"> + <on_click + function="ParticipantList.ModerateVoice" + parameter="selected" /> + <on_enable + function="ParticipantList.EnableItem.Moderate" + parameter="can_moderate_voice" /> + </menu_item_call> + <menu_item_call + label="Unmute this participant" + layout="topleft" + name="ModerateVoiceUnMuteSelected"> + <on_click + function="ParticipantList.ModerateVoice" + parameter="selected" /> + <on_enable + function="ParticipantList.EnableItem.Moderate" + parameter="can_moderate_voice" /> + </menu_item_call> + <menu_item_call + label="Mute everyone" + layout="topleft" + name="ModerateVoiceMute"> + <on_click + function="ParticipantList.ModerateVoice" + parameter="mute_all" /> + <on_enable + function="ParticipantList.EnableItem.Moderate" + parameter="can_moderate_voice" /> + </menu_item_call> + <menu_item_call + label="Unmute everyone" + layout="topleft" + name="ModerateVoiceUnmute"> + <on_click + function="ParticipantList.ModerateVoice" + parameter="unmute_all" /> + <on_enable + function="ParticipantList.EnableItem.Moderate" + parameter="can_moderate_voice" /> + </menu_item_call> </context_menu> </context_menu> diff --git a/indra/newview/skins/default/xui/en/menu_people_friends_view_sort.xml b/indra/newview/skins/default/xui/en/menu_people_friends_view_sort.xml index f1117d1419..92752a0fee 100644 --- a/indra/newview/skins/default/xui/en/menu_people_friends_view_sort.xml +++ b/indra/newview/skins/default/xui/en/menu_people_friends_view_sort.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <menu name="menu_group_plus" left="0" bottom="0" visible="false" - mouse_opaque="false" opaque="true" color="MenuDefaultBgColor" drop_shadow="false"> + mouse_opaque="false"> <menu_item_check label="Sort by Name" name="sort_name"> diff --git a/indra/newview/skins/default/xui/en/menu_people_groups.xml b/indra/newview/skins/default/xui/en/menu_people_groups.xml index afa680139d..8f89d37dbb 100644 --- a/indra/newview/skins/default/xui/en/menu_people_groups.xml +++ b/indra/newview/skins/default/xui/en/menu_people_groups.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <menu name="menu_group_plus" left="0" bottom="0" visible="false" - mouse_opaque="false" opaque="true" color="MenuDefaultBgColor" drop_shadow="false"> + mouse_opaque="false" opaque="true" color="MenuDefaultBgColor"> <menu_item_call label="View Info" name="View Info"> diff --git a/indra/newview/skins/default/xui/en/menu_people_groups_view_sort.xml b/indra/newview/skins/default/xui/en/menu_people_groups_view_sort.xml index df3cb26b04..2efb204ffb 100644 --- a/indra/newview/skins/default/xui/en/menu_people_groups_view_sort.xml +++ b/indra/newview/skins/default/xui/en/menu_people_groups_view_sort.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <menu name="menu_group_plus" left="0" bottom="0" visible="false" - mouse_opaque="false" opaque="true" color="MenuDefaultBgColor" drop_shadow="false"> + mouse_opaque="false"> <menu_item_check label="Display Group Icons" layout="topleft" diff --git a/indra/newview/skins/default/xui/en/menu_people_nearby.xml b/indra/newview/skins/default/xui/en/menu_people_nearby.xml index c4da1df017..d2e35e4cc0 100644 --- a/indra/newview/skins/default/xui/en/menu_people_nearby.xml +++ b/indra/newview/skins/default/xui/en/menu_people_nearby.xml @@ -20,6 +20,16 @@ parameter="can_add" /> </menu_item_call> <menu_item_call + label="Remove Friend" + layout="topleft" + name="Remove Friend"> + <menu_item_call.on_click + function="Avatar.RemoveFriend" /> + <menu_item_call.on_enable + function="Avatar.EnableItem" + parameter="can_delete" /> + </menu_item_call> + <menu_item_call label="IM" layout="topleft" name="IM"> @@ -37,6 +47,16 @@ parameter="can_call" /> </menu_item_call> <menu_item_call + label="Map" + layout="topleft" + name="Map"> + <menu_item_call.on_click + function="Avatar.ShowOnMap" /> + <menu_item_call.on_enable + function="Avatar.EnableItem" + parameter="can_show_on_map" /> + </menu_item_call> + <menu_item_call label="Share" layout="topleft" name="Share"> @@ -68,5 +88,8 @@ name="teleport"> <menu_item_call.on_click function="Avatar.OfferTeleport"/> + <menu_item_call.on_enable + function="Avatar.EnableItem" + parameter="can_offer_teleport"/> </menu_item_call> </context_menu> diff --git a/indra/newview/skins/default/xui/en/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/en/menu_people_nearby_multiselect.xml index 0d3dd3366d..588342595e 100644 --- a/indra/newview/skins/default/xui/en/menu_people_nearby_multiselect.xml +++ b/indra/newview/skins/default/xui/en/menu_people_nearby_multiselect.xml @@ -14,6 +14,16 @@ parameter="can_add" /> </menu_item_call> <menu_item_call + label="Remove Friends" + layout="topleft" + name="Remove Friend"> + <menu_item_call.on_click + function="Avatar.RemoveFriend" /> + <menu_item_call.on_enable + function="Avatar.EnableItem" + parameter="can_delete" /> + </menu_item_call> + <menu_item_call label="IM" layout="topleft" name="IM"> diff --git a/indra/newview/skins/default/xui/en/menu_people_nearby_view_sort.xml b/indra/newview/skins/default/xui/en/menu_people_nearby_view_sort.xml index 39f9e48609..69b3831738 100644 --- a/indra/newview/skins/default/xui/en/menu_people_nearby_view_sort.xml +++ b/indra/newview/skins/default/xui/en/menu_people_nearby_view_sort.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <menu name="menu_group_plus" left="0" bottom="0" visible="false" - mouse_opaque="false" opaque="true" color="MenuDefaultBgColor" drop_shadow="false"> + mouse_opaque="false"> <menu_item_check label="Sort by Recent Speakers" name="sort_by_recent_speakers"> diff --git a/indra/newview/skins/default/xui/en/menu_people_recent_view_sort.xml b/indra/newview/skins/default/xui/en/menu_people_recent_view_sort.xml index cfd6dc78b6..5c9555db92 100644 --- a/indra/newview/skins/default/xui/en/menu_people_recent_view_sort.xml +++ b/indra/newview/skins/default/xui/en/menu_people_recent_view_sort.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <menu name="menu_group_plus" left="0" bottom="0" visible="false" - mouse_opaque="false" opaque="true" color="MenuDefaultBgColor" drop_shadow="false"> + mouse_opaque="false"> <menu_item_check label="Sort by Most Recent" name="sort_most"> diff --git a/indra/newview/skins/default/xui/en/menu_picks.xml b/indra/newview/skins/default/xui/en/menu_picks.xml index 7e07a97016..ebb49c9004 100644 --- a/indra/newview/skins/default/xui/en/menu_picks.xml +++ b/indra/newview/skins/default/xui/en/menu_picks.xml @@ -8,6 +8,9 @@ name="pick_info"> <menu_item_call.on_click function="Pick.Info" /> + <menu_item_call.on_enable + function="Pick.Enable" + parameter="info" /> </menu_item_call> <menu_item_call label="Edit" @@ -16,6 +19,9 @@ visible="false"> <menu_item_call.on_click function="Pick.Edit" /> + <menu_item_call.on_enable + function="Pick.Enable" + parameter="edit" /> </menu_item_call> <menu_item_call label="Teleport" @@ -23,6 +29,9 @@ name="pick_teleport"> <menu_item_call.on_click function="Pick.Teleport" /> + <menu_item_call.on_enable + function="Pick.Enable" + parameter="teleport" /> </menu_item_call> <menu_item_call label="Map" @@ -30,6 +39,9 @@ name="pick_map"> <menu_item_call.on_click function="Pick.Map" /> + <menu_item_call.on_enable + function="Pick.Enable" + parameter="map" /> </menu_item_call> <menu_item_separator layout="topleft" @@ -42,5 +54,8 @@ visible="false"> <menu_item_call.on_click function="Pick.Delete" /> + <menu_item_call.on_enable + function="Pick.Enable" + parameter="delete" /> </menu_item_call> </context_menu> diff --git a/indra/newview/skins/default/xui/en/menu_places_gear_folder.xml b/indra/newview/skins/default/xui/en/menu_places_gear_folder.xml index 9b3948b29b..3e38503e43 100644 --- a/indra/newview/skins/default/xui/en/menu_places_gear_folder.xml +++ b/indra/newview/skins/default/xui/en/menu_places_gear_folder.xml @@ -45,6 +45,9 @@ <on_click function="Places.LandmarksGear.CopyPaste.Action" parameter="copy" /> + <on_enable + function="Places.LandmarksGear.Enable" + parameter="copy" /> </menu_item_call> <menu_item_call label="Paste" @@ -88,6 +91,9 @@ <on_click function="Places.LandmarksGear.Folding.Action" parameter="expand" /> + <on_enable + function="Places.LandmarksGear.Enable" + parameter="expand" /> </menu_item_call> <menu_item_call label="Collapse" @@ -96,6 +102,9 @@ <on_click function="Places.LandmarksGear.Folding.Action" parameter="collapse" /> + <on_enable + function="Places.LandmarksGear.Enable" + parameter="collapse" /> </menu_item_call> <menu_item_call label="Expand all folders" diff --git a/indra/newview/skins/default/xui/en/menu_profile_overflow.xml b/indra/newview/skins/default/xui/en/menu_profile_overflow.xml index 407ce14e81..b0b7b554b0 100644 --- a/indra/newview/skins/default/xui/en/menu_profile_overflow.xml +++ b/indra/newview/skins/default/xui/en/menu_profile_overflow.xml @@ -6,6 +6,15 @@ name="profile_overflow_menu" width="120"> <menu_item_call + label="Map" + layout="topleft" + name="show_on_map"> + <menu_item_call.on_click + function="Profile.ShowOnMap" /> + <menu_item_call.on_enable + function="Profile.EnableShowOnMap" /> + </menu_item_call> + <menu_item_call label="Pay" layout="topleft" name="pay"> @@ -19,19 +28,22 @@ <menu_item_call.on_click function="Profile.Share" /> </menu_item_call> - <menu_item_check - label="Block/Unblock" - layout="topleft" - name="block_unblock"> - <menu_item_check.on_click - function="Profile.BlockUnblock" /> - <menu_item_check.on_check - function="Profile.CheckItem" - parameter="is_blocked" /> - <menu_item_check.on_enable - function="Profile.EnableItem" - parameter="can_block" /> - </menu_item_check> + <menu_item_call + label="Block" + name="block"> + <menu_item_call.on_click + function="Profile.BlockUnblock"/> + <menu_item_call.on_visible + function="Profile.EnableBlock" /> + </menu_item_call> + <menu_item_call + label="Unblock" + name="unblock"> + <menu_item_call.on_click + function="Profile.BlockUnblock"/> + <menu_item_call.on_visible + function="Profile.EnableUnblock" /> + </menu_item_call> <menu_item_call label="Kick" layout="topleft" diff --git a/indra/newview/skins/default/xui/en/menu_save_outfit.xml b/indra/newview/skins/default/xui/en/menu_save_outfit.xml new file mode 100644 index 0000000000..6285bf7417 --- /dev/null +++ b/indra/newview/skins/default/xui/en/menu_save_outfit.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<toggleable_menu + height="201" + layout="topleft" + mouse_opaque="false" + name="save_outfit_menu" + width="120"> + <menu_item_call + name="save_outfit" + label="Save"> + <menu_item_call.on_click + function="Outfit.Save.Action" + userdata=""/> + </menu_item_call> + <menu_item_call + name="save_as_new_outfit" + label="Save As"> + <menu_item_call.on_click + function="Outfit.SaveAs.Action" + userdata="" /> + </menu_item_call> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/en/menu_script_chiclet.xml b/indra/newview/skins/default/xui/en/menu_script_chiclet.xml new file mode 100644 index 0000000000..db29d9cebc --- /dev/null +++ b/indra/newview/skins/default/xui/en/menu_script_chiclet.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<menu + height="101" + layout="topleft" + left="100" + mouse_opaque="false" + name="ScriptChiclet Menu" + top="724" + visible="false" + width="128"> + <menu_item_call + label="Close" + layout="topleft" + name="Close"> + <menu_item_call.on_click + function="ScriptChiclet.Action" + parameter="end" /> + </menu_item_call> +</menu> diff --git a/indra/newview/skins/default/xui/en/menu_topinfobar.xml b/indra/newview/skins/default/xui/en/menu_topinfobar.xml new file mode 100644 index 0000000000..cbe249ed4d --- /dev/null +++ b/indra/newview/skins/default/xui/en/menu_topinfobar.xml @@ -0,0 +1,51 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<menu + height="201" + layout="topleft" + left="100" + mouse_opaque="false" + name="menu_topinfobar" + top="624" + visible="false" + width="128"> + <menu_item_check + label="Show Coordinates" + name="Show Coordinates"> + <on_click + function="ToggleControl" + parameter="NavBarShowCoordinates" /> + <on_check + function="CheckControl" + parameter="NavBarShowCoordinates" /> + </menu_item_check> + <menu_item_check + label="Show Parcel Properties" + name="Show Parcel Properties"> + <on_click + function="ToggleControl" + parameter="NavBarShowParcelProperties" /> + <on_check + function="CheckControl" + parameter="NavBarShowParcelProperties" /> + </menu_item_check> + <menu_item_separator + name="Separator" /> + <!-- Label of 'Landmark' item is changing in runtime, + see AddLandmarkNavBarMenu/EditLandmarkNavBarMenu in strings.xml --> + <menu_item_call + label="Landmark" + name="Landmark"> + <on_click + function="TopInfoBar.Action" + parameter="landmark" /> + </menu_item_call> + <menu_item_separator + name="Separator" /> + <menu_item_call + label="Copy" + name="Copy"> + <on_click + function="TopInfoBar.Action" + parameter="copy" /> + </menu_item_call> +</menu> diff --git a/indra/newview/skins/default/xui/en/menu_url_agent.xml b/indra/newview/skins/default/xui/en/menu_url_agent.xml index fa05dac148..73f0fa7979 100644 --- a/indra/newview/skins/default/xui/en/menu_url_agent.xml +++ b/indra/newview/skins/default/xui/en/menu_url_agent.xml @@ -7,7 +7,7 @@ layout="topleft" name="show_agent"> <menu_item_call.on_click - function="Url.Execute" /> + function="Url.ShowProfile" /> </menu_item_call> <menu_item_separator layout="topleft" /> diff --git a/indra/newview/skins/default/xui/en/menu_url_group.xml b/indra/newview/skins/default/xui/en/menu_url_group.xml index c5eaf94d22..2cb125ce09 100644 --- a/indra/newview/skins/default/xui/en/menu_url_group.xml +++ b/indra/newview/skins/default/xui/en/menu_url_group.xml @@ -7,7 +7,7 @@ layout="topleft" name="show_group"> <menu_item_call.on_click - function="Url.Execute" /> + function="Url.ShowProfile" /> </menu_item_call> <menu_item_separator layout="topleft" /> diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 22f4d277a4..3557318705 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -2,16 +2,13 @@ <menu_bar bg_visible="false" follows="left|top|right" - layout="topleft" name="Main Menu"> <menu label="Me" - layout="topleft" name="Me" tear_off="true"> <menu_item_call label="Preferences" - layout="topleft" name="Preferences" shortcut="control|P"> <menu_item_call.on_click @@ -20,7 +17,6 @@ </menu_item_call> <menu_item_call label="My Dashboard" - layout="topleft" name="Manage My Account"> <menu_item_call.on_click function="PromptShowURL" @@ -29,25 +25,21 @@ </menu_item_call> <menu_item_call label="Buy L$" - layout="topleft" name="Buy and Sell L$"> <menu_item_call.on_click function="BuyCurrency" /> </menu_item_call> - <menu_item_separator - layout="topleft" /> + <menu_item_separator/> <menu_item_call label="My Profile" - layout="topleft" name="Profile"> <menu_item_call.on_click function="ShowAgentProfile" parameter="agent" /> </menu_item_call> <menu_item_call - label="My Appearance" - layout="topleft" - name="Appearance"> + label="Change Outfit" + name="ChangeOutfit"> <menu_item_call.on_click function="CustomizeAvatar" /> <menu_item_call.on_enable @@ -55,9 +47,9 @@ </menu_item_call> <menu_item_check label="My Inventory" - layout="topleft" name="Inventory" - shortcut="control|shift|I"> + shortcut="control|shift|I" + visible="false"> <menu_item_check.on_check function="Floater.Visible" parameter="inventory" /> @@ -65,41 +57,52 @@ function="Floater.Toggle" parameter="inventory" /> </menu_item_check> - <menu_item_call - label="Show Inventory in Side Tray" + <menu_item_check + label="My Inventory" name="ShowSidetrayInventory" shortcut="control|I" - visible="false"> - <menu_item_call.on_click + visible="true"> + <menu_item_check.on_check + function="SidetrayPanelVisible" + parameter="sidepanel_inventory" /> + <menu_item_check.on_click function="ShowSidetrayPanel" parameter="sidepanel_inventory" /> - </menu_item_call> - <menu_item_call + </menu_item_check> + <menu_item_check label="My Gestures" - layout="topleft" name="Gestures" shortcut="control|G"> - <menu_item_call.on_click + <menu_item_check.on_check + function="Floater.Visible" + parameter="gestures" /> + <menu_item_check.on_click function="Floater.Toggle" parameter="gestures" /> - </menu_item_call> + </menu_item_check> + <menu_item_check + label="My Voice" + name="ShowVoice" + visibility_control="VoiceMorphingEnabled"> + <menu_item_check.on_check + function="Floater.Visible" + parameter="voice_effect" /> + <menu_item_check.on_click + function="Floater.Toggle" + parameter="voice_effect" /> + </menu_item_check> <menu label="My Status" - layout="topleft" name="Status" tear_off="true"> <menu_item_call label="Away" - layout="topleft" name="Set Away"> <menu_item_call.on_click function="World.SetAway" /> </menu_item_call> - <menu_item_separator - layout="topleft"/> <menu_item_call label="Busy" - layout="topleft" name="Set Busy"> <menu_item_call.on_click function="World.SetBusy"/> @@ -107,7 +110,6 @@ </menu> <menu_item_call label="Request Admin Status" - layout="topleft" name="Request Admin Options" shortcut="control|alt|G" visible="false"> @@ -116,18 +118,15 @@ </menu_item_call> <menu_item_call label="Leave Admin Status" - layout="topleft" name="Leave Admin Options" shortcut="control|alt|shift|G" visible="false"> <menu_item_call.on_click function="Advanced.LeaveAdminStatus" /> </menu_item_call> - <menu_item_separator - layout="topleft" /> + <menu_item_separator/> <menu_item_call - label="Quit [APP_NAME]" - layout="topleft" + label="Exit [APP_NAME]" name="Quit" shortcut="control|Q"> <menu_item_call.on_click @@ -136,12 +135,10 @@ </menu> <menu label="Communicate" - layout="topleft" name="Communicate" tear_off="true"> <menu_item_call label="My Friends" - layout="topleft" name="My Friends" shortcut="control|shift|F"> <menu_item_call.on_click @@ -150,26 +147,24 @@ </menu_item_call> <menu_item_call label="My Groups" - layout="topleft" - name="My Groups"> + name="My Groups" + shortcut="control|shift|G"> <menu_item_call.on_click function="SideTray.PanelPeopleTab" parameter="groups_panel" /> </menu_item_call> - <menu_item_separator - layout="topleft" /> + <menu_item_separator/> <!--menu_item_call label="Chat" - layout="topleft" name="Chat"> <menu_item_call.on_click function="World.Chat" /> </menu_item_call--> <menu_item_check label="Nearby Chat" - layout="topleft" name="Nearby Chat" - shortcut="control|H"> + shortcut="control|H" + use_mac_ctrl="true"> <menu_item_check.on_check function="Floater.Visible" parameter="nearby_chat" /> @@ -179,34 +174,19 @@ </menu_item_check> <menu_item_call label="Nearby People" - layout="topleft" name="Active Speakers" shortcut="control|shift|A"> <menu_item_call.on_click function="SideTray.PanelPeopleTab" parameter="nearby_panel" /> </menu_item_call> - <menu_item_check - label="Nearby Media" - layout="topleft" - name="Nearby Media" - shortcut="control|alt|N"> - <menu_item_check.on_check - function="Floater.Visible" - parameter="nearby_media" /> - <menu_item_check.on_click - function="Floater.Toggle" - parameter="nearby_media" /> - </menu_item_check> </menu> <menu label="World" - layout="topleft" name="World" tear_off="true"> <menu_item_check label="Mini-Map" - layout="topleft" name="Mini-Map" shortcut="control|shift|M"> <menu_item_check.on_check @@ -218,7 +198,6 @@ </menu_item_check> <menu_item_check label="World Map" - layout="topleft" name="World Map" shortcut="control|M" use_mac_ctrl="true"> @@ -231,7 +210,6 @@ </menu_item_check> <menu_item_call label="Snapshot" - layout="topleft" name="Take Snapshot" shortcut="control|shift|S"> <menu_item_call.on_click @@ -240,7 +218,6 @@ </menu_item_call> <menu_item_call label="Landmark This Place" - layout="topleft" name="Create Landmark Here"> <menu_item_call.on_click function="World.CreateLandmark" /> @@ -250,12 +227,17 @@ <menu create_jump_keys="true" label="Place Profile" - layout="topleft" name="Land" tear_off="true"> <menu_item_call - label="About Land" + label="Place Profile" layout="topleft" + name="Place Profile"> + <menu_item_call.on_click + function="World.PlaceProfile" /> + </menu_item_call> + <menu_item_call + label="About Land" name="About Land"> <menu_item_call.on_click function="Floater.Show" @@ -263,18 +245,15 @@ </menu_item_call> <menu_item_call label="Region/Estate" - layout="topleft" name="Region/Estate"> <menu_item_call.on_click function="Floater.Show" parameter="region_info" /> </menu_item_call> </menu> - <menu_item_separator - layout="topleft" /> + <menu_item_separator/> <menu_item_call label="Buy This Land" - layout="topleft" name="Buy Land"> <menu_item_call.on_click function="Land.Buy" /> @@ -283,7 +262,6 @@ </menu_item_call> <menu_item_call label="My Land" - layout="topleft" name="My Land"> <menu_item_call.on_click function="Floater.Show" @@ -292,34 +270,28 @@ <menu create_jump_keys="true" label="Show" - layout="topleft" name="LandShow" tear_off="true"> <menu_item_check label="Move Controls" - layout="topleft" name="Movement Controls"> <menu_item_check.on_check function="Floater.Visible" parameter="moveview" /> <menu_item_check.on_click - function="Floater.Toggle" - parameter="moveview" /> + function="World.Toggle.MovementControls" /> </menu_item_check> <menu_item_check label="View Controls" - layout="topleft" name="Camera Controls"> <menu_item_check.on_check function="Floater.Visible" parameter="camera" /> <menu_item_check.on_click - function="Floater.Toggle" - parameter="camera" /> + function="World.Toggle.CameraControls" /> </menu_item_check> <menu_item_check label="Ban Lines" - layout="topleft" name="Ban Lines"> <menu_item_check.on_check control="ShowBanLines" /> @@ -329,7 +301,6 @@ </menu_item_check> <menu_item_check label="Beacons" - layout="topleft" name="beacons" shortcut="control|alt|shift|N"> <menu_item_check.on_check @@ -341,7 +312,6 @@ </menu_item_check> <menu_item_check label="Property Lines" - layout="topleft" name="Property Lines" shortcut="control|alt|shift|P"> <menu_item_check.on_check @@ -352,7 +322,6 @@ </menu_item_check> <menu_item_check label="Land Owners" - layout="topleft" name="Land Owners"> <menu_item_check.on_check control="ShowParcelOwners" /> @@ -360,12 +329,28 @@ function="ToggleControl" parameter="ShowParcelOwners" /> </menu_item_check> + <menu_item_check + label="Coordinates" + name="Coordinates"> + <menu_item_check.on_click + function="ToggleControl" + parameter="NavBarShowCoordinates" /> + <menu_item_check.on_check + control="NavBarShowCoordinates" /> + </menu_item_check> + <menu_item_check + label="Parcel Properties" + name="Parcel Properties"> + <menu_item_check.on_click + function="ToggleControl" + parameter="NavBarShowParcelProperties" /> + <menu_item_check.on_check + control="NavBarShowParcelProperties" /> + </menu_item_check> </menu> - <menu_item_separator - layout="topleft" /> + <menu_item_separator/> <menu_item_call label="Teleport Home" - layout="topleft" name="Teleport Home" shortcut="control|shift|H"> <menu_item_call.on_click @@ -375,7 +360,6 @@ </menu_item_call> <menu_item_call label="Set Home to Here" - layout="topleft" name="Set Home to Here"> <menu_item_call.on_click function="World.SetHomeLocation" /> @@ -384,7 +368,6 @@ </menu_item_call> <!-- <menu_item_check label="Show Navigation Bar" - layout="topleft" name="ShowNavbarNavigationPanel"> <menu_item_check.on_click function="ToggleControl" @@ -395,7 +378,6 @@ </menu_item_check> <menu_item_check label="Show Favorites Bar" - layout="topleft" name="ShowNavbarFavoritesPanel"> <menu_item_check.on_click function="ToggleControl" @@ -404,19 +386,15 @@ function="CheckControl" parameter="ShowNavbarFavoritesPanel" /> </menu_item_check> - <menu_item_separator - layout="topleft" />--> - <menu_item_separator - layout="topleft" /> + <menu_item_separator/>--> + <menu_item_separator/> <menu create_jump_keys="true" label="Sun" - layout="topleft" name="Environment Settings" tear_off="true"> <menu_item_call label="Sunrise" - layout="topleft" name="Sunrise"> <menu_item_call.on_click function="World.EnvSettings" @@ -424,7 +402,6 @@ </menu_item_call> <menu_item_call label="Midday" - layout="topleft" name="Noon" shortcut="control|shift|Y"> <menu_item_call.on_click @@ -433,7 +410,6 @@ </menu_item_call> <menu_item_call label="Sunset" - layout="topleft" name="Sunset" shortcut="control|shift|N"> <menu_item_call.on_click @@ -442,7 +418,6 @@ </menu_item_call> <menu_item_call label="Midnight" - layout="topleft" name="Midnight"> <menu_item_call.on_click function="World.EnvSettings" @@ -450,17 +425,14 @@ </menu_item_call> <menu_item_call label="Estate Time" - layout="topleft" name="Revert to Region Default"> <menu_item_call.on_click function="World.EnvSettings" parameter="default" /> </menu_item_call> - <menu_item_separator - layout="topleft" /> + <menu_item_separator/> <menu_item_call label="Environment Editor" - layout="topleft" name="Environment Editor"> <menu_item_call.on_click function="World.EnvSettings" @@ -471,13 +443,11 @@ <menu create_jump_keys="true" label="Build" - layout="topleft" name="BuildTools" tear_off="true" visible="true"> <menu_item_check label="Build" - layout="topleft" name="Show Build Tools" shortcut="control|B"> <menu_item_check.on_check @@ -490,12 +460,10 @@ <menu create_jump_keys="true" label="Select Build Tool" - layout="topleft" name="Select Tool" tear_off="true"> <menu_item_call label="Focus Tool" - layout="topleft" name="Focus" shortcut="control|1"> <menu_item_call.on_click @@ -504,7 +472,6 @@ </menu_item_call> <menu_item_call label="Move Tool" - layout="topleft" name="Move" shortcut="control|2"> <menu_item_call.on_click @@ -513,7 +480,6 @@ </menu_item_call> <menu_item_call label="Edit Tool" - layout="topleft" name="Edit" shortcut="control|3"> <menu_item_call.on_click @@ -522,7 +488,6 @@ </menu_item_call> <menu_item_call label="Create Tool" - layout="topleft" name="Create" shortcut="control|4"> <menu_item_call.on_click @@ -531,7 +496,6 @@ </menu_item_call> <menu_item_call label="Land Tool" - layout="topleft" name="Land" shortcut="control|5"> <menu_item_call.on_click @@ -539,112 +503,8 @@ parameter="land" /> </menu_item_call> </menu> - <menu - create_jump_keys="true" - label="Edit" - layout="topleft" - name="Edit" - tear_off="true"> - <menu_item_call - label="Undo" - layout="topleft" - name="Undo" - shortcut="control|Z"> - <menu_item_call.on_click - function="Edit.Undo" /> - <menu_item_call.on_enable - function="Edit.EnableUndo" /> - </menu_item_call> - <menu_item_call - label="Redo" - layout="topleft" - name="Redo" - shortcut="control|Y"> - <menu_item_call.on_click - function="Edit.Redo" /> - <menu_item_call.on_enable - function="Edit.EnableRedo" /> - </menu_item_call> - <menu_item_separator - layout="topleft" /> - <menu_item_call - label="Cut" - layout="topleft" - name="Cut" - shortcut="control|X"> - <menu_item_call.on_click - function="Edit.Cut" /> - <menu_item_call.on_enable - function="Edit.EnableCut" /> - </menu_item_call> - <menu_item_call - label="Copy" - layout="topleft" - name="Copy" - shortcut="control|C"> - <menu_item_call.on_click - function="Edit.Copy" /> - <menu_item_call.on_enable - function="Edit.EnableCopy" /> - </menu_item_call> - <menu_item_call - label="Paste" - layout="topleft" - name="Paste" - shortcut="control|V"> - <menu_item_call.on_click - function="Edit.Paste" /> - <menu_item_call.on_enable - function="Edit.EnablePaste" /> - </menu_item_call> - <menu_item_call - label="Delete" - layout="topleft" - name="Delete" - shortcut="Del"> - <menu_item_call.on_click - function="Edit.Delete" /> - <menu_item_call.on_enable - function="Edit.EnableDelete" /> - </menu_item_call> - <menu_item_call - label="Duplicate" - layout="topleft" - name="Duplicate" - shortcut="control|D"> - <menu_item_call.on_click - function="Edit.Duplicate" /> - <menu_item_call.on_enable - function="Edit.EnableDuplicate" /> - </menu_item_call> - <menu_item_separator - layout="topleft" /> - <menu_item_call - label="Select All" - layout="topleft" - name="Select All" - shortcut="control|A"> - <menu_item_call.on_click - function="Edit.SelectAll" /> - <menu_item_call.on_enable - function="Edit.EnableSelectAll" /> - </menu_item_call> - <menu_item_call - label="Deselect" - layout="topleft" - name="Deselect" - shortcut="control|E"> - <menu_item_call.on_click - function="Edit.Deselect" /> - <menu_item_call.on_enable - function="Edit.EnableDeselect" /> - </menu_item_call> - </menu> - <menu_item_separator - layout="topleft" /> <menu_item_call label="Link" - layout="topleft" name="Link" shortcut="control|L"> <menu_item_call.on_click @@ -654,7 +514,6 @@ </menu_item_call> <menu_item_call label="Unlink" - layout="topleft" name="Unlink" shortcut="control|shift|L"> <menu_item_call.on_click @@ -664,7 +523,6 @@ </menu_item_call> <menu_item_check label="Edit Linked Parts" - layout="topleft" name="Edit Linked Parts"> <menu_item_check.on_check control="EditLinkedParts" /> @@ -674,11 +532,55 @@ <menu_item_check.on_enable function="Tools.EnableToolNotPie" /> </menu_item_check> - <menu_item_separator - layout="topleft" /> + <menu + create_jump_keys="true" + label="Select Linked Parts" + name="Select Linked Parts" + tear_off="true"> + <menu_item_call + label="Select Next Part" + name="Select Next Part" + shortcut="control|."> + <menu_item_call.on_click + function="Tools.SelectNextPart" + parameter="next" /> + <menu_item_call.on_enable + function="Tools.EnableSelectNextPart" /> + </menu_item_call> + <menu_item_call + label="Select Previous Part" + name="Select Previous Part" + shortcut="control|,"> + <menu_item_call.on_click + function="Tools.SelectNextPart" + parameter="previous" /> + <menu_item_call.on_enable + function="Tools.EnableSelectNextPart" /> + </menu_item_call> + <menu_item_call + label="Include Next Part" + name="Include Next Part" + shortcut="control|shift|."> + <menu_item_call.on_click + function="Tools.SelectNextPart" + parameter="includenext" /> + <menu_item_call.on_enable + function="Tools.EnableSelectNextPart" /> + </menu_item_call> + <menu_item_call + label="Include Previous Part" + name="Include Previous Part" + shortcut="control|shift|,"> + <menu_item_call.on_click + function="Tools.SelectNextPart" + parameter="includeprevious" /> + <menu_item_call.on_enable + function="Tools.EnableSelectNextPart" /> + </menu_item_call> + </menu> + <menu_item_separator/> <menu_item_call label="Focus on Selection" - layout="topleft" name="Focus on Selection" shortcut="H"> <menu_item_call.on_click @@ -689,7 +591,6 @@ </menu_item_call> <menu_item_call label="Zoom to Selection" - layout="topleft" name="Zoom to Selection" shortcut="shift|H"> <menu_item_call.on_click @@ -698,29 +599,34 @@ <menu_item_call.on_enable function="Tools.SomethingSelectedNoHUD" /> </menu_item_call> - <menu_item_separator - layout="topleft" /> + <menu_item_separator/> <menu create_jump_keys="true" label="Object" - layout="topleft" name="Object" tear_off="true"> <menu_item_call - label="Buy" - layout="topleft" - name="Menu Object Take" - visible="true"> - <menu_item_call.on_click - function="Tools.BuyOrTake" /> - <menu_item_call.on_enable - function="Tools.EnableBuyOrTake" - name="EnableBuyOrTake" - parameter="Buy,Take" /> + label="Buy" + name="Menu Object Buy"> + <menu_item_call.on_click + function="Tools.BuyOrTake"/> + <menu_item_call.on_visible + function="Tools.VisibleBuyObject"/> + <menu_item_call.on_enable + function="Tools.EnableBuyOrTake"/> + </menu_item_call> + <menu_item_call + label="Take" + name="Menu Object Take"> + <menu_item_call.on_click + function="Tools.BuyOrTake"/> + <menu_item_call.on_visible + function="Tools.VisibleTakeObject"/> + <menu_item_call.on_enable + function="Tools.EnableBuyOrTake"/> </menu_item_call> <menu_item_call label="Take Copy" - layout="topleft" name="Take Copy"> <menu_item_call.on_click function="Tools.TakeCopy" /> @@ -729,7 +635,6 @@ </menu_item_call> <menu_item_call label="Save Back to My Inventory" - layout="topleft" name="Save Object Back to My Inventory"> <menu_item_call.on_click function="Tools.SaveToInventory" /> @@ -738,7 +643,6 @@ </menu_item_call> <menu_item_call label="Save Back to Object Contents" - layout="topleft" name="Save Object Back to Object Contents"> <menu_item_call.on_click function="Tools.SaveToObjectInventory" /> @@ -749,12 +653,10 @@ <menu create_jump_keys="true" label="Scripts" - layout="topleft" name="Scripts" tear_off="true"> <menu_item_call label="Recompile Scripts (Mono)" - layout="topleft" name="Mono"> <menu_item_call.on_click function="Tools.SelectedScriptAction" @@ -764,7 +666,6 @@ </menu_item_call> <menu_item_call label="Recompile Scripts (LSL)" - layout="topleft" name="LSL"> <menu_item_call.on_click function="Tools.SelectedScriptAction" @@ -774,7 +675,6 @@ </menu_item_call> <menu_item_call label="Reset Scripts" - layout="topleft" name="Reset Scripts"> <menu_item_call.on_click function="Tools.SelectedScriptAction" @@ -784,7 +684,6 @@ </menu_item_call> <menu_item_call label="Set Scripts to Running" - layout="topleft" name="Set Scripts to Running"> <menu_item_call.on_click function="Tools.SelectedScriptAction" @@ -794,7 +693,6 @@ </menu_item_call> <menu_item_call label="Set Scripts to Not Running" - layout="topleft" name="Set Scripts to Not Running"> <menu_item_call.on_click function="Tools.SelectedScriptAction" @@ -803,17 +701,14 @@ function="EditableSelected" /> </menu_item_call> </menu> - <menu_item_separator - layout="topleft" /> + <menu_item_separator/> <menu create_jump_keys="true" label="Options" - layout="topleft" name="Options" tear_off="true"> <menu_item_call label="Set Default Upload Permissions" - layout="topleft" name="perm prefs"> <menu_item_call.on_click function="Floater.Toggle" @@ -821,7 +716,6 @@ </menu_item_call> <menu_item_check label="Show Advanced Permissions" - layout="topleft" name="DebugPermissions"> <menu_item_check.on_check function="CheckControl" @@ -830,11 +724,9 @@ function="ToggleControl" parameter="DebugPermissions" /> </menu_item_check> - <menu_item_separator - layout="topleft" /> + <menu_item_separator/> <menu_item_check label="Select Only My Objects" - layout="topleft" name="Select Only My Objects"> <menu_item_check.on_check control="SelectOwnedOnly" /> @@ -844,7 +736,6 @@ </menu_item_check> <menu_item_check label="Select Only Movable Objects" - layout="topleft" name="Select Only Movable Objects"> <menu_item_check.on_check control="SelectMovableOnly" /> @@ -854,18 +745,15 @@ </menu_item_check> <menu_item_check label="Select By Surrounding" - layout="topleft" name="Select By Surrounding"> <menu_item_check.on_check control="RectangleSelectInclusive" /> <menu_item_check.on_click function="Tools.SelectBySurrounding" /> </menu_item_check> - <menu_item_separator - layout="topleft" /> + <menu_item_separator/> <menu_item_check label="Show Hidden Selection" - layout="topleft" name="Show Hidden Selection"> <menu_item_check.on_check control="RenderHiddenSelections" /> @@ -874,7 +762,6 @@ </menu_item_check> <menu_item_check label="Show Light Radius for Selection" - layout="topleft" name="Show Light Radius for Selection"> <menu_item_check.on_check control="RenderLightRadius" /> @@ -883,7 +770,6 @@ </menu_item_check> <menu_item_check label="Show Selection Beam" - layout="topleft" name="Show Selection Beam"> <menu_item_check.on_check control="ShowSelectionBeam" /> @@ -891,11 +777,9 @@ function="ToggleControl" parameter="ShowSelectionBeam" /> </menu_item_check> - <menu_item_separator - layout="topleft" /> + <menu_item_separator/> <menu_item_check label="Snap to Grid" - layout="topleft" name="Snap to Grid" shortcut="G"> <menu_item_check.on_check @@ -908,7 +792,6 @@ </menu_item_check> <menu_item_call label="Snap Object XY to Grid" - layout="topleft" name="Snap Object XY to Grid" shortcut="shift|X"> <menu_item_call.on_click @@ -918,7 +801,6 @@ </menu_item_call> <menu_item_call label="Use Selection for Grid" - layout="topleft" name="Use Selection for Grid" shortcut="shift|G"> <menu_item_call.on_click @@ -928,7 +810,6 @@ </menu_item_call> <menu_item_call label="Grid Options" - layout="topleft" name="Grid Options" shortcut="control|shift|B"> <menu_item_call.on_click @@ -940,100 +821,98 @@ </menu> <menu create_jump_keys="true" - label="Select Linked Parts" + label="Upload" layout="topleft" - name="Select Linked Parts" + name="Upload" tear_off="true"> <menu_item_call - label="Select Next Part" + label="Image (L$[COST])..." layout="topleft" - name="Select Next Part" - shortcut="control|."> + name="Upload Image" + shortcut="control|U"> <menu_item_call.on_click - function="Tools.SelectNextPart" - parameter="next" /> + function="File.UploadImage" + parameter="" /> <menu_item_call.on_enable - function="Tools.EnableSelectNextPart" /> + function="File.EnableUpload" /> + <menu_item_call.on_visible + function="Upload.CalculateCosts" + parameter="Upload Image" /> </menu_item_call> <menu_item_call - label="Select Previous Part" + label="Sound (L$[COST])..." layout="topleft" - name="Select Previous Part" - shortcut="control|,"> + name="Upload Sound"> <menu_item_call.on_click - function="Tools.SelectNextPart" - parameter="previous" /> + function="File.UploadSound" + parameter="" /> <menu_item_call.on_enable - function="Tools.EnableSelectNextPart" /> + function="File.EnableUpload" /> + <menu_item_call.on_visible + function="Upload.CalculateCosts" + parameter="Upload Sound" /> </menu_item_call> <menu_item_call - label="Include Next Part" + label="Animation (L$[COST])..." layout="topleft" - name="Include Next Part" - shortcut="control|shift|."> + name="Upload Animation"> <menu_item_call.on_click - function="Tools.SelectNextPart" - parameter="includenext" /> + function="File.UploadAnim" + parameter="" /> <menu_item_call.on_enable - function="Tools.EnableSelectNextPart" /> + function="File.EnableUpload" /> + <menu_item_call.on_visible + function="Upload.CalculateCosts" + parameter="Upload Animation" /> </menu_item_call> <menu_item_call - label="Include Previous Part" + label="Bulk (L$[COST] per file)..." layout="topleft" - name="Include Previous Part" - shortcut="control|shift|,"> + name="Bulk Upload"> <menu_item_call.on_click - function="Tools.SelectNextPart" - parameter="includeprevious" /> - <menu_item_call.on_enable - function="Tools.EnableSelectNextPart" /> + function="File.UploadBulk" + parameter="" /> </menu_item_call> + <menu_item_separator + layout="topleft" /> </menu> </menu> <menu label="Help" - layout="topleft" name="Help" tear_off="true"> <menu_item_call label="[SECOND_LIFE] Help" - layout="topleft" name="Second Life Help" shortcut="F1"> <menu_item_call.on_click function="ShowHelp" parameter="f1_help" /> </menu_item_call> - <!-- <menu_item_call +<!-- <menu_item_call label="Tutorial" - layout="topleft" name="Tutorial"> <menu_item_call.on_click function="Floater.Show" parameter="hud" /> </menu_item_call>--> - <menu_item_separator - layout="topleft" /> + <menu_item_separator/> <menu_item_call label="Report Abuse" - layout="topleft" name="Report Abuse"> <menu_item_call.on_click function="ReportAbuse" /> </menu_item_call> <menu_item_call label="Report Bug" - layout="topleft" name="Report Bug"> <menu_item_call.on_click function="ShowHelp" parameter="report_bug" /> </menu_item_call> - <menu_item_separator - layout="topleft" /> + <menu_item_separator/> <menu_item_call label="About [APP_NAME]" - layout="topleft" name="About Second Life"> <menu_item_call.on_click function="Floater.Show" @@ -1042,20 +921,28 @@ </menu> <menu label="Advanced" - layout="topleft" name="Advanced" tear_off="true" visible="false"> + <menu_item_check + label="Show Advanced Menu" + name="Show Advanced Menu" + shortcut="control|alt|shift|D"> + <on_check + function="CheckControl" + parameter="UseDebugMenus" /> + <on_click + function="ToggleControl" + parameter="UseDebugMenus" /> + </menu_item_check> <menu_item_call label="Stop Animating Me" - layout="topleft" name="Stop Animating My Avatar"> <menu_item_call.on_click function="Tools.StopAllAnimations" /> </menu_item_call> <menu_item_call label="Rebake Textures" - layout="topleft" name="Rebake Texture" shortcut="control|alt|R"> <menu_item_call.on_click @@ -1063,7 +950,6 @@ </menu_item_call> <menu_item_call label="Set UI Size to Default" - layout="topleft" name="Set UI Size to Default"> <menu_item_call.on_click function="View.DefaultUISize" /> @@ -1078,7 +964,6 @@ <menu_item_separator/> <menu_item_check label="Limit Select Distance" - layout="topleft" name="Limit Select Distance"> <menu_item_check.on_check function="CheckControl" @@ -1089,7 +974,6 @@ </menu_item_check> <menu_item_check label="Disable Camera Constraints" - layout="topleft" name="Disable Camera Distance"> <menu_item_check.on_check function="CheckControl" @@ -1098,11 +982,9 @@ function="ToggleControl" parameter="DisableCameraConstraints" /> </menu_item_check> - <menu_item_separator - layout="topleft" /> + <menu_item_separator/> <menu_item_check label="High-res Snapshot" - layout="topleft" name="HighResSnapshot"> <menu_item_check.on_check function="CheckControl" @@ -1113,7 +995,6 @@ </menu_item_check> <menu_item_check label="Quiet Snapshots to Disk" - layout="topleft" name="QuietSnapshotsToDisk"> <menu_item_check.on_check function="CheckControl" @@ -1124,7 +1005,6 @@ </menu_item_check> <menu_item_check label="Compress Snapshots to Disk" - layout="topleft" name="CompressSnapshotsToDisk"> <menu_item_check.on_check function="CheckControl" @@ -1133,17 +1013,14 @@ function="ToggleControl" parameter="CompressSnapshotsToDisk" /> </menu_item_check> - <menu_item_separator - layout="topleft" /> + <menu_item_separator/> <menu create_jump_keys="true" label="Performance Tools" - layout="topleft" name="Performance Tools" tear_off="true"> <menu_item_call label="Lag Meter" - layout="topleft" name="Lag Meter"> <menu_item_call.on_click function="Floater.Show" @@ -1151,7 +1028,6 @@ </menu_item_call> <menu_item_check label="Statistics Bar" - layout="topleft" name="Statistics Bar" shortcut="control|shift|1"> <menu_item_check.on_check @@ -1163,7 +1039,6 @@ </menu_item_check> <menu_item_check label="Show Avatar Rendering Cost" - layout="topleft" name="Avatar Rendering Cost"> <menu_item_check.on_check function="Advanced.CheckInfoDisplay" @@ -1176,12 +1051,10 @@ <menu create_jump_keys="true" label="Highlighting and Visibility" - layout="topleft" name="Highlighting and Visibility" tear_off="true"> <menu_item_check label="Cheesy Beacon" - layout="topleft" name="Cheesy Beacon"> <menu_item_check.on_check function="CheckControl" @@ -1192,7 +1065,6 @@ </menu_item_check> <menu_item_check label="Hide Particles" - layout="topleft" name="Hide Particles" shortcut="control|alt|shift|="> <menu_item_check.on_check @@ -1204,7 +1076,6 @@ </menu_item_check> <menu_item_check label="Hide Selected" - layout="topleft" name="Hide Selected"> <menu_item_check.on_check function="CheckControl" @@ -1215,7 +1086,6 @@ </menu_item_check> <menu_item_check label="Highlight Transparent" - layout="topleft" name="Highlight Transparent" shortcut="control|alt|T"> <menu_item_check.on_check @@ -1225,7 +1095,6 @@ </menu_item_check> <menu_item_check label="Show HUD Attachments" - layout="topleft" name="Show HUD Attachments" shortcut="alt|shift|H"> <menu_item_check.on_check @@ -1235,7 +1104,6 @@ </menu_item_check> <menu_item_check label="Show Mouselook Crosshairs" - layout="topleft" name="ShowCrosshairs"> <menu_item_check.on_check function="CheckControl" @@ -1247,12 +1115,10 @@ <!-- <menu create_jump_keys="true" label="Hover Tips" - layout="topleft" name="Hover Tips" tear_off="true"> <menu_item_check label="Show Tips" - layout="topleft" name="Show Tips" shortcut="control|shift|T"> <menu_item_check.on_check @@ -1260,11 +1126,9 @@ <menu_item_check.on_click function="View.ShowHoverTips" /> </menu_item_check> - <menu_item_separator - layout="topleft" />--> + <menu_item_separator/> <menu_item_check label="Show Land Tooltips" - layout="topleft" name="Land Tips"> <menu_item_check.on_check control="ShowLandHoverTip" /> @@ -1274,9 +1138,8 @@ <menu_item_check.on_enable function="View.CheckShowHoverTips" /> </menu_item_check> - <!-- <menu_item_check + <menu_item_check label="Show Tips On All Objects" - layout="topleft" name="Tips On All Objects"> <menu_item_check.on_check control="ShowAllObjectHoverTip" /> @@ -1293,12 +1156,10 @@ <menu create_jump_keys="true" label="Rendering Types" - layout="topleft" name="Rendering Types" tear_off="true"> <menu_item_check label="Simple" - layout="topleft" name="Simple" shortcut="control|alt|shift|1"> <menu_item_check.on_check @@ -1310,7 +1171,6 @@ </menu_item_check> <menu_item_check label="Alpha" - layout="topleft" name="Alpha" shortcut="control|alt|shift|2"> <menu_item_check.on_check @@ -1322,7 +1182,6 @@ </menu_item_check> <menu_item_check label="Tree" - layout="topleft" name="Tree" shortcut="control|alt|shift|3"> <menu_item_check.on_check @@ -1334,7 +1193,6 @@ </menu_item_check> <menu_item_check label="Avatars" - layout="topleft" name="Character" shortcut="control|alt|shift|4"> <menu_item_check.on_check @@ -1346,7 +1204,6 @@ </menu_item_check> <menu_item_check label="SurfacePath" - layout="topleft" name="SurfacePath" shortcut="control|alt|shift|5"> <menu_item_check.on_check @@ -1358,7 +1215,6 @@ </menu_item_check> <menu_item_check label="Sky" - layout="topleft" name="Sky" shortcut="control|alt|shift|6"> <menu_item_check.on_check @@ -1370,7 +1226,6 @@ </menu_item_check> <menu_item_check label="Water" - layout="topleft" name="Water" shortcut="control|alt|shift|7"> <menu_item_check.on_check @@ -1382,7 +1237,6 @@ </menu_item_check> <menu_item_check label="Ground" - layout="topleft" name="Ground" shortcut="control|alt|shift|8"> <menu_item_check.on_check @@ -1394,7 +1248,6 @@ </menu_item_check> <menu_item_check label="Volume" - layout="topleft" name="Volume" shortcut="control|alt|shift|9"> <menu_item_check.on_check @@ -1406,7 +1259,6 @@ </menu_item_check> <menu_item_check label="Grass" - layout="topleft" name="Grass" shortcut="control|alt|shift|0"> <menu_item_check.on_check @@ -1418,7 +1270,6 @@ </menu_item_check> <menu_item_check label="Clouds" - layout="topleft" name="Clouds" shortcut="control|alt|shift|-"> <menu_item_check.on_check @@ -1430,7 +1281,6 @@ </menu_item_check> <menu_item_check label="Particles" - layout="topleft" name="Particles" shortcut="control|alt|shift|="> <menu_item_check.on_check @@ -1442,7 +1292,6 @@ </menu_item_check> <menu_item_check label="Bump" - layout="topleft" name="Bump" shortcut="control|alt|shift|\"> <menu_item_check.on_check @@ -1456,12 +1305,10 @@ <menu create_jump_keys="true" label="Rendering Features" - layout="topleft" name="Rendering Features" tear_off="true"> <menu_item_check label="UI" - layout="topleft" name="UI" shortcut="control|alt|F1"> <menu_item_check.on_check @@ -1473,7 +1320,6 @@ </menu_item_check> <menu_item_check label="Selected" - layout="topleft" name="Selected" shortcut="control|alt|F2"> <menu_item_check.on_check @@ -1485,7 +1331,6 @@ </menu_item_check> <menu_item_check label="Highlighted" - layout="topleft" name="Highlighted" shortcut="control|alt|F3"> <menu_item_check.on_check @@ -1497,7 +1342,6 @@ </menu_item_check> <menu_item_check label="Dynamic Textures" - layout="topleft" name="Dynamic Textures" shortcut="control|alt|F4"> <menu_item_check.on_check @@ -1509,7 +1353,6 @@ </menu_item_check> <menu_item_check label="Foot Shadows" - layout="topleft" name="Foot Shadows" shortcut="control|alt|F5"> <menu_item_check.on_check @@ -1521,7 +1364,6 @@ </menu_item_check> <menu_item_check label="Fog" - layout="topleft" name="Fog" shortcut="control|alt|F6"> <menu_item_check.on_check @@ -1533,7 +1375,6 @@ </menu_item_check> <menu_item_check label="Test FRInfo" - layout="topleft" name="Test FRInfo" shortcut="control|alt|F8"> <menu_item_check.on_check @@ -1545,7 +1386,6 @@ </menu_item_check> <menu_item_check label="Flexible Objects" - layout="topleft" name="Flexible Objects" shortcut="control|alt|F9"> <menu_item_check.on_check @@ -1558,7 +1398,6 @@ </menu> <menu_item_check label="Run Multiple Threads" - layout="topleft" name="Run Multiple Threads"> <menu_item_check.on_check function="CheckControl" @@ -1567,9 +1406,18 @@ function="ToggleControl" parameter="RunMultipleThreads" /> </menu_item_check> + <menu_item_check + label="Use Plugin Read Thread" + name="Use Plugin Read Thread"> + <menu_item_check.on_check + function="CheckControl" + parameter="PluginUseReadThread" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="PluginUseReadThread" /> + </menu_item_check> <menu_item_call label="Clear Group Cache" - layout="topleft" name="ClearGroupCache"> <menu_item_call.on_click function="Advanced.ClearGroupCache" @@ -1577,7 +1425,6 @@ </menu_item_call> <menu_item_check label="Mouse Smoothing" - layout="topleft" name="Mouse Smoothing"> <menu_item_check.on_check function="CheckControl" @@ -1586,17 +1433,24 @@ function="ToggleControl" parameter="MouseSmooth" /> </menu_item_check> - <menu_item_separator - layout="topleft" /> + <menu_item_separator/> <menu label="Shortcuts" - layout="topleft" name="Shortcuts" tear_off="true" visible="false"> + <menu_item_call + label="Image (L$[COST])..." + name="Upload Image" + shortcut="control|U"> + <menu_item_call.on_click + function="File.UploadImage" + parameter="" /> + <menu_item_call.on_enable + function="File.EnableUpload" /> + </menu_item_call> <menu_item_check label="Search" - layout="topleft" name="Search" shortcut="control|F"> <menu_item_check.on_check @@ -1609,7 +1463,6 @@ <menu_item_call enabled="false" label="Release Keys" - layout="topleft" name="Release Keys"> <menu_item_call.on_click function="Tools.ReleaseKeys" @@ -1620,16 +1473,25 @@ </menu_item_call> <menu_item_call label="Set UI Size to Default" - layout="topleft" name="Set UI Size to Default"> <menu_item_call.on_click function="View.DefaultUISize" /> </menu_item_call> - <menu_item_separator - layout="topleft" /> + <!-- This second, alternative shortcut for Show Advanced Menu is for backward compatibility. The main shortcut has been changed so it's Linux-friendly, where the old shortcut is typically eaten by the window manager. --> + <menu_item_check + label="Show Advanced Menu - legacy shortcut" + name="Show Advanced Menu - legacy shortcut" + shortcut="control|alt|D"> + <on_check + function="CheckControl" + parameter="UseDebugMenus" /> + <on_click + function="ToggleControl" + parameter="UseDebugMenus" /> + </menu_item_check> + <menu_item_separator/> <menu_item_check label="Always Run" - layout="topleft" name="Always Run" shortcut="control|R"> <menu_item_check.on_check @@ -1639,7 +1501,6 @@ </menu_item_check> <menu_item_check label="Fly" - layout="topleft" name="Fly" shortcut="Home"> <menu_item_check.on_check @@ -1649,11 +1510,9 @@ <menu_item_check.on_enable function="Agent.enableFlying" /> </menu_item_check> - <menu_item_separator - layout="topleft" /> + <menu_item_separator/> <menu_item_call label="Close Window" - layout="topleft" name="Close Window" shortcut="control|W"> <menu_item_call.on_click @@ -1663,7 +1522,6 @@ </menu_item_call> <menu_item_call label="Close All Windows" - layout="topleft" name="Close All Windows" shortcut="control|shift|W"> <menu_item_call.on_click @@ -1671,22 +1529,18 @@ <menu_item_call.on_enable function="File.EnableCloseAllWindows" /> </menu_item_call> - <menu_item_separator - layout="topleft" /> + <menu_item_separator/> <menu_item_call label="Snapshot to Disk" - layout="topleft" name="Snapshot to Disk" shortcut="control|`" use_mac_ctrl="true"> <menu_item_call.on_click function="File.TakeSnapshotToDisk" /> </menu_item_call> - <menu_item_separator - layout="topleft" /> + <menu_item_separator/> <menu_item_call label="Mouselook" - layout="topleft" name="Mouselook" shortcut="M"> <menu_item_call.on_click @@ -1696,7 +1550,6 @@ </menu_item_call> <menu_item_check label="Joystick Flycam" - layout="topleft" name="Joystick Flycam" shortcut="alt|shift|F"> <menu_item_check.on_check @@ -1708,7 +1561,6 @@ </menu_item_check> <menu_item_call label="Reset View" - layout="topleft" name="Reset View" shortcut="Esc"> <menu_item_call.on_click @@ -1716,7 +1568,6 @@ </menu_item_call> <menu_item_call label="Look at Last Chatter" - layout="topleft" name="Look at Last Chatter" shortcut="control|\"> <menu_item_call.on_click @@ -1724,17 +1575,14 @@ <menu_item_call.on_enable function="View.EnableLastChatter" /> </menu_item_call> - <menu_item_separator - layout="topleft" /> + <menu_item_separator/> <menu create_jump_keys="true" label="Select Build Tool" - layout="topleft" name="Select Tool" tear_off="true"> <menu_item_call label="Focus Tool" - layout="topleft" name="Focus" shortcut="control|1"> <menu_item_call.on_click @@ -1743,7 +1591,6 @@ </menu_item_call> <menu_item_call label="Move Tool" - layout="topleft" name="Move" shortcut="control|2"> <menu_item_call.on_click @@ -1752,7 +1599,6 @@ </menu_item_call> <menu_item_call label="Edit Tool" - layout="topleft" name="Edit" shortcut="control|3"> <menu_item_call.on_click @@ -1761,7 +1607,6 @@ </menu_item_call> <menu_item_call label="Create Tool" - layout="topleft" name="Create" shortcut="control|4"> <menu_item_call.on_click @@ -1770,7 +1615,6 @@ </menu_item_call> <menu_item_call label="Land Tool" - layout="topleft" name="Land" shortcut="control|5"> <menu_item_call.on_click @@ -1778,11 +1622,9 @@ parameter="land" /> </menu_item_call> </menu> - <menu_item_separator - layout="topleft" /> + <menu_item_separator/> <menu_item_call label="Zoom In" - layout="topleft" name="Zoom In" shortcut="control|0"> <menu_item_call.on_click @@ -1790,7 +1632,6 @@ </menu_item_call> <menu_item_call label="Zoom Default" - layout="topleft" name="Zoom Default" shortcut="control|9"> <menu_item_call.on_click @@ -1798,29 +1639,15 @@ </menu_item_call> <menu_item_call label="Zoom Out" - layout="topleft" name="Zoom Out" shortcut="control|8"> <menu_item_call.on_click function="View.ZoomOut" /> </menu_item_call> - <menu_item_separator - layout="topleft" /> - <menu_item_call - label="Toggle Fullscreen" - layout="topleft" - name="Toggle Fullscreen" - > - <!-- Note: shortcut="alt|Enter" was deleted from the preceding node--> - <menu_item_call.on_click - function="View.Fullscreen" /> - </menu_item_call> </menu> - <menu_item_separator - layout="topleft" /> + <menu_item_separator/> <menu_item_call label="Show Debug Settings" - layout="topleft" name="Debug Settings"> <menu_item_call.on_click function="Advanced.ShowDebugSettings" @@ -1828,7 +1655,6 @@ </menu_item_call> <menu_item_check label="Show Develop Menu" - layout="topleft" name="Debug Mode" shortcut="control|alt|Q"> <menu_item_check.on_check @@ -1842,19 +1668,16 @@ <menu create_jump_keys="true" label="Develop" - layout="topleft" name="Develop" tear_off="true" visible="false"> <menu create_jump_keys="true" label="Consoles" - layout="topleft" name="Consoles" tear_off="true"> <menu_item_check label="Texture Console" - layout="topleft" name="Texture Console" shortcut="control|shift|3" use_mac_ctrl="true"> @@ -1867,7 +1690,6 @@ </menu_item_check> <menu_item_check label="Debug Console" - layout="topleft" name="Debug Console" shortcut="control|shift|4" use_mac_ctrl="true"> @@ -1880,7 +1702,6 @@ </menu_item_check> <menu_item_call label="Notifications Console" - layout="topleft" name="Notifications" shortcut="control|shift|5"> <menu_item_call.on_click @@ -1889,7 +1710,6 @@ </menu_item_call> <menu_item_check label="Texture Size Console" - layout="topleft" name="Texture Size" shortcut="control|shift|6"> <menu_item_check.on_check @@ -1901,7 +1721,6 @@ </menu_item_check> <menu_item_check label="Texture Category Console" - layout="topleft" name="Texture Category" shortcut="control|shift|7"> <menu_item_check.on_check @@ -1913,7 +1732,6 @@ </menu_item_check> <menu_item_check label="Fast Timers" - layout="topleft" name="Fast Timers" shortcut="control|shift|9" use_mac_ctrl="true"> @@ -1926,7 +1744,6 @@ </menu_item_check> <menu_item_check label="Memory" - layout="topleft" name="Memory" shortcut="control|shift|0" use_mac_ctrl="true"> @@ -1937,11 +1754,9 @@ function="Advanced.ToggleConsole" parameter="memory view" /> </menu_item_check> - <menu_item_separator - layout="topleft" /> + <menu_item_separator/> <menu_item_call label="Region Info to Debug Console" - layout="topleft" name="Region Info to Debug Console"> <menu_item_call.on_click function="Advanced.DumpInfoToConsole" @@ -1949,7 +1764,6 @@ </menu_item_call> <menu_item_call label="Group Info to Debug Console" - layout="topleft" name="Group Info to Debug Console"> <menu_item_call.on_click function="Advanced.DumpInfoToConsole" @@ -1957,17 +1771,14 @@ </menu_item_call> <menu_item_call label="Capabilities Info to Debug Console" - layout="topleft" name="Capabilities Info to Debug Console"> <menu_item_call.on_click function="Advanced.DumpInfoToConsole" parameter="capabilities" /> </menu_item_call> - <menu_item_separator - layout="topleft" /> + <menu_item_separator/> <menu_item_check label="Camera" - layout="topleft" name="Camera"> <menu_item_check.on_check function="Advanced.CheckHUDInfo" @@ -1978,7 +1789,6 @@ </menu_item_check> <menu_item_check label="Wind" - layout="topleft" name="Wind"> <menu_item_check.on_check function="Advanced.CheckHUDInfo" @@ -1989,7 +1799,6 @@ </menu_item_check> <menu_item_check label="FOV" - layout="topleft" name="FOV"> <menu_item_check.on_check function="Advanced.CheckHUDInfo" @@ -2000,7 +1809,6 @@ </menu_item_check> <menu_item_check label="Badge" - layout="topleft" name="Badge" shortcut="alt|control|shift|h"> <menu_item_check.on_check @@ -2014,12 +1822,10 @@ <menu create_jump_keys="true" label="Show Info" - layout="topleft" name="Display Info" tear_off="true"> <menu_item_check label="Show Time" - layout="topleft" name="Show Time"> <menu_item_check.on_check function="CheckControl" @@ -2030,7 +1836,6 @@ </menu_item_check> <menu_item_check label="Show Render Info" - layout="topleft" name="Show Render Info"> <menu_item_check.on_check function="CheckControl" @@ -2041,7 +1846,6 @@ </menu_item_check> <menu_item_check label="Show Matrices" - layout="topleft" name="Show Matrices"> <menu_item_check.on_check function="CheckControl" @@ -2052,7 +1856,6 @@ </menu_item_check> <menu_item_check label="Show Color Under Cursor" - layout="topleft" name="Show Color Under Cursor"> <menu_item_check.on_check function="CheckControl" @@ -2061,11 +1864,9 @@ function="ToggleControl" parameter="DebugShowColor" /> </menu_item_check> - <menu_item_separator - layout="topleft" /> + <menu_item_separator/> <menu_item_check label="Show Updates to Objects" - layout="topleft" name="Show Updates" shortcut="control|alt|shift|U"> <menu_item_check.on_check @@ -2075,17 +1876,14 @@ function="Advanced.ToggleShowObjectUpdates" /> </menu_item_check> </menu> - <menu_item_separator - layout="topleft" /> + <menu_item_separator/> <menu create_jump_keys="true" label="Force an Error" - layout="topleft" name="Force Errors" tear_off="true"> <menu_item_call label="Force Breakpoint" - layout="topleft" name="Force Breakpoint" shortcut="control|alt|shift|B"> <menu_item_call.on_click @@ -2093,49 +1891,42 @@ </menu_item_call> <menu_item_call label="Force LLError And Crash" - layout="topleft" name="Force LLError And Crash"> <menu_item_call.on_click function="Advanced.ForceErrorLlerror" /> </menu_item_call> <menu_item_call label="Force Bad Memory Access" - layout="topleft" name="Force Bad Memory Access"> <menu_item_call.on_click function="Advanced.ForceErrorBadMemoryAccess" /> </menu_item_call> <menu_item_call label="Force Infinite Loop" - layout="topleft" name="Force Infinite Loop"> <menu_item_call.on_click function="Advanced.ForceErrorInfiniteLoop" /> </menu_item_call> <menu_item_call label="Force Driver Crash" - layout="topleft" name="Force Driver Carsh"> <menu_item_call.on_click function="Advanced.ForceErrorDriverCrash" /> </menu_item_call> <menu_item_call label="Force Software Exception" - layout="topleft" name="Force Software Exception"> <menu_item_call.on_click function="Advanced.ForceErrorSoftwareException" /> </menu_item_call> <menu_item_call label="Force Disconnect Viewer" - layout="topleft" name="Force Disconnect Viewer"> <menu_item_call.on_click function="Advanced.ForceErrorDisconnectViewer" /> </menu_item_call> <menu_item_call label="Simulate a Memory Leak" - layout="topleft" name="Memory Leaking Simulation"> <menu_item_call.on_click function="Floater.Show" @@ -2145,12 +1936,10 @@ <menu create_jump_keys="true" label="Render Tests" - layout="topleft" name="Render Tests" tear_off="true"> <menu_item_check label="Camera Offset" - layout="topleft" name="Camera Offset"> <menu_item_check.on_check function="CheckControl" @@ -2161,7 +1950,6 @@ </menu_item_check> <menu_item_check label="Randomize Framerate" - layout="topleft" name="Randomize Framerate"> <menu_item_check.on_check function="Advanced.CheckRandomizeFramerate" @@ -2171,7 +1959,6 @@ </menu_item_check> <menu_item_check label="Periodic Slow Frame" - layout="topleft" name="Periodic Slow Frame"> <menu_item_check.on_check function="Advanced.CheckPeriodicSlowFrame" @@ -2182,7 +1969,6 @@ </menu_item_check> <menu_item_check label="Frame Test" - layout="topleft" name="Frame Test"> <menu_item_check.on_check function="Advanced.CheckFrameTest" @@ -2194,12 +1980,10 @@ <menu create_jump_keys="true" label="Render Metadata" - layout="topleft" name="Render Metadata" tear_off="true"> <menu_item_check label="Bounding Boxes" - layout="topleft" name="Bounding Boxes"> <menu_item_check.on_check function="Advanced.CheckInfoDisplay" @@ -2210,7 +1994,6 @@ </menu_item_check> <menu_item_check label="Octree" - layout="topleft" name="Octree"> <menu_item_check.on_check function="Advanced.CheckInfoDisplay" @@ -2221,7 +2004,6 @@ </menu_item_check> <menu_item_check label="Shadow Frusta" - layout="topleft" name="Shadow Frusta"> <menu_item_check.on_check function="Advanced.CheckInfoDisplay" @@ -2232,7 +2014,6 @@ </menu_item_check> <menu_item_check label="Occlusion" - layout="topleft" name="Occlusion"> <menu_item_check.on_check function="Advanced.CheckInfoDisplay" @@ -2243,7 +2024,6 @@ </menu_item_check> <menu_item_check label="Render Batches" - layout="topleft" name="Render Batches"> <menu_item_check.on_check function="Advanced.CheckInfoDisplay" @@ -2254,7 +2034,6 @@ </menu_item_check> <menu_item_check label="Texture Anim" - layout="topleft" name="Texture Anim"> <menu_item_check.on_check function="Advanced.CheckInfoDisplay" @@ -2265,7 +2044,6 @@ </menu_item_check> <menu_item_check label="Texture Priority" - layout="topleft" name="Texture Priority"> <menu_item_check.on_check function="Advanced.CheckInfoDisplay" @@ -2276,7 +2054,6 @@ </menu_item_check> <menu_item_check label="Texture Area" - layout="topleft" name="Texture Area"> <menu_item_check.on_check function="Advanced.CheckInfoDisplay" @@ -2287,7 +2064,6 @@ </menu_item_check> <menu_item_check label="Face Area" - layout="topleft" name="Face Area"> <menu_item_check.on_check function="Advanced.CheckInfoDisplay" @@ -2298,7 +2074,6 @@ </menu_item_check> <menu_item_check label="Lights" - layout="topleft" name="Lights"> <menu_item_check.on_check function="Advanced.CheckInfoDisplay" @@ -2309,7 +2084,6 @@ </menu_item_check> <menu_item_check label="Collision Skeleton" - layout="topleft" name="Collision Skeleton"> <menu_item_check.on_check function="Advanced.CheckInfoDisplay" @@ -2320,7 +2094,6 @@ </menu_item_check> <menu_item_check label="Raycast" - layout="topleft" name="Raycast"> <menu_item_check.on_check function="Advanced.CheckInfoDisplay" @@ -2333,7 +2106,6 @@ <menu create_jump_keys="true" label="Rendering" - layout="topleft" name="Rendering" tear_off="true"> <menu_item_check @@ -2475,7 +2247,6 @@ </menu_item_check> <menu_item_check label="Full Res Textures" - layout="topleft" name="Rull Res Textures"> <menu_item_check.on_check function="CheckControl" @@ -2486,7 +2257,6 @@ </menu_item_check> <menu_item_check label="Audit Textures" - layout="topleft" name="Audit Textures"> <menu_item_check.on_check function="CheckControl" @@ -2540,12 +2310,10 @@ <menu create_jump_keys="true" label="Network" - layout="topleft" name="Network" tear_off="true"> <menu_item_check label="Pause Agent" - layout="topleft" name="AgentPause"> <menu_item_check.on_check function="CheckControl" @@ -2554,27 +2322,22 @@ function="ToggleControl" parameter="AgentPause" /> </menu_item_check> - <menu_item_separator - layout="topleft" /> + <menu_item_separator/> <menu_item_call label="Enable Message Log" - layout="topleft" name="Enable Message Log"> <menu_item_call.on_click function="Advanced.EnableMessageLog" /> </menu_item_call> <menu_item_call label="Disable Message Log" - layout="topleft" name="Disable Message Log"> <menu_item_call.on_click function="Advanced.DisableMessageLog" /> </menu_item_call> - <menu_item_separator - layout="topleft" /> + <menu_item_separator/> <menu_item_check label="Velocity Interpolate Objects" - layout="topleft" name="Velocity Interpolate Objects"> <menu_item_check.on_check function="CheckControl" @@ -2585,7 +2348,6 @@ </menu_item_check> <menu_item_check label="Ping Interpolate Object Positions" - layout="topleft" name="Ping Interpolate Object Positions"> <menu_item_check.on_check function="CheckControl" @@ -2594,11 +2356,9 @@ function="ToggleControl" parameter="PingInterpolate" /> </menu_item_check> - <menu_item_separator - layout="topleft" /> + <menu_item_separator/> <menu_item_call label="Drop a Packet" - layout="topleft" name="Drop a Packet" shortcut="control|alt|L"> <menu_item_call.on_click @@ -2607,14 +2367,12 @@ </menu> <menu_item_call label="Dump Scripted Camera" - layout="topleft" name="Dump Scripted Camera"> <menu_item_call.on_click function="Advanced.DumpScriptedCamera" /> </menu_item_call> <menu_item_call label="Bumps, Pushes & Hits" - layout="topleft" name="Bumps, Pushes &amp; Hits"> <menu_item_call.on_click function="Floater.Show" @@ -2624,12 +2382,10 @@ <menu create_jump_keys="true" label="Recorder" - layout="topleft" name="Recorder" tear_off="true"> <menu_item_call label="Start Playback" - layout="topleft" name="Start Playback"> <menu_item_call.on_click function="Advanced.AgentPilot" @@ -2637,7 +2393,6 @@ </menu_item_call> <menu_item_call label="Stop Playback" - layout="topleft" name="Stop Playback"> <menu_item_call.on_click function="Advanced.AgentPilot" @@ -2645,7 +2400,6 @@ </menu_item_call> <menu_item_check label="Loop Playback" - layout="topleft" name="Loop Playback"> <menu_item_check.on_check function="Advanced.CheckAgentPilotLoop" @@ -2655,7 +2409,6 @@ </menu_item_check> <menu_item_call label="Start Record" - layout="topleft" name="Start Record"> <menu_item_call.on_click function="Advanced.AgentPilot" @@ -2663,7 +2416,6 @@ </menu_item_call> <menu_item_call label="Stop Record" - layout="topleft" name="Stop Record"> <menu_item_call.on_click function="Advanced.AgentPilot" @@ -2674,12 +2426,10 @@ <menu create_jump_keys="true" label="World" - layout="topleft" name="World" tear_off="true"> <menu_item_check label="Sim Sun Override" - layout="topleft" name="Sim Sun Override"> <menu_item_check.on_check function="CheckControl" @@ -2690,7 +2440,6 @@ </menu_item_check> <menu_item_check label="Cheesy Beacon" - layout="topleft" name="Cheesy Beacon"> <menu_item_check.on_check function="CheckControl" @@ -2701,7 +2450,6 @@ </menu_item_check> <menu_item_check label="Fixed Weather" - layout="topleft" name="Fixed Weather"> <menu_item_check.on_check function="CheckControl" @@ -2712,7 +2460,6 @@ </menu_item_check> <menu_item_call label="Dump Region Object Cache" - layout="topleft" name="Dump Region Object Cache"> <menu_item_call.on_click function="Advanced.DumpRegionObjectCache" /> @@ -2721,12 +2468,10 @@ <menu create_jump_keys="true" label="UI" - layout="topleft" name="UI" tear_off="true"> <!-- <menu_item_check label="New Bottom Bar" - layout="topleft" name="New Bottom Bar"> <menu_item_check.on_check function="CheckControl" @@ -2737,7 +2482,6 @@ </menu_item_check>--> <menu_item_call label="Web Browser Test" - layout="topleft" name="Web Browser Test"> <menu_item_call.on_click function="Advanced.WebBrowserTest" @@ -2745,14 +2489,12 @@ </menu_item_call> <menu_item_call label="Dump SelectMgr" - layout="topleft" name="Dump SelectMgr"> <menu_item_call.on_click function="Advanced.DumpSelectMgr" /> </menu_item_call> <menu_item_call label="Dump Inventory" - layout="topleft" name="Dump Inventory"> <menu_item_call.on_click function="Advanced.DumpInventory" /> @@ -2765,14 +2507,12 @@ </menu_item_call> <menu_item_call label="Dump Focus Holder" - layout="topleft" name="Dump Focus Holder"> <menu_item_call.on_click function="Advanced.DumpFocusHolder" /> </menu_item_call> <menu_item_call label="Print Selected Object Info" - layout="topleft" name="Print Selected Object Info" shortcut="control|shift|P"> <menu_item_call.on_click @@ -2780,7 +2520,6 @@ </menu_item_call> <menu_item_call label="Print Agent Info" - layout="topleft" name="Print Agent Info" shortcut="shift|P"> <menu_item_call.on_click @@ -2788,7 +2527,6 @@ </menu_item_call> <menu_item_call label="Memory Stats" - layout="topleft" name="Memory Stats" shortcut="control|alt|shift|M"> <menu_item_call.on_click @@ -2796,7 +2534,6 @@ </menu_item_call> <menu_item_check label="Double-ClickAuto-Pilot" - layout="topleft" name="Double-ClickAuto-Pilot"> <menu_item_check.on_check function="CheckControl" @@ -2809,7 +2546,6 @@ <menu_item_separator /> <menu_item_check label="Debug SelectMgr" - layout="topleft" name="Debug SelectMgr"> <menu_item_check.on_check function="CheckControl" @@ -2820,7 +2556,6 @@ </menu_item_check> <menu_item_check label="Debug Clicks" - layout="topleft" name="Debug Clicks"> <menu_item_check.on_check function="Advanced.CheckDebugClicks" @@ -2831,7 +2566,6 @@ </menu_item_check> <menu_item_check label="Debug Views" - layout="topleft" name="Debug Views"> <menu_item_check.on_check function="Advanced.CheckDebugViews" /> @@ -2840,7 +2574,6 @@ </menu_item_check> <menu_item_check label="Debug Name Tooltips" - layout="topleft" name="Debug Name Tooltips"> <menu_item_check.on_check function="Advanced.CheckXUINameTooltips" @@ -2850,7 +2583,6 @@ </menu_item_check> <menu_item_check label="Debug Mouse Events" - layout="topleft" name="Debug Mouse Events"> <menu_item_check.on_check function="Advanced.CheckDebugMouseEvents" @@ -2860,7 +2592,6 @@ </menu_item_check> <menu_item_check label="Debug Keys" - layout="topleft" name="Debug Keys"> <menu_item_check.on_check function="Advanced.CheckDebugKeys" @@ -2870,7 +2601,6 @@ </menu_item_check> <menu_item_check label="Debug WindowProc" - layout="topleft" name="Debug WindowProc"> <menu_item_check.on_check function="Advanced.CheckDebugWindowProc" @@ -2887,14 +2617,12 @@ tear_off="true"> <menu_item_call label="Reload Color Settings" - layout="topleft" name="Reload Color Settings"> <menu_item_call.on_click function="Advanced.ReloadColorSettings" /> </menu_item_call> <menu_item_call label="Show Font Test" - layout="topleft" name="Show Font Test"> <menu_item_call.on_click function="Floater.Show" @@ -2902,21 +2630,18 @@ </menu_item_call> <menu_item_call label="Load from XML" - layout="topleft" name="Load from XML"> <menu_item_call.on_click function="Advanced.LoadUIFromXML" /> </menu_item_call> <menu_item_call label="Save to XML" - layout="topleft" name="Save to XML"> <menu_item_call.on_click function="Advanced.SaveUIToXML" /> </menu_item_call> <menu_item_check label="Show XUI Names" - layout="topleft" name="Show XUI Names"> <menu_item_check.on_check function="Advanced.CheckXUINames" @@ -2926,7 +2651,6 @@ </menu_item_check> <menu_item_call label="Send Test IMs" - layout="topleft" name="Send Test IMs"> <menu_item_call.on_click function="Advanced.SendTestIMs" /> @@ -2935,18 +2659,15 @@ <menu create_jump_keys="true" label="Avatar" - layout="topleft" name="Character" tear_off="true"> <menu create_jump_keys="true" label="Grab Baked Texture" - layout="topleft" name="Grab Baked Texture" tear_off="true"> <menu_item_call label="Iris" - layout="topleft" name="Iris"> <menu_item_call.on_click function="Advanced.GrabBakedTexture" @@ -2957,7 +2678,6 @@ </menu_item_call> <menu_item_call label="Head" - layout="topleft" name="Head"> <menu_item_call.on_click function="Advanced.GrabBakedTexture" @@ -2968,7 +2688,6 @@ </menu_item_call> <menu_item_call label="Upper Body" - layout="topleft" name="Upper Body"> <menu_item_call.on_click function="Advanced.GrabBakedTexture" @@ -2979,7 +2698,6 @@ </menu_item_call> <menu_item_call label="Lower Body" - layout="topleft" name="Lower Body"> <menu_item_call.on_click function="Advanced.GrabBakedTexture" @@ -2990,7 +2708,6 @@ </menu_item_call> <menu_item_call label="Skirt" - layout="topleft" name="Skirt"> <menu_item_call.on_click function="Advanced.GrabBakedTexture" @@ -3003,19 +2720,16 @@ <menu create_jump_keys="true" label="Character Tests" - layout="topleft" name="Character Tests" tear_off="true"> <menu_item_call label="Appearance To XML" - layout="topleft" name="Appearance To XML"> <menu_item_call.on_click function="Advanced.AppearanceToXML" /> </menu_item_call> <menu_item_call label="Toggle Character Geometry" - layout="topleft" name="Toggle Character Geometry"> <menu_item_call.on_click function="Advanced.ToggleCharacterGeometry" /> @@ -3024,28 +2738,24 @@ </menu_item_call> <menu_item_call label="Test Male" - layout="topleft" name="Test Male"> <menu_item_call.on_click function="Advanced.TestMale" /> </menu_item_call> <menu_item_call label="Test Female" - layout="topleft" name="Test Female"> <menu_item_call.on_click function="Advanced.TestFemale" /> </menu_item_call> <menu_item_call label="Toggle PG" - layout="topleft" name="Toggle PG"> <menu_item_call.on_click function="Advanced.TogglePG" /> </menu_item_call> <menu_item_check label="Allow Select Avatar" - layout="topleft" name="Allow Select Avatar"> <menu_item_check.on_check function="CheckControl" @@ -3057,14 +2767,12 @@ </menu> <menu_item_call label="Force Params to Default" - layout="topleft" name="Force Params to Default"> <menu_item_call.on_click function="Advanced.ForceParamsToDefault" /> </menu_item_call> <menu_item_check label="Animation Info" - layout="topleft" name="Animation Info"> <menu_item_check.on_check function="Advanced.CheckAnimationInfo" @@ -3075,7 +2783,6 @@ </menu_item_check> <menu_item_check label="Slow Motion Animations" - layout="topleft" name="Slow Motion Animations"> <menu_item_check.on_check function="CheckControl" @@ -3086,7 +2793,6 @@ </menu_item_check> <menu_item_check label="Show Look At" - layout="topleft" name="Show Look At"> <menu_item_check.on_check function="Advanced.CheckShowLookAt" @@ -3096,7 +2802,6 @@ </menu_item_check> <menu_item_check label="Show Point At" - layout="topleft" name="Show Point At"> <menu_item_check.on_check function="Advanced.CheckShowPointAt" @@ -3106,7 +2811,6 @@ </menu_item_check> <menu_item_check label="Debug Joint Updates" - layout="topleft" name="Debug Joint Updates"> <menu_item_check.on_check function="Advanced.CheckDebugJointUpdates" @@ -3116,7 +2820,6 @@ </menu_item_check> <menu_item_check label="Disable LOD" - layout="topleft" name="Disable LOD"> <menu_item_check.on_check function="Advanced.CheckDisableLOD" @@ -3126,7 +2829,6 @@ </menu_item_check> <menu_item_check label="Debug Character Vis" - layout="topleft" name="Debug Character Vis"> <menu_item_check.on_check function="Advanced.CheckDebugCharacterVis" @@ -3136,7 +2838,6 @@ </menu_item_check> <menu_item_check label="Show Collision Skeleton" - layout="topleft" name="Show Collision Skeleton"> <menu_item_check.on_check function="Advanced.CheckInfoDisplay" @@ -3147,7 +2848,6 @@ </menu_item_check> <menu_item_check label="Display Agent Target" - layout="topleft" name="Display Agent Target"> <menu_item_check.on_check function="Advanced.CheckInfoDisplay" @@ -3159,7 +2859,6 @@ <!-- Appears not to exist anymore <menu_item_check label="Debug Rotation" - layout="topleft" name="Debug Rotation"> <menu_item_check.on_check function="CheckControl" @@ -3171,14 +2870,12 @@ --> <menu_item_call label="Dump Attachments" - layout="topleft" name="Dump Attachments"> <menu_item_call.on_click function="Advanced.DumpAttachments" /> </menu_item_call> <menu_item_call label="Debug Avatar Textures" - layout="topleft" name="Debug Avatar Textures" shortcut="control|alt|shift|A"> <menu_item_call.on_click @@ -3186,18 +2883,15 @@ </menu_item_call> <menu_item_call label="Dump Local Textures" - layout="topleft" name="Dump Local Textures" shortcut="alt|shift|M"> <menu_item_call.on_click function="Advanced.DumpAvatarLocalTextures" /> </menu_item_call> </menu> - <menu_item_separator - layout="topleft" /> + <menu_item_separator/> <menu_item_check label="HTTP Textures" - layout="topleft" name="HTTP Textures"> <menu_item_check.on_check function="CheckControl" @@ -3208,14 +2902,12 @@ </menu_item_check> <menu_item_call label="Compress Images" - layout="topleft" name="Compress Images"> <menu_item_call.on_click function="Advanced.CompressImage" /> </menu_item_call> <menu_item_check label="Output Debug Minidump" - layout="topleft" name="Output Debug Minidump"> <menu_item_check.on_check function="CheckControl" @@ -3226,7 +2918,6 @@ </menu_item_check> <menu_item_check label="Console Window on next Run" - layout="topleft" name="Console Window"> <menu_item_check.on_check function="CheckControl" @@ -3235,11 +2926,9 @@ function="ToggleControl" parameter="ShowConsoleWindow" /> </menu_item_check> - <menu_item_separator - layout="topleft" /> + <menu_item_separator/> <menu_item_check label="Show Admin Menu" - layout="topleft" name="View Admin Options"> <menu_item_check.on_check function="Advanced.CheckViewAdminOptions" @@ -3249,7 +2938,6 @@ </menu_item_check> <menu_item_call label="Request Admin Status" - layout="topleft" name="Request Admin Options" shortcut="control|alt|G"> <menu_item_call.on_click @@ -3257,7 +2945,6 @@ </menu_item_call> <menu_item_call label="Leave Admin Status" - layout="topleft" name="Leave Admin Options" shortcut="control|alt|shift|G"> <menu_item_call.on_click @@ -3267,18 +2954,15 @@ <menu create_jump_keys="true" label="Admin" - layout="topleft" name="Admin" tear_off="true" visible="false"> <menu create_jump_keys="true" label="Object" - layout="topleft" tear_off="true"> <menu_item_call label="Take Copy" - layout="topleft" name="Take Copy" shortcut="control|alt|shift|O"> <menu_item_call.on_click @@ -3288,7 +2972,6 @@ </menu_item_call> <menu_item_call label="Force Owner To Me" - layout="topleft" name="Force Owner To Me"> <menu_item_call.on_click function="Admin.HandleObjectOwnerSelf" /> @@ -3297,7 +2980,6 @@ </menu_item_call> <menu_item_call label="Force Owner Permissive" - layout="topleft" name="Force Owner Permissive"> <menu_item_call.on_click function="Admin.HandleObjectOwnerPermissive" /> @@ -3306,7 +2988,6 @@ </menu_item_call> <menu_item_call label="Delete" - layout="topleft" name="Delete" shortcut="control|alt|shift|Del"> <menu_item_call.on_click @@ -3316,7 +2997,6 @@ </menu_item_call> <menu_item_call label="Lock" - layout="topleft" name="Lock" shortcut="control|alt|shift|L"> <menu_item_call.on_click @@ -3326,7 +3006,6 @@ </menu_item_call> <menu_item_call label="Get Assets IDs" - layout="topleft" name="Get Assets IDs" shortcut="control|alt|shift|I"> <menu_item_call.on_click @@ -3338,12 +3017,10 @@ <menu create_jump_keys="true" label="Parcel" - layout="topleft" name="Parcel" tear_off="true"> <menu_item_call label="Force Owner To Me" - layout="topleft" name="Owner To Me"> <menu_item_call.on_click function="Admin.HandleForceParcelOwnerToMe" /> @@ -3352,7 +3029,6 @@ </menu_item_call> <menu_item_call label="Set to Linden Content" - layout="topleft" name="Set to Linden Content" shortcut="control|alt|shift|C"> <menu_item_call.on_click @@ -3362,7 +3038,6 @@ </menu_item_call> <menu_item_call label="Claim Public Land" - layout="topleft" name="Claim Public Land"> <menu_item_call.on_click function="Admin.HandleClaimPublicLand" /> @@ -3373,12 +3048,10 @@ <menu create_jump_keys="true" label="Region" - layout="topleft" name="Region" tear_off="true"> <menu_item_call label="Dump Temp Asset Data" - layout="topleft" name="Dump Temp Asset Data"> <menu_item_call.on_click function="Admin.HandleRegionDumpTempAssetData" /> @@ -3387,7 +3060,6 @@ </menu_item_call> <menu_item_call label="Save Region State" - layout="topleft" name="Save Region State"> <menu_item_call.on_click function="Admin.OnSaveState" /> @@ -3397,7 +3069,6 @@ </menu> <menu_item_call label="God Tools" - layout="topleft" name="God Tools"> <menu_item_call.on_click function="Floater.Show" @@ -3409,34 +3080,29 @@ <menu create_jump_keys="true" label="Admin" - layout="topleft" name="Deprecated" tear_off="true" visible="false"> <menu create_jump_keys="true" label="Attach Object" - layout="topleft" mouse_opaque="false" name="Attach Object" tear_off="true" /> <menu create_jump_keys="true" label="Detach Object" - layout="topleft" mouse_opaque="false" name="Detach Object" tear_off="true" /> <menu create_jump_keys="true" label="Take Off Clothing" - layout="topleft" mouse_opaque="false" name="Take Off Clothing" tear_off="true"> <menu_item_call label="Shirt" - layout="topleft" name="Shirt"> <menu_item_call.on_click function="Edit.TakeOff" @@ -3447,7 +3113,6 @@ </menu_item_call> <menu_item_call label="Pants" - layout="topleft" name="Pants"> <menu_item_call.on_click function="Edit.TakeOff" @@ -3458,7 +3123,6 @@ </menu_item_call> <menu_item_call label="Shoes" - layout="topleft" name="Shoes"> <menu_item_call.on_click function="Edit.TakeOff" @@ -3469,7 +3133,6 @@ </menu_item_call> <menu_item_call label="Socks" - layout="topleft" name="Socks"> <menu_item_call.on_click function="Edit.TakeOff" @@ -3480,7 +3143,6 @@ </menu_item_call> <menu_item_call label="Jacket" - layout="topleft" name="Jacket"> <menu_item_call.on_click function="Edit.TakeOff" @@ -3491,7 +3153,6 @@ </menu_item_call> <menu_item_call label="Gloves" - layout="topleft" name="Gloves"> <menu_item_call.on_click function="Edit.TakeOff" @@ -3502,7 +3163,6 @@ </menu_item_call> <menu_item_call label="Undershirt" - layout="topleft" name="Menu Undershirt"> <menu_item_call.on_click function="Edit.TakeOff" @@ -3513,7 +3173,6 @@ </menu_item_call> <menu_item_call label="Underpants" - layout="topleft" name="Menu Underpants"> <menu_item_call.on_click function="Edit.TakeOff" @@ -3524,7 +3183,6 @@ </menu_item_call> <menu_item_call label="Skirt" - layout="topleft" name="Skirt"> <menu_item_call.on_click function="Edit.TakeOff" @@ -3535,7 +3193,6 @@ </menu_item_call> <menu_item_call label="Alpha" - layout="topleft" name="Alpha"> <menu_item_call.on_click function="Edit.TakeOff" @@ -3546,7 +3203,6 @@ </menu_item_call> <menu_item_call label="Tattoo" - layout="topleft" name="Tattoo"> <menu_item_call.on_click function="Edit.TakeOff" @@ -3557,7 +3213,6 @@ </menu_item_call> <menu_item_call label="All Clothes" - layout="topleft" name="All Clothes"> <menu_item_call.on_click function="Edit.TakeOff" @@ -3567,12 +3222,10 @@ <menu create_jump_keys="true" label="Help" - layout="topleft" name="Help" tear_off="true"> <menu_item_call label="Official Linden Blog" - layout="topleft" name="Official Linden Blog"> <menu_item_call.on_click function="PromptShowURL" @@ -3581,7 +3234,6 @@ </menu_item_call> <menu_item_call label="Scripting Portal" - layout="topleft" name="Scripting Portal"> <menu_item_call.on_click function="PromptShowURL" @@ -3591,12 +3243,10 @@ <menu create_jump_keys="true" label="Bug Reporting" - layout="topleft" name="Bug Reporting" tear_off="true"> <menu_item_call label="Public Issue Tracker" - layout="topleft" name="Public Issue Tracker"> <menu_item_call.on_click function="PromptShowURL" @@ -3605,18 +3255,15 @@ </menu_item_call> <menu_item_call label="Public Issue Tracker Help" - layout="topleft" name="Publc Issue Tracker Help"> <menu_item_call.on_click function="PromptShowURL" name="PublicIssueTrackerHelp_url" parameter="WebLaunchPublicIssueHelp,http://wiki.secondlife.com/wiki/Issue_tracker" /> </menu_item_call> - <menu_item_separator - layout="topleft" /> + <menu_item_separator/> <menu_item_call label="Bug Reporting 101" - layout="topleft" name="Bug Reporing 101"> <menu_item_call.on_click function="PromptShowURL" @@ -3625,7 +3272,6 @@ </menu_item_call> <menu_item_call label="Security Issues" - layout="topleft" name="Security Issues"> <menu_item_call.on_click function="PromptShowURL" @@ -3634,7 +3280,6 @@ </menu_item_call> <menu_item_call label="QA Wiki" - layout="topleft" name="QA Wiki"> <menu_item_call.on_click function="PromptShowURL" diff --git a/indra/newview/skins/default/xui/en/menu_wearable_list_item.xml b/indra/newview/skins/default/xui/en/menu_wearable_list_item.xml new file mode 100644 index 0000000000..efea2ae3e8 --- /dev/null +++ b/indra/newview/skins/default/xui/en/menu_wearable_list_item.xml @@ -0,0 +1,76 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<context_menu + name="Outfit Wearable Context Menu"> + <menu_item_call + label="Replace" + layout="topleft" + name="wear"> + <on_click + function="Wearable.Wear" /> + </menu_item_call> + <menu_item_call + label="Add" + layout="topleft" + name="wear_add"> + <on_click + function="Wearable.Add" /> + </menu_item_call> + <menu_item_call + label="Take Off / Detach" + layout="topleft" + name="take_off_or_detach"> + <on_click + function="Wearable.TakeOffDetach" /> + </menu_item_call> + <menu_item_call + label="Detach" + layout="topleft" + name="detach"> + <on_click + function="Attachment.Detach" /> + </menu_item_call> + <context_menu + label="Attach to â–¶" + layout="topleft" + name="wearable_attach_to" /> + <context_menu + label="Attach to HUD â–¶" + layout="topleft" + name="wearable_attach_to_hud" /> + <menu_item_call + label="Take Off" + layout="topleft" + name="take_off"> + <on_click + function="Clothing.TakeOff" /> + </menu_item_call> + <menu_item_call + label="Edit" + layout="topleft" + name="edit"> + <on_click + function="Wearable.Edit" /> + </menu_item_call> + <menu_item_call + label="Object Profile" + layout="topleft" + name="object_profile"> + <on_click + function="Attachment.Profile" /> + </menu_item_call> + <menu_item_call + label="Show Original" + layout="topleft" + name="show_original"> + <on_click + function="Wearable.ShowOriginal" /> + </menu_item_call> + <menu_item_call + label="Create New" + layout="topleft" + name="create_new" + translate="false"> + <on_click + function="Wearable.CreateNew" /> + </menu_item_call> +</context_menu> diff --git a/indra/newview/skins/default/xui/en/mime_types.xml b/indra/newview/skins/default/xui/en/mime_types.xml index 76c0d027f3..a585069faa 100644 --- a/indra/newview/skins/default/xui/en/mime_types.xml +++ b/indra/newview/skins/default/xui/en/mime_types.xml @@ -120,7 +120,7 @@ none </widgettype> <impl> - media_plugin_quicktime + media_plugin_webkit </impl> </mimetype> <mimetype name="none/none"> @@ -130,6 +130,9 @@ <widgettype> none </widgettype> + <impl> + media_plugin_webkit + </impl> </mimetype> <mimetype name="audio/*"> <label name="audio2_label"> @@ -138,6 +141,9 @@ <widgettype> audio </widgettype> + <impl> + media_plugin_quicktime + </impl> </mimetype> <mimetype name="video/*"> <label name="video2_label"> @@ -146,6 +152,9 @@ <widgettype> movie </widgettype> + <impl> + media_plugin_quicktime + </impl> </mimetype> <mimetype name="image/*"> <label name="image2_label"> @@ -154,6 +163,9 @@ <widgettype> image </widgettype> + <impl> + media_plugin_webkit + </impl> </mimetype> <mimetype menu="1" name="video/vnd.secondlife.qt.legacy"> <label name="vnd.secondlife.qt.legacy_label"> @@ -173,6 +185,9 @@ <widgettype> web </widgettype> + <impl> + media_plugin_webkit + </impl> </mimetype> <mimetype name="application/ogg"> <label name="application/ogg_label"> @@ -181,6 +196,9 @@ <widgettype> audio </widgettype> + <impl> + media_plugin_quicktime + </impl> </mimetype> <mimetype name="application/pdf"> <label name="application/pdf_label"> @@ -189,6 +207,9 @@ <widgettype> image </widgettype> + <impl> + media_plugin_webkit + </impl> </mimetype> <mimetype name="application/postscript"> <label name="application/postscript_label"> @@ -197,6 +218,9 @@ <widgettype> image </widgettype> + <impl> + media_plugin_webkit + </impl> </mimetype> <mimetype name="application/rtf"> <label name="application/rtf_label"> @@ -205,6 +229,9 @@ <widgettype> image </widgettype> + <impl> + media_plugin_webkit + </impl> </mimetype> <mimetype name="application/smil"> <label name="application/smil_label"> @@ -213,6 +240,9 @@ <widgettype> movie </widgettype> + <impl> + media_plugin_webkit + </impl> </mimetype> <mimetype name="application/xhtml+xml"> <label name="application/xhtml+xml_label"> @@ -221,6 +251,9 @@ <widgettype> web </widgettype> + <impl> + media_plugin_webkit + </impl> </mimetype> <mimetype name="application/x-director"> <label name="application/x-director_label"> @@ -229,6 +262,9 @@ <widgettype> image </widgettype> + <impl> + media_plugin_webkit + </impl> </mimetype> <mimetype name="audio/mid"> <label name="audio/mid_label"> diff --git a/indra/newview/skins/default/xui/en/mime_types_linux.xml b/indra/newview/skins/default/xui/en/mime_types_linux.xml index 05cd850725..e95b371d00 100644 --- a/indra/newview/skins/default/xui/en/mime_types_linux.xml +++ b/indra/newview/skins/default/xui/en/mime_types_linux.xml @@ -120,7 +120,7 @@ none </widgettype> <impl> - media_plugin_gstreamer + media_plugin_webkit </impl> </mimetype> <mimetype name="none/none"> @@ -130,6 +130,9 @@ <widgettype> none </widgettype> + <impl> + media_plugin_webkit + </impl> </mimetype> <mimetype name="audio/*"> <label name="audio2_label"> @@ -138,6 +141,9 @@ <widgettype> audio </widgettype> + <impl> + media_plugin_gstreamer + </impl> </mimetype> <mimetype name="video/*"> <label name="video2_label"> @@ -146,6 +152,9 @@ <widgettype> movie </widgettype> + <impl> + media_plugin_gstreamer + </impl> </mimetype> <mimetype name="image/*"> <label name="image2_label"> @@ -154,6 +163,9 @@ <widgettype> image </widgettype> + <impl> + media_plugin_webkit + </impl> </mimetype> <mimetype menu="1" name="video/vnd.secondlife.qt.legacy"> <label name="vnd.secondlife.qt.legacy_label"> @@ -173,6 +185,9 @@ <widgettype> web </widgettype> + <impl> + media_plugin_webkit + </impl> </mimetype> <mimetype name="application/ogg"> <label name="application/ogg_label"> @@ -181,6 +196,9 @@ <widgettype> audio </widgettype> + <impl> + media_plugin_gstreamer + </impl> </mimetype> <mimetype name="application/pdf"> <label name="application/pdf_label"> @@ -189,6 +207,9 @@ <widgettype> image </widgettype> + <impl> + media_plugin_webkit + </impl> </mimetype> <mimetype name="application/postscript"> <label name="application/postscript_label"> @@ -197,6 +218,9 @@ <widgettype> image </widgettype> + <impl> + media_plugin_webkit + </impl> </mimetype> <mimetype name="application/rtf"> <label name="application/rtf_label"> @@ -205,6 +229,9 @@ <widgettype> image </widgettype> + <impl> + media_plugin_webkit + </impl> </mimetype> <mimetype name="application/smil"> <label name="application/smil_label"> @@ -213,6 +240,9 @@ <widgettype> movie </widgettype> + <impl> + media_plugin_webkit + </impl> </mimetype> <mimetype name="application/xhtml+xml"> <label name="application/xhtml+xml_label"> @@ -221,6 +251,9 @@ <widgettype> web </widgettype> + <impl> + media_plugin_webkit + </impl> </mimetype> <mimetype name="application/x-director"> <label name="application/x-director_label"> @@ -229,6 +262,9 @@ <widgettype> image </widgettype> + <impl> + media_plugin_webkit + </impl> </mimetype> <mimetype name="audio/mid"> <label name="audio/mid_label"> diff --git a/indra/newview/skins/default/xui/en/mime_types_mac.xml b/indra/newview/skins/default/xui/en/mime_types_mac.xml index 76c0d027f3..7931e55c0a 100644 --- a/indra/newview/skins/default/xui/en/mime_types_mac.xml +++ b/indra/newview/skins/default/xui/en/mime_types_mac.xml @@ -130,6 +130,9 @@ <widgettype> none </widgettype> + <impl> + media_plugin_webkit + </impl> </mimetype> <mimetype name="audio/*"> <label name="audio2_label"> @@ -138,6 +141,9 @@ <widgettype> audio </widgettype> + <impl> + media_plugin_quicktime + </impl> </mimetype> <mimetype name="video/*"> <label name="video2_label"> @@ -146,6 +152,9 @@ <widgettype> movie </widgettype> + <impl> + media_plugin_quicktime + </impl> </mimetype> <mimetype name="image/*"> <label name="image2_label"> @@ -154,6 +163,9 @@ <widgettype> image </widgettype> + <impl> + media_plugin_webkit + </impl> </mimetype> <mimetype menu="1" name="video/vnd.secondlife.qt.legacy"> <label name="vnd.secondlife.qt.legacy_label"> @@ -173,6 +185,9 @@ <widgettype> web </widgettype> + <impl> + media_plugin_webkit + </impl> </mimetype> <mimetype name="application/ogg"> <label name="application/ogg_label"> @@ -181,6 +196,9 @@ <widgettype> audio </widgettype> + <impl> + media_plugin_quicktime + </impl> </mimetype> <mimetype name="application/pdf"> <label name="application/pdf_label"> @@ -189,6 +207,9 @@ <widgettype> image </widgettype> + <impl> + media_plugin_webkit + </impl> </mimetype> <mimetype name="application/postscript"> <label name="application/postscript_label"> @@ -197,6 +218,9 @@ <widgettype> image </widgettype> + <impl> + media_plugin_webkit + </impl> </mimetype> <mimetype name="application/rtf"> <label name="application/rtf_label"> @@ -205,6 +229,9 @@ <widgettype> image </widgettype> + <impl> + media_plugin_webkit + </impl> </mimetype> <mimetype name="application/smil"> <label name="application/smil_label"> @@ -213,6 +240,9 @@ <widgettype> movie </widgettype> + <impl> + media_plugin_webkit + </impl> </mimetype> <mimetype name="application/xhtml+xml"> <label name="application/xhtml+xml_label"> @@ -221,6 +251,9 @@ <widgettype> web </widgettype> + <impl> + media_plugin_webkit + </impl> </mimetype> <mimetype name="application/x-director"> <label name="application/x-director_label"> @@ -229,6 +262,9 @@ <widgettype> image </widgettype> + <impl> + media_plugin_webkit + </impl> </mimetype> <mimetype name="audio/mid"> <label name="audio/mid_label"> diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index cc71f53bd7..88732fee7d 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -19,7 +19,7 @@ <button default="true" index="0" - name="OK" + name="OK_okbutton" text="$yestext"/> </form> </template> @@ -29,7 +29,7 @@ <button default="true" index="0" - name="OK" + name="OK_okignore" text="$yestext"/> <ignore text="$ignoretext"/> </form> @@ -40,11 +40,11 @@ <button default="true" index="0" - name="OK" + name="OK_okcancelbuttons" text="$yestext"/> <button index="1" - name="Cancel" + name="Cancel_okcancelbuttons" text="$notext"/> </form> </template> @@ -54,11 +54,11 @@ <button default="true" index="0" - name="OK" + name="OK_okcancelignore" text="$yestext"/> <button index="1" - name="Cancel" + name="Cancel_okcancelignore" text="$notext"/> <ignore text="$ignoretext"/> </form> @@ -69,7 +69,7 @@ <button default="true" index="0" - name="OK" + name="OK_okhelpbuttons" text="$yestext"/> <button index="1" @@ -91,7 +91,7 @@ text="$notext"/> <button index="2" - name="Cancel" + name="Cancel_yesnocancelbuttons" text="$canceltext"/> </form> </template> @@ -249,7 +249,7 @@ Save all changes to clothing/body parts? Non-friends won't know that you've choosen to ignore their calls and instant messages. <usetemplate name="okbutton" - yestext="Yes"/> + yestext="OK"/> </notification> <notification @@ -407,7 +407,7 @@ Do you wish to proceed? icon="alertmodal.tga" name="JoinGroupNoCost" type="alertmodal"> -You are Joining group [NAME]. +You are joining group [NAME]. Do you wish to proceed? <usetemplate name="okcancelbuttons" @@ -735,6 +735,14 @@ You need an account to enter [SECOND_LIFE]. Would you like to create one now? <notification icon="alertmodal.tga" + name="InvalidCredentialFormat" + type="alertmodal"> +You need to enter both the First and Last name of your avatar into the Username field, then login again. + </notification> + + + <notification + icon="alertmodal.tga" name="AddClassified" type="alertmodal"> Classified ads appear in the 'Classified' section of the Search directory and on [http://secondlife.com/community/classifieds secondlife.com] for one week. @@ -800,7 +808,7 @@ Insufficient funds to create classified. icon="alertmodal.tga" name="DeleteAvatarPick" type="alertmodal"> -Delete pick [PICK]? +Delete pick <nolink>[PICK]</nolink>? <usetemplate name="okcancelbuttons" notext="Cancel" @@ -1036,7 +1044,6 @@ Unable to write file [[FILE]] type="alertmodal"> Just so you know, your computer does not meet [APP_NAME]'s minimum system requirements. You may experience poor performance. Unfortunately, the [SUPPORT_SITE] can't provide technical support for unsupported system configurations. -MINSPECS Visit [_URL] for more information? <url option="0" name="url"> @@ -1083,7 +1090,9 @@ The region [REGION] does not allow terraforming. icon="alertmodal.tga" name="CannotCopyWarning" type="alertmodal"> -You do not have permission to copy this item and will lose it from your inventory if you give it away. Do you really want to offer this item? +You do not have permission to copy the following items: +[ITEMS] +and will lose it from your inventory if you give it away. Do you really want to offer these items? <usetemplate name="okcancelbuttons" notext="No" @@ -1200,6 +1209,7 @@ Eject [AVATAR_NAME] from your land? <notification icon="alertmodal.tga" name="EjectAvatarFromGroup" + persist="true" type="notify"> You ejected [AVATAR_NAME] from group [GROUP_NAME] </notification> @@ -1385,6 +1395,17 @@ Unable to encode file: [FILE] <notification icon="alertmodal.tga" + name="CorruptedProtectedDataStore" + type="alertmodal"> + We can't fill in your username and password. This may happen when you change network setup + + <usetemplate + name="okbutton" + yestext="OK"/> + </notification> + + <notification + icon="alertmodal.tga" name="CorruptResourceFile" type="alertmodal"> Corrupt resource file: [FILE] @@ -1733,21 +1754,6 @@ Try selecting a single parcel. <notification icon="alertmodal.tga" - name="ParcelCanPlayMedia" - type="alertmodal"> -This location can play streaming media. -Streaming media requires a fast Internet connection. - -Play streaming media when available? -(You can change this option later under Preferences > Privacy.) - <usetemplate - name="okcancelbuttons" - notext="Disable" - yestext="Play Media"/> - </notification> - - <notification - icon="alertmodal.tga" name="CannotDeedLandWaitingForServer" type="alertmodal"> Unable to deed land: @@ -2040,6 +2046,74 @@ Would you be my friend? </notification> <notification + icon="alertmodal.tga" + label="Save Outfit" + name="SaveOutfitAs" + type="alertmodal"> + Save what I'm wearing as a new Outfit: + <form name="form"> + <input name="message" type="text"> + [DESC] (new) + </input> + <button + default="true" + index="0" + name="Offer" + text="OK"/> + <button + index="1" + name="Cancel" + text="Cancel"/> + </form> + <unique/> + </notification> + + <notification + icon="alertmodal.tga" + label="Save Wearable" + name="SaveWearableAs" + type="alertmodal"> + Save item to my inventory as: + <form name="form"> + <input name="message" type="text"> + [DESC] (new) + </input> + <button + default="true" + index="0" + name="Offer" + text="OK"/> + <button + index="1" + name="Cancel" + text="Cancel"/> + </form> + </notification> + + + <notification + icon="alertmodal.tga" + label="Rename Outfit" + name="RenameOutfit" + type="alertmodal"> + New outfit name: + <form name="form"> + <input name="new_name" type="text" width="300"> + [NAME] + </input> + <button + default="true" + index="0" + name="Offer" + text="OK"/> + <button + index="1" + name="Cancel" + text="Cancel"/> + </form> + </notification> + + <notification icon="alertmodal.tga" name="RemoveFromFriends" type="alertmodal"> @@ -2118,6 +2192,19 @@ Please enter a higher price. <notification icon="alertmodal.tga" + name="ConfirmItemDeleteHasLinks" + type="alertmodal"> +At least one of the items you has link items that point to it. If you delete this item, its links will permanently stop working. It is strongly advised to delete the links first. + +Are you sure you want to delete these items? + <usetemplate + name="okcancelbuttons" + notext="Cancel" + yestext="OK"/> + </notification> + + <notification + icon="alertmodal.tga" name="ConfirmObjectDeleteLock" type="alertmodal"> At least one of the items you have selected is locked. @@ -2312,6 +2399,9 @@ Display settings have been set to recommended levels based on your system config name="ErrorMessage" type="alertmodal"> [ERROR_MESSAGE] + <usetemplate + name="okbutton" + yestext="OK"/> </notification> <notification @@ -2408,6 +2498,57 @@ Please choose the male or female avatar. You can change your mind later. notext="Female" yestext="Male"/> </notification> + <notification icon="alertmodal.tga" + name="CantTeleportToGrid" + type="alertmodal"> +Could not teleport to [SLURL] as it's on a different grid ([GRID]) than the current grid ([CURRENT_GRID]). Please close your viewer and try again. + <usetemplate + name="okbutton" + yestext="OK"/> + </notification> + + <notification icon="alertmodal.tga" + name="GeneralCertificateError" + type="alertmodal"> +Could not connect to the server. +[REASON] + +SubjectName: [SUBJECT_NAME_STRING] +IssuerName: [ISSUER_NAME_STRING] +Valid From: [VALID_FROM] +Valid To: [VALID_TO] +MD5 Fingerprint: [SHA1_DIGEST] +SHA1 Fingerprint: [MD5_DIGEST] +Key Usage: [KEYUSAGE] +Extended Key Usage: [EXTENDEDKEYUSAGE] +Subject Key Identifier: [SUBJECTKEYIDENTIFIER] + <usetemplate + name="okbutton" + yestext="OK"/> + </notification> + + <notification icon="alertmodal.tga" + name="TrustCertificateError" + type="alertmodal"> +The certification authority for this server is not known. + +Certificate Information: +SubjectName: [SUBJECT_NAME_STRING] +IssuerName: [ISSUER_NAME_STRING] +Valid From: [VALID_FROM] +Valid To: [VALID_TO] +MD5 Fingerprint: [SHA1_DIGEST] +SHA1 Fingerprint: [MD5_DIGEST] +Key Usage: [KEYUSAGE] +Extended Key Usage: [EXTENDEDKEYUSAGE] +Subject Key Identifier: [SUBJECTKEYIDENTIFIER] + +Would you like to trust this authority? + <usetemplate + name="okcancelbuttons" + notext="Cancel" + yestext="Trust"/> + </notification> <notification icon="alertmodal.tga" @@ -2419,6 +2560,7 @@ Please choose the male or female avatar. You can change your mind later. <notification icon="alertmodal.tga" name="GrantedModifyRights" + persist="true" type="notify"> [NAME] has given you permission to edit their objects. </notification> @@ -2426,6 +2568,7 @@ Please choose the male or female avatar. You can change your mind later. <notification icon="alertmodal.tga" name="RevokedModifyRights" + persist="true" type="notify"> Your privilege to modify [NAME]'s objects has been revoked </notification> @@ -2861,11 +3004,11 @@ Leave Group? icon="alert.tga" name="ConfirmKick" type="alert"> -Do you REALLY want to kick all users off the grid? +Do you REALLY want to kick all Residents off the grid? <usetemplate name="okcancelbuttons" notext="Cancel" - yestext="Kick All Users"/> + yestext="Kick All Residents"/> </notification> <notification @@ -2965,7 +3108,7 @@ You have reached your maximum number of groups. Please leave some group before j icon="alert.tga" name="KickUser" type="alert"> -Kick this user with what message? +Kick this Resident with what message? <form name="form"> <input name="message" type="text"> An administrator has logged you off. @@ -3007,7 +3150,7 @@ An administrator has logged you off. icon="alert.tga" name="FreezeUser" type="alert"> -Freeze this user with what message? +Freeze this Resident with what message? <form name="form"> <input name="message" type="text"> You have been frozen. You cannot move or chat. An administrator will contact you via instant message (IM). @@ -3028,7 +3171,7 @@ You have been frozen. You cannot move or chat. An administrator will contact you icon="alert.tga" name="UnFreezeUser" type="alert"> -Unfreeze this user with what message? +Unfreeze this Resident with what message? <form name="form"> <input name="message" type="text"> You are no longer frozen. @@ -3070,7 +3213,7 @@ Join me in [REGION] icon="alertmodal.tga" name="OfferTeleportFromGod" type="alertmodal"> -God summon user to your location? +God summon Resident to your location? <form name="form"> <input name="message" type="text"> Join me in [REGION] @@ -3124,6 +3267,18 @@ Teleport to [PICK]? </notification> <notification + icon="alertmodal.tga" + name="TeleportToHistoryEntry" + type="alertmodal"> +Teleport to [HISTORY_ENTRY]? + <usetemplate + ignoretext="Confirm that I want to teleport to a history location" + name="okcancelignore" + notext="Cancel" + yestext="Teleport"/> + </notification> + + <notification icon="alert.tga" label="Message everyone in your Estate" name="MessageEstate" @@ -3150,7 +3305,7 @@ Type a short announcement which will be sent to everyone currently in your estat type="alert"> You are about to change a Linden owned estate (mainland, teen grid, orientation, etc.). -This is EXTREMELY DANGEROUS because it can fundamentally affect the user experience. On the mainland, it will change thousands of regions and make the spaceserver hiccup. +This is EXTREMELY DANGEROUS because it can fundamentally affect the Resident experience. On the mainland, it will change thousands of regions and make the spaceserver hiccup. Proceed? <usetemplate @@ -3343,7 +3498,7 @@ You are not allowed in that region due to your maturity Rating. type="alertmodal"> You are not allowed in that Region due to your maturity Rating preference. -You can click 'Change Preference' to raise your maturity Rating preference now and allow you to enter. You will be able to search and access [REGIONMATURITY] content from now on. If you later want to change this setting back, go to Me > Preferences > General. +To enter the desired region, please change your maturity Rating preference. This will allow you to search for and access [REGIONMATURITY] content. To undo any changes, go to Me > Preferences > General. <form name="form"> <button index="0" @@ -3359,6 +3514,13 @@ You can click 'Change Preference' to raise your maturity Rating prefer </notification> <notification + icon="notifytip.tga" + name="PreferredMaturityChanged" + type="notifytip"> +Your maturity Rating preference is now [RATING]. + </notification> + + <notification icon="alertmodal.tga" name="LandClaimAccessBlocked" type="alertmodal"> @@ -3851,7 +4013,7 @@ Are you sure you want to quit? <notification icon="alertmodal.tga" name="HelpReportAbuseEmailLL" - type="alertmodal"> + type="alert"> Use this tool to report violations of the [http://secondlife.com/corporate/tos.php Terms of Service] and [http://secondlife.com/corporate/cs.php Community Standards]. All reported abuses are investigated and resolved. @@ -4282,6 +4444,13 @@ The string [STRING_NAME] is missing from strings.xml type="notifytip"> [MESSAGE] </notification> + + <notification + icon="notifytip.tga" + name="IMSystemMessageTip" + type="notifytip"> +[MESSAGE] + </notification> <notification icon="notifytip.tga" @@ -4314,6 +4483,7 @@ Replaced missing clothing/body part with default. <notification icon="groupnotify" name="GroupNotice" + persist="true" type="groupnotify"> Topic: [SUBJECT], Message: [MESSAGE] </notification> @@ -4350,6 +4520,7 @@ Uploading in-world and web site snapshots... <notification icon="notify.tga" name="UploadPayment" + persist="true" type="notify"> You paid L$[AMOUNT] to upload. </notification> @@ -4637,6 +4808,7 @@ Please select at least one type of content to search (General, Moderate, or Adul <notification icon="notify.tga" name="SystemMessage" + persist="true" type="notify"> [MESSAGE] </notification> @@ -4644,10 +4816,13 @@ Please select at least one type of content to search (General, Moderate, or Adul <notification icon="notify.tga" name="PaymentRecived" + persist="true" type="notify"> [MESSAGE] </notification> + <!-- EventNotification couldn't be persist since server decide is it necessary to notify + user about subscribed event via LLEventNotifier--> <notification icon="notify.tga" name="EventNotification" @@ -4675,6 +4850,7 @@ Event Notification: <notification icon="notify.tga" name="TransferObjectsHighlighted" + persist="true" type="notify"> All objects on this parcel that will transfer to the purchaser of this parcel are now highlighted. @@ -4690,6 +4866,7 @@ All objects on this parcel that will transfer to the purchaser of this parcel ar <notification icon="notify.tga" name="DeactivatedGesturesTrigger" + persist="true" type="notify"> Deactivated gestures with same trigger: [NAMES] @@ -4698,6 +4875,7 @@ Deactivated gestures with same trigger: <notification icon="notify.tga" name="NoQuickTime" + persist="true" type="notify"> Apple's QuickTime software does not appear to be installed on your system. If you want to view streaming media on parcels that support it you should go to the [http://www.apple.com/quicktime QuickTime site] and install the QuickTime Player. @@ -4705,6 +4883,7 @@ If you want to view streaming media on parcels that support it you should go to <notification icon="notify.tga" name="NoPlugin" + persist="true" type="notify"> No Media Plugin was found to handle the "[MIME_TYPE]" mime type. Media of this type will be unavailable. </notification> @@ -4724,6 +4903,7 @@ Please re-install the plugin or contact the vendor if you continue to experience <notification icon="notify.tga" name="OwnedObjectsReturned" + persist="true" type="notify"> The objects you own on the selected parcel of land have been returned back to your inventory. </notification> @@ -4731,6 +4911,7 @@ The objects you own on the selected parcel of land have been returned back to yo <notification icon="notify.tga" name="OtherObjectsReturned" + persist="true" type="notify"> The objects on the selected parcel of land that is owned by [FIRST] [LAST] have been returned to his or her inventory. </notification> @@ -4738,6 +4919,7 @@ The objects on the selected parcel of land that is owned by [FIRST] [LAST] have <notification icon="notify.tga" name="OtherObjectsReturned2" + persist="true" type="notify"> The objects on the selected parcel of land owned by the Resident '[NAME]' have been returned to their owner. </notification> @@ -4745,6 +4927,7 @@ The objects on the selected parcel of land owned by the Resident '[NAME]&ap <notification icon="notify.tga" name="GroupObjectsReturned" + persist="true" type="notify"> The objects on the selected parcel of land shared with the group [GROUPNAME] have been returned back to their owner's inventory. Transferable deeded objects have been returned to their previous owners. @@ -4754,6 +4937,7 @@ Non-transferable objects that are deeded to the group have been deleted. <notification icon="notify.tga" name="UnOwnedObjectsReturned" + persist="true" type="notify"> The objects on the selected parcel that are NOT owned by you have been returned to their owners. </notification> @@ -4761,14 +4945,16 @@ The objects on the selected parcel that are NOT owned by you have been returned <notification icon="notify.tga" name="ServerObjectMessage" + persist="true" type="notify"> Message from [NAME]: -[MSG] +<nolink>[MSG]</nolink> </notification> <notification icon="notify.tga" name="NotSafe" + persist="true" type="notify"> This land has damage enabled. You can be hurt here. If you die, you will be teleported to your home location. @@ -4778,6 +4964,7 @@ You can be hurt here. If you die, you will be teleported to your home location. <notification icon="notify.tga" name="NoFly" + persist="true" type="notify"> This area has flying disabled. You can't fly here. @@ -4787,6 +4974,7 @@ You can't fly here. <notification icon="notify.tga" name="PushRestricted" + persist="true" type="notify"> This area does not allow pushing. You can't push others here unless you own the land. <unique/> @@ -4795,6 +4983,7 @@ This area does not allow pushing. You can't push others here unless you own <notification icon="notify.tga" name="NoVoice" + persist="true" type="notify"> This area has voice chat disabled. You won't be able to hear anyone talking. <unique/> @@ -4803,6 +4992,7 @@ This area has voice chat disabled. You won't be able to hear anyone talking <notification icon="notify.tga" name="NoBuild" + persist="true" type="notify"> This area has building disabled. You can't build or rez objects here. <unique/> @@ -4811,6 +5001,7 @@ This area has building disabled. You can't build or rez objects here. <notification icon="notify.tga" name="ScriptsStopped" + persist="true" type="notify"> An administrator has temporarily stopped scripts in this region. </notification> @@ -4818,6 +5009,7 @@ An administrator has temporarily stopped scripts in this region. <notification icon="notify.tga" name="ScriptsNotRunning" + persist="true" type="notify"> This region is not running any scripts. </notification> @@ -4825,6 +5017,7 @@ This region is not running any scripts. <notification icon="notify.tga" name="NoOutsideScripts" + persist="true" type="notify"> This land has outside scripts disabled. @@ -4834,6 +5027,7 @@ No scripts will work here except those belonging to the land owner. <notification icon="notify.tga" name="ClaimPublicLand" + persist="true" type="notify"> You can only claim public land in the Region you're in. </notification> @@ -4841,6 +5035,7 @@ You can only claim public land in the Region you're in. <notification icon="notify.tga" name="RegionTPAccessBlocked" + persist="true" type="notify"> You aren't allowed in that Region due to your maturity Rating. You may need to validate your age and/or install the latest Viewer. @@ -4850,6 +5045,7 @@ Please go to the Knowledge Base for details on accessing areas with this maturit <notification icon="notify.tga" name="URBannedFromRegion" + persist="true" type="notify"> You are banned from the region. </notification> @@ -4857,6 +5053,7 @@ You are banned from the region. <notification icon="notify.tga" name="NoTeenGridAccess" + persist="true" type="notify"> Your account cannot connect to this teen grid region. </notification> @@ -4864,6 +5061,7 @@ Your account cannot connect to this teen grid region. <notification icon="notify.tga" name="ImproperPaymentStatus" + persist="true" type="notify"> You do not have proper payment status to enter this region. </notification> @@ -4871,6 +5069,7 @@ You do not have proper payment status to enter this region. <notification icon="notify.tga" name="MustGetAgeRgion" + persist="true" type="notify"> You must be age-verified to enter this region. </notification> @@ -4878,6 +5077,7 @@ You must be age-verified to enter this region. <notification icon="notify.tga" name="MustGetAgeParcel" + persist="true" type="notify"> You must be age-verified to enter this parcel. </notification> @@ -4885,6 +5085,7 @@ You must be age-verified to enter this parcel. <notification icon="notify.tga" name="NoDestRegion" + persist="true" type="notify"> No destination region found. </notification> @@ -4892,6 +5093,7 @@ No destination region found. <notification icon="notify.tga" name="NotAllowedInDest" + persist="true" type="notify"> You are not allowed into the destination. </notification> @@ -4899,6 +5101,7 @@ You are not allowed into the destination. <notification icon="notify.tga" name="RegionParcelBan" + persist="true" type="notify"> Cannot region cross into banned parcel. Try another way. </notification> @@ -4906,6 +5109,7 @@ Cannot region cross into banned parcel. Try another way. <notification icon="notify.tga" name="TelehubRedirect" + persist="true" type="notify"> You have been redirected to a telehub. </notification> @@ -4913,6 +5117,7 @@ You have been redirected to a telehub. <notification icon="notify.tga" name="CouldntTPCloser" + persist="true" type="notify"> Could not teleport closer to destination. </notification> @@ -4920,6 +5125,7 @@ Could not teleport closer to destination. <notification icon="notify.tga" name="TPCancelled" + persist="true" type="notify"> Teleport cancelled. </notification> @@ -4927,6 +5133,7 @@ Teleport cancelled. <notification icon="notify.tga" name="FullRegionTryAgain" + persist="true" type="notify"> The region you are attempting to enter is currently full. Please try again in a few moments. @@ -4935,6 +5142,7 @@ Please try again in a few moments. <notification icon="notify.tga" name="GeneralFailure" + persist="true" type="notify"> General failure. </notification> @@ -4942,6 +5150,7 @@ General failure. <notification icon="notify.tga" name="RoutedWrongRegion" + persist="true" type="notify"> Routed to wrong region. Please try again. </notification> @@ -4949,6 +5158,7 @@ Routed to wrong region. Please try again. <notification icon="notify.tga" name="NoValidAgentID" + persist="true" type="notify"> No valid agent id. </notification> @@ -4956,6 +5166,7 @@ No valid agent id. <notification icon="notify.tga" name="NoValidSession" + persist="true" type="notify"> No valid session id. </notification> @@ -4963,6 +5174,7 @@ No valid session id. <notification icon="notify.tga" name="NoValidCircuit" + persist="true" type="notify"> No valid circuit code. </notification> @@ -4970,6 +5182,7 @@ No valid circuit code. <notification icon="notify.tga" name="NoValidTimestamp" + persist="true" type="notify"> No valid timestamp. </notification> @@ -4977,6 +5190,7 @@ No valid timestamp. <notification icon="notify.tga" name="NoPendingConnection" + persist="true" type="notify"> Unable to create pending connection. </notification> @@ -4984,6 +5198,7 @@ Unable to create pending connection. <notification icon="notify.tga" name="InternalUsherError" + persist="true" type="notify"> Internal error attempting to connect agent usher. </notification> @@ -4991,6 +5206,7 @@ Internal error attempting to connect agent usher. <notification icon="notify.tga" name="NoGoodTPDestination" + persist="true" type="notify"> Unable to find a good teleport destination in this region. </notification> @@ -4998,6 +5214,7 @@ Unable to find a good teleport destination in this region. <notification icon="notify.tga" name="InternalErrorRegionResolver" + persist="true" type="notify"> Internal error attempting to activate region resolver. </notification> @@ -5005,6 +5222,7 @@ Internal error attempting to activate region resolver. <notification icon="notify.tga" name="NoValidLanding" + persist="true" type="notify"> A valid landing point could not be found. </notification> @@ -5012,6 +5230,7 @@ A valid landing point could not be found. <notification icon="notify.tga" name="NoValidParcel" + persist="true" type="notify"> No valid parcel could be found. </notification> @@ -5040,28 +5259,6 @@ An object named [OBJECTFROMNAME] owned by [NAME_SLURL] has given you this [OBJEC <notification icon="notify.tga" - name="ObjectGiveItemUnknownUser" - type="offer"> -An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you this [OBJECTTYPE]: -[ITEM_SLURL] - <form name="form"> - <button - index="0" - name="Keep" - text="Keep"/> - <button - index="1" - name="Discard" - text="Discard"/> - <button - index="2" - name="Mute" - text="Block"/> - </form> - </notification> - - <notification - icon="notify.tga" name="UserGiveItem" type="offer"> [NAME_SLURL] has given you this [OBJECTTYPE]: @@ -5085,6 +5282,7 @@ An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you th <notification icon="notify.tga" name="GodMessage" + persist="true" type="notify"> [NAME] @@ -5094,6 +5292,7 @@ An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you th <notification icon="notify.tga" name="JoinGroup" + persist="true" type="notify"> [MESSAGE] <form name="form"> @@ -5116,9 +5315,9 @@ An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you th icon="notify.tga" name="TeleportOffered" type="offer"> -[NAME] has offered to teleport you to their location: +[NAME_SLURL] has offered to teleport you to their location: -[MESSAGE] +[MESSAGE] - [MATURITY_STR] <icon>[MATURITY_ICON]</icon> <form name="form"> <button index="0" @@ -5142,6 +5341,7 @@ An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you th <notification icon="notify.tga" name="GotoURL" + persist="true" type="notify"> [MESSAGE] [URL] @@ -5161,7 +5361,7 @@ An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you th icon="notify.tga" name="OfferFriendship" type="offer"> -[NAME] is offering friendship. +[NAME_SLURL] is offering friendship. [MESSAGE] @@ -5188,6 +5388,7 @@ An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you th <notification icon="notify.tga" name="OfferFriendshipNoMessage" + persist="true" type="notify"> [NAME] is offering friendship. @@ -5214,13 +5415,29 @@ An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you th <notification icon="notify.tga" name="FriendshipDeclined" + persist="true" type="notify"> [NAME] declined your friendship offer. </notification> + + <notification + icon="notify.tga" + name="FriendshipAcceptedByMe" + type="offer"> +Friendship offer accepted. + </notification> <notification icon="notify.tga" + name="FriendshipDeclinedByMe" + type="offer"> +Friendship offer declined. + </notification> + + <notification + icon="notify.tga" name="OfferCallingCard" + persist="true" type="notify"> [FIRST] [LAST] is offering their calling card. This will add a bookmark in your inventory so you can quickly IM this Resident. @@ -5241,6 +5458,7 @@ This will add a bookmark in your inventory so you can quickly IM this Resident. name="RegionRestartMinutes" priority="high" sound="UISndAlert" + persist="true" type="notify"> This region will restart in [MINUTES] minutes. If you stay in this region you will be logged out. @@ -5251,6 +5469,7 @@ If you stay in this region you will be logged out. name="RegionRestartSeconds" priority="high" sound="UISndAlert" + persist="true" type="notify"> This region will restart in [SECONDS] seconds. If you stay in this region you will be logged out. @@ -5259,6 +5478,7 @@ If you stay in this region you will be logged out. <notification icon="notify.tga" name="LoadWebPage" + persist="true" type="notify"> Load web page [URL]? @@ -5280,6 +5500,7 @@ From object: [OBJECTNAME], owner: [NAME]? <notification icon="notify.tga" name="FailedToFindWearableUnnamed" + persist="true" type="notify"> Failed to find [TYPE] in database. </notification> @@ -5287,6 +5508,7 @@ Failed to find [TYPE] in database. <notification icon="notify.tga" name="FailedToFindWearable" + persist="true" type="notify"> Failed to find [TYPE] named [DESC] in database. </notification> @@ -5294,6 +5516,7 @@ Failed to find [TYPE] named [DESC] in database. <notification icon="notify.tga" name="InvalidWearable" + persist="true" type="notify"> The item you are trying to wear uses a feature that your Viewer can't read. Please upgrade your version of [APP_NAME] to wear this item. </notification> @@ -5301,6 +5524,7 @@ The item you are trying to wear uses a feature that your Viewer can't read. <notification icon="notify.tga" name="ScriptQuestion" + persist="true" type="notify"> '[OBJECTNAME]', an object owned by '[NAME]', would like to: @@ -5326,6 +5550,7 @@ Is this OK? icon="notify.tga" name="ScriptQuestionCaution" priority="high" + persist="true" type="notify"> An object named '[OBJECTNAME]', owned by '[NAME]' would like to: @@ -5353,6 +5578,7 @@ Grant this request? <notification icon="notify.tga" name="ScriptDialog" + persist="true" type="notify"> [FIRST] [LAST]'s '[TITLE]' [MESSAGE] @@ -5367,6 +5593,7 @@ Grant this request? <notification icon="notify.tga" name="ScriptDialogGroup" + persist="true" type="notify"> [GROUPNAME]'s '[TITLE]' [MESSAGE] @@ -5378,31 +5605,11 @@ Grant this request? </form> </notification> - <notification - icon="notify.tga" - name="ScriptToast" - type="notify"> - [FIRST] [LAST]'s '[TITLE]' is requesting user input. - <form name="form"> - <button - index="0" - name="Open" - text="Open Dialog"/> - <button - index="1" - name="Ignore" - text="Ignore"/> - <button - index="2" - name="Block" - text="Block"/> - </form> - </notification> - <!-- <notification icon="notify.tga" name="FirstBalanceIncrease" + persist="true" type="notify"> You just received L$[AMOUNT]. Your L$ balance is shown in the upper-right. @@ -5411,6 +5618,7 @@ Your L$ balance is shown in the upper-right. <notification icon="notify.tga" name="FirstBalanceDecrease" + persist="true" type="notify"> You just paid L$[AMOUNT]. Your L$ balance is shown in the upper-right. @@ -5420,6 +5628,7 @@ Your L$ balance is shown in the upper-right. <notification icon="notify.tga" name="BuyLindenDollarSuccess" + persist="true" type="notify"> Thank you for your payment! @@ -5432,6 +5641,7 @@ The status of your payment can be checked on your Transaction History page on yo <notification icon="notify.tga" name="FirstSit" + persist="true" type="notify"> You are sitting. Use your arrow keys (or AWSD) to look around. @@ -5441,6 +5651,7 @@ Click the 'Stand Up' button to stand. <notification icon="notify.tga" name="FirstMap" + persist="true" type="notify"> Click and drag the map to look around. Double-click to teleport. @@ -5450,6 +5661,7 @@ Use the controls on the right to find things and display different backgrounds. <notification icon="notify.tga" name="FirstBuild" + persist="true" type="notify"> You have opened the Build Tools. Every object you see around you was created using these tools. </notification> @@ -5459,6 +5671,7 @@ You have opened the Build Tools. Every object you see around you was created usi <notification icon="notify.tga" name="FirstLeftClickNoHit" + persist="true" type="notify"> Left-clicking interacts with special objects. If the mouse pointer changes to a hand, you can interact with the object. @@ -5468,6 +5681,7 @@ You have opened the Build Tools. Every object you see around you was created usi <notification icon="notify.tga" name="FirstTeleport" + persist="true" type="notify"> You can only teleport to certain areas in this region. The arrow points to your specific destination. Click the arrow to dismiss it. </notification> @@ -5477,6 +5691,7 @@ You can only teleport to certain areas in this region. The arrow points to your <notification icon="notify.tga" name="FirstOverrideKeys" + persist="true" type="notify"> Your movement keys are now being handled by an object. Try the arrow keys or AWSD to see what they do. @@ -5488,6 +5703,7 @@ Press 'M' to do this. <notification icon="notify.tga" name="FirstAppearance" + persist="true" type="notify"> You are editing your Appearance. Use the arrow keys to look around. @@ -5497,6 +5713,7 @@ When you are done, press 'Save All'. <notification icon="notify.tga" name="FirstInventory" + persist="true" type="notify"> This is your Inventory, which contains items you own. @@ -5509,6 +5726,7 @@ This is your Inventory, which contains items you own. <notification icon="notify.tga" name="FirstSandbox" + persist="true" type="notify"> This is a sandbox area, and is meant to help Residents learn how to build. @@ -5519,6 +5737,7 @@ Things you build here will be deleted after you leave, so don't forget to r <notification icon="notify.tga" name="FirstFlexible" + persist="true" type="notify"> This object is flexible. Flexis must be phantom and not physical. </notification> @@ -5526,6 +5745,7 @@ This object is flexible. Flexis must be phantom and not physical. <notification icon="notify.tga" name="FirstDebugMenus" + persist="true" type="notify"> You opened the Advanced menu. @@ -5538,6 +5758,7 @@ To toggle this menu, <notification icon="notify.tga" name="FirstSculptedPrim" + persist="true" type="notify"> You are editing a Sculpted prim. Sculpties require a special texture to define their shape. </notification> @@ -5547,6 +5768,7 @@ You are editing a Sculpted prim. Sculpties require a special texture to define t <notification icon="notify.tga" name="FirstMedia" + persist="true" type="notify"> You have begun playing media. Media can set to play automatically in the preferences window under Audio / Video. Note that this can be a security risk for media sites you do not trust. </notification> @@ -5587,6 +5809,7 @@ Click Accept to join the call or Decline to decline the invitation. Click Block <notification icon="notify.tga" name="AutoUnmuteByIM" + persist="true" type="notify"> [FIRST] [LAST] was sent an instant message and has been automatically unblocked. </notification> @@ -5594,6 +5817,7 @@ Click Accept to join the call or Decline to decline the invitation. Click Block <notification icon="notify.tga" name="AutoUnmuteByMoney" + persist="true" type="notify"> [FIRST] [LAST] was given money and has been automatically unblocked. </notification> @@ -5601,6 +5825,7 @@ Click Accept to join the call or Decline to decline the invitation. Click Block <notification icon="notify.tga" name="AutoUnmuteByInventory" + persist="true" type="notify"> [FIRST] [LAST] was offered inventory and has been automatically unblocked. </notification> @@ -5759,6 +5984,50 @@ We are creating a voice channel for you. This may take up to one minute. </notification> <notification + icon="notify.tga" + name="VoiceEffectsExpired" + sound="UISndAlert" + persist="true" + type="notify"> +One or more of your subscribed Voice Morphs has expired. +[[URL] Click here] to renew your subscription. + <unique/> + </notification> + + <notification + icon="notify.tga" + name="VoiceEffectsExpiredInUse" + sound="UISndAlert" + persist="true" + type="notify"> +The active Voice Morph has expired, your normal voice settings have been applied. +[[URL] Click here] to renew your subscription. + <unique/> + </notification> + + <notification + icon="notify.tga" + name="VoiceEffectsWillExpire" + sound="UISndAlert" + persist="true" + type="notify"> +One or more of your Voice Morphs will expire in less than [INTERVAL] days. +[[URL] Click here] to renew your subscription. + <unique/> + </notification> + LLNotificationsUtil::add("VoiceEffectsNew"); + + <notification + icon="notify.tga" + name="VoiceEffectsNew" + sound="UISndAlert" + persist="true" + type="notify"> +New Voice Morphs are available! + <unique/> + </notification> + + <notification icon="notifytip.tga" name="Cannot enter parcel: not a group member" type="notifytip"> @@ -5848,7 +6117,8 @@ Are you sure you want to close all IMs? <usetemplate name="okcancelignore" notext="Cancel" - yestext="OK"/> + yestext="OK" + ignoretext="Confirm before I close all IMs"/> </notification> <notification icon="notifytip.tga" @@ -5913,6 +6183,186 @@ Selected button can not be shown right now. The button will be shown when there is enough space for it. </notification> + <notification + icon="notifytip.tga" + name="ShareNotification" + type="notifytip"> +Select residents to share with. + </notification> + <notification + icon="notifytip.tga" + name="ShareItemsConfirmation" + type="alertmodal"> +Are you sure you want to share the following items: + +[ITEMS] + +With the following Residents: + +[RESIDENTS] + <usetemplate + name="okcancelbuttons" + notext="Cancel" + yestext="Ok"/> + </notification> + <notification + icon="notifytip.tga" + name="ItemsShared" + type="notifytip"> +Items successfully shared. + </notification> + <notification + icon="notifytip.tga" + name="DeedToGroupFail" + type="notifytip"> +Deed to group failed. + </notification> + + <notification + icon="notifytip.tga" + name="AvatarRezNotification" + type="notifytip"> +( [EXISTENCE] seconds alive ) +Avatar '[NAME]' declouded after [TIME] seconds. + </notification> + + <notification + icon="notifytip.tga" + name="AvatarRezSelfBakedDoneNotification" + type="notifytip"> +( [EXISTENCE] seconds alive ) +You finished baking your outfit after [TIME] seconds. + </notification> + + <notification + icon="notifytip.tga" + name="AvatarRezSelfBakedUpdateNotification" + type="notifytip"> +( [EXISTENCE] seconds alive ) +You sent out an update of your appearance after [TIME] seconds. +[STATUS] + </notification> + + + <notification + icon="notifytip.tga" + name="AvatarRezCloudNotification" + type="notifytip"> +( [EXISTENCE] seconds alive ) +Avatar '[NAME]' became cloud. + </notification> + + <notification + icon="notifytip.tga" + name="AvatarRezArrivedNotification" + type="notifytip"> +( [EXISTENCE] seconds alive ) +Avatar '[NAME]' appeared. + </notification> + + <notification + icon="notifytip.tga" + name="AvatarRezLeftCloudNotification" + type="notifytip"> +( [EXISTENCE] seconds alive ) +Avatar '[NAME]' left after [TIME] seconds as cloud. + </notification> + + <notification + icon="notifytip.tga" + name="AvatarRezEnteredAppearanceNotification" + type="notifytip"> +( [EXISTENCE] seconds alive ) +Avatar '[NAME]' entered appearance mode. + </notification> + + <notification + icon="notifytip.tga" + name="AvatarRezLeftAppearanceNotification" + type="notifytip"> +( [EXISTENCE] seconds alive ) +Avatar '[NAME]' left appearance mode. + </notification> + + <notification + icon="alertmodal.tga" + name="NoConnect" + type="alertmodal"> +We're having trouble connecting using [PROTOCOL] [HOSTID]. +Please check your network and firewall setup. + <form name="form"> + <button + default="true" + index="0" + name="OK" + text="OK"/> + </form> + </notification> + + <notification + icon="alertmodal.tga" + name="NoVoiceConnect" + type="alertmodal"> +We're having trouble connecting to your voice server: + +[HOSTID] + +Voice communications will not be available. +Please check your network and firewall setup. + <form name="form"> + <button + default="true" + index="0" + name="OK" + text="OK"/> + </form> + </notification> + + <notification + icon="notifytip.tga" + name="AvatarRezLeftNotification" + type="notifytip"> +( [EXISTENCE] seconds alive ) +Avatar '[NAME]' left as fully loaded. + </notification> + + <notification + icon="notifytip.tga" + name="AvatarRezSelfBakeNotification" + type="notifytip"> +( [EXISTENCE] seconds alive ) +You uploaded a [RESOLUTION] baked texture for '[BODYREGION]' after [TIME] seconds. + </notification> + + <notification + icon="alertmodal.tga" + name="ConfirmLeaveCall" + type="alert"> +Are you sure you want to leave this call? + <usetemplate + ignoretext="Confirm before I leave call" + name="okcancelignore" + notext="No" + yestext="Yes"/> + <unique/> + </notification> + + <notification + icon="alertmodal.tga" + name="ConfirmMuteAll" + type="alert"> +You have selected to mute all participants in a group call. +This will also cause all residents that later join the call to be +muted, even after you have left the call. + +Mute everyone? + <usetemplate + ignoretext="Confirm before I mute all participants in a group call" + name="okcancelignore" + yestext="Ok" + notext="Cancel"/> + <unique/> + </notification> <global name="UnsupportedCPU"> - Your CPU speed does not meet the minimum requirements. diff --git a/indra/newview/skins/default/xui/en/outfit_accordion_tab.xml b/indra/newview/skins/default/xui/en/outfit_accordion_tab.xml new file mode 100644 index 0000000000..bdfa928b1d --- /dev/null +++ b/indra/newview/skins/default/xui/en/outfit_accordion_tab.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<!-- *NOTE: mantipov: this xml is intended to be used inside panel_outfits_list.xml for each outfit folder--> +<!-- All accordion tabs in the My Appearance/My Outfits panel will be created from this one at runtime--> +<!-- Non of string values of controls below are visible to user. They are not need to be translated. --> +<accordion_tab + display_children="false" + follows="all" + height="45" + layout="topleft" + name="Mockup Tab" + selection_enabled="true" + title="Mockup Tab" + translate="false" + width="0"> + <wearable_items_list + allow_select="true" + follows="all" + keep_one_selected="true" + multi_select="true" + name="wearable_items_list" + translate="false" + standalone="false" + /> +</accordion_tab> diff --git a/indra/newview/skins/default/xui/en/panel_active_object_row.xml b/indra/newview/skins/default/xui/en/panel_active_object_row.xml index 7657fb8055..bef5f8dafd 100644 --- a/indra/newview/skins/default/xui/en/panel_active_object_row.xml +++ b/indra/newview/skins/default/xui/en/panel_active_object_row.xml @@ -10,10 +10,6 @@ background_opaque="false" background_visible="true" bg_alpha_color="0.0 0.0 0.0 0.0" > - <string - name="unknown_obj"> - Unknown Object - </string> <chiclet_script name="object_chiclet" layout="topleft" diff --git a/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml b/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml index 28a6995186..e70abc0975 100644 --- a/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml +++ b/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml @@ -37,7 +37,7 @@ layout="topleft" name="speakers_list" opaque="false" - show_info_btn="false" + show_info_btn="true" show_profile_btn="false" show_speaking_indicator="false" width="147" /> diff --git a/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml index c605975c8e..876ff9961b 100644 --- a/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml +++ b/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml @@ -69,12 +69,13 @@ name="last_interaction" text_color="LtGray_50" value="0s" - width="24" /> + width="35" /> <button follows="right" height="16" image_pressed="Info_Press" image_unselected="Info_Over" + layout="topleft" left_pad="3" right="-53" name="info_btn" diff --git a/indra/newview/skins/default/xui/en/panel_block_list_sidetray.xml b/indra/newview/skins/default/xui/en/panel_block_list_sidetray.xml index 072ea882e6..1e6a31d388 100644 --- a/indra/newview/skins/default/xui/en/panel_block_list_sidetray.xml +++ b/indra/newview/skins/default/xui/en/panel_block_list_sidetray.xml @@ -11,14 +11,16 @@ width="280"> <button follows="top|left" - height="25" - image_overlay="BackArrow_Off" + height="24" + image_hover_unselected="BackButton_Over" + image_pressed="BackButton_Press" + image_unselected="BackButton_Off" layout="topleft" name="back" - left="10" + left="4" tab_stop="false" - top="0" - width="25"/> + top="1" + width="30"/> <text follows="top|left|right" font="SansSerifLargeBold" @@ -39,7 +41,13 @@ name="blocked" tool_tip="List of currently blocked Residents" top="30" - width="270" /> + width="270"> + <scroll_list.columns + name="item_name" /> + <scroll_list.columns + name="item_type" + width="96" /> + </scroll_list> <button follows="left|bottom" height="23" diff --git a/indra/newview/skins/default/xui/en/panel_body_parts_list_item.xml b/indra/newview/skins/default/xui/en/panel_body_parts_list_item.xml new file mode 100644 index 0000000000..4f989a6f6f --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_body_parts_list_item.xml @@ -0,0 +1,105 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + follows="top|right|left" + height="23" + layout="topleft" + left="0" + name="wearable_item" + top="0" + width="380"> + <icon + follows="top|right|left" + height="22" + image_name="ListItem_Over" + layout="topleft" + left="0" + name="hovered_icon" + top="1" + visible="false" + width="380" /> + <icon + height="22" + follows="top|right|left" + image_name="ListItem_Select" + layout="topleft" + left="0" + name="selected_icon" + top="1" + visible="false" + width="380" /> + <icon + height="16" + follows="top|left" + image_name="Inv_Object" + layout="topleft" + left="0" + name="item_icon" + top="2" + width="16" /> + <text + follows="left|right" + height="16" + layout="topleft" + left_pad="5" + allow_html="false" + use_ellipses="true" + name="item_name" + text_color="white" + top="5" + value="..." + width="359" /> + <panel + background_visible="false" + name="btn_lock" + layout="topleft" + follows="top|right" + top="0" + left="0" + height="23" + width="23" + tab_stop="false" + tool_tip="You don't have permission to edit"> + <icon + name="btn_lock1" + layout="topleft" + follows="top|right" + image_name="Locked_Icon" + top="2" + left="5" + height="13" + width="9" + tab_stop="false" /> + </panel> + <panel + background_visible="false" + name="btn_edit_panel" + layout="topleft" + follows="top|right" + top="1" + left_pad="3" + height="23" + width="26" + tab_stop="false"> + <button + name="btn_edit" + layout="topleft" + follows="top|right" + image_overlay="Edit_Wrench" + top="0" + left="0" + height="23" + width="23" + tab_stop="false" + tool_tip="Edit this shape"/> + </panel> + <icon + follows="left|right|top" + height="3" + image_name="Wearables_Divider" + layout="bottomleft" + left="0" + name="wearable_type_separator_icon" + top="0" + visible="true" + width="380"/> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_bodyparts_list_button_bar.xml b/indra/newview/skins/default/xui/en/panel_bodyparts_list_button_bar.xml new file mode 100644 index 0000000000..dc123f13f4 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_bodyparts_list_button_bar.xml @@ -0,0 +1,36 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> + +<panel + follows="left|right|top" + height="35" + layout="topleft" + left="0" + name="clothing_list_button_bar_panel" + top="0" + visible="true" + width="300"> + <button + follows="top|left" + height="25" + image_hover_unselected="Toolbar_Middle_Over" + image_selected="Toolbar_Middle_Selected" + image_unselected="Toolbar_Middle_Off" + label="Switch" + layout="topleft" + left="5" + name="switch_btn" + top="5" + width="45" /> + <button + follows="top|right" + height="25" + image_hover_unselected="Toolbar_Middle_Over" + image_overlay="Shop" + image_selected="Toolbar_Middle_Selected" + image_unselected="Toolbar_Middle_Off" + layout="topleft" + right="-5" + name="bodyparts_shop_btn" + top="5" + width="45" /> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml index aad55685d2..4eff5bc48a 100644 --- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml +++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml @@ -1,309 +1,401 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel - mouse_opaque="true" background_visible="true" bg_alpha_color="DkGray" bg_opaque_color="DkGray" + chrome="true" follows="left|bottom|right" height="33" layout="topleft" left="0" name="bottom_tray" top="28" - chrome="true" - border_visible="false" - width="1000"> - <string name="SpeakBtnToolTip">Turns microphone on/off</string> - <string name="VoiceControlBtnToolTip">Shows/hides voice control panel</string> + width="1310"> + <string + name="SpeakBtnToolTip" + value="Turns microphone on/off" /> + <string + name="VoiceControlBtnToolTip" + value="Shows/hides voice control panel" /> <layout_stack - mouse_opaque="false" border_size="0" clip="false" follows="all" height="28" layout="topleft" left="0" + mouse_opaque="false" name="toolbar_stack" orientation="horizontal" top="0" - width="1000"> + width="1310"> <icon auto_resize="false" follows="left|right" height="10" image_name="spacer24.tga" layout="topleft" - min_width="2" left="0" + min_width="2" top="0" width="2" /> <layout_panel - mouse_opaque="false" auto_resize="false" + filename="panel_nearby_chat_bar.xml" follows="left|right" height="28" layout="topleft" left="0" + max_width="320" min_height="23" - width="310" - top="4" - min_width="188" + min_width="214" + mouse_opaque="false" name="chat_bar" - user_resize="false" - filename="panel_nearby_chat_bar.xml" /> + top="4" + user_resize="true" + width="308" /> + <!-- + There is resize bar between chatbar and Speak button. It has 2px width (is is set as 2*UIResizeBarOverlap) + --> <layout_panel - mouse_opaque="false" auto_resize="false" follows="right" height="28" layout="topleft" min_height="28" - width="100" - top_delta="0" - min_width="54" + min_width="59" + mouse_opaque="false" name="speak_panel" - user_resize="false"> - <talk_button - follows="left|right" - height="23" - speak_button.tab_stop="true" - show_button.tab_stop="true" - layout="topleft" - left="0" - name="talk" - top="5" - width="100"> - <show_button> - <show_button.init_callback - function="Button.SetDockableFloaterToggle" - parameter="voice_controls" /> - </show_button> - </talk_button> + top_delta="0" + user_resize="true" + width="110"> + <talk_button + follows="left|right" + height="23" + layout="topleft" + left="2" + name="talk" + top="5" + width="105"> + <show_button + tab_stop="true"> + <init_callback + function="Button.SetDockableFloaterToggle" + parameter="voice_controls" /> + </show_button> + <!-- do not remove halign attribute with default value. otherwise it can't be overridden in other locales. + & pad_right is default value for long label which can be right aligned. See EXT-6318 --> + <speak_button + halign="center" + label="Speak" + label_selected="Speak" + name="speak_btn" + pad_right="20" + tab_stop="true" + use_ellipses="true" /> + </talk_button> </layout_panel> - <icon - auto_resize="false" - follows="left|right" - height="10" - image_name="spacer24.tga" - layout="topleft" - left="0" - name="after_speak_panel" - min_width="3" - top="0" - width="3"/> <layout_panel - mouse_opaque="false" auto_resize="false" follows="right" height="28" layout="topleft" min_height="28" - width="82" - top_delta="0" - min_width="52" + min_width="65" + mouse_opaque="false" name="gesture_panel" - user_resize="false"> - <gesture_combo_list - follows="left|right" - height="23" - label="Gesture" - layout="topleft" - name="Gesture" - left="0" - top="5" - width="82" - tool_tip="Shows/hides gestures"> - <gesture_combo_list.combo_button - pad_right="10" - use_ellipses="true" /> - </gesture_combo_list> + top_delta="0" + user_resize="false" + width="85"> + <gesture_combo_list + follows="left|right" + height="23" + label="Gesture" + layout="topleft" + left="0" + name="Gesture" + tool_tip="Shows/hides gestures" + top="5" + width="82"> + <combo_button + pad_right="10" + use_ellipses="true" /> + <combo_list + page_lines="17" /> + </gesture_combo_list> </layout_panel> - <icon - auto_resize="false" - color="0 0 0 0" - follows="left|right" - height="10" - image_name="spacer24.tga" - layout="topleft" - left="0" - min_width="3" - name="after_gesture_panel" - top="0" - width="3"/> <layout_panel - mouse_opaque="false" auto_resize="false" follows="right" height="28" layout="topleft" min_height="28" + min_width="52" + mouse_opaque="false" name="movement_panel" user_resize="false" - width="80" - min_width="49"> + width="83"> <button - image_selected="PushButton_Selected_Press" - image_pressed="PushButton_Press" - image_pressed_selected="PushButton_Selected_Press" follows="left|right" height="23" - use_ellipses="true" + image_pressed="PushButton_Press" + image_pressed_selected="PushButton_Selected_Press" + image_selected="PushButton_Selected_Press" is_toggle="true" label="Move" layout="topleft" name="movement_btn" tool_tip="Shows/hides movement controls" top="5" + use_ellipses="true" width="80"> - <button.init_callback + <init_callback function="Button.SetDockableFloaterToggle" parameter="moveview" /> </button> </layout_panel> - <icon - auto_resize="false" - color="0 0 0 0" - follows="left|right" - height="10" - image_name="spacer24.tga" - layout="topleft" - left="0" - min_width="3" - name="after_movement_panel" - top="0" - width="3"/> <layout_panel - mouse_opaque="false" auto_resize="false" follows="left|right" height="28" layout="topleft" min_height="28" - min_width="49" + min_width="52" + mouse_opaque="false" name="cam_panel" user_resize="false" - width="80"> + width="83"> <button - image_selected="PushButton_Selected_Press" - image_pressed="PushButton_Press" - image_pressed_selected="PushButton_Selected_Press" follows="left|right" height="23" - use_ellipses="true" + image_pressed="PushButton_Press" + image_pressed_selected="PushButton_Selected_Press" + image_selected="PushButton_Selected_Press" is_toggle="true" label="View" layout="topleft" left="0" + name="camera_btn" tool_tip="Shows/hides camera controls" top="5" - name="camera_btn" + use_ellipses="true" width="80"> - <button.init_callback + <init_callback function="Button.SetDockableFloaterToggle" parameter="camera" /> </button> </layout_panel> - <icon - auto_resize="false" - color="0 0 0 0" - follows="left|right" - height="10" - image_name="spacer24.tga" - layout="topleft" - left="0" - min_width="3" - name="after_cam_panel" - top="0" - width="3"/> <layout_panel - mouse_opaque="false" auto_resize="false" follows="left|right" height="28" layout="topleft" min_width="40" + mouse_opaque="false" name="snapshot_panel" - width="40"> + user_resize="false" + width="39"> <button - follows="left|right" + follows="left|right" height="23" + image_overlay="Snapshot_Off" + image_pressed="PushButton_Press" + image_pressed_selected="PushButton_Selected_Press" image_selected="PushButton_Selected_Press" + is_toggle="true" + layout="topleft" + left="0" + name="snapshots" + tool_tip="Take snapshot" + top="5" + width="36"> + <init_callback + function="Button.SetFloaterToggle" + parameter="snapshot" /> + </button> + </layout_panel> + <layout_panel + auto_resize="false" + follows="left|right" + height="28" + layout="topleft" + min_height="28" + min_width="52" + mouse_opaque="false" + name="build_btn_panel" + user_resize="false" + width="83"> +<!--*FIX: Build Floater is not opened with default registration. Will be fixed soon. +Disabled for now. +--> + <button + follows="left|right" + height="23" image_pressed="PushButton_Press" image_pressed_selected="PushButton_Selected_Press" + image_selected="PushButton_Selected_Press" + is_toggle="true" + label="Build" + layout="topleft" left="0" - label="" + name="build_btn" + tool_tip="Shows/hides Build Tools" + top="5" + use_ellipses="true" + width="80"> + <commit_callback + function="Build.Toggle" + parameter="build" /> + </button> + </layout_panel> + <layout_panel + auto_resize="false" + follows="left|right" + height="28" + layout="topleft" + min_height="28" + min_width="52" + mouse_opaque="false" + name="search_btn_panel" + user_resize="false" + width="83"> + <button + follows="left|right" + height="23" + image_pressed="PushButton_Press" + image_pressed_selected="PushButton_Selected_Press" + image_selected="PushButton_Selected_Press" + is_toggle="true" + label="Search" layout="topleft" - name="snapshots" - width="36" + left="0" + name="search_btn" + tool_tip="Shows/hides Search" top="5" + use_ellipses="true" + width="80"> + <init_callback + function="Button.SetFloaterToggle" + parameter="search" /> + </button> + </layout_panel> + <layout_panel + auto_resize="false" + follows="left|right" + height="28" + layout="topleft" + min_height="28" + min_width="52" + mouse_opaque="false" + name="world_map_btn_panel" + user_resize="false" + width="83"> + <button + follows="left|right" + height="23" + image_pressed="PushButton_Press" + image_pressed_selected="PushButton_Selected_Press" + image_selected="PushButton_Selected_Press" is_toggle="true" - image_overlay="Snapshot_Off" - tool_tip="Take snapshot"> - <button.init_callback - function="Button.SetFloaterToggle" - parameter="snapshot" /> - </button> - </layout_panel> + label="Map" + layout="topleft" + left="0" + name="world_map_btn" + tool_tip="Shows/hides World Map" + top="5" + use_ellipses="true" + width="80"> + <init_callback + function="Button.SetFloaterToggle" + parameter="world_map" /> + </button> + </layout_panel> <layout_panel + auto_resize="false" + follows="left|right" + height="28" + layout="topleft" + min_height="28" + min_width="52" mouse_opaque="false" + name="mini_map_btn_panel" + user_resize="false" + width="83"> + <button + follows="left|right" + height="23" + image_pressed="PushButton_Press" + image_pressed_selected="PushButton_Selected_Press" + image_selected="PushButton_Selected_Press" + is_toggle="true" + label="Mini-Map" + layout="topleft" + left="0" + name="mini_map_btn" + tool_tip="Shows/hides Mini-Map" + top="5" + use_ellipses="true" + width="80"> + <init_callback + function="Button.SetFloaterToggle" + parameter="mini_map" /> + </button> + </layout_panel> + <layout_panel follows="left|right" - height="29" + height="30" layout="topleft" - top="0" + min_width="95" + mouse_opaque="false" name="chiclet_list_panel" - width="189" - min_width="110" + top="0" user_resize="false" - auto_resize="true"> + width="189"> <!--*NOTE: min_width of the chiclet_panel (chiclet_list) must be the same as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly. EXT-991--> <chiclet_panel - mouse_opaque="false" + chiclet_padding="4" follows="left|right" - height="23" + height="24" layout="topleft" left="1" - min_width="110" + min_width="95" + mouse_opaque="false" name="chiclet_list" - top="8" - chiclet_padding="4" - scrolling_offset="40" + top="7" width="189"> <button auto_resize="true" follows="right" height="29" + image_hover_selected="SegmentedBtn_Left_Over" + image_hover_unselected="SegmentedBtn_Left_Over" + image_overlay="Arrow_Small_Left" + image_pressed="SegmentedBtn_Left_Press" + image_pressed_selected="SegmentedBtn_Left_Press" image_selected="SegmentedBtn_Left_Off" image_unselected="SegmentedBtn_Left_Off" - image_hover_selected="SegmentedBtn_Left_Over" - image_hover_unselected="SegmentedBtn_Left_Over" - image_pressed="SegmentedBtn_Left_Press" - image_pressed_selected="SegmentedBtn_Left_Press" - image_overlay="Arrow_Small_Left" layout="topleft" name="chicklet_left_scroll_button" - scale_image="true" tab_stop="false" - top="-4" - right_pad="2" + top="-28" visible="false" width="7" /> <button auto_resize="true" follows="right" height="29" + image_hover_selected="SegmentedBtn_Right_Over" + image_hover_unselected="SegmentedBtn_Right_Over" + image_overlay="Arrow_Small_Right" + image_pressed="SegmentedBtn_Right_Press" + image_pressed_selected="SegmentedBtn_Right_Press" image_selected="SegmentedBtn_Right_Off" image_unselected="SegmentedBtn_Right_Off" - image_hover_selected="SegmentedBtn_Right_Over" - image_hover_unselected="SegmentedBtn_Right_Over" - image_pressed="SegmentedBtn_Right_Press" - image_pressed_selected="SegmentedBtn_Right_Press" - image_overlay="Arrow_Small_Right" layout="topleft" name="chicklet_right_scroll_button" - scale_image="true" tab_stop="false" - top="-4" + top="-28" visible="false" width="7" /> </chiclet_panel> @@ -319,25 +411,24 @@ as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly. min_width="4" name="DUMMY" top="0" - width="5"/> + width="4" /> <layout_panel auto_resize="false" follows="right" height="28" layout="topleft" min_height="28" - top="0" + min_width="37" name="im_well_panel" - width="35" - min_width="35" - user_resize="false"> + top="0" + user_resize="false" + width="37"> <chiclet_im_well - max_displayed_count="99" - flash_period="0.3" follows="right" height="28" layout="topleft" left="0" + max_displayed_count="99" name="im_well" top="0" width="35"> @@ -363,8 +454,8 @@ image_pressed_selected "Lit" + "Selected" - there are new messages and the Well left="0" name="Unread IM messages" tool_tip="Conversations" - width="34" > - <button.init_callback + width="34"> + <init_callback function="Button.SetDockableFloaterToggle" parameter="im_well_window" /> </button> @@ -376,25 +467,12 @@ image_pressed_selected "Lit" + "Selected" - there are new messages and the Well height="28" layout="topleft" min_height="28" - top="0" - left_pad="3" + min_width="37" name="notification_well_panel" - width="40" - min_width="40" - user_resize="false"> - <icon - auto_resize="false" - color="0 0 0 0" - follows="left|right" - height="10" - image_name="spacer24.tga" - layout="topleft" - left="0" - min_width="4" top="0" - width="5" /> + user_resize="false" + width="37"> <chiclet_notification - flash_period="0.25" follows="right" height="23" layout="topleft" @@ -403,38 +481,27 @@ image_pressed_selected "Lit" + "Selected" - there are new messages and the Well name="notification_well" top="5" width="35"> - <button + <button + auto_resize="true" bottom_pad="3" + follows="right" + halign="center" + height="23" + image_overlay="Notices_Unread" + image_overlay_alignment="center" image_pressed="WellButton_Lit" image_pressed_selected="WellButton_Lit_Selected" image_selected="PushButton_Press" - auto_resize="true" - halign="center" - height="23" - follows="right" - label_color="Black" - left="0" - name="Unread" - image_overlay="Notices_Unread" - image_overlay_alignment="center" - tool_tip="Notifications" - width="34" > - <button.init_callback - function="Button.SetDockableFloaterToggle" - parameter="notification_well_window" /> - </button> - <icon - auto_resize="false" - color="0 0 0 0" - follows="left|right" - height="10" - image_name="spacer24.tga" - layout="topleft" - left="0" - min_width="4" - top="0" - width="5" /> - </chiclet_notification> + label_color="Black" + left="0" + name="Unread" + tool_tip="Notifications" + width="34"> + <init_callback + function="Button.SetDockableFloaterToggle" + parameter="notification_well_window" /> + </button> + </chiclet_notification> </layout_panel> </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_chat_header.xml b/indra/newview/skins/default/xui/en/panel_chat_header.xml index 89d632c4c6..9124ad528d 100644 --- a/indra/newview/skins/default/xui/en/panel_chat_header.xml +++ b/indra/newview/skins/default/xui/en/panel_chat_header.xml @@ -2,7 +2,8 @@ <panel background_visible="true" bevel_style="in" - bg_alpha_color="black" + bg_opaque_color="Black" + bg_alpha_color="DkGray_66" follows="top|left|right" height="24" label="im_header" @@ -19,7 +20,8 @@ name="avatar_icon" top="3" width="18" /> - <text_editor + <text + allow_html="false" allow_scroll="false" v_pad = "7" read_only = "true" diff --git a/indra/newview/skins/default/xui/en/panel_classified_info.xml b/indra/newview/skins/default/xui/en/panel_classified_info.xml index 31719aad20..976f6d6cd0 100644 --- a/indra/newview/skins/default/xui/en/panel_classified_info.xml +++ b/indra/newview/skins/default/xui/en/panel_classified_info.xml @@ -22,25 +22,43 @@ name="l$_price"> L$[PRICE] </panel.string> + <panel.string + name="click_through_text_fmt"> + [TELEPORT] teleport, [MAP] map, [PROFILE] profile + </panel.string> + <panel.string + name="date_fmt"> + [mthnum,datetime,slt]/[day,datetime,slt]/[year,datetime,slt] + </panel.string> + <panel.string + name="auto_renew_on"> + Enabled + </panel.string> + <panel.string + name="auto_renew_off"> + Disabled + </panel.string> <button follows="top|right" - height="23" - image_overlay="BackArrow_Off" + height="24" + image_hover_unselected="BackButton_Over" + image_pressed="BackButton_Press" + image_unselected="BackButton_Off" layout="topleft" name="back_btn" picture_style="true" left="10" tab_stop="false" top="2" - width="23" /> + width="30" /> <text follows="top|left|right" font="SansSerifHugeBold" height="26" layout="topleft" - left_pad="10" + left_pad="4" name="title" - text_color="white" + text_color="LtGray" top="0" value="Classified Info" use_ellipses="true" @@ -49,13 +67,13 @@ color="DkGray2" opaque="true" follows="all" - height="500" + height="502" layout="topleft" left="10" top_pad="10" name="profile_scroll" reserve_scroll_corner="false" - width="313"> + width="312"> <panel name="scroll_content_panel" follows="left|top" @@ -63,18 +81,28 @@ layout="topleft" top="0" background_visible="false" - height="500" + height="610" left="0" - width="295"> + width="285"> + <panel + name="snapshot_panel" + layout="topleft" + follows="left|top|right" + height="197" + left="10" + top="10" + width="275" + > <texture_picker enabled="false" - follows="left|top" + follows="left|top|right" height="197" layout="topleft" - left="10" + left="0" name="classified_snapshot" - top="20" - width="290" /> + top="0" + width="275" /> + </panel> <text_editor allow_scroll="false" bg_visible="false" @@ -93,20 +121,61 @@ v_pad="0" value="[name]" use_ellipses="true" /> + <text + follows="left|top" + font.style="BOLD" + height="10" + layout="topleft" + left="10" + name="classified_location_label" + text_color="white" + top_pad="5" + value="Location:" + width="250" /> <text_editor allow_scroll="false" bg_visible="false" follows="left|top" h_pad="0" - height="25" + height="30" layout="topleft" left="10" name="classified_location" read_only="true" + top_pad="5" width="290" word_wrap="true" v_pad="0" value="[loading...]" /> + <text + follows="left|top" + font.style="BOLD" + height="10" + layout="topleft" + left="10" + name="content_type_label" + text_color="white" + top_pad="10" + value="Content Type:" + width="140" /> + <icon + follows="top|left" + height="16" + image_name="Parcel_M_Light" + layout="topleft" + left_pad="0" + name="content_type_moderate" + top_pad="-11" + width="18" /> + <icon + follows="top|left" + height="16" + image_name="Parcel_PG_Light" + layout="topleft" + left_delta="0" + name="content_type_general" + top_delta="0" + width="18" /> <text_editor allow_scroll="false" bg_visible="false" @@ -114,13 +183,24 @@ h_pad="0" height="18" layout="topleft" - left="10" + left_pad="2" name="content_type" read_only="true" - width="290" - top_pad="5" + width="130" + top_delta="1" v_pad="0" value="[content type]" /> + <text + follows="left|top" + font.style="BOLD" + height="10" + layout="topleft" + left="10" + name="category_label" + text_color="white" + top_pad="0" + value="Category:" + width="140" /> <text_editor allow_html="true" allow_scroll="false" @@ -129,23 +209,51 @@ h_pad="0" height="18" layout="topleft" - left="10" + left_pad="0" name="category" read_only="true" - width="290" - top_pad="5" + width="150" + top_pad="-10" v_pad="0" value="[category]" /> - <check_box - enabled="false" + <text + follows="left|top" + font.style="BOLD" + height="10" + layout="topleft" + left="10" + name="creation_date_label" + text_color="white" + top_pad="0" + value="Creation date:" + width="140" /> + <text_editor + allow_scroll="false" + bg_visible="false" + follows="left|top" + h_pad="0" + halign="left" height="16" - label="Auto renew each week" + layout="topleft" + left_pad="0" + name="creation_date" + read_only="true" + top_pad="-10" + tool_tip="Creation date" + v_pad="0" + value="[date]" + width="150" /> + <text + follows="left|top" + font.style="BOLD" + height="10" layout="topleft" left="10" - name="auto_renew" + name="price_for_listing_label" + text_color="white" top_pad="5" - v_pad="0" - width="290" /> + value="Price for listing:" + width="140" /> <text_editor allow_scroll="false" bg_visible="false" @@ -154,64 +262,166 @@ halign="left" height="16" layout="topleft" - left="10" + left_pad="0" name="price_for_listing" read_only="true" - top_pad="5" + top_pad="-10" tool_tip="Price for listing." v_pad="0" + value="[price]" width="105" /> + <layout_stack + animate="false" + name="descr_stack" + layout="topleft" + follows="all" + orientation="vertical" + left="10" + top_pad="5" + width="290" + height="215"> + <layout_panel + auto_resize="false" + name="clickthrough_layout_panel" + layout="topleft" + follows="all" + left="0" + top="0" + width="290" + height="16" + user_resize="false"> + <text + follows="left|top" + font.style="BOLD" + height="10" + layout="topleft" + left="0" + name="click_through_label" + text_color="white" + top_pad="0" + value="Clicks:" + width="140" /> <text_editor - allow_html="true" allow_scroll="false" bg_visible="false" - follows="left|top|right" + follows="left|top" + h_pad="0" + halign="left" + height="16" + layout="topleft" + left_pad="0" + name="click_through_text" + read_only="true" + top_pad="-10" + tool_tip="Click through data" + v_pad="0" + value="[clicks]" + width="150" /> + </layout_panel> + <layout_panel + auto_resize="false" + name="price_layout_panel" + layout="topleft" + follows="all" + left="0" + top="0" + width="290" + height="16" + user_resize="false"> + <text + follows="left|top" + font.style="BOLD" + height="10" + layout="topleft" + left="0" + name="auto_renew_label" + text_color="white" + top="0" + value="Auto renew:" + width="140" /> + <text + height="16" + layout="topleft" + follows="top|left" + left_pad="0" + name="auto_renew" + top_pad="-10" + value="Enabled" + width="150" /> + </layout_panel> + <layout_panel + name="descr_layout_panel" + layout="topleft" + follows="all" + left="0" + top="0" + width="290" + height="215" + user_resize="false"> + <text + auto_resize="false" + follows="left|top" + font.style="BOLD" + height="10" + layout="topleft" + left="0" + name="classified_desc_label" + text_color="white" + top="0" + value="Description:" + width="250" /> + <text_editor + allow_html="true" + allow_scroll="true" + bg_visible="false" + follows="all" h_pad="0" height="200" layout="topleft" - left="10" + left="0" max_length="1023" name="classified_desc" read_only="true" - width="290" + top_pad="7" + width="280" v_pad="0" value="[description]" word_wrap="true" /> + </layout_panel> + </layout_stack> </panel> </scroll_container> <panel follows="left|right|bottom" - height="20" + height="35" layout="topleft" - top_pad="8" - left="10" + top_pad="5" + left="9" name="buttons"> <button follows="bottom|left" - height="19" + height="23" label="Teleport" layout="topleft" left="0" name="teleport_btn" top="0" - width="90" /> + width="101" /> <button follows="bottom|left" - height="19" + height="23" label="Map" layout="topleft" - left_pad="10" + left_pad="3" name="show_on_map_btn" - top="0" - width="90" /> + width="100" /> <button follows="bottom|left" - height="19" + height="23" label="Edit" layout="topleft" - right="-1" name="edit_btn" - top="0" - width="90" /> + left_pad="3" + width="101" /> </panel> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_classifieds_list_item.xml b/indra/newview/skins/default/xui/en/panel_classifieds_list_item.xml index 0c1418fc2d..af3315ebfe 100644 --- a/indra/newview/skins/default/xui/en/panel_classifieds_list_item.xml +++ b/indra/newview/skins/default/xui/en/panel_classifieds_list_item.xml @@ -64,7 +64,9 @@ layout="topleft" left="103" name="description" - textbox.mouse_opaque="false" + textbox.max_length="1024" + textbox.label="More" + textbox.show_context_menu="false" top_pad="0" width="178" word_wrap="true" /> @@ -76,6 +78,6 @@ left_pad="5" right="-8" name="info_chevron" - top_delta="15" + top_delta="24" width="20" /> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_clothing_list_button_bar.xml b/indra/newview/skins/default/xui/en/panel_clothing_list_button_bar.xml new file mode 100644 index 0000000000..5b3f0b17a9 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_clothing_list_button_bar.xml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> + +<panel + follows="left|right|top" + height="35" + layout="topleft" + left="0" + name="clothing_list_button_bar_panel" + top="0" + visible="true" + width="500"> + <button + follows="top|left" + height="25" + image_hover_unselected="Toolbar_Middle_Over" + image_selected="Toolbar_Middle_Selected" + image_unselected="Toolbar_Middle_Off" + is_toggle="true" + label="Add +" + layout="topleft" + left="5" + name="add_btn" + top="5" + width="45" /> + <button + follows="top|right" + height="25" + image_hover_unselected="Toolbar_Middle_Over" + image_overlay="Shop" + image_selected="Toolbar_Middle_Selected" + image_unselected="Toolbar_Middle_Off" + layout="topleft" + right="-5" + name="clothing_shop_btn" + top="5" + width="45" /> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_clothing_list_item.xml b/indra/newview/skins/default/xui/en/panel_clothing_list_item.xml new file mode 100644 index 0000000000..93d7720c57 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_clothing_list_item.xml @@ -0,0 +1,137 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + follows="top|right|left" + height="23" + layout="topleft" + left="0" + name="wearable_item" + top="0" + width="380"> + <icon + follows="top|right|left" + height="22" + image_name="ListItem_Over" + layout="topleft" + left="0" + name="hovered_icon" + top="1" + visible="false" + width="380" /> + <icon + height="22" + follows="top|right|left" + image_name="ListItem_Select" + layout="topleft" + left="0" + name="selected_icon" + top="1" + visible="false" + width="380" /> + <button + name="btn_delete" + layout="topleft" + follows="top|left" + image_unselected="Toast_CloseBtn" + image_selected="Toast_CloseBtn" + top="3" + left="0" + height="18" + width="18" + tab_stop="false" + tool_tip="Remove from outfit" /> + <icon + height="16" + follows="top|left" + image_name="Inv_Object" + layout="topleft" + left_pad="3" + name="item_icon" + top="2" + width="16" /> + <text + follows="left|right" + height="16" + layout="topleft" + left_pad="5" + allow_html="false" + use_ellipses="true" + name="item_name" + text_color="white" + top="5" + value="..." + width="359" /> + <button + name="btn_move_up" + layout="topleft" + follows="top|right" + image_overlay="UpArrow_Off" + top="1" + left="0" + height="23" + width="23" + tab_stop="false" /> + <button + name="btn_move_down" + layout="topleft" + follows="top|right" + image_overlay="DownArrow_Off" + top="1" + left_pad="3" + height="23" + width="23" + tab_stop="false" /> + <panel + background_visible="false" + name="btn_lock" + layout="topleft" + follows="top|right" + top="0" + left="0" + height="23" + width="23" + tab_stop="false" + tool_tip="You don't have permission to edit"> + <icon + name="btn_lock1" + layout="topleft" + follows="top|right" + image_name="Locked_Icon" + top="2" + left="5" + height="13" + width="9" + tab_stop="false" /> + </panel> + <panel + background_visible="false" + name="btn_edit_panel" + layout="topleft" + follows="top|right" + top="0" + left_pad="3" + height="23" + width="26" + tab_stop="false"> + <button + name="btn_edit" + layout="topleft" + follows="top|right" + image_overlay="Edit_Wrench" + top="1" + left="0" + height="23" + width="23" + tab_stop="false" + tool_tip="Edit this wearable"/> + </panel> + <icon + follows="left|right|top" + height="3" + image_name="Wearables_Divider" + layout="bottomleft" + left="0" + name="wearable_type_separator_icon" + top="0" + visible="false" + width="380"/> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_cof_wearables.xml b/indra/newview/skins/default/xui/en/panel_cof_wearables.xml new file mode 100644 index 0000000000..f016c27b0a --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_cof_wearables.xml @@ -0,0 +1,72 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + background_visible="true" + bg_alpha_color="DkGray" + border="false" + follows="all" + height="200" + left="0" + name="cof_wearables" + width="311"> + <accordion + fit_parent="true" + follows="all" + height="198" + layout="topleft" + left="0" + single_expansion="true" + top="0" + name="cof_wearables_accordion" + background_visible="true" + bg_alpha_color="DkGray2" + width="311"> + <accordion_tab + layout="topleft" + name="tab_attachments" + title="Attachments"> + <flat_list_view + allow_select="true" + follows="all" + height="10" + item_pad="3" + layout="topleft" + left="0" + multi_select="true" + name="list_attachments" + top="0" + width="311" /> + </accordion_tab> + <accordion_tab + layout="topleft" + name="tab_clothing" + title="Clothing"> + <flat_list_view + allow_select="true" + follows="all" + height="10" + item_pad="3" + layout="topleft" + left="0" + multi_select="true" + name="list_clothing" + top="0" + width="311" /> + </accordion_tab> + <accordion_tab + layout="topleft" + name="tab_body_parts" + title="Body Parts"> + <flat_list_view + allow_select="true" + follows="all" + height="10" + item_pad="3" + layout="topleft" + left="0" + multi_select="true" + name="list_body_parts" + top="0" + width="311" /> + </accordion_tab> + </accordion> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_deletable_wearable_list_item.xml b/indra/newview/skins/default/xui/en/panel_deletable_wearable_list_item.xml new file mode 100644 index 0000000000..75b5fd1532 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_deletable_wearable_list_item.xml @@ -0,0 +1,73 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + follows="top|right|left" + height="23" + layout="topleft" + left="0" + name="deletable_wearable_item" + top="0" + width="380"> + <icon + follows="top|right|left" + height="22" + image_name="ListItem_Over" + layout="topleft" + left="0" + name="hovered_icon" + top="1" + visible="false" + width="380" /> + <icon + height="22" + follows="top|right|left" + image_name="ListItem_Select" + layout="topleft" + left="0" + name="selected_icon" + top="1" + visible="false" + width="380" /> + <button + name="btn_delete" + layout="topleft" + follows="top|left" + image_unselected="Toast_CloseBtn" + image_selected="Toast_CloseBtn" + top="3" + left="0" + height="18" + width="18" + tab_stop="false" + tool_tip="Remove from outfit"/> + <icon + height="16" + follows="top|left" + image_name="Inv_Object" + layout="topleft" + left_pad="3" + name="item_icon" + top="2" + width="16" /> + <text + follows="left|right" + height="16" + layout="topleft" + left_pad="5" + allow_html="false" + use_ellipses="true" + name="item_name" + text_color="white" + top="5" + value="..." + width="359" /> + <icon + follows="left|right|top" + height="3" + image_name="Wearables_Divider" + layout="bottomleft" + left="0" + name="wearable_type_separator_icon" + top="0" + visible="true" + width="380"/> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_dummy_clothing_list_item.xml b/indra/newview/skins/default/xui/en/panel_dummy_clothing_list_item.xml new file mode 100644 index 0000000000..a5dd34bd22 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_dummy_clothing_list_item.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + follows="top|right|left" + height="23" + layout="topleft" + left="0" + name="dummy_clothing_item" + top="0" + width="380"> + <icon + follows="top|right|left" + height="22" + image_name="ListItem_Over" + layout="topleft" + left="0" + name="hovered_icon" + top="1" + visible="false" + width="380" /> + <icon + height="22" + follows="top|right|left" + image_name="ListItem_Select" + layout="topleft" + left="0" + name="selected_icon" + top="1" + visible="false" + width="380" /> + <icon + height="16" + color="0.75 0.75 0.75 1" + follows="top|left" + image_name="Inv_Object" + layout="topleft" + left="20" + name="item_icon" + top="2" + width="16" /> + <text + follows="left|right" + height="16" + layout="topleft" + left_pad="5" + allow_html="false" + use_ellipses="true" + name="item_name" + text_color="LtGray_50" + top="4" + value="..." + width="359" /> + <panel + name="btn_add_panel" + layout="topleft" + follows="top|right" + top="0" + left="0" + height="23" + width="26" + tab_stop="false"> + <button + name="btn_add" + layout="topleft" + follows="top|right" + image_overlay="AddItem_Off" + top="0" + left="0" + height="23" + width="23" + tab_stop="false" + tool_tip="Add more items of this type" /> + </panel> + <icon + follows="left|right|top" + height="3" + image_name="Wearables_Divider" + layout="bottomleft" + left="0" + name="wearable_type_separator_icon" + top="0" + visible="true" + width="380"/> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_edit_alpha.xml b/indra/newview/skins/default/xui/en/panel_edit_alpha.xml index 40647e1b81..7bcd4962d2 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_alpha.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_alpha.xml @@ -1,126 +1,151 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel + background_visible="true" follows="all" height="400" layout="topleft" - left="10" + left="0" name="edit_alpha_panel" top_pad="10" - width="313" > + width="333" > <panel - border="true" - follows="left|top|right" - height="180" + border="false" + bg_alpha_color="DkGray2" + bg_opaque_color="DkGray2" + background_visible="true" + background_opaque="true" + follows="top|left|right" + height="400" left="10" layout="topleft" name="avatar_alpha_color_panel" top="0" - width="293" > + width="313" > + <check_box + control_name="LowerAlphaTextureInvisible" + follows="left" + height="16" + layout="topleft" + left="5" + name="lower alpha texture invisible" + top="10" + width="16" /> <texture_picker can_apply_immediately="true" default_image_name="Default" follows="left|top" - height="80" + height="115" label="Lower Alpha" layout="topleft" - left="10" + left_pad="5" name="Lower Alpha" tool_tip="Click to choose a picture" top="10" - width="64" /> + width="115" > + <texture_picker.commit_callback + function="TexturePicker.Commit" /> + </texture_picker> + <check_box - control_name="LowerAlphaTextureInvisible" + control_name="UpperAlphaTextureInvisible" follows="left" height="16" layout="topleft" - left_pad="6" - name="lower alpha texture invisible" - top_delta="4" + left_pad="20" + name="upper alpha texture invisible" + top="10" width="16" /> <texture_picker can_apply_immediately="true" default_image_name="Default" follows="left|top" - height="80" + height="115" label="Upper Alpha" layout="topleft" - left_pad="10" + left_pad="5" name="Upper Alpha" tool_tip="Click to choose a picture" top="10" - width="64" /> + width="115"> + <texture_picker.commit_callback + function="TexturePicker.Commit" /> + </texture_picker> + <check_box - control_name="UpperAlphaTextureInvisible" + control_name="HeadAlphaTextureInvisible" follows="left" height="16" layout="topleft" - left_pad="6" - name="upper alpha texture invisible" - top_delta="4" + left="5" + name="head alpha texture invisible" + top_pad="15" width="16" /> <texture_picker can_apply_immediately="true" default_image_name="Default" follows="left|top" - height="80" + height="115" label="Head Alpha" layout="topleft" - left_pad="10" + left_pad="5" name="Head Alpha" tool_tip="Click to choose a picture" - top="10" - width="64" /> + top_delta="0" + width="115" > + <texture_picker.commit_callback + function="TexturePicker.Commit" /> + </texture_picker> + <check_box - control_name="HeadAlphaTextureInvisible" + control_name="Eye AlphaTextureInvisible" follows="left" height="16" layout="topleft" - left_pad="6" - name="head alpha texture invisible" - top_delta="4" + left_pad="20" + name="eye alpha texture invisible" + top_delta="0" width="16" /> <texture_picker can_apply_immediately="true" default_image_name="Default" follows="left|top" - height="80" + height="115" label="Eye Alpha" layout="topleft" - left="10" + left_pad="5" name="Eye Alpha" tool_tip="Click to choose a picture" - top="100" - width="64" /> + top_delta="0" + width="115" > + <texture_picker.commit_callback + function="TexturePicker.Commit" /> + </texture_picker> + <check_box - control_name="Eye AlphaTextureInvisible" + control_name="HairAlphaTextureInvisible" follows="left" height="16" layout="topleft" - left_pad="6" - name="eye alpha texture invisible" - top_delta="4" + left="5" + name="hair alpha texture invisible" + top_pad="15" width="16" /> <texture_picker can_apply_immediately="true" default_image_name="Default" follows="left|top" - height="80" + height="115" label="Hair Alpha" layout="topleft" - left_pad="10" + left="30" name="Hair Alpha" tool_tip="Click to choose a picture" - top_delta="-4" - width="64" /> - <check_box - control_name="HairAlphaTextureInvisible" - follows="left" - height="16" - layout="topleft" - left_pad="6" - name="hair alpha texture invisible" - top_delta="4" - width="16" /> + top_delta="0" + width="115" > + <texture_picker.commit_callback + function="TexturePicker.Commit" /> + </texture_picker> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_edit_classified.xml b/indra/newview/skins/default/xui/en/panel_edit_classified.xml index 188ded3dab..6744a7b9c2 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_classified.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_classified.xml @@ -3,7 +3,7 @@ background_visible="true" bevel_style="in" follows="left|top|right|bottom" - height="570" + height="569" label="Edit Classified" layout="topleft" left="0" @@ -16,42 +16,50 @@ name="location_notice"> (will update after save) </panel.string> + <string name="publish_label"> + Publish + </string> + <string name="save_label"> + Save + </string> <button follows="top|right" - height="23" - image_overlay="BackArrow_Off" + height="24" + image_hover_unselected="BackButton_Over" + image_pressed="BackButton_Press" + image_unselected="BackButton_Off" layout="topleft" name="back_btn" picture_style="true" left="10" tab_stop="false" top="2" - width="23" /> + width="30" /> <text type="string" length="1" follows="top" - font="SansSerifHuge" - height="15" + font="SansSerifHugeBold" + height="26" layout="topleft" - left_pad="10" + left_pad="4" name="title" - text_color="white" - top="5" + text_color="LtGray" + top="0" width="250"> Edit Classified </text> <scroll_container - color="DkGray2" - follows="all" - height="510" - layout="topleft" - left="10" - top_pad="10" - name="profile_scroll" - reserve_scroll_corner="false" - opaque="true" - width="313"> + color="DkGray2" + follows="all" + height="502" + layout="topleft" + left="8" + top_pad="10" + name="profile_scroll" + reserve_scroll_corner="false" + opaque="true" + width="312"> <panel name="scroll_content_panel" follows="left|top" @@ -59,27 +67,36 @@ layout="topleft" top="0" background_visible="false" - height="600" + height="690" left="0" - width="295"> - <texture_picker - follows="left|top|right" - height="197" - width="290" - layout="topleft" - top="20" - left="10" - name="classified_snapshot" /> - <icon - height="18" - image_name="AddItem_Off" + width="285"> + <panel + name="snapshot_panel" + layout="topleft" + follows="left|top|right" + height="197" + left="10" + top="10" + width="272"> + <texture_picker + follows="left|top|right" + height="197" + width="272" + layout="topleft" + top="0" + left="0" + name="classified_snapshot" /> + <icon + height="197" + image_name="spacer24.tga" layout="topleft" - right="-5" name="edit_icon" label="" tool_tip="Click to select an image" - top="27" - width="18" /> + top="0" + left="0" + width="272" /> + </panel> <text type="string" length="1" @@ -92,7 +109,7 @@ top="215" name="Name:" text_color="white" - width="290"> + width="280"> Title: </text> <line_editor @@ -106,7 +123,7 @@ name="classified_name" prevalidate_callback="ascii" text_color="black" - width="290" /> + width="273" /> <text type="string" length="1" @@ -119,13 +136,13 @@ top_pad="20" name="description_label" text_color="white" - width="290"> + width="280"> Description: </text> <text_editor follows="left|top|right" height="100" - width="290" + width="273" hide_scrollbar="false" layout="topleft" left="10" @@ -146,67 +163,117 @@ name="location_label" text_color="white" top_pad="20" - width="290"> + width="280"> Location: </text> <text type="string" length="1" follows="left|top" - height="50" + height="30" layout="topleft" left="10" name="classified_location" right="-10" top_pad="2" - width="290" + width="280" word_wrap="true"> loading... </text> <button follows="left|top" - height="20" + height="23" label="Set to Current Location" layout="topleft" - left="8" + left="10" top_pad="5" name="set_to_curr_location_btn" width="200" /> + <text + follows="left|top" + font.style="BOLD" + height="10" + layout="topleft" + left="10" + name="category_label" + text_color="white" + top_pad="15" + value="Category:" + width="250" /> <combo_box follows="left|top" - height="18" + height="23" label="" left="10" name="category" top_pad="5" - width="200" /> - <combo_box - allow_text_entry="false" - follows="left|top" - height="18" + width="156" /> + <text + follows="left|top" + font.style="BOLD" + height="10" + layout="topleft" + left="10" + name="content_type_label" + text_color="white" + top_pad="15" + value="Content type:" + width="250" /> + <icons_combo_box + follows="left|top" + height="23" + label="General Content" + layout="topleft" left="10" - name="content_type" + name="content_type" top_pad="5" - width="200"> - <combo_item - name="mature_ci" - value="Mature"> - Moderate Content - </combo_item> - <combo_item - name="pg_ci" - value="PG"> - General Content - </combo_item> - </combo_box> + width="156"> + <icons_combo_box.drop_down_button + image_overlay="Parcel_PG_Light" + image_overlay_alignment="left" + imgoverlay_label_space="3" + pad_left="3"/> + <icons_combo_box.item + label="Moderate Content" + name="mature_ci" + value="Mature"> + <item.columns + halign="center" + type="icon" + value="Parcel_M_Light" + width="20"/> + </icons_combo_box.item> + <icons_combo_box.item + label="General Content" + name="pg_ci" + value="PG"> + <item.columns + halign="center" + type="icon" + value="Parcel_PG_Light" + width="20"/> + </icons_combo_box.item> + </icons_combo_box> + <text + follows="left|top" + font.style="BOLD" + height="10" + layout="topleft" + left="10" + name="price_for_listing_label" + text_color="white" + top_pad="15" + value="Price for listing:" + width="250" /> <spinner decimal_digits="0" follows="left|top" halign="left" - height="16" + height="23" increment="1" label_width="20" label="L$" + v_pad="10" layout="topleft" left="10" value="50" @@ -222,36 +289,35 @@ layout="topleft" left="10" name="auto_renew" - top_pad="5" + top_pad="15" width="250" /> - </panel> + </panel> </scroll_container> <panel follows="left|right|bottom" - height="20" + height="23" label="bottom_panel" layout="topleft" - left="10" + left="8" name="bottom_panel" top_pad="5" width="303"> <button follows="bottom|left" - height="19" - label="Save" + height="23" + label="[LABEL]" layout="topleft" name="save_changes_btn" left="0" top="0" - width="130" /> + width="152" /> <button follows="bottom|left" - height="19" + height="23" label="Cancel" layout="topleft" name="cancel_btn" - left_pad="5" - right="-1" - width="130" /> + left_pad="3" + width="153" /> </panel> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_edit_eyes.xml b/indra/newview/skins/default/xui/en/panel_edit_eyes.xml index c514054c41..f173a2f3cb 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_eyes.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_eyes.xml @@ -1,21 +1,26 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel + background_visible="true" follows="all" height="400" layout="topleft" - left="10" + left="0" name="edit_eyes_panel" top_pad="10" - width="313" > + width="333" > <panel - border="true" - follows="left|top|right" - height="100" + border="false" + bg_alpha_color="DkGray2" + bg_opaque_color="DkGray2" + background_visible="true" + background_opaque="true" + follows="top|left|right" + height="90" left="10" layout="topleft" name="avatar_eye_color_panel" top="0" - width="293" > + width="313" > <texture_picker can_apply_immediately="true" default_image_name="Default" @@ -23,31 +28,53 @@ height="80" label="Iris" layout="topleft" - left="8" + left="10" name="Iris" tool_tip="Click to choose a picture" - top_pad="10" - width="64" /> - </panel> - <accordion - follows="left|top|right|bottom" - height ="340" - left="10" - name="wearable_accordion" - top_pad="10" - width="303"> - <accordion_tab + top="10" + width="64" > + <texture_picker.commit_callback + function="TexturePicker.Commit" /> + </texture_picker> + </panel> + <panel + border="false" + bg_alpha_color="DkGray2" + bg_opaque_color="DkGray2" + background_visible="true" + background_opaque="true" + follows="all" + height="300" + layout="topleft" + left="10" + name="accordion_panel" + top_pad="10" + width="313"> + <accordion + fit_parent="true" + follows="all" + height ="300" + layout="topleft" + left="0" + name="wearable_accordion" + single_expansion="true" + top="0" + width="313"> + <accordion_tab layout="topleft" + fit_panel="false" min_height="150" name="eyes_main_tab" title="Eyes"> <scrolling_panel_list follows="all" + layout="topleft" left="0" name="eyes_main_param_list" top="0" width="303" /> </accordion_tab> </accordion> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_edit_gloves.xml b/indra/newview/skins/default/xui/en/panel_edit_gloves.xml index 7aca40e8d9..a490f27b9f 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_gloves.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_gloves.xml @@ -1,21 +1,26 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel + background_visible="true" follows="all" height="400" layout="topleft" - left="10" + left="0" name="edit_gloves_panel" top_pad="10" - width="313" > + width="333" > <panel - border="true" - follows="left|top|right" - height="100" + border="false" + bg_alpha_color="DkGray2" + bg_opaque_color="DkGray2" + background_visible="true" + background_opaque="true" + follows="top|left|right" + height="90" left="10" layout="topleft" name="avatar_gloves_color_panel" top="0" - width="293" > + width="313" > <texture_picker can_apply_immediately="true" default_image_name="Default" @@ -27,38 +32,63 @@ name="Fabric" tool_tip="Click to choose a picture" top="10" - width="64" /> + width="64" > + <texture_picker.commit_callback + function="TexturePicker.Commit" /> + </texture_picker> <color_swatch can_apply_immediately="true" follows="left|top" height="80" label="Color/Tint" layout="topleft" - left_pad="10" + left_pad="20" name="Color/Tint" tool_tip="Click to open color picker" top="10" - width="64" /> - </panel> - <accordion - follows="left|top|right|bottom" - height ="340" - left="10" - name="wearable_accordion" - top_pad="10" - width="303"> + width="64" > + <color_swatch.commit_callback + function="ColorSwatch.Commit" /> + </color_swatch> + </panel> + <panel + border="false" + bg_alpha_color="DkGray2" + bg_opaque_color="DkGray2" + background_visible="true" + background_opaque="true" + follows="all" + height="300" + layout="topleft" + left="10" + name="accordion_panel" + top_pad="10" + width="313"> + <accordion + fit_parent="true" + follows="all" + height ="300" + layout="topleft" + left="0" + name="wearable_accordion" + single_expansion="true" + top="0" + width="313"> <accordion_tab layout="topleft" + fit_panel="false" min_height="150" name="gloves_main_tab" title="Gloves"> <scrolling_panel_list follows="all" + layout="topleft" left="0" name="gloves_main_param_list" top="0" width="303" /> </accordion_tab> </accordion> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_edit_hair.xml b/indra/newview/skins/default/xui/en/panel_edit_hair.xml index e7d1c05301..6bb5d2fa9b 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_hair.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_hair.xml @@ -1,21 +1,26 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel + background_visible="true" follows="all" height="400" layout="topleft" - left="10" + left="0" name="edit_hair_panel" top_pad="10" - width="313" > + width="333" > <panel - border="true" - follows="left|top|right" - height="100" + border="false" + bg_alpha_color="DkGray2" + bg_opaque_color="DkGray2" + background_visible="true" + background_opaque="true" + follows="top|left|right" + height="90" left="10" layout="topleft" name="avatar_hair_color_panel" top="0" - width="293" > + width="313" > <texture_picker can_apply_immediately="true" default_image_name="Default" @@ -23,26 +28,47 @@ height="80" label="Texture" layout="topleft" - left="8" + left="10" name="Texture" tool_tip="Click to choose a picture" top="10" - width="64" /> - </panel> + width="64" > + <texture_picker.commit_callback + function="TexturePicker.Commit" /> + </texture_picker> + </panel> + <panel + border="false" + bg_alpha_color="DkGray2" + bg_opaque_color="DkGray2" + background_visible="true" + background_opaque="true" + follows="all" + height="300" + layout="topleft" + left="10" + name="accordion_panel" + top_pad="10" + width="313"> <accordion - follows="left|top|right|bottom" - height ="340" - left="10" - name="wearable_accordion" - top_pad="10" - width="303"> + fit_parent="true" + follows="all" + height ="300" + layout="topleft" + left="0" + name="wearable_accordion" + single_expansion="true" + top="0" + width="313"> <accordion_tab layout="topleft" + fit_panel="false" min_height="150" name="hair_color_tab" title="Color"> <scrolling_panel_list follows="all" + layout="topleft" left="0" name="hair_color_param_list" top="0" @@ -50,11 +76,13 @@ </accordion_tab> <accordion_tab layout="topleft" + fit_panel="false" min_height="150" name="hair_style_tab" title="Style"> <scrolling_panel_list follows="all" + layout="topleft" left="0" name="hair_style_param_list" top="0" @@ -62,11 +90,13 @@ </accordion_tab> <accordion_tab layout="topleft" + fit_panel="false" min_height="150" name="hair_eyebrows_tab" title="Eyebrows"> <scrolling_panel_list follows="all" + layout="topleft" left="0" name="hair_eyebrows_param_list" top="0" @@ -74,16 +104,19 @@ </accordion_tab> <accordion_tab layout="topleft" + fit_panel="false" min_height="150" name="hair_facial_tab" title="Facial"> <scrolling_panel_list follows="all" + layout="topleft" left="0" name="hair_facial_param_list" top="0" width="303" /> </accordion_tab> </accordion> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_edit_jacket.xml b/indra/newview/skins/default/xui/en/panel_edit_jacket.xml index ed92b1e0f8..929cdffb3d 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_jacket.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_jacket.xml @@ -1,21 +1,26 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel + background_visible="true" follows="all" height="400" layout="topleft" - left="10" + left="0" name="edit_jacket_panel" top_pad="10" - width="313" > + width="333" > <panel - border="true" - follows="left|top|right" - height="100" + border="false" + bg_alpha_color="DkGray2" + bg_opaque_color="DkGray2" + background_visible="true" + background_opaque="true" + follows="top|left|right" + height="90" left="10" layout="topleft" name="avatar_jacket_color_panel" top="0" - width="293" > + width="313" > <texture_picker can_apply_immediately="true" default_image_name="Default" @@ -23,11 +28,14 @@ height="80" label="Upper Fabric" layout="topleft" - left="10" + left="25" name="Upper Fabric" tool_tip="Click to choose a picture" top="10" - width="64" /> + width="74" > + <texture_picker.commit_callback + function="TexturePicker.Commit" /> + </texture_picker> <texture_picker can_apply_immediately="true" default_image_name="Default" @@ -35,42 +43,67 @@ height="80" label="Lower Fabric" layout="topleft" - left_pad="10" + left_pad="20" name="Lower Fabric" tool_tip="Click to choose a picture" top="10" - width="64" /> + width="74" > + <texture_picker.commit_callback + function="TexturePicker.Commit" /> + </texture_picker> <color_swatch can_apply_immediately="true" follows="left|top" height="80" label="Color/Tint" layout="topleft" - left_pad="10" + left_pad="20" name="Color/Tint" tool_tip="Click to open color picker" top="10" - width="64" /> + width="74" > + <color_swatch.commit_callback + function="ColorSwatch.Commit" /> + </color_swatch> </panel> - <accordion - follows="left|top|right|bottom" - height ="340" - left="10" - name="wearable_accordion" - top_pad="10" - width="303"> + <panel + border="false" + bg_alpha_color="DkGray2" + bg_opaque_color="DkGray2" + background_visible="true" + background_opaque="true" + follows="all" + height="300" + layout="topleft" + left="10" + name="accordion_panel" + top_pad="10" + width="313"> + <accordion + fit_parent="true" + follows="all" + height ="300" + layout="topleft" + left="0" + name="wearable_accordion" + single_expansion="true" + top="0" + width="313"> <accordion_tab layout="topleft" + fit_panel="false" min_height="150" name="jacket_main_tab" title="Jacket"> <scrolling_panel_list follows="all" + layout="topleft" left="0" name="jacket_main_param_list" top="0" width="303" /> </accordion_tab> </accordion> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_edit_pants.xml b/indra/newview/skins/default/xui/en/panel_edit_pants.xml index b764188e04..f22cf983aa 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_pants.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_pants.xml @@ -1,21 +1,26 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel + background_visible="true" follows="all" height="400" layout="topleft" - left="10" + left="0" name="edit_pants_panel" top_pad="10" - width="313" > + width="333" > <panel - border="true" - follows="left|top|right" - height="100" + border="false" + bg_alpha_color="DkGray2" + bg_opaque_color="DkGray2" + background_visible="true" + background_opaque="true" + follows="top|left|right" + height="90" left="10" layout="topleft" name="avatar_pants_color_panel" top="0" - width="293" > + width="313" > <texture_picker can_apply_immediately="true" default_image_name="Default" @@ -27,38 +32,63 @@ name="Fabric" tool_tip="Click to choose a picture" top="10" - width="64" /> + width="64" > + <texture_picker.commit_callback + function="TexturePicker.Commit" /> + </texture_picker> <color_swatch can_apply_immediately="true" follows="left|top" height="80" label="Color/Tint" layout="topleft" - left_pad="10" + left_pad="20" name="Color/Tint" tool_tip="Click to open color picker" top="10" - width="64" /> + width="64" > + <color_swatch.commit_callback + function="ColorSwatch.Commit" /> + </color_swatch> </panel> - <accordion - follows="left|top|right|bottom" - height ="340" - left="10" - name="wearable_accordion" - top_pad="10" - width="303"> + <panel + border="false" + bg_alpha_color="DkGray2" + bg_opaque_color="DkGray2" + background_visible="true" + background_opaque="true" + follows="all" + height="300" + layout="topleft" + left="10" + name="accordion_panel" + top_pad="10" + width="313"> + <accordion + fit_parent="true" + follows="all" + height ="300" + layout="topleft" + left="0" + name="wearable_accordion" + single_expansion="true" + top="0" + width="313"> <accordion_tab layout="topleft" + fit_panel="false" min_height="150" name="pants_main_tab" title="Pants"> <scrolling_panel_list follows="all" + layout="topleft" left="0" name="pants_main_param_list" top="0" width="303" /> </accordion_tab> </accordion> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_edit_pick.xml b/indra/newview/skins/default/xui/en/panel_edit_pick.xml index 8e39697a16..dc83b334b5 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_pick.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_pick.xml @@ -3,7 +3,7 @@ background_visible="true" bevel_style="in" follows="left|top|right|bottom" - height="570" + height="569" label="Edit Pick" layout="topleft" left="0" @@ -12,40 +12,46 @@ help_topic="profile_edit_pick" top="0" width="333"> + <panel.string + name="location_notice"> + (will update after save) + </panel.string> <button follows="top|right" - height="23" - image_overlay="BackArrow_Off" + height="24" + image_hover_unselected="BackButton_Over" + image_pressed="BackButton_Press" + image_unselected="BackButton_Off" layout="topleft" name="back_btn" left="10" tab_stop="false" top="2" - width="23" /> + width="30" /> <text type="string" length="1" follows="top" - font="SansSerifHuge" - height="15" + font="SansSerifHugeBold" + height="26" layout="topleft" - left_pad="10" + left_pad="4" name="title" - text_color="white" - top="5" + text_color="LtGray" + top="2" width="250"> Edit Pick </text> <scroll_container color="DkGray2" follows="all" - height="500" + height="502" layout="topleft" - left="10" + left="8" top_pad="10" name="profile_scroll" opaque="true" - width="313"> + width="312"> <panel name="scroll_content_panel" follows="left|top|right" @@ -59,22 +65,22 @@ <texture_picker follows="left|top|right" height="197" - width="280" + width="272" layout="topleft" no_commit_on_selection="true" - top="20" - left="10" + top="10" + left="11" name="pick_snapshot" /> <icon - height="18" - image_name="AddItem_Off" + height="197" + image_name="spacer24.tga" layout="topleft" - right="-5" name="edit_icon" label="" tool_tip="Click to select an image" - top="27" - width="18" /> + top="10" + left="11" + width="286" /> <text type="string" length="1" @@ -100,7 +106,7 @@ max_length="63" name="pick_name" text_color="black" - width="280" /> + width="273" /> <text type="string" length="1" @@ -119,7 +125,7 @@ <text_editor follows="left|top|right" height="100" - width="280" + width="273" hide_scrollbar="false" layout="topleft" left="10" @@ -158,7 +164,7 @@ </text> <button follows="left|top" - height="20" + height="23" label="Set to Current Location" layout="topleft" left="8" @@ -169,30 +175,29 @@ </scroll_container> <panel follows="left|right|bottom" - height="20" + height="23" label="bottom_panel" layout="topleft" - left="10" + left="8" name="bottom_panel" top_pad="5" width="303"> <button follows="bottom|left" - height="19" - label="Save [WHAT]" + height="23" + label="Save Pick" layout="topleft" name="save_changes_btn" left="0" top="0" - width="130" /> + width="152" /> <button follows="bottom|left" - height="19" + height="23" label="Cancel" layout="topleft" name="cancel_btn" - left_pad="5" - right="-1" - width="130" /> + left_pad="3" + width="153" /> </panel> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_edit_profile.xml b/indra/newview/skins/default/xui/en/panel_edit_profile.xml index 2a2199fc87..dff2b9a214 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_profile.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_profile.xml @@ -60,11 +60,11 @@ <scroll_container color="DkGray2" follows="all" - height="493" + height="494" min_height="300" layout="topleft" - left="9" - width="290" + left="8" + width="292" name="profile_scroll" reserve_scroll_corner="true" opaque="true" @@ -74,19 +74,19 @@ follows="left|top|right" layout="topleft" top="0" - height="493" + height="494" min_height="300" left="0" - width="290"> + width="292"> <panel name="data_panel" follows="left|top|right" layout="topleft" top="0" - height="493" + height="494" min_height="300" left="0" - width="290"> + width="292"> <panel name="lifes_images_panel" follows="left|top|right" @@ -94,7 +94,7 @@ layout="topleft" top="0" left="0" - width="290"> + width="292"> <panel follows="left|top" height="117" @@ -102,7 +102,7 @@ left="10" name="second_life_image_panel" top="0" - width="280"> + width="282"> <text follows="left|top|right" font.style="BOLD" @@ -127,15 +127,15 @@ width="102" /> </panel> <icon - height="18" - image_name="AddItem_Off" + height="102" + image_name="spacer24.tga" layout="topleft" name="2nd_life_edit_icon" label="" - left="87" + left="11" + top_pad="-92" tool_tip="Click to select an image" - top="25" - width="18" /> + width="102" /> </panel> <text_editor type="string" @@ -146,7 +146,7 @@ layout="topleft" left="123" top="25" - max_length="512" + max_length="511" name="sl_description_edit" width="157" word_wrap="true"> @@ -183,15 +183,15 @@ width="102" /> </panel> <icon - height="18" - image_name="AddItem_Off" + height="102" + image_name="spacer24.tga" layout="topleft" name="real_world_edit_icon" label="" - left="87" + left="11" + top_pad="-92" tool_tip="Click to select an image" - top="148" - width="18" /> + width="102" /> <text_editor type="string" length="1" @@ -200,7 +200,7 @@ height="102" layout="topleft" left="123" - max_length="512" + max_length="254" top="157" name="fl_description_edit" width="157" @@ -230,7 +230,7 @@ top_pad="0" value="http://" name="homepage_edit" - width="270"> + width="272"> </line_editor> <check_box follows="left|top" @@ -334,7 +334,7 @@ height="23" label="Save Changes" layout="topleft" - left="9" + left="8" name="save_btn" top="5" width="152" /> @@ -343,8 +343,8 @@ height="23" label="Cancel" layout="topleft" - left_pad="4" + left_pad="3" name="cancel_btn" - width="152" /> + width="153" /> </panel> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_edit_shape.xml b/indra/newview/skins/default/xui/en/panel_edit_shape.xml index 45c4b92338..d295f5fe4a 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_shape.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_shape.xml @@ -1,71 +1,64 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel + background_visible="true" follows="all" height="400" layout="topleft" - left="10" + left="0" name="edit_shape_panel" top_pad="10" - width="313" > - <panel - border="true" - follows="top|left" - height="50" + width="333" > + <string name="meters">Meters</string> + <string name="feet">Feet</string> + <string name="height">Height:</string> + <string name="heigth_label_color" translate="false">White_50</string> + <string name="heigth_value_label_color" translate="false">White</string> + <text + follows="top|left|right" + font="SansSerifSmallBold" + halign="right" + height="12" + layout="topleft" + left="0" + name="avatar_height" + top="0" + width="310"> + </text> + <panel + border="false" + bg_alpha_color="DkGray2" + bg_opaque_color="DkGray2" + background_visible="true" + background_opaque="true" + follows="all" + height="388" + label="Shirt" + layout="topleft" left="10" - layout="topleft" - name="avatar_sex_panel" - top="10" - width="293" > - <text - follows="top|left" - height="16" - layout="topleft" - left="10" - name="gender_text" - width="303"> - Gender: - </text> - <radio_group - follows="all" - left="10" - height="34" - layout="topleft" - name="sex_radio" - top_pad="3" - width="200" > - <radio_item - follows="all" - height="16" - label="Female" - layout="topleft" - left="10" - name="radio" - width="82" /> - <radio_item - follows="all" - height="16" - label="Male" - layout="topleft" - left_pad="10" - name="radio2" - width="82" /> - </radio_group> - </panel> + name="accordion_panel" + top_pad="0" + width="313"> <accordion - follows="left|top|right|bottom" - height ="330" - left="10" + layout="topleft" + follows="all" + height ="388" + left="0" name="wearable_accordion" - top_pad="10" - width="303"> + top="0" + single_expansion="true" + fit_parent="true" + width="313"> <accordion_tab layout="topleft" min_height="150" name="shape_body_tab" + fit_panel="false" title="Body"> <scrolling_panel_list + layout="topleft" follows="all" left="0" + height="300" name="shape_body_param_list" top="0" width="303" /> @@ -73,11 +66,13 @@ <accordion_tab layout="topleft" min_height="150" + fit_panel="false" name="shape_head_tab" title="Head"> - <scrolling_panel_list + <scrolling_panel_list + layout="topleft" follows="all" - left="0" + left="10" name="shape_head_param_list" top="0" width="303" /> @@ -85,9 +80,11 @@ <accordion_tab layout="topleft" min_height="150" + fit_panel="false" name="shape_eyes_tab" title="Eyes"> - <scrolling_panel_list + <scrolling_panel_list + layout="topleft" follows="all" left="0" name="shape_eyes_param_list" @@ -97,9 +94,11 @@ <accordion_tab layout="topleft" min_height="150" + fit_panel="false" name="shape_ears_tab" title="Ears"> - <scrolling_panel_list + <scrolling_panel_list + layout="topleft" follows="all" left="0" name="shape_ears_param_list" @@ -110,8 +109,10 @@ layout="topleft" min_height="150" name="shape_nose_tab" + fit_panel="false" title="Nose"> - <scrolling_panel_list + <scrolling_panel_list + layout="topleft" follows="all" left="0" name="shape_nose_param_list" @@ -122,8 +123,10 @@ layout="topleft" min_height="150" name="shape_mouth_tab" + fit_panel="false" title="Mouth"> - <scrolling_panel_list + <scrolling_panel_list + layout="topleft" follows="all" left="0" name="shape_mouth_param_list" @@ -134,8 +137,10 @@ layout="topleft" min_height="150" name="shape_chin_tab" + fit_panel="false" title="Chin"> - <scrolling_panel_list + <scrolling_panel_list + layout="topleft" follows="all" left="0" name="shape_chin_param_list" @@ -146,8 +151,10 @@ layout="topleft" min_height="150" name="shape_torso_tab" + fit_panel="false" title="Torso"> - <scrolling_panel_list + <scrolling_panel_list + layout="topleft" follows="all" left="0" name="shape_torso_param_list" @@ -158,8 +165,10 @@ layout="topleft" min_height="150" name="shape_legs_tab" + fit_panel="false" title="Legs"> - <scrolling_panel_list + <scrolling_panel_list + layout="topleft" follows="all" left="0" name="shape_legs_param_list" @@ -167,5 +176,6 @@ width="303" /> </accordion_tab> </accordion> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_edit_shirt.xml b/indra/newview/skins/default/xui/en/panel_edit_shirt.xml index 4b7235545f..85823073b5 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_shirt.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_shirt.xml @@ -1,21 +1,26 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel + background_visible="true" follows="all" height="400" layout="topleft" - left="10" + left="0" name="edit_shirt_panel" top_pad="10" - width="313" > + width="333" > <panel - border="true" - follows="left|top|right" - height="100" + border="false" + bg_alpha_color="DkGray2" + bg_opaque_color="DkGray2" + background_visible="true" + background_opaque="true" + follows="top|left|right" + height="90" left="10" layout="topleft" name="avatar_shirt_color_panel" top="0" - width="293" > + width="313" > <texture_picker can_apply_immediately="true" default_image_name="Default" @@ -27,38 +32,63 @@ name="Fabric" tool_tip="Click to choose a picture" top="10" - width="64" /> + width="64" > + <texture_picker.commit_callback + function="TexturePicker.Commit" /> + </texture_picker> <color_swatch can_apply_immediately="true" follows="left|top" height="80" label="Color/Tint" layout="topleft" - left_pad="10" + left_pad="20" name="Color/Tint" tool_tip="Click to open color picker" top="10" - width="64" /> + width="64" > + <color_swatch.commit_callback + function="ColorSwatch.Commit" /> + </color_swatch> </panel> + <panel + border="false" + bg_alpha_color="DkGray2" + bg_opaque_color="DkGray2" + background_visible="true" + background_opaque="true" + follows="all" + height="300" + layout="topleft" + left="10" + name="accordion_panel" + top_pad="10" + width="313"> <accordion - follows="left|top|right|bottom" - height ="340" - left="10" + fit_parent="true" + follows="all" + height ="300" + layout="topleft" + left="0" name="wearable_accordion" - top_pad="10" - width="303"> + single_expansion="true" + top="0" + width="313"> <accordion_tab layout="topleft" + fit_panel="false" min_height="150" name="shirt_main_tab" title="Shirt"> <scrolling_panel_list follows="all" + layout="topleft" left="0" name="shirt_main_param_list" top="0" width="303" /> </accordion_tab> </accordion> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_edit_shoes.xml b/indra/newview/skins/default/xui/en/panel_edit_shoes.xml index e886afa010..b26fde68f1 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_shoes.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_shoes.xml @@ -1,21 +1,26 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel + background_visible="true" follows="all" height="400" layout="topleft" - left="10" + left="0" name="edit_shoes_panel" top_pad="10" - width="313" > + width="333" > <panel - border="true" - follows="left|top|right" - height="100" + border="false" + bg_alpha_color="DkGray2" + bg_opaque_color="DkGray2" + background_visible="true" + background_opaque="true" + follows="top|left|right" + height="90" left="10" layout="topleft" name="avatar_shoes_color_panel" top="0" - width="293" > + width="313" > <texture_picker can_apply_immediately="true" default_image_name="Default" @@ -27,38 +32,63 @@ name="Fabric" tool_tip="Click to choose a picture" top="10" - width="64" /> + width="64" > + <texture_picker.commit_callback + function="TexturePicker.Commit" /> + </texture_picker> <color_swatch can_apply_immediately="true" follows="left|top" height="80" label="Color/Tint" layout="topleft" - left_pad="10" + left_pad="20" name="Color/Tint" tool_tip="Click to open color picker" top="10" - width="64" /> + width="64" > + <color_swatch.commit_callback + function="ColorSwatch.Commit" /> + </color_swatch> </panel> - <accordion - follows="left|top|right|bottom" - height ="340" - left="10" - name="wearable_accordion" - top_pad="10" - width="303"> + <panel + border="false" + bg_alpha_color="DkGray2" + bg_opaque_color="DkGray2" + background_visible="true" + background_opaque="true" + follows="all" + height="300" + layout="topleft" + left="10" + name="accordion_panel" + top_pad="10" + width="313"> + <accordion + fit_parent="true" + follows="all" + height ="300" + layout="topleft" + left="0" + name="wearable_accordion" + single_expansion="true" + top="0" + width="313"> <accordion_tab layout="topleft" + fit_panel="false" min_height="150" name="shoes_main_tab" title="Shoes"> <scrolling_panel_list follows="all" + layout="topleft" left="0" name="shoes_main_param_list" top="0" width="303" /> </accordion_tab> </accordion> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_edit_skin.xml b/indra/newview/skins/default/xui/en/panel_edit_skin.xml index 918606b54c..45591ba2ad 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_skin.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_skin.xml @@ -1,21 +1,26 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel + background_visible="true" follows="all" height="400" layout="topleft" - left="10" + left="0" name="edit_skin_panel" top_pad="10" - width="313" > + width="333" > <panel - border="true" - follows="left|top|right" - height="100" + border="false" + bg_alpha_color="DkGray2" + bg_opaque_color="DkGray2" + background_visible="true" + background_opaque="true" + follows="top|left|right" + height="90" left="10" layout="topleft" name="avatar_skin_color_panel" top="0" - width="293" > + width="313" > <texture_picker allow_no_texture="true" can_apply_immediately="true" @@ -24,11 +29,14 @@ height="80" label="Head Tattoos" layout="topleft" - left="10" + left="25" name="Head Tattoos" tool_tip="Click to choose a picture" top="10" - width="74" /> + width="74" > + <texture_picker.commit_callback + function="TexturePicker.Commit" /> + </texture_picker> <texture_picker allow_no_texture="true" can_apply_immediately="true" @@ -37,11 +45,14 @@ height="80" label="Upper Tattoos" layout="topleft" - left_pad="10" + left_pad="20" name="Upper Tattoos" tool_tip="Click to choose a picture" top="10" - width="74" /> + width="74" > + <texture_picker.commit_callback + function="TexturePicker.Commit" /> + </texture_picker> <texture_picker allow_no_texture="true" can_apply_immediately="true" @@ -50,26 +61,47 @@ height="80" label="Lower Tattoos" layout="topleft" - left_pad="10" + left_pad="20" name="Lower Tattoos" tool_tip="Click to choose a picture" top="10" - width="74" /> - </panel> + width="74" > + <texture_picker.commit_callback + function="TexturePicker.Commit" /> + </texture_picker> + </panel> + <panel + border="false" + bg_alpha_color="DkGray2" + bg_opaque_color="DkGray2" + background_visible="true" + background_opaque="true" + follows="all" + height="300" + layout="topleft" + left="10" + name="accordion_panel" + top_pad="10" + width="313"> <accordion - follows="left|top|right|bottom" - height ="340" - left="10" + layout="topleft" + fit_parent="true" + follows="all" + height ="300" + left="0" name="wearable_accordion" - top_pad="10" - width="303"> + top="0" + single_expansion="true" + width="313"> <accordion_tab layout="topleft" + fit_panel="false" min_height="150" name="skin_color_tab" title="Skin Color"> <scrolling_panel_list follows="all" + layout="topleft" left="0" name="skin_color_param_list" top="0" @@ -77,11 +109,13 @@ </accordion_tab> <accordion_tab layout="topleft" + fit_panel="false" min_height="150" name="skin_face_tab" title="Face Detail"> <scrolling_panel_list follows="all" + layout="topleft" left="0" name="skin_face_param_list" top="0" @@ -89,11 +123,13 @@ </accordion_tab> <accordion_tab layout="topleft" + fit_panel="false" min_height="150" name="skin_makeup_tab" title="Makeup"> <scrolling_panel_list follows="all" + layout="topleft" left="0" name="skin_makeup_param_list" top="0" @@ -101,16 +137,19 @@ </accordion_tab> <accordion_tab layout="topleft" + fit_panel="false" min_height="150" name="skin_body_tab" title="Body Detail"> <scrolling_panel_list follows="all" + layout="topleft" left="0" name="skin_body_param_list" top="0" width="303" /> </accordion_tab> </accordion> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_edit_skirt.xml b/indra/newview/skins/default/xui/en/panel_edit_skirt.xml index 6cccab1843..bb8e0dca07 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_skirt.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_skirt.xml @@ -1,21 +1,26 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel + background_visible="true" follows="all" height="400" layout="topleft" - left="10" + left="0" name="edit_skirt_panel" top_pad="10" - width="313" > + width="333" > <panel - border="true" - follows="left|top|right" - height="100" + border="false" + bg_alpha_color="DkGray2" + bg_opaque_color="DkGray2" + background_visible="true" + background_opaque="true" + follows="top|left|right" + height="90" left="10" layout="topleft" name="avatar_skirt_color_panel" top="0" - width="293" > + width="313" > <texture_picker can_apply_immediately="true" default_image_name="Default" @@ -27,38 +32,63 @@ name="Fabric" tool_tip="Click to choose a picture" top="10" - width="64" /> + width="64" > + <texture_picker.commit_callback + function="TexturePicker.Commit" /> + </texture_picker> <color_swatch can_apply_immediately="true" follows="left|top" height="80" label="Color/Tint" layout="topleft" - left_pad="10" + left_pad="20" name="Color/Tint" tool_tip="Click to open color picker" top="10" - width="64" /> + width="64" > + <color_swatch.commit_callback + function="ColorSwatch.Commit" /> + </color_swatch> </panel> - <accordion - follows="left|top|right|bottom" - height ="340" - left="10" - name="wearable_accordion" - top_pad="10" - width="303"> + <panel + border="false" + bg_alpha_color="DkGray2" + bg_opaque_color="DkGray2" + background_visible="true" + background_opaque="true" + follows="all" + height="300" + layout="topleft" + left="10" + name="accordion_panel" + top_pad="10" + width="313"> + <accordion + fit_parent="true" + follows="all" + height ="300" + layout="topleft" + left="0" + name="wearable_accordion" + single_expansion="true" + top="0" + width="313"> <accordion_tab layout="topleft" + fit_panel="false" min_height="150" name="skirt_main_tab" title="Skirt"> <scrolling_panel_list follows="all" + layout="topleft" left="0" name="skirt_main_param_list" top="0" width="303" /> </accordion_tab> </accordion> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_edit_socks.xml b/indra/newview/skins/default/xui/en/panel_edit_socks.xml index fc7de00714..d813d94d93 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_socks.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_socks.xml @@ -1,21 +1,26 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel + background_visible="true" follows="all" height="400" layout="topleft" - left="10" + left="0" name="edit_socks_panel" top_pad="10" - width="313" > + width="333" > <panel - border="true" - follows="left|top|right" - height="100" + border="false" + bg_alpha_color="DkGray2" + bg_opaque_color="DkGray2" + background_visible="true" + background_opaque="true" + follows="top|left|right" + height="90" left="10" layout="topleft" name="avatar_socks_color_panel" top="0" - width="293" > + width="313" > <texture_picker can_apply_immediately="true" default_image_name="Default" @@ -27,38 +32,63 @@ name="Fabric" tool_tip="Click to choose a picture" top="10" - width="64" /> + width="64" > + <texture_picker.commit_callback + function="TexturePicker.Commit" /> + </texture_picker> <color_swatch can_apply_immediately="true" follows="left|top" height="80" label="Color/Tint" layout="topleft" - left_pad="10" + left_pad="20" name="Color/Tint" tool_tip="Click to open color picker" top="10" - width="64" /> + width="64" > + <color_swatch.commit_callback + function="ColorSwatch.Commit" /> + </color_swatch> </panel> - <accordion - follows="left|top|right|bottom" - height ="340" - left="10" - name="wearable_accordion" - top_pad="10" - width="303"> + <panel + border="false" + bg_alpha_color="DkGray2" + bg_opaque_color="DkGray2" + background_visible="true" + background_opaque="true" + follows="all" + height="300" + layout="topleft" + left="10" + name="accordion_panel" + top_pad="10" + width="313"> + <accordion + fit_parent="true" + follows="all" + height ="300" + layout="topleft" + left="0" + name="wearable_accordion" + single_expansion="true" + top="0" + width="313"> <accordion_tab layout="topleft" + fit_panel="false" min_height="150" name="socks_main_tab" title="Socks"> <scrolling_panel_list follows="all" + layout="topleft" left="0" name="socks_main_param_list" top="0" width="303" /> </accordion_tab> </accordion> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_edit_tattoo.xml b/indra/newview/skins/default/xui/en/panel_edit_tattoo.xml index b214cd3de0..23a08344ea 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_tattoo.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_tattoo.xml @@ -1,57 +1,85 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel + background_visible="true" follows="all" height="400" layout="topleft" - left="10" + left="0" name="edit_tattoo_panel" top_pad="10" - width="313" > + width="333" > <panel - border="true" - follows="left|top|right" - height="100" + border="false" + bg_alpha_color="DkGray2" + bg_opaque_color="DkGray2" + background_visible="true" + background_opaque="true" + follows="top|left|right" + height="400" left="10" layout="topleft" name="avatar_tattoo_color_panel" top="0" - width="293" > + width="313" > <texture_picker can_apply_immediately="true" default_image_name="Default" follows="left|top" - height="80" + height="115" label="Head Tattoo" layout="topleft" - left="10" + left="20" name="Head Tattoo" tool_tip="Click to choose a picture" top="10" - width="64" /> + width="115" > + <texture_picker.commit_callback + function="TexturePicker.Commit" /> + </texture_picker> <texture_picker can_apply_immediately="true" default_image_name="Default" follows="left|top" - height="80" + height="115" label="Upper Tattoo" layout="topleft" - left_pad="10" + left_pad="30" name="Upper Tattoo" tool_tip="Click to choose a picture" top="10" - width="64" /> + width="115" > + <texture_picker.commit_callback + function="TexturePicker.Commit" /> + </texture_picker> <texture_picker can_apply_immediately="true" default_image_name="Default" follows="left|top" - height="80" + height="115" label="Lower Tattoo" layout="topleft" - left_pad="10" + left="20" name="Lower Tattoo" tool_tip="Click to choose a picture" - top="10" - width="64" /> + top_pad="10" + width="115" > + <texture_picker.commit_callback + function="TexturePicker.Commit" /> + </texture_picker> + <color_swatch + can_apply_immediately="true" + follows="left|top" + height="115" + label="Color/Tint" + layout="topleft" + left_pad="30" + name="Color/Tint" + tool_tip="Click to open color picker" + top_delta="0" + width="115" > + <color_swatch.commit_callback + function="ColorSwatch.Commit" /> + </color_swatch> </panel> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_edit_underpants.xml b/indra/newview/skins/default/xui/en/panel_edit_underpants.xml index 03e0bb70ef..19225e9757 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_underpants.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_underpants.xml @@ -1,21 +1,26 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel + background_visible="true" follows="all" height="400" layout="topleft" - left="10" + left="0" name="edit_underpants_panel" top_pad="10" - width="313" > + width="333" > <panel - border="true" - follows="left|top|right" - height="100" + border="false" + bg_alpha_color="DkGray2" + bg_opaque_color="DkGray2" + background_visible="true" + background_opaque="true" + follows="top|left|right" + height="90" left="10" layout="topleft" name="avatar_underpants_color_panel" top="0" - width="293" > + width="313" > <texture_picker can_apply_immediately="true" default_image_name="Default" @@ -27,38 +32,63 @@ name="Fabric" tool_tip="Click to choose a picture" top="10" - width="64" /> + width="64" > + <texture_picker.commit_callback + function="TexturePicker.Commit" /> + </texture_picker> <color_swatch can_apply_immediately="true" follows="left|top" height="80" label="Color/Tint" layout="topleft" - left_pad="10" + left_pad="20" name="Color/Tint" tool_tip="Click to open color picker" top="10" - width="64" /> + width="64" > + <color_swatch.commit_callback + function="ColorSwatch.Commit" /> + </color_swatch> </panel> - <accordion - follows="left|top|right|bottom" - height ="340" - left="10" - name="wearable_accordion" - top_pad="10" - width="303"> + <panel + border="false" + bg_alpha_color="DkGray2" + bg_opaque_color="DkGray2" + background_visible="true" + background_opaque="true" + follows="all" + height="300" + layout="topleft" + left="10" + name="accordion_panel" + top_pad="10" + width="313"> + <accordion + fit_parent="true" + follows="all" + height ="300" + layout="topleft" + left="0" + name="wearable_accordion" + single_expansion="true" + top="0" + width="313"> <accordion_tab layout="topleft" + fit_panel="false" min_height="150" name="underpants_main_tab" title="Underpants"> <scrolling_panel_list follows="all" + layout="topleft" left="0" name="underpants_main_param_list" top="0" width="303" /> </accordion_tab> </accordion> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_edit_undershirt.xml b/indra/newview/skins/default/xui/en/panel_edit_undershirt.xml index 20c56142fb..720a55dcc2 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_undershirt.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_undershirt.xml @@ -1,21 +1,26 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel + background_visible="true" follows="all" height="400" layout="topleft" - left="10" + left="0" name="edit_undershirt_panel" top_pad="10" - width="313" > + width="333" > <panel - border="true" - follows="left|top|right" - height="100" + border="false" + bg_alpha_color="DkGray2" + bg_opaque_color="DkGray2" + background_visible="true" + background_opaque="true" + follows="top|left|right" + height="90" left="10" layout="topleft" name="avatar_undershirt_color_panel" top="0" - width="293" > + width="313" > <texture_picker can_apply_immediately="true" default_image_name="Default" @@ -27,38 +32,63 @@ name="Fabric" tool_tip="Click to choose a picture" top="10" - width="64" /> + width="64" > + <texture_picker.commit_callback + function="TexturePicker.Commit" /> + </texture_picker> <color_swatch can_apply_immediately="true" follows="left|top" height="80" label="Color/Tint" layout="topleft" - left_pad="10" + left_pad="20" name="Color/Tint" tool_tip="Click to open Color Picker" top="10" - width="64" /> + width="64" > + <color_swatch.commit_callback + function="ColorSwatch.Commit" /> + </color_swatch> </panel> - <accordion - follows="left|top|right|bottom" - height ="340" - left="10" - name="wearable_accordion" - top_pad="10" - width="303"> + <panel + border="false" + bg_alpha_color="DkGray2" + bg_opaque_color="DkGray2" + background_visible="true" + background_opaque="true" + follows="all" + height="300" + layout="topleft" + left="10" + name="accordion_panel" + top_pad="10" + width="313"> + <accordion + fit_parent="true" + follows="all" + height ="300" + layout="topleft" + left="0" + name="wearable_accordion" + single_expansion="true" + top="0" + width="313"> <accordion_tab layout="topleft" + fit_panel="false" min_height="150" name="undershirt_main_tab" title="Undershirt"> <scrolling_panel_list follows="all" + layout="topleft" left="0" name="undershirt_main_param_list" top="0" width="303" /> </accordion_tab> </accordion> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_edit_wearable.xml b/indra/newview/skins/default/xui/en/panel_edit_wearable.xml index f76a56bda4..3106ed34ff 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_wearable.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_wearable.xml @@ -7,6 +7,7 @@ label="Wearable" layout="topleft" left="0" + help_topic="edit_wearable" name="panel_edit_wearable" top="0" width="333"> @@ -107,7 +108,7 @@ left="0" Jacket: </string> <string - name="skirt_skirt_desc_text"> + name="skirt_desc_text"> Skirt: </string> <string @@ -132,26 +133,33 @@ left="0" </string> <button follows="top|left" - height="25" - width="25" - image_overlay="BackArrow_Off" + height="24" + width="30" + image_hover_unselected="BackButton_Over" + image_pressed="BackButton_Press" + image_unselected="BackButton_Off" layout="topleft" name="back_btn" - left="10" - top="7" /> + left="11" + top="3" /> <text follows="top|left" font="SansSerifHugeBold" height="22" layout="topleft" - left_pad="15" + left_pad="8" name="edit_wearable_title" text_color="white" + top="3" value="Editing Shape" width="270" /> <panel - border="true" - follows="top|left" + border="false" + bg_alpha_color="DkGray2" + bg_opaque_color="DkGray2" + background_visible="true" + background_opaque="true" + follows="top|left|right" height="60" label="Shirt" layout="topleft" @@ -160,34 +168,89 @@ left="0" top_pad="10" width="313"> <text - follows="top|left" + follows="top|left|right" + font="SansSerifSmallBold" height="16" layout="topleft" left="10" name="description_text" + text_color="white" + top="10" value="Shape:" - width="303" /> - <text_editor - follows="all" - height="23" - left="10" + width="150" /> + <radio_group + control_name="AvatarSex" + follows="left|top|right" + left="210" + height="20" layout="topleft" - max_length="300" - name="description" - width="290" /> + name="sex_radio" + top="5" + width="110"> + <radio_item + follows="all" + height="16" + label="" + layout="topleft" + left="0" + name="sex_male" + tool_tip="Male" + value="1" + width="40" /> + <radio_item + follows="all" + height="16" + label="" + layout="topleft" + left_pad="10" + name="sex_female" + tool_tip="Female" + value="0" + width="40" /> + </radio_group> + <!-- graphical labels for the radio buttons above --> + <icon + height="16" + image_name="icons/Male.png" + left="230" + name="male_icon" + tool_tip="Male" + top="7" + width="16" /> + <icon + height="16" + image_name="icons/Female.png" + name="female_icon" + left="280" + tool_tip="Female" + top="7" + width="16" /> + <line_editor + follows="all" + height="23" + layout="topleft" + left="10" + max_length="300" + name="description" + prevalidate_callback="ascii" + text_color="black" + top_pad="3" + width="290" /> </panel> <panel follows="all" - height="400" + height="433" layout="topleft" left="0" name="edit_subpanel_container" - top_pad="10" + top_pad="2" width="333"> + <!-- the shape editing panel is taller than the others + because it also displays avatar height --> <panel filename="panel_edit_shape.xml" follows="all" - height="400" + height="433" layout="topleft" left="0" name="edit_shape_panel" @@ -197,168 +260,169 @@ left="0" <panel filename="panel_edit_skin.xml" follows="all" - height="400" + height="425" layout="topleft" left="0" name="edit_skin_panel" - top="0" + top="8" visible="false" width="333" /> <panel filename="panel_edit_hair.xml" follows="all" - height="400" + height="425" layout="topleft" left="0" name="edit_hair_panel" - top="0" + top="8" visible="false" width="333" /> <panel filename="panel_edit_eyes.xml" follows="all" - height="400" + height="425" layout="topleft" left="0" name="edit_eyes_panel" - top="0" + top="8" visible="false" width="333" /> <panel filename="panel_edit_shirt.xml" follows="all" - height="400" + height="425" layout="topleft" left="0" name="edit_shirt_panel" - top="0" + top="8" visible="false" width="333" /> <panel filename="panel_edit_pants.xml" follows="all" - height="400" + height="425" layout="topleft" left="0" name="edit_pants_panel" - top="0" + top="8" visible="false" width="333" /> <panel filename="panel_edit_shoes.xml" follows="all" - height="400" + height="425" layout="topleft" left="0" name="edit_shoes_panel" - top="0" + top="8" visible="false" width="333" /> <panel filename="panel_edit_socks.xml" follows="all" - height="400" + height="425" layout="topleft" left="0" name="edit_socks_panel" - top="0" + top="8" visible="false" width="333" /> <panel filename="panel_edit_jacket.xml" follows="all" - height="400" + height="425" layout="topleft" left="0" name="edit_jacket_panel" - top="0" + top="8" visible="false" width="333" /> <panel filename="panel_edit_skirt.xml" follows="all" - height="400" + height="425" layout="topleft" left="0" name="edit_skirt_panel" - top="0" + top="8" visible="false" width="333" /> <panel filename="panel_edit_gloves.xml" follows="all" - height="400" + height="425" layout="topleft" left="0" name="edit_gloves_panel" - top="0" + top="8" visible="false" width="333" /> <panel filename="panel_edit_undershirt.xml" follows="all" - height="400" + height="425" layout="topleft" left="0" name="edit_undershirt_panel" - top="0" + top="8" visible="false" width="333" /> <panel filename="panel_edit_underpants.xml" follows="all" - height="400" + height="425" layout="topleft" left="0" name="edit_underpants_panel" - top="0" + top="8" visible="false" width="333" /> <panel filename="panel_edit_alpha.xml" follows="all" - height="400" + height="425" layout="topleft" left="0" name="edit_alpha_panel" - top="0" + top="8" visible="false" width="333" /> <panel filename="panel_edit_tattoo.xml" follows="all" - height="400" + height="425" layout="topleft" left="0" name="edit_tattoo_panel" - top="0" + top="8" visible="false" width="333" /> </panel> + <panel - follows="all" - height="25" - layout="bottom|left|right" - left="0" + follows="bottom|left|right" + height="23" + layout="topleft" + left="2" name="button_panel" - top_pad="10" + top_pad="6" width="333" > <button follows="bottomleft" layout="topleft" height="23" label="Save As" - left="10" + left="8" name="save_as_button" top="0" - width="100" /> + width="153" /> <button follows="bottomleft" layout="topleft" height="23" label="Revert" - left_pad="10" + left_pad="7" name="revert_button" - width="100" /> + width="152" /> </panel> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_generic_tip.xml b/indra/newview/skins/default/xui/en/panel_generic_tip.xml new file mode 100644 index 0000000000..eea92895f5 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_generic_tip.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + height="40" + layout="topleft" + left="0" + name="panel_generic_tip" + top="0" + width="305"> + <text + follows="all" + font="SansSerif" + height="20" + layout="topleft" + left="10" + max_length="350" + name="message" + text_color="white" + top="10" + use_ellipses="true" + value="" + width="285" + wrap="true" /> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_group_control_panel.xml b/indra/newview/skins/default/xui/en/panel_group_control_panel.xml index aa7d621e4c..c1dc2aaaf7 100644 --- a/indra/newview/skins/default/xui/en/panel_group_control_panel.xml +++ b/indra/newview/skins/default/xui/en/panel_group_control_panel.xml @@ -36,7 +36,7 @@ layout="topleft" name="speakers_list" opaque="false" - show_info_btn="false" + show_info_btn="true" show_profile_btn="false" show_speaking_indicator="false" width="145" /> diff --git a/indra/newview/skins/default/xui/en/panel_group_general.xml b/indra/newview/skins/default/xui/en/panel_group_general.xml index 618167181f..2af1a84400 100644 --- a/indra/newview/skins/default/xui/en/panel_group_general.xml +++ b/indra/newview/skins/default/xui/en/panel_group_general.xml @@ -1,9 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel label="General" - follows="all" height="604" - width="313" + width="304" class="panel_group_general" name="general_tab"> <panel.string @@ -20,15 +19,85 @@ Hover your mouse over the options for more help. name="incomplete_member_data_str"> Retrieving member data </panel.string> + <panel + name="group_info_top" + follows="top|left" + top="0" + left="0" + height="129" + width="304" + layout="topleft"> + <texture_picker + default_image_name="Generic_Group_Large" + follows="left|top" + height="110" + label="" + layout="topleft" + left="10" + name="insignia" + no_commit_on_selection="true" + tool_tip="Click to choose a picture" + top="5" + width="100" /> + <text + font="SansSerifSmall" + text_color="White_50" + width="190" + follows="top|left" + layout="topleft" + mouse_opaque="false" + type="string" + height="16" + length="1" + left_pad="10" + name="prepend_founded_by" + top_delta="0"> + Founder: + </text> + <name_box + follows="left|top" + height="16" + initial_value="(retrieving)" + layout="topleft" + left_delta="0" + link="true" + name="founder_name" + top_pad="2" + use_ellipses="true" + width="190" /> + <text + font="SansSerifMedium" + text_color="EmphasisColor" + type="string" + follows="left|top" + height="16" + layout="topleft" + left_delta="0" + name="join_cost_text" + top_pad="10" + visible="true" + width="190"> + Free + </text> + <button + follows="left|top" + left_delta="0" + top_pad="6" + height="23" + label="JOIN NOW!" + name="btn_join" + visible="true" + width="120" /> + </panel> <text_editor type="string" follows="left|top|right" left="5" - height="150" + height="80" layout="topleft" max_length="511" name="charter" - top="5" + top="105" right="-1" bg_readonly_color="DkGray2" text_readonly_color="White" @@ -40,7 +109,7 @@ Hover your mouse over the options for more help. draw_heading="true" follows="left|top|right" heading_height="23" - height="200" + height="160" layout="topleft" left="0" name="visible_members" @@ -110,9 +179,9 @@ Hover your mouse over the options for more help. top_pad="5" width="295" /> <panel - background_visible="true" - bevel_style="in" - border="true" + background_visible="false" + bevel_style="none" + border="false" bg_alpha_color="FloaterUnfocusBorderColor" follows="left|top|right" height="140" @@ -173,14 +242,17 @@ Hover your mouse over the options for more help. tool_tip="Sets whether your group contains information rated as Moderate" top_pad="4" width="190"> + <combo_item name="select_mature" value="Select"> + - Select maturity rating - + </combo_item> <combo_box.item - label="General Content" - name="pg" - value="Not Mature" /> - <combo_box.item label="Moderate Content" name="mature" value="Mature" /> + <combo_box.item + label="General Content" + name="pg" + value="Not Mature" /> </combo_box> <check_box follows="left|top" diff --git a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml index 9727c54c6b..e894fc8fb8 100644 --- a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml +++ b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml @@ -31,32 +31,39 @@ background_visible="true" follows="top|left" top="0" left="0" - height="129" + height="29" width="313" layout="topleft"> <button follows="top|right" - height="23" - image_overlay="BackArrow_Off" + height="24" + image_hover_unselected="BackButton_Over" + image_pressed="BackButton_Press" + image_unselected="BackButton_Off" layout="topleft" name="back" - left="10" + left="7" tab_stop="false" top="2" - width="23" /> - <text + width="30" /> + <text_editor + allow_scroll="false" + bg_visible="false" + read_only = "true" layout="topleft" name="group_name" + v_pad="0" value="(Loading...)" - font="SansSerifHuge" - height="20" - left_pad="5" - text_color="white" - top="3" + font="SansSerifHugeBold" + h_pad="0" + height="26" + left_pad="8" + text_color="LtGray" + top="1" use_ellipses="true" - width="270" - follows="top|left" - word_wrap="true" + width="275" + follows="top|left|right" + word_wrap="false" mouse_opaque="false"/> <line_editor follows="left|top" @@ -70,155 +77,109 @@ background_visible="true" width="270" height="20" visible="false" /> - <texture_picker - follows="left|top" - height="113" - label="" - layout="topleft" - left="10" - name="insignia" - no_commit_on_selection="true" - tool_tip="Click to choose a picture" - top_pad="5" - width="100" /> - <text - font="SansSerifSmall" - text_color="White_50" - width="190" - follows="top|left" - layout="topleft" - mouse_opaque="false" - type="string" - height="16" - length="1" - left_pad="10" - name="prepend_founded_by" - top_delta="0"> - Founder: - </text> - <name_box - follows="left|top" - height="16" - initial_value="(retrieving)" - layout="topleft" - left_delta="0" - link="true" - name="founder_name" - top_pad="2" - use_ellipses="true" - width="190" /> - <text - font="SansSerifMedium" - text_color="EmphasisColor" - type="string" - follows="left|top" - height="16" - layout="topleft" - left_delta="0" - name="join_cost_text" - top_pad="10" - visible="true" - width="190"> - Free - </text> - <button - follows="left|top" - left_delta="0" - top_pad="6" - height="23" - label="JOIN NOW!" - name="btn_join" - visible="true" - width="120" /> </panel> <layout_stack name="layout" orientation="vertical" follows="all" - left="0" + left="8" top_pad="0" - height="437" - width="313" + height="536" + width="292" border_size="0"> <layout_panel - name="group_accordions" - follows="all" - layout="topleft" - auto_resize="true" - > + bg_alpha_color="DkGray2" + bg_opaque_color="DkGray2" + background_visible="true" + background_opaque="true" + name="group_accordions" + follows="all" + layout="topleft" + auto_resize="true" + width="313"> <accordion left="0" top="0" - single_expansion="true" - follows="all" - layout="topleft" - name="groups_accordion"> - <accordion_tab + single_expansion="true" + fit_parent="true" + follows="all" + layout="topleft" + name="groups_accordion" + width="313"> + <accordion_tab expanded="true" layout="topleft" name="group_general_tab" - title="General"> - <panel - border="false" - class="panel_group_general" - filename="panel_group_general.xml" - layout="topleft" - left="0" - follows="all" - help_topic="group_general_tab" - name="group_general_tab_panel" - top="0" /> + title="General" + fit_panel="false"> + <panel + border="false" + class="panel_group_general" + filename="panel_group_general.xml" + layout="topleft" + left="0" + follows="left|top|right" + help_topic="group_general_tab" + name="group_general_tab_panel" + top="0" /> </accordion_tab> <accordion_tab expanded="false" layout="topleft" name="group_roles_tab" - title="Roles"> - <panel - border="false" - class="panel_group_roles" - filename="panel_group_roles.xml" - layout="topleft" - left="0" - name="group_roles_tab_panel" - top="0" /> + title="Roles" + fit_panel="false"> + <panel + border="false" + class="panel_group_roles" + filename="panel_group_roles.xml" + follows="left|top|right" + layout="topleft" + left="0" + name="group_roles_tab_panel" + top="0" /> </accordion_tab> <accordion_tab - expanded="false" - layout="topleft" - name="group_notices_tab" - title="Notices"> - <panel - border="false" - class="panel_group_notices" - filename="panel_group_notices.xml" - layout="topleft" - left="0" - help_topic="group_notices_tab" - name="group_notices_tab_panel" - top="0" /> + expanded="false" + layout="topleft" + name="group_notices_tab" + title="Notices" + fit_panel="false"> + <panel + border="false" + class="panel_group_notices" + filename="panel_group_notices.xml" + follows="left|top|right" + layout="topleft" + left="0" + help_topic="group_notices_tab" + name="group_notices_tab_panel" + top="0" /> </accordion_tab> - <accordion_tab - expanded="false" - layout="topleft" - name="group_land_tab" - title="Land/Assets"> - <panel - border="false" - class="panel_group_land_money" - filename="panel_group_land_money.xml" - layout="topleft" - left="0" - name="group_land_tab_panel" - top="0" /> + <accordion_tab + expanded="false" + layout="topleft" + name="group_land_tab" + title="Land/Assets" + fit_panel="false"> + <panel + border="false" + class="panel_group_land_money" + filename="panel_group_land_money.xml" + follows="left|top|right" + layout="topleft" + left="0" + name="group_land_tab_panel" + top="0" /> </accordion_tab> </accordion> </layout_panel> <layout_panel - height="25" + height="30" layout="topleft" auto_resize="false" left="0" + top_pad="0" name="button_row" follows="bottom|left" width="313"> @@ -227,56 +188,52 @@ background_visible="true" height="23" image_overlay="Refresh_Off" layout="topleft" - left="5" - top="0" + left="0" + top="5" name="btn_refresh" width="23" /> - <button - follows="bottom|left" - height="18" - image_selected="AddItem_Press" - image_unselected="AddItem_Off" - image_disabled="AddItem_Disabled" - layout="topleft" - left_pad="2" - top_delta="3" - name="btn_create" - visible="true" - tool_tip="Create a new Group" - width="18" /> - <!-- <button - left_pad="10" - height="20" - label="Cancel" - label_selected="Cancel" - name="btn_cancel" - visible="false" - width="65" />--> <button follows="bottom|left" label="Chat" name="btn_chat" - left_pad="2" + left_pad="3" height="23" - top_delta="-3" - width="60" /> + width="82" /> <button follows="bottom|left" - left_pad="2" + left_pad="3" height="23" name="btn_call" label="Group Call" layout="topleft" tool_tip="Call this group" - width="95" /> + width="112" /> <button follows="bottom|left" height="23" label="Save" label_selected="Save" name="btn_apply" - left_pad="2" - width="85" /> + left_pad="3" + width="82" /> + <button + follows="bottom|left" + height="23" + layout="topleft" + left="0" + label="Create Group" + name="btn_create" + visible="true" + tool_tip="Create a new Group" + width="103" /> + <!--<button + left_pad="3" + height="23" + label="Cancel" + label_selected="Cancel" + name="btn_cancel" + visible="false" + width="65" />--> </layout_panel> </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_group_invite.xml b/indra/newview/skins/default/xui/en/panel_group_invite.xml index 48083b7677..15a3191bdf 100644 --- a/indra/newview/skins/default/xui/en/panel_group_invite.xml +++ b/indra/newview/skins/default/xui/en/panel_group_invite.xml @@ -86,7 +86,7 @@ left="4" name="ok_button" top="356" - width="130" /> + width="135" /> <button height="20" label="Cancel" diff --git a/indra/newview/skins/default/xui/en/panel_group_land_money.xml b/indra/newview/skins/default/xui/en/panel_group_land_money.xml index 38b0f234d5..76f7484c68 100644 --- a/indra/newview/skins/default/xui/en/panel_group_land_money.xml +++ b/indra/newview/skins/default/xui/en/panel_group_land_money.xml @@ -1,14 +1,13 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel border="false" - follows="all" height="500" label="Land & L$" layout="topleft" left="0" name="land_money_tab" top="0" - width="313"> + width="304"> <panel.string name="help_text"> A warning appears until the Total Land in Use is less than or = to the Total Contribution. @@ -18,6 +17,10 @@ You don't have permission to view group owned land </panel.string> <panel.string + name="epmty_view_group_land_text"> + No entries + </panel.string> + <panel.string name="cant_view_group_accounting_text"> You don't have permission to view the group's accounting information. </panel.string> @@ -263,6 +266,7 @@ top="0" width="313"> <text_editor + enabled="false" type="string" follows="all" height="200" @@ -287,6 +291,7 @@ top="0" width="313"> <text_editor + enabled="false" type="string" follows="all" height="185" @@ -330,6 +335,7 @@ top="0" width="313"> <text_editor + enabled="false" type="string" follows="all" height="185" diff --git a/indra/newview/skins/default/xui/en/panel_group_notices.xml b/indra/newview/skins/default/xui/en/panel_group_notices.xml index 5f46ad7860..6523b0d491 100644 --- a/indra/newview/skins/default/xui/en/panel_group_notices.xml +++ b/indra/newview/skins/default/xui/en/panel_group_notices.xml @@ -1,13 +1,12 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel - follows="all" height="530" label="Notices" layout="topleft" left="0" name="notices_tab" top="0" - width="313"> + width="304"> <panel.string name="help_text"> Notices let you send a message and an optionally attached item. @@ -44,7 +43,7 @@ Maximum 200 per group daily right="-1" name="notice_list" top_pad="0" - width="313"> + width="304"> <scroll_list.columns label="" name="icon" @@ -75,16 +74,14 @@ Maximum 200 per group daily </text> <button follows="top|left" - height="18" - image_selected="AddItem_Press" - image_unselected="AddItem_Off" - image_disabled="AddItem_Disabled" + height="23" + image_overlay="AddItem_Off" layout="topleft" left="5" name="create_new_notice" tool_tip="Create a new notice" - top_delta="-3" - width="18" /> + top_delta="-3" + width="23" /> <button follows="top|left" height="23" @@ -132,6 +129,7 @@ Maximum 200 per group daily Subject: </text> <line_editor + follows="left|top|right" border_style="line" border_thickness="1" height="16" @@ -154,6 +152,7 @@ Maximum 200 per group daily Message: </text> <text_editor + follows="left|top|right" height="90" layout="topleft" left_pad="3" @@ -174,6 +173,7 @@ Maximum 200 per group daily Attach: </text> <line_editor + follows="left|top|right" enabled="false" height="19" layout="topleft" @@ -208,9 +208,23 @@ Maximum 200 per group daily <button follows="left|top" layout="topleft" + left="20" + top_delta="50" + height="23" + width="100" + name="open_inventory" + label="Inventory" + tool_tip="Open Inventory"> + <button.init_callback + function="Button.SetFloaterToggle" + parameter="inventory"/> + </button> + <button + follows="left|top" + layout="topleft" left="140" name="remove_attachment" - top_delta="50" + top_delta="0" height="18" image_selected="TrashItem_Press" image_unselected="TrashItem_Off" @@ -223,12 +237,12 @@ Maximum 200 per group daily label="Send" label_selected="Send" layout="topleft" - right="-10" + right="-25" top_pad="10" name="send_notice" width="100" /> <group_drop_target - height="95" + height="75" top="160" left="10" layout="topleft" diff --git a/indra/newview/skins/default/xui/en/panel_group_roles.xml b/indra/newview/skins/default/xui/en/panel_group_roles.xml index 25a0213bde..0eb5c47f85 100644 --- a/indra/newview/skins/default/xui/en/panel_group_roles.xml +++ b/indra/newview/skins/default/xui/en/panel_group_roles.xml @@ -1,13 +1,12 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel - follows="all" height="680" label="Members & Roles" layout="topleft" left="0" top="0" name="roles_tab" - width="313"> + width="304"> <panel.string name="default_needs_apply_text"> There are unsaved changes @@ -31,7 +30,7 @@ tab_height="22" tab_min_width="90" top="0" - width="313"> + width="304"> <panel border="false" follows="all" @@ -276,7 +275,7 @@ things in this group. There's a broad variety of Abilities. </tab_container> <panel height="350" - background_visible="true" + background_visible="false" bg_alpha_color="FloaterUnfocusBorderColor" layout="topleft" follows="top|left|right" @@ -356,7 +355,7 @@ things in this group. There's a broad variety of Abilities. </panel> <panel height="550" - background_visible="true" + background_visible="false" bg_alpha_color="FloaterUnfocusBorderColor" layout="topleft" follows="top|left|right" @@ -386,7 +385,7 @@ things in this group. There's a broad variety of Abilities. left="0" follows="left|top|right" right="-1" - max_length="295" + max_length="20" name="role_name" top_pad="0" width="300"> @@ -409,7 +408,7 @@ things in this group. There's a broad variety of Abilities. left="0" follows="left|top|right" right="-1" - max_length="295" + max_length="20" name="role_title" top_pad="0" width="300"> @@ -509,7 +508,7 @@ things in this group. There's a broad variety of Abilities. </panel> <panel height="424" - background_visible="true" + background_visible="false" bg_alpha_color="FloaterUnfocusBorderColor" layout="topleft" follows="top|left|right" diff --git a/indra/newview/skins/default/xui/en/panel_im_control_panel.xml b/indra/newview/skins/default/xui/en/panel_im_control_panel.xml index c7e5b25e06..33a5e01e4c 100644 --- a/indra/newview/skins/default/xui/en/panel_im_control_panel.xml +++ b/indra/newview/skins/default/xui/en/panel_im_control_panel.xml @@ -3,35 +3,26 @@ border="false" height="300" name="panel_im_control_panel" - width="110"> + width="119"> <avatar_icon follows="left|top" height="105" left_delta="5" name="avatar_icon" top="-5" - width="105"/> - <text - follows="top|left|right" - font="SansSerifLarge" - height="19" - layout="topleft" - name="avatar_name" - use_ellipses="true" - value="Unknown" - width="110" /> + width="114"/> <layout_stack mouse_opaque="false" border_size="0" clip="false" follows="all" - height="168" + height="183" layout="topleft" left="5" name="button_stack" orientation="vertical" - top_pad="-5" - width="105"> + top_pad="5" + width="114"> <layout_panel mouse_opaque="false" auto_resize="true" @@ -40,7 +31,7 @@ layout="topleft" left="2" min_height="0" - width="100" + width="109" top="0" name="spacer" user_resize="false" /> @@ -50,7 +41,7 @@ height="20" layout="topleft" min_height="20" - width="100" + width="109" name="view_profile_btn_panel" user_resize="false"> <button @@ -59,7 +50,7 @@ label="Profile" name="view_profile_btn" top="0" - width="100" /> + width="109" /> </layout_panel> <layout_panel auto_resize="false" @@ -67,7 +58,7 @@ height="25" layout="topleft" min_height="25" - width="100" + width="109" name="add_friend_btn_panel" user_resize="false"> <button @@ -76,7 +67,7 @@ label="Add Friend" name="add_friend_btn" top="5" - width="100" /> + width="109" /> </layout_panel> <layout_panel auto_resize="false" @@ -84,7 +75,7 @@ height="25" layout="topleft" min_height="25" - width="100" + width="109" name="teleport_btn_panel" user_resize="false"> <button @@ -94,7 +85,7 @@ label="Teleport" name="teleport_btn" tool_tip = "Offer to teleport this person" - width="100" /> + width="109" /> </layout_panel> <layout_panel auto_resize="false" @@ -102,7 +93,7 @@ height="25" layout="topleft" min_height="25" - width="100" + width="109" name="share_btn_panel" user_resize="false"> <button @@ -111,7 +102,7 @@ height="23" label="Share" name="share_btn" - width="100" /> + width="109" /> </layout_panel> <layout_panel auto_resize="false" @@ -119,8 +110,8 @@ height="25" layout="topleft" min_height="25" - width="100" - name="share_btn_panel" + width="109" + name="pay_btn_panel" user_resize="false"> <button auto_resize="true" @@ -128,7 +119,7 @@ height="23" label="Pay" name="pay_btn" - width="100" /> + width="109" /> </layout_panel> <layout_panel auto_resize="false" @@ -136,7 +127,7 @@ height="25" layout="topleft" min_height="25" - width="100" + width="109" name="call_btn_panel" user_resize="false"> <button @@ -144,7 +135,7 @@ height="23" label="Call" name="call_btn" - width="100" /> + width="109" /> </layout_panel> <layout_panel auto_resize="false" @@ -152,16 +143,16 @@ height="25" layout="topleft" min_height="25" - width="100" + width="109" name="end_call_btn_panel" user_resize="false" visible="false"> <button follows="left|top|right" height="23" - label="Leave Call" + label="End Call" name="end_call_btn" - width="100" /> + width="109" /> </layout_panel> <layout_panel auto_resize="false" @@ -169,7 +160,7 @@ height="25" layout="topleft" min_height="25" - width="100" + width="109" name="voice_ctrls_btn_panel" user_resize="false" visible="false"> @@ -178,7 +169,7 @@ height="23" label="Voice Controls" name="voice_ctrls_btn" - width="100" /> + width="109" /> </layout_panel> </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_instant_message.xml b/indra/newview/skins/default/xui/en/panel_instant_message.xml index a0ad38cf76..34fd3352a3 100644 --- a/indra/newview/skins/default/xui/en/panel_instant_message.xml +++ b/indra/newview/skins/default/xui/en/panel_instant_message.xml @@ -56,16 +56,6 @@ name="adhoc_icon" top="3" width="18" /> - <!--<icon - follows="right" - height="20" - image_name="" - layout="topleft" - left="3" - mouse_opaque="true" - name="sys_msg_icon" - top="0" - width="20" />--> <text follows="left|right" font.style="BOLD" diff --git a/indra/newview/skins/default/xui/en/panel_inventory_item.xml b/indra/newview/skins/default/xui/en/panel_inventory_item.xml new file mode 100644 index 0000000000..f1b7b92ece --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_inventory_item.xml @@ -0,0 +1,51 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + follows="top|right|left" + height="20" + layout="topleft" + left="0" + name="inventory_item" + top="0" + width="380"> + <icon + follows="top|right|left" + height="20" + image_name="ListItem_Over" + layout="topleft" + left="0" + name="hovered_icon" + top="0" + visible="false" + width="380" /> + <icon + height="20" + follows="top|right|left" + image_name="ListItem_Select" + layout="topleft" + left="0" + name="selected_icon" + top="0" + visible="false" + width="380" /> + <icon + height="16" + follows="top|left" + image_name="Inv_Object" + layout="topleft" + left="0" + name="item_icon" + top="0" + width="16" /> + <text + follows="left|right" + height="20" + layout="topleft" + left_pad="5" + allow_html="false" + use_ellipses="true" + name="item_name" + text_color="white" + top="4" + value="..." + width="359" /> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_landmark_info.xml b/indra/newview/skins/default/xui/en/panel_landmark_info.xml index d1b22a34bb..55fef5aaf7 100644 --- a/indra/newview/skins/default/xui/en/panel_landmark_info.xml +++ b/indra/newview/skins/default/xui/en/panel_landmark_info.xml @@ -8,7 +8,7 @@ min_height="350" name="landmark_info" top="20" - width="330"> + width="333"> <string name="title_create_landmark" value="Create Landmark" /> @@ -46,62 +46,67 @@ <!-- Texture names for rating icons --> <string name="icon_PG" + translate="false" value="Parcel_PG_Dark" /> <string name="icon_M" + translate="false" value="Parcel_M_Dark" /> <string name="icon_R" + translate="false" value="Parcel_R_Dark" /> <button follows="top|right" - height="23" - image_overlay="BackArrow_Off" + height="24" + image_hover_unselected="BackButton_Over" + image_pressed="BackButton_Press" + image_unselected="BackButton_Off" layout="topleft" - left="10" + left="9" name="back_btn" tool_tip="Back" tab_stop="false" - top="0" - width="23" /> + top="4" + width="30" /> <text follows="top|left|right" font="SansSerifHugeBold" height="26" layout="topleft" - left_pad="10" + left_pad="7" name="title" text_color="LtGray" - top="0" + top="3" use_ellipses="true" value="Place Profile" - width="275" /> + width="280" /> <scroll_container color="DkGray2" follows="all" - height="533" + height="532" layout="topleft" - left="10" + left="9" name="place_scroll" opaque="true" - top_pad="5" - width="313"> + top_pad="10" + width="310"> <panel bg_alpha_color="DkGray2" follows="left|top|right" - height="610" + height="630" layout="topleft" left="0" min_height="300" name="scrolling_panel" top="0" - width="313"> + width="310"> <texture_picker enabled="false" - follows="top|left" - height="190" + follows="left|top|right" + height="197" layout="topleft" - left="10" + left="11" name="logo" top="10" width="290" /> @@ -113,29 +118,30 @@ left="10" name="region_title" text_color="white" - top_pad="5" + top_pad="10" use_ellipses="true" value="SampleRegion" - width="290" /> + width="280" /> <text follows="left|top|right" height="14" layout="topleft" left="10" name="parcel_title" - top_pad="4" + top_pad="10" use_ellipses="true" value="SampleParcel, Name Long (145, 228, 26)" - width="285" /> + width="280" /> <expandable_text follows="left|top|right" height="50" layout="topleft" - left="5" + left="10" name="description" + textbox.label="More" top_pad="10" value="Du waltz die spritz" - width="300" /> + width="280" /> <icon follows="top|left" height="16" @@ -149,9 +155,9 @@ follows="left|top|right" height="16" layout="topleft" - left_pad="8" + left_pad="5" name="maturity_value" - top_delta="0" + top_pad="-13" value="unknown" width="268" /> <panel @@ -269,6 +275,7 @@ name="notes_editor" read_only="true" text_readonly_color="white" + text_type="ascii" top_pad="5" width="290" wrap="true" /> @@ -283,7 +290,7 @@ width="290" /> <combo_box follows="bottom|left|right" - height="20" + height="23" layout="topleft" left="0" name="folder_combo" diff --git a/indra/newview/skins/default/xui/en/panel_landmarks.xml b/indra/newview/skins/default/xui/en/panel_landmarks.xml index 91d4cd6e83..a7e87f2a1e 100644 --- a/indra/newview/skins/default/xui/en/panel_landmarks.xml +++ b/indra/newview/skins/default/xui/en/panel_landmarks.xml @@ -3,22 +3,25 @@ name="Landmarks" top="0" height="400" - layout="topleft" + layout="topleft" left="0" - width="380" + width="313" help_topic="panel_landmarks" - border="true" + border="false" background_visible="true" - bg_alpha_color="DkGray2" - follows="left|top|right|bottom"> + bg_alpha_color="DkGray" + follows="all"> <accordion - follows="left|top|right|bottom" - height="368" + background_visible="true" + bg_alpha_color="DkGray2" + bg_opaque_color="DkGray2" + follows="all" + height="373" layout="topleft" - left="0" + left="3" name="landmarks_accordion" - top="2" - width="380"> + top="0" + width="307"> <accordion_tab layout="topleft" name="tab_favorites" @@ -27,13 +30,13 @@ allow_multi_select="true" border="false" bottom="0" - follows="left|top|right|bottom" + follows="all" height="126" left="0" mouse_opaque="true" name="favorites_list" start_folder="Favorites" - width="380"/> + width="307"/> </accordion_tab> <accordion_tab layout="topleft" @@ -43,13 +46,13 @@ allow_multi_select="true" border="false" bottom="0" - follows="left|top|right|bottom" + follows="all" height="126" left="0" mouse_opaque="true" name="landmarks_list" start_folder="Landmarks" - width="380"/> + width="307"/> </accordion_tab> <accordion_tab layout="topleft" @@ -59,13 +62,13 @@ allow_multi_select="true" border="false" bottom="0" - follows="left|top|right|bottom" + follows="all" height="126" left="0" mouse_opaque="true" name="my_inventory_list" start_folder="My Inventory" - width="380"/> + width="307"/> </accordion_tab> <accordion_tab layout="topleft" @@ -75,13 +78,13 @@ allow_multi_select="true" border="false" bottom="0" - follows="left|top|right|bottom" - height="120" + follows="all" + height="126" left="0" mouse_opaque="true" name="library_list" start_folder="LIBRARY" - width="380"/> + width="313"/> </accordion_tab> </accordion> <panel @@ -89,44 +92,56 @@ bevel_style="none" bottom="0" follows="left|right|bottom" - height="30" + height="27" layout="bottomleft" - left="0" + left="3" name="bottom_panel" - width="380"> + width="313"> <button follows="bottom|left" tool_tip="Show additional options" - height="18" - image_disabled="OptionsMenu_Disabled" - image_selected="OptionsMenu_Press" - image_unselected="OptionsMenu_Off" + height="25" + image_hover_unselected="Toolbar_Left_Over" + image_overlay="OptionsMenu_Off" + image_selected="Toolbar_Left_Selected" + image_unselected="Toolbar_Left_Off" layout="topleft" - left="10" + left="0" name="options_gear_btn" - top="6" - width="18" /> + top="1" + width="31" /> <button follows="bottom|left" - height="18" - image_selected="AddItem_Press" - image_unselected="AddItem_Off" - image_disabled="AddItem_Disabled" + height="25" + image_hover_unselected="Toolbar_Middle_Over" + image_overlay="AddItem_Off" + image_selected="Toolbar_Middle_Selected" + image_unselected="Toolbar_Middle_Off" layout="topleft" - left_pad="5" + left_pad="1" name="add_btn" tool_tip="Add new landmark" - width="18" /> + width="31" /> + <icon + follows="bottom|left" + height="25" + image_name="Toolbar_Middle_Off" + layout="topleft" + left_pad="1" + name="dummy_icon" + width="209" + /> <dnd_button - follows="bottom|right" - height="18" - image_selected="TrashItem_Press" - image_unselected="TrashItem_Off" + follows="bottom|left" + height="25" + image_hover_unselected="Toolbar_Right_Over" + image_overlay="TrashItem_Off" + image_selected="Toolbar_Right_Selected" + image_unselected="Toolbar_Right_Off" layout="topleft" - right="-5" + left_pad="1" name="trash_btn" tool_tip="Remove selected landmark" - top="6" - width="18" /> + width="31" /> </panel> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_login.xml b/indra/newview/skins/default/xui/en/panel_login.xml index 627e616af5..185e458a85 100644 --- a/indra/newview/skins/default/xui/en/panel_login.xml +++ b/indra/newview/skins/default/xui/en/panel_login.xml @@ -56,44 +56,23 @@ height="80"> follows="left|bottom" font="SansSerifSmall" height="16" -name="first_name_text" +name="username_text" top="20" left="20" width="150"> -First name: +Username: </text> <line_editor follows="left|bottom" -handle_edit_keys_directly="true" height="22" -label="First" +label="Username" left_delta="0" max_length="31" -name="first_name_edit" +name="username_edit" select_on_focus="true" -tool_tip="[SECOND_LIFE] First Name" +tool_tip="[SECOND_LIFE] Username" top_pad="0" - width="135" /> - <text - follows="left|bottom" - font="SansSerifSmall" - height="16" - left_pad="8" - name="last_name_text" - top="20" - width="150"> - Last name: </text> -<line_editor -follows="left|bottom" -handle_edit_keys_directly="true" -height="22" -label="Last" -max_length="31" -name="last_name_edit" -select_on_focus="true" -tool_tip="[SECOND_LIFE] Last Name" - top_pad="0" - width="135" /> +width="150" /> <text follows="left|bottom" font="SansSerifSmall" @@ -106,7 +85,6 @@ top="20" </text> <line_editor follows="left|bottom" -handle_edit_keys_directly="true" height="22" max_length="16" name="password_edit" @@ -170,6 +148,7 @@ allow_text_entry="true" font="SansSerifSmall" follows="left|right|bottom" height="23" + max_chars="256" layout="topleft" top_pad="2" name="server_combo" diff --git a/indra/newview/skins/default/xui/en/panel_main_inventory.xml b/indra/newview/skins/default/xui/en/panel_main_inventory.xml index 4030c7184a..2a53b3e2fa 100644 --- a/indra/newview/skins/default/xui/en/panel_main_inventory.xml +++ b/indra/newview/skins/default/xui/en/panel_main_inventory.xml @@ -1,473 +1,195 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel background_visible="true" + default_tab_group="1" follows="all" - height="400" + height="423" label="Things" layout="topleft" min_height="350" min_width="240" name="main inventory panel" width="330"> - <panel.string - name="Title"> - Things - </panel.string> - <filter_editor - text_pad_left="14" - follows="left|top|right" - height="23" - label="Filter Inventory" - layout="topleft" - left="15" -max_length="300" - name="inventory search editor" - top="26" - width="303" /> - <tab_container -follows="all" -halign="center" - height="300" + <panel.string + name="Itemcount"> + </panel.string> + <panel.string + name="ItemcountFetching"> + Fetching [ITEM_COUNT] Items... [FILTER] + </panel.string> + <panel.string + name="ItemcountCompleted"> + [ITEM_COUNT] Items [FILTER] + </panel.string> + <panel.string + name="ItemcountUnknown"> + + </panel.string> + <text + type="string" + length="1" + follows="left|top" + height="13" + layout="topleft" + left="12" + name="ItemcountText" + font="SansSerifMedium" + text_color="EmphasisColor" + top_pad="0" + width="300"> + Items: + </text> + <filter_editor + text_pad_left="10" + follows="left|top|right" + height="23" + label="Filter Inventory" + layout="topleft" + left="10" + max_length="300" + name="inventory search editor" + top="18" + width="303" /> + <tab_container + bg_alpha_color="DkGray" + bg_opaque_color="DkGray" + background_visible="true" + background_opaque="true" + follows="all" + halign="center" + height="339" layout="topleft" - left_delta="-4" + left="7" name="inventory filter tabs" tab_height="30" + tab_group="1" tab_position="top" tab_min_width="100" - top_pad="4" - width="305"> - <inventory_panel - border="false" - follows="all" - height="295" - label="MY INVENTORY" - help_topic="my_inventory_tab" - layout="topleft" - left="0" - name="All Items" - top="16" - width="290" /> - <inventory_panel - border="false" - follows="all" - height="295" - label="RECENT" - help_topic="recent_inventory_tab" - layout="topleft" - left_delta="0" - name="Recent Items" - width="290" /> - </tab_container> - - <panel + top_pad="10" + width="312"> + <inventory_panel + bg_opaque_color="DkGray2" + bg_alpha_color="DkGray2" background_visible="true" + background_opaque="true" + border="false" bevel_style="none" - bottom="0" - follows="left|right|bottom" - height="30" - layout="bottomleft" + follows="all" + height="338" + label="MY INVENTORY" + help_topic="my_inventory_tab" + layout="topleft" left="0" - visible="true" - name="bottom_panel" - width="330"> - <button - follows="bottom|left" - tool_tip="Show additional options" - height="18" - image_disabled="OptionsMenu_Disabled" - image_selected="OptionsMenu_Press" - image_unselected="OptionsMenu_Off" - layout="topleft" - left="10" - name="options_gear_btn" - picture_style="true" - top="6" - width="18" /> - <button - follows="bottom|left" - height="18" - image_selected="AddItem_Press" - image_unselected="AddItem_Off" - image_disabled="AddItem_Disabled" - layout="topleft" - left_pad="5" - name="add_btn" - picture_style="true" - tool_tip="Add new item" - width="18" /> - <dnd_button - follows="bottom|right" - height="18" - image_selected="TrashItem_Press" - image_unselected="TrashItem_Off" - layout="topleft" - right="-5" - name="trash_btn" - picture_style="true" - tool_tip="Remove selected item" - top="6" - width="18" /> - </panel> - - <menu_bar - bg_visible="false" - follows="left|top|right" - height="20" + name="All Items" + sort_order_setting="InventorySortOrder" + show_item_link_overlays="true" + top="16" + width="288" /> + <recent_inventory_panel + bg_opaque_color="DkGray2" + bg_alpha_color="DkGray2" + background_visible="true" + background_opaque="true" + border="false" + bevel_style="none" + follows="all" + height="338" + label="RECENT" + help_topic="recent_inventory_tab" layout="topleft" - left="10" - mouse_opaque="false" - name="Inventory Menu" - top="0" - visible="true" - width="290"> - <menu - height="101" - label="File" - layout="topleft" - left="0" - mouse_opaque="false" - name="File" - tear_off="true" - top="-117" - width="128"> - <menu_item_call - label="Open" - layout="topleft" - name="Open"> - <menu_item_call.on_click - function="Inventory.DoToSelected" - parameter="open" /> - </menu_item_call> - <menu - create_jump_keys="true" - label="Upload" - layout="topleft" - name="upload" - tear_off="true"> - <menu_item_call - label="Image (L$[COST])..." - layout="topleft" - name="Upload Image" - shortcut="control|U"> - <menu_item_call.on_click - function="File.UploadImage" - parameter="" /> - <menu_item_call.on_enable - function="File.EnableUpload" /> - </menu_item_call> - <menu_item_call - label="Sound (L$[COST])..." - layout="topleft" - name="Upload Sound"> - <menu_item_call.on_click - function="File.UploadSound" - parameter="" /> - <menu_item_call.on_enable - function="File.EnableUpload" /> - </menu_item_call> - <menu_item_call - label="Animation (L$[COST])..." - layout="topleft" - name="Upload Animation"> - <menu_item_call.on_click - function="File.UploadAnim" - parameter="" /> - <menu_item_call.on_enable - function="File.EnableUpload" /> - </menu_item_call> - <menu_item_call - label="Bulk (L$[COST] per file)..." - layout="topleft" - name="Bulk Upload"> - <menu_item_call.on_click - function="File.UploadBulk" - parameter="" /> - </menu_item_call> - <menu_item_separator - layout="topleft" /> - </menu> - <menu_item_separator - layout="topleft" /> - <menu_item_call - label="New Window" - layout="topleft" - name="New Window"> - <menu_item_call.on_click - function="Inventory.NewWindow" /> - </menu_item_call> - <menu_item_separator - layout="topleft" - name="separator2" /> - <menu_item_call - label="Show Filters" - layout="topleft" - name="Show Filters"> - <menu_item_call.on_click - function="Inventory.ShowFilters" /> - </menu_item_call> - <menu_item_call - label="Reset Filters" - layout="topleft" - name="Reset Current"> - <menu_item_call.on_click - function="Inventory.ResetFilters" /> - </menu_item_call> - <menu_item_call - label="Close All Folders" - layout="topleft" - name="Close All Folders"> - <menu_item_call.on_click - function="Inventory.CloseAllFolders" /> - </menu_item_call> - <menu_item_separator - layout="topleft" - name="separator3" /> - <menu_item_call - label="Empty Trash" - layout="topleft" - name="Empty Trash"> - <menu_item_call.on_click - function="Inventory.EmptyTrash" /> - </menu_item_call> - <menu_item_call - label="Empty Lost And Found" - layout="topleft" - name="Empty Lost And Found"> - <menu_item_call.on_click - function="Inventory.EmptyLostAndFound" /> - </menu_item_call> - </menu> - <menu - height="121" - label="Create" - layout="topleft" - left="0" - mouse_opaque="false" - name="Create" - tear_off="true" - top="-201" - width="121"> - <menu_item_call - label="New Folder" - layout="topleft" - name="New Folder"> - <menu_item_call.on_click - function="Inventory.DoCreate" - parameter="category" /> - </menu_item_call> - <menu_item_call - label="New Script" - layout="topleft" - name="New Script"> - <menu_item_call.on_click - function="Inventory.DoCreate" - parameter="lsl" /> - </menu_item_call> - <menu_item_call - label="New Notecard" - layout="topleft" - name="New Note"> - <menu_item_call.on_click - function="Inventory.DoCreate" - parameter="notecard" /> - </menu_item_call> - <menu_item_call - label="New Gesture" - layout="topleft" - name="New Gesture"> - <menu_item_call.on_click - function="Inventory.DoCreate" - parameter="gesture" /> - </menu_item_call> - <menu - height="175" - label="New Clothes" - layout="topleft" - left_delta="0" - mouse_opaque="false" - name="New Clothes" - top_pad="514" - width="125"> - <menu_item_call - label="New Shirt" - layout="topleft" - name="New Shirt"> - <menu_item_call.on_click - function="Inventory.DoCreate" - parameter="shirt" /> - </menu_item_call> - <menu_item_call - label="New Pants" - layout="topleft" - name="New Pants"> - <menu_item_call.on_click - function="Inventory.DoCreate" - parameter="pants" /> - </menu_item_call> - <menu_item_call - label="New Shoes" - layout="topleft" - name="New Shoes"> - <menu_item_call.on_click - function="Inventory.DoCreate" - parameter="shoes" /> - </menu_item_call> - <menu_item_call - label="New Socks" - layout="topleft" - name="New Socks"> - <menu_item_call.on_click - function="Inventory.DoCreate" - parameter="socks" /> - </menu_item_call> - <menu_item_call - label="New Jacket" - layout="topleft" - name="New Jacket"> - <menu_item_call.on_click - function="Inventory.DoCreate" - parameter="jacket" /> - </menu_item_call> - <menu_item_call - label="New Skirt" - layout="topleft" - name="New Skirt"> - <menu_item_call.on_click - function="Inventory.DoCreate" - parameter="skirt" /> - </menu_item_call> - <menu_item_call - label="New Gloves" - layout="topleft" - name="New Gloves"> - <menu_item_call.on_click - function="Inventory.DoCreate" - parameter="gloves" /> - </menu_item_call> - <menu_item_call - label="New Undershirt" - layout="topleft" - name="New Undershirt"> - <menu_item_call.on_click - function="Inventory.DoCreate" - parameter="undershirt" /> - </menu_item_call> - <menu_item_call - label="New Underpants" - layout="topleft" - name="New Underpants"> - <menu_item_call.on_click - function="Inventory.DoCreate" - parameter="underpants" /> - </menu_item_call> - <menu_item_call - label="New Alpha" - layout="topleft" - name="New Alpha"> - <menu_item_call.on_click - function="Inventory.DoCreate" - parameter="alpha" /> - </menu_item_call> - <menu_item_call - label="New Tattoo" - layout="topleft" - name="New Tattoo"> - <menu_item_call.on_click - function="Inventory.DoCreate" - parameter="tattoo" /> - </menu_item_call> - </menu> - <menu - height="85" - label="New Body Parts" - layout="topleft" - left_delta="0" - mouse_opaque="false" - name="New Body Parts" - top_pad="514" - width="118"> - <menu_item_call - label="New Shape" - layout="topleft" - name="New Shape"> - <menu_item_call.on_click - function="Inventory.DoCreate" - parameter="shape" /> - </menu_item_call> - <menu_item_call - label="New Skin" - layout="topleft" - name="New Skin"> - <menu_item_call.on_click - function="Inventory.DoCreate" - parameter="skin" /> - </menu_item_call> - <menu_item_call - label="New Hair" - layout="topleft" - name="New Hair"> - <menu_item_call.on_click - function="Inventory.DoCreate" - parameter="hair" /> - </menu_item_call> - <menu_item_call - label="New Eyes" - layout="topleft" - name="New Eyes"> - <menu_item_call.on_click - function="Inventory.DoCreate" - parameter="eyes" /> - </menu_item_call> - </menu> - </menu> - <menu - height="49" - label="Sort" - layout="topleft" - left="0" - mouse_opaque="false" - name="Sort" - tear_off="true" - top="-113" - width="118"> - <menu_item_check - control_name="Inventory.SortByName" - label="By Name" - layout="topleft" - name="By Name"> - <menu_item_check.on_click - function="Inventory.SetSortBy" - parameter="name" /> - </menu_item_check> - <menu_item_check - control_name="Inventory.SortByDate" - label="By Date" - layout="topleft" - name="By Date"> - <menu_item_check.on_click - function="Inventory.SetSortBy" - parameter="date" /> - </menu_item_check> - <menu_item_separator - layout="topleft" /> - <menu_item_check - control_name="Inventory.FoldersAlwaysByName" - label="Folders Always By Name" - layout="topleft" - name="Folders Always By Name"> - <menu_item_check.on_click - function="Inventory.SetSortBy" - parameter="foldersalwaysbyname" /> - </menu_item_check> - <menu_item_check - control_name="Inventory.SystemFoldersToTop" - label="System Folders To Top" - layout="topleft" - name="System Folders To Top"> - <menu_item_check.on_click - function="Inventory.SetSortBy" - parameter="systemfolderstotop" /> - </menu_item_check> - </menu> - </menu_bar> + left_delta="0" + name="Recent Items" + show_item_link_overlays="true" + width="290" /> + </tab_container> + <layout_stack + animate="false" + background_visible="true" + bevel_style="none" + border_size="0" + follows="left|right|bottom" + height="25" + layout="topleft" + orientation="horizontal" + top_pad="0" + left="10" + name="bottom_panel" + width="307"> + <layout_panel + auto_resize="false" + height="25" + layout="topleft" + name="options_gear_btn_panel" + width="32"> + <button + follows="bottom|left" + tool_tip="Show additional options" + height="25" + image_hover_unselected="Toolbar_Left_Over" + image_overlay="OptionsMenu_Off" + image_selected="Toolbar_Left_Selected" + image_unselected="Toolbar_Left_Off" + layout="topleft" + left="0" + name="options_gear_btn" + top="0" + width="31" /> + </layout_panel> + <layout_panel + auto_resize="false" + height="25" + layout="topleft" + name="add_btn_panel" + width="32"> + <button + follows="bottom|left" + height="25" + image_hover_unselected="Toolbar_Middle_Over" + image_overlay="AddItem_Off" + image_selected="Toolbar_Middle_Selected" + image_unselected="Toolbar_Middle_Off" + layout="topleft" + left="0" + name="add_btn" + tool_tip="Add new item" + top="0" + width="31" /> + </layout_panel> + <layout_panel + auto_resize="true" + height="25" + layout="topleft" + name="dummy_panel" + width="212"> + <icon + follows="bottom|left|right" + height="25" + image_name="Toolbar_Middle_Off" + layout="topleft" + left="0" + top="0" + name="dummy_icon" + width="211" /> + </layout_panel> + <layout_panel + auto_resize="false" + height="25" + layout="topleft" + name="trash_btn_panel" + width="31"> + <dnd_button + follows="bottom|left" + height="25" + image_hover_unselected="Toolbar_Right_Over" + image_overlay="TrashItem_Off" + image_selected="Toolbar_Right_Selected" + image_unselected="Toolbar_Right_Off" + left="0" + layout="topleft" + name="trash_btn" + tool_tip="Remove selected item" + top="0" + width="31"/> + </layout_panel> + </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_me.xml b/indra/newview/skins/default/xui/en/panel_me.xml index a30d80f101..63c522ac69 100644 --- a/indra/newview/skins/default/xui/en/panel_me.xml +++ b/indra/newview/skins/default/xui/en/panel_me.xml @@ -4,7 +4,7 @@ border="false" follows="all" height="570" - label="My Profile!!!!!" + label="My Profile" layout="topleft" left="0" name="panel_me" @@ -26,16 +26,16 @@ </text> --> <tab_container follows="all" - height="570" + height="575" halign="center" layout="topleft" - left="6" + left="5" name="tabs" tab_min_width="95" tab_height="30" tab_position="top" top_pad="10" - width="315"> + width="317"> <panel class="panel_my_profile" filename="panel_my_profile.xml" diff --git a/indra/newview/skins/default/xui/en/panel_media_settings_permissions.xml b/indra/newview/skins/default/xui/en/panel_media_settings_permissions.xml index b5c2371510..c5f44cd049 100644 --- a/indra/newview/skins/default/xui/en/panel_media_settings_permissions.xml +++ b/indra/newview/skins/default/xui/en/panel_media_settings_permissions.xml @@ -42,10 +42,11 @@ <text bottom_delta="-50" + enabled="false" follows="top|left" height="15" left="10" - enabled="false"> + name="owner_label"> Owner </text> @@ -79,10 +80,11 @@ <text bottom_delta="-36" + enabled="false" follows="top|left" height="15" left="10" - enabled="false"> + name="group_label"> Group: </text> @@ -126,10 +128,11 @@ <text bottom_delta="-36" + enabled="false" follows="top|left" height="15" left="10" - enabled="false"> + name="anyone_label"> Anyone </text> diff --git a/indra/newview/skins/default/xui/en/panel_my_profile.xml b/indra/newview/skins/default/xui/en/panel_my_profile.xml index d519569543..841a4f5713 100644 --- a/indra/newview/skins/default/xui/en/panel_my_profile.xml +++ b/indra/newview/skins/default/xui/en/panel_my_profile.xml @@ -60,13 +60,13 @@ left="0" name="profile_scroll" opaque="true" - height="492" + height="488" width="315" top="0"> <panel layout="topleft" follows="left|top|right" - height="492" + height="488" name="scroll_content_panel" top="0" left="0" @@ -117,6 +117,8 @@ layout="topleft" left="107" textbox.max_length="512" + textbox.label="More" + textbox.show_context_menu="true" name="sl_description_edit" top_pad="-3" translate="false" @@ -171,6 +173,8 @@ layout="topleft" left="107" textbox.max_length="512" + textbox.label="More" + textbox.show_context_menu="true" name="fl_description_edit" top_pad="-3" translate="false" @@ -311,6 +315,8 @@ name="sl_groups" top_pad="0" translate="false" + textbox.label="More" + textbox.show_context_menu="true" width="298" expanded_bg_visible="true" expanded_bg_color="DkGray"> @@ -385,24 +391,16 @@ user_resize="false" auto_resize="false" height="28" - width="313"> + width="315"> <button follows="bottom|right" height="23" - left="4" - top="5" + left="6" + top="1" label="Edit Profile" name="edit_profile_btn" tool_tip="Edit your personal information" width="152" /> - <button - follows="bottom|right" - height="23" - label="Edit Appearance" - left_pad="4" - name="edit_appearance_btn" - tool_tip="Create/edit your appearance: physical data, clothes and etc." - width="152" /> </layout_panel> </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml index b2ed51abf3..96c76576c0 100644 --- a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml +++ b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml @@ -44,6 +44,7 @@ direction="down" height="23" image_overlay="Arrow_Left_Off" + image_bottom_pad="1" layout="topleft" left="10" name="back_btn" @@ -55,6 +56,7 @@ direction="down" height="23" image_overlay="Arrow_Right_Off" + image_bottom_pad="1" layout="topleft" left_pad="0" name="forward_btn" @@ -64,6 +66,7 @@ <button follows="left|top" height="23" + image_bottom_pad="1" image_overlay="Home_Off" layout="topleft" left_pad="7" @@ -116,7 +119,7 @@ commit_on_focus_lost="false" follows="right|top" halign="right" - height="22" + height="23" label="Search" layout="topleft" right="-10" @@ -149,7 +152,6 @@ width="590"> <label follows="left|top" - font.style="BOLD" height="15" layout="topleft" left="10" diff --git a/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml index 2b361c0628..55df70eb71 100644 --- a/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml +++ b/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml @@ -7,13 +7,7 @@ left="0" name="chat_bar" top="21" - width="310"> - <string name="min_width"> - 188 - </string> - <string name="max_width"> - 320 - </string> + width="308"> <line_editor border_style="line" border_thickness="1" @@ -22,10 +16,11 @@ label="Click here to chat." layout="topleft" left_delta="3" - text_pad_right="25" left="0" - max_length="512" + max_length="1024" name="chat_box" + text_pad_left="5" + text_pad_right="25" tool_tip="Press Enter to say, Ctrl+Enter to shout" top="2" width="283" /> diff --git a/indra/newview/skins/default/xui/en/panel_nearby_media.xml b/indra/newview/skins/default/xui/en/panel_nearby_media.xml new file mode 100644 index 0000000000..f5a78fc929 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_nearby_media.xml @@ -0,0 +1,408 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + can_resize="true" + can_close="false" + bg_opaque_image="Volume_Background" + bg_alpha_image="Volume_Background" + background_opaque="true" + background_visible="true" + layout="topleft" + width="328" + height="230" + name="nearby_media" + help_topic="nearby_media"> + <string name="media_item_count_format">(%ld media items)</string> + <string name="empty_item_text"><empty></string> + <string name="parcel_media_name">Parcel Streaming Media</string> + <string name="parcel_audio_name">Parcel Streaming Audio</string> + <string name="playing_suffix">(playing)</string> + <panel + bevel_style="in" + background_visible="false" + follows="left|right|top" + top="0" + height="35" + name="minimized_controls" + left="0"> + <button + name="all_nearby_media_disable_btn" + follows="left" + tool_tip="Turn all nearby media off" + left="8" + width="95" + height="22" + label="Stop All"> + <button.commit_callback + function="MediaListCtrl.DisableAll" /> + </button> + <button + name="all_nearby_media_enable_btn" + follows="left" + tool_tip="Turn all nearby media on" + left_pad="4" + width="95" + height="22" + label="Start All"> + <button.commit_callback + function="MediaListCtrl.EnableAll" /> + </button> + <button + name="open_prefs_btn" + image_overlay="Icon_Gear_Foreground" + image_disabled="PushButton_Disabled" + image_disabled_selected="PushButton_Disabled" + image_selected="PushButton_Selected" + image_unselected="PushButton_Off" + hover_glow_amount="0.15" + tool_tip = "Bring up media prefs" + top_delta="0" + left_pad="4" + height="22" + min_width="28" + width="28"> + <button.commit_callback + function="MediaListCtrl.GoMediaPrefs" /> + </button> + <button + name="more_btn" + follows="right" + tool_tip="Advanced Controls" + top_delta="0" + right="-8" + width="66" + height="22" + label="More >>" + label_selected="Less <<"> + <button.commit_callback + function="MediaListCtrl.MoreLess" /> + </button> + <button + name="less_btn" + follows="right" + tool_tip="Advanced Controls" + top_delta="0" + right="-8" + width="66" + height="22" + label="More >>" + label_selected="Less <<"> + <button.commit_callback + function="MediaListCtrl.MoreLess" /> + </button> + </panel> + <panel + name="nearby_media_panel" + bevel_style="in" + border_style="line" + bg_alpha_color="0 0 0 0" + bg_opaque_color="0 0 0 0.3" + follows="left|right|top|bottom" + top_delta="30" + right="-1" + left="0" + height="200"> + <text + type="string" + length="1" + follows="top|left" + font="SansSerif" + left="10" + width="100"> + Nearby Media + </text> + <text + type="string" + length="1" + follows="top|left" + font="SansSerif" + top_pad="15" + left="10" + width="40"> + Show: + </text> + <combo_box + height="23" + left="50" + width="140" + top_delta="-5" + follows="left|top" + name="show_combo"> + <combo_box.item + label="All" + value="0" + name="All" /> + <combo_box.item + label="In this Parcel" + value="2" + name="WithinParcel" /> + <combo_box.item + label="Outside this Parcel" + value="3" + name="OutsideParcel" /> + <combo_box.item + label="On other Avatars" + value="4" + name="OnOthers" /> + </combo_box> + <scroll_list + follows="left|top|bottom|right" + column_padding="0" + height="105" + draw_heading="false" + draw_stripes="true" + bg_stripe_color="0.25 0.25 0.25 0.25" + top_pad="8" + left="10" + right="-10" + name="media_list"> + <scroll_list.columns + type="checkbox" + width="-1" + label="" + name="media_checkbox_ctrl" /> + <scroll_list.columns + sort_column="media_proximity" + width="-1" + label="Proximity" + name="media_proximity" /> + <scroll_list.columns + sort_column="media_visibility" + width="-1" + label="Visible" + name="media_visibility" /> + <scroll_list.columns + sort_column="media_class" + width="-1" + label="Class" + name="media_class" /> + <scroll_list.columns + label="Name" + name="media_name" /> + <scroll_list.columns + sort_column="media_debug" + width="-1" + label="Debug" + name="media_debug" /> + </scroll_list> + <panel + bevel_style="in" + background_visible="false" + follows="left|right|bottom" + top_pad="5" + height="30" + left="10" + right="-10"> + <layout_stack + name="media_controls" + follows="left|right|top" + animate="false" + height="26" + layout="topleft" + top="4" + left="8" + right="-10" + border_size="0" + mouse_opaque="false" + orientation="horizontal"> + <layout_panel + name="stop" + mouse_opaque="false" + auto_resize="false" + user_resize="false" + layout="topleft" + top="0" + height="22" + min_width="22" + width="22"> + <button + name="stop_btn" + follows="top" + image_overlay="Stop_Off" + image_disabled="PushButton_Disabled" + image_disabled_selected="PushButton_Disabled" + image_selected="PushButton_Selected" + image_unselected="PushButton_Off" + hover_glow_amount="0.15" + layout="topleft" + tool_tip="Stop selected media" + top="0" + height="22" + width="22"> + <button.commit_callback + function="SelectedMediaCtrl.Stop" /> + </button> + </layout_panel> + <layout_panel + name="play" + mouse_opaque="false" + auto_resize="false" + user_resize="false" + layout="topleft" + top="0" + height="22" + min_width="22" + width="22"> + <button + name="play_btn" + follows="top" + image_overlay="Play_Off" + image_disabled="PushButton_Disabled" + image_disabled_selected="PushButton_Disabled" + image_selected="PushButton_Selected" + image_unselected="PushButton_Off" + hover_glow_amount="0.15" + layout="topleft" + tool_tip = "Play selected media" + top="0" + height="22" + width="22"> + <button.commit_callback + function="SelectedMediaCtrl.Play" /> + </button> + </layout_panel> + <layout_panel + name="pause" + mouse_opaque="false" + auto_resize="false" + user_resize="false" + layout="topleft" + top="0" + min_width="22" + width="22"> + <button + name="pause_btn" + follows="top" + image_overlay="Pause_Off" + image_disabled="PushButton_Disabled" + image_disabled_selected="PushButton_Disabled" + image_selected="PushButton_Selected" + image_unselected="PushButton_Off" + hover_glow_amount="0.15" + layout="topleft" + top="0" + height="22" + width="22" + tool_tip = "Pause selected media"> + <button.commit_callback + function="SelectedMediaCtrl.Pause" /> + </button> + </layout_panel> + <layout_panel + name="volume_slider_ctrl" + mouse_opaque="false" + auto_resize="true" + user_resize="false" + follows="left|right" + layout="topleft" + top="0" + height="22" + min_width="100" + width="200"> + <slider_bar + name="volume_slider" + follows="left|right|top" + top="0" + height="22" + increment="0.01" + initial_value="0.5" + layout="topleft" + tool_tip="Audio volume for selected media" + width="200"> + <slider_bar.commit_callback + function="SelectedMediaCtrl.Volume" /> + </slider_bar> + </layout_panel> + <layout_panel + name="mute" + mouse_opaque="false" + auto_resize="false" + user_resize="false" + layout="topleft" + top="0" + height="72" + min_width="22" + width="22"> + <button + name="mute_btn" + follows="top" + image_disabled="PushButton_Disabled" + image_disabled_selected="PushButton_Disabled" + image_selected="AudioMute_Off" + image_unselected="Audio_Off" + hover_glow_amount="0.15" + is_toggle="true" + layout="topleft" + scale_image="false" + tool_tip="Mute audio on selected media" + top="0" + height="20" + width="22" > + <button.commit_callback + function="SelectedMediaCtrl.Mute" /> + </button> + </layout_panel> + <layout_panel + name="zoom" + mouse_opaque="false" + auto_resize="false" + user_resize="false" + layout="topleft" + top="0" + height="28" + min_width="22" + width="22"> + <button + name="zoom_btn" + follows="top" + image_overlay="Zoom_Off" + image_disabled="PushButton_Disabled" + image_disabled_selected="PushButton_Disabled" + image_selected="PushButton_Selected" + image_unselected="PushButton_Off" + hover_glow_amount="0.15" + top="0" + height="22" + layout="topleft" + tool_tip="Zoom into selected media" + width="22"> + <button.commit_callback + function="SelectedMediaCtrl.Zoom" /> + </button> + </layout_panel> + <layout_panel + name="unzoom" + mouse_opaque="false" + auto_resize="false" + user_resize="false" + layout="topleft" + top="0" + min_width="21" + width="21" > + <button + name="unzoom_btn" + follows="top" + image_overlay="UnZoom_Off" + image_disabled="PushButton_Disabled" + image_disabled_selected="PushButton_Disabled" + image_selected="PushButton_Selected" + image_unselected="PushButton_Off" + hover_glow_amount="0.15" + top="0" + height="22" + layout="topleft" + tool_tip ="Zoom back from selected media" + top_delta="-4" + width="21" > + <button.commit_callback + function="SelectedMediaCtrl.Unzoom" /> + </button> + </layout_panel> + <layout_panel + name="right_bookend" + width="0" + mouse_opaque="false" + user_resize="false" /> + </layout_stack> + </panel> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_notes.xml b/indra/newview/skins/default/xui/en/panel_notes.xml index ac100a2c06..cff7b51ce8 100644 --- a/indra/newview/skins/default/xui/en/panel_notes.xml +++ b/indra/newview/skins/default/xui/en/panel_notes.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel follows="all" - height="540" + height="533" label="Notes & Privacy" layout="topleft" left="0" @@ -25,7 +25,7 @@ layout="topleft" top="0" left="0" - height="475" + height="450" width="313"> <scroll_container color="DkGray2" @@ -34,7 +34,7 @@ left="0" name="profile_scroll" opaque="true" - height="475" + height="450" width="313" top="0"> <panel @@ -46,35 +46,35 @@ width="303"> <text follows="left|top" - font="SansSerifBold" + font.style="BOLD" height="16" layout="topleft" - left="10" + left="11" name="status_message" text_color="white" - top="20" + top="10" value="My private notes:" width="293" /> <text_editor follows="left|top" height="120" layout="topleft" - left="10" + left="12" max_length="1000" name="notes_edit" text_color="DkGray" - top_pad="10" - width="280" + top_pad="3" + width="288" word_wrap="true" /> <text follows="left|top" - font="SansSerifBold" + font.style="BOLD" height="16" layout="topleft" - left="10" + left="11" name="status_message2" text_color="white" - top_pad="30" + top_pad="20" value="Allow this person to:" width="293" /> <check_box @@ -82,7 +82,7 @@ height="16" label="See my online status" layout="topleft" - left="20" + left="10" name="status_check" width="293" /> <check_box @@ -90,7 +90,7 @@ height="16" label="See me on the map" layout="topleft" - left="20" + left="10" name="map_check" width="293" /> <check_box @@ -98,7 +98,7 @@ height="16" label="Edit, delete or take my objects" layout="topleft" - left="20" + left="10" name="objects_check" width="293" /> </panel> @@ -117,7 +117,7 @@ height="23" label="Add Friend" layout="topleft" - left="0" + left="2" mouse_opaque="false" name="add_friend" tool_tip="Offer friendship to the Resident" @@ -142,7 +142,7 @@ tool_tip="Call this Resident" left_pad="3" top="5" - width="45" /> + width="46" /> <button enabled="false" follows="bottom|left" diff --git a/indra/newview/skins/default/xui/en/panel_notification.xml b/indra/newview/skins/default/xui/en/panel_notification.xml index 145a24b642..34738745eb 100644 --- a/indra/newview/skins/default/xui/en/panel_notification.xml +++ b/indra/newview/skins/default/xui/en/panel_notification.xml @@ -3,8 +3,8 @@ background_opaque="false" border_visible="false" background_visible="true" - bg_alpha_color="0.3 0.3 0.3 0" - bg_opaque_color="0.3 0.3 0.3 0" + bg_alpha_color="1 0.3 0.3 0" + bg_opaque_color="1 0.3 0.3 0" label="notification_panel" layout="topleft" left="0" @@ -83,12 +83,16 @@ <panel background_visible="false" follows="left|right|bottom" - height="40" + height="30" + width="290" label="control_panel" layout="topleft" - left="0" - left_delta="-38" + left="10" name="control_panel" - top_pad="0"> + top_pad="5"> + <!-- + Notes: + This panel holds buttons of notification. Change of its size can affect the layout of buttons. + --> </panel> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_notifications_channel.xml b/indra/newview/skins/default/xui/en/panel_notifications_channel.xml index 16593751f7..3143b0a40c 100644 --- a/indra/newview/skins/default/xui/en/panel_notifications_channel.xml +++ b/indra/newview/skins/default/xui/en/panel_notifications_channel.xml @@ -23,7 +23,7 @@ name="notifications_list" sort_ascending="false" sort_column="2" - top="-78" + top="0" user_resize="true" width="100"> <scroll_list.columns @@ -48,7 +48,7 @@ name="notification_rejects_list" sort_ascending="false" sort_column="2" - top="-78" + top="0" user_resize="true" width="100"> <scroll_list.columns diff --git a/indra/newview/skins/default/xui/en/panel_online_status.xml b/indra/newview/skins/default/xui/en/panel_online_status.xml new file mode 100644 index 0000000000..14cb5fffee --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_online_status.xml @@ -0,0 +1,35 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + background_visible="false" + height="152" + label="friend_online_status" + layout="topleft" + left="0" + name="friend_online_status" + top="0" + width="305"> + <avatar_icon + follows="top|left" + height="18" + image_name="Generic_Person" + layout="topleft" + left="3" + mouse_opaque="false" + name="avatar_icon" + top="10" + width="18" /> + <text + font="SansSerifSmall" + follows="all" + height="137" + layout="topleft" + left_pad="5" + name="message" + text_color="white" + top="15" + use_ellipses="true" + value="" + width="285" + word_wrap="true" + max_length="350" /> +</panel>
\ No newline at end of file diff --git a/indra/newview/skins/default/xui/en/panel_online_status_toast.xml b/indra/newview/skins/default/xui/en/panel_online_status_toast.xml new file mode 100644 index 0000000000..b1a7697e83 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_online_status_toast.xml @@ -0,0 +1,35 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + background_visible="false" + height="40" + label="friend_online_status" + layout="topleft" + left="0" + name="friend_online_status" + top="0" + width="220"> + <avatar_icon + follows="top|left" + height="18" + image_name="Generic_Person" + layout="topleft" + left="3" + mouse_opaque="false" + name="avatar_icon" + top="10" + width="18" /> + <text + font="SansSerifSmall" + follows="all" + height="13" + layout="topleft" + left_pad="5" + name="message" + text_color="white" + top="15" + use_ellipses="true" + value="" + width="189" + word_wrap="true" + max_length="350" /> +</panel>
\ No newline at end of file diff --git a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml new file mode 100644 index 0000000000..1ed73e6c15 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml @@ -0,0 +1,520 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<!-- Side tray Outfit Edit panel --> +<panel + background_visible="true" + border="false" + height="600" + follows="all" + layout="topleft" + help_topic="edit_outfit" + left="0" + min_height="350" + name="outfit_edit" + top="0" + width="320"> + <string + name="No Outfit" + value="No Outfit"/> + <string + name="unsaved_changes" + value="Unsaved Changes"/> + <string + name="now_editing" + value="Now Editing"/> + <string + name="folder_view_off" + value="Hierarchy_View_Disabled" + translate="false"/> + <string + name="folder_view_on" + value="Hierarchy_View_On" + translate="false"/> + <string + name="list_view_off" + value="List_View_Disabled" + translate="false"/> + <string + name="list_view_on" + value="List_View_On" + translate="false"/> + + <panel.string + name="not_available"> + (N\A) + </panel.string> + <panel.string + name="unknown"> + (unknown) + </panel.string> + + <!-- Wearables filtering strings --> + <string name="Filter.All" value="All"/> + <string name="Filter.Clothes/Body" value="Clothes/Body"/> + <string name="Filter.Objects" value="Objects"/> + <string name="Filter.Clothing" value="Clothing"/> + <string name="Filter.Bodyparts" value="Body parts"/> + + + <button + follows="top|left" + height="24" + image_hover_unselected="BackButton_Over" + image_pressed="BackButton_Press" + image_unselected="BackButton_Off" + layout="topleft" + name="back_btn" + left="5" + tab_stop="false" + top="1" + width="30" /> + <text + follows="top|right" + font="SansSerifHugeBold" + height="26" + layout="topleft" + left_pad="10" + name="title" + text_color="LtGray" + top="0" + value="Edit Outfit" + use_ellipses="true" + width="275" /> + +<!-- "HEADER WITH ICON, STATUS TEXT AND OUTFIT NAME" --> + <panel + background_visible="true" + bg_alpha_color="DkGray2" + bevel_style="none" + follows="top|left|right" + height="40" + layout="topleft" + left="6" + name="header_panel" + top_pad="5" + width="311"> + <icon + follows="left|top" + height="31" + image_name="Shirt_Large" + left="2" + mouse_opaque="false" + name="outfit_icon" + top="2" + scale_image="true" + visible="true" + width="31" /> + <panel + bevel_style="none" + follows="top|right" + height="37" + layout="topleft" + left_pad="5" + name="outfit_name_and_status" + top="2" + width="270"> + <text + follows="top|left|right" + font="SansSerifSmallBold" + height="13" + layout="topleft" + name="status" + text_color="EmphasisColor" + top="2" + value="Now editing..." + use_ellipses="true" + width="245" /> + <text + follows="bottom|left|right" + font="SansSerifLargeBold" + height="18" + layout="topleft" + name="curr_outfit_name" + text_color="LtGray" + top_pad="2" + value="[Current Outfit]" + use_ellipses="true" + width="245" /> + <loading_indicator + follows="right|top" + height="24" + layout="topleft" + right="-2" + name="edit_outfit_loading_indicator" + top="6" + width="24" /> + </panel> + </panel> + + +<!-- LIST OF WEARABLES (CURRENT OUTFIT/ WEARABLES TO ADD) --> +<!-- *NOTE: border_size is used to calculate space between layout panels and also to calculate resize bar's height. +Required height for dragbar (icon in spec) is 10, so resizebar height should be 10 px. +It is calculated as border_size + 2*UIResizeBarOverlap +--> + <layout_stack + animate="true" + border_size="8" + clip="false" + default_tab_group="2" + follows="all" + height="465" + width="313" + layout="topleft" + orientation="vertical" + name="im_panels" + tab_group="1" + top_pad="5" + left="5"> + <layout_panel + layout="topleft" + height="187" + min_height="100" + name="outfit_wearables_panel" + width="313" + auto_resize="true" + user_resize="true"> + + <layout_stack + animate="true" + border_size="0" + follows="all" + height="185" + width="313" + layout="topleft" + name="filter_panels" + top="0" + left="0"> + <layout_panel + auto_resize="true" + background_visible="true" + bg_alpha_color="DkGray2" + layout="topleft" + height="154" + name="add_button_and_combobox" + width="311" + user_resize="false" + visible="true"> + + <!-- List containing items from the COF and Base outfit --> + <panel + background_visible="false" + class="cof_wearables" + filename="panel_cof_wearables.xml" + follows="all" + height="129" + layout="topleft" + left="1" + name="cof_wearables_list" + top="0" + width="311" /> + + <button + follows="left|bottom" + height="22" + image_pressed="PushButton_Press" + image_pressed_selected="PushButton_Selected_Press" + image_selected="PushButton_Selected_Press" + is_toggle="true" + label="Add More..." + layout="topleft" + left="2" + name="show_add_wearables_btn" + top_pad="2" + tool_tip="Open/Close" + width="125" /> + + <combo_box + follows="left|right|bottom" + height="22" + layout="topleft" + left_pad="5" + name="list_view_filter_combobox" + top_delta="0" + visible="false" + width="152"/> + <combo_box + follows="left|right|bottom" + height="22" + layout="topleft" + left_delta="0" + name="folder_view_filter_combobox" + top_delta="0" + visible="false" + width="152"/> + + <button + follows="bottom|right" + height="22" + image_overlay="Search_Icon" + image_pressed="PushButton_Press" + image_pressed_selected="PushButton_Selected_Press" + image_selected="PushButton_Selected_Press" + is_toggle="true" + layout="topleft" + name="filter_button" + right="-5" + top_delta="0" + visible="false" + width="20" /> + </layout_panel> + + <layout_panel + auto_resize="false" + background_visible="true" + bg_alpha_color="DkGray2" + height="30" + name="filter_panel" + width="311" + visible="false" + user_resize="false"> + + <filter_editor + background_image="TextField_Search_Off" + enabled="true" + follows="left|right|top" + label="Filter Inventory Wearables" + layout="topleft" + left="5" + width="290" + height="25" + name="look_item_filter" + search_button_visible="true" + text_color="black" + visible="true"/> + + </layout_panel> + </layout_stack> + </layout_panel> + + + <layout_panel + background_visible="true" + bg_alpha_color="DkGray2" + auto_resize="true" + default_tab_group="3" + height="450" + min_height="210" + name="add_wearables_panel" + width="313" + tab_group="2" + user_resize="true" + visible="false"> + + <!-- this icon represent dragbar between layout panels. + This is a workaround implemented in EXT-7255 becouse of an issue with layout stack (EXT-7471) --> + <icon + follows="left|top|right" + height="10" + image_name="Dragbar" + left="0" + top_pad="-9" + width="313" /> + + <inventory_panel + allow_multi_select="true" + background_visible="false" + border="false" + follows="left|top|right|bottom" + height="442" + layout="topleft" + left="0" + mouse_opaque="false" + name="folder_view" + top_pad="5" + width="310" + visible="false"/> + <panel + name="filtered_wearables_panel" + background_opaque="true" + background_visible="false" + layout="topleft" + follows="left|top|right|bottom" + border="false" + height="449" + left="0" + mouse_opaque="false" + width="310" + top_delta="0" + visible="true"> + <wearable_items_list + color="0.107 0.107 0.107 1" + name="list_view" + allow_select="true" + layout="topleft" + follows="all" + multi_select="true" + width="310" + height="449" + left="0" + top="0"/> + </panel> + + </layout_panel> + </layout_stack> + + + <!-- BUTTON BAR --> + <panel + background_visible="true" + bevel_style="none" + follows="bottom|left|right" + height="27" + layout="topleft" + left="5" + name="no_add_wearables_button_bar" + top_pad="0" + width="313"> + <button + follows="bottom|left" + height="25" + image_hover_unselected="Toolbar_Left_Over" + image_overlay="OptionsMenu_Off" + image_selected="Toolbar_Left_Selected" + image_unselected="Toolbar_Left_Off" + layout="topleft" + left="0" + name="gear_menu_btn" + top="1" + width="31" /> + <icon + follows="bottom|left|right" + height="25" + image_name="Toolbar_Right_Off" + layout="topleft" + left_pad="1" + name="dummy_right_icon" + width="246" /> + <button + follows="bottom|right" + height="25" + image_hover_unselected="Toolbar_Middle_Over" + image_overlay="AddItem_Off" + image_selected="Toolbar_Middle_Selected" + image_unselected="Toolbar_Middle_Off" + layout="topleft" + left_pad="0" + name="shop_btn" + top="1" + width="31" /> + </panel> + + + <!-- BUTTON BAR - WEARABLES ADDING MODE --> + <panel + background_visible="true" + bevel_style="none" + follows="left|right|bottom" + height="27" + layout="topleft" + left="5" + name="add_wearables_button_bar" + top_delta="0" + visible="false" + width="313"> + <button + follows="bottom|left" + height="25" + image_hover_unselected="Toolbar_Left_Over" + image_overlay="OptionsMenu_Off" + image_selected="Toolbar_Left_Selected" + image_unselected="Toolbar_Left_Off" + layout="topleft" + left="0" + name="wearables_gear_menu_btn" + top="1" + width="31" /> + <button + follows="bottom|left" + height="25" + image_hover_unselected="Toolbar_Middle_Over" + image_overlay="Hierarchy_View_Disabled" + image_selected="Toolbar_Middle_Selected" + image_unselected="Toolbar_Middle_Off" + is_toggle="true" + layout="topleft" + left_pad="1" + name="folder_view_btn" + top="1" + width="31" /> + <button + follows="bottom|left" + height="25" + image_hover_unselected="Toolbar_Middle_Over" + image_overlay="List_View_On" + image_selected="Toolbar_Middle_Selected" + image_unselected="Toolbar_Middle_Off" + is_toggle="true" + layout="topleft" + left_pad="1" + name="list_view_btn" + top="1" + width="31" /> + <button + follows="bottom|left" + height="25" + image_hover_unselected="Toolbar_Middle_Over" + image_overlay="AddItem_Off" + image_selected="Toolbar_Middle_Selected" + image_unselected="Toolbar_Middle_Off" + label="" + layout="topleft" + left_pad="1" + name="add_to_outfit_btn" + top="1" + width="31" /> + <icon + follows="bottom|left|right" + height="25" + image_name="Toolbar_Right_Off" + layout="topleft" + left_pad="1" + name="dummy_right_icon" + width="184" > + </icon> + </panel> + + <!-- SAVE AND REVERT BUTTONS --> + <panel + follows="left|right|bottom" + height="30" + layout="topleft" + left="4" + top_pad="2" + name="save_revert_button_bar" + width="300"> + <button + follows="bottom|left" + height="23" + label="Save" + left="0" + layout="topleft" + name="save_btn" + top="0" + width="155" /> + <button + follows="bottom|left" + height="23" + name="save_flyout_btn" + label="" + layout="topleft" + left_pad="-20" + tab_stop="false" + top="0" + image_selected="SegmentedBtn_Right_Selected_Press" + image_unselected="SegmentedBtn_Right_Off" + image_pressed="SegmentedBtn_Right_Press" + image_pressed_selected="SegmentedBtn_Right_Selected_Press" + image_overlay="Arrow_Small_Up" + width="20"/> + <button + follows="bottom|left|right" + height="23" + left_pad="12" + label="Undo Changes" + layout="topleft" + name="revert_btn" + top="0" + tool_tip="Revert to last saved version" + width="147" /> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml index 710ca733e0..a59070496e 100644 --- a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml +++ b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml @@ -1,8 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel name="Outfits" + bg_alpha_color="DkGray" + bg_opaque_color="DkGray" + background_opaque="true" background_visible="true" follows="all" - height="570" + height="575" label="Things" layout="topleft" min_height="350" @@ -11,29 +14,27 @@ border="false"> <tab_container follows="all" - height="500" + height="509" layout="topleft" - left="10" + left="7" name="appearance_tabs" tab_min_width="140" tab_height="30" tab_position="top" halign="center" - width="313"> - <inventory_panel + top="8" + width="312"> + <panel + class="outfits_list" + filename="panel_outfits_list.xml" + height="490" + name="outfitslist_tab" background_visible="true" - background_opaque="true" - label="MY OUTFITS" help_topic="my_outfits_tab" - allow_multi_select="true" follows="all" - border="false" - left="0" - top="0" - width="314" - mouse_opaque="true" - name="outfitslist_tab" - start_folder="My Outfits" /> + label="MY OUTFITS" + layout="topleft" + width="315" /> <inventory_panel follows="all" background_visible="true" @@ -47,71 +48,86 @@ mouse_opaque="true" name="cof_tab" start_folder="Current Outfit" - width="313" /> + use_label_suffix="true" + width="315" /> </tab_container> - <panel - background_visible="true" - follows="bottom|left" - height="50" + <panel + background_visible="true" + follows="bottom|left|right" + height="57" layout="topleft" - left="0" + left="9" + top_pad="-1" visible="true" name="bottom_panel" - top_pad="10" - width="313"> - <button - follows="bottom|left" - tool_tip="Show additional options" - height="18" - image_disabled="OptionsMenu_Disabled" - image_selected="OptionsMenu_Press" - image_unselected="OptionsMenu_Off" - layout="topleft" - left="10" - name="options_gear_btn" - top="6" - width="18" /> - <dnd_button - follows="bottom|left" - height="18" - image_selected="TrashItem_Press" - image_unselected="TrashItem_Off" - layout="topleft" - right="-5" - name="trash_btn" - tool_tip="Remove selected item" - top="6" - width="18" /> - <button - follows="bottom|left" - height="23" - label="Save Outfit" + width="310"> + <button + follows="bottom|left" + tool_tip="Show additional options" + height="25" + image_hover_unselected="Toolbar_Left_Over" + image_overlay="OptionsMenu_Off" + image_selected="Toolbar_Left_Selected" + image_unselected="Toolbar_Left_Off" + layout="topleft" + left="1" + name="options_gear_btn" + top="1" + width="31" /> + <icon + follows="bottom|left|right" + height="25" + image_name="Toolbar_Middle_Off" layout="topleft" - name="make_outfit_btn" - tool_tip="Save appearance as an outfit" - top="26" - left='10' - width="120" /> + left_pad="1" + name="dummy_icon" + width="241" + /> + + <dnd_button + follows="bottom|right" + height="25" + image_hover_unselected="Toolbar_Right_Over" + image_overlay="TrashItem_Off" + image_selected="Toolbar_Right_Selected" + image_unselected="Toolbar_Right_Off" + layout="topleft" + left_pad="1" + name="trash_btn" + tool_tip="Delete selected outfit" + width="31"/> + <button + follows="bottom|left" + height="23" + label="Save As" + left="0" + layout="topleft" + name="save_btn" + top_pad="6" + width="155" /> + <button + follows="bottom|left" + height="23" + name="save_flyout_btn" + label="" + layout="topleft" + left_pad="-20" + tab_stop="false" + image_selected="SegmentedBtn_Right_Selected_Press" + image_unselected="SegmentedBtn_Right_Off" + image_pressed="SegmentedBtn_Right_Press" + image_pressed_selected="SegmentedBtn_Right_Selected_Press" + image_overlay="Arrow_Small_Up" + width="20"/> <button - follows="bottom|right" + follows="bottom|left|right" height="23" label="Wear" layout="topleft" name="wear_btn" - right="-10" - left_pad="10" - top="26" + left_pad="3" tool_tip="Wear selected outfit" - width="120" /> - <button - follows="bottom|left" - height="23" - label="M" - layout="topleft" - right="-140" - name="look_edit_btn" - top="26" - visible="false" - width="20" /> + width="152" /> </panel> + </panel> diff --git a/indra/newview/skins/default/xui/en/panel_outfits_list.xml b/indra/newview/skins/default/xui/en/panel_outfits_list.xml new file mode 100644 index 0000000000..d0c44c4328 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_outfits_list.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + background_visible="true" + bg_alpha_color="DkGray" + border="false" + follows="all" + height="400" + name="Outfits" + layout="topleft" + left="0" + top="0" + width="313"> + <accordion + background_visible="true" + bg_alpha_color="DkGray2" + bg_opaque_color="DkGray2" + no_matched_tabs_text.value="Didn't find what you're looking for? Try [secondlife:///app/search/all/[SEARCH_TERM] Search]." + no_visible_tabs_text.value="There are no any outfits. Try [secondlife:///app/search/all/ Search]." + follows="all" + height="400" + layout="topleft" + left="3" + name="outfits_accordion" + top="0" + width="307"> + </accordion> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml index 447ac1b123..b79ef1e287 100644 --- a/indra/newview/skins/default/xui/en/panel_people.xml +++ b/indra/newview/skins/default/xui/en/panel_people.xml @@ -1,22 +1,28 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <!-- Side tray panel --> <panel -background_visible="true" + default_tab_group="1" follows="all" - height="575" + height="449" label="People" layout="topleft" + left="0" min_height="350" name="people_panel" top="0" - left="0" width="333"> <string - name="no_people" - value="No people" /> + name="no_recent_people" + value="No recent people. Looking for people to hang out with? Try [secondlife:///app/search/people Search] or the [secondlife:///app/worldmap World Map]." /> + <string + name="no_filtered_recent_people" + value="Didn't find what you're looking for? Try [secondlife:///app/search/people/[SEARCH_TERM] Search]." /> <string name="no_one_near" - value="No one near" /> + value="No one nearby. Looking for people to hang out with? Try [secondlife:///app/search/people Search] or the [secondlife:///app/worldmap World Map]." /> + <string + name="no_one_filtered_near" + value="Didn't find what you're looking for? Try [secondlife:///app/search/people/[SEARCH_TERM] Search]." /> <string name="no_friends_online" value="No friends online" /> @@ -24,37 +30,62 @@ background_visible="true" name="no_friends" value="No friends" /> <string + name="no_friends_msg"> + Find friends using [secondlife:///app/search/people Search] or right-click on a Resident to add them as a friend. +Looking for people to hang out with? Try the [secondlife:///app/worldmap World Map]. + </string> + <string + name="no_filtered_friends_msg"> + Didn't find what you're looking for? Try [secondlife:///app/search/people/[SEARCH_TERM] Search]. + </string> + <string name="people_filter_label" value="Filter People" /> <string name="groups_filter_label" value="Filter Groups" /> + <!-- + *WORKAROUND: for group_list.no_items_msg & group_list.no_filtered_items_msg attributes. + They are not defined as translatable in VLT. See EXT-5931 + --> + <string + name="no_filtered_groups_msg" + value="Didn't find what you're looking for? Try [secondlife:///app/search/groups/[SEARCH_TERM] Search]." /> + <string + name="no_groups_msg" + value="Looking for Groups to join? Try [secondlife:///app/search/groups Search]." /> <filter_editor follows="left|top|right" height="23" layout="topleft" - left="15" + left="10" label="Filter" max_length="300" name="filter_input" text_color="Black" + text_pad_left="10" top="3" width="303" /> <tab_container follows="all" - height="500" + height="383" layout="topleft" - left="6" + left="5" name="tabs" + tab_group="1" tab_min_width="70" tab_height="30" tab_position="top" top_pad="10" halign="center" - width="313"> - <panel + width="317"> + <panel + background_opaque="true" + background_visible="true" + bg_alpha_color="DkGray" + bg_opaque_color="DkGray" follows="all" - height="500" + height="383" label="NEARBY" layout="topleft" left="0" @@ -64,55 +95,73 @@ background_visible="true" width="313"> <avatar_list allow_select="true" + bg_alpha_color="DkGray2" + bg_opaque_color="DkGray2" follows="all" - height="470" + height="356" ignore_online_status="true" layout="topleft" - left="0" + left="3" multi_select="true" name="avatar_list" top="0" - width="313" /> + width="307" /> <panel + background_visible="true" follows="left|right|bottom" - height="30" + height="27" label="bottom_panel" layout="topleft" - left="0" + left="3" name="bottom_panel" + top_pad="0" width="313"> <button follows="bottom|left" - tool_tip="Options" - height="18" - image_disabled="OptionsMenu_Disabled" - image_selected="OptionsMenu_Press" - image_unselected="OptionsMenu_Off" + height="25" + image_hover_unselected="Toolbar_Left_Over" + image_overlay="OptionsMenu_Off" + image_selected="Toolbar_Left_Selected" + image_unselected="Toolbar_Left_Off" layout="topleft" - left="10" + left="0" name="nearby_view_sort_btn" - top="5" - width="18" /> + tool_tip="Options" + top="1" + width="31" /> <button follows="bottom|left" - height="18" - image_selected="AddItem_Press" - image_unselected="AddItem_Off" - image_disabled="AddItem_Disabled" + height="25" + image_hover_unselected="Toolbar_Middle_Over" + image_overlay="AddItem_Off" + image_selected="Toolbar_Middle_Selected" + image_unselected="Toolbar_Middle_Off" layout="topleft" - left_pad="5" + left_pad="1" name="add_friend_btn" - top_delta="0" tool_tip="Add selected Resident to your friends List" - width="18"> + width="31"> <commit_callback function="People.addFriend" /> </button> + <icon + follows="bottom|left" + height="25" + image_name="Toolbar_Right_Off" + layout="topleft" + left_pad="1" + name="dummy_icon" + width="241" + /> </panel> </panel> <panel + background_opaque="true" + background_visible="true" + bg_alpha_color="DkGray" + bg_opaque_color="DkGray" follows="all" - height="500" + height="383" label="MY FRIENDS" layout="topleft" left="0" @@ -121,108 +170,123 @@ background_visible="true" top="0" width="313"> <accordion + background_visible="true" + bg_alpha_color="DkGray2" + bg_opaque_color="DkGray2" follows="all" - height="470" + height="356" layout="topleft" - left="0" + left="3" name="friends_accordion" top="0" - width="313"> + width="307"> <accordion_tab layout="topleft" - height="235" + height="172" min_height="150" name="tab_online" title="Online"> <avatar_list allow_select="true" follows="all" - height="235" + height="172" layout="topleft" left="0" multi_select="true" name="avatars_online" top="0" - width="313" /> + width="307" /> </accordion_tab> <accordion_tab layout="topleft" - height="235" + height="173" name="tab_all" title="All"> <avatar_list allow_select="true" follows="all" - height="235" + height="173" layout="topleft" left="0" multi_select="true" name="avatars_all" top="0" - width="313" /> + width="307" /> </accordion_tab> </accordion> - <text - follows="all" - height="450" - left="10" - name="no_friends_msg" - top="10" - width="293" - wrap="true"> - To add friends try [secondlife:///app/search/people global search] or click on a user to add them as a friend. -If you're looking for people to hang out with, [secondlife:///app/worldmap try the Map]. - </text> <panel + background_visible="true" follows="left|right|bottom" - height="30" + height="27" label="bottom_panel" layout="topleft" - left="0" + left="3" name="bottom_panel" + top_pad="0" width="313"> <button follows="bottom|left" tool_tip="Options" - height="18" - image_disabled="OptionsMenu_Disabled" - image_selected="OptionsMenu_Press" - image_unselected="OptionsMenu_Off" + height="25" + image_hover_unselected="Toolbar_Left_Over" + image_overlay="OptionsMenu_Off" + image_selected="Toolbar_Left_Selected" + image_unselected="Toolbar_Left_Off" layout="topleft" - left="10" + left="0" name="friends_viewsort_btn" - top="5" - width="18" /> + top="1" + width="31" /> <button follows="bottom|left" - height="18" - image_selected="AddItem_Press" - image_unselected="AddItem_Off" - image_disabled="AddItem_Disabled" + height="25" + image_hover_unselected="Toolbar_Middle_Over" + image_overlay="AddItem_Off" + image_selected="Toolbar_Middle_Selected" + image_unselected="Toolbar_Middle_Off" layout="topleft" - left_pad="5" + left_pad="1" name="add_btn" tool_tip="Offer friendship to a Resident" - top_delta="0" - width="18" /> + width="31" /> + <icon + follows="bottom|left" + height="25" + image_name="Toolbar_Middle_Off" + layout="topleft" + left_pad="1" + name="dummy_icon" + width="209" + /> <button follows="bottom|left" - height="18" - image_selected="TrashItem_Press" - image_unselected="TrashItem_Off" - image_disabled="TrashItem_Disabled" + height="25" + image_hover_unselected="Toolbar_Right_Over" + image_overlay="TrashItem_Off" + image_selected="Toolbar_Right_Selected" + image_unselected="Toolbar_Right_Off" layout="topleft" - left_pad="10" - right="-10" + left_pad="1" name="del_btn" tool_tip="Remove selected person from your Friends list" - top_delta="0" - width="18" /> + width="31" /> </panel> + <text + follows="all" + height="450" + left="13" + name="no_friends_help_text" + top="10" + width="293" + wrap="true" /> </panel> <panel + background_opaque="true" + background_visible="true" + bg_alpha_color="DkGray" + bg_opaque_color="DkGray" follows="all" - height="500" + height="383" label="MY GROUPS" layout="topleft" left="0" @@ -230,66 +294,89 @@ If you're looking for people to hang out with, [secondlife:///app/worldmap try t name="groups_panel" top="0" width="313"> + <!-- + *NOTE: no_groups_msg & group_list attributes are not defined as translatable in VLT. See EXT-5931 + Values are set from appropriate strings at the top of file via LLPeoplePanel::postBuild() + --> <group_list + allow_select="true" + background_visible="true" + bg_alpha_color="DkGray2" + bg_opaque_color="DkGray2" follows="all" - height="470" + height="356" layout="topleft" - left="0" + left="3" name="group_list" - no_filtered_groups_msg="No groups" - no_groups_msg="[secondlife:///app/search/groups Trying searching for some groups to join.]" + no_filtered_groups_msg="[secondlife:///app/search/groups Try finding the group in search?]" + no_groups_msg="[secondlife:///app/search/groups Try searching for some groups to join.]" top="0" - width="313" /> + width="307" /> <panel - top_pad="0" + background_visible="true" follows="left|right|bottom" - height="30" + height="27" label="bottom_panel" layout="topleft" left="0" name="bottom_panel" + top_pad="0" width="313"> <button follows="bottom|left" tool_tip="Options" - height="18" - image_disabled="OptionsMenu_Disabled" - image_selected="OptionsMenu_Press" - image_unselected="OptionsMenu_Off" + height="25" + image_hover_unselected="Toolbar_Left_Over" + image_overlay="OptionsMenu_Off" + image_selected="Toolbar_Left_Selected" + image_unselected="Toolbar_Left_Off" layout="topleft" - left="10" + left="3" name="groups_viewsort_btn" - top="7" - width="18" /> + top="1" + width="31" /> <button follows="bottom|left" - height="18" - image_selected="AddItem_Press" - image_unselected="AddItem_Off" - image_disabled="AddItem_Disabled" + height="25" + image_hover_unselected="Toolbar_Middle_Over" + image_overlay="AddItem_Off" + image_selected="Toolbar_Middle_Selected" + image_unselected="Toolbar_Middle_Off" layout="topleft" - left_pad="5" + left_pad="1" name="plus_btn" tool_tip="Join group/Create new group" - top_delta="0" - width="18" /> + width="31" /> <button follows="bottom|left" - height="10" - image_hover_selected="Activate_Checkmark" - image_selected="Activate_Checkmark" - image_unselected="Activate_Checkmark" + height="25" + image_hover_unselected="Toolbar_Middle_Over" + image_overlay="Activate_Checkmark" + image_selected="Toolbar_Middle_Selected" + image_unselected="Toolbar_Middle_Off" layout="topleft" - left_pad="24" + left_pad="1" name="activate_btn" tool_tip="Activate selected group" - top_delta="5" - width="10" /> + width="31" /> + <icon + follows="bottom|left" + height="25" + image_name="Toolbar_Right_Off" + layout="topleft" + left_pad="1" + name="dummy_icon" + width="209" + /> </panel> </panel> <panel + background_opaque="true" + background_visible="true" + bg_alpha_color="DkGray" + bg_opaque_color="DkGray" follows="all" - height="500" + height="383" label="RECENT" layout="topleft" left="0" @@ -299,139 +386,148 @@ If you're looking for people to hang out with, [secondlife:///app/worldmap try t width="313"> <avatar_list allow_select="true" + background_visible="true" + bg_alpha_color="DkGray2" + bg_opaque_color="DkGray2" follows="all" - height="470" + height="356" layout="topleft" - left="0" + left="3" multi_select="true" name="avatar_list" show_last_interaction_time="true" top="0" - width="313" /> + width="307" /> <panel - top_pad="0" + background_visible="true" follows="left|right|bottom" - height="30" + height="27" label="bottom_panel" layout="topleft" left="0" name="bottom_panel" + top_pad="0" width="313"> <button follows="bottom|left" tool_tip="Options" - height="18" - image_disabled="OptionsMenu_Disabled" - image_selected="OptionsMenu_Press" - image_unselected="OptionsMenu_Off" + height="25" + image_hover_unselected="Toolbar_Left_Over" + image_overlay="OptionsMenu_Off" + image_selected="Toolbar_Left_Selected" + image_unselected="Toolbar_Left_Off" layout="topleft" - left="10" + left="3" name="recent_viewsort_btn" - top="7" - width="18" /> + top="1" + width="31" /> <button follows="bottom|left" - height="18" - image_selected="AddItem_Press" - image_unselected="AddItem_Off" - image_disabled="AddItem_Disabled" + height="25" + image_hover_unselected="Toolbar_Middle_Over" + image_overlay="AddItem_Off" + image_selected="Toolbar_Middle_Selected" + image_unselected="Toolbar_Middle_Off" layout="topleft" - left_pad="5" + left_pad="1" name="add_friend_btn" - top_delta="0" tool_tip="Add selected Resident to your friends List" - width="18"> + width="31"> <commit_callback function="People.addFriend" /> </button> + <icon + follows="bottom|left" + height="25" + image_name="Toolbar_Right_Off" + layout="topleft" + left_pad="1" + name="dummy_icon" + width="241" + /> </panel> </panel> </tab_container> <panel follows="bottom|left" - height="35" + height="23" layout="topleft" - left="10" + left="8" + top_pad="4" name="button_bar" width="313"> <button follows="bottom|left" - top="4" - left="0" height="23" label="Profile" layout="topleft" name="view_profile_btn" tool_tip="Show picture, groups, and other Residents information" - width="70" /> + top="0" + width="67" /> <button follows="bottom|left" - top="4" - left_pad="2" + left_pad="3" height="23" label="IM" layout="topleft" name="im_btn" tool_tip="Open instant message session" - width="45" /> + width="40" /> <button follows="bottom|left" - top="4" - left_pad="2" + left_pad="3" height="23" label="Call" layout="topleft" name="call_btn" tool_tip="Call this Resident" - width="50" /> + width="51" /> <button - follows="left|top" - top="4" - left_pad="2" + follows="bottom|left" + left_pad="3" height="23" label="Share" layout="topleft" name="share_btn" - width="60" /> + tool_tip="Share an inventory item" + width="65" /> <button follows="bottom|left" - top="4" - left_pad="2" + left_pad="3" height="23" label="Teleport" layout="topleft" name="teleport_btn" tool_tip="Offer teleport" - width="75" /> + width="76" /> <button follows="bottom|left" - top="4" left="0" + top_delta="0" height="23" label="Group Profile" layout="topleft" name="group_info_btn" tool_tip="Show group information" - width="102" /> + width="107" /> <button follows="bottom|left" - top="4" - left_pad="2" + left_pad="3" height="23" label="Group Chat" layout="topleft" name="chat_btn" tool_tip="Open chat session" - width="102" /> + width="100" /> <button follows="bottom|left" - top="4" - left_pad="2" + left_pad="3" height="23" label="Group Call" layout="topleft" name="group_call_btn" tool_tip="Call this group" - width="102" /> + width="95" /> </panel> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_pick_info.xml b/indra/newview/skins/default/xui/en/panel_pick_info.xml index 375f369ba7..1d01bcb8a5 100644 --- a/indra/newview/skins/default/xui/en/panel_pick_info.xml +++ b/indra/newview/skins/default/xui/en/panel_pick_info.xml @@ -12,23 +12,25 @@ width="333"> <button follows="top|right" - height="23" - image_overlay="BackArrow_Off" + height="24" + image_hover_unselected="BackButton_Over" + image_pressed="BackButton_Press" + image_unselected="BackButton_Off" layout="topleft" name="back_btn" left="10" tab_stop="false" top="2" - width="23" /> + width="30" /> <text follows="top|left|right" font="SansSerifHugeBold" height="26" layout="topleft" - left_pad="10" + left_pad="4" name="title" - text_color="white" - top="0" + text_color="LtGray" + top="2" value="Pick Info" use_ellipses="true" width="275" /> @@ -36,12 +38,12 @@ color="DkGray2" opaque="true" follows="all" - height="500" + height="503" layout="topleft" - left="10" - top_pad="5" + left="8" + top_pad="10" name="profile_scroll" - width="313"> + width="312"> <panel name="scroll_content_panel" follows="left|top|right" @@ -57,10 +59,10 @@ follows="left|top|right" height="197" layout="topleft" - left="10" + left="11" name="pick_snapshot" - top="20" - width="280" /> + top="10" + width="272" /> <text_editor allow_scroll="false" bg_visible="false" @@ -115,8 +117,8 @@ follows="left|right|bottom" height="35" layout="topleft" - top_pad="8" - left="10" + top_pad="5" + left="8" name="buttons"> <button follows="bottom|left" @@ -126,24 +128,22 @@ left="0" name="teleport_btn" top="0" - width="90" /> + width="101" /> <button follows="bottom|left" height="23" label="Map" layout="topleft" - left_pad="10" + left_pad="3" name="show_on_map_btn" - top="0" - width="90" /> + width="100" /> <button follows="bottom|left" height="23" label="Edit" layout="topleft" - right="-1" name="edit_btn" - top="0" - width="90" /> + left_pad="3" + width="101" /> </panel> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_pick_list_item.xml b/indra/newview/skins/default/xui/en/panel_pick_list_item.xml index e62c1278f9..41651edaa0 100644 --- a/indra/newview/skins/default/xui/en/panel_pick_list_item.xml +++ b/indra/newview/skins/default/xui/en/panel_pick_list_item.xml @@ -64,7 +64,9 @@ layout="topleft" left="103" name="picture_descr" - textbox.mouse_opaque="false" + textbox.max_length="1024" + textbox.label="More" + textbox.show_context_menu="false" top_pad="0" width="178" word_wrap="true" /> @@ -76,6 +78,6 @@ left_pad="5" right="-8" name="info_chevron" - top_delta="15" + top_delta="24" width="20" /> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_picks.xml b/indra/newview/skins/default/xui/en/panel_picks.xml index d31f4d039f..0093a08e15 100644 --- a/indra/newview/skins/default/xui/en/panel_picks.xml +++ b/indra/newview/skins/default/xui/en/panel_picks.xml @@ -1,7 +1,10 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel +bg_opaque_color="DkGray2" + background_visible="true" + background_opaque="true" follows="all" - height="540" + height="548" label="Picks" layout="topleft" left="0" @@ -21,12 +24,13 @@ layout="topleft" left="6" name="picks_panel_text" + wrap="true" top="10" width="313"/> <accordion fit_parent="true" follows="all" - height="465" + height="470" layout="topleft" left="0" name="accordion" @@ -70,17 +74,19 @@ </accordion_tab> </accordion> <panel - background_visible="true" +bg_opaque_color="DkGray2" + background_visible="true" + background_opaque="true" bevel_style="none" enabled="false" auto_resize="false" follows="bottom" - left="0" - height="18" + left="1" + height="27" label="bottom_panel" layout="topleft" name="edit_panel" - top_pad="0" + top_pad="-2" width="313"> <button enabled="false" @@ -90,9 +96,9 @@ image_unselected="OptionsMenu_Off" image_disabled="OptionsMenu_Disabled" layout="topleft" - left="0" + left="10" name="gear_menu_btn" - top="5" + top="9" width="18" /> <button follows="bottom|left" @@ -104,7 +110,7 @@ left_pad="15" name="new_btn" tool_tip="Create a new pick or classified at the current location" - top="5" + top="9" width="18" /> <button follows="bottom|right" @@ -115,14 +121,17 @@ layout="topleft" name="trash_btn" right="-10" - top="5" + top="9" width="18" /> </panel> <panel + bg_opaque_color="DkGray" + background_visible="true" + background_opaque="true" layout="topleft" left="0" - height="30" - top_pad="10" + height="40" + top="502" name="buttons_cucks" width="313"> <button @@ -131,35 +140,33 @@ height="23" label="Info" layout="topleft" - left="5" + left="2" name="info_btn" tab_stop="false" tool_tip="Show pick information" - top="0" - width="55" /> + top="5" + width="95" /> <button enabled="false" follows="bottom|left" height="23" label="Teleport" layout="topleft" - left_pad="5" + left_pad="3" name="teleport_btn" tab_stop="false" tool_tip="Teleport to the corresponding area" - top="0" - width="77" /> + width="117" /> <button enabled="false" follows="bottom|left" height="23" label="Map" layout="topleft" - left_pad="5" + left_pad="3" name="show_on_map_btn" tab_stop="false" tool_tip="Show the corresponding area on the World Map" - top="0" - width="50" /> + width="90" /> </panel> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_place_profile.xml b/indra/newview/skins/default/xui/en/panel_place_profile.xml index 94c9b2de01..55e0184282 100644 --- a/indra/newview/skins/default/xui/en/panel_place_profile.xml +++ b/indra/newview/skins/default/xui/en/panel_place_profile.xml @@ -2,13 +2,13 @@ <panel background_visible="true" follows="all" - height="570" + height="610" layout="topleft" left="0" min_height="350" name="place_profile" top="20" - width="330"> + width="333"> <string name="on" value="On" /> @@ -95,60 +95,77 @@ <!-- Texture names for parcel permissions icons --> <string name="icon_PG" + translate="false" value="Parcel_PG_Dark" /> <string name="icon_M" + translate="false" value="Parcel_M_Dark" /> <string name="icon_R" + translate="false" value="Parcel_R_Dark" /> <string name="icon_Voice" + translate="false" value="Parcel_Voice_Dark" /> <string name="icon_VoiceNo" + translate="false" value="Parcel_VoiceNo_Dark" /> <string name="icon_Fly" + translate="false" value="Parcel_Fly_Dark" /> <string name="icon_FlyNo" + translate="false" value="Parcel_FlyNo_Dark" /> <string name="icon_Push" + translate="false" value="Parcel_Push_Dark" /> <string name="icon_PushNo" + translate="false" value="Parcel_PushNo_Dark" /> <string name="icon_Build" + translate="false" value="Parcel_Build_Dark" /> <string name="icon_BuildNo" + translate="false" value="Parcel_BuildNo_Dark" /> <string name="icon_Scripts" + translate="false" value="Parcel_Scripts_Dark" /> <string name="icon_ScriptsNo" + translate="false" value="Parcel_ScriptsNo_Dark" /> <string name="icon_Damage" + translate="false" value="Parcel_Damage_Dark" /> <string name="icon_DamageNo" + translate="false" value="Parcel_DamageNo_Dark" /> <button follows="top|right" - height="23" - image_overlay="BackArrow_Off" + height="24" + image_hover_unselected="BackButton_Over" + image_pressed="BackButton_Press" + image_unselected="BackButton_Off" layout="topleft" - left="10" + left="8" name="back_btn" tool_tip="Back" tab_stop="false" - top="0" - width="23" /> + top="4" + width="30" /> <text follows="top|left|right" font="SansSerifHugeBold" @@ -157,36 +174,36 @@ left_pad="10" name="title" text_color="LtGray" - top="0" + top="4" use_ellipses="true" value="Place Profile" - width="275" /> + width="280" /> <scroll_container color="DkGray2" follows="all" - height="533" + height="572" layout="topleft" - left="10" + left="9" name="place_scroll" opaque="true" - top_pad="5" - width="313"> + top_pad="10" + width="310"> <panel bg_alpha_color="DkGray2" follows="left|top|right" - height="533" + height="580" layout="topleft" left="0" min_height="300" name="scrolling_panel" top="0" - width="313"> + width="310"> <texture_picker enabled="false" - follows="top|left" - height="190" + follows="left|top|right" + height="197" layout="topleft" - left="10" + left="11" name="logo" top="10" width="290" /> @@ -275,6 +292,7 @@ layout="topleft" left="5" name="description" + textbox.label="More" top_pad="10" value="Du waltz die spritz" width="300" /> @@ -317,22 +335,27 @@ value="unknown" width="268" /> <accordion + fit_parent="true" follows="all" - height="230" + height="268" layout="topleft" + single_expansion="true" left="0" name="advanced_info_accordion" - top_pad="10" + top_pad="5" width="313"> <accordion_tab + fit_panel="false" + height="175" layout="topleft" name="parcel_characteristics_tab" title="Parcel"> <panel follows="all" - height="160" + height="175" layout="topleft" left="0" + name="parcel_characteristics_panel" top="0" width="275"> <icon @@ -351,7 +374,7 @@ left_pad="12" name="rating_label" value="Rating:" - width="60" /> + width="90" /> <text follows="left|right|top" height="16" @@ -378,7 +401,7 @@ name="voice_label" top_delta="0" value="Voice:" - width="60" /> + width="90" /> <text follows="left|right|top" height="18" @@ -404,7 +427,7 @@ left_pad="8" name="fly_label" value="Fly:" - width="60" /> + width="90" /> <text follows="left|right|top" height="16" @@ -430,7 +453,7 @@ left_pad="8" name="push_label" value="Push:" - width="60" /> + width="90" /> <text follows="left|right|top" height="14" @@ -456,7 +479,7 @@ left_pad="8" name="build_label" value="Build:" - width="60" /> + width="90" /> <text follows="left|right|top" height="15" @@ -482,7 +505,7 @@ left_pad="8" name="scripts_label" value="Scripts:" - width="60" /> + width="90" /> <text follows="left|right|top" height="14" @@ -508,7 +531,7 @@ left_pad="8" name="damage_label" value="Damage:" - width="60" /> + width="90" /> <text follows="left|right|top" height="14" @@ -526,8 +549,8 @@ name="about_land_btn" right="-5" tab_stop="false" - top="138" - width="90"> + top_pad="2" + width="140"> <click_callback function="Floater.Show" parameter="about_land" /> @@ -536,6 +559,8 @@ </accordion_tab> <accordion_tab expanded="false" + fit_panel="false" + height="125" layout="topleft" name="region_information_tab" title="Region"> @@ -544,6 +569,7 @@ height="125" layout="topleft" left="0" + name="region_information_panel" top="0" width="290"> <text @@ -653,7 +679,8 @@ name="region_info_btn" right="-5" tab_stop="false" - width="105"> + top_pad="2" + width="180"> <click_callback function="Floater.Show" parameter="region_info" /> @@ -662,14 +689,17 @@ </accordion_tab> <accordion_tab expanded="false" + fit_panel="false" + height="180" layout="topleft" name="estate_information_tab" title="Estate"> <panel follows="all" - height="189" + height="180" layout="topleft" left="0" + name="estate_information_panel" top="0" width="290"> <text @@ -736,7 +766,6 @@ bg_focus_color="DkGray2" bg_readonly_color="DkGray2" follows="left|top|right" - handle_edit_keys_directly="true" height="90" layout="topleft" left="10" @@ -750,14 +779,17 @@ </accordion_tab> <accordion_tab expanded="false" + fit_panel="false" + height="290" layout="topleft" name="sales_tab" title="For Sale"> <panel follows="all" - height="300" + height="290" layout="topleft" left="0" + name="sales_panel" top="0" width="290"> <text diff --git a/indra/newview/skins/default/xui/en/panel_places.xml b/indra/newview/skins/default/xui/en/panel_places.xml index c4e4b9aa9b..638e190e8f 100644 --- a/indra/newview/skins/default/xui/en/panel_places.xml +++ b/indra/newview/skins/default/xui/en/panel_places.xml @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel background_visible="true" + default_tab_group="1" follows="all" height="570" label="Places" @@ -17,12 +18,12 @@ background_visible="true" name="teleport_history_tab_title" value="TELEPORT HISTORY" /> <filter_editor - text_pad_left="14" + text_pad_left="10" follows="left|top|right" font="SansSerifSmall" height="23" layout="topleft" - left="15" + left="10" label="Filter My Places" max_length="300" name="Filter" @@ -31,15 +32,17 @@ background_visible="true" <tab_container follows="all" halign="center" - height="500" + height="503" layout="topleft" - left="10" + left="6" name="Places Tabs" tab_min_width="80" + tab_max_width="157" tab_height="30" + tab_group="1" tab_position="top" top_pad="10" - width="313" /> + width="315" /> <panel class="panel_place_profile" filename="panel_place_profile.xml" @@ -51,7 +54,7 @@ background_visible="true" name="panel_place_profile" top="5" visible="false" - width="313" /> + width="315" /> <panel class="panel_landmark_info" filename="panel_landmark_info.xml" @@ -63,13 +66,13 @@ background_visible="true" name="panel_landmark_info" top="5" visible="false" - width="313" /> + width="315" /> <panel - height="19" + height="23" layout="topleft" - left="0" + left="4" name="button_panel" - width="313"> + width="315"> <button follows="bottom|left" height="23" @@ -78,65 +81,70 @@ background_visible="true" left="5" name="teleport_btn" tool_tip="Teleport to the selected area" - top="0" - width="100" /> + top="1" + width="108" /> <button follows="bottom|left" height="23" label="Map" layout="topleft" - left_pad="5" + left_pad="3" name="map_btn" - top="0" - width="70" /> + tool_tip="Show the corresponding area on the World Map" + width="85" /> <button follows="bottom|left" height="23" label="Edit" layout="topleft" - left_pad="5" + left_pad="3" name="edit_btn" tool_tip="Edit landmark information" - top="0" - width="70" /> + width="83" /> <button follows="bottom|right" height="23" - image_disabled="ForwardArrow_Off" - image_selected="ForwardArrow_Press" - image_unselected="ForwardArrow_Off" + label="â–¼" layout="topleft" name="overflow_btn" tool_tip="Show additional options" - right="-10" - top="0" - width="18" /> + left_pad="3" + width="23" /> <button - follows="bottom|right" + follows="bottom|left" height="23" - label="Close" + label="Save" layout="topleft" - name="close_btn" - right="-10" - top="0" - width="60" /> + name="save_btn" + left="5" + top_pad="-23" + width="152" /> <button follows="bottom|right" height="23" label="Cancel" layout="topleft" name="cancel_btn" - right="-10" - top="0" - width="60" /> + left_pad="3" + width="153" /> <button follows="bottom|right" height="23" - label="Save" + label="Close" layout="topleft" - name="save_btn" - right="-75" - top="0" + name="close_btn" + right="-10" + top="1" width="60" /> + <button + follows="bottom|left" + height="23" + label="Profile" + layout="topleft" + name="profile_btn" + right="-1" + tool_tip="Show place profile" + top="1" + width="111" /> </panel> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml index 05a3771edf..31d8ea27d9 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml @@ -13,6 +13,10 @@ name="aspect_ratio_text"> [NUM]:[DEN] </panel.string> + <panel.string + name="middle_mouse"> + Middle Mouse + </panel.string> <icon follows="left|top" height="18" @@ -90,6 +94,16 @@ Automatic position for: name="appearance_camera_movement" tool_tip="Use automatic camera positioning while in edit mode" width="242" /> + <check_box + control_name="SidebarCameraMovement" + follows="left|top" + height="16" + initial_value="true" + label="Sidebar" + layout="topleft" + name="appearance_sidebar_positioning" + tool_tip="Use automatic camera positioning for sidebar" + width="242" /> <icon follows="left|top" height="18" @@ -160,9 +174,10 @@ Automatic position for: label="Opacity" layout="topleft" left="80" - label_width="50" + label_width="156" name="bubble_chat_opacity" - width="200" /> + top_pad = "10" + width="347" /> <color_swatch can_apply_immediately="true" color="0 0 0 1" @@ -170,7 +185,8 @@ Automatic position for: follows="left|top" height="50" layout="topleft" - left_pad="10" + left_pad="30" + top="190" name="background" tool_tip="Choose color for bubble chat" width="38"> @@ -181,6 +197,32 @@ Automatic position for: function="Pref.applyUIColor" parameter="BackgroundChatColor" /> </color_swatch> + <text + type="string" + length="1" + follows="left|top" + height="12" + layout="topleft" + left="80" + name="UI Size:" + top_pad="25" + width="160"> + UI size + </text> + <slider + control_name="UIScaleFactor" + decimal_digits="2" + follows="left|top" + height="17" + increment="0.025" + initial_value="1" + layout="topleft" + left_pad="0" + max_val="1.4" + min_val="0.75" + name="ui_scale_slider" + top_pad="-14" + width="180" /> <check_box control_name="ShowScriptErrors" follows="left|top" @@ -188,6 +230,7 @@ Automatic position for: label="Show script errors in:" layout="topleft" left="30" + top_pad="10" name="show_script_errors" width="256" /> <radio_group @@ -242,6 +285,7 @@ Automatic position for: top_pad="5" width="200" /> <button + layout="topleft" follows="top|left" enabled_control="EnableVoiceChat" height="23" @@ -252,8 +296,8 @@ Automatic position for: <button.commit_callback function="Pref.VoiceSetKey" /> </button> - <button - enabled_control="EnableVoiceChat" + <button + enabled_control="EnableVoiceChat" follows="top|left" halign="center" height="23" @@ -266,4 +310,15 @@ Automatic position for: <button.commit_callback function="Pref.VoiceSetMiddleMouse" /> </button> + <button + height="23" + label="Other Devices" + left="30" + name="joystick_setup_button" + top="27" + width="155"> + <button.commit_callback + function="Floater.Show" + parameter="pref_joystick" /> + </button> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml b/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml index 188fd3b7bc..516457dd93 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml @@ -51,13 +51,13 @@ Always show: </text> <scroll_list - follows="top|left" + follows="top|left|right" height="140" layout="topleft" left="10" multi_select="true" name="enabled_popups" - width="475" /> + width="495" /> <button enabled_control="FirstSelectedDisabledPopups" follows="top|left" @@ -99,11 +99,11 @@ Never show: </text> <scroll_list - follows="top|left" + follows="top|left|right" height="140" layout="topleft" left="10" multi_select="true" name="disabled_popups" - width="475" /> + width="495" /> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml index 433dfc17fe..ba967d3e2c 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml @@ -9,13 +9,23 @@ name="chat" top="1" width="517"> - <radio_group + <text + follows="left|top" + layout="topleft" + left="30" + height="12" + name="font_size" + width="120" + top="10"> + Font size: + </text> + <radio_group height="30" layout="topleft" - left="30" - control_name="ChatFontSize" + left="40" + control_name="ChatFontSize" name="chat_font_size" - top="10" + top_pad="0" width="440"> <radio_item height="16" @@ -45,12 +55,25 @@ top_delta="0" width="125" /> </radio_group> + + <text + follows="left|top" + layout="topleft" + left="30" + height="12" + name="font_colors" + top_pad="10" + width="120" + > + Font colors: + </text> + <color_swatch can_apply_immediately="true" follows="left|top" height="47" layout="topleft" - left="30" + left="40" name="user" top_pad="10" width="44" > @@ -79,7 +102,7 @@ follows="left|top" height="47" layout="topleft" - left="180" + left="190" name="agent" top_pad="-17" width="44" > @@ -110,7 +133,7 @@ height="47" label_width="60" layout="topleft" - left="350" + left="360" name="im" top_pad="-17" width="44"> @@ -141,7 +164,7 @@ height="47" label_width="44" layout="topleft" - left="30" + left="40" name="system" top_pad="40" width="44" > @@ -171,7 +194,7 @@ follows="left|top" height="47" layout="topleft" - left="180" + left="190" name="script_error" top_pad="-17" width="44"> @@ -201,7 +224,7 @@ follows="left|top" height="47" layout="topleft" - left="350" + left="360" name="objects" top_pad="-17" width="44" > @@ -231,7 +254,7 @@ follows="left|top" height="47" layout="topleft" - left="30" + left="40" name="owner" top_pad="40" width="44" > @@ -261,7 +284,7 @@ follows="left|top" height="47" layout="topleft" - left="180" + left="190" name="links" top_pad="-17" width="44" > @@ -307,31 +330,38 @@ <check_box enabled="false" height="16" - label="Enable plain text chat history" + label="Enable plain text IM and chat history" layout="topleft" left_delta="0" name="plain_text_chat_history" top_pad="5" width="400" /> <text + name="show_ims_in_label" + follows="left|top" + layout="topleft" left="30" height="20" - width="120" + width="170" top_pad="20"> Show IMs in: </text> <text - left_pad="6" - height="20" - width="100" - text_color="White_25" - > + name="requires_restart_label" + follows="left|top" + layout="topleft" + top_delta="0" + left="170" + height="20" + width="130" + text_color="White_25" + > (requires restart) </text> <radio_group height="30" layout="topleft" - left="30" + left="40" control_name="ChatWindow" name="chat_window" top_pad="0" diff --git a/indra/newview/skins/default/xui/en/panel_preferences_general.xml b/indra/newview/skins/default/xui/en/panel_preferences_general.xml index 099c789e4b..a69e8d29b0 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_general.xml @@ -141,7 +141,34 @@ label="General" name="Desired_PG" value="13" /> + <combo_box.commit_callback + function="Pref.MaturitySettings"/> </combo_box> + <icon + follows="left|top" + height="16" + image_name="Parcel_PG_Dark" + layout="topleft" + left_pad="5" + name="rating_icon_general" + top_delta="3" + width="18"/> + <icon + follows="left|top" + height="16" + image_name="Parcel_M_Dark" + layout="topleft" + left_pad="2" + name="rating_icon_moderate" + width="18"/> + <icon + follows="left|top" + height="16" + image_name="Parcel_R_Dark" + layout="topleft" + left_pad="2" + name="rating_icon_adult" + width="18"/> <text type="string" length="1" @@ -150,7 +177,7 @@ layout="topleft" left="30" name="start_location_textbox" - top_pad="10" + top_pad="15" width="394"> Start location: </text> @@ -229,26 +256,15 @@ left="50" name="show_my_name_checkbox1" width="300" /> - <check_box - enabled_control="AvatarNameTagMode" - control_name="SmallAvatarNames" - height="16" - initial_value="true" - label="Small name tags" - layout="topleft" - left_delta="175" - name="small_avatar_names_checkbox" - width="200" /> <check_box enabled_control="AvatarNameTagMode" control_name="RenderShowGroupTitleAll" height="16" label="Show group titles" layout="topleft" - left_delta="-175" + left_delta="175" name="show_all_title_checkbox1" - top_pad="5" - width="300" /> + width="200" /> <text type="string" length="1" @@ -327,23 +343,22 @@ left="30" mouse_opaque="false" name="text_box3" - top_pad="10" + top_pad="15" width="240"> Busy mode response: </text> <text_editor - control_name="BusyModeResponse2" + control_name="BusyModeResponse" text_readonly_color="LabelDisabledColor" bg_writeable_color="LtGray" use_ellipses="false" - hover="false" commit_on_focus_lost = "true" - follows="left|top" + follows="left|top|right" height="60" layout="topleft" left="50" name="busy_response" - width="440" + width="450" word_wrap="true"> log_in_to_change </text_editor> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml index 82821a1dfe..f4694180a1 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml @@ -16,35 +16,8 @@ height="12" layout="topleft" left="30" - name="UI Size:" - top="10" - width="300"> - UI size: - </text> - <slider - can_edit_text="true" - control_name="UIScaleFactor" - decimal_digits="2" - follows="left|top" - height="15" - increment="0.025" - initial_value="1" - layout="topleft" - left_delta="52" - max_val="1.4" - min_val="0.75" - name="ui_scale_slider" - top_pad="2" - width="180" /> - <text - type="string" - length="1" - follows="left|top" - height="12" - layout="topleft" - left="30" name="QualitySpeed" - top_pad="4" + top="10" width="400"> Quality and speed: </text> @@ -187,7 +160,7 @@ layout="topleft" left="5" name="CustomGraphics Panel" - top="124" + top="76" width="485"> <text type="string" @@ -314,7 +287,7 @@ left_delta="2" name="AvatarRenderingText" top_pad="5" - width="128"> + width="158"> Avatar rendering: </text> <check_box @@ -359,29 +332,26 @@ increment="8" initial_value="160" label="Draw distance:" - label_width="140" + label_width="185" layout="topleft" - left="216" + left="200" max_val="512" min_val="64" name="DrawDistance" top="3" - width="255"> - <slider.commit_callback - function="Pref.UpdateMeterText" /> - </slider> + width="296" /> <text type="string" length="1" follows="left|top" height="12" layout="topleft" - left_delta="250" + left_delta="291" name="DrawDistanceMeterText2" top_delta="0" width="128"> m - </text> + </text> <slider control_name="RenderMaxPartCount" decimal_digits="0" @@ -390,13 +360,29 @@ increment="256" initial_value="4096" label="Max. particle count:" - label_width="140" + label_width="185" layout="topleft" - left="216" + left="200" max_val="8192" name="MaxParticleCount" top_pad="7" - width="262" /> + width="303" /> + <slider + control_name="RenderAvatarMaxVisible" + decimal_digits="0" + follows="left|top" + height="16" + increment="1" + initial_value="12" + label="Max. # of non-impostor avatars:" + label_width="185" + layout="topleft" + left_delta="0" + max_val="65" + min_val="1" + name="MaxNumberAvatarDrawn" + top_pad="4" + width="290" /> <slider control_name="RenderGlowResolutionPow" decimal_digits="0" @@ -405,15 +391,15 @@ increment="1" initial_value="8" label="Post process quality:" - label_width="140" + label_width="185" layout="topleft" - left_delta="0" + left="200" max_val="9" min_val="8" name="RenderPostProcess" show_text="false" top_pad="4" - width="223"> + width="264"> <slider.commit_callback function="Pref.UpdateSliderText" parameter="PostProcessText" /> @@ -437,14 +423,14 @@ increment="0.125" initial_value="160" label=" Objects:" - label_width="140" + label_width="185" layout="topleft" left_delta="0" max_val="2" name="ObjectMeshDetail" show_text="false" top_pad="6" - width="223"> + width="264"> <slider.commit_callback function="Pref.UpdateSliderText" parameter="ObjectMeshDetailText" /> @@ -455,13 +441,13 @@ height="16" initial_value="160" label=" Flexiprims:" - label_width="140" + label_width="185" layout="topleft" left_delta="0" name="FlexibleMeshDetail" show_text="false" top_pad="4" - width="223"> + width="264"> <slider.commit_callback function="Pref.UpdateSliderText" parameter="FlexibleMeshDetailText" /> @@ -473,13 +459,13 @@ increment="0.125" initial_value="160" label=" Trees:" - label_width="140" + label_width="185" layout="topleft" left_delta="0" name="TreeMeshDetail" show_text="false" top_pad="4" - width="223"> + width="264"> <slider.commit_callback function="Pref.UpdateSliderText" parameter="TreeMeshDetailText" /> @@ -491,13 +477,13 @@ increment="0.125" initial_value="160" label=" Avatars:" - label_width="140" + label_width="185" layout="topleft" left_delta="0" name="AvatarMeshDetail" show_text="false" top_pad="4" - width="223"> + width="264"> <slider.commit_callback function="Pref.UpdateSliderText" parameter="AvatarMeshDetailText" /> @@ -509,7 +495,7 @@ increment="0.125" initial_value="160" label=" Terrain:" - label_width="140" + label_width="185" layout="topleft" left_delta="0" max_val="2" @@ -517,7 +503,7 @@ name="TerrainMeshDetail" show_text="false" top_pad="4" - width="223"> + width="264"> <slider.commit_callback function="Pref.UpdateSliderText" parameter="TerrainMeshDetailText" /> @@ -531,7 +517,7 @@ increment="8" initial_value="160" label=" Sky:" - label_width="140" + label_width="185" layout="topleft" left_delta="0" max_val="128" @@ -539,7 +525,7 @@ name="SkyMeshDetail" show_text="false" top_pad="4" - width="223"> + width="264"> <slider.commit_callback function="Pref.UpdateSliderText" parameter="SkyMeshDetailText" /> @@ -550,9 +536,9 @@ follows="left|top" height="12" layout="topleft" - left="444" + left="469" name="PostProcessText" - top="305" + top="60" width="128"> Low </text> @@ -635,10 +621,10 @@ follows="left|top" height="12" layout="topleft" - left_delta="-230" + left="200" name="LightingDetailText" - top_pad="8" - width="128"> + top_pad="18" + width="140"> Lighting detail: </text> <radio_group @@ -646,15 +632,13 @@ draw_border="false" height="38" layout="topleft" - left_delta="0" name="LightingDetailRadio" top_pad="5" - width="321"> + width="200"> <radio_item height="16" label="Sun and moon only" layout="topleft" - left="3" name="SunMoon" value="0" top="3" @@ -663,7 +647,6 @@ height="16" label="Nearby local lights" layout="topleft" - left_delta="0" name="LocalLights" value="1" top_delta="16" @@ -675,10 +658,10 @@ follows="left|top" height="12" layout="topleft" - left="360" + left_pad="-30" name="TerrainDetailText" - top="465" - width="128"> + top="226" + width="155"> Terrain detail: </text> <radio_group @@ -689,23 +672,21 @@ left_delta="0" name="TerrainDetailRadio" top_pad="5" - width="321"> + width="70"> <radio_item height="16" label="Low" layout="topleft" - left="3" name="0" top="3" - width="315" /> + width="50" /> <radio_item height="16" label="High" layout="topleft" - left_delta="0" name="2" top_delta="16" - width="315" /> + width="50" /> </radio_group> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml index f7e3ede93c..fca9b4bca1 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml @@ -17,6 +17,7 @@ follows="left|bottom" height="23" label="Clear History" + tool_tip="Clear login image, last location, teleport history, web, and texture cache" layout="topleft" left="30" name="clear_cache" @@ -68,52 +69,6 @@ name="auto_disengage_mic_check" top_pad="10" width="350" /> - <check_box - control_name="CookiesEnabled" - height="16" - label="Accept cookies" - layout="topleft" - left="30" - name="cookies_enabled" - top_pad="10" - width="350" /> - <check_box - name="media_enabled" - control_name="AudioStreamingMedia" - height="16" - label="Media Enabled" - layout="topleft" - left="30" - top_pad="10" - width="350"> - <check_box.commit_callback - function="Pref.MediaEnabled" /> - </check_box> - <check_box - enabled_control="AudioStreamingMedia" - control_name="ParcelMediaAutoPlayEnable" - height="16" - label="Allow Media to auto-play" - layout="topleft" - left="30" - name="autoplay_enabled" - top_pad="10" - width="350"> - <check_box.commit_callback - function="Pref.ParcelMediaAutoPlayEnable" /> - </check_box> - <check_box - control_name="AudioStreamingMusic" - height="16" - label="Music Enabled" - layout="topleft" - left="30" - name="music_enabled" - top_pad="10" - width="350"> - <check_box.commit_callback - function="Pref.MusicEnabled" /> - </check_box> <text type="string" length="1" @@ -129,7 +84,7 @@ </text> <check_box enabled="false" - control_name="LogChat" + control_name="LogNearbyChat" height="16" label="Save nearby chat logs on my computer" layout="topleft" diff --git a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml index 8723e0a832..2c6ceeef2e 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml @@ -9,18 +9,6 @@ name="Input panel" top="1" width="517"> - <button - height="23" - label="Other Devices" - layout="topleft" - left="30" - name="joystick_setup_button" - top="10" - width="155"> - <button.commit_callback - function="Floater.Show" - parameter="pref_joystick" /> - </button> <text type="string" length="1" @@ -29,7 +17,7 @@ layout="topleft" left="30" name="Mouselook:" - top_pad="10" + top="10" width="300"> Mouselook: </text> @@ -142,14 +130,14 @@ increment="1" initial_value="13000" label="Port number:" - label_width="75" + label_width="105" layout="topleft" left_delta="160" max_val="13050" min_val="13000" name="connection_port" - top_delta="-2" - width="140" /> + top_delta="3" + width="170" /> <text type="string" length="1" @@ -210,7 +198,6 @@ enabled="false" follows="left|top" font="SansSerif" - handle_edit_keys_directly="true" height="23" layout="topleft" left="80" @@ -265,35 +252,80 @@ layout="topleft" left_delta="50" name="use_external_browser" - top_pad="4" + top_pad="-2" width="480"> <radio_item height="20" - label="Use built-in browser" - layout="topleft" - left="0" - name="internal" - value="0" - tool_tip="Use the built-in web browser for help, web links, etc. This browser opens as a new window inside [APP_NAME]." - top="0" - width="480" /> - <radio_item - height="20" label="Use my browser (IE, Firefox, Safari)" layout="topleft" left_delta="0" name="external" value="1" + top="0" tool_tip="Use the default system web browser for help, web links, etc. Not recommended if running full screen." + width="480" /> + <radio_item + height="20" + label="Use built-in browser" + layout="topleft" + left="0" + name="internal" + value="" + tool_tip="Use the built-in web browser for help, web links, etc. This browser opens as a new window inside [APP_NAME]." top_delta="20" width="480" /> </radio_group> <check_box + top_delta="2" + enabled="true" + follows="left|top" + height="18" + initial_value="true" + control_name="BrowserPluginsEnabled" + label="Enable plugins" + left_delta="20" + mouse_opaque="true" + name="browser_plugins_enabled" + radio_style="false" + width="400" + top_pad="5"/> + + <check_box + top_delta="4" + enabled="true" + follows="left|top" + height="14" + initial_value="true" + control_name="CookiesEnabled" + label="Accept cookies" + left_delta="0" + mouse_opaque="true" + name="cookies_enabled" + radio_style="false" + width="400" + top_pad="5"/> + + <check_box + top_delta="4" + enabled="true" + follows="left|top" + height="14" + initial_value="true" + control_name="BrowserJavascriptEnabled" + label="Enable Javascript" + left_delta="0" + mouse_opaque="true" + name="browser_javascript_enabled" + radio_style="false" + width="400" + top_pad="5"/> + + <check_box top_delta="4" enabled="true" follows="left|top" - height="16" + height="14" initial_value="false" control_name="BrowserProxyEnabled" label="Enable Web Proxy" @@ -308,9 +340,9 @@ follows="left|top" height="10" layout="topleft" - left_delta="1" + left_delta="20" name="Proxy location" - top_delta="20" + top_delta="16" width="300"> Proxy location: </text> @@ -335,12 +367,12 @@ increment="1" initial_value="80" label="Port number:" - label_width="75" + label_width="95" layout="topleft" - left_delta="230" + left_delta="210" max_val="12000" min_val="10" name="web_proxy_port" top_delta="0" - width="140" /> + width="145" /> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml index 8bff865eb1..65c78ad333 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml @@ -14,10 +14,10 @@ follows="left|top" font.style="BOLD" height="15" - increment="0.05" + increment="0.025" initial_value="0.5" label="Master volume" - label_width="160" + label_width="120" layout="topleft" left="0" name="System Volume" @@ -25,20 +25,20 @@ slider_label.halign="right" top="10" volume="true" - width="350"> + width="300"> <slider.commit_callback function="Pref.setControlFalse" parameter="MuteAudio" /> </slider> <button control_name="MuteAudio" - follows="top|right" + follows="top|left" height="16" image_selected="AudioMute_Off" image_unselected="Audio_Off" is_toggle="true" layout="topleft" - left_pad="10" + left_pad="5" name="mute_audio" tab_stop="false" width="16" /> @@ -46,21 +46,55 @@ control_name="MuteWhenMinimized" height="15" initial_value="true" - label="Mute if minimized" + label="Mute when minimized" layout="topleft" - left="167" name="mute_when_minimized" - top_pad="5" - width="215" /> + top_delta="3" + left_pad="5" + width="235" /> + <slider + control_name="AudioLevelUI" + disabled_control="MuteAudio" + follows="left|top" + height="15" + increment="0.025" + initial_value="0.5" + label="Buttons" + label_width="120" + layout="topleft" + left="0" + name="UI Volume" + show_text="false" + slider_label.halign="right" + top_pad="7" + volume="true" + width="300"> + <slider.commit_callback + function="Pref.setControlFalse" + parameter="MuteUI" /> + </slider> + <button + control_name="MuteUI" + disabled_control="MuteAudio" + follows="top|left" + height="16" + image_selected="AudioMute_Off" + image_unselected="Audio_Off" + is_toggle="true" + layout="topleft" + left_pad="5" + name="mute_audio" + tab_stop="false" + width="16" /> <slider control_name="AudioLevelAmbient" disabled_control="MuteAudio" follows="left|top" height="15" - increment="0.05" + increment="0.025" initial_value="0.5" label="Ambient" - label_width="160" + label_width="120" layout="topleft" left="0" name="Wind Volume" @@ -68,7 +102,7 @@ slider_label.halign="right" top_pad="7" volume="true" - width="350"> + width="300"> <slider.commit_callback function="Pref.setControlFalse" parameter="MuteAmbient" /> @@ -76,81 +110,13 @@ <button control_name="MuteAmbient" disabled_control="MuteAudio" - follows="top|right" - height="16" - image_selected="AudioMute_Off" - image_unselected="Audio_Off" - is_toggle="true" - layout="topleft" - left_pad="10" - name="mute_audio" - tab_stop="false" - width="16" /> - <slider - control_name="AudioLevelUI" - disabled_control="MuteAudio" - follows="left|top" - height="15" - increment="0.05" - initial_value="0.5" - label="Buttons" - label_width="160" - layout="topleft" - left="0" - name="UI Volume" - show_text="false" - slider_label.halign="right" - top_pad="7" - volume="true" - width="350"> - <slider.commit_callback - function="Pref.setControlFalse" - parameter="MuteUI" /> - </slider> - <button - control_name="MuteUI" - disabled_control="MuteAudio" - follows="top|right" - height="16" - image_selected="AudioMute_Off" - image_unselected="Audio_Off" - is_toggle="true" - layout="topleft" - left_pad="10" - name="mute_audio" - tab_stop="false" - width="16" /> - <slider - control_name="AudioLevelMedia" - disabled_control="MuteAudio" - follows="left|top" - height="15" - increment="0.05" - initial_value="0.5" - label="Media" - label_width="160" - layout="topleft" - left="0" - name="Media Volume" - show_text="false" - slider_label.halign="right" - top_pad="7" - volume="true" - width="350"> - <slider.commit_callback - function="Pref.setControlFalse" - parameter="MuteMedia" /> - </slider> - <button - control_name="MuteMedia" - disabled_control="MuteAudio" - follows="top|right" + follows="top|left" height="16" image_selected="AudioMute_Off" image_unselected="Audio_Off" is_toggle="true" layout="topleft" - left_pad="10" + left_pad="5" name="mute_audio" tab_stop="false" width="16" /> @@ -159,10 +125,10 @@ disabled_control="MuteAudio" follows="left|top" height="15" - increment="0.05" + increment="0.025" initial_value="0.5" - label="Sound effects" - label_width="160" + label="Sound Effects" + label_width="120" slider_label.halign="right" layout="topleft" left="0" @@ -170,7 +136,7 @@ show_text="false" top_pad="7" volume="true" - width="350"> + width="300"> <slider.commit_callback function="Pref.setControlFalse" parameter="MuteSounds" /> @@ -178,13 +144,13 @@ <button control_name="MuteSounds" disabled_control="MuteAudio" - follows="top|right" + follows="top|left" height="16" image_selected="AudioMute_Off" image_unselected="Audio_Off" is_toggle="true" layout="topleft" - left_pad="10" + left_pad="5" name="mute_audio" tab_stop="false" width="16" /> @@ -193,10 +159,10 @@ disabled_control="MuteAudio" follows="left|top" height="15" - increment="0.05" + increment="0.025" initial_value="0.5" label="Streaming music" - label_width="160" + label_width="120" layout="topleft" left="0" name="Music Volume" @@ -204,119 +170,199 @@ show_text="false" top_pad="7" volume="true" - width="350"> + width="300"> <slider.commit_callback function="Pref.setControlFalse" parameter="MuteMusic" /> - </slider> - <button + </slider> + <button control_name="MuteMusic" - disabled_control="MuteAudio" - follows="top|right" + disabled_control="MuteAudio" + follows="top|left" height="16" image_selected="AudioMute_Off" image_unselected="Audio_Off" is_toggle="true" layout="topleft" - left_pad="10" + left_pad="5" name="mute_audio" tab_stop="false" - width="16" /> - <check_box - label_text.halign="left" - follows="left|top" - height="16" - control_name ="EnableVoiceChat" - disabled_control="CmdLineDisableVoice" - label="Enable voice" - layout="topleft" - left="28" - name="enable_voice_check" - top_pad="5" - width="110" - > - </check_box> - <slider - control_name="AudioLevelVoice" - enabled_control="EnableVoiceChat" - disabled_control="MuteAudio" + width="16" /> + <check_box + control_name="AudioStreamingMusic" + height="16" + label="Enabled" + layout="topleft" + left_pad="5" + name="music_enabled" + top_delta="2" + width="350"/> + <slider + control_name="AudioLevelMedia" + disabled_control="MuteAudio" + follows="left|top" + height="16" + increment="0.025" + initial_value="0.5" + label="Media" + label_width="120" + layout="topleft" + left="0" + name="Media Volume" + show_text="false" + slider_label.halign="right" + top_pad="7" + volume="true" + width="300"> + <slider.commit_callback + function="Pref.setControlFalse" + parameter="MuteMedia" /> + </slider> + <button + control_name="MuteMedia" + disabled_control="MuteAudio" + follows="top|left" + height="16" + image_selected="AudioMute_Off" + image_unselected="Audio_Off" + is_toggle="true" + layout="topleft" + left_pad="5" + name="mute_audio" + tab_stop="false" + width="16" /> + <check_box + label_text.halign="left" + follows="left|top" + height="16" + control_name ="AudioStreamingMedia" + label="Enabled" + layout="topleft" + top_delta="2" + left_pad="5" + name="enable_media" + width="110"/> + <slider + control_name="AudioLevelVoice" + disabled_control="MuteAudio" + follows="left|top" + height="16" + increment="0.025" + initial_value="0.5" + label="Voice Chat" + label_width="120" + layout="topleft" + left="0" + top_delta="20" + name="Voice Volume" + show_text="false" + slider_label.halign="right" + volume="true" + width="300"> + <slider.commit_callback + function="Pref.setControlFalse" + parameter="MuteVoice" /> + </slider> + <button + control_name="MuteVoice" + disabled_control="MuteAudio" + follows="top|left" + height="16" + image_selected="AudioMute_Off" + image_unselected="Audio_Off" + is_toggle="true" + layout="topleft" + left_pad="5" + name="mute_audio" + tab_stop="false" + width="16" /> + <check_box + label_text.halign="left" + follows="left|top" + height="16" + control_name ="EnableVoiceChat" + disabled_control="CmdLineDisableVoice" + label="Enabled" + layout="topleft" + top_delta="2" + left_pad="5" + name="enable_voice_check" + width="110"/> + <!-- --> + <check_box + name="media_auto_play_btn" + control_name="ParcelMediaAutoPlayEnable" + value="true" + follows="left|bottom|right" + height="15" + tool_tip="Check this to let media auto-play if it wants" + label="Allow Media to auto-play" + top_pad="5" + left="25"/> + <check_box + name="media_show_on_others_btn" + control_name="MediaShowOnOthers" + value="true" + follows="left|bottom|right" + height="15" + tool_tip="Uncheck this to hide media attached to other avatars nearby" + label="Play media attached to other avatars" + left="25"/> + + <text + type="string" + length="1" follows="left|top" - height="15" - increment="0.05" - initial_value="0.5" - label="Voice" - label_width="160" - layout="topleft" - left="0" - top_delta="20" - name="Voice Volume" - show_text="false" - slider_label.halign="right" - volume="true" - width="350"> - <slider.commit_callback - function="Pref.setControlFalse" - parameter="MuteVoice" /> - </slider> - <button - control_name="MuteVoice" - disabled_control="MuteAudio" - follows="top|right" - height="16" - image_selected="AudioMute_Off" - image_unselected="Audio_Off" - is_toggle="true" + height="20" layout="topleft" - left_pad="10" - name="mute_audio" - tab_stop="false" - width="16" /> + left="25" + name="voice_chat_settings" + width="200" + top="210"> + Voice Chat Settings + </text> <text type="string" length="1" follows="left|top" - height="13" layout="topleft" - left="30" + left="80" + top_delta="16" name="Listen from" - width="200" - top="205"> + width="142"> Listen from: </text> - <icon - follows="left|top" - height="18" - image_name="Cam_FreeCam_Off" - layout="topleft" - name="camera_icon" - mouse_opaque="false" - visible="true" - width="18" - left="80" - top="219"/> <icon - follows="left|top" - height="18" - image_name="Move_Walk_Off" - layout="topleft" - name="avatar_icon" - mouse_opaque="false" - visible="true" - width="18" - top="239" - left="80" - /> + follows="left|top" + height="18" + image_name="Cam_FreeCam_Off" + layout="topleft" + name="camera_icon" + mouse_opaque="false" + visible="true" + width="18" + left_pad="0" + top_delta="-5"/> + <icon + follows="left|top" + height="18" + image_name="Move_Walk_Off" + layout="topleft" + name="avatar_icon" + mouse_opaque="false" + visible="true" + width="18" + top_delta="20" /> <radio_group enabled_control="EnableVoiceChat" control_name="VoiceEarLocation" draw_border="false" follows="left|top" layout="topleft" - left="100" + left_pad="2" width="221" height="38" - name="ear_location" - top="218"> + name="ear_location"> <radio_item height="16" label="Camera position" @@ -339,8 +385,8 @@ is_toggle="true" label="Input/Output devices" layout="topleft" - left="30" - top="262" + left="80" + top_pad="5" name="device_settings_btn" width="190"> </button> @@ -408,7 +454,7 @@ control_name="AudioLevelMic" follows="left|top" height="17" - increment="0.05" + increment="0.025" initial_value="1.0" layout="topleft" left="160" @@ -440,28 +486,28 @@ <locate height="20" layout="topleft" - left_pad="2" + left_pad="5" name="bar1" top_delta="0" width="20" /> <locate height="20" layout="topleft" - left_pad="2" + left_pad="5" name="bar2" top_delta="0" width="20" /> <locate height="20" layout="topleft" - left_pad="2" + left_pad="5" name="bar3" top_delta="0" width="20" /> <locate height="20" layout="topleft" - left_pad="2" + left_pad="5" name="bar4" top_delta="0" width="20" /> @@ -475,7 +521,7 @@ visible="true" width="22" /> <text - font.style="BOLD" + font.style="BOLD" type="string" length="1" follows="left|top" diff --git a/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml index e1d8ee241d..6bf00373ea 100644 --- a/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml +++ b/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel follows="left|right|top|bottom" - name="MediaControlsPanel" + name="MediaControls" background_visible="false" height="200" layout="topleft" @@ -71,7 +71,7 @@ layout="topleft" top="0" left="0" - border_size="1" + border_size="0" mouse_opaque="false" orientation="horizontal"> <!-- outer layout_panels center the inner one --> @@ -260,7 +260,7 @@ top="0" height="22" min_width="22" - width="24"> + width="22"> <button name="play_btn" follows="top" @@ -272,7 +272,6 @@ hover_glow_amount="0.15" layout="topleft" tool_tip = "Play media" - left_delta="2" top="0" height="22" width="22"> @@ -288,7 +287,7 @@ layout="topleft" top="0" min_width="22" - width="24"> + width="22"> <button name="pause_btn" follows="top" @@ -302,7 +301,6 @@ top="0" height="22" width="22" - left_delta="-1" tool_tip = "Pause media"> <button.commit_callback function="MediaCtrl.Pause" /> diff --git a/indra/newview/skins/default/xui/en/panel_profile.xml b/indra/newview/skins/default/xui/en/panel_profile.xml index 351df22042..d7a601d7a3 100644 --- a/indra/newview/skins/default/xui/en/panel_profile.xml +++ b/indra/newview/skins/default/xui/en/panel_profile.xml @@ -59,7 +59,7 @@ left="0" name="profile_scroll" opaque="true" - height="524" + height="527" width="317" top="0"> <panel @@ -107,6 +107,8 @@ layout="topleft" left="107" textbox.max_length="512" + textbox.label="More" + textbox.show_context_menu="true" name="sl_description_edit" top_pad="-3" translate="false" @@ -151,6 +153,8 @@ layout="topleft" left="107" textbox.max_length="512" + textbox.label="More" + textbox.show_context_menu="true" name="fl_description_edit" top_pad="-3" translate="false" @@ -284,10 +288,13 @@ width="300" /> <expandable_text follows="all" - height="113" + height="103" layout="topleft" left="7" name="sl_groups" + textbox.max_length="512" + textbox.label="More" + textbox.show_context_menu="true" top_pad="0" translate="false" width="290" @@ -313,9 +320,12 @@ left="2" mouse_opaque="false" name="add_friend" + pad_left="1" + pad_right="1" tool_tip="Offer friendship to the Resident" top="5" - width="80" /> + use_ellipses="true" + width="117" /> <button follows="bottom|left" height="23" @@ -324,8 +334,8 @@ name="im" tool_tip="Open instant message session" top="5" - left_pad="3" - width="39" /> + left_pad="1" + width="21" /> <button follows="bottom|left" height="23" @@ -333,20 +343,12 @@ layout="topleft" name="call" tool_tip="Call this Resident" - left_pad="3" - top="5" - width="43" /> - <button - enabled="false" - follows="bottom|left" - height="23" - label="Map" - layout="topleft" - name="show_on_map_btn" - tool_tip="Show the Resident on the map" + left_pad="1" + pad_left="1" + pad_right="1" top="5" - left_pad="3" - width="41" /> + use_ellipses="true" + width="51" /> <button follows="bottom|left" height="23" @@ -354,9 +356,12 @@ layout="topleft" name="teleport" tool_tip="Offer teleport" - left_pad="3" + left_pad="1" + pad_left="1" + pad_right="1" top="5" - width="69" /> + use_ellipses="true" + width="92" /> <button follows="bottom|right" height="23" @@ -366,7 +371,6 @@ tool_tip="Pay money to or share inventory with the Resident" right="-1" top="5" - left_pad="3" width="23" /> </layout_panel> <layout_panel @@ -385,14 +389,6 @@ name="edit_profile_btn" tool_tip="Edit your personal information" width="130" /> - <button - follows="bottom|right" - height="23" - label="Edit Appearance" - left_pad="10" - name="edit_appearance_btn" - tool_tip="Create/edit your appearance: physical data, clothes and etc." - width="130" /> </layout_panel> </layout_stack> diff --git a/indra/newview/skins/default/xui/en/panel_profile_view.xml b/indra/newview/skins/default/xui/en/panel_profile_view.xml index 607de65c5c..d9030fc0d6 100644 --- a/indra/newview/skins/default/xui/en/panel_profile_view.xml +++ b/indra/newview/skins/default/xui/en/panel_profile_view.xml @@ -6,6 +6,7 @@ layout="topleft" min_height="350" name="panel_target_profile" + left="0" width="333"> <string name="status_online"> @@ -17,26 +18,30 @@ </string> <button follows="top|right" - height="23" - image_overlay="BackArrow_Off" + height="24" + image_hover_unselected="BackButton_Over" + image_pressed="BackButton_Press" + image_unselected="BackButton_Off" layout="topleft" name="back" left="10" tab_stop="false" top="2" - width="23" /> + width="30" /> <text_editor + h_pad="0" + v_pad="0" allow_scroll="false" bg_visible="false" read_only = "true" follows="top|left|right" font="SansSerifHugeBold" - height="29" + height="26" layout="topleft" - left_pad="10" + left_pad="5" name="user_name" text_color="LtGray" - top="0" + top="2" value="(Loading...)" use_ellipses="true" width="275" /> @@ -51,7 +56,7 @@ width="150" /> <tab_container follows="all" - height="535" + height="538" halign="center" layout="topleft" left="5" diff --git a/indra/newview/skins/default/xui/en/panel_region_covenant.xml b/indra/newview/skins/default/xui/en/panel_region_covenant.xml index dc8f71c868..2b2ea78fac 100644 --- a/indra/newview/skins/default/xui/en/panel_region_covenant.xml +++ b/indra/newview/skins/default/xui/en/panel_region_covenant.xml @@ -113,7 +113,6 @@ max_length="65535" name="covenant_editor" top_delta="30" - handle_edit_keys_directly="true" width="340" word_wrap="true"> There is no Covenant provided for this Estate. diff --git a/indra/newview/skins/default/xui/en/panel_region_estate.xml b/indra/newview/skins/default/xui/en/panel_region_estate.xml index 3980eb86d3..08e36d5e57 100644 --- a/indra/newview/skins/default/xui/en/panel_region_estate.xml +++ b/indra/newview/skins/default/xui/en/panel_region_estate.xml @@ -2,14 +2,14 @@ <panel border="false" follows="top|left" - height="320" + height="510" help_topic="panel_region_estate_tab" label="Estate" layout="topleft" left="0" name="Estate" top="320" - width="480"> + width="530"> <text type="string" length="1" @@ -20,7 +20,7 @@ name="estate_help_text" top="14" word_wrap="true" - width="275"> + width="300"> Changes to settings on this tab will affect all regions in the estate. </text> <text @@ -33,7 +33,7 @@ left_delta="0" name="estate_text" top_pad="2" - width="80"> + width="140"> Estate: </text> <text @@ -59,7 +59,7 @@ left_delta="0" name="owner_text" top_pad="2" - width="80"> + width="150"> Estate owner: </text> <text @@ -82,7 +82,7 @@ layout="topleft" left_delta="-4" top_pad="5" - width="250" /> + width="300" /> <check_box height="20" label="Use Global Time" @@ -184,26 +184,26 @@ layout="topleft" name="apply_btn" top_pad="10" - left="78" + left="110" width="97" /> <button follows="left|top" height="23" label="Send Message To Estate..." layout="topleft" - left="50" + left="45" name="message_estate_btn" top_pad="20" - width="160" /> + width="220" /> <button follows="left|top" height="23" - label="Kick User from Estate..." + label="Kick Resident from Estate..." layout="topleft" - left="50" + left="45" name="kick_user_from_estate_btn" top_pad="5" - width="160" /> + width="220" /> <text type="string" @@ -213,7 +213,7 @@ height="20" layout="topleft" name="estate_manager_label" - right="470" + right="520" width="200"> Estate Managers: </text> @@ -222,7 +222,7 @@ follows="top|left" height="71" layout="topleft" - right="470" + right="520" top_pad="-5" width="200" /> <name_list @@ -240,7 +240,7 @@ label="Remove..." layout="topleft" name="remove_estate_manager_btn" - right="470" + right="520" top_pad="5" width="97" /> <button @@ -269,7 +269,7 @@ follows="top|left" height="71" layout="topleft" - right="470" + right="520" top_pad="-5" width="200" /> <name_list @@ -287,7 +287,7 @@ label="Remove..." layout="topleft" name="remove_allowed_avatar_btn" - right="470" + right="520" top_pad="5" width="97" /> <button @@ -316,7 +316,7 @@ follows="top|left" height="71" layout="topleft" - right="470" + right="520" top_pad="-5" width="200" /> <name_list @@ -334,7 +334,7 @@ label="Remove..." layout="topleft" name="remove_allowed_group_btn" - right="470" + right="520" top_pad="5" width="97" /> <button @@ -363,7 +363,7 @@ follows="top|left" height="71" layout="topleft" - right="470" + right="520" top_pad="-5" width="200" /> <name_list @@ -381,7 +381,7 @@ label="Remove..." layout="topleft" name="remove_banned_avatar_btn" - right="470" + right="520" top_pad="5" width="97" /> <button diff --git a/indra/newview/skins/default/xui/en/panel_region_general.xml b/indra/newview/skins/default/xui/en/panel_region_general.xml index 26568c2a28..ca9579284b 100644 --- a/indra/newview/skins/default/xui/en/panel_region_general.xml +++ b/indra/newview/skins/default/xui/en/panel_region_general.xml @@ -134,6 +134,7 @@ top="200" width="80" /> <spinner + decimal_digits="0" follows="left|top" height="20" increment="1" @@ -170,27 +171,51 @@ width="100"> Rating: </text> - <combo_box + <icons_combo_box + follows="left|top" height="20" label="Moderate" layout="topleft" left_delta="100" name="access_combo" top_delta="0" - width="85"> - <combo_box.item + width="105"> + <icons_combo_box.drop_down_button + image_overlay="Parcel_M_Light" + image_overlay_alignment="left" + imgoverlay_label_space="3" + pad_left="3"/> + <icons_combo_box.item label="Adult" name="Adult" - value="42" /> - <combo_box.item + value="42"> + <item.columns + halign="center" + type="icon" + value="Parcel_R_Light" + width="20"/> + </icons_combo_box.item> + <icons_combo_box.item label="Moderate" name="Mature" - value="21" /> - <combo_box.item + value="21"> + <item.columns + halign="center" + type="icon" + value="Parcel_M_Light" + width="20"/> + </icons_combo_box.item> + <icons_combo_box.item label="General" name="PG" - value="13" /> - </combo_box> + value="13"> + <item.columns + halign="center" + type="icon" + value="Parcel_PG_Light" + width="20"/> + </icons_combo_box.item> + </icons_combo_box> <button enabled="false" follows="left|top" @@ -204,7 +229,7 @@ <button follows="left|top" height="20" - label="Teleport Home One User..." + label="Teleport Home One Resident..." layout="topleft" left="10" name="kick_btn" @@ -213,7 +238,7 @@ <button follows="left|top" height="20" - label="Teleport Home All Users..." + label="Teleport Home All Residents..." layout="topleft" left_delta="0" name="kick_all_btn" diff --git a/indra/newview/skins/default/xui/en/panel_region_general_layout.xml b/indra/newview/skins/default/xui/en/panel_region_general_layout.xml index 525c5aa8e7..ffa1a257d5 100644 --- a/indra/newview/skins/default/xui/en/panel_region_general_layout.xml +++ b/indra/newview/skins/default/xui/en/panel_region_general_layout.xml @@ -203,7 +203,7 @@ <button follows="left|top" height="20" - label="Teleport Home One User..." + label="Teleport Home One Resident..." layout="topleft" left="10" name="kick_btn" @@ -212,7 +212,7 @@ <button follows="left|top" height="20" - label="Teleport Home All Users..." + label="Teleport Home All Residents..." layout="topleft" left_delta="0" name="kick_all_btn" diff --git a/indra/newview/skins/default/xui/en/panel_region_texture.xml b/indra/newview/skins/default/xui/en/panel_region_texture.xml index 04dbf73be9..5d910ea659 100644 --- a/indra/newview/skins/default/xui/en/panel_region_texture.xml +++ b/indra/newview/skins/default/xui/en/panel_region_texture.xml @@ -148,103 +148,33 @@ name="height_text_lbl6" top="185" width="100"> - Southwest - </text> - <text - follows="left|top" - height="20" - layout="topleft" - left_pad="10" - name="height_text_lbl7" - top_delta="0" - width="100"> Northwest </text> - <spinner - follows="left|top" - height="20" - increment="0.5" - label="Low" - label_width="37" - layout="topleft" - left="10" - max_val="500" - min_val="-500" - name="height_start_spin_0" - top_delta="15" - width="100" /> - <spinner - follows="left|top" - height="20" - increment="0.5" - label="Low" - label_width="37" - layout="topleft" - left_pad="10" - max_val="500" - min_val="-500" - name="height_start_spin_1" - top_delta="0" - width="100" /> - <spinner - follows="left|top" - height="20" - increment="0.5" - label="High" - label_width="37" - layout="topleft" - left="10" - max_val="500" - min_val="-500" - name="height_range_spin_0" - top_delta="20" - width="100" /> - <spinner - follows="left|top" - height="20" - increment="0.5" - label="High" - label_width="37" - layout="topleft" - left_pad="10" - max_val="500" - min_val="-500" - name="height_range_spin_1" - top_delta="0" - width="100" /> - <text - follows="left|top" - height="20" - layout="topleft" - left="51" - name="height_text_lbl8" - top_pad="10" - width="100"> - Southeast - </text> <text follows="left|top" height="20" layout="topleft" left_pad="10" - name="height_text_lbl9" + name="height_text_lbl7" top_delta="0" width="100"> Northeast </text> - <spinner - follows="left|top" - height="20" - increment="0.5" - label="Low" - label_width="37" - layout="topleft" - left="10" - max_val="500" - min_val="-500" - name="height_start_spin_2" - top_delta="15" - width="100" /> +<!-- northwest low--> + <spinner + follows="left|top" + height="20" + increment="0.5" + label="Low" + label_width="37" + layout="topleft" + left="10" + max_val="500" + min_val="-500" + name="height_start_spin_1" + top_delta="15" + width="100" /> +<!-- northeast low--> <spinner follows="left|top" height="20" @@ -258,20 +188,22 @@ name="height_start_spin_3" top_delta="0" width="100" /> - <spinner - follows="left|top" - height="20" - increment="0.5" - label="High" - label_width="37" - layout="topleft" - left="10" - max_val="500" - min_val="-500" - name="height_range_spin_2" - top_delta="20" - width="100" /> - <spinner +<!-- northwest high--> + <spinner + follows="left|top" + height="20" + increment="0.5" + label="High" + label_width="37" + layout="topleft" + left="10" + max_val="500" + min_val="-500" + name="height_range_spin_1" + top_delta="20" + width="100" /> +<!-- northeast high--> + <spinner follows="left|top" height="20" increment="0.5" @@ -284,18 +216,94 @@ name="height_range_spin_3" top_delta="0" width="100" /> - <text - follows="left|top" - height="20" - layout="topleft" - left="10" - name="height_text_lbl10" - top_delta="30" - width="400" - word_wrap="true"> - These values represent the blend range for the textures above. - </text> - <text + <text + follows="left|top" + height="20" + layout="topleft" + left="51" + name="height_text_lbl8" + top_pad="10" + width="100"> + Southwest + </text> + <text + follows="left|top" + height="20" + layout="topleft" + left_pad="10" + name="height_text_lbl9" + top_delta="0" + width="100"> + Southeast + </text> +<!-- southwest low--> + <spinner + follows="left|top" + height="20" + increment="0.5" + label="Low" + label_width="37" + layout="topleft" + left="10" + max_val="500" + min_val="-500" + name="height_start_spin_0" + top_delta="15" + width="100" /> +<!-- southeast low--> + <spinner + follows="left|top" + height="20" + increment="0.5" + label="Low" + label_width="37" + layout="topleft" + left_pad="10" + max_val="500" + min_val="-500" + name="height_start_spin_2" + top_delta="0" + width="100" /> +<!--southwest high--> + <spinner + follows="left|top" + height="20" + increment="0.5" + label="High" + label_width="37" + layout="topleft" + left="10" + max_val="500" + min_val="-500" + name="height_range_spin_0" + top_delta="20" + width="100" /> +<!-- southeast high--> + <spinner + follows="left|top" + height="20" + increment="0.5" + label="High" + label_width="37" + layout="topleft" + left_pad="10" + max_val="500" + min_val="-500" + name="height_range_spin_2" + top_delta="0" + width="100" /> + <text + follows="left|top" + height="20" + layout="topleft" + left="10" + name="height_text_lbl10" + top_delta="30" + width="400" + word_wrap="true"> + These values represent the blend range for the textures above. + </text> + <text follows="left|top" height="20" layout="topleft" diff --git a/indra/newview/skins/default/xui/en/panel_script_ed.xml b/indra/newview/skins/default/xui/en/panel_script_ed.xml index d14355b9f4..c5c66c04d5 100644 --- a/indra/newview/skins/default/xui/en/panel_script_ed.xml +++ b/indra/newview/skins/default/xui/en/panel_script_ed.xml @@ -143,7 +143,6 @@ name="Script Editor" width="487" show_line_numbers="true" - handle_edit_keys_directly="true" word_wrap="true"> Loading... </text_editor> @@ -178,5 +177,5 @@ top_pad="-35" right="487" name="Save_btn" - width="61" /> + width="81" /> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_scrolling_param.xml b/indra/newview/skins/default/xui/en/panel_scrolling_param.xml index 44afadf65a..78d64620a5 100644 --- a/indra/newview/skins/default/xui/en/panel_scrolling_param.xml +++ b/indra/newview/skins/default/xui/en/panel_scrolling_param.xml @@ -1,34 +1,38 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel - height="152" + height="157" layout="topleft" left="0" name="LLScrollingPanelParam" top="152" - width="270"> + width="290"> <text follows="left|top" height="16" layout="topleft" - left="4" + left="12" name="min param text" - top="116" - width="128" /> + text_color="EmphasisColor" + font_shadow="hard" + top="120" + width="120" /> <text follows="left|top" height="16" layout="topleft" - left_pad="6" + left="155" name="max param text" + text_color="EmphasisColor" + font_shadow="hard" top_delta="0" - width="128" /> + width="120" /> <text type="string" length="1" follows="left|top" height="16" layout="topleft" - left="8" + left="12" name="Loading..." top="11" width="128"> @@ -40,12 +44,42 @@ follows="left|top" height="16" layout="topleft" - left_pad="6" + left="155" name="Loading...2" top_delta="0" width="128"> Loading... </text> + <view_border + layout="topleft" + follows="left|top" + left="7" + top="5" + width="132" + height="132" + thickness="2" + shadow_light_color="0.3 0.3 0.3 1" + highlight_light_color="0.3 0.3 0.3 1" + highlight_dark_color="0.3 0.3 0.3 1" + shadow_dark_color="0.3 0.3 0.3 1" + bevel_style="in" + name="left_border" + /> + <view_border + layout="topleft" + follows="left|top" + left_pad="10" + top_delta="0" + width="132" + height="132" + thickness="2" + shadow_light_color="0.3 0.3 0.3 1" + highlight_light_color="0.3 0.3 0.3 1" + highlight_dark_color="0.3 0.3 0.3 1" + shadow_dark_color="0.3 0.3 0.3 1" + bevel_style="in" + name="right_border" + /> <button enabled="false" height="132" @@ -54,10 +88,10 @@ image_selected="PushButton_Selected" image_unselected="PushButton_Off" layout="topleft" - left="2" + left="7" name="less" tab_stop="false" - top="0" + top="5" width="132" /> <button enabled="false" @@ -67,7 +101,7 @@ image_selected="PushButton_Selected" image_unselected="PushButton_Off" layout="topleft" - left_pad="2" + left_pad="10" name="more" tab_stop="false" top_delta="0" @@ -80,11 +114,11 @@ increment="1" initial_value="0" label="[DESC]" - label_width="100" - layout="topleft" + layout="bottom|left" left="6" max_val="100" name="param slider" - top="134" - width="258" /> + bottom="1" + width="274" + slider_label.font.style="BOLD" /> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_side_tray.xml b/indra/newview/skins/default/xui/en/panel_side_tray.xml index eb95de3a7c..6ef93406ec 100644 --- a/indra/newview/skins/default/xui/en/panel_side_tray.xml +++ b/indra/newview/skins/default/xui/en/panel_side_tray.xml @@ -54,12 +54,19 @@ mouse_opaque="false" background_visible="true" > + <panel_container + name="panel_container" + default_panel_name="panel_me" + width="333" + > <panel class="panel_me" name="panel_me" filename="panel_me.xml" label="Me" /> + + </panel_container> </sidetray_tab> <sidetray_tab diff --git a/indra/newview/skins/default/xui/en/panel_stand_stop_flying.xml b/indra/newview/skins/default/xui/en/panel_stand_stop_flying.xml index b48943c699..07642946f8 100644 --- a/indra/newview/skins/default/xui/en/panel_stand_stop_flying.xml +++ b/indra/newview/skins/default/xui/en/panel_stand_stop_flying.xml @@ -6,25 +6,27 @@ name="panel_stand_stop_flying" mouse_opaque="false" visible="true" - width="115"> + width="133"> <button follows="left|bottom" height="19" label="Stand" layout="topleft" + left="10" name="stand_btn" tool_tip="Click here to stand up." top="2" visible="false" - width="115" /> + width="113" /> <button follows="left|bottom" height="19" label="Stop Flying" layout="topleft" + left="10" name="stop_fly_btn" tool_tip="Stop flying" top="2" visible="false" - width="115" /> + width="113" /> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_status_bar.xml b/indra/newview/skins/default/xui/en/panel_status_bar.xml index 5754f67045..43513e1ab6 100644 --- a/indra/newview/skins/default/xui/en/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/en/panel_status_bar.xml @@ -3,6 +3,7 @@ background_opaque="true" background_visible="true" bg_opaque_color="MouseGray" + chrome="true" follows="top|right" height="19" layout="topleft" @@ -10,6 +11,7 @@ mouse_opaque="false" name="status" top="19" + tab_stop="false" width="1000"> <panel.string name="StatBarDaysOfWeek"> @@ -39,41 +41,50 @@ name="buycurrencylabel"> L$ [AMT] </panel.string> - <button + <panel + height="18" + left="-315" + width="95" + top="1" + follows="right|top" + name="balance_bg" + bg_visible="true" + background_opaque="true" + bg_opaque_image="bevel_background"> + <text auto_resize="true" - halign="right" + halign="center" font="SansSerifSmall" - follows="right|top" - image_overlay="" - image_selected="spacer35.tga" - image_unselected="spacer35.tga" - image_pressed="spacer35.tga" - height="16" - right="-204" - label_shadow="false" - name="buycurrency" + follows="all" + height="18" + left="0" + name="balance" tool_tip="My Balance" - top="3" - width="100" /> + v_pad="4" + top="0" + wrap="false" + value="L$20" + width="40" /> <button auto_resize="true" - halign="right" + halign="center" font="SansSerifSmall" - follows="right|top" - image_selected="BuyArrow_Over" - image_unselected="BuyArrow_Over" - image_pressed="BuyArrow_Press" - height="16" - label="Buy L$" - label_color="EmphasisColor" + follows="right|top|bottom" + image_hover_unselected="buy_over" + image_unselected="buy_off" + image_pressed="buy_press" + height="18" + label="BUY L$" + label_color="White" left_pad="0" - label_shadow="false" + label_shadow="true" name="buyL" - pad_right="20" + pad_right="0" pad_bottom="2" tool_tip="Click to buy more L$" - top="2" - width="71" /> + top="0" + width="55" /> + </panel> <text type="string" font="SansSerifSmall" @@ -86,17 +97,31 @@ left_pad="0" name="TimeText" tool_tip="Current time (Pacific)" - width="89"> + width="145"> 24:00 AM PST </text> <button follows="right|top" - height="15" + height="16" + image_selected="Play_Off" + image_unselected="Pause_Off" + image_pressed="Pause_Press" + image_pressed_selected="Play_Press" + is_toggle="true" + left_pad="15" + top="1" + name="media_toggle_btn" + tool_tip="Start/Stop All Media (Music, Video, Web pages)" + width="16" > + </button> + <button + follows="right|top" + height="16" image_selected="AudioMute_Off" image_pressed="Audio_Press" image_unselected="Audio_Off" is_toggle="true" - left_pad="18" + left_pad="5" top="2" name="volume_btn" tool_tip="Global Volume Control" diff --git a/indra/newview/skins/default/xui/en/panel_teleport_history.xml b/indra/newview/skins/default/xui/en/panel_teleport_history.xml index 06da64533b..daa4356c83 100644 --- a/indra/newview/skins/default/xui/en/panel_teleport_history.xml +++ b/indra/newview/skins/default/xui/en/panel_teleport_history.xml @@ -1,15 +1,21 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<panel name="Teleport History" bottom="0" height="326" left="0" width="380" +<panel name="Teleport History" bottom="0" height="400" left="0" width="313" help_topic="panel_teleport_history" - border="true" follows="left|top|right|bottom"> + border="false" follows="left|top|right|bottom" + background_visible="true" + bg_alpha_color="DkGray"> <accordion + no_matched_tabs_text.value="Didn't find what you're looking for? Try [secondlife:///app/search/places/[SEARCH_TERM] Search]." + no_visible_tabs_text.value="Teleport history is empty. Try [secondlife:///app/search/places/ Search]." follows="left|top|right|bottom" - height="300" + height="373" layout="topleft" - left="0" + left="3" top="0" name="history_accordion" - width="380"> + background_visible="true" + bg_alpha_color="DkGray2" + width="307"> <accordion_tab layout="topleft" name="today" @@ -21,7 +27,7 @@ left="0" name="today_items" top="0" - width="380"> + width="307"> </flat_list_view> </accordion_tab> <accordion_tab @@ -35,7 +41,7 @@ left="0" name="yesterday_items" top="0" - width="380"> + width="307"> </flat_list_view> </accordion_tab> <accordion_tab @@ -49,7 +55,7 @@ left="0" name="2_days_ago" top="0" - width="380"> + width="307"> </flat_list_view> </accordion_tab> <accordion_tab @@ -63,7 +69,7 @@ left="0" name="3_days_ago" top="0" - width="380"> + width="307"> </flat_list_view> </accordion_tab> <accordion_tab @@ -77,7 +83,7 @@ left="0" name="4_days_ago" top="0" - width="380"> + width="307"> </flat_list_view> </accordion_tab> <accordion_tab @@ -91,7 +97,7 @@ left="0" name="5_days_ago_items" top="0" - width="380"> + width="307"> </flat_list_view> </accordion_tab> <accordion_tab @@ -105,7 +111,7 @@ left="0" name="6_days_and_older_items" top="0" - width="380"> + width="307"> </flat_list_view> </accordion_tab> <accordion_tab @@ -119,7 +125,7 @@ left="0" name="1_month_and_older_items" top="0" - width="380"> + width="307"> </flat_list_view> </accordion_tab> <accordion_tab @@ -133,33 +139,41 @@ left="0" name="6_months_and_older_items" top="0" - width="380"> + width="307"> </flat_list_view> </accordion_tab> </accordion> <panel background_visible="true" bevel_style="none" - top_pad="0" + bottom="0" follows="left|right|bottom" - height="30" - label="bottom_panel" - layout="topleft" - left="0" + height="27" + layout="bottomleft" + left="3" name="bottom_panel" - width="380"> + width="313"> <button follows="bottom|left" - font="SansSerifBigBold" - tool_tip="Show additional optioins" - height="18" - image_disabled="OptionsMenu_Disabled" - image_selected="OptionsMenu_Press" - image_unselected="OptionsMenu_Off" + tool_tip="Show additional options" + height="25" + image_hover_unselected="Toolbar_Left_Over" + image_overlay="OptionsMenu_Off" + image_selected="Toolbar_Left_Selected" + image_unselected="Toolbar_Left_Off" layout="topleft" - left="10" + left="0" name="gear_btn" - top="5" - width="18" /> + top="1" + width="31" /> + <icon + follows="bottom|left" + height="25" + image_name="Toolbar_Right_Off" + layout="topleft" + left_pad="1" + name="dummy_icon" + width="273" + /> </panel> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_toast.xml b/indra/newview/skins/default/xui/en/panel_toast.xml index bfe3cce7d0..92b4c17247 100644 --- a/indra/newview/skins/default/xui/en/panel_toast.xml +++ b/indra/newview/skins/default/xui/en/panel_toast.xml @@ -3,17 +3,25 @@ <!-- Don't remove floater's height! It is needed for Overflow and Start-Up toasts!--> +<!-- + This floater is invisible. To make toast look like a floater we render wrapper_panel + like a floater(draw shadows and so on). This is done with one purpose - make close button + look like it is positioned out of floater and able to accept mouse clicks (see EXT-4246) +--> + <floater - legacy_header_height="18" + legacy_header_height="0" + header_height="0" name="toast" title="" visible="false" layout="topleft" - height="40" - width="305" + height="47" + width="310" left="0" top="0" follows="right|bottom" + background_visible="false" bg_opaque_image="Toast_Over" bg_alpha_image="Toast_Background" can_minimize="false" @@ -27,12 +35,27 @@ drop_shadow_visible = "false" border = "false" > + <panel + background_opaque="false" + border_visible="false" + background_visible="true" + bg_opaque_image="Toast_Over" + bg_alpha_image="Toast_Background" + label="wrapper_panel" + layout="topleft" + left="0" + name="wrapper_panel" + top="7" + height="40" + follows="all" + translate="false" + width="305"> <!-- Don't remove this wiget! It is needed for Overflow and Start-Up toasts!--> <text clip_partial="true" visible="false" follows="left|top|right|bottom" - font="SansSerifBold" + font="SansSerif" height="20" layout="topleft" left="20" @@ -41,15 +64,15 @@ text_color="white" top="5" translate="false" - v_pad="5" use_ellipses="true" width="260"> Toast text; </text> + </panel> <button layout="topleft" - top="-14" - left="293" + top="0" + right="310" width="17" height="17" follows="top|right" diff --git a/indra/newview/skins/default/xui/en/panel_topinfo_bar.xml b/indra/newview/skins/default/xui/en/panel_topinfo_bar.xml new file mode 100644 index 0000000000..d3fb77f135 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_topinfo_bar.xml @@ -0,0 +1,102 @@ +<?xml version="1.0" encoding="UTF-8"?> +<panel + background_visible="true" + background_opaque="false" + bg_opaque_color="Black_50" + bg_alpha_color="Black_50" + follows="left|top|right" + height="19" + layout="topleft" + name="topinfo_bar" + width="1024"> + <button + border="true" + follows="left|top" + height="16" + hover_glow_amount="0.15" + image_disabled="Info_Off" + image_disabled_selected="Info_Off" + image_selected="Info_Off" + image_unselected="Info_Off" + left="11" + name="place_info_btn" + top="1" + width="16"/> + <text + follows="left|top|right" + font="DejaVu" + height="16" + layout="topleft" + left_pad="11" + length="1" + name="parcel_info_text" + top="1" + type="string" + width="1"/> + <icon + enabled="true" + follows="right|top" + height="18" + image_name="Parcel_VoiceNo_Light" + name="voice_icon" + top="1" + visible="false" + width="22" + /> + <icon + follows="right|top" + height="18" + image_name="Parcel_FlyNo_Light" + name="fly_icon" + top="1" + visible="false" + width="22" + /> + <icon + follows="right|top" + height="18" + image_name="Parcel_PushNo_Light" + name="push_icon" + top="1" + visible="false" + width="22" + /> + <icon + follows="right|top" + height="18" + image_name="Parcel_BuildNo_Light" + name="build_icon" + top="1" + visible="false" + width="22" + /> + <icon + follows="right|top" + height="18" + image_name="Parcel_ScriptsNo_Light" + name="scripts_icon" + top="1" + visible="false" + width="22" + /> + <icon + follows="right|top" + height="13" + image_name="Parcel_Health_Dark" + left="2" + name="damage_icon" + top="3" + visible="false" + width="14" + /> + <text + follows="right|top" + font="SansSerifSmall" + halign="right" + height="18" + name="damage_text" + top="5" + visible="false" + width="35" + /> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_voice_effect.xml b/indra/newview/skins/default/xui/en/panel_voice_effect.xml new file mode 100644 index 0000000000..93e79b7328 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_voice_effect.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + follows="all" + height="26" + layout="topleft" + name="panel_voice_effect" + width="200"> + <string name="no_voice_effect"> + Voice Morphing Off + </string> + <string name="preview_voice_effects"> + Preview Voice Morphing â–¶ + </string> + <string name="get_voice_effects"> + Get Voice Morphing â–¶ + </string> + <combo_box + enabled="false" + follows="left|top|right" + height="23" + name="voice_effect" + tool_tip="Select a Voice Morph to change your voice" + top_pad="0" + width="200"> + <combo_box.item + label="Voice Morphing Off" + name="no_voice_effect" + top_pad="0" + value="0" /> + <combo_box.commit_callback + function="Voice.CommitVoiceEffect" /> + </combo_box> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_volume_pulldown.xml b/indra/newview/skins/default/xui/en/panel_volume_pulldown.xml index 60d4a7e00b..7b22b2cce1 100644 --- a/indra/newview/skins/default/xui/en/panel_volume_pulldown.xml +++ b/indra/newview/skins/default/xui/en/panel_volume_pulldown.xml @@ -1,24 +1,17 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel background_opaque="true" - background_visible="false" + background_visible="true" + bg_opaque_image="Volume_Background" + bg_alpha_image="Volume_Background" border_visible="false" border="false" - chrome="true" + chrome="true" follows="bottom" height="150" layout="topleft" name="volumepulldown_floater" width="32"> - <!-- floater background image --> - <icon - height="150" - image_name="Inspector_Background" - layout="topleft" - left="0" - name="normal_background" - top="0" - width="32" /> <slider control_name="AudioLevelMaster" follows="left|top" @@ -39,9 +32,9 @@ parameter="MuteAudio" /> </slider> <button - left="7" + left="10" top_pad="9" - width="18" + width="12" height="12" follows="top|left" name="prefs_btn" diff --git a/indra/newview/skins/default/xui/en/panel_world_map.xml b/indra/newview/skins/default/xui/en/panel_world_map.xml index 9f08d3a817..16860a6117 100644 --- a/indra/newview/skins/default/xui/en/panel_world_map.xml +++ b/indra/newview/skins/default/xui/en/panel_world_map.xml @@ -45,6 +45,14 @@ name="world_map_northwest"> NW </panel.string> + <panel.string + name="world_map_person"> + 1 person + </panel.string> + <panel.string + name="world_map_people"> + [NUMBER] people + </panel.string> <text type="string" length="1" diff --git a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml index bde45a9487..e189d11d35 100644 --- a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml +++ b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel background_visible="true" +default_tab_group="1" follows="all" height="570" label="Outfits" @@ -14,83 +15,117 @@ width="333"> <string name="No Outfit" value="No Outfit" /> + <string + name="Unsaved Changes" + value="Unsaved changes" /> + <string + name="Now Wearing" + value="Now wearing..." /> <panel - left="0" - top="0" - follows="all" + background_opaque="true" + background_visible="true" + bg_opaque_color="DkGray2" + left="10" + top="5" + follows="left|top|right" layout="topleft" - width="330" + width="303" height="33" name="panel_currentlook" > <button follows="left|top" - top="0" width="1" height="1" + left="205" top="7" width="20" height="20" + label="E" layout="topleft" - left="0" - name="editappearance_btn" /> + name="editappearance_btn" + visible="false" /> <button follows="left|top" - top="0" width="1" height="1" + left="235" top="7" width="20" height="20" + label="O" layout="topleft" - left="0" - name="openoutfit_btn" /> + name="openoutfit_btn" + visible="false" /> <icon follows="top|left" - height="30" + height="32" image_name="TabIcon_Appearance_Off" name="outfit_icon" mouse_opaque="false" visible="true" - left="5" + left="0" top="0" - width="30" /> + width="32" /> <text - font="SansSerifHugeBold" - height="20" - left_pad="5" - text_color="LtGray" + font="SansSerifSmallBold" + text_color="EmphasisColor" + width="300" + height="10" + follows="top|left" + layout="topleft" + left="35" top="3" + mouse_opaque="false" + name="currentlook_status" > + (Status) + </text> + <text + font="SansSerifLargeBold" + height="20" + left="35" + text_color="White" + top="15" use_ellipses="true" - width="305" + width="230" follows="top|left" - word_wrap="true" + word_wrap="false" mouse_opaque="false" name="currentlook_name"> MyOutfit With a really Long Name like MOOSE </text> - <text - font="SansSerifSmall" - text_color="White_50" - width="300" - height="1" - follows="top|left" + <button + follows="left|top" + height="23" + image_overlay="Edit_Wrench" + label="" layout="topleft" - top_pad="5" - mouse_opaque="false" - name="currentlook_title" > - (unsaved) - </text> + left="265" + name="edit_outfit_btn" + tool_tip="Edit this outfit" + top="7" + width="30" /> + <loading_indicator + follows="left|top" + height="24" + layout="topleft" + left="268" + name="wearables_loading_indicator" + top="6" + width="24" /> </panel> <filter_editor height="23" follows="left|top|right" layout="topleft" - left="15" + left="10" label="Filter Outfits" max_length="300" name="Filter" + search_button_visible="true" top_pad="10" width="303" /> <panel class="panel_outfits_inventory" filename="panel_outfits_inventory.xml" name="panel_outfits_inventory" - height="505" + height="493" min_height="410" width="320" + visible="false" left="0" - top_pad="0" + tab_group="1" + top_pad="6" follows="all" /> <!-- <button follows="bottom|left" @@ -102,14 +137,17 @@ width="333"> name="newlook_btn" width="100" />--> <panel - class="panel_look_info" - filename="panel_look_info.xml" + class="panel_outfit_edit" + filename="panel_outfit_edit.xml" + height="565" follows="all" layout="topleft" - left="0" - name="panel_look_info" - top="35" - visible="false" /> + left="5" + min_height="410" + name="panel_outfit_edit" + top="2" + visible="false" + width="320"/> <panel class="panel_edit_wearable" filename="panel_edit_wearable.xml" @@ -117,6 +155,6 @@ width="333"> layout="topleft" left="0" name="panel_edit_wearable" - top="35" + top="0" visible="false" /> </panel> diff --git a/indra/newview/skins/default/xui/en/sidepanel_inventory.xml b/indra/newview/skins/default/xui/en/sidepanel_inventory.xml index fb5f9d2ec8..6c9acae35e 100644 --- a/indra/newview/skins/default/xui/en/sidepanel_inventory.xml +++ b/indra/newview/skins/default/xui/en/sidepanel_inventory.xml @@ -32,10 +32,10 @@ width="330" /> <panel height="25" - layout="bottomright" + layout="topleft" name="button_panel" - left="5" - bottom="5" + left="9" + top_pad="-2" width="313"> <button enabled="true" @@ -45,18 +45,42 @@ layout="topleft" left="0" name="info_btn" + tool_tip="Show object profile" + top="0" + width="102" /> + <button + enabled="true" + follows="bottom|left" + height="23" + label="Share" + layout="topleft" + left="105" + name="share_btn" + tool_tip="Share an inventory item" + top="0" + width="102" /> + <button + enabled="true" + follows="bottom|left" + height="23" + label="Shop" + layout="topleft" + left="210" + name="shop_btn" + tool_tip="Open Marketplace webpage" top="0" - width="100" /> + width="102" /> <button enabled="false" follows="bottom|left" height="23" label="Wear" layout="topleft" - left="130" + left="210" name="wear_btn" + tool_tip="Wear seleceted outfit" top="0" - width="100" /> + width="102" /> <button enabled="false" follows="bottom|left" @@ -64,19 +88,20 @@ label="Play" layout="topleft" name="play_btn" - left="130" + left="210" top="0" - width="80" /> + width="102" /> <button enabled="false" follows="bottom|left" height="23" label="Teleport" layout="topleft" - left="130" + left="210" name="teleport_btn" + tool_tip="Teleport to the selected area" top="0" - width="100" /> + width="102" /> </panel> </panel> diff --git a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml index 18b59741bf..b3bc618eec 100644 --- a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml @@ -40,23 +40,25 @@ width="18" /> <button follows="top|right" - height="23" - image_overlay="BackArrow_Off" + height="24" + image_hover_unselected="BackButton_Over" + image_pressed="BackButton_Press" + image_unselected="BackButton_Off" layout="topleft" - left="10" + left="12" name="back_btn" tab_stop="false" - top="0" - width="23" /> + top="2" + width="30" /> <text follows="top|left|right" font="SansSerifHugeBold" height="26" layout="topleft" - left_pad="10" + left_pad="3" name="title" text_color="LtGray" - top="0" + top="2" use_ellipses="true" value="Object Profile" width="275" /> @@ -71,10 +73,10 @@ width="150" /> <panel follows="all" - height="490" + height="493" label="" layout="topleft" - left="10" + left="9" help_topic="" top="45" width="313" @@ -157,59 +159,59 @@ name="LabelCreatorName" top_delta="6" width="140"> - Nicole Linden - </text> - <button - follows="top|right" - height="23" - label="Profile" - layout="topleft" - right="-1" - name="BtnCreator" - top_delta="-6" - width="78" /> - <text - type="string" - length="1" - follows="left|top" - height="23" - layout="topleft" - left="5" - name="LabelOwnerTitle" - top_pad="10" - width="78"> - Owner: - </text> - <avatar_icon - follows="top|left" - height="20" - default_icon_name="Generic_Person" - layout="topleft" - left_pad="0" - top_delta="-6" - mouse_opaque="true" - width="20" /> - <text - type="string" - follows="left|right|top" - font="SansSerifSmall" - height="15" - layout="topleft" - left_pad="5" - name="LabelOwnerName" - top_delta="6" - width="140"> - Thrax Linden - </text> + </text> + <button + follows="top|right" + height="16" + image_selected="Inspector_I" + image_unselected="Inspector_I" + layout="topleft" + right="-5" + name="BtnCreator" + top_delta="-6" + width="16" /> + <text + type="string" + length="1" + follows="left|top" + height="23" + layout="topleft" + left="5" + name="LabelOwnerTitle" + top_pad="10" + width="78"> + Owner: + </text> + <avatar_icon + follows="top|left" + height="20" + default_icon_name="Generic_Person" + layout="topleft" + left_pad="0" + top_delta="-6" + mouse_opaque="true" + width="20" /> + <text + type="string" + follows="left|right|top" + font="SansSerifSmall" + height="15" + layout="topleft" + left_pad="5" + name="LabelOwnerName" + top_delta="6" + width="140"> + </text> <button follows="top|right" - height="23" - label="Profile" + height="16" + image_selected="Inspector_I" + image_unselected="Inspector_I" layout="topleft" - right="-1" + right="-5" name="BtnOwner" top_delta="-3" - width="78" /> + width="16" /> <text type="string" length="1" @@ -232,15 +234,12 @@ top_pad="10" name="LabelAcquiredDate" top_delta="0" width="222"> - Wed May 24 12:50:46 2006 </text> <panel border="false" follows="left|top" layout="topleft" mouse_opaque="false" - background_visible="true" - bg_alpha_color="DkGray" name="perms_inv" left="0" top_pad="25" @@ -393,17 +392,17 @@ top_pad="10" label_width="75" left="120" width="170" - min_val="1" + min_val="0" height="23" max_val="999999999" top_pad="10"/> </panel> <panel height="30" - layout="bottomright" + layout="topleft" name="button_panel" left="5" - bottom="2" + top_pad="0" width="313"> <button height="23" diff --git a/indra/newview/skins/default/xui/en/sidepanel_task_info.xml b/indra/newview/skins/default/xui/en/sidepanel_task_info.xml index d2c9e56bc3..faa1ae4e8b 100644 --- a/indra/newview/skins/default/xui/en/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/en/sidepanel_task_info.xml @@ -58,14 +58,16 @@ </panel.string> <button follows="top|right" - height="23" - image_overlay="BackArrow_Off" + height="24" + image_hover_unselected="BackButton_Over" + image_pressed="BackButton_Press" + image_unselected="BackButton_Off" layout="topleft" - left="10" + left="8" name="back_btn" tab_stop="false" top="0" - width="23" /> + width="30" /> <text follows="top|left|right" font="SansSerifHuge" @@ -77,7 +79,7 @@ top="0" use_ellipses="true" value="Object Profile" - width="275" /> + width="290" /> <text follows="top|left" height="13" @@ -94,6 +96,7 @@ layout="topleft" left="10" help_topic="" + name="properties_panel" top="45" width="313" background_visible="true" @@ -302,7 +305,7 @@ follows="left|top|right" layout="topleft" name="perm_modify" - width="200"> + width="310"> You can modify this object </text> <text @@ -549,5 +552,16 @@ name="buy_btn" top="0" width="100" /> + <button + follows="bottom|left" + height="23" + label="Details" + layout="topleft" + left="5" + name="details_btn" + top="0" + width="100" + visible="false" /> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index d6db451286..68eea8dc9a 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -14,7 +14,14 @@ <!-- starting up --> <string name="StartupDetectingHardware">Detecting hardware...</string> - <string name="StartupLoading">Loading</string> + <string name="StartupLoading">Loading [APP_NAME]...</string> + <string name="StartupClearingCache">Clearing cache...</string> + <string name="StartupInitializingTextureCache">Initializing Texture Cache...</string> + <string name="StartupInitializingVFS">Initializing VFS...</string> + + <!-- progress --> + <string name="ProgressRestoring">Restoring...</string> + <string name="ProgressChangingResolution">Changing Resolution...</string> <!-- Legacy strings, almost never used --> <string name="Fullbright">Fullbright (Legacy)</string> <!-- used in the Build > materials dropdown--> @@ -39,13 +46,26 @@ <string name="LoginWaitingForRegionHandshake">Waiting for region handshake...</string> <string name="LoginConnectingToRegion">Connecting to region...</string> <string name="LoginDownloadingClothing">Downloading clothing...</string> + <string name="InvalidCertificate">The server returned an invalid or corrupt certificate. Please contact the Grid administrator.</string> + <string name="CertInvalidHostname">An invalid hostname was used to access the server, please check your SLURL or Grid hostname.</string> + <string name="CertExpired">The certificate returned by the Grid appears to be expired. Please check your system clock, or contact your Grid administrator.</string> + <string name="CertKeyUsage">The certificate returned by the server could not be used for SSL. Please contact your Grid administrator.</string> + <string name="CertBasicConstraints">Too many certificates were in the servers Certificate chain. Please contact your Grid administrator.</string> + <string name="CertInvalidSignature">The certificate signature returned by the Grid server could not be verified. Please contact your Grid administrator.</string> + <string name="LoginFailedNoNetwork">Network Error: Could not establish connection, please check your network connection.</string> + <string name="LoginFailed">Login failed.</string> <string name="Quit">Quit</string> <string name="create_account_url">http://join.secondlife.com/</string> <!-- Disconnection --> <string name="AgentLostConnection">This region may be experiencing trouble. Please check your connection to the Internet.</string> - + <string name="SavingSettings">Saving your settings...</string> + <string name="LoggingOut">Logging out...</string> + <string name="ShuttingDown">Shutting down...</string> + <string name="YouHaveBeenDisconnected">You have been disconnected from the region you were in.</string> + <string name="SentToInvalidRegion">You were sent to an invalid region.</string> + <string name="TestingDisconnect">Testing viewer disconnect</string> <!-- Tooltip, lltooltipview.cpp --> <string name="TooltipPerson">Person</string><!-- Object under mouse pointer is an avatar --> @@ -68,6 +88,12 @@ <string name="TooltipHttpUrl">Click to view this web page</string> <string name="TooltipSLURL">Click to view this location's information</string> <string name="TooltipAgentUrl">Click to view this Resident's profile</string> + <string name="TooltipAgentMute">Click to mute this Resident</string> + <string name="TooltipAgentUnmute">Click to unmute this Resident</string> + <string name="TooltipAgentIM">Click to IM this Resident</string> + <string name="TooltipAgentPay">Click to Pay this Resident</string> + <string name="TooltipAgentOfferTeleport">Click to offer a teleport request to this Resident</string> + <string name="TooltipAgentRequestFriend">Click to send a friend request to this Resident</string> <string name="TooltipGroupUrl">Click to view this group's description</string> <string name="TooltipEventUrl">Click to view this event's description</string> <string name="TooltipClassifiedUrl">Click to view this classified</string> @@ -76,15 +102,26 @@ <string name="TooltipObjectIMUrl">Click to view this object's description</string> <string name="TooltipMapUrl">Click to view this location on a map</string> <string name="TooltipSLAPP">Click to run the secondlife:// command</string> - <string name="CurrentURL" value=" CurrentURL: [CurrentURL]" /> + <string name="CurrentURL" value=" CurrentURL: [CurrentURL]" /> + <string name="TooltipPrice" value=" L$[PRICE]-" /> + <!-- text for SLURL labels --> <string name="SLurlLabelTeleport">Teleport to</string> <string name="SLurlLabelShowOnMap">Show Map for</string> + <!-- label strings for secondlife:///app/agent SLapps --> + <string name="SLappAgentMute">Mute</string> + <string name="SLappAgentUnmute">Unmute</string> + <string name="SLappAgentIM">IM</string> + <string name="SLappAgentPay">Pay</string> + <string name="SLappAgentOfferTeleport">Offer Teleport to </string> + <string name="SLappAgentRequestFriend">Friend Request </string> + <!-- ButtonToolTips, llfloater.cpp --> <string name="BUTTON_CLOSE_DARWIN">Close (⌘W)</string> <string name="BUTTON_CLOSE_WIN">Close (Ctrl+W)</string> + <string name="BUTTON_CLOSE_CHROME">Close</string> <string name="BUTTON_RESTORE">Restore</string> <string name="BUTTON_MINIMIZE">Minimize</string> <string name="BUTTON_TEAR_OFF">Tear Off</string> @@ -99,7 +136,7 @@ <string name="RetrievingData">Retrieving...</string> <string name="ReleaseNotes">Release Notes</string> - <string name="RELEASE_NOTES_BASE_URL">http://secondlife.com/app/releasenotes/</string> + <string name="RELEASE_NOTES_BASE_URL">http://wiki.secondlife.com/wiki/Release_Notes/</string> <!-- Indicates something is being loaded. Maybe should be merged with RetrievingData --> <string name="LoadingData">Loading...</string> @@ -118,6 +155,8 @@ <!-- Group name: text shown for LLUUID::null --> <string name="GroupNameNone">(none)</string> + <string name="AvalineCaller">Avaline Caller [ORDER]</string> + <!-- Asset errors. Used in llassetstorage.cpp, translation from error code to error message. --> <string name="AssetErrorNone">No error</string> <string name="AssetErrorRequestFailed">Asset request: failed</string> @@ -132,6 +171,7 @@ <string name="AssetErrorUnknownStatus">Unknown status</string> <!-- Asset Type human readable names: these will replace variable [TYPE] in notification FailedToFindWearable* --> + <!-- Will also replace [OBJECTTYPE] in notifications: UserGiveItem, ObjectGiveItem --> <string name="texture">texture</string> <string name="sound">sound</string> <string name="calling card">calling card</string> @@ -156,6 +196,7 @@ <string name="simstate">simstate</string> <string name="favorite">favorite</string> <string name="symbolic link">link</string> + <string name="symbolic folder link">folder link</string> <!-- llvoavatar. Displayed in the avatar chat bubble --> <string name="AvatarEditingAppearance">(Editing Appearance)</string> @@ -251,6 +292,7 @@ <string name="connected">Connected</string> <string name="unavailable">Voice not available at your current location</string> <string name="hang_up">Disconnected from in-world Voice Chat</string> + <string name="reconnect_nearby">You will now be reconnected to Nearby Voice Chat</string> <string name="ScriptQuestionCautionChatGranted">'[OBJECTNAME]', an object owned by '[OWNERNAME]', located in [REGIONNAME] at [REGIONPOS], has been granted permission to: [PERMISSIONS].</string> <string name="ScriptQuestionCautionChatDenied">'[OBJECTNAME]', an object owned by '[OWNERNAME]', located in [REGIONNAME] at [REGIONPOS], has been denied permission to: [PERMISSIONS].</string> <string name="ScriptTakeMoney">Take Linden dollars (L$) from you</string> @@ -276,6 +318,10 @@ <!-- For use when we do not have land type back from the server --> <string name="land_type_unknown">(unknown)</string> + <!-- For land type back from the simulator --> + <string name="Estate / Full Region">Estate / Full Region</string> + <string name="Mainland / Full Region">Mainland / Full Region</string> + <!-- File load/save dialogs --> <string name="all_files">All Files</string> <string name="sound_files">Sounds</string> @@ -1767,7 +1813,25 @@ Clears (deletes) the media and all params from the given face. <string name="alpha">Alpha</string> <string name="tattoo">Tattoo</string> <string name="invalid">invalid</string> - + + <!-- Not Worn Wearable Types --> + <string name="shirt_not_worn">Shirt not worn</string> + <string name="pants_not_worn">Pants not worn</string> + <string name="shoes_not_worn">Shoes not worn</string> + <string name="socks_not_worn">Socks not worn</string> + <string name="jacket_not_worn">Jacket not worn</string> + <string name="gloves_not_worn">Gloves not worn</string> + <string name="undershirt_not_worn">Undershirt not worn</string> + <string name="underpants_not_worn">Underpants not worn</string> + <string name="skirt_not_worn">Skirt not worn</string> + <string name="alpha_not_worn">Alpha not worn</string> + <string name="tattoo_not_worn">Tattoo not worn</string> + <string name="invalid_not_worn">invalid</string> + + <!-- Wearable List--> + <string name="NewWearable">New [WEARABLE_ITEM]</string> + <string name="CreateNewWearable">Create [WEARABLE_TYPE]</string> + <!-- LLGroupNotify --> <!-- used in the construction of a Group Notice blue dialog box, buttons, tooltip etc. Seems to be no longer utilized by code in Viewer 2.0 --> <string name="next">Next</string> @@ -1804,12 +1868,10 @@ Clears (deletes) the media and all params from the given face. <string name="LeaveMouselook">Press ESC to return to World View</string> <!-- inventory --> - <string name="InventoryNoMatchingItems">No matching items found in inventory.</string> - <string name="FavoritesNoMatchingItems">Drag a landmark here to add it to your favorites.</string> - <string name="InventoryNoTexture"> - You do not have a copy of -this texture in your inventory - </string> + <string name="InventoryNoMatchingItems">Didn't find what you're looking for? Try [secondlife:///app/search/all/[SEARCH_TERM] Search].</string> + <string name="PlacesNoMatchingItems">Didn't find what you're looking for? Try [secondlife:///app/search/places/[SEARCH_TERM] Search].</string> + <string name="FavoritesNoMatchingItems">Drag a landmark here to add it to your favorites.</string> + <string name="InventoryNoTexture">You do not have a copy of this texture in your inventory</string> <!-- use value="" because they have preceding spaces --> <string name="no_transfer" value=" (no transfer)" /> <string name="no_modify" value=" (no modify)" /> @@ -1820,6 +1882,7 @@ this texture in your inventory <string name="LoadingContents">Loading contents...</string> <string name="NoContents">No contents</string> <string name="WornOnAttachmentPoint" value=" (worn on [ATTACHMENT_POINT])" /> + <string name="ActiveGesture" value="[GESLABEL] (active)"/> <!-- Inventory permissions --> <string name="PermYes">Yes</string> <string name="PermNo">No</string> @@ -1834,6 +1897,7 @@ this texture in your inventory <string name="Wave" value=" Wave " /> <string name="HelloAvatar" value=" Hello, avatar! " /> <string name="ViewAllGestures" value=" View All >>" /> + <string name="GetMoreGestures" value=" Get More >>" /> <!-- inventory filter --> <!-- use value="" because they have preceding spaces --> @@ -1876,6 +1940,7 @@ this texture in your inventory <string name="InvFolder favorite">Favorites</string> <string name="InvFolder Current Outfit">Current Outfit</string> <string name="InvFolder My Outfits">My Outfits</string> + <string name="InvFolder Accessories">Accessories</string> <!-- are used for Friends and Friends/All folders in Inventory "Calling cards" folder. See EXT-694--> <string name="InvFolder Friends">Friends</string> @@ -2105,17 +2170,22 @@ this texture in your inventory <!-- panel contents --> <string name="PanelContentsNewScript">New Script</string> + <string name="PanelContentsTooltip">Content of object</string> + + <!-- panel preferences general --> + <string name="BusyModeResponseDefault">The Resident you messaged is in 'busy mode' which means they have requested not to be disturbed. Your message will still be shown in their IM panel for later viewing.</string> <!-- Mute --> - <string name="MuteByName">(by name)</string> + <string name="MuteByName">(By name)</string> <string name="MuteAgent">(Resident)</string> - <string name="MuteObject">(object)</string> - <string name="MuteGroup">(group)</string> + <string name="MuteObject">(Object)</string> + <string name="MuteGroup">(Group)</string> + <string name="MuteExternal">(External)</string> <!-- Region/Estate Covenant --> <string name="RegionNoCovenant">There is no Covenant provided for this Estate.</string> <string name="RegionNoCovenantOtherOwner">There is no Covenant provided for this Estate. The land on this estate is being sold by the Estate owner, not Linden Lab. Please contact the Estate Owner for sales details.</string> - <string name="covenant_last_modified">Last Modified:</string> + <string name="covenant_last_modified" value="Last Modified: " /> <!-- use value="" to keep the trailing space --> <string name="none_text" value=" (none) " /> <string name="never_text" value=" (never) " /> @@ -2128,7 +2198,8 @@ this texture in your inventory <string name="ClassifiedUpdateAfterPublish">(will update after publish)</string> <!-- panel picks --> - <string name="NoPicksClassifiedsText">There are no picks/classifieds here</string> + <string name="NoPicksClassifiedsText">You haven't created any Picks or Classifieds. Click the Plus button below to create a Pick or Classified.</string> + <string name="NoAvatarPicksClassifiedsText">User has no picks or classfields</string> <string name="PicksClassifiedsLoadingText">Loading...</string> <!-- Multi Preview Floater --> @@ -2163,7 +2234,8 @@ this texture in your inventory <!-- Viewer menu --> <string name="AcquiredItems">Acquired Items</string> <string name="Cancel">Cancel</string> - <string name="UploadingCosts">Uploading %s costs</string> + <string name="UploadingCosts">Uploading [NAME] costs L$ [AMOUNT]</string> + <string name="BuyingCosts">Buying this costs L$ [AMOUNT]</string> <string name="UnknownFileExtension"> Unknown file extension .%s Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh @@ -2854,6 +2926,9 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. <string name="LocationCtrlBuildTooltip">Building/dropping objects not allowed</string> <string name="LocationCtrlScriptsTooltip">Scripts not allowed</string> <string name="LocationCtrlDamageTooltip">Health</string> + <string name="LocationCtrlAdultIconTooltip">Adult Region</string> + <string name="LocationCtrlModerateIconTooltip">Moderate Region</string> + <string name="LocationCtrlGeneralIconTooltip">General Region</string> <!-- Strings used by the (currently Linux) auto-updater app --> <string name="UpdaterWindowTitle"> @@ -2887,6 +2962,10 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. Failed to start viewer </string> + <!-- System Messages --> + <string name="ItemsComingInTooFastFrom">[APP_NAME]: Items coming in too fast from [FROM_NAME], automatic preview disabled for [TIME] seconds</string> + <string name="ItemsComingInTooFast">[APP_NAME]: Items coming in too fast, automatic preview disabled for [TIME] seconds</string> + <!-- IM system messages --> <string name="IM_logging_string">-- Instant message logging enabled --</string> <string name="IM_typing_start_string">[NAME] is typing...</string> @@ -2899,8 +2978,10 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. <string name="IM_moderator_label">(Moderator)</string> <!-- voice calls --> - <string name="started_call">Started a voice call</string> - <string name="joined_call">Joined the voice call</string> + <string name="answered_call">Your call has been answered</string> + <string name="you_started_call">You started a voice call</string> + <string name="you_joined_call">You joined the voice call</string> + <string name="name_started_call">[NAME] started a voice call</string> <string name="ringing-im"> Joining voice call... @@ -3004,8 +3085,119 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. </string> <string name="unread_chat_single"> [SOURCES] has said something new - </string>" + </string> <string name="unread_chat_multiple"> [SOURCES] have said something new - </string>" -</strings> + </string> + <string name="session_initialization_timed_out_error"> + The session initialization is timed out + </string> + + <string name="voice_morphing_url">http://secondlife.com/landing/voicemorphing</string> + + <!-- Financial operations strings --> + <string name="paid_you_ldollars">[NAME] paid you L$[AMOUNT]</string> + <string name="you_paid_ldollars">You paid [NAME] L$[AMOUNT] [REASON].</string> + <string name="you_paid_ldollars_no_info">You paid L$[AMOUNT].</string> + <string name="you_paid_ldollars_no_reason">You paid [NAME] L$[AMOUNT].</string> + <string name="you_paid_ldollars_no_name">You paid L$[AMOUNT] [REASON].</string> + <string name="for a parcel of land">for a parcel of land</string> + <string name="for a land access pass">for a land access pass</string> + <string name="for deeding land">for deeding land</string> + <string name="to create a group">to create a group</string> + <string name="to join a group">to join a group</string> + <string name="to upload">to upload</string> + + <string name="giving">Giving L$ [AMOUNT]</string> + <string name="uploading_costs">Uploading costs L$ [AMOUNT]</string> + <string name="this_costs">This costs L$ [AMOUNT]</string> + <string name="buying_selected_land">Buying selected land for L$ [AMOUNT]</string> + <string name="this_object_costs">This object costs L$ [AMOUNT]</string> + + <string name="group_role_everyone">Everyone</string> + <string name="group_role_officers">Officers</string> + <string name="group_role_owners">Owners</string> + + <string name="uploading_abuse_report">Uploading... + +Abuse Report</string> + + <!-- names for new inventory items--> + <string name="New Shape">New Shape</string> + <string name="New Skin">New Skin</string> + <string name="New Hair">New Hair</string> + <string name="New Eyes">New Eyes</string> + <string name="New Shirt">New Shirt</string> + <string name="New Pants">New Pants</string> + <string name="New Shoes">New Shoes</string> + <string name="New Socks">New Socks</string> + <string name="New Jacket">New Jacket</string> + <string name="New Gloves">New Gloves</string> + <string name="New Undershirt">New Undershirt</string> + <string name="New Underpants">New Underpants</string> + <string name="New Skirt">New Skirt</string> + <string name="New Alpha">New Alpha</string> + <string name="New Tattoo">New Tattoo</string> + <string name="Invalid Wearable">Invalid Wearable</string> + <string name="New Script">New Script</string> + <string name="New Folder">New Folder</string> + <string name="Contents">Contents</string> + <string name="Gesture">Gesture</string> + <string name="Male Gestures">Male Gestures</string> + <string name="Female Gestures">Female Gestures</string> + <string name="Other Gestures">Other Gestures</string> + <string name="Speech Gestures">Speech Gestures</string> + <string name="Common Gestures">Common Gestures</string> + <!-- gestures --> + <string name="Male - Excuse me">Male - Excuse me</string> + <string name="Male - Get lost">Male - Get lost</string> + <string name="Male - Blow kiss">Male - Blow kiss</string> + <string name="Male - Boo">Male - Boo</string> + <string name="Male - Bored">Male - Bored</string> + <string name="Male - Hey">Male - Hey</string> + <string name="Male - Laugh">Male - Laugh</string> + <string name="Male - Repulsed">Male - Repulsed</string> + <string name="Male - Shrug">Male - Shrug</string> + <string name="Male - Stick tougue out">Male - Stick tougue out</string> + <string name="Male - Wow">Male - Wow</string> + + <string name="Female - Excuse me">Female - Excuse me</string> + <string name="Female - Get lost">Female - Get lost</string> + <string name="Female - Blow kiss">Female - Blow kiss</string> + <string name="Female - Boo">Female - Boo</string> + <string name="Female - Bored">Female - Bored</string> + <string name="Female - Hey">Female - Hey</string> + <string name="Female - Laugh">Female - Laugh</string> + <string name="Female - Repulsed">Female - Repulsed</string> + <string name="Female - Shrug">Female - Shrug</string> + <string name="Female - Stick tougue out">Female - Stick tougue out</string> + <string name="Female - Wow">Female - Wow</string> + + <!-- birth date format shared by avatar inspector and profile panels --> + <string name="AvatarBirthDateFormat">[mthnum,datetime,slt]/[day,datetime,slt]/[year,datetime,slt]</string> + + <string name="DefaultMimeType">none/none</string> + <string name="texture_load_dimensions_error">Can't load images larger than [WIDTH]*[HEIGHT]</string> + + <!-- language specific white-space characters, delimiters, spacers, item separation symbols --> + <string name="sentences_separator" value=" "></string> + <string name="words_separator" value=", "/> + + <string name="server_is_down"> + Despite our best efforts, something unexpected has gone wrong. + + Please check status.secondlifegrid.net to see if there is a known problem with the service. + If you continue to experience problems, please check your network and firewall setup. + </string> + + <!-- overriding datetime formating. + didn't translate if this is not needed for current localization + --> + <string name="dateTimeWeekdaysNames">Sunday:Monday:Tuesday:Wednesday:Thursday:Friday:Saturday</string> + <string name="dateTimeWeekdaysShortNames">Sun:Mon:Tue:Wed:Thu:Fri:Sat</string> + <string name="dateTimeMonthNames">January:February:March:April:May:June:July:August:September:October:November:December</string> + <string name="dateTimeMonthShortNames">Jan:Feb:Mar:Apr:May:Jun:Jul:Aug:Sep:Oct:Nov:Dec</string> + <string name="dateTimeDayFormat">[MDAY]</string> + <string name="dateTimeAM">AM</string> + <string name="dateTimePM">PM</string> + </strings> diff --git a/indra/newview/skins/default/xui/en/teleport_strings.xml b/indra/newview/skins/default/xui/en/teleport_strings.xml index e8f6b1319a..bae821d3b5 100644 --- a/indra/newview/skins/default/xui/en/teleport_strings.xml +++ b/indra/newview/skins/default/xui/en/teleport_strings.xml @@ -61,6 +61,9 @@ Try again in a moment. <message name="completing"> Completing teleport. </message> + <message name="completed_from"> + Teleport completed from [T_SLURL] + </message> <message name="resolving"> Resolving destination. </message> diff --git a/indra/newview/skins/default/xui/en/widgets/accordion.xml b/indra/newview/skins/default/xui/en/widgets/accordion.xml new file mode 100644 index 0000000000..19f8234389 --- /dev/null +++ b/indra/newview/skins/default/xui/en/widgets/accordion.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<accordion + height="100" + name="accordion" + width="200"> + <no_matched_tabs_text + follows="all" + height="100" + h_pad="10" + name="no_matched_tabs_msg" + v_pad="15" + width="200" + wrap="true "/> + <!-- This widget will not be created in viewer. Only its value will be used for empty accordion without filter. --> + <no_visible_tabs_text + name="no_visible_tabs_msg" + visible="false"/> +</accordion> diff --git a/indra/newview/skins/default/xui/en/widgets/button.xml b/indra/newview/skins/default/xui/en/widgets/button.xml index 74d8478551..2d0a1728d5 100644 --- a/indra/newview/skins/default/xui/en/widgets/button.xml +++ b/indra/newview/skins/default/xui/en/widgets/button.xml @@ -2,15 +2,15 @@ <!-- Additional attributes: image_pressed image_pressed_selected + image_flash --> <button image_unselected="PushButton_Off" image_selected="PushButton_Selected" image_disabled_selected="PushButton_Selected_Disabled" image_disabled="PushButton_Disabled" - image_left_pad="0" - image_right_pad="0" image_top_pad="0" image_bottom_pad="0" + imgoverlay_label_space="1" label_color="ButtonLabelColor" label_color_selected="ButtonLabelSelectedColor" label_color_disabled="ButtonLabelDisabledColor" @@ -23,5 +23,6 @@ hover_glow_amount="0.15" halign="center" pad_bottom="3" + height="23" scale_image="true"> </button> diff --git a/indra/newview/skins/default/xui/en/widgets/chiclet_im_adhoc.xml b/indra/newview/skins/default/xui/en/widgets/chiclet_im_adhoc.xml index 63f08a4250..413ca1d1ef 100644 --- a/indra/newview/skins/default/xui/en/widgets/chiclet_im_adhoc.xml +++ b/indra/newview/skins/default/xui/en/widgets/chiclet_im_adhoc.xml @@ -24,7 +24,7 @@ follows="left|top|bottom" height="20" left="2" - mouse_opaque="true" + mouse_opaque="false" name="adhoc_icon" width="21" /> <chiclet_im_adhoc.unread_notifications diff --git a/indra/newview/skins/default/xui/en/widgets/color_swatch.xml b/indra/newview/skins/default/xui/en/widgets/color_swatch.xml index dfd301a770..48b987d7e8 100644 --- a/indra/newview/skins/default/xui/en/widgets/color_swatch.xml +++ b/indra/newview/skins/default/xui/en/widgets/color_swatch.xml @@ -4,5 +4,6 @@ name="color_swatch"> <color_swatch.caption_text name="caption" halign="center" - follows="left|right|bottom"/> + follows="left|right|bottom" + v_pad="2"/> </color_swatch> diff --git a/indra/newview/skins/default/xui/en/widgets/combo_box.xml b/indra/newview/skins/default/xui/en/widgets/combo_box.xml index 132bd24bca..d1f68a9ef9 100644 --- a/indra/newview/skins/default/xui/en/widgets/combo_box.xml +++ b/indra/newview/skins/default/xui/en/widgets/combo_box.xml @@ -2,6 +2,7 @@ <combo_box font="SansSerifSmall" list_position="below" max_chars="20" + height="23" follows="right|top"> <combo_box.combo_button name="Combobox Button" hover_glow_amount="0.15" @@ -20,7 +21,7 @@ image_pressed="DropDown_Press" image_pressed_selected="DropDown_Press" image_disabled="DropDown_Disabled" /> - <combo_box.combo_list bg_writeable_color="MenuDefaultBgColor" + <combo_box.combo_list bg_writeable_color="ComboListBgColor" background_visible="true" /> <!-- Text is "tentative" if you have typed in a string that does not match diff --git a/indra/newview/skins/default/xui/en/widgets/expandable_text.xml b/indra/newview/skins/default/xui/en/widgets/expandable_text.xml index d9b6387f0d..216c4dea95 100644 --- a/indra/newview/skins/default/xui/en/widgets/expandable_text.xml +++ b/indra/newview/skins/default/xui/en/widgets/expandable_text.xml @@ -5,12 +5,13 @@ allow_html="true" allow_scroll="true" bg_visible="false" - more_label="More" + label="More" follows="left|top|right" name="text" read_only="true" use_ellipses="true" word_wrap="true" + show_context_menu="true" tab_stop="true" v_pad="3" h_pad="4" > diff --git a/indra/newview/skins/default/xui/en/widgets/filter_editor.xml b/indra/newview/skins/default/xui/en/widgets/filter_editor.xml index 1228f6be3d..0720621f0b 100644 --- a/indra/newview/skins/default/xui/en/widgets/filter_editor.xml +++ b/indra/newview/skins/default/xui/en/widgets/filter_editor.xml @@ -16,6 +16,6 @@ image_unselected="Search" image_selected="Search" /> <clear_button label="" - image_unselected="Icon_Close_Foreground" - image_selected="Icon_Close_Press" /> + image_unselected="Icon_Close_Toast" + image_selected="Icon_Close_Toast" /> </filter_editor> diff --git a/indra/newview/skins/default/xui/en/widgets/flat_list_view.xml b/indra/newview/skins/default/xui/en/widgets/flat_list_view.xml index a71b293f31..e05ddf9815 100644 --- a/indra/newview/skins/default/xui/en/widgets/flat_list_view.xml +++ b/indra/newview/skins/default/xui/en/widgets/flat_list_view.xml @@ -11,6 +11,6 @@ name="no_items_msg" v_pad="10" h_pad="10" - value="There are no any items in the list" + value="No matches found" wrap="true" /> </flat_list_view>
\ No newline at end of file diff --git a/indra/newview/skins/default/xui/en/widgets/flyout_button.xml b/indra/newview/skins/default/xui/en/widgets/flyout_button.xml index a5043c5c14..83df10e417 100644 --- a/indra/newview/skins/default/xui/en/widgets/flyout_button.xml +++ b/indra/newview/skins/default/xui/en/widgets/flyout_button.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<flyout_button list_position="below"> +<flyout_button list_position="below" height="23"> <action_button scale_image="true" image_selected="SegmentedBtn_Left_Selected" image_unselected="SegmentedBtn_Left_Off" diff --git a/indra/newview/skins/default/xui/en/widgets/inspector.xml b/indra/newview/skins/default/xui/en/widgets/inspector.xml index 8ec206023e..428b2ce03b 100644 --- a/indra/newview/skins/default/xui/en/widgets/inspector.xml +++ b/indra/newview/skins/default/xui/en/widgets/inspector.xml @@ -1,10 +1,9 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<!-- See also settings.xml UIFloater* settings for configuration --> <inspector name="inspector" - bg_opaque_color="DkGray_66" - background_visible="true" - bg_opaque_image="none" - background_opaque="true" - bg_alpha_image="none" - text_color="InspectorTipTextColor" - /> + bg_opaque_color="DkGray_66" + background_visible="true" + bg_opaque_image="Inspector_Hover" + background_opaque="true" + bg_alpha_image="none" + mouse_opaque="true" + text_color="InspectorTipTextColor"/> diff --git a/indra/newview/skins/default/xui/en/widgets/line_editor.xml b/indra/newview/skins/default/xui/en/widgets/line_editor.xml index a21e3f2645..a054960bf8 100644 --- a/indra/newview/skins/default/xui/en/widgets/line_editor.xml +++ b/indra/newview/skins/default/xui/en/widgets/line_editor.xml @@ -3,7 +3,6 @@ background_image_disabled="TextField_Disabled" background_image_focused="TextField_Active" select_on_focus="false" - handle_edit_keys_directly="false" commit_on_focus_lost="true" ignore_tab="true" cursor_color="TextCursorColor" diff --git a/indra/newview/skins/default/xui/en/widgets/loading_indicator.xml b/indra/newview/skins/default/xui/en/widgets/loading_indicator.xml new file mode 100644 index 0000000000..6040d24128 --- /dev/null +++ b/indra/newview/skins/default/xui/en/widgets/loading_indicator.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<loading_indicator + follows="left|top" + mouse_opaque="false" + name="loading_indicator" + rotations_per_sec="1.0" + tab_stop="false" +/> diff --git a/indra/newview/skins/default/xui/en/widgets/location_input.xml b/indra/newview/skins/default/xui/en/widgets/location_input.xml index 626135642b..02ea661da3 100644 --- a/indra/newview/skins/default/xui/en/widgets/location_input.xml +++ b/indra/newview/skins/default/xui/en/widgets/location_input.xml @@ -4,6 +4,10 @@ Currently that doesn't work because LLUIImage::getWidth/getHeight() return 1 for the images. --> <location_input font="SansSerifSmall" + icon_maturity_general="Parcel_PG_Light" + icon_maturity_adult="Parcel_R_Light" + icon_maturity_moderate="Parcel_M_Light" + maturity_help_topic="TODO" add_landmark_image_enabled="Favorite_Star_Active" add_landmark_image_disabled="Favorite_Star_Off" add_landmark_image_hover="Favorite_Star_Over" @@ -41,6 +45,13 @@ scale_image="false" top="19" left="-3" /> + <maturity_button + name="maturity_icon" + width="18" + height="16" + top="20" + follows="left|top" + /> <for_sale_button name="for_sale_btn" image_unselected="Parcel_ForSale_Light" diff --git a/indra/newview/skins/default/xui/en/widgets/panel.xml b/indra/newview/skins/default/xui/en/widgets/panel.xml index 7262c0dc5c..9bf99fa363 100644 --- a/indra/newview/skins/default/xui/en/widgets/panel.xml +++ b/indra/newview/skins/default/xui/en/widgets/panel.xml @@ -6,6 +6,8 @@ --> <panel bg_opaque_color="PanelFocusBackgroundColor" bg_alpha_color="PanelDefaultBackgroundColor" + bg_opaque_image_overlay="White" + bg_alpha_image_overlay="White" background_visible="false" background_opaque="false" chrome="false"/>
\ No newline at end of file diff --git a/indra/newview/skins/default/xui/en/widgets/panel_camera_item.xml b/indra/newview/skins/default/xui/en/widgets/panel_camera_item.xml new file mode 100644 index 0000000000..98707b8495 --- /dev/null +++ b/indra/newview/skins/default/xui/en/widgets/panel_camera_item.xml @@ -0,0 +1,70 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel_camera_item + background_visible="false" + height="30" + layout="topleft" + width="212"> + <panel_camera_item.icon_over + follows="top|left" + height="30" + image_name="ListItem_Over" + left="0" + mouse_opaque="false" + layout="topleft" + name="hovered_icon" + top="30" + scale_image="true" + visible="false" + width="212" /> + <panel_camera_item.icon_selected + follows="top|left" + height="30" + image_name="ListItem_Select" + layout="topleft" + left="0" + mouse_opaque="false" + name="selected_icon" + top="30" + scale_image="true" + visible="false" + width="212" /> + <panel_camera_item.picture + follows="top|left" + height="30" + image_name="Icon_For_Sale" + layout="topleft" + left="0" + mouse_opaque="false" + name="picture" + tab_stop="false" + top="30" + top_pad="10" + width="30" /> + <panel_camera_item.selected_picture + follows="top|left" + height="30" + image_name="Cam_Rotate_In" + layout="topleft" + left="0" + mouse_opaque="false" + name="selected_picture" + tab_stop="false" + top="30" + top_pad="8" + visible="false" + width="30" /> + <panel_camera_item.text + follows="top|left|right" + font="SansSerifMedium" + height="15" + layout="topleft" + left ="38" + name="picture_name" + text_color="white" + top="21" + use_ellipses="true" + width="170" + word_wrap="false" > + Text + </panel_camera_item.text> +</panel_camera_item> diff --git a/indra/newview/skins/default/xui/en/widgets/search_editor.xml b/indra/newview/skins/default/xui/en/widgets/search_editor.xml index 1616e4c3f7..32e443a058 100644 --- a/indra/newview/skins/default/xui/en/widgets/search_editor.xml +++ b/indra/newview/skins/default/xui/en/widgets/search_editor.xml @@ -3,6 +3,7 @@ clear_button_visible="false" search_button_visible="true" text_pad_left="6" + text_pad_right="6" select_on_focus="true" text_tentative_color="TextFgTentativeColor" background_image="TextField_Search_Off" @@ -15,7 +16,12 @@ height="13" image_unselected="Search" image_selected="Search" /> - <clear_button + <clear_button + bottom="4" + height="16" image_unselected="Icon_Close_Foreground" - image_selected="Icon_Close_Press" /> + image_selected="Icon_Close_Press" + pad_right="4" + pad_left="4" + width="16" /> </search_editor> diff --git a/indra/newview/skins/default/xui/en/widgets/slider_bar.xml b/indra/newview/skins/default/xui/en/widgets/slider_bar.xml index 89d5950e98..ea63cac790 100644 --- a/indra/newview/skins/default/xui/en/widgets/slider_bar.xml +++ b/indra/newview/skins/default/xui/en/widgets/slider_bar.xml @@ -1,4 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<!--All horizontal sliders are configured to have no highlighted track. See EXT-5939. --> <slider_bar track_color="SliderTrackColor" thumb_outline_color="SliderThumbOutlineColor" thumb_center_color="SliderThumbCenterColor" @@ -7,6 +8,6 @@ thumb_image_disabled="SliderThumb_Disabled" track_image_horizontal="SliderTrack_Horiz" track_image_vertical="SliderTrack_Vert" - track_highlight_horizontal_image="SliderTrack_Horiz" + track_highlight_horizontal_image="transparent.j2c" track_highlight_vertical_image="SliderTrack_Vert" font="SansSerif" /> diff --git a/indra/newview/skins/default/xui/en/widgets/tab_container.xml b/indra/newview/skins/default/xui/en/widgets/tab_container.xml index 597c4e83b6..c37ead0be2 100644 --- a/indra/newview/skins/default/xui/en/widgets/tab_container.xml +++ b/indra/newview/skins/default/xui/en/widgets/tab_container.xml @@ -5,27 +5,34 @@ label_pad_left - padding to the left of tab button labels --> <tab_container tab_min_width="60" tab_max_width="150" + use_custom_icon_ctrl="false" halign="center" font="SansSerifSmall" tab_height="21" label_pad_bottom="2" label_pad_left="4"> + <!-- + Possible additional attributes for tabs: + tab_bottom_image_flash + tab_left_image_flash + tab_top_image_flash + --> <first_tab tab_top_image_unselected="TabTop_Left_Off" tab_top_image_selected="TabTop_Left_Selected" tab_bottom_image_unselected="Toolbar_Left_Off" tab_bottom_image_selected="Toolbar_Left_Selected" tab_left_image_unselected="SegmentedBtn_Left_Disabled" - tab_left_image_selected="SegmentedBtn_Left_Off"/> + tab_left_image_selected="SegmentedBtn_Left_Selected_Over"/> <middle_tab tab_top_image_unselected="TabTop_Middle_Off" tab_top_image_selected="TabTop_Middle_Selected" tab_bottom_image_unselected="Toolbar_Middle_Off" tab_bottom_image_selected="Toolbar_Middle_Selected" tab_left_image_unselected="SegmentedBtn_Left_Disabled" - tab_left_image_selected="SegmentedBtn_Left_Off"/> + tab_left_image_selected="SegmentedBtn_Left_Selected_Over"/> <last_tab tab_top_image_unselected="TabTop_Right_Off" tab_top_image_selected="TabTop_Right_Selected" tab_bottom_image_unselected="Toolbar_Right_Off" tab_bottom_image_selected="Toolbar_Right_Selected" tab_left_image_unselected="SegmentedBtn_Left_Disabled" - tab_left_image_selected="SegmentedBtn_Left_Off"/> + tab_left_image_selected="SegmentedBtn_Left_Selected_Over"/> </tab_container> diff --git a/indra/newview/skins/default/xui/en/widgets/talk_button.xml b/indra/newview/skins/default/xui/en/widgets/talk_button.xml index 68cf082c35..a7e271a1ff 100644 --- a/indra/newview/skins/default/xui/en/widgets/talk_button.xml +++ b/indra/newview/skins/default/xui/en/widgets/talk_button.xml @@ -11,9 +11,6 @@ image_unselected="SegmentedBtn_Left_Off" image_pressed="SegmentedBtn_Left_Selected_Press" image_pressed_selected="SegmentedBtn_Left_Selected_Press" - name="speak_btn" - label="Speak" - label_selected="Speak" tab_stop="false" /> <show_button diff --git a/indra/newview/skins/default/xui/en/widgets/text.xml b/indra/newview/skins/default/xui/en/widgets/text.xml index 855584a0db..3006df22b8 100644 --- a/indra/newview/skins/default/xui/en/widgets/text.xml +++ b/indra/newview/skins/default/xui/en/widgets/text.xml @@ -6,7 +6,6 @@ font_shadow="none" tab_stop="false" halign="left" - hover_color="LabelSelectedColor" h_pad="0" allow_scroll="false" text_readonly_color="LabelDisabledColor" @@ -14,7 +13,7 @@ use_ellipses="false" bg_visible="false" border_visible="false" - hover="false" + sound_flags="0" text_color="LabelTextColor" v_pad="0" max_length="4096"/> diff --git a/indra/newview/skins/default/xui/en/widgets/text_editor.xml b/indra/newview/skins/default/xui/en/widgets/text_editor.xml index 23ca8ea338..2ced8b1b4b 100644 --- a/indra/newview/skins/default/xui/en/widgets/text_editor.xml +++ b/indra/newview/skins/default/xui/en/widgets/text_editor.xml @@ -1,4 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <!-- Core parameters are in simple_text_editor.xml --> <text_editor - allow_html="false"/> + allow_html="false" + show_context_menu="true"/> diff --git a/indra/newview/skins/default/xui/en/widgets/texture_picker.xml b/indra/newview/skins/default/xui/en/widgets/texture_picker.xml index 33c3475eb2..757f0f49d1 100644 --- a/indra/newview/skins/default/xui/en/widgets/texture_picker.xml +++ b/indra/newview/skins/default/xui/en/widgets/texture_picker.xml @@ -3,7 +3,8 @@ <multiselect_text font="SansSerifSmall"/> <caption_text text="Multiple" halign="center" - font="SansSerifSmall"/> + font="SansSerifSmall" + v_pad="2"/> <border bevel_style="in"/> </texture_picker> diff --git a/indra/newview/skins/default/xui/en/widgets/tool_tip.xml b/indra/newview/skins/default/xui/en/widgets/tool_tip.xml index a19201f7c3..9ca15ae50d 100644 --- a/indra/newview/skins/default/xui/en/widgets/tool_tip.xml +++ b/indra/newview/skins/default/xui/en/widgets/tool_tip.xml @@ -1,12 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<!-- See also settings.xml UIFloater* settings for configuration --> <tool_tip name="tooltip" max_width="200" padding="4" wrap="true" font="SansSerif" + mouse_opaque="false" bg_opaque_image="Tooltip" background_opaque="true" background_visible="true" - text_color="ToolTipTextColor" - /> + text_color="ToolTipTextColor"/> diff --git a/indra/newview/skins/default/xui/es/floater_about.xml b/indra/newview/skins/default/xui/es/floater_about.xml index e8e38316f9..1af089cfaf 100644 --- a/indra/newview/skins/default/xui/es/floater_about.xml +++ b/indra/newview/skins/default/xui/es/floater_about.xml @@ -1,20 +1,61 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="floater_about" title="ACERCA DE [CAPITALIZED_APP_NAME]"> -<tab_container name="about_tab"> - <panel name="credits_panel"> - <text_editor name="credits_editor"> - Le ofrecen Second Life Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl, y otros muchos. + <floater.string name="AboutHeader"> + [APP_NAME] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2] ([VIEWER_VERSION_3]) [BUILD_DATE] [BUILD_TIME] ([CHANNEL]) +[[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]] + </floater.string> + <floater.string name="AboutCompiler"> + Compilado con [COMPILER], versión [COMPILER_VERSION] + </floater.string> + <floater.string name="AboutPosition"> + Estás en la posición [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1], de [REGION], alojada en <nolink>[HOSTNAME]</nolink> ([HOSTIP]) +[SERVER_VERSION] +[[SERVER_RELEASE_NOTES_URL] [ReleaseNotes]] + </floater.string> + <floater.string name="AboutSystem"> + CPU: [CPU] +Memoria: [MEMORY_MB] MB +Versión del Sistema Operativo: [OS_VERSION] +Fabricante de la tarjeta gráfica: [GRAPHICS_CARD_VENDOR] +Tarjeta gráfica: [GRAPHICS_CARD] + </floater.string> + <floater.string name="AboutDriver"> + Versión de Windows Graphics Driver: [GRAPHICS_DRIVER_VERSION] + </floater.string> + <floater.string name="AboutLibs"> + Versión de OpenGL: [OPENGL_VERSION] - Gracias a todos estos residentes por contribuir a garantizar que esta es la mejor versión: able whitman, Adeon Writer, adonaira aabye, Aeron Kohime, Agathos Frascati, Aimee Trescothick, Aleric Inglewood, Alissa Sabre, Aminom Marvin, Angela Talamasca, Aralara Rajal, Armin Weatherwax, Ashrilyn Hayashida, Athanasius Skytower, Aura Dirval, Barney Boomslang, Biancaluce Robbiani, Biker Offcourse, Borg Capalini, Bulli Schumann, catherine pfeffer, Chalice Yao, Corre Porta, Court Goodman, Cummere Mayo, Dale Innis, Darien Caldwell, Darjeeling Schoonhoven, Daten Thielt, dimentox travanti, Dirk Talamasca, Drew Dwi, Duckless Vandyke, Elanthius Flagstaff, Electro Burnstein, emiley tomsen, Escort DeFarge, Eva Rau, Ezian Ecksol, Fire Centaur, Fluf Fredriksson, Francisco Koolhoven, Frontera Thor, Frungi Stastny, Gally Young, gearsawe stonecutter, Gigs Taggart, Gordon Wendt, Gudmund Shepherd, Gypsy Paz, Harleen Gretzky, Henri Beauchamp, Inma Rau, Irene Muni, Iskar Ariantho, Jacek Antonelli, JB Kraft, Jessicka Graves, Joeseph Albanese, Joshua Philgarlic, Khyota Wulluf, kirstenlee Cinquetti, Latif Khalifa, Lex Neva, Lilibeth Andree, Lisa Lowe, Lunita Savira, Loosey Demonia, lum pfohl, Marcos Fonzarelli, MartinRJ Fayray, Marusame Arai, Matthew Dowd, Maya Remblai, McCabe Maxsted, Meghan Dench, Melchoir Tokhes, Menos Short, Michelle2 Zenovka, Mimika Oh, Minerva Memel, Mm Alder, Ochi Wolfe, Omei Turnbull, Pesho Replacement, Phantom Ninetails, phoenixflames kukulcan, Polo Gufler, prez pessoa, princess niven, Prokofy Neva, Qie Niangao, Rem Beattie, RodneyLee Jessop, Saijanai Kuhn, Seg Baphomet, Sergen Davies, Shirley Marquez, SignpostMarv Martin, Sindy Tsure, Sira Arbizu, Skips Jigsaw, Sougent Harrop, Spritely Pixel, Squirrel Wood, StarSong Bright, Subversive Writer, Sugarcult Dagger, Sylumm Grigorovich, Tammy Nowotny, Tanooki Darkes, Tayra Dagostino, Theoretical Chemistry, Thickbrick Sleaford, valerie rosewood, Vex Streeter, Vixen Heron, Whoops Babii, Winter Ventura, Xiki Luik, Yann Dufaux, Yina Yao, Yukinoroh Kamachi, Zolute Infinity, Zwagoth Klaar +Versión de libcurl: [LIBCURL_VERSION] +Versión de J2C Decoder: [J2C_VERSION] +Versión de Audio Driver: [AUDIO_DRIVER_VERSION] +Versión de Qt Webkit: [QT_WEBKIT_VERSION] +Versión del servidor de voz: [VOICE_VERSION] + </floater.string> + <floater.string name="none"> + (no hay) + </floater.string> + <floater.string name="AboutTraffic"> + Paquetes perdidos: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%) + </floater.string> + <tab_container name="about_tab"> + <panel label="Información" name="support_panel"> + <button label="Copiar al portapapeles" name="copy_btn" width="165"/> + </panel> + <panel label="Créditos" name="credits_panel"> + <text_editor name="credits_editor"> + Te ofrecen Second Life Philip, Tessa, Andrew, Cory, Ian, James, Phoenix, Ryan, Haney, Dan, Char, Ben, John, Tanya, Eddie, Richard, Mitch, Doug, Eric, Frank, Bruce, Aaron, Peter, Alice, Charlie, Debra, Eileen, Helen, Janet, Steffan, Steve, Tom, Mark, Hunter, Xenon, Burgess, Bill, Jim, Lee, Hamlet, Daniel, Jeff, Todd, Sarah, Tim, Stephanie, Colin, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Jack, Vektor, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Jesse, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Yuko, Makiko, Thomas, Harry, Seth, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Brad, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, Beez, Milo, Hermia, Red, Thrax, Gulliver, Joe, Sally, Paul, Jose, Rejean, Dore, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, Dustin, George, Del, Matthew, Cat, Jacqui, Adrian, Viola, Alfred, Noel, Irfan, Yool, Rika, Jane, Frontier, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Jeremy, JP, Jake, Anthony, Maurice, Madhavi, Leopard, Kyle, Joon, Bert, Belinda, Jon, Kristi, Bridie, Pramod, Socrates, Maria, Aric, Adreanne, Jay, Kari, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Colossus, Zen, BigPapi, Pastrami, Kurz, Mani, Neuro, Mel, Sardonyx, MJ, Rowan, Sgt, Elvis, Samuel, Leo, Bryan, Niko, Austin, Soft, Poppy, Rachel, Aki, Banzai, Alexa, Sue, Bender, CG, Angelo, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Rothman, Niall, Marin, Allison, Katie, Dawn, Dusty, Katt, Judy, Andrea, Ambroff, Infinity, Rico, Gail, Kalpana, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Maestro, Simone, Yang, T, Shannon, Nelson, Khanh, Scott, Courtney, Charlene, Quixote, Susan, Zed, Amanda, Katelin, Enkidu, Roxie, Esbee, JoRoan, Scarlet, Tay, Kevin, Wolfgang, Johnny, Ray, Andren, Merov, Bob, Rand, Howard, Callen, Heff, Galen, Newell, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl, Ashley, JessieAnn, Huseby, Karina, Paris, Kurt, Rick, Lis, Kotler, Theeba, Lynx, Murphy, Doten, Taka, Norm, Jillian, Marcus, Mae, Novack, Esther, Perry, Dana, Ducot, Javier, Porter, Madison, Gecko, Dough, JR, Gisele, Crimp, Norie, Arch, Kimi, Fisher, Barbara, Jason, Peggy, Bernard, Jules, Leroy, Eva, Khederian, Campbell, Vogt, Masido, Karel, Torres, Lo, Breezer, Delby, Rountree, Anna, Servus, Rue, Itiaes, Chuck, Luna, Novella, Zaza, Wen, Gino, Lex, Cassandra, Limey, Nancy, Anukul, Silver, Brodesky, Jinsai, Squid, Gez, Rakesh, Ladan, Edelman, Marcet, Squire, Tatem, Tony, Jerm, Tia, Falcon, BK, Tiggs, Driscoll, Bacon, Timothee, Cru, Carmilla, Coyot, Webb, Kazu, Rudas, LJ, Sea, Ali Wallace, Bewest, Pup, Drub, Dragon, Inoshiro, Byron, Rhett, Xandix, Aimee, Fredrik, Thor, Teddy, Baron, Nelly, Ghengis, Epic, Eli, Stone, Grapes, Irie, Prep, Scobu, Valerie, Alain, y muchos otros. +Gracias a estos Residentes por ayudarnos a estar seguros de que, con todo, esta es la mejor versión: Drew Dwi, Zai Lynch, Latif Khalifa, Ellla McMahon, Harleen Gretzky, Squirrel Wood, Malarthi Behemoth, Dante Tucker, Buckaroo Mu, Eddi Decosta, Dirk Talamasca, Torben Trautman, Irene Muni, Lilly Zenovka, Vick Forcella, Sasy Scarborough, Gentle Welinder, Elric Anatine, Techwolf Lupindo, Dusan Writer, WolfPup Lowenhar, Marianne McCann, Fiachra Lach, Sitearm Madonna, Sudane Erato, Sahkolihaa Contepomi, Sachi Vixen, Questar Utu, Dimitrio Lewis, Matto Destiny, Scrim Pinion, Radio Signals, Psi Merlin, Pixel Gausman, Mel Vanbeeck, Laurent Bechir, Lamorna Proctor, Lares Carter, Gwyneth Llewelyn, Hydra Shaftoe, Holger Gilruth, Gentle Heron, Carla Broek, Boroondas Gupte, Fury Rosewood, Flower Ducatillon, Colpo Wexler, gwampa Lomu, Borg Capalini, Beansy Twine, Ardy Lay, 45ms Zhong, Adeon Writer, Aeonix Aeon, Ai Austin, Aiko Ying, Alexandrea Fride, Alliez Mysterio, Annie Milestone, Annika Genezzia, Ansariel Hiller, ArminasX Saiman, Arya Braveheart, Asaeda Meltingdots, Asturkon Jua, Avallyn Oakleaf, Avatar Quinzet, BabyA Littlething, Bacchus Ireto, Bazaar, Riva, Benjamin Bigdipper, Beth Walcher, Bezilon Kasei, Biancaluce Robbiani, Bill Walach, blakopal Galicia, Blitzckreed Levenque, Bryn Oh, Callipygian Christensen, Cap Carver, Carr Arbenlow, Chantal Harvey, Charles Courtois, Charlie Sazaland, Cherry Cheevers, ChickyBabes Zuzu, Christopher Organiser, Ciaran Laval, Clara Young, Celierra Darling, Corinne Helendale, Corro Moseley, Coughdrop Littlething, Darien Caldwell, Dartagan Shepherd, Debs Regent, Decro Schmooz, Denim Kamachi, DiJodi Dubratt, Dil Spitz, Edgware Marker, Egehan Dryke, Emma Portilo, Emmie Fairymeadow, Evangelista Emerald, Faelon Swordthain, Frenchimmo Sabra, Gaberoonie Zanzibar, Ganymedes Costagravas, Gene Frostbite, GeneJ Composer, Giggles Littlebird, Grady Echegaray, Guni Greenstein, Gypsy Tripsa, Hackshaven Harford, Ham Rambler, Han Shuffle, Hanglow Short, Hatzfeld Runo, herina Bode, Horatio Freund, Hypatia Callisto, Hypatia Pickens, Identity Euler, Imnotgoing Sideways, Innula Zenovka, Iyoba Tarantal, Jack Abraham, Jagga Meredith, Jennifer Boyle, Jeremy Marquez, Jessica Qin, Jinx Nordberg, Jo Bernandes, Jocial Sonnenkern, Joel Savard, Jondan Lundquist, Josef Munster, Josette Windlow, Juilan Tripsa, Juro Kothari, Justin RiversRunRed, Kagehi Kohn, Kaimen Takahe, Keklily Longfall, Ken Lavender, Kestral Karas, Khisme Nitely, Kimar Coba, Kithrak Kirkorian, Kitty Barnett, Kolor Fall, Komiko Okamoto, Korvel Noh, Larry Pixel, Leal Choche, len Starship, Lenae Munz, Lexi Frua, Lillie Cordeaux, Lizzy Macarthur, LSL Scientist, Luban Yiyuan, Luc Starsider, Maccus McCullough, Madison Blanc, Maggie Darwin, Mallory Destiny, Manx Wharton, Marc Claridge, Marc2 Sands, Matthew Anthony, Maxim RiversRunRed, Medhue Simoni, Melinda Latynina, Mencius Watts, Michi Lumin, Midian Farspire, Miles Glaz, Mindy Mathy, Mitch Wagner, Mo Hax, Mourna Biziou, Nao Noe, naofan Teardrop, Naomah Beaumont, Nathiel Siamendes, Nber Medici, Neko Link, Netpat Igaly, Neutron Chesnokov, Newfie Pendragon, Nicholai Laviscu, Nick Rhodes, Nicoladie Gymnast, Ollie Kubrick, Orenj Marat, Orion Delphis, Oryx Tempel, Parvati Silverweb, PeterPunk Mooney, Pixel Scientist, Pounce Teazle, Professor Noarlunga, Quantum Destiny, Quicksilver Hermes, Ralf Setsuko, RAT Quan, RedMokum Bravin, Revolution Perenti, Rezit Sideways, Rich Grainger, Rosco Teardrop, Rose Evans, Rudee Voom, RufusTT Horsefly, Saii Hallard, SaintLEOlions Zimer, Samm Larkham, Satanello Miami, SexySteven Morrisey, Sheet Spotter, Shnurui Troughton, sicarius Thorne, Sicarius Toxx, Sini Nubalo, SLB Wirefly, snowy Sidran, Soupa Segura, ST Mensing, Starshine Halasy, Stickman Ingmann, Synystyr Texan, Takeda Terrawyng, Tali Rosca, Templar Merlin, Tezcatlipoca Bisiani, Tiel Stonecutter, Tony Kembia, TouchaHoney Perhaps, Trey Reanimator, TriloByte Zanzibar, Trinity Dechou, Trinity Dejavu, Unlikely Quintessa, UsikuFarasi Kanarik, Veritas Raymaker, Vex Streeter, Viaticus Speculaas, Villain Baroque, Vixie Durant, Void Singer, Watty Berkson, Westley Schridde, Westley Streeter, Whimsy Winx, Winter Ventura, Wundur Primbee, xstorm Radek, YongYong Francois, Zak Westminster, Zana Kohime, Zaren Alexander, Zeja Pyle, ZenMondo Wormser, Zoex Flanagan, y muchos otros. - Para tener éxito en los negocios, se atrevido, se el primero, se diferente. (Henry Marchant) - </text_editor> - </panel> - <panel name="licenses_panel"> - <text_editor name="credits_editor"> - 3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion + + +"El trabajo sigue avanzando, la causa perdura, la esperanza aún vive, y los sueños no morirán jamás" - Edward Kennedy + </text_editor> + </panel> + <panel label="Licencias" name="licenses_panel"> + <text_editor name="credits_editor"> + 3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion APR Copyright (C) 2000-2004 The Apache Software Foundation cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se) DBus/dbus-glib Copyright (C) 2002, 2003 CodeFactory AB / Copyright (C) 2003, 2004 Red Hat, Inc. @@ -35,10 +76,7 @@ All rights reserved. See licenses.txt for details. Voice chat Audio coding: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C) - </text_editor> - </panel> -</tab_container> - <string name="you_are_at"> - Está en [POSITION] - </string> + </text_editor> + </panel> + </tab_container> </floater> diff --git a/indra/newview/skins/default/xui/es/floater_about_land.xml b/indra/newview/skins/default/xui/es/floater_about_land.xml index 7575df4b98..c672f68c5c 100644 --- a/indra/newview/skins/default/xui/es/floater_about_land.xml +++ b/indra/newview/skins/default/xui/es/floater_about_land.xml @@ -1,7 +1,71 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="floaterland" title="ACERCA DEL TERRENO"> + <floater.string name="maturity_icon_general"> + "Parcel_PG_Dark" + </floater.string> + <floater.string name="maturity_icon_moderate"> + "Parcel_M_Dark" + </floater.string> + <floater.string name="maturity_icon_adult"> + "Parcel_R_Dark" + </floater.string> + <floater.string name="Minutes"> + [MINUTES] minutos + </floater.string> + <floater.string name="Minute"> + minuto + </floater.string> + <floater.string name="Seconds"> + [SECONDS] segundos + </floater.string> + <floater.string name="Remaining"> + restantes + </floater.string> <tab_container name="landtab"> - <panel label="General" name="land_general_panel"> + <panel label="GENERAL" name="land_general_panel"> + <panel.string name="new users only"> + Sólo nuevos Residentes + </panel.string> + <panel.string name="anyone"> + Cualquiera + </panel.string> + <panel.string name="area_text"> + Superficie + </panel.string> + <panel.string name="area_size_text"> + [AREA] m² + </panel.string> + <panel.string name="auction_id_text"> + ID de la subasta: [ID] + </panel.string> + <panel.string name="need_tier_to_modify"> + Debe aprobar su compra para modificar este terreno. + </panel.string> + <panel.string name="group_owned_text"> + (Propiedad del grupo) + </panel.string> + <panel.string name="profile_text"> + Perfil... + </panel.string> + <panel.string name="info_text"> + Información... + </panel.string> + <panel.string name="public_text"> + (público) + </panel.string> + <panel.string name="none_text"> + (ninguno) + </panel.string> + <panel.string name="sale_pending_text"> + (Venta pendiente) + </panel.string> + <panel.string name="no_selection_text"> + No se ha seleccionado una parcela. +Vaya al menú Mundo > Acerca del terreno o seleccione otra parcela para ver sus caracterÃsticas. + </panel.string> + <panel.string name="time_stamp_template"> + [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local] + </panel.string> <text name="Name:"> Nombre: </text> @@ -26,13 +90,15 @@ <text name="OwnerText"> Leyla Linden </text> - <button label="Perfil..." label_selected="Perfil..." name="Profile..."/> <text name="Group:"> Grupo: </text> - <button label="Configurar..." label_selected="Configurar..." name="Set..."/> + <text name="GroupText"> + Leyla Linden + </text> + <button label="Configurar" name="Set..."/> <check_box label="Permitir transferir al grupo" name="check deed" tool_tip="Un oficial del grupo puede transferir este terreno al grupo. El terreno será apoyado por el grupo en sus asignaciones de terreno."/> - <button label="Transferir..." label_selected="Transferir..." name="Deed..." tool_tip="Sólo si es usted un oficial del grupo seleccionado puede transferir terreno."/> + <button label="Transferir" name="Deed..." tool_tip="Sólo si es usted un oficial del grupo seleccionado puede transferir terreno."/> <check_box label="El propietario hace una contribución transfiriendo" name="check contrib" tool_tip="Cuando el terreno se transfiere al grupo, el antiguo propietario contribuye con una asignación suficiente de terreno."/> <text name="For Sale:"> En venta: @@ -43,17 +109,17 @@ <text name="For Sale: Price L$[PRICE]."> Precio: [PRICE] L$ ([PRICE_PER_SQM] L$/m²). </text> - <button label="Vender el terreno..." label_selected="Vender el terreno..." name="Sell Land..."/> + <button label="Vender el terreno" name="Sell Land..."/> <text name="For sale to"> En venta a: [BUYER] </text> - <text width="216" name="Sell with landowners objects in parcel."> + <text name="Sell with landowners objects in parcel." width="216"> Los objetos se incluyen en la venta. </text> - <text width="216" name="Selling with no objects in parcel."> + <text name="Selling with no objects in parcel." width="216"> Los objetos no se incluyen en la venta. </text> - <button font="SansSerifSmall" bottom="-245" left="275" width="165" label="Cancelar la venta del terreno" label_selected="Cancelar la venta del terreno" name="Cancel Land Sale"/> + <button bottom="-245" font="SansSerifSmall" label="Cancelar la venta del terreno" label_selected="Cancelar la venta del terreno" left="275" name="Cancel Land Sale"/> <text name="Claimed:"> Reclamada: </text> @@ -72,60 +138,30 @@ <text name="DwellText"> 0 </text> - <button label="Comprar terreno..." label_selected="Comprar terreno..." left="130" name="Buy Land..." width="125"/> - <button label="Comprar para el grupo..." label_selected="Comprar para el grupo..." name="Buy For Group..."/> - <button label="Comprar un pase..." label_selected="Comprar un pase..." left="130" width="125" name="Buy Pass..." tool_tip="Un pase le da acceso temporal a este terreno."/> - <button label="Abandonar el terreno..." label_selected="Abandonar el terreno..." name="Abandon Land..."/> - <button label="Reclamar el terreno..." label_selected="Reclamar el terreno..." name="Reclaim Land..."/> - <button label="Venta Linden..." label_selected="Venta Linden..." name="Linden Sale..." tool_tip="El terreno debe estar en propiedad, con contenido, y no estar en subasta."/> - <panel.string name="new users only"> - Sólo usuarios nuevos - </panel.string> - <panel.string name="anyone"> - Cualquiera - </panel.string> - <panel.string name="area_text"> - Superficie - </panel.string> - <panel.string name="area_size_text"> - [AREA] m² - </panel.string> - <panel.string name="auction_id_text"> - ID de la subasta: [ID] - </panel.string> - <panel.string name="need_tier_to_modify"> - Debe aprobar su compra para modificar este terreno. - </panel.string> - <panel.string name="group_owned_text"> - (Propiedad del grupo) - </panel.string> - <panel.string name="profile_text"> - Perfil... - </panel.string> - <panel.string name="info_text"> - Información... - </panel.string> - <panel.string name="public_text"> - (público) + <button label="Comprar terreno" left="130" name="Buy Land..." width="125"/> + <button label="Información del script" name="Scripts..."/> + <button label="Comprar para el grupo" name="Buy For Group..."/> + <button label="Comprar un pase" left="130" name="Buy Pass..." tool_tip="Un pase le da acceso temporal a este terreno." width="125"/> + <button label="Abandonar el terreno" name="Abandon Land..."/> + <button label="Reclamar el terreno" name="Reclaim Land..."/> + <button label="Venta Linden" name="Linden Sale..." tool_tip="El terreno debe estar en propiedad, con contenido, y no estar en subasta."/> + </panel> + <panel label="CONTRATO" name="land_covenant_panel"> + <panel.string name="can_resell"> + El terreno comprado en esta región se podrá revender. </panel.string> - <panel.string name="none_text"> - (ninguno) + <panel.string name="can_not_resell"> + El terreno comprado en esta región no se podrá revender. </panel.string> - <panel.string name="sale_pending_text"> - (Venta pendiente) + <panel.string name="can_change"> + El terreno comprado en esta región se podrá unir o dividir. </panel.string> - <panel.string name="no_selection_text"> - No se ha seleccionado una parcela. -Vaya al menú Mundo > Acerca del terreno o seleccione otra parcela para ver sus caracterÃsticas. + <panel.string name="can_not_change"> + El terreno comprado en esta región no se podrá unir o dividir. </panel.string> - </panel> - <panel label="Contrato" name="land_covenant_panel"> <text name="estate_section_lbl"> Estado: </text> - <text name="estate_name_lbl"> - Nombre: - </text> <text name="estate_name_text"> mainland </text> @@ -144,9 +180,6 @@ Vaya al menú Mundo > Acerca del terreno o seleccione otra parcela para ver s <text name="region_section_lbl"> Región: </text> - <text name="region_name_lbl"> - Nombre: - </text> <text name="region_name_text"> leyla </text> @@ -174,121 +207,82 @@ Vaya al menú Mundo > Acerca del terreno o seleccione otra parcela para ver s <text name="changeable_clause"> El terreno de esta región no se podrá unir/dividir. </text> - <panel.string name="can_resell"> - El terreno comprado en esta región se podrá revender. - </panel.string> - <panel.string name="can_not_resell"> - El terreno comprado en esta región no se podrá revender. - </panel.string> - <panel.string name="can_change"> - El terreno comprado en esta región se podrá unir o dividir. + </panel> + <panel label="OBJETOS" name="land_objects_panel"> + <panel.string name="objects_available_text"> + [COUNT] de un máx. de [MAX] ([AVAILABLE] disponibles) </panel.string> - <panel.string name="can_not_change"> - El terreno comprado en esta región no se podrá unir o dividir. + <panel.string name="objects_deleted_text"> + [COUNT] de un máx. de [MAX] ([DELETED] se borrarán) </panel.string> - </panel> - <panel label="Objetos" name="land_objects_panel"> <text name="parcel_object_bonus"> Plus de objetos en la región: [BONUS] </text> <text name="Simulator primitive usage:"> - Simulador de uso de prims: + Uso de primitivas: </text> - <text name="objects_available" left="204" width="250" > - [COUNT] de un máximo de [MAX] ([AVAILABLE] disponibles) + <text left="204" name="objects_available" width="250"> + [COUNT] de un máx. de [MAX] ([AVAILABLE] disponibles) </text> - <panel.string name="objects_available_text"> - [COUNT] de un máximo de [MAX] ([AVAILABLE] disponibles) - </panel.string> - <panel.string name="objects_deleted_text"> - [COUNT] de un máximo de [MAX] ([DELETED] se borrarán) - </panel.string> <text name="Primitives parcel supports:" width="200"> Prims que admite la parcela: </text> - <text name="object_contrib_text" left="204" width="152"> + <text left="204" name="object_contrib_text" width="152"> [COUNT] </text> <text name="Primitives on parcel:"> Prims en la parcela: </text> - <text name="total_objects_text" left="204" width="48"> + <text left="204" name="total_objects_text" width="48"> [COUNT] </text> - <text name="Owned by parcel owner:" left="14" width="180" > + <text left="14" name="Owned by parcel owner:" width="180"> Del propietario de la parcela: </text> - <text name="owner_objects_text" left="204" width="48"> + <text left="204" name="owner_objects_text" width="48"> [COUNT] </text> <button label="Mostrar" label_selected="Mostrar" name="ShowOwner" right="-135" width="60"/> - <button label="Devolver..." label_selected="Devolver..." name="ReturnOwner..." tool_tip="Devolver los objetos a sus propietarios." right="-10" width="119"/> - <text name="Set to group:" left="14" width="180"> + <button label="Devolver" name="ReturnOwner..." right="-10" tool_tip="Devolver los objetos a sus propietarios." width="119"/> + <text left="14" name="Set to group:" width="180"> Del grupo: </text> - <text name="group_objects_text" left="204" width="48"> + <text left="204" name="group_objects_text" width="48"> [COUNT] </text> <button label="Mostrar" label_selected="Mostrar" name="ShowGroup" right="-135" width="60"/> - <button label="Devolver..." label_selected="Devolver..." name="ReturnGroup..." tool_tip="Devolver los objetos a sus propietarios." right="-10" width="119"/> - <text name="Owned by others:" left="14" width="128"> + <button label="Devolver" name="ReturnGroup..." right="-10" tool_tip="Devolver los objetos a sus propietarios." width="119"/> + <text left="14" name="Owned by others:" width="128"> Propiedad de otros: </text> - <text name="other_objects_text" left="204" width="48"> + <text left="204" name="other_objects_text" width="48"> [COUNT] </text> <button label="Mostrar" label_selected="Mostrar" name="ShowOther" right="-135" width="60"/> - <button label="Devolver..." label_selected="Devolver..." name="ReturnOther..." tool_tip="Devolver los objetos a sus propietarios." right="-10" width="119"/> - <text name="Selected / sat upon:" left="14" width="193" > + <button label="Devolver" name="ReturnOther..." right="-10" tool_tip="Devolver los objetos a sus propietarios." width="119"/> + <text left="14" name="Selected / sat upon:" width="193"> Seleccionados / con gente sentada: </text> - <text name="selected_objects_text" left="204" width="48"> + <text left="204" name="selected_objects_text" width="48"> [COUNT] </text> - <text name="Autoreturn" left="4" width="412" > - Autodevolución de objetos a otros residentes (minutos; 0 la desactiva): + <text name="Autoreturn"> + Devolución automát. de objetos de otros (en min., 0 la desactiva): </text> - <line_editor name="clean other time" right="-20" /> + <line_editor name="clean other time" right="-20"/> <text name="Object Owners:" width="150"> Propietarios de los objetos: </text> - <button label="Actualizar la lista" label_selected="Actualizar la lista" name="Refresh List" left="158"/> - <button label="Devolver los objetos..." label_selected="Devolver los objetos..." name="Return objects..." left="270" width="164"/> + <button label="Actualizar la lista" label_selected="Actualizar la lista" left="158" name="Refresh List" tool_tip="Refresh Object List"/> + <button label="Devolver los objetos" left="270" name="Return objects..." width="164"/> <name_list name="owner list"> - <column label="Tipo" name="type"/> - <column label="Nombre" name="name"/> - <column label="Número" name="count"/> - <column label="Más recientes" name="mostrecent"/> + <name_list.columns label="Tipo" name="type"/> + <name_list.columns label="Nombre" name="name"/> + <name_list.columns label="Núm." name="count"/> + <name_list.columns label="Más recientes" name="mostrecent"/> </name_list> </panel> - <panel label="Opciones" name="land_options_panel"> - <text name="allow_label"> - Permitir a otros residentes: - </text> - <check_box label="Editar el terreno" name="edit land check" tool_tip="Si se marca, cualquiera podrá modificar su terreno. Mejor dejarlo desmarcado, pues usted siempre puede modificar su terreno."/> - <check_box label="Crear hitos" name="check landmark"/> - <check_box label="Volar" name="check fly" tool_tip="Si se marca, los residentes podrán volar en su terreno. Si no, sólo podrán volar al cruzarlo o hasta que aterricen en él."/> - <text name="allow_label2" left="162" > - Crear objetos: - </text> - <check_box label="Todos los residentes" name="edit objects check" left="255" /> - <check_box label="El grupo" name="edit group objects check" left="385" /> - <text name="allow_label3" left="162"> - Dejar objetos: - </text> - <check_box label="Todos los residentes" name="all object entry check" left="255"/> - <check_box label="El grupo" name="group object entry check" left="385"/> - <text name="allow_label4" left="162"> - Ejecutar scripts: - </text> - <check_box label="Todos los residentes" name="check other scripts" left="255"/> - <check_box label="El grupo" name="check group scripts" left="385"/> - <text name="land_options_label"> - Opciones del terreno: - </text> - <check_box label="Seguro (sin daño)" name="check safe" tool_tip="Si se marca, convierte el terreno en 'seguro', desactivando el daño en combate. Si no, se activa el daño en combate."/> - <check_box label="Sin 'empujones'" name="PushRestrictCheck" tool_tip="Previene scripts que empujen. Marcando esta opción prevendrá que en su terreno haya comportamientos destructivos."/> - <check_box label="Mostrar la parcela en Buscar (30 L$/semana) en" name="ShowDirectoryCheck" tool_tip="Let people see this parcel in search results"/> + <panel label="OPCIONES" name="land_options_panel"> <panel.string name="search_enabled_tooltip"> Permitir que aparezca esta parcela en los resultados de la búsqueda </panel.string> @@ -299,62 +293,6 @@ Sólo las parcelas más grandes pueden listarse en la búsqueda. <panel.string name="search_disabled_permissions_tooltip"> Esta opción no esta activada porque usted no puede modificar las opciones de la parcela. </panel.string> - <combo_box name="land category with adult" left="282" width="140"> - <combo_box.item name="item0" label="Cualquier categorÃa" - /> - <combo_box.item name="item1" label="Localización Linden" - /> - <combo_box.item name="item2" label="'Adult'" - /> - <combo_box.item name="item3" label="Arte y Cultura" - /> - <combo_box.item name="item4" label="Negocios" - /> - <combo_box.item name="item5" label="Educativo" - /> - <combo_box.item name="item6" label="Juegos de azar" - /> - <combo_box.item name="item7" label="Entretenimiento" - /> - <combo_box.item name="item8" label="Para recién llegados" - /> - <combo_box.item name="item9" label="Parques y Naturaleza" - /> - <combo_box.item name="item10" label="Residencial" - /> - <combo_box.item name="item11" label="Compras" - /> - <combo_box.item name="item12" label="Otra" - /> - </combo_box> - <combo_box name="land category" left="282" width="140"> - <combo_box.item name="item0" label="Cualquier categorÃa" - /> - <combo_box.item name="item1" label="Localización Linden" - /> - <combo_box.item name="item3" label="Arte y Cultura" - /> - <combo_box.item name="item4" label="Negocios" - /> - <combo_box.item name="item5" label="Educativo" - /> - <combo_box.item name="item6" label="Juegos de azar" - /> - <combo_box.item name="item7" label="Entretenimiento" - /> - <combo_box.item name="item8" label="Para recién llegados" - /> - <combo_box.item name="item9" label="Parques y Naturaleza" - /> - <combo_box.item name="item10" label="Residencial" - /> - <combo_box.item name="item11" label="Compras" - /> - <combo_box.item name="item12" label="Otra" - /> - </combo_box> - <button label="?" label_selected="?" name="?" left="427"/> - <check_box label="Contenido 'Mature'" name="MatureCheck" tool_tip=""/> <panel.string name="mature_check_mature"> Contenido 'Mature' </panel.string> @@ -367,6 +305,71 @@ Sólo las parcelas más grandes pueden listarse en la búsqueda. <panel.string name="mature_check_adult_tooltip"> La información o el contenido de su parcela se considera 'Adult'. </panel.string> + <panel.string name="landing_point_none"> + (ninguno) + </panel.string> + <panel.string name="push_restrict_text"> + Sin 'empujones' + </panel.string> + <panel.string name="push_restrict_region_text"> + Sin 'empujones' (prevalece lo marcado en la región) + </panel.string> + <text name="allow_label"> + Permitir a otros Residentes: + </text> + <check_box label="Editar el terreno" name="edit land check" tool_tip="Si se marca, cualquiera podrá modificar su terreno. Mejor dejarlo desmarcado, pues usted siempre puede modificar su terreno."/> + <check_box label="Volar" name="check fly" tool_tip="Si se marca, los residentes podrán volar en su terreno. Si no, sólo podrán volar al cruzarlo o hasta que aterricen en él."/> + <text name="allow_label2"> + Crear objetos: + </text> + <check_box label="Todos los residentes" name="edit objects check"/> + <check_box label="El grupo" name="edit group objects check"/> + <text name="allow_label3"> + Dejar objetos: + </text> + <check_box label="Todos los residentes" name="all object entry check"/> + <check_box label="El grupo" name="group object entry check"/> + <text name="allow_label4"> + Ejecutar scripts: + </text> + <check_box label="Todos los residentes" name="check other scripts"/> + <check_box label="El grupo" name="check group scripts"/> + <text name="land_options_label"> + Opciones del terreno: + </text> + <check_box label="Seguro (sin daño)" name="check safe" tool_tip="Si se marca, convierte el terreno en 'seguro', desactivando el daño en combate. Si no, se activa el daño en combate."/> + <check_box label="Sin 'empujones'" name="PushRestrictCheck" tool_tip="Previene scripts que empujen. Marcando esta opción prevendrá que en su terreno haya comportamientos destructivos."/> + <check_box label="Mostrar el sitio en la búsqueda (30 L$/semana)" name="ShowDirectoryCheck" tool_tip="Let people see this parcel in search results"/> + <combo_box name="land category with adult"> + <combo_box.item label="Cualquier categorÃa" name="item0"/> + <combo_box.item label="Localización Linden" name="item1"/> + <combo_box.item label="'Adult'" name="item2"/> + <combo_box.item label="Arte y Cultura" name="item3"/> + <combo_box.item label="Negocios" name="item4"/> + <combo_box.item label="Educativo" name="item5"/> + <combo_box.item label="Juegos de azar" name="item6"/> + <combo_box.item label="Entretenimiento" name="item7"/> + <combo_box.item label="Para recién llegados" name="item8"/> + <combo_box.item label="Parques y Naturaleza" name="item9"/> + <combo_box.item label="Residencial" name="item10"/> + <combo_box.item label="Compras" name="item11"/> + <combo_box.item label="Otra" name="item12"/> + </combo_box> + <combo_box name="land category"> + <combo_box.item label="Cualquier categorÃa" name="item0"/> + <combo_box.item label="Localización Linden" name="item1"/> + <combo_box.item label="Arte y Cultura" name="item3"/> + <combo_box.item label="Negocios" name="item4"/> + <combo_box.item label="Educativo" name="item5"/> + <combo_box.item label="Juegos de azar" name="item6"/> + <combo_box.item label="Entretenimiento" name="item7"/> + <combo_box.item label="Para recién llegados" name="item8"/> + <combo_box.item label="Parques y Naturaleza" name="item9"/> + <combo_box.item label="Residencial" name="item10"/> + <combo_box.item label="Compras" name="item11"/> + <combo_box.item label="Otra" name="item12"/> + </combo_box> + <check_box label="Contenido 'Mature'" name="MatureCheck" tool_tip=""/> <text name="Snapshot:"> Foto: </text> @@ -374,61 +377,42 @@ Sólo las parcelas más grandes pueden listarse en la búsqueda. <text name="landing_point"> Punto de llegada: [LANDING] </text> - <panel.string name="landing_point_none"> - (ninguno) - </panel.string> <button label="Definir" label_selected="Definir" name="Set" tool_tip="Configura el punto de llegada donde aparecerán los visitantes. Configúrelo a la posición de su avatar dentro de esta parcela."/> <button label="Borrar" label_selected="Borrar" name="Clear" tool_tip="Borrar el punto de llegada."/> <text name="Teleport Routing: "> Punto de teleporte: </text> <combo_box name="landing type" tool_tip="Punto de teleporte: defina cómo manejar en su terreno los teleportes."> - <combo_box.item name="Blocked" label="Bloqueado" - /> - <combo_box.item name="LandingPoint" label="Punto de llegada" - /> - <combo_box.item name="Anywhere" label="Cualquiera" - /> + <combo_box.item label="Bloqueado" name="Blocked"/> + <combo_box.item label="Punto de llegada" name="LandingPoint"/> + <combo_box.item label="Cualquiera" name="Anywhere"/> </combo_box> - <panel.string name="push_restrict_text"> - Sin 'empujones' - </panel.string> - <panel.string name="push_restrict_region_text"> - Sin 'empujones' (prevalece lo marcado en la región) - </panel.string> </panel> - <panel label="Media" name="land_media_panel"> + <panel label="MEDIA" name="land_media_panel"> <text name="with media:" width="85"> Tipo de media: </text> - <combo_box name="media type" tool_tip="Especifique si la URL es una pelÃcula, una web, u otro media" left="97" /> + <combo_box left="97" name="media type" tool_tip="Especifique si la URL es una pelÃcula, una web, u otro media"/> <text name="at URL:" width="85"> - URL del media: + Página inicial: </text> <line_editor left="97" name="media_url"/> - <button label="Definir..." label_selected="Definir..." name="set_media_url"/> + <button label="Definir" name="set_media_url"/> + <check_box label="Ocultar la URL del media" left="97" name="hide_media_url" tool_tip="Marcando esta opción esconderá en la información de esta parcela -a quien no esté autorizado a verla- la URL del media. Note que esto no está disponible para HTML."/> <text name="Description:"> Descripción: </text> - <line_editor name="url_description" tool_tip="Texto a mostrar cerca del botón play/cargar" left="97" /> + <line_editor left="97" name="url_description" tool_tip="Texto a mostrar cerca del botón play/cargar"/> <text name="Media texture:"> Cambiar la textura: </text> - <texture_picker label="" name="media texture" tool_tip="Pulse para elegir una imagen" left="97" /> + <texture_picker label="" left="97" name="media texture" tool_tip="Pulse para elegir una imagen"/> <text name="replace_texture_help" width="285"> - (Los objetos que usen esta textura mostrarán la -pelÃcula o la web cuando pulse la flecha de play.) - </text> - <text name="Options:"> - Opciones de -los media: + Cuando pulses la flecha 'play', los objetos que usen esta textura mostrarán la pelÃcula o la página web. Selecciona la miniatura para elegir una textura distinta. </text> - <check_box left="97" label="Escala automática" name="media_auto_scale" tool_tip="Marcando esta opción, se ajustará el tamaño del contenido automáticamente. Puede ser ligeramente más lento y con menor calidad visual, pero no tendrá que ajustar ni alinear ninguna textura."/> - <check_box label="Media en bucle" name="media_loop" tool_tip="Ejecuta el media en bucle: cuando acaba su ejecución, vuelve a empezar."/> - <check_box left="97" label="Ocultar la URL del media" name="hide_media_url" tool_tip="Marcando esta opción esconderá en la información de esta parcela -a quien no esté autorizado a verla- la URL del media. Note que esto no está disponible para HTML."/> - <check_box label="Ocultar la URL de la música" name="hide_music_url" tool_tip="Marcando esta opción esconderá en la información de esta parcela -a quien no esté autorizado a verla- la URL de la música"/> - <text name="media_size" tool_tip="Tamaño en el que mostrar las web (marque 0 para por defecto)." left="102" width="120"> + <check_box label="Escala automática" left="97" name="media_auto_scale" tool_tip="Marcando esta opción, se ajustará el tamaño del contenido automáticamente. Puede ser ligeramente más lento y con menor calidad visual, pero no tendrá que ajustar ni alinear ninguna textura."/> + <text left="102" name="media_size" tool_tip="Tamaño en el que mostrar las web (marque 0 para por defecto)." width="120"> Tamaño del media: </text> <spinner left_delta="104" name="media_size_width" tool_tip="Tamaño en el que mostrar las web (marque 0 para por defecto)."/> @@ -436,58 +420,48 @@ los media: <text name="pixels"> pÃxeles </text> - <text name="MusicURL:" bottom_delta="-28" > - URL de la -música: - </text> - <line_editor bottom_delta="-12" left="97" name="music_url"/> - <text name="Sound:"> - Sonido: - </text> - <check_box left="97" label="Limitar los gestos y los sonidos de objetos a esta parcela" name="check sound local"/> - <button label="?" label_selected="?" name="?" left="424"/> - <text name="Voice settings:"> - Voz: + <text name="Options:"> + Opciones de +los media: </text> - <check_box left="97" label="Activar la voz" name="parcel_enable_voice_channel"/> - <check_box left="97" label="Activar la voz (establecido por el Estado)" name="parcel_enable_voice_channel_is_estate_disabled"/> - <check_box left="117" label="Limitar la voz a esta parcela" name="parcel_enable_voice_channel_parcel"/> + <check_box label="Media en bucle" name="media_loop" tool_tip="Ejecuta el media en bucle: cuando acaba su ejecución, vuelve a empezar."/> + </panel> + <panel label="SONIDO" name="land_audio_panel"> + <check_box label="Ocultar la URL" name="hide_music_url" tool_tip="Al marcar esta opción se ocultará la URL de la música a quien no esté autorizado a ver la información de esta parcela."/> + <check_box label="Activar la voz" name="parcel_enable_voice_channel"/> + <check_box label="Autorizar la voz (establecido por el Estado)" name="parcel_enable_voice_channel_is_estate_disabled"/> + <check_box label="Limitar la voz a esta parcela" name="parcel_enable_voice_channel_local"/> </panel> - <panel label="Acceso" name="land_access_panel"> + <panel label="ACCESO" name="land_access_panel"> + <panel.string name="access_estate_defined"> + (Definido por el Estado) + </panel.string> + <panel.string name="allow_public_access"> + Permitir el acceso público ([MATURITY]) + </panel.string> + <panel.string name="estate_override"> + Una o más de esta opciones está configurada a nivel del estado + </panel.string> <text name="Limit access to this parcel to:"> Acceso a esta parcela </text> - <check_box label="Permitir el acceso público" name="public_access"/> + <check_box label="Permitir el acceso público [MATURITY]" name="public_access"/> <text name="Only Allow"> - Impedir el acceso a: + Restringir el acceso a residentes verificados con: </text> - <check_box label="Residentes que no hayan dado a Linden Lab información de su forma de pago" name="limit_payment" tool_tip="Impedir el acceso a los residentes no identificados."/> - <check_box label="Residentes de los que no se ha verificado si son adultos" name="limit_age_verified" tool_tip="Residentes que no hayan verificado su edad. Para más información, vea support.secondlife.com"/> - <panel.string name="estate_override"> - Una o más de esta opciones está configurada a nivel del estado - </panel.string> + <check_box label="Información de pago aportada [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="Expulsa a los Residentes no identificados."/> + <check_box label="Verificación de edad [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="Expulsa a los Residentes que no hayan verificado su edad. Más información en [SUPPORT_SITE]."/> <check_box label="Acceso permitido al grupo: [GROUP]" name="GroupCheck" tool_tip="Elija el grupo en la pestaña General."/> <check_box label="Vender pases a:" name="PassCheck" tool_tip="Permitir acceso temporal a esta parcela"/> <combo_box name="pass_combo"> - <combo_box.item name="Anyone" label="Cualquiera" - /> - <combo_box.item name="Group" label="Grupo" - /> + <combo_box.item label="Cualquiera" name="Anyone"/> + <combo_box.item label="Grupo" name="Group"/> </combo_box> <spinner label="Precio en L$:" name="PriceSpin"/> <spinner label="Horas de acceso:" name="HoursSpin"/> - <text label="Permitir siempre" name="AllowedText"> - Residentes autorizados - </text> - <name_list name="AccessList" tool_tip="([LISTED] listados, el máx. es de [MAX])"/> - <button label="Añadir..." label_selected="Añadir..." name="add_allowed"/> - <button label="Quitar" label_selected="Quitar" name="remove_allowed"/> - <text label="Prohibir el acceso" name="BanCheck"> - Residentes con el acceso prohibido - </text> - <name_list name="BannedList" tool_tip="([LISTED] listados, el máx. es de [MAX])"/> - <button label="Añadir..." label_selected="Añadir..." name="add_banned"/> - <button label="Quitar" label_selected="Quitar" name="remove_banned"/> + <panel name="Allowed_layout_panel"> + <name_list name="AccessList" tool_tip="([LISTED] listados de un máx. de [MAX])"/> + </panel> </panel> </tab_container> </floater> diff --git a/indra/newview/skins/default/xui/es/floater_activeim.xml b/indra/newview/skins/default/xui/es/floater_activeim.xml new file mode 100644 index 0000000000..988786c1ae --- /dev/null +++ b/indra/newview/skins/default/xui/es/floater_activeim.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_activeim" title="MI activo"/> diff --git a/indra/newview/skins/default/xui/es/floater_animation_preview.xml b/indra/newview/skins/default/xui/es/floater_animation_preview.xml index 5a03aa6370..d57405f7e5 100644 --- a/indra/newview/skins/default/xui/es/floater_animation_preview.xml +++ b/indra/newview/skins/default/xui/es/floater_animation_preview.xml @@ -1,91 +1,187 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="Animation Preview" title=""> + <floater.string name="failed_to_initialize"> + Fallo al iniciar el movimiento + </floater.string> + <floater.string name="anim_too_long"> + El archivo de la animación dura [LENGTH] segundos. + +La duración máxima de una animación es de [MAX_LENGTH] segundos. + </floater.string> + <floater.string name="failed_file_read"> + No se ha podido leer el archivo de la animación. + +[STATUS] + </floater.string> + <floater.string name="E_ST_OK"> + OK + </floater.string> + <floater.string name="E_ST_EOF"> + Fin prematuro del archivo. + </floater.string> + <floater.string name="E_ST_NO_CONSTRAINT"> + No se puede leer la definición de la restricción. + </floater.string> + <floater.string name="E_ST_NO_FILE"> + No se puede abrir el archivo BVH. + </floater.string> + <floater.string name="E_ST_NO_HIER"> + 'HIERARCHY header' inválido. + </floater.string> + <floater.string name="E_ST_NO_JOINT"> + No se pueden encontrar 'ROOT' o 'JOINT'. + </floater.string> + <floater.string name="E_ST_NO_NAME"> + No se puede obtener el nombre 'JOINT'. + </floater.string> + <floater.string name="E_ST_NO_OFFSET"> + No se puede encontrar 'OFFSET'. + </floater.string> + <floater.string name="E_ST_NO_CHANNELS"> + No se puede encontrar 'CHANNELS'. + </floater.string> + <floater.string name="E_ST_NO_ROTATION"> + No se puede conseguir el orden de la rotación. + </floater.string> + <floater.string name="E_ST_NO_AXIS"> + No se puede encontrar el eje de rotación. + </floater.string> + <floater.string name="E_ST_NO_MOTION"> + No se puede encontrar 'MOTION'. + </floater.string> + <floater.string name="E_ST_NO_FRAMES"> + No se puede conseguir el número de frames. + </floater.string> + <floater.string name="E_ST_NO_FRAME_TIME"> + No se puede conseguir el tiempo del frame. + </floater.string> + <floater.string name="E_ST_NO_POS"> + No se pueden conseguir los valores de la posición. + </floater.string> + <floater.string name="E_ST_NO_ROT"> + No se pueden conseguir los valores de la rotación. + </floater.string> + <floater.string name="E_ST_NO_XLT_FILE"> + No se puede abrir el archivo de traducción. + </floater.string> + <floater.string name="E_ST_NO_XLT_HEADER"> + No se puede leer el encabezamiento de la traducción. + </floater.string> + <floater.string name="E_ST_NO_XLT_NAME"> + No se puede leer la traducción de los nombres. + </floater.string> + <floater.string name="E_ST_NO_XLT_IGNORE"> + No se puede leer la traducción de los valores ignorados. + </floater.string> + <floater.string name="E_ST_NO_XLT_RELATIVE"> + No se puede leer el valor relativo de la traducción. + </floater.string> + <floater.string name="E_ST_NO_XLT_OUTNAME"> + No se puede leer la traducción del valor 'outname' + </floater.string> + <floater.string name="E_ST_NO_XLT_MATRIX"> + No se puede leer la matriz de traducciones. + </floater.string> + <floater.string name="E_ST_NO_XLT_MERGECHILD"> + No se puede conseguir el nombre 'mergechild'. + </floater.string> + <floater.string name="E_ST_NO_XLT_MERGEPARENT"> + No se puede conseguir el nombre 'mergeparent'. + </floater.string> + <floater.string name="E_ST_NO_XLT_PRIORITY"> + No se puede obtener el valor prioritario. + </floater.string> + <floater.string name="E_ST_NO_XLT_LOOP"> + No se puede conseguir el valor del bucle. + </floater.string> + <floater.string name="E_ST_NO_XLT_EASEIN"> + No se pueden conseguir los valores 'easeIn'. + </floater.string> + <floater.string name="E_ST_NO_XLT_EASEOUT"> + No se pueden conseguir los valores 'easeOut'. + </floater.string> + <floater.string name="E_ST_NO_XLT_HAND"> + No se puede conseguir el valor de 'hand morph'. + </floater.string> + <floater.string name="E_ST_NO_XLT_EMOTE"> + No se puede leer el nombre del gesto. + </floater.string> + <floater.string name="E_ST_BAD_ROOT"> + Nombre incorrecto de 'root joint', usa "hip". + </floater.string> <text name="name_label"> Nombre: </text> <text name="description_label"> Descripción: </text> - <spinner label_width="72" width="110" label="Prioridad:" name="priority" tool_tip="Controle qué otras animaciones pueden ser anuladas por ésta."/> - <check_box left="8" label="Bucle:" name="loop_check" tool_tip="Haga esta animación en bucle."/> - <spinner label_width="65" left="65" width="116" label="Empieza(%)" name="loop_in_point" tool_tip="Indique el punto en el que la animación empieza el bucle."/> - <spinner label_width="50" left="185" label="Acaba(%)" name="loop_out_point" tool_tip="Indique el punto en el que la animación acaba el bucle."/> + <spinner label="Prioridad:" name="priority" tool_tip="Controla qué otras animaciones pueden ser anuladas por ésta"/> + <check_box label="Bucle:" name="loop_check" tool_tip="Hace esta animación en bucle"/> + <spinner label="Empieza(%)" name="loop_in_point" tool_tip="Indica el punto en el que la animación vuelve a empezar"/> + <spinner label="Acaba(%)" name="loop_out_point" tool_tip="Indica el punto en el que la animación acaba el bucle"/> <text name="hand_label"> Posición de las manos </text> - <combo_box left_delta="120" width="164" name="hand_pose_combo" tool_tip="Control de lo que hacen las manos durante la animación."> - <combo_box.item name="Spread" label="Extendidas"/> - <combo_box.item name="Relaxed" label="Relajadas"/> - <combo_box.item name="PointBoth" label="Ambas señalan"/> - <combo_box.item name="Fist" label="Puño"/> - <combo_box.item name="RelaxedLeft" label="La izquierda relajada"/> - <combo_box.item name="PointLeft" label="La izquierda señala"/> - <combo_box.item name="FistLeft" label="Puño en la izquierda"/> - <combo_box.item name="RelaxedRight" label="La derecha relajada"/> - <combo_box.item name="PointRight" label="La derecha señala"/> - <combo_box.item name="FistRight" label="Puño en la derecha"/> - <combo_box.item name="SaluteRight" label="La derecha saluda"/> - <combo_box.item name="Typing" label="Escribiendo"/> - <combo_box.item name="PeaceRight" label="Paz en la derecha"/> + <combo_box name="hand_pose_combo" tool_tip="Controla qué hacen las manos durante la animación"> + <combo_box.item label="Extendidas" name="Spread"/> + <combo_box.item label="Relajadas" name="Relaxed"/> + <combo_box.item label="Ambas señalan" name="PointBoth"/> + <combo_box.item label="Puño" name="Fist"/> + <combo_box.item label="La izq. relajada" name="RelaxedLeft"/> + <combo_box.item label="La izq. señala" name="PointLeft"/> + <combo_box.item label="Puño izq." name="FistLeft"/> + <combo_box.item label="La der. relajada" name="RelaxedRight"/> + <combo_box.item label="La der. señala" name="PointRight"/> + <combo_box.item label="Puño der." name="FistRight"/> + <combo_box.item label="La derecha saluda" name="SaluteRight"/> + <combo_box.item label="Escribiendo" name="Typing"/> + <combo_box.item label="'Paz' en la der." name="PeaceRight"/> </combo_box> <text name="emote_label"> Expresión </text> - <combo_box left_delta="120" width="164" name="emote_combo" tool_tip="Controle qué hace la cara durante la animación."> - <combo_box.item name="[None]" label="Nada]"/> - <combo_box.item name="Aaaaah" label="Aaaaah"/> - <combo_box.item name="Afraid" label="Con miedo"/> - <combo_box.item name="Angry" label="Enfadada"/> - <combo_box.item name="BigSmile" label="Gran sonrisa"/> - <combo_box.item name="Bored" label="Aburrida"/> - <combo_box.item name="Cry" label="Llorar"/> - <combo_box.item name="Disdain" label="Desdén"/> - <combo_box.item name="Embarrassed" label="Avergonzada"/> - <combo_box.item name="Frown" label="Fruncir el ceño"/> - <combo_box.item name="Kiss" label="Besar"/> - <combo_box.item name="Laugh" label="ReÃr"/> - <combo_box.item name="Plllppt" label="Sacar la lengua"/> - <combo_box.item name="Repulsed" label="Rechazo"/> - <combo_box.item name="Sad" label="Triste"/> - <combo_box.item name="Shrug" label="Encogerse de hombros"/> - <combo_box.item name="Smile" label="Sonrisa"/> - <combo_box.item name="Surprise" label="Sorpresa"/> - <combo_box.item name="Wink" label="Guiño"/> - <combo_box.item name="Worry" label="Preocupación"/> + <combo_box name="emote_combo" tool_tip="Controla qué hace la cara durante la animación"> + <item label="(ninguno)" name="[None]" value=""/> + <item label="Aaaaah" name="Aaaaah" value="Aaaaah"/> + <item label="Con miedo" name="Afraid" value="Miedo"/> + <item label="Enfado" name="Angry" value="Enfado"/> + <item label="Gran sonrisa" name="BigSmile" value="Gran sonrisa"/> + <item label="Aburrimiento" name="Bored" value="Aburrimiento"/> + <item label="Llorar" name="Cry" value="Lloro"/> + <item label="Desdén" name="Disdain" value="Desdén"/> + <item label="Avergonzarse" name="Embarrassed" value="Vergüenza"/> + <item label="Fruncir el ceño" name="Frown" value="Fruncir el ceño"/> + <item label="Beso" name="Kiss" value="Beso"/> + <item label="ReÃr" name="Laugh" value="Risa"/> + <item label="Sacar la lengua" name="Plllppt" value="Sacar la lengua"/> + <item label="Rechazo" name="Repulsed" value="Rechazo"/> + <item label="Triste" name="Sad" value="Tristeza"/> + <item label="Encogerse de hombros" name="Shrug" value="Encogerse de hombros"/> + <item label="Sonrisa" name="Smile" value="Sonrisa"/> + <item label="Sorpresa" name="Surprise" value="Sorpresa"/> + <item label="Guiño" name="Wink" value="Guiño"/> + <item label="Preocupación" name="Worry" value="Preocupación"/> </combo_box> - <text name="preview_label" width="250"> + <text name="preview_label"> Vista previa mientras </text> - <combo_box left_delta="120" width="130" name="preview_base_anim" tool_tip="Compruebe cómo se comporta su animación a la vez que el avatar realiza acciones comunes."> - <combo_box.item name="Standing" label="Estar de pie"/> - <combo_box.item name="Walking" label="Caminar"/> - <combo_box.item name="Sitting" label="Estar sentado"/> - <combo_box.item name="Flying" label="Volar"/> + <combo_box name="preview_base_anim" tool_tip="Compruebe cómo se comporta su animación a la vez que el avatar realiza acciones comunes."> + <item label="De pie" name="Standing" value="De pie"/> + <item label="Caminando" name="Walking" value="Caminando"/> + <item label="Sentado/a" name="Sitting" value="Sentado"/> + <item label="Volando" name="Flying" value="Volando"/> </combo_box> - <spinner label_width="125" width="192" label="Combinar (sec)" name="ease_in_time" tool_tip="Tiempo (en segundos) en el que se combinan las animaciones."/> - <spinner bottom_delta="-20" label_width="125" left="10" width="192" label="Dejar de combinar (sec)" name="ease_out_time" tool_tip="Tiempo (en segundos) en el que dejan de combinarse las animaciones."/> - <button bottom_delta="-32" name="play_btn" tool_tip="Mover/Pausar su animación."/> + <spinner label="Combinar (sec)" name="ease_in_time" tool_tip="Tiempo (en segundos) en el que se combinan las animaciones"/> + <spinner label="Dejar de combinar (sec)" name="ease_out_time" tool_tip="Tiempo (en segundos) en el que dejan de combinarse las animaciones"/> + <button bottom_delta="-32" name="play_btn" tool_tip="Ejecutar tu animación"/> + <button name="pause_btn" tool_tip="Pausar tu animación"/> <button label="" name="stop_btn" tool_tip="Parar la repetición de la animación"/> <slider label="" name="playback_slider"/> <text name="bad_animation_text"> No se ha podido leer el archivo de la animación. -Recomendamos usar archivos BVH exportados de -Poser 4. +Recomendamos usar archivos BVH exportados de Poser 4. </text> - <button label="Cancelar" name="cancel_btn"/> <button label="Subir ([AMOUNT] L$)" name="ok_btn"/> - <string name="failed_to_initialize"> - Fallo al iniciar el movimiento - </string> - <string name="anim_too_long"> - El archivo de la animación dura [LENGTH] segundos. - -La duración máxima de una animación es de [MAX_LENGTH] segundos. - </string> - <string name="failed_file_read"> - No se ha podido leer el archivo de la animación. - -[STATUS] - </string> + <button label="Cancelar" name="cancel_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/es/floater_auction.xml b/indra/newview/skins/default/xui/es/floater_auction.xml index 5196ac0b78..6faf19dbb5 100644 --- a/indra/newview/skins/default/xui/es/floater_auction.xml +++ b/indra/newview/skins/default/xui/es/floater_auction.xml @@ -1,9 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_auction" title="EMPEZAR VENTA DE TERRENO LINDEN"> - <check_box label="Incluir la valla amarilla de selección" name="fence_check"/> - <button label="Foto" label_selected="Foto" name="snapshot_btn"/> - <button label="OK" label_selected="OK" name="ok_btn"/> - <text name="already for sale"> +<floater name="floater_auction" title="COMENZAR LA VENTA DE TERRENO LINDEN"> + <floater.string name="already for sale"> No puede subastar parcelas que ya están en venta. - </text> + </floater.string> + <check_box initial_value="true" label="Incluir la valla amarilla de selección" name="fence_check"/> + <button label="Foto" label_selected="Foto" name="snapshot_btn"/> + <button label="Vender a cualquiera" label_selected="Vender a cualquiera" name="sell_to_anyone_btn"/> + <button label="Limpiar las configuraciones" label_selected="Limpiar las configuraciones" name="reset_parcel_btn"/> + <button label="Comenzar subasta" label_selected="Comenzar subasta" name="start_auction_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/es/floater_avatar_picker.xml b/indra/newview/skins/default/xui/es/floater_avatar_picker.xml index df0147b191..c83dd3ef3e 100644 --- a/indra/newview/skins/default/xui/es/floater_avatar_picker.xml +++ b/indra/newview/skins/default/xui/es/floater_avatar_picker.xml @@ -1,42 +1,47 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="avatarpicker" title="ELEGIR A UN RESIDENTE"> + <floater.string name="not_found"> + No se ha encontrado '[TEXT]' + </floater.string> + <floater.string name="no_one_near"> + No hay nadie cerca + </floater.string> + <floater.string name="no_results"> + Sin resultados + </floater.string> + <floater.string name="searching"> + Buscando... + </floater.string> + <string label="Elegir" label_selected="Elegir" name="Select"> + Seleccionar + </string> + <string name="Close"> + Cerrar + </string> <tab_container name="ResidentChooserTabs"> <panel label="Buscar" name="SearchPanel"> <text name="InstructSearchResidentName"> - Escriba parte del nombre del residente: + Escribe parte del nombre de la persona: </text> - <button label="Buscar" label_selected="Buscar" name="Find"/> + <button label="Ir" label_selected="Ir" name="Find"/> </panel> - <panel label="Tarjetas de visita" name="CallingCardsPanel"> - <text name="InstructSelectCallingCard"> - Elija una tarjeta de visita: + <panel label="Amigos" name="FriendsPanel"> + <text name="InstructSelectFriend"> + Elige a una persona: </text> </panel> <panel label="Cercanos" name="NearMePanel"> <text name="InstructSelectResident"> - Seleccionar un -residente cercano: + Elegir a alguien que esté cerca: </text> - <button font="SansSerifSmall" left_delta="1" width="115" label="Actualizar la lista" label_selected="Actualizar la lista" name="Refresh"/> - <slider label="Alcance" name="near_me_range" bottom_delta="-36"/> + <slider bottom_delta="-36" label="Alcance" name="near_me_range"/> <text name="meters"> Metros </text> - <scroll_list bottom_delta="-169" height="159" name="NearMe" /> + <button font="SansSerifSmall" label="Actualizar la lista" label_selected="Actualizar la lista" left_delta="1" name="Refresh" width="115"/> + <scroll_list bottom_delta="-169" height="159" name="NearMe"/> </panel> </tab_container> - <button label="Elegir" label_selected="Elegir" name="Select"/> - <button label="Cancelar" label_selected="Cancelar" name="Cancel"/> - <string name="not_found"> - No se ha encontrado '[TEXT]' - </string> - <string name="no_one_near"> - No hay nadie cerca - </string> - <string name="no_results"> - Sin resultados - </string> - <string name="searching"> - Buscando... - </string> + <button label="OK" label_selected="OK" name="ok_btn"/> + <button label="Cancelar" label_selected="Cancelar" name="cancel_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/es/floater_avatar_textures.xml b/indra/newview/skins/default/xui/es/floater_avatar_textures.xml index 8febe4b0a9..54ef34264c 100644 --- a/indra/newview/skins/default/xui/es/floater_avatar_textures.xml +++ b/indra/newview/skins/default/xui/es/floater_avatar_textures.xml @@ -1,30 +1,48 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="avatar_texture_debug" title="TEXTURAS DEL AVATAR"> - <text name="baked_label"> - Texturas predeterminadas - </text> - <text name="composite_label"> - Texturas compuestas - </text> - <texture_picker label="Cabeza" name="baked_head"/> - <texture_picker label="Maquillaje" name="head_bodypaint"/> - <texture_picker label="Pelo" name="hair"/> - <button label="Soltar" label_selected="Soltar" name="Dump"/> - <texture_picker label="Ojos" name="baked_eyes"/> - <texture_picker label="Ojo" name="eye_texture"/> - <texture_picker label="Parte superior del cuerpo" name="baked_upper_body"/> - <texture_picker label="Tatuaje de la parte superior del cuerpo" name="upper_bodypaint"/> - <texture_picker label="Camiseta" name="undershirt"/> - <texture_picker label="Guantes" name="gloves"/> - <texture_picker label="Camisa" name="shirt"/> - <texture_picker label="Parte superior de la chaqueta" name="upper_jacket"/> - <texture_picker label="Parte inferior del cuerpo" name="baked_lower_body"/> - <texture_picker label="Tatuaje de la parte inferior del cuerpo" name="lower_bodypaint"/> - <texture_picker label="Ropa interior" name="underpants"/> - <texture_picker label="Calcetines" name="socks"/> - <texture_picker label="Zapatos" name="shoes"/> - <texture_picker label="Pantalones" name="pants"/> - <texture_picker label="Chaqueta" name="jacket"/> - <texture_picker label="Falda" name="baked_skirt"/> - <texture_picker label="Falda" name="skirt_texture"/> + <floater.string name="InvalidAvatar"> + AVATAR NO VÃLIDO + </floater.string> + <scroll_container name="profile_scroll"> + <panel name="scroll_content_panel"> + <text name="label"> + Texturas obtenidas mediante bake + </text> + <text name="composite_label"> + Texturas compuestas + </text> + <button label="Volcar IDs a la consola" label_selected="Volcado" name="Dump"/> + <panel name="scroll_content_panel"> + <texture_picker label="Pelo" name="hair-baked"/> + <texture_picker label="Pelo" name="hair_grain"/> + <texture_picker label="Alfa del pelo" name="hair_alpha"/> + <texture_picker label="Cabeza" name="head-baked"/> + <texture_picker label="Maquillaje" name="head_bodypaint"/> + <texture_picker label="Alfa de la cabeza" name="head_alpha"/> + <texture_picker label="Tatuaje de la cabeza" name="head_tattoo"/> + <texture_picker label="Ojos" name="eyes-baked"/> + <texture_picker label="Ojo" name="eyes_iris"/> + <texture_picker label="Alfa de los ojos" name="eyes_alpha"/> + <texture_picker label="Parte superior del cuerpo" name="upper-baked"/> + <texture_picker label="Pintura corporal superior" name="upper_bodypaint"/> + <texture_picker label="Camiseta" name="upper_undershirt"/> + <texture_picker label="Guantes" name="upper_gloves"/> + <texture_picker label="Camisa" name="upper_shirt"/> + <texture_picker label="Parte superior de la chaqueta" name="upper_jacket"/> + <texture_picker label="Alfa superior" name="upper_alpha"/> + <texture_picker label="Tatuaje superior" name="upper_tattoo"/> + <texture_picker label="Parte inferior del cuerpo" name="lower-baked"/> + <texture_picker label="Pintura corporal inferior" name="lower_bodypaint"/> + <texture_picker label="Ropa interior" name="lower_underpants"/> + <texture_picker label="Calcetines" name="lower_socks"/> + <texture_picker label="Zapatos" name="lower_shoes"/> + <texture_picker label="Pantalones" name="lower_pants"/> + <texture_picker label="Chaqueta" name="lower_jacket"/> + <texture_picker label="Alfa inferior" name="lower_alpha"/> + <texture_picker label="Tatuaje inferior" name="lower_tattoo"/> + <texture_picker label="Falda" name="skirt-baked"/> + <texture_picker label="Falda" name="skirt"/> + </panel> + </panel> + </scroll_container> </floater> diff --git a/indra/newview/skins/default/xui/es/floater_beacons.xml b/indra/newview/skins/default/xui/es/floater_beacons.xml index 2df90bc911..b86967755c 100644 --- a/indra/newview/skins/default/xui/es/floater_beacons.xml +++ b/indra/newview/skins/default/xui/es/floater_beacons.xml @@ -1,15 +1,21 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="beacons" title="BALIZAS"> <panel name="beacons_panel"> - <check_box label="Objetos con script sólo al tocarlos" name="touch_only"/> - <check_box label="Objetos con script" name="scripted"/> - <check_box label="Objetos materiales" name="physical"/> - <check_box label="Fuentes de sonido" name="sounds"/> - <check_box label="Fuentes de partÃculas" name="particles"/> - <check_box label="Activar los realzados" name="highlights"/> - <check_box label="Activar las balizas" name="beacons"/> - <text name="beacon_width_label"> - Ancho de la baliza: + <text name="label_show"> + Mostrar: </text> + <check_box label="Balizas" name="beacons"/> + <check_box label="Realzados" name="highlights"/> + <text name="beacon_width_label" tool_tip="Ancho de la baliza"> + Ancho: + </text> + <text name="label_objects"> + Para estos objetos: + </text> + <check_box label="Materiales" name="physical"/> + <check_box label="Con scripts" name="scripted"/> + <check_box label="Sólo tocar" name="touch_only"/> + <check_box label="Origen de sonidos" name="sounds"/> + <check_box label="Origen de partÃculas" name="particles"/> </panel> </floater> diff --git a/indra/newview/skins/default/xui/es/floater_build_options.xml b/indra/newview/skins/default/xui/es/floater_build_options.xml index 3d839bf645..9d63abd73c 100644 --- a/indra/newview/skins/default/xui/es/floater_build_options.xml +++ b/indra/newview/skins/default/xui/es/floater_build_options.xml @@ -1,8 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="build options floater" title="OPCIONES DE LA CUADRÃCULA"> - <spinner label="Unidad de la cuadrÃcula (metros)" name="GridResolution" width="250" label_width="192"/> - <spinner label="Graduación de la cuadrÃcula (metros)" name="GridDrawSize" width="250" label_width="192"/> + <spinner label="Unidad de la cuadrÃcula (metros)" label_width="192" name="GridResolution" width="250"/> + <spinner label="Alcance de la cuadrÃcula (metros)" label_width="192" name="GridDrawSize" width="250"/> <check_box label="Activar subunidades" name="GridSubUnit"/> <check_box label="Ver la sección transversal" name="GridCrossSection"/> + <text name="grid_opacity_label" tool_tip="Opacidad de la cuadrÃcula"> + Opacidad: + </text> <slider label="Opacidad de la cuadrÃcula" name="GridOpacity" width="250"/> </floater> diff --git a/indra/newview/skins/default/xui/es/floater_bulk_perms.xml b/indra/newview/skins/default/xui/es/floater_bulk_perms.xml index 0553f4c672..f1948220b4 100644 --- a/indra/newview/skins/default/xui/es/floater_bulk_perms.xml +++ b/indra/newview/skins/default/xui/es/floater_bulk_perms.xml @@ -1,44 +1,54 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floaterbulkperms" title="CAMBIO MASIVO DE LOS PERMISOS DEL CONTENIDO"> - <text name="applyto"> - Tipos de contenido - </text> +<floater name="floaterbulkperms" title="EDITAR LOS PERMISOS DEL CONTENIDO"> + <floater.string name="nothing_to_modify_text"> + Lo seleccionado tiene contenidos no editables. + </floater.string> + <floater.string name="status_text"> + Configurando los permisos de [NAME] + </floater.string> + <floater.string name="start_text"> + Iniciando el cambio de permisos solicitado... + </floater.string> + <floater.string name="done_text"> + Finalizado el cambio de permisos solicitado. + </floater.string> <check_box label="Animación" name="check_animation"/> + <icon name="icon_animation" tool_tip="Animaciones"/> <check_box label="Partes del cuerpo" name="check_bodypart"/> + <icon name="icon_bodypart" tool_tip="Partes del cuerpo"/> <check_box label="Ropa" name="check_clothing"/> + <icon name="icon_clothing" tool_tip="Ropa"/> <check_box label="Gestos" name="check_gesture"/> - <check_box label="Hitos" name="check_landmark"/> + <icon name="icon_gesture" tool_tip="Gestos"/> <check_box label="Notas" name="check_notecard"/> + <icon name="icon_notecard" tool_tip="Notas"/> <check_box label="Objetos" name="check_object"/> + <icon name="icon_object" tool_tip="Objetos"/> <check_box label="Scripts" name="check_script"/> + <icon name="icon_script" tool_tip="Scripts"/> <check_box label="Sonidos" name="check_sound"/> + <icon name="icon_sound" tool_tip="Sonidos"/> <check_box label="Texturas" name="check_texture"/> - <button label="Marcar todo" label_selected="Todo" name="check_all"/> - <button label="Desmarcar todo" label_selected="Ninguno" name="check_none"/> + <icon name="icon_texture" tool_tip="Texturas"/> + <button label="√ Todos" label_selected="Todo" name="check_all"/> + <button label="Limpiar" label_selected="Ninguno" name="check_none"/> <text name="newperms"> - Permisos nuevos + Permisos nuevos del contenido + </text> + <text name="GroupLabel"> + Grupo: </text> - <check_box label="Compartir con el grupo" name="share_with_group"/> - <check_box label="Permitir a cualquiera que lo copie" name="everyone_copy"/> + <check_box label="Compartir" name="share_with_group"/> + <text name="AnyoneLabel"> + Cualquiera: + </text> + <check_box label="Copiarlo" name="everyone_copy"/> <text name="NextOwnerLabel"> - El próximo propietario puede: + Próximo propietario: </text> <check_box label="Modificarlo" name="next_owner_modify"/> <check_box label="Copiarlo" name="next_owner_copy"/> - <check_box label="Revenderlo/Darlo" name="next_owner_transfer"/> - <button label="Ayuda" name="help"/> - <button label="Aplicar" name="apply"/> - <button label="Cerrar" name="close"/> - <string name="nothing_to_modify_text"> - Lo seleccionado tiene contenidos no editables. - </string> - <string name="status_text"> - Configurando los permisos de [NAME] - </string> - <string name="start_text"> - Iniciando el cambio de permisos solicitado... - </string> - <string name="done_text"> - Finalizado el cambio de permisos solicitado. - </string> + <check_box initial_value="true" label="Transferirlo" name="next_owner_transfer" tool_tip="El próximo propietario puede dar o revender este objeto"/> + <button label="OK" name="apply"/> + <button label="Cancelar" name="close"/> </floater> diff --git a/indra/newview/skins/default/xui/es/floater_bumps.xml b/indra/newview/skins/default/xui/es/floater_bumps.xml index 0522f788bb..6a9c6b1f22 100644 --- a/indra/newview/skins/default/xui/es/floater_bumps.xml +++ b/indra/newview/skins/default/xui/es/floater_bumps.xml @@ -1,21 +1,24 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="floater_bumps" title="CHOQUES, EMPUJONES, E IMPACTOS"> - <text name="none_detected"> + <floater.string name="none_detected"> No se han detectado - </text> - <text name="bump"> + </floater.string> + <floater.string name="bump"> [TIME] [FIRST] [LAST] ha chocado con usted - </text> - <text name="llpushobject"> + </floater.string> + <floater.string name="llpushobject"> [TIME] [FIRST] [LAST] le ha empujado con un script - </text> - <text name="selected_object_collide"> + </floater.string> + <floater.string name="selected_object_collide"> [TIME] [FIRST] [LAST] ha hecho que un objeto impacte con usted - </text> - <text name="scripted_object_collide"> + </floater.string> + <floater.string name="scripted_object_collide"> [TIME] [FIRST] [LAST] ha hecho que un objeto con script impacte con usted - </text> - <text name="physical_object_collide"> + </floater.string> + <floater.string name="physical_object_collide"> [TIME] [FIRST] [LAST] ha hecho que un objeto material impacte con usted - </text> + </floater.string> + <floater.string name="timeStr"> + [[hour,datetime,slt]:[min,datetime,slt]] + </floater.string> </floater> diff --git a/indra/newview/skins/default/xui/es/floater_buy_contents.xml b/indra/newview/skins/default/xui/es/floater_buy_contents.xml index c4d269ff39..98604ad5f4 100644 --- a/indra/newview/skins/default/xui/es/floater_buy_contents.xml +++ b/indra/newview/skins/default/xui/es/floater_buy_contents.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_buy_contents" title="COMPRAR EL CONTENIDO"> +<floater name="floater_buy_contents" title="COMPRAR LOS CONTENIDOS"> <text name="contains_text"> [NAME] contiene: </text> diff --git a/indra/newview/skins/default/xui/es/floater_buy_currency.xml b/indra/newview/skins/default/xui/es/floater_buy_currency.xml index 1ecb813dd1..a8fa030846 100644 --- a/indra/newview/skins/default/xui/es/floater_buy_currency.xml +++ b/indra/newview/skins/default/xui/es/floater_buy_currency.xml @@ -1,71 +1,66 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="buy currency" title="COMPRAR DINERO"> - <text name="info_buying"> - Comprando dinero: - </text> - <text name="info_cannot_buy" left="5" right="-5"> - No puede comprar en este momento: - </text> - <text name="info_need_more" left="5" right="-5"> - Necesita más dinero: +<floater name="buy currency" title="COMPRAR L$"> + <floater.string name="buy_currency"> + Comprar [LINDENS] L$ por, aprox., [LOCALAMOUNT] + </floater.string> + <text left="5" name="info_need_more" right="-5"> + Necesitas más L$ </text> - <text name="error_message"> - Algo no va bien. - </text> - <button label="Ir al sitio web" name="error_web"/> <text name="contacting"> Contactando con el LindeX... </text> - <text name="buy_action_unknown" right="-5"> - Comprar L$ en el sistema LindeX de cambio + <text name="info_buying"> + Comprar L$ </text> - <text name="buy_action"> - [NAME] [PRICE] L$ + <text name="balance_label"> + Tengo + </text> + <text name="balance_amount"> + [AMT] L$ </text> <text name="currency_action" width="50"> - Comprar + Quiero comprar + </text> + <text name="currency_label"> + L$ </text> - <line_editor name="currency_amt" width="65" left_delta="50"> + <line_editor label="L$" left_delta="50" name="currency_amt" width="65"> 1234 </line_editor> - <text name="currency_est" width="138" left_delta="68"> - por, aprox., [LOCALAMOUNT] - </text> - <text name="getting_data"> - Obteniendo los datos... - </text> - <text name="balance_label"> - Actualmente, tiene + <text name="buying_label"> + Al precio de </text> - <text name="balance_amount"> - [AMT] L$ + <text left_delta="68" name="currency_est" width="138"> + aprox. [LOCALAMOUNT] </text> - <text name="buying_label"> - Está comprando + <text name="getting_data"> + Calculando... </text> - <text name="buying_amount"> - [AMT] L$ + <text name="buy_action"> + [ACTION] </text> <text name="total_label"> - Su saldo será de + Mi nuevo saldo será </text> <text name="total_amount"> [AMT] L$ </text> <text name="currency_links"> - [http://www.secondlife.com/my/account/payment_method_management.php?lang=es-ES payment method] | [http://www.secondlife.com/my/account/currency.php?lang=es-ES currency] | [http://www.secondlife.com/my/account/exchange_rates.php?lang=es-ES exchange rate] + [http://www.secondlife.com/my/account/payment_method_management.php método de pago] | [http://www.secondlife.com/my/account/currency.php moneda] | [http://www.secondlife.com/my/account/exchange_rates.php tipo de cambio] + </text> + <text name="exchange_rate_note"> + Vuelve a escribir la cantidad para ver el tipo de cambio más reciente. </text> <text name="purchase_warning_repurchase" right="-10"> - Confirmando esta compra sólo compra la moneda. -Tendrá que intentar de nuevo la operación. + Confirmando que con esta compra sólo se compran L$, no el objeto. </text> <text name="purchase_warning_notenough"> - No está comprando dinero suficiente. -Aumente la cantidad a comprar. + No estás comprando suficientes L$. Por favor, aumenta la cantidad. </text> + <button label="Comprar ahora" name="buy_btn"/> <button label="Cancelar" name="cancel_btn"/> - <button label="Comprar" name="buy_btn"/> - <string name="buy_currency"> - Compre [LINDENS] L$ por, aprox., [LOCALAMOUNT] - </string> + <text left="5" name="info_cannot_buy" right="-5"> + No se pudo hacer la compra + </text> + <button label="Ir a la web" name="error_web"/> </floater> diff --git a/indra/newview/skins/default/xui/es/floater_buy_currency_html.xml b/indra/newview/skins/default/xui/es/floater_buy_currency_html.xml new file mode 100644 index 0000000000..08ea67d4cb --- /dev/null +++ b/indra/newview/skins/default/xui/es/floater_buy_currency_html.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_buy_currency_html" title="COMPRAR DINERO"/> diff --git a/indra/newview/skins/default/xui/es/floater_buy_land.xml b/indra/newview/skins/default/xui/es/floater_buy_land.xml index 7ff45fcf79..74243a4d06 100644 --- a/indra/newview/skins/default/xui/es/floater_buy_land.xml +++ b/indra/newview/skins/default/xui/es/floater_buy_land.xml @@ -1,27 +1,153 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="buy land" title="COMPRAR TERRENO"> + <floater.string name="can_resell"> + Puede revenderse. + </floater.string> + <floater.string name="can_not_resell"> + No se puede revender. + </floater.string> + <floater.string name="can_change"> + Puede unirse o dividirse. + </floater.string> + <floater.string name="can_not_change"> + No puede unirse ni dividirse. + </floater.string> + <floater.string name="cant_buy_for_group"> + No tienes permiso de comprar terreno para el grupo que tienes activado. + </floater.string> + <floater.string name="no_land_selected"> + No se ha seleccionado terreno. + </floater.string> + <floater.string name="multiple_parcels_selected"> + Se han seleccionado varias parcelas diferentes. +Inténtalo seleccionando un área más pequeña. + </floater.string> + <floater.string name="no_permission"> + No tienes permiso de comprar terreno para el grupo que tienes activado. + </floater.string> + <floater.string name="parcel_not_for_sale"> + La parcela seleccionada no está en venta. + </floater.string> + <floater.string name="group_already_owns"> + El grupo ya es propietario de la parcela. + </floater.string> + <floater.string name="you_already_own"> + Ya eres propietario de la parcela. + </floater.string> + <floater.string name="set_to_sell_to_other"> + La parcela seleccionada está marcada para ser vendida a otro. + </floater.string> + <floater.string name="no_public_land"> + El área seleccionada no tiene terreno público. + </floater.string> + <floater.string name="not_owned_by_you"> + Estás seleccionado un terreno propiedad de otro Residente. +Prueba a seleccionar un área más pequeña. + </floater.string> + <floater.string name="processing"> + Procesando tu compra... + +(Llevará uno o dos minutos). + </floater.string> + <floater.string name="fetching_error"> + Se ha producido un error al ir a buscar la información de compra de terreno. + </floater.string> + <floater.string name="buying_will"> + Al comprar este terreno: + </floater.string> + <floater.string name="buying_for_group"> + Comprando terreno para el grupo: + </floater.string> + <floater.string name="cannot_buy_now"> + No se puede comprar ahora: + </floater.string> + <floater.string name="not_for_sale"> + No está en venta: + </floater.string> + <floater.string name="none_needed"> + no necesita + </floater.string> + <floater.string name="must_upgrade"> + Para poseer terreno, tu cuenta debe ascender de categorÃa. + </floater.string> + <floater.string name="cant_own_land"> + Tu cuenta puede poseer terreno. + </floater.string> + <floater.string name="land_holdings"> + Tienes [BUYER] m² de terreno. + </floater.string> + <floater.string name="pay_to_for_land"> + Pagar por este terreno [AMOUNT] L$ a [SELLER] + </floater.string> + <floater.string name="buy_for_US"> + Comprar [AMOUNT] L$ por, aprox., [LOCAL_AMOUNT], + </floater.string> + <floater.string name="parcel_meters"> + Este terreno tiene [AMOUNT] m² + </floater.string> + <floater.string name="premium_land"> + Este terreno es 'premium', y se considerará como de [AMOUNT] m². + </floater.string> + <floater.string name="discounted_land"> + Este terreno es 'discounted', y se considerará como de [AMOUNT] m². + </floater.string> + <floater.string name="meters_supports_object"> + [AMOUNT] m² +admite [AMOUNT2] objetos + </floater.string> + <floater.string name="sold_with_objects"> + vendido con los objetos + </floater.string> + <floater.string name="sold_without_objects"> + objetos no incluidos + </floater.string> + <floater.string name="info_price_string"> + [PRICE] L$ +([PRICE_PER_SQM] L$/m²) +[SOLD_WITH_OBJECTS] + </floater.string> + <floater.string name="insufficient_land_credits"> + Antes de que se complete la compra, el grupo [GROUP] necesitará +los suficientes créditos de uso en contribución de terreno +para cubrir esta parcela. + </floater.string> + <floater.string name="have_enough_lindens"> + Tienes [AMOUNT] L$, cantidad suficiente para comprar este terreno. + </floater.string> + <floater.string name="not_enough_lindens"> + Sólo tienes [AMOUNT] L$. NecesitarÃas [AMOUNT2] L$ más. + </floater.string> + <floater.string name="balance_left"> + Tras la compra, aún tendrás [AMOUNT] L$. + </floater.string> + <floater.string name="balance_needed"> + Para costearte este terreno, deberás comprar, al menos, [AMOUNT] L$. + </floater.string> + <floater.string name="no_parcel_selected"> + (No se ha seleccionado una parcela) + </floater.string> <text name="region_name_label"> Región: </text> - <text name="region_name_text" left="565"> + <text left="565" name="region_name_text"> (desconocida) </text> <text name="region_type_label"> Tipo: </text> - <text name="region_type_text" left="565"> + <text left="565" name="region_type_text"> (desconocido) </text> <text name="estate_name_label"> Estado: </text> - <text name="estate_name_text" left="565"> + <text left="565" name="estate_name_text"> (desconocido) </text> - <text name="estate_owner_label" width="115" right="565"> + <text name="estate_owner_label" right="565" width="115"> Propietario del estado: </text> - <text name="estate_owner_text" left="565" > + <text left="565" name="estate_owner_text"> (desconocido) </text> <text name="resellable_changeable_label"> @@ -34,7 +160,7 @@ Podrá o no unirse o dividirse. </text> <text name="covenant_text"> - Deve aceptar el Contrato del Estado: + Debes aceptar el Contrato del Estado: </text> <text left="470" name="covenant_timestamp_text"/> <text_editor name="covenant_editor"> @@ -58,8 +184,8 @@ </text> <text name="info_price"> 1500 L$ -(1.1 L$/m²) -incluyendo los objetos +(1.1/m² L$) +se vende con los objetos </text> <text name="info_action"> Al comprar este terreno: @@ -69,28 +195,28 @@ incluyendo los objetos </text> <button label="Ir al sitio web" name="error_web"/> <text name="account_action"> - Ascienda a la categorÃa de miembro premium. + Asciende a la categorÃa de miembro premium. </text> <text name="account_reason"> Sólo pueden ser propietarios de terreno los miembros premium. </text> <combo_box name="account_level"> - <combo_box.item name="US$9.95/month,billedmonthly" label="9.95 US$/mes, facturados mensualmente" /> - <combo_box.item name="US$7.50/month,billedquarterly" label="7.50 US$/mes, facturados cuatrimestralmente" /> - <combo_box.item name="US$6.00/month,billedannually" label="6.00 US$/mes, facturados anualmente" /> + <combo_box.item label="9.95 US$/mes, facturados mensualmente" name="US$9.95/month,billedmonthly"/> + <combo_box.item label="7.50 US$/mes, facturados trimestralmente" name="US$7.50/month,billedquarterly"/> + <combo_box.item label="6.00 US$/mes, facturados anualmente" name="US$6.00/month,billedannually"/> </combo_box> <text name="land_use_action"> - Aumenta su cuota mensual por uso de terreno a 40 US$/mes. + Aumenta tu cuota mensual por uso de terreno a 40 US$/mes. </text> <text name="land_use_reason"> - Usted posee 1309 m² de terreno. -Esta parcela mide 512 m². + Tienes 1309 m² de terreno. +Esta parcela es de 512 m². </text> <text name="purchase_action"> Pagar al residente Joe 4.000 L$ por el terreno </text> <text name="currency_reason"> - Tiene 2.100 L$. + Tienes 2.100 L$. </text> <text name="currency_action"> Comprar más L$ @@ -99,141 +225,12 @@ Esta parcela mide 512 m². 1.000 </line_editor> <text name="currency_est"> - por, aprox., [AMOUNT2] US$ + por, aprox., [LOCAL_AMOUNT] </text> <text name="currency_balance"> - Tiene 2.100 L$. + Tienes 2.100 L$. </text> - <check_box label="Quitar [AMOUNT] m² de la contribución del grupo." name="remove_contribution"/> + <check_box label="Quitar [AMOUNT] m² de las contribuciones de grupo." name="remove_contribution"/> <button label="Comprar" name="buy_btn"/> <button label="Cancelar" name="cancel_btn"/> - <string name="can_resell"> - Puede revenderse. - </string> - <string name="can_not_resell"> - No se puede revender. - </string> - <string name="can_change"> - Puede unirse o dividirse. - </string> - <string name="can_not_change"> - No puede unirse ni dividirse. - </string> - <string name="cant_buy_for_group"> - No tiene permiso de comprar terreno para el grupo que tiene activado. - </string> - <string name="no_land_selected"> - No se ha seleccionado terreno. - </string> - <string name="multiple_parcels_selected"> - Se han seleccionado varias parcelas diferentes. -Inténtelo seleccionando un área más pequeña. - </string> - <string name="no_permission"> - No tiene permiso de comprar terreno para el grupo que tiene activado. - </string> - <string name="parcel_not_for_sale"> - La parcela seleccionada no está en venta. - </string> - <string name="group_already_owns"> - El grupo ya es propietario de la parcela. - </string> - <string name="you_already_own"> - Usted ya es propietario de la parcela. - </string> - <string name="set_to_sell_to_other"> - La parcela seleccionada está marcada para ser vendida a otro - </string> - <string name="no_public_land"> - El área seleccionada no tiene terreno público. - </string> - <string name="not_owned_by_you"> - Se ha seleccionado terreno propiedad de otro. -Inténtelo seleccionando un área más pequeña. - </string> - <string name="processing"> - Procesando su compra... - -(Llevará uno o dos minutos). - </string> - <string name="fetching_error"> - Se ha producido un error al ir a buscar la información de compra de terreno. - </string> - <string name="buying_will"> - Al comprar este terreno: - </string> - <string name="buying_for_group"> - Comprando terreno para el grupo: - </string> - <string name="cannot_buy_now"> - No se puede comprar ahora: - </string> - <string name="not_for_sale"> - No está en venta: - </string> - <string name="none_needed"> - no necesita - </string> - <string name="must_upgrade"> - Para poseer terreno, su cuenta debe ascender de categorÃa. - </string> - <string name="cant_own_land"> - Su cuenta puede poseer terreno. - </string> - <string name="land_holdings"> - Usted tiene [BUYER] m² de terreno. - </string> - <string name="pay_to_for_land"> - Pagar por este terreno [AMOUNT] L$ a [SELLER] - </string> - <string name="buy_for_US"> - Comprar [AMOUNT] L$ por, aprox., [AMOUNT2] US$, - </string> - <string name="parcel_meters"> - Esta parcela tiene [AMOUNT] m². - </string> - <string name="premium_land"> - Este terreno es premium, y se contará como de [AMOUNT] m². - </string> - <string name="discounted_land"> - Este terreno tiene descuento, y se contará como de [AMOUNT] m². - </string> - <string name="meters_supports_object"> - [AMOUNT] m² -admite [AMOUNT2] objetos - </string> - <string name="sold_with_objects"> - vendido con los objetos - </string> - <string name="sold_without_objects"> - objetos no incluidos - </string> - <string name="info_price_string"> - [PRICE] L$ -([PRICE_PER_SQM] L$/m²) -[SOLD_WITH_OBJECTS] - </string> - <string name="insufficient_land_credits"> - Antes de que se complete la compra, el grupo [GROUP] necesitará -los suficientes créditos de uso en contribución de terreno -para cubrir esta parcela. - </string> - <string name="have_enough_lindens"> - Tiene [AMOUNT] L$, cantidad suficiente para comprar este terreno. - </string> - <string name="not_enough_lindens"> - Sólo tiene [AMOUNT] L$. NecesitarÃa [AMOUNT2] L$ más. - </string> - <string name="balance_left"> - Tras la compra, aún tendrá [AMOUNT] L$. - </string> - <string name="balance_needed"> - Para costearse este terreno, deberá comprar, al menos, [AMOUNT] L$. - </string> - <string name="no_parcel_selected"> - (No se ha seleccionado una parcela) - </string> - <string name="buy_currency"> - Comprar [LINDENS] L$ por, aprox., [USD] US$ - </string> </floater> diff --git a/indra/newview/skins/default/xui/es/floater_buy_object.xml b/indra/newview/skins/default/xui/es/floater_buy_object.xml index 26696bc868..117d29777f 100644 --- a/indra/newview/skins/default/xui/es/floater_buy_object.xml +++ b/indra/newview/skins/default/xui/es/floater_buy_object.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="contents" title="COMPRAR UNA COPIA DEL OBJETO"> <text name="contents_text"> - y sus contenidos: + Contenidos: </text> <text name="buy_text"> ¿Comprarlo por [AMOUNT] L$ a [NAME]? diff --git a/indra/newview/skins/default/xui/es/floater_camera.xml b/indra/newview/skins/default/xui/es/floater_camera.xml index 3aeb4e5771..c625407ba2 100644 --- a/indra/newview/skins/default/xui/es/floater_camera.xml +++ b/indra/newview/skins/default/xui/es/floater_camera.xml @@ -9,8 +9,28 @@ <floater.string name="move_tooltip"> Mover la cámara arriba y abajo, izquierda y derecha </floater.string> + <floater.string name="camera_modes_title"> + Modos de cámara + </floater.string> + <floater.string name="pan_mode_title"> + Orbital - Zoom - Panóramica + </floater.string> + <floater.string name="presets_mode_title"> + Vistas predefinidas + </floater.string> + <floater.string name="free_mode_title"> + Centrar el objeto + </floater.string> <panel name="controls"> - <joystick_track name="cam_track_stick" tool_tip="Mover la cámara arriba y abajo, izquierda y derecha"/> - <joystick_zoom name="zoom" tool_tip="Hacer zoom con la cámara en lo enfocado"/> + <panel name="zoom" tool_tip="Hacer zoom con la cámara en lo enfocado"> + <joystick_rotate name="cam_rotate_stick" tool_tip="La cámara gira alrededor del punto de vista"/> + <slider_bar name="zoom_slider" tool_tip="Hacer zoom en lo enfocado"/> + <joystick_track name="cam_track_stick" tool_tip="Mueve la cámara arriba y abajo, a izquierda y derecha"/> + </panel> + </panel> + <panel name="buttons"> + <button label="" name="presets_btn" tool_tip="Vistas predefinidas"/> + <button label="" name="pan_btn" tool_tip="Orbital - Zoom - Panóramica"/> + <button label="" name="avatarview_btn" tool_tip="Modos de cámara"/> </panel> </floater> diff --git a/indra/newview/skins/default/xui/es/floater_color_picker.xml b/indra/newview/skins/default/xui/es/floater_color_picker.xml index 4395ee6890..ed168c09d5 100644 --- a/indra/newview/skins/default/xui/es/floater_color_picker.xml +++ b/indra/newview/skins/default/xui/es/floater_color_picker.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="ColorPicker" title="PALETA DE COLORES"> +<floater name="ColorPicker" title="SELECTOR DE COLOR"> <text name="r_val_text"> Rojo: </text> @@ -18,14 +18,13 @@ <text name="l_val_text"> Lumin.: </text> - <check_box label="Aplicar ahora mismo" name="apply_immediate"/> + <check_box label="Aplicarlo ahora" name="apply_immediate"/> <button label="Cancelar" label_selected="Cancelar" name="cancel_btn"/> - <button label="Elegir" label_selected="Elegir" name="select_btn"/> + <button label="OK" label_selected="OK" name="select_btn"/> <text name="Current color:"> Color actual: </text> <text name="(Drag below to save.)"> - (Arrástrelo abajo - para guardarlo) + (arrástralo abajo para guardarlo) </text> </floater> diff --git a/indra/newview/skins/default/xui/es/floater_customize.xml b/indra/newview/skins/default/xui/es/floater_customize.xml index 94452dae6b..77b670d5f0 100644 --- a/indra/newview/skins/default/xui/es/floater_customize.xml +++ b/indra/newview/skins/default/xui/es/floater_customize.xml @@ -1,21 +1,23 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater customize" title="APARIENCIA" width="527"> - <tab_container name="customize tab container" width="525"> - <placeholder label="Partes del cuerpo" name="body_parts_placeholder"/> - <panel label="Forma" name="Shape" width="389"> +<floater name="floater customize" title="APARIENCIA"> + <tab_container name="customize tab container"> + <text label="Partes del cuerpo" name="body_parts_placeholder"> + Partes del cuerpo + </text> + <panel label="Forma" name="Shape"> <button label="Restablecer" label_selected="Restablecer" name="Revert"/> <button label="Cuerpo" label_selected="Cuerpo" name="Body"/> <button label="Cabeza" label_selected="Cabeza" name="Head"/> <button label="Ojos" label_selected="Ojos" name="Eyes"/> - <button label="Ojos" label_selected="Orejas" name="Ears"/> + <button label="Orejas" label_selected="Orejas" name="Ears"/> <button label="Nariz" label_selected="Nariz" name="Nose"/> <button label="Boca" label_selected="Boca" name="Mouth"/> <button label="Barbilla" label_selected="Barbilla" name="Chin"/> <button label="Torso" label_selected="Torso" name="Torso"/> <button label="Piernas" label_selected="Piernas" name="Legs"/> <radio_group name="sex radio"> - <radio_item name="radio" label="Mujer" /> - <radio_item name="radio2" label="Varón" /> + <radio_item label="Mujer" name="radio" value="0"/> + <radio_item label="Varón" name="radio2" value="1"/> </radio_group> <text name="title"> [DESC] @@ -33,18 +35,17 @@ Situada en [PATH] </text> <text name="not worn instructions"> - Póngase una forma nueva arrastrando una desde su inventario hasta su -avatar. O parta de cero creando una nueva y vistiéndola. + Ponte una anatomÃa nueva arrastrándola desde tu inventario hasta tu avatar. O bien puedes crear una nueva partiendo de cero. </text> <text name="no modify instructions"> No tiene permiso para modificar este Ãtem. </text> - <text name="Item Action Label" right="107"> + <text name="Item Action Label"> Forma: </text> <button label="Crear una forma nueva" label_selected="Crear una forma nueva" name="Create New"/> - <button left="113" label="Guardar" label_selected="Guardar" name="Save"/> - <button left="199" width="102" label="Guardar como..." label_selected="Guardar como..." name="Save As"/> + <button label="Guardar" label_selected="Guardar" name="Save"/> + <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/> </panel> <panel label="Piel" name="Skin"> <button label="Color de piel" label_selected="Color de piel" name="Skin Color" width="115"/> @@ -67,8 +68,7 @@ avatar. O parta de cero creando una nueva y vistiéndola. Situada en [PATH] </text> <text name="not worn instructions"> - Póngase otra piel arrastrando una desde su inventario hasta su -avatar. O parta de cero creando una nueva y vistiéndola. + Ponte una piel nueva arrastrándola desde tu inventario hasta tu avatar. O bien puedes crear una nueva partiendo de cero. </text> <text name="no modify instructions"> No tiene permiso para modificar este Ãtem. @@ -76,12 +76,12 @@ avatar. O parta de cero creando una nueva y vistiéndola. <text name="Item Action Label" right="107"> Piel: </text> - <texture_picker width="90" label="Tatuaje: cabeza" name="Head Tattoos" tool_tip="Pulse para elegir una imagen"/> - <texture_picker width="90" label="Tatuaje: superior" name="Upper Tattoos" tool_tip="Pulse para elegir una imagen"/> - <texture_picker width="90" label="Tatuaje: inferior" name="Lower Tattoos" tool_tip="Pulse para elegir una imagen"/> + <texture_picker label="Tatuaje: cabeza" name="Head Tattoos" tool_tip="Pulse para elegir una imagen" width="90"/> + <texture_picker label="Tatuaje: superior" name="Upper Tattoos" tool_tip="Pulse para elegir una imagen" width="90"/> + <texture_picker label="Tatuaje: inferior" name="Lower Tattoos" tool_tip="Pulse para elegir una imagen" width="90"/> <button label="Crear una piel nueva" label_selected="Crear una piel nueva" name="Create New"/> - <button left="113" label="Guardar" label_selected="Guardar" name="Save"/> - <button left="199" width="102" label="Guardar como..." label_selected="Guardar como..." name="Save As"/> + <button label="Guardar" label_selected="Guardar" left="113" name="Save"/> + <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/> <button label="Restablecer" label_selected="Restablecer" name="Revert"/> </panel> <panel label="Pelo" name="Hair"> @@ -105,8 +105,7 @@ avatar. O parta de cero creando una nueva y vistiéndola. Situado en [PATH] </text> <text name="not worn instructions"> - Póngase otro pelo arrastrando uno desde su inventario hasta su -avatar. O parta de cero creando uno nueva y vistiéndolo. + Ponte un pelo nuevo arrastrándolo desde tu inventario hasta tu avatar. O bien puedes crear uno nuevo partiendo de cero. </text> <text name="no modify instructions"> No tiene permiso para modificar este Ãtem. @@ -116,8 +115,8 @@ avatar. O parta de cero creando uno nueva y vistiéndolo. </text> <texture_picker label="Textura" name="Texture" tool_tip="Pulse para elegir una imagen"/> <button label="Crear un pelo nuevo" label_selected="Crear un pelo nuevo" name="Create New"/> - <button left="113" label="Guardar" label_selected="Guardar" name="Save"/> - <button left="199" width="102" label="Guardar como..." label_selected="Guardar como..." name="Save As"/> + <button label="Guardar" label_selected="Guardar" left="113" name="Save"/> + <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/> <button label="Restablecer" label_selected="Restablecer" name="Revert"/> </panel> <panel label="Ojos" name="Eyes"> @@ -137,8 +136,7 @@ avatar. O parta de cero creando uno nueva y vistiéndolo. Situados en [PATH] </text> <text name="not worn instructions"> - Póngase otros ojos arrastrando unos desde su inventario hasta su -avatar. O parta de cero creando unos nuevos y vistiéndoselos. + Ponte unos ojos nuevos arrastrándolos desde tu inventario hasta tu avatar. O bien puedes crear unos nuevos partiendo de cero. </text> <text name="no modify instructions"> No tiene permiso para modificar este Ãtem. @@ -148,18 +146,20 @@ avatar. O parta de cero creando unos nuevos y vistiéndoselos. </text> <texture_picker label="Iris" name="Iris" tool_tip="Pulse para elegir una imagen"/> <button label="Crear unos ojos nuevos" label_selected="Crear unos ojos nuevos" name="Create New"/> - <button left="113" label="Guardar" label_selected="Guardar" name="Save"/> - <button left="199" width="102" label="Guardar como..." label_selected="Guardar como..." name="Save As"/> + <button label="Guardar" label_selected="Guardar" left="113" name="Save"/> + <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/> <button label="Restablecer" label_selected="Restablecer" name="Revert"/> </panel> - <panel label="Ropa" name="clothes_placeholder"/> + <text label="Ropa" name="clothes_placeholder"> + Ropas + </text> <panel label="Camisa" name="Shirt"> <texture_picker label="Tela" name="Fabric" tool_tip="Pulse para elegir una imagen"/> - <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulse para abrir el selector de color"/> - <button label="Crear una falda nueva" label_selected="Crear una falda nueva" name="Create New"/> + <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/> <button label="Quitarla" label_selected="Quitarla" name="Take Off"/> - <button left="113" label="Guardar" label_selected="Guardar" name="Save"/> - <button left="199" width="102" label="Guardar como..." label_selected="Guardar como..." name="Save As"/> + <button label="Crear una falda nueva" label_selected="Crear una falda nueva" name="Create New"/> + <button label="Guardar" label_selected="Guardar" left="113" name="Save"/> + <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/> <button label="Restablecer" label_selected="Restablecer" name="Revert"/> <text name="title"> [DESC] @@ -177,8 +177,7 @@ avatar. O parta de cero creando unos nuevos y vistiéndoselos. Situada en [PATH] </text> <text name="not worn instructions"> - Póngase otra camisa arrastrando una desde su inventario hasta su -avatar. O parta de cero creando una nueva y vistiéndola. + Ponte una camisa nueva arrastrándola desde tu inventario hasta tu avatar. O bien puedes crear una nueva partiendo de cero. </text> <text name="no modify instructions"> No tiene permiso para modificar este Ãtem. @@ -189,11 +188,11 @@ avatar. O parta de cero creando una nueva y vistiéndola. </panel> <panel label="Pantalones" name="Pants"> <texture_picker label="Tela" name="Fabric" tool_tip="Pulse para elegir una imagen"/> - <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulse para abrir el selector de color"/> - <button label="Crear unos pantalones nuevos" label_selected="Crear unos pantalones nuevos" name="Create New" width="185"/> + <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/> <button label="Quitarlos" label_selected="Quitarlos" name="Take Off"/> - <button left="113" label="Guardar" label_selected="Guardar" name="Save"/> - <button left="199" width="102" label="Guardar como..." label_selected="Guardar como..." name="Save As"/> + <button label="Crear unos pantalones nuevos" label_selected="Crear unos pantalones nuevos" name="Create New" width="185"/> + <button label="Guardar" label_selected="Guardar" left="113" name="Save"/> + <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/> <button label="Restablecer" label_selected="Restablecer" name="Revert"/> <text name="title"> [DESC] @@ -211,8 +210,7 @@ avatar. O parta de cero creando una nueva y vistiéndola. Situados en [PATH] </text> <text name="not worn instructions"> - Póngase otros pantalones arrastrando unos desde su inventario hasta su -avatar. O parta de cero creando unos nuevos y vistiéndoselos. + Ponte unos pantalones nuevos arrastrándolos desde tu inventario hasta tu avatar. O bien puedes crear unos nuevos partiendo de cero. </text> <text name="no modify instructions"> No tiene permiso para modificar este Ãtem. @@ -238,9 +236,9 @@ avatar. O parta de cero creando unos nuevos y vistiéndoselos. Situados en [PATH] </text> <text name="not worn instructions"> - Póngase otros zapatos arrastrando unos desde su inventario hasta su -avatar. O parta de cero creando unos nuevos y vistiéndoselos. + Ponte unos zapatos nuevos arrastrándolos desde tu inventario hasta tu avatar. O bien puedes crear unos nuevos partiendo de cero. </text> + <button label="Crear unos zapatos nuevos" label_selected="Crear unos zapatos nuevos" name="Create New"/> <text name="no modify instructions"> No tiene permiso para modificar este Ãtem. </text> @@ -248,11 +246,10 @@ avatar. O parta de cero creando unos nuevos y vistiéndoselos. Zapatos: </text> <texture_picker label="Tela" name="Fabric" tool_tip="Pulse para elegir una imagen"/> - <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulse para abrir el selector de color"/> - <button label="Crear unos zapatos nuevos" label_selected="Crear unos zapatos nuevos" name="Create New"/> + <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/> <button label="Quitarlos" label_selected="Quitarlos" name="Take Off"/> - <button left="113" label="Guardar" label_selected="Guardar" name="Save"/> - <button left="199" width="102" label="Guardar como..." label_selected="Guardar como..." name="Save As"/> + <button label="Guardar" label_selected="Guardar" left="113" name="Save"/> + <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/> <button label="Restablecer" label_selected="Restablecer" name="Revert"/> </panel> <panel label="Calcetines" name="Socks"> @@ -272,9 +269,9 @@ avatar. O parta de cero creando unos nuevos y vistiéndoselos. Situados en [PATH] </text> <text name="not worn instructions"> - Póngase otros calcetines arrastrando unos desde su inventario hasta su -avatar. O parta de cero creando unos nuevos y vistiéndoselos. + Ponte unos calcetines nuevos arrastrándolos desde tu inventario hasta tu avatar. O bien puedes crear unos nuevos partiendo de cero. </text> + <button label="Crear unos calcetines nuevos" label_selected="Crear unos calcetines nuevos" name="Create New" width="185"/> <text name="no modify instructions"> No tiene permiso para modificar este Ãtem. </text> @@ -282,11 +279,10 @@ avatar. O parta de cero creando unos nuevos y vistiéndoselos. Calcetines: </text> <texture_picker label="Tela" name="Fabric" tool_tip="Pulse para elegir una imagen"/> - <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulse para abrir el selector de color"/> - <button label="Crear unos calcetines nuevos" label_selected="Crear unos calcetines nuevos" name="Create New" width="185"/> + <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/> <button label="Quitarlos" label_selected="Quitarlos" name="Take Off"/> - <button left="113" label="Guardar" label_selected="Guardar" name="Save"/> - <button left="199" width="102" label="Guardar como..." label_selected="Guardar como..." name="Save As"/> + <button label="Guardar" label_selected="Guardar" left="113" name="Save"/> + <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/> <button label="Restablecer" label_selected="Restablecer" name="Revert"/> </panel> <panel label="Chaqueta" name="Jacket"> @@ -306,9 +302,9 @@ avatar. O parta de cero creando unos nuevos y vistiéndoselos. Situada en [PATH] </text> <text name="not worn instructions"> - Póngase otra chaqueta arrastrando una desde su inventario hasta su -avatar. O parta de cero creando una nueva y vistiéndola. + Ponte una chaqueta nueva arrastrándola desde tu inventario hasta tu avatar. O bien puedes crear una nueva partiendo de cero. </text> + <button label="Crear una chaqueta nueva" label_selected="Crear una chaqueta nueva" name="Create New"/> <text name="no modify instructions"> No tiene permiso para modificar este Ãtem. </text> @@ -317,11 +313,10 @@ avatar. O parta de cero creando una nueva y vistiéndola. </text> <texture_picker label="Tela superior" name="Upper Fabric" tool_tip="Pulse para elegir una imagen"/> <texture_picker label="Tela inferior" name="Lower Fabric" tool_tip="Pulse para elegir una imagen"/> - <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulse para abrir el selector de color"/> - <button label="Crear una chaqueta nueva" label_selected="Crear una chaqueta nueva" name="Create New"/> + <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/> <button label="Quitarla" label_selected="Quitarla" name="Take Off"/> - <button left="113" label="Guardar" label_selected="Guardar" name="Save"/> - <button left="199" width="102" label="Guardar como..." label_selected="Guardar como..." name="Save As"/> + <button label="Guardar" label_selected="Guardar" left="113" name="Save"/> + <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/> <button label="Restablecer" label_selected="Restablecer" name="Revert"/> </panel> <panel label="Guantes" name="Gloves"> @@ -341,9 +336,9 @@ avatar. O parta de cero creando una nueva y vistiéndola. Situados en [PATH] </text> <text name="not worn instructions"> - Póngase otros guantes arrastrando unos desde su inventario hasta su -avatar. O parta de cero creando unos nuevos y vistiéndoselos. + Ponte unos guantes nuevos arrastrándolos desde tu inventario hasta tu avatar. O bien puedes crear unos nuevos partiendo de cero. </text> + <button label="Crear unos guantes nuevos" label_selected="Crear unos guantes nuevos" name="Create New"/> <text name="no modify instructions"> No tiene permiso para modificar este Ãtem. </text> @@ -351,11 +346,10 @@ avatar. O parta de cero creando unos nuevos y vistiéndoselos. Guantes: </text> <texture_picker label="Tela" name="Fabric" tool_tip="Pulse para elegir una imagen"/> - <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulse para abrir el selector de color"/> - <button label="Crear unos guantes nuevos" label_selected="Crear unos guantes nuevos" name="Create New"/> + <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/> <button label="Quitarlos" label_selected="Quitarlos" name="Take Off"/> - <button left="113" label="Guardar" label_selected="Guardar" name="Save"/> - <button left="199" width="102" label="Guardar como..." label_selected="Guardar como..." name="Save As"/> + <button label="Guardar" label_selected="Guardar" left="113" name="Save"/> + <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/> <button label="Restablecer" label_selected="Restablecer" name="Revert"/> </panel> <panel label="Camiseta" name="Undershirt"> @@ -375,9 +369,9 @@ avatar. O parta de cero creando unos nuevos y vistiéndoselos. Situada en [PATH] </text> <text name="not worn instructions"> - Póngase otra camiseta arrastrando una desde su inventario hasta su -avatar. O parta de cero creando una nueva y vistiéndola. + Ponte una camiseta nueva arrastrándola desde tu inventario hasta tu avatar. O bien puedes crear una nueva partiendo de cero. </text> + <button label="Crear una camiseta nueva" label_selected="Crear una camiseta nueva" name="Create New"/> <text name="no modify instructions"> No tiene permiso para modificar este Ãtem. </text> @@ -385,11 +379,10 @@ avatar. O parta de cero creando una nueva y vistiéndola. Camiseta: </text> <texture_picker label="Tela" name="Fabric" tool_tip="Pulse para elegir una imagen"/> - <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulse para abrir el selector de color"/> - <button label="Crear una camiseta nueva" label_selected="Crear una camiseta nueva" name="Create New"/> + <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/> <button label="Quitarla" label_selected="Quitarla" name="Take Off"/> - <button left="113" label="Guardar" label_selected="Guardar" name="Save"/> - <button left="199" width="102" label="Guardar como..." label_selected="Guardar como..." name="Save As"/> + <button label="Guardar" label_selected="Guardar" left="113" name="Save"/> + <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/> <button label="Restablecer" label_selected="Restablecer" name="Revert"/> </panel> <panel label="Ropa interior" name="Underpants"> @@ -409,9 +402,9 @@ avatar. O parta de cero creando una nueva y vistiéndola. Situada en [PATH] </text> <text name="not worn instructions"> - Póngase otra ropa interior arrastrando una desde su inventario hasta su -avatar. O parta de cero creando una nueva y vistiéndola. + Ponte una ropa interior nueva arrastrándola desde tu inventario hasta tu avatar. O bien puedes crear una nueva partiendo de cero. </text> + <button label="Crear una ropa interior nueva" label_selected="Crear una ropa interior nueva" name="Create New" width="185"/> <text name="no modify instructions"> No tiene permiso para modificar este Ãtem. </text> @@ -419,11 +412,10 @@ avatar. O parta de cero creando una nueva y vistiéndola. Ropa interior: </text> <texture_picker label="Tela" name="Fabric" tool_tip="Pulse para elegir una imagen"/> - <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulse para abrir el selector de color"/> - <button label="Crear una ropa interior nueva" label_selected="Crear una ropa interior nueva" name="Create New" width="185"/> + <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/> <button label="Quitarla" label_selected="Quitarla" name="Take Off"/> - <button left="113" label="Guardar" label_selected="Guardar" name="Save"/> - <button left="199" width="102" label="Guardar como..." label_selected="Guardar como..." name="Save As"/> + <button label="Guardar" label_selected="Guardar" left="113" name="Save"/> + <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/> <button label="Restablecer" label_selected="Restablecer" name="Revert"/> </panel> <panel label="Falda" name="Skirt"> @@ -443,9 +435,9 @@ avatar. O parta de cero creando una nueva y vistiéndola. Situada en [PATH] </text> <text name="not worn instructions"> - Póngase otra falda arrastrando una desde su inventario hasta su -avatar. O parta de cero creando una nueva y vistiéndola. + Ponte una falda nueva arrastrándola desde tu inventario hasta tu avatar. O bien puedes crear una nueva partiendo de cero. </text> + <button label="Crear una falda nueva" label_selected="Crear una falda nueva" name="Create New"/> <text name="no modify instructions"> No tiene permiso para modificar este Ãtem. </text> @@ -453,16 +445,86 @@ avatar. O parta de cero creando una nueva y vistiéndola. Falda: </text> <texture_picker label="Tela" name="Fabric" tool_tip="Pulse para elegir una imagen"/> - <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulse para abrir el selector de color"/> - <button label="Crear una falda nueva" label_selected="Crear una falda nueva" name="Create New"/> + <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/> <button label="Quitarla" label_selected="Quitarla" name="Take Off"/> - <button left="113" label="Guardar" label_selected="Guardar" name="Save"/> - <button left="199" width="102" label="Guardar como..." label_selected="Guardar como..." name="Save As"/> + <button label="Guardar" label_selected="Guardar" left="113" name="Save"/> + <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/> <button label="Restablecer" label_selected="Restablecer" name="Revert"/> </panel> + <panel label="Tatuaje" name="Tattoo"> + <text name="title"> + [DESC] + </text> + <text name="title_no_modify"> + [DESC]: no modificable + </text> + <text name="title_loading"> + [DESC]: cargando... + </text> + <text name="title_not_worn"> + [DESC]: no puesto + </text> + <text name="path"> + Situado en [PATH] + </text> + <text name="not worn instructions"> + Pon un tatuaje nuevo arrastrándolo desde tu inventario a tu avatar. O bien puedes crear uno nuevo partiendo de cero. + </text> + <button label="Crear un tatuaje nuevo" label_selected="Crear un tatuaje nuevo" name="Create New"/> + <text name="no modify instructions"> + No tienes permiso para modificar este artÃculo. + </text> + <text name="Item Action Label"> + Tatuaje: + </text> + <texture_picker label="Tatuaje de la cabeza" name="Head Tattoo" tool_tip="Pulsa para elegir una imagen"/> + <texture_picker label="Tatuaje superior" name="Upper Tattoo" tool_tip="Pulsa para elegir una imagen"/> + <texture_picker label="Tatuaje inferior" name="Lower Tattoo" tool_tip="Pulsa para elegir una imagen"/> + <button label="Quitarme" label_selected="Quitarme" name="Take Off"/> + <button label="Guardar" label_selected="Guardar" name="Save"/> + <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/> + <button label="Revertir" label_selected="Revertir" name="Revert"/> + </panel> + <panel label="Alfa" name="Alpha"> + <text name="title"> + [DESC] + </text> + <text name="title_no_modify"> + [DESC]: no modificable + </text> + <text name="title_loading"> + [DESC]: cargando... + </text> + <text name="title_not_worn"> + [DESC]: no puesto + </text> + <text name="path"> + Situado en [PATH] + </text> + <text name="not worn instructions"> + Pon una capa Alfa nueva arrastrándola desde tu inventario a tu avatar. O bien puedes crear una nueva partiendo de cero. + </text> + <button label="Crear una capa Alfa nueva" label_selected="Crear una capa Alfa nueva" name="Create New"/> + <text name="no modify instructions"> + No tienes permiso para modificar este artÃculo. + </text> + <text name="Item Action Label"> + Alfa: + </text> + <texture_picker label="Alfa inferior" name="Lower Alpha" tool_tip="Pulsa para elegir una imagen"/> + <texture_picker label="Alfa superior" name="Upper Alpha" tool_tip="Pulsa para elegir una imagen"/> + <texture_picker label="Alfa de la cabeza" name="Head Alpha" tool_tip="Pulsa para elegir una imagen"/> + <texture_picker label="Alfa de los ojos" name="Eye Alpha" tool_tip="Pulsa para elegir una imagen"/> + <texture_picker label="Alfa del pelo" name="Hair Alpha" tool_tip="Pulsa para elegir una imagen"/> + <button label="Quitarme" label_selected="Quitarme" name="Take Off"/> + <button label="Guardar" label_selected="Guardar" name="Save"/> + <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/> + <button label="Revertir" label_selected="Revertir" name="Revert"/> + </panel> </tab_container> - <scroll_container left="230" name="panel_container"/> + <scroll_container name="panel_container"/> + <button label="Información del script" label_selected="Información del script" name="script_info" tool_tip="Mostrar los scripts anexados a tu avatar"/> + <button label="Hacer un vestuario" label_selected="Hacer un vestuario" name="make_outfit_btn"/> <button label="Cancelar" label_selected="Cancelar" name="Cancel"/> <button label="OK" label_selected="OK" name="Ok"/> - <button label="Hacer un vestuario..." label_selected="Hacer un vestuario..." name="Make Outfit" width="130"/> </floater> diff --git a/indra/newview/skins/default/xui/es/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/es/floater_day_cycle_options.xml index fc2b12d1e4..9c3ac1be0e 100644 --- a/indra/newview/skins/default/xui/es/floater_day_cycle_options.xml +++ b/indra/newview/skins/default/xui/es/floater_day_cycle_options.xml @@ -57,9 +57,9 @@ <text name="WL12amHash2"> | </text> - <button font="SansSerifSmall" width="96" left="546" label="Añadir un punto" label_selected="Añadir un punto" name="WLAddKey"/> - <button font="SansSerifSmall" width="96" left="546" label="Quitar un punto" label_selected="Quitar un punto" name="WLDeleteKey"/> - <text font="SansSerifSmall" name="WLCurKeyFrameText" width="190"> + <button label="Añadir un punto" label_selected="Añadir un punto" name="WLAddKey"/> + <button label="Quitar un punto" label_selected="Quitar un punto" name="WLDeleteKey"/> + <text name="WLCurKeyFrameText"> Configuración del fotograma clave: </text> <text name="WLCurKeyTimeText"> @@ -86,9 +86,9 @@ </text> <button label="Probar" label_selected="Probar" name="WLAnimSky"/> <button label="Parar" label_selected="Parar" name="WLStopAnimSky"/> - <button width="150" font="SansSerifSmall" label="Usar el horario del estado" label_selected="Ir al horario del estado" name="WLUseLindenTime"/> - <button left="440" width="180" font="SansSerifSmall" label="Guardar este tipo de dÃa" label_selected="Guardar este tipo de dÃa" name="WLSaveDayCycle"/> - <button left="440" width="180" font="SansSerifSmall" label="Cargar y probar un tipo de dÃa" label_selected="Cargar y probar un tipo de dÃa" name="WLLoadDayCycle"/> + <button label="Usar el horario del estado" label_selected="Ir al horario del estado" name="WLUseLindenTime"/> + <button label="Guardar este tipo de dÃa" label_selected="Guardar este tipo de dÃa" name="WLSaveDayCycle"/> + <button label="Cargar y probar un tipo de dÃa" label_selected="Cargar y probar un tipo de dÃa" name="WLLoadDayCycle"/> </panel> </tab_container> </floater> diff --git a/indra/newview/skins/default/xui/es/floater_env_settings.xml b/indra/newview/skins/default/xui/es/floater_env_settings.xml index 5d6ba47daf..195690f546 100644 --- a/indra/newview/skins/default/xui/es/floater_env_settings.xml +++ b/indra/newview/skins/default/xui/es/floater_env_settings.xml @@ -1,5 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="Environment Editor Floater" title="EDITOR DEL ENTORNO"> + <floater.string name="timeStr"> + [hour12,datetime,utc]:[min,datetime,utc] [ampm,datetime,utc] + </floater.string> <text name="EnvTimeText"> Duración de un dÃa @@ -14,13 +17,12 @@ un dÃa Color del agua </text> - <color_swatch label="" name="EnvWaterColor" tool_tip="Pulse para abrir el selector de color"/> + <color_swatch label="" name="EnvWaterColor" tool_tip="Pulsa para abrir el selector de color"/> <text name="EnvWaterFogText"> Claridad del agua </text> <button bottom="-144" label="Usar el horario del estado" name="EnvUseEstateTimeButton" width="155"/> - <button label="Cielo avanzado" name="EnvAdvancedSkyButton" width="155" left="167" /> - <button label="Agua avanzada" name="EnvAdvancedWaterButton" width="155" left="326"/> - <button label="?" name="EnvSettingsHelpButton"/> + <button label="Cielo avanzado" left="167" name="EnvAdvancedSkyButton" width="155"/> + <button label="Agua avanzada" left="326" name="EnvAdvancedWaterButton" width="155"/> </floater> diff --git a/indra/newview/skins/default/xui/es/floater_event.xml b/indra/newview/skins/default/xui/es/floater_event.xml new file mode 100644 index 0000000000..4bc5221796 --- /dev/null +++ b/indra/newview/skins/default/xui/es/floater_event.xml @@ -0,0 +1,72 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater label="Evento" name="Event" title="DETALLES DEL EVENTO"> + <floater.string name="none"> + ninguno + </floater.string> + <floater.string name="notify"> + Notificar + </floater.string> + <floater.string name="dont_notify"> + No notificar + </floater.string> + <floater.string name="moderate"> + Moderado + </floater.string> + <floater.string name="adult"> + Adulto + </floater.string> + <floater.string name="general"> + General + </floater.string> + <floater.string name="unknown"> + desconocida + </floater.string> + <layout_stack name="layout"> + <layout_panel name="profile_stack"> + <text name="event_name"> + Evento sin nombre... + </text> + <text name="event_category"> + (sin categorÃa) + </text> + <text name="event_runby_label"> + Organizado por: + </text> + <text initial_value="(obteniendo)" name="event_runby"/> + <text name="event_date_label"> + Fecha: + </text> + <text name="event_date"> + 10/10/2010 + </text> + <text name="event_duration_label"> + Duración: + </text> + <text name="event_duration"> + 1 hora + </text> + <text name="event_covercharge_label"> + Entrada: + </text> + <text name="event_cover"> + Gratis + </text> + <text name="event_location_label"> + Localización: + </text> + <text name="event_location" value="SampleParcel, Name Long (145, 228, 26)"/> + <text name="rating_label" value="Calificación:"/> + <text name="rating_value" value="desconocida"/> + <expandable_text name="event_desc"> + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. + </expandable_text> + </layout_panel> + <layout_panel name="button_panel"> + <button name="create_event_btn" tool_tip="Crear el evento"/> + <button name="god_delete_event_btn" tool_tip="Borrar el evento"/> + <button label="Notificarme" name="notify_btn"/> + <button label="Teleportar" name="teleport_btn"/> + <button label="Mapa" name="map_btn"/> + </layout_panel> + </layout_stack> +</floater> diff --git a/indra/newview/skins/default/xui/es/floater_gesture.xml b/indra/newview/skins/default/xui/es/floater_gesture.xml index 496881f2d2..d90de8c9f4 100644 --- a/indra/newview/skins/default/xui/es/floater_gesture.xml +++ b/indra/newview/skins/default/xui/es/floater_gesture.xml @@ -1,15 +1,25 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="gestures" title="GESTOS DISPONIBLES"> - <text name="help_label"> - Pulse dos veces en un gesto para reproducir las animaciones -y sonidos. - </text> - <scroll_list bottom_delta="-385" height="360" name="gesture_list"> - <column label="Botón" name="trigger"/> - <column label="Tecla" name="shortcut"/> - <column label="Nombre" name="name"/> +<floater label="Lugares" name="gestures" title="GESTOS"> + <floater.string name="loading"> + Cargando... + </floater.string> + <floater.string name="playing"> + (Ejecutándose) + </floater.string> + <floater.string name="copy_name"> + Copia de [COPY_NAME] + </floater.string> + <scroll_list name="gesture_list"> + <scroll_list.columns label="Nombre" name="name"/> + <scroll_list.columns label="Chat" name="trigger"/> + <scroll_list.columns label="Tecla" name="shortcut"/> </scroll_list> - <button label="Nuevo" name="new_gesture_btn"/> + <panel label="bottom_panel" name="bottom_panel"> + <menu_button name="gear_btn" tool_tip="Más opciones"/> + <button name="new_gesture_btn" tool_tip="Hacer un gesto nuevo"/> + <button name="activate_btn" tool_tip="Activar/Desactivar el gesto elegido"/> + <button name="del_btn" tool_tip="Borrar este gesto"/> + </panel> <button label="Editar" name="edit_btn"/> <button label="Reproducir" name="play_btn"/> <button label="Parar" name="stop_btn"/> diff --git a/indra/newview/skins/default/xui/es/floater_god_tools.xml b/indra/newview/skins/default/xui/es/floater_god_tools.xml index 78ec76e32b..218a5effe8 100644 --- a/indra/newview/skins/default/xui/es/floater_god_tools.xml +++ b/indra/newview/skins/default/xui/es/floater_god_tools.xml @@ -1,52 +1,36 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="godtools floater" title="HERRAMIENTAS DE DIOS"> <tab_container name="GodTools Tabs"> <panel label="Red" name="grid"> - <button label="Expulsar a todos los usuarios" - label_selected="Expulsar a todos los usuarios" name="Kick all users" /> - <button label="Vaciar los caches de visibilidad del mapa de la región" - label_selected="Vaciar los caches de visibilidad del mapa de la región" - name="Flush This Region's Map Visibility Caches" /> + <button label="Vaciar los caches de visibilidad del mapa de la región" label_selected="Vaciar los caches de visibilidad del mapa de la región" name="Flush This Region's Map Visibility Caches"/> </panel> <panel label="Región" name="region"> - <text name="Sim Name:"> - Nombre del Sim: + <text name="Region Name:"> + Nombre de la región: </text> - <check_box label="Preludio" name="check prelude" - tool_tip="Defina esté para hacer un preludio de la región." /> - <check_box label="Sol fijo" name="check fixed sun" - tool_tip="Fijar la posición del sol (asà como en Región/Propiedad > Terreno." /> - <check_box label="Restaurar casa en el teletransporte" name="check reset home" - tool_tip="Cuando el residente sea teletransportado hacia fuera, restaurar su casa para la posición de destino." /> - <check_box label="Visible" name="check visible" - tool_tip="Defina esté para tornar la región visible a no dioses." /> - <check_box label="Daño" name="check damage" - tool_tip="Defina esté para activar el daño en esta región." /> - <check_box label="Bloquear rastreo de tráfico" name="block dwell" - tool_tip="Defina esté para hacer que una región no compute el tráfico." /> - <check_box label="Bloquear formar terreno" name="block terraform" - tool_tip="Defina esté para no permitir que personas muden la formación del terreno de ellas" /> - <check_box label="Caja de arena" name="is sandbox" - tool_tip="Activar/desactivar si ésta es una región caja de arena." /> - <button label="Formar terreno" label_selected="Formar terreno" name="Bake Terrain" - tool_tip="Guardar el terreno actual como patrón." /> - <button label="Revertir terreno" label_selected="Revertir terreno" - name="Revert Terrain" - tool_tip="Sustituir el terreno actual por el patrón." /> - <button label="Cambiar terreno" label_selected="Cambiar terreno" name="Swap Terrain" - tool_tip="Cambiar terreno actual por el patrón." /> + <check_box label="Preludio" name="check prelude" tool_tip="Defina esté para hacer un preludio de la región."/> + <check_box label="Sol fijo" name="check fixed sun" tool_tip="Fijar la posición del sol (asà como en Región/Propiedad > Terreno."/> + <check_box label="Restaurar casa en el teletransporte" name="check reset home" tool_tip="When Resident teleports out, reset their home to the destination position."/> + <check_box label="Visible" name="check visible" tool_tip="Defina esté para tornar la región visible a no dioses."/> + <check_box label="Daño" name="check damage" tool_tip="Defina esté para activar el daño en esta región."/> + <check_box label="Bloquear rastreo de tráfico" name="block dwell" tool_tip="Defina esté para hacer que una región no compute el tráfico."/> + <check_box label="Bloquear formar terreno" name="block terraform" tool_tip="Defina esté para no permitir que personas muden la formación del terreno de ellas"/> + <check_box label="Caja de arena" name="is sandbox" tool_tip="Activar/desactivar si ésta es una región caja de arena."/> + <button label="Formar terreno" label_selected="Formar terreno" name="Bake Terrain" tool_tip="Guardar el terreno actual como patrón."/> + <button label="Revertir terreno" label_selected="Revertir terreno" name="Revert Terrain" tool_tip="Sustituir el terreno actual por el patrón."/> + <button label="Cambiar terreno" label_selected="Cambiar terreno" name="Swap Terrain" tool_tip="Cambiar terreno actual por el patrón."/> <text name="estate id"> ID de la propiedad: </text> <text name="parent id"> ID del padre: </text> - <line_editor name="parentestate" tool_tip="Ésta es una propiedad padre para esta región" /> + <line_editor name="parentestate" tool_tip="Ésta es una propiedad padre para esta región"/> <text name="Grid Pos: "> Red Pos: </text> - <line_editor name="gridposx" tool_tip="Ésta es la posición x de la reja para esta región" /> - <line_editor name="gridposy" tool_tip="Ésta es la posición y de la reja para esta región" /> + <line_editor name="gridposx" tool_tip="Ésta es la posición x de la reja para esta región"/> + <line_editor name="gridposy" tool_tip="Ésta es la posición y de la reja para esta región"/> <text name="Redirect to Grid: "> Redireccionar para red: </text> @@ -56,80 +40,54 @@ <text name="land cost text"> L$ por m²: </text> - <button label="Actualizar" label_selected="Actualizar" name="Refresh" - tool_tip="Haga clic aquà para actualizar la información arriba." /> - <button label="Aplicar" label_selected="Aplicar" name="Apply" - tool_tip="Haga clic aquà para aplicar cualesquiera de las mudanzas arriba." /> - <button label="Seleccionar región" label_selected="Seleccionar región" - name="Select Region" - tool_tip="Seleccione toda la región con esta herramienta de terreno." /> - <button label="Guardado automático ahora" label_selected="Guardado automático ahora" - name="Autosave now" - tool_tip="Guardar estado con gzip en el directorio de guardado automático." /> + <button label="Actualizar" label_selected="Actualizar" name="Refresh" tool_tip="Haga clic aquà para actualizar la información arriba."/> + <button label="Aplicar" label_selected="Aplicar" name="Apply" tool_tip="Haga clic aquà para aplicar cualesquiera de las mudanzas arriba."/> + <button label="Seleccionar región" label_selected="Seleccionar región" name="Select Region" tool_tip="Seleccione toda la región con esta herramienta de terreno."/> + <button label="Guardado automático ahora" label_selected="Guardado automático ahora" name="Autosave now" tool_tip="Guardar estado con gzip en el directorio de guardado automático."/> </panel> <panel label="Objetos" name="objects"> - <text name="Sim Name:"> - Nombre del Sim: + <text name="Region Name:"> + Nombre de la región: </text> <text name="region name"> Galés </text> - <check_box label="Desactivar scripts" name="disable scripts" - tool_tip="Defina esté para desactivar todos los scripts en esta región" /> - <check_box label="Desactivar colisiones" name="disable collisions" - tool_tip="Defina esté para desactivar las colisiones entre no agentes en esta región" /> - <check_box label="Desactivar fÃsica" name="disable physics" - tool_tip="Defina esté para desactivar toda la fÃsica en esta región" /> - <button label="Aplicar" label_selected="Aplicar" name="Apply" - tool_tip="Haga clic aquà para aplicar cualesquiera de las mudanzas arriba." /> - <button label="Definir blanco" label_selected="Definir blanco" name="Set Target" - tool_tip="Ajuste el avatar del blanco para la exclusión del objeto." /> + <check_box label="Desactivar scripts" name="disable scripts" tool_tip="Defina esté para desactivar todos los scripts en esta región"/> + <check_box label="Desactivar colisiones" name="disable collisions" tool_tip="Defina esté para desactivar las colisiones entre no agentes en esta región"/> + <check_box label="Desactivar fÃsica" name="disable physics" tool_tip="Defina esté para desactivar toda la fÃsica en esta región"/> + <button label="Aplicar" label_selected="Aplicar" name="Apply" tool_tip="Haga clic aquà para aplicar cualesquiera de las mudanzas arriba."/> + <button label="Definir blanco" label_selected="Definir blanco" name="Set Target" tool_tip="Ajuste el avatar del blanco para la exclusión del objeto."/> <text name="target_avatar_name"> (sin blanco) </text> - <button label="Borrar objetos con script del blanco en otros terrenos" - label_selected="Borrar objetos con script del blanco en otros terrenos" - name="Delete Target's Scripted Objects On Others Land" - tool_tip="Borrar todos los objetos con script pertenecientes al blanco en el terreno que no pertenece a él. Objetos (sin copia) retornarán." /> - <button label="Borrar objetos con script del blanco en *TODOS* los terrenos" - label_selected="Borrar objetos con script del blanco en *TODOS* los terrenos" - name="Delete Target's Scripted Objects On *Any* Land" - tool_tip="Borrar todos los objetos con script pertenecientes al blanco en esta región. Objetos (sin copia) retornarán." /> - <button label="Borrar *TODOS* los objetos del blanco" - label_selected="Borrar *TODOS* los objetos del blanco" - name="Delete *ALL* Of Target's Objects" - tool_tip="Borrar todos los objetos pertenecientes al blanco en esta región. Objetos (sin copia) retornarán." /> - <button label="Obtener top de colisionadores" - label_selected="Obtener top de colisionadores" name="Get Top Colliders" - tool_tip="Coger lista de objetos que están recibiendo narrowphase callbacks." /> - <button label="Obtener top de scripts" label_selected="Obtener top de scripts" - name="Get Top Scripts" - tool_tip="Coger lista de objetos que están consumiendo más tiempo de ejecución de scripts." /> - <button label="Compilador de scripts" label_selected="Compilador de scripts" - name="Scripts digest" - tool_tip="Coger una lista de todos los scripts y sus respectivos números de ocurrencia." /> + <button label="Borrar objetos con script del blanco en otros terrenos" label_selected="Borrar objetos con script del blanco en otros terrenos" name="Delete Target's Scripted Objects On Others Land" tool_tip="Borrar todos los objetos con script pertenecientes al blanco en el terreno que no pertenece a él. Objetos (sin copia) retornarán."/> + <button label="Borrar objetos con script del blanco en *TODOS* los terrenos" label_selected="Borrar objetos con script del blanco en *TODOS* los terrenos" name="Delete Target's Scripted Objects On *Any* Land" tool_tip="Borrar todos los objetos con script pertenecientes al blanco en esta región. Objetos (sin copia) retornarán."/> + <button label="Borrar *TODOS* los objetos del blanco" label_selected="Borrar *TODOS* los objetos del blanco" name="Delete *ALL* Of Target's Objects" tool_tip="Borrar todos los objetos pertenecientes al blanco en esta región. Objetos (sin copia) retornarán."/> + <button label="Obtener top de colisionadores" label_selected="Obtener top de colisionadores" name="Get Top Colliders" tool_tip="Coger lista de objetos que están recibiendo narrowphase callbacks."/> + <button label="Obtener top de scripts" label_selected="Obtener top de scripts" name="Get Top Scripts" tool_tip="Coger lista de objetos que están consumiendo más tiempo de ejecución de scripts."/> + <button label="Compilador de scripts" label_selected="Compilador de scripts" name="Scripts digest" tool_tip="Coger una lista de todos los scripts y sus respectivos números de ocurrencia."/> </panel> <panel label="Requerir" name="request"> <text name="Destination:"> Destino: </text> <combo_box name="destination"> - <combo_box.item name="item1" label="Selección" /> - <combo_box.item name="item2" label="Agente de región" /> + <combo_box.item label="Selección" name="item1"/> + <combo_box.item label="Agente de región" name="item2"/> </combo_box> <text name="Request:"> Exigencia: </text> <combo_box name="request"> - <combo_box.item name="item1" label="colisionadores <pasos>" /> - <combo_box.item name="item2" label="scripts <contar>,<patrón opcional>" /> - <combo_box.item name="item3" label="objetos <patrón>" /> - <combo_box.item name="item4" label="rez <asset_id>" /> + <combo_box.item label="colisionadores <pasos>" name="item1"/> + <combo_box.item label="scripts <contar>,<patrón opcional>" name="item2"/> + <combo_box.item label="objetos <patrón>" name="item3"/> + <combo_box.item label="rez <asset_id>" name="item4"/> </combo_box> <text name="Parameter:"> Parámetro: </text> - <button label="Hacer exigencia" label_selected="Hacer exigencia" name="Make Request" /> + <button label="Hacer exigencia" label_selected="Hacer exigencia" name="Make Request"/> </panel> </tab_container> </floater> diff --git a/indra/newview/skins/default/xui/es/floater_hardware_settings.xml b/indra/newview/skins/default/xui/es/floater_hardware_settings.xml index 9418252036..f967d697c5 100644 --- a/indra/newview/skins/default/xui/es/floater_hardware_settings.xml +++ b/indra/newview/skins/default/xui/es/floater_hardware_settings.xml @@ -8,21 +8,21 @@ Antialiasing: </text> <combo_box label="Antialiasing" name="fsaa" width="94"> - <combo_box.item name="FSAADisabled" label="Desactivado"/> - <combo_box.item name="2x" label="2x"/> - <combo_box.item name="4x" label="4x"/> - <combo_box.item name="8x" label="8x"/> - <combo_box.item name="16x" label="16x"/> + <combo_box.item label="Desactivado" name="FSAADisabled"/> + <combo_box.item label="2x" name="2x"/> + <combo_box.item label="4x" name="4x"/> + <combo_box.item label="8x" name="8x"/> + <combo_box.item label="16x" name="16x"/> </combo_box> <spinner label="Gamma:" name="gamma"/> <text name="(brightness, lower is brighter)"> - (brillo; menor es más brillante, 0=predeterminado) + (0 = brillo por defecto, más bajo = más brillo) </text> <text name="Enable VBO:"> Activar VBO: </text> - <check_box label="Activar OpenGL Vertex Buffer Objects" name="vbo" tool_tip="En hardware moderno, habilitar esta opción mejora el rendimiento. Pero en hardware antiguo, el habilitarlo hace que, frecuentemente, se obtenga una implementación pobre de VBO, lo que puede provocarle caÃdas."/> - <slider label_width="150" left="10" width="300" label="Memoria para texturas (MB):" name="GrapicsCardTextureMemory" tool_tip="Cantidad de memoria asignada a las texturas. Por defecto es la memoria de la tarjeta de vÃdeo. Reducir esta cantidad puede mejorar el rendimiento, pero también puede hacer que las texturas se vean borrosas."/> + <check_box initial_value="true" label="Activar OpenGL Vertex Buffer Objects" name="vbo" tool_tip="En hardware moderno, habilitar esta opción mejora el rendimiento. Pero en hardware antiguo, el habilitarlo hace que, frecuentemente, se obtenga una implementación pobre de VBO, lo que puede provocarle caÃdas."/> + <slider label="Memoria para texturas (MB):" name="GraphicsCardTextureMemory" tool_tip="Cantidad de memoria asignada a las texturas. Por defecto es la memoria de la tarjeta de vÃdeo. Reducir esta cantidad puede mejorar el rendimiento, pero también hacer que las texturas se vean borrosas."/> <spinner label="Intensidad de la niebla:" name="fog"/> <button label="OK" label_selected="OK" name="OK"/> </floater> diff --git a/indra/newview/skins/default/xui/es/floater_help_browser.xml b/indra/newview/skins/default/xui/es/floater_help_browser.xml new file mode 100644 index 0000000000..ec3c38e8c7 --- /dev/null +++ b/indra/newview/skins/default/xui/es/floater_help_browser.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_help_browser" title="BUSCADOR DE AYUDA"> + <floater.string name="loading_text"> + Cargando... + </floater.string> + <layout_stack name="stack1"> + <layout_panel name="external_controls"/> + </layout_stack> +</floater> diff --git a/indra/newview/skins/default/xui/es/floater_im.xml b/indra/newview/skins/default/xui/es/floater_im.xml index 3e92003bac..3850b94fd6 100644 --- a/indra/newview/skins/default/xui/es/floater_im.xml +++ b/indra/newview/skins/default/xui/es/floater_im.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <multi_floater name="im_floater" title="Mensaje Instantáneo"> <string name="only_user_message"> - Usted es el único usuario en esta sesión. + Eres el único Residente en esta sesión. </string> <string name="offline_message"> [FIRST] [LAST] no está conectado. @@ -10,7 +10,7 @@ Pulse el botón [BUTTON NAME] para aceptar/conectar este chat de voz. </string> <string name="muted_message"> - Ha ignorado a este residente. Al enviarle un mensaje, automáticamente dejará de ignorarle. + Has ignorado a este Residente. Enviándole un mensaje, automáticamente dejarás de ignorarle. </string> <string name="generic_request_error"> Error al hacer lo solicitado; por favor, inténtelo más tarde. @@ -31,7 +31,7 @@ Un moderador del grupo le ha desactivado el chat de texto. </string> <string name="add_session_event"> - No se ha podido añadir usuarios a la sesión de chat con [RECIPIENT]. + No es posible añadir Residentes a la sesión de chat con [RECIPIENT]. </string> <string name="message_session_event"> No se ha podido enviar su mensaje a la sesión de chat con [RECIPIENT]. diff --git a/indra/newview/skins/default/xui/es/floater_im_container.xml b/indra/newview/skins/default/xui/es/floater_im_container.xml new file mode 100644 index 0000000000..1cd752e6ec --- /dev/null +++ b/indra/newview/skins/default/xui/es/floater_im_container.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<multi_floater name="floater_im_box" title="CONVERSACIONES"/> diff --git a/indra/newview/skins/default/xui/es/floater_im_session.xml b/indra/newview/skins/default/xui/es/floater_im_session.xml new file mode 100644 index 0000000000..c7312e609b --- /dev/null +++ b/indra/newview/skins/default/xui/es/floater_im_session.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="panel_im"> + <layout_stack name="im_panels"> + <layout_panel label="Panel de control de MI" name="panel_im_control_panel"/> + <layout_panel> + <line_editor label="A" name="chat_editor"/> + </layout_panel> + </layout_stack> +</floater> diff --git a/indra/newview/skins/default/xui/es/floater_image_preview.xml b/indra/newview/skins/default/xui/es/floater_image_preview.xml index 6d51a800b7..84c5bfc824 100644 --- a/indra/newview/skins/default/xui/es/floater_image_preview.xml +++ b/indra/newview/skins/default/xui/es/floater_image_preview.xml @@ -10,17 +10,17 @@ Previsualizar la imagen como: </text> - <combo_box label="Tipo de ropa" name="clothing_type_combo" left="100" width="186"> - <combo_box.item name="Image" label="Imagen" /> - <combo_box.item name="Hair" label="Pelo" /> - <combo_box.item name="FemaleHead" label="Cabeza de mujer" /> - <combo_box.item name="FemaleUpperBody" label="Mujer: parte superior del cuerpo" /> - <combo_box.item name="FemaleLowerBody" label="Mujer: parte inferior del cuerpo" /> - <combo_box.item name="MaleHead" label="Cabeza de varón" /> - <combo_box.item name="MaleUpperBody" label="Varón: parte superior del cuerpo" /> - <combo_box.item name="MaleLowerBody" label="Varón: parte inferior del cuerpo" /> - <combo_box.item name="Skirt" label="Falda" /> - <combo_box.item name="SculptedPrim" label="Prim sculpted"/> + <combo_box label="Tipo de ropa" left="100" name="clothing_type_combo" width="186"> + <item label="Imagen" name="Image" value="Imagen"/> + <item label="Pelo" name="Hair" value="Pelo"/> + <item label="Mujer: cabeza" name="FemaleHead" value="Mujer: cabeza"/> + <item label="Mujer: parte superior del cuerpo" name="FemaleUpperBody" value="Mujer: parte superior del cuerpo"/> + <item label="Mujer: parte inferior del cuerpo" name="FemaleLowerBody" value="Mujer: parte inferior del cuerpo"/> + <item label="Varón: cabeza" name="MaleHead" value="Varón: cabeza"/> + <item label="Varón: parte superior del cuerpo" name="MaleUpperBody" value="Varón: parte superior del cuerpo"/> + <item label="Varón: parte inferior del cuerpo" name="MaleLowerBody" value="Varón: parte inferior del cuerpo"/> + <item label="Falda" name="Skirt" value="Falda"/> + <item label="Prim sculpted" name="SculptedPrim" value="Prim sculpted"/> </combo_box> <text name="bad_image_text"> Imposible leer la imagen. diff --git a/indra/newview/skins/default/xui/es/floater_incoming_call.xml b/indra/newview/skins/default/xui/es/floater_incoming_call.xml new file mode 100644 index 0000000000..88cfc9575a --- /dev/null +++ b/indra/newview/skins/default/xui/es/floater_incoming_call.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="incoming call" title="ESTà LLAMANDO ALGUIEN DESCONOCIDO"> + <floater.string name="lifetime"> + 5 + </floater.string> + <floater.string name="localchat"> + Chat de voz + </floater.string> + <floater.string name="anonymous"> + anónimo + </floater.string> + <floater.string name="VoiceInviteP2P"> + está llamando. + </floater.string> + <floater.string name="VoiceInviteAdHoc"> + ha entrado en un chat de voz en multiconferencia. + </floater.string> + <floater.string name="VoiceInviteGroup"> + acaba de entrar en el canal de voz '[GROUP]'. + </floater.string> + <floater.string name="VoiceInviteQuestionGroup"> + ¿Quieres dejar [CURRENT_CHAT] e incorporarte a la llamada con '[GROUP]'? + </floater.string> + <floater.string name="VoiceInviteQuestionDefault"> + ¿Quieres dejar [CURRENT_CHAT] y entrar en este chat de voz? + </floater.string> + <text name="question"> + ¿Quieres dejar [CURRENT_CHAT] y entrar a este chat de voz? + </text> + <button label="Aceptar" label_selected="Aceptar" name="Accept"/> + <button label="Rechazar" label_selected="Rechazar" name="Reject"/> + <button label="Comenzar un MI" name="Start IM"/> +</floater> diff --git a/indra/newview/skins/default/xui/es/floater_inspect.xml b/indra/newview/skins/default/xui/es/floater_inspect.xml index 3c8b38648f..d95653ddd0 100644 --- a/indra/newview/skins/default/xui/es/floater_inspect.xml +++ b/indra/newview/skins/default/xui/es/floater_inspect.xml @@ -1,11 +1,14 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="inspect" title="EXAMINAR OBJETOS" min_width="450"> +<floater min_width="450" name="inspect" title="EXAMINAR LOS OBJETOS"> + <floater.string name="timeStamp"> + [wkday,datetime,local][day,datetime,local] [mth,datetime,local] [year,datetime,local][hour,datetime,local]:[min,datetime,local]:[second,datetime,local] + </floater.string> <scroll_list name="object_list" tool_tip="Seleccione un objeto de esta lista para realzarlo en el mundo"> - <column label="Nombre del objeto" name="object_name"/> - <column label="Propietario" name="owner_name"/> - <column label="Creador" name="creator_name"/> - <column label="Fecha de creación" name="creation_date"/> + <scroll_list.columns label="Nombre del objeto" name="object_name"/> + <scroll_list.columns label="Propietario" name="owner_name"/> + <scroll_list.columns label="Creador" name="creator_name"/> + <scroll_list.columns label="Fecha de creación" name="creation_date"/> </scroll_list> - <button width="185" label="Ver el perfil del propietario..." label_selected="" name="button owner" tool_tip="Ver el perfil del propietario del objeto realzado"/> - <button width="165" left="205" label="Ver el perfil del creador..." label_selected="" name="button creator" tool_tip="Ver el perfil del creador original del objeto realzado"/> + <button label="Ver el perfil del propietario..." label_selected="" name="button owner" tool_tip="Ver el perfil del propietario del objeto realzado" width="185"/> + <button label="Ver el perfil del creador..." label_selected="" left="205" name="button creator" tool_tip="Ver el perfil del creador original del objeto realzado" width="165"/> </floater> diff --git a/indra/newview/skins/default/xui/es/floater_inventory.xml b/indra/newview/skins/default/xui/es/floater_inventory.xml index 8d16d6089e..0f0ba2fce6 100644 --- a/indra/newview/skins/default/xui/es/floater_inventory.xml +++ b/indra/newview/skins/default/xui/es/floater_inventory.xml @@ -1,47 +1,16 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Inventory" title="INVENTARIO"> - <search_editor label="Escriba aquà para buscar" name="inventory search editor"/> - <tab_container name="inventory filter tabs"> - <inventory_panel label="Todos los Ãtems" name="All Items"/> - <inventory_panel label="Ãtems recientes" name="Recent Items"/> - </tab_container> - <menu_bar name="Inventory Menu"> - <menu label="Archivo" name="File"> - <menu_item_call label="Abrir" name="Open"/> - <menu_item_call label="Nueva ventana" name="New Window"/> - <menu_item_call label="Ver los filtros" name="Show Filters"/> - <menu_item_call label="Restablecer los filtros" name="Reset Current"/> - <menu_item_call label="Cerrar todas las carpetas" name="Close All Folders"/> - <menu_item_call label="Vaciar la papelera" name="Empty Trash"/> - </menu> - <menu label="Crear" name="Create"> - <menu_item_call label="Carpeta nueva" name="New Folder"/> - <menu_item_call label="Script nuevo" name="New Script"/> - <menu_item_call label="Nota nueva" name="New Note"/> - <menu_item_call label="Gesto nuevo" name="New Gesture"/> - <menu name="New Clothes"> - <menu_item_call label="Falda nueva" name="New Shirt"/> - <menu_item_call label="Pantalones nuevos" name="New Pants"/> - <menu_item_call label="Zapatos nuevos" name="New Shoes"/> - <menu_item_call label="Calcetines nuevos" name="New Socks"/> - <menu_item_call label="Chaqueta nueva" name="New Jacket"/> - <menu_item_call label="Falda nueva" name="New Skirt"/> - <menu_item_call label="Guantes nuevos" name="New Gloves"/> - <menu_item_call label="Camiseta nueva" name="New Undershirt"/> - <menu_item_call label="Ropa interior nueva" name="New Underpants"/> - </menu> - <menu name="New Body Parts"> - <menu_item_call label="Forma nueva" name="New Shape"/> - <menu_item_call label="Piel nueva" name="New Skin"/> - <menu_item_call label="Pelo nuevo" name="New Hair"/> - <menu_item_call label="Ojos nuevos" name="New Eyes"/> - </menu> - </menu> - <menu label="Ordenar" name="Sort"> - <menu_item_check label="Por el nombre" name="By Name"/> - <menu_item_check label="Por la fecha" name="By Date"/> - <menu_item_check label="Las carpetas, siempre por la fecha" name="Folders Always By Name"/> - <menu_item_check label="Las carpetas del sistema, arriba" name="System Folders To Top"/> - </menu> - </menu_bar> +<floater name="Inventory" title="MI INVENTARIO"> + <floater.string name="Title"> + MI INVENTARIO + </floater.string> + <floater.string name="TitleFetching"> + MI INVENTARIO (obteniendo [ITEM_COUNT] Ãtems...) [FILTER] + </floater.string> + <floater.string name="TitleCompleted"> + MI INVENTARIO ([ITEM_COUNT] Ãtems) [FILTER] + </floater.string> + <floater.string name="Fetched"> + Obtenido + </floater.string> + <panel label="Panel del inventario" name="Inventory Panel"/> </floater> diff --git a/indra/newview/skins/default/xui/es/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/es/floater_inventory_item_properties.xml index 7abdfceb94..5746688962 100644 --- a/indra/newview/skins/default/xui/es/floater_inventory_item_properties.xml +++ b/indra/newview/skins/default/xui/es/floater_inventory_item_properties.xml @@ -1,5 +1,20 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="item properties" title="PROPIEDADES DEL ÃTEM DEL INVENTARIO"> + <floater.string name="unknown"> + (desconocido) + </floater.string> + <floater.string name="public"> + (público) + </floater.string> + <floater.string name="you_can"> + Usted puede: + </floater.string> + <floater.string name="owner_can"> + El propietario puede: + </floater.string> + <floater.string name="acquiredDate"> + [wkday,datetime,local][day,datetime,local] [mth,datetime,local] [year,datetime,local][hour,datetime,local]:[min,datetime,local]:[second,datetime,local] + </floater.string> <text name="LabelItemNameTitle"> Nombre: </text> @@ -27,55 +42,32 @@ May Mié 24 12:50:46 2006 </text> <text name="OwnerLabel"> - Usted puede: - </text> - <check_box label="Modificarlo" name="CheckOwnerModify"/> - <check_box left_delta="88" label="Copiarlo" name="CheckOwnerCopy"/> - <check_box label="Venderlo/darlo" name="CheckOwnerTransfer"/> - <text name="BaseMaskDebug"> - B: - </text> - <text name="OwnerMaskDebug"> - O: + Tú: </text> - <text name="GroupMaskDebug"> - G: + <check_box label="Editar" name="CheckOwnerModify"/> + <check_box label="Copiarlo" left_delta="88" name="CheckOwnerCopy"/> + <check_box label="Revender" name="CheckOwnerTransfer"/> + <text name="AnyoneLabel"> + Cualquiera: </text> - <text name="EveryoneMaskDebug"> - E: + <check_box label="Copiar" name="CheckEveryoneCopy"/> + <text name="GroupLabel"> + Grupo: </text> - <text name="NextMaskDebug"> - N: - </text> - <check_box label="Compartir con el grupo" name="CheckShareWithGroup"/> - <check_box label="Permitir a cualquiera que lo copie" name="CheckEveryoneCopy"/> + <check_box label="Compartir" name="CheckShareWithGroup"/> <text name="NextOwnerLabel" width="230"> - El próximo propietario puede: - </text> - <check_box label="Modificarlo" name="CheckNextOwnerModify"/> - <check_box left_delta="88" label="Copiarlo" name="CheckNextOwnerCopy"/> - <check_box label="Revenderlo/darlo" name="CheckNextOwnerTransfer"/> - <text name="SaleLabel"> - Marcar Ãtem como: + Próximo propietario: </text> + <check_box label="Editar" name="CheckNextOwnerModify"/> + <check_box label="Copiarlo" left_delta="88" name="CheckNextOwnerCopy"/> + <check_box label="Revender" name="CheckNextOwnerTransfer"/> <check_box label="En venta" name="CheckPurchase"/> - <radio_group name="RadioSaleType" left_delta="88" > - <radio_item name="radio" label="Original" /> - <radio_item name="radio2" label="Copia" /> - </radio_group> - <text name="TextPrice"> - Precio: L$ + <combo_box name="combobox sale copy"> + <combo_box.item label="Copia" name="Copy"/> + <combo_box.item label="Original" name="Original"/> + </combo_box> + <spinner label="Precio:" name="Edit Cost"/> + <text name="CurrencySymbol"> + L$ </text> - <string name="unknown"> - (desconocido) - </string> - <string name="public"> - (público) - </string> - <string name="you_can"> - Usted puede: - </string> - <string name="owner_can"> - El propietario puede: - </string> </floater> diff --git a/indra/newview/skins/default/xui/es/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/es/floater_inventory_view_finder.xml index 0cbee11bfb..c9d639d8cf 100644 --- a/indra/newview/skins/default/xui/es/floater_inventory_view_finder.xml +++ b/indra/newview/skins/default/xui/es/floater_inventory_view_finder.xml @@ -11,12 +11,12 @@ <check_box label="Sonidos" name="check_sound"/> <check_box label="Texturas" name="check_texture"/> <check_box label="Fotos" name="check_snapshot"/> - <button label="Todo" label_selected="Todo" name="All" width="70"/> - <button label="Nada" label_selected="Nada" name="None" width="70" bottom_delta="0" left="83"/> - <check_box label="Mostrar siempre las carpetas" name="check_show_empty"/> + <button label="Todos" label_selected="Todo" name="All"/> + <button label="Ninguno" label_selected="Nada" name="None"/> + <check_box label="Mostrar siempre las carpetas" name="check_show_empty"/> <check_box label="Desde el fin de sesión" name="check_since_logoff" bottom_delta="-36"/> <text name="- OR -"> - - O - + - o - </text> <spinner label="horas atrás" name="spin_hours_ago"/> <spinner label="dÃas atrás" name="spin_days_ago"/> diff --git a/indra/newview/skins/default/xui/es/floater_joystick.xml b/indra/newview/skins/default/xui/es/floater_joystick.xml index 75c53dd646..2c1804bd90 100644 --- a/indra/newview/skins/default/xui/es/floater_joystick.xml +++ b/indra/newview/skins/default/xui/es/floater_joystick.xml @@ -1,23 +1,23 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="Joystick" title="CONFIGURACIÓN DEL JOYSTICK"> - <check_box name="enable_joystick" label="Activar el joystick:"/> + <check_box label="Activar el joystick:" name="enable_joystick"/> <text left="140" name="joystick_type" width="360"/> - <spinner label="Mapping: eje X" name="JoystickAxis1" label_width="118" width="161"/> - <spinner label="Mapping: eje Y" name="JoystickAxis2" label_width="105" width="148"/> - <spinner label="Mapping: eje Z" name="JoystickAxis0" label_width="95" width="138"/> - <spinner label="Mapping: arriba/abajo" name="JoystickAxis4" label_width="118" width="161"/> - <spinner label="Mapping: izq./der." name="JoystickAxis5" label_width="105" width="148"/> - <spinner label="Mapping: giro" name="JoystickAxis3" label_width="95" width="138"/> - <spinner label="Mapping: zoom" name="JoystickAxis6" label_width="118" width="161"/> + <spinner label="Mapping: eje X" label_width="118" name="JoystickAxis1" width="161"/> + <spinner label="Mapping: eje Y" label_width="105" name="JoystickAxis2" width="148"/> + <spinner label="Mapping: eje Z" label_width="95" name="JoystickAxis0" width="138"/> + <spinner label="Mapping: arriba/abajo" label_width="118" name="JoystickAxis4" width="161"/> + <spinner label="Mapping: izq./der." label_width="105" name="JoystickAxis5" width="148"/> + <spinner label="Mapping: giro" label_width="95" name="JoystickAxis3" width="138"/> + <spinner label="Mapping: zoom" label_width="118" name="JoystickAxis6" width="161"/> <check_box label="Zoom directo" name="ZoomDirect"/> <check_box label="Cursor 3D" name="Cursor3D"/> <check_box label="Nivel automático" name="AutoLeveling"/> <text name="Control Modes:"> Modos de control: </text> - <check_box name="JoystickAvatarEnabled" label="Avatar"/> - <check_box name="JoystickBuildEnabled" left="192" label="Construir"/> - <check_box name="JoystickFlycamEnabled" label="Flycam"/> + <check_box label="Avatar" name="JoystickAvatarEnabled"/> + <check_box label="Construir" name="JoystickBuildEnabled"/> + <check_box label="Flycam" name="JoystickFlycamEnabled"/> <text name="XScale"> Escala: X </text> @@ -27,7 +27,7 @@ <text name="ZScale"> Escala: Z </text> - <text name="PitchScale" left="3" width="115"> + <text name="PitchScale"> Escala: arriba/abajo </text> <text name="YawScale"> @@ -45,10 +45,10 @@ <text name="ZDeadZone"> Zona muerta Z </text> - <text name="PitchDeadZone" left="3" width="115"> + <text name="PitchDeadZone"> Zona muerta arri./aba. </text> - <text name="YawDeadZone" left="3" width="115"> + <text name="YawDeadZone"> Zona muerta izq./der. </text> <text name="RollDeadZone"> @@ -63,9 +63,9 @@ <text name="ZoomDeadZone"> Zona muerta zoom </text> - <button label="Predeterminados del SpaceNavigator" name="SpaceNavigatorDefaults" font="SansSerifSmall" left="330" width="210"/> - <button label="OK" label_selected="OK" name="ok_btn" left="330"/> - <button label="Cancelar" label_selected="Cancelar" name="cancel_btn" left_delta="120"/> + <button font="SansSerifSmall" label="Por defecto del SpaceNavigator" name="SpaceNavigatorDefaults"/> + <button label="OK" label_selected="OK" left="330" name="ok_btn"/> + <button label="Cancelar" label_selected="Cancelar" left_delta="120" name="cancel_btn"/> <stat_view label="Monitor del joystick" name="axis_view"> <stat_bar label="Eje 0" name="axis0"/> <stat_bar label="Eje 1" name="axis1"/> diff --git a/indra/newview/skins/default/xui/es/floater_lagmeter.xml b/indra/newview/skins/default/xui/es/floater_lagmeter.xml index 54c4ce8c6a..227689a194 100644 --- a/indra/newview/skins/default/xui/es/floater_lagmeter.xml +++ b/indra/newview/skins/default/xui/es/floater_lagmeter.xml @@ -1,155 +1,154 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="floater_lagmeter" title="MEDIDOR DEL LAG"> - <button label="" label_selected="" name="client_lagmeter" tool_tip="Estado del lag del cliente"/> - <text name="client"> - Cliente: - </text> - <text name="client_text" font="SansSerifSmall"> - Normal - </text> - <text left="30" name="client_lag_cause" right="-10" /> - <button label="" label_selected="" name="network_lagmeter" tool_tip="Estado del lag de la red"/> - <text name="network"> - Red: - </text> - <text name="network_text" font="SansSerifSmall"> - Normal - </text> - <text left="30" name="network_lag_cause" right="-10" /> - <button label="" label_selected="" name="server_lagmeter" tool_tip="Estado del lag del servidor"/> - <text name="server"> - Servidor: - </text> - <text name="server_text" font="SansSerifSmall"> - Normal - </text> - <text left="30" name="server_lag_cause" right="-32" /> - <button label="?" name="server_help"/> - <button label=">>" name="minimize"/> - <string name="max_title_msg"> + <floater.string name="max_title_msg"> Medidor del lag - </string> - <string name="max_width_px"> + </floater.string> + <floater.string name="max_width_px"> 360 - </string> - <string name="min_title_msg"> + </floater.string> + <floater.string name="min_title_msg"> Lag - </string> - <string name="min_width_px"> + </floater.string> + <floater.string name="min_width_px"> 90 - </string> - <string name="client_text_msg"> + </floater.string> + <floater.string name="client_text_msg"> Cliente - </string> - <string name="client_frame_rate_critical_fps"> + </floater.string> + <floater.string name="client_frame_rate_critical_fps"> 10 - </string> - <string name="client_frame_rate_warning_fps"> + </floater.string> + <floater.string name="client_frame_rate_warning_fps"> 15 - </string> - <string name="client_frame_time_window_bg_msg"> + </floater.string> + <floater.string name="client_frame_time_window_bg_msg"> Normal, ventana en segundo plano - </string> - <string name="client_frame_time_critical_msg"> + </floater.string> + <floater.string name="client_frame_time_critical_msg"> Frames del cliente valorados por debajo de [CLIENT_FRAME_RATE_CRITICAL] - </string> - <string name="client_frame_time_warning_msg"> + </floater.string> + <floater.string name="client_frame_time_warning_msg"> Frames del cliente valorados entre [CLIENT_FRAME_RATE_CRITICAL] y [CLIENT_FRAME_RATE_WARNING] - </string> - <string name="client_frame_time_normal_msg"> + </floater.string> + <floater.string name="client_frame_time_normal_msg"> Normal - </string> - <string name="client_draw_distance_cause_msg"> + </floater.string> + <floater.string name="client_draw_distance_cause_msg"> Posible causa: distancia de dibujo fijada muy alta - </string> - <string name="client_texture_loading_cause_msg"> + </floater.string> + <floater.string name="client_texture_loading_cause_msg"> Posible causa: imágenes cargándose - </string> - <string name="client_texture_memory_cause_msg"> + </floater.string> + <floater.string name="client_texture_memory_cause_msg"> Posible causa: demasiadas imágenes en la memoria - </string> - <string name="client_complex_objects_cause_msg"> + </floater.string> + <floater.string name="client_complex_objects_cause_msg"> Posible causa: demasiados objetos complejos en la escena - </string> - <string name="network_text_msg"> + </floater.string> + <floater.string name="network_text_msg"> Red - </string> - <string name="network_packet_loss_critical_pct"> + </floater.string> + <floater.string name="network_packet_loss_critical_pct"> 10 - </string> - <string name="network_packet_loss_warning_pct"> + </floater.string> + <floater.string name="network_packet_loss_warning_pct"> 5 - </string> - <string name="network_packet_loss_critical_msg"> + </floater.string> + <floater.string name="network_packet_loss_critical_msg"> La conexión deja caer más del [NETWORK_PACKET_LOSS_CRITICAL]% de los paquetes - </string> - <string name="network_packet_loss_warning_msg"> + </floater.string> + <floater.string name="network_packet_loss_warning_msg"> La conexión deja caer [NETWORK_PACKET_LOSS_WARNING]%-[NETWORK_PACKET_LOSS_CRITICAL]% de los paquetes - </string> - <string name="network_performance_normal_msg"> + </floater.string> + <floater.string name="network_performance_normal_msg"> Normal - </string> - <string name="network_ping_critical_ms"> + </floater.string> + <floater.string name="network_ping_critical_ms"> 600 - </string> - <string name="network_ping_warning_ms"> + </floater.string> + <floater.string name="network_ping_warning_ms"> 300 - </string> - <string name="network_ping_critical_msg"> + </floater.string> + <floater.string name="network_ping_critical_msg"> El tiempo de conexión -ping- supera los [NETWORK_PING_CRITICAL] ms - </string> - <string name="network_ping_warning_msg"> + </floater.string> + <floater.string name="network_ping_warning_msg"> El tiempo de conexión -ping- es de [NETWORK_PING_WARNING]-[NETWORK_PING_CRITICAL] ms - </string> - <string name="network_packet_loss_cause_msg"> + </floater.string> + <floater.string name="network_packet_loss_cause_msg"> Quizá una mala conexión o un ancho de banda fijado demasiado alto. - </string> - <string name="network_ping_cause_msg"> + </floater.string> + <floater.string name="network_ping_cause_msg"> Quizá una mala conexión o una aplicación de archivos compartidos. - </string> - <string name="server_text_msg"> + </floater.string> + <floater.string name="server_text_msg"> Servidor - </string> - <string name="server_frame_rate_critical_fps"> + </floater.string> + <floater.string name="server_frame_rate_critical_fps"> 20 - </string> - <string name="server_frame_rate_warning_fps"> + </floater.string> + <floater.string name="server_frame_rate_warning_fps"> 30 - </string> - <string name="server_single_process_max_time_ms"> + </floater.string> + <floater.string name="server_single_process_max_time_ms"> 20 - </string> - <string name="server_frame_time_critical_msg"> + </floater.string> + <floater.string name="server_frame_time_critical_msg"> Frecuencia (framerate) por debajo de [SERVER_FRAME_RATE_CRITICAL] - </string> - <string name="server_frame_time_warning_msg"> + </floater.string> + <floater.string name="server_frame_time_warning_msg"> Frecuencia (framerate) entre [SERVER_FRAME_RATE_CRITICAL] y [SERVER_FRAME_RATE_WARNING] - </string> - <string name="server_frame_time_normal_msg"> + </floater.string> + <floater.string name="server_frame_time_normal_msg"> Normal - </string> - <string name="server_physics_cause_msg"> + </floater.string> + <floater.string name="server_physics_cause_msg"> Posible causa: demasiados objetos fÃsicos - </string> - <string name="server_scripts_cause_msg"> + </floater.string> + <floater.string name="server_scripts_cause_msg"> Posible causa: demasiados objetos con script - </string> - <string name="server_net_cause_msg"> + </floater.string> + <floater.string name="server_net_cause_msg"> Posible causa: demasiado tráfico en la red - </string> - <string name="server_agent_cause_msg"> + </floater.string> + <floater.string name="server_agent_cause_msg"> Posible causa: demasiada gente moviéndose en la región - </string> - <string name="server_images_cause_msg"> + </floater.string> + <floater.string name="server_images_cause_msg"> Posible causa: demasiados cálculos de imáganes - </string> - <string name="server_generic_cause_msg"> + </floater.string> + <floater.string name="server_generic_cause_msg"> Posible causa: carga del simulador muy pesada - </string> - <string name="smaller_label"> + </floater.string> + <floater.string name="smaller_label"> >> - </string> - <string name="bigger_label"> + </floater.string> + <floater.string name="bigger_label"> << - </string> + </floater.string> + <button label="" label_selected="" name="client_lagmeter" tool_tip="Estado del lag del cliente"/> + <text name="client"> + Cliente + </text> + <text font="SansSerifSmall" name="client_text"> + Normal + </text> + <text left="30" name="client_lag_cause" right="-10"/> + <button label="" label_selected="" name="network_lagmeter" tool_tip="Estado del lag de la red"/> + <text name="network"> + Red + </text> + <text font="SansSerifSmall" name="network_text"> + Normal + </text> + <text left="30" name="network_lag_cause" right="-10"/> + <button label="" label_selected="" name="server_lagmeter" tool_tip="Estado del lag del servidor"/> + <text name="server"> + Servidor + </text> + <text font="SansSerifSmall" name="server_text"> + Normal + </text> + <text left="30" name="server_lag_cause" right="-32"/> + <button label=">>" name="minimize" tool_tip="Cambia el tamaño de la ventana"/> </floater> diff --git a/indra/newview/skins/default/xui/es/floater_land_holdings.xml b/indra/newview/skins/default/xui/es/floater_land_holdings.xml index bcdebf4588..ed7055b3a1 100644 --- a/indra/newview/skins/default/xui/es/floater_land_holdings.xml +++ b/indra/newview/skins/default/xui/es/floater_land_holdings.xml @@ -1,14 +1,14 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="land holdings floater" title="MI TERRENO"> <scroll_list name="parcel list"> - <column label="Nombre de la parcela" name="name"/> + <column label="Parcela" name="name"/> <column label="Región" name="location"/> <column label="Tipo" name="type"/> <column label="Superficie" name="area"/> <column label="" name="hidden"/> </scroll_list> <button label="Teleportar" label_selected="Teleportar" name="Teleport" tool_tip="Teleportar al centro de este terreno."/> - <button width="130" label="Mostrar en el mapa" label_selected="Mostrar en el mapa" name="Show on Map" tool_tip="Mostrar este terreno en el mapa del mundo."/> + <button label="Mapa" label_selected="Mapa" name="Show on Map" tool_tip="Mostrar este terreno en el mapa del mundo" width="130"/> <text name="contrib_label"> Contribuciones a sus grupos: </text> @@ -17,7 +17,7 @@ <column label="Superficie" name="area"/> </scroll_list> <text name="allowed_label"> - Propiedades de terreno permitidas en el plan de pago actual: + Propiedad de terreno permitida en el plan de pago: </text> <text name="allowed_text"> [AREA] m² diff --git a/indra/newview/skins/default/xui/es/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/es/floater_live_lsleditor.xml index 02be809319..4ff54bccb5 100644 --- a/indra/newview/skins/default/xui/es/floater_live_lsleditor.xml +++ b/indra/newview/skins/default/xui/es/floater_live_lsleditor.xml @@ -1,12 +1,15 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="script ed float" title="SCRIPT: SCRIPT NUEVO"> - <button label="Reiniciar" label_selected="Reiniciar" name="Reset"/> - <check_box label="Ejecutándose" name="running" left="4"/> - <check_box label="Mono" name="mono" left="106"/> - <string name="not_allowed"> - No está autorizado para ver este script. - </string> - <string name="script_running"> + <floater.string name="not_allowed"> + No puedes ver ni editar este script. Ha sido configurado como "no copiable". Necesitas todos los permisos para ver o editar un script que está dentro de un objeto. + </floater.string> + <floater.string name="script_running"> Ejecutándose - </string> + </floater.string> + <floater.string name="Title"> + SCRIPT: [NAME] + </floater.string> + <button label="Reiniciar" label_selected="Reiniciar" name="Reset"/> + <check_box initial_value="true" label="Ejecutándose" left="4" name="running"/> + <check_box initial_value="true" label="Mono" left="106" name="mono"/> </floater> diff --git a/indra/newview/skins/default/xui/es/floater_lsl_guide.xml b/indra/newview/skins/default/xui/es/floater_lsl_guide.xml index 0cde2fe5bc..43a7ede030 100644 --- a/indra/newview/skins/default/xui/es/floater_lsl_guide.xml +++ b/indra/newview/skins/default/xui/es/floater_lsl_guide.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="script ed float" title="WIKI DE LSL"> +<floater name="script ed float" title="GUÃA DE LSL"> <check_box label="Seguir al cursor" name="lock_check"/> - <combo_box label="Bloquear" name="history_combo" left_delta="120" width="70"/> - <button label="Atrás" name="back_btn" left_delta="75"/> + <combo_box label="Bloquear" left_delta="120" name="history_combo" width="70"/> + <button label="Atrás" left_delta="75" name="back_btn"/> <button label="Adelante" name="fwd_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/es/floater_map.xml b/indra/newview/skins/default/xui/es/floater_map.xml index eee9caf830..7588380148 100644 --- a/indra/newview/skins/default/xui/es/floater_map.xml +++ b/indra/newview/skins/default/xui/es/floater_map.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Map"> +<floater name="Map" title=""> <floater.string name="mini_map_north"> N </floater.string> diff --git a/indra/newview/skins/default/xui/es/floater_media_browser.xml b/indra/newview/skins/default/xui/es/floater_media_browser.xml index cdc7ae49ff..9c4ef1eb2f 100644 --- a/indra/newview/skins/default/xui/es/floater_media_browser.xml +++ b/indra/newview/skins/default/xui/es/floater_media_browser.xml @@ -9,13 +9,13 @@ <layout_stack name="stack1"> <layout_panel name="nav_controls"> <button label="Atrás" name="back" width="75"/> - <button label="Adelante" name="forward" left_delta="75" width="70"/> - <button label="Actualizar" name="reload" left_delta="75"/> + <button label="Adelante" left_delta="75" name="forward" width="70"/> + <button label="Actualizar" left_delta="75" name="reload"/> <combo_box left_delta="75" name="address" width="510"/> - <button label="Ir" name="go" left_delta="515"/> + <button label="Ir" left_delta="515" name="go"/> </layout_panel> <layout_panel name="parcel_owner_controls"> - <button label="Enviar a la parcela la URL actual" name="assign"/> + <button label="Enviar a la parcela la página actual" name="assign"/> </layout_panel> <layout_panel name="external_controls"> <button label="Abrir en mi navegador" name="open_browser"/> diff --git a/indra/newview/skins/default/xui/es/floater_media_settings.xml b/indra/newview/skins/default/xui/es/floater_media_settings.xml new file mode 100644 index 0000000000..3f7cef5785 --- /dev/null +++ b/indra/newview/skins/default/xui/es/floater_media_settings.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="media_settings" title="CONFIGURACIÓN DE LOS MEDIA"> + <button label="OK" label_selected="OK" name="OK"/> + <button label="Cancelar" label_selected="Cancelar" name="Cancel"/> + <button label="Aplicar" label_selected="Aplicar" name="Apply"/> +</floater> diff --git a/indra/newview/skins/default/xui/es/floater_mem_leaking.xml b/indra/newview/skins/default/xui/es/floater_mem_leaking.xml index 6d5e987409..da8ba780bc 100644 --- a/indra/newview/skins/default/xui/es/floater_mem_leaking.xml +++ b/indra/newview/skins/default/xui/es/floater_mem_leaking.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="MemLeak" title="PRUEBA DE LA FUGA DE MEMORIA"> +<floater name="MemLeak" title="SIMULAR UNA PÉRDIDA DE MEMORIA"> <spinner label="Velocidad de la fuga (bites por fotograma):" name="leak_speed"/> <spinner label="Fuga de memoria máx. (MB):" name="max_leak"/> <text name="total_leaked_label"> diff --git a/indra/newview/skins/default/xui/es/floater_moveview.xml b/indra/newview/skins/default/xui/es/floater_moveview.xml index a61cebbf80..258f84c361 100644 --- a/indra/newview/skins/default/xui/es/floater_moveview.xml +++ b/indra/newview/skins/default/xui/es/floater_moveview.xml @@ -1,13 +1,75 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="move_floater"> -<panel name="panel_actions"> - <button label="" label_selected="" name="turn left btn" tool_tip="Girar a la izquierda"/> - <button label="" label_selected="" name="turn right btn" tool_tip="Girar a la derecha"/> - <button label="" label_selected="" name="move up btn" tool_tip="Saltar o ascender"/> - <button label="" label_selected="" name="move down btn" tool_tip="Agacharse o descender"/> - <joystick_slide name="slide left btn" tool_tip="Ir hacia la izquierda"/> - <joystick_slide name="slide right btn" tool_tip="Ir hacia la derecha"/> - <joystick_turn name="forward btn" tool_tip="Ir hacia adelante"/> - <joystick_turn name="backward btn" tool_tip="Ir hacia atrás"/> -</panel> + <string name="walk_forward_tooltip"> + Caminar hacia adelante (cursor arriba o W) + </string> + <string name="walk_back_tooltip"> + Caminar de espaldas (cursor abajo o S) + </string> + <string name="walk_left_tooltip"> + Caminar a la izq. (pulsa Mayúsculas + cursor izq. o A) + </string> + <string name="walk_right_tooltip"> + Caminar a la der. (pulsa Mayúsculas + cursor der. o D) + </string> + <string name="run_forward_tooltip"> + Correr hacia adelante (cursor arriba o W) + </string> + <string name="run_back_tooltip"> + Correr de espaldas (cursor abajo o S) + </string> + <string name="run_left_tooltip"> + Correr a la izq. (pulsa Mayúsculas + cursor izq. o A) + </string> + <string name="run_right_tooltip"> + Correr a la der. (pulsa Mayúsculas + cursor der. o D) + </string> + <string name="fly_forward_tooltip"> + Volar hacia adelante (cursor arriba o W) + </string> + <string name="fly_back_tooltip"> + Volar hacia atrás (cursor abajo o S) + </string> + <string name="fly_left_tooltip"> + Volar a la izq. (pulsa Mayúsculas + cursor izq. o A) + </string> + <string name="fly_right_tooltip"> + Volar a la der. (pulsa Mayúsculas + cursor der. o D) + </string> + <string name="fly_up_tooltip"> + Volar (pulsa E para subir) + </string> + <string name="fly_down_tooltip"> + Volar (pulsa C para descender) + </string> + <string name="jump_tooltip"> + Saltar (pulsa E) + </string> + <string name="crouch_tooltip"> + Agacharse (pulsa C) + </string> + <string name="walk_title"> + Caminar + </string> + <string name="run_title"> + Correr + </string> + <string name="fly_title"> + Volar + </string> + <panel name="panel_actions"> + <button label="" label_selected="" name="move up btn" tool_tip="Volar (pulsa E para subir)"/> + <button label="" label_selected="" name="turn left btn" tool_tip="Girar a la izq. (cursor izq. o A)"/> + <joystick_slide name="move left btn" tool_tip="Caminar a la izq. (pulsa Mayúsculas + cursor izq. o A)"/> + <button label="" label_selected="" name="move down btn" tool_tip="Volar (pulsa C para descender)"/> + <button label="" label_selected="" name="turn right btn" tool_tip="Girar a la der. (cursor der. o D)"/> + <joystick_slide name="move right btn" tool_tip="Caminar a la der. (pulsa Mayúsculas + cursor der. o D)"/> + <joystick_turn name="forward btn" tool_tip="Caminar hacia adelante (cursor arriba o W)"/> + <joystick_turn name="backward btn" tool_tip="Caminar de espaldas (cursor abajo o S)"/> + </panel> + <panel name="panel_modes"> + <button label="" name="mode_walk_btn" tool_tip="Modo de caminar"/> + <button label="" name="mode_run_btn" tool_tip="Modo de correr"/> + <button label="" name="mode_fly_btn" tool_tip="Modo de volar"/> + </panel> </floater> diff --git a/indra/newview/skins/default/xui/es/floater_mute_object.xml b/indra/newview/skins/default/xui/es/floater_mute_object.xml index 390333cd1d..4cd16a59ed 100644 --- a/indra/newview/skins/default/xui/es/floater_mute_object.xml +++ b/indra/newview/skins/default/xui/es/floater_mute_object.xml @@ -1,13 +1,14 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="mute by name" title="IGNORAR UN OBJETO SEGÚN SU NOMBRE"> - <text name="message" bottom_delta="-40"> - Ignorar según el nombre sólo afecta al chat y los MI del -objeto, no a sus sonidos. -Debe escribir exactamente el nombre del objeto. +<floater name="mute by name" title="IGNORAR OBJETOS SEGÚN SU NOMBRE"> + <text bottom_delta="-40" name="message"> + Ignorar un objeto: </text> - <line_editor name="object_name" bottom_delta="-58"> + <line_editor bottom_delta="-58" name="object_name"> Nombre del objeto </line_editor> + <text name="note"> + * Sólo se ignoran los textos del objeto, no sus sonidos + </text> <button label="OK" name="OK"/> <button label="Cancelar" name="Cancel"/> </floater> diff --git a/indra/newview/skins/default/xui/es/floater_nearby_chat.xml b/indra/newview/skins/default/xui/es/floater_nearby_chat.xml new file mode 100644 index 0000000000..d30a39f725 --- /dev/null +++ b/indra/newview/skins/default/xui/es/floater_nearby_chat.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="nearby_chat" title="CHAT"/> diff --git a/indra/newview/skins/default/xui/es/floater_openobject.xml b/indra/newview/skins/default/xui/es/floater_openobject.xml index 89c79e8833..b8b688df60 100644 --- a/indra/newview/skins/default/xui/es/floater_openobject.xml +++ b/indra/newview/skins/default/xui/es/floater_openobject.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="objectcontents" title="CONTENIDO DEL OBJETO"> +<floater name="objectcontents" title="CONTENIDOS DEL OBJETO"> <text name="object_name"> [DESC]: </text> diff --git a/indra/newview/skins/default/xui/es/floater_outfit_save_as.xml b/indra/newview/skins/default/xui/es/floater_outfit_save_as.xml new file mode 100644 index 0000000000..9f9902a3a0 --- /dev/null +++ b/indra/newview/skins/default/xui/es/floater_outfit_save_as.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="modal container" title="Guardar el vestuario"> + <button label="Guardar" label_selected="Guardar" name="Save"/> + <button label="Cancelar" label_selected="Cancelar" name="Cancel"/> + <text name="Save item as:"> + Guardar lo que llevo puesto +como un vestuario nuevo: + </text> + <line_editor name="name ed"> + [DESC] (nuevo) + </line_editor> +</floater> diff --git a/indra/newview/skins/default/xui/es/floater_outgoing_call.xml b/indra/newview/skins/default/xui/es/floater_outgoing_call.xml new file mode 100644 index 0000000000..5fd9dba9ac --- /dev/null +++ b/indra/newview/skins/default/xui/es/floater_outgoing_call.xml @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="outgoing call" title="LLAMANDO"> + <floater.string name="lifetime"> + 5 + </floater.string> + <floater.string name="localchat"> + Chat de voz + </floater.string> + <floater.string name="anonymous"> + anónimo + </floater.string> + <floater.string name="VoiceInviteP2P"> + está llamando. + </floater.string> + <floater.string name="VoiceInviteAdHoc"> + ha entrado en un chat de voz en multiconferencia. + </floater.string> + <text name="connecting"> + Conectando con [CALLEE_NAME] + </text> + <text name="calling"> + Llamando a [CALLEE_NAME] + </text> + <text name="noanswer"> + Sin respuesta. Vuelve a intentarlo más tarde. + </text> + <text name="nearby"> + Has sido desconectado de [VOICE_CHANNEL_NAME]. [RECONNECT_NEARBY] + </text> + <text name="nearby_P2P_by_other"> + Tu llamada ha acabado. [RECONNECT_NEARBY] + </text> + <text name="nearby_P2P_by_agent"> + Has finalizado la llamada. [RECONNECT_NEARBY] + </text> + <text name="leaving"> + Saliendo de [CURRENT_CHAT]. + </text> + <button label="Cancelar" label_selected="Cancelar" name="Cancel"/> +</floater> diff --git a/indra/newview/skins/default/xui/es/floater_pay.xml b/indra/newview/skins/default/xui/es/floater_pay.xml index 64156d94e3..d4a4e81310 100644 --- a/indra/newview/skins/default/xui/es/floater_pay.xml +++ b/indra/newview/skins/default/xui/es/floater_pay.xml @@ -1,22 +1,26 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="Give Money" title=""> + <string name="payee_group"> + Pagar al grupo + </string> + <string name="payee_resident"> + Pagar al residente + </string> + <text left="5" name="payee_label" width="105"> + Pagar: + </text> + <icon name="icon_person" tool_tip="Persona"/> + <text left="115" name="payee_name"> + [FIRST] [LAST] + </text> <button label="1 L$" label_selected="1 L$" name="fastpay 1"/> <button label="5 L$" label_selected="5 L$" name="fastpay 5"/> <button label="10 L$" label_selected="10 L$" name="fastpay 10"/> <button label="20 L$" label_selected="20 L$" name="fastpay 20"/> - <button label="Pagar" label_selected="Pagar" name="pay btn"/> - <button label="Cancelar" label_selected="Cancelar" name="cancel btn"/> - <text name="payee_label" left="5" width="105"> - Pagar al residente: - </text> - <text name="payee_name" left="115"> - [FIRST] [LAST] - </text> - <text name="fastpay text" width="100" halign="left"> - Pago rápido: - </text> - <text name="amount text" left="4" > - Cantidad: + <text left="4" name="amount text"> + O elige cuánto: </text> <line_editor left="60" name="amount" width="55"/> + <button label="Pagar" label_selected="Pagar" name="pay btn"/> + <button label="Cancelar" label_selected="Cancelar" name="cancel btn"/> </floater> diff --git a/indra/newview/skins/default/xui/es/floater_pay_object.xml b/indra/newview/skins/default/xui/es/floater_pay_object.xml index b5eca53bfa..f29745ea9b 100644 --- a/indra/newview/skins/default/xui/es/floater_pay_object.xml +++ b/indra/newview/skins/default/xui/es/floater_pay_object.xml @@ -1,30 +1,29 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="Give Money" title=""> - <text name="payee_group" left="5" width="110"> - Pagar al grupo: - </text> - <text name="payee_resident" left="5" width="110"> - Pagar al residente: - </text> - <text name="payee_name" left="120" width="180"> + <string left="5" name="payee_group" width="110"> + Pagar al grupo + </string> + <string left="5" name="payee_resident" width="110"> + Pagar al residente + </string> + <icon name="icon_person" tool_tip="Persona"/> + <text left="120" name="payee_name" width="180"> [FIRST] [LAST] </text> - <text name="object_name_label" left="5" width="110"> + <text left="5" name="object_name_label" width="110"> A través del objeto: </text> - <text name="object_name_text" left="120" width="180"> - ... - </text> - <text name="fastpay text"> - Pago rápido: - </text> - <text name="amount text"> - Cantidad: + <icon name="icon_object" tool_tip="Objetos"/> + <text left="120" name="object_name_text" width="180"> + El muy largo nombre de mi objeto </text> <button label="1 L$" label_selected="1 L$" name="fastpay 1"/> <button label="5 L$" label_selected="5 L$" name="fastpay 5"/> <button label="10 L$" label_selected="10 L$" name="fastpay 10"/> <button label="20 L$" label_selected="20 L$" name="fastpay 20"/> + <text name="amount text"> + O elige cuánto: + </text> <button label="Pagar" label_selected="Pagar" name="pay btn"/> <button label="Cancelar" label_selected="Cancelar" name="cancel btn"/> </floater> diff --git a/indra/newview/skins/default/xui/es/floater_perm_prefs.xml b/indra/newview/skins/default/xui/es/floater_perm_prefs.xml index 7d3c8e62f3..93e2088aba 100644 --- a/indra/newview/skins/default/xui/es/floater_perm_prefs.xml +++ b/indra/newview/skins/default/xui/es/floater_perm_prefs.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="perm prefs" title="PERMISOS DE SUBIDA POR DEFECTO"> +<floater name="perm prefs" title="PERMISOS POR DEFECTO DE SUBIDA"> <panel label="Permisos" name="permissions"> <button label="?" label_selected="?" name="help"/> <check_box label="Compartir con el grupo" name="share_with_group"/> diff --git a/indra/newview/skins/default/xui/es/floater_postcard.xml b/indra/newview/skins/default/xui/es/floater_postcard.xml index ace3204cc7..df94486c0e 100644 --- a/indra/newview/skins/default/xui/es/floater_postcard.xml +++ b/indra/newview/skins/default/xui/es/floater_postcard.xml @@ -1,15 +1,15 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Postcard" title="FOTO POR CORREO ELECTRÓNICO"> +<floater name="Postcard" title="FOTO POR CORREO"> <text name="to_label"> Correo electrónico del destinatario: </text> - <line_editor bottom_delta="-20" name="to_form" /> - <text name="from_label" bottom_delta="-12"> + <line_editor bottom_delta="-20" name="to_form"/> + <text bottom_delta="-12" name="from_label"> Su correo electrónico: </text> - <line_editor bottom_delta="-20" name="from_form" /> + <line_editor bottom_delta="-20" name="from_form"/> <text name="name_label"> Su nombre: </text> @@ -17,20 +17,20 @@ Asunto: </text> <line_editor label="Escriba aquà el asunto." name="subject_form"/> - <text name="msg_label" bottom_delta="-18"> + <text bottom_delta="-18" name="msg_label"> Mensaje: </text> <text_editor name="msg_form"> Escriba aquà el mensaje. </text_editor> - <text name="fine_print" bottom_delta="-21"> + <text bottom_delta="-21" name="fine_print"> Si su destinatario se registra en [SECOND_LIFE], usted conseguirá un bono de referido. </text> <button label="Cancelar" name="cancel_btn"/> <button label="Enviar" name="send_btn"/> <string name="default_subject"> - Postal desde [SECOND_LIFE] + Postal desde [SECOND_LIFE]. </string> <string name="default_message"> ¡Mira esto! diff --git a/indra/newview/skins/default/xui/es/floater_preferences.xml b/indra/newview/skins/default/xui/es/floater_preferences.xml index 5fe4ae3b64..61f12fc0d7 100644 --- a/indra/newview/skins/default/xui/es/floater_preferences.xml +++ b/indra/newview/skins/default/xui/es/floater_preferences.xml @@ -1,9 +1,15 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Preferences" title="PREFERENCIAS" min_width="350" width="646"> +<floater name="Preferences" title="PREFERENCIAS"> <button label="OK" label_selected="OK" name="OK"/> <button label="Cancelar" label_selected="Cancelar" name="Cancel"/> - <button label="Aplicar" label_selected="Aplicar" name="Apply"/> - <button label="Acerca de..." label_selected="Acerca de..." name="About..." /> - <button label="Ayuda" label_selected="Ayuda" name="Help"/> - <tab_container name="pref core" tab_width="146" width="646" /> + <tab_container name="pref core"> + <panel label="General" name="general"/> + <panel label="Gráficos" name="display"/> + <panel label="Privacidad" name="im"/> + <panel label="Sonido y Media" name="audio"/> + <panel label="Chat" name="chat"/> + <panel label="Notificaciones" name="msgs"/> + <panel label="Configurar" name="input"/> + <panel label="Avanzado" name="advanced1"/> + </tab_container> </floater> diff --git a/indra/newview/skins/default/xui/es/floater_preview_animation.xml b/indra/newview/skins/default/xui/es/floater_preview_animation.xml index 0d9cf8ec9f..6b8c8b6ff5 100644 --- a/indra/newview/skins/default/xui/es/floater_preview_animation.xml +++ b/indra/newview/skins/default/xui/es/floater_preview_animation.xml @@ -1,8 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="preview_anim"> + <floater.string name="Title"> + Animación: [NAME] + </floater.string> <text name="desc txt"> Descripción: </text> - <button left="12" width="142" label="Ejecutarla en el mundo" label_selected="Parar" name="Anim play btn" tool_tip="Ejecutar esta animación de modo que puedan verla los demás."/> - <button left="156" width="136" label="Ejecutarla para usted" label_selected="Parar" name="Anim audition btn" tool_tip="Ejecutar esta animación de modo que sólo la vea usted."/> + <button label="Ver en el mundo" label_selected="Parar" left="12" name="Anim play btn" tool_tip="Ejecutar esta animación de modo que puedan verla los demás" width="142"/> + <button label="Ejecutarla para usted" label_selected="Parar" left="156" name="Anim audition btn" tool_tip="Ejecutar esta animación de modo que sólo la vea yo" width="136"/> </floater> diff --git a/indra/newview/skins/default/xui/es/floater_preview_classified.xml b/indra/newview/skins/default/xui/es/floater_preview_classified.xml index 8114c7f3c2..d9c9c51ba8 100644 --- a/indra/newview/skins/default/xui/es/floater_preview_classified.xml +++ b/indra/newview/skins/default/xui/es/floater_preview_classified.xml @@ -1,2 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="classified_preview" title="INFORMACIÓN CLASIFICADA"/> +<floater name="classified_preview" title="INFORMACIÓN DEL CLASIFICADO"> + <floater.string name="Title"> + Clasificado: [NAME] + </floater.string> +</floater> diff --git a/indra/newview/skins/default/xui/es/floater_preview_event.xml b/indra/newview/skins/default/xui/es/floater_preview_event.xml index 04cb0de4d4..7edd4f9e3f 100644 --- a/indra/newview/skins/default/xui/es/floater_preview_event.xml +++ b/indra/newview/skins/default/xui/es/floater_preview_event.xml @@ -1,2 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="event_preview" title="INFORMACIÓN DE EVENTOS"/> +<floater name="event_preview" title="INFORMACIÓN DEL EVENTO"> + <floater.string name="Title"> + Evento: [NAME] + </floater.string> +</floater> diff --git a/indra/newview/skins/default/xui/es/floater_preview_gesture.xml b/indra/newview/skins/default/xui/es/floater_preview_gesture.xml index 0e43ce536c..44179d6b28 100644 --- a/indra/newview/skins/default/xui/es/floater_preview_gesture.xml +++ b/indra/newview/skins/default/xui/es/floater_preview_gesture.xml @@ -1,14 +1,32 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="gesture_preview"> - <string name="stop_txt"> + <floater.string name="step_anim"> + Animación a ejecutar: + </floater.string> + <floater.string name="step_sound"> + Sonido a ejecutar: + </floater.string> + <floater.string name="step_chat"> + Decir en el chat: + </floater.string> + <floater.string name="step_wait"> + Espera: + </floater.string> + <floater.string name="stop_txt"> Parar - </string> - <string name="preview_txt"> + </floater.string> + <floater.string name="preview_txt"> Vista previa - </string> - <string name="none_text"> + </floater.string> + <floater.string name="none_text"> -- Ninguno -- - </string> + </floater.string> + <floater.string name="Title"> + Gesto: [NAME] + </floater.string> + <text name="name_text"> + Nombre: + </text> <text name="desc_label"> Descripción: </text> @@ -22,37 +40,31 @@ <text name="key_label"> Atajo de teclado: </text> - <combo_box label="Ninguno" name="modifier_combo" left="116" width="76"/> - <combo_box label="Ninguno" name="key_combo" width="76" left_delta="80"/> + <combo_box label="Ninguno" left="116" name="modifier_combo" width="76"/> + <combo_box label="Ninguno" left_delta="80" name="key_combo" width="76"/> <text name="library_label"> Biblioteca: </text> + <scroll_list name="library_list"/> + <button label="Añadir >>" name="add_btn"/> <text name="steps_label"> Pasos: </text> - <scroll_list name="library_list"> - Animación -Sonido -Chat -Esperar - </scroll_list> - <button label="Añadir >>" name="add_btn"/> - <button label="Hacia arriba" name="up_btn"/> - <button label="Hacia abajo" name="down_btn"/> + <button label="Arriba" name="up_btn"/> + <button label="Abajo" name="down_btn"/> <button label="Quitar" name="delete_btn"/> - <text name="help_label"> - Todos los pasos suceden a la vez, -a menos que añada pasos de espera. - </text> - <text left="230" name="options_text" width="200" /> + <text left="230" name="options_text" width="200"/> <radio_group name="animation_trigger_type"> - <radio_item name="start" label="Empezar" /> - <radio_item name="stop" label="Parar" /> + <radio_item label="Empezar" name="start"/> + <radio_item label="Parar" name="stop"/> </radio_group> - <check_box bottom_delta="34" label="hasta que las animaciones estén hechas" name="wait_anim_check"/> + <check_box bottom_delta="34" label="hasta que las animaciones estén hechas" name="wait_anim_check"/> <check_box bottom_delta="-30" label="tiempo en segundos" name="wait_time_check"/> - <line_editor left_delta="130" name="wait_time_editor" /> - <check_box left="130" label="Disponible" name="active_check" tool_tip="Los gestos disponibles pueden realizarse escribiendo en el chat su frase clave o pulsando su tecla de acceso rápido. Generalmente, los gestos pasan a no disponibles cuando hay un conflicto de teclas."/> + <line_editor left_delta="130" name="wait_time_editor"/> + <text name="help_label"> + Todos los pasos suceden a la vez, a menos que añadas pasos de espera. + </text> + <check_box label="Disponible" left="130" name="active_check" tool_tip="Los gestos disponibles pueden realizarse escribiendo en el chat su frase clave o pulsando su tecla de acceso rápido. Generalmente, los gestos pasan a no disponibles cuando hay un conflicto de teclas."/> <button label="Vista previa" name="preview_btn" width="85"/> <button label="Guardar" name="save_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/es/floater_preview_gesture_info.xml b/indra/newview/skins/default/xui/es/floater_preview_gesture_info.xml new file mode 100644 index 0000000000..f5b771c6e7 --- /dev/null +++ b/indra/newview/skins/default/xui/es/floater_preview_gesture_info.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Gesture" title="ATAJO DE TECLADO PARA GESTOS"/> diff --git a/indra/newview/skins/default/xui/es/floater_preview_gesture_shortcut.xml b/indra/newview/skins/default/xui/es/floater_preview_gesture_shortcut.xml new file mode 100644 index 0000000000..ea955f9727 --- /dev/null +++ b/indra/newview/skins/default/xui/es/floater_preview_gesture_shortcut.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Gesture" title="ATAJO DE TECLADO PARA GESTOS"> + <text name="trigger_label"> + Chat : + </text> + <text name="key_label"> + Teclado: + </text> + <combo_box label="Ninguno/a" name="modifier_combo"/> + <combo_box label="Ninguno/a" name="key_combo"/> + <text name="replace_text" tool_tip="Reemplaza la/s palabra/s clave con estas palabras. Por ejemplo, si cambias la palabra clave 'hola' por 'qué tal', se cambiará en el chat 'QuerÃa decir hola' por 'QuerÃa decir qué tal' en cuanto realices el gesto."> + Reemplazar por: + </text> + <line_editor name="replace_editor" tool_tip="Reemplaza la/s palabra/s clave con estas palabras. Por ejemplo, si cambias la palabra clave 'hola' por 'qué tal', se cambiará en el chat 'QuerÃa decir hola' por 'QuerÃa decir qué tal' en cuanto realices el gesto."/> +</floater> diff --git a/indra/newview/skins/default/xui/es/floater_preview_gesture_steps.xml b/indra/newview/skins/default/xui/es/floater_preview_gesture_steps.xml new file mode 100644 index 0000000000..f5b771c6e7 --- /dev/null +++ b/indra/newview/skins/default/xui/es/floater_preview_gesture_steps.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Gesture" title="ATAJO DE TECLADO PARA GESTOS"/> diff --git a/indra/newview/skins/default/xui/es/floater_preview_notecard.xml b/indra/newview/skins/default/xui/es/floater_preview_notecard.xml index 35f795a7ec..d05a023279 100644 --- a/indra/newview/skins/default/xui/es/floater_preview_notecard.xml +++ b/indra/newview/skins/default/xui/es/floater_preview_notecard.xml @@ -1,16 +1,20 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="preview notecard" title="NOTA:"> - <button label="Guardar" label_selected="Guardar" name="Save"/> + <floater.string name="no_object"> + No se ha podido encontrar el objeto que contiene esta nota. + </floater.string> + <floater.string name="not_allowed"> + No tienes permiso para ver esta nota. + </floater.string> + <floater.string name="Title"> + Nota: [NAME] + </floater.string> <text name="desc txt"> Descripción: </text> <text_editor name="Notecard Editor"> Cargando... </text_editor> - <string name="no_object"> - No se ha podido encontrar el objeto que contiene esta nota. - </string> - <string name="not_allowed"> - No está autorizado a ver esta nota. - </string> + <button label="Guardar" label_selected="Guardar" name="Save"/> + <button label="Borrar" label_selected="Borrar" name="Delete"/> </floater> diff --git a/indra/newview/skins/default/xui/es/floater_preview_sound.xml b/indra/newview/skins/default/xui/es/floater_preview_sound.xml index 060a033b08..62525c9536 100644 --- a/indra/newview/skins/default/xui/es/floater_preview_sound.xml +++ b/indra/newview/skins/default/xui/es/floater_preview_sound.xml @@ -1,8 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="preview_sound"> + <floater.string name="Title"> + Sonido : [NAME] + </floater.string> <text name="desc txt"> Descripción: </text> - <button label="Tocar en el mundo" label_selected="Tocar en el mundo" name="Sound play btn" tool_tip="Tocar este sonido para que puedan oÃrlo los demás."/> - <button label="OÃr sólo uno mismo" label_selected="OÃr sólo uno mismo" name="Sound audition btn" tool_tip="Tocar este sonido para que sólo pueda oÃrlo usted."/> + <button label="Escuchar en el mundo" label_selected="Escuchar en el mundo" name="Sound play btn" tool_tip="Ejecutar este sonido de modo que lo oigan todos"/> + <button label="OÃr sólo uno mismo" label_selected="OÃr sólo uno mismo" name="Sound audition btn" tool_tip="Ejecutar este sonido de modo que sólo tú lo oigas"/> </floater> diff --git a/indra/newview/skins/default/xui/es/floater_preview_texture.xml b/indra/newview/skins/default/xui/es/floater_preview_texture.xml index 280438fefd..4012191c78 100644 --- a/indra/newview/skins/default/xui/es/floater_preview_texture.xml +++ b/indra/newview/skins/default/xui/es/floater_preview_texture.xml @@ -1,9 +1,47 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="preview_texture"> + <floater.string name="Title"> + Textura: [NAME] + </floater.string> + <floater.string name="Copy"> + Copiar al inventario + </floater.string> <text name="desc txt"> Descripción: </text> <text name="dimensions"> - Tamaño: [WIDTH] x [HEIGHT] + [WIDTH] px x [HEIGHT] px </text> + <text name="aspect_ratio"> + Previsualizar la ratio de las proporciones + </text> + <combo_box name="combo_aspect_ratio" tool_tip="Vista previa en una proporción concreta"> + <combo_item name="Unconstrained"> + Sin restricciones + </combo_item> + <combo_item name="1:1" tool_tip="Emblema del grupo o perfil del Mundo real"> + 1:1 + </combo_item> + <combo_item name="4:3" tool_tip="Perfil de [SECOND_LIFE]"> + 4:3 + </combo_item> + <combo_item name="10:7" tool_tip="Clasificados (también en las listas de búsqueda), hitos"> + 10:7 + </combo_item> + <combo_item name="3:2" tool_tip="Acerca del terreno"> + 3:2 + </combo_item> + <combo_item name="16:10"> + 16:10 + </combo_item> + <combo_item name="16:9" tool_tip="Destacados del perfil"> + 16:9 + </combo_item> + <combo_item name="2:1"> + 2:1 + </combo_item> + </combo_box> + <button label="OK" name="Keep"/> + <button label="Descartar" name="Discard"/> + <button label="Guardar como" name="save_tex_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/es/floater_publish_classified.xml b/indra/newview/skins/default/xui/es/floater_publish_classified.xml new file mode 100644 index 0000000000..5eed89d522 --- /dev/null +++ b/indra/newview/skins/default/xui/es/floater_publish_classified.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="publish_classified" title="Publicación de clasificados"> + <text name="explanation_text"> + Tu anuncio clasificado se mostrará durante una semana a partir del dÃa en que se publicó. + +Recuerda, no se reembolsarán las cantidades abonadas por clasificados. + </text> + <spinner label="Precio por el anuncio:" name="price_for_listing" tool_tip="Precio por publicarlo." value="50"/> + <text name="l$_text" value="L$"/> + <text name="more_info_text"> + Más información (enlace a ayuda de clasificados) + </text> + <button label="Publicar" name="publish_btn"/> + <button label="Cancelar" name="cancel_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/es/floater_report_abuse.xml b/indra/newview/skins/default/xui/es/floater_report_abuse.xml index a075c51247..760429e73d 100644 --- a/indra/newview/skins/default/xui/es/floater_report_abuse.xml +++ b/indra/newview/skins/default/xui/es/floater_report_abuse.xml @@ -1,12 +1,14 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="floater_report_abuse" title="DENUNCIA DE INFRACCIÓN"> - <texture_picker label="" name="screenshot"/> - <check_box label="Incluir una captura de pantalla" name="screen_check"/> + <floater.string name="Screenshot"> + Captura de pantalla + </floater.string> + <check_box label="Usar esta captura de pantalla" name="screen_check"/> <text name="reporter_title"> Denunciante: </text> <text name="reporter_field"> - Loremipsum Dolorsitamut + Loremipsum Dolorsitamut Longnamez </text> <text name="sim_title"> Región: @@ -21,11 +23,11 @@ {128.1, 128.1, 15.4} </text> <text name="select_object_label"> - Pulse el botón y luego el objeto: + Pulsa el botón y luego el objeto a denunciar: </text> <button label="" label_selected="" name="pick_btn" tool_tip="Señalar objeto - Identificar un objeto como sujeto de esta denuncia"/> <text name="object_name_label"> - Nombre: + Objeto: </text> <text name="object_name"> Consetetur Sadipscing @@ -34,54 +36,53 @@ Propietario: </text> <text name="owner_name"> - Hendrerit Vulputate + Hendrerit Vulputate Kamawashi Longname </text> <combo_box name="category_combo" tool_tip="CategorÃa -- Elija la categorÃa que describa mejor esta denuncia"> - <combo_box.item name="Select_category" label="Elegir la categorÃa"/> - <combo_box.item name="Age__Age_play" label="Edad > Jugar a ser niño"/> - <combo_box.item name="Age__Adult_resident_on_Teen_Second_Life" label="Edad > Residente adulto en Teen Second Life"/> - <combo_box.item name="Age__Underage_resident_outside_of_Teen_Second_Life" label="Edad > Residente menor de edad fuera de Teen Second Life"/> - <combo_box.item name="Assault__Combat_sandbox___unsafe_area" label="Ataque > Sandbox de combate / Zona no segura"/> - <combo_box.item name="Assault__Safe_area" label="Ataque > Zona segura"/> - <combo_box.item name="Assault__Weapons_testing_sandbox" label="Ataque > Sandbox de prueba de armas"/> - <combo_box.item name="Commerce__Failure_to_deliver_product_or_service" label="Comercio > Error en la entrega de productos o servicios"/> - <combo_box.item name="Disclosure__Real_world_information" label="Indiscreción > Información del mundo real"/> - <combo_box.item name="Disclosure__Remotely_monitoring chat" label="Indiscreción > Monitorizar a distancia el chat"/> - <combo_box.item name="Disclosure__Second_Life_information_chat_IMs" label="Indiscreción > Información Se Second Life, el chat o los MI"/> - <combo_box.item name="Disturbing_the_peace__Unfair_use_of_region_resources" label="Perturbando la paz > Abuso de los recursos de la región"/> - <combo_box.item name="Disturbing_the_peace__Excessive_scripted_objects" label="Perturbando la paz > Excesivos objetos con script"/> - <combo_box.item name="Disturbing_the_peace__Object_littering" label="Perturbando la paz > Objeto basura"/> - <combo_box.item name="Disturbing_the_peace__Repetitive_spam" label="Perturbando la paz > Spam (mensajes no pedidos) repetitivo"/> - <combo_box.item name="Disturbing_the_peace__Unwanted_advert_spam" label="Perturbando la paz > Publicidad no deseada"/> - <combo_box.item name="Fraud__L$" label="Fraude > L$"/> - <combo_box.item name="Fraud__Land" label="Fraude > Terreno"/> - <combo_box.item name="Fraud__Pyramid_scheme_or_chain_letter" label="Fraude > Esquemas piramidales o cadenas de cartas"/> - <combo_box.item name="Fraud__US$" label="Fraude > US$"/> - <combo_box.item name="Harassment__Advert_farms___visual_spam" label="Acoso > Anuncios múltiples / Spam visual"/> - <combo_box.item name="Harassment__Defaming_individuals_or_groups" label="Acoso > Difamación de individuos o grupos"/> - <combo_box.item name="Harassment__Impeding_movement" label="Acoso > Impedir el movimiento"/> - <combo_box.item name="Harassment__Sexual_harassment" label="Acoso > Acoso sexual"/> - <combo_box.item name="Harassment__Solicting_inciting_others_to_violate_ToS" label="Acoso > Incitar a, o pedir, que otros violen las Condiciones del Servicio"/> - <combo_box.item name="Harassment__Verbal_abuse" label="Acoso > Abuso verbal"/> - <combo_box.item name="Indecency__Broadly_offensive_content_or_conduct" label="Indecencia > En general, contenido o conducta ofensivos"/> - <combo_box.item name="Indecency__Inappropriate_avatar_name" label="Indecencia > Nombre inapropiado del avatar"/> - <combo_box.item name="Indecency__Mature_content_in_PG_region" label="Indecencia > Contenido o conducta inapropiada en una región 'PG'"/> - <combo_box.item name="Indecency__Inappropriate_content_in_Mature_region" label="Indecencia > Contenido o conducta inapropiada en una región 'Mature'"/> - <combo_box.item name="Intellectual_property_infringement_Content_Removal" label="Infracción de la propiedad intelectual > Eliminación de contenidos"/> - <combo_box.item name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit" label="Infracción de la propiedad intelectual > CopyBot o Exploit (programa malicioso) de permisos"/> - <combo_box.item name="Intolerance" label="Intolerancia"/> - <combo_box.item name="Land__Abuse_of_sandbox_resources" label="Terreno > Abuso de los recursos de un sandbox"/> - <combo_box.item name="Land__Encroachment__Objects_textures" label="Terreno > Invasión > Objetos/Texturas"/> - <combo_box.item name="Land__Encroachment__Particles" label="Terreno > Invasión > PartÃculas"/> - <combo_box.item name="Land__Encroachment__Trees_plants" label="Terreno > Invasión > Ãrboles/Plantas"/> - <combo_box.item name="Wagering_gambling" label="Apuestas/Juego"/> - <combo_box.item name="Other" label="Otra"/> + <combo_box.item label="Elegir la categorÃa" name="Select_category"/> + <combo_box.item label="Edad > Jugar a ser niño" name="Age__Age_play"/> + <combo_box.item label="Edad > Residente adulto en Teen Second Life" name="Age__Adult_resident_on_Teen_Second_Life"/> + <combo_box.item label="Edad > Residente menor de edad fuera de Teen Second Life" name="Age__Underage_resident_outside_of_Teen_Second_Life"/> + <combo_box.item label="Ataque > Sandbox de combate / Zona no segura" name="Assault__Combat_sandbox___unsafe_area"/> + <combo_box.item label="Ataque > Zona segura" name="Assault__Safe_area"/> + <combo_box.item label="Ataque > Sandbox de prueba de armas" name="Assault__Weapons_testing_sandbox"/> + <combo_box.item label="Comercio > Error en la entrega de productos o servicios" name="Commerce__Failure_to_deliver_product_or_service"/> + <combo_box.item label="Indiscreción > Información del mundo real" name="Disclosure__Real_world_information"/> + <combo_box.item label="Indiscreción > Monitorizar a distancia el chat" name="Disclosure__Remotely_monitoring chat"/> + <combo_box.item label="Indiscreción > Información Se Second Life, el chat o los MI" name="Disclosure__Second_Life_information_chat_IMs"/> + <combo_box.item label="Perturbando la paz > Abuso de los recursos de la región" name="Disturbing_the_peace__Unfair_use_of_region_resources"/> + <combo_box.item label="Perturbando la paz > Excesivos objetos con script" name="Disturbing_the_peace__Excessive_scripted_objects"/> + <combo_box.item label="Perturbando la paz > Objeto basura" name="Disturbing_the_peace__Object_littering"/> + <combo_box.item label="Perturbando la paz > Spam (mensajes no pedidos) repetitivo" name="Disturbing_the_peace__Repetitive_spam"/> + <combo_box.item label="Perturbando la paz > Publicidad no deseada" name="Disturbing_the_peace__Unwanted_advert_spam"/> + <combo_box.item label="Fraude > L$" name="Fraud__L$"/> + <combo_box.item label="Fraude > Terreno" name="Fraud__Land"/> + <combo_box.item label="Fraude > Esquemas piramidales o cadenas de cartas" name="Fraud__Pyramid_scheme_or_chain_letter"/> + <combo_box.item label="Fraude > US$" name="Fraud__US$"/> + <combo_box.item label="Acoso > Anuncios múltiples / Spam visual" name="Harassment__Advert_farms___visual_spam"/> + <combo_box.item label="Acoso > Difamación de individuos o grupos" name="Harassment__Defaming_individuals_or_groups"/> + <combo_box.item label="Acoso > Impedir el movimiento" name="Harassment__Impeding_movement"/> + <combo_box.item label="Acoso > Acoso sexual" name="Harassment__Sexual_harassment"/> + <combo_box.item label="Acoso > Incitar a, o pedir, que otros violen las Condiciones del Servicio" name="Harassment__Solicting_inciting_others_to_violate_ToS"/> + <combo_box.item label="Acoso > Abuso verbal" name="Harassment__Verbal_abuse"/> + <combo_box.item label="Indecencia > En general, contenido o conducta ofensivos" name="Indecency__Broadly_offensive_content_or_conduct"/> + <combo_box.item label="Indecencia > Nombre inapropiado del avatar" name="Indecency__Inappropriate_avatar_name"/> + <combo_box.item label="Indecencia > Contenido o conducta inapropiada en una región 'PG'" name="Indecency__Mature_content_in_PG_region"/> + <combo_box.item label="Indecencia > Contenido o conducta inapropiada en una región 'Mature'" name="Indecency__Inappropriate_content_in_Mature_region"/> + <combo_box.item label="Infracción de la propiedad intelectual > Eliminación de contenidos" name="Intellectual_property_infringement_Content_Removal"/> + <combo_box.item label="Infracción de la propiedad intelectual > CopyBot o Exploit (programa malicioso) de permisos" name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit"/> + <combo_box.item label="Intolerancia" name="Intolerance"/> + <combo_box.item label="Terreno > Abuso de los recursos de un sandbox" name="Land__Abuse_of_sandbox_resources"/> + <combo_box.item label="Terreno > Invasión > Objetos/Texturas" name="Land__Encroachment__Objects_textures"/> + <combo_box.item label="Terreno > Invasión > PartÃculas" name="Land__Encroachment__Particles"/> + <combo_box.item label="Terreno > Invasión > Ãrboles/Plantas" name="Land__Encroachment__Trees_plants"/> + <combo_box.item label="Apuestas/Juego" name="Wagering_gambling"/> + <combo_box.item label="Otra" name="Other"/> </combo_box> <text name="abuser_name_title"> Nombre del infractor: </text> - <button label="Elegir al residente" label_selected="" name="select_abuser" tool_tip="Elegir de una lista el nombre del infractor"/> - <check_box label="No sé el nombre del infractor" name="omit_abuser_name" tool_tip="Marque esto si no puede aportar el nombre del infractor"/> + <button label="Elegir" label_selected="" name="select_abuser" tool_tip="Elegir de una lista el nombre del infractor"/> <text name="abuser_name_title2"> Localización de la infracción: </text> @@ -92,13 +93,11 @@ Detalles: </text> <text name="bug_aviso"> - Por favor, sea muy concreto sobre la fecha, la localización, -la naturaleza de la infracción, el aportar textos relevantes -del chat o los MI, y, si es posible, seleccione el objeto. + Por favor, sé todo lo concreto que puedas </text> <text name="incomplete_title"> - Nota: las denuncias incompletas no se investigarán. + * Las denuncias incompletas no se investigarán </text> - <button label="Cancelar" label_selected="Cancelar" name="cancel_btn"/> <button label="Denunciar la infracción" label_selected="Denunciar la infracción" name="send_btn"/> + <button label="Cancelar" label_selected="Cancelar" name="cancel_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/es/floater_script_debug_panel.xml b/indra/newview/skins/default/xui/es/floater_script_debug_panel.xml new file mode 100644 index 0000000000..db9fd5f36e --- /dev/null +++ b/indra/newview/skins/default/xui/es/floater_script_debug_panel.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="script" short_title="[TODOS LOS SCRIPTS]" title="[TODOS LOS SCRIPTS]"/> diff --git a/indra/newview/skins/default/xui/es/floater_script_limits.xml b/indra/newview/skins/default/xui/es/floater_script_limits.xml new file mode 100644 index 0000000000..410f7b5e36 --- /dev/null +++ b/indra/newview/skins/default/xui/es/floater_script_limits.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="scriptlimits" title="INFORMACIÓN DEL SCRIPT"/> diff --git a/indra/newview/skins/default/xui/es/floater_script_preview.xml b/indra/newview/skins/default/xui/es/floater_script_preview.xml index 79984e7bc1..5c190a4682 100644 --- a/indra/newview/skins/default/xui/es/floater_script_preview.xml +++ b/indra/newview/skins/default/xui/es/floater_script_preview.xml @@ -1,5 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="preview lsl text" title="SCRIPT: SCRIPT DE ROTACIÓN"> +<floater name="preview lsl text" title="SCRIPT: ROTACIÓN DEL SCRIPT"> + <floater.string name="Title"> + SCRIPT: [NAME] + </floater.string> <text name="desc txt"> Descripción: </text> diff --git a/indra/newview/skins/default/xui/es/floater_script_queue.xml b/indra/newview/skins/default/xui/es/floater_script_queue.xml index ace596cd9a..39c84103c4 100644 --- a/indra/newview/skins/default/xui/es/floater_script_queue.xml +++ b/indra/newview/skins/default/xui/es/floater_script_queue.xml @@ -1,4 +1,19 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="queue" title="REINICIO"> +<floater name="queue" title="PROGRESO DEL REINICIO"> + <floater.string name="Starting"> + Empezando [START] de [COUNT] Ãtems. + </floater.string> + <floater.string name="Done"> + Hecho. + </floater.string> + <floater.string name="Resetting"> + Reiniciando + </floater.string> + <floater.string name="Running"> + Ejecutándose + </floater.string> + <floater.string name="NotRunning"> + Sin ejecutarse + </floater.string> <button label="Cerrar" label_selected="Cerrar" name="close"/> </floater> diff --git a/indra/newview/skins/default/xui/es/floater_script_search.xml b/indra/newview/skins/default/xui/es/floater_script_search.xml index a59f258a18..1ab6682023 100644 --- a/indra/newview/skins/default/xui/es/floater_script_search.xml +++ b/indra/newview/skins/default/xui/es/floater_script_search.xml @@ -1,15 +1,15 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="script search" title="BUSCAR EN EL SCRIPT" width="320"> - <check_box label="Indiferente mays./mins." name="case_text" left="75"/> +<floater name="script search" title="BÚSQUEDA DE SCRIPTS" width="320"> + <check_box label="Indiferente mays./mins." left="75" name="case_text"/> <button label="Buscar" label_selected="Buscar" name="search_btn" width="85"/> - <button label="Reemplazar" label_selected="Reemplazar" name="replace_btn" left="100" width="85"/> - <button label="Reemplazar todos" label_selected="Reemplazar todos" name="replace_all_btn" left="190" width="122"/> + <button label="Reemplazar" label_selected="Reemplazar" left="100" name="replace_btn" width="85"/> + <button label="Reemplazar todos" label_selected="Reemplazar todos" left="190" name="replace_all_btn" width="122"/> <text name="txt" width="65"> Buscar </text> <text name="txt2" width="65"> Reemplazar </text> - <line_editor left="75" name="search_text" width="240" /> - <line_editor left="75" name="replace_text" width="240" /> + <line_editor left="75" name="search_text" width="240"/> + <line_editor left="75" name="replace_text" width="240"/> </floater> diff --git a/indra/newview/skins/default/xui/es/floater_search.xml b/indra/newview/skins/default/xui/es/floater_search.xml new file mode 100644 index 0000000000..377b848530 --- /dev/null +++ b/indra/newview/skins/default/xui/es/floater_search.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_search" title="ENCONTRAR"> + <floater.string name="loading_text"> + Cargando... + </floater.string> + <floater.string name="done_text"> + Hecho + </floater.string> + <layout_stack name="stack1"> + <layout_panel name="browser_layout"> + <text name="refresh_search"> + Redo search to reflect current God level + </text> + </layout_panel> + </layout_stack> +</floater> diff --git a/indra/newview/skins/default/xui/es/floater_select_key.xml b/indra/newview/skins/default/xui/es/floater_select_key.xml index 9c889df63a..6503a3d5cb 100644 --- a/indra/newview/skins/default/xui/es/floater_select_key.xml +++ b/indra/newview/skins/default/xui/es/floater_select_key.xml @@ -2,6 +2,6 @@ <floater name="modal container" title=""> <button label="Cancelar" label_selected="Cancelar" name="Cancel"/> <text name="Save item as:"> - Pulse una tecla para seleccionarla + Pulsa una tecla para configurarla como tu botón para hablar. </text> </floater> diff --git a/indra/newview/skins/default/xui/es/floater_sell_land.xml b/indra/newview/skins/default/xui/es/floater_sell_land.xml index c6e8746250..efedb5d689 100644 --- a/indra/newview/skins/default/xui/es/floater_sell_land.xml +++ b/indra/newview/skins/default/xui/es/floater_sell_land.xml @@ -1,64 +1,65 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="sell land" title="VENDER EL TERRENO"> - <scroll_container name="profile_scroll"> - <panel name="scroll_content_panel"> - <text name="info_parcel_label"> - Parcela: - </text> - <text name="info_parcel"> - NOMBRE DE LA PARCELA - </text> - <text name="info_size_label"> - Tamaño: - </text> - <text name="info_size"> - [AREA] m² - </text> - <text name="info_action"> - Vender esta parcela: - </text> - <icon bottom_delta="-56" name="step_price" /> - <text name="price_label"> - Marque un precio: - </text> - <text name="price_text"> - Elija un precio adecuado para esta parcela. - </text> - <text name="price_ld"> - L$ - </text> - <text name="price_per_m"> - ([PER_METER] L$ por metro cuadrado) - </text> - <text name="sell_to_label"> - Vender este terreno a: - </text> - <text name="sell_to_text"> - Elija si venderlo a cualquiera o a un comprador concreto. - </text> - <combo_box name="sell_to"> - <combo_box.item name="--selectone--" label="seleccione --" /> - <combo_box.item name="Anyone" label="Cualquiera" /> - <combo_box.item name="Specificuser:" label="Un usuario concreto:" /> - </combo_box> - <button label="Seleccionar..." name="sell_to_select_agent"/> - <text name="sell_objects_label"> - ¿Vender los objetos con el terreno? - </text> - <text name="sell_objects_text"> - Los objetos transferibles del propietario del terreno cambiarán -de propietario. - </text> - <radio_group name="sell_objects" bottom_delta="-58" > - <radio_item name="no" label="No, mantener la propiedad de los objetos" /> - <radio_item name="yes" label="SÃ, vender los objetos con el terreno" /> - </radio_group> - <button label="Mostrar los objetos" name="show_objects" width="120"/> - <text name="nag_message_label"> - RECUERDE: todas las ventas son definitivas. - </text> - <button label="Poner el terreno en venta" name="sell_btn"/> - <button label="Cancelar" name="cancel_btn"/> - </panel> - </scroll_container> +<floater name="sell land" title="VENTA DE TERRENO"> + <scroll_container name="profile_scroll"> + <panel name="scroll_content_panel"> + <text name="info_parcel_label"> + Parcela: + </text> + <text name="info_parcel"> + NOMBRE DE LA PARCELA + </text> + <text name="info_size_label"> + Tamaño: + </text> + <text name="info_size"> + [AREA] m² + </text> + <text name="info_action"> + Vender esta parcela: + </text> + <text name="price_label"> + 1. Marcar un precio: + </text> + <text name="price_text"> + Elegir un precio adecuado. + </text> + <text name="price_ld"> + L$ + </text> + <line_editor name="price"> + 0 + </line_editor> + <text name="price_per_m"> + ([PER_METER] L$ por m²) + </text> + <text name="sell_to_label"> + 2. Vender el terreno a: + </text> + <text name="sell_to_text"> + Elige si venderlo a cualquiera o a un comprador concreto. + </text> + <combo_box name="sell_to"> + <combo_box.item label="- Elegir a alguien -" name="--selectone--"/> + <combo_box.item label="Cualquiera" name="Anyone"/> + <combo_box.item label="Alguien concreto:" name="Specificuser:"/> + </combo_box> + <button label="Elegir" name="sell_to_select_agent"/> + <text name="sell_objects_label"> + 3. ¿Vender los objetos junto con el terreno? + </text> + <text name="sell_objects_text"> + Los objetos transferibles del propietario del terreno que estén en la parcela cambiarán de propietario. + </text> + <radio_group bottom_delta="-58" name="sell_objects"> + <radio_item label="No, mantener la propiedad de los objetos" name="no"/> + <radio_item label="SÃ, vender los objetos con el terreno" name="yes"/> + </radio_group> + <button label="Mostrar los objetos" name="show_objects" width="120"/> + <text name="nag_message_label"> + RECUERDA: todas las ventas son definitivas. + </text> + <button label="Poner en venta el terreno" name="sell_btn"/> + <button label="Cancelar" name="cancel_btn"/> + </panel> + </scroll_container> </floater> diff --git a/indra/newview/skins/default/xui/es/floater_settings_debug.xml b/indra/newview/skins/default/xui/es/floater_settings_debug.xml index 0e8e6bdfd2..bca1839f09 100644 --- a/indra/newview/skins/default/xui/es/floater_settings_debug.xml +++ b/indra/newview/skins/default/xui/es/floater_settings_debug.xml @@ -1,10 +1,10 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="settings_debug" title="CONFIGURACIÓN DEL DEPURADOR"> - <combo_box name="boolean_combo"> - <combo_box.item name="TRUE" label="TRUE" /> - <combo_box.item name="FALSE" label="FALSE" /> - </combo_box> - <color_swatch label="Color" name="color_swatch"/> +<floater name="settings_debug" title="CONFIGURACIONES DEL DEPURADOR"> + <radio_group name="boolean_combo"> + <radio_item label="VERDADERO" name="TRUE" value="verdadero"/> + <radio_item label="FALSO" name="FALSE" value=""/> + </radio_group> + <color_swatch label="Color" name="val_color_swatch"/> <spinner label="x" name="val_spinner_1"/> <spinner label="x" name="val_spinner_2"/> <spinner label="x" name="val_spinner_3"/> diff --git a/indra/newview/skins/default/xui/es/floater_snapshot.xml b/indra/newview/skins/default/xui/es/floater_snapshot.xml index afea6c09fe..5106749f1c 100644 --- a/indra/newview/skins/default/xui/es/floater_snapshot.xml +++ b/indra/newview/skins/default/xui/es/floater_snapshot.xml @@ -1,79 +1,23 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Snapshot" title="VISTA PREVIA DE LA FOTO"> - <text name="type_label"> - Destino de la foto - </text> - <radio_group label="Tipo de la foto" name="snapshot_type_radio"> - <radio_item name="postcard" label="Enviar por correo electrónico" /> - <radio_item name="texture" label="Guardarla en su inventario ([AMOUNT] L$)" /> - <radio_item name="local" label="Guardarla en su disco duro" /> - </radio_group> - <text name="file_size_label"> - Tamaño del archivo: [SIZE] KB - </text> - <button label="Actualizar la foto" name="new_snapshot_btn"/> - <button label="Enviar" name="send_btn"/> - <button label="Guardar ([AMOUNT] L$)" name="upload_btn"/> - <flyout_button label="Guardar" name="save_btn" tool_tip="Guardar la imagen en un archivo"> - <flyout_button_item name="save_item" label="Guardar"/> - <flyout_button_item name="saveas_item" label="Guardar como..."/> - </flyout_button> - <button label="Cancelar" name="discard_btn"/> - <button label="Más >>" name="more_btn" tool_tip="Opciones avanzadas"/> - <button label="<< Menos" name="less_btn" tool_tip="Opciones avanzadas"/> - <text name="type_label2"> - Tamaño - </text> - <text name="format_label"> - Formato - </text> - <combo_box label="Resolución" name="postcard_size_combo"> - <combo_box.item name="CurrentWindow" label="Ventana actual"/> - <combo_box.item name="640x480" label="640x480"/> - <combo_box.item name="800x600" label="800x600"/> - <combo_box.item name="1024x768" label="1024x768"/> - <combo_box.item name="Custom" label="Personalizar"/> - </combo_box> - <combo_box label="Resolución" name="texture_size_combo"> - <combo_box.item name="CurrentWindow" label="Ventana actual"/> - <combo_box.item name="Small(128x128)" label="Pequeño (128x128)"/> - <combo_box.item name="Medium(256x256)" label="Medio (256x256)"/> - <combo_box.item name="Large(512x512)" label="Grande (512x512)"/> - <combo_box.item name="Custom" label="Personalizar"/> - </combo_box> - <combo_box label="Resolución" name="local_size_combo"> - <combo_box.item name="CurrentWindow" label="Ventana actual"/> - <combo_box.item name="320x240" label="320x240"/> - <combo_box.item name="640x480" label="640x480"/> - <combo_box.item name="800x600" label="800x600"/> - <combo_box.item name="1024x768" label="1024x768"/> - <combo_box.item name="1280x1024" label="1280x1024"/> - <combo_box.item name="1600x1200" label="1600x1200"/> - <combo_box.item name="Custom" label="Personalizar"/> - </combo_box> - <combo_box label="Formato" name="local_format_combo"> - <combo_box.item name="PNG" label="PNG"/> - <combo_box.item name="JPEG" label="JPEG"/> - <combo_box.item name="BMP" label="BMP"/> - </combo_box> - <spinner label="Ancho" name="snapshot_width" label_width="41" width="101"/> - <spinner label="Alto" name="snapshot_height" label_width="30" width="90" left="121"/> - <check_box label="Mantener las proporciones" name="keep_aspect_check"/> - <slider label="Calidad de la imagen" name="image_quality_slider"/> - <text name="layer_type_label"> - Captura: - </text> - <combo_box label="Capas de la imagen" name="layer_types"> - <combo_box.item name="Colors" label="Colores"/> - <combo_box.item name="Depth" label="Profundidad"/> - <combo_box.item name="ObjectMattes" label="Bandas negras"/> - </combo_box> - <check_box label="Incluir la interfaz en la foto" name="ui_check"/> - <check_box bottom_delta="-17" label="Incluir los HUD en la foto" name="hud_check"/> - <check_box bottom_delta="-17" label="Mantenerla abierta tras guardarla" name="keep_open_check"/> - <check_box bottom_delta="-17" label="Congelar la toma (vista previa en pantalla completa)" name="freeze_frame_check"/> - <check_box bottom_delta="-29" label="Actualizar automáticamente" name="auto_snapshot_check"/> - <string name="unknown"> +<floater name="Snapshot" title="Foto"> + <floater.string name="unknown"> desconocido - </string> + </floater.string> + <button label="Actualizar la foto" name="new_snapshot_btn"/> + <line_editor label="Descripción" name="description"/> + <panel name="panel_snapshot_main"> + <button label="Compartir foto" name="share"/> + <button label="Guardar foto" name="save"/> + <button label="Configurar como imagen del perfil" name="set_profile_pic"/> + </panel> + <panel name="panel_snapshot_share"> + <button label="Compartir en Internet" name="share_to_web"/> + <button label="Foto por correo" name="share_to_email"/> + <button label="Atrás" name="cancel_share"/> + </panel> + <panel name="panel_snapshot_save"> + <button label="Guardar en mi inventario" name="save_to_inventory"/> + <button label="Guardar en mi ordenador" name="save_to_computer"/> + <button label="Atrás" name="cancel_save"/> + </panel> </floater> diff --git a/indra/newview/skins/default/xui/es/floater_stats.xml b/indra/newview/skins/default/xui/es/floater_stats.xml new file mode 100644 index 0000000000..5f4fabf375 --- /dev/null +++ b/indra/newview/skins/default/xui/es/floater_stats.xml @@ -0,0 +1,71 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Statistics" title="ESTADÃSTICAS"> + <scroll_container name="statistics_scroll"> + <container_view name="statistics_view"> + <stat_view label="Básico" name="basic"> + <stat_bar label="FPS" name="fps"/> + <stat_bar label="Ancho de banda" name="bandwidth"/> + <stat_bar label="Pérdida de paquetes" name="packet_loss"/> + <stat_bar label="Ping del Sim" name="ping"/> + </stat_view> + <stat_view label="Avanzado" name="advanced"> + <stat_view label="Renderización" name="render"> + <stat_bar label="KTris generados" name="ktrisframe"/> + <stat_bar label="KTris generados" name="ktrissec"/> + <stat_bar label="Objetos en total" name="objs"/> + <stat_bar label="Objetos nuevos" name="newobjs"/> + </stat_view> + <stat_view label="Textura" name="texture"> + <stat_bar label="Número" name="numimagesstat"/> + <stat_bar label="Raw: número" name="numrawimagesstat"/> + <stat_bar label="GL Mem" name="gltexmemstat"/> + <stat_bar label="Formatted Mem" name="formattedmemstat"/> + <stat_bar label="Raw Mem" name="rawmemstat"/> + <stat_bar label="Bound Mem" name="glboundmemstat"/> + </stat_view> + <stat_view label="Red" name="network"> + <stat_bar label="Paquetes salientes" name="packetsinstat"/> + <stat_bar label="Paquetes entrantes" name="packetsoutstat"/> + <stat_bar label="Objetos" name="objectkbitstat"/> + <stat_bar label="Textura" name="texturekbitstat"/> + <stat_bar label="Asset" name="assetkbitstat"/> + <stat_bar label="Capas" name="layerskbitstat"/> + <stat_bar label="Entrando ahora" name="actualinkbitstat"/> + <stat_bar label="Saliendo ahora" name="actualoutkbitstat"/> + <stat_bar label="Operaciones VFS pendientes" name="vfspendingoperations"/> + </stat_view> + </stat_view> + <stat_view label="Simulador" name="sim"> + <stat_bar label="Tiempo de dilación" name="simtimedilation"/> + <stat_bar label="FPS en el Sim" name="simfps"/> + <stat_bar label="Physics FPS" name="simphysicsfps"/> + <stat_view label="Physics Details" name="physicsdetail"> + <stat_bar label="Pin de objetos" name="physicspinnedtasks"/> + <stat_bar label="Objetos con bajo nivel de detalle" name="physicslodtasks"/> + <stat_bar label="Memoria asignada" name="physicsmemoryallocated"/> + <stat_bar label="Agentes: actual./seg." name="simagentups"/> + <stat_bar label="Agentes del grid principal" name="simmainagents"/> + <stat_bar label="Agentes secundarios" name="simchildagents"/> + <stat_bar label="Objetos" name="simobjects"/> + <stat_bar label="Objetos activos" name="simactiveobjects"/> + <stat_bar label="Scripts activos" name="simactivescripts"/> + <stat_bar label="Eventos de scripts" name="simscripteps"/> + <stat_bar label="Paquetes salientes" name="siminpps"/> + <stat_bar label="Paquetes entrantes" name="simoutpps"/> + <stat_bar label="Descargas pendientes" name="simpendingdownloads"/> + <stat_bar label="Subidas pendientes" name="simpendinguploads"/> + <stat_bar label="Total de bytes no reconocidos" name="simtotalunackedbytes"/> + </stat_view> + <stat_view label="Tiempo (ms)" name="simperf"> + <stat_bar label="Tiempo total de los frames" name="simframemsec"/> + <stat_bar label="Tiempo de red" name="simnetmsec"/> + <stat_bar label="Physics Time" name="simsimphysicsmsec"/> + <stat_bar label="Tiempo de la simulación" name="simsimothermsec"/> + <stat_bar label="Tiempo de los agentes" name="simagentmsec"/> + <stat_bar label="Tiempo de las imágenes" name="simimagesmsec"/> + <stat_bar label="Tiempo de los scripts" name="simscriptmsec"/> + </stat_view> + </stat_view> + </container_view> + </scroll_container> +</floater> diff --git a/indra/newview/skins/default/xui/es/floater_sys_well.xml b/indra/newview/skins/default/xui/es/floater_sys_well.xml new file mode 100644 index 0000000000..8c8190be55 --- /dev/null +++ b/indra/newview/skins/default/xui/es/floater_sys_well.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="sys_well_window" title="NOTIFICACIONES"> + <string name="title_im_well_window"> + CONVERSACIONES + </string> + <string name="title_notification_well_window"> + NOTIFICACIONES + </string> +</floater> diff --git a/indra/newview/skins/default/xui/es/floater_telehub.xml b/indra/newview/skins/default/xui/es/floater_telehub.xml index b2dddfb7f7..87cc9c1659 100644 --- a/indra/newview/skins/default/xui/es/floater_telehub.xml +++ b/indra/newview/skins/default/xui/es/floater_telehub.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="telehub" title="PUNTO DE TELEPORTE" min_height="310" height="310"> +<floater height="310" min_height="310" name="telehub" title="PUNTO DE TELEPORTE"> <text name="status_text_connected"> Punto de Teleporte conectado al objeto [OBJECT] </text> @@ -9,7 +9,7 @@ <text name="help_text_connected"> Para quitar, pulse Desconectar. </text> - <text name="help_text_not_connected" height="38" bottom_delta="-18"> + <text bottom_delta="-18" height="38" name="help_text_not_connected"> Seleccione el objeto y pulse Conectar el Punto de Teleporte. </text> @@ -21,12 +21,9 @@ de Teleporte. <button label="Añadir sucursales" name="add_spawn_point_btn"/> <button label="Quitar sucursales" name="remove_spawn_point_btn"/> <text name="spawn_point_help"> - Seleccione el objeto y pulse Añadir para -especificar la posición. -Hecho eso, puede mover o borrar el objeto. -Las posiciones son relativas al centro del -Punto de Teleporte. -Seleccione un Ãtem de la lista para mostrar su -posición en el mundo. + Selecciona el objeto y pulsa "Añadir sucursal" para especificar una posición. +Luego, puedes mover o borrar el objeto. +Las posiciones son relativas al centro del Punto de Teleporte. +Elige un Ãtem de la lista para realzarlo en el mundo. </text> </floater> diff --git a/indra/newview/skins/default/xui/es/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/es/floater_texture_ctrl.xml index 09d6e7e4aa..ed2787ea60 100644 --- a/indra/newview/skins/default/xui/es/floater_texture_ctrl.xml +++ b/indra/newview/skins/default/xui/es/floater_texture_ctrl.xml @@ -1,23 +1,23 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="texture picker" title="ELEGIR: TEXTURA"> +<floater name="texture picker" title="DESTACADO: TEXTURA"> <string name="choose_picture"> Pulse para elegir una imagen </string> <text name="Multiple"> - Múltiple + Texturas múltiples </text> <text name="unknown"> - Dimensiones: [DIMENSIONS] + Tamaño: [DIMENSIONS] </text> <button label="Por defecto" label_selected="Por defecto" name="Default" width="84"/> - <button label="Ninguna" label_selected="Ninguna" name="None" left="90"/> + <button label="Ninguna" label_selected="Ninguna" left="90" name="None"/> <button label="Blanca" label_selected="Blanca" name="Blank"/> <check_box label="Ver las carpetas" name="show_folders_check"/> - <search_editor label="Escriba aquà para buscar una" name="inventory search editor"/> - <check_box label="Aplicar ahora mismo" name="apply_immediate_check"/> + <search_editor label="Filtrar las texturas" name="inventory search editor"/> + <check_box label="Aplicarlo ahora" name="apply_immediate_check"/> <button label="" label_selected="" name="Pipette"/> <button label="Cancelar" label_selected="Cancelar" name="Cancel"/> - <button label="Elegir" label_selected="Elegir" name="Select"/> + <button label="OK" label_selected="OK" name="Select"/> <string name="pick title"> Elegir: </string> diff --git a/indra/newview/skins/default/xui/es/floater_tools.xml b/indra/newview/skins/default/xui/es/floater_tools.xml index 24db352ac4..9637544f4e 100644 --- a/indra/newview/skins/default/xui/es/floater_tools.xml +++ b/indra/newview/skins/default/xui/es/floater_tools.xml @@ -1,45 +1,84 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="toolbox floater" title="" short_title="CONSTRUIR" width="288"> +<floater name="toolbox floater" short_title="HERRAMIENTAS DE CONSTRUCCIÓN" title="" width="288"> + <floater.string name="status_rotate"> + Arrastra las bandas de color para girar el objeto. + </floater.string> + <floater.string name="status_scale"> + Pulsa y arrastra para estirar el lado seleccionado. + </floater.string> + <floater.string name="status_move"> + Arrastrar para mover, Mayús.+arrastrar para copiar. + </floater.string> + <floater.string name="status_modifyland"> + Mantén pulsado para modificar el terreno. + </floater.string> + <floater.string name="status_camera"> + Pulsa y arrastra para mover la cámara. + </floater.string> + <floater.string name="status_grab"> + Arrastrar para mover: Ctrl, verticalmente; Ctrl-Mayús., girando. + </floater.string> + <floater.string name="status_place"> + Pulsa en el mundo para construir. + </floater.string> + <floater.string name="status_selectland"> + Pulsa y arrastra para seleccionar el terreno. + </floater.string> + <floater.string name="grid_screen_text"> + Pantalla + </floater.string> + <floater.string name="grid_local_text"> + Local + </floater.string> + <floater.string name="grid_world_text"> + Mundo + </floater.string> + <floater.string name="grid_reference_text"> + Referencia + </floater.string> + <floater.string name="grid_attachment_text"> + Añadido + </floater.string> <button label="" label_selected="" name="button focus" tool_tip="Visión"/> <button label="" label_selected="" name="button move" tool_tip="Mover"/> <button label="" label_selected="" name="button edit" tool_tip="Editar"/> <button label="" label_selected="" name="button create" tool_tip="Crear"/> <button label="" label_selected="" name="button land" tool_tip="Terreno"/> + <text name="text status" width="280"> + Arrastrar para mover, Mayús.+arrastrar para copiar. + </text> <radio_group name="focus_radio_group"> <radio_item label="Zoom" name="radio zoom"/> <radio_item label="Órbita (Ctrl)" name="radio orbit"/> - <radio_item label="Panorámica (Ctrl-Shift)" name="radio pan"/> + <radio_item label="Panorámica (Ctrl+Shift)" name="radio pan"/> </radio_group> <radio_group name="move_radio_group"> <radio_item label="Mover" name="radio move"/> <radio_item label="Vertical (Ctrl)" name="radio lift"/> - <radio_item label="Horizontal (Ctrl-Shift)" name="radio spin"/> + <radio_item label="Horizontal (Ctrl+Shift)" name="radio spin"/> </radio_group> <radio_group name="edit_radio_group"> - <radio_item label="Posición" name="radio position"/> + <radio_item label="Moverse" name="radio position"/> <radio_item label="Girar (Ctrl)" name="radio rotate"/> - <radio_item label="Estirar (Ctrl-Shift)" name="radio stretch"/> + <radio_item label="Estirar (Ctrl+Shift)" name="radio stretch"/> <radio_item label="Elegir la cara" name="radio select face"/> </radio_group> <check_box label="Editar las partes enlazadas" name="checkbox edit linked parts"/> - <text name="text ruler mode"> - Ajuste: + <text name="RenderingCost" tool_tip="Muestra cuánto se calcula que cuesta renderizar este objeto"> + þ: [COUNT] </text> - <combo_box name="combobox grid mode" width="82"> - <combo_box.item name="World" label="Mundo" - /> - <combo_box.item name="Local" label="Local" - /> - <combo_box.item name="Reference" label="Referencia" - /> - </combo_box> - <check_box label="Estirar ambos lados" name="checkbox uniform"/> - <check_box label="Estirar las texturas" name="checkbox stretch textures"/> - <check_box label="Usar la cuadrÃcula" name="checkbox snap to grid"/> - <button label="Opciones..." label_selected="Opciones..." name="Options..."/> - <text name="text status" width="280"> - Arrastrar para mover, Mayús.+arrastrar para copiar + <check_box label="" name="checkbox uniform"/> + <text label="Estirar ambos lados" name="checkbox uniform label"> + Estirar ambos lados </text> + <check_box initial_value="true" label="Estirar las texturas" name="checkbox stretch textures"/> + <check_box initial_value="true" label="Usar la cuadrÃcula" name="checkbox snap to grid"/> + <combo_box name="combobox grid mode" tool_tip="Elige qué cuadricula usar para posicionar el objeto" width="82"> + <combo_box.item label="Mundo" name="World"/> + <combo_box.item label="Local" name="Local"/> + <combo_box.item label="Referencia" name="Reference"/> + </combo_box> + <button label="Opciones..." label_selected="Opciones..." name="Options..." tool_tip="Ver más opciones de la cuadrÃcula"/> <button label="" label_selected="" name="ToolCube" tool_tip="Cubo"/> <button label="" label_selected="" name="ToolPrism" tool_tip="Prisma"/> <button label="" label_selected="" name="ToolPyramid" tool_tip="Pirámide"/> @@ -55,12 +94,12 @@ <button label="" label_selected="" name="ToolRing" tool_tip="Cono truncado"/> <button label="" label_selected="" name="ToolTree" tool_tip="Ãrbol"/> <button label="" label_selected="" name="ToolGrass" tool_tip="Hierba"/> - <check_box label="Mantener seleccionado" name="checkbox sticky"/> - <check_box label="Copia seleccionada" name="checkbox copy selection"/> - <check_box label="Centrada" name="checkbox copy centers"/> - <check_box label="Girada" name="checkbox copy rotates"/> + <check_box label="Mantener la herramienta elegida" name="checkbox sticky"/> + <check_box label="Copiar la selección" name="checkbox copy selection"/> + <check_box initial_value="true" label="Copia centrada" name="checkbox copy centers"/> + <check_box label="Copia girada" name="checkbox copy rotates"/> <radio_group name="land_radio_group"> - <radio_item label="Seleccionar el terreno" name="radio select land"/> + <radio_item label="Seleccionar terreno" name="radio select land"/> <radio_item label="Nivelar" name="radio flatten"/> <radio_item label="Elevar" name="radio raise"/> <radio_item label="Bajar" name="radio lower"/> @@ -68,7 +107,6 @@ <radio_item label="Escarpar" name="radio noise"/> <radio_item label="Restablecer" name="radio revert"/> </radio_group> - <button label="Aplicar" label_selected="Aplicar" name="button apply to selection" tool_tip="Modificar el terreno seleccionado" left="146"/> <text name="Bulldozer:"> Bulldozer: </text> @@ -78,14 +116,51 @@ <text name="Strength:"> Fuerza </text> - <text name="obj_count" left="134"> - Objetos seleccionados: [COUNT] + <button label="Aplicar" label_selected="Aplicar" left="146" name="button apply to selection" tool_tip="Modificar el terreno seleccionado"/> + <text left="134" name="obj_count"> + Objetos: [COUNT] </text> - <text name="prim_count" left="134"> - primitivas: [COUNT] + <text left="134" name="prim_count"> + Primitivas: [COUNT] </text> <tab_container name="Object Info Tabs" tab_max_width="62" tab_min_width="30" width="288"> <panel label="General" name="General"> + <panel.string name="text deed continued"> + Transferir + </panel.string> + <panel.string name="text deed"> + Transferir + </panel.string> + <panel.string name="text modify info 1"> + Puedes modificar este objeto + </panel.string> + <panel.string name="text modify info 2"> + Puedes modificar estos objetos + </panel.string> + <panel.string name="text modify info 3"> + No puedes modificar este objeto + </panel.string> + <panel.string name="text modify info 4"> + No puedes modificar estos objetos + </panel.string> + <panel.string name="text modify warning"> + Para configurar los permisos, debes seleccionar el objeto completo + </panel.string> + <panel.string name="Cost Default"> + Precio: L$ + </panel.string> + <panel.string name="Cost Total"> + Precio total: L$ + </panel.string> + <panel.string name="Cost Per Unit"> + Price Per: L$ + </panel.string> + <panel.string name="Cost Mixed"> + Precio variable + </panel.string> + <panel.string name="Sale Mixed"> + Venta variable + </panel.string> <text name="Name:"> Nombre: </text> @@ -98,135 +173,77 @@ <text name="Creator Name"> Thrax Linden </text> - <button label="Perfil..." label_selected="Perfil..." name="button creator profile"/> <text name="Owner:"> Propietario: </text> <text name="Owner Name"> Thrax Linden </text> - <button label="Perfil..." label_selected="Perfil..." name="button owner profile"/> <text name="Group:"> Grupo: </text> - <text name="Group Name Proxy"> - Los Linden - </text> - <button label="Configurar..." label_selected="Configurar..." name="button set group"/> - <text name="Permissions:"> - Permisos: - </text> - - <check_box label="Compartir con el grupo" name="checkbox share with group" tool_tip="Permitir que todos los miembros del grupo compartan y utilicen sus permisos sobre este objeto. Debe transferirlo para activar las restricciones según los roles."/> - <string name="text deed continued"> - Transferir... - </string> - <string name="text deed"> - Transferir - </string> - <button label="Transferir..." label_selected="Transferir..." name="button deed" tool_tip="Los objetos compartidos por el grupo pueden ser transferidos por un oficial del grupo."/> - <check_box label="Permitir a cualquiera que lo mueva" name="checkbox allow everyone move"/> - <check_box label="Permitir a cualquiera que lo copie" name="checkbox allow everyone copy"/> - <check_box label="Mostrar en la búsqueda" name="search_check" tool_tip="Dejar que la gente vea este objeto en los resultados de la búsqueda"/> - <check_box label="En venta" name="checkbox for sale"/> - <text name="Cost"> - Precio: L$ + <button label="Configurar..." label_selected="Configurar..." name="button set group" tool_tip="Elige un grupo con el que compartir los permisos de este objeto"/> + <name_box initial_value="Cargando..." name="Group Name Proxy"/> + <button label="Transferir" label_selected="Transferir" name="button deed" tool_tip="La transferencia entrega este objeto con los permisos del próximo propietario. Los objetos compartidos por el grupo pueden ser transferidos por un oficial del grupo."/> + <check_box label="Compartir" name="checkbox share with group" tool_tip="Permite que todos los miembros del grupo compartan tus permisos de modificación en este objeto. Debes transferirlo para activar las restricciones según los roles."/> + <text name="label click action" width="180"> + Al tocarlo: </text> + <combo_box name="clickaction" width="192"> + <combo_box.item label="Tocarlo (por defecto)" name="Touch/grab(default)"/> + <combo_box.item label="Sentarse en el objeto" name="Sitonobject"/> + <combo_box.item label="Comprar el objeto" name="Buyobject"/> + <combo_box.item label="Pagar al objeto" name="Payobject"/> + <combo_box.item label="Abrirlo" name="Open"/> + <combo_box.item label="Zoom" name="Zoom"/> + </combo_box> + <check_box label="En venta:" name="checkbox for sale"/> <combo_box name="sale type"> <combo_box.item label="Copia" name="Copy"/> <combo_box.item label="Contenidos" name="Contents"/> <combo_box.item label="Original" name="Original"/> </combo_box> - - <text name="label click action" width="180"> - Al pulsarlo con el botón izquierdo: - </text> - <combo_box name="clickaction" width="192"> - <combo_box.item name="Touch/grab(default)" label="Tocar/Agarrar (por defecto)" - /> - <combo_box.item name="Sitonobject" label="Sentarse en el objeto" - /> - <combo_box.item name="Buyobject" label="Comprar el objeto" - /> - <combo_box.item name="Payobject" label="Pagar al objeto" - /> - <combo_box.item name="Open" label="Abrirlo" - /> - <combo_box.item name="Play" label="Ejecutar los media de la parcela" - /> - <combo_box.item name="Opemmedia" label="Abrir los media de la parcela" - /> - </combo_box> - <panel name="perms_build"> - <text name="perm_modify"> - Puede modificar este objeto - </text> - <text name="B:"> - B: - </text> - <text name="O:"> - O: - </text> - <text name="G:"> - G: - </text> - <text name="E:"> - E: - </text> - <text name="N:"> - N: - </text> - <text name="F:"> - F: - </text> - <text name="Next owner can:"> - El próximo propietario puede: - </text> - <check_box label="Modificarlo" name="checkbox next owner can modify"/> - <check_box label="Copiarlo" name="checkbox next owner can copy" left_delta="80"/> - <check_box name="checkbox next owner can transfer" left_delta="67"/> - </panel> - <string name="text modify info 1"> - Puede modificar este objeto - </string> - <string name="text modify info 2"> - Puede modificar estos objetos - </string> - <string name="text modify info 3"> - No puede modificar este objeto - </string> - <string name="text modify info 4"> - No puede modificar estos objetos - </string> - <string name="text modify warning"> - Debe seleccionar todo el objeto para definir los permisos - </string> - <string name="Cost Default"> - Precio: L$ - </string> - <string name="Cost Total"> - Precio total: L$ - </string> - <string name="Cost Per Unit"> - Precio por: L$ - </string> - <string name="Cost Mixed"> - Precio variable - </string> - <string name="Sale Mixed"> - Venta variable - </string> + <spinner label="Precio: L$" name="Edit Cost"/> + <check_box label="Mostrar en la búsqueda" name="search_check" tool_tip="Dejar que la gente vea este objeto en los resultados de la búsqueda"/> + <panel name="perms_build"> + <text name="perm_modify"> + Puedes modificar este objeto + </text> + <text name="Anyone can:"> + Cualquiera: + </text> + <check_box label="Moverlo" name="checkbox allow everyone move"/> + <check_box label="Copiarlo" name="checkbox allow everyone copy"/> + <text name="Next owner can:"> + Próximo propietario: + </text> + <check_box label="Modificarlo" name="checkbox next owner can modify"/> + <check_box label="Copiarlo" left_delta="80" name="checkbox next owner can copy"/> + <check_box label="Transferirlo" left_delta="67" name="checkbox next owner can transfer" tool_tip="El próximo propietario puede dar o revender este objeto"/> + <text name="B:"> + B: + </text> + <text name="O:"> + O: + </text> + <text name="G:"> + G: + </text> + <text name="E:"> + E: + </text> + <text name="N:"> + N: + </text> + <text name="F:"> + F: + </text> + </panel> </panel> <panel label="Objeto" name="Object"> - <text name="select_single"> - Seleccione un sólo prim para editarlo. - </text> - <text name="edit_object"> - Modificar los parámetros del objeto: - </text> <check_box label="Bloqueado" name="checkbox locked" tool_tip="Previene que el objeto sea movido o borrado. Suele ser útil mientras se construye, para prevenir que se modifique sin querer."/> <check_box label="Material" name="Physical Checkbox Ctrl" tool_tip="Permite que el objeto pueda ser empujado y le afecte la gravedad."/> - <check_box label="Temporal" name="Temporary Checkbox Ctrl" tool_tip="Hace que el objeto se borre 1 minuto después de su creación."/> + <check_box label="Temporal" name="Temporary Checkbox Ctrl" tool_tip="Provoca que el objeto desaparezca 1 minuto después de ser creado"/> <check_box label="Inmaterial" name="Phantom Checkbox Ctrl" tool_tip="Hace que el objeto no colisiones con otros objetos o avatares."/> <text name="label position"> Posición (metros) @@ -246,48 +263,27 @@ <spinner label="X" name="Rot X"/> <spinner label="Y" name="Rot Y"/> <spinner label="Z" name="Rot Z"/> - <text name="label material"> - Material - </text> - <combo_box name="material"> - <combo_box.item name="Stone" label="Piedra" - /> - <combo_box.item name="Metal" label="Metal" - /> - <combo_box.item name="Glass" label="Vidrio" - /> - <combo_box.item name="Wood" label="Madera" - /> - <combo_box.item name="Flesh" label="Carne" - /> - <combo_box.item name="Plastic" label="Plástico" - /> - <combo_box.item name="Rubber" label="Goma" - /> - </combo_box> - <text name="label basetype"> - Tipo de objeto a construir - </text> <combo_box name="comboBaseType"> - <combo_box.item name="Box" label="Caja" - /> - <combo_box.item name="Cylinder" label="Cilindro" - /> - <combo_box.item name="Prism" label="Prisma" - /> - <combo_box.item name="Sphere" label="Esfera" - /> - <combo_box.item name="Torus" label="Toroide" - /> - <combo_box.item name="Tube" label="Tubo" - /> - <combo_box.item name="Ring" label="Cono truncado" - /> - <combo_box.item name="Sculpted" label="Sculpted" - /> + <combo_box.item label="Caja" name="Box"/> + <combo_box.item label="Cilindro" name="Cylinder"/> + <combo_box.item label="Prisma" name="Prism"/> + <combo_box.item label="Esfera" name="Sphere"/> + <combo_box.item label="Toroide" name="Torus"/> + <combo_box.item label="Tubo" name="Tube"/> + <combo_box.item label="Cono truncado" name="Ring"/> + <combo_box.item label="Sculpted" name="Sculpted"/> + </combo_box> + <combo_box name="material"> + <combo_box.item label="Piedra" name="Stone"/> + <combo_box.item label="Metal" name="Metal"/> + <combo_box.item label="Vidrio" name="Glass"/> + <combo_box.item label="Madera" name="Wood"/> + <combo_box.item label="Carne" name="Flesh"/> + <combo_box.item label="Plástico" name="Plastic"/> + <combo_box.item label="Goma" name="Rubber"/> </combo_box> <text name="text cut"> - Corte: Inicio y Fin + Corte (inicio/fin) </text> <spinner label="I" name="cut begin"/> <spinner label="F" name="cut end"/> @@ -301,17 +297,13 @@ Forma del hueco </text> <combo_box name="hole"> - <combo_box.item name="Default" label="Por defecto" - /> - <combo_box.item name="Circle" label="CÃrculo" - /> - <combo_box.item name="Square" label="Cuadrado" - /> - <combo_box.item name="Triangle" label="Triángulo" - /> + <combo_box.item label="Por defecto" name="Default"/> + <combo_box.item label="CÃrculo" name="Circle"/> + <combo_box.item label="Cuadrado" name="Square"/> + <combo_box.item label="Triángulo" name="Triangle"/> </combo_box> <text name="text twist"> - Torsión: Inicio y Fin + Torsión (inicio/fin) </text> <spinner label="I" name="Twist Begin"/> <spinner label="F" name="Twist End"/> @@ -329,13 +321,13 @@ <spinner label="X" name="Shear X"/> <spinner label="Y" name="Shear Y"/> <text name="advanced_cut"> - Corte del perfil: Inicio y Fin + Corte del perfil (inicio/fin) </text> <text name="advanced_dimple"> - Horadar: Inicio y Fin + Horadar (inicio/fin) </text> <text name="advanced_slice"> - Cortar: Inicio y Fin + Cortar (inicio/fin) </text> <spinner label="I" name="Path Limit Begin"/> <spinner label="F" name="Path Limit End"/> @@ -351,32 +343,27 @@ Giros </text> <texture_picker label="Textura para sculpted" name="sculpt texture control" tool_tip="Pulse para elegir una imagen"/> - <check_box label="Espejo" name="sculpt mirror control" tool_tip="Girar el prim sculpted siguiendo el eje X."/> - <check_box label="Dentro-Fuera" name="sculpt invert control" tool_tip="Invertir los valores de los prims sculpted, haciendo aparecer fuera lo de dentro."/> + <check_box label="Espejo" name="sculpt mirror control" tool_tip="Girar el prim sculpted siguiendo el eje X"/> + <check_box label="Dentro-Fuera" name="sculpt invert control" tool_tip="Invertir los valores de los prims sculpted, haciendo aparecer fuera lo de dentro"/> <text name="label sculpt type"> Tipo de unión </text> <combo_box name="sculpt type control"> - <combo_box.item name="None" label="(ninguna)" - /> - <combo_box.item name="Sphere" label="Esfera" - /> - <combo_box.item name="Torus" label="Toroide" - /> - <combo_box.item name="Plane" label="Plano" - /> - <combo_box.item name="Cylinder" label="Cilindro" - /> + <combo_box.item label="(ninguna)" name="None"/> + <combo_box.item label="Esfera" name="Sphere"/> + <combo_box.item label="Toroide" name="Torus"/> + <combo_box.item label="Plano" name="Plane"/> + <combo_box.item label="Cilindro" name="Cylinder"/> </combo_box> </panel> <panel label="Caracter." name="Features"> <text name="select_single"> - Seleccione un sólo prim para editarlo. + Selecciona un sólo prim para editarlo. </text> <text name="edit_object"> Editar las caracterÃsticas del objeto: </text> - <check_box label="Flexibilidad" name="Flexible1D Checkbox Ctrl" tool_tip="Permite que el objeto flexione en el eje Z. (Sólo del lado del cliente)"/> + <check_box label="Flexibilidad" name="Flexible1D Checkbox Ctrl" tool_tip="Permite que el objeto flexione en el eje Z (sólo del lado del cliente)"/> <spinner label="Blandura" name="FlexNumSections"/> <spinner label="Gravedad" name="FlexGravity"/> <spinner label="Fricción" name="FlexFriction"/> @@ -386,86 +373,69 @@ <spinner label="Fuerza en Y" name="FlexForceY"/> <spinner label="Fuerza en Z" name="FlexForceZ"/> <check_box label="Luz" name="Light Checkbox Ctrl" tool_tip="Hace que el objeto emita luz"/> - <text name="label color"> - Color - </text> - <color_swatch label="" name="colorswatch" tool_tip="Pulse para abrir el selector de color"/> + <color_swatch label="" name="colorswatch" tool_tip="Pulsa para abrir el selector de color"/> + <texture_picker label="" name="light texture control" tool_tip="Pulsa para elegir una proyección de imagen (sólo tiene efecto con renderización deferida activada)"/> <spinner label="Intensidad" name="Light Intensity"/> + <spinner label="FOV" name="Light FOV"/> <spinner label="Radio" name="Light Radius"/> + <spinner label="Visión" name="Light Focus"/> <spinner label="Atenuación" name="Light Falloff"/> + <spinner label="Ambiental" name="Light Ambiance"/> </panel> <panel label="Textura" name="Texture"> + <panel.string name="string repeats per meter"> + Repeticiones por m. + </panel.string> + <panel.string name="string repeats per face"> + Repeticiones por cara + </panel.string> <texture_picker label="Textura" name="texture control" tool_tip="Pulse para elegir una imagen"/> - <color_swatch label="Color" name="colorswatch" tool_tip="Pulse para abrir el selector de color"/> + <color_swatch label="Color" name="colorswatch" tool_tip="Pulsa para abrir el selector de color"/> <text name="color trans"> Transparencia % </text> <text name="glow label"> Resplandor </text> - <check_box label="Brillo al máximo" name="checkbox fullbright" bottom_delta="-21"/> + <check_box bottom_delta="-21" label="Brillo al máximo" name="checkbox fullbright"/> <text name="tex gen"> Detallado </text> - <combo_box name="combobox texgen" width="86"> - <combo_box.item name="Default" label="Por defecto" - /> - <combo_box.item name="Planar" label="Plano" - /> + <combo_box name="combobox texgen"> + <combo_box.item label="Por defecto" name="Default"/> + <combo_box.item label="Plano" name="Planar"/> </combo_box> <text name="label shininess"> Brillantez </text> <combo_box name="combobox shininess"> - <combo_box.item name="None" label="Ninguna" - /> - <combo_box.item name="Low" label="Baja" - /> - <combo_box.item name="Medium" label="Media" - /> - <combo_box.item name="High" label="Alta" - /> + <combo_box.item label="Ninguna" name="None"/> + <combo_box.item label="Baja" name="Low"/> + <combo_box.item label="Media" name="Medium"/> + <combo_box.item label="Alta" name="High"/> </combo_box> <text name="label bumpiness"> Relieve </text> <combo_box name="combobox bumpiness"> - <combo_box.item name="None" label="Ninguno" - /> - <combo_box.item name="Brightness" label="Brillo" - /> - <combo_box.item name="Darkness" label="Oscuro" - /> - <combo_box.item name="woodgrain" label="grano de madera" - /> - <combo_box.item name="bark" label="corteza" - /> - <combo_box.item name="bricks" label="ladrillos" - /> - <combo_box.item name="checker" label="cajero" - /> - <combo_box.item name="concrete" label="cemento" - /> - <combo_box.item name="crustytile" label="azulejerÃa" - /> - <combo_box.item name="cutstone" label="piedra cortada" - /> - <combo_box.item name="discs" label="discos" - /> - <combo_box.item name="gravel" label="grava" - /> - <combo_box.item name="petridish" label="placa de Petri" - /> - <combo_box.item name="siding" label="revestimiento" - /> - <combo_box.item name="stonetile" label="baldosa de piedra" - /> - <combo_box.item name="stucco" label="estuco" - /> - <combo_box.item name="suction" label="succión" - /> - <combo_box.item name="weave" label="tejido" - /> + <combo_box.item label="Ninguno" name="None"/> + <combo_box.item label="Brillo" name="Brightness"/> + <combo_box.item label="Oscuro" name="Darkness"/> + <combo_box.item label="grano de madera" name="woodgrain"/> + <combo_box.item label="corteza" name="bark"/> + <combo_box.item label="ladrillos" name="bricks"/> + <combo_box.item label="cajero" name="checker"/> + <combo_box.item label="cemento" name="concrete"/> + <combo_box.item label="azulejerÃa" name="crustytile"/> + <combo_box.item label="piedra cortada" name="cutstone"/> + <combo_box.item label="discos" name="discs"/> + <combo_box.item label="grava" name="gravel"/> + <combo_box.item label="placa de Petri" name="petridish"/> + <combo_box.item label="revestimiento" name="siding"/> + <combo_box.item label="baldosa de piedra" name="stonetile"/> + <combo_box.item label="estuco" name="stucco"/> + <combo_box.item label="succión" name="suction"/> + <combo_box.item label="tejido" name="weave"/> </combo_box> <text name="tex scale"> Repeticiones por cara @@ -474,31 +444,23 @@ <check_box label="Voltear" name="checkbox flip s"/> <spinner label="Vertical (V)" name="TexScaleV"/> <check_box label="Voltear" name="checkbox flip t"/> - <text name="tex rotate"> - Rotación (grados) - </text> - <string name="string repeats per meter"> - Repeticiones por m. - </string> - <string name="string repeats per face"> - Repeticiones por cara - </string> - <text name="rpt"> - Repeticiones por m. - </text> - <spinner left="118" name="TexRot" width="62" /> - <spinner left="118" name="rptctrl" width="62" /> - <button label="Aplicar" label_selected="Aplicar" name="button apply" left_delta="72"/> + <spinner label="Rotación" name="TexRot"/> + <spinner label="Repeticiones / Metro" name="rptctrl"/> + <button label="Aplicar" label_selected="Aplicar" name="button apply"/> <text name="tex offset"> Desplazar </text> <spinner label="Horizontal (U)" name="TexOffsetU"/> <spinner label="Vertical (V)" name="TexOffsetV"/> - <text name="textbox autofix" width="180"> - Centrar la textura para los media -(primero debe subirla) - </text> - <button label="Alinear" label_selected="Alinear" name="button align" left="180"/> + <panel name="Add_Media"> + <text name="media_tex"> + Media + </text> + <button name="add_media" tool_tip="Añadir un media"/> + <button name="delete_media" tool_tip="Borrar esta textura para media"/> + <button name="edit_media" tool_tip="Editar este media"/> + <button label="Centrar" label_selected="Centrar los media" name="button align" tool_tip="Centrar esta textura para media (primero debe cargarse)"/> + </panel> </panel> <panel label="Contenido " name="Contents"> <button label="Script nuevo" label_selected="Script nuevo" name="button new script"/> @@ -513,59 +475,19 @@ Precio: [PRICE] L$ por [AREA] m² </text> <text name="label_area"> - Superficie: [AREA] m² + Ãrea: [AREA] m² </text> - <button label="Acerca del terreno..." label_selected="Acerca del terreno..." name="button about land" width="140"/> - <check_box label="Mostrar los propietarios" name="checkbox show owners" tool_tip="El color de las parcelas es según su propietario: Verde = Su terreno Agua = Terreno de sus grupos Rojo = Propiedad de otros Amarillo = En venta Morado = Para subasta Gris = Público"/> - <button label="?" label_selected="?" name="button show owners help" left_delta="150"/> + <button label="Acerca del terreno" label_selected="Acerca del terreno" name="button about land"/> + <check_box label="Mostrar los propietarios" name="checkbox show owners" tool_tip="El color de las parcelas es según su propietario: Verde = Su terreno Agua = Terreno de sus grupos Rojo = Propiedad de otros Amarillo = En venta Morado = Para subasta Gris = Público"/> <text name="label_parcel_modify"> Modificar la parcela </text> - <button label="Subdividir" label_selected="Subdividir" name="button subdivide land" width="140"/> - <button label="Unir" label_selected="Unir" name="button join land" width="140"/> + <button label="Dividir" label_selected="Dividir" name="button subdivide land"/> + <button label="Inscribirse" label_selected="Inscribirse" name="button join land"/> <text name="label_parcel_trans"> Transacciones de terreno </text> - <button label="Comprar terreno" label_selected="Comprar terreno" name="button buy land" width="140"/> - <button label="Abandonar el terreno" label_selected="Abandonar el terreno" name="button abandon land" width="140"/> + <button label="Comprar terreno" label_selected="Comprar terreno" name="button buy land"/> + <button label="Abandonar el terreno" label_selected="Abandonar el terreno" name="button abandon land"/> </panel> - <floater.string name="status_rotate"> - Arrastre las bandas de color para girar el objeto - </floater.string> - <floater.string name="status_scale"> - Pulse y arrastre para estirar el lado seleccionado - </floater.string> - <floater.string name="status_move"> - Arrastrar para mover, Mayús.+arrastrar para copiar - </floater.string> - <floater.string name="status_modifyland"> - Mantenga pulsado para modificar el terreno - </floater.string> - <floater.string name="status_camera"> - Pulse y arrastre para cambiar el punto de vista - </floater.string> - <floater.string name="status_grab"> - Arrastre para mover objetos: Ctrl, verticalmente; Ctrl-Mayús., para girarlos. - </floater.string> - <floater.string name="status_place"> - Pulse en el mundo para construir - </floater.string> - <floater.string name="status_selectland"> - Pulse y arrastre para seleccionar el terreno - </floater.string> - <floater.string name="grid_screen_text"> - Pantalla - </floater.string> - <floater.string name="grid_local_text"> - Local - </floater.string> - <floater.string name="grid_world_text"> - Mundo - </floater.string> - <floater.string name="grid_reference_text"> - Referencia - </floater.string> - <floater.string name="grid_attachment_text"> - Añadido - </floater.string> </floater> diff --git a/indra/newview/skins/default/xui/es/floater_top_objects.xml b/indra/newview/skins/default/xui/es/floater_top_objects.xml index 29ae9991af..7c2522e8a9 100644 --- a/indra/newview/skins/default/xui/es/floater_top_objects.xml +++ b/indra/newview/skins/default/xui/es/floater_top_objects.xml @@ -1,58 +1,59 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="top_objects" title="CARGANDO..."> +<floater name="top_objects" title="Objetos superiores"> + <floater.string name="top_scripts_title"> + Scripts según su uso + </floater.string> + <floater.string name="top_scripts_text"> + [COUNT] scripts con un total de [TIME] ms + </floater.string> + <floater.string name="scripts_score_label"> + Tiempo + </floater.string> + <floater.string name="scripts_mono_time_label"> + Tiempo en Mono + </floater.string> + <floater.string name="top_colliders_title"> + Objetos que colisionan + </floater.string> + <floater.string name="top_colliders_text"> + [COUNT] objetos con muchas posibles colisiones + </floater.string> + <floater.string name="colliders_score_label"> + Resultado + </floater.string> + <floater.string name="none_descriptor"> + No se ha encontrado ninguno. + </floater.string> <text name="title_text"> Cargando... </text> <scroll_list name="objects_list"> - <column label="Resultado" name="score"/> - <column label="Nombre" name="name"/> - <column label="Propietario" name="owner"/> - <column label="Posición" name="location"/> - <column label="Tiempo" name="time"/> - <column label="Tiempo en Mono" name="mono_time"/> + <scroll_list.columns label="Resultado" name="score"/> + <scroll_list.columns label="Nombre" name="name"/> + <scroll_list.columns label="Propietario" name="owner"/> + <scroll_list.columns label="Posición" name="location"/> + <scroll_list.columns label="Tiempo" name="time"/> + <scroll_list.columns label="Tiempo en Mono" name="mono_time"/> + <scroll_list.columns label="URLs" name="URLs"/> </scroll_list> - <line_editor font="SansSerifSmall" left="140" name="id_editor" width="280"/> - <line_editor font="SansSerifSmall" left="140" name="object_name_editor" width="280"/> - <line_editor font="SansSerifSmall" left="140" name="owner_name_editor" width="280"/> <text name="id_text"> ID del objeto: </text> + <line_editor font="SansSerifSmall" left="140" name="id_editor" width="280"/> <button label="Mostrar la baliza" name="show_beacon_btn" width="115"/> <text name="obj_name_text"> Nombre del objeto: </text> + <line_editor font="SansSerifSmall" left="140" name="object_name_editor" width="280"/> <button label="Filtro" name="filter_object_btn" width="115"/> <text name="owner_name_text" width="130"> - Nombre del propietario: + Propietario: </text> + <line_editor font="SansSerifSmall" left="140" name="owner_name_editor" width="280"/> <button label="Filtro" name="filter_owner_btn" width="115"/> + <button label="Actualizar" name="refresh_btn" width="115"/> <button label="Devolver lo seleccionado" name="return_selected_btn" width="170"/> - <button label="Devolver todo" name="return_all_btn" left="190"/> + <button label="Devolver todo" left="190" name="return_all_btn"/> <button label="Desactivar lo seleccionado" name="disable_selected_btn" width="170"/> - <button label="Desactivar todo" name="disable_all_btn" left="190"/> - <button label="Actualizar" name="refresh_btn" width="115"/> - <string name="top_scripts_title"> - Scripts según su uso - </string> - <string name="top_scripts_text"> - [COUNT] scripts con un total de [TIME] ms - </string> - <string name="scripts_score_label"> - Tiempo - </string> - <string name="scripts_mono_time_label"> - Tiempo en Mono - </string> - <string name="top_colliders_title"> - Objetos que colisionan - </string> - <string name="top_colliders_text"> - [COUNT] objetos con muchas posibles colisiones - </string> - <string name="colliders_score_label"> - Resultado - </string> - <string name="none_descriptor"> - No se ha encontrado ninguno. - </string> + <button label="Desactivar todo" left="190" name="disable_all_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/es/floater_tos.xml b/indra/newview/skins/default/xui/es/floater_tos.xml index d46c84cb03..f4a0897d73 100644 --- a/indra/newview/skins/default/xui/es/floater_tos.xml +++ b/indra/newview/skins/default/xui/es/floater_tos.xml @@ -1,16 +1,15 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="modal container" title=" "> + <floater.string name="real_url"> + http://secondlife.com/app/tos/ + </floater.string> + <floater.string name="loading_url"> + data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Loading %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E + </floater.string> <button label="Continuar" label_selected="Continuar" name="Continue"/> <button label="Cancelar" label_selected="Cancelar" name="Cancel"/> - <check_box label="Estoy de acuerdo con las Condiciones del Servicio" name="agree_chk"/> + <check_box label="Acepto las Condiciones del servicio y la PolÃtica de privacidad" name="agree_chk"/> <text name="tos_heading"> - Por favor, lea cuidadosamente las siguientes Condiciones del Servicio. Si quiere seguir -iniciando sesión en [SECOND_LIFE], debe aceptar el acuerdo. + Por favor, lee detenidamente las siguientes Condiciones del servicio y PolÃtica de privacidad. Debes aceptar el acuerdo para poder iniciar sesión en [SECOND_LIFE]. </text> - <text_editor name="tos_text"> - TOS_TEXT - </text_editor> - <string name="real_url"> - http://secondlife.com/app/tos/ - </string> </floater> diff --git a/indra/newview/skins/default/xui/es/floater_voice_controls.xml b/indra/newview/skins/default/xui/es/floater_voice_controls.xml new file mode 100644 index 0000000000..51adeb4dff --- /dev/null +++ b/indra/newview/skins/default/xui/es/floater_voice_controls.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_voice_controls" title="Controles de Voz"> + <string name="title_nearby"> + CHAT DE VOZ + </string> + <string name="title_group"> + Multiconferencia de voz con [GROUP] + </string> + <string name="title_adhoc"> + Multiconferencia de voz + </string> + <string name="title_peer_2_peer"> + Llamada: [NAME] + </string> + <string name="no_one_near"> + Nadie cercano tiene activada la voz + </string> + <layout_stack name="my_call_stack"> + <layout_panel name="my_panel"> + <text name="user_text" value="Mi avatar:"/> + </layout_panel> + <layout_stack name="voice_effect_and_leave_call_stack"> + <layout_panel name="leave_call_btn_panel"> + <button label="Colgar" name="leave_call_btn"/> + </layout_panel> + </layout_stack> + </layout_stack> +</floater> diff --git a/indra/newview/skins/default/xui/es/floater_voice_effect.xml b/indra/newview/skins/default/xui/es/floater_voice_effect.xml new file mode 100644 index 0000000000..c1b7222aad --- /dev/null +++ b/indra/newview/skins/default/xui/es/floater_voice_effect.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater label="Lugares" name="voice_effects" title="PROBAR TRANSFORMACIÓN DE VOZ"> + <string name="no_voice_effect"> + (Sin transformación de voz) + </string> + <string name="active_voice_effect"> + (Activo) + </string> + <string name="unsubscribed_voice_effect"> + (Suscripción cancelada) + </string> + <string name="new_voice_effect"> + (¡Nuevo!) + </string> + <text name="status_text"> + Para probar un efecto de transformación de voz, pulsa el botón Grabar, graba un breve fragmento de voz y pulsa cualquiera de las transformaciones de voz de la lista para escuchar cómo suena. + +Para volver a conectarte al chat de voz, cierra esta ventana. + </text> + <button label="Grabar muestra" name="record_btn" tool_tip="Graba una muestra de tu voz."/> + <button label="Parar" name="record_stop_btn"/> + <text name="voice_morphing_link"> + [[URL] Obtener transformación de voz] + </text> + <scroll_list name="voice_effect_list" tool_tip="Graba una muestra de tu voz y pulsa en un efecto para ver cómo suena."> + <scroll_list.columns label="Transformación de voz" name="name"/> + <scroll_list.columns label="Caduca" name="expires"/> + </scroll_list> +</floater> diff --git a/indra/newview/skins/default/xui/es/floater_water.xml b/indra/newview/skins/default/xui/es/floater_water.xml index c86e49a355..2c1f6cfbfb 100644 --- a/indra/newview/skins/default/xui/es/floater_water.xml +++ b/indra/newview/skins/default/xui/es/floater_water.xml @@ -7,24 +7,24 @@ <button label="Guardar" label_selected="Guardar" name="WaterSavePreset"/> <button label="Borrar" label_selected="Borrar" name="WaterDeletePreset"/> <tab_container name="Water Tabs"> - <panel label="Configuraciones" name="Settings"> + <panel label="CONFIGURACIÓN" name="Settings"> <text name="BHText"> Color del agua </text> - <button label="?" name="WaterFogColorHelp" left="175" /> - <color_swatch label="" name="WaterFogColor" tool_tip="Pulse para abrir el selector de color"/> + <button label="?" left="175" name="WaterFogColorHelp"/> + <color_swatch label="" name="WaterFogColor" tool_tip="Pulsa para abrir el selector de color"/> <text name="WaterFogDensText"> Transparencia </text> - <button label="?" name="WaterFogDensityHelp" left="175" /> + <button label="?" left="175" name="WaterFogDensityHelp"/> <text name="WaterUnderWaterFogModText"> Modificar la claridad del agua </text> - <button label="?" name="WaterUnderWaterFogModHelp" left="175" /> + <button label="?" left="175" name="WaterUnderWaterFogModHelp"/> <text name="BDensText"> Tamaño de las ondulaciones </text> - <button label="?" name="WaterNormalScaleHelp" left="405"/> + <button label="?" left="405" name="WaterNormalScaleHelp"/> <text name="BHText2"> 1 </text> @@ -37,29 +37,29 @@ <text name="HDText"> Escala de Fresnel </text> - <button label="?" name="WaterFresnelScaleHelp" left="405"/> + <button label="?" left="405" name="WaterFresnelScaleHelp"/> <text name="FresnelOffsetText"> Coeficiente de reflexión </text> - <button label="?" name="WaterFresnelOffsetHelp" left="405"/> + <button label="?" left="405" name="WaterFresnelOffsetHelp"/> <text name="DensMultText"> Refracción de la superficie </text> - <button label="?" name="WaterScaleAboveHelp" left="640"/> + <button label="?" left="640" name="WaterScaleAboveHelp"/> <text name="WaterScaleBelowText"> Refracción bajo la superficie </text> - <button label="?" name="WaterScaleBelowHelp" left="640"/> + <button label="?" left="640" name="WaterScaleBelowHelp"/> <text name="MaxAltText"> Desenfoque </text> - <button label="?" name="WaterBlurMultiplierHelp" left="640"/> + <button label="?" left="640" name="WaterBlurMultiplierHelp"/> </panel> - <panel label="Imagen" name="Waves"> + <panel label="IMAGEN" name="Waves"> <text name="BHText"> Sentido de la onda grande </text> - <button label="?" name="WaterWave1Help" left="170"/> + <button label="?" left="170" name="WaterWave1Help"/> <text name="WaterWave1DirXText"> X </text> @@ -69,7 +69,7 @@ <text name="BHText2"> Sentido de la onda pequeña </text> - <button label="?" name="WaterWave2Help" left="170"/> + <button label="?" left="170" name="WaterWave2Help"/> <text name="WaterWave2DirXText"> X </text> diff --git a/indra/newview/skins/default/xui/es/floater_wearable_save_as.xml b/indra/newview/skins/default/xui/es/floater_wearable_save_as.xml index 1dfff90004..bf96ed53ce 100644 --- a/indra/newview/skins/default/xui/es/floater_wearable_save_as.xml +++ b/indra/newview/skins/default/xui/es/floater_wearable_save_as.xml @@ -3,7 +3,7 @@ <button label="Guardar" label_selected="Guardar" name="Save"/> <button label="Cancelar" label_selected="Cancelar" name="Cancel"/> <text name="Save item as:"> - Guardar el Ãtem como: + Guardar el Ãtem en mi inventario como: </text> <line_editor name="name ed"> Nuevo [DESC] diff --git a/indra/newview/skins/default/xui/es/floater_whitelist_entry.xml b/indra/newview/skins/default/xui/es/floater_whitelist_entry.xml new file mode 100644 index 0000000000..7dc47ca367 --- /dev/null +++ b/indra/newview/skins/default/xui/es/floater_whitelist_entry.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="whitelist_entry" title="ENTRADA DE LA LISTA BLANCA"> + <text name="media_label"> + Escribe una URL o un rango de URL para añadirla a lista de dominios autorizados + </text> + <line_editor name="whitelist_entry" tool_tip="Añade una URL o un rango de URL a la Lista Blanca"/> + <button label="OK" name="ok_btn"/> + <button label="Cancelar" name="cancel_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/es/floater_windlight_options.xml b/indra/newview/skins/default/xui/es/floater_windlight_options.xml index 0697f05553..585a42e429 100644 --- a/indra/newview/skins/default/xui/es/floater_windlight_options.xml +++ b/indra/newview/skins/default/xui/es/floater_windlight_options.xml @@ -6,9 +6,9 @@ <button label="Nuevo" label_selected="Nuevo" name="WLNewPreset"/> <button label="Guardar" label_selected="Guardar" name="WLSavePreset"/> <button label="Borrar" label_selected="Borrar" name="WLDeletePreset"/> - <button font="SansSerifSmall" width="150" left_delta="90" label="Editor del ciclo de un dÃa" label_selected="Editor del ciclo de un dÃa" name="WLDayCycleMenuButton"/> + <button font="SansSerifSmall" label="Editor del ciclo de un dÃa" label_selected="Editor del ciclo de un dÃa" left_delta="90" name="WLDayCycleMenuButton" width="150"/> <tab_container name="WindLight Tabs"> - <panel label="Atmósfera" name="Atmosphere"> + <panel label="ATMÓSFERA" name="Atmosphere"> <text name="BHText"> Coloración </text> @@ -62,7 +62,7 @@ </text> <button label="?" name="WLMaxAltitudeHelp"/> </panel> - <panel label="Iluminación" name="Lighting"> + <panel label="LUZ" name="Lighting"> <text name="SLCText"> Color del Sol y de la Luna </text> @@ -118,11 +118,11 @@ </text> <button label="?" name="WLStarBrightnessHelp"/> </panel> - <panel label="Nubes" name="Clouds"> + <panel label="NUBES" name="Clouds"> <text name="WLCloudColorText"> Color de las nubes </text> - <button label="?" name="WLCloudColorHelp" left="190" /> + <button label="?" left="190" name="WLCloudColorHelp"/> <text name="BHText"> R </text> @@ -138,7 +138,7 @@ <text name="WLCloudColorText2"> Posición/Densidad de las nubes </text> - <button label="?" name="WLCloudDensityHelp" left="190"/> + <button label="?" left="190" name="WLCloudDensityHelp"/> <text name="BHText5"> X </text> @@ -156,12 +156,11 @@ Altitud de las nubes </text> <button label="?" name="WLCloudScaleHelp"/> - <text name="WLCloudDetailText" font="SansSerifSmall"> - Detalle de las nubes -(Posición/Densidad) + <text font="SansSerifSmall" name="WLCloudDetailText"> + Detalle de las nubes (Posición/Densidad) </text> <button label="?" name="WLCloudDetailHelp"/> - <text name="BHText8" bottom="-113"> + <text bottom="-113" name="BHText8"> X </text> <text name="BHText9"> @@ -182,7 +181,7 @@ <button label="?" name="WLCloudScrollYHelp"/> <check_box label="Bloquear" name="WLCloudLockY"/> <check_box label="Incluir nubes clásicas" name="DrawClassicClouds"/> - <button label="?" name="WLClassicCloudsHelp" left="618"/> + <button label="?" left="618" name="WLClassicCloudsHelp"/> </panel> </tab_container> <string name="WLDefaultSkyNames"> diff --git a/indra/newview/skins/default/xui/es/floater_window_size.xml b/indra/newview/skins/default/xui/es/floater_window_size.xml new file mode 100644 index 0000000000..f57ce08eac --- /dev/null +++ b/indra/newview/skins/default/xui/es/floater_window_size.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="window_size" title="TAMAÑO DE LA VENTANA"> + <string name="resolution_format"> + [RES_X] x [RES_Y] + </string> + <text name="windowsize_text"> + Definir el tamaño de la ventana: + </text> + <combo_box name="window_size_combo" tool_tip="ancho x alto"> + <combo_box.item label="1000 x 700 (por defecto)" name="item0"/> + <combo_box.item label="1024 x 768" name="item1"/> + <combo_box.item label="1280 x 720 (720 p)" name="item2"/> + <combo_box.item label="1920 x 1080 (1080 p)" name="item3"/> + </combo_box> + <button label="Configurar" name="set_btn"/> + <button label="Cancelar" name="cancel_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/es/floater_world_map.xml b/indra/newview/skins/default/xui/es/floater_world_map.xml index 4d7337bef7..deda5b86c8 100644 --- a/indra/newview/skins/default/xui/es/floater_world_map.xml +++ b/indra/newview/skins/default/xui/es/floater_world_map.xml @@ -1,57 +1,70 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="worldmap" title="MAPA DEL MUNDO"> - <tab_container name="maptab"> - <panel label="Objetos" name="objects_mapview"/> - <panel label="Terreno" name="terrain_mapview"/> - </tab_container> - <text name="you_label"> - Usted - </text> - <text name="home_label"> - Base - </text> - <text name="auction_label"> - Subasta - </text> - <text name="land_for_sale_label"> - Terreno en venta - </text> - <button label="Ir a la Base" label_selected="Ir a la Base" name="Go Home" tool_tip="Teleportar a su Base"/> - <check_box label="Residente" name="people_chk"/> - <check_box label="Punto de Info" name="infohub_chk"/> - <check_box label="Punto de Teleporte" name="telehubchk"/> - <check_box label="Terreno en venta" name="land_for_sale_chk"/> - <text name="events_label"> - Eventos: - </text> - <check_box label="'PG'" name="event_chk"/> - <check_box label="'Mature'" name="event_mature_chk"/> - <check_box label="'Adult'" name="event_adult_chk"/> - <combo_box label="Amigos conectados" name="friend combo" tool_tip="Amigo a mostrar en el mapa"> - <combo_box.item name="item1" label="Amigos conectados" /> - </combo_box> - <combo_box label="Hitos" name="landmark combo" tool_tip="Hito a mostrar en el mapa"> - <combo_box.item name="item1" label="Hitos" /> - </combo_box> - <line_editor label="Buscar por el nombre de la región" name="location" tool_tip="Escriba el nombre de una región"/> - <button label="Buscar" name="DoSearch" tool_tip="Buscar una región"/> - <text name="search_label"> - Resultados de la búsqueda: - </text> - <scroll_list name="search_results"> - <column label="" name="icon"/> - <column label="" name="sim_name"/> - </scroll_list> - <text name="location_label"> - Localización: - </text> - <spinner name="spin x" tool_tip="Coordenada X de la posición a mostrar en el mapa"/> - <spinner name="spin y" tool_tip="Coordenada Y de la posición a mostrar en el mapa"/> - <spinner name="spin z" tool_tip="Coordenada Z de la posición a mostrar en el mapa"/> - <button label="Teleportar" label_selected="Teleportar" name="Teleport" tool_tip="Teleportarse a la localización elegida"/> - <button label="Mostrar el destino" label_selected="Mostrar el destino" name="Show Destination" tool_tip="Centrar el mapa en la localización elegida"/> - <button label="Limpiar" label_selected="Limpiar" name="Clear" tool_tip="Parar la búsqueda"/> - <button label="Mostrar mi posición" label_selected="Mostrar mi posición" name="Show My Location" tool_tip="Centrar el mapa en la posición de su avatar"/> - <button label="Copiar la SLurl al portapapeles" name="copy_slurl" tool_tip="Copiar la posición actual como una SLurl, para usarla en la web."/> - <slider label="Zoom" name="zoom slider"/> + <panel name="layout_panel_1"> + <text name="events_label"> + Leyenda + </text> + </panel> + <panel name="layout_panel_2"> + <button name="Show My Location" tool_tip="Centrar el mapa en la posición de mi avatar"/> + <text name="me_label"> + Yo + </text> + <text name="person_label"> + Persona + </text> + <text name="infohub_label"> + Punto de Info + </text> + <text name="land_sale_label"> + Venta de terreno + </text> + <text name="by_owner_label"> + por el dueño + </text> + <text name="auction_label"> + subasta + </text> + <button name="Go Home" tool_tip="Teleportar a mi Base"/> + <text name="Home_label"> + Base + </text> + <text name="events_label"> + Eventos: + </text> + <text name="pg_label"> + General + </text> + <check_box name="event_mature_chk"/> + <text name="mature_label"> + Moderado + </text> + <text name="adult_label"> + Adulto + </text> + </panel> + <panel name="layout_panel_3"> + <text name="find_on_map_label"> + Encontrar en el mapa + </text> + </panel> + <panel name="layout_panel_4"> + <combo_box label="Amigos online" name="friend combo" tool_tip="Ver a los amigos en el mapa"> + <combo_box.item label="Mis amigos conectados" name="item1"/> + </combo_box> + <combo_box label="Mis hitos" name="landmark combo" tool_tip="Hito a ver en el mapa"> + <combo_box.item label="Mis hitos" name="item1"/> + </combo_box> + <search_editor label="Regiones alfabéticamente" name="location" tool_tip="Escribe el nombre de una región"/> + <button label="Encontrar" name="DoSearch" tool_tip="Buscar una región"/> + <button name="Clear" tool_tip="Limpia las marcas y actualiza el mapa"/> + <button label="Teleportar" name="Teleport" tool_tip="Teleportar a la localización seleccionada"/> + <button label="Copiar la SLurl" name="copy_slurl" tool_tip="Copiar la SLurl de esta posición para usarla en una web."/> + <button label="Ver lo elegido" name="Show Destination" tool_tip="Centrar el mapa en la localización seleccionada"/> + </panel> + <panel name="layout_panel_5"> + <text name="zoom_label"> + Zoom + </text> + </panel> </floater> diff --git a/indra/newview/skins/default/xui/es/inspect_avatar.xml b/indra/newview/skins/default/xui/es/inspect_avatar.xml new file mode 100644 index 0000000000..bff10d9292 --- /dev/null +++ b/indra/newview/skins/default/xui/es/inspect_avatar.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- + Not can_close / no title to avoid window chrome + Single instance - only have one at a time, recycle it each spawn +--> +<floater name="inspect_avatar"> + <string name="Subtitle"> + [AGE] + </string> + <string name="Details"> + [SL_PROFILE] + </string> + <slider name="volume_slider" tool_tip="Volumen de la voz" value="0.5"/> + <button label="Añadir como amigo" name="add_friend_btn"/> + <button label="MI" name="im_btn"/> + <button label="Perfil" name="view_profile_btn"/> + <panel name="moderator_panel"> + <button label="Desactivar la voz" name="disable_voice"/> + <button label="Activar la voz" name="enable_voice"/> + </panel> +</floater> diff --git a/indra/newview/skins/default/xui/es/inspect_group.xml b/indra/newview/skins/default/xui/es/inspect_group.xml new file mode 100644 index 0000000000..ba10b19f41 --- /dev/null +++ b/indra/newview/skins/default/xui/es/inspect_group.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- + Not can_close / no title to avoid window chrome + Single instance - only have one at a time, recycle it each spawn +--> +<floater name="inspect_group"> + <string name="PrivateGroup"> + Grupo privado + </string> + <string name="FreeToJoin"> + Inscripción gratuita + </string> + <string name="CostToJoin"> + Inscribirse cuesta [AMOUNT] L$ + </string> + <string name="YouAreMember"> + Eres miembro + </string> + <button label="Inscribirse" name="join_btn"/> + <button label="Abandonar" name="leave_btn"/> + <button label="Ver el perfil" name="view_profile_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/es/inspect_object.xml b/indra/newview/skins/default/xui/es/inspect_object.xml new file mode 100644 index 0000000000..d608b4a0f7 --- /dev/null +++ b/indra/newview/skins/default/xui/es/inspect_object.xml @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- + Not can_close / no title to avoid window chrome + Single instance - only have one at a time, recycle it each spawn +--> +<floater name="inspect_object"> + <string name="Creator"> + Por [CREATOR] + </string> + <string name="CreatorAndOwner"> + Por [CREATOR] +Propietario [OWNER] + </string> + <string name="Price"> + [AMOUNT] L$ + </string> + <string name="PriceFree"> + ¡Gratis! + </string> + <string name="Touch"> + Tocar + </string> + <string name="Sit"> + Sentarme + </string> + <text name="object_name" value="Test Object Name That Is actually two lines and Really Long"/> + <text name="price_text"> + 30.000 L$ + </text> + <text name="object_description"> + This is a really long description for an object being as how it is at least 80 characters in length and so but maybe more like 120 at this point. Who knows, really? + </text> + <button label="Comprar" name="buy_btn"/> + <button label="Pagar" name="pay_btn"/> + <button label="Coger una copia" name="take_free_copy_btn"/> + <button label="Tocar" name="touch_btn"/> + <button label="Sentarme" name="sit_btn"/> + <button label="Abrir" name="open_btn"/> + <icon name="secure_browsing" tool_tip="Navegación segura"/> + <button label="Más" name="more_info_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/es/inspect_remote_object.xml b/indra/newview/skins/default/xui/es/inspect_remote_object.xml new file mode 100644 index 0000000000..f814e84a6f --- /dev/null +++ b/indra/newview/skins/default/xui/es/inspect_remote_object.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- + Not can_close / no title to avoid window chrome + Single instance - only have one at a time, recycle it each spawn +--> +<floater name="inspect_remote_object"> + <text name="object_owner_label"> + Propietario: + </text> + <button label="Mapa" name="map_btn"/> + <button label="Ignorar" name="block_btn"/> + <button label="Cerrar" name="close_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/es/language_settings.xml b/indra/newview/skins/default/xui/es/language_settings.xml index 71418d446a..1ade4ba300 100644 --- a/indra/newview/skins/default/xui/es/language_settings.xml +++ b/indra/newview/skins/default/xui/es/language_settings.xml @@ -3,9 +3,9 @@ <strings> <!-- Locale Information --> - <string name="MicrosoftLocale">english</string> - <string name="DarwinLocale">C</string> - <string name="LinuxLocale">C</string> + <string name="MicrosoftLocale">spanish</string> + <string name="DarwinLocale">es_ES.UTF-8</string> + <string name="LinuxLocale">es_ES.UTF-8</string> <!-- datetimeToCodes["wkday"] = "%a"; // Thu diff --git a/indra/newview/skins/default/xui/es/menu_attachment_other.xml b/indra/newview/skins/default/xui/es/menu_attachment_other.xml new file mode 100644 index 0000000000..00bdb74881 --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_attachment_other.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- *NOTE: See also menu_avatar_other.xml --> +<context_menu name="Avatar Pie"> + <menu_item_call label="Ver el perfil" name="Profile..."/> + <menu_item_call label="Añadir como amigo" name="Add Friend"/> + <menu_item_call label="MI" name="Send IM..."/> + <menu_item_call label="Llamada" name="Call"/> + <menu_item_call label="Invitar al grupo" name="Invite..."/> + <menu_item_call label="Ignorar" name="Avatar Mute"/> + <menu_item_call label="Denunciar" name="abuse"/> + <menu_item_call label="Congelar" name="Freeze..."/> + <menu_item_call label="Expulsar" name="Eject..."/> + <menu_item_call label="Depurar las texturas" name="Debug..."/> + <menu_item_call label="Acercar el zoom" name="Zoom In"/> + <menu_item_call label="Pagar" name="Pay..."/> + <menu_item_call label="Perfil del objeto" name="Object Inspect"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/es/menu_attachment_self.xml b/indra/newview/skins/default/xui/es/menu_attachment_self.xml new file mode 100644 index 0000000000..afac8d7fe9 --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_attachment_self.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Attachment Pie"> + <menu_item_call label="Tocar" name="Attachment Object Touch"/> + <menu_item_call label="Editar" name="Edit..."/> + <menu_item_call label="Quitar" name="Detach"/> + <menu_item_call label="Soltar" name="Drop"/> + <menu_item_call label="Levantarme" name="Stand Up"/> + <menu_item_call label="Cambiar vestuario" name="Change Outfit"/> + <menu_item_call label="Mis amigos" name="Friends..."/> + <menu_item_call label="Mis grupos" name="Groups..."/> + <menu_item_call label="Mi perfil" name="Profile..."/> + <menu_item_call label="Depurar las texturas" name="Debug..."/> +</context_menu> diff --git a/indra/newview/skins/default/xui/es/menu_avatar_icon.xml b/indra/newview/skins/default/xui/es/menu_avatar_icon.xml new file mode 100644 index 0000000000..fe7331a108 --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_avatar_icon.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Avatar Icon Menu"> + <menu_item_call label="Ver el perfil" name="Show Profile"/> + <menu_item_call label="Enviar un MI..." name="Send IM"/> + <menu_item_call label="Añadir como amigo..." name="Add Friend"/> + <menu_item_call label="Quitar de los amigos..." name="Remove Friend"/> +</menu> diff --git a/indra/newview/skins/default/xui/es/menu_avatar_other.xml b/indra/newview/skins/default/xui/es/menu_avatar_other.xml new file mode 100644 index 0000000000..7df2d7c4e0 --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_avatar_other.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- *NOTE: See also menu_attachment_other.xml --> +<context_menu name="Avatar Pie"> + <menu_item_call label="Ver el perfil" name="Profile..."/> + <menu_item_call label="Añadir como amigo" name="Add Friend"/> + <menu_item_call label="MI" name="Send IM..."/> + <menu_item_call label="Llamada" name="Call"/> + <menu_item_call label="Invitar al grupo" name="Invite..."/> + <menu_item_call label="Ignorar" name="Avatar Mute"/> + <menu_item_call label="Denunciar" name="abuse"/> + <menu_item_call label="Congelar" name="Freeze..."/> + <menu_item_call label="Expulsar" name="Eject..."/> + <menu_item_call label="Depurar las texturas" name="Debug..."/> + <menu_item_call label="Acercar el zoom" name="Zoom In"/> + <menu_item_call label="Pagar" name="Pay..."/> +</context_menu> diff --git a/indra/newview/skins/default/xui/es/menu_avatar_self.xml b/indra/newview/skins/default/xui/es/menu_avatar_self.xml new file mode 100644 index 0000000000..d347a7d0c4 --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_avatar_self.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Self Pie"> + <menu_item_call label="Levantarme" name="Stand Up"/> + <context_menu label="Quitarme â–¶" name="Take Off >"> + <context_menu label="Ropas â–¶" name="Clothes >"> + <menu_item_call label="Camisa" name="Shirt"/> + <menu_item_call label="Pantalón" name="Pants"/> + <menu_item_call label="Falda" name="Skirt"/> + <menu_item_call label="Zapatos" name="Shoes"/> + <menu_item_call label="Calcetines" name="Socks"/> + <menu_item_call label="Chaqueta" name="Jacket"/> + <menu_item_call label="Guantes" name="Gloves"/> + <menu_item_call label="Camiseta" name="Self Undershirt"/> + <menu_item_call label="Ropa interior" name="Self Underpants"/> + <menu_item_call label="Tatuaje" name="Self Tattoo"/> + <menu_item_call label="Alfa" name="Self Alpha"/> + <menu_item_call label="Toda la ropa" name="All Clothes"/> + </context_menu> + <context_menu label="HUD â–¶" name="Object Detach HUD"/> + <context_menu label="Desanexar â–¶" name="Object Detach"/> + <menu_item_call label="Quitarse todo" name="Detach All"/> + </context_menu> + <menu_item_call label="Cambiar vestuario" name="Chenge Outfit"/> + <menu_item_call label="Editar mi vestuario" name="Edit Outfit"/> + <menu_item_call label="Editar mi anatomÃa" name="Edit My Shape"/> + <menu_item_call label="Mis amigos" name="Friends..."/> + <menu_item_call label="Mis grupos" name="Groups..."/> + <menu_item_call label="Mi perfil" name="Profile..."/> + <menu_item_call label="Depurar las texturas" name="Debug..."/> +</context_menu> diff --git a/indra/newview/skins/default/xui/es/menu_bottomtray.xml b/indra/newview/skins/default/xui/es/menu_bottomtray.xml new file mode 100644 index 0000000000..62683f3076 --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_bottomtray.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="hide_camera_move_controls_menu"> + <menu_item_check label="Botón Gestos" name="ShowGestureButton"/> + <menu_item_check label="Botón Moverse" name="ShowMoveButton"/> + <menu_item_check label="Botón Vista" name="ShowCameraButton"/> + <menu_item_check label="Botón Foto" name="ShowSnapshotButton"/> + <menu_item_check label="Botón Barra lateral" name="ShowSidebarButton"/> + <menu_item_check label="Botón Construir" name="ShowBuildButton"/> + <menu_item_check label="Botón Buscar" name="ShowSearchButton"/> + <menu_item_check label="Botón Mapa" name="ShowWorldMapButton"/> + <menu_item_check label="Botón Minimapa" name="ShowMiniMapButton"/> + <menu_item_call label="Cortar" name="NearbyChatBar_Cut"/> + <menu_item_call label="Copiar" name="NearbyChatBar_Copy"/> + <menu_item_call label="Pegar" name="NearbyChatBar_Paste"/> + <menu_item_call label="Borrar" name="NearbyChatBar_Delete"/> + <menu_item_call label="Seleccionar todo" name="NearbyChatBar_Select_All"/> +</menu> diff --git a/indra/newview/skins/default/xui/es/menu_cof_attachment.xml b/indra/newview/skins/default/xui/es/menu_cof_attachment.xml new file mode 100644 index 0000000000..7541530601 --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_cof_attachment.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="COF Attachment"> + <menu_item_call label="Quitar" name="detach"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/es/menu_cof_body_part.xml b/indra/newview/skins/default/xui/es/menu_cof_body_part.xml new file mode 100644 index 0000000000..56b95bdc3b --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_cof_body_part.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="COF Body"> + <menu_item_call label="Reemplazar" name="replace"/> + <menu_item_call label="Editar" name="edit"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/es/menu_cof_clothing.xml b/indra/newview/skins/default/xui/es/menu_cof_clothing.xml new file mode 100644 index 0000000000..4051f64e14 --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_cof_clothing.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="COF Clothing"> + <menu_item_call label="Quitarme" name="take_off"/> + <menu_item_call label="Subir una capa" name="move_up"/> + <menu_item_call label="Bajar una capa" name="move_down"/> + <menu_item_call label="Editar" name="edit"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/es/menu_cof_gear.xml b/indra/newview/skins/default/xui/es/menu_cof_gear.xml new file mode 100644 index 0000000000..ff8ad0977a --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_cof_gear.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Gear COF"> + <menu label="Ropas nuevas" name="COF.Gear.New_Clothes"/> + <menu label="Nuevas partes del cuerpo" name="COF.Geear.New_Body_Parts"/> +</menu> diff --git a/indra/newview/skins/default/xui/es/menu_edit.xml b/indra/newview/skins/default/xui/es/menu_edit.xml new file mode 100644 index 0000000000..96fc9d8881 --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_edit.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu label="Editar" name="Edit"> + <menu_item_call label="Deshacer" name="Undo"/> + <menu_item_call label="Rehacer" name="Redo"/> + <menu_item_call label="Cortar" name="Cut"/> + <menu_item_call label="Copiar" name="Copy"/> + <menu_item_call label="Pegar" name="Paste"/> + <menu_item_call label="Borrar" name="Delete"/> + <menu_item_call label="Duplicar" name="Duplicate"/> + <menu_item_call label="Seleccionar todo" name="Select All"/> + <menu_item_call label="Deseleccionar" name="Deselect"/> +</menu> diff --git a/indra/newview/skins/default/xui/es/menu_favorites.xml b/indra/newview/skins/default/xui/es/menu_favorites.xml new file mode 100644 index 0000000000..c8a7858ddb --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_favorites.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Popup"> + <menu_item_call label="Teleportarse" name="Teleport To Landmark"/> + <menu_item_call label="Ver/Editar el hito" name="Landmark Open"/> + <menu_item_call label="Copiar la SLurl" name="Copy slurl"/> + <menu_item_call label="Mostrar en el mapa" name="Show On Map"/> + <menu_item_call label="Copiar" name="Landmark Copy"/> + <menu_item_call label="Pegar" name="Landmark Paste"/> + <menu_item_call label="Borrar" name="Delete"/> +</menu> diff --git a/indra/newview/skins/default/xui/es/menu_gesture_gear.xml b/indra/newview/skins/default/xui/es/menu_gesture_gear.xml new file mode 100644 index 0000000000..24706eb2c8 --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_gesture_gear.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_gesture_gear"> + <menu_item_call label="Añadir a / Quitar de los favoritos" name="activate"/> + <menu_item_call label="Copiar" name="copy_gesture"/> + <menu_item_call label="Pegar" name="paste"/> + <menu_item_call label="Copiar la UUID" name="copy_uuid"/> + <menu_item_call label="Añadir al vestuario actual" name="save_to_outfit"/> + <menu_item_call label="Editar" name="edit_gesture"/> + <menu_item_call label="Inspeccionar" name="inspect"/> +</menu> diff --git a/indra/newview/skins/default/xui/es/menu_group_plus.xml b/indra/newview/skins/default/xui/es/menu_group_plus.xml new file mode 100644 index 0000000000..6b26ba42c4 --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_group_plus.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_group_plus"> + <menu_item_call label="Entrar al grupo..." name="item_join"/> + <menu_item_call label="Grupo nuevo..." name="item_new"/> +</menu> diff --git a/indra/newview/skins/default/xui/es/menu_hide_navbar.xml b/indra/newview/skins/default/xui/es/menu_hide_navbar.xml new file mode 100644 index 0000000000..22a1873234 --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_hide_navbar.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="hide_navbar_menu"> + <menu_item_check label="Mostrar la barra de navegación" name="ShowNavbarNavigationPanel"/> + <menu_item_check label="Mostrar la barra de favoritos" name="ShowNavbarFavoritesPanel"/> + <menu_item_check label="Mostrar mini-barra de ubicación" name="ShowMiniLocationPanel"/> +</menu> diff --git a/indra/newview/skins/default/xui/es/menu_im_well_button.xml b/indra/newview/skins/default/xui/es/menu_im_well_button.xml new file mode 100644 index 0000000000..c8f6c217cc --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_im_well_button.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="IM Well Button Context Menu"> + <menu_item_call label="Cerrar todo" name="Close All"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/es/menu_imchiclet_adhoc.xml b/indra/newview/skins/default/xui/es/menu_imchiclet_adhoc.xml new file mode 100644 index 0000000000..e11e9bdc58 --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_imchiclet_adhoc.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="IMChiclet AdHoc Menu"> + <menu_item_call label="Acabar la sesión" name="End Session"/> +</menu> diff --git a/indra/newview/skins/default/xui/es/menu_imchiclet_group.xml b/indra/newview/skins/default/xui/es/menu_imchiclet_group.xml new file mode 100644 index 0000000000..a5e60ea40b --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_imchiclet_group.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="IMChiclet Group Menu"> + <menu_item_call label="Información del grupo" name="Show Profile"/> + <menu_item_call label="Mostrar la sesión" name="Chat"/> + <menu_item_call label="Acabar la sesión" name="End Session"/> +</menu> diff --git a/indra/newview/skins/default/xui/es/menu_imchiclet_p2p.xml b/indra/newview/skins/default/xui/es/menu_imchiclet_p2p.xml new file mode 100644 index 0000000000..492801026c --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_imchiclet_p2p.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="IMChiclet P2P Menu"> + <menu_item_call label="Ver el perfil" name="Show Profile"/> + <menu_item_call label="Añadir como amigo" name="Add Friend"/> + <menu_item_call label="Mostrar la sesión" name="Send IM"/> + <menu_item_call label="Acabar la sesión" name="End Session"/> +</menu> diff --git a/indra/newview/skins/default/xui/es/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/es/menu_inspect_avatar_gear.xml new file mode 100644 index 0000000000..236289f82a --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_inspect_avatar_gear.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<menu name="Gear Menu"> + <menu_item_call label="Ver el perfil" name="view_profile"/> + <menu_item_call label="Añadir como amigo" name="add_friend"/> + <menu_item_call label="MI" name="im"/> + <menu_item_call label="Llamada" name="call"/> + <menu_item_call label="Teleportarse" name="teleport"/> + <menu_item_call label="Invitar al grupo" name="invite_to_group"/> + <menu_item_call label="Ignorar" name="block"/> + <menu_item_call label="Designorar" name="unblock"/> + <menu_item_call label="Denunciar" name="report"/> + <menu_item_call label="Congelar" name="freeze"/> + <menu_item_call label="Expulsar" name="eject"/> + <menu_item_call label="Depurar las texturas" name="debug"/> + <menu_item_call label="Encontrar en el mapa" name="find_on_map"/> + <menu_item_call label="Acercar el zoom" name="zoom_in"/> + <menu_item_call label="Pagar" name="pay"/> + <menu_item_call label="Compartir" name="share"/> +</menu> diff --git a/indra/newview/skins/default/xui/es/menu_inspect_object_gear.xml b/indra/newview/skins/default/xui/es/menu_inspect_object_gear.xml new file mode 100644 index 0000000000..af85b833e9 --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_inspect_object_gear.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8"?> +<menu name="Gear Menu"> + <menu_item_call label="Tocar" name="touch"/> + <menu_item_call label="Sentarse" name="sit"/> + <menu_item_call label="Pagar" name="pay"/> + <menu_item_call label="Comprar" name="buy"/> + <menu_item_call label="Tomar" name="take"/> + <menu_item_call label="Coger una copia" name="take_copy"/> + <menu_item_call label="Abrir" name="open"/> + <menu_item_call label="Editar" name="edit"/> + <menu_item_call label="Ponerse" name="wear"/> + <menu_item_call label="Denunciar" name="report"/> + <menu_item_call label="Ignorar" name="block"/> + <menu_item_call label="Acercar el zoom" name="zoom_in"/> + <menu_item_call label="Quitar" name="remove"/> + <menu_item_call label="Más información" name="more_info"/> +</menu> diff --git a/indra/newview/skins/default/xui/es/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/es/menu_inspect_self_gear.xml new file mode 100644 index 0000000000..4b56984541 --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_inspect_self_gear.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8"?> +<menu name="Gear Menu"> + <menu_item_call label="Levantarme" name="stand_up"/> + <menu_item_call label="Cambiar vestuario" name="change_outfit"/> + <menu_item_call label="Mi perfil" name="my_profile"/> + <menu_item_call label="Mis amigos" name="my_friends"/> + <menu_item_call label="Mis grupos" name="my_groups"/> + <menu_item_call label="Depurar las texturas" name="Debug..."/> +</menu> diff --git a/indra/newview/skins/default/xui/es/menu_inv_offer_chiclet.xml b/indra/newview/skins/default/xui/es/menu_inv_offer_chiclet.xml new file mode 100644 index 0000000000..20d99afde1 --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_inv_offer_chiclet.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="InvOfferChiclet Menu"> + <menu_item_call label="Cerrar" name="Close"/> +</menu> diff --git a/indra/newview/skins/default/xui/es/menu_inventory.xml b/indra/newview/skins/default/xui/es/menu_inventory.xml index 28d47fce52..8f606aef82 100644 --- a/indra/newview/skins/default/xui/es/menu_inventory.xml +++ b/indra/newview/skins/default/xui/es/menu_inventory.xml @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="Popup"> + <menu_item_call label="Compartir" name="Share"/> <menu_item_call label="Comprar" name="Task Buy"/> <menu_item_call label="Abrir" name="Task Open"/> <menu_item_call label="Ejecutar" name="Task Play"/> @@ -12,7 +13,7 @@ <menu_item_call label="Script nuevo" name="New Script"/> <menu_item_call label="Nota nueva" name="New Note"/> <menu_item_call label="Gesto nuevo" name="New Gesture"/> - <menu name="New Clothes" label="Nueva ropa"> + <menu label="Ropas nuevas" name="New Clothes"> <menu_item_call label="Camisa nueva" name="New Shirt"/> <menu_item_call label="Pantalones nuevos" name="New Pants"/> <menu_item_call label="Zapatos nuevos" name="New Shoes"/> @@ -22,45 +23,65 @@ <menu_item_call label="Guantes nuevos" name="New Gloves"/> <menu_item_call label="Camiseta nueva" name="New Undershirt"/> <menu_item_call label="Ropa interior nueva" name="New Underpants"/> + <menu_item_call label="Nueva capa Alpha" name="New Alpha Mask"/> + <menu_item_call label="Tatuaje nuevo" name="New Tattoo"/> </menu> - <menu name="New Body Parts" label="Nuevas partes del cuerpo"> + <menu label="Nuevas partes del cuerpo" name="New Body Parts"> <menu_item_call label="Forma nueva" name="New Shape"/> <menu_item_call label="Piel nueva" name="New Skin"/> <menu_item_call label="Pelo nuevo" name="New Hair"/> <menu_item_call label="Ojos nuevos" name="New Eyes"/> </menu> + <menu label="Change Type" name="Change Type"> + <menu_item_call label="Por defecto" name="Default"/> + <menu_item_call label="Guantes" name="Gloves"/> + <menu_item_call label="Chaqueta" name="Jacket"/> + <menu_item_call label="Pantalón" name="Pants"/> + <menu_item_call label="Forma" name="Shape"/> + <menu_item_call label="Zapatos" name="Shoes"/> + <menu_item_call label="Camisa" name="Shirt"/> + <menu_item_call label="Falda" name="Skirt"/> + <menu_item_call label="Ropa interior" name="Underpants"/> + <menu_item_call label="Camiseta" name="Undershirt"/> + </menu> <menu_item_call label="Teleportar" name="Landmark Open"/> <menu_item_call label="Abrir" name="Animation Open"/> <menu_item_call label="Abrir" name="Sound Open"/> + <menu_item_call label="Reemplazar el vestuario" name="Replace Outfit"/> + <menu_item_call label="Añadir al vestuario" name="Add To Outfit"/> + <menu_item_call label="Quitar del vestuario actual" name="Remove From Outfit"/> + <menu_item_call label="Encontrar el original" name="Find Original"/> <menu_item_call label="Eliminar el Ãtem" name="Purge Item"/> <menu_item_call label="Restaurar el Ãtem" name="Restore Item"/> <menu_item_call label="Abrir" name="Open"/> + <menu_item_call label="Abrir original" name="Open Original"/> <menu_item_call label="Propiedades" name="Properties"/> <menu_item_call label="Renombrar" name="Rename"/> <menu_item_call label="Copiar la UUID" name="Copy Asset UUID"/> <menu_item_call label="Copiar" name="Copy"/> <menu_item_call label="Pegar" name="Paste"/> + <menu_item_call label="Pegar como enlace" name="Paste As Link"/> + <menu_item_call label="Quitar el enlace" name="Remove Link"/> <menu_item_call label="Borrar" name="Delete"/> - <menu_item_call label="Quitarse los Ãtems" name="Take Off Items"/> - <menu_item_call label="Añadir al vestuario" name="Add To Outfit"/> - <menu_item_call label="Reemplazar el vestuario" name="Replace Outfit"/> + <menu_item_call label="Borrar carpeta del sistema" name="Delete System Folder"/> <menu_item_call label="Empezar multiconferencia" name="Conference Chat Folder"/> <menu_item_call label="Escuchar" name="Sound Play"/> - <menu_item_call label="Acerca del hito" name="Teleport To Landmark"/> - <menu_item_call label="Ver en el mundo" name="Animation Play"/> + <menu_item_call label="Acerca del hito" name="About Landmark"/> + <menu_item_call label="Escuchar en el mundo" name="Animation Play"/> <menu_item_call label="Ejecutarla para usted" name="Animation Audition"/> <menu_item_call label="Enviar un mensaje instantáneo" name="Send Instant Message"/> <menu_item_call label="Ofrecer teleporte..." name="Offer Teleport..."/> <menu_item_call label="Empezar multiconferencia" name="Conference Chat"/> <menu_item_call label="Activar" name="Activate"/> <menu_item_call label="Desactivar" name="Deactivate"/> + <menu_item_call label="Guardar como" name="Save As"/> <menu_item_call label="Quitarse" name="Detach From Yourself"/> - <menu_item_call label="Volver a la última posición" name="Restore to Last Position"/> <menu_item_call label="Ponerse" name="Object Wear"/> <menu label="Anexar a" name="Attach To"/> <menu label="Anexar como HUD" name="Attach To HUD"/> <menu_item_call label="Editar" name="Wearable Edit"/> <menu_item_call label="Ponerse" name="Wearable Wear"/> + <menu_item_call label="Añadir" name="Wearable Add"/> <menu_item_call label="Quitarse" name="Take Off"/> <menu_item_call label="--sin opciones--" name="--no options--"/> </menu> diff --git a/indra/newview/skins/default/xui/es/menu_inventory_add.xml b/indra/newview/skins/default/xui/es/menu_inventory_add.xml new file mode 100644 index 0000000000..91cb4a08ff --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_inventory_add.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_inventory_add"> + <menu label="Subir" name="upload"> + <menu_item_call label="Imagen ([COST] L$)..." name="Upload Image"/> + <menu_item_call label="Sonido ([COST] L$)..." name="Upload Sound"/> + <menu_item_call label="Animación ([COST] L$)..." name="Upload Animation"/> + <menu_item_call label="Masivo ([COST] L$ por archivo)..." name="Bulk Upload"/> + </menu> + <menu_item_call label="Carpeta nueva" name="New Folder"/> + <menu_item_call label="Script nuevo" name="New Script"/> + <menu_item_call label="Nota nueva" name="New Note"/> + <menu_item_call label="Gesto nuevo" name="New Gesture"/> + <menu label="Ropas nuevas" name="New Clothes"> + <menu_item_call label="Camisa nueva" name="New Shirt"/> + <menu_item_call label="Pantalón nuevo" name="New Pants"/> + <menu_item_call label="Zapatos nuevos" name="New Shoes"/> + <menu_item_call label="Calcetines nuevos" name="New Socks"/> + <menu_item_call label="Chaqueta nueva" name="New Jacket"/> + <menu_item_call label="Falda nueva" name="New Skirt"/> + <menu_item_call label="Guantes nuevos" name="New Gloves"/> + <menu_item_call label="Camiseta nueva" name="New Undershirt"/> + <menu_item_call label="Ropa interior nueva" name="New Underpants"/> + <menu_item_call label="Nueva Alfa" name="New Alpha"/> + <menu_item_call label="Tatuaje nuevo" name="New Tattoo"/> + </menu> + <menu label="Nuevas partes del cuerpo" name="New Body Parts"> + <menu_item_call label="Forma nueva" name="New Shape"/> + <menu_item_call label="Piel nueva" name="New Skin"/> + <menu_item_call label="Pelo nuevo" name="New Hair"/> + <menu_item_call label="Ojos nuevos" name="New Eyes"/> + </menu> +</menu> diff --git a/indra/newview/skins/default/xui/es/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/es/menu_inventory_gear_default.xml new file mode 100644 index 0000000000..80cf78c0b5 --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_inventory_gear_default.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_gear_default"> + <menu_item_call label="Nueva ventana del inventario" name="new_window"/> + <menu_item_call label="Ordenar alfabéticamente" name="sort_by_name"/> + <menu_item_call label="Ordenar por los más recientes" name="sort_by_recent"/> + <menu_item_call label="Ver los filtros" name="show_filters"/> + <menu_item_call label="Restablecer los filtros" name="reset_filters"/> + <menu_item_call label="Cerrar todas las carpetas" name="close_folders"/> + <menu_item_call label="Vaciar la Papelera" name="empty_trash"/> + <menu_item_call label="Vaciar Objetos Perdidos" name="empty_lostnfound"/> + <menu_item_call label="Guardar la textura como" name="Save Texture As"/> + <menu_item_call label="Encontrar el original" name="Find Original"/> + <menu_item_call label="Encontrar todos los enlazados" name="Find All Links"/> +</menu> diff --git a/indra/newview/skins/default/xui/es/menu_land.xml b/indra/newview/skins/default/xui/es/menu_land.xml new file mode 100644 index 0000000000..b0f15be1b6 --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_land.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Land Pie"> + <menu_item_call label="Acerca del terreno" name="Place Information..."/> + <menu_item_call label="Sentarme aquÃ" name="Sit Here"/> + <menu_item_call label="Comprar este terreno" name="Land Buy"/> + <menu_item_call label="Comprar un pase" name="Land Buy Pass"/> + <menu_item_call label="Construir" name="Create"/> + <menu_item_call label="Modificar el terreno" name="Edit Terrain"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/es/menu_landmark.xml b/indra/newview/skins/default/xui/es/menu_landmark.xml new file mode 100644 index 0000000000..f69b1539b8 --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_landmark.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="landmark_overflow_menu"> + <menu_item_call label="Copiar la SLurl" name="copy"/> + <menu_item_call label="Borrar" name="delete"/> + <menu_item_call label="Crear un Destacado" name="pick"/> + <menu_item_call label="Añadir a la barra de favoritos" name="add_to_favbar"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/es/menu_login.xml b/indra/newview/skins/default/xui/es/menu_login.xml index 1cf6ad5ae6..5386f82ee5 100644 --- a/indra/newview/skins/default/xui/es/menu_login.xml +++ b/indra/newview/skins/default/xui/es/menu_login.xml @@ -1,13 +1,23 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu_bar name="Login Menu"> - <menu label="Archivo" name="File"> - <menu_item_call label="Salir" name="Quit"/> - </menu> - <menu label="Editar" name="Edit"> - <menu_item_call label="Preferencias..." name="Preferences..."/> + <menu label="Yo" name="File"> + <menu_item_call label="Preferencias" name="Preferences..."/> + <menu_item_call label="Salir de [APP_NAME]" name="Quit"/> </menu> <menu label="Ayuda" name="Help"> <menu_item_call label="Ayuda de [SECOND_LIFE]" name="Second Life Help"/> - <menu_item_call label="Acerca de [APP_NAME]..." name="About Second Life..."/> + <menu_item_call label="Acerca de [APP_NAME]" name="About Second Life"/> + </menu> + <menu_item_check label="Mostrar el menú 'Debug'" name="Show Debug Menu"/> + <menu label="Depurar" name="Debug"> + <menu_item_call label="Mostrar las configuraciones del depurador" name="Debug Settings"/> + <menu_item_call label="Configuraciones del Visor/Color" name="UI/Color Settings"/> + <menu label="Pruebas de la interfaz" name="UI Tests"/> + <menu_item_call label="Definir el tamaño de la ventana..." name="Set Window Size..."/> + <menu_item_call label="Mostrar los 'TOS'" name="TOS"/> + <menu_item_call label="Mostrar mensaje crÃtico" name="Critical"/> + <menu_item_call label="Web Browser Test" name="Web Browser Test"/> + <menu_item_check label="Mostrar el selector de Grid" name="Show Grid Picker"/> + <menu_item_call label="Mostrar la consola de notificaciones" name="Show Notifications Console"/> </menu> </menu_bar> diff --git a/indra/newview/skins/default/xui/es/menu_mini_map.xml b/indra/newview/skins/default/xui/es/menu_mini_map.xml index 19061cea06..8e464177fe 100644 --- a/indra/newview/skins/default/xui/es/menu_mini_map.xml +++ b/indra/newview/skins/default/xui/es/menu_mini_map.xml @@ -1,8 +1,9 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="popup"> +<menu name="Popup"> <menu_item_call label="Zoom cerca" name="Zoom Close"/> <menu_item_call label="Zoom medio" name="Zoom Medium"/> <menu_item_call label="Zoom lejos" name="Zoom Far"/> + <menu_item_check label="Girar el mapa" name="Rotate Map"/> <menu_item_call label="Parar la búsqueda" name="Stop Tracking"/> - <menu_item_call label="Perfil..." name="Profile"/> + <menu_item_call label="Mapa del mundo" name="World Map"/> </menu> diff --git a/indra/newview/skins/default/xui/es/menu_navbar.xml b/indra/newview/skins/default/xui/es/menu_navbar.xml new file mode 100644 index 0000000000..63e5468020 --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_navbar.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Navbar Menu"> + <menu_item_check label="Mostrar las coordenadas" name="Show Coordinates"/> + <menu_item_check label="Mostrar las propiedades de la parcela" name="Show Parcel Properties"/> + <menu_item_call label="Hito" name="Landmark"/> + <menu_item_call label="Cortar" name="Cut"/> + <menu_item_call label="Copiar" name="Copy"/> + <menu_item_call label="Pegar" name="Paste"/> + <menu_item_call label="Borrar" name="Delete"/> + <menu_item_call label="Seleccionar todo" name="Select All"/> +</menu> diff --git a/indra/newview/skins/default/xui/es/menu_nearby_chat.xml b/indra/newview/skins/default/xui/es/menu_nearby_chat.xml new file mode 100644 index 0000000000..94b281b6c7 --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_nearby_chat.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="NearBy Chat Menu"> + <menu_item_call label="Mostrar la gente que está cerca..." name="nearby_people"/> + <menu_item_check label="Ver el texto ignorado" name="muted_text"/> + <menu_item_check label="Mostrar los iconos del amigo" name="show_buddy_icons"/> + <menu_item_check label="Mostrar los nombres" name="show_names"/> + <menu_item_check label="Mostrar los iconos y los nombres" name="show_icons_and_names"/> + <menu_item_call label="Tamaño de la fuente" name="font_size"/> +</menu> diff --git a/indra/newview/skins/default/xui/es/menu_notification_well_button.xml b/indra/newview/skins/default/xui/es/menu_notification_well_button.xml new file mode 100644 index 0000000000..0562d35be7 --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_notification_well_button.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Notification Well Button Context Menu"> + <menu_item_call label="Cerrar todo" name="Close All"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/es/menu_object.xml b/indra/newview/skins/default/xui/es/menu_object.xml new file mode 100644 index 0000000000..d2743cd4fc --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_object.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Object Pie"> + <menu_item_call label="Tocar" name="Object Touch"/> + <menu_item_call label="Editar" name="Edit..."/> + <menu_item_call label="Construir" name="Build"/> + <menu_item_call label="Abrir" name="Open"/> + <menu_item_call label="Sentarme aquÃ" name="Object Sit"/> + <menu_item_call label="Levantarme" name="Object Stand Up"/> + <menu_item_call label="Perfil del objeto" name="Object Inspect"/> + <menu_item_call label="Acercar el zoom" name="Zoom In"/> + <context_menu label="Ponerme â–¶" name="Put On"> + <menu_item_call label="Ponerme" name="Wear"/> + <context_menu label="Anexar â–¶" name="Object Attach"/> + <context_menu label="Anexar como HUD â–¶" name="Object Attach HUD"/> + </context_menu> + <context_menu label="Quitarme â–¶" name="Remove"> + <menu_item_call label="Denunciar una infracción" name="Report Abuse..."/> + <menu_item_call label="Ignorar" name="Object Mute"/> + <menu_item_call label="Devolver" name="Return..."/> + <menu_item_call label="Eliminar" name="Delete"/> + </context_menu> + <menu_item_call label="Comprar" name="Pie Object Bye"/> + <menu_item_call label="Tomar" name="Pie Object Take"/> + <menu_item_call label="Coger una copia" name="Take Copy"/> + <menu_item_call label="Pagar" name="Pay..."/> + <menu_item_call label="Comprar" name="Buy..."/> +</context_menu> diff --git a/indra/newview/skins/default/xui/es/menu_object_icon.xml b/indra/newview/skins/default/xui/es/menu_object_icon.xml new file mode 100644 index 0000000000..7e4578b950 --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_object_icon.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Object Icon Menu"> + <menu_item_call label="Perfil del objeto..." name="Object Profile"/> + <menu_item_call label="Ignorar..." name="Block"/> +</menu> diff --git a/indra/newview/skins/default/xui/es/menu_outfit_gear.xml b/indra/newview/skins/default/xui/es/menu_outfit_gear.xml new file mode 100644 index 0000000000..39afa5e60b --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_outfit_gear.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Gear Outfit"> + <menu_item_call label="Ponerme - Reemplazar el vestuario actual" name="wear"/> + <menu_item_call label="Quitarme - Quitar del vestuario actual" name="take_off"/> + <menu label="Ropas nuevas" name="New Clothes"> + <menu_item_call label="Camisa nueva" name="New Shirt"/> + <menu_item_call label="Pantalón nuevo" name="New Pants"/> + <menu_item_call label="Zapatos nuevos" name="New Shoes"/> + <menu_item_call label="Calcetines nuevos" name="New Socks"/> + <menu_item_call label="Chaqueta nueva" name="New Jacket"/> + <menu_item_call label="Falda nueva" name="New Skirt"/> + <menu_item_call label="Guantes nuevos" name="New Gloves"/> + <menu_item_call label="Camiseta nueva" name="New Undershirt"/> + <menu_item_call label="Ropa interior nueva" name="New Underpants"/> + <menu_item_call label="Nueva Alfa" name="New Alpha"/> + <menu_item_call label="Tatuaje nuevo" name="New Tattoo"/> + </menu> + <menu label="Nuevas partes del cuerpo" name="New Body Parts"> + <menu_item_call label="AnatomÃa nueva" name="New Shape"/> + <menu_item_call label="Piel nueva" name="New Skin"/> + <menu_item_call label="Pelo nuevo" name="New Hair"/> + <menu_item_call label="Ojos nuevos" name="New Eyes"/> + </menu> + <menu_item_call label="Renombrar el vestuario" name="rename"/> + <menu_item_call label="Borrar el vestuario" name="delete_outfit"/> +</menu> diff --git a/indra/newview/skins/default/xui/es/menu_outfit_tab.xml b/indra/newview/skins/default/xui/es/menu_outfit_tab.xml new file mode 100644 index 0000000000..e674d6fa11 --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_outfit_tab.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Outfit"> + <menu_item_call label="Ponerme - Reemplazar el vestuario actual" name="wear_replace"/> + <menu_item_call label="Ponerme - Añadir al vestuario actual" name="wear_add"/> + <menu_item_call label="Quitarme - Quitar del vestuario actual" name="take_off"/> + <menu_item_call label="Editar el vestuario" name="edit"/> + <menu_item_call label="Renombrar" name="rename"/> + <menu_item_call label="Borrar el vestuario" name="delete"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/es/menu_participant_list.xml b/indra/newview/skins/default/xui/es/menu_participant_list.xml new file mode 100644 index 0000000000..fd8bd05230 --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_participant_list.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Participant List Context Menu"> + <menu_item_check label="Ordenar alfabéticamente" name="SortByName"/> + <menu_item_check label="Ordenar según las intervenciones recientes" name="SortByRecentSpeakers"/> + <menu_item_call label="Ver el perfil" name="View Profile"/> + <menu_item_call label="Añadir como amigo" name="Add Friend"/> + <menu_item_call label="MI" name="IM"/> + <menu_item_call label="Llamar" name="Call"/> + <menu_item_call label="Compartir" name="Share"/> + <menu_item_call label="Pagar" name="Pay"/> + <menu_item_check label="Ver los iconos de la gente" name="View Icons"/> + <menu_item_check label="Ignorar la voz" name="Block/Unblock"/> + <menu_item_check label="Ignorar el texto" name="MuteText"/> + <context_menu label="Opciones del moderador >" name="Moderator Options"> + <menu_item_check label="Permitir el chat de texto" name="AllowTextChat"/> + <menu_item_call label="Ignorar a este participante" name="ModerateVoiceMuteSelected"/> + <menu_item_call label="Quitar el silencio a este participante" name="ModerateVoiceUnMuteSelected"/> + <menu_item_call label="Silenciar a todos" name="ModerateVoiceMute"/> + <menu_item_call label="Quitar el silencio a todos" name="ModerateVoiceUnmute"/> + </context_menu> +</context_menu> diff --git a/indra/newview/skins/default/xui/es/menu_people_friends_view_sort.xml b/indra/newview/skins/default/xui/es/menu_people_friends_view_sort.xml new file mode 100644 index 0000000000..0e883be00e --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_people_friends_view_sort.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_group_plus"> + <menu_item_check label="Ordenar alfabéticamente" name="sort_name"/> + <menu_item_check label="Ordenar por estatus" name="sort_status"/> + <menu_item_check label="Ver los iconos de la gente" name="view_icons"/> + <menu_item_call label="Ver la lista de Residentes y Objetos ignorados" name="show_blocked_list"/> +</menu> diff --git a/indra/newview/skins/default/xui/es/menu_people_groups.xml b/indra/newview/skins/default/xui/es/menu_people_groups.xml new file mode 100644 index 0000000000..51bd2c7208 --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_people_groups.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_group_plus"> + <menu_item_call label="Ver la información" name="View Info"/> + <menu_item_call label="Chat" name="Chat"/> + <menu_item_call label="Llamar" name="Call"/> + <menu_item_call label="Activar" name="Activate"/> + <menu_item_call label="Dejar" name="Leave"/> +</menu> diff --git a/indra/newview/skins/default/xui/es/menu_people_groups_view_sort.xml b/indra/newview/skins/default/xui/es/menu_people_groups_view_sort.xml new file mode 100644 index 0000000000..1bd3efb611 --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_people_groups_view_sort.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_group_plus"> + <menu_item_check label="Mostrar los iconos de grupo" name="Display Group Icons"/> + <menu_item_call label="Dejar el grupo seleccionado" name="Leave Selected Group"/> +</menu> diff --git a/indra/newview/skins/default/xui/es/menu_people_nearby.xml b/indra/newview/skins/default/xui/es/menu_people_nearby.xml new file mode 100644 index 0000000000..dc1486d879 --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_people_nearby.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Avatar Context Menu"> + <menu_item_call label="Ver el perfil" name="View Profile"/> + <menu_item_call label="Añadir como amigo" name="Add Friend"/> + <menu_item_call label="Quitarle como amigo" name="Remove Friend"/> + <menu_item_call label="MI" name="IM"/> + <menu_item_call label="Llamar" name="Call"/> + <menu_item_call label="Mapa" name="Map"/> + <menu_item_call label="Compartir" name="Share"/> + <menu_item_call label="Pagar" name="Pay"/> + <menu_item_check label="Ignorar / No ignorar" name="Block/Unblock"/> + <menu_item_call label="Ofrecer teleporte" name="teleport"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/es/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/es/menu_people_nearby_multiselect.xml new file mode 100644 index 0000000000..4ab6000994 --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_people_nearby_multiselect.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Multi-Selected People Context Menu"> + <menu_item_call label="Añadir como amigos" name="Add Friends"/> + <menu_item_call label="Quitar amigos" name="Remove Friend"/> + <menu_item_call label="MI" name="IM"/> + <menu_item_call label="Llamar" name="Call"/> + <menu_item_call label="Compartir" name="Share"/> + <menu_item_call label="Pagar" name="Pay"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/es/menu_people_nearby_view_sort.xml b/indra/newview/skins/default/xui/es/menu_people_nearby_view_sort.xml new file mode 100644 index 0000000000..f0fe383c0c --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_people_nearby_view_sort.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_group_plus"> + <menu_item_check label="Ordenar según las intervenciones recientes" name="sort_by_recent_speakers"/> + <menu_item_check label="Ordenar alfabéticamente" name="sort_name"/> + <menu_item_check label="Ordenar según distancia" name="sort_distance"/> + <menu_item_check label="Ver los iconos de la gente" name="view_icons"/> + <menu_item_call label="Ver la lista de Residentes y Objetos ignorados" name="show_blocked_list"/> +</menu> diff --git a/indra/newview/skins/default/xui/es/menu_people_recent_view_sort.xml b/indra/newview/skins/default/xui/es/menu_people_recent_view_sort.xml new file mode 100644 index 0000000000..e4aaa89110 --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_people_recent_view_sort.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_group_plus"> + <menu_item_check label="Ordenar por los más recientes" name="sort_most"/> + <menu_item_check label="Ordenar alfabéticamente" name="sort_name"/> + <menu_item_check label="Ver los iconos de la gente" name="view_icons"/> + <menu_item_call label="Ver la lista de Residentes y Objetos ignorados" name="show_blocked_list"/> +</menu> diff --git a/indra/newview/skins/default/xui/es/menu_picks.xml b/indra/newview/skins/default/xui/es/menu_picks.xml new file mode 100644 index 0000000000..9da68d7c9b --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_picks.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Picks"> + <menu_item_call label="Información" name="pick_info"/> + <menu_item_call label="Editar" name="pick_edit"/> + <menu_item_call label="Teleportar" name="pick_teleport"/> + <menu_item_call label="Mapa" name="pick_map"/> + <menu_item_call label="Eliminar" name="pick_delete"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/es/menu_picks_plus.xml b/indra/newview/skins/default/xui/es/menu_picks_plus.xml new file mode 100644 index 0000000000..cc59bf1d29 --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_picks_plus.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="picks_plus_menu"> + <menu_item_call label="Destacado nuevo" name="create_pick"/> + <menu_item_call label="Clasificado nuevo" name="create_classified"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/es/menu_place.xml b/indra/newview/skins/default/xui/es/menu_place.xml new file mode 100644 index 0000000000..675f0699e9 --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_place.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="place_overflow_menu"> + <menu_item_call label="Crear un hito" name="landmark"/> + <menu_item_call label="Crear un destacado" name="pick"/> + <menu_item_call label="Comprar un pase" name="pass"/> + <menu_item_call label="Editar" name="edit"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/es/menu_place_add_button.xml b/indra/newview/skins/default/xui/es/menu_place_add_button.xml new file mode 100644 index 0000000000..4b2f908a06 --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_place_add_button.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_folder_gear"> + <menu_item_call label="Añadir una carpeta" name="add_folder"/> + <menu_item_call label="Añadir este hito" name="add_landmark"/> +</menu> diff --git a/indra/newview/skins/default/xui/es/menu_places_gear_folder.xml b/indra/newview/skins/default/xui/es/menu_places_gear_folder.xml new file mode 100644 index 0000000000..bf46eb58e3 --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_places_gear_folder.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_folder_gear"> + <menu_item_call label="Añadir este hito" name="add_landmark"/> + <menu_item_call label="Añadir una carpeta" name="add_folder"/> + <menu_item_call label="Cortar" name="cut"/> + <menu_item_call label="Copiar" name="copy_folder"/> + <menu_item_call label="Pegar" name="paste"/> + <menu_item_call label="Renombrar" name="rename"/> + <menu_item_call label="Borrar" name="delete"/> + <menu_item_call label="Abrir" name="expand"/> + <menu_item_call label="Cerrar" name="collapse"/> + <menu_item_call label="Abrir todas las carpetas" name="expand_all"/> + <menu_item_call label="Cerrar todas las carpetas" name="collapse_all"/> + <menu_item_check label="Ordenar por fecha" name="sort_by_date"/> +</menu> diff --git a/indra/newview/skins/default/xui/es/menu_places_gear_landmark.xml b/indra/newview/skins/default/xui/es/menu_places_gear_landmark.xml new file mode 100644 index 0000000000..eac85de846 --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_places_gear_landmark.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_ladmark_gear"> + <menu_item_call label="Teleportar" name="teleport"/> + <menu_item_call label="Más información" name="more_info"/> + <menu_item_call label="Mostrar en el mapa" name="show_on_map"/> + <menu_item_call label="Añadir un hito" name="add_landmark"/> + <menu_item_call label="Añadir una carpeta" name="add_folder"/> + <menu_item_call label="Cortar" name="cut"/> + <menu_item_call label="Copiar el hito" name="copy_landmark"/> + <menu_item_call label="Copiar la SLurl" name="copy_slurl"/> + <menu_item_call label="Pegar" name="paste"/> + <menu_item_call label="Renombrar" name="rename"/> + <menu_item_call label="Eliminar" name="delete"/> + <menu_item_call label="Abrir todas las carpetas" name="expand_all"/> + <menu_item_call label="Cerrar todas las carpetas" name="collapse_all"/> + <menu_item_check label="Ordenar por fecha" name="sort_by_date"/> + <menu_item_call label="Crear un Destacado" name="create_pick"/> +</menu> diff --git a/indra/newview/skins/default/xui/es/menu_profile_overflow.xml b/indra/newview/skins/default/xui/es/menu_profile_overflow.xml new file mode 100644 index 0000000000..5ee8c50949 --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_profile_overflow.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="profile_overflow_menu"> + <menu_item_call label="Mapa" name="show_on_map"/> + <menu_item_call label="Pagar" name="pay"/> + <menu_item_call label="Compartir" name="share"/> + <menu_item_call label="Ignorar" name="block"/> + <menu_item_call label="Designorar" name="unblock"/> + <menu_item_call label="Expulsar" name="kick"/> + <menu_item_call label="Congelar" name="freeze"/> + <menu_item_call label="Descongelar" name="unfreeze"/> + <menu_item_call label="CSR" name="csr"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/es/menu_save_outfit.xml b/indra/newview/skins/default/xui/es/menu_save_outfit.xml new file mode 100644 index 0000000000..a04ec75b60 --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_save_outfit.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="save_outfit_menu"> + <menu_item_call label="Guardar" name="save_outfit"/> + <menu_item_call label="Guardar como" name="save_as_new_outfit"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/es/menu_script_chiclet.xml b/indra/newview/skins/default/xui/es/menu_script_chiclet.xml new file mode 100644 index 0000000000..f517baf566 --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_script_chiclet.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="ScriptChiclet Menu"> + <menu_item_call label="Cerrar" name="Close"/> +</menu> diff --git a/indra/newview/skins/default/xui/es/menu_slurl.xml b/indra/newview/skins/default/xui/es/menu_slurl.xml index 5c5900ae56..ca19acec6e 100644 --- a/indra/newview/skins/default/xui/es/menu_slurl.xml +++ b/indra/newview/skins/default/xui/es/menu_slurl.xml @@ -2,5 +2,5 @@ <menu name="Popup"> <menu_item_call label="Acerca de la URL" name="about_url"/> <menu_item_call label="Teleportar a la URL" name="teleport_to_url"/> - <menu_item_call label="Mostrar en el mapa" name="show_on_map"/> + <menu_item_call label="Mapa" name="show_on_map"/> </menu> diff --git a/indra/newview/skins/default/xui/es/menu_teleport_history_gear.xml b/indra/newview/skins/default/xui/es/menu_teleport_history_gear.xml new file mode 100644 index 0000000000..b708f3bc20 --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_teleport_history_gear.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Teleport History Gear Context Menu"> + <menu_item_call label="Abrir todas las carpetas" name="Expand all folders"/> + <menu_item_call label="Cerrar todas las carpetas" name="Collapse all folders"/> + <menu_item_call label="Limpiar el historial de teleportes" name="Clear Teleport History"/> +</menu> diff --git a/indra/newview/skins/default/xui/es/menu_teleport_history_item.xml b/indra/newview/skins/default/xui/es/menu_teleport_history_item.xml new file mode 100644 index 0000000000..ed33c55aca --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_teleport_history_item.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Teleport History Item Context Menu"> + <menu_item_call label="Teleportarse" name="Teleport"/> + <menu_item_call label="Más información" name="More Information"/> + <menu_item_call label="Copiar al portapapeles" name="CopyToClipboard"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/es/menu_teleport_history_tab.xml b/indra/newview/skins/default/xui/es/menu_teleport_history_tab.xml new file mode 100644 index 0000000000..17e90422a5 --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_teleport_history_tab.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Teleport History Item Context Menu"> + <menu_item_call label="Abrir" name="TabOpen"/> + <menu_item_call label="Cerrar" name="TabClose"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/es/menu_text_editor.xml b/indra/newview/skins/default/xui/es/menu_text_editor.xml new file mode 100644 index 0000000000..095e461734 --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_text_editor.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Text editor context menu"> + <menu_item_call label="Cortar" name="Cut"/> + <menu_item_call label="Copiar" name="Copy"/> + <menu_item_call label="Pegar" name="Paste"/> + <menu_item_call label="Borrar" name="Delete"/> + <menu_item_call label="Seleccionar todo" name="Select All"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/es/menu_url_agent.xml b/indra/newview/skins/default/xui/es/menu_url_agent.xml new file mode 100644 index 0000000000..a089c8f68e --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_url_agent.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Mostrar el perfil del Residente" name="show_agent"/> + <menu_item_call label="Copiar el nombre al portapapeles" name="url_copy_label"/> + <menu_item_call label="Copiar la SLurl al portapapeles" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/es/menu_url_group.xml b/indra/newview/skins/default/xui/es/menu_url_group.xml new file mode 100644 index 0000000000..79374b9739 --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_url_group.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Mostrar la información del grupo" name="show_group"/> + <menu_item_call label="Copiar el grupo al portapapeles" name="url_copy_label"/> + <menu_item_call label="Copiar la SLurl al portapapeles" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/es/menu_url_http.xml b/indra/newview/skins/default/xui/es/menu_url_http.xml new file mode 100644 index 0000000000..585c059ff3 --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_url_http.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Abrir la página web" name="url_open"/> + <menu_item_call label="Abrir en el navegador incorporado" name="url_open_internal"/> + <menu_item_call label="Abrir en mi navegador" name="url_open_external"/> + <menu_item_call label="Copiar la URL al portapapeles" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/es/menu_url_inventory.xml b/indra/newview/skins/default/xui/es/menu_url_inventory.xml new file mode 100644 index 0000000000..13a8711c76 --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_url_inventory.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Mostrar Ãtem del inventario" name="show_item"/> + <menu_item_call label="Copiar el nombre al portapapeles" name="url_copy_label"/> + <menu_item_call label="Copiar la SLurl al portapapeles" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/es/menu_url_map.xml b/indra/newview/skins/default/xui/es/menu_url_map.xml new file mode 100644 index 0000000000..f96a0c7170 --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_url_map.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Mostrar en el mapa" name="show_on_map"/> + <menu_item_call label="Teleportarse a la localización" name="teleport_to_location"/> + <menu_item_call label="Copiar la SLurl al portapapeles" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/es/menu_url_objectim.xml b/indra/newview/skins/default/xui/es/menu_url_objectim.xml new file mode 100644 index 0000000000..8791a290af --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_url_objectim.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Mostrar la información del objeto" name="show_object"/> + <menu_item_call label="Mostrar en el mapa" name="show_on_map"/> + <menu_item_call label="Teleportarse a la posición del objeto" name="teleport_to_object"/> + <menu_item_call label="Copiar el nombre del objeto al portapapeles" name="url_copy_label"/> + <menu_item_call label="Copiar la SLurl al portapapeles" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/es/menu_url_parcel.xml b/indra/newview/skins/default/xui/es/menu_url_parcel.xml new file mode 100644 index 0000000000..9e789ef8ee --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_url_parcel.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Mostrar la información de la parcela" name="show_parcel"/> + <menu_item_call label="Mostrar en el mapa" name="show_on_map"/> + <menu_item_call label="Copiar la SLurl al portapapeles" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/es/menu_url_slapp.xml b/indra/newview/skins/default/xui/es/menu_url_slapp.xml new file mode 100644 index 0000000000..7147dcd3cf --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_url_slapp.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Ejecutar este comando" name="run_slapp"/> + <menu_item_call label="Copiar la SLurl al portapapeles" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/es/menu_url_slurl.xml b/indra/newview/skins/default/xui/es/menu_url_slurl.xml new file mode 100644 index 0000000000..4ab47c2f61 --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_url_slurl.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Mostrar la información del lugar" name="show_place"/> + <menu_item_call label="Mostrar en el mapa" name="show_on_map"/> + <menu_item_call label="Teleportarse a este lugar" name="teleport_to_location"/> + <menu_item_call label="Copiar la SLurl al portapapeles" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/es/menu_url_teleport.xml b/indra/newview/skins/default/xui/es/menu_url_teleport.xml new file mode 100644 index 0000000000..8f86a91be3 --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_url_teleport.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Teleportarse a este lugar" name="teleport"/> + <menu_item_call label="Mostrar en el mapa" name="show_on_map"/> + <menu_item_call label="Copiar la SLurl al portapapeles" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/es/menu_viewer.xml b/indra/newview/skins/default/xui/es/menu_viewer.xml index fdb6a92084..f56ab00bf6 100644 --- a/indra/newview/skins/default/xui/es/menu_viewer.xml +++ b/indra/newview/skins/default/xui/es/menu_viewer.xml @@ -1,217 +1,320 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu_bar name="Main Menu"> - <menu name="Me"> + <menu label="Yo" name="Me"> <menu_item_call label="Preferencias" name="Preferences"/> - <menu_item_call name="Manage My Account"> - <menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=es" /> + <menu_item_call label="Mi panel de control" name="Manage My Account"> + <menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=es"/> </menu_item_call> + <menu_item_call label="Comprar L$" name="Buy and Sell L$"/> + <menu_item_call label="Mi perfil" name="Profile"/> + <menu_item_call label="Cambiar vestuario" name="ChangeOutfit"/> + <menu_item_check label="Mi Inventario" name="Inventory"/> + <menu_item_check label="Mi Inventario" name="ShowSidetrayInventory"/> + <menu_item_check label="Mis gestos" name="Gestures"/> + <menu_item_check label="Mi voz" name="ShowVoice"/> + <menu label="Mi estado" name="Status"> + <menu_item_call label="Ausente" name="Set Away"/> + <menu_item_call label="Ocupado" name="Set Busy"/> + </menu> + <menu_item_call label="Solicitar estatus de Administrador" name="Request Admin Options"/> + <menu_item_call label="Dejar el estatus de Administrador" name="Leave Admin Options"/> + <menu_item_call label="Salir de [APP_NAME]" name="Quit"/> </menu> - <menu label="Archivo" name="File"> - <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/> - <menu label="Subir" name="upload"> - <menu_item_call label="Imagen ([COST] L$)..." name="Upload Image"/> - <menu_item_call label="Sonido ([COST] L$)..." name="Upload Sound"/> - <menu_item_call label="Animación ([COST] L$)..." name="Upload Animation"/> - <menu_item_call label="Masiva ([COST] L$ por archivo)..." name="Bulk Upload"/> - <menu_item_separator label="-----------" name="separator"/> - <menu_item_call label="Definir los permisos por defecto..." name="perm prefs"/> - </menu> - <menu_item_separator label="-----------" name="separator"/> - <menu_item_call label="Cerrar la ventana" name="Close Window"/> - <menu_item_call label="Cerrar todas las ventanas" name="Close All Windows"/> - <menu_item_separator label="-----------" name="separator2"/> - <menu_item_call label="Guardar la textura como..." name="Save Texture As..."/> - <menu_item_separator label="-----------" name="separator3"/> - <menu_item_call label="Hacer una foto" name="Take Snapshot"/> - <menu_item_call label="Guardar una foto" name="Snapshot to Disk"/> - <menu_item_separator label="-----------" name="separator4"/> - <menu_item_call label="Salir" name="Quit"/> - </menu> - <menu label="Editar" name="Edit"> - <menu_item_call label="Deshacer" name="Undo"/> - <menu_item_call label="Rehacer" name="Redo"/> - <menu_item_separator label="-----------" name="separator"/> - <menu_item_call label="Cortar" name="Cut"/> - <menu_item_call label="Copiar" name="Copy"/> - <menu_item_call label="Pegar" name="Paste"/> - <menu_item_call label="Borrar" name="Delete"/> - <menu_item_separator label="-----------" name="separator2"/> - <menu_item_call label="Buscar..." name="Search..."/> - <menu_item_separator label="-----------" name="separator3"/> - <menu_item_call label="Seleccionar todo" name="Select All"/> - <menu_item_call label="Deseleccionar" name="Deselect"/> - <menu_item_separator label="-----------" name="separator4"/> - <menu_item_call label="Duplicar" name="Duplicate"/> - <menu_item_separator label="-----------" name="separator5"/> - <menu label="Anexar el objeto" name="Attach Object"/> - <menu label="Quitarse el objeto" name="Detach Object"/> - <menu label="Quitarse ropa" name="Take Off Clothing"> - <menu_item_call label="Camisa" name="Shirt"/> - <menu_item_call label="Pantalones" name="Pants"/> - <menu_item_call label="Zapatos" name="Shoes"/> - <menu_item_call label="Calcetines" name="Socks"/> - <menu_item_call label="Chaqueta" name="Jacket"/> - <menu_item_call label="Guantes" name="Gloves"/> - <menu_item_call label="Camiseta" name="Menu Undershirt"/> - <menu_item_call label="Ropa interior" name="Menu Underpants"/> - <menu_item_call label="Falda" name="Skirt"/> - <menu_item_call label="Toda la ropa" name="All Clothes"/> - </menu> - <menu_item_separator label="-----------" name="separator6"/> - <menu_item_call label="Gestos..." name="Gestures..."/> - <menu_item_call label="Perfil..." name="Profile..."/> - <menu_item_call label="Apariencia..." name="Appearance..."/> - <menu_item_separator label="-----------" name="separator7"/> - <menu_item_check label="Amigos..." name="Friends..."/> - <menu_item_call label="Grupos..." name="Groups..."/> - <menu_item_separator label="-----------" name="separator8"/> - <menu_item_call label="Preferencias..." name="Preferences..."/> - </menu> - <menu label="Ver" name="View"> - <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/> - <menu_item_call label="Vista subjetiva" name="Mouselook"/> - <menu_item_check label="Construir" name="Build"/> - <menu_item_check label="Flycam del joystick" name="Joystick Flycam"/> - <menu_item_call label="Volver a la vista por defecto" name="Reset View"/> - <menu_item_call label="Mirar al último que habló" name="Look at Last Chatter"/> - <menu_item_separator label="-----------" name="separator"/> - <menu_item_check label="Barra de herramientas" name="Toolbar"/> - <menu_item_check label="Chat" name="Chat History"/> - <menu_item_check label="Comunicarse" name="Instant Message"/> - <menu_item_check label="Inventario" name="Inventory"/> - <menu_item_check label="Participantes activos" name="Active Speakers"/> - <menu_item_check label="Lista de ignorados" name="Mute List"/> - <menu_item_separator label="-----------" name="separator2"/> - <menu_item_check label="Controles de la cámara" name="Camera Controls"/> - <menu_item_check label="Controles del movimiento" name="Movement Controls"/> - <menu_item_check label="Mapa del mundo" name="World Map"/> - <menu_item_check label="Minimapa" name="Mini-Map"/> - <menu_item_separator label="-----------" name="separator3"/> - <menu_item_check label="EstadÃsticas" name="Statistics Bar"/> - <menu_item_check label="LÃmites de las parcelas" name="Property Lines"/> - <menu_item_check label="LÃneas de prohibición" name="Banlines"/> - <menu_item_check label="Propietarios del terreno" name="Land Owners"/> - <menu_item_separator label="-----------" name="separator4"/> - <menu label="Información adicional" name="Hover Tips"> - <menu_item_check label="Mostrar información adicional." name="Show Tips"/> - <menu_item_separator label="-----------" name="separator"/> - <menu_item_check label="Información adicional del terreno" name="Land Tips"/> - <menu_item_check label="Información adicional en todos los objetos" name="Tips On All Objects"/> - </menu> - <menu_item_check label="Realzar las transparencias" name="Highlight Transparent"/> - <menu_item_check label="Balizas" name="beacons"/> - <menu_item_check label="Ocultar las partÃculas" name="Hide Particles"/> - <menu_item_check label="Mostrar los HUD en uso" name="Show HUD Attachments"/> - <menu_item_separator label="-----------" name="separator5"/> - <menu_item_call label="Acercar el zoom" name="Zoom In"/> - <menu_item_call label="Zoom predeterminado" name="Zoom Default"/> - <menu_item_call label="Alejar el zoom" name="Zoom Out"/> - <menu_item_separator label="-----------" name="separator6"/> - <menu_item_call label="Pantalla completa" name="Toggle Fullscreen"/> - <menu_item_call label="Interfaz en el tamaño predeterminado" name="Set UI Size to Default"/> + <menu label="Comunicarme" name="Communicate"> + <menu_item_call label="Mis amigos" name="My Friends"/> + <menu_item_call label="Mis grupos" name="My Groups"/> + <menu_item_check label="Chat" name="Nearby Chat"/> + <menu_item_call label="Gente cerca" name="Active Speakers"/> </menu> <menu label="Mundo" name="World"> - <menu_item_call label="Chat" name="Chat"/> - <menu_item_check label="Correr siempre" name="Always Run"/> - <menu_item_check label="Volar" name="Fly"/> - <menu_item_separator label="-----------" name="separator"/> - <menu_item_call label="Crear aquà un hito" name="Create Landmark Here"/> + <menu_item_check label="Minimapa" name="Mini-Map"/> + <menu_item_check label="Mapa del mundo" name="World Map"/> + <menu_item_call label="Foto" name="Take Snapshot"/> + <menu_item_call label="Crear un hito de este sitio" name="Create Landmark Here"/> + <menu label="Perfil del lugar" name="Land"> + <menu_item_call label="Perfil del lugar" name="Place Profile"/> + <menu_item_call label="Acerca del terreno" name="About Land"/> + <menu_item_call label="Región/Estado" name="Region/Estate"/> + </menu> + <menu_item_call label="Comprar este terreno" name="Buy Land"/> + <menu_item_call label="Mi terreno" name="My Land"/> + <menu label="Mostrar" name="LandShow"> + <menu_item_check label="Controles del movimiento" name="Movement Controls"/> + <menu_item_check label="Controles de la cámara" name="Camera Controls"/> + <menu_item_check label="LÃneas de prohibición" name="Ban Lines"/> + <menu_item_check label="Balizas" name="beacons"/> + <menu_item_check label="LÃmites de las parcelas" name="Property Lines"/> + <menu_item_check label="Propietarios del terreno" name="Land Owners"/> + <menu_item_check label="Coordenadas" name="Coordinates"/> + <menu_item_check label="Propiedades de la parcela" name="Parcel Properties"/> + </menu> + <menu_item_call label="Teleportar a la Base" name="Teleport Home"/> <menu_item_call label="Fijar mi Base aquÃ" name="Set Home to Here"/> - <menu_item_separator label="-----------" name="separator2"/> - <menu_item_call label="Teleportar a mi Base" name="Teleport Home"/> - <menu_item_separator label="-----------" name="separator3"/> - <menu_item_call label="Pasar al estado ausente" name="Set Away"/> - <menu_item_call label="Pasar al estado ocupado" name="Set Busy"/> - <menu_item_call label="Parar la animación de mi avatar" name="Stop Animating My Avatar"/> - <menu_item_call label="Recuperar las teclas" name="Release Keys"/> - <menu_item_separator label="-----------" name="separator4"/> - <menu_item_call label="Historial de mi cuenta..." name="Account History..."> - <on_click name="AccountHistory_url" userdata="WebLaunchAccountHistory,http://secondlife.com/account/transactions.php?lang=es"/> - </menu_item_call> - <menu_item_call label="Administrar mi cuenta..." name="Manage My Account..."> - <on_click name="ManageMyAccount_url" userdata="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=es"/> - </menu_item_call> - <menu_item_call label="Comprar L$..." name="Buy and Sell L$..."/> - <menu_item_separator label="-----------" name="separator5"/> - <menu_item_call label="Mi terreno..." name="My Land..."/> - <menu_item_call label="Acerca del terreno..." name="About Land..."/> - <menu_item_call label="Comprar terreno..." name="Buy Land..."/> - <menu_item_call label="Region/Estado..." name="Region/Estate..."/> - <menu_item_separator label="-----------" name="separator6"/> - <menu label="Configuración del entorno" name="Environment Settings"> + <menu label="Sol" name="Environment Settings"> <menu_item_call label="Amanecer" name="Sunrise"/> <menu_item_call label="MediodÃa" name="Noon"/> <menu_item_call label="Atardecer" name="Sunset"/> <menu_item_call label="Medianoche" name="Midnight"/> - <menu_item_call label="Volver a los valores por defecto de la región" name="Revert to Region Default"/> - <menu_item_separator label="-----------" name="separator"/> + <menu_item_call label="Hora del Estado" name="Revert to Region Default"/> <menu_item_call label="Editor del entorno" name="Environment Editor"/> </menu> </menu> - <menu label="Herramientas" name="Tools"> - <menu label="Elegir una herramienta" name="Select Tool"> - <menu_item_call label="Visión" name="Focus"/> - <menu_item_call label="Moverse" name="Move"/> - <menu_item_call label="Modificar" name="Edit"/> - <menu_item_call label="Crear" name="Create"/> - <menu_item_call label="Terreno" name="Land"/> - </menu> - <menu_item_separator label="-----------" name="separator"/> - <menu_item_check label="Seleccionar sólo mis objetos" name="Select Only My Objects"/> - <menu_item_check label="Seleccionar sólo objetos movibles" name="Select Only Movable Objects"/> - <menu_item_check label="Seleccionar marcando los alrededores" name="Select By Surrounding"/> - <menu_item_check label="Al seleccionar, mostrar los ocultos" name="Show Hidden Selection"/> - <menu_item_check label="Al seleccionar, mostrar el radio de la luz" name="Show Light Radius for Selection"/> - <menu_item_check label="Mostrar rayo indicador" name="Show Selection Beam"/> - <menu_item_separator label="-----------" name="separator2"/> - <menu_item_check label="Ajustar a la cuadrÃcula" name="Snap to Grid"/> - <menu_item_call label="Ajustar a la cuadrÃcula los ejes X e Y" name="Snap Object XY to Grid"/> - <menu_item_call label="Usar lo seleccionado como cuadrÃcula" name="Use Selection for Grid"/> - <menu_item_call label="Opciones de la cuadrÃcula..." name="Grid Options..."/> - <menu_item_separator label="-----------" name="separator3"/> - <menu_item_check label="Editar las partes enlazadas" name="Edit Linked Parts"/> + <menu label="Construir" name="BuildTools"> + <menu_item_check label="Construir" name="Show Build Tools"/> + <menu label="Seleccionar la herramienta de construcción" name="Select Tool"> + <menu_item_call label="Herramienta Visión" name="Focus"/> + <menu_item_call label="Herramienta Mover" name="Move"/> + <menu_item_call label="Herramienta Editar" name="Edit"/> + <menu_item_call label="Herramienta Crear" name="Create"/> + <menu_item_call label="Herramienta Terreno" name="Land"/> + </menu> <menu_item_call label="Enlazar" name="Link"/> <menu_item_call label="Desenlazar" name="Unlink"/> - <menu_item_separator label="-----------" name="separator4"/> + <menu_item_check label="Editar las partes enlazadas" name="Edit Linked Parts"/> + <menu label="Seleccionar las partes enlazadas" name="Select Linked Parts"> + <menu_item_call label="Seleccionar la parte siguiente" name="Select Next Part"/> + <menu_item_call label="Seleccionar la parte previa" name="Select Previous Part"/> + <menu_item_call label="Incluir la parte siguiente" name="Include Next Part"/> + <menu_item_call label="Incluir la parte previa" name="Include Previous Part"/> + </menu> <menu_item_call label="Visión en lo seleccionado" name="Focus on Selection"/> <menu_item_call label="Zoom en lo seleccionado" name="Zoom to Selection"/> - <menu_item_call label="Comprar el objeto" name="Menu Object Take"> - <on_enable userdata="Comprar el objeto,Coger el objeto" name="EnableBuyOrTake"/> - </menu_item_call> - <menu_item_call label="Coger una copia" name="Take Copy"/> - <menu_item_call label="Devolver una copia del objeto a los contenidos de donde salió" name="Save Object Back to Object Contents"/> - <menu_item_separator label="-----------" name="separator6"/> - <menu_item_call label="Ver en una ventana los errores o alertas de los scripts" name="Show Script Warning/Error Window"/> - <menu label="Recompilar los scripts en lo seleccionado" name="Recompile Scripts in Selection"> - <menu_item_call label="Mono" name="Mono"/> - <menu_item_call label="LSL" name="LSL"/> - </menu> - <menu_item_call label="Reiniciar los scripts en lo seleccionado" name="Reset Scripts in Selection"/> - <menu_item_call label="Definir los scripts a ejecutar en lo seleccionado" name="Set Scripts to Running in Selection"/> - <menu_item_call label="Definir los scripts a no ejecutar en lo seleccionado" name="Set Scripts to Not Running in Selection"/> + <menu label="Objeto" name="Object"> + <menu_item_call label="Comprar" name="Menu Object Buy"/> + <menu_item_call label="Tomar" name="Menu Object Take"/> + <menu_item_call label="Coger una copia" name="Take Copy"/> + <menu_item_call label="Guardar una copia en mi inventario" name="Save Object Back to My Inventory"/> + <menu_item_call label="Guardar una copia del objeto en los contenidos de donde salió" name="Save Object Back to Object Contents"/> + </menu> + <menu label="Scripts" name="Scripts"> + <menu_item_call label="Recompilar los scripts (Mono)" name="Mono"/> + <menu_item_call label="Recompilar los scripts (LSL)" name="LSL"/> + <menu_item_call label="Reiniciar los scripts" name="Reset Scripts"/> + <menu_item_call label="Definir los scripts a ejecutar" name="Set Scripts to Running"/> + <menu_item_call label="Configurar scripts como no ejecutándose" name="Set Scripts to Not Running"/> + </menu> + <menu label="Opciones" name="Options"> + <menu_item_call label="Configurar los permisos por defecto de subida" name="perm prefs"/> + <menu_item_check label="Mostrar los permisos avanzados" name="DebugPermissions"/> + <menu_item_check label="Seleccionar sólo mis objetos" name="Select Only My Objects"/> + <menu_item_check label="Seleccionar sólo los objetos movibles" name="Select Only Movable Objects"/> + <menu_item_check label="Seleccionar marcando los alrededores" name="Select By Surrounding"/> + <menu_item_check label="Al seleccionar, mostrar lo oculto" name="Show Hidden Selection"/> + <menu_item_check label="Al seleccionar, mostrar el radio de la luz" name="Show Light Radius for Selection"/> + <menu_item_check label="Mostrar el rayo indicador" name="Show Selection Beam"/> + <menu_item_check label="Ajustar a la cuadrÃcula" name="Snap to Grid"/> + <menu_item_call label="Ajustar a la cuadrÃcula los ejes X e Y" name="Snap Object XY to Grid"/> + <menu_item_call label="Usar lo seleccionado como cuadrÃcula" name="Use Selection for Grid"/> + <menu_item_call label="Opciones de la cuadrÃcula" name="Grid Options"/> + </menu> + <menu label="Subir" name="Upload"> + <menu_item_call label="Imagen ([COST] L$)..." name="Upload Image"/> + <menu_item_call label="Sonido ([COST] L$)..." name="Upload Sound"/> + <menu_item_call label="Animación ([COST] L$)..." name="Upload Animation"/> + <menu_item_call label="Masivo ([COST] L$ por archivo)..." name="Bulk Upload"/> + </menu> </menu> <menu label="Ayuda" name="Help"> <menu_item_call label="Ayuda de [SECOND_LIFE]" name="Second Life Help"/> - <menu_item_call label="Tutorial" name="Tutorial"/> - <menu_item_separator label="-----------" name="separator"/> - <menu_item_call label="Blog oficial..." name="Official Linden Blog..."/> - <menu_item_separator label="-----------" name="separator2"/> - <menu_item_call label="Portal de programación..." name="Scripting Portal..."/> - <menu_item_separator label="-----------" name="separator3"/> - <menu_item_call label="Denunciar una infracción..." name="Report Abuse..."/> - <menu_item_call label="Choques, empujones, e impactos..." name="Bumps, Pushes &amp; Hits..."/> - <menu_item_call label="Medidor del lag" name="Lag Meter"/> - <menu_item_separator label="-----------" name="separator7"/> - <menu label="Informes de fallos" name="Bug Reporting"> - <menu_item_call label="Public Issue Tracker..." name="Public Issue Tracker..."/> - <menu_item_call label="Ayuda del Public Issue Tracker..." name="Publc Issue Tracker Help..."/> - <menu_item_separator label="-----------" name="separator7"/> - <menu_item_call label="Informes de fallos - instrucciones..." name="Bug Reporing 101..."/> - <menu_item_call label="Problemas de seguridad..." name="Security Issues..."/> - <menu_item_call label="Wiki QA..." name="QA Wiki..."/> - <menu_item_separator label="-----------" name="separator9"/> - <menu_item_call label="Informar de un fallo..." name="Report Bug..."/> - </menu> - <menu_item_call label="Acerca de [APP_NAME]..." name="About Second Life..."/> + <menu_item_call label="Denunciar una infracción" name="Report Abuse"/> + <menu_item_call label="Informar de un fallo" name="Report Bug"/> + <menu_item_call label="Acerca de [APP_NAME]" name="About Second Life"/> + </menu> + <menu label="Avanzado" name="Advanced"> + <menu_item_check label="Mostrar el menú Avanzado" name="Show Advanced Menu"/> + <menu_item_call label="Parar mis animaciones" name="Stop Animating My Avatar"/> + <menu_item_call label="Recargar las texturas" name="Rebake Texture"/> + <menu_item_call label="Interfaz en el tamaño predeterminado" name="Set UI Size to Default"/> + <menu_item_call label="Definir el tamaño de la ventana..." name="Set Window Size..."/> + <menu_item_check label="Limitar la distancia para Seleccionar" name="Limit Select Distance"/> + <menu_item_check label="Desactivar los lÃmites de la cámara" name="Disable Camera Distance"/> + <menu_item_check label="Foto en Alta Resolución" name="HighResSnapshot"/> + <menu_item_check label="Silenciar el Guardar una foto" name="QuietSnapshotsToDisk"/> + <menu_item_check label="Comprimir las fotos para el disco duro" name="CompressSnapshotsToDisk"/> + <menu label="Herramientas de rendimiento" name="Performance Tools"> + <menu_item_call label="Medidor de lag" name="Lag Meter"/> + <menu_item_check label="EstadÃsticas" name="Statistics Bar"/> + <menu_item_check label="Mostrar cuánto cuesta renderizar el avatar" name="Avatar Rendering Cost"/> + </menu> + <menu label="Realzando y Visibilidad" name="Highlighting and Visibility"> + <menu_item_check label="Baliza con destellos" name="Cheesy Beacon"/> + <menu_item_check label="Ocultar las partÃculas" name="Hide Particles"/> + <menu_item_check label="Ocultar lo seleccionado" name="Hide Selected"/> + <menu_item_check label="Realzar las transparencias" name="Highlight Transparent"/> + <menu_item_check label="Mostrar los HUD anexados" name="Show HUD Attachments"/> + <menu_item_check label="Mostrar el Punto de Mira en la vista subjetiva" name="ShowCrosshairs"/> + </menu> + <menu label="Objetos representados" name="Rendering Types"> + <menu_item_check label="Simple" name="Simple"/> + <menu_item_check label="Alfa" name="Alpha"/> + <menu_item_check label="Ãrbol" name="Tree"/> + <menu_item_check label="Avatares" name="Character"/> + <menu_item_check label="Superficie del terreno" name="SurfacePath"/> + <menu_item_check label="Cielo" name="Sky"/> + <menu_item_check label="Agua" name="Water"/> + <menu_item_check label="Terreno" name="Ground"/> + <menu_item_check label="volumen" name="Volume"/> + <menu_item_check label="Hierba" name="Grass"/> + <menu_item_check label="Nubes" name="Clouds"/> + <menu_item_check label="PartÃculas" name="Particles"/> + <menu_item_check label="Efectos de relieve" name="Bump"/> + </menu> + <menu label="Rasgos renderizados" name="Rendering Features"> + <menu_item_check label="UI" name="UI"/> + <menu_item_check label="Seleccionado" name="Selected"/> + <menu_item_check label="Realzados" name="Highlighted"/> + <menu_item_check label="Texturas dinámicas" name="Dynamic Textures"/> + <menu_item_check label="Huellas" name="Foot Shadows"/> + <menu_item_check label="Niebla" name="Fog"/> + <menu_item_check label="Objetos flexibles" name="Flexible Objects"/> + </menu> + <menu_item_check label="Ejecutar múltiples temas" name="Run Multiple Threads"/> + <menu_item_check label="Usar Plugin Read Thread" name="Use Plugin Read Thread"/> + <menu_item_call label="Vaciar la caché de grupo" name="ClearGroupCache"/> + <menu_item_check label="Vista subjetiva suavizada" name="Mouse Smoothing"/> + <menu label="Atajos de teclado" name="Shortcuts"> + <menu_item_call label="Imagen ([COST] L$)..." name="Upload Image"/> + <menu_item_check label="Buscar" name="Search"/> + <menu_item_call label="Recuperar las teclas" name="Release Keys"/> + <menu_item_call label="Interfaz en el tamaño predeterminado" name="Set UI Size to Default"/> + <menu_item_check label="Correr siempre" name="Always Run"/> + <menu_item_check label="Volar" name="Fly"/> + <menu_item_call label="Cerrar la ventana" name="Close Window"/> + <menu_item_call label="Cerrar todas las ventanas" name="Close All Windows"/> + <menu_item_call label="Guardar una foto" name="Snapshot to Disk"/> + <menu_item_call label="Vista subjetiva" name="Mouselook"/> + <menu_item_check label="Flycam del joystick" name="Joystick Flycam"/> + <menu_item_call label="Volver a la vista por defecto" name="Reset View"/> + <menu_item_call label="Mirar al último que habló" name="Look at Last Chatter"/> + <menu label="Seleccionar la herramienta de construcción" name="Select Tool"> + <menu_item_call label="Herramienta Visión" name="Focus"/> + <menu_item_call label="Herramienta Mover" name="Move"/> + <menu_item_call label="Herramienta Editar" name="Edit"/> + <menu_item_call label="Herramienta Crear" name="Create"/> + <menu_item_call label="Herramienta Terreno" name="Land"/> + </menu> + <menu_item_call label="Acercar el zoom" name="Zoom In"/> + <menu_item_call label="Zoom por defecto" name="Zoom Default"/> + <menu_item_call label="Alejar el zoom" name="Zoom Out"/> + </menu> + <menu_item_call label="Mostrar las configuraciones del depurador" name="Debug Settings"/> + <menu_item_check label="Mostrar el menú 'Develop'" name="Debug Mode"/> + </menu> + <menu label="Develop" name="Develop"> + <menu label="Consoles" name="Consoles"> + <menu_item_check label="Texture Console" name="Texture Console"/> + <menu_item_check label="Debug Console" name="Debug Console"/> + <menu_item_call label="Notifications Console" name="Notifications"/> + <menu_item_check label="Texture Size Console" name="Texture Size"/> + <menu_item_check label="Texture Category Console" name="Texture Category"/> + <menu_item_check label="Fast Timers" name="Fast Timers"/> + <menu_item_check label="Memory" name="Memory"/> + <menu_item_call label="Region Info to Debug Console" name="Region Info to Debug Console"/> + <menu_item_check label="Camera" name="Camera"/> + <menu_item_check label="Wind" name="Wind"/> + <menu_item_check label="Badge" name="Badge"/> + </menu> + <menu label="Show Info" name="Display Info"> + <menu_item_check label="Show Time" name="Show Time"/> + <menu_item_check label="Show Render Info" name="Show Render Info"/> + <menu_item_check label="Show Color Under Cursor" name="Show Color Under Cursor"/> + <menu_item_check label="Show Updates to Objects" name="Show Updates"/> + </menu> + <menu label="Force an Error" name="Force Errors"> + <menu_item_call label="Force Breakpoint" name="Force Breakpoint"/> + <menu_item_call label="FForce LLError And Crash" name="Force LLError And Crash"/> + <menu_item_call label="Force Bad Memory Access" name="Force Bad Memory Access"/> + <menu_item_call label="Force an Infinite Loop" name="Force Infinite Loop"/> + <menu_item_call label="Force Driver Crash" name="Force Driver Carsh"/> + <menu_item_call label="Force Software Exception" name="Force Software Exception"/> + <menu_item_call label="Force Disconnect Viewer" name="Force Disconnect Viewer"/> + <menu_item_call label="Simulate a Memory Leak" name="Memory Leaking Simulation"/> + </menu> + <menu label="Render Tests" name="Render Tests"> + <menu_item_check label="Camera Offset" name="Camera Offset"/> + <menu_item_check label="Randomize Framerate" name="Randomize Framerate"/> + <menu_item_check label="Frame Test" name="Frame Test"/> + </menu> + <menu label="Rendering" name="Rendering"> + <menu_item_check label="Axes" name="Axes"/> + <menu_item_check label="Wireframe" name="Wireframe"/> + <menu_item_check label="Global Illumination" name="Global Illumination"/> + <menu_item_check label="Animation Textures" name="Animation Textures"/> + <menu_item_check label="Disable Textures" name="Disable Textures"/> + <menu_item_check label="Render Attached Lights" name="Render Attached Lights"/> + <menu_item_check label="Render Attached Particles" name="Render Attached Particles"/> + <menu_item_check label="Hover Glow Objects" name="Hover Glow Objects"/> + </menu> + <menu label="Red" name="Network"> + <menu_item_check label="Pause Avatar" name="AgentPause"/> + <menu_item_call label="Drop a Packet" name="Drop a Packet"/> + </menu> + <menu_item_call label="Bumps, Pushes & Hits" name="Bumps, Pushes &amp; Hits"/> + <menu label="World" name="World"> + <menu_item_check label="Region Sun Override" name="Sim Sun Override"/> + <menu_item_check label="Beacon flashing effect" name="Cheesy Beacon"/> + <menu_item_check label="Fixed Weather" name="Fixed Weather"/> + <menu_item_call label="Dump Region Object Cache" name="Dump Region Object Cache"/> + </menu> + <menu label="UI" name="UI"> + <menu_item_call label="Web Browser Test" name="Web Browser Test"/> + <menu_item_call label="Print Selected Object Info" name="Print Selected Object Info"/> + <menu_item_call label="Memory Stats" name="Memory Stats"/> + <menu_item_check label="Double-Click Auto-Pilot" name="Double-ClickAuto-Pilot"/> + <menu_item_check label="Debug Clicks" name="Debug Clicks"/> + <menu_item_check label="Debug Mouse Events" name="Debug Mouse Events"/> + </menu> + <menu label="XUI" name="XUI"> + <menu_item_call label="Reload Color Settings" name="Reload Color Settings"/> + <menu_item_call label="Show Font Test" name="Show Font Test"/> + <menu_item_call label="Load from XML" name="Load from XML"/> + <menu_item_call label="Save to XML" name="Save to XML"/> + <menu_item_check label="Show XUI Names" name="Show XUI Names"/> + <menu_item_call label="Send Test IMs" name="Send Test IMs"/> + </menu> + <menu label="Avatar" name="Character"> + <menu label="Grab Baked Texture" name="Grab Baked Texture"> + <menu_item_call label="Iris" name="Iris"/> + <menu_item_call label="Head" name="Head"/> + <menu_item_call label="Upper Body" name="Upper Body"/> + <menu_item_call label="Lower Body" name="Lower Body"/> + <menu_item_call label="Skirt" name="Skirt"/> + </menu> + <menu label="Character Tests" name="Character Tests"> + <menu_item_call label="Toggle Character Geometry" name="Toggle Character Geometry"/> + <menu_item_check label="Allow Select Avatar" name="Allow Select Avatar"/> + </menu> + <menu_item_call label="Force Params to Default" name="Force Params to Default"/> + <menu_item_check label="Animation Info" name="Animation Info"/> + <menu_item_check label="Slow Motion Animations" name="Slow Motion Animations"/> + <menu_item_check label="Disable Level Of Detail" name="Disable LOD"/> + <menu_item_check label="Show Collision Skeleton" name="Show Collision Skeleton"/> + <menu_item_check label="Display Agent Target" name="Display Agent Target"/> + <menu_item_call label="Debug Avatar Textures" name="Debug Avatar Textures"/> + </menu> + <menu_item_check label="HTTP Textures" name="HTTP Textures"/> + <menu_item_check label="Console Window on next Run" name="Console Window"/> + <menu_item_check label="Show Admin Menu" name="View Admin Options"/> + <menu_item_call label="Request Admin Status" name="Request Admin Options"/> + <menu_item_call label="Leave Admin Status" name="Leave Admin Options"/> + </menu> + <menu label="Admin" name="Admin"> + <menu label="Object"> + <menu_item_call label="Coger una copia" name="Take Copy"/> + <menu_item_call label="Force Owner To Me" name="Force Owner To Me"/> + <menu_item_call label="Force Owner Permissive" name="Force Owner Permissive"/> + <menu_item_call label="Eliminar" name="Delete"/> + <menu_item_call label="Lock" name="Lock"/> + </menu> + <menu label="Parcel" name="Parcel"> + <menu_item_call label="Force Owner To Me" name="Owner To Me"/> + <menu_item_call label="Set to Linden Content" name="Set to Linden Content"/> + <menu_item_call label="Claim Public Land" name="Claim Public Land"/> + </menu> + <menu label="Región" name="Region"> + <menu_item_call label="Dump Temporary Asset Data" name="Dump Temp Asset Data"/> + <menu_item_call label="Save Region State" name="Save Region State"/> + </menu> + <menu_item_call label="God Tools" name="God Tools"/> </menu> </menu_bar> diff --git a/indra/newview/skins/default/xui/es/menu_wearable_list_item.xml b/indra/newview/skins/default/xui/es/menu_wearable_list_item.xml new file mode 100644 index 0000000000..d5f106ff96 --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_wearable_list_item.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Outfit Wearable Context Menu"> + <menu_item_call label="Ponerme" name="wear"/> + <menu_item_call label="Añadir" name="wear_add"/> + <menu_item_call label="Quitarme / Quitar" name="take_off_or_detach"/> + <menu_item_call label="Quitar" name="detach"/> + <context_menu label="Anexar a â–¶" name="wearable_attach_to"/> + <context_menu label="Anexar al HUD â–¶" name="wearable_attach_to_hud"/> + <menu_item_call label="Quitarme" name="take_off"/> + <menu_item_call label="Editar" name="edit"/> + <menu_item_call label="Perfil del objeto" name="object_profile"/> + <menu_item_call label="Mostrar original" name="show_original"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/es/mime_types_linux.xml b/indra/newview/skins/default/xui/es/mime_types_linux.xml new file mode 100644 index 0000000000..77d05934f4 --- /dev/null +++ b/indra/newview/skins/default/xui/es/mime_types_linux.xml @@ -0,0 +1,217 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<mimetypes name="default"> + <widgetset name="web"> + <label name="web_label"> + Contenido web + </label> + <tooltip name="web_tooltip"> + Este sitio tiene contenido web + </tooltip> + <playtip name="web_playtip"> + Mostrar el contenido web + </playtip> + </widgetset> + <widgetset name="movie"> + <label name="movie_label"> + PelÃcula + </label> + <tooltip name="movie_tooltip"> + Aquà puede verse una pelÃcula + </tooltip> + <playtip name="movie_playtip"> + Ver la pelÃcula + </playtip> + </widgetset> + <widgetset name="image"> + <label name="image_label"> + Imagen + </label> + <tooltip name="image_tooltip"> + En este sitio hay una imagen + </tooltip> + <playtip name="image_playtip"> + Ver la imagen de esta localización + </playtip> + </widgetset> + <widgetset name="audio"> + <label name="audio_label"> + Audio + </label> + <tooltip name="audio_tooltip"> + En este sitio hay audio + </tooltip> + <playtip name="audio_playtip"> + OÃr el audio de este sitio + </playtip> + </widgetset> + <scheme name="rtsp"> + <label name="rtsp_label"> + Streaming en 'Real Time' + </label> + </scheme> + <mimetype name="blank"> + <label name="blank_label"> + - VacÃo - + </label> + </mimetype> + <mimetype name="none/none"> + <label name="none/none_label"> + - VacÃo - + </label> + </mimetype> + <mimetype name="audio/*"> + <label name="audio2_label"> + Audio + </label> + </mimetype> + <mimetype name="video/*"> + <label name="video2_label"> + VÃdeo + </label> + </mimetype> + <mimetype name="image/*"> + <label name="image2_label"> + Imagen + </label> + </mimetype> + <mimetype name="video/vnd.secondlife.qt.legacy"> + <label name="vnd.secondlife.qt.legacy_label"> + PelÃcula (QuickTime) + </label> + </mimetype> + <mimetype name="application/javascript"> + <label name="application/javascript_label"> + Javascript + </label> + </mimetype> + <mimetype name="application/ogg"> + <label name="application/ogg_label"> + Audio/VÃdeo Ogg + </label> + </mimetype> + <mimetype name="application/pdf"> + <label name="application/pdf_label"> + Documento PDF + </label> + </mimetype> + <mimetype name="application/postscript"> + <label name="application/postscript_label"> + Documento Postscript + </label> + </mimetype> + <mimetype name="application/rtf"> + <label name="application/rtf_label"> + Texto enriquecido (RTF) + </label> + </mimetype> + <mimetype name="application/smil"> + <label name="application/smil_label"> + Synchronized Multimedia Integration Language (SMIL) + </label> + </mimetype> + <mimetype name="application/xhtml+xml"> + <label name="application/xhtml+xml_label"> + Página web (XHTML) + </label> + </mimetype> + <mimetype name="application/x-director"> + <label name="application/x-director_label"> + Macromedia Director + </label> + </mimetype> + <mimetype name="audio/mid"> + <label name="audio/mid_label"> + Audio (MIDI) + </label> + </mimetype> + <mimetype name="audio/mpeg"> + <label name="audio/mpeg_label"> + Audio (MP3) + </label> + </mimetype> + <mimetype name="audio/x-aiff"> + <label name="audio/x-aiff_label"> + Audio (AIFF) + </label> + </mimetype> + <mimetype name="audio/x-wav"> + <label name="audio/x-wav_label"> + Audio (WAV) + </label> + </mimetype> + <mimetype name="image/bmp"> + <label name="image/bmp_label"> + Imagen (BMP) + </label> + </mimetype> + <mimetype name="image/gif"> + <label name="image/gif_label"> + Imagen (GIF) + </label> + </mimetype> + <mimetype name="image/jpeg"> + <label name="image/jpeg_label"> + Imagen (JPEG) + </label> + </mimetype> + <mimetype name="image/png"> + <label name="image/png_label"> + Imagen (PNG) + </label> + </mimetype> + <mimetype name="image/svg+xml"> + <label name="image/svg+xml_label"> + Imagen (SVG) + </label> + </mimetype> + <mimetype name="image/tiff"> + <label name="image/tiff_label"> + Imagen (TIFF) + </label> + </mimetype> + <mimetype name="text/html"> + <label name="text/html_label"> + Página web + </label> + </mimetype> + <mimetype name="text/plain"> + <label name="text/plain_label"> + Texto + </label> + </mimetype> + <mimetype name="text/xml"> + <label name="text/xml_label"> + XML + </label> + </mimetype> + <mimetype name="video/mpeg"> + <label name="video/mpeg_label"> + PelÃcula (MPEG) + </label> + </mimetype> + <mimetype name="video/mp4"> + <label name="video/mp4_label"> + PelÃcula (MP4) + </label> + </mimetype> + <mimetype name="video/quicktime"> + <label name="video/quicktime_label"> + PelÃcula (QuickTime) + </label> + </mimetype> + <mimetype name="video/x-ms-asf"> + <label name="video/x-ms-asf_label"> + PelÃcula (Windows Media ASF) + </label> + </mimetype> + <mimetype name="video/x-ms-wmv"> + <label name="video/x-ms-wmv_label"> + PelÃcula (Windows Media WMV) + </label> + </mimetype> + <mimetype name="video/x-msvideo"> + <label name="video/x-msvideo_label"> + PelÃcula (AVI) + </label> + </mimetype> +</mimetypes> diff --git a/indra/newview/skins/default/xui/es/mime_types_mac.xml b/indra/newview/skins/default/xui/es/mime_types_mac.xml new file mode 100644 index 0000000000..77d05934f4 --- /dev/null +++ b/indra/newview/skins/default/xui/es/mime_types_mac.xml @@ -0,0 +1,217 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<mimetypes name="default"> + <widgetset name="web"> + <label name="web_label"> + Contenido web + </label> + <tooltip name="web_tooltip"> + Este sitio tiene contenido web + </tooltip> + <playtip name="web_playtip"> + Mostrar el contenido web + </playtip> + </widgetset> + <widgetset name="movie"> + <label name="movie_label"> + PelÃcula + </label> + <tooltip name="movie_tooltip"> + Aquà puede verse una pelÃcula + </tooltip> + <playtip name="movie_playtip"> + Ver la pelÃcula + </playtip> + </widgetset> + <widgetset name="image"> + <label name="image_label"> + Imagen + </label> + <tooltip name="image_tooltip"> + En este sitio hay una imagen + </tooltip> + <playtip name="image_playtip"> + Ver la imagen de esta localización + </playtip> + </widgetset> + <widgetset name="audio"> + <label name="audio_label"> + Audio + </label> + <tooltip name="audio_tooltip"> + En este sitio hay audio + </tooltip> + <playtip name="audio_playtip"> + OÃr el audio de este sitio + </playtip> + </widgetset> + <scheme name="rtsp"> + <label name="rtsp_label"> + Streaming en 'Real Time' + </label> + </scheme> + <mimetype name="blank"> + <label name="blank_label"> + - VacÃo - + </label> + </mimetype> + <mimetype name="none/none"> + <label name="none/none_label"> + - VacÃo - + </label> + </mimetype> + <mimetype name="audio/*"> + <label name="audio2_label"> + Audio + </label> + </mimetype> + <mimetype name="video/*"> + <label name="video2_label"> + VÃdeo + </label> + </mimetype> + <mimetype name="image/*"> + <label name="image2_label"> + Imagen + </label> + </mimetype> + <mimetype name="video/vnd.secondlife.qt.legacy"> + <label name="vnd.secondlife.qt.legacy_label"> + PelÃcula (QuickTime) + </label> + </mimetype> + <mimetype name="application/javascript"> + <label name="application/javascript_label"> + Javascript + </label> + </mimetype> + <mimetype name="application/ogg"> + <label name="application/ogg_label"> + Audio/VÃdeo Ogg + </label> + </mimetype> + <mimetype name="application/pdf"> + <label name="application/pdf_label"> + Documento PDF + </label> + </mimetype> + <mimetype name="application/postscript"> + <label name="application/postscript_label"> + Documento Postscript + </label> + </mimetype> + <mimetype name="application/rtf"> + <label name="application/rtf_label"> + Texto enriquecido (RTF) + </label> + </mimetype> + <mimetype name="application/smil"> + <label name="application/smil_label"> + Synchronized Multimedia Integration Language (SMIL) + </label> + </mimetype> + <mimetype name="application/xhtml+xml"> + <label name="application/xhtml+xml_label"> + Página web (XHTML) + </label> + </mimetype> + <mimetype name="application/x-director"> + <label name="application/x-director_label"> + Macromedia Director + </label> + </mimetype> + <mimetype name="audio/mid"> + <label name="audio/mid_label"> + Audio (MIDI) + </label> + </mimetype> + <mimetype name="audio/mpeg"> + <label name="audio/mpeg_label"> + Audio (MP3) + </label> + </mimetype> + <mimetype name="audio/x-aiff"> + <label name="audio/x-aiff_label"> + Audio (AIFF) + </label> + </mimetype> + <mimetype name="audio/x-wav"> + <label name="audio/x-wav_label"> + Audio (WAV) + </label> + </mimetype> + <mimetype name="image/bmp"> + <label name="image/bmp_label"> + Imagen (BMP) + </label> + </mimetype> + <mimetype name="image/gif"> + <label name="image/gif_label"> + Imagen (GIF) + </label> + </mimetype> + <mimetype name="image/jpeg"> + <label name="image/jpeg_label"> + Imagen (JPEG) + </label> + </mimetype> + <mimetype name="image/png"> + <label name="image/png_label"> + Imagen (PNG) + </label> + </mimetype> + <mimetype name="image/svg+xml"> + <label name="image/svg+xml_label"> + Imagen (SVG) + </label> + </mimetype> + <mimetype name="image/tiff"> + <label name="image/tiff_label"> + Imagen (TIFF) + </label> + </mimetype> + <mimetype name="text/html"> + <label name="text/html_label"> + Página web + </label> + </mimetype> + <mimetype name="text/plain"> + <label name="text/plain_label"> + Texto + </label> + </mimetype> + <mimetype name="text/xml"> + <label name="text/xml_label"> + XML + </label> + </mimetype> + <mimetype name="video/mpeg"> + <label name="video/mpeg_label"> + PelÃcula (MPEG) + </label> + </mimetype> + <mimetype name="video/mp4"> + <label name="video/mp4_label"> + PelÃcula (MP4) + </label> + </mimetype> + <mimetype name="video/quicktime"> + <label name="video/quicktime_label"> + PelÃcula (QuickTime) + </label> + </mimetype> + <mimetype name="video/x-ms-asf"> + <label name="video/x-ms-asf_label"> + PelÃcula (Windows Media ASF) + </label> + </mimetype> + <mimetype name="video/x-ms-wmv"> + <label name="video/x-ms-wmv_label"> + PelÃcula (Windows Media WMV) + </label> + </mimetype> + <mimetype name="video/x-msvideo"> + <label name="video/x-msvideo_label"> + PelÃcula (AVI) + </label> + </mimetype> +</mimetypes> diff --git a/indra/newview/skins/default/xui/es/notifications.xml b/indra/newview/skins/default/xui/es/notifications.xml index 6b58bbea47..1ec29d6029 100644 --- a/indra/newview/skins/default/xui/es/notifications.xml +++ b/indra/newview/skins/default/xui/es/notifications.xml @@ -9,74 +9,45 @@ <global name="implicitclosebutton"> Cerrar </global> - <template name="okbutton"> - <form> - <button - name="OK" - text="$yestext"/> - </form> - </template> - - <template name="okignore"> - <form> - <button - name="OK" - text="$yestext"/> - <ignore text="$ignoretext"/> - </form> - </template> - - <template name="okcancelbuttons"> - <form> - <button - name="OK" - text="$yestext"/> - <button - name="Cancel" - text="$notext"/> - </form> - </template> - - <template name="okcancelignore"> - <form> - <button - name="OK" - text="$yestext"/> - <button - name="Cancel" - text="$notext"/> - <ignore text="$ignoretext"/> - </form> - </template> - - <template name="okhelpbuttons"> - <form> - <button - name="OK" - text="$yestext"/> - <button - name="Help" - text="$helptext"/> - </form> - </template> - - <template name="yesnocancelbuttons"> - <form> - <button - name="Yes" - text="$yestext"/> - <button - name="No" - text="$notext"/> - <button - name="Cancel" - text="$canceltext"/> - </form> - </template> - <notification functor="GenericAcknowledge" label="Mensaje de alerta desconocida" name="MissingAlert"> - Su versión de [APP_NAME] no sabe cómo mostrar el mensaje de alerta que acaba de recibir. - -Detalles del error: no se ha encontrado en notifications.xml la alerta llamada '[_NAME]'. + <template name="okbutton"> + <form> + <button name="OK_okbutton" text="$yestext"/> + </form> + </template> + <template name="okignore"> + <form> + <button name="OK_okignore" text="$yestext"/> + </form> + </template> + <template name="okcancelbuttons"> + <form> + <button name="OK_okcancelbuttons" text="$yestext"/> + <button name="Cancel_okcancelbuttons" text="$notext"/> + </form> + </template> + <template name="okcancelignore"> + <form> + <button name="OK_okcancelignore" text="$yestext"/> + <button name="Cancel_okcancelignore" text="$notext"/> + </form> + </template> + <template name="okhelpbuttons"> + <form> + <button name="OK_okhelpbuttons" text="$yestext"/> + <button name="Help" text="$helptext"/> + </form> + </template> + <template name="yesnocancelbuttons"> + <form> + <button name="Yes" text="$yestext"/> + <button name="No" text="$notext"/> + <button name="Cancel_yesnocancelbuttons" text="$canceltext"/> + </form> + </template> + <notification functor="GenericAcknowledge" label="Mensaje de notificación desconocida" name="MissingAlert"> + Tu versión de [APP_NAME] no sabe cómo mostrar la notificación que acaba de recibir. Por favor, comprueba que tienes instalado el último Visor. + +Detalles del error: la notificación de nombre '[_NAME]' no se ha encontrado en notifications.xml. <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="FloaterNotFound"> @@ -97,62 +68,62 @@ Detalles del error: no se ha encontrado en notifications.xml la alerta llamada & <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="SÃ"/> </notification> <notification name="BadInstallation"> - Ha habido un error al actualizar [APP_NAME]. Por favor, descargue la última versión desde secondlife.com. - <usetemplate - name="okbutton" - yestext="OK"/> + Ha habido un error actualizando [APP_NAME]. Por favor, [http://get.secondlife.com descarga la última versión] del Visor. + <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="LoginFailedNoNetwork"> - Error de red: no se ha podido conectar. + No se puede conectar con [SECOND_LIFE_GRID]. '[DIAGNOSTIC]' -Por favor, revise su conexión a internet. - <usetemplate - name="okbutton" - yestext="OK"/> +Asegúrate de que tu conexión a Internet está funcionando adecuadamente. + <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="MessageTemplateNotFound"> No se ha encontrado la plantilla de mensaje [PATH]. - <usetemplate - name="okbutton" - yestext="OK"/> + <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="WearableSave"> ¿Guardar los cambios en las ropas o partes del cuerpo actuales? <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="No guardarlos" yestext="Guardarlos"/> </notification> <notification name="CompileQueueSaveText"> - Hubo un problema al subir el texto de un script por la siguiente razón: [REASON]. Por favor, inténtelo más tarde. + Hubo un problema al subir el texto de un script por la siguiente razón: [REASON]. Por favor, inténtalo más tarde. </notification> <notification name="CompileQueueSaveBytecode"> - Hubo un problema al subir el script compilado por la siguiente razón: [REASON]. Por favor, inténtelo más tarde. + Hubo un problema al subir el script compilado por la siguiente razón: [REASON]. Por favor, inténtalo más tarde. </notification> <notification name="WriteAnimationFail"> - Hubo un problema al escribir los datos de la animación. Por favor, inténtelo más tarde. + Hubo un problema al escribir los datos de la animación. Por favor, inténtalo más tarde. </notification> <notification name="UploadAuctionSnapshotFail"> Hubo un problema al subir la foto de la subasta por la siguiente razón: [REASON] </notification> <notification name="UnableToViewContentsMoreThanOne"> - No se puede ver a la vez los contenidos de más de un Ãtem. Por favor, elija un solo objeto y vuelva a intentarlo. + No se puede ver a la vez los contenidos de más de un Ãtem. Por favor, elige un solo objeto y vuelve a intentarlo. </notification> <notification name="SaveClothingBodyChanges"> ¿Guardar todos los cambios en la ropa y partes del cuerpo? <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="No guardarlos" yestext="Guardarlos todos"/> </notification> + <notification name="FriendsAndGroupsOnly"> + Quienes no sean tus amigos no sabrán que has elegido ignorar sus llamadas y mensajes instantáneos. + <usetemplate name="okbutton" yestext="OK"/> + </notification> <notification name="GrantModifyRights"> - Al conceder derechos de modificación a otro residente le autoriza a cambiar, borrar, o coger CUALQUIER objeto que usted tenga en el mundo. Sea MUY cuidadoso dando este permiso. ¿Quiere conceder derechos de modificación a [FIRST_NAME] [LAST_NAME]? + Al conceder permisos de modificación a otro Residente, le estás permitiendo cambiar, borrar o tomar CUALQUIER objeto que tengas en el mundo. Sé MUY cuidadoso al conceder este permiso. +¿Quieres conceder permisos de modificación a [FIRST_NAME] [LAST_NAME]? <usetemplate name="okcancelbuttons" notext="No" yestext="SÃ"/> </notification> <notification name="GrantModifyRightsMultiple"> - Al conceder derechos de modificación a otros residentes les autoriza a cambiar, borrar, o coger CUALQUIER objeto que usted tenga en el mundo. Sea MUY cuidadoso dando este permiso. ¿Quiere conceder derechos de modificación a los residentes seleccionados? + Al conceder permisos de modificación a otro Residente, le estás permitiendo cambiar CUALQUIER objeto que tengas en el mundo. Sé MUY cuidadoso al conceder este permiso. +¿Quieres conceder permisos de modificación a los Residentes elegidos? <usetemplate name="okcancelbuttons" notext="No" yestext="SÃ"/> </notification> <notification name="RevokeModifyRights"> - ¿Quiere revocar los derechos de modificación a [FIRST_NAME] [LAST_NAME]? + ¿Quieres revocar los derechos de modificación a [FIRST_NAME] [LAST_NAME]? <usetemplate name="okcancelbuttons" notext="No" yestext="SÃ"/> </notification> <notification name="RevokeModifyRightsMultiple"> - ¿Quiere revocar los derechos de modificación a los residentes seleccionados? + ¿Quieres revocar los derechos de modificación a los residentes seleccionados? <usetemplate name="okcancelbuttons" notext="No" yestext="SÃ"/> </notification> <notification name="UnableToCreateGroup"> @@ -166,115 +137,78 @@ Por favor, revise su conexión a internet. <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Ignorar los cambios" yestext="Aplicar los cambios"/> </notification> <notification name="MustSpecifyGroupNoticeSubject"> - Para enviar un aviso de grupo debe especificar un asunto. + Para enviar un aviso de grupo debes especificar un asunto. <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="AddGroupOwnerWarning"> - Va a añadir miembros al rol de [ROLE_NAME]. -No podrá removérseles de ese rol, sino que deberán renunciar a él por sà mismos. -¿Está seguro de que quiere seguir? - <usetemplate ignoretext="Cuando se añaden miembros del grupo al rol de propietario" name="okcancelignore" notext="No" yestext="SÃ"/> + Vas a añadir miembros al rol de [ROLE_NAME]. +No podrás removérseles de ese rol, sino que deberán renunciar a él por sà mismos. +¿Estás seguro de que quieres seguir? + <usetemplate ignoretext="Confirmar que vas a añadir un nuevo propietario al grupo" name="okcancelignore" notext="No" yestext="SÃ"/> </notification> <notification name="AssignDangerousActionWarning"> - Va a añadir la capacidad '[ACTION_NAME]' al rol '[ROLE_NAME]'. + Vas a añadir la capacidad '[ACTION_NAME]' al rol '[ROLE_NAME]'. *ATENCIÓN* - Todos los miembros con esta capacidad podrán asignarse a sà mismos -y a otros miembros- roles con mayores poderes de los que actualmente tienen. Potencialmente, podrÃan elevarse hasta poderes cercanos a los del propietario. Asegúrese de lo que está haciendo antes de otorgar esta capacidad. + Todos los miembros con esta capacidad podrán asignarse a sà mismos -y a otros miembros- roles con mayores poderes de los que actualmente tienen. Potencialmente, podrÃan elevarse hasta poderes cercanos a los del propietario. Asegúrate de lo que estás haciendo antes de otorgar esta capacidad. ¿Añadir esta capacidad a '[ROLE_NAME]'? <usetemplate name="okcancelbuttons" notext="No" yestext="SÃ"/> </notification> <notification name="AssignDangerousAbilityWarning"> - Va a añadir la capacidad '[ACTION_NAME]' al rol '[ROLE_NAME]'. + Vas a añadir la capacidad '[ACTION_NAME]' al rol '[ROLE_NAME]'. *ATENCIÓN* Todos los miembros con esta capacidad podrán asignarse a sà mismos -y a otros miembros- todas las capacidades, elevándose hasta poderes cercanos a los del propietario. ¿Añadir esta capacidad a '[ROLE_NAME]'? <usetemplate name="okcancelbuttons" notext="No" yestext="SÃ"/> </notification> - <notification name="ClickPublishHelpLand"> - Seleccionar 'Publicar en la web' -Marcando este Ãtem, se mostrará: -- esta parcela en los resultados de la búsqueda -- los objetos públicos de esta parcela -- esta parcela en la búsqueda de la web - </notification> - <notification name="ClickSoundHelpLand"> - Los media y la música sólo pueden disfrutarse dentro de la parcela. Según el nivel de calificación de los residentes, las opciones de sonido y de voz pueden ceñirse a la parcela u oÃrse fuera de ella. ¿Quiere ir a la Base de Conocimientos para aprender más sobre cómo configurar estas opciones? - <url name="url"> - https://support.secondlife.com/ics/support/default.asp?deptID=4417&task=knowledge&questionID=5046 - </url> - <usetemplate - name="okcancelbuttons" - yestext="Ir a la Base de Conocimientos" - notext="Cerrar" /> - </notification> - <notification name="ClickSearchHelpAll"> - Los resultados de la búsqueda se organizan según la pestaña en que esté, su nivel de calificación, la categorÃa elegida, y otros factores. Para más detalles, vea, por favor, la Base de Conocimientos. - <url name="url"> - https://support.secondlife.com/ics/support/default.asp?deptID=4417&task=knowledge&questionID=4722 - </url> - <usetemplate - name="okcancelbuttons" - yestext="Ir a la Base de Conocimientos" - notext="Cerrar" /> - </notification> - <notification name="ClickPublishHelpLandDisabled"> - No puede hacer que esta parcela aparezca en la búsqueda, porque está situada en una región que lo prohÃbe. - </notification> - <notification name="ClickPublishHelpAvatar"> - Al seleccionar 'Mostrar en la búsqueda' se mostrará: -- mi perfil en los resultados de la búsqueda -- un enlace a mi perfil en las páginas públicas de grupo - </notification> - <notification name="ClickPartnerHelpAvatar"> - Puede proponérselo a otro residente o disolver su relación con un/a compañero/a en el sitio web de [SECOND_LIFE]. - -¿Ir al sitio web de [SECOND_LIFE] para tener más información sobre este asunto? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Ir a la página"/> - </notification> - <notification name="ClickUploadHelpPermissions"> - Sus permisos por defecto no funcionarán en regiones antiguas. - </notification> - <notification name="ClickWebProfileHelpAvatar"> - Si este residente ha indicado una URL para mostrar un perfil en la web, usted puede: - * Pulsar 'Cargar' para ver la página en esta pestaña web. - * Pulsar Cargar > 'En un navegador externo' para ver la página en su navegador por defecto. - * Pulsar Cargar > 'URL Inicio' para volver al perfil en la web de este residente si usted ha estado navegando por otros sitios. - -Cuando esté viendo su propio perfil, puede introducir cualquier URL como su perfil web, y pulsar OK para fijarla. -Los demás residentes podrán visitar la URL que usted haya elegido cuando vean su perfil. + <notification name="AttachmentDrop"> + Vas a soltar tu anexado. + ¿Estás seguro de que quieres continuar? + <usetemplate ignoretext="Confirmar antes de soltar anexados" name="okcancelignore" notext="No" yestext="SÃ"/> </notification> <notification name="JoinGroupCanAfford"> Entrar a este grupo cuesta [COST] L$. -¿Quiere hacerlo?? +¿Quieres hacerlo?? + <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Entrar"/> + </notification> + <notification name="JoinGroupNoCost"> + Vas a entrar al grupo [NAME]. +¿Quieres seguir? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Entrar"/> </notification> <notification name="JoinGroupCannotAfford"> Entrar a este grupo cuesta [COST] L$. -No tiene dinero suficiente para entrar. +No tienes dinero suficiente para entrar. + </notification> + <notification name="CreateGroupCost"> + Crear este grupo te costará 100 L$. +Los grupos necesitan más de un miembro. Si no, son borrados permanentemente. +Por favor, invita a miembros en las próximas 48 horas. + <usetemplate canceltext="Cancelar" name="okcancelbuttons" notext="Cancelar" yestext="Crear un grupo por 100 L$"/> </notification> <notification name="LandBuyPass"> - Por [COST] L$ puede entrar a este terreno ('[PARCEL_NAME]') durante [TIME] horas. ¿Comprar un pase? + Por [COST] L$ puedes entrar a este terreno ('[PARCEL_NAME]') durante [TIME] horas. ¿Comprar un pase? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="SalePriceRestriction"> El precio de venta tiene que ser mayor de 0 L$ si la venta es a cualquiera. -Por favor, elija a alguien concreto como comprador si la venta es por 0 L$. +Por favor, elige a alguien concreto como comprador si la venta es por 0 L$. </notification> <notification name="ConfirmLandSaleChange"> Los [LAND_SIZE] m² de terreno seleccionados se van a poner a la venta. -Su precio de venta será de [SALE_PRICE] L$, y se autorizará la compra sólo a [NAME]. +El precio de venta será de [SALE_PRICE] L$, y se autorizará la compra sólo a [NAME]. <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="ConfirmLandSaleToAnyoneChange"> - ATENCIÓN: Al pulsar 'vender a cualquiera', su terreno estará disponible para toda la comunidad de [SECOND_LIFE], incluso para quienes no están en esta región. + ATENCIÓN: Marcando 'vender a cualquiera' hace que tu terreno esté disponible para toda la comunidad de [SECOND_LIFE], incluso para quienes no están en esta región. -Los [LAND_SIZE] m² de terreno seleccionados se van a poner a la venta. -Su precio de venta será de [SALE_PRICE] L$, y se autorizará la compra a [NAME]. +Los [LAND_SIZE] m² seleccionados de terreno se van a poner a la venta. +El precio de venta será de [SALE_PRICE] L$ y se autoriza la compra a [NAME]. <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="ReturnObjectsDeededToGroup"> - ¿Está seguro de que quiere devolver todos los objetos de esta parcela que estén compartidos con el grupo '[NAME]' al inventario de su propietario anterior? + ¿Estás seguro de que quieres devolver todos los objetos de esta parcela que estén compartidos con el grupo '[NAME]' al inventario de su propietario anterior? *ATENCIÓN* ¡Esto borrará los objetos no transferibles que se hayan cedido al grupo! @@ -282,19 +216,19 @@ Objetos: [N] <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="ReturnObjectsOwnedByUser"> - ¿Está seguro de que quiere devolver al inventario de '[NAME]' todos los objetos que sean de su propiedad en esta parcela? + ¿Estás seguro de que quieres devolver al inventario de '[NAME]' todos los objetos que sean de su propiedad en esta parcela? Objetos: [N] <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="ReturnObjectsOwnedBySelf"> - ¿Está seguro de que quiere devolver a su inventario todos los objetos de los que usted es propietario en esta parcela? + ¿Estás seguro de que quieres devolver a su inventario todos los objetos de los que eres propietario en esta parcela? Objetos: [N] <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="ReturnObjectsNotOwnedBySelf"> - ¿Está seguro de que quiere devolver todos los objetos de los que usted NO es propietario en esta parcela al inventario de sus propietarios? + ¿Estás seguro de que quieres devolver todos los objetos de los que NO eres propietario en esta parcela al inventario de sus propietarios? Los objetos transferibles que se hayan transferido al grupo se devolverán a sus propietarios previos. *ATENCIÓN* ¡Esto borrará los objetos no transferibles que se hayan cedido al grupo! @@ -303,7 +237,7 @@ Objetos: [N] <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="ReturnObjectsNotOwnedByUser"> - ¿Está seguro de que quiere devolver todos los objetos de esta parcela que NO sean propiedad de [NAME] al inventario de su propietario? + ¿Estás seguro de que quieres devolver todos los objetos de esta parcela que NO sean propiedad de [NAME] al inventario de su propietario? Los objetos transferibles que se hayan transferido al grupo se devolverán a sus propietarios previos. *ATENCIÓN* ¡Esto borrará los objetos no transferibles que se hayan cedido al grupo! @@ -312,11 +246,11 @@ Objetos: [N] <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="ReturnAllTopObjects"> - ¿Está seguro de que quiere devolver al inventario de su propietario todos los objetos de la lista? + ¿Estás seguro de que quieres devolver al inventario de su propietario todos los objetos de la lista? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="DisableAllTopObjects"> - ¿Está seguro de que quiere desactivar todos los objetos de esta región? + ¿Estás seguro de que quieres desactivar todos los objetos de esta región? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="ReturnObjectsNotOwnedByGroup"> @@ -330,15 +264,21 @@ Objetos: [N] Toda esta región tiene activado el 'daño'. Para que funcionen las armas los scripts deben estar activados. </notification> + <notification name="MultipleFacesSelected"> + Están seleccionadas varias caras. +Si sigues con esta acción, en las diferentes caras del objeto aparecerán distintas peticiones de los media. +Para colocar los media en una sola cara, marca la opción Elegir la cara y pulsa en la cara adecuada del objeto, y luego pulsa Añadir. + <usetemplate ignoretext="Los media se configurarán en las varias caras seleccionadas" name="okcancelignore" notext="Cancelar" yestext="OK"/> + </notification> <notification name="MustBeInParcel"> Para configurar el Punto de llegada de la parcela, -debe estar usted dentro de ella. +debes estar dentro de ella. </notification> <notification name="PromptRecipientEmail"> - Por favor, escriba una dirección de correo electrónica válida para el/los receptor/es. + Por favor, escribe una dirección de correo electrónica válida para el/los receptor/es. </notification> <notification name="PromptSelfEmail"> - Por favor, escriba su dirección de correo electrónico. + Por favor, escribe tu dirección de correo electrónico. </notification> <notification name="PromptMissingSubjMsg"> ¿Foto por correo electrónico con el asunto o el mensaje por defecto? @@ -357,46 +297,62 @@ debe estar usted dentro de ella. Hubo un problema al subir la captura de pantalla del informe por la siguiente razón: [REASON] </notification> <notification name="MustAgreeToLogIn"> - Debe estar de acuerdo con las Condiciones del Servicio para continuar el inicio de sesión en [SECOND_LIFE]. + Debes estar de acuerdo con las Condiciones del Servicio para continuar el inicio de sesión en [SECOND_LIFE]. </notification> <notification name="CouldNotPutOnOutfit"> - No se ha podido ponerle el vestuario. + No se ha podido poner el vestuario. La carpeta del vestuario contiene partes del cuerpo, u objetos a anexar o que no son ropa. </notification> <notification name="CannotWearTrash"> - No puede vestirse ropas o partes del cuerpo que están en la Papelera + No puedes vestirte ropas o partes del cuerpo que estén en la Papelera + </notification> + <notification name="MaxAttachmentsOnOutfit"> + No se puede anexar el objeto. +Se ha superado el lÃmite máximo de [MAX_ATTACHMENTS] objetos. Por favor, quÃtate alguno. </notification> <notification name="CannotWearInfoNotComplete"> - No puede vestirse este Ãtem porque aún no se ha cargado. Por favor, reinténtelo en un minuto. + No puedes vestirte este Ãtem porque aún no se ha cargado. Por favor, inténtalo de nuevo en un minuto. </notification> <notification name="MustHaveAccountToLogIn"> ¡Vaya! Algo se quedó en blanco. -Debe escribir tanto el nombre como el apellido de su avatar, los dos. +Debes escribir tanto el nombre como el apellido de tu avatar, los dos. -Necesita una cuenta para entrar en [SECOND_LIFE]. ¿Quiere crear una ahora? +Necesitas una cuenta para entrar en [SECOND_LIFE]. ¿Quieres crear una ahora? <url name="url"> https://join.secondlife.com/index.php?lang=es-ES </url> <usetemplate name="okcancelbuttons" notext="Volver a intentarlo" yestext="Crear una cuenta nueva"/> </notification> + <notification name="InvalidCredentialFormat"> + Escribe el nombre y apellido de tu avatar en el campo Nombre de usuario e inicia sesión otra vez. + </notification> <notification name="AddClassified"> - Los anuncios clasificados aparecen durante una semana en la sección 'Clasificados' del directorio Buscar y en [http://secondlife.com/community/classifieds/?lang=es-ES secondlife.com]. -Rellene su anuncio y pulse 'Publicar...' para añadirlo al directorio. -Cuando pulse Publicar, se le preguntará por un precio a pagar. -El pagar más hará que su anuncio aparezca más arriba en la lista, y que también aparezca más arriba cuando la gente busque por palabras clave. - <usetemplate ignoretext="Cuando se añade un nuevo Clasificado" name="okcancelignore" notext="Cancelar" yestext="OK"/> + Los anuncios clasificados aparecen durante una semana en la sección 'Clasificados' de la búsqueda y en [http://secondlife.com/community/classifieds secondlife.com]. +Rellena tu anuncio y pulsa 'Publicar...' para añadirlo al directorio. +Cuando pulses Publicar, se te preguntará por un precio a pagar. +El pagar más hará que tu anuncio aparezca más arriba en la lista, y que también aparezca más arriba en la lista cuando la gente busque por palabras clave. + <usetemplate ignoretext="Cómo crear un anuncio clasificado nuevo." name="okcancelignore" notext="Cancelar" yestext="OK"/> </notification> <notification name="DeleteClassified"> ¿Borrar el clasificado '[NAME]'? No se reembolsan las cuotas pagadas. <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> + <notification name="DeleteMedia"> + Has elegido borrar los media asociados a esta cara. +¿Estás seguro de que quieres continuar? + <usetemplate ignoretext="Confirmar antes de borrar los media de un objeto" name="okcancelignore" notext="No" yestext="SÃ"/> + </notification> <notification name="ClassifiedSave"> ¿Guardar los cambios en el clasificado [NAME]? <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="No guardar" yestext="Guardar"/> </notification> + <notification name="ClassifiedInsufficientFunds"> + Dinero insuficiente para crear un clasificado. + <usetemplate name="okbutton" yestext="OK"/> + </notification> <notification name="DeleteAvatarPick"> - ¿Borrar el destacado [PICK]? + ¿Borrar el destacado <nolink>[PICK]</nolink>? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="PromptGoToEventsPage"> @@ -407,31 +363,23 @@ No se reembolsan las cuotas pagadas. <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="SelectProposalToView"> - Por favor, seleccione qué propuesta quiere ver. + Por favor, selecciona qué propuesta quieres ver. </notification> <notification name="SelectHistoryItemToView"> - Por favor, seleccione un Ãtem del historial para verlo. - </notification> - <notification name="ResetShowNextTimeDialogs"> - ¿Quiere reactivar todas estas ventanas emergentes, incluso las que marcó previamente como 'No mostrarme más esto'? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="SkipShowNextTimeDialogs"> - ¿Quiere activar todas las ventanas emergentes que puedan habilitarse? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> + Por favor, selecciona un Ãtem del historial para verlo. </notification> <notification name="CacheWillClear"> - La caché se limpiará cuando reinicie [APP_NAME]. + La caché se limpiará cuando reinices [APP_NAME]. </notification> <notification name="CacheWillBeMoved"> - La caché se moverá cuando reinicie [APP_NAME]. -Nota: esto limpiará la caché. + La caché se moverá cuando reinicies [APP_NAME]. +Nota: esto vaciará la caché. </notification> <notification name="ChangeConnectionPort"> - Las configuraciones del puerto tendrán efecto cuando reinicie [APP_NAME]. + La configuración del puerto tendrá efecto cuando reinicies [APP_NAME]. </notification> <notification name="ChangeSkin"> - La nueva apariencia se verá cuando reinicie [APP_NAME]. + Verás la nueva apariencia cuando reinicies [APP_NAME]. </notification> <notification name="GoToAuctionPage"> ¿Ir a la página web de [SECOND_LIFE] para ver los detalles de la subasta @@ -445,40 +393,45 @@ o hacer una puja? <notification name="GestureSaveFailedTooManySteps"> Fallo al guardar el gesto. Este gesto tiene demasiados pasos. -Intente quitarle algunos, y vuelva a guardarlo. +Intenta quitarle algunos, y vuelve a guardarlo. </notification> <notification name="GestureSaveFailedTryAgain"> - Fallo al guardar el gesto. Por favor, reinténtelo en un minuto. + Fallo al guardar el gesto. Por favor, vuelve a intentarlo en un minuto. </notification> <notification name="GestureSaveFailedObjectNotFound"> No se ha podido guardar el gesto porque no se pudo encontrar el objeto o el objeto asociado. El objeto debe de haber sido borrado o estar fuera de rango ('out of range'). </notification> <notification name="GestureSaveFailedReason"> - Al guardar un gesto, hubo un problema por: [REASON]. Por favor, reintente guardarlo más tarde. + Al guardar un gesto, hubo un problema por: [REASON]. Por favor, vuelve a intentar guardarlo más tarde. </notification> <notification name="SaveNotecardFailObjectNotFound"> No se ha podido guardar la nota porque no se pudo encontrar el objeto o el objeto asociado del inventario. El objeto debe de haber sido borrado o estar fuera de rango ('out of range'). </notification> <notification name="SaveNotecardFailReason"> - Al guardar una nota, hubo un problema por: [REASON]. Por favor, reintente guardarla más tarde. + Al guardar una nota, hubo un problema por: [REASON]. Por favor, vuelve a intentar guardarla más tarde. </notification> <notification name="ScriptCannotUndo"> - No se han podido deshacer todos los cambios en su versión del script. -¿Quiere cargar la última versión guardada en el servidor? -(**Cuidado** No podrá deshacer esta operación). + No se han podido deshacer todos los cambios en tu versión del script. +¿Quieres cargar la última versión guardada en el servidor? +(**Cuidado** No podrás deshacer esta operación). <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="SaveScriptFailReason"> - Al guardar un script, hubo un problema por: [REASON]. Por favor, reintente guardarlo más tarde. + Al guardar un script, hubo un problema por: [REASON]. Por favor, vuelve a intentar guardarlo más tarde. </notification> <notification name="SaveScriptFailObjectNotFound"> No se ha podido guardar el script porque no se pudo encontrar el objeto que incluye. El objeto debe de haber sido borrado o estar fuera de rango ('out of range').. </notification> <notification name="SaveBytecodeFailReason"> - Al guardar un script compilado, hubo un problema por: [REASON]. Por favor, reintente guardarlo más tarde.. + Al guardar un script compilado, hubo un problema por: [REASON]. Por favor, vuelve a intentar guardarlo más tarde.. + </notification> + <notification name="StartRegionEmpty"> + Perdón, no está definida tu Posición inicial. +Por favor, escribe el nombre de la región en el cajetÃn de Posición inicial, o elige para esa posición Mi Base o Mi última posición. + <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="CouldNotStartStopScript"> No se ha podido correr o parar el script porque no se pudo encontrar el objeto que incluye. @@ -491,38 +444,34 @@ El objeto debe de haber sido borrado o estar fuera de rango ('out of range& No se ha podido escribir el archivo [[FILE]] </notification> <notification name="UnsupportedHardware"> - Atención: su sistema no tiene los requerimientos mÃnimos que necesita [APP_NAME]. Si sigue usando [APP_NAME], tendrá un funcionamiento pobre. Desafortunadamente, no podemos ofrecer soporte técnico para configuraciones inadecuadas del sistema. + Debes saber que tu ordenador no cumple los requisitos mÃnimos para la utilización de [APP_NAME]. Puede que experimentes un rendimiento muy bajo. Desafortunadamente, [SUPPORT_SITE] no puede dar asistencia técnica a sistemas con una configuración no admitida. -MINSPECS -Para más información, ¿quiere visitar [_URL]? +¿Ir a [_URL] para más información? <url name="url" option="0"> http://secondlife.com/support/sysreqs.php?lang=es </url> - <usetemplate ignoretext="Cuando se detecte hardware no adecuado" name="okcancelignore" notext="No" yestext="SÃ"/> + <usetemplate ignoretext="El hardware de mi ordenador no está admitido" name="okcancelignore" notext="No" yestext="SÃ"/> </notification> <notification name="UnknownGPU"> - En este momento, desconocemos la tarjeta gráfica de su sistema. -Con frecuencia, esto se debe a hardware nuevo que no hemos podido revisar aún. -Es muy probable que [APP_NAME] funcione correctamente, pero deberá ajustar sus configuraciones gráficas a lo que sea más apropiado. -(Menú Editar > Preferencias > Gráficos). + Tu sistema usa una tarjeta gráfica que [APP_NAME] no reconoce. +Suele suceder con hardware nuevo que todavÃa no ha sido probado con [APP_NAME]. Probablemente todo irá bien, pero deberás ajustar tus configuraciones gráficas. +(Yo > Preferencias > Gráficos). <form name="form"> - <ignore name="ignore" text="Cuando se detecte una tarjeta gráfica desconocida"/> + <ignore name="ignore" text="No se ha podido identificar mi tarjeta gráfica"/> </form> </notification> <notification name="DisplaySettingsNoShaders"> - [APP_NAME] se cayó al inicializar los drivers gráficos. -La calidad de los gráficos deberá establecerse en un nivel bajo para prevenir algunos errores frecuentes en los drivers. -Esto desactivará algunas opciones gráficas. -Le recomendamos que actualice los drivers de su tarjeta gráfica. -La calidad gráfica puede configurarse en Preferencias > Gráficos. + [APP_NAME] se cae al iniciar los 'driver' gráficos. +La calidad de los gráficos se configurará en Baja para prevenir algunos errores comunes de los gráficos. Esto desactivará algunas posibilidades gráficas. +Te recomendamos actualizar los 'drivers' de tu tarjeta gráfica. +La calidad gráfica puede ajustarse en Preferencias > Gráficos. </notification> <notification name="RegionNoTerraforming"> En la región [REGION] no se permite modificar el terreno. </notification> <notification name="CannotCopyWarning"> - No tiene permiso para copiar este Ãtem. -Si lo da, lo perderá de su inventario. -¿Realmente quiere darlo? + No tienes permiso para copiar los elementos siguientes: +[ITEMS] y, si los das, los perderás del inventario. ¿Seguro que quieres ofrecerlos? <usetemplate name="okcancelbuttons" notext="No" yestext="SÃ"/> </notification> <notification name="CannotGiveItem"> @@ -532,19 +481,19 @@ Si lo da, lo perderá de su inventario. Transacción cancelada. </notification> <notification name="TooManyItems"> - En una única transferencia del inventario, no puede dar más de 42 Ãtems. + No puedes dar más de 42 Ãtems en una única transferencia del inventario. </notification> <notification name="NoItems"> - No tiene permiso para transferir el Ãtem seleccionado. + No tienes permiso para transferir el Ãtem seleccionado. </notification> <notification name="CannotCopyCountItems"> - No tiene permiso para copiar [COUNT] de los -Ãtems seleccionados. Si los da, los perderá de su inventario. -¿Realmente quiere darlos? + No tienes permiso para copiar [COUNT] de los +Ãtems seleccionados. Si los das, los perderás de tu inventario. +¿Realmente quieres darlos? <usetemplate name="okcancelbuttons" notext="No" yestext="SÃ"/> </notification> <notification name="CannotGiveCategory"> - No tiene permiso para transferir + No tienes permiso para transferir la carpeta seleccionada. </notification> <notification name="FreezeAvatar"> @@ -558,29 +507,32 @@ Temporalmente, será incapaz de moverse, usar el chat, o interactuar con el mund <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Descongelarle" yestext="Congelarle"/> </notification> <notification name="EjectAvatarFullname"> - ¿Expulsar a [AVATAR_NAME] de su terreno? + ¿Expulsar a [AVATAR_NAME] de tu terreno? <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Expulsar y Prohibir el acceso" yestext="Expulsar"/> </notification> <notification name="EjectAvatarNoBan"> - ¿Expulsar a este avatar de su terreno? + ¿Expulsar a este avatar de tu terreno? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Expulsar"/> </notification> <notification name="EjectAvatarFullnameNoBan"> - ¿Expulsar a [AVATAR_NAME] de su terreno? + ¿Expulsar a [AVATAR_NAME] de tu terreno? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Expulsar"/> </notification> + <notification name="EjectAvatarFromGroup"> + Has expulsado a [AVATAR_NAME] del grupo [GROUP_NAME] + </notification> <notification name="AcquireErrorTooManyObjects"> ERROR 'ACQUIRE': Hay demasiados objetos seleccionados. </notification> <notification name="AcquireErrorObjectSpan"> ERROR 'ACQUIRE': Los objetos están en más de una región. -Por favor, mueva todos los objetos a adquirir a la +Por favor, mueve todos los objetos a adquirir a la misma región. </notification> <notification name="PromptGoToCurrencyPage"> [EXTRA] -¿Ir a [_URL] para informarse sobre la compra de L$? +¿Ir a [_URL] para informarte sobre la compra de L$? <url name="url"> http://secondlife.com/app/currency/?lang=es-ES </url> @@ -588,27 +540,27 @@ misma región. </notification> <notification name="UnableToLinkObjects"> No se pudo enlazar estos [COUNT] objetos. -Puede enlazar [MAX] objetos como máximo. +Puedes enlazar [MAX] objetos como máximo. </notification> <notification name="CannotLinkIncompleteSet"> - Sólo puede enlazar objetos completos (no sus partes), y debe + Sólo puedes enlazar objetos completos (no sus partes), y debes seleccionar más de uno. </notification> <notification name="CannotLinkModify"> - Imposible enlazarlos, porque no tiene permiso para modificar + Imposible enlazarlos, porque no tienes permiso para modificar todos los objetos. -Por favor, asegúrese de que no hay ninguno bloqueado, y de que es el propietario de todos. +Por favor, asegúrate de que no hay ninguno bloqueado, y de que eres el propietario de todos. </notification> <notification name="CannotLinkDifferentOwners"> Imposible enlazarlos, porque hay objetos de distintos propietarios. -Por favor, asegúrese de que es propietario de todos los objetos seleccionados. +Por favor, asegúrate de que eres el propietario de todos los objetos seleccionados. </notification> <notification name="NoFileExtension"> No hay extensión de archivo en: '[FILE]' -Por favor, asegúrese de que la extensión del archivo es correcta. +Por favor, asegúrate de que la extensión del archivo es correcta. </notification> <notification name="InvalidFileExtension"> Extensión inválida de archivo: [EXTENSION] @@ -616,7 +568,7 @@ PodrÃa ser [VALIDS] <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="CannotUploadSoundFile"> - Ni se pudo abrir el archivo de sonido que se ha subido para leer: + No se pudo abrir el archivo de sonido que has subido para leer: [FILE] </notification> <notification name="SoundFileNotRIFF"> @@ -661,6 +613,11 @@ PodrÃa ser [VALIDS] <notification name="CannotEncodeFile"> No se puede codificar el archivo: [FILE] </notification> + <notification name="CorruptedProtectedDataStore"> + No se pueden leer los datos protegidos, por lo que se están restaurando. + Esto puede deberse a un cambio de configuración de la red. + <usetemplate name="okbutton" yestext="OK"/> + </notification> <notification name="CorruptResourceFile"> Archivo con los recursos corruptos: [FILE] </notification> @@ -671,112 +628,120 @@ PodrÃa ser [VALIDS] No se ha podido crear el archivo de salida: [FILE] </notification> <notification name="DoNotSupportBulkAnimationUpload"> - Actualmente, no ofrecemos la posibilidad de subida masiva de archivos de animación. + Actualmente, [APP_NAME] no admite la subida masiva de animaciones. </notification> <notification name="CannotUploadReason"> No se ha podido subir [FILE] por la siguiente razón: [REASON] -Por favor, inténtelo más tarde. +Por favor, inténtalo más tarde. + </notification> + <notification name="LandmarkCreated"> + Se ha añadido "[LANDMARK_NAME]" a tu carpeta [FOLDER_NAME]. + </notification> + <notification name="LandmarkAlreadyExists"> + Ya tienes un hito de esta localización. + <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="CannotCreateLandmarkNotOwner"> - No puede crear un hito aquà porque el propietario del terreno no lo permite. + No puedes crear un hito aquà porque el propietario del terreno no lo permite. </notification> <notification name="CannotRecompileSelectObjectsNoScripts"> No se pudo 'recompilar'. -Seleccione un objeto con script. +Selecciona un objeto con script. </notification> <notification name="CannotRecompileSelectObjectsNoPermission"> No se pudo 'recompilar'. -Seleccione objetos con scripts en los que usted tenga permiso para modificarlos. +Selecciona objetos con scripts en los que tengas permiso para modificarlos. </notification> <notification name="CannotResetSelectObjectsNoScripts"> No se pudo 'reiniciar'. -Seleccione objetos con scripts. +Selecciona objetos con scripts. </notification> <notification name="CannotResetSelectObjectsNoPermission"> No se pudo 'reiniciar'. -Seleccione objetos con scripts en los que usted tenga permiso para modificarlos. +Selecciona objetos con scripts en los que tengas permiso para modificarlos. + </notification> + <notification name="CannotOpenScriptObjectNoMod"> + Imposible abrir el script del objeto sin modificar los permisos. </notification> <notification name="CannotSetRunningSelectObjectsNoScripts"> No se puede configurar ningún script como 'ejecutándose'. -Seleccione objetos con scripts. +Selecciona objetos con scripts. </notification> <notification name="CannotSetRunningNotSelectObjectsNoScripts"> No se puede configurar ningún script como 'no ejecutándose'. -Seleccione objetos con scripts. +Selecciona objetos con scripts. </notification> <notification name="NoFrontmostFloater"> - No hay nada a guardar. + No hay nada que guardar. </notification> <notification name="SeachFilteredOnShortWords"> - Se ha modificado su búsqueda, + Se ha modificado tu búsqueda, eliminando las palabras demasiado cortas. Buscando: [FINALQUERY] </notification> <notification name="SeachFilteredOnShortWordsEmpty"> - Los términos de su búsqueda son muy cortos, + Los términos de tu búsqueda son muy cortos, por lo que no se ha hecho la búsqueda. </notification> <notification name="CouldNotTeleportReason"> - No se ha podido teleportar. + Fallo en el teleporte. [REASON] </notification> - - <notification name="invalid_tport"> -Ha habido un problema al procesar su petición de teleporte. Debe volver a iniciar sesión para poder teleportarse. Si le sigue apareciendo este mensaje, revise, por favor, las preguntas frecuentes en el Soporte técnico: -www.secondlife.com/support - </notification> - <notification name="invalid_region_handoff"> -Ha habido un problema al procesar su paso a otra región. Debe volver a iniciar sesión para poder pasar de región a región. Si le sigue apareciendo este mensaje, revise, por favor, las preguntas frecuentes en el Soporte técnico: -www.secondlife.com/support - </notification> - <notification name="blocked_tport"> -Lo sentimos, en estos momentos los teleportes están bloqueados. Vuelva a intentarlo en un momento. Si sigue sin poder teleportarse, desconéctese y vuelva a iniciar sesión para solucionar el problema. - </notification> - <notification name="nolandmark_tport"> -Lo sentimos, pero el sistema no ha podido localizar el destino de este hito. - </notification> - <notification name="timeout_tport"> -Lo sentimos, pero el sistema no ha podido completar el teleporte. -Vuelva a intentarlo en un momento. - </notification> - <notification name="noaccess_tport"> -Lo sentimos, pero usted no tiene acceso al destino de este teleporte. - </notification> - <notification name="missing_attach_tport"> -Aún no han llegado sus objetos anexados. Espere unos segundos más o desconéctese y vuelva a iniciar sesión antes de teleportarse. - </notification> - <notification name="too_many_uploads_tport"> -La cola de espera en esta región está actualmente obstruida, por lo que su petición de teleporte no se atenderá en un tiempo prudencial. Por favor, vuelva a intentarlo en unos minutos o vaya a una zona menos ocupada. - </notification> - <notification name="expired_tport"> -Lo sentimos, pero el sistema no ha podido atender a su petición de teleporte en un tiempo prudencial. Por favor, vuelva a intentarlo en unos pocos minutos. - </notification> - <notification name="expired_region_handoff"> -Lo sentimos, pero el sistema no ha podido completar su paso a otra región en un tiempo prudencial. Por favor, vuelva a intentarlo en unos pocos minutos. - </notification> - <notification name="no_host"> -Ha sido imposible encontrar el destino del teleporte: o está desactivado temporalmente o ya no existe. Por favor, vuelva a intentarlo en unos pocos minutos. - </notification> - <notification name="no_inventory_host"> -En estos momentos no está disponible el sistema del inventario. - </notification> - - + <notification name="invalid_tport"> + Ha habido un problema al procesar tu petición de teleporte. Debes volver a iniciar sesión antes de poder teleportarte de nuevo. +Si sigues recibiendo este mensaje, por favor, acude al [SUPPORT_SITE]. + </notification> + <notification name="invalid_region_handoff"> + Ha habido un problema al procesar tu paso a otra región. Debes volver a iniciar sesión para poder pasar de región a región. +Si sigues recibiendo este mensaje, por favor, acude al [SUPPORT_SITE]. + </notification> + <notification name="blocked_tport"> + Lo sentimos, en estos momentos los teleportes están bloqueados. Vuelve a intentarlo en un momento. Si sigues sin poder teleportarte, desconéctate y vuelve a iniciar sesión para solucionar el problema. + </notification> + <notification name="nolandmark_tport"> + Lo sentimos, pero el sistema no ha podido localizar el destino de este hito. + </notification> + <notification name="timeout_tport"> + Lo sentimos, pero el sistema no ha podido completar el teleporte. +Vuelve a intentarlo en un momento. + </notification> + <notification name="noaccess_tport"> + Lo sentimos, pero no tienes acceso al destino de este teleporte. + </notification> + <notification name="missing_attach_tport"> + Aún no han llegado tus objetos anexados. Espera unos segundos más o desconéctate y vuelve a iniciar sesión antes de teleportarte. + </notification> + <notification name="too_many_uploads_tport"> + La cola de espera en esta región está actualmente obstruida, por lo que tu petición de teleporte no se atenderá en un tiempo prudencial. Por favor, vuelve a intentarlo en unos minutos o ve a una zona menos ocupada. + </notification> + <notification name="expired_tport"> + Lo sentimos, pero el sistema no ha podido atender a tu petición de teleporte en un tiempo prudencial. Por favor, vuelve a intentarlo en unos pocos minutos. + </notification> + <notification name="expired_region_handoff"> + Lo sentimos, pero el sistema no ha podido completar tu paso a otra región en un tiempo prudencial. Por favor, vuelve a intentarlo en unos pocos minutos. + </notification> + <notification name="no_host"> + Ha sido imposible encontrar el destino del teleporte: o está desactivado temporalmente o ya no existe. Por favor, vuelve a intentarlo en unos pocos minutos. + </notification> + <notification name="no_inventory_host"> + En estos momentos no está disponible el sistema del inventario. + </notification> <notification name="CannotSetLandOwnerNothingSelected"> No se ha podido configurar el propietario del terreno: no se ha seleccionado una parcela. </notification> <notification name="CannotSetLandOwnerMultipleRegions"> - No se ha podido obtener la propiedad del terreno porque la selección se extiende por varias regiones. Por favor, seleccione un área más pequeña y reinténtelo. + No se ha podido obtener la propiedad del terreno porque la selección se extiende por varias regiones. Por favor, selecciona un área más pequeña y vuelve a intentarlo. </notification> <notification name="ForceOwnerAuctionWarning"> - Está parcela está siendo subastada. Forzar su propiedad cancelará la subasta y, probablemente, disguste a algunos residentes que ya hayan empezado a pujar. ¿Forzar la propiedad? + Esta parcela está subastándose. Forzar su propiedad cancelará la subasta y, potencialmente, puede disgustar a algunos residentes si la puja ya ha empezado. +¿Forzar la propiedad? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="CannotContentifyNothingSelected"> @@ -804,7 +769,7 @@ no se ha seleccionado una parcela. no se ha podido encontrar en qué región está. </notification> <notification name="CannotCloseFloaterBuyLand"> - No puede cerrar la ventana de Comprar terreno hasta que [APP_NAME] calcule el precio de esta transacción. + No puedes cerrar la ventana de Comprar terreno hasta que [APP_NAME] calcule el precio de esta transacción. </notification> <notification name="CannotDeedLandNothingSelected"> No se ha podido transferir el terreno: @@ -812,7 +777,7 @@ no se ha seleccionado una parcela. </notification> <notification name="CannotDeedLandNoGroup"> No se ha podido transferir el terreno: -no ha seleccionado un grupo. +no has seleccionado un grupo. </notification> <notification name="CannotDeedLandNoRegion"> No se ha podido transferir el terreno: @@ -820,23 +785,15 @@ Ha sido imposible encontrar en qué región está. </notification> <notification name="CannotDeedLandMultipleSelected"> No se ha podido transferir el terreno: -ha seleccionado varias parcelas. +has seleccionado varias parcelas. -Inténtelo seleccionando sólo una. - </notification> - <notification name="ParcelCanPlayMedia"> - Esta localización puede mostrar media en streaming. -Los media en streaming necesitan una conexión a internet rápida. - -Si hay media, ¿reproducirlos en streaming? -(Puede cambiar más adelante esta opción en Preferencias > Audio y VÃdeo). - <usetemplate name="okcancelbuttons" notext="Desactivar" yestext="Ejecutar los media"/> +Inténtalo seleccionando sólo una. </notification> <notification name="CannotDeedLandWaitingForServer"> No se ha podido transferir el terreno: esperando que el servidor informe acerca de la propiedad. -Por favor, vuelva a intentarlo. +Por favor, vuelve a intentarlo. </notification> <notification name="CannotDeedLandNoTransfer"> No se ha podido transferir el terreno: @@ -846,18 +803,18 @@ En la región [REGION] no se permite transferir terrenos. No se ha podido abandonar el terreno: esperando que el servidor actualice la información de la parcela. -Vuelva a intentarlo en unos segundos. +Vuelve a intentarlo en unos segundos. </notification> <notification name="CannotReleaseLandSelected"> No se ha podido abandonar el terreno: -no es propietario de todas las parcelas seleccionadas. +no eres propietario de todas las parcelas seleccionadas. -Por favor, seleccione una sola parcela. +Por favor, selecciona una sola parcela. </notification> <notification name="CannotReleaseLandDontOwn"> No se ha podido abandonar el terreno: -no tiene permisos sobre esta parcela. -Las parcelas de su propiedad se muestran en verde. +no tienes permisos sobre esta parcela. +Las parcelas de tu propiedad se muestran en verde. </notification> <notification name="CannotReleaseLandRegionNotFound"> No se ha podido abandonar el terreno: @@ -869,13 +826,13 @@ En la región [REGION] no se permite transferir terrenos. </notification> <notification name="CannotReleaseLandPartialSelection"> No se ha podido abandonar el terreno: -debe seleccionar toda la parcela. +debes seleccionar toda la parcela. -Seleccione una parcela completa, o divÃdala primero. +Selecciona una parcela completa, o divÃdela primero. </notification> <notification name="ReleaseLandWarning"> - Va a abandonar [AREA] m² de terreno. -Al hacerlo, la quitará de entre sus posesiones de terreno, pero no recibirá ningún L$. + Vas a abandonar [AREA] m² de terreno. +Al hacerlo, la quitarás de entre tus posesiones de terreno, pero no recibirás ningún L$. ¿Abandonar este terreno? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> @@ -883,13 +840,13 @@ Al hacerlo, la quitará de entre sus posesiones de terreno, pero no recibirá ni <notification name="CannotDivideLandNothingSelected"> No se ha podido dividir el terreno: -No ha seleccionado ninguna parcela. +No has seleccionado ninguna parcela. </notification> <notification name="CannotDivideLandPartialSelection"> No se ha podido dividir el terreno: -Ha seleccionado una parcela entera. -Inténtelo seleccionando una parte. +Has seleccionado una parcela entera. +Inténtalo seleccionando una parte. </notification> <notification name="LandDivideWarning"> Dividir este terreno lo separará en dos parcelas, cada una de las cuales tendrá su propia configuración. Tras esta operación, algunas configuraciones volverán a las existentes por defecto. @@ -911,40 +868,29 @@ No hay parcelas seleccionadas. </notification> <notification name="CannotJoinLandEntireParcelSelected"> No se ha podido unir el terreno: -Sólo ha seleccionado una parcela. +Sólo has seleccionado una parcela. -Seleccione terreno que incluya algo de ambas parcelas. +Selecciona terreno que incluya algo de ambas parcelas. </notification> <notification name="CannotJoinLandSelection"> No se ha podido unir el terreno: -Debe seleccionar más de una parcela. +Debes seleccionar más de una parcela. -Seleccione terreno que incluya algo de ambas parcelas. +Selecciona terreno que incluya algo de ambas parcelas. </notification> <notification name="JoinLandWarning"> - Al unir este terreno creará una parcela más grande formada por todas aquellas que tengan parte en el rectángulo seleccionado. -Deberá reconfigurar el nombre y las opciones de la nueva parcela. + Al unir este terreno crearás una parcela más grande formada por todas aquellas que tengan parte en el rectángulo seleccionado. +Deberás reconfigurar el nombre y las opciones de la nueva parcela. ¿Unir el terreno? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> - <notification name="ShowOwnersHelp"> - Mostrar los propietarios: -El color de las parcelas indica el tipo de propietario. - -Verde = Su terreno -Agua = Terreno de sus grupos -Rojo = Propiedad de otros -Amarillo = En venta -Morado = Para subasta -Gris = Público - </notification> <notification name="ConfirmNotecardSave"> - Esta nota debe guardarse antes de que se la pueda copiar o ver. ¿Guardar la nota? + Esta nota debe guardarse antes de que puedas copiarla o verla. ¿Guardar la nota? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="ConfirmItemCopy"> - ¿Copiar este Ãtem a su inventario? + ¿Copiar este Ãtem a tu inventario? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Copiar"/> </notification> <notification name="ResolutionSwitchFail"> @@ -957,32 +903,31 @@ Gris = Público Error, árboles no definidos: [SPECIES] </notification> <notification name="CannotSaveWearableOutOfSpace"> - No se ha podido guardar el archivo '[NAME]'. Tendrá que liberar algo de espacio en su ordenador y guardarlo de nuevo. + No se ha podido guardar el archivo '[NAME]'. Tendrás que liberar algo de espacio en tu ordenador y guardarlo de nuevo. </notification> <notification name="CannotSaveToAssetStore"> No se ha podido guardar [NAME] en la base central de almacenamiento. -Esto es, generalmente, un fallo temporal. Por favor, reinténtelo en unos pocos minutos. +Generalmente, esto es un fallo pasajero. Por favor, personaliza y guarda el Ãtem de aquà a unos minutos. </notification> <notification name="YouHaveBeenLoggedOut"> - Se ha cerrado su sesión en [SECOND_LIFE]: + Vaya, se ha cerrado tu sesión en [SECOND_LIFE]. [MESSAGE] -Aún puede ver el chat y los MI existentes pulsando 'Ver MI y Chat'. Si no, pulse 'Salir' para dejar inmediatemente [APP_NAME]. <usetemplate name="okcancelbuttons" notext="Salir" yestext="Ver MI y Chat"/> </notification> <notification name="OnlyOfficerCanBuyLand"> No se ha podido comprar terreno para el grupo: -usted no tiene el permiso de comprar terreno para el grupo que tiene activado actualmente. +no tienes el permiso de comprar terreno para el grupo que tienes activado actualmente. </notification> <notification label="Añadir como amigo" name="AddFriend"> Los amigos pueden darse permiso para localizarse en el mapa y para saber si el otro está conectado. -¿Ofrecer a [NAME] que sea su amigo? +¿Ofrecer a [NAME] que sea tu amigo? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification label="Añadir como amigo" name="AddFriendWithMessage"> Los amigos pueden darse permiso para localizarse en el mapa y para saber si el otro está conectado. -¿Ofrecer a [NAME] que sea su amigo? +¿Ofrecer a [NAME] que sea tu amigo? <form name="form"> <input name="message"> ¿Quieres formar parte de mis amigos? @@ -991,113 +936,149 @@ usted no tiene el permiso de comprar terreno para el grupo que tiene activado ac <button name="Cancel" text="Cancelar"/> </form> </notification> + <notification label="Guardar el vestuario" name="SaveOutfitAs"> + Guardar como un nuevo vestuario lo que estoy llevando: + <form name="form"> + <input name="message"> + [DESC] (nuevo) + </input> + <button name="Offer" text="OK"/> + <button name="Cancel" text="Cancelar"/> + </form> + </notification> + <notification label="Guardar artÃculo" name="SaveWearableAs"> + Guardar el Ãtem en mi inventario como: + <form name="form"> + <input name="message"> + [DESC] (nuevo) + </input> + <button name="Offer" text="OK"/> + <button name="Cancel" text="Cancelar"/> + </form> + </notification> + <notification label="Renombrar el vestuario" name="RenameOutfit"> + Nombre del nuevo vestuario: + <form name="form"> + <input name="new_name"> + [NAME] + </input> + <button name="Offer" text="OK"/> + <button name="Cancel" text="Cancelar"/> + </form> + </notification> <notification name="RemoveFromFriends"> - ¿Quiere quitar a [FIRST_NAME] [LAST_NAME] de su lista de amigos? + ¿Quieres quitar a [FIRST_NAME] [LAST_NAME] de tu lista de amigos? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="RemoveMultipleFromFriends"> - ¿Quiere quitar a varios amigos de su lista de amigos? + ¿Quieres quitar a varios amigos de tu lista de amigos? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="GodDeleteAllScriptedPublicObjectsByUser"> - ¿Está seguro de que quiere borrar todos los objetos con script que sean propiedad de + ¿Estás seguro de que quieres borrar todos los objetos con script que sean propiedad de ** [AVATAR_NAME] ** en todos los otros terrenos de este sim? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="GodDeleteAllScriptedObjectsByUser"> - ¿Está seguro de que quiere BORRAR TODOS los objetos con script que sean propiedad de + ¿Estás seguro de que quieres BORRAR TODOS los objetos con script que sean propiedad de ** [AVATAR_NAME] ** en TODO EL TERRENO de este sim? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="GodDeleteAllObjectsByUser"> - ¿Está seguro de que quiere BORRAR TODOS los objetos (con script o no) que sean propiedad de + ¿Estás seguro de que quieres BORRAR TODOS los objetos (con script o no) que sean propiedad de ** [AVATAR_NAME] ** en TODO EL TERRENO de este sim? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="BlankClassifiedName"> - Debe especificar un nombre para su clasificado. + Debes especificar un nombre para tu clasificado. </notification> <notification name="MinClassifiedPrice"> El pago para aparecer en la lista debe ser de, al menos, [MIN_PRICE] L$. -Por favor, elija un pago mayor. +Por favor, elige un pago mayor. + </notification> + <notification name="ConfirmItemDeleteHasLinks"> + Por lo menos uno de los elementos seleccionados contiene vÃnculos que le señalan. Si eliminas este elemento, los vÃnculos dejarán de funcionar permanentemente. Lo más recomendable es eliminar primero los vÃnculos. + +¿Estás seguro de que quieres eliminar los elementos? + <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="ConfirmObjectDeleteLock"> - Al menos uno de los Ãtems que ha seleccionado está bloqueado. + Al menos uno de los Ãtems que has seleccionado está bloqueado. -¿Está seguro de que quiere borrar estos Ãtems? +¿Estás seguro de que quieres borrar estos Ãtems? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="ConfirmObjectDeleteNoCopy"> - Al menos uno de los Ãtems que ha seleccionado no es copiable. + Al menos uno de los Ãtems que has seleccionado no es copiable. -¿Está seguro de que quiere borrar estos Ãtems? +¿Estás seguro de que quieres borrar estos Ãtems? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="ConfirmObjectDeleteNoOwn"> - No es el propietario de, al menos, uno de los Ãtems que ha seleccionado. + No eres el propietario de, al menos, uno de los Ãtems que has seleccionado. -¿Está seguro de que quiere borrar estos Ãtems? +¿Estás seguro de que quieres borrar estos Ãtems? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="ConfirmObjectDeleteLockNoCopy"> Al menos un objeto está bloqueado. Al menos un objeto no es copiable. -¿Está seguro de que quiere borrar estos Ãtems? +¿Estás seguro de que quieres borrar estos Ãtems? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="ConfirmObjectDeleteLockNoOwn"> Al menos un objeto está bloqueado. -No es propietario de, al menos, un objeto. +No eres propietario de, al menos, un objeto. -¿Está seguro de que quiere borrar estos Ãtems? +¿Estás seguro de que quieres borrar estos Ãtems? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="ConfirmObjectDeleteNoCopyNoOwn"> Al menos un objeto no es copiable. -No es propietario de, al menos, un objeto. +No eres propietario de, al menos, un objeto. -¿Está seguro de que quiere borrar estos Ãtems? +¿Estás seguro de que quieres borrar estos Ãtems? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="ConfirmObjectDeleteLockNoCopyNoOwn"> Al menos un objeto está bloqueado. Al menos un objeto no es copiable. -No es propietario de, al menos, un objeto. +No eres propietario de, al menos, un objeto. -¿Está seguro de que quiere borrar estos Ãtems? +¿Estás seguro de que quieres borrar estos Ãtems? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="ConfirmObjectTakeLock"> Al menos un objeto está bloqueado. -¿Está seguro de que quiere tomar estos Ãtems? +¿Estás seguro de que quieres tomar estos Ãtems? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="ConfirmObjectTakeNoOwn"> - No es el propietario de todos los objetos que está tomando. -Si sigue, se aplicarán los permisos marcados para el próximo propietario, y es posible que se restrinja su posibilidad de hacer modificaciones o copias. + No eres el propietario de todos los objetos que estás tomando. +Si sigues, se aplicarán los permisos marcados para el próximo propietario, y es posible que se restrinja tu posibilidad de hacer modificaciones o copias. -¿Está seguro de que quiere tomar estos Ãtems? +¿Estás seguro de que quieres tomar estos Ãtems? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="ConfirmObjectTakeLockNoOwn"> Al menos un objeto está bloqueado. -No es el propietario de todos los objetos que está tomando. -Si sigue, se aplicarán los permisos marcados para el próximo propietario, y es posible que se restrinja su posibilidad de hacer modificaciones o copias -Con todo, puede tomar lo actualmente seleccionado. +No eres el propietario de todos los objetos que estás tomando. +Si sigues, se aplicarán los permisos marcados para el próximo propietario, y es posible que se restrinja tu posibilidad de hacer modificaciones o copias. +Con todo, puedes tomar lo actualmente seleccionado. -¿Está seguro de que quiere tomar estos Ãtems? +¿Estás seguro de que quieres tomar estos Ãtems? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="CantBuyLandAcrossMultipleRegions"> No se ha podido hacer la compra porque el terreno seleccionado se extiende por varias regiones. -Por favor, seleccione un área más pequeña y reinténtelo. +Por favor, selecciona un área más pequeña y vuelve a intentarlo. </notification> <notification name="DeedLandToGroup"> Al transferir esta parcela, se requerirá al grupo que tenga y mantenga el crédito suficiente para uso de terreno. @@ -1118,44 +1099,46 @@ Si se vende una parcela transferida, el precio de venta se dividirá a partes ig <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="DisplaySetToSafe"> - Las configuraciones que se muestran se han fijado en los niveles guardados, pues usted especificó la opción de guardarlos. + Las configuraciones que se muestran se han fijado en los niveles guardados, pues especificaste la opción de guardarlos. </notification> <notification name="DisplaySetToRecommended"> - Las configuraciones que se muestran se han fijado en los niveles recomendados para la configuración de su sistema. + Las configuraciones que se muestran se han fijado en los niveles recomendados para la configuración de tu sistema. </notification> <notification name="ErrorMessage"> [ERROR_MESSAGE] - </notification> - <notification name="AvatarMoved"> - Su localización [TYPE] no está disponible en estos momentos. [HELP] -Ha sido llevado a una región cercana. + <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="AvatarMovedDesired"> - La localización que ha elegido no está disponible en estos momentos. -Ha sido llevado a una región cercana. + La localización que querÃas no está disponible en estos momentos. +Se te ha llevado a una región cercana. </notification> <notification name="AvatarMovedLast"> - Su última posición no está disponible en estos momentos. -Ha sido llevado a una región cercana. + En estos momentos no está disponible tu última posición. +Se te ha llevado a una región cercana. + </notification> + <notification name="AvatarMovedHome"> + En estos momentos no está disponible tu Base. +Se te ha llevado a una región cercana. +Quizá quieras configurar una nueva posición para tu Base. </notification> <notification name="ClothingLoading"> - Aún está descargándose su ropa. -Puede usar normalmente [SECOND_LIFE], los demás residentes le verán correctamente. + Aún está descargándose tu ropa. +Puedes usar [SECOND_LIFE] de forma normal; los demás residentes te verán correctamente. <form name="form"> - <ignore name="ignore" text="Cuando está llevando mucho tiempo descargar la ropa"/> + <ignore name="ignore" text="La ropa está tardando mucho en descargarse"/> </form> </notification> <notification name="FirstRun"> - Se ha completado la instalación de [APP_NAME]. + Se ha completado la instalación de [SECOND_LIFE]. -Si esta es la primera vez que usa [SECOND_LIFE], deberá crear una cuenta antes de que pueda iniciar una sesión. -¿Volver a [https://join.secondlife.com/index.php?lang=es-ES secondlife.com] para crear una cuenta nueva? +Si es la primera vez que usas [SECOND_LIFE], debes crear una cuenta antes de poder iniciar una sesión. +¿Volver a [http://join.secondlife.com secondlife.com] para crear una cuenta nueva? <usetemplate name="okcancelbuttons" notext="Continuar" yestext="Cuenta nueva..."/> </notification> <notification name="LoginPacketNeverReceived"> - Tenemos problemas de conexión. Puede deberse a un problema de su conexión a internet o de los servidores de [SECOND_LIFE]. + Tenemos problemas de conexión. Puede deberse a un problema de tu conexión a Internet o de [SECOND_LIFE_GRID]. -Puede revisar su conexión a internet y volver a intentarlo en unos minutos. Pulse Ayuda para conectarse a nuestro sitio de Sporte, o pulse Teleportar para intentar teleportarse a su Base. +Puedes revisar tu conexión a Internet y volver a intentarlo en unos minutos, pulsar Ayuda para conectarte a [SUPPORT_SITE], o pulsar Teleporte para intentar teleportarte a tu Base. <url name="url"> http://es.secondlife.com/support/ </url> @@ -1166,43 +1149,79 @@ Puede revisar su conexión a internet y volver a intentarlo en unos minutos. Pul </form> </notification> <notification name="WelcomeChooseSex"> - Su personaje aparecerá en un momento. + Tu personaje aparecerá en un momento. -Para caminar, use las teclas del cursor. -En cualquier momento, puede pulsar la tecla F1 para conseguir ayuda o para aprender más acerca de [SECOND_LIFE]. -Por favor, elija el avatar masculino o femenino. -Puede cambiar más adelante su elección. +Para caminar, usa las teclas del cursor. +En cualquier momento, puedes pulsar la tecla F1 para conseguir ayuda o para aprender más acerca de [SECOND_LIFE]. +Por favor, elige el avatar masculino o femenino. +Puedes cambiar más adelante tu elección. <usetemplate name="okcancelbuttons" notext="Mujer" yestext="Varón"/> </notification> + <notification name="CantTeleportToGrid"> + No se puede hacer el teleporte a [SLURL] porque se encuentra en una cuadrÃcula ([GRID]) diferente de la actual ([CURRENT_GRID]). Cierra el visor y vuelve a intentarlo. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="GeneralCertificateError"> + No se puede establecer la conexión con el servidor. +[REASON] + +Nombre del asunto: [SUBJECT_NAME_STRING] +Nombre del emisor: [ISSUER_NAME_STRING] +Válido desde: [VALID_FROM] +Válido hasta: [VALID_TO] +Huella digital MD5: [SHA1_DIGEST] +Huella digital SHA1: [MD5_DIGEST] +Uso de la clave: [KEYUSAGE] +Uso de clave extendida: [EXTENDEDKEYUSAGE] +Identificador de clave de asunto: [SUBJECTKEYIDENTIFIER] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="TrustCertificateError"> + La autoridad de certificación de este servidor se desconoce. + +Información del certificado: +Nombre del asunto: [SUBJECT_NAME_STRING] +Nombre del emisor: [ISSUER_NAME_STRING] +Válido desde: [VALID_FROM] +Válido hasta: [VALID_TO] +Huella digital MD5: [SHA1_DIGEST] +Huella digital SHA1: [MD5_DIGEST] +Uso de la clave: [KEYUSAGE] +Uso de clave extendida: [EXTENDEDKEYUSAGE] +Identificador de clave de asunto: [SUBJECTKEYIDENTIFIER] + +¿Deseas confiar en esta autoridad? + <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Confiar"/> + </notification> <notification name="NotEnoughCurrency"> - [NAME] cuesta [PRICE] L$. No tiene suficientes L$ para hacer eso. + [NAME] cuesta [PRICE] L$. No tienes suficientes L$ para hacer eso. </notification> <notification name="GrantedModifyRights"> - Se le ha concedido el privilegio de modificar los objetos de [FIRST_NAME] [LAST_NAME]. + [NAME] te ha dado permiso para modificar sus objetos. </notification> <notification name="RevokedModifyRights"> - Ha sido revocado su privilegio de modificar los objetos de [FIRST_NAME] [LAST_NAME]. + Ha sido revocado tu privilegio de modificar los objetos de [NAME] </notification> <notification name="FlushMapVisibilityCaches"> - Esto limpiará las caches del mapa en esta región. + Esto limpiará las cachés del mapa en esta región. Esto sólo es realmente útil para cuestiones de depuración ('debugging'). -(A efectos prácticos, espere 5 minutos, y el mapa de cualquiera se actualizará después de que reinicie sesión). +(A efectos prácticos, espera 5 minutos, y el mapa de cualquiera se actualizará después de que reinicies sesión). <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="BuyOneObjectOnly"> - No se puede comprar más de un objeto a la vez. Por favor, seleccione sólo un objeto y vuelva a intentarlo. + No se puede comprar más de un objeto a la vez. Por favor, selecciona sólo un objeto y vuelve a intentarlo. </notification> <notification name="OnlyCopyContentsOfSingleItem"> No se puede copiar a la vez los contenidos de más de un objeto. -Por favor, selección sólo uno y reinténtelo. +Por favor, selecciona sólo uno y vuelve a intentarlo. <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="KickUsersFromRegion"> - ¿Teleportar a su base a todos los residentes en esta región? + ¿Teleportar a tu base a todos los residentes en esta región? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="EstateObjectReturn"> - ¿Está seguro de que quiere devolver los objetos propiedad de + ¿Estás seguro de que quieres devolver los objetos propiedad de [USER_NAME] ? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> @@ -1210,193 +1229,210 @@ Por favor, selección sólo uno y reinténtelo. No se han podido configurar las texturas de la región: La textura del terreno [TEXTURE_NUM] tiene una profundidad de bites inválida: [TEXTURE_BIT_DEPTH]. -Cambie la textura [TEXTURE_NUM] por una imagen de 24-bit y 512x512 o menor, y pulse de nuevo 'Aplicar' . +Cambia la textura [TEXTURE_NUM] por una imagen de 24-bit y 512x512 o menor, y pulsa de nuevo 'Aplicar' . </notification> <notification name="InvalidTerrainSize"> No se han podido configurar las texturas de la región: La textura del terreno [TEXTURE_NUM] es demasiado grande: [TEXTURE_SIZE_X]x[TEXTURE_SIZE_Y]. -Cambie la textura [TEXTURE_NUM] por una imagen de 24-bit y 512x512 o menor, y pulse de nuevo 'Aplicar' . +Cambia la textura [TEXTURE_NUM] por una imagen de 24-bit y 512x512 o menor, y pulsa de nuevo 'Aplicar' . </notification> <notification name="RawUploadStarted"> - Ha empezado la subida. Dependiendo de la velocidad de su conexión, llevará unos dos minutos. + Ha empezado la subida. Dependiendo de la velocidad de tu conexión, llevará unos dos minutos. </notification> <notification name="ConfirmBakeTerrain"> - ¿Realmente quiere predeterminar el terreno actual, haciéndolo el centro de los limites para elevarlo y rebajarlo, y el terreno por defecto para la herramienta 'Revertir'? + ¿Realmente quieres predeterminar el terreno actual, haciéndolo el centro de los limites para elevarlo y rebajarlo, y el terreno por defecto para la herramienta 'Revertir'? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="MaxAllowedAgentOnRegion"> - Sólo puede tener [MAX_AGENTS] residentes autorizados. + Sólo puedes tener [MAX_AGENTS] residentes autorizados. </notification> <notification name="MaxBannedAgentsOnRegion"> - Sólo puede tener [MAX_BANNED] residentes no admitidos. + Sólo puedes tener [MAX_BANNED] residentes no admitidos. </notification> <notification name="MaxAgentOnRegionBatch"> Fallo al intentar añadir [NUM_ADDED] agentes: Se superan en [NUM_EXCESS] los [MAX_AGENTS] permitidos en [LIST_TYPE]. </notification> <notification name="MaxAllowedGroupsOnRegion"> - Sólo puede tener [MAX_GROUPS] grupos permitidos. + Sólo puedes tener [MAX_GROUPS] grupos permitidos. <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Predeterminar"/> </notification> <notification name="MaxManagersOnRegion"> - Sólo puede tener [MAX_MANAGER] administradores del estado. + Sólo puedes tener [MAX_MANAGER] administradores del estado. </notification> <notification name="OwnerCanNotBeDenied"> No se puede añadir a la lista de residentes no admitidos al propietario del estado. </notification> <notification name="CanNotChangeAppearanceUntilLoaded"> - No puede cambiar la apariencia hasta que no se carguen la ropa y la forma. + No puedes cambiar la apariencia hasta que no se carguen la ropa y la forma. </notification> <notification name="ClassifiedMustBeAlphanumeric"> - El nombre de su anuncio clasificado debe empezar o con un número o con una letra de la A a la Z. No se permiten signos de puntuación. + El nombre de tu anuncio clasificado debe empezar o con un número o con una letra de la A a la Z. No se permiten signos de puntuación. </notification> <notification name="CantSetBuyObject"> No puede configurar el Comprar el objeto, porque éste no está en venta. -Por favor, ponga en venta el objeto y reinténtelo. +Por favor, pon en venta el objeto y vuelve a intentarlo. </notification> <notification name="FinishedRawDownload"> Acabada la descarga del archivo raw de terreno en: [DOWNLOAD_PATH]. </notification> <notification name="DownloadWindowsMandatory"> - Está disponible una versión nueva de [APP_NAME]. + Hay una versión nueva de [SECOND_LIFE] disponible. [MESSAGE] -Debe descargar esta actualización para usar [APP_NAME]. +Debes descargar esta actualización para usar [SECOND_LIFE]. <usetemplate name="okcancelbuttons" notext="Salir" yestext="Descargarla"/> </notification> <notification name="DownloadWindows"> - Está disponible una versión actualizada de [APP_NAME]. + Hay una versión actualizada de [SECOND_LIFE] disponible. [MESSAGE] -Esta actualización no es obligatoria, pero le sugerimos instalarla para mejorar el rendimiento y la estabilidad. +Esta actualización no es obligatoria, pero te sugerimos instalarla para mejorar el rendimiento y la estabilidad. <usetemplate name="okcancelbuttons" notext="Continuar" yestext="Descargarla"/> </notification> <notification name="DownloadWindowsReleaseForDownload"> - Está disponible una versión actualizada de [APP_NAME]. + Hay una versión actualizada de [SECOND_LIFE] disponible. [MESSAGE] -Esta actualización no es obligatoria, pero le sugerimos instalarla para mejorar el rendimiento y la estabilidad. +Esta actualización no es obligatoria, pero te sugerimos instalarla para mejorar el rendimiento y la estabilidad. <usetemplate name="okcancelbuttons" notext="Continuar" yestext="Descargarla"/> </notification> + <notification name="DownloadLinuxMandatory"> + Hay una versión nueva de [SECOND_LIFE] disponible. +[MESSAGE] +Debes descargar esta actualización para usar [SECOND_LIFE]. + <usetemplate name="okcancelbuttons" notext="Salir" yestext="Descargar"/> + </notification> + <notification name="DownloadLinux"> + Hay una versión actualizada de [SECOND_LIFE] disponible. +[MESSAGE] +Esta actualización no es obligatoria, pero te sugerimos instalarla para mejorar el rendimiento y la estabilidad. + <usetemplate name="okcancelbuttons" notext="Continuar" yestext="Descargar"/> + </notification> + <notification name="DownloadLinuxReleaseForDownload"> + Hay una versión actualizada de [SECOND_LIFE] disponible. +[MESSAGE] +Esta actualización no es obligatoria, pero te sugerimos instalarla para mejorar el rendimiento y la estabilidad. + <usetemplate name="okcancelbuttons" notext="Continuar" yestext="Descargar"/> + </notification> <notification name="DownloadMacMandatory"> - Está disponible una versión nueva de [APP_NAME]. + Hay una versión nueva de [SECOND_LIFE] disponible. [MESSAGE] -Debe descargar esta actualización para usar [APP_NAME]. +Debes descargar esta actualización para usar [SECOND_LIFE]. -¿Descargarla a su carpeta de aplicaciones? +¿Descargarla a tu carpeta de Programas? <usetemplate name="okcancelbuttons" notext="Salir" yestext="Descargarla"/> </notification> <notification name="DownloadMac"> - Está disponible una versión actualizada de [APP_NAME]. + Hay una versión actualizada de [SECOND_LIFE] disponible. [MESSAGE] -Esta actualización no es obligatoria, pero le sugerimos instalarla para mejorar el rendimiento y la estabilidad. +Esta actualización no es obligatoria, pero te sugerimos instalarla para mejorar el rendimiento y la estabilidad. -¿Descargarla a su carpeta de aplicaciones? +¿Descargarla a tu carpeta de Programas? <usetemplate name="okcancelbuttons" notext="Continuar" yestext="Descargarla"/> </notification> <notification name="DownloadMacReleaseForDownload"> - Está disponible una versión actualizada de [APP_NAME]. + Hay una versión actualizada de [SECOND_LIFE] disponible. [MESSAGE] -Esta actualización no es obligatoria, pero le sugerimos instalarla para mejorar el rendimiento y la estabilidad. +Esta actualización no es obligatoria, pero te sugerimos instalarla para mejorar el rendimiento y la estabilidad. -¿Descargarla a su carpeta de aplicaciones? +¿Descargarla a tu carpeta de Programas? <usetemplate name="okcancelbuttons" notext="Continuar" yestext="Descargarla"/> </notification> <notification name="DeedObjectToGroup"> Transferir este objeto al grupo hará que: * Reciba los L$ pagados en el objeto - <usetemplate ignoretext="Cuando se transfieren objetos a los grupos" name="okcancelignore" notext="Cancelar" yestext="Transferir"/> + <usetemplate ignoretext="Confirmar antes de transferir un objeto al grupo" name="okcancelignore" notext="Cancelar" yestext="Transferir"/> </notification> <notification name="WebLaunchExternalTarget"> - ¿Abrir el navegador de su sistema para ver este contenido? - <usetemplate ignoretext="Cuando se abra el navegador de su sistema para ver una página web" name="okcancelignore" notext="Cancelar" yestext="OK"/> + ¿Quieres abrir tu navegador para ver este contenido? + <usetemplate ignoretext="Abrir mi navegador para ver una página web" name="okcancelignore" notext="Cancelar" yestext="OK"/> </notification> <notification name="WebLaunchJoinNow"> - ¿Ir a www.secondlife.com para administrar su cuenta? - <usetemplate ignoretext="Cuando se abra el navegador para administrar su cuenta" name="okcancelignore" notext="Cancelar" yestext="OK"/> + ¿Ir al [http://secondlife.com/account/ Panel de Control] para administrar tu cuenta? + <usetemplate ignoretext="Abrir mi navegador para administrar mi cuenta" name="okcancelignore" notext="Cancelar" yestext="OK"/> </notification> <notification name="WebLaunchSecurityIssues"> - Visite el wiki de [SECOND_LIFE] para más detalles sobre cómo informar de una cuestión de seguridad. - <usetemplate ignoretext="Cuando se abra el navegador para ver el wiki de cuestiones de seguridad" name="okcancelignore" notext="Cancelar" yestext="OK"/> + Visita el wiki de [SECOND_LIFE] para más detalles sobre cómo informar de una cuestión de seguridad. + <usetemplate ignoretext="Abrir mi navegador para informar de un fallo de seguridad" name="okcancelignore" notext="Cancelar" yestext="OK"/> </notification> <notification name="WebLaunchQAWiki"> - Visite el wiki QA de [SECOND_LIFE]. - <usetemplate ignoretext="Cuando se abra el navegador para ver el wiki QA" name="okcancelignore" notext="Cancelar" yestext="OK"/> + Visita el wiki QA de [SECOND_LIFE]. + <usetemplate ignoretext="Abrir mi navegador para el ver el wiki de 'QA' (Control de Calidad)" name="okcancelignore" notext="Cancelar" yestext="OK"/> </notification> <notification name="WebLaunchPublicIssue"> - Visite el Public Issue Tracker (sistema público de seguimiento de incidencias) de [SECOND_LIFE], donde podrá informar de errores y otros asuntos. - <usetemplate ignoretext="Cuando se abra el navegador para ver el Public Issue Tracker" name="okcancelignore" notext="Cancelar" yestext="Ir a la página"/> - </notification> - <notification name="WebLaunchPublicIssueHelp"> - Visite el wiki de [SECOND_LIFE] para informarse de cómo usar el Public Issue Tracker (sistema público de seguimiento de incidencias). - <usetemplate ignoretext="Cuando se abra el navegador para ver el wiki del Public Issue Tracker" name="okcancelignore" notext="Cancelar" yestext="Ir a la página"/> + Visita el Public Issue Tracker (sistema público de seguimiento de incidencias) de [SECOND_LIFE], donde podrás informar de errores y otros asuntos. + <usetemplate ignoretext="Abrir mi navegador para usar el 'Public Issue Tracker'" name="okcancelignore" notext="Cancelar" yestext="Ir a la página"/> </notification> <notification name="WebLaunchSupportWiki"> Para ver las últimas noticias e informaciones, ¿ir la Blog oficial? - <usetemplate ignoretext="Cuando se abra el navegador para ver el blog" name="okcancelignore" notext="Cancelar" yestext="OK"/> + <usetemplate ignoretext="Abrir mi navegador para ver el blog" name="okcancelignore" notext="Cancelar" yestext="OK"/> </notification> <notification name="WebLaunchLSLGuide"> - ¿Ir a la GuÃa de programación para encontrar ayuda? - <usetemplate ignoretext="Cuando se abra el navegador para ver la GuÃa de programación" name="okcancelignore" notext="Cancelar" yestext="OK"/> + ¿Quieres abrir la GuÃa de Script para tener ayuda sobre el tema? + <usetemplate ignoretext="Abrir mi navegador para ver la GuÃa de Script" name="okcancelignore" notext="Cancelar" yestext="OK"/> </notification> <notification name="WebLaunchLSLWiki"> - ¿Ir al portal de LSL para encontrar ayuda sobre programación? - <usetemplate ignoretext="Cuando se abra el navegador para ver el portal de programación" name="okcancelignore" notext="Cancelar" yestext="Ir a la página"/> + ¿Quieres visitar el portal de LSL para tener ayuda sobre manejo de scripts? + <usetemplate ignoretext="Abrir mi navegador para ver el portal de LSL" name="okcancelignore" notext="Cancelar" yestext="Ir a la página"/> </notification> <notification name="ReturnToOwner"> - ¿Está seguro de que quiere devolver los objetos seleccionados a sus propietarios? Los objetos transferibles que se hayan cedido volverán a sus propietarios anteriores. + ¿Estás seguro de que quieres devolver los objetos seleccionados a sus propietarios? Los objetos transferibles que se hayan cedido volverán a sus propietarios anteriores. *ATENCIÓN* ¡Serán borrados los objetos no transferibles que estén cedidos! - <usetemplate ignoretext="Cuando se devuelvan los objetos a sus propietarios" name="okcancelignore" notext="Cancelar" yestext="OK"/> + <usetemplate ignoretext="Confirmar antes de devolver objetos a sus propietarios." name="okcancelignore" notext="Cancelar" yestext="OK"/> </notification> <notification name="GroupLeaveConfirmMember"> - Actualmente, usted es miembro del grupo [GROUP]. + Actualmente, eres miembro del grupo [GROUP]. ¿Dejar el grupo? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="ConfirmKick"> - ¿DE VERDAD quiere expulsar a todos los usuarios de este grid? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Expulsar a todos los usuarios"/> + ¿Quieres realmente expulsar a todos los residentes de la cuadrÃcula? + <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Expulsar a todos los Residentes"/> </notification> <notification name="MuteLinden"> - Perdón, pero no puede ignorar a un Linden. + Lo sentimos, pero no puedes ignorar a un Linden. <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="CannotStartAuctionAlreadyForSale"> - No puede empezar una subasta en una parcela que ya está en venta. Desactive la venta de terreno si está seguro de querer iniciar una subasta. + No puedes empezar una subasta en una parcela que ya está en venta. Desactiva la venta de terreno si estás seguro de querer iniciar una subasta. </notification> - <notification label="Fallo al ignorar un objeto según el nombre" name="MuteByNameFailed"> - Ya ha ignorado ese nombre. + <notification label="Falló ignorar el objeto según su nombre." name="MuteByNameFailed"> + Ya has ignorado este nombre. <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="RemoveItemWarn"> Aunque esté permitido, borrar contenidos puede dañar el objeto. -¿Quiere borrar ese Ãtem? +¿Quieres borrar ese Ãtem? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="CantOfferCallingCard"> - En este momento, no se puede ofrecer una tarjeta de visita. Por favor, reinténtelo en un momento. + En este momento, no se puede ofrecer una tarjeta de visita. Por favor, vuelve a intentarlo en un momento. <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="CantOfferFriendship"> - En este momento, no se puede ofrecer el ser amigo. Por favor, reinténtelo en un momento. + En este momento, no se puede ofrecer el ser amigo. Por favor, vuelve a intentarlo en un momento. <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="BusyModeSet"> Pasar al modo ocupado. -Se ocultará el chat y los mensajes instantáneos. Los mensajes instantáneos recibirán su Respuesta en el modo ocupado. Todos los ofrecimientos de teleporte serán rehusados. Todas las ofertas de inventario irán a su Papelera. - <usetemplate ignoretext="Cuando se pasa al modo ocupado" name="okignore" yestext="OK"/> +Se ocultará el chat y los mensajes instantáneos (éstos recibirán tu Respuesta en el modo ocupado). Se rehusarán todos los ofrecimientos de teleporte. Todas las ofertas de inventario irán a tu Papelera. + <usetemplate ignoretext="Cambio mi estado al modo ocupado" name="okignore" yestext="OK"/> </notification> <notification name="JoinedTooManyGroupsMember"> - Pertenece a demasiados grupos para poder entrar en otro. Por favor, salga de al menos uno antes de entrar en éste, o rehúse la oferta. Para salir de un grupo, seleccione la opción 'Grupos...' en el menú 'Editar'. -[NAME] le ha invitado a ser miembro de un grupo. -[INVITE] + Has superado tu número máximo de grupos. Por favor, sal de al menos uno antes de entrar en éste, o rehúsa la oferta. +[NAME] te ha invitado a ser miembro de un grupo. <usetemplate name="okcancelbuttons" notext="Rehusar" yestext="Entrar"/> </notification> + <notification name="JoinedTooManyGroups"> + Has superado tu número máximo de grupos. Por favor, sal de al menos uno de ellos antes de crear uno nuevo o entrar en alguno. + <usetemplate name="okbutton" yestext="OK"/> + </notification> <notification name="KickUser"> - ¿Con qué mensaje se expulsará a este usuario? + ¿Con qué mensaje quieres expulsar a este Residente? <form name="form"> <input name="message"> - Un administrador le ha desconectado. + Un administrador te ha desconectado. </input> <button name="OK" text="OK"/> <button name="Cancel" text="Cancelar"/> @@ -1406,34 +1442,34 @@ Se ocultará el chat y los mensajes instantáneos. Los mensajes instantáneos re ¿Con qué mensaje se expulsará a cualquiera que esté actualmente en el grid? <form name="form"> <input name="message"> - Un administrador le ha desconectado. + Un administrador te ha desconectado. </input> <button name="OK" text="OK"/> <button name="Cancel" text="Cancelar"/> </form> </notification> <notification name="FreezeUser"> - ¿Con qué mensaje se congelará a este usuario? + ¿Con qué mensaje quieres congelar a este residente? <form name="form"> <input name="message"> - Ha sido usted congelado. No puede moverse o escribir en el chat. Un administrador contactará con usted a través de un mensaje instantáneo (MI). + Has sido congelado. No puedes moverte o escribir en el chat. Un administrador se pondrá en contacto contigo a través de un mensaje instantáneo (MI). </input> <button name="OK" text="OK"/> <button name="Cancel" text="Cancelar"/> </form> </notification> <notification name="UnFreezeUser"> - ¿Con qué mensaje se descongelará a este usuario? + ¿Con qué mensaje quieres congelar a este residente? <form name="form"> <input name="message"> - Ya no está usted congelado. + Ya no estás congelado. </input> <button name="OK" text="OK"/> <button name="Cancel" text="Cancelar"/> </form> </notification> <notification name="OfferTeleport"> - ¿Ofrecer teleporte a su posición con este mensaje? + ¿Ofrecer teleporte a tu posición con este mensaje? <form name="form"> <input name="message"> Ven conmigo a [REGION] @@ -1443,7 +1479,7 @@ Se ocultará el chat y los mensajes instantáneos. Los mensajes instantáneos re </form> </notification> <notification name="OfferTeleportFromGod"> - ¿Convocar a este usuario a su posición? + ¿Obligar a este Residente a ir a tu localización? <form name="form"> <input name="message"> Ven conmigo a [REGION] @@ -1453,11 +1489,23 @@ Se ocultará el chat y los mensajes instantáneos. Los mensajes instantáneos re </form> </notification> <notification name="TeleportFromLandmark"> - ¿Está seguro de que quiere teleportarse? - <usetemplate ignoretext="Cuando está teleportando desde un hito del inventario" name="okcancelignore" notext="Cancelar" yestext="Teleportar"/> + ¿Seguro que quieres teleportarte a <nolink>[LOCATION]</nolink>? + <usetemplate ignoretext="Confirmar que quiero teleportarme a un hito" name="okcancelignore" notext="Cancelar" yestext="Teleportar"/> + </notification> + <notification name="TeleportToPick"> + ¿Teleportarte a [PICK]? + <usetemplate ignoretext="Confirmar el teleporte a una localización de los Destacados" name="okcancelignore" notext="Cancelar" yestext="Teleportar"/> + </notification> + <notification name="TeleportToClassified"> + ¿Teleportarte a [CLASSIFIED]? + <usetemplate ignoretext="Confirmar el teleporte a una localización de los Clasificados" name="okcancelignore" notext="Cancelar" yestext="Teleportar"/> + </notification> + <notification name="TeleportToHistoryEntry"> + ¿Teleportarse a [HISTORY_ENTRY]? + <usetemplate ignoretext="Confirmar que quiero teleportarme a una localización del historial" name="okcancelignore" notext="Cancelar" yestext="Teleportar"/> </notification> <notification label="Mensaje a todo el estado" name="MessageEstate"> - Escriba un anuncio breve que se enviará a todo el que esté en su estado. + Escribe un anuncio breve que se enviará a todo el que esté en tu estado. <form name="form"> <input name="message"/> <button name="OK" text="OK"/> @@ -1465,15 +1513,15 @@ Se ocultará el chat y los mensajes instantáneos. Los mensajes instantáneos re </form> </notification> <notification label="Cambiar un estado Linden" name="ChangeLindenEstate"> - Va a hacer cambios en un estado propiedad de Linden (mainland, grid teen, orientación, etc.). + Estás a punto de cambiar un estado propiedad de Linden (continente, teen grid, orientación, etc.). -Esto es EXTREMADAMENTE PELIGROSO, porque puede afectar radicalmente al funcionamiento de los usuarios. En mainland, se cambiarán miles de regiones, y se provocará un colapso en el espacio del servidor. +Esto es EXTREMADAMENTE PELIGROSO porque puede afectar en gran manera la experiencia de los Residentes. En el Continente, cambiará miles de regiones y y se provocará un colapso en el espacio del servidor. -¿Proceder? +¿Continuar? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification label="Cambiar el acceso a un estado Linden" name="ChangeLindenAccess"> - Va a cambiar la lista de acceso de un estado propiedad de Linden (mainland, grid teen, orientación, etc.). + Vas a cambiar la lista de acceso de un estado propiedad de Linden (mainland, grid teen, orientación, etc.). Esto es PELIGROSO, y sólo debe hacerse para deshacerse de ataques que permitan sacar o meter en el grid objetos o L$. Se cambiarán miles de regiones, y se provocará un colapso en el espacio del servidor. @@ -1516,118 +1564,90 @@ Se cambiarán miles de regiones, y se provocará un colapso en el espacio del se <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="EstateChangeCovenant"> - ¿Está seguro de que quiere cambiar el contrato del estado? + ¿Estás seguro de que quieres cambiar el contrato del estado? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="RegionEntryAccessBlocked"> - Usted no está autorizado en esa región por su nivel de calificación. Puede deberse a que no hay información validada de su edad. + No estás autorizado en esa región por su nivel de calificación. Puede deberse a que no hay información validada de tu edad. -Por favor, compruebe que tiene instalado el último visor, y vaya a la Base de Conocimientos para más detalles sobre el acceso a zonas con este nivel de calificación. - <usetemplate - name="okbutton" - yestext="OK"/> +Por favor, comprueba que tienes instalado el último visor, y dirÃgete a la Base de Conocimientos para más detalles sobre el acceso a zonas con este nivel de calificación. + <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="RegionEntryAccessBlocked_KB"> - Usted no está autorizado en esa región por su nivel de calificación. + No estás autorizado en esa región por su nivel de calificación. -¿Quiere ir a la Base de Conocimientos para aprender más sobre el nivel de calificación? +¿Quieres ir a la Base de Conocimientos para aprender más sobre el nivel de calificación? <url name="url"> http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/es </url> - <usetemplate - name="okcancelignore" - yestext="Ir a la Base de Conocimientos" - notext="Cerrar" - ignoretext="Cuando la entrada a la región está bloqueada por el nivel de calificación"/> + <usetemplate ignoretext="No puedo entrar a esta región dado el nivel de calificación" name="okcancelignore" notext="Cerrar" yestext="Ir a la Base de Conocimientos"/> </notification> <notification name="RegionEntryAccessBlocked_Notify"> - Usted no está autorizado en esa región por su nivel de calificación. + No estás autorizado en esa región por su nivel de calificación. </notification> <notification name="RegionEntryAccessBlocked_Change"> - Usted no está autorizado en esa región por su nivel de calificación.. - -Puede pulsar 'Cambiar preferencia' para aumentar su nivel de calificación y poder entrar. Desde ese momento, podrá buscar y acceder a contenido [REGIONMATURITY]. Si más adelante quiere deshacer esta configuración, vaya a Editar > Preferencias... > General. - <form name="form"> - <button - name="OK" - text="Cambiar preferencia"/> - <button - default="true" - name="Cancel" - text="Cerrar"/> - <ignore name="ignore" text="Cuando la entrada a la región está bloqueada por la preferencia del nivel de calificación"/> - </form> + No estás autorizado en esta región por tus preferencias sobre el nivel de calificación. + +Para entrar en la región que deseas, cambia tu preferencia de nivel de calificación. Esto te permitirá buscar contenidos [REGIONMATURITY] y tener acceso a ellos. Para deshacer los cambios, elige Yo > Preferencias > General. + <form name="form"> + <button name="OK" text="Cambiar las preferencias"/> + <button default="true" name="Cancel" text="Cerrar"/> + <ignore name="ignore" text="Mis preferencias sobre nivel de calificación me impiden entrar a esta región"/> + </form> + </notification> + <notification name="PreferredMaturityChanged"> + Tu preferencia de nivel de calificación actual es [RATING]. </notification> <notification name="LandClaimAccessBlocked"> - Usted no puede reclamar este terreno por su nivel de calificación. Puede deberse a que no hay información validada de su edad. + No puedes reclamar este terreno por su nivel de calificación. Puede deberse a que no hay información validada de tu edad. -Por favor, compruebe que tiene instalado el último visor, y vaya a la Base de Conocimientos para más detalles sobre el acceso a zonas con este nivel de calificación. - <usetemplate - name="okbutton" - yestext="OK"/> +Por favor, comprueba que tienes instalado el último visor, y dirÃgete a la Base de Conocimientos para más detalles sobre el acceso a zonas con este nivel de calificación. + <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="LandClaimAccessBlocked_KB"> - No puede reclamar este terreno por sus nivel de calificación. + No puedes reclamar este terreno por su nivel de calificación. -¿Quiere ir a la Base de Conocimientos para más información sobre el nivel de calificación? +¿Quieres ir a la Base de Conocimientos para más información sobre el nivel de calificación? <url name="url"> http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/es </url> - <usetemplate - name="okcancelignore" - yestext="Ir a la Base de Conocimientos" - notext="Cerrar" - ignoretext="Cuando el reclamar terreno está bloqueado por el nivel de calificación"/> + <usetemplate ignoretext="No puedo reclamar este terreno dado el nivel de calificación" name="okcancelignore" notext="Cerrar" yestext="Ir a la Base de Conocimientos"/> </notification> <notification name="LandClaimAccessBlocked_Notify"> - Por su nivel de calificación, usted no puede reclamar este terreno. + No puedes reclamar este terreno debido a su nivel de calificación. </notification> <notification name="LandClaimAccessBlocked_Change"> - No puede reclamar este terreno por sus preferencias de nivel de calificación. + No puedes reclamar este terreno por tus preferencias sobre el nivel de calificación. -Puede pulsar 'Cambiar preferencia' para aumentar su nivel de calificación y poder entrar. Desde ese momento, podrá buscar y acceder a contenido [REGIONMATURITY]. Si más adelante quiere deshacer esta configuración, vaya a Editar > Preferencias... > General.. - <usetemplate - name="okcancelignore" - yestext="Cambiar preferencia" - notext="Cerrar" - ignoretext="Cuando el reclamar terreno está bloqueado por la preferencia del nivel de calificación"/> +Puedes pulsar 'Cambiar las Preferencias' para incrementar las preferencias del nivel de calificación y, asÃ, poder entrar. En adelante, podrás buscar y acceder a contenido [REGIONMATURITY]. Si más adelante quieres deshacer este cambio, ve a Yo > Preferencias > General. + <usetemplate ignoretext="Mis preferencias sobre el nivel de calificación me impiden reclamar este terreno" name="okcancelignore" notext="Cerrar" yestext="Cambiar preferencia"/> </notification> <notification name="LandBuyAccessBlocked"> - Usted no puede comprar este terreno por su nivel de calificación. Puede deberse a que no hay información validada de su edad. + No puedes comprar este terreno por su nivel de calificación. Puede deberse a que no hay información validada de tu edad. -Por favor, compruebe que tiene instalado el último visor, y vaya a la Base de Conocimientos para más detalles sobre el acceso a zonas con este nivel de calificación. - <usetemplate - name="okbutton" - yestext="OK"/> +Por favor, comprueba que tienes instalado el último visor, y dirÃgete a la Base de Conocimientos para más detalles sobre el acceso a zonas con este nivel de calificación. + <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="LandBuyAccessBlocked_KB"> - No puede comprar este terreno por sus preferencias de nivel de calificación. + No puedes comprar este terreno por tus preferencias de nivel de calificación. -¿Quiere ir a la Base de Conocimientos para más información sobre el nivel de calificación? +¿Quieres ir a la Base de Conocimientos para más información sobre el nivel de calificación? <url name="url"> http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/es </url> - <usetemplate - name="okcancelignore" - yestext="Ir a la Base de Conocimientos" - notext="Cerrar" - ignoretext="Cuando la compra de terreno está bloqueada por el nivel de calificación"/> + <usetemplate ignoretext="No puedo comprar este terreno dado el nivel de calificación" name="okcancelignore" notext="Cerrar" yestext="Ir a la Base de Conocimientos"/> </notification> <notification name="LandBuyAccessBlocked_Notify"> - No puede comprar este terreno por su nivel de calificación. + No puedes comprar este terreno por su nivel de calificación. </notification> <notification name="LandBuyAccessBlocked_Change"> - No puede comprar este terreno por sus preferencias de nivel de calificación. + No puedes comprar este terreno por tus preferencias sobre el nivel de calificación. -Puede pulsar 'Cambiar preferencia' para aumentar su nivel de calificación y poder entrar. Desde ese momento, podrá buscar y acceder a contenido [REGIONMATURITY]. Si más adelante quiere deshacer esta configuración, vaya a Editar > Preferencias... > General. - <usetemplate - name="okcancelignore" - yestext="Cambiar preferencia" - notext="Cerrar" - ignoretext="Cuando la compra de terreno está bloqueada por la preferencia del nivel de calificación"/> +Puedes pulsar 'Cambiar las Preferencias' para incrementar las preferencias del nivel de calificación y, asÃ, poder entrar. En adelante, podrás buscar y acceder a contenido [REGIONMATURITY]. Si más adelante quieres deshacer este cambio, ve a Yo > Preferencias > General. + <usetemplate ignoretext="Mis preferencias sobre el nivel de calificación me impiden comprar el terreno" name="okcancelignore" notext="Cerrar" yestext="Cambiar preferencia"/> </notification> <notification name="TooManyPrimsSelected"> - "Hay seleccionadas demasiadas primitivas. Por favor, seleccione [MAX_PRIM_COUNT] o menos, y reinténtelo." + Hay demasiados prims seleccionados. Por favor, selecciona [MAX_PRIM_COUNT] o menos y vuelve a intentarlo <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="ProblemImportingEstateCovenant"> @@ -1638,13 +1658,11 @@ Puede pulsar 'Cambiar preferencia' para aumentar su nivel de calificac Hay problemas al añadir un administrador nuevo del estado. Uno o más estados deben de tener llena la lista de administradores. </notification> <notification name="ProblemAddingEstateGeneric"> - Hay problemas en este añadir a la lista del estado. Uno o más estados deben de tener llena la lista. + Hay problemas al añadir a la lista del estado. Uno o más estados deben de tener llena la lista. </notification> <notification name="UnableToLoadNotecardAsset"> En este momento, no se pueden cargar los datos de la's nota's. - <usetemplate - name="okbutton" - yestext="OK"/> + <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="NotAllowedToViewNotecard"> Permisos insuficientes para ver la nota asociada a la ID solicitada. @@ -1655,276 +1673,56 @@ Puede pulsar 'Cambiar preferencia' para aumentar su nivel de calificac <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="PublishClassified"> - Recuerde: las cuotas que se pagan por los clasificados no son reembolsables. + Recuerda: las cuotas que se pagan por los clasificados no son reembolsables. ¿Publicar ahora este anuncio por [AMOUNT] L$? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="SetClassifiedMature"> - ¿Este anuncio tiene contenido 'Mature'? - <usetemplate - canceltext="Cancelar" - name="yesnocancelbuttons" - notext="No" - yestext="SÃ"/> + ¿Este anuncio tiene contenido 'Moderado'? + <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="No" yestext="SÃ"/> </notification> <notification name="SetGroupMature"> - ¿Este grupo tiene contenido 'Mature'? - <usetemplate - canceltext="Cancelar" - name="yesnocancelbuttons" - notext="No" - yestext="SÃ"/> + ¿Este grupo tiene contenido 'Moderado'? + <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="No" yestext="SÃ"/> </notification> <notification label="Confirmar el reinicio" name="ConfirmRestart"> - ¿Verdaderamente quiere reiniciar la región de aquà a 2 minutos? + ¿Verdaderamente quieres reiniciar la región de aquà a 2 minutos? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification label="Mensaje a toda la región" name="MessageRegion"> - Escriba un anuncio breve que se enviará a todo el que esté en esta región. + Escribe un anuncio breve que se enviará a todo el que esté en esta región. <form name="form"> <input name="message"/> <button name="OK" text="OK"/> <button name="Cancel" text="Cancelar"/> </form> </notification> - <notification label="No permitir modificar el terreno" name="HelpRegionBlockTerraform"> - Si se marca está casilla, los propietarios de terreno no podrán modificarlo, independientemente de lo que esté configurado en cada parcela. - -Por defecto: off - </notification> - <notification label="Prohibir volar" name="HelpRegionBlockFly"> - Si se marca esta casilla, estará prohibido volar en la región, independientemente de lo que esté configurado en cada parcela. - -Por defecto: off - </notification> - <notification label="Cambio múltiple de permisos del contenido" name="HelpBulkPermission"> - La herramienta de cambio múltiple de permisos le ayuda a cambiar con rapidez los permisos de varios de los objetos contenidos en el objeto u objetos que seleccione. Pero fÃjese que sólo configurará los permisos de los Ãtems que están en el contenido de los objetos seleccionados, no los de esos objetos que los contienen. - -Note también que los permisos no se aplicarán a los contenidos que puedan tener cada uno de los Ãtems. Lo que haga sólo afectará a los Ãtems que estén exactamente en el primer nivel de contenidos. - -Puede elegir qué clase de Ãtems modificar usando la lista 'Tipos de contenido' here. Las imágenes se consideran incluidas si selecciona Texturas. - -* Esta herramienta sólo puede cambiar los permisos de aquellos Ãtems de los que usted esté autorizado a cambiarlos. -* No puede otorgar al siguiente propietario permisos que usted no tenga ya. -* Los permisos para el nuevo propietario son, en principio, una solicitud. Si alguno de los Ãtems no puede coger todos esos permisos solicitados, no cambiará ninguno de los permisos que tenga. - -Cuando esté listo para efectuar el cambio múltiple de permisos, pulse 'Aplicar' y espere a que se muestren los resultados. - -SSi cierra la ventana de Cambio múltiple de permisos mientras se están cambiando, se cancelará la operación. - </notification> - <notification label="Permitir el daño" name="HelpRegionAllowDamage"> - Si se marca la casilla, el sistema de 'vida' afecta a todas las parcelas independientemente de lo que tenga marcado cada una. -Si la casilla no está marcada, el propietario de cada parcela podrá decidir si activa en ella el sistema de 'vida'. - -Por defecto: off - </notification> - <notification label="Nº máximo de avatares" name="HelpRegionAgentLimit"> - Configura el número máximo de avatares que se permite en esta región. -El funcionamiento puede variar según el número de avatares que estén presentes. - -Por defecto: 40 - </notification> - <notification label="Plus de objetos" name="HelpRegionObjectBonus"> - El plus de objetos es un multiplicador de los prims permitidos en cualquier parcela. -El rango permitido es de 1 a 10. Fijándolo en '1', se permiten 117 objetos en cada parcela de 512 m². Fijándolo en '2', se permiten 234 (el doble), y asà sucesivamente. El número máximo de objetos permitidos en una región sigue siendo de 15.000, sea cual sea el plus. -Una vez establecido, tenga en cuenta que reducir el plus de objetos puede causar que se devuelvan o borren objetos. - -Por defecto: 1.0 - </notification> - <notification label="Calificación" name="HelpRegionMaturity"> - Configura el nivel de calificación de la región, tal como se verá en la barra superior del visor de cualquier residente, y en los datos que mostrará el mapa del mundo cuando se pase el cursor sobre esta región. Esta configuración también afecta al acceso a esta región y a los resultados de la búsqueda. Los demás residentes sólo entrarán en las regiones o verán aquellos resultados de la búsqueda que tengan el mismo nivel de calificación que ellos han elegido en sus preferencias. - -Puede llevar algún tiempo que este cambio se refleje en el mapa. - </notification> - <notification label="Impedir 'empujar'" name="HelpRegionRestrictPushObject"> - Esta casilla controla en toda la región los permisos para que haya 'empujones'. -Cuando está activada, los residentes sólo pueden ser empujados por sà mismos o por el propietario de la parcela. -('Empujar' se refiere a la función llPushObject() del LSL). - -Por defecto: Off - </notification> - <notification label="Unir/Dividir parcelas" name="HelpParcelChanges"> - Esta casilla determina si las parcelas que no son del propietario del estado pueden unirse o subdividirse. -Si no se marca esta opción: - * Sólo los propietarios o los administradores del estado pueden unir o dividir parcelas. - * Sólo podrán unir o dividir las parcelas pertenecientes al propietario o a un grupo en el que tengan los poderes adecuados. -Si se marca esta opción: - * Todo los propietarios de parcelas podrán unir o dividir las que posean. - * En parcelas propiedad de un grupo, quienes tengan los poderes adecuados podrán unirlas o dividirlas. - -Por defecto: Marcado - </notification> - <notification label="No mostrar en la búsqueda" name="HelpRegionSearch"> - Marcando esta casilla bloqueará que los propietarios de parcelas puedan listarlas en la búsqueda. - -Por defecto: Off - </notification> <notification label="Cambiada la calificación de la región" name="RegionMaturityChange"> - Se ha actualizado la calificación de esta región. -Llevará algún tiempo que el cambio se refleje en el mapa. - </notification> - <notification label="Reventa de terreno" name="HelpRegionLandResell"> - Los propietarios y los administradores del estado pueden poner en venta cualquier terreno que posea el propietario del estado. -Si se desmarca esta opción, los compradores no podrán revender el terreno que compren en esta región. -Si se marca esta opción, los compradores podrán revender el terreno que compren en esta región. - -Por defecto: Deshabilitado - </notification> - <notification label="Desactivar los scripts" name="HelpRegionDisableScripts"> - Cuando el rendimiento de un sim es pobre, el culpable puede ser un script. Abra EstadÃsticas (Ctrl+May+1). Mire Simulator Physics FPS. Si es menor de 45, abre el panel Time, en la parte inferior de las EstadÃsticas. Si ve que Script Time está en 25 ms o más alto, pulse el botón Listar los scripts según su uso, y verá el nombre y la posición de los scripts que pueden estar causando el bajo rendimiento. - -Marcando la casilla Desactivar los scripts y pulsando el botón Aplicar, se desactivarán temporalmente en esta región todos los scripts. -Debe hacer esto para viajar a la posición que ha visto en la Lista de scripts según su uso. Cuando llegue, investigue el script para determinar si es él quien causa el problema. Deberá contactar con el propietario del script, o borrar o devolver el objeto. -Desmarque la casilla Desactivar los scripts y pulse Aplicar para reactivar los scripts en la región. - -Por defecto: off - </notification> - <notification label="Desactivar las colisiones" name="HelpRegionDisableCollisions"> - Cuando el rendimiento de un sim es pobre, la culpa puede estar en los objetos fÃsicos. Abra EstadÃsticas (Ctrl+May+1). Mire Simulator Physics FPS. Si es menor de 45, abre el panel Time, en la parte inferior de las EstadÃsticas. Si ve que Sim Time (Physics) está en 20 ms o más alto, pulse el botón Listar los objetos que colisionan, y verá el nombre y la posición de los objetos que pueden estar causando el bajo rendimiento. - -Marcando la casilla Desactivar las colisiones y pulsando el botón Aplicar, se desactivarán temporalmente las colisiones entre objetos. -Debe hacer esto para viajar a la localización que se ha avisado en la Lista de objetos que colisionan. Cuando llegue, investigue el objeto: -¿está colisionando constantemente con otros objetos? Deberá contactar con el propietario del objeto, o borrarlo o devolverlo. -Desmarque la casilla Desactivar las colisiones y pulse Aplicar para reactivar las colisiones en la región. - -Por defecto: off - </notification> - <notification label="Desactivar la fÃsica" name="HelpRegionDisablePhysics"> - Desactivar la fÃsica es parecido a Desactivar las colisiones, pero se desactivan todas las simulaciones fÃsicas: no sólo se detiene la colisión de objetos, sino que también se provoca que los avatares no puedan moverse. - -Esto deberÃa usarse sólo cuando Desactivar las colisiones no ha aportado a la región suficiente rendimiento para investigar un problema con las propiedades fÃsicas o los objetos que colisionan. - -Cuando acabe, no se olvide de reactivar la fÃsica, o los avatares seguirán sin poderse mover. - -Por defecto: off - </notification> - <notification label="Objetos que colisionan" name="HelpRegionTopColliders"> - Muestra una lista de aquellos objetos con más colisiones potenciales con otros objetos. Estos objetos pueden ralentizar el rendimiento. -Seleccione Ver > EstadÃsticas, y mire Simulator > Time > Sim Time (Physics) para ver si se están empleando en 'physics' más de 20 ms. - </notification> - <notification label="Listar los scripts" name="HelpRegionTopScripts"> - Muestra una lista de los objetos que más tiempo emplean en ejecutar scripts de LSL. Estos objetos pueden ralentizar el rendimiento. -Seleccione Ver > EstadÃsticas, y mire Simulator > Time > Script Time para ver si se están empleando más de 25 ms. - </notification> - <notification label="Reiniciar la región" name="HelpRegionRestart"> - Reinicia los procesos del servidor en que corre esta región tras dos minutos de advertencia previa. Se desconectará a todos los residentes que estén en la región. La región guardará sus datos, y deberÃa volver en unos 90 segundos. - -Reiniciar la región no solventa la mayorÃa de los problemas de rendimiento, y, normalmente, debe utilizarse sólo cuando se indique. - </notification> - <notification label="Nivel del agua" name="HelpRegionWaterHeight"> - Es el nivel, en metros, del agua. Si se marca en algo distinto de 20, y usted tiene al lado el agua del mundo o un 'vacÃo', habrá una diferencia visible. - -Por defecto: 20 - </notification> - <notification label="Elevación del terreno" name="HelpRegionTerrainRaise"> - Es la distancia que, en metros, los propietarios de parcelas pueden elevar su terreno sobre la altura del terreno inicialmente creado. - -Por defecto: 4 - </notification> - <notification label="Rebaje del terreno" name="HelpRegionTerrainLower"> - Es la distancia que, en metros, los propietarios de parcelas pueden bajar su terreno sobre la altura del terreno inicialmente creado. - -Por defecto: -4 - </notification> - <notification label="Subir un RAW para el terreno" name="HelpRegionUploadRaw"> - Este botón carga un archivo .RAW en la región en que usted está. -El archivo debe tener las dimensiones correctas (RGB, 256x256) y 13 canales. La forma mejor de crear un archivo de terreno es descargar el archivo RAW existente. Un buen inicio es modificar el canal rojo -red- (altura del terreno), y subirlo. - -La carga puede llevar unos 45 segundos. FÃjese que subir un archivo de terreno *no* moverá los objetos que haya en el terreno, sólo el terreno mismo y los permisos asociados a las parcelas. -Por tanto, puede que algunos objetos acaben enterrados.. - -Para más información sobre la edición de las alturas del terreno, consulte la ayuda F1. - </notification> - <notification label="Descargar el RAW del terreno" name="HelpRegionDownloadRaw"> - Este botón descarga un archivo de esta región con los datos de alturas, dimensiones de las parcelas, estado de las parcelas en venta, y algunos permisos de las parcelas. Al abrir el archivo en un programa como Photoshop debe especificar las dimensiones del documento: RGB, 256x256 con 13 canales. -Este archivo de terreno no puede abrirse de otro modo. - -Para más información sobre la edición de las alturas del terreno, consulte la ayuda F1. - </notification> - <notification label="Usar el Sol del estado" name="HelpRegionUseEstateSun"> - Esta casilla hace que la posición del Sol en la región sea la misma que la del resto del estado. - -Por defecto: on - </notification> - <notification label="Fijar el Sol" name="HelpRegionFixedSun"> - Esta casilla fija la posición del Sol en la posición del deslizable Fase, y detiene su movimiento. - -Por defecto: off - </notification> - <notification label="Predeterminar este terreno" name="HelpRegionBakeTerrain"> - Este botón salva la forma actual del terreno como nueva forma por defecto para la región. Una vez predeterminado, el terreno puede volver a esa forma cada vez que usted u otros usan la opción 'Revertir' en Editar el terreno. El terreno predeterminado también marca el punto medio para elevar y bajar los lÃmites. - </notification> - <notification label="Administradores del estado" name="HelpEstateEstateManager"> - Un administrador del estado es un residente en el que usted delega controles de la región y configuraciones del estado. Un administrador del estado puede cambiar algunas configuraciones de estos paneles, excepto las de subir, descargar, y predeterminar el terreno. Y, concretamente, puede autorizar o expulsar a residentes de su estado. - -Sólo el propietario del estado puede añadir o remover administradores, nadie más. -Por favor, elija sólo a residentes en quienes confÃe, pues usted será el responsable último de sus acciones. - </notification> - <notification label="Usar el horario global" name="HelpEstateUseGlobalTime"> - Esta casilla hace que, en su estado, el Sol tenga la misma posición que en los estados propiedad de Linden, 'mainland'. + Se ha actualizado el nivel de calificación de esta región. +Puede que lleve algún tiempo hasta que el cambio se vea reflejado en el mapa. -Por defecto: on - </notification> - <notification label="Fijar el Sol" name="HelpEstateFixedSun"> - Esta casilla fija la posición del Sol en la posición del deslizable Fase, y detiene su movimiento. - </notification> - <notification label="Acceso público" name="HelpEstateExternallyVisible"> - Esta casilla habilita que cualquier residente que esté en otro estado pueda entrar en éste sin tener que estar en una lista de acceso. - -Por defecto: on - </notification> - <notification label="Permitir el teleporte a cualquier punto" name="HelpEstateAllowDirectTeleport"> - Cuando esta marcado, los residentes puede teleportarse directamente a cualquier punto de su estado. Si se desmarca, los residentes se teleportarán al Punto de Teleporte más cercano. - -Por defecto: off - </notification> - <notification label="Autorizar el acceso" name="HelpEstateAllowResident"> - El acceso a este estado se limitará a los residentes aquà enumerados y a cualquier grupo de abajo. Esta configuración sólo funciona cuando está desmarcado Acceso público. - </notification> - <notification label="Autorizar el acceso de grupo" name="HelpEstateAllowGroup"> - El acceso a este estado se limitará a los grupos aquà enumerados y a cualquier residente de abajo. Esta configuración sólo funciona cuando está desmarcado Acceso público. - </notification> - <notification label="Dirección de correo para infracciones" name="HelpEstateAbuseEmailAddress"> - Aportando aquà una dirección de correo válida, se hará que las Denuncias de Infracción en este estado se envÃen a esa dirección. -Si se deja en blanco, las Denuncias de Infracción se enviarán sólo a Linden Lab. - </notification> - <notification label="Denegar el acceso" name="HelpEstateBanResident"> - A los residentes en esta lista se les niega el acceso a su estado, independientemente de cualquier otra configuración. - </notification> - <notification label="Autorizar el chat de voz" name="HelpEstateVoiceChat"> - Se autoriza a las parcelas del estado a tener sus propios canales de voz en los que los residentes puedan hablar y oÃr a otros residentes. - -Por defecto: off +Para entrar a regiones Adultas, los Residentes deben haber verificado su cuenta, bien verificando la edad o bien verificando una forma de pago. </notification> <notification label="Desajuste en la versión de voz" name="VoiceVersionMismatch"> - En esta región, la versión de [APP_NAME] no es compatible con el chat de voz. Para que el chat de voz funcione correctamente, debe actualizar [APP_NAME]. - </notification> - <notification label="Contrato del estado" name="HelpEstateCovenant"> - Definir un contrato del estado le permite vender parcelas del mismo. Si no existe un contrato, no puede vender terreno. -La nota para su contrato puede estar vacÃa si es que no quiere aplicar reglas, avisos a los compradores, o cualquier otra cosa relacionada con el terreno antes de que sea comprado. - -Puede usar un contrato para comunicar al posible comprador reglas, pautas, información cultural, o, simplemente, sus propias expectativas. -AsÃ, puede hablarse de parcelación, normas de las construcciones, formas de pago, u otra información que considere que el nuevo propietario debe saber y con la que debe estar de acuerdo antes de hacer la compra. - -Para poder finalizar la compra, el comprador debe aceptar el contrato marcando la casilla adecuada. Los contratos de los estados son siempre visibles en la información Acerca del terreno en todas las parcelas. + Esta versión de [APP_NAME] no es compatible con la prestación de voz de esta región. Para que el chat de voz funcione correctamente debes actualizar [APP_NAME]. </notification> <notification label="No se pudo comprar los objetos" name="BuyObjectOneOwner"> No se pueden comprar a la vez objetos de propietarios diferentes. -Por favor, seleccione sólo un objeto y vuelva a intentarlo. +Por favor, selecciona sólo un objeto y vuelve a intentarlo. </notification> <notification label="No se pudo comprar el contenido" name="BuyContentsOneOnly"> No se puede comprar a la vez los contenidos de más de un objeto. -Por favor, seleccione sólo un objeto y vuelva a intentarlo. +Por favor, selecciona sólo un objeto y vuelve a intentarlo. </notification> <notification label="No se pudo comprar el contenido" name="BuyContentsOneOwner"> No se pueden comprar a la vez objetos de propietarios diferentes. -Por favor, seleccione sólo un objeto y vuelva a intentarlo. +Por favor, selecciona sólo un objeto y vuelve a intentarlo. </notification> <notification name="BuyOriginal"> ¿Comprar el objeto original de [OWNER] por [PRICE] L$? -Usted pasará a ser el propietario de este objeto. -Podrá: +Pasarás a ser el propietario de este objeto. +Podrás: Modificarlo: [MODIFYPERM] Copiarlo: [COPYPERM] Revenderlo o darlo: [RESELLPERM] @@ -1932,8 +1730,8 @@ Podrá: </notification> <notification name="BuyOriginalNoOwner"> ¿Comprar el objeto original por [PRICE] L$? -Usted pasará a ser el propietario de este objeto. -Podrá: +Pasarás a ser el propietario de este objeto. +Podrás: Modificarlo: [MODIFYPERM] Copiarlo: [COPYPERM] Revenderlo o darlo: [RESELLPERM] @@ -1941,8 +1739,8 @@ Podrá: </notification> <notification name="BuyCopy"> ¿Comprar una copia de [OWNER] por [PRICE] L$? -El objeto se copiará a su inventario. -Podrá: +El objeto se copiará a tu inventario. +Podrás: Modificarlo: [MODIFYPERM] Copiarlo: [COPYPERM] Revenderlo o darlo: [RESELLPERM] @@ -1950,8 +1748,8 @@ Podrá: </notification> <notification name="BuyCopyNoOwner"> ¿Comprar una copia por [PRICE] L$? -El objeto se copiará a su inventario. -Podrá: +El objeto se copiará a tu inventario. +Podrás: Modificarlo: [MODIFYPERM] Copiarlo: [COPYPERM] Revenderlo o darlo: [RESELLPERM] @@ -1959,27 +1757,27 @@ Podrá: </notification> <notification name="BuyContents"> ¿Comprar los contenidos de [OWNER] por [PRICE] L$? -Serán copiados a su inventario. +Serán copiados a tu inventario. <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="BuyContentsNoOwner"> ¿Comprar los contenidos por [PRICE] L$? -Serán copiados a su inventario. +Serán copiados a tu inventario. <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="ConfirmPurchase"> - Esta transacción hará que: + Esta transacción consiste en: [ACTION] -¿Está seguro de querer hacer esta compra? +¿Estás seguro de querer hacer esta compra? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="ConfirmPurchasePassword"> - Esta transacción hará que: + Esta transacción consiste en: [ACTION] -¿Está seguro de querer hacer esta compra? -Por favor, vuelva a escribir su contraseña y pulse OK. +¿Estás seguro de querer hacer esta compra? +Por favor, vuelva a escribir tu contraseña y pulsa OK. <form name="form"> <input name="message"/> <button name="ConfirmPurchase" text="OK"/> @@ -1988,91 +1786,75 @@ Por favor, vuelva a escribir su contraseña y pulse OK. </notification> <notification name="SetPickLocation"> Nota: -Ha actualizado la posición de este Destacado, pero los otros detalles permanecen con sus valores originales. +Has actualizado la posición de este Destacado, pero los otros detalles permanecen con sus valores originales. <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="MoveInventoryFromObject"> - Ha elegido Ãtems 'no copiables' de su inventario. Esos Ãtems se quitarán de su inventario, no se copiarán. + Has elegido Ãtems 'no copiables' de tu inventario. Esos Ãtems se quitarán de tu inventario, no se copiarán. ¿Mover el/los Ãtem/s del inventario? - <usetemplate ignoretext="Cuando mueva objetos 'no copiables' del inventario" name="okcancelignore" notext="Cancelar" yestext="OK"/> + <usetemplate ignoretext="Avisarme antes de que mueva Ãtems 'no copiables' desde un objeto" name="okcancelignore" notext="Cancelar" yestext="OK"/> </notification> <notification name="MoveInventoryFromScriptedObject"> - Ha elegido Ãtems 'no copiables' de su inventario. Esos Ãtems se moverán a su inventario, no se copiarán. -Dado que estos objetos tienen scripts, moverlos a su inventario puede provocar un mal funcionamiento del script. + Has elegido Ãtems 'no copiables' de tu inventario. Esos Ãtems se moverán a tu inventario, no se copiarán. +Dado que estos objetos tienen scripts, moverlos a tu inventario puede provocar un mal funcionamiento del script. ¿Mover el/los Ãtem/s del inventario? - <usetemplate ignoretext="Cuando mueva objetos con script 'no copiables' del inventario" name="okcancelignore" notext="Cancelar" yestext="OK"/> + <usetemplate ignoretext="Avisarme antes de que mueva Ãtems 'no copiables' que puedan estropear un objeto con script" name="okcancelignore" notext="Cancelar" yestext="OK"/> </notification> <notification name="ClickActionNotPayable"> - Atención: la acción 'Pagar al objeto' al pulsar ha sido marcada, pero sólo funcionará si se añade un script con un evento money(). + Advertencia: la acción 'Pagar al objeto' ha sido marcada, pero sólo funcionará si se añade un script con un evento money(). <form name="form"> - <ignore name="ignore" text="Cuando configure 'Pagar al objeto' sin el evento money()"/> + <ignore name="ignore" text="He establecido la acción 'Pagar al objeto' cuando construyo uno sin un script money()"/> </form> </notification> <notification name="OpenObjectCannotCopy"> - En este objeto, no hay Ãtems que esté autorizado a copiar. + En este objeto, no hay Ãtems que estés autorizado a copiar. </notification> <notification name="WebLaunchAccountHistory"> - ¿Ir al sitio web de [SECOND_LIFE] para ver el historial de su cuenta? - <usetemplate ignoretext="Cuando se cargue la página web del historial de la cuenta" name="okcancelignore" notext="Cancelar" yestext="Ir a la página"/> - </notification> - <notification name="ClickOpenF1Help"> - ¿Visitar el sitio web de Soporte de [SECOND_LIFE]? - <usetemplate ignoretext="Cuando visite el sitio web de Soporte de [SECOND_LIFE]." name="okcancelignore" notext="Cancelar" yestext="Ir"/> + ¿Ir a tu [http://secondlife.com/account/ Panel de Control] para ver el historial de tu cuenta? + <usetemplate ignoretext="Abrir mi navegador para ver el historial de mi cuenta" name="okcancelignore" notext="Cancelar" yestext="Ir a la página"/> </notification> <notification name="ConfirmQuit"> - ¿Está seguro de que quiere salir? - <usetemplate ignoretext="Cuando esté saliendo de [APP_NAME]." name="okcancelignore" notext="Continuar" yestext="Salir"/> + ¿Estás seguro de que quieres salir? + <usetemplate ignoretext="Confirmar antes de salir" name="okcancelignore" notext="No salir" yestext="Salir"/> </notification> <notification name="HelpReportAbuseEmailLL"> - Use esta herramienta para denunciar violaciones de las [http://secondlife.com/corporate/tos.php?lang=es-ES Condiciones del Servicio] y las [http://secondlife.com/corporate/cs.php?lang=es-ES Normas de la Comunidad]. + Usa esta herramienta para denunciar violaciones de las [http://secondlife.com/corporate/tos.php Condiciones del Servicio] o las [http://secondlife.com/corporate/cs.php Normas de la Comunidad]. -Se investigan y resuelven todas las infracciones denunciadas de las Normas de la Comunidad y las Condiciones del Servicio. Puede ver la resolución tomada en el Informe de Incidentes, en: - -http://secondlife.com/support/incidentreport.php - </notification> - <notification name="HelpReportAbuseEmailEO"> - IMPORTANTE: Esta denuncia no irá a Linden Lab, sino al propietario de la región en la que usted se encuentra actualmente. - -Como un servicio a los residentes y visitantes, el propietario de la región ha elegido recibir y resolver todas las enuncias que se originen en esta región. Linden Lab no investigará las denuncias que usted envÃe desde aquÃ. - -El propietario de la región resolverá las denuncias basándose en las reglas locales de la región, tal como se detallan en el Contrato del estado. -(Puede ver el Contrato yendo al menú Mundo y eligiendo Acerca del terreno). - -La resolución de esta denuncia se aplica exclusivamente a esta región; el acceso de los residentes a otras áreas de [SECOND_LIFE] no se verá afectado por el resultado de esta denuncia. Únicamente Linden Lab puede impedir el acceso a la totalidad de [SECOND_LIFE]. +Se investigan y resuelven todas las infracciones denunciadas. </notification> <notification name="HelpReportAbuseSelectCategory"> - Por favor, elija una categorÃa para esta denuncia de infracción. + Por favor, elige una categorÃa para esta denuncia de infracción. Seleccionar una categorÃa nos ayuda a clasificar y procesar las denuncias de infracciones. </notification> <notification name="HelpReportAbuseAbuserNameEmpty"> - Por favor, escriba el nombre del infractor. + Por favor, escribe el nombre del infractor. Aportar el dato preciso nos ayuda a clasificar y procesar las denuncias de infracciones. </notification> <notification name="HelpReportAbuseAbuserLocationEmpty"> - Por favor, escriba la localización donde tuvo lugar la infracción. + Por favor, escribe la localización donde tuvo lugar la infracción. Aportar el dato preciso nos ayuda a clasificar y procesar las denuncias de infracciones. </notification> <notification name="HelpReportAbuseSummaryEmpty"> - Por favor, escriba un resumen de la infracción que ha habido. + Por favor, escribe un resumen de la infracción que ha habido. Aportar un resumen preciso nos ayuda a clasificar y procesar las denuncias de infracciones. </notification> <notification name="HelpReportAbuseDetailsEmpty"> - Por favor, escriba una descripción minuciosa de la infracción que ha habido. -Sea tan especÃfico como pueda, incluyendo los nombres y los detalles implicados en el incidente que denuncia. + Por favor, escribe una descripción minuciosa de la infracción que ha habido. +Sé tan especÃfico como puedas, incluyendo los nombres y los detalles implicados en el incidente que denuncias. Aportar una descripción precisa nos ayuda a clasificar y procesar las denuncias de infracciones. </notification> <notification name="HelpReportAbuseContainsCopyright"> Estimado Residente: -Parece que está usted denunciando una violación de la propiedad intelectual. Por favor, asegúrese de que su denuncia es correcto. +Parece que estás denunciando una violación de la propiedad intelectual. Por favor, asegúrate de que tu denuncia es correcta. -(1) El proceso de la denuncia. Debe enviar una denuncia de infracción si cree que un Residente está reventando el sistema de permisos de [SECOND_LIFE], por ejemplo, usando un CopyBot u otras herramientas parecidas para copiar, infringiendo los derechos de propiedad intelectual. El Equipo de Infracciones (Abuse Team) investiga y lleva a cabo las acciones disciplinarias apropiadas ante toda acción que viole las las Normas de la Comunidad de [SECOND_LIFE] o las Condiciones del Servicio. Sin embargo, el Equipo de Infracciones ni gestiona ni responde a las solicitudes de eliminar contenidos del mundo de [SECOND_LIFE]. +(1) El proceso de la denuncia. Debes enviar una denuncia de infracción si crees que un Residente está reventando el sistema de permisos de [SECOND_LIFE], usando, por ejemplo, un CopyBot u otras herramientas parecidas para copiar, infringiendo los derechos de propiedad intelectual. El Equipo de Infracciones ('Abuse Team') investiga y lleva a cabo las acciones disciplinarias apropiadas ante toda acción que viole las [http://secondlife.com/corporate/tos.php Condiciones de Servicio] o las [http://secondlife.com/corporate/cs.php Normas de la Comunidad] de [SECOND_LIFE]. Sin embargo, el Equipo de Infracciones ni gestiona ni responde a las solicitudes de eliminar contenidos del mundo de [SECOND_LIFE]. -(2) El DMCA o Proceso de Eliminación de Contenido. Para solicitar que se elimine algún contenido de [SECOND_LIFE], DEBE enviar una notificación válida de infracción tal y como se explica en nuestra DMCA Policy en http://secondlife.com/corporate/dmca.php. +(2) El DMCA o Proceso de Eliminación de Contenido. Para solicitar que se elimine algún contenido de [SECOND_LIFE], DEBES enviar una notificación válida de infracción tal y como se explica en nuestra [http://secondlife.com/corporate/dmca.php 'DMCA Policy']. -Si todavÃa quiere seguir con el proceso de infracción, por favor, cierre esta ventana y acabe de enviar su denuncia. En concreto, debe seleccionar la categorÃa 'CopyBot o Programa para saltarse los permisos'. +Si todavÃa quieres seguir con el proceso de infracción, por favor, cierra esta ventana y acaba de enviar tu denuncia. En concreto, debes seleccionar la categorÃa 'CopyBot o Programa para saltarse los permisos'. Gracias, @@ -2083,234 +1865,74 @@ Linden Lab [COMPONENTS] </notification> <notification label="Reemplazar el anexado actual" name="ReplaceAttachment"> - En ese punto de su cuerpo ya hay un objeto anexado. ¿Quiere reemplazarlo por el objeto que ha elegido? + En ese punto de tu cuerpo ya hay un objeto anexado. ¿Quieres reemplazarlo por el objeto que has elegido? <form name="form"> - <ignore name="ignore" save_option="true" text="Cuando se reemplacen anexados existentes"/> + <ignore name="ignore" save_option="true" text="Reemplazar un añadido actual con el Ãtem seleccionado"/> <button ignore="Reemplazar automaticamente" name="Yes" text="OK"/> <button ignore="Nunca reemplazar" name="No" text="Cancelar"/> </form> </notification> <notification label="¡Aviso! Modo Ocupado" name="BusyModePay"> - Usted está en el modo Ocupado. Por tanto, no recibirá ningún Ãtem a cambio de esta pago. + Estás en el modo Ocupado. Por tanto, no recibirás ningún Ãtem a cambio de este pago. -¿Quiere salir del modo Ocupado ante de completar esta transacción? +¿Quieres salir del modo Ocupado antes de completar esta transacción? <form name="form"> - <ignore name="ignore" save_option="true" text="Cuando se esté pagando a un objeto o persona en el modo Ocupado"/> + <ignore name="ignore" save_option="true" text="Voy a pagar a una persona u objeto mientras estoy en el modo ocupado"/> <button ignore="Siempre salir del modo Ocupado" name="Yes" text="OK"/> <button ignore="Nunca salir del modo Ocupado" name="No" text="Cancelar"/> </form> </notification> + <notification name="ConfirmDeleteProtectedCategory"> + La carpeta '[FOLDERNAME]' pertenece al sistema, y borrar carpetas del sistema puede provocar inestabilidad. ¿Estás seguro de que quieres borrarla? + <usetemplate ignoretext="Confirmar antes de borrar una carpeta del sistema" name="okcancelignore" notext="Cancelar" yestext="OK"/> + </notification> <notification name="ConfirmEmptyTrash"> - ¿Está seguro de que quiere vaciar definitivamente el contenido de su Papelera? - <usetemplate ignoretext="Cuando se vacÃe la Papelera" name="okcancelignore" notext="Cancelar" yestext="OK"/> + ¿Estás seguro de que quieres borrar de forma permanente el contenido de la Papelera? + <usetemplate ignoretext="Confirmar antes de vaciar la Papelera del inventario" name="okcancelignore" notext="Cancelar" yestext="OK"/> </notification> <notification name="ConfirmClearBrowserCache"> - ¿Está seguro de que quiere limpiar la caché de su navegador? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="SÃ"/> + ¿Estás seguro de que quieres borrar tu historial web, de viajes y de búsquedas? + <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="ConfirmClearCookies"> - ¿Está seguro de que quiere limpiar sus cookies? + ¿Estás seguro de que quieres limpiar tus cookies? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="SÃ"/> </notification> <notification name="ConfirmClearMediaUrlList"> - ¿Está seguro de que quiere vaciar su lista de URL guardadas? + ¿Estás seguro de que quieres vaciar tu lista de URL guardadas? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="SÃ"/> </notification> <notification name="ConfirmEmptyLostAndFound"> - ¿Está seguro de que quiere eliminar permanentemente el contenido de su carpeta Objetos Perdidos? - <usetemplate ignoretext="Cuando se vacÃe la carpeta del inventario Objetos Perdidos" name="okcancelignore" notext="No" yestext="SÃ"/> + ¿Estás seguro de que quieres borrar de forma permanente el contenido de Objetos Perdidos? + <usetemplate ignoretext="Confirmar antes de vaciar la carpeta Objetos Perdidos" name="okcancelignore" notext="No" yestext="SÃ"/> </notification> <notification name="CopySLURL"> - Se ha copiado a su portapapeles la siguiente SLurl: + Se ha copiado a tu portapapeles esta SLurl: [SLURL] -PublÃquela en una página web para que otros puedan acceder fácilmente a esta posición, o pruébela usted mismo pegándola en la barra de direcciones de su navegador. +PublÃcala en una página web para que otros puedan acceder fácilmente a esta posición, o pruébala tú mismo pegándola en la barra de direcciones de tu navegador. <form name="form"> - <ignore name="ignore" text="Cuando se copie una SLurl al portapapeles"/> + <ignore name="ignore" text="La SLurl se ha copiado a mi portapapeles"/> </form> </notification> - <notification name="GraphicsPreferencesHelp"> - Este panel controla el tamaño de la ventana, y la resolución y la calidad de los gráficos del cliente. La interfaz Preferencias > Gráficos le permite escoger entre cuatro niveles gráficos: Bajo, Medio, Alto, y Ultra. También puede personalizar sus configuraciones gráficas marcando la casilla Personalizar y adaptando estas configuraciones: - -Efectos: activa o desactiva varios tipos de shaders. - -Objetos reflejados: determina qué objetos reflejará el agua. - -Renderización del avatar: muestra opciones que afectan a cómo renderiza el cliente los avatares. - -Distancia de dibujo: afecta a cuán lejos de su punto de vista se renderizarán los objetos en la escena. - -Núm. máx. de partÃculas: define el número máximo de partÃculas que podrá ver a la vez en su pantalla. - -Calidad del procesamiento: define la resolución con que se renderiza el brillo. - -Detalle de la malla: define la cantidad de detalles o número de triángulos usados para renderizar algunos objetos. Cuanto más alto sea el valor, más detalle, pero más tiempo para renderizar. - -Detalles de la iluminación: determina que tipo de luces quiere usted que se rendericen. - -Nivel de detalle del terreno: marca con cuánto detalle quiere ver la textura del terreno. - </notification> <notification name="WLSavePresetAlert"> - ¿Quiere sobrescribir la preselección guardada? + ¿Quieres sobrescribir la preselección guardada? <usetemplate name="okcancelbuttons" notext="No" yestext="SÃ"/> </notification> <notification name="WLDeletePresetAlert"> - ¿Quiere borrar [SKY]? + ¿Quieres borrar [SKY]? <usetemplate name="okcancelbuttons" notext="No" yestext="SÃ"/> </notification> <notification name="WLNoEditDefault"> - No puede editar ni borrar una preselección por defecto. + No puedes editar ni borrar una preselección por defecto. </notification> <notification name="WLMissingSky"> Este archivo del ciclo de un dÃa se refiere a un archivo perdido de cielo: [SKY]. </notification> <notification name="PPSaveEffectAlert"> - Ya existe un efecto de procesamiento. ¿Desea sobreescribirlo? + Ya existe un efecto de procesamiento. ¿Quieres sobreescribirlo? <usetemplate name="okcancelbuttons" notext="No" yestext="SÃ"/> </notification> - <notification name="HelpEditSky"> - Edite los deslizables del WindLight para crear y guardar configuraciones del cielo. - </notification> - <notification name="HelpEditDayCycle"> - Define cómo se verán los cielos a lo largo del dÃa. - </notification> - <notification name="EnvSettingsHelpButton"> - Estas configuraciones ajustan la forma en que usted ve el medio ambiente localmente, en su ordenador. Su tarjeta gráfica debe admitir shaders de la atmósfera ('atmospheric shaders') para poder acceder a esta configuración. - -Ajuste el deslizable 'Duración de un dÃa' para cambiar localmente, en su visor, las etapas del dÃa. - -Ajuste el deslizable 'Nubosidad' para controlar cuántas nubes cubren el cielo. - -Pulse un color en el selector de 'Color del agua' para cambiar el color de la misma. - -Ajuste el deslizable 'Claridad del agua' para controlar el nivel de claridad del agua bajo la superficie. - -Pulse 'Usar el horario del estado' para devolver los valores del dÃa al tiempo actual de la región y seguir a partir de él. - -Pulse 'Cielo avanzado' para abrir un editor con configuraciones avanzadas para el cielo. - -Pulse 'Agua avanzada' para abrir un editor con configuraciones avanzadas para el agua. - </notification> - <notification name="HelpDayCycle"> - El Editor del ciclo del dÃa le permite controlar el cielo de [SECOND_LIFE] durante el ciclo dÃa/noche. Este es el ciclo que usa el deslizable Duración de un dÃa del Editor del entorno. - -El Editor del ciclo del dÃa trabaja configurando fotogramas clave ('keyframes'): nodos (representados por los puntos grises en la lÃnea del tiempo) cada uno de los cuales tiene asociado un Cielo definido. Según progresa la Duración de un dÃa, el WindLight realiza la 'animación' del cielo interpolándose entre esos fotogramas clave. - -La flecha amarilla sobre la lÃnea del tiempo representa lo que usted ve actualmente, basándose en la Duración de un dÃa. Púlsela y muévela para ver cómo cambia la animación del dÃa. Puede añadir o borrar fotogramas clave pulsando los botones Añadir un punto o Quitar un punto, situados a la derecha de la lÃnea del tiempo. - -Puede establecer la posición en el tiempo de cualquier fotograma clave moviéndolo a lo largo de la lÃnea del tiempo, o configurando manualmente su valor en el recuadro Configuración del fotograma clave. También en ese recuadro podrá asociar el fotograma clave a un modelo predefinido de WindLight. - -La Duración del ciclo establece la duración total de un 'dÃa'. Marcar un valor bajo (por ejemplo, 2 min.) hará que las 24 horas de su lÃnea del tiempo se animen ¡en sólo dos minutos reales! Una vez que esté satisfecho con su ciclo de la lÃnea del tiempo y los fotogramas clave, utilice los botones Probar y Parar para obtener una vista previa de los resultados. Recuerde que también puede mover la flecha amarilla de encima de la lÃnea del tiempo para ver el ciclo de la animación. El botón Usar el horario del estado sincronizará su ciclo de duración de un dÃa con el ciclo del estado. - -Cuando todo esté a su gusto, puede guardar esos datos y cargarlos luego usando los botones Guardar este tipo de dÃa y Cargar un tipo de dÃa. Note que, por el momento, sólo podemos permitir un ciclo de un dÃa. - </notification> - <notification name="HelpBlueHorizon"> - Use los deslizables Rojo/Verde/Azul (RVA) para ajustar el color del cielo. Puede usar el deslizable de Intensidad (I) para moverlos al unÃsono. - </notification> - <notification name="HelpHazeHorizon"> - La Cantidad de bruma es uno de los parámetros más útiles para ajustar el nivel de luz de la escena. Es eficaz para simular muchos ajustes de la exposición, como la claridad en un ambiente nublado o de nevisca, o las tonalidades del una flor Iris aún cerrada. - </notification> - <notification name="HelpBlueDensity"> - La Saturación afecta a la densidad global de la saturación de color del cielo y la niebla. Si mueve el deslizable Intensidad (I) a la derecha, los colores serán más vivos y brillantes. Si lo mueve a la izquierda, se irán decolorando hasta llegar incluso al blanco y negro. Si desea ajustar el balance de color del cielo, puede controlar la saturación de cada elemento usando el deslizable Rojo/Verde/Azul (RVA). - </notification> - <notification name="HelpHazeDensity"> - La Densidad de la bruma controla lo sombrÃo de la atmósfera, su neblina. Es eficaz para simular escenas con mucho humo o contaminantes, y también para simular niebla y llovizna. - </notification> - <notification name="HelpDensityMult"> - La Densidad puede usarse para definir globalmente la 'pesadez' de la atmósfera. Los ajustes bajos dan sensación de un 'aire limpio', y los altos de pesadez, de esmog. - </notification> - <notification name="HelpDistanceMult"> - Ajusta a qué distancia se percibe el WindLight. El valor cero desactiva la influencia del WindLight en el terreno y los objetos. Los valores superiores a 1 simulan mayores distancias a las que afectan los efectos atmosféricos - </notification> - <notification name="HelpMaxAltitude"> - La Altitud máx. ajusta hasta que altura el WindLight realiza sus cálculos para computar la iluminación atmosférica. En las últimas horas del dÃa, es útil para ajustar la 'profundidad' a la que aparece el Sol. - </notification> - <notification name="HelpSunlightColor"> - Ajusta en la escena la intensidad y el color de las luces directas. - </notification> - <notification name="HelpSunAmbient"> - Ajusta en la escena la intensidad y el color de la luz ambiental. - </notification> - <notification name="HelpSunGlow"> - El deslizable Tamaño controla el tamaño del Sol. -El deslizable Visión controla cómo se ve de borroso el Sol en el cielo. - </notification> - <notification name="HelpSceneGamma"> - Ajusta la distribución de luz y oscuridad en la pantalla. - </notification> - <notification name="HelpStarBrightness"> - Ajusta el brillo de las estrellas en el cielo. - </notification> - <notification name="HelpTimeOfDay"> - Controla la posición del Sol en el cielo. Es parecido a la elevación. - </notification> - <notification name="HelpEastAngle"> - Controla la posición del Sol en el cielo. Es parecido al acimut. - </notification> - <notification name="HelpCloudColor"> - Edita el color de las nubes. En general, es recomendable mantenerlas blanquecinas. -Pero, vaya, diviértase si quiere. - </notification> - <notification name="HelpCloudDetail"> - Controla el detalle de las capas superiores de la imagen en la imagen principal de las nubes. X e Y controlan su posición. D (Densidad) controla la densidad o la fracturación con que aparecen las nubes. - </notification> - <notification name="HelpCloudDensity"> - Le permite controlar la posición de las nubes con los deslizables X e Y, y su desnidad con el deslizable D. - </notification> - <notification name="HelpCloudCoverage"> - Controla cuánto cubren el cielo las nubes. - </notification> - <notification name="HelpCloudScale"> - Controla el tamaño de la imagen de las nubes en la bóveda celeste. - </notification> - <notification name="HelpCloudScrollX"> - Controla la velocidad de las nubes al moverse en la dirección del eje X. - </notification> - <notification name="HelpCloudScrollY"> - Controla la velocidad de las nubes al moverse en la dirección del eje Y. - </notification> - <notification name="HelpClassicClouds"> - Marque esta casilla para activar la aparición de las nubes clásicas de [SECOND_LIFE] junto a las nubes del WindLight. - </notification> - <notification name="HelpWaterFogColor"> - Elije el color del agua bajo la superficie. - </notification> - <notification name="HelpWaterFogDensity"> - Controla la densidad de la claridad del agua, y a qué distancia puede verse bajo ella. - </notification> - <notification name="HelpUnderWaterFogMod"> - Modifica el efecto de Transparencia para controlar cuán lejos su avatar puede ver bajo el agua. - </notification> - <notification name="HelpWaterGlow"> - Controla la cantidad de brillo de la superficie del agua. - </notification> - <notification name="HelpWaterNormalScale"> - Controla el tamaño de las tres ondulaciones que componen el agua. - </notification> - <notification name="HelpWaterFresnelScale"> - Controla cuánta luz se refleja desde diferentes ángulos. - </notification> - <notification name="HelpWaterFresnelOffset"> - Controla cuánta intensidad de luz se refleja. - </notification> - <notification name="HelpWaterScaleAbove"> - Controla la cantidad de luz refractada mirando la superficie del agua desde arriba. - </notification> - <notification name="HelpWaterScaleBelow"> - Controla la cantidad de luz refractada mirando la superficie del agua desde debajo. - </notification> - <notification name="HelpWaterBlurMultiplier"> - Controla cómo se mezclan las ondas y los reflejos. - </notification> - <notification name="HelpWaterNormalMap"> - Controla cuál es la capa de 'vista normal' del agua, para determinar las reflexiones/refracciones. - </notification> - <notification name="HelpWaterWave1"> - Controla hacia adónde y a qué velocidad se mueve en los ejes X e Y la versión en tamaño grande de la 'vista normal'. - </notification> - <notification name="HelpWaterWave2"> - Controla hacia adónde y a qué velocidad se mueve en los ejes X e Y la versión en tamaño pequeño de la 'vista normal'. - </notification> <notification name="NewSkyPreset"> Dame un nombre para el cielo nuevo. <form name="form"> @@ -2338,7 +1960,7 @@ Pero, vaya, diviértase si quiere. ¡Esa preselección ya existe! </notification> <notification name="WaterNoEditDefault"> - No puede editar o borrar una preselección por defecto. + No puedes editar o borrar una preselección por defecto. </notification> <notification name="ChatterBoxSessionStartError"> No se puede empezar una nueva sesión de chat con [RECIPIENT]. @@ -2351,40 +1973,38 @@ Pero, vaya, diviértase si quiere. <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="ForceCloseChatterBoxSession"> - Debe cerrarse su sesión de chat con [NAME]. + Debe cerrarse tu sesión de chat con [NAME]. [REASON] <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="Cannot_Purchase_an_Attachment"> - No se pueden comprar los Ãtems que aún forman parte de un objeto anexado. + No puedes comprar un objeto mientras esté anexado. </notification> <notification label="Acerca de las solicitudes de autorización de débito" name="DebitPermissionDetails"> - Al admitir esta petición, le da permiso a un script para que coja dólares Linden (L$) de su cuenta. Para revocar este permiso, el propietario del objeto debe eliminarlo o reiniciar ese script del objeto. + Al admitir esta petición, le das permiso a un script para que coja dólares Linden (L$) de tu cuenta. Para revocar este permiso, el propietario del objeto debe eliminarlo o reiniciar ese script del objeto. <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="AutoWearNewClothing"> - ¿Quiere vestirse automáticamente el Ãtem de ropa nueva que ha creado? - <usetemplate ignoretext="Al vestirme automáticamente la ropa nueva" name="okcancelignore" notext="No" yestext="SÃ"/> + ¿Quieres ponerte automáticamente la ropa que vas a crear? + <usetemplate ignoretext="Ponerme la ropa que estoy creando mientras modifico mi apariencia" name="okcancelignore" notext="No" yestext="SÃ"/> </notification> <notification name="NotAgeVerified"> - Para acceder a esta parcela, se debe haber verificado su edad. -¿Quiere visitar la web de [SECOND_LIFE] para verificar su edad? + Debes haber verificado tu edad para visitar este sitio. ¿Quieres ir al sitio web de [SECOND_LIFE] y verificarla? [_URL] <url name="url" option="0"> https://secondlife.com/account/verification.php?lang=es </url> - <usetemplate ignoretext="Advertir de la falta de la verificación de edad" name="okcancelignore" notext="No" yestext="SÃ"/> + <usetemplate ignoretext="No he verificado mi edad" name="okcancelignore" notext="No" yestext="SÃ"/> </notification> <notification name="Cannot enter parcel: no payment info on file"> - Antes de que pueda acceder a esta parcela, se requiere que usted tenga archivada su información de pago. -¿Quiere visitar la web de [SECOND_LIFE] para actualizar esto? + Para visitar este sitio debes haber aportado información de pago en tu cuenta. ¿Quieres ir al sitio web de [SECOND_LIFE] y configurar esto? [_URL] <url name="url" option="0"> https://secondlife.com/account/index.php?lang=es </url> - <usetemplate ignoretext="Advertir de la falta de información de pago" name="okcancelignore" notext="No" yestext="SÃ"/> + <usetemplate ignoretext="No he registrado información de pago" name="okcancelignore" notext="No" yestext="SÃ"/> </notification> <notification name="MissingString"> La cadena [STRING_NAME] Ha desaparecido de strings.xml @@ -2392,14 +2012,17 @@ Pero, vaya, diviértase si quiere. <notification name="SystemMessageTip"> [MESSAGE] </notification> + <notification name="IMSystemMessageTip"> + [MESSAGE] + </notification> <notification name="Cancelled"> Cancelado </notification> <notification name="CancelledSit"> - Cancelado el sentarse + Cancelado el sentarte </notification> <notification name="CancelledAttach"> - Candelado el anexar + Cancelado el anexar </notification> <notification name="ReplacedMissingWearable"> Reemplazadas las ropas o partes del cuerpo perdidas con sus equivalentes por defecto. @@ -2414,14 +2037,19 @@ Pero, vaya, diviértase si quiere. [FIRST] [LAST] no está conectado </notification> <notification name="AddSelfFriend"> - No se puede añadir como amigo a usted mismo. + Aunque eres muy agradable, no puedes añadirte como amigo a ti mismo. </notification> <notification name="UploadingAuctionSnapshot"> Subiendo fotos del mundo y del sitio web... (tardará unos 5 minutos). </notification> + <notification name="UploadConfirmation"> + La subida cuesta [AMOUNT] L$. +¿Quieres continuar? + <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Subir"/> + </notification> <notification name="UploadPayment"> - Ha pagado [AMOUNT] LS por la subida. + Has pagado [AMOUNT] LS por la subida. </notification> <notification name="UploadWebSnapshotDone"> Completada la subida de la foto del sitio web. @@ -2433,30 +2061,29 @@ Pero, vaya, diviértase si quiere. Se ha descargado Terrain.raw </notification> <notification name="GestureMissing"> - El gesto [NAME] ha desaparecido de la base de datos. + No se encuentra en la base de datos el gesto [NAME]. </notification> <notification name="UnableToLoadGesture"> - No se ha podido cargar el gesto [NAME]. -Por favor, vuelva a intentarlo. + No se puede cargar el gesto [NAME]. </notification> <notification name="LandmarkMissing"> El hito ha desaparecido de la base de datos. </notification> <notification name="UnableToLoadLandmark"> - No se ha podido cargar el hito. Por favor, vuelva a intentarlo. + No se ha podido cargar el hito. Por favor, vuelve a intentarlo. </notification> <notification name="CapsKeyOn"> - Tiene pulsada su tecla de bloqueo de mayúsculas, lo que influirá en cómo escriba la contraseña. -Quizá quiera soltar esa tecla. + Tienes pulsada la tecla de mayúsculas. +Esto puede influir en tu contraseña. </notification> <notification name="NotecardMissing"> La nota ha desaparecido de la base de datos. </notification> <notification name="NotecardNoPermissions"> - No tiene permisos suficientes para ver la nota. + No tienes permiso para ver esta nota. </notification> <notification name="RezItemNoPermissions"> - No tiene permisos suficientes para renderizar el objeto. + No tienes permisos suficientes para renderizar el objeto. </notification> <notification name="UnableToLoadNotecard"> En este momento no se puede cargar la nota. @@ -2465,37 +2092,37 @@ Quizá quiera soltar esa tecla. El script ha desaparecido de la base de datos. </notification> <notification name="ScriptNoPermissions"> - No tiene permisos suficientes para ver el script. + No tienes permisos suficientes para ver el script. </notification> <notification name="UnableToLoadScript"> - No se ha podido cargar el script. Por favor, vuelva a intentarlo. + No se ha podido cargar el script. Por favor, vuelve a intentarlo. </notification> <notification name="IncompleteInventory"> - Los contenidos que está usted ofreciendo aún no están disponibles. Por favor, vuelva a ofrecerlos en un minuto. + Los contenidos que estás ofreciendo aún no están disponibles. Por favor, vuelve a ofrecerlos en un minuto. </notification> <notification name="CannotModifyProtectedCategories"> - No puede modificar categorÃas que están protegidas. + No puedes modificar categorÃas que están protegidas. </notification> <notification name="CannotRemoveProtectedCategories"> - No puede quitar categorÃas que están protegidas. + No puedes quitar categorÃas que están protegidas. </notification> <notification name="OfferedCard"> - Ha ofrecido una tarjeta de visita a [FIRST] [LAST] + Has ofrecido una tarjeta de visita a [FIRST] [LAST] </notification> <notification name="UnableToBuyWhileDownloading"> - No se puede comprar un objeto mientras se descargan sus datos. -Por favor, vuelva a intentarlo. + No se puede comprar un objeto mientras se descargan los datos. +Por favor, vuelve a intentarlo. </notification> <notification name="UnableToLinkWhileDownloading"> - No se puede enlazar un objeto mientras se descargan sus datos. -Por favor, vuelva a intentarlo. + No se puede enlazar un objeto mientras se descargan los datos. +Por favor, vuelve a intentarlo. </notification> <notification name="CannotBuyObjectsFromDifferentOwners"> - No puede comprar a la vez objetos de diferentes propietarios. -Por favor, elija sólo uno. + No puedes comprar más de un objeto a la vez. +Por favor, selecciona un sólo objeto. </notification> <notification name="ObjectNotForSale"> - El objeto no aparece como puesto a la venta. + Este objeto no está en venta. </notification> <notification name="EnteringGodMode"> Entrando en el modo administrativo, nivel [LEVEL] @@ -2504,40 +2131,42 @@ Por favor, elija sólo uno. Saliendo del modo administrativo, nivel [LEVEL] </notification> <notification name="CopyFailed"> - No se ha hecho la copia porque usted no tiene permiso para hacerla + No tienes pemiso para copiar esto. </notification> <notification name="InventoryAccepted"> - [NAME] ha aceptado su oferta del inventario. + [NAME] ha recibido tu oferta de inventario. </notification> <notification name="InventoryDeclined"> - [NAME] ha rehusado su oferta del inventario. + [NAME] ha rehusado tu oferta del inventario. </notification> <notification name="ObjectMessage"> [NAME]: [MESSAGE] </notification> <notification name="CallingCardAccepted"> - Se ha aceptado su tarjeta de visita. + Se ha aceptado tu tarjeta de visita. </notification> <notification name="CallingCardDeclined"> - Se ha rehusado su tarjeta de visita. + Se ha rehusado tu tarjeta de visita. </notification> <notification name="TeleportToLandmark"> - Ahora que ha llegado a mainland (los continentes), puede teleportarse a localizaciones como '[NAME]' pulsando el botón Inventario de la esquina inferior derecha de su pantalla, y, después, seleccionando la carpeta Hitos. -Pulse dos veces en el hito y, luego, pulse en Teleportar para viajar hasta allÃ. + Puedes teleportarte a lugares como '[NAME]' abriendo el panel Lugares -a la derecha de tu pantalla- y seleccionando la sección Hitos. +Pulsa en un hito para seleccionarlo, y, luego, pulsa 'Teleportar' en la parte inferior del panel. +(También puedes pulsar dos veces en el hito o pulsarlo con el botón derecho del ratón y elegir 'Teleportar'.) </notification> <notification name="TeleportToPerson"> - Ahora que ha llegado a mainland (los continentes), puede contactar con residentes como '[NAME]' pulsando el botón Inventario de la esquina inferior derecha de su pantalla, y, después, seleccionando la carpeta Tarjetas de visita. -Pulse dos veces en la tarjeta, pulse en Mensaje Instantáneo, y escriba un mensaje. + Puedes contactar con un Residente como '[NAME]' abriendo el panel Gente en el lado derecho de tu pantalla. +Elige al Residente de la lista y pulsa 'MI' en la parte inferior del panel. +(También puedes pulsar dos veces en su nombre o pulsarlo con el botón derecho y elegir 'MI'). </notification> <notification name="CantSelectLandFromMultipleRegions"> - No puede seleccionar un terreno que cruce las fronteras entre servidores. -Inténtelo seleccionando un trozo más pequeño de terreno. + No puedes seleccionar un terreno que cruce las fronteras entre servidores. +Inténtalo seleccionando un trozo más pequeño de terreno. </notification> <notification name="SearchWordBanned"> - Se han excluido algunos términos de su búsqueda debido a restricciones en el contenido, según se especifica en las Normas de la Comunidad. + Se han excluido algunos términos de tu búsqueda debido a restricciones en el contenido, según se especifica en las Normas de la Comunidad. </notification> <notification name="NoContentToSearch"> - Por favor, elija al menos un tipo de contenido a buscar ('PG', 'Mature', o 'Adult'). + Por favor, elige al menos un tipo de contenido a buscar ('PG', 'Mature', o 'Adult'). </notification> <notification name="GroupVote"> [NAME] ha propuesto votar: @@ -2550,6 +2179,9 @@ Inténtelo seleccionando un trozo más pequeño de terreno. <notification name="SystemMessage"> [MESSAGE] </notification> + <notification name="PaymentRecived"> + [MESSAGE] + </notification> <notification name="EventNotification"> Notificación de un evento: @@ -2574,17 +2206,29 @@ Inténtelo seleccionando un trozo más pequeño de terreno. [NAMES] </notification> <notification name="NoQuickTime"> - No se ve como instalado en su sistema el software QuickTime de Apple. -Si quiere ver por streaming elementos multimedia en las parcelas que los tengan, debe ir al sitio web de QuickTime (http://www.apple.com/quicktime) e instalar el QuickTime Player. + No parece que tu sistema tenga instalado el software QuickTime de Apple. +Si quieres ver media en streaming en las parcelas que los tienen, deberÃas ir al [http://www.apple.com/quicktime sitio de QuickTime] e intalar el QuickTime Player. + </notification> + <notification name="NoPlugin"> + No se ha encontrado el 'Media Plugin' para manejar el 'mime type' "[MIME_TYPE]". Los media de este tipo no estarán disponibles. + </notification> + <notification name="MediaPluginFailed"> + Fallo de este 'Media Plugin': + [PLUGIN] + +Por favor, reinstala el plugin o contacta con el vendedor si sigues teniendo problemas. + <form name="form"> + <ignore name="ignore" text="Fallo al ejecutar un 'Media Plugin'"/> + </form> </notification> <notification name="OwnedObjectsReturned"> - Se han devuelto a su inventario los objetos de los que usted era propietario en la parcela seleccionada. + Se han devuelto a tu inventario los objetos de los que eras propietario en la parcela seleccionada. </notification> <notification name="OtherObjectsReturned"> - Se han devuelto a su inventario los objetos de los que usted era propietario en la parcela propiedad de [FIRST] [LAST]. + Se han devuelto a tu inventario los objetos de los que eras propietario en la parcela propiedad de [FIRST] [LAST]. </notification> <notification name="OtherObjectsReturned2"> - Se han devuelto a su propietario los objetos que, en la parcela seleccionada, eran propiedad del residente '[NAME]'. + Se han devuelto a su propietario los objetos seleccionados en la parcela de terreno propiedad de '[NAME]'. </notification> <notification name="GroupObjectsReturned"> Se han devuelto a los inventarios de sus propietarios los objetos que estaban compartidos con el grupo [GROUPNAME] en la parcela seleccionada. @@ -2592,26 +2236,28 @@ Los objetos transferibles que se transfirieron al grupo se han devuelto a sus pr Los objetos no transferibles que se transfirieron al grupo han sido borrados. </notification> <notification name="UnOwnedObjectsReturned"> - Se han devuelto a sus propietarios los objetos de los que usted NO era propietario en la parcela seleccionada. + Se han devuelto a sus propietarios los objetos de los que NO eras propietario en la parcela seleccionada. + </notification> + <notification name="ServerObjectMessage"> + Mensaje de [NAME]: +<nolink>[MSG]</nolink> </notification> <notification name="NotSafe"> - Este es un terreno con el daño autorizado ('no seguro'). -Aquà puede ser herido. Si muere, será teleportado a su Base. + Este terreno tiene el daño activado. +Aquà puedes ser herido. Si mueres, se te teleportará a tu Base. </notification> <notification name="NoFly"> - En este terreno no se permite volar ('no volar'). -Aquà no debe volar. + Este terreno tiene desactivado el poder volar. +Aquà no puedes volar. </notification> <notification name="PushRestricted"> - Este terreno es 'Sin empujones'. -No puede empujar a otros a menos que sea el propietario del terreno. + Este terreno no autoriza el poder empujar. No puedes hacerlo a menos que seas el propetario del terreno. </notification> <notification name="NoVoice"> - Este terreno tiene desactivada la voz. + Este tereno tiene desactivado el chat de voz. No podrás oÃr hablar a nadie. </notification> <notification name="NoBuild"> - Este terreno tiene desactivado el construir ('no construir'). -Aquà no puede crear objetos. + Este terreno tiene desactivado el poder construir. Aquà no puedes ni construir ni crear objetos. </notification> <notification name="ScriptsStopped"> Un administrador ha detenido temporalmente los scripts en esta región. @@ -2620,48 +2266,41 @@ Aquà no puede crear objetos. En esta región no se está ejecutando ningún script. </notification> <notification name="NoOutsideScripts"> - Esta región tiene desactivados los scripts de otros -('no scripts de otros'). -No se ejecutará ningún script que no pertenezca al propietario del terreno. + Este terreno tiene desactivados los scripts externos. + +Los scripts no funcionan aquÃ, excepto los pertenecientes al propietario del terreno. </notification> <notification name="ClaimPublicLand"> - Sólo puede reclamar terreno público en la región en que está usted. + Sólo puedes reclamar terreno público de la región en que estás. </notification> <notification name="RegionTPAccessBlocked"> - No está autorizado en esa región por su nivel de calificación. Debe validar su edad y/o instalar el último visor. + No estás autorizado en esa región por su nivel de calificación. Debes validar tu edad y/o instalar el último visor. -Por favor, vaya a la Base de Conocimientos para más detalles sobre el acceso a zonas con este nivel de calificación. +Por favor, dirÃgete a la Base de Conocimientos para más detalles sobre el acceso a zonas con este nivel de calificación. </notification> <notification name="URBannedFromRegion"> - Se le ha prohibido el acceso a la región. + Se te ha prohibido el acceso a la región. </notification> <notification name="NoTeenGridAccess"> - Su cuenta no puede conectarse a esta región del grid teen. - </notification> - <notification name="NoHelpIslandTP"> - No puede teleportarse de vuelta a la Help Island ('Isla de Ayuda'). -Vaya a la 'Help Island Public' ('Isla Pública de Ayuda') para repetir el tutorial. + Tu cuenta no puede conectarse a esta región del grid teen. </notification> <notification name="ImproperPaymentStatus"> - No tiene el estado de pago adecuado para entrar a esta región. - </notification> - <notification name="MustGetAgeRegion"> - Debe haber verificado su edad para entrar a esta región. + No tienes el estado de pago adecuado para entrar a esta región. </notification> <notification name="MustGetAgeParcel"> - Debe haber verificado su edad para entrar a esta parcela. + Debes haber verificado tu edad para entrar a esta parcela. </notification> <notification name="NoDestRegion"> No se ha encontrada la región de destino. </notification> <notification name="NotAllowedInDest"> - No está autorizado en el destino. + No estás autorizado en el destino. </notification> <notification name="RegionParcelBan"> - No puede cruzar la región por una parcela con el acceso prohibido. Intente otro camino. + No puedes cruzar la región por una parcela con el acceso prohibido. Intenta otro camino. </notification> <notification name="TelehubRedirect"> - Ha sido redirigido a un punto de teleporte. + Has sido redirigido a un punto de teleporte. </notification> <notification name="CouldntTPCloser"> No se puede teleportar a un destino tan cercano. @@ -2670,17 +2309,17 @@ Vaya a la 'Help Island Public' ('Isla Pública de Ayuda') pa Teleporte cancelado. </notification> <notification name="FullRegionTryAgain"> - En estos momentos, está llena la región a la que intenta entrar. -Por favor, reinténtelo en unos momentos. + En estos momentos, está llena la región a la que estás intentando entrar. +Por favor, vuelve a intentarlo en unos momentos. </notification> <notification name="GeneralFailure"> Fallo general. </notification> <notification name="RoutedWrongRegion"> - Mal dirigido a la región. Por favor, reinténtelo. + Mal dirigido a la región. Por favor, vuelve a intentarlo. </notification> <notification name="NoValidAgentID"> - ID de agente inválida. + ID de agente inválido. </notification> <notification name="NoValidSession"> ID de sesión inválido. @@ -2695,13 +2334,13 @@ Por favor, reinténtelo en unos momentos. No se puede crear la conexión. </notification> <notification name="InternalUsherError"> - Se ha producido un error interno al intentar acceder al destino de su teleporte. Puede que, en este momento, el servicio de [SECOND_LIFE] tenga problemas. + Se ha producido un error interno al intentar acceder al destino de tu teleporte. Puede que, en este momento, el servicio de [SECOND_LIFE] tenga problemas. </notification> <notification name="NoGoodTPDestination"> No se puede encontrar en esta región un buen destino para el teleporte. </notification> <notification name="InternalErrorRegionResolver"> - Ha sucedido un error interno al manejar las coordenadas globales de su petición de teleporte. Puede que, en este momento, el servicio de [SECOND_LIFE] tenga problemas. + Se ha producido un error interno al manejar las coordenadas globales de tu petición de teleporte. Puede que, en este momento, el servicio de [SECOND_LIFE] tenga problemas. </notification> <notification name="NoValidLanding"> No se ha podido encontrar un punto de aterrizaje válido. @@ -2710,15 +2349,8 @@ Por favor, reinténtelo en unos momentos. No se ha podido encontrar una parcela válida. </notification> <notification name="ObjectGiveItem"> - Un objeto llamado [OBJECTFROMNAME], propiedad de [FIRST] [LAST], le ha dado un/a [OBJECTTYPE] de nombre [OBJECTNAME]. - <form name="form"> - <button name="Keep" text="Guardar"/> - <button name="Discard" text="Descartar"/> - <button name="Mute" text="Ignorar"/> - </form> - </notification> - <notification name="ObjectGiveItemUnknownUser"> - Un objeto llamado [OBJECTFROMNAME], propiedad de (un usuario desconocido), le ha dado un/a [OBJECTTYPE] de nombre [OBJECTNAME]. + Un objeto de nombre [OBJECTFROMNAME], propiedad de [NAME_SLURL], te ha dado este [OBJECTTYPE]: +[ITEM_SLURL] <form name="form"> <button name="Keep" text="Guardar"/> <button name="Discard" text="Descartar"/> @@ -2726,15 +2358,17 @@ Por favor, reinténtelo en unos momentos. </form> </notification> <notification name="UserGiveItem"> - [NAME] le ha dado un/a [OBJECTTYPE] de nombre '[OBJECTNAME]'. + [NAME_SLURL] te ha dado este [OBJECTTYPE]: +[ITEM_SLURL] <form name="form"> - <button name="Keep" text="Guardar"/> + <button name="Show" text="Mostrar"/> <button name="Discard" text="Descartar"/> <button name="Mute" text="Ignorar"/> </form> </notification> <notification name="GodMessage"> [NAME] + [MESSAGE] </notification> <notification name="JoinGroup"> @@ -2746,14 +2380,17 @@ Por favor, reinténtelo en unos momentos. </form> </notification> <notification name="TeleportOffered"> - [NAME] se ha ofrecido a teleportarle hasta su posición: + [NAME_SLURL] te ha ofrecido teleportarte a su posición: -[MESSAGE] +[MESSAGE] - [MATURITY_STR] <icon>[MATURITY_ICON]</icon> <form name="form"> <button name="Teleport" text="Teleportar"/> <button name="Cancel" text="Cancelar"/> </form> </notification> + <notification name="TeleportOfferSent"> + Teleporte ofrecido a [TO_NAME] + </notification> <notification name="GotoURL"> [MESSAGE] [URL] @@ -2763,46 +2400,55 @@ Por favor, reinténtelo en unos momentos. </form> </notification> <notification name="OfferFriendship"> - [NAME] le está ofreciendo amistad. + [NAME_SLURL] te está ofreciendo su amistad. [MESSAGE] -(Por defecto, usted podrá ver si están conectados los demás). +(Por defecto, podrás ver si el otro está conectado) <form name="form"> <button name="Accept" text="Aceptar"/> <button name="Decline" text="Rehusar"/> </form> </notification> + <notification name="FriendshipOffered"> + Has ofrecido amistad a [TO_NAME] + </notification> <notification name="OfferFriendshipNoMessage"> - [NAME] le está ofreciendo amistad. + [NAME] te está ofreciendo amistad. -(Por defecto, usted podrá ver si están conectados los demás). +(Por defecto, podrás ver si están conectados los demás). <form name="form"> <button name="Accept" text="Aceptar"/> <button name="Decline" text="Rehusar"/> </form> </notification> <notification name="FriendshipAccepted"> - [NAME] ha aceptado su oferta de amistad. + [NAME] ha aceptado tu oferta de amistad. </notification> <notification name="FriendshipDeclined"> - [NAME] ha rehusado su oferta de amistad. + [NAME] ha rehusado tu oferta de amistad. + </notification> + <notification name="FriendshipAcceptedByMe"> + Aceptado el ofrecimiento de amistad. + </notification> + <notification name="FriendshipDeclinedByMe"> + Rehusado el ofrecimiento de amistad. </notification> <notification name="OfferCallingCard"> - [FIRST] [LAST] le está ofreciendo su tarjeta de visita. -Esto añadirá un Ãtem a su inventario para que pueda enviar rápidamente a este residente un MI. + [FIRST] [LAST] te está ofreciendo su tarjeta de visita. +Esto añadirá un marcador en tu inventario para que puedas enviarle rápidamente un MI. <form name="form"> <button name="Accept" text="Aceptar"/> <button name="Decline" text="Rehusar"/> </form> </notification> <notification name="RegionRestartMinutes"> - La región se reiniciará en [MINUTES] minutos. -Si permanece en esta región, será desconectado. + Esta región se reiniciará en [MINUTES] minutos. +Si permaneces en esta región serás desconectado. </notification> <notification name="RegionRestartSeconds"> - La región se reiniciará en [SECONDS] segundos. -Si permanece en esta región, será desconectado. + Esta región se reiniciará en [SECONDS] segundos. +Si permaneces en esta región serás desconectado. </notification> <notification name="LoadWebPage"> ¿Cargar la página web [URL]? @@ -2821,14 +2467,17 @@ Del objeto: [OBJECTNAME]; propiedad de: [NAME]? <notification name="FailedToFindWearable"> Búsqueda fallida de [TYPE] de nombre [DESC] en la base de datos. </notification> + <notification name="ShareToWebFailed"> + Fallo al subir la imagen a la web. + </notification> <notification name="InvalidWearable"> - El Ãtem que intenta llevar usa una caracterÃstica que su visor no puede leer. Por favor, actualice su versión de [APP_NAME] para llevar este Ãtem. + El Ãtem que quieres vestirte tiene una caracterÃstica que tu visor no puede leer. Por favor, actualiza tu versión de [APP_NAME] para ponerte este Ãtem. </notification> <notification name="ScriptQuestion"> '[OBJECTNAME]', un objeto propiedad de '[NAME]', querrÃa: [QUESTIONS] -¿Está de acuerdo? +¿Estás de acuerdo? <form name="form"> <button name="Yes" text="SÃ"/> <button name="No" text="No"/> @@ -2836,10 +2485,10 @@ Del objeto: [OBJECTNAME]; propiedad de: [NAME]? </form> </notification> <notification name="ScriptQuestionCaution"> - '[OBJECTNAME]', un objeto propiedad de '[NAME]', querrÃa: + Un objeto de nombre '[OBJECTNAME]', propiedad de '[NAME]', quiere: [QUESTIONS] -Si no confÃa en este objeto y su creador, debe denegar la solicitud. Para más información, pulse el botón Detalles. +Si no confias en este objeto y en su creador, deberÃas rehusar esta petición. ¿Autorizar esta petición? <form name="form"> @@ -2862,86 +2511,29 @@ Si no confÃa en este objeto y su creador, debe denegar la solicitud. Para más <button name="Ignore" text="Ignorar"/> </form> </notification> - <notification name="FirstBalanceIncrease"> - Ha recibido [AMOUNT] L$. -Pueden darle L$ tanto objetos como otros usuarios. -Su balance se muestra en la esquina superior derecha de la pantalla. - </notification> - <notification name="FirstBalanceDecrease"> - Ha pagado [AMOUNT] L$. -Su balance se muestra en la esquina superior derecha de la pantalla. - </notification> - <notification name="FirstSit"> - Está sentado. -Use las teclas del cursor (o AWSD) para cambiar el punto de vista. -Pulde el botón 'Levantarse' para ponerse de pie. - </notification> - <notification name="FirstMap"> - Pulse el mapa y arrástrelo para desplazarlo. -Púlselo dos veces para teleportarse. -Use los controles de la derecha para encontrar sitios y mostrar diferentes fondos. - </notification> - <notification name="FirstBuild"> - Usted puede construir objetos nuevos en algunas zonas de [SECOND_LIFE]. -Use las herramientas de arriba a la izquierda para construir, y pruebe a cambiar rápidamente entre ellas pulsando Ctrl o Alt. -Pulse Esc para dejar de construir. - </notification> - <notification name="FirstLeftClickNoHit"> - En algunos objetos concretos, al pulsarlos con el botón izquierdo del ratón interacciona con ellos. -Si el puntero del ratón pasa a ser una mano puede interactuar con el objeto. -El botón derecho del ratón siempre muestra un menú con cosas que usted puede hacer. - </notification> - <notification name="FirstTeleport"> - Esta región no permite teleportarse de un punto a otro, por lo que ha sido llevado al Punto de Teleporte más cercano. -Su destinado está señalado con una columna de luz roja. -Siga la flecha roja hasta llegar a la columna, o pulse la flecha para hacerla desaparecer. + <notification name="BuyLindenDollarSuccess"> + ¡Gracias por tu pago! + +Tu saldo de L$ se actualizará cuando se complete el proceso. Si el proceso tarda más de 20 minutos, se cancelará tu transacción, y la cantidad se cargará en tu saldo de US$. + +Puedes revisar el estado de tu pago en el Historial de transacciones de tu [http://secondlife.com/account/ Panel de Control] </notification> <notification name="FirstOverrideKeys"> - A partir de ahora, sus teclas de movimiento las gestiona un objeto. -Pruebe las teclas del cursor o AWSD para ver qué hacen. -Algunos objetos (las pistolas, por ejemplo) le pedirán que, para usarlos, entre usted en vista subjetiva. Pulse 'M' para hacerlo. - </notification> - <notification name="FirstAppearance"> - Está modificando su apariencia. -Use las teclas del cursor para girar el punto de vista y hacer zoom. -Cuando acabe, pulse 'Guardar todo' para salvar su apariencia y salir del modificarla. -Puede modificar su apariencia tantas veces como quiera. - </notification> - <notification name="FirstInventory"> - Este es su inventario. Tiene objetos, notas, ropas, y otras cosas de su propiedad. -* Para vestirse un objeto o un vestuario completo, arrástrelo hasta usted mismo. -* Para colocar un objeto en el mundo, arrástrelo hasta el suelo. -* Para leer una nota, pulse dos veces en ella. + A partir de ahora, tus teclas de movimiento las gestiona un objeto. +Prueba las teclas del cursor o AWSD para ver qué hacen. +Algunos objetos (las pistolas, por ejemplo) te pedirán que, para usarlos, entres en vista subjetiva. Pulsa 'M' para hacerlo. </notification> <notification name="FirstSandbox"> - Esta es una región 'sandbox' (zona de pruebas). -Los objetos que construya aquà pueden ser eliminados cuando salga de esta zona, pues los sandbox se limpian regularmente. Por favor, tenga en cuenta la información que hay arriba de su pantalla junto al nombre de la región. + Esta es una región 'sandbox' (zona de pruebas) donde los Residentes pueden aprender a construir. -Las regiones sandbox no son frecuentes, y están señalizadas. - </notification> - <notification name="FirstFlexible"> - Este objeto es flexible. -Los objetos flexibles no pueden ser materiales, y serán inmateriales hasta que se desmarque la casilla de flexibles. - </notification> - <notification name="FirstDebugMenus"> - Ha activado el menú Avanzado. -Contiene herramientas útiles para los desarrolladores que trabajan mejorando [SECOND_LIFE]. -Para pasar este menú a una ventana, pulse Ctrl+Alt+D. En un Mac, pulse ⌥⌘D. - </notification> - <notification name="FirstSculptedPrim"> - Está editando un prim 'sculpted'. -Los prim sculpted requieren una textura especial para tomar forma. -Puede encontrar ejemplos de texturas sculpted en la biblioteca del inventario. - </notification> - <notification name="FirstMedia"> - Ha empezado a reproducir media. Puede hacer que los media se reproduzcan automáticamente en la pestaña Audio y VÃdeo de la ventana de preferencias. Note que tal cosa puede suponer un riesgo de seguridad en los sitios multimedia en los que no confÃe. +Los objetos que construyas aquà serán eliminados cuando la abandones; por tanto, no olvides pulsarlos con el botón derecho y elegir 'Tomar' para que tu creación vaya a tu inventario. </notification> <notification name="MaxListSelectMessage"> - Puede seleccionar un máximo de [MAX_SELECT] Ãtems de esta lista. + Puedes seleccionar un máximo de [MAX_SELECT] Ãtems de esta lista. </notification> <notification name="VoiceInviteP2P"> - [NAME] le está invitando a un chat de voz. -Pulse Aceptar para coger la llamada o Rehusar para declinar la invitación. Pulse Ignorar para ignorar a quien llama. + [NAME] te está invitando a un chat de voz. +Pulsa Aceptar o Rehusar para coger o no la llamada. Pulsa Ignorar para ignorar al que llama. <form name="form"> <button name="Accept" text="Aceptar"/> <button name="Decline" text="Rehusar"/> @@ -2949,17 +2541,17 @@ Pulse Aceptar para coger la llamada o Rehusar para declinar la invitación. Puls </form> </notification> <notification name="AutoUnmuteByIM"> - [FIRST] [LAST], a quien ha enviado un mensaje instantáneo, ha dejado automáticamente de estar ignorado. + [FIRST] [LAST] ha dejado automáticamente de estar ignorado al enviarle un mensaje instantáneo. </notification> <notification name="AutoUnmuteByMoney"> - [FIRST] [LAST], a quien ha dado dinero, ha dejado automáticamente de estar ignorado. + [FIRST] [LAST] ha dejado automáticamente de estar ignorado al darle dinero. </notification> <notification name="AutoUnmuteByInventory"> - [FIRST] [LAST], a quien ha ofrecido algo del inventario, ha dejado automáticamente de estar ignorado. + [FIRST] [LAST] ha dejado automáticamente de estar ignorado al ofrecerle algo del inventario. </notification> <notification name="VoiceInviteGroup"> [NAME] ha empezado un chat de voz con el grupo [GROUP]. -Pulse Aceptar para coger la llamada o Rehusar para declinar la invitación. Pulse Ignorar para ignorar a quien llama. +Pulsa Aceptar o Rehusar para coger o no la llamada. Pulsa Ignorar para ignorar al que llama. <form name="form"> <button name="Accept" text="Aceptar"/> <button name="Decline" text="Rehusar"/> @@ -2968,7 +2560,7 @@ Pulse Aceptar para coger la llamada o Rehusar para declinar la invitación. Puls </notification> <notification name="VoiceInviteAdHoc"> [NAME] ha empezado un chat de voz en multiconferencia. -Pulse Aceptar para coger la llamada o Rehusar para declinar la invitación. Pulse Ignorar para ignorar a este usuario. +Pulsa Aceptar o Rehusar para coger o no la llamada. Pulsa Ignorar para ignorar al que llama. <form name="form"> <button name="Accept" text="Aceptar"/> <button name="Decline" text="Rehusar"/> @@ -2976,8 +2568,8 @@ Pulse Aceptar para coger la llamada o Rehusar para declinar la invitación. Puls </form> </notification> <notification name="InviteAdHoc"> - [NAME] le está invitando a un chat en multiconferencia. -Pulse Aceptar para entrar al chat o Rehusar para declinar la invitación. Pulse Ignorar para ignorar a este usuario. + NAME] te está invitando a un chat en multiconferencia. +Pulsa Aceptar o Rehusar para coger o no la llamada. Pulsa Ignorar para ignorar al que llama. <form name="form"> <button name="Accept" text="Aceptar"/> <button name="Decline" text="Rehusar"/> @@ -2985,57 +2577,205 @@ Pulse Aceptar para entrar al chat o Rehusar para declinar la invitación. Pulse </form> </notification> <notification name="VoiceChannelFull"> - El chat de voz al que está intentando entrar, [VOICE_CHANNEL_NAME], ha llegado a su capacidad máxima. Por favor, inténtelo más tarde. + El chat de voz al que estás intentando entrar, [VOICE_CHANNEL_NAME], ha llegado a su capacidad máxima. Por favor, vuelve a intentarlo más tarde. </notification> <notification name="ProximalVoiceChannelFull"> - Lo sentimos. Este área ha llegado a su capacidad máxima de conversaciones por voz. Por favor, intente usar la voz en otra zona. + Lo sentimos. Este área ha llegado a su capacidad máxima de conversaciones por voz. Por favor, intenta usar la voz en otra zona. </notification> <notification name="VoiceChannelDisconnected"> - Ha sido desconectado del [VOICE_CHANNEL_NAME]. Va a ser reconectado al chat de voz del mundo. + Has sido desconectado de [VOICE_CHANNEL_NAME]. Vas a ser reconectado al chat de voz. </notification> <notification name="VoiceChannelDisconnectedP2P"> - [VOICE_CHANNEL_NAME] ha colgado la llamada. Usted va a ser reconectado al chat de voz del mundo. + [VOICE_CHANNEL_NAME] ha colgado la llamada. Vas a ser reconectado al chat de voz. </notification> <notification name="P2PCallDeclined"> - [VOICE_CHANNEL_NAME] ha rehusado su llamada. Usted va a ser reconectado al chat de voz del mundo. + [VOICE_CHANNEL_NAME] ha rehusado tu llamada. Vas a ser reconectado al chat de voz. </notification> <notification name="P2PCallNoAnswer"> - [VOICE_CHANNEL_NAME] no está disponible para coger su llamada. Usted va a ser reconectado al chat de voz del mundo. + [VOICE_CHANNEL_NAME] no está disponible para coger tu llamada. Vas a ser reconectado al chat de voz. </notification> <notification name="VoiceChannelJoinFailed"> - Fallo al conectar al [VOICE_CHANNEL_NAME]; por favor, inténtelo más tarde. Usted va a ser reconectado al chat de voz del mundo. + Fallo al conectar a [VOICE_CHANNEL_NAME]; por favor, inténtalo más tarde. Vas a ser reconectado al chat de voz. </notification> <notification name="VoiceLoginRetry"> - Estamos creando un canal de voz para usted. Se puede tardar hasta un minuto. + Estamos creando un canal de voz para ti. Se puede tardar hasta un minuto. + </notification> + <notification name="VoiceEffectsExpired"> + Una o más de las transformaciones de voz a las que estás suscrito han caducado. +[Pulsa aquà [URL]] para renovar la suscripción. + </notification> + <notification name="VoiceEffectsExpiredInUse"> + La transformación de voz activa ha caducado y se ha aplicado tu configuración de voz normal. +[Pulsa aquà [URL]] para renovar la suscripción. + </notification> + <notification name="VoiceEffectsWillExpire"> + Una o más de tus transformaciones de voz caducarán en menos de [INTERVAL] dÃas. +[Pulsa aquà [URL]] para renovar la suscripción. + </notification> + <notification name="VoiceEffectsNew"> + Están disponibles nuevas transformaciones de voz. </notification> <notification name="Cannot enter parcel: not a group member"> - No puede entrar en esta parcela, no es miembro del grupo adecuado. + Sólo los miembros de un grupo determinado pueden visitar esta zona. </notification> <notification name="Cannot enter parcel: banned"> - No puede entrar en esta parcela, se le ha prohibido el acceso. + No puedes entrar en esta parcela, se te ha prohibido el acceso. </notification> <notification name="Cannot enter parcel: not on access list"> - No puede entrar en esta parcela, no está en la lista de acceso. + No puedes entrar en esta parcela, no estás en la lista de acceso. </notification> <notification name="VoiceNotAllowed"> - No tiene permiso para conectarse al chat de voz de [VOICE_CHANNEL_NAME]. + No tienes permiso para conectarte al chat de voz de [VOICE_CHANNEL_NAME]. </notification> <notification name="VoiceCallGenericError"> - Ha ocurrido un error intentando conectarle al [VOICE_CHANNEL_NAME]. Por favor, inténtelo más tarde. + Se ha producido un error al intentar conectarte al [VOICE_CHANNEL_NAME]. Por favor, inténtalo más tarde. </notification> <notification name="ServerVersionChanged"> - La región en la que ha entrado se ejecuta en un simulador con una versión diferente. Pulse este mensaje para ver más detalles. + Acabas de entrar en una región que usa un servidor con una versión distinta, y esto puede influir en el funcionamiento. [[URL] Ver las notas de desarrollo]. + </notification> + <notification name="UnsupportedCommandSLURL"> + No se admite el formato de la SLurl que has pulsado. </notification> - <notification name="UnableToOpenCommandURL"> - No puede abrirse desde este navegador la URL que ha pulsado. + <notification name="BlockedSLURL"> + Por tu seguridad, se ha bloqueado una SLurl recibida de un navegador no de confianza. + </notification> + <notification name="ThrottledSLURL"> + En muy poco tiempo, se han recibido muchas SLurls desde un navegador que no es de confianza. +Por tu seguridad, serán bloqueadas durante unos segundos. + </notification> + <notification name="IMToast"> + [MESSAGE] + <form name="form"> + <button name="respondbutton" text="Responder"/> + </form> + </notification> + <notification name="ConfirmCloseAll"> + ¿Seguro que quieres cerrar todos los MI? + <usetemplate ignoretext="Confirmar antes de cerrar todos los MIs" name="okcancelignore" notext="Cancelar" yestext="OK"/> + </notification> + <notification name="AttachmentSaved"> + Se ha guardado el adjunto. + </notification> + <notification name="UnableToFindHelpTopic"> + No se ha podido encontrar un tema de ayuda para este elemento. + </notification> + <notification name="ObjectMediaFailure"> + Error del servidor: fallo en la actualización u obtención de los media. +'[ERROR]' + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="TextChatIsMutedByModerator"> + Un moderador ha silenciado tu chat de texto. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="VoiceIsMutedByModerator"> + Un moderador ha silenciado tu voz. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="ConfirmClearTeleportHistory"> + ¿Estás seguro de que quieres borrar tu historial de teleportes? + <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> + </notification> + <notification name="BottomTrayButtonCanNotBeShown"> + El botón elegido no se puede mostrar correctamente. +Se mostrará cuando haya suficiente espacio. + </notification> + <notification name="ShareNotification"> + Selecciona los residentes con quienes deseas compartir. + </notification> + <notification name="ShareItemsConfirmation"> + ¿Estás seguro de que quieres compartir los elementos siguientes? + +[ITEMS] + +Con los siguientes residentes: + +[RESIDENTS] + <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> + </notification> + <notification name="ItemsShared"> + Los elementos se han compartido correctamente. + </notification> + <notification name="DeedToGroupFail"> + Error de transferencia a grupo. + </notification> + <notification name="AvatarRezNotification"> + ( [EXISTENCE] segundos vivo) +El avatar '[NAME]' tardó [TIME] segundos en dejar de aparecer como nube. + </notification> + <notification name="AvatarRezSelfBakedDoneNotification"> + ( [EXISTENCE] segundos vivo) +Has terminado de texturizar tu vestuario en [TIME] segundos. + </notification> + <notification name="AvatarRezSelfBakedUpdateNotification"> + ( [EXISTENCE] segundos vivo) +Has enviado una actualización de tu apariencia después de [TIME] segundos. +[STATUS] + </notification> + <notification name="AvatarRezCloudNotification"> + ( [EXISTENCE] segundos vivo) +El avatar '[NAME]' se convirtió en nube. + </notification> + <notification name="AvatarRezArrivedNotification"> + ( [EXISTENCE] segundos vivo) +Apareció el avatar '[NAME]'. + </notification> + <notification name="AvatarRezLeftCloudNotification"> + ( [EXISTENCE] segundos vivo) +El avatar '[NAME]' salió al cabo de [TIME] segundos como nube. + </notification> + <notification name="AvatarRezEnteredAppearanceNotification"> + ( [EXISTENCE] segundos vivo) +El avatar '[NAME]' ya está en modo de edición de apariencia. + </notification> + <notification name="AvatarRezLeftAppearanceNotification"> + ( [EXISTENCE] segundos vivo) +El avatar '[NAME]' desactivó el modo de apariencia. + </notification> + <notification name="NoConnect"> + Tenemos problemas de conexión con [PROTOCOL] [HOSTID]. +Comprueba la configuración de la red y del servidor de seguridad. + <form name="form"> + <button name="OK" text="OK"/> + </form> + </notification> + <notification name="NoVoiceConnect"> + Tenemos problemas de conexión con tu servidor de voz: + +[HOSTID] + +No podrás establecer comunicaciones de voz. +Comprueba la configuración de la red y del servidor de seguridad. + <form name="form"> + <button name="OK" text="OK"/> + </form> + </notification> + <notification name="AvatarRezLeftNotification"> + ( [EXISTENCE] segundos vivo) +El avatar '[NAME]' ya estaba totalmente cargado al salir. + </notification> + <notification name="AvatarRezSelfBakeNotification"> + ( [EXISTENCE] segundos vivo) +Has cargado una textura obtenida mediante bake de [RESOLUTION] para '[BODYREGION]' después de [TIME] segundos. + </notification> + <notification name="ConfirmLeaveCall"> + ¿Estás seguro de que deseas salir de esta multiconferencia? + <usetemplate ignoretext="Confirma antes de salir de la llamada" name="okcancelignore" notext="No" yestext="SÃ"/> + </notification> + <notification name="ConfirmMuteAll"> + Has seleccionado silenciar a todos los participantes en una multiconferencia. +Si lo haces, todos los residentes que se unan posteriormente a la llamada también serán silenciados, incluso cuando abandones la conferencia. + +¿Deseas silenciar a todos? + <usetemplate ignoretext="Confirma que deseas silenciar a todos los participantes en una multiconferencia." name="okcancelignore" notext="Cancelar" yestext="OK"/> </notification> <global name="UnsupportedCPU"> - - La velocidad de su CPU no cumple los requerimientos mÃnimos. + - La velocidad de tu CPU no cumple los requerimientos mÃnimos. </global> <global name="UnsupportedGLRequirements"> - Parece que no tiene los requerimientos de hardware apropiados para [APP_NAME]. [APP_NAME] requiere una tarjeta gráfica OpenGL que admita texturas múltiples ('multitexture support'). Si la tiene, compruebe que tiene los últimos drivers para su tarjeta gráfica, asà como los últimos parches y 'service packs' para su sistema operativo. + Parece que no tienes el hardware apropiado para [APP_NAME]. [APP_NAME] requiere una tarjeta gráfica OpenGL que admita texturas múltiples ('multitexture support'). Si la tienes, comprueba que tienes los últimos 'drivers' para tu tarjeta gráfica, asà como los últimos parches y 'service packs' para tu sistema operativo. -Si los problemas persisten, por favor, acuda a: http://www.secondlife.com/support +Si los problemas persisten, por favor, acude a [SUPPORT_SITE]. </global> <global name="UnsupportedCPUAmount"> 796 @@ -3044,15 +2784,13 @@ Si los problemas persisten, por favor, acuda a: http://www.secondlife.com/suppor 510 </global> <global name="UnsupportedGPU"> - - Su tarjeta gráfica no cumple los requerimientos mÃnimos. + - Tu tarjeta gráfica no cumple los requerimientos mÃnimos. </global> <global name="UnsupportedRAM"> - - La memoria de su sistema no cumple los requerimientos mÃnimos. - </global> - <global name="PermYes"> - Sà + - La memoria de tu sistema no cumple los requerimientos mÃnimos. </global> - <global name="PermNo"> - No + <global name="You can only set your 'Home Location' on your land or at a mainland Infohub."> + Si posees un terreno, puedes hacerlo tu Base. +También puedes buscar en el Mapa lugares marcados como "Puntos de Información". </global> </notifications> diff --git a/indra/newview/skins/default/xui/es/outfit_accordion_tab.xml b/indra/newview/skins/default/xui/es/outfit_accordion_tab.xml new file mode 100644 index 0000000000..bac885e5d8 --- /dev/null +++ b/indra/newview/skins/default/xui/es/outfit_accordion_tab.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- *NOTE: mantipov: this xml is intended to be used inside panel_outfits_list.xml for each outfit folder--> +<!-- All accordion tabs in the My Appearance/My Outfits panel will be created from this one at runtume--> +<accordion_tab name="Mockup Tab" title="Mockup Tab"/> diff --git a/indra/newview/skins/default/xui/es/panel_active_object_row.xml b/indra/newview/skins/default/xui/es/panel_active_object_row.xml new file mode 100644 index 0000000000..8d4fadb101 --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_active_object_row.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_activeim_row"> + <string name="unknown_obj"> + Objeto desconocido + </string> + <text name="object_name"> + Objeto sin nombre + </text> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_adhoc_control_panel.xml b/indra/newview/skins/default/xui/es/panel_adhoc_control_panel.xml new file mode 100644 index 0000000000..c64a93e0e5 --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_adhoc_control_panel.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_im_control_panel"> + <layout_stack name="vertical_stack"> + <layout_panel name="call_btn_panel"> + <button label="Llamar" name="call_btn"/> + </layout_panel> + <layout_panel name="end_call_btn_panel"> + <button label="Colgar" name="end_call_btn"/> + </layout_panel> + <layout_panel name="voice_ctrls_btn_panel"> + <button label="Controles de la voz" name="voice_ctrls_btn"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/es/panel_avatar_list_item.xml new file mode 100644 index 0000000000..e1ffc14823 --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_avatar_list_item.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="avatar_list_item"> + <string name="FormatSeconds"> + [COUNT] seg. + </string> + <string name="FormatMinutes"> + [COUNT] min. + </string> + <string name="FormatHours"> + [COUNT] h. + </string> + <string name="FormatDays"> + [COUNT] d. + </string> + <string name="FormatWeeks"> + [COUNT] sem. + </string> + <string name="FormatMonths"> + [COUNT] mes/es + </string> + <string name="FormatYears"> + [COUNT] año/s + </string> + <text name="avatar_name" value="Desconocido"/> + <button name="profile_btn" tool_tip="Ver el perfil"/> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_block_list_sidetray.xml b/indra/newview/skins/default/xui/es/panel_block_list_sidetray.xml new file mode 100644 index 0000000000..cddbad1195 --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_block_list_sidetray.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="block_list_panel"> + <text name="title_text"> + Lista de ignorados + </text> + <scroll_list name="blocked" tool_tip="Lista de los residentes ignorados actualmente"/> + <button label="Ignorar al residente..." label_selected="Ignorar al residente..." name="Block resident..." tool_tip="Elige a un Residente para ignorarle"/> + <button label="Ignorar objetos según el nombre..." label_selected="Ignorar objetos según el nombre..." name="Block object by name..."/> + <button label="No ignorar" label_selected="No ignorar" name="Unblock" tool_tip="Quita al Residente o al objeto de la lista de ignorados"/> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_body_parts_list_item.xml b/indra/newview/skins/default/xui/es/panel_body_parts_list_item.xml new file mode 100644 index 0000000000..de764d8025 --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_body_parts_list_item.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="wearable_item"> + <text name="item_name" value="..."/> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_bodyparts_list_button_bar.xml b/indra/newview/skins/default/xui/es/panel_bodyparts_list_button_bar.xml new file mode 100644 index 0000000000..66ae7d868b --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_bodyparts_list_button_bar.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="clothing_list_button_bar_panel"> + <button label="Cambiar" name="switch_btn"/> + <button label="Comprar >" name="bodyparts_shop_btn"/> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_bottomtray.xml b/indra/newview/skins/default/xui/es/panel_bottomtray.xml new file mode 100644 index 0000000000..5ea09ed795 --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_bottomtray.xml @@ -0,0 +1,49 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="bottom_tray"> + <string name="SpeakBtnToolTip" value="Activa/Desactiva el micrófono"/> + <string name="VoiceControlBtnToolTip" value="Muestra/Oculta el panel del control de voz"/> + <layout_stack name="toolbar_stack"> + <layout_panel name="speak_panel"> + <talk_button name="talk"> + <speak_button label="Hablar" label_selected="Hablar" name="speak_btn"/> + </talk_button> + </layout_panel> + <layout_panel name="gesture_panel"> + <gesture_combo_list label="Gestos" name="Gesture" tool_tip="Muestra/Oculta los gestos"/> + </layout_panel> + <layout_panel name="movement_panel"> + <button label="Moverme" name="movement_btn" tool_tip="Muestra/Oculta los controles del movimiento"/> + </layout_panel> + <layout_panel name="cam_panel"> + <button label="Visión" name="camera_btn" tool_tip="Muestra/Oculta los controles de la cámara"/> + </layout_panel> + <layout_panel name="snapshot_panel"> + <button label="" name="snapshots" tool_tip="Hacer una foto"/> + </layout_panel> + <layout_panel name="sidebar_btn_panel"> + <button label="Barra lateral" name="sidebar_btn" tool_tip="Muestra/Oculta la barra lateral"/> + </layout_panel> + <layout_panel name="build_btn_panel"> + <button label="Construir" name="build_btn" tool_tip="Muestra/Oculta las herramientas de construcción"/> + </layout_panel> + <layout_panel name="search_btn_panel"> + <button label="Buscar" name="search_btn" tool_tip="Muestra/Oculta la búsqueda"/> + </layout_panel> + <layout_panel name="world_map_btn_panel"> + <button label="Mapa" name="world_map_btn" tool_tip="Muestra/Oculta el mapa del mundo"/> + </layout_panel> + <layout_panel name="mini_map_btn_panel"> + <button label="Minimapa" name="mini_map_btn" tool_tip="Muestra/Oculta el minimapa"/> + </layout_panel> + <layout_panel name="im_well_panel"> + <chiclet_im_well name="im_well"> + <button name="Unread IM messages" tool_tip="Conversaciones"/> + </chiclet_im_well> + </layout_panel> + <layout_panel name="notification_well_panel"> + <chiclet_notification name="notification_well"> + <button name="Unread" tool_tip="Notificaciones"/> + </chiclet_notification> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_bottomtray_lite.xml b/indra/newview/skins/default/xui/es/panel_bottomtray_lite.xml new file mode 100644 index 0000000000..8d1b84a5fd --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_bottomtray_lite.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="bottom_tray_lite"> + <layout_stack name="toolbar_stack_lite"> + <layout_panel name="gesture_panel"> + <gesture_combo_list label="Gestos" name="Gesture" tool_tip="Muestra/Oculta los gestos"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_classified_info.xml b/indra/newview/skins/default/xui/es/panel_classified_info.xml new file mode 100644 index 0000000000..35fe174970 --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_classified_info.xml @@ -0,0 +1,53 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_classified_info"> + <panel.string name="l$_price"> + [PRICE] L$ + </panel.string> + <panel.string name="click_through_text_fmt"> + [TELEPORT] teleportes, [MAP] mapa, [PROFILE] perfil + </panel.string> + <panel.string name="date_fmt"> + [day,datetime,slt]/[mthnum,datetime,slt]/[year,datetime,slt] + </panel.string> + <panel.string name="auto_renew_on"> + Activada + </panel.string> + <panel.string name="auto_renew_off"> + Desactivada + </panel.string> + <text name="title" value="Información del clasificado"/> + <scroll_container name="profile_scroll"> + <panel name="scroll_content_panel"> + <text_editor name="classified_name" value="[name]"/> + <text name="classified_location_label" value="Localización:"/> + <text_editor name="classified_location" value="[loading...]"/> + <text name="content_type_label" value="Tipo de contenido:"/> + <text_editor name="content_type" value="[content type]"/> + <text name="category_label" value="CategorÃa:"/> + <text_editor name="category" value="[category]"/> + <text name="creation_date_label" value="Fecha de creación:"/> + <text_editor name="creation_date" tool_tip="Fecha de creación" value="[date]"/> + <text name="price_for_listing_label" value="Precio por publicarlo:"/> + <text_editor name="price_for_listing" tool_tip="Precio por publicarlo." value="[price]"/> + <layout_stack name="descr_stack"> + <layout_panel name="clickthrough_layout_panel"> + <text name="click_through_label" value="Clics:"/> + <text_editor name="click_through_text" tool_tip="Información sobre Click through" value="[clicks]"/> + </layout_panel> + <layout_panel name="price_layout_panel"> + <text name="auto_renew_label" value="Renovación:"/> + <text name="auto_renew" value="Activada"/> + </layout_panel> + <layout_panel name="descr_layout_panel"> + <text name="classified_desc_label" value="Descripción:"/> + <text_editor name="classified_desc" value="[description]"/> + </layout_panel> + </layout_stack> + </panel> + </scroll_container> + <panel name="buttons"> + <button label="Teleportar" name="teleport_btn"/> + <button label="Mapa" name="show_on_map_btn"/> + <button label="Editar" name="edit_btn"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_clothing_list_button_bar.xml b/indra/newview/skins/default/xui/es/panel_clothing_list_button_bar.xml new file mode 100644 index 0000000000..d3b3d31bd9 --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_clothing_list_button_bar.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="clothing_list_button_bar_panel"> + <button label="Añadir +" name="add_btn"/> + <button label="Comprar >" name="clothing_shop_btn"/> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_clothing_list_item.xml b/indra/newview/skins/default/xui/es/panel_clothing_list_item.xml new file mode 100644 index 0000000000..de764d8025 --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_clothing_list_item.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="wearable_item"> + <text name="item_name" value="..."/> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_cof_wearables.xml b/indra/newview/skins/default/xui/es/panel_cof_wearables.xml new file mode 100644 index 0000000000..a2994894c1 --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_cof_wearables.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="cof_wearables"> + <accordion name="cof_wearables_accordion"> + <accordion_tab name="tab_attachments" title="Adjuntos"/> + <accordion_tab name="tab_clothing" title="Ropa"/> + <accordion_tab name="tab_body_parts" title="Partes del cuerpo"/> + </accordion> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_deletable_wearable_list_item.xml b/indra/newview/skins/default/xui/es/panel_deletable_wearable_list_item.xml new file mode 100644 index 0000000000..91d90a5660 --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_deletable_wearable_list_item.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="deletable_wearable_item"> + <text name="item_name" value="..."/> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_dummy_clothing_list_item.xml b/indra/newview/skins/default/xui/es/panel_dummy_clothing_list_item.xml new file mode 100644 index 0000000000..6af84de0c7 --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_dummy_clothing_list_item.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="dummy_clothing_item"> + <text name="item_name" value="..."/> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_edit_alpha.xml b/indra/newview/skins/default/xui/es/panel_edit_alpha.xml new file mode 100644 index 0000000000..3f238da9d0 --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_edit_alpha.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="edit_alpha_panel"> + <panel name="avatar_alpha_color_panel"> + <texture_picker label="Alfa inferior" name="Lower Alpha" tool_tip="Pulsa para elegir una imagen"/> + <texture_picker label="Alfa superior" name="Upper Alpha" tool_tip="Pulsa para elegir una imagen"/> + <texture_picker label="Alfa de la cabeza" name="Head Alpha" tool_tip="Pulsa para elegir una imagen"/> + <texture_picker label="Alfa de los ojos" name="Eye Alpha" tool_tip="Pulsa para elegir una imagen"/> + <texture_picker label="Alfa del pelo" name="Hair Alpha" tool_tip="Pulsa para elegir una imagen"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_edit_classified.xml b/indra/newview/skins/default/xui/es/panel_edit_classified.xml new file mode 100644 index 0000000000..6d53b401c0 --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_edit_classified.xml @@ -0,0 +1,48 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Editar el clasificado" name="panel_edit_classified"> + <panel.string name="location_notice"> + (se actualizará tras guardarlo) + </panel.string> + <string name="publish_label"> + Publicar + </string> + <string name="save_label"> + Guardar + </string> + <text name="title"> + Editar el clasificado + </text> + <scroll_container name="profile_scroll"> + <panel name="scroll_content_panel"> + <panel name="snapshot_panel"> + <icon label="" name="edit_icon" tool_tip="Pulsa para elegir una imagen"/> + </panel> + <text name="Name:"> + TÃtulo: + </text> + <text name="description_label"> + Descripción: + </text> + <text name="location_label"> + Localización: + </text> + <text name="classified_location"> + cargando... + </text> + <button label="Configurar en esta posición" name="set_to_curr_location_btn"/> + <text name="category_label" value="CategorÃa:"/> + <text name="content_type_label" value="Tipo de contenido:"/> + <icons_combo_box label="Contenido general" name="content_type"> + <icons_combo_box.item label="Contenido moderado" name="mature_ci" value="Moderado"/> + <icons_combo_box.item label="Contenido general" name="pg_ci" value="General"/> + </icons_combo_box> + <text name="price_for_listing_label" value="Precio por publicarlo:"/> + <spinner label="L$" name="price_for_listing" tool_tip="Precio por publicarlo." value="50"/> + <check_box label="Renovar automáticamente cada semana" name="auto_renew"/> + </panel> + </scroll_container> + <panel label="bottom_panel" name="bottom_panel"> + <button label="[LABEL]" name="save_changes_btn"/> + <button label="Cancelar" name="cancel_btn"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_edit_eyes.xml b/indra/newview/skins/default/xui/es/panel_edit_eyes.xml new file mode 100644 index 0000000000..29a416f698 --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_edit_eyes.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="edit_eyes_panel"> + <panel name="avatar_eye_color_panel"> + <texture_picker label="Iris" name="Iris" tool_tip="Pulsa para elegir una imagen"/> + </panel> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="eyes_main_tab" title="Ojos"/> + </accordion> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_edit_gloves.xml b/indra/newview/skins/default/xui/es/panel_edit_gloves.xml new file mode 100644 index 0000000000..684a35a830 --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_edit_gloves.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="edit_gloves_panel"> + <panel name="avatar_gloves_color_panel"> + <texture_picker label="Tela" name="Fabric" tool_tip="Pulsa para elegir una imagen"/> + <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/> + </panel> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="gloves_main_tab" title="Guantes"/> + </accordion> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_edit_hair.xml b/indra/newview/skins/default/xui/es/panel_edit_hair.xml new file mode 100644 index 0000000000..25af1ea8cb --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_edit_hair.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="edit_hair_panel"> + <panel name="avatar_hair_color_panel"> + <texture_picker label="Textura" name="Texture" tool_tip="Pulsa para elegir una imagen"/> + </panel> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="hair_color_tab" title="Color"/> + <accordion_tab name="hair_style_tab" title="Estilo"/> + <accordion_tab name="hair_eyebrows_tab" title="Cejas"/> + <accordion_tab name="hair_facial_tab" title="Facial"/> + </accordion> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_edit_jacket.xml b/indra/newview/skins/default/xui/es/panel_edit_jacket.xml new file mode 100644 index 0000000000..347107d746 --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_edit_jacket.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="edit_jacket_panel"> + <panel name="avatar_jacket_color_panel"> + <texture_picker label="Tejido superior" name="Upper Fabric" tool_tip="Pulsa para elegir una imagen"/> + <texture_picker label="Tejido inferior" name="Lower Fabric" tool_tip="Pulsa para elegir una imagen"/> + <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/> + </panel> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="jacket_main_tab" title="Chaqueta"/> + </accordion> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_edit_pants.xml b/indra/newview/skins/default/xui/es/panel_edit_pants.xml new file mode 100644 index 0000000000..e765702343 --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_edit_pants.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="edit_pants_panel"> + <panel name="avatar_pants_color_panel"> + <texture_picker label="Tela" name="Fabric" tool_tip="Pulsa para elegir una imagen"/> + <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/> + </panel> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="pants_main_tab" title="Pantalones"/> + </accordion> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_edit_pick.xml b/indra/newview/skins/default/xui/es/panel_edit_pick.xml new file mode 100644 index 0000000000..f8a03d2302 --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_edit_pick.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Editar el destacado" name="panel_edit_pick"> + <panel.string name="location_notice"> + (se actualizará tras guardarlo) + </panel.string> + <text name="title"> + Editar el destacado + </text> + <scroll_container name="profile_scroll"> + <panel name="scroll_content_panel"> + <icon label="" name="edit_icon" tool_tip="Pulsa para elegir una imagen"/> + <text name="Name:"> + TÃtulo: + </text> + <text name="description_label"> + Descripción: + </text> + <text name="location_label"> + Posición: + </text> + <text name="pick_location"> + cargando... + </text> + <button label="Configurar en mi posición" name="set_to_curr_location_btn"/> + </panel> + </scroll_container> + <panel label="bottom_panel" name="bottom_panel"> + <button label="Guardar" name="save_changes_btn"/> + <button label="Cancelar" name="cancel_btn"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_edit_profile.xml b/indra/newview/skins/default/xui/es/panel_edit_profile.xml index c12dd8d58c..e7bd7aba17 100644 --- a/indra/newview/skins/default/xui/es/panel_edit_profile.xml +++ b/indra/newview/skins/default/xui/es/panel_edit_profile.xml @@ -1,45 +1,51 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<panel name="edit_profile_panel"> - <string name="CaptionTextAcctInfo"> - [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION] - </string> - <string name="AcctTypeResident" - value="Residente" /> - <string name="AcctTypeTrial" - value="Prueba" /> - <string name="AcctTypeCharterMember" - value="Miembro fundador" /> - <string name="AcctTypeEmployee" - value="Empleado de Linden Lab" /> - <string name="PaymentInfoUsed" - value="Ha usado una forma de pago" /> - <string name="PaymentInfoOnFile" - value="Hay infor. de la forma de pago" /> - <string name="NoPaymentInfoOnFile" - value="Sin infor. de la forma de pago" /> - <string name="AgeVerified" - value="Edad verificada" /> - <string name="NotAgeVerified" - value="Edad no verificada" /> - <string name="partner_edit_link_url"> - http://www.secondlife.com/account/partners.php?lang=es - </string> - <panel name="scroll_content_panel"> - <panel name="data_panel" > - <panel name="lifes_images_panel"> - <panel name="second_life_image_panel"> - <text name="second_life_photo_title_text"> - [SECOND_LIFE]: - </text> - </panel> - </panel> - <text name="title_partner_text" value="Compañero/a:"/> - <panel name="partner_data_panel"> - <text name="partner_text" value="[FIRST] [LAST]"/> - </panel> - <text name="text_box3"> - Mensaje en el estado ocupado: - </text> - </panel> - </panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Editar el perfil" name="edit_profile_panel"> + <string name="CaptionTextAcctInfo"> + [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION] + </string> + <string name="RegisterDateFormat"> + [REG_DATE] ([AGE]) + </string> + <string name="AcctTypeResident" value="Residente"/> + <string name="AcctTypeTrial" value="Prueba"/> + <string name="AcctTypeCharterMember" value="Miembro fundador"/> + <string name="AcctTypeEmployee" value="Empleado de Linden Lab"/> + <string name="PaymentInfoUsed" value="Ha usado una forma de pago"/> + <string name="PaymentInfoOnFile" value="Hay infor. de la forma de pago"/> + <string name="NoPaymentInfoOnFile" value="Sin infor. de la forma de pago"/> + <string name="AgeVerified" value="Edad verificada"/> + <string name="NotAgeVerified" value="Edad no verificada"/> + <string name="partner_edit_link_url"> + http://www.secondlife.com/account/partners.php?lang=es + </string> + <string name="no_partner_text" value="Ninguno"/> + <scroll_container name="profile_scroll"> + <panel name="scroll_content_panel"> + <panel name="data_panel"> + <panel name="lifes_images_panel"> + <icon label="" name="2nd_life_edit_icon" tool_tip="Pulsa para elegir una imagen"/> + </panel> + <panel name="first_life_image_panel"> + <text name="real_world_photo_title_text" value="Mundo real:"/> + </panel> + <icon label="" name="real_world_edit_icon" tool_tip="Pulsa para elegir una imagen"/> + <text name="title_homepage_text"> + Web: + </text> + <check_box label="Mostrarme en los resultados de la búsqueda" name="show_in_search_checkbox"/> + <text name="title_acc_status_text" value="Mi cuenta:"/> + <text_editor name="acc_status_text" value="Residente. No ha aportado información de pago."/> + <text name="my_account_link" value="[[URL] Ir a mi Panel de Control]"/> + <text name="title_partner_text" value="Mi compañero/a:"/> + <panel name="partner_data_panel"> + <name_box initial_value="(obteniendo)" name="partner_text"/> + </panel> + <text name="partner_edit_link" value="[[URL] Editar]"/> + </panel> + </panel> + </scroll_container> + <panel name="profile_me_buttons_panel"> + <button label="Guardar cambios" name="save_btn"/> + <button label="Cancelar" name="cancel_btn"/> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/es/panel_edit_shape.xml b/indra/newview/skins/default/xui/es/panel_edit_shape.xml new file mode 100644 index 0000000000..368be35ed9 --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_edit_shape.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="edit_shape_panel"> + <string name="meters"> + Metros + </string> + <string name="feet"> + Pies + </string> + <string name="height"> + Altura: + </string> + <text name="avatar_height"/> + <panel label="Camisa" name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="shape_body_tab" title="Cuerpo"/> + <accordion_tab name="shape_head_tab" title="Cabeza"/> + <accordion_tab name="shape_eyes_tab" title="Ojos"/> + <accordion_tab name="shape_ears_tab" title="Orejas"/> + <accordion_tab name="shape_nose_tab" title="Nariz"/> + <accordion_tab name="shape_mouth_tab" title="Boca"/> + <accordion_tab name="shape_chin_tab" title="Barbilla"/> + <accordion_tab name="shape_torso_tab" title="Torso"/> + <accordion_tab name="shape_legs_tab" title="Piernas"/> + </accordion> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_edit_shirt.xml b/indra/newview/skins/default/xui/es/panel_edit_shirt.xml new file mode 100644 index 0000000000..f763e1b18d --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_edit_shirt.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="edit_shirt_panel"> + <panel name="avatar_shirt_color_panel"> + <texture_picker label="Tela" name="Fabric" tool_tip="Pulsa para elegir una imagen"/> + <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/> + </panel> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="shirt_main_tab" title="Camisa"/> + </accordion> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_edit_shoes.xml b/indra/newview/skins/default/xui/es/panel_edit_shoes.xml new file mode 100644 index 0000000000..70f2027398 --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_edit_shoes.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="edit_shoes_panel"> + <panel name="avatar_shoes_color_panel"> + <texture_picker label="Tela" name="Fabric" tool_tip="Pulsa para elegir una imagen"/> + <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/> + </panel> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="shoes_main_tab" title="Zapatos"/> + </accordion> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_edit_skin.xml b/indra/newview/skins/default/xui/es/panel_edit_skin.xml new file mode 100644 index 0000000000..501ecfb4de --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_edit_skin.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="edit_skin_panel"> + <panel name="avatar_skin_color_panel"> + <texture_picker label="Tatuajes de la cabeza" name="Head Tattoos" tool_tip="Pulsa para elegir una imagen"/> + <texture_picker label="Tatuajes superiores" name="Upper Tattoos" tool_tip="Pulsa para elegir una imagen"/> + <texture_picker label="Tatuajes inferiores" name="Lower Tattoos" tool_tip="Pulsa para elegir una imagen"/> + </panel> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="skin_color_tab" title="Color de la piel"/> + <accordion_tab name="skin_face_tab" title="Detalles faciales"/> + <accordion_tab name="skin_makeup_tab" title="Maquillaje"/> + <accordion_tab name="skin_body_tab" title="Detalles del cuerpo"/> + </accordion> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_edit_skirt.xml b/indra/newview/skins/default/xui/es/panel_edit_skirt.xml new file mode 100644 index 0000000000..2c7196642c --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_edit_skirt.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="edit_skirt_panel"> + <panel name="avatar_skirt_color_panel"> + <texture_picker label="Tela" name="Fabric" tool_tip="Pulsa para elegir una imagen"/> + <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/> + </panel> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="skirt_main_tab" title="Falda"/> + </accordion> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_edit_socks.xml b/indra/newview/skins/default/xui/es/panel_edit_socks.xml new file mode 100644 index 0000000000..28423eaf61 --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_edit_socks.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="edit_socks_panel"> + <panel name="avatar_socks_color_panel"> + <texture_picker label="Tela" name="Fabric" tool_tip="Pulsa para elegir una imagen"/> + <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/> + </panel> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="socks_main_tab" title="Calcetines"/> + </accordion> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_edit_tattoo.xml b/indra/newview/skins/default/xui/es/panel_edit_tattoo.xml new file mode 100644 index 0000000000..8776dd6c10 --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_edit_tattoo.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="edit_tattoo_panel"> + <panel name="avatar_tattoo_color_panel"> + <texture_picker label="Tatuaje de la cabeza" name="Head Tattoo" tool_tip="Pulsa para elegir una imagen"/> + <texture_picker label="Tatuaje superior" name="Upper Tattoo" tool_tip="Pulsa para elegir una imagen"/> + <texture_picker label="Tatuaje inferior" name="Lower Tattoo" tool_tip="Pulsa para elegir una imagen"/> + <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_edit_underpants.xml b/indra/newview/skins/default/xui/es/panel_edit_underpants.xml new file mode 100644 index 0000000000..6c82bcfedf --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_edit_underpants.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="edit_underpants_panel"> + <panel name="avatar_underpants_color_panel"> + <texture_picker label="Tela" name="Fabric" tool_tip="Pulsa para elegir una imagen"/> + <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/> + </panel> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="underpants_main_tab" title="Ropa interior"/> + </accordion> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_edit_undershirt.xml b/indra/newview/skins/default/xui/es/panel_edit_undershirt.xml new file mode 100644 index 0000000000..412bdceddf --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_edit_undershirt.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="edit_undershirt_panel"> + <panel name="avatar_undershirt_color_panel"> + <texture_picker label="Tela" name="Fabric" tool_tip="Pulsa para elegir una imagen"/> + <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/> + </panel> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="undershirt_main_tab" title="Camiseta"/> + </accordion> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_edit_wearable.xml b/indra/newview/skins/default/xui/es/panel_edit_wearable.xml new file mode 100644 index 0000000000..176f122dc4 --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_edit_wearable.xml @@ -0,0 +1,107 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Se puede poner" name="panel_edit_wearable"> + <string name="edit_shape_title"> + Modificando la anatomÃa + </string> + <string name="edit_skin_title"> + Modificando la piel + </string> + <string name="edit_hair_title"> + Modificando el pelo + </string> + <string name="edit_eyes_title"> + Modificando los ojos + </string> + <string name="edit_shirt_title"> + Modificando la camisa + </string> + <string name="edit_pants_title"> + Modificando los pantalones + </string> + <string name="edit_shoes_title"> + Modificando los zapatos + </string> + <string name="edit_socks_title"> + Modificando los calcetines + </string> + <string name="edit_jacket_title"> + Modificando la chaqueta + </string> + <string name="edit_skirt_title"> + Modificando la falda + </string> + <string name="edit_gloves_title"> + Modificando los guantes + </string> + <string name="edit_undershirt_title"> + Modificando la camiseta + </string> + <string name="edit_underpants_title"> + Modificando la ropa interior + </string> + <string name="edit_alpha_title"> + Modificando la capa Alfa + </string> + <string name="edit_tattoo_title"> + Modificando los tatuajes + </string> + <string name="shape_desc_text"> + AnatomÃa: + </string> + <string name="skin_desc_text"> + Piel: + </string> + <string name="hair_desc_text"> + Pelo: + </string> + <string name="eyes_desc_text"> + Ojos: + </string> + <string name="shirt_desc_text"> + Camisa: + </string> + <string name="pants_desc_text"> + Pantalones: + </string> + <string name="shoes_desc_text"> + Zapatos: + </string> + <string name="socks_desc_text"> + Calcetines: + </string> + <string name="jacket_desc_text"> + Chaqueta: + </string> + <string name="skirt_desc_text"> + Falda: + </string> + <string name="gloves_desc_text"> + Guantes: + </string> + <string name="undershirt_desc_text"> + Camiseta: + </string> + <string name="underpants_desc_text"> + Ropa interior: + </string> + <string name="alpha_desc_text"> + Capa alfa: + </string> + <string name="tattoo_desc_text"> + Tatuaje: + </string> + <text name="edit_wearable_title" value="Modificando la anatomÃa"/> + <panel label="Camisa" name="wearable_type_panel"> + <text name="description_text" value="AnatomÃa:"/> + <radio_group name="sex_radio"> + <radio_item label="" name="sex_male" tool_tip="Varón" value="1"/> + <radio_item label="" name="sex_female" tool_tip="Mujer" value="0"/> + </radio_group> + <icon name="male_icon" tool_tip="Varón"/> + <icon name="female_icon" tool_tip="Mujer"/> + </panel> + <panel name="button_panel"> + <button label="Guardar como" name="save_as_button"/> + <button label="Revertir" name="revert_button"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_friends.xml b/indra/newview/skins/default/xui/es/panel_friends.xml index ea5c7d1e4f..e1cac7c2c3 100644 --- a/indra/newview/skins/default/xui/es/panel_friends.xml +++ b/indra/newview/skins/default/xui/es/panel_friends.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="friends"> <string name="Multiple"> - Varios amigos... + Varios amigos </string> <scroll_list name="friend_list" tool_tip="Para seleccionar a varios amigos, mantenga pulsado Ctrl o Mays. mientras les va pulsando."> <column name="icon_online_status" tool_tip="Estado de conexión"/> @@ -13,8 +13,8 @@ </scroll_list> <button label="MI/Llamada" name="im_btn" tool_tip="Abrir sesión de mensajes instantáneos"/> <button label="Perfil" name="profile_btn" tool_tip="Mostrar la imagen, los grupos, y otra información"/> - <button label="Teleportar..." name="offer_teleport_btn" tool_tip="Ofrecer a este amigo teleportarle hasta su posición"/> - <button label="Pagar..." name="pay_btn" tool_tip="Dar dólares Linden (L$) a este amigo"/> - <button label="Quitar..." name="remove_btn" tool_tip="Quitar a esta persona de su lista de amigos"/> - <button label="Añadir..." name="add_btn" tool_tip="Ofrecer ser mi amigo a un residente"/> + <button label="Teleporte" name="offer_teleport_btn" tool_tip="Ofrecer a este amigo teleportarle hasta su posición"/> + <button label="Pagar" name="pay_btn" tool_tip="Dar dólares Linden (L$) a este amigo"/> + <button label="Quitar" name="remove_btn" tool_tip="Quitar a esta persona de su lista de amigos"/> + <button label="Añadir" name="add_btn" tool_tip="Ofrecer amistad a un Residente"/> </panel> diff --git a/indra/newview/skins/default/xui/es/panel_group_control_panel.xml b/indra/newview/skins/default/xui/es/panel_group_control_panel.xml new file mode 100644 index 0000000000..b398293175 --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_group_control_panel.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_im_control_panel"> + <layout_stack name="vertical_stack"> + <layout_panel name="group_info_btn_panel"> + <button label="Perfil del grupo" name="group_info_btn"/> + </layout_panel> + <layout_panel name="call_btn_panel"> + <button label="Llamar al grupo" name="call_btn"/> + </layout_panel> + <layout_panel name="end_call_btn_panel"> + <button label="Colgar" name="end_call_btn"/> + </layout_panel> + <layout_panel name="voice_ctrls_btn_panel"> + <button label="Abrir los controles de la voz" name="voice_ctrls_btn"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_group_general.xml b/indra/newview/skins/default/xui/es/panel_group_general.xml index 4fd5685b7d..c4f17ab6dc 100644 --- a/indra/newview/skins/default/xui/es/panel_group_general.xml +++ b/indra/newview/skins/default/xui/es/panel_group_general.xml @@ -1,72 +1,58 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="General" name="general_tab"> - <string name="help_text"> - La pestaña General contiene información global de este grupo, la lista de propietarios y miembros visibles, las preferencias generales del grupo, y las opciones de los miembros. + <panel.string name="help_text"> + La pestaña General tiene información general de este grupo, una lista de sus miembros, las preferencias generales del grupo y las opciones de sus miembros. -Ponga su ratón sobre las opciones para más información. - </string> - <string name="group_info_unchanged"> - La información general del grupo ha cambiado. - </string> - <button label="?" label_selected="?" name="help_button"/> - <line_editor label="Escriba aquà el nombre de su nuevo grupo" name="group_name_editor"/> - <text name="group_name"> - Escriba aquà el nombre de su nuevo grupo - </text> - <text name="prepend_founded_by"> - Creado por - </text> - <text name="founder_name"> - (esperando) - </text> - <text name="group_charter_label"> - Carta del grupo - </text> - <texture_picker label="Emblema del grupo" name="insignia" tool_tip="Pulse para elegir una imagen"/> +Deja el cursor sobre las opciones para ver más ayuda. + </panel.string> + <panel.string name="group_info_unchanged"> + Ha cambiado la información general del grupo + </panel.string> + <panel.string name="incomplete_member_data_str"> + Recuperando los datos de los miembros + </panel.string> + <panel name="group_info_top"> + <texture_picker label="" name="insignia" tool_tip="Pulsa para elegir una imagen"/> + <text name="prepend_founded_by"> + Fundador: + </text> + <name_box initial_value="(obteniendo)" name="founder_name"/> + <text name="join_cost_text"> + Gratis + </text> + <button label="¡ENTRA AHORA!" name="btn_join"/> + </panel> <text_editor name="charter"> Carta del grupo </text_editor> - <button label="Entrar (0 L$)" label_selected="Entrar (0 L$)" name="join_button"/> - <button label="Ver en detalle" label_selected="Ver en detalle" name="info_button"/> - <text name="text_owners_and_visible_members"> - Propietarios y Miembros visibles - </text> - <text name="text_owners_are_shown_in_bold"> - (los propietarios aparecen en negrilla) - </text> <name_list name="visible_members"> - <name_list.columns label="Nombre del miembro" name="name" relwidth="0.40"/> + <name_list.columns label="Miembro" name="name" relwidth="0.40"/> <name_list.columns label="Etiqueta" name="title" relwidth="0.25"/> - <name_list.columns label="Última conexión" name="online" relwidth="0.35"/> + <name_list.columns label="Estado" name="status"/> </name_list> - <text name="text_group_preferences"> - Preferencias del grupo + <text name="my_group_settngs_label"> + Yo </text> + <text name="active_title_label"> + Mi etiqueta: + </text> + <combo_box name="active_title" tool_tip="Configura la etiqueta que se verá sobre el nombre de tu avatar cuando tengas activo este grupo."/> + <check_box label="Recibir los avisos del grupo" name="receive_notices" tool_tip="Configura si quieres recibir avisos del grupo. Desmárcalo si este grupo te envÃa 'spam'."/> + <check_box label="Mostrarlo en mi perfil" name="list_groups_in_profile" tool_tip="Configura si quieres que este grupo se vea en tu perfil"/> <panel name="preferences_container"> - <check_box label="Mostrar en la búsqueda" name="show_in_group_list" tool_tip="Dejar que la gente vea este grupo en los resultados de la búsqueda."/> - <check_box label="Inscripción libre" name="open_enrollement" tool_tip="Definir si se admiten al grupo nuevos miembros sin que sea preciso invitárseles."/> - <check_box label="Cuota de inscripción:" name="check_enrollment_fee" tool_tip="Define si se requiere una cuota para entrar al grupo."/> - <spinner width="60" left_delta="130" name="spin_enrollment_fee" tool_tip="Cuando está marcado 'Cuota de inscripción', los miembros nuevos deben pagar esta cuota para entrar al grupo."/> - <combo_box bottom_delta="-38" width="150" name="group_mature_check" tool_tip="Establece si la información de su grupo es 'mature'."> - <combo_box.item name="select_mature" label="- Elegir Calificación -"/> - <combo_box.item name="mature" label="Contenido 'Mature'"/> - <combo_box.item name="pg" label="Contenido 'PG'"/> + <text name="group_settngs_label"> + Grupo + </text> + <check_box label="Cualquiera puede entrar" name="open_enrollement" tool_tip="Configura si se permite la entrada de nuevos miembros sin ser invitados."/> + <check_box label="Cuota de entrada" name="check_enrollment_fee" tool_tip="Configura si hay que pagar una cuota para entrar al grupo"/> + <spinner label="L$" left_delta="130" name="spin_enrollment_fee" tool_tip="Si la opción Cuota de entrada está marcada, los nuevos miembros han de pagar esta cuota para entrar al grupo." width="60"/> + <combo_box bottom_delta="-38" name="group_mature_check" tool_tip="Establece si la información de su grupo es 'mature'." width="150"> + <combo_item name="select_mature"> + - Elige la Calificación - + </combo_item> + <combo_box.item label="Contenido 'Mature'" name="mature"/> + <combo_box.item label="Contenido 'PG'" name="pg"/> </combo_box> - <panel name="title_container"> - <text name="active_title_label"> - Mi etiqueta activa - </text> - <combo_box name="active_title" tool_tip="Define la etiqueta que aparecerá sobre el nombre de su avatar cuando tenga activo este grupo."/> - </panel> - <check_box label="Recibir los avisos del grupo" name="receive_notices" tool_tip="Define si quiere recibir avisos de este grupo. Desmarque esto si el grupo le envÃa spam."/> - <check_box label="Mostrar el grupo en mi perfil" name="list_groups_in_profile" tool_tip="Define si quiere que este grupo aparezca en su perfil."/> + <check_box initial_value="true" label="Mostrar en la búsqueda" name="show_in_group_list" tool_tip="Permite que la gente vea este grupo en los resultados de la búsqueda"/> </panel> - <string name="incomplete_member_data_str"> - Recuperando los datos de los miembros - </string> - <string name="confirm_group_create_str"> - Crear este grupo cuesta 100 L$. -¿Está plena, absoluta, y TOTALMENTE seguro de que quiere gastarse 100 L$ para crear este grupo? -Queda avisado de que si, en un plazo de 48 horas, no entra nadie al grupo, éste será disuelto, y el nombre no se podrá usar en el futuro. - </string> </panel> diff --git a/indra/newview/skins/default/xui/es/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/es/panel_group_info_sidetray.xml new file mode 100644 index 0000000000..872dfb13d7 --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_group_info_sidetray.xml @@ -0,0 +1,35 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Perfil del grupo" name="GroupInfo"> + <panel.string name="default_needs_apply_text"> + Hay cambios sin guardar + </panel.string> + <panel.string name="want_apply_text"> + ¿Quieres guardar estos cambios? + </panel.string> + <panel.string name="group_join_btn"> + Entrar ([AMOUNT] L$) + </panel.string> + <panel.string name="group_join_free"> + Gratis + </panel.string> + <panel name="group_info_top"> + <text name="group_name" value="(Cargando...)"/> + <line_editor label="Escribe aquà el nombre de tu nuevo grupo" name="group_name_editor"/> + </panel> + <layout_stack name="layout"> + <layout_panel name="group_accordions"> + <accordion name="groups_accordion"> + <accordion_tab name="group_general_tab" title="General"/> + <accordion_tab name="group_roles_tab" title="Roles"/> + <accordion_tab name="group_notices_tab" title="Avisos"/> + <accordion_tab name="group_land_tab" title="Terreno/Bienes"/> + </accordion> + </layout_panel> + <layout_panel name="button_row"> + <button label="Chat" name="btn_chat"/> + <button label="Llamar al grupo" name="btn_call" tool_tip="Llama a este grupo"/> + <button label="Guardar" label_selected="Guardar" name="btn_apply"/> + <button label="Crear un grupo" name="btn_create" tool_tip="Crea un grupo nuevo"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_group_invite.xml b/indra/newview/skins/default/xui/es/panel_group_invite.xml index f66f0c473a..0d877f78f2 100644 --- a/indra/newview/skins/default/xui/es/panel_group_invite.xml +++ b/indra/newview/skins/default/xui/es/panel_group_invite.xml @@ -1,24 +1,27 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Invitar a un miembro" name="invite_panel" width="224"> - <text name="help_text" height="72" bottom_delta="-96" width="214"> - Puede seleccionar a varios residentes -para invitarles a su grupo. Para -empezar, pulse 'Abrir el selector de -residentes'. + <panel.string name="confirm_invite_owner_str"> + ¿Está seguro de que quiere invitar a un nuevo propietario/s? ¡Esta acción es permanente! + </panel.string> + <panel.string name="loading"> + (cargando...) + </panel.string> + <panel.string name="already_in_group"> + Alguno de los Residentes que has elegido ya están en el grupo: no se les enviará la invitación. + </panel.string> + <text bottom_delta="-96" height="72" name="help_text" width="214"> + Puedes elegir a varios Residentes para invitarles a tu grupo. Para empezar, pulsa 'Abrir el selector de residentes'. </text> <button bottom_delta="-10" label="Abrir el selector de residentes" name="add_button" tool_tip=""/> - <name_list height="156" bottom_delta="-160" name="invitee_list" tool_tip="Para seleccionar a varios residentes, mantenga pulsada la tecla Ctrl y vaya pulsando sus nombres."/> - <button left_delta="-7" width="214" label="Eliminar de la lista a los seleccionados" name="remove_button" tool_tip="Elimina los residentes seleccionados de la lista de invitaciones."/> + <name_list bottom_delta="-160" height="156" name="invitee_list" tool_tip="Para seleccionar a varios residentes, ve pulsando sus nombres mientras mantienes apretada la tecla Ctrl"/> + <button label="Eliminar de la lista a los seleccionados" left_delta="-7" name="remove_button" tool_tip="Quitar de la lista a los Residentes seleccionados arriba" width="214"/> <text name="role_text"> Elegir qué rol asignarles: </text> - <combo_box name="role_name" tool_tip="Elige de la lista de roles cuál asignar a los miembros."/> + <combo_box name="role_name" tool_tip="Elige el rol de entre la lista de aquellos que estás autorizado a asignar"/> <button label="Enviar las invitaciones" name="ok_button"/> <button label="Cancelar" name="cancel_button"/> - <string name="confirm_invite_owner_str"> - ¿Está seguro de que quiere invitar a un nuevo propietario/s? ¡Esta acción es permanente! - </string> - <string name="loading"> - (cargando...) + <string name="GroupInvitation"> + Invitar al grupo </string> </panel> diff --git a/indra/newview/skins/default/xui/es/panel_group_land_money.xml b/indra/newview/skins/default/xui/es/panel_group_land_money.xml index bccc114624..f307126b03 100644 --- a/indra/newview/skins/default/xui/es/panel_group_land_money.xml +++ b/indra/newview/skins/default/xui/es/panel_group_land_money.xml @@ -1,85 +1,84 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Terreno y L$" name="land_money_tab"> - <string name="help_text"> - Se listan las parcelas propiedad del grupo, detallando las contribuciones. Aparece una advertencia si el Terreno total en uso es menor que o igual a la Contribución total. Las pestañas 'Planificación', 'Detalles' y 'Ventas' aportan información sobre las finanzas del grupo - </string> - <button label="?" name="help_button"/> - <string name="cant_view_group_land_text"> - No tiene permiso para ver qué terreno posee el grupo. - </string> - <string name="cant_view_group_accounting_text"> - No tiene permiso para ver la información de la cuenta del grupo. - </string> - <string name="loading_txt"> + <panel.string name="help_text"> + Aparece una advertencia si el Terreno total en uso es menor que o igual a la Contribución total. + </panel.string> + <panel.string name="cant_view_group_land_text"> + No tienes permiso para ver el terreno propiedad del grupo + </panel.string> + <panel.string name="epmty_view_group_land_text"> + No hay entradas + </panel.string> + <panel.string name="cant_view_group_accounting_text"> + No tienes permiso para ver la información de la cuenta del grupo. + </panel.string> + <panel.string name="loading_txt"> Cargando... - </string> - <text name="group_land_heading" width="250"> - Terreno propiedad del grupo - </text> - <scroll_list name="group_parcel_list"> - <column label="Parcela" name="name" width="100"/> - <column label="Región" name="location" width="100"/> - <column label="Tipo" name="type" width="100"/> - <column label="Superficie" name="area" width="81"/> - <column label="" name="hidden"/> - </scroll_list> - <button label="Mostrar en el mapa" label_selected="Mostrar en el mapa" name="map_button" left="282" width="130"/> - <text name="total_contributed_land_label"> - Contribución total: - </text> - <text name="total_contributed_land_value"> - [AREA] m² - </text> - <text name="total_land_in_use_label"> - Terreno total en uso: - </text> - <text name="total_land_in_use_value"> - [AREA] m² - </text> - <text name="land_available_label"> - Terreno disponible: - </text> - <text name="land_available_value"> - [AREA] m² - </text> - <text name="your_contribution_label"> - Su contribución: - </text> - <string name="land_contrib_error"> - No se ha podido defininir su contribución de terreno. - </string> - <text name="your_contribution_units"> - ( m² ) - </text> - <text name="your_contribution_max_value"> - ([AMOUNT] máx.) - </text> - <text name="group_over_limit_text"> - Los miembros del grupo deben contribuir con más créditos de terreno -para mantener el terreno en uso. - </text> - <text name="group_money_heading"> - L$ del grupo - </text> + </panel.string> + <panel.string name="land_contrib_error"> + No se ha podido definir tu contribución de terreno + </panel.string> + <panel name="layout_panel_landmoney"> + <scroll_list name="group_parcel_list"> + <scroll_list.columns label="Parcela" name="name"/> + <scroll_list.columns label="Región" name="location"/> + <scroll_list.columns label="Tipo" name="type"/> + <scroll_list.columns label="Ãrea" name="area"/> + </scroll_list> + <text name="total_contributed_land_label"> + Contribución total: + </text> + <text name="total_contributed_land_value"> + [AREA] m² + </text> + <button label="Mapa" label_selected="Mapa" name="map_button"/> + <text name="total_land_in_use_label"> + Terreno total en uso: + </text> + <text name="total_land_in_use_value"> + [AREA] m² + </text> + <text name="land_available_label"> + Terreno disponible: + </text> + <text name="land_available_value"> + [AREA] m² + </text> + <text name="your_contribution_label"> + Tu contribución: + </text> + <text name="your_contribution_units"> + m² + </text> + <text name="your_contribution_max_value"> + ([AMOUNT] máx.) + </text> + <text name="group_over_limit_text"> + Se necesitan más créditos de terreno para mantener el terreno en uso + </text> + <text name="group_money_heading"> + L$ del grupo + </text> + </panel> <tab_container name="group_money_tab_container"> - <panel label="Planificación" name="group_money_planning_tab"> + <panel label="RESUMEN" name="group_money_planning_tab"> <text_editor name="group_money_planning_text"> - Calculando... + Cargando... </text_editor> </panel> - <panel label="Detalles" name="group_money_details_tab"> + <panel label="DETALLES" name="group_money_details_tab"> <text_editor name="group_money_details_text"> - Calculando... + Cargando... </text_editor> - <button label="< Antes" label_selected="< Antes" name="earlier_details_button" tool_tip="Ir hacia atrás en el tiempo"/> - <button label="Después >" label_selected="Después >" name="later_details_button" tool_tip="Ir hacia adelante en el tiempo"/> + <button label="< Antes" label_selected="< Antes" name="earlier_details_button" tool_tip="Anterior"/> + <button label="Después >" label_selected="Después >" name="later_details_button" tool_tip="Siguiente"/> </panel> - <panel label="Ventas" name="group_money_sales_tab"> + <panel label="VENTAS" name="group_money_sales_tab"> <text_editor name="group_money_sales_text"> - Calculando... + Cargando... </text_editor> - <button label="< Antes" label_selected="< Antes" name="earlier_sales_button" tool_tip="Ir hacia atrás en el tiempo"/> - <button label="Después >" label_selected="Después >" name="later_sales_button" tool_tip="Ir hacia adelante en el tiempo"/> + <button label="< Antes" label_selected="< Antes" name="earlier_sales_button" tool_tip="Anterior"/> + <button label="Después >" label_selected="Después >" name="later_sales_button" tool_tip="Siguiente"/> </panel> </tab_container> </panel> diff --git a/indra/newview/skins/default/xui/es/panel_group_list_item.xml b/indra/newview/skins/default/xui/es/panel_group_list_item.xml new file mode 100644 index 0000000000..5c9f1c3688 --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_group_list_item.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="group_list_item"> + <text name="group_name" value="Desconocido"/> + <button name="profile_btn" tool_tip="Ver el perfil"/> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_group_notices.xml b/indra/newview/skins/default/xui/es/panel_group_notices.xml index c6788b3a65..7a3dbad59e 100644 --- a/indra/newview/skins/default/xui/es/panel_group_notices.xml +++ b/indra/newview/skins/default/xui/es/panel_group_notices.xml @@ -1,35 +1,29 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Avisos" name="notices_tab"> - <text name="help_text"> + <panel.string name="help_text"> Los avisos son una forma rápida de comunicación dentro de un grupo, difundiendo un mensaje y, si se quiere, añadiéndole un Ãtem. Los avisos sólo los reciben los miembros del grupo cuyo rol tiene adjudicada tal habilidad. Puede desactivar los avisos en la pestaña General. - </text> - <text name="no_notices_text"> - No hay avisos pasados. - </text> - <button label="?" label_selected="?" name="help_button"/> - <text name="lbl"> - Archivo de avisos del grupo - </text> + </panel.string> + <panel.string name="no_notices_text"> + No hay avisos pasados + </panel.string> <text name="lbl2"> - Los avisos se mantienen durante 14 dÃas. Las listas de avisos tienen un lÃmite de 200 avisos por dÃa. + Los avisos se mantienen durante 14 dÃas. +El máximo es de 200 por dÃa y grupo. </text> <scroll_list name="notice_list"> - <column label="Asunto" name="subject"/> - <column label="De" name="from"/> - <column label="Fecha" name="date"/> + <scroll_list.columns label="Asunto" name="subject"/> + <scroll_list.columns label="De" name="from"/> + <scroll_list.columns label="Fecha" name="date"/> </scroll_list> <text name="notice_list_none_found"> - No se han encontrado. + No se han encontrado </text> - <button label="Crear un aviso nuevo" label_selected="Crear un aviso nuevo" name="create_new_notice"/> - <button label="Actualizar" label_selected="Actualizar la lista" name="refresh_notices"/> + <button label="Crear un aviso nuevo" label_selected="Crear un aviso nuevo" name="create_new_notice" tool_tip="Crear un aviso nuevo"/> + <button label="Actualizar" label_selected="Actualizar la lista" name="refresh_notices" tool_tip="Actualizar la lista de avisos"/> <panel label="Crear un aviso nuevo" name="panel_create_new_notice"> <text name="lbl"> Crear un aviso </text> - <text name="lbl2"> - Puede añadir un Ãtem al aviso arrastrándolo desde su inventario a este panel. Los Ãtems anexados deben ser copiables y transferibles, y no se puede enviar una carpeta. - </text> <text name="lbl3"> Asunto: </text> @@ -39,16 +33,20 @@ <text name="lbl5"> Anexar: </text> - <button label="Remover lo anexado" label_selected="Remover lo anexado" name="remove_attachment"/> + <text name="string"> + Arrastra y suelta aquà un Ãtem para adjuntarlo: + </text> + <button label="Inventario" name="open_inventory" tool_tip="Abrir inventario"/> + <button label="Quitar" label_selected="Remover lo anexado" name="remove_attachment" tool_tip="Quita el adjunto de tu aviso"/> <button label="Enviar" label_selected="Enviar" name="send_notice"/> - <panel name="drop_target" tool_tip="Para enviar un Ãtem con el aviso, arrástrelo desde su inventario hasta el cuadro del mensaje. Para poder enviar ese objeto con el aviso, usted debe tener permiso para copiarlo y transferirlo."/> + <group_drop_target name="drop_target" tool_tip="Para enviar un Ãtem con el aviso, arrástralo desde tu inventario hasta este cajetÃn. Para poder adjuntarlo, debes tener permiso para copiarlo y transferirlo."/> </panel> <panel label="Ver avisos pasados" name="panel_view_past_notice"> <text name="lbl"> Avisos archivados </text> <text name="lbl2"> - Pulse el botón 'Crear un aviso nuevo' para enviar uno nuevo. + Para enviar un aviso nuevo, pulsa el botón + </text> <text name="lbl3"> Asunto: @@ -56,6 +54,6 @@ <text name="lbl4"> Mensaje: </text> - <button label="Abrir lo anexado" label_selected="Abrir lo anexado" name="open_attachment"/> + <button label="Abrir el adjunto" label_selected="Abrir lo anexado" name="open_attachment"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/es/panel_group_notify.xml b/indra/newview/skins/default/xui/es/panel_group_notify.xml new file mode 100644 index 0000000000..7bdacbd1e0 --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_group_notify.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="instant_message" name="panel_group_notify"> + <panel label="header" name="header"> + <text name="title" value="Nombre del emisor / Nombre del grupo"/> + </panel> + <text name="attachment" value="Adjunto"/> + <button label="OK" name="btn_ok"/> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_group_roles.xml b/indra/newview/skins/default/xui/es/panel_group_roles.xml index 2739a3da5e..5ef81162bc 100644 --- a/indra/newview/skins/default/xui/es/panel_group_roles.xml +++ b/indra/newview/skins/default/xui/es/panel_group_roles.xml @@ -1,158 +1,119 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Miembros y Roles" name="roles_tab"> - <string name="default_needs_apply_text"> - En esta pestaña hay cambios sin aplicar. - </string> - <string name="want_apply_text"> - ¿Quiere aplicar estos cambios? - </string> - <button label="?" name="help_button"/> - <panel name="members_header"> - <text name="static"> - Miembros y Roles - </text> - <text name="static2"> - Los miembros del grupo tienen asignados roles con distintas capacidades. -Estas configuraciones son fácilmente personalizables, para facilitar una -mayor flexibilidad y organización. - </text> - </panel> - <panel name="roles_header"> - <text name="static"> - Roles - </text> - <text name="role_properties_modifiable"> - Elija un rol de los de abajo. Puede modificar su nombre, su -descripción, y la etiqueta de los miembros. - </text> - <text name="role_properties_not_modifiable"> - Elija un rol de los de abajo para ver sus propiedades, miembros, y qué -capacidades tiene asignadas. - </text> - <text bottom_delta="-28" name="role_actions_modifiable"> - También puede asignar capacidades al rol. - </text> - <text name="role_actions_not_modifiable"> - Puede ver, pero no modificar, las capacidades asignadas. - </text> - </panel> - <panel name="actions_header"> - <text name="static"> - Capacidades - </text> - <text name="static2"> - Puede ver una descripción de la capacidad, y qué miembros y roles pueden -realizarla. - </text> - </panel> - <tab_container height="164" name="roles_tab_container"> - <panel height="148" label="Miembros" name="members_sub_tab" tool_tip="Miembros"> - <line_editor bottom="127" name="search_text"/> - <button label="Buscar" name="search_button" width="75"/> - <button label="Verlos todos" name="show_all_button" left_delta="80"/> - <name_list name="member_list" bottom_delta="-105" height="104" > - <column label="Nombre del miembro" name="name"/> - <column label="Cuotas donadas" name="donated"/> - <column label="Última conexión" name="online"/> - </name_list> - <button label="Invitar a un nuevo miembro..." name="member_invite" width="175"/> - <button label="Expulsar del grupo" name="member_eject"/> - <string name="help_text"> + <panel.string name="default_needs_apply_text"> + Hay cambios sin guardar + </panel.string> + <panel.string name="want_apply_text"> + ¿Quieres guardar estos cambios? + </panel.string> + <tab_container name="roles_tab_container"> + <panel label="MIEMBROS" name="members_sub_tab" tool_tip="Miembros"> + <panel.string name="help_text"> Puede añadir o quitar los roles asignados a los miembros. Seleccione varios nombres manteniendo pulsada la tecla Ctrl y pulsando en cada uno de ellos. - </string> + </panel.string> + <filter_editor label="Filtrar los miembros" name="filter_input"/> + <name_list name="member_list"> + <name_list.columns label="Miembro" name="name"/> + <name_list.columns label="Donaciones" name="donated"/> + <name_list.columns label="Estatus" name="online"/> + </name_list> + <button label="Invitar" name="member_invite"/> + <button label="Expulsar" name="member_eject"/> </panel> - <panel height="148" label="Roles" name="roles_sub_tab"> - <line_editor bottom="127" name="search_text"/> - <button label="Buscar" name="search_button" width="75"/> - <button label="Verlos todos" name="show_all_button" left_delta="80"/> - <scroll_list name="role_list" bottom_delta="-104" height="104"> - <column label="Nombre del rol" name="name"/> - <column label="Etiqueta" name="title"/> - <column label="Miembros" name="members"/> + <panel label="ROLES" name="roles_sub_tab"> + <panel.string name="help_text"> + Los roles tienen una etiqueta propia y unas capacidades que se +permiten ejercer a sus miembros. Los miembros pueden +tener más de un rol. Un grupo puede tener hasta 10 roles, +incluyendo el de Todos y el de Propietarios. + </panel.string> + <panel.string name="cant_delete_role"> + Los roles de 'Todos' y 'Propietarios' son especiales, y no pueden eliminarse. + </panel.string> + <panel.string name="power_folder_icon"> + Inv_FolderClosed + </panel.string> + <filter_editor label="Filtrar los roles" name="filter_input"/> + <scroll_list name="role_list"> + <scroll_list.columns label="Rol" name="name"/> + <scroll_list.columns label="Etiqueta" name="title"/> + <scroll_list.columns label="#" name="members"/> </scroll_list> - <button label="Crear un rol nuevo..." name="role_create"/> + <button label="Añadir un rol" name="role_create"/> <button label="Eliminar el rol" name="role_delete"/> - <string name="help_text"> - Los roles tienen una etiqueta y una serie de capacidades permitidas que los miembros pueden desarrollar. Los miembros pueden tener más de un rol. Un grupo puede tener hasta 10 roles, incluyendo el de Todos y el de Propietarios. - </string> - <string name="cant_delete_role"> - Los roles de 'Todos' y 'Propietarios' son especiales, y no pueden eliminarse. - </string> </panel> - <panel height="148" label="Capacidades" name="actions_sub_tab"> - <line_editor bottom="127" name="search_text"/> - <button label="Buscar" name="search_button" width="75"/> - <button label="Verlos todos" name="show_all_button" left_delta="80"/> - <scroll_list bottom_delta="-120" height="118" name="action_list" tool_tip="Elija una capacidad para verla más en detalle."> - <column label="" name="icon"/> - <column label="" name="action"/> - </scroll_list> - <string name="help_text"> + <panel height="148" label="CAPACIDADES" name="actions_sub_tab" tool_tip="Puedes ver una descripción de la capacidad y qué miembros y roles la tienen."> + <panel.string name="help_text"> Las capacidades permiten a los miembros que tienen ese rol el hacer tareas especÃficas dentro de este grupo. Hay una gran variedad de capacidades. - </string> + </panel.string> + <filter_editor label="Filtrar las capacidades" name="filter_input"/> + <scroll_list bottom_delta="-120" height="118" name="action_list" tool_tip="Elige una capacidad para verla más en detalle"> + <scroll_list.columns label="" name="icon"/> + <scroll_list.columns label="" name="action"/> + </scroll_list> </panel> </tab_container> <panel name="members_footer"> <text name="static"> Roles asignados </text> + <scroll_list name="member_assigned_roles"> + <scroll_list.columns label="" name="checkbox"/> + <scroll_list.columns label="" name="role"/> + </scroll_list> <text name="static2"> Capacidades permitidas </text> - <scroll_list name="member_assigned_roles"> - <column label="" name="checkbox"/> - <column label="" name="role"/> - </scroll_list> - <scroll_list name="member_allowed_actions" tool_tip="Para más detalles de cada capacidad permitida, vea la pestaña Capacidades."> - <column label="" name="icon"/> - <column label="" name="action"/> + <scroll_list name="member_allowed_actions" tool_tip="Para más detalles de cada capacidad, ver la pestaña Capacidades"> + <scroll_list.columns label="" name="icon"/> + <scroll_list.columns label="" name="action"/> </scroll_list> </panel> <panel name="roles_footer"> <text name="static"> - Nombre - </text> - <text name="static2"> - Descripción + Nombre del rol </text> <line_editor name="role_name"> Empleados </line_editor> <text name="static3"> - Etiqueta + Etiqueta del rol </text> <line_editor name="role_title"> (esperando) </line_editor> + <text name="static2"> + Descripción + </text> <text_editor name="role_description"> (esperando) </text_editor> <text name="static4"> - Miembros asignados + Roles asignados </text> + <check_box label="Mostrar los miembros" name="role_visible_in_list" tool_tip="Establece si los miembros de este rol pueden ser vistos en la pestaña General por personas ajenas al grupo."/> <text name="static5" tool_tip="Una lista de las capacidades que puede desarrollar el rol seleccionado actualmente."> Capacidades asignadas </text> - <check_box label="Los miembros son visibles." name="role_visible_in_list" tool_tip="Establece si los miembros de este rol pueden ser vistos en la pestaña General por personas ajenas al grupo."/> - <scroll_list name="role_allowed_actions" tool_tip="Para más detalles de cada capacidad permitida, vea la pestaña Capacidades."> - <column label="" name="icon"/> - <column label="" name="checkbox"/> - <column label="" name="action"/> + <scroll_list name="role_allowed_actions" tool_tip="Para más detalles de cada capacidad, ver la pestaña Capacidades"> + <scroll_list.columns label="" name="icon"/> + <scroll_list.columns label="" name="checkbox"/> + <scroll_list.columns label="" name="action"/> </scroll_list> </panel> <panel name="actions_footer"> <text name="static"> - Descripción + Descripción de la capacidad </text> <text_editor name="action_description"> Esta capacidad es la de 'Expulsar miembros de este grupo'. Sólo un propietario puede expulsar a otro. </text_editor> <text name="static2"> - Roles con la capacidad + Roles con esta capacidad </text> <text name="static3"> - Miembros con la capacidad + Miembros con esta capacidad </text> </panel> </panel> diff --git a/indra/newview/skins/default/xui/es/panel_im_control_panel.xml b/indra/newview/skins/default/xui/es/panel_im_control_panel.xml new file mode 100644 index 0000000000..7d4db6a630 --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_im_control_panel.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_im_control_panel"> + <layout_stack name="button_stack"> + <layout_panel name="view_profile_btn_panel"> + <button label="Perfil" name="view_profile_btn"/> + </layout_panel> + <layout_panel name="add_friend_btn_panel"> + <button label="Añadir como amigo" name="add_friend_btn"/> + </layout_panel> + <layout_panel name="teleport_btn_panel"> + <button label="Teleportarme" name="teleport_btn" tool_tip="Ofrecer teleporte a esta persona"/> + </layout_panel> + <layout_panel name="share_btn_panel"> + <button label="Compartir" name="share_btn"/> + </layout_panel> + <layout_panel name="pay_btn_panel"> + <button label="Pagar" name="pay_btn"/> + </layout_panel> + <layout_panel name="call_btn_panel"> + <button label="Llamar" name="call_btn"/> + </layout_panel> + <layout_panel name="end_call_btn_panel"> + <button label="Colgar" name="end_call_btn"/> + </layout_panel> + <layout_panel name="voice_ctrls_btn_panel"> + <button label="Controles de la voz" name="voice_ctrls_btn"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_inventory_item.xml b/indra/newview/skins/default/xui/es/panel_inventory_item.xml new file mode 100644 index 0000000000..d18047fbcf --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_inventory_item.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="inventory_item"> + <text name="item_name" value="..."/> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_landmark_info.xml b/indra/newview/skins/default/xui/es/panel_landmark_info.xml new file mode 100644 index 0000000000..49a9f84cfe --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_landmark_info.xml @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="landmark_info"> + <string name="title_create_landmark" value="Crear un hito"/> + <string name="title_edit_landmark" value="Editar el hito"/> + <string name="title_landmark" value="Hito"/> + <string name="not_available" value="(No disp.)"/> + <string name="unknown" value="(desconocidas)"/> + <string name="public" value="(público)"/> + <string name="server_update_text"> + Los datos de este lugar no están disponibles sin una actualización del servidor. + </string> + <string name="server_error_text"> + Los datos de este lugar no están disponibles por el momento. Por favor, prueba más tarde. + </string> + <string name="server_forbidden_text"> + Por restricciones en el acceso, los datos de esta localización no están disponibles. Por favor, revisa tus permisos con el propietario de la parcela. + </string> + <string name="acquired_date"> + [wkday,datetime,local][day,datetime,local] [mth,datetime,local] [year,datetime,local][hour,datetime,local]:[min,datetime,local]:[second,datetime,local] + </string> + <button name="back_btn" tool_tip="Atrás"/> + <text name="title" value="Añadir el perfil"/> + <scroll_container name="place_scroll"> + <panel name="scrolling_panel"> + <text name="maturity_value" value="desconocido"/> + <panel name="landmark_info_panel"> + <text name="owner_label" value="Propietario:"/> + <text name="creator_label" value="Creador:"/> + <text name="created_label" value="Creado:"/> + </panel> + <panel name="landmark_edit_panel"> + <text name="title_label" value="TÃtulo:"/> + <text name="notes_label" value="Mis notas:"/> + <text name="folder_label" value="Localización del hito:"/> + </panel> + </panel> + </scroll_container> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_landmarks.xml b/indra/newview/skins/default/xui/es/panel_landmarks.xml new file mode 100644 index 0000000000..8f476403c7 --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_landmarks.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="Landmarks"> + <accordion name="landmarks_accordion"> + <accordion_tab name="tab_favorites" title="Barra de favoritos"/> + <accordion_tab name="tab_landmarks" title="Mis hitos"/> + <accordion_tab name="tab_inventory" title="Mi Inventario"/> + <accordion_tab name="tab_library" title="Biblioteca"/> + </accordion> + <panel name="bottom_panel"> + <button name="options_gear_btn" tool_tip="Ver más opciones"/> + <button name="add_btn" tool_tip="Añadir un nuevo hito"/> + <dnd_button name="trash_btn" tool_tip="Quitar el hito seleccionado"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_login.xml b/indra/newview/skins/default/xui/es/panel_login.xml index 52c3855d6a..4b45a6f7b8 100644 --- a/indra/newview/skins/default/xui/es/panel_login.xml +++ b/indra/newview/skins/default/xui/es/panel_login.xml @@ -6,34 +6,35 @@ <panel.string name="forgot_password_url"> http://secondlife.com/account/request.php?lang=es </panel.string> -<panel name="login_widgets"> - <text name="first_name_text"> - Nombre: - </text> - <text name="last_name_text"> - Apellido: - </text> - <text name="password_text"> - Contraseña: - </text> - <text name="start_location_text"> - Posición inicial: - </text> - <combo_box name="start_location_combo"> - <combo_box.item name="MyHome" label="Mi Base"/> - <combo_box.item name="MyLastLocation" label="Mi última posición"/> - <combo_box.item name="Typeregionname" label="<Escriba el nombre de la Región>"/> - </combo_box> - <check_box label="Recordar la contraseña" name="remember_check"/> - <button label="Iniciar sesión" label_selected="Iniciar sesión" name="connect_btn"/> - <text name="create_new_account_text"> - RegÃstrese para obtener una cuenta - </text> - <text name="forgot_password_text"> - ¿Olvidó su nombre o su contraseña? - </text> - <text name="channel_text"> - [VERSION] - </text> -</panel> + <layout_stack name="login_widgets"> + <layout_panel name="login"> + <text name="username_text"> + Nombre de usuario: + </text> + <line_editor label="Nombre de usuario" name="username_edit" tool_tip="Nombre de usuario de [SECOND_LIFE]"/> + <text name="password_text"> + Contraseña: + </text> + <check_box label="Recordar la contraseña" name="remember_check"/> + <button label="Iniciar sesión" name="connect_btn"/> + <text name="start_location_text"> + Empezar en: + </text> + <combo_box name="start_location_combo"> + <combo_box.item label="Mi última posición" name="MyLastLocation"/> + <combo_box.item label="Mi Base" name="MyHome"/> + </combo_box> + </layout_panel> + <layout_panel name="links"> + <text name="create_new_account_text"> + Registrarme + </text> + <text name="forgot_password_text"> + ¿Olvidaste el nombre o la contraseña? + </text> + <text name="login_help"> + ¿Necesitas ayuda para conectarte? + </text> + </layout_panel> + </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/es/panel_main_inventory.xml b/indra/newview/skins/default/xui/es/panel_main_inventory.xml new file mode 100644 index 0000000000..7e318a150b --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_main_inventory.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Cosas" name="main inventory panel"> + <panel.string name="ItemcountFetching"> + Obtenidos [ITEM_COUNT] Ãtems... [FILTER] + </panel.string> + <panel.string name="ItemcountCompleted"> + [ITEM_COUNT] Ãtems [FILTER] + </panel.string> + <text name="ItemcountText"> + Ãtems: + </text> + <filter_editor label="Filtrar" name="inventory search editor"/> + <tab_container name="inventory filter tabs"> + <inventory_panel label="Todos los Ãtems" name="All Items"/> + <recent_inventory_panel label="Ãtems recientes" name="Recent Items"/> + </tab_container> + <layout_stack name="bottom_panel"> + <layout_panel name="options_gear_btn_panel"> + <button name="options_gear_btn" tool_tip="Ver más opciones"/> + </layout_panel> + <layout_panel name="add_btn_panel"> + <button name="add_btn" tool_tip="Añadir un Ãtem nuevo"/> + </layout_panel> + <layout_panel name="trash_btn_panel"> + <dnd_button name="trash_btn" tool_tip="Quitar el Ãtem seleccionado"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_me.xml b/indra/newview/skins/default/xui/es/panel_me.xml new file mode 100644 index 0000000000..ed253904aa --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_me.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Mi perfil" name="panel_me"> + <tab_container name="tabs"> + <panel label="MI PERFIL" name="panel_profile"/> + <panel label="MIS DESTACADOS" name="panel_picks"/> + </tab_container> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_media_settings_general.xml b/indra/newview/skins/default/xui/es/panel_media_settings_general.xml new file mode 100644 index 0000000000..46326d1e8b --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_media_settings_general.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="General" name="Media Settings General"> + <text name="home_label"> + Página inicial: + </text> + <text name="home_fails_whitelist_label"> + (La Lista Blanca especificada no aprueba esta página) + </text> + <line_editor name="home_url" tool_tip="Página inicial para el origen de este media"/> + <text name="preview_label"> + Vista previa + </text> + <text name="current_url_label"> + Página actual: + </text> + <text name="current_url" tool_tip="Página actual para el origen de este media" value=""/> + <button label="Definir" name="current_url_reset_btn"/> + <check_box initial_value="false" label="Media en bucle" name="auto_loop"/> + <check_box initial_value="false" label="A la primera pulsación" name="first_click_interact"/> + <check_box initial_value="false" label="Zoom automático" name="auto_zoom"/> + <check_box initial_value="false" label="Ejecutar automáticamente los media" name="auto_play"/> + <text name="media_setting_note"> + Nota: los residentes pueden elegir una configuración distinta de ésta + </text> + <check_box initial_value="false" label="Ajustar automáticamente los media en la cara del objeto" name="auto_scale"/> + <text name="size_label"> + Tamaño: + </text> + <text name="X_label"> + X + </text> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_media_settings_permissions.xml b/indra/newview/skins/default/xui/es/panel_media_settings_permissions.xml new file mode 100644 index 0000000000..ec9edbfa15 --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_media_settings_permissions.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Personalizar" name="Media settings for controls"> + <text name="controls_label"> + Controles: + </text> + <combo_box name="controls"> + <combo_item name="Standard"> + Estándar + </combo_item> + <combo_item name="Mini"> + Mini + </combo_item> + </combo_box> + <text name="owner_label"> + Propietario + </text> + <check_box initial_value="false" label="Permitir la navegación e interactividad" name="perms_owner_interact"/> + <check_box initial_value="false" label="Mostrar la barra de control" name="perms_owner_control"/> + <text name="group_label"> + Grupo: + </text> + <check_box initial_value="false" label="Permitir la navegación e interactividad" name="perms_group_interact"/> + <check_box initial_value="false" label="Mostrar la barra de control" name="perms_group_control"/> + <text name="anyone_label"> + Cualquiera + </text> + <check_box initial_value="false" label="Permitir la navegación e interactividad" name="perms_anyone_interact"/> + <check_box initial_value="false" label="Mostrar la barra de control" name="perms_anyone_control"/> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_media_settings_security.xml b/indra/newview/skins/default/xui/es/panel_media_settings_security.xml new file mode 100644 index 0000000000..c72f562a68 --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_media_settings_security.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Seguridad" name="Media Settings Security"> + <check_box initial_value="false" label="Permitir el acceso sólo a los patrones de URL especificados" name="whitelist_enable"/> + <text name="home_url_fails_some_items_in_whitelist"> + Están marcadas las entradas que la página web no admite: + </text> + <button label="Añadir" name="whitelist_add"/> + <button label="Borrar" name="whitelist_del"/> + <text name="home_url_fails_whitelist"> + Atención: la página web especificada en la pestaña General no se admite en esta lista blanca. Se ha desactivado hasta que se añada una entrada correcta. + </text> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_my_profile.xml b/indra/newview/skins/default/xui/es/panel_my_profile.xml new file mode 100644 index 0000000000..5a6fd8b144 --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_my_profile.xml @@ -0,0 +1,35 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Perfil" name="panel_profile"> + <string name="no_partner_text" value="Ninguno/a"/> + <string name="no_group_text" value="Ninguno"/> + <string name="RegisterDateFormat"> + [REG_DATE] ([AGE]) + </string> + <layout_stack name="layout"> + <layout_panel name="profile_stack"> + <scroll_container name="profile_scroll"> + <panel name="scroll_content_panel"> + <panel name="second_life_image_panel"> + <icon label="" name="2nd_life_edit_icon" tool_tip="Pulsa el botón Editar el perfil para cambiar la imagen"/> + <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/> + </panel> + <panel name="first_life_image_panel"> + <icon label="" name="real_world_edit_icon" tool_tip="Pulsa el botón Editar el perfil para cambiar la imagen"/> + <text name="title_rw_descr_text" value="Mundo real:"/> + </panel> + <text name="title_member_text" value="Residente desde:"/> + <text name="title_acc_status_text" value="Estado de la cuenta:"/> + <text name="title_partner_text" value="Compañero/a:"/> + <panel name="partner_data_panel"> + <name_box initial_value="(obteniendo)" name="partner_text"/> + </panel> + <text name="title_groups_text" value="Grupos:"/> + </panel> + </scroll_container> + </layout_panel> + <layout_panel name="profile_me_buttons_panel"> + <button label="Editar el perfil" name="edit_profile_btn" tool_tip="Modificar tu información personal"/> + <button label="Modificar la apariencia" name="edit_appearance_btn" tool_tip="Crear o modificar tu apariencia: tu fÃsico, ropas, etc."/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_navigation_bar.xml b/indra/newview/skins/default/xui/es/panel_navigation_bar.xml new file mode 100644 index 0000000000..e8e95c3bac --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_navigation_bar.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="navigation_bar"> + <panel name="navigation_panel"> + <pull_button name="back_btn" tool_tip="Volver a lo localización anterior"/> + <pull_button name="forward_btn" tool_tip="Ir una localización adelante"/> + <button name="home_btn" tool_tip="Teleportar a mi Base"/> + <location_input label="Localización" name="location_combo"/> + <search_combo_box label="Buscar" name="search_combo_box" tool_tip="Buscar"> + <combo_editor label="Buscar en [SECOND_LIFE]" name="search_combo_editor"/> + </search_combo_box> + </panel> + <favorites_bar name="favorite" tool_tip="¡Accede rápidamente a tus lugares favoritos de Second Life arrastrando hitos hasta aquÃ!"> + <label name="favorites_bar_label" tool_tip="¡Accede rápidamente a tus lugares favoritos de Second Life arrastrando hitos hasta aquÃ!"> + Barra de Favoritos + </label> + <chevron_button name=">>" tool_tip="Ver más de Mis favoritos"/> + </favorites_bar> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_nearby_chat.xml b/indra/newview/skins/default/xui/es/panel_nearby_chat.xml new file mode 100644 index 0000000000..986c109c41 --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_nearby_chat.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- All our XML is utf-8 encoded. --> +<panel name="nearby_chat"> + <panel name="chat_caption"> + <text name="sender_name"> + CHAT + </text> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/es/panel_nearby_chat_bar.xml new file mode 100644 index 0000000000..af2b6e920b --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_nearby_chat_bar.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="chat_bar"> + <line_editor label="Pulsa aquà para chatear." name="chat_box" tool_tip="Pulsa Enter para decirlo o Ctrl+Enter para gritarlo"/> + <button name="show_nearby_chat" tool_tip="Muestra o esconde el registro del chat"/> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_nearby_media.xml b/indra/newview/skins/default/xui/es/panel_nearby_media.xml new file mode 100644 index 0000000000..d1a14c877f --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_nearby_media.xml @@ -0,0 +1,65 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="nearby_media"> + <string name="media_item_count_format"> + (%ld Ãtems media) + </string> + <string name="empty_item_text"> + <vacÃo> + </string> + <string name="parcel_media_name"> + Media en streaming de la parcela + </string> + <string name="parcel_audio_name"> + Audio en streaming de la parcela + </string> + <string name="playing_suffix"> + (ejecutándose) + </string> + <panel name="minimized_controls"> + <button label="Parar todo" name="all_nearby_media_disable_btn" tool_tip="Apagar todos los media cercanos"/> + <button label="Iniciar todo" name="all_nearby_media_enable_btn" tool_tip="Encender todos los media cercanos"/> + <button name="open_prefs_btn" tool_tip="Abrir las preferencias de los media"/> + <button label="Más >>" label_selected="Menos <<" name="more_btn" tool_tip="Controles avanzados"/> + <button label="Más >>" label_selected="Menos <<" name="less_btn" tool_tip="Controles avanzados"/> + </panel> + <panel name="nearby_media_panel"> + <combo_box name="show_combo"> + <combo_box.item label="Todo" name="All"/> + <combo_box.item label="En esta parcela" name="WithinParcel"/> + <combo_box.item label="Fuera de la parcela" name="OutsideParcel"/> + <combo_box.item label="En otros avatares" name="OnOthers"/> + </combo_box> + <scroll_list name="media_list"> + <scroll_list.columns label="CercanÃa" name="media_proximity"/> + <scroll_list.columns label="Visibilidad" name="media_visibility"/> + <scroll_list.columns label="Clase" name="media_class"/> + <scroll_list.columns label="Nombre" name="media_name"/> + <scroll_list.columns label="Depurar" name="media_debug"/> + </scroll_list> + <panel> + <layout_stack name="media_controls"> + <layout_panel name="stop"> + <button name="stop_btn" tool_tip="Parar los media seleccionados"/> + </layout_panel> + <layout_panel name="play"> + <button name="play_btn" tool_tip="Ejecutar los media"/> + </layout_panel> + <layout_panel name="pause"> + <button name="pause_btn" tool_tip="Pausa los media seleccionados"/> + </layout_panel> + <layout_panel name="volume_slider_ctrl"> + <slider_bar initial_value="0.5" name="volume_slider" tool_tip="Volumen de los media seleccionados"/> + </layout_panel> + <layout_panel name="mute"> + <button name="mute_btn" tool_tip="Silencia los media seleccionados"/> + </layout_panel> + <layout_panel name="zoom"> + <button name="zoom_btn" tool_tip="Zoom en los media seleccionados"/> + </layout_panel> + <layout_panel name="unzoom"> + <button name="unzoom_btn" tool_tip="Alejar el zoom de los media seleccionados"/> + </layout_panel> + </layout_stack> + </panel> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_notes.xml b/indra/newview/skins/default/xui/es/panel_notes.xml new file mode 100644 index 0000000000..8de2afa767 --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_notes.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Notas y Privacidad" name="panel_notes"> + <layout_stack name="layout"> + <panel name="notes_stack"> + <scroll_container name="profile_scroll"> + <panel name="profile_scroll_panel"> + <text name="status_message" value="Mis notas privadas:"/> + <text name="status_message2" value="Permitir que esta persona:"/> + <check_box label="Vea si estoy conectado" name="status_check"/> + <check_box label="Me vea en el mapa" name="map_check"/> + <check_box label="Edite, borre o coja mis objetos" name="objects_check"/> + </panel> + </scroll_container> + </panel> + <panel name="notes_buttons_panel"> + <button label="Añadir como amigo" name="add_friend" tool_tip="Ofrecer amistad a este Residente"/> + <button label="MI" name="im" tool_tip="Abrir un mensaje instantáneo"/> + <button label="Llamar" name="call" tool_tip="Llamar a este Residente"/> + <button label="Mapa" name="show_on_map_btn" tool_tip="Mostrar al Residente en el mapa"/> + <button label="Teleportar" name="teleport" tool_tip="Ofrecer teleporte"/> + </panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_online_status.xml b/indra/newview/skins/default/xui/es/panel_online_status.xml new file mode 100644 index 0000000000..fdc489f375 --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_online_status.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="friend_online_status" name="friend_online_status"/> diff --git a/indra/newview/skins/default/xui/es/panel_online_status_toast.xml b/indra/newview/skins/default/xui/es/panel_online_status_toast.xml new file mode 100644 index 0000000000..fdc489f375 --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_online_status_toast.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="friend_online_status" name="friend_online_status"/> diff --git a/indra/newview/skins/default/xui/es/panel_outfit_edit.xml b/indra/newview/skins/default/xui/es/panel_outfit_edit.xml new file mode 100644 index 0000000000..31648e8e80 --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_outfit_edit.xml @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- Side tray Outfit Edit panel --> +<panel label="Editar el vestuario" name="outfit_edit"> + <string name="No Outfit" value="No hay vestuario"/> + <string name="unsaved_changes" value="Cambios sin guardar"/> + <string name="now_editing" value="Editando"/> + <panel.string name="not_available"> + (No disp.) + </panel.string> + <panel.string name="unknown"> + (desconocido) + </panel.string> + <string name="Filter.All" value="Todos"/> + <string name="Filter.Clothes/Body" value="Ropas/Cuerpo"/> + <string name="Filter.Objects" value="Objetos"/> + <string name="Filter.Custom" value="Filtro personalizado"/> + <text name="title" value="Editar el vestuario"/> + <panel label="bottom_panel" name="header_panel"> + <panel label="bottom_panel" name="outfit_name_and_status"> + <text name="status" value="Editando..."/> + <text name="curr_outfit_name" value="[Vestuario actual]"/> + </panel> + </panel> + <layout_stack name="im_panels"> + <layout_panel label="Panel de control de los MI" name="outfit_wearables_panel"> + <layout_stack name="filter_panels"> + <layout_panel name="add_button_and_combobox"> + <button label="Añadir más..." name="show_add_wearables_btn"/> + </layout_panel> + <layout_panel name="filter_panel"> + <filter_editor label="Filtrar artÃculos del inventario" name="look_item_filter"/> + </layout_panel> + </layout_stack> + </layout_panel> + <layout_panel name="add_wearables_panel"/> + </layout_stack> + <panel name="save_revert_button_bar"> + <button label="Guardar" name="save_btn"/> + <button label="Revertir" name="revert_btn"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/es/panel_outfits_inventory.xml new file mode 100644 index 0000000000..7691a680a1 --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_outfits_inventory.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Cosas" name="Outfits"> + <tab_container name="appearance_tabs"> + <panel label="MIS VESTUARIOS" name="outfitslist_tab"/> + <inventory_panel label="PUESTO" name="cof_tab"/> + </tab_container> + <panel name="bottom_panel"> + <button name="options_gear_btn" tool_tip="Ver más opciones"/> + <dnd_button name="trash_btn" tool_tip="Quitar el Ãtem seleccionado"/> + <button label="Guardar como" name="save_btn"/> + <button label="Ponerme" name="wear_btn" tool_tip="Ponerme el vestuario seleccionado"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_outfits_inventory_gear_default.xml b/indra/newview/skins/default/xui/es/panel_outfits_inventory_gear_default.xml new file mode 100644 index 0000000000..8f805c3d18 --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_outfits_inventory_gear_default.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_gear_default"> + <menu_item_call label="Reemplazar el vestuario actual" name="wear"/> + <menu_item_call label="Añadir al vestuario actual" name="add"/> + <menu_item_call label="Quitar del vestuario actual" name="remove"/> + <menu_item_call label="Renombrar" name="rename"/> + <menu_item_call label="Quitar el enlace" name="remove_link"/> + <menu_item_call label="Borrar el vestuario" name="delete"/> +</menu> diff --git a/indra/newview/skins/default/xui/es/panel_people.xml b/indra/newview/skins/default/xui/es/panel_people.xml new file mode 100644 index 0000000000..13f584ff28 --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_people.xml @@ -0,0 +1,64 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- Side tray panel --> +<panel label="Gente" name="people_panel"> + <string name="no_recent_people" value="No hay nadie reciente. ¿Buscas gente con la que pasar el rato? Prueba la [secondlife:///app/search/people Búsqueda] o el [secondlife:///app/worldmap Mapa del mundo]."/> + <string name="no_filtered_recent_people" value="¿No encuentras lo que buscas? Prueba con [secondlife:///app/search/people/[SEARCH_TERM] Buscar]."/> + <string name="no_one_near" value="No hay nadie cerca. ¿Buscas gente con la que pasar el rato? Prueba la [secondlife:///app/search/people Búsqueda] o el [secondlife:///app/worldmap Mapa del mundo]."/> + <string name="no_one_filtered_near" value="¿No encuentras lo que buscas? Prueba con [secondlife:///app/search/people/[SEARCH_TERM] Buscar]."/> + <string name="no_friends_online" value="No hay amigos conectados"/> + <string name="no_friends" value="No hay amigos"/> + <string name="no_friends_msg"> + Busca amigos usando la [secondlife:///app/search/people Búsqueda] o pulsa con el botón derecho del ratón en un Residente para añadirle como amigo. +¿Buscas gente con la que pasar el rato? Prueba el [secondlife:///app/worldmap Mapa del mundo]. + </string> + <string name="no_filtered_friends_msg"> + ¿No encuentras lo que buscas? Prueba con [secondlife:///app/search/people/[SEARCH_TERM] Buscar]. + </string> + <string name="people_filter_label" value="Filtrar a la gente"/> + <string name="groups_filter_label" value="Filtrar a los grupos"/> + <string name="no_filtered_groups_msg" value="¿No encuentras lo que buscas? Prueba con [secondlife:///app/search/groups/[SEARCH_TERM] Buscar]."/> + <string name="no_groups_msg" value="¿Buscas grupos en que participar? Prueba la [secondlife:///app/search/groups Búsqueda]."/> + <filter_editor label="Filtrar" name="filter_input"/> + <tab_container name="tabs"> + <panel label="CERCANA" name="nearby_panel"> + <panel label="bottom_panel" name="bottom_panel"> + <button name="nearby_view_sort_btn" tool_tip="Opciones"/> + <button name="add_friend_btn" tool_tip="Añadir al Residente seleccionado a la lista de tus amigos"/> + </panel> + </panel> + <panel label="MIS AMIGOS" name="friends_panel"> + <accordion name="friends_accordion"> + <accordion_tab name="tab_online" title="Conectado"/> + <accordion_tab name="tab_all" title="Todos"/> + </accordion> + <panel label="bottom_panel" name="bottom_panel"> + <button name="friends_viewsort_btn" tool_tip="Opciones"/> + <button name="add_btn" tool_tip="Ofrecer amistad a un Residente"/> + <button name="del_btn" tool_tip="Quitar a la persona seleccionada de tu lista de amigos"/> + </panel> + </panel> + <panel label="MIS GRUPOS" name="groups_panel"> + <panel label="bottom_panel" name="bottom_panel"> + <button name="groups_viewsort_btn" tool_tip="Opciones"/> + <button name="plus_btn" tool_tip="Entrar en un grupo o crear uno"/> + <button name="activate_btn" tool_tip="Activar el grupo seleccionado"/> + </panel> + </panel> + <panel label="RECIENTE" name="recent_panel"> + <panel label="bottom_panel" name="bottom_panel"> + <button name="recent_viewsort_btn" tool_tip="Opciones"/> + <button name="add_friend_btn" tool_tip="Añadir al Residente seleccionado a la lista de tus amigos"/> + </panel> + </panel> + </tab_container> + <panel name="button_bar"> + <button label="Perfil" name="view_profile_btn" tool_tip="Mostrar imágenes, grupos y otra información del Residente"/> + <button label="MI" name="im_btn" tool_tip="Abrir un mensaje instantáneo"/> + <button label="Llamar" name="call_btn" tool_tip="Llamar a este Residente"/> + <button label="Compartir" name="share_btn" tool_tip="Compartir un objeto del inventario"/> + <button label="Teleportar" name="teleport_btn" tool_tip="Ofrecer teleporte"/> + <button label="Perfil del grupo" name="group_info_btn" tool_tip="Ver la información del grupo"/> + <button label="Chat de grupo" name="chat_btn" tool_tip="Abrir el chat"/> + <button label="Multiconferencia" name="group_call_btn" tool_tip="Llamar a este grupo"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_pick_info.xml b/indra/newview/skins/default/xui/es/panel_pick_info.xml new file mode 100644 index 0000000000..c55addbc93 --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_pick_info.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_pick_info"> + <text name="title" value="Información del destacado"/> + <scroll_container name="profile_scroll"> + <panel name="scroll_content_panel"> + <text name="pick_name" value="[nombre]"/> + <text name="pick_location" value="[cargando...]"/> + <text name="pick_desc" value="[descripción]"/> + </panel> + </scroll_container> + <panel name="buttons"> + <button label="Teleporte" name="teleport_btn"/> + <button label="Mapa" name="show_on_map_btn"/> + <button label="Editar" name="edit_btn"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_picks.xml b/indra/newview/skins/default/xui/es/panel_picks.xml new file mode 100644 index 0000000000..abedc6c551 --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_picks.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Destacados" name="panel_picks"> + <string name="no_picks" value="No hay destacados"/> + <string name="no_classifieds" value="No hay clasificados"/> + <text name="empty_picks_panel_text"> + No hay ni destacados ni clasificados + </text> + <accordion name="accordion"> + <accordion_tab name="tab_picks" title="Destacados"/> + <accordion_tab name="tab_classifieds" title="Clasificados"/> + </accordion> + <panel label="bottom_panel" name="edit_panel"> + <button name="new_btn" tool_tip="Crear un nuevo destacado o clasificado de la posición actual"/> + </panel> + <panel name="buttons_cucks"> + <button label="Información" name="info_btn" tool_tip="Mostrar la información del destacado"/> + <button label="Teleportarse" name="teleport_btn" tool_tip="Teleportar a esta zona"/> + <button label="Mapa" name="show_on_map_btn" tool_tip="Mostrar esta zona en el mapa del mundo"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_place_profile.xml b/indra/newview/skins/default/xui/es/panel_place_profile.xml new file mode 100644 index 0000000000..6fe7895d45 --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_place_profile.xml @@ -0,0 +1,111 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="place_profile"> + <string name="on" value="On"/> + <string name="off" value="Off"/> + <string name="anyone" value="Cualquiera"/> + <string name="available" value="disponible"/> + <string name="allocated" value="asignados"/> + <string name="title_place" value="Añadir el perfil"/> + <string name="title_teleport_history" value="Historial de teleportes"/> + <string name="not_available" value="(No disp.)"/> + <string name="unknown" value="(desconocido)"/> + <string name="public" value="(público)"/> + <string name="none_text" value="(ninguno)"/> + <string name="sale_pending_text" value="(venta pendiente)"/> + <string name="group_owned_text" value="(propiedad de un grupo)"/> + <string name="price_text" value="L$"/> + <string name="area_text" value="m²"/> + <string name="all_residents_text" value="Todos los residentes"/> + <string name="group_text" value="Grupo"/> + <string name="can_resell"> + El terreno comprado en esta región puede revenderse. + </string> + <string name="can_not_resell"> + El terreno comprado en esta región no puede revenderse. + </string> + <string name="can_change"> + El terreno comprado en esta región puede unirse o dividirse. + </string> + <string name="can_not_change"> + El terreno comprado en esta región no puede unirse o dividirse. + </string> + <string name="server_update_text"> + La información de esta parcela no está disponible sin una actualización del servidor. + </string> + <string name="server_error_text"> + En este momento no está disponible la información de esta parcela. Por favor, inténtalo más tarde. + </string> + <string name="server_forbidden_text"> + Por tener restringido el acceso, no está disponible la información de esta parcela. Por favor, revisa tus permisos con el propietario de la parcela. + </string> + <string name="acquired_date"> + [wkday,datetime,local][day,datetime,local] [mth,datetime,local] [year,datetime,local][hour,datetime,local]:[min,datetime,local]:[second,datetime,local] + </string> + <button name="back_btn" tool_tip="Atrás"/> + <text name="title" value="Añadir el perfil"/> + <scroll_container name="place_scroll"> + <panel name="scrolling_panel"> + <text name="owner_label" value="Propietario:"/> + <text name="maturity_value" value="desconocido"/> + <accordion name="advanced_info_accordion"> + <accordion_tab name="parcel_characteristics_tab" title="Parcela"> + <panel name="parcel_characteristics_panel"> + <text name="rating_label" value="Calificación:"/> + <text name="rating_value" value="desconocida"/> + <text name="voice_label" value="Voz:"/> + <text name="voice_value" value="SÃ"/> + <text name="fly_label" value="Volar:"/> + <text name="fly_value" value="SÃ"/> + <text name="push_label" value="Empujones:"/> + <text name="push_value" value="No"/> + <text name="build_label" value="Construir:"/> + <text name="build_value" value="SÃ"/> + <text name="scripts_label" value="Scripts:"/> + <text name="scripts_value" value="SÃ"/> + <text name="damage_label" value="Daño:"/> + <text name="damage_value" value="No"/> + <button label="Acerca del terreno" name="about_land_btn"/> + </panel> + </accordion_tab> + <accordion_tab name="region_information_tab" title="Región"> + <panel name="region_information_panel"> + <text name="region_name_label" value="Región:"/> + <text name="region_name" value="Mooseland"/> + <text name="region_type_label" value="Tipo:"/> + <text name="region_type" value="Moose"/> + <text name="region_rating_label" value="Calificación:"/> + <text name="region_rating" value="Adulto"/> + <text name="region_owner_label" value="Propietario:"/> + <text name="region_owner" value="moose Van Moose"/> + <text name="region_group_label" value="Grupo:"/> + <text name="region_group"> + The Mighty Moose of mooseville soundvillemoose + </text> + <button label="Región/Estado" name="region_info_btn"/> + </panel> + </accordion_tab> + <accordion_tab name="estate_information_tab" title="Estado"> + <panel name="estate_information_panel"> + <text name="estate_name_label" value="Estado:"/> + <text name="estate_rating_label" value="Calificación:"/> + <text name="estate_owner_label" value="Propietario:"/> + <text name="covenant_label" value="Contrato:"/> + </panel> + </accordion_tab> + <accordion_tab name="sales_tab" title="En venta"> + <panel name="sales_panel"> + <text name="sales_price_label" value="Precio:"/> + <text name="area_label" value="Ãrea:"/> + <text name="traffic_label" value="Tráfico:"/> + <text name="primitives_label" value="Primitivas:"/> + <text name="parcel_scripts_label" value="Scripts:"/> + <text name="terraform_limits_label" value="LÃmites de modificación del terreno:"/> + <text name="subdivide_label" value="Puede dividirse/unirse:"/> + <text name="resale_label" value="Puede revenderse:"/> + <text name="sale_to_label" value="En venta a:"/> + </panel> + </accordion_tab> + </accordion> + </panel> + </scroll_container> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_places.xml b/indra/newview/skins/default/xui/es/panel_places.xml new file mode 100644 index 0000000000..d186a04f4b --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_places.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Lugares" name="places panel"> + <string name="landmarks_tab_title" value="MIS HITOS"/> + <string name="teleport_history_tab_title" value="HISTORIAL DE TELEPORTES"/> + <filter_editor label="Filtrar mis lugares" name="Filter"/> + <panel name="button_panel"> + <button label="Teleporte" name="teleport_btn" tool_tip="Teleportar a la zona elegida"/> + <button label="Mapa" name="map_btn" tool_tip="Mostrar esta zona en el mapa del mundo"/> + <button label="Editar" name="edit_btn" tool_tip="Editar la información del hito"/> + <button label="â–¼" name="overflow_btn" tool_tip="Ver más opciones"/> + <button label="Guardar" name="save_btn"/> + <button label="Cancelar" name="cancel_btn"/> + <button label="Cerrar" name="close_btn"/> + <button label="Perfil" name="profile_btn" tool_tip="Mostrar el perfil del lugar"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/es/panel_preferences_advanced.xml index 02fb4da017..d65868c0a8 100644 --- a/indra/newview/skins/default/xui/es/panel_preferences_advanced.xml +++ b/indra/newview/skins/default/xui/es/panel_preferences_advanced.xml @@ -1,12 +1,37 @@ <?xml version="1.0" encoding="utf-8"?> -<panel name="advanced"> - <text name="AspectRatioLabel1" tool_tip="ancho / alto"> - Proporción: +<panel label="Avanzado" name="advanced"> + <panel.string name="aspect_ratio_text"> + [NUM]:[DEN] + </panel.string> + <panel.string name="middle_mouse"> + Botón medio del ratón + </panel.string> + <slider label="Ãngulo de visión" name="camera_fov"/> + <slider label="Distancia" name="camera_offset_scale"/> + <text name="heading2"> + Posición automática para: </text> - <combo_box name="aspect_ratio" tool_tip="ancho / alto"> - <combo_box.item label="4:3 (Standard CRT)" name="item1"/> - <combo_box.item label="5:4 (1280x1024 LCD)" name="item2"/> - <combo_box.item label="8:5 (Widescreen)" name="item3"/> - <combo_box.item label="16:9 (Widescreen)" name="item4"/> - </combo_box> + <check_box label="Construir/Editar" name="edit_camera_movement" tool_tip="Usar el posicionamiento automático de la cámara al entrar en o salir del modo de edición"/> + <check_box label="Apariencia" name="appearance_camera_movement" tool_tip="Usar el posicionamiento automático de la cámara mientras se está editando"/> + <check_box initial_value="true" label="Barra lateral" name="appearance_sidebar_positioning" tool_tip="Usar el posicionamiento automático de la cámara para la barra lateral"/> + <check_box label="Verme en vista subjetiva" name="first_person_avatar_visible"/> + <check_box label="Las teclas del cursor siempre para moverme" name="arrow_keys_move_avatar_check"/> + <check_box label="Correr siempre: atajo de teclado" name="tap_tap_hold_to_run"/> + <check_box label="Al hablar, mover los labios del avatar" name="enable_lip_sync"/> + <check_box label="Chat en bocadillos" name="bubble_text_chat"/> + <slider label="Opacidad" name="bubble_chat_opacity"/> + <color_swatch name="background" tool_tip="Elegir el color de los bocadillos del chat"/> + <text name="UI Size:"> + Tamaño de la UI + </text> + <check_box label="Mostrar los errores de los scripts en:" name="show_script_errors"/> + <radio_group name="show_location"> + <radio_item label="Chat" name="0"/> + <radio_item label="Ventanas distintas" name="1"/> + </radio_group> + <check_box label="Cambiar entre hablar on/off cuando pulse:" name="push_to_talk_toggle_check" tool_tip="En el modo 'un toque', pulsa y suelta el botón UNA VEZ para activar o desactivar el micrófono. Si no estás en el modo 'un toque', el micrófono sólo recogerá tu voz mientras mantengas pulsado el botón."/> + <line_editor label="Botón de Apretar para Hablar" name="modifier_combo"/> + <button label="Elegir la tecla" name="set_voice_hotkey_button"/> + <button label="Botón de en medio del ratón" name="set_voice_middlemouse_button" tool_tip="Reconfigurarlo al botón medio del ratón"/> + <button label="Otros dispositivos" name="joystick_setup_button"/> </panel> diff --git a/indra/newview/skins/default/xui/es/panel_preferences_alerts.xml b/indra/newview/skins/default/xui/es/panel_preferences_alerts.xml index a71ac172a3..f34edf149e 100644 --- a/indra/newview/skins/default/xui/es/panel_preferences_alerts.xml +++ b/indra/newview/skins/default/xui/es/panel_preferences_alerts.xml @@ -1,18 +1,14 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Ventanas emergentes" name="popups" title="Ventanas emergentes"> - <text name="dont_show_label"> - No mostrar estas ventanas emergentes: + <text name="tell_me_label"> + Avisarme: </text> - <button width="200" label="Activar esta ventana emergente" label_selected="Activar esta popup" name="enable_popup"/> - <button width="255" left="225" label="Activar todas las ventanas emergentes..." label_selected="Restaurar cajas de diálogo 'Mostrar en la próxima vez'..." name="reset_dialogs_btn" tool_tip="Activar todas las ventanas emergentes y los avisos de 'primera vez que se usa'."/> + <check_box label="Cuando gaste o consiga L$" name="notify_money_change_checkbox"/> + <check_box label="Cuando mis amigos se conecten o desconecten" name="friends_online_notify_checkbox"/> <text name="show_label" width="300"> - Mostrar estas ventanas emergentes: + Mostrar siempre: </text> - <button left="205" width="275" label="Desactivar todas estas ventanas emergentes..." name="skip_dialogs_btn" tool_tip="Desactivar todas las ventanas emergentes y los avisos de 'primera vez que se usa'."/> - <text name="text_box2"> - Oferta de notas, texturas e hitos: + <text name="dont_show_label"> + No mostrar nunca: </text> - <check_box label="Aceptar automáticamente" name="accept_new_inventory"/> - <check_box label="Ver automáticamente tras aceptar" name="show_new_inventory"/> - <check_box label="Mostrar automáticamente los objetos aceptados recientemente en el inventario" name="show_in_inventory"/> </panel> diff --git a/indra/newview/skins/default/xui/es/panel_preferences_chat.xml b/indra/newview/skins/default/xui/es/panel_preferences_chat.xml index 4e9dc6db6f..fc8c908788 100644 --- a/indra/newview/skins/default/xui/es/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/es/panel_preferences_chat.xml @@ -1,17 +1,19 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Chat de texto" name="chat"> - <text name="text_box"> - Tamaño de la fuente -del chat: + <text name="font_size"> + Tamaño de la fuente: </text> <radio_group name="chat_font_size"> - <radio_item name="radio" label="Pequeño" /> - <radio_item name="radio2" label="Medio" /> - <radio_item name="radio3" label="Grande" /> + <radio_item label="Disminuir" name="radio" value="0"/> + <radio_item label="Medio" name="radio2" value="1"/> + <radio_item label="Aumentar" name="radio3" value="2"/> </radio_group> + <text name="font_colors"> + Colores de la fuente: + </text> <color_swatch label="Usted" name="user"/> <text name="text_box1"> - Usted + Yo </text> <color_swatch label="Otros" name="agent"/> <text name="text_box2"> @@ -37,22 +39,21 @@ del chat: <text name="text_box7"> Propietario </text> - <color_swatch label="Bocadillo" name="background"/> - <text name="text_box8"> - Bocadillo - </text> <color_swatch label="URL" name="links"/> <text name="text_box9"> URL </text> - <check_box label="Ver en el chat los avisos y errores de los scripts" name="script_errors_as_chat"/> - <spinner label="Quitar el chat tras" name="fade_chat_time" label_width="95" width="145" /> - <slider label="Opacidad" name="console_opacity"/> - <check_box label="Usar el ancho de la pantalla (tras reiniciar)" name="chat_full_width_check"/> - <check_box label="Cerrar el chat al pulsar Intro" name="close_chat_on_return_check"/> - <check_box label="En el chat, las teclas del cursor mueven el avatar" name="arrow_keys_move_avatar_check"/> - <check_box label="Incluir la hora en el chat" name="show_timestamps_check"/> - <check_box label="Ejecutar la animación de escribir al hacerlo en el chat" name="play_typing_animation"/> - <check_box label="Mostrar el chat en bocadillos" name="bubble_text_chat"/> - <slider label="Opacidad" name="bubble_chat_opacity"/> + <check_box initial_value="true" label="Ejecutar la animación de escribir al hacerlo en el chat" name="play_typing_animation"/> + <check_box label="Cuando estoy desconectado, enviarme los MI al correo-e" name="send_im_to_email"/> + <check_box label="Permitir el historial de MI y chat en texto sin formato" name="plain_text_chat_history"/> + <text name="show_ims_in_label"> + Mostrar los MI en: + </text> + <text name="requires_restart_label"> + (requiere reiniciar) + </text> + <radio_group name="chat_window" tool_tip="Muestra tus mensajes instantáneos en varias ventanas flotantes o en una sola con varias pestañas (requiere que reinicies)"> + <radio_item label="Varias ventanas" name="radio" value="0"/> + <radio_item label="Pestañas" name="radio2" value="1"/> + </radio_group> </panel> diff --git a/indra/newview/skins/default/xui/es/panel_preferences_general.xml b/indra/newview/skins/default/xui/es/panel_preferences_general.xml index 2b813a18bf..ca157314aa 100644 --- a/indra/newview/skins/default/xui/es/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/es/panel_preferences_general.xml @@ -1,90 +1,67 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="General" name="general_panel"> - <combo_box name="start_location_combo"> - <combo_box.item name="MyHome" tool_tip="Por defecto, iniciar sesión en mi Base." label="Mi Base"/> - <combo_box.item name="MyLastLocation" tool_tip="Por defecto, iniciar sesión en mi última posición." label="Mi última posición"/> - </combo_box> - <check_box label="Ver mi posición inicial en la pantalla de inicio de sesión" name="show_location_checkbox"/> - <combo_box name="fade_out_combobox"> - <combo_box.item name="Never" label="Nunca"/> - <combo_box.item name="Show Temporarily" label="Mostrarlos temporalmente"/> - <combo_box.item name="Always" label="Siempre"/> - </combo_box> - <check_box label="Nombres de avatar en pequeño" name="small_avatar_names_checkbox"/> - <check_box label="No ver mi nombre en mi pantalla" name="show_my_name_checkbox"/> - <text name="group_titles_textbox"> - Etiquetas de grupo: - </text> - <check_box label="Ocultar las etiquetas de grupo" name="show_all_title_checkbox"/> - <check_box label="Ocultar mi etiqueta de grupo" name="show_my_title_checkbox"/> - <color_swatch label="" name="effect_color_swatch" tool_tip="Pulse para abrir el selector de color"/> - <text name="UI Size:"> - Tamaño de la interfaz: + <text name="language_textbox"> + Idioma: </text> - <check_box label="Resolución independiente del tamaño" name="ui_auto_scale"/> - <spinner label="Ausente tras:" name="afk_timeout_spinner"/> - <check_box label="Avisar cuando gasto o recibo dólares Linden (L$)" name="notify_money_change_checkbox"/> - <text name="maturity_desired_label"> - Calificación: + <combo_box name="language_combobox"> + <combo_box.item label="Predeterminado del sistema" name="System Default Language"/> + <combo_box.item label="English (Inglés)" name="English"/> + <combo_box.item label="Dansk (Danés) - Beta" name="Danish"/> + <combo_box.item label="Deutsch (Alemán) - Beta" name="Deutsch(German)"/> + <combo_box.item label="Español - Beta" name="Spanish"/> + <combo_box.item label="Français (Francés) - Beta" name="French"/> + <combo_box.item label="Italiano - Beta" name="Italian"/> + <combo_box.item label="Nederlands (Neerlandés) - Beta" name="Dutch"/> + <combo_box.item label="Polski (Polaco) - Beta" name="Polish"/> + <combo_box.item label="Portugués (Portugués) - Beta" name="Portugese"/> + <combo_box.item label="日本語 (Japonés) - Beta" name="(Japanese)"/> + </combo_box> + <text name="language_textbox2"> + (requiere reiniciar) </text> <text name="maturity_desired_prompt"> - Quiero acceder a contenido calificado: + Quiero acceder a contenido: </text> + <text name="maturity_desired_textbox"/> <combo_box name="maturity_desired_combobox"> - <combo_box.item name="Desired_Adult" label="'PG', 'Mature' y 'Adult'"/> - <combo_box.item name="Desired_Mature" label="'PG' y 'Mature'"/> - <combo_box.item name="Desired_PG" label="'PG'"/> + <combo_box.item label="'PG', 'Mature' y 'Adult'" name="Desired_Adult"/> + <combo_box.item label="'PG' y 'Mature'" name="Desired_Mature"/> + <combo_box.item label="'PG'" name="Desired_PG"/> </combo_box> - <text name="maturity_desired_textbox"> - 'PG' - </text> <text name="start_location_textbox"> - Posición inicial: + Localización inicial: </text> - <text name="show_names_textbox"> - Mostrar los nombres: + <combo_box name="start_location_combo"> + <combo_box.item label="Mi última posición" name="MyLastLocation" tool_tip="Por defecto, iniciar sesión en mi última posición."/> + <combo_box.item label="Mi Base" name="MyHome" tool_tip="Por defecto, iniciar sesión en mi Base."/> + </combo_box> + <check_box initial_value="true" label="Mostrar en la pantalla de conexión" name="show_location_checkbox"/> + <text name="name_tags_textbox"> + Etiquetas de los nombres: </text> + <radio_group name="Name_Tag_Preference"> + <radio_item label="Off" name="radio" value="0"/> + <radio_item label="On" name="radio2" value="1"/> + <radio_item label="Mostrar brevemente" name="radio3" value="2"/> + </radio_group> + <check_box label="Ver yo mi nombre" name="show_my_name_checkbox1"/> + <check_box initial_value="true" label="Etiquetas de los avatares en pequeño" name="small_avatar_names_checkbox"/> + <check_box label="Mostrar las etiquetas de grupo" name="show_all_title_checkbox1"/> <text name="effects_color_textbox"> - Color de mis efectos: - </text> - <text name="seconds_textbox"> - segundos - </text> - <text name="crash_report_textbox"> - Informes de caÃdas: + Mis efectos: </text> - <text name="language_textbox"> - Idioma: + <text name="title_afk_text"> + Ausente tras: </text> - <text name="language_textbox2"> - (Tendrá efecto tras reiniciar) - </text> - <string name="region_name_prompt"> - <escriba el nombre de la región> - </string> - <combo_box name="crash_behavior_combobox"> - <combo_box.item name="Askbeforesending" label="Preguntar antes de enviar"/> - <combo_box.item name="Alwayssend" label="Enviar siempre"/> - <combo_box.item name="Neversend" label="No enviar nunca"/> - </combo_box> - <combo_box name="language_combobox"> - <combo_box.item name="System Default Language" label="Predeterminado del sistema"/> - <combo_box.item name="English" label="English (Inglés)"/> - <combo_box.item name="Danish" label="Dansk (Danés) - Beta"/> - <combo_box.item name="Deutsch(German)" label="Deutsch (Alemán) - Beta"/> - <combo_box.item name="Spanish" label="Español - Beta"/> - <combo_box.item name="French" label="Français (Francés) - Beta"/> - <combo_box.item name="Italian" label="Italiano - Beta"/> - <combo_box.item name="Hungarian" label="Magyar (Húngaro) - Beta"/> - <combo_box.item name="Dutch" label="Nederlands (Neerlandés) - Beta"/> - <combo_box.item name="Polish" label="Polski (Polaco) - Beta"/> - <combo_box.item name="Portugese" label="Portugués (Portugués) - Beta"/> - <combo_box.item name="Russian" label="РуÑÑкий (Ruso) - Beta"/> - <combo_box.item name="Turkish" label="Türkçe (Turco) - Beta"/> - <combo_box.item name="Ukrainian" label="УкраїнÑька (Ucraniano) - Beta"/> - <combo_box.item name="Chinese" label="䏿–‡ (简体) (Chino) - Beta"/> - <combo_box.item name="(Japanese)" label="日本語 (Japonés) - Beta"/> - <combo_box.item name="(Korean)" label="한êµì–´ (Coreano) - Beta"/> + <color_swatch label="" name="effect_color_swatch" tool_tip="Pulse para abrir el selector de color"/> + <combo_box label="Ausente tras:" name="afk"> + <combo_box.item label="2 minutos" name="item0"/> + <combo_box.item label="5 minutos" name="item1"/> + <combo_box.item label="10 minutos" name="item2"/> + <combo_box.item label="30 minutos" name="item3"/> + <combo_box.item label="nunca" name="item4"/> </combo_box> - <check_box label="Compartir el idioma con los objetos" name="language_is_public" tool_tip="Hace que los objetos con script del mundo sepan su idioma preferido."/> + <text name="text_box3"> + Respuesta cuando estoy en modo ocupado: + </text> </panel> diff --git a/indra/newview/skins/default/xui/es/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/es/panel_preferences_graphics1.xml index 4038940256..183c007a0c 100644 --- a/indra/newview/skins/default/xui/es/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/es/panel_preferences_graphics1.xml @@ -1,42 +1,13 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Gráficos" name="Display panel"> - <button label="?" name="GraphicsPreferencesHelpButton"/> - <check_box label="Abrir Second Life en una ventana" name="windowed mode"/> - <text_editor name="FullScreenInfo" width="480"> - Si no está marcado, el visor se mostrará en pantalla completa cuando inicie sesión. - </text_editor> - <text name="WindowSizeLabel"> - Tamaño de la ventana: + <text name="QualitySpeed"> + Calidad y velocidad: </text> - <combo_box left="124" name="windowsize combo"> - <combo_box.item name="640x480" label="640x480"/> - <combo_box.item name="800x600" label="800x600"/> - <combo_box.item name="720x480" label="720x480 (NTSC)"/> - <combo_box.item name="768x576" label="768x576 (PAL)"/> - <combo_box.item name="1024x768" label="1024x768"/> - </combo_box> - <text name="DisplayResLabel"> - Resolución: + <text name="FasterText"> + Más rápido </text> - <combo_box left="124" name="fullscreen combo" /> - <text name="AspectRatioLabel1" tool_tip="ancho / alto"> - Proporción: - </text> - <combo_box left="124" name="aspect_ratio" tool_tip="ancho / alto"> - <combo_box.item name="4:3(StandardCRT)" label="4:3 (Standard CRT)"/> - <combo_box.item name="5:4(1280x1024LCD)" label="5:4 (1280x1024 LCD)"/> - <combo_box.item name="8:5(Widescreen)" label="8:5 (Widescreen)"/> - <combo_box.item name="16:9(Widescreen)" label="16:9 (Widescreen)"/> - </combo_box> - <check_box label="Detectar automáticamente la proporción" name="aspect_auto_detect" left="295" /> - <text name="HigherText"> - Calidad y - </text> - <text name="QualityText"> - Rendimiento: - </text> - <text name="FasterText" left="95"> - El más rápido + <text name="BetterText"> + Más calidad </text> <text name="ShadersPrefText"> Bajo @@ -50,97 +21,86 @@ <text name="ShadersPrefText4"> Ultra </text> - <text name="HigherText2" left="325" > - Más alto - </text> - <text name="QualityText2" left="325" > - calidad - </text> - <check_box label="Personalizar" name="CustomSettings"/> - <panel name="CustomGraphics Panel"> - <text name="ShadersText"> - Shaders: - </text> - <check_box label="Efecto de relieve y brillo" name="BumpShiny"/> - <check_box label="Shaders básicos" name="BasicShaders" tool_tip="Desactivando esta opción puede prevenir fallos en algunos controladores de la tarjeta gráfica."/> - <check_box label="Shaders de la atmósfera" name="WindLightUseAtmosShaders"/> - <check_box label="Reflejos en el agua" name="Reflections"/> - <text name="ReflectionDetailText"> - Objetos reflejados: - </text> - <radio_group name="ReflectionDetailRadio"> - <radio_item name="0" label="Terreno y árboles" /> - <radio_item name="1" label="Todos los objetos estáticos" /> - <radio_item name="2" label="Todos los avatares y objetos" /> - <radio_item name="3" label="Todo" /> - </radio_group> - <text name="AvatarRenderingText"> - Renderización del avatar: - </text> - <check_box label="Avatares simulados" name="AvatarImpostors"/> - <check_box label="Renderizado por hardware" name="AvatarVertexProgram"/> - <check_box label="Ropas del avatar" name="AvatarCloth"/> - <text name="DrawDistanceMeterText1"> - m - </text> - <text name="DrawDistanceMeterText2"> - m - </text> - <slider label="Distancia de dibujo:" name="DrawDistance"/> - <slider label="Núm. máx. de partÃculas:" name="MaxParticleCount"/> - <slider label="Calidad del procesamiento:" name="RenderPostProcess" label_width="142"/> - <text name="MeshDetailText"> - Detalle de la malla: - </text> - <slider label=" Objetos:" name="ObjectMeshDetail"/> - <slider label=" Prims flexibles:" name="FlexibleMeshDetail"/> - <slider label=" Ãrboles:" name="TreeMeshDetail"/> - <slider label=" Avatares:" name="AvatarMeshDetail"/> - <slider label=" Terreno:" name="TerrainMeshDetail"/> - <slider label=" Cielo:" name="SkyMeshDetail"/> - <text name="PostProcessText"> - Baja - </text> - <text name="ObjectMeshDetailText"> - Bajo - </text> - <text name="FlexibleMeshDetailText"> - Bajo - </text> - <text name="TreeMeshDetailText"> - Bajo - </text> - <text name="AvatarMeshDetailText"> - Bajo - </text> - <text name="TerrainMeshDetailText"> - Bajo - </text> - <text name="SkyMeshDetailText"> - Bajo - </text> - <text name="LightingDetailText" width="135"> - Detalles de la iluminación: - </text> - <radio_group name="LightingDetailRadio"> - <radio_item name="SunMoon" label="Sólo el Sol y la Luna" /> - <radio_item name="LocalLights" label="Puntos de luz cercanos" /> - </radio_group> - <text name="TerrainDetailText"> - Nivel de detalle del - terreno: - </text> - <radio_group name="TerrainDetailRadio" left_delta="60"> - <radio_item name="0" label="Bajo" /> - <radio_item name="2" label="Alto" /> - </radio_group> + <panel label="CustomGraphics" name="CustomGraphics Panel"> + <text name="ShadersText"> + Shaders: + </text> + <check_box initial_value="true" label="Efecto de relieve y brillo" name="BumpShiny"/> + <check_box initial_value="true" label="Shaders básicos" name="BasicShaders" tool_tip="Desactivando esta opción puede prevenir fallos en algunos controladores de la tarjeta gráfica."/> + <check_box initial_value="true" label="Shaders de la atmósfera" name="WindLightUseAtmosShaders"/> + <check_box initial_value="true" label="Reflejos en el agua" name="Reflections"/> + <text name="ReflectionDetailText"> + Objetos reflejados: + </text> + <radio_group name="ReflectionDetailRadio"> + <radio_item label="Terreno y árboles" name="0"/> + <radio_item label="Todos los objetos estáticos" name="1"/> + <radio_item label="Todos los avatares y objetos" name="2"/> + <radio_item label="Todo" name="3"/> + </radio_group> + <text name="AvatarRenderingText"> + Renderización del avatar: + </text> + <check_box initial_value="true" label="Avatares simulados" name="AvatarImpostors"/> + <check_box initial_value="true" label="Renderizado por hardware" name="AvatarVertexProgram"/> + <check_box initial_value="true" label="Ropas del avatar" name="AvatarCloth"/> + <slider label="Distancia de dibujo:" name="DrawDistance"/> + <text name="DrawDistanceMeterText2"> + m + </text> + <slider label="Núm. máx. de partÃculas:" name="MaxParticleCount"/> + <slider label="Distancia de dibujo máxima del avatar:" name="MaxAvatarDrawDistance"/> + <text name="DrawDistanceMeterText3"> + m + </text> + <slider label="Calidad de procesamiento:" name="RenderPostProcess"/> + <text name="MeshDetailText"> + Detalle de la malla: + </text> + <slider label=" Objetos:" name="ObjectMeshDetail"/> + <slider label=" Prims flexibles:" name="FlexibleMeshDetail"/> + <slider label=" Ãrboles:" name="TreeMeshDetail"/> + <slider label=" Avatares:" name="AvatarMeshDetail"/> + <slider label=" Terreno:" name="TerrainMeshDetail"/> + <slider label=" Cielo:" name="SkyMeshDetail"/> + <text name="PostProcessText"> + Baja + </text> + <text name="ObjectMeshDetailText"> + Bajo + </text> + <text name="FlexibleMeshDetailText"> + Bajo + </text> + <text name="TreeMeshDetailText"> + Bajo + </text> + <text name="AvatarMeshDetailText"> + Bajo + </text> + <text name="TerrainMeshDetailText"> + Bajo + </text> + <text name="SkyMeshDetailText"> + Bajo + </text> + <text name="LightingDetailText"> + Detalles de iluminación: + </text> + <radio_group name="LightingDetailRadio"> + <radio_item label="Sólo el Sol y la Luna" name="SunMoon" value="0"/> + <radio_item label="Puntos de luz cercanos" name="LocalLights" value="1"/> + </radio_group> + <text name="TerrainDetailText"> + Detalle del terreno: + </text> + <radio_group name="TerrainDetailRadio"> + <radio_item label="Bajo" name="0"/> + <radio_item label="Alto" name="2"/> + </radio_group> </panel> - <button label="Configuraciones recomendadas" name="Defaults" width="195" left="110"/> - <button label="Opciones del hardware" label_selected="Opciones del hardware" name="GraphicsHardwareButton" left="315"/> - <panel.string name="resolution_format"> - [RES_X] x [RES_Y] - </panel.string> - <panel.string name="aspect_ratio_text"> - [NUM]:[DEN] - </panel.string> + <button label="Aplicar" label_selected="Aplicar" name="Apply"/> + <button label="Por defecto" name="Defaults"/> + <button label="Avanzado" name="Advanced"/> + <button label="Hardware" label_selected="Hardware" left="315" name="GraphicsHardwareButton"/> </panel> diff --git a/indra/newview/skins/default/xui/es/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/es/panel_preferences_privacy.xml index cbaa3d96ee..bf2c6b7aa6 100644 --- a/indra/newview/skins/default/xui/es/panel_preferences_privacy.xml +++ b/indra/newview/skins/default/xui/es/panel_preferences_privacy.xml @@ -1,34 +1,26 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Comunicación" name="im"> - <text name="text_box"> - Mi estado de conexión: + <panel.string name="log_in_to_change"> + Conéctate para que cambie + </panel.string> + <button label="Limpiar el historial" name="clear_cache" tool_tip="Limpia la imagen de la pantalla de conexión, la última posición, el historial de teleportes, web y caché de las texturas."/> + <text name="cache_size_label_l"> + (Localizaciones, imágenes, web, historial de búsqueda) </text> - <check_box label="Sólo pueden ver si estoy conectado mis amigos y grupos" name="online_visibility"/> - <text name="text_box2"> - Opciones de los MI: + <check_box label="Sólo saben si estoy conectado mis amigos y grupos" name="online_visibility"/> + <check_box label="Sólo pueden llamarme o mandarme un MI mis amigos y grupos" name="voice_call_friends_only_check"/> + <check_box label="Desconectar el micrófono cuando finalicen las llamadas" name="auto_disengage_mic_check"/> + <check_box label="Aceptar las 'cookies'" name="cookies_enabled"/> + <text name="Logs:"> + Registros: </text> - <string name="log_in_to_change"> - inicie sesión para cambiar - </string> - <check_box label="Enviar MI al correo electrónico ([EMAIL])" name="send_im_to_email"/> - <check_box label="Incluir los MI en la consola del chat" name="include_im_in_chat_console"/> - <check_box label="Incluir la hora en los MI" name="show_timestamps_check"/> - <check_box label="Avisar si se conecta un amigo" name="friends_online_notify_checkbox"/> - <text name="text_box3"> - Mensaje en el estado -ocupado: + <check_box label="Guardar en mi ordenador registros del chat" name="log_nearby_chat"/> + <check_box label="Guardar en mi ordenador registros de los MI" name="log_instant_messages"/> + <check_box label="Añadir fecha y hora" name="show_timestamps_check_im"/> + <text name="log_path_desc"> + Ruta de los registros: </text> - <text name="text_box4"> - Opciones de los -registros: - </text> - <check_box label="Guardar un registro de los MI en mi ordenador" name="log_instant_messages"/> - <check_box label="Incluir la hora en el registro de los MI" name="log_instant_messages_timestamp"/> - <check_box label="Mostrar el final de la última conversación por MI" name="log_show_history"/> - <check_box label="Guardar un registro del chat en mi ordenador" name="log_chat"/> - <check_box label="Incluir la hora en el registro del chat" name="log_chat_timestamp"/> - <check_box label="Mostrar en el chat la llegada de los MI" name="log_chat_IM"/> - <check_box label="Incluir la fecha junto a la hora" name="log_date_timestamp"/> - <button label="Cambiar la ruta" label_selected="Cambiar la ruta" name="log_path_button" width="120"/> <line_editor left="278" name="log_path_string" right="-20"/> + <button label="Elegir" label_selected="Elegir" name="log_path_button" width="120"/> + <button label="Lista de ignorados" name="block_list"/> </panel> diff --git a/indra/newview/skins/default/xui/es/panel_preferences_setup.xml b/indra/newview/skins/default/xui/es/panel_preferences_setup.xml index 967626b8d5..88f5ba42b5 100644 --- a/indra/newview/skins/default/xui/es/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/es/panel_preferences_setup.xml @@ -1,32 +1,49 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Dispositivos y Cámara" name="Input panel"> - <text name=" Mouselook Options:"> +<panel label="Configurar" name="Input panel"> + <button bottom_delta="-40" label="Otros dispositivos" name="joystick_setup_button"/> + <text name="Mouselook:"> Vista subjetiva: </text> - <text name=" Mouse Sensitivity:"> - Sensibilidad del ratón: + <text name=" Mouse Sensitivity"> + Sensibilidad del ratón </text> - <check_box label="Invertir el ratón" name="invert_mouse"/> - <text name=" Auto Fly Options:"> - Vuelo: + <check_box label="Invertir" name="invert_mouse"/> + <text name="Network:"> + Red: </text> - <check_box label="Despegar/Aterrizar pulsando RePág/AvPág" name="automatic_fly"/> - <text name=" Camera Options:"> - Opciones de la cámara: + <text name="Maximum bandwidth"> + Ancho de banda máximo </text> - <text name="camera_fov_label" width="218"> - Ãngulo de vista de la cámara: + <text name="text_box2"> + kbps </text> - <slider bottom_delta="-6" width="128" left="326" name="camera_fov" /> - <text name="Camera Follow Distance:" width="218"> - Distancia a la que sigue la cámara: + <check_box label="Personalizar el puerto" name="connection_port_enabled"/> + <spinner label="Nº del puerto:" name="connection_port"/> + <text name="cache_size_label_l"> + Tamaño de la caché </text> - <slider bottom_delta="-6" width="128" left="326" name="camera_offset_scale" /> - <check_box label="Reorientar la cámara al editar" name="edit_camera_movement" tool_tip="Usar la reorientación automática de la cámara al entrar y salir del modo de edición"/> - <check_box label="Reorientar la cámara al modificar la apariencia" name="appearance_camera_movement" tool_tip="Usar la reorientación automática de la cámara mientras se modifica la apariencia"/> - <text name="text2"> - Visualización del avatar: + <text name="text_box5"> + MB </text> - <check_box label="Ver el avatar en vista subjetiva" name="first_person_avatar_visible"/> - <button bottom_delta="-40" label="Configurar el joystick" name="joystick_setup_button"/> + <text name="Cache location"> + Localización de la caché: + </text> + <button label="Elegir" label_selected="Elegir" name="set_cache"/> + <button label="Recuperar" label_selected="Reconfigurar" name="reset_cache"/> + <text name="Web:"> + Web: + </text> + <radio_group name="use_external_browser"> + <radio_item label="Usar mi navegador (IE, Firefox, Safari)" name="external" tool_tip="Usa tu navegador por defecto para ayuda, enlaces web, etc. No es aconsejable si estás a pantalla completa." value="1"/> + <radio_item label="Usar el navegador incorporado" name="internal" tool_tip="Usa el navegador incorporado para ayuda, enlaces web, etc. Este navegador se abre en una nueva ventana dentro de [APP_NAME]." value=""/> + </radio_group> + <check_box label="Activar plugins" name="browser_plugins_enabled"/> + <check_box label="Aceptar las 'cookies'" name="cookies_enabled"/> + <check_box label="Activar Javascript" name="browser_javascript_enabled"/> + <check_box label="Activar web proxy" name="web_proxy_enabled"/> + <text name="Proxy location"> + Localización del proxy: + </text> + <line_editor name="web_proxy_editor" tool_tip="Nombre o dirección IP del proxy que quieres usar"/> + <spinner label="Nº del puerto:" name="web_proxy_port"/> </panel> diff --git a/indra/newview/skins/default/xui/es/panel_preferences_sound.xml b/indra/newview/skins/default/xui/es/panel_preferences_sound.xml index 241f3042fe..2d3c76d215 100644 --- a/indra/newview/skins/default/xui/es/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/es/panel_preferences_sound.xml @@ -1,38 +1,45 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Audio y VÃdeo" name="Preference Media panel"> - <slider label="General" name="System Volume"/> +<panel label="Sonidos" name="Preference Media panel"> + <slider label="Volumen general" name="System Volume"/> + <check_box label="Silenciar cuando minimice" name="mute_when_minimized"/> + <slider label="Botones" name="UI Volume"/> <slider label="Ambiental" name="Wind Volume"/> - <slider label="Sonidos" name="SFX Volume"/> - <slider label="Media" name="Media Volume"/> - <slider label="Interfaz" name="UI Volume"/> - <slider label="Música" name="Music Volume"/> - <slider label="Voz" name="Voice Volume"/> - <text_editor name="voice_unavailable"> - El chat de voz no está disponible - </text_editor> - <check_box label="Activar el chat de voz" name="enable_voice_check"/> - <radio_group name="ear_location"> - <radio_item name="0" label="OÃr el chat desde la posición de la cámara." /> - <radio_item name="1" label="OÃr el chat desde la posición del avatar." /> - </radio_group> - <button label="Configuración de los dispositivos" name="device_settings_btn" width="210" /> - <text name="muting_text"> - Volumen: - </text> - <text name="streaming_prefs_text"> - Preferencias multimedia: + <slider label="Efectos de sonido" name="SFX Volume"/> + <slider label="Música en streaming" name="Music Volume"/> + <check_box label="Activada" name="music_enabled"/> + <slider label="Multimedia" name="Media Volume"/> + <check_box label="Activada" name="enable_media"/> + <slider label="Chat de voz" name="Voice Volume"/> + <check_box label="Activado" name="enable_voice_check"/> + <check_box label="Permitir la ejecución automática de los media" name="media_auto_play_btn" tool_tip="Marcar esto para permitir la ejecución automática de los media"/> + <check_box label="Ejecutar para otros avatares los media anexados" name="media_show_on_others_btn" tool_tip="Al desmarcar esto se esconderán los media anexados a otros avatares cercanos"/> + <text name="voice_chat_settings"> + Configuración del chat de voz </text> - <text name="audio_prefs_text"> - Preferencias de sonido: + <text name="Listen from"> + OÃr desde: </text> - <panel label="Volumen" name="Volume Panel"/> - <check_box label="Si hay música, reproducirla en streaming" name="streaming_music"/> - <check_box label="Si hay media, reproducirlos en streaming" name="streaming_video"/> - <check_box label="Reproducir automáticamente los media" name="auto_streaming_video"/> - <check_box label="Silenciar el sonido al minimizar la ventana" name="mute_when_minimized"/> - <slider label="Efecto Doppler" name="Doppler Effect" label_width="140" width="270" /> - <slider label="Distancia de escucha" name="Distance Factor" label_width="140" width="270" /> - <slider label="Nivel de atenuación" name="Rolloff Factor" label_width="140" width="270" /> - <spinner label="Avisar de transacción de L$ desde" name="L$ Change Threshold" label_width="195" width="259"/> - <spinner label="Avisar del estado de la vida desde" name="Health Change Threshold" label_width="195" width="259"/> + <radio_group name="ear_location"> + <radio_item label="La posición de la cámara" name="0"/> + <radio_item label="La posición del avatar" name="1"/> + </radio_group> + <button label="Dispositivos de entrada y salida" name="device_settings_btn" width="210"/> + <panel label="Configuración de dispositivos" name="device_settings_panel"> + <panel.string name="default_text"> + Por defecto + </panel.string> + <text name="Input"> + Entrada + </text> + <text name="My volume label"> + Mi volumen: + </text> + <slider_bar initial_value="1.0" name="mic_volume_slider" tool_tip="Cambia el volumen usando este deslizable"/> + <text name="wait_text"> + Por favor, espera + </text> + <text name="Output"> + Salida + </text> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/es/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/es/panel_prim_media_controls.xml new file mode 100644 index 0000000000..174922e28e --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_prim_media_controls.xml @@ -0,0 +1,79 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="MediaControls"> + <string name="min_width"> + 300 + </string> + <string name="min_height"> + 75 + </string> + <string name="zoom_medium_padding"> + 1.1 + </string> + <string name="top_world_view_avoid_zone"> + 50 + </string> + <layout_stack name="progress_indicator_area"> + <panel name="media_progress_indicator"> + <progress_bar name="media_progress_bar" tool_tip="Los media se están cargando"/> + </panel> + </layout_stack> + <layout_stack name="media_controls"> + <layout_panel name="back"> + <button name="back_btn" tool_tip="Navegar hacia atrás"/> + </layout_panel> + <layout_panel name="fwd"> + <button name="fwd_btn" tool_tip="Navegar hacia adelante"/> + </layout_panel> + <layout_panel name="home"> + <button name="home_btn" tool_tip="Página inicial"/> + </layout_panel> + <layout_panel name="media_stop"> + <button name="media_stop_btn" tool_tip="Parar los media"/> + </layout_panel> + <layout_panel name="reload"> + <button name="reload_btn" tool_tip="Recargar"/> + </layout_panel> + <layout_panel name="stop"> + <button name="stop_btn" tool_tip="Parar la carga"/> + </layout_panel> + <layout_panel name="play"> + <button name="play_btn" tool_tip="Ejecutar los media"/> + </layout_panel> + <layout_panel name="pause"> + <button name="pause_btn" tool_tip="Pausar los media"/> + </layout_panel> + <layout_panel name="media_address"> + <line_editor name="media_address_url" tool_tip="URL de los media"/> + <layout_stack name="media_address_url_icons"> + <layout_panel> + <icon name="media_whitelist_flag" tool_tip="Lista Blanca activada"/> + </layout_panel> + <layout_panel> + <icon name="media_secure_lock_flag" tool_tip="Navegación segura"/> + </layout_panel> + </layout_stack> + </layout_panel> + <layout_panel name="media_play_position"> + <slider_bar initial_value="0.5" name="media_play_slider" tool_tip="Progreso de la pelÃcula"/> + </layout_panel> + <layout_panel name="skip_back"> + <button name="skip_back_btn" tool_tip="Hacia atrás"/> + </layout_panel> + <layout_panel name="skip_forward"> + <button name="skip_forward_btn" tool_tip="Hacia adelante"/> + </layout_panel> + <layout_panel name="media_volume"> + <button name="media_mute_button" tool_tip="Silenciar este media"/> + <slider name="volume_slider" tool_tip="Volumen de los media"/> + </layout_panel> + <layout_panel name="zoom_frame"> + <button name="zoom_frame_btn" tool_tip="Zoom hacia los media"/> + </layout_panel> + <layout_panel name="close"> + <button name="close_btn" tool_tip="Alejar el zoom"/> + </layout_panel> + <layout_panel name="new_window"> + <button name="new_window_btn" tool_tip="Abrir la URL en el navegador"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_profile.xml b/indra/newview/skins/default/xui/es/panel_profile.xml index 218e03dcce..d725bfe618 100644 --- a/indra/newview/skins/default/xui/es/panel_profile.xml +++ b/indra/newview/skins/default/xui/es/panel_profile.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="panel_profile"> +<panel label="Perfil" name="panel_profile"> <string name="CaptionTextAcctInfo"> [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION] @@ -11,4 +11,42 @@ http://www.secondlife.com/account/partners.php?lang=es </string> <string name="my_account_link_url" value="http://secondlife.com/my/account/index.php?lang=es-ES"/> + <string name="no_partner_text" value="Ninguno"/> + <string name="no_group_text" value="Ninguno"/> + <string name="RegisterDateFormat"> + [REG_DATE] ([AGE]) + </string> + <layout_stack name="layout"> + <layout_panel name="profile_stack"> + <scroll_container name="profile_scroll"> + <panel name="profile_scroll_panel"> + <panel name="second_life_image_panel"> + <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/> + </panel> + <panel name="first_life_image_panel"> + <text name="title_rw_descr_text" value="Mundo real:"/> + </panel> + <text name="title_member_text" value="Residente desde:"/> + <text name="title_acc_status_text" value="Estado de la cuenta:"/> + <text name="title_partner_text" value="Compañero/a:"/> + <panel name="partner_data_panel"> + <name_box initial_value="(obteniendo)" name="partner_text"/> + </panel> + <text name="title_groups_text" value="Grupos:"/> + </panel> + </scroll_container> + </layout_panel> + <layout_panel name="profile_buttons_panel"> + <button label="Añadir como amigo" name="add_friend" tool_tip="Ofrecer amistad a este Residente"/> + <button label="MI" name="im" tool_tip="Abrir una sesión de mensajes instantáneos"/> + <button label="Llamar" name="call" tool_tip="Llamar a este Residente"/> + <button label="Mapa" name="show_on_map_btn" tool_tip="Mostrar al Residente en el mapa"/> + <button label="Teleportar" name="teleport" tool_tip="Ofrecer teleporte"/> + <button label="â–¼" name="overflow_btn" tool_tip="Pagar dinero al Residente o compartir algo del inventario con él"/> + </layout_panel> + <layout_panel name="profile_me_buttons_panel"> + <button label="Editar el perfil" name="edit_profile_btn" tool_tip="Modificar tu información personal"/> + <button label="Modificar la apariencia" name="edit_appearance_btn" tool_tip="Crear o modificar tu apariencia: tu fÃsico, ropas, etc."/> + </layout_panel> + </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/es/panel_profile_view.xml b/indra/newview/skins/default/xui/es/panel_profile_view.xml new file mode 100644 index 0000000000..b556346051 --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_profile_view.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_target_profile"> + <string name="status_online"> + Conectado/a + </string> + <string name="status_offline"> + Desconectado/a + </string> + <text_editor name="user_name" value="(Cargando...)"/> + <text name="status" value="Conectado/a"/> + <tab_container name="tabs"> + <panel label="PERFIL" name="panel_profile"/> + <panel label="DESTACADOS" name="panel_picks"/> + <panel label="NOTAS Y PRIVACIDAD" name="panel_notes"/> + </tab_container> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_region_covenant.xml b/indra/newview/skins/default/xui/es/panel_region_covenant.xml index 220479098b..0a5d7c2786 100644 --- a/indra/newview/skins/default/xui/es/panel_region_covenant.xml +++ b/indra/newview/skins/default/xui/es/panel_region_covenant.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Contrato" name="Covenant"> <text name="estate_section_lbl"> - Estado: + Estado </text> <text name="estate_name_lbl"> Nombre: @@ -22,7 +22,7 @@ Última modificación el miér. 31 de dic. de 1969, 16:00:00 </text> <button label="?" name="covenant_help"/> - <text_editor name="covenant_editor" bottom="-263" height="178" > + <text_editor bottom="-263" height="178" name="covenant_editor"> No se ha aportado un contrato para este estado. </text_editor> <button label="Cambiar" name="reset_covenant"/> @@ -30,11 +30,11 @@ Los cambios en el contrato se mostrarán en todas las parcelas del estado. </text> - <text name="covenant_instructions" bottom_delta="-31" > - Para cambiar el contrato de este estado, arrastre y suelte una nota. + <text bottom_delta="-31" name="covenant_instructions"> + Arrastra y suelta una nota para cambiar el contrato de este estado. </text> <text name="region_section_lbl"> - Región: + Región </text> <text name="region_name_lbl"> Nombre: diff --git a/indra/newview/skins/default/xui/es/panel_region_debug.xml b/indra/newview/skins/default/xui/es/panel_region_debug.xml index a7999cc54d..64162220a6 100644 --- a/indra/newview/skins/default/xui/es/panel_region_debug.xml +++ b/indra/newview/skins/default/xui/es/panel_region_debug.xml @@ -7,11 +7,11 @@ desconocida </text> <check_box label="Desactivar los scripts" name="disable_scripts_check" tool_tip="Descativar todos los scripts en esta región"/> - <button label="?" name="disable_scripts_help" left="215"/> + <button label="?" left="215" name="disable_scripts_help"/> <check_box label="Desactivar las colisiones" name="disable_collisions_check" tool_tip="Desactiva las colisiones (no las de avatares) en esta región"/> - <button label="?" name="disable_collisions_help" left="215"/> + <button label="?" left="215" name="disable_collisions_help"/> <check_box label="Desactivar las propiedades fÃsicas" name="disable_physics_check" tool_tip="Desactiva toda la fÃsica en esta región"/> - <button label="?" name="disable_physics_help" left="215"/> + <button label="?" left="215" name="disable_physics_help"/> <button label="Aplicar" name="apply_btn"/> <text name="objret_text_lbl" width="130"> Devolver el objeto @@ -22,18 +22,18 @@ <line_editor name="target_avatar_name"> (nadie) </line_editor> - <button label="Elegir..." name="choose_avatar_btn"/> + <button label="Elegir" name="choose_avatar_btn"/> <text name="options_text_lbl"> Opciones: </text> - <check_box label="Devolver sólo los objetos con scripts" name="return_scripts" tool_tip="Devolver sólo los objetos que tengan scripts."/> - <check_box label="Devolver sólo los objetos que están en terreno de otro" name="return_other_land" tool_tip="Devolver sólo los objetos que están en terreno de otro"/> - <check_box label="Devolver los objetos de cualquier región de este estado" name="return_estate_wide" tool_tip="Devolver los objetos de todas las regiones que forman este estado"/> + <check_box label="Con scripts" name="return_scripts" tool_tip="Devolver sólo los objetos con scripts"/> + <check_box label="En el terreno de otros" name="return_other_land" tool_tip="Devolver sólo los objetos que están en terreno de otro"/> + <check_box label="En cada región de este estado" name="return_estate_wide" tool_tip="Devolver los objetos de todas las regiones que forman este estado"/> <button label="Devolver" name="return_btn"/> - <button width="280" label="Listar los objetos que colisionan..." name="top_colliders_btn" tool_tip="Lista de los objetos con más posibles colisiones potenciales"/> - <button label="?" name="top_colliders_help" left="297"/> - <button width="280" label="Listar los scripts según su uso..." name="top_scripts_btn" tool_tip="Lista de los objetos que más tiempo emplean ejecutando scripts"/> - <button label="?" name="top_scripts_help" left="297"/> + <button label="Listar los objetos que colisionan..." name="top_colliders_btn" tool_tip="Lista de los objetos con más posibles colisiones potenciales" width="280"/> + <button label="?" left="297" name="top_colliders_help"/> + <button label="Listar los scripts según su uso..." name="top_scripts_btn" tool_tip="Lista de los objetos que más tiempo emplean ejecutando scripts" width="280"/> + <button label="?" left="297" name="top_scripts_help"/> <button label="Reiniciar la región" name="restart_btn" tool_tip="Cuenta atrás de 2 minutos y reiniciar la región"/> <button label="?" name="restart_help"/> <button label="Retrasar el reinicio" name="cancel_restart_btn" tool_tip="Retrasar una hora el reinicio de la región"/> diff --git a/indra/newview/skins/default/xui/es/panel_region_estate.xml b/indra/newview/skins/default/xui/es/panel_region_estate.xml index f16ec89cb0..c51c3815d1 100644 --- a/indra/newview/skins/default/xui/es/panel_region_estate.xml +++ b/indra/newview/skins/default/xui/es/panel_region_estate.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Estado" name="Estate"> <text name="estate_help_text"> - Los cambios en las configuraciones de esta -pestaña afectarán a todas las regiones del estado. + En esta pestaña, los cambios en la configuración afectarán a todas las regiones del estado. </text> <text name="estate_text"> Estado: @@ -11,7 +10,7 @@ pestaña afectarán a todas las regiones del estado. (desconocido) </text> <text name="owner_text"> - Propietario: + Propietario del Estado: </text> <text name="estate_owner"> (desconocido) @@ -24,10 +23,10 @@ pestaña afectarán a todas las regiones del estado. <check_box label="Permitir el acceso público" name="externally_visible_check"/> <button label="?" name="externally_visible_help"/> <text name="Only Allow"> - Impedir el acceso a Residentes... + Restringir el acceso a cuentas verificadas por: </text> - <check_box label="sin información de pago archivada" name="limit_payment" tool_tip="Impedir el acceso a los residentes no identificados."/> - <check_box label="que no han verificado si son adultos" name="limit_age_verified" tool_tip="Impedir el acceso a residentes que no hayan verificado su edad. Para más información, vea support.secondlife.com"/> + <check_box label="Información de pago aportada" name="limit_payment" tool_tip="Expulsa a los Residentes no identificados."/> + <check_box label="Verificación de la edad" name="limit_age_verified" tool_tip="Expulsa a los Residentes que no hayan verificado su edad. Más información en [SUPPORT_SITE]."/> <check_box label="Permitir el chat de voz" name="voice_chat_check"/> <button label="?" name="voice_chat_help"/> <check_box label="Permitir el teleporte a cualquier punto" name="allow_direct_teleport"/> @@ -40,7 +39,7 @@ pestaña afectarán a todas las regiones del estado. </string> <button label="?" name="abuse_email_address_help"/> <button label="Aplicar" name="apply_btn"/> - <button label="Echar usuarios del estado..." name="kick_user_from_estate_btn"/> + <button label="Expulsar a un Residente del Estado..." name="kick_user_from_estate_btn"/> <button label="Enviar un mensaje al estado..." name="message_estate_btn"/> <text name="estate_manager_label"> Administradores del estado: diff --git a/indra/newview/skins/default/xui/es/panel_region_general.xml b/indra/newview/skins/default/xui/es/panel_region_general.xml index ca8da6ccaf..fe7f51c74e 100644 --- a/indra/newview/skins/default/xui/es/panel_region_general.xml +++ b/indra/newview/skins/default/xui/es/panel_region_general.xml @@ -19,35 +19,25 @@ desconocido </text> <check_box label="No permitir modificar el terreno" name="block_terraform_check"/> - <button label="?" name="terraform_help"/> <check_box label="Prohibir volar" name="block_fly_check"/> - <button label="?" name="fly_help"/> <check_box label="Permitir el daño" name="allow_damage_check"/> - <button label="?" name="damage_help"/> <check_box label="Impedir los 'empujones'" name="restrict_pushobject"/> - <button label="?" name="restrict_pushobject_help"/> <check_box label="Permitir la reventa del terreno" name="allow_land_resell_check"/> - <button label="?" name="land_resell_help"/> <check_box label="Permitir unir/dividir el terreno" name="allow_parcel_changes_check"/> - <button label="?" name="parcel_changes_help"/> - <check_box label="Bloquear el mostrar el terreno en la búsqueda." name="block_parcel_search_check" tool_tip="Permitir que la gente vea esta región y sus parcelas en los resultados de la búsqueda."/> - <button label="?" name="parcel_search_help"/> - <spinner label="Nº máximo de avatares" name="agent_limit_spin" label_width="120" width="180"/> - <button label="?" name="agent_limit_help"/> - <spinner label="Plus de objetos" name="object_bonus_spin" label_width="120" width="180"/> - <button label="?" name="object_bonus_help"/> + <check_box label="Bloquear el mostrar el terreno en la búsqueda" name="block_parcel_search_check" tool_tip="Permitir que la gente vea esta región y sus parcelas en los resultados de la búsqueda."/> + <spinner label="Nº máximo de avatares" label_width="120" name="agent_limit_spin" width="180"/> + <spinner label="Plus de objetos" label_width="120" name="object_bonus_spin" width="180"/> <text label="Calificación" name="access_text"> Calificación: </text> - <combo_box label="'Mature'" name="access_combo"> - <combo_box.item label="'Adult'" name="Adult"/> - <combo_box.item label="'Mature'" name="Mature"/> - <combo_box.item label="'PG'" name="PG"/> - </combo_box> - <button label="?" name="access_help"/> + <icons_combo_box label="Moderado" name="access_combo"> + <icons_combo_box.item label="Adulto" name="Adult" value="42"/> + <icons_combo_box.item label="Moderado" name="Mature" value="21"/> + <icons_combo_box.item label="General" name="PG" value="13"/> + </icons_combo_box> <button label="Aplicar" name="apply_btn"/> - <button label="Teleportar a su Base a un usuario..." name="kick_btn"/> - <button label="Teleportar a su Base a todos los usuarios..." name="kick_all_btn"/> - <button label="Enviar un mensaje a toda la región..." name="im_btn" width="250" /> + <button label="Teleportar a su Base a un Residente..." name="kick_btn"/> + <button label="Teleportar a sus Bases a todos los Residentes..." name="kick_all_btn"/> + <button label="Enviar un mensaje a toda la región..." name="im_btn" width="250"/> <button label="Administrar el Punto de Teleporte..." name="manage_telehub_btn" width="210"/> </panel> diff --git a/indra/newview/skins/default/xui/es/panel_region_general_layout.xml b/indra/newview/skins/default/xui/es/panel_region_general_layout.xml new file mode 100644 index 0000000000..9ff88e2f79 --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_region_general_layout.xml @@ -0,0 +1,43 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Región" name="General"> + <text name="region_text_lbl"> + Región: + </text> + <text name="region_text"> + desconocida + </text> + <text name="version_channel_text_lbl"> + Versión: + </text> + <text name="version_channel_text"> + desconocida + </text> + <text name="region_type_lbl"> + Tipo: + </text> + <text name="region_type"> + desconocido + </text> + <check_box label="No permitir modificar el terreno" name="block_terraform_check"/> + <check_box label="Prohibir volar" name="block_fly_check"/> + <check_box label="Permitir el daño" name="allow_damage_check"/> + <check_box label="Impedir los 'empujones'" name="restrict_pushobject"/> + <check_box label="Permitir la reventa del terreno" name="allow_land_resell_check"/> + <check_box label="Permitir unir/dividir el terreno" name="allow_parcel_changes_check"/> + <check_box label="Bloquear el mostrar el terreno en la búsqueda" name="block_parcel_search_check" tool_tip="Permite que la gente vea esta región y sus parcelas en los resultados de la búsqueda"/> + <spinner label="Nº máximo de avatares" name="agent_limit_spin"/> + <spinner label="Plus de objetos" name="object_bonus_spin"/> + <text label="Calificación" name="access_text"> + Calificación: + </text> + <combo_box label="Moderado" name="access_combo"> + <combo_box.item label="Adulto" name="Adult"/> + <combo_box.item label="Moderado" name="Mature"/> + <combo_box.item label="General" name="PG"/> + </combo_box> + <button label="Aplicar" name="apply_btn"/> + <button label="Teleportar a su Base a un Residente..." name="kick_btn"/> + <button label="Teleportar a sus Bases a todos los Residentes..." name="kick_all_btn"/> + <button label="Enviar un mensaje a toda la región..." name="im_btn"/> + <button label="Administrar el Punto de Teleporte..." name="manage_telehub_btn"/> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_region_texture.xml b/indra/newview/skins/default/xui/es/panel_region_texture.xml index 5540358f97..047e8f2f30 100644 --- a/indra/newview/skins/default/xui/es/panel_region_texture.xml +++ b/indra/newview/skins/default/xui/es/panel_region_texture.xml @@ -25,16 +25,16 @@ Rangos de la elevación de la textura </text> <text name="height_text_lbl6"> - Suroeste + Noroeste </text> <text name="height_text_lbl7"> - Noroeste + Noreste </text> <text name="height_text_lbl8"> - Sureste + Suroeste </text> <text name="height_text_lbl9"> - Noreste + Sureste </text> <spinner label="Baja" name="height_start_spin_0"/> <spinner label="Baja" name="height_start_spin_1"/> @@ -48,7 +48,7 @@ Estos valores representan la gama de mezclas para las texturas superiores. </text> <text name="height_text_lbl11"> - Midiendo en metros, el valor BAJA es la altura MÃXIMA de la textura #1, + Midiendo en metros, el valor BAJA es la altura MÃXIMA de la textura #1, y el valor ALTA es la altura MÃNIMA de la textura #4. </text> <text name="height_text_lbl12"> y el valor ALTA es la altura MÃNIMA de la textura #4. diff --git a/indra/newview/skins/default/xui/es/panel_script_ed.xml b/indra/newview/skins/default/xui/es/panel_script_ed.xml new file mode 100644 index 0000000000..c73db729fe --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_script_ed.xml @@ -0,0 +1,43 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="script panel"> + <panel.string name="loading"> + Cargando... + </panel.string> + <panel.string name="can_not_view"> + No puedes ver ni editar este script. Ha sido configurado como "no copiable". Necesitas todos los permisos para ver o editar un script que está dentro de un objeto. + </panel.string> + <panel.string name="public_objects_can_not_run"> + Los objetos públicos no pueden ejecutar scripts + </panel.string> + <panel.string name="script_running"> + Ejecutándose + </panel.string> + <panel.string name="Title"> + Script: [NAME] + </panel.string> + <text_editor name="Script Editor"> + Cargando... + </text_editor> + <button label="Guardar" label_selected="Guardar" name="Save_btn"/> + <combo_box label="Insertar..." name="Insert..."/> + <menu_bar name="script_menu"> + <menu label="Archivo" name="File"> + <menu_item_call label="Guardar" name="Save"/> + <menu_item_call label="Deshacer todos los cambios" name="Revert All Changes"/> + </menu> + <menu label="Editar" name="Edit"> + <menu_item_call label="Deshacer" name="Undo"/> + <menu_item_call label="Rehacer" name="Redo"/> + <menu_item_call label="Cortar" name="Cut"/> + <menu_item_call label="Copiar" name="Copy"/> + <menu_item_call label="Pegar" name="Paste"/> + <menu_item_call label="Seleccionar todo" name="Select All"/> + <menu_item_call label="Deseleccionar" name="Deselect"/> + <menu_item_call label="Buscar / Reemplazar..." name="Search / Replace..."/> + </menu> + <menu label="Ayuda" name="Help"> + <menu_item_call label="Ayuda..." name="Help..."/> + <menu_item_call label="Ayuda de palabras clave..." name="Keyword Help..."/> + </menu> + </menu_bar> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_script_limits_my_avatar.xml b/indra/newview/skins/default/xui/es/panel_script_limits_my_avatar.xml new file mode 100644 index 0000000000..9334d58af2 --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_script_limits_my_avatar.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="MI AVATAR" name="script_limits_my_avatar_panel"> + <text name="script_memory"> + Uso de scripts en el avatar + </text> + <text name="loading_text"> + Cargando... + </text> + <scroll_list name="scripts_list"> + <scroll_list.columns label="Tamaño (kb)" name="size"/> + <scroll_list.columns label="URLs" name="urls"/> + <scroll_list.columns label="Nombre del objeto" name="name"/> + <scroll_list.columns label="Localización" name="location"/> + </scroll_list> + <button label="Actualizar la lista" name="refresh_list_btn"/> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_script_limits_region_memory.xml b/indra/newview/skins/default/xui/es/panel_script_limits_region_memory.xml new file mode 100644 index 0000000000..37dc0a576c --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_script_limits_region_memory.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="MEMORIA DE LA REGIÓN" name="script_limits_region_memory_panel"> + <text name="script_memory"> + Memoria de los scripts de la parcela + </text> + <text name="loading_text"> + Cargando... + </text> + <scroll_list name="scripts_list"> + <scroll_list.columns label="Tamaño (kb)" name="size"/> + <scroll_list.columns label="URLs" name="urls"/> + <scroll_list.columns label="Nombre del objeto" name="name"/> + <scroll_list.columns label="Propietario del objeto" name="owner"/> + <scroll_list.columns label="Parcela" name="parcel"/> + <scroll_list.columns label="Localización" name="location"/> + </scroll_list> + <button label="Actualizar la lista" name="refresh_list_btn"/> + <button label="Realzar" name="highlight_btn"/> + <button label="Devolver" name="return_btn"/> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_side_tray.xml b/indra/newview/skins/default/xui/es/panel_side_tray.xml new file mode 100644 index 0000000000..cf5afb3cd1 --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_side_tray.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- Side tray cannot show background because it is always + partially on screen to hold tab buttons. --> +<side_tray name="sidebar"> + <sidetray_tab description="Manejar la barra lateral." name="sidebar_openclose" tab_title="Barra lateral"/> + <sidetray_tab description="Inicio." name="sidebar_home" tab_title="Inicio"> + <panel label="Inicio" name="panel_home"/> + </sidetray_tab> + <sidetray_tab description="Edita tu perfil público y tus destacados." name="sidebar_me" tab_title="Mi perfil"> + <panel_container name="panel_container"> + <panel label="Yo" name="panel_me"/> + </panel_container> + </sidetray_tab> + <sidetray_tab description="Encuentra a tus amigos, contactos y gente que esté cerca." name="sidebar_people" tab_title="Gente"> + <panel_container name="panel_container"> + <panel label="Perfil del grupo" name="panel_group_info_sidetray"/> + <panel label="Residentes y objetos ignorados" name="panel_block_list_sidetray"/> + </panel_container> + </sidetray_tab> + <sidetray_tab description="Encontrar lugares donde ir o que ya visitaste." label="Lugares" name="sidebar_places" tab_title="Lugares"> + <panel label="Lugares" name="panel_places"/> + </sidetray_tab> + <sidetray_tab description="Mira tu inventario." name="sidebar_inventory" tab_title="Mi inventario"> + <panel label="Modificar el inventario" name="sidepanel_inventory"/> + </sidetray_tab> + <sidetray_tab description="Cambia tu apariencia y tu 'look' actual." name="sidebar_appearance" tab_title="Mi apariencia"> + <panel label="Modificar la apariencia" name="sidepanel_appearance"/> + </sidetray_tab> +</side_tray> diff --git a/indra/newview/skins/default/xui/es/panel_side_tray_tab_caption.xml b/indra/newview/skins/default/xui/es/panel_side_tray_tab_caption.xml new file mode 100644 index 0000000000..3633b0ccaa --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_side_tray_tab_caption.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="sidetray_tab_panel"> + <text name="sidetray_tab_title" value="Panel lateral"/> + <button name="show_help" tool_tip="Ver ayuda"/> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_stand_stop_flying.xml b/indra/newview/skins/default/xui/es/panel_stand_stop_flying.xml new file mode 100644 index 0000000000..350aec9c69 --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_stand_stop_flying.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- Width and height of this panel should be synchronized with "panel_modes" in the floater_moveview.xml--> +<panel name="panel_stand_stop_flying"> + <button label="Levantarme" name="stand_btn" tool_tip="Pulsa aquà para levantarte."/> + <button label="Dejar de volar" name="stop_fly_btn" tool_tip="Dejar de volar"/> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_status_bar.xml b/indra/newview/skins/default/xui/es/panel_status_bar.xml index 31cde7d237..13ed1acf0b 100644 --- a/indra/newview/skins/default/xui/es/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/es/panel_status_bar.xml @@ -1,38 +1,33 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="status"> - <text name="ParcelNameText" tool_tip="Nombre de la parcela en la que está. Pulse Acerca del terreno."> - el nombre de la parcela va aquà - </text> - <text name="BalanceText" tool_tip="Saldo de su cuenta"> - Cargando... - </text> - <button label="" label_selected="" name="buycurrency" tool_tip="Comprar dinero"/> - <text name="TimeText" tool_tip="Hora actual (costa oeste EE.UU.)"> - 12:00 AM - </text> - <string name="StatBarDaysOfWeek"> + <panel.string name="StatBarDaysOfWeek"> Domingo:Lunes:Martes:Miércoles:Jueves:Viernes:Sábado - </string> - <string name="StatBarMonthsOfYear"> + </panel.string> + <panel.string name="StatBarMonthsOfYear"> Enero:Febrero:Marzo:Abril:Mayo:Junio:Julio:Agosto:Septiembre:Octubre:Noviembre:Diciembre - </string> - <button label="" label_selected="" name="scriptout" tool_tip="Errores y alertas de los scripts"/> - <button label="" label_selected="" name="health" tool_tip="Vida"/> - <text name="HealthText" tool_tip="Vida"> - 100% - </text> - <button label="" label_selected="" name="no_fly" tool_tip="Prohibido volar"/> - <button label="" label_selected="" name="no_build" tool_tip="No se permite Construir/Renderizar"/> - <button label="" label_selected="" name="no_scripts" tool_tip="No se permiten los scripts"/> - <button label="" label_selected="" name="restrictpush" tool_tip="Sin 'empujones'"/> - <button label="" label_selected="" name="status_no_voice" tool_tip="Aquà no está disponible la voz"/> - <button label="" label_selected="" name="buyland" tool_tip="Comprar esta parcela"/> - <line_editor label="Buscar" name="search_editor" tool_tip="Buscar en [SECOND_LIFE]"/> - <button label="" label_selected="" name="search_btn" tool_tip="Buscar en [SECOND_LIFE]"/> - <string name="packet_loss_tooltip"> + </panel.string> + <panel.string name="packet_loss_tooltip"> Pérdida de paquetes - </string> - <string name="bandwidth_tooltip"> + </panel.string> + <panel.string name="bandwidth_tooltip"> Ancho de banda - </string> + </panel.string> + <panel.string name="time"> + [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt] + </panel.string> + <panel.string name="timeTooltip"> + [weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt] + </panel.string> + <panel.string name="buycurrencylabel"> + [AMT] L$ + </panel.string> + <panel name="balance_bg"> + <text name="balance" tool_tip="Mi saldo" value="20 L$"/> + <button label="COMPRAR L$" name="buyL" tool_tip="Pulsa para comprar más L$"/> + </panel> + <text name="TimeText" tool_tip="Hora actual (PacÃfico)"> + 24:00 AM PST + </text> + <button name="media_toggle_btn" tool_tip="Iniciar/Parar todos los media (música, vÃdeo, páginas web)"/> + <button name="volume_btn" tool_tip="Control general del volumen"/> </panel> diff --git a/indra/newview/skins/default/xui/es/panel_teleport_history.xml b/indra/newview/skins/default/xui/es/panel_teleport_history.xml new file mode 100644 index 0000000000..a0ee30e8f6 --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_teleport_history.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="Teleport History"> + <accordion name="history_accordion"> + <accordion_tab name="today" title="Hoy"/> + <accordion_tab name="yesterday" title="Ayer"/> + <accordion_tab name="2_days_ago" title="Hace 2 dÃas"/> + 5 + <accordion_tab name="3_days_ago" title="Hace 3 dÃas"/> + <accordion_tab name="4_days_ago" title="Hace 4 dÃas"/> + <accordion_tab name="5_days_ago" title="Hace 5 dÃas"/> + <accordion_tab name="6_days_and_older" title="6 y más dÃas"/> + <accordion_tab name="1_month_and_older" title="1 mes y más"/> + <accordion_tab name="6_months_and_older" title="6 y más meses"/> + </accordion> + <panel name="bottom_panel"> + <button name="gear_btn" tool_tip="Ver más opciones"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_teleport_history_item.xml b/indra/newview/skins/default/xui/es/panel_teleport_history_item.xml new file mode 100644 index 0000000000..10b37b6880 --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_teleport_history_item.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="teleport_history_item"> + <button name="profile_btn" tool_tip="Mostrar la información del Ãtem"/> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_voice_effect.xml b/indra/newview/skins/default/xui/es/panel_voice_effect.xml new file mode 100644 index 0000000000..2cc36b7cae --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_voice_effect.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_voice_effect"> + <string name="no_voice_effect"> + Sin transformación de voz + </string> + <string name="preview_voice_effects"> + Probar transformación de voz â–¶ + </string> + <string name="get_voice_effects"> + Obtener transformación de voz â–¶ + </string> + <combo_box name="voice_effect" tool_tip="Selecciona un efecto de transformación de voz para cambiar tu voz."> + <combo_box.item label="Sin transformación de voz" name="no_voice_effect"/> + </combo_box> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_world_map.xml b/indra/newview/skins/default/xui/es/panel_world_map.xml index 7cb4009422..b1dea02210 100644 --- a/indra/newview/skins/default/xui/es/panel_world_map.xml +++ b/indra/newview/skins/default/xui/es/panel_world_map.xml @@ -1,5 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="world_map"> + <panel.string name="Loading"> + Cargando... + </panel.string> + <panel.string name="InvalidLocation"> + Localización inválida + </panel.string> <panel.string name="world_map_north"> N </panel.string> @@ -24,6 +30,12 @@ <panel.string name="world_map_northwest"> NO </panel.string> + <panel.string name="world_map_person"> + 1 persona + </panel.string> + <panel.string name="world_map_people"> + [NUMBER] personas + </panel.string> <text label="N" name="floater_map_north" text="N"> N </text> diff --git a/indra/newview/skins/default/xui/es/role_actions.xml b/indra/newview/skins/default/xui/es/role_actions.xml index da9a820eb8..14df3d67ca 100644 --- a/indra/newview/skins/default/xui/es/role_actions.xml +++ b/indra/newview/skins/default/xui/es/role_actions.xml @@ -1,199 +1,76 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <role_actions> - <action_set - description="Estas capacidades incluyen poderes para añadir o quitar miembros del grupo, y para pemitir que se sumen nuevos miembros sin necesidad de invitación." - name="Membership"> - <action description="Invitar personas al grupo" - longdescription="Invitar a personas al grupo usando el botón 'Invitar a un nuevo miembro' en Miembros y Roles > subpestaña Miembros." - name="member invite" value="1" /> - <action description="Expulsar a miembros del grupo" - longdescription="Expulsar a miembros del grupo usando el botón 'Expulsar del grupo' en Miembros y Roles > subpestaña Miembros. Un propietario puede expulsar a cualquiera, excepto a otro propietario. Si usted no es un propietario, un miembro del grupo puede expulsarle sólo si tiene concedida tal capacidad especÃfica. Para quitar capacidades a los miembros, usted debe tener la de 'Quitar capacidades a miembros'." - name="member eject" value="2" /> - <action - description="Activar/desactivar 'Inscripción libre' y cambiar 'Cuota de inscripción'" - longdescription="Activar/desactivar 'Inscripción libre' para permitir o no que se unan sin invitación nuevos miembros, y cambiar la 'Cuota de inscripción' en la sección Preferencias del grupo de la pestaña General." - name="member options" value="3" /> + <action_set description="Estas capacidades incluyen poderes para añadir o quitar miembros del grupo, y para pemitir que se sumen nuevos miembros sin necesidad de invitación." name="Membership"> + <action description="Invitar personas al grupo" longdescription="Invitar a gente a este grupo usando el botón 'Invitar' en la sección Roles > pestaña Miembros." name="member invite" value="1"/> + <action description="Expulsar a miembros del grupo" longdescription="Expulsar a miembros de este grupo usando el botón 'Expulsar' en la sección Roles > pestaña Miembros. Un propietario puede expulsar a cualquiera, excepto a otro propietario. Si no eres un propietario, un miembro puede ser expulsado única y exclusivamente si está en el rol de Cualquiera y NO en otros roles. Para quitar roles a los miembros, tienes que tener la capacidad de 'Quitar roles a los miembros'." name="member eject" value="2"/> + <action description="Cambiar 'Inscripción abierta' y 'Cuota de inscripción'" longdescription="En la sección General, cambiar la 'Inscripción abierta' -que permite entrar al grupo sin invitación- y la 'Cuota de inscripción'." name="member options" value="3"/> </action_set> - <action_set - description="Estas habilidades incluyen el poder añadir, quitar y cambiar roles, asignarlos a miembros, y darles capacidades." - name="Roles"> - <action description="Crear nuevos roles" - longdescription="Crear nuevos roles en Miembros y Roles > pestaña Roles > botón Crear un rol nuevo." - name="role create" value="4" /> - <action description="Borrar roles" - longdescription="Borrar roles en Miembros y Roles > pestaña Roles > botón Eliminar el rol." - name="role delete" value="5" /> - <action description="Cambiar nombres de roles, tÃtulos y descripciones" - longdescription="Cambiar el nombre del rol que elija, su etiqueta y descripción en la parte media de la pestaña Miembros y Roles." - name="role properties" value="6" /> - <action description="Designar miembros para el rol del asignador" - longdescription="Designar miembros para un rol en la sección Roles asignados de la pestaña Miembros y Roles > subpestaña Miembros. Un miembro con este poder sólo puede asignar a otros el rol que él posee." - name="role assign member limited" value="7" /> - <action description="Designar miembros para cualquier rol" - longdescription="Designar miembros para cualquier rol en la sección Roles asignados de la pestaña Miembros y Roles > subpestaña Miembros. *AVISO* Todos los miembros con esta capacidad podrán asignarse a sà mismos -y a otros miembros- roles con mayores poderes de los que actualmente tienen. Potencialmente, podrÃan elevarse hasta poderes cercanos a los del propietario. Asegúrese de lo que está haciendo antes de otorgar esta capacidad." - name="role assign member" value="8" /> - <action description="Quitar capacidades a los miembros" - longdescription="Quitar capacidades a los miembros en la sección Capacidades asignadas de Miembros y Roles > subpestaña Roles. No se pueden quitar a los Propietarios." - name="role remove member" value="9" /> - <action description="Añadir o quitar capacidades a los roles" - longdescription="Añadir o quitar capacidades a los roles en la sección Capacidades asignadas de Miembros y Roles > subpestaña Roles. *AVISO* Todos los miembros con esta capacidad podrán asignarse a sà mismos -y a otros miembros- roles con mayores poderes de los que actualmente tienen. Potencialmente, podrÃan elevarse hasta poderes cercanos a los del propietario. Asegúrese de lo que está haciendo antes de otorgar esta capacidad." - name="role change actions" value="10" /> + <action_set description="Estas habilidades incluyen el poder añadir, quitar y cambiar roles, asignarlos a miembros, y darles capacidades." name="Roles"> + <action description="Crear nuevos roles" longdescription="Crear roles nuevos en la sección Roles > pestaña Roles." name="role create" value="4"/> + <action description="Borrar roles" longdescription="Borrar roles en la sección Roles > pestaña Roles." name="role delete" value="5"/> + <action description="Cambiar el nombre, la etiqueta y la descripción de los roles, asà como qué miembros se muestran públicamente en ese rol" longdescription="Cambiar el nombre, la etiqueta y la descripción de los roles, asà como qué miembros se muestran públicamente en ese rol. Se hace seleccionando el rol, dentro de la sección Roles > pestaña Roles." name="role properties" value="6"/> + <action description="Designar miembros para el rol del asignador" longdescription="Añadir miembros a los roles en la lista de Roles asignados (sección Roles > pestaña Miembros). Un miembro con esta capacidad sólo puede añadir miembros a los roles que tenga él mismo." name="role assign member limited" value="7"/> + <action description="Designar miembros para cualquier rol" longdescription="Designar miembros para cualquier rol en la lista de Roles asignados (sección Roles > pestaña Miembros). *AVISO* Todos los miembros que tengan un rol con esta capacidad podrán asignarse a sà mismos -y a otros miembros que no sean los propietarios- roles con mayores poderes de los que actualmente tienen. Potencialmente, podrÃan elevarse hasta poderes cercanos a los del propietario. Asegúrate de lo que estás haciendo antes de otorgar esta capacidad." name="role assign member" value="8"/> + <action description="Quitar capacidades a los miembros" longdescription="Quitar miembros de los roles en la lista de roles asignados (sección Roles > pestaña Miembros). No se puede quitar a los Propietarios." name="role remove member" value="9"/> + <action description="Añadir o quitar capacidades a los roles" longdescription="Asignar y quitar capacidades a cada rol en la lista de capacidades permitidas (sección Roles > pestaña Roles). *AVISO* Todos los miembros que tengan un rol con esta capacidad podrán asignarse a sà mismos -y a otros miembros que no sean los propietarios- todas las capacidades. Potencialmente, podrÃan elevarse hasta poderes cercanos a los del propietario. Asegúrate de lo que estás haciendo antes de otorgar esta capacidad." name="role change actions" value="10"/> </action_set> - <action_set - description="Estas capacidades incluyen poderes para modificar la identidad del grupo, como su visibilidad pública, su carta o su emblema." - name="Group Identity"> - <action - description="Cambiar la carta, emblema, 'Mostrar en la búsqueda', y qué miembros serán visibles en la información del grupo" - longdescription="Cambiar la carta, emblema, 'Mostrar en la búsqueda', y qué miembros serán visibles en la información del grupo de la pestaña General." - name="group change identity" value="11" /> + <action_set description="Estas capacidades incluyen poderes para modificar la identidad del grupo, como su visibilidad pública, su carta o su emblema." name="Group Identity"> + <action description="Cambiar la carta, emblema, 'Mostrar en la búsqueda', y qué miembros serán visibles en la información del grupo" longdescription="Cambia la carta, emblema y 'Mostrar en la búsqueda'. Se hace en la sección General." name="group change identity" value="11"/> </action_set> - <action_set - description="Estas capacidades incluyen poderes para transferir, modificar y vender terrenos del grupo. Vea el menú Mundo > Acerca del terreno, o pulse con el botón derecho en el terreno y seleccione 'Acerca del terreno...', o pulse en la información de la parcela en la barra superior del menú." - name="Parcel Management"> - <action description="Transferir y comprar terreno para el grupo" - longdescription="Transferir y comprar terreno para el grupo. Se hace en Acerca del terreno > pestaña General." - name="land deed" value="12" /> - <action description="Abandonar al terreno a favor de Governor Linden" - longdescription="Abandonar al terreno a favor de Governor Linden. *AVISO* Todos los miembros con esta capacidad pueden abandonar terreno perteneciente al grupo en Acerca del terreno > pestaña General, devolviendo la posesión a Linden ¡gratuitamente! Asegúrese de lo que está haciendo antes de otorgar esta capacidad." - name="land release" value="13" /> - <action description="Vender terreno" - longdescription="Vender terreno. *AVISO* Todos los miembros con esta capacidad pueden vender terreno perteneciente al grupo -¡en la forma en que quieran!- en Acerca del terreno > pestaña General. Asegúrese de lo que está haciendo antes de otorgar esta capacidad." - name="land set sale info" value="14" /> - <action description="Dividir y unir parcelas" - longdescription="Dividir y unir parcelas. Se hace pulsando con el botón derecho en el terreno, 'Modificar el terreno', y dibujando en el terreno con el ratón lo que se quiere seleccionar. Para dividir, elija la parte que quiere separar y pulse 'Subdividir...'. Para unir, seleccione dos o más parcelas contiguas y pulse 'Unir...'. " - name="land divide join" value="15" /> + <action_set description="Estas capacidades incluyen poder para transferir, modificar y vender terrenos del grupo. Para ver la ventana Acerca del terreno, pulsa con el botón derecho en el terreno y selecciona 'Acerca del terreno', o pulsa en el signo 'i' de la barra de navegación." name="Parcel Management"> + <action description="Transferir y comprar terreno para el grupo" longdescription="Transferir y comprar terreno para el grupo. Se hace en Acerca del terreno > pestaña General." name="land deed" value="12"/> + <action description="Abandonar al terreno a favor de Governor Linden" longdescription="Abandonar al terreno a favor de Governor Linden. *AVISO* Todos los miembros con esta capacidad pueden abandonar terreno perteneciente al grupo en Acerca del terreno > pestaña General, devolviendo la posesión a Linden ¡gratuitamente! Asegúrese de lo que está haciendo antes de otorgar esta capacidad." name="land release" value="13"/> + <action description="Vender terreno" longdescription="Vender terreno. *AVISO* Todos los miembros con esta capacidad pueden vender terreno perteneciente al grupo -¡en la forma en que quieran!- en Acerca del terreno > pestaña General. Asegúrese de lo que está haciendo antes de otorgar esta capacidad." name="land set sale info" value="14"/> + <action description="Dividir y unir parcelas" longdescription="Dividir y unir parcelas. Se hace pulsando con el botón derecho en el terreno, 'Modificar el terreno', y dibujando en el terreno con el ratón lo que se quiere seleccionar. Para dividir, elige la parte que quieres separar y pulsa 'Dividir'. Para unir, selecciona dos o más parcelas contiguas y pulsa 'Unir'." name="land divide join" value="15"/> </action_set> - <action_set - description="Estas capacidades incluyen poder cambiar el nombre de la parcela y su configuración, asà como si se muestra en Buscar y las opciones del punto de llegada y el de teleporte." - name="Parcel Identity"> - <action - description="Activar/desactivar 'Mostrar en Buscar' y el definir la categorÃa" - longdescription="Activar/desactivar el 'Mostrar en Buscar' y en que categorÃa se mostrará en Acerca del terreno > pestaña Opciones." - name="land find places" value="17" /> - <action - description="Cambiar el nombre de la parcela, la descripción, y la configuración de 'Mostrar en Buscar'" - longdescription="Cambiar el nombre y descripción de la parcela, y la configuración de 'Mostrar en Buscar'. Se hace en Acerca del terreno > pestaña Opciones." - name="land change identity" value="18" /> - <action description="Definir los puntos de llegada y teleporte" - longdescription="En una parcela perteneciente al grupo, los miembros con un rol que tenga esta capacidad pueden precisar el punto de llegada o el de teleporte. Se hace en Acerca del terreno > pestaña Opciones." - name="land set landing point" value="19" /> + <action_set description="Estas capacidades incluyen poder cambiar el nombre de la parcela y su configuración, asà como si se muestra en Buscar y las opciones del punto de llegada y el de teleporte." name="Parcel Identity"> + <action description="Cambiar 'Mostrar el sitio en Buscar' y configurar la categorÃa" longdescription="Cambia 'Mostrar el sitio en Buscar' y el configurar la categorÃa de una parcela en Acerca del terreno > pestaña Opciones." name="land find places" value="17"/> + <action description="Cambiar el nombre de la parcela, su descripción, y la configuración de 'Mostrar el sitio en Buscar'" longdescription="Cambia el nombre de la parcela, su descripción, y la configuración de 'Mostrar el sitio en Buscar'. Se hace en Acerca del terreno > pestaña Opciones." name="land change identity" value="18"/> + <action description="Definir los puntos de llegada y teleporte" longdescription="En una parcela perteneciente al grupo, los miembros con un rol que tenga esta capacidad pueden precisar el punto de llegada o el de teleporte. Se hace en Acerca del terreno > pestaña Opciones." name="land set landing point" value="19"/> </action_set> - <action_set - description="Estas capacidades incluyen poderes que afectan a las opciones de la parcela, como 'Crear objetos', 'Editar el terreno' y las configuraciones de la música y los media." - name="Parcel Settings"> - <action description="Cambiar música y configuraciones de los media" - longdescription="Cambiar la música en streaming y las configuraciones de vÃdeo en Acerca del terreno > pestaña Media." - name="land change media" value="20" /> - <action description="Activar/desactivar 'Editar el terreno'" - longdescription="Activar/desactivar 'Editar el terreno'. *AVISO* Acerca del terreno > pestaña Opciones > Editar el terreno, permite a cualquiera alterar la forma de su terreno y sustituir y mover plantas Linden. Asegúrese de lo que está haciendo antes de otorgar esta capacidad. La edición del terreno se activada/desactiva en Acerca del terreno > pestaña Opciones." - name="land edit" value="21" /> - <action - description="Activar/desactivar varios Ãtems de Acerca del terreno > Opciones" - longdescription="Activar/desactivar en un terreno del grupo los Ãtems de Acerca del terreno > pestaña Opciones: 'Seguro (sin daño)', 'Volar', y permitir a otros residentes: 'Crear objetos', 'Editar el terreno', 'Crear hitos', y 'Ejecutar scripts'." - name="land options" value="22" /> + <action_set description="Estas capacidades incluyen poderes que afectan a las opciones de la parcela, como 'Crear objetos', 'Editar el terreno' y las configuraciones de la música y los media." name="Parcel Settings"> + <action description="Cambiar música y configuraciones de los media" longdescription="Cambiar la música en streaming y las configuraciones de vÃdeo en Acerca del terreno > pestaña Media." name="land change media" value="20"/> + <action description="Activar/desactivar 'Editar el terreno'" longdescription="Activar/desactivar 'Editar el terreno'. *AVISO* Acerca del terreno > pestaña Opciones > Editar el terreno, permite a cualquiera alterar la forma de su terreno y sustituir y mover plantas Linden. Asegúrese de lo que está haciendo antes de otorgar esta capacidad. La edición del terreno se activada/desactiva en Acerca del terreno > pestaña Opciones." name="land edit" value="21"/> + <action description="Activar/desactivar varios Ãtems de Acerca del terreno > Opciones" longdescription="Cambia 'Seguro (sin daño)', 'Volar', y el permitir a otros residentes en terrenos propiedad del grupo 'Modificar el terreno', 'Construir', 'Crear hitos' y 'Ejecutat scripts', como aparece en Acerca del terreno > pestaña Opciones." name="land options" value="22"/> </action_set> - <action_set - description="Estas capacidades incluyen poderes que permiten a los miembros rebasar las restricciones de parcelas pertenecientes al grupo." - name="Parcel Powers"> - <action description="Permitir siempre 'Editar el terreno'" - longdescription="Quien tenga un rol con esta capacidad puede editar el terreno de una parcela perteneciente al grupo aunque eso esté desactivado en Acerca del terreno > pestaña Opciones." - name="land allow edit land" value="23" /> - <action description="Permitir siempre 'Volar'" - longdescription="Quien tenga un rol con esta capacidad puede volar sobre una parcela perteneciente al grupo aunque eso esté desactivado en Acerca del terreno > pestaña Opciones." - name="land allow fly" value="24" /> - <action description="Permitir siempre 'Crear objetos'" - longdescription="Quien tenga un rol con esta capacidad puede crear objetos en una parcela perteneciente al grupo aunque eso esté desactivado en Acerca del terreno > pestaña Opciones." - name="land allow create" value="25" /> - <action description="Permitir siempre 'Crear hitos'" - longdescription="Quien tenga un rol con esta capacidad puede crear un hito en una parcela perteneciente al grupo aunque eso esté desactivado en Acerca del terreno > pestaña Opciones." - name="land allow landmark" value="26" /> - <action description="Permitir 'Fijar mi Base aquÃ' en el terreno del grupo" - longdescription="Quien tenga un rol con esta capacidad puede usar el menú Mundo > Fijar mi Base aquà en una parcela transferida al grupo." - name="land allow set home" value="28" /> + <action_set description="Estas capacidades incluyen poderes que permiten a los miembros rebasar las restricciones de parcelas pertenecientes al grupo." name="Parcel Powers"> + <action description="Permitir siempre 'Editar el terreno'" longdescription="Quien tenga un rol con esta capacidad puede editar el terreno de una parcela perteneciente al grupo aunque eso esté desactivado en Acerca del terreno > pestaña Opciones." name="land allow edit land" value="23"/> + <action description="Permitir siempre 'Volar'" longdescription="Quien tenga un rol con esta capacidad puede volar sobre una parcela perteneciente al grupo aunque eso esté desactivado en Acerca del terreno > pestaña Opciones." name="land allow fly" value="24"/> + <action description="Permitir siempre 'Crear objetos'" longdescription="Quien tenga un rol con esta capacidad puede crear objetos en una parcela perteneciente al grupo aunque eso esté desactivado en Acerca del terreno > pestaña Opciones." name="land allow create" value="25"/> + <action description="Permitir siempre 'Crear hitos'" longdescription="Quien tenga un rol con esta capacidad puede crear un hito en una parcela perteneciente al grupo aunque eso esté desactivado en Acerca del terreno > pestaña Opciones." name="land allow landmark" value="26"/> + <action description="Permitir 'Fijar mi Base aquÃ' en el terreno del grupo" longdescription="Los miembros que tengan un rol con esta capacidad pueden usar el menú Mundo > Hitos > Fijar aquà mi Base en una parcela transferida al grupo." name="land allow set home" value="28"/> </action_set> - <action_set - description="Estas capacidades incluyen poderes para permitir o restringir el acceso a parcelas pertenecientes al grupo, incluyendo el congelar y expulsar a residentes." - name="Parcel Access"> - <action description="Administrar las listas de acceso a la parcela" - longdescription="Administre las listas de acceso a la parcela en Acerca del terreno > pestaña Acceso." - name="land manage allowed" value="29" /> - <action description="Administrar la lista de residentes con el acceso prohibido" - longdescription="Administrar la lista de residentes con el acceso prohibido a la parcela en Acerca del terreno > pestaña Acceso." - name="land manage banned" value="30" /> - <action description="Cambiar en las configuraciones de parcela el 'Vender pases a...'" - longdescription="Cambiar la configuración de 'Vender pases a...' en Acerca del terreno > pestaña Acceso." - name="land manage passes" value="31" /> - <action description="Expulsar y congelar residentes en las parcelas" - longdescription="Quien tenga un rol con esta capacidad puede actuar frente a un residente indeseado en una parcela del grupo pulsando con el botón derecho sobre él, Más > y seleccionando 'Expulsar...' o 'Congelar...'." - name="land admin" value="32" /> + <action_set description="Estas capacidades incluyen poderes para permitir o restringir el acceso a parcelas pertenecientes al grupo, incluyendo el congelar y expulsar a residentes." name="Parcel Access"> + <action description="Administrar las listas de acceso a la parcela" longdescription="Administre las listas de acceso a la parcela en Acerca del terreno > pestaña Acceso." name="land manage allowed" value="29"/> + <action description="Administrar la lista de residentes con el acceso prohibido" longdescription="Manejar la lista de expulsados en Acerca del terreno > pestaña Acceso." name="land manage banned" value="30"/> + <action description="Cambiar en la parcela la configuración de 'Vender pases a'" longdescription="Cambia en la parcela la configuración de 'Vender pases a' (Acerca del terreno > pestaña Acceso)." name="land manage passes" value="31"/> + <action description="Expulsar y congelar residentes en las parcelas" longdescription="En una parcela propiedad del grupo, los miembros cuyo rol tengan esta capacidad pueden manejar a residentes no deseados pulsándoles con el botón derecho del ratón para 'Expulsar' o 'Congelar'." name="land admin" value="32"/> </action_set> - <action_set - description="Estas capacidades incluyen poderes que permitan a los miembros devolver objetos y poner y mover plantas Linden. Es útil para que miembros organicen el paisaje, pero debe ser usado con cuidado, ya que no se pueden deshacer esos cambios en los objetos." - name="Parcel Content"> - <action description="Devolver objetos que pertenecen al grupo" - longdescription="Devolver objetos pertenecientes al grupo en parcelas de su propiedad en Acerca del terreno > pestaña Objetos." - name="land return group owned" value="48" /> - <action description="Devolver objetos definidos para el grupo" - longdescription="Devuelva objetos en parcelas pertenecientes al grupo en Acerca del terreno > pestaña Objetos." - name="land return group set" value="33" /> - <action description="Devolver objetos que no pertenecen al grupo" - longdescription="Devuolver objetos que estén en una parcela del grupo y pertenezcan a alguien que no sea del grupo en Acerca del terreno > pestaña Objetos." - name="land return non group" value="34" /> - <action description="Modificar el paisaje usando plantas Linden" - longdescription="La capacidad de modificar el paisaje permite poner y mover árboles Linden, plantas y arbustos. Estos Ãtems están en la 's Biblioteca de su Inventario > carpeta Objetos, o pueden crearse con el botón Construir." - name="land gardening" value="35" /> + <action_set description="Estas capacidades incluyen poderes que permitan a los miembros devolver objetos y poner y mover plantas Linden. Es útil para que miembros organicen el paisaje, pero debe ser usado con cuidado, ya que no se pueden deshacer esos cambios en los objetos." name="Parcel Content"> + <action description="Devolver objetos que pertenecen al grupo" longdescription="Devolver objetos pertenecientes al grupo en parcelas de su propiedad en Acerca del terreno > pestaña Objetos." name="land return group owned" value="48"/> + <action description="Devolver objetos definidos para el grupo" longdescription="Devuelva objetos en parcelas pertenecientes al grupo en Acerca del terreno > pestaña Objetos." name="land return group set" value="33"/> + <action description="Devolver objetos que no pertenecen al grupo" longdescription="Devuolver objetos que estén en una parcela del grupo y pertenezcan a alguien que no sea del grupo en Acerca del terreno > pestaña Objetos." name="land return non group" value="34"/> + <action description="Modificar el paisaje usando plantas Linden" longdescription="Capacidad de poner y mover árboles, plantas y arbustos Linden. Estos Ãtems están en la Biblioteca de tu inventario > carpeta Objetos, o pueden construirse con el menú Construir." name="land gardening" value="35"/> </action_set> - <action_set - description="Estas capacidades incluyen poderes para tranferir, modificar y vender objetos pertenecientes al grupo. Estos cambios se hacen en la pestaña General de la herramienta de edición. Para verlo, pulse en un objeto con el botón derecho y elija Editar. " - name="Object Management"> - <action description="Transferir objetos al grupo" - longdescription="Transferir objetos al grupo en Editar > pestaña General." - name="object deed" value="36" /> - <action description="Manipular (mover, copiar, y modificar) objetos del grupo" - longdescription="Manipular (mover, copiar, y modificar) objetos pertenecientes al grupo en Editar > pestaña General." - name="object manipulate" value="38" /> - <action description="Vender objetos pertenecientes al grupo" - longdescription="Poner a la venta objetos pertenecientes al grupo para venta en Editar > pestaña General." - name="object set sale" value="39" /> + <action_set description="Estas capacidades incluyen poder transferir, modificar y vender objetos propiedad del grupo. Estos cambios se hacen en las Herramientas de construcción > pestaña General. Pulsa un objeto con el botón derecho del ratón y edÃtalo para ver sus configuraciones." name="Object Management"> + <action description="Transferir objetos al grupo" longdescription="Transferir objetos al grupo en las Herramientas de construcción > pestaña General." name="object deed" value="36"/> + <action description="Manipular (mover, copiar, y modificar) objetos del grupo" longdescription="Mover, copiar y modificar objetos pertenecientes al grupo en las Herramientas de construcción > pestaña General." name="object manipulate" value="38"/> + <action description="Vender objetos pertenecientes al grupo" longdescription="Poner a la venta objetos pertenecientes al grupo en las Herramientas de construcción > pestaña General." name="object set sale" value="39"/> </action_set> - <action_set - description="Estas habilidades incluyen poderes para que los miembros paguen deudas del grupo o reciban sus dividendos, y para limitar el acceso al historial de la cuenta del grupo." - name="Accounting"> - <action description="Pagar deudas y recibir dividendos del grupo" - longdescription="Quien tenga un rol con esta capacidad, automáticamente pagará deudas del grupo y recibirá sus dividendos. Esto significa que recibirá una parte de las ventas de terreno de grupo, y que contribuirá a cosas como, por ejemplo, las cuotas por posesión de terreno. " - name="accounting accountable" value="40" /> + <action_set description="Estas habilidades incluyen poderes para que los miembros paguen deudas del grupo o reciban sus dividendos, y para limitar el acceso al historial de la cuenta del grupo." name="Accounting"> + <action description="Pagar deudas y recibir dividendos del grupo" longdescription="Quien tenga un rol con esta capacidad, automáticamente pagará deudas del grupo y recibirá sus dividendos. Esto significa que recibirá una parte de las ventas de terreno de grupo, y que contribuirá a cosas como, por ejemplo, las cuotas por posesión de terreno. " name="accounting accountable" value="40"/> </action_set> - <action_set - description="Estas habilidades incluyen poderes para enviar, recibir y ver avisos de grupo." - name="Notices"> - <action description="Enviar aviso" - longdescription="Quien tenga un rol con esta capacidad puede enviar avisos en Información del grupo > pestaña Avisos." - name="notices send" value="42" /> - <action description="Recibir avisos nuevos y ver los anteriores" - longdescription="Quien tenga un rol con esta capacidad puede recibir los avisos nuevos, y ver los anteriores en Información del grupo > pestaña Avisos." - name="notices receive" value="43" /> + <action_set description="Estas habilidades incluyen poderes para enviar, recibir y ver avisos de grupo." name="Notices"> + <action description="Enviar aviso" longdescription="Los miembros con un rol que tenga esta capacidad pueden enviar avisos a través de la sección Grupo > Avisos." name="notices send" value="42"/> + <action description="Recibir avisos nuevos y ver los anteriores" longdescription="Los miembros con un rol que tenga esta capacidad pueden recibir Avisos y ver los ya enviados en la sección Grupo > Avisos." name="notices receive" value="43"/> </action_set> - <action_set - description="Estas habilidades incluyen poderes para permitir a los miembros crear propuestas, votarlas, y ver el historial de votaciones." - name="Proposals"> - <action description="Hacer una propuesta" - longdescription="Quien tenga un rol con esta capacidad puede crear propuestas para que sean votadas en Información del grupo > pestaña Propuestas." - name="proposal start" value="44" /> - <action description="Votar en propuestas" - longdescription="Quien tenga un rol con esta capacidad puede votar las propuestas en Información del grupo > pestaña Propuestas." - name="proposal vote" value="45" /> + <action_set description="Estas habilidades incluyen poderes para permitir a los miembros crear propuestas, votarlas, y ver el historial de votaciones." name="Proposals"> + <action description="Hacer una propuesta" longdescription="Quien tenga un rol con esta capacidad puede crear propuestas para que sean votadas en Información del grupo > pestaña Propuestas." name="proposal start" value="44"/> + <action description="Votar en propuestas" longdescription="Quien tenga un rol con esta capacidad puede votar las propuestas en Información del grupo > pestaña Propuestas." name="proposal vote" value="45"/> </action_set> - <action_set - description="Estas capacidades incluyen poderes para permitir o no el aceso a las sesiones de chat del grupo y al chat de voz del mismo." - name="Chat"> - <action description="Abrir chat de grupo" - longdescription="Quien tenga un rol con esta capacidad puede abrir sesiones de chat del grupo, tanto de texto como de voz." - name="join group chat" value="16" /> - <action description="Abrir chat de voz del grupo" - longdescription="Quien tenga un rol con esta capacidad puede abrir sesiones de chat de voz del grupo. NOTA: para acceder al chat de voz debe tenerse la capacidad 'Abrir chat de grupo'." - name="join voice chat" value="27" /> - <action description="Moderar el chat de grupo" - longdescription="Quien tenga esta capacidad puede controlar el acceso y la participación en los chats de texto y de voz del grupo." - name="moderate group chat" value="37" /> + <action_set description="Estas capacidades incluyen poderes para permitir o no el aceso a las sesiones de chat del grupo y al chat de voz del mismo." name="Chat"> + <action description="Abrir chat de grupo" longdescription="Quien tenga un rol con esta capacidad puede abrir sesiones de chat del grupo, tanto de texto como de voz." name="join group chat" value="16"/> + <action description="Abrir chat de voz del grupo" longdescription="Quien tenga un rol con esta capacidad puede abrir sesiones de chat de voz del grupo. NOTA: para acceder al chat de voz debe tenerse la capacidad 'Abrir chat de grupo'." name="join voice chat" value="27"/> + <action description="Moderar el chat de grupo" longdescription="Quien tenga esta capacidad puede controlar el acceso y la participación en los chats de texto y de voz del grupo." name="moderate group chat" value="37"/> </action_set> </role_actions> diff --git a/indra/newview/skins/default/xui/es/sidepanel_appearance.xml b/indra/newview/skins/default/xui/es/sidepanel_appearance.xml new file mode 100644 index 0000000000..db5d47c11e --- /dev/null +++ b/indra/newview/skins/default/xui/es/sidepanel_appearance.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Vestuarios" name="appearance panel"> + <string name="No Outfit" value="No hay vestuario"/> + <string name="Unsaved Changes" value="Cambios sin guardar"/> + <string name="Now Wearing" value="Llevas puesto..."/> + <panel name="panel_currentlook"> + <button label="F" name="editappearance_btn"/> + <button label="O" name="openoutfit_btn"/> + <text name="currentlook_status"> + (Estado) + </text> + </panel> + <filter_editor label="Filtrar los vestuarios" name="Filter"/> +</panel> diff --git a/indra/newview/skins/default/xui/es/sidepanel_inventory.xml b/indra/newview/skins/default/xui/es/sidepanel_inventory.xml new file mode 100644 index 0000000000..2c22a7ba46 --- /dev/null +++ b/indra/newview/skins/default/xui/es/sidepanel_inventory.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Cosas" name="objects panel"> + <panel label="" name="sidepanel__inventory_panel"> + <panel name="button_panel"> + <button label="Perfil" name="info_btn" tool_tip="Mostrar el perfil del objeto"/> + <button label="Compartir" name="share_btn" tool_tip="Compartir un objeto del inventario"/> + <button label="Comprar" name="shop_btn" tool_tip="Abrir la página web del mercado"/> + <button label="Ponerme" name="wear_btn" tool_tip="Ponerme el vestuario seleccionado"/> + <button label="Play" name="play_btn"/> + <button label="Teleporte" name="teleport_btn" tool_tip="Teleportar a la zona elegida"/> + </panel> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/es/sidepanel_item_info.xml b/indra/newview/skins/default/xui/es/sidepanel_item_info.xml new file mode 100644 index 0000000000..0d2eb0ac35 --- /dev/null +++ b/indra/newview/skins/default/xui/es/sidepanel_item_info.xml @@ -0,0 +1,73 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="item properties" title="Perfil del objeto"> + <panel.string name="unknown"> + (desconocidas) + </panel.string> + <panel.string name="public"> + (público) + </panel.string> + <panel.string name="you_can"> + Puedes: + </panel.string> + <panel.string name="owner_can"> + El propietario puede: + </panel.string> + <panel.string name="acquiredDate"> + [wkday,datetime,local][day,datetime,local] [mth,datetime,local] [year,datetime,local][hour,datetime,local]:[min,datetime,local]:[second,datetime,local] + </panel.string> + <text name="title" value="Perfil del objeto"/> + <text name="where" value="(Inventario)"/> + <panel label=""> + <text name="LabelItemNameTitle"> + Nombre: + </text> + <text name="LabelItemDescTitle"> + Descripción: + </text> + <text name="LabelCreatorTitle"> + Creador: + </text> + <button label="Perfil..." name="BtnCreator"/> + <text name="LabelOwnerTitle"> + Propietario: + </text> + <button label="Perfil..." name="BtnOwner"/> + <text name="LabelAcquiredTitle"> + Obtenido: + </text> + <text name="LabelAcquiredDate"> + Miér., 24 Mayo 2006 12:50:46 + </text> + <panel name="perms_inv"> + <text name="perm_modify"> + Tú puedes: + </text> + <check_box label="Modificar" name="CheckOwnerModify"/> + <check_box label="Copiarlo" name="CheckOwnerCopy"/> + <check_box label="Transferirlo" name="CheckOwnerTransfer"/> + <text name="AnyoneLabel"> + Cualquiera: + </text> + <check_box label="Copiarlo" name="CheckEveryoneCopy"/> + <text name="GroupLabel"> + Grupo: + </text> + <check_box label="Compartir" name="CheckShareWithGroup" tool_tip="Permite que todos los miembros del grupo compartan tus permisos de modificación en este objeto. Debes transferirlo para activar las restricciones según los roles."/> + <text name="NextOwnerLabel"> + Próximo propietario: + </text> + <check_box label="Modificarlo" name="CheckNextOwnerModify"/> + <check_box label="Copiarlo" name="CheckNextOwnerCopy"/> + <check_box label="Transferirlo" name="CheckNextOwnerTransfer" tool_tip="El próximo propietario puede dar o revender este objeto"/> + </panel> + <check_box label="En venta" name="CheckPurchase"/> + <combo_box name="combobox sale copy"> + <combo_box.item label="Copiar" name="Copy"/> + <combo_box.item label="Original" name="Original"/> + </combo_box> + <spinner label="Precio: L$" name="Edit Cost"/> + </panel> + <panel name="button_panel"> + <button label="Cancelar" name="cancel_btn"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/es/sidepanel_task_info.xml b/indra/newview/skins/default/xui/es/sidepanel_task_info.xml new file mode 100644 index 0000000000..f40813d3c9 --- /dev/null +++ b/indra/newview/skins/default/xui/es/sidepanel_task_info.xml @@ -0,0 +1,129 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="object properties" title="Perfil del objeto"> + <panel.string name="text deed continued"> + Transferir + </panel.string> + <panel.string name="text deed"> + Transferir + </panel.string> + <panel.string name="text modify info 1"> + Puedes modificar este objeto + </panel.string> + <panel.string name="text modify info 2"> + Puedes modificar estos objetos + </panel.string> + <panel.string name="text modify info 3"> + No puedes modificar este objeto + </panel.string> + <panel.string name="text modify info 4"> + No puedes modificar estos objetos + </panel.string> + <panel.string name="text modify warning"> + Este objeto tiene partes enlazadas + </panel.string> + <panel.string name="Cost Default"> + Precio: L$ + </panel.string> + <panel.string name="Cost Total"> + Precio total: L$ + </panel.string> + <panel.string name="Cost Per Unit"> + Price Per: L$ + </panel.string> + <panel.string name="Cost Mixed"> + Mixed Price + </panel.string> + <panel.string name="Sale Mixed"> + Mixed Sale + </panel.string> + <text name="title" value="Perfil del objeto"/> + <text name="where" value="(en el mundo)"/> + <panel label="" name="properties_panel"> + <text name="Name:"> + Nombre: + </text> + <text name="Description:"> + Descripción: + </text> + <text name="CreatorNameLabel"> + Creador: + </text> + <text name="Creator Name"> + Erica Linden + </text> + <text name="Owner:"> + Propietario: + </text> + <text name="Owner Name"> + Erica Linden + </text> + <text name="Group_label"> + Grupo: + </text> + <button name="button set group" tool_tip="Elige un grupo con el que compartir los permisos de este objeto"/> + <name_box initial_value="Cargando..." name="Group Name Proxy"/> + <button label="Transferir" label_selected="Transferir" name="button deed" tool_tip="La transferencia entrega este objeto con los permisos del próximo propietario. Los objetos compartidos por el grupo pueden ser transferidos por un oficial del grupo."/> + <text name="label click action"> + Pulsa para: + </text> + <combo_box name="clickaction"> + <combo_box.item label="Tocarlo (por defecto)" name="Touch/grab(default)"/> + <combo_box.item label="Sentarme en el objeto" name="Sitonobject"/> + <combo_box.item label="Comprar el objeto" name="Buyobject"/> + <combo_box.item label="Pagar el objeto" name="Payobject"/> + <combo_box.item label="Abrir" name="Open"/> + </combo_box> + <panel name="perms_inv"> + <text name="perm_modify"> + Puedes modificar este objeto + </text> + <text name="Anyone can:"> + Cualquiera: + </text> + <check_box label="Copiar" name="checkbox allow everyone copy"/> + <check_box label="Mover" name="checkbox allow everyone move"/> + <text name="GroupLabel"> + Grupo: + </text> + <check_box label="Compartir" name="checkbox share with group" tool_tip="Permite que todos los miembros del grupo compartan tus permisos de modificación de este objeto. Debes transferirlo para activar las restricciones según los roles."/> + <text name="NextOwnerLabel"> + Próximo propietario: + </text> + <check_box label="Modificar" name="checkbox next owner can modify"/> + <check_box label="Copiar" name="checkbox next owner can copy"/> + <check_box label="Transferir" name="checkbox next owner can transfer" tool_tip="El próximo propietario puede dar o revender este objeto"/> + </panel> + <check_box label="En venta" name="checkbox for sale"/> + <combo_box name="sale type"> + <combo_box.item label="Copiar" name="Copy"/> + <combo_box.item label="Contenidos" name="Contents"/> + <combo_box.item label="Original" name="Original"/> + </combo_box> + <spinner label="Precio: L$" name="Edit Cost"/> + <check_box label="Mostrar en la búsqueda" name="search_check" tool_tip="Permitir que la gente vea este objeto en los resultados de la búsqueda"/> + <text name="B:"> + B: + </text> + <text name="O:"> + O: + </text> + <text name="G:"> + G: + </text> + <text name="E:"> + E: + </text> + <text name="N:"> + N: + </text> + <text name="F:"> + F: + </text> + </panel> + <panel name="button_panel"> + <button label="Abrir" name="open_btn"/> + <button label="Pagar" name="pay_btn"/> + <button label="Comprar" name="buy_btn"/> + <button label="Detalles" name="details_btn"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml index dc508f7c37..6bd9ceb6ef 100644 --- a/indra/newview/skins/default/xui/es/strings.xml +++ b/indra/newview/skins/default/xui/es/strings.xml @@ -1,13 +1,42 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <!-- This file contains strings that used to be hardcoded in the source. It is only for those strings which do not belong in a floater. - For example, the strings used in avatar chat bubbles, and strings + For example, the strings used in avatar chat bubbles, and strings that are returned from one component and may appear in many places--> <strings> - <string name="create_account_url">http://join.secondlife.com/index.php?lang=es-ES</string> + <string name="CAPITALIZED_APP_NAME"> + SECOND LIFE + </string> + <string name="SUPPORT_SITE"> + Portal de Soporte de Second Life + </string> + <string name="StartupDetectingHardware"> + Identificando el hardware... + </string> + <string name="StartupLoading"> + Instalando [APP_NAME]... + </string> + <string name="StartupClearingCache"> + Limpiando la caché... + </string> + <string name="StartupInitializingTextureCache"> + Iniciando la caché de las texturas... + </string> + <string name="StartupInitializingVFS"> + Iniciando VFS... + </string> + <string name="ProgressRestoring"> + Restaurando... + </string> + <string name="ProgressChangingResolution"> + Cambiando la resolución... + </string> <string name="LoginInProgress"> Iniciando la sesión. [APP_NAME] debe de aparecer congelado. Por favor, espere. </string> + <string name="LoginInProgressNoFrozen"> + Iniciando la sesión... + </string> <string name="LoginAuthenticating"> Autenticando </string> @@ -26,6 +55,9 @@ <string name="LoginInitializingMultimedia"> Iniciando multimedia... </string> + <string name="LoginInitializingFonts"> + Cargando las fuentes... + </string> <string name="LoginVerifyingCache"> Comprobando los archivos de la caché (puede tardar entre 60 y 90 segundos)... </string> @@ -56,11 +88,56 @@ <string name="LoginDownloadingClothing"> Descargando la ropa... </string> + <string name="InvalidCertificate"> + El servidor devolvió un certificado no válido o dañado. Ponte en contacto con el administrador de la cuadrÃcula. + </string> + <string name="CertInvalidHostname"> + El nombre de host utilizado para acceder al servidor no es válido. Comprueba tu SLURL o el nombre de host de la cuadrÃcula. + </string> + <string name="CertExpired"> + Parece que el certificado que devolvió la cuadrÃcula está caducado. Comprueba el reloj del sistema o consulta al administrador de la cuadrÃcula. + </string> + <string name="CertKeyUsage"> + El certificado que devolvió el servidor no puede utilizarse para SSL. Ponte en contacto con el administrador de la cuadrÃcula. + </string> + <string name="CertBasicConstraints"> + La cadena de certificado del servidor contenÃa demasiados certificados. Ponte en contacto con el administrador de la cuadrÃcula. + </string> + <string name="CertInvalidSignature"> + No se pudo verificar la firma del certificado devuelta por el servidor de la cuadrÃcula. Ponte en contacto con el administrador de la cuadrÃcula. + </string> + <string name="LoginFailedNoNetwork"> + Error de red: no se ha podido conectar; por favor, revisa tu conexión a Internet. + </string> + <string name="LoginFailed"> + Error en el inicio de sesión. + </string> <string name="Quit"> Salir </string> + <string name="create_account_url"> + http://join.secondlife.com/index.php?lang=es-ES + </string> <string name="AgentLostConnection"> - Esta región puede estar teniendo problemas. Por favor, compruebe su conexión a internet. + Esta región puede estar teniendo problemas. Por favor, comprueba tu conexión a Internet. + </string> + <string name="SavingSettings"> + Guardando tus configuraciones... + </string> + <string name="LoggingOut"> + Cerrando sesión... + </string> + <string name="ShuttingDown"> + Cerrando... + </string> + <string name="YouHaveBeenDisconnected"> + Has sido desconectado de la región en la que estabas. + </string> + <string name="SentToInvalidRegion"> + Has sido enviado a una región no válida. + </string> + <string name="TestingDisconnect"> + Probando la desconexión del visor </string> <string name="TooltipPerson"> Persona @@ -77,39 +154,9 @@ <string name="TooltipIsGroup"> (Grupo) </string> - <string name="TooltipFlagScript"> - Script - </string> - <string name="TooltipFlagPhysics"> - Propiedades fÃsicas - </string> - <string name="TooltipFlagTouch"> - Tocar - </string> - <string name="TooltipFlagL$"> - L$ - </string> - <string name="TooltipFlagDropInventory"> - Desplegar el inventario - </string> - <string name="TooltipFlagPhantom"> - Inmaterial - </string> - <string name="TooltipFlagTemporary"> - Temporal - </string> - <string name="TooltipFlagRightClickMenu"> - (pulse el botón derecho del ratón para ver el menú) - </string> - <string name="TooltipFreeToCopy"> - Copia gratis - </string> <string name="TooltipForSaleL$"> En venta: [AMOUNT] L$ </string> - <string name="TooltipForSaleMsg"> - En venta: [MESSAGE] - </string> <string name="TooltipFlagGroupBuild"> Construir el grupo </string> @@ -137,6 +184,113 @@ <string name="TooltipMustSingleDrop"> Aquà se puede arrastrar sólo un Ãtem </string> + <string name="TooltipHttpUrl"> + Pulsa para ver esta página web + </string> + <string name="TooltipSLURL"> + Pulsa para ver la información de este lugar + </string> + <string name="TooltipAgentUrl"> + Pulsa para ver el perfil del Residente + </string> + <string name="TooltipAgentMute"> + Pulsa para silenciar a este Residente + </string> + <string name="TooltipAgentUnmute"> + Pulsa para quitar el silencio a este Residente + </string> + <string name="TooltipAgentIM"> + Pulsa para enviar un MI a este Residente + </string> + <string name="TooltipAgentPay"> + Pulsa para pagar a este Residente + </string> + <string name="TooltipAgentOfferTeleport"> + Pulsa para enviar una petición de teleporte a este Residente + </string> + <string name="TooltipAgentRequestFriend"> + Pulsa para enviar una petición de amistad a este Residente + </string> + <string name="TooltipGroupUrl"> + Pulsa para ver la descripción de este grupo + </string> + <string name="TooltipEventUrl"> + Pulsa para ver la descripción de este evento + </string> + <string name="TooltipClassifiedUrl"> + Pulsa para ver este clasificado + </string> + <string name="TooltipParcelUrl"> + Pulsa para ver la descripción de esta parcela + </string> + <string name="TooltipTeleportUrl"> + Pulsa para teleportarte a esta posición + </string> + <string name="TooltipObjectIMUrl"> + Pulsa para ver la descripción de este objeto + </string> + <string name="TooltipMapUrl"> + Pulsa para ver en el mapa esta localización + </string> + <string name="TooltipSLAPP"> + Pulsa para ejecutar el comando secondlife:// + </string> + <string name="CurrentURL" value="URL actual: [CurrentURL]"/> + <string name="TooltipPrice" value="[PRICE] L$"/> + <string name="SLurlLabelTeleport"> + Teleportarse a + </string> + <string name="SLurlLabelShowOnMap"> + Mostrarla en el mapa + </string> + <string name="SLappAgentMute"> + Silenciar + </string> + <string name="SLappAgentUnmute"> + Quitar el silencio + </string> + <string name="SLappAgentIM"> + MI + </string> + <string name="SLappAgentPay"> + Pagar + </string> + <string name="SLappAgentOfferTeleport"> + Ofrecer teleporte a + </string> + <string name="SLappAgentRequestFriend"> + Petición de amistad + </string> + <string name="BUTTON_CLOSE_DARWIN"> + Cerrar (⌘W) + </string> + <string name="BUTTON_CLOSE_WIN"> + Cerrar (Ctrl+W) + </string> + <string name="BUTTON_CLOSE_CHROME"> + Cerrar + </string> + <string name="BUTTON_RESTORE"> + Maximizar + </string> + <string name="BUTTON_MINIMIZE"> + Minimizar + </string> + <string name="BUTTON_TEAR_OFF"> + Separar la ventana + </string> + <string name="BUTTON_DOCK"> + Fijar + </string> + <string name="BUTTON_HELP"> + Ver la Ayuda + </string> + <string name="Searching"> + Buscando... + </string> + <string name="NoneFound"> + No se ha encontrado. + </string> <string name="RetrievingData"> Reintentando... </string> @@ -152,12 +306,12 @@ <string name="AvatarNameWaiting"> (esperando) </string> - <string name="AvatarNameHippos"> - (hipopótamos) - </string> <string name="GroupNameNone"> (ninguno) </string> + <string name="AvalineCaller"> + Avaline: [ORDER] + </string> <string name="AssetErrorNone"> No hay ningún error </string> @@ -191,8 +345,80 @@ <string name="AssetErrorUnknownStatus"> Estado desconocido </string> - <string name="AvatarEditingApparance"> - (Modificando la apariencia) + <string name="texture"> + la textura + </string> + <string name="sound"> + el sonido + </string> + <string name="calling card"> + la tarjeta de visita + </string> + <string name="landmark"> + el hito + </string> + <string name="legacy script"> + el script antiguo + </string> + <string name="clothing"> + esa ropa + </string> + <string name="object"> + el objeto + </string> + <string name="note card"> + la nota + </string> + <string name="folder"> + la carpeta + </string> + <string name="root"> + la ruta + </string> + <string name="lsl2 script"> + ese script de LSL2 + </string> + <string name="lsl bytecode"> + el código intermedio de LSL + </string> + <string name="tga texture"> + esa textura tga + </string> + <string name="body part"> + esa parte del cuerpo + </string> + <string name="snapshot"> + la foto + </string> + <string name="lost and found"> + Objetos Perdidos + </string> + <string name="targa image"> + esa imagen targa + </string> + <string name="trash"> + la Papelera + </string> + <string name="jpeg image"> + esa imagen jpeg + </string> + <string name="animation"> + la animación + </string> + <string name="gesture"> + el gesto + </string> + <string name="simstate"> + simstate + </string> + <string name="favorite"> + ese favorito + </string> + <string name="symbolic link"> + el enlace + </string> + <string name="symbolic folder link"> + enlace de la carpeta </string> <string name="AvatarAway"> Ausente @@ -414,7 +640,19 @@ Cargando... </string> <string name="worldmap_offline"> - Desconectado/a + Sin conexión + </string> + <string name="worldmap_results_none_found"> + No se ha encontrado. + </string> + <string name="Ok"> + OK + </string> + <string name="Premature end of file"> + Fin prematuro del archivo + </string> + <string name="ST_NO_JOINT"> + No se puede encontrar ROOT o JOINT. </string> <string name="whisper"> susurra: @@ -422,6 +660,60 @@ <string name="shout"> grita: </string> + <string name="ringing"> + Conectando al chat de voz... + </string> + <string name="connected"> + Conectado + </string> + <string name="unavailable"> + La voz no está disponible en su localización actual + </string> + <string name="hang_up"> + Desconectado del chat de voz + </string> + <string name="reconnect_nearby"> + Vas a ser reconectado al chat de voz con los cercanos + </string> + <string name="ScriptQuestionCautionChatGranted"> + '[OBJECTNAME]', un objeto propiedad de '[OWNERNAME]', localizado en [REGIONNAME] con la posición [REGIONPOS], ha recibido permiso para: [PERMISSIONS]. + </string> + <string name="ScriptQuestionCautionChatDenied"> + A '[OBJECTNAME]', un objeto propiedad de '[OWNERNAME]', localizado en [REGIONNAME] con la posición [REGIONPOS], se le ha denegado el permiso para: [PERMISSIONS]. + </string> + <string name="ScriptTakeMoney"> + Cogerle a usted dólares Linden (L$) + </string> + <string name="ActOnControlInputs"> + Actuar en sus controles de entrada + </string> + <string name="RemapControlInputs"> + Reconfigurar sus controles de entrada + </string> + <string name="AnimateYourAvatar"> + Ejecutar animaciones en su avatar + </string> + <string name="AttachToYourAvatar"> + Anexarse a su avatar + </string> + <string name="ReleaseOwnership"> + Anular la propiedad y que pase a ser público + </string> + <string name="LinkAndDelink"> + Enlazar y desenlazar de otros objetos + </string> + <string name="AddAndRemoveJoints"> + Añadir y quitar uniones con otros objetos + </string> + <string name="ChangePermissions"> + Cambiar sus permisos + </string> + <string name="TrackYourCamera"> + Seguir su cámara + </string> + <string name="ControlYourCamera"> + Controlar su cámara + </string> <string name="SIM_ACCESS_PG"> 'PG' </string> @@ -440,8 +732,12 @@ <string name="land_type_unknown"> (desconocido) </string> - <string name="covenant_never_modified">Última modificación: (nunca)</string> - <string name="covenant_modified">Última modificación: </string> + <string name="Estate / Full Region"> + Estado /Región completa + </string> + <string name="Mainland / Full Region"> + Continente / Región completa + </string> <string name="all_files"> Todos los archivos </string> @@ -487,28 +783,964 @@ <string name="choose_the_directory"> Elegir directorio </string> - <!-- OSMessageBox messages --> - <string name="MBAlreadyRunning"> - [APP_NAME] ya se está ejecutando. -Busque en la barra de su escritorio una copia minimizada del programa. -Si aun asà persiste este mensaje, reinicie su ordenador. + <string name="AvatarSetNotAway"> + Salir del estado ausente </string> - <string name="MBVideoDrvErr"> - No se puede ejecutar [APP_NAME] porque los drivers de su tarjeta de vÃdeo no están instalados correctamente, o no están actualizados, o son de un hardware no admitido. Por favor, asegúrese de que tiene los últimos drivers para su tarjeta de vÃdeo, e incluso en ese caso intente reinstalarlos. - -Si sigue recibiendo este mensaje, contacte con el [SUPPORT_SITE]. + <string name="AvatarSetAway"> + Pasar al estado ausente + </string> + <string name="AvatarSetNotBusy"> + Salir del estado ocupado + </string> + <string name="AvatarSetBusy"> + Pasar al estado ocupado + </string> + <string name="shape"> + Forma + </string> + <string name="skin"> + Piel + </string> + <string name="hair"> + Pelo + </string> + <string name="eyes"> + Ojos + </string> + <string name="shirt"> + Camisa + </string> + <string name="pants"> + Pantalón + </string> + <string name="shoes"> + Zapatos + </string> + <string name="socks"> + Calcetines + </string> + <string name="jacket"> + Chaqueta + </string> + <string name="gloves"> + Guantes + </string> + <string name="undershirt"> + Camiseta + </string> + <string name="underpants"> + Ropa interior + </string> + <string name="skirt"> + Falda + </string> + <string name="alpha"> + Alfa + </string> + <string name="tattoo"> + Tatuaje + </string> + <string name="invalid"> + inválido/a + </string> + <string name="shirt_not_worn"> + Camisa no puesta + </string> + <string name="pants_not_worn"> + Pantalones no puestos + </string> + <string name="shoes_not_worn"> + Zapatos no puestos + </string> + <string name="socks_not_worn"> + Calcetines no puestos + </string> + <string name="jacket_not_worn"> + Chaqueta no puesta + </string> + <string name="gloves_not_worn"> + Guantes no puestos + </string> + <string name="undershirt_not_worn"> + Camiseta no puesta + </string> + <string name="underpants_not_worn"> + Ropa interior no puesta + </string> + <string name="skirt_not_worn"> + Falda no puesta + </string> + <string name="alpha_not_worn"> + Alfa no puesta + </string> + <string name="tattoo_not_worn"> + Tatuaje no puesto + </string> + <string name="invalid_not_worn"> + no válido/a + </string> + <string name="NewWearable"> + Nuevo [WEARABLE_ITEM] + </string> + <string name="CreateNewWearable"> + Crear [WEARABLE_TYPE] + </string> + <string name="next"> + Siguiente + </string> + <string name="ok"> + OK + </string> + <string name="GroupNotifyGroupNotice"> + Aviso de grupo + </string> + <string name="GroupNotifyGroupNotices"> + Avisos del grupo + </string> + <string name="GroupNotifySentBy"> + Enviado por + </string> + <string name="GroupNotifyAttached"> + Adjunto: + </string> + <string name="GroupNotifyViewPastNotices"> + Ver los avisos pasados u optar por dejar de recibir aquà estos mensajes. + </string> + <string name="GroupNotifyOpenAttachment"> + Abrir el adjunto + </string> + <string name="GroupNotifySaveAttachment"> + Guardar el adjunto + </string> + <string name="TeleportOffer"> + Ofrecimiento de teleporte + </string> + <string name="StartUpNotifications"> + Llegaron avisos nuevos mientras estabas ausente... + </string> + <string name="OverflowInfoChannelString"> + Tienes [%d] aviso/s más + </string> + <string name="BodyPartsRightArm"> + Brazo der. + </string> + <string name="BodyPartsHead"> + Cabeza + </string> + <string name="BodyPartsLeftArm"> + Brazo izq. + </string> + <string name="BodyPartsLeftLeg"> + Pierna izq. + </string> + <string name="BodyPartsTorso"> + Torso + </string> + <string name="BodyPartsRightLeg"> + Pierna der. + </string> + <string name="GraphicsQualityLow"> + Bajo + </string> + <string name="GraphicsQualityMid"> + Medio + </string> + <string name="GraphicsQualityHigh"> + Alto + </string> + <string name="LeaveMouselook"> + Pulsa ESC para salir de la vista subjetiva + </string> + <string name="InventoryNoMatchingItems"> + ¿No encuentras lo que buscas? Prueba con [secondlife:///app/search/all/[SEARCH_TERM] Buscar]. + </string> + <string name="PlacesNoMatchingItems"> + ¿No encuentras lo que buscas? Prueba con [secondlife:///app/search/places/[SEARCH_TERM] Buscar]. + </string> + <string name="FavoritesNoMatchingItems"> + Arrastra aquà un hito para tenerlo en tus favoritos. + </string> + <string name="InventoryNoTexture"> + No tienes en tu inventario una copia de esta textura + </string> + <string name="no_transfer" value="(no transferible)"/> + <string name="no_modify" value="(no modificable)"/> + <string name="no_copy" value="(no copiable)"/> + <string name="worn" value="(puesto)"/> + <string name="link" value="(enlace)"/> + <string name="broken_link" value="(enlace roto)""/> + <string name="LoadingContents"> + Cargando el contenido... + </string> + <string name="NoContents"> + No hay contenido + </string> + <string name="WornOnAttachmentPoint" value="(lo llevas en: [ATTACHMENT_POINT])"/> + <string name="ActiveGesture" value="[GESLABEL] (activo)"/> + <string name="Chat" value="Chat :"/> + <string name="Sound" value="Sonido :"/> + <string name="Wait" value="--- Espera :"/> + <string name="AnimFlagStop" value="Parar la animación:"/> + <string name="AnimFlagStart" value="Empezar la animación:"/> + <string name="Wave" value="Onda"/> + <string name="HelloAvatar" value="¡Hola, avatar!"/> + <string name="ViewAllGestures" value="Ver todos >>"/> + <string name="GetMoreGestures" value="Obtener más >>"/> + <string name="Animations" value="Animaciones,"/> + <string name="Calling Cards" value="Tarjetas de visita,"/> + <string name="Clothing" value="Ropa,"/> + <string name="Gestures" value="Gestos,"/> + <string name="Landmarks" value="Hitos,"/> + <string name="Notecards" value="Notas,"/> + <string name="Objects" value="Objetos,"/> + <string name="Scripts" value="Scripts,"/> + <string name="Sounds" value="Sonidos,"/> + <string name="Textures" value="Texturas,"/> + <string name="Snapshots" value="Fotos,"/> + <string name="No Filters" value="No"/> + <string name="Since Logoff" value="- Desde la desconexión"/> + <string name="InvFolder My Inventory"> + Mi Inventario + </string> + <string name="InvFolder My Favorites"> + Mis Favoritos + </string> + <string name="InvFolder Library"> + Biblioteca + </string> + <string name="InvFolder Textures"> + Texturas + </string> + <string name="InvFolder Sounds"> + Sonidos + </string> + <string name="InvFolder Calling Cards"> + Tarjetas de visita + </string> + <string name="InvFolder Landmarks"> + Hitos + </string> + <string name="InvFolder Scripts"> + Scripts + </string> + <string name="InvFolder Clothing"> + Ropa + </string> + <string name="InvFolder Objects"> + Objetos + </string> + <string name="InvFolder Notecards"> + Notas + </string> + <string name="InvFolder New Folder"> + Carpeta nueva + </string> + <string name="InvFolder Inventory"> + Inventario + </string> + <string name="InvFolder Uncompressed Images"> + Imágenes sin comprimir + </string> + <string name="InvFolder Body Parts"> + Partes del cuerpo + </string> + <string name="InvFolder Trash"> + Papelera + </string> + <string name="InvFolder Photo Album"> + Ãlbum de fotos + </string> + <string name="InvFolder Lost And Found"> + Objetos Perdidos + </string> + <string name="InvFolder Uncompressed Sounds"> + Sonidos sin comprimir + </string> + <string name="InvFolder Animations"> + Animaciones + </string> + <string name="InvFolder Gestures"> + Gestos + </string> + <string name="InvFolder favorite"> + Favoritos + </string> + <string name="InvFolder Current Outfit"> + Vestuario actual + </string> + <string name="InvFolder My Outfits"> + Mis vestuarios + </string> + <string name="InvFolder Accessories"> + Accesorios + </string> + <string name="InvFolder Friends"> + Amigos + </string> + <string name="InvFolder All"> + Todas + </string> + <string name="Buy"> + Comprar + </string> + <string name="BuyforL$"> + Comprar por L$ + </string> + <string name="Stone"> + Piedra + </string> + <string name="Metal"> + Metal + </string> + <string name="Glass"> + Cristal + </string> + <string name="Wood"> + Madera + </string> + <string name="Flesh"> + Carne + </string> + <string name="Plastic"> + Plástico + </string> + <string name="Rubber"> + Goma + </string> + <string name="Light"> + Claridad + </string> + <string name="KBShift"> + Mayúsculas + </string> + <string name="KBCtrl"> + Ctrl + </string> + <string name="Chest"> + Tórax + </string> + <string name="Skull"> + Cráneo + </string> + <string name="Left Shoulder"> + Hombro izquierdo + </string> + <string name="Right Shoulder"> + Hombro derecho + </string> + <string name="Left Hand"> + Mano izq. + </string> + <string name="Right Hand"> + Mano der. + </string> + <string name="Left Foot"> + Pie izq. + </string> + <string name="Right Foot"> + Pie der. + </string> + <string name="Spine"> + Columna + </string> + <string name="Pelvis"> + Pelvis + </string> + <string name="Mouth"> + Boca + </string> + <string name="Chin"> + Barbilla + </string> + <string name="Left Ear"> + Oreja izq. + </string> + <string name="Right Ear"> + Oreja der. + </string> + <string name="Left Eyeball"> + Ojo izq. + </string> + <string name="Right Eyeball"> + Ojo der. + </string> + <string name="Nose"> + Nariz + </string> + <string name="R Upper Arm"> + Brazo der. + </string> + <string name="R Forearm"> + Antebrazo der. + </string> + <string name="L Upper Arm"> + Brazo izq. + </string> + <string name="L Forearm"> + Antebrazo izq. + </string> + <string name="Right Hip"> + Cadera der. + </string> + <string name="R Upper Leg"> + Muslo der. + </string> + <string name="R Lower Leg"> + Pantorrilla der. + </string> + <string name="Left Hip"> + Cadera izq. + </string> + <string name="L Upper Leg"> + Muslo izq. + </string> + <string name="L Lower Leg"> + Pantorrilla izq. + </string> + <string name="Stomach"> + Abdomen + </string> + <string name="Left Pec"> + Pecho izquierdo + </string> + <string name="Right Pec"> + Pecho derecho + </string> + <string name="YearsMonthsOld"> + [AGEYEARS] [AGEMONTHS] de edad + </string> + <string name="YearsOld"> + [AGEYEARS] de edad + </string> + <string name="MonthsOld"> + [AGEMONTHS] de edad + </string> + <string name="WeeksOld"> + [AGEWEEKS] de edad + </string> + <string name="DaysOld"> + [AGEDAYS] de edad + </string> + <string name="TodayOld"> + Registrado hoy + </string> + <string name="AgeYearsA"> + [COUNT] año + </string> + <string name="AgeYearsB"> + [COUNT] años + </string> + <string name="AgeYearsC"> + [COUNT] años + </string> + <string name="AgeMonthsA"> + [COUNT] mes + </string> + <string name="AgeMonthsB"> + [COUNT] meses + </string> + <string name="AgeMonthsC"> + [COUNT] meses + </string> + <string name="AgeWeeksA"> + [COUNT] semana + </string> + <string name="AgeWeeksB"> + [COUNT] semanas + </string> + <string name="AgeWeeksC"> + [COUNT] semanas + </string> + <string name="AgeDaysA"> + [COUNT] dÃa + </string> + <string name="AgeDaysB"> + [COUNT] dÃas + </string> + <string name="AgeDaysC"> + [COUNT] dÃas + </string> + <string name="GroupMembersA"> + [COUNT] miembro + </string> + <string name="GroupMembersB"> + [COUNT] miembros + </string> + <string name="GroupMembersC"> + [COUNT] miembros + </string> + <string name="AcctTypeResident"> + Residente + </string> + <string name="AcctTypeTrial"> + Prueba + </string> + <string name="AcctTypeCharterMember"> + Miembro fundador + </string> + <string name="AcctTypeEmployee"> + Empleado de Linden Lab + </string> + <string name="PaymentInfoUsed"> + Ha usado información sobre la forma de pago + </string> + <string name="PaymentInfoOnFile"> + Hay información archivada sobre la forma de pago + </string> + <string name="NoPaymentInfoOnFile"> + No hay información archivada sobre la forma de pago + </string> + <string name="AgeVerified"> + Edad verificada + </string> + <string name="NotAgeVerified"> + Edad no verificada + </string> + <string name="Center 2"> + Centro 2 + </string> + <string name="Top Right"> + Arriba der. + </string> + <string name="Top"> + Arriba + </string> + <string name="Top Left"> + Arriba izq. + </string> + <string name="Center"> + Centro + </string> + <string name="Bottom Left"> + Abajo izq. + </string> + <string name="Bottom"> + Abajo + </string> + <string name="Bottom Right"> + Abajo der. + </string> + <string name="CompileQueueDownloadedCompiling"> + Descargado, compilándolo + </string> + <string name="CompileQueueScriptNotFound"> + No se encuentra el script en el servidor. + </string> + <string name="CompileQueueProblemDownloading"> + Problema al descargar + </string> + <string name="CompileQueueInsufficientPermDownload"> + Permisos insuficientes para descargar un script. + </string> + <string name="CompileQueueInsufficientPermFor"> + Permisos insuficientes para + </string> + <string name="CompileQueueUnknownFailure"> + Fallo desconocido en la descarga + </string> + <string name="CompileQueueTitle"> + Recompilando + </string> + <string name="CompileQueueStart"> + recompilar + </string> + <string name="ResetQueueTitle"> + Progreso del reinicio + </string> + <string name="ResetQueueStart"> + restaurar + </string> + <string name="RunQueueTitle"> + Configurar según se ejecuta + </string> + <string name="RunQueueStart"> + Configurando según se ejecuta + </string> + <string name="NotRunQueueTitle"> + Configurar sin ejecutar + </string> + <string name="NotRunQueueStart"> + Configurando sin ejecutarlo + </string> + <string name="CompileSuccessful"> + ¡Compilación correcta! + </string> + <string name="CompileSuccessfulSaving"> + Compilación correcta, guardando... + </string> + <string name="SaveComplete"> + Guardado. + </string> + <string name="ObjectOutOfRange"> + Script (objeto fuera de rango) + </string> + <string name="GodToolsObjectOwnedBy"> + El objeto [OBJECT] es propiedad de [OWNER] + </string> + <string name="GroupsNone"> + ninguno + </string> + <string name="Group" value="(grupo)"/> + <string name="Unknown"> + (Desconocido) + </string> + <string name="SummaryForTheWeek" value="Resumen de esta semana, empezando el"/> + <string name="NextStipendDay" value="El próximo dÃa de pago es el"/> + <string name="GroupIndividualShare" value="Grupo Aportaciones individuales"/> + <string name="Balance"> + Saldo + </string> + <string name="Credits"> + Créditos + </string> + <string name="Debits"> + Débitos + </string> + <string name="Total"> + Total + </string> + <string name="NoGroupDataFound"> + No se encontraron datos del grupo + </string> + <string name="IMParentEstate"> + parent estate + </string> + <string name="IMMainland"> + continente + </string> + <string name="IMTeen"> + teen + </string> + <string name="RegionInfoError"> + error + </string> + <string name="RegionInfoAllEstatesOwnedBy"> + todos los estados propiedad de [OWNER] + </string> + <string name="RegionInfoAllEstatesYouOwn"> + todos los estados que posees + </string> + <string name="RegionInfoAllEstatesYouManage"> + todos los estados que administras para [OWNER] + </string> + <string name="RegionInfoAllowedResidents"> + Resientes autorizados: ([ALLOWEDAGENTS], de un máx. de [MAXACCESS]) + </string> + <string name="RegionInfoAllowedGroups"> + Grupos autorizados: ([ALLOWEDGROUPS], de un máx. de [MAXACCESS]) + </string> + <string name="ScriptLimitsParcelScriptMemory"> + Memoria de los scripts de la parcela + </string> + <string name="ScriptLimitsParcelsOwned"> + Parcelas listadas: [PARCELS] + </string> + <string name="ScriptLimitsMemoryUsed"> + Memoria usada: [COUNT] kb de un máx de [MAX] kb; [AVAILABLE] kb disponibles + </string> + <string name="ScriptLimitsMemoryUsedSimple"> + Memoria usada: [COUNT] kb + </string> + <string name="ScriptLimitsParcelScriptURLs"> + URLs de los scripts de la parcela + </string> + <string name="ScriptLimitsURLsUsed"> + URLs usadas: [COUNT] de un máx. de [MAX]; [AVAILABLE] disponibles + </string> + <string name="ScriptLimitsURLsUsedSimple"> + URLs usadas: [COUNT] + </string> + <string name="ScriptLimitsRequestError"> + Error al obtener la información + </string> + <string name="ScriptLimitsRequestNoParcelSelected"> + No hay una parcela seleccionada + </string> + <string name="ScriptLimitsRequestWrongRegion"> + Error: la información del script sólo está disponible en tu región actual + </string> + <string name="ScriptLimitsRequestWaiting"> + Obteniendo la información... + </string> + <string name="ScriptLimitsRequestDontOwnParcel"> + No tienes permiso para examinar esta parcela + </string> + <string name="SITTING_ON"> + Sentado en + </string> + <string name="ATTACH_CHEST"> + Tórax + </string> + <string name="ATTACH_HEAD"> + Cabeza + </string> + <string name="ATTACH_LSHOULDER"> + Hombro izquierdo + </string> + <string name="ATTACH_RSHOULDER"> + Hombro derecho + </string> + <string name="ATTACH_LHAND"> + Mano izq. + </string> + <string name="ATTACH_RHAND"> + Mano der. + </string> + <string name="ATTACH_LFOOT"> + Pie izq. + </string> + <string name="ATTACH_RFOOT"> + Pie der. + </string> + <string name="ATTACH_BACK"> + Anterior + </string> + <string name="ATTACH_PELVIS"> + Pelvis + </string> + <string name="ATTACH_MOUTH"> + Boca + </string> + <string name="ATTACH_CHIN"> + Barbilla + </string> + <string name="ATTACH_LEAR"> + Oreja izq. + </string> + <string name="ATTACH_REAR"> + Oreja der. + </string> + <string name="ATTACH_LEYE"> + Ojo izq. + </string> + <string name="ATTACH_REYE"> + Ojo der. + </string> + <string name="ATTACH_NOSE"> + Nariz + </string> + <string name="ATTACH_RUARM"> + Brazo der. + </string> + <string name="ATTACH_RLARM"> + Antebrazo der. + </string> + <string name="ATTACH_LUARM"> + Brazo izq. + </string> + <string name="ATTACH_LLARM"> + Antebrazo izq. + </string> + <string name="ATTACH_RHIP"> + Cadera der. + </string> + <string name="ATTACH_RULEG"> + Muslo der. + </string> + <string name="ATTACH_RLLEG"> + Pantorrilla der. + </string> + <string name="ATTACH_LHIP"> + Cadera izq. + </string> + <string name="ATTACH_LULEG"> + Muslo izq. + </string> + <string name="ATTACH_LLLEG"> + Pantorrilla izq. + </string> + <string name="ATTACH_BELLY"> + Vientre + </string> + <string name="ATTACH_RPEC"> + Pecho derecho + </string> + <string name="ATTACH_LPEC"> + Pecho izquierdo + </string> + <string name="ATTACH_HUD_CENTER_2"> + HUD: Centro 2 + </string> + <string name="ATTACH_HUD_TOP_RIGHT"> + HUD: arriba der. + </string> + <string name="ATTACH_HUD_TOP_CENTER"> + HUD: arriba centro + </string> + <string name="ATTACH_HUD_TOP_LEFT"> + HUD: arriba izq. + </string> + <string name="ATTACH_HUD_CENTER_1"> + HUD: Centro 1 + </string> + <string name="ATTACH_HUD_BOTTOM_LEFT"> + HUD: abajo izq. + </string> + <string name="ATTACH_HUD_BOTTOM"> + HUD: abajo + </string> + <string name="ATTACH_HUD_BOTTOM_RIGHT"> + HUD: abajo der. + </string> + <string name="CursorPos"> + LÃnea [LINE], Columna [COLUMN] + </string> + <string name="PanelDirCountFound"> + [COUNT] resultados + </string> + <string name="PanelContentsNewScript"> + Script nuevo + </string> + <string name="PanelContentsTooltip"> + Contenido del objeto + </string> + <string name="BusyModeResponseDefault"> + El Residente al que has enviado un mensaje ha solicitado que no se le moleste porque está en modo ocupado. Podrá ver tu mensaje más adelante, ya que éste aparecerá en su panel de MI. + </string> + <string name="MuteByName"> + (Por el nombre) + </string> + <string name="MuteAgent"> + (Residente) + </string> + <string name="MuteObject"> + (Objeto) + </string> + <string name="MuteGroup"> + (Grupo) + </string> + <string name="MuteExternal"> + (Externo) + </string> + <string name="RegionNoCovenant"> + No se ha aportado un contrato para este estado. + </string> + <string name="RegionNoCovenantOtherOwner"> + No se ha aportado un contrato para este estado. El terreno de este estado lo vende el propietario del estado, no Linden Lab. Por favor, contacta con ese propietario para informarte sobre la venta. + </string> + <string name="covenant_last_modified" value="Última modificación:"/> + <string name="none_text" value="(no hay)"/> + <string name="never_text" value=" (nunca)"/> + <string name="GroupOwned"> + Propiedad del grupo + </string> + <string name="Public"> + Público + </string> + <string name="ClassifiedClicksTxt"> + Clics: [TELEPORT] teleportes, [MAP] mapa, [PROFILE] perfil + </string> + <string name="ClassifiedUpdateAfterPublish"> + (se actualizará tras la publicación) + </string> + <string name="NoPicksClassifiedsText"> + No has creado destacados ni clasificados. Pulsa el botón Más para crear uno. + </string> + <string name="NoAvatarPicksClassifiedsText"> + El usuario no tiene clasificados ni destacados + </string> + <string name="PicksClassifiedsLoadingText"> + Cargando... + </string> + <string name="MultiPreviewTitle"> + Vista previa + </string> + <string name="MultiPropertiesTitle"> + Propiedades + </string> + <string name="InvOfferAnObjectNamed"> + Un objeto de nombre + </string> + <string name="InvOfferOwnedByGroup"> + propiedad del grupo + </string> + <string name="InvOfferOwnedByUnknownGroup"> + propiedad de un grupo desconocido + </string> + <string name="InvOfferOwnedBy"> + propiedad de + </string> + <string name="InvOfferOwnedByUnknownUser"> + propiedad de un usuario desconocido + </string> + <string name="InvOfferGaveYou"> + te ha dado + </string> + <string name="InvOfferYouDecline"> + Has rehusado + </string> + <string name="InvOfferFrom"> + de + </string> + <string name="GroupMoneyTotal"> + Total + </string> + <string name="GroupMoneyBought"> + comprado + </string> + <string name="GroupMoneyPaidYou"> + pagado a ti + </string> + <string name="GroupMoneyPaidInto"> + pagado en + </string> + <string name="GroupMoneyBoughtPassTo"> + pase comprado a + </string> + <string name="GroupMoneyPaidFeeForEvent"> + cuotas pagadas para el evento + </string> + <string name="GroupMoneyPaidPrizeForEvent"> + precio pagado por el evento + </string> + <string name="GroupMoneyBalance"> + Saldo + </string> + <string name="GroupMoneyCredits"> + Créditos + </string> + <string name="GroupMoneyDebits"> + Débitos + </string> + <string name="ViewerObjectContents"> + Contenidos + </string> + <string name="AcquiredItems"> + ArtÃculos adquiridos + </string> + <string name="Cancel"> + Cancelar + </string> + <string name="UploadingCosts"> + Subir [NAME] cuesta [AMOUNT] L$ + </string> + <string name="BuyingCosts"> + Comprar esto cuesta [AMOUNT] L$ + </string> + <string name="UnknownFileExtension"> + Extensión de archivo desconocida [.%s] +Se esperaba .wav, .tga, .bmp, .jpg, .jpeg, o .bvh + </string> + <string name="MuteObject2"> + Ignorar + </string> + <string name="AddLandmarkNavBarMenu"> + Guardarme este hito... + </string> + <string name="EditLandmarkNavBarMenu"> + Editar este hito... </string> <string name="accel-mac-control"> - ⌃ + ⌃ </string> <string name="accel-mac-command"> - ⌘ + ⌘ </string> <string name="accel-mac-option"> - ⌥ + ⌥ </string> <string name="accel-mac-shift"> - ⇧ + ⇧ </string> <string name="accel-win-control"> Ctrl+ @@ -519,82 +1751,1643 @@ Si sigue recibiendo este mensaje, contacte con el [SUPPORT_SITE]. <string name="accel-win-shift"> Mayús+ </string> - <string name="GraphicsQualityLow"> - Bajo + <string name="FileSaved"> + Archivo guardado </string> - <string name="GraphicsQualityMid"> - Medio + <string name="Receiving"> + Recibiendo </string> - <string name="GraphicsQualityHigh"> - Alto + <string name="AM"> + AM </string> - - <!-- PARCEL_CATEGORY_UI_STRING --> - <string name="Linden Location">Localización Linden</string> - <string name="Adult">'Adult'</string> - <string name="Arts&Culture">Arte y Cultura</string> - <string name="Business">Negocios</string> - <string name="Educational">Educativo</string> - <string name="Gaming">Juegos de azar</string> - <string name="Hangout">Entretenimiento</string> - <string name="Newcomer Friendly">Para recién llegados</string> - <string name="Parks&Nature">Parques y Naturaleza</string> - <string name="Residential">Residencial</string> - <string name="Shopping">Compras</string> - <string name="Other">Otra</string> - - <string name="ringing"> - Conectando al chat de voz... + <string name="PM"> + PM </string> - <string name="connected"> - Conectado + <string name="PST"> + PST </string> - <string name="unavailable"> - La voz no está disponible en su localización actual + <string name="PDT"> + PDT </string> - <string name="hang_up"> - Desconectado del chat de voz + <string name="Forward"> + Adelante + </string> + <string name="Left"> + Izquierda + </string> + <string name="Right"> + Derecha + </string> + <string name="Back"> + Atrás + </string> + <string name="North"> + Norte + </string> + <string name="South"> + Sur + </string> + <string name="West"> + Oeste + </string> + <string name="East"> + Este + </string> + <string name="Up"> + Arriba + </string> + <string name="Down"> + Abajo + </string> + <string name="Any Category"> + Cualquier categorÃa + </string> + <string name="Shopping"> + Compras + </string> + <string name="Land Rental"> + Terreno en alquiler + </string> + <string name="Property Rental"> + Propiedad en alquiler + </string> + <string name="Special Attraction"> + Atracción especial + </string> + <string name="New Products"> + Nuevos productos + </string> + <string name="Employment"> + Empleo + </string> + <string name="Wanted"> + Se busca + </string> + <string name="Service"> + Servicios + </string> + <string name="Personal"> + Personal + </string> + <string name="None"> + Ninguno + </string> + <string name="Linden Location"> + Localización Linden + </string> + <string name="Adult"> + 'Adult' + </string> + <string name="Arts&Culture"> + Arte y Cultura + </string> + <string name="Business"> + Negocios + </string> + <string name="Educational"> + Educativo + </string> + <string name="Gaming"> + Juegos de azar + </string> + <string name="Hangout"> + Entretenimiento + </string> + <string name="Newcomer Friendly"> + Para recién llegados + </string> + <string name="Parks&Nature"> + Parques y Naturaleza + </string> + <string name="Residential"> + Residencial + </string> + <string name="Stage"> + Artes escénicas + </string> + <string name="Other"> + Otra + </string> + <string name="Any"> + Cualquiera + </string> + <string name="You"> + Tú + </string> + <string name="Multiple Media"> + Múltiples medias + </string> + <string name="Play Media"> + Play/Pausa los media + </string> + <string name="MBCmdLineError"> + Ha habido un error analizando la lÃnea de comando. +Por favor, consulta: http://wiki.secondlife.com/wiki/Client_parameters +Error: + </string> + <string name="MBCmdLineUsg"> + [APP_NAME] Uso de lÃnea de comando: + </string> + <string name="MBUnableToAccessFile"> + [APP_NAME] no puede acceder a un archivo que necesita. + +Puede ser porque estés ejecutando varias copias, o porque tu sistema crea -equivocadamente- que el archivo está abierto. +Si este mensaje persiste, reinicia tu ordenador y vuelve a intentarlo. +Si aun asà sigue apareciendo el mensaje, debes desinstalar completamente [APP_NAME] y reinstalarlo. + </string> + <string name="MBFatalError"> + Error fatal + </string> + <string name="MBRequiresAltiVec"> + [APP_NAME] requiere un procesador con AltiVec (G4 o posterior). + </string> + <string name="MBAlreadyRunning"> + [APP_NAME] ya se está ejecutando. +Revisa tu barra de tareas para encontrar una copia minimizada del programa. +Si este mensaje persiste, reinicia tu ordenador. + </string> + <string name="MBFrozenCrashed"> + En su anterior ejecución, [APP_NAME] se congeló o se cayó. +¿Quieres enviar un informe de caÃda? + </string> + <string name="MBAlert"> + Alerta + </string> + <string name="MBNoDirectX"> + [APP_NAME] no encuentra DirectX 9.0b o superior. +[APP_NAME] usa DirectX para detectar el hardware o los drivers no actualizados que pueden provocar problemas de estabilidad, ejecución pobre y caÃdas. Aunque puedes ejecutar [APP_NAME] sin él, recomendamos encarecidamente hacerlo con DirectX 9.0b. + +¿Quieres continuar? + </string> + <string name="MBWarning"> + ¡Atención! + </string> + <string name="MBNoAutoUpdate"> + Las actualizaciones automáticas no están todavÃa implementadas para Linux. +Por favor, descarga la última versión desde www.secondlife.com. + </string> + <string name="MBRegClassFailed"> + Fallo en RegisterClass + </string> + <string name="MBError"> + Error + </string> + <string name="MBFullScreenErr"> + No puede ejecutarse a pantalla completa de [WIDTH] x [HEIGHT]. +Ejecutándose en una ventana. + </string> + <string name="MBDestroyWinFailed"> + Error Shutdown destruyendo la ventana (DestroyWindow() failed) + </string> + <string name="MBShutdownErr"> + Error Shutdown + </string> + <string name="MBDevContextErr"> + No se puede construir el 'GL device context' + </string> + <string name="MBPixelFmtErr"> + No se puede encontrar un formato adecuado de pÃxel + </string> + <string name="MBPixelFmtDescErr"> + No se puede conseguir la descripción del formato de pÃxel + </string> + <string name="MBTrueColorWindow"> + Para ejecutarse, [APP_NAME] necesita True Color (32-bit). +Por favor, en las configuraciones de tu ordenador ajusta el modo de color a 32-bit. + </string> + <string name="MBAlpha"> + [APP_NAME] no puede ejecutarse porque no puede obtener un canal alpha de 8 bit. Generalmente, se debe a alguna cuestión de los drivers de la tarjeta de vÃdeo. +Por favor, comprueba que tienes instalados los últimos drivers para tu tarjeta de vÃdeo. +Comprueba también que tu monitor esta configurado para True Color (32-bit) en Panel de Control > Apariencia y temas > Pantalla. +Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE]. + </string> + <string name="MBPixelFmtSetErr"> + No se puede configurar el formato de pÃxel + </string> + <string name="MBGLContextErr"> + No se puede crear el 'GL rendering context' + </string> + <string name="MBGLContextActErr"> + No se puede activar el 'GL rendering context' + </string> + <string name="MBVideoDrvErr"> + [APP_NAME] no puede ejecutarse porque los drivers de tu tarjeta de vÃdeo o no están bien instalados, o no están actualizados, o son para hardware no admitido. Por favor, comprueba que tienes los drivers más actuales para tu tarjeta de vÃdeo, y, aunque los tengas, intenta reinstalarlos. + +Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE]. + </string> + <string name="5 O'Clock Shadow"> + Barba del dÃa + </string> + <string name="All White"> + Blanco del todo + </string> + <string name="Anime Eyes"> + Ojos de cómic + </string> + <string name="Arced"> + Arqueadas + </string> + <string name="Arm Length"> + Brazos: longitud + </string> + <string name="Attached"> + Cortos + </string> + <string name="Attached Earlobes"> + Lóbulos + </string> + <string name="Back Fringe"> + Nuca: largo + </string> + <string name="Baggy"> + Marcadas + </string> + <string name="Bangs"> + Bangs + </string> + <string name="Beady Eyes"> + Ojos pequeños + </string> + <string name="Belly Size"> + Barriga: tamaño + </string> + <string name="Big"> + Grande + </string> + <string name="Big Butt"> + Culo grande + </string> + <string name="Big Hair Back"> + Pelo: moño + </string> + <string name="Big Hair Front"> + Pelo: tupé + </string> + <string name="Big Hair Top"> + Pelo: melena alta + </string> + <string name="Big Head"> + Cabeza grande + </string> + <string name="Big Pectorals"> + Grandes pectorales + </string> + <string name="Big Spikes"> + Crestas grandes + </string> + <string name="Black"> + Negro + </string> + <string name="Blonde"> + Rubio + </string> + <string name="Blonde Hair"> + Pelo rubio + </string> + <string name="Blush"> + Colorete + </string> + <string name="Blush Color"> + Color del colorete + </string> + <string name="Blush Opacity"> + Opacidad del colorete + </string> + <string name="Body Definition"> + Definición del cuerpo + </string> + <string name="Body Fat"> + Cuerpo: gordura + </string> + <string name="Body Freckles"> + Pecas del cuerpo + </string> + <string name="Body Thick"> + Cuerpo grueso + </string> + <string name="Body Thickness"> + Cuerpo: grosor + </string> + <string name="Body Thin"> + Cuerpo delgado + </string> + <string name="Bow Legged"> + Abiertas + </string> + <string name="Breast Buoyancy"> + Busto: firmeza + </string> + <string name="Breast Cleavage"> + Busto: canalillo + </string> + <string name="Breast Size"> + Busto: tamaño + </string> + <string name="Bridge Width"> + Puente: ancho + </string> + <string name="Broad"> + Aumentar + </string> + <string name="Brow Size"> + Arco ciliar + </string> + <string name="Bug Eyes"> + Bug Eyes + </string> + <string name="Bugged Eyes"> + Ojos saltones + </string> + <string name="Bulbous"> + Bulbosa + </string> + <string name="Bulbous Nose"> + Nariz de porra + </string> + <string name="Bushy Eyebrows"> + Cejijuntas + </string> + <string name="Bushy Hair"> + Pelo tupido + </string> + <string name="Butt Size"> + Culo: tamaño + </string> + <string name="bustle skirt"> + Polisón + </string> + <string name="no bustle"> + Sin polisón + </string> + <string name="more bustle"> + Con polisón + </string> + <string name="Chaplin"> + Cortito + </string> + <string name="Cheek Bones"> + Pómulos + </string> + <string name="Chest Size"> + Tórax: tamaño + </string> + <string name="Chin Angle"> + Barbilla: ángulo + </string> + <string name="Chin Cleft"> + Barbilla: contorno + </string> + <string name="Chin Curtains"> + Barba en collar + </string> + <string name="Chin Depth"> + Barbilla: largo + </string> + <string name="Chin Heavy"> + Hacia la barbilla + </string> + <string name="Chin In"> + Barbilla retraÃda + </string> + <string name="Chin Out"> + Barbilla prominente + </string> + <string name="Chin-Neck"> + Papada + </string> + <string name="Clear"> + Transparente + </string> + <string name="Cleft"> + Remarcar + </string> + <string name="Close Set Eyes"> + Ojos juntos + </string> + <string name="Closed"> + Cerrar + </string> + <string name="Closed Back"> + Trasera cerrada + </string> + <string name="Closed Front"> + Frontal cerrado + </string> + <string name="Closed Left"> + Cerrada + </string> + <string name="Closed Right"> + Cerrada + </string> + <string name="Coin Purse"> + Poco abultada + </string> + <string name="Collar Back"> + Espalda + </string> + <string name="Collar Front"> + Escote + </string> + <string name="Corner Down"> + Hacia abajo + </string> + <string name="Corner Up"> + Hacia arriba + </string> + <string name="Creased"> + CaÃdos + </string> + <string name="Crooked Nose"> + Nariz torcida + </string> + <string name="Cuff Flare"> + Acampanado + </string> + <string name="Dark"> + Oscuridad + </string> + <string name="Dark Green"> + Verde oscuro + </string> + <string name="Darker"> + Más oscuros + </string> + <string name="Deep"> + Remarcar + </string> + <string name="Default Heels"> + Tacones por defecto + </string> + <string name="Dense"> + Densas + </string> + <string name="Double Chin"> + Mucha papada + </string> + <string name="Downturned"> + Poco + </string> + <string name="Duffle Bag"> + Muy abultada + </string> + <string name="Ear Angle"> + Orejas: ángulo + </string> + <string name="Ear Size"> + Orejas: tamaño + </string> + <string name="Ear Tips"> + Orejas: forma + </string> + <string name="Egg Head"> + Cabeza: ahuevada + </string> + <string name="Eye Bags"> + Ojos: bolsas + </string> + <string name="Eye Color"> + Ojos: color + </string> + <string name="Eye Depth"> + Ojos: profundidad + </string> + <string name="Eye Lightness"> + Ojos: brillo + </string> + <string name="Eye Opening"> + Ojos: apertura + </string> + <string name="Eye Pop"> + Ojos: simetrÃa + </string> + <string name="Eye Size"> + Ojos: tamaño + </string> + <string name="Eye Spacing"> + Ojos: separación + </string> + <string name="Eyebrow Arc"> + Cejas: arco + </string> + <string name="Eyebrow Density"> + Cejas: densidad + </string> + <string name="Eyebrow Height"> + Cejas: altura + </string> + <string name="Eyebrow Points"> + Cejas: en V + </string> + <string name="Eyebrow Size"> + Cejas: tamaño + </string> + <string name="Eyelash Length"> + Pestañas: longitud + </string> + <string name="Eyeliner"> + Contorno de ojos + </string> + <string name="Eyeliner Color"> + Contorno de ojos: color + </string> + <string name="Eyes Bugged"> + Eyes Bugged + </string> + <string name="Face Shear"> + Cara: simetrÃa + </string> + <string name="Facial Definition"> + Rasgos marcados + </string> + <string name="Far Set Eyes"> + Ojos separados + </string> + <string name="Fat Lips"> + Prominentes + </string> + <string name="Female"> + Mujer + </string> + <string name="Fingerless"> + Sin dedos + </string> + <string name="Fingers"> + Con dedos + </string> + <string name="Flared Cuffs"> + Campana + </string> + <string name="Flat"> + Redondeadas + </string> + <string name="Flat Butt"> + Culo plano + </string> + <string name="Flat Head"> + Cabeza plana + </string> + <string name="Flat Toe"> + Empeine bajo + </string> + <string name="Foot Size"> + Pie: tamaño + </string> + <string name="Forehead Angle"> + Frente: ángulo + </string> + <string name="Forehead Heavy"> + Hacia la frente + </string> + <string name="Freckles"> + Pecas + </string> + <string name="Front Fringe"> + Flequillo + </string> + <string name="Full Back"> + Sin cortar + </string> + <string name="Full Eyeliner"> + Contorno completo + </string> + <string name="Full Front"> + Sin cortar + </string> + <string name="Full Hair Sides"> + Pelo: volumen a los lados + </string> + <string name="Full Sides"> + Volumen total + </string> + <string name="Glossy"> + Con brillo + </string> + <string name="Glove Fingers"> + Guantes: dedos + </string> + <string name="Glove Length"> + Guantes: largo + </string> + <string name="Hair"> + Pelo + </string> + <string name="Hair Back"> + Pelo: nuca + </string> + <string name="Hair Front"> + Pelo: delante + </string> + <string name="Hair Sides"> + Pelo: lados + </string> + <string name="Hair Sweep"> + Peinado: dirección + </string> + <string name="Hair Thickess"> + Pelo: espesor + </string> + <string name="Hair Thickness"> + Pelo: espesor + </string> + <string name="Hair Tilt"> + Pelo: inclinación + </string> + <string name="Hair Tilted Left"> + A la izq. + </string> + <string name="Hair Tilted Right"> + A la der. + </string> + <string name="Hair Volume"> + Pelo: volumen + </string> + <string name="Hand Size"> + Manos: tamaño + </string> + <string name="Handlebars"> + Muy largo + </string> + <string name="Head Length"> + Cabeza: longitud + </string> + <string name="Head Shape"> + Cabeza: forma + </string> + <string name="Head Size"> + Cabeza: tamaño + </string> + <string name="Head Stretch"> + Cabeza: estiramiento + </string> + <string name="Heel Height"> + Tacón: altura + </string> + <string name="Heel Shape"> + Tacón: forma + </string> + <string name="Height"> + Altura + </string> + <string name="High"> + Subir + </string> + <string name="High Heels"> + Tacones altos + </string> + <string name="High Jaw"> + MandÃbula alta + </string> + <string name="High Platforms"> + Suela gorda + </string> + <string name="High and Tight"> + Pegada + </string> + <string name="Higher"> + Arrriba + </string> + <string name="Hip Length"> + Cadera: altura + </string> + <string name="Hip Width"> + Cadera: ancho + </string> + <string name="In"> + Pegadas + </string> + <string name="In Shdw Color"> + LÃnea de ojos: color + </string> + <string name="In Shdw Opacity"> + LÃnea de ojos: opacidad + </string> + <string name="Inner Eye Corner"> + Ojos: lagrimal + </string> + <string name="Inner Eye Shadow"> + Inner Eye Shadow + </string> + <string name="Inner Shadow"> + LÃnea de ojos + </string> + <string name="Jacket Length"> + Chaqueta: largo + </string> + <string name="Jacket Wrinkles"> + Chaqueta: arrugas + </string> + <string name="Jaw Angle"> + MandÃbula: ángulo + </string> + <string name="Jaw Jut"> + Maxilar inferior + </string> + <string name="Jaw Shape"> + MandÃbula: forma + </string> + <string name="Join"> + Más junto + </string> + <string name="Jowls"> + Mofletes + </string> + <string name="Knee Angle"> + Rodillas: ángulo + </string> + <string name="Knock Kneed"> + Zambas + </string> + <string name="Large"> + Aumentar + </string> + <string name="Large Hands"> + Manos grandes + </string> + <string name="Left Part"> + Raya: izq. + </string> + <string name="Leg Length"> + Piernas: longitud + </string> + <string name="Leg Muscles"> + Piernas: musculatura + </string> + <string name="Less"> + Menos + </string> + <string name="Less Body Fat"> + Menos gordura + </string> + <string name="Less Curtains"> + Menos tupida + </string> + <string name="Less Freckles"> + Menos pecas + </string> + <string name="Less Full"> + Menos grosor + </string> + <string name="Less Gravity"> + Más levantado + </string> + <string name="Less Love"> + Menos michelines + </string> + <string name="Less Muscles"> + Pocos músculos + </string> + <string name="Less Muscular"> + Poca musculatura + </string> + <string name="Less Rosy"> + Menos sonrosada + </string> + <string name="Less Round"> + Menos redondeada + </string> + <string name="Less Saddle"> + Menos cartucheras + </string> + <string name="Less Square"> + Menos cuadrada + </string> + <string name="Less Volume"> + Menos volumen + </string> + <string name="Less soul"> + Pequeña + </string> + <string name="Lighter"> + Más luminosos + </string> + <string name="Lip Cleft"> + Labio: hoyuelo + </string> + <string name="Lip Cleft Depth"> + Hoyuelo marcado + </string> + <string name="Lip Fullness"> + Labios: grosor + </string> + <string name="Lip Pinkness"> + Labios sonrosados + </string> + <string name="Lip Ratio"> + Labios: ratio + </string> + <string name="Lip Thickness"> + Labios: prominencia + </string> + <string name="Lip Width"> + Labios: ancho + </string> + <string name="Lipgloss"> + Brillo de labios + </string> + <string name="Lipstick"> + Barra de labios + </string> + <string name="Lipstick Color"> + Barra de labios: color + </string> + <string name="Long"> + Más + </string> + <string name="Long Head"> + Cabeza alargada + </string> + <string name="Long Hips"> + Cadera larga + </string> + <string name="Long Legs"> + Piernas largas + </string> + <string name="Long Neck"> + Cuello largo + </string> + <string name="Long Pigtails"> + Coletas largas + </string> + <string name="Long Ponytail"> + Cola de caballo larga + </string> + <string name="Long Torso"> + Torso largo + </string> + <string name="Long arms"> + Brazos largos + </string> + <string name="Loose Pants"> + Pantalón suelto + </string> + <string name="Loose Shirt"> + Camiseta suelta + </string> + <string name="Loose Sleeves"> + Puños anchos + </string> + <string name="Love Handles"> + Michelines + </string> + <string name="Low"> + Bajar + </string> + <string name="Low Heels"> + Tacones bajos + </string> + <string name="Low Jaw"> + MandÃbula baja + </string> + <string name="Low Platforms"> + Suela fina + </string> + <string name="Low and Loose"> + Suelta + </string> + <string name="Lower"> + Abajo + </string> + <string name="Lower Bridge"> + Puente: abajo + </string> + <string name="Lower Cheeks"> + Mejillas: abajo + </string> + <string name="Male"> + Varón + </string> + <string name="Middle Part"> + Raya: en medio + </string> + <string name="More"> + Más + </string> + <string name="More Blush"> + Más colorete + </string> + <string name="More Body Fat"> + Más gordura + </string> + <string name="More Curtains"> + Más tupida + </string> + <string name="More Eyeshadow"> + Más + </string> + <string name="More Freckles"> + Más pecas + </string> + <string name="More Full"> + Más grosor + </string> + <string name="More Gravity"> + Menos levantado + </string> + <string name="More Lipstick"> + Más barra de labios + </string> + <string name="More Love"> + Más michelines + </string> + <string name="More Lower Lip"> + Más el inferior + </string> + <string name="More Muscles"> + Más músculos + </string> + <string name="More Muscular"> + Más musculatura + </string> + <string name="More Rosy"> + Más sonrosada + </string> + <string name="More Round"> + Más redondeada + </string> + <string name="More Saddle"> + Más cartucheras + </string> + <string name="More Sloped"> + Más inclinada + </string> + <string name="More Square"> + Más cuadrada + </string> + <string name="More Upper Lip"> + Más el superior + </string> + <string name="More Vertical"> + Más recta + </string> + <string name="More Volume"> + Más volumen + </string> + <string name="More soul"> + Grande + </string> + <string name="Moustache"> + Bigote + </string> + <string name="Mouth Corner"> + Comisuras + </string> + <string name="Mouth Position"> + Boca: posición + </string> + <string name="Mowhawk"> + Rapado + </string> + <string name="Muscular"> + Muscular + </string> + <string name="Mutton Chops"> + Patillas largas + </string> + <string name="Nail Polish"> + Uñas pintadas + </string> + <string name="Nail Polish Color"> + Uñas pintadas: color + </string> + <string name="Narrow"> + Disminuir + </string> + <string name="Narrow Back"> + Rapada + </string> + <string name="Narrow Front"> + Entradas + </string> + <string name="Narrow Lips"> + Labios estrechos + </string> + <string name="Natural"> + Natural + </string> + <string name="Neck Length"> + Cuello: longitud + </string> + <string name="Neck Thickness"> + Cuello: grosor + </string> + <string name="No Blush"> + Sin colorete + </string> + <string name="No Eyeliner"> + Sin contorno + </string> + <string name="No Eyeshadow"> + Menos + </string> + <string name="No Lipgloss"> + Sin brillo + </string> + <string name="No Lipstick"> + Sin barra de labios + </string> + <string name="No Part"> + Sin raya + </string> + <string name="No Polish"> + Sin pintar + </string> + <string name="No Red"> + Nada + </string> + <string name="No Spikes"> + Sin crestas + </string> + <string name="No White"> + Sin blanco + </string> + <string name="No Wrinkles"> + Sin arrugas + </string> + <string name="Normal Lower"> + Normal Lower + </string> + <string name="Normal Upper"> + Normal Upper + </string> + <string name="Nose Left"> + Nariz a la izq. + </string> + <string name="Nose Right"> + Nariz a la der. + </string> + <string name="Nose Size"> + Nariz: tamaño + </string> + <string name="Nose Thickness"> + Nariz: grosor + </string> + <string name="Nose Tip Angle"> + Nariz: respingona + </string> + <string name="Nose Tip Shape"> + Nariz: punta + </string> + <string name="Nose Width"> + Nariz: ancho + </string> + <string name="Nostril Division"> + Ventana: altura + </string> + <string name="Nostril Width"> + Ventana: ancho + </string> + <string name="Opaque"> + Opaco + </string> + <string name="Open"> + Abrir + </string> + <string name="Open Back"> + Apertura trasera + </string> + <string name="Open Front"> + Apertura frontal + </string> + <string name="Open Left"> + Abierta + </string> + <string name="Open Right"> + Abierta + </string> + <string name="Orange"> + Anaranjado + </string> + <string name="Out"> + De soplillo + </string> + <string name="Out Shdw Color"> + Sombra de ojos: color + </string> + <string name="Out Shdw Opacity"> + Sombra de ojos: opacidad + </string> + <string name="Outer Eye Corner"> + Ojos: comisura + </string> + <string name="Outer Eye Shadow"> + Outer Eye Shadow + </string> + <string name="Outer Shadow"> + Sombra de ojos + </string> + <string name="Overbite"> + RetraÃdo + </string> + <string name="Package"> + Pubis + </string> + <string name="Painted Nails"> + Pintadas + </string> + <string name="Pale"> + Pálida + </string> + <string name="Pants Crotch"> + Pantalón: cruz + </string> + <string name="Pants Fit"> + Ceñido + </string> + <string name="Pants Length"> + Pernera: largo + </string> + <string name="Pants Waist"> + Caja + </string> + <string name="Pants Wrinkles"> + Pantalón: arrugas + </string> + <string name="Part"> + Raya + </string> + <string name="Part Bangs"> + Flequillo partido + </string> + <string name="Pectorals"> + Pectorales + </string> + <string name="Pigment"> + Tono + </string> + <string name="Pigtails"> + Coletas + </string> + <string name="Pink"> + Rosa + </string> + <string name="Pinker"> + Más sonrosados + </string> + <string name="Platform Height"> + Suela: altura + </string> + <string name="Platform Width"> + Suela: ancho + </string> + <string name="Pointy"> + En punta + </string> + <string name="Pointy Heels"> + De aguja + </string> + <string name="Ponytail"> + Cola de caballo + </string> + <string name="Poofy Skirt"> + Con vuelo + </string> + <string name="Pop Left Eye"> + Izquierdo más grande + </string> + <string name="Pop Right Eye"> + Derecho más grande + </string> + <string name="Puffy"> + Hinchadas + </string> + <string name="Puffy Eyelids"> + Ojeras + </string> + <string name="Rainbow Color"> + Irisación + </string> + <string name="Red Hair"> + Pelirrojo + </string> + <string name="Regular"> + Regular + </string> + <string name="Right Part"> + Raya: der. + </string> + <string name="Rosy Complexion"> + Tez sonrosada + </string> + <string name="Round"> + Redondear + </string> + <string name="Ruddiness"> + Rubicundez + </string> + <string name="Ruddy"> + Rojiza + </string> + <string name="Rumpled Hair"> + Pelo encrespado + </string> + <string name="Saddle Bags"> + Cartucheras + </string> + <string name="Scrawny Leg"> + Piernas flacas + </string> + <string name="Separate"> + Más ancho + </string> + <string name="Shallow"> + Sin marcar + </string> + <string name="Shear Back"> + Nuca: corte + </string> + <string name="Shear Face"> + Shear Face + </string> + <string name="Shear Front"> + Shear Front + </string> + <string name="Shear Left Up"> + Arriba - izq. + </string> + <string name="Shear Right Up"> + Arriba - der. + </string> + <string name="Sheared Back"> + Rapada + </string> + <string name="Sheared Front"> + Rapada + </string> + <string name="Shift Left"> + A la izq. + </string> + <string name="Shift Mouth"> + Boca: ladeada + </string> + <string name="Shift Right"> + A la der. + </string> + <string name="Shirt Bottom"> + Alto de cintura + </string> + <string name="Shirt Fit"> + Ceñido + </string> + <string name="Shirt Wrinkles"> + Camisa: arrugas + </string> + <string name="Shoe Height"> + Caña: altura + </string> + <string name="Short"> + Menos + </string> + <string name="Short Arms"> + Brazos cortos + </string> + <string name="Short Legs"> + Piernas cortas + </string> + <string name="Short Neck"> + Cuello corto + </string> + <string name="Short Pigtails"> + Coletas cortas + </string> + <string name="Short Ponytail"> + Cola de caballo corta + </string> + <string name="Short Sideburns"> + Patillas cortas + </string> + <string name="Short Torso"> + Torso corto + </string> + <string name="Short hips"> + Cadera corta + </string> + <string name="Shoulders"> + Hombros + </string> + <string name="Side Fringe"> + Lados: franja + </string> + <string name="Sideburns"> + Patillas + </string> + <string name="Sides Hair"> + Pelo: lados + </string> + <string name="Sides Hair Down"> + Bajar lados del pelo + </string> + <string name="Sides Hair Up"> + Subir lados del pelo + </string> + <string name="Skinny Neck"> + Cuello estrecho + </string> + <string name="Skirt Fit"> + Falda: vuelo + </string> + <string name="Skirt Length"> + Falda: largo + </string> + <string name="Slanted Forehead"> + Slanted Forehead + </string> + <string name="Sleeve Length"> + Largo de manga + </string> + <string name="Sleeve Looseness"> + Ancho de puños + </string> + <string name="Slit Back"> + Raja trasera + </string> + <string name="Slit Front"> + Raja frontal + </string> + <string name="Slit Left"> + Raja a la izq. + </string> + <string name="Slit Right"> + Raja a la der. + </string> + <string name="Small"> + Disminuir + </string> + <string name="Small Hands"> + Manos pequeñas + </string> + <string name="Small Head"> + Cabeza pequeña + </string> + <string name="Smooth"> + Leves + </string> + <string name="Smooth Hair"> + Pelo liso + </string> + <string name="Socks Length"> + Calcetines: largo + </string> + <string name="Soulpatch"> + Perilla + </string> + <string name="Sparse"> + Depiladas + </string> + <string name="Spiked Hair"> + Crestas + </string> + <string name="Square"> + Cuadrada + </string> + <string name="Square Toe"> + Punta cuadrada + </string> + <string name="Squash Head"> + Cabeza aplastada + </string> + <string name="Stretch Head"> + Cabeza estirada + </string> + <string name="Sunken"> + Chupadas + </string> + <string name="Sunken Chest"> + Estrecho de pecho + </string> + <string name="Sunken Eyes"> + Ojos hundidos + </string> + <string name="Sweep Back"> + Sweep Back + </string> + <string name="Sweep Forward"> + Sweep Forward + </string> + <string name="Tall"> + Más + </string> + <string name="Taper Back"> + Cubierta trasera + </string> + <string name="Taper Front"> + Cubierta frontal + </string> + <string name="Thick Heels"> + Tacones grandes + </string> + <string name="Thick Neck"> + Cuello ancho + </string> + <string name="Thick Toe"> + Empeine alto + </string> + <string name="Thin"> + Delgadas + </string> + <string name="Thin Eyebrows"> + Cejas finas + </string> + <string name="Thin Lips"> + Hacia dentro + </string> + <string name="Thin Nose"> + Nariz fina + </string> + <string name="Tight Chin"> + Poca papada + </string> + <string name="Tight Cuffs"> + Sin campana + </string> + <string name="Tight Pants"> + Pantalón ceñido + </string> + <string name="Tight Shirt"> + Camisa ceñida + </string> + <string name="Tight Skirt"> + Falda ceñida + </string> + <string name="Tight Sleeves"> + Puños ceñidos + </string> + <string name="Toe Shape"> + Punta: forma + </string> + <string name="Toe Thickness"> + Empeine + </string> + <string name="Torso Length"> + Torso: longitud + </string> + <string name="Torso Muscles"> + Torso: musculatura + </string> + <string name="Torso Scrawny"> + Torso flacucho + </string> + <string name="Unattached"> + Largos + </string> + <string name="Uncreased"> + Abiertos + </string> + <string name="Underbite"> + Prognatismo + </string> + <string name="Unnatural"> + No natural + </string> + <string name="Upper Bridge"> + Puente: arriba + </string> + <string name="Upper Cheeks"> + Mejillas: arriba + </string> + <string name="Upper Chin Cleft"> + Barbilla: prominencia + </string> + <string name="Upper Eyelid Fold"> + Párpados + </string> + <string name="Upturned"> + Mucho + </string> + <string name="Very Red"> + Del todo + </string> + <string name="Waist Height"> + Cintura + </string> + <string name="Well-Fed"> + Mofletes + </string> + <string name="White Hair"> + Pelo blanco + </string> + <string name="Wide"> + Aumentar + </string> + <string name="Wide Back"> + Completa + </string> + <string name="Wide Front"> + Completa + </string> + <string name="Wide Lips"> + Labios anchos + </string> + <string name="Wild"> + Total + </string> + <string name="Wrinkles"> + Arrugas + </string> + <string name="LocationCtrlAddLandmarkTooltip"> + Añadir a mis hitos + </string> + <string name="LocationCtrlEditLandmarkTooltip"> + Editar mis hitos + </string> + <string name="LocationCtrlInfoBtnTooltip"> + Ver más información de esta localización + </string> + <string name="LocationCtrlComboBtnTooltip"> + Historial de mis localizaciones + </string> + <string name="LocationCtrlAdultIconTooltip"> + Región Adulta + </string> + <string name="LocationCtrlModerateIconTooltip"> + Región Moderada + </string> + <string name="LocationCtrlGeneralIconTooltip"> + Región General + </string> + <string name="UpdaterWindowTitle"> + Actualizar [APP_NAME] + </string> + <string name="UpdaterNowUpdating"> + Actualizando [APP_NAME]... + </string> + <string name="UpdaterNowInstalling"> + Instalando [APP_NAME]... + </string> + <string name="UpdaterUpdatingDescriptive"> + Tu visor [APP_NAME] se está actualizando a la última versión. Llevará algún tiempo, paciencia. + </string> + <string name="UpdaterProgressBarTextWithEllipses"> + Descargando la actualización... + </string> + <string name="UpdaterProgressBarText"> + Descargando la actualización + </string> + <string name="UpdaterFailDownloadTitle"> + Fallo en la descarga de la actualización + </string> + <string name="UpdaterFailUpdateDescriptive"> + Ha habido un error actualizando [APP_NAME]. Por favor, descarga la última versión desde www.secondlife.com. + </string> + <string name="UpdaterFailInstallTitle"> + Fallo al instalar la actualización + </string> + <string name="UpdaterFailStartTitle"> + Fallo al iniciar el visor + </string> + <string name="ItemsComingInTooFastFrom"> + [APP_NAME]: Los Ãtems se reciben muy rápido de [FROM_NAME]; desactivada la vista previa automática durante [TIME] sgs. + </string> + <string name="ItemsComingInTooFast"> + [APP_NAME]: Los Ãtems se reciben muy rápido; desactivada la vista previa automática durante [TIME] sgs. + </string> + <string name="IM_logging_string"> + -- Activado el registro de los mensajes instantáneos -- + </string> + <string name="IM_typing_start_string"> + [NAME] está escribiendo... + </string> + <string name="Unnamed"> + (sin nombre) + </string> + <string name="IM_moderated_chat_label"> + (Moderado: por defecto, desactivada la voz) + </string> + <string name="IM_unavailable_text_label"> + Para esta llamada no está disponible el chat de texto. + </string> + <string name="IM_muted_text_label"> + Un moderador del grupo ha desactivado tu chat de texto. + </string> + <string name="IM_default_text_label"> + Pulsa aquà para enviar un mensaje instantáneo. + </string> + <string name="IM_to_label"> + A + </string> + <string name="IM_moderator_label"> + (Moderador) + </string> + <string name="answered_call"> + Han respondido a tu llamada + </string> + <string name="you_started_call"> + Has iniciado una llamada de voz + </string> + <string name="you_joined_call"> + Has entrado en la llamada de voz + </string> + <string name="name_started_call"> + [NAME] inició una llamada de voz + </string> + <string name="ringing-im"> + Haciendo la llamada de voz... + </string> + <string name="connected-im"> + Conectado, pulsa Colgar para salir + </string> + <string name="hang_up-im"> + Se colgó la llamada de voz </string> - <string name="ScriptQuestionCautionChatGranted"> - '[OBJECTNAME]', un objeto propiedad de '[OWNERNAME]', localizado en [REGIONNAME] con la posición [REGIONPOS], ha recibido permiso para: [PERMISSIONS]. - </string> - <string name="ScriptQuestionCautionChatDenied"> - A '[OBJECTNAME]', un objeto propiedad de '[OWNERNAME]', localizado en [REGIONNAME] con la posición [REGIONPOS], se le ha denegado el permiso para: [PERMISSIONS]. - </string> - <string name="ScriptTakeMoney"> - Cogerle a usted dólares Linden (L$) - </string> - <string name="ActOnControlInputs"> - Actuar en sus controles de entrada - </string> - <string name="RemapControlInputs"> - Reconfigurar sus controles de entrada - </string> - <string name="AnimateYourAvatar"> - Ejecutar animaciones en su avatar - </string> - <string name="AttachToYourAvatar"> - Anexarse a su avatar - </string> - <string name="ReleaseOwnership"> - Anular la propiedad y que pase a ser público - </string> - <string name="LinkAndDelink"> - Enlazar y desenlazar de otros objetos - </string> - <string name="AddAndRemoveJoints"> - Añadir y quitar uniones con otros objetos - </string> - <string name="ChangePermissions"> - Cambiar sus permisos - </string> - <string name="TrackYourCamera"> - Seguir su cámara - </string> - <string name="ControlYourCamera"> - Controlar su cámara - </string> - <string name="only_user_message"> Usted es el único usuario en esta sesión. </string> @@ -604,6 +3397,12 @@ Si sigue recibiendo este mensaje, contacte con el [SUPPORT_SITE]. <string name="invite_message"> Pulse el botón [BUTTON NAME] para aceptar/conectar este chat de voz. </string> + <string name="muted_message"> + Has ignorado a este residente. Enviándole un mensaje, automáticamente dejarás de ignorarle. + </string> + <string name="generic"> + Error en lo solicitado, por favor, inténtalo más tarde. + </string> <string name="generic_request_error"> Error al hacer lo solicitado; por favor, inténtelo más tarde. </string> @@ -622,46 +3421,283 @@ Si sigue recibiendo este mensaje, contacte con el [SUPPORT_SITE]. <string name="not_a_mod_error"> Usted no es un moderador de la sesión. </string> + <string name="muted"> + Un moderador del grupo ha desactivado tu chat de texto. + </string> <string name="muted_error"> Un moderador del grupo le ha desactivado el chat de texto. </string> <string name="add_session_event"> No se ha podido añadir usuarios a la sesión de chat con [RECIPIENT]. </string> + <string name="message"> + No se ha podido enviar tu mensaje a la sesión de chat con [RECIPIENT]. + </string> <string name="message_session_event"> No se ha podido enviar su mensaje a la sesión de chat con [RECIPIENT]. </string> + <string name="mute"> + Error moderando. + </string> + <string name="removed"> + Se te ha sacado del grupo. + </string> <string name="removed_from_group"> Ha sido eliminado del grupo. </string> <string name="close_on_no_ability"> Usted ya no tendrá más la capacidad de estar en la sesión de chat. </string> - <string name="AcctTypeResident"> - Residente - </string> - <string name="AcctTypeTrial"> - Prueba - </string> - <string name="AcctTypeCharterMember"> - Miembro fundador - </string> - <string name="AcctTypeEmployee"> - Empleado de Linden Lab - </string> - <string name="PaymentInfoUsed"> - Ha usado una forma de pago - </string> - <string name="PaymentInfoOnFile"> - Hay infor. de la forma de pago - </string> - <string name="NoPaymentInfoOnFile"> - Sin infor. de la forma de pago - </string> - <string name="AgeVerified"> - Edad verificada - </string> - <string name="NotAgeVerified"> - Edad no verificada - </string> + <string name="unread_chat_single"> + [SOURCES] ha dicho algo nuevo + </string> + <string name="unread_chat_multiple"> + [SOURCES] ha dicho algo nuevo + </string> + <string name="session_initialization_timed_out_error"> + Se ha agotado el tiempo del inicio de sesión + </string> + <string name="voice_morphing_url"> + http://secondlife.com/landing/voicemorphing + </string> + <string name="paid_you_ldollars"> + [NAME] te ha pagado [AMOUNT] L$ + </string> + <string name="you_paid_ldollars"> + Has pagado [AMOUNT] L$ a [NAME] por [REASON]. + </string> + <string name="you_paid_ldollars_no_info"> + Has pagado[AMOUNT] L$ + </string> + <string name="you_paid_ldollars_no_reason"> + Has pagado [AMOUNT] L$ a [NAME]. + </string> + <string name="you_paid_ldollars_no_name"> + Has pagado [AMOUNT] L$ por [REASON]. + </string> + <string name="for a parcel of land"> + para una parcela de terreno + </string> + <string name="for a land access pass"> + para un pase de acceso a terrenos + </string> + <string name="for deeding land"> + for deeding land + </string> + <string name="to create a group"> + para crear un grupo + </string> + <string name="to join a group"> + para entrar a un grupo + </string> + <string name="to upload"> + to upload + </string> + <string name="giving"> + Dando [AMOUNT] L$ + </string> + <string name="uploading_costs"> + Subir esto cuesta [AMOUNT] L$ + </string> + <string name="this_costs"> + Esto cuesta [AMOUNT] L$ + </string> + <string name="buying_selected_land"> + Compra del terreno seleccionado por [AMOUNT] L$ + </string> + <string name="this_object_costs"> + Este objeto cuesta [AMOUNT] L$ + </string> + <string name="group_role_everyone"> + Todos + </string> + <string name="group_role_officers"> + Oficiales + </string> + <string name="group_role_owners"> + Propietarios + </string> + <string name="uploading_abuse_report"> + Subiendo... + +Denuncia de infracción + </string> + <string name="New Shape"> + AnatomÃa nueva + </string> + <string name="New Skin"> + Piel nueva + </string> + <string name="New Hair"> + Pelo nuevo + </string> + <string name="New Eyes"> + Ojos nuevos + </string> + <string name="New Shirt"> + Camisa nueva + </string> + <string name="New Pants"> + Pantalón nuevo + </string> + <string name="New Shoes"> + Zapatos nuevos + </string> + <string name="New Socks"> + Calcetines nuevos + </string> + <string name="New Jacket"> + Chaqueta nueva + </string> + <string name="New Gloves"> + Guantes nuevos + </string> + <string name="New Undershirt"> + Camiseta nueva + </string> + <string name="New Underpants"> + Ropa interior nueva + </string> + <string name="New Skirt"> + Falda nueva + </string> + <string name="New Alpha"> + Nueva Alfa + </string> + <string name="New Tattoo"> + Tatuaje nuevo + </string> + <string name="Invalid Wearable"> + No se puede poner + </string> + <string name="New Script"> + Script nuevo + </string> + <string name="New Folder"> + Carpeta nueva + </string> + <string name="Contents"> + Contenidos + </string> + <string name="Gesture"> + Gestos + </string> + <string name="Male Gestures"> + Gestos de hombre + </string> + <string name="Female Gestures"> + Gestos de mujer + </string> + <string name="Other Gestures"> + Otros gestos + </string> + <string name="Speech Gestures"> + Gestos al hablar + </string> + <string name="Common Gestures"> + Gestos corrientes + </string> + <string name="Male - Excuse me"> + Varón - Disculpa + </string> + <string name="Male - Get lost"> + Varón – Déjame en paz + </string> + <string name="Male - Blow kiss"> + Varón - Lanzar un beso + </string> + <string name="Male - Boo"> + Varón - Abucheo + </string> + <string name="Male - Bored"> + Varón - Aburrido + </string> + <string name="Male - Hey"> + Varón – ¡Eh! + </string> + <string name="Male - Laugh"> + Varón - Risa + </string> + <string name="Male - Repulsed"> + Varón - Rechazo + </string> + <string name="Male - Shrug"> + Varón - Encogimiento de hombros + </string> + <string name="Male - Stick tougue out"> + Varón - Sacando la lengua + </string> + <string name="Male - Wow"> + Varón - Admiración + </string> + <string name="Female - Excuse me"> + Mujer - Disculpa + </string> + <string name="Female - Get lost"> + Mujer – Déjame en paz + </string> + <string name="Female - Blow kiss"> + Mujer - Lanzar un beso + </string> + <string name="Female - Boo"> + Mujer - Abucheo + </string> + <string name="Female - Bored"> + Mujer - Aburrida + </string> + <string name="Female - Hey"> + Mujer - ¡Eh! + </string> + <string name="Female - Laugh"> + Mujer - Risa + </string> + <string name="Female - Repulsed"> + Mujer - Rechazo + </string> + <string name="Female - Shrug"> + Mujer - Encogimiento de hombros + </string> + <string name="Female - Stick tougue out"> + Mujer - Sacando la lengua + </string> + <string name="Female - Wow"> + Mujer - Admiración + </string> + <string name="AvatarBirthDateFormat"> + [day,datetime,slt]/[mthnum,datetime,slt]/[year,datetime,slt] + </string> + <string name="DefaultMimeType"> + ninguno/ninguno + </string> + <string name="texture_load_dimensions_error"> + No se puede subir imágenes mayores de [WIDTH]*[HEIGHT] + </string> + <string name="words_separator" value=","/> + <string name="server_is_down"> + Parece que hay algún problema que ha escapado a nuestros controles. + + Visita status.secondlifegrid.net para ver si hay alguna incidencia conocida que esté afectando al servicio. + Si sigues teniendo problemas, comprueba la configuración de la red y del servidor de seguridad. + </string> + <string name="dateTimeWeekdaysNames"> + Domingo:Lunes:Martes:Miércoles:Jueves:Viernes:Sábado + </string> + <string name="dateTimeWeekdaysShortNames"> + Dom:Lun:Mar:Mié:Jue:Vie:Sáb + </string> + <string name="dateTimeMonthNames"> + Enero:Febrero:Marzo:Abril:Mayo:Junio:Julio:Agosto:Septiembre:Octubre:Noviembre:Diciembre + </string> + <string name="dateTimeMonthShortNames"> + Ene:Feb:Mar:Abr:May:Jun:Jul:Ago:Sep:Oct:Nov:Dic + </string> + <string name="dateTimeDayFormat"> + [MDAY] + </string> + <string name="dateTimeAM"> + AM + </string> + <string name="dateTimePM"> + PM + </string> </strings> diff --git a/indra/newview/skins/default/xui/es/teleport_strings.xml b/indra/newview/skins/default/xui/es/teleport_strings.xml index 6cf5437e3c..e0e0061729 100644 --- a/indra/newview/skins/default/xui/es/teleport_strings.xml +++ b/indra/newview/skins/default/xui/es/teleport_strings.xml @@ -2,15 +2,15 @@ <teleport_messages> <message_set name="errors"> <message name="invalid_tport"> - Ha habido un problema al procesar su petición de teleporte. Debe volver a iniciar sesión para poder teleportarse. Si le sigue apareciendo este mensaje, revise, por favor, las preguntas frecuentes en el Soporte técnico: -www.secondlife.com/support + Ha habido un problema al procesar tu petición de teleporte. Debes volver a iniciar sesión antes de poder teleportarte de nuevo. +Si sigues recibiendo este mensaje, por favor, acude al [SUPPORT_SITE]. </message> <message name="invalid_region_handoff"> - Ha habido un problema al procesar su paso a otra región. Debe volver a iniciar sesión para poder pasar de región a región. Si le sigue apareciendo este mensaje, revise, por favor, las preguntas frecuentes en el Soporte técnico: -www.secondlife.com/support + Ha habido un problema al procesar tu paso a otra región. Debes volver a iniciar sesión para poder pasar de región a región. +Si sigues recibiendo este mensaje, por favor, acude al [SUPPORT_SITE]. </message> <message name="blocked_tport"> - Lo sentimos, en estos momentos los teleportes están bloqueados. Vuelva a intentarlo en un momento. Si sigue sin poder teleportarse, desconéctese y vuelva a iniciar sesión para solucionar el problema. + Lo sentimos, en estos momentos los teleportes están bloqueados. Vuelve a intentarlo en un momento. Si sigues sin poder teleportarte, desconéctate y vuelve a iniciar sesión para solucionar el problema. </message> <message name="nolandmark_tport"> Lo sentimos, pero el sistema no ha podido localizar el destino de este hito. @@ -20,22 +20,22 @@ www.secondlife.com/support Vuelva a intentarlo en un momento. </message> <message name="noaccess_tport"> - Lo sentimos, pero usted no tiene acceso al destino de este teleporte. + Lo sentimos, pero no tienes acceso al destino de este teleporte. </message> <message name="missing_attach_tport"> - Aún no han llegado sus objetos anexados. Espere unos segundos más o desconéctese y vuelva a iniciar sesión antes de teleportarse. + Aún no han llegado tus objetos anexados. Espera unos segundos más o desconéctate y vuelve a iniciar sesión antes de teleportarte. </message> <message name="too_many_uploads_tport"> - La cola de espera en esta región está actualmente obstruida, por lo que su petición de teleporte no se atenderá en un tiempo prudencial. Por favor, vuelva a intentarlo en unos minutos o vaya a una zona menos ocupada. + La cola de espera en esta región está actualmente obstruida, por lo que tu petición de teleporte no se atenderá en un tiempo prudencial. Por favor, vuelve a intentarlo en unos minutos o ve a una zona menos ocupada. </message> <message name="expired_tport"> - Lo sentimos, pero el sistema no ha podido atender a su petición de teleporte en un tiempo prudencial. Por favor, vuelva a intentarlo en unos pocos minutos. + Lo sentimos, pero el sistema no ha podido atender a tu petición de teleporte en un tiempo prudencial. Por favor, vuelve a intentarlo en unos minutos. </message> <message name="expired_region_handoff"> - Lo sentimos, pero el sistema no ha podido completar su paso a otra región en un tiempo prudencial. Por favor, vuelva a intentarlo en unos pocos minutos. + Lo sentimos, pero el sistema no ha podido completar tu paso a otra región en un tiempo prudencial. Por favor, vuelve a intentarlo en unos minutos. </message> <message name="no_host"> - Ha sido imposible encontrar el destino del teleporte: o está desactivado temporalmente o ya no existe. Por favor, vuelva a intentarlo en unos pocos minutos. + Ha sido imposible encontrar el destino del teleporte: o está desactivado temporalmente o ya no existe. Por favor, vuelve a intentarlo en unos minutos. </message> <message name="no_inventory_host"> En estos momentos no está disponible el sistema del inventario. @@ -60,6 +60,9 @@ Vuelva a intentarlo en un momento. <message name="completing"> Completando el teleporte. </message> + <message name="completed_from"> + Teleporte realizado desde [T_SLURL] + </message> <message name="resolving"> Especificando el destino. </message> diff --git a/indra/newview/skins/default/xui/fr/floater_about.xml b/indra/newview/skins/default/xui/fr/floater_about.xml index 7d6d736c5e..a1cbeecfb9 100644 --- a/indra/newview/skins/default/xui/fr/floater_about.xml +++ b/indra/newview/skins/default/xui/fr/floater_about.xml @@ -8,7 +8,7 @@ Compilé avec [COMPILER] version [COMPILER_VERSION] </floater.string> <floater.string name="AboutPosition"> - Vous êtes à [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] dans [REGION] se trouvant à [HOSTNAME] ([HOSTIP]) + Vous êtes à [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] dans [REGION] se trouvant à <nolink>[HOSTNAME]</nolink> ([HOSTIP]) [SERVER_VERSION] [[SERVER_RELEASE_NOTES_URL] [ReleaseNotes]] </floater.string> @@ -23,13 +23,13 @@ Cartes graphiques : [GRAPHICS_CARD] Version Windows Graphics Driver : [GRAPHICS_DRIVER_VERSION] </floater.string> <floater.string name="AboutLibs"> - Version OpenGL : [OPENGL_VERSION] + Version OpenGL : [OPENGL_VERSION] Version libcurl : [LIBCURL_VERSION] -Version J2C Decoder : [J2C_VERSION] -Version Audio Driver : [AUDIO_DRIVER_VERSION] -Version Qt Webkit : [QT_WEBKIT_VERSION] -Version Vivox : [VIVOX_VERSION] +Version J2C Decoder : [J2C_VERSION] +Version Audio Driver : [AUDIO_DRIVER_VERSION] +Version Qt Webkit : [QT_WEBKIT_VERSION] +Version serveur vocal : [VOICE_VERSION] </floater.string> <floater.string name="none"> (aucun) @@ -43,13 +43,14 @@ Version Vivox : [VIVOX_VERSION] </panel> <panel label="Remerciements" name="credits_panel"> <text_editor name="credits_editor"> - Second Life existe grâce aux efforts de Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl et de nombreuses autres personnes. + Second Life existe grâce aux efforts de Philip, Tessa, Andrew, Cory, Ian, James, Phoenix, Ryan, Haney, Dan, Char, Ben, John, Tanya, Eddie, Richard, Mitch, Doug, Eric, Frank, Bruce, Aaron, Peter, Alice, Charlie, Debra, Eileen, Helen, Janet, Steffan, Steve, Tom, Mark, Hunter, Xenon, Burgess, Bill, Jim, Lee, Hamlet, Daniel, Jeff, Todd, Sarah, Tim, Stephanie, Colin, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Jack, Vektor, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Jesse, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Yuko, Makiko, Thomas, Harry, Seth, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Brad, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, Beez, Milo, Hermia, Red, Thrax, Gulliver, Joe, Sally, Paul, Jose, Rejean, Dore, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, Dustin, George, Del, Matthew, Cat, Jacqui, Adrian, Viola, Alfred, Noel, Irfan, Yool, Rika, Jane, Frontier, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Jeremy, JP, Jake, Anthony, Maurice, Madhavi, Leopard, Kyle, Joon, Bert, Belinda, Jon, Kristi, Bridie, Pramod, Socrates, Maria, Aric, Adreanne, Jay, Kari, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Colossus, Zen, BigPapi, Pastrami, Kurz, Mani, Neuro, Mel, Sardonyx, MJ, Rowan, Sgt, Elvis, Samuel, Leo, Bryan, Niko, Austin, Soft, Poppy, Rachel, Aki, Banzai, Alexa, Sue, Bender, CG, Angelo, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Rothman, Niall, Marin, Allison, Katie, Dawn, Dusty, Katt, Judy, Andrea, Ambroff, Infinity, Rico, Gail, Kalpana, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Maestro, Simone, Yang, T, Shannon, Nelson, Khanh, Scott, Courtney, Charlene, Quixote, Susan, Zed, Amanda, Katelin, Enkidu, Roxie, Esbee, JoRoan, Scarlet, Tay, Kevin, Wolfgang, Johnny, Ray, Andren, Merov, Bob, Rand, Howard, Callen, Heff, Galen, Newell, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl, Ashley, JessieAnn, Huseby, Karina, Paris, Kurt, Rick, Lis, Kotler, Theeba, Lynx, Murphy, Doten, Taka, Norm, Jillian, Marcus, Mae, Novack, Esther, Perry, Dana, Ducot, Javier, Porter, Madison, Gecko, Dough, JR, Gisele, Crimp, Norie, Arch, Kimi, Fisher, Barbara, Jason, Peggy, Bernard, Jules, Leroy, Eva, Khederian, Campbell, Vogt, Masido, Karel, Torres, Lo, Breezer, Delby, Rountree, Anna, Servus, Rue, Itiaes, Chuck, Luna, Novella, Zaza, Wen, Gino, Lex, Cassandra, Limey, Nancy, Anukul, Silver, Brodesky, Jinsai, Squid, Gez, Rakesh, Ladan, Edelman, Marcet, Squire, Tatem, Tony, Jerm, Tia, Falcon, BK, Tiggs, Driscoll, Bacon, Timothee, Cru, Carmilla, Coyot, Webb, Kazu, Rudas, LJ, Sea, Ali Wallace, Bewest, Pup, Drub, Dragon, Inoshiro, Byron, Rhett, Xandix, Aimee, Fredrik, Thor, Teddy, Baron, Nelly, Ghengis, Epic, Eli, Stone, Grapes, Irie, Prep, Scobu, Valerie, Alain et bien d'autres. - Tous nos remerciements aux résidents suivants pour avoir testé cette version (la meilleure qui soit jusqu'à présent) : able whitman, Adeon Writer, adonaira aabye, Aeron Kohime, Agathos Frascati, Aimee Trescothick, Aleric Inglewood, Alissa Sabre, Aminom Marvin, Angela Talamasca, Aralara Rajal, Armin Weatherwax, Ashrilyn Hayashida, Athanasius Skytower, Aura Dirval, Barney Boomslang, Biancaluce Robbiani, Biker Offcourse, Borg Capalini, Bulli Schumann, catherine pfeffer, Chalice Yao, Corre Porta, Court Goodman, Cummere Mayo, Dale Innis, Darien Caldwell, Darjeeling Schoonhoven, Daten Thielt, dimentox travanti, Dirk Talamasca, Drew Dwi, Duckless Vandyke, Elanthius Flagstaff, Electro Burnstein, emiley tomsen, Escort DeFarge, Eva Rau, Ezian Ecksol, Fire Centaur, Fluf Fredriksson, Francisco Koolhoven, Frontera Thor, Frungi Stastny, Gally Young, gearsawe stonecutter, Gigs Taggart, Gordon Wendt, Gudmund Shepherd, Gypsy Paz, Harleen Gretzky, Henri Beauchamp, Inma Rau, Irene Muni, Iskar Ariantho, Jacek Antonelli, JB Kraft, Jessicka Graves, Joeseph Albanese, Joshua Philgarlic, Khyota Wulluf, kirstenlee Cinquetti, Latif Khalifa, Lex Neva, Lilibeth Andree, Lisa Lowe, Lunita Savira, Loosey Demonia, lum pfohl, Marcos Fonzarelli, MartinRJ Fayray, Marusame Arai, Matthew Dowd, Maya Remblai, McCabe Maxsted, Meghan Dench, Melchoir Tokhes, Menos Short, Michelle2 Zenovka, Mimika Oh, Minerva Memel, Mm Alder, Ochi Wolfe, Omei Turnbull, Pesho Replacement, Phantom Ninetails, phoenixflames kukulcan, Polo Gufler, prez pessoa, princess niven, Prokofy Neva, Qie Niangao, Rem Beattie, RodneyLee Jessop, Saijanai Kuhn, Seg Baphomet, Sergen Davies, Shirley Marquez, SignpostMarv Martin, Sindy Tsure, Sira Arbizu, Skips Jigsaw, Sougent Harrop, Spritely Pixel, Squirrel Wood, StarSong Bright, Subversive Writer, Sugarcult Dagger, Sylumm Grigorovich, Tammy Nowotny, Tanooki Darkes, Tayra Dagostino, Theoretical Chemistry, Thickbrick Sleaford, valerie rosewood, Vex Streeter, Vixen Heron, Whoops Babii, Winter Ventura, Xiki Luik, Yann Dufaux, Yina Yao, Yukinoroh Kamachi, Zolute Infinity, Zwagoth Klaar +Tous nos remerciements aux résidents suivants pour avoir testé cette version (la meilleure qui soit jusqu'à présent) : Drew Dwi, Zai Lynch, Latif Khalifa, Ellla McMahon, Harleen Gretzky, Squirrel Wood, Malarthi Behemoth, Dante Tucker, Buckaroo Mu, Eddi Decosta, Dirk, Talamasca, Torben Trautman, Irene Muni, Lilly Zenovka, Vick Forcella, Sasy Scarborough, Gentle Welinder, Elric Anatine, Techwolf Lupindo, Dusan Writer, WolfPup Lowenhar, Marianne McCann, Fiachra Lach, Sitearm Madonna, Sudane Erato, Sahkolihaa Contepomi, Sachi Vixen, Questar Utu, Dimitrio Lewis, Matto Destiny, Scrim Pinion, Radio Signals, Psi Merlin, Pixel Gausman, Mel Vanbeeck, Laurent Bechir, Lamorna Proctor, Lares Carter, Gwyneth Llewelyn, Hydra Shaftoe, Holger Gilruth, Gentle Heron, Carla Broek, Boroondas Gupte, Fury Rosewood, Flower Ducatillon, Colpo Wexler, gwampa Lomu, Borg Capalini, Beansy Twine, Ardy Lay, , 45ms Zhong, Adeon Writer, Aeonix Aeon, Ai Austin, Aiko Ying, Alexandrea Fride, Alliez Mysterio, Annie Milestone, Annika Genezzia, Ansariel Hiller, ArminasX Saiman, Arya Braveheart, Asaeda Meltingdots, Asturkon Jua, Avallyn Oakleaf, Avatar Quinzet, BabyA Littlething, Bacchus Ireto, Bazaar, Riva, Benjamin Bigdipper, Beth Walcher, Bezilon Kasei, Biancaluce Robbiani, Bill Walach, blakopal Galicia, Blitzckreed Levenque, Bryn Oh, Callipygian Christensen, Cap Carver, Carr Arbenlow, Chantal Harvey, Charles Courtois, Charlie Sazaland, Cherry Cheevers, ChickyBabes Zuzu, Christopher Organiser, Ciaran Laval, Clara Young, Celierra Darling, Corinne Helendale, Corro Moseley, Coughdrop Littlething, Darien Caldwell, Dartagan Shepherd, Debs Regent, Decro Schmooz, Denim Kamachi, DiJodi Dubratt, Dil Spitz, Edgware Marker, Egehan Dryke, Emma Portilo, Emmie Fairymeadow, Evangelista Emerald, Faelon Swordthain, Frenchimmo Sabra, Gaberoonie Zanzibar, Ganymedes Costagravas, Gene Frostbite, GeneJ Composer, Giggles Littlebird, Grady Echegaray, Guni Greenstein, Gypsy Tripsa, Hackshaven Harford, Ham Rambler, Han Shuffle, Hanglow Short, Hatzfeld Runo, herina Bode, Horatio Freund, Hypatia Callisto, Hypatia Pickens, Identity Euler, Imnotgoing Sideways, Innula Zenovka, Iyoba Tarantal, Jack Abraham, Jagga Meredith, Jennifer Boyle, Jeremy Marquez, Jessica Qin, Jinx Nordberg, Jo Bernandes, Jocial Sonnenkern, Joel Savard, Jondan Lundquist, Josef Munster, Josette Windlow, Juilan Tripsa, Juro Kothari, Justin RiversRunRed, Kagehi Kohn, Kaimen Takahe, Keklily Longfall, Ken Lavender, Kestral Karas, Khisme Nitely, Kimar Coba, Kithrak Kirkorian, Kitty Barnett, Kolor Fall, Komiko Okamoto, Korvel Noh, Larry Pixel, Leal Choche, len Starship, Lenae Munz, Lexi Frua, Lillie Cordeaux, Lizzy Macarthur, LSL Scientist, Luban Yiyuan, Luc Starsider, Maccus McCullough, Madison Blanc, Maggie Darwin, Mallory Destiny, Manx Wharton, Marc Claridge, Marc2 Sands, Matthew Anthony, Maxim RiversRunRed, Medhue Simoni, Melinda Latynina, Mencius Watts, Michi Lumin, Midian Farspire, Miles Glaz, Mindy Mathy, Mitch Wagner, Mo Hax, Mourna Biziou, Nao Noe, naofan Teardrop, Naomah Beaumont, Nathiel Siamendes, Nber Medici, Neko Link, Netpat Igaly, Neutron Chesnokov, Newfie Pendragon, Nicholai Laviscu, Nick Rhodes, Nicoladie Gymnast, Ollie Kubrick, Orenj Marat, Orion Delphis, Oryx Tempel, Parvati Silverweb, PeterPunk Mooney, Pixel Scientist, Pounce Teazle, Professor Noarlunga, Quantum Destiny, Quicksilver Hermes, Ralf Setsuko, RAT Quan, RedMokum Bravin, Revolution Perenti, Rezit Sideways, Rich Grainger, Rosco Teardrop, Rose Evans, Rudee Voom, RufusTT Horsefly, Saii Hallard, SaintLEOlions Zimer, Samm Larkham, Satanello Miami, SexySteven Morrisey, Sheet Spotter, Shnurui Troughton, sicarius Thorne, Sicarius Toxx, Sini Nubalo, SLB Wirefly, snowy Sidran, Soupa Segura, ST Mensing, Starshine Halasy, Stickman Ingmann, Synystyr Texan, Takeda Terrawyng, Tali Rosca, Templar Merlin, Tezcatlipoca Bisiani, Tiel Stonecutter, Tony Kembia, TouchaHoney Perhaps, Trey Reanimator, TriloByte Zanzibar, Trinity Dechou, Trinity Dejavu, Unlikely Quintessa, UsikuFarasi Kanarik, Veritas Raymaker, Vex Streeter, Viaticus Speculaas, Villain Baroque, Vixie Durant, Void Singer, Watty Berkson, Westley Schridde, Westley Streeter, Whimsy Winx, Winter Ventura, Wundur Primbee, xstorm Radek, YongYong Francois, Zak Westminster, Zana Kohime, Zaren Alexander, Zeja Pyle, ZenMondo Wormser, Zoex Flanagan et bien d'autres. - Pour réussir dans les affaires, soyez audacieux, créatif et différent. - Henry Marchant + +« Le travail continue, la cause demeure, l'espoir vit encore et le rêve ne mourra jamais » - Edward Kennedy </text_editor> </panel> <panel label="Licences" name="licenses_panel"> @@ -61,7 +62,8 @@ Version Vivox : [VIVOX_VERSION] FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org). GL Copyright (C) 1999-2004 Brian Paul. Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited. - jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW) + jpeg2000 Copyright (C) 2001, David Taubman, The University of New South + Wales (UNSW) jpeglib Copyright (C) 1991-1998, Thomas G. Lane. ogg/vorbis Copyright (C) 2001, Xiphophorus OpenSSL Copyright (C) 1998-2002 The OpenSSL Project. @@ -73,7 +75,8 @@ Version Vivox : [VIVOX_VERSION] Tous droits réservés. Voir licenses.txt pour plus de détails. - Codage Audio du chat vocal : Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C) + Codage Audio du chat vocal : Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 + Annex C) </text_editor> </panel> </tab_container> diff --git a/indra/newview/skins/default/xui/fr/floater_about_land.xml b/indra/newview/skins/default/xui/fr/floater_about_land.xml index 4c97551e55..ff49fd4536 100644 --- a/indra/newview/skins/default/xui/fr/floater_about_land.xml +++ b/indra/newview/skins/default/xui/fr/floater_about_land.xml @@ -1,5 +1,14 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floaterland" title="À PROPOS DES TERRAINS"> +<floater name="floaterland" title="À PROPOS DU TERRAIN"> + <floater.string name="maturity_icon_general"> + "Parcel_PG_Dark" + </floater.string> + <floater.string name="maturity_icon_moderate"> + "Parcel_M_Dark" + </floater.string> + <floater.string name="maturity_icon_adult"> + "Parcel_R_Dark" + </floater.string> <floater.string name="Minutes"> [MINUTES] minutes </floater.string> @@ -12,10 +21,10 @@ <floater.string name="Remaining"> restantes </floater.string> - <tab_container name="landtab"> + <tab_container name="landtab" tab_min_width="60"> <panel label="GÉNÉRAL" name="land_general_panel"> <panel.string name="new users only"> - Nouveaux utilisateurs uniquement + Nouveaux résidents uniquement </panel.string> <panel.string name="anyone"> Tout le monde @@ -53,6 +62,9 @@ <panel.string name="no_selection_text"> Aucune parcelle sélectionnée. </panel.string> + <panel.string name="time_stamp_template"> + [wkday,datetime,local] [day,datetime,local] [mth,datetime,local] [year,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] + </panel.string> <text name="Name:"> Nom : </text> @@ -71,7 +83,7 @@ Catégorie : </text> <text name="ContentRatingText"> - Adult + Adulte </text> <text name="Owner:"> Propriétaire : @@ -99,7 +111,7 @@ Prix : [PRICE] L$ ([PRICE_PER_SQM] L$/m²) </text> <text name="SalePending"/> - <button label="Vendez du terrain" label_selected="Vendre le terrain..." name="Sell Land..."/> + <button label="Vendre le terrain" label_selected="Vendre le terrain..." name="Sell Land..."/> <text name="For sale to"> À vendre à : [BUYER] </text> @@ -109,7 +121,7 @@ <text name="Selling with no objects in parcel."> Objets non inclus dans la vente </text> - <button label="Annuler la vente du terrain" label_selected="Annuler la vente du terrain" left="275" name="Cancel Land Sale" width="165"/> + <button label="Annuler la vente du terrain" label_selected="Annuler la vente du terrain" name="Cancel Land Sale"/> <text name="Claimed:"> Acquis : </text> @@ -128,10 +140,10 @@ <text name="DwellText"> 0 </text> - <button label="Acheter du terrain" label_selected="Acheter le terrain..." left="130" name="Buy Land..." width="125"/> - <button label="Infos sur les scripts" name="Scripts..."/> + <button label="Acheter du terrain" label_selected="Acheter le terrain..." left_delta="60" name="Buy Land..." width="125"/> + <button label="Infos sur les scripts" name="Scripts..." width="110"/> <button label="Acheter pour le groupe" label_selected="Acheter pour le groupe..." name="Buy For Group..."/> - <button label="Acheter un pass" label_selected="Acheter un pass..." left="130" name="Buy Pass..." tool_tip="Un pass vous donne un accès temporaire à ce terrain." width="125"/> + <button label="Acheter un pass" label_selected="Acheter un pass..." left_delta="-127" name="Buy Pass..." tool_tip="Un pass vous donne un accès temporaire à ce terrain." width="125"/> <button label="Abandonner le terrain" label_selected="Abandonner le terrain..." name="Abandon Land..."/> <button label="Récupérer le terrain" label_selected="Redemander le terrain…" name="Reclaim Land..."/> <button label="Vente Linden" label_selected="Vente Linden..." name="Linden Sale..." tool_tip="Le terrain doit être la propriété d'un résident, avoir un contenu défini et ne pas être aux enchères."/> @@ -252,13 +264,13 @@ ou divisé. </text> <button label="Afficher" label_selected="Afficher" name="ShowOther" right="-135" width="60"/> <button label="Retour" label_selected="Renvoyer..." name="ReturnOther..." right="-10" tool_tip="Renvoyer les objets à leurs propriétaires." width="119"/> - <text left="14" name="Selected / sat upon:" width="193"> + <text left="14" name="Selected / sat upon:" width="220"> Sélectionnées/où quelqu'un est assis : </text> - <text left="214" name="selected_objects_text" width="48"> + <text left_delta="214" name="selected_objects_text" width="48"> [COUNT] </text> - <text left="4" name="Autoreturn" width="412"> + <text name="Autoreturn"> Renvoi automatique des objets d'autres résidents (minutes, 0 pour désactiver) : </text> <line_editor name="clean other time" right="-6" width="36"/> @@ -270,9 +282,9 @@ ou divisé. <name_list label="Plus récents" name="owner list"> <name_list.columns label="Type" name="type"/> <name_list.columns name="online_status"/> - <name_list.columns label="Nom" name="name"/> - <name_list.columns label="Nombre" name="count"/> - <name_list.columns label="Plus récents" name="mostrecent"/> + <name_list.columns label="Nom" name="name" width="100"/> + <name_list.columns label="Nombre" name="count" width="100"/> + <name_list.columns label="Plus récents" name="mostrecent" width="120"/> </name_list> </panel> <panel label="OPTIONS" name="land_options_panel"> @@ -312,21 +324,21 @@ Seules les parcelles de grande taille peuvent apparaître dans la recherche. </text> <check_box label="Modifier le terrain" name="edit land check" tool_tip="Si cette option est cochée, n'importe qui peut terraformer votre terrain. Il vaut mieux ne pas cocher cette option pour toujours pouvoir modifer votre propre terrain."/> <check_box label="Voler" name="check fly" tool_tip="Si cette option est cochée, les résidents peuvent voler sur votre terrain. Si elle n'est pas cochée, ils ne pourront voler que lorsqu'ils arrivent et passent au dessus de votre terrain."/> - <text left="152" name="allow_label2"> + <text name="allow_label2"> Construire : </text> - <check_box label="Tous" left="285" name="edit objects check"/> - <check_box label="Groupe" left="395" name="edit group objects check"/> - <text left="152" name="allow_label3" width="134"> + <check_box label="Tous" name="edit objects check"/> + <check_box label="Groupe" name="edit group objects check"/> + <text name="allow_label3"> Laisser entrer des objets : </text> - <check_box label="Tous" left="285" name="all object entry check"/> - <check_box label="Groupe" left="395" name="group object entry check"/> - <text left="152" name="allow_label4"> + <check_box label="Tous" name="all object entry check"/> + <check_box label="Groupe" name="group object entry check"/> + <text name="allow_label4"> Exécuter des scripts : </text> - <check_box label="Tous" left="285" name="check other scripts"/> - <check_box label="Groupe" left="395" name="check group scripts"/> + <check_box label="Tous" name="check other scripts"/> + <check_box label="Groupe" name="check group scripts"/> <text name="land_options_label"> Options du terrain : </text> @@ -367,11 +379,11 @@ Seules les parcelles de grande taille peuvent apparaître dans la recherche. Photo : </text> <texture_picker bottom="-319" label="" name="snapshot_ctrl" tool_tip="Cliquez pour sélectionner une image"/> - <text bottom="-323" name="landing_point"> + <text name="landing_point"> Lieu d'arrivée : [LANDING] </text> - <button bottom="-323" label="Définir" label_selected="Définir" name="Set" tool_tip="Définit le point d'arrivée des visiteurs. Définit l'emplacement de votre avatar sur ce terrain."/> - <button bottom="-323" label="Annuler" label_selected="Annuler" name="Clear" tool_tip="Effacer le lieu d'arrivée"/> + <button label="Définir" label_selected="Définir" name="Set" tool_tip="Définit le point d'arrivée des visiteurs. Définit l'emplacement de votre avatar sur ce terrain."/> + <button label="Annuler" label_selected="Annuler" name="Clear" tool_tip="Effacer le lieu d'arrivée"/> <text bottom="-343" name="Teleport Routing: "> Règles de téléportation : </text> @@ -391,18 +403,15 @@ Seules les parcelles de grande taille peuvent apparaître dans la recherche. Page d'accueil : </text> <line_editor left="97" name="media_url"/> - <button label="Choisir" label_selected="Définir..." name="set_media_url"/> - <text name="CurrentURL:"> - Page actuelle : - </text> - <button label="Réinitialiser..." label_selected="Réinitialiser..." name="reset_media_url" tool_tip="Actualiser l'URL"/> + <button label="Choisir" name="set_media_url"/> <check_box label="Masquer l'URL" left="97" name="hide_media_url" tool_tip="Si vous cochez cette option, les personnes non autorisées à accéder aux infos de cette parcelle ne verront pas l'URL du média. Cette option n'est pas disponible pour les fichiers HTML."/> <text name="Description:"> Description : </text> <line_editor left="97" name="url_description" tool_tip="Texte affiché à côté du bouton Jouer/Charger"/> <text name="Media texture:"> - Remplacer la texture : + Remplacer la +texture : </text> <texture_picker label="" left="97" name="media texture" tool_tip="Cliquez pour sélectionner une image"/> <text name="replace_texture_help"> @@ -423,9 +432,11 @@ Seules les parcelles de grande taille peuvent apparaître dans la recherche. <check_box label="En boucle" name="media_loop" tool_tip="Jouer le média en boucle. Lorsque le média aura fini de jouer, il recommencera."/> </panel> <panel label="SON" name="land_audio_panel"> - <text name="MusicURL:"> - URL de la musique : + <text bottom_delta="-28" name="MusicURL:"> + URL de la +musique : </text> + <check_box label="Masquer l'URL" name="hide_music_url" tool_tip="Si vous cochez cette option, l'URL de musique sera masquée et invisible pour tous les utilisateurs non autorisés des informations de cette parcelle."/> <text name="Sound:"> Son : </text> @@ -435,12 +446,15 @@ Seules les parcelles de grande taille peuvent apparaître dans la recherche. </text> <check_box label="Activer le chat vocal" name="parcel_enable_voice_channel"/> <check_box label="Activer la voix (contrôlé par le domaine)" name="parcel_enable_voice_channel_is_estate_disabled"/> - <check_box label="Limiter le chat vocal à cette parcelle" name="parcel_enable_voice_channel_parcel"/> + <check_box label="Limiter le chat vocal à cette parcelle" name="parcel_enable_voice_channel_local"/> </panel> <panel label="ACCÈS" name="land_access_panel"> <panel.string name="access_estate_defined"> (défini par le domaine </panel.string> + <panel.string name="allow_public_access"> + Autoriser l'accès public ([MATURITY]) + </panel.string> <panel.string name="estate_override"> Au moins une de ces options est définie au niveau du domaine. </panel.string> @@ -455,7 +469,7 @@ Seules les parcelles de grande taille peuvent apparaître dans la recherche. <check_box label="Vérification de l'âge [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="Bannir les résidents qui n'ont pas vérifié leur âge. Consultez la page [SUPPORT_SITE] pour plus d'informations."/> <check_box label="Autoriser l'accès au groupe : [GROUP]" name="GroupCheck" tool_tip="Définir le groupe à l'onglet Général."/> <check_box label="Vendre des pass à  :" name="PassCheck" tool_tip="Autoriser un accès temporaire à cette parcelle"/> - <combo_box name="pass_combo"> + <combo_box name="pass_combo" width="110"> <combo_box.item label="Tout le monde" name="Anyone"/> <combo_box.item label="Groupe" name="Group"/> </combo_box> diff --git a/indra/newview/skins/default/xui/fr/floater_animation_preview.xml b/indra/newview/skins/default/xui/fr/floater_animation_preview.xml index f7a796a508..aa42fe6150 100644 --- a/indra/newview/skins/default/xui/fr/floater_animation_preview.xml +++ b/indra/newview/skins/default/xui/fr/floater_animation_preview.xml @@ -106,6 +106,9 @@ La longueur maximale est de [MAX_LENGTH] secondes. <floater.string name="E_ST_NO_XLT_EMOTE"> Impossible de lire le nom emote. </floater.string> + <floater.string name="E_ST_BAD_ROOT"> + Nom de racine incorrect. + </floater.string> <text name="name_label"> Nom : </text> @@ -139,36 +142,36 @@ main Expression </text> <combo_box label="" name="emote_combo" tool_tip="Contrôle ce que fait le visage pendant l'animation"> - <combo_box.item label="(aucun)" name="[None]"/> - <combo_box.item label="Aaaaah" name="Aaaaah"/> - <combo_box.item label="Effrayé" name="Afraid"/> - <combo_box.item label="En colère" name="Angry"/> - <combo_box.item label="Grand sourire" name="BigSmile"/> - <combo_box.item label="Ennui" name="Bored"/> - <combo_box.item label="Pleurer" name="Cry"/> - <combo_box.item label="Mépris" name="Disdain"/> - <combo_box.item label="Gêne" name="Embarrassed"/> - <combo_box.item label="Froncer les sourcils" name="Frown"/> - <combo_box.item label="Embrasser" name="Kiss"/> - <combo_box.item label="Rire" name="Laugh"/> - <combo_box.item label="Plllppt" name="Plllppt"/> - <combo_box.item label="Dégoût" name="Repulsed"/> - <combo_box.item label="Triste" name="Sad"/> - <combo_box.item label="Hausser les épaules" name="Shrug"/> - <combo_box.item label="Sourire" name="Smile"/> - <combo_box.item label="Surprise" name="Surprise"/> - <combo_box.item label="Clin d'Å“il" name="Wink"/> - <combo_box.item label="Soucis" name="Worry"/> + <item label="(aucun)" name="[None]" value=""/> + <item label="Aaaaah" name="Aaaaah" value="Aaaaah"/> + <item label="Effrayé" name="Afraid" value="Effrayé"/> + <item label="En colère" name="Angry" value="En colère"/> + <item label="Grand sourire" name="BigSmile" value="Grand sourire"/> + <item label="Ennui" name="Bored" value="Ennui"/> + <item label="Pleurer" name="Cry" value="Pleurer"/> + <item label="Mépris" name="Disdain" value="Mépris"/> + <item label="Gêne" name="Embarrassed" value="Gêne"/> + <item label="Froncer les sourcils" name="Frown" value="Froncer les sourcils"/> + <item label="Embrasser" name="Kiss" value="Embrasser"/> + <item label="Rire" name="Laugh" value="Rire"/> + <item label="Plllppt" name="Plllppt" value="Tirer la langue"/> + <item label="Dégoût" name="Repulsed" value="Dégoût"/> + <item label="Triste" name="Sad" value="Triste"/> + <item label="Hausser les épaules" name="Shrug" value="Hausser les épaules"/> + <item label="Sourire" name="Smile" value="Sourire"/> + <item label="Surprise" name="Surprise" value="Surprise"/> + <item label="Clin d'Å“il" name="Wink" value="Clin d'Å“il"/> + <item label="Soucis" name="Worry" value="Inquiétude"/> </combo_box> <text name="preview_label"> Prévisualiser pendant </text> <combo_box label="" name="preview_base_anim" tool_tip="Utilisez cette option pour tester votre animation pendant que votre avatar fait des choses banales."> - <combo_box.item label="Debout" name="Standing"/> - <combo_box.item label="Marche" name="Walking"/> - <combo_box.item label="Assis" name="Sitting"/> - <combo_box.item label="Vol" name="Flying"/> + <item label="Debout" name="Standing" value="Debout"/> + <item label="Marche" name="Walking" value="Marche"/> + <item label="Assis" name="Sitting" value="Assis"/> + <item label="Vol" name="Flying" value="Vol"/> </combo_box> <spinner label="Transition début (s)" name="ease_in_time" tool_tip="Durée (en secondes) de l'entrée en fondu de l'animation"/> <spinner label="Transition fin (s)" name="ease_out_time" tool_tip="Durée (en secondes) de la sortie en fondu de l'animation"/> diff --git a/indra/newview/skins/default/xui/fr/floater_avatar_picker.xml b/indra/newview/skins/default/xui/fr/floater_avatar_picker.xml index e784bda2e5..65bb683e4c 100644 --- a/indra/newview/skins/default/xui/fr/floater_avatar_picker.xml +++ b/indra/newview/skins/default/xui/fr/floater_avatar_picker.xml @@ -20,7 +20,7 @@ </string> <tab_container name="ResidentChooserTabs"> <panel label="Rechercher" name="SearchPanel"> - <text name="InstructSearchResidentName"> + <text name="InstructSearchResidentName" width="240"> Saisissez une partie du nom du résident : </text> <button label="OK" label_selected="OK" name="Find"/> diff --git a/indra/newview/skins/default/xui/fr/floater_avatar_textures.xml b/indra/newview/skins/default/xui/fr/floater_avatar_textures.xml index 313c9496a2..e1786eafc7 100644 --- a/indra/newview/skins/default/xui/fr/floater_avatar_textures.xml +++ b/indra/newview/skins/default/xui/fr/floater_avatar_textures.xml @@ -3,44 +3,46 @@ <floater.string name="InvalidAvatar"> AVATAR NON VALIDE </floater.string> - <text name="label"> - Textures fixées - </text> - <text name="composite_label"> - Textures composées - </text> - <button label="Vider ces ID dans la console" label_selected="Vider" left="-185" name="Dump" width="175"/> <scroll_container name="profile_scroll"> <panel name="scroll_content_panel"> - <texture_picker label="Cheveux" name="hair-baked"/> - <texture_picker label="Cheveux" name="hair_grain"/> - <texture_picker label="Alpha cheveux" name="hair_alpha"/> - <texture_picker label="Tête" name="head-baked"/> - <texture_picker label="Maquillage" name="head_bodypaint"/> - <texture_picker label="Alpha tête" name="head_alpha"/> - <texture_picker label="Tatouage tête" name="head_tattoo"/> - <texture_picker label="Yeux" name="eyes-baked"/> - <texture_picker label="Å’il" name="eyes_iris"/> - <texture_picker label="Alpha yeux" name="eyes_alpha"/> - <texture_picker label="Haut du corps" name="upper-baked"/> - <texture_picker label="Peinture corporelle haut" name="upper_bodypaint"/> - <texture_picker label="Sous-vêtements (homme)" name="upper_undershirt"/> - <texture_picker label="Gants" name="upper_gloves"/> - <texture_picker label="Chemise" name="upper_shirt"/> - <texture_picker label="Veste (haut)" name="upper_jacket"/> - <texture_picker label="Alpha haut" name="upper_alpha"/> - <texture_picker label="Tatouage haut" name="upper_tattoo"/> - <texture_picker label="Bas du corps" name="lower-baked"/> - <texture_picker label="Peinture corporelle bas" name="lower_bodypaint"/> - <texture_picker label="Sous-vêtements (femme)" name="lower_underpants"/> - <texture_picker label="Chaussettes" name="lower_socks"/> - <texture_picker label="Chaussures" name="lower_shoes"/> - <texture_picker label="Pantalon" name="lower_pants"/> - <texture_picker label="Veste" name="lower_jacket"/> - <texture_picker label="Alpha bas" name="lower_alpha"/> - <texture_picker label="Tatouage bas" name="lower_tattoo"/> - <texture_picker label="Jupe" name="skirt-baked"/> - <texture_picker label="Jupe" name="skirt"/> + <text name="label"> + Textures figées + </text> + <text name="composite_label"> + Textures composites + </text> + <button label="Vider les ID dans la console" label_selected="Vider" name="Dump"/> + <panel name="scroll_content_panel"> + <texture_picker label="Cheveux" name="hair-baked"/> + <texture_picker label="Cheveux" name="hair_grain"/> + <texture_picker label="Alpha cheveux" name="hair_alpha"/> + <texture_picker label="Tête" name="head-baked"/> + <texture_picker label="Maquillage" name="head_bodypaint"/> + <texture_picker label="Alpha tête" name="head_alpha"/> + <texture_picker label="Tatouage tête" name="head_tattoo"/> + <texture_picker label="Yeux" name="eyes-baked"/> + <texture_picker label="Å’il" name="eyes_iris"/> + <texture_picker label="Alpha yeux" name="eyes_alpha"/> + <texture_picker label="Haut du corps" name="upper-baked"/> + <texture_picker label="Peinture sur corps (haut)" name="upper_bodypaint"/> + <texture_picker label="Débardeur" name="upper_undershirt"/> + <texture_picker label="Gants" name="upper_gloves"/> + <texture_picker label="Chemise" name="upper_shirt"/> + <texture_picker label="Veste (haut)" name="upper_jacket"/> + <texture_picker label="Alpha haut" name="upper_alpha"/> + <texture_picker label="Tatouage haut" name="upper_tattoo"/> + <texture_picker label="Bas du corps" name="lower-baked"/> + <texture_picker label="Peinture sur corps (bas)" name="lower_bodypaint"/> + <texture_picker label="Caleçon" name="lower_underpants"/> + <texture_picker label="Chaussettes" name="lower_socks"/> + <texture_picker label="Chaussures" name="lower_shoes"/> + <texture_picker label="Pantalon" name="lower_pants"/> + <texture_picker label="Veste" name="lower_jacket"/> + <texture_picker label="Alpha bas" name="lower_alpha"/> + <texture_picker label="Tatouage bas" name="lower_tattoo"/> + <texture_picker label="Jupe" name="skirt-baked"/> + <texture_picker label="Jupe" name="skirt"/> + </panel> </panel> </scroll_container> </floater> diff --git a/indra/newview/skins/default/xui/fr/floater_beacons.xml b/indra/newview/skins/default/xui/fr/floater_beacons.xml index 778d92793b..d61115a2db 100644 --- a/indra/newview/skins/default/xui/fr/floater_beacons.xml +++ b/indra/newview/skins/default/xui/fr/floater_beacons.xml @@ -2,7 +2,7 @@ <floater name="beacons" title="BALISES"> <panel name="beacons_panel"> <text name="label_show"> - Afficher : + Afficher : </text> <check_box label="Balises" name="beacons"/> <check_box label="Surbrillances" name="highlights"/> diff --git a/indra/newview/skins/default/xui/fr/floater_bulk_perms.xml b/indra/newview/skins/default/xui/fr/floater_bulk_perms.xml index ecd9dd0863..503fe5c154 100644 --- a/indra/newview/skins/default/xui/fr/floater_bulk_perms.xml +++ b/indra/newview/skins/default/xui/fr/floater_bulk_perms.xml @@ -1,10 +1,10 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floaterbulkperms" title="MODIFIER LES DROITS RELATIFS AU CONTENU"> +<floater name="floaterbulkperms" title="MODIFIER LES DROITS"> <floater.string name="nothing_to_modify_text"> - La sélection contient des contenus non modifiables. + Certains contenus sont non modifiables. </floater.string> <floater.string name="status_text"> - Permissions paramétrées sur [NAME] + Droits paramétrés sur [NAME] </floater.string> <floater.string name="start_text"> Demande de changement des droits lancée... @@ -33,7 +33,7 @@ <button label="√ Tout" label_selected="Tout" name="check_all"/> <button label="Effacer" label_selected="Aucun" name="check_none"/> <text name="newperms"> - Nouvelles permissions + Nouveaux droits </text> <text name="GroupLabel"> Groupe : diff --git a/indra/newview/skins/default/xui/fr/floater_buy_currency.xml b/indra/newview/skins/default/xui/fr/floater_buy_currency.xml index 5ea36d8505..4eaff8535e 100644 --- a/indra/newview/skins/default/xui/fr/floater_buy_currency.xml +++ b/indra/newview/skins/default/xui/fr/floater_buy_currency.xml @@ -4,10 +4,11 @@ Achetez [LINDENS] L$ pour environ [LOCALAMOUNT] </floater.string> <text left="5" name="info_need_more" right="-5"> - Vous avez besoin de plus de L$ + Plus de L$ sont requis </text> <text name="contacting"> - En train de contacter le Lindex... + En train de contacter +le Lindex... </text> <text left="5" name="info_buying"> Acheter des L$ @@ -37,7 +38,7 @@ Estimation en cours... </text> <text name="buy_action"> - [NAME] L$ [PRICE] + [ACTION] </text> <text name="total_label"> Mon nouveau solde sera de @@ -52,14 +53,14 @@ Saisissez à nouveau le montant pour voir le taux de change actuel. </text> <text name="purchase_warning_repurchase"> - La confirmation de cet achat n'achète que des L$, pas l'objet. + Confirmer cet achat n'achète que des L$, pas l'objet. </text> <text bottom_delta="16" name="purchase_warning_notenough"> Vous n'achetez pas assez de L$. Veuillez augmenter le montant. </text> <button label="Acheter" name="buy_btn"/> <button label="Annuler" name="cancel_btn"/> - <text left="5" name="info_cannot_buy" right="-5"> + <text left="5" name="info_cannot_buy" right="-5" width="200"> Achat impossible </text> <button label="Accéder au Web" name="error_web"/> diff --git a/indra/newview/skins/default/xui/fr/floater_buy_currency_html.xml b/indra/newview/skins/default/xui/fr/floater_buy_currency_html.xml new file mode 100644 index 0000000000..953fca3544 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/floater_buy_currency_html.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_buy_currency_html" title="ACHETER DEVISE"/> diff --git a/indra/newview/skins/default/xui/fr/floater_buy_land.xml b/indra/newview/skins/default/xui/fr/floater_buy_land.xml index 1d7eeca3c4..b7f8f36f81 100644 --- a/indra/newview/skins/default/xui/fr/floater_buy_land.xml +++ b/indra/newview/skins/default/xui/fr/floater_buy_land.xml @@ -1,5 +1,129 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="buy land" title="ACHETER DU TERRAIN"> + <floater.string name="can_resell"> + Peut être revendu. + </floater.string> + <floater.string name="can_not_resell"> + Ne peut pas être revendu. + </floater.string> + <floater.string name="can_change"> + Peut être fusionné ou divisé. + </floater.string> + <floater.string name="can_not_change"> + Ne peut pas être fusionné ou divisé. + </floater.string> + <floater.string name="cant_buy_for_group"> + Vous n'avez pas la permission d'acheter de terrain pour votre groupe. + </floater.string> + <floater.string name="no_land_selected"> + Aucun terrain sélectionné. + </floater.string> + <floater.string name="multiple_parcels_selected"> + Vous avez sélectionné plusieurs parcelles. +Sélectionnez une zone plus petite. + </floater.string> + <floater.string name="no_permission"> + Vous n'avez pas la permission d'acheter de terrain pour votre groupe. + </floater.string> + <floater.string name="parcel_not_for_sale"> + La parcelle sélectionnée n'est pas à vendre. + </floater.string> + <floater.string name="group_already_owns"> + La parcelle appartient déjà au groupe. + </floater.string> + <floater.string name="you_already_own"> + La parcelle vous appartient déjà . + </floater.string> + <floater.string name="set_to_sell_to_other"> + La parcelle sélectionnée doit déjà être vendue à quelqu'un d'autre. + </floater.string> + <floater.string name="no_public_land"> + Il n'y a pas de terrain public dans cette zone. + </floater.string> + <floater.string name="not_owned_by_you"> + Le terrain sélectionné appartient à quelqu'un d'autre. +Sélectionnez une zone plus petite. + </floater.string> + <floater.string name="processing"> + Achat en cours de traitement... + +(Veuillez patienter quelques instants.) + </floater.string> + <floater.string name="fetching_error"> + Une erreur s'est produite pendant le traitement de l'achat du terrain. + </floater.string> + <floater.string name="buying_will"> + Si vous achetez ce terrain : + </floater.string> + <floater.string name="buying_for_group"> + Si vous achetez le terrain pour le groupe : + </floater.string> + <floater.string name="cannot_buy_now"> + Impossible d'acheter maintenant : + </floater.string> + <floater.string name="not_for_sale"> + Pas à vendre : + </floater.string> + <floater.string name="none_needed"> + aucun besoin + </floater.string> + <floater.string name="must_upgrade"> + Pour posséder du terrain, vous devez avoir un niveau de compte supérieur. + </floater.string> + <floater.string name="cant_own_land"> + Avec votre compte, vous pouvez posséder du terrain. + </floater.string> + <floater.string name="land_holdings"> + Vous détenez [BUYER] m² de terrain. + </floater.string> + <floater.string name="pay_to_for_land"> + Payez [AMOUNT] L$ à [SELLER] pour ce terrain + </floater.string> + <floater.string name="buy_for_US"> + Achetez [AMOUNT] L$ pour environ [LOCAL_AMOUNT], + </floater.string> + <floater.string name="parcel_meters"> + Cette parcelle fait [AMOUNT] m² + </floater.string> + <floater.string name="premium_land"> + C'est un terrain premium, [AMOUNT] m². + </floater.string> + <floater.string name="discounted_land"> + Ce terrain est en solde, [AMOUNT] m². + </floater.string> + <floater.string name="meters_supports_object"> + [AMOUNT] m² +prend en charge [AMOUNT2] objets + </floater.string> + <floater.string name="sold_with_objects"> + vendu avec objets + </floater.string> + <floater.string name="sold_without_objects"> + objets non inclus + </floater.string> + <floater.string name="info_price_string"> + [PRICE] L$ +([PRICE_PER_SQM] L$/m²) +[SOLD_WITH_OBJECTS] + </floater.string> + <floater.string name="insufficient_land_credits"> + Ce groupe, [GROUP], aura besoin de suffisamment de crédit pour payer les frais d'occupation de terrain avant que l'achat de cette parcelle ne soit finalisé. + </floater.string> + <floater.string name="have_enough_lindens"> + Vous avez [AMOUNT] L$, ce qui est suffisant pour acheter ce terrain. + </floater.string> + <floater.string name="not_enough_lindens"> + Vous n'avez que [AMOUNT] L$ et vous avez besoin de [AMOUNT2] L$ de plus. + </floater.string> + <floater.string name="balance_left"> + Après cet achat, il vous restera [AMOUNT] L$. + </floater.string> + <floater.string name="balance_needed"> + Pour avoir les moyens d'acquérir ce terrain, vous devez acheter au moins [AMOUNT] L$. + </floater.string> + <floater.string name="no_parcel_selected"> + (aucune parcelle sélectionnée) + </floater.string> <text name="region_name_label"> Région : </text> @@ -37,10 +161,10 @@ Vous devez accepter le règlement du domaine : </text> <text left="470" name="covenant_timestamp_text"/> - <text_editor name="covenant_editor"> + <text_editor left="510" name="covenant_editor"> Chargement... </text_editor> - <check_box label="J'accepte le règlement ci-dessus." name="agree_covenant"/> + <check_box label="J'accepte le règlement ci-dessus." left="510" name="agree_covenant"/> <text name="info_parcel_label"> Parcelle : </text> @@ -79,7 +203,7 @@ vendu avec objets <combo_box.item label="7,50 US$/mois, facturation trimestrielle" name="US$7.50/month,billedquarterly"/> <combo_box.item label="6,00 US$/mois, facturation annuelle" name="US$6.00/month,billedannually"/> </combo_box> - <text name="land_use_action"> + <text follows="top|left" font="SansSerifBig" height="16" layout="topleft" left="72" length="1" name="land_use_action" right="500" top="284" type="string" width="400"> Augmentez vos frais d'occupation de terrain à 40 US$/mois. </text> <text name="land_use_reason"> @@ -107,131 +231,4 @@ Cette parcelle fait 512 m². <check_box label="Enlever [AMOUNT] m² de contribution du groupe." name="remove_contribution"/> <button label="Acheter" name="buy_btn"/> <button label="Annuler" name="cancel_btn"/> - <string name="can_resell"> - Peut être revendu. - </string> - <string name="can_not_resell"> - Ne peut pas être revendu. - </string> - <string name="can_change"> - Peut être fusionné ou divisé. - </string> - <string name="can_not_change"> - Ne peut pas être fusionné ou divisé. - </string> - <string name="cant_buy_for_group"> - Vous n'avez pas la permission d'acheter de terrain pour votre groupe. - </string> - <string name="no_land_selected"> - Aucun terrain sélectionné. - </string> - <string name="multiple_parcels_selected"> - Vous avez sélectionné plusieurs parcelles. -Sélectionnez une zone plus petite. - </string> - <string name="no_permission"> - Vous n'avez pas la permission d'acheter de terrain pour votre groupe. - </string> - <string name="parcel_not_for_sale"> - La parcelle sélectionnée n'est pas à vendre. - </string> - <string name="group_already_owns"> - La parcelle appartient déjà au groupe. - </string> - <string name="you_already_own"> - La parcelle vous appartient déjà . - </string> - <string name="set_to_sell_to_other"> - La parcelle sélectionnée doit déjà être vendue à quelqu'un d'autre. - </string> - <string name="no_public_land"> - Il n'y a pas de terrain public dans cette zone. - </string> - <string name="not_owned_by_you"> - Le terrain sélectionné appartient à quelqu'un d'autre. -Sélectionnez une zone plus petite. - </string> - <string name="processing"> - Achat en cours de traitement... - -(Veuillez patienter quelques instants.) - </string> - <string name="fetching_error"> - Une erreur s'est produite pendant le traitement de l'achat du terrain. - </string> - <string name="buying_will"> - Si vous achetez ce terrain : - </string> - <string name="buying_for_group"> - Si vous achetez le terrain pour le groupe : - </string> - <string name="cannot_buy_now"> - Impossible d'acheter maintenant : - </string> - <string name="not_for_sale"> - Pas à vendre : - </string> - <string name="none_needed"> - aucun besoin - </string> - <string name="must_upgrade"> - Pour posséder du terrain, vous devez avoir un niveau de compte supérieur. - </string> - <string name="cant_own_land"> - Avec votre compte, vous pouvez posséder du terrain. - </string> - <string name="land_holdings"> - Vous détenez [BUYER] m² de terrain. - </string> - <string name="pay_to_for_land"> - Payez [AMOUNT] L$ à [SELLER] pour ce terrain - </string> - <string name="buy_for_US"> - Achetez [AMOUNT] L$ pour environ [LOCAL_AMOUNT], - </string> - <string name="parcel_meters"> - Cette parcelle fait [AMOUNT] m² - </string> - <string name="premium_land"> - C'est un terrain premium, [AMOUNT] m². - </string> - <string name="discounted_land"> - Ce terrain est en solde, [AMOUNT] m². - </string> - <string name="meters_supports_object"> - [AMOUNT] m² -prend en charge [AMOUNT2] objets - </string> - <string name="sold_with_objects"> - vendu avec objets - </string> - <string name="sold_without_objects"> - objets non inclus - </string> - <string name="info_price_string"> - [PRICE] L$ -([PRICE_PER_SQM] L$/m²) -[SOLD_WITH_OBJECTS] - </string> - <string name="insufficient_land_credits"> - Ce groupe, [GROUP], aura besoin de suffisamment de crédit pour payer les frais d'occupation de terrain avant que l'achat de cette parcelle ne soit finalisé. - </string> - <string name="have_enough_lindens"> - Vous avez [AMOUNT] L$, ce qui est suffisant pour acheter ce terrain. - </string> - <string name="not_enough_lindens"> - Vous n'avez que [AMOUNT] L$ et vous avez besoin de [AMOUNT2] L$ de plus. - </string> - <string name="balance_left"> - Après cet achat, il vous restera [AMOUNT] L$. - </string> - <string name="balance_needed"> - Pour avoir les moyens d'acquérir ce terrain, vous devez acheter au moins [AMOUNT] L$. - </string> - <string name="no_parcel_selected"> - (aucune parcelle sélectionnée) - </string> - <string name="buy_currency"> - Acheter [LINDENS] L$ pour environ [USD] US$ - </string> </floater> diff --git a/indra/newview/skins/default/xui/fr/floater_camera.xml b/indra/newview/skins/default/xui/fr/floater_camera.xml index 309c93cf3b..558551b649 100644 --- a/indra/newview/skins/default/xui/fr/floater_camera.xml +++ b/indra/newview/skins/default/xui/fr/floater_camera.xml @@ -9,6 +9,18 @@ <floater.string name="move_tooltip"> Déplacer la caméra vers le haut et le bas, la gauche et la droite </floater.string> + <floater.string name="orbit_mode_title"> + Faire tourner + </floater.string> + <floater.string name="pan_mode_title"> + Faire un panoramique + </floater.string> + <floater.string name="avatar_view_mode_title"> + Préréglages + </floater.string> + <floater.string name="free_mode_title"> + Voir l'objet + </floater.string> <panel name="controls"> <joystick_track name="cam_track_stick" tool_tip="Déplacer la caméra vers le haut et le bas, la gauche et la droite"/> <panel name="zoom" tool_tip="Zoomer en direction du point central"> @@ -25,7 +37,7 @@ <panel name="buttons"> <button label="" name="orbit_btn" tool_tip="Faire tourner la caméra"/> <button label="" name="pan_btn" tool_tip="Faire un panoramique"/> - <button label="" name="avatarview_btn" tool_tip="Vue subjective"/> + <button label="" name="avatarview_btn" tool_tip="Préréglages"/> <button label="" name="freecamera_btn" tool_tip="Voir l'objet"/> </panel> </floater> diff --git a/indra/newview/skins/default/xui/fr/floater_color_picker.xml b/indra/newview/skins/default/xui/fr/floater_color_picker.xml index c509a4783e..c54e3e9ce0 100644 --- a/indra/newview/skins/default/xui/fr/floater_color_picker.xml +++ b/indra/newview/skins/default/xui/fr/floater_color_picker.xml @@ -25,7 +25,7 @@ <text left="8" name="Current color:"> Couleur actuelle : </text> - <text left="8" name="(Drag below to save.)" width="114"> - (Faire glisser dessous pour enregistrer.) + <text name="(Drag below to save.)"> + Enr. : faire glisser dessous </text> </floater> diff --git a/indra/newview/skins/default/xui/fr/floater_customize.xml b/indra/newview/skins/default/xui/fr/floater_customize.xml index a1cd568571..ff407b25c1 100644 --- a/indra/newview/skins/default/xui/fr/floater_customize.xml +++ b/indra/newview/skins/default/xui/fr/floater_customize.xml @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater customize" title="APPARENCE" width="548"> - <tab_container name="customize tab container" tab_min_width="150" width="546"> +<floater name="floater customize" title="APPARENCE"> + <tab_container name="customize tab container" tab_min_width="150"> <text label="Parties du corps" name="body_parts_placeholder"> Parties du corps </text> <panel label="Silhouette" left="154" name="Shape" width="389"> - <button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/> + <button label="Rétablir" label_selected="Rétablir" name="Revert"/> <button label="Corps" label_selected="Corps" name="Body"/> <button label="Tête" label_selected="Tête" name="Head"/> <button label="Yeux" label_selected="Yeux" name="Eyes"/> @@ -44,8 +44,8 @@ Silhouette : </text> <button label="Créer une silhouette" label_selected="Créer une silhouette" name="Create New"/> - <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/> - <button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/> + <button label="Enregistrer" label_selected="Enregistrer" name="Save"/> + <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/> </panel> <panel label="Peau" name="Skin"> <button label="Couleur" label_selected="Couleur" name="Skin Color" width="84"/> @@ -80,9 +80,9 @@ <texture_picker label="Tatouages haut" name="Upper Tattoos" tool_tip="Cliquez pour sélectionner une image" width="78"/> <texture_picker label="Tatouages bas" name="Lower Tattoos" tool_tip="Cliquez pour sélectionner une image" width="78"/> <button label="Créer une peau" label_selected="Créer une peau" name="Create New"/> - <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/> - <button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/> - <button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/> + <button label="Enregistrer" label_selected="Enregistrer" name="Save"/> + <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/> + <button label="Rétablir" label_selected="Rétablir" name="Revert"/> </panel> <panel label="Cheveux" name="Hair"> <button label="Couleur" label_selected="Couleur" name="Color"/> @@ -115,9 +115,9 @@ </text> <texture_picker label="Texture" name="Texture" tool_tip="Cliquez pour sélectionner une image"/> <button label="Créer des cheveux" label_selected="Créer des cheveux" name="Create New"/> - <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/> - <button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/> - <button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/> + <button label="Enregistrer" label_selected="Enregistrer" name="Save"/> + <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/> + <button label="Rétablir" label_selected="Rétablir" name="Revert"/> </panel> <panel label="Yeux" name="Eyes"> <text name="title"> @@ -146,21 +146,21 @@ </text> <texture_picker label="Iris" name="Iris" tool_tip="Cliquez pour sélectionner une image"/> <button label="Créer des yeux" label_selected="Créer des yeux" name="Create New"/> - <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/> - <button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/> - <button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/> + <button label="Enregistrer" label_selected="Enregistrer" name="Save"/> + <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/> + <button label="Rétablir" label_selected="Rétablir" name="Revert"/> </panel> <text label="Habits" name="clothes_placeholder"> Habits </text> <panel label="Chemise" name="Shirt"> <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/> - <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/> - <button label="Créer une chemise" label_selected="Créer une chemise" name="Create New"/> + <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/> <button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/> - <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/> - <button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/> - <button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/> + <button label="Créer une chemise" label_selected="Créer une chemise" name="Create New"/> + <button label="Enregistrer" label_selected="Enregistrer" name="Save"/> + <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/> + <button label="Rétablir" label_selected="Rétablir" name="Revert"/> <text name="title"> [DESC] </text> @@ -188,12 +188,12 @@ </panel> <panel label="Pantalon" name="Pants"> <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/> - <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/> - <button label="Créer un pantalon" label_selected="Créer un pantalon" name="Create New"/> + <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/> <button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/> - <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/> - <button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/> - <button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/> + <button label="Créer un pantalon" label_selected="Créer un pantalon" name="Create New"/> + <button label="Enregistrer" label_selected="Enregistrer" name="Save"/> + <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/> + <button label="Rétablir" label_selected="Rétablir" name="Revert"/> <text name="title"> [DESC] </text> @@ -238,6 +238,7 @@ <text name="not worn instructions"> Pour changer de chaussures, faites-en glisser une paire de votre inventaire à votre avatar. Vous pouvez aussi en créer des nouvelles et les porter. </text> + <button label="Créer des chaussures" label_selected="Créer des chaussures" name="Create New"/> <text name="no modify instructions"> Vous n'avez pas la permission de modifier cet objet. </text> @@ -245,12 +246,11 @@ Chaussures : </text> <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/> - <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/> - <button label="Créer des chaussures" label_selected="Créer des chaussures" name="Create New"/> + <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/> <button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/> - <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/> - <button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/> - <button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/> + <button label="Enregistrer" label_selected="Enregistrer" name="Save"/> + <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/> + <button label="Rétablir" label_selected="Rétablir" name="Revert"/> </panel> <panel label="Chaussettes" name="Socks"> <text name="title"> @@ -271,6 +271,7 @@ <text name="not worn instructions"> Pour changer de chaussettes, faites-en glisser une paire à partir de votre inventaire. Vous pouvez aussi en créer des nouvelles et les porter. </text> + <button label="Créer des chaussettes" label_selected="Créer des chaussettes" name="Create New"/> <text name="no modify instructions"> Vous n'avez pas la permission de modifier cet objet. </text> @@ -278,12 +279,11 @@ Chaussettes : </text> <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/> - <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/> - <button label="Créer des chaussettes" label_selected="Créer des chaussettes" name="Create New"/> + <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/> <button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/> - <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/> - <button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/> - <button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/> + <button label="Enregistrer" label_selected="Enregistrer" name="Save"/> + <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/> + <button label="Rétablir" label_selected="Rétablir" name="Revert"/> </panel> <panel label="Veste" name="Jacket"> <text name="title"> @@ -304,6 +304,7 @@ <text name="not worn instructions"> Pour changer de veste, faites-en glisser une à partir de votre inventaire. Vous pouvez aussi en créer une nouvelle et la porter. </text> + <button label="Créer une veste" label_selected="Créer une veste" name="Create New"/> <text name="no modify instructions"> Vous n'avez pas la permission de modifier cet objet. </text> @@ -312,12 +313,11 @@ </text> <texture_picker label="Tissu (dessus)" name="Upper Fabric" tool_tip="Cliquez pour sélectionner une image" width="81"/> <texture_picker label="Tissu (dessous)" name="Lower Fabric" tool_tip="Cliquez pour sélectionner une image" width="81"/> - <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="81"/> - <button label="Créer une veste" label_selected="Créer une veste" name="Create New"/> + <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="81"/> <button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/> - <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/> - <button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/> - <button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/> + <button label="Enregistrer" label_selected="Enregistrer" name="Save"/> + <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/> + <button label="Rétablir" label_selected="Rétablir" name="Revert"/> </panel> <panel label="Gants" name="Gloves"> <text name="title"> @@ -338,6 +338,7 @@ <text name="not worn instructions"> Pour changer de gants, faites-en glisser une paire à partir de votre inventaire. Vous pouvez aussi en créer de nouveaux et les porter. </text> + <button label="Créer des gants" label_selected="Créer des gants" name="Create New"/> <text name="no modify instructions"> Vous n'avez pas la permission de modifier cet objet. </text> @@ -345,14 +346,13 @@ Gants : </text> <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/> - <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/> - <button label="Créer des gants" label_selected="Créer des gants" name="Create New"/> + <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/> <button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/> - <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/> - <button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/> - <button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/> + <button label="Enregistrer" label_selected="Enregistrer" name="Save"/> + <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/> + <button label="Rétablir" label_selected="Rétablir" name="Revert"/> </panel> - <panel label="Sous-vêtements (haut)" name="Undershirt"> + <panel label="Débardeur" name="Undershirt"> <text name="title"> [DESC] </text> @@ -363,30 +363,29 @@ [DESC]: en cours de chargement... </text> <text name="title_not_worn"> - [DESC]: non portés + [DESC]: non porté </text> <text name="path"> Emplacement : [PATH] </text> <text name="not worn instructions"> - Pour changer de sous-vêtements (homme), faites-en glisser à partir de votre inventaire. Vous pouvez aussi en créer de nouveaux et les porter. + Pour changer de débardeur, faites-en glisser un à partir de votre inventaire. Vous pouvez aussi en créer un nouveau et le porter. </text> + <button label="Créer un débardeur" label_selected="Créer un débardeur" name="Create New"/> <text name="no modify instructions"> Vous n'avez pas la permission de modifier cet objet. </text> - <text bottom="-470" name="Item Action Label" right="92"> - Sous-vêtements -(haut) : + <text name="Item Action Label"> + Débardeur : </text> <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/> - <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/> - <button label="Créer des sous-vêtements" label_selected="Créer des sous-vêtements" name="Create New"/> + <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/> <button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/> - <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/> - <button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/> - <button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/> + <button label="Enregistrer" label_selected="Enregistrer" name="Save"/> + <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/> + <button label="Rétablir" label_selected="Rétablir" name="Revert"/> </panel> - <panel label="Sous-vêtements (bas)" name="Underpants"> + <panel label="Caleçon" name="Underpants"> <text name="title"> [DESC] </text> @@ -397,28 +396,27 @@ [DESC]: en cours de chargement... </text> <text name="title_not_worn"> - [DESC]: non portés + [DESC]: non porté </text> <text name="path"> Emplacement : [PATH] </text> <text name="not worn instructions"> - Pour changer de sous-vêtements (femme), faites-en glisser à partir de votre inventaire. Vous pouvez aussi en créer de nouveaux et les porter. + Pour changer de caleçon, faites-en glisser un à partir de votre inventaire. Vous pouvez aussi en créer un nouveau et le porter. </text> + <button label="Créer un caleçon" label_selected="Créer un caleçon" name="Create New"/> <text name="no modify instructions"> Vous n'avez pas la permission de modifier cet objet. </text> - <text bottom="-470" name="Item Action Label" right="92"> - Sous-vêtements -(bas) : + <text name="Item Action Label"> + Caleçon : </text> <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/> - <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/> - <button label="Créer des sous-vêtements" label_selected="Créer des sous-vêtements" name="Create New"/> + <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/> <button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/> - <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/> - <button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/> - <button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/> + <button label="Enregistrer" label_selected="Enregistrer" name="Save"/> + <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/> + <button label="Rétablir" label_selected="Rétablir" name="Revert"/> </panel> <panel label="Jupe" name="Skirt"> <text name="title"> @@ -439,6 +437,7 @@ <text name="not worn instructions"> Pour changer de jupe, faites-en glisser une à partir de votre inventaire. Vous pouvez aussi en créer une nouvelle et la porter. </text> + <button label="Créer une jupe" label_selected="Créer une jupe" name="Create New"/> <text name="no modify instructions"> Vous n'avez pas la permission de modifier cet objet. </text> @@ -446,14 +445,13 @@ Jupe : </text> <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/> - <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/> - <button label="Créer une jupe" label_selected="Créer une jupe" name="Create New"/> + <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/> <button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/> - <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/> - <button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/> - <button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/> + <button label="Enregistrer" label_selected="Enregistrer" name="Save"/> + <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/> + <button label="Rétablir" label_selected="Rétablir" name="Revert"/> </panel> - <panel label="Alpha" name="Alpha"> + <panel label="Tatouage" name="Tattoo"> <text name="title"> [DESC] </text> @@ -470,26 +468,24 @@ Dans [PATH] </text> <text name="not worn instructions"> - Pour changer de masque alpha, faites-en glisser un de votre inventaire à votre avatar. Vous pouvez aussi en créer un nouveau et le porter. + Pour changer de tatouage, faites-en glisser un de votre inventaire à votre avatar. Vous pouvez aussi en créer un nouveau et le porter. </text> + <button label="Créer un nouveau tatouage" label_selected="Créer un nouveau tatouage" name="Create New"/> <text name="no modify instructions"> Vous n'avez pas le droit de modifier cet objet. </text> <text name="Item Action Label"> - Alpha : + Tatouage : </text> - <texture_picker label="Alpha bas" name="Lower Alpha" tool_tip="Cliquez pour sélectionner une image"/> - <texture_picker label="Alpha haut" name="Upper Alpha" tool_tip="Cliquez pour sélectionner une image"/> - <texture_picker label="Alpha tête" name="Head Alpha" tool_tip="Cliquez pour sélectionner une image"/> - <texture_picker label="Alpha yeux" name="Eye Alpha" tool_tip="Cliquez pour sélectionner une image"/> - <texture_picker label="Alpha cheveux" name="Hair Alpha" tool_tip="Cliquez pour sélectionner une image"/> - <button label="Créer un nouvel alpha" label_selected="Créer un nouvel alpha" name="Create New"/> + <texture_picker label="Tatouage tête" name="Head Tattoo" tool_tip="Cliquez pour sélectionner une image"/> + <texture_picker label="Tatouage haut" name="Upper Tattoo" tool_tip="Cliquez pour sélectionner une image"/> + <texture_picker label="Tatouage bas" name="Lower Tattoo" tool_tip="Cliquez pour sélectionner une image"/> <button label="Enlever" label_selected="Enlever" name="Take Off"/> <button label="Enregistrer" label_selected="Enregistrer" name="Save"/> <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/> - <button label="Annuler modification" label_selected="Annuler modification" name="Revert"/> + <button label="Rétablir" label_selected="Rétablir" name="Revert"/> </panel> - <panel label="Tatouage" name="Tattoo"> + <panel label="Alpha" name="Alpha"> <text name="title"> [DESC] </text> @@ -506,26 +502,28 @@ Dans [PATH] </text> <text name="not worn instructions"> - Pour changer de tatouage, faites-en glisser un de votre inventaire à votre avatar. Vous pouvez aussi en créer un nouveau et le porter. + Pour changer de masque alpha, faites-en glisser un de votre inventaire à votre avatar. Vous pouvez aussi en créer un nouveau et le porter. </text> + <button label="Créer un nouvel alpha" label_selected="Créer un nouvel alpha" name="Create New"/> <text name="no modify instructions"> Vous n'avez pas le droit de modifier cet objet. </text> <text name="Item Action Label"> - Tatouage : + Alpha : </text> - <texture_picker label="Tatouage tête" name="Head Tattoo" tool_tip="Cliquez pour sélectionner une image"/> - <texture_picker label="Tatouage haut" name="Upper Tattoo" tool_tip="Cliquez pour sélectionner une image"/> - <texture_picker label="Tatouage bas" name="Lower Tattoo" tool_tip="Cliquez pour sélectionner une image"/> - <button label="Créer un nouveau tatouage" label_selected="Créer un nouveau tatouage" name="Create New"/> + <texture_picker label="Alpha bas" name="Lower Alpha" tool_tip="Cliquez pour sélectionner une image"/> + <texture_picker label="Alpha haut" name="Upper Alpha" tool_tip="Cliquez pour sélectionner une image"/> + <texture_picker label="Alpha tête" name="Head Alpha" tool_tip="Cliquez pour sélectionner une image"/> + <texture_picker label="Alpha yeux" name="Eye Alpha" tool_tip="Cliquez pour sélectionner une image"/> + <texture_picker label="Alpha cheveux" name="Hair Alpha" tool_tip="Cliquez pour sélectionner une image"/> <button label="Enlever" label_selected="Enlever" name="Take Off"/> <button label="Enregistrer" label_selected="Enregistrer" name="Save"/> <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/> - <button label="Annuler modification" label_selected="Annuler modification" name="Revert"/> + <button label="Rétablir" label_selected="Rétablir" name="Revert"/> </panel> </tab_container> <scroll_container left="251" name="panel_container"/> - <button label="Infos sur les scripts" label_selected="Infos sur les scripts" name="script_info"/> + <button label="Infos scripts" label_selected="Infos scripts" name="script_info" tool_tip="Afficher les scripts attachés à votre avatar"/> <button label="Créer tenue" label_selected="Créer une tenue..." name="make_outfit_btn"/> <button label="Annuler" label_selected="Annuler" name="Cancel"/> <button label="OK" label_selected="OK" name="Ok"/> diff --git a/indra/newview/skins/default/xui/fr/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/fr/floater_day_cycle_options.xml index 0b36b7b8ca..87c8847cbd 100644 --- a/indra/newview/skins/default/xui/fr/floater_day_cycle_options.xml +++ b/indra/newview/skins/default/xui/fr/floater_day_cycle_options.xml @@ -1,10 +1,10 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="Day Cycle Floater" title="EDITEUR DU CYCLE DU JOUR"> <tab_container name="Day Cycle Tabs"> <panel label="Cycle du jour" name="Day Cycle"> - <button label="?" name="WLDayCycleHelp" /> + <button label="?" name="WLDayCycleHelp"/> <text name="WL12am"> - Minuit + Min. </text> <text name="WL3am"> 3h @@ -28,7 +28,7 @@ 21h </text> <text name="WL12am2"> - Minuit + Min. </text> <text name="WL12amHash"> | @@ -57,41 +57,38 @@ <text name="WL12amHash2"> | </text> - <button label="Ajouter clé" label_selected="Ajouter clé" name="WLAddKey" width="89" bottom="-45" /> - <button label="Supprimer clé" label_selected="Supprimer clé" name="WLDeleteKey" width="89" bottom="-70" /> + <button label="Ajouter clé" label_selected="Ajouter clé" name="WLAddKey"/> + <button label="Supprimer clé" label_selected="Supprimer clé" name="WLDeleteKey"/> <text name="WLCurKeyFrameText"> Réglages des images-clés : </text> <text name="WLCurKeyTimeText"> Heure de la clé : </text> - <spinner label="Heure" name="WLCurKeyHour" /> - <spinner label="Min" name="WLCurKeyMin" /> + <spinner label="Heure" name="WLCurKeyHour"/> + <spinner label="Min" name="WLCurKeyMin"/> <text name="WLCurKeyTimeText2"> Préréglages clés : </text> - <combo_box label="Préréglage" name="WLKeyPresets" /> + <combo_box label="Préréglage" name="WLKeyPresets"/> <text name="DayCycleText"> Snap : </text> - <combo_box label="5 min" name="WLSnapOptions" /> + <combo_box label="5 min" name="WLSnapOptions"/> <text name="DayCycleText2"> Durée du cycle : </text> - <spinner label="Heure" name="WLLengthOfDayHour" /> - <spinner label="Min" name="WLLengthOfDayMin" /> - <spinner label="S" name="WLLengthOfDaySec" label_width="10" width="50" left_delta="75"/> + <spinner label="Heure" name="WLLengthOfDayHour"/> + <spinner label="Min" name="WLLengthOfDayMin"/> + <spinner label="S" name="WLLengthOfDaySec"/> <text name="DayCycleText3"> - Prévisualiser : - </text> - <button label="Jouer" label_selected="Jouer" name="WLAnimSky" /> - <button label="Stop !" label_selected="Stop" name="WLStopAnimSky" /> - <button label="Utiliser heure domaine" label_selected="Aller heure domaine" - name="WLUseLindenTime" /> - <button label="Enregistrer jour test" label_selected="Enregistrer jour test" - name="WLSaveDayCycle" /> - <button label="Charger jour test" label_selected="Charger jour test" - name="WLLoadDayCycle" /> + Aperçu : + </text> + <button label="Lire" label_selected="Lire" name="WLAnimSky"/> + <button label="Stop !" label_selected="Stop" name="WLStopAnimSky"/> + <button label="Utiliser heure domaine" label_selected="Aller heure domaine" name="WLUseLindenTime"/> + <button label="Enregistrer jour test" label_selected="Enregistrer jour test" name="WLSaveDayCycle"/> + <button label="Charger jour test" label_selected="Charger jour test" name="WLLoadDayCycle"/> </panel> </tab_container> </floater> diff --git a/indra/newview/skins/default/xui/fr/floater_env_settings.xml b/indra/newview/skins/default/xui/fr/floater_env_settings.xml index 505c9236c7..dd714e85b6 100644 --- a/indra/newview/skins/default/xui/fr/floater_env_settings.xml +++ b/indra/newview/skins/default/xui/fr/floater_env_settings.xml @@ -3,7 +3,7 @@ <floater.string name="timeStr"> [hour12,datetime,utc]:[min,datetime,utc] [ampm,datetime,utc] </floater.string> - <text bottom="-45" name="EnvTimeText"> + <text bottom="-45" name="EnvTimeText" top="29"> Heure de la journée </text> @@ -14,7 +14,7 @@ journée Couverture nuageuse </text> - <text bottom="-45" name="EnvWaterColorText"> + <text bottom="-45" name="EnvWaterColorText" top="29"> Couleur de l'eau </text> @@ -23,7 +23,7 @@ l'eau Brouillard dans l'eau </text> - <button bottom="-144" label="Utiliser heure du domaine" name="EnvUseEstateTimeButton" width="145"/> + <button bottom="-144" label="Utiliser heure du domaine" name="EnvUseEstateTimeButton" width="152"/> <button label="Ciel avancé" left="162" name="EnvAdvancedSkyButton" width="145"/> <button label="Eau avancée" left="316" name="EnvAdvancedWaterButton" width="145"/> </floater> diff --git a/indra/newview/skins/default/xui/fr/floater_event.xml b/indra/newview/skins/default/xui/fr/floater_event.xml new file mode 100644 index 0000000000..b005ce3b36 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/floater_event.xml @@ -0,0 +1,69 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater label="Événement" name="Event" title="DÉTAILS SUR L'ÉVÉNEMENT"> + <floater.string name="none"> + aucun + </floater.string> + <floater.string name="notify"> + Prévenir + </floater.string> + <floater.string name="dont_notify"> + Ne pas prévenir + </floater.string> + <floater.string name="moderate"> + Modéré + </floater.string> + <floater.string name="adult"> + Adulte + </floater.string> + <floater.string name="general"> + Général + </floater.string> + <floater.string name="unknown"> + Inconnu + </floater.string> + <layout_stack name="layout"> + <layout_panel name="profile_stack"> + <text name="event_name"> + Nameless Event...of Doom! De doom! Doom doom. + </text> + <text name="event_category"> + (pas de catégorie) + </text> + <text name="event_runby_label"> + Organisé par : + </text> + <text initial_value="(récupération en cours)" name="event_runby"/> + <text name="event_date_label"> + Date : + </text> + <text name="event_date"> + 10/10/2010 + </text> + <text name="event_duration_label"> + Durée : + </text> + <text name="event_duration"> + 1 heure + </text> + <text name="event_covercharge_label"> + Prix : + </text> + <text name="event_cover"> + Gratuit + </text> + <text name="event_location_label"> + Lieu : + </text> + <text name="event_location" value="SampleParcel, Name Long (145, 228, 26)"/> + <text name="rating_label" value="Catégorie :"/> + <text name="rating_value" value="inconnu"/> + </layout_panel> + <layout_panel name="button_panel"> + <button name="create_event_btn" tool_tip="Créer un événement"/> + <button name="god_delete_event_btn" tool_tip="Supprimer l'événement"/> + <button label="Me prévenir" name="notify_btn"/> + <button label="Téléporter" name="teleport_btn"/> + <button label="Carte" name="map_btn"/> + </layout_panel> + </layout_stack> +</floater> diff --git a/indra/newview/skins/default/xui/fr/floater_gesture.xml b/indra/newview/skins/default/xui/fr/floater_gesture.xml index 113df0acc4..5ead1cae3a 100644 --- a/indra/newview/skins/default/xui/fr/floater_gesture.xml +++ b/indra/newview/skins/default/xui/fr/floater_gesture.xml @@ -9,9 +9,9 @@ <floater.string name="copy_name"> Copie de [COPY_NAME] </floater.string> - <scroll_list bottom_delta="-385" height="360" name="gesture_list"> - <scroll_list.columns label="Nom" name="name" width="145"/> - <scroll_list.columns label="Chat" name="trigger" width="85"/> + <scroll_list name="gesture_list"> + <scroll_list.columns label="Nom" name="name"/> + <scroll_list.columns label="Chat" name="trigger"/> <scroll_list.columns label="" name="key"/> <scroll_list.columns label="Touche" name="shortcut"/> </scroll_list> @@ -22,6 +22,6 @@ <button name="del_btn" tool_tip="Supprimer ce geste"/> </panel> <button label="Modifier" name="edit_btn"/> - <button label="Jouer" name="play_btn"/> + <button label="Lire" name="play_btn"/> <button label="Stop" name="stop_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/fr/floater_god_tools.xml b/indra/newview/skins/default/xui/fr/floater_god_tools.xml index 0dedf499bb..e4c53d866c 100644 --- a/indra/newview/skins/default/xui/fr/floater_god_tools.xml +++ b/indra/newview/skins/default/xui/fr/floater_god_tools.xml @@ -2,17 +2,16 @@ <floater name="godtools floater" title="OUTILS DIVINS"> <tab_container name="GodTools Tabs"> <panel label="Grille" name="grid"> - <button label="Éjecter tous" label_selected="Éjecter tous" name="Kick all users" width="175"/> <button label="Vider le cache cartographique de la région" label_selected="Vider le cache cartographique de la région" name="Flush This Region's Map Visibility Caches" width="285"/> </panel> <panel label="Région" name="region"> - <text name="Sim Name:" width="70"> - Nom du sim : + <text name="Region Name:"> + Nom de la région : </text> <line_editor left="85" name="region name" width="198"/> <check_box label="Initiation" name="check prelude" tool_tip="Définir cette région comme zone d'initiation."/> <check_box label="Soleil fixe" name="check fixed sun" tool_tip="Définir la position du soleil (comme dans Région et Domaine > Terrain.)"/> - <check_box height="32" label="Réinitialiser le domicile à la téléportation" name="check reset home" tool_tip="Quand les résidents s'en vont par téléportation, réinitialisez leur domicile sur l'emplacement de destination."/> + <check_box height="32" label="Réinitialiser le domicile à la téléportation" name="check reset home" tool_tip="Quand les résidents s'en vont par téléportation, réinitialisez leur domicile sur l'emplacement de destination."/> <check_box bottom_delta="-32" label="Visible" name="check visible" tool_tip="Cochez pour rendre la région visible aux non-admins."/> <check_box label="Dégâts" name="check damage" tool_tip="Cochez pour activer les dégâts dans cette région."/> <check_box label="Bloquer le suivi de trafic" name="block dwell" tool_tip="Cochez pour que la région ne comptabilise pas le trafic."/> @@ -48,15 +47,15 @@ <spinner left="320" name="land cost" width="70"/> <button label="Rafraîchir" label_selected="Rafraîchir" name="Refresh" tool_tip="Cliquez ici pour rafraîchir les informations ci-dessus."/> <button label="Appliquer" label_selected="Appliquer" name="Apply" tool_tip="Cliquez ici pour appliquer les modifications effectuées ci-dessus."/> - <button label="Sélectionner une région" label_selected="Sélectionner une région" left="136" name="Select Region" tool_tip="Sélectionnez une région entière à l'aide de l'outil Terrain." width="140"/> - <button label="Sauvegarde automatique" label_selected="Sauvegarde automatique" left="136" name="Autosave now" tool_tip="Sauvegarde automatique au format gzip." width="140"/> + <button label="Sélectionner une région" label_selected="Sélectionner une région" left="136" name="Select Region" tool_tip="Sélectionnez une région entière à l'aide de l'outil Terrain." width="160"/> + <button label="Sauvegarde automatique" label_selected="Sauvegarde automatique" left="136" name="Autosave now" tool_tip="Sauvegarde automatique au format gzip." width="160"/> </panel> <panel label="Objets" name="objects"> <panel.string name="no_target"> (aucune cible) </panel.string> - <text name="Sim Name:" width="70"> - Nom du sim : + <text name="Region Name:"> + Nom de la région : </text> <text left_delta="75" name="region name"> Welsh diff --git a/indra/newview/skins/default/xui/fr/floater_help_browser.xml b/indra/newview/skins/default/xui/fr/floater_help_browser.xml index 1170d1d87b..11caca640c 100644 --- a/indra/newview/skins/default/xui/fr/floater_help_browser.xml +++ b/indra/newview/skins/default/xui/fr/floater_help_browser.xml @@ -1,14 +1,9 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="floater_help_browser" title="NAVIGATEUR D'AIDE"> - <floater.string name="home_page_url"> - http://fr.secondlife.com - </floater.string> - <floater.string name="support_page_url"> - http://fr.secondlife.com/support + <floater.string name="loading_text"> + Chargement… </floater.string> <layout_stack name="stack1"> - <layout_panel name="external_controls"> - <button label="Ouvrir dans mon navigateur Web" name="open_browser"/> - </layout_panel> + <layout_panel name="external_controls"/> </layout_stack> </floater> diff --git a/indra/newview/skins/default/xui/fr/floater_im.xml b/indra/newview/skins/default/xui/fr/floater_im.xml index 0e4039d3af..15b01dbf12 100644 --- a/indra/newview/skins/default/xui/fr/floater_im.xml +++ b/indra/newview/skins/default/xui/fr/floater_im.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <multi_floater name="im_floater" title="Message instantané"> <text name="only_user_message"> - Vous êtes le seul participant à cette session. + Vous êtes le seul résident participant à cette session. </text> <text name="offline_message"> [FIRST] [LAST] est déconnecté(e). @@ -31,7 +31,7 @@ Un modérateur de groupe a désactivé votre chat écrit. </string> <string name="add_session_event"> - Impossible d'ajouter des participants à la session de chat avec [RECIPIENT]. + Impossible d'ajouter des résidents à la session de chat avec [RECIPIENT]. </string> <string name="message_session_event"> Impossible d'envoyer votre message à la session de chat avec [RECIPIENT]. diff --git a/indra/newview/skins/default/xui/fr/floater_image_preview.xml b/indra/newview/skins/default/xui/fr/floater_image_preview.xml index a28e0bd7d5..3d405f358d 100644 --- a/indra/newview/skins/default/xui/fr/floater_image_preview.xml +++ b/indra/newview/skins/default/xui/fr/floater_image_preview.xml @@ -10,16 +10,16 @@ Prévisualiser comme : </text> <combo_box label="Habits" left="126" name="clothing_type_combo"> - <combo_box.item label="Image" name="Image"/> - <combo_box.item label="Cheveux" name="Hair"/> - <combo_box.item label="Tête de femme" name="FemaleHead"/> - <combo_box.item label="Corps de femme (haut)" name="FemaleUpperBody"/> - <combo_box.item label="Corps de femme (bas)" name="FemaleLowerBody"/> - <combo_box.item label="Tête d'homme" name="MaleHead"/> - <combo_box.item label="Corps d'homme (haut)" name="MaleUpperBody"/> - <combo_box.item label="Corps d'homme (bas)" name="MaleLowerBody"/> - <combo_box.item label="Jupe" name="Skirt"/> - <combo_box.item label="Sculptie" name="SculptedPrim"/> + <item label="Image" name="Image" value="Image"/> + <item label="Cheveux" name="Hair" value="Cheveux"/> + <item label="Tête de femme" name="FemaleHead" value="Tête de femme"/> + <item label="Corps de femme (haut)" name="FemaleUpperBody" value="Corps de femme (haut)"/> + <item label="Corps de femme (bas)" name="FemaleLowerBody" value="Corps de femme (bas)"/> + <item label="Tête d'homme" name="MaleHead" value="Tête d'homme"/> + <item label="Corps d'homme (haut)" name="MaleUpperBody" value="Corps d'homme (haut)"/> + <item label="Corps d'homme (bas)" name="MaleLowerBody" value="Corps d'homme (bas)"/> + <item label="Jupe" name="Skirt" value="Jupe"/> + <item label="Sculptie" name="SculptedPrim" value="Sculptie"/> </combo_box> <text name="bad_image_text"> Impossible de lire l'image. diff --git a/indra/newview/skins/default/xui/fr/floater_inspect.xml b/indra/newview/skins/default/xui/fr/floater_inspect.xml index de74f47bcf..9b1bdf106d 100644 --- a/indra/newview/skins/default/xui/fr/floater_inspect.xml +++ b/indra/newview/skins/default/xui/fr/floater_inspect.xml @@ -7,7 +7,7 @@ <scroll_list.columns label="Nom" name="object_name"/> <scroll_list.columns label="Propriétaire" name="owner_name"/> <scroll_list.columns label="Créateur" name="creator_name"/> - <scroll_list.columns label="Date de création" name="creation_date"/> + <scroll_list.columns label="Date de création" name="creation_date" width="114"/> </scroll_list> <button label="Voir le profil du propriétaire..." name="button owner" tool_tip="Voir le profil du propriétaire de l'objet en surbrillance" width="172"/> <button label="Voir le profil du créateur..." left="192" name="button creator" tool_tip="Voir le profil du créateur de l'objet en surbrillance" width="172"/> diff --git a/indra/newview/skins/default/xui/fr/floater_inventory.xml b/indra/newview/skins/default/xui/fr/floater_inventory.xml index 1f8b7f37ad..200c07e522 100644 --- a/indra/newview/skins/default/xui/fr/floater_inventory.xml +++ b/indra/newview/skins/default/xui/fr/floater_inventory.xml @@ -1,13 +1,13 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Inventory" title="INVENTAIRE"> +<floater name="Inventory" title="MON INVENTAIRE"> <floater.string name="Title"> - Inventaire + MON INVENTAIRE </floater.string> <floater.string name="TitleFetching"> - Inventaire (Récupération de [ITEM_COUNT] articles en cours) [FILTER] + MON INVENTAIRE (récupération de [ITEM_COUNT] articles en cours) [FILTER] </floater.string> <floater.string name="TitleCompleted"> - Inventaire ([ITEM_COUNT] articles) [FILTER] + MON INVENTAIRE ([ITEM_COUNT] articles) [FILTER] </floater.string> <floater.string name="Fetched"> Récupéré diff --git a/indra/newview/skins/default/xui/fr/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/fr/floater_inventory_item_properties.xml index b0d5df161c..fca1a329a2 100644 --- a/indra/newview/skins/default/xui/fr/floater_inventory_item_properties.xml +++ b/indra/newview/skins/default/xui/fr/floater_inventory_item_properties.xml @@ -47,11 +47,11 @@ <check_box label="Éditer" name="CheckOwnerModify"/> <check_box label="Copier" name="CheckOwnerCopy"/> <check_box label="Revendre" name="CheckOwnerTransfer"/> - <text name="AnyoneLabel"> + <text name="AnyoneLabel" width="80"> N'importe qui : </text> <check_box label="Copier" name="CheckEveryoneCopy"/> - <text name="GroupLabel"> + <text name="GroupLabel" width="80"> Groupe : </text> <check_box label="Partager" name="CheckShareWithGroup"/> diff --git a/indra/newview/skins/default/xui/fr/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/fr/floater_inventory_view_finder.xml index 52f8597dc2..1ee85a77ce 100644 --- a/indra/newview/skins/default/xui/fr/floater_inventory_view_finder.xml +++ b/indra/newview/skins/default/xui/fr/floater_inventory_view_finder.xml @@ -11,14 +11,14 @@ <check_box label="Sons" name="check_sound"/> <check_box label="Textures" name="check_texture"/> <check_box label="Photos" name="check_snapshot"/> - <button label="Tout" label_selected="Tout" name="All" width="70"/> - <button bottom_delta="0" label="Aucun" label_selected="Aucun" left="83" name="None" width="70"/> - <check_box bottom_delta="-20" label="Toujours montrer les dossiers" name="check_show_empty"/> - <check_box bottom_delta="-36" label="Depuis la déconnexion" name="check_since_logoff"/> + <button label="Tout" label_selected="Tout" name="All"/> + <button bottom_delta="0" label="Aucun" label_selected="Aucun" name="None"/> + <check_box label="Toujours montrer les dossiers" name="check_show_empty"/> + <check_box label="Depuis la déconnexion" name="check_since_logoff"/> <text name="- OR -"> Ou il y a... </text> <spinner label="Heures" name="spin_hours_ago"/> <spinner label="Jours" name="spin_days_ago"/> - <button bottom_delta="-30" label="Fermer" label_selected="Fermer" name="Close"/> + <button label="Fermer" label_selected="Fermer" name="Close"/> </floater> diff --git a/indra/newview/skins/default/xui/fr/floater_joystick.xml b/indra/newview/skins/default/xui/fr/floater_joystick.xml index d3a1b6c61b..02ac21bf82 100644 --- a/indra/newview/skins/default/xui/fr/floater_joystick.xml +++ b/indra/newview/skins/default/xui/fr/floater_joystick.xml @@ -1,16 +1,16 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="Joystick" title="CONFIGURATION DU JOYSTICK"> <check_box label="Activer :" name="enable_joystick"/> - <spinner label="Mapping axe des X " name="JoystickAxis1"/> - <spinner label="Mapping axe des Y" name="JoystickAxis2"/> - <spinner label="Mapping axe des Z" name="JoystickAxis0"/> - <spinner label="Mapping du tangage" label_width="111" left="8" name="JoystickAxis4" width="152"/> - <spinner label="Mapping du lacet" name="JoystickAxis5"/> - <spinner label="Mapping du roulis" name="JoystickAxis3"/> - <spinner label="Mapping du zoom" name="JoystickAxis6"/> + <spinner label="Mapping axe des X " name="JoystickAxis1" left="20" width="154" label_width="130"/> + <spinner label="Mapping axe des Y" name="JoystickAxis2" width="154" label_width="130"/> + <spinner label="Mapping axe des Z" name="JoystickAxis0" width="154" label_width="130"/> + <spinner label="Mapping du tangage" label_width="136" left="20" name="JoystickAxis4" width="154"/> + <spinner label="Mapping du lacet" name="JoystickAxis5" width="154" label_width="130"/> + <spinner label="Mapping du roulis" name="JoystickAxis3" width="154" label_width="130"/> + <spinner label="Mapping du zoom" name="JoystickAxis6" left="20" width="154" label_width="130"/> <check_box label="Zoom direct" name="ZoomDirect"/> - <check_box label="Curseur 3D" name="Cursor3D"/> - <check_box label="Niveau automatique" name="AutoLeveling"/> + <check_box label="Curseur 3D" name="Cursor3D" left="300"/> + <check_box label="Niveau automatique" name="AutoLeveling" left="400"/> <text name="Control Modes:"> Modes de contrôle : </text> @@ -26,7 +26,7 @@ <text name="ZScale"> Échelle des Z </text> - <text left="9" name="PitchScale" width="104"> + <text name="PitchScale"> Échelle du tangage </text> <text name="YawScale"> @@ -44,8 +44,8 @@ <text name="ZDeadZone"> Zone neutre Z </text> - <text left="4" name="PitchDeadZone" width="110"> - Zone neutre Tangage + <text name="PitchDeadZone"> + Zone neutre tangage </text> <text name="YawDeadZone"> Zone neutre lacet @@ -59,7 +59,7 @@ <text name="ZoomScale2"> Échelle du zoom </text> - <text left="6" name="ZoomDeadZone" width="110"> + <text name="ZoomDeadZone"> Zone neutre du zoom </text> <button label="Options par défaut du joystick" name="SpaceNavigatorDefaults"/> diff --git a/indra/newview/skins/default/xui/fr/floater_lagmeter.xml b/indra/newview/skins/default/xui/fr/floater_lagmeter.xml index 20dffbbbc8..39a861d8bd 100644 --- a/indra/newview/skins/default/xui/fr/floater_lagmeter.xml +++ b/indra/newview/skins/default/xui/fr/floater_lagmeter.xml @@ -25,16 +25,16 @@ Normal, fenêtre en arrière-plan </floater.string> <floater.string name="client_frame_time_critical_msg"> - Taux de défilement client ci-dessous [CLIENT_FRAME_RATE_CRITICAL] + Taux de défilement [CLIENT_FRAME_RATE_CRITICAL] </floater.string> <floater.string name="client_frame_time_warning_msg"> - Taux de défilement client entre [CLIENT_FRAME_RATE_CRITICAL] et [CLIENT_FRAME_RATE_WARNING] + Taux de défilement entre [CLIENT_FRAME_RATE_CRITICAL] et [CLIENT_FRAME_RATE_WARNING] </floater.string> <floater.string name="client_frame_time_normal_msg"> Normal </floater.string> <floater.string name="client_draw_distance_cause_msg"> - Cause possible : la limite d'affichage est trop élevée + Cause possible : limite d'affichage trop élevée </floater.string> <floater.string name="client_texture_loading_cause_msg"> Cause possible : images en cours de chargement @@ -43,7 +43,7 @@ Cause possible : trop d'images en mémoire </floater.string> <floater.string name="client_complex_objects_cause_msg"> - Cause possible : trop d'objets complexes dans la scène + Cause possible : trop d'objets complexes </floater.string> <floater.string name="network_text_msg"> Réseau @@ -70,10 +70,10 @@ 300 </floater.string> <floater.string name="network_ping_critical_msg"> - Temps de connexion ping supérieur à [NETWORK_PING_CRITICAL] ms + Connexion ping > [NETWORK_PING_CRITICAL] ms </floater.string> <floater.string name="network_ping_warning_msg"> - Temps de connexion ping entre [NETWORK_PING_WARNING] et [NETWORK_PING_CRITICAL] ms + Connexion ping entre [NETWORK_PING_WARNING] et [NETWORK_PING_CRITICAL] ms </floater.string> <floater.string name="network_packet_loss_cause_msg"> Mauvaise connexion possible ou réglage de la bande passante trop élevé. @@ -94,10 +94,10 @@ 20 </floater.string> <floater.string name="server_frame_time_critical_msg"> - Taux de défilement du simulateur au dessous de [SERVER_FRAME_RATE_CRITICAL] + Défilement du simulateur < [SERVER_FRAME_RATE_CRITICAL] </floater.string> <floater.string name="server_frame_time_warning_msg"> - Taux de défilement du simulateur entre [SERVER_FRAME_RATE_CRITICAL] et [SERVER_FRAME_RATE_WARNING] + Défilement simulateur entre [SERVER_FRAME_RATE_CRITICAL] et [SERVER_FRAME_RATE_WARNING] </floater.string> <floater.string name="server_frame_time_normal_msg"> Normal @@ -112,7 +112,7 @@ Cause possible : trop de trafic réseau </floater.string> <floater.string name="server_agent_cause_msg"> - Cause possible : trop de personnes en mouvement dans la région + Cause possible : trop de personnes en mouvement </floater.string> <floater.string name="server_images_cause_msg"> Cause possible : trop de calculs d'images diff --git a/indra/newview/skins/default/xui/fr/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/fr/floater_live_lsleditor.xml index b0a2f92f7c..7647452e91 100644 --- a/indra/newview/skins/default/xui/fr/floater_live_lsleditor.xml +++ b/indra/newview/skins/default/xui/fr/floater_live_lsleditor.xml @@ -1,15 +1,15 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="script ed float" title="SCRIPT : NOUVEAU SCRIPT"> <floater.string name="not_allowed"> - Ce script ne peut pas être copié, visualisé ou modifié. Pour visualiser ou modifier un script à l'intérieur d'un objet, vous devez avoir les permissions requises. + Ce script ne peut pas être copié, visualisé ou modifié. Pour visualiser ou modifier un script à l'intérieur d'un objet, vous devez avoir les droits requis. </floater.string> <floater.string name="script_running"> Exécution en cours </floater.string> <floater.string name="Title"> - Script : [NAME] + SCRIPT : [NAME] </floater.string> - <button label="Réinitialiser" label_selected="Réinitialiser" left="390" name="Reset" width="100"/> - <check_box initial_value="true" label="Exécution en cours" left="4" name="running"/> - <check_box initial_value="true" label="Mono" left="130" name="mono"/> + <button label="Réinitialiser" label_selected="Réinitialiser" name="Reset"/> + <check_box initial_value="true" label="Exécution en cours" name="running"/> + <check_box initial_value="true" label="Mono" name="mono"/> </floater> diff --git a/indra/newview/skins/default/xui/fr/floater_lsl_guide.xml b/indra/newview/skins/default/xui/fr/floater_lsl_guide.xml index b92c0944de..71d2c42578 100644 --- a/indra/newview/skins/default/xui/fr/floater_lsl_guide.xml +++ b/indra/newview/skins/default/xui/fr/floater_lsl_guide.xml @@ -1,7 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="script ed float" title="RÉFÉRENCE LSL"> - <check_box label="Suivre le curseur" name="lock_check"/> - <combo_box label="Verrouiller" left_delta="120" name="history_combo" width="70"/> - <button label="Précédente" left_delta="75" name="back_btn"/> - <button label="Suivante" name="fwd_btn"/> + + <check_box label="Suivre le curseur" name="lock_check" width="90" /> + <combo_box label="Verrouiller" left_delta="120" name="history_combo" width="82"/> + <button label="Précédente" name="back_btn" left_delta="75"/> + <button label="Suivante" name="fwd_btn" width="60"/> </floater> diff --git a/indra/newview/skins/default/xui/fr/floater_map.xml b/indra/newview/skins/default/xui/fr/floater_map.xml index aeef4b0e91..ae319949e3 100644 --- a/indra/newview/skins/default/xui/fr/floater_map.xml +++ b/indra/newview/skins/default/xui/fr/floater_map.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Map"> +<floater name="Map" title=""> <floater.string name="mini_map_north"> N </floater.string> diff --git a/indra/newview/skins/default/xui/fr/floater_media_browser.xml b/indra/newview/skins/default/xui/fr/floater_media_browser.xml index 0677c5d41f..58535eddf5 100644 --- a/indra/newview/skins/default/xui/fr/floater_media_browser.xml +++ b/indra/newview/skins/default/xui/fr/floater_media_browser.xml @@ -15,12 +15,12 @@ <button label="OK" left_delta="515" name="go"/> </layout_panel> <layout_panel name="time_controls"> - <button label="en arrière" name="rewind"/> + <button label="en arrière" name="rewind" width="60"/> <button label="stop" name="stop"/> - <button label="en avant" name="seek"/> + <button label="en avant" name="seek" width="60"/> </layout_panel> <layout_panel name="parcel_owner_controls"> - <button label="Envoyer la page actuelle à la parcelle" name="assign"/> + <button label="Envoyer la page actuelle à la parcelle" name="assign" width="220"/> </layout_panel> <layout_panel name="external_controls"> <button label="Ouvrir dans mon navigateur web" name="open_browser" width="196"/> diff --git a/indra/newview/skins/default/xui/fr/floater_mem_leaking.xml b/indra/newview/skins/default/xui/fr/floater_mem_leaking.xml index 5993f90cef..d03c4d7544 100644 --- a/indra/newview/skins/default/xui/fr/floater_mem_leaking.xml +++ b/indra/newview/skins/default/xui/fr/floater_mem_leaking.xml @@ -12,7 +12,7 @@ [NOTE2] </text> <button label="Commencer" name="start_btn" width="85"/> - <button label="Stop" left="100" name="stop_btn"/> - <button label="Libérer" left="177" name="release_btn"/> - <button label="Fermer" name="close_btn"/> + <button label="Stop" name="stop_btn"/> + <button label="Libérer" name="release_btn"/> + <button label="Fermer" name="close_btn" left_pad="20"/> </floater> diff --git a/indra/newview/skins/default/xui/fr/floater_moveview.xml b/indra/newview/skins/default/xui/fr/floater_moveview.xml index 0e8887bb96..c0f3864b81 100644 --- a/indra/newview/skins/default/xui/fr/floater_moveview.xml +++ b/indra/newview/skins/default/xui/fr/floater_moveview.xml @@ -6,23 +6,64 @@ <string name="walk_back_tooltip"> Marcher en arrière (appuyer sur la flèche vers le bas ou S) </string> + <string name="walk_left_tooltip"> + Marcher vers la gauche (Maj+Flèche gauche ou touche A) + </string> + <string name="walk_right_tooltip"> + Marcher vers la droite (Maj+Flèche droite ou touche D) + </string> <string name="run_forward_tooltip"> Courir vers l'avant (appuyer sur la flèche vers le haut ou W) </string> <string name="run_back_tooltip"> Courir en arrière (appuyer sur la flèche vers le bas ou S) </string> + <string name="run_left_tooltip"> + Courir vers la gauche (Maj+Flèche gauche ou touche A) + </string> + <string name="run_right_tooltip"> + Courir vers la droite (Maj+Flèche droite ou touche D) + </string> <string name="fly_forward_tooltip"> Voler vers l'avant (appuyer sur la flèche vers le haut ou W) </string> <string name="fly_back_tooltip"> Voler vers l'arrière (appuyer sur la flèche vers le bas ou S) </string> + <string name="fly_left_tooltip"> + Voler vers la gauche (Maj+Flèche gauche ou touche A) + </string> + <string name="fly_right_tooltip"> + Voler vers la droite (Maj+Flèche droite ou touche D) + </string> + <string name="fly_up_tooltip"> + Voler vers le haut (touche E) + </string> + <string name="fly_down_tooltip"> + Voler vers le bas (touche C) + </string> + <string name="jump_tooltip"> + Sauter (touche E) + </string> + <string name="crouch_tooltip"> + S'accroupir (touche C) + </string> + <string name="walk_title"> + Marcher + </string> + <string name="run_title"> + Courir + </string> + <string name="fly_title"> + Voler + </string> <panel name="panel_actions"> + <button label="" label_selected="" name="move up btn" tool_tip="Voler vers le haut (touche E)"/> <button label="" label_selected="" name="turn left btn" tool_tip="Tourner à gauche (appuyer sur la flèche de gauche ou sur A)"/> + <joystick_slide name="move left btn" tool_tip="Marcher vers la gauche (Maj+Flèche gauche ou touche A)"/> + <button label="" label_selected="" name="move down btn" tool_tip="Voler vers le bas (touche C)"/> <button label="" label_selected="" name="turn right btn" tool_tip="Tourner à droite (appuyer sur la flèche de droite ou sur D)"/> - <button label="" label_selected="" name="move up btn" tool_tip="Voler vers le haut, appuyer sur E"/> - <button label="" label_selected="" name="move down btn" tool_tip="Voler vers le bas, appuyer sur C"/> + <joystick_slide name="move right btn" tool_tip="Marcher vers la droite (Maj+Flèche droite ou touche D)"/> <joystick_turn name="forward btn" tool_tip="Marcher en avant (appuyer sur la flèche vers le haut ou W)"/> <joystick_turn name="backward btn" tool_tip="Marcher en arrière (appuyer sur la flèche vers le bas ou S)"/> </panel> @@ -30,6 +71,5 @@ <button label="" name="mode_walk_btn" tool_tip="Mode marche"/> <button label="" name="mode_run_btn" tool_tip="Mode course"/> <button label="" name="mode_fly_btn" tool_tip="Mode vol"/> - <button label="Atterrir" name="stop_fly_btn" tool_tip="Atterrir"/> </panel> </floater> diff --git a/indra/newview/skins/default/xui/fr/floater_nearby_chat.xml b/indra/newview/skins/default/xui/fr/floater_nearby_chat.xml index 72775169cb..a59253a746 100644 --- a/indra/newview/skins/default/xui/fr/floater_nearby_chat.xml +++ b/indra/newview/skins/default/xui/fr/floater_nearby_chat.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="nearby_chat" title="CHAT PRÈS DE VOUS"/> +<floater name="nearby_chat" title="CHAT PRÈS DE MOI"/> diff --git a/indra/newview/skins/default/xui/fr/floater_notification.xml b/indra/newview/skins/default/xui/fr/floater_notification.xml index 62727da007..fe4b5f9bd6 100644 --- a/indra/newview/skins/default/xui/fr/floater_notification.xml +++ b/indra/newview/skins/default/xui/fr/floater_notification.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="notification" title="CONSOLE DE NOTIFICATIONS"> <text_editor name="payload"> - Chargement.. + Chargement... </text_editor> <combo_box label="Réponse" name="response"/> </floater> diff --git a/indra/newview/skins/default/xui/fr/floater_outfit_save_as.xml b/indra/newview/skins/default/xui/fr/floater_outfit_save_as.xml index f5dfc8d6df..d77dfbdf82 100644 --- a/indra/newview/skins/default/xui/fr/floater_outfit_save_as.xml +++ b/indra/newview/skins/default/xui/fr/floater_outfit_save_as.xml @@ -1,11 +1,12 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="modal container"> +<floater name="modal container" title="Enregistrer la tenue"> <button label="Enregistrer" label_selected="Enregistrer" name="Save"/> <button label="Annuler" label_selected="Annuler" name="Cancel"/> <text name="Save item as:"> - Enregistrer la tenue sous : + Enregistrer ce que je porte +comme une nouvelle tenue : </text> <line_editor name="name ed"> - [DESC] + [DESC] (nouv.) </line_editor> </floater> diff --git a/indra/newview/skins/default/xui/fr/floater_outgoing_call.xml b/indra/newview/skins/default/xui/fr/floater_outgoing_call.xml index a6f0970502..089d710f17 100644 --- a/indra/newview/skins/default/xui/fr/floater_outgoing_call.xml +++ b/indra/newview/skins/default/xui/fr/floater_outgoing_call.xml @@ -25,10 +25,13 @@ Pas de réponse. Veuillez réessayer ultérieurement. </text> <text name="nearby"> - Vous avez été déconnecté(e) de [VOICE_CHANNEL_NAME]. Vous allez maintenant être reconnecté(e) au chat vocal près de vous. + Vous avez été déconnecté(e) de [VOICE_CHANNEL_NAME]. [RECONNECT_NEARBY] </text> - <text name="nearby_P2P"> - [VOICE_CHANNEL_NAME] a mis fin à l'appel. Vous allez maintenant être reconnecté(e) au chat vocal près de vous. + <text name="nearby_P2P_by_other"> + Votre appel a pris fin. [RECONNECT_NEARBY] + </text> + <text name="nearby_P2P_by_agent"> + Vous avez mis fin à l'appel. [RECONNECT_NEARBY] </text> <text name="leaving"> En train de quitter [CURRENT_CHAT]. diff --git a/indra/newview/skins/default/xui/fr/floater_pay_object.xml b/indra/newview/skins/default/xui/fr/floater_pay_object.xml index c96db77721..9cac739ab0 100644 --- a/indra/newview/skins/default/xui/fr/floater_pay_object.xml +++ b/indra/newview/skins/default/xui/fr/floater_pay_object.xml @@ -17,10 +17,10 @@ <text left="105" name="object_name_text"> ... </text> - <button label="1 L$" label_selected="1 L$" left="105" name="fastpay 1"/> - <button label="5 L$" label_selected="5 L$" left="190" name="fastpay 5"/> - <button label="10 L$" label_selected="10 L$" left="105" name="fastpay 10"/> - <button label="20 L$" label_selected="20 L$" left="190" name="fastpay 20"/> + <button label="1 L$" label_selected="1 L$" name="fastpay 1"/> + <button label="5 L$" label_selected="5 L$" name="fastpay 5"/> + <button label="10 L$" label_selected="10 L$" name="fastpay 10"/> + <button label="20 L$" label_selected="20 L$" name="fastpay 20"/> <text halign="left" left="5" name="amount text"> Ou choisissez un montant : </text> diff --git a/indra/newview/skins/default/xui/fr/floater_perm_prefs.xml b/indra/newview/skins/default/xui/fr/floater_perm_prefs.xml index 2be2ae7c88..36bec80561 100644 --- a/indra/newview/skins/default/xui/fr/floater_perm_prefs.xml +++ b/indra/newview/skins/default/xui/fr/floater_perm_prefs.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="perm prefs" title="PERMISSIONS DE CHARGEMENT PAR DÉFAUT"> +<floater name="perm prefs" title="DROITS DE CHARGEMENT PAR DÉFAUT"> <panel label="Droits" name="permissions"> <button label="?" label_selected="?" name="help"/> <check_box label="Partager avec le groupe" name="share_with_group"/> diff --git a/indra/newview/skins/default/xui/fr/floater_postcard.xml b/indra/newview/skins/default/xui/fr/floater_postcard.xml index 6a9a674fac..0f3a4541e2 100644 --- a/indra/newview/skins/default/xui/fr/floater_postcard.xml +++ b/indra/newview/skins/default/xui/fr/floater_postcard.xml @@ -3,20 +3,20 @@ <text name="to_label" width="135"> E-mail du destinataire : </text> - <line_editor left="143" name="to_form" width="127"/> + <line_editor left="143" name="to_form" width="130" left_delta="146"/> <text name="from_label"> Votre e-mail : </text> - <line_editor left="143" name="from_form" width="127"/> + <line_editor left="143" name="from_form" width="130" left_delta="146"/> <text name="name_label"> Votre nom : </text> - <line_editor left="143" name="name_form" width="127"/> + <line_editor left="143" name="name_form" width="130" left_delta="146"/> <text name="subject_label"> - Sujet : + Objet : </text> - <line_editor left="143" name="subject_form" width="127"/> - <line_editor label="Saisissez votre sujet ici." name="subject_form"/> + <line_editor left="143" name="subject_form" width="130" left_delta="146"/> + <line_editor label="Saisissez votre objet ici." name="subject_form"/> <text name="msg_label"> Message : </text> diff --git a/indra/newview/skins/default/xui/fr/floater_preferences.xml b/indra/newview/skins/default/xui/fr/floater_preferences.xml index 4db7ca304c..052e43388b 100644 --- a/indra/newview/skins/default/xui/fr/floater_preferences.xml +++ b/indra/newview/skins/default/xui/fr/floater_preferences.xml @@ -1,12 +1,12 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater min_width="330" name="Preferences" title="PRÉFÉRENCES" width="626"> +<floater name="Preferences" title="PRÉFÉRENCES"> <button label="OK" label_selected="OK" name="OK"/> <button label="Annuler" label_selected="Annuler" name="Cancel"/> - <tab_container name="pref core" tab_width="126" width="626"> + <tab_container name="pref core"> <panel label="Général" name="general"/> <panel label="Graphiques" name="display"/> <panel label="Confidentialité" name="im"/> - <panel label="Son" name="audio"/> + <panel label="Son et Média" name="audio"/> <panel label="Chat" name="chat"/> <panel label="Notifications" name="msgs"/> <panel label="Configuration" name="input"/> diff --git a/indra/newview/skins/default/xui/fr/floater_preview_animation.xml b/indra/newview/skins/default/xui/fr/floater_preview_animation.xml index 923d56801e..b14aecafbb 100644 --- a/indra/newview/skins/default/xui/fr/floater_preview_animation.xml +++ b/indra/newview/skins/default/xui/fr/floater_preview_animation.xml @@ -6,6 +6,6 @@ <text name="desc txt"> Description : </text> - <button label="Jouer dans le Monde" label_selected="Stop" left="20" name="Anim play btn" tool_tip="Lire cette animation de façon à ce que les autres puissent la voir" width="131"/> + <button label="Jouer dans Second Life" label_selected="Stop" left="20" name="Anim play btn" tool_tip="Lire cette animation de façon à ce que les autres puissent la voir" width="131"/> <button label="Jouer localement" label_selected="Stop" left="162" name="Anim audition btn" tool_tip="Lire cette animation de façon à ce que vous soyez la seule personne à pouvoir la voir" width="125"/> </floater> diff --git a/indra/newview/skins/default/xui/fr/floater_preview_gesture.xml b/indra/newview/skins/default/xui/fr/floater_preview_gesture.xml index 7133f8754c..1d164ac661 100644 --- a/indra/newview/skins/default/xui/fr/floater_preview_gesture.xml +++ b/indra/newview/skins/default/xui/fr/floater_preview_gesture.xml @@ -31,10 +31,10 @@ Description : </text> <text name="trigger_label"> - Déclencheur : + Déclench. : </text> <text name="replace_text" tool_tip="Remplacer les raccourcis avec ces mots. Par exemple, remplacer le mot-clé « salut » par « bonjour » fera dire « je venais dire bonjour » au lieu de « je venais dire salut » dans le chat, et déclenchera le geste."> - Remplacer par : + Rempl. par : </text> <line_editor left="310" name="replace_editor" tool_tip="Remplacer les raccourcis avec ces mots. Par exemple, remplacer le mot-clé « salut » par « bonjour » fera dire « je venais dire bonjour » au lieu de « je venais dire salut » dans le chat, et déclenchera le geste" width="120"/> <text name="key_label"> @@ -50,20 +50,20 @@ <text name="steps_label"> Étapes : </text> - <button label="Vers le haut" name="up_btn"/> - <button label="Vers le bas" name="down_btn"/> + <button label="Haut" name="up_btn"/> + <button label="Bas" name="down_btn"/> <button label="Supprimer" name="delete_btn"/> <radio_group name="animation_trigger_type"> <radio_item label="Lancer" name="start"/> <radio_item label="Arrêter" name="stop"/> </radio_group> <check_box label="jusqu'à la fin des animations" name="wait_anim_check"/> - <check_box label="temps en secondes" name="wait_time_check"/> + <check_box label="temps (sec)" name="wait_time_check"/> <line_editor left_delta="130" name="wait_time_editor"/> <text name="help_label"> Toutes les étapes ont lieu en même temps si vous n'ajoutez pas d'étapes d'attente. </text> - <check_box label="Actifs" name="active_check" tool_tip="Les gestes actifs peuvent être déclenchés en saisissant leur raccourci dans le chat ou en appuyant sur les raccourcis. Les gestes deviennent généralement inactifs lorsqu'il y a un conflit entre les raccourcis."/> + <check_box label="Actif" name="active_check" tool_tip="Les gestes actifs peuvent être déclenchés en saisissant leur raccourci dans le chat ou en appuyant sur les raccourcis. Les gestes deviennent généralement inactifs lorsqu'il y a un conflit entre les raccourcis."/> <button label="Prévisualiser" name="preview_btn" width="86"/> <button label="Enregistrer" left_delta="96" name="save_btn" width="86"/> </floater> diff --git a/indra/newview/skins/default/xui/fr/floater_preview_gesture_shortcut.xml b/indra/newview/skins/default/xui/fr/floater_preview_gesture_shortcut.xml index 06caf0635d..d866c32882 100644 --- a/indra/newview/skins/default/xui/fr/floater_preview_gesture_shortcut.xml +++ b/indra/newview/skins/default/xui/fr/floater_preview_gesture_shortcut.xml @@ -6,8 +6,8 @@ <text name="key_label"> Clavier : </text> - <combo_box label="Aucun" name="modifier_combo"/> - <combo_box label="Aucun" name="key_combo"/> + <combo_box label="Aucun" name="modifier_combo" width="62"/> + <combo_box label="Aucun" name="key_combo" width="62"/> <text name="replace_text" tool_tip="Remplacez le ou les mots-clés par ces mots. Par exemple, si vous remplacez le mot-clé " bonjour " par " salut ", le chat " Je voulais te dire bonjour " devient " Je voulais te dire salut " et le geste correspondant s'affiche."> Remplacer : </text> diff --git a/indra/newview/skins/default/xui/fr/floater_preview_notecard.xml b/indra/newview/skins/default/xui/fr/floater_preview_notecard.xml index d6ec915fd1..5646ad45eb 100644 --- a/indra/newview/skins/default/xui/fr/floater_preview_notecard.xml +++ b/indra/newview/skins/default/xui/fr/floater_preview_notecard.xml @@ -9,9 +9,6 @@ <floater.string name="Title"> Note : [NAME] </floater.string> - <floater.string label="Enregistrer" label_selected="Enregistrer" name="Save"> - Enregistrer - </floater.string> <text name="desc txt"> Description : </text> @@ -19,4 +16,5 @@ Chargement... </text_editor> <button label="Enregistrer" label_selected="Enregistrer" name="Save"/> + <button label="Supprimer" label_selected="Supprimer" name="Delete"/> </floater> diff --git a/indra/newview/skins/default/xui/fr/floater_preview_sound.xml b/indra/newview/skins/default/xui/fr/floater_preview_sound.xml index 67d93e9e92..a215f92df1 100644 --- a/indra/newview/skins/default/xui/fr/floater_preview_sound.xml +++ b/indra/newview/skins/default/xui/fr/floater_preview_sound.xml @@ -6,6 +6,6 @@ <text name="desc txt"> Description : </text> - <button label="Jouer dans le Monde" label_selected="Jouer dans le Monde" left_delta="-142" name="Sound play btn" tool_tip="Lire ce son de façon à ce que les autres puissent l'entendre" width="131"/> + <button label="Jouer dans Second Life" label_selected="Jouer dans Second Life" left_delta="-142" name="Sound play btn" tool_tip="Lire ce son de façon à ce que les autres puissent l'entendre" width="131"/> <button label="Jouer localement" label_selected="Jouer localement" left="162" name="Sound audition btn" tool_tip="Lire ce son de façon à ce que vous soyez la seule personne à pouvoir l'entendre" width="125"/> </floater> diff --git a/indra/newview/skins/default/xui/fr/floater_preview_texture.xml b/indra/newview/skins/default/xui/fr/floater_preview_texture.xml index 2ff14b4a68..9fc9d14026 100644 --- a/indra/newview/skins/default/xui/fr/floater_preview_texture.xml +++ b/indra/newview/skins/default/xui/fr/floater_preview_texture.xml @@ -19,7 +19,7 @@ <combo_item name="Unconstrained"> Sans contraintes </combo_item> - <combo_item name="1:1" tool_tip="Logo du groupe ou profil dans le monde physique"> + <combo_item name="1:1" tool_tip="Logo du groupe ou profil dans la vie réelle"> 1:1 </combo_item> <combo_item name="4:3" tool_tip="Profil [SECOND_LIFE]"> @@ -28,7 +28,7 @@ <combo_item name="10:7" tool_tip="Petites annonces, repères"> 10:7 </combo_item> - <combo_item name="3:2" tool_tip="À propos des terrains"> + <combo_item name="3:2" tool_tip="À propos du terrain"> 3:2 </combo_item> <combo_item name="16:10"> @@ -42,6 +42,6 @@ </combo_item> </combo_box> <button label="OK" name="Keep"/> - <button label="Annuler" name="Discard"/> + <button label="Jeter" name="Discard"/> <button label="Enregistrer sous" name="save_tex_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/fr/floater_publish_classified.xml b/indra/newview/skins/default/xui/fr/floater_publish_classified.xml new file mode 100644 index 0000000000..39a2b086f1 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/floater_publish_classified.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="publish_classified" title="Publication de l'annonce"> + <text name="explanation_text"> + Votre petite annonce sera visible pendant une semaine à partir de sa date de publication. + +Rappel : les frais liés aux annonces passées ne sont pas remboursables. + </text> + <spinner label="Coût de l'annonce :" name="price_for_listing" tool_tip="Coût de l’annonce." value="50"/> + <text name="l$_text" value="L$"/> + <text name="more_info_text"> + En savoir plus (lien vers l'aide sur les annonces) + </text> + <button label="Publier" name="publish_btn"/> + <button label="Annuler" name="cancel_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/fr/floater_report_abuse.xml b/indra/newview/skins/default/xui/fr/floater_report_abuse.xml index b96e15e4bb..78c35dc303 100644 --- a/indra/newview/skins/default/xui/fr/floater_report_abuse.xml +++ b/indra/newview/skins/default/xui/fr/floater_report_abuse.xml @@ -5,7 +5,7 @@ </floater.string> <check_box label="Utiliser cette capture d'écran" name="screen_check"/> <text name="reporter_title" width="60"> - Déposant : + Témoin : </text> <text name="reporter_field"> Loremipsum Dolorsitamut Longnamez @@ -29,13 +29,13 @@ <text name="object_name_label"> Objet : </text> - <text left_delta="70" name="object_name" width="105"> + <text left_pad="26" name="object_name" width="105"> Consetetur Sadipscing </text> - <text name="owner_name_label" width="66"> + <text name="owner_name_label" width="100"> Propriétaire : </text> - <text left_delta="70" name="owner_name" width="105"> + <text left_delta="120" name="owner_name" width="105"> Hendrerit Vulputate Kamawashi Longname </text> <combo_box name="category_combo" tool_tip="Choisissez la catégorie qui décrit le mieux ce rapport"> diff --git a/indra/newview/skins/default/xui/fr/floater_script_preview.xml b/indra/newview/skins/default/xui/fr/floater_script_preview.xml index 7b8c5399b9..7b6bc73677 100644 --- a/indra/newview/skins/default/xui/fr/floater_script_preview.xml +++ b/indra/newview/skins/default/xui/fr/floater_script_preview.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="preview lsl text" title="SCRIPT : SCRIPT DE ROTATION"> <floater.string name="Title"> - Script : [NAME] + SCRIPT : [NAME] </floater.string> <text name="desc txt"> Description : diff --git a/indra/newview/skins/default/xui/fr/floater_sell_land.xml b/indra/newview/skins/default/xui/fr/floater_sell_land.xml index e950a64c4c..d79726e8e2 100644 --- a/indra/newview/skins/default/xui/fr/floater_sell_land.xml +++ b/indra/newview/skins/default/xui/fr/floater_sell_land.xml @@ -5,13 +5,13 @@ <text name="info_parcel_label"> Parcelle : </text> - <text name="info_parcel"> + <text name="info_parcel" left="70"> NOM DE LA PARCELLE </text> <text name="info_size_label"> Taille : </text> - <text name="info_size"> + <text name="info_size" left="70"> [AREA] m² </text> <text bottom_delta="-60" name="info_action"> diff --git a/indra/newview/skins/default/xui/fr/floater_settings_debug.xml b/indra/newview/skins/default/xui/fr/floater_settings_debug.xml index aae4729347..995837e9ee 100644 --- a/indra/newview/skins/default/xui/fr/floater_settings_debug.xml +++ b/indra/newview/skins/default/xui/fr/floater_settings_debug.xml @@ -4,7 +4,7 @@ <combo_box.item label="VRAI" name="TRUE"/> <combo_box.item label="FAUX" name="FALSE"/> </combo_box> - <color_swatch label="Couleur" name="val_color_swatch"/> + <color_swatch label="Couleur" name="val_color_swatch" width="50"/> <spinner label="x" name="val_spinner_1"/> <spinner label="x" name="val_spinner_2"/> <spinner label="x" name="val_spinner_3"/> diff --git a/indra/newview/skins/default/xui/fr/floater_snapshot.xml b/indra/newview/skins/default/xui/fr/floater_snapshot.xml index 486eafef01..381a513bda 100644 --- a/indra/newview/skins/default/xui/fr/floater_snapshot.xml +++ b/indra/newview/skins/default/xui/fr/floater_snapshot.xml @@ -1,79 +1,16 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Snapshot" title="APERÇU DE LA PHOTO" width="247"> - <text name="type_label"> - Destination de la photo - </text> - <radio_group label="Type de photo" name="snapshot_type_radio" width="228"> - <radio_item label="E-mail" name="postcard"/> - <radio_item label="Mon inventaire ([AMOUNT] L$)" name="texture"/> - <radio_item label="Enregistrer sur mon ordinateur" name="local"/> - </radio_group> - <button label="Plus" name="more_btn" tool_tip="Options avancées"/> - <button label="Moins" name="less_btn" tool_tip="Options avancées"/> - <text name="type_label2"> - Taille - </text> - <text name="format_label"> - Format - </text> - <combo_box label="Résolution" name="postcard_size_combo"> - <combo_box.item label="640 x 480" name="640x480"/> - <combo_box.item label="800 x 600" name="800x600"/> - <combo_box.item label="1024 x 768" name="1024x768"/> - <combo_box.item label="Fenêtre actuelle" name="CurrentWindow"/> - <combo_box.item label="Personnaliser" name="Custom"/> - </combo_box> - <combo_box label="Résolution" name="texture_size_combo"> - <combo_box.item label="Fenêtre actuelle" name="CurrentWindow"/> - <combo_box.item label="Petite (128 x 128)" name="Small(128x128)"/> - <combo_box.item label="Moyenne (256 x 256)" name="Medium(256x256)"/> - <combo_box.item label="Grande (512 x 512)" name="Large(512x512)"/> - <combo_box.item label="Personnaliser" name="Custom"/> - </combo_box> - <combo_box label="Résolution" name="local_size_combo"> - <combo_box.item label="Fenêtre actuelle" name="CurrentWindow"/> - <combo_box.item label="320 x 240" name="320x240"/> - <combo_box.item label="640 x 480" name="640x480"/> - <combo_box.item label="800 x 600" name="800x600"/> - <combo_box.item label="1024 x 768" name="1024x768"/> - <combo_box.item label="1280 x 1024" name="1280x1024"/> - <combo_box.item label="1600 x 1200" name="1600x1200"/> - <combo_box.item label="Personnaliser" name="Custom"/> - </combo_box> - <combo_box label="Format" name="local_format_combo"> - <combo_box.item label="PNG" name="PNG"/> - <combo_box.item label="JPEG" name="JPEG"/> - <combo_box.item label="BMP" name="BMP"/> - </combo_box> - <spinner label="Largeur" label_width="41" name="snapshot_width" width="101"/> - <spinner label="Hauteur" label_width="41" left="121" name="snapshot_height" width="101"/> - <slider label="Qualité de l'image" name="image_quality_slider"/> - <text name="layer_type_label"> - Capturer : - </text> - <combo_box label="Couches de l'image" name="layer_types"> - <combo_box.item label="Couleurs" name="Colors"/> - <combo_box.item label="Profondeur" name="Depth"/> - <combo_box.item label="Matte des objets" name="ObjectMattes"/> - </combo_box> - <text name="file_size_label"> - [SIZE] Ko - </text> - <check_box label="Interface" name="ui_check"/> - <check_box label="HUD" name="hud_check"/> - <check_box label="Garder ouvert après enregistrement" name="keep_open_check"/> - <check_box label="Contraindre les proportions" name="keep_aspect_check"/> - <check_box label="Arrêt sur image (plein écran)" name="freeze_frame_check"/> - <button label="Rafraîchir" name="new_snapshot_btn"/> - <check_box label="Rafraîchissement automatique" name="auto_snapshot_check"/> - <button label="Enregistrer ([AMOUNT] L$)" name="upload_btn" width="118"/> - <button label="Envoyer" name="send_btn" width="118"/> - <flyout_button label="Enregistrer" name="save_btn" tool_tip="Enregistrer l'image dans un fichier" width="118"> - <flyout_button.item label="Enregistrer" name="save_item"/> - <flyout_button.item label="Enregistrer sous..." name="saveas_item"/> - </flyout_button> - <button label="Annuler" left="133" name="discard_btn" width="72"/> - <string name="unknown"> +<floater name="Snapshot" title="Photo" width="247"> + <floater.string name="unknown"> inconnu - </string> + </floater.string> + <button label="Rafraîchir" name="new_snapshot_btn"/> + <line_editor label="Description" name="description"/> + <button label="Partager" name="share"/> + <button label="Partage Web" name="share_to_web"/> + <button label="Dans mon inventaire" name="save_to_inventory"/> + <button label="Enregistrer" name="save"/> + <button label="Envoi par e-mail" name="share_to_email"/> + <button label="Sur mon ordinateur" name="save_to_computer"/> + <button label="Image de profil" name="set_profile_pic"/> + <button label="Précédent" name="cancel"/> </floater> diff --git a/indra/newview/skins/default/xui/fr/floater_sys_well.xml b/indra/newview/skins/default/xui/fr/floater_sys_well.xml index 9b0253065c..dbdd32974c 100644 --- a/indra/newview/skins/default/xui/fr/floater_sys_well.xml +++ b/indra/newview/skins/default/xui/fr/floater_sys_well.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="notification_chiclet" title="NOTIFICATIONS"> +<floater name="sys_well_window" title="NOTIFICATIONS"> <string name="title_im_well_window"> - SESSIONS IM + CONVERSATIONS </string> <string name="title_notification_well_window"> NOTIFICATIONS diff --git a/indra/newview/skins/default/xui/fr/floater_telehub.xml b/indra/newview/skins/default/xui/fr/floater_telehub.xml index a50cfc25c1..c529ca2736 100644 --- a/indra/newview/skins/default/xui/fr/floater_telehub.xml +++ b/indra/newview/skins/default/xui/fr/floater_telehub.xml @@ -10,8 +10,7 @@ Pour supprimer, cliquez sur Déconnecter. </text> <text bottom_delta="-18" height="38" name="help_text_not_connected"> - Sélectionner l'objet et cliquez sur Connecter -le téléhub. + Sélectionner l'objet et cliquez sur Connecter le téléhub. </text> <button label="Connecter le téléhub" name="connect_btn" width="122"/> <button label="Déconnecter" left="142" name="disconnect_btn" width="98"/> @@ -20,7 +19,7 @@ le téléhub. </text> <button label="Ajouter point" name="add_spawn_point_btn"/> <button label="Supprimer point" name="remove_spawn_point_btn"/> - <text name="spawn_point_help"> + <text name="spawn_point_help" height="100"> Sélectionnez l'objet et cliquez sur Ajouter pour indiquer la position. Vous pourrez ensuite déplacer ou supprimer l'objet. Les positions sont relatives au centre du téléhub. diff --git a/indra/newview/skins/default/xui/fr/floater_tools.xml b/indra/newview/skins/default/xui/fr/floater_tools.xml index 3488ae15d1..26d097d549 100644 --- a/indra/newview/skins/default/xui/fr/floater_tools.xml +++ b/indra/newview/skins/default/xui/fr/floater_tools.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="toolbox floater" short_title="OUTILS DE CONSTRUCTION" title=""> +<floater name="toolbox floater" short_title="OUTILS POUR LA CONSTRUCTION" title=""> <floater.string name="status_rotate"> Pour faire tourner l'objet, faîtes glisser les bandes de couleur. </floater.string> @@ -37,7 +37,7 @@ Référence </floater.string> <floater.string name="grid_attachment_text"> - Pièce-jointe + Pièce jointe </floater.string> <button label="" label_selected="" name="button focus" tool_tip="Mise au point"/> <button label="" label_selected="" name="button move" tool_tip="Déplacer"/> @@ -61,13 +61,16 @@ <radio_item label="Bouger" name="radio position"/> <radio_item label="Pivoter (Ctrl)" name="radio rotate"/> <radio_item label="Étirer (Ctrl+Maj)" name="radio stretch"/> - <radio_item label="Sélectionner une face" name="radio select face"/> + <radio_item label="Choisir une face" name="radio select face"/> </radio_group> <check_box label="Modification liée" name="checkbox edit linked parts"/> <text name="RenderingCost" tool_tip="Affiche le coût du rendu calculé pour cet objet"> þ : [COUNT] </text> - <check_box label="Étirer les deux côtés" name="checkbox uniform"/> + <check_box label="" name="checkbox uniform"/> + <text label="Étirer les deux côtés" name="checkbox uniform label"> + Étirer les deux côtés + </text> <check_box initial_value="true" label="Étirer les textures" name="checkbox stretch textures"/> <check_box initial_value="true" label="Fixer sur la grille" name="checkbox snap to grid"/> <combo_box name="combobox grid mode" tool_tip="Choisissez le type d'axe de grille pour le positionnement de l'objet"> @@ -96,7 +99,7 @@ <check_box initial_value="true" label="Centrer" name="checkbox copy centers"/> <check_box label="Pivoter" name="checkbox copy rotates"/> <radio_group name="land_radio_group"> - <radio_item label="Sélectionner le terrain" name="radio select land"/> + <radio_item label="Choisir le terrain" name="radio select land"/> <radio_item label="Aplatir" name="radio flatten"/> <radio_item label="Élever" name="radio raise"/> <radio_item label="Abaisser" name="radio lower"/> @@ -179,9 +182,9 @@ <text name="Group:"> Groupe : </text> - <button label="Définir..." label_selected="Définir..." name="button set group" tool_tip="Choisissez un groupe pour partager les permissions de cet objet"/> + <button label="Définir..." label_selected="Définir..." name="button set group" tool_tip="Choisissez un groupe pour partager les droits de cet objet"/> <name_box initial_value="Chargement..." name="Group Name Proxy"/> - <button label="Céder" label_selected="Céder" name="button deed" tool_tip="En cédant un objet, vous donnez aussi les permissions au prochain propriétaire. Seul un officier peut céder les objets d'un groupe."/> + <button label="Céder" label_selected="Céder" name="button deed" tool_tip="En cédant un objet, vous donnez aussi les droits au prochain propriétaire. Seul un officier peut céder les objets d'un groupe."/> <check_box label="Partager" name="checkbox share with group" tool_tip="Autorisez tous les membres du groupe choisi à utiliser et à partager vos droits pour cet objet. Pour activer les restrictions de rôles, vous devez d'abord cliquer sur Transférer."/> <text name="label click action"> Cliquer pour : @@ -280,7 +283,7 @@ <combo_box.item label="Caoutchouc" name="Rubber"/> </combo_box> <text name="text cut"> - Découpe du tracé (début/fin) + Découpe du tracé (déb./fin) </text> <spinner label="D" name="cut begin"/> <spinner label="F" name="cut end"/> @@ -339,8 +342,8 @@ <text name="text revolutions"> Révolutions </text> - <texture_picker label="Texture du sculptie" name="sculpt texture control" tool_tip="Cliquez pour sélectionner une image"/> - <check_box label="Mirroir" name="sculpt mirror control" tool_tip="Inverse le sculptie le long de l'axe X"/> + <texture_picker label="Texture de la sculptie" name="sculpt texture control" tool_tip="Cliquez pour sélectionner une image"/> + <check_box label="Mirroir" name="sculpt mirror control" tool_tip="Inverse la sculptie le long de l'axe X"/> <check_box label="A l'envers" name="sculpt invert control" tool_tip="Inverse les normales des sculpties, qui apparaissent alors à l'envers"/> <text name="label sculpt type"> Type de raccord @@ -355,7 +358,7 @@ </panel> <panel label="Attributs" name="Features"> <text name="select_single"> - Sélectionnez un prim pour modifier les attributs. + Choisir une prim pour changer les attributs. </text> <text name="edit_object"> Modifier les attributs de l'objet : @@ -441,9 +444,9 @@ <check_box label="Inverser" name="checkbox flip s"/> <spinner label="Vertical (V)" name="TexScaleV"/> <check_box label="Inverser" name="checkbox flip t"/> - <spinner label="RotationËš" left="122" name="TexRot" width="58"/> - <spinner label="Répétitions / Mètre" left="122" name="rptctrl" width="58"/> - <button label="Appliquer" label_selected="Appliquer" left_delta="68" name="button apply" width="75"/> + <spinner label="RotationËš" name="TexRot"/> + <spinner label="Répétitions / Mètre" name="rptctrl"/> + <button label="Appliquer" label_selected="Appliquer" name="button apply"/> <text name="tex offset"> Décalage de la texture </text> @@ -474,7 +477,7 @@ <text name="label_area"> Surface : [AREA] m² </text> - <button label="À propos des terrains" label_selected="À propos des terrains" name="button about land" width="142"/> + <button label="À propos du terrain" label_selected="À propos du terrain" name="button about land" width="142"/> <check_box label="Afficher les propriétaires" name="checkbox show owners" tool_tip="Colorier les parcelles en fonction du type de leur propriétaire : Vert = votre terrain Turquoise = le terrain de votre groupe Rouge = appartenant à d'autres Jaune = en vente Mauve = aux enchères Gris = public"/> <text name="label_parcel_modify"> Modifier la parcelle diff --git a/indra/newview/skins/default/xui/fr/floater_tos.xml b/indra/newview/skins/default/xui/fr/floater_tos.xml index 2c8e8bc5bc..8a2a1e1d25 100644 --- a/indra/newview/skins/default/xui/fr/floater_tos.xml +++ b/indra/newview/skins/default/xui/fr/floater_tos.xml @@ -1,22 +1,15 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="modal container" title=" "> + <floater.string name="real_url"> + http://secondlife.com/app/tos/ + </floater.string> + <floater.string name="loading_url"> + data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Loading %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E + </floater.string> <button label="Continuer" label_selected="Continuer" name="Continue"/> <button label="Annuler" label_selected="Annuler" name="Cancel"/> - <radio_group name="tos_agreement"> - <radio_item label="Je n'accepte pas les Conditions Générales d'Utilisation" name="radio_disagree"/> - <radio_item label="J'accepte les Conditions Générales d'Utilisation" name="radio_agree"/> - </radio_group> - <text name="tos_title"> - Acceptation des Conditions Générales d'Utilisation - </text> - <check_box label="J'accepte les Conditions d'utilisation" name="agree_chk"/> + <check_box label="J'accepte les Conditions d'utilisation et le Règlement sur le respect de la vie privée" name="agree_chk"/> <text name="tos_heading"> - Veuillez lire attentivement les Conditions d'utilisation suivantes. Pour vous connecter à [SECOND_LIFE], vous devez accepter l'accord. - </text> - <text_editor name="tos_text"> - TOS_TEXT - </text_editor> - <text name="real_url"> - http://secondlife.com/app/tos/ + Veuillez lire attentivement les Conditions d'utilisation et le Règlement sur le respect de la vie privée suivants. Vous devez les accepter pour pouvoir vous connecter à [SECOND_LIFE]. </text> </floater> diff --git a/indra/newview/skins/default/xui/fr/floater_url_entry.xml b/indra/newview/skins/default/xui/fr/floater_url_entry.xml index 6a90731691..4b2be14569 100644 --- a/indra/newview/skins/default/xui/fr/floater_url_entry.xml +++ b/indra/newview/skins/default/xui/fr/floater_url_entry.xml @@ -3,11 +3,11 @@ <text name="media_label"> URL du média : </text> - <combo_box left="100" name="media_entry" width="360" /> - <button label="OK" name="ok_btn" /> + <combo_box name="media_entry"/> + <button label="OK" name="ok_btn" width="30" /> <button label="Annuler" name="cancel_btn" /> - <button label="Effacer" name="clear_btn" /> - <text name="loading_label"> + <button label="Effacer" name="clear_btn" left_pad="94"/> + <text name="loading_label" left="120"> Chargement... </text> </floater> diff --git a/indra/newview/skins/default/xui/fr/floater_voice_controls.xml b/indra/newview/skins/default/xui/fr/floater_voice_controls.xml index 54ba2ad3e5..1a7bc228fa 100644 --- a/indra/newview/skins/default/xui/fr/floater_voice_controls.xml +++ b/indra/newview/skins/default/xui/fr/floater_voice_controls.xml @@ -16,6 +16,9 @@ Il n'y a personne près de vous avec le chat vocal activé </string> <layout_stack name="my_call_stack"> + <layout_panel name="my_panel"> + <text name="user_text" value="Mon avatar :"/> + </layout_panel> <layout_panel name="leave_call_btn_panel"> <button label="Quitter l'appel" name="leave_call_btn"/> </layout_panel> diff --git a/indra/newview/skins/default/xui/fr/floater_water.xml b/indra/newview/skins/default/xui/fr/floater_water.xml index 287f51d9f7..96723b0fe6 100644 --- a/indra/newview/skins/default/xui/fr/floater_water.xml +++ b/indra/newview/skins/default/xui/fr/floater_water.xml @@ -1,19 +1,18 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Water Floater" title="ÉDITEUR D'EAU AVANCÉE"> +<floater name="Water Floater" title="ÉDITEUR D'EAU AVANCÉ"> <floater.string name="WLDefaultWaterNames"> Default:Glassy:Pond:Murky:Second Plague:SNAKE!!!:Valdez </floater.string> - <text name="KeyFramePresetsText"> - Préréglages eau : + <text name="KeyFramePresetsText" width="120"> + Préréglages : </text> <button label="Nouveau" label_selected="Nouveau" name="WaterNewPreset"/> <button label="Enregistrer" label_selected="Enregistrer" left_delta="75" name="WaterSavePreset" width="75"/> <button label="Supprimer" label_selected="Supprimer" left_delta="80" name="WaterDeletePreset"/> <tab_container name="Water Tabs"> - <panel label="Paramètres" name="Settings"> + <panel label="PARAMÈTRES" name="Settings"> <text name="BHText"> - Couleur du brouillard -dans l'eau + Couleur du brouillard dans l'eau </text> <color_swatch left="75" name="WaterFogColor" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/> <text name="WaterFogDensText"> @@ -35,7 +34,7 @@ dans l'eau Décalage Fresnel </text> <text name="DensMultText"> - Réfraction au dessus + Réfraction au-dessus </text> <text name="WaterScaleBelowText"> Réfraction en dessous @@ -44,7 +43,7 @@ dans l'eau Multiplicateur de flou </text> </panel> - <panel label="Image" name="Waves"> + <panel label="IMAGE" name="Waves"> <text name="BHText"> Direction grande vague </text> diff --git a/indra/newview/skins/default/xui/fr/floater_wearable_save_as.xml b/indra/newview/skins/default/xui/fr/floater_wearable_save_as.xml index af6274d4e2..5dda347fcf 100644 --- a/indra/newview/skins/default/xui/fr/floater_wearable_save_as.xml +++ b/indra/newview/skins/default/xui/fr/floater_wearable_save_as.xml @@ -1,9 +1,9 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="modal container"> - <button label="Enregistrer" label_selected="Enregistrer" name="Save" /> - <button label="Annuler" label_selected="Annuler" name="Cancel" /> + <button label="Enregistrer" label_selected="Enregistrer" name="Save"/> + <button label="Annuler" label_selected="Annuler" name="Cancel"/> <text name="Save item as:"> - Enregistrer l'objet sous : + Enregistrer l'objet dans mon inventaire comme : </text> <line_editor name="name ed"> Nouveau [DESC] diff --git a/indra/newview/skins/default/xui/fr/floater_windlight_options.xml b/indra/newview/skins/default/xui/fr/floater_windlight_options.xml index e28de71625..74f1697449 100644 --- a/indra/newview/skins/default/xui/fr/floater_windlight_options.xml +++ b/indra/newview/skins/default/xui/fr/floater_windlight_options.xml @@ -1,14 +1,14 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="WindLight floater" title="ÉDITEUR DE CIEL AVANCÉ" width="706"> <text name="KeyFramePresetsText"> - Préréglages ciel : + Préréglages : </text> <button label="Nouveau" label_selected="Nouveau" name="WLNewPreset"/> <button label="Enregistrer" label_selected="Enregistrer" left_delta="75" name="WLSavePreset" width="75"/> <button label="Supprimer" label_selected="Supprimer" left_delta="80" name="WLDeletePreset"/> - <button label="Éditeur du cycle du jour" label_selected="Éditeur du cycle du jour" left_delta="95" name="WLDayCycleMenuButton" width="150"/> + <button label="Éditeur du cycle du jour" label_selected="Éditeur du cycle du jour" left_delta="95" left_pad="20" name="WLDayCycleMenuButton" width="150"/> <tab_container name="WindLight Tabs" width="706"> - <panel label="Atmosphère" name="Atmosphere"> + <panel label="ATMOSPHÈRE" name="Atmosphere"> <text name="BHText"> Bleu de l'horizon </text> @@ -62,7 +62,7 @@ </text> <button label="?" name="WLMaxAltitudeHelp"/> </panel> - <panel label="Éclairage" name="Lighting"> + <panel label="LUMIÈRE" name="Lighting"> <text name="SLCText"> Couleur soleil/lune </text> @@ -118,7 +118,7 @@ </text> <button label="?" name="WLStarBrightnessHelp"/> </panel> - <panel label="Nuages" name="Clouds"> + <panel label="NUAGES" name="Clouds"> <text name="WLCloudColorText"> Couleur des nuages </text> diff --git a/indra/newview/skins/default/xui/fr/floater_world_map.xml b/indra/newview/skins/default/xui/fr/floater_world_map.xml index 3ac3580d4b..4d500857ea 100644 --- a/indra/newview/skins/default/xui/fr/floater_world_map.xml +++ b/indra/newview/skins/default/xui/fr/floater_world_map.xml @@ -1,90 +1,70 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="worldmap" title="CARTE DU MONDE"> - <panel name="objects_mapview" width="542"/> <panel name="layout_panel_1"> <text name="events_label"> Légende </text> </panel> - <panel> - <button label="Afficher mon emplacement" label_selected="Afficher mon emplacement" name="Show My Location" tool_tip="Centrer la carte sur l'emplacement de mon avatar" width="165"/> + <panel name="layout_panel_2"> + <button name="Show My Location" tool_tip="Centrer la carte sur l’emplacement de mon avatar"/> <text name="me_label"> Moi </text> - <check_box label="Résident" name="people_chk"/> - <icon left="-262" name="person"/> <text name="person_label"> Résident </text> - <check_box label="Infohub" name="infohub_chk"/> - <icon left="-266" name="infohub"/> <text name="infohub_label"> Infohub </text> - <check_box label="Terrain à vendre" name="land_for_sale_chk"/> - <icon left="-266" name="landforsale"/> <text name="land_sale_label"> Vente de terrains </text> - <icon left="-270" name="square2"/> <text name="by_owner_label"> - par le propriétaire + propriétaire </text> <text name="auction_label"> enchères </text> - <button label="Aller chez moi" label_selected="Aller chez moi" left="-120" name="Go Home" tool_tip="Me téléporter jusqu'à mon domicile" width="108"/> + <button name="Go Home" tool_tip="Me téléporter jusqu’à mon domicile"/> <text name="Home_label"> Domicile </text> - <text left="-144" name="events_label"> + <text name="events_label"> Événements : </text> - <check_box label="PG" name="event_chk"/> - <icon left="-132" name="event"/> <text name="pg_label"> Général </text> - <check_box initial_value="true" label="Mature" name="event_mature_chk"/> - <icon left="-132" name="events_mature_icon"/> + <check_box initial_value="true" name="event_mature_chk"/> <text name="mature_label"> Modéré </text> - <check_box label="Adult" name="event_adult_chk"/> - <icon left="-132" name="events_adult_icon"/> <text name="adult_label"> Adulte </text> </panel> - <panel> + <panel name="layout_panel_3"> <text name="find_on_map_label"> Situer sur la carte </text> </panel> - <panel> - <combo_box label="Amis connectés" name="friend combo" tool_tip="Afficher les amis sur la carte" width="232"> + <panel name="layout_panel_4"> + <combo_box label="Amis connectés" name="friend combo" tool_tip="Afficher les amis sur la carte"> <combo_box.item label="Mes amis connectés" name="item1"/> </combo_box> - <icon left="-270" name="landmark_icon"/> - <combo_box label="Mes repères" name="landmark combo" tool_tip="Repère à afficher sur la carte" width="232"> + <combo_box label="Mes repères" name="landmark combo" tool_tip="Repère à afficher sur la carte"> <combo_box.item label="Mes repères" name="item1"/> </combo_box> - <search_editor label="Régions par nom" name="location" tool_tip="Saisissez le nom d'une région" width="155"/> - <button label="Trouver" label_selected=">" left_delta="160" name="DoSearch" tool_tip="Recherchez sur la carte" width="75"/> - <scroll_list left="-270" name="search_results" width="252"> - <scroll_list.columns label="" name="icon"/> - <scroll_list.columns label="" name="sim_name"/> - </scroll_list> - <button label="Téléporter" label_selected="Téléporter" left="-270" name="Teleport" tool_tip="Téléporter à l'endroit sélectionné"/> - <button label="Copier la SLurl" left="-270" name="copy_slurl" tool_tip="Copie l'emplacement actuel sous la forme d'une SLurl à utiliser sur le Web."/> - <button label="Afficher la sélection" label_selected="Afficher la destination" name="Show Destination" tool_tip="Centrer la carte sur l'endroit sélectionné" width="165"/> + <search_editor label="Régions par nom" name="location" tool_tip="Tapez le nom d'une région"/> + <button label="Trouver" name="DoSearch" tool_tip="Rechercher une région"/> + <button name="Clear" tool_tip="Effacer les lignes de suivi et réinitialiser la carte"/> + <button label="Téléporter" name="Teleport" tool_tip="Me téléporter à l'emplacement sélectionné"/> + <button label="Copier la SLurl" name="copy_slurl" tool_tip="Copie l’emplacement actuel sous la forme d’une SLurl à utiliser sur le Web."/> + <button label="Afficher la sélection" name="Show Destination" tool_tip="Centrer la carte sur l'emplacement sélectionné"/> </panel> - <panel> + <panel name="layout_panel_5"> <text name="zoom_label"> Zoomer </text> </panel> - <panel> - <slider label="Zoom" left="-270" name="zoom slider"/> - </panel> </floater> diff --git a/indra/newview/skins/default/xui/fr/inspect_avatar.xml b/indra/newview/skins/default/xui/fr/inspect_avatar.xml index be23369dc7..381a52ed43 100644 --- a/indra/newview/skins/default/xui/fr/inspect_avatar.xml +++ b/indra/newview/skins/default/xui/fr/inspect_avatar.xml @@ -18,7 +18,7 @@ <slider name="volume_slider" tool_tip="Volume de la voix" value="0.5"/> <button label="Devenir amis" name="add_friend_btn"/> <button label="IM" name="im_btn"/> - <button label="Plus" name="view_profile_btn"/> + <button label="Profil" name="view_profile_btn"/> <panel name="moderator_panel"> <button label="Désactiver le chat vocal" name="disable_voice"/> <button label="Activer le chat vocal" name="enable_voice"/> diff --git a/indra/newview/skins/default/xui/fr/inspect_remote_object.xml b/indra/newview/skins/default/xui/fr/inspect_remote_object.xml index 6d8c44578a..6d7cfadc04 100644 --- a/indra/newview/skins/default/xui/fr/inspect_remote_object.xml +++ b/indra/newview/skins/default/xui/fr/inspect_remote_object.xml @@ -7,7 +7,7 @@ <text name="object_name"> Nom d'objet de test vraiment très long </text> - <text name="object_owner_label"> + <text name="object_owner_label" width="70"> Propriétaire : </text> <text name="object_owner"> diff --git a/indra/newview/skins/default/xui/fr/language_settings.xml b/indra/newview/skins/default/xui/fr/language_settings.xml index 71418d446a..117ae16ee8 100644 --- a/indra/newview/skins/default/xui/fr/language_settings.xml +++ b/indra/newview/skins/default/xui/fr/language_settings.xml @@ -3,9 +3,9 @@ <strings> <!-- Locale Information --> - <string name="MicrosoftLocale">english</string> - <string name="DarwinLocale">C</string> - <string name="LinuxLocale">C</string> + <string name="MicrosoftLocale">french</string> + <string name="DarwinLocale">fr_FR.UTF-8</string> + <string name="LinuxLocale">fr_FR.UTF-8</string> <!-- datetimeToCodes["wkday"] = "%a"; // Thu diff --git a/indra/newview/skins/default/xui/fr/menu_attachment_other.xml b/indra/newview/skins/default/xui/fr/menu_attachment_other.xml index ccb93f129e..f48513eb2b 100644 --- a/indra/newview/skins/default/xui/fr/menu_attachment_other.xml +++ b/indra/newview/skins/default/xui/fr/menu_attachment_other.xml @@ -8,9 +8,9 @@ <menu_item_call label="Inviter dans le groupe" name="Invite..."/> <menu_item_call label="Ignorer" name="Avatar Mute"/> <menu_item_call label="Signaler" name="abuse"/> - <menu_item_call label="Geler" name="Freeze..."/> + <menu_item_call label="Figer" name="Freeze..."/> <menu_item_call label="Expulser" name="Eject..."/> - <menu_item_call label="Débogage" name="Debug..."/> + <menu_item_call label="Déboguer les textures" name="Debug..."/> <menu_item_call label="Zoomer en avant" name="Zoom In"/> <menu_item_call label="Payer" name="Pay..."/> <menu_item_call label="Profil de l'objet" name="Object Inspect"/> diff --git a/indra/newview/skins/default/xui/fr/menu_attachment_self.xml b/indra/newview/skins/default/xui/fr/menu_attachment_self.xml index 999a1c156c..ff87d90d4d 100644 --- a/indra/newview/skins/default/xui/fr/menu_attachment_self.xml +++ b/indra/newview/skins/default/xui/fr/menu_attachment_self.xml @@ -5,8 +5,9 @@ <menu_item_call label="Détacher" name="Detach"/> <menu_item_call label="Lâcher" name="Drop"/> <menu_item_call label="Me lever" name="Stand Up"/> - <menu_item_call label="Mon apparence" name="Appearance..."/> + <menu_item_call label="Changer de tenue" name="Change Outfit"/> <menu_item_call label="Mes amis" name="Friends..."/> <menu_item_call label="Mes groupes" name="Groups..."/> <menu_item_call label="Mon profil" name="Profile..."/> + <menu_item_call label="Déboguer les textures" name="Debug..."/> </context_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_avatar_other.xml b/indra/newview/skins/default/xui/fr/menu_avatar_other.xml index 289912cd05..08d1a20361 100644 --- a/indra/newview/skins/default/xui/fr/menu_avatar_other.xml +++ b/indra/newview/skins/default/xui/fr/menu_avatar_other.xml @@ -8,9 +8,9 @@ <menu_item_call label="Inviter dans le groupe" name="Invite..."/> <menu_item_call label="Ignorer" name="Avatar Mute"/> <menu_item_call label="Signaler" name="abuse"/> - <menu_item_call label="Geler" name="Freeze..."/> + <menu_item_call label="Figer" name="Freeze..."/> <menu_item_call label="Expulser" name="Eject..."/> - <menu_item_call label="Débogage" name="Debug..."/> + <menu_item_call label="Déboguer les textures" name="Debug..."/> <menu_item_call label="Zoomer en avant" name="Zoom In"/> <menu_item_call label="Payer" name="Pay..."/> </context_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_avatar_self.xml b/indra/newview/skins/default/xui/fr/menu_avatar_self.xml index 82945cf96e..3620dc72b0 100644 --- a/indra/newview/skins/default/xui/fr/menu_avatar_self.xml +++ b/indra/newview/skins/default/xui/fr/menu_avatar_self.xml @@ -1,8 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Self Pie"> <menu_item_call label="Me lever" name="Stand Up"/> - <context_menu label="Enlever >" name="Take Off >"> - <context_menu label="Habits >" name="Clothes >"> + <context_menu label="Enlever â–¶" name="Take Off >"> + <context_menu label="Habits â–¶" name="Clothes >"> <menu_item_call label="Chemise" name="Shirt"/> <menu_item_call label="Pantalon" name="Pants"/> <menu_item_call label="Jupe" name="Skirt"/> @@ -10,18 +10,21 @@ <menu_item_call label="Chaussettes" name="Socks"/> <menu_item_call label="Veste" name="Jacket"/> <menu_item_call label="Gants" name="Gloves"/> - <menu_item_call label="Sous-vêtements (homme)" name="Self Undershirt"/> - <menu_item_call label="Sous-vêtements (femme)" name="Self Underpants"/> + <menu_item_call label="Débardeur" name="Self Undershirt"/> + <menu_item_call label="Caleçon" name="Self Underpants"/> <menu_item_call label="Tatouage" name="Self Tattoo"/> <menu_item_call label="Alpha" name="Self Alpha"/> <menu_item_call label="Tous les habits" name="All Clothes"/> </context_menu> - <context_menu label="HUD >" name="Object Detach HUD"/> - <context_menu label="Détacher >" name="Object Detach"/> + <context_menu label="HUD â–¶" name="Object Detach HUD"/> + <context_menu label="Détacher â–¶" name="Object Detach"/> <menu_item_call label="Tout détacher" name="Detach All"/> </context_menu> - <menu_item_call label="Mon apparence" name="Appearance..."/> + <menu_item_call label="Changer de tenue" name="Chenge Outfit"/> + <menu_item_call label="Modifier ma tenue" name="Edit Outfit"/> + <menu_item_call label="Modifier ma silhouette" name="Edit My Shape"/> <menu_item_call label="Mes amis" name="Friends..."/> <menu_item_call label="Mes groupes" name="Groups..."/> <menu_item_call label="Mon profil" name="Profile..."/> + <menu_item_call label="Déboguer les textures" name="Debug..."/> </context_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_bottomtray.xml b/indra/newview/skins/default/xui/fr/menu_bottomtray.xml index 3229940980..e058c66a17 100644 --- a/indra/newview/skins/default/xui/fr/menu_bottomtray.xml +++ b/indra/newview/skins/default/xui/fr/menu_bottomtray.xml @@ -4,6 +4,11 @@ <menu_item_check label="Bouton Bouger" name="ShowMoveButton"/> <menu_item_check label="Bouton Afficher" name="ShowCameraButton"/> <menu_item_check label="Bouton Photo" name="ShowSnapshotButton"/> + <menu_item_check label="Bouton Panneau latéral" name="ShowSidebarButton"/> + <menu_item_check label="Bouton Construire" name="ShowBuildButton"/> + <menu_item_check label="Bouton Rechercher" name="ShowSearchButton"/> + <menu_item_check label="Bouton Carte" name="ShowWorldMapButton"/> + <menu_item_check label="Bouton Mini-carte" name="ShowMiniMapButton"/> <menu_item_call label="Couper" name="NearbyChatBar_Cut"/> <menu_item_call label="Copier" name="NearbyChatBar_Copy"/> <menu_item_call label="Coller" name="NearbyChatBar_Paste"/> diff --git a/indra/newview/skins/default/xui/fr/menu_edit.xml b/indra/newview/skins/default/xui/fr/menu_edit.xml new file mode 100644 index 0000000000..56669f31e1 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/menu_edit.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu label="Modifier" name="Edit"> + <menu_item_call label="Annuler" name="Undo"/> + <menu_item_call label="Refaire" name="Redo"/> + <menu_item_call label="Couper" name="Cut"/> + <menu_item_call label="Copier" name="Copy"/> + <menu_item_call label="Coller" name="Paste"/> + <menu_item_call label="Supprimer" name="Delete"/> + <menu_item_call label="Dupliquer" name="Duplicate"/> + <menu_item_call label="Tout sélectionner" name="Select All"/> + <menu_item_call label="Désélectionner" name="Deselect"/> +</menu> diff --git a/indra/newview/skins/default/xui/fr/menu_group_plus.xml b/indra/newview/skins/default/xui/fr/menu_group_plus.xml index f5882261b0..0db5afedc7 100644 --- a/indra/newview/skins/default/xui/fr/menu_group_plus.xml +++ b/indra/newview/skins/default/xui/fr/menu_group_plus.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="menu_group_plus"> - <menu_item_call label="Rejoignez des groupes..." name="item_join"/> + <menu_item_call label="Rejoindre des groupes..." name="item_join"/> <menu_item_call label="Nouveau groupe..." name="item_new"/> </menu> diff --git a/indra/newview/skins/default/xui/fr/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/fr/menu_inspect_avatar_gear.xml index 39ba4b1074..8bda133a0b 100644 --- a/indra/newview/skins/default/xui/fr/menu_inspect_avatar_gear.xml +++ b/indra/newview/skins/default/xui/fr/menu_inspect_avatar_gear.xml @@ -9,10 +9,11 @@ <menu_item_call label="Ignorer" name="block"/> <menu_item_call label="Ne plus ignorer" name="unblock"/> <menu_item_call label="Signaler" name="report"/> - <menu_item_call label="Geler" name="freeze"/> + <menu_item_call label="Figer" name="freeze"/> <menu_item_call label="Expulser" name="eject"/> - <menu_item_call label="Débogage" name="debug"/> + <menu_item_call label="Déboguer les textures" name="debug"/> <menu_item_call label="Situer sur la carte" name="find_on_map"/> <menu_item_call label="Zoomer en avant" name="zoom_in"/> <menu_item_call label="Payer" name="pay"/> + <menu_item_call label="Partager" name="share"/> </menu> diff --git a/indra/newview/skins/default/xui/fr/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/fr/menu_inspect_self_gear.xml index d28d36bca7..5f570b5608 100644 --- a/indra/newview/skins/default/xui/fr/menu_inspect_self_gear.xml +++ b/indra/newview/skins/default/xui/fr/menu_inspect_self_gear.xml @@ -1,8 +1,9 @@ <?xml version="1.0" encoding="utf-8"?> <menu name="Gear Menu"> <menu_item_call label="Me lever" name="stand_up"/> - <menu_item_call label="Mon apparence" name="my_appearance"/> + <menu_item_call label="Changer de tenue" name="change_outfit"/> <menu_item_call label="Mon profil" name="my_profile"/> <menu_item_call label="Mes amis" name="my_friends"/> <menu_item_call label="Mes groupes" name="my_groups"/> + <menu_item_call label="Déboguer les textures" name="Debug..."/> </menu> diff --git a/indra/newview/skins/default/xui/fr/menu_inv_offer_chiclet.xml b/indra/newview/skins/default/xui/fr/menu_inv_offer_chiclet.xml new file mode 100644 index 0000000000..a9b2883cca --- /dev/null +++ b/indra/newview/skins/default/xui/fr/menu_inv_offer_chiclet.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="InvOfferChiclet Menu"> + <menu_item_call label="Fermer" name="Close"/> +</menu> diff --git a/indra/newview/skins/default/xui/fr/menu_inventory.xml b/indra/newview/skins/default/xui/fr/menu_inventory.xml index 5276aa5b7e..4b9a05edd6 100644 --- a/indra/newview/skins/default/xui/fr/menu_inventory.xml +++ b/indra/newview/skins/default/xui/fr/menu_inventory.xml @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="Popup"> + <menu_item_call label="Partager" name="Share"/> <menu_item_call label="Acheter" name="Task Buy"/> <menu_item_call label="Ouvrir" name="Task Open"/> <menu_item_call label="Jouer" name="Task Play"/> @@ -20,8 +21,8 @@ <menu_item_call label="Nouvelle veste" name="New Jacket"/> <menu_item_call label="Nouvelle jupe" name="New Skirt"/> <menu_item_call label="Nouveaux gants" name="New Gloves"/> - <menu_item_call label="Nouveau tricot" name="New Undershirt"/> - <menu_item_call label="Nouveaux sous-vêtements" name="New Underpants"/> + <menu_item_call label="Nouveau débardeur" name="New Undershirt"/> + <menu_item_call label="Nouveau caleçon" name="New Underpants"/> <menu_item_call label="Nouveau masque alpha" name="New Alpha Mask"/> <menu_item_call label="Nouveau tatouage" name="New Tattoo"/> </menu> @@ -40,8 +41,8 @@ <menu_item_call label="Chaussures" name="Shoes"/> <menu_item_call label="Chemise" name="Shirt"/> <menu_item_call label="Jupe" name="Skirt"/> - <menu_item_call label="Sous-vêtements (femme)" name="Underpants"/> - <menu_item_call label="Sous-vêtements (homme)" name="Undershirt"/> + <menu_item_call label="Caleçon" name="Underpants"/> + <menu_item_call label="Débardeur" name="Undershirt"/> </menu> <menu_item_call label="Téléporter" name="Landmark Open"/> <menu_item_call label="Ouvrir" name="Animation Open"/> @@ -49,10 +50,11 @@ <menu_item_call label="Remplacer la tenue actuelle" name="Replace Outfit"/> <menu_item_call label="Ajouter à la tenue actuelle" name="Add To Outfit"/> <menu_item_call label="Enlever de la tenue actuelle" name="Remove From Outfit"/> + <menu_item_call label="Trouver l'original" name="Find Original"/> <menu_item_call label="Purger l'objet" name="Purge Item"/> <menu_item_call label="Restaurer l'objet" name="Restore Item"/> - <menu_item_call label="Trouver l'original" name="Find Original"/> <menu_item_call label="Ouvrir" name="Open"/> + <menu_item_call label="Ouvrir l'original" name="Open Original"/> <menu_item_call label="Propriétés" name="Properties"/> <menu_item_call label="Renommer" name="Rename"/> <menu_item_call label="Copier l'UUID (identifiant universel unique)" name="Copy Asset UUID"/> @@ -65,7 +67,7 @@ <menu_item_call label="Démarrer le chat conférence" name="Conference Chat Folder"/> <menu_item_call label="Jouer" name="Sound Play"/> <menu_item_call label="À propos du repère" name="About Landmark"/> - <menu_item_call label="Jouer dans le Monde" name="Animation Play"/> + <menu_item_call label="Jouer dans Second Life" name="Animation Play"/> <menu_item_call label="Jouer localement" name="Animation Audition"/> <menu_item_call label="Envoyer un message instantané" name="Send Instant Message"/> <menu_item_call label="Offrir de téléporter..." name="Offer Teleport..."/> diff --git a/indra/newview/skins/default/xui/fr/menu_inventory_add.xml b/indra/newview/skins/default/xui/fr/menu_inventory_add.xml index 0e5abdad0a..57b0a768c2 100644 --- a/indra/newview/skins/default/xui/fr/menu_inventory_add.xml +++ b/indra/newview/skins/default/xui/fr/menu_inventory_add.xml @@ -18,8 +18,8 @@ <menu_item_call label="Nouvelle veste" name="New Jacket"/> <menu_item_call label="Nouvelle jupe" name="New Skirt"/> <menu_item_call label="Nouveaux gants" name="New Gloves"/> - <menu_item_call label="Nouveaux sous-vêtements (homme)" name="New Undershirt"/> - <menu_item_call label="Nouveaux sous-vêtements (femme)" name="New Underpants"/> + <menu_item_call label="Nouveau débardeur" name="New Undershirt"/> + <menu_item_call label="Nouveau caleçon" name="New Underpants"/> <menu_item_call label="Nouvel alpha" name="New Alpha"/> <menu_item_call label="Nouveau tatouage" name="New Tattoo"/> </menu> diff --git a/indra/newview/skins/default/xui/fr/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/fr/menu_inventory_gear_default.xml index 91bccfd699..4cfdfd2614 100644 --- a/indra/newview/skins/default/xui/fr/menu_inventory_gear_default.xml +++ b/indra/newview/skins/default/xui/fr/menu_inventory_gear_default.xml @@ -7,7 +7,7 @@ <menu_item_call label="Réinitialiser les filtres" name="reset_filters"/> <menu_item_call label="Fermer tous les dossiers" name="close_folders"/> <menu_item_call label="Vider la corbeille" name="empty_trash"/> - <menu_item_call label="Vider les Objets trouvés" name="empty_lostnfound"/> + <menu_item_call label="Vider les objets trouvés" name="empty_lostnfound"/> <menu_item_call label="Enregistrer la texture sous" name="Save Texture As"/> <menu_item_call label="Trouver l'original" name="Find Original"/> <menu_item_call label="Trouver tous les liens" name="Find All Links"/> diff --git a/indra/newview/skins/default/xui/fr/menu_land.xml b/indra/newview/skins/default/xui/fr/menu_land.xml index 80cc49aa42..b84daee3ae 100644 --- a/indra/newview/skins/default/xui/fr/menu_land.xml +++ b/indra/newview/skins/default/xui/fr/menu_land.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Land Pie"> - <menu_item_call label="À propos des terrains" name="Place Information..."/> + <menu_item_call label="À propos du terrain" name="Place Information..."/> <menu_item_call label="M'asseoir ici" name="Sit Here"/> <menu_item_call label="Acheter ce terrain" name="Land Buy"/> <menu_item_call label="Acheter un pass" name="Land Buy Pass"/> diff --git a/indra/newview/skins/default/xui/fr/menu_login.xml b/indra/newview/skins/default/xui/fr/menu_login.xml index fc42b02908..b712c008cd 100644 --- a/indra/newview/skins/default/xui/fr/menu_login.xml +++ b/indra/newview/skins/default/xui/fr/menu_login.xml @@ -8,18 +8,8 @@ <menu_item_call label="Aide de [SECOND_LIFE]" name="Second Life Help"/> <menu_item_call label="À propos de [APP_NAME]" name="About Second Life"/> </menu> + <menu_item_check label="Afficher le menu de débogage" name="Show Debug Menu"/> <menu label="Débogage" name="Debug"> - <menu label="Éditer" name="Edit"> - <menu_item_call label="Annuler" name="Undo"/> - <menu_item_call label="Refaire" name="Redo"/> - <menu_item_call label="Couper" name="Cut"/> - <menu_item_call label="Copier" name="Copy"/> - <menu_item_call label="Coller" name="Paste"/> - <menu_item_call label="Supprimer" name="Delete"/> - <menu_item_call label="Dupliquer" name="Duplicate"/> - <menu_item_call label="Tout sélectionner" name="Select All"/> - <menu_item_call label="Désélectionner" name="Deselect"/> - </menu> <menu_item_call label="Afficher les paramètres de débogage" name="Debug Settings"/> <menu_item_call label="Paramètres de couleurs/interface" name="UI/Color Settings"/> <menu_item_call label="Outil d'aperçu XUI" name="UI Preview Tool"/> @@ -28,5 +18,7 @@ <menu_item_call label="Afficher les conditions d'utilisation" name="TOS"/> <menu_item_call label="Afficher le message critique" name="Critical"/> <menu_item_call label="Test du navigateur Web" name="Web Browser Test"/> + <menu_item_check label="Afficher le sélecteur de grille" name="Show Grid Picker"/> + <menu_item_call label="Afficher la console des notifications" name="Show Notifications Console"/> </menu> </menu_bar> diff --git a/indra/newview/skins/default/xui/fr/menu_mini_map.xml b/indra/newview/skins/default/xui/fr/menu_mini_map.xml index a9facb2c30..9dc40af502 100644 --- a/indra/newview/skins/default/xui/fr/menu_mini_map.xml +++ b/indra/newview/skins/default/xui/fr/menu_mini_map.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="popup"> +<menu name="Popup"> <menu_item_call label="Zoom rapproché" name="Zoom Close"/> <menu_item_call label="Zoom moyen" name="Zoom Medium"/> <menu_item_call label="Zoom éloigné" name="Zoom Far"/> diff --git a/indra/newview/skins/default/xui/fr/menu_object.xml b/indra/newview/skins/default/xui/fr/menu_object.xml index b6775661ad..6492a83e06 100644 --- a/indra/newview/skins/default/xui/fr/menu_object.xml +++ b/indra/newview/skins/default/xui/fr/menu_object.xml @@ -5,20 +5,22 @@ <menu_item_call label="Construire" name="Build"/> <menu_item_call label="Ouvrir" name="Open"/> <menu_item_call label="M'asseoir ici" name="Object Sit"/> + <menu_item_call label="Me lever" name="Object Stand Up"/> <menu_item_call label="Profil de l'objet" name="Object Inspect"/> <menu_item_call label="Zoomer en avant" name="Zoom In"/> - <context_menu label="Porter >" name="Put On"> + <context_menu label="Porter â–¶" name="Put On"> <menu_item_call label="Porter" name="Wear"/> - <context_menu label="Joindre >" name="Object Attach"/> - <context_menu label="Joindre les éléments HUD >" name="Object Attach HUD"/> + <context_menu label="Attacher â–¶" name="Object Attach"/> + <context_menu label="Attacher les éléments HUD â–¶" name="Object Attach HUD"/> </context_menu> - <context_menu label="Supprimer >" name="Remove"> - <menu_item_call label="Prendre" name="Pie Object Take"/> + <context_menu label="Supprimer â–¶" name="Remove"> <menu_item_call label="Signaler une infraction" name="Report Abuse..."/> <menu_item_call label="Ignorer" name="Object Mute"/> <menu_item_call label="Retour" name="Return..."/> <menu_item_call label="Supprimer" name="Delete"/> </context_menu> + <menu_item_call label="Acheter" name="Pie Object Bye"/> + <menu_item_call label="Prendre" name="Pie Object Take"/> <menu_item_call label="Prendre une copie" name="Take Copy"/> <menu_item_call label="Payer" name="Pay..."/> <menu_item_call label="Acheter" name="Buy..."/> diff --git a/indra/newview/skins/default/xui/fr/menu_participant_list.xml b/indra/newview/skins/default/xui/fr/menu_participant_list.xml index c8f5b5f1ad..63d3d39f9c 100644 --- a/indra/newview/skins/default/xui/fr/menu_participant_list.xml +++ b/indra/newview/skins/default/xui/fr/menu_participant_list.xml @@ -8,13 +8,14 @@ <menu_item_call label="Appeler" name="Call"/> <menu_item_call label="Partager" name="Share"/> <menu_item_call label="Payer" name="Pay"/> + <menu_item_check label="Afficher les icônes des résidents" name="View Icons"/> <menu_item_check label="Bloquer le chat vocal" name="Block/Unblock"/> <menu_item_check label="Ignorer le texte" name="MuteText"/> <context_menu label="Options du modérateur >" name="Moderator Options"> <menu_item_check label="Autoriser les chats écrits" name="AllowTextChat"/> <menu_item_call label="Ignorer ce participant" name="ModerateVoiceMuteSelected"/> - <menu_item_call label="Ignorer tous les autres" name="ModerateVoiceMuteOthers"/> <menu_item_call label="Ne plus ignorer ce participant" name="ModerateVoiceUnMuteSelected"/> - <menu_item_call label="Ne plus ignorer tous les autres" name="ModerateVoiceUnMuteOthers"/> + <menu_item_call label="Ignorer les autres" name="ModerateVoiceMute"/> + <menu_item_call label="Ne plus ignorer les autres" name="ModerateVoiceUnmute"/> </context_menu> </context_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_people_nearby.xml b/indra/newview/skins/default/xui/fr/menu_people_nearby.xml index d48be969f4..26bd3978a9 100644 --- a/indra/newview/skins/default/xui/fr/menu_people_nearby.xml +++ b/indra/newview/skins/default/xui/fr/menu_people_nearby.xml @@ -2,8 +2,10 @@ <context_menu name="Avatar Context Menu"> <menu_item_call label="Voir le profil" name="View Profile"/> <menu_item_call label="Devenir amis" name="Add Friend"/> + <menu_item_call label="Supprimer cet ami" name="Remove Friend"/> <menu_item_call label="IM" name="IM"/> <menu_item_call label="Appeler" name="Call"/> + <menu_item_call label="Carte" name="Map"/> <menu_item_call label="Partager" name="Share"/> <menu_item_call label="Payer" name="Pay"/> <menu_item_check label="Ignorer/Ne plus ignorer" name="Block/Unblock"/> diff --git a/indra/newview/skins/default/xui/fr/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/fr/menu_people_nearby_multiselect.xml index 2185ac95e9..18ae84a67b 100644 --- a/indra/newview/skins/default/xui/fr/menu_people_nearby_multiselect.xml +++ b/indra/newview/skins/default/xui/fr/menu_people_nearby_multiselect.xml @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Multi-Selected People Context Menu"> <menu_item_call label="Devenir amis" name="Add Friends"/> + <menu_item_call label="Supprimer des amis" name="Remove Friend"/> <menu_item_call label="IM" name="IM"/> <menu_item_call label="Appeler" name="Call"/> <menu_item_call label="Partager" name="Share"/> diff --git a/indra/newview/skins/default/xui/fr/menu_profile_overflow.xml b/indra/newview/skins/default/xui/fr/menu_profile_overflow.xml index 4bb9fa19a8..ddf898b791 100644 --- a/indra/newview/skins/default/xui/fr/menu_profile_overflow.xml +++ b/indra/newview/skins/default/xui/fr/menu_profile_overflow.xml @@ -1,9 +1,12 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <toggleable_menu name="profile_overflow_menu"> + <menu_item_call label="Carte" name="show_on_map"/> <menu_item_call label="Payer" name="pay"/> <menu_item_call label="Partager" name="share"/> + <menu_item_call label="Ignorer" name="block"/> + <menu_item_call label="Ne plus ignorer" name="unblock"/> <menu_item_call label="Éjecter" name="kick"/> - <menu_item_call label="Geler" name="freeze"/> - <menu_item_call label="Dégeler" name="unfreeze"/> + <menu_item_call label="Figer" name="freeze"/> + <menu_item_call label="Libérer" name="unfreeze"/> <menu_item_call label="Représentant du service consommateur" name="csr"/> </toggleable_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_save_outfit.xml b/indra/newview/skins/default/xui/fr/menu_save_outfit.xml new file mode 100644 index 0000000000..fbec933382 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/menu_save_outfit.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="save_outfit_menu"> + <menu_item_call label="Enregistrer" name="save_outfit"/> + <menu_item_call label="Enregistrer comme nouvelle" name="save_as_new_outfit"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_script_chiclet.xml b/indra/newview/skins/default/xui/fr/menu_script_chiclet.xml new file mode 100644 index 0000000000..46efa30bd6 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/menu_script_chiclet.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="ScriptChiclet Menu"> + <menu_item_call label="Fermer" name="Close"/> +</menu> diff --git a/indra/newview/skins/default/xui/fr/menu_viewer.xml b/indra/newview/skins/default/xui/fr/menu_viewer.xml index 272fcfdae6..4c7cdefbe8 100644 --- a/indra/newview/skins/default/xui/fr/menu_viewer.xml +++ b/indra/newview/skins/default/xui/fr/menu_viewer.xml @@ -7,10 +7,10 @@ </menu_item_call> <menu_item_call label="Acheter des L$" name="Buy and Sell L$"/> <menu_item_call label="Mon profil" name="Profile"/> - <menu_item_call label="Mon apparence" name="Appearance"/> + <menu_item_call label="Changer de tenue" name="ChangeOutfit"/> <menu_item_check label="Mon inventaire" name="Inventory"/> - <menu_item_call label="Afficher l'inventaire dans le panneau latéral" name="ShowSidetrayInventory"/> - <menu_item_call label="Mes gestes" name="Gestures"/> + <menu_item_check label="Mon inventaire" name="ShowSidetrayInventory"/> + <menu_item_check label="Mes gestes" name="Gestures"/> <menu label="Mon statut" name="Status"> <menu_item_call label="Absent" name="Set Away"/> <menu_item_call label="Occupé" name="Set Busy"/> @@ -22,9 +22,8 @@ <menu label="Communiquer" name="Communicate"> <menu_item_call label="Mes amis" name="My Friends"/> <menu_item_call label="Mes groupes" name="My Groups"/> - <menu_item_check label="Chat près de vous" name="Nearby Chat"/> - <menu_item_call label="Personnes près de vous" name="Active Speakers"/> - <menu_item_check label="Média près de vous" name="Nearby Media"/> + <menu_item_check label="Chat près de moi" name="Nearby Chat"/> + <menu_item_call label="Personnes près de moi" name="Active Speakers"/> </menu> <menu label="Monde" name="World"> <menu_item_check label="Mini-carte" name="Mini-Map"/> @@ -32,14 +31,21 @@ <menu_item_call label="Photo" name="Take Snapshot"/> <menu_item_call label="Créer un repère pour ce lieu" name="Create Landmark Here"/> <menu label="Profil du lieu" name="Land"> - <menu_item_call label="À propos des terrains" name="About Land"/> + <menu_item_call label="Profil du lieu" name="Place Profile"/> + <menu_item_call label="À propos du terrain" name="About Land"/> <menu_item_call label="Région/Domaine" name="Region/Estate"/> </menu> <menu_item_call label="Acheter ce terrain" name="Buy Land"/> <menu_item_call label="Mes terrains" name="My Land"/> <menu label="Afficher" name="LandShow"> <menu_item_check label="Contrôles de mouvement" name="Movement Controls"/> - <menu_item_check label="Contrôles d'affichage" name="Camera Controls"/> + <menu_item_check label="Contrôles d’affichage" name="Camera Controls"/> + <menu_item_check label="Lignes d'interdiction" name="Ban Lines"/> + <menu_item_check label="Balises" name="beacons"/> + <menu_item_check label="Limites du terrain" name="Property Lines"/> + <menu_item_check label="Propriétaires de terrains" name="Land Owners"/> + <menu_item_check label="Coordonnées" name="Coordinates"/> + <menu_item_check label="Propriétés de la parcelle" name="Parcel Properties"/> </menu> <menu_item_call label="Me téléporter chez moi" name="Teleport Home"/> <menu_item_call label="Définir le domicile ici" name="Set Home to Here"/> @@ -61,23 +67,14 @@ <menu_item_call label="Outil de création" name="Create"/> <menu_item_call label="Outil Terrain" name="Land"/> </menu> - <menu label="Édition" name="Edit"> - <menu_item_call label="Annuler" name="Undo"/> - <menu_item_call label="Refaire" name="Redo"/> - <menu_item_call label="Couper" name="Cut"/> - <menu_item_call label="Copier" name="Copy"/> - <menu_item_call label="Coller" name="Paste"/> - <menu_item_call label="Supprimer" name="Delete"/> - <menu_item_call label="Dupliquer" name="Duplicate"/> - <menu_item_call label="Tout sélectionner" name="Select All"/> - <menu_item_call label="Désélectionner" name="Deselect"/> - </menu> <menu_item_call label="Lien" name="Link"/> <menu_item_call label="Annuler le lien" name="Unlink"/> + <menu_item_check label="Modifier les parties liées" name="Edit Linked Parts"/> <menu_item_call label="Point central sur la sélection" name="Focus on Selection"/> <menu_item_call label="Zoomer sur la sélection" name="Zoom to Selection"/> <menu label="Objet" name="Object"> - <menu_item_call label="Acheter" name="Menu Object Take"/> + <menu_item_call label="Acheter" name="Menu Object Buy"/> + <menu_item_call label="Prendre" name="Menu Object Take"/> <menu_item_call label="Prendre une copie" name="Take Copy"/> <menu_item_call label="Enregistrer dans mon inventaire" name="Save Object Back to My Inventory"/> <menu_item_call label="Enregistrer dans le contenu des objets" name="Save Object Back to Object Contents"/> @@ -90,27 +87,20 @@ <menu_item_call label="Définir les scripts sur Pas d'exécution" name="Set Scripts to Not Running"/> </menu> <menu label="Options" name="Options"> - <menu_item_check label="Modifier les parties reliées" name="Edit Linked Parts"/> <menu_item_call label="Définir les droits de chargement par défaut" name="perm prefs"/> <menu_item_check label="Afficher les droits avancés" name="DebugPermissions"/> - <menu label="Sélection" name="Selection"> - <menu_item_check label="Sélectionner mes objets uniquement" name="Select Only My Objects"/> - <menu_item_check label="Sélectionner les objets déplaçables uniquement" name="Select Only Movable Objects"/> - <menu_item_check label="Sélectionner en entourant" name="Select By Surrounding"/> - </menu> - <menu label="Afficher" name="Show"> - <menu_item_check label="Afficher la sélection masquée" name="Show Hidden Selection"/> - <menu_item_check label="Afficher le rayon lumineux pour la sélection" name="Show Light Radius for Selection"/> - <menu_item_check label="Afficher le faisceau de sélection lumineux" name="Show Selection Beam"/> - </menu> - <menu label="Grille" name="Grid"> - <menu_item_check label="Fixer sur la grille" name="Snap to Grid"/> - <menu_item_call label="Fixer les coordonnées XY de l'objet sur la grille" name="Snap Object XY to Grid"/> - <menu_item_call label="Utiliser la sélection pour la grille" name="Use Selection for Grid"/> - <menu_item_call label="Options de la grille" name="Grid Options"/> - </menu> - </menu> - <menu label="Sélectionner les parties reliées" name="Select Linked Parts"> + <menu_item_check label="Sélectionner mes objets uniquement" name="Select Only My Objects"/> + <menu_item_check label="Sélectionner les objets déplaçables uniquement" name="Select Only Movable Objects"/> + <menu_item_check label="Sélectionner en entourant" name="Select By Surrounding"/> + <menu_item_check label="Afficher la sélection masquée" name="Show Hidden Selection"/> + <menu_item_check label="Afficher le rayon lumineux pour la sélection" name="Show Light Radius for Selection"/> + <menu_item_check label="Afficher le faisceau de sélection lumineux" name="Show Selection Beam"/> + <menu_item_check label="Fixer sur la grille" name="Snap to Grid"/> + <menu_item_call label="Fixer les coordonnées XY de l'objet sur la grille" name="Snap Object XY to Grid"/> + <menu_item_call label="Utiliser la sélection pour la grille" name="Use Selection for Grid"/> + <menu_item_call label="Options de la grille" name="Grid Options"/> + </menu> + <menu label="Sélectionner les parties liées" name="Select Linked Parts"> <menu_item_call label="Sélectionner la partie suivante" name="Select Next Part"/> <menu_item_call label="Sélectionner la partie précédente" name="Select Previous Part"/> <menu_item_call label="Inclure la partie suivante" name="Include Next Part"/> @@ -124,10 +114,11 @@ <menu_item_call label="À propos de [APP_NAME]" name="About Second Life"/> </menu> <menu label="Avancé" name="Advanced"> + <menu_item_check label="Afficher le menu Avancé" name="Show Advanced Menu"/> <menu_item_call label="Arrêter mon animation" name="Stop Animating My Avatar"/> <menu_item_call label="Refixer les textures" name="Rebake Texture"/> <menu_item_call label="Taille de l'interface par défaut" name="Set UI Size to Default"/> - <menu_item_call label="Définir la taille de la fenêtre..." name="Set Window Size..."/> + <menu_item_call label="Définir la taille de la fenêtre…" name="Set Window Size..."/> <menu_item_check label="Limiter la distance de sélection" name="Limit Select Distance"/> <menu_item_check label="Désactiver les contraintes de la caméra" name="Disable Camera Distance"/> <menu_item_check label="Photo haute résolution" name="HighResSnapshot"/> @@ -145,14 +136,12 @@ <menu_item_check label="Mettre la transparence en surbrillance" name="Highlight Transparent"/> <menu_item_check label="Afficher les éléments HUD" name="Show HUD Attachments"/> <menu_item_check label="Afficher le réticule de la vue subjective" name="ShowCrosshairs"/> - <menu_item_check label="Afficher les info-bulles de terrain" name="Land Tips"/> </menu> <menu label="Types de rendu" name="Rendering Types"> <menu_item_check label="Simple" name="Simple"/> <menu_item_check label="Alpha" name="Alpha"/> <menu_item_check label="Arbre" name="Tree"/> <menu_item_check label="Avatars" name="Character"/> - <menu_item_check label="SurfacePath" name="SurfacePath"/> <menu_item_check label="Ciel" name="Sky"/> <menu_item_check label="Eau" name="Water"/> <menu_item_check label="Sol" name="Ground"/> @@ -173,10 +162,11 @@ <menu_item_check label="Objets flexibles" name="Flexible Objects"/> </menu> <menu_item_check label="Exécuter plusieurs threads" name="Run Multiple Threads"/> + <menu_item_check label="Utiliser le thread de lecture de plug-in" name="Use Plugin Read Thread"/> <menu_item_call label="Effacer le cache du groupe" name="ClearGroupCache"/> <menu_item_check label="Effet de lissage de la souris" name="Mouse Smoothing"/> - <menu_item_check label="Afficher les IM dans le chat près de vous" name="IMInChat"/> <menu label="Raccourcis" name="Shortcuts"> + <menu_item_call label="Image ([COST] L$)..." name="Upload Image"/> <menu_item_check label="Rechercher" name="Search"/> <menu_item_call label="Relâcher les touches" name="Release Keys"/> <menu_item_call label="Taille de l'interface par défaut" name="Set UI Size to Default"/> @@ -199,7 +189,6 @@ <menu_item_call label="Zoomer en avant" name="Zoom In"/> <menu_item_call label="Zoom par défaut" name="Zoom Default"/> <menu_item_call label="Zoomer en arrière" name="Zoom Out"/> - <menu_item_call label="Activer/Quitter le plein écran" name="Toggle Fullscreen"/> </menu> <menu_item_call label="Afficher les paramètres de débogage" name="Debug Settings"/> <menu_item_check label="Afficher le menu Développeurs" name="Debug Mode"/> @@ -219,6 +208,7 @@ <menu_item_check label="Caméra" name="Camera"/> <menu_item_check label="Vent" name="Wind"/> <menu_item_check label="Angle de champ" name="FOV"/> + <menu_item_check label="Badge" name="Badge"/> </menu> <menu label="Afficher les infos" name="Display Info"> <menu_item_check label="Afficher l'heure" name="Show Time"/> @@ -276,7 +266,7 @@ <menu_item_check label="Atlas des textures" name="Texture Atlas"/> <menu_item_check label="Rendu des lumières jointes" name="Render Attached Lights"/> <menu_item_check label="Rendu des particules jointes" name="Render Attached Particles"/> - <menu_item_check label="Hover Glow Objects" name="Hover Glow Objects"/> + <menu_item_check label="Objets en surbrillance avec le pointeur" name="Hover Glow Objects"/> </menu> <menu label="Réseau" name="Network"> <menu_item_check label="Pauser l'avatar" name="AgentPause"/> @@ -296,7 +286,7 @@ <menu_item_call label="Arrêter l'enregistrement" name="Stop Record"/> </menu> <menu label="Monde" name="World"> - <menu_item_check label="Sim Sun Override" name="Sim Sun Override"/> + <menu_item_check label="Ignorer les paramètres du soleil de la sim" name="Sim Sun Override"/> <menu_item_check label="Balise animée" name="Cheesy Beacon"/> <menu_item_check label="Météo fixe" name="Fixed Weather"/> <menu_item_call label="Dump Region Object Cache" name="Dump Region Object Cache"/> @@ -369,14 +359,14 @@ <menu label="Admin" name="Admin"> <menu label="Object"> <menu_item_call label="Prendre une copie" name="Take Copy"/> - <menu_item_call label="Forcer le propriétaire sur moi" name="Force Owner To Me"/> + <menu_item_call label="Téléporter le propriétaire" name="Force Owner To Me"/> <menu_item_call label="Forcer la permission du propriétaire" name="Force Owner Permissive"/> <menu_item_call label="Supprimer" name="Delete"/> <menu_item_call label="Verrouiller" name="Lock"/> <menu_item_call label="Obtenir les ID d'actifs" name="Get Assets IDs"/> </menu> <menu label="Parcelle" name="Parcel"> - <menu_item_call label="Forcer le propriétaire sur moi" name="Owner To Me"/> + <menu_item_call label="Téléporter le propriétaire" name="Owner To Me"/> <menu_item_call label="Définir sur le contenu Linden" name="Set to Linden Content"/> <menu_item_call label="Réclamer un terrain public" name="Claim Public Land"/> </menu> @@ -396,8 +386,8 @@ <menu_item_call label="Chaussettes" name="Socks"/> <menu_item_call label="Veste" name="Jacket"/> <menu_item_call label="Gants" name="Gloves"/> - <menu_item_call label="Sous-vêtements (homme)" name="Menu Undershirt"/> - <menu_item_call label="Sous-vêtements (femme)" name="Menu Underpants"/> + <menu_item_call label="Débardeur" name="Menu Undershirt"/> + <menu_item_call label="Caleçon" name="Menu Underpants"/> <menu_item_call label="Jupe" name="Skirt"/> <menu_item_call label="Alpha" name="Alpha"/> <menu_item_call label="Tatouage" name="Tattoo"/> diff --git a/indra/newview/skins/default/xui/fr/mime_types_linux.xml b/indra/newview/skins/default/xui/fr/mime_types_linux.xml index fc5e7ad659..3a7ff979ee 100644 --- a/indra/newview/skins/default/xui/fr/mime_types_linux.xml +++ b/indra/newview/skins/default/xui/fr/mime_types_linux.xml @@ -41,7 +41,7 @@ Cette parcelle propose du contenu audio </tooltip> <playtip name="audio_playtip"> - Jouer le contenu audio qui se trouve ici + Lire le contenu audio qui se trouve ici </playtip> </widgetset> <scheme name="rtsp"> diff --git a/indra/newview/skins/default/xui/fr/mime_types_mac.xml b/indra/newview/skins/default/xui/fr/mime_types_mac.xml index fc5e7ad659..3a7ff979ee 100644 --- a/indra/newview/skins/default/xui/fr/mime_types_mac.xml +++ b/indra/newview/skins/default/xui/fr/mime_types_mac.xml @@ -41,7 +41,7 @@ Cette parcelle propose du contenu audio </tooltip> <playtip name="audio_playtip"> - Jouer le contenu audio qui se trouve ici + Lire le contenu audio qui se trouve ici </playtip> </widgetset> <scheme name="rtsp"> diff --git a/indra/newview/skins/default/xui/fr/notifications.xml b/indra/newview/skins/default/xui/fr/notifications.xml index 6d7aef6389..bb1c4242ee 100644 --- a/indra/newview/skins/default/xui/fr/notifications.xml +++ b/indra/newview/skins/default/xui/fr/notifications.xml @@ -11,18 +11,29 @@ </global> <template name="okbutton"> <form> - <button name="OK" text="$yestext"/> + <button name="OK_okbutton" text="$yestext"/> + </form> + </template> + <template name="okignore"> + <form> + <button name="OK_okignore" text="$yestext"/> </form> </template> - <template name="okignore"/> <template name="okcancelbuttons"> <form> - <button name="Cancel" text="$notext"/> + <button name="OK_okcancelbuttons" text="$yestext"/> + <button name="Cancel_okcancelbuttons" text="$notext"/> + </form> + </template> + <template name="okcancelignore"> + <form> + <button name="OK_okcancelignore" text="$yestext"/> + <button name="Cancel_okcancelignore" text="$notext"/> </form> </template> - <template name="okcancelignore"/> <template name="okhelpbuttons"> <form> + <button name="OK_okhelpbuttons" text="$yestext"/> <button name="Help" text="$helptext"/> </form> </template> @@ -30,6 +41,7 @@ <form> <button name="Yes" text="$yestext"/> <button name="No" text="$notext"/> + <button name="Cancel_yesnocancelbuttons" text="$canceltext"/> </form> </template> <notification functor="GenericAcknowledge" label="Message de notification inconnu" name="MissingAlert"> @@ -93,6 +105,10 @@ Veuillez ne sélectionner qu'un seul objet. Enregistrer tous les changements dans les habits/parties du corps ? <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Ne pas enregistrer" yestext="Tout enregistrer"/> </notification> + <notification name="FriendsAndGroupsOnly"> + Les résidents qui ne sont pas vos amis ne sauront pas que vous avez choisi d'ignorer leurs appels et leurs messages instantanés. + <usetemplate name="okbutton" yestext="OK"/> + </notification> <notification name="GrantModifyRights"> Lorsque vous accordez des droits d'édition à un autre résident, vous lui permettez de changer, supprimer ou prendre n'importe lequel de vos objets dans le Monde. Réfléchissez bien avant d'accorder ces droits. Souhaitez-vous accorder des droits d'édition à [FIRST_NAME] [LAST_NAME] ? @@ -154,14 +170,16 @@ Ajouter ce pouvoir à « [ROLE_NAME] » ? Voulez-vous vraiment continuer ? <usetemplate ignoretext="Confirmez avant d'abandonner les éléments joints." name="okcancelignore" notext="Non" yestext="Oui"/> </notification> - <notification name="ClickUnimplemented"> - Désolés, pas encore mis en Å“uvre. - </notification> <notification name="JoinGroupCanAfford"> Rejoindre ce groupe coûte [COST] L$. Voulez-vous continuer ? <usetemplate name="okcancelbuttons" notext="Annuler" yestext="Rejoindre"/> </notification> + <notification name="JoinGroupNoCost"> + Vous vous apprêtez à rejoindre le groupe [NAME]. +Voulez-vous continuer ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="Rejoindre"/> + </notification> <notification name="JoinGroupCannotAfford"> Rejoindre ce groupe coûte [COST] L$. Vous n'avez pas suffisamment de L$ pour rejoindre ce groupe. @@ -265,7 +283,7 @@ Pour ne placer le média que sur une seule face, choisissez Sélectionner une fa Veuillez saisir votre adresse e-mail. </notification> <notification name="PromptMissingSubjMsg"> - Envoyer la photo avec le sujet ou le message par défaut ? + Envoyer la photo avec l'objet ou le message par défaut ? <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> </notification> <notification name="ErrorProcessingSnapshot"> @@ -298,7 +316,7 @@ La limite de [MAX_ATTACHMENTS] objets joints a été dépassée. Veuillez commen Vous ne pouvez pas porter cet article car il n'a pas encore été chargé. Veuillez réessayer dans une minute. </notification> <notification name="MustHaveAccountToLogIn"> - Oups! Vous avez oublié de fournir certaines informations. + Zut ! Vous avez oublié de fournir certaines informations. Vous devez saisir le nom et le prénom de votre avatar. Pour entrer dans [SECOND_LIFE], vous devez avoir un compte. Voulez-vous en créer un maintenant ? @@ -307,6 +325,9 @@ Pour entrer dans [SECOND_LIFE], vous devez avoir un compte. Voulez-vous en crée </url> <usetemplate name="okcancelbuttons" notext="Réessayer" yestext="Créer un compte"/> </notification> + <notification name="InvalidCredentialFormat"> + Saisissez à la fois le prénom et le nom de votre avatar dans le champ Nom d'utilisateur, puis connectez-vous. + </notification> <notification name="AddClassified"> Les petites annonces sont publiées à l'onglet Petites annonces de la section Recherche et sur [http://secondlife.com/community/classifieds secondlife.com] pendant une semaine. Rédigez votre annonce, puis cliquez sur Publier pour l'ajouter à la liste des annonces. @@ -328,8 +349,12 @@ Voulez-vous vraiment continuer ? Enregistrer les changements dans l'annonce [NAME] ? <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Ne pas enregistrer" yestext="Enregistrer"/> </notification> + <notification name="ClassifiedInsufficientFunds"> + Fonds insuffisants pour créer la petite annonce. + <usetemplate name="okbutton" yestext="OK"/> + </notification> <notification name="DeleteAvatarPick"> - Supprimer le favori [PICK] ? + Supprimer la sélection <nolink>[PICK]</nolink> ? <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> </notification> <notification name="PromptGoToEventsPage"> @@ -423,18 +448,17 @@ L'objet est peut-être inaccessible ou a peut-être été supprimé. Impossible d'écrire le fichier [[FILE]] </notification> <notification name="UnsupportedHardware"> - Avertissement : vous n'avez pas la configuration système requise pour utiliser [APP_NAME]. Si vous continuez à utiliser [APP_NAME], votre performance risque d'être moindre. Malheureusement, la page [SUPPORT_SITE] n'offre aucune assistance pour les problèmes de configuration système. + Votre ordinateur ne satisfait pas la configuration système requise pour [APP_NAME]. Les performances risquent d'être médiocres. Malheureusement, la section [SUPPORT_SITE] n'offre aucune aide pour les problèmes de configuration système. -MINSPECS -Voulez-vous visiter [_URL] pour plus d'informations ? +Consulter [_URL] pour en savoir plus ? <url name="url" option="0"> http://secondlife.com/support/sysreqs.php?lang=fr </url> <usetemplate ignoretext="Mon matériel n'est pas pris en charge" name="okcancelignore" notext="Non" yestext="Oui"/> </notification> <notification name="UnknownGPU"> - Votre système contient une carte graphique que [APP_NAME] ne reconnaît pas actuellement. -Cela est souvent le cas avec le nouveau matériel qui n'a pas encore été testé avec [APP_NAME]. Vous pourrez probablement utiliser [APP_NAME] sans problème, mais vous devrez peut-être ajuster les paramètres de vos graphiques. + Votre système contient une carte graphique que [APP_NAME] ne reconnaît pas. +Cela est souvent le cas avec le nouveau matériel qui n'a pas encore été testé avec [APP_NAME]. Cela ne posera probablement pas de problème, mais vous devrez peut-être ajuster vos paramètres graphiques. (Moi > Préférences > Graphiques). <form name="form"> <ignore name="ignore" text="Ma carte graphique ne peut être identifiée"/> @@ -474,14 +498,14 @@ Souhaitez-vous vraiment donner ces objets ? Vous n'êtes pas autorisé à transférer le dossier sélectionné. </notification> <notification name="FreezeAvatar"> - Geler cet avatar ? + Figer cet avatar ? Il ou elle ne pourra temporairement plus bouger, chatter, ou interagir dans le Monde. - <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Dégeler" yestext="Geler"/> + <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Libérer" yestext="Figer"/> </notification> <notification name="FreezeAvatarFullname"> - Geler [AVATAR_NAME] ? + Figer [AVATAR_NAME] ? Il ou elle ne pourra temporairement plus bouger, chatter, ou interagir dans le Monde. - <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Dégeler" yestext="Geler"/> + <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Libérer" yestext="Figerf"/> </notification> <notification name="EjectAvatarFullname"> Expulser [AVATAR_NAME] de votre terrain ? @@ -587,6 +611,11 @@ Assurez-vous que le fichier a l'extension correcte. <notification name="CannotEncodeFile"> Impossible d'encoder le fichier : [FILE] </notification> + <notification name="CorruptedProtectedDataStore"> + Impossible de lire vos données protégées ; elles sont en cours de réinitialisation. + Cette situation peut se produire lorsque vous changez la configuration du réseau. + <usetemplate name="okbutton" yestext="OK"/> + </notification> <notification name="CorruptResourceFile"> Fichier ressource corrompu : [FILE] </notification> @@ -657,7 +686,7 @@ Recherche effectuée : [FINALQUERY] Vos termes de recherche étaient trop courts et aucune recherche n'a été effectuée. </notification> <notification name="CouldNotTeleportReason"> - Impossible de téléporter. + Échec de la téléportation. [REASON] </notification> <notification name="invalid_tport"> @@ -757,14 +786,6 @@ plusieurs parcelles sélectionnées. Essayez de ne sélectionner qu'une seule parcelle. </notification> - <notification name="ParcelCanPlayMedia"> - Cet emplacement propose des flux de média. -Pour jouer des flux de média, il faut avoir une connexion Internet rapide. - -Jouer les flux de média lorsqu'ils sont disponibles ? -(Vous pourrez modifier cette option ultérieurement sous Préférences > Confidentialité.) - <usetemplate name="okcancelbuttons" notext="Désactiver" yestext="Jouer le média"/> - </notification> <notification name="CannotDeedLandWaitingForServer"> Cession du terrain impossible : rapport de propriété sur le point d'être envoyé par le serveur. @@ -886,9 +907,8 @@ Fusionner le terrain ? Cette erreur est généralement temporaire. Veuillez éditer et sauvegarder l'élément endossable à nouveau d'ici quelques minutes. </notification> <notification name="YouHaveBeenLoggedOut"> - Vous avez été déconnecté(e) de [SECOND_LIFE] : + Zut. Vous avez été déconnecté(e) de [SECOND_LIFE] [MESSAGE] -Vous pouvez afficher vos messages instantanés et votre chat en cliquant sur Afficher IM et chat. Sinon, cliquez sur Quitter pour quitter immédiatement [APP_NAME]. <usetemplate name="okcancelbuttons" notext="Quitter" yestext="Afficher IM et chat"/> </notification> <notification name="OnlyOfficerCanBuyLand"> @@ -913,6 +933,16 @@ Proposer à [NAME] de devenir votre ami(e) ? <button name="Cancel" text="Annuler"/> </form> </notification> + <notification label="Enregistrer la tenue" name="SaveOutfitAs"> + Enregistrer ce que je porte comme nouvelle tenue : + <form name="form"> + <input name="message"> + [DESC] (nouv.) + </input> + <button name="Offer" text="OK"/> + <button name="Cancel" text="Annuler"/> + </form> + </notification> <notification name="RemoveFromFriends"> Voulez-vous supprimer [FIRST_NAME] [LAST_NAME] de votre liste d'amis ? <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> @@ -941,6 +971,12 @@ Proposer à [NAME] de devenir votre ami(e) ? Veuillez saisir un montant plus élevé. </notification> + <notification name="ConfirmItemDeleteHasLinks"> + Des articles liés pointent vers au moins un article sélectionné. Les liens arrêteront définitivement de fonctionner si vous supprimez cet article. Il est vivement conseillé de supprimer d'abord ces liens. + +Voulez-vous vraiment supprimer ces articles ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> <notification name="ConfirmObjectDeleteLock"> Au moins un des objets que vous avez sélectionnés est verrouillé. @@ -1038,6 +1074,7 @@ Céder ces [AREA] m² de terrain au groupe [GROUP_NAME] ? </notification> <notification name="ErrorMessage"> [ERROR_MESSAGE] + <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="AvatarMovedDesired"> La destination que vous avez choisie n'est pas disponible actuellement. @@ -1088,6 +1125,42 @@ Choisissez un avatar homme ou femme. Vous pourrez revenir sur votre décision plus tard. <usetemplate name="okcancelbuttons" notext="Femme" yestext="Homme"/> </notification> + <notification name="CantTeleportToGrid"> + Téléportation vers [SLURL] impossible car cet endroit existe sur une grille ([GRID]) différente de la grille actuelle ([CURRENT_GRID]). Veuillez fermer votre client et réessayer. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="GeneralCertificateError"> + Connexion au serveur impossible. +[REASON] + +Nom du sujet : [SUBJECT_NAME_STRING] +Émetteur : [ISSUER_NAME_STRING] +Début de validité : [VALID_FROM] +Fin de validité : [VALID_TO] +Empreinte MD5 : [SHA1_DIGEST] +Empreinte SHA1 : [MD5_DIGEST] +Utilisation de la clé : [KEYUSAGE] +Utilisation étendue de la clé : [EXTENDEDKEYUSAGE] +Identifiant de la clé du sujet : [SUBJECTKEYIDENTIFIER] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="TrustCertificateError"> + Autorité de certification de ce serveur inconnue. + +Informations sur le certificat : +Nom du sujet : [SUBJECT_NAME_STRING] +Émetteur : [ISSUER_NAME_STRING] +Début de validité : [VALID_FROM] +Fin de validité : [VALID_TO] +Empreinte MD5 : [SHA1_DIGEST] +Empreinte SHA1 : [MD5_DIGEST] +Utilisation de la clé : [KEYUSAGE] +Utilisation étendue de la clé : [EXTENDEDKEYUSAGE] +Identifiant de la clé du sujet : [SUBJECTKEYIDENTIFIER] + +Approuver cette autorité ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="Approuver"/> + </notification> <notification name="NotEnoughCurrency"> [NAME] [PRICE] L$ Vous n'avez pas suffisamment de L$ pour faire cela. </notification> @@ -1282,8 +1355,8 @@ Quitter le groupe ? <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> </notification> <notification name="ConfirmKick"> - Souhaitez-vous vraiment éjecter tous les utilisateurs de la grille ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="Éjecter tous"/> + Souhaitez-vous vraiment éjecter tous les résidents de la grille ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="Éjecter tous les résidents"/> </notification> <notification name="MuteLinden"> Désolé, vous ne pouvez pas ignorer un Linden. @@ -1316,7 +1389,6 @@ Les chats et les messages instantanés ne s'afficheront pas. Les messages i <notification name="JoinedTooManyGroupsMember"> Vous avez atteint le nombre de groupes maximum. Avant de pouvoir rejoindre ce groupe, vous devez en quitter un ou refuser cette offre. [NAME] vous invite à rejoindre un groupe. -[INVITE] <usetemplate name="okcancelbuttons" notext="Refuser" yestext="Rejoindre"/> </notification> <notification name="JoinedTooManyGroups"> @@ -1324,7 +1396,7 @@ Les chats et les messages instantanés ne s'afficheront pas. Les messages i <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="KickUser"> - Éjecter cet utilisateur avec quel message ? + Éjecter ce résident avec quel message ? <form name="form"> <input name="message"> Un administrateur vous a déconnecté. @@ -1344,20 +1416,20 @@ Les chats et les messages instantanés ne s'afficheront pas. Les messages i </form> </notification> <notification name="FreezeUser"> - Geler cet utilisateur avec quel message ? + Figer ce résident avec quel message ? <form name="form"> <input name="message"> - Vous avez été gelé. Vous ne pouvez ni bouger ni chatter. Un administrateur va vous envoyer un message instantané (IM). + Vous avez été figé. Vous ne pouvez ni bouger ni chatter. Un administrateur va vous envoyer un message instantané (IM). </input> <button name="OK" text="OK"/> <button name="Cancel" text="Annuler"/> </form> </notification> <notification name="UnFreezeUser"> - Dégeler cet utilisateur avec quel message ? + Libérer ce résident avec quel message ? <form name="form"> <input name="message"> - Vous n'êtes plus gelé. + Vous n'êtes plus figé. </input> <button name="OK" text="OK"/> <button name="Cancel" text="Annuler"/> @@ -1374,7 +1446,7 @@ Les chats et les messages instantanés ne s'afficheront pas. Les messages i </form> </notification> <notification name="OfferTeleportFromGod"> - Demander au résident de venir vous rejoindre ? + Exiger du résident qu'il vienne vous rejoindre ? <form name="form"> <input name="message"> On se rejoint à [REGION] ? @@ -1384,7 +1456,7 @@ Les chats et les messages instantanés ne s'afficheront pas. Les messages i </form> </notification> <notification name="TeleportFromLandmark"> - Êtes-vous certain de vouloir être téléporté ? + Souhaitez-vous vraiment vous téléporter vers <nolink>[LOCATION]</nolink> ? <usetemplate ignoretext="Confirmer que je veux me téléporter à un repère" name="okcancelignore" notext="Annuler" yestext="Téléporter"/> </notification> <notification name="TeleportToPick"> @@ -1395,6 +1467,10 @@ Les chats et les messages instantanés ne s'afficheront pas. Les messages i Vous téléporter vers [CLASSIFIED] ? <usetemplate ignoretext="Confirmer que je veux me téléporter à un endroit dans les Petites annonces" name="okcancelignore" notext="Annuler" yestext="Téléporter"/> </notification> + <notification name="TeleportToHistoryEntry"> + Vous téléporter vers [HISTORY_ENTRY] ? + <usetemplate ignoretext="Confirmer que je veux me téléporter à un endroit de l'historique" name="okcancelignore" notext="Annuler" yestext="Téléporter"/> + </notification> <notification label="Envoyer un message à tout le monde dans votre domaine" name="MessageEstate"> Saisissez un message court qui sera envoyé à tous les résidents se trouvant actuellement sur votre domaine. <form name="form"> @@ -1406,7 +1482,7 @@ Les chats et les messages instantanés ne s'afficheront pas. Les messages i <notification label="Modifier un domaine Linden" name="ChangeLindenEstate"> Vous vous apprêtez à modifier un domaine appartenant aux Lindens (continent, zone réservée aux ados, orientation etc.). -Cela est extrêmement délicat car l'expérience des résidents est en jeu. Sur le continent, cela modifiera des milliers de régions et sera difficile à digérer pour le serveur. +Cela est extrêmement délicat car l'expérience des résidents est en jeu. Sur le continent, cette action modifiera des milliers de régions et sera difficile à digérer pour le serveur. Continuer ? <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> @@ -1477,15 +1553,18 @@ Souhaitez-vous en savoir plus sur les différentes catégories d'accès ? Votre catégorie d'accès ne vous permet pas de pénétrer dans cette région. </notification> <notification name="RegionEntryAccessBlocked_Change"> - Votre catégorie d'accès ne vous permet pas de pénétrer dans cette région. + La catégorie de contenu définie dans vos préférences ne vous permet pas de pénétrer dans cette région. -En cliquant sur Modifier les préférences, vous pourrez changer votre catégorie d'accès et pénétrer dans la région. À partir de maintenant, vous pouvez rechercher et accéder au contenu [REGIONMATURITY]. Vous pouvez modifier ce paramètre à partir du menu Moi > Préférences > Général. +Pour cela, cliquez sur Modifier les préférences afin de spécifier une catégorie plus élevée. Vous pourrez alors rechercher du contenu [REGIONMATURITY] et y accéder. Pour modifier ce paramètre ultérieurement, accédez à Moi > Préférences > Général, le moment voulu. <form name="form"> <button name="OK" text="Modifier les préférences"/> <button default="true" name="Cancel" text="Fermer"/> <ignore name="ignore" text="La catégorie de contenu que j'ai choisie m'empêche de pénétrer dans une région"/> </form> </notification> + <notification name="PreferredMaturityChanged"> + Votre préférence de catégorie de contenu est désormais [RATING]. + </notification> <notification name="LandClaimAccessBlocked"> Votre catégorie d'accès ne vous permet pas de réclamer cette région. Cela vient peut-être du fait qu'il manquait des informations pour valider votre âge. @@ -1553,7 +1632,7 @@ En cliquant sur Modifier les préférences, vous pourrez changer votre catégori <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="NotAllowedToViewNotecard"> - Permissions pour afficher la note insuffisantes. + Droits pour afficher la note insuffisants. <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="MissingNotecardAssetID"> @@ -1708,9 +1787,9 @@ Déplacer les objets de l'inventaire ? <usetemplate ignoretext="Confirmer avant de quitter" name="okcancelignore" notext="Ne pas quitter" yestext="Quitter"/> </notification> <notification name="HelpReportAbuseEmailLL"> - Utilisez cet outil pour signaler des infractions aux [http://secondlife.com/corporate/tos.php Conditions d'utilisation] et aux [http://secondlife.com/corporate/cs.php Règles communautaires]. + Utilisez cet outil pour signaler des infractions aux [http://secondlife.com/corporate/tos.php Conditions d’utilisation] et aux [http://secondlife.com/corporate/cs.php Règles communautaires]. -Lorsqu'elles sont signalées, toutes les infractions font l'objet d'une enquête et sont résolues. Vous pouvez consulter les détails de la résolution d'un incident dans le [http://secondlife.com/support/incidentreport.php Rapport d'incident]. +Lorsqu'elles sont signalées, toutes les infractions font l'objet d'une enquête et sont résolues. </notification> <notification name="HelpReportAbuseSelectCategory"> Veuillez choisir une catégorie pour ce rapport d'infraction. @@ -1752,7 +1831,7 @@ Linden Lab Les composantes requises suivantes ne se trouvent pas dans [FLOATER]: [COMPONENTS] </notification> - <notification label="Remplacer la pièce-jointe existante" name="ReplaceAttachment"> + <notification label="Remplacer la pièce jointe existante" name="ReplaceAttachment"> Vous avez déjà un objet sur cette partie du corps. Voulez-vous le remplacer par l'objet sélectionné ? <form name="form"> @@ -1901,6 +1980,9 @@ Liez-la à partir d'une page web pour permettre aux autres résidents d&apo <notification name="SystemMessageTip"> [MESSAGE] </notification> + <notification name="IMSystemMessageTip"> + [MESSAGE] + </notification> <notification name="Cancelled"> Annulé </notification> @@ -1929,6 +2011,11 @@ Liez-la à partir d'une page web pour permettre aux autres résidents d&apo Importation de photos SL et Web en cours... (prend environ 5 minutes.) </notification> + <notification name="UploadConfirmation"> + Le chargement coûte [AMOUNT] L$. +Continuer ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="Charger"/> + </notification> <notification name="UploadPayment"> Le chargement a coûté [AMOUNT] L$. </notification> @@ -1964,7 +2051,7 @@ Cela risque d'impacter votre mot de passe. Vous n'avez pas le droit de consulter cette note. </notification> <notification name="RezItemNoPermissions"> - Permissions insuffisantes pour rezzer l'objet. + Droits insuffisants pour rezzer l'objet. </notification> <notification name="UnableToLoadNotecard"> Impossible de lire les données de la note actuellement. @@ -1973,7 +2060,7 @@ Cela risque d'impacter votre mot de passe. Script absent de la base de données. </notification> <notification name="ScriptNoPermissions"> - Permissions insuffisantes pour voir le script. + Droits insuffisants pour voir le script. </notification> <notification name="UnableToLoadScript"> Impossible de charger le script. Merci de réessayer. @@ -2121,8 +2208,8 @@ Les objets non transférables donnés au groupe ont étés supprimés. Les objets sélectionnés sur la parcelle et qui ne sont pas à vous ont été rendus à leurs propriétaires. </notification> <notification name="ServerObjectMessage"> - Message de [NAME] : -[MSG] + Message de [NAME] : +<nolink>[MSG]</nolink> </notification> <notification name="NotSafe"> Les dégâts sont autorisés sur ce terrain. @@ -2242,15 +2329,6 @@ Veuillez réessayer dans quelques minutes. <button name="Mute" text="Ignorer"/> </form> </notification> - <notification name="ObjectGiveItemUnknownUser"> - Un objet appelé [OBJECTFROMNAME] appartenant à (un résident inconnu) vous a donné un [OBJECTTYPE] : -[ITEM_SLURL] - <form name="form"> - <button name="Keep" text="Garder"/> - <button name="Discard" text="Jeter"/> - <button name="Mute" text="Ignorer"/> - </form> - </notification> <notification name="UserGiveItem"> [NAME_SLURL] vous a donné un [OBJECTTYPE] : [ITEM_SLURL] @@ -2274,9 +2352,9 @@ Veuillez réessayer dans quelques minutes. </form> </notification> <notification name="TeleportOffered"> - [NAME] vous propose d'être téléporté jusqu'à son emplacement : + [NAME_SLURL] propose de vous téléporter à son emplacement : -[MESSAGE] +[MESSAGE] - [MATURITY_STR] <icon>[MATURITY_ICON]</icon> <form name="form"> <button name="Teleport" text="Téléporter"/> <button name="Cancel" text="Annuler"/> @@ -2294,15 +2372,14 @@ Veuillez réessayer dans quelques minutes. </form> </notification> <notification name="OfferFriendship"> - [NAME] vous demande de devenir son ami(e). + [NAME_SLURL] vous demande de devenir son ami(e). [MESSAGE] -(Par défaut, vous pourrez voir lorsque vous êtes tous deux connectés.) +(Par défaut, chacun pourra voir si l'autre est connecté.) <form name="form"> <button name="Accept" text="Accepter"/> <button name="Decline" text="Refuser"/> - <button name="Send IM" text="Envoyer IM"/> </form> </notification> <notification name="FriendshipOffered"> @@ -2323,6 +2400,12 @@ Veuillez réessayer dans quelques minutes. <notification name="FriendshipDeclined"> [NAME] a refusé votre amitié. </notification> + <notification name="FriendshipAcceptedByMe"> + Amitié acceptée. + </notification> + <notification name="FriendshipDeclinedByMe"> + Amitié refusée. + </notification> <notification name="OfferCallingCard"> [FIRST] [LAST] vous offre sa carte de visite. Cela ajoute un marque-page dans votre inventaire, ce qui vous permet d'envoyer rapidement un IM à ce résident. @@ -2356,6 +2439,9 @@ Venant de l'objet : [OBJECTNAME], appartenant à : [NAME]? <notification name="FailedToFindWearable"> La recherche du [TYPE] nommé(e) [DESC] dans la base de données a échoué. </notification> + <notification name="ShareToWebFailed"> + Échec de chargement de l'image sur le Web. + </notification> <notification name="InvalidWearable"> L'objet que vous essayez de porter utilise une fonctionnalité que le client ne peut lire. Pour porter cet objet, veuillez télécharger une mise à jour de [APP_NAME]. </notification> @@ -2397,14 +2483,6 @@ Accepter cette requête ? <button name="Ignore" text="Ignorer"/> </form> </notification> - <notification name="ScriptToast"> - [FIRST] [LAST]'s '[TITLE]' demande la participation de l'utilisateur. - <form name="form"> - <button name="Open" text="Ouvrir la boîte de dialogue"/> - <button name="Ignore" text="Ignorer"/> - <button name="Block" text="Ignorer"/> - </form> - </notification> <notification name="BuyLindenDollarSuccess"> Nous vous remercions de votre paiement. @@ -2531,7 +2609,7 @@ Elles vont être bloquées pendant quelques secondes pour votre sécurité. </notification> <notification name="ConfirmCloseAll"> Êtes-vous certain de vouloir fermer tous les IM ? - <usetemplate name="okcancelignore" notext="Annuler" yestext="OK"/> + <usetemplate ignoretext="Confirmer avant de fermer tous les IM." name="okcancelignore" notext="Annuler" yestext="OK"/> </notification> <notification name="AttachmentSaved"> L'élément joint a été sauvegardé. @@ -2560,6 +2638,56 @@ Elles vont être bloquées pendant quelques secondes pour votre sécurité. Le bouton sélectionné ne peut pas être affiché actuellement. Le bouton sera affiché quand il y aura suffisamment de place. </notification> + <notification name="ShareNotification"> + Faire glisser des articles de l'inventaire sur une personne dans le sélecteur de résident + </notification> + <notification name="DeedToGroupFail"> + Échec de cession au groupe. + </notification> + <notification name="AvatarRezNotification"> + ([EXISTENCE] secondes d'existence) +Nuage de l'avatar [NAME] disparu en [TIME] secondes. + </notification> + <notification name="AvatarRezSelfNotification"> + ([EXISTENCE] secondes d'existence) +Vous avez terminé de figer votre tenue en [TIME] secondes. + </notification> + <notification name="AvatarRezCloudNotification"> + ([EXISTENCE] secondes d'existence) +Transformation de l'avatar [NAME] en nuage. + </notification> + <notification name="AvatarRezArrivedNotification"> + ([EXISTENCE] secondes d'existence) +L'avatar [NAME] est apparu. + </notification> + <notification name="AvatarRezLeftCloudNotification"> + ([EXISTENCE] secondes d'existence) +Départ de l'avatar [NAME] après [TIME] secondes sous forme de nuage. + </notification> + <notification name="AvatarRezEnteredAppearanceNotification"> + ([EXISTENCE] secondes d'existence) +L'avatar [NAME] est entré en mode Apparence. + </notification> + <notification name="AvatarRezLeftAppearanceNotification"> + ([EXISTENCE] secondes d'existence) +L'avatar [NAME] a quitté le mode Apparence. + </notification> + <notification name="AvatarRezLeftNotification"> + ([EXISTENCE] secondes d'existence) +Départ de l'avatar [NAME] entièrement chargé. + </notification> + <notification name="ConfirmLeaveCall"> + Voulez-vous vraiment quitter cet appel ? + <usetemplate ignoretext="Confirmer avant de quitter l'appel" name="okcancelignore" notext="Non" yestext="Oui"/> + </notification> + <notification name="ConfirmMuteAll"> + Vous avez choisi d'ignorer l'ensemble des participants de l'appel du groupe. +Les résidents rejoignant l'appel ultérieurement seront également +ignorés, même si vous quittez l'appel. + +Ignorer les autres ? + <usetemplate ignoretext="Confirmer avant d'ignorer les autres lors d'un appel de groupe" name="okcancelignore" notext="Ok" yestext="Annuler"/> + </notification> <global name="UnsupportedCPU"> - Votre processeur ne remplit pas les conditions minimum requises. </global> diff --git a/indra/newview/skins/default/xui/fr/outfit_accordion_tab.xml b/indra/newview/skins/default/xui/fr/outfit_accordion_tab.xml new file mode 100644 index 0000000000..bac885e5d8 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/outfit_accordion_tab.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- *NOTE: mantipov: this xml is intended to be used inside panel_outfits_list.xml for each outfit folder--> +<!-- All accordion tabs in the My Appearance/My Outfits panel will be created from this one at runtume--> +<accordion_tab name="Mockup Tab" title="Mockup Tab"/> diff --git a/indra/newview/skins/default/xui/fr/panel_audio_device.xml b/indra/newview/skins/default/xui/fr/panel_audio_device.xml index a9540d8346..2caa013f54 100644 --- a/indra/newview/skins/default/xui/fr/panel_audio_device.xml +++ b/indra/newview/skins/default/xui/fr/panel_audio_device.xml @@ -6,7 +6,7 @@ <text name="Input device (microphone):"> Périphérique d'entrée (micro) : </text> - <text name="Output device (speakers):"> + <text name="Output device (speakers):" width="300"> Périphérique de sortie (haut-parleurs) : </text> <text name="Input level:"> diff --git a/indra/newview/skins/default/xui/fr/panel_body_parts_list_item.xml b/indra/newview/skins/default/xui/fr/panel_body_parts_list_item.xml new file mode 100644 index 0000000000..de764d8025 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/panel_body_parts_list_item.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="wearable_item"> + <text name="item_name" value="..."/> +</panel> diff --git a/indra/newview/skins/default/xui/fr/panel_bodyparts_list_button_bar.xml b/indra/newview/skins/default/xui/fr/panel_bodyparts_list_button_bar.xml new file mode 100644 index 0000000000..5e7442b877 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/panel_bodyparts_list_button_bar.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="clothing_list_button_bar_panel"> + <button label="Changer" name="switch_btn"/> + <button label="Acheter >" name="bodyparts_shop_btn"/> +</panel> diff --git a/indra/newview/skins/default/xui/fr/panel_bottomtray.xml b/indra/newview/skins/default/xui/fr/panel_bottomtray.xml index b3fac96250..328b97ee72 100644 --- a/indra/newview/skins/default/xui/fr/panel_bottomtray.xml +++ b/indra/newview/skins/default/xui/fr/panel_bottomtray.xml @@ -1,12 +1,13 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="bottom_tray"> - <string name="SpeakBtnToolTip"> - Active/Désactive le micro - </string> - <string name="VoiceControlBtnToolTip"> - Affiche/Masque le panneau de contrôle vocal - </string> + <string name="SpeakBtnToolTip" value="Active/Désactive le micro"/> + <string name="VoiceControlBtnToolTip" value="Affiche/Masque le panneau de contrôle de la voix"/> <layout_stack name="toolbar_stack"> + <layout_panel name="speak_panel"> + <talk_button name="talk"> + <speak_button label="Parler" label_selected="Parler" name="speak_btn"/> + </talk_button> + </layout_panel> <layout_panel name="gesture_panel"> <gesture_combo_list label="Geste" name="Gesture" tool_tip="Affiche/Masque les gestes"/> </layout_panel> @@ -19,6 +20,21 @@ <layout_panel name="snapshot_panel"> <button label="" name="snapshots" tool_tip="Prendre une photo"/> </layout_panel> + <layout_panel name="sidebar_btn_panel"> + <button label="Panneau latéral" name="sidebar_btn" tool_tip="Affiche/Masque le panneau latéral"/> + </layout_panel> + <layout_panel name="build_btn_panel"> + <button label="Construire" name="build_btn" tool_tip="Affiche/Masque les outils pour la construction"/> + </layout_panel> + <layout_panel name="search_btn_panel"> + <button label="Rechercher" name="search_btn" tool_tip="Affiche/Masque la recherche"/> + </layout_panel> + <layout_panel name="world_map_btn_panel"> + <button label="Carte" name="world_map_btn" tool_tip="Affiche/Masque la carte du monde"/> + </layout_panel> + <layout_panel name="mini_map_btn_panel"> + <button label="Mini-carte" name="mini_map_btn" tool_tip="Affiche/Masque la mini-carte"/> + </layout_panel> <layout_panel name="im_well_panel"> <chiclet_im_well name="im_well"> <button name="Unread IM messages" tool_tip="Conversations"/> diff --git a/indra/newview/skins/default/xui/fr/panel_bottomtray_lite.xml b/indra/newview/skins/default/xui/fr/panel_bottomtray_lite.xml new file mode 100644 index 0000000000..5b6d37ce00 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/panel_bottomtray_lite.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="bottom_tray_lite"> + <layout_stack name="toolbar_stack_lite"> + <layout_panel name="gesture_panel"> + <gesture_combo_list label="Geste" name="Gesture" tool_tip="Affiche/Masque les gestes"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/default/xui/fr/panel_classified_info.xml b/indra/newview/skins/default/xui/fr/panel_classified_info.xml index d317e35d2f..e4aecfdfc0 100644 --- a/indra/newview/skins/default/xui/fr/panel_classified_info.xml +++ b/indra/newview/skins/default/xui/fr/panel_classified_info.xml @@ -6,18 +6,49 @@ <panel.string name="type_pg"> Contenu Général </panel.string> + <panel.string name="l$_price"> + [PRICE] L$ + </panel.string> + <panel.string name="click_through_text_fmt"> + [TELEPORT] téléporter, [MAP] carte, [PROFILE] profil + </panel.string> + <panel.string name="date_fmt"> + [day,datetime,slt]/[mthnum,datetime,slt]/[year,datetime,slt] + </panel.string> + <panel.string name="auto_renew_on"> + Activé + </panel.string> + <panel.string name="auto_renew_off"> + Désactivé + </panel.string> <text name="title" value="Infos sur la petite annonce"/> <scroll_container name="profile_scroll"> <panel name="scroll_content_panel"> - <text name="classified_name" value="[name]"/> - <text name="classified_location" value="[loading...]"/> - <text name="content_type" value="[content type]"/> - <text name="category" value="[category]"/> - <check_box label="Renouvellement automatique toutes les semaines" name="auto_renew"/> - <text name="price_for_listing" tool_tip="Coût de l'annonce."> - [PRICE] L$ - </text> - <text name="classified_desc" value="[description]"/> + <text_editor name="classified_name" value="[name]"/> + <text name="classified_location_label" value="Emplacement :"/> + <text_editor name="classified_location" value="[loading...]"/> + <text name="content_type_label" value="Type de contenu :"/> + <text_editor name="content_type" value="[content type]"/> + <text name="category_label" value="Catégorie :"/> + <text_editor name="category" value="[category]"/> + <text name="creation_date_label" value="Date de création :"/> + <text_editor name="creation_date" tool_tip="Date de création" value="[date]"/> + <text name="price_for_listing_label" value="Coût de l'annonce :"/> + <text_editor name="price_for_listing" tool_tip="Coût de l'annonce." value="[price]"/> + <layout_stack name="descr_stack"> + <layout_panel name="clickthrough_layout_panel"> + <text name="click_through_label" value="Clics :"/> + <text_editor name="click_through_text" tool_tip="Parcourir les données en cliquant" value="[clicks]"/> + </layout_panel> + <layout_panel name="price_layout_panel"> + <text name="auto_renew_label" value="Renouv. auto :"/> + <text name="auto_renew" value="Activé"/> + </layout_panel> + <layout_panel name="descr_layout_panel"> + <text name="classified_desc_label" value="Description :"/> + <text_editor name="classified_desc" value="[description]"/> + </layout_panel> + </layout_stack> </panel> </scroll_container> <panel name="buttons"> diff --git a/indra/newview/skins/default/xui/fr/panel_clothing_list_button_bar.xml b/indra/newview/skins/default/xui/fr/panel_clothing_list_button_bar.xml new file mode 100644 index 0000000000..0b58a4e40b --- /dev/null +++ b/indra/newview/skins/default/xui/fr/panel_clothing_list_button_bar.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="clothing_list_button_bar_panel"> + <button label="Ajout +" name="add_btn"/> + <button label="Acheter >" name="clothing_shop_btn"/> +</panel> diff --git a/indra/newview/skins/default/xui/fr/panel_clothing_list_item.xml b/indra/newview/skins/default/xui/fr/panel_clothing_list_item.xml new file mode 100644 index 0000000000..de764d8025 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/panel_clothing_list_item.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="wearable_item"> + <text name="item_name" value="..."/> +</panel> diff --git a/indra/newview/skins/default/xui/fr/panel_cof_wearables.xml b/indra/newview/skins/default/xui/fr/panel_cof_wearables.xml new file mode 100644 index 0000000000..c1085aa461 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/panel_cof_wearables.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="cof_wearables"> + <accordion name="cof_wearables_accordion"> + <accordion_tab name="tab_attachments" title="Éléments attachés"/> + <accordion_tab name="tab_clothing" title="Habits"/> + <accordion_tab name="tab_body_parts" title="Parties du corps"/> + </accordion> +</panel> diff --git a/indra/newview/skins/default/xui/fr/panel_deletable_wearable_list_item.xml b/indra/newview/skins/default/xui/fr/panel_deletable_wearable_list_item.xml new file mode 100644 index 0000000000..91d90a5660 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/panel_deletable_wearable_list_item.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="deletable_wearable_item"> + <text name="item_name" value="..."/> +</panel> diff --git a/indra/newview/skins/default/xui/fr/panel_dummy_clothing_list_item.xml b/indra/newview/skins/default/xui/fr/panel_dummy_clothing_list_item.xml new file mode 100644 index 0000000000..6af84de0c7 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/panel_dummy_clothing_list_item.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="dummy_clothing_item"> + <text name="item_name" value="..."/> +</panel> diff --git a/indra/newview/skins/default/xui/fr/panel_edit_alpha.xml b/indra/newview/skins/default/xui/fr/panel_edit_alpha.xml index 836dd99097..3b81ef2a5f 100644 --- a/indra/newview/skins/default/xui/fr/panel_edit_alpha.xml +++ b/indra/newview/skins/default/xui/fr/panel_edit_alpha.xml @@ -5,6 +5,6 @@ <texture_picker label="Alpha haut" name="Upper Alpha" tool_tip="Cliquez pour sélectionner une image"/> <texture_picker label="Alpha tête" name="Head Alpha" tool_tip="Cliquez pour sélectionner une image"/> <texture_picker label="Alpha yeux" name="Eye Alpha" tool_tip="Cliquez pour sélectionner une image"/> - <texture_picker label="Alpha cheveux" name="Hair Alpha" tool_tip="Cliquez pour sélectionner une image"/> + <texture_picker label="Alpha cheveux" width="80" name="Hair Alpha" tool_tip="Cliquez pour sélectionner une image"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_edit_classified.xml b/indra/newview/skins/default/xui/fr/panel_edit_classified.xml index 1f44f2fe09..2e2b848c93 100644 --- a/indra/newview/skins/default/xui/fr/panel_edit_classified.xml +++ b/indra/newview/skins/default/xui/fr/panel_edit_classified.xml @@ -3,12 +3,20 @@ <panel.string name="location_notice"> (mise à jour après l'enregistrement) </panel.string> + <string name="publish_label"> + Publier + </string> + <string name="save_label"> + Enregistrer + </string> <text name="title"> Modifier la petite annonce </text> <scroll_container name="profile_scroll"> <panel name="scroll_content_panel"> - <icon label="" name="edit_icon" tool_tip="Cliquez pour sélectionner une image"/> + <panel name="snapshot_panel"> + <icon label="" name="edit_icon" tool_tip="Cliquer pour sélectionner une image"/> + </panel> <text name="Name:"> Titre : </text> @@ -22,20 +30,19 @@ en cours de chargement... </text> <button label="Définir sur l'emplacement actuel" name="set_to_curr_location_btn"/> - <combo_box name="content_type"> - <combo_item name="mature_ci"> - Contenu Modéré - </combo_item> - <combo_item name="pg_ci"> - Contenu Général - </combo_item> - </combo_box> + <text name="category_label" value="Catégorie :"/> + <text name="content_type_label" value="Type de contenu :"/> + <icons_combo_box label="Contenu Général" name="content_type"> + <icons_combo_box.item label="Contenu Modéré" name="mature_ci" value="Mature"/> + <icons_combo_box.item label="Contenu Général" name="pg_ci" value="PG"/> + </icons_combo_box> + <text name="price_for_listing_label" value="Coût de l'annonce :"/> <spinner label="L$" name="price_for_listing" tool_tip="Coût de l'annonce." value="50"/> - <check_box label="Renouvellement automatique toutes les semaines" name="auto_renew"/> + <check_box label="Renouvellement auto toutes les semaines" name="auto_renew"/> </panel> </scroll_container> <panel label="bottom_panel" name="bottom_panel"> - <button label="Enregistrer" name="save_changes_btn"/> + <button label="[LABEL]" name="save_changes_btn"/> <button label="Annuler" name="cancel_btn"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_edit_eyes.xml b/indra/newview/skins/default/xui/fr/panel_edit_eyes.xml index 7de6ca8b3f..549864e237 100644 --- a/indra/newview/skins/default/xui/fr/panel_edit_eyes.xml +++ b/indra/newview/skins/default/xui/fr/panel_edit_eyes.xml @@ -3,7 +3,9 @@ <panel name="avatar_eye_color_panel"> <texture_picker label="Iris" name="Iris" tool_tip="Cliquez pour sélectionner une image"/> </panel> - <accordion name="wearable_accordion"> - <accordion_tab name="eyes_main_tab" title="Yeux"/> - </accordion> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="eyes_main_tab" title="Yeux"/> + </accordion> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_edit_gloves.xml b/indra/newview/skins/default/xui/fr/panel_edit_gloves.xml index e37e0b2481..7f02222bef 100644 --- a/indra/newview/skins/default/xui/fr/panel_edit_gloves.xml +++ b/indra/newview/skins/default/xui/fr/panel_edit_gloves.xml @@ -2,9 +2,11 @@ <panel name="edit_gloves_panel"> <panel name="avatar_gloves_color_panel"> <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image"/> - <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/> + <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="80"/> + </panel> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="gloves_main_tab" title="Gants"/> + </accordion> </panel> - <accordion name="wearable_accordion"> - <accordion_tab name="gloves_main_tab" title="Gants"/> - </accordion> </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_edit_hair.xml b/indra/newview/skins/default/xui/fr/panel_edit_hair.xml index 9293c23e19..575cbabc88 100644 --- a/indra/newview/skins/default/xui/fr/panel_edit_hair.xml +++ b/indra/newview/skins/default/xui/fr/panel_edit_hair.xml @@ -3,10 +3,12 @@ <panel name="avatar_hair_color_panel"> <texture_picker label="Texture" name="Texture" tool_tip="Cliquez pour sélectionner une image"/> </panel> - <accordion name="wearable_accordion"> - <accordion_tab name="hair_color_tab" title="Couleur"/> - <accordion_tab name="hair_style_tab" title="Coupe"/> - <accordion_tab name="hair_eyebrows_tab" title="Sourcils"/> - <accordion_tab name="hair_facial_tab" title="Pilosité du visage"/> - </accordion> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="hair_color_tab" title="Couleur"/> + <accordion_tab name="hair_style_tab" title="Style"/> + <accordion_tab name="hair_eyebrows_tab" title="Sourcils"/> + <accordion_tab name="hair_facial_tab" title="Pilosité"/> + </accordion> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_edit_jacket.xml b/indra/newview/skins/default/xui/fr/panel_edit_jacket.xml index 759db657a6..0a87471db8 100644 --- a/indra/newview/skins/default/xui/fr/panel_edit_jacket.xml +++ b/indra/newview/skins/default/xui/fr/panel_edit_jacket.xml @@ -3,9 +3,11 @@ <panel name="avatar_jacket_color_panel"> <texture_picker label="Tissu (haut)" name="Upper Fabric" tool_tip="Cliquez pour sélectionner une image"/> <texture_picker label="Tissu (bas)" name="Lower Fabric" tool_tip="Cliquez pour sélectionner une image"/> - <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/> + <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="80"/> + </panel> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="jacket_main_tab" title="Veste"/> + </accordion> </panel> - <accordion name="wearable_accordion"> - <accordion_tab name="jacket_main_tab" title="Veste"/> - </accordion> </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_edit_pants.xml b/indra/newview/skins/default/xui/fr/panel_edit_pants.xml index 5328e885d3..b9f81278e2 100644 --- a/indra/newview/skins/default/xui/fr/panel_edit_pants.xml +++ b/indra/newview/skins/default/xui/fr/panel_edit_pants.xml @@ -2,9 +2,11 @@ <panel name="edit_pants_panel"> <panel name="avatar_pants_color_panel"> <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image"/> - <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/> + <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="80"/> + </panel> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="pants_main_tab" title="Pantalon"/> + </accordion> </panel> - <accordion name="wearable_accordion"> - <accordion_tab name="pants_main_tab" title="Pantalon"/> - </accordion> </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_edit_pick.xml b/indra/newview/skins/default/xui/fr/panel_edit_pick.xml index f234529764..5872b01fb0 100644 --- a/indra/newview/skins/default/xui/fr/panel_edit_pick.xml +++ b/indra/newview/skins/default/xui/fr/panel_edit_pick.xml @@ -1,7 +1,10 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Modifier la préférence" name="panel_edit_pick"> +<panel label="Modifier le favori" name="panel_edit_pick"> + <panel.string name="location_notice"> + (mise à jour après enregistrement) + </panel.string> <text name="title"> - Modifier la préférence + Modifier le favori </text> <scroll_container name="profile_scroll"> <panel name="scroll_content_panel"> @@ -22,7 +25,7 @@ </panel> </scroll_container> <panel label="bottom_panel" name="bottom_panel"> - <button label="Enregistrer [WHAT]" name="save_changes_btn"/> + <button label="Enregistrer" name="save_changes_btn"/> <button label="Annuler" name="cancel_btn"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_edit_profile.xml b/indra/newview/skins/default/xui/fr/panel_edit_profile.xml index 4a42858861..4be12054df 100644 --- a/indra/newview/skins/default/xui/fr/panel_edit_profile.xml +++ b/indra/newview/skins/default/xui/fr/panel_edit_profile.xml @@ -33,27 +33,27 @@ <icon label="" name="2nd_life_edit_icon" tool_tip="Cliquez pour sélectionner une image"/> </panel> <panel name="first_life_image_panel"> - <text name="real_world_photo_title_text" value="Monde physique :"/> + <text name="real_world_photo_title_text" value="Vie réelle :"/> </panel> <icon label="" name="real_world_edit_icon" tool_tip="Cliquez pour sélectionner une image"/> <text name="title_homepage_text"> Page d'accueil : </text> <line_editor name="homepage_edit" value="http://"/> - <check_box label="Afficher dans les résultats de recherche" name="show_in_search_checkbox"/> + <check_box label="Afficher avec la recherche" name="show_in_search_checkbox"/> <text name="title_acc_status_text" value="Mon compte :"/> + <text_editor name="acc_status_text" value="Résident. Aucune info de paiement enregistrée."/> <text name="my_account_link" value="[[URL] Accéder à ma Page d'accueil]"/> - <text name="acc_status_text" value="Résident. Aucune info de paiement enregistrée."/> <text name="title_partner_text" value="Mon partenaire :"/> - <text name="partner_edit_link" value="[[URL] Modifier]"/> <panel name="partner_data_panel"> - <name_box name="partner_text" value="[FIRST] [LAST]"/> + <name_box initial_value="(récupération en cours)" name="partner_text" value="[FIRST] [LAST]"/> </panel> + <text name="partner_edit_link" value="[[URL] Modifier]"/> </panel> </panel> </scroll_container> <panel name="profile_me_buttons_panel"> - <button label="Enregistrer les changements" name="save_btn"/> + <button label="Enregistrer les changements" name="save_btn" width="166"/> <button label="Annuler" name="cancel_btn"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_edit_shape.xml b/indra/newview/skins/default/xui/fr/panel_edit_shape.xml index 450b23608a..88f0635d97 100644 --- a/indra/newview/skins/default/xui/fr/panel_edit_shape.xml +++ b/indra/newview/skins/default/xui/fr/panel_edit_shape.xml @@ -1,23 +1,19 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="edit_shape_panel"> - <panel name="avatar_sex_panel"> - <text name="gender_text"> - Sexe : - </text> - <radio_group name="sex_radio"> - <radio_item label="Femme" name="radio"/> - <radio_item label="Homme" name="radio2"/> - </radio_group> + <text name="avatar_height"> + Taille : [HEIGHT] mètres + </text> + <panel label="Chemise" name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="shape_body_tab" title="Corps"/> + <accordion_tab name="shape_head_tab" title="Tête"/> + <accordion_tab name="shape_eyes_tab" title="Yeux"/> + <accordion_tab name="shape_ears_tab" title="Oreilles"/> + <accordion_tab name="shape_nose_tab" title="Nez"/> + <accordion_tab name="shape_mouth_tab" title="Bouche"/> + <accordion_tab name="shape_chin_tab" title="Menton"/> + <accordion_tab name="shape_torso_tab" title="Torse"/> + <accordion_tab name="shape_legs_tab" title="Jambes"/> + </accordion> </panel> - <accordion name="wearable_accordion"> - <accordion_tab name="shape_body_tab" title="Corps"/> - <accordion_tab name="shape_head_tab" title="Tête"/> - <accordion_tab name="shape_eyes_tab" title="Yeux"/> - <accordion_tab name="shape_ears_tab" title="Oreilles"/> - <accordion_tab name="shape_nose_tab" title="Nez"/> - <accordion_tab name="shape_mouth_tab" title="Bouche"/> - <accordion_tab name="shape_chin_tab" title="Menton"/> - <accordion_tab name="shape_torso_tab" title="Torse"/> - <accordion_tab name="shape_legs_tab" title="Jambes"/> - </accordion> </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_edit_shirt.xml b/indra/newview/skins/default/xui/fr/panel_edit_shirt.xml index 0fe7d5bbb0..e4e66db2ed 100644 --- a/indra/newview/skins/default/xui/fr/panel_edit_shirt.xml +++ b/indra/newview/skins/default/xui/fr/panel_edit_shirt.xml @@ -2,9 +2,11 @@ <panel name="edit_shirt_panel"> <panel name="avatar_shirt_color_panel"> <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image"/> - <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/> + <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="80"/> + </panel> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="shirt_main_tab" title="Chemise"/> + </accordion> </panel> - <accordion name="wearable_accordion"> - <accordion_tab name="shirt_main_tab" title="Chemise"/> - </accordion> </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_edit_shoes.xml b/indra/newview/skins/default/xui/fr/panel_edit_shoes.xml index 588a2ca7b2..6fca0fe121 100644 --- a/indra/newview/skins/default/xui/fr/panel_edit_shoes.xml +++ b/indra/newview/skins/default/xui/fr/panel_edit_shoes.xml @@ -2,9 +2,11 @@ <panel name="edit_shoes_panel"> <panel name="avatar_shoes_color_panel"> <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image"/> - <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/> + <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="80"/> + </panel> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="shoes_main_tab" title="Chaussures"/> + </accordion> </panel> - <accordion name="wearable_accordion"> - <accordion_tab name="shoes_main_tab" title="Chaussures"/> - </accordion> </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_edit_skin.xml b/indra/newview/skins/default/xui/fr/panel_edit_skin.xml index 649b91d66d..9640adcdf8 100644 --- a/indra/newview/skins/default/xui/fr/panel_edit_skin.xml +++ b/indra/newview/skins/default/xui/fr/panel_edit_skin.xml @@ -1,14 +1,16 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="edit_skin_panel"> <panel name="avatar_skin_color_panel"> - <texture_picker label="Tatouage tête" name="Head Tattoos" tool_tip="Cliquez pour sélectionner une image"/> - <texture_picker label="Tatouage haut" name="Upper Tattoos" tool_tip="Cliquez pour sélectionner une image"/> + <texture_picker label="Tatouage tête" name="Head Tattoos" tool_tip="Cliquez pour sélectionner une image" width="76"/> + <texture_picker label="Tatouage haut" name="Upper Tattoos" tool_tip="Cliquez pour sélectionner une image" width="80"/> <texture_picker label="Tatouage bas" name="Lower Tattoos" tool_tip="Cliquez pour sélectionner une image"/> </panel> - <accordion name="wearable_accordion"> - <accordion_tab name="skin_color_tab" title="Couleur de peau"/> - <accordion_tab name="skin_face_tab" title="Détails du visage"/> - <accordion_tab name="skin_makeup_tab" title="Maquillage"/> - <accordion_tab name="skin_body_tab" title="Détails du corps"/> - </accordion> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="skin_color_tab" title="Couleur"/> + <accordion_tab name="skin_face_tab" title="Détails visage"/> + <accordion_tab name="skin_makeup_tab" title="Maquillage"/> + <accordion_tab name="skin_body_tab" title="Détails corps"/> + </accordion> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_edit_skirt.xml b/indra/newview/skins/default/xui/fr/panel_edit_skirt.xml index 9d0f13c4e8..65fed2fbf4 100644 --- a/indra/newview/skins/default/xui/fr/panel_edit_skirt.xml +++ b/indra/newview/skins/default/xui/fr/panel_edit_skirt.xml @@ -2,9 +2,11 @@ <panel name="edit_skirt_panel"> <panel name="avatar_skirt_color_panel"> <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image"/> - <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/> + <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="80"/> + </panel> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="skirt_main_tab" title="Jupe"/> + </accordion> </panel> - <accordion name="wearable_accordion"> - <accordion_tab name="skirt_main_tab" title="Jupe"/> - </accordion> </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_edit_socks.xml b/indra/newview/skins/default/xui/fr/panel_edit_socks.xml index 8b062e0145..b9e9a07b8c 100644 --- a/indra/newview/skins/default/xui/fr/panel_edit_socks.xml +++ b/indra/newview/skins/default/xui/fr/panel_edit_socks.xml @@ -2,9 +2,11 @@ <panel name="edit_socks_panel"> <panel name="avatar_socks_color_panel"> <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image"/> - <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/> + <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="80"/> + </panel> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="socks_main_tab" title="Chaussettes"/> + </accordion> </panel> - <accordion name="wearable_accordion"> - <accordion_tab name="socks_main_tab" title="Chaussettes"/> - </accordion> </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_edit_tattoo.xml b/indra/newview/skins/default/xui/fr/panel_edit_tattoo.xml index 1faee191e0..9a6939e6b7 100644 --- a/indra/newview/skins/default/xui/fr/panel_edit_tattoo.xml +++ b/indra/newview/skins/default/xui/fr/panel_edit_tattoo.xml @@ -1,8 +1,9 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="edit_tattoo_panel"> <panel name="avatar_tattoo_color_panel"> - <texture_picker label="Tatouage tête" name="Head Tattoo" tool_tip="Cliquez pour sélectionner une image"/> - <texture_picker label="Tatouage haut" name="Upper Tattoo" tool_tip="Cliquez pour sélectionner une image"/> - <texture_picker label="Tatouage bas" name="Lower Tattoo" tool_tip="Cliquez pour sélectionner une image"/> + <texture_picker label="Tatouage tête" name="Head Tattoo" tool_tip="Cliquez pour sélectionner une image" width="76"/> + <texture_picker label="Tatouage haut" name="Upper Tattoo" tool_tip="Cliquez pour sélectionner une image" width="80"/> + <texture_picker label="Tatouage bas" name="Lower Tattoo" tool_tip="Cliquez pour sélectionner une image" width="76"/> + <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_edit_underpants.xml b/indra/newview/skins/default/xui/fr/panel_edit_underpants.xml index b9164ad862..7eddbd93f6 100644 --- a/indra/newview/skins/default/xui/fr/panel_edit_underpants.xml +++ b/indra/newview/skins/default/xui/fr/panel_edit_underpants.xml @@ -2,9 +2,11 @@ <panel name="edit_underpants_panel"> <panel name="avatar_underpants_color_panel"> <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image"/> - <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/> + <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="80"/> + </panel> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="underpants_main_tab" title="Caleçon"/> + </accordion> </panel> - <accordion name="wearable_accordion"> - <accordion_tab name="underpants_main_tab" title="Sous-vêtements (femme)"/> - </accordion> </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_edit_undershirt.xml b/indra/newview/skins/default/xui/fr/panel_edit_undershirt.xml index 462eff9451..e6bac22c23 100644 --- a/indra/newview/skins/default/xui/fr/panel_edit_undershirt.xml +++ b/indra/newview/skins/default/xui/fr/panel_edit_undershirt.xml @@ -2,9 +2,11 @@ <panel name="edit_undershirt_panel"> <panel name="avatar_undershirt_color_panel"> <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image"/> - <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/> + <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="80"/> + </panel> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="undershirt_main_tab" title="Débardeur"/> + </accordion> </panel> - <accordion name="wearable_accordion"> - <accordion_tab name="undershirt_main_tab" title="Sous-vêtements (homme)"/> - </accordion> </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_edit_wearable.xml b/indra/newview/skins/default/xui/fr/panel_edit_wearable.xml index 24ea030b33..e0762bd791 100644 --- a/indra/newview/skins/default/xui/fr/panel_edit_wearable.xml +++ b/indra/newview/skins/default/xui/fr/panel_edit_wearable.xml @@ -34,10 +34,10 @@ Modification des gants </string> <string name="edit_undershirt_title"> - Modification des sous-vêtements (homme) + Modification du débardeur </string> <string name="edit_underpants_title"> - Modification des sous-vêtements (femme) + Modification du caleçon </string> <string name="edit_alpha_title"> Modification du masque alpha @@ -79,10 +79,10 @@ Gants : </string> <string name="undershirt_desc_text"> - Sous-vêtements (homme) : + Débardeur : </string> <string name="underpants_desc_text"> - Sous-vêtements (femme) : + Caleçon : </string> <string name="alpha_desc_text"> Masque alpha : @@ -93,9 +93,20 @@ <text name="edit_wearable_title" value="Modification de la silhouette"/> <panel label="Chemise" name="wearable_type_panel"> <text name="description_text" value="Silhouette :"/> + <radio_group name="sex_radio"> + <radio_item label="" name="sex_male" tool_tip="Homme" value="1"/> + <radio_item label="" name="sex_female" tool_tip="Femme" value="0"/> + </radio_group> + <icon name="male_icon" tool_tip="Homme"/> + <icon name="female_icon" tool_tip="Femme"/> + </panel> + <panel label="gear_buttom_panel" name="gear_buttom_panel"> + <button name="friends_viewsort_btn" tool_tip="Options"/> + <button name="add_btn" tool_tip="TODO"/> + <button name="del_btn" tool_tip="TODO"/> </panel> <panel name="button_panel"> <button label="Enregistrer sous" name="save_as_button"/> - <button label="Annuler modification" name="revert_button"/> + <button label="Rétablir" name="revert_button" width="130"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_friends.xml b/indra/newview/skins/default/xui/fr/panel_friends.xml index 10ec952aa3..ad9e3daf3d 100644 --- a/indra/newview/skins/default/xui/fr/panel_friends.xml +++ b/indra/newview/skins/default/xui/fr/panel_friends.xml @@ -16,5 +16,5 @@ <button label="Téléporter" name="offer_teleport_btn" tool_tip="Proposez à cet ami d'être téléporté là où vous êtes"/> <button label="Payer" name="pay_btn" tool_tip="Donnez des L$ à cet ami"/> <button label="Supprimer" name="remove_btn" tool_tip="Supprimez ce résident de votre liste d'amis"/> - <button label="Ajouter" name="add_btn" tool_tip="Proposer à ce résident de devenir votre ami"/> + <button label="Ajouter" name="add_btn" tool_tip="Proposer à un résident de devenir votre ami"/> </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_group_control_panel.xml b/indra/newview/skins/default/xui/fr/panel_group_control_panel.xml index 69403939aa..3e66b3c72a 100644 --- a/indra/newview/skins/default/xui/fr/panel_group_control_panel.xml +++ b/indra/newview/skins/default/xui/fr/panel_group_control_panel.xml @@ -11,7 +11,7 @@ <button label="Quitter l'appel" name="end_call_btn"/> </layout_panel> <layout_panel name="voice_ctrls_btn_panel"> - <button label="Ouvrir les contrôles vocaux" name="voice_ctrls_btn"/> + <button label="Ouvrir contrôles vocaux" name="voice_ctrls_btn"/> </layout_panel> </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_group_general.xml b/indra/newview/skins/default/xui/fr/panel_group_general.xml index f0b242c6a1..20cb5bd974 100644 --- a/indra/newview/skins/default/xui/fr/panel_group_general.xml +++ b/indra/newview/skins/default/xui/fr/panel_group_general.xml @@ -11,27 +11,48 @@ Faites glisser le pointeur de la souris sur les options pour en savoir plus. <panel.string name="incomplete_member_data_str"> Extraction des données du résident en cours </panel.string> + <panel name="group_info_top"> + <texture_picker label="" name="insignia" tool_tip="Cliquez pour sélectionner une image"/> + <text name="prepend_founded_by"> + Fondateur : + </text> + <name_box initial_value="(récupération en cours)" name="founder_name"/> + <text name="join_cost_text"> + Gratuit + </text> + <button label="REJOINDRE" name="btn_join"/> + </panel> <text_editor name="charter"> Indiquez ici la charte de votre groupe </text_editor> <name_list name="visible_members"> <name_list.columns label="Membre" name="name" relwidth="0.40"/> <name_list.columns label="Titre" name="title" relwidth="0.25"/> + <name_list.columns label="Statut" name="status"/> </name_list> + <text name="my_group_settngs_label"> + Moi + </text> <text name="active_title_label"> - Mon titre + Mon titre : </text> <combo_box name="active_title" tool_tip="Indique le titre qui apparaît en face du nom de votre avatar lorsque votre groupe est actif."/> <check_box label="Recevoir les notices du groupe" name="receive_notices" tool_tip="Indique si vous souhaitez recevoir les notices envoyées au groupe. Décochez si ce groupe vous envoie des spams."/> <check_box label="Afficher dans mon profil" name="list_groups_in_profile" tool_tip="Indique si vous voulez afficher ce groupe dans votre profil"/> <panel name="preferences_container"> - <check_box label="Inscription libre" name="open_enrollement" tool_tip="Indique si ce groupe autorise les nouveaux membres à le rejoindre sans y être invités."/> - <check_box label="Frais d'inscription" name="check_enrollment_fee" tool_tip="Indique s'il faut payer des frais d'inscription pour rejoindre ce groupe"/> + <text name="group_settngs_label"> + Groupe + </text> + <check_box label="Inscription ouverte à tous" name="open_enrollement" tool_tip="Indique si ce groupe autorise les nouveaux membres à le rejoindre sans y être invités."/> + <check_box label="Inscription payante" name="check_enrollment_fee" tool_tip="Indique s'il faut payer des frais d'inscription pour rejoindre ce groupe"/> <spinner label="L$" name="spin_enrollment_fee" tool_tip="Les nouveaux membres doivent payer ces frais pour rejoindre le groupe quand l'option Frais d'inscription est cochée."/> - <check_box initial_value="true" label="Afficher dans la recherche" name="show_in_group_list" tool_tip="Permettre aux autres résidents de voir ce groupe dans les résultats de recherche"/> <combo_box name="group_mature_check" tool_tip="Définit si votre groupe contient des informations de type Modéré" width="195"> - <combo_box.item label="Contenu Général" name="pg"/> + <combo_item name="select_mature"> + - Catégorie d'accès - + </combo_item> <combo_box.item label="Contenu Modéré" name="mature"/> + <combo_box.item label="Contenu Général" name="pg"/> </combo_box> + <check_box initial_value="true" label="Afficher dans la recherche" name="show_in_group_list" tool_tip="Permettre aux autres résidents de voir ce groupe dans les résultats de recherche"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/fr/panel_group_info_sidetray.xml index b2f61fde71..5b08b4aefb 100644 --- a/indra/newview/skins/default/xui/fr/panel_group_info_sidetray.xml +++ b/indra/newview/skins/default/xui/fr/panel_group_info_sidetray.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Profil du groupe" name="GroupInfo"> <panel.string name="default_needs_apply_text"> - Certaines modifications sur cet onglet n'ont pas été enregistrées. + Certaines modifications n'ont pas été enregistrées. </panel.string> <panel.string name="want_apply_text"> Voulez-vous enregistrer ces modifications ? @@ -12,27 +12,24 @@ <panel.string name="group_join_free"> Gratuit </panel.string> - <text name="group_name" value="(en cours de chargement...)"/> - <line_editor label="Saisissez le nom du groupe ici" name="group_name_editor"/> - <texture_picker label="" name="insignia" tool_tip="Cliquez pour sélectionner une image"/> - <text name="prepend_founded_by"> - Fondateur : - </text> - <name_box initial_value="(récupération en cours)" name="founder_name"/> - <text name="join_cost_text"> - Gratuit - </text> - <button label="REJOINDRE" name="btn_join"/> - <accordion name="groups_accordion"> - <accordion_tab name="group_general_tab" title="Général"/> - <accordion_tab name="group_roles_tab" title="Rôles"/> - <accordion_tab name="group_notices_tab" title="Notices"/> - <accordion_tab name="group_land_tab" title="Terrain/Actifs"/> - </accordion> - <panel name="button_row"> - <button label="Créer" label_selected="Nouveau groupe" name="btn_create"/> - <button label="Chat de groupe" name="btn_chat"/> - <button label="Appel de groupe" name="btn_call"/> - <button label="Enregistrer" label_selected="Enregistrer" name="btn_apply"/> + <panel name="group_info_top"> + <text name="group_name" value="(en cours de chargement...)"/> + <line_editor label="Saisissez le nom du groupe ici" name="group_name_editor"/> </panel> + <layout_stack name="layout"> + <layout_panel name="group_accordions"> + <accordion name="groups_accordion"> + <accordion_tab name="group_general_tab" title="Général"/> + <accordion_tab name="group_roles_tab" title="Rôles"/> + <accordion_tab name="group_notices_tab" title="Notices"/> + <accordion_tab name="group_land_tab" title="Terrain/Actifs"/> + </accordion> + </layout_panel> + <layout_panel name="button_row"> + <button label="Chat" name="btn_chat"/> + <button label="Appel de groupe" name="btn_call" tool_tip="Appeler ce groupe"/> + <button label="Enregistrer" label_selected="Enregistrer" name="btn_apply"/> + <button label="Créer un groupe" name="btn_create" tool_tip="Créer un groupe"/> + </layout_panel> + </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_group_land_money.xml b/indra/newview/skins/default/xui/fr/panel_group_land_money.xml index 3ca22b6e21..192dd799ba 100644 --- a/indra/newview/skins/default/xui/fr/panel_group_land_money.xml +++ b/indra/newview/skins/default/xui/fr/panel_group_land_money.xml @@ -1,65 +1,65 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Terrain et L$" name="land_money_tab"> - <string name="help_text"> + <panel.string name="help_text"> Un avertissement apparaît si la surface utilisée par le groupe est supérieure ou égale au total des contributions. - </string> - <button label="?" name="help_button"/> - <string name="cant_view_group_land_text"> + </panel.string> + <panel.string name="cant_view_group_land_text"> Vous n'avez pas la permission de voir quel terrain possède ce groupe - </string> - <string name="cant_view_group_accounting_text"> + </panel.string> + <panel.string name="epmty_view_group_land_text"> + Aucune entrée + </panel.string> + <panel.string name="cant_view_group_accounting_text"> Vous n'avez pas la permission d'accéder aux informations financières de ce groupe. - </string> - <string name="loading_txt"> + </panel.string> + <panel.string name="loading_txt"> Chargement... - </string> - <text name="group_land_heading"> - Terrain du groupe - </text> - <scroll_list name="group_parcel_list"> - <column label="Parcelle" name="name"/> - <column label="Région" name="location"/> - <column label="Type" name="type"/> - <column label="Surface" name="area"/> - <column label="" name="hidden"/> - </scroll_list> - <button label="Carte" label_selected="Carte" name="map_button"/> - <text name="total_contributed_land_label"> - Total des contributions : - </text> - <text name="total_contributed_land_value"> - [AREA] m² - </text> - <text name="total_land_in_use_label"> - Superficie déjà utilisée : - </text> - <text name="total_land_in_use_value"> - [AREA] m² - </text> - <text name="land_available_label"> - Superficie disponible : - </text> - <text name="land_available_value"> - [AREA] m² - </text> - <text name="your_contribution_label"> - Votre contribution : - </text> - <string name="land_contrib_error"> + </panel.string> + <panel.string name="land_contrib_error"> Impossible de définir votre don de terrain - </string> - <text name="your_contribution_units"> - m² - </text> - <text name="your_contribution_max_value"> - ([AMOUNT] max.) - </text> - <text name="group_over_limit_text"> - Une contribution supplémentaire est requise pour prendre en charge le terrain utilisé - </text> - <text name="group_money_heading"> - Finances - </text> + </panel.string> + <panel name="layout_panel_landmoney"> + <scroll_list name="group_parcel_list"> + <scroll_list.columns label="Parcelle" name="name"/> + <scroll_list.columns label="Région" name="location"/> + <scroll_list.columns label="Type" name="type"/> + <scroll_list.columns label="Surface" name="area"/> + </scroll_list> + <text name="total_contributed_land_label"> + Total des contributions : + </text> + <text name="total_contributed_land_value"> + [AREA] m² + </text> + <button label="Carte" label_selected="Carte" name="map_button"/> + <text name="total_land_in_use_label"> + Superficie déjà utilisée : + </text> + <text name="total_land_in_use_value"> + [AREA] m² + </text> + <text name="land_available_label"> + Superficie disponible : + </text> + <text name="land_available_value"> + [AREA] m² + </text> + <text name="your_contribution_label"> + Votre contribution : + </text> + <text name="your_contribution_units"> + m² + </text> + <text name="your_contribution_max_value"> + ([AMOUNT] max.) + </text> + <text name="group_over_limit_text"> + Une contribution supplémentaire est requise pour prendre en charge le terrain utilisé + </text> + <text name="group_money_heading"> + Finances + </text> + </panel> <tab_container name="group_money_tab_container"> <panel label="PLANIFICATION" name="group_money_planning_tab"> <text_editor name="group_money_planning_text"> diff --git a/indra/newview/skins/default/xui/fr/panel_group_notices.xml b/indra/newview/skins/default/xui/fr/panel_group_notices.xml index 1ec63cf027..5ea7ba192b 100644 --- a/indra/newview/skins/default/xui/fr/panel_group_notices.xml +++ b/indra/newview/skins/default/xui/fr/panel_group_notices.xml @@ -10,7 +10,7 @@ Vous pouvez désactiver la réception des notices dans l'onglet Général. </panel.string> <text name="lbl2"> Les notices sont conservées pendant 14 jours. -200 maximum par groupe et par jour +200 max. par groupe et par jour. </text> <scroll_list name="notice_list"> <scroll_list.columns label="" name="icon"/> @@ -27,23 +27,24 @@ Vous pouvez désactiver la réception des notices dans l'onglet Général. <text name="lbl"> Créer une notice </text> - <text bottom_delta="-79" left="20" name="lbl3"> + <text name="lbl3"> Sujet : </text> - <line_editor left_delta="61" name="create_subject" width="331"/> - <text left="20" name="lbl4"> + <line_editor name="create_subject"/> + <text name="lbl4"> Message : </text> - <text_editor bottom_delta="-90" height="104" left_delta="61" name="create_message" width="330"/> - <text name="lbl5" width="68"> - Pièce-jointe : + <text_editor name="create_message"/> + <text name="lbl5"> + Pièce jointe : </text> - <line_editor left_delta="74" name="create_inventory_name" width="190"/> + <line_editor name="create_inventory_name"/> <text name="string"> Faire glisser l'objet et le déposer ici pour le joindre : </text> - <button label="Supprimer" label_selected="Supprimer pièce-jointe" left="274" name="remove_attachment" width="140"/> - <button label="Envoyer" label_selected="Envoyer" left="274" name="send_notice" width="140"/> + <button label="Inventaire" name="open_inventory" tool_tip="Ouvrir l'inventaire"/> + <button label="Supprimer" label_selected="Supprimer pièce jointe" name="remove_attachment" tool_tip="Supprimer la pièce jointe de votre notification"/> + <button label="Envoyer" label_selected="Envoyer" left="200" name="send_notice" width="100"/> <group_drop_target name="drop_target" tool_tip="Faites glisser un objet de l'inventaire jusqu'à cette case pour l'envoyer avec la notice. Vous devez avoir l'autorisation de copier et transférer l'objet pour pouvoir le joindre."/> </panel> <panel label="Voir ancienne notice" name="panel_view_past_notice"> @@ -60,6 +61,6 @@ Vous pouvez désactiver la réception des notices dans l'onglet Général. Message : </text> <line_editor left="128" name="view_inventory_name" width="256"/> - <button label="Ouvrir la pièce jointe" label_selected="Ouvrir pièce-jointe" name="open_attachment" width="118"/> + <button label="Ouvrir pièce jointe" label_selected="Ouvrir pièce jointe" name="open_attachment" width="118"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_group_roles.xml b/indra/newview/skins/default/xui/fr/panel_group_roles.xml index d0c9f2f302..e1eeaa8601 100644 --- a/indra/newview/skins/default/xui/fr/panel_group_roles.xml +++ b/indra/newview/skins/default/xui/fr/panel_group_roles.xml @@ -1,27 +1,27 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Membres et rôles" name="roles_tab"> <panel.string name="default_needs_apply_text"> - Certaines modifications sur cet onglet n'ont pas été enregistrées. + Certaines modifications n'ont pas été enregistrées. </panel.string> <panel.string name="want_apply_text"> Voulez-vous enregistrer vos modifications ? </panel.string> - <tab_container height="164" name="roles_tab_container"> - <panel height="148" label="MEMBRES" name="members_sub_tab" tool_tip="Membres"> + <tab_container name="roles_tab_container"> + <panel label="MEMBRES" name="members_sub_tab" tool_tip="Membres"> <panel.string name="help_text"> Vous pouvez ajouter ou supprimer les rôles assignés aux membres. Pour sélectionner plusieurs membres, cliquez sur leurs noms en maintenant la touche Ctrl enfoncée. </panel.string> <filter_editor label="Filtrer les membres" name="filter_input"/> - <name_list bottom_delta="-105" height="104" name="member_list"> + <name_list name="member_list"> <name_list.columns label="Membre" name="name"/> - <name_list.columns label="Donation" name="donated" width="116"/> - <name_list.columns label="Statut" name="online" width="136"/> + <name_list.columns label="Donation" name="donated"/> + <name_list.columns label="Statut" name="online"/> </name_list> - <button label="Inviter" name="member_invite" width="165"/> + <button label="Inviter" name="member_invite"/> <button label="Expulser" name="member_eject"/> </panel> - <panel height="148" label="RÔLES" name="roles_sub_tab"> + <panel label="RÔLES" name="roles_sub_tab"> <panel.string name="help_text"> Chaque rôle possède un titre et des pouvoirs. Les membres peuvent avoir @@ -41,7 +41,7 @@ notamment les rôles Tous et Propriétaire. Checkbox_Off </panel.string> <filter_editor label="Filtrer les rôles" name="filter_input"/> - <scroll_list bottom_delta="-104" height="104" name="role_list"> + <scroll_list name="role_list"> <scroll_list.columns label="Rôle" name="name"/> <scroll_list.columns label="Titre" name="title"/> <scroll_list.columns label="#" name="members"/> diff --git a/indra/newview/skins/default/xui/fr/panel_groups.xml b/indra/newview/skins/default/xui/fr/panel_groups.xml index 98320656fb..4cda98b9f7 100644 --- a/indra/newview/skins/default/xui/fr/panel_groups.xml +++ b/indra/newview/skins/default/xui/fr/panel_groups.xml @@ -1,10 +1,10 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="groups"> <scroll_list bottom="50" name="group list"/> - <text bottom="16" height="32" name="groupdesc" width="268"> + <text name="groupdesc"> Le groupe actif est en gras. </text> - <text bottom="3" name="groupcount"> + <text name="groupcount" width="280"> Vous appartenez à [COUNT] groupes ([MAX] max). </text> <button label="IM/Appel" name="IM" tool_tip="Ouvrir une session de messagerie instantanée"/> diff --git a/indra/newview/skins/default/xui/fr/panel_im_control_panel.xml b/indra/newview/skins/default/xui/fr/panel_im_control_panel.xml index 0590ed0f1b..1f2169e22c 100644 --- a/indra/newview/skins/default/xui/fr/panel_im_control_panel.xml +++ b/indra/newview/skins/default/xui/fr/panel_im_control_panel.xml @@ -9,11 +9,14 @@ <button label="Devenir amis" name="add_friend_btn"/> </layout_panel> <layout_panel name="teleport_btn_panel"> - <button label="Téléporter" name="teleport_btn"/> + <button label="Téléporter" name="teleport_btn" tool_tip="Proposer de téléporter cette personne"/> </layout_panel> <layout_panel name="share_btn_panel"> <button label="Partager" name="share_btn"/> </layout_panel> + <layout_panel name="pay_btn_panel"> + <button label="Payer" name="pay_btn"/> + </layout_panel> <layout_panel name="call_btn_panel"> <button label="Appeler" name="call_btn"/> </layout_panel> diff --git a/indra/newview/skins/default/xui/fr/panel_inventory_item.xml b/indra/newview/skins/default/xui/fr/panel_inventory_item.xml new file mode 100644 index 0000000000..d18047fbcf --- /dev/null +++ b/indra/newview/skins/default/xui/fr/panel_inventory_item.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="inventory_item"> + <text name="item_name" value="..."/> +</panel> diff --git a/indra/newview/skins/default/xui/fr/panel_landmark_info.xml b/indra/newview/skins/default/xui/fr/panel_landmark_info.xml index a2f82c72df..bd29bd676c 100644 --- a/indra/newview/skins/default/xui/fr/panel_landmark_info.xml +++ b/indra/newview/skins/default/xui/fr/panel_landmark_info.xml @@ -13,14 +13,11 @@ Aucune information sur ce lieu n'est disponible actuellement, veuillez réessayer ultérieurement. </string> <string name="server_forbidden_text"> - Les informations sur ce lieu ne sont pas disponibles car l'accès y est restreint. Veuillez vérifier vos permissions avec le propriétaire de la parcelle. + Les informations sur ce lieu ne sont pas disponibles car l'accès y est restreint. Veuillez vérifier vos droits avec le propriétaire de la parcelle. </string> <string name="acquired_date"> [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local] </string> - <string name="icon_PG" value="parcel_drk_PG"/> - <string name="icon_M" value="parcel_drk_M"/> - <string name="icon_R" value="parcel_drk_R"/> <button name="back_btn" tool_tip="Précédent"/> <text name="title" value="Profil du lieu"/> <scroll_container name="place_scroll"> diff --git a/indra/newview/skins/default/xui/fr/panel_landmarks.xml b/indra/newview/skins/default/xui/fr/panel_landmarks.xml index c4e90bed61..9c15b0bbd3 100644 --- a/indra/newview/skins/default/xui/fr/panel_landmarks.xml +++ b/indra/newview/skins/default/xui/fr/panel_landmarks.xml @@ -2,7 +2,7 @@ <panel name="Landmarks"> <accordion name="landmarks_accordion"> <accordion_tab name="tab_favorites" title="Barre des Favoris"/> - <accordion_tab name="tab_landmarks" title="Repères"/> + <accordion_tab name="tab_landmarks" title="Mes repères"/> <accordion_tab name="tab_inventory" title="Mon inventaire"/> <accordion_tab name="tab_library" title="Bibliothèque"/> </accordion> diff --git a/indra/newview/skins/default/xui/fr/panel_login.xml b/indra/newview/skins/default/xui/fr/panel_login.xml index 8f0561d243..f5847e0ee0 100644 --- a/indra/newview/skins/default/xui/fr/panel_login.xml +++ b/indra/newview/skins/default/xui/fr/panel_login.xml @@ -8,27 +8,23 @@ </panel.string> <layout_stack name="login_widgets"> <layout_panel name="login"> - <text name="first_name_text"> - Prénom : + <text name="username_text"> + Nom d'utilisateur : </text> - <line_editor label="Prénom" name="first_name_edit" tool_tip="Prénom [SECOND_LIFE]"/> - <text name="last_name_text"> - Nom : - </text> - <line_editor label="Nom :" name="last_name_edit" tool_tip="Nom [SECOND_LIFE]"/> + <line_editor label="Nom d'utilisateur" name="username_edit" tool_tip="Nom d'utilisateur [SECOND_LIFE]"/> <text name="password_text"> Mot de passe : </text> - <check_box label="Rappel" name="remember_check"/> + <check_box label="Enregistrer" name="remember_check"/> + <button label="Connexion" name="connect_btn"/> <text name="start_location_text"> - Commencer à : + Lieu de départ : </text> - <combo_box name="start_location_combo"> + <combo_box name="start_location_combo" width="152"> <combo_box.item label="Dernier emplacement" name="MyLastLocation"/> <combo_box.item label="Domicile" name="MyHome"/> <combo_box.item label="<Saisissez le nom de la région>" name="Typeregionname"/> </combo_box> - <button label="Connexion" name="connect_btn"/> </layout_panel> <layout_panel name="links"> <text name="create_new_account_text"> diff --git a/indra/newview/skins/default/xui/fr/panel_main_inventory.xml b/indra/newview/skins/default/xui/fr/panel_main_inventory.xml index 5dc9042205..f631cf8b85 100644 --- a/indra/newview/skins/default/xui/fr/panel_main_inventory.xml +++ b/indra/newview/skins/default/xui/fr/panel_main_inventory.xml @@ -1,64 +1,28 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Choses" name="main inventory panel"> - <panel.string name="Title"> - Choses + <panel.string name="ItemcountFetching"> + Récupération de [ITEM_COUNT] objets... [FILTER] </panel.string> + <panel.string name="ItemcountCompleted"> + [ITEM_COUNT] objets [FILTER] + </panel.string> + <text name="ItemcountText"> + Objets : + </text> <filter_editor label="Filtrer l'inventaire" name="inventory search editor"/> <tab_container name="inventory filter tabs"> <inventory_panel label="MON INVENTAIRE" name="All Items"/> - <inventory_panel label="RÉCENT" name="Recent Items"/> + <recent_inventory_panel label="RÉCENT" name="Recent Items"/> </tab_container> - <panel name="bottom_panel"> - <button name="options_gear_btn" tool_tip="Afficher d'autres options"/> - <button name="add_btn" tool_tip="Ajouter un nouvel article"/> - <dnd_button name="trash_btn" tool_tip="Supprimer l'article sélectionné"/> - </panel> - <menu_bar name="Inventory Menu"> - <menu label="Fichier" name="File"> - <menu_item_call label="Ouvrir" name="Open"/> - <menu label="Charger" name="upload"> - <menu_item_call label="Image ([COST] L$)..." name="Upload Image"/> - <menu_item_call label="Son ([COST] L$)..." name="Upload Sound"/> - <menu_item_call label="Animation ([COST] L$)..." name="Upload Animation"/> - <menu_item_call label="Lot ([COST] L$ par fichier)..." name="Bulk Upload"/> - </menu> - <menu_item_call label="Nouvelle fenêtre" name="New Window"/> - <menu_item_call label="Afficher les filtres" name="Show Filters"/> - <menu_item_call label="Réinitialiser les filtres" name="Reset Current"/> - <menu_item_call label="Fermer tous les dossiers" name="Close All Folders"/> - <menu_item_call label="Vider la corbeille" name="Empty Trash"/> - <menu_item_call label="Vider les Objets trouvés" name="Empty Lost And Found"/> - </menu> - <menu label="Créer" name="Create"> - <menu_item_call label="Nouveau dossier" name="New Folder"/> - <menu_item_call label="Nouveau script" name="New Script"/> - <menu_item_call label="Nouvelle note" name="New Note"/> - <menu_item_call label="Nouveau geste" name="New Gesture"/> - <menu label="Nouveaux habits" name="New Clothes"> - <menu_item_call label="Nouvelle chemise" name="New Shirt"/> - <menu_item_call label="Nouveau pantalon" name="New Pants"/> - <menu_item_call label="Nouvelles chaussures" name="New Shoes"/> - <menu_item_call label="Nouvelles chaussettes" name="New Socks"/> - <menu_item_call label="Nouvelle veste" name="New Jacket"/> - <menu_item_call label="Nouvelle jupe" name="New Skirt"/> - <menu_item_call label="Nouveaux gants" name="New Gloves"/> - <menu_item_call label="Nouveaux sous-vêtements (homme)" name="New Undershirt"/> - <menu_item_call label="Nouveaux sous-vêtements (femme)" name="New Underpants"/> - <menu_item_call label="Nouvel alpha" name="New Alpha"/> - <menu_item_call label="Nouveau tatouage" name="New Tattoo"/> - </menu> - <menu label="Nouvelles parties du corps" name="New Body Parts"> - <menu_item_call label="Nouvelle silhouette" name="New Shape"/> - <menu_item_call label="Nouvelle peau" name="New Skin"/> - <menu_item_call label="Nouveaux cheveux" name="New Hair"/> - <menu_item_call label="Nouveaux yeux" name="New Eyes"/> - </menu> - </menu> - <menu label="Trier" name="Sort"> - <menu_item_check label="Par nom" name="By Name"/> - <menu_item_check label="Par date" name="By Date"/> - <menu_item_check label="Dossiers toujours par nom" name="Folders Always By Name"/> - <menu_item_check label="Dossiers système en premier" name="System Folders To Top"/> - </menu> - </menu_bar> + <layout_stack name="bottom_panel"> + <layout_panel name="options_gear_btn_panel"> + <button name="options_gear_btn" tool_tip="Afficher d'autres options"/> + </layout_panel> + <layout_panel name="add_btn_panel"> + <button name="add_btn" tool_tip="Ajouter un nouvel article"/> + </layout_panel> + <layout_panel name="trash_btn_panel"> + <dnd_button name="trash_btn" tool_tip="Supprimer l'article sélectionné"/> + </layout_panel> + </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_me.xml b/indra/newview/skins/default/xui/fr/panel_me.xml index c9d77c208f..2521967bc6 100644 --- a/indra/newview/skins/default/xui/fr/panel_me.xml +++ b/indra/newview/skins/default/xui/fr/panel_me.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Mon profil" name="panel_me"> <tab_container name="tabs"> - <panel label="PROFIL" name="panel_profile"/> - <panel label="FAVORIS" name="panel_picks"/> + <panel label="MON PROFIL" name="panel_profile"/> + <panel label="MES PRÉFÉRENCES" name="panel_picks"/> </tab_container> </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_media_settings_general.xml b/indra/newview/skins/default/xui/fr/panel_media_settings_general.xml index afd2d9cd8f..e048e66810 100644 --- a/indra/newview/skins/default/xui/fr/panel_media_settings_general.xml +++ b/indra/newview/skins/default/xui/fr/panel_media_settings_general.xml @@ -8,7 +8,7 @@ </text> <line_editor name="home_url" tool_tip="La page d'accueil pour cette source média"/> <text name="preview_label"> - Prévisualiser + Aperçu </text> <text name="current_url_label"> Page actuelle : @@ -20,7 +20,7 @@ <check_box initial_value="false" label="Zoom auto" name="auto_zoom"/> <check_box initial_value="false" label="Lecture auto du média" name="auto_play"/> <text name="media_setting_note"> - Remarque : kes résidents peuvent ignorer ce paramètre + Remarque : les résidents peuvent ignorer ce paramètre </text> <check_box initial_value="false" label="Mise à l'échelle auto du média sur la face de l'objet" name="auto_scale"/> <text name="size_label"> diff --git a/indra/newview/skins/default/xui/fr/panel_media_settings_permissions.xml b/indra/newview/skins/default/xui/fr/panel_media_settings_permissions.xml index 6f6ae035a1..8f1b436ba1 100644 --- a/indra/newview/skins/default/xui/fr/panel_media_settings_permissions.xml +++ b/indra/newview/skins/default/xui/fr/panel_media_settings_permissions.xml @@ -11,10 +11,19 @@ Mini </combo_item> </combo_box> - <check_box initial_value="false" label="Désactiver la navigation et l'interactivité" name="perms_owner_interact"/> + <text name="owner_label"> + Propriétaire + </text> + <check_box initial_value="false" label="Activer la navigation et l'interactivité" name="perms_owner_interact"/> <check_box initial_value="false" label="Afficher la barre de contrôles" name="perms_owner_control"/> - <check_box initial_value="false" label="Désactiver la navigation et l'interactivité" name="perms_group_interact"/> + <text name="group_label"> + Groupe : + </text> + <check_box initial_value="false" label="Activer la navigation et l'interactivité" name="perms_group_interact"/> <check_box initial_value="false" label="Afficher la barre de contrôles" name="perms_group_control"/> - <check_box initial_value="false" label="Désactiver la navigation et l'interactivité" name="perms_anyone_interact"/> + <text name="anyone_label"> + Tout le monde + </text> + <check_box initial_value="false" label="Activer la navigation et l'interactivité" name="perms_anyone_interact"/> <check_box initial_value="false" label="Afficher la barre de contrôles" name="perms_anyone_control"/> </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_media_settings_security.xml b/indra/newview/skins/default/xui/fr/panel_media_settings_security.xml index 36d5f4e860..9d070b7aff 100644 --- a/indra/newview/skins/default/xui/fr/panel_media_settings_security.xml +++ b/indra/newview/skins/default/xui/fr/panel_media_settings_security.xml @@ -2,7 +2,8 @@ <panel label="Sécurité" name="Media Settings Security"> <check_box initial_value="false" label="Autoriser l'accès aux styles d'URL spécifiés uniquement" name="whitelist_enable"/> <text name="home_url_fails_some_items_in_whitelist"> - Les entrées par lesquelles la page d'accueil est rejetée sont indiquées : + Les entrées par lesquelles la page +d'accueil est rejetée sont indiquées : </text> <button label="Ajouter" name="whitelist_add"/> <button label="Supprimer" name="whitelist_del"/> diff --git a/indra/newview/skins/default/xui/fr/panel_my_profile.xml b/indra/newview/skins/default/xui/fr/panel_my_profile.xml index bbf760466a..ce2e5f4c60 100644 --- a/indra/newview/skins/default/xui/fr/panel_my_profile.xml +++ b/indra/newview/skins/default/xui/fr/panel_my_profile.xml @@ -26,15 +26,18 @@ </panel> <panel name="first_life_image_panel"> <icon label="" name="real_world_edit_icon" tool_tip="Cliquez sur le bouton Modifier le profil ci-dessous pour changer d'image"/> - <text name="title_rw_descr_text" value="Monde physique :"/> + <text name="title_rw_descr_text" value="Vie réelle :"/> </panel> <text name="title_member_text" value="Résident depuis :"/> <text name="title_acc_status_text" value="Statut du compte :"/> - <text name="acc_status_text"> + <text_editor name="acc_status_text"> Résident. Aucune info de paiement enregistrée. Linden. - </text> + </text_editor> <text name="title_partner_text" value="Partenaire :"/> + <panel name="partner_data_panel"> + <name_box initial_value="(récupération en cours)" name="partner_text"/> + </panel> <text name="title_groups_text" value="Groupes :"/> </panel> </scroll_container> diff --git a/indra/newview/skins/default/xui/fr/panel_navigation_bar.xml b/indra/newview/skins/default/xui/fr/panel_navigation_bar.xml index 7b89a2b686..45caf2323d 100644 --- a/indra/newview/skins/default/xui/fr/panel_navigation_bar.xml +++ b/indra/newview/skins/default/xui/fr/panel_navigation_bar.xml @@ -1,15 +1,18 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="navigation_bar"> <panel name="navigation_panel"> - <button name="back_btn" tool_tip="Revenir à l'emplacement précédent"/> - <button name="forward_btn" tool_tip="Avancer d'un emplacement"/> + <pull_button name="back_btn" tool_tip="Revenir à l'emplacement précédent"/> + <pull_button name="forward_btn" tool_tip="Avancer d'un emplacement"/> <button name="home_btn" tool_tip="Me téléporter jusqu'à mon domicile"/> <location_input label="Emplacement" name="location_combo"/> <search_combo_box label="Rechercher" name="search_combo_box" tool_tip="Rechercher"> <combo_editor label="Rechercher dans [SECOND_LIFE]" name="search_combo_editor"/> </search_combo_box> </panel> - <favorites_bar name="favorite"> + <favorites_bar name="favorite" tool_tip="Faites glisser des repères ici pour un accès rapide à vos lieux favoris dans Second Life."> + <label name="favorites_bar_label" tool_tip="Faites glisser des repères ici pour un accès rapide à vos lieux favoris dans Second Life."> + Favoris + </label> <chevron_button name=">>" tool_tip="Afficher d'avantage de Favoris"/> </favorites_bar> </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_nearby_chat.xml b/indra/newview/skins/default/xui/fr/panel_nearby_chat.xml index fa1ddd2430..b506a202bd 100644 --- a/indra/newview/skins/default/xui/fr/panel_nearby_chat.xml +++ b/indra/newview/skins/default/xui/fr/panel_nearby_chat.xml @@ -2,8 +2,8 @@ <!-- All our XML is utf-8 encoded. --> <panel name="nearby_chat"> <panel name="chat_caption"> - <text name="sender_name"> - CHAT PRÈS DE VOUS - </text> + <text + name="sender_name" +width="170">CHAT PRÈS DE MOI</text> </panel> </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/fr/panel_nearby_chat_bar.xml index 8ed441cbae..82cdf292ab 100644 --- a/indra/newview/skins/default/xui/fr/panel_nearby_chat_bar.xml +++ b/indra/newview/skins/default/xui/fr/panel_nearby_chat_bar.xml @@ -1,11 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="chat_bar"> - <string name="min_width"> - 192 - </string> - <string name="max_width"> - 320 - </string> <line_editor label="Cliquer ici pour chatter." name="chat_box" tool_tip="Appuyer sur Entrée pour dire, Ctrl-Entrée pour crier"/> <button name="show_nearby_chat" tool_tip="Affiche/Masque le journal de chats près de vous"/> </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_nearby_media.xml b/indra/newview/skins/default/xui/fr/panel_nearby_media.xml new file mode 100644 index 0000000000..36388b0bc1 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/panel_nearby_media.xml @@ -0,0 +1,65 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="nearby_media"> + <string name="media_item_count_format"> + (%ld articles de média) + </string> + <string name="empty_item_text"> + <vide> + </string> + <string name="parcel_media_name"> + Flux de média de la parcelle + </string> + <string name="parcel_audio_name"> + Flux audio de la parcelle + </string> + <string name="playing_suffix"> + (lecture en cours) + </string> + <panel name="minimized_controls"> + <button label="Arrêter" name="all_nearby_media_disable_btn" tool_tip="Désactiver tous les médias près de vous"/> + <button label="Lire" name="all_nearby_media_enable_btn" tool_tip="Activer tous les médias près de vous"/> + <button name="open_prefs_btn" tool_tip="Ouvrir les préférences de média"/> + <button label="Plus >>" label_selected="Moins <<" name="more_btn" tool_tip="Options avancées"/> + <button label="Plus >>" label_selected="Moins <<" name="less_btn" tool_tip="Options avancées"/> + </panel> + <panel name="nearby_media_panel"> + <combo_box name="show_combo"> + <combo_box.item label="Tout" name="All"/> + <combo_box.item label="Sur cette parcelle" name="WithinParcel"/> + <combo_box.item label="En dehors de la parcelle" name="OutsideParcel"/> + <combo_box.item label="Sur les autres avatars" name="OnOthers"/> + </combo_box> + <scroll_list name="media_list"> + <scroll_list.columns label="Proximité" name="media_proximity"/> + <scroll_list.columns label="Visible" name="media_visibility"/> + <scroll_list.columns label="Classe" name="media_class"/> + <scroll_list.columns label="Nom" name="media_name"/> + <scroll_list.columns label="Débogage" name="media_debug"/> + </scroll_list> + <panel> + <layout_stack name="media_controls"> + <layout_panel name="stop"> + <button name="stop_btn" tool_tip="Arrêter le média sélectionné"/> + </layout_panel> + <layout_panel name="play"> + <button name="play_btn" tool_tip="Lire le média sélectionné"/> + </layout_panel> + <layout_panel name="pause"> + <button name="pause_btn" tool_tip="Pause du média sélectionné"/> + </layout_panel> + <layout_panel name="volume_slider_ctrl"> + <slider_bar initial_value="0.5" name="volume_slider" tool_tip="Volume audio du média sélectionné"/> + </layout_panel> + <layout_panel name="mute"> + <button name="mute_btn" tool_tip="Couper l'audio sur le média sélectionné"/> + </layout_panel> + <layout_panel name="zoom"> + <button name="zoom_btn" tool_tip="Zoomer en avant sur le média sélectionné"/> + </layout_panel> + <layout_panel name="unzoom"> + <button name="unzoom_btn" tool_tip="Zoomer en arrière sur le média sélectionné"/> + </layout_panel> + </layout_stack> + </panel> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/fr/panel_notes.xml b/indra/newview/skins/default/xui/fr/panel_notes.xml index b1be274616..1609b6c9d3 100644 --- a/indra/newview/skins/default/xui/fr/panel_notes.xml +++ b/indra/newview/skins/default/xui/fr/panel_notes.xml @@ -13,11 +13,11 @@ </scroll_container> </layout_panel> <layout_panel name="notes_buttons_panel"> - <button label="Devenir amis" name="add_friend" tool_tip="Proposer à ce résident de devenir votre ami"/> - <button label="IM" name="im" tool_tip="Ouvrir une session IM"/> - <button label="Appeler" name="call" tool_tip="Appeler ce résident"/> + <button label="Devenir amis" name="add_friend" tool_tip="Proposer à un résident de devenir votre ami"/> + <button label="IM" name="im" width="30" tool_tip="Ouvrir une session IM"/> + <button label="Appeler" name="call" width="60" tool_tip="Appeler ce résident"/> <button label="Carte" name="show_on_map_btn" tool_tip="Afficher le résident sur la carte"/> - <button label="Téléporter" name="teleport" tool_tip="Proposez une téléportation"/> + <button label="Téléporter" name="teleport" tool_tip="Proposer une téléportation"/> </layout_panel> </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_online_status.xml b/indra/newview/skins/default/xui/fr/panel_online_status.xml new file mode 100644 index 0000000000..fdc489f375 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/panel_online_status.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="friend_online_status" name="friend_online_status"/> diff --git a/indra/newview/skins/default/xui/fr/panel_online_status_toast.xml b/indra/newview/skins/default/xui/fr/panel_online_status_toast.xml new file mode 100644 index 0000000000..fdc489f375 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/panel_online_status_toast.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="friend_online_status" name="friend_online_status"/> diff --git a/indra/newview/skins/default/xui/fr/panel_outfit_edit.xml b/indra/newview/skins/default/xui/fr/panel_outfit_edit.xml new file mode 100644 index 0000000000..4c869d05c8 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/panel_outfit_edit.xml @@ -0,0 +1,45 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- Side tray Outfit Edit panel --> +<panel label="Modification de la tenue" name="outfit_edit"> + <string name="No Outfit" value="Pas de tenue"/> + <string name="unsaved_changes" value="Modifications non enregistrées"/> + <string name="now_editing" value="Modification"/> + <panel.string name="not_available"> + (s/o) + </panel.string> + <panel.string name="unknown"> + (inconnu) + </panel.string> + <string name="Filter.All" value="Tout"/> + <string name="Filter.Clothes/Body" value="Habits/Corps"/> + <string name="Filter.Objects" value="Objets"/> + <button label="modifier" name="edit_wearable_btn"/> + <text name="title" value="Modifier la tenue"/> + <panel label="bottom_panel" name="header_panel"> + <panel label="bottom_panel" name="outfit_name_and_status"> + <text name="status" value="Modification..."/> + <text name="curr_outfit_name" value="[Current Outfit]"/> + </panel> + </panel> + <layout_stack name="im_panels"> + <layout_panel label="Panneau de contrôle IM" name="outfit_wearables_panel"> + <panel label="bottom_panel" name="edit_panel"/> + </layout_panel> + <layout_panel name="add_wearables_panel"> + <text name="add_to_outfit_label" value="Ajouter à la tenue :"/> + <layout_stack name="filter_panels"> + <layout_panel label="Panneau de contrôle IM" name="filter_panel"> + <filter_editor label="Filtre" name="look_item_filter"/> + </layout_panel> + </layout_stack> + <panel label="add_wearables_button_bar" name="add_wearables_button_bar"> + <button label="D" name="folder_view_btn"/> + <button label="L" name="list_view_btn"/> + </panel> + </layout_panel> + </layout_stack> + <panel name="save_revert_button_bar"> + <button label="Enregistrer" name="save_btn"/> + <button label="Rétablir" name="revert_btn"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/fr/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/fr/panel_outfits_inventory.xml index 3447d54cf8..f4fa3a2838 100644 --- a/indra/newview/skins/default/xui/fr/panel_outfits_inventory.xml +++ b/indra/newview/skins/default/xui/fr/panel_outfits_inventory.xml @@ -1,14 +1,14 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Choses" name="Outfits"> <tab_container name="appearance_tabs"> - <inventory_panel label="MES TENUES" name="outfitslist_tab"/> - <inventory_panel label="TENUE" name="cof_accordionpanel"/> + <panel label="MES TENUES" name="outfitslist_tab"/> + <inventory_panel label="PORTÉ" name="cof_tab"/> </tab_container> <panel name="bottom_panel"> <button name="options_gear_btn" tool_tip="Afficher d'autres options"/> <dnd_button name="trash_btn" tool_tip="Supprimer l'objet sélectionné"/> <button label="Enregistrer la tenue" name="make_outfit_btn" tool_tip="Enregistrer l'apparence comme tenue"/> <button label="Porter" name="wear_btn" tool_tip="Porter la tenue sélectionnée"/> - <button label="M" name="look_edit_btn"/> + <button label="Modifier tenue" name="edit_current_outfit_btn"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_people.xml b/indra/newview/skins/default/xui/fr/panel_people.xml index 408a7e67d7..f7eb803d4a 100644 --- a/indra/newview/skins/default/xui/fr/panel_people.xml +++ b/indra/newview/skins/default/xui/fr/panel_people.xml @@ -1,13 +1,23 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <!-- Side tray panel --> <panel label="Résidents" name="people_panel"> - <string name="no_people" value="Personne"/> - <string name="no_one_near" value="Personne près de vous"/> + <string name="no_recent_people" value="Personne de récent. Pour rechercher des résidents avec qui passer du temps, voir [secondlife:///app/search/people Rechercher] ou [secondlife:///app/worldmap Carte du monde]."/> + <string name="no_filtered_recent_people" value="Vous n'avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/people/Rechercher [SEARCH_TERM]]."/> + <string name="no_one_near" value="Personne près de vous. Pour rechercher des résidents avec qui passer du temps, voir [secondlife:///app/search/people Rechercher] ou [secondlife:///app/worldmap Carte du monde]."/> + <string name="no_one_filtered_near" value="Vous n'avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/people/Rechercher [SEARCH_TERM]]."/> <string name="no_friends_online" value="Pas d'amis connectés"/> <string name="no_friends" value="Pas d'amis"/> - <string name="no_groups" value="Pas de groupes"/> + <string name="no_friends_msg"> + Pour rechercher des amis, utilisez [secondlife:///app/search/people Rechercher] ou cliquez-droit sur le résident à ajouter comme ami. +Pour rechercher des résidents avec qui passer du temps, utilisez [secondlife:///app/worldmap Carte du monde]. + </string> + <string name="no_filtered_friends_msg"> + Vous n'avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/people/Rechercher [SEARCH_TERM]]. + </string> <string name="people_filter_label" value="Filtrer les personnes"/> <string name="groups_filter_label" value="Filtrer les groupes"/> + <string name="no_filtered_groups_msg" value="Vous n'avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/groups/Rechercher [SEARCH_TERM]]."/> + <string name="no_groups_msg" value="Vous souhaitez trouver des groupes à rejoindre ? Utilisez [secondlife:///app/search/groups Rechercher]."/> <filter_editor label="Filtre" name="filter_input"/> <tab_container name="tabs"> <panel label="PRÈS DE VOUS" name="nearby_panel"> @@ -16,18 +26,18 @@ <button name="add_friend_btn" tool_tip="Ajouter le résident sélectionné à votre liste d'amis"/> </panel> </panel> - <panel label="AMIS" name="friends_panel"> + <panel label="MES AMIS" name="friends_panel"> <accordion name="friends_accordion"> <accordion_tab name="tab_online" title="En ligne"/> <accordion_tab name="tab_all" title="Tout"/> </accordion> <panel label="bottom_panel" name="bottom_panel"> <button name="friends_viewsort_btn" tool_tip="Options"/> - <button name="add_btn" tool_tip="Proposer à ce résident de devenir votre ami"/> + <button name="add_btn" tool_tip="Proposer à un résident de devenir votre ami"/> <button name="del_btn" tool_tip="Supprimer le résident sélectionné de votre liste d'amis"/> </panel> </panel> - <panel label="GROUPES" name="groups_panel"> + <panel label="MES GROUPES" name="groups_panel"> <panel label="bottom_panel" name="bottom_panel"> <button name="groups_viewsort_btn" tool_tip="Options"/> <button name="plus_btn" tool_tip="Rejoindre/créer un nouveau groupe"/> @@ -45,10 +55,10 @@ <button label="Profil" name="view_profile_btn" tool_tip="Afficher la photo, les groupes et autres infos des résidents"/> <button label="IM" name="im_btn" tool_tip="Ouvrir une session IM"/> <button label="Appeler" name="call_btn" tool_tip="Appeler ce résident"/> - <button label="Partager" name="share_btn"/> - <button label="Téléporter" name="teleport_btn" tool_tip="Proposez une téléportation"/> - <button label="Profil du groupe" name="group_info_btn" tool_tip="Voir le profil du groupe"/> - <button label="Chat de groupe" name="chat_btn" tool_tip="Ouvrir une session de chat"/> - <button label="Appel de groupe" name="group_call_btn" tool_tip="Appeler ce groupe"/> + <button label="Partager" name="share_btn" tool_tip="Partager un article d'inventaire"/> + <button label="Téléporter" name="teleport_btn" tool_tip="Proposer une téléportation"/> + <button label="Profil" name="group_info_btn" tool_tip="Voir le profil du groupe"/> + <button label="Chat" name="chat_btn" tool_tip="Ouvrir une session de chat"/> + <button label="Appel" name="group_call_btn" tool_tip="Appeler ce groupe"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_place_profile.xml b/indra/newview/skins/default/xui/fr/panel_place_profile.xml index 7ff796a61f..731e045019 100644 --- a/indra/newview/skins/default/xui/fr/panel_place_profile.xml +++ b/indra/newview/skins/default/xui/fr/panel_place_profile.xml @@ -6,7 +6,7 @@ <string name="available" value="disponible"/> <string name="allocated" value="affecté"/> <string name="title_place" value="Profil du lieu"/> - <string name="title_teleport_history" value="Emplacement de l'historique des téléportations"/> + <string name="title_teleport_history" value="Historique des téléportations"/> <string name="not_available" value="(s/o)"/> <string name="unknown" value="(inconnu)"/> <string name="public" value="(public)"/> @@ -18,16 +18,16 @@ <string name="all_residents_text" value="Tous les résidents"/> <string name="group_text" value="Groupe"/> <string name="can_resell"> - Le terrain acheté dans cette région peut être revendu. + Le terrain acheté dans la région peut être revendu. </string> <string name="can_not_resell"> - Le terrain acheté dans cette région ne peut pas être revendu. + Le terrain acheté dans la région ne peut pas être revendu. </string> <string name="can_change"> - Le terrain acheté dans cette région peut être fusionné ou divisé. + Le terrain acheté dans la région peut être fusionné ou divisé. </string> <string name="can_not_change"> - Le terrain acheté dans cette région ne peut pas être fusionné ou divisé. + Le terrain acheté dans la région ne peut être fusionné ou divisé. </string> <string name="server_update_text"> Les informations sur le lieu ne sont pas disponibles sans mise à jour du serveur. @@ -36,26 +36,11 @@ Aucune information sur ce lieu n'est disponible actuellement, veuillez réessayer ultérieurement. </string> <string name="server_forbidden_text"> - Les informations sur ce lieu ne sont pas disponibles car l'accès y est restreint. Veuillez vérifier vos permissions auprès du propriétaire de la parcelle. + Les informations sur ce lieu ne sont pas disponibles car l'accès y est restreint. Veuillez vérifier vos droits auprès du propriétaire de la parcelle. </string> <string name="acquired_date"> [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local] </string> - <string name="icon_PG" value="parcel_drk_PG"/> - <string name="icon_M" value="parcel_drk_M"/> - <string name="icon_R" value="parcel_drk_R"/> - <string name="icon_Voice" value="parcel_drk_Voice"/> - <string name="icon_VoiceNo" value="parcel_drk_VoiceNo"/> - <string name="icon_Fly" value="parcel_drk_Fly"/> - <string name="icon_FlyNo" value="parcel_drk_FlyNo"/> - <string name="icon_Push" value="parcel_drk_Push"/> - <string name="icon_PushNo" value="parcel_drk_PushNo"/> - <string name="icon_Build" value="parcel_drk_Build"/> - <string name="icon_BuildNo" value="parcel_drk_BuildNo"/> - <string name="icon_Scripts" value="parcel_drk_Scripts"/> - <string name="icon_ScriptsNo" value="parcel_drk_ScriptsNo"/> - <string name="icon_Damage" value="parcel_drk_Damage"/> - <string name="icon_DamageNo" value="parcel_drk_DamageNo"/> <button name="back_btn" tool_tip="Précédent"/> <text name="title" value="Profil du lieu"/> <scroll_container name="place_scroll"> @@ -68,59 +53,59 @@ <text name="maturity_value" value="(inconnu)"/> <accordion name="advanced_info_accordion"> <accordion_tab name="parcel_characteristics_tab" title="Parcelle"> - <panel> - <text name="rating_label" value="Catégorie :"/> - <text name="rating_value" value="(inconnu)"/> - <text name="voice_label" value="Voix :"/> - <text name="voice_value" value="Activée"/> - <text name="fly_label" value="Voler :"/> + <panel name="parcel_characteristics_panel"> + <text name="rating_label" value="Catégorie :"/> + <text name="rating_value" value="inconnu"/> + <text name="voice_label" value="Voix :"/> + <text name="voice_value" value="Activé"/> + <text name="fly_label" value="Voler :"/> <text name="fly_value" value="Activé"/> - <text name="push_label" value="Appuyer :"/> + <text name="push_label" value="Pousser :"/> <text name="push_value" value="Désactivé"/> - <text name="build_label" value="Construire :"/> + <text name="build_label" value="Construire :"/> <text name="build_value" value="Activé"/> - <text name="scripts_label" value="Scripts :"/> - <text name="scripts_value" value="Activés"/> - <text name="damage_label" value="Dégâts :"/> - <text name="damage_value" value="Désactivés"/> - <button label="À propos des terrains" name="about_land_btn"/> + <text name="scripts_label" value="Scripts :"/> + <text name="scripts_value" value="Activé"/> + <text name="damage_label" value="Dégâts :"/> + <text name="damage_value" value="Désactivé"/> + <button label="À propos du terrain" name="about_land_btn"/> </panel> </accordion_tab> <accordion_tab name="region_information_tab" title="Région"> - <panel> + <panel name="region_information_panel"> <text name="region_name_label" value="Région :"/> <text name="region_name" value="Pays des orignaux"/> - <text name="region_type_label" value="Type :"/> + <text name="region_type_label" value="Type :"/> <text name="region_type" value="Orignal"/> - <text name="region_rating_label" value="Catégorie :"/> + <text name="region_rating_label" value="Catégorie :"/> <text name="region_rating" value="Adulte"/> - <text name="region_owner_label" value="Propriétaire :"/> + <text name="region_owner_label" value="Propriétaire :"/> <text name="region_owner" value="orignal Van Orignal"/> - <text name="region_group_label" value="Groupe :"/> + <text name="region_group_label" value="Groupe :"/> <text name="region_group"> - Le puissant orignal d'Orignalville + Le puissant orignal d’Orignalville </text> <button label="Région/Domaine" name="region_info_btn"/> </panel> </accordion_tab> <accordion_tab name="estate_information_tab" title="Domaine"> - <panel> - <text name="estate_name_label" value="Domaine :"/> - <text name="estate_rating_label" value="Catégorie :"/> - <text name="estate_owner_label" value="Propriétaire :"/> - <text name="covenant_label" value="Règlement :"/> + <panel name="estate_information_panel"> + <text name="estate_name_label" value="Domaine :"/> + <text name="estate_rating_label" value="Catégorie :"/> + <text name="estate_owner_label" value="Propriétaire :"/> + <text name="covenant_label" value="Règlement :"/> </panel> </accordion_tab> <accordion_tab name="sales_tab" title="À vendre"> - <panel> - <text name="sales_price_label" value="Prix :"/> + <panel name="sales_panel"> + <text name="sales_price_label" value="Prix :"/> <text name="area_label" value="Surface :"/> <text name="traffic_label" value="Trafic :"/> <text name="primitives_label" value="Prims :"/> - <text name="parcel_scripts_label" value="Scripts :"/> - <text name="terraform_limits_label" value="Limites de terraformage :"/> - <text name="subdivide_label" value="Possibilité de division/fusion :"/> - <text name="resale_label" value="Possibilité de revente :"/> + <text name="parcel_scripts_label" value="Scripts :"/> + <text name="terraform_limits_label" value="Limites de terraformage :"/> + <text name="subdivide_label" value="Possibilité de sous-division/fusion :"/> + <text name="resale_label" value="Possibilité de revente :"/> <text name="sale_to_label" value="À vendre à :"/> </panel> </accordion_tab> diff --git a/indra/newview/skins/default/xui/fr/panel_places.xml b/indra/newview/skins/default/xui/fr/panel_places.xml index 3cea86a3e4..9990c4612d 100644 --- a/indra/newview/skins/default/xui/fr/panel_places.xml +++ b/indra/newview/skins/default/xui/fr/panel_places.xml @@ -1,15 +1,16 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Lieux" name="places panel"> <string name="landmarks_tab_title" value="MES REPÈRES"/> - <string name="teleport_history_tab_title" value="HISTORIQUE DES TÉLÉPORTATIONS"/> - <filter_editor label="Filtrer les lieux" name="Filter"/> + <string name="teleport_history_tab_title" value="HISTORIQUE DES TÉLÉP."/> + <filter_editor label="Filtrer les endroits" name="Filter"/> <panel name="button_panel"> <button label="Téléporter" name="teleport_btn" tool_tip="Me téléporter jusqu'à la zone sélectionnée"/> <button label="Carte" name="map_btn"/> <button label="Éditer" name="edit_btn" tool_tip="Modifier les informations du repère"/> - <button name="overflow_btn" tool_tip="Afficher d'autres options"/> - <button label="Fermer" name="close_btn"/> - <button label="Annuler" name="cancel_btn"/> + <button label="â–¼" name="overflow_btn" tool_tip="Afficher d'autres options"/> <button label="Enregistrer" name="save_btn"/> + <button label="Annuler" name="cancel_btn"/> + <button label="Fermer" name="close_btn"/> + <button label="Profil" name="profile_btn"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/fr/panel_preferences_advanced.xml index 04abcc8aad..6b8e68bd98 100644 --- a/indra/newview/skins/default/xui/fr/panel_preferences_advanced.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_advanced.xml @@ -1,48 +1,37 @@ <?xml version="1.0" encoding="utf-8"?> -<panel name="advanced"> - <panel.string name="resolution_format"> - [RES_X] x [RES_Y] - </panel.string> +<panel label="Avancées" name="advanced"> <panel.string name="aspect_ratio_text"> [NUM]:[DEN] </panel.string> - <check_box label="Bulles de chat" name="bubble_text_chat"/> - <color_swatch name="background" tool_tip="Choisir la couleur des bulles de chat"/> - <slider label="Opacité" name="bubble_chat_opacity"/> - <text name="AspectRatioLabel1" tool_tip="largeur/hauteur"> - Rapport hauteur/largeur - </text> - <combo_box name="aspect_ratio" tool_tip="largeur/hauteur"> - <combo_box.item label="4:3 (Standard CRT)" name="item1"/> - <combo_box.item label="5:4 (1280 x 1024 LCD)" name="item2"/> - <combo_box.item label="8:5 (écran large)" name="item3"/> - <combo_box.item label="16:9 (plein écran)" name="item4"/> - </combo_box> - <check_box label="Détection automatique" name="aspect_auto_detect"/> - <text name="heading1"> - Caméra : - </text> + <panel.string name="middle_mouse"> + Bouton central de la souris + </panel.string> <slider label="Angle de vue" name="camera_fov"/> <slider label="Distance" name="camera_offset_scale"/> <text name="heading2"> - Positionnement automatique pour : + Positionnement automatique pour : </text> - <check_box label="Construire/Éditer" name="edit_camera_movement" tool_tip="Utilisez le positionnement automatique de la caméra quand vous accédez au mode de modification et quand vous le quittez"/> + <check_box label="Construire/Modifier" name="edit_camera_movement" tool_tip="Utilisez le positionnement automatique de la caméra quand vous accédez au mode de modification et quand vous le quittez"/> <check_box label="Apparence" name="appearance_camera_movement" tool_tip="Utiliser le positionnement automatique de la caméra quand je suis en mode Édition"/> - <text name="heading3"> - Avatars : - </text> + <check_box label="Panneau latéral" name="appearance_sidebar_positioning" tool_tip="Positionnement auto de la caméra pour le panneau latéral"/> <check_box label="Afficher en vue subjective" name="first_person_avatar_visible"/> <check_box label="Les touches de direction me font toujours me déplacer" name="arrow_keys_move_avatar_check"/> <check_box label="Appuyer deux fois et maintenir enfoncé pour courir" name="tap_tap_hold_to_run"/> <check_box label="Faire bouger les lèvres de l'avatar quand il parle" name="enable_lip_sync"/> - <check_box label="Afficher les erreurs de script" name="show_script_errors"/> + <check_box label="Bulles de chat" name="bubble_text_chat"/> + <slider label="Opacité" name="bubble_chat_opacity"/> + <color_swatch name="background" tool_tip="Choisir la couleur des bulles de chat"/> + <text name="UI Size:"> + Taille de l'interface + </text> + <check_box label="Afficher les erreurs de script dans :" name="show_script_errors"/> <radio_group name="show_location"> - <radio_item label="En chat" name="0"/> - <radio_item label="Dans une fenêtre" name="1"/> + <radio_item label="Chat près de moi" name="0"/> + <radio_item label="Autre fenêtre" name="1"/> </radio_group> - <check_box label="Basculer le mode micro quand j'appuie sur la touche de contrôle de la fonction Parler :" name="push_to_talk_toggle_check" tool_tip="En mode bascule, appuyez une fois sur la touche de contrôle de la fonction, puis relâchez-la pour activer/désactiver votre micro. Si vous n'êtes pas en mode bascule, le micro ne diffuse votre voix que quand vous maintenez la touche de contrôle de la fonction enfoncée."/> + <check_box label="Activer/désactiver la fonction Parler quand j'appuie sur :" name="push_to_talk_toggle_check" tool_tip="En mode bascule, appuyez une fois sur la touche de contrôle de la fonction, puis relâchez-la pour activer/désactiver votre micro. Si vous n'êtes pas en mode bascule, le micro ne diffuse votre voix que quand vous maintenez la touche de contrôle de la fonction enfoncée."/> <line_editor label="Touche de contrôle de la fonction Appuyer pour parler" name="modifier_combo"/> <button label="Définir la touche" name="set_voice_hotkey_button"/> - <button label="Bouton central de la souris" name="set_voice_middlemouse_button"/> + <button label="Bouton central de la souris" name="set_voice_middlemouse_button" tool_tip="Réinitialiser sur le bouton central de la souris"/> + <button label="Autres accessoires" name="joystick_setup_button"/> </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_alerts.xml b/indra/newview/skins/default/xui/fr/panel_preferences_alerts.xml index 73f4e1e2bd..901a92ed1b 100644 --- a/indra/newview/skins/default/xui/fr/panel_preferences_alerts.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_alerts.xml @@ -6,9 +6,9 @@ <check_box label="Quand je dépense ou que je reçois des L$" name="notify_money_change_checkbox"/> <check_box label="Quand mes amis se connectent ou se déconnectent" name="friends_online_notify_checkbox"/> <text name="show_label"> - Toujours afficher ces notifications : + Toujours afficher : </text> <text name="dont_show_label"> - Ne jamais afficher ces notifications : + Ne jamais afficher : </text> </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml b/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml index 25a8e3b6d4..76f3319525 100644 --- a/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml @@ -1,10 +1,16 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Chat écrit" name="chat"> + <text name="font_size"> + Taille de la police : + </text> <radio_group name="chat_font_size"> - <radio_item label="Moins" name="radio" value="0"/> + <radio_item label="Petite" name="radio" value="0"/> <radio_item label="Moyenne" name="radio2" value="1"/> - <radio_item label="Plus" name="radio3" value="2"/> + <radio_item label="Grande" name="radio3" value="2"/> </radio_group> + <text name="font_colors"> + Couleurs de police : + </text> <color_swatch label="Vous" name="user"/> <text name="text_box1"> Moi @@ -39,9 +45,15 @@ </text> <check_box initial_value="true" label="Jouer l'animation clavier quand vous écrivez" name="play_typing_animation"/> <check_box label="M'envoyer les IM par e-mail une fois déconnecté" name="send_im_to_email"/> - <check_box label="Activer l'historique des chats en texte brut" name="plain_text_chat_history"/> + <check_box label="Activer l'historique des chats et des IM en texte brut" name="plain_text_chat_history"/> + <text name="show_ims_in_label"> + Afficher les IM dans : + </text> + <text name="requires_restart_label"> + (redémarrage requis) + </text> <radio_group name="chat_window" tool_tip="Afficher vos messages instantanés dans plusieurs fenêtres ou dans une seule fenêtre avec plusieurs onglets (redémarrage requis)"> <radio_item label="Plusieurs fenêtres" name="radio" value="0"/> - <radio_item label="Une fenêtre" name="radio2" value="1"/> + <radio_item label="Onglets" name="radio2" value="1"/> </radio_group> </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_general.xml b/indra/newview/skins/default/xui/fr/panel_preferences_general.xml index b359cf56d8..8e8ee26af4 100644 --- a/indra/newview/skins/default/xui/fr/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_general.xml @@ -44,17 +44,17 @@ <radio_item label="Activé" name="radio2" value="1"/> <radio_item label="Afficher brièvement" name="radio3" value="2"/> </radio_group> - <check_box label="Afficher mon nom" name="show_my_name_checkbox1"/> + <check_box label="Montrer mon nom" name="show_my_name_checkbox1"/> <check_box initial_value="true" label="Affichage en petit" name="small_avatar_names_checkbox"/> <check_box label="Afficher les titres de groupe" name="show_all_title_checkbox1"/> <text name="effects_color_textbox"> Mes effets : </text> <text name="title_afk_text"> - Délai d'absence : + Me montrer absent après : </text> <color_swatch label="" name="effect_color_swatch" tool_tip="Cliquer pour ouvrir le sélecteur de couleurs"/> - <combo_box label="Délai d'absence :" name="afk"> + <combo_box label="Me montrer absent après :" name="afk"> <combo_box.item label="2 minutes" name="item0"/> <combo_box.item label="5 minutes" name="item1"/> <combo_box.item label="10 minutes" name="item2"/> diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml index 4459244395..c7caf5c2ff 100644 --- a/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml @@ -1,27 +1,13 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Graphiques" name="Display panel"> - <text name="WindowSizeLabel"> - Taille de la fenêtre : - </text> - <check_box label="Utiliser le plein écran" name="windowed mode"/> - <combo_box name="windowsize combo"> - <combo_box.item label="640 x 480" name="640x480"/> - <combo_box.item label="800 x 600" name="800x600"/> - <combo_box.item label="720 x 480 (NTSC)" name="720x480"/> - <combo_box.item label="768 x 576 (PAL)" name="768x576"/> - <combo_box.item label="1024 x 768" name="1024x768"/> - </combo_box> - <text name="UI Size:"> - Taille de l'interface : - </text> <text name="QualitySpeed"> Qualité et vitesse : </text> - <text left="105" name="FasterText"> + <text name="FasterText"> Plus rapide </text> <text name="BetterText"> - Meilleur + Meilleure </text> <text name="ShadersPrefText"> Faible @@ -62,7 +48,11 @@ <text name="DrawDistanceMeterText2"> m </text> - <slider label="Nombre de particules max. :" label_width="143" name="MaxParticleCount"/> + <slider label="Nombre de particules max. :" label_width="147" name="MaxParticleCount"/> + <slider label="Limite d'affichage max des avatars :" name="MaxAvatarDrawDistance"/> + <text name="DrawDistanceMeterText3"> + m + </text> <slider label="Qualité post-traitement :" name="RenderPostProcess"/> <text name="MeshDetailText"> Détails des rendus : @@ -98,8 +88,8 @@ Sources lumineuses : </text> <radio_group name="LightingDetailRadio"> - <radio_item label="Soleil et lune uniquement" name="SunMoon"/> - <radio_item label="Lumières à proximité" name="LocalLights"/> + <radio_item label="Soleil et lune uniquement" name="SunMoon" value="0"/> + <radio_item label="Lumières à proximité" name="LocalLights" value="1"/> </radio_group> <text left="380" name="TerrainDetailText"> Rendu du terrain : diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/fr/panel_preferences_privacy.xml index 88b68d1a06..f14ccc3a8e 100644 --- a/indra/newview/skins/default/xui/fr/panel_preferences_privacy.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_privacy.xml @@ -3,7 +3,7 @@ <panel.string name="log_in_to_change"> se connecter pour changer </panel.string> - <button label="Vider le cache" name="clear_cache"/> + <button label="Vider le cache" name="clear_cache" tool_tip="Effacer l'image de connexion, le dernier lieu, l'historique des téléportations et la texture du cache."/> <text name="cache_size_label_l"> (Endroits, images, web, historique des recherches) </text> @@ -11,14 +11,12 @@ <check_box label="Seuls mes amis et groupes peuvent m'appeler ou m'envoyer un IM" name="voice_call_friends_only_check"/> <check_box label="Fermer le micro à la fin d'un appel" name="auto_disengage_mic_check"/> <check_box label="Accepter les cookies" name="cookies_enabled"/> - <check_box label="Média activé" name="media_enabled"/> - <check_box label="Autoriser la lecture automatique du média" name="autoplay_enabled"/> <text name="Logs:"> Journaux : </text> <check_box label="Sauvegarder les chats près de moi sur mon ordinateur" name="log_nearby_chat"/> <check_box label="Sauvegarder les IM sur mon ordinateur" name="log_instant_messages"/> - <check_box label="Inclure les heures" name="show_timestamps_check_im"/> + <check_box label="Inclure les dates et heures" name="show_timestamps_check_im"/> <text name="log_path_desc"> Emplacement : </text> diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_setup.xml b/indra/newview/skins/default/xui/fr/panel_preferences_setup.xml index 68a735df90..eae49e7810 100644 --- a/indra/newview/skins/default/xui/fr/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_setup.xml @@ -17,30 +17,33 @@ <text name="text_box2"> kbps </text> - <check_box label="Port de connexion personnalisé" name="connection_port_enabled"/> - <spinner label="Numéro de port :" name="web_proxy_port"/> + <check_box label="Port de connexion" name="connection_port_enabled"/> + <spinner label="Numéro :" name="connection_port"/> <text name="cache_size_label_l"> Taille de la mémoire </text> <text name="text_box5"> Mo </text> - <button label="Parcourir" label_selected="Parcourir" name="set_cache"/> - <button label="Réinitialiser" label_selected="Réinitialiser" name="reset_cache"/> <text name="Cache location"> Emplacement du cache : </text> + <button label="Parcourir" label_selected="Parcourir" name="set_cache"/> + <button label="Réinitialiser" label_selected="Réinitialiser" name="reset_cache"/> <text name="Web:"> Web : </text> <radio_group name="use_external_browser"> - <radio_item label="Utiliser le navigateur intégré" name="internal" tool_tip="Utilisez le navigateur intégré pour obtenir de l'aide, ouvrir des liens, etc. Ce navigateur s'ouvre dans [APP_NAME]."/> - <radio_item label="Utiliser mon navigateur (IE, Firefox etc.)" name="external" tool_tip="Utiliser le navigateur web système par défaut pour l'aide, les liens etc. Non recommandé en mode plein écran."/> + <radio_item label="Utiliser mon navigateur (IE, Firefox, Safari)" name="external" tool_tip="Utiliser le navigateur web système par défaut pour l'aide, les liens etc. Non recommandé en mode plein écran." value="1"/> + <radio_item label="Utiliser le navigateur intégré" name="internal" tool_tip="Utilisez le navigateur intégré pour obtenir de l'aide, ouvrir des liens, etc. Ce navigateur s'ouvre dans [APP_NAME]." value=""/> </radio_group> - <check_box initial_value="false" label="Proxy web" name="web_proxy_enabled"/> - <line_editor name="web_proxy_editor" tool_tip="Le nom ou adresse IP du proxy que vous souhaitez utiliser"/> - <button label="Parcourir" label_selected="Parcourir" name="set_proxy"/> + <check_box initial_value="true" label="Activer les plugins" name="browser_plugins_enabled"/> + <check_box initial_value="true" label="Accepter les cookies" name="cookies_enabled"/> + <check_box initial_value="true" label="Activer Javascript" name="browser_javascript_enabled"/> + <check_box initial_value="false" label="Activer le proxy Web" name="web_proxy_enabled"/> <text name="Proxy location"> Emplacement du proxy : </text> + <line_editor name="web_proxy_editor" tool_tip="Le nom ou adresse IP du proxy que vous souhaitez utiliser"/> + <spinner label="Numéro de port :" label_width="95" name="web_proxy_port" width="170"/> </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml b/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml index 4f5ef423f5..c9676c898b 100644 --- a/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml @@ -1,16 +1,23 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Sons" name="Preference Media panel"> <slider label="Volume principal" name="System Volume"/> - <check_box initial_value="true" label="Couper le son si minimisé" name="mute_when_minimized"/> - <slider label="Ambiant" name="Wind Volume"/> + <check_box initial_value="true" label="Couper quand minimisé" name="mute_when_minimized"/> <slider label="Boutons" name="UI Volume"/> - <slider label="Média" name="Media Volume"/> + <slider label="Ambiant" name="Wind Volume"/> <slider label="Effets sonores" name="SFX Volume"/> <slider label="Flux musical" name="Music Volume"/> - <check_box label="Activer le chat vocal" name="enable_voice_check"/> + <check_box label="Activé" name="music_enabled"/> + <slider label="Média" name="Media Volume"/> + <check_box label="Activé" name="enable_media"/> <slider label="Chat vocal" name="Voice Volume"/> + <check_box label="Activé" name="enable_voice_check"/> + <check_box label="Autoriser la lecture automatique du média" name="media_auto_play_btn" tool_tip="Cochez pour autoriser la lecture automatique du média"/> + <check_box label="Jouer le média aux autres avatars" name="media_show_on_others_btn" tool_tip="Décochez pour masquer le média aux autres avatars près de vous"/> + <text name="voice_chat_settings"> + Paramètres du chat vocal + </text> <text name="Listen from"> - Écouter à partir de : + Écouter à partir de : </text> <radio_group name="ear_location"> <radio_item label="Position de la caméra" name="0"/> diff --git a/indra/newview/skins/default/xui/fr/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/fr/panel_prim_media_controls.xml index c7ab31c4b3..f6b9bdcb81 100644 --- a/indra/newview/skins/default/xui/fr/panel_prim_media_controls.xml +++ b/indra/newview/skins/default/xui/fr/panel_prim_media_controls.xml @@ -31,7 +31,7 @@ <button name="stop_btn" tool_tip="Arrêter le chargement"/> </layout_panel> <layout_panel name="play"> - <button name="play_btn" tool_tip="Jouer le média"/> + <button name="play_btn" tool_tip="Lire le média"/> </layout_panel> <layout_panel name="pause"> <button name="pause_btn" tool_tip="Pauser le média"/> diff --git a/indra/newview/skins/default/xui/fr/panel_profile.xml b/indra/newview/skins/default/xui/fr/panel_profile.xml index 0c33a0f1e0..f1c12c9fee 100644 --- a/indra/newview/skins/default/xui/fr/panel_profile.xml +++ b/indra/newview/skins/default/xui/fr/panel_profile.xml @@ -24,25 +24,29 @@ <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/> </panel> <panel name="first_life_image_panel"> - <text name="title_rw_descr_text" value="Monde physique :"/> + <text name="title_rw_descr_text" value="Vie réelle :"/> </panel> <text name="title_member_text" value="Résident depuis :"/> <text name="title_acc_status_text" value="Statut du compte :"/> - <text name="acc_status_text"> + <text_editor name="acc_status_text"> Résident. Aucune info de paiement enregistrée. Linden. - </text> + </text_editor> <text name="title_partner_text" value="Partenaire :"/> + <panel name="partner_data_panel"> + <name_box initial_value="(récupération en cours)" name="partner_text"/> + </panel> <text name="title_groups_text" value="Groupes :"/> </panel> </scroll_container> </layout_panel> <layout_panel name="profile_buttons_panel"> - <button label="Devenir amis" name="add_friend" tool_tip="Proposer à ce résident de devenir votre ami"/> + <button label="Devenir amis" name="add_friend" tool_tip="Proposer à un résident de devenir votre ami"/> <button label="IM" name="im" tool_tip="Ouvrir une session IM"/> <button label="Appeler" name="call" tool_tip="Appeler ce résident"/> <button label="Carte" name="show_on_map_btn" tool_tip="Afficher le résident sur la carte"/> - <button label="Téléporter" name="teleport" tool_tip="Proposez une téléportation"/> + <button label="Téléporter" name="teleport" tool_tip="Proposer une téléportation"/> + <button label="â–¼" name="overflow_btn" tool_tip="Payer ou partager l'inventaire avec le résident"/> </layout_panel> <layout_panel name="profile_me_buttons_panel"> <button label="Modifier le profil" name="edit_profile_btn" tool_tip="Modifier vos informations personnelles"/> diff --git a/indra/newview/skins/default/xui/fr/panel_region_covenant.xml b/indra/newview/skins/default/xui/fr/panel_region_covenant.xml index cf9f4e0fd0..a30306d116 100644 --- a/indra/newview/skins/default/xui/fr/panel_region_covenant.xml +++ b/indra/newview/skins/default/xui/fr/panel_region_covenant.xml @@ -18,7 +18,7 @@ <text name="estate_cov_lbl"> Règlement : </text> - <text name="covenant_timestamp_text"> + <text name="covenant_timestamp_text" width="350"> Dernière modification le mercredi 31 décembre 1969 16:00:00 </text> <button label="?" name="covenant_help"/> @@ -27,8 +27,8 @@ </text_editor> <button label="Réinitialiser" name="reset_covenant"/> <text name="covenant_help_text"> - Les changements apportés au règlement apparaîtront sur toutes - les parcelles du domaine. + Les changements apportés au règlement apparaîtront sur +toutes les parcelles du domaine. </text> <text bottom_delta="-31" name="covenant_instructions"> Faire glisser une note pour changer le règlement de ce domaine. @@ -70,13 +70,12 @@ Le terrain acheté dans cette région peut être revendu. </string> <string name="can_not_resell"> - Le terrain acheté dans cette région ne peut pas être revendu. + Le terrain acheté dans la région ne peut pas être revendu. </string> <string name="can_change"> - Le terrain acheté dans cette région peut être fusionné ou divisé. + Le terrain acheté dans la région peut être fusionné ou divisé. </string> <string name="can_not_change"> - Le terrain acheté dans cette région ne peut pas être fusionné ou -divisé. + Le terrain acheté dans la région ne peut être fusionné ou divisé. </string> </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_region_debug.xml b/indra/newview/skins/default/xui/fr/panel_region_debug.xml index 0fabf92889..cb4a74e142 100644 --- a/indra/newview/skins/default/xui/fr/panel_region_debug.xml +++ b/indra/newview/skins/default/xui/fr/panel_region_debug.xml @@ -13,7 +13,7 @@ <check_box label="Désactiver la physique" name="disable_physics_check" tool_tip="Désactiver tous les effets liés à la physique dans cette région"/> <button label="?" name="disable_physics_help"/> <button bottom_delta="-38" label="Appliquer" name="apply_btn"/> - <text bottom_delta="-42" name="objret_text_lbl"> + <text bottom_delta="-42" name="objret_text_lbl" width="260"> Renvoi de l'objet </text> <text name="resident_text_lbl"> diff --git a/indra/newview/skins/default/xui/fr/panel_region_estate.xml b/indra/newview/skins/default/xui/fr/panel_region_estate.xml index a0282dd940..fb650ff646 100644 --- a/indra/newview/skins/default/xui/fr/panel_region_estate.xml +++ b/indra/newview/skins/default/xui/fr/panel_region_estate.xml @@ -1,9 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Domaine" name="Estate"> <text bottom="-34" name="estate_help_text"> - Les modifications des paramètres de cet onglet affecteront toutes les régions du domaine. + Les modifications des paramètres de cet +onglet affecteront toutes les régions du +domaine. </text> - <text bottom_delta="-34" name="estate_text"> + <text bottom_delta="-34" name="estate_text" top_pad="8"> Domaine : </text> <text name="estate_name"> @@ -18,8 +20,8 @@ <text name="Only Allow"> Limiter l'accès aux comptes vérifiés par : </text> - <check_box label="Informations de paiement enregistrées" name="limit_payment" tool_tip="Bannir les résidents non identifiés"/> - <check_box label="Vérification de mon âge" name="limit_age_verified" tool_tip="Bannir les résidents qui n'ont pas vérifié leur âge. Consultez la page [SUPPORT_SITE] pour plus d'informations."/> + <check_box label="Infos de paiement enregistrées" name="limit_payment" tool_tip="Bannir les résidents non identifiés"/> + <check_box label="Vérification de l'âge" name="limit_age_verified" tool_tip="Bannir les résidents qui n'ont pas vérifié leur âge. Consultez la page [SUPPORT_SITE] pour plus d'informations."/> <check_box label="Autoriser les chats vocaux" name="voice_chat_check"/> <button label="?" name="voice_chat_help"/> <text name="abuse_email_text"> @@ -71,6 +73,6 @@ <button label="?" name="ban_resident_help"/> <button label="Ajouter..." name="add_banned_avatar_btn"/> <button label="Supprimer..." name="remove_banned_avatar_btn"/> - <button label="Envoyer un message au domaine..." name="message_estate_btn"/> - <button label="Éjecter le résident du domaine..." name="kick_user_from_estate_btn"/> + <button label="Message au domaine..." name="message_estate_btn"/> + <button label="Éjecter du domaine..." name="kick_user_from_estate_btn"/> </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_region_general.xml b/indra/newview/skins/default/xui/fr/panel_region_general.xml index 8a59adbd93..925f4375da 100644 --- a/indra/newview/skins/default/xui/fr/panel_region_general.xml +++ b/indra/newview/skins/default/xui/fr/panel_region_general.xml @@ -19,35 +19,25 @@ (inconnu) </text> <check_box label="Interdire le terraformage" name="block_terraform_check"/> - <button label="?" name="terraform_help"/> <check_box label="Interdire le vol" name="block_fly_check"/> - <button label="?" name="fly_help"/> <check_box label="Autoriser les dégâts" name="allow_damage_check"/> - <button label="?" name="damage_help"/> <check_box label="Interdire les bousculades" name="restrict_pushobject"/> - <button label="?" name="restrict_pushobject_help"/> <check_box label="Autoriser la revente" name="allow_land_resell_check"/> - <button label="?" name="land_resell_help"/> <check_box label="Autoriser la fusion/division" name="allow_parcel_changes_check"/> - <button label="?" name="parcel_changes_help"/> <check_box label="Ne pas afficher dans la recherche" name="block_parcel_search_check" tool_tip="Afficher cette région et ses parcelles dans les résultats de recherche"/> - <button label="?" name="parcel_search_help"/> - <spinner label="Nombre maximum d'avatars" label_width="127" name="agent_limit_spin" width="190"/> - <button label="?" name="agent_limit_help"/> - <spinner label="Bonus objet" label_width="127" name="object_bonus_spin" width="190"/> - <button label="?" name="object_bonus_help"/> + <spinner label="Nombre maximum d'avatars" label_width="160" name="agent_limit_spin" width="240"/> + <spinner label="Bonus objet" label_width="160" name="object_bonus_spin" width="240"/> <text label="Maturité" name="access_text"> Catégorie : </text> - <combo_box label="Modéré" name="access_combo"> - <combo_box.item label="Adult" name="Adult"/> - <combo_box.item label="Modéré" name="Mature"/> - <combo_box.item label="Général" name="PG"/> - </combo_box> - <button label="?" name="access_help"/> + <icons_combo_box label="Modéré" name="access_combo"> + <icons_combo_box.item label="Adult" name="Adult" value="42"/> + <icons_combo_box.item label="Modéré" name="Mature" value="21"/> + <icons_combo_box.item label="Général" name="PG" value="13"/> + </icons_combo_box> <button label="Appliquer" name="apply_btn"/> - <button label="Téléporter un résident chez lui..." name="kick_btn"/> - <button label="Téléporter tous les résidents chez eux..." name="kick_all_btn"/> + <button label="Téléporter un résident chez lui…" name="kick_btn"/> + <button label="Téléporter tous les résidents chez eux…" name="kick_all_btn"/> <button label="Envoyer un message à la région..." name="im_btn"/> <button label="Gérer le Téléhub..." name="manage_telehub_btn"/> </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_region_general_layout.xml b/indra/newview/skins/default/xui/fr/panel_region_general_layout.xml index 0e72bbc9f5..663ae55134 100644 --- a/indra/newview/skins/default/xui/fr/panel_region_general_layout.xml +++ b/indra/newview/skins/default/xui/fr/panel_region_general_layout.xml @@ -3,19 +3,19 @@ <text name="region_text_lbl"> Région : </text> - <text name="region_text"> + <text left_delta="56" name="region_text"> inconnu </text> <text name="version_channel_text_lbl"> Version : </text> - <text name="version_channel_text"> + <text left_delta="56" name="version_channel_text"> inconnu </text> <text name="region_type_lbl"> Type : </text> - <text name="region_type"> + <text left_delta="56" name="region_type"> inconnu </text> <check_box label="Interdire le terraformage" name="block_terraform_check"/> @@ -25,8 +25,8 @@ <check_box label="Autoriser la revente de terrains" name="allow_land_resell_check"/> <check_box label="Autoriser la fusion/division de terrains" name="allow_parcel_changes_check"/> <check_box label="Interdire l'affichage du terrain dans les recherches" name="block_parcel_search_check" tool_tip="Permettre aux autres résidents de voir cette région et ses parcelles dans les résultats de recherche"/> - <spinner label="Nombre maximum d'avatars" name="agent_limit_spin"/> - <spinner label="Bonus objet" name="object_bonus_spin"/> + <spinner label="Nombre maximum d'avatars" label_width="160" name="agent_limit_spin" width="240"/> + <spinner label="Bonus objet" label_width="160" name="object_bonus_spin" width="240"/> <text label="Accès" name="access_text"> Catégorie : </text> @@ -36,8 +36,8 @@ <combo_box.item label="Général" name="PG"/> </combo_box> <button label="Appliquer" name="apply_btn"/> - <button label="Téléporter un résident chez lui..." name="kick_btn"/> - <button label="Téléporter tous les résidents chez eux..." name="kick_all_btn"/> + <button label="Téléporter un résident chez lui…" name="kick_btn"/> + <button label="Téléporter tous les résidents chez eux…" name="kick_all_btn"/> <button label="Envoyer un message à la région..." name="im_btn"/> <button label="Gérer le téléhub..." name="manage_telehub_btn"/> </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_region_texture.xml b/indra/newview/skins/default/xui/fr/panel_region_texture.xml index a7abb49b1a..c0b667137a 100644 --- a/indra/newview/skins/default/xui/fr/panel_region_texture.xml +++ b/indra/newview/skins/default/xui/fr/panel_region_texture.xml @@ -28,25 +28,25 @@ Limites d'élévation de texture </text> <text name="height_text_lbl6"> - Sud-ouest + Nord-ouest </text> <text name="height_text_lbl7"> - Nord-ouest + Nord-est </text> <text name="height_text_lbl8"> - Sud-est + Sud-ouest </text> <text name="height_text_lbl9"> - Nord-est + Sud-est </text> - <text name="height_text_lbl10"> + <text name="height_text_lbl10" width="460"> Ces valeurs représentent les limites de mélange pour les textures ci-dessus. </text> <text name="height_text_lbl11"> - En mètres, la valeur Bas correspond à la hauteur maximum de la texture n°1 et la valeur Haut correspond à la hauteur minimum de la texture n°4. + En mètres, la valeur Bas correspond à la hauteur max. de la texture n°1 </text> <text name="height_text_lbl12"> - et la valeur Haut correspond à la hauteur minimum de la texture n°4. + et la valeur Haut correspond à la hauteur min. de la texture n°4. </text> <text name="height_text_lbl13"> Nord-est @@ -63,10 +63,10 @@ Ces valeurs représentent les limites de mélange pour les textures ci-dessus. </text> <text name="height_text_lbl15"> - En mètres, la valeur BASSE correspond à la hauteur MAXIMUM de la Texture #1, + La valeur Bas correspond à la hauteur max. de la Texture 1, </text> <text name="height_text_lbl16"> - et la valeur HAUTE correspond à la hauteur MINIMUM de la Texture #4. + et la valeur Haut correspond à la hauteur min. de la Texture 4. </text> <button label="Appliquer" name="apply_btn"/> </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_script_limits_my_avatar.xml b/indra/newview/skins/default/xui/fr/panel_script_limits_my_avatar.xml index 24656bf379..e541fae31f 100644 --- a/indra/newview/skins/default/xui/fr/panel_script_limits_my_avatar.xml +++ b/indra/newview/skins/default/xui/fr/panel_script_limits_my_avatar.xml @@ -1,10 +1,13 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="MON AVATAR" name="script_limits_my_avatar_panel"> + <text name="script_memory"> + Utilisation des scripts d'avatars + </text> <text name="loading_text"> Chargement... </text> <scroll_list name="scripts_list"> - <scroll_list.columns label="Taille (Ko)" name="size"/> + <scroll_list.columns label="Taille (Ko)" name="size" width="80"/> <scroll_list.columns label="URL" name="urls"/> <scroll_list.columns label="Nom de l'objet" name="name"/> <scroll_list.columns label="Endroit" name="location"/> diff --git a/indra/newview/skins/default/xui/fr/panel_script_limits_region_memory.xml b/indra/newview/skins/default/xui/fr/panel_script_limits_region_memory.xml index 1e5e680c09..751abd6f1d 100644 --- a/indra/newview/skins/default/xui/fr/panel_script_limits_region_memory.xml +++ b/indra/newview/skins/default/xui/fr/panel_script_limits_region_memory.xml @@ -3,20 +3,18 @@ <text name="script_memory"> Mémoire des scripts de parcelles </text> - <text name="parcels_listed"> - Parcelles possédées : - </text> - <text name="memory_used"> - Mémoire utilisée : - </text> + <text name="parcels_listed"/> + <text name="memory_used"/> <text name="loading_text"> Chargement... </text> <scroll_list name="scripts_list"> - <scroll_list.columns label="Taille (Ko)" name="size"/> + <scroll_list.columns label="Taille (Ko)" name="size" width="80"/> + <scroll_list.columns label="URL" name="urls"/> <scroll_list.columns label="Nom de l'objet" name="name"/> - <scroll_list.columns label="Propriétaire d'objet" name="owner"/> - <scroll_list.columns label="Parcelle/emplacement" name="location"/> + <scroll_list.columns label="Propriétaire d'objet" name="owner" width="140"/> + <scroll_list.columns label="Parcelle" name="parcel"/> + <scroll_list.columns label="Endroit" name="location"/> </scroll_list> <button label="Rafraîchir la liste" name="refresh_list_btn"/> <button label="Surbrillance" name="highlight_btn"/> diff --git a/indra/newview/skins/default/xui/fr/panel_side_tray.xml b/indra/newview/skins/default/xui/fr/panel_side_tray.xml index 3ad1671921..178ae4324b 100644 --- a/indra/newview/skins/default/xui/fr/panel_side_tray.xml +++ b/indra/newview/skins/default/xui/fr/panel_side_tray.xml @@ -2,26 +2,28 @@ <!-- Side tray cannot show background because it is always partially on screen to hold tab buttons. --> <side_tray name="sidebar"> - <sidetray_tab description="Activer/désactiver le panneau latéral." name="sidebar_openclose"/> - <sidetray_tab description="Domicile." name="sidebar_home"> + <sidetray_tab description="Activer/désactiver le panneau latéral." name="sidebar_openclose" tab_title="Activer/désactiver le panneau latéral"/> + <sidetray_tab description="Domicile." name="sidebar_home" tab_title="Accueil"> <panel label="domicile" name="panel_home"/> </sidetray_tab> - <sidetray_tab description="Modifiez votre profil public et vos Favoris." name="sidebar_me"> - <panel label="Moi" name="panel_me"/> + <sidetray_tab description="Modifiez votre profil public et vos Favoris." name="sidebar_me" tab_title="Mon profil"> + <panel_container name="panel_container"> + <panel label="Moi" name="panel_me"/> + </panel_container> </sidetray_tab> - <sidetray_tab description="Trouvez vos amis, vos contacts et les personnes se trouvant près de vous." name="sidebar_people"> + <sidetray_tab description="Trouvez vos amis, vos contacts et les personnes se trouvant près de vous." name="sidebar_people" tab_title="Personnes"> <panel_container name="panel_container"> <panel label="Profil du groupe" name="panel_group_info_sidetray"/> <panel label="Résidents et objets ignorés" name="panel_block_list_sidetray"/> </panel_container> </sidetray_tab> - <sidetray_tab description="Trouvez de nouveaux lieux à découvrir et les lieux que vous connaissez déjà ." label="Lieux" name="sidebar_places"> + <sidetray_tab description="Trouvez de nouveaux lieux à découvrir et les lieux que vous connaissez déjà ." label="Lieux" name="sidebar_places" tab_title="Endroits"> <panel label="Lieux" name="panel_places"/> </sidetray_tab> - <sidetray_tab description="Parcourez votre inventaire." name="sidebar_inventory"> + <sidetray_tab description="Parcourez votre inventaire." name="sidebar_inventory" tab_title="Mon inventaire"> <panel label="Modifier l'inventaire" name="sidepanel_inventory"/> </sidetray_tab> - <sidetray_tab description="Modifiez votre apparence actuelle." name="sidebar_appearance"> + <sidetray_tab description="Modifiez votre apparence actuelle." name="sidebar_appearance" tab_title="Mon apparence"> <panel label="Changer d'apparence" name="sidepanel_appearance"/> </sidetray_tab> </side_tray> diff --git a/indra/newview/skins/default/xui/fr/panel_status_bar.xml b/indra/newview/skins/default/xui/fr/panel_status_bar.xml index ae575a9fac..dffb1d4238 100644 --- a/indra/newview/skins/default/xui/fr/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/fr/panel_status_bar.xml @@ -22,9 +22,10 @@ [AMT] L$ </panel.string> <button label="" label_selected="" name="buycurrency" tool_tip="Mon solde"/> - <button label="Acheter des L$" name="buyL" tool_tip="Cliquez pour acheter plus de L$"/> + <button label="Acheter L$" name="buyL" tool_tip="Cliquez pour acheter plus de L$"/> <text name="TimeText" tool_tip="Heure actuelle (Pacifique)"> - midi + 00h00 PST </text> + <button name="media_toggle_btn" tool_tip="Arrêter tous les médias (musique, vidéo, pages web)"/> <button name="volume_btn" tool_tip="Contrôle du volume global"/> </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_world_map.xml b/indra/newview/skins/default/xui/fr/panel_world_map.xml index e6e95c2605..972aae1fab 100644 --- a/indra/newview/skins/default/xui/fr/panel_world_map.xml +++ b/indra/newview/skins/default/xui/fr/panel_world_map.xml @@ -30,6 +30,12 @@ <panel.string name="world_map_northwest"> NO </panel.string> + <panel.string name="world_map_person"> + 1 personne + </panel.string> + <panel.string name="world_map_people"> + [NUMBER] personnes + </panel.string> <text label="N" name="floater_map_north" text="N"> N </text> diff --git a/indra/newview/skins/default/xui/fr/role_actions.xml b/indra/newview/skins/default/xui/fr/role_actions.xml index 3367353b28..c049de48b1 100644 --- a/indra/newview/skins/default/xui/fr/role_actions.xml +++ b/indra/newview/skins/default/xui/fr/role_actions.xml @@ -17,21 +17,21 @@ <action_set description="Ces pouvoirs permettent de modifier le profil public du groupe, sa charte et son logo." name="Group Identity"> <action description="Modifier le profil public du groupe" longdescription="Modifiez la charte, le logo et l'affichage dans les résultats de recherche. Vous pouvez faire cela dans la section Général." name="group change identity" value="11"/> </action_set> - <action_set description="Ces pouvoirs incluent les pouvoirs de céder, modifier et vendre les terrains de ce groupe. Pour accéder à la fenêtre À propos des terrains, cliquez sur le sol avec le bouton droit de la souris et sélectionnez À propos des terrains, ou cliquez sur l'icône i dans la barre de navigation." name="Parcel Management"> + <action_set description="Ces pouvoirs incluent les pouvoirs de céder, modifier et vendre les terrains de ce groupe. Pour accéder à la fenêtre À propos du terrain, cliquez sur le sol avec le bouton droit de la souris et sélectionnez À propos du terrain, ou cliquez sur l'icône i dans la barre de navigation." name="Parcel Management"> <action description="Transférer et acheter des parcelles pour le groupe" longdescription="Transférez et achetez des parcelles pour le groupe à partir du menu À propos du terrain > Général." name="land deed" value="12"/> <action description="Abandonner le terrain" longdescription="Abandonnez des parcelles du groupe à Linden Lab. Attention : ce pouvoir autorise l'abandon d'un terrain appartenant au groupe. Ce terrain sera alors définitivement perdu. Assurez-vous de bien comprendre ce pouvoir avant de l'attribuer." name="land release" value="13"/> <action description="Vendre du terrain" longdescription="Vendez des parcelles du groupe. Attention : ce pouvoir autorise la vente d'un terrain appartenant au groupe. Ce terrain sera alors définitivement perdu. Assurez-vous de bien comprendre ce pouvoir avant de l'attribuer." name="land set sale info" value="14"/> <action description="Diviser et fusionner des parcelles" longdescription="Divisez et fusionnez des parcelles. Pour ce faire, cliquez sur le sol avec le bouton droit de la souris, sélectionnez Modifier le terrain et faites glisser la souris sur le terrain pour faire une sélection. Pour diviser une parcelle, sélectionnez ce que vous souhaitez diviser et cliquez sur Sous-diviser. Pour fusionner des parcelles, sélectionnez-en deux ou plus qui sont contiguës et cliquez sur Fusionner." name="land divide join" value="15"/> </action_set> <action_set description="Ces pouvoirs permettent de modifier le nom de la parcelle, son référencement dans la recherche et le lieu de téléportation." name="Parcel Identity"> - <action description="Activez Afficher le lieu dans la recherche et définissez la catégorie" longdescription="Activez Afficher le lieu dans la recherche et définissez la catégorie d'une parcelle dans l'onglet À propos des terrains > Options." name="land find places" value="17"/> - <action description="Modifiez le nom et la description de la parcelle, ainsi que les paramètres d'affichage du lieu dans la recherche" longdescription="Modifiez le nom et la description de la parcelle, ainsi que les paramètres d'affichage du lieu dans la recherche. Pour ce faire, utilisez l'onglet À propos des terrains > Options." name="land change identity" value="18"/> + <action description="Activez Afficher le lieu dans la recherche et définissez la catégorie" longdescription="Activez Afficher le lieu dans la recherche et définissez la catégorie d'une parcelle dans l'onglet À propos du terrain > Options." name="land find places" value="17"/> + <action description="Modifiez le nom et la description de la parcelle, ainsi que les paramètres d'affichage du lieu dans la recherche" longdescription="Modifiez le nom et la description de la parcelle, ainsi que les paramètres d'affichage du lieu dans la recherche. Pour ce faire, utilisez l'onglet À propos du terrain > Options." name="land change identity" value="18"/> <action description="Définir le lieu d'arrivée et le routage des téléportations" longdescription="Définissez le lieu d'arrivée des téléportations et le routage à partir du menu À propos du terrain > Options." name="land set landing point" value="19"/> </action_set> <action_set description="Ces pouvoirs permettent de définir les options de la parcelle concernant la musique, les médias, la création d'objets et le relief." name="Parcel Settings"> <action description="Modifier la musique et les médias" longdescription="Changez la musique et les médias à partir du menu À propos du terrain > Médias." name="land change media" value="20"/> <action description="Changer l'option Modifier le terrain" longdescription="Changez l'option Modifier le terrain à partir du menu À propos du terrain > Options. Attention : ce pouvoir permet de terraformer votre terrain et de placer ou déplacer des plantes Linden. Assurez-vous de bien comprendre ce pouvoir avant de l'attribuer. " name="land edit" value="21"/> - <action description="Changer diverses options du terrain" longdescription="Activez Sécurisé (pas de dégâts), Voler, et autorisez les autres résidents à : modifier le terrain, construire, créer des repères et exécuter des scripts sur les terrains appartenant au groupe dans l'onglet propos des terrains > Options." name="land options" value="22"/> + <action description="Changer diverses options du terrain" longdescription="Activez Sécurisé (pas de dégâts), Voler, et autorisez les autres résidents à : modifier le terrain, construire, créer des repères et exécuter des scripts sur les terrains appartenant au groupe dans l'onglet propos du terrain > Options." name="land options" value="22"/> </action_set> <action_set description="Ces pouvoirs permettent aux membres d'outrepasser les restrictions sur les parcelles du groupe." name="Parcel Powers"> <action description="Toujours autoriser Modifier le terrain" longdescription="Vous pouvez modifier le relief d'une parcelle du groupe, même si l'option est désactivée à partir du menu À propos du terrain > Options." name="land allow edit land" value="23"/> @@ -40,11 +40,11 @@ <action description="Toujours autoriser à créer des repères" longdescription="Vous pouvez créer un repère sur une parcelle du groupe, même si l'option est désactivée à partir du menu À propos du terrain > Options." name="land allow landmark" value="26"/> <action description="Autoriser à définir un domicile sur le terrain du groupe" longdescription="Un membre dans un rôle avec ce pouvoir peut utiliser le menu Monde > Repères > Définir le domicile ici sur une parcelle cédée à ce groupe." name="land allow set home" value="28"/> </action_set> - <action_set description="Ces pouvoirs permettent d'autoriser ou d'interdire l'accès à des parcelles du groupe et de geler ou d'expulser des résidents." name="Parcel Access"> + <action_set description="Ces pouvoirs permettent d'autoriser ou d'interdire l'accès à des parcelles du groupe et de figer ou d'expulser des résidents." name="Parcel Access"> <action description="Gérer la liste d'accès à la parcelle" longdescription="Gérez la liste des résidents autorisés sur la parcelle à partir du menu À propos du terrain > Accès." name="land manage allowed" value="29"/> - <action description="Gérer la liste noire de cette parcelle" longdescription="Gérez les listes des résidents bannis des parcelles dans l'onglet À propos des terrains > Accès." name="land manage banned" value="30"/> - <action description="Modifiez les paramètres Vendre des pass à " longdescription="Modifiez les paramètres Vendre des pass à dans l'onglet À propos des terrains > Accès." name="land manage passes" value="31"/> - <action description="Expulser et geler des résidents" longdescription="Les membres dans un rôle avec ce pouvoir peuvent se charger des résidents indésirables sur une parcelle appartenant au groupe en cliquant dessus, puis en sélectionnant Expulser ou Geler." name="land admin" value="32"/> + <action description="Gérer la liste noire de cette parcelle" longdescription="Gérez les listes des résidents bannis des parcelles dans l'onglet À propos du terrain > Accès." name="land manage banned" value="30"/> + <action description="Modifiez les paramètres Vendre des pass à " longdescription="Modifiez les paramètres Vendre des pass à dans l'onglet À propos du terrain > Accès." name="land manage passes" value="31"/> + <action description="Expulser et figer des résidents" longdescription="Les membres dans un rôle avec ce pouvoir peuvent se charger des résidents indésirables sur une parcelle appartenant au groupe en cliquant dessus, puis en sélectionnant Expulser ou Figer." name="land admin" value="32"/> </action_set> <action_set description="Ces pouvoirs permettent de renvoyer des objets du groupe et de placer ou déplacer des plantes Linden pour aménager le paysage. Utilisez ce pouvoir avec précaution car les objets renvoyés le sont définitivement." name="Parcel Content"> <action description="Renvoyer les objets transférés au groupe" longdescription="Vous pouvez renvoyer des objets appartenant au groupe à partir du menu À propos du terrain > Objets." name="land return group owned" value="48"/> diff --git a/indra/newview/skins/default/xui/fr/sidepanel_appearance.xml b/indra/newview/skins/default/xui/fr/sidepanel_appearance.xml index 60fd63bffc..69cb6cd53d 100644 --- a/indra/newview/skins/default/xui/fr/sidepanel_appearance.xml +++ b/indra/newview/skins/default/xui/fr/sidepanel_appearance.xml @@ -1,16 +1,17 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Tenues" name="appearance panel"> <string name="No Outfit" value="Aucune tenue"/> + <string name="Unsaved Changes" value="Modifications non enregistrées"/> + <string name="Now Wearing" value="Vous portez désormais..."/> <panel name="panel_currentlook"> - <button label="Éditer" name="editappearance_btn"/> - <text name="currentlook_title"> - (non enregistré) + <button label="M" name="editappearance_btn"/> + <button label="O" name="openoutfit_btn"/> + <text name="currentlook_status"> + (État) </text> <text name="currentlook_name"> Ma tenue avec un nom très long comme ORIGNAL </text> </panel> <filter_editor label="Filtrer les tenues" name="Filter"/> - <button label="Porter" name="wear_btn"/> - <button label="Nouvelle tenue" name="newlook_btn"/> </panel> diff --git a/indra/newview/skins/default/xui/fr/sidepanel_inventory.xml b/indra/newview/skins/default/xui/fr/sidepanel_inventory.xml index eba399f6a3..893b64d4b2 100644 --- a/indra/newview/skins/default/xui/fr/sidepanel_inventory.xml +++ b/indra/newview/skins/default/xui/fr/sidepanel_inventory.xml @@ -3,6 +3,8 @@ <panel label="" name="sidepanel__inventory_panel"> <panel name="button_panel"> <button label="Profil" name="info_btn"/> + <button label="Partager" name="share_btn"/> + <button label="Acheter" name="shop_btn"/> <button label="Porter" name="wear_btn"/> <button label="Jouer" name="play_btn"/> <button label="Téléporter" name="teleport_btn"/> diff --git a/indra/newview/skins/default/xui/fr/sidepanel_task_info.xml b/indra/newview/skins/default/xui/fr/sidepanel_task_info.xml index 688bed8cbf..c8e76118a1 100644 --- a/indra/newview/skins/default/xui/fr/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/fr/sidepanel_task_info.xml @@ -19,7 +19,7 @@ Vous ne pouvez pas modifier ces objets </panel.string> <panel.string name="text modify warning"> - Cet objet comprend des parties reliées + Cet objet comprend des parties liées </panel.string> <panel.string name="Cost Default"> Prix : L$ @@ -37,34 +37,34 @@ Vente mixte </panel.string> <text name="title" value="Profil de l'objet"/> - <text name="where" value="(dans le monde virtuel)"/> - <panel label=""> + <text name="where" value="(dans Second Life)"/> + <panel label="" name="properties_panel"> <text name="Name:"> - Nom : + Nom : </text> <text name="Description:"> Description : </text> <text name="CreatorNameLabel"> - Créateur : + Créateur : </text> <text name="Creator Name"> Erica Linden </text> <text name="Owner:"> - Propriétaire : + Propriétaire : </text> <text name="Owner Name"> Erica Linden </text> <text name="Group_label"> - Groupe : + Groupe : </text> - <button name="button set group" tool_tip="Choisissez un groupe pour partager les permissions de cet objet"/> - <name_box initial_value="Chargement..." name="Group Name Proxy"/> - <button label="Céder" label_selected="Céder" name="button deed" tool_tip="En cédant un objet, vous donnez aussi les permissions au prochain propriétaire. Seul un officier peut céder les objets d'un groupe."/> + <button name="button set group" tool_tip="Choisir un groupe pour partager les droits relatifs à cet objet"/> + <name_box initial_value="Chargement…" name="Group Name Proxy"/> + <button label="Céder" label_selected="Céder" name="button deed" tool_tip="En cédant un objet, vous donnez aussi les droits au prochain propriétaire. Seul un officier peut céder les objets partagés d'un groupe."/> <text name="label click action"> - Cliquer pour : + Cliquer pour : </text> <combo_box name="clickaction"> <combo_box.item label="Toucher (défaut)" name="Touch/grab(default)"/> @@ -78,16 +78,16 @@ Vous pouvez modifier cet objet </text> <text name="Anyone can:"> - N'importe qui : + N'importe qui : </text> <check_box label="Copier" name="checkbox allow everyone copy"/> <check_box label="Bouger" name="checkbox allow everyone move"/> <text name="GroupLabel"> - Groupe : + Groupe : </text> - <check_box label="Partager" name="checkbox share with group" tool_tip="Autorisez tous les membres du groupe choisi à utiliser et à partager vos droits pour cet objet. Pour activer les restrictions de rôles, vous devez d'abord cliquer sur Transférer."/> + <check_box label="Partager" name="checkbox share with group" tool_tip="Autoriser tous les membres du groupe choisi à partager vos droits de modification pour cet objet. Pour activer les restrictions de rôles, vous devez d'abord cliquer sur Céder."/> <text name="NextOwnerLabel"> - Le prochain propriétaire : + Le prochain propriétaire : </text> <check_box label="Modifier" name="checkbox next owner can modify"/> <check_box label="Copier" name="checkbox next owner can copy"/> @@ -99,30 +99,31 @@ <combo_box.item label="Contenus" name="Contents"/> <combo_box.item label="Original" name="Original"/> </combo_box> - <spinner label="Prix : L$" name="Edit Cost"/> - <check_box label="Afficher dans les résultats de recherche" name="search_check" tool_tip="Permettre aux autres résidents de voir cet objet dans les résultats de recherche"/> + <spinner label="Prix : L$" name="Edit Cost"/> + <check_box label="Afficher avec la recherche" name="search_check" tool_tip="Permettre aux autres résidents de voir cet objet dans les résultats de recherche"/> <text name="B:"> - B : + B : </text> <text name="O:"> - O : + O : </text> <text name="G:"> G : </text> <text name="E:"> - E : + E : </text> <text name="N:"> - N : + N : </text> <text name="F:"> - F : + F : </text> </panel> <panel name="button_panel"> <button label="Ouvrir" name="open_btn"/> <button label="Payer" name="pay_btn"/> <button label="Acheter" name="buy_btn"/> + <button label="Détails" name="details_btn"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml index 1888dc1827..15d5847c58 100644 --- a/indra/newview/skins/default/xui/fr/strings.xml +++ b/indra/newview/skins/default/xui/fr/strings.xml @@ -23,7 +23,22 @@ Détection du matériel... </string> <string name="StartupLoading"> - Chargement + Chargement de [APP_NAME]... + </string> + <string name="StartupClearingCache"> + Vidage du cache... + </string> + <string name="StartupInitializingTextureCache"> + Initialisation du cache des textures... + </string> + <string name="StartupInitializingVFS"> + Initialisation VFS... + </string> + <string name="ProgressRestoring"> + Restauration... + </string> + <string name="ProgressChangingResolution"> + Changement de la résolution... </string> <string name="Fullbright"> Fullbright (Legacy) @@ -85,9 +100,30 @@ <string name="LoginDownloadingClothing"> Habits en cours de téléchargement... </string> + <string name="InvalidCertificate"> + Certificat non valide ou corrompu renvoyé par le serveur. Contactez l'administrateur de la grille. + </string> + <string name="CertInvalidHostname"> + Nom d'hôte non valide utilisé pour accéder au serveur. Vérifiez votre nom d'hôte de grille ou SLURL. + </string> + <string name="CertExpired"> + Il semble que le certificat renvoyé par la grille ait expiré. Vérifiez votre horloge système ou contactez l'administrateur de la grille. + </string> + <string name="CertKeyUsage"> + Impossible d'utiliser le certificat renvoyé par le serveur pour SSL. Contactez l'administrateur de la grille. + </string> + <string name="CertBasicConstraints"> + Certificats trop nombreux dans la chaîne des certificats du serveur. Contactez l'administrateur de la grille. + </string> + <string name="CertInvalidSignature"> + Impossible de vérifier la signature de certificat renvoyée par le serveur de la grille. Contactez l'administrateur de la grille. + </string> <string name="LoginFailedNoNetwork"> Erreur réseau : impossible d'établir la connexion. Veuillez vérifier votre connexion réseau. </string> + <string name="LoginFailed"> + Échec de la connexion. + </string> <string name="Quit"> Quitter </string> @@ -97,6 +133,24 @@ <string name="AgentLostConnection"> Il y a peut-être des problèmes techniques dans cette région. Veuillez vérifier votre connexion Internet. </string> + <string name="SavingSettings"> + Enregistrement des paramètres... + </string> + <string name="LoggingOut"> + Déconnexion... + </string> + <string name="ShuttingDown"> + Arrêt en cours... + </string> + <string name="YouHaveBeenDisconnected"> + Vous avez été déconnecté de la région où vous étiez. + </string> + <string name="SentToInvalidRegion"> + Vous avez été transféré vers une région non valide. + </string> + <string name="TestingDisconnect"> + Test de déconnexion du client + </string> <string name="TooltipPerson"> Personne </string> @@ -151,6 +205,24 @@ <string name="TooltipAgentUrl"> Cliquez pour afficher le profil de ce résident </string> + <string name="TooltipAgentMute"> + Cliquer pour ignorer ce résident + </string> + <string name="TooltipAgentUnmute"> + Cliquer pour ne plus ignorer ce résident + </string> + <string name="TooltipAgentIM"> + Cliquer pour envoyer un IM à ce résident + </string> + <string name="TooltipAgentPay"> + Cliquer pour payer ce résident + </string> + <string name="TooltipAgentOfferTeleport"> + Cliquer pour proposer une téléportation à ce résident + </string> + <string name="TooltipAgentRequestFriend"> + Cliquer pour demander à ce résident d'être votre ami + </string> <string name="TooltipGroupUrl"> Cliquez pour afficher la description de ce groupe </string> @@ -176,18 +248,40 @@ Cliquez pour exécuter la commande secondlife:// command </string> <string name="CurrentURL" value=" URL actuelle : [CurrentURL]"/> + <string name="TooltipPrice" value="[PRICE] L$-"/> <string name="SLurlLabelTeleport"> Me téléporter vers </string> <string name="SLurlLabelShowOnMap"> Afficher la carte pour </string> + <string name="SLappAgentMute"> + Ignorer + </string> + <string name="SLappAgentUnmute"> + Ne plus ignorer + </string> + <string name="SLappAgentIM"> + IM + </string> + <string name="SLappAgentPay"> + Payer + </string> + <string name="SLappAgentOfferTeleport"> + Proposer une téléportation à + </string> + <string name="SLappAgentRequestFriend"> + Demande d'amitié + </string> <string name="BUTTON_CLOSE_DARWIN"> Fermer (⌘W) </string> <string name="BUTTON_CLOSE_WIN"> Fermer (Ctrl+W) </string> + <string name="BUTTON_CLOSE_CHROME"> + Fermer + </string> <string name="BUTTON_RESTORE"> Restaurer </string> @@ -227,12 +321,12 @@ <string name="AvatarNameMultiple"> (multiple) </string> - <string name="AvatarNameHippos"> - (hippos) - </string> <string name="GroupNameNone"> (aucun) </string> + <string name="AvalineCaller"> + Appelant Avaline [ORDER] + </string> <string name="AssetErrorNone"> Aucune erreur </string> @@ -338,6 +432,9 @@ <string name="symbolic link"> lien </string> + <string name="symbolic folder link"> + lien du dossier + </string> <string name="AvatarEditingAppearance"> (Apparence en cours de modification) </string> @@ -593,6 +690,9 @@ <string name="hang_up"> Déconnecté du chat vocal </string> + <string name="reconnect_nearby"> + Vous allez maintenant être reconnecté(e) au chat vocal près de vous. + </string> <string name="ScriptQuestionCautionChatGranted"> '[OBJECTNAME]', un objet appartenant à [OWNERNAME], situé dans [REGIONNAME] à [REGIONPOS], a reçu le droit de : [PERMISSIONS]. </string> @@ -642,7 +742,7 @@ Modéré </string> <string name="SIM_ACCESS_ADULT"> - Adult + Adulte </string> <string name="SIM_ACCESS_DOWN"> Hors ligne @@ -741,10 +841,10 @@ Gants </string> <string name="undershirt"> - Sous-vêtements (homme) + Débardeur </string> <string name="underpants"> - Sous-vêtements (femme) + Caleçon </string> <string name="skirt"> Jupe @@ -758,6 +858,45 @@ <string name="invalid"> non valide </string> + <string name="shirt_not_worn"> + Chemise non portée + </string> + <string name="pants_not_worn"> + Pantalon non porté + </string> + <string name="shoes_not_worn"> + Chaussures non portées + </string> + <string name="socks_not_worn"> + Chaussettes non portées + </string> + <string name="jacket_not_worn"> + Veste non portée + </string> + <string name="gloves_not_worn"> + Gants non portés + </string> + <string name="undershirt_not_worn"> + Débardeur non porté + </string> + <string name="underpants_not_worn"> + Caleçon non porté + </string> + <string name="skirt_not_worn"> + Jupe non portée + </string> + <string name="alpha_not_worn"> + Alpha non porté + </string> + <string name="tattoo_not_worn"> + Tatouage non porté + </string> + <string name="invalid_not_worn"> + non valide + </string> + <string name="NewWearable"> + Nouv. [WEARABLE_ITEM] + </string> <string name="next"> Suivant </string> @@ -780,7 +919,7 @@ Consultez les notices précédentes ou choisissez de ne plus recevoir ces messages ici. </string> <string name="GroupNotifyOpenAttachment"> - Ouvrir la pièce jointe + Ouvrir pièce jointe </string> <string name="GroupNotifySaveAttachment"> Enregistrer la pièce jointe @@ -825,7 +964,10 @@ Appuyez sur ESC pour quitter la vue subjective </string> <string name="InventoryNoMatchingItems"> - Aucun objet correspondant dans l'inventaire. + Vous n'avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/all/Rechercher [SEARCH_TERM]]. + </string> + <string name="PlacesNoMatchingItems"> + Vous n'avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/places/Rechercher [SEARCH_TERM]]. </string> <string name="FavoritesNoMatchingItems"> Faites glisser un repère ici pour l'ajouter à vos Favoris. @@ -846,6 +988,7 @@ Aucun contenu </string> <string name="WornOnAttachmentPoint" value=" (porté sur [ATTACHMENT_POINT])"/> + <string name="ActiveGesture" value="[GESLABEL] (actif)"/> <string name="PermYes"> Oui </string> @@ -860,6 +1003,7 @@ <string name="Wave" value=" Faire signe"/> <string name="HelloAvatar" value=" Bonjour, avatar !"/> <string name="ViewAllGestures" value=" Tout afficher >>"/> + <string name="GetMoreGestures" value="Plus >>"/> <string name="Animations" value=" Animations,"/> <string name="Calling Cards" value=" Cartes de visite,"/> <string name="Clothing" value=" Habits,"/> @@ -945,6 +1089,9 @@ <string name="InvFolder My Outfits"> Mes tenues </string> + <string name="InvFolder Accessories"> + Accessoires + </string> <string name="InvFolder Friends"> Amis </string> @@ -1201,10 +1348,10 @@ Problème lors du téléchargement </string> <string name="CompileQueueInsufficientPermDownload"> - Permissions insuffisantes pour télécharger un script. + Droits insuffisants pour télécharger un script. </string> <string name="CompileQueueInsufficientPermFor"> - Permissions insuffisantes pour + Droits insuffisants pour </string> <string name="CompileQueueUnknownFailure"> Échec du téléchargement, erreur inconnue @@ -1324,6 +1471,9 @@ <string name="ScriptLimitsRequestError"> Une erreur est survenue pendant la requête d'informations. </string> + <string name="ScriptLimitsRequestNoParcelSelected"> + Aucune parcelle sélectionnée + </string> <string name="ScriptLimitsRequestWrongRegion"> Erreur : les informations de script ne sont disponibles que dans votre région actuelle. </string> @@ -1465,6 +1615,12 @@ <string name="PanelContentsNewScript"> Nouveau script </string> + <string name="PanelContentsTooltip"> + Contenu de l'objet + </string> + <string name="BusyModeResponseDefault"> + Le résident auquel vous avez envoyé un message est en mode Occupé, ce qui signifie qu'il a demandé à ne pas être dérangé. Votre message restera affiché dans son panneau IM afin qu'il puisse le lire ultérieurement. + </string> <string name="MuteByName"> (par nom) </string> @@ -1477,17 +1633,18 @@ <string name="MuteGroup"> (groupe) </string> + <string name="MuteExternal"> + (externe) + </string> <string name="RegionNoCovenant"> Il n'y a aucun règlement pour ce domaine. </string> <string name="RegionNoCovenantOtherOwner"> Il n'y a aucun règlement pour ce domaine. Le terrain sur ce domaine est vendu par le propriétaire, non par Linden Lab. Pour en savoir plus, veuillez contacter le propriétaire. </string> - <string name="covenant_last_modified"> - Dernière modification : - </string> - <string name="none_text" value=" (aucun) "/> - <string name="never_text" value=" (jamais) "/> + <string name="covenant_last_modified" value="Dernière modification :"/> + <string name="none_text" value=" (aucun)"/> + <string name="never_text" value=" (jamais)"/> <string name="GroupOwned"> Propriété du groupe </string> @@ -1501,7 +1658,10 @@ (mise à jour après la publication) </string> <string name="NoPicksClassifiedsText"> - Il n'y a pas de préférences/petites annonces ici + Vous n'avez pas créé de favoris ni de petites annonces Cliquez sur le bouton Plus pour créer un favori ou une petite annonce. + </string> + <string name="NoAvatarPicksClassifiedsText"> + L'utilisateur n'a ni favoris ni petites annonces </string> <string name="PicksClassifiedsLoadingText"> Chargement... @@ -1576,7 +1736,10 @@ Annuler </string> <string name="UploadingCosts"> - Charger %s coûte + Le chargement de [NAME] coûte [AMOUNT] L$ + </string> + <string name="BuyingCosts"> + Cet achat coûte [AMOUNT] L$ </string> <string name="UnknownFileExtension"> Extension de fichier inconnue .%s @@ -1706,7 +1869,7 @@ Appartenant aux Lindens </string> <string name="Adult"> - Adult + Adulte </string> <string name="Arts&Culture"> Arts et culture @@ -1897,7 +2060,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. Mèches de derrière </string> <string name="Baggy"> - Cernés + Plus </string> <string name="Bangs"> Frange @@ -1924,7 +2087,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. Volume : Haut </string> <string name="Big Head"> - Grosse tête + Plus </string> <string name="Big Pectorals"> Gros pectoraux @@ -1960,13 +2123,13 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. Grains de beauté </string> <string name="Body Thick"> - Corps épais + Plus </string> <string name="Body Thickness"> Épaisseur du corps </string> <string name="Body Thin"> - Corps mince + Moins </string> <string name="Bow Legged"> Jambes arquées @@ -1987,7 +2150,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. Large </string> <string name="Brow Size"> - Taille + Taille du front </string> <string name="Bug Eyes"> Yeux globuleux @@ -2098,7 +2261,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. Déviation du nez </string> <string name="Cuff Flare"> - Jambe + Jambes </string> <string name="Dark"> Sombre @@ -2137,7 +2300,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. Extrémités </string> <string name="Egg Head"> - Forme de la tête + Proéminence </string> <string name="Eye Bags"> Cernes @@ -2215,7 +2378,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. Jambes larges </string> <string name="Flat"> - Plat + Moins </string> <string name="Flat Butt"> Fesses plates @@ -2260,10 +2423,10 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. Brillant </string> <string name="Glove Fingers"> - Doigts avec gants + Gants avec doigts </string> <string name="Glove Length"> - Longueur des gants + Longueur </string> <string name="Hair"> Cheveux @@ -2377,10 +2540,10 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. Angle mâchoire </string> <string name="Jaw Jut"> - Saillie de la mâchoire + Saillie mâchoire </string> <string name="Jaw Shape"> - Forme de la mâchoire + Mâchoire </string> <string name="Join"> Rapprochés @@ -2461,7 +2624,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. Fente labiale </string> <string name="Lip Cleft Depth"> - Profondeur fente labiale + Prof. fente labiale </string> <string name="Lip Fullness"> Volume des lèvres @@ -2488,7 +2651,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. Couleur du rouge à lèvres </string> <string name="Long"> - Long + Plus </string> <string name="Long Head"> Tête longue @@ -2545,7 +2708,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. Abaisser </string> <string name="Lower Bridge"> - Arête plus basse + Arête inférieure </string> <string name="Lower Cheeks"> Joue inférieure @@ -2587,7 +2750,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. Plus </string> <string name="More Lower Lip"> - Plus + Inférieure plus grosse </string> <string name="More Muscles"> Plus @@ -2611,7 +2774,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. Plus </string> <string name="More Upper Lip"> - Plus + Supérieure plus grosse </string> <string name="More Vertical"> Plus @@ -2647,7 +2810,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. Couleur du vernis </string> <string name="Narrow"> - Étroit + Moins </string> <string name="Narrow Back"> Arrière étroit @@ -2719,19 +2882,19 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. Épaisseur du nez </string> <string name="Nose Tip Angle"> - Bout du nez + Angle bout du nez </string> <string name="Nose Tip Shape"> - Bout du nez + Forme bout du nez </string> <string name="Nose Width"> Largeur du nez </string> <string name="Nostril Division"> - Division des narines + Division narines </string> <string name="Nostril Width"> - Largeur des narines + Largeur narines </string> <string name="Opaque"> Opaque @@ -2821,13 +2984,13 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. Plus rose </string> <string name="Platform Height"> - Plateforme (hauteur) + Platef. (hauteur) </string> <string name="Platform Width"> - Plateforme (largeur) + Platef. (largeur) </string> <string name="Pointy"> - Pointu + Pointue </string> <string name="Pointy Heels"> Talons pointus @@ -2845,10 +3008,10 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. Å’il droit saillant </string> <string name="Puffy"> - Gonflées + Plus </string> <string name="Puffy Eyelids"> - Paupières + Paup. gonflées </string> <string name="Rainbow Color"> Couleur arc en ciel @@ -2914,7 +3077,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. Vers la gauche </string> <string name="Shift Mouth"> - Déplacer la bouche + Déplacement </string> <string name="Shift Right"> Vers la droite @@ -3013,16 +3176,16 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. Petites mains </string> <string name="Small Head"> - Petite tête + Moins </string> <string name="Smooth"> - Lisses + Moins </string> <string name="Smooth Hair"> Cheveux lisses </string> <string name="Socks Length"> - Longueur des chaussettes + Longueur </string> <string name="Soulpatch"> Barbichette @@ -3034,7 +3197,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. Mèches en pointe </string> <string name="Square"> - Carré + Carrée </string> <string name="Square Toe"> Orteil carré @@ -3112,7 +3275,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. Forme de l'orteil </string> <string name="Toe Thickness"> - Épaisseur de l'orteil + Épaisseur orteil </string> <string name="Torso Length"> Longueur du torse @@ -3139,13 +3302,13 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. Arête supérieure </string> <string name="Upper Cheeks"> - Pommette + Joue supérieure </string> <string name="Upper Chin Cleft"> Menton supérieur </string> <string name="Upper Eyelid Fold"> - Paupière supérieure + Paupière sup. </string> <string name="Upturned"> En trompette @@ -3163,7 +3326,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. Cheveux blancs </string> <string name="Wide"> - Large + Plus </string> <string name="Wide Back"> Derrière large @@ -3213,6 +3376,15 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. <string name="LocationCtrlDamageTooltip"> Santé </string> + <string name="LocationCtrlAdultIconTooltip"> + Région de type Adulte + </string> + <string name="LocationCtrlModerateIconTooltip"> + Région de type Modéré + </string> + <string name="LocationCtrlGeneralIconTooltip"> + Région de type Général + </string> <string name="UpdaterWindowTitle"> [APP_NAME] - Mise à jour </string> @@ -3243,6 +3415,12 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. <string name="UpdaterFailStartTitle"> Impossible de lancer le client </string> + <string name="ItemsComingInTooFastFrom"> + [APP_NAME] : transfert trop rapide des articles de [FROM_NAME] ; aperçu automatique désactivé pendant [TIME] secondes + </string> + <string name="ItemsComingInTooFast"> + [APP_NAME] : transfert trop rapide des articles ; aperçu automatique désactivé pendant [TIME] secondes + </string> <string name="IM_logging_string"> -- Archivage des IM activé -- </string> @@ -3270,11 +3448,17 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. <string name="IM_moderator_label"> (Modérateur) </string> - <string name="started_call"> - A appelé quelqu'un + <string name="answered_call"> + Votre appel a fait l'objet d'une réponse + </string> + <string name="you_started_call"> + Vous appelez. </string> - <string name="joined_call"> - A rejoint l'appel + <string name="you_joined_call"> + Vous avez rejoint l'appel + </string> + <string name="name_started_call"> + [NAME] appelle. </string> <string name="ringing-im"> En train de rejoindre l'appel... @@ -3363,4 +3547,219 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. <string name="unread_chat_multiple"> [SOURCES] ont dit quelque chose de nouveau </string> + <string name="session_initialization_timed_out_error"> + Expiration du délai d'initialisation de la session + </string> + <string name="paid_you_ldollars"> + [NAME] vous a payé [AMOUNT] L$ + </string> + <string name="you_paid_ldollars"> + Vous avez payé à [AMOUNT] L$ [REASON]. + </string> + <string name="you_paid_ldollars_no_info"> + Vous avez payé [AMOUNT] L$. + </string> + <string name="you_paid_ldollars_no_reason"> + Vous avez payé à [NAME] [AMOUNT] L$. + </string> + <string name="you_paid_ldollars_no_name"> + Vous avez payé à [AMOUNT] L$ [REASON]. + </string> + <string name="for a parcel of land"> + pour une parcelle de terrain + </string> + <string name="for a land access pass"> + pour un pass d'accès au terrain + </string> + <string name="for deeding land"> + pour une cession de terrain + </string> + <string name="to create a group"> + pour créer un groupe + </string> + <string name="to join a group"> + pour rejoindre un groupe + </string> + <string name="to upload"> + pour charger + </string> + <string name="giving"> + Donner [AMOUNT] L$ + </string> + <string name="uploading_costs"> + Le chargement coûte [AMOUNT] L$ + </string> + <string name="this_costs"> + Cela coûte [AMOUNT] L$ + </string> + <string name="buying_selected_land"> + Achat du terrain sélectionné pour [AMOUNT] L$ + </string> + <string name="this_object_costs"> + Cet objet coûte [AMOUNT] L$ + </string> + <string name="group_role_everyone"> + Tous + </string> + <string name="group_role_officers"> + Officiers + </string> + <string name="group_role_owners"> + Propriétaires + </string> + <string name="uploading_abuse_report"> + Chargement en cours... + +de l'infraction signalée + </string> + <string name="New Shape"> + Nouvelle silhouette + </string> + <string name="New Skin"> + Nouvelle peau + </string> + <string name="New Hair"> + Nouveaux cheveux + </string> + <string name="New Eyes"> + Nouveaux yeux + </string> + <string name="New Shirt"> + Nouvelle chemise + </string> + <string name="New Pants"> + Nouveau pantalon + </string> + <string name="New Shoes"> + Nouvelles chaussures + </string> + <string name="New Socks"> + Nouvelles chaussettes + </string> + <string name="New Jacket"> + Nouvelle veste + </string> + <string name="New Gloves"> + Nouveaux gants + </string> + <string name="New Undershirt"> + Nouveau débardeur + </string> + <string name="New Underpants"> + Nouveau caleçon + </string> + <string name="New Skirt"> + Nouvelle jupe + </string> + <string name="New Alpha"> + Nouvel alpha + </string> + <string name="New Tattoo"> + Nouveau tatouage + </string> + <string name="Invalid Wearable"> + Objet à porter non valide + </string> + <string name="New Script"> + Nouveau script + </string> + <string name="New Folder"> + Nouveau dossier + </string> + <string name="Contents"> + Contenus + </string> + <string name="Gesture"> + Geste + </string> + <string name="Male Gestures"> + Gestes masculins + </string> + <string name="Female Gestures"> + Gestes féminins + </string> + <string name="Other Gestures"> + Autres gestes + </string> + <string name="Speech Gestures"> + Gestes liés à la parole + </string> + <string name="Common Gestures"> + Gestes communs + </string> + <string name="Male - Excuse me"> + Homme - Demander pardon + </string> + <string name="Male - Get lost"> + Homme - Dire d'aller au diable + </string> + <string name="Male - Blow kiss"> + Homme - Envoyer un baiser + </string> + <string name="Male - Boo"> + Homme - Hou ! + </string> + <string name="Male - Bored"> + Homme - Ennui + </string> + <string name="Male - Hey"> + Homme - Hé ! + </string> + <string name="Male - Laugh"> + Homme - Rire + </string> + <string name="Male - Repulsed"> + Homme - Dégoût + </string> + <string name="Male - Shrug"> + Homme - Hausser les épaules + </string> + <string name="Male - Stick tougue out"> + Homme - Tirer la langue + </string> + <string name="Male - Wow"> + Homme - Ouah ! + </string> + <string name="FeMale - Excuse me"> + Femme - Demander pardon + </string> + <string name="FeMale - Get lost"> + Femme - Dire d'aller au diable + </string> + <string name="FeMale - Blow kiss"> + Femme - Envoyer un baiser + </string> + <string name="FeMale - Boo"> + Femme - Hou ! + </string> + <string name="Female - Bored"> + Femme - Ennui + </string> + <string name="Female - Hey"> + Femme - Hé ! + </string> + <string name="Female - Laugh"> + Femme - Rire + </string> + <string name="Female - Repulsed"> + Femme - Dégoût + </string> + <string name="Female - Shrug"> + Femme - Hausser les épaules + </string> + <string name="Female - Stick tougue out"> + Femme - Tirer la langue + </string> + <string name="Female - Wow"> + Femme - Ouah ! + </string> + <string name="AvatarBirthDateFormat"> + [day,datetime,slt]/[mthnum,datetime,slt]/[year,datetime,slt] + </string> + <string name="DefaultMimeType"> + aucun/aucun + </string> + <string name="texture_load_dimensions_error"> + Impossible de charger des images de taille supérieure à [WIDTH]*[HEIGHT] + </string> </strings> diff --git a/indra/newview/skins/default/xui/fr/teleport_strings.xml b/indra/newview/skins/default/xui/fr/teleport_strings.xml index b76ae370fd..7c291c0984 100644 --- a/indra/newview/skins/default/xui/fr/teleport_strings.xml +++ b/indra/newview/skins/default/xui/fr/teleport_strings.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<teleport_messages name=""> +<teleport_messages> <message_set name="errors"> <message name="invalid_tport"> Nous avons rencontré des problèmes en essayant de vous téléporter. Vous devrez peut-être vous reconnecter avant de pouvoir vous téléporter. @@ -61,6 +61,9 @@ Veuillez réessayer dans un moment. <message name="completing"> Téléportation sur le point d'aboutir. </message> + <message name="completed_from"> + Téléportation depuis [T_SLURL] terminée + </message> <message name="resolving"> Destination en cours de résolution. </message> diff --git a/indra/newview/skins/default/xui/it/floater_about.xml b/indra/newview/skins/default/xui/it/floater_about.xml index a2fcaa63f6..026b7b7616 100644 --- a/indra/newview/skins/default/xui/it/floater_about.xml +++ b/indra/newview/skins/default/xui/it/floater_about.xml @@ -1,41 +1,41 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_about" title="Informazioni su [APP_NAME]"> +<floater name="floater_about" title="INFO [CAPITALIZED_APP_NAME]"> <floater.string name="AboutHeader"> [APP_NAME] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2] ([VIEWER_VERSION_3]) [BUILD_DATE] [BUILD_TIME] ([CHANNEL]) [[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]] </floater.string> <floater.string name="AboutCompiler"> - Fatto con [COMPILER] versione [COMPILER_VERSION] + Generato con [COMPILER] versione [COMPILER_VERSION] </floater.string> <floater.string name="AboutPosition"> - Tu sei in [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] a [REGION] ospitata da [HOSTNAME] ([HOSTIP]) + Tu sei [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] in [REGION] located at <nolink>[HOSTNAME]</nolink> ([HOSTIP]) [SERVER_VERSION] [[SERVER_RELEASE_NOTES_URL] [ReleaseNotes]] </floater.string> <floater.string name="AboutSystem"> CPU: [CPU] Memoria: [MEMORY_MB] MB -Versione Sistema Operativo: [OS_VERSION] -Venditore Scheda Grafica: [GRAPHICS_CARD_VENDOR] -Scheda Grafica: [GRAPHICS_CARD] +Versione sistema operativo: [OS_VERSION] +Venditore scheda grafica: [GRAPHICS_CARD_VENDOR] +Scheda grafica: [GRAPHICS_CARD] </floater.string> <floater.string name="AboutDriver"> - Versione Driver Scheda Grafica: [GRAPHICS_DRIVER_VERSION] + Versione driver Windows per grafica: [GRAPHICS_DRIVER_VERSION] </floater.string> <floater.string name="AboutLibs"> Versione OpenGL: [OPENGL_VERSION] Versione libcurl: [LIBCURL_VERSION] Versione J2C Decoder: [J2C_VERSION] -Versione Audio Driver: [AUDIO_DRIVER_VERSION] +Versione Driver audio: [AUDIO_DRIVER_VERSION] Versione Qt Webkit: [QT_WEBKIT_VERSION] -Versione Vivox: [VIVOX_VERSION] +Versione Server voice: [VOICE_VERSION] </floater.string> <floater.string name="none"> (nessuno) </floater.string> <floater.string name="AboutTraffic"> - Pacchetti Perduti: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%) + Pacchetti perduti: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%) Informazioni </floater.string> <tab_container name="about_tab"> <panel label="Informazioni" name="support_panel"> @@ -43,13 +43,14 @@ Versione Vivox: [VIVOX_VERSION] </panel> <panel label="Ringraziamenti" name="credits_panel"> <text_editor name="credits_editor"> - Second Life è offerto da Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl and many others. + Second Life ti è offerto da Philip, Tessa, Andrew, Cory, Ian, James, Phoenix, Ryan, Haney, Dan, Char, Ben, John, Tanya, Eddie, Richard, Mitch, Doug, Eric, Frank, Bruce, Aaron, Peter, Alice, Charlie, Debra, Eileen, Helen, Janet, Steffan, Steve, Tom, Mark, Hunter, Xenon, Burgess, Bill, Jim, Lee, Hamlet, Daniel, Jeff, Todd, Sarah, Tim, Stephanie, Colin, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Jack, Vektor, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Jesse, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Yuko, Makiko, Thomas, Harry, Seth, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Brad, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, Beez, Milo, Hermia, Red, Thrax, Gulliver, Joe, Sally, Paul, Jose, Rejean, Dore, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, Dustin, George, Del, Matthew, Cat, Jacqui, Adrian, Viola, Alfred, Noel, Irfan, Yool, Rika, Jane, Frontier, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Jeremy, JP, Jake, Anthony, Maurice, Madhavi, Leopard, Kyle, Joon, Bert, Belinda, Jon, Kristi, Bridie, Pramod, Socrates, Maria, Aric, Adreanne, Jay, Kari, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Colossus, Zen, BigPapi, Pastrami, Kurz, Mani, Neuro, Mel, Sardonyx, MJ, Rowan, Sgt, Elvis, Samuel, Leo, Bryan, Niko, Austin, Soft, Poppy, Rachel, Aki, Banzai, Alexa, Sue, Bender, CG, Angelo, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Rothman, Niall, Marin, Allison, Katie, Dawn, Dusty, Katt, Judy, Andrea, Ambroff, Infinity, Rico, Gail, Kalpana, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Maestro, Simone, Yang, T, Shannon, Nelson, Khanh, Scott, Courtney, Charlene, Quixote, Susan, Zed, Amanda, Katelin, Enkidu, Roxie, Esbee, JoRoan, Scarlet, Tay, Kevin, Wolfgang, Johnny, Ray, Andren, Merov, Bob, Rand, Howard, Callen, Heff, Galen, Newell, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl, Ashley, JessieAnn, Huseby, Karina, Paris, Kurt, Rick, Lis, Kotler, Theeba, Lynx, Murphy, Doten, Taka, Norm, Jillian, Marcus, Mae, Novack, Esther, Perry, Dana, Ducot, Javier, Porter, Madison, Gecko, Dough, JR, Gisele, Crimp, Norie, Arch, Kimi, Fisher, Barbara, Jason, Peggy, Bernard, Jules, Leroy, Eva, Khederian, Campbell, Vogt, Masido, Karel, Torres, Lo, Breezer, Delby, Rountree, Anna, Servus, Rue, Itiaes, Chuck, Luna, Novella, Zaza, Wen, Gino, Lex, Cassandra, Limey, Nancy, Anukul, Silver, Brodesky, Jinsai, Squid, Gez, Rakesh, Ladan, Edelman, Marcet, Squire, Tatem, Tony, Jerm, Tia, Falcon, BK, Tiggs, Driscoll, Bacon, Timothee, Cru, Carmilla, Coyot, Webb, Kazu, Rudas, LJ, Sea, Ali Wallace, Bewest, Pup, Drub, Dragon, Inoshiro, Byron, Rhett, Xandix, Aimee, Fredrik, Thor, Teddy, Baron, Nelly, Ghengis, Epic, Eli, Stone, Grapes, Irie, Prep, Scobu, Valerie, Alain e molti altri ancora. - Si ringraziano i seguenti residenti per aver contribuito a rendere questa versione la migliore possibile: able whitman, Adeon Writer, adonaira aabye, Aeron Kohime, Agathos Frascati, Aimee Trescothick, Aleric Inglewood, Alissa Sabre, Aminom Marvin, Angela Talamasca, Aralara Rajal, Armin Weatherwax, Ashrilyn Hayashida, Athanasius Skytower, Aura Dirval, Barney Boomslang, Biancaluce Robbiani, Biker Offcourse, Borg Capalini, Bulli Schumann, catherine pfeffer, Chalice Yao, Corre Porta, Court Goodman, Cummere Mayo, Dale Innis, Darien Caldwell, Darjeeling Schoonhoven, Daten Thielt, dimentox travanti, Dirk Talamasca, Drew Dwi, Duckless Vandyke, Elanthius Flagstaff, Electro Burnstein, emiley tomsen, Escort DeFarge, Eva Rau, Ezian Ecksol, Fire Centaur, Fluf Fredriksson, Francisco Koolhoven, Frontera Thor, Frungi Stastny, Gally Young, gearsawe stonecutter, Gigs Taggart, Gordon Wendt, Gudmund Shepherd, Gypsy Paz, Harleen Gretzky, Henri Beauchamp, Inma Rau, Irene Muni, Iskar Ariantho, Jacek Antonelli, JB Kraft, Jessicka Graves, Joeseph Albanese, Joshua Philgarlic, Khyota Wulluf, kirstenlee Cinquetti, Latif Khalifa, Lex Neva, Lilibeth Andree, Lisa Lowe, Lunita Savira, Loosey Demonia, lum pfohl, Marcos Fonzarelli, MartinRJ Fayray, Marusame Arai, Matthew Dowd, Maya Remblai, McCabe Maxsted, Meghan Dench, Melchoir Tokhes, Menos Short, Michelle2 Zenovka, Mimika Oh, Minerva Memel, Mm Alder, Ochi Wolfe, Omei Turnbull, Pesho Replacement, Phantom Ninetails, phoenixflames kukulcan, Polo Gufler, prez pessoa, princess niven, Prokofy Neva, Qie Niangao, Rem Beattie, RodneyLee Jessop, Saijanai Kuhn, Seg Baphomet, Sergen Davies, Shirley Marquez, SignpostMarv Martin, Sindy Tsure, Sira Arbizu, Skips Jigsaw, Sougent Harrop, Spritely Pixel, Squirrel Wood, StarSong Bright, Subversive Writer, Sugarcult Dagger, Sylumm Grigorovich, Tammy Nowotny, Tanooki Darkes, Tayra Dagostino, Theoretical Chemistry, Thickbrick Sleaford, valerie rosewood, Vex Streeter, Vixen Heron, Whoops Babii, Winter Ventura, Xiki Luik, Yann Dufaux, Yina Yao, Yukinoroh Kamachi, Zolute Infinity, Zwagoth Klaar +Si ringraziano i seguenti residenti per aver contribuito a rendere questa versione la migliore possibile: Drew Dwi, Zai Lynch, Latif Khalifa, Ellla McMahon, Harleen Gretzky, Squirrel Wood, Malarthi Behemoth, Dante Tucker, Buckaroo Mu, Eddi Decosta, Dirk, Talamasca, Torben Trautman, Irene Muni, Lilly Zenovka, Vick Forcella, Sasy Scarborough, Gentle Welinder, Elric Anatine, Techwolf Lupindo, Dusan Writer, WolfPup Lowenhar, Marianne McCann, Fiachra Lach, Sitearm Madonna, Sudane Erato, Sahkolihaa Contepomi, Sachi Vixen, Questar Utu, Dimitrio Lewis, Matto Destiny, Scrim Pinion, Radio Signals, Psi Merlin, Pixel Gausman, Mel Vanbeeck, Laurent Bechir, Lamorna Proctor, Lares Carter, Gwyneth Llewelyn, Hydra Shaftoe, Holger Gilruth, Gentle Heron, Carla Broek, Boroondas Gupte, Fury Rosewood, Flower Ducatillon, Colpo Wexler, gwampa Lomu, Borg Capalini, Beansy Twine, Ardy Lay, , 45ms Zhong, Adeon Writer, Aeonix Aeon, Ai Austin, Aiko Ying, Alexandrea Fride, Alliez Mysterio, Annie Milestone, Annika Genezzia, Ansariel Hiller, ArminasX Saiman, Arya Braveheart, Asaeda Meltingdots, Asturkon Jua, Avallyn Oakleaf, Avatar Quinzet, BabyA Littlething, Bacchus Ireto, Bazaar, Riva, Benjamin Bigdipper, Beth Walcher, Bezilon Kasei, Biancaluce Robbiani, Bill Walach, blakopal Galicia, Blitzckreed Levenque, Bryn Oh, Callipygian Christensen, Cap Carver, Carr Arbenlow, Chantal Harvey, Charles Courtois, Charlie Sazaland, Cherry Cheevers, ChickyBabes Zuzu, Christopher Organiser, Ciaran Laval, Clara Young, Celierra Darling, Corinne Helendale, Corro Moseley, Coughdrop Littlething, Darien Caldwell, Dartagan Shepherd, Debs Regent, Decro Schmooz, Denim Kamachi, DiJodi Dubratt, Dil Spitz, Edgware Marker, Egehan Dryke, Emma Portilo, Emmie Fairymeadow, Evangelista Emerald, Faelon Swordthain, Frenchimmo Sabra, Gaberoonie Zanzibar, Ganymedes Costagravas, Gene Frostbite, GeneJ Composer, Giggles Littlebird, Grady Echegaray, Guni Greenstein, Gypsy Tripsa, Hackshaven Harford, Ham Rambler, Han Shuffle, Hanglow Short, Hatzfeld Runo, herina Bode, Horatio Freund, Hypatia Callisto, Hypatia Pickens, Identity Euler, Imnotgoing Sideways, Innula Zenovka, Iyoba Tarantal, Jack Abraham, Jagga Meredith, Jennifer Boyle, Jeremy Marquez, Jessica Qin, Jinx Nordberg, Jo Bernandes, Jocial Sonnenkern, Joel Savard, Jondan Lundquist, Josef Munster, Josette Windlow, Juilan Tripsa, Juro Kothari, Justin RiversRunRed, Kagehi Kohn, Kaimen Takahe, Keklily Longfall, Ken Lavender, Kestral Karas, Khisme Nitely, Kimar Coba, Kithrak Kirkorian, Kitty Barnett, Kolor Fall, Komiko Okamoto, Korvel Noh, Larry Pixel, Leal Choche, len Starship, Lenae Munz, Lexi Frua, Lillie Cordeaux, Lizzy Macarthur, LSL Scientist, Luban Yiyuan, Luc Starsider, Maccus McCullough, Madison Blanc, Maggie Darwin, Mallory Destiny, Manx Wharton, Marc Claridge, Marc2 Sands, Matthew Anthony, Maxim RiversRunRed, Medhue Simoni, Melinda Latynina, Mencius Watts, Michi Lumin, Midian Farspire, Miles Glaz, Mindy Mathy, Mitch Wagner, Mo Hax, Mourna Biziou, Nao Noe, naofan Teardrop, Naomah Beaumont, Nathiel Siamendes, Nber Medici, Neko Link, Netpat Igaly, Neutron Chesnokov, Newfie Pendragon, Nicholai Laviscu, Nick Rhodes, Nicoladie Gymnast, Ollie Kubrick, Orenj Marat, Orion Delphis, Oryx Tempel, Parvati Silverweb, PeterPunk Mooney, Pixel Scientist, Pounce Teazle, Professor Noarlunga, Quantum Destiny, Quicksilver Hermes, Ralf Setsuko, RAT Quan, RedMokum Bravin, Revolution Perenti, Rezit Sideways, Rich Grainger, Rosco Teardrop, Rose Evans, Rudee Voom, RufusTT Horsefly, Saii Hallard, SaintLEOlions Zimer, Samm Larkham, Satanello Miami, SexySteven Morrisey, Sheet Spotter, Shnurui Troughton, sicarius Thorne, Sicarius Toxx, Sini Nubalo, SLB Wirefly, snowy Sidran, Soupa Segura, ST Mensing, Starshine Halasy, Stickman Ingmann, Synystyr Texan, Takeda Terrawyng, Tali Rosca, Templar Merlin, Tezcatlipoca Bisiani, Tiel Stonecutter, Tony Kembia, TouchaHoney Perhaps, Trey Reanimator, TriloByte Zanzibar, Trinity Dechou, Trinity Dejavu, Unlikely Quintessa, UsikuFarasi Kanarik, Veritas Raymaker, Vex Streeter, Viaticus Speculaas, Villain Baroque, Vixie Durant, Void Singer, Watty Berkson, Westley Schridde, Westley Streeter, Whimsy Winx, Winter Ventura, Wundur Primbee, xstorm Radek, YongYong Francois, Zak Westminster, Zana Kohime, Zaren Alexander, Zeja Pyle, ZenMondo Wormser, Zoex Flanagan e molti altri ancora. - Per avere successo nel business, sii coraggioso, sii il primo, sii differente. --Henry Marchant + +"Il lavoro continua, la causa sussiste, la speranza vive ancora e i sogni non svaniranno mai" - Edward Kennedy </text_editor> </panel> <panel label="Licenze" name="licenses_panel"> diff --git a/indra/newview/skins/default/xui/it/floater_about_land.xml b/indra/newview/skins/default/xui/it/floater_about_land.xml index 4c82475a6f..942b79b7d3 100644 --- a/indra/newview/skins/default/xui/it/floater_about_land.xml +++ b/indra/newview/skins/default/xui/it/floater_about_land.xml @@ -1,5 +1,14 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floaterland" title="INFO SUL TERRENO"> +<floater name="floaterland" title="INFORMAZIONI SUL TERRENO"> + <floater.string name="maturity_icon_general"> + "Parcel_PG_Dark" + </floater.string> + <floater.string name="maturity_icon_moderate"> + "Parcel_M_Dark" + </floater.string> + <floater.string name="maturity_icon_adult"> + "Parcel_R_Dark" + </floater.string> <floater.string name="Minutes"> [MINUTES] minuti </floater.string> @@ -10,12 +19,12 @@ [SECONDS] secondi </floater.string> <floater.string name="Remaining"> - restante + rimanenti </floater.string> <tab_container name="landtab"> <panel label="GENERALE" name="land_general_panel"> <panel.string name="new users only"> - Solo ai nuovi residenti + Soltanto nuovi residenti </panel.string> <panel.string name="anyone"> A chiunque @@ -54,6 +63,9 @@ Nessun appezzamento selezionato. Vai al menu Mondo > Informazioni sul terreno oppure seleziona un altro appezzamento per vederne i dettagli. </panel.string> + <panel.string name="time_stamp_template"> + [wkday,datetime,local] [day,datetime,local] [mth,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local] + </panel.string> <text name="Name:"> Nome: </text> @@ -70,7 +82,7 @@ Vai al menu Mondo > Informazioni sul terreno oppure seleziona un altro appezz Categoria di accesso: </text> <text left="119" name="ContentRatingText"> - Adult + Adulti </text> <text name="Owner:"> Proprietario: @@ -81,10 +93,12 @@ Vai al menu Mondo > Informazioni sul terreno oppure seleziona un altro appezz <text name="Group:"> Gruppo: </text> - <text left="119" name="GroupText" width="227"/> - <button label="Imposta..." label_selected="Imposta..." name="Set..."/> + <text left="119" name="GroupText" width="227"> + Leyla Linden + </text> + <button label="Imposta" name="Set..."/> <check_box label="Permetti cessione al gruppo" left="119" name="check deed" tool_tip="Un funzionario del gruppo può cedere questa terra al gruppo stesso cosicchè essa sarà  supportata dalle terre del gruppo."/> - <button label="Cedi..." label_selected="Cedi..." name="Deed..." tool_tip="Puoi solo offrire terra se sei un funzionario del gruppo selezionato."/> + <button label="Cedi" name="Deed..." tool_tip="Puoi solo offrire terra se sei un funzionario del gruppo selezionato."/> <check_box label="Il proprietario fa un contributo con la cessione" left="119" name="check contrib" tool_tip="Quando la terra è ceduta al gruppo, il proprietario precedente contribuisce con abbastanza allocazione di terra per supportarlo."/> <text name="For Sale:"> In vendita: @@ -126,13 +140,14 @@ Vai al menu Mondo > Informazioni sul terreno oppure seleziona un altro appezz 0 </text> <button label="Acquista il terreno..." label_selected="Acquista il terreno..." left="130" name="Buy Land..." width="125"/> - <button label="Acquista per il gruppo..." label_selected="Acquista per il gruppo..." name="Buy For Group..."/> - <button label="Compra pass..." label_selected="Compra pass..." left="130" name="Buy Pass..." tool_tip="Un pass ti da un accesso temporaneo in questo territorio." width="125"/> - <button label="Abbandona la terra..." label_selected="Abbandona la terra..." name="Abandon Land..."/> - <button label="Reclama la terra..." label_selected="Reclama la terra..." name="Reclaim Land..."/> - <button label="Vendita Linden..." label_selected="Vendita Linden..." name="Linden Sale..." tool_tip="La terra deve essere posseduta, con contenuto impostato, e non già messa in asta."/> + <button label="Informazioni script" name="Scripts..."/> + <button label="Acquista per il gruppo" name="Buy For Group..."/> + <button label="Compra Pass..." label_selected="Compra Pass..." left="130" name="Buy Pass..." tool_tip="Un pass ti da un accesso temporaneo in questo territorio." width="125"/> + <button label="Abbandona la terra" name="Abandon Land..."/> + <button label="Reclama la terra" name="Reclaim Land..."/> + <button label="Vendita Linden" name="Linden Sale..." tool_tip="La terra deve essere di proprietà , con contenuto impostato, e non già messa all'asta."/> </panel> - <panel label="COVENANT" name="land_covenant_panel"> + <panel label="REGOLAMENTO" name="land_covenant_panel"> <panel.string name="can_resell"> La terra acquistata in questa regione può essere rivenduta. </panel.string> @@ -181,22 +196,22 @@ o suddivisa. Categoria di accesso: </text> <text left="125" name="region_maturity_text"> - Adult + Adulti </text> <text name="resellable_lbl"> Rivendita: </text> - <text left="125" name="resellable_clause"> + <text name="resellable_clause"> La terra in questa regione non può essere rivenduta. </text> <text name="changeable_lbl"> Suddividi: </text> - <text left="125" name="changeable_clause"> + <text name="changeable_clause"> La terra in questa regione non può essere unita/suddivisa. </text> </panel> - <panel label="OBJECTS" name="land_objects_panel"> + <panel label="OGGETTI" name="land_objects_panel"> <panel.string name="objects_available_text"> [COUNT] dei [MAX] ([AVAILABLE] disponibili) </panel.string> @@ -207,7 +222,7 @@ o suddivisa. Fattore bonus degli oggetti della regione: [BONUS] </text> <text name="Simulator primitive usage:"> - Uso dei Primative : + Uso dei Prim: </text> <text left="214" name="objects_available" width="230"> [COUNT] dei [MAX] ([AVAILABLE] dsponibili) @@ -231,7 +246,7 @@ o suddivisa. [COUNT] </text> <button label="Mostra" label_selected="Mostra" name="ShowOwner" right="-135" width="60"/> - <button label="Restituisci..." label_selected="Restituisci..." name="ReturnOwner..." right="-10" tool_tip="Restituisci gli oggetti ai loro proprietari." width="119"/> + <button label="Restituisci" name="ReturnOwner..." right="-10" tool_tip="Restituisci gli oggetti ai loro proprietari." width="119"/> <text left="14" name="Set to group:" width="180"> Imposta al gruppo: </text> @@ -239,7 +254,7 @@ o suddivisa. [COUNT] </text> <button label="Mostra" label_selected="Mostra" name="ShowGroup" right="-135" width="60"/> - <button label="Restituisci..." label_selected="Restituisci..." name="ReturnGroup..." right="-10" tool_tip="Restituisci gli oggetti ai loro proprietari." width="119"/> + <button label="Restituisci" name="ReturnGroup..." right="-10" tool_tip="Restituisci gli oggetti ai loro proprietari." width="119"/> <text left="14" name="Owned by others:" width="180"> Posseduti da altri: </text> @@ -247,15 +262,15 @@ o suddivisa. [COUNT] </text> <button label="Mostra" label_selected="Mostra" name="ShowOther" right="-135" width="60"/> - <button label="Restituisci..." label_selected="Restituisci..." name="ReturnOther..." right="-10" tool_tip="Restituisci gli oggetti ai loro proprietari." width="119"/> + <button label="Restituisci" name="ReturnOther..." right="-10" tool_tip="Restituisci gli oggetti ai loro proprietari." width="119"/> <text left="14" name="Selected / sat upon:" width="193"> Selezionati / sui quali sei sopra: </text> <text left="214" name="selected_objects_text" width="48"> [COUNT] </text> - <text left="4" name="Autoreturn" width="412"> - Autorestituisci gli oggetti degli altri residenti (minuti, 0 per disabilitata): + <text name="Autoreturn"> + Restituzione automatica degli oggetti di altri residenti (minuti, 0 per disattivarla): </text> <line_editor name="clean other time" right="-20"/> <text name="Object Owners:" width="150"> @@ -282,16 +297,16 @@ Solamente terreni più grandi possono essere abilitati nella ricerca. Questa opzione è disabilitata perchè tu non puoi modificare le opzioni di questo terreno. </panel.string> <panel.string name="mature_check_mature"> - Contenuto Mature + Contenuto Moderato </panel.string> <panel.string name="mature_check_adult"> - Contenuto Adult + Contenuto Adulti </panel.string> <panel.string name="mature_check_mature_tooltip"> - Il contenuto o le informazioni del tuo terreno sono considerate Mature. + Il contenuto o le informazioni del tuo terreno sono considerate di tipo Moderato. </panel.string> <panel.string name="mature_check_adult_tooltip"> - Il contenuto o le informazioni del tuo terreno sono considerate Adult. + Il contenuto o le informazioni del tuo terreno sono considerate di tipo per Adulti. </panel.string> <panel.string name="landing_point_none"> (nessuno) @@ -303,7 +318,7 @@ Solamente terreni più grandi possono essere abilitati nella ricerca. Nessuna spinta (Impostazione regionale) </panel.string> <text name="allow_label"> - Permetti agli altri residenti di: + Permetti ad altri residenti di: </text> <check_box label="Modificare il terreno" name="edit land check" tool_tip="Se spuntato, chiunque può terraformare il tuo terreno. E' preferibile lasciare questo quadrato non spuntato, dato che sarai sempre in grado di modificare il tuo terreno."/> <check_box label="Permetti il volo" name="check fly" tool_tip="Se spuntato, gli altri residenti potranno volare sul tuo terreno. Se non spuntato, potranno solamente arrivare in volo o sorvolare il terreno."/> @@ -323,18 +338,18 @@ Solamente terreni più grandi possono essere abilitati nella ricerca. <check_box label="Tutti i residenti" name="check other scripts"/> <check_box label="Gruppo" name="check group scripts"/> <text name="land_options_label"> - Opzioni della terra: + Opzioni per il terreno: </text> <check_box label="Sicuro (senza danno)" name="check safe" tool_tip="Se spuntato, imposta il terreno su 'sicuro', disabilitando i danni da combattimento. Se non spuntato, viene abilitato il combattimento a morte."/> <check_box label="Nessuna spinta" name="PushRestrictCheck" tool_tip="Previeni i colpi. Selezionare questa opzione può essere utile per prevenire comportamenti dannosi sul tuo terreno."/> - <check_box label="Mostra luogo nel Cerca (L$30/settimana)" name="ShowDirectoryCheck" tool_tip="Lascia che questa terra sia vista dagli altri nei risultati di ricerca"/> - <combo_box left="282" name="land category with adult" width="140"> + <check_box label="Mostra luogo nella ricerca (30 L$/settimana)" name="ShowDirectoryCheck" tool_tip="Lascia che questa terra sia vista dagli altri nei risultati di ricerca"/> + <combo_box name="land category with adult"> <combo_box.item label="Tutte le categorie" name="item0"/> <combo_box.item label="Luogo dei Linden" name="item1"/> - <combo_box.item label="Adult" name="item2"/> - <combo_box.item label="Arte & Cultura" name="item3"/> + <combo_box.item label="Adulti" name="item2"/> + <combo_box.item label="Arte e cultura" name="item3"/> <combo_box.item label="Affari" name="item4"/> - <combo_box.item label="Educazione" name="item5"/> + <combo_box.item label="Istruzione" name="item5"/> <combo_box.item label="Gioco" name="item6"/> <combo_box.item label="Divertimento" name="item7"/> <combo_box.item label="Accoglienza nuovi residenti" name="item8"/> @@ -343,7 +358,7 @@ Solamente terreni più grandi possono essere abilitati nella ricerca. <combo_box.item label="Shopping" name="item11"/> <combo_box.item label="Altro" name="item12"/> </combo_box> - <combo_box left="282" name="land category" width="140"> + <combo_box name="land category"> <combo_box.item label="Tutte le categorie" name="item0"/> <combo_box.item label="Luogo dei Linden" name="item1"/> <combo_box.item label="Arte & Cultura" name="item3"/> @@ -357,7 +372,7 @@ Solamente terreni più grandi possono essere abilitati nella ricerca. <combo_box.item label="Shopping" name="item11"/> <combo_box.item label="Altro" name="item12"/> </combo_box> - <check_box label="Contenuto Mature" name="MatureCheck" tool_tip=" "/> + <check_box label="Contenuti di tipo Moderato" name="MatureCheck" tool_tip=" "/> <text name="Snapshot:"> Fotografia: </text> @@ -385,10 +400,7 @@ Solamente terreni più grandi possono essere abilitati nella ricerca. Home Page: </text> <line_editor left="97" name="media_url"/> - <button label="Imposta..." label_selected="Imposta..." name="set_media_url" width="63"/> - <text name="CurrentURL:"> - Pagina attuale: - </text> + <button label="Imposta" name="set_media_url"/> <check_box label="Nascondi indirizzo URL Media" left="94" name="hide_media_url" tool_tip="Abilitando questa opzione nasconderai l'indirizzo url dei media a tutte le persone non autorizzate a vedere le informazioni del terreno. Nota che questo non è disponibile per contenuto di tipo HTML."/> <text name="Description:"> Descrizione: @@ -400,9 +412,7 @@ Texture: </text> <texture_picker label="" left="97" name="media texture" tool_tip="Clicca per scegliere un'immagine"/> <text name="replace_texture_help" width="285"> - (Gli oggetti che hanno questa texture applicata -mostreranno il video o la pagina web dopo che avrai -cliccato sulla freccia play.) + Gli oggetti che utilizzano questa texture mostreranno il video o la pagina web dopo aver cliccato sulla freccia di riproduzione. Seleziona la miniatura per scegliere una texture diversa. </text> <check_box label="Auto ridimensiona" left="94" name="media_auto_scale" tool_tip="Spuntando questa opzione, nell'appezzamento il contenuto media si ridimensionerà automaticamente. Potrebbe darsi che appaia un po' più lento e che diminuisca la qualità visiva ma nessun altro riadattamento o allineamento della texture sarà necessario."/> <text left="99" name="media_size" tool_tip="Aumenta grandezza per far vedere meglio i media web, lascia a 0 per impostare il default." width="120"> @@ -420,12 +430,27 @@ Media: <check_box label="Fai ripetere il video" left="265" name="media_loop" tool_tip="Fai ripetere il video continuamente. Quando il video è finito, reinizierà dal principio."/> </panel> <panel label="SUONO" name="land_audio_panel"> - <check_box label="Attiva Voice" name="parcel_enable_voice_channel"/> - <check_box label="Attiva Voice (stabilito dalla Proprietà )" name="parcel_enable_voice_channel_is_estate_disabled"/> + <text name="MusicURL:"> + URL musica: + </text> + <check_box label="Nascondi URL" name="hide_music_url" tool_tip="Questa opzione consente di nascondere l'url della musica a chi non è autorizzato a visionare le informazioni di questo parcel."/> + <text name="Sound:"> + Audio: + </text> + <check_box label="Limita l'audio per oggetti e gesture a questo lotto" name="check sound local"/> + <text name="Voice settings:"> + Voce: + </text> + <check_box label="Attiva voce" name="parcel_enable_voice_channel"/> + <check_box label="Attiva voce (stabilito dalla proprietà )" name="parcel_enable_voice_channel_is_estate_disabled"/> + <check_box label="Limita il chat vocale a questo lotto" name="parcel_enable_voice_channel_local"/> </panel> <panel label="ACCESSO" name="land_access_panel"> <panel.string name="access_estate_defined"> - (Definito dalla Proprietà ) + (Definito dalla proprietà ) + </panel.string> + <panel.string name="allow_public_access"> + Consenti accesso pubblico ([MATURITY]) </panel.string> <panel.string name="estate_override"> Una o più di queste impostazioni sono già impostate a livello regionale @@ -433,12 +458,12 @@ Media: <text name="Limit access to this parcel to:"> Accesso a questo terreno </text> - <check_box label="Permetti Accesso Pubblico [MATURITY]" name="public_access"/> + <check_box label="Consenti l'accesso pubblico [MATURITY]" name="public_access"/> <text name="Only Allow"> - Accesso ristretto ai Residenti verificati con: + Consenti l'accesso soltanto ai residenti verificati tramite: </text> - <check_box label="Informazioni di pagamento on File [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="Manda via residenti non identificati."/> - <check_box label="Verifica dell'età [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="Espelli residenti che non hanno verificato l'età . Vedi [SUPPORT_SITE] per maggiori informazioni."/> + <check_box label="Informazioni di pagamento in archivio [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="Espelli i residenti non identificati."/> + <check_box label="Verifica dell'età [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="Espelli i residenti che non hanno la loro età verificata. Vedi [SUPPORT_SITE] per maggiori informazioni."/> <check_box label="Permetti accesso al gruppo: [GROUP]" name="GroupCheck" tool_tip="Imposta il gruppo nel pannello generale."/> <check_box label="Vendi pass a:" name="PassCheck" tool_tip="Permetti in questo terreno l'accesso temporaneo"/> <combo_box name="pass_combo"> @@ -448,7 +473,20 @@ Media: <spinner label="Prezzo in L$:" name="PriceSpin"/> <spinner label="Ore di accesso:" name="HoursSpin"/> <panel name="Allowed_layout_panel"> + <text label="Consenti sempre" name="AllowedText"> + Residenti consentiti + </text> <name_list name="AccessList" tool_tip="([LISTED] in lista, [MAX] max)"/> + <button label="Aggiungi" name="add_allowed"/> + <button label="Rimuovi" label_selected="Rimuovi" name="remove_allowed"/> + </panel> + <panel name="Banned_layout_panel"> + <text label="Espelli" name="BanCheck"> + Residenti con divieto + </text> + <name_list name="BannedList" tool_tip="([LISTED] in lista, [MAX] max)"/> + <button label="Aggiungi" name="add_banned"/> + <button label="Rimuovi" label_selected="Rimuovi" name="remove_banned"/> </panel> </panel> </tab_container> diff --git a/indra/newview/skins/default/xui/it/floater_activeim.xml b/indra/newview/skins/default/xui/it/floater_activeim.xml index d19882fa48..0c1f0448e1 100644 --- a/indra/newview/skins/default/xui/it/floater_activeim.xml +++ b/indra/newview/skins/default/xui/it/floater_activeim.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_activeim" title="ATTIVA IM"/> +<floater name="floater_activeim" title="IM ATTIVO"/> diff --git a/indra/newview/skins/default/xui/it/floater_animation_preview.xml b/indra/newview/skins/default/xui/it/floater_animation_preview.xml index 74a994825d..77341cad63 100644 --- a/indra/newview/skins/default/xui/it/floater_animation_preview.xml +++ b/indra/newview/skins/default/xui/it/floater_animation_preview.xml @@ -23,22 +23,22 @@ La lunghezza massima è [MAX_LENGTH] secondi. Impossibile leggere la definizione del vincolo. </floater.string> <floater.string name="E_ST_NO_FILE"> - Non può aprire il file BVH. + Impossibile aprire il file BVH. </floater.string> <floater.string name="E_ST_NO_HIER"> - HIERARCHY header non valido. + Intestazione HIERARCHY non valida. </floater.string> <floater.string name="E_ST_NO_JOINT"> - Impossibile trovare la RADICE o UNIONE. ???????????? + Impossibile trovare la ROOT o JOINT. </floater.string> <floater.string name="E_ST_NO_NAME"> - Impossibile trovare il nome MISTO. ?????? + Impossibile trovare il nome JOINT. </floater.string> <floater.string name="E_ST_NO_OFFSET"> Impossibile trovare OFFSET. </floater.string> <floater.string name="E_ST_NO_CHANNELS"> - Impossibile trovare CHANNELS. ????? + Impossibile trovare CHANNELS. </floater.string> <floater.string name="E_ST_NO_ROTATION"> Impossibile ottenere un ordine di rotazione. @@ -47,22 +47,22 @@ La lunghezza massima è [MAX_LENGTH] secondi. Rotazione dell'asse non disponibile. </floater.string> <floater.string name="E_ST_NO_MOTION"> - Impossibile trovare il GESTO. + Impossibile trovare MOTION. </floater.string> <floater.string name="E_ST_NO_FRAMES"> - Impossibile ottenere il numero dei frames. + Impossibile ottenere il numero dei frame. </floater.string> <floater.string name="E_ST_NO_FRAME_TIME"> Impossibile ottenere il tempo del frame. </floater.string> <floater.string name="E_ST_NO_POS"> - Impossibile ottenre una posizione dei valori. + Impossibile ottenere i valori della posizione. </floater.string> <floater.string name="E_ST_NO_ROT"> Impossibile ottenere i valori di rotazione. </floater.string> <floater.string name="E_ST_NO_XLT_FILE"> - Impossibile aprire la traduzione del file. + Impossibile aprire il file di traduzione. </floater.string> <floater.string name="E_ST_NO_XLT_HEADER"> Impossibile leggere l'intestazione della traduzione. @@ -71,31 +71,31 @@ La lunghezza massima è [MAX_LENGTH] secondi. Impossibile leggere i nomi della traduzione. </floater.string> <floater.string name="E_ST_NO_XLT_IGNORE"> - Impossibile leggere la traduzione ignora il valore. ????? + Impossibile leggere la traduzione, ignora il valore. </floater.string> <floater.string name="E_ST_NO_XLT_RELATIVE"> Impossibile leggere la traduzione del valore relativo. </floater.string> <floater.string name="E_ST_NO_XLT_OUTNAME"> - Cannot read translation outname value. + Valore non trovato. </floater.string> <floater.string name="E_ST_NO_XLT_MATRIX"> Impossibile leggere la matrice di traduzione. </floater.string> <floater.string name="E_ST_NO_XLT_MERGECHILD"> - Impossibile unire il nome del bambino. + Impossibile trovare il nome mergechild. </floater.string> <floater.string name="E_ST_NO_XLT_MERGEPARENT"> - Impossibile unire il nome del genitore. + Impossibile ottenere il nome mergeparent. </floater.string> <floater.string name="E_ST_NO_XLT_PRIORITY"> - Impossibile ottenre il valore di priorità . + Impossibile ottenere il valore di priorità . </floater.string> <floater.string name="E_ST_NO_XLT_LOOP"> - Impossibile ottenere il valore di loop. + Impossibile ottenere il valore di ripetizione. </floater.string> <floater.string name="E_ST_NO_XLT_EASEIN"> - Impossibile essere in agio nei valori. ????????? + Impossibile ottenere i valori easeIn. </floater.string> <floater.string name="E_ST_NO_XLT_EASEOUT"> Cannot get ease Out values. @@ -106,72 +106,75 @@ La lunghezza massima è [MAX_LENGTH] secondi. <floater.string name="E_ST_NO_XLT_EMOTE"> Impossibile leggere il nome emote. </floater.string> + <floater.string name="E_ST_BAD_ROOT"> + Nome non corretto del root joint, usa "hip". + </floater.string> <text name="name_label"> Nome: </text> <text name="description_label"> Descrizione: </text> - <spinner label="Priorità " label_width="72" name="priority" tool_tip="Controlla quali altre animazioni possono prevalere su questa animazione" width="110"/> - <check_box label="Ciclica" name="loop_check" tool_tip="Rendi questa animazione in loop"/> - <spinner label="In(%)" name="loop_in_point" tool_tip="Imposta il momento nel quale l'animazione inizia il loop"/> - <spinner label="Out(%)" name="loop_out_point" tool_tip="Imposta il momento nel quale l'animazione ferma il loop"/> + <spinner label="Priorità " label_width="72" name="priority" tool_tip="Definisce quali altre animazioni possono essere sostituite da questa animazione" width="110"/> + <check_box label="Ciclica" name="loop_check" tool_tip="Riproduce questa animazione in ripetizione"/> + <spinner label="In(%)" name="loop_in_point" tool_tip="Imposta il punto sul quale ritorna l'animazione"/> + <spinner label="Out(%)" name="loop_out_point" tool_tip="Imposta il punto sul quale termina l'animazione"/> <text name="hand_label"> Postura della mano </text> - <combo_box left_delta="100" name="hand_pose_combo" tool_tip="Controlla ciò che fanno le mani durante l'animazione" width="184"> + <combo_box left_delta="100" name="hand_pose_combo" tool_tip="Definisce ciò che fanno le mani durante l'animazione" width="184"> <combo_box.item label="Stendi" name="Spread"/> <combo_box.item label="Rilassato" name="Relaxed"/> - <combo_box.item label="indica entrambi" name="PointBoth"/> + <combo_box.item label="Indica entrambi" name="PointBoth"/> <combo_box.item label="Pugno" name="Fist"/> <combo_box.item label="Sinistra rilassata" name="RelaxedLeft"/> <combo_box.item label="Indica sinistra" name="PointLeft"/> - <combo_box.item label="Pugno sinistra" name="FistLeft"/> + <combo_box.item label="Pugno con la sinistra" name="FistLeft"/> <combo_box.item label="Destra rilassata" name="RelaxedRight"/> <combo_box.item label="Indica destra" name="PointRight"/> - <combo_box.item label="Pugno Destro" name="FistRight"/> - <combo_box.item label="Saluta Destra" name="SaluteRight"/> - <combo_box.item label="Scrivendo" name="Typing"/> - <combo_box.item label="Pace Destra" name="PeaceRight"/> + <combo_box.item label="Pugno destro" name="FistRight"/> + <combo_box.item label="Saluta a destra" name="SaluteRight"/> + <combo_box.item label="Battitura" name="Typing"/> + <combo_box.item label="Pace a destra" name="PeaceRight"/> </combo_box> <text name="emote_label"> Espressione </text> - <combo_box left_delta="100" name="emote_combo" tool_tip="Controlla ciò che fà il viso durante l'animazione" width="184"> - <combo_box.item label="(Nessuno)" name="[None]"/> - <combo_box.item label="Aaaaah" name="Aaaaah"/> - <combo_box.item label="Spavento" name="Afraid"/> - <combo_box.item label="Arrabbiato" name="Angry"/> - <combo_box.item label="Grande sorriso" name="BigSmile"/> - <combo_box.item label="Annoiato" name="Bored"/> - <combo_box.item label="Pianto" name="Cry"/> - <combo_box.item label="Disdegno" name="Disdain"/> - <combo_box.item label="Imbarazzato" name="Embarrassed"/> - <combo_box.item label="Accigliato ?????" name="Frown"/> - <combo_box.item label="Bacio" name="Kiss"/> - <combo_box.item label="Risata" name="Laugh"/> - <combo_box.item label="Plllppt" name="Plllppt"/> - <combo_box.item label="Repulsione" name="Repulsed"/> - <combo_box.item label="Triste" name="Sad"/> - <combo_box.item label="Scrollata di spalle" name="Shrug"/> - <combo_box.item label="Sorriso" name="Smile"/> - <combo_box.item label="Stupore" name="Surprise"/> - <combo_box.item label="Occhiolino" name="Wink"/> - <combo_box.item label="Preoccupato" name="Worry"/> + <combo_box left_delta="100" name="emote_combo" tool_tip="Definisce ciò che fa il viso durante l'animazione" width="184"> + <item label="(Nessuno)" name="[None]" value=""/> + <item label="Aaaaah" name="Aaaaah" value="Aaaaah"/> + <item label="Spavento" name="Afraid" value="Spavento"/> + <item label="Arrabbiato" name="Angry" value="Arrabbiato"/> + <item label="Grande sorriso" name="BigSmile" value="Grande sorriso"/> + <item label="Annoiato" name="Bored" value="Annoiato"/> + <item label="Pianto" name="Cry" value="Pianto"/> + <item label="Disdegno" name="Disdain" value="Disdegno"/> + <item label="Imbarazzato" name="Embarrassed" value="Imbarazzato"/> + <item label="Accigliato" name="Frown" value="Accigliato"/> + <item label="Bacio" name="Kiss" value="Bacio"/> + <item label="Risata" name="Laugh" value="Risata"/> + <item label="Plllppt" name="Plllppt" value="Linguaccia"/> + <item label="Repulsione" name="Repulsed" value="Repulsione"/> + <item label="Triste" name="Sad" value="Triste"/> + <item label="Scrollata di spalle" name="Shrug" value="Scrollata di spalle"/> + <item label="Sorriso" name="Smile" value="Sorriso"/> + <item label="Stupore" name="Surprise" value="Stupore"/> + <item label="Occhiolino" name="Wink" value="Occhiolino"/> + <item label="Preoccupato" name="Worry" value="Preoccupato"/> </combo_box> <text name="preview_label" width="250"> Vedi anteprima mentre </text> <combo_box left_delta="154" name="preview_base_anim" tool_tip="Da usarsi per controllare il comportamento dell'animazione mentre l'avatar svolge azioni abituali." width="130"> - <combo_box.item label="In piedi" name="Standing"/> - <combo_box.item label="Camminando" name="Walking"/> - <combo_box.item label="Sedendo" name="Sitting"/> - <combo_box.item label="Volando" name="Flying"/> + <item label="In piedi" name="Standing" value="In piedi"/> + <item label="Camminando" name="Walking" value="Cammina"/> + <item label="Seduto" name="Sitting" value="Seduto"/> + <item label="Volo" name="Flying" value="Volo"/> </combo_box> - <spinner label="Avvio lento (sec)" label_width="125" name="ease_in_time" tool_tip="Tempo (in seconds) oltre il quale le animazioni si miscelano" width="192"/> - <spinner bottom_delta="-20" label="Arresto lento (sec)" label_width="125" left="10" name="ease_out_time" tool_tip="Tempo (in seconds) oltre il quale le animazioni terminano di miscelarsi" width="192"/> + <spinner label="Avvio lento (sec)" label_width="125" name="ease_in_time" tool_tip="Durata (in secondi) della fusione in entrata delle animazioni" width="192"/> + <spinner bottom_delta="-20" label="Arresto lento (sec)" label_width="125" left="10" name="ease_out_time" tool_tip="Durata (in secondi) della fusione in uscita delle animazioni" width="192"/> <button bottom_delta="-32" name="play_btn" tool_tip="Riproduci la tua animazione"/> - <button name="pause_btn" tool_tip="La tua animazione in Pause"/> + <button name="pause_btn" tool_tip="Metti in pausa la tua animazione"/> <button label="" name="stop_btn" tool_tip="Ferma la riproduzione dell'animazione"/> <text name="bad_animation_text"> Impossibile leggere il file dell'animazione. diff --git a/indra/newview/skins/default/xui/it/floater_auction.xml b/indra/newview/skins/default/xui/it/floater_auction.xml index aa7b79fc50..4cad8b744d 100644 --- a/indra/newview/skins/default/xui/it/floater_auction.xml +++ b/indra/newview/skins/default/xui/it/floater_auction.xml @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_auction" title="INIZIA LA VENDITA DI TERRA LINDEN"> +<floater name="floater_auction" title="INIZIA LA VENDITA DI TERRENO LINDEN"> <floater.string name="already for sale"> Non puoi mettere in asta terreni che sono già in vendita. </floater.string> <check_box initial_value="true" label="Includi barriere di selezione gialle" name="fence_check"/> <button label="Fotografia" label_selected="Fotografia" name="snapshot_btn"/> <button label="Vendi a chiunque" label_selected="Vendi a chiunque" name="sell_to_anyone_btn"/> - <button label="Annulla le Impostazioni" label_selected="Annulla le Impostazioni" name="reset_parcel_btn"/> - <button label="Inizia l'Asta" label_selected="Inizia l'Asta" name="start_auction_btn"/> + <button label="Cancella impostazioni" label_selected="Cancella impostazioni" name="reset_parcel_btn"/> + <button label="Inizia l'asta" label_selected="Inizia l'asta" name="start_auction_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/it/floater_avatar_picker.xml b/indra/newview/skins/default/xui/it/floater_avatar_picker.xml index e583d0b8b5..7c037801e9 100644 --- a/indra/newview/skins/default/xui/it/floater_avatar_picker.xml +++ b/indra/newview/skins/default/xui/it/floater_avatar_picker.xml @@ -21,18 +21,18 @@ <tab_container name="ResidentChooserTabs"> <panel label="Cerca" name="SearchPanel"> <text name="InstructSearchResidentName"> - Scrivi parte del nome di una persona: + Comincia a digitare il nome della persona: </text> <button label="Vai" label_selected="Vai" name="Find"/> </panel> <panel label="Amici" name="FriendsPanel"> <text name="InstructSelectFriend"> - Seleziona una persona: + Scegli una persona: </text> </panel> <panel label="Vicino a me" name="NearMePanel"> <text name="InstructSelectResident"> - Seleziona una persona nei dintorni: + Scegli una persona nei dintorni </text> <slider bottom_delta="-36" label="Range" name="near_me_range"/> <text name="meters"> @@ -43,5 +43,5 @@ </panel> </tab_container> <button label="OK" label_selected="OK" name="ok_btn"/> - <button label="Cancella" label_selected="Cancella" name="cancel_btn"/> + <button label="Annulla" label_selected="Annulla" name="cancel_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/it/floater_avatar_textures.xml b/indra/newview/skins/default/xui/it/floater_avatar_textures.xml index e5ce07f300..b6376973cd 100644 --- a/indra/newview/skins/default/xui/it/floater_avatar_textures.xml +++ b/indra/newview/skins/default/xui/it/floater_avatar_textures.xml @@ -1,32 +1,50 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="avatar_texture_debug" title="AVATAR TEXTURES"> +<floater name="avatar_texture_debug" title="TEXTURE DI AVATAR"> <floater.string name="InvalidAvatar"> AVATAR NON VALIDO </floater.string> - <text name="composite_label"> - Texture Composite - </text> - <button label="Deposito" label_selected="Deposito" name="Dump"/> - <texture_picker label="Capelli" name="hair_grain"/> - <texture_picker label="Capelli Alpha" name="hair_alpha"/> - <texture_picker label="Trucco" name="head_bodypaint"/> - <texture_picker label="Testa Alpha" name="head_alpha"/> - <texture_picker label="Tatuaggio Testa" name="head_tattoo"/> - <texture_picker label="Occhio" name="eyes_iris"/> - <texture_picker label="Occhi Alpha" name="eyes_alpha"/> - <texture_picker label="Bodypaint Corpo Superiore" name="upper_bodypaint"/> - <texture_picker label="Maglietta intima" name="upper_undershirt"/> - <texture_picker label="Guanti" name="upper_gloves"/> - <texture_picker label="Camicia" name="upper_shirt"/> - <texture_picker label="Giacca superiore" name="upper_jacket"/> - <texture_picker label="Alpha Superiore" name="upper_alpha"/> - <texture_picker label="Tatuaggio superiore" name="upper_tattoo"/> - <texture_picker label="Bodypaint Corpo Inferiore" name="lower_bodypaint"/> - <texture_picker label="Slip" name="lower_underpants"/> - <texture_picker label="Calze" name="lower_socks"/> - <texture_picker label="Scarpe" name="lower_shoes"/> - <texture_picker label="Pantaloni" name="lower_pants"/> - <texture_picker label="Giacca" name="lower_jacket"/> - <texture_picker label="Alpha Inferiore" name="lower_alpha"/> - <texture_picker label="Tatuaggio basso" name="lower_tattoo"/> + <scroll_container name="profile_scroll"> + <panel name="scroll_content_panel"> + <text name="label"> + Baking delle +texture + </text> + <text name="composite_label"> + Composito +Texture + </text> + <button label="Memorizza gli ID sulla console" label_selected="Dump" name="Dump"/> + <panel name="scroll_content_panel"> + <texture_picker label="Capigliature" name="hair-baked"/> + <texture_picker label="Capigliature" name="hair_grain"/> + <texture_picker label="Alpha dei capelli" name="hair_alpha"/> + <texture_picker label="Testa" name="head-baked"/> + <texture_picker label="Makeup" name="head_bodypaint"/> + <texture_picker label="Alpha della testa" name="head_alpha"/> + <texture_picker label="Tatuaggio della testa" name="head_tattoo"/> + <texture_picker label="Occhi" name="eyes-baked"/> + <texture_picker label="Occhio" name="eyes_iris"/> + <texture_picker label="Alpha degli occhi" name="eyes_alpha"/> + <texture_picker label="Parte superiore del corpo" name="upper-baked"/> + <texture_picker label="Bodypaint parte superiore del corpo" name="upper_bodypaint"/> + <texture_picker label="Maglietta intima" name="upper_undershirt"/> + <texture_picker label="Guanti" name="upper_gloves"/> + <texture_picker label="Camicia" name="upper_shirt"/> + <texture_picker label="Parte superiore della giacca" name="upper_jacket"/> + <texture_picker label="Alpha superiore" name="upper_alpha"/> + <texture_picker label="Tatuaggio superiore" name="upper_tattoo"/> + <texture_picker label="Parte inferiore del corpo" name="lower-baked"/> + <texture_picker label="BodyPaint parte inferiore del corpo" name="lower_bodypaint"/> + <texture_picker label="Slip" name="lower_underpants"/> + <texture_picker label="Calzini" name="lower_socks"/> + <texture_picker label="Scarpe" name="lower_shoes"/> + <texture_picker label="Pantaloni" name="lower_pants"/> + <texture_picker label="Giacca" name="lower_jacket"/> + <texture_picker label="Alpha inferiore" name="lower_alpha"/> + <texture_picker label="Tattuaggio inferiore" name="lower_tattoo"/> + <texture_picker label="Gonna" name="skirt-baked"/> + <texture_picker label="Gonna" name="skirt"/> + </panel> + </panel> + </scroll_container> </floater> diff --git a/indra/newview/skins/default/xui/it/floater_beacons.xml b/indra/newview/skins/default/xui/it/floater_beacons.xml index 8fd69d811d..ca6711468d 100644 --- a/indra/newview/skins/default/xui/it/floater_beacons.xml +++ b/indra/newview/skins/default/xui/it/floater_beacons.xml @@ -1,12 +1,12 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="beacons" title="BEACONS"> +<floater name="beacons" title="MARCATORI"> <panel name="beacons_panel"> <text name="label_show"> Mostra: </text> - <check_box label="Beacons" name="beacons"/> - <check_box label="Highlights" name="highlights"/> - <text name="beacon_width_label" tool_tip="Beacon width"> + <check_box label="Marcatori" name="beacons"/> + <check_box label="In evidenza" name="highlights"/> + <text name="beacon_width_label" tool_tip="Larghezza marcatore"> Larghezza: </text> <text name="label_objects"> @@ -15,7 +15,7 @@ <check_box label="Fisico" name="physical"/> <check_box label="Scripted" name="scripted"/> <check_box label="Tocca solo" name="touch_only"/> - <check_box label="Fonte del Suono" name="sounds"/> - <check_box label="Fonte delle Particle" name="particles"/> + <check_box label="Fonti sonore" name="sounds"/> + <check_box label="Fonti delle particelle" name="particles"/> </panel> </floater> diff --git a/indra/newview/skins/default/xui/it/floater_build_options.xml b/indra/newview/skins/default/xui/it/floater_build_options.xml index 233efef19b..326aab1a31 100644 --- a/indra/newview/skins/default/xui/it/floater_build_options.xml +++ b/indra/newview/skins/default/xui/it/floater_build_options.xml @@ -1,10 +1,10 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="build options floater" title="GRID OPTIONS"> - <spinner label="Grid Units (meters)" label_width="192" name="GridResolution" width="250"/> +<floater name="build options floater" title="OPZIONI DELLA GRIGLIA"> + <spinner label="Unità griglia (metri)" label_width="192" name="GridResolution" width="250"/> <spinner label="Estensione della griglia (metri)" label_width="192" name="GridDrawSize" width="250"/> - <check_box label="Usa allineamento sub-unitario" name="GridSubUnit"/> - <check_box label="Guarda le cross-sections" name="GridCrossSection"/> - <text name="grid_opacity_label" tool_tip="Opacità della Grid"> + <check_box label="Usa sottounità " name="GridSubUnit"/> + <check_box label="Guarda le sezioni trasversali" name="GridCrossSection"/> + <text name="grid_opacity_label" tool_tip="Opacità della griglia"> Opacità : </text> <slider label="Trasparenza della griglia" name="GridOpacity" width="250"/> diff --git a/indra/newview/skins/default/xui/it/floater_bulk_perms.xml b/indra/newview/skins/default/xui/it/floater_bulk_perms.xml index 26890dc209..89f4a0cb71 100644 --- a/indra/newview/skins/default/xui/it/floater_bulk_perms.xml +++ b/indra/newview/skins/default/xui/it/floater_bulk_perms.xml @@ -13,27 +13,27 @@ Conclusa richiesta di modifica dei permessi. </floater.string> <check_box label="Animazioni" name="check_animation"/> - <icon name="icon_animation" tool_tip="Animazioni"/> + <icon name="icon_animation" tool_tip="Animazione"/> <check_box label="Parti del corpo" name="check_bodypart"/> - <icon name="icon_bodypart" tool_tip="Parti del Corpo"/> + <icon name="icon_bodypart" tool_tip="Parti del corpo"/> <check_box label="Abiti" name="check_clothing"/> <icon name="icon_clothing" tool_tip="Vestiario"/> <check_box label="Gesture" name="check_gesture"/> - <icon name="icon_gesture" tool_tip="Gestures"/> + <icon name="icon_gesture" tool_tip="Gesture"/> <check_box label="Notecard" name="check_notecard"/> - <icon name="icon_notecard" tool_tip="Notecards"/> + <icon name="icon_notecard" tool_tip="Biglietti"/> <check_box label="Oggetti" name="check_object"/> <icon name="icon_object" tool_tip="Oggetti"/> <check_box label="Script" name="check_script"/> - <icon name="icon_script" tool_tip="Scripts"/> + <icon name="icon_script" tool_tip="Script"/> <check_box label="Suoni" name="check_sound"/> <icon name="icon_sound" tool_tip="Suoni"/> <check_box label="Texture" name="check_texture"/> - <icon name="icon_texture" tool_tip="Textures"/> - <button label="√ Tutto" label_selected="Tutti" name="check_all"/> - <button label="Pulisci" label_selected="Nessuno" name="check_none"/> + <icon name="icon_texture" tool_tip="Texture"/> + <button label="√ Tutti" label_selected="Tutti" name="check_all"/> + <button label="Cancella" label_selected="Nessuno" name="check_none"/> <text name="newperms"> - Nuovo Permessi del Contenuto + Nuovi permessi del contenuto </text> <text name="GroupLabel"> Gruppo: @@ -44,11 +44,11 @@ </text> <check_box label="Copia" name="everyone_copy"/> <text name="NextOwnerLabel"> - Prossimo proprietario: + Proprietario successivo: </text> <check_box label="Modificare" name="next_owner_modify"/> <check_box label="Copiare" name="next_owner_copy"/> - <check_box initial_value="true" label="Transfer" name="next_owner_transfer" tool_tip="Prossimo proprietario può donare o rivendere questo oggetto"/> - <button label="Ok" name="apply"/> - <button label="Cancella" name="close"/> + <check_box initial_value="true" label="Trasferisci" name="next_owner_transfer" tool_tip="Il prossimo proprietario può regalare o rivendere questo oggetto"/> + <button label="OK" name="apply"/> + <button label="Annulla" name="close"/> </floater> diff --git a/indra/newview/skins/default/xui/it/floater_buy_contents.xml b/indra/newview/skins/default/xui/it/floater_buy_contents.xml index e84d396138..a54751e629 100644 --- a/indra/newview/skins/default/xui/it/floater_buy_contents.xml +++ b/indra/newview/skins/default/xui/it/floater_buy_contents.xml @@ -8,8 +8,7 @@ </text> <button label="Annulla" label_selected="Annulla" name="cancel_btn" width="73"/> <button label="Compra" label_selected="Compra" left_delta="-77" name="buy_btn" width="73"/> - <check_box bottom="-234" label="Indossa adesso -l'indumento" left_delta="-125" name="wear_check"/> + <check_box bottom="-234" label="Indossa adesso l'indumento" left_delta="-125" name="wear_check"/> <string name="no_copy_text"> (non copiabile) </string> diff --git a/indra/newview/skins/default/xui/it/floater_buy_currency.xml b/indra/newview/skins/default/xui/it/floater_buy_currency.xml index 9d97f7d72d..1327e8b172 100644 --- a/indra/newview/skins/default/xui/it/floater_buy_currency.xml +++ b/indra/newview/skins/default/xui/it/floater_buy_currency.xml @@ -1,16 +1,16 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="buy currency" title="COMPRA L$"> +<floater name="buy currency" title="ACQUISTA L$"> <floater.string name="buy_currency"> - Compra L$ [LINDENS] per approx. [LOCALAMOUNT] + Acquista [LINDENS] L$ per circa [LOCALAMOUNT] </floater.string> <text font="SansSerifLarge" left="5" name="info_need_more" right="-5"> - Necessiti di più L$ + Ti servono più L$ </text> <text name="contacting"> Sto contattando il LindeX... </text> <text name="info_buying"> - COMPRA L$ + Acquista L$ </text> <text name="balance_label"> Io ho @@ -19,7 +19,7 @@ [AMT]L$ </text> <text name="currency_action" width="45"> - Io voglio comprare + Voglio acquistare </text> <text name="currency_label"> L$ @@ -31,13 +31,13 @@ Al prezzo </text> <text name="currency_est"> - approx. [LOCALAMOUNT] + circa [LOCALAMOUNT] </text> <text name="getting_data"> - Calcolando... + Stima in corso... </text> <text name="buy_action"> - [NAME] [PRICE]L$ + [ACTION] </text> <text name="total_label"> Il mio saldo sarà @@ -46,18 +46,18 @@ [AMT]L$ </text> <text name="currency_links"> - [http://www.secondlife.com/ payment method] | [http://www.secondlife.com/ currency] | [http://www.secondlife.com/my/account/exchange_rates.php exchange rate] + [http://www.secondlife.com/my/account/payment_method_management.php payment method] | [http://www.secondlife.com/my/account/currency.php currency] | [http://www.secondlife.com/my/account/exchange_rates.php exchange rate] </text> <text name="exchange_rate_note"> - Ri-scrivi un importo per vedere l'ultimo rapporto di cambio. + Riscrivi l'importo per vedere l'ultimo tasso al cambio. </text> <text name="purchase_warning_repurchase"> - Confermando questo acquisto di soli L$, non l'oggetto. + La conferma di questo acquisto compra solo L$, non l'oggetto. </text> <text bottom_delta="16" name="purchase_warning_notenough"> - Non stai acquistando abbastanza L$. Per favore aumenta l'importo. + Non stai acquistando abbastanza L$. Aumenta l'importo. </text> - <button label="Compra ora" name="buy_btn"/> + <button label="Acquista adesso" name="buy_btn"/> <button label="Cancella" name="cancel_btn"/> <text left="5" name="info_cannot_buy" right="-5"> Non in grado di acquistare diff --git a/indra/newview/skins/default/xui/it/floater_buy_currency_html.xml b/indra/newview/skins/default/xui/it/floater_buy_currency_html.xml new file mode 100644 index 0000000000..4a1bf33403 --- /dev/null +++ b/indra/newview/skins/default/xui/it/floater_buy_currency_html.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_buy_currency_html" title="ACQUISTA VALUTA"/> diff --git a/indra/newview/skins/default/xui/it/floater_buy_land.xml b/indra/newview/skins/default/xui/it/floater_buy_land.xml index 9fa5bd5570..f3b30f7048 100644 --- a/indra/newview/skins/default/xui/it/floater_buy_land.xml +++ b/indra/newview/skins/default/xui/it/floater_buy_land.xml @@ -1,5 +1,129 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="buy land" title="COMPRA LA TERRA"> +<floater name="buy land" title="ACQUISTA TERRENO"> + <floater.string name="can_resell"> + Può essere rivenduto. + </floater.string> + <floater.string name="can_not_resell"> + Può non essere rivenduto. + </floater.string> + <floater.string name="can_change"> + Può essere unito o suddiviso. + </floater.string> + <floater.string name="can_not_change"> + Non può essere unito o suddiviso. + </floater.string> + <floater.string name="cant_buy_for_group"> + Non sei autorizzato ad acquistare terreno per il tuo gruppo attivo. + </floater.string> + <floater.string name="no_land_selected"> + Nessun terreno selezionato. + </floater.string> + <floater.string name="multiple_parcels_selected"> + Hai selezionato lotti diversi. +Prova a selezionare un'area più piccola. + </floater.string> + <floater.string name="no_permission"> + Non sei autorizzato ad acquistare terreno per il tuo gruppo attivo. + </floater.string> + <floater.string name="parcel_not_for_sale"> + Il terreno selezionato non è in vendita. + </floater.string> + <floater.string name="group_already_owns"> + Il gruppo possiede già il terreno. + </floater.string> + <floater.string name="you_already_own"> + Sei già proprietario del terreno. + </floater.string> + <floater.string name="set_to_sell_to_other"> + Il terreno selezionato è già impostato per la vendita ad un altro gruppo. + </floater.string> + <floater.string name="no_public_land"> + L'area selezionata non è pubblica. + </floater.string> + <floater.string name="not_owned_by_you"> + Hai selezionato terreno di proprietà di un altro residente. +Prova a scegliere una superficie più piccola. + </floater.string> + <floater.string name="processing"> + Stiamo elaborando il tuo acquisto... + +(Potrebbe volerci un minuto o due.) + </floater.string> + <floater.string name="fetching_error"> + Si 'e verificato un errore mentre si stavano ottenendo le informazioni sull'acquisto del terreno. + </floater.string> + <floater.string name="buying_will"> + Acuistando il terreno: + </floater.string> + <floater.string name="buying_for_group"> + Acuistando il terreno per il gruppo: + </floater.string> + <floater.string name="cannot_buy_now"> + Non puoi comprare ora: + </floater.string> + <floater.string name="not_for_sale"> + Non in vendita: + </floater.string> + <floater.string name="none_needed"> + nessuno necessario + </floater.string> + <floater.string name="must_upgrade"> + Per acquistare terreno devi passare a un livello di abbonamento superiore. + </floater.string> + <floater.string name="cant_own_land"> + Con questo account puoi essere proprietario di terreno. + </floater.string> + <floater.string name="land_holdings"> + Sei proprietario di [BUYER] m² di terreno. + </floater.string> + <floater.string name="pay_to_for_land"> + Paga [AMOUNT] L$ a [SELLER] per questa terra + </floater.string> + <floater.string name="buy_for_US"> + Acquista L$ [AMOUNT] per circa [LOCAL_AMOUNT], + </floater.string> + <floater.string name="parcel_meters"> + Questo lotto è di [AMOUNT] m² + </floater.string> + <floater.string name="premium_land"> + Questo terreno è premium, e costerà come [AMOUNT] m². + </floater.string> + <floater.string name="discounted_land"> + Questo terreno è scontato, e costerà come [AMOUNT] m². + </floater.string> + <floater.string name="meters_supports_object"> + [AMOUNT] m² +consente [AMOUNT2] oggetti + </floater.string> + <floater.string name="sold_with_objects"> + venduta con oggetti + </floater.string> + <floater.string name="sold_without_objects"> + Oggetti non inclusi + </floater.string> + <floater.string name="info_price_string"> + L$ [PRICE] +([PREZZO_PER_MQ] L$/m²) +[VENDUTO_CON_OGGETTI] + </floater.string> + <floater.string name="insufficient_land_credits"> + Il gruppo [GROUP] avrà bisogno di contributi di crediti di utilizzo terreno sufficienti a coprire il terreno prima che l'acquisto sia completato. + </floater.string> + <floater.string name="have_enough_lindens"> + Hai [AMOUNT] L$, che sono sufficienti per comprare questo terreno. + </floater.string> + <floater.string name="not_enough_lindens"> + Hai solo [AMOUNT] L$, ed hai bisogno di altri [AMOUNT2] L$. + </floater.string> + <floater.string name="balance_left"> + Dopo l'acquisto, ti rimarranno [AMOUNT] L$. + </floater.string> + <floater.string name="balance_needed"> + Hai bisogno di acquistare almeno [AMOUNT] L$ per comprare questo terreno. + </floater.string> + <floater.string name="no_parcel_selected"> + (nessun terreno selezionato) + </floater.string> <text name="region_name_label"> Regione: </text> @@ -58,8 +182,8 @@ </text> <text name="info_price"> L$ 1500 -(L$ 1.1/m²) -sold with objects +( 1.1 L$/m²) +venduto con oggetti </text> <text name="info_action"> Comprando questa terra: @@ -75,16 +199,16 @@ sold with objects Solo i membri premium possono possedere terra. </text> <combo_box name="account_level"> - <combo_box.item label="US$9.95/mese, addebitato mensilmente" name="US$9.95/month,billedmonthly"/> - <combo_box.item label="US$7.50/mese, addebitato trimestralmente" name="US$7.50/month,billedquarterly"/> - <combo_box.item label="US$6.00/mese, addebitato annualmente" name="US$6.00/month,billedannually"/> + <combo_box.item label="US$ 9.95 al mese, addebitato mensilmente" name="US$9.95/month,billedmonthly"/> + <combo_box.item label="US$ 7.50 al mese, addebitato trimestralmente" name="US$7.50/month,billedquarterly"/> + <combo_box.item label="US$ 6.00 al mese, addebitato annualmente" name="US$6.00/month,billedannually"/> </combo_box> <text name="land_use_action"> - Aumenta il tasso di pagamento mensile delle tasse d'uso della terra a 40 US$/mese. + Aumenta le tariffe mensili di utilizzo del terreno a 40 US$/mese. </text> <text name="land_use_reason"> Tu occupi 1309 m² di terreno. -This parcel is 512 m² di terreno. +Questo lotto consiste in 512 m² di terreno. </text> <text name="purchase_action"> Paga il residente Joe 4000 L$ per la terra @@ -99,7 +223,7 @@ This parcel is 512 m² di terreno. 1000 </line_editor> <text name="currency_est"> - per circa. [LOCAL_AMOUNT] + per circa [LOCAL_AMOUNT] </text> <text name="currency_balance"> Possiedi 2.100 L$. @@ -107,133 +231,4 @@ This parcel is 512 m² di terreno. <check_box label="Rimuovi [AMOUNT] m² di contribuzione dal gruppo." name="remove_contribution"/> <button label="Compra" name="buy_btn"/> <button label="Annulla" name="cancel_btn"/> - <string name="can_resell"> - Può essere rivenduta. - </string> - <string name="can_not_resell"> - Può non essere rivenduta. - </string> - <string name="can_change"> - Può essere unita o suddivisa. - </string> - <string name="can_not_change"> - Non può essere unita o suddivisa. - </string> - <string name="cant_buy_for_group"> - Non hai il permesso di comprare terra per il tuo gruppo attivo. - </string> - <string name="no_land_selected"> - Nessuna terra selezionata. - </string> - <string name="multiple_parcels_selected"> - Hai selezionato appezzamenti diversi. -Prova a selezionare un'area più piccola. - </string> - <string name="no_permission"> - Non hai il permesso di comprare terra per il tuo gruppo attivo. - </string> - <string name="parcel_not_for_sale"> - Il terreno selezionato non è in vendita. - </string> - <string name="group_already_owns"> - Il gruppo possiede già il terreno. - </string> - <string name="you_already_own"> - Possiedi già il terreno. - </string> - <string name="set_to_sell_to_other"> - Il terreno selezionato è già impostato per la vendita ad un altro gruppo. - </string> - <string name="no_public_land"> - L'area selezionata non è pubblica. - </string> - <string name="not_owned_by_you"> - Hai selezionato una terra posseduta da un altro utente. -Prova a selezionare un'area più piccola. - </string> - <string name="processing"> - Stiamo elaborando il tuo acquisto... - -(Potrebbe volerci un minuto o due.) - </string> - <string name="fetching_error"> - C'e stato un errore mentre si stavano ottenendo le informazioni sull'acquisto della terra. - </string> - <string name="buying_will"> - Comprando questa terra: - </string> - <string name="buying_for_group"> - Comprare la terra per il gruppo farà : - </string> - <string name="cannot_buy_now"> - Non puoi comprare ora: - </string> - <string name="not_for_sale"> - Non in vendita: - </string> - <string name="none_needed"> - nessuno necessario - </string> - <string name="must_upgrade"> - Il tuo tipo di account ha bisogno di un upgrade per possedere terra. - </string> - <string name="cant_own_land"> - Il tuo account può possedere terra. - </string> - <string name="land_holdings"> - Tu occupi [BUYER] m² di terreno. - </string> - <string name="pay_to_for_land"> - Paga [AMOUNT] L$ a [SELLER] per questa terra - </string> - <string name="buy_for_US"> - Compra L$ [AMOUNT] per circa. [LOCAL_AMOUNT], - </string> - <string name="parcel_meters"> - Questo parcel è [AMOUNT] m² - </string> - <string name="premium_land"> - Questo terreno è premium, e costerà [AMOUNT] m². - </string> - <string name="discounted_land"> - Questo terreno è scontato, e costerà [AMOUNT] m². - </string> - <string name="meters_supports_object"> - [AMOUNT] m² -mantiene [AMOUNT2] oggetti - </string> - <string name="sold_with_objects"> - venduta con oggetti - </string> - <string name="sold_without_objects"> - Oggetti non inclusi - </string> - <string name="info_price_string"> - L$ [PRICE] -(L$ [PREZZO_PER_QM]/m²) -[VENDUTO_CON_OGGETTI] - </string> - <string name="insufficient_land_credits"> - Il gruppo [GROUP] avrà bisogno di contribuzioni anticipate, mediante crediti d'uso terriero, -sufficienti a coprire l'area del terreno prima che l'acquisto -sia completato. - </string> - <string name="have_enough_lindens"> - Hai [AMOUNT] L$, che sono sufficienti per comprare questa terra. - </string> - <string name="not_enough_lindens"> - Hai solo [AMOUNT] L$, ed hai bisogno di altri [AMOUNT2] L$. - </string> - <string name="balance_left"> - Dopo l'acquisto, ti rimarranno [AMOUNT] L$. - </string> - <string name="balance_needed"> - Hai bisogno di acquistare almeno [AMOUNT] L$ per comprare questo terreno. - </string> - <string name="no_parcel_selected"> - (nessun terreno selezionato) - </string> - <string name="buy_currency"> - Compra [LINDENS] L$ per appross. [USD] US$ - </string> </floater> diff --git a/indra/newview/skins/default/xui/it/floater_buy_object.xml b/indra/newview/skins/default/xui/it/floater_buy_object.xml index 5f3413931b..895d8aa746 100644 --- a/indra/newview/skins/default/xui/it/floater_buy_object.xml +++ b/indra/newview/skins/default/xui/it/floater_buy_object.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="contents" title="COMPRA COPIA DELL'OGGETTO"> +<floater name="contents" title="ACQUISTA COPIA DELL'OGGETTO"> <text name="contents_text"> Contiene: </text> diff --git a/indra/newview/skins/default/xui/it/floater_camera.xml b/indra/newview/skins/default/xui/it/floater_camera.xml index 182f82f17f..f524bf9874 100644 --- a/indra/newview/skins/default/xui/it/floater_camera.xml +++ b/indra/newview/skins/default/xui/it/floater_camera.xml @@ -9,23 +9,28 @@ <floater.string name="move_tooltip"> Muovi la telecamera su e giù e a sinistra e destra </floater.string> + <floater.string name="camera_modes_title"> + Modalità della fotocamera + </floater.string> + <floater.string name="pan_mode_title"> + Ruota visuale - Ingrandisci - Panoramica + </floater.string> + <floater.string name="presets_mode_title"> + Visuali predefinite + </floater.string> + <floater.string name="free_mode_title"> + Vedi oggetto + </floater.string> <panel name="controls"> - <joystick_track name="cam_track_stick" tool_tip="Sposta la visuale sù e giù, sinistra e destra"/> <panel name="zoom" tool_tip="Avvicina la telecamera nell'inquadratura"> - <slider_bar name="zoom_slider" tool_tip="Zoom verso il focus"/> - </panel> - <joystick_rotate name="cam_rotate_stick" tool_tip="Ruota la visuale intorno al focus"/> - <panel name="camera_presets"> - <button name="rear_view" tool_tip="Visuale posteriore"/> - <button name="group_view" tool_tip="Visuale di Gruppo"/> - <button name="front_view" tool_tip="Visuale Frontale"/> - <button name="mouselook_view" tool_tip="Visuale Mouselook"/> + <joystick_rotate name="cam_rotate_stick" tool_tip="Ruota la visuale intorno al punto focale"/> + <slider_bar name="zoom_slider" tool_tip="Zoom verso il centro focale"/> + <joystick_track name="cam_track_stick" tool_tip="Sposta la visuale in su e in giù, a sinistra e a destra"/> </panel> </panel> <panel name="buttons"> - <button label="" name="orbit_btn" tool_tip="Ruota la visuale"/> - <button label="" name="pan_btn" tool_tip="Visuale Panoramica"/> - <button label="" name="avatarview_btn" tool_tip="Guardare un avatar"/> - <button label="" name="freecamera_btn" tool_tip="Vedi oggetto"/> + <button label="" name="presets_btn" tool_tip="Visuali predefinite"/> + <button label="" name="pan_btn" tool_tip="Ruota visuale - Ingrandisci - Panoramica"/> + <button label="" name="avatarview_btn" tool_tip="Modalità della fotocamera"/> </panel> </floater> diff --git a/indra/newview/skins/default/xui/it/floater_color_picker.xml b/indra/newview/skins/default/xui/it/floater_color_picker.xml index 8551d65da2..38d4a0a037 100644 --- a/indra/newview/skins/default/xui/it/floater_color_picker.xml +++ b/indra/newview/skins/default/xui/it/floater_color_picker.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="ColorPicker" title="SELETTORE di COLORE"> +<floater name="ColorPicker" title="SELETTORE DI COLORE"> <text name="r_val_text"> Rosso: </text> @@ -24,10 +24,10 @@ Luminosità : </text> <spinner left="84" name="lspin" width="47"/> - <check_box label="Applica ora" name="apply_immediate"/> + <check_box label="Applica adesso" name="apply_immediate"/> <button left_delta="150" name="color_pipette"/> <button label="Annulla" label_selected="Annulla" left_delta="55" name="cancel_btn"/> - <button label="Ok" label_selected="Ok" name="select_btn"/> + <button label="OK" label_selected="OK" name="select_btn"/> <text name="Current color:"> Colore attuale: </text> diff --git a/indra/newview/skins/default/xui/it/floater_customize.xml b/indra/newview/skins/default/xui/it/floater_customize.xml index 63e08444cd..63c26b4d73 100644 --- a/indra/newview/skins/default/xui/it/floater_customize.xml +++ b/indra/newview/skins/default/xui/it/floater_customize.xml @@ -1,9 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater customize" title="ASPETTO" width="551"> - <tab_container name="customize tab container" tab_min_width="120" width="549"> - <placeholder label="Parti del corpo" name="body_parts_placeholder"/> - <panel label="Forma del corpo" left="124" name="Shape" width="389"> - <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/> +<floater name="floater customize" title="ASPETTO"> + <tab_container name="customize tab container" tab_min_width="120"> + <text label="Parti del corpo" name="body_parts_placeholder"> + Parti del corpo + </text> + <panel label="Forma del corpo" left="124" name="Shape"> + <button label="Crea una nuova forma del corpo" label_selected="Crea una nuova forma del corpo" name="Create New" width="190"/> <button label="Corpo" label_selected="Corpo" name="Body"/> <button label="Testa" label_selected="Testa" name="Head"/> <button label="Occhi" label_selected="Occhi" name="Eyes"/> @@ -14,8 +16,8 @@ <button label="Torso" label_selected="Torso" name="Torso"/> <button label="Gambe" label_selected="Gambe" name="Legs"/> <radio_group name="sex radio"> - <radio_item label="Femmina" name="radio"/> - <radio_item label="Maschio" name="radio2"/> + <radio_item label="Femmina" name="radio" value="0"/> + <radio_item label="Maschio" name="radio2" value="1"/> </radio_group> <text name="title"> [DESC] @@ -33,18 +35,17 @@ Ubicato in [PATH] </text> <text name="not worn instructions"> - Indossa una nuova Forma del Corpo trascinandone una dall'inventario -sul tuo avatar. In alternativa, puoi crearne una nuova ed indossarla. + Metti una nuova figura corporea trascinandola dal tuo inventario sul tuo avatar. Oppure, crea un nuovo tatuaggio e indossalo. </text> <text name="no modify instructions"> Non hai il permesso di modificare questo indumento. </text> - <text name="Item Action Label" right="89"> + <text name="Item Action Label"> Forma del corpo: </text> - <button label="Crea una nuova forma del corpo" label_selected="Crea una nuova forma del corpo" name="Create New" width="190"/> - <button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/> - <button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/> + <button label="Salva" label_selected="Salva" name="Save"/> + <button label="Salva come..." label_selected="Salva come..." name="Save As"/> + <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert"/> </panel> <panel label="Pelle" name="Skin"> <button label="Colore della pelle" label_selected="Colore della pelle" name="Skin Color" width="115"/> @@ -67,8 +68,7 @@ sul tuo avatar. In alternativa, puoi crearne una nuova ed indossarla. Ubicata in [PATH] </text> <text name="not worn instructions"> - Indossa una nuova pelle trascinandola dall'inventario al tuo avatar. -In alternativa, puoi crearne una nuova da zero ed indossarla. + Per mettere una nuova pelle, trascinala dal tuo inventario sul tuo avatar. Oppure, crea un nuovo tatuaggio e indossalo. </text> <text name="no modify instructions"> Non hai il permesso di modificare questo indumento. @@ -80,9 +80,9 @@ In alternativa, puoi crearne una nuova da zero ed indossarla. <texture_picker label="Tatuaggi: superiori" name="Upper Tattoos" tool_tip="Clicca per scegliere un'immagine" width="96"/> <texture_picker label="Tatuaggi: inferiori" name="Lower Tattoos" tool_tip="Clicca per scegliere un'immagine" width="96"/> <button label="Crea una nuova pelle" label_selected="Crea una nuova pelle" name="Create New"/> - <button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/> - <button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/> - <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/> + <button label="Salva" label_selected="Salva" name="Save"/> + <button label="Salva come..." label_selected="Salva come..." name="Save As"/> + <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert"/> </panel> <panel label="Capelli" name="Hair"> <button label="Capelli" label_selected="Colore" name="Color"/> @@ -105,8 +105,7 @@ In alternativa, puoi crearne una nuova da zero ed indossarla. Ubicati in [PATH] </text> <text name="not worn instructions"> - Indossa dei nuovi capelli trascinandoli dall'inventario al tuo avatar. -In alternativa, puoi crearne di nuovi da zero ed indossarli. + Per cambiare capelli, trascinali dal tuo inventario sul tuo avatar. Oppure, crea un nuovo tatuaggio e indossalo. </text> <text name="no modify instructions"> Non hai il permesso per modificare questo indumento. @@ -116,9 +115,9 @@ In alternativa, puoi crearne di nuovi da zero ed indossarli. </text> <texture_picker label="Texture" name="Texture" tool_tip="Clicca per scegliere un'immagine"/> <button label="Crea nuovi capelli" label_selected="Crea nuovi capelli" name="Create New"/> - <button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/> + <button label="Salva" label_selected="Salva" name="Save"/> <button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/> - <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/> + <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert" width="120"/> </panel> <panel label="Occhi" name="Eyes"> <text name="title"> @@ -137,8 +136,7 @@ In alternativa, puoi crearne di nuovi da zero ed indossarli. Ubicati in [PATH] </text> <text name="not worn instructions"> - Indossa dei nuovi occhi trascinandoli dall'inventario al tuo avatar. -In alternativa, puoi crearne di nuovi da zero ed indossarli. + Puoi cambiare gli occhi trascinandoli dal tuo inventario al tuo avatar. Oppure, crea un nuovo tatuaggio e indossalo. </text> <text name="no modify instructions"> Non hai il permesso di modificare questo indumento. @@ -148,19 +146,21 @@ In alternativa, puoi crearne di nuovi da zero ed indossarli. </text> <texture_picker label="Iride" name="Iris" tool_tip="Clicca per scegliere un'immagine"/> <button label="Crea nuovi occhi" label_selected="Crea nuovi occhi" name="Create New"/> - <button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/> + <button label="Salva" label_selected="Salva" name="Save"/> <button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/> - <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/> + <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert" width="120"/> </panel> - <placeholder label="Vestiti" name="clothes_placeholder"/> + <text label="Vestiti" name="clothes_placeholder"> + Abiti + </text> <panel label="Camicia" name="Shirt"> <texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere un'immagine"/> <color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/> - <button label="Crea una nuova camicia" label_selected="Crea una nuova camicia" name="Create New"/> <button label="Togli" label_selected="Togli" name="Take Off"/> - <button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/> + <button label="Crea una nuova camicia" label_selected="Crea una nuova camicia" name="Create New"/> + <button label="Salva" label_selected="Salva" name="Save"/> <button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/> - <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/> + <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert" width="120"/> <text name="title"> [DESC] </text> @@ -177,8 +177,7 @@ In alternativa, puoi crearne di nuovi da zero ed indossarli. Ubicata in [PATH] </text> <text name="not worn instructions"> - Indossa una nuova maglietta trascinandola dall'inventario al tuo avatar. -In alternativa, puoi crearne una nuova da zero ed indossarla. + Metti una nuova camicia trascinandola dal tuo inventario al tuo avatar. Oppure, crea un nuovo tatuaggio e indossalo. </text> <text name="no modify instructions"> Non hai il permesso di modificare questo indumento. @@ -190,11 +189,11 @@ In alternativa, puoi crearne una nuova da zero ed indossarla. <panel label="Pantaloni" name="Pants"> <texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere un'immagine"/> <color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/> - <button label="Crea nuovi pantaloni" label_selected="Crea nuovi pantaloni" name="Create New"/> <button label="Togli" label_selected="Togli" name="Take Off"/> - <button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/> + <button label="Crea nuovi pantaloni" label_selected="Crea nuovi pantaloni" name="Create New"/> + <button label="Salva" label_selected="Salva" name="Save"/> <button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/> - <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/> + <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert" width="120"/> <text name="title"> [DESC] </text> @@ -211,8 +210,7 @@ In alternativa, puoi crearne una nuova da zero ed indossarla. Ubicati in [PATH] </text> <text name="not worn instructions"> - Indossa dei nuovi pantaloni trascinandoli dall'inventario al tuo avatar. -In alternativa, puoi crearne uno paio nuovo da zero ed indossarlo. + Metti dei nuovi pantaloni trascinandoli dal tuo inventario al tuo avatar. Oppure, crea un nuovo tatuaggio e indossalo. </text> <text name="no modify instructions"> Non hai il permesso di modificare questo indumento. @@ -238,9 +236,9 @@ In alternativa, puoi crearne uno paio nuovo da zero ed indossarlo. Ubicate in [PATH] </text> <text name="not worn instructions"> - Indossa delle nuove scarpe trascinandole dall'inventario al tuo avatar. -In alternativa, puoi crearne uno paio nuovo da zero ed indossarlo. + Metti delle nuove scarpe trascinandole dal tuo inventario al tuo avatar. Oppure, crea un nuovo tatuaggio e indossalo. </text> + <button label="Crea nuove scarpe" label_selected="Crea nuove scarpe" name="Create New"/> <text name="no modify instructions"> Non hai il permesso di modificare questo indumento. </text> @@ -249,11 +247,10 @@ In alternativa, puoi crearne uno paio nuovo da zero ed indossarlo. </text> <texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere un'immagine"/> <color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/> - <button label="Crea nuove scarpe" label_selected="Crea nuove scarpe" name="Create New"/> <button label="Togli" label_selected="Togli" name="Take Off"/> - <button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/> + <button label="Salva" label_selected="Salva" name="Save"/> <button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/> - <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/> + <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert" width="120"/> </panel> <panel label="Calze" name="Socks"> <text name="title"> @@ -272,9 +269,9 @@ In alternativa, puoi crearne uno paio nuovo da zero ed indossarlo. Ubicato in [PATH] </text> <text name="not worn instructions"> - Indossa delle nuove calze trascinandole dall'inventario al tuo avatar. -In alternativa, puoi crearne uno paio nuovo da zero ed indossarlo. + Metti delle nuove calze trascinandole dal tuo inventario al tuo avatar. Oppure, crea un nuovo tatuaggio e indossalo. </text> + <button label="Crea nuove calze" label_selected="Crea nuove calze" name="Create New"/> <text name="no modify instructions"> Non hai il permesso di modificare questo indumento. </text> @@ -283,11 +280,10 @@ In alternativa, puoi crearne uno paio nuovo da zero ed indossarlo. </text> <texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere un'immagine"/> <color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/> - <button label="Crea nuove calze" label_selected="Crea nuove calze" name="Create New"/> <button label="Togli" label_selected="Togli" name="Take Off"/> - <button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/> + <button label="Salva" label_selected="Salva" name="Save"/> <button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/> - <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/> + <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert" width="120"/> </panel> <panel label="Giacca" name="Jacket"> <text name="title"> @@ -306,9 +302,9 @@ In alternativa, puoi crearne uno paio nuovo da zero ed indossarlo. Ubicata in [PATH] </text> <text name="not worn instructions"> - Indossa una nuova giacca trascinandola dall'inventario al tuo avatar. -In alternativa, puoi crearne una nuova da zero ed indossarla. + Metti una nuova giacca trascinandola dal tuo inventario al tuo avatar. Oppure, crea un nuovo tatuaggio e indossalo. </text> + <button label="Crea una nuova giacca" label_selected="Crea una nuova giacca" name="Create New"/> <text name="no modify instructions"> Non hai il permesso di modificare questo indumento. </text> @@ -318,11 +314,10 @@ In alternativa, puoi crearne una nuova da zero ed indossarla. <texture_picker label="Tessuto: superiore" name="Upper Fabric" tool_tip="Clicca per scegliere un'immagine" width="96"/> <texture_picker label="Tessuto: inferiore" name="Lower Fabric" tool_tip="Clicca per scegliere un'immagine" width="96"/> <color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/> - <button label="Crea una nuova giacca" label_selected="Crea una nuova giacca" name="Create New"/> <button label="Togli" label_selected="Togli" name="Take Off"/> - <button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/> + <button label="Salva" label_selected="Salva" name="Save"/> <button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/> - <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/> + <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert" width="120"/> </panel> <panel label="Guanti" name="Gloves"> <text name="title"> @@ -341,9 +336,9 @@ In alternativa, puoi crearne una nuova da zero ed indossarla. Ubicati in [PATH] </text> <text name="not worn instructions"> - Indossa dei nuovi guanti trascinandoli dall'inventario al tuo avatar. -In alternativa, puoi crearne un paio nuovo da zero ed indossarlo. + Metti dei nuovi guanti trascinandoli dal tuo inventario al tuo avatar. Oppure, crea un nuovo tatuaggio e indossalo. </text> + <button label="Crea nuovi guanti" label_selected="Crea nuovi guanti" name="Create New"/> <text name="no modify instructions"> Non hai il permesso di modificare questo indumento. </text> @@ -352,11 +347,10 @@ In alternativa, puoi crearne un paio nuovo da zero ed indossarlo. </text> <texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere un'immagine"/> <color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/> - <button label="Crea nuovi guanti" label_selected="Crea nuovi guanti" name="Create New"/> <button font="SansSerifSmall" label="Rimuovi l'indumento" label_selected="Rimuovi l'indumento" name="Take Off" width="115"/> - <button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/> + <button label="Salva" label_selected="Salva" name="Save"/> <button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/> - <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/> + <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert" width="120"/> </panel> <panel label="Canottiera" name="Undershirt"> <text name="title"> @@ -375,9 +369,9 @@ In alternativa, puoi crearne un paio nuovo da zero ed indossarlo. Ubicata in [PATH] </text> <text name="not worn instructions"> - Indossa una nuova canottiera trascinandola dall'inventario al tuo avatar. -In alternativa, puoi crearne una nuovo da zero ed indossarla. + Metti una nuova maglietta intima trascinandola dal tuo inventario al tuo avatar. Oppure, crea un nuovo tatuaggio e indossalo. </text> + <button label="Crea una nuova canottiera" label_selected="Crea una nuova canottiera" name="Create New"/> <text name="no modify instructions"> Non hai il permesso di modificare questo indumento. </text> @@ -386,11 +380,10 @@ In alternativa, puoi crearne una nuovo da zero ed indossarla. </text> <texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere un'immagine"/> <color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/> - <button label="Crea una nuova canottiera" label_selected="Crea una nuova canottiera" name="Create New"/> <button font="SansSerifSmall" label="Rimuovi l'indumento" label_selected="Rimuovi l'indumento" name="Take Off" width="115"/> - <button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/> + <button label="Salva" label_selected="Salva" name="Save"/> <button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/> - <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/> + <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert" width="120"/> </panel> <panel label="Mutande" name="Underpants"> <text name="title"> @@ -409,9 +402,9 @@ In alternativa, puoi crearne una nuovo da zero ed indossarla. Ubicato in [PATH] </text> <text name="not worn instructions"> - Indossa delle nuove mutande trascinandole dall'inventario al tuo avatar. -In alternativa, puoi crearne una paio nuovo da zero ed indossarlo. + Metti dei nuovi slip trascinandoli dal tuo inventario al tuo avatar. Oppure, crea un nuovo tatuaggio e indossalo. </text> + <button label="Crea nuove mutande" label_selected="Crea nuove mutande" name="Create New"/> <text name="no modify instructions"> Non hai il permesso di modificare questo indumento. </text> @@ -420,11 +413,10 @@ In alternativa, puoi crearne una paio nuovo da zero ed indossarlo. </text> <texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere un'immagine"/> <color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/> - <button label="Crea nuove mutande" label_selected="Crea nuove mutande" name="Create New"/> <button font="SansSerifSmall" label="Rimuovi l'indumento" label_selected="Rimuovi l'indumento" name="Take Off" width="115"/> - <button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/> + <button label="Salva" label_selected="Salva" name="Save"/> <button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/> - <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/> + <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert" width="120"/> </panel> <panel label="Gonna" name="Skirt"> <text name="title"> @@ -443,9 +435,9 @@ In alternativa, puoi crearne una paio nuovo da zero ed indossarlo. Ubicata in [PATH] </text> <text name="not worn instructions"> - Indossa una nuova gonna trascinandola dall'inventario al tuo avatar. -In alternativa, puoi crearne una nuova da zero ed indossarla. + Metti una nuova gonna trascinandola dal tuo inventario al tuo avatar. Oppure, crea un nuovo tatuaggio e indossalo. </text> + <button label="Crea una nuova gonna" label_selected="Crea una nuova gonna" name="Create New"/> <text name="no modify instructions"> Non hai il permesso di modificare questo indumento. </text> @@ -454,13 +446,12 @@ In alternativa, puoi crearne una nuova da zero ed indossarla. </text> <texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere un'immagine"/> <color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/> - <button label="Crea una nuova gonna" label_selected="Crea una nuova gonna" name="Create New"/> <button font="SansSerifSmall" label="Rimuovi l'indumento" label_selected="Rimuovi l'indumento" name="Take Off" width="115"/> - <button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/> + <button label="Salva" label_selected="Salva" name="Save"/> <button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/> - <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/> + <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert" width="120"/> </panel> - <panel label="Alpha" name="Alpha"> + <panel label="Tatuaggio" name="Tattoo"> <text name="title"> [DESC] </text> @@ -468,7 +459,7 @@ In alternativa, puoi crearne una nuova da zero ed indossarla. [DESC]: non può essere modificato </text> <text name="title_loading"> - [DESC]: caricando... + [DESC]: caricamento in corso... </text> <text name="title_not_worn"> [DESC]: non indossato @@ -477,27 +468,24 @@ In alternativa, puoi crearne una nuova da zero ed indossarla. Collocato in [PATH] </text> <text name="not worn instructions"> - Metti una nuova alpha mask trascinandone una dall'inventario del tuo avatar. -In alternativa, creane una nuova partendo da zero e indossala. + Metti un nuovo tatuaggio trascinandolo dal tuo inventario al avatar. Oppure, crea un nuovo tatuaggio e indossalo. </text> + <button label="Crea un nuovo tatuaggio" label_selected="Crea un nuovo tatuaggio" name="Create New"/> <text name="no modify instructions"> - Non hai i permessi per modificare questa vestibilità . + Non hai i permessi per modificare questo capo. </text> <text name="Item Action Label"> - Alpha: + Tatuaggio: </text> - <texture_picker label="Alpha inferiore" name="Lower Alpha" tool_tip="Clicca per scegliere una fotografia"/> - <texture_picker label="Alpha superiore" name="Upper Alpha" tool_tip="Clicca per scegliere una foto"/> - <texture_picker label="Alpha della testa" name="Head Alpha" tool_tip="Clicca per scegliere una fotografia"/> - <texture_picker label="Alpha dell'occhio" name="Eye Alpha" tool_tip="Clicca per scegliere una fotografia"/> - <texture_picker label="Alpha dei capelli" name="Hair Alpha" tool_tip="Clicca per scegiere una fotografia"/> - <button label="Crea nuova alpha" label_selected="Crea nuova alpha" name="Create New"/> + <texture_picker label="Tatuaggio della testa" name="Head Tattoo" tool_tip="Clicca per scegliere una fotografia"/> + <texture_picker label="Tatuaggio superiore" name="Upper Tattoo" tool_tip="Clicca per scegliere una fotografia"/> + <texture_picker label="Tattuaggio inferiore" name="Lower Tattoo" tool_tip="Clicca per scegliere una fotografia"/> <button label="Togli" label_selected="Togli" name="Take Off"/> <button label="Salva" label_selected="Salva" name="Save"/> <button label="Salva con nome..." label_selected="Salva con nome..." name="Save As"/> <button label="Ripristina" label_selected="Ripristina" name="Revert"/> </panel> - <panel label="Tatuaggio" name="Tattoo"> + <panel label="Alpha (Trasparenza)" name="Alpha"> <text name="title"> [DESC] </text> @@ -505,7 +493,7 @@ In alternativa, creane una nuova partendo da zero e indossala. [DESC]: non può essere modificato </text> <text name="title_loading"> - [DESC]: caricando... + [DESC]: caricamento in corso... </text> <text name="title_not_worn"> [DESC]: non indossato @@ -514,26 +502,28 @@ In alternativa, creane una nuova partendo da zero e indossala. Collocato in [PATH] </text> <text name="not worn instructions"> - Metti un nuovo tatuaggio trascinandone uno dall'inventario del tuo avatar. -In alternativa, creane uno nuovo partendo da zero e indossalo. + Metti una nuova alpha mask trascinandola dal tuo inventario al tuo avatar. Oppure, crea un nuovo tatuaggio e indossalo. </text> + <button label="Crea nuovo Alpha" label_selected="Crea nuovo Alpha" name="Create New"/> <text name="no modify instructions"> - Non hai i permessi per moficare questa vestibilità . + Non hai i permessi per modificare questo capo. </text> <text name="Item Action Label"> - Tatuaggio: + Alpha: </text> - <texture_picker label="Tatuaggio della testa" name="Head Tattoo" tool_tip="Clicca per scegliere una foto"/> - <texture_picker label="Tatuaggio superiore" name="Upper Tattoo" tool_tip="Clicca per scegliere una fotografia"/> - <texture_picker label="Tatuaggio inferiore" name="Lower Tattoo" tool_tip="Clicca per scegliere una fotografia"/> - <button label="Crea Nuovo tatuaggio" label_selected="Crea un nuovo tatuaggio" name="Create New"/> + <texture_picker label="Alpha inferiore" name="Lower Alpha" tool_tip="Clicca per scegliere una fotografia"/> + <texture_picker label="Alpha superiore" name="Upper Alpha" tool_tip="Clicca per scegliere una fotografia"/> + <texture_picker label="Alpha della testa" name="Head Alpha" tool_tip="Clicca per scegliere una fotografia"/> + <texture_picker label="Alpha dell'occhio" name="Eye Alpha" tool_tip="Clicca per scegliere una fotografia"/> + <texture_picker label="Alpha dei capelli" name="Hair Alpha" tool_tip="Clicca per scegliere una fotografia"/> <button label="Togli" label_selected="Togli" name="Take Off"/> <button label="Salva" label_selected="Salva" name="Save"/> <button label="Salva con nome..." label_selected="Salva con nome..." name="Save As"/> <button label="Ripristina" label_selected="Ripristina" name="Revert"/> </panel> </tab_container> - <scroll_container left="254" name="panel_container"/> + <scroll_container name="panel_container"/> + <button label="Informazioni script" label_selected="Informazioni script" name="script_info" tool_tip="Mostra gli script collegati al tuo avatar"/> <button label="Crea vestiario" label_selected="Crea vestiario" name="make_outfit_btn"/> <button label="Annulla" label_selected="Annulla" name="Cancel"/> <button label="OK" label_selected="OK" name="Ok"/> diff --git a/indra/newview/skins/default/xui/it/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/it/floater_day_cycle_options.xml index 7d50e322c0..98c385d29f 100644 --- a/indra/newview/skins/default/xui/it/floater_day_cycle_options.xml +++ b/indra/newview/skins/default/xui/it/floater_day_cycle_options.xml @@ -57,9 +57,9 @@ <text name="WL12amHash2"> | </text> - <button font="SansSerifSmall" width="96" left="546" label="Aggiungi voce" label_selected="Aggiungi voce" name="WLAddKey"/> - <button font="SansSerifSmall" width="96" left="546" label="Cancella voce" label_selected="Cancella voce" name="WLDeleteKey"/> - <text name="WLCurKeyFrameText" width="210" left="17"> + <button label="Aggiungi voce" label_selected="Aggiungi voce" name="WLAddKey"/> + <button label_selected="Cancella voce" name="WLDeleteKey"/> + <text name="WLCurKeyFrameText"> Impostazioni del fotogramma chiave: </text> <text name="WLCurKeyTimeText"> @@ -84,9 +84,9 @@ <text name="DayCycleText3"> Anteprima: </text> - <button width="55" font="SansSerifSmall" label="Avvia" label_selected="Avvia" name="WLAnimSky"/> - <button width="55" left_delta="60" font="SansSerifSmall" label="Arresta!" label_selected="Arresta" name="WLStopAnimSky"/> - <button left_delta="60" width="150" font="SansSerifSmall" label="Usa l'ora della proprietà " label_selected="Vai all'ora della proprietà " name="WLUseLindenTime"/> + <button label="Avvia" label_selected="Avvia" name="WLAnimSky"/> + <button label="Arresta!" label_selected="Arresta" name="WLStopAnimSky"/> + <button label="Usa l'ora della proprietà " label_selected="Vai all'ora della proprietà " name="WLUseLindenTime"/> <button label="Salva il test del giorno" label_selected="Salva il test del giorno" name="WLSaveDayCycle"/> <button label="Carica il test del giorno" label_selected="Carica il test del giorno" name="WLLoadDayCycle"/> </panel> diff --git a/indra/newview/skins/default/xui/it/floater_device_settings.xml b/indra/newview/skins/default/xui/it/floater_device_settings.xml index 2410a16882..97aa64086d 100644 --- a/indra/newview/skins/default/xui/it/floater_device_settings.xml +++ b/indra/newview/skins/default/xui/it/floater_device_settings.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_device_settings" title="OPZIONI PER IL DISPOSITIVO VOICE CHAT"/> +<floater name="floater_device_settings" title="OPZIONI CHAT VOCALE"/> diff --git a/indra/newview/skins/default/xui/it/floater_event.xml b/indra/newview/skins/default/xui/it/floater_event.xml new file mode 100644 index 0000000000..a0807e04c9 --- /dev/null +++ b/indra/newview/skins/default/xui/it/floater_event.xml @@ -0,0 +1,72 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater label="Evento" name="Event" title="DETTAGLI DELL'EVENTO"> + <floater.string name="none"> + nessuno + </floater.string> + <floater.string name="notify"> + Avvisare + </floater.string> + <floater.string name="dont_notify"> + Non avvisare + </floater.string> + <floater.string name="moderate"> + Moderato + </floater.string> + <floater.string name="adult"> + Adulto + </floater.string> + <floater.string name="general"> + Generale + </floater.string> + <floater.string name="unknown"> + Sconosciuto + </floater.string> + <layout_stack name="layout"> + <layout_panel name="profile_stack"> + <text name="event_name"> + Evento senza nome...di Doom De doom! Doom doom. + </text> + <text name="event_category"> + (nessuna categoria) + </text> + <text name="event_runby_label"> + Organizzato da: + </text> + <text initial_value="(recupero)" name="event_runby"/> + <text name="event_date_label"> + Data: + </text> + <text name="event_date"> + 10/10/2010 + </text> + <text name="event_duration_label"> + Durata: + </text> + <text name="event_duration"> + 1 ora + </text> + <text name="event_covercharge_label"> + Costo: + </text> + <text name="event_cover"> + Gratis + </text> + <text name="event_location_label"> + Luogo: + </text> + <text name="event_location" value="SampleParcel, Name Long (145, 228, 26)"/> + <text name="rating_label" value="Categoria:"/> + <text name="rating_value" value="sconosciuto"/> + <expandable_text name="event_desc"> + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. + </expandable_text> + </layout_panel> + <layout_panel name="button_panel"> + <button name="create_event_btn" tool_tip="Crea evento"/> + <button name="god_delete_event_btn" tool_tip="Elimina evento"/> + <button label="Avvisami" name="notify_btn"/> + <button label="Teleport" name="teleport_btn"/> + <button label="Mappa" name="map_btn"/> + </layout_panel> + </layout_stack> +</floater> diff --git a/indra/newview/skins/default/xui/it/floater_gesture.xml b/indra/newview/skins/default/xui/it/floater_gesture.xml index eefa3bb392..b9419ebc22 100644 --- a/indra/newview/skins/default/xui/it/floater_gesture.xml +++ b/indra/newview/skins/default/xui/it/floater_gesture.xml @@ -1,24 +1,24 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater label="Posti" name="gestures" title="GESTURES"> +<floater label="Luoghi" name="gestures" title="GESTURE"> <floater.string name="loading"> - Caricando... + Caricamento in corso... </floater.string> <floater.string name="playing"> - (Riproducendo) + (Riproduzione in corso) </floater.string> <floater.string name="copy_name"> Copia di [COPY_NAME] </floater.string> - <scroll_list bottom_delta="-385" height="360" name="gesture_list"> - <scroll_list.columns label="Nome" name="name" width="129"/> - <scroll_list.columns label="Chat" name="trigger" width="106"/> - <scroll_list.columns label="Pulsante" name="shortcut" width="65"/> + <scroll_list name="gesture_list"> + <scroll_list.columns label="Nome" name="name"/> + <scroll_list.columns label="Chat" name="trigger"/> + <scroll_list.columns label="Pulsante" name="shortcut"/> </scroll_list> <panel label="bottom_panel" name="bottom_panel"> - <menu_button name="gear_btn" tool_tip="Più opzioni"/> + <menu_button name="gear_btn" tool_tip="Altre opzioni"/> <button name="new_gesture_btn" tool_tip="Crea nuova gesture"/> - <button name="activate_btn" tool_tip="Attiva/Disattiva la gesture selezionata"/> - <button name="del_btn" tool_tip="Cancella questa gesture"/> + <button name="activate_btn" tool_tip="Attiva/Disattiva gesture selezionata"/> + <button name="del_btn" tool_tip="Elimina questa gesture"/> </panel> <button label="Modifica" name="edit_btn"/> <button label="Play" name="play_btn"/> diff --git a/indra/newview/skins/default/xui/it/floater_god_tools.xml b/indra/newview/skins/default/xui/it/floater_god_tools.xml new file mode 100644 index 0000000000..32c79936cf --- /dev/null +++ b/indra/newview/skins/default/xui/it/floater_god_tools.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="godtools floater" title="GOD TOOLS"> + <tab_container name="GodTools Tabs"> + <panel label="Grid" name="grid"/> + <panel label="Region" name="region"> + <text name="Region Name:"> + Nome regione: + </text> + <check_box label="Reset Home On Teleport" name="check reset home" tool_tip="Quando un residente esce con un teleport, reimposta la sua posizione di base sul luogo di destinazione."/> + </panel> + <panel label="Objects" name="objects"> + <text name="Region Name:"> + Nome regione: + </text> + </panel> + </tab_container> +</floater> diff --git a/indra/newview/skins/default/xui/it/floater_hardware_settings.xml b/indra/newview/skins/default/xui/it/floater_hardware_settings.xml index 08326b1da3..384e7c1272 100644 --- a/indra/newview/skins/default/xui/it/floater_hardware_settings.xml +++ b/indra/newview/skins/default/xui/it/floater_hardware_settings.xml @@ -22,8 +22,7 @@ Attiva VBO: </text> <check_box initial_value="true" label="Attiva oggetti OpenGL Vertex Buffer" name="vbo" tool_tip="Attivandolo su un hardware moderno aumenta la performance. Ma, su un vecchio hardware, spesso l'implementazione dei VBO è scarsa e potresti avere dei crash quando è attivato."/> - <slider label="Texture Memory (MB):" name="GraphicsCardTextureMemory" tool_tip="Spazio di memoria da ssegnare alle textures. Memoria della scheda video in Defaults. Ridurre questa impostazione potrebbe migliorare il rendimento ma potrebbe anche rendere le textures poco definite."/> - <spinner label="Indice della distanza -della nebbia:" name="fog"/> + <slider label="Memoria texture (MB):" name="GraphicsCardTextureMemory" tool_tip="Spazio di memoria da ssegnare alle textures. Utilizza la memoria della scheda video come impostazione predefinita. La riduzione di questa impostazione potrebbe migliorare il rendimento ma potrebbe anche rendere le texture poco definite."/> + <spinner label="Indice della distanza della nebbia:" name="fog"/> <button label="OK" label_selected="OK" name="OK"/> </floater> diff --git a/indra/newview/skins/default/xui/it/floater_help_browser.xml b/indra/newview/skins/default/xui/it/floater_help_browser.xml index 9a158c5216..008643afac 100644 --- a/indra/newview/skins/default/xui/it/floater_help_browser.xml +++ b/indra/newview/skins/default/xui/it/floater_help_browser.xml @@ -1,8 +1,9 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_help_browser" title="HELP BROWSER"> +<floater name="floater_help_browser" title="BROWSER DELL'AIUTO"> + <floater.string name="loading_text"> + Caricamento in corso... + </floater.string> <layout_stack name="stack1"> - <layout_panel name="external_controls"> - <button label="Apri nel mio Web Browser" name="open_browser"/> - </layout_panel> + <layout_panel name="external_controls"/> </layout_stack> </floater> diff --git a/indra/newview/skins/default/xui/it/floater_hud.xml b/indra/newview/skins/default/xui/it/floater_hud.xml index e458913452..437d2d6496 100644 --- a/indra/newview/skins/default/xui/it/floater_hud.xml +++ b/indra/newview/skins/default/xui/it/floater_hud.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_hud" title="TUTORIAL"/> +<floater name="floater_hud" title="ESERCITAZIONE"/> diff --git a/indra/newview/skins/default/xui/it/floater_im.xml b/indra/newview/skins/default/xui/it/floater_im.xml index 6303615e60..aa916adf2c 100644 --- a/indra/newview/skins/default/xui/it/floater_im.xml +++ b/indra/newview/skins/default/xui/it/floater_im.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <multi_floater name="im_floater" title=""> <string name="only_user_message"> - Sei l'unico utente di questa sessione. + Sei il solo residente presente nella sessione. </string> <string name="offline_message"> [FIRST] [LAST] è offline. @@ -10,7 +10,7 @@ Clicca il tasto [BUTTON NAME] per accettare/connetterti a questa voice chat. </string> <string name="muted_message"> - Hai bloccato questo residente. Spedendo un messaggio sarà automaticamente sbloccati. + Hai bloccato questo residente. Quando gli invii un messaggio, verrà automaticamente sbloccato. </string> <string name="generic_request_error"> Errore durante la richiesta, riprova più tardi. @@ -31,7 +31,7 @@ Un moderatore di gruppo ti ha disabilitato dalla chat di testo. </string> <string name="add_session_event"> - Impossibile aggiungere utenti alla chat con [RECIPIENT]. + Impossibile aggiungere residenti alla sessione chat con [RECIPIENT]. </string> <string name="message_session_event"> Impossibile inviare il messaggio nella chat con [RECIPIENT]. diff --git a/indra/newview/skins/default/xui/it/floater_im_container.xml b/indra/newview/skins/default/xui/it/floater_im_container.xml index 2970639f4c..fb8e77b32f 100644 --- a/indra/newview/skins/default/xui/it/floater_im_container.xml +++ b/indra/newview/skins/default/xui/it/floater_im_container.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<multi_floater name="floater_im_box" title="Instant Messages"/> +<multi_floater name="floater_im_box" title="CONVERSAZIONI"/> diff --git a/indra/newview/skins/default/xui/it/floater_im_session.xml b/indra/newview/skins/default/xui/it/floater_im_session.xml index 830c65b443..8d395ea04b 100644 --- a/indra/newview/skins/default/xui/it/floater_im_session.xml +++ b/indra/newview/skins/default/xui/it/floater_im_session.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="panel_im"> <layout_stack name="im_panels"> - <layout_panel label="Pannello di Controllo IM" name="panel_im_control_panel"/> + <layout_panel label="Pannello di controllo IM" name="panel_im_control_panel"/> <layout_panel> <line_editor label="A" name="chat_editor"/> </layout_panel> diff --git a/indra/newview/skins/default/xui/it/floater_image_preview.xml b/indra/newview/skins/default/xui/it/floater_image_preview.xml index 341202d8bc..ee7be7b155 100644 --- a/indra/newview/skins/default/xui/it/floater_image_preview.xml +++ b/indra/newview/skins/default/xui/it/floater_image_preview.xml @@ -11,16 +11,16 @@ immagine come: </text> <combo_box label="Tipo d'abito" left="120" name="clothing_type_combo" width="166"> - <combo_box.item label="Immagine" name="Image"/> - <combo_box.item label="Capelli" name="Hair"/> - <combo_box.item label="Testa Femminile" name="FemaleHead"/> - <combo_box.item label="Corpo Femminile Superiore" name="FemaleUpperBody"/> - <combo_box.item label="Corpo Femminile Inferiore" name="FemaleLowerBody"/> - <combo_box.item label="Testa Maschile" name="MaleHead"/> - <combo_box.item label="Corpo Maschile Superiore" name="MaleUpperBody"/> - <combo_box.item label="Corpo Maschile Inferiore" name="MaleLowerBody"/> - <combo_box.item label="Gonna" name="Skirt"/> - <combo_box.item label="Sculpted Prim" name="SculptedPrim"/> + <item label="Immagine" name="Image" value="Immagine"/> + <item label="Capigliature" name="Hair" value="Capigliature"/> + <item label="Testa femminile" name="FemaleHead" value="Testa femminile"/> + <item label="Parte superiore del corpo femminile" name="FemaleUpperBody" value="Parte superiore del corpo femminile"/> + <item label="Parte inferiore del corpo femminile" name="FemaleLowerBody" value="Parte inferiore del corpo femminile"/> + <item label="Testa maschile" name="MaleHead" value="Testa maschile"/> + <item label="Parte superiore del corpo maschile" name="MaleUpperBody" value="Parte superiore del corpo maschile"/> + <item label="Parte inferiore del corpo maschile" name="MaleLowerBody" value="Parte inferiore del corpo maschile"/> + <item label="Gonna" name="Skirt" value="Gonna"/> + <item label="Prim Sculpted" name="SculptedPrim" value="Prim Sculpted"/> </combo_box> <text name="bad_image_text"> Non è stato possibile leggere l'immagine. diff --git a/indra/newview/skins/default/xui/it/floater_incoming_call.xml b/indra/newview/skins/default/xui/it/floater_incoming_call.xml index fc7b8de6f4..4d9c1b98dd 100644 --- a/indra/newview/skins/default/xui/it/floater_incoming_call.xml +++ b/indra/newview/skins/default/xui/it/floater_incoming_call.xml @@ -1,16 +1,28 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="incoming call" title="UNA PERSONA SCONOSCIUTA STA' CHIAMANDO"> +<floater name="incoming call" title="UNA PERSONA SCONOSCIUTA STA CHIAMANDO"> + <floater.string name="lifetime"> + 5 + </floater.string> <floater.string name="localchat"> - Voice Chat nei dintorni + Chat vocale nei dintorni </floater.string> <floater.string name="anonymous"> anonimo </floater.string> <floater.string name="VoiceInviteP2P"> - stà chiamando. + sta chiamando. </floater.string> <floater.string name="VoiceInviteAdHoc"> - ha aggiunto una chiamata in Voice Chat ad una conferenza in chat. + ha aderito ad una chiamata in chat vocale in conferenza. + </floater.string> + <floater.string name="VoiceInviteGroup"> + ha appena aderito al canale voce '[GROUP]'. + </floater.string> + <floater.string name="VoiceInviteQuestionGroup"> + Vuoi abbandonare [CURRENT_CHAT] e aderire alla chiamata con '[GROUP]'? + </floater.string> + <floater.string name="VoiceInviteQuestionDefault"> + Vuoi abbandonare [CURRENT_CHAT] e aderire a questa voice chat? </floater.string> <text name="question"> Vuoi abbandonare [CURRENT_CHAT] e aderire a questa voice chat? diff --git a/indra/newview/skins/default/xui/it/floater_inventory.xml b/indra/newview/skins/default/xui/it/floater_inventory.xml index 5049bb3e58..2aa6795988 100644 --- a/indra/newview/skins/default/xui/it/floater_inventory.xml +++ b/indra/newview/skins/default/xui/it/floater_inventory.xml @@ -1,16 +1,16 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Inventory" title="INVENTARIO"> +<floater name="Inventory" title="IL MIO INVENTARIO"> <floater.string name="Title"> - Inventario + IL MIO INVENTARIO </floater.string> <floater.string name="TitleFetching"> - Inventario (Fetching [ITEM_COUNT] Items...) [FILTER] + IL MIO INVENTARIO (recupero di [ITEM_COUNT] articoli...) [FILTER] </floater.string> <floater.string name="TitleCompleted"> - Inventario ([ITEM_COUNT] Items) [FILTER] + IL MIO INVENTARIO ([ITEM_COUNT] articoli) [FILTER] </floater.string> <floater.string name="Fetched"> - Raggiunto ?????????? + Completato </floater.string> <panel label="Pannello dell'Inventario" name="Inventory Panel"/> </floater> diff --git a/indra/newview/skins/default/xui/it/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/it/floater_inventory_item_properties.xml index aaf7b71656..d3dc4d7eae 100644 --- a/indra/newview/skins/default/xui/it/floater_inventory_item_properties.xml +++ b/indra/newview/skins/default/xui/it/floater_inventory_item_properties.xml @@ -56,7 +56,7 @@ </text> <check_box label="Condividi" name="CheckShareWithGroup"/> <text name="NextOwnerLabel" width="230"> - Prossimo Proprietario: + Proprietario successivo: </text> <check_box label="Modifica" name="CheckNextOwnerModify"/> <check_box label="Copiare" left_delta="88" name="CheckNextOwnerCopy"/> diff --git a/indra/newview/skins/default/xui/it/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/it/floater_inventory_view_finder.xml index b5a17b2fc1..49130285f2 100644 --- a/indra/newview/skins/default/xui/it/floater_inventory_view_finder.xml +++ b/indra/newview/skins/default/xui/it/floater_inventory_view_finder.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Inventory Finder" title="INVENTARIO_COSE_RECENTI" width="165"> +<floater name="Inventory Finder" title="INVENTARIO_COSE_RECENTI"> <check_box label="Animazioni" name="check_animation"/> <check_box label="Biglietti da visita" name="check_calling_card"/> <check_box label="Abiti" name="check_clothing"/> diff --git a/indra/newview/skins/default/xui/it/floater_joystick.xml b/indra/newview/skins/default/xui/it/floater_joystick.xml index 3eff0cfceb..3d60ded7ab 100644 --- a/indra/newview/skins/default/xui/it/floater_joystick.xml +++ b/indra/newview/skins/default/xui/it/floater_joystick.xml @@ -16,7 +16,7 @@ Modalità di controllo: </text> <check_box label="Avatar" name="JoystickAvatarEnabled"/> - <check_box label="Costruire" left="192" name="JoystickBuildEnabled"/> + <check_box label="Costruire" name="JoystickBuildEnabled"/> <check_box label="Camera dall'alto" name="JoystickFlycamEnabled"/> <text name="XScale"> Regolazione X @@ -27,13 +27,13 @@ <text name="ZScale"> Regolazione Z </text> - <text left="3" name="PitchScale" width="112"> + <text name="PitchScale"> Regolazione: Pitch </text> - <text left="3" name="YawScale" width="112"> + <text name="YawScale"> Regolazione: Yaw </text> - <text left="3" name="RollScale" width="112"> + <text name="RollScale"> Regolazione: Roll </text> <text name="XDeadZone"> @@ -45,22 +45,22 @@ <text name="ZDeadZone"> Angolo morto Z </text> - <text left="3" name="PitchDeadZone" width="112"> + <text name="PitchDeadZone"> Angolo morto: Pitch </text> - <text left="3" name="YawDeadZone" width="112"> + <text name="YawDeadZone"> Angolo morto: Yaw </text> - <text left="3" name="RollDeadZone" width="112"> + <text name="RollDeadZone"> Angolo morto: Roll </text> <text name="Feathering"> Smussamento </text> - <text left="6" name="ZoomScale2" width="135"> + <text name="ZoomScale2"> Regolazione dello zoom </text> - <text left="6" name="ZoomDeadZone" width="135"> + <text name="ZoomDeadZone" width="140"> Angolo morto dello zoom </text> <button label="SpaceNavigator Defaults" name="SpaceNavigatorDefaults"/> diff --git a/indra/newview/skins/default/xui/it/floater_lagmeter.xml b/indra/newview/skins/default/xui/it/floater_lagmeter.xml index 93bf11b069..f7b2b1ab4a 100644 --- a/indra/newview/skins/default/xui/it/floater_lagmeter.xml +++ b/indra/newview/skins/default/xui/it/floater_lagmeter.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_lagmeter" title="LAG METER"> +<floater name="floater_lagmeter" title="MISURATORE LAG"> <floater.string name="max_title_msg"> Misuratore del lag </floater.string> @@ -136,7 +136,7 @@ <text left="30" name="client_lag_cause" right="-10"/> <button label="" label_selected="" name="network_lagmeter" tool_tip="Stato del lag del network"/> <text name="network"> - Network + Rete </text> <text font="SansSerifSmall" name="network_text"> Normale @@ -150,5 +150,5 @@ Normale </text> <text left="30" name="server_lag_cause" right="-32"/> - <button label=">>" name="minimize" tool_tip="Pulsante per minimizzare"/> + <button label=">>" name="minimize" tool_tip="Cambia dimensioni floater"/> </floater> diff --git a/indra/newview/skins/default/xui/it/floater_land_holdings.xml b/indra/newview/skins/default/xui/it/floater_land_holdings.xml index 9f2884448d..1b2f2605f7 100644 --- a/indra/newview/skins/default/xui/it/floater_land_holdings.xml +++ b/indra/newview/skins/default/xui/it/floater_land_holdings.xml @@ -1,13 +1,13 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="land holdings floater" title="LA MIA TERRA"> +<floater name="land holdings floater" title="IL MIO TERRENO"> <scroll_list name="parcel list"> - <column label="Parcel" name="name"/> + <column label="Lotto" name="name"/> <column label="Regione" name="location"/> <column label="Tipo" name="type"/> <column label="Area" name="area"/> </scroll_list> <button label="Teletrasportati" label_selected="Teletrasportati" name="Teleport" tool_tip="Teletrasportati al centro di questo terreno."/> - <button label="Mappa" label_selected="Mappa" name="Show on Map" tool_tip="Mostra questa terra nella mappa del mondo" width="130"/> + <button label="Mappa" label_selected="Mappa" name="Show on Map" tool_tip="Mostra il terreno sulla mappa del mondo" width="130"/> <text name="contrib_label"> Contributi ai tuoi gruppi: </text> diff --git a/indra/newview/skins/default/xui/it/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/it/floater_live_lsleditor.xml index d86b834c38..0bd2b02323 100644 --- a/indra/newview/skins/default/xui/it/floater_live_lsleditor.xml +++ b/indra/newview/skins/default/xui/it/floater_live_lsleditor.xml @@ -1,13 +1,13 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="script ed float" title="SCRIPT: NUOVO SCRIPT"> <floater.string name="not_allowed"> - Non puoi vedere o modificare questo script, perchè è impostato come "no copy". Necesiti tutti i permessi per vedere o modificare lo script dentro un oggetto. + Per impostazione, questo script non può essere visualizzato né modificato. Per visualizzare o modificare uno script all'interno di un oggetto, devi avere i necessari diritti di modifica. </floater.string> <floater.string name="script_running"> In esecuzione </floater.string> <floater.string name="Title"> - Script: [NAME] + SCRIPT: [NAME] </floater.string> <button label="Ripristina" label_selected="Ripristina" name="Reset"/> <check_box initial_value="true" label="In esecuzione" left="4" name="running"/> diff --git a/indra/newview/skins/default/xui/it/floater_lsl_guide.xml b/indra/newview/skins/default/xui/it/floater_lsl_guide.xml index b699b280b6..47fe2de051 100644 --- a/indra/newview/skins/default/xui/it/floater_lsl_guide.xml +++ b/indra/newview/skins/default/xui/it/floater_lsl_guide.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="script ed float" title="LSL WIKI"> +<floater name="script ed float" title="RIFERIMENTO LSL"> <check_box label="Segui il cursore" name="lock_check"/> <combo_box label="Blocca" left_delta="120" name="history_combo" width="70"/> <button label="Indietro" left_delta="75" name="back_btn"/> diff --git a/indra/newview/skins/default/xui/it/floater_map.xml b/indra/newview/skins/default/xui/it/floater_map.xml index ec4bd4ef4a..d1e9c98e79 100644 --- a/indra/newview/skins/default/xui/it/floater_map.xml +++ b/indra/newview/skins/default/xui/it/floater_map.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Map"> +<floater name="Map" title=""> <floater.string name="mini_map_north"> N </floater.string> diff --git a/indra/newview/skins/default/xui/it/floater_media_browser.xml b/indra/newview/skins/default/xui/it/floater_media_browser.xml index 0e25cef60b..0a8c0f1c41 100644 --- a/indra/newview/skins/default/xui/it/floater_media_browser.xml +++ b/indra/newview/skins/default/xui/it/floater_media_browser.xml @@ -9,13 +9,13 @@ <layout_stack name="stack1"> <layout_panel name="nav_controls"> <button label="Indietro" name="back" width="75"/> - <button label="Avanti" name="forward" left_delta="75" width="70"/> - <button label="Ricarica" name="reload" left_delta="75"/> + <button label="Avanti" left_delta="75" name="forward" width="70"/> + <button label="Ricarica" left_delta="75" name="reload"/> <combo_box left_delta="75" name="address" width="510"/> - <button label="Vai" name="go" left_delta="515"/> + <button label="Vai" left_delta="515" name="go"/> </layout_panel> <layout_panel name="parcel_owner_controls"> - <button label="Invia questo URL al terreno" name="assign"/> + <button label="Invia la pagina attuale al lotto" name="assign"/> </layout_panel> <layout_panel name="external_controls"> <button label="Apri nel web browser" name="open_browser"/> diff --git a/indra/newview/skins/default/xui/it/floater_media_settings.xml b/indra/newview/skins/default/xui/it/floater_media_settings.xml index b99a11b881..d521502a4c 100644 --- a/indra/newview/skins/default/xui/it/floater_media_settings.xml +++ b/indra/newview/skins/default/xui/it/floater_media_settings.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="media_settings" title="IMPOSTAZIONI MEDIA"> <button label="OK" label_selected="OK" name="OK"/> - <button label="Cancella" label_selected="Cancella" name="Cancel"/> + <button label="Annulla" label_selected="Annulla" name="Cancel"/> <button label="Applica" label_selected="Applica" name="Apply"/> </floater> diff --git a/indra/newview/skins/default/xui/it/floater_mem_leaking.xml b/indra/newview/skins/default/xui/it/floater_mem_leaking.xml index ee3d642fef..63074d5a4c 100644 --- a/indra/newview/skins/default/xui/it/floater_mem_leaking.xml +++ b/indra/newview/skins/default/xui/it/floater_mem_leaking.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="MemLeak" title="SIMULA UNA PERDITA DI MEMORIA"> +<floater name="MemLeak" title="SIMULA UNA FUGA DI MEMORIA"> <spinner label="Perdità di velocità (bytes per frame):" name="leak_speed"/> <spinner label="Memoria Persa Max (MB):" name="max_leak"/> <text name="total_leaked_label"> diff --git a/indra/newview/skins/default/xui/it/floater_moveview.xml b/indra/newview/skins/default/xui/it/floater_moveview.xml index edc5d9178d..cdafdb0089 100644 --- a/indra/newview/skins/default/xui/it/floater_moveview.xml +++ b/indra/newview/skins/default/xui/it/floater_moveview.xml @@ -1,35 +1,75 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="move_floater"> <string name="walk_forward_tooltip"> - Cammina in avanti (premi Freccia Sù o W) + Cammina in avanti (premi freccia su o W) </string> <string name="walk_back_tooltip"> - Cammina indietro (premi Freccia Giù o S) + Cammina indietro (premi freccia giù o S) + </string> + <string name="walk_left_tooltip"> + Cammina a sinistra (premi Maiusc + freccia sinistra o A) + </string> + <string name="walk_right_tooltip"> + Cammina a destra (premi Maiusc + freccia destra o D) </string> <string name="run_forward_tooltip"> - Corri in avanti (premi Freccia Sù o W) + Corri in avanti (premi freccia su o W) </string> <string name="run_back_tooltip"> - Corri indietro (premi Freccia Giù o S) + Corri indietro (premi freccia giù o S) + </string> + <string name="run_left_tooltip"> + Corri a sinistra (premi Maiusc + freccia sinistra o A) + </string> + <string name="run_right_tooltip"> + Corri a destra (premi Maiusc + freccia destra o D) </string> <string name="fly_forward_tooltip"> - Vola in avanti (premi Freccia Sù o W) + Vola in avanti (premi freccia su o W) </string> <string name="fly_back_tooltip"> - Vola indietro (premi Freccia Giù o S) + Vola indietro (premi freccia giù o S) + </string> + <string name="fly_left_tooltip"> + Vola a sinistra (premi Maiusc + freccia sinistra o A) + </string> + <string name="fly_right_tooltip"> + Vola a destra (premi Maiusc + freccia destra o D) + </string> + <string name="fly_up_tooltip"> + Vola in alto (premi E) + </string> + <string name="fly_down_tooltip"> + Vola in basso (premi C) + </string> + <string name="jump_tooltip"> + Salta (premi E) + </string> + <string name="crouch_tooltip"> + Accovacciarsi (premi C) + </string> + <string name="walk_title"> + Cammina + </string> + <string name="run_title"> + Corri + </string> + <string name="fly_title"> + Vola </string> <panel name="panel_actions"> - <button label="" label_selected="" name="turn left btn" tool_tip="Gira a sinistra (premi Freccia Sinistra o A)"/> - <button label="" label_selected="" name="turn right btn" tool_tip="Gira a destra (premi Freccia Destra o D)"/> - <button label="" label_selected="" name="move up btn" tool_tip="Vola in alto, premi "E""/> - <button label="" label_selected="" name="move down btn" tool_tip="Vola in basso, premi "C""/> - <joystick_turn name="forward btn" tool_tip="Cammina in avanti (premi Freccia Sù o W)"/> - <joystick_turn name="backward btn" tool_tip="Cammina indietro (premi Freccia Giù o S)"/> + <button label="" label_selected="" name="move up btn" tool_tip="Vola in alto (premi E)"/> + <button label="" label_selected="" name="turn left btn" tool_tip="Gira a sinistra (premi freccia sinistra o A)"/> + <joystick_slide name="move left btn" tool_tip="Cammina a sinistra (premi Maiusc + freccia sinistra o A)"/> + <button label="" label_selected="" name="move down btn" tool_tip="Vola in basso (premi C)"/> + <button label="" label_selected="" name="turn right btn" tool_tip="Gira a destra (premi freccia destra o D)"/> + <joystick_slide name="move right btn" tool_tip="Cammina a destra (premi Maiusc + freccia destra o D)"/> + <joystick_turn name="forward btn" tool_tip="Cammina in avanti (premi freccia su o W)"/> + <joystick_turn name="backward btn" tool_tip="Cammina indietro (premi freccia giù o S)"/> </panel> <panel name="panel_modes"> - <button label="" name="mode_walk_btn" tool_tip="Modalità per camminare"/> - <button label="" name="mode_run_btn" tool_tip="Modalità per correre"/> - <button label="" name="mode_fly_btn" tool_tip="Modalità di volo"/> - <button label="Ferma il volo" name="stop_fly_btn" tool_tip="Ferma il volo"/> + <button label="" name="mode_walk_btn" tool_tip="Modalità cammina"/> + <button label="" name="mode_run_btn" tool_tip="Modalità corsa"/> + <button label="" name="mode_fly_btn" tool_tip="Modalità volo"/> </panel> </floater> diff --git a/indra/newview/skins/default/xui/it/floater_mute_object.xml b/indra/newview/skins/default/xui/it/floater_mute_object.xml index 81cd46ec4d..dd1a2b67d7 100644 --- a/indra/newview/skins/default/xui/it/floater_mute_object.xml +++ b/indra/newview/skins/default/xui/it/floater_mute_object.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="mute by name" title="BLOCCA OGGETTO PER NOME"> +<floater name="mute by name" title="BLOCCA OGGETTO IN BASE AL NOME"> <text name="message"> Blocca un oggetto: </text> diff --git a/indra/newview/skins/default/xui/it/floater_nearby_chat.xml b/indra/newview/skins/default/xui/it/floater_nearby_chat.xml index 364b62fbdb..9878fe85ea 100644 --- a/indra/newview/skins/default/xui/it/floater_nearby_chat.xml +++ b/indra/newview/skins/default/xui/it/floater_nearby_chat.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="nearby_chat" title="CHAT VICINA"/> +<floater name="nearby_chat" title="CHAT NEI DINTORNI"/> diff --git a/indra/newview/skins/default/xui/it/floater_outfit_save_as.xml b/indra/newview/skins/default/xui/it/floater_outfit_save_as.xml new file mode 100644 index 0000000000..dff5f33e57 --- /dev/null +++ b/indra/newview/skins/default/xui/it/floater_outfit_save_as.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="modal container" title="Salva vestiario"> + <button label="Salva" label_selected="Salva" name="Save"/> + <button label="Annulla" label_selected="Annulla" name="Cancel"/> + <text name="Save item as:"> + Salva quello che indosso +come nuovo vestiario: + </text> + <line_editor name="name ed"> + [DESC] (nuovo) + </line_editor> +</floater> diff --git a/indra/newview/skins/default/xui/it/floater_outgoing_call.xml b/indra/newview/skins/default/xui/it/floater_outgoing_call.xml index b4536e31cc..cdb180bacd 100644 --- a/indra/newview/skins/default/xui/it/floater_outgoing_call.xml +++ b/indra/newview/skins/default/xui/it/floater_outgoing_call.xml @@ -1,28 +1,40 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="outgoing call" title="CHIAMANDO"> +<floater name="outgoing call" title="CHIAMATA IN CORSO"> + <floater.string name="lifetime"> + 5 + </floater.string> <floater.string name="localchat"> - Voice Chat nei dintorni + Chat vocale nei dintorni </floater.string> <floater.string name="anonymous"> anonimo </floater.string> <floater.string name="VoiceInviteP2P"> - stà chiamando. + sta chiamando. </floater.string> <floater.string name="VoiceInviteAdHoc"> - ha aderito ad una chiamata Voice Chat con una chat in conferenza. + ha aderito ad una chiamata in chat vocale in conferenza. </floater.string> <text name="connecting"> - Connettendo a [CALLEE_NAME] + Collegamento in corso a [CALLEE_NAME] </text> <text name="calling"> - Chiamando [CALLEE_NAME] + Chiamata a [CALLEE_NAME] </text> <text name="noanswer"> - Nessuna risposta. Per favore riprova più tardi. + Nessuna risposta. Riprova più tardi. + </text> + <text name="nearby"> + Sei stato scollegato da [VOICE_CHANNEL_NAME]. [RECONNECT_NEARBY] + </text> + <text name="nearby_P2P_by_other"> + La chiamata è terminata. [RECONNECT_NEARBY] + </text> + <text name="nearby_P2P_by_agent"> + Hai chiuso la chiamata. [RECONNECT_NEARBY] </text> <text name="leaving"> - Abbandonando [CURRENT_CHAT]. + Chiusura chat [CURRENT_CHAT]. </text> - <button label="Cancella" label_selected="Cancella" name="Cancel"/> + <button label="Annulla" label_selected="Annulla" name="Cancel"/> </floater> diff --git a/indra/newview/skins/default/xui/it/floater_pay.xml b/indra/newview/skins/default/xui/it/floater_pay.xml index 59004bbbd7..c1ea8ec9c8 100644 --- a/indra/newview/skins/default/xui/it/floater_pay.xml +++ b/indra/newview/skins/default/xui/it/floater_pay.xml @@ -1,10 +1,10 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="Give Money" title=""> <string name="payee_group"> - Paga Gruppo + Paga gruppo </string> <string name="payee_resident"> - Paga Residente + Paga residente </string> <text left="5" name="payee_label" width="105"> Paga: @@ -18,7 +18,7 @@ <button label="10 L$" label_selected="10 L$" left="118" name="fastpay 10" width="80"/> <button label="20 L$" label_selected="20 L$" left="210" name="fastpay 20"/> <text left="4" name="amount text"> - O, scegli importo: + Oppure, scegli importo: </text> <line_editor left="70" name="amount" width="49"/> <button label="Paga" label_selected="Paga" left="127" name="pay btn"/> diff --git a/indra/newview/skins/default/xui/it/floater_pay_object.xml b/indra/newview/skins/default/xui/it/floater_pay_object.xml index c51a2b7b31..37f549b5da 100644 --- a/indra/newview/skins/default/xui/it/floater_pay_object.xml +++ b/indra/newview/skins/default/xui/it/floater_pay_object.xml @@ -1,10 +1,10 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="Give Money" title=""> <string halign="left" name="payee_group" width="100"> - Paga Gruppo + Paga gruppo </string> <string halign="left" name="payee_resident" width="120"> - Pags Residente + Paga residente </string> <icon name="icon_person" tool_tip="Persona"/> <text left="120" name="payee_name"> @@ -15,14 +15,14 @@ </text> <icon name="icon_object" tool_tip="Oggetti"/> <text left="120" name="object_name_text"> - ... + Il mio oggetto con un nome veramente lungo </text> <button label="1 L$" label_selected="1 L$" left="125" name="fastpay 1" width="70"/> <button label="5 L$" label_selected="5 L$" left="200" name="fastpay 5" width="70"/> <button label="10 L$" label_selected="10 L$" left="125" name="fastpay 10" width="70"/> <button label="20 L$" label_selected="20 L$" left="200" name="fastpay 20" width="70"/> <text halign="left" left="5" name="amount text"> - O, scegli importo: + Oppure, scegli importo: </text> <line_editor left="74" name="amount" width="50"/> <button label="Paga" label_selected="Paga" name="pay btn"/> diff --git a/indra/newview/skins/default/xui/it/floater_perm_prefs.xml b/indra/newview/skins/default/xui/it/floater_perm_prefs.xml index 67e4093951..a02b3b5075 100644 --- a/indra/newview/skins/default/xui/it/floater_perm_prefs.xml +++ b/indra/newview/skins/default/xui/it/floater_perm_prefs.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="perm prefs" title="PERMESSI di UPLOAD in DEFAULT"> +<floater name="perm prefs" title="DIRITTI DI CARICAMENTO PREDEFINITI"> <panel label="Permessi" name="permissions"> <button label="?" label_selected="?" name="help"/> <check_box label="Condividi con il gruppo" name="share_with_group"/> diff --git a/indra/newview/skins/default/xui/it/floater_postcard.xml b/indra/newview/skins/default/xui/it/floater_postcard.xml index de246db826..cb2916268a 100644 --- a/indra/newview/skins/default/xui/it/floater_postcard.xml +++ b/indra/newview/skins/default/xui/it/floater_postcard.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Postcard" title="ISTANTANEA IN EMAIL"> +<floater name="Postcard" title="INVIA FOTO VIA E-MAIL"> <text name="to_label" width="135"> Email del destinatario: </text> @@ -35,6 +35,6 @@ Vieni a vedere! </string> <string name="upload_message"> - Spedendo... + Invio... </string> </floater> diff --git a/indra/newview/skins/default/xui/it/floater_preferences.xml b/indra/newview/skins/default/xui/it/floater_preferences.xml index a76b9e3e27..c5b6654a69 100644 --- a/indra/newview/skins/default/xui/it/floater_preferences.xml +++ b/indra/newview/skins/default/xui/it/floater_preferences.xml @@ -1,15 +1,15 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater min_width="350" name="Preferences" title="PREFERENZE" width="646"> +<floater name="Preferences" title="PREFERENZE"> <button label="OK" label_selected="OK" name="OK"/> <button label="Annulla" label_selected="Annulla" name="Cancel"/> - <tab_container name="pref core" tab_width="146" width="646"> + <tab_container name="pref core" tab_width="100"> <panel label="Generale" name="general"/> <panel label="Grafica" name="display"/> - <panel label="Privacy" name="im"/> - <panel label="Suono" name="audio"/> + <panel label="Riservatezza" name="im"/> + <panel label="Audio e media" name="audio"/> <panel label="Chat" name="chat"/> <panel label="Notifiche" name="msgs"/> - <panel label="Configurazione" name="input"/> - <panel label="Avanzato" name="advanced1"/> + <panel label="Impostazione" name="input"/> + <panel label="Avanzate" name="advanced1"/> </tab_container> </floater> diff --git a/indra/newview/skins/default/xui/it/floater_preview_animation.xml b/indra/newview/skins/default/xui/it/floater_preview_animation.xml index 006198781b..73082c9526 100644 --- a/indra/newview/skins/default/xui/it/floater_preview_animation.xml +++ b/indra/newview/skins/default/xui/it/floater_preview_animation.xml @@ -6,6 +6,6 @@ <text name="desc txt"> Descrizione: </text> - <button label="Esegui inworld" label_selected="Ferma" left="20" name="Anim play btn" tool_tip="Riproduci questa animazione così che gli altri possano vederla" width="131"/> + <button label="Riproduci in Second Life" label_selected="Ferma" left="20" name="Anim play btn" tool_tip="Riproduci questa animazione così che gli altri possano vederla" width="131"/> <button label="Esegui localmente" label_selected="Ferma" left="162" name="Anim audition btn" tool_tip="Riproduci questa animazione così che solo tu possa vederla" width="125"/> </floater> diff --git a/indra/newview/skins/default/xui/it/floater_preview_gesture.xml b/indra/newview/skins/default/xui/it/floater_preview_gesture.xml index 850f4c21ac..4e926cedc9 100644 --- a/indra/newview/skins/default/xui/it/floater_preview_gesture.xml +++ b/indra/newview/skins/default/xui/it/floater_preview_gesture.xml @@ -24,6 +24,9 @@ <floater.string name="Title"> Gesture: [NAME] </floater.string> + <text name="name_text"> + Nome: + </text> <text name="desc_label"> Descrizione: </text> @@ -47,18 +50,18 @@ <text name="steps_label"> Fasi: </text> - <button label="Sù" name="up_btn"/> + <button label="Su" name="up_btn"/> <button label="Giù" name="down_btn"/> <button label="Elimina" name="delete_btn"/> <radio_group name="animation_trigger_type"> - <radio_item label="Inizia" name="start"/> - <radio_item label="Stop" name="stop"/> + <radio_item label="Attiva" name="start"/> + <radio_item label="Ferma" name="stop"/> </radio_group> <check_box label="finché le animazioni sono eseguite" left="226" name="wait_anim_check"/> <check_box label="tempo in secondi" name="wait_time_check"/> <line_editor left_delta="114" name="wait_time_editor"/> <text name="help_label"> - Tutte le fasi avvengono simultaneamente, a meno che non aggiungi una fase attendi. + Tutte le fasi avvengono contemporaneamente, a meno che non aggiungi fasi di attesa. </text> <check_box label="Attiva" name="active_check" tool_tip="Le gesture attivate possono essere eseguite scrivendo in chat la parola chiave o premendo i tasti chiave. Le gesture generalmente si disattivano quando c'è un conflitto nei relativi tasti."/> <button label="Anteprima" name="preview_btn"/> diff --git a/indra/newview/skins/default/xui/it/floater_preview_gesture_info.xml b/indra/newview/skins/default/xui/it/floater_preview_gesture_info.xml index 660b868cae..d490416cc7 100644 --- a/indra/newview/skins/default/xui/it/floater_preview_gesture_info.xml +++ b/indra/newview/skins/default/xui/it/floater_preview_gesture_info.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Gesture" title="GESTURE SHORTCUT"/> +<floater name="Gesture" title="SCORCIATOIA GESTURE"/> diff --git a/indra/newview/skins/default/xui/it/floater_preview_gesture_shortcut.xml b/indra/newview/skins/default/xui/it/floater_preview_gesture_shortcut.xml index 942d5ed1ce..eb0bc4d868 100644 --- a/indra/newview/skins/default/xui/it/floater_preview_gesture_shortcut.xml +++ b/indra/newview/skins/default/xui/it/floater_preview_gesture_shortcut.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Gesture" title="TASTO RAPIDO PER GESTURE"> +<floater name="Gesture" title="SCORCIATOIA GESTURE"> <text name="trigger_label"> Chat: </text> @@ -8,8 +8,8 @@ </text> <combo_box label="Nessuno" name="modifier_combo"/> <combo_box label="Nessuno" name="key_combo"/> - <text name="replace_text" tool_tip="Sostituisci la parola chiave con queste parole. Per esempio, parola chiave 'ciao' sostituendo con 'buongiorno' cambierà la chat da 'Io dico ciao' in 'Io dico buongiorno' non appena attiverete la gesture!"> + <text name="replace_text" tool_tip="Sostituisci la parola chiave con queste parole. Per esempio, se si sceglie di sostituire la parola chiave 'ciao' con 'buongiorno', nella chat il testo 'Volevo dire ciao' diventerà 'Volevo dire buongiorno' e verrà attivata la gesture."> Sostituisci: </text> - <line_editor name="replace_editor" tool_tip="Sostituisci la parola chiave con queste parole. Per esempio, parola chiave 'ciao' sostituendo con 'buongiorno' cambierà la chat da 'Io dico ciao' in 'Io dico buongiorno' non appena attiverete la gesture"/> + <line_editor name="replace_editor" tool_tip="Sostituisci la parola chiave con queste parole. Per esempio, se si sceglie di sostituire la parola chiave 'ciao' con 'buongiorno', nella chat il testo 'Volevo dire ciao' diventerà 'Volevo dire buongiorno' e verrà attivata la gesture"/> </floater> diff --git a/indra/newview/skins/default/xui/it/floater_preview_gesture_steps.xml b/indra/newview/skins/default/xui/it/floater_preview_gesture_steps.xml index 7c1f55ddba..d490416cc7 100644 --- a/indra/newview/skins/default/xui/it/floater_preview_gesture_steps.xml +++ b/indra/newview/skins/default/xui/it/floater_preview_gesture_steps.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Gesture" title="TASTO RAPIDO GESTURE"/> +<floater name="Gesture" title="SCORCIATOIA GESTURE"/> diff --git a/indra/newview/skins/default/xui/it/floater_preview_notecard.xml b/indra/newview/skins/default/xui/it/floater_preview_notecard.xml index 08f5087242..7ec229f9d3 100644 --- a/indra/newview/skins/default/xui/it/floater_preview_notecard.xml +++ b/indra/newview/skins/default/xui/it/floater_preview_notecard.xml @@ -1,16 +1,13 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="preview notecard" title="NOTE:"> +<floater name="preview notecard" title="BIGLIETTO:"> <floater.string name="no_object"> - Impossibile trovare l'oggetto che contiene questa nota. + Impossibile trovare un oggetto contenente questo biglietto </floater.string> <floater.string name="not_allowed"> - Non hai i permessi per leggere questa nota. + Non hai il permesso di leggere questo biglietto. </floater.string> <floater.string name="Title"> - Notecard: [NAME] - </floater.string> - <floater.string label="Salva" label_selected="Salva" name="Save"> - Salva + Biglietto: [NAME] </floater.string> <text name="desc txt"> Descrizione: @@ -19,4 +16,5 @@ In caricamento... </text_editor> <button label="Salva" label_selected="Salva" name="Save"/> + <button label="Elimina" label_selected="Elimina" name="Delete"/> </floater> diff --git a/indra/newview/skins/default/xui/it/floater_preview_sound.xml b/indra/newview/skins/default/xui/it/floater_preview_sound.xml index 182243561c..8eb9573e54 100644 --- a/indra/newview/skins/default/xui/it/floater_preview_sound.xml +++ b/indra/newview/skins/default/xui/it/floater_preview_sound.xml @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="preview_sound"> <floater.string name="Title"> - Suono: [NAME] + Suono : [NAME] </floater.string> <text name="desc txt"> Descrizione: </text> - <button label="Avvia inworld" label_selected="Avvia inworld" name="Sound play btn" tool_tip="Riproduci questo suono in modo che gli altri possano sentirlo"/> - <button label="Avvia localmente" label_selected="Avvia localmente" name="Sound audition btn" tool_tip="Riproduci questo suono in modo che solo tu possa sentirlo"/> + <button label="Riproduci in Second Life" label_selected="Riproduci in Second Life" name="Sound play btn" tool_tip="Riproduci questo suono in modo che anche gli altri possano udirlo"/> + <button label="Avvia localmente" label_selected="Avvia localmente" name="Sound audition btn" tool_tip="Riproduci questo suono in modo che solo tu possa udirlo"/> </floater> diff --git a/indra/newview/skins/default/xui/it/floater_preview_texture.xml b/indra/newview/skins/default/xui/it/floater_preview_texture.xml index dd24079ea3..5b4054514e 100644 --- a/indra/newview/skins/default/xui/it/floater_preview_texture.xml +++ b/indra/newview/skins/default/xui/it/floater_preview_texture.xml @@ -10,35 +10,38 @@ Descrizione: </text> <text name="dimensions"> - [WIDTH]px x [HEIGHT]px + [WIDTH] px x [HEIGHT] px </text> - <combo_box name="combo_aspect_ratio" tool_tip="Anteprima del rapporto d'aspetto impostato"> + <text name="aspect_ratio"> + Antreprima rapporto di visualizzazione + </text> + <combo_box name="combo_aspect_ratio" tool_tip="Anteprima con rapporto di visualizzazione fisso"> <combo_item name="Unconstrained"> Libero </combo_item> - <combo_item name="1:1" tool_tip="Immagine del Gruppo o Profilo nel Mondo Reale"> + <combo_item name="1:1" tool_tip="Logo del gruppo o profilo nel mondo reale"> 1:1 </combo_item> - <combo_item name="4:3" tool_tip="[SECOND_LIFE] profilo"> + <combo_item name="4:3" tool_tip="Profilo [SECOND_LIFE]"> 4:3 </combo_item> - <combo_item name="10:7" tool_tip="Annunci ed elenco del Cerca, landmarks"> + <combo_item name="10:7" tool_tip="Annunci e inserzioni, punti di riferimento"> 10:7 </combo_item> - <combo_item name="3:2" tool_tip="Info sul terreno"> + <combo_item name="3:2" tool_tip="Informazioni sul terreno"> 3:2 </combo_item> <combo_item name="16:10"> 16:10 </combo_item> - <combo_item name="16:9" tool_tip="Preferiti nel Profilo"> + <combo_item name="16:9" tool_tip="Preferiti del Profilo"> 16:9 </combo_item> <combo_item name="2:1"> 2:1 </combo_item> </combo_box> - <button label="OK" name="keep"/> - <button label="Cancella" name="discard"/> - <button label="Salva come:" name="save_tex_btn"/> + <button label="OK" name="Keep"/> + <button label="Elimina" name="Discard"/> + <button label="Salva con nome" name="save_tex_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/it/floater_publish_classified.xml b/indra/newview/skins/default/xui/it/floater_publish_classified.xml new file mode 100644 index 0000000000..6984412728 --- /dev/null +++ b/indra/newview/skins/default/xui/it/floater_publish_classified.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="publish_classified" title="Pubblicazione inserzione"> + <text name="explanation_text"> + La tua inserzione sarà visibile per una settimana dal giorno della sua pubblicazione. + +Ricordiamo che i costi per gli annunci non possono essere rimborsati + </text> + <spinner label="Prezzo per inserzione:" name="price_for_listing" tool_tip="Prezzo per inserzione:" value="50"/> + <text name="l$_text" value="L$"/> + <text name="more_info_text"> + Maggiori informazioni (link alla guida sugli annunci) + </text> + <button label="Pubblica" name="publish_btn"/> + <button label="Annulla" name="cancel_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/it/floater_region_info.xml b/indra/newview/skins/default/xui/it/floater_region_info.xml index 98808e4b55..dc2c24ca56 100644 --- a/indra/newview/skins/default/xui/it/floater_region_info.xml +++ b/indra/newview/skins/default/xui/it/floater_region_info.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="regioninfo" title="REGIONE/PROPRIETA'"/> +<floater name="regioninfo" title="Regione/proprietà immobiliare"/> diff --git a/indra/newview/skins/default/xui/it/floater_report_abuse.xml b/indra/newview/skins/default/xui/it/floater_report_abuse.xml index a1e430b6b2..eeba54b0ca 100644 --- a/indra/newview/skins/default/xui/it/floater_report_abuse.xml +++ b/indra/newview/skins/default/xui/it/floater_report_abuse.xml @@ -1,9 +1,9 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="floater_report_abuse" title="DENUNCIA DI ABUSO"> <floater.string name="Screenshot"> - Fotografia + Immagine </floater.string> - <check_box label="Utilizza questa fotografia" name="screen_check"/> + <check_box label="Utilizza questa immagine" name="screen_check"/> <text name="reporter_title"> Segnalato da: </text> @@ -41,8 +41,8 @@ <combo_box name="category_combo" tool_tip="Categoria -- scegli la categoria che descrive meglio questa segnalazione"> <combo_box.item label="Scegli la categoria" name="Select_category"/> <combo_box.item label="Età > Far finta di essere minore" name="Age__Age_play"/> - <combo_box.item label="Età > Residente adulto nella Teen Second Life" name="Age__Adult_resident_on_Teen_Second_Life"/> - <combo_box.item label="Età > Residente minorenne al di fuori della 'Second Life per Teenager'" name="Age__Underage_resident_outside_of_Teen_Second_Life"/> + <combo_box.item label="Età > Residente adulto in Teen Second Life" name="Age__Adult_resident_on_Teen_Second_Life"/> + <combo_box.item label="Età > Residente minorenne fuori da Teen Second Life" name="Age__Underage_resident_outside_of_Teen_Second_Life"/> <combo_box.item label="Assalto > sandbox da combattimento / area pericolosa" name="Assault__Combat_sandbox___unsafe_area"/> <combo_box.item label="Assalto > Area sicura" name="Assault__Safe_area"/> <combo_box.item label="Assalto > Test di armi in sandbox" name="Assault__Weapons_testing_sandbox"/> @@ -67,8 +67,8 @@ <combo_box.item label="Molestie > Abusi verbali" name="Harassment__Verbal_abuse"/> <combo_box.item label="Indecenza > Condotta o contenuti largamente offensivi" name="Indecency__Broadly_offensive_content_or_conduct"/> <combo_box.item label="Indecenza > Nome di un avatar inappropriato" name="Indecency__Inappropriate_avatar_name"/> - <combo_box.item label="Indecenza > Contenuto o condotta inappropriata in una regione PG" name="Indecency__Mature_content_in_PG_region"/> - <combo_box.item label="Indecenza > Contenuto o condotta inappropriata in una regione Mature" name="Indecency__Inappropriate_content_in_Mature_region"/> + <combo_box.item label="Indecenza > Contenuto o condotta inappropriata in una regione con accesso Generale" name="Indecency__Mature_content_in_PG_region"/> + <combo_box.item label="Indecenza > Contenuto o condotta inappropriata in una regione con accesso Moderato" name="Indecency__Inappropriate_content_in_Mature_region"/> <combo_box.item label="Violazione della proprietà intellettuale > Rimozione contenuti" name="Intellectual_property_infringement_Content_Removal"/> <combo_box.item label="Violazione della proprietà intellettuale > CopyBot o sblocco di permessi" name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit"/> <combo_box.item label="Intolleranza" name="Intolerance"/> @@ -82,7 +82,7 @@ <text name="abuser_name_title"> Nome di chi ha commesso l'abuso: </text> - <button label="Scegli un residente" label_selected="" name="select_abuser" tool_tip="Scegli il nome di chi ha commesso l'abuso dalla lista"/> + <button label="Scegli" label_selected="" name="select_abuser" tool_tip="Scegli il nome di chi ha commesso l'abuso dalla lista"/> <text name="abuser_name_title2"> Luogo dell'abuso: </text> @@ -93,10 +93,10 @@ Dettagli: </text> <text name="bug_aviso"> - Specifica data, luogo, natura dell'abuso, testo rilevante di chat/IM, e se possibile indica l'oggetto. + Fornisci informazioni specifiche il più possibile </text> <text name="incomplete_title"> - * Nota: segnalazioni incomplete non saranno esaminate + * le segnalazioni incomplete non saranno esaminate </text> <button label="Segnala abuso" label_selected="Segnala abuso" name="send_btn"/> <button label="Annulla" label_selected="Annulla" name="cancel_btn"/> diff --git a/indra/newview/skins/default/xui/it/floater_script_limits.xml b/indra/newview/skins/default/xui/it/floater_script_limits.xml new file mode 100644 index 0000000000..2383b85bb7 --- /dev/null +++ b/indra/newview/skins/default/xui/it/floater_script_limits.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="scriptlimits" title="INFORMAZIONI SULLO SCRIPT"/> diff --git a/indra/newview/skins/default/xui/it/floater_script_preview.xml b/indra/newview/skins/default/xui/it/floater_script_preview.xml index 9428297397..d007774f43 100644 --- a/indra/newview/skins/default/xui/it/floater_script_preview.xml +++ b/indra/newview/skins/default/xui/it/floater_script_preview.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="preview lsl text" title="SCRIPT: SCRIPT DI ROTAZIONE"> <floater.string name="Title"> - Script: [NAME] + SCRIPT: [NAME] </floater.string> <text name="desc txt"> Descrizione: diff --git a/indra/newview/skins/default/xui/it/floater_script_queue.xml b/indra/newview/skins/default/xui/it/floater_script_queue.xml index 728fbe8c8d..f4117d30a2 100644 --- a/indra/newview/skins/default/xui/it/floater_script_queue.xml +++ b/indra/newview/skins/default/xui/it/floater_script_queue.xml @@ -1,13 +1,13 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="queue" title="RESETTA IL PROGRESSO"> +<floater name="queue" title="AZZERA AVANZAMENTO"> <floater.string name="Starting"> - Conteggio [START] degli [COUNT] articoli. + Avvio di [START] di [COUNT] oggetti. </floater.string> <floater.string name="Done"> - Eseguito. + Fine. </floater.string> <floater.string name="Resetting"> - Resettando + Ripristino in corso </floater.string> <floater.string name="Running"> In esecuzione diff --git a/indra/newview/skins/default/xui/it/floater_search.xml b/indra/newview/skins/default/xui/it/floater_search.xml index 6afdd2437e..05f5dfe719 100644 --- a/indra/newview/skins/default/xui/it/floater_search.xml +++ b/indra/newview/skins/default/xui/it/floater_search.xml @@ -1,15 +1,15 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="floater_search" title="TROVA"> <floater.string name="loading_text"> - Caricando... + Caricamento in corso... </floater.string> <floater.string name="done_text"> - Eseguito + Fine </floater.string> <layout_stack name="stack1"> <layout_panel name="browser_layout"> <text name="refresh_search"> - Redo search to reflect current God level + Ripeti ricerca in modo che rifletta il livello di diritti Admin attuale </text> </layout_panel> </layout_stack> diff --git a/indra/newview/skins/default/xui/it/floater_select_key.xml b/indra/newview/skins/default/xui/it/floater_select_key.xml index 181b7d5292..014bc76ffb 100644 --- a/indra/newview/skins/default/xui/it/floater_select_key.xml +++ b/indra/newview/skins/default/xui/it/floater_select_key.xml @@ -2,6 +2,6 @@ <floater name="modal container" title=""> <button label="Annulla" label_selected="Annulla" name="Cancel"/> <text name="Save item as:"> - clicca un tasto per impostare la modalità PARLA con il tuo pulsante. + Premi una chiave per configurarla come pulsante da premere per parlare. </text> </floater> diff --git a/indra/newview/skins/default/xui/it/floater_sell_land.xml b/indra/newview/skins/default/xui/it/floater_sell_land.xml index 2a4fa05b54..0f8d24ebbd 100644 --- a/indra/newview/skins/default/xui/it/floater_sell_land.xml +++ b/indra/newview/skins/default/xui/it/floater_sell_land.xml @@ -1,21 +1,21 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="sell land" title="VENDI LA TERRA"> +<floater name="sell land" title="VENDI TERRENO"> <scroll_container name="profile_scroll"> <panel name="scroll_content_panel"> <text name="info_parcel_label"> - Parcel: + Lotto: </text> <text left="82" name="info_parcel"> - NOME DEL PARCEL + NOME DEL LOTTO </text> <text name="info_size_label"> - Misura: + Dimensioni: </text> <text left="82" name="info_size"> [AREA] m² </text> <text bottom_delta="-57" height="28" name="info_action"> - Vendere questo parcel: + Per vendere questo lotto: </text> <text name="price_label"> 1. Imposta un prezzo: @@ -30,36 +30,36 @@ 0 </line_editor> <text name="price_per_m"> - (L$[PER_METER] per m²) + ([PER_METER] L$ per m²) </text> <text name="sell_to_label"> - 2. Vendi la terra a: + 2. Vendi il terreno a: </text> <text name="sell_to_text"> - Scegli se vendere a chiunque o ad un specifico compratore. + Scegli se vendere a chiunque o ad un determinato acquirente. </text> <combo_box name="sell_to"> <combo_box.item label="- Seleziona uno -" name="--selectone--"/> <combo_box.item label="Chiunque" name="Anyone"/> - <combo_box.item label="Persona Specifica:" name="Specificuser:"/> + <combo_box.item label="Persona specifica:" name="Specificuser:"/> </combo_box> <button label="Seleziona" name="sell_to_select_agent"/> <text name="sell_objects_label"> 3. Vendi gli oggetti con la terra? </text> <text name="sell_objects_text"> - Gli oggetti trasferibili del proprietaio della Terra cambieranno proprietà . + Gli oggetti trasferibili del proprietario presenti sul lotto cambieranno di proprietà . </text> <radio_group bottom_delta="-58" name="sell_objects"> - <radio_item label="No, mantieni la proprietà sugli oggetti" name="no"/> + <radio_item label="No, mantieni la proprietà degli oggetti" name="no"/> <radio_item label="Si, vendi gli oggetti con la terra" name="yes"/> </radio_group> - <button label="Mostra Oggetti" name="show_objects"/> + <button label="Mostra oggetti" name="show_objects"/> <text name="nag_message_label"> RICORDA: Tutte le vendite sono definitive. </text> - <button label="Imposta Terra in Vendita" name="sell_btn"/> - <button label="Cancella" name="cancel_btn"/> + <button label="Imposta terreno come in vendita" name="sell_btn"/> + <button label="Annulla" name="cancel_btn"/> </panel> </scroll_container> </floater> diff --git a/indra/newview/skins/default/xui/it/floater_settings_debug.xml b/indra/newview/skins/default/xui/it/floater_settings_debug.xml index 385a7ed6e9..aab00a26ce 100644 --- a/indra/newview/skins/default/xui/it/floater_settings_debug.xml +++ b/indra/newview/skins/default/xui/it/floater_settings_debug.xml @@ -1,9 +1,9 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="settings_debug" title="DEBUG SETTINGS"> - <combo_box name="boolean_combo"> - <combo_box.item label="VERO" name="TRUE"/> - <combo_box.item label="FALSO" name="FALSE"/> - </combo_box> +<floater name="settings_debug" title="PARAMETRI DI DEBUG"> + <radio_group name="boolean_combo"> + <radio_item label="VERO" name="TRUE" value="vero"/> + <radio_item label="FALSO" name="FALSE" value=""/> + </radio_group> <color_swatch label="Colore" name="val_color_swatch"/> <spinner label="x" name="val_spinner_1"/> <spinner label="x" name="val_spinner_2"/> diff --git a/indra/newview/skins/default/xui/it/floater_snapshot.xml b/indra/newview/skins/default/xui/it/floater_snapshot.xml index 668c3c8c9e..d2ba980f62 100644 --- a/indra/newview/skins/default/xui/it/floater_snapshot.xml +++ b/indra/newview/skins/default/xui/it/floater_snapshot.xml @@ -1,80 +1,23 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Snapshot" title="ANTEPRIMA FOTOGRAFIA" width="247"> - <text name="type_label"> - Destinazione della fotografia - </text> - <radio_group label="Tipo di fotografia" name="snapshot_type_radio" width="228"> - <radio_item label="Invia via email" name="postcard"/> - <radio_item label="Salva nel tuo inventario ([AMOUNT] L$)" name="texture"/> - <radio_item label="Salva sul tuo pc" name="local"/> - </radio_group> - <text name="file_size_label"> - Grandezza del file: [SIZE] KB - </text> - <button label="Aggiorna la fotografia" name="new_snapshot_btn"/> - <button label="Invia" name="send_btn"/> - <button label="Salva ([AMOUNT] L$)" name="upload_btn"/> - <flyout_button label="Salva" name="save_btn" tool_tip="Salva l'immagine come file"> - <flyout_button_item label="Salva" name="save_item"/> - <flyout_button_item label="Salva come..." name="saveas_item"/> - </flyout_button> - <button label="Annulla" name="discard_btn"/> - <button label="Espandi >>" name="more_btn" tool_tip="Opzioni Avanzate"/> - <button label="<< Diminuisci" name="less_btn" tool_tip="Opzioni Avanzate"/> - <text name="type_label2"> - Grandezza - </text> - <text name="format_label"> - Formato - </text> - <combo_box label="Risoluzione" name="postcard_size_combo"> - <combo_box.item label="Finestra corrente" name="CurrentWindow"/> - <combo_box.item label="640x480" name="640x480"/> - <combo_box.item label="800x600" name="800x600"/> - <combo_box.item label="1024x768" name="1024x768"/> - <combo_box.item label="Personalizzata" name="Custom"/> - </combo_box> - <combo_box label="Risoluzione" name="texture_size_combo"> - <combo_box.item label="Finestra corrente" name="CurrentWindow"/> - <combo_box.item label="Piccola (128x128)" name="Small(128x128)"/> - <combo_box.item label="Media (256x256)" name="Medium(256x256)"/> - <combo_box.item label="Larga (512x512)" name="Large(512x512)"/> - <combo_box.item label="Personalizzata" name="Custom"/> - </combo_box> - <combo_box label="Risoluzione" name="local_size_combo"> - <combo_box.item label="Finestra corrente" name="CurrentWindow"/> - <combo_box.item label="320x240" name="320x240"/> - <combo_box.item label="640x480" name="640x480"/> - <combo_box.item label="800x600" name="800x600"/> - <combo_box.item label="1024x768" name="1024x768"/> - <combo_box.item label="1280x1024" name="1280x1024"/> - <combo_box.item label="1600x1200" name="1600x1200"/> - <combo_box.item label="Personalizzata" name="Custom"/> - </combo_box> - <combo_box label="Formato" name="local_format_combo"> - <combo_box.item label="PNG" name="PNG"/> - <combo_box.item label="JPEG" name="JPEG"/> - <combo_box.item label="BMP" name="BMP"/> - </combo_box> - <spinner label="Larghezza" label_width="58" name="snapshot_width" width="116"/> - <spinner label="Altezza" label_width="41" left="130" name="snapshot_height" width="101"/> - <check_box label="Mantieni le proporzioni" name="keep_aspect_check"/> - <slider label="Qualità d'immagine" name="image_quality_slider"/> - <text name="layer_type_label" width="55"> - Fotografa: - </text> - <combo_box label="Layer dell'immagine" left="68" name="layer_types" width="165"> - <combo_box.item label="Colori" name="Colors"/> - <combo_box.item label="Profondità " name="Depth"/> - <combo_box.item label="Colori primari degli oggetti" name="ObjectMattes"/> - </combo_box> - <check_box label="Mostra l'interfaccia nella fotografia" name="ui_check"/> - <check_box bottom_delta="-17" label="Mostra i dispositivi indossati nella foto" name="hud_check"/> - <check_box bottom_delta="-17" label="Mantieni aperto dopo aver salvato" name="keep_open_check"/> - <check_box bottom_delta="-17" label="Blocca l'anteprima -(Anteprima a schermo intero)" name="freeze_frame_check"/> - <check_box bottom_delta="-29" label="Auto-Aggiorna" name="auto_snapshot_check"/> - <string name="unknown"> +<floater name="Snapshot" title="Istantanea" width="247"> + <floater.string name="unknown"> sconosciuto - </string> + </floater.string> + <button label="Aggiorna la fotografia" name="new_snapshot_btn"/> + <line_editor label="Descrizione" name="description"/> + <panel name="panel_snapshot_main"> + <button label="Condividi foto" name="share"/> + <button label="Salva foto" name="save"/> + <button label="Imposta come foto del profilo" name="set_profile_pic"/> + </panel> + <panel name="panel_snapshot_share"> + <button label="Condividi su Web" name="share_to_web"/> + <button label="Invia foto via e-mail" name="share_to_email"/> + <button label="Indietro" name="cancel_share"/> + </panel> + <panel name="panel_snapshot_save"> + <button label="Salva nell'inventario" name="save_to_inventory"/> + <button label="Salva sul mio computer" name="save_to_computer"/> + <button label="Indietro" name="cancel_save"/> + </panel> </floater> diff --git a/indra/newview/skins/default/xui/it/floater_stats.xml b/indra/newview/skins/default/xui/it/floater_stats.xml index 7c8e6ba1a1..aed2a03a21 100644 --- a/indra/newview/skins/default/xui/it/floater_stats.xml +++ b/indra/newview/skins/default/xui/it/floater_stats.xml @@ -2,68 +2,68 @@ <floater name="Statistics" title="STATISTICHE"> <scroll_container name="statistics_scroll"> <container_view name="statistics_view"> - <stat_view label="Base" name="basic"> + <stat_view label="Di base" name="basic"> <stat_bar label="FPS" name="fps"/> - <stat_bar label="Larghezza Banda" name="bandwidth"/> - <stat_bar label="Perdita Pacchetti" name="packet_loss"/> + <stat_bar label="Larghezza banda" name="bandwidth"/> + <stat_bar label="Perdita pacchetti" name="packet_loss"/> <stat_bar label="Tempo Ping Sim" name="ping"/> </stat_view> - <stat_view label="Avanzato" name="advanced"> + <stat_view label="Avanzata" name="advanced"> <stat_view label="Render" name="render"> - <stat_bar label="KTris Disegnate" name="ktrisframe"/> - <stat_bar label="KTris Disegnate" name="ktrissec"/> - <stat_bar label="Totale Oggetti" name="objs"/> - <stat_bar label="Nuovi Oggetti" name="newobjs"/> + <stat_bar label="KTris disegnate" name="ktrisframe"/> + <stat_bar label="KTris disegnate" name="ktrissec"/> + <stat_bar label="Totale oggetti" name="objs"/> + <stat_bar label="Nuovi oggetti" name="newobjs"/> </stat_view> <stat_view label="Texture" name="texture"> <stat_bar label="Conteggio" name="numimagesstat"/> - <stat_bar label="Conteggio Grezzo" name="numrawimagesstat"/> + <stat_bar label="Conteggio grezzo" name="numrawimagesstat"/> <stat_bar label="Memoria GL" name="gltexmemstat"/> - <stat_bar label="Memoria Formattata" name="formattedmemstat"/> - <stat_bar label="Memoria Complessiva" name="rawmemstat"/> - <stat_bar label="Memoria Impegnata" name="glboundmemstat"/> + <stat_bar label="Memoria formattata" name="formattedmemstat"/> + <stat_bar label="Memoria complessiva" name="rawmemstat"/> + <stat_bar label="Memoria impegnata" name="glboundmemstat"/> </stat_view> <stat_view label="Rete" name="network"> - <stat_bar label="Pacchetti In Ingresso" name="packetsinstat"/> - <stat_bar label="Pacchetti In Uscita" name="packetsoutstat"/> + <stat_bar label="Pacchetti in ingresso" name="packetsinstat"/> + <stat_bar label="Pacchetti in uscita" name="packetsoutstat"/> <stat_bar label="Oggetti" name="objectkbitstat"/> <stat_bar label="Texture" name="texturekbitstat"/> - <stat_bar label="Risorse Server" name="assetkbitstat"/> + <stat_bar label="Risorse server" name="assetkbitstat"/> <stat_bar label="Layer" name="layerskbitstat"/> - <stat_bar label="Effettivi In Ingresso" name="actualinkbitstat"/> - <stat_bar label="Effettivi in Uscita" name="actualoutkbitstat"/> + <stat_bar label="Effettivi in ingresso" name="actualinkbitstat"/> + <stat_bar label="Effettivi in uscita" name="actualoutkbitstat"/> <stat_bar label="Operazioni pendenti VFS" name="vfspendingoperations"/> </stat_view> </stat_view> <stat_view label="Simulatore" name="sim"> <stat_bar label="Dilatazione temporale" name="simtimedilation"/> <stat_bar label="FPS Sim" name="simfps"/> - <stat_bar label="FPS Motore Fisico" name="simphysicsfps"/> - <stat_view label="Dettagli Motore Fisico" name="physicsdetail"> - <stat_bar label="Oggetti Pinzati" name="physicspinnedtasks"/> + <stat_bar label="FPS motore fisico" name="simphysicsfps"/> + <stat_view label="Dettagli motore fisico" name="physicsdetail"> + <stat_bar label="Oggetti pinzati" name="physicspinnedtasks"/> <stat_bar label="Oggetti a basso LOD" name="physicslodtasks"/> - <stat_bar label="Memoria Allocata" name="physicsmemoryallocated"/> - <stat_bar label="Agenti Aggiornamenti al Sec" name="simagentups"/> - <stat_bar label="Agenti Principali" name="simmainagents"/> - <stat_bar label="Agenti Figli" name="simchildagents"/> + <stat_bar label="Memoria allocata" name="physicsmemoryallocated"/> + <stat_bar label="Aggiornamenti agenti al sec" name="simagentups"/> + <stat_bar label="Avatar principali" name="simmainagents"/> + <stat_bar label="Avatar secondari" name="simchildagents"/> <stat_bar label="Oggetti" name="simobjects"/> - <stat_bar label="Oggetti Attivi" name="simactiveobjects"/> - <stat_bar label="Script Attivi" name="simactivescripts"/> - <stat_bar label="Eventi Script" name="simscripteps"/> - <stat_bar label="Pacchetti In Ingresso" name="siminpps"/> - <stat_bar label="Pacchetti In Uscita" name="simoutpps"/> - <stat_bar label="Download Pendenti" name="simpendingdownloads"/> - <stat_bar label="Upload Pendenti" name="simpendinguploads"/> - <stat_bar label="Numero totale byte non risposti" name="simtotalunackedbytes"/> + <stat_bar label="Oggetti attivi" name="simactiveobjects"/> + <stat_bar label="Script attivi" name="simactivescripts"/> + <stat_bar label="Eventi di script" name="simscripteps"/> + <stat_bar label="Pacchetti in ingresso" name="siminpps"/> + <stat_bar label="Pacchetti in uscita" name="simoutpps"/> + <stat_bar label="Download in attesa" name="simpendingdownloads"/> + <stat_bar label="Caricamenti in attesa" name="simpendinguploads"/> + <stat_bar label="Numero totale byte non confermati (Unacked)" name="simtotalunackedbytes"/> </stat_view> <stat_view label="Tempo (ms)" name="simperf"> - <stat_bar label="Tempo Totale Frame" name="simframemsec"/> - <stat_bar label="Tempo Netto" name="simnetmsec"/> - <stat_bar label="Tempo Motore Fisico" name="simsimphysicsmsec"/> - <stat_bar label="Tempo Simulazione" name="simsimothermsec"/> - <stat_bar label="Tempo Agenti" name="simagentmsec"/> - <stat_bar label="Tempo Immagini" name="simimagesmsec"/> - <stat_bar label="Tempo Script" name="simscriptmsec"/> + <stat_bar label="Tempo totale Frame" name="simframemsec"/> + <stat_bar label="Tempo netto" name="simnetmsec"/> + <stat_bar label="Tempo motore fisico" name="simsimphysicsmsec"/> + <stat_bar label="Tempo simulazione" name="simsimothermsec"/> + <stat_bar label="Tempo avatar" name="simagentmsec"/> + <stat_bar label="Tempo immagini" name="simimagesmsec"/> + <stat_bar label="Tempo script" name="simscriptmsec"/> </stat_view> </stat_view> </container_view> diff --git a/indra/newview/skins/default/xui/it/floater_sys_well.xml b/indra/newview/skins/default/xui/it/floater_sys_well.xml index 057d3657d0..e1c0b89902 100644 --- a/indra/newview/skins/default/xui/it/floater_sys_well.xml +++ b/indra/newview/skins/default/xui/it/floater_sys_well.xml @@ -1,9 +1,9 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="sys_well_window" title="NOTIFICHE"> +<floater name="sys_well_window" title="AVVISI"> <string name="title_im_well_window"> - SESSIONE IM + CONVERSAZIONI </string> <string name="title_notification_well_window"> - NOTIFICHE + AVVISI </string> </floater> diff --git a/indra/newview/skins/default/xui/it/floater_telehub.xml b/indra/newview/skins/default/xui/it/floater_telehub.xml index 08f5564c7b..15312a8959 100644 --- a/indra/newview/skins/default/xui/it/floater_telehub.xml +++ b/indra/newview/skins/default/xui/it/floater_telehub.xml @@ -21,9 +21,9 @@ <button label="Aggiungi punti rigenerazione" name="add_spawn_point_btn" width="165"/> <button label="Rimuovi punti" left="175" name="remove_spawn_point_btn" width="105"/> <text name="spawn_point_help"> - Seleziona un oggetto e click "Aggiungi Spawn" per specificare la posizione. + Seleziona un oggetto e fai clic su Aggiungi per specificare la posizione. Ora puoi spostare o cancellare l'oggetto. -Le Posizioni sono relative al centro del telehub. +Le posizioni sono relative al centro del telehub. Seleziona un oggetto nella lista per evidenziarlo nel mondo. </text> </floater> diff --git a/indra/newview/skins/default/xui/it/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/it/floater_texture_ctrl.xml index e57c37073a..7b77584ba0 100644 --- a/indra/newview/skins/default/xui/it/floater_texture_ctrl.xml +++ b/indra/newview/skins/default/xui/it/floater_texture_ctrl.xml @@ -1,22 +1,22 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="texture picker" title="Foto: TEXTURE"> +<floater name="texture picker" title="PREFERITO: TEXTURE"> <string name="choose_picture"> Clicca per scegliere l'immagine </string> <text name="Multiple"> - Textures multiple + Texture multiple </text> <text name="unknown"> - Misura: [Dimensions] + Dimensioni: [DIMENSIONS] </text> <button label="Default" label_selected="Default" name="Default"/> <button label="Niente" label_selected="Niente" name="None"/> <button label="Vuoto" label_selected="Vuoto" name="Blank"/> <check_box label="Mostra cartelle" name="show_folders_check"/> - <search_editor label="Filtro Textures" name="inventory search editor"/> - <check_box label="Applica ora" name="apply_immediate_check"/> + <search_editor label="Filtro texture" name="inventory search editor"/> + <check_box label="Applica adesso" name="apply_immediate_check"/> <button label="Annulla" label_selected="Annulla" name="Cancel"/> - <button label="Ok" label_selected="Ok" name="Select"/> + <button label="OK" label_selected="OK" name="Select"/> <string name="pick title"> Scegli: </string> diff --git a/indra/newview/skins/default/xui/it/floater_tools.xml b/indra/newview/skins/default/xui/it/floater_tools.xml index dda957025b..68d193ff33 100644 --- a/indra/newview/skins/default/xui/it/floater_tools.xml +++ b/indra/newview/skins/default/xui/it/floater_tools.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="toolbox floater" short_title="STRUMENTI/ATTREZZI PER COSTRUIRE" title="" width="288"> +<floater name="toolbox floater" short_title="STRUMENTI PER COSTRUZIONE"> <floater.string name="status_rotate"> Sposta le fasce colorate per ruotare l'oggetto </floater.string> @@ -16,7 +16,7 @@ Clicca e trascina per spostare la camera </floater.string> <floater.string name="status_grab"> - Trascina per spostare, Ctrl per sollevare, Ctrl+Shift per ruotare + Trascina per spostare, Ctrl per sollevare, Ctrl+Maiusc per ruotare </floater.string> <floater.string name="status_place"> Clicca inworld per costruire @@ -39,43 +39,46 @@ <floater.string name="grid_attachment_text"> Accessorio </floater.string> - <button label="" label_selected="" name="button focus" tool_tip="Focus"/> - <button label="" label_selected="" name="button move" tool_tip="Muoviti"/> + <button label="" label_selected="" name="button focus" tool_tip="Ingrandisci"/> + <button label="" label_selected="" name="button move" tool_tip="Sposta"/> <button label="" label_selected="" name="button edit" tool_tip="Modifica"/> <button label="" label_selected="" name="button create" tool_tip="Crea"/> - <button label="" label_selected="" name="button land" tool_tip="Terra"/> - <text name="text status" width="280"> + <button label="" label_selected="" name="button land" tool_tip="Terreno"/> + <text name="text status"> Trascina per muovere, trascina+maiuscolo per copiare </text> <radio_group name="focus_radio_group"> <radio_item label="Zoom" name="radio zoom"/> <radio_item label="Guarda ruotando (Ctrl)" name="radio orbit"/> - <radio_item label="Panoramica (Ctrl+Shift)" name="radio pan"/> + <radio_item label="Panoramica (Ctrl+Maiusc)" name="radio pan"/> </radio_group> <radio_group name="move_radio_group"> <radio_item label="Muovi" name="radio move"/> <radio_item label="Alza (Ctrl)" name="radio lift"/> - <radio_item label="Ruota (Ctrl+Shift)" name="radio spin"/> + <radio_item label="Gira (Ctrl+Maiusc)" name="radio spin"/> </radio_group> <radio_group name="edit_radio_group"> <radio_item label="Sposta" name="radio position"/> <radio_item label="Ruota (Ctrl)" name="radio rotate"/> - <radio_item label="Estendi/Stira???!!!! (Ctrl+Shift)" name="radio stretch"/> - <radio_item label="Seleziona Faccia multimediale" name="radio select face"/> + <radio_item label="Allunga (Ctrl+Maiusc)" name="radio stretch"/> + <radio_item label="Seleziona faccia" name="radio select face"/> </radio_group> <check_box label="Modifica parti collegate" name="checkbox edit linked parts"/> - <text name="RenderingCost" tool_tip="Mostra il rendering cost calcolato per questo oggetto"> + <text name="RenderingCost" tool_tip="Mostra il costo di rendering calcolato per questo oggetto"> þ: [COUNT] </text> - <check_box label="Ridimens. simmetricamente" name="checkbox uniform"/> + <check_box label="" name="checkbox uniform"/> + <text label="Allunga entrambi i lati" name="checkbox uniform label"> + Allunga entrambi i lati + </text> <check_box initial_value="true" label="Ridimensiona le texture" name="checkbox stretch textures"/> - <check_box initial_value="true" label="Posiziona nella rete???!!!" name="checkbox snap to grid"/> - <combo_box left_delta="48" name="combobox grid mode" tool_tip="Scegli il tipo di righello per posizionare l'oggetto"> - <combo_box.item label="Rete del Mondo" name="World"/> + <check_box initial_value="true" label="Posiziona nella griglia" name="checkbox snap to grid"/> + <combo_box name="combobox grid mode" tool_tip="Scegli il tipo di righello per posizionare l'oggetto"> + <combo_box.item label="Rete del mondo" name="World"/> <combo_box.item label="Rete locale" name="Local"/> - <combo_box.item label="Riferimento della rete???!!!!" name="Reference"/> + <combo_box.item label="Griglia di riferimento" name="Reference"/> </combo_box> - <button label="Opzioni..." label_selected="Opzioni..." name="Options..." tool_tip="Vedi più opzioni delle rete"/> + <button label="Opzioni..." label_selected="Opzioni..." name="Options..." tool_tip="Vedi più opzioni della griglia"/> <button label="" label_selected="" name="ToolCube" tool_tip="Cubo"/> <button label="" label_selected="" name="ToolPrism" tool_tip="Prisma"/> <button label="" label_selected="" name="ToolPyramid" tool_tip="Piramide"/> @@ -91,10 +94,10 @@ <button label="" label_selected="" name="ToolRing" tool_tip="Anello"/> <button label="" label_selected="" name="ToolTree" tool_tip="Albero"/> <button label="" label_selected="" name="ToolGrass" tool_tip="Erba"/> - <check_box label="Mantieni lo strumento/attrezzo selezionato" name="checkbox sticky"/> - <check_box label="Seleziona la Copia" name="checkbox copy selection"/> - <check_box initial_value="true" label="Centra la Copia" name="checkbox copy centers"/> - <check_box label="Ruotare la Copia" name="checkbox copy rotates"/> + <check_box label="Mantieni lo strumento selezionato" name="checkbox sticky"/> + <check_box label="Copia la selezione" name="checkbox copy selection"/> + <check_box initial_value="true" label="Centra la copia" name="checkbox copy centers"/> + <check_box label="Ruota la copia" name="checkbox copy rotates"/> <radio_group name="land_radio_group"> <radio_item label="Seleziona il terreno" name="radio select land"/> <radio_item label="Appiattisci" name="radio flatten"/> @@ -110,30 +113,30 @@ <text name="Dozer Size:"> Grandezza </text> - <slider_bar initial_value="2.0" left="184" name="slider brush size" width="74"/> + <slider_bar initial_value="2.0" name="slider brush size"/> <text name="Strength:"> Potenza </text> - <button label="Applica" label_selected="Applica" left="146" name="button apply to selection" tool_tip="Modifica la terra selezionata"/> - <text left="134" name="obj_count"> + <button label="Applica" label_selected="Applica" name="button apply to selection" tool_tip="Modifica il terreno selezionato"/> + <text name="obj_count"> Oggetti: [COUNT] </text> - <text left="134" name="prim_count"> - Prims: [COUNT] + <text name="prim_count"> + Prim: [COUNT] </text> - <tab_container name="Object Info Tabs" tab_max_width="150" tab_min_width="30" width="288"> + <tab_container name="Object Info Tabs"> <panel label="Generale" name="General"> <panel.string name="text deed continued"> - Intesta + Cessione </panel.string> <panel.string name="text deed"> Cedi al gruppo </panel.string> <panel.string name="text modify info 1"> - Puoi modificare questo oggetto + Tu puoi modificare questo oggetto </panel.string> <panel.string name="text modify info 2"> - Puoi modificare questi oggetti + Tu puoi modificare questi oggetti </panel.string> <panel.string name="text modify info 3"> Non puoi modificare questo oggetto @@ -148,10 +151,10 @@ Prezzo: L$ </panel.string> <panel.string name="Cost Total"> - Prezzo Totale: L$ + Prezzo totale: L$ </panel.string> <panel.string name="Cost Per Unit"> - Prezzo per Unità : L$ + Prezzo per: L$ </panel.string> <panel.string name="Cost Mixed"> Prezzo misto @@ -180,20 +183,20 @@ <text name="Group:"> Gruppo: </text> - <button label="Imposta..." label_selected="Imposta..." name="button set group" tool_tip="Scegli un gruppo per condividere i permessi di questo oggetto"/> - <name_box initial_value="Caricando..." name="Group Name Proxy"/> - <button label="Intesta" label_selected="Intesta" left_delta="152" name="button deed" tool_tip="Intestando permette di regalare questo oggetto con i permessi del prossimo proprietario. Gli oggetti condivisi dal gruppo posso essere instestati solo da un officer del gruppo." width="98"/> - <check_box label="Condividi" name="checkbox share with group" tool_tip="Permetti ai membri del gruppo selezionato di condividere i tuoi permessi modify per questo oggetto. Tu devi Intestare per attivare le restrizioni al ruolo."/> - <text name="label click action" width="220"> - Clicca: + <button label="Imposta..." label_selected="Imposta..." name="button set group" tool_tip="Scegli un gruppo con cui condividere i diritti relativi all'oggetto"/> + <name_box initial_value="Caricamento in corso..." name="Group Name Proxy"/> + <button label="Cessione" label_selected="Cessione" name="button deed" tool_tip="Con una cessione si trasferisce il bene con i diritti al proprietario successivo Gli oggetti in proprietà condivisa di gruppo possono essere ceduti soltanto da un funzionario del gruppo."/> + <check_box label="Condividi" name="checkbox share with group" tool_tip="Consenti a tutti i membri del gruppo selezionato di condividere i tuoi diritti di modifica di questo oggetto. Per attivare le restrizioni per ruolo devi prima effettuare la cessione."/> + <text name="label click action"> + Fai clic per: </text> - <combo_box name="clickaction" width="192"> - <combo_box.item label="Tocca (default)" name="Touch/grab(default)"/> + <combo_box name="clickaction"> + <combo_box.item label="Tocca (predefinito)" name="Touch/grab(default)"/> <combo_box.item label="Siediti sull'oggetto" name="Sitonobject"/> <combo_box.item label="Compra l'oggetto" name="Buyobject"/> <combo_box.item label="Paga l'oggetto" name="Payobject"/> <combo_box.item label="Apri" name="Open"/> - <combo_box.item label="Zoom" name="Zoom"/> + <combo_box.item label="Ingrandisci" name="Zoom"/> </combo_box> <check_box label="In vendita:" name="checkbox for sale"/> <combo_box name="sale type"> @@ -205,7 +208,7 @@ <check_box label="Mostra nella ricerca" name="search_check" tool_tip="Permetti che l'oggetto sia visibile nella ricerca"/> <panel name="perms_build"> <text name="perm_modify"> - Puoi modificare questo oggetto + Tu puoi modificare questo oggetto </text> <text name="Anyone can:"> Chiunque: @@ -213,11 +216,11 @@ <check_box label="Sposta" name="checkbox allow everyone move"/> <check_box label="Copia" name="checkbox allow everyone copy"/> <text name="Next owner can:"> - Prossimo proprietario: + Proprietario successivo: </text> <check_box label="Modificare" name="checkbox next owner can modify"/> - <check_box label="Copiare" left_delta="80" name="checkbox next owner can copy"/> - <check_box label="Transfer" left_delta="67" name="checkbox next owner can transfer" tool_tip="Il prossimo proprietario può regalare o rivendere questo oggetto"/> + <check_box label="Copiare" name="checkbox next owner can copy"/> + <check_box label="Trasferisci" name="checkbox next owner can transfer" tool_tip="Il prossimo proprietario può regalare o rivendere questo oggetto"/> <text name="B:"> B: </text> @@ -241,7 +244,7 @@ <panel label="Oggetto" name="Object"> <check_box label="Bloccato" name="checkbox locked" tool_tip="Previene lo spostamento o la cancellazione dell'oggetto. Spesso utile mentre si costruisce per evitare involontarie modifiche."/> <check_box label="Fisico" name="Physical Checkbox Ctrl" tool_tip="Permette all'oggetto di essere spostato e di subire gli effetti della gravità "/> - <check_box label="Temporaneo" name="Temporary Checkbox Ctrl" tool_tip="Causa la cancellazione dell'oggetto 1 minuto dopo la sua creazione"/> + <check_box label="Temporaneo" name="Temporary Checkbox Ctrl" tool_tip="Determina la cancellazione dell'oggetto 1 minuto dopo la sua creazione"/> <check_box label="Fantasma" name="Phantom Checkbox Ctrl" tool_tip="Rende l'oggetto penetrabile dagli altri oggetti e dagli avatars"/> <text name="label position"> Posizione (metri) @@ -281,7 +284,7 @@ <combo_box.item label="Gomma" name="Rubber"/> </combo_box> <text name="text cut"> - Riduci una sezione (begin/end) + Riduci una sezione (inizio/fine) </text> <spinner label="I" name="cut begin"/> <spinner label="F" name="cut end"/> @@ -301,7 +304,7 @@ <combo_box.item label="Triangolare" name="Triangle"/> </combo_box> <text name="text twist"> - Attorciglia (begin/end) + Attorciglia (inizio/fine) </text> <spinner label="I" name="Twist Begin"/> <spinner label="F" name="Twist End"/> @@ -318,14 +321,14 @@ </text> <spinner label="X" name="Shear X"/> <spinner label="Y" name="Shear Y"/> - <text name="advanced_cut" width="149"> - Riduci un bordo (begin/end) + <text name="advanced_cut"> + Riduci un bordo (inizio/fine) </text> <text name="advanced_dimple"> - Fossetta???!!!! (begin/end) + Scava (inizio/fine) </text> <text name="advanced_slice"> - Taglia???!!! (begin/end) + Taglia (inizio/fine) </text> <spinner label="I" name="Path Limit Begin"/> <spinner label="F" name="Path Limit End"/> @@ -355,29 +358,29 @@ </combo_box> </panel> <panel label="Caratteristiche" name="Features"> - <text name="select_single" width="280"> + <text name="select_single"> Seleziona solo un prim per modificarne le caratteristiche. </text> <text name="edit_object"> Modifica le caratteristiche dell'oggetto: </text> - <check_box label="Flessibilità " name="Flexible1D Checkbox Ctrl" tool_tip="Permetti all'oggetto di flettersi lungo l'asse Z (Client-side only)"/> - <spinner label="Morbidezza" label_width="72" name="FlexNumSections" width="135"/> - <spinner label="Gravità " label_width="72" name="FlexGravity" width="135"/> - <spinner label="Elasticità " label_width="72" name="FlexFriction" width="135"/> - <spinner label="Sventolio" label_width="72" name="FlexWind" width="135"/> - <spinner label="Tensione" label_width="72" name="FlexTension" width="135"/> - <spinner label="Forza X" label_width="72" name="FlexForceX" width="135"/> - <spinner label="Forza Y" label_width="72" name="FlexForceY" width="135"/> - <spinner label="Forza Z" label_width="72" name="FlexForceZ" width="135"/> + <check_box label="Flessibilità " name="Flexible1D Checkbox Ctrl" tool_tip="Consenti all'oggetto di flettersi lungo l'asse Z (solo lato client)"/> + <spinner label="Morbidezza" name="FlexNumSections"/> + <spinner label="Gravità " name="FlexGravity"/> + <spinner label="Elasticità " name="FlexFriction"/> + <spinner label="Sventolio" name="FlexWind"/> + <spinner label="Tensione" name="FlexTension"/> + <spinner label="Forza X" name="FlexForceX"/> + <spinner label="Forza Y" name="FlexForceY"/> + <spinner label="Forza Z" name="FlexForceZ"/> <check_box label="Luce" name="Light Checkbox Ctrl" tool_tip="Imposta l'oggetto come sorgente di luce"/> <color_swatch label="" name="colorswatch" tool_tip="Clicca per aprire il selettore dei colori"/> - <texture_picker label="" name="light texture control" tool_tip="Clicca per scegliere una proiezione dell'immagine (funziona solo con deferred rendering attivato)"/> - <spinner label="Intensità " label_width="72" name="Light Intensity" width="135"/> - <spinner label="FOV" name="Light FOV"/> - <spinner label="Raggio" label_width="72" name="Light Radius" width="135"/> - <spinner label="Focus" name="Light Focus"/> - <spinner label="Attenuazione" label_width="72" name="Light Falloff" width="135"/> + <texture_picker label="" name="light texture control" tool_tip="Clicca per scegliere un'immagine da proiettare (funziona solo con il rendering differito attivato)"/> + <spinner label="Intensità " name="Light Intensity"/> + <spinner label="Angolo di vista" name="Light FOV"/> + <spinner label="Raggio" name="Light Radius"/> + <spinner label="Centro focale" name="Light Focus"/> + <spinner label="Attenuazione" name="Light Falloff"/> <spinner label="Atmosfera" name="Light Ambiance"/> </panel> <panel label="Texture" name="Texture"> @@ -395,29 +398,27 @@ <text name="glow label"> Bagliore </text> - <check_box bottom_delta="-21" label="Massima -luminosità " name="checkbox fullbright"/> + <check_box label="Massima luminosità " name="checkbox fullbright"/> <text name="tex gen"> - Applicazione -della texture + Applicazione </text> - <combo_box bottom_delta="-38" name="combobox texgen"> + <combo_box name="combobox texgen"> <combo_box.item label="Default" name="Default"/> <combo_box.item label="Planare" name="Planar"/> </combo_box> - <text bottom="-120" name="label shininess"> + <text name="label shininess"> Brillantezza </text> - <combo_box bottom_delta="-22" name="combobox shininess"> + <combo_box name="combobox shininess"> <combo_box.item label="Nessuna" name="None"/> <combo_box.item label="Bassa" name="Low"/> <combo_box.item label="Media" name="Medium"/> <combo_box.item label="Alta" name="High"/> </combo_box> - <text bottom="-120" name="label bumpiness"> + <text name="label bumpiness"> Rilievo </text> - <combo_box bottom_delta="-22" name="combobox bumpiness" width="100"> + <combo_box name="combobox bumpiness"> <combo_box.item label="Nessuna" name="None"/> <combo_box.item label="Luminoso" name="Brightness"/> <combo_box.item label="Scuro" name="Darkness"/> @@ -438,32 +439,32 @@ della texture <combo_box.item label="Trama" name="weave"/> </combo_box> <text name="tex scale"> - Ripeti / Lato + Ripetizioni / Faccia </text> <spinner label="Orizzontale (U)" name="TexScaleU"/> <check_box label="Inverti" name="checkbox flip s"/> <spinner label="Verticale (V)" name="TexScaleV"/> <check_box label="Inverti" name="checkbox flip t"/> - <spinner label="RotazioneËš" left="120" name="TexRot" width="60"/> - <spinner label="Ripete / Metri" left="120" name="rptctrl" width="60"/> - <button label="Applica" label_selected="Applica" left_delta="72" name="button apply"/> + <spinner label="RotazioneËš" name="TexRot"/> + <spinner label="Ripetizioni / Metro" name="rptctrl"/> + <button label="Applica" label_selected="Applica" name="button apply"/> <text name="tex offset"> - Bilanciamento della Texture + Bilanciamento della texture </text> <spinner label="Orizzontale (U)" name="TexOffsetU"/> <spinner label="Verticale (V)" name="TexOffsetV"/> <panel name="Add_Media"> <text name="media_tex"> - Media + Multimediale </text> - <button name="add_media" tool_tip="Aggiungi Media"/> + <button name="add_media" tool_tip="Aggiungi media"/> <button name="delete_media" tool_tip="Cancella questa media texture"/> - <button name="edit_media" tool_tip="Modifica questo Media"/> - <button label="Alllinea" label_selected="Allinea Media" name="button align" tool_tip="Allinea media texture (must load first)"/> + <button name="edit_media" tool_tip="Modifica questo media"/> + <button label="Alllinea" label_selected="Allinea media" name="button align" tool_tip="Allinea texture del media (il caricamento deve prima essere completato)"/> </panel> </panel> <panel label="Contenuto" name="Contents"> - <button label="Nuovo Script" label_selected="Nuovo Script" name="button new script"/> + <button label="Nuovo Script" label_selected="Nuovo script" name="button new script"/> <button label="Permessi" name="button permissions"/> </panel> </tab_container> @@ -472,29 +473,22 @@ della texture Informazioni sul terreno </text> <text name="label_area_price"> - Prezzo: L$[PRICE] per [AREA] m² + Prezzo: L$ [PRICE] per [AREA] m² </text> <text name="label_area"> - Area: [AREA] m² + Zona: [AREA] m² </text> - <button label="Info sul terreno" label_selected="Info sul terreno" name="button about land" width="156"/> - <check_box label="Mostra i proprietari" name="checkbox show owners" tool_tip="Colora i terreni in base ai loro proprietari: - -Verde = il tuo terreno -Acqua = la terra del tuo gruppo -Rosso = posseduta da altri -Giallo = in vendita -Viola = in asta -Grigia = pubblica"/> + <button label="Informazioni sui terreni" label_selected="Informazioni sui terreni" name="button about land"/> + <check_box label="Mostra i proprietari" name="checkbox show owners" tool_tip="Colora i terreni in base ai loro proprietari: Verde = il tuo terreno Acqua = la terra del tuo gruppo Rosso = posseduta da altri Giallo = in vendita Viola = in asta Grigia = pubblica"/> <text name="label_parcel_modify"> Modifica il terreno </text> - <button label="Suddividi" label_selected="Suddividi" name="button subdivide land" width="156"/> - <button label="Aderisci" label_selected="Aderisci" name="button join land" width="156"/> + <button label="Suddividi" label_selected="Suddividi" name="button subdivide land"/> + <button label="Iscriviti" label_selected="Iscriviti" name="button join land"/> <text name="label_parcel_trans"> - Transazioni del territorio + Transazioni terreno </text> - <button label="Compra la Terra" label_selected="Compra la Terra" name="button buy land" width="156"/> - <button label="Abbandona la Terra" label_selected="Abbandona la Terra" name="button abandon land" width="156"/> + <button label="Acquista terreno" label_selected="Acquista terreno" name="button buy land"/> + <button label="Abbandona il terreno" label_selected="Abbandona il terreno" name="button abandon land"/> </panel> </floater> diff --git a/indra/newview/skins/default/xui/it/floater_top_objects.xml b/indra/newview/skins/default/xui/it/floater_top_objects.xml index 8f7f3e060a..939c5e83a0 100644 --- a/indra/newview/skins/default/xui/it/floater_top_objects.xml +++ b/indra/newview/skins/default/xui/it/floater_top_objects.xml @@ -1,58 +1,59 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="top_objects" title="Oggetti principali"> + <floater.string name="top_scripts_title"> + Script pesanti + </floater.string> + <floater.string name="top_scripts_text"> + [COUNT] script richiedono un totale di [TIME] ms + </floater.string> + <floater.string name="scripts_score_label"> + Ora + </floater.string> + <floater.string name="scripts_mono_time_label"> + Ora 'Mono' + </floater.string> + <floater.string name="top_colliders_title"> + Oggetti con maggiori collisioni + </floater.string> + <floater.string name="top_colliders_text"> + I [COUNT] oggetti che sperimentano il maggior numero di collisioni + </floater.string> + <floater.string name="colliders_score_label"> + Punteggio + </floater.string> + <floater.string name="none_descriptor"> + Nulla di rilevato. + </floater.string> <text name="title_text"> In caricamento... </text> <scroll_list name="objects_list"> - <column label="Punteggio" name="score" width="84"/> - <column label="Nome" name="name" width="84"/> - <column label="Proprietario" name="owner" width="84"/> - <column label="Ubicazione" name="location" width="84"/> - <column label="Ora" name="time" width="84"/> - <column label="Ora (Mono)" name="mono_time" width="84"/> + <scroll_list.columns label="Punteggio" name="score" width="84"/> + <scroll_list.columns label="Nome" name="name" width="84"/> + <scroll_list.columns label="Proprietario" name="owner" width="84"/> + <scroll_list.columns label="Ubicazione" name="location" width="84"/> + <scroll_list.columns label="Ora" name="time" width="84"/> + <scroll_list.columns label="Ora (Mono)" name="mono_time" width="84"/> + <scroll_list.columns label="URL" name="URLs"/> </scroll_list> - <line_editor font="SansSerifSmall" left="90" name="id_editor" width="280"/> - <line_editor font="SansSerifSmall" left="90" name="object_name_editor" width="280"/> - <line_editor font="SansSerifSmall" left="90" name="owner_name_editor" width="280"/> <text name="id_text"> ID oggetto: </text> + <line_editor font="SansSerifSmall" left="90" name="id_editor" width="280"/> <button label="Mostra segnali luminosi" name="show_beacon_btn" width="150"/> <text name="obj_name_text"> Nome dell'oggetto: </text> + <line_editor font="SansSerifSmall" left="90" name="object_name_editor" width="280"/> <button label="Filtro" name="filter_object_btn" width="150"/> <text name="owner_name_text"> Proprietario: </text> + <line_editor font="SansSerifSmall" left="90" name="owner_name_editor" width="280"/> <button label="Filtro" name="filter_owner_btn" width="150"/> + <button label="Aggiorna" name="refresh_btn" width="150"/> <button label="Restituisci selezionato" name="return_selected_btn" width="150"/> <button label="Restituisci tutti" left="170" name="return_all_btn"/> <button label="Disabilita selezionato" name="disable_selected_btn" width="150"/> <button label="Disabilita per tutti" left="170" name="disable_all_btn"/> - <button label="Aggiorna" name="refresh_btn" width="150"/> - <string name="top_scripts_title"> - Script pesanti - </string> - <string name="top_scripts_text"> - [COUNT] script richiedono un totale di [TIME] ms - </string> - <string name="scripts_score_label"> - Ora - </string> - <string name="scripts_mono_time_label"> - Ora 'Mono' - </string> - <string name="top_colliders_title"> - Oggetti con maggiori collisioni - </string> - <string name="top_colliders_text"> - I [COUNT] oggetti che sperimentano il maggior numero di collisioni - </string> - <string name="colliders_score_label"> - Punteggio - </string> - <string name="none_descriptor"> - Nulla di rilevato. - </string> </floater> diff --git a/indra/newview/skins/default/xui/it/floater_tos.xml b/indra/newview/skins/default/xui/it/floater_tos.xml index f3f8072f56..28a2dfdda2 100644 --- a/indra/newview/skins/default/xui/it/floater_tos.xml +++ b/indra/newview/skins/default/xui/it/floater_tos.xml @@ -1,15 +1,15 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="modal container" title=""> + <floater.string name="real_url"> + http://secondlife.com/app/tos/ + </floater.string> + <floater.string name="loading_url"> + data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Caricamento in corso %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E + </floater.string> <button label="Continua" label_selected="Continua" name="Continue"/> <button label="Annulla" label_selected="Annulla" name="Cancel"/> - <check_box label="Accetto i Termini di Servizio" name="agree_chk"/> + <check_box label="Accetto i Termini del servizio e le Regole sulla privacy" name="agree_chk"/> <text name="tos_heading"> - Per favore leggi attentamente i seguenti Termini di Servizio. Per continuare il log in [SECOND_LIFE], devi accettare le condizioni. + Sei pregato di leggere attentamente i Termini del servizio e le Regole sulla privacy di seguito. Per continuare l'accesso a [SECOND_LIFE], devi accettare le condizioni. </text> - <text_editor name="tos_text"> - TOS_TEXT - </text_editor> - <string name="real_url"> - http://secondlife.com/app/tos/ - </string> </floater> diff --git a/indra/newview/skins/default/xui/it/floater_voice_controls.xml b/indra/newview/skins/default/xui/it/floater_voice_controls.xml index e4c54d44eb..d2fd462062 100644 --- a/indra/newview/skins/default/xui/it/floater_voice_controls.xml +++ b/indra/newview/skins/default/xui/it/floater_voice_controls.xml @@ -1,25 +1,28 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_voice_controls" title="Controlli del Voice"> +<floater name="floater_voice_controls" title="Regolazione voce"> <string name="title_nearby"> - VOICE NEI DINTORNI + VOCE NEI DINTORNI </string> <string name="title_group"> - Chiamata di Gruppo con [GROUP] + Chiamata di gruppo con [GROUP] </string> <string name="title_adhoc"> - Conference Call + Chiamata in conferenza </string> <string name="title_peer_2_peer"> - Chiama con [NAME] + Chiamata con [NAME] </string> <string name="no_one_near"> - Nessuno vicino + Nessuno nei dintorni ha attivato la funzione voce </string> - <panel name="control_panel"> - <layout_stack> - <layout_panel name="leave_btn_panel"> - <button label="Chiudi Chiamata" name="leave_call_btn"/> + <layout_stack name="my_call_stack"> + <layout_panel name="my_panel"> + <text name="user_text" value="Il mio avatar:"/> + </layout_panel> + <layout_stack name="voice_effect_and_leave_call_stack"> + <layout_panel name="leave_call_btn_panel"> + <button label="Abbandona chiamata" name="leave_call_btn"/> </layout_panel> </layout_stack> - </panel> + </layout_stack> </floater> diff --git a/indra/newview/skins/default/xui/it/floater_voice_effect.xml b/indra/newview/skins/default/xui/it/floater_voice_effect.xml new file mode 100644 index 0000000000..202be752c9 --- /dev/null +++ b/indra/newview/skins/default/xui/it/floater_voice_effect.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater label="Luoghi" name="voice_effects" title="ANTEPRIMA MANIPOLAZIONE VOCE"> + <string name="no_voice_effect"> + (Nessuna manipolazione voce) + </string> + <string name="active_voice_effect"> + (Attivato) + </string> + <string name="unsubscribed_voice_effect"> + (Iscrizione annullata) + </string> + <string name="new_voice_effect"> + (Nuovo!) + </string> + <text name="status_text"> + Per ascoltare un'anteprima degli effetti di manipolazione della voce, clicca sul pulsante Registra per registrare un campione di voce, quindi fai clic su uno degli effetti per ascoltare il risultato. + +Per ricollegarti alla voce nei dintorni, chiudi la finestra. + </text> + <button label="Registra campione" name="record_btn" tool_tip="Registra un campione della tua voce."/> + <button label="Ferma" name="record_stop_btn"/> + <text name="voice_morphing_link"> + [[URL] Ottieni manipolazione voce] + </text> + <scroll_list name="voice_effect_list" tool_tip="Registra un campione della tua voce, quindi fai clic su uno degli effetti per un'anteprima del risultato."> + <scroll_list.columns label="Manipolazione voce" name="name"/> + <scroll_list.columns label="Scade il" name="expires"/> + </scroll_list> +</floater> diff --git a/indra/newview/skins/default/xui/it/floater_water.xml b/indra/newview/skins/default/xui/it/floater_water.xml index d2849440d6..c6ab646fbf 100644 --- a/indra/newview/skins/default/xui/it/floater_water.xml +++ b/indra/newview/skins/default/xui/it/floater_water.xml @@ -8,7 +8,7 @@ <button label="Salva" label_selected="Salva" name="WaterSavePreset"/> <button label="Cancella" label_selected="Cancella" name="WaterDeletePreset"/> <tab_container name="Water Tabs"> - <panel label="Impostazioni" name="Settings"> + <panel label="IMPOSTAZIONI" name="Settings"> <text name="BHText"> Colore della nebbiosità dell'acqua </text> @@ -62,7 +62,7 @@ </text> <button label="?" left="650" name="WaterBlurMultiplierHelp"/> </panel> - <panel label="Immagine" name="Waves"> + <panel label="IMMAGINE" name="Waves"> <text name="BHText"> Direzione della grande onda </text> diff --git a/indra/newview/skins/default/xui/it/floater_wearable_save_as.xml b/indra/newview/skins/default/xui/it/floater_wearable_save_as.xml index dcb7620bd5..7c3754f004 100644 --- a/indra/newview/skins/default/xui/it/floater_wearable_save_as.xml +++ b/indra/newview/skins/default/xui/it/floater_wearable_save_as.xml @@ -3,7 +3,7 @@ <button label="Salva" label_selected="Salva" name="Save"/> <button label="Annulla" label_selected="Annulla" name="Cancel"/> <text name="Save item as:"> - Salva oggetto come: + Salva oggetto nel mio inventario come: </text> <line_editor name="name ed"> Nuovo [DESC] diff --git a/indra/newview/skins/default/xui/it/floater_whitelist_entry.xml b/indra/newview/skins/default/xui/it/floater_whitelist_entry.xml index 6d68db058d..9abc968b94 100644 --- a/indra/newview/skins/default/xui/it/floater_whitelist_entry.xml +++ b/indra/newview/skins/default/xui/it/floater_whitelist_entry.xml @@ -1,9 +1,9 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="whitelist_entry"> +<floater name="whitelist_entry" title="VOCE DELLA LISTA BIANCA"> <text name="media_label"> Inserisci un URL o una configurazione URL da aggiungere alla lista dei domini permessi </text> <line_editor name="whitelist_entry" tool_tip="Inserisci un URL o una configurazione URL alla lista bianca"/> <button label="OK" name="ok_btn"/> - <button label="Cancella" name="cancel_btn"/> + <button label="Annulla" name="cancel_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/it/floater_windlight_options.xml b/indra/newview/skins/default/xui/it/floater_windlight_options.xml index e86d656e39..1f6f0fab58 100644 --- a/indra/newview/skins/default/xui/it/floater_windlight_options.xml +++ b/indra/newview/skins/default/xui/it/floater_windlight_options.xml @@ -4,15 +4,15 @@ Cieli predefiniti: </text> <button label="Nuovo" label_selected="Nuovo" name="WLNewPreset"/> - <button label="Salva" label_selected="Salva" name="WLSavePreset" left_delta="72"/> - <button label="Elimina" label_selected="Elimina" name="WLDeletePreset" left_delta="72"/> - <button font="SansSerifSmall" width="165" left_delta="85" label="Editor del ciclo giorno/notte" label_selected="Editor del ciclo giorno/notte" name="WLDayCycleMenuButton"/> + <button label="Salva" label_selected="Salva" left_delta="72" name="WLSavePreset"/> + <button label="Elimina" label_selected="Elimina" left_delta="72" name="WLDeletePreset"/> + <button font="SansSerifSmall" label="Editor del ciclo giorno/notte" label_selected="Editor del ciclo giorno/notte" left_delta="85" name="WLDayCycleMenuButton" width="165"/> <tab_container name="WindLight Tabs"> - <panel label="Atmosfera" name="Atmosphere"> + <panel label="ATMOSFERA" name="Atmosphere"> <text name="BHText"> Blu dell'Orizzonte </text> - <button label="?" name="WLBlueHorizonHelp" left="189"/> + <button label="?" left="189" name="WLBlueHorizonHelp"/> <text name="BHText2"> R </text> @@ -25,14 +25,14 @@ <text name="BHText5"> I </text> - <text name="BDensText" font="SansSerifSmall"> + <text font="SansSerifSmall" name="BDensText"> Altezza della Foschia all'Orizzonte </text> - <button label="?" name="WLHazeHorizonHelp" left="189" /> + <button label="?" left="189" name="WLHazeHorizonHelp"/> <text name="BDensText2"> Densità del Blu </text> - <button label="?" name="WLBlueDensityHelp" /> + <button label="?" name="WLBlueDensityHelp"/> <text name="BHText6"> R </text> @@ -52,17 +52,17 @@ <text name="DensMultText"> Moltiplicatore di Densità </text> - <button label="?" name="WLDensityMultHelp" left="645"/> + <button label="?" left="645" name="WLDensityMultHelp"/> <text name="WLDistanceMultText"> Moltiplicatore della Distanza </text> - <button label="?" name="WLDistanceMultHelp" left="645"/> + <button label="?" left="645" name="WLDistanceMultHelp"/> <text name="MaxAltText"> Altitudine Massima </text> - <button label="?" name="WLMaxAltitudeHelp" left="645"/> + <button label="?" left="645" name="WLMaxAltitudeHelp"/> </panel> - <panel label="Illuminazione" name="Lighting"> + <panel label="ILLUMINAZIONE" name="Lighting"> <text name="SLCText"> Colore Sole/Luna </text> @@ -118,7 +118,7 @@ </text> <button label="?" name="WLStarBrightnessHelp"/> </panel> - <panel label="Nuvole" name="Clouds"> + <panel label="NUVOLE" name="Clouds"> <text name="WLCloudColorText"> Colore delle Nuvole </text> @@ -151,15 +151,15 @@ <text name="WLCloudCoverageText"> Copertura delle Nuvole </text> - <button label="?" name="WLCloudCoverageHelp" left="415"/> + <button label="?" left="415" name="WLCloudCoverageHelp"/> <text name="WLCloudScaleText"> Altitudine delle Nuvole </text> - <button label="?" name="WLCloudScaleHelp" left="415"/> + <button label="?" left="415" name="WLCloudScaleHelp"/> <text name="WLCloudDetailText"> Dettagli Nuvole (XY/ Densità ) </text> - <button label="?" name="WLCloudDetailHelp" left="415"/> + <button label="?" left="415" name="WLCloudDetailHelp"/> <text name="BHText8"> X </text> @@ -180,7 +180,7 @@ <button label="?" name="WLCloudScrollYHelp"/> <check_box label="Blocca" name="WLCloudLockY"/> <check_box label="Mostra le Nuvole Classiche" name="DrawClassicClouds"/> - <button label="?" name="WLClassicCloudsHelp" left="645"/> + <button label="?" left="645" name="WLClassicCloudsHelp"/> </panel> </tab_container> <string name="WLDefaultSkyNames"> diff --git a/indra/newview/skins/default/xui/it/floater_window_size.xml b/indra/newview/skins/default/xui/it/floater_window_size.xml new file mode 100644 index 0000000000..036b74b7d9 --- /dev/null +++ b/indra/newview/skins/default/xui/it/floater_window_size.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="window_size" title="DIMENSIONE FINESTRA"> + <string name="resolution_format"> + [RES_X] x [RES_Y] + </string> + <text name="windowsize_text"> + Imposta dimensione finestra: + </text> + <combo_box name="window_size_combo" tool_tip="larghezza x altezza"> + <combo_box.item label="1000 x 700 (default)" name="item0"/> + <combo_box.item label="1024 x 768" name="item1"/> + <combo_box.item label="1280 x 720 (720p)" name="item2"/> + <combo_box.item label="1920 x 1080 (1080p)" name="item3"/> + </combo_box> + <button label="Imposta" name="set_btn"/> + <button label="Annulla" name="cancel_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/it/floater_world_map.xml b/indra/newview/skins/default/xui/it/floater_world_map.xml index a672df0d96..b07daac6fb 100644 --- a/indra/newview/skins/default/xui/it/floater_world_map.xml +++ b/indra/newview/skins/default/xui/it/floater_world_map.xml @@ -5,66 +5,66 @@ Legenda </text> </panel> - <panel> - <button font="SansSerifSmall" label="Mostra la mia posizione" label_selected="Mostra la mia posizione" left_delta="91" name="Show My Location" tool_tip="Centra la mappa sul luogo dove si trova il mio avatar" width="135"/> - <text name="person_label"> + <panel name="layout_panel_2"> + <button name="Show My Location" tool_tip="Centra la mappa sulla posizione del mio avatar"/> + <text name="me_label"> Io </text> - <check_box label="Residenti" name="people_chk"/> - <check_box label="Punto informativo" name="infohub_chk"/> + <text name="person_label"> + Persona + </text> <text name="infohub_label"> Infohub </text> - <check_box bottom="-170" label="Terra in vendita" name="land_for_sale_chk"/> - <icon bottom="-170" name="landforsale"/> <text name="land_sale_label"> - Vendita di terra + Vendita terreno + </text> + <text name="by_owner_label"> + da parte del proprietario </text> <text name="auction_label"> - per conto del proprietario + asta di terreni </text> - <button label="Vai a Casa" label_selected="Vai a Casa" name="Go Home" tool_tip="Teleport a casa mia"/> + <button name="Go Home" tool_tip="Teleport a casa"/> <text name="Home_label"> - Casa + Home </text> <text name="events_label"> Eventi: </text> - <check_box label="PG" name="event_chk"/> - <check_box initial_value="true" label="Mature" name="event_mature_chk"/> + <text name="pg_label"> + Generale + </text> + <check_box name="event_mature_chk"/> <text name="mature_label"> - Mature + Moderato + </text> + <text name="adult_label"> + Adulto </text> - <check_box label="Adult" name="event_adult_chk"/> </panel> - <panel> + <panel name="layout_panel_3"> <text name="find_on_map_label"> - Trova sulla Mappa + Trova sulla mappa </text> </panel> - <panel> - <combo_box label="Amici Online" name="friend combo" tool_tip="Mostra amici sulla mappa"> - <combo_box.item label="Miei Amici Online" name="item1"/> + <panel name="layout_panel_4"> + <combo_box label="Amici online" name="friend combo" tool_tip="Mostra amici sulla mappa"> + <combo_box.item label="I miei amici online" name="item1"/> </combo_box> - <combo_box label="Miei Landmarks" name="landmark combo" tool_tip="Landmark da mostrare sulla mappa"> - <combo_box.item label="Miei Landmarks" name="item1"/> + <combo_box label="I miei punti di riferimento" name="landmark combo" tool_tip="Punto di riferimento da mostrare sulla mappa"> + <combo_box.item label="I miei punti di riferimento" name="item1"/> </combo_box> - <search_editor label="Regione per nome" name="location" tool_tip="Scrivi il nome di una regione"/> - <button label="Trova" name="DoSearch" tool_tip="Cerca regione"/> - <scroll_list bottom_delta="-310" height="304" name="search_results"> - <scroll_list.columns label="" name="icon"/> - <scroll_list.columns label="" name="sim_name"/> - </scroll_list> - <button font="SansSerifSmall" label="Teletrasporto" label_selected="Teletrasporto" name="Teleport" tool_tip="Teletrasporto al luogo prescelto"/> - <button font="SansSerifSmall" label="Copia SLurl" name="copy_slurl" tool_tip="Copia il luogo attuale come SLurl per essere usato nel web."/> - <button font="SansSerifSmall" label="Mostra Selezione" label_selected="Mostra destinazione" left_delta="91" name="Show Destination" tool_tip="Centra la mappa sul luogo prescelto" width="135"/> + <search_editor label="Regioni secondo il nome" name="location" tool_tip="Digita il nome di una regione"/> + <button label="Trova" name="DoSearch" tool_tip="Cerca la regione"/> + <button name="Clear" tool_tip="Elimina le linee di monitoraggio e reimposta la mappa"/> + <button label="Teleport" name="Teleport" tool_tip="Teleport al luogo selezionato"/> + <button label="Copia SLurl" name="copy_slurl" tool_tip="Copia la posizione attuale come un SLurl da usare nel Web."/> + <button label="Mostra la selezione" name="Show Destination" tool_tip="Centra la mappa sul luogo selezionato"/> </panel> - <panel> + <panel name="layout_panel_5"> <text name="zoom_label"> - Zoom + Ingrandisci </text> </panel> - <panel> - <slider label="Zoom" name="zoom slider"/> - </panel> </floater> diff --git a/indra/newview/skins/default/xui/it/inspect_avatar.xml b/indra/newview/skins/default/xui/it/inspect_avatar.xml index 61f7a69234..ec5561a5b2 100644 --- a/indra/newview/skins/default/xui/it/inspect_avatar.xml +++ b/indra/newview/skins/default/xui/it/inspect_avatar.xml @@ -5,17 +5,17 @@ --> <floater name="inspect_avatar"> <string name="Subtitle"> - [ETA'] + [AGE] </string> <string name="Details"> - [PROFILO_SL] + [SL_PROFILE] </string> - <slider name="volume_slider" tool_tip="Volume del Voice" value="0.5"/> - <button label="Aggiungi Amico" name="add_friend_btn"/> + <slider name="volume_slider" tool_tip="Volume voce" value="0.5"/> + <button label="Aggiungi amico" name="add_friend_btn"/> <button label="IM" name="im_btn"/> - <button label="Di più" name="view_profile_btn"/> + <button label="Profilo" name="view_profile_btn"/> <panel name="moderator_panel"> - <button label="Disattiva il Voice" name="disable_voice"/> - <button label="Attiva Voice" name="enable_voice"/> + <button label="Disattiva voce" name="disable_voice"/> + <button label="Attiva voce" name="enable_voice"/> </panel> </floater> diff --git a/indra/newview/skins/default/xui/it/inspect_group.xml b/indra/newview/skins/default/xui/it/inspect_group.xml index d7b86fdbcb..2416f4bb12 100644 --- a/indra/newview/skins/default/xui/it/inspect_group.xml +++ b/indra/newview/skins/default/xui/it/inspect_group.xml @@ -5,18 +5,18 @@ --> <floater name="inspect_group"> <string name="PrivateGroup"> - Gruppo Privato + Gruppo privato </string> <string name="FreeToJoin"> Adesione libera </string> <string name="CostToJoin"> - L$[AMOUNT] per aderire + L$ [AMOUNT] per aderire </string> <string name="YouAreMember"> - Tu sei un Membro + Tu sei un iscritto </string> - <button label="Aderire" name="join_btn"/> - <button label="Abbandona" name="leave_btn"/> - <button label="Vedi Profilo" name="view_profile_btn"/> + <button label="Iscriviti" name="join_btn"/> + <button label="Chiudi" name="leave_btn"/> + <button label="Vedi profilo" name="view_profile_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/it/inspect_object.xml b/indra/newview/skins/default/xui/it/inspect_object.xml index 7e6d195cb1..d8ab10cfda 100644 --- a/indra/newview/skins/default/xui/it/inspect_object.xml +++ b/indra/newview/skins/default/xui/it/inspect_object.xml @@ -9,10 +9,10 @@ </string> <string name="CreatorAndOwner"> Di [CREATOR] -owner [OWNER] +Proprietario [OWNER] </string> <string name="Price"> - L$[AMOUNT] + L$ [AMOUNT] </string> <string name="PriceFree"> Gratis! @@ -21,14 +21,21 @@ owner [OWNER] Tocca </string> <string name="Sit"> - Siedi + Siediti </string> - <button label="Compra" name="buy_btn"/> + <text name="object_name" value="Nome oggetto di prova che si trova su due righe ed è molto lungo"/> + <text name="price_text"> + L$ 30.000 + </text> + <text name="object_description"> + Questa è una descrizione di un oggetto che è molto lunga ed è di almeno 80 caratteri, ma potrebbe essere di 120 caratteri a questo punto. Chi lo sa veramente? + </text> + <button label="Acquista" name="buy_btn"/> <button label="Paga" name="pay_btn"/> - <button label="Fai una Copia" name="take_free_copy_btn"/> + <button label="Prendi copia" name="take_free_copy_btn"/> <button label="Tocca" name="touch_btn"/> - <button label="Siedi" name="sit_btn"/> + <button label="Siediti" name="sit_btn"/> <button label="Apri" name="open_btn"/> - <icon name="secure_browsing" tool_tip="Secure Browsing"/> - <button label="Ulteriore" name="more_info_btn"/> + <icon name="secure_browsing" tool_tip="Browsing sicuro"/> + <button label="Altro" name="more_info_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/it/inspect_remote_object.xml b/indra/newview/skins/default/xui/it/inspect_remote_object.xml index 9fabe2ca0b..b2d96ad757 100644 --- a/indra/newview/skins/default/xui/it/inspect_remote_object.xml +++ b/indra/newview/skins/default/xui/it/inspect_remote_object.xml @@ -8,6 +8,6 @@ Proprietario: </text> <button label="Mappa" name="map_btn"/> - <button label="Bloccare" name="block_btn"/> + <button label="Blocca" name="block_btn"/> <button label="Chiudi" name="close_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/it/language_settings.xml b/indra/newview/skins/default/xui/it/language_settings.xml index 71418d446a..82cf789a6b 100644 --- a/indra/newview/skins/default/xui/it/language_settings.xml +++ b/indra/newview/skins/default/xui/it/language_settings.xml @@ -3,9 +3,9 @@ <strings> <!-- Locale Information --> - <string name="MicrosoftLocale">english</string> - <string name="DarwinLocale">C</string> - <string name="LinuxLocale">C</string> + <string name="MicrosoftLocale">italian</string> + <string name="DarwinLocale">it_IT.UTF-8</string> + <string name="LinuxLocale">it_IT.UTF-8</string> <!-- datetimeToCodes["wkday"] = "%a"; // Thu diff --git a/indra/newview/skins/default/xui/it/menu_attachment_other.xml b/indra/newview/skins/default/xui/it/menu_attachment_other.xml index ff068b90a5..d4d6fd68d0 100644 --- a/indra/newview/skins/default/xui/it/menu_attachment_other.xml +++ b/indra/newview/skins/default/xui/it/menu_attachment_other.xml @@ -2,16 +2,16 @@ <!-- *NOTE: See also menu_avatar_other.xml --> <context_menu name="Avatar Pie"> <menu_item_call label="Vedi profilo" name="Profile..."/> - <menu_item_call label="Chiedi amicizia" name="Add Friend"/> + <menu_item_call label="Aggiungi amico" name="Add Friend"/> <menu_item_call label="IM" name="Send IM..."/> <menu_item_call label="Chiama" name="Call"/> - <menu_item_call label="Invita nel gruppo" name="Invite..."/> + <menu_item_call label="Invita al gruppo" name="Invite..."/> <menu_item_call label="Blocca" name="Avatar Mute"/> - <menu_item_call label="Denuncia" name="abuse"/> + <menu_item_call label="Segnala" name="abuse"/> <menu_item_call label="Congela" name="Freeze..."/> <menu_item_call label="Espelli" name="Eject..."/> - <menu_item_call label="Debug" name="Debug..."/> - <menu_item_call label="Avvicinati" name="Zoom In"/> + <menu_item_call label="Debug delle texture" name="Debug..."/> + <menu_item_call label="Zoom avanti" name="Zoom In"/> <menu_item_call label="Paga" name="Pay..."/> - <menu_item_call label="Profilo oggetto" name="Object Inspect"/> + <menu_item_call label="Profilo dell'oggetto" name="Object Inspect"/> </context_menu> diff --git a/indra/newview/skins/default/xui/it/menu_attachment_self.xml b/indra/newview/skins/default/xui/it/menu_attachment_self.xml index 9711b5918a..c480a2fe0e 100644 --- a/indra/newview/skins/default/xui/it/menu_attachment_self.xml +++ b/indra/newview/skins/default/xui/it/menu_attachment_self.xml @@ -5,8 +5,9 @@ <menu_item_call label="Stacca" name="Detach"/> <menu_item_call label="Lascia" name="Drop"/> <menu_item_call label="Alzati" name="Stand Up"/> - <menu_item_call label="Il mio aspetto fisico" name="Appearance..."/> - <menu_item_call label="I miei amici" name="Friends..."/> + <menu_item_call label="Cambia vestiario" name="Change Outfit"/> + <menu_item_call label="I miei amici..." name="Friends..."/> <menu_item_call label="I miei gruppi" name="Groups..."/> <menu_item_call label="Il mio profilo" name="Profile..."/> + <menu_item_call label="Debug delle texture" name="Debug..."/> </context_menu> diff --git a/indra/newview/skins/default/xui/it/menu_avatar_icon.xml b/indra/newview/skins/default/xui/it/menu_avatar_icon.xml index 522c7ab4e6..b93b695300 100644 --- a/indra/newview/skins/default/xui/it/menu_avatar_icon.xml +++ b/indra/newview/skins/default/xui/it/menu_avatar_icon.xml @@ -2,6 +2,6 @@ <menu name="Avatar Icon Menu"> <menu_item_call label="Vedi profilo" name="Show Profile"/> <menu_item_call label="Manda IM..." name="Send IM"/> - <menu_item_call label="Chiedi amicizia..." name="Add Friend"/> + <menu_item_call label="Aggiungi come amico..." name="Add Friend"/> <menu_item_call label="Togli amicizia..." name="Remove Friend"/> </menu> diff --git a/indra/newview/skins/default/xui/it/menu_avatar_other.xml b/indra/newview/skins/default/xui/it/menu_avatar_other.xml index a435fcd311..c2edc32a49 100644 --- a/indra/newview/skins/default/xui/it/menu_avatar_other.xml +++ b/indra/newview/skins/default/xui/it/menu_avatar_other.xml @@ -2,15 +2,15 @@ <!-- *NOTE: See also menu_attachment_other.xml --> <context_menu name="Avatar Pie"> <menu_item_call label="Vedi profilo" name="Profile..."/> - <menu_item_call label="Chiedi amicizia" name="Add Friend"/> + <menu_item_call label="Aggiungi amico" name="Add Friend"/> <menu_item_call label="IM" name="Send IM..."/> <menu_item_call label="Chiama" name="Call"/> - <menu_item_call label="Invita nel gruppo" name="Invite..."/> + <menu_item_call label="Invita al gruppo" name="Invite..."/> <menu_item_call label="Blocca" name="Avatar Mute"/> - <menu_item_call label="Denuncia" name="abuse"/> + <menu_item_call label="Segnala" name="abuse"/> <menu_item_call label="Congela" name="Freeze..."/> <menu_item_call label="Espelli" name="Eject..."/> - <menu_item_call label="Debug" name="Debug..."/> - <menu_item_call label="Avvicinati" name="Zoom In"/> + <menu_item_call label="Debug delle texture" name="Debug..."/> + <menu_item_call label="Zoom avanti" name="Zoom In"/> <menu_item_call label="Paga" name="Pay..."/> </context_menu> diff --git a/indra/newview/skins/default/xui/it/menu_avatar_self.xml b/indra/newview/skins/default/xui/it/menu_avatar_self.xml index b7a9f8efbe..7796d41286 100644 --- a/indra/newview/skins/default/xui/it/menu_avatar_self.xml +++ b/indra/newview/skins/default/xui/it/menu_avatar_self.xml @@ -1,9 +1,9 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Self Pie"> <menu_item_call label="Alzati" name="Stand Up"/> - <context_menu label="Vola >" name="Take Off >"> - <context_menu label="Abiti >" name="Clothes >"> - <menu_item_call label="Gonna" name="Shirt"/> + <context_menu label="Togli â–¶" name="Take Off >"> + <context_menu label="Abiti â–¶" name="Clothes >"> + <menu_item_call label="Camicia" name="Shirt"/> <menu_item_call label="Pantaloni" name="Pants"/> <menu_item_call label="Gonna" name="Skirt"/> <menu_item_call label="Scarpe" name="Shoes"/> @@ -13,15 +13,18 @@ <menu_item_call label="Maglietta intima" name="Self Undershirt"/> <menu_item_call label="Slip" name="Self Underpants"/> <menu_item_call label="Tatuaggio" name="Self Tattoo"/> - <menu_item_call label="Alfa (trasparenza)" name="Self Alpha"/> + <menu_item_call label="Alpha (Trasparenza)" name="Self Alpha"/> <menu_item_call label="Tutti gli abiti" name="All Clothes"/> </context_menu> - <context_menu label="HUD >" name="Object Detach HUD"/> - <context_menu label="Stacca >" name="Object Detach"/> + <context_menu label="HUD â–¶" name="Object Detach HUD"/> + <context_menu label="Stacca â–¶" name="Object Detach"/> <menu_item_call label="Stacca tutto" name="Detach All"/> </context_menu> - <menu_item_call label="Il mio aspetto fisico" name="Appearance..."/> - <menu_item_call label="I miei amici" name="Friends..."/> + <menu_item_call label="Cambia vestiario" name="Chenge Outfit"/> + <menu_item_call label="Modifica il mio vestiario" name="Edit Outfit"/> + <menu_item_call label="Modifica la figura corporea" name="Edit My Shape"/> + <menu_item_call label="I miei amici..." name="Friends..."/> <menu_item_call label="I miei gruppi" name="Groups..."/> <menu_item_call label="Il mio profilo" name="Profile..."/> + <menu_item_call label="Debug delle texture" name="Debug..."/> </context_menu> diff --git a/indra/newview/skins/default/xui/it/menu_bottomtray.xml b/indra/newview/skins/default/xui/it/menu_bottomtray.xml index 185cf75183..8ca5b24b48 100644 --- a/indra/newview/skins/default/xui/it/menu_bottomtray.xml +++ b/indra/newview/skins/default/xui/it/menu_bottomtray.xml @@ -2,11 +2,16 @@ <menu name="hide_camera_move_controls_menu"> <menu_item_check label="Tasto Gesture" name="ShowGestureButton"/> <menu_item_check label="Tasto Movimento" name="ShowMoveButton"/> - <menu_item_check label="Tasto Camera" name="ShowCameraButton"/> - <menu_item_check label="Tasto Snapshot" name="ShowSnapshotButton"/> + <menu_item_check label="Tasto Visuale" name="ShowCameraButton"/> + <menu_item_check label="Tasto Foto" name="ShowSnapshotButton"/> + <menu_item_check label="Pulsante barra laterale" name="ShowSidebarButton"/> + <menu_item_check label="Pulsante Costruisci" name="ShowBuildButton"/> + <menu_item_check label="Pulsante Cerca" name="ShowSearchButton"/> + <menu_item_check label="Pulsante Mappa" name="ShowWorldMapButton"/> + <menu_item_check label="Pulsante Mini mappa" name="ShowMiniMapButton"/> <menu_item_call label="Taglia" name="NearbyChatBar_Cut"/> <menu_item_call label="Copia" name="NearbyChatBar_Copy"/> <menu_item_call label="Incolla" name="NearbyChatBar_Paste"/> - <menu_item_call label="Cancella" name="NearbyChatBar_Delete"/> - <menu_item_call label="Seleziona Tutto" name="NearbyChatBar_Select_All"/> + <menu_item_call label="Elimina" name="NearbyChatBar_Delete"/> + <menu_item_call label="Seleziona tutto" name="NearbyChatBar_Select_All"/> </menu> diff --git a/indra/newview/skins/default/xui/it/menu_cof_attachment.xml b/indra/newview/skins/default/xui/it/menu_cof_attachment.xml new file mode 100644 index 0000000000..699490c8f1 --- /dev/null +++ b/indra/newview/skins/default/xui/it/menu_cof_attachment.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="COF Attachment"> + <menu_item_call label="Stacca" name="detach"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/it/menu_cof_body_part.xml b/indra/newview/skins/default/xui/it/menu_cof_body_part.xml new file mode 100644 index 0000000000..1e3658ef45 --- /dev/null +++ b/indra/newview/skins/default/xui/it/menu_cof_body_part.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="COF Body"> + <menu_item_call label="Sostituisci" name="replace"/> + <menu_item_call label="Modifica" name="edit"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/it/menu_cof_clothing.xml b/indra/newview/skins/default/xui/it/menu_cof_clothing.xml new file mode 100644 index 0000000000..5b4f8c0642 --- /dev/null +++ b/indra/newview/skins/default/xui/it/menu_cof_clothing.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="COF Clothing"> + <menu_item_call label="Togli" name="take_off"/> + <menu_item_call label="Un livello in alto" name="move_up"/> + <menu_item_call label="Un livello in basso" name="move_down"/> + <menu_item_call label="Modifica" name="edit"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/it/menu_cof_gear.xml b/indra/newview/skins/default/xui/it/menu_cof_gear.xml new file mode 100644 index 0000000000..10524ba92d --- /dev/null +++ b/indra/newview/skins/default/xui/it/menu_cof_gear.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Gear COF"> + <menu label="Nuovi abiti" name="COF.Gear.New_Clothes"/> + <menu label="Nuove parti del corpo" name="COF.Geear.New_Body_Parts"/> +</menu> diff --git a/indra/newview/skins/default/xui/it/menu_edit.xml b/indra/newview/skins/default/xui/it/menu_edit.xml new file mode 100644 index 0000000000..ffb20a02e9 --- /dev/null +++ b/indra/newview/skins/default/xui/it/menu_edit.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu label="Modifica" name="Edit"> + <menu_item_call label="Annulla" name="Undo"/> + <menu_item_call label="Ripeti" name="Redo"/> + <menu_item_call label="Taglia" name="Cut"/> + <menu_item_call label="Copia" name="Copy"/> + <menu_item_call label="Incolla" name="Paste"/> + <menu_item_call label="Elimina" name="Delete"/> + <menu_item_call label="Duplica" name="Duplicate"/> + <menu_item_call label="Seleziona tutto" name="Select All"/> + <menu_item_call label="Deseleziona" name="Deselect"/> +</menu> diff --git a/indra/newview/skins/default/xui/it/menu_favorites.xml b/indra/newview/skins/default/xui/it/menu_favorites.xml index 9c4966d198..7813ef44b5 100644 --- a/indra/newview/skins/default/xui/it/menu_favorites.xml +++ b/indra/newview/skins/default/xui/it/menu_favorites.xml @@ -1,10 +1,10 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="Popup"> <menu_item_call label="Teleport" name="Teleport To Landmark"/> - <menu_item_call label="Vedi/Modifica Landmark" name="Landmark Open"/> + <menu_item_call label="Vedi/Modifica punto di riferimento" name="Landmark Open"/> <menu_item_call label="Copia SLurl" name="Copy slurl"/> <menu_item_call label="Mostra sulla mappa" name="Show On Map"/> <menu_item_call label="Copia" name="Landmark Copy"/> <menu_item_call label="Incolla" name="Landmark Paste"/> - <menu_item_call label="Cancella" name="Delete"/> + <menu_item_call label="Elimina" name="Delete"/> </menu> diff --git a/indra/newview/skins/default/xui/it/menu_gesture_gear.xml b/indra/newview/skins/default/xui/it/menu_gesture_gear.xml index c4f9d21d14..7cfcc6287e 100644 --- a/indra/newview/skins/default/xui/it/menu_gesture_gear.xml +++ b/indra/newview/skins/default/xui/it/menu_gesture_gear.xml @@ -1,10 +1,10 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="menu_gesture_gear"> - <menu_item_call label="Aggiungi/Cancella dai favoriti" name="activate"/> + <menu_item_call label="Aggiungi/Rimuovi dai preferiti" name="activate"/> <menu_item_call label="Copia" name="copy_gesture"/> <menu_item_call label="Incolla" name="paste"/> <menu_item_call label="Copia UUID" name="copy_uuid"/> - <menu_item_call label="Salva outfit" name="save_to_outfit"/> + <menu_item_call label="Salva vestiario" name="save_to_outfit"/> <menu_item_call label="Modifica" name="edit_gesture"/> <menu_item_call label="Ispeziona" name="inspect"/> </menu> diff --git a/indra/newview/skins/default/xui/it/menu_group_plus.xml b/indra/newview/skins/default/xui/it/menu_group_plus.xml index 6b7692a067..3b76fb94a9 100644 --- a/indra/newview/skins/default/xui/it/menu_group_plus.xml +++ b/indra/newview/skins/default/xui/it/menu_group_plus.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="menu_group_plus"> - <menu_item_call label="Unisciti al gruppo..." name="item_join"/> + <menu_item_call label="Aderisci al gruppo..." name="item_join"/> <menu_item_call label="Nuovo gruppo..." name="item_new"/> </menu> diff --git a/indra/newview/skins/default/xui/it/menu_hide_navbar.xml b/indra/newview/skins/default/xui/it/menu_hide_navbar.xml index a87e76a19b..2c2c6c4bc5 100644 --- a/indra/newview/skins/default/xui/it/menu_hide_navbar.xml +++ b/indra/newview/skins/default/xui/it/menu_hide_navbar.xml @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="hide_navbar_menu"> <menu_item_check label="Mostra la barra di navigazione" name="ShowNavbarNavigationPanel"/> - <menu_item_check label="Mostra la barra dei favoriti" name="ShowNavbarFavoritesPanel"/> + <menu_item_check label="Mostra la barra dei Preferiti" name="ShowNavbarFavoritesPanel"/> + <menu_item_check label="Mostra mini barra del luogo" name="ShowMiniLocationPanel"/> </menu> diff --git a/indra/newview/skins/default/xui/it/menu_im_well_button.xml b/indra/newview/skins/default/xui/it/menu_im_well_button.xml new file mode 100644 index 0000000000..9e471b771c --- /dev/null +++ b/indra/newview/skins/default/xui/it/menu_im_well_button.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="IM Well Button Context Menu"> + <menu_item_call label="Chiudi tutto" name="Close All"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/it/menu_imchiclet_group.xml b/indra/newview/skins/default/xui/it/menu_imchiclet_group.xml index f39ad316fe..baa4e671b0 100644 --- a/indra/newview/skins/default/xui/it/menu_imchiclet_group.xml +++ b/indra/newview/skins/default/xui/it/menu_imchiclet_group.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="IMChiclet Group Menu"> - <menu_item_call label="Informazioni gruppo" name="Show Profile"/> + <menu_item_call label="Informazioni sul gruppo" name="Show Profile"/> <menu_item_call label="Mostra sessione" name="Chat"/> <menu_item_call label="Fine sessione" name="End Session"/> </menu> diff --git a/indra/newview/skins/default/xui/it/menu_imchiclet_p2p.xml b/indra/newview/skins/default/xui/it/menu_imchiclet_p2p.xml index e89576b1f9..2eacbb09ad 100644 --- a/indra/newview/skins/default/xui/it/menu_imchiclet_p2p.xml +++ b/indra/newview/skins/default/xui/it/menu_imchiclet_p2p.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="IMChiclet P2P Menu"> <menu_item_call label="Vedi profilo" name="Show Profile"/> - <menu_item_call label="Chiedi amicizia" name="Add Friend"/> + <menu_item_call label="Aggiungi amico" name="Add Friend"/> <menu_item_call label="Mostra sessione" name="Send IM"/> <menu_item_call label="Fine sessione" name="End Session"/> </menu> diff --git a/indra/newview/skins/default/xui/it/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/it/menu_inspect_avatar_gear.xml index 968fbd37ae..22a37d7095 100644 --- a/indra/newview/skins/default/xui/it/menu_inspect_avatar_gear.xml +++ b/indra/newview/skins/default/xui/it/menu_inspect_avatar_gear.xml @@ -1,17 +1,19 @@ <?xml version="1.0" encoding="utf-8"?> <menu name="Gear Menu"> <menu_item_call label="Vedi profilo" name="view_profile"/> - <menu_item_call label="Chiedi amicizia" name="add_friend"/> + <menu_item_call label="Aggiungi amico" name="add_friend"/> <menu_item_call label="IM" name="im"/> <menu_item_call label="Chiama" name="call"/> <menu_item_call label="Teleport" name="teleport"/> - <menu_item_call label="Invita nel gruppo" name="invite_to_group"/> + <menu_item_call label="Invita al gruppo" name="invite_to_group"/> <menu_item_call label="Blocca" name="block"/> - <menu_item_call label="Denuncia" name="report"/> + <menu_item_call label="Sblocca" name="unblock"/> + <menu_item_call label="Segnala" name="report"/> <menu_item_call label="Congela" name="freeze"/> <menu_item_call label="Espelli" name="eject"/> - <menu_item_call label="Debug" name="debug"/> + <menu_item_call label="Debug delle texture" name="debug"/> <menu_item_call label="Trova sulla mappa" name="find_on_map"/> - <menu_item_call label="Avvicinati" name="zoom_in"/> + <menu_item_call label="Zoom avanti" name="zoom_in"/> <menu_item_call label="Paga" name="pay"/> + <menu_item_call label="Condividi" name="share"/> </menu> diff --git a/indra/newview/skins/default/xui/it/menu_inspect_object_gear.xml b/indra/newview/skins/default/xui/it/menu_inspect_object_gear.xml index 74d828fc20..eb10ebd0b6 100644 --- a/indra/newview/skins/default/xui/it/menu_inspect_object_gear.xml +++ b/indra/newview/skins/default/xui/it/menu_inspect_object_gear.xml @@ -1,17 +1,17 @@ <?xml version="1.0" encoding="utf-8"?> <menu name="Gear Menu"> <menu_item_call label="Tocca" name="touch"/> - <menu_item_call label="Siedi" name="sit"/> + <menu_item_call label="Siediti" name="sit"/> <menu_item_call label="Paga" name="pay"/> - <menu_item_call label="Compra" name="buy"/> + <menu_item_call label="Acquista" name="buy"/> <menu_item_call label="Prendi" name="take"/> <menu_item_call label="Prendi copia" name="take_copy"/> <menu_item_call label="Apri" name="open"/> <menu_item_call label="Modifica" name="edit"/> <menu_item_call label="Indossa" name="wear"/> - <menu_item_call label="Denuncia" name="report"/> + <menu_item_call label="Segnala" name="report"/> <menu_item_call label="Blocca" name="block"/> - <menu_item_call label="Avvicinati" name="zoom_in"/> - <menu_item_call label="Cancella" name="remove"/> - <menu_item_call label="Più info" name="more_info"/> + <menu_item_call label="Zoom avanti" name="zoom_in"/> + <menu_item_call label="Rimuovi" name="remove"/> + <menu_item_call label="Maggiori informazioni" name="more_info"/> </menu> diff --git a/indra/newview/skins/default/xui/it/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/it/menu_inspect_self_gear.xml index 1812a21b0d..80edae8a2b 100644 --- a/indra/newview/skins/default/xui/it/menu_inspect_self_gear.xml +++ b/indra/newview/skins/default/xui/it/menu_inspect_self_gear.xml @@ -1,8 +1,9 @@ <?xml version="1.0" encoding="utf-8"?> <menu name="Gear Menu"> <menu_item_call label="Alzati" name="stand_up"/> - <menu_item_call label="Il mio aspetto fisico" name="my_appearance"/> + <menu_item_call label="Cambia vestiario" name="change_outfit"/> <menu_item_call label="Il mio profilo" name="my_profile"/> - <menu_item_call label="I miei amici" name="my_friends"/> + <menu_item_call label="I miei amici..." name="my_friends"/> <menu_item_call label="I miei gruppi" name="my_groups"/> + <menu_item_call label="Debug delle texture" name="Debug..."/> </menu> diff --git a/indra/newview/skins/default/xui/it/menu_inv_offer_chiclet.xml b/indra/newview/skins/default/xui/it/menu_inv_offer_chiclet.xml new file mode 100644 index 0000000000..471640eff5 --- /dev/null +++ b/indra/newview/skins/default/xui/it/menu_inv_offer_chiclet.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="InvOfferChiclet Menu"> + <menu_item_call label="Chiudi" name="Close"/> +</menu> diff --git a/indra/newview/skins/default/xui/it/menu_inventory.xml b/indra/newview/skins/default/xui/it/menu_inventory.xml index edb9490914..fb8361ad05 100644 --- a/indra/newview/skins/default/xui/it/menu_inventory.xml +++ b/indra/newview/skins/default/xui/it/menu_inventory.xml @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="Popup"> + <menu_item_call label="Condividi" name="Share"/> <menu_item_call label="Compra" name="Task Buy"/> <menu_item_call label="Apri" name="Task Open"/> <menu_item_call label="Esegui" name="Task Play"/> @@ -8,62 +9,65 @@ <menu_item_call label="Elimina" name="Task Remove"/> <menu_item_call label="Svuota il Cestino" name="Empty Trash"/> <menu_item_call label="Svuota gli oggetti persi e ritrovati" name="Empty Lost And Found"/> - <menu_item_call label="Nuova Cartella" name="New Folder"/> - <menu_item_call label="Nuovo Script" name="New Script"/> - <menu_item_call label="Nuova Notecard" name="New Note"/> - <menu_item_call label="Nuova Gesture" name="New Gesture"/> - <menu label="Maglietta Intima" name="New Clothes"> - <menu_item_call label="Nuova Maglietta" name="New Shirt"/> - <menu_item_call label="Nuovi Pantaloni" name="New Pants"/> - <menu_item_call label="Nuove Scarpe" name="New Shoes"/> - <menu_item_call label="Nuove Calze" name="New Socks"/> - <menu_item_call label="Nuova Giacca" name="New Jacket"/> - <menu_item_call label="Nuova Gonna" name="New Skirt"/> - <menu_item_call label="Nuovi Guanti" name="New Gloves"/> - <menu_item_call label="Nuova Canottiera" name="New Undershirt"/> - <menu_item_call label="Nuove Mutande" name="New Underpants"/> + <menu_item_call label="Nuova cartella" name="New Folder"/> + <menu_item_call label="Nuovo script" name="New Script"/> + <menu_item_call label="Nuovo biglietto" name="New Note"/> + <menu_item_call label="Nuova gesture" name="New Gesture"/> + <menu label="Maglietta intima" name="New Clothes"> + <menu_item_call label="Nuova maglietta" name="New Shirt"/> + <menu_item_call label="Nuovi pantaloni" name="New Pants"/> + <menu_item_call label="Nuove scarpe" name="New Shoes"/> + <menu_item_call label="Nuove calze" name="New Socks"/> + <menu_item_call label="Nuova giacca" name="New Jacket"/> + <menu_item_call label="Nuova gonna" name="New Skirt"/> + <menu_item_call label="Nuovi guanti" name="New Gloves"/> + <menu_item_call label="Nuova canottiera" name="New Undershirt"/> + <menu_item_call label="Nuove mutande" name="New Underpants"/> <menu_item_call label="Nuovo Alfa Mask" name="New Alpha Mask"/> - <menu_item_call label="Nuovo Tatuaggio" name="New Tattoo"/> + <menu_item_call label="Nuovo tatuaggio" name="New Tattoo"/> </menu> - <menu label="Nuove Parti del Corpo" name="New Body Parts"> - <menu_item_call label="Nuova Forma del corpo" name="New Shape"/> - <menu_item_call label="Nuova Pelle" name="New Skin"/> - <menu_item_call label="Nuovi Capelli" name="New Hair"/> - <menu_item_call label="Nuovi Occhi" name="New Eyes"/> + <menu label="Nuove parti del corpo" name="New Body Parts"> + <menu_item_call label="Nuova forma del corpo" name="New Shape"/> + <menu_item_call label="Nuova pelle" name="New Skin"/> + <menu_item_call label="Nuovi capelli" name="New Hair"/> + <menu_item_call label="Nuovi occhi" name="New Eyes"/> </menu> - <menu label="Cambia Tipo" name="Change Type"> + <menu label="Cambia tipo" name="Change Type"> <menu_item_call label="Predefinito" name="Default"/> <menu_item_call label="Guanti" name="Gloves"/> <menu_item_call label="Giacca" name="Jacket"/> <menu_item_call label="Pantaloni" name="Pants"/> - <menu_item_call label="Shape" name="Shape"/> + <menu_item_call label="Figura corporea" name="Shape"/> <menu_item_call label="Scarpe" name="Shoes"/> <menu_item_call label="Camicia" name="Shirt"/> <menu_item_call label="Gonna" name="Skirt"/> <menu_item_call label="Slip" name="Underpants"/> - <menu_item_call label="Maglietta Intima" name="Undershirt"/> + <menu_item_call label="Maglietta intima" name="Undershirt"/> </menu> <menu_item_call label="Teletrasportati" name="Landmark Open"/> <menu_item_call label="Apri" name="Animation Open"/> <menu_item_call label="Apri" name="Sound Open"/> + <menu_item_call label="Sostituisci vestiti" name="Replace Outfit"/> + <menu_item_call label="Aggiungi al vestiario" name="Add To Outfit"/> + <menu_item_call label="Rimuovi dal vestiario attuale" name="Remove From Outfit"/> + <menu_item_call label="Trova originale" name="Find Original"/> <menu_item_call label="Elimina oggetto" name="Purge Item"/> <menu_item_call label="Ripristina oggetto" name="Restore Item"/> - <menu_item_call label="Vai al Link" name="Goto Link"/> <menu_item_call label="Apri" name="Open"/> + <menu_item_call label="Apri originale" name="Open Original"/> <menu_item_call label="Proprietà " name="Properties"/> <menu_item_call label="Rinomina" name="Rename"/> <menu_item_call label="Copia UUID dell'oggetto" name="Copy Asset UUID"/> <menu_item_call label="Copia" name="Copy"/> <menu_item_call label="Incolla" name="Paste"/> - <menu_item_call label="Incolla come Link" name="Paste As Link"/> + <menu_item_call label="Incolla come link" name="Paste As Link"/> + <menu_item_call label="Rimuovi link" name="Remove Link"/> <menu_item_call label="Cancella" name="Delete"/> - <menu_item_call label="Togli gli oggetti" name="Take Off Items"/> - <menu_item_call label="Aggiungi all'outfit" name="Add To Outfit"/> - <menu_item_call label="Sostituisci outfit" name="Replace Outfit"/> + <menu_item_call label="Elimina la cartella di sistema" name="Delete System Folder"/> <menu_item_call label="Inizia la conferenza chat" name="Conference Chat Folder"/> <menu_item_call label="Esegui" name="Sound Play"/> - <menu_item_call label="Informazioni sul Landmark" name="About Landmark"/> - <menu_item_call label="Esegui inworld" name="Animation Play"/> + <menu_item_call label="Informazioni sul punto di riferimento" name="About Landmark"/> + <menu_item_call label="Riproduci in Second Life" name="Animation Play"/> <menu_item_call label="Esegui localmente" name="Animation Audition"/> <menu_item_call label="Invia un Instant Message" name="Send Instant Message"/> <menu_item_call label="Offri teletrasporto..." name="Offer Teleport..."/> @@ -77,6 +81,7 @@ <menu label="Attacca all'HUD" name="Attach To HUD"/> <menu_item_call label="Modifica" name="Wearable Edit"/> <menu_item_call label="Indossa" name="Wearable Wear"/> + <menu_item_call label="Aggiungi" name="Wearable Add"/> <menu_item_call label="Togli" name="Take Off"/> <menu_item_call label="--nessuna opzione--" name="--no options--"/> </menu> diff --git a/indra/newview/skins/default/xui/it/menu_inventory_add.xml b/indra/newview/skins/default/xui/it/menu_inventory_add.xml index d33dabc4c3..05f53f44ba 100644 --- a/indra/newview/skins/default/xui/it/menu_inventory_add.xml +++ b/indra/newview/skins/default/xui/it/menu_inventory_add.xml @@ -1,32 +1,32 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="menu_inventory_add"> - <menu label="Carica sul server" name="upload"> + <menu label="Carica nel server" name="upload"> <menu_item_call label="Immagine ([COST]L$)..." name="Upload Image"/> <menu_item_call label="Suono ([COST]L$)..." name="Upload Sound"/> <menu_item_call label="Animazione ([COST]L$)..." name="Upload Animation"/> <menu_item_call label="In blocco ([COST]L$ per file)..." name="Bulk Upload"/> </menu> - <menu_item_call label="Nuova Cartella" name="New Folder"/> - <menu_item_call label="Nuovo Script" name="New Script"/> - <menu_item_call label="Nuova Notecard" name="New Note"/> - <menu_item_call label="Nuova Gesture" name="New Gesture"/> - <menu label="Nuovi Abiti" name="New Clothes"> - <menu_item_call label="Nuova Camicia" name="New Shirt"/> - <menu_item_call label="Nuovi Pantaloni" name="New Pants"/> - <menu_item_call label="Nuove Scarpe" name="New Shoes"/> - <menu_item_call label="Nuove Calze" name="New Socks"/> - <menu_item_call label="Nuova Giacca" name="New Jacket"/> - <menu_item_call label="Nuova Gonna" name="New Skirt"/> - <menu_item_call label="Nuovi Guanti" name="New Gloves"/> - <menu_item_call label="Nuova Maglietta Intima" name="New Undershirt"/> - <menu_item_call label="Nuovi Slip" name="New Underpants"/> - <menu_item_call label="Nuovo Alfa (Trasparenza)" name="New Alpha"/> - <menu_item_call label="Nuovo Tatuaggio" name="New Tattoo"/> + <menu_item_call label="Nuova cartella" name="New Folder"/> + <menu_item_call label="Nuovo script" name="New Script"/> + <menu_item_call label="Nuovo biglietto" name="New Note"/> + <menu_item_call label="Nuova gesture" name="New Gesture"/> + <menu label="Maglietta intima" name="New Clothes"> + <menu_item_call label="Nuova camicia" name="New Shirt"/> + <menu_item_call label="Nuovi pantaloni" name="New Pants"/> + <menu_item_call label="Nuove scarpe" name="New Shoes"/> + <menu_item_call label="Nuove calze" name="New Socks"/> + <menu_item_call label="Nuova giacca" name="New Jacket"/> + <menu_item_call label="Nuova gonna" name="New Skirt"/> + <menu_item_call label="Nuovi guanti" name="New Gloves"/> + <menu_item_call label="Nuova maglietta intima" name="New Undershirt"/> + <menu_item_call label="Nuovi slip" name="New Underpants"/> + <menu_item_call label="Nuovo Alfa (trasparenza)" name="New Alpha"/> + <menu_item_call label="Nuovo tatuaggio" name="New Tattoo"/> </menu> - <menu label="Nuove Parti del Corpo" name="New Body Parts"> - <menu_item_call label="Nuova Shape" name="New Shape"/> - <menu_item_call label="Nuova Pelle" name="New Skin"/> - <menu_item_call label="Nuovi Capelli" name="New Hair"/> - <menu_item_call label="Nuovi Occhi" name="New Eyes"/> + <menu label="Nuove parti del corpo" name="New Body Parts"> + <menu_item_call label="Nuova figura corporea" name="New Shape"/> + <menu_item_call label="Nuova pelle" name="New Skin"/> + <menu_item_call label="Nuovi capelli" name="New Hair"/> + <menu_item_call label="Nuovi occhi" name="New Eyes"/> </menu> </menu> diff --git a/indra/newview/skins/default/xui/it/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/it/menu_inventory_gear_default.xml index e97af5c950..cf87148f2e 100644 --- a/indra/newview/skins/default/xui/it/menu_inventory_gear_default.xml +++ b/indra/newview/skins/default/xui/it/menu_inventory_gear_default.xml @@ -1,13 +1,13 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="menu_gear_default"> - <menu_item_call label="Nuova Finestra di Inventory" name="new_window"/> - <menu_item_call label="Ordina per nome" name="sort_by_name"/> - <menu_item_call label="Ordina per data (più recenti)" name="sort_by_recent"/> - <menu_item_call label="Mostra i Filtri" name="show_filters"/> - <menu_item_call label="Cancella i Filtri" name="reset_filters"/> - <menu_item_call label="Chiudi le cartelle" name="close_folders"/> + <menu_item_call label="Nuova finestra inventario" name="new_window"/> + <menu_item_call label="Ordina in base al nome" name="sort_by_name"/> + <menu_item_call label="Mostra prima i più recenti" name="sort_by_recent"/> + <menu_item_call label="Mostra filtri" name="show_filters"/> + <menu_item_call label="Ripristina filtri" name="reset_filters"/> + <menu_item_call label="Chiudi tutte le cartelle" name="close_folders"/> <menu_item_call label="Svuota cestino" name="empty_trash"/> - <menu_item_call label="Svuota Persi e Ritrovati" name="empty_lostnfound"/> + <menu_item_call label="Svuota oggetti smarriti" name="empty_lostnfound"/> <menu_item_call label="Salva texture come" name="Save Texture As"/> <menu_item_call label="Trova originale" name="Find Original"/> <menu_item_call label="Trova tutti i link" name="Find All Links"/> diff --git a/indra/newview/skins/default/xui/it/menu_land.xml b/indra/newview/skins/default/xui/it/menu_land.xml index 173c080c3f..f510078e14 100644 --- a/indra/newview/skins/default/xui/it/menu_land.xml +++ b/indra/newview/skins/default/xui/it/menu_land.xml @@ -1,9 +1,9 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Land Pie"> - <menu_item_call label="Info sul terreno" name="Place Information..."/> - <menu_item_call label="Siedi qui" name="Sit Here"/> - <menu_item_call label="Compra questo terreno" name="Land Buy"/> - <menu_item_call label="Compra permesso" name="Land Buy Pass"/> + <menu_item_call label="Informazioni sui terreni" name="Place Information..."/> + <menu_item_call label="Siediti qui" name="Sit Here"/> + <menu_item_call label="Acquista questo terreno" name="Land Buy"/> + <menu_item_call label="Acquista Permesso" name="Land Buy Pass"/> <menu_item_call label="Costruisci" name="Create"/> <menu_item_call label="Modifica terreno" name="Edit Terrain"/> </context_menu> diff --git a/indra/newview/skins/default/xui/it/menu_landmark.xml b/indra/newview/skins/default/xui/it/menu_landmark.xml index 58e3e992ed..b3cddab783 100644 --- a/indra/newview/skins/default/xui/it/menu_landmark.xml +++ b/indra/newview/skins/default/xui/it/menu_landmark.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <toggleable_menu name="landmark_overflow_menu"> <menu_item_call label="Copia SLurl" name="copy"/> - <menu_item_call label="Cancella" name="delete"/> - <menu_item_call label="Crea luogo consigliato" name="pick"/> - <menu_item_call label="Aggiungi alla barra dei favoriti" name="add_to_favbar"/> + <menu_item_call label="Elimina" name="delete"/> + <menu_item_call label="Crea Luogo consigliato" name="pick"/> + <menu_item_call label="Aggiungi alla barra dei Preferiti" name="add_to_favbar"/> </toggleable_menu> diff --git a/indra/newview/skins/default/xui/it/menu_login.xml b/indra/newview/skins/default/xui/it/menu_login.xml index db3b84df29..0a6d803058 100644 --- a/indra/newview/skins/default/xui/it/menu_login.xml +++ b/indra/newview/skins/default/xui/it/menu_login.xml @@ -2,29 +2,22 @@ <menu_bar name="Login Menu"> <menu label="Io" name="File"> <menu_item_call label="Preferenze" name="Preferences..."/> - <menu_item_call label="Chiudi" name="Quit"/> + <menu_item_call label="Esci da [APP_NAME]" name="Quit"/> </menu> <menu label="Aiuto" name="Help"> <menu_item_call label="Aiuto di [SECOND_LIFE]" name="Second Life Help"/> + <menu_item_call label="Informazioni su [APP_NAME]" name="About Second Life"/> </menu> + <menu_item_check label="Mostra menu Debug" name="Show Debug Menu"/> <menu label="Debug" name="Debug"> - <menu label="Modifica" name="Edit"> - <menu_item_call label="Annulla" name="Undo"/> - <menu_item_call label="Ripeti" name="Redo"/> - <menu_item_call label="Taglia" name="Cut"/> - <menu_item_call label="Copia" name="Copy"/> - <menu_item_call label="Incolla" name="Paste"/> - <menu_item_call label="Cancella" name="Delete"/> - <menu_item_call label="Duplica" name="Duplicate"/> - <menu_item_call label="Seleziona Tutto" name="Select All"/> - <menu_item_call label="Deseleziona" name="Deselect"/> - </menu> - <menu_item_call label="Mostra Impostazioni di Debug" name="Debug Settings"/> - <menu_item_call label="Impostazioni colori Interfaccia" name="UI/Color Settings"/> - <menu_item_call label="Mostra la finestra laterale" name="Show Side Tray"/> - <menu label="Test Interfaccia Utente" name="UI Tests"/> - <menu_item_call label="Mostra i Termini di Servizio (TOS)" name="TOS"/> - <menu_item_call label="Mostra Messaggi critici" name="Critical"/> - <menu_item_call label="Test Web browser" name="Web Browser Test"/> + <menu_item_call label="Mostra impostazioni di debug" name="Debug Settings"/> + <menu_item_call label="Impostazioni colori interfaccia" name="UI/Color Settings"/> + <menu label="Test interfaccia utente" name="UI Tests"/> + <menu_item_call label="Imposta dimensioni della finestra..." name="Set Window Size..."/> + <menu_item_call label="Mostra i Termini del servizio (TOS)" name="TOS"/> + <menu_item_call label="Mostra messaggio critico" name="Critical"/> + <menu_item_call label="Test browser Web" name="Web Browser Test"/> + <menu_item_check label="Mostra selettore griglia" name="Show Grid Picker"/> + <menu_item_call label="Mostra Console notifiche" name="Show Notifications Console"/> </menu> </menu_bar> diff --git a/indra/newview/skins/default/xui/it/menu_mini_map.xml b/indra/newview/skins/default/xui/it/menu_mini_map.xml index 7caa7fd226..fa574230e0 100644 --- a/indra/newview/skins/default/xui/it/menu_mini_map.xml +++ b/indra/newview/skins/default/xui/it/menu_mini_map.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="popup"> +<menu name="Popup"> <menu_item_call label="Zoom ravvicinato" name="Zoom Close"/> <menu_item_call label="Zoom Medio" name="Zoom Medium"/> <menu_item_call label="Zoom Distante" name="Zoom Far"/> diff --git a/indra/newview/skins/default/xui/it/menu_navbar.xml b/indra/newview/skins/default/xui/it/menu_navbar.xml index 3d855cf701..e42d913a6f 100644 --- a/indra/newview/skins/default/xui/it/menu_navbar.xml +++ b/indra/newview/skins/default/xui/it/menu_navbar.xml @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="Navbar Menu"> <menu_item_check label="Mostra le coordinate" name="Show Coordinates"/> - <menu_item_check label="Mostra proprietà parcel" name="Show Parcel Properties"/> - <menu_item_call label="Landmark" name="Landmark"/> + <menu_item_check label="Mostra proprietà lotto" name="Show Parcel Properties"/> + <menu_item_call label="Punto di riferimento" name="Landmark"/> <menu_item_call label="Taglia" name="Cut"/> <menu_item_call label="Copia" name="Copy"/> <menu_item_call label="Incolla" name="Paste"/> - <menu_item_call label="Cancella" name="Delete"/> + <menu_item_call label="Elimina" name="Delete"/> <menu_item_call label="Seleziona tutto" name="Select All"/> </menu> diff --git a/indra/newview/skins/default/xui/it/menu_nearby_chat.xml b/indra/newview/skins/default/xui/it/menu_nearby_chat.xml index 2a625fc763..719a6d3261 100644 --- a/indra/newview/skins/default/xui/it/menu_nearby_chat.xml +++ b/indra/newview/skins/default/xui/it/menu_nearby_chat.xml @@ -1,9 +1,9 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="NearBy Chat Menu"> <menu_item_call label="Mostra le persone vicine..." name="nearby_people"/> - <menu_item_check label="Mostra Testo bloccato" name="muted_text"/> - <menu_item_check label="Mostra Icone amici" name="show_buddy_icons"/> + <menu_item_check label="Mostra il testo bloccato" name="muted_text"/> + <menu_item_check label="Mostra icone amici" name="show_buddy_icons"/> <menu_item_check label="Mostra nomi" name="show_names"/> - <menu_item_check label="Mostra Icone e nomi" name="show_icons_and_names"/> - <menu_item_call label="Dimensioni del Font" name="font_size"/> + <menu_item_check label="Mostra icone e nomi" name="show_icons_and_names"/> + <menu_item_call label="Dimensioni caratteri" name="font_size"/> </menu> diff --git a/indra/newview/skins/default/xui/it/menu_notification_well_button.xml b/indra/newview/skins/default/xui/it/menu_notification_well_button.xml new file mode 100644 index 0000000000..8c82e30f0e --- /dev/null +++ b/indra/newview/skins/default/xui/it/menu_notification_well_button.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Notification Well Button Context Menu"> + <menu_item_call label="Chiudi tutto" name="Close All"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/it/menu_object.xml b/indra/newview/skins/default/xui/it/menu_object.xml index 955d4c8776..237b6b3a0e 100644 --- a/indra/newview/skins/default/xui/it/menu_object.xml +++ b/indra/newview/skins/default/xui/it/menu_object.xml @@ -4,21 +4,24 @@ <menu_item_call label="Modifica" name="Edit..."/> <menu_item_call label="Costruisci" name="Build"/> <menu_item_call label="Apri" name="Open"/> - <menu_item_call label="Siedi qui" name="Object Sit"/> - <menu_item_call label="Profilo oggetto" name="Object Inspect"/> - <context_menu label="Metti >" name="Put On"> + <menu_item_call label="Siediti qui" name="Object Sit"/> + <menu_item_call label="Alzati" name="Object Stand Up"/> + <menu_item_call label="Profilo dell'oggetto" name="Object Inspect"/> + <menu_item_call label="Zoom avanti" name="Zoom In"/> + <context_menu label="Indossa â–¶" name="Put On"> <menu_item_call label="Indossa" name="Wear"/> - <context_menu label="Attacca >" name="Object Attach"/> - <context_menu label="Attacca HUD >" name="Object Attach HUD"/> + <context_menu label="Attacca â–¶" name="Object Attach"/> + <context_menu label="Attacca HUD â–¶" name="Object Attach HUD"/> </context_menu> - <context_menu label="Togli >" name="Remove"> - <menu_item_call label="Prendi" name="Pie Object Take"/> - <menu_item_call label="Denuncia abuso" name="Report Abuse..."/> + <context_menu label="Togli â–¶" name="Remove"> + <menu_item_call label="Segnala abuso" name="Report Abuse..."/> <menu_item_call label="Blocca" name="Object Mute"/> <menu_item_call label="Restituisci" name="Return..."/> - <menu_item_call label="Cancella" name="Delete"/> + <menu_item_call label="Elimina" name="Delete"/> </context_menu> + <menu_item_call label="Acquista" name="Pie Object Bye"/> + <menu_item_call label="Prendi" name="Pie Object Take"/> <menu_item_call label="Prendi copia" name="Take Copy"/> <menu_item_call label="Paga" name="Pay..."/> - <menu_item_call label="Compra" name="Buy..."/> + <menu_item_call label="Acquista" name="Buy..."/> </context_menu> diff --git a/indra/newview/skins/default/xui/it/menu_outfit_gear.xml b/indra/newview/skins/default/xui/it/menu_outfit_gear.xml new file mode 100644 index 0000000000..cf39779b67 --- /dev/null +++ b/indra/newview/skins/default/xui/it/menu_outfit_gear.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Gear Outfit"> + <menu_item_call label="Indossa - Sostituisci vestiario attuale" name="wear"/> + <menu_item_call label="Togli - Rimuovi dal vestiario attuale" name="take_off"/> + <menu label="Nuovi abiti" name="New Clothes"> + <menu_item_call label="Nuova camicia" name="New Shirt"/> + <menu_item_call label="Nuovi pantaloni" name="New Pants"/> + <menu_item_call label="Nuove scarpe" name="New Shoes"/> + <menu_item_call label="Nuove calze" name="New Socks"/> + <menu_item_call label="Nuova giacca" name="New Jacket"/> + <menu_item_call label="Nuova gonna" name="New Skirt"/> + <menu_item_call label="Nuovi guanti" name="New Gloves"/> + <menu_item_call label="Nuova maglietta intima" name="New Undershirt"/> + <menu_item_call label="Nuovi slip" name="New Underpants"/> + <menu_item_call label="Nuovo Alpha (trasparenza)" name="New Alpha"/> + <menu_item_call label="Nuovo tatuaggio" name="New Tattoo"/> + </menu> + <menu label="Nuove parti del corpo" name="New Body Parts"> + <menu_item_call label="Nuova figura corporea" name="New Shape"/> + <menu_item_call label="Nuova pelle" name="New Skin"/> + <menu_item_call label="Nuovi capelli" name="New Hair"/> + <menu_item_call label="Nuovi occhi" name="New Eyes"/> + </menu> + <menu_item_call label="Cambia nome del vestiario" name="rename"/> + <menu_item_call label="Elimina vestito" name="delete_outfit"/> +</menu> diff --git a/indra/newview/skins/default/xui/it/menu_outfit_tab.xml b/indra/newview/skins/default/xui/it/menu_outfit_tab.xml new file mode 100644 index 0000000000..4e0caf832c --- /dev/null +++ b/indra/newview/skins/default/xui/it/menu_outfit_tab.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Outfit"> + <menu_item_call label="Indossa - Sostituisci vestiario attuale" name="wear_replace"/> + <menu_item_call label="Indossa - Aggiungi al vestiario attuale" name="wear_add"/> + <menu_item_call label="Togli - Rimuovi dal vestiario attuale" name="take_off"/> + <menu_item_call label="Modifica vestiario" name="edit"/> + <menu_item_call label="Modifica nome" name="rename"/> + <menu_item_call label="Elimina vestito" name="delete"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/it/menu_participant_list.xml b/indra/newview/skins/default/xui/it/menu_participant_list.xml index 33c8fc404d..f70b886a1e 100644 --- a/indra/newview/skins/default/xui/it/menu_participant_list.xml +++ b/indra/newview/skins/default/xui/it/menu_participant_list.xml @@ -1,16 +1,21 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Participant List Context Menu"> + <menu_item_check label="Ordina in base al nome" name="SortByName"/> + <menu_item_check label="Ordina in base a intervenuti recenti" name="SortByRecentSpeakers"/> <menu_item_call label="Vedi profilo" name="View Profile"/> - <menu_item_call label="Chiedi amicizia" name="Add Friend"/> + <menu_item_call label="Aggiungi amico" name="Add Friend"/> <menu_item_call label="IM" name="IM"/> <menu_item_call label="Chiama" name="Call"/> <menu_item_call label="Condividi" name="Share"/> <menu_item_call label="Paga" name="Pay"/> - <menu_item_check label="Blocca/Sblocca" name="Block/Unblock"/> - <menu_item_check label="Muta testo" name="MuteText"/> - <menu_item_check label="Consenti chat di testo" name="AllowTextChat"/> - <menu_item_call label="Muta questo partecipante" name="ModerateVoiceMuteSelected"/> - <menu_item_call label="Muta tutti gli altri" name="ModerateVoiceMuteOthers"/> - <menu_item_call label="Riabilita questo partecipante" name="ModerateVoiceUnMuteSelected"/> - <menu_item_call label="Riabilita tutti gli altri" name="ModerateVoiceUnMuteOthers"/> + <menu_item_check label="Icone persone" name="View Icons"/> + <menu_item_check label="Blocca voce" name="Block/Unblock"/> + <menu_item_check label="Blocca testo" name="MuteText"/> + <context_menu label="Opzioni moderatore >" name="Moderator Options"> + <menu_item_check label="Consenti chat di testo" name="AllowTextChat"/> + <menu_item_call label="Disattiva audio di questo participante" name="ModerateVoiceMuteSelected"/> + <menu_item_call label="Riattiva audio di questo participante" name="ModerateVoiceUnMuteSelected"/> + <menu_item_call label="Disattiva audio di tutti" name="ModerateVoiceMute"/> + <menu_item_call label="Riattiva audio di tutti" name="ModerateVoiceUnmute"/> + </context_menu> </context_menu> diff --git a/indra/newview/skins/default/xui/it/menu_people_friends_view_sort.xml b/indra/newview/skins/default/xui/it/menu_people_friends_view_sort.xml index ad8927be13..1f987890c4 100644 --- a/indra/newview/skins/default/xui/it/menu_people_friends_view_sort.xml +++ b/indra/newview/skins/default/xui/it/menu_people_friends_view_sort.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="menu_group_plus"> - <menu_item_check label="Ordina per nome" name="sort_name"/> - <menu_item_check label="Ordina per stato" name="sort_status"/> + <menu_item_check label="Ordina in base al nome" name="sort_name"/> + <menu_item_check label="Ordina in base allo stato" name="sort_status"/> <menu_item_check label="Icone persone" name="view_icons"/> - <menu_item_call label="Mostra gli & oggetti dei residenti bloccati" name="show_blocked_list"/> + <menu_item_call label="Mostra oggetti e residenti bloccati" name="show_blocked_list"/> </menu> diff --git a/indra/newview/skins/default/xui/it/menu_people_groups.xml b/indra/newview/skins/default/xui/it/menu_people_groups.xml new file mode 100644 index 0000000000..30a97a1c72 --- /dev/null +++ b/indra/newview/skins/default/xui/it/menu_people_groups.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_group_plus"> + <menu_item_call label="Mostra informazioni" name="View Info"/> + <menu_item_call label="Chat" name="Chat"/> + <menu_item_call label="Chiama" name="Call"/> + <menu_item_call label="Attiva" name="Activate"/> + <menu_item_call label="Chiudi" name="Leave"/> +</menu> diff --git a/indra/newview/skins/default/xui/it/menu_people_nearby.xml b/indra/newview/skins/default/xui/it/menu_people_nearby.xml index be071a5074..a974bd181d 100644 --- a/indra/newview/skins/default/xui/it/menu_people_nearby.xml +++ b/indra/newview/skins/default/xui/it/menu_people_nearby.xml @@ -1,10 +1,13 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Avatar Context Menu"> <menu_item_call label="Vedi profilo" name="View Profile"/> - <menu_item_call label="Chiedi amicizia" name="Add Friend"/> + <menu_item_call label="Aggiungi amico" name="Add Friend"/> + <menu_item_call label="Rimuovi amico" name="Remove Friend"/> <menu_item_call label="IM" name="IM"/> <menu_item_call label="Chiama" name="Call"/> + <menu_item_call label="Mappa" name="Map"/> <menu_item_call label="Condividi" name="Share"/> <menu_item_call label="Paga" name="Pay"/> <menu_item_check label="Blocca/Sblocca" name="Block/Unblock"/> + <menu_item_call label="Offri Teleport" name="teleport"/> </context_menu> diff --git a/indra/newview/skins/default/xui/it/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/it/menu_people_nearby_multiselect.xml index f9fda2fb98..9784a4cc9a 100644 --- a/indra/newview/skins/default/xui/it/menu_people_nearby_multiselect.xml +++ b/indra/newview/skins/default/xui/it/menu_people_nearby_multiselect.xml @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Multi-Selected People Context Menu"> - <menu_item_call label="Chiedi amicizie" name="Add Friends"/> + <menu_item_call label="Aggiungi amici" name="Add Friends"/> + <menu_item_call label="Rimuovi amici" name="Remove Friend"/> <menu_item_call label="IM" name="IM"/> <menu_item_call label="Chiama" name="Call"/> <menu_item_call label="Condividi" name="Share"/> diff --git a/indra/newview/skins/default/xui/it/menu_people_nearby_view_sort.xml b/indra/newview/skins/default/xui/it/menu_people_nearby_view_sort.xml index c1b384196d..aae2313702 100644 --- a/indra/newview/skins/default/xui/it/menu_people_nearby_view_sort.xml +++ b/indra/newview/skins/default/xui/it/menu_people_nearby_view_sort.xml @@ -1,8 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="menu_group_plus"> - <menu_item_check label="Ordina mettendo per primo chi ha parlato per ultimo" name="sort_by_recent_speakers"/> - <menu_item_check label="Ordina per nome" name="sort_name"/> - <menu_item_check label="Ordina per Distanza" name="sort_distance"/> - <menu_item_check label="Vedi le icone delle persone" name="view_icons"/> - <menu_item_call label="Mostra gli & oggetti dei residenti bloccati" name="show_blocked_list"/> + <menu_item_check label="Ordina in base a intervenuti recenti" name="sort_by_recent_speakers"/> + <menu_item_check label="Ordina in base al nome" name="sort_name"/> + <menu_item_check label="Ordina in base alla distanza" name="sort_distance"/> + <menu_item_check label="Icone persone" name="view_icons"/> + <menu_item_call label="Mostra oggetti e residenti bloccati" name="show_blocked_list"/> </menu> diff --git a/indra/newview/skins/default/xui/it/menu_people_recent_view_sort.xml b/indra/newview/skins/default/xui/it/menu_people_recent_view_sort.xml index f8fd9dca79..7fccd1621a 100644 --- a/indra/newview/skins/default/xui/it/menu_people_recent_view_sort.xml +++ b/indra/newview/skins/default/xui/it/menu_people_recent_view_sort.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="menu_group_plus"> <menu_item_check label="Mostra prima i più recenti" name="sort_most"/> - <menu_item_check label="Ordina per nome" name="sort_name"/> - <menu_item_check label="Vedi le icone delle persone" name="view_icons"/> - <menu_item_call label="Mostra gli & oggetti dei residenti bloccati" name="show_blocked_list"/> + <menu_item_check label="Ordina in base al nome" name="sort_name"/> + <menu_item_check label="Icone persone" name="view_icons"/> + <menu_item_call label="Mostra oggetti e residenti bloccati" name="show_blocked_list"/> </menu> diff --git a/indra/newview/skins/default/xui/it/menu_picks.xml b/indra/newview/skins/default/xui/it/menu_picks.xml index e84b321ccf..000d219ed0 100644 --- a/indra/newview/skins/default/xui/it/menu_picks.xml +++ b/indra/newview/skins/default/xui/it/menu_picks.xml @@ -4,5 +4,5 @@ <menu_item_call label="Modifica" name="pick_edit"/> <menu_item_call label="Teleport" name="pick_teleport"/> <menu_item_call label="Mappa" name="pick_map"/> - <menu_item_call label="Cancella" name="pick_delete"/> + <menu_item_call label="Elimina" name="pick_delete"/> </context_menu> diff --git a/indra/newview/skins/default/xui/it/menu_picks_plus.xml b/indra/newview/skins/default/xui/it/menu_picks_plus.xml index d758a9715e..7fbd5abd57 100644 --- a/indra/newview/skins/default/xui/it/menu_picks_plus.xml +++ b/indra/newview/skins/default/xui/it/menu_picks_plus.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <toggleable_menu name="picks_plus_menu"> - <menu_item_call label="Nuovo luogo consigliato" name="create_pick"/> - <menu_item_call label="Nuovo Annuncio" name="create_classified"/> + <menu_item_call label="Nuovo luogo preferito" name="create_pick"/> + <menu_item_call label="Nuovo annuncio" name="create_classified"/> </toggleable_menu> diff --git a/indra/newview/skins/default/xui/it/menu_place.xml b/indra/newview/skins/default/xui/it/menu_place.xml index 5b9261b159..5381a4effa 100644 --- a/indra/newview/skins/default/xui/it/menu_place.xml +++ b/indra/newview/skins/default/xui/it/menu_place.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <toggleable_menu name="place_overflow_menu"> - <menu_item_call label="Prendi il Landmark" name="landmark"/> - <menu_item_call label="Crea luogo consigliato" name="pick"/> - <menu_item_call label="Compra Permesso" name="pass"/> + <menu_item_call label="Salva come punto di riferimento" name="landmark"/> + <menu_item_call label="Crea Luogo consigliato" name="pick"/> + <menu_item_call label="Acquista Permesso" name="pass"/> <menu_item_call label="Modifica" name="edit"/> </toggleable_menu> diff --git a/indra/newview/skins/default/xui/it/menu_place_add_button.xml b/indra/newview/skins/default/xui/it/menu_place_add_button.xml index 6dd10f422e..0e783c0000 100644 --- a/indra/newview/skins/default/xui/it/menu_place_add_button.xml +++ b/indra/newview/skins/default/xui/it/menu_place_add_button.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="menu_folder_gear"> <menu_item_call label="Aggiungi cartella" name="add_folder"/> - <menu_item_call label="Aggiungi landmark" name="add_landmark"/> + <menu_item_call label="Aggiungi punto di riferimento" name="add_landmark"/> </menu> diff --git a/indra/newview/skins/default/xui/it/menu_places_gear_folder.xml b/indra/newview/skins/default/xui/it/menu_places_gear_folder.xml index 45765bf77d..59fbb86ddc 100644 --- a/indra/newview/skins/default/xui/it/menu_places_gear_folder.xml +++ b/indra/newview/skins/default/xui/it/menu_places_gear_folder.xml @@ -1,15 +1,15 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="menu_folder_gear"> - <menu_item_call label="Aggiungi Landmark" name="add_landmark"/> + <menu_item_call label="Aggiungi punto di riferimento" name="add_landmark"/> <menu_item_call label="Aggiungi cartella" name="add_folder"/> <menu_item_call label="Taglia" name="cut"/> <menu_item_call label="Copia" name="copy_folder"/> <menu_item_call label="Incolla" name="paste"/> - <menu_item_call label="Rinomina" name="rename"/> - <menu_item_call label="Cancella" name="delete"/> - <menu_item_call label="Apri" name="expand"/> - <menu_item_call label="Chiudi" name="collapse"/> + <menu_item_call label="Modifica nome" name="rename"/> + <menu_item_call label="Elimina" name="delete"/> + <menu_item_call label="Espandi" name="expand"/> + <menu_item_call label="Comprimi" name="collapse"/> <menu_item_call label="Apri tutte le cartelle" name="expand_all"/> <menu_item_call label="Chiudi tutte le cartelle" name="collapse_all"/> - <menu_item_check label="Ordina per data" name="sort_by_date"/> + <menu_item_check label="Ordina in base alla data" name="sort_by_date"/> </menu> diff --git a/indra/newview/skins/default/xui/it/menu_places_gear_landmark.xml b/indra/newview/skins/default/xui/it/menu_places_gear_landmark.xml index 2c5b8a848c..32d7abc259 100644 --- a/indra/newview/skins/default/xui/it/menu_places_gear_landmark.xml +++ b/indra/newview/skins/default/xui/it/menu_places_gear_landmark.xml @@ -1,18 +1,18 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="menu_ladmark_gear"> <menu_item_call label="Teleport" name="teleport"/> - <menu_item_call label="Maggiori Informazioni" name="more_info"/> - <menu_item_call label="Mostra sulla Mappa" name="show_on_map"/> - <menu_item_call label="Aggiungi Landmark" name="add_landmark"/> - <menu_item_call label="Aggiungi Cartella" name="add_folder"/> + <menu_item_call label="Maggiori informazioni" name="more_info"/> + <menu_item_call label="Mostra sulla mappa" name="show_on_map"/> + <menu_item_call label="Aggiungi Punto di riferimento" name="add_landmark"/> + <menu_item_call label="Aggiungi cartella" name="add_folder"/> <menu_item_call label="Taglia" name="cut"/> - <menu_item_call label="Copia Landmark" name="copy_landmark"/> + <menu_item_call label="Copia punto di riferimento" name="copy_landmark"/> <menu_item_call label="Copia SLurl" name="copy_slurl"/> <menu_item_call label="Incolla" name="paste"/> - <menu_item_call label="Rinomina" name="rename"/> - <menu_item_call label="Cancella" name="delete"/> + <menu_item_call label="Modifica nome" name="rename"/> + <menu_item_call label="Elimina" name="delete"/> <menu_item_call label="Apri tutte le cartelle" name="expand_all"/> <menu_item_call label="Chiudi tutte le cartelle" name="collapse_all"/> - <menu_item_check label="Ordina per Data" name="sort_by_date"/> - <menu_item_call label="Crea Luogo Consigliato" name="create_pick"/> + <menu_item_check label="Ordina in base alla data" name="sort_by_date"/> + <menu_item_call label="Crea Luogo consigliato" name="create_pick"/> </menu> diff --git a/indra/newview/skins/default/xui/it/menu_profile_overflow.xml b/indra/newview/skins/default/xui/it/menu_profile_overflow.xml index 76a04a127e..56b695c597 100644 --- a/indra/newview/skins/default/xui/it/menu_profile_overflow.xml +++ b/indra/newview/skins/default/xui/it/menu_profile_overflow.xml @@ -1,5 +1,12 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <toggleable_menu name="profile_overflow_menu"> + <menu_item_call label="Mappa" name="show_on_map"/> <menu_item_call label="Paga" name="pay"/> <menu_item_call label="Condividi" name="share"/> + <menu_item_call label="Blocca" name="block"/> + <menu_item_call label="Sblocca" name="unblock"/> + <menu_item_call label="Espelli" name="kick"/> + <menu_item_call label="Congela" name="freeze"/> + <menu_item_call label="Scongela" name="unfreeze"/> + <menu_item_call label="CSR" name="csr"/> </toggleable_menu> diff --git a/indra/newview/skins/default/xui/it/menu_save_outfit.xml b/indra/newview/skins/default/xui/it/menu_save_outfit.xml new file mode 100644 index 0000000000..4882a8ac64 --- /dev/null +++ b/indra/newview/skins/default/xui/it/menu_save_outfit.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="save_outfit_menu"> + <menu_item_call label="Salva" name="save_outfit"/> + <menu_item_call label="Salva con nome" name="save_as_new_outfit"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/it/menu_script_chiclet.xml b/indra/newview/skins/default/xui/it/menu_script_chiclet.xml new file mode 100644 index 0000000000..604f754ba8 --- /dev/null +++ b/indra/newview/skins/default/xui/it/menu_script_chiclet.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="ScriptChiclet Menu"> + <menu_item_call label="Chiudi" name="Close"/> +</menu> diff --git a/indra/newview/skins/default/xui/it/menu_teleport_history_gear.xml b/indra/newview/skins/default/xui/it/menu_teleport_history_gear.xml index 71acda5a9d..409a62c31b 100644 --- a/indra/newview/skins/default/xui/it/menu_teleport_history_gear.xml +++ b/indra/newview/skins/default/xui/it/menu_teleport_history_gear.xml @@ -2,5 +2,5 @@ <menu name="Teleport History Gear Context Menu"> <menu_item_call label="Apri tutte le cartelle" name="Expand all folders"/> <menu_item_call label="Chiudi tutte le cartelle" name="Collapse all folders"/> - <menu_item_call label="Cancella la storia dei Teleport" name="Clear Teleport History"/> + <menu_item_call label="Cancella la cronologia Teleport" name="Clear Teleport History"/> </menu> diff --git a/indra/newview/skins/default/xui/it/menu_teleport_history_item.xml b/indra/newview/skins/default/xui/it/menu_teleport_history_item.xml index c01230584b..81053fbd65 100644 --- a/indra/newview/skins/default/xui/it/menu_teleport_history_item.xml +++ b/indra/newview/skins/default/xui/it/menu_teleport_history_item.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Teleport History Item Context Menu"> <menu_item_call label="Teleport" name="Teleport"/> - <menu_item_call label="Più informazioni" name="More Information"/> + <menu_item_call label="Maggiori informazioni" name="More Information"/> <menu_item_call label="Copia negli appunti" name="CopyToClipboard"/> </context_menu> diff --git a/indra/newview/skins/default/xui/it/menu_text_editor.xml b/indra/newview/skins/default/xui/it/menu_text_editor.xml index baab233a21..4636ce9929 100644 --- a/indra/newview/skins/default/xui/it/menu_text_editor.xml +++ b/indra/newview/skins/default/xui/it/menu_text_editor.xml @@ -3,6 +3,6 @@ <menu_item_call label="Taglia" name="Cut"/> <menu_item_call label="Copia" name="Copy"/> <menu_item_call label="Incolla" name="Paste"/> - <menu_item_call label="Cancella" name="Delete"/> - <menu_item_call label="Seleziona Tutto" name="Select All"/> + <menu_item_call label="Elimina" name="Delete"/> + <menu_item_call label="Seleziona tutto" name="Select All"/> </context_menu> diff --git a/indra/newview/skins/default/xui/it/menu_url_agent.xml b/indra/newview/skins/default/xui/it/menu_url_agent.xml index 874f7a8df9..37755d5749 100644 --- a/indra/newview/skins/default/xui/it/menu_url_agent.xml +++ b/indra/newview/skins/default/xui/it/menu_url_agent.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> - <menu_item_call label="Mostra profilo" name="show_agent"/> - <menu_item_call label="Copia nome negli appunti" name="url_copy_label"/> - <menu_item_call label="Copia SLurl negli appunti" name="url_copy"/> + <menu_item_call label="Mostra profilo residente" name="show_agent"/> + <menu_item_call label="Copia nome negli Appunti" name="url_copy_label"/> + <menu_item_call label="Copia SLurl negli Appunti" name="url_copy"/> </context_menu> diff --git a/indra/newview/skins/default/xui/it/menu_url_group.xml b/indra/newview/skins/default/xui/it/menu_url_group.xml index ac9dab2b3c..d9a792ebdf 100644 --- a/indra/newview/skins/default/xui/it/menu_url_group.xml +++ b/indra/newview/skins/default/xui/it/menu_url_group.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> - <menu_item_call label="Mostra info gruppo" name="show_group"/> - <menu_item_call label="Copia gruppo negli appunti" name="url_copy_label"/> - <menu_item_call label="Copia SLurl negli appunti" name="url_copy"/> + <menu_item_call label="Mostra informazioni gruppo" name="show_group"/> + <menu_item_call label="Copia gruppo negli Appunti" name="url_copy_label"/> + <menu_item_call label="Copia SLurl negli Appunti" name="url_copy"/> </context_menu> diff --git a/indra/newview/skins/default/xui/it/menu_url_http.xml b/indra/newview/skins/default/xui/it/menu_url_http.xml index b8f965f2d6..e0153d9169 100644 --- a/indra/newview/skins/default/xui/it/menu_url_http.xml +++ b/indra/newview/skins/default/xui/it/menu_url_http.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> - <menu_item_call label="Apri pagina web" name="url_open"/> + <menu_item_call label="Apri pagina Web" name="url_open"/> <menu_item_call label="Apri nel browser interno" name="url_open_internal"/> <menu_item_call label="Apri nel browser esterno" name="url_open_external"/> - <menu_item_call label="Copia URL negli appunti" name="url_copy"/> + <menu_item_call label="Copia URL negli Appunti" name="url_copy"/> </context_menu> diff --git a/indra/newview/skins/default/xui/it/menu_url_inventory.xml b/indra/newview/skins/default/xui/it/menu_url_inventory.xml index 0b410b4eff..a45a6bbc10 100644 --- a/indra/newview/skins/default/xui/it/menu_url_inventory.xml +++ b/indra/newview/skins/default/xui/it/menu_url_inventory.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> - <menu_item_call label="Mostra elemento dell'inventory" name="show_item"/> - <menu_item_call label="Copia nome negli appunti" name="url_copy_label"/> - <menu_item_call label="Copia SLurl negli appunti" name="url_copy"/> + <menu_item_call label="Mostra oggetto dell'inventario" name="show_item"/> + <menu_item_call label="Copia nome negli Appunti" name="url_copy_label"/> + <menu_item_call label="Copia SLurl negli Appunti" name="url_copy"/> </context_menu> diff --git a/indra/newview/skins/default/xui/it/menu_url_map.xml b/indra/newview/skins/default/xui/it/menu_url_map.xml index 096efcd1b9..cb7935b3ed 100644 --- a/indra/newview/skins/default/xui/it/menu_url_map.xml +++ b/indra/newview/skins/default/xui/it/menu_url_map.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> <menu_item_call label="Mostra sulla mappa" name="show_on_map"/> - <menu_item_call label="Teleportati nel luogo" name="teleport_to_location"/> - <menu_item_call label="Copia SLurl negli appunti" name="url_copy"/> + <menu_item_call label="Teleport al luogo" name="teleport_to_location"/> + <menu_item_call label="Copia SLurl negli Appunti" name="url_copy"/> </context_menu> diff --git a/indra/newview/skins/default/xui/it/menu_url_objectim.xml b/indra/newview/skins/default/xui/it/menu_url_objectim.xml index 67a9f0b914..763e65f17c 100644 --- a/indra/newview/skins/default/xui/it/menu_url_objectim.xml +++ b/indra/newview/skins/default/xui/it/menu_url_objectim.xml @@ -1,8 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> - <menu_item_call label="Mostra info oggetto" name="show_object"/> + <menu_item_call label="Mostra informazioni oggetto" name="show_object"/> <menu_item_call label="Mostra sulla mappa" name="show_on_map"/> - <menu_item_call label="Teleportati sul luogo dell'oggetto" name="teleport_to_object"/> - <menu_item_call label="Copia nome oggetto negli appunti" name="url_copy_label"/> - <menu_item_call label="Copia SLurl negli appunti" name="url_copy"/> + <menu_item_call label="Teleport sul luogo dell'oggetto" name="teleport_to_object"/> + <menu_item_call label="Copia nome oggetto negli Appunti" name="url_copy_label"/> + <menu_item_call label="Copia SLurl negli Appunti" name="url_copy"/> </context_menu> diff --git a/indra/newview/skins/default/xui/it/menu_url_parcel.xml b/indra/newview/skins/default/xui/it/menu_url_parcel.xml index e40d05f423..a032c33585 100644 --- a/indra/newview/skins/default/xui/it/menu_url_parcel.xml +++ b/indra/newview/skins/default/xui/it/menu_url_parcel.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> - <menu_item_call label="Mostra info appezzamento" name="show_parcel"/> + <menu_item_call label="Mostra informazioni lotto" name="show_parcel"/> <menu_item_call label="Mostra sulla mappa" name="show_on_map"/> - <menu_item_call label="Copia SLurl negli appunti" name="url_copy"/> + <menu_item_call label="Copia SLurl negli Appunti" name="url_copy"/> </context_menu> diff --git a/indra/newview/skins/default/xui/it/menu_url_slapp.xml b/indra/newview/skins/default/xui/it/menu_url_slapp.xml index 2e5ad64a59..b368aa9141 100644 --- a/indra/newview/skins/default/xui/it/menu_url_slapp.xml +++ b/indra/newview/skins/default/xui/it/menu_url_slapp.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> - <menu_item_call label="Lancia questo comando" name="run_slapp"/> - <menu_item_call label="Copia SLurl negli appunti" name="url_copy"/> + <menu_item_call label="Esegui questo comando" name="run_slapp"/> + <menu_item_call label="Copia SLurl negli Appunti" name="url_copy"/> </context_menu> diff --git a/indra/newview/skins/default/xui/it/menu_url_slurl.xml b/indra/newview/skins/default/xui/it/menu_url_slurl.xml index 1850252669..355c7dbed9 100644 --- a/indra/newview/skins/default/xui/it/menu_url_slurl.xml +++ b/indra/newview/skins/default/xui/it/menu_url_slurl.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> - <menu_item_call label="Mostra info del luogo" name="show_place"/> + <menu_item_call label="Mostra informazioni del luogo" name="show_place"/> <menu_item_call label="Mostra sulla mappa" name="show_on_map"/> - <menu_item_call label="Teleporta nel luogo" name="teleport_to_location"/> - <menu_item_call label="Copia SLurl negli appunti" name="url_copy"/> + <menu_item_call label="Teleport al luogo" name="teleport_to_location"/> + <menu_item_call label="Copia SLurl negli Appunti" name="url_copy"/> </context_menu> diff --git a/indra/newview/skins/default/xui/it/menu_url_teleport.xml b/indra/newview/skins/default/xui/it/menu_url_teleport.xml index 0a09090c26..c129e61f25 100644 --- a/indra/newview/skins/default/xui/it/menu_url_teleport.xml +++ b/indra/newview/skins/default/xui/it/menu_url_teleport.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> - <menu_item_call label="Teleportati in questo posto" name="teleport"/> - <menu_item_call label="Mostra Sulla mappa" name="show_on_map"/> - <menu_item_call label="Copia SLurl negli appunti" name="url_copy"/> + <menu_item_call label="Teleport a questa destinazione" name="teleport"/> + <menu_item_call label="Mostra sulla mappa" name="show_on_map"/> + <menu_item_call label="Copia SLurl negli Appunti" name="url_copy"/> </context_menu> diff --git a/indra/newview/skins/default/xui/it/menu_viewer.xml b/indra/newview/skins/default/xui/it/menu_viewer.xml index f9605da22a..693f4f158e 100644 --- a/indra/newview/skins/default/xui/it/menu_viewer.xml +++ b/indra/newview/skins/default/xui/it/menu_viewer.xml @@ -2,161 +2,154 @@ <menu_bar name="Main Menu"> <menu label="Io" name="Me"> <menu_item_call label="Preferenze" name="Preferences"/> - <menu_item_call label="Il mio Pannello di Controllo" name="Manage My Account"> + <menu_item_call label="Il mio Dashboard" name="Manage My Account"> <menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=it"/> </menu_item_call> <menu_item_call label="Compra L$" name="Buy and Sell L$"/> - <menu_item_call label="Il Mio Profilo" name="Profile"/> - <menu_item_call label="Il Mio Aspetto" name="Appearance"/> - <menu_item_check label="Il Mio Inventory" name="Inventory"/> - <menu_item_call label="Mostra Inventory su Barra Laterale" name="ShowSidetrayInventory"/> - <menu_item_call label="Le mie Gesture" name="Gestures"/> - <menu label="Il Mio Stato" name="Status"> - <menu_item_call label="Non Disponibile" name="Set Away"/> - <menu_item_call label="Non Disponibile" name="Set Busy"/> + <menu_item_call label="Il mio profilo" name="Profile"/> + <menu_item_call label="Cambia vestiario" name="ChangeOutfit"/> + <menu_item_check label="Il mio inventario" name="Inventory"/> + <menu_item_check label="Il mio inventario" name="ShowSidetrayInventory"/> + <menu_item_check label="Le mie gesture" name="Gestures"/> + <menu_item_check label="La mia voce" name="ShowVoice"/> + <menu label="Il mio stato" name="Status"> + <menu_item_call label="Assente" name="Set Away"/> + <menu_item_call label="Non disponibile" name="Set Busy"/> </menu> - <menu_item_call label="Richiedi Status Amministratore" name="Request Admin Options"/> - <menu_item_call label="Lascia Status Amministratore" name="Leave Admin Options"/> + <menu_item_call label="Richiedi diritti Admin" name="Request Admin Options"/> + <menu_item_call label="Lascia stato Admin" name="Leave Admin Options"/> <menu_item_call label="Esci da [APP_NAME]" name="Quit"/> </menu> <menu label="Comunica" name="Communicate"> - <menu_item_call label="I Miei Amici" name="My Friends"/> - <menu_item_call label="I Miei Gruppi" name="My Groups"/> - <menu_item_check label="Chat Limitrofa" name="Nearby Chat"/> - <menu_item_call label="Persone Vicine" name="Active Speakers"/> - <menu_item_check label="MultiMedia Vicini" name="Nearby Media"/> + <menu_item_call label="I miei amici..." name="My Friends"/> + <menu_item_call label="I miei gruppi" name="My Groups"/> + <menu_item_check label="Chat nei dintorni" name="Nearby Chat"/> + <menu_item_call label="Persone vicine" name="Active Speakers"/> </menu> <menu label="Mondo" name="World"> - <menu_item_check label="Muovi" name="Movement Controls"/> - <menu_item_check label="Vista" name="Camera Controls"/> - <menu_item_call label="Info Terreno" name="About Land"/> - <menu_item_call label="Regione/Proprietà Immobiliari" name="Region/Estate"/> - <menu_item_call label="Compra Terreno" name="Buy Land"/> - <menu_item_call label="Il Mio Terreno" name="My Land"/> - <menu label="Mostra" name="Land"> - <menu_item_check label="Linee Non Accessibili" name="Ban Lines"/> - <menu_item_check label="Segnalatori" name="beacons"/> - <menu_item_check label="Linee di Confine" name="Property Lines"/> - <menu_item_check label="Proprietari della Terra" name="Land Owners"/> + <menu_item_check label="Mini mappa" name="Mini-Map"/> + <menu_item_check label="Mappa del mondo" name="World Map"/> + <menu_item_call label="Istantanea" name="Take Snapshot"/> + <menu_item_call label="Crea punto di riferimento per questo luogo" name="Create Landmark Here"/> + <menu label="Profilo del luogo" name="Land"> + <menu_item_call label="Profilo del luogo" name="Place Profile"/> + <menu_item_call label="Informazioni sui terreni" name="About Land"/> + <menu_item_call label="Regione/proprietà immobiliare" name="Region/Estate"/> </menu> - <menu label="Landmark" name="Landmarks"> - <menu_item_call label="Crea Landmark Qui" name="Create Landmark Here"/> - <menu_item_call label="Imposta Qui come Casa" name="Set Home to Here"/> + <menu_item_call label="Acquista questo terreno" name="Buy Land"/> + <menu_item_call label="Il mio terreno" name="My Land"/> + <menu label="Mostra" name="LandShow"> + <menu_item_check label="Comandi del movimento" name="Movement Controls"/> + <menu_item_check label="Comandi visualizzazione" name="Camera Controls"/> + <menu_item_check label="Linee di divieto" name="Ban Lines"/> + <menu_item_check label="Marcatori" name="beacons"/> + <menu_item_check label="Linee di confine" name="Property Lines"/> + <menu_item_check label="Proprietari di terreno" name="Land Owners"/> + <menu_item_check label="Coordinate" name="Coordinates"/> + <menu_item_check label="Proprietà del lotto" name="Parcel Properties"/> </menu> - <menu_item_call label="Teleport Casa" name="Teleport Home"/> - <menu_item_check label="Mini-Mappa" name="Mini-Map"/> - <menu_item_check label="Mappa del Mondo" name="World Map"/> - <menu_item_call label="Foto" name="Take Snapshot"/> + <menu_item_call label="Teleport a Casa" name="Teleport Home"/> + <menu_item_call label="Imposta come Casa mia" name="Set Home to Here"/> <menu label="Sole" name="Environment Settings"> <menu_item_call label="Alba" name="Sunrise"/> <menu_item_call label="Mezzogiorno" name="Noon"/> <menu_item_call label="Tramonto" name="Sunset"/> <menu_item_call label="Mezzanotte" name="Midnight"/> - <menu_item_call label="Usa l'ora della Proprietà " name="Revert to Region Default"/> + <menu_item_call label="Orario della proprietà " name="Revert to Region Default"/> <menu_item_call label="Editor dell'ambiente" name="Environment Editor"/> </menu> </menu> - <menu label="Build" name="BuildTools"> - <menu_item_check label="Build" name="Show Build Tools"/> - <menu label="Seleziona Strumento Build" name="Select Tool"> - <menu_item_call label="Strumento Focalizza" name="Focus"/> + <menu label="Costruisci" name="BuildTools"> + <menu_item_check label="Costruisci" name="Show Build Tools"/> + <menu label="Seleziona strumento di costruzione" name="Select Tool"> + <menu_item_call label="Strumento Ingrandisci" name="Focus"/> <menu_item_call label="Strumento Movimento" name="Move"/> <menu_item_call label="Strumento Modifica" name="Edit"/> - <menu_item_call label="Crea Strumento" name="Create"/> + <menu_item_call label="Strumento Crea" name="Create"/> <menu_item_call label="Strumento Terreno" name="Land"/> </menu> - <menu label="Modifica" name="Edit"> - <menu_item_call label="Annulla" name="Undo"/> - <menu_item_call label="Rifai" name="Redo"/> - <menu_item_call label="Taglia" name="Cut"/> - <menu_item_call label="Copia" name="Copy"/> - <menu_item_call label="Incolla" name="Paste"/> - <menu_item_call label="Cancella" name="Delete"/> - <menu_item_call label="Duplica" name="Duplicate"/> - <menu_item_call label="Seleziona Tutto" name="Select All"/> - <menu_item_call label="Deseleziona" name="Deselect"/> + <menu_item_call label="Collegamento" name="Link"/> + <menu_item_call label="Scollega" name="Unlink"/> + <menu_item_check label="Modifica le parti collegate" name="Edit Linked Parts"/> + <menu label="Seleziona parti collegate" name="Select Linked Parts"> + <menu_item_call label="Seleziona parte successiva" name="Select Next Part"/> + <menu_item_call label="Seleziona parte precedente" name="Select Previous Part"/> + <menu_item_call label="Includi parte successiva" name="Include Next Part"/> + <menu_item_call label="Includi parte precedente" name="Include Previous Part"/> </menu> - <menu_item_call label="Unisci" name="Link"/> - <menu_item_call label="Separa" name="Unlink"/> - <menu_item_call label="Focalizza su Selezione" name="Focus on Selection"/> - <menu_item_call label="Avvicina alla Selezione" name="Zoom to Selection"/> + <menu_item_call label="Ingrandisci selezione" name="Focus on Selection"/> + <menu_item_call label="Zoom sulla selezione" name="Zoom to Selection"/> <menu label="Oggetto" name="Object"> - <menu_item_call label="Compra" name="Menu Object Take"/> - <menu_item_call label="Prendi Copia" name="Take Copy"/> - <menu_item_call label="Salva Nuovamente nell'Inventory" name="Save Object Back to My Inventory"/> - <menu_item_call label="Salva Nuovamente Nel Contenuto Oggetto" name="Save Object Back to Object Contents"/> + <menu_item_call label="Acquista" name="Menu Object Buy"/> + <menu_item_call label="Prendi" name="Menu Object Take"/> + <menu_item_call label="Prendi copia" name="Take Copy"/> + <menu_item_call label="Salva nell'inventario" name="Save Object Back to My Inventory"/> + <menu_item_call label="Salva nei contenuti oggetto" name="Save Object Back to Object Contents"/> </menu> <menu label="Script" name="Scripts"> - <menu_item_call label="Ricompila Script (Mono)" name="Mono"/> - <menu_item_call label="Ricompila gli Script(LSL)" name="LSL"/> - <menu_item_call label="Reimposta gli Script" name="Reset Scripts"/> - <menu_item_call label="Imposta gli Script in Esecuzione" name="Set Scripts to Running"/> - <menu_item_call label="Imposta gli Script Non In Esecuzione" name="Set Scripts to Not Running"/> + <menu_item_call label="Ricompila script (Mono)" name="Mono"/> + <menu_item_call label="Ricompila gli script (LSL)" name="LSL"/> + <menu_item_call label="Reimposta script" name="Reset Scripts"/> + <menu_item_call label="Imposta gli script come in esecuzione" name="Set Scripts to Running"/> + <menu_item_call label="Imposta script come non in esecuzione" name="Set Scripts to Not Running"/> </menu> <menu label="Opzioni" name="Options"> - <menu_item_check label="Modifica Parti Unite" name="Edit Linked Parts"/> - <menu_item_call label="Imposta Permessi di Upload predefiniti" name="perm prefs"/> - <menu_item_check label="Mostra Permessi Avanzati" name="DebugPermissions"/> - <menu label="Selezione" name="Selection"> - <menu_item_check label="Seleziona Solo i Miei Oggetti" name="Select Only My Objects"/> - <menu_item_check label="Seleziona Solo Oggetti Mobili" name="Select Only Movable Objects"/> - <menu_item_check label="Seleziona Se Racchiuso" name="Select By Surrounding"/> - </menu> - <menu label="Mostra" name="Show"> - <menu_item_check label="Mostra Selezione Nascosta" name="Show Hidden Selection"/> - <menu_item_check label="Mostra Raggio Luce per Selezione" name="Show Light Radius for Selection"/> - <menu_item_check label="Mostra Raggio Selezione" name="Show Selection Beam"/> - </menu> - <menu label="Griglia" name="Grid"> - <menu_item_check label="Allinea al Righello" name="Snap to Grid"/> - <menu_item_call label="Allinea Coordinate XY alla Griglia" name="Snap Object XY to Grid"/> - <menu_item_call label="Usa Selezione per la Griglia" name="Use Selection for Grid"/> - <menu_item_call label="Opzioni Griglia" name="Grid Options"/> - </menu> + <menu_item_call label="Definisci diritti di caricamento predefiniti" name="perm prefs"/> + <menu_item_check label="Mostra autorizzazioni avanzate" name="DebugPermissions"/> + <menu_item_check label="Seleziona solo i miei oggetti" name="Select Only My Objects"/> + <menu_item_check label="Seleziona solo gli oggetti spostabili" name="Select Only Movable Objects"/> + <menu_item_check label="Seleziona circostante" name="Select By Surrounding"/> + <menu_item_check label="Seleziona mostra nascosti" name="Show Hidden Selection"/> + <menu_item_check label="Seleziona mostra il raggio luminoso per la selezione" name="Show Light Radius for Selection"/> + <menu_item_check label="Mostra il raggio indicatore" name="Show Selection Beam"/> + <menu_item_check label="Posiziona nella griglia" name="Snap to Grid"/> + <menu_item_call label="Posiziona coordinate XY dell'oggetto sulla griglia" name="Snap Object XY to Grid"/> + <menu_item_call label="Usa la selezione per la griglia" name="Use Selection for Grid"/> + <menu_item_call label="Opzioni della griglia" name="Grid Options"/> </menu> - <menu label="Seleziona Parti Unite" name="Select Linked Parts"> - <menu_item_call label="Seleziona Prossima Parte" name="Select Next Part"/> - <menu_item_call label="Seleziona Parte Precedente" name="Select Previous Part"/> - <menu_item_call label="Includi Prossima Parte" name="Include Next Part"/> - <menu_item_call label="Includi Parte Precedente" name="Include Previous Part"/> + <menu label="Carica sul server" name="Upload"> + <menu_item_call label="Immagine ([COST] L$)..." name="Upload Image"/> + <menu_item_call label="Suono ([COST] L$)..." name="Upload Sound"/> + <menu_item_call label="Animazione ([COST] L$)..." name="Upload Animation"/> + <menu_item_call label="In blocco ([COST] L$ per file)..." name="Bulk Upload"/> </menu> </menu> <menu label="Aiuto" name="Help"> - <menu_item_call label="[SECOND_LIFE] Aiuto" name="Second Life Help"/> - <menu_item_call label="Tutorial" name="Tutorial"/> - <menu_item_call label="Denuncia Abuso" name="Report Abuse"/> - <menu_item_call label="Segnala Bug" name="Report Bug"/> + <menu_item_call label="Aiuto di [SECOND_LIFE]" name="Second Life Help"/> + <menu_item_call label="Segnala abuso" name="Report Abuse"/> + <menu_item_call label="Segnala bug" name="Report Bug"/> + <menu_item_call label="Informazioni su [APP_NAME]" name="About Second Life"/> </menu> - <menu label="Avanzato" name="Advanced"> - <menu_item_check label="Imposta non disponibile dopo 30 Minuti" name="Go Away/AFK When Idle"/> - <menu_item_call label="Ferma le Animazioni" name="Stop Animating My Avatar"/> - <menu_item_call label="Ridisegna le Texture" name="Rebake Texture"/> - <menu_item_call label="Riporta le Dimensioni dell'interfaccia ai Valori Predefiniti" name="Set UI Size to Default"/> - <menu_item_check label="Limita Distanza di Selezione" name="Limit Select Distance"/> - <menu_item_check label="Disabilita i Vincoli della Camera" name="Disable Camera Distance"/> + <menu label="Avanzate" name="Advanced"> + <menu_item_check label="Mostra menu Avanzato" name="Show Advanced Menu"/> + <menu_item_call label="Ferma animazione" name="Stop Animating My Avatar"/> + <menu_item_call label="Ridisegna le texture" name="Rebake Texture"/> + <menu_item_call label="Imposta dimensioni dell'interfaccia sui valori predefiniti" name="Set UI Size to Default"/> + <menu_item_call label="Imposta dimensioni della finestra..." name="Set Window Size..."/> + <menu_item_check label="Limita distanza di selezione" name="Limit Select Distance"/> + <menu_item_check label="Disabilita vincoli fotocamera" name="Disable Camera Distance"/> <menu_item_check label="Foto ad alta risoluzione" name="HighResSnapshot"/> - <menu_item_check label="Manda Foto su Disco Senza Avvisi" name="QuietSnapshotsToDisk"/> - <menu_item_check label="Comprimi le Foto su Disco" name="CompressSnapshotsToDisk"/> - <menu label="Strumenti di Performance" name="Performance Tools"> - <menu_item_call label="Misuratore Lag" name="Lag Meter"/> - <menu_item_check label="Barra Statistiche" name="Statistics Bar"/> - <menu_item_check label="Mostra Il Costo Visualizzazione Avatar (ARC)" name="Avatar Rendering Cost"/> + <menu_item_check label="Manda foto su disco senza avvisi" name="QuietSnapshotsToDisk"/> + <menu_item_check label="Comprimi le foto su disco" name="CompressSnapshotsToDisk"/> + <menu label="Strumenti di performance" name="Performance Tools"> + <menu_item_call label="Misuratore lag" name="Lag Meter"/> + <menu_item_check label="Barra statistiche" name="Statistics Bar"/> + <menu_item_check label="Mostra costo di rendering dell'avatar" name="Avatar Rendering Cost"/> </menu> - <menu label="Evidenziazione e Visibilità " name="Highlighting and Visibility"> - <menu_item_check label="Effetto Lampeggiante Segnalatore" name="Cheesy Beacon"/> - <menu_item_check label="Nascondi Particelle" name="Hide Particles"/> - <menu_item_check label="Nascondi Selezionati" name="Hide Selected"/> - <menu_item_check label="Evidenzia Trasparente" name="Highlight Transparent"/> - <menu_item_check label="Mostra Attachment HUD" name="Show HUD Attachments"/> - <menu_item_check label="Mostra Mirino in Soggettiva" name="ShowCrosshairs"/> - <menu_item_check label="Mostra Tooltip sul Terreno" name="Land Tips"/> + <menu label="Evidenziazione e visibilità " name="Highlighting and Visibility"> + <menu_item_check label="Effetto marcatore lampeggiante" name="Cheesy Beacon"/> + <menu_item_check label="Nascondi particelle" name="Hide Particles"/> + <menu_item_check label="Nascondi selezionati" name="Hide Selected"/> + <menu_item_check label="Evidenzia trasparenza" name="Highlight Transparent"/> + <menu_item_check label="Mostra elementi HUD" name="Show HUD Attachments"/> + <menu_item_check label="Mostra mirino visuale soggettiva" name="ShowCrosshairs"/> </menu> - <menu label="Modalità di Rendering" name="Rendering Types"> + <menu label="Modalità di rendering" name="Rendering Types"> <menu_item_check label="Semplice" name="Simple"/> - <menu_item_check label="Alfa (Trasparenza)" name="Alpha"/> + <menu_item_check label="Alpha (Trasparenza)" name="Alpha"/> <menu_item_check label="Albero" name="Tree"/> <menu_item_check label="Avatar" name="Character"/> - <menu_item_check label="Superfici" name="SurfacePath"/> + <menu_item_check label="Superficie" name="SurfacePath"/> <menu_item_check label="Cielo" name="Sky"/> <menu_item_check label="Acqua" name="Water"/> <menu_item_check label="Suolo" name="Ground"/> @@ -166,161 +159,162 @@ <menu_item_check label="Particelle" name="Particles"/> <menu_item_check label="Urti" name="Bump"/> </menu> - <menu label="Caratteristiche di Rendering" name="Rendering Features"> - <menu_item_check label="Interfaccia Utente" name="UI"/> + <menu label="Caratteristiche di rendering" name="Rendering Features"> + <menu_item_check label="Interfaccia utente" name="UI"/> <menu_item_check label="Selezionati" name="Selected"/> <menu_item_check label="Evidenziato" name="Highlighted"/> - <menu_item_check label="Texture Dinamiche" name="Dynamic Textures"/> - <menu_item_check label="Ombre dei Piedi" name="Foot Shadows"/> + <menu_item_check label="Texture dinamiche" name="Dynamic Textures"/> + <menu_item_check label="Ombre dei piedi" name="Foot Shadows"/> <menu_item_check label="Nebbia" name="Fog"/> - <menu_item_check label="Oggetti Flessibili" name="Flexible Objects"/> + <menu_item_check label="Oggetti flessibili" name="Flexible Objects"/> </menu> - <menu_item_check label="Esegui Thread Multipli" name="Run Multiple Threads"/> - <menu_item_call label="Pulisci la Cache di Gruppo" name="ClearGroupCache"/> - <menu_item_check label="Fluidità Mouse" name="Mouse Smoothing"/> - <menu_item_check label="Mostra IM nella Chat Limitrofa" name="IMInChat"/> + <menu_item_check label="Esegui thread multipli" name="Run Multiple Threads"/> + <menu_item_check label="Usa thread lettura plugin" name="Use Plugin Read Thread"/> + <menu_item_call label="Pulisci cache di gruppo" name="ClearGroupCache"/> + <menu_item_check label="Fluidità mouse" name="Mouse Smoothing"/> <menu label="Scorciatoie" name="Shortcuts"> - <menu_item_check label="Ricerca" name="Search"/> - <menu_item_call label="Rilascia Tasti" name="Release Keys"/> - <menu_item_call label="Imposta dimensioni Interfacca a Valori Predefiniti" name="Set UI Size to Default"/> - <menu_item_check label="Corri Sempre" name="Always Run"/> + <menu_item_call label="Immagine ([COST]L$)..." name="Upload Image"/> + <menu_item_check label="Cerca" name="Search"/> + <menu_item_call label="Rilascia tasti" name="Release Keys"/> + <menu_item_call label="Imposta dimensioni dell'interfaccia sui valori predefiniti" name="Set UI Size to Default"/> + <menu_item_check label="Corri sempre" name="Always Run"/> <menu_item_check label="Vola" name="Fly"/> - <menu_item_call label="Chiudi Finestra" name="Close Window"/> - <menu_item_call label="Chiudi Tutte le Finestre" name="Close All Windows"/> - <menu_item_call label="Foto su Disco" name="Snapshot to Disk"/> + <menu_item_call label="Chiudi finestra" name="Close Window"/> + <menu_item_call label="Chiudi tutte le finestre" name="Close All Windows"/> + <menu_item_call label="Foto su disco" name="Snapshot to Disk"/> <menu_item_call label="Soggettiva" name="Mouselook"/> <menu_item_check label="Joystick Flycam" name="Joystick Flycam"/> - <menu_item_call label="Reimposta Vista" name="Reset View"/> - <menu_item_call label="Guarda l'Ultimo che ha parlato" name="Look at Last Chatter"/> - <menu label="Seleziona Strumento Build" name="Select Tool"> - <menu_item_call label="Strumento Focalizza" name="Focus"/> + <menu_item_call label="Reimposta vista" name="Reset View"/> + <menu_item_call label="Guarda l'ultima conversazione" name="Look at Last Chatter"/> + <menu label="Seleziona strumento di costruzione" name="Select Tool"> + <menu_item_call label="Strumento Ingrandisci" name="Focus"/> <menu_item_call label="Strumento Movimento" name="Move"/> <menu_item_call label="Strumento Modifica" name="Edit"/> - <menu_item_call label="Crea Strumento" name="Create"/> + <menu_item_call label="Strumento Crea" name="Create"/> <menu_item_call label="Strumento Terreno" name="Land"/> </menu> - <menu_item_call label="Avvicina" name="Zoom In"/> - <menu_item_call label="Zoom Predefinito" name="Zoom Default"/> - <menu_item_call label="Allontana" name="Zoom Out"/> - <menu_item_call label="Alterna Schermo Intero" name="Toggle Fullscreen"/> + <menu_item_call label="Zoom avanti" name="Zoom In"/> + <menu_item_call label="Zoom predefinito" name="Zoom Default"/> + <menu_item_call label="Zoom indietro" name="Zoom Out"/> </menu> - <menu_item_call label="Mostra Impostazioni di Debug" name="Debug Settings"/> - <menu_item_check label="Mostra Menu Sviluppo" name="Debug Mode"/> + <menu_item_call label="Mostra impostazioni di debug" name="Debug Settings"/> + <menu_item_check label="Mostra menu sviluppo" name="Debug Mode"/> </menu> <menu label="Sviluppo" name="Develop"> <menu label="Console" name="Consoles"> - <menu_item_check label="Console Texture" name="Texture Console"/> + <menu_item_check label="Console texture" name="Texture Console"/> <menu_item_check label="Console di Debug" name="Debug Console"/> - <menu_item_call label="Console Notifiche" name="Notifications"/> - <menu_item_check label="Console Dimensioni Texture" name="Texture Size"/> - <menu_item_check label="Console Categoria Texture" name="Texture Category"/> - <menu_item_check label="Timer Veloci" name="Fast Timers"/> + <menu_item_call label="Console notifiche" name="Notifications"/> + <menu_item_check label="Console dimensioni texture" name="Texture Size"/> + <menu_item_check label="Console categoria texture" name="Texture Category"/> + <menu_item_check label="Timer veloci" name="Fast Timers"/> <menu_item_check label="Memoria" name="Memory"/> - <menu_item_call label="Info Regione Sulla Console di Debug" name="Region Info to Debug Console"/> - <menu_item_check label="Camera" name="Camera"/> + <menu_item_call label="Informazioni regione sulla console di debug" name="Region Info to Debug Console"/> + <menu_item_check label="Fotocamera" name="Camera"/> <menu_item_check label="Vento" name="Wind"/> + <menu_item_check label="Badge" name="Badge"/> </menu> - <menu label="Mostra Info" name="Display Info"> - <menu_item_check label="Mostra Tempo" name="Show Time"/> - <menu_item_check label="Mostra Info Rendering" name="Show Render Info"/> - <menu_item_check label="Mostra Colore sotto il Cursore" name="Show Color Under Cursor"/> - <menu_item_check label="Mostra Aggiornamenti agli Oggetti" name="Show Updates"/> + <menu label="Mostra informazioni" name="Display Info"> + <menu_item_check label="Mostra orario" name="Show Time"/> + <menu_item_check label="Mostra informazioni di rendering" name="Show Render Info"/> + <menu_item_check label="Mostra colore sotto il cursore" name="Show Color Under Cursor"/> + <menu_item_check label="Mostra aggiornamenti agli oggetti" name="Show Updates"/> </menu> - <menu label="Forza Errori" name="Force Errors"> - <menu_item_call label="Forza Breakpoint" name="Force Breakpoint"/> + <menu label="Forza un errore" name="Force Errors"> + <menu_item_call label="Forza punto di rottura" name="Force Breakpoint"/> <menu_item_call label="Forza LLError e Crash" name="Force LLError And Crash"/> - <menu_item_call label="Forza Accesso Invalido alla Memoria" name="Force Bad Memory Access"/> - <menu_item_call label="Forza Ciclo Infinito" name="Force Infinite Loop"/> - <menu_item_call label="Forza il Crash del Driver" name="Force Driver Carsh"/> - <menu_item_call label="Forza Eccezione Software" name="Force Software Exception"/> - <menu_item_call label="Forza Disconnessione Viewer" name="Force Disconnect Viewer"/> - <menu_item_call label="Simula un Memory Leak" name="Memory Leaking Simulation"/> + <menu_item_call label="Forza accesso non valido alla memoria" name="Force Bad Memory Access"/> + <menu_item_call label="Forza ciclo infinito" name="Force Infinite Loop"/> + <menu_item_call label="Forza il crash del driver" name="Force Driver Carsh"/> + <menu_item_call label="Forza eccezione software" name="Force Software Exception"/> + <menu_item_call label="Forza scollegamento viewer" name="Force Disconnect Viewer"/> + <menu_item_call label="Simula fuga di memoria" name="Memory Leaking Simulation"/> </menu> - <menu label="Test di Rendering" name="Render Tests"> - <menu_item_check label="Spostamento Camera" name="Camera Offset"/> - <menu_item_check label="Framerate Casuale" name="Randomize Framerate"/> - <menu_item_check label="Test Frame" name="Frame Test"/> + <menu label="Prove di rendering" name="Render Tests"> + <menu_item_check label="Spostamento fotocamera" name="Camera Offset"/> + <menu_item_check label="Veloc. di visualizzazione casuale" name="Randomize Framerate"/> + <menu_item_check label="Test frame" name="Frame Test"/> </menu> <menu label="Rendering" name="Rendering"> <menu_item_check label="Assi" name="Axes"/> <menu_item_check label="Wireframe" name="Wireframe"/> - <menu_item_check label="Illuminazione Globale" name="Global Illumination"/> - <menu_item_check label="Texture delle Animation" name="Animation Textures"/> - <menu_item_check label="Disabilita Textures" name="Disable Textures"/> - <menu_item_check label="Rendering Luci degli Attachment" name="Render Attached Lights"/> - <menu_item_check label="Visualizza Particelle dagli Attachment" name="Render Attached Particles"/> - <menu_item_check label="Gli Oggetti Brillano quando sono sotto il Cursore" name="Hover Glow Objects"/> + <menu_item_check label="Illuminazione globale" name="Global Illumination"/> + <menu_item_check label="Texture delle animazioni" name="Animation Textures"/> + <menu_item_check label="Disabilita texture" name="Disable Textures"/> + <menu_item_check label="Rendering delle luci unite" name="Render Attached Lights"/> + <menu_item_check label="Rendering particelle unite" name="Render Attached Particles"/> + <menu_item_check label="Gli oggetti brillano quando sono sotto il cursore" name="Hover Glow Objects"/> </menu> <menu label="Rete" name="Network"> - <menu_item_check label="Metti in Pausa Avatar" name="AgentPause"/> - <menu_item_call label="Perdi un Pacchetto" name="Drop a Packet"/> + <menu_item_check label="Metti in pausa" name="AgentPause"/> + <menu_item_call label="Lascia un pacchetto" name="Drop a Packet"/> </menu> - <menu_item_call label="Urti, Spinte & Contatti" name="Bumps, Pushes &amp; Hits"/> + <menu_item_call label="Urti, spinte e contatti" name="Bumps, Pushes &amp; Hits"/> <menu label="Mondo" name="World"> - <menu_item_check label="Sostituisci al Sole della Regione" name="Sim Sun Override"/> - <menu_item_check label="Effetto Lampeggiante Indicatore" name="Cheesy Beacon"/> - <menu_item_check label="Fissa il Clima" name="Fixed Weather"/> - <menu_item_call label="Stampa la Cache degli Oggetti in Regione" name="Dump Region Object Cache"/> + <menu_item_check label="Esclusione al sole della regione" name="Sim Sun Override"/> + <menu_item_check label="Effetto marcatore lampeggiante" name="Cheesy Beacon"/> + <menu_item_check label="Clima fisso" name="Fixed Weather"/> + <menu_item_call label="Dump della cache oggetti regione" name="Dump Region Object Cache"/> </menu> - <menu label="Interfaccia Utente" name="UI"> - <menu_item_call label="Test Browser Web" name="Web Browser Test"/> - <menu_item_call label="Stampa Info per Oggetto Selezionato" name="Print Selected Object Info"/> - <menu_item_call label="Statistiche Memoria" name="Memory Stats"/> - <menu_item_check label="Doppio Click Pilota Automatico" name="Double-ClickAuto-Pilot"/> - <menu_item_check label="Debug Click" name="Debug Clicks"/> - <menu_item_check label="Debug Eventi del Mouse" name="Debug Mouse Events"/> + <menu label="Interfaccia utente" name="UI"> + <menu_item_call label="Test browser Web" name="Web Browser Test"/> + <menu_item_call label="Stampa informazioni oggetto selezionato" name="Print Selected Object Info"/> + <menu_item_call label="Statistiche memoria" name="Memory Stats"/> + <menu_item_check label="Doppio clic pilota automatico" name="Double-ClickAuto-Pilot"/> + <menu_item_check label="Debug clic" name="Debug Clicks"/> + <menu_item_check label="Debug eventi mouse" name="Debug Mouse Events"/> </menu> <menu label="XUI" name="XUI"> - <menu_item_call label="Ricarica Impostazioni Colori" name="Reload Color Settings"/> + <menu_item_call label="Ricarica impostazioni colori" name="Reload Color Settings"/> <menu_item_call label="Test Mostra Font" name="Show Font Test"/> <menu_item_call label="Carica da XML" name="Load from XML"/> <menu_item_call label="Salva in XML" name="Save to XML"/> - <menu_item_check label="Mostra Nomi XUI" name="Show XUI Names"/> - <menu_item_call label="Manda IM di Test" name="Send Test IMs"/> + <menu_item_check label="Mostra nomi XUI" name="Show XUI Names"/> + <menu_item_call label="Manda IM di prova" name="Send Test IMs"/> </menu> <menu label="Avatar" name="Character"> <menu label="Grab Baked Texture" name="Grab Baked Texture"> <menu_item_call label="Iride" name="Iris"/> <menu_item_call label="Testa" name="Head"/> - <menu_item_call label="Parte Superiore Corpo" name="Upper Body"/> - <menu_item_call label="Parte Inferiore del Corpo" name="Lower Body"/> + <menu_item_call label="Parte superiore del corpo" name="Upper Body"/> + <menu_item_call label="Parte inferiore del corpo" name="Lower Body"/> <menu_item_call label="Gonna" name="Skirt"/> </menu> - <menu label="Test Personaggio" name="Character Tests"> - <menu_item_call label="Alterna la Geometria dei Personaggi" name="Toggle Character Geometry"/> - <menu_item_check label="Consenti Selezione Avatar" name="Allow Select Avatar"/> + <menu label="Test personaggio" name="Character Tests"> + <menu_item_call label="Alterna la geometria dei personaggi" name="Toggle Character Geometry"/> + <menu_item_check label="Consenti selezione avatar" name="Allow Select Avatar"/> </menu> - <menu_item_call label="Forza i Parametri ai Valori Predefiniti" name="Force Params to Default"/> - <menu_item_check label="Info delle Animation" name="Animation Info"/> + <menu_item_call label="Forza i parametri sui valori predefiniti" name="Force Params to Default"/> + <menu_item_check label="Informazioni sull'animazione" name="Animation Info"/> <menu_item_check label="Animazioni lente" name="Slow Motion Animations"/> - <menu_item_check label="Disabilita Livello di Dettaglio" name="Disable LOD"/> - <menu_item_check label="Mostra Schemi Collisione" name="Show Collision Skeleton"/> - <menu_item_check label="Mostra Agent Destinazione" name="Display Agent Target"/> - <menu_item_call label="Debug Texture dell'Avatar" name="Debug Avatar Textures"/> + <menu_item_check label="Disabilita livello di dettaglio" name="Disable LOD"/> + <menu_item_check label="Mostra schemi collisione" name="Show Collision Skeleton"/> + <menu_item_check label="Mostra bersaglio" name="Display Agent Target"/> + <menu_item_call label="Debug texture dell'avatar" name="Debug Avatar Textures"/> </menu> <menu_item_check label="Texture HTTP" name="HTTP Textures"/> - <menu_item_check label="Finestra Console al Prossimo Lancio" name="Console Window"/> - <menu_item_check label="Mostra Menu Admin" name="View Admin Options"/> - <menu_item_call label="Richiedi Status Amministrator" name="Request Admin Options"/> - <menu_item_call label="Lascia lo Stato di Admin" name="Leave Admin Options"/> + <menu_item_check label="Finestra Console al prossimo lancio" name="Console Window"/> + <menu_item_check label="Mostra menu Admin" name="View Admin Options"/> + <menu_item_call label="Richiedi diritti Admin" name="Request Admin Options"/> + <menu_item_call label="Lascia stato Admin" name="Leave Admin Options"/> </menu> - <menu label="Amministratore" name="Admin"> + <menu label="Admin" name="Admin"> <menu label="Object"> - <menu_item_call label="Prendi Copia" name="Take Copy"/> - <menu_item_call label="Rendimi Proprietario" name="Force Owner To Me"/> - <menu_item_call label="Forza Proprietario Facoltativo?" name="Force Owner Permissive"/> - <menu_item_call label="Cancella" name="Delete"/> + <menu_item_call label="Prendi copia" name="Take Copy"/> + <menu_item_call label="Rendimi proprietario" name="Force Owner To Me"/> + <menu_item_call label="Forza permesso proprietario" name="Force Owner Permissive"/> + <menu_item_call label="Elimina" name="Delete"/> <menu_item_call label="Blocca" name="Lock"/> </menu> - <menu label="Appezzamento" name="Parcel"> - <menu_item_call label="Rendimi Proprietario" name="Owner To Me"/> - <menu_item_call label="Imposta al Contenuto Linden" name="Set to Linden Content"/> - <menu_item_call label="Prendi Terreno Pubblico" name="Claim Public Land"/> + <menu label="Lotto" name="Parcel"> + <menu_item_call label="Rendimi proprietario" name="Owner To Me"/> + <menu_item_call label="Imposta sul contenuto Linden" name="Set to Linden Content"/> + <menu_item_call label="Rivendica terreno pubblico" name="Claim Public Land"/> </menu> <menu label="Regione" name="Region"> - <menu_item_call label="Stampa i Dati Temporanei degli Asset" name="Dump Temp Asset Data"/> - <menu_item_call label="Salva Stato Regione" name="Save Region State"/> + <menu_item_call label="Dump di dati temporanei degli asset" name="Dump Temp Asset Data"/> + <menu_item_call label="Salva stato regione" name="Save Region State"/> </menu> - <menu_item_call label="Strumenti SuperUser" name="God Tools"/> + <menu_item_call label="Strumenti Admin" name="God Tools"/> </menu> </menu_bar> diff --git a/indra/newview/skins/default/xui/it/menu_wearable_list_item.xml b/indra/newview/skins/default/xui/it/menu_wearable_list_item.xml new file mode 100644 index 0000000000..79ef188993 --- /dev/null +++ b/indra/newview/skins/default/xui/it/menu_wearable_list_item.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Outfit Wearable Context Menu"> + <menu_item_call label="Indossa" name="wear"/> + <menu_item_call label="Aggiungi" name="wear_add"/> + <menu_item_call label="Togli / Stacca" name="take_off_or_detach"/> + <menu_item_call label="Stacca" name="detach"/> + <context_menu label="Attacca a â–¶" name="wearable_attach_to"/> + <context_menu label="Attacca a HUD â–¶" name="wearable_attach_to_hud"/> + <menu_item_call label="Togli" name="take_off"/> + <menu_item_call label="Modifica" name="edit"/> + <menu_item_call label="Profilo dell'oggetto" name="object_profile"/> + <menu_item_call label="Mostra originale" name="show_original"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/it/mime_types_linux.xml b/indra/newview/skins/default/xui/it/mime_types_linux.xml index 5db3eddca8..3bc30b507a 100644 --- a/indra/newview/skins/default/xui/it/mime_types_linux.xml +++ b/indra/newview/skins/default/xui/it/mime_types_linux.xml @@ -2,24 +2,24 @@ <mimetypes name="default"> <widgetset name="web"> <label name="web_label"> - Contenuto del Web + Contenuti Web </label> <tooltip name="web_tooltip"> - Questo luogo ha un contenuto Web + Questo luogo presenta contenuti Web </tooltip> <playtip name="web_playtip"> - Mostra il contenuto Web + Mostra contenuti Web </playtip> </widgetset> <widgetset name="movie"> <label name="movie_label"> - Video + Filmato </label> <tooltip name="movie_tooltip"> - Qui c'è un video da riprodurre + C'è un filmato da vedere qui </tooltip> <playtip name="movie_playtip"> - Riproduci video + Riproduci il filmato </playtip> </widgetset> <widgetset name="image"> @@ -27,10 +27,10 @@ Immagine </label> <tooltip name="image_tooltip"> - C'è un immagine in questo luogo + C'è un'immagine in questo luogo </tooltip> <playtip name="image_playtip"> - Guarda l'immagine di questo luogo + Vedi l'immagine di questo luogo </playtip> </widgetset> <widgetset name="audio"> @@ -38,25 +38,25 @@ Audio </label> <tooltip name="audio_tooltip"> - In questo luogo c'è l'audio + C'è un audio in questo luogo </tooltip> <playtip name="audio_playtip"> - Riproduci l'audio in questo luogo + Riproduci l'audio di questo luogo </playtip> </widgetset> <scheme name="rtsp"> <label name="rtsp_label"> - Real Time Streaming + Streaming in tempo reale </label> </scheme> <mimetype name="blank"> <label name="blank_label"> - - Vuoto - + - Nessuno - </label> </mimetype> <mimetype name="none/none"> <label name="none/none_label"> - - Vuoto - + - Nessuno - </label> </mimetype> <mimetype name="audio/*"> @@ -76,7 +76,7 @@ </mimetype> <mimetype name="video/vnd.secondlife.qt.legacy"> <label name="vnd.secondlife.qt.legacy_label"> - Video (QuickTime) + Filmato (QuickTime) </label> </mimetype> <mimetype name="application/javascript"> @@ -116,7 +116,7 @@ </mimetype> <mimetype name="application/x-director"> <label name="application/x-director_label"> - Direttore Macromedia + Macromedia Director </label> </mimetype> <mimetype name="audio/mid"> @@ -186,32 +186,32 @@ </mimetype> <mimetype name="video/mpeg"> <label name="video/mpeg_label"> - Video (MPEG) + Filmato (MPEG) </label> </mimetype> <mimetype name="video/mp4"> <label name="video/mp4_label"> - Video (MP4) + Filmato (MP4) </label> </mimetype> <mimetype name="video/quicktime"> <label name="video/quicktime_label"> - Video (QuickTime) + Filmato (QuickTime) </label> </mimetype> <mimetype name="video/x-ms-asf"> <label name="video/x-ms-asf_label"> - Video (Windows Media ASF) + Filmato (Windows Media ASF) </label> </mimetype> <mimetype name="video/x-ms-wmv"> <label name="video/x-ms-wmv_label"> - Video (Windows Media WMV) + Filmato (Windows Media WMV) </label> </mimetype> <mimetype name="video/x-msvideo"> <label name="video/x-msvideo_label"> - Video (AVI) + Filmato (AVI) </label> </mimetype> </mimetypes> diff --git a/indra/newview/skins/default/xui/it/mime_types_mac.xml b/indra/newview/skins/default/xui/it/mime_types_mac.xml index f91c9ce5bd..3bc30b507a 100644 --- a/indra/newview/skins/default/xui/it/mime_types_mac.xml +++ b/indra/newview/skins/default/xui/it/mime_types_mac.xml @@ -2,13 +2,13 @@ <mimetypes name="default"> <widgetset name="web"> <label name="web_label"> - Argomento nel Web + Contenuti Web </label> <tooltip name="web_tooltip"> - Questo luogo ha un argomento nel Web + Questo luogo presenta contenuti Web </tooltip> <playtip name="web_playtip"> - Mostra l'argomento del Web + Mostra contenuti Web </playtip> </widgetset> <widgetset name="movie"> @@ -30,7 +30,7 @@ C'è un'immagine in questo luogo </tooltip> <playtip name="image_playtip"> - Vedere l'immagine di questo luogo + Vedi l'immagine di questo luogo </playtip> </widgetset> <widgetset name="audio"> @@ -46,7 +46,7 @@ </widgetset> <scheme name="rtsp"> <label name="rtsp_label"> - Real Time Streaming + Streaming in tempo reale </label> </scheme> <mimetype name="blank"> @@ -86,17 +86,17 @@ </mimetype> <mimetype name="application/ogg"> <label name="application/ogg_label"> - Ogg Audio/Video + Audio/Video Ogg </label> </mimetype> <mimetype name="application/pdf"> <label name="application/pdf_label"> - PDF Document + Documento PDF </label> </mimetype> <mimetype name="application/postscript"> <label name="application/postscript_label"> - Postscript Document + Documento Postscript </label> </mimetype> <mimetype name="application/rtf"> diff --git a/indra/newview/skins/default/xui/it/notifications.xml b/indra/newview/skins/default/xui/it/notifications.xml index 2a370a2ed0..9f1472fc6f 100644 --- a/indra/newview/skins/default/xui/it/notifications.xml +++ b/indra/newview/skins/default/xui/it/notifications.xml @@ -11,18 +11,29 @@ </global> <template name="okbutton"> <form> - <button name="OK" text="$yestext"/> + <button name="OK_okbutton" text="$yestext"/> + </form> + </template> + <template name="okignore"> + <form> + <button name="OK_okignore" text="$yestext"/> </form> </template> - <template name="okignore"/> <template name="okcancelbuttons"> <form> - <button name="Cancel" text="$notext"/> + <button name="OK_okcancelbuttons" text="$yestext"/> + <button name="Cancel_okcancelbuttons" text="$notext"/> + </form> + </template> + <template name="okcancelignore"> + <form> + <button name="OK_okcancelignore" text="$yestext"/> + <button name="Cancel_okcancelignore" text="$notext"/> </form> </template> - <template name="okcancelignore"/> <template name="okhelpbuttons"> <form> + <button name="OK_okhelpbuttons" text="$yestext"/> <button name="Help" text="$helptext"/> </form> </template> @@ -30,12 +41,13 @@ <form> <button name="Yes" text="$yestext"/> <button name="No" text="$notext"/> + <button name="Cancel_yesnocancelbuttons" text="$canceltext"/> </form> </template> - <notification functor="GenericAcknowledge" label="Messaggio di Notifica Sconosciuto" name="MissingAlert"> - La versione di [APP_NAME] non riesce a visualizzare la notifica che ha ricevuto. Verifica di avere l'ultima versione del Viewer installata. + <notification functor="GenericAcknowledge" label="Messaggio di notifica sconosciuto" name="MissingAlert"> + La versione di [APP_NAME] non riesce a visualizzare la notifica appena ricevuta. Verifica di avere l'ultima versione del Viewer installata. -Dettaglio Errore: La notifica di nome '[_NAME]' non è stata trovata in notifications.xml. +Dettagli errore: La notifica denominata '[_NAME]' non è stata trovata in notifications.xml. <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="FloaterNotFound"> @@ -56,11 +68,11 @@ Dettaglio Errore: La notifica di nome '[_NAME]' non è stata trovata i <usetemplate name="okcancelbuttons" notext="Annulla" yestext="Si"/> </notification> <notification name="BadInstallation"> - Errore mentre si aggiornava [APP_NAME]. [http://get.secondlife.com Scarica l'ultima versione] del Viewer. + Il programma [APP_NAME] ha riscontrato un'errore durante il tentativo di aggiornamento. [http://get.secondlife.com Scarica l'ultima versione] del Viewer. <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="LoginFailedNoNetwork"> - Non è possibile connettersi a [SECOND_LIFE_GRID]. + Non è possibile collegarsi alla [SECOND_LIFE_GRID]. '[DIAGNOSTIC]' Accertati che la tua connessione Internet stia funzionando correttamente. <usetemplate name="okbutton" yestext="OK"/> @@ -93,14 +105,18 @@ Scegli solo un oggetto e riprova. Salva tutte le modifiche alle parti del corpo/abiti? <usetemplate canceltext="Annulla" name="yesnocancelbuttons" notext="Non Salvare" yestext="Salva Tutto"/> </notification> + <notification name="FriendsAndGroupsOnly"> + Chi non è tuo amico non saprà che hai scelto di ignorare le loro chiamate e IM. + <usetemplate name="okbutton" yestext="OK"/> + </notification> <notification name="GrantModifyRights"> - Dare i diritti di modifica ad un altro residente gli consente di cambiare, cancellare o prendere QUALUNQUE oggetto che hai in [SECOND_LIFE]. Fai MOLTA attenzione quando concedi questo permesso. -Vuoi davvero dare i diritti di modifica a [FIRST_NAME] [LAST_NAME]? + Quando concedi i diritti di modifica ad un altro residente, gli permetti di modificare, eliminare o prendere QUALSIASI oggetto che possiedi in Second Life. Pertanto ti consigliamo di essere ben sicuro quando concedi questo diritto. +Vuoi concedere i diritti di modifica a [FIRST_NAME] [LAST_NAME]? <usetemplate name="okcancelbuttons" notext="No" yestext="Si"/> </notification> <notification name="GrantModifyRightsMultiple"> - Dare i diritti di modifica ad un altro residente gli consente di cambiare QUALUNQUE oggetto che hai in [SECOND_LIFE]. Fai MOLTA attenzione quando concedi questo permesso. -Vuoi davvero dare i diritti di modifica ai residenti selezionati? + Quando concedi i diritti di modifica ad un altro residente, gli permetti di modificare QUALSIASI oggetto che possiedi in Second Life. Pertanto ti consigliamo di essere ben sicuro quando concedi questo diritto. +Vuoi concedere i diritti di modifica ai residenti selezionati? <usetemplate name="okcancelbuttons" notext="No" yestext="Si"/> </notification> <notification name="RevokeModifyRights"> @@ -130,7 +146,7 @@ Vuoi davvero dare i diritti di modifica ai residenti selezionati? Non si possono rimuovere membri da quel ruolo. I membri devono dimettersi volontariamente dal ruolo. Confermi l'operazione? - <usetemplate ignoretext="Conferma prima di aggiungere un nuovo Proprietario del Gruppo" name="okcancelignore" notext="No" yestext="Si"/> + <usetemplate ignoretext="Conferma prima di aggiungere un nuovo proprietario del gruppo" name="okcancelignore" notext="No" yestext="Si"/> </notification> <notification name="AssignDangerousActionWarning"> Stai per aggiungere il potere '[ACTION_NAME]' al ruolo '[ROLE_NAME]'. @@ -150,23 +166,30 @@ Aggiungi questo potere a '[ROLE_NAME]'? Aggiungi questo potere a '[ROLE_NAME]'? <usetemplate name="okcancelbuttons" notext="No" yestext="Si"/> </notification> - <notification name="ClickUnimplemented"> - Mi dispiace, non è ancora stato implementato. + <notification name="AttachmentDrop"> + Stai per abbandonare il tuo accessorio. + Vuoi continuare? + <usetemplate ignoretext="Conferma prima di distaccare gli accessori" name="okcancelignore" notext="No" yestext="Sì"/> </notification> <notification name="JoinGroupCanAfford"> Iscriversi a questo gruppo costa [COST]L$. Vuoi proseguire? <usetemplate name="okcancelbuttons" notext="Annulla" yestext="Iscriviti"/> </notification> + <notification name="JoinGroupNoCost"> + Aderisci al gruppo [NAME]. +Continuare? + <usetemplate name="okcancelbuttons" notext="Annulla" yestext="Iscriviti"/> + </notification> <notification name="JoinGroupCannotAfford"> Iscriversi a questo gruppo costa [COST]L$. Non hai abbastanza L$ per iscriverti a questo gruppo. </notification> <notification name="CreateGroupCost"> - La Creazione di questo gruppo costerà L$100. -I Gruppi devono avere più di un membro, o saranno cancellati definitivamente. -Per favore invita altri membri entro le prossime 48 ore. - <usetemplate canceltext="Annulla" name="okcancelbuttons" notext="Cancella" yestext="Crea un gruppo per L$100"/> + La creazione di questo gruppo costerà L$ 100. +I gruppi devono avere più di un partecipante, o saranno eliminati definitivamente. +Invita altri partecipanti entro le prossime 48 ore. + <usetemplate canceltext="Annulla" name="okcancelbuttons" notext="Annulla" yestext="Crea un gruppo per L$ 100"/> </notification> <notification name="LandBuyPass"> Pagando [COST]L$ puoi entrare in questa terra ('[PARCEL_NAME]') per [TIME] ore. Compri un pass? @@ -182,10 +205,10 @@ Il tuo prezzo di vendità è [SALE_PRICE]L$ ed è autorizzato alla vendita a [NA <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/> </notification> <notification name="ConfirmLandSaleToAnyoneChange"> - ATTENZIONE: Cliccando 'vendi a tutti' rende questo terreno disponibile all'intera comunità [SECOND_LIFE], perfino a quelli che non sono in questa regione. + ATTENZIONE: Quando selezioni 'vendi a tutti', rendi questo terreno disponibile all'intera comunità di [SECOND_LIFE], anche alle persone che non si trovano in questa regione. -Stai mettendo in vendita il terrendo selezionato di [LAND_SIZE] m². -Il prezzo di vendità è [SALE_PRICE]L$ e verrà autorizzato alla vendita a [NAME]. +Il terrendo selezionato di [LAND_SIZE] m² sta per essere messo in vendita. +Il prezzo di vendità sarà [SALE_PRICE]L$ e [NAME] viene autorizzato alla vendita. <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/> </notification> <notification name="ReturnObjectsDeededToGroup"> @@ -246,10 +269,10 @@ L'intera regione ha l'abilitazione danni. Gli script devono essere autorizzati all'esecuzione affinchè le armi funzionino. </notification> <notification name="MultipleFacesSelected"> - Multiple facce multimediale sono attualmente selezionate. -Se prosegui con questa azione, esempi separati del media saranno impostati su facce multimediali dell'oggetto. ???!!! -Per impostare il media su una sola faccia multimediale, scegli Seleziona Faccia e clicca la faccia desiderata dell'oggetto e poi clicca Aggiungi. - <usetemplate ignoretext="Il Media sarà impostato su facce multimediali multiple" name="okcancelignore" notext="Cancella" yestext="OK"/> + Sono state selezionate più facce. +Se prosegui con questa azione, sulle diverse facce dell'oggetto verranno definite sessioni multimediali distinte. +Per collocare il media su una sola faccia, scegli Seleziona faccia, clicca su una faccia e clicca su Aggiungi. + <usetemplate ignoretext="Il canale multimediale sarà impostato su più facce selezionate" name="okcancelignore" notext="Annulla" yestext="OK"/> </notification> <notification name="MustBeInParcel"> Devi essere dentro il terreno per impostare il suo Punto di Atterraggio. @@ -287,8 +310,8 @@ La cartella equipaggiamento non contiene abbigliamento, parti del corpo o attach Non puoi indossare abiti e parti del corpo che sono nel cestino </notification> <notification name="MaxAttachmentsOnOutfit"> - L'oggetto non può essere attaccato. -Superato il limite di oggetti attaccati [MAX_ATTACHMENTS]. Per favore prima stacca un altro oggetto. + L'oggetto non può essere collegato. +Superato il limite di oggetti collegati [MAX_ATTACHMENTS]. Per favore prima stacca un altro oggetto. </notification> <notification name="CannotWearInfoNotComplete"> Non puoi indossare quell'elemento perchè non è ancora stato caricato. Riprova fra un minuto. @@ -303,12 +326,15 @@ Hai bisogno di un account per entrare in [SECOND_LIFE]. Ne vuoi creare uno adess </url> <usetemplate name="okcancelbuttons" notext="Riprova" yestext="Crea un nuovo account"/> </notification> + <notification name="InvalidCredentialFormat"> + Immetti sia il nome che il cognome del tuo avatar nel campo del nome utente, quindi effettua l'accesso. + </notification> <notification name="AddClassified"> - L'inserzione apparirà nella sezione 'Annunci' della Ricerca e su [http://secondlife.com/community/classifieds secondlife.com] per una settimana. -Compila la tua inserzione, e quindi clicca 'Pubblica...' per aggiungerla all'elenco. -Ti sarà chiesto un prezzo da pagare quando clicchi Pubblica. -Pagando di più il tuo annuncio apparirà più in alto nella lista, e apparirà anche più in alto quando la gente cerca per Parole Chiavi. - <usetemplate ignoretext="Come Creare una nuova Inserzione" name="okcancelignore" notext="Annulla" yestext="OK"/> + L'inserzione comparirà nella sezione 'Annunci' della Ricerca e su [http://secondlife.com/community/classifieds secondlife.com] per una settimana. +Compila la tua inserzione, quindi clicca 'Pubblica...' per aggiungerla all'elenco degli annunci. +Quando clicchi su Pubblica, ti verrà chiesto di indicare quale prezzo vuoi pagare. +Pagando di più, il tuo annuncio comparirà più in alto nella lista delle inserzioni, nonché nei risultati delle ricerche in base a parole chiave. + <usetemplate ignoretext="Come creare una nuova inserzione" name="okcancelignore" notext="Annulla" yestext="OK"/> </notification> <notification name="DeleteClassified"> Cancella annuncio '[NAME]'? @@ -316,16 +342,20 @@ Non ci sono rimborsi per la tariffa pagata. <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/> </notification> <notification name="DeleteMedia"> - Hai selezionato la cancellazione del media associato a questa faccia multimediale. -Sei sicuro di voler continuare? - <usetemplate ignoretext="Confemra la cancellazione del multimedia dall'oggetto" name="okcancelignore" notext="No" yestext="Si"/> + Hai selezionato la cancellazione del media associato a questa faccia. +Vuoi continuare? + <usetemplate ignoretext="Conferma prima di eliminare elementi multimediali dall'oggetto" name="okcancelignore" notext="No" yestext="Sì"/> </notification> <notification name="ClassifiedSave"> Salva le modifiche all'annuncio [NAME]? <usetemplate canceltext="Annulla" name="yesnocancelbuttons" notext="Non salvare" yestext="Salva"/> </notification> + <notification name="ClassifiedInsufficientFunds"> + Denaro insufficiente per creare un'inserzione. + <usetemplate name="okbutton" yestext="OK"/> + </notification> <notification name="DeleteAvatarPick"> - Cancella il favorito [PICK]? + Elimina preferito <nolink>[PICK]</nolink>? <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/> </notification> <notification name="PromptGoToEventsPage"> @@ -341,26 +371,18 @@ Sei sicuro di voler continuare? <notification name="SelectHistoryItemToView"> Scegli un item storico da vedere. </notification> - <notification name="ResetShowNextTimeDialogs"> - Vuoi riabilitare tutti le finestre di popup, che precedentemente hai indicato che 'Non vuoi vedere più'? - <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/> - </notification> - <notification name="SkipShowNextTimeDialogs"> - Vuoi disabilitare tutti i popup che possono essere ignorati? - <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/> - </notification> <notification name="CacheWillClear"> - La Cache verrà cancellata dopo la ripartenza di [APP_NAME]. + La cache verrà cancellata dopo il riavvio di [APP_NAME]. </notification> <notification name="CacheWillBeMoved"> - La Cache verrà mossa dopo la ripartenza di [APP_NAME]. -Nota: Questo cancellerà anche la cache. + La cache verrà spostata dopo il riavvio di [APP_NAME]. +Nota: questa operazione cancellerà la cache. </notification> <notification name="ChangeConnectionPort"> - Le importazioni di Porte avranno effetto dopo la ripartenza di [APP_NAME]. + Le impostazioni della porta avranno effetto dopo il riavvio di [APP_NAME]. </notification> <notification name="ChangeSkin"> - La nuova skin apparirà dopo la ripartenza di [APP_NAME]. + La nuova pelle comparirà dopo il riavvio di [APP_NAME]. </notification> <notification name="GoToAuctionPage"> Vai alla pagina web [SECOND_LIFE] per vedere i dettagli dell'asta oppure fai un'offerta? @@ -409,8 +431,8 @@ L'oggetto potrebbe essere troppo lontano oppure essere stato cancellato. C'è stato un problema salvando lo script compilato a causa del seguente motivo: [REASON]. Riprova a salvare lo script più tardi. </notification> <notification name="StartRegionEmpty"> - Oops, la tua Regione di Inizio non è stata impostata. -Per favore scrivi il nome della Regione nello spazio Regione di Inizio oppure scegli la mia ultima Ubicazione o Casa Mia come ultima ubicazione. + La tua Regione di inizio non è stata definita. +Per scegliere il luogo dove vuoi trovarti all'accesso, digita il nome della regione nel campo del luogo di partenza oppure scegli La mia ultima Ubicazione o Casa mia. <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="CouldNotStartStopScript"> @@ -424,35 +446,35 @@ L'oggetto potrebbe essere troppo lontano oppure essere stato cancellato. Non è stato possibile scrivere il file [[FILE]] </notification> <notification name="UnsupportedHardware"> - Attenzione: Il tuo sistema non soddisfa i requisiti minimi per il funzionamento [APP_NAME]. Se continui ad usare [APP_NAME], potresti osservare una lentezza eccessiva. Sfortunatamente non possiamo fornire supporto tecnico per configurazioni di sistema non supportate. + Ti informiamo che il tuo computer non dispone dei requisiti minimi di sistema per [APP_NAME]. Il funzionamento può pertanto risultare ridotto. Purtroppo la pagina [SUPPORT_SITE] non può fornire assistenza tecnica in caso di problemi dovuti a configurazioni di sistema non compatibili. -MINSPECS -Vuoi visitare [_URL] per maggiori informazioni? +Visitare [_URL] per ulteriori informazioni? <url name="url" option="0"> http://secondlife.com/support/sysreqs.php?lang=it </url> - <usetemplate ignoretext="L'hardware di questo computer non è supportato" name="okcancelignore" notext="No" yestext="Si"/> + <usetemplate ignoretext="L'hardware di questo computer non è compatibile" name="okcancelignore" notext="No" yestext="Si"/> </notification> <notification name="UnknownGPU"> - Il tuo sistema contiene una scheda grafica ancora sconosciuta a [APP_NAME]. -Questo succede spesso con nuovo hardware che non è ancora stato verificato con [APP_NAME]. Probabilmente [APP_NAME] funzionerà correttamente, ma forse devi regolare le impostazioni grafiche a qualcosa di più appropriato. + Il tuo sistema utilizza una scheda grafica che [APP_NAME] non riconosce. +Questo succede spesso con un nuovo hardware che non è stato ancora testato con [APP_NAME]. Probabilmente tutto andrà bene, ma devi riconfigurare le tue impostazioni grafiche. (Io > Preferenze > Grafica). <form name="form"> - <ignore name="ignore" text="La mia scheda grafica non è stata identificata"/> + <ignore name="ignore" text="La tua scheda grafica non è stata riconosciuta"/> </form> </notification> <notification name="DisplaySettingsNoShaders"> - [APP_NAME] si è interrotta mentre stava inizializzando i driver grafici. -La Qualità Grafica verrà impostata a Basso per evitare alcuni errori comuni di driver. Questo disabiliterà alcune caratteristiche grafiche. -Si raccomanda di aggiornare i driver della scheda grafica. -La Qualità Grafica può essere aumentata in Preferenze > Grafica. + L'esecuzione di [APP_NAME] si è interrotta durante l'inizializzazione dei driver grafici. +La qualità grafica verrà impostata a livello basso per evitare alcuni errori comuni di driver. Alcune funzionalità grafiche saranno disattivate. +Si consiglia di aggiornare i driver della scheda grafica. +La qualità grafica può essere aumentata in Preferenze > Grafica. </notification> <notification name="RegionNoTerraforming"> La regione [REGION] non consente di terraformare. </notification> <notification name="CannotCopyWarning"> - Non hai il permesso di copiare questo elemento e lo perderai dal tuo inventario se lo regali. -Confermi veramente di offrire questo elemento? + Non hai l'autorizzazione a copiare i seguenti oggetti: +[ITEMS] +e se li dai via, verranno eliminati dal tuo inventario. Sicuro di volere offrire questi oggetti? <usetemplate name="okcancelbuttons" notext="No" yestext="Si"/> </notification> <notification name="CannotGiveItem"> @@ -590,6 +612,11 @@ Attese [VALIDS] <notification name="CannotEncodeFile"> Impossibile codificare il file: [FILE] </notification> + <notification name="CorruptedProtectedDataStore"> + Poiché non è possibile leggere i dati protetti, ora verranno ripristinati. + Ciò può succedere alla modifica delle impostazioni di rete. + <usetemplate name="okbutton" yestext="OK"/> + </notification> <notification name="CorruptResourceFile"> File risorsa corrotto: [FILE] </notification> @@ -600,14 +627,18 @@ Attese [VALIDS] Impossibile creare il file in uscita: [FILE] </notification> <notification name="DoNotSupportBulkAnimationUpload"> - [APP_NAME] non supporta ancora l'upload in blocco di file di animazione. + [APP_NAME] non supporta ancora il caricamento in blocco di file di animazione. </notification> <notification name="CannotUploadReason"> Impossibile importare il file [FILE] a causa del seguente motivo: [REASON] Riprova più tardi. </notification> <notification name="LandmarkCreated"> - Hai aggiunto "[LANDMARK_NAME]" alla tua [FOLDER_NAME] cartella. + Hai aggiunto "[LANDMARK_NAME]" alla tua cartella [FOLDER_NAME]. + </notification> + <notification name="LandmarkAlreadyExists"> + Hai già il punto di riferimento di questo luogo. + <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="CannotCreateLandmarkNotOwner"> Non puoi creare qui un landmark perchè il proprietario di questo terreno non lo consente. @@ -632,7 +663,7 @@ Seleziona oggetti con degli script. Seleziona oggetti con script su cui hai i permessi di modifica. </notification> <notification name="CannotOpenScriptObjectNoMod"> - Impossibile aprire la script dell'oggetto senza i permessi modify. + Impossibile aprire la script dell'oggetto senza i diritti di modifica. </notification> <notification name="CannotSetRunningSelectObjectsNoScripts"> Impossibile mettere 'in esecuzione' gli script. @@ -657,16 +688,16 @@ Ho cercato: [FINALQUERY] Le parole che hai usato per la ricerca sono troppo corte e non è stato possibile iniziare la ricerca. </notification> <notification name="CouldNotTeleportReason"> - Impossibile eseguire il teleport. + Teleport non riuscito. [REASON] </notification> <notification name="invalid_tport"> - E' stato incontrato un problema eseguendo la tua richiesta di teleport. Potresti avere bisogno di riloggarti per ritentare il teleport. -Se continui a ricevere questo errore, controlla [SUPPORT_SITE]. + C'è stato un problema nell'elaborare la tua richiesta di teleport. Potresti dover effettuare nuovamente l'accesso prima di poter usare il teleport. +Se si continua a visualizzare questo messaggio, consulta la pagina [SUPPORT_SITE]. </notification> <notification name="invalid_region_handoff"> - Ci sono stati problemi eseguendo il passaggio di regione. Potresti avere bisogno di riloggarti per ritentare il passaggio di regione. -Se continui a ricevere questo errore, controlla [SUPPORT_SITE]. + Si è verificato un problema nel tentativo di attraversare regioni. È possibile che per potere attraversare le regioni, tu debba effettuare nuovamente l'accesso. +Se si continua a visualizzare questo messaggio, consulta la pagina [SUPPORT_SITE]. </notification> <notification name="blocked_tport"> Spiacenti, il teletrasporto è bloccato al momento. Prova di nuovo tra pochi istanti. Se ancora non potrai teletrasportarti, per favore scollegati e ricollegati per risolvere il problema. @@ -706,8 +737,8 @@ Nessun terreno selezionato. Impossibile forzare la proprietà del terreno perchè la selezione si estende su diverse regioni. Seleziona una area più piccola e riprova. </notification> <notification name="ForceOwnerAuctionWarning"> - Questo terreno è venduta all'asta. Forzare la proprietà cancellerà l'asta e potrebbe disturbare residenti che abbiano già fatto offerte. -Vuoi forzare la proprietà ? + Questo lotto è all'asta. La designazione di un proprietario determinerà l'annullamento automatico dell'asta e probabilmente può scontentare qualche residente se l'asta è già iniziata. +Vuoi designare un proprietario? <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/> </notification> <notification name="CannotContentifyNothingSelected"> @@ -735,7 +766,7 @@ Nessun terreno selezionato. Non riesco a trovare la regione dove è situato il terreno. </notification> <notification name="CannotCloseFloaterBuyLand"> - Non puoi chiudere la finestra di Acquisto Terreno finchè [APP_NAME] non finisce di stimare il prezzo di questa transazione. + Non puoi chiudere la finestra Acquista terreno finché [APP_NAME] non finisce di stimare il prezzo di questa transazione. </notification> <notification name="CannotDeedLandNothingSelected"> Impossibile cedere il terreno: @@ -746,8 +777,8 @@ Nessun terreno selezionato. Nessun gruppo selezionato. </notification> <notification name="CannotDeedLandNoRegion"> - Non è possibile donare il terreno: -Non riesco a trovare la regione in cui si trova. + Non è possibile effettuare la cessione del terreno: +Impossibile trovare la regione in cui si trova il terreno. </notification> <notification name="CannotDeedLandMultipleSelected"> Impossibile cedere il terreno: @@ -755,13 +786,6 @@ Hai selezionato più di un terreno. Prova a selezionare un solo terreno. </notification> - <notification name="ParcelCanPlayMedia"> - Questo posto può mostrare contenuto multimediale in streaming. Questo richiede una connessione Internet veloce. - -Mostra contenuto multimediale quando disponibile? -(Puoi cambiare questa opzione anche successivamente su Preferenze > Privacy.) - <usetemplate name="okcancelbuttons" notext="Disabilita" yestext="Abilita MultiMedia"/> - </notification> <notification name="CannotDeedLandWaitingForServer"> Impossibile cedere il terreno: Sto aspettando il server per segnalare la proprietà . @@ -791,7 +815,7 @@ I terreni di tua proprietà vengono visualizzati in verde. </notification> <notification name="CannotReleaseLandRegionNotFound"> Non è possibile abbandonare il terreno: -Non riesco a trovare la regione in cui si trova. +Impossibile trovare la regione in cui si trova il terreno. </notification> <notification name="CannotReleaseLandNoTransfer"> Impossibile abbandonare il terreno: @@ -829,11 +853,11 @@ Dividi il terreno? </notification> <notification name="CannotDivideLandNoRegion"> Non è possibile suddividere il terreno: -Non riesco a trovare la regione in cui si trova. +Impossibile trovare la regione in cui si trova il terreno. </notification> <notification name="CannotJoinLandNoRegion"> Non è possibile unire il terreno: -Non riesco a trovare la regione in cui si trova. +Impossibile trovare la regione in cui si trova il terreno. </notification> <notification name="CannotJoinLandNothingSelected"> Impossibile unire il terreno: @@ -880,12 +904,11 @@ Unisci il terreno? </notification> <notification name="CannotSaveToAssetStore"> Non è possibile salvare [NAME] nel database centrale degli asset. -Questo normalmente è un problema temporaneo. Riadatta e salva i vestiti e riprova fra qualche minuto. +In genere si tratta di un problema temporaneo. Attendi alcuni minuti per modificare e salvare nuovamente gli elementi indossabili. </notification> <notification name="YouHaveBeenLoggedOut"> - Sei stato sconnesso da [SECOND_LIFE]: + Sei stato scollegato da [SECOND_LIFE]. [MESSAGE] -Puoi ancora vedere gli IM e la chat cliccando 'Vedi IM & Chat'. Altrimenti clicca 'Esci' per uscire immediatamente da[APP_NAME]. <usetemplate name="okcancelbuttons" notext="Esci" yestext="Vedi IM & Chat"/> </notification> <notification name="OnlyOfficerCanBuyLand"> @@ -910,6 +933,36 @@ Offri l'amicizia a [NAME]? <button name="Cancel" text="Annulla"/> </form> </notification> + <notification label="Salva vestiario" name="SaveOutfitAs"> + Salva gli abiti che indosso come nuovo vestiario: + <form name="form"> + <input name="message"> + [DESC] (nuovo) + </input> + <button name="Offer" text="OK"/> + <button name="Cancel" text="Annulla"/> + </form> + </notification> + <notification label="Salva capo da indossare" name="SaveWearableAs"> + Salva oggetto nel mio inventario come: + <form name="form"> + <input name="message"> + [DESC] (nuovo) + </input> + <button name="Offer" text="OK"/> + <button name="Cancel" text="Annulla"/> + </form> + </notification> + <notification label="Cambia nome del vestiario" name="RenameOutfit"> + Nuovo nome per il vestiario: + <form name="form"> + <input name="new_name"> + [NAME] + </input> + <button name="Offer" text="OK"/> + <button name="Cancel" text="Annulla"/> + </form> + </notification> <notification name="RemoveFromFriends"> Vuoi rimuovere remove [FIRST_NAME] [LAST_NAME] dalla lista dei tuoi amici? <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/> @@ -944,6 +997,12 @@ su TUTTI I TERRENI di questa sim? Introduci un prezzo più alto. </notification> + <notification name="ConfirmItemDeleteHasLinks"> + Almeno uno degli oggetti selezionati è collegato tramite link ad altri oggetti. Se elimini l'oggetto, i relativi link non funzioneranno più. Pertanto si consiglia vivamente di eliminare prima i link. + +Sei sicuro di volere eliminare gli oggetti? + <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/> + </notification> <notification name="ConfirmObjectDeleteLock"> Almeno uno degli elementi selezionati è bloccato. @@ -1043,37 +1102,39 @@ Cedi questo terreno di [AREA] m² al gruppo '[GROUP_NAME]'? </notification> <notification name="ErrorMessage"> [ERROR_MESSAGE] + <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="AvatarMovedDesired"> - L'ubicazione desiderata non è attualmente disponibile. Sei stato trasportato in una regione vicina. + L'ubicazione prescelta non è attualmente disponibile. +Sei stato trasferito in una regione vicina. </notification> <notification name="AvatarMovedLast"> - La tua ultima ubicazione non è al momento disponibile. -Sei stato trasferito in una regione vicina . + La tua ultima posizione non è al momento disponibile. +Sei stato trasferito in una regione vicina. </notification> <notification name="AvatarMovedHome"> L'ubicazione di casa tua non è al momento disponibile. -Sei stato trasferito in un'ubicazione vicina. -Potresti impostare una nuova ubicazione. +Sei stato trasferito in una regione vicina. +Ti consigliamo di impostare una nuova posizione iniziale. </notification> <notification name="ClothingLoading"> - Sto ancora scaricando i tuoi abiti. -Puoi comunque usare [SECOND_LIFE] normalmente e gli altri ti vedranno correttamente. + Gli abiti sono in corso di scaricamento. +Puoi comunque usare [SECOND_LIFE] normalmente e gli altri residenti ti vedranno correttamente. <form name="form"> - <ignore name="ignore" text="Lo scarico degli abiti sta impiegando parecchio tempo"/> + <ignore name="ignore" text="Lo scaricamento sta richiedendo parecchio tempo"/> </form> </notification> <notification name="FirstRun"> - L'installazione di [APP_NAME] è completa. + L'installazione di [APP_NAME] è terminata. -Se questa è la prima volta che usi [SECOND_LIFE], devi creare un account prima che tu possa fare il log in. -Vuoi ritornare su [http://join.secondlife.com secondlife.com] per creare un nuovo account? +Se questa è la prima volta che usi [SECOND_LIFE], devi creare un account prima che tu possa effettuare l'accesso. +Vuoi tornare a [http://join.secondlife.com secondlife.com] per creare un nuovo account? <usetemplate name="okcancelbuttons" notext="Continua" yestext="Nuovo Account..."/> </notification> <notification name="LoginPacketNeverReceived"> - Ci sono problemi di connessione. Può darsi che siano nella tua connessione Internet oppure in [SECOND_LIFE_GRID]. + Ci sono problemi di connessione. È possibile che ci siano problemi con la tua connessione Internet oppure sulla [SECOND_LIFE_GRID]. -Puoi controllare la tua connessione Internet e riprovare fra qualche minuto, oppure cliccare Aiuto per vedere il [SUPPORT_SITE], oppure cliccare Teleport per tentare di teleportarti a casa. +Controlla la tua connessione Internet e riprova fra qualche minuto, oppure clicca su Aiuto per visualizzare la pagina [SUPPORT_SITE], oppure clicca su Teleport per tentare il teleport a casa tua. <url name="url"> http://it.secondlife.com/support/ </url> @@ -1091,14 +1152,50 @@ Premi F1 in qualunque momento per la guida o per apprendere altre cose di [SECON Scegli un avatar maschile o femminile. Puoi sempre cambiare idea più tardi. <usetemplate name="okcancelbuttons" notext="Femminile" yestext="Maschile"/> </notification> + <notification name="CantTeleportToGrid"> + Impossibile effettuare il teleport su [SLURL], in quanto si trova su una griglia ([GRID]) diversa da quella attuale ([CURRENT_GRID]). Chiudi il viewer e prova nuovamente. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="GeneralCertificateError"> + Impossibile collegarsi al server. +[REASON] + +Nome oggetto: [SUBJECT_NAME_STRING] +Nome emittente: [ISSUER_NAME_STRING] +Valido da: [VALID_FROM] +Valido fino a: [VALID_TO] +Impronta MD5: [SHA1_DIGEST] +Impronta SHA1: [MD5_DIGEST] +Uso chiave: [KEYUSAGE] +Uso chiave estesa: [EXTENDEDKEYUSAGE] +Identificatore chiave oggetto: [SUBJECTKEYIDENTIFIER] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="TrustCertificateError"> + Autorità di certificazione di questo server sconosciuta. + +Informazioni sul certificato: +Nome oggetto: [SUBJECT_NAME_STRING] +Nome emittente: [ISSUER_NAME_STRING] +Valido da: [VALID_FROM] +Valido fino a: [VALID_TO] +Impronta MD5: [SHA1_DIGEST] +Impronta SHA1: [MD5_DIGEST] +Uso chiave: [KEYUSAGE] +Uso chiave estesa: [EXTENDEDKEYUSAGE] +Identificatore chiave oggetto: [SUBJECTKEYIDENTIFIER] + +Accettare questa autorità ? + <usetemplate name="okcancelbuttons" notext="Annulla" yestext="Accetta"/> + </notification> <notification name="NotEnoughCurrency"> [NAME] [PRICE]L$ Non hai abbastanza L$ per farlo. </notification> <notification name="GrantedModifyRights"> - [NAME] ti ha dato il permesso di editare i suoi oggetti. + [NAME] ti ha dato il permesso di modificare i suoi oggetti. </notification> <notification name="RevokedModifyRights"> - Ti è stato revocato il permesso di modificare gli oggetti di [NAME] + Non sei più autorizzato a modificare gli oggetti di [NAME] </notification> <notification name="FlushMapVisibilityCaches"> Questo reinizializzerà la cache della mappa di questa regione. @@ -1177,107 +1274,107 @@ Imposta l'oggetto per la vendita e riprova. [DOWNLOAD_PATH]. </notification> <notification name="DownloadWindowsMandatory"> - E' disponibile una nuova versione di [APP_NAME]. + È disponibile una nuova versione di [APP_NAME]. [MESSAGE] -Devi scaricarla per usare [APP_NAME]. +Devi scaricare questo aggiornamento per utilizzare [APP_NAME]. <usetemplate name="okcancelbuttons" notext="Esci" yestext="Scarica l'aggiornamento"/> </notification> <notification name="DownloadWindows"> - E' disponibile una versione aggiornata di [APP_NAME]. + È disponibile una versione aggiornata di [APP_NAME]. [MESSAGE] -Questo aggiornamento non è obbligatorio, ma è consigliabile installarlo per migliorare le prestazioni e la stabilità . +Questo aggiornamento non è necessario, ma ti consigliamo di installarlo per migliorare il rendimento e la stabilità . <usetemplate name="okcancelbuttons" notext="Continua" yestext="Scarica l'aggiornamento"/> </notification> <notification name="DownloadWindowsReleaseForDownload"> - E' disponibile una versione aggiornata di [APP_NAME]. + È disponibile una versione aggiornata di [APP_NAME]. [MESSAGE] -Questo aggiornamento non è obbligatorio, ma è consigliabile installarlo per migliorare le prestazioni e la stabilità . +Questo aggiornamento non è necessario, ma ti consigliamo di installarlo per migliorare il rendimento e la stabilità . <usetemplate name="okcancelbuttons" notext="Continua" yestext="Scarica l'aggiornamento"/> </notification> <notification name="DownloadLinuxMandatory"> - Una nuova versione di [APP_NAME] è disponibile. + È disponibile una nuova versione di [APP_NAME]. [MESSAGE] -Devi scaricare questo aggiornamento per utilizzarlo [APP_NAME]. - <usetemplate name="okcancelbuttons" notext="Esci" yestext="Download"/> +Devi scaricare questo aggiornamento per utilizzare [APP_NAME]. + <usetemplate name="okcancelbuttons" notext="Esci" yestext="Scarica"/> </notification> <notification name="DownloadLinux"> - E' disponibile una versione aggiornata di [APP_NAME]. + È disponibile una versione aggiornata di [APP_NAME]. [MESSAGE] -Questo aggiornamento non è necessario, ti consigliamo di installarlo per migliorare il rendimento e la stabilità . - <usetemplate name="okcancelbuttons" notext="Continua" yestext="Download"/> +Questo aggiornamento non è necessario, ma ti consigliamo di installarlo per migliorare il rendimento e la stabilità . + <usetemplate name="okcancelbuttons" notext="Continua" yestext="Scarica"/> </notification> <notification name="DownloadLinuxReleaseForDownload"> - E' disponibile una versione aggiornata di [APP_NAME]. + È disponibile una versione aggiornata di [APP_NAME]. [MESSAGE] -Questo aggiornamento non è obbligatorio, ma è consigliata l'installazione per migliorare le prestazioni e l'affidabilità . - <usetemplate name="okcancelbuttons" notext="Continua" yestext="Download"/> +Questo aggiornamento non è necessario, ma ti consigliamo di installarlo per migliorare il rendimento e la stabilità . + <usetemplate name="okcancelbuttons" notext="Continua" yestext="Scarica"/> </notification> <notification name="DownloadMacMandatory"> - E' disponibile una nuova versione di [APP_NAME]. + È disponibile una nuova versione di [APP_NAME]. [MESSAGE] -Devi scaricarla per usare [APP_NAME]. +Devi scaricare questo aggiornamento per utilizzare [APP_NAME]. -Scarico nella cartella Applicazioni? +Scaricare nella cartella Applicazioni? <usetemplate name="okcancelbuttons" notext="Esci" yestext="Scarica l'aggiornamento"/> </notification> <notification name="DownloadMac"> - E' disponibile una versione aggiornata di [APP_NAME]. + È disponibile una versione aggiornata di [APP_NAME]. [MESSAGE] -Questo aggiornamento non è obbligatorio, ma è consigliabile installarlo per migliorare le prestazioni e la stabilità . +Questo aggiornamento non è necessario, ma ti consigliamo di installarlo per migliorare il rendimento e la stabilità . -Scarico nella cartella Applicazioni? +Scaricare nella cartella Applicazioni? <usetemplate name="okcancelbuttons" notext="Continua" yestext="Scarica l'aggiornamento"/> </notification> <notification name="DownloadMacReleaseForDownload"> - E' disponibile una versione aggiornata di [APP_NAME]. + È disponibile una versione aggiornata di [APP_NAME]. [MESSAGE] -Questo aggiornamento non è obbligatorio, ma è consigliabile installarlo per migliorare le prestazioni e la stabilità . +Questo aggiornamento non è necessario, ma ti consigliamo di installarlo per migliorare il rendimento e la stabilità . -Scarico nella cartella Applicazioni? +Scaricare nella cartella Applicazioni? <usetemplate name="okcancelbuttons" notext="Continua" yestext="Scarica l'aggiornamento"/> </notification> <notification name="DeedObjectToGroup"> La cessione di questo oggetto farà in modo che il gruppo: * Riceva i L$ pagati all'oggetto - <usetemplate ignoretext="Conferma la donazione di un oggetto al gruppo" name="okcancelignore" notext="Annulla" yestext="Cedi"/> + <usetemplate ignoretext="Conferma la cessione di un oggetto al gruppo" name="okcancelignore" notext="Annulla" yestext="Cedi"/> </notification> <notification name="WebLaunchExternalTarget"> - Vuoi aprire il browser per vedere questo contenuto? - <usetemplate ignoretext="Lancia il browser per vedere la pagina web" name="okcancelignore" notext="Annulla" yestext="OK"/> + Vuoi aprire il browser per vedere questi contenuti? + <usetemplate ignoretext="Lancia il browser per consultare una pagina web" name="okcancelignore" notext="Annulla" yestext="OK"/> </notification> <notification name="WebLaunchJoinNow"> Vuoi andare su [http://secondlife.com/account/ Dashboard] per gestire il tuo account? - <usetemplate ignoretext="Lancia il browser pe gestire il mio account" name="okcancelignore" notext="Annulla" yestext="OK"/> + <usetemplate ignoretext="Lancia il browser per gestire il mio account" name="okcancelignore" notext="Annulla" yestext="OK"/> </notification> <notification name="WebLaunchSecurityIssues"> Visita la Wiki di [SECOND_LIFE] per i dettagli su come segnalare un problema di sicurezza. - <usetemplate ignoretext="Lancia il browser per imparare a segnalare un Problema di Sicurezza" name="okcancelignore" notext="Annulla" yestext="OK"/> + <usetemplate ignoretext="Lancia il browser per imparare a segnalare un problema di sicurezza" name="okcancelignore" notext="Annulla" yestext="OK"/> </notification> <notification name="WebLaunchQAWiki"> Visita il controllo di qualità Wiki [SECOND_LIFE]. - <usetemplate ignoretext="Lancia il browser per vedere il QA Wiki" name="okcancelignore" notext="Annulla" yestext="OK"/> + <usetemplate ignoretext="Lancia il browser per vedere la pagina Wiki sul controllo di qualità " name="okcancelignore" notext="Annulla" yestext="OK"/> </notification> <notification name="WebLaunchPublicIssue"> Visita il registro pubblico dei problemi di [SECOND_LIFE], dove puoi segnalare bug ed altri problemi. - <usetemplate ignoretext="Lancia il browser per vedere il Registro dei Problemi Pubblici" name="okcancelignore" notext="Annulla" yestext="Vai alla pagina"/> + <usetemplate ignoretext="Lancia il browser per vedere il registro pubblico di monitoraggio dei problemi" name="okcancelignore" notext="Annulla" yestext="Vai alla pagina"/> </notification> <notification name="WebLaunchSupportWiki"> Vai al blog ufficiale Linden, per le ultime notizie ed informazioni. <usetemplate ignoretext="Lancia il browser per vedere il blog" name="okcancelignore" notext="Annulla" yestext="OK"/> </notification> <notification name="WebLaunchLSLGuide"> - Vuoi aprire la Guida per lo Scripting per avere aiuto con lo scripting? - <usetemplate ignoretext="Lancia il browser per vedere la Guida per lo Scripting" name="okcancelignore" notext="Annulla" yestext="OK"/> + Vuoi aprire la Guida per lo scripting per avere aiuto con lo scripting? + <usetemplate ignoretext="Lancia il browser per vedere la Guida per lo scripting" name="okcancelignore" notext="Annulla" yestext="OK"/> </notification> <notification name="WebLaunchLSLWiki"> - Vuoi visitare il Portale LSL per avere aiuto con lo Scripting? + Vuoi visitare il Portale LSL per avere aiuto con lo scripting? <usetemplate ignoretext="Lancia il browser per vedere il Portale LSL" name="okcancelignore" notext="Annulla" yestext="Vai alla pagina"/> </notification> <notification name="ReturnToOwner"> Confermi di voler restituire gli oggetti selezionati ai loro proprietari? Gli oggetti trasferibili ceduti al gruppo, verranno restituiti ai proprietari precedenti. *ATTENZIONE* Gli oggetti ceduti non trasferibili verranno cancellati! - <usetemplate ignoretext="Conferma la restituzione degli oggetti ai loro proprietari" name="okcancelignore" notext="Annulla" yestext="OK"/> + <usetemplate ignoretext="Conferma prima di restituire gli oggetti ai relativi proprietari" name="okcancelignore" notext="Annulla" yestext="OK"/> </notification> <notification name="GroupLeaveConfirmMember"> Sei attualmente un membro del gruppo [GROUP]. @@ -1285,18 +1382,18 @@ Vuoi lasciare il gruppo? <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/> </notification> <notification name="ConfirmKick"> - Vuoi VERAMENTE espellere tutti gli utenti dalla griglia? - <usetemplate name="okcancelbuttons" notext="Annulla" yestext="Espelli tutti gli utenti"/> + Vuoi veramente espellere tutti i residenti dalla griglia? + <usetemplate name="okcancelbuttons" notext="Annulla" yestext="Espelli tutti i residenti"/> </notification> <notification name="MuteLinden"> - Mi dispiace, non puoi bloccare un Linden. + Spiacenti, non puoi bloccare un Linden. <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="CannotStartAuctionAlreadyForSale"> Non è possibile mettere in vendita all'asta un terreno che è già impostato per la vendita. Disabilita la vendita del terreno, se sei certo di voler avviare una vendita all'asta. </notification> - <notification label="E' fallito Il Blocco dell'Oggetto" name="MuteByNameFailed"> - Hai già bloccato questo nome. + <notification label="Il blocco dell'oggetto in base al nome non è riuscito," name="MuteByNameFailed"> + hai già bloccato questo nome. <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="RemoveItemWarn"> @@ -1313,18 +1410,21 @@ Vuoi cancellare quell'elemento? <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="BusyModeSet"> - E' stata impostata la modalità Non Disponibile. -La Chat e gli IM verranno nascosti. Gli IM riceveranno la tua risposta di Non Disponibile. Tutte le offerte di teleport verranno declinate. Tutte le offerte di Inventory andranno nel Cestino. - <usetemplate ignoretext="Cambio il mio stato in Non Disponibile" name="okignore" yestext="OK"/> + È stata impostata la modalità Non disponibile. +La chat e gli IM verranno nascosti. Gli IM riceveranno la tua risposta di Non disponibile. Tutte le offerte di teleport verranno rifiutate. Tutte le offerte di Inventario andranno nel Cestino. + <usetemplate ignoretext="Cambio il mio stato sulla modalità Non disponibile" name="okignore" yestext="OK"/> </notification> <notification name="JoinedTooManyGroupsMember"> - Hai raggiunto il limite massimo di gruppi. Devi lasciare un gruppo prima di poterti unire a questo, oppure puoi declinare questa offerta. -[NAME] ti ha invitato ad unirti al gruppo come membro. -[INVITE] + Hai raggiunto il numero massimo di gruppi. Per favore abbandona almeno un gruppo prima di aderire a questo, oppure declina l'offerta. +[NAME] ti invita ad aderire ad un gruppo. <usetemplate name="okcancelbuttons" notext="Declino" yestext="Unisciti"/> </notification> + <notification name="JoinedTooManyGroups"> + Hai raggiunto il numero massimo di gruppi. Per favore abbandona almeno un gruppo prima di aderire o crearne uno nuovo. + <usetemplate name="okbutton" yestext="OK"/> + </notification> <notification name="KickUser"> - Espelli questo utente con quale messaggio? + Espelli questo residente con quale messaggio? <form name="form"> <input name="message"> Un amministratore ti ha disconnesso. @@ -1344,7 +1444,7 @@ La Chat e gli IM verranno nascosti. Gli IM riceveranno la tua risposta di Non Di </form> </notification> <notification name="FreezeUser"> - Immobilizza questo utente con quale messaggio? + Congela questo residente con quale messaggio? <form name="form"> <input name="message"> Sei stato immobilizzato. Non puoi muoverti o usare la chat. Un amministratore ti contatterà con un messaggio (IM). @@ -1354,7 +1454,7 @@ La Chat e gli IM verranno nascosti. Gli IM riceveranno la tua risposta di Non Di </form> </notification> <notification name="UnFreezeUser"> - Smobilizza questo utente con quale messaggio? + Scongela questo residente con quale messaggio? <form name="form"> <input name="message"> Non sei più immobilizzato. @@ -1374,7 +1474,7 @@ La Chat e gli IM verranno nascosti. Gli IM riceveranno la tua risposta di Non Di </form> </notification> <notification name="OfferTeleportFromGod"> - Vuoi trasportare divinamente l'utente nel posto dove sei? + Chiedere, in qualità di Admin, al residente di raggiungerti? <form name="form"> <input name="message"> Raggiungimi in [REGION] @@ -1384,16 +1484,20 @@ La Chat e gli IM verranno nascosti. Gli IM riceveranno la tua risposta di Non Di </form> </notification> <notification name="TeleportFromLandmark"> - Confermi di volerti teleportare? - <usetemplate ignoretext="Conferma il teleport verso un Landmark" name="okcancelignore" notext="Annulla" yestext="Teleportati"/> + Sei sicuro di volere il teleport a <nolink>[LOCATION]</nolink>? + <usetemplate ignoretext="Conferma il teleport verso un punto di riferimento" name="okcancelignore" notext="Annulla" yestext="Teleportati"/> </notification> <notification name="TeleportToPick"> Teleport a [PICK]? - <usetemplate ignoretext="Conferma il teleport verso l'ubicazione nei Posti Consigliati" name="okcancelignore" notext="Annulla" yestext="Teleport"/> + <usetemplate ignoretext="Conferma che voglio il teleport verso l'ubicazione nei Luoghi preferiti" name="okcancelignore" notext="Annulla" yestext="Teleport"/> </notification> <notification name="TeleportToClassified"> Teleport a [CLASSIFIED]? - <usetemplate ignoretext="Confermo il teleport verso questa ubicazione negli Annunci" name="okcancelignore" notext="Cancella" yestext="Teleport"/> + <usetemplate ignoretext="Conferma il teleport verso questa posizione negli annunci" name="okcancelignore" notext="Annulla" yestext="Teleport"/> + </notification> + <notification name="TeleportToHistoryEntry"> + Teleport a [HISTORY_ENTRY]? + <usetemplate ignoretext="Conferma il teleport verso un luogo che compare nella cronologia" name="okcancelignore" notext="Annulla" yestext="Teleport"/> </notification> <notification label="Manda un messaggio a tutti nella tua proprietà " name="MessageEstate"> Scrivi un annuncio breve che verrà mandato a tutti quelli che sono in questo momento nella tua proprietà . @@ -1404,11 +1508,11 @@ La Chat e gli IM verranno nascosti. Gli IM riceveranno la tua risposta di Non Di </form> </notification> <notification label="Cambia la tipologia della proprietà Linden" name="ChangeLindenEstate"> - Stai per cambiare la tipologia della proprietà Linden (mainland, griglia minorenni, orientamento, ecc.). + Stai per apportare modifiche ad una proprietà che appartiene a Linden (continente, teen grid, orientamento e così via). -Questo è ESTREMAMENTE PERICOLOSO perchè può cambiare radicalmente l'esperienza degli utenti. Sulla mainland cambierà migliaia di regioni e produrrà seri problemi ai vari server. +Questa è un'operazione da effettuare con molta cautela, in quanto può incidere profondamente sulla vita dei residenti in Second Life. Sul continente, l'azione modificherà migliaia di regioni e creerà un grosso carico sul server. -Confermi? +Vuoi procedere? <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/> </notification> <notification label="Cambia la tipologia Linden di accesso alla proprietà " name="ChangeLindenAccess"> @@ -1471,21 +1575,24 @@ Vuoi andare alla Knowledge Base per ulteriori informazioni sulle categorie di ac <url name="url"> http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/it </url> - <usetemplate ignoretext="Non posso entrare in questa Regione, a causa delle restrizioni sulla Categoria di Accesso" name="okcancelignore" notext="Chiudi" yestext="Vai alla Knowledge Base"/> + <usetemplate ignoretext="Non posso entrare in questa regione a causa delle restrizioni della categoria di accesso" name="okcancelignore" notext="Chiudi" yestext="Vai alla Knowledge Base"/> </notification> <notification name="RegionEntryAccessBlocked_Notify"> Non sei ammesso in questa regione a causa della tua categoria d'accesso. </notification> <notification name="RegionEntryAccessBlocked_Change"> - Non ti è consentito entrare in quella Regione a causa della tua Categoria di Accesso impostata nelle Preferenze. + Non ti è consentito entrare in quella regione a causa della categoria di accesso impostata nelle preferenze. -Puoi cliccare su 'Cambia Preferenze' per alzare la tua preferenza di Categoria di Accesso e quindi riuscire ad entrare. Sarai in grado di ricercare e di accedere da adesso in poi contenuto [REGIONMATURITY]. Se più tardi volessi cambiare di nuovo le tue impostazioni, vai su Me > Preferenze > Generali. +Per entrare nella regione, dovrai modificare la tua categoria di accesso. Ciò ti consentirà inoltre di effettuare ricerche di contenuti di categoria [REGIONMATURITY]. Per annullare le modifiche in un secondo momento, vai a Io > Preferenze > Generali. <form name="form"> - <button name="OK" text="Cambia Preferenza"/> + <button name="OK" text="Cambia preferenza"/> <button default="true" name="Cancel" text="Chiudi"/> - <ignore name="ignore" text="Le mie preferenze attivate nel Rating (Classificazione) prevengono il mio ingresso in una Regione"/> + <ignore name="ignore" text="La categoria di accesso impostata mi impedisce di entrare in una regione"/> </form> </notification> + <notification name="PreferredMaturityChanged"> + La tua categoria di accesso attuale è [RATING]. + </notification> <notification name="LandClaimAccessBlocked"> Non puoi prendere possesso di questo terreno a causa della tua categoria di accesso. Questo può essere dovuto ad una mancanza di informazioni valide che confermino la tua età . @@ -1499,16 +1606,16 @@ Vuoi andare alla Knowledge Base per maggiori informazioni sulle categorie di acc <url name="url"> http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/it </url> - <usetemplate ignoretext="Non posso richiedere questo Terreno, a causa delle restrizioni sulla Categoria di Accesso" name="okcancelignore" notext="Chiudi" yestext="Vai alla Knowledge Base"/> + <usetemplate ignoretext="Non posso richiedere questo terreno a causa delle restrizioni della categoria di accesso" name="okcancelignore" notext="Chiudi" yestext="Vai alla Knowledge Base"/> </notification> <notification name="LandClaimAccessBlocked_Notify"> Non puoi prendere possesso di questa terra a causa della tua categoria di accesso. </notification> <notification name="LandClaimAccessBlocked_Change"> - Non puoi richiedere questo Terreno a causa delle tue preferenze di Categoria di Accesso. + Non puoi richiedere questo terreno a causa della tua categoria di accesso. -Puoi cliccare su 'Cambia Preferenze' per alzare la tua preferenza di Categoria di Accesso e quindi riuscire ad entrare. Sarai in grado di ricercare e di accedere da adesso in poi contenuto [REGIONMATURITY]. Se più tardi volessi cambiare di nuovo le tue impostazioni, vai su Me > Preferenze > Generali. - <usetemplate ignoretext="Le mie preferenze di Categoria di Accesso mi impediscono di chiedere questo Terreno" name="okcancelignore" notext="Chiudi" yestext="Cambia le preferenze"/> +Puoi cliccare su Cambia preferenze per modificare la categoria di accesso e quindi riuscire ad entrare. Da adesso potrai accedere ai contenuti [REGIONMATURITY] ed effettuare ricerche in questa categoria. Se in seguito tu volessi cambiare di nuovo le tue impostazioni, apri la finestra di dialogo da Io > Preferenze > Generale. + <usetemplate ignoretext="Le mie preferenze di categoria di accesso mi impediscono di richiedere terreno" name="okcancelignore" notext="Chiudi" yestext="Cambia le preferenze"/> </notification> <notification name="LandBuyAccessBlocked"> Non puoi acquistare questo terreno a causa della tua categoria di accesso. Questo può essere dovuto ad una mancanza di informazioni valide che confermino la tua età . @@ -1523,16 +1630,16 @@ Vuoi andare alla Knowledge Base per maggiori informazioni sulle categorie di acc <url name="url"> http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/it </url> - <usetemplate ignoretext="Non posso comprare questo Terreno , a causa delle restrizioni della Categoria di Accesso" name="okcancelignore" notext="Chiudi" yestext="Vai alla Knowledge Base"/> + <usetemplate ignoretext="Non posso acquistare questo terreno a causa delle restrizioni della categoria di accesso" name="okcancelignore" notext="Chiudi" yestext="Vai alla Knowledge Base"/> </notification> <notification name="LandBuyAccessBlocked_Notify"> Non puoi acquistare questa land a causa della tua categoria di accesso. </notification> <notification name="LandBuyAccessBlocked_Change"> - Non puoi comprare questo Terreno a causa delle tue preferenze di Categoria di Accesso. + Non puoi acquistare questo terreno a causa della tua categoria di accesso. -Puoi cliccare su 'Cambia Preferenze' per alzare la tua preferenza di Categoria di Accesso e quindi riuscire ad entrare. Sarai in grado di ricercare e di accedere da adesso in poi contenuto [REGIONMATURITY]. Se più tardi volessi cambiare di nuovo le tue impostazioni, vai su Me > Preferenze > Generali. - <usetemplate ignoretext="Le mie Preferenze di Accesso mi impediscono l'acquisto di questo Terreno" name="okcancelignore" notext="Chiudi" yestext="Cambia le preferenze"/> +Puoi cliccare su Cambia preferenze per modificare la categoria di accesso e quindi riuscire ad entrare. Da adesso potrai accedere ai contenuti [REGIONMATURITY] ed effettuare ricerche in questa categoria. Se in seguito tu volessi cambiare di nuovo le tue impostazioni, apri la finestra di dialogo da Io > Preferenze > Generale. + <usetemplate ignoretext="Le mie Preferenze di accesso mi impediscono di acquistare terreno" name="okcancelignore" notext="Chiudi" yestext="Cambia le preferenze"/> </notification> <notification name="TooManyPrimsSelected"> Hai selezionato troppi prim. Seleziona non più di [MAX_PRIM_COUNT] prim e riprova @@ -1567,11 +1674,11 @@ Pubblica questo annuncio adesso per [AMOUNT]L$? <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/> </notification> <notification name="SetClassifiedMature"> - Queste inserzioni includono contenuto Mature? + Queste inserzioni includono contenuti di tipo Moderato? <usetemplate canceltext="Annulla" name="yesnocancelbuttons" notext="No" yestext="Si"/> </notification> <notification name="SetGroupMature"> - Questo gruppo include contenuto Mature? + Questo gruppo include contenuti di tipo Moderato? <usetemplate canceltext="Annulla" name="yesnocancelbuttons" notext="No" yestext="Si"/> </notification> <notification label="Conferma il riavvio" name="ConfirmRestart"> @@ -1586,12 +1693,14 @@ Pubblica questo annuncio adesso per [AMOUNT]L$? <button name="Cancel" text="Annulla"/> </form> </notification> - <notification label="Cambiato il contenuto Mature" name="RegionMaturityChange"> - La classificazione del contenuto Mature di questa regione è stata aggiornata. -Può essere necessario un po' di tempo prima che questo cambiamento sia visibile sulle mappe. + <notification label="Cambiato il contenuto Moderato" name="RegionMaturityChange"> + La classificazione di questa regione è stata aggiornata. +Un periodo di tempo è necessario prima che la modifica venga integrata nella mappa. + +Per accedere a regioni per adulti, i residenti devono avere un Account verificato, mediante verifica dell'età oppure mediante verifica della modalità di pagamento. </notification> <notification label="Versione voice non compatibile" name="VoiceVersionMismatch"> - Questa versione di [APP_NAME] non è compatibile con le capacità di Chat Voice in questa regione. Per poter far funzionare correttamente la Chat Voice devi aggiornare [APP_NAME]. + Questa versione di [APP_NAME] non è compatibile con la funzionalità di chat vocale in questa regione. Affinché la chat vocale funzioni correttamente, dovrai aggiornare [APP_NAME]. </notification> <notification label="Impossibile comprare oggetti" name="BuyObjectOneOwner"> Impossibile comprare oggetti da proprietari diversi nello stesso momento. @@ -1680,36 +1789,36 @@ Hai aggiornato l'ubicazione di questo preferito ma gli altri dettagli conse Questi elementi verranno trasferiti nel tuo inventario, ma non copiati. Trasferisci gli elementi nell'inventario? - <usetemplate ignoretext="Avvertimi quando rimuovo gli elementi 'no-copy' da un oggetto" name="okcancelignore" notext="Annulla" yestext="OK"/> + <usetemplate ignoretext="Avvertimi quando tento di rimuovore elementi per i quali non è consentita la copia da un oggetto" name="okcancelignore" notext="Annulla" yestext="OK"/> </notification> <notification name="MoveInventoryFromScriptedObject"> Hai selezionato elementi dell'inventario non copiabili. Questi elementi verranno trasferiti nel tuo inventario, non verranno copiati. Dato che questo oggetto è scriptato, il trasferimento di questi elementi nel tuo inventario potrebbe causare un malfunzionamento degli script. Trasferisci gli elementi nell'inventario? - <usetemplate ignoretext="Avvertimi se la rimozione di elementi 'no-copy' possono danneggiare un oggetto scriptato" name="okcancelignore" notext="Annulla" yestext="OK"/> + <usetemplate ignoretext="Avvertimi se tento di rimuovore di elementi per i quali non è consentita la copia e che potrebbero danneggiare un oggetto scriptato" name="okcancelignore" notext="Annulla" yestext="OK"/> </notification> <notification name="ClickActionNotPayable"> - Attenzione: E' stata impostata l'azione 'Paga Oggetto', ma funzionerà soltanto se inserisci uno script con un evento money(). + Attenzione: l'azione Paga oggetto è stata impostata, ma funzionerà soltanto se inserisci uno script con un evento money(). <form name="form"> - <ignore name="ignore" text="Ho impostato l'azione 'Paga Oggetto' costruendo un oggetto senza uno script money()"/> + <ignore name="ignore" text="Ho impostato l'azione Paga oggetto costruendo un oggetto senza uno script money()"/> </form> </notification> <notification name="OpenObjectCannotCopy"> Non ci sono elementi in questo oggetto che tu possa copiare. </notification> <notification name="WebLaunchAccountHistory"> - Vai su [http://secondlife.com/account/ Dashboard] per vedere la storia delle tue Transazioni? - <usetemplate ignoretext="Lancia il browser per vedere la storia del mio account" name="okcancelignore" notext="Annulla" yestext="Vai alla pagina"/> + Vai al [http://secondlife.com/account/ Dashboard] per vedere la cronologia del tuo account? + <usetemplate ignoretext="Lancia il browser per vedere la cronologia del mio account" name="okcancelignore" notext="Annulla" yestext="Vai alla pagina"/> </notification> <notification name="ConfirmQuit"> Confermi di voler uscire? - <usetemplate ignoretext="Conferma Uscita" name="okcancelignore" notext="Non Uscire" yestext="Esci"/> + <usetemplate ignoretext="Conferma prima di uscire" name="okcancelignore" notext="Non uscire" yestext="Esci"/> </notification> <notification name="HelpReportAbuseEmailLL"> - Usa questo strumento per segnalare violazioni del [http://secondlife.com/corporate/tos.php Terms of Service] e [http://secondlife.com/corporate/cs.php Community Standards]. + Usa questo strumento per segnalare violazioni a [http://secondlife.com/corporate/tos.php Terms of Service] e [http://secondlife.com/corporate/cs.php Community Standards]. -Tutti gli abusi segnalati verranno investigati e risolti. Puoi verificare lo stato delle segnalazione leggendo [http://secondlife.com/support/incidentreport.php Incident Report]. +Ogni abuso segnalato verrà esaminato e risolto. </notification> <notification name="HelpReportAbuseSelectCategory"> Scegli una categoria per questa segnalazione di abuso. @@ -1733,15 +1842,15 @@ Devi essere il più specifico possibile, includendo i nomi e i dettagli dell&apo Inserendo una descrizione accurata ci aiuti a gestire ed elaborare le segnalazioni di abuso. </notification> <notification name="HelpReportAbuseContainsCopyright"> - Gentile Residente, + Gentile residente, -Sembra che tu stia segnalando una violazione di proprietà intellettuale. Cerca di essere sicuro che la tua segnalazione stia riportando correttamente: +Ci risulta che tu stia segnalando una violazione di proprietà intellettuale. Per segnalare correttamente la violazione: -(1) Il processo di Abuso. Puoi inviare una segnalazione di abuso se ritieni che un residente stia sfruttando il sistema di permessi di [SECOND_LIFE], per esempio usando CopyBot o simili strumenti di copia, per rubare i diritti della proprietà intellettuale. L'Ufficio Abusi investigherà e deciderà adeguate azioni disciplinari per comportamenti che violano i [http://secondlife.com/corporate/tos.php Termini di Servizio] di [SECOND_LIFE] oppure i [http://secondlife.com/corporate/cs.php Standard di Comunità ]. Si tenga però presente che l'ufficio Abusi non gestisce e non risponde alle richieste di rimozione di contentuo da [SECOND_LIFE]. +(1) Definizione di abuso. Puoi inviare una segnalazione di abuso se ritieni che un residente stia sfruttando il sistema di permessi di [SECOND_LIFE], per esempio usando CopyBot o simili strumenti di copia, per rubare i diritti di proprietà intellettuale. L'Ufficio abusi investigherà e deciderà adeguate azioni disciplinari per comportamenti che violano i [http://secondlife.com/corporate/tos.php Termini del servizio] di [SECOND_LIFE] oppure gli [http://secondlife.com/corporate/cs.php Standard della comunità ]. Tieni comunque presente che l'Ufficio abusi non gestisce e non risponde alle richieste di rimozione di contenuti da [SECOND_LIFE]. -(2) Il processo di rimozione DMCA o processo di rimozione dei contenuti. Per richiedere la rimozione di contenuto da [SECOND_LIFE], DEVI compilare una denuncia valid di furto come definito nella nostra [http://secondlife.com/corporate/dmca.php Policy DMCA]. +(2) DMCA o rimozione di contenuti. Per richiedere la rimozione di contenuti da [SECOND_LIFE], devi compilare una denuncia valida di violazione come definito nelle nostra [http://secondlife.com/corporate/dmca.php Regole DMCA] (leggi sul copyright). -Se desideri egualmente continuare con il processo di Abuso, chiudi questa finestra e completa la compilazione della segnalazione. Puoi specificare la categoria specifica 'CopyBot o Sfruttamento Permessi'. +Per continuare con il procedimento di abuso, chiudi questa finestra e completa la compilazione della segnalazione. È possibile che dovrai specificare la categoria CopyBot o Sfruttamento dei diritti. Grazie, @@ -1755,7 +1864,7 @@ Linden Lab C'è già un oggetto indossato in questo punto del corpo. Vuoi sostituirlo con l'oggetto selezionato? <form name="form"> - <ignore name="ignore" save_option="true" text="Sostituisci un preesistente attachment con l'elemento selezionato"/> + <ignore name="ignore" save_option="true" text="Sostituisci un pezzo collegato con l'elemento selezionato"/> <button ignore="Replace Automatically" name="Yes" text="OK"/> <button ignore="Never Replace" name="No" text="Annulla"/> </form> @@ -1765,21 +1874,21 @@ Vuoi sostituirlo con l'oggetto selezionato? Desideri abbandonare la modalità 'Occupato' prima di completare questa transazione? <form name="form"> - <ignore name="ignore" save_option="true" text="Sto per pagare una persona o un oggetto mentro sono Non Disponibile"/> + <ignore name="ignore" save_option="true" text="Sto per pagare una persona o un oggetto mentro sono in modalià Non disponibile"/> <button ignore="Always leave Busy Mode" name="Yes" text="OK"/> <button ignore="Never leave Busy Mode" name="No" text="Abbandona"/> </form> </notification> <notification name="ConfirmDeleteProtectedCategory"> - La cartella '[FOLDERNAME]' è una cartella di sistema. La cancellazione delle cartelle di sistema può creare instabilità . Sei sicuro di volerla cancellare? - <usetemplate ignoretext="Conferma prima di cancellare una cartella di sistema" name="okcancelignore" notext="Cancella" yestext="OK"/> + La cartella '[FOLDERNAME]' è una cartella di sistema. L'eliminazione di cartelle di sistema può creare instabilità . Sei sicuro di volerla eliminare? + <usetemplate ignoretext="Chiedi conferma prima di eliminare una cartella di sistema" name="okcancelignore" notext="Annulla" yestext="OK"/> </notification> <notification name="ConfirmEmptyTrash"> - Vuoi veramente cancellare permanentemente il contenuto del tuo Cestino? - <usetemplate ignoretext="Conferma lo svuotamento del contenuto del Cestino" name="okcancelignore" notext="Annulla" yestext="OK"/> + Vuoi veramente eliminare in modo permanente il contenuto del tuo Cestino? + <usetemplate ignoretext="Conferma prima di svuotare la cartella del Cestino inventario" name="okcancelignore" notext="Annulla" yestext="OK"/> </notification> <notification name="ConfirmClearBrowserCache"> - Vuoi veramente cancellare la storia dei viaggi, web e delle ricerche fatte? + Vuoi veramente eliminare la cronologia viaggi, web e ricerche fatte? <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/> </notification> <notification name="ConfirmClearCookies"> @@ -1791,14 +1900,14 @@ Desideri abbandonare la modalità 'Occupato' prima di completare quest <usetemplate name="okcancelbuttons" notext="Annulla" yestext="Si"/> </notification> <notification name="ConfirmEmptyLostAndFound"> - Vuoi veramente cancellare permanentemente il contenuto dei tuoi Persi e Ritrovati? - <usetemplate ignoretext="Conferma lo svuotamento della cartella Persi e Ritrovati" name="okcancelignore" notext="No" yestext="Si"/> + Vuoi veramente eliminare in modo definitivo il contenuto dei tuoi Oggetti smarriti? + <usetemplate ignoretext="Conferma prima di svuotare della cartella Oggetti smarriti" name="okcancelignore" notext="No" yestext="Si"/> </notification> <notification name="CopySLURL"> Lo SLurl seguente è stato copiato negli Appunti: [SLURL] -Inseriscilo in una pagina web per dare ad altri un accesso facile a questa ubicazione, o provala incollandola nella barra indirizzo di un browser web. +Inseriscilo in una pagina web per dare ad altri un accesso facile a questa ubicazione, o provala incollandola nella barra degli indirizzi di un browser web. <form name="form"> <ignore name="ignore" text="Lo SLurl è stato copiato negli Appunti"/> </form> @@ -1866,18 +1975,18 @@ Inseriscilo in una pagina web per dare ad altri un accesso facile a questa ubica <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="Cannot_Purchase_an_Attachment"> - Non puoi comprare un oggetto mentre è indossato. + Non puoi comprare un oggetto mentre è unito. </notification> <notification label="Informazioni sulle richieste per il permesso di addebito" name="DebitPermissionDetails"> Accettare questa richiesta da allo script il permesso continuativo di prendere Linden dollar (L$) dal tuo account. Per revocare questo permesso, il proprietario dell'oggetto deve cancellare l'oggetto oppure reimpostare gli script nell'oggetto. <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="AutoWearNewClothing"> - Vuoi indossare automaticamente gli oggetti che stai per creare? - <usetemplate ignoretext="Indossa gli abiti che creo mentre modifico il Mio Aspetto" name="okcancelignore" notext="No" yestext="Si"/> + Vuoi indossare automaticamente gli indumenti che stai per creare? + <usetemplate ignoretext="Indossare gli abiti che creo mentre modifico il mio aspetto" name="okcancelignore" notext="No" yestext="Si"/> </notification> <notification name="NotAgeVerified"> - Devi avere l'Età Verificata per visitare quest'area. Vuoi andare sul sito [SECOND_LIFE] per verificare la tua età ? + Per entrare in questa zona, devi avere eseguito la verifica dell'età . Vuoi andare sul sito di [SECOND_LIFE] per verificare la tua età ? [_URL] <url name="url" option="0"> @@ -1886,13 +1995,13 @@ Inseriscilo in una pagina web per dare ad altri un accesso facile a questa ubica <usetemplate ignoretext="Non ho verificato la mia età " name="okcancelignore" notext="No" yestext="Si"/> </notification> <notification name="Cannot enter parcel: no payment info on file"> - Devi avere le Informazioni di Pagamento registrate per poter visitare quest'area. Vuoi andare sul sito di [SECOND_LIFE] ed impostarle? + Per poter visitare questa zona devi avere devi aver fornito informazioni di pagamento a Linden Lab. Vuoi andare sul sito di [SECOND_LIFE] ed impostarle? [_URL] <url name="url" option="0"> https://secondlife.com/account/index.php?lang=it </url> - <usetemplate ignoretext="Manca la registrazione delle Informazioni di Pagamento" name="okcancelignore" notext="No" yestext="Si"/> + <usetemplate ignoretext="Manca la registrazione delle informazioni di pagamento" name="okcancelignore" notext="No" yestext="Si"/> </notification> <notification name="MissingString"> La stringa [STRING_NAME] non è presente in strings.xml @@ -1900,6 +2009,9 @@ Inseriscilo in una pagina web per dare ad altri un accesso facile a questa ubica <notification name="SystemMessageTip"> [MESSAGE] </notification> + <notification name="IMSystemMessageTip"> + [MESSAGE] + </notification> <notification name="Cancelled"> Annullato </notification> @@ -1922,12 +2034,17 @@ Inseriscilo in una pagina web per dare ad altri un accesso facile a questa ubica [FIRST] [LAST] è Offline </notification> <notification name="AddSelfFriend"> - Anche se sei molto piacevole, non puoi aggiungerti come amicizia. + Anche se sei molto simpatico, non puoi aggiungere te stesso all'elenco degli amici. </notification> <notification name="UploadingAuctionSnapshot"> Sto importando le fotografie per l'uso inworld e per il web... (Durata circa 5 minuti.) </notification> + <notification name="UploadConfirmation"> + Il costo per il caricamento è di L$ [AMOUNT]. +Continuare? + <usetemplate name="okcancelbuttons" notext="Annulla" yestext="Carica nel server"/> + </notification> <notification name="UploadPayment"> Hai pagato [AMOUNT]L$ per il caricamento. </notification> @@ -1941,11 +2058,10 @@ Inseriscilo in una pagina web per dare ad altri un accesso facile a questa ubica Terrain.raw caricato </notification> <notification name="GestureMissing"> - Manca la Gesture [NAME] dal database. + Manca la gesture [NAME] dal database. </notification> <notification name="UnableToLoadGesture"> Impossibile caricare la gesture [NAME]. -Riprova. </notification> <notification name="LandmarkMissing"> Landmark non trovato nel database. @@ -1954,14 +2070,14 @@ Riprova. Impossibile caricare il Landmark di riferimento. Riprova. </notification> <notification name="CapsKeyOn"> - Hai il Blocco delle Maiuscole attivato. -Questo potrebbe influenzare la tua password. + Hai il blocco delle maiuscole attivato. +Questo potrebbe incidere sulla tua password. </notification> <notification name="NotecardMissing"> Notecard non trovata nel database. </notification> <notification name="NotecardNoPermissions"> - Non hai il permesso di vedere questa notecard. + Non hai il permesso di vedere questo biglietto. </notification> <notification name="RezItemNoPermissions"> Permessi insufficienti per creare un oggetto. @@ -1999,7 +2115,7 @@ Riprova. Riprova. </notification> <notification name="CannotBuyObjectsFromDifferentOwners"> - Puoi comprare oggetti solo da un proprietario per volta. + Puoi acquistare oggetti soltanto da un proprietario per volta. Seleziona solo un oggetto. </notification> <notification name="ObjectNotForSale"> @@ -2012,10 +2128,10 @@ Seleziona solo un oggetto. Esci dalla modalità divina, livello [LEVEL] </notification> <notification name="CopyFailed"> - Non hai i permessi per copiare. + Non hai l'autorizzazione a copiare. </notification> <notification name="InventoryAccepted"> - [NAME] ha ricevuto la tua offerta di Inventory. + [NAME] ha ricevuto la tua offerta di inventario. </notification> <notification name="InventoryDeclined"> [NAME] non ha accettato la tua offerta dall'inventario. @@ -2030,14 +2146,14 @@ Seleziona solo un oggetto. Il tuo biglietto da visita non è stato accettato. </notification> <notification name="TeleportToLandmark"> - Puoi teleportarti alle ubicazioni come '[NAME]' aprendo il pannello Luoghi sul lato destro dello schermo, e quindi selezionare la linguetta Landmarks. -Clicca su un landmark per selezionarlo e quindi clicca 'Teleport' sul fondo del pannello. -(Puoi anche fare doppio-click sul landmark oppure cliccarlo con il tasto destro e scegliere 'Teleport'.) + Puoi teleportarti alle ubicazioni come '[NAME]' aprendo il pannello Luoghi sul lato destro dello schermo, quindi selezionare la scheda Punti di riferimento. +Clicca su un punto di riferimento per selezionarlo, quindi clicca su Teleport sul lato inferiore del pannello. +(Puoi anche fare doppio clic sul punto di riferimento oppure cliccare su di esso con il tasto destro del mouse e scegliere Teleport.) </notification> <notification name="TeleportToPerson"> - Puoi contattare residenti come '[NAME]' aprendo il pannello Persone sul lato destro dello schermo. -Seleziona il residente dalla lista, e clica 'IM' in fondo al pannello. -(Puoi anche fare doppio click sul loro nome nella lista, oppure cliccare con il tasto destro e scegliere 'IM'). + Puoi contattare il residente '[NAME]' aprendo il pannello Persone nel lato destro del tuo schermo. +Seleziona il residente dall'elenco, clicca su 'IM' in basso nel pannello. +(Puoi anche fare doppio clic sul nome nell'elenco oppure fare clic con il pulsante destro del mouse e selezionare 'IM'). </notification> <notification name="CantSelectLandFromMultipleRegions"> Non è possibile selezionare il terreno attraverso i confini del server. @@ -2047,7 +2163,7 @@ Prova a selezionare una parte di terreno più piccola. Alcuni termini della ricerca sono stati esclusi a causa delle restrizioni di contenuto come esposto negli Standard della comunità . </notification> <notification name="NoContentToSearch"> - Seleziona almeno un tipo di contenuto per la ricerca (PG, Mature, o Adult). + Seleziona almeno un tipo di contenuto per la ricerca (Generale, Moderato o Adulti). </notification> <notification name="GroupVote"> [NAME] ha proposto di votare su: @@ -2087,19 +2203,19 @@ Prova a selezionare una parte di terreno più piccola. [NAMES] </notification> <notification name="NoQuickTime"> - Il Software QuickTime di Apple non sembra installato sul tuo computer. -Se vuoi vedere contenuto multimediale sugli appezzamenti che lo supportano devi andare su [http://www.apple.com/quicktime QuickTime site] e installare il Player QuickTime. + Il software QuickTime di Apple sembra non essere installato sul tuo computer. +Se vuoi vedere contenuto multimediale in streaming sui lotti che lo supportano, vai alla pagina [http://www.apple.com/quicktime QuickTime] e installa il Player QuickTime. </notification> <notification name="NoPlugin"> - Nessun Media Plugin è stato trovato per gestire "[MIME_TYPE]" il tipo mime. Il Media di questo tipo non è disponibile. + Non è stato trovato alcun plugin multimediale per gestire il tipo mime [MIME_TYPE]. Il media di questo tipo non è disponibile. </notification> <notification name="MediaPluginFailed"> - Questo Media Plugin non funziona: + Questo plugin multimediale non funziona: [PLUGIN] -Per favore re-installa il plugin o contatta il venditore se continui ad avere questi problemi. +Reinstalla il plugin o contatta il venditore se continui ad avere questi problemi. <form name="form"> - <ignore name="ignore" text="Mancato funzionamento del Media Plugin"/> + <ignore name="ignore" text="Mancato funzionamento del plugin multimediale"/> </form> </notification> <notification name="OwnedObjectsReturned"> @@ -2109,7 +2225,7 @@ Per favore re-installa il plugin o contatta il venditore se continui ad avere qu Gli oggetti selezionati sul terreno che è di proprietà di [FIRST] [LAST] sono stati restituiti nel suo inventario. </notification> <notification name="OtherObjectsReturned2"> - Gli oggetti selezionati sul terreno di proprietà del residente '[NAME]' sono stati restituiti al loro proprietario. + Sono stati restituiti al proprietario gli oggetti selezionati sul lotto nella terra di proprietà del residente '[NAME]'. </notification> <notification name="GroupObjectsReturned"> Gli oggetti selezionati sul terreno e condivisi con il gruppo [GROUPNAME] sono stati restituiti nell'inventario dei propietari. @@ -2121,24 +2237,24 @@ Gli oggetti non trasferibili che erano stati ceduti al gruppo sono stati cancell </notification> <notification name="ServerObjectMessage"> Messaggio da [NAME]: -[MSG] +<nolink>[MSG]</nolink> </notification> <notification name="NotSafe"> - Questo terreno è abilitato ai Danni da combattimento. -Qui potresti ricevere ferite. Se dovessi morire verrai teleportato a casa tua. + Su questo terreno sono abilitati i danni. +Qui potresti essere ferito. Se dovessi morire verrai teleportato a casa tua. </notification> <notification name="NoFly"> - Quest'are ha il volo disabilitato. + In questa zona è proibito il volo. Qui non puoi volare. </notification> <notification name="PushRestricted"> - Quest'area non consente le spinte. Non puoi spingere gli altri a meno che tu non sia il proprietario del terreno. + Questa zona non consente le spinte. Non puoi spingere gli altri a meno che tu non sia il proprietario del terreno. </notification> <notification name="NoVoice"> - Quest'area ha la chat voice disabilitata. Non puoi sentire nessuno parlare. + Questa zona ha la chat vocale disattivata. Non puoi sentire nessuno parlare. </notification> <notification name="NoBuild"> - Quest'area ha il building disabilitato. Qui non puoi costruire o rezzare oggetti. + In questa zona è proibita la costruzione. Qui non puoi costruire né rezzare oggetti. </notification> <notification name="ScriptsStopped"> Un amministratore ha temporaneamente disabilitato gli script in questa regione. @@ -2149,10 +2265,10 @@ Qui non puoi volare. <notification name="NoOutsideScripts"> Questo terreno non consente script esterni. -Qui funzinano solo gli script del proprietario del terreno. +Qui funzionano soltanto gli script del proprietario del terreno. </notification> <notification name="ClaimPublicLand"> - Puoi solo chiedere terreni pubblici nella regione in cui sei posizionato. + Puoi solo richiedere terreni pubblici nella regione in cui sei posizionato. </notification> <notification name="RegionTPAccessBlocked"> Non puoi entrare in quella regione a causa della tua categoria di accesso. Può essere necessario validare l'età e/o installare l'ultima versione del programma. @@ -2230,16 +2346,7 @@ Riprova tra qualche istante. Non è stato trovato nessun territorio valido. </notification> <notification name="ObjectGiveItem"> - L'oggetto [OBJECTFROMNAME] posseduto da [NAME_SLURL] ti ha dato [OBJECTTYPE]: -[ITEM_SLURL] - <form name="form"> - <button name="Keep" text="Prendi"/> - <button name="Discard" text="Rifiuta"/> - <button name="Mute" text="Blocca"/> - </form> - </notification> - <notification name="ObjectGiveItemUnknownUser"> - Un oggetto di nome [OBJECTFROMNAME] posseduto da un residente sconosciuto ti ha dato [OBJECTTYPE]: + Un oggetto denominato [OBJECTFROMNAME] di proprietà di [NAME_SLURL] ti ha dato questo [OBJECTTYPE]: [ITEM_SLURL] <form name="form"> <button name="Keep" text="Prendi"/> @@ -2248,12 +2355,12 @@ Riprova tra qualche istante. </form> </notification> <notification name="UserGiveItem"> - [NAME_SLURL] ti ha dato [OBJECTTYPE]: + [NAME_SLURL] ti ha dato questo [OBJECTTYPE]: [ITEM_SLURL] <form name="form"> - <button name="Keep" text="Prendi"/> <button name="Show" text="Mostra"/> <button name="Discard" text="Rifiuta"/> + <button name="Mute" text="Blocca"/> </form> </notification> <notification name="GodMessage"> @@ -2270,14 +2377,17 @@ Riprova tra qualche istante. </form> </notification> <notification name="TeleportOffered"> - [NAME] ti ha offerto di teleportarti nella sua ubicazione: + [NAME_SLURL] ti ha offerto il teleport alla sua ubicazione: -[MESSAGE] +[MESSAGE] - [MATURITY_STR] <icon>[MATURITY_ICON]</icon> <form name="form"> <button name="Teleport" text="Teleport"/> <button name="Cancel" text="Cancella"/> </form> </notification> + <notification name="TeleportOfferSent"> + Offerta di Teleport inviata a [TO_NAME] + </notification> <notification name="GotoURL"> [MESSAGE] [URL] @@ -2287,11 +2397,11 @@ Riprova tra qualche istante. </form> </notification> <notification name="OfferFriendship"> - [NAME] ti ha offerto la sua amicizia. + [NAME_SLURL] ti ha offerto di diventare amici. [MESSAGE] -(Di default, potrete vedervi reciprocamente online.) +(L'impostazione predefinita consente a ciascuno di vedere se l'altro è online.) <form name="form"> <button name="Accept" text="Accetta"/> <button name="Decline" text="Rifiuta"/> @@ -2315,22 +2425,27 @@ Riprova tra qualche istante. <notification name="FriendshipDeclined"> [NAME] ha rifiutato la tua offerta di amicizia. </notification> + <notification name="FriendshipAcceptedByMe"> + Offerta di amicizia accettata. + </notification> + <notification name="FriendshipDeclinedByMe"> + Offerta di amicizia rifiutata. + </notification> <notification name="OfferCallingCard"> - [FIRST] [LAST] ti ha offerto il suo biglietto da visita. -Questo aggiungerà un segnalibro nel tuo inventario. -in modo da poter rapidamente inviargli un IM al residente. + [FIRST] [LAST] ti offre il suo biglietto da visita. +Questo sarà aggiunto nel tuo inventario come segnalibro per consentirti di inviare rapidamente messaggi IM a questo residente. <form name="form"> <button name="Accept" text="Accetta"/> <button name="Decline" text="Rifiuta"/> </form> </notification> <notification name="RegionRestartMinutes"> - Questa regione farà il restart fra [MINUTES] minuti. -Se rimani qui verrai disconnesso. + Questa regione verrà riavviata fra [MINUTES] minuti. +Se rimani qui verrai scollegato da Second Life. </notification> <notification name="RegionRestartSeconds"> - Questa regione farà il restart fra [SECONDS] secondi. -Se rimani qui verrai disconnesso. + Questa regione verrà riavviata fra [SECONDS] secondi. +Se rimani qui verrai scollegato da Second Life. </notification> <notification name="LoadWebPage"> Caricare pagina web [URL]? @@ -2349,6 +2464,9 @@ Dall'oggetto: [OBJECTNAME], di: [NAME]? <notification name="FailedToFindWearable"> Impossibile trovare [TYPE] chiamato [DESC] nel database. </notification> + <notification name="ShareToWebFailed"> + Caricamento dell'immagine su Web non riuscita. + </notification> <notification name="InvalidWearable"> L'elemento che stai tentando di indossare usa delle caratteristiche che il tuo viewer non può leggere. Aggiorna la versione di [APP_NAME] per poterlo indossare. </notification> @@ -2367,9 +2485,9 @@ Va bene? Un oggetto di nome '[OBJECTNAME]', posseduto da '[NAME]' vorrebbe: [QUESTIONS] -Se non ti fidi di questo oggetto e del suo creatore dovresti declinare la richiesta. +Se non ti fidi di questo oggetto e del suo ideatore, dovresti rifiutare la richiesta. -Consenti questa richiesta? +Concedi questa richiesta? <form name="form"> <button name="Grant" text="Accetta"/> <button name="Deny" text="Nega"/> @@ -2390,44 +2508,12 @@ Consenti questa richiesta? <button name="Ignore" text="Ignora"/> </form> </notification> - <notification name="ScriptToast"> - [FIRST] [LAST]'s '[TITLE]' richiede il contributo dell'utente. - <form name="form"> - <button name="Open" text="Apri il Dialog"/> - <button name="Ignore" text="Ignora"/> - <button name="Block" text="Blocca"/> - </form> - </notification> - <notification name="FirstBalanceIncrease"> - Hai appena ricevuto [AMOUNT]L$. -Il tuo saldo in L$ è mostrato in alto a destra. - </notification> - <notification name="FirstBalanceDecrease"> - Hai appena pagato [AMOUNT]L$. -Il tuo saldo in L$ è mostrato in alto a destra. - </notification> <notification name="BuyLindenDollarSuccess"> - Grazie per il pagamento! + Grazie per aver inviato il pagamento. -Il tuo saldo in L$ sarà aggiornato al termine dell'elaborazione. Se l'elaborazione dovesse impiegare più di 20 minuti, la transazione verrà annullata. In quel caso l'ammontare dell'acquisto verrà rimborsato nel tuo saldo in US$. +Il tuo saldo in L$ sarà aggiornato al termine dell'elaborazione. Se l'elaborazione dovesse impiegare più di 20 minuti, la transazione verrà annullata. In quel caso l'ammontare dell'acquisto verrà accreditato sul tuo saldo in US$. -Lo stato del tuo pagamento potrà essere controllato nella pagina della Storia delle tue Transazioni su [http://secondlife.com/account/ Pannello di Controllo] - </notification> - <notification name="FirstSit"> - Sei seduto. -Usa le frecce (oppure AWSD) per guardarti intorno. -Clicca il bottone 'Alzati' per alzarti. - </notification> - <notification name="FirstMap"> - Clicca e trascina la mappa per guardare attorno. -Fai doppio click per teleportarti. -Usa i controlli sulla destra per trovare cose e visualizzare sfondi differenti. - </notification> - <notification name="FirstBuild"> - Hai aperto gli Strumenti di Build. Ogni oggetto attorno a te è stato costruito con questi strumenti. - </notification> - <notification name="FirstTeleport"> - Puoi teleportarti solo in certe aree di questa regione. La freccia indica la tua destinazione. Clicca sulla freccia per farla sparire. +Potrai controllare lo stato del pagamento nella pagina della cronologia delle transazioni nel tuo [http://secondlife.com/account/ Dashboard] </notification> <notification name="FirstOverrideKeys"> I tuoi movimenti della tastiera vengono ora gestiti da un oggetto. @@ -2435,42 +2521,17 @@ Prova i tasti freccia o AWSD per vedere quello che fanno. Alcuni oggetti (come pistole) richiedono di andare in mouselook per il loro utilizzo. Premi 'M' per farlo. </notification> - <notification name="FirstAppearance"> - Stai modificando il tuo aspetto. -Usa le frecce per guardarti attorno. -Quando hai finito premi 'Salva Tutto'. - </notification> - <notification name="FirstInventory"> - Questo è il tuo Inventory, che contiene gli elementi che possiedi. - -* Per indossare qualcosa, trascinala su di te. -* Per rezzare qualcosa inworld, trascinala sul suolo. -* Per leggere una notecard, fai doppio click. - </notification> <notification name="FirstSandbox"> - Questa è una Sandbox, serve per aiutare i Residenti ad imparare a costruire. + Questa è una Sandbox, serve ai residenti per imparare a costruire. -Gli oggetti che costruisci qui saranno cancellati dopo che te ne sei andato, perciò non dimenticare di cliccare sulle tue creazioni col tasto destro e scegliere 'Prendi' per trasferirle nel tuo Inventory. - </notification> - <notification name="FirstFlexible"> - Questo oggetto è flessibile. Gli oggetti Flexy devono essere fantasma e non fisici. - </notification> - <notification name="FirstDebugMenus"> - Hai abilitato il menu Avanzato. - -Per abilitarlo/disabilitarlo, - Windows: Ctrl+Alt+D - Mac: ⌥⌘D - </notification> - <notification name="FirstSculptedPrim"> - Stai modificando un prim Sculpted. Gli oggetti Sculpted hanno bisogno di una texture speciale per definire la loro forma. +Gli oggetti che costruisci qui verranno eliminati dopo che te ne sei andato, perciò non dimenticare di cliccare sulle tue creazioni col tasto destro del mouse e scegliere Prendi per trasferirle nel tuo Inventario. </notification> <notification name="MaxListSelectMessage"> È possibile selezionare solo fino a [MAX_SELECT] oggetti da questa lista. </notification> <notification name="VoiceInviteP2P"> - [NAME] ti sta invitando ad una chiamata in Chat Voice. -Clicca Accetta per unirti alla chiamata oppure Declina per declinare l'invito. Clicca Blocca per bloccare questo chiamante. + [NAME] ti sta invitando ad una chiamata in chat vocale. +Clicca su Accetta per unirti alla chiamata oppure su Declina to declinare l'invito. Clicca su Blocca per bloccare questo chiamante. <form name="form"> <button name="Accept" text="Accetta"/> <button name="Decline" text="Rifiuta"/> @@ -2478,17 +2539,17 @@ Clicca Accetta per unirti alla chiamata oppure Declina per declinare l'invi </form> </notification> <notification name="AutoUnmuteByIM"> - Hai appena inviato un IM a [FIRST] [LAST], che è stato automaticamente sbloccato. + [FIRST] [LAST] ha ricevuto un IM ed è stato automaticamente sbloccato. </notification> <notification name="AutoUnmuteByMoney"> - Hai appena inviato del denaro a [FIRST] [LAST], che è stato automaticamente sbloccato. + [FIRST] [LAST] ha ricevuto del denaro e pertanto è stato automaticamente sbloccato. </notification> <notification name="AutoUnmuteByInventory"> - Hai appena offerto un elemento dell'Inventory a [FIRST] [LAST], che è stato automaticamente sbloccato. + A [FIRST] [LAST] è stato offerto un elemento dell'Inventario e pertanto è stato automaticamente sbloccato. </notification> <notification name="VoiceInviteGroup"> - [NAME] si è aggiunto alla chiamata in Chat Voice con il gruppo [GROUP]. -Clicca Accetta per unirti alla chiamata oppure Declina per declinare l'invito. Clicca Blocca per bloccare questo chiamante. + [NAME] si è aggiunto alla chiamata in chat vocale con il gruppo [GROUP]. +Clicca su Accetta per unirti alla chiamata oppure su Declina to declinare l'invito. Clicca su Blocca per bloccare questo chiamante. <form name="form"> <button name="Accept" text="Accetta"/> <button name="Decline" text="Rifiuta"/> @@ -2496,8 +2557,8 @@ Clicca Accetta per unirti alla chiamata oppure Declina per declinare l'in </form> </notification> <notification name="VoiceInviteAdHoc"> - [NAME] si è aggiunto alla chiamata in Chat Voice con una conferenza. -Clicca Accetta per unirti alla chiamata oppure Declina to declinare l'invito. Clicca Blocca per bloccare questo chiamante. + [NAME] si è aggiunto alla chiamata in chat vocale con una conferenza. +Clicca su Accetta per unirti alla chiamata oppure su Declina to declinare l'invito. Clicca su Blocca per bloccare questo chiamante. <form name="form"> <button name="Accept" text="Accetta"/> <button name="Decline" text="Rifiuta"/> @@ -2506,7 +2567,7 @@ Clicca Accetta per unirti alla chiamata oppure Declina to declinare l'invit </notification> <notification name="InviteAdHoc"> [NAME] ti sta invitando ad una conferenza in chat. -Clicca Accetta per unirti alla chat oppure Declina per declinare l'invito. Clicca Blocca per bloccare questo chiamante. +Clicca su Accetta per unirti alla chat oppure su Declina per declinare l'invito. Clicca su Blocca per bloccare questo chiamante. <form name="form"> <button name="Accept" text="Accetta"/> <button name="Decline" text="Rifiuta"/> @@ -2520,25 +2581,40 @@ Clicca Accetta per unirti alla chat oppure Declina per declinare l'invito. Siamo spiacenti. Questa area ha raggiunto la capacità massima per le chiamate voice. Si prega di provare ad usare il voice in un'altra area. </notification> <notification name="VoiceChannelDisconnected"> - Sei stato disconnesso da [VOICE_CHANNEL_NAME]. Verrai ora riconnesso alla Chat Voice Locale. + Sei stato scollegato da [VOICE_CHANNEL_NAME]. Verrai ora ricollegato alla chat vocale nei dintorni. </notification> <notification name="VoiceChannelDisconnectedP2P"> - [VOICE_CHANNEL_NAME] ha terminato la chiamata. Verrai ora riconnesso alla Chat Voice Locale. + [VOICE_CHANNEL_NAME] ha chiuso la chiamata. Verrai ora ricollegato alla chat vocale nei dintorni. </notification> <notification name="P2PCallDeclined"> - [VOICE_CHANNEL_NAME] ha declinato la tua chiamata. Verrai ora riconnesso alla Chat Voice Locale. + [VOICE_CHANNEL_NAME] ha declinato la tua chiamata. Verrai ora ricollegato alla chat vocale nei dintorni. </notification> <notification name="P2PCallNoAnswer"> - [VOICE_CHANNEL_NAME] non è disponibile per la tua chiamata. Verrai ora riconnesso alla Chat Voice Locale. + [VOICE_CHANNEL_NAME] non è disponibile per la tua chiamata. Verrai ora ricollegato alla chat vocale nei dintorni. </notification> <notification name="VoiceChannelJoinFailed"> - Connessione a [VOICE_CHANNEL_NAME] fallita, riprova più tardi. Verrai ora riconnesso alla Chat Voice Locale. + Collegamento a [VOICE_CHANNEL_NAME] non riuscito, riprova più tardi. Verrai ora ricollegato alla chat vocale nei dintorni. </notification> <notification name="VoiceLoginRetry"> Stiamo creando una canale voice per te. Questo può richiedere fino a un minuto. </notification> + <notification name="VoiceEffectsExpired"> + Almeno una delle manipolazioni vocali alle quali sei iscritto è scaduta. +[[URL] Fai clic qui] per rinnovare l'abbonamento. + </notification> + <notification name="VoiceEffectsExpiredInUse"> + Poiché la manipolazione vocale attiva è scaduta, sono state applicate le tue impostazioni normali. +[[URL] Fai clic qui] per rinnovare l'abbonamento. + </notification> + <notification name="VoiceEffectsWillExpire"> + Almeno una delle tue manipolazioni vocali scadrà tra meno di [INTERVAL] giorni. +[[URL] Fai clic qui] per rinnovare l'abbonamento. + </notification> + <notification name="VoiceEffectsNew"> + Sono disponibili nuove manipolazioni vocali. + </notification> <notification name="Cannot enter parcel: not a group member"> - Soltanto i membri di uno specifico gruppo possono visitare quest'area. + Soltanto i membri di un determinato gruppo possono visitare questa zona. </notification> <notification name="Cannot enter parcel: banned"> Non puoi entrare nel terreno, sei stato bloccato. @@ -2553,17 +2629,17 @@ Clicca Accetta per unirti alla chat oppure Declina per declinare l'invito. Si è verificato un errore durante il tentativo di collegarti a una voice chat con [VOICE_CHANNEL_NAME]. Riprova più tardi. </notification> <notification name="ServerVersionChanged"> - Sei appena entrato in una regione che usa una versione differente del server, questo potrebbe influenzare le prestazioni. [[URL] Guarda le Release Notes.] + Sei appena entrato in una regione che usa una versione differente del server: ciò potrebbe incidere sule prestazioni. [[URL] Visualizza le note sulla versione.] </notification> <notification name="UnsupportedCommandSLURL"> - Lo SLurl che hai cliccato non è attivo. + Lo SLurl su cui hai cliccato non è valido. </notification> <notification name="BlockedSLURL"> - Uno SLurl è stato ricevuto da un browser sconosciuto e per la tua sicurezza è stato bloccato. + Uno SLurl è stato ricevuto da un browser sconosciuto o non sicuro e, per sicurezza, è stato bloccato. </notification> <notification name="ThrottledSLURL"> - Multipli SLurls sono stati ricevuti da un browser sconosciuto in un breve periodo. -Per la tua sicurezza verranno bloccati per alcuni secondi. + Sono stati ricevuti più SLurl da un browser sconosciuto o non sicuro in un breve periodo di tempo. +Per sicurezza, verranno bloccati per alcuni secondi. </notification> <notification name="IMToast"> [MESSAGE] @@ -2571,19 +2647,23 @@ Per la tua sicurezza verranno bloccati per alcuni secondi. <button name="respondbutton" text="Rispondi"/> </form> </notification> + <notification name="ConfirmCloseAll"> + Sicuro di voler chiudere tutti gli IM? + <usetemplate ignoretext="Conferma prima della chiusura di tutti gli IM" name="okcancelignore" notext="Annulla" yestext="OK"/> + </notification> <notification name="AttachmentSaved"> - L'Allegato (Attachment) è stato salvato. + L'elemento da collegare è stato salvato. </notification> <notification name="UnableToFindHelpTopic"> - Impossibilitato a trovare il tema aiuto per questo elemento (nozione)???!!!!. + Impossibile trovare l'argomento nell'aiuto per questo elemento. </notification> <notification name="ObjectMediaFailure"> - Errore del Server: aggiornamento del Media o mancato funzionamento. + Errore del server: mancato aggiornamento o ottenimento del media. '[ERROR]' <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="TextChatIsMutedByModerator"> - Il tuo testo nella chat è stato interrotto dal moderatore. + La tua chat di testo è stata interrotta dal moderatore. <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="VoiceIsMutedByModerator"> @@ -2592,19 +2672,109 @@ Per la tua sicurezza verranno bloccati per alcuni secondi. </notification> <notification name="ConfirmClearTeleportHistory"> Sei sicuro di volere cancellare la cronologia dei tuoi teleport? - <usetemplate name="okcancelbuttons" notext="Cancella" yestext="OK"/> + <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/> </notification> <notification name="BottomTrayButtonCanNotBeShown"> - Il bottone selezionato non può essere mostrato in questo momento. -Il bottone verrà mostrato quando ci sarà abbastanza spazio. + Il pulsante selezionato non può essere visualizzato in questo momento. +Il pulsante verrà visualizzato quando lo spazio sarà sufficiente. + </notification> + <notification name="ShareNotification"> + Scegli i residenti con i quali condividere. + </notification> + <notification name="ShareItemsConfirmation"> + Sei sicuro di volere condividere gli oggetti + +[ITEMS] + +Con i seguenti residenti? + +[RESIDENTS] + <usetemplate name="okcancelbuttons" notext="Annulla" yestext="Ok"/> + </notification> + <notification name="ItemsShared"> + Gli oggetti sono stati condivisi. + </notification> + <notification name="DeedToGroupFail"> + Cessione al gruppo non riuscita. + </notification> + <notification name="AvatarRezNotification"> + ( in esistenza da [EXISTENCE] secondi ) +Nuvola avatar '[NAME]' dileguata dopo [TIME] secondi. + </notification> + <notification name="AvatarRezSelfBakedDoneNotification"> + ( in esistenza da [EXISTENCE] secondi ) +Baking dei vestiti terminato dopo [TIME] secondi. + </notification> + <notification name="AvatarRezSelfBakedUpdateNotification"> + ( in esistenza da [EXISTENCE] secondi ) +Hai inviato un aggiornamento al tuo aspetto dopo [TIME] secondi. +[STATUS] + </notification> + <notification name="AvatarRezCloudNotification"> + ( presente da [EXISTENCE] secondi ) +Avatar '[NAME]' trasformato in nuvola. + </notification> + <notification name="AvatarRezArrivedNotification"> + ( presente da [EXISTENCE] secondi ) +È comparso l'avatar '[NAME]'. + </notification> + <notification name="AvatarRezLeftCloudNotification"> + ( presente da [EXISTENCE] secondi ) +Avatar '[NAME]' partito dopo [TIME] secondi sotto forma di nuvola. + </notification> + <notification name="AvatarRezEnteredAppearanceNotification"> + ( presente da [EXISTENCE] secondi ) +Avatar '[NAME]' è entrato nella modalità aspetto. + </notification> + <notification name="AvatarRezLeftAppearanceNotification"> + ( presente da [EXISTENCE] secondi ) +Avatar '[NAME]' ha lasciato la modalità aspetto. + </notification> + <notification name="NoConnect"> + Ci sono problemi di connessione tramite [PROTOCOL] [HOSTID]. +Ti consigliamo di controllare le tue impostazioni di rete e della firewall. + <form name="form"> + <button name="OK" text="OK"/> + </form> + </notification> + <notification name="NoVoiceConnect"> + A causa di problemi di connessione al server vocale + +[HOSTID] + +le comunicazioni tramite voce non saranno disponibili. +Ti consigliamo di controllare le tue impostazioni di rete e della firewall. + <form name="form"> + <button name="OK" text="OK"/> + </form> + </notification> + <notification name="AvatarRezLeftNotification"> + ( presente da [EXISTENCE] secondi ) +Avatar '[NAME]' è partito completamente caricato. + </notification> + <notification name="AvatarRezSelfBakeNotification"> + ( in esistenza da [EXISTENCE] secondi ) +Hai caricato una texture [RESOLUTION] completata per '[BODYREGION]' dopo [TIME] secondi. + </notification> + <notification name="ConfirmLeaveCall"> + Sei sicuro di volere uscire dalla chiamata? + <usetemplate ignoretext="Conferma prima di uscire dalla chiamata" name="okcancelignore" notext="No" yestext="Sì"/> + </notification> + <notification name="ConfirmMuteAll"> + Hai scelto di disattivare l'audio di tutti i partecipanti alla chiamata di gruppo. +In questo modo verrà disattivato l'audio anche di tutti i residenti che si +uniscono alla chiamata in un secondo momento, anche dopo che tu ti fossi scollegato. + +Disattiva audio di tutti? + <usetemplate ignoretext="Conferma prima di disattivare l'audio di tutti i partecipanti alla chiamata di gruppo" name="okcancelignore" notext="Annulla" yestext="Ok"/> </notification> <global name="UnsupportedCPU"> - La velocità della tua CPU non soddisfa i requisiti minimi. </global> <global name="UnsupportedGLRequirements"> - Non sembra che tu abbia i requisiti hardware adeguati per [APP_NAME]. [APP_NAME] richiede una scheda grafica OpenGL con supporto multitexture. Se tu ce l'hai, dovresti accertarti di avere i driver, i service pack e le patch più recenti della scheda grafica e del tuo sistema operativo. + Non sembra che tu abbia i requisiti hardware adeguati per [APP_NAME]. [APP_NAME] richiede una scheda grafica OpenGL con supporto multitexture. Se ne hai una in dotazione, accertati di avere i driver, i service pack e i patch più recenti per la scheda grafica e per il sistema operativo. -Se continui ad avere problemi, visita [SUPPORT_SITE]. +Se continui ad avere problemi, visita la pagina [SUPPORT_SITE]. </global> <global name="UnsupportedCPUAmount"> 796 @@ -2619,7 +2789,7 @@ Se continui ad avere problemi, visita [SUPPORT_SITE]. - La memoria del tuo sistema non soddisfa i requisiti minimi. </global> <global name="You can only set your 'Home Location' on your land or at a mainland Infohub."> - Se possiedi una parte di terra, puoi creare qui la tua ubicazione di casa. -Altrimenti, puoi guardare sulla Mappa e trovare luoghi segnalati come "Infohub". + Se sei proprietario di un appezzamento di terreno, puoi definirlo come la tua posizione iniziale. +In alternativa, puoi guardare sulla mappa e trovare luoghi segnalati come "Infohub". </global> </notifications> diff --git a/indra/newview/skins/default/xui/it/outfit_accordion_tab.xml b/indra/newview/skins/default/xui/it/outfit_accordion_tab.xml new file mode 100644 index 0000000000..bac885e5d8 --- /dev/null +++ b/indra/newview/skins/default/xui/it/outfit_accordion_tab.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- *NOTE: mantipov: this xml is intended to be used inside panel_outfits_list.xml for each outfit folder--> +<!-- All accordion tabs in the My Appearance/My Outfits panel will be created from this one at runtume--> +<accordion_tab name="Mockup Tab" title="Mockup Tab"/> diff --git a/indra/newview/skins/default/xui/it/panel_adhoc_control_panel.xml b/indra/newview/skins/default/xui/it/panel_adhoc_control_panel.xml index 4a7c9b11c7..be001d09f8 100644 --- a/indra/newview/skins/default/xui/it/panel_adhoc_control_panel.xml +++ b/indra/newview/skins/default/xui/it/panel_adhoc_control_panel.xml @@ -1,8 +1,14 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="panel_im_control_panel"> - <panel name="panel_call_buttons"> - <button label="Chiama" name="call_btn"/> - <button label="Abbandona Chiamata" name="end_call_btn"/> - <button label="Voice Controls" name="voice_ctrls_btn"/> - </panel> + <layout_stack name="vertical_stack"> + <layout_panel name="call_btn_panel"> + <button label="Chiama" name="call_btn"/> + </layout_panel> + <layout_panel name="end_call_btn_panel"> + <button label="Abbandona chiamata" name="end_call_btn"/> + </layout_panel> + <layout_panel name="voice_ctrls_btn_panel"> + <button label="Regolazione voce" name="voice_ctrls_btn"/> + </layout_panel> + </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/it/panel_avatar_list_item.xml index 40f805774e..4c7f298590 100644 --- a/indra/newview/skins/default/xui/it/panel_avatar_list_item.xml +++ b/indra/newview/skins/default/xui/it/panel_avatar_list_item.xml @@ -1,25 +1,26 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="avatar_list_item"> <string name="FormatSeconds"> - [COUNT]s + [COUNT] s </string> <string name="FormatMinutes"> - [COUNT]m + [COUNT] m </string> <string name="FormatHours"> - [COUNT]h + [COUNT] h </string> <string name="FormatDays"> - [COUNT]d + [COUNT] g </string> <string name="FormatWeeks"> - [COUNT]w + [COUNT] sett </string> <string name="FormatMonths"> - [COUNT]mon + [COUNT] mes </string> <string name="FormatYears"> - [COUNT]y + [COUNT] a </string> <text name="avatar_name" value="Sconosciuto"/> + <button name="profile_btn" tool_tip="Vedi profilo"/> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_block_list_sidetray.xml b/indra/newview/skins/default/xui/it/panel_block_list_sidetray.xml index cf833924ae..610f561a65 100644 --- a/indra/newview/skins/default/xui/it/panel_block_list_sidetray.xml +++ b/indra/newview/skins/default/xui/it/panel_block_list_sidetray.xml @@ -1,10 +1,10 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="block_list_panel"> <text name="title_text"> - Lista bloccata + Blocca lista </text> - <scroll_list name="blocked" tool_tip="Lista dei residenti bloccati"/> - <button label="Blocca il Residente..." label_selected="Blocca Residente..." name="Block resident..." tool_tip="Scegli un residente da bloccare"/> + <scroll_list name="blocked" tool_tip="Lista degli attuali residenti bloccati"/> + <button label="Blocca il residente..." label_selected="Blocca il residente..." name="Block resident..." tool_tip="Scegli un residente da bloccare"/> <button label="Blocca l'oggetto per nome..." label_selected="Blocca l'oggetto per nome..." name="Block object by name..."/> - <button label="Sblocca" label_selected="Sblocca" name="Unblock" tool_tip="Rimuovi dalla lista il residente o l'oggetto bloccato"/> + <button label="Sblocca" label_selected="Sblocca" name="Unblock" tool_tip="Rimuovi un residente o un oggetto dalla lista bloccati"/> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_body_parts_list_item.xml b/indra/newview/skins/default/xui/it/panel_body_parts_list_item.xml new file mode 100644 index 0000000000..de764d8025 --- /dev/null +++ b/indra/newview/skins/default/xui/it/panel_body_parts_list_item.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="wearable_item"> + <text name="item_name" value="..."/> +</panel> diff --git a/indra/newview/skins/default/xui/it/panel_bodyparts_list_button_bar.xml b/indra/newview/skins/default/xui/it/panel_bodyparts_list_button_bar.xml new file mode 100644 index 0000000000..8fc23d34f1 --- /dev/null +++ b/indra/newview/skins/default/xui/it/panel_bodyparts_list_button_bar.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="clothing_list_button_bar_panel"> + <button label="Cambia" name="switch_btn"/> + <button label="Acquista >" name="bodyparts_shop_btn"/> +</panel> diff --git a/indra/newview/skins/default/xui/it/panel_bottomtray.xml b/indra/newview/skins/default/xui/it/panel_bottomtray.xml index f2aab63dce..e4d99cc402 100644 --- a/indra/newview/skins/default/xui/it/panel_bottomtray.xml +++ b/indra/newview/skins/default/xui/it/panel_bottomtray.xml @@ -1,23 +1,49 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="bottom_tray"> - <string name="SpeakBtnToolTip"> - Microfono on/off - </string> - <string name="VoiceControlBtnToolTip"> - Mostra/nascondi il pannello voice control - </string> + <string name="SpeakBtnToolTip" value="Accende o spegne il microfono"/> + <string name="VoiceControlBtnToolTip" value="Mostra o nasconde il pannello di regolazione voce"/> <layout_stack name="toolbar_stack"> + <layout_panel name="speak_panel"> + <talk_button name="talk"> + <speak_button label="Parla" label_selected="Parla" name="speak_btn"/> + </talk_button> + </layout_panel> <layout_panel name="gesture_panel"> - <gesture_combo_box label="Gesture" name="Gesture" tool_tip="Mostra/nascondi gestures"/> + <gesture_combo_list label="Gesture" name="Gesture" tool_tip="Mostra o nasconde le gesture"/> </layout_panel> <layout_panel name="movement_panel"> - <button label="Sposta" name="movement_btn" tool_tip="Mostra/nascondi i controlli del movimento"/> + <button label="Sposta" name="movement_btn" tool_tip="Mostra o nasconde i comandi del movimento"/> </layout_panel> <layout_panel name="cam_panel"> - <button label="Visualizza" name="camera_btn" tool_tip="Mostra/nascondi i controlli della camera"/> + <button label="Visuale" name="camera_btn" tool_tip="Mostra o nasconde le regolazioni della visuale"/> </layout_panel> <layout_panel name="snapshot_panel"> <button label="" name="snapshots" tool_tip="Scatta una foto"/> </layout_panel> + <layout_panel name="sidebar_btn_panel"> + <button label="Barra laterale" name="sidebar_btn" tool_tip="Mostra o nasconde la barra laterale"/> + </layout_panel> + <layout_panel name="build_btn_panel"> + <button label="Costruisci" name="build_btn" tool_tip="Mostra o nasconde gli strumenti di costruzione"/> + </layout_panel> + <layout_panel name="search_btn_panel"> + <button label="Cerca" name="search_btn" tool_tip="Mostra o nasconde la ricerca"/> + </layout_panel> + <layout_panel name="world_map_btn_panel"> + <button label="Mappa" name="world_map_btn" tool_tip="Mostra o nasconde la mappa del mondo"/> + </layout_panel> + <layout_panel name="mini_map_btn_panel"> + <button label="Mini mappa" name="mini_map_btn" tool_tip="Mostra o nasconde la mini mappa"/> + </layout_panel> + <layout_panel name="im_well_panel"> + <chiclet_im_well name="im_well"> + <button name="Unread IM messages" tool_tip="Conversazioni"/> + </chiclet_im_well> + </layout_panel> + <layout_panel name="notification_well_panel"> + <chiclet_notification name="notification_well"> + <button name="Unread" tool_tip="Notifiche"/> + </chiclet_notification> + </layout_panel> </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_bottomtray_lite.xml b/indra/newview/skins/default/xui/it/panel_bottomtray_lite.xml new file mode 100644 index 0000000000..ff576c7dd2 --- /dev/null +++ b/indra/newview/skins/default/xui/it/panel_bottomtray_lite.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="bottom_tray_lite"> + <layout_stack name="toolbar_stack_lite"> + <layout_panel name="gesture_panel"> + <gesture_combo_list label="Gesture" name="Gesture" tool_tip="Mostra/nasconde gesture"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/default/xui/it/panel_classified_info.xml b/indra/newview/skins/default/xui/it/panel_classified_info.xml index 2ba127d34a..3d363d9c75 100644 --- a/indra/newview/skins/default/xui/it/panel_classified_info.xml +++ b/indra/newview/skins/default/xui/it/panel_classified_info.xml @@ -1,17 +1,48 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="panel_classified_info"> - <text name="title" value="Info sugli Annunci"/> + <panel.string name="l$_price"> + L$ [PRICE] + </panel.string> + <panel.string name="click_through_text_fmt"> + [TELEPORT] teleport, [MAP] mappa, [PROFILE] profilo + </panel.string> + <panel.string name="date_fmt"> + [mthnum,datetime,slt]/[day,datetime,slt]/[year,datetime,slt] + </panel.string> + <panel.string name="auto_renew_on"> + Abilitato + </panel.string> + <panel.string name="auto_renew_off"> + Disattivato + </panel.string> + <text name="title" value="Informazioni inserzione"/> <scroll_container name="profile_scroll"> <panel name="scroll_content_panel"> - <text name="classified_name" value="[nome]"/> - <text name="classified_location" value="[caricando...]"/> - <text name="content_type" value="[tipo di contenuto]"/> - <text name="category" value="[categoria]"/> - <check_box label="Auto rinnovo settimanale" name="auto_renew"/> - <text name="price_for_listing" tool_tip="Prezzo di listino."> - L$[PREZZO] - </text> - <text name="classified_desc" value="[descrizione]"/> + <text_editor name="classified_name" value="[name]"/> + <text name="classified_location_label" value="Luogo:"/> + <text_editor name="classified_location" value="[loading...]"/> + <text name="content_type_label" value="Tipo di contenuto:"/> + <text_editor name="content_type" value="[content type]"/> + <text name="category_label" value="Categoria:"/> + <text_editor name="category" value="[category]"/> + <text name="creation_date_label" value="Data di creazione:"/> + <text_editor name="creation_date" tool_tip="Data di creazione" value="[date]"/> + <text name="price_for_listing_label" value="Prezzo per inserzione:"/> + <text_editor name="price_for_listing" tool_tip="Prezzo per inserzione:" value="[price]"/> + <layout_stack name="descr_stack"> + <layout_panel name="clickthrough_layout_panel"> + <text name="click_through_label" value="Clic:"/> + <text_editor name="click_through_text" tool_tip="Dati di click through" value="[clicks]"/> + </layout_panel> + <layout_panel name="price_layout_panel"> + <text name="auto_renew_label" value="Rinnovo automatico:"/> + <text name="auto_renew" value="Abilitato"/> + </layout_panel> + <layout_panel name="descr_layout_panel"> + <text name="classified_desc_label" value="Descrizione:"/> + <text_editor name="classified_desc" value="[descrizione]"/> + </layout_panel> + </layout_stack> </panel> </scroll_container> <panel name="buttons"> diff --git a/indra/newview/skins/default/xui/it/panel_clothing_list_button_bar.xml b/indra/newview/skins/default/xui/it/panel_clothing_list_button_bar.xml new file mode 100644 index 0000000000..e9d9795b3a --- /dev/null +++ b/indra/newview/skins/default/xui/it/panel_clothing_list_button_bar.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="clothing_list_button_bar_panel"> + <button label="Aggiungi +" name="add_btn"/> + <button label="Acquista >" name="clothing_shop_btn"/> +</panel> diff --git a/indra/newview/skins/default/xui/it/panel_clothing_list_item.xml b/indra/newview/skins/default/xui/it/panel_clothing_list_item.xml new file mode 100644 index 0000000000..de764d8025 --- /dev/null +++ b/indra/newview/skins/default/xui/it/panel_clothing_list_item.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="wearable_item"> + <text name="item_name" value="..."/> +</panel> diff --git a/indra/newview/skins/default/xui/it/panel_cof_wearables.xml b/indra/newview/skins/default/xui/it/panel_cof_wearables.xml new file mode 100644 index 0000000000..d914a5740f --- /dev/null +++ b/indra/newview/skins/default/xui/it/panel_cof_wearables.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="cof_wearables"> + <accordion name="cof_wearables_accordion"> + <accordion_tab name="tab_attachments" title="Allegati"/> + <accordion_tab name="tab_clothing" title="Vestiario"/> + <accordion_tab name="tab_body_parts" title="Parti del corpo"/> + </accordion> +</panel> diff --git a/indra/newview/skins/default/xui/it/panel_deletable_wearable_list_item.xml b/indra/newview/skins/default/xui/it/panel_deletable_wearable_list_item.xml new file mode 100644 index 0000000000..91d90a5660 --- /dev/null +++ b/indra/newview/skins/default/xui/it/panel_deletable_wearable_list_item.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="deletable_wearable_item"> + <text name="item_name" value="..."/> +</panel> diff --git a/indra/newview/skins/default/xui/it/panel_dummy_clothing_list_item.xml b/indra/newview/skins/default/xui/it/panel_dummy_clothing_list_item.xml new file mode 100644 index 0000000000..6af84de0c7 --- /dev/null +++ b/indra/newview/skins/default/xui/it/panel_dummy_clothing_list_item.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="dummy_clothing_item"> + <text name="item_name" value="..."/> +</panel> diff --git a/indra/newview/skins/default/xui/it/panel_edit_alpha.xml b/indra/newview/skins/default/xui/it/panel_edit_alpha.xml index 652bef0430..286ee626cf 100644 --- a/indra/newview/skins/default/xui/it/panel_edit_alpha.xml +++ b/indra/newview/skins/default/xui/it/panel_edit_alpha.xml @@ -2,7 +2,7 @@ <panel name="edit_alpha_panel"> <panel name="avatar_alpha_color_panel"> <texture_picker label="Alpha inferiore" name="Lower Alpha" tool_tip="Clicca per scegliere una fotografia"/> - <texture_picker label="Alpha superiore" name="Upper Alpha" tool_tip="Click to choose a picture"/> + <texture_picker label="Alpha superiore" name="Upper Alpha" tool_tip="Clicca per scegliere una fotografia"/> <texture_picker label="Alpha della testa" name="Head Alpha" tool_tip="Clicca per scegliere una fotografia"/> <texture_picker label="Alpha dell'occhio" name="Eye Alpha" tool_tip="Clicca per scegliere una fotografia"/> <texture_picker label="Alpha dei capelli" name="Hair Alpha" tool_tip="Clicca per scegliere una fotografia"/> diff --git a/indra/newview/skins/default/xui/it/panel_edit_classified.xml b/indra/newview/skins/default/xui/it/panel_edit_classified.xml index 81ef121dd8..bbe8ebbc32 100644 --- a/indra/newview/skins/default/xui/it/panel_edit_classified.xml +++ b/indra/newview/skins/default/xui/it/panel_edit_classified.xml @@ -1,14 +1,22 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Modifica gli Annunci" name="panel_edit_classified"> +<panel label="Modifica inserzione" name="panel_edit_classified"> <panel.string name="location_notice"> - (sarà aggiornato dopo il salvataggio) + (si aggiornerà dopo il salvataggio) </panel.string> + <string name="publish_label"> + Pubblica + </string> + <string name="save_label"> + Salva + </string> <text name="title"> - Modifica gli Annunci + Modifica inserzione </text> <scroll_container name="profile_scroll"> <panel name="scroll_content_panel"> - <icon label="" name="edit_icon" tool_tip="Clicca per selezionare un'immagine"/> + <panel name="snapshot_panel"> + <icon label="" name="edit_icon" tool_tip="Clicca per selezionare un'immagine"/> + </panel> <text name="Name:"> Titolo: </text> @@ -19,15 +27,22 @@ Luogo: </text> <text name="classified_location"> - caricando... + caricamento... </text> - <button label="Imposta sul luogo attuale" name="set_to_curr_location_btn"/> - <spinner label="L$" name="price_for_listing" tool_tip="Fissare il Prezzo." value="50"/> - <check_box label="Auto-rinnovo settimanale" name="auto_renew"/> + <button label="Imposta come luogo attuale" name="set_to_curr_location_btn"/> + <text name="category_label" value="Categoria:"/> + <text name="content_type_label" value="Tipo di contenuto:"/> + <icons_combo_box label="Contenuto generale" name="content_type"> + <icons_combo_box.item label="Contenuto moderato" name="mature_ci" value="Moderato"/> + <icons_combo_box.item label="Contenuto generale" name="pg_ci" value="Generale"/> + </icons_combo_box> + <text name="price_for_listing_label" value="Prezzo per inserzione:"/> + <spinner label="L$" name="price_for_listing" tool_tip="Prezzo per inserzione:" value="50"/> + <check_box label="Rinnovo automatico ogni settimana" name="auto_renew"/> </panel> </scroll_container> <panel label="bottom_panel" name="bottom_panel"> - <button label="Salva" name="save_changes_btn"/> - <button label="Cancella" name="cancel_btn"/> + <button label="[LABEL]" name="save_changes_btn"/> + <button label="Annulla" name="cancel_btn"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_edit_eyes.xml b/indra/newview/skins/default/xui/it/panel_edit_eyes.xml index 3b1e51e759..9f31bb7dc7 100644 --- a/indra/newview/skins/default/xui/it/panel_edit_eyes.xml +++ b/indra/newview/skins/default/xui/it/panel_edit_eyes.xml @@ -3,7 +3,9 @@ <panel name="avatar_eye_color_panel"> <texture_picker label="Iride" name="Iris" tool_tip="Clicca per scegliere una fotografia"/> </panel> - <accordion name="wearable_accordion"> - <accordion_tab name="eyes_main_tab" title="Occhi"/> - </accordion> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="eyes_main_tab" title="Occhi"/> + </accordion> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_edit_gloves.xml b/indra/newview/skins/default/xui/it/panel_edit_gloves.xml index 2a80d6df3d..48024b8095 100644 --- a/indra/newview/skins/default/xui/it/panel_edit_gloves.xml +++ b/indra/newview/skins/default/xui/it/panel_edit_gloves.xml @@ -4,7 +4,9 @@ <texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/> <color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/> </panel> - <accordion name="wearable_accordion"> - <accordion_tab name="gloves_main_tab" title="Guanti"/> - </accordion> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="gloves_main_tab" title="Guanti"/> + </accordion> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_edit_hair.xml b/indra/newview/skins/default/xui/it/panel_edit_hair.xml index 137a5cabeb..50e2e7e4b3 100644 --- a/indra/newview/skins/default/xui/it/panel_edit_hair.xml +++ b/indra/newview/skins/default/xui/it/panel_edit_hair.xml @@ -3,10 +3,12 @@ <panel name="avatar_hair_color_panel"> <texture_picker label="Texture" name="Texture" tool_tip="Clicca per scegliere una fotografia"/> </panel> - <accordion name="wearable_accordion"> - <accordion_tab name="hair_color_tab" title="Colore"/> - <accordion_tab name="hair_style_tab" title="Stile"/> - <accordion_tab name="hair_eyebrows_tab" title="Sopracciglia"/> - <accordion_tab name="hair_facial_tab" title="Facciale"/> - </accordion> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="hair_color_tab" title="Colore"/> + <accordion_tab name="hair_style_tab" title="Stile"/> + <accordion_tab name="hair_eyebrows_tab" title="Sopracciglia"/> + <accordion_tab name="hair_facial_tab" title="Del viso"/> + </accordion> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_edit_jacket.xml b/indra/newview/skins/default/xui/it/panel_edit_jacket.xml index 43c825ff73..d77c1ec763 100644 --- a/indra/newview/skins/default/xui/it/panel_edit_jacket.xml +++ b/indra/newview/skins/default/xui/it/panel_edit_jacket.xml @@ -5,7 +5,9 @@ <texture_picker label="Tessuto inferiore" name="Lower Fabric" tool_tip="Clicca per scegliere una fotografia"/> <color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/> </panel> - <accordion name="wearable_accordion"> - <accordion_tab name="jacket_main_tab" title="Giacca"/> - </accordion> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="jacket_main_tab" title="Giacca"/> + </accordion> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_edit_pants.xml b/indra/newview/skins/default/xui/it/panel_edit_pants.xml index cbab711fb1..83ef274877 100644 --- a/indra/newview/skins/default/xui/it/panel_edit_pants.xml +++ b/indra/newview/skins/default/xui/it/panel_edit_pants.xml @@ -4,7 +4,9 @@ <texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/> <color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/> </panel> - <accordion name="wearable_accordion"> - <accordion_tab name="pants_main_tab" title="Pantaloni"/> - </accordion> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="pants_main_tab" title="Pantaloni"/> + </accordion> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_edit_pick.xml b/indra/newview/skins/default/xui/it/panel_edit_pick.xml index 7f2e82e4ff..f93b953eac 100644 --- a/indra/newview/skins/default/xui/it/panel_edit_pick.xml +++ b/indra/newview/skins/default/xui/it/panel_edit_pick.xml @@ -1,7 +1,10 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Modifica scelta ????" name="panel_edit_pick"> +<panel label="Modifica preferito" name="panel_edit_pick"> + <panel.string name="location_notice"> + (si aggiornerà dopo il salvataggio) + </panel.string> <text name="title"> - Modifica scelta ???? + Modifica preferito </text> <scroll_container name="profile_scroll"> <panel name="scroll_content_panel"> @@ -16,13 +19,13 @@ Luogo: </text> <text name="pick_location"> - caricando... + caricamento... </text> <button label="Imposta come luogo attuale" name="set_to_curr_location_btn"/> </panel> </scroll_container> <panel label="bottom_panel" name="bottom_panel"> - <button label="Salva [WHAT]" name="save_changes_btn"/> - <button label="Cancella" name="cancel_btn"/> + <button label="Salva luogo preferito" name="save_changes_btn"/> + <button label="Annulla" name="cancel_btn"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_edit_profile.xml b/indra/newview/skins/default/xui/it/panel_edit_profile.xml index b9779c77b5..3ecf4bcaf2 100644 --- a/indra/newview/skins/default/xui/it/panel_edit_profile.xml +++ b/indra/newview/skins/default/xui/it/panel_edit_profile.xml @@ -1,10 +1,10 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Modifica del profilo" name="edit_profile_panel"> +<panel label="Modifica profilo" name="edit_profile_panel"> <string name="CaptionTextAcctInfo"> [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION] </string> <string name="RegisterDateFormat"> - [REG_DATE] ([ETA']) + [REG_DATE] ([AGE]) </string> <string name="AcctTypeResident" value="Residente"/> <string name="AcctTypeTrial" value="Prova"/> @@ -26,23 +26,26 @@ <icon label="" name="2nd_life_edit_icon" tool_tip="Clicca per selezionare un'immagine"/> </panel> <panel name="first_life_image_panel"> - <text name="real_world_photo_title_text" value="Mondo Reale:"/> + <text name="real_world_photo_title_text" value="Mondo reale:"/> </panel> <icon label="" name="real_world_edit_icon" tool_tip="Clicca per selezionare un'immagine"/> <text name="title_homepage_text"> - Homepage: + Home page: </text> <check_box label="Mostrami nei risultati della ricerca" name="show_in_search_checkbox"/> - <text name="title_acc_status_text" value="Mio Account:"/> - <text name="my_account_link" value="[[URL] Vai al mio pannello personale]"/> - <text name="acc_status_text" value="Residente. No payment info on file."/> - <text name="title_partner_text" value="Mio Partner:"/> - <text name="partner_edit_link" value="[[URL] Modifica]"/> + <text name="title_acc_status_text" value="Il mio account:"/> + <text_editor name="acc_status_text" value="Residente. Nessuna informazione di pagamento disponibile."/> + <text name="my_account_link" value="[[URL] Go to My Dashboard]"/> + <text name="title_partner_text" value="Il mio partner:"/> + <panel name="partner_data_panel"> + <name_box initial_value="(recupero)" name="partner_text"/> + </panel> + <text name="partner_edit_link" value="[[URL] Edit]"/> </panel> </panel> </scroll_container> <panel name="profile_me_buttons_panel"> - <button label="Salva le modifiche" name="save_btn"/> - <button label="Cancella" name="cancel_btn"/> + <button label="Salva modifiche" name="save_btn"/> + <button label="Annulla" name="cancel_btn"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_edit_shape.xml b/indra/newview/skins/default/xui/it/panel_edit_shape.xml index f22b393ecd..fd6a7af69c 100644 --- a/indra/newview/skins/default/xui/it/panel_edit_shape.xml +++ b/indra/newview/skins/default/xui/it/panel_edit_shape.xml @@ -1,23 +1,26 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="edit_shape_panel"> - <panel name="avatar_sex_panel"> - <text name="gender_text"> - Sesso: - </text> - <radio_group name="sex_radio"> - <radio_item label="Femminile" name="radio"/> - <radio_item label="Maschile" name="radio2"/> - </radio_group> + <string name="meters"> + Metri + </string> + <string name="feet"> + Piedi + </string> + <string name="height"> + Statura: + </string> + <text name="avatar_height"/> + <panel label="Camicia" name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="shape_body_tab" title="Corpo"/> + <accordion_tab name="shape_head_tab" title="Testa"/> + <accordion_tab name="shape_eyes_tab" title="Occhi"/> + <accordion_tab name="shape_ears_tab" title="Orecchie"/> + <accordion_tab name="shape_nose_tab" title="Naso"/> + <accordion_tab name="shape_mouth_tab" title="Bocca"/> + <accordion_tab name="shape_chin_tab" title="Mento"/> + <accordion_tab name="shape_torso_tab" title="Torace"/> + <accordion_tab name="shape_legs_tab" title="Gambe"/> + </accordion> </panel> - <accordion name="wearable_accordion"> - <accordion_tab name="shape_body_tab" title="Corpo"/> - <accordion_tab name="shape_head_tab" title="Testa"/> - <accordion_tab name="shape_eyes_tab" title="Occhi"/> - <accordion_tab name="shape_ears_tab" title="Orecchie"/> - <accordion_tab name="shape_nose_tab" title="Naso"/> - <accordion_tab name="shape_mouth_tab" title="Bocca"/> - <accordion_tab name="shape_chin_tab" title="Mento"/> - <accordion_tab name="shape_torso_tab" title="Busto"/> - <accordion_tab name="shape_legs_tab" title="Gambe"/> - </accordion> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_edit_shirt.xml b/indra/newview/skins/default/xui/it/panel_edit_shirt.xml index 5d902ae40b..1f41b28348 100644 --- a/indra/newview/skins/default/xui/it/panel_edit_shirt.xml +++ b/indra/newview/skins/default/xui/it/panel_edit_shirt.xml @@ -1,10 +1,12 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="edit_shirt_panel"> <panel name="avatar_shirt_color_panel"> - <texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere una foto"/> + <texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/> <color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/> </panel> - <accordion name="wearable_accordion"> - <accordion_tab name="shirt_main_tab" title="Camicia"/> - </accordion> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="shirt_main_tab" title="Camicia"/> + </accordion> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_edit_shoes.xml b/indra/newview/skins/default/xui/it/panel_edit_shoes.xml index bd1fa5b16d..7a82c8e99d 100644 --- a/indra/newview/skins/default/xui/it/panel_edit_shoes.xml +++ b/indra/newview/skins/default/xui/it/panel_edit_shoes.xml @@ -4,7 +4,9 @@ <texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/> <color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/> </panel> - <accordion name="wearable_accordion"> - <accordion_tab name="shoes_main_tab" title="Scarpe"/> - </accordion> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="shoes_main_tab" title="Scarpe"/> + </accordion> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_edit_skin.xml b/indra/newview/skins/default/xui/it/panel_edit_skin.xml index 2fa76d4afc..a15489b333 100644 --- a/indra/newview/skins/default/xui/it/panel_edit_skin.xml +++ b/indra/newview/skins/default/xui/it/panel_edit_skin.xml @@ -1,14 +1,16 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="edit_skin_panel"> <panel name="avatar_skin_color_panel"> - <texture_picker label="Tatuaggi Testa" name="Head Tattoos" tool_tip="Clicca per scegliere un'immagine"/> - <texture_picker label="Tatuaggi superiori" name="Upper Tattoos" tool_tip="Clicca per scegliere un'immagine"/> - <texture_picker label="Tatuaggi inferiori" name="Lower Tattoos" tool_tip="Clicca per scegliere un'immagine"/> + <texture_picker label="Tatuaggi testa" name="Head Tattoos" tool_tip="Clicca per scegliere una fotografia"/> + <texture_picker label="Tatuaggi superiori" name="Upper Tattoos" tool_tip="Clicca per scegliere una fotografia"/> + <texture_picker label="Tatuaggi inferiori" name="Lower Tattoos" tool_tip="Clicca per scegliere una fotografia"/> + </panel> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="skin_color_tab" title="Colore della pelle"/> + <accordion_tab name="skin_face_tab" title="Dettagli del viso"/> + <accordion_tab name="skin_makeup_tab" title="Makeup"/> + <accordion_tab name="skin_body_tab" title="Dettagli del corpo"/> + </accordion> </panel> - <accordion name="wearable_accordion"> - <accordion_tab name="skin_color_tab" title="Colore della pelle"/> - <accordion_tab name="skin_face_tab" title="Dettagli del Viso"/> - <accordion_tab name="skin_makeup_tab" title="Trucco"/> - <accordion_tab name="skin_body_tab" title="Dettagli del Corpo"/> - </accordion> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_edit_skirt.xml b/indra/newview/skins/default/xui/it/panel_edit_skirt.xml index e036fff67e..7080b65737 100644 --- a/indra/newview/skins/default/xui/it/panel_edit_skirt.xml +++ b/indra/newview/skins/default/xui/it/panel_edit_skirt.xml @@ -4,7 +4,9 @@ <texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/> <color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/> </panel> - <accordion name="wearable_accordion"> - <accordion_tab name="skirt_main_tab" title="Gonna"/> - </accordion> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="skirt_main_tab" title="Gonna"/> + </accordion> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_edit_socks.xml b/indra/newview/skins/default/xui/it/panel_edit_socks.xml index 1d1eb4bd3a..6731511282 100644 --- a/indra/newview/skins/default/xui/it/panel_edit_socks.xml +++ b/indra/newview/skins/default/xui/it/panel_edit_socks.xml @@ -1,10 +1,12 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="edit_socks_panel"> <panel name="avatar_socks_color_panel"> - <texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere una foto"/> + <texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/> <color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/> </panel> - <accordion name="wearable_accordion"> - <accordion_tab name="socks_main_tab" title="Calze"/> - </accordion> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="socks_main_tab" title="Calzini"/> + </accordion> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_edit_tattoo.xml b/indra/newview/skins/default/xui/it/panel_edit_tattoo.xml index 5435a28ff9..d76fb62c53 100644 --- a/indra/newview/skins/default/xui/it/panel_edit_tattoo.xml +++ b/indra/newview/skins/default/xui/it/panel_edit_tattoo.xml @@ -1,8 +1,9 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="edit_tattoo_panel"> <panel name="avatar_tattoo_color_panel"> - <texture_picker label="Tatuaggio sulla testa" name="Head Tattoo" tool_tip="Clicca per scegliere una foto"/> - <texture_picker label="Tatuaggio superiore" name="Upper Tattoo" tool_tip="Clicca per scegliere una foto"/> - <texture_picker label="Tatuaggio inferiore" name="Lower Tattoo" tool_tip="Clicca per scegliere una foto"/> + <texture_picker label="Tatuaggio della testa" name="Head Tattoo" tool_tip="Clicca per scegliere una fotografia"/> + <texture_picker label="Tatuaggio superiore" name="Upper Tattoo" tool_tip="Clicca per scegliere una fotografia"/> + <texture_picker label="Tattuaggio inferiore" name="Lower Tattoo" tool_tip="Clicca per scegliere una fotografia"/> + <color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_edit_underpants.xml b/indra/newview/skins/default/xui/it/panel_edit_underpants.xml index ca2ba3ca01..671eb57551 100644 --- a/indra/newview/skins/default/xui/it/panel_edit_underpants.xml +++ b/indra/newview/skins/default/xui/it/panel_edit_underpants.xml @@ -4,7 +4,9 @@ <texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/> <color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/> </panel> - <accordion name="wearable_accordion"> - <accordion_tab name="underpants_main_tab" title="Slip"/> - </accordion> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="underpants_main_tab" title="Slip"/> + </accordion> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_edit_undershirt.xml b/indra/newview/skins/default/xui/it/panel_edit_undershirt.xml index cf44dad464..fccc86f8fc 100644 --- a/indra/newview/skins/default/xui/it/panel_edit_undershirt.xml +++ b/indra/newview/skins/default/xui/it/panel_edit_undershirt.xml @@ -4,7 +4,9 @@ <texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/> <color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/> </panel> - <accordion name="wearable_accordion"> - <accordion_tab name="undershirt_main_tab" title="Maglietta intima"/> - </accordion> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="undershirt_main_tab" title="Maglietta intima"/> + </accordion> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_edit_wearable.xml b/indra/newview/skins/default/xui/it/panel_edit_wearable.xml index baf585dad0..5eaae828d8 100644 --- a/indra/newview/skins/default/xui/it/panel_edit_wearable.xml +++ b/indra/newview/skins/default/xui/it/panel_edit_wearable.xml @@ -1,55 +1,55 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Indossabile" name="panel_edit_wearable"> <string name="edit_shape_title"> - Modifica la Shape + Modifica della figura corporea </string> <string name="edit_skin_title"> - Modifica la Skin + Modifica della pelle </string> <string name="edit_hair_title"> - Modifica capelli + Modifica dei capelli </string> <string name="edit_eyes_title"> - Modifica occhi + Modifica degli occhi </string> <string name="edit_shirt_title"> - Modifica camicia + Modifica della camicia </string> <string name="edit_pants_title"> - Modifica pantaloni + Modifica dei pantaloni </string> <string name="edit_shoes_title"> - Modifica scarpe + Modifica delle scarpe </string> <string name="edit_socks_title"> - Modifica calze + Modifica delle calze </string> <string name="edit_jacket_title"> - Modifica Giacca + Modifica della giacca </string> <string name="edit_skirt_title"> - Modifica gonna + Modifica della gonna </string> <string name="edit_gloves_title"> - Modifica guanti + Modifica dei guanti </string> <string name="edit_undershirt_title"> - Modifica maglietta intima + Modifica della maglietta intima </string> <string name="edit_underpants_title"> - Modifica slip + Modifica dello slip </string> <string name="edit_alpha_title"> - Modifica Alpha Mask + Modifica di Alpha Mask </string> <string name="edit_tattoo_title"> - Modifica tatuaggio + Modifica del tatuaggio </string> <string name="shape_desc_text"> - Shape: + Figura corporea: </string> <string name="skin_desc_text"> - Skin: + Pelle: </string> <string name="hair_desc_text"> Capelli: @@ -72,8 +72,8 @@ <string name="jacket_desc_text"> Giacca: </string> - <string name="skirt_skirt_desc_text"> - Giacca: + <string name="skirt_desc_text"> + Gonna: </string> <string name="gloves_desc_text"> Guanti: @@ -90,9 +90,15 @@ <string name="tattoo_desc_text"> Tatuaggio: </string> - <text name="edit_wearable_title" value="Modifica Shape"/> + <text name="edit_wearable_title" value="Modifica della figura corporea"/> <panel label="Camicia" name="wearable_type_panel"> - <text name="description_text" value="Shape:"/> + <text name="description_text" value="Figura corporea:"/> + <radio_group name="sex_radio"> + <radio_item label="" name="sex_male" tool_tip="Maschio" value="1"/> + <radio_item label="" name="sex_female" tool_tip="Femmina" value="0"/> + </radio_group> + <icon name="male_icon" tool_tip="Maschio"/> + <icon name="female_icon" tool_tip="Femmina"/> </panel> <panel name="button_panel"> <button label="Salva con nome" name="save_as_button"/> diff --git a/indra/newview/skins/default/xui/it/panel_friends.xml b/indra/newview/skins/default/xui/it/panel_friends.xml index a3a985f5aa..cfe162a67b 100644 --- a/indra/newview/skins/default/xui/it/panel_friends.xml +++ b/indra/newview/skins/default/xui/it/panel_friends.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="friends"> <string name="Multiple"> - Amici multipli + Più amici </string> <scroll_list name="friend_list" tool_tip="Tieni premuto shift o control mentre clicchi per selezionare più di un amico"> <column name="icon_online_status" tool_tip="Stato Online"/> @@ -16,5 +16,5 @@ <button label="Teleport" name="offer_teleport_btn" tool_tip="Offri a questo amico un teleport per dove sei tu ora"/> <button label="Paga" name="pay_btn" tool_tip="Dai Linden dollar (L$) a questo amico"/> <button label="Rimuovi" name="remove_btn" tool_tip="Rimuovi questa persona dalla tua lista amici"/> - <button label="Aggiungi" name="add_btn" tool_tip="Offri amicizia ad un residente"/> + <button label="Aggiungi" name="add_btn" tool_tip="Offri amicizia a un residente"/> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_group_control_panel.xml b/indra/newview/skins/default/xui/it/panel_group_control_panel.xml index c2bceaeef6..2d17e4a0cd 100644 --- a/indra/newview/skins/default/xui/it/panel_group_control_panel.xml +++ b/indra/newview/skins/default/xui/it/panel_group_control_panel.xml @@ -1,9 +1,17 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="panel_im_control_panel"> - <button label="Profilo del Gruppo" name="group_info_btn"/> - <panel name="panel_call_buttons"> - <button label="Chiama Gruppo" name="call_btn"/> - <button label="Chiudi Chiamata" name="end_call_btn"/> - <button label="Apri Controlli Voice" name="voice_ctrls_btn"/> - </panel> + <layout_stack name="vertical_stack"> + <layout_panel name="group_info_btn_panel"> + <button label="Profilo del gruppo" name="group_info_btn"/> + </layout_panel> + <layout_panel name="call_btn_panel"> + <button label="Chiama il gruppo" name="call_btn"/> + </layout_panel> + <layout_panel name="end_call_btn_panel"> + <button label="Abbandona chiamata" name="end_call_btn"/> + </layout_panel> + <layout_panel name="voice_ctrls_btn_panel"> + <button label="Apri la regolazione voce" name="voice_ctrls_btn"/> + </layout_panel> + </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_group_general.xml b/indra/newview/skins/default/xui/it/panel_group_general.xml index 0ca1ce2064..49baa73811 100644 --- a/indra/newview/skins/default/xui/it/panel_group_general.xml +++ b/indra/newview/skins/default/xui/it/panel_group_general.xml @@ -1,9 +1,9 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Generale" name="general_tab"> <panel.string name="help_text"> - La tabella generale contiene informazioni generali su questo gruppo, lista dei membri, preferenze generali del gruppo e opzioni dei membri. + La scheda generale contiene informazioni generali su questo gruppo, lista dei soci, preferenze del gruppo e opzioni dei soci. -Muovi il tuo mouse sopra le opzioni per maggior aiuto. +Muovi il tuo mouse sopra le opzioni per maggiore aiuto. </panel.string> <panel.string name="group_info_unchanged"> Le informazioni generali sul gruppo sono cambiate @@ -11,27 +11,48 @@ Muovi il tuo mouse sopra le opzioni per maggior aiuto. <panel.string name="incomplete_member_data_str"> Rilevando i dati dei membri </panel.string> + <panel name="group_info_top"> + <texture_picker label="" name="insignia" tool_tip="Clicca per scegliere una fotografia"/> + <text name="prepend_founded_by"> + Fondatore: + </text> + <name_box initial_value="(recupero)" name="founder_name"/> + <text name="join_cost_text"> + Gratis + </text> + <button label="ADERISCI ADESSO!" name="btn_join"/> + </panel> <text_editor name="charter"> Statuto del gruppo </text_editor> <name_list name="visible_members"> - <name_list.columns label="Membro" name="name"/> + <name_list.columns label="Socio" name="name"/> <name_list.columns label="Titolo" name="title"/> + <name_list.columns label="Stato" name="status"/> </name_list> + <text name="my_group_settngs_label"> + Io + </text> <text name="active_title_label"> - Mio Titolo + Il mio titolo: </text> - <combo_box name="active_title" tool_tip="Imposta il titolo nella tag del tuo avatar quando questo gruppo è attivo."/> - <check_box label="Ricevi notice dal gruppo" name="receive_notices" tool_tip="Imposta se vuoi ricevere Notice da questo. De-seleziona questa casella se il gruppo ti manda spam."/> - <check_box label="Mostra nel mio Profilo" name="list_groups_in_profile" tool_tip="Imposta se vuoi mostrare questo gruppo nel tuo profilo"/> + <combo_box name="active_title" tool_tip="Imposta il titolo che compare con il nome del tuo avatar quando questo gruppo è attivo."/> + <check_box label="Ricevi avvisi dal gruppo" name="receive_notices" tool_tip="Imposta se vuoi ricevere avvisi da questo gruppo. Deseleziona questa casella se il gruppo ti manda messaggi indesiderati."/> + <check_box label="Mostra nel mio profilo" name="list_groups_in_profile" tool_tip="Imposta se vuoi mostrare questo gruppo nel tuo profilo"/> <panel name="preferences_container"> - <check_box label="Iscrizione libera" name="open_enrollement" tool_tip="Imposta se questo gruppo permette ai nuovi membri di aderire senza essere invitati."/> - <check_box label="Tassa d'iscrizione" name="check_enrollment_fee" tool_tip="Imposta se richiedere una tassa d'iscrizione per aderire al gruppo"/> - <spinner label="L$" left_delta="136" name="spin_enrollment_fee" tool_tip="I nuovi membri devono pagare questa tassa d'iscrizione quando tassa d'iscrizione è selezionata." width="60"/> - <combo_box name="group_mature_check" tool_tip="Imposta se le informazioni sul tuo gruppo sono da considerarsi Mature."> - <combo_box.item label="Contenuto PG" name="pg"/> - <combo_box.item label="Contenuto Mature" name="mature"/> + <text name="group_settngs_label"> + Gruppo + </text> + <check_box label="Chiunque può aderire" name="open_enrollement" tool_tip="Imposta se questo gruppo permette ai nuovi membri di aderire senza essere invitati."/> + <check_box label="Quota di adesione" name="check_enrollment_fee" tool_tip="Imposta se richiedere una tassa d'iscrizione per aderire al gruppo"/> + <spinner label="L$" left_delta="136" name="spin_enrollment_fee" tool_tip="I nuovi soci devono pagare questa tassa d'iscrizione quando è selezionata." width="60"/> + <combo_box name="group_mature_check" tool_tip="Imposta se le informazioni sul tuo gruppo sono da considerarsi di tipo Moderato."> + <combo_item name="select_mature"> + - Seleziona categoria di accesso - + </combo_item> + <combo_box.item label="Contenuti di tipo Moderato" name="mature"/> + <combo_box.item label="Contenuti di tipo Generale" name="pg"/> </combo_box> - <check_box initial_value="true" label="Mostra nella ricerca" name="show_in_group_list" tool_tip="Permetti alle persone di vedere questo gruppo nei risultati del Cerca"/> + <check_box initial_value="true" label="Mostra nella ricerca" name="show_in_group_list" tool_tip="Permetti alle persone di vedere questo gruppo nei risultati della ricerca"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/it/panel_group_info_sidetray.xml index 26255943ed..da797b309f 100644 --- a/indra/newview/skins/default/xui/it/panel_group_info_sidetray.xml +++ b/indra/newview/skins/default/xui/it/panel_group_info_sidetray.xml @@ -1,36 +1,35 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Informazioni sul gruppo" name="GroupInfo"> +<panel label="Profilo del gruppo" name="GroupInfo"> <panel.string name="default_needs_apply_text"> - Ci sono variazioni non salvate nella tabella attuale + Ci sono modifiche non salvate </panel.string> <panel.string name="want_apply_text"> - Vuoi salvare queste variazioni? + Vuoi salvare le modifiche? </panel.string> <panel.string name="group_join_btn"> - Aderisci (L$[AMOUNT]) + Aderisci ([AMOUNT] L$) </panel.string> <panel.string name="group_join_free"> Gratis </panel.string> - <text name="group_name" value="(Caricando...)"/> - <line_editor label="Scrivi qui il nuovo nome del tuo gruppo" name="group_name_editor"/> - <texture_picker label="" name="insignia" tool_tip="Clicca per scegliere uan fotografia"/> - <text name="prepend_founded_by"> - Fondatore: - </text> - <name_box initial_value="(recuperando)" name="founder_name"/> - <text name="join_cost_text"> - Gratis - </text> - <button label="ADERISCI ORA!" name="btn_join"/> - <accordion name="groups_accordion"> - <accordion_tab name="group_general_tab" title="Generale"/> - <accordion_tab name="group_roles_tab" title="Ruoli"/> - <accordion_tab name="group_notices_tab" title="Notice"/> - <accordion_tab name="group_land_tab" title="Terra/Beni ?????"/> - </accordion> - <panel name="button_row"> - <button label="Crea" label_selected="Nuovo gruppo" name="btn_create"/> - <button label="Salva" label_selected="Salva" name="btn_apply"/> + <panel name="group_info_top"> + <text name="group_name" value="(Caricamento in corso...)"/> + <line_editor label="Scrivi qui il nome del gruppo" name="group_name_editor"/> </panel> + <layout_stack name="layout"> + <layout_panel name="group_accordions"> + <accordion name="groups_accordion"> + <accordion_tab name="group_general_tab" title="Generale"/> + <accordion_tab name="group_roles_tab" title="Ruoli"/> + <accordion_tab name="group_notices_tab" title="Avvisi"/> + <accordion_tab name="group_land_tab" title="Terra/Beni"/> + </accordion> + </layout_panel> + <layout_panel name="button_row"> + <button label="Chat" name="btn_chat"/> + <button label="Chiamata al gruppo" name="btn_call" tool_tip="Chiama questo gruppo"/> + <button label="Salva" label_selected="Salva" name="btn_apply"/> + <button label="Crea un gruppo" name="btn_create" tool_tip="Crea un nuovo gruppo"/> + </layout_panel> + </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_group_invite.xml b/indra/newview/skins/default/xui/it/panel_group_invite.xml index 643d6b05fd..e3cb3c1092 100644 --- a/indra/newview/skins/default/xui/it/panel_group_invite.xml +++ b/indra/newview/skins/default/xui/it/panel_group_invite.xml @@ -7,23 +7,21 @@ (Attendi...) </panel.string> <panel.string name="already_in_group"> - Alcuni avatars sono già nel gruppo e non erano stati invitati. + Alcuni dei residenti selezionati sono già nel gruppo, pertanto l'invito non verrà loro spedito. </panel.string> <text name="help_text"> - Puoi selezionare più di un residente -da invitare nel tuo gruppo. Clicca su -'Scelta residenti' per iniziare. + Puoi selezionare più residenti da invitare nel tuo gruppo. Per iniziare, clicca su Apri il selettore di residenti. </text> <button label="Scelta residenti" name="add_button" tool_tip=""/> - <name_list name="invitee_list" tool_tip="Tieni premuto il tasto Ctrl e clicca il nome dei residenti per una multi-selezione"/> - <button label="Rimuovi i selezionati dall'elenco" name="remove_button" tool_tip="Rimuovi i residenti selezionati dalla lista invito"/> + <name_list name="invitee_list" tool_tip="Tieni premuto Ctrl e fai clic sui nomi dei residenti per selezionare più nomi"/> + <button label="Rimuovi i selezionati dall'elenco" name="remove_button" tool_tip="Rimuove i residenti selezionati dalla lista degli inviti"/> <text name="role_text"> Scegli che ruolo assegnare loro: </text> - <combo_box name="role_name" tool_tip="Choose from the list of Roles you are allowed to assign members to"/> + <combo_box name="role_name" tool_tip="Scegli dall'elenco dei ruoli ai quali ti è consentito assegnare i membri"/> <button label="Manda gli inviti" name="ok_button"/> <button label="Annulla" name="cancel_button"/> <string name="GroupInvitation"> - Invito del Gruppo + Invito di gruppo </string> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_group_land_money.xml b/indra/newview/skins/default/xui/it/panel_group_land_money.xml index a532e7a575..16cc91cd9d 100644 --- a/indra/newview/skins/default/xui/it/panel_group_land_money.xml +++ b/indra/newview/skins/default/xui/it/panel_group_land_money.xml @@ -1,83 +1,84 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Terra & L$" name="land_money_tab"> - <string name="help_text"> - Appare un avviso fino a quando la Terra Totale in Uso è meno o = alla Contribuzione Totale. - </string> - <button label="?" name="help_button"/> - <string name="cant_view_group_land_text"> - Non hai i permessi per vedere la terra posseduta dal gruppo - </string> - <string name="cant_view_group_accounting_text"> - Non hai i permessi per vedere le informazioni sulla contabilità del gruppo. - </string> - <string name="loading_txt"> + <panel.string name="help_text"> + Viene visualizzata un'avvertenza fino a quando il terreno totale in uso è inferiore o uguale al contributo totale. + </panel.string> + <panel.string name="cant_view_group_land_text"> + Non sei autorizzato a vedere quali terreni appartengono al gruppo. + </panel.string> + <panel.string name="epmty_view_group_land_text"> + Nessuna voce + </panel.string> + <panel.string name="cant_view_group_accounting_text"> + Non sei autorizzato a visionare le informazioni finanziarie del gruppo. + </panel.string> + <panel.string name="loading_txt"> Attendi... - </string> - <text name="group_land_heading" width="250"> - Terra posseduta dal gruppo - </text> - <scroll_list name="group_parcel_list"> - <column label="Parcel" name="name"/> - <column label="Regione" name="location"/> - <column label="Tipo" name="type"/> - <column label="Area" name="area"/> - </scroll_list> - <button label="Mappa" label_selected="Mappa" left="282" name="map_button" width="130"/> - <text name="total_contributed_land_label"> - Contribuzione Totale: - </text> - <text name="total_contributed_land_value"> - [AREA] m² - </text> - <text name="total_land_in_use_label"> - Terra totale in uso: - </text> - <text name="total_land_in_use_value"> - [AREA] m² - </text> - <text name="land_available_label"> - Terreno disponibile: - </text> - <text name="land_available_value"> - [AREA] m² - </text> - <text name="your_contribution_label"> - La tua contribuzione: - </text> - <string name="land_contrib_error"> - Incapace di impostare la tua contribuzione di terreno - </string> - <text name="your_contribution_units"> - m² - </text> - <text name="your_contribution_max_value"> - ([IMPORTO] max) - </text> - <text name="group_over_limit_text"> - Sono necessari maggiori crediti di terreno per mantenere la terra in uso - </text> - <text name="group_money_heading"> - L$ del gruppo - </text> + </panel.string> + <panel.string name="land_contrib_error"> + Impossibile definire il tuo contributo di terreno + </panel.string> + <panel name="layout_panel_landmoney"> + <scroll_list name="group_parcel_list"> + <scroll_list.columns label="Lotto" name="name"/> + <scroll_list.columns label="Regione" name="location"/> + <scroll_list.columns label="Tipo" name="type"/> + <scroll_list.columns label="Superficie" name="area"/> + </scroll_list> + <text name="total_contributed_land_label"> + Contributo totale: + </text> + <text name="total_contributed_land_value"> + [AREA] m² + </text> + <button label="Mappa" label_selected="Mappa" name="map_button"/> + <text name="total_land_in_use_label"> + Terreno totale in uso: + </text> + <text name="total_land_in_use_value"> + [AREA] m² + </text> + <text name="land_available_label"> + Terreno disponibile: + </text> + <text name="land_available_value"> + [AREA] m² + </text> + <text name="your_contribution_label"> + Il tuo contributo: + </text> + <text name="your_contribution_units"> + m² + </text> + <text name="your_contribution_max_value"> + ([AMOUNT] max) + </text> + <text name="group_over_limit_text"> + Sono necessari più crediti del terreno per mantenere la terra in uso + </text> + <text name="group_money_heading"> + L$ gruppo + </text> + </panel> <tab_container name="group_money_tab_container"> <panel label="PIANIFICAZIONE" name="group_money_planning_tab"> <text_editor name="group_money_planning_text"> - Caricando... + Caricamento in corso... </text_editor> </panel> <panel label="DETTAGLI" name="group_money_details_tab"> <text_editor name="group_money_details_text"> - Caricando... + Caricamento in corso... </text_editor> <button label="< Precedente" label_selected="< Precedente" name="earlier_details_button" tool_tip="Indietro" width="90"/> - <button label="Successivo >" label_selected="Successivo >" left_delta="260" name="later_details_button" tool_tip="Prossimo" width="90"/> + <button label="Successivo >" label_selected="Successivo >" left_delta="260" name="later_details_button" tool_tip="Avanti" width="90"/> </panel> <panel label="VENDITE" name="group_money_sales_tab"> <text_editor name="group_money_sales_text"> - Caricando... + Caricamento in corso... </text_editor> <button label="< Precedente" label_selected="< Precedente" name="earlier_sales_button" tool_tip="Indietro" width="90"/> - <button label="Successivo >" label_selected="Successivo >" left_delta="260" name="later_sales_button" tool_tip="Prossimo" width="90"/> + <button label="Successivo >" label_selected="Successivo >" left_delta="260" name="later_sales_button" tool_tip="Avanti" width="90"/> </panel> </tab_container> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_group_list_item.xml b/indra/newview/skins/default/xui/it/panel_group_list_item.xml index 3e5419d1bb..7cdc4c7ff6 100644 --- a/indra/newview/skins/default/xui/it/panel_group_list_item.xml +++ b/indra/newview/skins/default/xui/it/panel_group_list_item.xml @@ -1,4 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="group_list_item"> <text name="group_name" value="Sconosciuto"/> + <button name="profile_btn" tool_tip="Vedi profilo"/> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_group_notices.xml b/indra/newview/skins/default/xui/it/panel_group_notices.xml index dbeb9d56ff..8dd945830e 100644 --- a/indra/newview/skins/default/xui/it/panel_group_notices.xml +++ b/indra/newview/skins/default/xui/it/panel_group_notices.xml @@ -5,10 +5,10 @@ Puoi disattivare la ricezione delle notice nella finestra principale. </panel.string> <panel.string name="no_notices_text"> - Non ci sono vecchie Notice + Non ci sono avvisi precedenti </panel.string> <text name="lbl2"> - Le Notice sono conservate per 14 giorni. + Gli avvisi sono conservati per 14 giorni. Massimo 200 per gruppo al giorno </text> <scroll_list name="notice_list"> @@ -17,10 +17,10 @@ Massimo 200 per gruppo al giorno <scroll_list.columns label="Data" name="date"/> </scroll_list> <text name="notice_list_none_found"> - Nessuna trovata + Nessuno trovato </text> - <button label="Crea una nuova notice" label_selected="Crea una nuova notice" name="create_new_notice" tool_tip="Crea una nuova notice"/> - <button label="Aggiorna" label_selected="Aggiorna l'elenco" name="refresh_notices" tool_tip="Aggiorna la lista delle notice"/> + <button label="Crea un nuovo avviso" label_selected="Crea una nuova notice" name="create_new_notice" tool_tip="Crea un nuovo avviso"/> + <button label="Aggiorna" label_selected="Aggiorna l'elenco" name="refresh_notices" tool_tip="Aggiorna la lista degli avvisi"/> <panel label="Crea una nuova notice" name="panel_create_new_notice"> <text name="lbl"> Crea una notice @@ -40,16 +40,17 @@ Massimo 200 per gruppo al giorno <text name="string"> Trascina e rilascia qui l'oggetto da allegare: </text> - <button label="Rimuovi" label_selected="Rimuovi allegato" name="remove_attachment"/> - <button label="Spedisci" label_selected="Spedisci" name="send_notice"/> - <group_drop_target name="drop_target" tool_tip="Trascina un oggetto dall'inventario nello spazio ALLEGA per spedirlo con la notice. Devi avere i permessi copy e transfer relativi all'oggetto da allegare."/> + <button label="Inventario" name="open_inventory" tool_tip="Apri l'inventario"/> + <button label="Rimuovi" label_selected="Rimuovi allegato" name="remove_attachment" tool_tip="Rimuovi allegato dal tuo avviso"/> + <button label="Invia" label_selected="Invia" name="send_notice"/> + <group_drop_target name="drop_target" tool_tip="Trascina un oggetto dall'inventario Ãn questa casella per spedirlo con questo avviso. Devi avere i diritti per la copia e il trasferimento per poter allegare l'oggetto."/> </panel> <panel label="Vedi le notice precedenti" name="panel_view_past_notice"> <text name="lbl"> Notice archiviate </text> <text name="lbl2"> - Per spedire una nuova notice, clicca il bottone + + Per spedire un nuovo avviso, clicca sul pulsante + </text> <text name="lbl3"> Oggetto: @@ -57,6 +58,6 @@ Massimo 200 per gruppo al giorno <text name="lbl4"> Messaggio: </text> - <button label="Apri allegato" label_selected="Apri l'allegato" name="open_attachment"/> + <button label="Apri l'allegato" label_selected="Apri l'allegato" name="open_attachment"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_group_notify.xml b/indra/newview/skins/default/xui/it/panel_group_notify.xml index de6b139793..91a41353a5 100644 --- a/indra/newview/skins/default/xui/it/panel_group_notify.xml +++ b/indra/newview/skins/default/xui/it/panel_group_notify.xml @@ -1,8 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="instant_message" name="panel_group_notify"> <panel label="header" name="header"> - <text name="title" value="Nome di chi spedisce / Nome del Gruppo"/> + <text name="title" value="Nome del mittente / Nome del gruppo"/> </panel> - <text name="attachment" value="Attachment"/> - <button label="Ok" name="btn_ok"/> + <text name="attachment" value="Allegato"/> + <button label="OK" name="btn_ok"/> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_group_roles.xml b/indra/newview/skins/default/xui/it/panel_group_roles.xml index bc98fdacaf..1769ef748d 100644 --- a/indra/newview/skins/default/xui/it/panel_group_roles.xml +++ b/indra/newview/skins/default/xui/it/panel_group_roles.xml @@ -1,41 +1,42 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Membri & Ruoli" name="roles_tab"> <panel.string name="default_needs_apply_text"> - Ci sono modifiche non salvate nella scheda attuale + Ci sono modifiche non salvate </panel.string> <panel.string name="want_apply_text"> - Vuoi salvare queste modifiche? + Vuoi salvare le modifiche? </panel.string> - <tab_container height="164" name="roles_tab_container"> - <panel height="148" label="MEMBRI" name="members_sub_tab" tool_tip="Membri"> + <tab_container name="roles_tab_container"> + <panel label="MEMBRI" name="members_sub_tab" tool_tip="Membri"> <panel.string name="help_text"> Puoi aggiungere o rimuovere i ruoli assegnati ai membri. Seleziona più membri tenendo premuto il tasto Ctrl e cliccando sui loro nomi. </panel.string> <filter_editor label="Filtra Membri" name="filter_input"/> - <name_list bottom_delta="-105" height="104" name="member_list"> - <name_list.columns label="Nome del Membro" name="name"/> + <name_list name="member_list"> + <name_list.columns label="Socio" name="name"/> <name_list.columns label="Donazioni" name="donated"/> - <name_list.columns label="Status" name="online"/> + <name_list.columns label="Stato" name="online"/> </name_list> - <button label="Invita" name="member_invite" width="165"/> + <button label="Invita" name="member_invite"/> <button label="Espelli" name="member_eject"/> </panel> - <panel height="148" label="RUOLI" name="roles_sub_tab"> + <panel label="RUOLI" name="roles_sub_tab"> <panel.string name="help_text"> - I ruoli hanno un titolo con un elenco di abilità permesse che i membri possono eseguire. - I membri possono avere uno o più ruoli. Un gruppo può avere fino a 10 ruoli, inclusi il ruolo base o "Membro" e - il ruolo del Capogruppo. + I ruoli hanno un titolo con un elenco di abilità permesse +che i membri possono eseguire. I membri possono avere +uno o più ruoli. Un gruppo può avere fino a 10 ruoli, +fra cui il ruolo base o "Tutti" e il ruolo del Proprietario, ovvero il capogruppo. </panel.string> <panel.string name="cant_delete_role"> - I Ruoli 'Everyone' e 'Owners' sono speciali e non possono essere cancellati. + I ruoli 'Tutti' e 'Proprietari' sono speciali e non possono essere eliminati. </panel.string> <panel.string name="power_folder_icon"> - Cartella Inventario chiusa + Inv_FolderClosed </panel.string> <filter_editor label="Filtra i ruoli" name="filter_input"/> - <scroll_list bottom_delta="-104" height="104" name="role_list"> + <scroll_list name="role_list"> <scroll_list.columns label="Ruolo" name="name"/> <scroll_list.columns label="Titolo" name="title"/> <scroll_list.columns label="#" name="members"/> @@ -43,7 +44,7 @@ cliccando sui loro nomi. <button label="Crea nuovo ruolo" name="role_create"/> <button label="Elimina ruolo" name="role_delete"/> </panel> - <panel height="148" label="ABILITA'" name="actions_sub_tab" tool_tip="Puoi vedere la descrizione dell'abilità e quali Ruoli o Membri possono eseguirla."> + <panel height="148" label="ABILITÀ" name="actions_sub_tab" tool_tip="Puoi vedere la descrizione dell'abilità e quali ruoli o membri possono eseguirla."> <panel.string name="help_text"> Le abilità permettono ai membri nei ruoli di fare cose specifiche in questo gruppo. C'è una vasta gamma di abilità . @@ -54,22 +55,22 @@ in questo gruppo. C'è una vasta gamma di abilità . </tab_container> <panel name="members_footer"> <text name="static"> - Membri assegnati + Ruoli assegnati </text> <text name="static2"> Abilità permesse </text> - <scroll_list name="member_allowed_actions" tool_tip="Per i dettagli di ogni abilità consentita vedi il pannello abilità ."/> + <scroll_list name="member_allowed_actions" tool_tip="Per i dettagli di ogni abilità consentita vedi la scheda abilità ."/> </panel> <panel name="roles_footer"> <text name="static"> - Nome del Ruolo + Nome del ruolo </text> <line_editor name="role_name"> Addetti </line_editor> <text name="static3"> - Titolo del Ruolo + Titolo del ruolo </text> <line_editor name="role_title"> (attendi) @@ -83,11 +84,11 @@ in questo gruppo. C'è una vasta gamma di abilità . <text name="static4"> Ruoli assegnati </text> - <check_box label="Mostrare i membri" name="role_visible_in_list" tool_tip="Imposta nella tabella Generale per i membri con questo ruolo di poter essere visti dalle persone esterne a questo gruppo."/> + <check_box label="Visualizza membri" name="role_visible_in_list" tool_tip="Imposta nella scheda Generale se i membri con questo ruolo possono essere visti dai residenti esterni a questo gruppo."/> <text name="static5" tool_tip="Una lista delle abilità che il ruolo ora selezionato può eseguire."> Abilità permesse </text> - <scroll_list name="role_allowed_actions" tool_tip="Per i dettagli di ogni abilità consentita vedi il pannello abilità ."/> + <scroll_list name="role_allowed_actions" tool_tip="Per i dettagli di ogni abilità consentita vedi la scheda abilità ."/> </panel> <panel name="actions_footer"> <text name="static"> diff --git a/indra/newview/skins/default/xui/it/panel_im_control_panel.xml b/indra/newview/skins/default/xui/it/panel_im_control_panel.xml index f6c3fa9288..76b28eab24 100644 --- a/indra/newview/skins/default/xui/it/panel_im_control_panel.xml +++ b/indra/newview/skins/default/xui/it/panel_im_control_panel.xml @@ -1,13 +1,29 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="panel_im_control_panel"> - <text name="avatar_name" value="Sconosciuto"/> - <button label="Profilo" name="view_profile_btn"/> - <button label="Aggiungi Amico" name="add_friend_btn"/> - <button label="Teleport" name="teleport_btn"/> - <button label="Condividi" name="share_btn"/> - <panel name="panel_call_buttons"> - <button label="Chiama" name="call_btn"/> - <button label="Abbandona chiamata" name="end_call_btn"/> - <button label="Controllo Voice" name="voice_ctrls_btn"/> - </panel> + <layout_stack name="button_stack"> + <layout_panel name="view_profile_btn_panel"> + <button label="Profilo" name="view_profile_btn"/> + </layout_panel> + <layout_panel name="add_friend_btn_panel"> + <button label="Aggiungi amico" name="add_friend_btn"/> + </layout_panel> + <layout_panel name="teleport_btn_panel"> + <button label="Teleport" name="teleport_btn" tool_tip="Offri teleport a questa persona"/> + </layout_panel> + <layout_panel name="share_btn_panel"> + <button label="Condividi" name="share_btn"/> + </layout_panel> + <layout_panel name="pay_btn_panel"> + <button label="Paga" name="pay_btn"/> + </layout_panel> + <layout_panel name="call_btn_panel"> + <button label="Chiama" name="call_btn"/> + </layout_panel> + <layout_panel name="end_call_btn_panel"> + <button label="Chiudi chiamata" name="end_call_btn"/> + </layout_panel> + <layout_panel name="voice_ctrls_btn_panel"> + <button label="Regolazione voce" name="voice_ctrls_btn"/> + </layout_panel> + </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_inventory_item.xml b/indra/newview/skins/default/xui/it/panel_inventory_item.xml new file mode 100644 index 0000000000..d18047fbcf --- /dev/null +++ b/indra/newview/skins/default/xui/it/panel_inventory_item.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="inventory_item"> + <text name="item_name" value="..."/> +</panel> diff --git a/indra/newview/skins/default/xui/it/panel_landmark_info.xml b/indra/newview/skins/default/xui/it/panel_landmark_info.xml index 5908a873cc..b4c5ab01bc 100644 --- a/indra/newview/skins/default/xui/it/panel_landmark_info.xml +++ b/indra/newview/skins/default/xui/it/panel_landmark_info.xml @@ -1,36 +1,37 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="landmark_info"> - <string name="title_create_landmark" value="Crea Landmark"/> - <string name="title_edit_landmark" value="Modifica Landmark"/> - <string name="title_landmark" value="Landmark"/> - <string name="not_available" value="(N\A)"/> + <string name="title_create_landmark" value="Crea punto di riferimento"/> + <string name="title_edit_landmark" value="Modifica punto di riferimento"/> + <string name="title_landmark" value="Punto di riferimento"/> + <string name="not_available" value="(non pert.)"/> <string name="unknown" value="(sconosciuto)"/> <string name="public" value="(pubblico)"/> <string name="server_update_text"> - Info sul luogo non disponibili senza l'aggiornamento del server. + Informazioni sul luogo non disponibili senza l'aggiornamento del server. </string> <string name="server_error_text"> - Info su questo luogo non disponibili ora, prova più tardi. + Informazioni su questo luogo non disponibili al momento, riprova più tardi. </string> <string name="server_forbidden_text"> - Info su questo luogo non disponibili a causa delle restrizioni di accesso. Controlla i tuoi permessi con il proprietario del terreno . + Informazioni su questo luogo non disponibili a causa delle limitazioni di accesso. Controlla i tuoi permessi con il proprietario del terreno. </string> <string name="acquired_date"> [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local] </string> - <text name="title" value="Colloca Profilo"/> + <button name="back_btn" tool_tip="Indietro"/> + <text name="title" value="Profilo del luogo"/> <scroll_container name="place_scroll"> <panel name="scrolling_panel"> <text name="maturity_value" value="sconosciuto"/> <panel name="landmark_info_panel"> <text name="owner_label" value="Proprietario:"/> - <text name="creator_label" value="Creatore:"/> + <text name="creator_label" value="Ideatore:"/> <text name="created_label" value="Creato:"/> </panel> <panel name="landmark_edit_panel"> <text name="title_label" value="Titolo:"/> - <text name="notes_label" value="Mie note:"/> - <text name="folder_label" value="Landmark del luogo:"/> + <text name="notes_label" value="Le mie note:"/> + <text name="folder_label" value="Ubicazione punto di riferimento:"/> </panel> </panel> </scroll_container> diff --git a/indra/newview/skins/default/xui/it/panel_landmarks.xml b/indra/newview/skins/default/xui/it/panel_landmarks.xml index 0efeaac97d..74cd9e6fb1 100644 --- a/indra/newview/skins/default/xui/it/panel_landmarks.xml +++ b/indra/newview/skins/default/xui/it/panel_landmarks.xml @@ -2,13 +2,13 @@ <panel name="Landmarks"> <accordion name="landmarks_accordion"> <accordion_tab name="tab_favorites" title="Barra dei Preferiti"/> - <accordion_tab name="tab_landmarks" title="Landmarks"/> - <accordion_tab name="tab_inventory" title="Mio Inventario"/> + <accordion_tab name="tab_landmarks" title="I miei punti di riferimento"/> + <accordion_tab name="tab_inventory" title="Il mio inventario"/> <accordion_tab name="tab_library" title="Libreria"/> </accordion> <panel name="bottom_panel"> <button name="options_gear_btn" tool_tip="Mostra opzioni addizionali"/> - <button name="add_btn" tool_tip="Aggiungi nuovo landmark"/> - <dnd_button name="trash_btn" tool_tip="Rimuovi landmark selezionato"/> + <button name="add_btn" tool_tip="Aggiungi un nuovo punto di riferimento"/> + <dnd_button name="trash_btn" tool_tip="Rimuovi il punto di riferimento selezionato"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_login.xml b/indra/newview/skins/default/xui/it/panel_login.xml index 7706a044fa..473bcfa88d 100644 --- a/indra/newview/skins/default/xui/it/panel_login.xml +++ b/indra/newview/skins/default/xui/it/panel_login.xml @@ -8,26 +8,33 @@ </panel.string> <layout_stack name="login_widgets"> <layout_panel name="login"> - <text name="first_name_text"> - Nome: + <text name="username_text"> + Nome utente: </text> - <line_editor label="Nome" name="first_name_edit" tool_tip="[SECOND_LIFE] First Name"/> - <line_editor label="Cognome" name="last_name_edit" tool_tip="[SECOND_LIFE] Last Name"/> - <check_box label="Ricordare" name="remember_check"/> + <line_editor label="Nome utente" name="username_edit" tool_tip="Nome utente [SECOND_LIFE]"/> + <text name="password_text"> + Password: + </text> + <check_box label="Ricorda password" name="remember_check"/> + <button label="Accedi" name="connect_btn"/> <text name="start_location_text"> - Iniziare presso: + Inizia da: </text> <combo_box name="start_location_combo"> + <combo_box.item label="La mia ultima ubicazione" name="MyLastLocation"/> <combo_box.item label="Casa mia" name="MyHome"/> + <combo_box.item label="<Scrivi nome regione>" name="Typeregionname"/> </combo_box> - <button label="Log In" name="connect_btn"/> </layout_panel> <layout_panel name="links"> <text name="create_new_account_text"> - Aderire + Iscriviti + </text> + <text name="forgot_password_text"> + Hai dimenticato il nome o la password? </text> <text name="login_help"> - Aiuto quando log in? + Ti serve aiuto con la fase di accesso? </text> </layout_panel> </layout_stack> diff --git a/indra/newview/skins/default/xui/it/panel_main_inventory.xml b/indra/newview/skins/default/xui/it/panel_main_inventory.xml index edaab6e60c..446b51ffa3 100644 --- a/indra/newview/skins/default/xui/it/panel_main_inventory.xml +++ b/indra/newview/skins/default/xui/it/panel_main_inventory.xml @@ -1,64 +1,28 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Cose" name="main inventory panel"> - <panel.string name="Title"> - Cose + <panel.string name="ItemcountFetching"> + Recupero di [ITEM_COUNT] oggetti... [FILTER] </panel.string> + <panel.string name="ItemcountCompleted"> + [ITEM_COUNT] oggetti [FILTER] + </panel.string> + <text name="ItemcountText"> + Oggetti: + </text> <filter_editor label="Filtro" name="inventory search editor"/> <tab_container name="inventory filter tabs"> <inventory_panel label="Tutti gli elementi" name="All Items"/> - <inventory_panel label="Elementi recenti" name="Recent Items"/> + <recent_inventory_panel label="Elementi recenti" name="Recent Items"/> </tab_container> - <panel name="bottom_panel"> - <button name="options_gear_btn" tool_tip="Mostra ulteriori opzioni"/> - <button name="add_btn" tool_tip="Aggiungi nuovo elemento"/> - <dnd_button name="trash_btn" tool_tip="Rimuovi l'elemento selezionato"/> - </panel> - <menu_bar name="Inventory Menu"> - <menu label="File" name="File"> - <menu_item_call label="Apri" name="Open"/> - <menu label="Carica nel server" name="upload"> - <menu_item_call label="Immagine ([COST]L$)..." name="Upload Image"/> - <menu_item_call label="Suono ([COST]L$)..." name="Upload Sound"/> - <menu_item_call label="Animazione ([COST]L$)..." name="Upload Animation"/> - <menu_item_call label="In blocco ([COST]L$ per file)..." name="Bulk Upload"/> - </menu> - <menu_item_call label="Nuova Finestra" name="New Window"/> - <menu_item_call label="Mostra Filtri" name="Show Filters"/> - <menu_item_call label="Cancella Filtri" name="Reset Current"/> - <menu_item_call label="Chiudi tutte le Cartelle" name="Close All Folders"/> - <menu_item_call label="Svuota Cestino" name="Empty Trash"/> - <menu_item_call label="Svuota Oggetti Smarriti" name="Empty Lost And Found"/> - </menu> - <menu label="Crea" name="Create"> - <menu_item_call label="Nuova Cartella" name="New Folder"/> - <menu_item_call label="Nuovo Script" name="New Script"/> - <menu_item_call label="Nuova Notecard" name="New Note"/> - <menu_item_call label="Nuova Gesture" name="New Gesture"/> - <menu label="Nuovi Abiti" name="New Clothes"> - <menu_item_call label="Nuova Camicia" name="New Shirt"/> - <menu_item_call label="Nuovi Pantaloni" name="New Pants"/> - <menu_item_call label="Nuove Scarpe" name="New Shoes"/> - <menu_item_call label="Nuove Calze" name="New Socks"/> - <menu_item_call label="Nuova Giacca" name="New Jacket"/> - <menu_item_call label="Nuova Gonna" name="New Skirt"/> - <menu_item_call label="Nuovi Guanti" name="New Gloves"/> - <menu_item_call label="Nuova Maglietta Intima" name="New Undershirt"/> - <menu_item_call label="Nuovi Slip" name="New Underpants"/> - <menu_item_call label="Nuovo Alfa (Trasparenza)" name="New Alpha"/> - <menu_item_call label="Nuovo Tatuaggio" name="New Tattoo"/> - </menu> - <menu label="Nuove Parti del Corpo" name="New Body Parts"> - <menu_item_call label="Nuova Shape" name="New Shape"/> - <menu_item_call label="Nuova Pelle" name="New Skin"/> - <menu_item_call label="Nuovi Capelli" name="New Hair"/> - <menu_item_call label="Nuovi Occhi" name="New Eyes"/> - </menu> - </menu> - <menu label="Ordina" name="Sort"> - <menu_item_check label="Per Nome" name="By Name"/> - <menu_item_check label="Per Data" name="By Date"/> - <menu_item_check label="Cartelle sempre per Nome" name="Folders Always By Name"/> - <menu_item_check label="Cartelle di sistema all'inizio" name="System Folders To Top"/> - </menu> - </menu_bar> + <layout_stack name="bottom_panel"> + <layout_panel name="options_gear_btn_panel"> + <button name="options_gear_btn" tool_tip="Mostra opzioni addizionali"/> + </layout_panel> + <layout_panel name="add_btn_panel"> + <button name="add_btn" tool_tip="Aggiungi nuovo elemento"/> + </layout_panel> + <layout_panel name="trash_btn_panel"> + <dnd_button name="trash_btn" tool_tip="Rimuovi l'articolo selezionato"/> + </layout_panel> + </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_me.xml b/indra/newview/skins/default/xui/it/panel_me.xml index 03678ecad5..66601aa165 100644 --- a/indra/newview/skins/default/xui/it/panel_me.xml +++ b/indra/newview/skins/default/xui/it/panel_me.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Mio Profilo" name="panel_me"> +<panel label="Il mio profilo" name="panel_me"> <tab_container name="tabs"> - <panel label="PROFILO" name="panel_profile"/> - <panel label="PREFERITI" name="panel_picks"/> + <panel label="IL MIO PROFILO" name="panel_profile"/> + <panel label="I MIEI PREFERITI" name="panel_picks"/> </tab_container> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_media_settings_general.xml b/indra/newview/skins/default/xui/it/panel_media_settings_general.xml index cb629e5cfb..5ed7b23679 100644 --- a/indra/newview/skins/default/xui/it/panel_media_settings_general.xml +++ b/indra/newview/skins/default/xui/it/panel_media_settings_general.xml @@ -4,27 +4,27 @@ Home Page: </text> <text name="home_fails_whitelist_label"> - (Questa pagina non passa la lista bianca specifica) + (Questa pagina non supera la revisione o lista bianca specifica) </text> - <line_editor name="home_url" tool_tip="La home page per questa fonte media"/> + <line_editor name="home_url" tool_tip="La home page per questa fonte multimediale"/> <text name="preview_label"> Anteprima </text> <text name="current_url_label"> Pagina attuale: </text> - <text name="current_url" tool_tip="La pagina attuale per questa fonte media" value=""/> - <button label="Resetta" name="current_url_reset_btn"/> - <check_box initial_value="false" label="Auto Loop" name="auto_loop"/> - <check_box initial_value="false" label="Primo Click Interagisce" name="first_click_interact"/> - <check_box initial_value="false" label="Auto Zoom" name="auto_zoom"/> - <check_box initial_value="false" label="Auto Play Media" name="auto_play"/> + <text name="current_url" tool_tip="La pagina attuale per questa fonte multimediale" value=""/> + <button label="Reimposta" name="current_url_reset_btn"/> + <check_box initial_value="false" label="Ripetizione automatica" name="auto_loop"/> + <check_box initial_value="false" label="Interazione col primo clic" name="first_click_interact"/> + <check_box initial_value="false" label="Zoom automatico" name="auto_zoom"/> + <check_box initial_value="false" label="Riproduzione multimediale automatica" name="auto_play"/> <text name="media_setting_note"> - Nota: I Residenti possono annullare questa impostazione + Nota: I residenti possono annullare questa impostazione </text> - <check_box initial_value="false" label="Auto Scale Media on Face of Object" name="auto_scale"/> + <check_box initial_value="false" label="Messa in scala automatica dell'elemento multimediale sulla faccia dell'oggetto" name="auto_scale"/> <text name="size_label"> - Misura: + Dimensioni: </text> <text name="X_label"> X diff --git a/indra/newview/skins/default/xui/it/panel_media_settings_permissions.xml b/indra/newview/skins/default/xui/it/panel_media_settings_permissions.xml index 551d86864d..0f0f1c9fe4 100644 --- a/indra/newview/skins/default/xui/it/panel_media_settings_permissions.xml +++ b/indra/newview/skins/default/xui/it/panel_media_settings_permissions.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Personalizza" name="Media settings for controls"> <text name="controls_label"> - Controlli: + Regolazioni: </text> <combo_box name="controls"> <combo_item name="Standard"> @@ -11,10 +11,19 @@ Mini </combo_item> </combo_box> - <check_box initial_value="false" label="Permetti Navigazione & Interattività " name="perms_owner_interact"/> + <text name="owner_label"> + Proprietario + </text> + <check_box initial_value="false" label="Permetti navigazione e interattività " name="perms_owner_interact"/> <check_box initial_value="false" label="Mostra la barra di controllo" name="perms_owner_control"/> - <check_box initial_value="false" label="Permetti Navigazione & Interattività " name="perms_group_interact"/> + <text name="group_label"> + Gruppo: + </text> + <check_box initial_value="false" label="Permetti navigazione e interattività " name="perms_group_interact"/> <check_box initial_value="false" label="Mostra la barra di controllo" name="perms_group_control"/> - <check_box initial_value="false" label="Permetti Navigazione & Interattività " name="perms_anyone_interact"/> + <text name="anyone_label"> + Chiunque + </text> + <check_box initial_value="false" label="Permetti navigazione e interattività " name="perms_anyone_interact"/> <check_box initial_value="false" label="Mostra la barra di controllo" name="perms_anyone_control"/> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_media_settings_security.xml b/indra/newview/skins/default/xui/it/panel_media_settings_security.xml index 0df0331198..785cd048a1 100644 --- a/indra/newview/skins/default/xui/it/panel_media_settings_security.xml +++ b/indra/newview/skins/default/xui/it/panel_media_settings_security.xml @@ -1,12 +1,12 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Sicurezza" name="Media Settings Security"> - <check_box initial_value="false" label="Accesso permesso solo a URLs specificati (by prefix)" name="whitelist_enable"/> + <check_box initial_value="false" label="Permetti l'accesso solo ai modelli di URL specificati" name="whitelist_enable"/> <text name="home_url_fails_some_items_in_whitelist"> - Annota che le home page mancate sono segnate: + Le mancate aperture di home page sono segnalate: </text> <button label="Aggiungi" name="whitelist_add"/> - <button label="Cancella" name="whitelist_del"/> + <button label="Elimina" name="whitelist_del"/> <text name="home_url_fails_whitelist"> - Attenzione: la home page specificata nella Tabella General non ha passato questa lista bianca. E' stata disattivata fino a quando non sarà aggiunta un entrata valid. + Avvertenza: la home page specificata nella scheda Generale non ha superato la lista bianca. Viene disabilitata fino a che non venga inserita una voce valida. </text> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_my_profile.xml b/indra/newview/skins/default/xui/it/panel_my_profile.xml index 60faf4e7c5..08c050228f 100644 --- a/indra/newview/skins/default/xui/it/panel_my_profile.xml +++ b/indra/newview/skins/default/xui/it/panel_my_profile.xml @@ -1,37 +1,35 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Profilo" name="panel_profile"> <string name="no_partner_text" value="Nessuno"/> + <string name="no_group_text" value="Nessuno"/> <string name="RegisterDateFormat"> [REG_DATE] ([AGE]) </string> - <scroll_container name="profile_scroll"> - <panel name="scroll_content_panel"> - <panel name="second_life_image_panel"> - <icon label="" name="2nd_life_edit_icon" tool_tip="Clicca il pulsante inferiore Modifica Profilo per cambiare immagine"/> - </panel> - <panel name="first_life_image_panel"> - <icon label="" name="real_world_edit_icon" tool_tip="Clicca il pulsante inferiore Modifica Profilo per cambiare immagine"/> - <text name="title_rw_descr_text" value="Mondo Reale:"/> - </panel> - <text name="me_homepage_text"> - Homepage: - </text> - <text name="title_member_text" value="Membro dal:"/> - <text name="title_acc_status_text" value="Stato dell'account:"/> - <text name="acc_status_text" value="Residente. Nessuna info di pagamento."/> - <text name="title_partner_text" value="Partner:"/> - <text name="title_groups_text" value="Gruppi:"/> - </panel> - </scroll_container> - <panel name="profile_buttons_panel"> - <button label="Aggiungi amico" name="add_friend"/> - <button label="IM" name="im"/> - <button label="Chiama" name="call"/> - <button label="Mappa" name="show_on_map_btn"/> - <button label="Teleport" name="teleport"/> - </panel> - <panel name="profile_me_buttons_panel"> - <button label="Modifica Profilo" name="edit_profile_btn" tool_tip="Modifica le tue informazioni personali"/> - <button label="Modifica aspetto" name="edit_appearance_btn" tool_tip="Crea/modifica la tua apparenza: aspetto fisico, vestiti, etc."/> - </panel> + <layout_stack name="layout"> + <layout_panel name="profile_stack"> + <scroll_container name="profile_scroll"> + <panel name="scroll_content_panel"> + <panel name="second_life_image_panel"> + <icon label="" name="2nd_life_edit_icon" tool_tip="Clicca sul pulsante Modifica profilo per cambiare l'immagine"/> + <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/> + </panel> + <panel name="first_life_image_panel"> + <icon label="" name="real_world_edit_icon" tool_tip="Clicca sul pulsante Modifica profilo per cambiare l'immagine"/> + <text name="title_rw_descr_text" value="Mondo reale:"/> + </panel> + <text name="title_member_text" value="Residente dal:"/> + <text name="title_acc_status_text" value="Stato account:"/> + <text name="title_partner_text" value="Partner:"/> + <panel name="partner_data_panel"> + <name_box initial_value="(recupero)" name="partner_text"/> + </panel> + <text name="title_groups_text" value="Gruppi:"/> + </panel> + </scroll_container> + </layout_panel> + <layout_panel name="profile_me_buttons_panel"> + <button label="Modifica profilo" name="edit_profile_btn" tool_tip="Modifica le tue informazioni personali"/> + <button label="Modifica aspetto fisico" name="edit_appearance_btn" tool_tip="Crea/modifica il tuo aspetto: parti del corpo, abiti ecc."/> + </layout_panel> + </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_navigation_bar.xml b/indra/newview/skins/default/xui/it/panel_navigation_bar.xml index 2e057c2983..8e72167759 100644 --- a/indra/newview/skins/default/xui/it/panel_navigation_bar.xml +++ b/indra/newview/skins/default/xui/it/panel_navigation_bar.xml @@ -1,15 +1,18 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="navigation_bar"> <panel name="navigation_panel"> - <button name="back_btn" tool_tip="Ritorna al luogo precedente"/> - <button name="forward_btn" tool_tip="Vai ad un luogo"/> - <button name="home_btn" tool_tip="Teleport a casa mia"/> - <location_input label="Luogo" name="location_combo"/> + <pull_button name="back_btn" tool_tip="Torna al luogo precedente"/> + <pull_button name="forward_btn" tool_tip="Procedi un luogo in avanti"/> + <button name="home_btn" tool_tip="Teleport a casa"/> + <location_input label="Posizione" name="location_combo"/> <search_combo_box label="Cerca" name="search_combo_box" tool_tip="Cerca"> <combo_editor label="Cerca [SECOND_LIFE]" name="search_combo_editor"/> </search_combo_box> </panel> - <favorites_bar name="favorite"> - <chevron_button name=">>" tool_tip="Mostra più dei miei Preferiti"/> + <favorites_bar name="favorite" tool_tip="Trascina qui i punti di riferimento per un accesso rapido ai tuoi posti preferiti in Second Life."> + <label name="favorites_bar_label" tool_tip="Trascina qui i punti di riferimento per un accesso rapido ai tuoi posti preferiti in Second Life."> + Barra dei Preferiti + </label> + <chevron_button name=">>" tool_tip="Mostra altri Preferiti"/> </favorites_bar> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/it/panel_nearby_chat_bar.xml index 0361eb49ed..6317d3192e 100644 --- a/indra/newview/skins/default/xui/it/panel_nearby_chat_bar.xml +++ b/indra/newview/skins/default/xui/it/panel_nearby_chat_bar.xml @@ -6,6 +6,6 @@ <string name="max_width"> 320 </string> - <line_editor label="Clicca qui per la chat." name="chat_box" tool_tip="Premi Invio per dire, Ctrl+Invio per gridare"/> - <button name="show_nearby_chat" tool_tip="Mostra/Nasconde la chat log nei dintorni"/> + <line_editor label="Clicca qui per la chat." name="chat_box" tool_tip="Premi Invio per parlare, Ctrl+Invio per gridare"/> + <button name="show_nearby_chat" tool_tip="Mostra/Nasconde il registro della chat nei dintorni"/> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_nearby_media.xml b/indra/newview/skins/default/xui/it/panel_nearby_media.xml new file mode 100644 index 0000000000..01e21d520a --- /dev/null +++ b/indra/newview/skins/default/xui/it/panel_nearby_media.xml @@ -0,0 +1,65 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="nearby_media"> + <string name="media_item_count_format"> + (%ld oggetti multimediali) + </string> + <string name="empty_item_text"> + <vuoto> + </string> + <string name="parcel_media_name"> + Streaming media del lotto + </string> + <string name="parcel_audio_name"> + Streaming audio del lotto + </string> + <string name="playing_suffix"> + (riproduzione) + </string> + <panel name="minimized_controls"> + <button label="Spegni" name="all_nearby_media_disable_btn" tool_tip="Spegni tutti i media nei dintorni"/> + <button label="Accendi tutto" name="all_nearby_media_enable_btn" tool_tip="Accendi tutti i media nei dintorni"/> + <button name="open_prefs_btn" tool_tip="Accedi alle preferenze del media"/> + <button label="Più >>" label_selected="Meno <<" name="more_btn" tool_tip="Opzioni avanzate"/> + <button label="Più >>" label_selected="Meno <<" name="less_btn" tool_tip="Opzioni avanzate"/> + </panel> + <panel name="nearby_media_panel"> + <combo_box name="show_combo"> + <combo_box.item label="Tutto" name="All"/> + <combo_box.item label="In questo lotto" name="WithinParcel"/> + <combo_box.item label="Fuori da questo lotto" name="OutsideParcel"/> + <combo_box.item label="su altri avatar" name="OnOthers"/> + </combo_box> + <scroll_list name="media_list"> + <scroll_list.columns label="Dintorni" name="media_proximity"/> + <scroll_list.columns label="Visibile" name="media_visibility"/> + <scroll_list.columns label="Classe" name="media_class"/> + <scroll_list.columns label="Nome" name="media_name"/> + <scroll_list.columns label="Debug" name="media_debug"/> + </scroll_list> + <panel> + <layout_stack name="media_controls"> + <layout_panel name="stop"> + <button name="stop_btn" tool_tip="Interrompi supporto selezionato"/> + </layout_panel> + <layout_panel name="play"> + <button name="play_btn" tool_tip="Riproduci media selezionato"/> + </layout_panel> + <layout_panel name="pause"> + <button name="pause_btn" tool_tip="Pausa media selezionato"/> + </layout_panel> + <layout_panel name="volume_slider_ctrl"> + <slider_bar initial_value="0.5" name="volume_slider" tool_tip="Volume audio per il media selezionato"/> + </layout_panel> + <layout_panel name="mute"> + <button name="mute_btn" tool_tip="Disattiva audio dei supporti selezionati"/> + </layout_panel> + <layout_panel name="zoom"> + <button name="zoom_btn" tool_tip="Zoom nel media selezionato"/> + </layout_panel> + <layout_panel name="unzoom"> + <button name="unzoom_btn" tool_tip="Zoom indietro dal media selezionato"/> + </layout_panel> + </layout_stack> + </panel> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/it/panel_notes.xml b/indra/newview/skins/default/xui/it/panel_notes.xml index ff843c1684..9ce6b47a32 100644 --- a/indra/newview/skins/default/xui/it/panel_notes.xml +++ b/indra/newview/skins/default/xui/it/panel_notes.xml @@ -1,20 +1,20 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Note & Privacy" name="panel_notes"> +<panel label="Note e Privacy" name="panel_notes"> <layout_stack name="layout"> <panel name="notes_stack"> <scroll_container name="profile_scroll"> <panel name="profile_scroll_panel"> <text name="status_message" value="Le mie note private:"/> - <text name="status_message2" value="Permetti a questa persona di:"/> - <check_box label="Vedermi On-line" name="status_check"/> - <check_box label="Vedermi sull mappa" name="map_check"/> - <check_box label="Modificare, cancellare o prendere i miei oggetti" name="objects_check"/> + <text name="status_message2" value="Consenti a questa persona di:"/> + <check_box label="Vedere se sono online" name="status_check"/> + <check_box label="Vedermi sulla mappa" name="map_check"/> + <check_box label="Modificare, eliminare o prendere i miei oggetti" name="objects_check"/> </panel> </scroll_container> </panel> <panel name="notes_buttons_panel"> - <button label="Aggiungi" name="add_friend" tool_tip="Offrire amicizia ad un residente"/> - <button label="IM" name="im" tool_tip="Apri una sessione di messaggio istantaneo"/> + <button label="Aggiungi amico" name="add_friend" tool_tip="Offri amicizia a questo residente"/> + <button label="IM" name="im" tool_tip="Apri una sessione messaggio istantaneo"/> <button label="Chiama" name="call" tool_tip="Chiama questo residente"/> <button label="Mappa" name="show_on_map_btn" tool_tip="Mostra il residente sulla mappa"/> <button label="Teleport" name="teleport" tool_tip="Offri teleport"/> diff --git a/indra/newview/skins/default/xui/it/panel_online_status.xml b/indra/newview/skins/default/xui/it/panel_online_status.xml new file mode 100644 index 0000000000..fdc489f375 --- /dev/null +++ b/indra/newview/skins/default/xui/it/panel_online_status.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="friend_online_status" name="friend_online_status"/> diff --git a/indra/newview/skins/default/xui/it/panel_online_status_toast.xml b/indra/newview/skins/default/xui/it/panel_online_status_toast.xml new file mode 100644 index 0000000000..fdc489f375 --- /dev/null +++ b/indra/newview/skins/default/xui/it/panel_online_status_toast.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="friend_online_status" name="friend_online_status"/> diff --git a/indra/newview/skins/default/xui/it/panel_outfit_edit.xml b/indra/newview/skins/default/xui/it/panel_outfit_edit.xml new file mode 100644 index 0000000000..57168096d5 --- /dev/null +++ b/indra/newview/skins/default/xui/it/panel_outfit_edit.xml @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- Side tray Outfit Edit panel --> +<panel label="Modifica del vestiario" name="outfit_edit"> + <string name="No Outfit" value="Nessun vestiario"/> + <string name="unsaved_changes" value="Modifiche non salvate"/> + <string name="now_editing" value="Modifica di"/> + <panel.string name="not_available"> + (non pert.) + </panel.string> + <panel.string name="unknown"> + (sconosciuto) + </panel.string> + <string name="Filter.All" value="Tutto"/> + <string name="Filter.Clothes/Body" value="Abiti/corpo"/> + <string name="Filter.Objects" value="Oggetti"/> + <string name="Filter.Custom" value="Filtro personalizzato"/> + <text name="title" value="Modifica vestiario"/> + <panel label="bottom_panel" name="header_panel"> + <panel label="bottom_panel" name="outfit_name_and_status"> + <text name="status" value="Modifica di..."/> + <text name="curr_outfit_name" value="[Current Outfit]"/> + </panel> + </panel> + <layout_stack name="im_panels"> + <layout_panel label="Pannello di controllo IM" name="outfit_wearables_panel"> + <layout_stack name="filter_panels"> + <layout_panel name="add_button_and_combobox"> + <button label="Aggiungi altri..." name="show_add_wearables_btn"/> + </layout_panel> + <layout_panel name="filter_panel"> + <filter_editor label="Filtra capi da indossare dell'inventario" name="look_item_filter"/> + </layout_panel> + </layout_stack> + </layout_panel> + <layout_panel name="add_wearables_panel"/> + </layout_stack> + <panel name="save_revert_button_bar"> + <button label="Salva" name="save_btn"/> + <button label="Ripristina" name="revert_btn"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/it/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/it/panel_outfits_inventory.xml index 9332a3ef36..8f8f7a25f4 100644 --- a/indra/newview/skins/default/xui/it/panel_outfits_inventory.xml +++ b/indra/newview/skins/default/xui/it/panel_outfits_inventory.xml @@ -1,7 +1,13 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="Outfits"> - <accordion name="outfits_accordion"> - <accordion_tab name="tab_cof" title="Vestiario attuale"/> - <accordion_tab name="tab_outfits" title="Mio Vestiario"/> - </accordion> +<panel label="Cose" name="Outfits"> + <tab_container name="appearance_tabs"> + <panel label="I MIEI ABITI" name="outfitslist_tab"/> + <inventory_panel label="INDOSSA" name="cof_tab"/> + </tab_container> + <panel name="bottom_panel"> + <button name="options_gear_btn" tool_tip="Mostra opzioni addizionali"/> + <dnd_button name="trash_btn" tool_tip="Rimuovi l'articolo selezionato"/> + <button label="Salva con nome" name="save_btn"/> + <button label="Indossa" name="wear_btn" tool_tip="Indossa il vestiario selezionato"/> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_outfits_inventory_gear_default.xml b/indra/newview/skins/default/xui/it/panel_outfits_inventory_gear_default.xml index c6be942312..9e1a45b129 100644 --- a/indra/newview/skins/default/xui/it/panel_outfits_inventory_gear_default.xml +++ b/indra/newview/skins/default/xui/it/panel_outfits_inventory_gear_default.xml @@ -1,9 +1,9 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="menu_gear_default"> - <menu_item_call label="Sostituisci il Vestiario attuale" name="wear"/> - <menu_item_call label="Aggiungi al Vestiario attuale" name="add"/> - <menu_item_call label="Rimuovi dal Vestiario attuale" name="remove"/> - <menu_item_call label="Rinomina" name="rename"/> - <menu_item_call label="Rimuovi" name="remove_link"/> - <menu_item_call label="Cancella" name="delete"/> + <menu_item_call label="Sostituisci vestiario attuale" name="wear"/> + <menu_item_call label="Aggiungi al vestiario attuale" name="add"/> + <menu_item_call label="Rimuovi dal vestiario attuale" name="remove"/> + <menu_item_call label="Modifica nome" name="rename"/> + <menu_item_call label="Rimuovi link" name="remove_link"/> + <menu_item_call label="Elimina vestito" name="delete"/> </menu> diff --git a/indra/newview/skins/default/xui/it/panel_people.xml b/indra/newview/skins/default/xui/it/panel_people.xml index b20db0d565..056e424436 100644 --- a/indra/newview/skins/default/xui/it/panel_people.xml +++ b/indra/newview/skins/default/xui/it/panel_people.xml @@ -1,33 +1,43 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <!-- Side tray panel --> -<panel label="Persona" name="people_panel"> - <string name="no_people" value="Nessuna persona"/> - <string name="no_one_near" value="Nessuno vicino"/> +<panel label="Persone" name="people_panel"> + <string name="no_recent_people" value="Nessuna persona recente. Stai cercando persone da frequentare? Prova la [secondlife:///app/search/people Ricerca] o la [secondlife:///app/worldmap Mappa del mondo]."/> + <string name="no_filtered_recent_people" value="Non riesci a trovare quello che cerchi? Prova [secondlife:///app/search/people/[SEARCH_TERM] Cerca]."/> + <string name="no_one_near" value="Nessuno vicino. Stai cercando persone da frequentare? Try la [secondlife:///app/search/people Ricerca] o la [secondlife:///app/worldmap Mappa del mondo]."/> + <string name="no_one_filtered_near" value="Non riesci a trovare quello che cerchi? Prova [secondlife:///app/search/people/[SEARCH_TERM] Cerca]."/> <string name="no_friends_online" value="Nessun amico online"/> <string name="no_friends" value="Nessun amico"/> - <string name="no_groups" value="Nessun gruppo"/> - <string name="people_filter_label" value="Filtro Persone"/> - <string name="groups_filter_label" value="Filtro Gruppi"/> + <string name="no_friends_msg"> + Per trovare amici, utilizza [secondlife:///app/search/people Cerca] oppure fai clic col tasto destro del mouse su un residente per aggiungerlo come amico. +Stai cercando persone da frequentare? Prova la [secondlife:///app/worldmap Mappa del mondo]. + </string> + <string name="no_filtered_friends_msg"> + Non riesci a trovare quello che cerchi? Prova [secondlife:///app/search/people/[SEARCH_TERM] Cerca]. + </string> + <string name="people_filter_label" value="Filtro persone"/> + <string name="groups_filter_label" value="Filtro gruppi"/> + <string name="no_filtered_groups_msg" value="Non riesci a trovare quello che cerchi? Prova [secondlife:///app/search/groups/[SEARCH_TERM] Cerca]."/> + <string name="no_groups_msg" value="Stai cercando gruppi di cui far parte? Prova [secondlife:///app/search/groups Cerca]."/> <filter_editor label="Filtro" name="filter_input"/> <tab_container name="tabs"> <panel label="NELLE VICINANZE" name="nearby_panel"> <panel label="bottom_panel" name="bottom_panel"> <button name="nearby_view_sort_btn" tool_tip="Opzioni"/> - <button name="add_friend_btn" tool_tip="Aggiungi il residente selezionato alla tua lista di amici"/> + <button name="add_friend_btn" tool_tip="Aggiungi il residente selezionato alla tua lista degli amici"/> </panel> </panel> - <panel label="AMICI" name="friends_panel"> + <panel label="I MIEI AMICI" name="friends_panel"> <accordion name="friends_accordion"> <accordion_tab name="tab_online" title="Online"/> - <accordion_tab name="tab_all" title="Tutti"/> + <accordion_tab name="tab_all" title="Tutto"/> </accordion> <panel label="bottom_panel" name="bottom_panel"> <button name="friends_viewsort_btn" tool_tip="Opzioni"/> - <button name="add_btn" tool_tip="Offri amicizia ad un residente"/> - <button name="del_btn" tool_tip="Rimuovi la persona selezionata dalla tua lista di amici"/> + <button name="add_btn" tool_tip="Offri amicizia a un residente"/> + <button name="del_btn" tool_tip="Rimuovi la persona selezionata dalla lista degli amici"/> </panel> </panel> - <panel label="GRUPPI" name="groups_panel"> + <panel label="I MIEI GRUPPI" name="groups_panel"> <panel label="bottom_panel" name="bottom_panel"> <button name="groups_viewsort_btn" tool_tip="Opzioni"/> <button name="plus_btn" tool_tip="Aderisci al gruppo/Crea nuovo gruppo"/> @@ -37,17 +47,18 @@ <panel label="RECENTE" name="recent_panel"> <panel label="bottom_panel" name="bottom_panel"> <button name="recent_viewsort_btn" tool_tip="Opzioni"/> - <button name="add_friend_btn" tool_tip="Aggiungi il residente selezionato alla tua lista di amici"/> + <button name="add_friend_btn" tool_tip="Aggiungi il residente selezionato alla tua lista degli amici"/> </panel> </panel> </tab_container> <panel name="button_bar"> - <button label="Profilo" name="view_profile_btn" tool_tip="Mostra foto, gruppi, e info di altri residenti"/> - <button label="IM" name="im_btn" tool_tip="Apri sessione instant message"/> + <button label="Profilo" name="view_profile_btn" tool_tip="Mostra immagine, gruppi e altre informazioni del residente"/> + <button label="IM" name="im_btn" tool_tip="Apri una sessione messaggio istantaneo"/> <button label="Chiama" name="call_btn" tool_tip="Chiama questo residente"/> - <button label="Condividi" name="share_btn"/> + <button label="Condividi" name="share_btn" tool_tip="Condividi un oggetto dell'inventario"/> <button label="Teleport" name="teleport_btn" tool_tip="Offri teleport"/> - <button label="Profilo del Gruppo" name="group_info_btn" tool_tip="Mostra info del gruppo"/> + <button label="Profilo del gruppo" name="group_info_btn" tool_tip="Mostra informazioni gruppo"/> <button label="Chat di gruppo" name="chat_btn" tool_tip="Apri sessione chat"/> + <button label="Chiamata al gruppo" name="group_call_btn" tool_tip="Chiama questo gruppo"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_pick_info.xml b/indra/newview/skins/default/xui/it/panel_pick_info.xml index 4771457825..7c059b443d 100644 --- a/indra/newview/skins/default/xui/it/panel_pick_info.xml +++ b/indra/newview/skins/default/xui/it/panel_pick_info.xml @@ -1,10 +1,10 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="panel_pick_info"> - <text name="title" value="Scegli Info ????"/> + <text name="title" value="Scegli Info"/> <scroll_container name="profile_scroll"> <panel name="scroll_content_panel"> <text name="pick_name" value="[nome]"/> - <text name="pick_location" value="[Caricando...]"/> + <text name="pick_location" value="[caricamento...]"/> <text name="pick_desc" value="[descrizione]"/> </panel> </scroll_container> diff --git a/indra/newview/skins/default/xui/it/panel_picks.xml b/indra/newview/skins/default/xui/it/panel_picks.xml index bcc433708d..823e0fcd03 100644 --- a/indra/newview/skins/default/xui/it/panel_picks.xml +++ b/indra/newview/skins/default/xui/it/panel_picks.xml @@ -1,20 +1,20 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Foto" name="panel_picks"> - <string name="no_picks" value="Nessuna Foto"/> - <string name="no_classifieds" value="Nessun Annuncio"/> +<panel label="Preferiti" name="panel_picks"> + <string name="no_picks" value="Nessun luogo preferito"/> + <string name="no_classifieds" value="Nessun annuncio"/> <text name="empty_picks_panel_text"> Nessuna foto/annuncio qui </text> <accordion name="accordion"> - <accordion_tab name="tab_picks" title="Foto"/> - <accordion_tab name="tab_classifieds" title="Annunci"/> + <accordion_tab name="tab_picks" title="Preferiti"/> + <accordion_tab name="tab_classifieds" title="Annunci pubblicitari"/> </accordion> <panel label="bottom_panel" name="edit_panel"> - <button name="new_btn" tool_tip="Crea una nuova foto o annuncio in questo luogo"/> + <button name="new_btn" tool_tip="Crea un nuovo luogo preferito o annuncio in questo luogo"/> </panel> <panel name="buttons_cucks"> - <button label="Info" name="info_btn" tool_tip="Mostra info sulla foto"/> - <button label="Teleport" name="teleport_btn" tool_tip="Teleport all'area corrispondente"/> - <button label="Mappa" name="show_on_map_btn" tool_tip="Mostra l'area corrispondente nella Mappa del Mondo"/> + <button label="Informazioni" name="info_btn" tool_tip="Mostra informazioni sul luogo preferito"/> + <button label="Teleport" name="teleport_btn" tool_tip="Teleport alla zona corrispondente"/> + <button label="Mappa" name="show_on_map_btn" tool_tip="Mostra la zona corrispondente nella mappa del Mondo"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_place_profile.xml b/indra/newview/skins/default/xui/it/panel_place_profile.xml index 70e1577199..eace6c89ce 100644 --- a/indra/newview/skins/default/xui/it/panel_place_profile.xml +++ b/indra/newview/skins/default/xui/it/panel_place_profile.xml @@ -1,99 +1,107 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="place_profile"> - <string name="on" value="On"/> - <string name="off" value="Off"/> + <string name="on" value="Attivo"/> + <string name="off" value="Disattivato"/> <string name="anyone" value="Chiunque"/> <string name="available" value="disponibile"/> <string name="allocated" value="assegnato"/> <string name="title_place" value="Profilo del luogo"/> - <string name="title_teleport_history" value="Cronologia dei Teleport"/> - <string name="not_available" value="(N\D)"/> + <string name="title_teleport_history" value="Cronologia Teleport"/> + <string name="not_available" value="(non pert.)"/> <string name="unknown" value="(sconosciuto)"/> - <string name="public" value="(publico)"/> + <string name="public" value="(pubblico)"/> <string name="none_text" value="(nessuno)"/> - <string name="sale_pending_text" value="(Vendita in attesa di)"/> - <string name="group_owned_text" value="(Gruppo posseduto)"/> + <string name="sale_pending_text" value="(In corso di vendita)"/> + <string name="group_owned_text" value="(Di proprietà di un gruppo)"/> <string name="price_text" value="L$"/> <string name="area_text" value="m²"/> - <string name="all_residents_text" value="Tutti i Residenti"/> + <string name="all_residents_text" value="Tutti i residenti"/> <string name="group_text" value="Gruppo"/> <string name="can_resell"> - La terra acquistata in questa regione può essere rivenduta. + Il terreno acquistato in questa regione può essere rivenduto. </string> <string name="can_not_resell"> - La terra acquistata in questa regione non può essere rivenduta. + Il terreno acquistato in questa regione non può essere rivenduto. </string> <string name="can_change"> - La terra acquistata in questa regione può essere unita o suddivisa. + Il terreno acquistato in questa regione può essere unito o suddiviso. </string> <string name="can_not_change"> - La terra acquistata in questa regione non può essere unita o suddivisa. + Il terreno acquistato in questa regione non può essere unito o suddiviso. </string> <string name="server_update_text"> - Informazioni su questo luogo non disponibili senza l'aggiornamento del server. + Informazioni sul luogo non disponibili senza l'aggiornamento del server. </string> <string name="server_error_text"> - Informazioni su questo luogo non sono disponibili ora, per favore riprova più tardi. + Informazioni su questo luogo non disponibili al momento, riprova più tardi. </string> <string name="server_forbidden_text"> - Informazioni su questo luogo non sono disponibili a cause delle restrizioni sull'accesso. Per favore verifica i tuoi permessi con il proprietario del parcel. + Informazioni su questo luogo non disponibili a causa delle limitazioni di accesso. Controlla i tuoi permessi con il proprietario del terreno. </string> <string name="acquired_date"> [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local] </string> + <button name="back_btn" tool_tip="Indietro"/> <text name="title" value="Profilo del luogo"/> <scroll_container name="place_scroll"> <panel name="scrolling_panel"> <text name="owner_label" value="Proprietario:"/> <text name="maturity_value" value="sconosciuto"/> <accordion name="advanced_info_accordion"> - <accordion_tab name="parcel_characteristics_tab" title="Parcel"> - <panel> - <text name="rating_label" value="Valutazione:"/> + <accordion_tab name="parcel_characteristics_tab" title="Lotto"> + <panel name="parcel_characteristics_panel"> + <text name="rating_label" value="Categoria:"/> <text name="rating_value" value="sconosciuto"/> - <text name="voice_label" value="Voice:"/> - <text name="voice_value" value="On"/> + <text name="voice_label" value="Voce:"/> + <text name="voice_value" value="Attivo"/> <text name="fly_label" value="Vola:"/> - <text name="fly_value" value="On"/> + <text name="fly_value" value="Attivo"/> <text name="push_label" value="Spingi:"/> - <text name="push_value" value="Off"/> + <text name="push_value" value="Disattivato"/> <text name="build_label" value="Costruisci:"/> - <text name="build_value" value="On"/> - <text name="scripts_label" value="Scripts:"/> - <text name="scripts_value" value="On"/> - <text name="damage_label" value="Danno:"/> - <text name="damage_value" value="Off"/> - <button label="Info sul terreno" name="about_land_btn"/> + <text name="build_value" value="Attivo"/> + <text name="scripts_label" value="Script:"/> + <text name="scripts_value" value="Attivo"/> + <text name="damage_label" value="Danni:"/> + <text name="damage_value" value="Disattivato"/> + <button label="Informazioni sui terreni" name="about_land_btn"/> </panel> </accordion_tab> <accordion_tab name="region_information_tab" title="Regione"> - <panel> + <panel name="region_information_panel"> <text name="region_name_label" value="Regione:"/> - <text name="region_type_label" value="Scrivi:"/> - <text name="region_rating_label" value="Valutazione:"/> + <text name="region_name" value="Mooseland"/> + <text name="region_type_label" value="Tipo:"/> + <text name="region_type" value="Moose"/> + <text name="region_rating_label" value="Categoria:"/> + <text name="region_rating" value="Adulti"/> <text name="region_owner_label" value="Proprietario:"/> + <text name="region_owner" value="moose Van Moose"/> <text name="region_group_label" value="Gruppo:"/> - <button label="Regione/Proprietà immobiliare" name="region_info_btn"/> + <text name="region_group"> + The Mighty Moose of mooseville soundvillemoose + </text> + <button label="Regione/proprietà immobiliare" name="region_info_btn"/> </panel> </accordion_tab> <accordion_tab name="estate_information_tab" title="Proprietà immobiliare"> - <panel> + <panel name="estate_information_panel"> <text name="estate_name_label" value="Proprietà immobiliare:"/> - <text name="estate_rating_label" value="Valutazione:"/> - <text name="estate_owner_label" value="Proprietà :"/> + <text name="estate_rating_label" value="Categoria:"/> + <text name="estate_owner_label" value="Proprietario:"/> <text name="covenant_label" value="Regolamento:"/> </panel> </accordion_tab> <accordion_tab name="sales_tab" title="In vendita"> - <panel> + <panel name="sales_panel"> <text name="sales_price_label" value="Prezzo:"/> - <text name="area_label" value="Area:"/> + <text name="area_label" value="Zona:"/> <text name="traffic_label" value="Traffico:"/> <text name="primitives_label" value="Primitive:"/> - <text name="parcel_scripts_label" value="Scripts:"/> - <text name="terraform_limits_label" value="Limiti per Terraform:"/> + <text name="parcel_scripts_label" value="Script:"/> + <text name="terraform_limits_label" value="Limiti terraform:"/> <text name="subdivide_label" value="Suddividi/Unisci abilità :"/> - <text name="resale_label" value="Rivendi abilità :"/> + <text name="resale_label" value="Abilità rivendita:"/> <text name="sale_to_label" value="In vendita a:"/> </panel> </accordion_tab> diff --git a/indra/newview/skins/default/xui/it/panel_places.xml b/indra/newview/skins/default/xui/it/panel_places.xml index 8e50a8b9d9..9a052068f7 100644 --- a/indra/newview/skins/default/xui/it/panel_places.xml +++ b/indra/newview/skins/default/xui/it/panel_places.xml @@ -1,14 +1,16 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Luoghi" name="places panel"> - <string name="landmarks_tab_title" value="MIEI LANDMARKS"/> - <string name="teleport_history_tab_title" value="TELEPORT PRECEDENTI"/> - <filter_editor label="Filtro Luoghi" name="Filter"/> + <string name="landmarks_tab_title" value="I MIEI PUNTI DI RIFERIMENTO"/> + <string name="teleport_history_tab_title" value="CRONOLOGIA TELEPORT"/> + <filter_editor label="Filtra i miei luoghi" name="Filter"/> <panel name="button_panel"> - <button label="Teleport" name="teleport_btn"/> - <button label="Mappa" name="map_btn"/> - <button label="Modifica" name="edit_btn"/> - <button label="Chiudi" name="close_btn"/> - <button label="Cancella" name="cancel_btn"/> + <button label="Teleport" name="teleport_btn" tool_tip="Teleport alla zona selezionata"/> + <button label="Mappa" name="map_btn" tool_tip="Mostra la zona corrispondente nella mappa del Mondo"/> + <button label="Modifica" name="edit_btn" tool_tip="Modifica le informazioni del punto di riferimento"/> + <button label="â–¼" name="overflow_btn" tool_tip="Mostra opzioni addizionali"/> <button label="Salva" name="save_btn"/> + <button label="Annulla" name="cancel_btn"/> + <button label="Chiudi" name="close_btn"/> + <button label="Profilo" name="profile_btn" tool_tip="Mostra il profilo del luogo"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/it/panel_preferences_advanced.xml index 13ffabbebf..842daaa331 100644 --- a/indra/newview/skins/default/xui/it/panel_preferences_advanced.xml +++ b/indra/newview/skins/default/xui/it/panel_preferences_advanced.xml @@ -1,48 +1,37 @@ <?xml version="1.0" encoding="utf-8"?> -<panel name="advanced"> - <panel.string name="resolution_format"> - [RES_X] x [RES_Y] - </panel.string> +<panel label="Avanzata" name="advanced"> <panel.string name="aspect_ratio_text"> [NUM]:[DEN] </panel.string> - <check_box label="Chat a Bolle" name="bubble_text_chat"/> - <color_swatch name="background" tool_tip="Scegli il colore delle vignette della Chat"/> - <slider label="Opacità " name="bubble_chat_opacity"/> - <text name="AspectRatioLabel1" tool_tip="larghezza/altezza"> - Rapporto di visualizzazione - </text> - <combo_box name="aspect_ratio" tool_tip="larghezza/altezza"> - <combo_box.item label="4:3 (Monitor Standard)" name="item1"/> - <combo_box.item label="5:4 (1280x1024 LCD)" name="item2"/> - <combo_box.item label="8:5 (Widescreen)" name="item3"/> - <combo_box.item label="16:9 (Widescreen)" name="item4"/> - </combo_box> - <check_box label="Rilevamento automatico" name="aspect_auto_detect"/> - <text name="heading1"> - Camera: - </text> - <slider label="Angolazione della visuale" name="camera_fov"/> + <panel.string name="middle_mouse"> + Pulsante centrale del mouse + </panel.string> + <slider label="Angolo di visuale" name="camera_fov"/> <slider label="Distanza" name="camera_offset_scale"/> <text name="heading2"> - Posizionamento Automatico per: + Posizione automatica per: </text> - <check_box label="Costruire/Modificare" name="edit_camera_movement" tool_tip="Utilizza il posizionamento automatico della camera entrando e uscendo dalla modalità modifica"/> - <check_box label="Aspetto Fisico" name="appearance_camera_movement" tool_tip="Utilizza il posizionamento automatico della camera in modalità modifica"/> - <text name="heading3"> - Avatar: + <check_box label="Costruire/Modificare" name="edit_camera_movement" tool_tip="Utilizza il posizionamento automatico della fotocamera entrando o uscendo dalla modalità modifica"/> + <check_box label="Aspetto fisico" name="appearance_camera_movement" tool_tip="Utilizza il posizionamento automatico della camera in modalità modifica"/> + <check_box initial_value="vero" label="Barra laterale" name="appearance_sidebar_positioning" tool_tip="Utilizza il posizionamento automatico della fotocamera per la barra laterale"/> + <check_box label="Visualizzami in modalità soggettiva" name="first_person_avatar_visible"/> + <check_box label="Le frecce di direzione mi fanno sempre spostare" name="arrow_keys_move_avatar_check"/> + <check_box label="Doppio click e tieni premuto per correre" name="tap_tap_hold_to_run"/> + <check_box label="Movimento delle labbra dell'avatar quando parla" name="enable_lip_sync"/> + <check_box label="Chat a bolla" name="bubble_text_chat"/> + <slider label="Opacità " name="bubble_chat_opacity"/> + <color_swatch name="background" tool_tip="Scegli il colore delle vignette della chat"/> + <text name="UI Size:"> + Dimensioni interfaccia utente </text> - <check_box label="Mostra in modalità Mouselook" name="first_person_avatar_visible"/> - <check_box label="Cammino sempre con le frecce di movimento" name="arrow_keys_move_avatar_check"/> - <check_box label="Doppio Click-Tieni Premuto per correre" name="tap_tap_hold_to_run"/> - <check_box label="Consente il movimento delle labbra dell'Avatar quando parla" name="enable_lip_sync"/> - <check_box label="Mostra errori degli script" name="show_script_errors"/> + <check_box label="Mostra errori dello script in:" name="show_script_errors"/> <radio_group name="show_location"> - <radio_item label="In chat" name="0"/> - <radio_item label="In una finestra" name="1"/> + <radio_item label="Chat nei dintorni" name="0"/> + <radio_item label="Finestra separata" name="1"/> </radio_group> - <check_box label="Modalità del microfono "interruttore ON/OFF" quando premo l'interruttore PARLA:" name="push_to_talk_toggle_check" tool_tip="In modalità "interruttore ON/OFF" premi il tasto per attivare o disattivare il microfono. Quando non usi questa modalità , il microfono è attivo solo se tieni premuto il tasto."/> - <line_editor label="Premi il pulsante per parlare" name="modifier_combo"/> - <button label="Imposta" name="set_voice_hotkey_button"/> - <button label="Pulsante centrale del Mouse" name="set_voice_middlemouse_button"/> + <check_box label="Attiva/disattiva la funzione parla quando premo:" name="push_to_talk_toggle_check" tool_tip="In modalità "interruttore ON/OFF" premi il tasto una volta per attivare o disattivare il microfono. Quando non usi questa modalità , il microfono è attivo solo se tieni premuto il tasto di comando."/> + <line_editor label="Pulsante di comando della funzione Premi per parlare" name="modifier_combo"/> + <button label="Imposta tasto" name="set_voice_hotkey_button"/> + <button label="Pulsante centrale del mouse" name="set_voice_middlemouse_button" tool_tip="Reimposta sul pulsante centrale del mouse"/> + <button label="Altri dispositivi" name="joystick_setup_button"/> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_preferences_alerts.xml b/indra/newview/skins/default/xui/it/panel_preferences_alerts.xml index 02da9de4a4..fd1fd57761 100644 --- a/indra/newview/skins/default/xui/it/panel_preferences_alerts.xml +++ b/indra/newview/skins/default/xui/it/panel_preferences_alerts.xml @@ -1,14 +1,14 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Pop-up" name="popups" title="Pop-up"> <text name="tell_me_label"> - Dimmi: + Avvisami: </text> <check_box label="Quando spendo o ottengo L$" name="notify_money_change_checkbox"/> - <check_box label="Quando i miei amici entrano o escono da SL" name="friends_online_notify_checkbox"/> + <check_box label="Quando i miei amici entrano o escono da Second Life" name="friends_online_notify_checkbox"/> <text name="show_label"> - Mostra sempre questi allarmi: + Mostra sempre: </text> <text name="dont_show_label"> - Non mostrare mai questi allarmi: + Non mostrare mai: </text> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_preferences_chat.xml b/indra/newview/skins/default/xui/it/panel_preferences_chat.xml index 9c064c2716..fb8ddf607d 100644 --- a/indra/newview/skins/default/xui/it/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/it/panel_preferences_chat.xml @@ -1,10 +1,16 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Text Chat" name="chat"> + <text name="font_size"> + Dimensioni caratteri: + </text> <radio_group name="chat_font_size"> - <radio_item label="Piccolo" name="radio"/> - <radio_item label="Medio" name="radio2"/> - <radio_item label="Grande" name="radio3"/> + <radio_item label="Piccola" name="radio" value="0"/> + <radio_item label="Media" name="radio2" value="1"/> + <radio_item label="Grande" name="radio3" value="2"/> </radio_group> + <text name="font_colors"> + Colori caratteri: + </text> <color_swatch label="Tuo" name="user"/> <text name="text_box1"> Io @@ -38,9 +44,16 @@ URLs </text> <check_box initial_value="true" label="Simula la battitura tasti quando scrivi" name="play_typing_animation"/> - <check_box label="Spediscimi nella email gli IM quando sono OFF-LINE" name="send_im_to_email"/> - <radio_group name="chat_window" tool_tip="Mostra i tuoi Instant Messages in finestre separate, o in una finestra con diverse tabelle (Requires restart)"> - <radio_item label="Finestre multiple" name="radio"/> - <radio_item label="Una finestra" name="radio2"/> + <check_box label="Quando sono OFF-LINE, spediscimi gli IM in una e-mail" name="send_im_to_email"/> + <check_box label="Attiva IM in testo semplice e cronologia chat" name="plain_text_chat_history"/> + <text name="show_ims_in_label"> + Mostra gli IM in: + </text> + <text name="requires_restart_label"> + (richiede il riavvio) + </text> + <radio_group name="chat_window" tool_tip="Mostra i tuoi messaggi istantanei in diverse finestre, o in una finestra con più schede (richiede il riavvio)"> + <radio_item label="Finestre separate" name="radio" value="0"/> + <radio_item label="Schede" name="radio2" value="1"/> </radio_group> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_preferences_general.xml b/indra/newview/skins/default/xui/it/panel_preferences_general.xml index 80b152752b..e8c826609c 100644 --- a/indra/newview/skins/default/xui/it/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/it/panel_preferences_general.xml @@ -4,7 +4,7 @@ Lingua: </text> <combo_box name="language_combobox"> - <combo_box.item label="System default" name="System Default Language"/> + <combo_box.item label="Default di sistema" name="System Default Language"/> <combo_box.item label="English" name="English"/> <combo_box.item label="Dansk (Danese) - Beta" name="Danish"/> <combo_box.item label="Deutsch (Tedesco) - Beta" name="Deutsch(German)"/> @@ -17,47 +17,50 @@ <combo_box.item label="日本語 (Giapponese) - Beta" name="(Japanese)"/> </combo_box> <text name="language_textbox2"> - (Richiede restart) + (Richiede il riavvio) </text> <text name="maturity_desired_prompt"> - Voglio accedere al contenuto di tipo: + Voglio accedere ai contenuti di tipo: </text> <text name="maturity_desired_textbox"/> <combo_box name="maturity_desired_combobox"> - <combo_box.item label="PG, Mature e Adult" name="Desired_Adult"/> - <combo_box.item label="PG e Mature" name="Desired_Mature"/> - <combo_box.item label="PG" name="Desired_PG"/> + <combo_box.item label="Generale, Moderato e Adulti" name="Desired_Adult"/> + <combo_box.item label="Generale e Moderato" name="Desired_Mature"/> + <combo_box.item label="Generale" name="Desired_PG"/> </combo_box> <text name="start_location_textbox"> - Luogo d'inizio: + Luogo di partenza: </text> <combo_box name="start_location_combo"> - <combo_box.item label="Ultimo posto visitato" name="MyLastLocation" tool_tip="Vai nell'ultimo posto visitato di default quando fai login."/> - <combo_box.item label="Casa mia" name="MyHome" tool_tip="Vai a casa di default quando fai login"/> + <combo_box.item label="Ultimo luogo visitato" name="MyLastLocation" tool_tip="Vai automaticamente all'ultimo luogo visitato quando effettui l'accesso."/> + <combo_box.item label="Casa mia" name="MyHome" tool_tip="Vai automaticamente a casa quando effettui l'accesso"/> </combo_box> - <check_box initial_value="true" label="Mostra su login" name="show_location_checkbox"/> + <check_box initial_value="true" label="Mostra con il login" name="show_location_checkbox"/> <text name="name_tags_textbox"> - Nome sulle tags: + Nome: </text> <radio_group name="Name_Tag_Preference"> - <radio_item label="Off" name="radio"/> - <radio_item label="On" name="radio2"/> - <radio_item label="Mostra brevemente" name="radio3"/> + <radio_item label="Off" name="radio" value="0"/> + <radio_item label="On" name="radio2" value="1"/> + <radio_item label="Mostra brevemente" name="radio3" value="2"/> </radio_group> <check_box label="Mostra il mio nome" name="show_my_name_checkbox1"/> - <check_box initial_value="true" label="Nome piccolo sulle tags" name="small_avatar_names_checkbox"/> + <check_box initial_value="true" label="Nome in piccolo" name="small_avatar_names_checkbox"/> <check_box label="Mostra titoli del gruppo" name="show_all_title_checkbox1"/> <text name="effects_color_textbox"> - Miei effetti: + I miei effetti: </text> - <color_swatch label="" name="effect_color_swatch" tool_tip="Clicca per aprire la tavolozza dei colori"/> <text name="title_afk_text"> - Pausa di Away: - </text> - <spinner label="Assente dopo:" name="afk_timeout_spinner"/> - <text name="seconds_textbox"> - secondi + Pausa assenza: </text> + <color_swatch label="" name="effect_color_swatch" tool_tip="Clicca per aprire la tavolozza dei colori"/> + <combo_box label="Pausa assenza:" name="afk"> + <combo_box.item label="2 minuti" name="item0"/> + <combo_box.item label="5 minuti" name="item1"/> + <combo_box.item label="10 minuti" name="item2"/> + <combo_box.item label="30 minuti" name="item3"/> + <combo_box.item label="mai" name="item4"/> + </combo_box> <text name="text_box3"> Risposta in modalità occupato: </text> diff --git a/indra/newview/skins/default/xui/it/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/it/panel_preferences_graphics1.xml index 647df27633..37857473aa 100644 --- a/indra/newview/skins/default/xui/it/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/it/panel_preferences_graphics1.xml @@ -1,8 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Grafica" name="Display panel"> - <text name="UI Size:"> - misura UI: - </text> <text name="QualitySpeed"> Qualità e velocità : </text> @@ -47,12 +44,16 @@ <check_box initial_value="true" label="Avatar bidimensionali (Impostor)" name="AvatarImpostors"/> <check_box initial_value="true" label="Hardware Skinning" name="AvatarVertexProgram"/> <check_box initial_value="true" label="Abiti dell'avatar" name="AvatarCloth"/> - <slider label="Distanza di disegno:" label_width="158" name="DrawDistance" width="255"/> + <slider label="Distanza di disegno:" name="DrawDistance"/> <text name="DrawDistanceMeterText2"> m </text> - <slider label="Conteggio massimo particelle:" label_width="158" name="MaxParticleCount" width="262"/> - <slider label="Qualità in post-produzione:" label_width="158" name="RenderPostProcess" width="223"/> + <slider label="Conteggio massimo particelle:" name="MaxParticleCount"/> + <slider label="Distanza visual. max avatar:" name="MaxAvatarDrawDistance"/> + <text name="DrawDistanceMeterText3"> + m + </text> + <slider label="Qualità in post-produzione:" name="RenderPostProcess"/> <text name="MeshDetailText"> Dettagli reticolo: </text> @@ -87,8 +88,8 @@ Dettagli illuminazione: </text> <radio_group name="LightingDetailRadio"> - <radio_item label="Solo il sole e la luna" name="SunMoon"/> - <radio_item label="Luci locali" name="LocalLights"/> + <radio_item label="Solo il sole e la luna" name="SunMoon" value="0"/> + <radio_item label="Luci locali" name="LocalLights" value="1"/> </radio_group> <text name="TerrainDetailText"> Dettagli terreno: @@ -99,7 +100,7 @@ </radio_group> </panel> <button label="Applica" label_selected="Applica" name="Apply"/> - <button label="Resetta" left="110" name="Defaults" width="190"/> - <button label="Avanzato" name="Advanced"/> + <button label="Reimposta" name="Defaults"/> + <button label="Avanzate" name="Advanced"/> <button label="Hardware" label_selected="Hardware" name="GraphicsHardwareButton"/> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/it/panel_preferences_privacy.xml index c84edbb47e..1002195baf 100644 --- a/indra/newview/skins/default/xui/it/panel_preferences_privacy.xml +++ b/indra/newview/skins/default/xui/it/panel_preferences_privacy.xml @@ -1,27 +1,27 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Comunicazione" name="im"> <panel.string name="log_in_to_change"> - log in per cambiare + accedi per cambiare </panel.string> - <button label="Pulisci la cronologia" name="clear_cache"/> + <button label="Pulisci la cronologia" name="clear_cache" tool_tip="Elimina immagine login, ultimo luogo, cronologia teleport, web e texture cache"/> <text name="cache_size_label_l"> - (Luoghi, immagini, web, cronologia del search) + (Luoghi, immagini, web, cronologia ricerche) </text> <check_box label="Solo amici e gruppi mi vedono online" name="online_visibility"/> <check_box label="Solo amici e gruppi possono chiamarmi o mandarmi IM" name="voice_call_friends_only_check"/> - <check_box label="Spegnere il microfono quando chiudi le chiamate" name="auto_disengage_mic_check"/> - <check_box label="Accetta cookies" name="cookies_enabled"/> - <check_box label="Permettere Media Autoplay" name="autoplay_enabled"/> + <check_box label="Spegnere il microfono alla chiusura delle chiamate" name="auto_disengage_mic_check"/> + <check_box label="Accetta cookie" name="cookies_enabled"/> + <check_box label="Consenti riproduzione multimediale automatica" name="autoplay_enabled"/> <text name="Logs:"> - Logs: + Registri: </text> - <check_box label="Salvare le ultime chat logs nel mio computer" name="log_nearby_chat"/> - <check_box label="Salvare gli IM logs nel mio computer" name="log_instant_messages"/> - <check_box label="Aggiungere orario" name="show_timestamps_check_im"/> + <check_box label="Salva i registri delle conversazioni sul mio computer" name="log_nearby_chat"/> + <check_box label="Salva i registri degli IM nel mio computer" name="log_instant_messages"/> + <check_box label="Riporta data e ora" name="show_timestamps_check_im"/> <line_editor left="288" name="log_path_string" right="-20"/> <text name="log_path_desc"> - Luoghi delle logs + Ubicazione dei registri </text> - <button label="Browse" label_selected="Browse" name="log_path_button" width="130"/> - <button label="Bloccare lista" name="block_list"/> + <button label="Sfoglia" label_selected="Sfoglia" name="log_path_button" width="130"/> + <button label="Lista dei bloccati" name="block_list"/> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_preferences_setup.xml b/indra/newview/skins/default/xui/it/panel_preferences_setup.xml index 17257a7cb8..29618485c2 100644 --- a/indra/newview/skins/default/xui/it/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/it/panel_preferences_setup.xml @@ -1,46 +1,49 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Input & Camera" name="Input panel"> - <button bottom_delta="-40" label="Altri Dispositivi" name="joystick_setup_button" width="165"/> +<panel label="Impostazione" name="Input panel"> + <button bottom_delta="-40" label="Altri dispositivi" name="joystick_setup_button" width="165"/> <text name="Mouselook:"> - Mouselook: + Soggettiva: </text> <text name=" Mouse Sensitivity"> - Sensibilità del Mouse + Sensibilità mouse </text> <check_box label="Inverti" name="invert_mouse"/> <text name="Network:"> - Network: + Rete: </text> <text name="Maximum bandwidth"> - Banda Massima + Capacità massima di banda </text> <text name="text_box2"> kbps </text> - <check_box label="Custom port" name="connection_port_enabled"/> - <spinner label="Port number:" name="web_proxy_port"/> + <check_box label="Porta personalizzata" name="connection_port_enabled"/> + <spinner label="Numero porta:" name="connection_port"/> <text name="cache_size_label_l"> - Cache size + Dimensioni cache </text> <text name="text_box5"> MB </text> - <button label="Browse" label_selected="Browse" name="set_cache"/> - <button label="Resetta" label_selected="Imposta" name="reset_cache"/> <text name="Cache location"> - Cache location + Ubicazione della cache: </text> + <button label="Sfoglia" label_selected="Sfoglia" name="set_cache"/> + <button label="Reimposta" label_selected="Reimposta" name="reset_cache"/> <text name="Web:"> Web: </text> <radio_group name="use_external_browser"> - <radio_item label="Usa il built-in browser" name="internal" tool_tip="Usa il built-in web browser per aiuto, web links, etc. Questo browser apre come una nuova finestra all'interno [APP_NAME]."/> - <radio_item label="Usa il mio browser (IE, Firefox)" name="external" tool_tip="Usa il default system web browser per aiuto, web links, etc. Non raccomandato se utilizzi lo schermo pieno(full screen)."/> + <radio_item label="Usa il mio browser (IE, Firefox, Safari)" name="external" tool_tip="Utilizza il browser Web predefinito di sistema per l'aiuto, per i link Web e così via. Sconsigliato durante l'esecuzione a tutto schermo." value="1"/> + <radio_item label="Utilizza il browser Web integrato" name="internal" tool_tip="Utilizza il browser Web integrato per l'aiuto, per i link Web e così via. Questo browser si apre in una nuova finestra in [APP_NAME]." value=""/> </radio_group> - <check_box initial_value="false" label="Web proxy" name="web_proxy_enabled"/> - <line_editor name="web_proxy_editor" tool_tip="Nome o indirizzo IP del proxy che vorresti usare"/> - <button label="Browse" label_selected="Browse" name="set_proxy"/> + <check_box label="Abilita plugin" name="browser_plugins_enabled"/> + <check_box label="Accetta cookie" name="cookies_enabled"/> + <check_box label="Abilita Javascript" name="browser_javascript_enabled"/> + <check_box label="Abilita proxy Web" name="web_proxy_enabled"/> <text name="Proxy location"> - Proxy location + Ubicazione proxy: </text> + <line_editor name="web_proxy_editor" tool_tip="Il nome o l'indirizzo IP del proxy che preferisci usare"/> + <spinner label="Numero porta:" name="web_proxy_port"/> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_preferences_sound.xml b/indra/newview/skins/default/xui/it/panel_preferences_sound.xml index c4d46291dd..9f8a13fedc 100644 --- a/indra/newview/skins/default/xui/it/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/it/panel_preferences_sound.xml @@ -1,20 +1,27 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Suoni" name="Preference Media panel"> - <slider label="Principale" name="System Volume"/> - <check_box initial_value="true" label="Spegni suono se minimizzato" name="mute_when_minimized"/> - <slider label="Ambiente" name="Wind Volume"/> + <slider label="Vol. principale" name="System Volume"/> + <check_box initial_value="true" label="Disatt. se a icona" name="mute_when_minimized"/> <slider label="Pulsanti" name="UI Volume"/> - <slider label="MultiMedia" name="Media Volume"/> - <slider label="Effetto Suoni" name="SFX Volume"/> - <slider label="Musica" name="Music Volume"/> - <check_box label="Voce" name="enable_voice_check"/> - <slider label="Voice" name="Voice Volume"/> + <slider label="Ambiente" name="Wind Volume"/> + <slider label="Effetti sonori" name="SFX Volume"/> + <slider label="Musica in streaming" name="Music Volume"/> + <check_box label="Abilitato" name="music_enabled"/> + <slider label="Multimediale" name="Media Volume"/> + <check_box label="Abilitato" name="enable_media"/> + <slider label="Chat vocale" name="Voice Volume"/> + <check_box label="Abilitato" name="enable_voice_check"/> + <check_box label="Consenti riproduzione multimediale automatica" name="media_auto_play_btn" tool_tip="Seleziona qui per consentire la riproduzione multimediale automatica"/> + <check_box label="Riproduci media in uso da altri avatar" name="media_show_on_others_btn" tool_tip="Deseleziona qui per nascondere i media in uso dagli altri avatar nei dintorni"/> + <text name="voice_chat_settings"> + Impostazioni Chat vocale + </text> <text name="Listen from"> Ascolta da: </text> <radio_group name="ear_location"> - <radio_item label="Posizione della Camera" name="0"/> - <radio_item label="Posizione dell'Avatar" name="1"/> + <radio_item label="Posizione della fotocamera" name="0"/> + <radio_item label="Posizione dell'avatar" name="1"/> </radio_group> <button label="Dispositivi di Input/Output" name="device_settings_btn" width="165"/> <panel label="Impostazioni del dispositivo" name="device_settings_panel"> @@ -25,7 +32,7 @@ Input </text> <text name="My volume label"> - Mio volume: + Il mio volume: </text> <slider_bar initial_value="1.0" name="mic_volume_slider" tool_tip="Cambia il volume utilizzando questa barra"/> <text name="wait_text"> diff --git a/indra/newview/skins/default/xui/it/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/it/panel_prim_media_controls.xml index dc7d59084e..ef7aaf2e8c 100644 --- a/indra/newview/skins/default/xui/it/panel_prim_media_controls.xml +++ b/indra/newview/skins/default/xui/it/panel_prim_media_controls.xml @@ -1,28 +1,79 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="MediaControls"> + <string name="min_width"> + 300 + </string> + <string name="min_height"> + 75 + </string> + <string name="zoom_medium_padding"> + 1.1 + </string> + <string name="top_world_view_avoid_zone"> + 50 + </string> + <layout_stack name="progress_indicator_area"> + <panel name="media_progress_indicator"> + <progress_bar name="media_progress_bar" tool_tip="L'elemento multimediale è in caricamento"/> + </panel> + </layout_stack> <layout_stack name="media_controls"> + <layout_panel name="back"> + <button name="back_btn" tool_tip="Naviga indietro"/> + </layout_panel> + <layout_panel name="fwd"> + <button name="fwd_btn" tool_tip="Naviga avanti"/> + </layout_panel> + <layout_panel name="home"> + <button name="home_btn" tool_tip="Home page"/> + </layout_panel> + <layout_panel name="media_stop"> + <button name="media_stop_btn" tool_tip="Interrompi supporto"/> + </layout_panel> + <layout_panel name="reload"> + <button name="reload_btn" tool_tip="Ricarica"/> + </layout_panel> + <layout_panel name="stop"> + <button name="stop_btn" tool_tip="Interrompi caricamento"/> + </layout_panel> + <layout_panel name="play"> + <button name="play_btn" tool_tip="Riproduci media"/> + </layout_panel> + <layout_panel name="pause"> + <button name="pause_btn" tool_tip="Pausa supporto"/> + </layout_panel> <layout_panel name="media_address"> - <line_editor name="media_address_url" tool_tip="Media URL"/> + <line_editor name="media_address_url" tool_tip="URL multimedia"/> <layout_stack name="media_address_url_icons"> <layout_panel> - <icon name="media_whitelist_flag" tool_tip="Lista Bianca attivata"/> + <icon name="media_whitelist_flag" tool_tip="Lista bianca attivata"/> </layout_panel> <layout_panel> - <icon name="media_secure_lock_flag" tool_tip="Secured Browsing"/> + <icon name="media_secure_lock_flag" tool_tip="Navigazione sicura"/> </layout_panel> </layout_stack> </layout_panel> <layout_panel name="media_play_position"> - <slider_bar initial_value="0.5" name="media_play_slider" tool_tip="Avanzamento riproduzione Movie"/> + <slider_bar initial_value="0.5" name="media_play_slider" tool_tip="Avanzamento riproduzione filmato"/> + </layout_panel> + <layout_panel name="skip_back"> + <button name="skip_back_btn" tool_tip="Passo indietro"/> + </layout_panel> + <layout_panel name="skip_forward"> + <button name="skip_forward_btn" tool_tip="Passo avanti"/> </layout_panel> <layout_panel name="media_volume"> - <button name="media_mute_button" tool_tip="Silenzia questo Media ????"/> - <slider name="volume_slider" tool_tip="Volume Media"/> + <button name="media_mute_button" tool_tip="Silenzia questo elemento multimediale"/> + <slider name="volume_slider" tool_tip="Volume multimedia"/> + </layout_panel> + <layout_panel name="zoom_frame"> + <button name="zoom_frame_btn" tool_tip="Zoom nel media"/> + </layout_panel> + <layout_panel name="close"> + <button name="close_btn" tool_tip="Zoom indietro"/> + </layout_panel> + <layout_panel name="new_window"> + <button name="new_window_btn" tool_tip="Apri URL nel browser"/> </layout_panel> - </layout_stack> - <layout_stack> - <panel name="media_progress_indicator"> - <progress_bar name="media_progress_bar" tool_tip="Media stà caricando"/> - </panel> </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_profile.xml b/indra/newview/skins/default/xui/it/panel_profile.xml index 837aa4ac65..9927ecbb88 100644 --- a/indra/newview/skins/default/xui/it/panel_profile.xml +++ b/indra/newview/skins/default/xui/it/panel_profile.xml @@ -12,37 +12,41 @@ </string> <string name="my_account_link_url" value="http://secondlife.com/my/account/index.php?lang=it-IT"/> <string name="no_partner_text" value="Nessuno"/> + <string name="no_group_text" value="Nessuno"/> <string name="RegisterDateFormat"> [REG_DATE] ([AGE]) </string> - <scroll_container name="profile_scroll"> - <panel name="scroll_content_panel"> - <panel name="second_life_image_panel"> - <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/> - </panel> - <panel name="first_life_image_panel"> - <text name="title_rw_descr_text" value="Mondo Reale:"/> - </panel> - <text name="me_homepage_text"> - Homepage: - </text> - <text name="title_member_text" value="Membro dal:"/> - <text name="title_acc_status_text" value="Stato dell'Account:"/> - <text name="acc_status_text" value="Resident. No payment info on file."/> - <text name="title_partner_text" value="Partner:"/> - <text name="title_groups_text" value="Gruppi:"/> - </panel> - </scroll_container> - <panel name="profile_buttons_panel"> - <button label="Aggiungi Amico" name="add_friend" tool_tip="Offri amicizia ad un residente"/> - <button label="IM" name="im" tool_tip="Apri una sessione instant message"/> - <button label="Chiama" name="call" tool_tip="Chiama questo residente"/> - <button label="Mappa" name="show_on_map_btn" tool_tip="Mostra il residente sulla mappa"/> - <button label="Teleport" name="teleport" tool_tip="Offri teleport"/> - <button label="â–¼" name="overflow_btn" tool_tip="Paga o condividi l'inventario con il residente"/> - </panel> - <panel name="profile_me_buttons_panel"> - <button label="Modifica Profilo" name="edit_profile_btn"/> - <button label="Modifica Aspetto" name="edit_appearance_btn"/> - </panel> + <layout_stack name="layout"> + <layout_panel name="profile_stack"> + <scroll_container name="profile_scroll"> + <panel name="profile_scroll_panel"> + <panel name="second_life_image_panel"> + <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/> + </panel> + <panel name="first_life_image_panel"> + <text name="title_rw_descr_text" value="Mondo reale:"/> + </panel> + <text name="title_member_text" value="Residente dal:"/> + <text name="title_acc_status_text" value="Stato account:"/> + <text name="title_partner_text" value="Partner:"/> + <panel name="partner_data_panel"> + <name_box initial_value="(recupero)" name="partner_text"/> + </panel> + <text name="title_groups_text" value="Gruppi:"/> + </panel> + </scroll_container> + </layout_panel> + <layout_panel name="profile_buttons_panel"> + <button label="Aggiungi amico" name="add_friend" tool_tip="Offri amicizia a questo residente"/> + <button label="IM" name="im" tool_tip="Apri una sessione messaggio istantaneo"/> + <button label="Chiama" name="call" tool_tip="Chiama questo residente"/> + <button label="Mappa" name="show_on_map_btn" tool_tip="Mostra il residente sulla mappa"/> + <button label="Teleport" name="teleport" tool_tip="Offri teleport"/> + <button label="â–¼" name="overflow_btn" tool_tip="Paga del denaro o condividi qualcosa dall'inventario con il residente"/> + </layout_panel> + <layout_panel name="profile_me_buttons_panel"> + <button label="Modifica profilo" name="edit_profile_btn" tool_tip="Modifica le tue informazioni personali"/> + <button label="Modifica aspetto fisico" name="edit_appearance_btn" tool_tip="Crea/modifica il tuo aspetto: parti del corpo, abiti ecc."/> + </layout_panel> + </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_profile_view.xml b/indra/newview/skins/default/xui/it/panel_profile_view.xml index bf89a3e6f6..20c62d4ceb 100644 --- a/indra/newview/skins/default/xui/it/panel_profile_view.xml +++ b/indra/newview/skins/default/xui/it/panel_profile_view.xml @@ -6,11 +6,11 @@ <string name="status_offline"> Offline </string> - <text_editor name="user_name" value="(Caricando...)"/> + <text_editor name="user_name" value="(Caricamento in corso...)"/> <text name="status" value="Online"/> <tab_container name="tabs"> <panel label="PROFILO" name="panel_profile"/> - <panel label="PREFERITI" name="panel_picks"/> - <panel label="NOTE & PRIVACY" name="panel_notes"/> + <panel label="LUOGHI CONSIGLIATI" name="panel_picks"/> + <panel label="NOTE E PRIVACY" name="panel_notes"/> </tab_container> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_region_covenant.xml b/indra/newview/skins/default/xui/it/panel_region_covenant.xml index f35b451ac1..0d3117ca7a 100644 --- a/indra/newview/skins/default/xui/it/panel_region_covenant.xml +++ b/indra/newview/skins/default/xui/it/panel_region_covenant.xml @@ -31,7 +31,7 @@ della proprietà . </text> <text bottom_delta="-36" name="covenant_instructions"> - Trascina ed inserisci una notecard per cambiare i Covenant di questa proprietà immobiliare. + Trascina e incolla un biglietto per cambiare il Regolamento di questa proprietà . </text> <text name="region_section_lbl"> Regione diff --git a/indra/newview/skins/default/xui/it/panel_region_debug.xml b/indra/newview/skins/default/xui/it/panel_region_debug.xml index 9e81d42410..45b3a016f4 100644 --- a/indra/newview/skins/default/xui/it/panel_region_debug.xml +++ b/indra/newview/skins/default/xui/it/panel_region_debug.xml @@ -26,9 +26,9 @@ <text name="options_text_lbl"> Opzioni: </text> - <check_box label="Con scripts" name="return_scripts" tool_tip="Ritorna solo gli oggetti che hanno scripts"/> - <check_box label="Sulla terra di qualcun'altro" name="return_other_land" tool_tip="Restituisci solo gli oggetti che sono in terreni appartenenti a qualcun altro"/> - <check_box label="In ogni regione di questa proprietà " name="return_estate_wide" tool_tip="Restituisci tutti gli oggetti nelle varie regioni che costituiscono l'insieme dei possedimenti terrieri"/> + <check_box label="Con script" name="return_scripts" tool_tip="Restituisci solo oggetti che hanno script"/> + <check_box label="Sul terreno di un altro residente" name="return_other_land" tool_tip="Restituisci solo gli oggetti che sono in terreni appartenenti a qualcun altro"/> + <check_box label="In tutte le regioni di questa proprietà " name="return_estate_wide" tool_tip="Restituisci tutti gli oggetti nelle varie regioni che costituiscono l'insieme dei possedimenti terrieri"/> <button label="Restituisci" name="return_btn"/> <button label="Visualizza l'elenco dei maggiori collidenti..." name="top_colliders_btn" tool_tip="Elenco degli oggetti che stanno potenzialmente subendo le maggiori collisioni" width="280"/> <button label="?" left="297" name="top_colliders_help"/> diff --git a/indra/newview/skins/default/xui/it/panel_region_estate.xml b/indra/newview/skins/default/xui/it/panel_region_estate.xml index b6dc60a9c2..61e3f31024 100644 --- a/indra/newview/skins/default/xui/it/panel_region_estate.xml +++ b/indra/newview/skins/default/xui/it/panel_region_estate.xml @@ -1,10 +1,9 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Proprietà immobiliari" name="Estate"> <text name="estate_help_text"> - I cambiamenti alle impostazioni in questa finestra -avranno effetto su tutte le regioni della proprietà . + Le modifiche apportate in questa scheda saranno valide per tutte le regioni in questa proprietà . </text> - <text name="estate_text" width="140"> + <text name="estate_text"> Proprietà immobiliari: </text> <text name="estate_name"> @@ -24,10 +23,10 @@ avranno effetto su tutte le regioni della proprietà . <check_box label="Permetti accesso pubblico" name="externally_visible_check"/> <button label="?" name="externally_visible_help"/> <text name="Only Allow"> - Accesso ristretto ai Residenti verificati con: + Limita l'accesso agli account verificati con: </text> - <check_box label="Informazioni di pagamento on File" name="limit_payment" tool_tip="Espelli residenti non identificati"/> - <check_box label="Verifica dell'età " name="limit_age_verified" tool_tip="Espelli i residenti che non hanno verificato l'età . Vedi [SUPPORT_SITE] per maggiori informazioni."/> + <check_box label="Informazioni di pagamento in archivio" name="limit_payment" tool_tip="Espelli i residenti non identificati"/> + <check_box label="Verifica età " name="limit_age_verified" tool_tip="Espelli i residenti che non hanno la loro età verificata. Vedi [SUPPORT_SITE] per maggiori informazioni."/> <check_box label="Permetti la chat voice" name="voice_chat_check"/> <button label="?" name="voice_chat_help"/> <check_box label="Permetti teleport diretto" name="allow_direct_teleport"/> @@ -40,7 +39,7 @@ avranno effetto su tutte le regioni della proprietà . </string> <button label="?" name="abuse_email_address_help"/> <button label="Applica" name="apply_btn"/> - <button font="SansSerifSmall" label="Espelli persona dalle proprietà ..." name="kick_user_from_estate_btn"/> + <button font="SansSerifSmall" label="Espelli residente dalla proprietà ..." name="kick_user_from_estate_btn"/> <button font="SansSerifSmall" label="Manda un messaggio di le proprietà ..." name="message_estate_btn"/> <text name="estate_manager_label"> Manager delle proprietà : diff --git a/indra/newview/skins/default/xui/it/panel_region_general.xml b/indra/newview/skins/default/xui/it/panel_region_general.xml index 8c31172ab5..6ca5dd878e 100644 --- a/indra/newview/skins/default/xui/it/panel_region_general.xml +++ b/indra/newview/skins/default/xui/it/panel_region_general.xml @@ -3,51 +3,41 @@ <text name="region_text_lbl"> Regione: </text> - <text name="region_text" left="70"> + <text left="70" name="region_text"> sconosciuta </text> <text name="version_channel_text_lbl"> Versione: </text> - <text name="version_channel_text" left="70"> + <text left="70" name="version_channel_text"> sconosciuta </text> <text name="region_type_lbl"> Tipo: </text> - <text name="region_type" left="70"> + <text left="70" name="region_type"> sconosciuto </text> <check_box label="Proibisci la modifica del terreno" name="block_terraform_check"/> - <button label="?" name="terraform_help"/> <check_box label="Impedisci il volo" name="block_fly_check"/> - <button label="?" name="fly_help"/> <check_box label="Abilita i danni" name="allow_damage_check"/> - <button label="?" name="damage_help"/> <check_box label="Limita gli urti" name="restrict_pushobject"/> - <button label="?" name="restrict_pushobject_help"/> <check_box label="Abilita la rivendita del terreno" name="allow_land_resell_check"/> - <button label="?" name="land_resell_help" left="260"/> <check_box label="Abilita unione/suddivisione del terreno" name="allow_parcel_changes_check"/> - <button label="?" name="parcel_changes_help" left="260" /> <check_box label="Proibisci che il terreno appaia nelle ricerche" name="block_parcel_search_check" tool_tip="Permetti che le persone vedano questa regione e le sue suddivisioni nei risultati delle ricerche"/> - <button label="?" name="parcel_search_help" left="260"/> - <spinner label="Limite massimo di avatar" name="agent_limit_spin" label_width="135" width="190"/> - <button label="?" name="agent_limit_help"/> - <spinner label="Bonus di oggetti" name="object_bonus_spin" label_width="135" width="190"/> - <button label="?" name="object_bonus_help"/> + <spinner label="Limite massimo di avatar" label_width="135" name="agent_limit_spin" width="190"/> + <spinner label="Bonus di oggetti" label_width="135" name="object_bonus_spin" width="190"/> <text label="Maturità " name="access_text" width="120"> Categoria di accesso: </text> - <combo_box label="Mature" name="access_combo" left="126" width="74"> - <combo_box.item label="Adult" name="Adult"/> - <combo_box.item label="Mature" name="Mature"/> - <combo_box.item label="PG" name="PG"/> - </combo_box> - <button label="?" name="access_help"/> + <icons_combo_box label="Moderato" left="126" name="access_combo" width="74"> + <icons_combo_box.item label="Adulti" name="Adult" value="42"/> + <icons_combo_box.item label="Moderato" name="Mature" value="21"/> + <icons_combo_box.item label="Generale" name="PG" value="13"/> + </icons_combo_box> <button label="Applica" name="apply_btn"/> - <button label="Teletrasporta a casa un utente..." name="kick_btn"/> - <button label="Teletrasporta a casa tutti gli utenti..." name="kick_all_btn"/> + <button label="Teleport a casa un residente..." name="kick_btn"/> + <button label="Teleport a casa tutti i residenti..." name="kick_all_btn"/> <button label="Invia messaggio alla regione..." name="im_btn"/> <button label="Gestisci snodo di teleport..." name="manage_telehub_btn" width="210"/> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_region_general_layout.xml b/indra/newview/skins/default/xui/it/panel_region_general_layout.xml new file mode 100644 index 0000000000..4cf31f4b6e --- /dev/null +++ b/indra/newview/skins/default/xui/it/panel_region_general_layout.xml @@ -0,0 +1,43 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Regione" name="General"> + <text name="region_text_lbl"> + Regione: + </text> + <text name="region_text"> + sconosciuto + </text> + <text name="version_channel_text_lbl"> + Versione: + </text> + <text name="version_channel_text"> + sconosciuto + </text> + <text name="region_type_lbl"> + Tipo: + </text> + <text name="region_type"> + sconosciuto + </text> + <check_box label="Impedisci Terraform" name="block_terraform_check"/> + <check_box label="Impedisci volo" name="block_fly_check"/> + <check_box label="Permetti danni" name="allow_damage_check"/> + <check_box label="Limita spinte" name="restrict_pushobject"/> + <check_box label="Permetti la rivendita dei terreni" name="allow_land_resell_check"/> + <check_box label="Permetti l'unione/divisione del terreno" name="allow_parcel_changes_check"/> + <check_box label="Impedisci la visualizzazione del terreno nelle ricerche" name="block_parcel_search_check" tool_tip="Permetti alla gente di vedere questa regione e i suoi lotti nei risultati dellla ricerca"/> + <spinner label="N. massimo di avatar" name="agent_limit_spin"/> + <spinner label="Bonus oggetto" name="object_bonus_spin"/> + <text label="Categoria di accesso" name="access_text"> + Categoria: + </text> + <combo_box label="Moderato" name="access_combo"> + <combo_box.item label="Adulti" name="Adult"/> + <combo_box.item label="Moderato" name="Mature"/> + <combo_box.item label="Generale" name="PG"/> + </combo_box> + <button label="Applica" name="apply_btn"/> + <button label="Teleport a casa un residente..." name="kick_btn"/> + <button label="Teleport a casa tutti i residenti..." name="kick_all_btn"/> + <button label="Invia messaggio alla regione..." name="im_btn"/> + <button label="Gestisci telehub..." name="manage_telehub_btn"/> +</panel> diff --git a/indra/newview/skins/default/xui/it/panel_region_texture.xml b/indra/newview/skins/default/xui/it/panel_region_texture.xml index 23d6915a2f..1337ed18ca 100644 --- a/indra/newview/skins/default/xui/it/panel_region_texture.xml +++ b/indra/newview/skins/default/xui/it/panel_region_texture.xml @@ -25,16 +25,16 @@ Range di elevazione della texture </text> <text name="height_text_lbl6"> - Sud Ovest + Nordovest </text> <text name="height_text_lbl7"> - Nord Ovest + Nordest </text> <text name="height_text_lbl8"> - Sud Est + Sudovest </text> <text name="height_text_lbl9"> - Nord Est + Sudest </text> <spinner label="Bassa" name="height_start_spin_0"/> <spinner label="Bassa" name="height_start_spin_1"/> @@ -45,10 +45,10 @@ <spinner label="Alta" name="height_range_spin_2"/> <spinner label="Alta" name="height_range_spin_3"/> <text name="height_text_lbl10"> - Questi valori riproducono l'insieme della gamma delle textures superiori. + Questi valori indicano la gamma di miscele per le texture di cui sopra. </text> <text name="height_text_lbl11"> - Misurato in metri, il valore MINIMO è l'altezza MASSIMA della Texture n°1, e il valore MASSIMO è l'altezza MINIMA della Texture n°4. + Misurato in metri, il valore BASSO è la MASSIMA altezza della texture n. 1, e il valore ALTO è l'altezza MINIMA della texture n. 4. </text> <text name="height_text_lbl12"> Texture #1, e il valore più ALTO all'altezza MINIMA della Texture #4. diff --git a/indra/newview/skins/default/xui/it/panel_script_ed.xml b/indra/newview/skins/default/xui/it/panel_script_ed.xml index a98a88950c..f550aee98e 100644 --- a/indra/newview/skins/default/xui/it/panel_script_ed.xml +++ b/indra/newview/skins/default/xui/it/panel_script_ed.xml @@ -1,43 +1,43 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="script panel"> <panel.string name="loading"> - Caricando... + Caricamento in corso... </panel.string> <panel.string name="can_not_view"> - Non puoi vedere o modificare questo script, perchè è impostato come "no copy". Necesiti tutti i permessi per vedere o modificare lo script dentro un oggetto.. + Per impostazione, questo script non può essere visualizzato né modificato. Per visualizzare o modificare uno script all'interno di un oggetto, devi avere i necessari diritti di modifica. </panel.string> <panel.string name="public_objects_can_not_run"> - Oggetti Pubblici non possono attivare scripts + Gli oggetti pubblici non possono eseguire gli script </panel.string> <panel.string name="script_running"> - Attivando + In esecuzione </panel.string> <panel.string name="Title"> Script: [NAME] </panel.string> <text_editor name="Script Editor"> - Caricando... + Caricamento in corso... </text_editor> <button label="Salva" label_selected="Salva" name="Save_btn"/> - <combo_box label="Inserire..." name="Insert..."/> + <combo_box label="Inserisci..." name="Insert..."/> <menu_bar name="script_menu"> <menu label="File" name="File"> <menu_item_call label="Salva" name="Save"/> - <menu_item_call label="Annulla tutti i cambiamenti" name="Revert All Changes"/> + <menu_item_call label="Annulla tutte le modifiche" name="Revert All Changes"/> </menu> <menu label="Modifica" name="Edit"> - <menu_item_call label="Slaccia" name="Undo"/> + <menu_item_call label="Annulla" name="Undo"/> <menu_item_call label="Rifai" name="Redo"/> <menu_item_call label="Taglia" name="Cut"/> <menu_item_call label="Copia" name="Copy"/> <menu_item_call label="Incolla" name="Paste"/> - <menu_item_call label="Seleziona Tutto" name="Select All"/> + <menu_item_call label="Seleziona tutto" name="Select All"/> <menu_item_call label="Deseleziona" name="Deselect"/> <menu_item_call label="Cerca / Sostituisci..." name="Search / Replace..."/> </menu> - <menu label="Aiuto" name="Help"> + <menu label="Guida" name="Help"> <menu_item_call label="Aiuto..." name="Help..."/> - <menu_item_call label="Aiuto nella tastiera..." name="Keyword Help..."/> + <menu_item_call label="Aiuto con parole chiave..." name="Keyword Help..."/> </menu> </menu_bar> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_script_limits_my_avatar.xml b/indra/newview/skins/default/xui/it/panel_script_limits_my_avatar.xml new file mode 100644 index 0000000000..98096a391a --- /dev/null +++ b/indra/newview/skins/default/xui/it/panel_script_limits_my_avatar.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="IL MIO AVATAR" name="script_limits_my_avatar_panel"> + <text name="script_memory"> + Uso degli script avatar + </text> + <text name="loading_text"> + Caricamento in corso... + </text> + <scroll_list name="scripts_list"> + <scroll_list.columns label="Dimensione (kb)" name="size"/> + <scroll_list.columns label="URL" name="urls"/> + <scroll_list.columns label="Nome dell'oggetto" name="name"/> + <scroll_list.columns label="Posizione" name="location"/> + </scroll_list> + <button label="Aggiorna lista" name="refresh_list_btn"/> +</panel> diff --git a/indra/newview/skins/default/xui/it/panel_script_limits_region_memory.xml b/indra/newview/skins/default/xui/it/panel_script_limits_region_memory.xml new file mode 100644 index 0000000000..df7b0eae1c --- /dev/null +++ b/indra/newview/skins/default/xui/it/panel_script_limits_region_memory.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="MEMORIA DELLA REGIONE" name="script_limits_region_memory_panel"> + <text name="script_memory"> + Memoria dello script del lotto + </text> + <text name="loading_text"> + Caricamento in corso... + </text> + <scroll_list name="scripts_list"> + <scroll_list.columns label="Dimensione (kb)" name="size"/> + <scroll_list.columns label="URL" name="urls"/> + <scroll_list.columns label="Nome dell'oggetto" name="name"/> + <scroll_list.columns label="Proprietario dell'oggetto" name="owner"/> + <scroll_list.columns label="Lotto" name="parcel"/> + <scroll_list.columns label="Posizione" name="location"/> + </scroll_list> + <button label="Aggiorna lista" name="refresh_list_btn"/> + <button label="In evidenza" name="highlight_btn"/> + <button label="Restituisci" name="return_btn"/> +</panel> diff --git a/indra/newview/skins/default/xui/it/panel_side_tray.xml b/indra/newview/skins/default/xui/it/panel_side_tray.xml index 06bc51f5db..e0143088a5 100644 --- a/indra/newview/skins/default/xui/it/panel_side_tray.xml +++ b/indra/newview/skins/default/xui/it/panel_side_tray.xml @@ -2,25 +2,28 @@ <!-- Side tray cannot show background because it is always partially on screen to hold tab buttons. --> <side_tray name="sidebar"> - <sidetray_tab description="Casa." name="sidebar_home"> + <sidetray_tab description="Apri/chiudi la barra laterale." name="sidebar_openclose" tab_title="Apri/chiudi la barra laterale"/> + <sidetray_tab description="Casa." name="sidebar_home" tab_title="Home"> <panel label="casa" name="panel_home"/> </sidetray_tab> - <sidetray_tab description="Trova i tuoi amici, contatti e persone nelle vicinanze." name="sidebar_people"> + <sidetray_tab description="Modifica il tuo profilo pubblico e i preferiti." name="sidebar_me" tab_title="Il mio profilo"> <panel_container name="panel_container"> - <panel label="Info di Gruppo" name="panel_group_info_sidetray"/> - <panel label="Residenti bloccati & Oggetti" name="panel_block_list_sidetray"/> + <panel label="Io" name="panel_me"/> </panel_container> </sidetray_tab> - <sidetray_tab description="Trova luoghi dove andare e luoghi già visitati." label="Luoghi" name="sidebar_places"> - <panel label="Luoghi" name="panel_places"/> + <sidetray_tab description="Trova amici, contatti e persone nelle vicinanze." name="sidebar_people" tab_title="Persone"> + <panel_container name="panel_container"> + <panel label="Profilo del gruppo" name="panel_group_info_sidetray"/> + <panel label="Residenti e oggetti bloccati" name="panel_block_list_sidetray"/> + </panel_container> </sidetray_tab> - <sidetray_tab description="Modifica il tuo profilo pubblico e le foto." name="sidebar_me"> - <panel label="Io" name="panel_me"/> + <sidetray_tab description="Trova luoghi dove andare e luoghi già visitati." label="Luoghi" name="sidebar_places" tab_title="Luoghi"> + <panel label="Luoghi" name="panel_places"/> </sidetray_tab> - <sidetray_tab description="Cambia il tuo aspetto ed il tuo look attuale." name="sidebar_appearance"> - <panel label="Modifica Aspetto" name="sidepanel_appearance"/> + <sidetray_tab description="Sfoglia il tuo inventario." name="sidebar_inventory" tab_title="Il mio inventario"> + <panel label="Modifica inventario" name="sidepanel_inventory"/> </sidetray_tab> - <sidetray_tab description="Curiosa nel tuo inventario." name="sidebar_inventory"> - <panel label="Modifica Inventario" name="sidepanel_inventory"/> + <sidetray_tab description="Cambia il tuo aspetto ed il tuo look attuale." name="sidebar_appearance" tab_title="Il mio aspetto"> + <panel label="Modifica aspetto fisico" name="sidepanel_appearance"/> </sidetray_tab> </side_tray> diff --git a/indra/newview/skins/default/xui/it/panel_side_tray_tab_caption.xml b/indra/newview/skins/default/xui/it/panel_side_tray_tab_caption.xml index 5e5f229ce4..753e89f2fd 100644 --- a/indra/newview/skins/default/xui/it/panel_side_tray_tab_caption.xml +++ b/indra/newview/skins/default/xui/it/panel_side_tray_tab_caption.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="sidetray_tab_panel"> - <text name="sidetray_tab_title" value="Vaschetta laterale"/> + <text name="sidetray_tab_title" value="Pannello laterale"/> <button name="show_help" tool_tip="Mostra Aiuto"/> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_stand_stop_flying.xml b/indra/newview/skins/default/xui/it/panel_stand_stop_flying.xml index 2fafc38ba1..e4ff7019ec 100644 --- a/indra/newview/skins/default/xui/it/panel_stand_stop_flying.xml +++ b/indra/newview/skins/default/xui/it/panel_stand_stop_flying.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <!-- Width and height of this panel should be synchronized with "panel_modes" in the floater_moveview.xml--> <panel name="panel_stand_stop_flying"> - <button label="Stare in piedi" name="stand_btn" tool_tip="Clicca qui per alzarti."/> + <button label="Alzati" name="stand_btn" tool_tip="Clicca qui per alzarti."/> <button label="Ferma il volo" name="stop_fly_btn" tool_tip="Ferma il volo"/> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_status_bar.xml b/indra/newview/skins/default/xui/it/panel_status_bar.xml index 9acbb34c79..6b1a8aa71b 100644 --- a/indra/newview/skins/default/xui/it/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/it/panel_status_bar.xml @@ -21,9 +21,13 @@ <panel.string name="buycurrencylabel"> L$ [AMT] </panel.string> - <button label="" label_selected="" name="buycurrency" tool_tip="Il mio saldo: Clicca per comprare più L$"/> - <text name="TimeText" tool_tip="Ora attuale (Pacific)"> - 12:00 AM + <panel name="balance_bg"> + <text name="balance" tool_tip="Il mio saldo" value="L$ 20"/> + <button label="ACQUISTA L$" name="buyL" tool_tip="Clicca per acquistare più L$"/> + </panel> + <text name="TimeText" tool_tip="Orario attuale (Pacifico)"> + 24:00, ora del Pacifico </text> - <button name="volume_btn" tool_tip="Controllo del volume globale"/> + <button name="media_toggle_btn" tool_tip="Attiva/ferma tutti i media (musica, video, pagine Web)"/> + <button name="volume_btn" tool_tip="Regolazione del volume globale"/> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_teleport_history.xml b/indra/newview/skins/default/xui/it/panel_teleport_history.xml index 3f02b1449a..85f8f87e68 100644 --- a/indra/newview/skins/default/xui/it/panel_teleport_history.xml +++ b/indra/newview/skins/default/xui/it/panel_teleport_history.xml @@ -3,12 +3,16 @@ <accordion name="history_accordion"> <accordion_tab name="today" title="Oggi"/> <accordion_tab name="yesterday" title="Ieri"/> - <accordion_tab name="2_days_ago" title="2 giorni fà "/> - <accordion_tab name="3_days_ago" title="3 giorni fà "/> - <accordion_tab name="4_days_ago" title="4 giorni fà "/> - <accordion_tab name="5_days_ago" title="5 giorni fà "/> - <accordion_tab name="6_days_and_older" title="6 giorni fà o più vecchio"/> - <accordion_tab name="1_month_and_older" title="1 mese o più vecchio"/> - <accordion_tab name="6_months_and_older" title="6 mesi o più vecchio"/> + <accordion_tab name="2_days_ago" title="2 giorni fa"/> + 5 + <accordion_tab name="3_days_ago" title="3 giorni fa"/> + <accordion_tab name="4_days_ago" title="4 giorni fa"/> + <accordion_tab name="5_days_ago" title="5 giorni fa"/> + <accordion_tab name="6_days_and_older" title="6 giorni o precedente"/> + <accordion_tab name="1_month_and_older" title="1 mese o precedente"/> + <accordion_tab name="6_months_and_older" title="6 mesi o precedente"/> </accordion> + <panel name="bottom_panel"> + <button name="gear_btn" tool_tip="Mostra opzioni addizionali"/> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_teleport_history_item.xml b/indra/newview/skins/default/xui/it/panel_teleport_history_item.xml new file mode 100644 index 0000000000..2ba4baacaf --- /dev/null +++ b/indra/newview/skins/default/xui/it/panel_teleport_history_item.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="teleport_history_item"> + <button name="profile_btn" tool_tip="Mostra informazioni dell'oggetto"/> +</panel> diff --git a/indra/newview/skins/default/xui/it/panel_voice_effect.xml b/indra/newview/skins/default/xui/it/panel_voice_effect.xml new file mode 100644 index 0000000000..78ce1ff24a --- /dev/null +++ b/indra/newview/skins/default/xui/it/panel_voice_effect.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_voice_effect"> + <string name="no_voice_effect"> + Nessuna manipolazione voce + </string> + <string name="preview_voice_effects"> + Anteprima manipolazione voce â–¶ + </string> + <string name="get_voice_effects"> + Ottieni manipolazione voce â–¶ + </string> + <combo_box name="voice_effect" tool_tip="Scegli un effetto di manipolazione per modificare il suono della tua voce."> + <combo_box.item label="Nessuna manipolazione voce" name="no_voice_effect"/> + </combo_box> +</panel> diff --git a/indra/newview/skins/default/xui/it/panel_world_map.xml b/indra/newview/skins/default/xui/it/panel_world_map.xml index 1349b36e2c..642af75028 100644 --- a/indra/newview/skins/default/xui/it/panel_world_map.xml +++ b/indra/newview/skins/default/xui/it/panel_world_map.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="world_map"> <panel.string name="Loading"> - Sto Caricando... + Caricamento in corso... </panel.string> <panel.string name="InvalidLocation"> Luogo non valido @@ -30,6 +30,12 @@ <panel.string name="world_map_northwest"> NO </panel.string> + <panel.string name="world_map_person"> + 1 persona + </panel.string> + <panel.string name="world_map_people"> + [NUMBER] persone + </panel.string> <text label="N" name="floater_map_north" text="N"> N </text> diff --git a/indra/newview/skins/default/xui/it/role_actions.xml b/indra/newview/skins/default/xui/it/role_actions.xml index eab8e6b4e3..e3f95f7f86 100644 --- a/indra/newview/skins/default/xui/it/role_actions.xml +++ b/indra/newview/skins/default/xui/it/role_actions.xml @@ -1,72 +1,72 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <role_actions> - <action_set description="Queste abilità permettono di aggiungere e rimuovere Membri dal gruppo, e permettono ai nuovi membri di aderire al gruppo senza invito." name="Membership"> - <action description="Invitare persone in questo Gruppo" longdescription="Invita Persone in questo Gruppo usando il bottone 'Invita' nella sezione Ruoli > tabella Membri." name="member invite"/> - <action description="Espellere Membri da questo Gruppo" longdescription="Espelli Membri dal Gruppo usando il bottone 'Espelli' nella sezione Ruoli > tabella Membri. Un Proprietario può espellere chiunque eccetto un altro Proprietario. Se tu non sei un Proprietario, un Membro può essere espulso da un gruppo solo ed unicamente, se hanno il Ruolo Everyone, e nessun altro Ruolo. Per rimuovere Membri dai Ruoli, devi avere l'Abilità 'Rimuovi Membri dai Ruoli'." name="member eject"/> - <action description="Seleziona 'Iscrizione libera' e modifica da 'Tassa d'Iscrizione'" longdescription="Seleziona 'Iscrizione libera' per permettere ai nuovi Membri di aderire senza invito, e modifica da 'Tassa d'Iscrizione' nella sezione Generale." name="member options"/> + <action_set description="Queste abilità permettono di aggiungere e rimuovere membri dal gruppo e consentono ai nuovi membri di aderire al gruppo senza invito." name="Membership"> + <action description="Invita persone in questo gruppo" longdescription="Invita persone in questo gruppo usando il pulsante Invita nella sezione Ruoli > scheda membri." name="member invite"/> + <action description="Espelli membri da questo gruppo" longdescription="Espelli membri dal gruppo usando il pulsante Espelli nella sezione Ruoli > scheda membri. Un proprietario può espellere chiunque tranne un altro proprietario. Se non sei un proprietario, un membro può essere espulso da un gruppo soltanto qualora abbia soltanto il ruolo Tutti, e nessun altro ruolo. Per rimuovere membri dai ruoli, devi avere l'Abilità corrispondente." name="member eject"/> + <action description="Seleziona Iscrizione libera e modifica la Quota d'iscrizione" longdescription="Seleziona Iscrizione libera per permettere ai nuovi membri di aderire senza invito e modifica la quota d'iscrizione nella scheda Generale." name="member options"/> </action_set> - <action_set description="Queste Abilità permettono di aggiungere, rimuovere, cambiare i Ruoli del Gruppo, aggiungere e rimuovere Membri dai Ruoli, e assegnare Abilità ai Ruoli." name="Roles"> - <action description="Creare nuovi Ruoli" longdescription="Crea nuovi Ruoli nella sezione Ruoli > tabella Ruoli." name="role create"/> - <action description="Cancellare Ruoli" longdescription="Cancella Ruoli nella sezione Ruoli > tabella Ruoli." name="role delete"/> - <action description="Cambia i nomi del Ruolo, titoli, descrizioni, se i membri in quel Ruolo sono resi pubblici" longdescription="Cambia i nomi del Ruolo, titoli, descrizioni, se i membri in quel Ruolo sono resi pubblici. Viene fatto nella parte bassa della sezione Ruoli > tabella Ruoli dopo avere selezionato un Ruolo." name="role properties"/> - <action description="Incaricare Membri ad Assegnare Ruoli" longdescription="Assegna un Ruolo a Membri nella lista dei Ruoli assegnati (Roles section > Members tab). Un Membro con questa Abilità può aggiungere Membri ad un Ruolo già presente nell'elenco." name="role assign member limited"/> - <action description="Assegnare Membri a tutti i Ruoli" longdescription="Assegna Tutti i Ruoli a Membri nella lista dei Ruoli Assegnati (Roles section > Members tab). *ATTENZIONE* Ogni Membro con questo Ruolo e Abilità può assegnarsi -- e assegnare ad altri Membri non Proprietari-- Ruoli con poteri maggiori di quelli normalmente concessi, potenzialmente elevandosi ai poteri concessi al Proprietario. Siate sicuri di quello che fate prima di assegnare questa Abilità ." name="role assign member"/> - <action description="Rimuovere Membri dai Ruoli" longdescription="Rimuovi dai Ruoli i Membri nella lista dei Ruoli Assegnati (Roles section > Members tab). Il Proprietario non può essere rimosso." name="role remove member"/> - <action description="Assegnare e Rimuovere Abilità nei Ruoli" longdescription="Assegna e Rimuovi Abilità per ogni Ruolo nella lista dei Ruoli Assegnati (Roles section > Roles tab). *ATTENZIONE* Ogni Membro con questo Ruolo e Abilità può assegnarsi --ed assegnare ad altri Membri non Proprietà -- tutte le Abilità , che potenzialmente lo elevano ai poteri ai poteri concessi al Proprietario. Siate sicuri di quello che fate prima di assegnare questa Abilità ." name="role change actions"/> + <action_set description="Queste Abilità permettono di aggiungere, rimuovere, cambiare i ruoli del gruppo, aggiungere e rimuovere membri dai ruoli, nonché assegnare abilità ai ruoli." name="Roles"> + <action description="Creare nuovi ruoli" longdescription="Crea nuovi ruoli nella sezione Ruoli > scheda ruoli." name="role create"/> + <action description="Eliminare ruoli" longdescription="Elimina ruoli nella sezione Ruoli > scheda ruoli." name="role delete"/> + <action description="Cambia i nomi di ruoli, i titoli, le descrizioni e definisci se i membri in quel ruolo sono resi pubblici" longdescription="Cambia i nomi di ruoli, i titoli, le descrizioni e definisci se i membri in quel ruolo sono resi pubblici Viene fatto nella parte inferiore della sezione Ruoli > scheda Ruoli, dopo avere selezionato un ruolo." name="role properties"/> + <action description="Assegnare membri a ruoli del responsabile" longdescription="Assegna un ruolo a membri nella lista dei ruoli assegnati (sezione Ruoli > scheda membri). Un utente con questa Abilità può aggiungere membri ad un ruolo nel quale il responsabile è già presente." name="role assign member limited"/> + <action description="Assegnare membri a qualsiasi ruolo" longdescription="Assegna i membri a qualsiasi ruolo nell'elenco dei ruoli assegnati (sezione Ruoli > scheda membri). *ATTENZIONE* Ogni membro con questo Ruolo e Abilità può assegnarsi -- e assegnare ad altri membri non proprietari -- ruoli con poteri maggiori di quelli normalmente concessi, potenzialmente con poteri analoghi a quelli di proprietario. Sii sicuro della scelta prima di assegnare questa Abilità ." name="role assign member"/> + <action description="Rimuovere membri dai ruoli" longdescription="Rimuovi dai ruoli i membri nell'elenco dei ruoli assegnati (sezione Ruoli > scheda membri). Il proprietario non può essere rimosso." name="role remove member"/> + <action description="Assegnare e rimuovere abilità nei ruoli" longdescription="Assegna e Rimuovi Abilità per ogni ruolo nell'elenco dei ruoli assegnati (sezione Ruoli > scheda Ruoli). *ATTENZIONE* Ogni membro con questo ruolo e Abilità può assegnarsi -- ed assegnare ad altri membri non proprietari -- tutte le Abilità , che potenzialmente con poteri analoghi a quelli di proprietario. Sii sicuro della scelta prima di assegnare questa Abilità ." name="role change actions"/> </action_set> - <action_set description="Queste Abilità permettono di modificare l'identità di questo Gruppo, come il cambiamento della visibilità pubblica, lo statuto, e lo stemma." name="Group Identity"> - <action description="Cambiare lo Statuto, lo Stemma, e 'Mostra nel Cerca/Search'" longdescription="Cambia Statuto, Immagine, e 'Mostra nel Cerca'. Viene fatto nella sezione Generale." name="group change identity"/> + <action_set description="Queste abilità autorizzano a modificare l'identità di questo gruppo, come ad esempio la modifica della visibilità pubblica, lo statuto e il logo." name="Group Identity"> + <action description="Cambiare lo statuto, il logo, e 'Mostra nella ricerca'" longdescription="Cambia statuto, logo e 'Mostra nella ricerca'. Viene fatto nella sezione Generale." name="group change identity"/> </action_set> - <action_set description="Queste Abilità includono il potere di intestare, modificare, e vendere terreni di proprietà del Gruppo. Per aprire la finestra Info sul Terreno, click destro sulla terra e seleziona 'Info sul Terreno', o clicca l'icona 'i' sulla Barra di Navigazione." name="Parcel Management"> - <action description="Intestare terra e comprare terra per il gruppo" longdescription="Intesta terra e compra terra per il Gruppo. Viene fatto in Informazioni sul Terreno > tabella Generale." name="land deed"/> - <action description="Abbandonare la terra in favore di Governor Linden" longdescription="Abbandona la terra in favore di Governor Linden. *ATTENZIONE* Ogni Membro con questo Ruolo e Abilità può abbandonare la terra posseduta dal Gruppo in Informazioni sul Terreno > tabella Generale, restituendola alla proprietà Linden senza una vendita! Devi essere sicuro di quello che fai prima di assegnare questa Abilità ." name="land release"/> - <action description="Impostare le info per la vendita della terra" longdescription="Imposta le info per la vendita della terra. *ATTENZIONE* Ogni Membro con questo Ruolo e Abilità può vendere la terra posseduta dal Gruppo in Info sul Terreno > tabella Generale (al prezzo che vogliono)! Devi essere sicuro di quello che fai prima di assegnare questa Abilità ." name="land set sale info"/> - <action description="Suddividere e unire appezzamenti" longdescription="Suddividi e unisci parcel. Viene fatto con click destro sul terra, 'Modifica Terreno', trascinando poi il mouse sulla terra per creare una selezione. Per suddividere, seleziona quale parte vuoi dividere e clicca 'Suddividere'. Per unire, seleziona due o più two parcel confinanti e clicca 'Unisci'." name="land divide join"/> + <action_set description="Queste Abilità comprendono il potere di intestare, modificare e vendere terreni di proprietà del gruppo. Per aprire la finestra Informazioni sul terreno, fai clic con il pulsante destro del mouse sul terreno e seleziona Informazioni sul terreno, o clicca sull'icona 'i' nella Barra di Navigazione." name="Parcel Management"> + <action description="Cessione di terreno e acquisto di terreno per il gruppo" longdescription="Intesta terreno e acquista terreno per il gruppo. Ciò viene fatto in Informazioni sul terreno > scheda Generale." name="land deed"/> + <action description="Abbandonare il terreno in favore di Governor Linden" longdescription="Abbandona il terreno in favore di Governor Linden. *ATTENZIONE* Ogni membro con questo ruolo e abilità può abbandonare il terreno di proprietà del gruppo in Informazioni sul terreno > scheda Generale, restituendolo alla proprietà Linden senza effettuare una vendita. Sii sicuro della scelta prima di assegnare questa Abilità ." name="land release"/> + <action description="Informazioni su come impostare il terreno come in vendita" longdescription="Imposta le informazioni per la vendita del terreno. *ATTENZIONE* Ogni Membro con questo ruolo e abilità può vendere il terreno di proprietà del gruppo nella scheda Informazioni sul terreno > scheda Generale. Pertanto sii sicuro della scelta prima di assegnare questa Abilità ." name="land set sale info"/> + <action description="Suddividere e unire lotti" longdescription="Suddividi e unisci lotti. Viene fatto cliccando con il pulsante destro del mouse sul terreno, selezionando Modifica terreno e trascinando il mouse sul terreno per creare una selezione. Per suddividere, seleziona quale parte vuoi dividere e clicca su Suddividi. Per unire, seleziona due o più lotti confinanti e clicca su Unisci." name="land divide join"/> </action_set> - <action_set description="Queste Abilità permettono di cambiare il nome dell'appezzamento, le impostazioni pre-definite, la visibilità nella mappatura, il punto di arrivo & le coordinate del Teleport." name="Parcel Identity"> - <action description="Premi 'Mostra Luogo nel Cerca' e seleziona una categoria" longdescription="Premi 'Mostra Luogo nel Cerca' e seleziona una categoria di parcel in Info sul Terreno > tabella Opzioni." name="land find places"/> - <action description="Cambia il nome del parcel, descrizione, e impostazioni nel 'Mostra Luogo nel Cerca'" longdescription="Cambia il nome del parcel, descrizione, e impostazioni nel 'Mostra Luogo nel Cerca'. Viene fatto in Info sul Terreno > tabella Opzioni." name="land change identity"/> - <action description="Impostare il punto di arrivo e le coordinate del Teleport" longdescription="In un appezzamento posseduto da un Gruppo, i Membri con questo Ruolo e Abilità possono impostare un punto di arrivo per i Teleport entranti, e impostare anche le coordinate del Teleport per ulteriore precisione. Viene fatto in Informazioni sul Terreno > tabella Opzioni." name="land set landing point"/> + <action_set description="Queste abilità permettono di cambiare il nome del lotto, le impostazioni di pubblicazione, la visibilità negli elenchi e il punto di arrivo, nonché opzioni di indirizzamento del Teleport." name="Parcel Identity"> + <action description="Premi Mostra luogo nella ricerca e seleziona una categoria" longdescription="Premi Mostra luogo nella ricerca e seleziona una categoria di lotto in Informazioni sul terreno > scheda Opzioni." name="land find places"/> + <action description="Cambia il nome del lotto, la descrizione e le impostazioni di Mostra luogo nella ricerca" longdescription="Cambia il nome del lotto, la descrizione e le impostazioni di Mostra luogo nella ricerca. Ciò viene fatto in Informazioni sul terreno > scheda Opzioni." name="land change identity"/> + <action description="Impostare il punto di arrivo e l'indirizzamento del Teleport" longdescription="In un lotto di proprietà di un gruppo, i membri con questo ruolo e abilità possono impostare un punto di arrivo per i teleport entranti e impostare anche l'indirizzamento del teleport per ulteriore precisione. Viene fatto in Informazioni sul terreno > Opzioni." name="land set landing point"/> </action_set> - <action_set description="Queste Abilità permettono alcune permessi nell'appezzamento, quali 'Creare Oggetti', 'Editare il Terreno', trasmettere musica & tabella Media." name="Parcel Settings"> - <action description="Cambiare musica & tabella media" longdescription="Cambia le impostazioni per lo streaming della musica e dei video in Informazioni sul Terreno > tabella Media." name="land change media"/> - <action description="Cliccare 'Edita il Terreno'" longdescription="Clicca 'Edita il Terreno'. *ATTENZIONE* Informazioni sul Terreno > tabella Opzioni > Edita il Terreno permette a tutti di modificare la forma del terreno, collocare e spostare le piante Linden. Devi essere sicuro di quello che fai prima di assignera questa Abilità . Edita il terreno in Informazioni sul Terreno > tabella Opzioni." name="land edit"/> - <action description="Cliccare Informazioni sul Terreno > Impostazione Opzioni" longdescription="Premi 'Salvo (nessun danno)', 'Vola', e permetti agli altri Residenti di: 'modifica Terreno', 'Crea', 'Crea Landmarks', e 'Scripts attivi' nella terra posseduta da un Gruppo in Info sul Terreno > tabella Opzioni." name="land options"/> + <action_set description="Queste abilità hanno poteri relativi alle opzioni dei lotti, come la creazione di oggetti, la modifica del terreno e le impostazioni per la musica e gli elementi multimediali." name="Parcel Settings"> + <action description="Cambiare impostazioni musica e multimediali" longdescription="Cambia le impostazioni per lo streaming della musica e dei video in Informazioni sul terreno > Media." name="land change media"/> + <action description="Attiva 'Modifica terreno'" longdescription="Attiva 'Modifica terreno'. *ATTENZIONE* Informazioni sul terreno > Opzioni > Modifica terreno consente a chiunque di modificare la forma del tuo terreno e di collocare e spostare le piante Linden. Pertanto sii sicuro della scelta prima di assegnare questa Abilità . La funzione di modifica del terreno è attivata in Informazioni sul terreno > Opzioni." name="land edit"/> + <action description="Attivazione di parametri per Informazioni sul terreno > Opzioni" longdescription="Premi Sicuro (nessun danno), Vola e consenti agli altri residenti di: modificare il terreno, costruire, creare punti di riferimento ed eseguire script nel terreno appartenente ad un gruppo in Informazioni sul terreno > scheda Opzioni." name="land options"/> </action_set> - <action_set description="Queste Abilità permettono ai Membri di non avere restrizioni in un appezzamento posseduto da un Gruppo." name="Parcel Powers"> - <action description="Permettere sempre 'Edita il Terreno'" longdescription="I Membri con questo Ruolo e Abilità possono editare il terreno posseduto da un Gruppo, anche se non è selezionato in Informazioni sul Terreno > tabella Opzioni." name="land allow edit land"/> - <action description="Permettere Vola Sempre'" longdescription="I Membri con questo Ruolo e Abilità possono volare in un terreno posseduto da un Gruppo, anche se non è selezionato in Info sul Terreno > tabella Opzioni." name="land allow fly"/> - <action description="Permettere 'Crea Oggetti' sempre" longdescription="I Membri con questo Ruolo e Abilità possono creare oggetti in un appezzamento posseduto da un Gruppo, anche se non è selezionato in Informazioni sul Terreno > tabella Opzioni." name="land allow create"/> - <action description="Permettere 'Crea Landmark' sempre" longdescription="I Membri con questo Ruolo e Abilità possono creare Landmark in un appezzamento posseduto da un Gruppo , anche se non è evidenziato in Informazioni sul Terreno > tabella Opzioni." name="land allow landmark"/> - <action description="Permettere 'Teleportami a Casa' in un appezzamento di un Gruppo" longdescription="I Membri in un Ruolo con questa Abilità possono usare il menu Mondo > Landmarks > Imposta come Casa su un parcel intestato ad un Gruppo." name="land allow set home"/> + <action_set description="Queste abilità permettono ai membri di non avere restrizioni in un lotto appartenente ad un gruppo." name="Parcel Powers"> + <action description="Consenti sempre la modifica del terreno" longdescription="I membri con questo ruolo e abilità possono modificare il terreno appartenente ad un gruppo, anche se la funzionalità è disattivata in Informazioni sul terreno > Opzioni." name="land allow edit land"/> + <action description="Consenti sempre il volo" longdescription=" I membri con questo ruolo e abilità possono volare in un terreno appartenente ad un gruppo, anche se la funzionalità è disattivata in Informazioni sul terreno > Opzioni." name="land allow fly"/> + <action description="Consenti sempre la creazione di oggetti" longdescription="I membri con questo ruolo e abilità possono creare oggetti in un lotto appartenente ad un gruppo, anche se la funzionalità è disattivata in Informazioni sul terreno > Opzioni." name="land allow create"/> + <action description="Consenti sempre la creazione di punti di riferimento" longdescription="I membri con questo ruolo e abilità possono creare punti di riferimento in un lotto appartenente ad un gruppo, anche se la funzionalità è disattivata in Informazioni sul terreno > Opzioni." name="land allow landmark"/> + <action description="Consenti la funzione 'Imposta come Casa mia' in un lotto di gruppo" longdescription="I membri in un ruolo con questa Abilità possono usare il menu Mondo > Punti di riferimento > Imposta come Casa su un lotto ceduto a questo gruppo." name="land allow set home"/> </action_set> - <action_set description="Queste Abilità permettono di concedere o limitare l'accesso ad un appezzamento di un Gruppo, e includono Congela ed Espelli un Residente." name="Parcel Access"> - <action description="Gestire la lista degli Accessi Consentiti" longdescription="Gestisci la lista degli Accessi Consentiti in Informazioni sul Terreno > tabella Accesso." name="land manage allowed"/> - <action description="Gestire la lista degli Accessi Bloccati" longdescription="Gestisci la lista Espulsi dal parcel in Info sul Terreno > tabella Accesso." name="land manage banned"/> - <action description="Cambia le impostazioni del parcel in 'Vendi Pass a'" longdescription="Cambia le impostazioni 'Vendi Pass a' in Info sul Terreno > tabella Accesso." name="land manage passes"/> - <action description="Espellere e Congelare i Residenti in un appezzamento" longdescription="Membri in un Ruolo con questa Abilità possono occuparsi di un residente indesiderato in un parcel posseduto da un Gruppo, con click destro sul residente, selezionando 'Espelli' o 'Immobilizza'." name="land admin"/> + <action_set description="Queste Abilità consentono di concedere o limitare l'accesso ad un lotto di un gruppo da parte di residenti, con le azioni Congela ed Espelli." name="Parcel Access"> + <action description="Gestire la lista di accesso al lotto" longdescription="Gestisci la lista di accesso al lotto in Informazioni sul terreno > Accesso." name="land manage allowed"/> + <action description="Gestire la lista dei residenti espulsi dal lotto" longdescription="Gestisci la lista Espulsi dal lotto in Informazioni sul terreno > scheda Accesso." name="land manage banned"/> + <action description="Cambia le impostazioni del lotto in Vendi pass a" longdescription="Cambia le impostazioni Vendi pass a in Informazioni sul terreno > scheda Accesso." name="land manage passes"/> + <action description="Espellere e Congelare i Residenti in un lotto" longdescription="Membri in un ruolo con questa Abilità possono occuparsi di un residente indesiderato in un lotto posseduto da un gruppo, facendo clic sul residente con il pulsante destro del mouse e selezionando Espelli o Congela." name="land admin"/> </action_set> - <action_set description="Queste Abilità permettono ai Membri di restituire oggetti, collocare e spostare piante Linden. Questo è utile ai Membri per ripulire da oggetti indesiderati e creare paesaggi, ma deve essere utilizzato con cura, perchè non si può annullare la restituzione degli Oggetti." name="Parcel Content"> - <action description="Restituire oggetti posseduti da un Gruppo" longdescription="Restituisci gli oggetti posseduti da un Gruppo in un appezzamento di un Gruppo in Informazioni sul Terreno > tabella Oggetti." name="land return group owned"/> - <action description="Restituire oggetti concessi ad un Gruppo" longdescription="Restituisci oggetti concessi ad un Gruppo in un appezzamento di un Gruppo in Informazioni sul Terreno > tabella Oggetti." name="land return group set"/> - <action description="Restituire oggetti estranei al Gruppo" longdescription="Restituire oggetti estranei al Gruppo in un appezzamento di un Gruppo in Info sul Terreno > tabella Oggetti." name="land return non group"/> - <action description="Creare un paesaggio utilizzando le piante Linden" longdescription="Abilità di creare paesaggi di posizionare e spostare alberi, piante, erba. Questi oggetti sono presenti nella Libreria del tuo Inventario > Cartella Oggetti, o possono essere creati con il menu Crea." name="land gardening"/> + <action_set description="Queste abilità consentono ai membri di restituire oggetti, collocare e spostare piante Linden. Questo è utile ai membri per ripulire da oggetti indesiderati e creare paesaggi, ma deve essere utilizzato con cura, perchè la restituzione degli oggetti non può essere annullata." name="Parcel Content"> + <action description="Restituire oggetti di proprietà di un gruppo" longdescription="Restituisci gli oggetti di proprietà di un gruppo in un appezzamento di un gruppo in Informazioni sul terreno > Oggetti." name="land return group owned"/> + <action description="Restituire oggetti assegnati ad un gruppo" longdescription="Restituisci oggetti assegnati ad un gruppo in un lotto di un gruppo in Informazioni sul terreno > Oggetti." name="land return group set"/> + <action description="Restituire oggetti estranei al gruppo" longdescription="Restituire oggetti estranei al gruppo in un appezzamento di un gruppo in Informazioni sul terreno > Oggetti." name="land return non group"/> + <action description="Creare un paesaggio utilizzando le piante Linden" longdescription="Abilità di creare paesaggi e posizionare e spostare alberi, piante, erba Linden. Questi oggetti sono presenti nella Libreria del tuo Inventario > cartella Oggetti, o possono essere creati con il menu Crea." name="land gardening"/> </action_set> - <action_set description="Queste Abilità includono il potere di intestare, modificare, vendere oggetti posseduti dal gruppo. Viene fatto in Build Tools > tabella Generale. Click destro su un oggetto e Modifica per vedere le impostazioni." name="Object Management"> - <action description="Intestare oggetti ad un Gruppo" longdescription="Intesta oggetti ad un Gruppo in Build Tools > tabella Generale." name="object deed"/> - <action description="Modificare (sposta, copia, modifica) oggetti di un Gruppo" longdescription="Controlla (sposta, copia, modifica) gli oggetti posseduti da un Gruppo in Build Tools > tabella Generale." name="object manipulate"/> - <action description="Mettere in vendita oggetti di un Gruppo" longdescription="Metti in vendita oggetti posseduti da un Gruppo in Build Tools > tabelle Generale." name="object set sale"/> + <action_set description="Queste Abilità includono il potere di cedere, modificare e vendere oggetti posseduti dal gruppo. Viene fatto negli strumenti Costruisci > scheda Generale. Clic con il pulsante destro del mouse su un oggetto e Modifica per vedere le impostazioni." name="Object Management"> + <action description="Intestare oggetti ad un gruppo" longdescription="Intesta oggetti ad un gruppo in Strumenti per costruzione > scheda Generale." name="object deed"/> + <action description="Modificare (sposta, copia, modifica) oggetti di un gruppo" longdescription="Gestisci (sposta, copia, modifica) gli oggetti appartenenti ad un gruppo in Build Tools > tabella Generale." name="object manipulate"/> + <action description="Mettere in vendita oggetti di un gruppo" longdescription="Metti in vendita oggetti posseduti da un Gruppo in Strumenti per costruzione > scheda Generale." name="object set sale"/> </action_set> - <action_set description="Queste Abilità permettono di richiedere ai Membri di pagare le perdite del Gruppo e di ricevere i dividendi del Gruppo, e di limitare l'accesso all'account del Gruppo." name="Accounting"> - <action description="Pagare le perdite del Gruppo e ricevere i dividendi del Gruppo" longdescription="I Membri con questo Ruolo e Abilità pagheranno automaticamente le perdite del Gruppo e riceveranno i dividendi del Gruppo. Questo significa che riceveranno una porzione delle vendite di terre possedute dal gruppo (che sono risolte giornalmente), e contribuiranno anche su cose come le tasse di iscrizione dell'appezzament. " name="accounting accountable"/> + <action_set description="Queste abilità consentono di richiedere ai membri di pagare le passività del gruppo e di ricevere i dividendi del gruppo, nonché di limitare l'accesso alla cronologia finanziaria del gruppo." name="Accounting"> + <action description="Pagare le passività del gruppo e ricevere i dividendi del gruppo" longdescription="I membri con questo ruolo e abilità pagheranno automaticamente le passività del gruppo e riceveranno i dividendi del gruppo. Questo significa che riceveranno una porzione delle vendite di terreni appartenenti al gruppo (che sono distribuite giornalmente) e contribuiranno fondi a spese come le quote di inserzione del lotto. " name="accounting accountable"/> </action_set> - <action_set description="Queste Abilità permettono ai Membri di spedire, ricevere, e vedere le Notice del Gruppo." name="Notices"> - <action description="Spedire Notice" longdescription="Membri in un Ruolo con questa Abilità possono spedire Notice nel Gruppo > sezione Notice." name="notices send"/> - <action description="Ricevere Notice e vedere Notice precedenti" longdescription="Membri in un ruolo con questa Abilità possono ricevere Notice e vedere Notice vecchie nel Gruppo > sezione Notice." name="notices receive"/> + <action_set description="Queste abilità consentono ai membri di inviare, ricevere e vedere gli avvisi del gruppo." name="Notices"> + <action description="Invia avvisi" longdescription="Membri in un ruolo con questa Abilità possono inviare avvisi tramite la sezione Gruppo > Avvisi." name="notices send"/> + <action description="Ricevere avvisi e vedere avvisi precedenti" longdescription="Membri in un ruolo con questa Abilità possono ricevere avvisi e vedere avvisi precedenti nella sezione Gruppo > Avvisi." name="notices receive"/> </action_set> - <action_set description="Queste Abilità permettono di concedere o limitare l'accesso alle sessioni di chat e di voice chat nel gruppo." name="Chat"> - <action description="Aderire alla Chat di Gruppo" longdescription="I Membri con questo Ruolo e Abilità possono aderire alle sessioni di chat, sia scritte che in voice." name="join group chat"/> - <action description="Aderire alla Voice Chat di Gruppo" longdescription="I Membri con questo Ruolo e Abilità possono aderire alle sessioni di Voice Chat nel gruppo. NOTA: Per poter partecipare alla Chat di Gruppo è necessario accedere alla sessione di voice chat." name="join voice chat"/> - <action description="Moderare la Chat di Gruppo" longdescription="I Membri con questo Ruolo e Abilità possono controllare l'accesso e la partecipazione alle sessioni di chat scritta e di voice chat nel Gruppo." name="moderate group chat"/> + <action_set description="Queste Abilità permettono di concedere o limitare l'accesso alle sessioni di chat e di chat vocale nel gruppo." name="Chat"> + <action description="Partecipare alla Chat di gruppo" longdescription="I membri con questo ruolo e abilità possono partecipare alle sessioni di chat, sia scritte che vocale." name="join group chat"/> + <action description="Partecipa alla Chat vocale di gruppo" longdescription=" I membri con questo ruolo e abilità possono partecipare alle sessioni di Chat vocale nel gruppo. NOTA: per poter partecipare alla Chat di gruppo è necessario accedere alla sessione di chat vocale." name="join voice chat"/> + <action description="Moderare la Chat di gruppo" longdescription="I membri con questo ruolo e abilità possono gestire l'accesso e la partecipazione alle sessioni di chat scritta e di chat vocale nel gruppo." name="moderate group chat"/> </action_set> </role_actions> diff --git a/indra/newview/skins/default/xui/it/sidepanel_appearance.xml b/indra/newview/skins/default/xui/it/sidepanel_appearance.xml index 8dd7bfec42..df25772ffb 100644 --- a/indra/newview/skins/default/xui/it/sidepanel_appearance.xml +++ b/indra/newview/skins/default/xui/it/sidepanel_appearance.xml @@ -1,11 +1,14 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Vestiario" name="appearance panel"> <string name="No Outfit" value="Nessun vestiario"/> - <filter_editor label="Filtri per il vestiario" name="Filter"/> - <panel name="bottom_panel"> - <button name="options_gear_btn" tool_tip="Mostra opzioni addizionali"/> - <button name="newlook_btn" tool_tip="Aggiungi nuovo vestiario"/> - <dnd_button name="trash_btn" tool_tip="Rimuovi l'articolo selezionato"/> - <button label="Indossa" name="wear_btn"/> + <string name="Unsaved Changes" value="Modifiche non salvate"/> + <string name="Now Wearing" value="Abbigliamento attuale..."/> + <panel name="panel_currentlook"> + <button label="M" name="editappearance_btn"/> + <button label="A" name="openoutfit_btn"/> + <text name="currentlook_status"> + (Stato) + </text> </panel> + <filter_editor label="Filtri per il vestiario" name="Filter"/> </panel> diff --git a/indra/newview/skins/default/xui/it/sidepanel_inventory.xml b/indra/newview/skins/default/xui/it/sidepanel_inventory.xml index 196eb75bd7..3944f8e306 100644 --- a/indra/newview/skins/default/xui/it/sidepanel_inventory.xml +++ b/indra/newview/skins/default/xui/it/sidepanel_inventory.xml @@ -2,10 +2,12 @@ <panel label="Cose" name="objects panel"> <panel label="" name="sidepanel__inventory_panel"> <panel name="button_panel"> - <button label="Profilo" name="info_btn"/> - <button label="Indossa" name="wear_btn"/> + <button label="Profilo" name="info_btn" tool_tip="Mostra profilo dell'oggetto"/> + <button label="Condividi" name="share_btn" tool_tip="Condividi un oggetto dell'inventario"/> + <button label="Acquisti" name="shop_btn" tool_tip="Apri pagina web di Marketplace"/> + <button label="Indossa" name="wear_btn" tool_tip="Indossa il vestiario selezionato"/> <button label="Riproduci" name="play_btn"/> - <button label="Teleport" name="teleport_btn"/> + <button label="Teleport" name="teleport_btn" tool_tip="Teleport alla zona selezionata"/> </panel> </panel> </panel> diff --git a/indra/newview/skins/default/xui/it/sidepanel_item_info.xml b/indra/newview/skins/default/xui/it/sidepanel_item_info.xml index 23ca8b5ad8..e1ad1452ff 100644 --- a/indra/newview/skins/default/xui/it/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/it/sidepanel_item_info.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="item properties" title="Caratteristiche dell'articolo nell'Inventario"> +<panel name="item properties" title="Profilo dell'oggetto"> <panel.string name="unknown"> - (Sconosciuto) + (sconosciuto) </panel.string> <panel.string name="public"> (pubblico) @@ -10,12 +10,13 @@ Tu puoi: </panel.string> <panel.string name="owner_can"> - Il Proprietario può: + Il proprietario può: </panel.string> <panel.string name="acquiredDate"> [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local] </panel.string> - <text name="title" value="Caratteristiche dell'articolo"/> + <text name="title" value="Profilo dell'oggetto"/> + <text name="where" value="(Inventario)"/> <panel label=""> <text name="LabelItemNameTitle"> Nome: @@ -24,7 +25,7 @@ Descrizione: </text> <text name="LabelCreatorTitle"> - Creatore: + Ideatore: </text> <button label="Profilo..." name="BtnCreator"/> <text name="LabelOwnerTitle"> @@ -35,36 +36,38 @@ Acquisito: </text> <text name="LabelAcquiredDate"> - Wed May 24 12:50:46 2006 + mer 24 maggio 12:50:46 2006 </text> - <text name="OwnerLabel"> - Tu: - </text> - <check_box label="Modifica" name="CheckOwnerModify"/> - <check_box label="Copia" name="CheckOwnerCopy"/> - <check_box label="Rivendi" name="CheckOwnerTransfer"/> - <text name="AnyoneLabel"> - Chiunque: - </text> - <check_box label="Copia" name="CheckEveryoneCopy"/> - <text name="GroupLabel"> - Gruppo: - </text> - <check_box label="Condividi" name="CheckShareWithGroup"/> - <text name="NextOwnerLabel"> - Prossimo Proprietario: - </text> - <check_box label="Modifica" name="CheckNextOwnerModify"/> - <check_box label="Copia" name="CheckNextOwnerCopy"/> - <check_box label="Rivendi" name="CheckNextOwnerTransfer"/> + <panel name="perms_inv"> + <text name="perm_modify"> + Tu puoi: + </text> + <check_box label="Modifica" name="CheckOwnerModify"/> + <check_box label="Copia" name="CheckOwnerCopy"/> + <check_box label="Trasferisci" name="CheckOwnerTransfer"/> + <text name="AnyoneLabel"> + Chiunque: + </text> + <check_box label="Copia" name="CheckEveryoneCopy"/> + <text name="GroupLabel"> + Gruppo: + </text> + <check_box label="Condividi" name="CheckShareWithGroup" tool_tip="Consenti a tutti i membri del gruppo selezionato di condividere i tuoi diritti di modifica di questo oggetto. Per attivare le restrizioni per ruolo devi prima effettuare la cessione."/> + <text name="NextOwnerLabel"> + Proprietario successivo: + </text> + <check_box label="Modifica" name="CheckNextOwnerModify"/> + <check_box label="Copia" name="CheckNextOwnerCopy"/> + <check_box label="Trasferisci" name="CheckNextOwnerTransfer" tool_tip="Il prossimo proprietario può regalare o rivendere questo oggetto"/> + </panel> <check_box label="In vendita" name="CheckPurchase"/> <combo_box name="combobox sale copy"> <combo_box.item label="Copia" name="Copy"/> <combo_box.item label="Originale" name="Original"/> </combo_box> - <spinner label="Prezzo:" name="Edit Cost"/> - <text name="CurrencySymbol"> - L$ - </text> + <spinner label="Prezzo: L$" name="Edit Cost"/> + </panel> + <panel name="button_panel"> + <button label="Annulla" name="cancel_btn"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/it/sidepanel_task_info.xml b/indra/newview/skins/default/xui/it/sidepanel_task_info.xml index e5f27795be..67870d9b76 100644 --- a/indra/newview/skins/default/xui/it/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/it/sidepanel_task_info.xml @@ -1,16 +1,16 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="object properties" title="Caratteristiche dell'oggetto"> +<panel name="object properties" title="Profilo dell'oggetto"> <panel.string name="text deed continued"> - Intesta + Cessione </panel.string> <panel.string name="text deed"> - Intesta + Cessione </panel.string> <panel.string name="text modify info 1"> - Puoi modificare questo oggetto + Tu puoi modificare questo oggetto </panel.string> <panel.string name="text modify info 2"> - Puoi modificare questi oggetti + Tu puoi modificare questi oggetti </panel.string> <panel.string name="text modify info 3"> Non puoi modificare questo oggetto @@ -19,101 +19,111 @@ Non puoi modificare questi oggetti </panel.string> <panel.string name="text modify warning"> - Questo oggetto ha parti unite + Questo oggetto ha parti collegate </panel.string> <panel.string name="Cost Default"> Prezzo: L$ </panel.string> <panel.string name="Cost Total"> - Prezzo Totale: L$ + Prezzo totale: L$ </panel.string> <panel.string name="Cost Per Unit"> - Prezzo Per: L$ + Prezzo per: L$ </panel.string> <panel.string name="Cost Mixed"> - Prezzo assortito + Prezzo misto </panel.string> <panel.string name="Sale Mixed"> - Vendita assortita + Vendita mista </panel.string> - <panel label=""> + <text name="title" value="Profilo dell'oggetto"/> + <text name="where" value="(in Second Life)"/> + <panel label="" name="properties_panel"> <text name="Name:"> Nome: </text> <text name="Description:"> Descrizione: </text> - <text name="Creator:"> - Creatore: + <text name="CreatorNameLabel"> + Ideatore: + </text> + <text name="Creator Name"> + Erica Linden </text> <text name="Owner:"> Proprietario: </text> - <text name="Group:"> + <text name="Owner Name"> + Erica Linden + </text> + <text name="Group_label"> Gruppo: </text> - <button name="button set group" tool_tip="Scegli un gruppo per condividere i permessi di questo oggetto"/> - <name_box initial_value="Caricando..." name="Group Name Proxy"/> - <button label="Intesta" label_selected="Intesta" name="button deed" tool_tip="Intestando questo oggetto lo passa con i permessi del prossimo proprietario. Gli oggetti condivisi dal Gruppo possono essere intestati solo da un Officer del gruppo."/> - <check_box label="Condividi" name="checkbox share with group" tool_tip="Permetti a tutti i Membri del gruppo impostato di condividere la tua modifica ai permessi di questo oggetto. Tu devi Intestare per consentire le restrizioni al ruolo."/> + <button name="button set group" tool_tip="Scegli un gruppo con cui condividere i diritti relativi all'oggetto"/> + <name_box initial_value="Caricamento in corso..." name="Group Name Proxy"/> + <button label="Cessione" label_selected="Cessione" name="button deed" tool_tip="Con una cessione si trasferisce il bene con i diritti al proprietario successivo Gli oggetti in proprietà condivisa di gruppo possono essere ceduti soltanto da un funzionario del gruppo."/> <text name="label click action"> - Clicca per: + Fai clic per: </text> <combo_box name="clickaction"> - <combo_box.item label="Tocca (default)" name="Touch/grab(default)"/> - <combo_box.item label="Siedi sull'oggetto" name="Sitonobject"/> - <combo_box.item label="Compra l'oggetto" name="Buyobject"/> - <combo_box.item label="Paga l'ogggetto" name="Payobject"/> + <combo_box.item label="Tocca (predefinito)" name="Touch/grab(default)"/> + <combo_box.item label="Siediti sull'oggetto" name="Sitonobject"/> + <combo_box.item label="Acquista oggetto" name="Buyobject"/> + <combo_box.item label="Paga oggetto" name="Payobject"/> <combo_box.item label="Apri" name="Open"/> </combo_box> - <check_box label="In Vendita:" name="checkbox for sale"/> - <combo_box name="sale type"> - <combo_box.item label="Copia" name="Copy"/> - <combo_box.item label="Contenuti" name="Contents"/> - <combo_box.item label="Originale" name="Original"/> - </combo_box> - <spinner label="Prezzo: L$" name="Edit Cost"/> - <check_box label="Mostra nella ricerca" name="search_check" tool_tip="Mostra questo oggetto nei risultati della ricerca"/> - <panel name="perms_build"> + <panel name="perms_inv"> <text name="perm_modify"> - Puoi modificare questo oggetto + Tu puoi modificare questo oggetto </text> <text name="Anyone can:"> Chiunque: </text> - <check_box label="Sposta" name="checkbox allow everyone move"/> <check_box label="Copia" name="checkbox allow everyone copy"/> - <text name="Next owner can:"> - Prossimo Proprietario: + <check_box label="Sposta" name="checkbox allow everyone move"/> + <text name="GroupLabel"> + Gruppo: + </text> + <check_box label="Condividi" name="checkbox share with group" tool_tip="Consenti a tutti i membri del gruppo selezionato di condividere i tuoi diritti di modifica di questo oggetto. Per attivare le restrizioni per ruolo devi prima effettuare la cessione."/> + <text name="NextOwnerLabel"> + Proprietario successivo: </text> <check_box label="Modifica" name="checkbox next owner can modify"/> <check_box label="Copia" name="checkbox next owner can copy"/> - <check_box label="Transfer" name="checkbox next owner can transfer" tool_tip="Prossimo proprietario può regalare o rivendere questo oggetto"/> - <text name="B:"> - B: - </text> - <text name="O:"> - O: - </text> - <text name="G:"> - G: - </text> - <text name="E:"> - E: - </text> - <text name="N:"> - N: - </text> - <text name="F:"> - F: - </text> + <check_box label="Trasferisci" name="checkbox next owner can transfer" tool_tip="Il prossimo proprietario può regalare o rivendere questo oggetto"/> </panel> + <check_box label="In vendita" name="checkbox for sale"/> + <combo_box name="sale type"> + <combo_box.item label="Copia" name="Copy"/> + <combo_box.item label="Contenuto" name="Contents"/> + <combo_box.item label="Originale" name="Original"/> + </combo_box> + <spinner label="Prezzo: L$" name="Edit Cost"/> + <check_box label="Mostra nella ricerca" name="search_check" tool_tip="Permetti alle persone di vedere questo oggetto nei risultati della ricerca"/> + <text name="B:"> + B: + </text> + <text name="O:"> + O: + </text> + <text name="G:"> + G: + </text> + <text name="E:"> + E: + </text> + <text name="N:"> + N: + </text> + <text name="F:"> + F: + </text> </panel> <panel name="button_panel"> <button label="Apri" name="open_btn"/> <button label="Paga" name="pay_btn"/> - <button label="Compra" name="buy_btn"/> - <button label="Cancella" name="cancel_btn"/> - <button label="Salva" name="save_btn"/> + <button label="Acquista" name="buy_btn"/> + <button label="Dettagli" name="details_btn"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/it/strings.xml b/indra/newview/skins/default/xui/it/strings.xml index 910e6e0960..d601c27d28 100644 --- a/indra/newview/skins/default/xui/it/strings.xml +++ b/indra/newview/skins/default/xui/it/strings.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <!-- This file contains strings that used to be hardcoded in the source. It is only for those strings which do not belong in a floater. - For example, the strings used in avatar chat bubbles, and strings + For example, the strings used in avatar chat bubbles, and strings that are returned from one component and may appear in many places--> <strings> <string name="SECOND_LIFE"> @@ -10,6 +10,9 @@ <string name="APP_NAME"> Second Life </string> + <string name="CAPITALIZED_APP_NAME"> + SECOND LIFE + </string> <string name="SUPPORT_SITE"> Portale di supporto di Second Life </string> @@ -17,13 +20,28 @@ Ricerca hardware... </string> <string name="StartupLoading"> - In Caricamento + Caricamento di [APP_NAME]... + </string> + <string name="StartupClearingCache"> + Pulizia della cache... + </string> + <string name="StartupInitializingTextureCache"> + Inizializzazione della cache texture... + </string> + <string name="StartupInitializingVFS"> + Inizializzazione VFS... + </string> + <string name="ProgressRestoring"> + Ripristino in corso... + </string> + <string name="ProgressChangingResolution"> + Modifica della risoluzione... </string> <string name="LoginInProgress"> In connessione. [APP_NAME] può sembrare rallentata. Attendi. </string> <string name="LoginInProgressNoFrozen"> - Logging in... + Accesso in corso... </string> <string name="LoginAuthenticating"> In autenticazione @@ -76,11 +94,32 @@ <string name="LoginDownloadingClothing"> Sto caricando i vestiti... </string> + <string name="InvalidCertificate"> + Il server ha inviato un certificato non valido o errato. Rivolgiti all'amministratore della griglia. + </string> + <string name="CertInvalidHostname"> + Per accedere al server è stato utilizzato un nome host non valido; controlla lo SLURL o il nome host della griglia. + </string> + <string name="CertExpired"> + Il certificato inviato dalla griglia sembra essere scaduto. Controlla l'orologio del sistema o rivolgiti all'amministratore della griglia. + </string> + <string name="CertKeyUsage"> + Impossibile utilizzare per SSl il certificato inviato dal server. Rivolgiti all'amministratore della griglia. + </string> + <string name="CertBasicConstraints"> + Nella catena dei certificati del server erano presenti troppi certificati. Rivolgiti all'amministratore della griglia. + </string> + <string name="CertInvalidSignature"> + Impossibile verificare la firma del certificato inviato dal server della griglia. Rivolgiti all'amministratore della griglia. + </string> <string name="LoginFailedNoNetwork"> Errore di rete: Non è stato possibile stabilire un collegamento, controlla la tua connessione. </string> + <string name="LoginFailed"> + Accesso non riuscito. + </string> <string name="Quit"> - Termina + Esci </string> <string name="create_account_url"> http://join.secondlife.com/index.php?lang=it-IT @@ -88,6 +127,24 @@ <string name="AgentLostConnection"> Questa regione sta avendo problemi. Verifica la tua connessione a Internet. </string> + <string name="SavingSettings"> + Salvataggio delle impostazioni... + </string> + <string name="LoggingOut"> + Uscita... + </string> + <string name="ShuttingDown"> + Chiusura... + </string> + <string name="YouHaveBeenDisconnected"> + Sei scollegato dalla regione in cui ti trovavi. + </string> + <string name="SentToInvalidRegion"> + Sei stato indirizzato in una regione non valida. + </string> + <string name="TestingDisconnect"> + Verifica scollegamento viewer + </string> <string name="TooltipPerson"> Persona </string> @@ -140,7 +197,25 @@ Clicca per avere maggiori informazioni sul luogo </string> <string name="TooltipAgentUrl"> - Clicca per vedere il profilo del residente + Clicca per vedere il profilo di questo residente + </string> + <string name="TooltipAgentMute"> + Clicca per disattivare l'audio di questo residente + </string> + <string name="TooltipAgentUnmute"> + Clicca per attivare l'audio del residente + </string> + <string name="TooltipAgentIM"> + Clicca per inviare un IM a questo residente + </string> + <string name="TooltipAgentPay"> + Clicca per pagare il residente + </string> + <string name="TooltipAgentOfferTeleport"> + Fai clic per inviare un'offerta di teleport al residente + </string> + <string name="TooltipAgentRequestFriend"> + Fai clic per inviare una richiesta di amicizia al residente </string> <string name="TooltipGroupUrl"> Clicca per vedere la descrizione del gruppo @@ -152,10 +227,10 @@ Clicca per vedere questa inserzione </string> <string name="TooltipParcelUrl"> - Clicca per vedere la descrizione della parcel + Clicca per vedere la descrizione del lotto </string> <string name="TooltipTeleportUrl"> - Clicca per teleportarti a questa destinazione + Clicca per effettuare il teleport a questa destinazione </string> <string name="TooltipObjectIMUrl"> Clicca per vedere la descrizione dell'oggetto @@ -166,19 +241,41 @@ <string name="TooltipSLAPP"> Clicca per avviare il comando secondlife:// </string> - <string name="CurrentURL" value=" URL attuale: [CurrentURL]"/> + <string name="CurrentURL" value="URL attuale: [CurrentURL]"/> + <string name="TooltipPrice" value="L$ [PRICE]-"/> <string name="SLurlLabelTeleport"> Teleportati a </string> <string name="SLurlLabelShowOnMap"> Mostra la mappa per </string> + <string name="SLappAgentMute"> + Disattiva audio + </string> + <string name="SLappAgentUnmute"> + Riattiva audio + </string> + <string name="SLappAgentIM"> + IM + </string> + <string name="SLappAgentPay"> + Paga + </string> + <string name="SLappAgentOfferTeleport"> + Offri teleport a + </string> + <string name="SLappAgentRequestFriend"> + Richiesta di amicizia + </string> <string name="BUTTON_CLOSE_DARWIN"> - Chiudi (⌘W) + Chiudi (⌘W) </string> <string name="BUTTON_CLOSE_WIN"> Chiudi (Ctrl+W) </string> + <string name="BUTTON_CLOSE_CHROME"> + Chiudi + </string> <string name="BUTTON_RESTORE"> Ripristina </string> @@ -191,14 +288,11 @@ <string name="BUTTON_DOCK"> Àncora </string> - <string name="BUTTON_UNDOCK"> - Disà ncora - </string> <string name="BUTTON_HELP"> - Mostra gli aiuti + Mostra Aiuto </string> <string name="Searching"> - In ricerca... + Ricerca in corso... </string> <string name="NoneFound"> Nessun risultato. @@ -218,12 +312,12 @@ <string name="AvatarNameWaiting"> (in attesa) </string> - <string name="AvatarNameHippos"> - (hippos) - </string> <string name="GroupNameNone"> (nessuno) </string> + <string name="AvalineCaller"> + Chiamante Avaline [ORDER] + </string> <string name="AssetErrorNone"> Nessun errore </string> @@ -267,19 +361,19 @@ biglietto da visita </string> <string name="landmark"> - landmark + punto di riferimento </string> <string name="legacy script"> script (vecchia versione) </string> <string name="clothing"> - abito + vestiario </string> <string name="object"> oggetto </string> <string name="note card"> - notecard + biglietto </string> <string name="folder"> cartella @@ -309,7 +403,7 @@ immagine targa </string> <string name="trash"> - cestino + Cestino </string> <string name="jpeg image"> immagine jpeg @@ -329,6 +423,9 @@ <string name="symbolic link"> link </string> + <string name="symbolic folder link"> + link alla cartella + </string> <string name="AvatarAway"> Assente </string> @@ -546,7 +643,7 @@ Si </string> <string name="texture_loading"> - In Caricamento... + Caricamento in corso... </string> <string name="worldmap_offline"> Offline @@ -581,6 +678,9 @@ <string name="hang_up"> Disconnesso dalla Voice Chat in-world </string> + <string name="reconnect_nearby"> + Sarai riconnesso alla chat vocale nei dintorni + </string> <string name="ScriptQuestionCautionChatGranted"> A '[OBJECTNAME]', un oggetto di proprietà di '[OWNERNAME]', situato in [REGIONNAME] [REGIONPOS], è stato concesso il permesso di: [PERMISSIONS]. </string> @@ -621,13 +721,13 @@ Controllare la tua fotocamera </string> <string name="SIM_ACCESS_PG"> - PG + Generale </string> <string name="SIM_ACCESS_MATURE"> - Mature + Moderato </string> <string name="SIM_ACCESS_ADULT"> - Adult + Adulti </string> <string name="SIM_ACCESS_DOWN"> Offline @@ -638,6 +738,12 @@ <string name="land_type_unknown"> (sconosciuto) </string> + <string name="Estate / Full Region"> + Proprietà immobiliare / Regione completa + </string> + <string name="Mainland / Full Region"> + Continente / Regione completa + </string> <string name="all_files"> Tutti i file </string> @@ -684,25 +790,25 @@ Scegli la cartella </string> <string name="AvatarSetNotAway"> - Imposta non assente + Imposta come non assente </string> <string name="AvatarSetAway"> - Imposta assente + Imposta come assente </string> <string name="AvatarSetNotBusy"> - Imposta non occupato + Imposta come non occupato </string> <string name="AvatarSetBusy"> - Imposta occupato + Imposta come occupato </string> <string name="shape"> - Shape + Figura corporea </string> <string name="skin"> - Skin + Pelle </string> <string name="hair"> - Capelli + Capigliature </string> <string name="eyes"> Occhi @@ -717,7 +823,7 @@ Scarpe </string> <string name="socks"> - Calze + Calzini </string> <string name="jacket"> Giacca @@ -729,7 +835,7 @@ Maglietta intima </string> <string name="underpants"> - slip + Slip </string> <string name="skirt"> Gonna @@ -743,17 +849,59 @@ <string name="invalid"> non valido </string> + <string name="shirt_not_worn"> + Camicia non indossata + </string> + <string name="pants_not_worn"> + Pantaloni non indossati + </string> + <string name="shoes_not_worn"> + Scarpe non indossate + </string> + <string name="socks_not_worn"> + Calzini non indossati + </string> + <string name="jacket_not_worn"> + Giacca non indossata + </string> + <string name="gloves_not_worn"> + Guanti non indossati + </string> + <string name="undershirt_not_worn"> + Maglietta intima non indossata + </string> + <string name="underpants_not_worn"> + Slip non indossati + </string> + <string name="skirt_not_worn"> + Gonna non indossata + </string> + <string name="alpha_not_worn"> + Alpha non portato + </string> + <string name="tattoo_not_worn"> + Tatuaggio non portato + </string> + <string name="invalid_not_worn"> + non valido + </string> + <string name="NewWearable"> + Nuovo [WEARABLE_ITEM] + </string> + <string name="CreateNewWearable"> + Crea [WEARABLE_TYPE] + </string> <string name="next"> - Seguente + Avanti </string> <string name="ok"> OK </string> <string name="GroupNotifyGroupNotice"> - Notice di gruppo + Avviso di gruppo </string> <string name="GroupNotifyGroupNotices"> - Notice di gruppo + Avvisi di gruppo </string> <string name="GroupNotifySentBy"> Inviato da @@ -762,7 +910,7 @@ Allegato: </string> <string name="GroupNotifyViewPastNotices"> - Visualizza i notice passati o scegli qui di non riceverne. + Visualizza gli avvisi precedenti o scegli qui di non riceverne. </string> <string name="GroupNotifyOpenAttachment"> Apri l'allegato @@ -771,13 +919,10 @@ Salva l'allegato </string> <string name="TeleportOffer"> - Offerta di Teletrasporto - </string> - <string name="StartUpNotification"> - [%d] una nuova notifica è arrivata mentre eri assente... + Offerta di Teleport </string> <string name="StartUpNotifications"> - [%d] nuove notifice sono arrivate mentre eri assente... + Mentre eri assente sono arrivate nuove notifiche... </string> <string name="OverflowInfoChannelString"> Hai ancora [%d] notifiche @@ -810,49 +955,56 @@ Alto </string> <string name="LeaveMouselook"> - Premi ESC per tornare in visulizzazione normale + Premi ESC per tornare in visualizzazione normale </string> <string name="InventoryNoMatchingItems"> - Nessun oggetto corrispondente trovato in inventario. + Non riesci a trovare quello che cerchi? Prova [secondlife:///app/search/all/[SEARCH_TERM] Cerca]. + </string> + <string name="PlacesNoMatchingItems"> + Non riesci a trovare quello che cerchi? Prova [secondlife:///app/search/places/[SEARCH_TERM] Cerca]. + </string> + <string name="FavoritesNoMatchingItems"> + Trascina qui un punto di riferimento per aggiungerlo ai Preferiti. </string> <string name="InventoryNoTexture"> - Non hai una copia -di questa texture in inventario. - </string> - <string name="no_transfer" value=" (no transfer)"/> - <string name="no_modify" value=" (no modify)"/> - <string name="no_copy" value=" (no copy)"/> - <string name="worn" value=" (indossato)"/> - <string name="link" value=" (link)"/> - <string name="broken_link" value=" (broken_link)"/> + Non hai una copia di questa texture nel tuo inventario + </string> + <string name="no_transfer" value="(nessun trasferimento)"/> + <string name="no_modify" value="(nessuna modifica)"/> + <string name="no_copy" value="(nessuna copia)"/> + <string name="worn" value="(indossato)"/> + <string name="link" value="(link)"/> + <string name="broken_link" value="(broken_link)""/> <string name="LoadingContents"> - Contenuto in caricamento... + Caricamento del contenuto... </string> <string name="NoContents"> Nessun contenuto </string> - <string name="WornOnAttachmentPoint" value=" (indossato su [ATTACHMENT_POINT])"/> - <string name="Chat" value=" Chat :"/> - <string name="Sound" value=" Suono :"/> - <string name="Wait" value=" --- Attendi :"/> - <string name="AnimFlagStop" value=" Ferma l'Animazione :"/> - <string name="AnimFlagStart" value=" Inizia l'Animazione :"/> - <string name="Wave" value=" Wave"/> - <string name="HelloAvatar" value=" Ciao, avatar!"/> - <string name="ViewAllGestures" value=" Visualizza tutte le gesture >>"/> - <string name="Animations" value=" Animazioni,"/> - <string name="Calling Cards" value=" Biglietti da visita,"/> - <string name="Clothing" value=" Vestiti,"/> - <string name="Gestures" value=" Gesture,"/> - <string name="Landmarks" value=" Landmark,"/> - <string name="Notecards" value=" Notecard,"/> - <string name="Objects" value=" Oggetti,"/> - <string name="Scripts" value=" Script,"/> - <string name="Sounds" value=" Suoni,"/> - <string name="Textures" value=" Texture,"/> - <string name="Snapshots" value=" Fotografie,"/> - <string name="No Filters" value="No "/> - <string name="Since Logoff" value=" - Dalla disconnessione"/> + <string name="WornOnAttachmentPoint" value="(indossato su [ATTACHMENT_POINT])"/> + <string name="ActiveGesture" value="[GESLABEL] (attivo)"/> + <string name="Chat" value="Chat :"/> + <string name="Sound" value="Suono :"/> + <string name="Wait" value="--- Attendi :"/> + <string name="AnimFlagStop" value="Ferma l'animazione :"/> + <string name="AnimFlagStart" value="Inizia l'animazione :"/> + <string name="Wave" value="Saluta con la mano"/> + <string name="HelloAvatar" value="Ciao, avatar!"/> + <string name="ViewAllGestures" value="Visualizza tutto >>"/> + <string name="GetMoreGestures" value="Altre >>"/> + <string name="Animations" value="Animazioni,"/> + <string name="Calling Cards" value="Biglietti da visita,"/> + <string name="Clothing" value="Vestiti,"/> + <string name="Gestures" value="Gesture,"/> + <string name="Landmarks" value="Punti di riferimento,"/> + <string name="Notecards" value="Biglietti,"/> + <string name="Objects" value="Oggetti,"/> + <string name="Scripts" value="Script,"/> + <string name="Sounds" value="Suoni,"/> + <string name="Textures" value="Texture,"/> + <string name="Snapshots" value="Fotografie,"/> + <string name="No Filters" value="No"/> + <string name="Since Logoff" value="- Dall'uscita"/> <string name="InvFolder My Inventory"> Il mio inventario </string> @@ -869,22 +1021,22 @@ di questa texture in inventario. Suoni </string> <string name="InvFolder Calling Cards"> - Biglieti da visita + Biglietti da visita </string> <string name="InvFolder Landmarks"> - Landmark + Punti di riferimento </string> <string name="InvFolder Scripts"> Script </string> <string name="InvFolder Clothing"> - Vestiti + Vestiario </string> <string name="InvFolder Objects"> Oggetti </string> <string name="InvFolder Notecards"> - Notecard + Biglietti </string> <string name="InvFolder New Folder"> Nuova cartella @@ -920,22 +1072,25 @@ di questa texture in inventario. Preferiti </string> <string name="InvFolder Current Outfit"> - Outfit attuale + Abbigliamento attuale </string> <string name="InvFolder My Outfits"> - I miei Outfit + Il mio vestiario + </string> + <string name="InvFolder Accessories"> + Accessori </string> <string name="InvFolder Friends"> Amici </string> <string name="InvFolder All"> - Tutti + Tutto </string> <string name="Buy"> - Compra + Acquista </string> <string name="BuyforL$"> - Compra per L$ + Acquista per L$ </string> <string name="Stone"> Pietra @@ -962,7 +1117,7 @@ di questa texture in inventario. Luce </string> <string name="KBShift"> - Shift + Maiusc </string> <string name="KBCtrl"> Ctrl @@ -1112,13 +1267,13 @@ di questa texture in inventario. [COUNT] giorni </string> <string name="GroupMembersA"> - [COUNT] membro + [COUNT] iscritto </string> <string name="GroupMembersB"> - [COUNT] membri + [COUNT] iscritti </string> <string name="GroupMembersC"> - [COUNT] membri + [COUNT] iscritti </string> <string name="AcctTypeResident"> Residente @@ -1127,10 +1282,10 @@ di questa texture in inventario. In prova </string> <string name="AcctTypeCharterMember"> - Membro onorario + Socio onorario </string> <string name="AcctTypeEmployee"> - Impiegato Linden Lab + Dipendente Linden Lab </string> <string name="PaymentInfoUsed"> Informazioni di pagamento usate @@ -1139,7 +1294,7 @@ di questa texture in inventario. Informazioni di pagamento registrate </string> <string name="NoPaymentInfoOnFile"> - Nessuna informazione di pagamento + Nessuna informazione di pagamento disponibile </string> <string name="AgeVerified"> Età verificata @@ -1154,7 +1309,7 @@ di questa texture in inventario. In alto a destra </string> <string name="Top"> - In alto + in alto </string> <string name="Top Left"> In alto a sinistra @@ -1196,22 +1351,22 @@ di questa texture in inventario. ricompila </string> <string name="ResetQueueTitle"> - Avanzamento reset + Azzera avanzamento </string> <string name="ResetQueueStart"> - reset + azzera </string> <string name="RunQueueTitle"> - Avanzamento attivazione + Attiva avanzamento </string> <string name="RunQueueStart"> - Attiva + attiva </string> <string name="NotRunQueueTitle"> - Avanzamento disattivazione + Disattiva avanzamento </string> <string name="NotRunQueueStart"> - Disattivazione + disattiva </string> <string name="CompileSuccessful"> Compilazione riuscita! @@ -1231,18 +1386,18 @@ di questa texture in inventario. <string name="GroupsNone"> nessuno </string> - <string name="Group" value=" (gruppo)"/> + <string name="Group" value="(gruppo)"/> <string name="Unknown"> (Sconosciuto) </string> <string name="SummaryForTheWeek" value="Riassunto della settimana, partendo dal"/> - <string name="NextStipendDay" value="Il prossimo giorno di stipendio è "/> - <string name="GroupIndividualShare" value=" Gruppo Dividendi individuali"/> + <string name="NextStipendDay" value="Il prossimo giorno di stipendio è"/> + <string name="GroupIndividualShare" value="Gruppo Dividendi individuali"/> <string name="Balance"> Saldo </string> <string name="Credits"> - Crediti + Ringraziamenti </string> <string name="Debits"> Debiti @@ -1257,7 +1412,7 @@ di questa texture in inventario. Proprietà principale </string> <string name="IMMainland"> - mainland + continente </string> <string name="IMTeen"> teen @@ -1266,20 +1421,173 @@ di questa texture in inventario. errore </string> <string name="RegionInfoAllEstatesOwnedBy"> - la proprietà posseduta da [OWNER] + tutte le proprietà immobiliari di [OWNER] </string> <string name="RegionInfoAllEstatesYouOwn"> - Le proprietà che possiedi + tutte le tue proprietà immobiliari </string> <string name="RegionInfoAllEstatesYouManage"> - Le proprietà di cui sei manager per conto di [OWNER] + tutte le proprietà immobiliari che gestisci per conto di [OWNER] </string> <string name="RegionInfoAllowedResidents"> - Residenti ammessi: ([ALLOWEDAGENTS], massimo [MAXACCESS]) + Residenti consentiti: ([ALLOWEDAGENTS], massimo [MAXACCESS]) </string> <string name="RegionInfoAllowedGroups"> Gruppi ammessi: ([ALLOWEDGROUPS], massimo [MAXACCESS]) </string> + <string name="ScriptLimitsParcelScriptMemory"> + Memoria dello script del lotto + </string> + <string name="ScriptLimitsParcelsOwned"> + Lotti in elenco: [PARCELS] + </string> + <string name="ScriptLimitsMemoryUsed"> + Memoria utilizzata: [COUNT] kb di [MAX] kb; [AVAILABLE] kb disponibili + </string> + <string name="ScriptLimitsMemoryUsedSimple"> + Memoria utilizzata: [COUNT] kb + </string> + <string name="ScriptLimitsParcelScriptURLs"> + URL degli script lotti + </string> + <string name="ScriptLimitsURLsUsed"> + URL utilizzati: [COUNT] di [MAX]; [AVAILABLE] disponibili + </string> + <string name="ScriptLimitsURLsUsedSimple"> + URL utilizzati: [COUNT] + </string> + <string name="ScriptLimitsRequestError"> + Errore nella richiesta di informazioni + </string> + <string name="ScriptLimitsRequestNoParcelSelected"> + Nessun lotto selezionato + </string> + <string name="ScriptLimitsRequestWrongRegion"> + Errore: le informazioni sullo script sono disponibili solo nella tua regione attuale + </string> + <string name="ScriptLimitsRequestWaiting"> + Recupero informazioni in corso... + </string> + <string name="ScriptLimitsRequestDontOwnParcel"> + Non hai il permesso di visionare questo lotto + </string> + <string name="SITTING_ON"> + Seduto su + </string> + <string name="ATTACH_CHEST"> + Petto + </string> + <string name="ATTACH_HEAD"> + Testa + </string> + <string name="ATTACH_LSHOULDER"> + Spalla sinistra + </string> + <string name="ATTACH_RSHOULDER"> + Spalla destra + </string> + <string name="ATTACH_LHAND"> + Mano sinistra + </string> + <string name="ATTACH_RHAND"> + Mano destra + </string> + <string name="ATTACH_LFOOT"> + Piede sinisto + </string> + <string name="ATTACH_RFOOT"> + Piede destro + </string> + <string name="ATTACH_BACK"> + Indietro + </string> + <string name="ATTACH_PELVIS"> + Pelvi + </string> + <string name="ATTACH_MOUTH"> + Bocca + </string> + <string name="ATTACH_CHIN"> + Mento + </string> + <string name="ATTACH_LEAR"> + Orecchio sinistro + </string> + <string name="ATTACH_REAR"> + Orecchio destro + </string> + <string name="ATTACH_LEYE"> + Occhio sinistro + </string> + <string name="ATTACH_REYE"> + Occhio destro + </string> + <string name="ATTACH_NOSE"> + Naso + </string> + <string name="ATTACH_RUARM"> + Braccio destro + </string> + <string name="ATTACH_RLARM"> + Avambraccio destro + </string> + <string name="ATTACH_LUARM"> + Braccio sinistro + </string> + <string name="ATTACH_LLARM"> + Avambraccio sinistro + </string> + <string name="ATTACH_RHIP"> + Anca destra + </string> + <string name="ATTACH_RULEG"> + Coscia destra + </string> + <string name="ATTACH_RLLEG"> + Coscia destra + </string> + <string name="ATTACH_LHIP"> + Anca sinista + </string> + <string name="ATTACH_LULEG"> + Coscia sinistra + </string> + <string name="ATTACH_LLLEG"> + Polpaccio sinistro + </string> + <string name="ATTACH_BELLY"> + Addome + </string> + <string name="ATTACH_RPEC"> + Petto destro + </string> + <string name="ATTACH_LPEC"> + Petto sinistro + </string> + <string name="ATTACH_HUD_CENTER_2"> + HUD in centro 2 + </string> + <string name="ATTACH_HUD_TOP_RIGHT"> + HUD alto a destra + </string> + <string name="ATTACH_HUD_TOP_CENTER"> + HUD alto in centro + </string> + <string name="ATTACH_HUD_TOP_LEFT"> + HUD alto a sinistra + </string> + <string name="ATTACH_HUD_CENTER_1"> + HUD in centro 1 + </string> + <string name="ATTACH_HUD_BOTTOM_LEFT"> + HUD basso a sinistra + </string> + <string name="ATTACH_HUD_BOTTOM"> + HUD basso + </string> + <string name="ATTACH_HUD_BOTTOM_RIGHT"> + HUD basso a destra + </string> <string name="CursorPos"> Riga [LINE], Colonna [COLUMN] </string> @@ -1287,33 +1595,40 @@ di questa texture in inventario. [COUNT] trovato/i </string> <string name="PanelContentsNewScript"> - Nuovo Script + Nuovo script + </string> + <string name="PanelContentsTooltip"> + Contenuto dell'oggetto + </string> + <string name="BusyModeResponseDefault"> + Il residente al quale hai inviato un messaggio è in modalità 'occupato', ovvero ha chiesto di non essere disturbato. Il tuo messaggio comparirà nel suo pannello IM, dove potrà essere letto in un secondo momento. </string> <string name="MuteByName"> - (per nome) + (In base al nome) </string> <string name="MuteAgent"> - (residente) + (Residente) </string> <string name="MuteObject"> - (oggetto) + (Oggetto) </string> <string name="MuteGroup"> - (gruppo) + (Gruppo) + </string> + <string name="MuteExternal"> + (esterno) </string> <string name="RegionNoCovenant"> - Non esiste nessun regolamento per questa proprietà . + Non esiste alcun regolamento per questa proprietà . </string> <string name="RegionNoCovenantOtherOwner"> - Non esiste nessun regolamento per questa proprietà . Il terreno di questa proprietà è messo in vendita dal proprietario, non dalla Linden Lab. Contatta il proprietario del terreno per i dettagli della vendita. + Non esiste alcun regolamento per questa proprietà . Il terreno di questa proprietà è messo in vendita dal proprietario, non dalla Linden Lab. Contatta il proprietario del terreno per i dettagli della vendita. </string> - <string name="covenant_last_modified"> - Ultima modifica: - </string> - <string name="none_text" value=" (nessuno) "/> - <string name="never_text" value=" (mai) "/> + <string name="covenant_last_modified" value="Ultima modifica:"/> + <string name="none_text" value="(nessuno)"/> + <string name="never_text" value="(mai)"/> <string name="GroupOwned"> - Posseduta da un gruppo + Di proprietà di un gruppo </string> <string name="Public"> Pubblica @@ -1324,26 +1639,35 @@ di questa texture in inventario. <string name="ClassifiedUpdateAfterPublish"> (si aggiornerà dopo la pubblicazione) </string> + <string name="NoPicksClassifiedsText"> + Non hai creato luoghi preferiti né inserzioni. Clicca il pulsante + qui sotto per creare un luogo preferito o un'inserzione. + </string> + <string name="NoAvatarPicksClassifiedsText"> + L'utente non ha luoghi preferiti né inserzioni + </string> + <string name="PicksClassifiedsLoadingText"> + Caricamento in corso... + </string> <string name="MultiPreviewTitle"> Anteprima </string> <string name="MultiPropertiesTitle"> - Proprietà + Beni immobiliari </string> <string name="InvOfferAnObjectNamed"> - Un oggetto chiamato + Un oggetto denominato </string> <string name="InvOfferOwnedByGroup"> - Posseduto dal gruppo + di proprietà del gruppo </string> <string name="InvOfferOwnedByUnknownGroup"> - Posseduto da un gruppo sconosciuto + di proprietà di un gruppo sconosciuto </string> <string name="InvOfferOwnedBy"> - Posseduto da + di proprietà di </string> <string name="InvOfferOwnedByUnknownUser"> - Posseduto da un'utente sconosciuto + di proprietà di un utente sconosciuto </string> <string name="InvOfferGaveYou"> Ti ha offerto @@ -1379,7 +1703,7 @@ di questa texture in inventario. Saldo </string> <string name="GroupMoneyCredits"> - Crediti + Ringraziamenti </string> <string name="GroupMoneyDebits"> Debiti @@ -1391,32 +1715,38 @@ di questa texture in inventario. Oggetti acquisiti </string> <string name="Cancel"> - Cancella + Annulla </string> <string name="UploadingCosts"> - Costi di caricamento [%s] + Il caricamento di [NAME] costa L$ [AMOUNT] + </string> + <string name="BuyingCosts"> + L'acquisto di [NAME] costa L$ [AMOUNT] </string> <string name="UnknownFileExtension"> Estensione del file sconosciuta [.%s] Tipi conosciuti .wav, .tga, .bmp, .jpg, .jpeg, or .bvh </string> + <string name="MuteObject2"> + Blocca + </string> <string name="AddLandmarkNavBarMenu"> - Aggiungi landmark... + Aggiungi punto di riferimento... </string> <string name="EditLandmarkNavBarMenu"> - Modifica landmark... + Modifica punto di riferimento... </string> <string name="accel-mac-control"> - ⌃ + ⌃ </string> <string name="accel-mac-command"> - ⌘ + ⌘ </string> <string name="accel-mac-option"> - ⌥ + ⌥ </string> <string name="accel-mac-shift"> - ⇧ + ⇧ </string> <string name="accel-win-control"> Ctrl+ @@ -1428,22 +1758,22 @@ Tipi conosciuti .wav, .tga, .bmp, .jpg, .jpeg, or .bvh Shift+ </string> <string name="FileSaved"> - File Salvato + File salvato </string> <string name="Receiving"> In ricezione </string> <string name="AM"> - AM + antemeridiane </string> <string name="PM"> - PM + pomeridiane </string> <string name="PST"> - PST + Ora Pacifico </string> <string name="PDT"> - PDT + Ora legale Pacifico </string> <string name="Forward"> Avanti @@ -1455,7 +1785,7 @@ Tipi conosciuti .wav, .tga, .bmp, .jpg, .jpeg, or .bvh Destra </string> <string name="Back"> - Dietro + Indietro </string> <string name="North"> Nord @@ -1476,13 +1806,13 @@ Tipi conosciuti .wav, .tga, .bmp, .jpg, .jpeg, or .bvh Giù </string> <string name="Any Category"> - Tutte le categorie + Qualsiasi categoria </string> <string name="Shopping"> - Shopping + Acquisti </string> <string name="Land Rental"> - Affitto terreni + Affitto terreno </string> <string name="Property Rental"> Affitto proprietà @@ -1494,13 +1824,13 @@ Tipi conosciuti .wav, .tga, .bmp, .jpg, .jpeg, or .bvh Nuovi prodotti </string> <string name="Employment"> - Impiego + Lavoro </string> <string name="Wanted"> - Richiesti + Cercasi </string> <string name="Service"> - Servizi + Servizio </string> <string name="Personal"> Personale @@ -1539,7 +1869,7 @@ Tipi conosciuti .wav, .tga, .bmp, .jpg, .jpeg, or .bvh Residenziale </string> <string name="Stage"> - Stage + Fase </string> <string name="Other"> Altro @@ -1551,10 +1881,10 @@ Tipi conosciuti .wav, .tga, .bmp, .jpg, .jpeg, or .bvh Tu </string> <string name="Multiple Media"> - Media Multipli + Più supporti </string> <string name="Play Media"> - Media Play/Pausa + Riproduci/Pausa supporto </string> <string name="MBCmdLineError"> Un errore è stato riscontrato analizzando la linea di comando. @@ -1562,17 +1892,17 @@ Per informazioni: http://wiki.secondlife.com/wiki/Client_parameters Errore: </string> <string name="MBCmdLineUsg"> - uso linea di comando del programma [APP_NAME] : + Uso linea di comando del programma [APP_NAME] : </string> <string name="MBUnableToAccessFile"> Il programma [APP_NAME] non è in grado di accedere ad un file necessario. -Potrebbe darsi che tu abbia copie multiple attivate, o il tuo sistema reputa erroneamente che il file sia già aperto. +Potrebbe darsi che tu abbia copie multiple attivate o che il tuo sistema reputi erroneamente che il file sia già aperto. Se il problema persiste, riavvia il computer e riprova. -Se il problema persiste ancora, dovresti completamente disinstallare l'applicazione [APP_NAME] e reinstallarla. +Se il problema continua ancora, dovresti completamente disinstallare l'applicazione [APP_NAME] e reinstallarla. </string> <string name="MBFatalError"> - Errore fatale + Errore critico </string> <string name="MBRequiresAltiVec"> Il programma [APP_NAME] richiede un processore con AltiVec (G4 o superiore). @@ -1591,7 +1921,7 @@ Vuoi mandare un crash report? </string> <string name="MBNoDirectX"> Il programmma [APP_NAME] non riesce a trovare una DirectX 9.0b o superiore. -[APP_NAME] usa le DirectX per determinare hardware e/o i driver non aggiornati che possono causare problemi di stabilità , scarsa performance e interruzioni. Sebbene tu possa avviare il programma [APP_NAME] senza di esse, raccomandiamo caldamente di installare le DirectX 9.0b. +[APP_NAME] usa DirectX per rilevare hardware e/o i driver non aggiornati che possono causare problemi di stabilità , scarsa performance e interruzioni. Benché tu possa avviare il programma [APP_NAME] senza di esse, consigliamo caldamente l'esecuzione con DirectX 9.0b. Vuoi continuare? </string> @@ -1599,8 +1929,8 @@ Vuoi continuare? Attenzione </string> <string name="MBNoAutoUpdate"> - L'aggiornamento automatico non è stato ancora implementato per Linux. -Raccomandiamo di scaricare l'utima versione da www.secondlife.com. + L'aggiornamento automatico non è stato ancora realizzato per Linux. +Consigliamo di scaricare l'ultima versione direttamente da www.secondlife.com. </string> <string name="MBRegClassFailed"> RegisterClass non riuscito @@ -1609,8 +1939,8 @@ Raccomandiamo di scaricare l'utima versione da www.secondlife.com. Errore </string> <string name="MBFullScreenErr"> - Impossibile visualizzare a schermo intero a risoluzione [WIDTH] x [HEIGHT]. -Visualizzazione corrente ridotta a finestra. + Impossibile visualizzare a schermo intero con risoluzione [WIDTH] x [HEIGHT]. +Visualizzazione corrente in modalità finestra. </string> <string name="MBDestroyWinFailed"> Errore di arresto durante il tentativo di chiusura della finestra (DestroyWindow() non riuscito) @@ -1628,14 +1958,14 @@ Visualizzazione corrente ridotta a finestra. Impossibile ottenere una descrizione del formato pixel </string> <string name="MBTrueColorWindow"> - [APP_NAME] richiede True Color (32-bit) per funzionare. -Vai alle impostazioni dello schermo del tuo computer e imposta il colore in modalità 32-bit. + [APP_NAME] richiede True Color (32 bit) per funzionare. +Vai alle impostazioni dello schermo del tuo computer e imposta il colore in modalità 32 bit. </string> <string name="MBAlpha"> - [APP_NAME] non funziona poichè è impossibile trovare un canale alpha ad 8 Bit. Questo problema normalmente deriva dai driver della scheda video. + [APP_NAME] non funziona poichè è impossibile trovare un canale alpha a 8 bit. Questo problema normalmente deriva dai driver della scheda video. Assicurati di avere installato i driver della scheda video più recenti. -Assicurati anche che il monitor sia impostato a True Color (32-bit) nel pannello di controllo > Display > Settings. -Se il messaggio persiste, contatta contatta [SUPPORT_SITE]. +Assicurati anche che il monitor sia impostato a True Color (32 bit) nel Pannello di controllo > Schermo > Impostazioni. +Se il messaggio persiste, contatta [SUPPORT_SITE]. </string> <string name="MBPixelFmtSetErr"> Impossibile impostare il formato pixel @@ -1647,7 +1977,7 @@ Se il messaggio persiste, contatta contatta [SUPPORT_SITE]. Impossibile attivare il GL rendering </string> <string name="MBVideoDrvErr"> - [APP_NAME] Non riesce ad avviarsi perchè i driver della tua scheda video non sono stati installati correttamente, non sono aggiornati, o sono per un hardware non supportato. Assicurati di avere i driver della scheda video più recenti e anche se li hai installati, prova a reinstallarli di nuovo. + [APP_NAME] Non riesce ad avviarsi perchè i driver della tua scheda video non sono stati installati correttamente, non sono aggiornati, o sono per un hardware non supportato. Assicurati di avere i driver della scheda video più recenti e anche se li hai installati, prova a installarli di nuovo. Se il messaggio persiste, contatta [SUPPORT_SITE]. </string> @@ -1672,44 +2002,20 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. <string name="Attached Earlobes"> Lobi attaccati </string> - <string name="Back Bangs"> - #Back Bangs - </string> - <string name="Back Bangs Down"> - #Back Bangs Down - </string> - <string name="Back Bangs Up"> - #Back Bangs Up - </string> <string name="Back Fringe"> Frangetta all'indietro </string> - <string name="Back Hair"> - #Back Hair - </string> - <string name="Back Hair Down"> - #Back Hair Down - </string> - <string name="Back Hair Up"> - #Back Hair Up - </string> <string name="Baggy"> - Con le borse + Larghi </string> <string name="Bangs"> Frange </string> - <string name="Bangs Down"> - #Bangs Down - </string> - <string name="Bangs Up"> - #Bangs Up - </string> <string name="Beady Eyes"> Occhi piccoli </string> <string name="Belly Size"> - punto vita + Punto vita </string> <string name="Big"> Grande @@ -1717,23 +2023,20 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. <string name="Big Butt"> Sedere grande </string> - <string name="Big Eyeball"> - #Big Eyeball - </string> <string name="Big Hair Back"> - Gonfiore dei capelli: dietro + Capigliatura grande: Indietro </string> <string name="Big Hair Front"> - Gonfiore dei capelli: davanti + Capigliatura grande: anteriore </string> <string name="Big Hair Top"> - Gonfiore dei capelli: sopra + Capigliatura grande: in alto </string> <string name="Big Head"> - Grandezza testa + Grande testa </string> <string name="Big Pectorals"> - Grandezza pettorali + Grandi pettorali </string> <string name="Big Spikes"> Capelli con punte @@ -1766,13 +2069,13 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. Lentiggini e nei </string> <string name="Body Thick"> - Corpo robusto + Corpo più robusto </string> <string name="Body Thickness"> Robustezza del corpo </string> <string name="Body Thin"> - Magrezza del corpo + Corpo più magro </string> <string name="Bow Legged"> Gambe arcuate @@ -1781,7 +2084,7 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. Altezza del seno </string> <string name="Breast Cleavage"> - Avvicinamento dei seni + Décolleté </string> <string name="Breast Size"> Grandezza del seno @@ -1796,7 +2099,7 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. Grandezza delle sopracciglia </string> <string name="Bug Eyes"> - Sporgenza degli occhi + Occhi sporgenti </string> <string name="Bugged Eyes"> Occhi sporgenti @@ -1817,19 +2120,19 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. Grandezza del sedere </string> <string name="bustle skirt"> - Arricciatura posteriore + Crinolina </string> <string name="no bustle"> - Meno arricciatura + Nessuna crinolina </string> <string name="more bustle"> - Più arricciatura + Più crinolina </string> <string name="Chaplin"> Baffetti </string> <string name="Cheek Bones"> - Mascella + Zigomi </string> <string name="Chest Size"> Ampiezza del torace @@ -1838,7 +2141,7 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. Angolo del mento </string> <string name="Chin Cleft"> - Fessura inf. del mento + Fossetta sul mento </string> <string name="Chin Curtains"> Barba sottomento @@ -1847,16 +2150,16 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. Profondità mento </string> <string name="Chin Heavy"> - Appuntita verso l'alto + Mento forte </string> <string name="Chin In"> Mento in dentro </string> <string name="Chin Out"> - Mento in fuori + Mento sporgente </string> <string name="Chin-Neck"> - Grandezza mento-collo + Mento-collo </string> <string name="Clear"> Trasparente @@ -1871,46 +2174,40 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. Chiusa </string> <string name="Closed Back"> - Spacco chiuso dietro + Chiuso dietro </string> <string name="Closed Front"> - Spacco chiuso davanti + Chiuso davanti </string> <string name="Closed Left"> - Spacco chiuso sx + Chiuso sinistra </string> <string name="Closed Right"> - Spacco chiuso dx + Chiuso destra </string> <string name="Coin Purse"> Meno pronunciati </string> <string name="Collar Back"> - Scollatura posteriore + Colletto posteriore </string> <string name="Collar Front"> - Scollatura anteriore + Colletto anteriore </string> <string name="Corner Down"> Angolo all'ingiù </string> - <string name="Corner Normal"> - Angolo Normale - </string> <string name="Corner Up"> Angolo all'insù </string> <string name="Creased"> - Alzato + Piega </string> <string name="Crooked Nose"> Naso storto </string> - <string name="Cropped Hair"> - Capelli raccolti - </string> <string name="Cuff Flare"> - Fondo pantalone + Svasato con risvolto </string> <string name="Dark"> Scuro @@ -1922,49 +2219,43 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. Più scuro </string> <string name="Deep"> - Più pronunciato + Profondo </string> <string name="Default Heels"> Tacchi standard </string> - <string name="Default Toe"> - Punta del piede standard - </string> <string name="Dense"> - Meno rade - </string> - <string name="Dense hair"> - #Dense Hair + Folti </string> <string name="Double Chin"> Doppio mento </string> <string name="Downturned"> - Naso all'ingiù + All'ingiù </string> <string name="Duffle Bag"> Più pronunciati </string> <string name="Ear Angle"> - Orecchie a sventola + Angolo orecchie </string> <string name="Ear Size"> Grandezza orecchie </string> <string name="Ear Tips"> - Tipo di orecchio + Estremità orecchie </string> <string name="Egg Head"> Ovalizzazione testa </string> <string name="Eye Bags"> - Borse sotto agli occhi + Occhiaie </string> <string name="Eye Color"> Colore degli occhi </string> <string name="Eye Depth"> - Occhi incavati + Profondità degli occhi </string> <string name="Eye Lightness"> Luminosità degli occhi @@ -1973,7 +2264,7 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. Apertura degli occhi </string> <string name="Eye Pop"> - Differenza apertura occhi + Prominenza degli occhi </string> <string name="Eye Size"> Grandezza occhi @@ -1981,9 +2272,6 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. <string name="Eye Spacing"> Distanza occhi </string> - <string name="Eyeball Size"> - #Eyeball Size - </string> <string name="Eyebrow Arc"> Arco delle sopracciglia </string> @@ -2008,69 +2296,21 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. <string name="Eyeliner Color"> Colore dell'eyeliner </string> - <string name="Eyes Back"> - #Eyes Back - </string> <string name="Eyes Bugged"> Occhi sporgenti </string> - <string name="Eyes Forward"> - #Eyes Forward - </string> - <string name="Eyes Long Head"> - #Eyes Long Head - </string> - <string name="Eyes Shear Left Up"> - Distorsione occhi in alto a sx - </string> - <string name="Eyes Shear Right Up"> - Distorsione occhi in alto a dx - </string> - <string name="Eyes Short Head"> - #Eyes Short Head - </string> - <string name="Eyes Spread"> - #Eyes Spread - </string> - <string name="Eyes Sunken"> - #Eyes Sunken - </string> - <string name="Eyes Together"> - #Eyes Together - </string> <string name="Face Shear"> - Distorsione del viso + Taglio del viso </string> <string name="Facial Definition"> - Lineamenti del viso + Definizione del viso </string> <string name="Far Set Eyes"> Occhi distanti </string> - <string name="Fat"> - #Fat - </string> - <string name="Fat Head"> - #Fat Head - </string> <string name="Fat Lips"> Labbra carnose </string> - <string name="Fat Lower"> - #Fat Lower - </string> - <string name="Fat Lower Lip"> - Labbro inferiore sporgente - </string> - <string name="Fat Torso"> - #Fat Torso - </string> - <string name="Fat Upper"> - #Fat Upper - </string> - <string name="Fat Upper Lip"> - Labbro superiore sporgente - </string> <string name="Female"> Femmina </string> @@ -2081,7 +2321,7 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. Dita </string> <string name="Flared Cuffs"> - Fondo largo + Risvolti svasati </string> <string name="Flat"> Piatto @@ -2090,88 +2330,73 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. Sedere piatto </string> <string name="Flat Head"> - Viso piatto + Testa piatta </string> <string name="Flat Toe"> Punta piatta </string> <string name="Foot Size"> - Grandezza piede + Misura piede </string> <string name="Forehead Angle"> Angolo della fronte </string> <string name="Forehead Heavy"> - Appuntita verso il basso + Fronte sporgente </string> <string name="Freckles"> Lentiggini </string> - <string name="Front Bangs Down"> - #Front Bangs Down - </string> - <string name="Front Bangs Up"> - #Front Bangs Up - </string> <string name="Front Fringe"> Frangetta </string> - <string name="Front Hair"> - #Front Hair - </string> - <string name="Front Hair Down"> - #Front Hair Down - </string> - <string name="Front Hair Up"> - #Front Hair Up - </string> <string name="Full Back"> - Scostati + Dietro gonfi </string> <string name="Full Eyeliner"> - Con eyeliner + Eyeliner marcato </string> <string name="Full Front"> - Anteriore pieno + Anteriore gonfio </string> <string name="Full Hair Sides"> - Riempimento lati + Lati capelli gonfi </string> <string name="Full Sides"> - Pieni + Lati gonfi </string> <string name="Glossy"> Lucido </string> <string name="Glove Fingers"> - Dita dei guanti + Dita con guanti </string> <string name="Glove Length"> Lunghezza guanti </string> <string name="Hair"> - Capelli + Capigliature </string> <string name="Hair Back"> - Capelli: dietro + Capelli: Indietro </string> <string name="Hair Front"> - Capelli: davanti + Capelli: anteriore </string> <string name="Hair Sides"> Capelli: lati </string> <string name="Hair Sweep"> - Traslazione + Direzione capigliatura </string> <string name="Hair Thickess"> - Spessore + Foltezza </string> <string name="Hair Thickness"> - Spessore barba + Foltezza </string> <string name="Hair Tilt"> - Rotazione capelli + Inclinazione </string> <string name="Hair Tilted Left"> Verso sinistra @@ -2180,16 +2405,16 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. Verso destra </string> <string name="Hair Volume"> - Capelli: volume + Capelli: Volume </string> <string name="Hand Size"> Grandezza mani </string> <string name="Handlebars"> - Baffi lunghi + Baffi a manubrio </string> <string name="Head Length"> - Sporgenza del viso + Lunghezza testa </string> <string name="Head Shape"> Forma della testa @@ -2198,7 +2423,7 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. Grandezza della testa </string> <string name="Head Stretch"> - Compressione lat testa + Allungamento testa </string> <string name="Heel Height"> Altezza tacchi @@ -2222,7 +2447,7 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. Alta </string> <string name="High and Tight"> - Cavallo alto + Alto e stretto </string> <string name="Higher"> Più alto @@ -2267,7 +2492,7 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. Forma del mento </string> <string name="Join"> - Avvicinati + Iscriviti </string> <string name="Jowls"> Guance @@ -2297,7 +2522,7 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. Meno </string> <string name="Less Body Fat"> - Meno grasso + Meno grasso corporeo </string> <string name="Less Curtains"> Meno @@ -2339,16 +2564,16 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. Meno </string> <string name="Lighter"> - Più chiaro + Più leggero </string> <string name="Lip Cleft"> - Distanza divis. labbro sup. + Distanza fossetta labbro </string> <string name="Lip Cleft Depth"> - Prof. spacco labbro sup. + Prof. fossetta labbro </string> <string name="Lip Fullness"> - Riempimento delle labbra + Volume labbra </string> <string name="Lip Pinkness"> Tonalità rosa labbra @@ -2375,7 +2600,7 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. Lungo </string> <string name="Long Head"> - Viso sporgente + Testa lunga </string> <string name="Long Hips"> Bacino alto @@ -2387,7 +2612,7 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. Collo lungo </string> <string name="Long Pigtails"> - Ciuffi laterali lunghi + Codini lunghi </string> <string name="Long Ponytail"> Codino lungo @@ -2398,17 +2623,14 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. <string name="Long arms"> Braccia lunghe </string> - <string name="Longcuffs"> - Longcuffs - </string> <string name="Loose Pants"> - Non attillati + Pantaloni ampi </string> <string name="Loose Shirt"> - Non attillata + Camicia ampia </string> <string name="Loose Sleeves"> - Maniche lente + Maniche non attillate </string> <string name="Love Handles"> Maniglie dell'amore @@ -2426,7 +2648,7 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. Bassa </string> <string name="Low and Loose"> - Cavallo basso + Basso e ampio </string> <string name="Lower"> Più basso @@ -2435,7 +2657,7 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. Parte bassa del setto </string> <string name="Lower Cheeks"> - Guance + Guance inferiori </string> <string name="Male"> Maschio @@ -2444,13 +2666,13 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. Riga nel mezzo </string> <string name="More"> - Di più + Altro </string> <string name="More Blush"> Più fard </string> <string name="More Body Fat"> - Più grasso + Più grasso corporeo </string> <string name="More Curtains"> Più @@ -2519,7 +2741,7 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. Posizione della bocca </string> <string name="Mowhawk"> - Vuoti + Moicana </string> <string name="Muscular"> Muscolatura @@ -2563,9 +2785,6 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. <string name="No Eyeshadow"> Senza ombretto </string> - <string name="No Heels"> - No Heels - </string> <string name="No Lipgloss"> Senza lipgloss </string> @@ -2597,10 +2816,10 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. Superiore normale </string> <string name="Nose Left"> - Storto a sinistra + Naso a sinistra </string> <string name="Nose Right"> - Storto a destra + Naso a destra </string> <string name="Nose Size"> Grandezza naso @@ -2623,20 +2842,17 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. <string name="Nostril Width"> Larghezza narici </string> - <string name="Old"> - Vecchio - </string> <string name="Opaque"> Opaco </string> <string name="Open"> - Aperto + Apri </string> <string name="Open Back"> Retro aperto </string> <string name="Open Front"> - Aperto Frontale + Davanti aperto </string> <string name="Open Left"> Lato sin. aperto @@ -2672,7 +2888,7 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. Genitali </string> <string name="Painted Nails"> - Unghie colorate + Unghie smaltate </string> <string name="Pale"> Pallido @@ -2687,7 +2903,7 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. Lunghezza pantaloni </string> <string name="Pants Waist"> - Altezza slip + Taglia pantalone </string> <string name="Pants Wrinkles"> Pantaloni con le grinze @@ -2705,7 +2921,7 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. Pigmento </string> <string name="Pigtails"> - Ciuffi + Codini </string> <string name="Pink"> Rosa @@ -2725,9 +2941,6 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. <string name="Pointy Heels"> Tacchi a spillo </string> - <string name="Pointy Toe"> - Punta appuntita - </string> <string name="Ponytail"> Codino </string> @@ -2752,15 +2965,9 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. <string name="Red Hair"> Presenza di rosso nei capelli </string> - <string name="Red Skin"> - Red Skin - </string> <string name="Regular"> Normale </string> - <string name="Regular Muscles"> - Muscolatura normale - </string> <string name="Right Part"> Riga a destra </string> @@ -2770,9 +2977,6 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. <string name="Round"> Rotondo </string> - <string name="Round Forehead"> - Round Forehead - </string> <string name="Ruddiness"> Rossore </string> @@ -2785,53 +2989,35 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. <string name="Saddle Bags"> Rotondità fianchi </string> - <string name="Saddlebags"> - Rotondità fianchi - </string> - <string name="Scrawny"> - Scrawny - </string> <string name="Scrawny Leg"> Gambe magre </string> <string name="Separate"> Separati </string> - <string name="Shading"> - Shading - </string> - <string name="Shadow hair"> - Shadow hair - </string> <string name="Shallow"> Meno pronunciato </string> <string name="Shear Back"> - Accostamento posteriore + Taglio posteriore </string> <string name="Shear Face"> - Distorsione viso + Taglio del viso </string> <string name="Shear Front"> - Riempimento davanti - </string> - <string name="Shear Left"> - A sinistra + Taglio anteriore </string> <string name="Shear Left Up"> Distorto a sinistra </string> - <string name="Shear Right"> - A destra - </string> <string name="Shear Right Up"> Distorto a destra </string> <string name="Sheared Back"> - Accostati + Taglio verso dietro </string> <string name="Sheared Front"> - Anteriormente vuoto + Taglio verso davanti </string> <string name="Shift Left"> A sinistra @@ -2867,10 +3053,10 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. Collo corto </string> <string name="Short Pigtails"> - Ciuffi laterali corti + Codini corti </string> <string name="Short Ponytail"> - Codino Corto + Codino corto </string> <string name="Short Sideburns"> Basette corte @@ -2884,15 +3070,6 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. <string name="Shoulders"> Spalle </string> - <string name="Side Bangs"> - Side Bangs - </string> - <string name="Side Bangs Down"> - Side Bangs Down - </string> - <string name="Side Bangs Up"> - Side Bangs Up - </string> <string name="Side Fringe"> Ciuffi laterali </string> @@ -2900,16 +3077,13 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. Basette </string> <string name="Sides Hair"> - Capigliatura later. + Capigliatura di lato </string> <string name="Sides Hair Down"> - Giù + Capigliatura di lato sciolta </string> <string name="Sides Hair Up"> - Su - </string> - <string name="Skinny"> - Skinny + Capigliatura di lato raccolta </string> <string name="Skinny Neck"> Collo fino @@ -2930,19 +3104,19 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. Morbidezza maniche </string> <string name="Slit Back"> - Spacco: posteriore + Spacco: Indietro </string> <string name="Slit Front"> Spacco: anteriore </string> <string name="Slit Left"> - Spacco: sinistro + Spacco: Sinistra </string> <string name="Slit Right"> - Spacco: destro + Spacco: Destra </string> <string name="Small"> - Piccolo + Piccola </string> <string name="Small Hands"> Mani piccole @@ -2959,9 +3133,6 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. <string name="Socks Length"> Lunghezza calze </string> - <string name="Some"> - Some - </string> <string name="Soulpatch"> Pizzetto labbro inferiore </string> @@ -2980,9 +3151,6 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. <string name="Squash Head"> Testa schiacciata </string> - <string name="Squash/Stretch Head"> - Testa Schiacciata/Allungata - </string> <string name="Stretch Head"> Testa allungata </string> @@ -3001,18 +3169,6 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. <string name="Sweep Forward"> Avanti </string> - <string name="Swept Back"> - Swept Back - </string> - <string name="Swept Back Hair"> - Swept Back Hair - </string> - <string name="Swept Forward"> - Swept Forward - </string> - <string name="Swept Forward Hair"> - Swept Forward Hair - </string> <string name="Tall"> Alto </string> @@ -3031,44 +3187,35 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. <string name="Thick Toe"> Punta spessa </string> - <string name="Thickness"> - Thickness - </string> <string name="Thin"> - Ossute + Sottili </string> <string name="Thin Eyebrows"> - Sopracciglia fini + Sopracciglia sottili </string> <string name="Thin Lips"> - Labbra fini + Labbra sottili </string> <string name="Thin Nose"> - Naso fino + Naso sottile </string> <string name="Tight Chin"> - Mento magro + Mento stretto </string> <string name="Tight Cuffs"> Fondo stretto </string> <string name="Tight Pants"> - Attillati + Pantaloni attillati </string> <string name="Tight Shirt"> - Attilata + Camicia attillata </string> <string name="Tight Skirt"> - Attillata + Gonna attillata </string> <string name="Tight Sleeves"> - Attillate - </string> - <string name="Tilt Left"> - Tilt Left - </string> - <string name="Tilt Right"> - Tilt Right + Maniche strette </string> <string name="Toe Shape"> Forma della punta @@ -3089,7 +3236,7 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. Distaccato </string> <string name="Uncreased"> - Abbassato + Senza piega </string> <string name="Underbite"> Denti inf. in fuori @@ -3104,13 +3251,13 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. Parte alta degli zigomi </string> <string name="Upper Chin Cleft"> - Fessura sup. del mento + Fossetta sup. del mento </string> <string name="Upper Eyelid Fold"> Piega palpebra sup. </string> <string name="Upturned"> - Naso all'insù + All'insù </string> <string name="Very Red"> Molto rossi @@ -3125,13 +3272,13 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. Capelli bianchi </string> <string name="Wide"> - Spalancati + Largo </string> <string name="Wide Back"> - Laterali post. larghi + Dietro largo </string> <string name="Wide Front"> - Laterali ant. larghi + Davanti largo </string> <string name="Wide Lips"> Labbra larghe @@ -3143,31 +3290,40 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. Grinze </string> <string name="LocationCtrlAddLandmarkTooltip"> - Aggiungi ai miei landmark + Aggiungi ai miei punti di riferimento </string> <string name="LocationCtrlEditLandmarkTooltip"> - Modifica i miei landmark + Modifica i miei punti di riferimento </string> <string name="LocationCtrlInfoBtnTooltip"> - maggiori informazioni sulla posizione attuale + Maggiori informazioni sulla posizione attuale </string> <string name="LocationCtrlComboBtnTooltip"> - Lo storico delle mie posizioni + La cronologia delle mie posizioni + </string> + <string name="LocationCtrlAdultIconTooltip"> + Regione con categoria adulti + </string> + <string name="LocationCtrlModerateIconTooltip"> + Regione con categoria moderata + </string> + <string name="LocationCtrlGeneralIconTooltip"> + Regione generale </string> <string name="UpdaterWindowTitle"> Aggiornamento [APP_NAME] </string> <string name="UpdaterNowUpdating"> - [APP_NAME] In aggiornamento... + Aggiornamento di [APP_NAME]... </string> <string name="UpdaterNowInstalling"> - [APP_NAME] In installazione... + Installazione di [APP_NAME]... </string> <string name="UpdaterUpdatingDescriptive"> - Il Viewer del programma [APP_NAME] si sta aggiornando all'ultima versione. Potrebbe volerci del tempo, attendi. + Il Viewer del programma [APP_NAME] si sta aggiornando all'ultima versione. Potrebbe volerci del tempo, attendi. </string> <string name="UpdaterProgressBarTextWithEllipses"> - Aggiornamento in download... + Download dell'aggiornamento... </string> <string name="UpdaterProgressBarText"> Download dell'aggiornamento @@ -3176,13 +3332,19 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. Download dell'aggiornamento non riuscito </string> <string name="UpdaterFailUpdateDescriptive"> - Il programma [APP_NAME] ha riscontrato un'errore nel tentativo di aggiornamento. Consigliamo di scaricare l'ultima versione direttamente da www.secondlife.com. + Il programma [APP_NAME] ha riscontrato un'errore durante il tentativo di aggiornamento. Consigliamo di scaricare l'ultima versione direttamente da www.secondlife.com. </string> <string name="UpdaterFailInstallTitle"> - Tentativo di installazione aggiornamento non riuscito + Installazione dell'aggiornamento non riuscita </string> <string name="UpdaterFailStartTitle"> - Errore nell'apertura del viewer + Errore nell'avvio del viewer + </string> + <string name="ItemsComingInTooFastFrom"> + [APP_NAME]: Oggetti in arrivo troppo velocemente da [FROM_NAME], anteprima automatica disattivata per [TIME] secondi + </string> + <string name="ItemsComingInTooFast"> + [APP_NAME]: Oggetti in arrivo troppo velocemente, anteprima automatica disattivata per [TIME] secondi </string> <string name="IM_logging_string"> -- Registrazione messaggi instantanei abilitata -- @@ -3194,7 +3356,7 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. (anonimo) </string> <string name="IM_moderated_chat_label"> - (Moderato: Voice spento di default) + (Moderato: Voci disattivate di default) </string> <string name="IM_unavailable_text_label"> La chat di testo non è disponibile per questa chiamata. @@ -3203,7 +3365,7 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. La chat di testo è stata disabilitata da un moderatore di gruppo. </string> <string name="IM_default_text_label"> - Clicca qua per inviare un messaggio instantaneo. + Clicca qui per inviare un messaggio instantaneo. </string> <string name="IM_to_label"> A @@ -3211,6 +3373,27 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. <string name="IM_moderator_label"> (Moderatore) </string> + <string name="answered_call"> + Risposto alla chiamata + </string> + <string name="you_started_call"> + Hai iniziato una chiamata vocale + </string> + <string name="you_joined_call"> + Ti sei collegato alla chiamata in voce + </string> + <string name="name_started_call"> + [NAME] ha iniziato una chiamata vocale + </string> + <string name="ringing-im"> + Collegamento alla chiamata vocale... + </string> + <string name="connected-im"> + Collegato, clicca Chiudi chiamata per agganciare + </string> + <string name="hang_up-im"> + Chiusa la chiamata + </string> <string name="only_user_message"> Sei l'unico utente di questa sessione. </string> @@ -3220,6 +3403,12 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. <string name="invite_message"> Clicca il tasto [BUTTON NAME] per accettare/connetterti a questa voice chat. </string> + <string name="muted_message"> + Hai bloccato questo residente. Quando gli invii un messaggio, verrà automaticamente sbloccato. + </string> + <string name="generic"> + Errore nella richiesta, riprova più tardi. + </string> <string name="generic_request_error"> Errore durante la richiesta, riprova più tardi. </string> @@ -3238,19 +3427,283 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. <string name="not_a_mod_error"> Non sei un moderatore. </string> + <string name="muted"> + Il moderatore del gruppo ha disattivato la tua chat di testo. + </string> <string name="muted_error"> Un moderatore di gruppo ti ha disabilitato dalla chat di testo. </string> <string name="add_session_event"> Impossibile aggiungere utenti alla chat con [RECIPIENT]. </string> + <string name="message"> + Impossibile spedire il tuo messaggio nella sessione chat con [RECIPIENT]. + </string> <string name="message_session_event"> Impossibile inviare il messaggio nella chat con [RECIPIENT]. </string> + <string name="mute"> + Errore durante la moderazione. + </string> + <string name="removed"> + Sei stato rimosso dal gruppo. + </string> <string name="removed_from_group"> Sei stato espulso dal gruppo. </string> <string name="close_on_no_ability"> Non hai più le abilitazioni per rimanere nella sessione chat. </string> + <string name="unread_chat_single"> + [SOURCES] ha detto qualcosa di nuovo + </string> + <string name="unread_chat_multiple"> + [SOURCES] ha detto qualcosa di nuovo + </string> + <string name="session_initialization_timed_out_error"> + Sessione di inizializzazione scaduta + </string> + <string name="voice_morphing_url"> + http://secondlife.com/landing/voicemorphing + </string> + <string name="paid_you_ldollars"> + [NAME] ti ha inviato un pagamento di L$[AMOUNT]. + </string> + <string name="you_paid_ldollars"> + Hai inviato un pagamento di L$[AMOUNT] a [NAME] [REASON]. + </string> + <string name="you_paid_ldollars_no_info"> + Hai pagato L$ [AMOUNT]. + </string> + <string name="you_paid_ldollars_no_reason"> + Hai inviato un pagamento di L$[AMOUNT] a [NAME]. + </string> + <string name="you_paid_ldollars_no_name"> + Hai pagato L$ [AMOUNT] [REASON]. + </string> + <string name="for a parcel of land"> + per un lotto di terreno + </string> + <string name="for a land access pass"> + per un permesso di accesso al terreno + </string> + <string name="for deeding land"> + per la cessione di terreno + </string> + <string name="to create a group"> + per creare un gruppo + </string> + <string name="to join a group"> + per aderire a un gruppo + </string> + <string name="to upload"> + per caricare + </string> + <string name="giving"> + Contributo di L$ [AMOUNT] + </string> + <string name="uploading_costs"> + Il costo per il caricamento è di L$ [AMOUNT] + </string> + <string name="this_costs"> + Il costo è L$ [AMOUNT] + </string> + <string name="buying_selected_land"> + L'acquisto del terreno prescelto costa L$ [AMOUNT] + </string> + <string name="this_object_costs"> + Il costo dell'oggetto è L$ [AMOUNT] + </string> + <string name="group_role_everyone"> + Tutti + </string> + <string name="group_role_officers"> + Funzionari + </string> + <string name="group_role_owners"> + Proprietari + </string> + <string name="uploading_abuse_report"> + Caricamento in corso... + +Segnala abuso + </string> + <string name="New Shape"> + Nuova figura corporea + </string> + <string name="New Skin"> + Nuova pelle + </string> + <string name="New Hair"> + Nuovi capelli + </string> + <string name="New Eyes"> + Nuovi occhi + </string> + <string name="New Shirt"> + Nuova camicia + </string> + <string name="New Pants"> + Nuovi pantaloni + </string> + <string name="New Shoes"> + Nuove scarpe + </string> + <string name="New Socks"> + Nuove calze + </string> + <string name="New Jacket"> + Nuova giacca + </string> + <string name="New Gloves"> + Nuovi guanti + </string> + <string name="New Undershirt"> + Nuova maglietta intima + </string> + <string name="New Underpants"> + Nuovi slip + </string> + <string name="New Skirt"> + Nuova gonna + </string> + <string name="New Alpha"> + Nuovo Alpha (trasparenza) + </string> + <string name="New Tattoo"> + Nuovo tatuaggio + </string> + <string name="Invalid Wearable"> + Capo da indossare non valido + </string> + <string name="New Script"> + Nuovo script + </string> + <string name="New Folder"> + Nuova cartella + </string> + <string name="Contents"> + Contenuto + </string> + <string name="Gesture"> + Gesture + </string> + <string name="Male Gestures"> + Gesture maschili + </string> + <string name="Female Gestures"> + Gesture femminili + </string> + <string name="Other Gestures"> + Altre gesture + </string> + <string name="Speech Gestures"> + Gesture del parlato + </string> + <string name="Common Gestures"> + Gesture comuni + </string> + <string name="Male - Excuse me"> + Maschio - Chiedere scusa + </string> + <string name="Male - Get lost"> + Maschio - Levati dai piedi! + </string> + <string name="Male - Blow kiss"> + Maschio - Butta un bacio + </string> + <string name="Male - Boo"> + Maschio - Bu + </string> + <string name="Male - Bored"> + Maschio - Annoiato + </string> + <string name="Male - Hey"> + Maschio - Ehi + </string> + <string name="Male - Laugh"> + Maschio - Ridere + </string> + <string name="Male - Repulsed"> + Maschio - Disgustato + </string> + <string name="Male - Shrug"> + Maschio - Spallucce + </string> + <string name="Male - Stick tougue out"> + Maschio - Tira fuori la lingua + </string> + <string name="Male - Wow"> + Maschio - Accipicchia + </string> + <string name="Female - Excuse me"> + Femmina - Chiedere scusa + </string> + <string name="Female - Get lost"> + Femmina - Levati dai piedi! + </string> + <string name="Female - Blow kiss"> + Femmina - Butta un bacio + </string> + <string name="Female - Boo"> + Femmina - Bu + </string> + <string name="Female - Bored"> + Femmina - Annoiata + </string> + <string name="Female - Hey"> + Femmina - Ehi + </string> + <string name="Female - Laugh"> + Femmina - Ridere + </string> + <string name="Female - Repulsed"> + Femmina - Disgustata + </string> + <string name="Female - Shrug"> + Femmina - Spallucce + </string> + <string name="Female - Stick tougue out"> + Femmina - Tira fuori la lingua + </string> + <string name="Female - Wow"> + Femmina - Accipicchia + </string> + <string name="AvatarBirthDateFormat"> + [day,datetime,slt]/[mthnum,datetime,slt]/[year,datetime,slt] + </string> + <string name="DefaultMimeType"> + nessuna/nessuna + </string> + <string name="texture_load_dimensions_error"> + Impossibile caricare immagini di dimensioni superiori a [WIDTH]*[HEIGHT] + </string> + <string name="words_separator" value=","/> + <string name="server_is_down"> + Nonostante i nostri tentativi, si è verificato un errore imprevisto. + + Consulta la pagina status.secondlifegrid.net per determinare se si sia verificato un problema noto con il servizio. + Se il problema continua, ti consigliamo di controllare le tue impostazioni di rete e della firewall. + </string> + <string name="dateTimeWeekdaysNames"> + lunedì:martedì:mercoledì:giovedì:venerdì:sabato:domenica + </string> + <string name="dateTimeWeekdaysShortNames"> + lun:mar:mer:gio:ven:sab:dom + </string> + <string name="dateTimeMonthNames"> + gennaio:febbraio:marzo:aprile:maggio:giugno:luglio:agosto:settembre:ottobre:novembre:dicembre + </string> + <string name="dateTimeMonthShortNames"> + gen:feb:mar:apr:mag:giu:lug:ago:sett:ott:nov:dic + </string> + <string name="dateTimeDayFormat"> + [MDAY] + </string> + <string name="dateTimeAM"> + antemeridiane + </string> + <string name="dateTimePM"> + pomeridiane + </string> </strings> diff --git a/indra/newview/skins/default/xui/it/teleport_strings.xml b/indra/newview/skins/default/xui/it/teleport_strings.xml index eff7516050..7a1046abd3 100644 --- a/indra/newview/skins/default/xui/it/teleport_strings.xml +++ b/indra/newview/skins/default/xui/it/teleport_strings.xml @@ -2,12 +2,12 @@ <teleport_messages> <message_set name="errors"> <message name="invalid_tport"> - C'è stato un problema nell'elaborare la tua richiesta di teleport. Potresti aver bisogno di ricollegarti prima di poter usare il teleport. Se continui ad avere problemi, controlla per favore le FAQ del Supporto Tecnico a: -www.secondlife.com/support. + C'è stato un problema nell'elaborare la tua richiesta di teleport. Potresti dover effettuare nuovamente l'accesso prima di poter usare il teleport. +Se si continua a visualizzare questo messaggio, consulta la pagina [SUPPORT_SITE]. </message> <message name="invalid_region_handoff"> - C'è stato un problema nell'elaborare il cambio di regione. Potresti aver bisogno di ricollegarti prima di poterlo effetuare. Se continui ad avere problemi, controlla per favore le FAQ del Supporto Tecnico a: -www.secondlife.com/support. + Si è verificato un problema nel tentativo di attraversare regioni. È possibile che per potere attraversare le regioni, tu debba effettuare nuovamente l'accesso. +Se si continua a visualizzare questo messaggio, consulta la pagina [SUPPORT_SITE]. </message> <message name="blocked_tport"> Spiacenti, il teletrasporto è bloccato al momento. Prova di nuovo tra pochi istanti. Se ancora non potrai teletrasportarti, per favore scollegati e ricollegati per risolvere il problema. @@ -59,11 +59,14 @@ www.secondlife.com/support. <message name="completing"> Teletrasporto completato </message> + <message name="completed_from"> + Teleport completato da [T_SLURL] + </message> <message name="resolving"> Elaborazione della destinazione in corso... </message> <message name="contacting"> - Contattando la nuova regione. + Contatto in corso con la nuova regione. </message> <message name="arriving"> In arrivo a destinazione... diff --git a/indra/newview/skins/default/xui/ja/floater_about.xml b/indra/newview/skins/default/xui/ja/floater_about.xml index 0fa20ab1ac..d2765eb0c8 100644 --- a/indra/newview/skins/default/xui/ja/floater_about.xml +++ b/indra/newview/skins/default/xui/ja/floater_about.xml @@ -8,9 +8,9 @@ コンパイラー [COMPILER] [COMPILER_VERSION] ãƒãƒ¼ã‚¸ãƒ§ãƒ³ </floater.string> <floater.string name="AboutPosition"> - You are at [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] in [REGION] located at [HOSTNAME] ([HOSTIP]) + ã‚ãªãŸã®ç¾åœ¨åœ°ã¯ã€[POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] ã® [REGION] ã§ã™ã€‚ä½ç½®ã¯ <nolink>[HOSTNAME]</nolink> ã§ã™ã€‚([HOSTIP]) [SERVER_VERSION] -[[SERVER_RELEASE_NOTES_URL] [ReleaseNotes]] +[[SERVER_RELEASE_NOTES_URL] [リリースノート]] </floater.string> <floater.string name="AboutSystem"> CPU: [CPU] @@ -29,7 +29,7 @@ libcurl ãƒãƒ¼ã‚¸ãƒ§ãƒ³ï¼š [LIBCURL_VERSION] J2C デコーダãƒãƒ¼ã‚¸ãƒ§ãƒ³ï¼š [J2C_VERSION] オーディオドライãƒãƒãƒ¼ã‚¸ãƒ§ãƒ³ï¼š [AUDIO_DRIVER_VERSION] Qt Webkit ãƒãƒ¼ã‚¸ãƒ§ãƒ³ï¼š [QT_WEBKIT_VERSION] -Vivox ãƒãƒ¼ã‚¸ãƒ§ãƒ³ï¼š [VIVOX_VERSION] +ボイスサーãƒãƒ¼ãƒãƒ¼ã‚¸ãƒ§ãƒ³ï¼š [VOICE_VERSION] </floater.string> <floater.string name="none"> (ãªã—) @@ -43,13 +43,14 @@ Vivox ãƒãƒ¼ã‚¸ãƒ§ãƒ³ï¼š [VIVOX_VERSION] </panel> <panel label="クレジット" name="credits_panel"> <text_editor name="credits_editor"> - Second Lifeã¯ã€ Philipã€Tessaã€Andrewã€Coryã€Jamesã€Benã€Charã€Charlieã€Colinã€Danã€Danielã€Dougã€Ericã€Hamletã€Haneyã€Eveã€Hunterã€Ianã€Jeffã€Jenniferã€Jimã€Johnã€Leeã€Markã€Peterã€Phoenixã€Richardã€Robinã€Xenonã€Steveã€Tanyaã€Eddieã€Aviã€Frankã€Bruceã€Aaronã€Aliceã€Bobã€Debraã€Eileenã€Helenã€Janetã€Louieã€Leviathaniaã€Stefanã€Rayã€Kevinã€Tomã€Mikebã€MikeTã€Burgessã€Elenaã€Tracyã€Billã€Toddã€Ryanã€Zachã€Sarahã€Novaã€Timã€Stephanieã€Michaelã€Evanã€Nicolasã€Catherineã€Rachelleã€Daveã€Hollyã€Bubã€Kellyã€Magellanã€Ramziã€Donã€Sabinã€Jillã€Rheyaã€Jeskaã€Torleyã€Konaã€Callumã€Charityã€Ventrellaã€Jackã€Vektorã€Irisã€Chrisã€Nicoleã€Mickã€Reubenã€Blueã€Babbageã€Yedwabã€Deanaã€Laurenã€Brentã€Pathfinderã€Chadrickã€Altruimaã€Jesseã€Teenyã€Monroeã€Icculusã€Davidã€Tessã€Lizzieã€Patsyã€Isaacã€Lawrenceã€Cynã€Boã€Giaã€Annetteã€Mariusã€Tboneã€Jonathanã€Karenã€Ginsuã€Satokoã€Yukoã€Makikoã€Thomasã€Harryã€Sethã€Alexeiã€Brianã€Guyã€Runitaiã€Ethanã€Dataã€Corneliusã€Kennyã€Swissã€Zeroã€Natriaã€Wendyã€Stephenã€Teepleã€Thumperã€Lucyã€Deeã€Miaã€Lianaã€Warrenã€Brankaã€Auraã€beezã€Miloã€Hermiaã€Redã€Thraxã€Joeã€Sallyã€Magentaã€Moguraã€Paulã€Joseã€Rejeanã€Henrikã€Lexieã€Amberã€Loganã€Xanã€Noraã€Morpheusã€Donovanã€Leylaã€MichaelFrancisã€Beastã€Cubeã€Buckyã€Joshuaã€Stryfeã€Harmonyã€Teresaã€Claudiaã€Walkerã€Glennã€Fritzã€Fordakã€Juneã€Cleopetraã€Jeanã€Ivyã€Betsyã€Rooseveltã€Spikeã€Kenã€Whichã€Tofuã€Chiyoã€Robã€Zeeã€dustinã€Georgeã€Delã€Matthewã€Catã€Jacquiã€Lightfootã€Adrianã€Violaã€Alfredã€Noelã€Irfanã€Sunilã€Yoolã€Rikaã€Janeã€Xtremeã€Frontierã€a2ã€Neoã€Siobhanã€Yozã€Justinã€Elleã€Qarlã€Benjaminã€Isabelã€Gulliverã€Everettã€Christopherã€Izzyã€Stephanyã€Garryã€Sejongã€Seanã€Tobinã€Iridiumã€Metaã€Anthonyã€Jeremyã€JPã€Jakeã€Mauriceã€Madhaviã€Leopardã€Kyleã€Joonã€Kariã€Bertã€Belindaã€Jonã€Kristiã€Bridieã€Pramodã€KJã€Socratesã€Mariaã€Ivanã€Aricã€Yamasakiã€Adreanneã€Jayã€MitchKã€Cerenã€Cocoã€Durlã€Jennyã€Periapseã€Karticã€Storrsã€Lotteã€Sandyã€Rohnã€Colossusã€Zenã€BigPapiã€Bradã€Pastramiã€Kurzã€Maniã€Neuroã€Jaimeã€MJã€Rowanã€Sgtã€Elvisã€Geckoã€Samuelã€Sardonyxã€Leoã€Bryanã€Nikoã€Softã€Poppyã€Rachelã€Akiã€Angeloã€Banzaiã€Alexaã€Sueã€CeeLoã€Benderã€CGã€Gillianã€Pelleã€Nickã€Echoã€Zaraã€Christineã€Shamiranã€Emmaã€Blakeã€Keikoã€Plexusã€Joppaã€Sidewinderã€Ericaã€Ashleiã€Twilightã€Kristenã€Brettã€Qã€Enusã€Simonã€Bevisã€Kraftã€Kipã€Chandlerã€Ronã€LauraPã€Ramã€KyleJMã€Scouseã€Prosperoã€Melissaã€Martyã€Natã€Hamiltonã€Kendã€Lordanã€Jimmyã€Kosmoã€Seraphã€Greenã€Ekimã€Wiggoã€JTã€Romeã€Dorisã€Mizã€Benocã€Whumpã€Trinityã€Patchã€Kateã€TJã€Baoã€Joohwanã€Christyã€Sofiaã€Matiasã€Cogsworthã€Johanã€Orehã€Cheahã€Angelaã€Brandyã€Mangoã€Lanã€Aleksã€Gloriaã€Heidyã€Mitchellã€Spaceã€Coltonã€Bambersã€Einsteinã€Maggieã€Malbersã€Roseã€Winnieã€Stellaã€Miltonã€Rothmanã€Niallã€Marinã€Allisonã€Katieã€Dawnã€Kattã€Dustyã€Kalpanaã€Judyã€Andreaã€Ambroffã€Infinityã€Gailã€Ricoã€Raymondã€Yiã€Williamã€Christaã€Mã€Teaganã€Scoutã€Mollyã€Danteã€Corrã€Dynamikeã€Usiã€Kayleeã€Vidtutsã€Lilã€Danicaã€Saschaã€Kelvã€Jacobã€Nyaã€Rodneyã€Brandonã€Elsieã€Blondinã€Grantã€Katrinã€Nyxã€Gabrielã€Locklainnã€Claireã€Devinã€Minervaã€Montyã€Austinã€Bradfordã€Siã€Keiraã€Hã€Caitlinã€Ditaã€Makaiã€Jennã€Annã€Meredithã€Clareã€Joyã€Praveenã€Codyã€Edmundã€Rutheã€Sirenaã€Gayathriã€Spiderã€FJã€Davidoffã€Tianã€Jennieã€Louiseã€Oskarã€Landonã€Noelleã€Jarvã€Ingridã€Alã€Sommerã€Docã€Ariaã€Huinã€Grayã€Liliã€Virã€DJã€Yangã€Tã€Simoneã€Maestroã€Scottã€Charleneã€Quixoteã€Amandaã€Susanã€Zedã€Anneã€Enkiduã€Esbeeã€Joroanã€Katelinã€Roxieã€Tayã€Scarletã€Kevinã€Johnnyã€Wolfgangã€Andrenã€Bobã€Howardã€Merovã€Randã€Rayã€Michonã€Newellã€Galenã€Dessieã€Lesã€Michonã€Jenelleã€Geoã€Sizã€Shapiroã€Peteã€Calyleã€Seleneã€Allenã€Phoebeã€Goldinã€Kimmoraã€Dakotaã€Slatonã€Lindquistã€Zoeyã€Hariã€Othelloã€Rohitã€Sheldonã€Petraã€Vialeã€Gordonã€Kayeã€Pinkã€Fernyã€Emersonã€Davyã€Briã€Chanã€Juanã€Robertã€Terrenceã€Nathanã€Carlã¨ã€ãã®ä»–多数ã®äººé”ã«ã‚ˆã£ã¦ä½œæˆã•れã¾ã—ãŸã€‚ + Second Life ã¯ã€Philip, Tessa, Andrew, Cory, Ian, James, Phoenix, Ryan, Haney, Dan, Char, Ben, John, Tanya, Eddie, Richard, Mitch, Doug, Eric, Frank, Bruce, Aaron, Peter, Alice, Charlie, Debra, Eileen, Helen, Janet, Steffan, Steve, Tom, Mark, Hunter, Xenon, Burgess, Bill, Jim, Lee, Hamlet, Daniel, Jeff, Todd, Sarah, Tim, Stephanie, Colin, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Jack, Vektor, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Jesse, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Yuko, Makiko, Thomas, Harry, Seth, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Brad, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, Beez, Milo, Hermia, Red, Thrax, Gulliver, Joe, Sally, Paul, Jose, Rejean, Dore, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, Dustin, George, Del, Matthew, Cat, Jacqui, Adrian, Viola, Alfred, Noel, Irfan, Yool, Rika, Jane, Frontier, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Jeremy, JP, Jake, Anthony, Maurice, Madhavi, Leopard, Kyle, Joon, Bert, Belinda, Jon, Kristi, Bridie, Pramod, Socrates, Maria, Aric, Adreanne, Jay, Kari, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Colossus, Zen, BigPapi, Pastrami, Kurz, Mani, Neuro, Mel, Sardonyx, MJ, Rowan, Sgt, Elvis, Samuel, Leo, Bryan, Niko, Austin, Soft, Poppy, Rachel, Aki, Banzai, Alexa, Sue, Bender, CG, Angelo, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Rothman, Niall, Marin, Allison, Katie, Dawn, Dusty, Katt, Judy, Andrea, Ambroff, Infinity, Rico, Gail, Kalpana, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Maestro, Simone, Yang, T, Shannon, Nelson, Khanh, Scott, Courtney, Charlene, Quixote, Susan, Zed, Amanda, Katelin, Enkidu, Roxie, Esbee, JoRoan, Scarlet, Tay, Kevin, Wolfgang, Johnny, Ray, Andren, Merov, Bob, Rand, Howard, Callen, Heff, Galen, Newell, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl, Ashley, JessieAnn, Huseby, Karina, Paris, Kurt, Rick, Lis, Kotler, Theeba, Lynx, Murphy, Doten, Taka, Norm, Jillian, Marcus, Mae, Novack, Esther, Perry, Dana, Ducot, Javier, Porter, Madison, Gecko, Dough, JR, Gisele, Crimp, Norie, Arch, Kimi, Fisher, Barbara, Jason, Peggy, Bernard, Jules, Leroy, Eva, Khederian, Campbell, Vogt, Masido, Karel, Torres, Lo, Breezer, Delby, Rountree, Anna, Servus, Rue, Itiaes, Chuck, Luna, Novella, Zaza, Wen, Gino, Lex, Cassandra, Limey, Nancy, Anukul, Silver, Brodesky, Jinsai, Squid, Gez, Rakesh, Ladan, Edelman, Marcet, Squire, Tatem, Tony, Jerm, Tia, Falcon, BK, Tiggs, Driscoll, Bacon, Timothee, Cru, Carmilla, Coyot, Webb, Kazu, Rudas, LJ, Sea, Ali Wallace, Bewest, Pup, Drub, Dragon, Inoshiro, Byron, Rhett, Xandix, Aimee, Fredrik, Thor, Teddy, Baron, Nelly, Ghengis, Epic, Eli, Stone, Grapes, Irie, Prep, Scobu, Valerie, Alain ãã®ä»–å¤§å‹¢ã®æ–¹ã€…ã«ã‚ˆã£ã¦æä¾›ã•れã¦ã„ã¾ã™ã€‚ - ã“ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ã“れã¾ã§ã§æœ€é«˜ã®ã‚‚ã®ã«ãªã‚‹ã‚ˆã†ã”å”力をã„ãŸã ã„ãŸä»¥ä¸‹ã®ä½äººã®çš†æ§˜ã«æ·±ã感è¬ã„ãŸã—ã¾ã™ã€‚ able whitman, Adeon Writer, adonaira aabye, Aeron Kohime, Agathos Frascati, Aimee Trescothick, Aleric Inglewood, Alissa Sabre, Aminom Marvin, Angela Talamasca, Aralara Rajal, Armin Weatherwax, Ashrilyn Hayashida, Athanasius Skytower, Aura Dirval, Barney Boomslang, Biancaluce Robbiani, Biker Offcourse, Borg Capalini, Bulli Schumann, catherine pfeffer, Chalice Yao, Corre Porta, Court Goodman, Cummere Mayo, Dale Innis, Darien Caldwell, Darjeeling Schoonhoven, Daten Thielt, dimentox travanti, Dirk Talamasca, Drew Dwi, Duckless Vandyke, Elanthius Flagstaff, Electro Burnstein, emiley tomsen, Escort DeFarge, Eva Rau, Ezian Ecksol, Fire Centaur, Fluf Fredriksson, Francisco Koolhoven, Frontera Thor, Frungi Stastny, Gally Young, gearsawe stonecutter, Gigs Taggart, Gordon Wendt, Gudmund Shepherd, Gypsy Paz, Harleen Gretzky, Henri Beauchamp, Inma Rau, Irene Muni, Iskar Ariantho, Jacek Antonelli, JB Kraft, Jessicka Graves, Joeseph Albanese, Joshua Philgarlic, Khyota Wulluf, kirstenlee Cinquetti, Latif Khalifa, Lex Neva, Lilibeth Andree, Lisa Lowe, Lunita Savira, Loosey Demonia, lum pfohl, Marcos Fonzarelli, MartinRJ Fayray, Marusame Arai, Matthew Dowd, Maya Remblai, McCabe Maxsted, Meghan Dench, Melchoir Tokhes, Menos Short, Michelle2 Zenovka, Mimika Oh, Minerva Memel, Mm Alder, Ochi Wolfe, Omei Turnbull, Pesho Replacement, Phantom Ninetails, phoenixflames kukulcan, Polo Gufler, prez pessoa, princess niven, Prokofy Neva, Qie Niangao, Rem Beattie, RodneyLee Jessop, Saijanai Kuhn, Seg Baphomet, Sergen Davies, Shirley Marquez, SignpostMarv Martin, Sindy Tsure, Sira Arbizu, Skips Jigsaw, Sougent Harrop, Spritely Pixel, Squirrel Wood, StarSong Bright, Subversive Writer, Sugarcult Dagger, Sylumm Grigorovich, Tammy Nowotny, Tanooki Darkes, Tayra Dagostino, Theoretical Chemistry, Thickbrick Sleaford, valerie rosewood, Vex Streeter, Vixen Heron, Whoops Babii, Winter Ventura, Xiki Luik, Yann Dufaux, Yina Yao, Yukinoroh Kamachi, Zolute Infinity, Zwagoth Klaar +ç¾åœ¨æœ€ã‚‚優れãŸãƒãƒ¼ã‚¸ãƒ§ãƒ³ã¨ãªã‚‹ã‚ˆã†ã”å”力ã„ãŸã ã„ãŸæ¬¡ã®ä½äººã®çš†æ§˜ã«æ·±ã感è¬ã„ãŸã—ã¾ã™ã€‚ Drew Dwi, Zai Lynch, Latif Khalifa, Ellla McMahon, Harleen Gretzky, Squirrel Wood, Malarthi Behemoth, Dante Tucker, Buckaroo Mu, Eddi Decosta, Dirk, Talamasca, Torben Trautman, Irene Muni, Lilly Zenovka, Vick Forcella, Sasy Scarborough, Gentle Welinder, Elric Anatine, Techwolf Lupindo, Dusan Writer, WolfPup Lowenhar, Marianne McCann, Fiachra Lach, Sitearm Madonna, Sudane Erato, Sahkolihaa Contepomi, Sachi Vixen, Questar Utu, Dimitrio Lewis, Matto Destiny, Scrim Pinion, Radio Signals, Psi Merlin, Pixel Gausman, Mel Vanbeeck, Laurent Bechir, Lamorna Proctor, Lares Carter, Gwyneth Llewelyn, Hydra Shaftoe, Holger Gilruth, Gentle Heron, Carla Broek, Boroondas Gupte, Fury Rosewood, Flower Ducatillon, Colpo Wexler, gwampa Lomu, Borg Capalini, Beansy Twine, Ardy Lay, , 45ms Zhong, Adeon Writer, Aeonix Aeon, Ai Austin, Aiko Ying, Alexandrea Fride, Alliez Mysterio, Annie Milestone, Annika Genezzia, Ansariel Hiller, ArminasX Saiman, Arya Braveheart, Asaeda Meltingdots, Asturkon Jua, Avallyn Oakleaf, Avatar Quinzet, BabyA Littlething, Bacchus Ireto, Bazaar, Riva, Benjamin Bigdipper, Beth Walcher, Bezilon Kasei, Biancaluce Robbiani, Bill Walach, blakopal Galicia, Blitzckreed Levenque, Bryn Oh, Callipygian Christensen, Cap Carver, Carr Arbenlow, Chantal Harvey, Charles Courtois, Charlie Sazaland, Cherry Cheevers, ChickyBabes Zuzu, Christopher Organiser, Ciaran Laval, Clara Young, Celierra Darling, Corinne Helendale, Corro Moseley, Coughdrop Littlething, Darien Caldwell, Dartagan Shepherd, Debs Regent, Decro Schmooz, Denim Kamachi, DiJodi Dubratt, Dil Spitz, Edgware Marker, Egehan Dryke, Emma Portilo, Emmie Fairymeadow, Evangelista Emerald, Faelon Swordthain, Frenchimmo Sabra, Gaberoonie Zanzibar, Ganymedes Costagravas, Gene Frostbite, GeneJ Composer, Giggles Littlebird, Grady Echegaray, Guni Greenstein, Gypsy Tripsa, Hackshaven Harford, Ham Rambler, Han Shuffle, Hanglow Short, Hatzfeld Runo, herina Bode, Horatio Freund, Hypatia Callisto, Hypatia Pickens, Identity Euler, Imnotgoing Sideways, Innula Zenovka, Iyoba Tarantal, Jack Abraham, Jagga Meredith, Jennifer Boyle, Jeremy Marquez, Jessica Qin, Jinx Nordberg, Jo Bernandes, Jocial Sonnenkern, Joel Savard, Jondan Lundquist, Josef Munster, Josette Windlow, Juilan Tripsa, Juro Kothari, Justin RiversRunRed, Kagehi Kohn, Kaimen Takahe, Keklily Longfall, Ken Lavender, Kestral Karas, Khisme Nitely, Kimar Coba, Kithrak Kirkorian, Kitty Barnett, Kolor Fall, Komiko Okamoto, Korvel Noh, Larry Pixel, Leal Choche, len Starship, Lenae Munz, Lexi Frua, Lillie Cordeaux, Lizzy Macarthur, LSL Scientist, Luban Yiyuan, Luc Starsider, Maccus McCullough, Madison Blanc, Maggie Darwin, Mallory Destiny, Manx Wharton, Marc Claridge, Marc2 Sands, Matthew Anthony, Maxim RiversRunRed, Medhue Simoni, Melinda Latynina, Mencius Watts, Michi Lumin, Midian Farspire, Miles Glaz, Mindy Mathy, Mitch Wagner, Mo Hax, Mourna Biziou, Nao Noe, naofan Teardrop, Naomah Beaumont, Nathiel Siamendes, Nber Medici, Neko Link, Netpat Igaly, Neutron Chesnokov, Newfie Pendragon, Nicholai Laviscu, Nick Rhodes, Nicoladie Gymnast, Ollie Kubrick, Orenj Marat, Orion Delphis, Oryx Tempel, Parvati Silverweb, PeterPunk Mooney, Pixel Scientist, Pounce Teazle, Professor Noarlunga, Quantum Destiny, Quicksilver Hermes, Ralf Setsuko, RAT Quan, RedMokum Bravin, Revolution Perenti, Rezit Sideways, Rich Grainger, Rosco Teardrop, Rose Evans, Rudee Voom, RufusTT Horsefly, Saii Hallard, SaintLEOlions Zimer, Samm Larkham, Satanello Miami, SexySteven Morrisey, Sheet Spotter, Shnurui Troughton, sicarius Thorne, Sicarius Toxx, Sini Nubalo, SLB Wirefly, snowy Sidran, Soupa Segura, ST Mensing, Starshine Halasy, Stickman Ingmann, Synystyr Texan, Takeda Terrawyng, Tali Rosca, Templar Merlin, Tezcatlipoca Bisiani, Tiel Stonecutter, Tony Kembia, TouchaHoney Perhaps, Trey Reanimator, TriloByte Zanzibar, Trinity Dechou, Trinity Dejavu, Unlikely Quintessa, UsikuFarasi Kanarik, Veritas Raymaker, Vex Streeter, Viaticus Speculaas, Villain Baroque, Vixie Durant, Void Singer, Watty Berkson, Westley Schridde, Westley Streeter, Whimsy Winx, Winter Ventura, Wundur Primbee, xstorm Radek, YongYong Francois, Zak Westminster, Zana Kohime, Zaren Alexander, Zeja Pyle, ZenMondo Wormser, Zoex Flanagan ãã®ä»–å¤§å‹¢ã®æ–¹ã€…。 - ビジãƒã‚¹ã§æˆåŠŸã™ã‚‹ã«ã¯ã€å‹‡æ°—ã‚’æŒã£ã¦ã€èª°ã‚ˆã‚Šã‚‚å…ˆã«ã€äººã¨é•ã£ãŸã“ã¨ã‚’ã™ã‚‹ã“ã¨ã 。 --Henry Marchant + +「努力ã¯ç¶šãã€‚ç›®æ¨™ã¯æŒç¶šã™ã‚‹ã€‚å¸Œæœ›ã¯æ®‹ã•れã¦ã„ã‚‹ã€‚å¤¢ã¯æ±ºã—ã¦æ¶ˆãˆãªã„。〠- エドワード・ケãƒãƒ‡ã‚£ </text_editor> </panel> <panel label="ライセンス" name="licenses_panel"> @@ -61,7 +62,8 @@ Vivox ãƒãƒ¼ã‚¸ãƒ§ãƒ³ï¼š [VIVOX_VERSION] FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org). GL Copyright (C) 1999-2004 Brian Paul. Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited. - jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW) + jpeg2000 Copyright (C) 2001, David Taubman, The University of New South + Wales (UNSW) jpeglib Copyright (C) 1991-1998, Thomas G. Lane. ogg/vorbis Copyright (C) 2001, Xiphophorus OpenSSL Copyright (C) 1998-2002 The OpenSSL Project. diff --git a/indra/newview/skins/default/xui/ja/floater_about_land.xml b/indra/newview/skins/default/xui/ja/floater_about_land.xml index 71a38391cd..2f5065c05f 100644 --- a/indra/newview/skins/default/xui/ja/floater_about_land.xml +++ b/indra/newview/skins/default/xui/ja/floater_about_land.xml @@ -1,5 +1,14 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="floaterland" title="åœŸåœ°æƒ…å ±"> + <floater.string name="maturity_icon_general"> + "Parcel_PG_Dark" + </floater.string> + <floater.string name="maturity_icon_moderate"> + "Parcel_M_Dark" + </floater.string> + <floater.string name="maturity_icon_adult"> + "Parcel_R_Dark" + </floater.string> <floater.string name="Minutes"> [MINUTES] 分 </floater.string> @@ -15,7 +24,7 @@ <tab_container name="landtab"> <panel label="一般" name="land_general_panel"> <panel.string name="new users only"> - æ–°è¦ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®ã¿ + æ–°è¦ä½äººå°‚用 </panel.string> <panel.string name="anyone"> 誰ã§ã‚‚ @@ -27,13 +36,13 @@ [AREA] 平方メートル </panel.string> <panel.string name="auction_id_text"> - オークションID: [ID] + オークション ID: [ID] </panel.string> <panel.string name="need_tier_to_modify"> ã“ã®åœŸåœ°ã‚’ä¿®æ£å¤‰æ›´ã™ã‚‹ã«ã¯ã€è³¼å…¥ã‚’承èªã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ </panel.string> <panel.string name="group_owned_text"> - (グループ所有) + (グループ所有) </panel.string> <panel.string name="profile_text"> プãƒãƒ•ィール @@ -42,17 +51,20 @@ æƒ…å ± </panel.string> <panel.string name="public_text"> - (公共) + (公共) </panel.string> <panel.string name="none_text"> (ãªã—) </panel.string> <panel.string name="sale_pending_text"> - (購入審査ä¸) + (購入審査ä¸ï¼‰ </panel.string> <panel.string name="no_selection_text"> 区画ãŒé¸æŠžã•れã¦ã„ã¾ã›ã‚“。 </panel.string> + <panel.string name="time_stamp_template"> + [year,datetime,local] [mth,datetime,local] [day,datetime,local] [wkday,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] + </panel.string> <text name="Name:"> åå‰ï¼š </text> @@ -73,7 +85,7 @@ Adult </text> <text name="Owner:"> - オーナー: + 所有者: </text> <text name="OwnerText"> Leyla Linden @@ -85,9 +97,9 @@ Leyla Linden </text> <button label="è¨å®š" label_selected="è¨å®š..." name="Set..."/> - <check_box label="グループã¸ã®è²æ¸¡ã‚’許å¯" name="check deed" tool_tip="グループã®ã‚ªãƒ•ィサーã¯ã“ã®åœŸåœ°ã‚’グループã«è²æ¸¡ã§ãã¾ã™ã€‚ãã†ã™ã‚‹ã¨ã‚°ãƒ«ãƒ¼ãƒ—ã®åœŸåœ°å‰²ã‚Šå½“ã¦ã«ã‚ˆã£ã¦ã‚µãƒãƒ¼ãƒˆã•れã¾ã™ã€‚"/> - <button label="è²æ¸¡" label_selected="è²æ¸¡..." name="Deed..." tool_tip="é¸æŠžã•れãŸã‚°ãƒ«ãƒ¼ãƒ—ã®ã‚ªãƒ•ィサーã§ã‚ã‚‹ã¨ãã®ã¿ã€åœŸåœ°ã‚’è²æ¸¡ã§ãã¾ã™ã€‚"/> - <check_box label="オーナーãŒè²æ¸¡ã¨å…±ã«å¯„付" name="check contrib" tool_tip="土地ãŒã‚°ãƒ«ãƒ¼ãƒ—ã«è²æ¸¡ã•れるã¨ãã€å‰ã®æ‰€æœ‰è€…ã¯è²æ¸¡ãŒæˆç«‹ã™ã‚‹ã‚ˆã†ã€å分ãªåœŸåœ°ã‚’寄付ã—ã¾ã™ã€‚"/> + <check_box label="グループã¸ã®è²æ¸¡ã‚’許å¯" name="check deed" tool_tip="グループã®ã‚ªãƒ•ィサーã¯ã“ã®åœŸåœ°ã‚’グループã«è²æ¸¡ã§ãã¾ã™ã€‚グループã®åœŸåœ°å‰²ã‚Šå½“ã¦ã«ã‚ˆã£ã¦ã‚µãƒãƒ¼ãƒˆã•れã¾ã™ã€‚"/> + <button label="è²æ¸¡" label_selected="è²æ¸¡..." name="Deed..." tool_tip="é¸æŠžã—ãŸã‚°ãƒ«ãƒ¼ãƒ—ã®ã‚ªãƒ•ィサーã®ã¿ã€åœŸåœ°ã‚’è²æ¸¡ã§ãã¾ã™ã€‚"/> + <check_box label="所有者ãŒè²æ¸¡ã¨å…±ã«å¯„付" name="check contrib" tool_tip="土地ãŒã‚°ãƒ«ãƒ¼ãƒ—ã«è²æ¸¡ã•れるã¨ãã€å‰ã®æ‰€æœ‰è€…ã¯è²æ¸¡ãŒæˆç«‹ã™ã‚‹ã‚ˆã†ã€å分ãªåœŸåœ°ã‚’寄付ã—ã¾ã™ã€‚"/> <text name="For Sale:"> è²©å£²ã®æœ‰ç„¡ï¼š </text> @@ -95,9 +107,9 @@ 販売対象外 </text> <text name="For Sale: Price L$[PRICE]."> - ä¾¡æ ¼ï¼š L$[PRICE] (L$[PRICE_PER_SQM]/平方メートル) + ä¾¡æ ¼ï¼š L$ [PRICE] (L$ [PRICE_PER_SQM] / 平方メートル) </text> - <button label="土地を売る" label_selected="土地を販売..." name="Sell Land..."/> + <button label="土地を売る" label_selected="土地を販売..." name="Sell Land..." width="100"/> <text name="For sale to"> 販売先:[BUYER] </text> @@ -107,7 +119,7 @@ <text name="Selling with no objects in parcel."> オブジェクトã¯è²©å£²ã—ãªã„ </text> - <button label="土地販売ã®å–り消ã—" label_selected="土地販売ã®å–り消ã—" name="Cancel Land Sale"/> + <button label="土地販売ã®å–り消ã—" label_selected="土地販売ã®å–り消ã—" name="Cancel Land Sale" width="100"/> <text name="Claimed:"> å–得日時: </text> @@ -126,26 +138,26 @@ <text name="DwellText"> 誤 </text> - <button label="土地ã®è³¼å…¥" label_selected="土地を購入..." left="130" name="Buy Land..." width="125"/> - <button label="ã‚¹ã‚¯ãƒªãƒ—ãƒˆæƒ…å ±" name="Scripts..."/> + <button label="土地ã®è³¼å…¥" label_selected="土地を購入..." left="130" name="Buy Land..." width="100"/> + <button label="ã‚¹ã‚¯ãƒªãƒ—ãƒˆæƒ…å ±" name="Scripts..." width="100"/> <button label="グループã«è³¼å…¥" label_selected="グループ用ã«è³¼å…¥..." name="Buy For Group..."/> - <button label="å…¥å ´è¨±å¯ã‚’購入" label_selected="å…¥å ´è¨±å¯ã‚’購入..." left="130" name="Buy Pass..." tool_tip="ã“ã®åœŸåœ°ã¸ã®ä¸€æ™‚çš„ãªã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯ã—ã¾ã™ã€‚" width="125"/> + <button label="å…¥å ´è¨±å¯ã‚’購入" label_selected="å…¥å ´è¨±å¯ã‚’購入..." left="130" name="Buy Pass..." tool_tip="ã“ã®åœŸåœ°ã¸ã®ä¸€æ™‚çš„ãªã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯ã—ã¾ã™ã€‚" width="100"/> <button label="åœŸåœ°ã®æ”¾æ£„" label_selected="土地を放棄..." name="Abandon Land..."/> <button label="土地をå–り戻ã™" label_selected="土地ã®è¿”é‚„ã‚’è¦æ±‚..." name="Reclaim Land..."/> - <button label="リンデンセール" label_selected="Lindenセール..." name="Linden Sale..." tool_tip="åœŸåœ°ãŒæ‰€æœ‰ã•れã¦ãŠã‚Šã€ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ãŒè¨å®šã•れã¦ã„ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚オークションã®å¯¾è±¡ã«ãªã£ã¦ã„ãªã„ã“ã¨ã‚‚å¿…è¦æ¡ä»¶ã§ã™ã€‚"/> + <button label="リンデンセール" label_selected="Linden セール..." name="Linden Sale..." tool_tip="åœŸåœ°ãŒæ‰€æœ‰ã•れã¦ãŠã‚Šã€ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ãŒè¨å®šã•れã¦ã„ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚オークションã®å¯¾è±¡ã«ãªã£ã¦ã„ãªã„ã“ã¨ã‚‚å¿…è¦æ¡ä»¶ã§ã™ã€‚"/> </panel> <panel label="約款" name="land_covenant_panel"> <panel.string name="can_resell"> - ã“ã®åœ°åŸŸã§è³¼å…¥ã—ãŸåœŸåœ°ã¯ã€å†è²©ã§ãã¾ã™ã€‚ + ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ã§è³¼å…¥ã—ãŸåœŸåœ°ã¯ã€å†è²©ã§ãã¾ã™ã€‚ </panel.string> <panel.string name="can_not_resell"> - ã“ã®åœ°åŸŸã§è³¼å…¥ã—ãŸåœŸåœ°ã¯ã€å†è²©ã§ããªã„ã“ã¨ãŒã‚りã¾ã™ã€‚ + ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ã§è³¼å…¥ã—ãŸåœŸåœ°ã¯ã€å†è²©ã§ããªã„ã“ã¨ãŒã‚りã¾ã™ã€‚ </panel.string> <panel.string name="can_change"> - ã“ã®åœ°åŸŸã§è³¼å…¥ã—ãŸåœŸåœ°ã¯ã€çµ±åˆã¾ãŸã¯å†åˆ†å‰²ã§ãã¾ã™ã€‚ + ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ã§è³¼å…¥ã—ãŸåœŸåœ°ã¯ã€çµ±åˆã¾ãŸã¯å†åˆ†å‰²ã§ãã¾ã™ã€‚ </panel.string> <panel.string name="can_not_change"> - ã“ã®åœ°åŸŸã§è³¼å…¥ã—ãŸåœŸåœ°ã¯ã€çµ±åˆï¼å†åˆ†å‰²ã§ããªã„ã“ã¨ãŒ + ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ã§è³¼å…¥ã—ãŸåœŸåœ°ã¯ã€çµ±åˆãƒ»å†åˆ†å‰²ã§ããªã„ã“ã¨ãŒã‚りã¾ã™ã€‚ ã‚りã¾ã™ã€‚ </panel.string> <text font="SansSerifLarge" name="estate_section_lbl"> @@ -155,7 +167,7 @@ メインランド </text> <text name="estate_owner_lbl"> - オーナー: + 所有者: </text> <text name="estate_owner_text"> (ãªã—) @@ -188,31 +200,30 @@ å†è²©ï¼š </text> <text name="resellable_clause"> - ã“ã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã«ã‚る土地ã¯å†è²©ã§ãã¾ã›ã‚“。 + ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ã«ã‚る土地ã¯å†è²©ã§ãã¾ã›ã‚“。 </text> <text name="changeable_lbl"> å†åˆ†å‰²ï¼š </text> <text name="changeable_clause"> - ã“ã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã«ã‚る土地ã¯çµ±åˆã¾ãŸã¯åˆ†å‰²ãŒã§ã -ã¾ã›ã‚“。 + ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ã«ã‚る土地ã¯çµ±åˆã¾ãŸã¯åˆ†å‰²ãŒã§ããªã„ã“ã¨ãŒã‚りã¾ã™ã€‚ </text> </panel> <panel label="オブジェクト" name="land_objects_panel"> <panel.string left="200" name="objects_available_text"> - [MAX]ã®å†…[COUNT]([AVAILABLE]利用å¯èƒ½ï¼‰ + [MAX] ã®å†… [COUNT]([AVAILABLE] 利用å¯èƒ½ï¼‰ </panel.string> <panel.string left="200" name="objects_deleted_text"> - [MAX]ã®å†…[COUNT]([DELETED]を削除) + [MAX] ã®å†… [COUNT]([DELETED] を削除) </panel.string> <text name="parcel_object_bonus"> - 地域オブジェクトボーナスè¦å› : [BONUS] + オブジェクトボーナス: [BONUS] </text> <text name="Simulator primitive usage:" width="500"> プリム使用状æ³ï¼š </text> <text left="200" name="objects_available"> - [MAX]ã®å†…[COUNT]([AVAILABLE]利用å¯èƒ½ï¼‰ + [MAX] ã®å†… [COUNT] ([AVAILABLE] 利用å¯èƒ½ï¼‰ </text> <text name="Primitives parcel supports:" width="200"> 区画ã§ã‚µãƒãƒ¼ãƒˆã•れるプリム数: @@ -227,13 +238,13 @@ [COUNT] </text> <text name="Owned by parcel owner:" width="300"> - 区画オーナーã«ã‚ˆã‚‹æ‰€æœ‰ï¼š + åŒºç”»æ‰€æœ‰è€…ã®æ‰€æœ‰ç‰©ï¼š </text> <text left="200" name="owner_objects_text"> [COUNT] </text> <button label="表示" label_selected="表示" name="ShowOwner" right="-145"/> - <button label="è¿”å´" label_selected="è¿”å´..." name="ReturnOwner..." right="-15" tool_tip="オブジェクトをオーナーã«è¿”å´ã—ã¾ã™"/> + <button label="è¿”å´" label_selected="è¿”å´..." name="ReturnOwner..." right="-15" tool_tip="オブジェクトを所有者ã«è¿”å´ã—ã¾ã™"/> <text name="Set to group:"> グループã«è¨å®šï¼š </text> @@ -241,35 +252,35 @@ [COUNT] </text> <button label="表示" label_selected="表示" name="ShowGroup" right="-145"/> - <button label="è¿”å´" label_selected="è¿”å´..." name="ReturnGroup..." right="-15" tool_tip="オブジェクトをオーナーã«è¿”å´ã—ã¾ã™"/> + <button label="è¿”å´" label_selected="è¿”å´..." name="ReturnGroup..." right="-15" tool_tip="オブジェクトを所有者ã«è¿”å´ã—ã¾ã™"/> <text name="Owned by others:"> - 他人ã«ã‚ˆã‚‹æ‰€æœ‰ï¼š + ä»–äººã®æ‰€æœ‰ç‰©ï¼š </text> <text left="200" name="other_objects_text"> [COUNT] </text> <button label="表示" label_selected="表示" name="ShowOther" right="-145"/> - <button label="è¿”å´" label_selected="è¿”å´..." name="ReturnOther..." right="-15" tool_tip="オブジェクトをオーナーã«è¿”å´ã—ã¾ã™"/> + <button label="è¿”å´" label_selected="è¿”å´..." name="ReturnOther..." right="-15" tool_tip="オブジェクトを所有者ã«è¿”å´ã—ã¾ã™"/> <text name="Selected / sat upon:"> - é¸æŠžæ¸ˆã¿ï¼æ±ºå®šæ¸ˆã¿ï¼š + é¸æŠžæ¸ˆã¿ãƒ»æ±ºå®šæ¸ˆã¿ï¼š </text> <text left="200" name="selected_objects_text"> [COUNT] </text> - <text name="Autoreturn" width="500"> - 他人ã®ã‚ªãƒ–ジェクトを自動返å´ï¼ˆåˆ†å˜ä½ã€0ã§è‡ªå‹•è¿”å´ãªã—): + <text name="Autoreturn"> + 他人ã®ã‚ªãƒ–ジェクトを自動返å´ï¼ˆåˆ†å˜ä½ã€0 ã§è‡ªå‹•è¿”å´ãªã—): </text> <line_editor left_delta="5" name="clean other time" right="-80"/> <text name="Object Owners:" width="150"> - オブジェクトã®ã‚ªãƒ¼ãƒŠãƒ¼ï¼š + ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æ‰€æœ‰è€…: </text> - <button label="リスト更新" label_selected="リスト更新" left="146" name="Refresh List" tool_tip="オブジェクトã®ãƒªã‚¹ãƒˆã‚’æ›´æ–°"/> + <button label="リスト更新" label_selected="リスト更新" left="146" name="Refresh List" tool_tip="オブジェクトã®ãƒªã‚¹ãƒˆã‚’æ›´æ–°ã—ã¾ã™"/> <button label="オブジェクトを返å´ã™ã‚‹" label_selected="オブジェクトã®è¿”å´..." left="256" name="Return objects..."/> <name_list label="カウント" name="owner list"> <name_list.columns label="タイプ" name="type"/> <name_list.columns name="online_status"/> <name_list.columns label="åå‰" name="name"/> - <name_list.columns label="カウント" name="count"/> + <name_list.columns label="æ•°" name="count"/> <name_list.columns label="最新" name="mostrecent"/> </name_list> </panel> @@ -278,62 +289,62 @@ ã“ã®åŒºç”»ã‚’æ¤œç´¢çµæžœã«è¡¨ç¤ºã™ã‚‹ </panel.string> <panel.string name="search_disabled_small_tooltip"> - 区画é¢ç©ãŒ128平方メートルã‹ãれ以下ã®ãŸã‚ã€ã“ã®ã‚ªãƒ—ションã¯ç„¡åйã§ã™ã€‚ + 区画é¢ç©ãŒ 128 平方メートルã‹ãれ以下ã®ãŸã‚ã€ã“ã®ã‚ªãƒ—ションã¯ç„¡åйã§ã™ã€‚ 大ããªåŒºç”»ã®ã¿æ¤œç´¢ã«è¡¨ç¤ºã•ã›ã‚‹ã“ã¨ãŒå¯èƒ½ã§ã™ã€‚ </panel.string> <panel.string name="search_disabled_permissions_tooltip"> ã‚ãªãŸã¯ã“ã®åŒºç”»ã®è¨å®šç·¨é›†ãŒã§ããªã„ãŸã‚ã€ã“ã®ã‚ªãƒ—ションã¯ç„¡åйã§ã™ã€‚ </panel.string> <panel.string name="mature_check_mature"> - 控ãˆã‚コンテンツ + 「Moderateã€ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ </panel.string> <panel.string name="mature_check_adult"> - Adultコンテンツ + 「Adultã€ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ </panel.string> <panel.string name="mature_check_mature_tooltip"> - ã‚ãªãŸã®åŒºç”»æƒ…å ±åŠã³ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯æŽ§ãˆã‚ã¨ã•れã¦ã„ã¾ã™ã€‚ + ã‚ãªãŸã®åŒºç”»æƒ…å ±åŠã³ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯ã€ŒModerateã€ã¨ã•れã¦ã„ã¾ã™ã€‚ </panel.string> <panel.string name="mature_check_adult_tooltip"> - ã‚ãªãŸã®åŒºç”»æƒ…å ±åŠã³ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯Adultã¨ã•れã¦ã„ã¾ã™ã€‚ + ã‚ãªãŸã®åŒºç”»æƒ…å ±åŠã³ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯ã€ŒAdultã€ã¨ã•れã¦ã„ã¾ã™ã€‚ </panel.string> <panel.string name="landing_point_none"> (ãªã—) </panel.string> <panel.string name="push_restrict_text"> - ãƒ—ãƒƒã‚·ãƒ³ã‚°ã‚’åˆ¶é™ + ãƒ—ãƒƒã‚·ãƒ¥ç¦æ¢ </panel.string> <panel.string name="push_restrict_region_text"> - ãƒ—ãƒƒã‚·ãƒ³ã‚°ã‚’åˆ¶é™ (地域優先) + ãƒ—ãƒƒã‚·ãƒ¥ç¦æ¢ (地域è¨å®šå„ªå…ˆï¼‰ </panel.string> <text name="allow_label"> ä»–ã®ä½äººã¸ã®è¨±å¯ï¼š </text> <check_box label="地形を編集" name="edit land check" tool_tip="ãƒã‚§ãƒƒã‚¯ã‚’入れるã¨ã€ä»–人ãŒã‚ãªãŸã®åœŸåœ°ã®åœ°å½¢ç·¨é›†ã‚’行ã†ã“ã¨ãŒå¯èƒ½ã¨ãªã‚Šã¾ã™ã€‚ã“ã®ã‚ªãƒ—ションã®ãƒã‚§ãƒƒã‚¯ã‚’外ã—ã¦ãŠãã“ã¨ã‚’ãŠã™ã™ã‚ã—ã¾ã™ã€‚外ã—ãŸçŠ¶æ…‹ã§ã‚ãªãŸã®åœŸåœ°ã®åœ°å½¢ç·¨é›†ãŒå¯èƒ½ã§ã™ã€‚"/> <check_box label="飛行" name="check fly" tool_tip="ãƒã‚§ãƒƒã‚¯ã‚’入れるã¨ã“ã®åœŸåœ°ã§ã®é£›è¡ŒãŒå¯èƒ½ã¨ãªã‚Šã¾ã™ã€‚ãƒã‚§ãƒƒã‚¯ã‚’外ã™ã¨åœŸåœ°ã«å…¥ã‚‹éš›ã¨é€šã‚ŠéŽãŽã‚‹ã¨ãã®ã¿é£›è¡Œå¯èƒ½ã¨ãªã‚Šã¾ã™ã€‚"/> - <text left="138" name="allow_label2" width="144"> + <text name="allow_label2"> 制作: </text> - <check_box label="全員" left="280" name="edit objects check"/> - <check_box label="グループ" left="380" name="edit group objects check"/> - <text left="138" name="allow_label3" width="144"> + <check_box label="全員" name="edit objects check"/> + <check_box label="グループ" name="edit group objects check"/> + <text name="allow_label3"> オブジェクトã®é€²å…¥ï¼š </text> - <check_box label="全員" left="280" name="all object entry check"/> - <check_box label="グループ" left="380" name="group object entry check"/> - <text left="138" name="allow_label4" width="144"> + <check_box label="全員" name="all object entry check"/> + <check_box label="グループ" name="group object entry check"/> + <text name="allow_label4"> スクリプトã®å®Ÿè¡Œï¼š </text> - <check_box label="全員" left="280" name="check other scripts"/> - <check_box label="グループ" left="380" name="check group scripts"/> + <check_box label="全員" name="check other scripts"/> + <check_box label="グループ" name="check group scripts"/> <text name="land_options_label"> 土地オプション: </text> <check_box label="安全(ダメージãªã—)" name="check safe" tool_tip="ãƒã‚§ãƒƒã‚¯ã‚’入れるã¨ã“ã®åœŸåœ°ã§ã®ãƒ€ãƒ¡ãƒ¼ã‚¸ã‚³ãƒ³ãƒãƒƒãƒˆãŒç„¡åйã«ãªã‚Šã€ã€Œå®‰å…¨ã€ã«è¨å®šã•れã¾ã™ã€‚ ãƒã‚§ãƒƒã‚¯ã‚’外ã™ã¨ãƒ€ãƒ¡ãƒ¼ã‚¸ã‚³ãƒ³ãƒãƒƒãƒˆãŒæœ‰åйã«ãªã‚Šã¾ã™ã€‚"/> - <check_box label="プッシングを制é™" name="PushRestrictCheck" tool_tip="スクリプトã«ã‚ˆã‚‹ãƒ—ッシングを制é™ã—ã¾ã™ã€‚ ã“ã®ã‚ªãƒ—ã‚·ãƒ§ãƒ³ã‚’é¸æŠžã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šã€ã‚ãªãŸã®åœŸåœ°ã§ã®ç ´å£Šçš„行動を妨ã’ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"/> - <check_box label="検索ã«åŒºç”»ã‚’表示(週 L$30)" name="ShowDirectoryCheck" tool_tip="æ¤œç´¢çµæžœã§ã“ã®åŒºç”»ã‚’表示ã•ã›ã‚‹"/> + <check_box label="ãƒ—ãƒƒã‚·ãƒ¥ç¦æ¢" name="PushRestrictCheck" tool_tip="スクリプトã«ã‚ˆã‚‹ãƒ—ãƒƒã‚·ãƒ¥ã‚’ç¦æ¢ã—ã¾ã™ã€‚ ã“ã®ã‚ªãƒ—ã‚·ãƒ§ãƒ³ã‚’é¸æŠžã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šã€ã‚ãªãŸã®åœŸåœ°ã§ã®ç ´å£Šçš„行動を防ãã“ã¨ãŒã§ãã¾ã™ã€‚"/> + <check_box label="検索ã«åŒºç”»ã‚’表示(週 L$ 30)" name="ShowDirectoryCheck" tool_tip="ã“ã®åŒºç”»ã‚’æ¤œç´¢çµæžœã«è¡¨ç¤ºã—ã¾ã™"/> <combo_box name="land category with adult"> <combo_box.item label="全カテゴリ" name="item0"/> - <combo_box.item label="Linden所在地" name="item1"/> + <combo_box.item label="Linden 所在地" name="item1"/> <combo_box.item label="Adult" name="item2"/> <combo_box.item label="アートã¨ã‚«ãƒ«ãƒãƒ£ãƒ¼" name="item3"/> <combo_box.item label="ビジãƒã‚¹" name="item4"/> @@ -347,8 +358,8 @@ <combo_box.item label="ãã®ä»–" name="item12"/> </combo_box> <combo_box name="land category"> - <combo_box.item label="全カテゴリー" name="item0"/> - <combo_box.item label="Linden所在地" name="item1"/> + <combo_box.item label="全カテゴリ" name="item0"/> + <combo_box.item label="Linden 所在地" name="item1"/> <combo_box.item label="アート&カルãƒãƒ£ãƒ¼" name="item3"/> <combo_box.item label="ビジãƒã‚¹" name="item4"/> <combo_box.item label="教育的" name="item5"/> @@ -360,18 +371,18 @@ <combo_box.item label="ショッピング" name="item11"/> <combo_box.item label="ãã®ä»–" name="item12"/> </combo_box> - <check_box label="控ãˆã‚コンテンツ" name="MatureCheck" tool_tip=""/> + <check_box label="「Moderateã€ã‚³ãƒ³ãƒ†ãƒ³ãƒ„" name="MatureCheck" tool_tip=""/> <text name="Snapshot:"> スナップショット: </text> - <texture_picker label="" left="116" name="snapshot_ctrl" tool_tip="写真をクリックã—ã¦é¸æŠž"/> + <texture_picker label="" name="snapshot_ctrl" tool_tip="写真をクリックã—ã¦é¸æŠž"/> <text name="landing_point"> ç€åœ°ç‚¹: [LANDING] </text> <button label="è¨å®š" label_selected="è¨å®š" name="Set" tool_tip="訪å•者ã®ç€åœ°ç‚¹ã®è¨å®šã‚’行ã„ã¾ã™ã€‚ã“ã®åŒºç”»å†…ã«ç«‹ã£ã¦è¡Œã£ã¦ãã ã•ã„。"/> <button label="クリア" label_selected="クリア" name="Clear" tool_tip="ç€åœ°ç‚¹ã‚’クリア"/> <text name="Teleport Routing: "> - テレãƒãƒ¼ãƒˆåˆ¶é™ï¼š + テレãƒãƒ¼ãƒˆçµŒè·¯ï¼š </text> <combo_box name="landing type" tool_tip="テレãƒãƒ¼ãƒˆçµŒè·¯ -- ã‚ãªãŸã®åœŸåœ°ã¸ã®ãƒ†ãƒ¬ãƒãƒ¼ãƒˆçµŒè·¯ã‚’é¸æŠž"> <combo_box.item label="ä¸å¯" name="Blocked"/> @@ -383,33 +394,29 @@ <text name="with media:"> 種類: </text> - <combo_box name="media type" tool_tip="URL ãŒå‹•ç”»ã€ã‚¦ã‚§ãƒ–・ページã€ãã®ä»–ã®ãƒ¡ãƒ‡ã‚£ã‚¢ã®å ´åˆã«æŒ‡å®šã—ã¾ã™"/> + <combo_box name="media type" tool_tip="URL ãŒå‹•ç”»ã€Web ページã€ãã®ä»–ã®ãƒ¡ãƒ‡ã‚£ã‚¢ã‹ã‚’指定ã—ã¾ã™"/> <text name="at URL:"> ホームページ: </text> - <button label="è¨å®š" label_selected="è¨å®š..." name="set_media_url"/> - <text name="CurrentURL:"> - ç¾åœ¨ã®ãƒšãƒ¼ã‚¸ï¼š - </text> - <button label="リセット..." label_selected="リセット..." name="reset_media_url" tool_tip="URLã‚’æ›´æ–°"/> + <button label="è¨å®š" name="set_media_url"/> <check_box label="URL ã‚’éžè¡¨ç¤º" name="hide_media_url" tool_tip="ã“ã®ã‚ªãƒ—ションをオンã«ã™ã‚‹ã¨ã€è¨±å¯ãªã—ã§ã“ã®åŒºç”»æƒ…å ±ã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ã„るユーザーã«ã¯ãƒ¡ãƒ‡ã‚£ã‚¢ URL ãŒè¡¨ç¤ºã•れã¾ã›ã‚“。 ã“れ㯠HTML タイプã«ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“ã®ã§ã”注æ„ãã ã•ã„。"/> <text name="Description:"> 説明: </text> - <line_editor name="url_description" tool_tip="ï¼»å†ç”Ÿï¼½/ï¼»ãƒãƒ¼ãƒ‰ï¼½ãƒœã‚¿ãƒ³ã®éš£ã«è¡¨ç¤ºã•れるテã‚スト"/> + <line_editor name="url_description" tool_tip="「å†ç”Ÿã€ã€Œãƒãƒ¼ãƒ‰ã€ãƒœã‚¿ãƒ³ã®éš£ã«è¡¨ç¤ºã•れるテã‚ストã§ã™"/> <text name="Media texture:"> - テクスãƒãƒ£ã®ç½®ãæ›ãˆï¼š + テクスãƒãƒ£ç½®ãæ›ãˆï¼š </text> - <texture_picker label="" name="media texture" tool_tip="写真をクリックã—ã¦é¸æŠž"/> + <texture_picker label="" left="120" name="media texture" tool_tip="写真をクリックã—ã¦é¸æŠž"/> <text name="replace_texture_help" width="290"> - ã“ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ã‚’使用ã™ã‚‹ã‚ªãƒ–ジェクトã®ãƒ—レイをクリックã™ã‚‹ã¨ã€ãƒ ービーや Web ページを表示ã—ã¾ã™ã€‚ テクスãƒãƒ£ã‚’変更ã™ã‚‹ã«ã¯ã‚µãƒ ãƒã‚¤ãƒ«ã‚’é¸æŠžã—ã¦ãã ã•ã„。 + ã“ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ã‚’使用ã™ã‚‹ã‚ªãƒ–ジェクトã®ã€Œå†ç”Ÿã€ã‚’クリックã™ã‚‹ã¨ã€å‹•画や Web ページを表示ã—ã¾ã™ã€‚ テクスãƒãƒ£ã‚’変更ã™ã‚‹ã«ã¯ã‚µãƒ ãƒã‚¤ãƒ«ã‚’é¸æŠžã—ã¦ãã ã•ã„。 </text> - <check_box label="スケールを自動è¨å®š" name="media_auto_scale" tool_tip="ã“ã®ã‚ªãƒ—ションをãƒã‚§ãƒƒã‚¯ã™ã‚‹ã¨ã€ã“ã®åŒºç”»ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®ã‚¹ã‚±ãƒ¼ãƒ«ãŒè‡ªå‹•çš„ã«è¨å®šã•れã¾ã™ã€‚ 動作速度ã¨ç”»è³ªãŒå°‘ã—低下ã™ã‚‹ã“ã¨ãŒã‚りã¾ã™ãŒã€ä»–ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ãƒ¼ã®ã‚¹ã‚±ãƒ¼ãƒªãƒ³ã‚°ã‚„整列ãŒå¿…è¦ã«ãªã‚‹ã“ã¨ã¯ã‚りã¾ã›ã‚“。"/> - <text name="media_size" tool_tip="レンダリングã™ã‚‹ã‚¦ã‚§ãƒ–・メディアã®ã‚µã‚¤ã‚ºã€‚デフォルト㮠0 ã®ã¾ã¾ã«ã—ã¾ã™ã€‚"> + <check_box label="スケールを自動è¨å®š" name="media_auto_scale" tool_tip="ã“ã®ã‚ªãƒ—ションをãƒã‚§ãƒƒã‚¯ã™ã‚‹ã¨ã€ã“ã®åŒºç”»ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®ã‚¹ã‚±ãƒ¼ãƒ«ãŒè‡ªå‹•çš„ã«è¨å®šã•れã¾ã™ã€‚ 動作速度ã¨ç”»è³ªãŒå°‘ã—低下ã™ã‚‹ã“ã¨ãŒã‚りã¾ã™ãŒã€ä»–ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ã®ã‚¹ã‚±ãƒ¼ãƒªãƒ³ã‚°ã‚„整列ãŒå¿…è¦ã«ãªã‚‹ã“ã¨ã¯ã‚りã¾ã›ã‚“。"/> + <text name="media_size" tool_tip="レンダリングã™ã‚‹ Web メディアã®ã‚µã‚¤ã‚ºã§ã™ã€‚デフォルト㮠0 ã®ã¾ã¾ã«ã—ã¾ã™ã€‚"> サイズ: </text> - <spinner name="media_size_width" tool_tip="レンダリングã™ã‚‹ã‚¦ã‚§ãƒ–・メディアã®ã‚µã‚¤ã‚ºã€‚デフォルト㮠0 ã®ã¾ã¾ã«ã—ã¾ã™ã€‚"/> - <spinner name="media_size_height" tool_tip="レンダリングã™ã‚‹ã‚¦ã‚§ãƒ–・メディアã®ã‚µã‚¤ã‚ºã€‚デフォルト㮠0 ã®ã¾ã¾ã«ã—ã¾ã™ã€‚"/> + <spinner name="media_size_width" tool_tip="レンダリングã™ã‚‹ Web メディアã®ã‚µã‚¤ã‚ºã§ã™ã€‚デフォルト㮠0 ã®ã¾ã¾ã«ã—ã¾ã™ã€‚"/> + <spinner name="media_size_height" tool_tip="レンダリングã™ã‚‹ Web メディアã®ã‚µã‚¤ã‚ºã§ã™ã€‚デフォルト㮠0 ã®ã¾ã¾ã«ã—ã¾ã™ã€‚"/> <text name="pixels"> ピクセル </text> @@ -422,35 +429,39 @@ <text name="MusicURL:"> 音楽 URL: </text> + <check_box label="URL ã‚’éžè¡¨ç¤ºã«ã™ã‚‹" name="hide_music_url" tool_tip="ã“ã®ã‚ªãƒ—ションã«ãƒã‚§ãƒƒã‚¯ã‚’入れるã¨ã€æ¨©é™ã®ãªã„人ãŒåŒºç”»æƒ…å ±ã‚’è¦‹ãŸã¨ãã«éŸ³æ¥½ã® URL ãŒéš れã¾ã™ã€‚"/> <text name="Sound:"> サウンド: </text> - <check_box label="ジェスãƒãƒ£ãƒ¼ã¨ã‚ªãƒ–ジェクトã®éŸ³ã‚’ã“ã®åŒºç”»ã ã‘ã«é™å®š" name="check sound local"/> + <check_box label="ジェスãƒãƒ£ãƒ¼ã¨ã‚ªãƒ–ジェクトã®éŸ³ã‚’ã“ã®åŒºç”»ã ã‘ã«é™å®šã™ã‚‹" name="check sound local"/> <text name="Voice settings:"> ボイス: </text> <check_box label="ボイスを有効ã«ã™ã‚‹" name="parcel_enable_voice_channel"/> <check_box label="ボイスを有効ã«ã™ã‚‹ï¼ˆä¸å‹•産è¨å®šï¼‰" name="parcel_enable_voice_channel_is_estate_disabled"/> - <check_box label="ã“ã®åŒºç”»ã§ã®ãƒœã‚¤ã‚¹ä½¿ç”¨ã‚’制é™" name="parcel_enable_voice_channel_parcel"/> + <check_box label="ボイスをã“ã®åŒºç”»ã«é™å®šã™ã‚‹" name="parcel_enable_voice_channel_local"/> </panel> <panel label="アクセス" name="land_access_panel"> <panel.string name="access_estate_defined"> (エステートã«é™å®šï¼‰ </panel.string> + <panel.string name="allow_public_access"> + ãƒ‘ãƒ–ãƒªãƒƒã‚¯ã‚¢ã‚¯ã‚»ã‚¹ã‚’è¨±å¯ ï¼ˆ[MATURITY]) + </panel.string> <panel.string name="estate_override"> - 1ã¤ä»¥ä¸Šã®ã‚ªãƒ—ションãŒã€ä¸å‹•産レベルã§è¨å®šã•れã¦ã„ã¾ã™ã€‚ + 1 ã¤ä»¥ä¸Šã®ã‚ªãƒ—ションãŒã€ä¸å‹•産レベルã§è¨å®šã•れã¦ã„ã¾ã™ã€‚ </panel.string> <text name="Limit access to this parcel to:"> - ã“ã®åŒºç”»ã«ã‚¢ã‚¯ã‚»ã‚¹ + ã“ã®åŒºç”»ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ </text> - <check_box label="ãƒ‘ãƒ–ãƒªãƒƒã‚¯ã‚¢ã‚¯ã‚»ã‚¹ã‚’è¨±å¯ [MATURITY]" name="public_access"/> + <check_box label="パブリックアクセスを許å¯ã™ã‚‹ [MATURITY]" name="public_access"/> <text name="Only Allow"> - 次ã®ä½äººã®ã‚¢ã‚¯ã‚»ã‚¹ç¦æ¢ï¼š + 次ã®ä½äººã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯ï¼š </text> <check_box label="æ”¯æ‰•æƒ…å ±ç™»éŒ²æ¸ˆ [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="未確èªã®ä½äººã®ç«‹å…¥ã‚’ç¦æ¢ã—ã¾ã™ã€‚"/> <check_box label="å¹´é½¢ç¢ºèª [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="年齢確èªã‚’済ã¾ã›ã¦ã„ãªã„ä½äººã®ç«‹å…¥ã‚’ç¦æ¢ã—ã¾ã™ã€‚ 詳ã—ã„æƒ…å ±ã¯ [SUPPORT_SITE] ã‚’ã”覧下ã•ã„。"/> - <check_box label="グループ・アクセスを許å¯ï¼š[GROUP]" name="GroupCheck" tool_tip="[一般]タブã§ã€ã‚°ãƒ«ãƒ¼ãƒ—ã‚’é¸æŠžã—ã¦ãã ã•ã„。"/> - <check_box label="å…¥å ´è¨±å¯ã‚’販売:" name="PassCheck" tool_tip="ã“ã®åŒºç”»ã¸ã®ä¸€æ™‚çš„ãªã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯"/> + <check_box label="グループã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯ï¼š[GROUP]" name="GroupCheck" tool_tip="「一般ã€ã‚¿ãƒ–ã§ã€ã‚°ãƒ«ãƒ¼ãƒ—ã‚’é¸æŠžã—ã¦ãã ã•ã„。"/> + <check_box label="å…¥å ´è¨±å¯ã‚’販売:" name="PassCheck" tool_tip="ã“ã®åŒºç”»ã¸ã®ä¸€æ™‚çš„ãªã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯ã—ã¾ã™ã€‚"/> <combo_box name="pass_combo"> <combo_box.item label="誰ã§ã‚‚" name="Anyone"/> <combo_box.item label="グループ" name="Group"/> @@ -467,7 +478,7 @@ </panel> <panel name="Banned_layout_panel"> <text label="ç¦æ¢" name="BanCheck"> - ç«‹å…¥ç¦æ¢ã•れãŸä½äºº + ç«‹å…¥ã‚’ç¦æ¢ã•れãŸä½äºº </text> <name_list name="BannedList" tool_tip="(åˆè¨ˆ [LISTED] äººã€æœ€å¤§ [MAX] 人)"/> <button label="è¿½åŠ " name="add_banned"/> diff --git a/indra/newview/skins/default/xui/ja/floater_animation_preview.xml b/indra/newview/skins/default/xui/ja/floater_animation_preview.xml index c355924f33..548d24097f 100644 --- a/indra/newview/skins/default/xui/ja/floater_animation_preview.xml +++ b/indra/newview/skins/default/xui/ja/floater_animation_preview.xml @@ -106,6 +106,9 @@ <floater.string name="E_ST_NO_XLT_EMOTE"> エモートåã‚’èªã¿ã¨ã‚Œã¾ã›ã‚“。 </floater.string> + <floater.string name="E_ST_BAD_ROOT"> + ルートジョイントåãŒç„¡åйã§ã™ã€‚「hipã€ã‚’使用ã—ã¦ãã ã•ã„。 + </floater.string> <text name="name_label"> åå‰ï¼š </text> @@ -114,8 +117,8 @@ </text> <spinner label="å„ªå…ˆé †ä½" name="priority" tool_tip="ã“ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ãŒã©ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’上書ãã™ã‚‹ã‹ã‚’決ã‚ã¾ã™"/> <check_box label="ループ" name="loop_check" tool_tip="ã“ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’ループå†ç”Ÿã—ã¾ã™"/> - <spinner label="イン(ï¼…)" label_width="45" left="70" name="loop_in_point" tool_tip="アニメーションã®ãƒ«ãƒ¼ãƒ—復帰点をè¨å®šã—ã¾ã™" width="100"/> - <spinner label="アウト(ï¼…)" label_width="60" left="170" name="loop_out_point" tool_tip="アニメーションã®ãƒ«ãƒ¼ãƒ—終了点をè¨å®šã—ã¾ã™" width="100"/> + <spinner label="イン(ï¼…)" label_width="45" left="60" name="loop_in_point" tool_tip="アニメーションã®ãƒ«ãƒ¼ãƒ—復帰点をè¨å®šã—ã¾ã™" width="100"/> + <spinner label="アウト(ï¼…)" label_width="50" left="170" name="loop_out_point" tool_tip="アニメーションã®ãƒ«ãƒ¼ãƒ—終了点をè¨å®šã—ã¾ã™" width="100"/> <text name="hand_label"> 手ã®å‹•ã </text> @@ -138,47 +141,47 @@ è¡¨ç¾ </text> <combo_box label="" name="emote_combo" tool_tip="アニメーションå†ç”Ÿä¸ã®é¡”ã®è¡¨æƒ…を決ã‚ã¾ã™"> - <combo_box.item label="(ãªã—)" name="[None]"/> - <combo_box.item label="アーーーーー" name="Aaaaah"/> - <combo_box.item label="æã‚Œã‚‹" name="Afraid"/> - <combo_box.item label="怒る" name="Angry"/> - <combo_box.item label="満é¢ã®ç¬‘ã¿" name="BigSmile"/> - <combo_box.item label="退屈" name="Bored"/> - <combo_box.item label="æ³£ã" name="Cry"/> - <combo_box.item label="侮辱" name="Disdain"/> - <combo_box.item label="æ¥ãšã‹ã—ãŒã‚‹" name="Embarrassed"/> - <combo_box.item label="ã—ã‹ã‚ã£é¢" name="Frown"/> - <combo_box.item label="ã‚ス" name="Kiss"/> - <combo_box.item label="笑ã†" name="Laugh"/> - <combo_box.item label="Plllppt" name="Plllppt"/> - <combo_box.item label="嫌悪感" name="Repulsed"/> - <combo_box.item label="悲ã—ã„" name="Sad"/> - <combo_box.item label="è‚©ã‚’ã™ãã‚ã‚‹" name="Shrug"/> - <combo_box.item label="微笑む" name="Smile"/> - <combo_box.item label="驚ã" name="Surprise"/> - <combo_box.item label="ウィンク" name="Wink"/> - <combo_box.item label="心é…ã™ã‚‹" name="Worry"/> + <item label="(ãªã—)" name="[None]" value=""/> + <item label="アーーーーー" name="Aaaaah" value="アーーーーー"/> + <item label="æã‚Œã‚‹" name="Afraid" value="æã‚Œã‚‹"/> + <item label="怒る" name="Angry" value="怒る"/> + <item label="満é¢ã®ç¬‘ã¿" name="BigSmile" value="満é¢ã®ç¬‘ã¿"/> + <item label="退屈" name="Bored" value="退屈"/> + <item label="æ³£ã" name="Cry" value="æ³£ã"/> + <item label="侮辱" name="Disdain" value="侮辱"/> + <item label="æ¥ãšã‹ã—ãŒã‚‹" name="Embarrassed" value="æ¥ãšã‹ã—ãŒã‚‹"/> + <item label="ã—ã‹ã‚ã£é¢" name="Frown" value="ã—ã‹ã‚ã£é¢"/> + <item label="ã‚ス" name="Kiss" value="ã‚ス"/> + <item label="笑ã†" name="Laugh" value="笑ã†"/> + <item label="Plllppt" name="Plllppt" value="Plllppt"/> + <item label="嫌悪感" name="Repulsed" value="嫌悪感"/> + <item label="悲ã—ã„" name="Sad" value="悲ã—ã„"/> + <item label="è‚©ã‚’ã™ãã‚ã‚‹" name="Shrug" value="è‚©ã‚’ã™ãã‚ã‚‹"/> + <item label="微笑む" name="Smile" value="微笑む"/> + <item label="驚ã" name="Surprise" value="驚ã"/> + <item label="ウィンク" name="Wink" value="ウィンク"/> + <item label="心é…ã™ã‚‹" name="Worry" value="心é…ã™ã‚‹"/> </combo_box> <text name="preview_label"> åŒæ™‚進行行動 </text> <combo_box label="" name="preview_base_anim" tool_tip="ã‚¢ãƒã‚¿ãƒ¼ãŒæ™®é€šã®è¡Œå‹•ã‚’ã™ã‚‹ã¨ãã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã®å‹•ãをテストã™ã‚‹ãŸã‚ã«ã“れを使ã„ã¾ã™ã€‚"> - <combo_box.item label="ç«‹ã¤" name="Standing"/> - <combo_box.item label="æ©ã" name="Walking"/> - <combo_box.item label="座る" name="Sitting"/> - <combo_box.item label="飛ã¶" name="Flying"/> + <item label="ç«‹ã¤" name="Standing" value="ç«‹ã¤"/> + <item label="æ©ã" name="Walking" value="æ©ã"/> + <item label="座る" name="Sitting" value="座る"/> + <item label="飛ã¶" name="Flying" value="飛ã¶"/> </combo_box> - <spinner label="フェーズイï¾(ç§’)" name="ease_in_time" tool_tip="アニメーションã®ãƒ–レンドイン時間(秒)"/> - <spinner label="フェーズアウト(ç§’)" name="ease_out_time" tool_tip="アニメーションã®ãƒ–レンドアウト時間(秒)"/> + <spinner label="イーズイン(ç§’)" name="ease_in_time" tool_tip="アニメーションã®ãƒ–レンドイン時間(秒)"/> + <spinner label="イーズアウト(ç§’)" name="ease_out_time" tool_tip="アニメーションã®ãƒ–レンドアウト時間(秒)"/> <button label="" name="play_btn" tool_tip="アニメーションをå†ç”Ÿã™ã‚‹"/> <button name="pause_btn" tool_tip="ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’ä¸€æ™‚åœæ¢ã™ã‚‹"/> <button label="" name="stop_btn" tool_tip="アニメーションã®å†ç”Ÿã‚’åœæ¢"/> <slider label="" name="playback_slider"/> <text name="bad_animation_text"> - アニメーション・ファイルをèªã¿è¾¼ã‚ã¾ã›ã‚“。 + アニメーションファイルをèªã¿è¾¼ã‚ã¾ã›ã‚“。 Poser 4ã‹ã‚‰ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã•れãŸBVHファイルを推奨ã—ã¾ã™ã€‚ </text> - <button label="アップロードL$[AMOUNT]" name="ok_btn"/> + <button label="アップãƒãƒ¼ãƒ‰L$[AMOUNT]" name="ok_btn"/> <button label="å–り消ã—" name="cancel_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/ja/floater_avatar_textures.xml b/indra/newview/skins/default/xui/ja/floater_avatar_textures.xml index a199a10823..5c23b77498 100644 --- a/indra/newview/skins/default/xui/ja/floater_avatar_textures.xml +++ b/indra/newview/skins/default/xui/ja/floater_avatar_textures.xml @@ -3,44 +3,48 @@ <floater.string name="InvalidAvatar"> 無効ãªã‚¢ãƒã‚¿ãƒ¼ </floater.string> - <text name="label"> - ベークドテクスãƒãƒ£ - </text> - <text name="composite_label" width="128"> - åˆæˆãƒ†ã‚¯ã‚¹ãƒãƒ£ãƒ¼ - </text> - <button label="テクスãƒãƒ£IDä¸€è¦§ã‚’ã‚³ãƒ³ã‚½ãƒ¼ãƒ«ã«æ›¸ã込む" label_selected="æ¨ã¦ã‚‹" name="Dump"/> <scroll_container name="profile_scroll"> <panel name="scroll_content_panel"> - <texture_picker label="髪" name="hair-baked"/> - <texture_picker label="髪" name="hair_grain"/> - <texture_picker label="髪ã®ã‚¢ãƒ«ãƒ•ã‚¡" name="hair_alpha"/> - <texture_picker label="é " name="head-baked"/> - <texture_picker label="メイクアップ" name="head_bodypaint"/> - <texture_picker label="é 部ã®ã‚¢ãƒ«ãƒ•ã‚¡" name="head_alpha"/> - <texture_picker label="é 部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="head_tattoo"/> - <texture_picker label="ç›®" name="eyes-baked"/> - <texture_picker label="ç›®" name="eyes_iris"/> - <texture_picker label="ç›®ã®ã‚¢ãƒ«ãƒ•ã‚¡" name="eyes_alpha"/> - <texture_picker label="上åŠèº«" name="upper-baked"/> - <texture_picker label="上åŠèº«ã®ãƒœãƒ‡ã‚£ãƒšã‚¤ãƒ³ãƒˆ" name="upper_bodypaint"/> - <texture_picker label="下ç€ã‚·ãƒ£ãƒ„" name="upper_undershirt"/> - <texture_picker label="手袋" name="upper_gloves"/> - <texture_picker label="シャツ" name="upper_shirt"/> - <texture_picker label="上ç€" name="upper_jacket"/> - <texture_picker label="アルファ(上)" name="upper_alpha"/> - <texture_picker label="上部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="upper_tattoo"/> - <texture_picker label="下åŠèº«" name="lower-baked"/> - <texture_picker label="下åŠèº«ã®ãƒœãƒ‡ã‚£ãƒšã‚¤ãƒ³ãƒˆ" name="lower_bodypaint"/> - <texture_picker label="下ç€ãƒ‘ンツ" name="lower_underpants"/> - <texture_picker label="é´ä¸‹" name="lower_socks"/> - <texture_picker label="é´" name="lower_shoes"/> - <texture_picker label="パンツ" name="lower_pants"/> - <texture_picker label="ジャケット" name="lower_jacket"/> - <texture_picker label="アルファ(下)" name="lower_alpha"/> - <texture_picker label="下部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="lower_tattoo"/> - <texture_picker label="スカート" name="skirt-baked"/> - <texture_picker label="スカート" name="skirt"/> + <text name="label"> + ベークド +テクスãƒãƒ£ + </text> + <text name="composite_label"> + åˆæˆ +テクスãƒãƒ£ + </text> + <button label="ID をコンソールã«ãƒ€ãƒ³ãƒ—" label_selected="ダンプ" name="Dump"/> + <panel name="scroll_content_panel"> + <texture_picker label="髪" name="hair-baked"/> + <texture_picker label="髪" name="hair_grain"/> + <texture_picker label="髪ã®ã‚¢ãƒ«ãƒ•ã‚¡" name="hair_alpha"/> + <texture_picker label="é " name="head-baked"/> + <texture_picker label="メイクアップ" name="head_bodypaint"/> + <texture_picker label="é 部ã®ã‚¢ãƒ«ãƒ•ã‚¡" name="head_alpha"/> + <texture_picker label="é 部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="head_tattoo"/> + <texture_picker label="ç›®" name="eyes-baked"/> + <texture_picker label="ç›®" name="eyes_iris"/> + <texture_picker label="ç›®ã®ã‚¢ãƒ«ãƒ•ã‚¡" name="eyes_alpha"/> + <texture_picker label="上åŠèº«" name="upper-baked"/> + <texture_picker label="ボディペイント(上)" name="upper_bodypaint"/> + <texture_picker label="下ç€ã‚·ãƒ£ãƒ„" name="upper_undershirt"/> + <texture_picker label="手袋" name="upper_gloves"/> + <texture_picker label="シャツ" name="upper_shirt"/> + <texture_picker label="上ç€" name="upper_jacket"/> + <texture_picker label="アルファ(上)" name="upper_alpha"/> + <texture_picker label="上部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="upper_tattoo"/> + <texture_picker label="下åŠèº«" name="lower-baked"/> + <texture_picker label="ボディペイント(下)" name="lower_bodypaint"/> + <texture_picker label="下ç€ãƒ‘ンツ" name="lower_underpants"/> + <texture_picker label="é´ä¸‹" name="lower_socks"/> + <texture_picker label="é´" name="lower_shoes"/> + <texture_picker label="パンツ" name="lower_pants"/> + <texture_picker label="ジャケット" name="lower_jacket"/> + <texture_picker label="アルファ(下)" name="lower_alpha"/> + <texture_picker label="下部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="lower_tattoo"/> + <texture_picker label="スカート" name="skirt-baked"/> + <texture_picker label="スカート" name="skirt"/> + </panel> </panel> </scroll_container> </floater> diff --git a/indra/newview/skins/default/xui/ja/floater_build_options.xml b/indra/newview/skins/default/xui/ja/floater_build_options.xml index 8d3dba3883..8cb67ca521 100644 --- a/indra/newview/skins/default/xui/ja/floater_build_options.xml +++ b/indra/newview/skins/default/xui/ja/floater_build_options.xml @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="build options floater" title="グリッドオプション"> - <spinner label="グリッドユニット(メートル)" name="GridResolution"/> - <spinner label="グリッド範囲(メートル)" name="GridDrawSize"/> - <check_box label="サブユニットã«ã‚¹ãƒŠãƒƒãƒ—" name="GridSubUnit"/> + <spinner label="グリッドå˜ä½ï¼ˆãƒ¡ãƒ¼ãƒˆãƒ«ï¼‰" name="GridResolution"/> + <spinner label="グリッド゙範囲(メートル)" name="GridDrawSize"/> + <check_box label="より細ã‹ã„å˜ä½ã§ã‚¹ãƒŠãƒƒãƒ—フィット" name="GridSubUnit"/> <check_box label="横æ–é¢ã‚’表示" name="GridCrossSection"/> - <text name="grid_opacity_label" tool_tip="グリッドã®é€æ˜Žåº¦"> - 逿˜Žåº¦ï¼š + <text name="grid_opacity_label" tool_tip="グリッドã®ä¸é€æ˜Žåº¦"> + ä¸é€æ˜Žåº¦ï¼š </text> <slider label="グリッドã®ä¸é€æ˜Žåº¦" name="GridOpacity"/> </floater> diff --git a/indra/newview/skins/default/xui/ja/floater_bulk_perms.xml b/indra/newview/skins/default/xui/ja/floater_bulk_perms.xml index fbbbd85890..be24960c6e 100644 --- a/indra/newview/skins/default/xui/ja/floater_bulk_perms.xml +++ b/indra/newview/skins/default/xui/ja/floater_bulk_perms.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floaterbulkperms" title="コンテンツ権é™ã®ç·¨é›†"> +<floater name="floaterbulkperms" title="ä¸èº«ã®æ¨©é™ã®ç·¨é›†"> <floater.string name="nothing_to_modify_text"> - é¸æŠžã—ãŸä¸ã«ç·¨é›†ã§ããªã„コンテンツãŒå«ã¾ã‚Œã¦ã„ã¾ã™ + é¸æŠžã—ãŸä¸ã«ç·¨é›†ã§ããªã„ã‚‚ã®ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ </floater.string> <floater.string name="status_text"> [NAME]ã«æ¨©é™ã‚’è¨å®šä¸ã§ã™ã€‚ @@ -28,12 +28,12 @@ <icon name="icon_script" tool_tip="スクリプト"/> <check_box label="サウンド" name="check_sound"/> <icon name="icon_sound" tool_tip="サウンド"/> - <check_box label="テクスãƒãƒ£ãƒ¼" name="check_texture"/> + <check_box label="テクスãƒãƒ£" name="check_texture"/> <icon name="icon_texture" tool_tip="テクスãƒãƒ£"/> <button label="ã™ã¹ã¦ã« √" label_selected="å…¨ã¦" name="check_all"/> <button label="クリア" label_selected="ãªã—" name="check_none"/> <text name="newperms"> - æ–°ã—ã„ã‚³ãƒ³ãƒ†ãƒ³ãƒ„æ¨©é™ + æ–°ã—ã„ä¸èº«ã®æ¨©é™ </text> <text name="GroupLabel"> グループ: @@ -43,7 +43,7 @@ 全員: </text> <check_box label="コピー" name="everyone_copy"/> - <text name="NextOwnerLabel"> + <text name="NextOwnerLabel" left="160"> æ¬¡ã®æ‰€æœ‰è€…: </text> <check_box label="ä¿®æ£" name="next_owner_modify"/> diff --git a/indra/newview/skins/default/xui/ja/floater_buy_contents.xml b/indra/newview/skins/default/xui/ja/floater_buy_contents.xml index 53b7f24141..ed17736eb3 100644 --- a/indra/newview/skins/default/xui/ja/floater_buy_contents.xml +++ b/indra/newview/skins/default/xui/ja/floater_buy_contents.xml @@ -1,22 +1,22 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater min_width="340" name="floater_buy_contents" title="コンテンツã®è³¼å…¥" width="340"> +<floater min_width="340" name="floater_buy_contents" title="ä¸èº«ã®è³¼å…¥" width="340"> <text name="contains_text" width="320"> - [NAME]ã®å†…容: + [NAME] ã®ä¸èº«ï¼š </text> <scroll_list name="item_list" width="310"/> <text name="buy_text" width="320"> - コンテンツを[NAME]ã‹ã‚‰L$[AMOUNT]ã§è³¼å…¥ã—ã¾ã™ã‹ï¼Ÿ + ä¸èº«ã‚’ [NAME] ã‹ã‚‰ L$[AMOUNT] ã§è³¼å…¥ã—ã¾ã™ã‹ï¼Ÿ </text> <button label="å–り消ã—" label_selected="å–り消ã—" name="cancel_btn" width="73"/> <button label="購入" label_selected="購入" left_delta="-77" name="buy_btn" width="73"/> - <check_box label="今ã™ãæœã‚’ç€ã‚‹" left_delta="-125" name="wear_check"/> + <check_box label="今ã™ãç€ã‚‹" left_delta="-125" name="wear_check"/> <text name="no_copy_text"> - (コピーãªã—) + (コピーä¸å¯ï¼‰ </text> <text name="no_modify_text"> - (ä¿®æ£ãªã—) + (修æ£ä¸å¯ï¼‰ </text> <text name="no_transfer_text"> - (転é€ãªã—) + (å†è²©ãƒ»ãƒ—レゼントä¸å¯ï¼‰ </text> </floater> diff --git a/indra/newview/skins/default/xui/ja/floater_buy_currency.xml b/indra/newview/skins/default/xui/ja/floater_buy_currency.xml index ffdcf838d3..22af6e0ea2 100644 --- a/indra/newview/skins/default/xui/ja/floater_buy_currency.xml +++ b/indra/newview/skins/default/xui/ja/floater_buy_currency.xml @@ -37,16 +37,16 @@ 見ç©ã‚‚りä¸... </text> <text name="buy_action"> - [NAME] L$ [PRICE] + [ACTION] </text> <text name="total_label"> - æ–°ã—ã„æ®‹é«˜ + è³¼å…¥å¾Œã®æ®‹é«˜ </text> <text name="total_amount"> L$ [AMT] </text> <text name="currency_links"> - [http://www.secondlife.com/my/account/payment_method_management.php?lang=ja-JP payment method] | [http://www.secondlife.com/my/account/currency.php?lang=ja-JP currency] | [http://www.secondlife.com/my/account/exchange_rates.php?lang=ja-JP exchange rate] + [http://www.secondlife.com/my/account/payment_method_management.php?lang=ja-JP 支払方法] | [http://www.secondlife.com/my/account/currency.php?lang=ja-JP 通貨] | [http://www.secondlife.com/my/account/exchange_rates.php?lang=ja-JP æ›ç®—レート] </text> <text name="exchange_rate_note"> 金é¡ã‚’å†å…¥åŠ›ã—ã¦æœ€æ–°æ›ç®—レートを確èªã—ã¾ã™ã€‚ diff --git a/indra/newview/skins/default/xui/ja/floater_buy_currency_html.xml b/indra/newview/skins/default/xui/ja/floater_buy_currency_html.xml new file mode 100644 index 0000000000..37fd6826e5 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/floater_buy_currency_html.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_buy_currency_html" title="通貨ã®è³¼å…¥"/> diff --git a/indra/newview/skins/default/xui/ja/floater_buy_land.xml b/indra/newview/skins/default/xui/ja/floater_buy_land.xml index 13b43d1257..34f9d38de1 100644 --- a/indra/newview/skins/default/xui/ja/floater_buy_land.xml +++ b/indra/newview/skins/default/xui/ja/floater_buy_land.xml @@ -1,5 +1,129 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="buy land" title="土地ã®è³¼å…¥"> + <floater.string name="can_resell"> + å†è²©å¯èƒ½ + </floater.string> + <floater.string name="can_not_resell"> + å†è²©ä¸å¯èƒ½ + </floater.string> + <floater.string name="can_change"> + çµ±åˆãƒ»å†åˆ†å‰²å¯èƒ½ + </floater.string> + <floater.string name="can_not_change"> + çµ±åˆãƒ»å†åˆ†å‰²ä¸å¯èƒ½ + </floater.string> + <floater.string name="cant_buy_for_group"> + ã‚ãªãŸã¯ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªã‚°ãƒ«ãƒ¼ãƒ—用ã®åœŸåœ°è³¼å…¥ã‚’許å¯ã•れã¦ã„ã¾ã›ã‚“ + </floater.string> + <floater.string name="no_land_selected"> + 土地ãŒé¸æŠžã•れã¦ã„ã¾ã›ã‚“ + </floater.string> + <floater.string name="multiple_parcels_selected"> + 複数ã®ç•°ãªã£ãŸåŒºç”»ã‚’é¸æŠžã—ã¾ã—ãŸã€‚ +ã“れよりå°ã•ãªç¯„å›²ã‚’é¸æŠžã—ã¦ãã ã•ã„。 + </floater.string> + <floater.string name="no_permission"> + ã‚ãªãŸã¯ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªã‚°ãƒ«ãƒ¼ãƒ—用ã®åœŸåœ°è³¼å…¥ã‚’許å¯ã•れã¦ã„ã¾ã›ã‚“ + </floater.string> + <floater.string name="parcel_not_for_sale"> + é¸æŠžã•れãŸåŒºç”»ã¯è²©å£²å¯¾è±¡å¤–ã§ã™ + </floater.string> + <floater.string name="group_already_owns"> + グループã¯ã™ã§ã«ã“ã®åŒºç”»ã‚’所有ã—ã¦ã„ã¾ã™ + </floater.string> + <floater.string name="you_already_own"> + ã‚ãªãŸã¯ã™ã§ã«ã“ã®åŒºç”»ã‚’所有ã—ã¦ã„ã¾ã™ + </floater.string> + <floater.string name="set_to_sell_to_other"> + é¸æŠžã•れãŸåŒºç”»ã¯ã€ä»–ã®äººã¸ã®è²©å£²ãŒæ±ºã¾ã£ã¦ã„ã¾ã™ + </floater.string> + <floater.string name="no_public_land"> + é¸æŠžã•れãŸåœ°åŸŸã«ã€å…¬å…±ã®åœŸåœ°ã¯ã‚りã¾ã›ã‚“ + </floater.string> + <floater.string name="not_owned_by_you"> + ä»–ã®ä½äººãŒæ‰€æœ‰ã™ã‚‹åœŸåœ°ã‚’é¸æŠžã—ã¦ã„ã¾ã™ã€‚ +ã‚‚ã£ã¨ç‹ã„ç¯„å›²ã‚’é¸æŠžã—ã¦ã¿ã¦ãã ã•ã„。 + </floater.string> + <floater.string name="processing"> + 購入処ç†ä¸... + +(数分ã‹ã‹ã‚‹ã“ã¨ãŒã‚りã¾ã™ï¼‰ + </floater.string> + <floater.string name="fetching_error"> + åœŸåœ°è³¼å…¥ã®æƒ…å ±å…¥æ‰‹ä¸ã«ã‚¨ãƒ©ãƒ¼ãŒèµ·ãã¾ã—㟠+ </floater.string> + <floater.string name="buying_will"> + ã“ã®åœŸåœ°ã‚’è²·ã†ã¨ï¼š + </floater.string> + <floater.string name="buying_for_group"> + グループ用ã®åœŸåœ°ã‚’購入ã™ã‚‹ã¨ï¼š + </floater.string> + <floater.string name="cannot_buy_now"> + ç¾åœ¨è³¼å…¥ä¸å¯ï¼š + </floater.string> + <floater.string name="not_for_sale"> + 販売対象外: + </floater.string> + <floater.string name="none_needed"> + 一切必è¦ãªã— + </floater.string> + <floater.string name="must_upgrade"> + アカウントをアップグレードã—ãªã„ã¨ã€åœŸåœ°ã‚’所有ã§ãã¾ã›ã‚“ + </floater.string> + <floater.string name="cant_own_land"> + ã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã§åœŸåœ°ã‚’所有ã§ãã¾ã™ + </floater.string> + <floater.string name="land_holdings"> + ã‚ãªãŸã¯ã€[BUYER] 平方メートルã®åœŸåœ°ã‚’所有ã—ã¦ã„ã¾ã™ã€‚ + </floater.string> + <floater.string name="pay_to_for_land"> + ã“ã®åœŸåœ°ã®ä»£é‡‘ã¨ã—ã¦ã€[SELLER]ã«L$[AMOUNT]を支払ㆠ+ </floater.string> + <floater.string name="buy_for_US"> + L$ [AMOUNT] ã‚’ã€ç´„ [LOCAL_AMOUNT] ã§è³¼å…¥ã—ã¾ã™ã€‚ + </floater.string> + <floater.string name="parcel_meters"> + ã“ã®åŒºç”»ã¯ [AMOUNT] 平方メートルã§ã™ã€‚ + </floater.string> + <floater.string name="premium_land"> + ã“ã®åœŸåœ°ã¯å‰²ã‚Šå¢—ã—付ã§ã™ã€‚ [AMOUNT] å¹³æ–¹ãƒ¡ãƒ¼ãƒˆãƒ«ã®æ–™é‡‘ãŒã‹ã‹ã‚Šã¾ã™ã€‚ + </floater.string> + <floater.string name="discounted_land"> + ã“ã®åœŸåœ°ã¯ãƒ‡ã‚£ã‚¹ã‚«ã‚¦ãƒ³ãƒˆã•れã¦ã„ã¾ã™ã€‚ [AMOUNT] å¹³æ–¹ãƒ¡ãƒ¼ãƒˆãƒ«ã®æ–™é‡‘ãŒã‹ã‹ã‚Šã¾ã™ã€‚ + </floater.string> + <floater.string name="meters_supports_object"> + [AMOUNT] 平方メートル +オブジェクト [AMOUNT2] 個サãƒãƒ¼ãƒˆ + </floater.string> + <floater.string name="sold_with_objects"> + オブジェクト込ã¿ã§è²©å£² + </floater.string> + <floater.string name="sold_without_objects"> + オブジェクトã¯å«ã¾ã‚Œã¦ã„ã¾ã›ã‚“ + </floater.string> + <floater.string name="info_price_string"> + L$ [PRICE] +(L$[PRICE_PER_SQM]/平方メートル) +[SOLD_WITH_OBJECTS] + </floater.string> + <floater.string name="insufficient_land_credits"> + ã“ã® [GROUP] ãŒåŒºç”»ã®è³¼å…¥æ‰‹ç¶šãを完了ã™ã‚‹ã«ã¯ã€ ä¾¡æ ¼ã«è¦‹åˆã†ã ã‘ã®å¯„付ã•れãŸåœŸåœ°ã®åˆ©ç”¨å®Ÿç¸¾ãŒå¿…è¦ã§ã™ + </floater.string> + <floater.string name="have_enough_lindens"> + ã‚ãªãŸã®æ‰€æŒã™ã‚‹ L$ [AMOUNT]ã§ã€ã“ã®åœŸåœ°ã‚’購入ã§ãã¾ã™ + </floater.string> + <floater.string name="not_enough_lindens"> + ã‚ãªãŸã®æ‰€æŒé‡‘㯠L$ [AMOUNT]ã ã‘ã§ã€ã‚ã¨L$ [AMOUNT2] å¿…è¦ã§ã™ + </floater.string> + <floater.string name="balance_left"> + 購入後ã€ã‚ãªãŸã®æ®‹é¡ã¯L$[AMOUNT]ã«ãªã‚Šã¾ã™ + </floater.string> + <floater.string name="balance_needed"> + ã“ã®åœŸåœ°ã‚’è²·ã†ã«ã¯ã€å°‘ãªãã¨ã‚‚ L$ [AMOUNT] を購入ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ + </floater.string> + <floater.string name="no_parcel_selected"> + (区画ãŒé¸å®šã•れã¦ã„ã¾ã›ã‚“) + </floater.string> <text name="region_name_label"> 地域: </text> @@ -27,10 +151,10 @@ <text name="resellable_changeable_label"> ã“ã®åœ°åŸŸã§è³¼å…¥ã—ãŸåœŸåœ°ï¼š </text> - <text name="resellable_clause"> + <text left="460" name="resellable_clause"> å†è²©ã§ãã‚‹å ´åˆã¨ã§ããªã„å ´åˆãŒã‚りã¾ã™ã€‚ </text> - <text name="changeable_clause"> + <text left="460" name="changeable_clause"> çµ±åˆã¾ãŸã¯å†åˆ†å‰²ã§ãã‚‹å ´åˆã¨ã§ããªã„å ´åˆãŒã‚りã¾ã™ã€‚ </text> <text name="covenant_text"> @@ -67,12 +191,12 @@ <text name="error_message"> 何ã‹å¤‰ã§ã™ </text> - <button label="ウェブ・サイトã«ç§»å‹•" name="error_web"/> + <button label="Webサイトã«ç§»å‹•" name="error_web"/> <text name="account_action"> - プレミアム・メンãƒãƒ¼ã«ã‚¢ãƒƒãƒ—グレード + プレミアム会員ã«ã‚¢ãƒƒãƒ—グレード </text> <text name="account_reason"> - åœŸåœ°ã‚’ä¿æœ‰ã§ãã‚‹ã®ã¯ãƒ—レミアム・メンãƒãƒ¼ã ã‘ã§ã™ + åœŸåœ°ã‚’ä¿æœ‰ã§ãã‚‹ã®ã¯ãƒ—レミアム会員ã ã‘ã§ã™ </text> <combo_box name="account_level"> <combo_box.item label="æœˆé¡ 9.95米ドル〠月払ã„" name="US$9.95/month,billedmonthly"/> @@ -107,131 +231,4 @@ <check_box label="グループã‹ã‚‰ [AMOUNT] 平方メートルã®è²¢çŒ®ã‚’å–り除ãã¾ã™ã€‚" name="remove_contribution"/> <button label="購入" name="buy_btn"/> <button label="å–り消ã—" name="cancel_btn"/> - <string name="can_resell"> - å†è²©å¯èƒ½ - </string> - <string name="can_not_resell"> - å†è²©ä¸å¯èƒ½ - </string> - <string name="can_change"> - çµ±åˆï¼å†åˆ†å‰²å¯èƒ½ - </string> - <string name="can_not_change"> - çµ±åˆï¼å†åˆ†å‰²ä¸å¯èƒ½ - </string> - <string name="cant_buy_for_group"> - ã‚ãªãŸã¯ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªã‚°ãƒ«ãƒ¼ãƒ—用ã®åœŸåœ°è³¼å…¥ã‚’許å¯ã•れã¦ã„ã¾ã›ã‚“ - </string> - <string name="no_land_selected"> - 土地ãŒé¸æŠžã•れã¦ã„ã¾ã›ã‚“ - </string> - <string name="multiple_parcels_selected"> - 複数ã®ç•°ãªã£ãŸåŒºç”»ã‚’é¸æŠžã—ã¾ã—ãŸã€‚ -ã“れよりå°ã•ãªã‚¨ãƒªã‚¢ã‚’é¸æŠžã—ã¦ãã ã•ã„。 - </string> - <string name="no_permission"> - ã‚ãªãŸã¯ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªã‚°ãƒ«ãƒ¼ãƒ—用ã®åœŸåœ°è³¼å…¥ã‚’許å¯ã•れã¦ã„ã¾ã›ã‚“ - </string> - <string name="parcel_not_for_sale"> - é¸æŠžã•れãŸåŒºç”»ã¯è²©å£²å¯¾è±¡å¤–ã§ã™ - </string> - <string name="group_already_owns"> - グループã¯ã™ã§ã«ã“ã®åŒºç”»ã‚’所有ã—ã¦ã„ã¾ã™ - </string> - <string name="you_already_own"> - ã‚ãªãŸã¯ã™ã§ã«ã“ã®åŒºç”»ã‚’所有ã—ã¦ã„ã¾ã™ - </string> - <string name="set_to_sell_to_other"> - é¸æŠžã•れãŸåŒºç”»ã¯ã€ä»–ã®äººã¸ã®è²©å£²ãŒæ±ºã¾ã£ã¦ã„ã¾ã™ - </string> - <string name="no_public_land"> - é¸æŠžã•れãŸåœ°åŸŸã«ã€å…¬å…±ã®åœŸåœ°ã¯ã‚りã¾ã›ã‚“ - </string> - <string name="not_owned_by_you"> - ä»–ã®ä½¿ç”¨è€…ã«æ‰€æœ‰ã•れãŸåœŸåœ°ãŒé¸æŠžã•れã¦ã„ã¾ã™ã€‚ -ã“れよりå°ã•ãªã‚¨ãƒªã‚¢ã‚’é¸æŠžã—ã¦ãã ã•ã„。 - </string> - <string name="processing"> - 購入処ç†ä¸... - -(数分ã‹ã‹ã‚‹ã“ã¨ãŒã‚りã¾ã™ï¼‰ - </string> - <string name="fetching_error"> - åœŸåœ°è³¼å…¥ã®æƒ…å ±å…¥æ‰‹ä¸ã«ã‚¨ãƒ©ãƒ¼ãŒèµ·ãã¾ã—㟠- </string> - <string name="buying_will"> - ã“ã®åœŸåœ°ã‚’è²·ã†ã¨ï¼š - </string> - <string name="buying_for_group"> - グループ用ã®åœŸåœ°ã‚’購入ã™ã‚‹ã¨ï¼š - </string> - <string name="cannot_buy_now"> - ç¾åœ¨è³¼å…¥ä¸å¯ï¼š - </string> - <string name="not_for_sale"> - 販売対象外: - </string> - <string name="none_needed"> - 一切必è¦ãªã— - </string> - <string name="must_upgrade"> - アカウントをアップグレードã—ãªã„ã¨ã€åœŸåœ°ã‚’所有ã§ãã¾ã›ã‚“ - </string> - <string name="cant_own_land"> - ã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã§åœŸåœ°ã‚’所有ã§ãã¾ã™ - </string> - <string name="land_holdings"> - ã‚ãªãŸã¯ã€[BUYER] 平方メートルã®åœŸåœ°ã‚’所有ã—ã¦ã„ã¾ã™ã€‚ - </string> - <string name="pay_to_for_land"> - ã“ã®åœŸåœ°ã®ä»£é‡‘ã¨ã—ã¦ã€[SELLER]ã«L$[AMOUNT]を支払ㆠ- </string> - <string name="buy_for_US"> - L$ [AMOUNT] ã‚’ã€ç´„ [LOCAL_AMOUNT] ã§è³¼å…¥ã—ã¾ã™ã€‚ - </string> - <string name="parcel_meters"> - ã“ã®åŒºç”»ã¯ [AMOUNT] 平方メートルã§ã™ã€‚ - </string> - <string name="premium_land"> - ã“ã®åœŸåœ°ã¯å‰²ã‚Šå¢—ã—付ã§ã™ã€‚ [AMOUNT] å¹³æ–¹ãƒ¡ãƒ¼ãƒˆãƒ«ã®æ–™é‡‘ãŒã‹ã‹ã‚Šã¾ã™ã€‚ - </string> - <string name="discounted_land"> - ã“ã®åœŸåœ°ã¯ãƒ‡ã‚£ã‚¹ã‚«ã‚¦ãƒ³ãƒˆã•れã¦ã„ã¾ã™ã€‚ [AMOUNT] å¹³æ–¹ãƒ¡ãƒ¼ãƒˆãƒ«ã®æ–™é‡‘ãŒã‹ã‹ã‚Šã¾ã™ã€‚ - </string> - <string name="meters_supports_object"> - [AMOUNT] 平方メートル -オブジェクト [AMOUNT2] 個サãƒãƒ¼ãƒˆ - </string> - <string name="sold_with_objects"> - オブジェクトã¨å…±ã«è²©å£²æ¸ˆã¿ - </string> - <string name="sold_without_objects"> - オブジェクトã¯å«ã¾ã‚Œã¦ã„ã¾ã›ã‚“ - </string> - <string name="info_price_string"> - L$ [PRICE] -(L$[PRICE_PER_SQM]/平方メートル) -[SOLD_WITH_OBJECTS] - </string> - <string name="insufficient_land_credits"> - ã“ã® [GROUP] ãŒåŒºç”»ã®è³¼å…¥æ‰‹ç¶šãを完了ã™ã‚‹ã«ã¯ã€ ä¾¡æ ¼ã«è¦‹åˆã†ã ã‘ã®å¯„付ã•れãŸåœŸåœ°ã®åˆ©ç”¨å®Ÿç¸¾ãŒå¿…è¦ã§ã™ - </string> - <string name="have_enough_lindens"> - ã‚ãªãŸã®æ‰€æŒã™ã‚‹ L$ [AMOUNT]ã§ã€ã“ã®åœŸåœ°ã‚’購入ã§ãã¾ã™ - </string> - <string name="not_enough_lindens"> - ã‚ãªãŸã®æ‰€æŒé‡‘㯠L$ [AMOUNT]ã ã‘ã§ã€ã‚ã¨L$ [AMOUNT2] å¿…è¦ã§ã™ - </string> - <string name="balance_left"> - 購入後ã€ã‚ãªãŸã®æ®‹é¡ã¯L$[AMOUNT]ã«ãªã‚Šã¾ã™ - </string> - <string name="balance_needed"> - ã“ã®åœŸåœ°ã‚’è²·ã†ã«ã¯ã€å°‘ãªãã¨ã‚‚ L$ [AMOUNT] を購入ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ - </string> - <string name="no_parcel_selected"> - (区画ãŒé¸å®šã•れã¦ã„ã¾ã›ã‚“) - </string> - <string name="buy_currency"> - ç´„US$ [USD]ã§L$ [LINDENS]を購入 - </string> </floater> diff --git a/indra/newview/skins/default/xui/ja/floater_buy_object.xml b/indra/newview/skins/default/xui/ja/floater_buy_object.xml index f807e91573..f323263699 100644 --- a/indra/newview/skins/default/xui/ja/floater_buy_object.xml +++ b/indra/newview/skins/default/xui/ja/floater_buy_object.xml @@ -1,10 +1,10 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="contents" title="オブジェクトã®ã‚³ãƒ”ーを購入"> <text name="contents_text"> - 内容: + ä¸èº«ï¼š </text> <text name="buy_text"> - [NAME]ã‹ã‚‰L$[AMOUNT]ã§è³¼å…¥ã—ã¾ã™ã‹ï¼Ÿ + [NAME] ã‹ã‚‰ L$[AMOUNT] ã§è³¼å…¥ã—ã¾ã™ã‹ï¼Ÿ </text> <button label="å–æ¶ˆ" label_selected="å–æ¶ˆ" name="cancel_btn"/> <button label="購入" label_selected="購入" name="buy_btn"/> @@ -12,15 +12,15 @@ 購入 </text> <string name="title_buy_copy_text"> - 次ã®ã‚‚ã®ã‚’買ㆠ+ 次ã®ã‚‚ã®ã‚’購入 </string> <text name="no_copy_text"> - (コピーãªã—) + (コピーä¸å¯ï¼‰ </text> <text name="no_modify_text"> - (ä¿®æ£ãªã—) + (修æ£ä¸å¯ï¼‰ </text> <text name="no_transfer_text"> - (転é€ãªã—) + (å†è²©ãƒ»ãƒ—レゼントä¸å¯ï¼‰ </text> </floater> diff --git a/indra/newview/skins/default/xui/ja/floater_camera.xml b/indra/newview/skins/default/xui/ja/floater_camera.xml index be118273fa..ec5c2a64a5 100644 --- a/indra/newview/skins/default/xui/ja/floater_camera.xml +++ b/indra/newview/skins/default/xui/ja/floater_camera.xml @@ -9,23 +9,28 @@ <floater.string name="move_tooltip"> カメラを上下左å³ã«ç§»å‹• </floater.string> + <floater.string name="camera_modes_title"> + カメラモード + </floater.string> + <floater.string name="pan_mode_title"> + 旋回 - ズーム- 水平・垂直移動 + </floater.string> + <floater.string name="presets_mode_title"> + 事å‰è¨å®šã®è¦–野 + </floater.string> + <floater.string name="free_mode_title"> + オブジェクトを見る + </floater.string> <panel name="controls"> - <joystick_track name="cam_track_stick" tool_tip="カメラを上下左å³ã«å‹•ã‹ã—ã¾ã™"/> - <panel name="zoom" tool_tip="å‘ã„ã¦ã‚‹æ–¹æ³•ã«ã‚«ãƒ¡ãƒ©ã‚’ズーム"> + <panel name="zoom" tool_tip="å‘ã„ã¦ã„る方法ã«ã‚«ãƒ¡ãƒ©ã‚’ズーム"> + <joystick_rotate name="cam_rotate_stick" tool_tip="自分を軸ã«ã‚«ãƒ¡ãƒ©ã‚’回ã™"/> <slider_bar name="zoom_slider" tool_tip="å‘ã„ã¦ã„ã‚‹æ–¹å‘ã«ã‚«ãƒ¡ãƒ©ã‚’ズーム"/> - </panel> - <joystick_rotate name="cam_rotate_stick" tool_tip="自分を軸ã«ã‚«ãƒ¡ãƒ©ã‚’回ã™"/> - <panel name="camera_presets"> - <button name="rear_view" tool_tip="後方視界"/> - <button name="group_view" tool_tip="グループ視界"/> - <button name="front_view" tool_tip="剿–¹è¦–界"/> - <button name="mouselook_view" tool_tip="一人称視界"/> + <joystick_track name="cam_track_stick" tool_tip="カメラを上下左å³ã«å‹•ã‹ã—ã¾ã™"/> </panel> </panel> <panel name="buttons"> - <button label="" name="orbit_btn" tool_tip="カメラを回ã™"/> - <button label="" name="pan_btn" tool_tip="カメラを水平・垂直移動"/> - <button label="" name="avatarview_btn" tool_tip="ã‚¢ãƒã‚¿ãƒ¼è¦–点"/> - <button label="" name="freecamera_btn" tool_tip="オブジェクトを見る"/> + <button label="" name="presets_btn" tool_tip="事å‰è¨å®šã®è¦–野"/> + <button label="" name="pan_btn" tool_tip="旋回 - ズーム- 水平・垂直移動"/> + <button label="" name="avatarview_btn" tool_tip="カメラモード"/> </panel> </floater> diff --git a/indra/newview/skins/default/xui/ja/floater_color_picker.xml b/indra/newview/skins/default/xui/ja/floater_color_picker.xml index a98da4b8ba..dc87d27a15 100644 --- a/indra/newview/skins/default/xui/ja/floater_color_picker.xml +++ b/indra/newview/skins/default/xui/ja/floater_color_picker.xml @@ -18,7 +18,7 @@ <text name="l_val_text"> è¼åº¦ï¼š </text> - <check_box label="今ã™ãé©ç”¨" name="apply_immediate"/> + <check_box label="ã™ãé©ç”¨" name="apply_immediate"/> <button label="" label_selected="" name="color_pipette"/> <button label="å–り消ã—" label_selected="å–り消ã—" name="cancel_btn"/> <button label="OK" label_selected="OK" name="select_btn"/> diff --git a/indra/newview/skins/default/xui/ja/floater_critical.xml b/indra/newview/skins/default/xui/ja/floater_critical.xml index 39f6ee8e3f..f69c24622a 100644 --- a/indra/newview/skins/default/xui/ja/floater_critical.xml +++ b/indra/newview/skins/default/xui/ja/floater_critical.xml @@ -3,10 +3,10 @@ <button label="続行" label_selected="続行" name="Continue" /> <button label="å–り消ã—" label_selected="å–り消ã—" name="Cancel" /> <text name="tos_title"> - クリティカル・メッセージ + クリティカルメッセージ </text> <text name="tos_heading"> - 次ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’æ³¨æ„æ·±ããŠèªã¿ãã ã•ã„。 + 次ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’注æ„ã—ã¦ã‚ˆããŠèªã¿ãã ã•ã„。 </text> <text_editor name="tos_text"> TOS_TEXT diff --git a/indra/newview/skins/default/xui/ja/floater_customize.xml b/indra/newview/skins/default/xui/ja/floater_customize.xml index 7d1809f1ed..cc0032e1ab 100644 --- a/indra/newview/skins/default/xui/ja/floater_customize.xml +++ b/indra/newview/skins/default/xui/ja/floater_customize.xml @@ -35,7 +35,7 @@ [PATH] ã«æ‰€åœ¨ </text> <text name="not worn instructions"> - æŒã¡ç‰©ã‹ã‚‰ã‚ãªãŸã®ã‚¢ãƒã‚¿ãƒ¼ã«1ã¤ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„シェイプをã¤ã‘ã¾ã™ã€‚ 代ã‚りã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ + æŒã¡ç‰©ã‹ã‚‰ã‚ãªãŸã®ã‚¢ãƒã‚¿ãƒ¼ã« 1 ã¤ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„シェイプをã¤ã‘ã¾ã™ã€‚ 代ã‚りã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ </text> <text name="no modify instructions"> ã‚ãªãŸã¯ã“ã®æœã®ä¿®æ£ã‚’許ã•れã¦ã„ã¾ã›ã‚“。 @@ -50,7 +50,7 @@ <panel label="スã‚ン" name="Skin"> <button label="スã‚ンã®è‰²" label_selected="スã‚ンã®è‰²" name="Skin Color"/> <button label="é¡”ã®ç´°éƒ¨" label_selected="é¡”ã®ç´°éƒ¨" name="Face Detail"/> - <button label="メイクアップ" label_selected="メイクアップ" name="Makeup"/> + <button label="メイク" label_selected="メイク" name="Makeup"/> <button label="身体細部" label_selected="身体細部" name="Body Detail"/> <text name="title"> [DESC] @@ -68,7 +68,7 @@ [PATH] ã«æ‰€åœ¨ </text> <text name="not worn instructions"> - æŒã¡ç‰©ã‹ã‚‰ã‚ãªãŸã®ã‚¢ãƒã‚¿ãƒ¼ã«1ã¤ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„スã‚ンをã¤ã‘ã¾ã™ã€‚ 代ã‚りã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ + æŒã¡ç‰©ã‹ã‚‰ã‚ãªãŸã®ã‚¢ãƒã‚¿ãƒ¼ã« 1 ã¤ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„スã‚ンをã¤ã‘ã¾ã™ã€‚ 代ã‚りã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ </text> <text name="no modify instructions"> ã‚ãªãŸã¯ã“ã®æœã®ä¿®æ£ã‚’許ã•れã¦ã„ã¾ã›ã‚“。 @@ -105,7 +105,7 @@ [PATH] ã«æ‰€åœ¨ </text> <text name="not worn instructions"> - æŒã¡ç‰©ã‹ã‚‰ã‚ãªãŸã®ã‚¢ãƒã‚¿ãƒ¼ã«1ã¤ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„髪をã¤ã‘ã¾ã™ã€‚ 代ã‚りã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ + æŒã¡ç‰©ã‹ã‚‰ã‚ãªãŸã®ã‚¢ãƒã‚¿ãƒ¼ã« 1 ã¤ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„髪をã¤ã‘ã¾ã™ã€‚ 代ã‚りã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ </text> <text name="no modify instructions"> ã‚ãªãŸã¯ã“ã®æœã®ä¿®æ£ã‚’許ã•れã¦ã„ã¾ã›ã‚“。 @@ -113,7 +113,7 @@ <text name="Item Action Label"> 髪型: </text> - <texture_picker label="テクスãƒãƒ£ãƒ¼" name="Texture" tool_tip="写真をクリックã—ã¦é¸æŠž"/> + <texture_picker label="テクスãƒãƒ£" name="Texture" tool_tip="写真をクリックã—ã¦é¸æŠž"/> <button label="æ–°ã—ã„髪を作æˆ" label_selected="æ–°ã—ã„髪を作æˆ" name="Create New"/> <button label="ä¿å˜" label_selected="ä¿å˜" name="Save"/> <button label="別åã§ä¿å˜..." label_selected="別åã§ä¿å˜..." name="Save As"/> @@ -156,8 +156,8 @@ <panel label="シャツ" name="Shirt"> <texture_picker label="生地" name="Fabric" tool_tip="写真をクリックã—ã¦é¸æŠž"/> <color_swatch label="è‰²ï¼æ˜Žæš—" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/> - <button label="æ–°ã—ã„シャツを作æˆ" label_selected="æ–°ã—ã„シャツを作æˆ" name="Create New"/> <button label="å–り外ã™" label_selected="å–り外ã™" name="Take Off"/> + <button label="æ–°ã—ã„シャツを作æˆ" label_selected="æ–°ã—ã„シャツを作æˆ" name="Create New"/> <button label="ä¿å˜" label_selected="ä¿å˜" name="Save"/> <button label="別åã§ä¿å˜..." label_selected="別åã§ä¿å˜..." name="Save As"/> <button label="戻ã™" label_selected="戻ã™" name="Revert"/> @@ -177,7 +177,7 @@ [PATH] ã«æ‰€åœ¨ </text> <text name="not worn instructions"> - æŒã¡ç‰©ã‹ã‚‰ã‚ãªãŸã®ã‚¢ãƒã‚¿ãƒ¼ã«1ã¤ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„シャツをç€ã¾ã™ã€‚ 代ã‚りã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ + æŒã¡ç‰©ã‹ã‚‰ã‚ãªãŸã®ã‚¢ãƒã‚¿ãƒ¼ã« 1 ã¤ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„シャツをç€ã¾ã™ã€‚ 代ã‚りã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ </text> <text name="no modify instructions"> ã‚ãªãŸã¯ã“ã®æœã®ä¿®æ£ã‚’許ã•れã¦ã„ã¾ã›ã‚“。 @@ -186,11 +186,11 @@ シャツ: </text> </panel> - <panel label="ズボン" name="Pants"> + <panel label="パンツ" name="Pants"> <texture_picker label="生地" name="Fabric" tool_tip="写真をクリックã—ã¦é¸æŠž"/> <color_swatch label="è‰²ï¼æ˜Žæš—" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/> - <button label="æ–°ã—ã„ズボンを作æˆ" label_selected="æ–°ã—ã„ズボンを作æˆ" name="Create New"/> <button label="å–り外ã™" label_selected="å–り外ã™" name="Take Off"/> + <button label="æ–°ã—ã„パンツを作æˆ" label_selected="æ–°ã—ã„パンツを作æˆ" name="Create New"/> <button label="ä¿å˜" label_selected="ä¿å˜" name="Save"/> <button label="別åã§ä¿å˜..." label_selected="別åã§ä¿å˜..." name="Save As"/> <button label="戻ã™" label_selected="戻ã™" name="Revert"/> @@ -216,7 +216,7 @@ ã‚ãªãŸã¯ã“ã®æœã®ä¿®æ£ã‚’許ã•れã¦ã„ã¾ã›ã‚“。 </text> <text name="Item Action Label"> - ズボン: + パンツ: </text> </panel> <panel label="é´" name="Shoes"> @@ -238,6 +238,7 @@ <text name="not worn instructions"> ã‚ãªãŸã®æŒã¡ç‰©ã‹ã‚‰ã‚¢ãƒã‚¿ãƒ¼ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„é´ã‚’å±¥ãã¾ã™ã€‚ 代ã‚りã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ </text> + <button label="æ–°ã—ã„é´ã‚’作æˆ" label_selected="æ–°ã—ã„é´ã‚’作æˆ" name="Create New"/> <text name="no modify instructions"> ã‚ãªãŸã¯ã“ã®æœã®ä¿®æ£ã‚’許ã•れã¦ã„ã¾ã›ã‚“。 </text> @@ -246,7 +247,6 @@ </text> <texture_picker label="生地" name="Fabric" tool_tip="写真をクリックã—ã¦é¸æŠž"/> <color_swatch label="è‰²ï¼æ˜Žæš—" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/> - <button label="æ–°ã—ã„é´ã‚’作æˆ" label_selected="æ–°ã—ã„é´ã‚’作æˆ" name="Create New"/> <button label="å–り外ã™" label_selected="å–り外ã™" name="Take Off"/> <button label="ä¿å˜" label_selected="ä¿å˜" name="Save"/> <button label="別åã§ä¿å˜..." label_selected="別åã§ä¿å˜..." name="Save As"/> @@ -271,6 +271,7 @@ <text name="not worn instructions"> ã‚ãªãŸã®æŒã¡ç‰©ã‹ã‚‰ã‚¢ãƒã‚¿ãƒ¼ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„é´ä¸‹ã‚’å±¥ãã¾ã™ã€‚ 代ã‚りã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ </text> + <button label="æ–°ã—ã„é´ä¸‹ã‚’作æˆ" label_selected="æ–°ã—ã„é´ä¸‹ã‚’作æˆ" name="Create New"/> <text name="no modify instructions"> ã‚ãªãŸã¯ã“ã®æœã®ä¿®æ£ã‚’許ã•れã¦ã„ã¾ã›ã‚“。 </text> @@ -279,7 +280,6 @@ </text> <texture_picker label="生地" name="Fabric" tool_tip="写真をクリックã—ã¦é¸æŠž"/> <color_swatch label="è‰²ï¼æ˜Žæš—" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/> - <button label="æ–°ã—ã„é´ä¸‹ã‚’作æˆ" label_selected="æ–°ã—ã„é´ä¸‹ã‚’作æˆ" name="Create New"/> <button label="å–り外ã™" label_selected="å–り外ã™" name="Take Off"/> <button label="ä¿å˜" label_selected="ä¿å˜" name="Save"/> <button label="別åã§ä¿å˜..." label_selected="別åã§ä¿å˜..." name="Save As"/> @@ -302,8 +302,9 @@ [PATH] ã«æ‰€åœ¨ </text> <text name="not worn instructions"> - æŒã¡ç‰©ã‹ã‚‰ã‚ãªãŸã®ã‚¢ãƒã‚¿ãƒ¼ã«1ã¤ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„ジャケットをç€ã¾ã™ã€‚ 代ã‚りã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ + æŒã¡ç‰©ã‹ã‚‰ã‚ãªãŸã®ã‚¢ãƒã‚¿ãƒ¼ã« 1 ã¤ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„ジャケットをç€ã¾ã™ã€‚ 代ã‚りã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ </text> + <button label="æ–°ã—ã„上ç€ã‚’作æˆ" label_selected="æ–°ã—ã„上ç€ã‚’作æˆ" name="Create New"/> <text name="no modify instructions"> ã‚ãªãŸã¯ã“ã®æœã®ä¿®æ£ã‚’許ã•れã¦ã„ã¾ã›ã‚“。 </text> @@ -313,7 +314,6 @@ <texture_picker label="上åŠèº«ã®ç”Ÿåœ°" name="Upper Fabric" tool_tip="写真をクリックã—ã¦é¸æŠž"/> <texture_picker label="下層生地" name="Lower Fabric" tool_tip="写真をクリックã—ã¦é¸æŠž"/> <color_swatch label="è‰²ï¼æ˜Žæš—" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/> - <button label="æ–°ã—ã„上ç€ã‚’作æˆ" label_selected="æ–°ã—ã„上ç€ã‚’作æˆ" name="Create New"/> <button label="å–り外ã™" label_selected="å–り外ã™" name="Take Off"/> <button label="ä¿å˜" label_selected="ä¿å˜" name="Save"/> <button label="別åã§ä¿å˜..." label_selected="別åã§ä¿å˜..." name="Save As"/> @@ -338,6 +338,7 @@ <text name="not worn instructions"> ã‚ãªãŸã®æŒã¡ç‰©ã‹ã‚‰ã‚¢ãƒã‚¿ãƒ¼ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„æ‰‹è¢‹ã‚’ã¤ã‘ã¾ã™ã€‚ 代ã‚りã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ </text> + <button label="æ–°ã—ã„æ‰‹è¢‹ã‚’作æˆ" label_selected="æ–°ã—ã„æ‰‹è¢‹ã‚’作æˆ" name="Create New"/> <text name="no modify instructions"> ã‚ãªãŸã¯ã“ã®æœã®ä¿®æ£ã‚’許ã•れã¦ã„ã¾ã›ã‚“。 </text> @@ -346,7 +347,6 @@ </text> <texture_picker label="生地" name="Fabric" tool_tip="写真をクリックã—ã¦é¸æŠž"/> <color_swatch label="è‰²ï¼æ˜Žæš—" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/> - <button label="æ–°ã—ã„æ‰‹è¢‹ã‚’作æˆ" label_selected="æ–°ã—ã„æ‰‹è¢‹ã‚’作æˆ" name="Create New"/> <button label="å–り外ã™" label_selected="å–り外ã™" name="Take Off"/> <button label="ä¿å˜" label_selected="ä¿å˜" name="Save"/> <button label="別åã§ä¿å˜..." label_selected="別åã§ä¿å˜..." name="Save As"/> @@ -371,6 +371,7 @@ <text name="not worn instructions"> æŒã¡ç‰©ã‹ã‚‰ã‚ãªãŸã®ã‚¢ãƒã‚¿ãƒ¼ã«1ã¤ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„下ç€ï¼ˆä¸Šï¼‰ã‚’ç€ã¾ã™ã€‚ 代ã‚りã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ </text> + <button label="æ–°ã—ã„下ç€ã‚·ãƒ£ãƒ„を作æˆ" label_selected="æ–°ã—ã„下ç€ã‚·ãƒ£ãƒ„を作æˆ" name="Create New"/> <text name="no modify instructions"> ã‚ãªãŸã¯ã“ã®æœã®ä¿®æ£ã‚’許ã•れã¦ã„ã¾ã›ã‚“。 </text> @@ -379,7 +380,6 @@ </text> <texture_picker label="生地" name="Fabric" tool_tip="写真をクリックã—ã¦é¸æŠž"/> <color_swatch label="è‰²ï¼æ˜Žæš—" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/> - <button label="æ–°ã—ã„下ç€ã‚·ãƒ£ãƒ„を作æˆ" label_selected="æ–°ã—ã„下ç€ã‚·ãƒ£ãƒ„を作æˆ" name="Create New"/> <button label="å–り外ã™" label_selected="å–り外ã™" name="Take Off"/> <button label="ä¿å˜" label_selected="ä¿å˜" name="Save"/> <button label="別åã§ä¿å˜..." label_selected="別åã§ä¿å˜..." name="Save As"/> @@ -404,6 +404,7 @@ <text name="not worn instructions"> ã‚ãªãŸã®æŒã¡ç‰©ã‹ã‚‰ã‚¢ãƒã‚¿ãƒ¼ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„下ç€ï¼ˆä¸‹ï¼‰ã‚’å±¥ãã¾ã™ã€‚ 代ã‚りã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ </text> + <button label="æ–°ã—ã„パンツを作æˆ" label_selected="æ–°ã—ã„パンツを作æˆ" name="Create New"/> <text name="no modify instructions"> ã‚ãªãŸã¯ã“ã®æœã®ä¿®æ£ã‚’許ã•れã¦ã„ã¾ã›ã‚“。 </text> @@ -412,7 +413,6 @@ </text> <texture_picker label="生地" name="Fabric" tool_tip="写真をクリックã—ã¦é¸æŠž"/> <color_swatch label="è‰²ï¼æ˜Žæš—" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/> - <button label="æ–°ã—ã„パンツを作æˆ" label_selected="æ–°ã—ã„パンツを作æˆ" name="Create New"/> <button label="å–り外ã™" label_selected="å–り外ã™" name="Take Off"/> <button label="ä¿å˜" label_selected="ä¿å˜" name="Save"/> <button label="別åã§ä¿å˜..." label_selected="別åã§ä¿å˜..." name="Save As"/> @@ -435,8 +435,9 @@ [PATH] ã«æ‰€åœ¨ </text> <text name="not worn instructions"> - æŒã¡ç‰©ã‹ã‚‰ã‚ãªãŸã®ã‚¢ãƒã‚¿ãƒ¼ã«1ã¤ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„スカートを履ãã¾ã™ã€‚ 代ã‚りã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ + æŒã¡ç‰©ã‹ã‚‰ã‚ãªãŸã®ã‚¢ãƒã‚¿ãƒ¼ã« 1 ã¤ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„スカートを履ãã¾ã™ã€‚ 代ã‚りã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ </text> + <button label="スカートを作æˆ" label_selected="スカートを作æˆ" name="Create New"/> <text name="no modify instructions"> ã‚ãªãŸã¯ã“ã®æœã®ä¿®æ£ã‚’許ã•れã¦ã„ã¾ã›ã‚“。 </text> @@ -445,13 +446,12 @@ </text> <texture_picker label="生地" name="Fabric" tool_tip="写真をクリックã—ã¦é¸æŠž"/> <color_swatch label="è‰²ï¼æ˜Žæš—" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/> - <button label="スカートを作æˆ" label_selected="スカートを作æˆ" name="Create New"/> <button label="å–り外ã™" label_selected="å–り外ã™" name="Take Off"/> <button label="ä¿å˜" label_selected="ä¿å˜" name="Save"/> <button label="別åã§ä¿å˜..." label_selected="別åã§ä¿å˜..." name="Save As"/> <button label="戻ã™" label_selected="戻ã™" name="Revert"/> </panel> - <panel label="アルファ" name="Alpha"> + <panel label="タトゥ" name="Tattoo"> <text name="title"> [DESC] </text> @@ -468,26 +468,24 @@ å‚ç…§ [PATH] </text> <text name="not worn instructions"> - ã‚ãªãŸã®æŒã¡ç‰©ã‹ã‚‰ã‚¢ãƒã‚¿ãƒ¼ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„アルファマスクをã¤ã‘ã¾ã™ã€‚ 代ã‚りã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ + ã‚ãªãŸã®æŒã¡ç‰©ã‹ã‚‰ã‚¢ãƒã‚¿ãƒ¼ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„タトゥをã¤ã‘ã¾ã™ã€‚ 代ã‚りã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ </text> + <button label="æ–°ã—ã„タトゥを作æˆ" label_selected="æ–°ã—ã„タトゥを作æˆ" name="Create New"/> <text name="no modify instructions"> ã“ã®ç€ç”¨ç‰©ã‚’ä¿®æ£ã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“。 </text> <text name="Item Action Label"> - アルファ: + タトゥ: </text> - <texture_picker label="アルファ(下)" name="Lower Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/> - <texture_picker label="アルファ(上)" name="Upper Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/> - <texture_picker label="é 部ã®ã‚¢ãƒ«ãƒ•ã‚¡" name="Head Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/> - <texture_picker label="ç›®ã®ã‚¢ãƒ«ãƒ•ã‚¡" name="Eye Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/> - <texture_picker label="髪ã®ã‚¢ãƒ«ãƒ•ã‚¡" name="Hair Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/> - <button label="æ–°ã—ã„アルファを作æˆ" label_selected="æ–°ã—ã„アルファを作æˆ" name="Create New"/> + <texture_picker label="é 部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="Head Tattoo" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/> + <texture_picker label="上部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="Upper Tattoo" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/> + <texture_picker label="下部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="Lower Tattoo" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/> <button label="å–り外ã™" label_selected="å–り外ã™" name="Take Off"/> <button label="ä¿å˜" label_selected="ä¿å˜" name="Save"/> <button label="別åã§ä¿å˜..." label_selected="別åã§ä¿å˜..." name="Save As"/> <button label="å…ƒã«æˆ»ã™" label_selected="å…ƒã«æˆ»ã™" name="Revert"/> </panel> - <panel label="タトゥ" name="Tattoo"> + <panel label="アルファ" name="Alpha"> <text name="title"> [DESC] </text> @@ -504,25 +502,27 @@ å‚ç…§ [PATH] </text> <text name="not worn instructions"> - ã‚ãªãŸã®æŒã¡ç‰©ã‹ã‚‰ã‚¢ãƒã‚¿ãƒ¼ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„タトゥをã¤ã‘ã¾ã™ã€‚ 代ã‚りã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ + ã‚ãªãŸã®æŒã¡ç‰©ã‹ã‚‰ã‚¢ãƒã‚¿ãƒ¼ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„アルファマスクをã¤ã‘ã¾ã™ã€‚ 代ã‚りã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ </text> + <button label="æ–°ã—ã„アルファを作æˆ" label_selected="æ–°ã—ã„アルファを作æˆ" name="Create New"/> <text name="no modify instructions"> ã“ã®ç€ç”¨ç‰©ã‚’ä¿®æ£ã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“。 </text> <text name="Item Action Label"> - タトゥ: + アルファ: </text> - <texture_picker label="é 部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="Head Tattoo" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/> - <texture_picker label="上部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="Upper Tattoo" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/> - <texture_picker label="下部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="Lower Tattoo" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/> - <button label="æ–°ã—ã„タトゥを作æˆ" label_selected="æ–°ã—ã„タトゥを作æˆ" name="Create New"/> + <texture_picker label="アルファ(下)" name="Lower Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/> + <texture_picker label="アルファ(上)" name="Upper Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/> + <texture_picker label="é 部ã®ã‚¢ãƒ«ãƒ•ã‚¡" name="Head Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/> + <texture_picker label="ç›®ã®ã‚¢ãƒ«ãƒ•ã‚¡" name="Eye Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/> + <texture_picker label="髪ã®ã‚¢ãƒ«ãƒ•ã‚¡" name="Hair Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/> <button label="å–り外ã™" label_selected="å–り外ã™" name="Take Off"/> <button label="ä¿å˜" label_selected="ä¿å˜" name="Save"/> <button label="別åã§ä¿å˜..." label_selected="別åã§ä¿å˜..." name="Save As"/> <button label="å…ƒã«æˆ»ã™" label_selected="å…ƒã«æˆ»ã™" name="Revert"/> </panel> </tab_container> - <button label="ã‚¹ã‚¯ãƒªãƒ—ãƒˆæƒ…å ±" label_selected="ã‚¹ã‚¯ãƒªãƒ—ãƒˆæƒ…å ±" name="script_info"/> + <button label="ã‚¹ã‚¯ãƒªãƒ—ãƒˆæƒ…å ±" label_selected="ã‚¹ã‚¯ãƒªãƒ—ãƒˆæƒ…å ±" name="script_info" tool_tip="ã‚ãªãŸã®ã‚¢ãƒã‚¿ãƒ¼ã«ä»˜ã„ã¦ã„るスクリプトを表示ã—ã¾ã™"/> <button label="アウトフィット作æˆ" label_selected="アウトフィット作æˆ" name="make_outfit_btn"/> <button label="ã‚ャンセル" label_selected="ã‚ャンセル" name="Cancel"/> <button label="OK" label_selected="OK" name="Ok"/> diff --git a/indra/newview/skins/default/xui/ja/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/ja/floater_day_cycle_options.xml index 2d8b54cdd5..b0949cd4e0 100644 --- a/indra/newview/skins/default/xui/ja/floater_day_cycle_options.xml +++ b/indra/newview/skins/default/xui/ja/floater_day_cycle_options.xml @@ -1,8 +1,8 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="Day Cycle Floater" title="デイ・サイクル編集"> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Day Cycle Floater" title="デイサイクル編集"> <tab_container name="Day Cycle Tabs"> - <panel label="デイ・サイクル" name="Day Cycle"> - <button label="?" name="WLDayCycleHelp" /> + <panel label="デイサイクル" name="Day Cycle"> + <button label="?" name="WLDayCycleHelp"/> <text name="WL12am"> 深夜 12時 </text> @@ -57,41 +57,38 @@ <text name="WL12amHash2"> | </text> - <button label="ã‚ーã®è¿½åŠ " label_selected="ã‚ーã®è¿½åŠ " name="WLAddKey" /> - <button label="ã‚ーã®å‰Šé™¤" label_selected="ã‚ーã®å‰Šé™¤" name="WLDeleteKey" /> + <button label="ã‚ーã®è¿½åŠ " label_selected="ã‚ーã®è¿½åŠ " name="WLAddKey"/> + <button label="ã‚ーã®å‰Šé™¤" label_selected="ã‚ーã®å‰Šé™¤" name="WLDeleteKey"/> <text name="WLCurKeyFrameText"> ã‚ーフレームã®è¨å®šï¼š </text> <text name="WLCurKeyTimeText"> - ã‚ー・タイム: + ã‚ータイム: </text> - <spinner label="時間" name="WLCurKeyHour" /> - <spinner label="分" name="WLCurKeyMin" /> + <spinner label="時間" name="WLCurKeyHour"/> + <spinner label="分" name="WLCurKeyMin"/> <text name="WLCurKeyTimeText2"> ã‚ーã®äº‹å‰è¨å®šï¼š </text> - <combo_box label="事å‰è¨å®š" name="WLKeyPresets" /> + <combo_box label="事å‰è¨å®š" name="WLKeyPresets"/> <text name="DayCycleText"> スナップ: </text> - <combo_box label="5 分" name="WLSnapOptions" /> + <combo_box label="5 分" name="WLSnapOptions"/> <text name="DayCycleText2"> サイクルã®é•·ã•: </text> - <spinner label="時間" name="WLLengthOfDayHour" /> - <spinner label="分" name="WLLengthOfDayMin" /> - <spinner label="ç§’" name="WLLengthOfDaySec" /> + <spinner label="時間" name="WLLengthOfDayHour"/> + <spinner label="分" name="WLLengthOfDayMin"/> + <spinner label="ç§’" name="WLLengthOfDaySec"/> <text name="DayCycleText3"> プレビュー: </text> - <button label="å†ç”Ÿ" label_selected="å†ç”Ÿ" name="WLAnimSky" /> - <button label="åœæ¢!" label_selected="åœæ¢" name="WLStopAnimSky" /> - <button label="ä¸å‹•ç”£ã®æ™‚刻を使用" - label_selected="ä¸å‹•ç”£ã®æ™‚刻ã«å¤‰æ›´" name="WLUseLindenTime" /> - <button label="デイ・テストをä¿å˜" - label_selected="デイ・テストをä¿å˜" name="WLSaveDayCycle" /> - <button label="デイ・テストをãƒãƒ¼ãƒ‰" - label_selected="デイ・テストをãƒãƒ¼ãƒ‰" name="WLLoadDayCycle" /> + <button label="å†ç”Ÿ" label_selected="å†ç”Ÿ" name="WLAnimSky"/> + <button label="åœæ¢" label_selected="åœæ¢" name="WLStopAnimSky"/> + <button label="ä¸å‹•ç”£ã®æ™‚刻を使用" label_selected="ä¸å‹•ç”£ã®æ™‚刻ã«å¤‰æ›´" name="WLUseLindenTime"/> + <button label="デイテストをä¿å˜" label_selected="デイテストをä¿å˜" name="WLSaveDayCycle"/> + <button label="デイテストをãƒãƒ¼ãƒ‰" label_selected="デイテストをãƒãƒ¼ãƒ‰" name="WLLoadDayCycle"/> </panel> </tab_container> </floater> diff --git a/indra/newview/skins/default/xui/ja/floater_event.xml b/indra/newview/skins/default/xui/ja/floater_event.xml new file mode 100644 index 0000000000..671f9077d9 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/floater_event.xml @@ -0,0 +1,69 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater label="イベント" name="Event" title="イベント詳細"> + <floater.string name="none"> + ãªã— + </floater.string> + <floater.string name="notify"> + 知らã›ã‚‹ + </floater.string> + <floater.string name="dont_notify"> + 知らã›ãªã„ + </floater.string> + <floater.string name="moderate"> + Moderate + </floater.string> + <floater.string name="adult"> + Adult + </floater.string> + <floater.string name="general"> + General + </floater.string> + <floater.string name="unknown"> + 䏿˜Ž + </floater.string> + <layout_stack name="layout"> + <layout_panel name="profile_stack"> + <text name="event_name"> + Nameless Event...of Doom! De doom! Doom doom. + </text> + <text name="event_category"> + (カテゴリãªã—) + </text> + <text name="event_runby_label"> + 主催者: + </text> + <text initial_value="(å–å¾—ä¸ï¼‰" name="event_runby"/> + <text name="event_date_label"> + 日付: + </text> + <text name="event_date"> + 10/10/2010 + </text> + <text name="event_duration_label"> + 期間: + </text> + <text name="event_duration"> + 1 時間 + </text> + <text name="event_covercharge_label"> + ã‚«ãƒãƒ¼ãƒãƒ£ãƒ¼ã‚¸ï¼š + </text> + <text name="event_cover"> + ç„¡æ–™ + </text> + <text name="event_location_label"> + å ´æ‰€ï¼š + </text> + <text name="event_location" value="SampleParcel, Name Long (145, 228, 26)"/> + <text name="rating_label" value="レーティング区分:"/> + <text name="rating_value" value="䏿˜Ž"/> + </layout_panel> + <layout_panel name="button_panel"> + <button name="create_event_btn" tool_tip="イベント作æˆ"/> + <button name="god_delete_event_btn" tool_tip="イベント削除"/> + <button label="知らã›ã‚‹" name="notify_btn"/> + <button label="テレãƒãƒ¼ãƒˆ" name="teleport_btn"/> + <button label="地図" name="map_btn"/> + </layout_panel> + </layout_stack> +</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_gesture.xml b/indra/newview/skins/default/xui/ja/floater_gesture.xml index a79854bcef..1ed5ad31db 100644 --- a/indra/newview/skins/default/xui/ja/floater_gesture.xml +++ b/indra/newview/skins/default/xui/ja/floater_gesture.xml @@ -9,7 +9,7 @@ <floater.string name="copy_name"> [COPY_NAME] ã®ã‚³ãƒ”ー </floater.string> - <scroll_list bottom_delta="-385" height="360" name="gesture_list"> + <scroll_list name="gesture_list"> <scroll_list.columns label="åå‰" name="name"/> <scroll_list.columns label="ãƒãƒ£ãƒƒãƒˆ" name="trigger"/> <scroll_list.columns label="" name="key"/> diff --git a/indra/newview/skins/default/xui/ja/floater_god_tools.xml b/indra/newview/skins/default/xui/ja/floater_god_tools.xml index 18380bddc2..9e5d473db7 100644 --- a/indra/newview/skins/default/xui/ja/floater_god_tools.xml +++ b/indra/newview/skins/default/xui/ja/floater_god_tools.xml @@ -2,12 +2,11 @@ <floater name="godtools floater" title="ゴッド・ツール"> <tab_container name="GodTools Tabs"> <panel label="グリッド" name="grid"> - <button label="ã™ã¹ã¦ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’追ã„出ã™" label_selected="ã™ã¹ã¦ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’追ã„出ã™" name="Kick all users"/> <button label="ã“ã®åœ°åŸŸã®åœ°å›³ã®è¡¨ç¤ºã‚ャッシュを消去" label_selected="ã“ã®åœ°åŸŸã®åœ°å›³ã®è¡¨ç¤ºã‚ャッシュを消去" name="Flush This Region's Map Visibility Caches"/> </panel> <panel label="地域" name="region"> - <text name="Sim Name:"> - シムå: + <text name="Region Name:"> + リージョンå: </text> <check_box label="準備" name="check prelude" tool_tip="ã“ã®è¨å®šã«ã‚ˆã‚Šã€ã“ã®åœ°åŸŸã®æº–備をã—ã¾ã™ã€‚"/> <check_box label="太陽固定" name="check fixed sun" tool_tip="太陽ä½ç½®ã‚’固定([地域ï¼ä¸å‹•産]>[地形]ã®å ´åˆã¨åŒæ§˜ï¼‰"/> @@ -15,7 +14,7 @@ <check_box label="å¯è¦–" name="check visible" tool_tip="ã“ã®è¨å®šã«ã‚ˆã‚Šã€ã“ã®åœ°åŸŸã‚’ゴッド・モード以外ã§ã‚‚å¯è¦–ã«ã—ã¾ã™ã€‚"/> <check_box label="ダメージ" name="check damage" tool_tip="ã“ã®è¨å®šã«ã‚ˆã‚Šã€ã“ã®åœ°åŸŸå†…ã§ãƒ€ãƒ¡ãƒ¼ã‚¸ã‚’有効化ã—ã¾ã™ã€‚"/> <check_box label="トラフィック・トラッã‚ングをブãƒãƒƒã‚¯" name="block dwell" tool_tip="ã“ã®è¨å®šã«ã‚ˆã‚Šã€ã“ã®åœ°åŸŸå†…ã®ãƒˆãƒ©ãƒ•ィック計算をオフã«ã—ã¾ã™ã€‚"/> - <check_box label="土地整備をブãƒãƒƒã‚¯" name="block terraform" tool_tip="ã“ã®è¨å®šã«ã‚ˆã‚Šã€ã“ã®åœ°åŸŸå†…ã§ã®åœŸåœ°æ•´å‚™ã‚’ç¦æ¢"/> + <check_box label="地形編集をブãƒãƒƒã‚¯" name="block terraform" tool_tip="ã“ã®è¨å®šã«ã‚ˆã‚Šã€ã“ã®åœ°åŸŸå†…ã§ã®åœŸåœ°æ•´å‚™ã‚’ç¦æ¢"/> <check_box label="サンドボックス" name="is sandbox" tool_tip="ã“れãŒã‚µãƒ³ãƒ‰ãƒœãƒƒã‚¯ã‚¹åœ°åŸŸã§ã‚‚切り替ãˆ"/> <button label="地形を構築ã™ã‚‹" label_selected="地形を構築ã™ã‚‹" name="Bake Terrain" tool_tip="ç¾åœ¨ã®åœ°å½¢ã‚’デフォルトã¨ã—ã¦ä¿å˜ã—ã¾ã™ã€‚"/> <button label="åœ°å½¢ã‚’å…ƒã«æˆ»ã™" label_selected="åœ°å½¢ã‚’å…ƒã«æˆ»ã™" name="Revert Terrain" tool_tip="ç¾åœ¨ã®åœ°å½¢ã‚’デフォルトã«ç½®æ›ã—ã¾ã™ã€‚"/> @@ -33,13 +32,15 @@ <line_editor name="gridposx" tool_tip="ã“れã¯ã€ã“ã®åœ°åŸŸã®ã‚°ãƒªãƒƒãƒ‰xã®ä½ç½®ã§ã™ã€‚"/> <line_editor name="gridposy" tool_tip="ã“れã¯ã€ã“ã®åœ°åŸŸã®ã‚°ãƒªãƒƒãƒ‰yã®ä½ç½®ã§ã™ã€‚"/> <text name="Redirect to Grid: "> - グリッドã«ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆï¼š + グリッドã«ãƒªãƒ€ +イレクト: </text> <text name="billable factor text"> 請求率: </text> <text name="land cost text"> - 平方メートル当ãŸã‚ŠL$: + 平方メートル当 +ãŸã‚ŠL$: </text> <button label="æ›´æ–°" label_selected="æ›´æ–°" name="Refresh" tool_tip="ä¸Šè¨˜ã®æƒ…å ±ã‚’æ›´æ–°ã™ã‚‹ã«ã¯ã€ã“ã“をクリックã—ã¾ã™ã€‚"/> <button label="é©ç”¨" label_selected="é©ç”¨" name="Apply" tool_tip="上記ã®å¤‰æ›´ã‚’é©ç”¨ã™ã‚‹ã«ã¯ã€ã“ã“をクリックã—ã¾ã™ã€‚"/> @@ -50,8 +51,8 @@ <panel.string name="no_target"> (ターゲットãªã—) </panel.string> - <text name="Sim Name:"> - シムå: + <text name="Region Name:"> + リージョンå: </text> <text name="region name"> ウェルシュ diff --git a/indra/newview/skins/default/xui/ja/floater_help_browser.xml b/indra/newview/skins/default/xui/ja/floater_help_browser.xml index 0a783713d5..15200d7ef7 100644 --- a/indra/newview/skins/default/xui/ja/floater_help_browser.xml +++ b/indra/newview/skins/default/xui/ja/floater_help_browser.xml @@ -1,14 +1,9 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="floater_help_browser" title="ヘルプブラウザ"> - <floater.string name="home_page_url"> - http://jp.secondlife.com - </floater.string> - <floater.string name="support_page_url"> - http://jp.secondlife.com/support + <floater.string name="loading_text"> + ãƒãƒ¼ãƒ‡ã‚£ãƒ³ã‚°... </floater.string> <layout_stack name="stack1"> - <layout_panel name="external_controls"> - <button label="Web ブラウザã§é–‹ã" name="open_browser"/> - </layout_panel> + <layout_panel name="external_controls"/> </layout_stack> </floater> diff --git a/indra/newview/skins/default/xui/ja/floater_im.xml b/indra/newview/skins/default/xui/ja/floater_im.xml index 9c323f25e6..2e8993ec21 100644 --- a/indra/newview/skins/default/xui/ja/floater_im.xml +++ b/indra/newview/skins/default/xui/ja/floater_im.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <multi_floater name="im_floater" title="インスタント・メッセージ"> <string name="only_user_message"> - ã“ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ã„るユーザーã¯ã‚ãªãŸã ã‘ã§ã™ã€‚ + ã“ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ã¯ã€ã‚ãªãŸã—ã‹ã„ã¾ã›ã‚“。 </string> <string name="offline_message"> [FIRST] [LAST]ã¯ã‚ªãƒ•ラインã§ã™ã€‚ @@ -32,7 +32,7 @@ </string> <!-- ALL of the event strings should have [RECIPIENT] in them --> <string name="add_session_event"> - [RECIPIENT] ã¨ã®ãƒãƒ£ãƒƒãƒˆãƒ»ã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’è¿½åŠ ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ + [RECIPIENT] ã¨ã®ãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ä½äººã‚’è¿½åŠ ã§ãã¾ã›ã‚“。 </string> <string name="message_session_event"> [RECIPIENT] ã¨ã®ãƒãƒ£ãƒƒãƒˆãƒ»ã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ diff --git a/indra/newview/skins/default/xui/ja/floater_im_container.xml b/indra/newview/skins/default/xui/ja/floater_im_container.xml index 1d028258ec..06b65e27f0 100644 --- a/indra/newview/skins/default/xui/ja/floater_im_container.xml +++ b/indra/newview/skins/default/xui/ja/floater_im_container.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<multi_floater name="floater_im_box" title="æ›ç®—"/> +<multi_floater name="floater_im_box" title="会話"/> diff --git a/indra/newview/skins/default/xui/ja/floater_image_preview.xml b/indra/newview/skins/default/xui/ja/floater_image_preview.xml index 57ed139e54..1ffc27fd70 100644 --- a/indra/newview/skins/default/xui/ja/floater_image_preview.xml +++ b/indra/newview/skins/default/xui/ja/floater_image_preview.xml @@ -7,26 +7,26 @@ 説明: </text> <text name="preview_label"> - イメージã®ï¾Œï¾Ÿï¾šï¾‹ï¾žï½ï½°ï¼š + プレビュー: </text> <combo_box label="æœã®ç¨®é¡ž" name="clothing_type_combo"> - <combo_box.item label="ç”»åƒ" name="Image"/> - <combo_box.item label="髪" name="Hair"/> - <combo_box.item label="女性ã®é " name="FemaleHead"/> - <combo_box.item label="女性ã®ä¸ŠåŠèº«" name="FemaleUpperBody"/> - <combo_box.item label="女性ã®ä¸‹åŠèº«" name="FemaleLowerBody"/> - <combo_box.item label="男性ã®é " name="MaleHead"/> - <combo_box.item label="男性ã®ä¸ŠåŠèº«" name="MaleUpperBody"/> - <combo_box.item label="男性ã®ä¸‹åŠèº«" name="MaleLowerBody"/> - <combo_box.item label="スカート" name="Skirt"/> - <combo_box.item label="スカルプトプリム" name="SculptedPrim"/> + <item label="ç”»åƒ" name="Image" value="ç”»åƒ"/> + <item label="髪" name="Hair" value="髪"/> + <item label="女性ã®é " name="FemaleHead" value="女性ã®é "/> + <item label="女性ã®ä¸ŠåŠèº«" name="FemaleUpperBody" value="女性ã®ä¸ŠåŠèº«"/> + <item label="女性ã®ä¸‹åŠèº«" name="FemaleLowerBody" value="女性ã®ä¸‹åŠèº«"/> + <item label="男性ã®é " name="MaleHead" value="男性ã®é "/> + <item label="男性ã®ä¸ŠåŠèº«" name="MaleUpperBody" value="男性ã®ä¸ŠåŠèº«"/> + <item label="男性ã®ä¸‹åŠèº«" name="MaleLowerBody" value="男性ã®ä¸‹åŠèº«"/> + <item label="スカート" name="Skirt" value="スカート"/> + <item label="スカルプトプリム" name="SculptedPrim" value="スカルプトプリム"/> </combo_box> <text name="bad_image_text"> イメージをèªã¿å–れã¾ã›ã‚“。 24bitTarga(.tga)ã§ã‚¤ãƒ¡ãƒ¼ã‚¸ã‚’ä¿å˜ã—ã¦ãã ã•ã„。 </text> - <check_box label="ãƒã‚¹ã®ãªã„圧縮を使用" name="lossless_check"/> + <check_box label="å¯é€†åœ§ç¸®" name="lossless_check"/> <button label="å–り消ã—" name="cancel_btn"/> - <button label="アップロードL$[AMOUNT]" name="ok_btn"/> + <button label="アップãƒãƒ¼ãƒ‰ï¾žL$[AMOUNT]" name="ok_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/ja/floater_incoming_call.xml b/indra/newview/skins/default/xui/ja/floater_incoming_call.xml index 04013799ec..8e5177d6fe 100644 --- a/indra/newview/skins/default/xui/ja/floater_incoming_call.xml +++ b/indra/newview/skins/default/xui/ja/floater_incoming_call.xml @@ -16,7 +16,13 @@ ãŒã‚³ãƒ³ãƒ•ァレンスãƒãƒ£ãƒƒãƒˆã§ã€ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã«å‚åŠ ã—ã¾ã—ãŸã€‚ </floater.string> <floater.string name="VoiceInviteGroup"> - 㯠[GROUP]. ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã‚³ãƒ¼ãƒ«ã«å‚åŠ ã—ã¾ã—ãŸã€‚ + '[GROUP]'ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒãƒ«ã«å‚åŠ ãªã•ã„ã¾ã—ãŸã€‚ + </floater.string> + <floater.string name="VoiceInviteQuestionGroup"> + [CURRENT_CHAT]を退å¸ã—ã¦ã€'[GROUP]'ã¨ã®ãƒãƒ£ãƒƒãƒˆã«å‚åŠ ã—ã¾ã™ã‹ï¼Ÿ + </floater.string> + <floater.string name="VoiceInviteQuestionDefault"> + [CURRENT_CHAT]を退å¸ã—ã¦ã€ã“ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã«å‚åŠ ã—ã¾ã™ã‹ï¼Ÿ </floater.string> <text name="question"> [CURRENT_CHAT] を退å¸ã—ã¦ã€ã“ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã«å‚åŠ ã—ã¾ã™ã‹ï¼Ÿ diff --git a/indra/newview/skins/default/xui/ja/floater_inspect.xml b/indra/newview/skins/default/xui/ja/floater_inspect.xml index b7c657c2f9..b3825c0b7f 100644 --- a/indra/newview/skins/default/xui/ja/floater_inspect.xml +++ b/indra/newview/skins/default/xui/ja/floater_inspect.xml @@ -3,12 +3,12 @@ <floater.string name="timeStamp"> [year,datetime,local] [mth,datetime,local] [day,datetime,local] [wkday,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] </floater.string> - <scroll_list name="object_list" tool_tip="ã“ã®ãƒªã‚¹ãƒˆã‹ã‚‰ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã€ã“ã®ä¸–界ã§å¼·èª¿è¡¨ç¤ºã—ã¾ã™ã€‚"> - <scroll_list.columns label="オブジェクトå" name="object_name"/> + <scroll_list name="object_list" tool_tip="リストã‹ã‚‰ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã€ã‚¤ãƒ³ãƒ¯ãƒ¼ãƒ«ãƒ‰ã§å¼·èª¿è¡¨ç¤ºã—ã¾ã™ã€‚"> + <scroll_list.columns label="åå‰" name="object_name"/> <scroll_list.columns label="所有者å" name="owner_name"/> <scroll_list.columns label="制作者å" name="creator_name"/> <scroll_list.columns label="ä½œæˆæ—¥" name="creation_date"/> </scroll_list> - <button label="所有者ã®ãƒ—ãƒãƒ•ィールを表示..." name="button owner" tool_tip="é¸æŠžã•れãŸã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æ‰€æœ‰è€…ã®ãƒ—ãƒãƒ•ィールを見る"/> - <button label="制作者ã®ãƒ—ãƒãƒ•ィールを表示..." name="button creator" tool_tip="é¸æŠžã•れãŸã‚ªãƒ–ジェクトã®åˆ¶ä½œè€…ã®ãƒ—ãƒãƒ•ィールを見る"/> + <button label="所有者ã®ãƒ—ãƒãƒ•ィールを表示..." name="button owner" tool_tip="é¸æŠžã—ãŸã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æ‰€æœ‰è€…ã®ãƒ—ãƒãƒ•ィールを表示ã—ã¾ã™" width="180"/> + <button label="制作者ã®ãƒ—ãƒãƒ•ィールを表示..." name="button creator" tool_tip="é¸æŠžã—ãŸã‚ªãƒ–ジェクトã®åˆ¶ä½œè€…ã®ãƒ—ãƒãƒ•ィールを表示ã—ã¾ã™" width="180"/> </floater> diff --git a/indra/newview/skins/default/xui/ja/floater_inventory.xml b/indra/newview/skins/default/xui/ja/floater_inventory.xml index 7cf16b8ff2..b113fde94a 100644 --- a/indra/newview/skins/default/xui/ja/floater_inventory.xml +++ b/indra/newview/skins/default/xui/ja/floater_inventory.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="Inventory" title="æŒã¡ç‰©"> <floater.string name="Title"> - インベントリ + æŒã¡ç‰© </floater.string> <floater.string name="TitleFetching"> æŒã¡ç‰© ( [ITEM_COUNT] アイテムをå–å¾—ä¸...) [FILTER] diff --git a/indra/newview/skins/default/xui/ja/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/ja/floater_inventory_view_finder.xml index 86bb5dcf62..47a63e5e20 100644 --- a/indra/newview/skins/default/xui/ja/floater_inventory_view_finder.xml +++ b/indra/newview/skins/default/xui/ja/floater_inventory_view_finder.xml @@ -9,7 +9,7 @@ <check_box label="オブジェクト" name="check_object"/> <check_box label="スクリプト" name="check_script"/> <check_box label="サウンド" name="check_sound"/> - <check_box label="テクスãƒãƒ£ãƒ¼" name="check_texture"/> + <check_box label="テクスãƒãƒ£" name="check_texture"/> <check_box label="スナップショット" name="check_snapshot"/> <button label="ã™ã¹ã¦" label_selected="ã™ã¹ã¦" name="All"/> <button label="ãªã—" label_selected="ãªã—" name="None"/> diff --git a/indra/newview/skins/default/xui/ja/floater_joystick.xml b/indra/newview/skins/default/xui/ja/floater_joystick.xml index 9d91fe8db9..daa480ef5a 100644 --- a/indra/newview/skins/default/xui/ja/floater_joystick.xml +++ b/indra/newview/skins/default/xui/ja/floater_joystick.xml @@ -71,7 +71,7 @@ <spinner left="135" name="AvatarAxisDeadZone0" width="50"/> <spinner left="205" name="BuildAxisDeadZone0" width="50"/> <spinner left="275" name="FlycamAxisDeadZone0" width="50"/> - <text left="0" name="PitchDeadZone" width="135"> + <text left="0" name="PitchDeadZone" width="125"> ピッãƒãƒ»ãƒ‡ãƒƒãƒ‰ãƒ»ã‚¾ãƒ¼ãƒ³ </text> <spinner left="135" name="AvatarAxisDeadZone4" width="50"/> @@ -83,13 +83,13 @@ <spinner left="135" name="AvatarAxisDeadZone5" width="50"/> <spinner left="205" name="BuildAxisDeadZone5" width="50"/> <spinner left="275" name="FlycamAxisDeadZone5" width="50"/> - <text left="0" name="RollDeadZone" width="135"> + <text left="0" name="RollDeadZone" width="125"> ãƒãƒ¼ãƒ«ãƒ»ãƒ‡ãƒƒãƒ‰ãƒ»ã‚¾ãƒ¼ãƒ³ </text> <spinner left="205" name="BuildAxisDeadZone3" width="50"/> <spinner left="275" name="FlycamAxisDeadZone3" width="50"/> <text name="Feathering"> - 羽毛 + 感度調整 </text> <slider label="" left="126" name="AvatarFeathering" width="67"/> <slider label="" left="196" name="BuildFeathering" width="67"/> diff --git a/indra/newview/skins/default/xui/ja/floater_land_holdings.xml b/indra/newview/skins/default/xui/ja/floater_land_holdings.xml index 474bd32cb0..aca916f22f 100644 --- a/indra/newview/skins/default/xui/ja/floater_land_holdings.xml +++ b/indra/newview/skins/default/xui/ja/floater_land_holdings.xml @@ -7,17 +7,17 @@ <column label="é¢ç©" name="area"/> <column label="" name="hidden"/> </scroll_list> - <button label="テレãƒãƒ¼ãƒˆ" label_selected="テレãƒãƒ¼ãƒˆ" name="Teleport" tool_tip="ã“ã®åœŸåœ°ã®ä¸å¿ƒã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ"/> + <button label="テレãƒãƒ¼ãƒˆ" label_selected="テレãƒãƒ¼ãƒˆ" name="Teleport" tool_tip="ã“ã®åœŸåœ°ã®ä¸å¿ƒã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™"/> <button label="地図" label_selected="地図" name="Show on Map" tool_tip="ã“ã®åœŸåœ°ã‚’世界地図ã«è¡¨ç¤ºã—ã¾ã™"/> <text name="contrib_label"> - ã‚ãªãŸã®ã‚°ãƒ«ãƒ¼ãƒ—ã¸ã®è²¢çŒ®ï¼š + 所属グループã¸ã®è²¢çŒ®ï¼š </text> <scroll_list name="grant list"> <column label="グループå" name="group"/> <column label="é¢ç©" name="area"/> </scroll_list> <text name="allowed_label"> - ç¾åœ¨ã®æ”¯æ‰•ã„プランã§ã®è¨±å¯ã•れãŸä¿æœ‰åœ°ï¼š + ç¾åœ¨ã®æ”¯æ‰•ã„プランã§è¨±å¯ã•れãŸä¿æœ‰åœ°ï¼š </text> <text name="allowed_text"> [AREA] 平方メートル @@ -29,7 +29,7 @@ [AREA] 平方メートル </text> <text name="available_label"> - 土地購入å¯ï¼š + 購入å¯èƒ½ãªåœŸåœ°ï¼š </text> <text name="available_text"> [AREA] 平方メートル diff --git a/indra/newview/skins/default/xui/ja/floater_map.xml b/indra/newview/skins/default/xui/ja/floater_map.xml index f3cba7e674..79e211c31e 100644 --- a/indra/newview/skins/default/xui/ja/floater_map.xml +++ b/indra/newview/skins/default/xui/ja/floater_map.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Map"> +<floater name="Map" title=""> <floater.string name="mini_map_north"> 北 </floater.string> @@ -25,7 +25,7 @@ 北西 </floater.string> <floater.string name="ToolTipMsg"> - [AGENT][REGION] (ダブルクリックã§åœ°å›³ã‚’é–‹ã) + [AGENT][REGION] (ダブルクリックã§åœ°å›³ã‚’é–‹ãã¾ã™ï¼‰ </floater.string> <text label="北" name="floater_map_north" text="北"> 北 diff --git a/indra/newview/skins/default/xui/ja/floater_media_browser.xml b/indra/newview/skins/default/xui/ja/floater_media_browser.xml index 4f67523eec..c4731b73a3 100644 --- a/indra/newview/skins/default/xui/ja/floater_media_browser.xml +++ b/indra/newview/skins/default/xui/ja/floater_media_browser.xml @@ -22,8 +22,8 @@ <button label="ç¾åœ¨ã®ãƒšãƒ¼ã‚¸ã‚’区画ã«é€ã‚‹" name="assign"/> </layout_panel> <layout_panel name="external_controls"> - <button label="外部ウェブ・ブラウザã§é–‹ã" name="open_browser"/> - <check_box label="常ã«å¤–部ã®ã‚¦ã‚§ãƒ–・ブラウザã§é–‹ã" name="open_always"/> + <button label="外部Webブラウザã§é–‹ã" name="open_browser"/> + <check_box label="常ã«å¤–部ã®Webブラウザã§é–‹ã" name="open_always"/> <button label="é–‰ã˜ã‚‹" name="close"/> </layout_panel> </layout_stack> diff --git a/indra/newview/skins/default/xui/ja/floater_mem_leaking.xml b/indra/newview/skins/default/xui/ja/floater_mem_leaking.xml index 6167b6db91..f48bb94e32 100644 --- a/indra/newview/skins/default/xui/ja/floater_mem_leaking.xml +++ b/indra/newview/skins/default/xui/ja/floater_mem_leaking.xml @@ -1,9 +1,9 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="MemLeak" title="メモリリークã®ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ãƒˆ"> - <spinner label="リークスピード(1フレームã”ã¨ã®ãƒã‚¤ãƒˆæ•°):" label_width="244" name="leak_speed"/> - <spinner label="リークã—ãŸæœ€å¤§ãƒ¡ãƒ¢ãƒªæ•°(MB):" label_width="244" name="max_leak"/> + <spinner label="リーク速度(1フレームã”ã¨ã®ãƒã‚¤ãƒˆæ•°):" label_width="244" name="leak_speed"/> + <spinner label="最大メモリリーク(MB):" label_width="244" name="max_leak"/> <text name="total_leaked_label"> - ç¾åœ¨ã®ãƒªãƒ¼ã‚¯ãƒ¡ãƒ¢ãƒªã‚µã‚¤ã‚ºï¼š [SIZE] KB + ç¾åœ¨ã®ãƒ¡ãƒ¢ãƒªãƒªãƒ¼ã‚¯ï¼š [SIZE] KB </text> <text name="note_label_1"> [NOTE1] diff --git a/indra/newview/skins/default/xui/ja/floater_moveview.xml b/indra/newview/skins/default/xui/ja/floater_moveview.xml index 8ba297c7a0..57ab32f486 100644 --- a/indra/newview/skins/default/xui/ja/floater_moveview.xml +++ b/indra/newview/skins/default/xui/ja/floater_moveview.xml @@ -6,23 +6,64 @@ <string name="walk_back_tooltip"> 後ã‚ã«æ©ã(下矢å°ã‹ S を押ã™ï¼‰ </string> + <string name="walk_left_tooltip"> + å·¦ã«æ°´å¹³ç§»å‹•(Shift + 左矢å°ã‹ A を押ã™ï¼‰ + </string> + <string name="walk_right_tooltip"> + å³ã«æ°´å¹³ç§»å‹•(Shift + å³çŸ¢å°ã‹ D を押ã™ï¼‰ + </string> <string name="run_forward_tooltip"> å‰ã«èµ°ã‚‹ï¼ˆä¸ŠçŸ¢å°ã‹ W を押ã™ï¼‰ </string> <string name="run_back_tooltip"> 後ã‚ã«èµ°ã‚‹ï¼ˆä¸‹çŸ¢å°ã‹ S を押ã™ï¼‰ </string> + <string name="run_left_tooltip"> + å·¦ã«æ°´å¹³ç§»å‹•(Shift + 左矢å°ã‹ A を押ã™ï¼‰ + </string> + <string name="run_right_tooltip"> + å³ã«æ°´å¹³ç§»å‹•(Shift + å³çŸ¢å°ã‹ D を押ã™ï¼‰ + </string> <string name="fly_forward_tooltip"> å‰ã«é£›ã¶ï¼ˆä¸ŠçŸ¢å°ã‹ W を押ã™ï¼‰ </string> <string name="fly_back_tooltip"> 後ã‚ã«é£›ã¶ï¼ˆä¸‹çŸ¢å°ã‹ S を押ã™ï¼‰ </string> + <string name="fly_left_tooltip"> + å·¦ã«æ°´å¹³ç§»å‹•(Shift + 左矢å°ã‹ A を押ã™ï¼‰ + </string> + <string name="fly_right_tooltip"> + å³ã«æ°´å¹³ç§»å‹•(Shift + å³çŸ¢å°ã‹ D を押ã™ï¼‰ + </string> + <string name="fly_up_tooltip"> + 上ã«ç§»å‹•(E を押ã™ï¼‰ + </string> + <string name="fly_down_tooltip"> + 下ã«ç§»å‹•(C を押ã™ï¼‰ + </string> + <string name="jump_tooltip"> + ジャンプ(E を押ã™ï¼‰ + </string> + <string name="crouch_tooltip"> + ã‹ãŒã‚€ï¼ˆC を押ã™ï¼‰ + </string> + <string name="walk_title"> + æ©ã + </string> + <string name="run_title"> + èµ°ã‚‹ + </string> + <string name="fly_title"> + 飛㶠+ </string> <panel name="panel_actions"> + <button label="" label_selected="" name="move up btn" tool_tip="上ã«ç§»å‹•(E を押ã™ï¼‰"/> <button label="" label_selected="" name="turn left btn" tool_tip="左をå‘ã(左矢å°ã‹ A を押ã™ï¼‰"/> + <joystick_slide name="move left btn" tool_tip="å·¦ã«æ©ã(Shift + 左矢å°ã‹ A を押ã™ï¼‰"/> + <button label="" label_selected="" name="move down btn" tool_tip="下ã«ç§»å‹•(C を押ã™ï¼‰"/> <button label="" label_selected="" name="turn right btn" tool_tip="å³ã‚’å‘ã(å³çŸ¢å°ã‹ D を押ã™ï¼‰"/> - <button label="" label_selected="" name="move up btn" tool_tip="飛ã¶ãƒ»E を押ã™"/> - <button label="" label_selected="" name="move down btn" tool_tip="ç€åœ°ãƒ»C を押ã™"/> + <joystick_slide name="move right btn" tool_tip="å³ã«æ©ã(Shift + å³çŸ¢å°ã‹ D を押ã™ï¼‰"/> <joystick_turn name="forward btn" tool_tip="å‰ã«é€²ã‚€ï¼ˆä¸ŠçŸ¢å°ã‹ W を押ã™ï¼‰"/> <joystick_turn name="backward btn" tool_tip="後ã‚ã«æ©ã(下矢å°ã‹ S を押ã™ï¼‰"/> </panel> @@ -30,6 +71,5 @@ <button label="" name="mode_walk_btn" tool_tip="æ©è¡Œãƒ¢ãƒ¼ãƒ‰"/> <button label="" name="mode_run_btn" tool_tip="走行モード"/> <button label="" name="mode_fly_btn" tool_tip="飛行モード"/> - <button label="é£›è¡Œåœæ¢" name="stop_fly_btn" tool_tip="é£›è¡Œåœæ¢"/> </panel> </floater> diff --git a/indra/newview/skins/default/xui/ja/floater_outfit_save_as.xml b/indra/newview/skins/default/xui/ja/floater_outfit_save_as.xml index a869b106ce..70555e6ded 100644 --- a/indra/newview/skins/default/xui/ja/floater_outfit_save_as.xml +++ b/indra/newview/skins/default/xui/ja/floater_outfit_save_as.xml @@ -1,11 +1,12 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="modal container"> +<floater name="modal container" title="アウトフィットをä¿å˜ã™ã‚‹"> <button label="ä¿å˜" label_selected="ä¿å˜" name="Save"/> <button label="ã‚ャンセル" label_selected="ã‚ャンセル" name="Cancel"/> <text name="Save item as:"> - アウトフィットを別åã§ä¿å˜ï¼š + ç€ç”¨ã—ã¦ã„ã‚‹ã‚‚ã®ã‚’ +æ–°ã—ã„アウトフィットã«ä¿å˜ï¼š </text> <line_editor name="name ed"> - [DESC] + [DESC] (新) </line_editor> </floater> diff --git a/indra/newview/skins/default/xui/ja/floater_outgoing_call.xml b/indra/newview/skins/default/xui/ja/floater_outgoing_call.xml index 8d67108b77..f1a05e0eec 100644 --- a/indra/newview/skins/default/xui/ja/floater_outgoing_call.xml +++ b/indra/newview/skins/default/xui/ja/floater_outgoing_call.xml @@ -25,10 +25,13 @@ 繋ãŒã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ ã‚ã¨ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 </text> <text name="nearby"> - [VOICE_CHANNEL_NAME] ã¸ã®æŽ¥ç¶šãŒåˆ‡ã‚Œã¾ã—ãŸã€‚ 「近ãã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã€ã«å†æŽ¥ç¶šã•れã¾ã™ã€‚ + [VOICE_CHANNEL_NAME] ã¸ã®æŽ¥ç¶šãŒåˆ‡ã‚Œã¾ã—ãŸã€‚ [RECONNECT_NEARBY] </text> - <text name="nearby_P2P"> - [VOICE_CHANNEL_NAME] ãŒã‚³ãƒ¼ãƒ«ã‚’終了ã—ã¾ã—ãŸã€‚ 「近ãã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã€ã«å†æŽ¥ç¶šã•れã¾ã™ã€‚ + <text name="nearby_P2P_by_other"> + コールを切りã¾ã—ãŸã€‚ [RECONNECT_NEARBY] + </text> + <text name="nearby_P2P_by_agent"> + コールを終了ã—ã¾ã—ãŸã€‚ [RECONNECT_NEARBY] </text> <text name="leaving"> [CURRENT_CHAT] を終了ã—ã¾ã™ã€‚ diff --git a/indra/newview/skins/default/xui/ja/floater_pay.xml b/indra/newview/skins/default/xui/ja/floater_pay.xml index 4564354899..39bc37bc6c 100644 --- a/indra/newview/skins/default/xui/ja/floater_pay.xml +++ b/indra/newview/skins/default/xui/ja/floater_pay.xml @@ -7,7 +7,7 @@ ä½äººã«æ”¯æ‰•ㆠ</string> <text name="payee_label"> - 支払ã„: + 支払ã†ï¼š </text> <icon name="icon_person" tool_tip="ä½äºº"/> <text name="payee_name"> @@ -20,6 +20,6 @@ <text name="amount text"> 金é¡ã‚’指定: </text> - <button label="支払ã„" label_selected="支払ã„" name="pay btn"/> + <button label="支払ã†" label_selected="支払ã†" name="pay btn"/> <button label="å–り消ã—" label_selected="å–り消ã—" name="cancel btn"/> </floater> diff --git a/indra/newview/skins/default/xui/ja/floater_perm_prefs.xml b/indra/newview/skins/default/xui/ja/floater_perm_prefs.xml index adbb8596d3..98cda25a81 100644 --- a/indra/newview/skins/default/xui/ja/floater_perm_prefs.xml +++ b/indra/newview/skins/default/xui/ja/floater_perm_prefs.xml @@ -5,11 +5,11 @@ <check_box label="グループã§å…±åŒç®¡ç†" name="share_with_group"/> <check_box label="誰ã«å¯¾ã—ã¦ã‚‚コピーを許å¯" name="everyone_copy"/> <text name="NextOwnerLabel"> - 次ã®ã‚ªãƒ¼ãƒŠãƒ¼ãŒã§ãã‚‹æ“作: + æ¬¡ã®æ‰€æœ‰è€…ãŒã§ãã‚‹æ“作: </text> <check_box label="ä¿®æ£" name="next_owner_modify"/> <check_box label="コピー" name="next_owner_copy"/> - <check_box label="å†è²©/プレゼント" name="next_owner_transfer"/> + <check_box label="å†è²©ãƒ»ãƒ—レゼント" name="next_owner_transfer"/> </panel> <button label="OK" label_selected="OK" name="ok"/> <button label="å–り消ã—" label_selected="å–り消ã—" name="cancel"/> diff --git a/indra/newview/skins/default/xui/ja/floater_postcard.xml b/indra/newview/skins/default/xui/ja/floater_postcard.xml index b2ca059ccd..9d9b59fa51 100644 --- a/indra/newview/skins/default/xui/ja/floater_postcard.xml +++ b/indra/newview/skins/default/xui/ja/floater_postcard.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Postcard" title="スナップショットをメール"> +<floater name="Postcard" title="スナップショットをEメールã§é€ä¿¡"> <text name="to_label"> - ä½äººã®Eメール: + å—ä¿¡å…ˆã®Eメール: </text> <line_editor left="145" name="to_form" width="125"/> <text name="from_label"> @@ -15,14 +15,14 @@ <text name="subject_label"> ä»¶å: </text> - <line_editor label="ä»¶åã‚’ã“ã“ã«å…¥åŠ›" left="145" name="subject_form" width="125"/> + <line_editor label="ä»¶åを入力ã—ã¦ãã ã•ã„" left="145" name="subject_form" width="125"/> <text name="msg_label"> メッセージ: </text> <text_editor bottom_delta="-120" height="110" name="msg_form"> メッセージをã“ã“ã«å…¥åŠ›ã—ã¦ãã ã•ã„。 </text_editor> - <check_box label="ウェブ上ã§å…¬é–‹" name="allow_publish_check" tool_tip="ã“ã®ãƒã‚¹ãƒˆã‚«ãƒ¼ãƒ‰ã‚’ウェブ上ã§å…¬é–‹ã—ã¾ã™ã€‚"/> + <check_box label="Web上ã§å…¬é–‹" name="allow_publish_check" tool_tip="ã“ã®ãƒã‚¹ãƒˆã‚«ãƒ¼ãƒ‰ã‚’Web上ã§å…¬é–‹ã—ã¾ã™ã€‚"/> <check_box label="æˆäººå‘ã‘コンテンツ" name="mature_check" tool_tip="ã“ã®ãƒã‚¹ãƒˆã‚«ãƒ¼ãƒ‰ã«ã¯æˆäººå‘ã‘内容ãŒå«ã¾ã‚Œã¾ã™ã€‚"/> <button label="?" left="300" name="publish_help_btn"/> <text name="fine_print"> diff --git a/indra/newview/skins/default/xui/ja/floater_preferences.xml b/indra/newview/skins/default/xui/ja/floater_preferences.xml index 1493219b83..6ba27b71a6 100644 --- a/indra/newview/skins/default/xui/ja/floater_preferences.xml +++ b/indra/newview/skins/default/xui/ja/floater_preferences.xml @@ -6,9 +6,9 @@ <panel label="一般" name="general"/> <panel label="グラフィック" name="display"/> <panel label="プライãƒã‚·ãƒ¼" name="im"/> - <panel label="サウンド" name="audio"/> + <panel label="サウンドã¨ãƒ¡ãƒ‡ã‚£ã‚¢" name="audio"/> <panel label="ãƒãƒ£ãƒƒãƒˆ" name="chat"/> - <panel label="通知" name="msgs"/> + <panel label="メッセージ" name="msgs"/> <panel label="セットアップ" name="input"/> <panel label="詳細" name="advanced1"/> </tab_container> diff --git a/indra/newview/skins/default/xui/ja/floater_preview_animation.xml b/indra/newview/skins/default/xui/ja/floater_preview_animation.xml index fb2f2c7433..4fc59e16d3 100644 --- a/indra/newview/skins/default/xui/ja/floater_preview_animation.xml +++ b/indra/newview/skins/default/xui/ja/floater_preview_animation.xml @@ -6,6 +6,6 @@ <text name="desc txt"> 説明: </text> - <button label="世界ã§å†ç”Ÿ" label_selected="åœæ¢" name="Anim play btn" tool_tip="他人ã«è¦‹ãˆã‚‹ã‚ˆã†ã«å†ç”Ÿ"/> - <button label="ãƒãƒ¼ã‚«ãƒ«ã«å†ç”Ÿ" label_selected="åœæ¢" name="Anim audition btn" tool_tip="自分ã ã‘ãŒè¦‹ãˆã‚‹ã‚ˆã†ã«å†ç”Ÿ"/> + <button label="インワールドã§å†ç”Ÿ" label_selected="åœæ¢" name="Anim play btn" tool_tip="他人ã«ã‚‚見ãˆã‚‹ã‚ˆã†ã«å†ç”Ÿã—ã¾ã™"/> + <button label="ãƒãƒ¼ã‚«ãƒ«å†ç”Ÿ" label_selected="åœæ¢" name="Anim audition btn" tool_tip="自分ã ã‘ãŒè¦‹ãˆã‚‹ã‚ˆã†ã«å†ç”Ÿã—ã¾ã™"/> </floater> diff --git a/indra/newview/skins/default/xui/ja/floater_preview_gesture.xml b/indra/newview/skins/default/xui/ja/floater_preview_gesture.xml index a378700d15..64c577b879 100644 --- a/indra/newview/skins/default/xui/ja/floater_preview_gesture.xml +++ b/indra/newview/skins/default/xui/ja/floater_preview_gesture.xml @@ -33,12 +33,12 @@ <text name="trigger_label"> トリガー: </text> - <text name="replace_text" tool_tip="トリガー・ワードをã“れらã®å˜èªžã«ç½®ãæ›ãˆã¾ã™ã€‚ ãŸã¨ãˆã°ã€ãƒˆãƒªã‚¬ãƒ¼ã€Œhelloã€ã‚’「Howdyã€ã«ç½®æ›ã™ã‚‹ã¨ã€ã€ŒI wanted to say helloã€ã¨ã„ã†ãƒãƒ£ãƒƒãƒˆæ–‡ãŒã€ŒI wanted to say howdyã€ã«å¤‰ã‚りã€ã‚¸ã‚§ã‚¹ãƒãƒ£ãƒ¼ã«ã‚‚ç½®æ›ãŒåæ˜ ã•れã¾ã™ã€‚"> + <text name="replace_text" tool_tip="トリガーワードをã“れらã®å˜èªžã«ç½®ãæ›ãˆã¾ã™ã€‚ ãŸã¨ãˆã°ã€ãƒˆãƒªã‚¬ãƒ¼ã€Œhelloã€ã‚’「Howdyã€ã«ç½®æ›ã™ã‚‹ã¨ã€ã€ŒI wanted to say helloã€ã¨ã„ã†ãƒãƒ£ãƒƒãƒˆæ–‡ãŒã€ŒI wanted to say howdyã€ã«å¤‰ã‚りã€ã‚¸ã‚§ã‚¹ãƒãƒ£ãƒ¼ã«ã‚‚ç½®æ›ãŒåæ˜ ã•れã¾ã™ã€‚"> ç½®æ›ï¼š </text> - <line_editor name="replace_editor" tool_tip="トリガー・ワードをã“れらã®å˜èªžã«ç½®ãæ›ãˆã¾ã™ã€‚ ãŸã¨ãˆã°ã€ãƒˆãƒªã‚¬ãƒ¼ã€Œhelloã€ã‚’「Howdyã€ã«ç½®æ›ã™ã‚‹ã¨ã€ã€ŒI wanted to say helloã€ã¨ã„ã†ãƒãƒ£ãƒƒãƒˆæ–‡ãŒã€ŒI wanted to say howdyã€ã«å¤‰ã‚りã€ã‚¸ã‚§ã‚¹ãƒãƒ£ãƒ¼ã«ã‚‚ç½®æ›ãŒåæ˜ ã•れã¾ã™ã€‚"/> + <line_editor name="replace_editor" tool_tip="トリガーワードをã“れらã®å˜èªžã«ç½®ãæ›ãˆã¾ã™ã€‚ ãŸã¨ãˆã°ã€ãƒˆãƒªã‚¬ãƒ¼ã€Œhelloã€ã‚’「Howdyã€ã«ç½®æ›ã™ã‚‹ã¨ã€ã€ŒI wanted to say helloã€ã¨ã„ã†ãƒãƒ£ãƒƒãƒˆæ–‡ãŒã€ŒI wanted to say howdyã€ã«å¤‰ã‚りã€ã‚¸ã‚§ã‚¹ãƒãƒ£ãƒ¼ã«ã‚‚ç½®æ›ãŒåæ˜ ã•れã¾ã™ã€‚"/> <text name="key_label"> - ショートカット・ã‚ー: + ショートカット: </text> <combo_box label="ãªã—" left="160" name="modifier_combo"/> <combo_box label="ãªã—" name="key_combo"/> @@ -62,7 +62,7 @@ <text name="help_label"> 待機ステップを入れãªã„é™ã‚Šã¯ã€ã™ã¹ã¦ã®ã‚¹ãƒ†ãƒƒãƒ—ãŒåŒæ™‚ã«èµ·ã“りã¾ã™ã€‚ </text> - <check_box label="アクティブ" left="120" name="active_check" tool_tip="アクティブ・ジェスãƒãƒ£ãƒ¼ã¯ã€ãƒˆãƒªã‚¬ãƒ¼ãƒ»ãƒ•レーズを使ã†ã‹ã€ã¾ãŸã¯ãƒ›ãƒƒãƒˆãƒ»ã‚ーを押ã™ã“ã¨ã«ã‚ˆã£ã¦ãƒˆãƒªã‚¬ãƒ¼ã§ãã¾ã™ã€‚ 1ã¤ã®ã‚·ãƒ§ãƒ¼ãƒˆã‚«ãƒƒãƒˆãƒ»ã‚ーã«2ã¤ä»¥ä¸Šã®ã‚¸ã‚§ã‚¹ãƒãƒ£ãƒ¼ãŒå‰²ã‚Šå½“ã¦ã‚‰ã‚ŒãŸå ´åˆã€ãã®ã‚¸ã‚§ã‚¹ãƒãƒ£ãƒ¼ã¯ä¸¡æ–¹ã¨ã‚‚アクティブã§ã¯ãªããªã‚Šã¾ã™ã€‚"/> + <check_box label="アクティブ" name="active_check" tool_tip="アクティブãªã‚¸ã‚§ã‚¹ãƒãƒ£ãƒ¼ã¯ã€ãƒˆãƒªã‚¬ãƒ¼ãƒ•レーズを使ã†ã‹ã€ãƒ›ãƒƒãƒˆã‚ーを押ã™ã¨åˆ‡ã‚Šæ›¿ã‚りã¾ã™ã€‚ 1ã¤ã®ã‚·ãƒ§ãƒ¼ãƒˆã‚«ãƒƒãƒˆã‚ーã«2ã¤ä»¥ä¸Šã®ã‚¸ã‚§ã‚¹ãƒãƒ£ãƒ¼ãŒå‰²ã‚Šå½“ã¦ã‚‰ã‚ŒãŸå ´åˆã€ãã®ã‚¸ã‚§ã‚¹ãƒãƒ£ãƒ¼ã¯ä¸¡æ–¹ã¨ã‚‚アクティブã§ã¯ãªããªã‚Šã¾ã™ã€‚"/> <button label="プレビュー" name="preview_btn"/> <button label="ä¿å˜" name="save_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/ja/floater_preview_gesture_shortcut.xml b/indra/newview/skins/default/xui/ja/floater_preview_gesture_shortcut.xml index 596699d6c1..e96a43d0c1 100644 --- a/indra/newview/skins/default/xui/ja/floater_preview_gesture_shortcut.xml +++ b/indra/newview/skins/default/xui/ja/floater_preview_gesture_shortcut.xml @@ -6,8 +6,8 @@ <text name="key_label"> ã‚ーボード: </text> - <combo_box label="ãªã—" name="modifier_combo"/> - <combo_box label="ãªã—" name="key_combo"/> + <combo_box label="ãªã—" name="modifier_combo" width="60"/> + <combo_box label="ãªã—" name="key_combo" width="60"/> <text name="replace_text" tool_tip="ã“れらã®å˜èªžã«ãƒˆãƒªã‚¬ãƒ¼ã¨ãªã‚‹å˜èªžã‚’ç½®ãæ›ãˆã¾ã™ã€‚ 例ãˆã°ã€ã€Œhowdyã€ã¨ã€Œhelloã€ã‚’ç½®ãæ›ãˆã‚‹ã¨ã€ã€ŒI wanted to say helloã€ã¨ã„ã†ãƒãƒ£ãƒƒãƒˆã¯ã€ã‚¸ã‚§ã‚¹ãƒãƒ£ãƒ¼ã‚’交ãˆãªãŒã‚‰ã®ã€ŒI wanted to say howdyã€ã«å¤‰ã‚りã¾ã™ã€‚"> ç½®ãæ›ãˆï¼š </text> diff --git a/indra/newview/skins/default/xui/ja/floater_preview_notecard.xml b/indra/newview/skins/default/xui/ja/floater_preview_notecard.xml index 6e6e04c7d8..ae8ae9f7b5 100644 --- a/indra/newview/skins/default/xui/ja/floater_preview_notecard.xml +++ b/indra/newview/skins/default/xui/ja/floater_preview_notecard.xml @@ -9,9 +9,6 @@ <floater.string name="Title"> ノートカード: [NAME] </floater.string> - <floater.string label="ä¿å˜" label_selected="ä¿å˜" name="Save"> - ä¿å˜ - </floater.string> <text name="desc txt"> 説明: </text> @@ -19,4 +16,5 @@ ãƒãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ï¼Žï¼Žï¼Ž </text_editor> <button label="ä¿å˜" label_selected="ä¿å˜" name="Save"/> + <button label="削除" label_selected="削除" name="Delete"/> </floater> diff --git a/indra/newview/skins/default/xui/ja/floater_preview_sound.xml b/indra/newview/skins/default/xui/ja/floater_preview_sound.xml index d3c06cbef4..5c0f05cec6 100644 --- a/indra/newview/skins/default/xui/ja/floater_preview_sound.xml +++ b/indra/newview/skins/default/xui/ja/floater_preview_sound.xml @@ -6,6 +6,6 @@ <text name="desc txt"> 説明: </text> - <button label="世界ã§å†ç”Ÿ" label_selected="世界ã§å†ç”Ÿ" name="Sound play btn" tool_tip="他人ãŒèžã“ãˆã‚‹ã‚ˆã†ã«å†ç”Ÿ"/> - <button label="ãƒãƒ¼ã‚«ãƒ«ã«å†ç”Ÿ" label_selected="ãƒãƒ¼ã‚«ãƒ«ã«å†ç”Ÿ" name="Sound audition btn" tool_tip="自分ã ã‘ãŒèžã“ãˆã‚‹ã‚ˆã†ã«å†ç”Ÿ"/> + <button label="インワールドã§å†ç”Ÿ" label_selected="インワールドã§å†ç”Ÿ" name="Sound play btn" tool_tip="他人ã«ã‚‚èžã“ãˆã‚‹ã‚ˆã†ã«å†ç”Ÿã—ã¾ã™"/> + <button label="ãƒãƒ¼ã‚«ãƒ«å†ç”Ÿ" label_selected="ãƒãƒ¼ã‚«ãƒ«å†ç”Ÿ" name="Sound audition btn" tool_tip="自分ã ã‘ãŒèžã“ãˆã‚‹ã‚ˆã†ã«å†ç”Ÿã—ã¾ã™"/> </floater> diff --git a/indra/newview/skins/default/xui/ja/floater_preview_texture.xml b/indra/newview/skins/default/xui/ja/floater_preview_texture.xml index c322538127..6ea1d79cfc 100644 --- a/indra/newview/skins/default/xui/ja/floater_preview_texture.xml +++ b/indra/newview/skins/default/xui/ja/floater_preview_texture.xml @@ -42,6 +42,6 @@ </combo_item> </combo_box> <button label="OK" name="Keep"/> - <button label="ã‚ャンセル" name="Discard"/> + <button label="処分ã™ã‚‹" name="Discard"/> <button label="別åã§ä¿å˜" name="save_tex_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/ja/floater_publish_classified.xml b/indra/newview/skins/default/xui/ja/floater_publish_classified.xml new file mode 100644 index 0000000000..ca6204424e --- /dev/null +++ b/indra/newview/skins/default/xui/ja/floater_publish_classified.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="publish_classified" title="クラシファイド広告掲載"> + <text name="explanation_text"> + ã‚ãªãŸã®ã‚¯ãƒ©ã‚·ãƒ•ァイド広告ã¯ã€æŽ²è¼‰ã•ã‚ŒãŸæ—¥ã‹ã‚‰1週間有効ã§ã™ã€‚ + +クラシファイド広告ã¯è¿”金ã§ãã¾ã›ã‚“ã®ã§ã”了承ãã ã•ã„。 + </text> + <spinner label="広告費:" name="price_for_listing" tool_tip="æŽ²è¼‰ä¾¡æ ¼" value="50"/> + <text name="l$_text" value="L$"/> + <text name="more_info_text"> + 詳ã—ã„æƒ…å ±ï¼ˆã‚¯ãƒ©ã‚·ãƒ•ã‚¡ã‚¤ãƒ‰ãƒ˜ãƒ«ãƒ—ã¸ã®ãƒªãƒ³ã‚¯ï¼‰ + </text> + <button label="掲載" name="publish_btn"/> + <button label="ã‚ャンセル" name="cancel_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_report_abuse.xml b/indra/newview/skins/default/xui/ja/floater_report_abuse.xml index ca6faf59c2..dc34441535 100644 --- a/indra/newview/skins/default/xui/ja/floater_report_abuse.xml +++ b/indra/newview/skins/default/xui/ja/floater_report_abuse.xml @@ -25,7 +25,7 @@ <text name="select_object_label"> ボタンをクリックã—ã¦ã‹ã‚‰ã€æ‚ªæ„ã®ã‚るオブジェクトをクリック: </text> - <button label="" label_selected="" name="pick_btn" tool_tip="オブジェクト・ピッカー - ã“ã®å ±å‘Šã®ä¸»é¡Œã¨ãªã‚‹ã‚ªãƒ–ジェクトを特定"/> + <button label="" label_selected="" name="pick_btn" tool_tip="オブジェクトピッカー - å ±å‘Šå¯¾è±¡ã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„"/> <text name="object_name_label"> オブジェクト: </text> @@ -33,13 +33,13 @@ Consetetur Sadipscing </text> <text name="owner_name_label"> - オーナー: + 所有者: </text> <text name="owner_name"> Hendrerit Vulputate Kamawashi Longname </text> - <combo_box name="category_combo" tool_tip="カテゴリー -- ã“ã®å ±å‘Šã«æœ€ã‚‚é©ã—ãŸã‚«ãƒ†ã‚´ãƒªãƒ¼ã‚’é¸æŠžã—ã¦ãã ã•ã„"> - <combo_box.item label="ã‚«ãƒ†ã‚´ãƒªãƒ¼ã‚’é¸æŠž" name="Select_category"/> + <combo_box name="category_combo" tool_tip="カテゴリ -- ã“ã®å ±å‘Šã«æœ€ã‚‚é©ã—ãŸã‚«ãƒ†ã‚´ãƒªã‚’é¸æŠžã—ã¦ãã ã•ã„"> + <combo_box.item label="ã‚«ãƒ†ã‚´ãƒªã‚’é¸æŠžã—ã¦ãã ã•ã„" name="Select_category"/> <combo_box.item label="年齢>年齢å½è¨¼" name="Age__Age_play"/> <combo_box.item label="å¹´é½¢ > æˆäººã®ä½äººãŒ Teen Second Life ã«ã„ã‚‹" name="Age__Adult_resident_on_Teen_Second_Life"/> <combo_box.item label="å¹´é½¢ > 未æˆå¹´ã®ä½äººãŒTeen Second Life ã®å¤–ã«ã„ã‚‹" name="Age__Underage_resident_outside_of_Teen_Second_Life"/> @@ -49,7 +49,7 @@ <combo_box.item label="商å–引>製å“ã¾ãŸã¯ã‚µãƒ¼ãƒ“ã‚¹ã®æä¾›ãŒè¡Œã‚れãªã„" name="Commerce__Failure_to_deliver_product_or_service"/> <combo_box.item label="é–‹ç¤ºï¼žãƒªã‚¢ãƒ«ãƒ¯ãƒ¼ãƒ«ãƒ‰ã®æƒ…å ±" name="Disclosure__Real_world_information"/> <combo_box.item label="開示>離れãŸã¨ã“ã‚ã‹ã‚‰ãƒãƒ£ãƒƒãƒˆã‚’モニターã—ã¦ã„ã‚‹" name="Disclosure__Remotely_monitoring chat"/> - <combo_box.item label="開示>Second Lifeã®æƒ…å ±/ãƒãƒ£ãƒƒãƒˆ/IM" name="Disclosure__Second_Life_information_chat_IMs"/> + <combo_box.item label="開示>Second Life ã®æƒ…å ±/ãƒãƒ£ãƒƒãƒˆ/IM" name="Disclosure__Second_Life_information_chat_IMs"/> <combo_box.item label="å¹³ç©ã‚’ä¹±ã™è¡Œç‚ºï¼žåœ°åŸŸãƒªã‚½ãƒ¼ã‚¹ã®ä½¿ç”¨ãŒä¸å…¬å¹³" name="Disturbing_the_peace__Unfair_use_of_region_resources"/> <combo_box.item label="å¹³ç©ã‚’ä¹±ã™è¡Œç‚ºï¼žã‚¹ã‚¯ãƒªãƒ—ト・オブジェクトã®ä¹±ç”¨" name="Disturbing_the_peace__Excessive_scripted_objects"/> <combo_box.item label="å¹³ç©ã‚’ä¹±ã™è¡Œç‚ºï¼žã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æ¨ã¦ç½®ã" name="Disturbing_the_peace__Object_littering"/> @@ -57,7 +57,7 @@ <combo_box.item label="å¹³ç©ã‚’ä¹±ã™è¡Œç‚ºï¼žä¸è¦ãªåºƒå‘Šã‚¹ãƒ‘ム" name="Disturbing_the_peace__Unwanted_advert_spam"/> <combo_box.item label="è©æ¬ºï¼ž L$" name="Fraud__L$"/> <combo_box.item label="è©æ¬ºï¼žåœŸåœ°" name="Fraud__Land"/> - <combo_box.item label="è©æ¬ºï¼žãƒžãƒ«ãƒå•†æ³•ã¾ãŸã¯ãƒã‚§ãƒ¼ãƒ³ãƒ»ãƒ¡ãƒ¼ãƒ«" name="Fraud__Pyramid_scheme_or_chain_letter"/> + <combo_box.item label="è©æ¬ºï¼žãƒžãƒ«ãƒå•†æ³•ã¾ãŸã¯ãƒã‚§ãƒ¼ãƒ³ãƒ¡ãƒ¼ãƒ«" name="Fraud__Pyramid_scheme_or_chain_letter"/> <combo_box.item label="è©æ¬ºï¼ž US$" name="Fraud__US$"/> <combo_box.item label="嫌ãŒã‚‰ã›ï¼žåºƒå‘Šå§”託/視覚的ãªã‚¹ãƒ‘ム" name="Harassment__Advert_farms___visual_spam"/> <combo_box.item label="嫌ãŒã‚‰ã›ï¼žå€‹äººã¾ãŸã¯ã‚°ãƒ«ãƒ¼ãƒ—ã®ä¸å‚·" name="Harassment__Defaming_individuals_or_groups"/> @@ -68,11 +68,11 @@ <combo_box.item label="ã‚ã„ã›ã¤ï¼žè‘—ã—ãä¸å¿«ã§ã‚ã‚‹ã¨è¦‹ãªã•れるコンテンツã¾ãŸã¯è¡Œç‚º" name="Indecency__Broadly_offensive_content_or_conduct"/> <combo_box.item label="ã‚ã„ã›ã¤ï¼žä¸é©åˆ‡ãªã‚¢ãƒã‚¿ãƒ¼å" name="Indecency__Inappropriate_avatar_name"/> <combo_box.item label="ã‚ã„ã›ã¤ï¼žPG地域ã§ã®ä¸é©åˆ‡ãªã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¾ãŸã¯è¡Œç‚º" name="Indecency__Mature_content_in_PG_region"/> - <combo_box.item label="ã‚ã„ã›ã¤ > 控ãˆã‚指定ã®åœ°åŸŸã§ã®ä¸é©åˆ‡ãªã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¾ãŸã¯è¡Œç‚º" name="Indecency__Inappropriate_content_in_Mature_region"/> + <combo_box.item label="ã‚ã„ã›ã¤ > 「Moderateã€æŒ‡å®šã®åœ°åŸŸã§ã®ä¸é©åˆ‡ãªã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¾ãŸã¯è¡Œç‚º" name="Indecency__Inappropriate_content_in_Mature_region"/> <combo_box.item label="知的財産ã®ä¾µå®³ï¼žã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®æ’¤åŽ»" name="Intellectual_property_infringement_Content_Removal"/> <combo_box.item label="知的財産ã®ä¾µå®³ï¼žã‚³ãƒ”ーBotåŠã³æ¨©é™ã®æ‚ªç”¨" name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit"/> <combo_box.item label="ä¸å¯›å®¹" name="Intolerance"/> - <combo_box.item label="土地>サンドボックス・リソースã®ä¹±ç”¨" name="Land__Abuse_of_sandbox_resources"/> + <combo_box.item label="土地>サンドボックスã®ãƒªã‚½ãƒ¼ã‚¹ã®ä¹±ç”¨" name="Land__Abuse_of_sandbox_resources"/> <combo_box.item label="åœŸåœ°ï¼žä¸æ³•侵入>オブジェクト/テクスãƒãƒ£ãƒ¼" name="Land__Encroachment__Objects_textures"/> <combo_box.item label="åœŸåœ°ï¼žä¸æ³•侵入>パーティクル" name="Land__Encroachment__Particles"/> <combo_box.item label="åœŸåœ°ï¼žä¸æ³•侵入>樹木/æ¤ç‰©" name="Land__Encroachment__Trees_plants"/> diff --git a/indra/newview/skins/default/xui/ja/floater_sell_land.xml b/indra/newview/skins/default/xui/ja/floater_sell_land.xml index b06b16bbb3..1e884af5f2 100644 --- a/indra/newview/skins/default/xui/ja/floater_sell_land.xml +++ b/indra/newview/skins/default/xui/ja/floater_sell_land.xml @@ -36,7 +36,7 @@ 2. 特定ã®äººã«è²©å£²ï¼š </text> <text name="sell_to_text" right="-6"> - è²©å£²å…ˆã®æŒ‡å®šãªã—ã‹ã€ç‰¹å®šã®äººã«è²©å£²ã™ã‚‹ã‹é¸æŠžã—ã¦ãã ã•ã„。 + è²©å£²å…ˆã®æŒ‡å®šãªã—ã‹ã€ç‰¹å®šã®äººã«è²©å£²ã™ã‚‹ã‹ã‚’é¸æŠžã—ã¦ãã ã•ã„。 </text> <combo_box name="sell_to"> <combo_box.item label="- 1ã¤é¸æŠž -" name="--selectone--"/> diff --git a/indra/newview/skins/default/xui/ja/floater_snapshot.xml b/indra/newview/skins/default/xui/ja/floater_snapshot.xml index 6c84de9b19..c6e315fe48 100644 --- a/indra/newview/skins/default/xui/ja/floater_snapshot.xml +++ b/indra/newview/skins/default/xui/ja/floater_snapshot.xml @@ -1,79 +1,23 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Snapshot" title="スナップショットã®ãƒ—レビュー"> - <text name="type_label"> - スナップショットã®é€ã‚Šå…ˆ - </text> - <radio_group label="スナップショット・タイプ" name="snapshot_type_radio"> - <radio_item label="メール" name="postcard"/> - <radio_item label="ç§ã®æŒã¡ç‰©ï¼ˆL$[AMOUNT])" name="texture"/> - <radio_item label="コンピューターã«ä¿å˜" name="local"/> - </radio_group> - <text name="file_size_label"> - [SIZE] KB - </text> +<floater name="Snapshot" title="スナップショット"> + <floater.string name="unknown"> + 䏿˜Ž + </floater.string> <button label="スナップショットを更新" name="new_snapshot_btn"/> - <button label="é€ä¿¡" name="send_btn"/> - <button label="ä¿å˜ï¼ˆL$[AMOUNT])" name="upload_btn"/> - <flyout_button label="ä¿å˜" name="save_btn" tool_tip="ç”»åƒã‚’ファイルã«ä¿å˜"> - <flyout_button.item label="ä¿å˜" name="save_item"/> - <flyout_button.item label="åå‰ã‚’付ã‘ã¦ä¿å˜" name="saveas_item"/> - </flyout_button> - <button label="ã‚ャンセル" name="discard_btn"/> - <button label="全表示" name="more_btn" tool_tip="詳ã—ã„è¨å®š"/> - <button label="簡易" name="less_btn" tool_tip="詳ã—ã„è¨å®š"/> - <text name="type_label2"> - サイズ - </text> - <text name="format_label" width="75"> - å½¢å¼ - </text> - <combo_box label="è§£åƒåº¦" name="postcard_size_combo"> - <combo_box.item label="ç¾åœ¨ã®ï½³ï½¨ï¾ï¾„゙ウ" name="CurrentWindow"/> - <combo_box.item label="640x480" name="640x480"/> - <combo_box.item label="800x600" name="800x600"/> - <combo_box.item label="1024x768" name="1024x768"/> - <combo_box.item label="カスタム" name="Custom"/> - </combo_box> - <combo_box label="è§£åƒåº¦" name="texture_size_combo"> - <combo_box.item label="ç¾åœ¨ã®ï½³ï½¨ï¾ï¾„゙ウ" name="CurrentWindow"/> - <combo_box.item label="å°ï¼ˆ128x128)" name="Small(128x128)"/> - <combo_box.item label="ä¸ï¼ˆ256x256)" name="Medium(256x256)"/> - <combo_box.item label="大(512x512)" name="Large(512x512)"/> - <combo_box.item label="カスタム" name="Custom"/> - </combo_box> - <combo_box label="è§£åƒåº¦" name="local_size_combo"> - <combo_box.item label="ç¾åœ¨ã®ï½³ï½¨ï¾ï¾„゙ウ" name="CurrentWindow"/> - <combo_box.item label="320x240" name="320x240"/> - <combo_box.item label="640x480" name="640x480"/> - <combo_box.item label="800x600" name="800x600"/> - <combo_box.item label="1024x768" name="1024x768"/> - <combo_box.item label="1280x1024" name="1280x1024"/> - <combo_box.item label="1600x1200" name="1600x1200"/> - <combo_box.item label="カスタム" name="Custom"/> - </combo_box> - <combo_box label="å½¢å¼" name="local_format_combo"> - <combo_box.item label="PNG" name="PNG"/> - <combo_box.item label="JPEG" name="JPEG"/> - <combo_box.item label="BMP" name="BMP"/> - </combo_box> - <spinner label="å¹…" label_width="25" name="snapshot_width" width="90"/> - <spinner label="高ã•" label_width="30" left="115" name="snapshot_height" width="90"/> - <check_box label="縦横比ã®å›ºå®š" name="keep_aspect_check"/> - <slider label="画質" name="image_quality_slider"/> - <text name="layer_type_label"> - キャプï¾ï½¬ï¼š - </text> - <combo_box label="ç”»åƒãƒ¬ã‚¤ãƒ¤ãƒ¼" name="layer_types"> - <combo_box.item label="色" name="Colors"/> - <combo_box.item label="æ·±ã•" name="Depth"/> - <combo_box.item label="オグジェクトã®ã¤ã‚„消ã—" name="ObjectMattes"/> - </combo_box> - <check_box label="インターフェース" name="ui_check"/> - <check_box label="HUD" name="hud_check"/> - <check_box label="ä¿å˜å¾Œã‚‚é–‹ã„ãŸçŠ¶æ…‹ã‚’ä¿æŒ" name="keep_open_check"/> - <check_box label="ç”»é¢å…¨ä½“ã‚’é™æ¢" name="freeze_frame_check"/> - <check_box label="自動更新" name="auto_snapshot_check"/> - <string name="unknown"> - 未知 - </string> + <line_editor label="説明" name="description"/> + <panel name="panel_snapshot_main"> + <button label="共有" name="share"/> + <button label="ä¿å˜" name="save"/> + <button label="プãƒãƒ•ィールã«è¨å®š" name="set_profile_pic"/> + </panel> + <panel name="panel_snapshot_share"> + <button label="Web ã§å…±æœ‰" name="share_to_web"/> + <button label="スナップショットをメール" name="share_to_email"/> + <button label="戻る" name="cancel_share"/> + </panel> + <panel name="panel_snapshot_save"> + <button label="「æŒã¡ç‰©ã€ã«ä¿å˜" name="save_to_inventory"/> + <button label="コンピューターã«ä¿å˜" name="save_to_computer"/> + <button label="戻る" name="cancel_save"/> + </panel> </floater> diff --git a/indra/newview/skins/default/xui/ja/floater_sound_preview.xml b/indra/newview/skins/default/xui/ja/floater_sound_preview.xml index a24ba6e075..7d83309c46 100644 --- a/indra/newview/skins/default/xui/ja/floater_sound_preview.xml +++ b/indra/newview/skins/default/xui/ja/floater_sound_preview.xml @@ -9,7 +9,7 @@ <button label="å–り消ã—" label_selected="å–り消ã—" name="cancel_btn"/> <button label="アップãƒãƒ¼ãƒ‰ã€€ï¼ˆL$[AMOUNT])" label_selected="アップãƒãƒ¼ãƒ‰ã€€ï¼ˆL$[AMOUNT])" name="ok_btn"/> <text name="text"> - ビットレート(kbps): + ビットレート(kbps): </text> <radio_group name="bitrate"> <radio_item label="32" name="32"/> diff --git a/indra/newview/skins/default/xui/ja/floater_sys_well.xml b/indra/newview/skins/default/xui/ja/floater_sys_well.xml index a7c0a2b391..45e97bdf5d 100644 --- a/indra/newview/skins/default/xui/ja/floater_sys_well.xml +++ b/indra/newview/skins/default/xui/ja/floater_sys_well.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="notification_chiclet" title="通知"> +<floater name="sys_well_window" title="通知"> <string name="title_im_well_window"> - IMセッション + 会話 </string> <string name="title_notification_well_window"> 通知 diff --git a/indra/newview/skins/default/xui/ja/floater_telehub.xml b/indra/newview/skins/default/xui/ja/floater_telehub.xml index bdb92c8e30..7318083771 100644 --- a/indra/newview/skins/default/xui/ja/floater_telehub.xml +++ b/indra/newview/skins/default/xui/ja/floater_telehub.xml @@ -10,7 +10,7 @@ 「切æ–ã€ã‚’クリックã—ã¦å‰Šé™¤ã—ã¾ã™ã€‚ </text> <text name="help_text_not_connected"> - ç‰©ä½“ã‚’é¸æŠžã—「テレãƒãƒ–ã®æŽ¥ç¶šã€ã‚’クリックã™ã‚‹ + ç‰©ä½“ã‚’é¸æŠžã—ã¦ã€Œãƒ†ãƒ¬ãƒãƒ–ã®æŽ¥ç¶šã€ã‚’クリックã—ã¦ãã ã•ã„。 </text> <button label="テレãƒãƒ–ã®æŽ¥ç¶š" name="connect_btn"/> <button label="切æ–" name="disconnect_btn"/> @@ -20,9 +20,6 @@ <button label="出ç¾ä½ç½®ã‚’è¿½åŠ " name="add_spawn_point_btn"/> <button label="出ç¾åœ°ç‚¹ã‚’削除" name="remove_spawn_point_btn"/> <text name="spawn_point_help"> - オブジェクトをé¸ã³ã€ã€Œå‡ºç¾åœ°ç‚¹ã‚’è¿½åŠ ã€ã‚’クリックã—ã¦ä½ç½®ã‚’指定ã—ã¾ã™ã€‚ -ãã†ã™ã‚‹ã¨ãã®ã‚ªãƒ–ジェクトを移動ã•ã›ãŸã‚Šå‰Šé™¤ã§ãã¾ã™ã€‚ -ä½ç½®ã¯ãƒ†ãƒ¬ãƒãƒ–センターã«é–¢é€£ã—ã¾ã™ã€‚ -リストã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’é¸æŠžã—ã¦ã‚¤ãƒ³ãƒ¯ãƒ¼ãƒ«ãƒ‰ã§ãƒã‚¤ãƒ©ã‚¤ãƒˆã•ã›ã¾ã™ã€‚ + オブジェクトをé¸ã³ã€ã€Œå‡ºç¾åœ°ç‚¹ã‚’è¿½åŠ ã€ã‚’クリックã—ã¦ä½ç½®ã‚’指定ã—ã¾ã™ã€‚ãã†ã™ã‚‹ã¨ãã®ã‚ªãƒ–ジェクトを移動ã•ã›ãŸã‚Šå‰Šé™¤ã§ãã¾ã™ã€‚ä½ç½®ã¯ãƒ†ãƒ¬ãƒãƒ–センターã«é–¢é€£ã—ã¾ã™ã€‚リストã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’é¸æŠžã—ã¦ã‚¤ãƒ³ãƒ¯ãƒ¼ãƒ«ãƒ‰ã§ãƒã‚¤ãƒ©ã‚¤ãƒˆã•ã›ã¾ã™ã€‚ </text> </floater> diff --git a/indra/newview/skins/default/xui/ja/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/ja/floater_texture_ctrl.xml index 1500808e60..399cffcce5 100644 --- a/indra/newview/skins/default/xui/ja/floater_texture_ctrl.xml +++ b/indra/newview/skins/default/xui/ja/floater_texture_ctrl.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="texture picker" title="é¸æŠžï¼š テクスãƒãƒ£"> +<floater name="texture picker" title="テクスãƒãƒ£ã®é¸æŠž"> <string name="choose_picture"> クリックã—ã¦å†™çœŸã‚’é¸æŠž </string> @@ -9,12 +9,12 @@ <text name="unknown"> サイズ: [DIMENSIONS] </text> - <button label="デフォルト" label_selected="デフォルト" name="Default"/> + <button label="デフォルト" label_selected="デフォルト" name="Default"/> <button label="ãªã—" label_selected="ãªã—" name="None"/> <button label="ブランク" label_selected="ブランク" name="Blank"/> <check_box label="フォルダを表示" name="show_folders_check"/> <search_editor label="テクスãƒãƒ£ã‚’フィルター" name="inventory search editor"/> - <check_box label="今ã™ãé©ç”¨" name="apply_immediate_check"/> + <check_box label="ã™ãé©ç”¨" name="apply_immediate_check"/> <button label="" label_selected="" name="Pipette"/> <button label="å–り消ã—" label_selected="å–り消ã—" name="Cancel"/> <button label="OK" label_selected="OK" name="Select"/> diff --git a/indra/newview/skins/default/xui/ja/floater_tools.xml b/indra/newview/skins/default/xui/ja/floater_tools.xml index 52d3537d9a..d095dee974 100644 --- a/indra/newview/skins/default/xui/ja/floater_tools.xml +++ b/indra/newview/skins/default/xui/ja/floater_tools.xml @@ -4,19 +4,19 @@ 色ã®ä»˜ã„ãŸãƒãƒ³ãƒ‰ã‚’ドラッグã—ã¦ã‚ªãƒ–ジェクトを回転 </floater.string> <floater.string name="status_scale"> - é¸æŠžã—ãŸå´ã‚’クリックã—ã€ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦å¼•ã伸ã°ã™ + é¸æŠžã—ãŸå´ã‚’クリックã—ã€ãƒ‰ãƒ©ãƒƒã‚°ã§å¼•ã伸ã°ã™ </floater.string> <floater.string name="status_move"> - 移動:ドラッグã€ã‚³ãƒ”ー:Shiftを押ã—ãªãŒã‚‰ï¾„゙ラッグ + 移動:ドラッグã€ã‚³ãƒ”ー:Shift + ドラッグ </floater.string> <floater.string name="status_modifyland"> 土地をクリックã—ã€ãƒœã‚¿ãƒ³ã‚’押ã—ãŸã¾ã¾å…¥åŠ›ã—ã¦ä¿®æ£å¤‰æ›´ </floater.string> <floater.string name="status_camera"> - クリック・ドラッグã§è¦–界移動 + クリック + ドラッグã§è¦–界移動 </floater.string> <floater.string name="status_grab"> - ドラッグã§ç§»å‹•ã€Ctrlã§æŒã¡ä¸Šã’ã€Ctrl+Shiftã§å›žè»¢ + ドラッグã§ç§»å‹•ã€Ctrlã§æŒã¡ä¸Šã’ã€Ctrl + Shiftã§å›žè»¢ </floater.string> <floater.string name="status_place"> インワールドã§ã‚¯ãƒªãƒƒã‚¯ã—ã¦ä½œæˆ @@ -31,10 +31,10 @@ ãƒãƒ¼ã‚«ãƒ« </floater.string> <floater.string name="grid_world_text"> - 世界 + インワールド </floater.string> <floater.string name="grid_reference_text"> - å‚ç…§ + レファレンス </floater.string> <floater.string name="grid_attachment_text"> アタッãƒãƒ¡ãƒ³ãƒˆ @@ -49,13 +49,13 @@ </text> <radio_group name="focus_radio_group"> <radio_item label="ズーム" name="radio zoom"/> - <radio_item label="軌跡(Ctrl)" name="radio orbit"/> - <radio_item label="水平・垂直移動 (Ctrl+Shift)" name="radio pan"/> + <radio_item label="旋回(Ctrl)" name="radio orbit"/> + <radio_item label="水平・垂直移動 (Ctrl + Shift)" name="radio pan"/> </radio_group> <radio_group name="move_radio_group"> <radio_item label="移動" name="radio move"/> <radio_item label="æŒã¡ä¸Šã’る(Ctrl)" name="radio lift"/> - <radio_item label="回転 (Ctrl+Shift)" name="radio spin"/> + <radio_item label="回転 (Ctrl + Shift)" name="radio spin"/> </radio_group> <radio_group name="edit_radio_group"> <radio_item label="移動" name="radio position"/> @@ -67,15 +67,18 @@ <text name="RenderingCost" tool_tip="ã“ã®ã‚ªãƒ–ジェクトã«ã‹ã‹ã‚‹ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°ã‚³ã‚¹ãƒˆã‚’表示"> þ: [COUNT] </text> - <check_box label="両å´ã‚’引伸ã°ã™" left="116" name="checkbox uniform"/> - <check_box initial_value="true" label="テクスãƒãƒ£ãƒ¼ã‚’引伸ã°ã™" name="checkbox stretch textures"/> - <check_box initial_value="true" label="グリッドãƒã‚¤ãƒ³ãƒˆã«ã‚¹ãƒŠãƒƒãƒ—" left_delta="27" name="checkbox snap to grid"/> - <combo_box left_delta="60" name="combobox grid mode" tool_tip="オブジェクトã®é…ç½®ã«ä½¿ã†ã‚°ãƒªãƒƒãƒ‰ãƒ«ãƒ¼ãƒ©ã‚’é¸æŠž" width="76"> - <combo_box.item label="ワールドグリッド" name="World"/> + <check_box label="" left="116" name="checkbox uniform"/> + <text label="両å´ã‚’å»¶ã°ã™" name="checkbox uniform label"> + 両å´ã‚’å»¶ã°ã™ + </text> + <check_box initial_value="true" label="テクスãƒãƒ£ã‚’引ãå»¶ã°ã™" name="checkbox stretch textures"/> + <check_box initial_value="true" label="グリッドã«ã‚¹ãƒŠãƒƒãƒ—" left_delta="27" name="checkbox snap to grid"/> + <combo_box left_delta="60" name="combobox grid mode" tool_tip="オブジェクトã®é…ç½®ã«ä½¿ã†ã‚°ãƒªãƒƒãƒ‰ãƒ«ãƒ¼ãƒ©ã‚’é¸æŠžã—ã¾ã™" width="76"> + <combo_box.item label="インワールドグリッド" name="World"/> <combo_box.item label="ãƒãƒ¼ã‚«ãƒ«ã‚°ãƒªãƒƒãƒ‰" name="Local"/> <combo_box.item label="リファレンスグリッド" name="Reference"/> </combo_box> - <button label="オプション" label_selected="オプション" name="Options..." tool_tip="グリッドオプションをもã£ã¨è¦‹ã‚‹"/> + <button label="オプション" label_selected="オプション" name="Options..." tool_tip="グリッドオプションを表示ã—ã¾ã™"/> <button label="" label_selected="" name="ToolCube" tool_tip="ã‚ューブ"/> <button label="" label_selected="" name="ToolPrism" tool_tip="プリズム"/> <button label="" label_selected="" name="ToolPyramid" tool_tip="ピラミッド"/> @@ -84,7 +87,7 @@ <button label="" label_selected="" name="ToolHemiCylinder" tool_tip="åŠå††æŸ±"/> <button label="" label_selected="" name="ToolCone" tool_tip="円éŒ"/> <button label="" label_selected="" name="ToolHemiCone" tool_tip="åŠå††éŒ"/> - <button label="" label_selected="" name="ToolSphere" tool_tip="çƒå½¢"/> + <button label="" label_selected="" name="ToolSphere" tool_tip="çƒä½“"/> <button label="" label_selected="" name="ToolHemiSphere" tool_tip="åŠçƒ"/> <button label="" label_selected="" name="ToolTorus" tool_tip="トーラス"/> <button label="" label_selected="" name="ToolTube" tool_tip="ãƒãƒ¥ãƒ¼ãƒ–"/> @@ -113,7 +116,7 @@ <text name="Strength:"> 強度 </text> - <button label="é©ç”¨" label_selected="é©ç”¨" name="button apply to selection" tool_tip="é¸æŠžã—ãŸåœŸåœ°ã‚’ä¿®æ£"/> + <button label="é©ç”¨" label_selected="é©ç”¨" name="button apply to selection" tool_tip="é¸æŠžã—ãŸåœŸåœ°ã‚’ä¿®æ£ã—ã¾ã™"/> <text name="obj_count"> オブジェクト: [COUNT] </text> @@ -150,7 +153,7 @@ åˆè¨ˆï¼š L$ </panel.string> <panel.string name="Cost Per Unit"> - Price Per: L$ + å˜ä¾¡ï¼š L$ </panel.string> <panel.string name="Cost Mixed"> æ··åˆä¾¡æ ¼ @@ -165,13 +168,13 @@ 説明: </text> <text name="Creator:"> - クリエーター + 制作者: </text> <text name="Creator Name"> Esbee Linden </text> <text name="Owner:"> - オーナー: + 所有者: </text> <text name="Owner Name"> Erica Linden @@ -179,29 +182,29 @@ <text name="Group:"> グループ: </text> - <button label="è¨å®š..." label_selected="è¨å®š..." name="button set group" tool_tip="ã“ã®ã‚ªãƒ–ジェクト権é™ã‚’共有ã™ã‚‹ã‚°ãƒ«ãƒ¼ãƒ—ã‚’é¸æŠž"/> + <button label="è¨å®š..." label_selected="è¨å®š..." name="button set group" tool_tip="ã“ã®ã‚ªãƒ–ジェクト権é™ã‚’共有ã™ã‚‹ã‚°ãƒ«ãƒ¼ãƒ—ã‚’é¸æŠžã—ã¾ã™"/> <name_box initial_value="ãƒãƒ¼ãƒ‡ã‚£ãƒ³ã‚°..." name="Group Name Proxy"/> - <button label="è²æ¸¡" label_selected="è²æ¸¡" name="button deed" tool_tip="ã“ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’è²æ¸¡ã™ã‚‹ã¨ã€Œæ¬¡ã®æ‰€æœ‰è€…ã€ã®æ¨©é™ãŒé©ç”¨ã•れã¾ã™ã€‚ グループ共有オブジェクトã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—ã®ã‚ªãƒ•ィサーãŒè²æ¸¡ã§ãã¾ã™ã€‚"/> - <check_box label="共有" name="checkbox share with group" tool_tip="è¨å®šã—ãŸã‚°ãƒ«ãƒ¼ãƒ—ã®ãƒ¡ãƒ³ãƒãƒ¼å…¨å“¡ã«ã“ã®ã‚ªãƒ–ジェクトã®ä¿®æ£æ¨©é™ã‚’与ãˆã¾ã™ã€‚ è²æ¸¡ã—ãªã„é™ã‚Šã€å½¹å‰²åˆ¶é™ã‚’有効ã«ã¯ã§ãã¾ã›ã‚“。"/> + <button label="è²æ¸¡" label_selected="è²æ¸¡" name="button deed" tool_tip="ã“ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’è²æ¸¡ã™ã‚‹ã¨ã€Œæ¬¡ã®æ‰€æœ‰è€…ã€ã®æ¨©é™ãŒé©ç”¨ã•れã¾ã™ã€‚ グループ共有オブジェクトã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—ã®ã‚ªãƒ•ィサーãŒè²æ¸¡ã§ãã¾ã™"/> + <check_box label="共有" name="checkbox share with group" tool_tip="è¨å®šã—ãŸã‚°ãƒ«ãƒ¼ãƒ—ã®ãƒ¡ãƒ³ãƒãƒ¼å…¨å“¡ã«ã“ã®ã‚ªãƒ–ジェクトã®ä¿®æ£æ¨©é™ã‚’与ãˆã¾ã™ã€‚ è²æ¸¡ã—ãªã„é™ã‚Šã€å½¹å‰²åˆ¶é™ã‚’有効ã«ã¯ã§ãã¾ã›ã‚“"/> <text name="label click action"> クリックã§ï¼š </text> <combo_box name="clickaction"> <combo_box.item label="触る(デフォルト)" name="Touch/grab(default)"/> <combo_box.item label="オブジェクトã«åº§ã‚‹" name="Sitonobject"/> - <combo_box.item label="オブジェクトを購入" name="Buyobject"/> - <combo_box.item label="オブジェクトã¸ã®æ”¯æ‰•ã„" name="Payobject"/> + <combo_box.item label="オブジェクトを購入ã™ã‚‹" name="Buyobject"/> + <combo_box.item label="ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã«æ”¯æ‰•ã†" name="Payobject"/> <combo_box.item label="é–‹ã" name="Open"/> - <combo_box.item label="ズーム" name="Zoom"/> + <combo_box.item label="ズームã™ã‚‹" name="Zoom"/> </combo_box> <check_box label="販売対象:" name="checkbox for sale"/> <combo_box name="sale type"> <combo_box.item label="コピー" name="Copy"/> - <combo_box.item label="コンテンツ" name="Contents"/> + <combo_box.item label="ä¸èº«" name="Contents"/> <combo_box.item label="オリジナル" name="Original"/> </combo_box> <spinner label="ä¾¡æ ¼ï¼š L$" name="Edit Cost"/> - <check_box label="検索ã«è¡¨ç¤º" name="search_check" tool_tip="æ¤œç´¢çµæžœã§ã€ã“ã®ã‚ªãƒ–ジェクトを人ã«è¦‹ã›ã‚‹"/> + <check_box label="検索ã«è¡¨ç¤º" name="search_check" tool_tip="æ¤œç´¢çµæžœã«ã“ã®ã‚ªãƒ–ジェクトを表示ã—ã¾ã™"/> <panel name="perms_build"> <text name="perm_modify"> ã‚ãªãŸã¯ã“ã®ã‚ªãƒ–ジェクトを修æ£ã§ãã¾ã™ @@ -216,7 +219,7 @@ </text> <check_box label="ä¿®æ£" name="checkbox next owner can modify"/> <check_box label="コピー" name="checkbox next owner can copy"/> - <check_box label="å†è²©ãƒ»ãƒ—レゼント" name="checkbox next owner can transfer" tool_tip="æ¬¡ã®æ‰€æœ‰è€…ã¯ã“ã®ã‚ªãƒ–ジェクトを他人ã«ã‚ã’ãŸã‚Šå†è²©ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™"/> + <check_box label="å†è²©ãƒ»ãƒ—レゼント" name="checkbox next owner can transfer" tool_tip="æ¬¡ã«æ‰€æœ‰ã™ã‚‹äººã¯ã€ã“ã®ã‚ªãƒ–ジェクトを他人ã«ã‚ã’ãŸã‚Šå†è²©ã§ãã¾ã™"/> <text name="B:"> B: </text> @@ -238,10 +241,10 @@ </panel> </panel> <panel label="形状" name="Object"> - <check_box label="ãƒãƒƒã‚¯æ¸ˆã¿" name="checkbox locked" tool_tip="オブジェクトã®ç§»å‹•ã¨å‰Šé™¤ã‚’ç¦æ¢ã—ã¾ã™ã€‚ ã“ã®æ©Ÿèƒ½ã‚’使ã†ã¨ã€æ§‹ç¯‰ä¸ã«æ„図ã—ãªã„編集を防ãã“ã¨ãŒã§ãã¾ã™ã€‚"/> - <check_box label="物ç†" name="Physical Checkbox Ctrl" tool_tip="オブジェクトã«å¯¾ã™ã‚‹é‡åŠ›ã®ä½œç”¨ã¨å½±éŸ¿ã‚’有効ã«ã™ã‚‹"/> + <check_box label="ãƒãƒƒã‚¯" name="checkbox locked" tool_tip="オブジェクトã®ç§»å‹•ã¨å‰Šé™¤ã‚’ç¦æ¢ã—ã¾ã™ã€‚ ã“ã®æ©Ÿèƒ½ã‚’使ã†ã¨ã€åˆ¶ä½œä¸ã®æ„図ã›ã¬ç·¨é›†ã‚’防ãã“ã¨ãŒã§ãã¾ã™"/> + <check_box label="物ç†" name="Physical Checkbox Ctrl" tool_tip="オブジェクトã«å¯¾ã™ã‚‹é‡åŠ›ã®ä½œç”¨ã¨å½±éŸ¿ã‚’有効ã«ã—ã¾ã™"/> <check_box label="臨時" name="Temporary Checkbox Ctrl" tool_tip="制作後 1 分ã§ã‚ªãƒ–ジェクトã¯å‰Šé™¤ã•れã¾ã™"/> - <check_box label="ファントム" name="Phantom Checkbox Ctrl" tool_tip="オブジェクトåŒå£«ã®è¡çªã¾ãŸã¯ã‚ªãƒ–ジェクトã¨ã‚¢ãƒã‚¿ãƒ¼ã®è¡çªã‚’回é¿"/> + <check_box label="ファントム" name="Phantom Checkbox Ctrl" tool_tip="オブジェクトåŒå£«ã®è¡çªã¾ãŸã¯ã‚ªãƒ–ジェクトã¨ã‚¢ãƒã‚¿ãƒ¼ã®è¡çªã‚’回é¿ã—ã¾ã™"/> <text name="label position"> ä½ç½®ï¼ˆãƒ¡ãƒ¼ãƒˆãƒ«ï¼‰ </text> @@ -264,7 +267,7 @@ <combo_box.item label="ボックス" name="Box"/> <combo_box.item label="シリンダー" name="Cylinder"/> <combo_box.item label="プリズム" name="Prism"/> - <combo_box.item label="çƒå½¢" name="Sphere"/> + <combo_box.item label="çƒä½“" name="Sphere"/> <combo_box.item label="トーラス" name="Torus"/> <combo_box.item label="ãƒãƒ¥ãƒ¼ãƒ–" name="Tube"/> <combo_box.item label="リング" name="Ring"/> @@ -280,7 +283,7 @@ <combo_box.item label="ゴム" name="Rubber"/> </combo_box> <text name="text cut"> - パスカット (始点/終点) + パスカット(始点ã¨çµ‚点) </text> <spinner label="B" name="cut begin"/> <spinner label="E" name="cut end"/> @@ -300,7 +303,7 @@ <combo_box.item label="三角形" name="Triangle"/> </combo_box> <text name="text twist"> - ã²ãり (始点/終点) + ã²ãり(始点ã¨çµ‚点) </text> <spinner label="B" name="Twist Begin"/> <spinner label="E" name="Twist End"/> @@ -318,13 +321,13 @@ <spinner label="X" name="Shear X"/> <spinner label="Y" name="Shear Y"/> <text name="advanced_cut"> - プãƒãƒ•ィールカット (始点/終点) + プãƒãƒ•ィールカット(始点ã¨çµ‚点) </text> <text name="advanced_dimple"> - ãã¼ã¿ (始点/終点) + ãã¼ã¿ï¼ˆå§‹ç‚¹ã¨çµ‚点) </text> <text name="advanced_slice"> - 切りå–り (始点/終点) + 切りå–り(始点ã¨çµ‚点) </text> <spinner label="B" name="Path Limit Begin"/> <spinner label="E" name="Path Limit End"/> @@ -339,15 +342,15 @@ <text name="text revolutions"> 回転体 </text> - <texture_picker label="スカルプトテクスãƒãƒ£ãƒ¼" name="sculpt texture control" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¦ãã ã•ã„。"/> - <check_box label="ミラー" name="sculpt mirror control" tool_tip="スカルプトプリムを X 軸上ã§å転ã•ã›ã‚‹"/> - <check_box label="è£è¿”ã—" name="sculpt invert control" tool_tip="スカルプトプリムをå転ã•ã›ã¦è£è¿”ã™"/> + <texture_picker label="スカルプトテクスãƒãƒ£" name="sculpt texture control" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¦ãã ã•ã„"/> + <check_box label="ミラー" name="sculpt mirror control" tool_tip="スカルプトプリムを X 軸上ã§å転ã•ã›ã¾ã™"/> + <check_box label="è£è¿”ã—" name="sculpt invert control" tool_tip="スカルプトプリムをå転ã•ã›ã¦è£è¿”ã—ã¾ã™"/> <text name="label sculpt type"> 縫ã„ç›®ã®ã‚¿ã‚¤ãƒ— </text> <combo_box name="sculpt type control"> <combo_box.item label="(ãªã—)" name="None"/> - <combo_box.item label="çƒå½¢" name="Sphere"/> + <combo_box.item label="çƒä½“" name="Sphere"/> <combo_box.item label="トーラス" name="Torus"/> <combo_box.item label="å¹³é¢" name="Plane"/> <combo_box.item label="シリンダー" name="Cylinder"/> @@ -355,23 +358,23 @@ </panel> <panel label="特徴" name="Features"> <text name="select_single"> - プリムを1ã¤ã ã‘é¸æŠžã—ã¦ç·¨é›†ã—ã¦ãã ã•ã„ + プリムを 1 ã¤ã ã‘é¸æŠžã—ã¦ç·¨é›†ã—ã¦ãã ã•ã„ </text> <text name="edit_object"> オブジェクトã®ç‰¹å¾´ã‚’編集: </text> - <check_box label="フレã‚シブル・パス" name="Flexible1D Checkbox Ctrl" tool_tip="Z 軸をä¸å¿ƒã«ã‚ªãƒ–ジェクトã®å±ˆæ›²ã‚’有効ã«ã™ã‚‹ï¼ˆã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆå´ã®ã¿ï¼‰"/> + <check_box label="フレã‚シブルパス" name="Flexible1D Checkbox Ctrl" tool_tip="Z 軸をä¸å¿ƒã«ã‚ªãƒ–ジェクトã®å±ˆæ›²ã‚’有効ã«ã—ã¾ã™ï¼ˆã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆå´ã®ã¿ï¼‰"/> <spinner label="柔軟性" label_width="72" name="FlexNumSections" width="135"/> <spinner label="é‡åŠ›" label_width="72" name="FlexGravity" width="135"/> <spinner label="ドラッグ" label_width="72" name="FlexFriction" width="135"/> <spinner label="風" label_width="72" name="FlexWind" width="135"/> <spinner label="ç·Šå¼µ" label_width="72" name="FlexTension" width="135"/> - <spinner label="X軸方å‘ã®åŠ›" label_width="72" name="FlexForceX" width="135"/> - <spinner label="Y軸方å‘ã®åŠ›" label_width="72" name="FlexForceY" width="135"/> - <spinner label="Z軸方å‘ã®åŠ›" label_width="72" name="FlexForceZ" width="135"/> - <check_box label="å…‰" name="Light Checkbox Ctrl" tool_tip="オブジェクトãŒç™ºå…‰"/> + <spinner label="X 軸方å‘ã®åŠ›" label_width="72" name="FlexForceX" width="135"/> + <spinner label="Y 軸方å‘ã®åŠ›" label_width="72" name="FlexForceY" width="135"/> + <spinner label="Z 軸方å‘ã®åŠ›" label_width="72" name="FlexForceZ" width="135"/> + <check_box label="å…‰" name="Light Checkbox Ctrl" tool_tip="オブジェクトãŒç™ºå…‰ã—ã¾ã™"/> <color_swatch label="" left_delta="74" name="colorswatch" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/> - <texture_picker label="" name="light texture control" tool_tip="ã‚¯ãƒªãƒƒã‚¯ã§æŠ•å½±ç”»ã‚’é¸æŠžï¼ˆé…延レンダリング有効時ã®ã¿ï¼‰"/> + <texture_picker label="" name="light texture control" tool_tip="ã‚¯ãƒªãƒƒã‚¯ã§æŠ•å½±ç”»ã‚’é¸æŠžã—ã¾ã™ï¼ˆé…延レンダリング有効時ã®ã¿ï¼‰"/> <spinner label="è¼åº¦" label_width="72" name="Light Intensity" width="135"/> <spinner label="FOV" name="Light FOV"/> <spinner label="åŠå¾„" label_width="72" name="Light Radius" width="135"/> @@ -381,12 +384,12 @@ </panel> <panel label="æè³ª" name="Texture"> <panel.string name="string repeats per meter"> - メートルã”ã¨ã«ç¹°è¿”ã™ + メートルã”ã¨ã«ç¹°ã‚Šè¿”ã™ </panel.string> <panel.string name="string repeats per face"> é¢ã”ã¨ã«ç¹°ã‚Šè¿”ã™ </panel.string> - <texture_picker label="テクスãƒãƒ£ãƒ¼" name="texture control" tool_tip="写真をクリックã—ã¦é¸æŠž"/> + <texture_picker label="テクスãƒãƒ£" name="texture control" tool_tip="写真をクリックã—ã¦é¸æŠžã—ã¾ã™"/> <color_swatch label="色" name="colorswatch" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/> <text name="color trans"> é€éŽåº¦ % @@ -453,10 +456,10 @@ <text name="media_tex"> メディア </text> - <button name="add_media" tool_tip="ãƒ¡ãƒ‡ã‚£ã‚¢ã‚’è¿½åŠ "/> - <button name="delete_media" tool_tip="ã“ã®ãƒ¡ãƒ‡ã‚£ã‚¢ãƒ†ã‚¯ã‚¹ãƒãƒ£ã‚’削除"/> - <button name="edit_media" tool_tip="ã“ã®ãƒ¡ãƒ‡ã‚£ã‚¢ã‚’編集"/> - <button label="æƒãˆã‚‹" label_selected="ãƒ¡ãƒ‡ã‚£ã‚¢ã‚’ä¸€åˆ—ã«æƒãˆã‚‹" name="button align" tool_tip="メディアテクスãƒãƒ£ã‚’ä¸€åˆ—ã«æƒãˆã‚‹ï¼ˆæœ€åˆã«èªã¿è¾¼ã‚€å¿…è¦ãŒã‚りã¾ã™ï¼‰"/> + <button name="add_media" tool_tip="ãƒ¡ãƒ‡ã‚£ã‚¢ã‚’è¿½åŠ ã—ã¾ã™"/> + <button name="delete_media" tool_tip="ã“ã®ãƒ¡ãƒ‡ã‚£ã‚¢ãƒ†ã‚¯ã‚¹ãƒãƒ£ã‚’削除ã—ã¾ã™"/> + <button name="edit_media" tool_tip="ã“ã®ãƒ¡ãƒ‡ã‚£ã‚¢ã‚’編集ã—ã¾ã™"/> + <button label="æƒãˆã‚‹" label_selected="ãƒ¡ãƒ‡ã‚£ã‚¢ã‚’ä¸€åˆ—ã«æƒãˆã¾ã™" name="button align" tool_tip="メディアテクスãƒãƒ£ã‚’ä¸€åˆ—ã«æƒãˆã¾ã™ï¼ˆæœ€åˆã«èªã¿è¾¼ã‚€å¿…è¦ãŒã‚りã¾ã™ï¼‰"/> </panel> </panel> <panel label="ä¸èº«" name="Contents"> @@ -475,7 +478,7 @@ é¢ç©ï¼š [AREA] 平方メートル </text> <button label="åœŸåœ°æƒ…å ±" label_selected="åœŸåœ°æƒ…å ±" name="button about land"/> - <check_box label="オーナーを表示" name="checkbox show owners" tool_tip="所有者ã®ç¨®é¡žåˆ¥ã«åŒºç”»ã‚’色ã¥ã‘: ç·‘ = ã‚ãªãŸã®åœŸåœ° アクア = ã‚ãªãŸã®ã‚°ãƒ«ãƒ¼ãƒ—所有地 赤 = ä»–äººãŒæ‰€æœ‰ã™ã‚‹åœŸåœ° 黄色 = 売り出ã—ä¸ ç´« = オークション グレー = パブリック"/> + <check_box label="所有者を表示" name="checkbox show owners" tool_tip="所有者ã®ç¨®é¡žåˆ¥ã«åŒºç”»ã‚’色ã¥ã‘ã¾ã™ï¼š ç·‘ = ã‚ãªãŸã®åœŸåœ° アクア = ã‚ãªãŸã®ã‚°ãƒ«ãƒ¼ãƒ—所有地 赤 = ä»–äººãŒæ‰€æœ‰ã™ã‚‹åœŸåœ° 黄色 = 売り出ã—ä¸ ç´« = オークション グレー = パブリック"/> <text name="label_parcel_modify"> 区画ã®ç·¨é›† </text> diff --git a/indra/newview/skins/default/xui/ja/floater_tos.xml b/indra/newview/skins/default/xui/ja/floater_tos.xml index 85ac102885..ae064724c0 100644 --- a/indra/newview/skins/default/xui/ja/floater_tos.xml +++ b/indra/newview/skins/default/xui/ja/floater_tos.xml @@ -1,22 +1,15 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="modal container" title=" "> + <floater.string name="real_url"> + http://secondlife.com/app/tos/ + </floater.string> + <floater.string name="loading_url"> + data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Loading %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E + </floater.string> <button label="続行" label_selected="続行" name="Continue"/> <button label="å–り消ã—" label_selected="å–り消ã—" name="Cancel"/> - <radio_group name="tos_agreement"> - <radio_item label="利用è¦ç´„ã«åŒæ„ã—ã¾ã›ã‚“" name="radio_disagree"/> - <radio_item label="利用è¦ç´„ã«åŒæ„ã—ã¾ã™" name="radio_agree"/> - </radio_group> - <text name="tos_title"> - 利用è¦ç´„ - </text> - <check_box label="利用è¦ç´„ã«åŒæ„ã—ã¾ã™" name="agree_chk"/> + <check_box label="利用è¦ç´„ã¨ãƒ—ライãƒã‚·ãƒ¼ãƒãƒªã‚·ãƒ¼ã«åŒæ„ã—ã¾ã™" name="agree_chk"/> <text name="tos_heading"> - 次ã®åˆ©ç”¨è¦ç´„をよããŠèªã¿ãã ã•ã„。 [SECOND_LIFE] ã¸ã®ãƒã‚°ã‚¤ãƒ³ã‚’ç¶šã‘ã‚‹ã«ã¯ã€è¦ç´„ã«åŒæ„ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ - </text> - <text_editor name="tos_text"> - TOS_TEXT - </text_editor> - <text name="real_url"> - http://secondlife.com/app/tos/ + 次ã®åˆ©ç”¨è¦ç´„ã¨ãƒ—ライãƒã‚·ãƒ¼ãƒãƒªã‚·ãƒ¼ã‚’よããŠèªã¿ãã ã•ã„。 [SECOND_LIFE] ã¸ã®ãƒã‚°ã‚¤ãƒ³ã‚’ç¶šã‘ã‚‹ã«ã¯ã€è¦ç´„ã«åŒæ„ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ </text> </floater> diff --git a/indra/newview/skins/default/xui/ja/floater_url_entry.xml b/indra/newview/skins/default/xui/ja/floater_url_entry.xml index 9d3ca20c7c..8e09e4748a 100644 --- a/indra/newview/skins/default/xui/ja/floater_url_entry.xml +++ b/indra/newview/skins/default/xui/ja/floater_url_entry.xml @@ -3,11 +3,11 @@ <text name="media_label"> メディア URL: </text> - <combo_box left="100" name="media_entry" width="360" /> - <button label="OK" name="ok_btn" width="78"/> + <combo_box name="media_entry"/> + <button label="OK" name="ok_btn" width="38"/> <button label="ã‚ャンセル" name="cancel_btn" width="80"/> - <button label="クリア" name="clear_btn" /> - <text name="loading_label"> + <button label="クリア" name="clear_btn" left_pad="76"/> + <text name="loading_label" left="140"> ãƒãƒ¼ãƒ‰ä¸ï¼Žï¼Žï¼Ž </text> </floater> diff --git a/indra/newview/skins/default/xui/ja/floater_voice_controls.xml b/indra/newview/skins/default/xui/ja/floater_voice_controls.xml index 5a0694e5c5..4b95aa544f 100644 --- a/indra/newview/skins/default/xui/ja/floater_voice_controls.xml +++ b/indra/newview/skins/default/xui/ja/floater_voice_controls.xml @@ -16,8 +16,13 @@ è¿‘ãã«ãƒœã‚¤ã‚¹ã‚’有効ã«ã—ã¦ã„る人ã¯ã„ã¾ã›ã‚“。 </string> <layout_stack name="my_call_stack"> - <layout_panel name="leave_call_btn_panel"> - <button label="コール終了" name="leave_call_btn"/> + <layout_panel name="my_panel"> + <text name="user_text" value="マイ ã‚¢ãƒã‚¿ãƒ¼ï¼š"/> </layout_panel> + <layout_stack name="voice_effect_and_leave_call_stack"> + <layout_panel name="leave_call_btn_panel"> + <button label="コール終了" name="leave_call_btn"/> + </layout_panel> + </layout_stack> </layout_stack> </floater> diff --git a/indra/newview/skins/default/xui/ja/floater_voice_effect.xml b/indra/newview/skins/default/xui/ja/floater_voice_effect.xml new file mode 100644 index 0000000000..dd7294718c --- /dev/null +++ b/indra/newview/skins/default/xui/ja/floater_voice_effect.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater label="å ´æ‰€" name="voice_effects" title="ボイスモーフィングã®ãƒ—レビュー"> + <string name="no_voice_effect"> + (ボイスモーフィングãªã—) + </string> + <string name="active_voice_effect"> + (アクティブ) + </string> + <string name="unsubscribed_voice_effect"> + ï¼ˆå–æ¶ˆã—済ã¿ï¼‰ + </string> + <string name="new_voice_effect"> + ï¼ˆæ–°ç™»å ´ï¼ï¼‰ + </string> + <text name="status_text"> + ボイスモーフィングをプレビューã—ã¦ã‚¨ãƒ•ェクトを確ã‹ã‚ã‚‹ã«ã¯ã€éŒ²éŸ³ãƒœã‚¿ãƒ³ã‚’押ã—ã¦ã”自分ã®å£°ã‚’å°‘ã—録音ã—ã¦ã‹ã‚‰ã€ãƒªã‚¹ãƒˆã«ã‚るボイスモーフィングを1ã¤ã‚¯ãƒªãƒƒã‚¯ã—ã¾ã™ã€‚ + +ã“ã®ã‚¦ã‚¤ãƒ³ãƒ‰ã‚¦ã‚’é–‰ã˜ã‚‹ã¨ã€ã€Œè¿‘ãã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã€ã«å†æŽ¥ç¶šã•れã¾ã™ã€‚ + </text> + <button label="声を録音" name="record_btn" tool_tip="ã‚ãªãŸã®å£°ã‚’録音ã—ã¾ã™ã€‚"/> + <button label="åœæ¢" name="record_stop_btn"/> + <text name="voice_morphing_link"> + [[URL]ボイスモーフィングをå–å¾—] + </text> + <scroll_list name="voice_effect_list" tool_tip="声を録音ã—ã¦ãƒœã‚¤ã‚¹ãƒ¢ãƒ¼ãƒ•ィングを1ã¤ã‚¯ãƒªãƒƒã‚¯ã™ã‚‹ã¨ã€ãã®ã‚¨ãƒ•ェクトをプレビューã§ãã¾ã™ã€‚"> + <scroll_list.columns label="ボイスモーフィング" name="name"/> + <scroll_list.columns label="有効期é™" name="expires"/> + </scroll_list> +</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_water.xml b/indra/newview/skins/default/xui/ja/floater_water.xml index 52cd91a08a..fb64332e79 100644 --- a/indra/newview/skins/default/xui/ja/floater_water.xml +++ b/indra/newview/skins/default/xui/ja/floater_water.xml @@ -28,10 +28,10 @@ <slider label="2" name="WaterNormalScaleY"/> <slider label="3" name="WaterNormalScaleZ"/> <text name="HDText"> - フレãƒãƒ«ãƒ»ã‚¹ã‚±ãƒ¼ãƒ« + フレãƒãƒ«ã®ã‚¹ã‚±ãƒ¼ãƒ« </text> <text name="FresnelOffsetText"> - フレãƒãƒ«ãƒ»ã‚ªãƒ•セット + フレãƒãƒ«ã®ã‚ªãƒ•セット </text> <text name="DensMultText"> æ°´é¢ã®å±ˆæŠ˜ã‚¹ã‚±ãƒ¼ãƒ« @@ -63,7 +63,7 @@ Y </text> <text name="BHText3"> - ノーマル・マップ + ノーマルマップ </text> </panel> </tab_container> diff --git a/indra/newview/skins/default/xui/ja/floater_wearable_save_as.xml b/indra/newview/skins/default/xui/ja/floater_wearable_save_as.xml index fc9ddf5096..de8b590a80 100644 --- a/indra/newview/skins/default/xui/ja/floater_wearable_save_as.xml +++ b/indra/newview/skins/default/xui/ja/floater_wearable_save_as.xml @@ -1,9 +1,9 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="modal container" title=" "> - <button label="ä¿å˜" label_selected="ä¿å˜" name="Save" /> - <button label="å–り消ã—" label_selected="å–り消ã—" name="Cancel" /> + <button label="ä¿å˜" label_selected="ä¿å˜" name="Save"/> + <button label="å–り消ã—" label_selected="å–り消ã—" name="Cancel"/> <text name="Save item as:"> - アイテムを別åã§ä¿å˜ï¼š + アイテムを別åã§æŒã¡ç‰©ã«ä¿å˜ï¼š </text> <line_editor name="name ed"> New [DESC] diff --git a/indra/newview/skins/default/xui/ja/floater_window_size.xml b/indra/newview/skins/default/xui/ja/floater_window_size.xml index a31336c0f8..152a5f4806 100644 --- a/indra/newview/skins/default/xui/ja/floater_window_size.xml +++ b/indra/newview/skins/default/xui/ja/floater_window_size.xml @@ -4,7 +4,7 @@ [RES_X] x [RES_Y] </string> <text name="windowsize_text"> - ウィンドウã®ã‚µã‚¤ã‚ºã®è¨å®šï¼š + ウィンドウã®ã‚µã‚¤ã‚ºã‚’è¨å®šï¼š </text> <combo_box name="window_size_combo" tool_tip="横幅 x 高ã•"> <combo_box.item label="1000 x 700 (標準)" name="item0"/> diff --git a/indra/newview/skins/default/xui/ja/floater_world_map.xml b/indra/newview/skins/default/xui/ja/floater_world_map.xml index a0f2d98adf..ce9e7d0777 100644 --- a/indra/newview/skins/default/xui/ja/floater_world_map.xml +++ b/indra/newview/skins/default/xui/ja/floater_world_map.xml @@ -2,13 +2,13 @@ <floater name="worldmap" title="世界地図"> <panel name="layout_panel_1"> <text name="events_label"> - レジェンド + è¡¨è¨˜ãƒ»è¨˜å· </text> </panel> - <panel> - <button label="ç¾åœ¨åœ°ã‚’表示" label_selected="ç¾åœ¨åœ°ã‚’表示" name="Show My Location" tool_tip="マップをä¸å¤®ã«è¡¨ç¤ºã™ã‚‹"/> + <panel name="layout_panel_2"> + <button label="ç¾åœ¨åœ°ã‚’表示" label_selected="ç¾åœ¨åœ°ã‚’表示" name="Show My Location" tool_tip="ã‚¢ãƒã‚¿ãƒ¼ã®ä½ç½®ã‚’地図ã®ä¸å¿ƒã«è¡¨ç¤ºã—ã¾ã™"/> <text name="me_label"> - ミー + 自分 </text> <check_box label="ä½äºº" name="people_chk"/> <text name="person_label"> @@ -23,12 +23,12 @@ 土地販売 </text> <text name="by_owner_label"> - by owner + 所有者ã®è²©å£² </text> <text name="auction_label"> 土地オークション </text> - <button label="ホームã¸" label_selected="ホームã¸" name="Go Home" tool_tip="「ホームã€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ"/> + <button label="ホームã¸" label_selected="ホームã¸" name="Go Home" tool_tip="「ホームã€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™"/> <text name="Home_label"> ホーム</text> @@ -37,45 +37,46 @@ </text> <check_box label="PG" name="event_chk"/> <text name="pg_label"> - 一般 + General </text> <check_box initial_value="true" label="Mature" name="event_mature_chk"/> <text name="mature_label"> - 控ãˆã‚ + Moderate </text> <check_box label="Adult" name="event_adult_chk"/> <text name="adult_label"> - アダルト + Adult </text> </panel> - <panel> + <panel name="layout_panel_3"> <text name="find_on_map_label"> - åœ°å›³ã§æŽ¢ã™ + 地図上ã§è¦‹ã¤ã‘ã‚‹ </text> </panel> - <panel> + <panel name="layout_panel_4"> <combo_box label="オンラインã®ãƒ•レンド" name="friend combo" tool_tip="フレンドを地図ã«è¡¨ç¤º"> <combo_box.item label="オンラインã®ãƒ•レンド" name="item1"/> </combo_box> - <combo_box label="マイ ランドマーク" name="landmark combo" tool_tip="地図ã«è¡¨ç¤ºã™ã‚‹ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯"> + <combo_box label="マイ ランドマーク" name="landmark combo" tool_tip="地図上ã«è¡¨ç¤ºã™ã‚‹ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯"> <combo_box.item label="マイ ランドマーク" name="item1"/> </combo_box> - <search_editor label="リージョンå" name="location" tool_tip="地域åを入力ã—ã¦ãã ã•ã„。"/> - <button label="検索" name="DoSearch" tool_tip="地域検索"/> + <search_editor label="リージョンå" name="location" tool_tip="リージョンåを入力ã—ã¾ã™"/> + <button label="検索" name="DoSearch" tool_tip="リージョン検索"/> + <button name="Clear" tool_tip="追跡ラインをクリアã—ã¦åœ°å›³ã‚’リセットã—ã¾ã™"/> <scroll_list name="search_results"> <scroll_list.columns label="" name="icon"/> <scroll_list.columns label="" name="sim_name"/> </scroll_list> - <button label="テレãƒãƒ¼ãƒˆ" label_selected="テレãƒãƒ¼ãƒˆ" name="Teleport" tool_tip="é¸æŠžã•れãŸãƒã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ"/> - <button label="SLurl をコピー" name="copy_slurl" tool_tip="ç¾åœ¨åœ°ã‚’ SLurl ã¨ã—ã¦ã‚³ãƒ”ーã—ã¦ã€Webã§ä½¿ç”¨ã—ã¾ã™ã€‚"/> - <button label="é¸æŠžã—ãŸãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã‚’表示ã™ã‚‹" label_selected="目的地を表示" name="Show Destination" tool_tip="é¸æŠžã—ãŸãƒã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã‚’地図ã®ä¸å¿ƒã«ã™ã‚‹"/> + <button label="テレãƒãƒ¼ãƒˆ" label_selected="テレãƒãƒ¼ãƒˆ" name="Teleport" tool_tip="é¸æŠžã—ãŸå ´æ‰€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™"/> + <button label="SLurl をコピー" name="copy_slurl" tool_tip="ç¾åœ¨åœ°ã® SLurl をコピーã—㦠Web ã§ä½¿ç”¨ã—ã¾ã™"/> + <button label="é¸æŠžã‚’è¡¨ç¤ºã™ã‚‹" label_selected="目的地を表示" name="Show Destination" tool_tip="é¸æŠžã—ãŸå ´æ‰€ã‚’地図ã®ä¸å¿ƒã«è¡¨ç¤ºã—ã¾ã™"/> </panel> - <panel> + <panel name="layout_panel_5"> <text name="zoom_label"> ズーム</text> </panel> - <panel> + <panel name="layout_panel_6"> <slider label="ズーム" name="zoom slider"/> </panel> </floater> diff --git a/indra/newview/skins/default/xui/ja/inspect_avatar.xml b/indra/newview/skins/default/xui/ja/inspect_avatar.xml index 9371b80af5..fb4937242b 100644 --- a/indra/newview/skins/default/xui/ja/inspect_avatar.xml +++ b/indra/newview/skins/default/xui/ja/inspect_avatar.xml @@ -18,9 +18,9 @@ <slider name="volume_slider" tool_tip="ボイス音é‡" value="0.5"/> <button label="フレンド登録" name="add_friend_btn"/> <button label="IM" name="im_btn"/> - <button label="詳細" name="view_profile_btn"/> + <button label="プãƒãƒ•ィール" name="view_profile_btn"/> <panel name="moderator_panel"> - <button label="ボイスを無効ã«ã™ã‚‹" name="disable_voice"/> - <button label="ボイスを有効ã«ã™ã‚‹" name="enable_voice"/> + <button label="ボイスを無効" name="disable_voice"/> + <button label="ボイスを有効" name="enable_voice"/> </panel> </floater> diff --git a/indra/newview/skins/default/xui/ja/inspect_object.xml b/indra/newview/skins/default/xui/ja/inspect_object.xml index 842030c39a..e6999ac9b1 100644 --- a/indra/newview/skins/default/xui/ja/inspect_object.xml +++ b/indra/newview/skins/default/xui/ja/inspect_object.xml @@ -8,8 +8,8 @@ 制作者: [CREATOR] </string> <string name="CreatorAndOwner"> - 制作者: [CREATOR] -所有者: [OWNER] + [CREATOR]ã«ã‚ˆã‚‹ãƒã‚§ãƒƒã‚¯ +[OWNER]ã«ã‚ˆã‚‹ãƒã‚§ãƒƒã‚¯ </string> <string name="Price"> L$[AMOUNT] @@ -23,16 +23,16 @@ <string name="Sit"> 座る </string> - <text name="object_name" value="Test Object Name That Is Really Long"/> + <text name="object_name" value="二行ã«ã‚ãŸã‚‹é•·ã„オブジェクトåをテスト"/> <text name="object_creator"> by secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about owner secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about </text> <text name="price_text"> - L$300,000 + L$30,000 </text> <text name="object_description"> - This is a really long description for an object being as how it is at least 80 characters in length and maybe more like 120 at this point. Who knows, really? + This is a really long description for an object being as how it is at least 80 characters in length and so but maybe more like 120 at this point. Who knows, really? </text> <text name="object_media_url"> http://www.superdupertest.com diff --git a/indra/newview/skins/default/xui/ja/language_settings.xml b/indra/newview/skins/default/xui/ja/language_settings.xml index 71418d446a..72382417d9 100644 --- a/indra/newview/skins/default/xui/ja/language_settings.xml +++ b/indra/newview/skins/default/xui/ja/language_settings.xml @@ -3,9 +3,9 @@ <strings> <!-- Locale Information --> - <string name="MicrosoftLocale">english</string> - <string name="DarwinLocale">C</string> - <string name="LinuxLocale">C</string> + <string name="MicrosoftLocale">japanese</string> + <string name="DarwinLocale">ja_JP.UTF-8</string> + <string name="LinuxLocale">ja_JP.UTF-8</string> <!-- datetimeToCodes["wkday"] = "%a"; // Thu diff --git a/indra/newview/skins/default/xui/ja/menu_attachment_other.xml b/indra/newview/skins/default/xui/ja/menu_attachment_other.xml index f163c2cf4f..5adf0b3745 100644 --- a/indra/newview/skins/default/xui/ja/menu_attachment_other.xml +++ b/indra/newview/skins/default/xui/ja/menu_attachment_other.xml @@ -10,7 +10,7 @@ <menu_item_call label="å ±å‘Š" name="abuse"/> <menu_item_call label="フリーズ" name="Freeze..."/> <menu_item_call label="追放" name="Eject..."/> - <menu_item_call label="デãƒãƒƒã‚°" name="Debug..."/> + <menu_item_call label="テクスãƒãƒ£ã®ãƒ‡ãƒãƒƒã‚°" name="Debug..."/> <menu_item_call label="ズームイン" name="Zoom In"/> <menu_item_call label="支払ã†" name="Pay..."/> <menu_item_call label="オブジェクトã®ãƒ—ãƒãƒ•ィール" name="Object Inspect"/> diff --git a/indra/newview/skins/default/xui/ja/menu_attachment_self.xml b/indra/newview/skins/default/xui/ja/menu_attachment_self.xml index 209edd80ba..48200cb53f 100644 --- a/indra/newview/skins/default/xui/ja/menu_attachment_self.xml +++ b/indra/newview/skins/default/xui/ja/menu_attachment_self.xml @@ -5,8 +5,9 @@ <menu_item_call label="å–り外ã™" name="Detach"/> <menu_item_call label="下ã«è½ã¨ã™" name="Drop"/> <menu_item_call label="ç«‹ã¡ä¸ŠãŒã‚‹" name="Stand Up"/> - <menu_item_call label="容姿" name="Appearance..."/> + <menu_item_call label="アウトフィットを変更" name="Change Outfit"/> <menu_item_call label="フレンド" name="Friends..."/> <menu_item_call label="グループ" name="Groups..."/> <menu_item_call label="プãƒãƒ•ィール" name="Profile..."/> + <menu_item_call label="テクスãƒãƒ£ã®ãƒ‡ãƒãƒƒã‚°" name="Debug..."/> </context_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_avatar_other.xml b/indra/newview/skins/default/xui/ja/menu_avatar_other.xml index 74d877cdda..54dd96f5ef 100644 --- a/indra/newview/skins/default/xui/ja/menu_avatar_other.xml +++ b/indra/newview/skins/default/xui/ja/menu_avatar_other.xml @@ -10,7 +10,7 @@ <menu_item_call label="å ±å‘Š" name="abuse"/> <menu_item_call label="フリーズ" name="Freeze..."/> <menu_item_call label="追放" name="Eject..."/> - <menu_item_call label="デãƒãƒƒã‚°" name="Debug..."/> + <menu_item_call label="テクスãƒãƒ£ã®ãƒ‡ãƒãƒƒã‚°" name="Debug..."/> <menu_item_call label="ズームイン" name="Zoom In"/> <menu_item_call label="支払ã†" name="Pay..."/> </context_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_avatar_self.xml b/indra/newview/skins/default/xui/ja/menu_avatar_self.xml index 1bfadf8d45..6899a819b8 100644 --- a/indra/newview/skins/default/xui/ja/menu_avatar_self.xml +++ b/indra/newview/skins/default/xui/ja/menu_avatar_self.xml @@ -1,8 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Self Pie"> <menu_item_call label="ç«‹ã¡ä¸ŠãŒã‚‹" name="Stand Up"/> - <context_menu label="脱ã>" name="Take Off >"> - <context_menu label="衣類 >" name="Clothes >"> + <context_menu label="脱ã â–¶" name="Take Off >"> + <context_menu label="衣類 â–¶" name="Clothes >"> <menu_item_call label="シャツ" name="Shirt"/> <menu_item_call label="パンツ" name="Pants"/> <menu_item_call label="スカート" name="Skirt"/> @@ -16,12 +16,15 @@ <menu_item_call label="アルファ" name="Self Alpha"/> <menu_item_call label="ã™ã¹ã¦ã®è¡£é¡ž" name="All Clothes"/> </context_menu> - <context_menu label="HUD >" name="Object Detach HUD"/> - <context_menu label="å–り外㙠>" name="Object Detach"/> + <context_menu label="HUD â–¶" name="Object Detach HUD"/> + <context_menu label="å–り外㙠▶" name="Object Detach"/> <menu_item_call label="ã™ã¹ã¦å–り外ã™" name="Detach All"/> </context_menu> - <menu_item_call label="容姿" name="Appearance..."/> + <menu_item_call label="アウトフィットを変更" name="Chenge Outfit"/> + <menu_item_call label="アウトフィットを編集" name="Edit Outfit"/> + <menu_item_call label="シェイプを編集" name="Edit My Shape"/> <menu_item_call label="フレンド" name="Friends..."/> <menu_item_call label="グループ" name="Groups..."/> - <menu_item_call label="マイ プãƒãƒ•ィール" name="Profile..."/> + <menu_item_call label="プãƒãƒ•ィール" name="Profile..."/> + <menu_item_call label="テクスãƒãƒ£ã®ãƒ‡ãƒãƒƒã‚°" name="Debug..."/> </context_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_bottomtray.xml b/indra/newview/skins/default/xui/ja/menu_bottomtray.xml index ea7ba1b741..e5703c559b 100644 --- a/indra/newview/skins/default/xui/ja/menu_bottomtray.xml +++ b/indra/newview/skins/default/xui/ja/menu_bottomtray.xml @@ -4,6 +4,11 @@ <menu_item_check label="移動ボタン" name="ShowMoveButton"/> <menu_item_check label="視界ボタン" name="ShowCameraButton"/> <menu_item_check label="スナップショットボタン" name="ShowSnapshotButton"/> + <menu_item_check label="サイドãƒãƒ¼ãƒœã‚¿ãƒ³" name="ShowSidebarButton"/> + <menu_item_check label="制作ボタン" name="ShowBuildButton"/> + <menu_item_check label="検索ボタン" name="ShowSearchButton"/> + <menu_item_check label="地図ボタン" name="ShowWorldMapButton"/> + <menu_item_check label="ミニマップボタン" name="ShowMiniMapButton"/> <menu_item_call label="切りå–り" name="NearbyChatBar_Cut"/> <menu_item_call label="コピー" name="NearbyChatBar_Copy"/> <menu_item_call label="貼り付ã‘" name="NearbyChatBar_Paste"/> diff --git a/indra/newview/skins/default/xui/ja/menu_cof_attachment.xml b/indra/newview/skins/default/xui/ja/menu_cof_attachment.xml new file mode 100644 index 0000000000..e786d02e40 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_cof_attachment.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="COF Attachment"> + <menu_item_call label="å–り外ã™" name="detach"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_cof_body_part.xml b/indra/newview/skins/default/xui/ja/menu_cof_body_part.xml new file mode 100644 index 0000000000..eb5faa2545 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_cof_body_part.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="COF Body"> + <menu_item_call label="交æ›" name="replace"/> + <menu_item_call label="編集" name="edit"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_cof_clothing.xml b/indra/newview/skins/default/xui/ja/menu_cof_clothing.xml new file mode 100644 index 0000000000..9da909fa17 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_cof_clothing.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="COF Clothing"> + <menu_item_call label="å–り外ã™" name="take_off"/> + <menu_item_call label="上ã®ãƒ¬ã‚¤ãƒ¤ãƒ¼ã«ç§»å‹•" name="move_up"/> + <menu_item_call label="下ã®ãƒ¬ã‚¤ãƒ¤ãƒ¼ã«ç§»å‹•" name="move_down"/> + <menu_item_call label="編集" name="edit"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_cof_gear.xml b/indra/newview/skins/default/xui/ja/menu_cof_gear.xml new file mode 100644 index 0000000000..a071abbd2e --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_cof_gear.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Gear COF"> + <menu label="衣類" name="COF.Gear.New_Clothes"/> + <menu label="æ–°ã—ã„身体部ä½" name="COF.Geear.New_Body_Parts"/> +</menu> diff --git a/indra/newview/skins/default/xui/ja/menu_edit.xml b/indra/newview/skins/default/xui/ja/menu_edit.xml new file mode 100644 index 0000000000..c2ef0179b2 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_edit.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu label="編集" name="Edit"> + <menu_item_call label="å…ƒã«æˆ»ã™" name="Undo"/> + <menu_item_call label="やり直ã—" name="Redo"/> + <menu_item_call label="切りå–り" name="Cut"/> + <menu_item_call label="コピー" name="Copy"/> + <menu_item_call label="貼り付ã‘" name="Paste"/> + <menu_item_call label="削除" name="Delete"/> + <menu_item_call label="複製" name="Duplicate"/> + <menu_item_call label="ã™ã¹ã¦é¸æŠž" name="Select All"/> + <menu_item_call label="é¸æŠžè§£é™¤" name="Deselect"/> +</menu> diff --git a/indra/newview/skins/default/xui/ja/menu_hide_navbar.xml b/indra/newview/skins/default/xui/ja/menu_hide_navbar.xml index 09e70b0d1f..3a1ae49700 100644 --- a/indra/newview/skins/default/xui/ja/menu_hide_navbar.xml +++ b/indra/newview/skins/default/xui/ja/menu_hide_navbar.xml @@ -2,4 +2,5 @@ <menu name="hide_navbar_menu"> <menu_item_check label="ナビゲーションãƒãƒ¼ã‚’表示" name="ShowNavbarNavigationPanel"/> <menu_item_check label="ãŠæ°—ã«å…¥ã‚Šãƒãƒ¼ã‚’表示" name="ShowNavbarFavoritesPanel"/> + <menu_item_check label="ã€Œå ´æ‰€ã€ã®ãƒŸãƒ‹ãƒ•ィールドを表示" name="ShowMiniLocationPanel"/> </menu> diff --git a/indra/newview/skins/default/xui/ja/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/ja/menu_inspect_avatar_gear.xml index 3d5086c52a..5fdaa9ae6b 100644 --- a/indra/newview/skins/default/xui/ja/menu_inspect_avatar_gear.xml +++ b/indra/newview/skins/default/xui/ja/menu_inspect_avatar_gear.xml @@ -11,8 +11,9 @@ <menu_item_call label="å ±å‘Š" name="report"/> <menu_item_call label="フリーズ" name="freeze"/> <menu_item_call label="追放" name="eject"/> - <menu_item_call label="デãƒãƒƒã‚°" name="debug"/> + <menu_item_call label="テクスãƒãƒ£ã®ãƒ‡ãƒãƒƒã‚°" name="debug"/> <menu_item_call label="åœ°å›³ã§æŽ¢ã™" name="find_on_map"/> <menu_item_call label="ズームイン" name="zoom_in"/> <menu_item_call label="支払ã†" name="pay"/> + <menu_item_call label="共有" name="share"/> </menu> diff --git a/indra/newview/skins/default/xui/ja/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/ja/menu_inspect_self_gear.xml index 76c01d6109..ee054673c5 100644 --- a/indra/newview/skins/default/xui/ja/menu_inspect_self_gear.xml +++ b/indra/newview/skins/default/xui/ja/menu_inspect_self_gear.xml @@ -1,8 +1,9 @@ <?xml version="1.0" encoding="utf-8"?> <menu name="Gear Menu"> <menu_item_call label="ç«‹ã¡ä¸ŠãŒã‚‹" name="stand_up"/> - <menu_item_call label="マイ 容姿" name="my_appearance"/> + <menu_item_call label="アウトフィットを変更" name="change_outfit"/> <menu_item_call label="プãƒãƒ•ィール" name="my_profile"/> <menu_item_call label="フレンド" name="my_friends"/> <menu_item_call label="グループ" name="my_groups"/> + <menu_item_call label="テクスãƒãƒ£ã®ãƒ‡ãƒãƒƒã‚°" name="Debug..."/> </menu> diff --git a/indra/newview/skins/default/xui/ja/menu_inv_offer_chiclet.xml b/indra/newview/skins/default/xui/ja/menu_inv_offer_chiclet.xml new file mode 100644 index 0000000000..9a4a8138f5 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_inv_offer_chiclet.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="InvOfferChiclet Menu"> + <menu_item_call label="é–‰ã˜ã‚‹" name="Close"/> +</menu> diff --git a/indra/newview/skins/default/xui/ja/menu_inventory.xml b/indra/newview/skins/default/xui/ja/menu_inventory.xml index 78c0dd0a78..782b9ea5a5 100644 --- a/indra/newview/skins/default/xui/ja/menu_inventory.xml +++ b/indra/newview/skins/default/xui/ja/menu_inventory.xml @@ -1,13 +1,14 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="Popup"> + <menu_item_call label="共有" name="Share"/> <menu_item_call label="購入" name="Task Buy"/> <menu_item_call label="é–‹ã" name="Task Open"/> <menu_item_call label="å†ç”Ÿ" name="Task Play"/> <menu_item_call label="プãƒãƒ‘ティ" name="Task Properties"/> <menu_item_call label="åå‰ã®å¤‰æ›´" name="Task Rename"/> <menu_item_call label="削除" name="Task Remove"/> - <menu_item_call label="ゴミ箱を空ã«ã™ã‚‹" name="Empty Trash"/> - <menu_item_call label="éºå¤±ç‰©ãƒ•ォルダを空ã«ã™ã‚‹" name="Empty Lost And Found"/> + <menu_item_call label="ã”ã¿ç®±ã‚’空ã«ã™ã‚‹" name="Empty Trash"/> + <menu_item_call label="紛失物フォルダを空ã«ã™ã‚‹" name="Empty Lost And Found"/> <menu_item_call label="æ–°ã—ã„フォルダ" name="New Folder"/> <menu_item_call label="æ–°ã—ã„スクリプト" name="New Script"/> <menu_item_call label="æ–°ã—ã„ノートカード" name="New Note"/> @@ -49,36 +50,38 @@ <menu_item_call label="ç€ç”¨ä¸ã®ã‚¢ã‚¦ãƒˆãƒ•ィットを入れ替ãˆã‚‹" name="Replace Outfit"/> <menu_item_call label="ç€ç”¨ä¸ã®ã‚¢ã‚¦ãƒˆãƒ•ィットã«è¿½åŠ ã™ã‚‹" name="Add To Outfit"/> <menu_item_call label="ç€ç”¨ä¸ã®ã‚¢ã‚¦ãƒˆãƒ•ィットã‹ã‚‰å–り除ã" name="Remove From Outfit"/> - <menu_item_call label="アイテムを除外" name="Purge Item"/> - <menu_item_call label="アイテムを復元" name="Restore Item"/> <menu_item_call label="オリジナルを探ã™" name="Find Original"/> + <menu_item_call label="アイテムを除外ã™ã‚‹" name="Purge Item"/> + <menu_item_call label="アイテムを復元ã™ã‚‹" name="Restore Item"/> <menu_item_call label="é–‹ã" name="Open"/> + <menu_item_call label="オリジナルを開ãã¾ã™" name="Open Original"/> <menu_item_call label="プãƒãƒ‘ティ" name="Properties"/> - <menu_item_call label="åå‰ã®å¤‰æ›´" name="Rename"/> - <menu_item_call label="UUIDをコピー" name="Copy Asset UUID"/> + <menu_item_call label="åå‰ã‚’変更ã™ã‚‹" name="Rename"/> + <menu_item_call label="UUID をコピーã™ã‚‹" name="Copy Asset UUID"/> <menu_item_call label="コピー" name="Copy"/> <menu_item_call label="貼り付ã‘" name="Paste"/> - <menu_item_call label="リンクã®è²¼ã‚Šä»˜ã‘" name="Paste As Link"/> + <menu_item_call label="リンクを貼り付ã‘ã‚‹" name="Paste As Link"/> <menu_item_call label="リンクを外ã™" name="Remove Link"/> <menu_item_call label="削除" name="Delete"/> <menu_item_call label="システムフォルダを削除ã™ã‚‹" name="Delete System Folder"/> - <menu_item_call label="会è°ãƒãƒ£ãƒƒãƒˆé–‹å§‹" name="Conference Chat Folder"/> - <menu_item_call label="å†ç”Ÿ" name="Sound Play"/> + <menu_item_call label="コンファレンスãƒãƒ£ãƒƒãƒˆã‚’é–‹å§‹ã™ã‚‹" name="Conference Chat Folder"/> + <menu_item_call label="å†ç”Ÿã™ã‚‹" name="Sound Play"/> <menu_item_call label="ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã®æƒ…å ±" name="About Landmark"/> - <menu_item_call label="世界ã§å†ç”Ÿ" name="Animation Play"/> - <menu_item_call label="ãƒãƒ¼ã‚«ãƒ«ã«å†ç”Ÿ" name="Animation Audition"/> - <menu_item_call label="インスタント・メッセージをé€ä¿¡" name="Send Instant Message"/> - <menu_item_call label="テレãƒãƒ¼ãƒˆã‚’贈る..." name="Offer Teleport..."/> - <menu_item_call label="会è°ãƒãƒ£ãƒƒãƒˆé–‹å§‹" name="Conference Chat"/> + <menu_item_call label="インワールドã§å†ç”Ÿã™ã‚‹" name="Animation Play"/> + <menu_item_call label="ãƒãƒ¼ã‚«ãƒ«ã§å†ç”Ÿã™ã‚‹" name="Animation Audition"/> + <menu_item_call label="インスタントメッセージをé€ä¿¡ã™ã‚‹" name="Send Instant Message"/> + <menu_item_call label="テレãƒãƒ¼ãƒˆã‚’é€ã‚‹..." name="Offer Teleport..."/> + <menu_item_call label="コンファレンスãƒãƒ£ãƒƒãƒˆã‚’é–‹å§‹ã™ã‚‹" name="Conference Chat"/> <menu_item_call label="アクティブ" name="Activate"/> <menu_item_call label="éžã‚¢ã‚¯ãƒ†ã‚£ãƒ–" name="Deactivate"/> - <menu_item_call label="別åã§ä¿å˜" name="Save As"/> + <menu_item_call label="別åã§ä¿å˜ã™ã‚‹" name="Save As"/> <menu_item_call label="自分ã‹ã‚‰å–り外ã™" name="Detach From Yourself"/> <menu_item_call label="装ç€" name="Object Wear"/> <menu label="装ç€å…ˆ" name="Attach To"/> - <menu label="HUD装ç€å…ˆ" name="Attach To HUD"/> + <menu label="HUD 装ç€å…ˆ" name="Attach To HUD"/> <menu_item_call label="編集" name="Wearable Edit"/> <menu_item_call label="装ç€" name="Wearable Wear"/> + <menu_item_call label="è¿½åŠ " name="Wearable Add"/> <menu_item_call label="å–り外ã™" name="Take Off"/> <menu_item_call label="ï¼ï¼ã‚ªãƒ—ションãªã—ï¼ï¼" name="--no options--"/> </menu> diff --git a/indra/newview/skins/default/xui/ja/menu_login.xml b/indra/newview/skins/default/xui/ja/menu_login.xml index 42a95ac3d3..e2a7f39dfd 100644 --- a/indra/newview/skins/default/xui/ja/menu_login.xml +++ b/indra/newview/skins/default/xui/ja/menu_login.xml @@ -8,25 +8,17 @@ <menu_item_call label="[SECOND_LIFE] ヘルプ" name="Second Life Help"/> <menu_item_call label="[APP_NAME] ã«ã¤ã„ã¦" name="About Second Life"/> </menu> + <menu_item_check label="デãƒãƒƒã‚°ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã‚’表示ã™ã‚‹" name="Show Debug Menu"/> <menu label="デãƒãƒƒã‚°" name="Debug"> - <menu label="編集" name="Edit"> - <menu_item_call label="å…ƒã«æˆ»ã™" name="Undo"/> - <menu_item_call label="やり直ã—" name="Redo"/> - <menu_item_call label="切りå–り" name="Cut"/> - <menu_item_call label="コピー" name="Copy"/> - <menu_item_call label="貼り付ã‘" name="Paste"/> - <menu_item_call label="削除" name="Delete"/> - <menu_item_call label="複製" name="Duplicate"/> - <menu_item_call label="ã™ã¹ã¦é¸æŠž" name="Select All"/> - <menu_item_call label="é¸æŠžè§£é™¤" name="Deselect"/> - </menu> <menu_item_call label="デãƒãƒƒã‚°è¨å®šã‚’表示" name="Debug Settings"/> <menu_item_call label="UI/色ã®è¨å®š" name="UI/Color Settings"/> <menu_item_call label="XUI プレビューツール" name="UI Preview Tool"/> <menu label="UI テスト" name="UI Tests"/> - <menu_item_call label="ウィンドウã®ã‚µã‚¤ã‚ºã®è¨å®š..." name="Set Window Size..."/> + <menu_item_call label="ウィンドウã®ã‚µã‚¤ã‚ºã‚’è¨å®š..." name="Set Window Size..."/> <menu_item_call label="利用è¦ç´„を表示" name="TOS"/> <menu_item_call label="クリティカルメッセージを表示" name="Critical"/> <menu_item_call label="Web ブラウザã®ãƒ†ã‚¹ãƒˆ" name="Web Browser Test"/> + <menu_item_check label="グリッドピッカーを表示ã™ã‚‹" name="Show Grid Picker"/> + <menu_item_call label="通知コンソールを表示ã™ã‚‹" name="Show Notifications Console"/> </menu> </menu_bar> diff --git a/indra/newview/skins/default/xui/ja/menu_mini_map.xml b/indra/newview/skins/default/xui/ja/menu_mini_map.xml index ec49c3a98d..0a89c5e63a 100644 --- a/indra/newview/skins/default/xui/ja/menu_mini_map.xml +++ b/indra/newview/skins/default/xui/ja/menu_mini_map.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="popup"> +<menu name="Popup"> <menu_item_call label="ズーム(近)" name="Zoom Close"/> <menu_item_call label="ズーム(ä¸ï¼‰" name="Zoom Medium"/> <menu_item_call label="ズーム(é )" name="Zoom Far"/> diff --git a/indra/newview/skins/default/xui/ja/menu_object.xml b/indra/newview/skins/default/xui/ja/menu_object.xml index a161c01514..e59a500534 100644 --- a/indra/newview/skins/default/xui/ja/menu_object.xml +++ b/indra/newview/skins/default/xui/ja/menu_object.xml @@ -5,20 +5,22 @@ <menu_item_call label="制作" name="Build"/> <menu_item_call label="é–‹ã" name="Open"/> <menu_item_call label="ã“ã“ã«åº§ã‚‹" name="Object Sit"/> + <menu_item_call label="ç«‹ã¡ä¸ŠãŒã‚‹" name="Object Stand Up"/> <menu_item_call label="オブジェクトã®ãƒ—ãƒãƒ•ィール" name="Object Inspect"/> <menu_item_call label="ズームイン" name="Zoom In"/> - <context_menu label="è£…ç€ >" name="Put On"> + <context_menu label="è£…ç€ â–¶" name="Put On"> <menu_item_call label="装ç€" name="Wear"/> - <context_menu label="å–り付㑠>" name="Object Attach"/> - <context_menu label="HUD ã‚’å–り付㑠>" name="Object Attach HUD"/> + <context_menu label="å–り付ã‘ã‚‹ â–¶" name="Object Attach"/> + <context_menu label="HUD ã‚’å–り付ã‘ã‚‹ â–¶" name="Object Attach HUD"/> </context_menu> - <context_menu label="削除 >" name="Remove"> - <menu_item_call label="å–ã‚‹" name="Pie Object Take"/> + <context_menu label="å–り除ã â–¶" name="Remove"> <menu_item_call label="嫌ãŒã‚‰ã›ã®å ±å‘Š" name="Report Abuse..."/> <menu_item_call label="ブãƒãƒƒã‚¯" name="Object Mute"/> <menu_item_call label="è¿”å´" name="Return..."/> <menu_item_call label="削除" name="Delete"/> </context_menu> + <menu_item_call label="è²·ã†" name="Pie Object Bye"/> + <menu_item_call label="å–ã‚‹" name="Pie Object Take"/> <menu_item_call label="コピーをå–ã‚‹" name="Take Copy"/> <menu_item_call label="支払ã†" name="Pay..."/> <menu_item_call label="è²·ã†" name="Buy..."/> diff --git a/indra/newview/skins/default/xui/ja/menu_outfit_gear.xml b/indra/newview/skins/default/xui/ja/menu_outfit_gear.xml new file mode 100644 index 0000000000..e68ed5ccc7 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_outfit_gear.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Gear Outfit"> + <menu_item_call label="ç€ã‚‹ - ç€ç”¨ä¸ã®ã‚¢ã‚¦ãƒˆãƒ•ィットを入れ替ãˆã‚‹" name="wear"/> + <menu_item_call label="å–り外㙠- ç€ç”¨ä¸ã®ã‚¢ã‚¦ãƒˆãƒ•ィットã‹ã‚‰å–り除ã" name="take_off"/> + <menu label="衣類" name="New Clothes"> + <menu_item_call label="シャツ" name="New Shirt"/> + <menu_item_call label="パンツ" name="New Pants"/> + <menu_item_call label="é´" name="New Shoes"/> + <menu_item_call label="é´ä¸‹" name="New Socks"/> + <menu_item_call label="ジャケット" name="New Jacket"/> + <menu_item_call label="スカート" name="New Skirt"/> + <menu_item_call label="手袋" name="New Gloves"/> + <menu_item_call label="下ç€ï¼ˆä¸Šï¼‰" name="New Undershirt"/> + <menu_item_call label="下ç€ï¼ˆä¸‹ï¼‰" name="New Underpants"/> + <menu_item_call label="アルファ" name="New Alpha"/> + <menu_item_call label="æ–°ã—ã„タトゥ" name="New Tattoo"/> + </menu> + <menu label="æ–°ã—ã„身体部ä½" name="New Body Parts"> + <menu_item_call label="æ–°ã—ã„シェイプ" name="New Shape"/> + <menu_item_call label="スã‚ン" name="New Skin"/> + <menu_item_call label="髪" name="New Hair"/> + <menu_item_call label="ç›®" name="New Eyes"/> + </menu> + <menu_item_call label="アウトフィットã®åå‰ã‚’変更ã™ã‚‹" name="rename"/> + <menu_item_call label="アウトフィットを削除ã™ã‚‹" name="delete_outfit"/> +</menu> diff --git a/indra/newview/skins/default/xui/ja/menu_outfit_tab.xml b/indra/newview/skins/default/xui/ja/menu_outfit_tab.xml new file mode 100644 index 0000000000..8f4b61b702 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_outfit_tab.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Outfit"> + <menu_item_call label="ç€ã‚‹ - ç€ç”¨ä¸ã®ã‚¢ã‚¦ãƒˆãƒ•ィットを入れ替ãˆã‚‹" name="wear_replace"/> + <menu_item_call label="ç€ã‚‹ - ç€ç”¨ä¸ã®ã‚¢ã‚¦ãƒˆãƒ•ィットã«è¿½åŠ ã™ã‚‹" name="wear_add"/> + <menu_item_call label="å–り外㙠- ç€ç”¨ä¸ã®ã‚¢ã‚¦ãƒˆãƒ•ィットã‹ã‚‰å–り除ã" name="take_off"/> + <menu_item_call label="アウトフィットã®ç·¨é›†" name="edit"/> + <menu_item_call label="åå‰ã®å¤‰æ›´" name="rename"/> + <menu_item_call label="アウトフィットを削除ã™ã‚‹" name="delete"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_participant_list.xml b/indra/newview/skins/default/xui/ja/menu_participant_list.xml index 398a78bb61..3ef83756cb 100644 --- a/indra/newview/skins/default/xui/ja/menu_participant_list.xml +++ b/indra/newview/skins/default/xui/ja/menu_participant_list.xml @@ -8,13 +8,14 @@ <menu_item_call label="コール" name="Call"/> <menu_item_call label="共有" name="Share"/> <menu_item_call label="支払ã†" name="Pay"/> + <menu_item_check label="人ã®ã‚¢ã‚¤ã‚³ãƒ³è¡¨ç¤º" name="View Icons"/> <menu_item_check label="ボイスをブãƒãƒƒã‚¯" name="Block/Unblock"/> - <menu_item_check label="æ–‡å—をブãƒãƒƒã‚¯ã™ã‚‹" name="MuteText"/> + <menu_item_check label="æ–‡å—をブãƒãƒƒã‚¯" name="MuteText"/> <context_menu label="モデレーターã®ã‚ªãƒ—ション >" name="Moderator Options"> <menu_item_check label="æ–‡å—ãƒãƒ£ãƒƒãƒˆã‚’許å¯" name="AllowTextChat"/> <menu_item_call label="ã“ã®å‚åŠ è€…ã‚’ãƒŸãƒ¥ãƒ¼ãƒˆã™ã‚‹" name="ModerateVoiceMuteSelected"/> - <menu_item_call label="ä»–ã®äººå…¨å“¡ã‚’ミュートã™ã‚‹" name="ModerateVoiceMuteOthers"/> <menu_item_call label="ã“ã®å‚åŠ è€…ã®ãƒŸãƒ¥ãƒ¼ãƒˆã‚’解除ã™ã‚‹" name="ModerateVoiceUnMuteSelected"/> - <menu_item_call label="ä»–ã®äººå…¨å“¡ã®ãƒŸãƒ¥ãƒ¼ãƒˆã‚’解除ã™ã‚‹" name="ModerateVoiceUnMuteOthers"/> + <menu_item_call label="全員をミュート" name="ModerateVoiceMute"/> + <menu_item_call label="全員ã®ãƒŸãƒ¥ãƒ¼ãƒˆè§£é™¤" name="ModerateVoiceUnmute"/> </context_menu> </context_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_people_friends_view_sort.xml b/indra/newview/skins/default/xui/ja/menu_people_friends_view_sort.xml index e4ccbf43ad..5eaad31898 100644 --- a/indra/newview/skins/default/xui/ja/menu_people_friends_view_sort.xml +++ b/indra/newview/skins/default/xui/ja/menu_people_friends_view_sort.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="menu_group_plus"> <menu_item_check label="åå‰ã§ä¸¦ã¹æ›¿ãˆ" name="sort_name"/> - <menu_item_check label="オンライン状æ³ã§ä¸¦ã¹æ›¿ãˆ" name="sort_status"/> + <menu_item_check label="オンライン状態ã§ä¸¦ã¹æ›¿ãˆ" name="sort_status"/> <menu_item_check label="人ã®ã‚¢ã‚¤ã‚³ãƒ³è¡¨ç¤º" name="view_icons"/> <menu_item_call label="ブãƒãƒƒã‚¯ã•れãŸä½äººã¨ã‚ªãƒ–ジェクトを表示" name="show_blocked_list"/> </menu> diff --git a/indra/newview/skins/default/xui/ja/menu_people_groups.xml b/indra/newview/skins/default/xui/ja/menu_people_groups.xml index 4e5dc60a3d..842d79dc4b 100644 --- a/indra/newview/skins/default/xui/ja/menu_people_groups.xml +++ b/indra/newview/skins/default/xui/ja/menu_people_groups.xml @@ -3,6 +3,6 @@ <menu_item_call label="æƒ…å ±ã‚’è¡¨ç¤º" name="View Info"/> <menu_item_call label="ãƒãƒ£ãƒƒãƒˆ" name="Chat"/> <menu_item_call label="コール" name="Call"/> - <menu_item_call label="有効化" name="Activate"/> + <menu_item_call label="アクティブ" name="Activate"/> <menu_item_call label="脱退" name="Leave"/> </menu> diff --git a/indra/newview/skins/default/xui/ja/menu_people_nearby.xml b/indra/newview/skins/default/xui/ja/menu_people_nearby.xml index 2c8a346d1a..8d84b0e521 100644 --- a/indra/newview/skins/default/xui/ja/menu_people_nearby.xml +++ b/indra/newview/skins/default/xui/ja/menu_people_nearby.xml @@ -2,8 +2,10 @@ <context_menu name="Avatar Context Menu"> <menu_item_call label="プãƒãƒ•ィールã®è¡¨ç¤º" name="View Profile"/> <menu_item_call label="フレンド登録" name="Add Friend"/> + <menu_item_call label="フレンドを削除" name="Remove Friend"/> <menu_item_call label="IM" name="IM"/> <menu_item_call label="コール" name="Call"/> + <menu_item_call label="地図" name="Map"/> <menu_item_call label="共有" name="Share"/> <menu_item_call label="支払ã†" name="Pay"/> <menu_item_check label="ブãƒãƒƒã‚¯ãƒ»ãƒ–ãƒãƒƒã‚¯è§£é™¤" name="Block/Unblock"/> diff --git a/indra/newview/skins/default/xui/ja/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/ja/menu_people_nearby_multiselect.xml index bcd562e3ed..238bfc4af9 100644 --- a/indra/newview/skins/default/xui/ja/menu_people_nearby_multiselect.xml +++ b/indra/newview/skins/default/xui/ja/menu_people_nearby_multiselect.xml @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Multi-Selected People Context Menu"> <menu_item_call label="フレンド登録" name="Add Friends"/> + <menu_item_call label="フレンドを削除" name="Remove Friend"/> <menu_item_call label="IM" name="IM"/> <menu_item_call label="コール" name="Call"/> <menu_item_call label="共有" name="Share"/> diff --git a/indra/newview/skins/default/xui/ja/menu_profile_overflow.xml b/indra/newview/skins/default/xui/ja/menu_profile_overflow.xml index bb93990efe..9d3a5dda1c 100644 --- a/indra/newview/skins/default/xui/ja/menu_profile_overflow.xml +++ b/indra/newview/skins/default/xui/ja/menu_profile_overflow.xml @@ -1,7 +1,10 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <toggleable_menu name="profile_overflow_menu"> + <menu_item_call label="地図" name="show_on_map"/> <menu_item_call label="支払ã†" name="pay"/> <menu_item_call label="共有" name="share"/> + <menu_item_call label="ブãƒãƒƒã‚¯" name="block"/> + <menu_item_call label="ブãƒãƒƒã‚¯è§£é™¤" name="unblock"/> <menu_item_call label="追放" name="kick"/> <menu_item_call label="フリーズ" name="freeze"/> <menu_item_call label="フリーズ解除" name="unfreeze"/> diff --git a/indra/newview/skins/default/xui/ja/menu_save_outfit.xml b/indra/newview/skins/default/xui/ja/menu_save_outfit.xml new file mode 100644 index 0000000000..6513d9264a --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_save_outfit.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="save_outfit_menu"> + <menu_item_call label="ä¿å˜" name="save_outfit"/> + <menu_item_call label="別åã§ä¿å˜" name="save_as_new_outfit"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_script_chiclet.xml b/indra/newview/skins/default/xui/ja/menu_script_chiclet.xml new file mode 100644 index 0000000000..a89dd0bcbe --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_script_chiclet.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="ScriptChiclet Menu"> + <menu_item_call label="é–‰ã˜ã‚‹" name="Close"/> +</menu> diff --git a/indra/newview/skins/default/xui/ja/menu_slurl.xml b/indra/newview/skins/default/xui/ja/menu_slurl.xml index 2e06c53494..61ba3085d9 100644 --- a/indra/newview/skins/default/xui/ja/menu_slurl.xml +++ b/indra/newview/skins/default/xui/ja/menu_slurl.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="Popup"> - <menu_item_call label="URLã«ã¤ã„ã¦" name="about_url"/> - <menu_item_call label="URLã¸ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã™ã‚‹" name="teleport_to_url"/> + <menu_item_call label="URL ã«ã¤ã„ã¦" name="about_url"/> + <menu_item_call label="URL ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã™ã‚‹" name="teleport_to_url"/> <menu_item_call label="地図" name="show_on_map"/> </menu> diff --git a/indra/newview/skins/default/xui/ja/menu_url_http.xml b/indra/newview/skins/default/xui/ja/menu_url_http.xml index c2f4f24db6..c3da8a8686 100644 --- a/indra/newview/skins/default/xui/ja/menu_url_http.xml +++ b/indra/newview/skins/default/xui/ja/menu_url_http.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> <menu_item_call label="Web ページを開ã" name="url_open"/> - <menu_item_call label="インターãƒãƒƒãƒˆãƒ–ラウザã§é–‹ã" name="url_open_internal"/> + <menu_item_call label="内蔵ブラウザã§é–‹ã" name="url_open_internal"/> <menu_item_call label="外部ブラウザã§é–‹ã" name="url_open_external"/> <menu_item_call label="URLをクリップボードã«ã‚³ãƒ”ー" name="url_copy"/> </context_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_viewer.xml b/indra/newview/skins/default/xui/ja/menu_viewer.xml index db8583ca15..1573177914 100644 --- a/indra/newview/skins/default/xui/ja/menu_viewer.xml +++ b/indra/newview/skins/default/xui/ja/menu_viewer.xml @@ -5,13 +5,14 @@ <menu_item_call label="マイアカウント" name="Manage My Account"> <menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=ja"/> </menu_item_call> - <menu_item_call label="L$ã®è³¼å…¥" name="Buy and Sell L$"/> - <menu_item_call label="マイ プãƒãƒ•ィール" name="Profile"/> - <menu_item_call label="マイ 容姿" name="Appearance"/> - <menu_item_check label="マイ æŒã¡ç‰©" name="Inventory"/> - <menu_item_call label="æŒã¡ç‰©ã‚’サイドトレイã«è¡¨ç¤º" name="ShowSidetrayInventory"/> - <menu_item_call label="マイ ジェスãƒãƒ£ãƒ¼" name="Gestures"/> - <menu label="マイ ãƒã‚°ã‚¤ãƒ³çŠ¶æ…‹" name="Status"> + <menu_item_call label="L$ ã®è³¼å…¥" name="Buy and Sell L$"/> + <menu_item_call label="プãƒãƒ•ィール" name="Profile"/> + <menu_item_call label="アウトフィットを変更" name="ChangeOutfit"/> + <menu_item_check label="æŒã¡ç‰©" name="Inventory"/> + <menu_item_check label="æŒã¡ç‰©" name="ShowSidetrayInventory"/> + <menu_item_check label="ジェスãƒãƒ£ãƒ¼" name="Gestures"/> + <menu_item_check label="マイボイス" name="ShowVoice"/> + <menu label="ãƒã‚°ã‚¤ãƒ³çŠ¶æ…‹" name="Status"> <menu_item_call label="一時退å¸ä¸" name="Set Away"/> <menu_item_call label="å–り込ã¿ä¸" name="Set Busy"/> </menu> @@ -24,7 +25,6 @@ <menu_item_call label="所属グループ" name="My Groups"/> <menu_item_check label="è¿‘ãã®ãƒãƒ£ãƒƒãƒˆ" name="Nearby Chat"/> <menu_item_call label="è¿‘ãã«ã„る人" name="Active Speakers"/> - <menu_item_check label="è¿‘ãã®ãƒ¡ãƒ‡ã‚£ã‚¢" name="Nearby Media"/> </menu> <menu label="世界" name="World"> <menu_item_check label="ミニマップ" name="Mini-Map"/> @@ -32,6 +32,7 @@ <menu_item_call label="スナップショット" name="Take Snapshot"/> <menu_item_call label="ç¾åœ¨åœ°ã‚’ランドマーク" name="Create Landmark Here"/> <menu label="å ´æ‰€ã®ãƒ—ãƒãƒ•ィール" name="Land"> + <menu_item_call label="å ´æ‰€ã®ãƒ—ãƒãƒ•ィール" name="Place Profile"/> <menu_item_call label="åœŸåœ°æƒ…å ±" name="About Land"/> <menu_item_call label="地域 / ä¸å‹•産" name="Region/Estate"/> </menu> @@ -39,7 +40,13 @@ <menu_item_call label="自分ã®åœŸåœ°" name="My Land"/> <menu label="表示" name="LandShow"> <menu_item_check label="移動コントãƒãƒ¼ãƒ«" name="Movement Controls"/> - <menu_item_check label="コントãƒãƒ¼ãƒ«ã‚’表示" name="Camera Controls"/> + <menu_item_check label="カメラコントãƒãƒ¼ãƒ«" name="Camera Controls"/> + <menu_item_check label="ç«‹å…¥ç¦æ¢ãƒ©ã‚¤ãƒ³" name="Ban Lines"/> + <menu_item_check label="ビーコン(標è˜ï¼‰" name="beacons"/> + <menu_item_check label="プãƒãƒ‘ティ境界線" name="Property Lines"/> + <menu_item_check label="土地所有者" name="Land Owners"/> + <menu_item_check label="座標" name="Coordinates"/> + <menu_item_check label="区画プãƒãƒ‘ティ" name="Parcel Properties"/> </menu> <menu_item_call label="ホームã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ" name="Teleport Home"/> <menu_item_call label="ç¾åœ¨åœ°ã‚’ホームã«è¨å®š" name="Set Home to Here"/> @@ -49,37 +56,34 @@ <menu_item_call label="日没" name="Sunset"/> <menu_item_call label="深夜" name="Midnight"/> <menu_item_call label="エステートタイム" name="Revert to Region Default"/> - <menu_item_call label="環境編集" name="Environment Editor"/> + <menu_item_call label="自然環境エディター" name="Environment Editor"/> </menu> </menu> <menu label="制作" name="BuildTools"> <menu_item_check label="制作" name="Show Build Tools"/> - <menu label="åˆ¶ä½œãƒ„ãƒ¼ãƒ«ã‚’é¸æŠž" name="Select Tool"> + <menu label="åˆ¶ä½œãƒ„ãƒ¼ãƒ«ã‚’é¸æŠžã™ã‚‹" name="Select Tool"> <menu_item_call label="フォーカスツール" name="Focus"/> <menu_item_call label="移動ツール" name="Move"/> <menu_item_call label="編集ツール" name="Edit"/> - <menu_item_call label="クリエーションツール" name="Create"/> + <menu_item_call label="作æˆãƒ„ール" name="Create"/> <menu_item_call label="土地ツール" name="Land"/> </menu> - <menu label="編集" name="Edit"> - <menu_item_call label="å…ƒã«æˆ»ã™" name="Undo"/> - <menu_item_call label="やり直ã—" name="Redo"/> - <menu_item_call label="切りå–り" name="Cut"/> - <menu_item_call label="コピー" name="Copy"/> - <menu_item_call label="貼り付ã‘" name="Paste"/> - <menu_item_call label="削除" name="Delete"/> - <menu_item_call label="複製" name="Duplicate"/> - <menu_item_call label="ã™ã¹ã¦é¸æŠž" name="Select All"/> - <menu_item_call label="é¸æŠžè§£é™¤" name="Deselect"/> - </menu> <menu_item_call label="リンク" name="Link"/> <menu_item_call label="リンクを外ã™" name="Unlink"/> + <menu_item_check label="リンクã—ãŸéƒ¨åˆ†ã‚’編集" name="Edit Linked Parts"/> + <menu label="リンクã—ãŸéƒ¨åˆ†ã‚’é¸æŠžã™ã‚‹" name="Select Linked Parts"> + <menu_item_call label="次ã®éƒ¨åˆ†ã‚’é¸æŠžã™ã‚‹" name="Select Next Part"/> + <menu_item_call label="å‰å›žã®éƒ¨åˆ†ã‚’é¸æŠžã™ã‚‹" name="Select Previous Part"/> + <menu_item_call label="次ã®éƒ¨åˆ†ã‚’å«ã‚ã‚‹" name="Include Next Part"/> + <menu_item_call label="å‰å›žã®éƒ¨åˆ†ã‚’å«ã‚ã‚‹" name="Include Previous Part"/> + </menu> <menu_item_call label="é¸æŠžã—ãŸã‚‚ã®ã«ç„¦ç‚¹ã‚’åˆã‚ã›ã‚‹" name="Focus on Selection"/> <menu_item_call label="é¸æŠžã—ãŸã‚‚ã®ã‚’ズームã™ã‚‹" name="Zoom to Selection"/> <menu label="オブジェクト" name="Object"> - <menu_item_call label="è²·ã†" name="Menu Object Take"/> + <menu_item_call label="è²·ã†" name="Menu Object Buy"/> + <menu_item_call label="å–ã‚‹" name="Menu Object Take"/> <menu_item_call label="コピーをå–ã‚‹" name="Take Copy"/> - <menu_item_call label="「マイ æŒã¡ç‰©ã€ã«ä¿å˜" name="Save Object Back to My Inventory"/> + <menu_item_call label="「æŒã¡ç‰©ã€ã«ä¿å˜" name="Save Object Back to My Inventory"/> <menu_item_call label="オブジェクトã®ä¸èº«ã«ä¿å˜" name="Save Object Back to Object Contents"/> </menu> <menu label="スクリプト" name="Scripts"> @@ -90,62 +94,55 @@ <menu_item_call label="ã‚¹ã‚¯ãƒªãƒ—ãƒˆã‚’å®Ÿè¡Œåœæ¢ã«ã™ã‚‹" name="Set Scripts to Not Running"/> </menu> <menu label="オプション" name="Options"> - <menu_item_check label="リンク部ä½ã‚’編集" name="Edit Linked Parts"/> - <menu_item_call label="デフォルトã®ã‚¢ãƒƒãƒ—ãƒãƒ¼ãƒ‰æ¨©é™ã‚’è¨å®š" name="perm prefs"/> - <menu_item_check label="権é™ã®è©³ç´°ã‚’表示" name="DebugPermissions"/> - <menu label="é¸æŠž" name="Selection"> - <menu_item_check label="ç§ã®ã‚ªãƒ–ジェクトã ã‘ã‚’é¸æŠž" name="Select Only My Objects"/> - <menu_item_check label="動的オブジェクトã®ã¿é¸æŠž" name="Select Only Movable Objects"/> - <menu_item_check label="環境ã§é¸æŠž" name="Select By Surrounding"/> - </menu> - <menu label="表示" name="Show"> - <menu_item_check label="éžè¡¨ç¤ºã®é¸æŠžã‚’表示" name="Show Hidden Selection"/> - <menu_item_check label="é¸æŠžã—ãŸå…‰ã®åŠå¾„範囲を表示" name="Show Light Radius for Selection"/> - <menu_item_check label="é¸æŠžãƒ“ãƒ¼ãƒ ã‚’è¡¨ç¤º" name="Show Selection Beam"/> - </menu> - <menu label="グリッド" name="Grid"> - <menu_item_check label="グリッドãƒã‚¤ãƒ³ãƒˆã«ã‚¹ãƒŠãƒƒãƒ—" name="Snap to Grid"/> - <menu_item_call label="オブジェクトã®XY軸をグリッドã«ã‚¹ãƒŠãƒƒãƒ—" name="Snap Object XY to Grid"/> - <menu_item_call label="é¸æŠžã‚’ã‚°ãƒªãƒƒãƒ‰ã«ä½¿ç”¨" name="Use Selection for Grid"/> - <menu_item_call label="グリッドオプション" name="Grid Options"/> - </menu> - </menu> - <menu label="リンクã—ãŸéƒ¨åˆ†ã‚’é¸æŠž" name="Select Linked Parts"> - <menu_item_call label="次ã®éƒ¨ä½ã‚’é¸æŠž" name="Select Next Part"/> - <menu_item_call label="å‰å›žã®éƒ¨ä½ã‚’é¸æŠž" name="Select Previous Part"/> - <menu_item_call label="次ã®éƒ¨ä½ã‚’å«ã‚ã‚‹" name="Include Next Part"/> - <menu_item_call label="å‰å›žã®éƒ¨ä½ã‚’å«ã‚ã‚‹" name="Include Previous Part"/> + <menu_item_call label="デフォルトã®ã‚¢ãƒƒãƒ—ãƒãƒ¼ãƒ‰æ¨©é™ã‚’è¨å®šã™ã‚‹" name="perm prefs"/> + <menu_item_check label="権é™ã®è©³ç´°ã‚’表示ã™ã‚‹" name="DebugPermissions"/> + <menu_item_check label="ç§ã®ã‚ªãƒ–ジェクトã ã‘ã‚’é¸æŠžã™ã‚‹" name="Select Only My Objects"/> + <menu_item_check label="動的オブジェクトã ã‘ã‚’é¸æŠžã™ã‚‹" name="Select Only Movable Objects"/> + <menu_item_check label="ç¯„å›²å†…ã‚’é¸æŠžã™ã‚‹" name="Select By Surrounding"/> + <menu_item_check label="éš ã‚ŒãŸä½ç½®ã®é¸æŠžã‚‚表示ã™ã‚‹" name="Show Hidden Selection"/> + <menu_item_check label="é¸æŠžã—ãŸå…‰ã®åŠå¾„範囲を表示ã™ã‚‹" name="Show Light Radius for Selection"/> + <menu_item_check label="é¸æŠžãƒ“ãƒ¼ãƒ ã‚’è¡¨ç¤ºã™ã‚‹" name="Show Selection Beam"/> + <menu_item_check label="グリッドãƒã‚¤ãƒ³ãƒˆã«ã‚¹ãƒŠãƒƒãƒ—ã™ã‚‹" name="Snap to Grid"/> + <menu_item_call label="オブジェクト㮠XY 軸をグリッドã«ã‚¹ãƒŠãƒƒãƒ—ã™ã‚‹" name="Snap Object XY to Grid"/> + <menu_item_call label="é¸æŠžã‚’ã‚°ãƒªãƒƒãƒ‰ã«ä½¿ç”¨ã™ã‚‹" name="Use Selection for Grid"/> + <menu_item_call label="グリッドオプション" name="Grid Options"/> + </menu> + <menu label="アップãƒãƒ¼ãƒ‰" name="Upload"> + <menu_item_call label="ç”»åƒï¼ˆL$[COST])..." name="Upload Image"/> + <menu_item_call label="サウンド(L$[COST])..." name="Upload Sound"/> + <menu_item_call label="アニメーション(L$[COST])..." name="Upload Animation"/> + <menu_item_call label="一括 (ファイルã«ã¤ãL$[COST])..." name="Bulk Upload"/> </menu> </menu> <menu label="ヘルプ" name="Help"> <menu_item_call label="[SECOND_LIFE] ヘルプ" name="Second Life Help"/> - <menu_item_call label="嫌ãŒã‚‰ã›ã‚’å ±å‘Š" name="Report Abuse"/> - <menu_item_call label="ãƒã‚°å ±å‘Š" name="Report Bug"/> + <menu_item_call label="嫌ãŒã‚‰ã›ã‚’å ±å‘Šã™ã‚‹" name="Report Abuse"/> + <menu_item_call label="ãƒã‚°ã‚’å ±å‘Šã™ã‚‹" name="Report Bug"/> <menu_item_call label="[APP_NAME] ã«ã¤ã„ã¦" name="About Second Life"/> </menu> <menu label="アドãƒãƒ³ã‚¹" name="Advanced"> - <menu_item_call label="ç§ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’åœæ¢ã™ã‚‹" name="Stop Animating My Avatar"/> - <menu_item_call label="テクスãƒãƒ£ã®ãƒªãƒ™ãƒ¼ã‚¯" name="Rebake Texture"/> + <menu_item_check label="アドãƒãƒ³ã‚¹ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã‚’表示ã™ã‚‹" name="Show Advanced Menu"/> + <menu_item_call label="自分ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’åœæ¢ã™ã‚‹" name="Stop Animating My Avatar"/> + <menu_item_call label="テクスãƒãƒ£ã®ãƒªãƒ™ãƒ¼ã‚¯ã‚’ã™ã‚‹" name="Rebake Texture"/> <menu_item_call label="UI ã®ã‚µã‚¤ã‚ºã‚’デフォルトã«è¨å®šã™ã‚‹" name="Set UI Size to Default"/> - <menu_item_call label="ウィンドウã®ã‚µã‚¤ã‚ºã®è¨å®šï¼š" name="Set Window Size..."/> + <menu_item_call label="ウィンドウã®ã‚µã‚¤ã‚ºã‚’è¨å®šã™ã‚‹" name="Set Window Size..."/> <menu_item_check label="é ãã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ãªã„" name="Limit Select Distance"/> <menu_item_check label="カメラã®è·é›¢ç§»å‹•を制é™ã—ãªã„" name="Disable Camera Distance"/> <menu_item_check label="高解åƒåº¦ã‚¹ãƒŠãƒƒãƒ—ショット" name="HighResSnapshot"/> - <menu_item_check label="シャッター音ã¨ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ãªã—ã§ã‚¹ãƒŠãƒƒãƒ—ショットをディスクã«ä¿å˜" name="QuietSnapshotsToDisk"/> + <menu_item_check label="シャッター音ã¨ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ãªã—ã§ã‚¹ãƒŠãƒƒãƒ—ショットをディスクã«ä¿å˜ã™ã‚‹" name="QuietSnapshotsToDisk"/> <menu_item_check label="圧縮ã—ã¦ã‚¹ãƒŠãƒƒãƒ—ショットをディスクã«ä¿å˜ã™ã‚‹" name="CompressSnapshotsToDisk"/> <menu label="パフォーマンスツール" name="Performance Tools"> <menu_item_call label="ラグ計測器" name="Lag Meter"/> <menu_item_check label="統計ãƒãƒ¼" name="Statistics Bar"/> - <menu_item_check label="ã‚¢ãƒã‚¿ãƒ¼ã®ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°ã‚³ã‚¹ãƒˆã‚’表示" name="Avatar Rendering Cost"/> + <menu_item_check label="ã‚¢ãƒã‚¿ãƒ¼ã®ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°ã‚³ã‚¹ãƒˆã‚’表示ã™ã‚‹" name="Avatar Rendering Cost"/> </menu> <menu label="ãƒã‚¤ãƒ©ã‚¤ãƒˆã¨ç›®ã«è¦‹ãˆã‚‹ã‚‚ã®" name="Highlighting and Visibility"> <menu_item_check label="ãƒãƒ¼ã‚¸ãƒ¼ãƒ“ーコン" name="Cheesy Beacon"/> <menu_item_check label="パーティクルをéžè¡¨ç¤ºã«ã™ã‚‹" name="Hide Particles"/> <menu_item_check label="é¸æŠžã—ãŸã‚‚ã®ã‚’éžè¡¨ç¤ºã«ã™ã‚‹" name="Hide Selected"/> - <menu_item_check label="逿˜Žéƒ¨åˆ†ã‚’ãƒã‚¤ãƒ©ã‚¤ãƒˆ" name="Highlight Transparent"/> - <menu_item_check label="HUD を表示" name="Show HUD Attachments"/> - <menu_item_check label="一人称視点ã®ã¨ãã«åå—線を表示" name="ShowCrosshairs"/> - <menu_item_check label="土地ã®ãƒ„ールãƒãƒƒãƒ—を表示" name="Land Tips"/> + <menu_item_check label="逿˜Žéƒ¨åˆ†ã‚’ãƒã‚¤ãƒ©ã‚¤ãƒˆã™ã‚‹" name="Highlight Transparent"/> + <menu_item_check label="HUD を表示ã™ã‚‹" name="Show HUD Attachments"/> + <menu_item_check label="一人称視点ã®ã¨ãã«åå—線を表示ã™ã‚‹" name="ShowCrosshairs"/> </menu> <menu label="レンダリング(種類)" name="Rendering Types"> <menu_item_check label="シンプル" name="Simple"/> @@ -173,23 +170,24 @@ <menu_item_check label="フレã‚シブルオブジェクト" name="Flexible Objects"/> </menu> <menu_item_check label="マルãƒã‚¹ãƒ¬ãƒƒãƒ‰å‡¦ç†" name="Run Multiple Threads"/> + <menu_item_check label="Use Plugin Read Thread" name="Use Plugin Read Thread"/> <menu_item_call label="グループã‚ャッシュã®ã‚¯ãƒªã‚¢" name="ClearGroupCache"/> <menu_item_check label="マウスã®å¹³æ»‘化" name="Mouse Smoothing"/> - <menu_item_check label="è¿‘ãã®ãƒãƒ£ãƒƒãƒˆã« IM を表示" name="IMInChat"/> <menu label="ショートカット" name="Shortcuts"> + <menu_item_call label="ç”»åƒ ï¼ˆL$ [COST] )..." name="Upload Image"/> <menu_item_check label="検索" name="Search"/> <menu_item_call label="ã‚ーをリリース" name="Release Keys"/> - <menu_item_call label="UI ã®ã‚µã‚¤ã‚ºã‚’デフォルトã«è¨å®š" name="Set UI Size to Default"/> + <menu_item_call label="UI ã®ã‚µã‚¤ã‚ºã‚’デフォルトã«è¨å®šã™ã‚‹" name="Set UI Size to Default"/> <menu_item_check label="常ã«èµ°ã‚‹" name="Always Run"/> - <menu_item_check label="飛行" name="Fly"/> + <menu_item_check label="飛行ã™ã‚‹" name="Fly"/> <menu_item_call label="ウィンドウを閉ã˜ã‚‹" name="Close Window"/> <menu_item_call label="å…¨ã¦ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’é–‰ã˜ã‚‹" name="Close All Windows"/> - <menu_item_call label="スナップショットをディスクã«ä¿å˜" name="Snapshot to Disk"/> + <menu_item_call label="スナップショットをディスクã«ä¿å˜ã™ã‚‹" name="Snapshot to Disk"/> <menu_item_call label="一人称視点" name="Mouselook"/> - <menu_item_check label="ジョイスティック・フライカム" name="Joystick Flycam"/> - <menu_item_call label="表示をリセット" name="Reset View"/> + <menu_item_check label="ジョイスティックフライカム" name="Joystick Flycam"/> + <menu_item_call label="表示をリセットã™ã‚‹" name="Reset View"/> <menu_item_call label="最後ã®ç™ºè¨€è€…を見る" name="Look at Last Chatter"/> - <menu label="åˆ¶ä½œãƒ„ãƒ¼ãƒ«ã‚’é¸æŠž" name="Select Tool"> + <menu label="åˆ¶ä½œãƒ„ãƒ¼ãƒ«ã‚’é¸æŠžã™ã‚‹" name="Select Tool"> <menu_item_call label="焦点ツール" name="Focus"/> <menu_item_call label="移動ツール" name="Move"/> <menu_item_call label="編集ツール" name="Edit"/> @@ -197,12 +195,11 @@ <menu_item_call label="土地ツール" name="Land"/> </menu> <menu_item_call label="ズームイン" name="Zoom In"/> - <menu_item_call label="ズーム・デフォルト" name="Zoom Default"/> + <menu_item_call label="ズーム(デフォルト)" name="Zoom Default"/> <menu_item_call label="ズームアウト" name="Zoom Out"/> - <menu_item_call label="全画é¢è¡¨ç¤º" name="Toggle Fullscreen"/> </menu> <menu_item_call label="デãƒãƒƒã‚°è¨å®šã‚’表示ã™ã‚‹" name="Debug Settings"/> - <menu_item_check label="開発メニューを表示" name="Debug Mode"/> + <menu_item_check label="開発メニューを表示ã™ã‚‹" name="Debug Mode"/> </menu> <menu label="開発" name="Develop"> <menu label="コンソール" name="Consoles"> @@ -210,7 +207,7 @@ <menu_item_check label="デãƒãƒƒã‚°ã‚³ãƒ³ã‚½ãƒ¼ãƒ«" name="Debug Console"/> <menu_item_call label="通知コンソール" name="Notifications"/> <menu_item_check label="テクスãƒãƒ£ã‚µã‚¤ã‚ºã®ã‚³ãƒ³ã‚½ãƒ¼ãƒ«" name="Texture Size"/> - <menu_item_check label="テクスãƒãƒ£ã‚«ãƒ†ã‚´ãƒªãƒ»ã‚³ãƒ³ã‚½ãƒ¼ãƒ«" name="Texture Category"/> + <menu_item_check label="テクスãƒãƒ£ã‚«ãƒ†ã‚´ãƒªã®ã‚³ãƒ³ã‚½ãƒ¼ãƒ«" name="Texture Category"/> <menu_item_check label="ファーストタイマー" name="Fast Timers"/> <menu_item_check label="メモリ" name="Memory"/> <menu_item_call label="ãƒªãƒ¼ã‚¸ãƒ§ãƒ³æƒ…å ±ã‚’ãƒ‡ãƒãƒƒã‚°ã‚³ãƒ³ã‚½ãƒ¼ãƒ«ã¸" name="Region Info to Debug Console"/> @@ -219,28 +216,29 @@ <menu_item_check label="カメラ" name="Camera"/> <menu_item_check label="風" name="Wind"/> <menu_item_check label="FOV" name="FOV"/> + <menu_item_check label="ãƒãƒƒã‚¸" name="Badge"/> </menu> <menu label="æƒ…å ±ã‚’è¡¨ç¤º" name="Display Info"> - <menu_item_check label="時間を表示" name="Show Time"/> - <menu_item_check label="æç”»æƒ…å ±ã‚’è¡¨ç¤º" name="Show Render Info"/> - <menu_item_check label="マトリックスを表示" name="Show Matrices"/> - <menu_item_check label="カーソルを乗ã›ãŸå ´æ‰€ã®è‰²ã‚’表示" name="Show Color Under Cursor"/> - <menu_item_check label="オブジェクトã®ã‚¢ãƒƒãƒ—デートを表示" name="Show Updates"/> + <menu_item_check label="時間を表示ã™ã‚‹" name="Show Time"/> + <menu_item_check label="æç”»æƒ…å ±ã‚’è¡¨ç¤ºã™ã‚‹" name="Show Render Info"/> + <menu_item_check label="マトリックスを表示ã™ã‚‹" name="Show Matrices"/> + <menu_item_check label="カーソルを乗ã›ãŸå ´æ‰€ã®è‰²ã‚’表示ã™ã‚‹" name="Show Color Under Cursor"/> + <menu_item_check label="オブジェクトã®ã‚¢ãƒƒãƒ—デートを表示ã™ã‚‹" name="Show Updates"/> </menu> - <menu label="エラーを実行" name="Force Errors"> + <menu label="エラー実行" name="Force Errors"> <menu_item_call label="ブレークãƒã‚¤ãƒ³ãƒˆ" name="Force Breakpoint"/> - <menu_item_call label="LLError ã¨ã‚¯ãƒ©ãƒƒã‚·ãƒ¥ã‚’実行" name="Force LLError And Crash"/> - <menu_item_call label="ãƒãƒƒãƒ‰ãƒ¡ãƒ¢ãƒªã‚¢ã‚¯ã‚»ã‚¹ã‚’実行" name="Force Bad Memory Access"/> + <menu_item_call label="LLError ã¨ã‚¯ãƒ©ãƒƒã‚·ãƒ¥ã‚’実行ã™ã‚‹" name="Force LLError And Crash"/> + <menu_item_call label="ãƒãƒƒãƒ‰ãƒ¡ãƒ¢ãƒªã‚¢ã‚¯ã‚»ã‚¹ã‚’実行ã™ã‚‹" name="Force Bad Memory Access"/> <menu_item_call label="ç„¡é™ãƒ«ãƒ¼ãƒ—" name="Force Infinite Loop"/> - <menu_item_call label="ドライãƒã®ã‚¯ãƒ©ãƒƒã‚·ãƒ¥ã‚’実行" name="Force Driver Carsh"/> - <menu_item_call label="ソフトウェア例外エラーã®å®Ÿè¡Œ" name="Force Software Exception"/> - <menu_item_call label="ãƒ“ãƒ¥ãƒ¼ãƒ¯ã®æŽ¥ç¶šé®æ–を実行" name="Force Disconnect Viewer"/> - <menu_item_call label="メモリリークã®ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ãƒˆ" name="Memory Leaking Simulation"/> + <menu_item_call label="ドライãƒã®ã‚¯ãƒ©ãƒƒã‚·ãƒ¥ã‚’実行ã™ã‚‹" name="Force Driver Carsh"/> + <menu_item_call label="ソフトウェア例外エラーã®å®Ÿè¡Œã™ã‚‹" name="Force Software Exception"/> + <menu_item_call label="ãƒ“ãƒ¥ãƒ¼ãƒ¯ã®æŽ¥ç¶šé®æ–を実行ã™ã‚‹" name="Force Disconnect Viewer"/> + <menu_item_call label="メモリリークをシミュレートã™ã‚‹" name="Memory Leaking Simulation"/> </menu> <menu label="レンダーテスト" name="Render Tests"> <menu_item_check label="カメラオフセット" name="Camera Offset"/> <menu_item_check label="フレームレートをランダム化" name="Randomize Framerate"/> - <menu_item_check label="Periodic Slow Frame" name="Periodic Slow Frame"/> + <menu_item_check label="定期的ã«é…ã„フレームを挿入ã™ã‚‹" name="Periodic Slow Frame"/> <menu_item_check label="フレームテスト" name="Frame Test"/> </menu> <menu label="メタデータã®ãƒ¬ãƒ³ãƒ€ãƒ¼" name="Render Metadata"> @@ -252,10 +250,10 @@ <menu_item_check label="アニメーション部分をテクスãƒãƒ£ã§è¡¨ç¤º" name="Texture Anim"/> <menu_item_check label="テクスãƒãƒ£å„ªå…ˆåº¦" name="Texture Priority"/> <menu_item_check label="テクスãƒãƒ£ã®ç¯„囲" name="Texture Area"/> - <menu_item_check label="Face Area" name="Face Area"/> + <menu_item_check label="å´é¢" name="Face Area"/> <menu_item_check label="å…‰" name="Lights"/> <menu_item_check label="骨組ã¿ã®è¡çªåˆ¤å®š" name="Collision Skeleton"/> - <menu_item_check label="Raycast" name="Raycast"/> + <menu_item_check label="レイã‚ャスト" name="Raycast"/> </menu> <menu label="レンダリング" name="Rendering"> <menu_item_check label="軸" name="Axes"/> @@ -263,10 +261,10 @@ <menu_item_call label="é¸æŠžã—ãŸãƒ†ã‚¯ã‚¹ãƒãƒ£æƒ…å ±åŸºåº•" name="Selected Texture Info Basis"/> <menu_item_check label="ワイヤーフレーム" name="Wireframe"/> <menu_item_check label="オブジェクト間オクルージョン" name="Object-Object Occlusion"/> - <menu_item_check label="フレームãƒãƒƒãƒ•ァ・オブジェクト" name="Framebuffer Objects"/> + <menu_item_check label="フレームãƒãƒƒãƒ•ァオブジェクト" name="Framebuffer Objects"/> <menu_item_check label="é…延レンダリング" name="Deferred Rendering"/> <menu_item_check label="ã‚°ãƒãƒ¼ãƒãƒ«ã‚¤ãƒ«ãƒŸãƒãƒ¼ã‚·ãƒ§ãƒ³" name="Global Illumination"/> - <menu_item_check label="GLデãƒãƒƒã‚°" name="Debug GL"/> + <menu_item_check label="GL デãƒãƒƒã‚°" name="Debug GL"/> <menu_item_check label="経路をデãƒãƒƒã‚°" name="Debug Pipeline"/> <menu_item_check label="ファーストアルファ" name="Fast Alpha"/> <menu_item_check label="アニメーションテクスãƒãƒ£" name="Animation Textures"/> @@ -276,10 +274,10 @@ <menu_item_check label="テクスãƒãƒ£ã‚¢ãƒˆãƒ©ã‚¹" name="Texture Atlas"/> <menu_item_check label="装ç€ã•れãŸå…‰æºã‚’æç”»ã™ã‚‹" name="Render Attached Lights"/> <menu_item_check label="å–り付ã‘られãŸãƒ‘ーティクルをæç”»ã™ã‚‹" name="Render Attached Particles"/> - <menu_item_check label="Hover Glow Objects" name="Hover Glow Objects"/> + <menu_item_check label="マウスオーãƒãƒ¼ã§å¼·èª¿è¡¨ç¤ºã™ã‚‹" name="Hover Glow Objects"/> </menu> <menu label="ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯" name="Network"> - <menu_item_check label="ã‚¨ãƒ¼ã‚¸ã‚§ãƒ³ãƒˆã‚’ä¸€æ™‚åœæ¢" name="AgentPause"/> + <menu_item_check label="ã‚¨ãƒ¼ã‚¸ã‚§ãƒ³ãƒˆã‚’ä¸€æ™‚åœæ¢ã™ã‚‹" name="AgentPause"/> <menu_item_call label="メッセージãƒã‚°ã‚’有効ã«ã™ã‚‹" name="Enable Message Log"/> <menu_item_call label="メッセージãƒã‚°ã‚’使用ä¸å¯ã«ã™ã‚‹" name="Disable Message Log"/> <menu_item_check label="é€ŸåŠ›ãŒæŒ¿å…¥ã•れãŸã‚ªãƒ–ジェクト" name="Velocity Interpolate Objects"/> @@ -297,9 +295,9 @@ </menu> <menu label="世界" name="World"> <menu_item_check label="シムã®å¤ªé™½ã®è¨å®šã‚’無視ã™ã‚‹" name="Sim Sun Override"/> - <menu_item_check label="ビーコンã®å¼·èª¿è¡¨ç¤º" name="Cheesy Beacon"/> + <menu_item_check label="ビーコンを強調表示ã™ã‚‹" name="Cheesy Beacon"/> <menu_item_check label="固定ã•れãŸå¤©æ°—" name="Fixed Weather"/> - <menu_item_call label="リージョンオブジェクトã®ã‚ャッシュをダンプ" name="Dump Region Object Cache"/> + <menu_item_call label="リージョンオブジェクトã®ã‚ャッシュをダンプã™ã‚‹" name="Dump Region Object Cache"/> </menu> <menu label="UI" name="UI"> <menu_item_call label="Web ブラウザã®ãƒ†ã‚¹ãƒˆ" name="Web Browser Test"/> @@ -310,7 +308,7 @@ <menu_item_call label="é¸æŠžã—ãŸã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆæƒ…å ±ã‚’ãƒ—ãƒªãƒ³ãƒˆ" name="Print Selected Object Info"/> <menu_item_call label="ã‚¨ãƒ¼ã‚¸ã‚§ãƒ³ãƒˆæƒ…å ±ã‚’ãƒ—ãƒªãƒ³ãƒˆ" name="Print Agent Info"/> <menu_item_call label="メモリ使用状æ³" name="Memory Stats"/> - <menu_item_check label="ダブルクリックã—ãŸå ´æ‰€ã«è‡ªå‹•æ“作ã§ç§»å‹•" name="Double-ClickAuto-Pilot"/> + <menu_item_check label="ダブルクリックã—ãŸå ´æ‰€ã«è‡ªå‹•æ“作ã§ç§»å‹•ã™ã‚‹" name="Double-ClickAuto-Pilot"/> <menu_item_check label="SelectMgr ã®ãƒ‡ãƒãƒƒã‚°" name="Debug SelectMgr"/> <menu_item_check label="ダブルクリック" name="Debug Clicks"/> <menu_item_check label="デãƒãƒƒã‚°è¡¨ç¤º" name="Debug Views"/> @@ -320,15 +318,15 @@ <menu_item_check label="WindowProc ã®ãƒ‡ãƒãƒƒã‚°" name="Debug WindowProc"/> </menu> <menu label="XUI" name="XUI"> - <menu_item_call label="色ã®è¨å®šã‚’æ›´æ–°" name="Reload Color Settings"/> - <menu_item_call label="フォントテストを表示" name="Show Font Test"/> + <menu_item_call label="色ã®è¨å®šã‚’æ›´æ–°ã™ã‚‹" name="Reload Color Settings"/> + <menu_item_call label="フォントテストを表示ã™ã‚‹" name="Show Font Test"/> <menu_item_call label="XML ã‹ã‚‰èªã¿è¾¼ã‚€" name="Load from XML"/> - <menu_item_call label="XML ã§ä¿å˜" name="Save to XML"/> - <menu_item_check label="XUI ãƒãƒ¼ãƒ を表示" name="Show XUI Names"/> - <menu_item_call label="テスト用 IM ã‚’é€ä¿¡" name="Send Test IMs"/> + <menu_item_call label="XML ã§ä¿å˜ã™ã‚‹" name="Save to XML"/> + <menu_item_check label="XUI ãƒãƒ¼ãƒ を表示ã™ã‚‹" name="Show XUI Names"/> + <menu_item_call label="テスト用 IM ã‚’é€ä¿¡ã™ã‚‹" name="Send Test IMs"/> </menu> <menu label="ã‚¢ãƒã‚¿ãƒ¼" name="Character"> - <menu label="ベークドテクスãƒãƒ£ã‚’å–å¾—" name="Grab Baked Texture"> + <menu label="ベークドテクスãƒãƒ£ã‚’å–å¾—ã™ã‚‹" name="Grab Baked Texture"> <menu_item_call label="çž³" name="Iris"/> <menu_item_call label="é " name="Head"/> <menu_item_call label="上åŠèº«" name="Upper Body"/> @@ -336,23 +334,23 @@ <menu_item_call label="スカート" name="Skirt"/> </menu> <menu label="ã‚ャラクターテスト" name="Character Tests"> - <menu_item_call label="容姿を XML ã«ä¿å˜" name="Appearance To XML"/> + <menu_item_call label="容姿を XML ã«ä¿å˜ã™ã‚‹" name="Appearance To XML"/> <menu_item_call label="ã‚ャラクタジオメトリã®åˆ‡ã‚Šæ›¿ãˆ" name="Toggle Character Geometry"/> <menu_item_call label="男性アãƒã‚¿ãƒ¼ã®ãƒ†ã‚¹ãƒˆ" name="Test Male"/> <menu_item_call label="女性アãƒã‚¿ãƒ¼ã®ãƒ†ã‚¹ãƒˆ" name="Test Female"/> <menu_item_call label="PG ã®ãƒˆã‚°ãƒ«" name="Toggle PG"/> <menu_item_check label="é¸æŠžã‚¢ãƒã‚¿ãƒ¼è¨±å¯" name="Allow Select Avatar"/> </menu> - <menu_item_call label="Params をデフォルトã«å®Ÿè¡Œ" name="Force Params to Default"/> + <menu_item_call label="パラメータを強制的ã«ãƒ‡ãƒ•ォルトã«ã™ã‚‹" name="Force Params to Default"/> <menu_item_check label="ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³æƒ…å ±" name="Animation Info"/> - <menu_item_check label="アニメーションをスãƒãƒ¼ãƒ¢ãƒ¼ã‚·ãƒ§ãƒ³" name="Slow Motion Animations"/> + <menu_item_check label="スãƒãƒ¼ãƒ¢ãƒ¼ã‚·ãƒ§ãƒ³ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³" name="Slow Motion Animations"/> <menu_item_check label="見ã¦ã„ã‚‹ã‚‚ã®ã‚’表示ã™ã‚‹" name="Show Look At"/> <menu_item_check label="クリックã—ãŸå ´æ‰€ã‚’表示ã™ã‚‹" name="Show Point At"/> <menu_item_check label="çµåˆéƒ¨ã®ã‚¢ãƒƒãƒ—デートã®ãƒ‡ãƒãƒƒã‚°" name="Debug Joint Updates"/> <menu_item_check label="LOD を無効ã«ã™ã‚‹" name="Disable LOD"/> <menu_item_check label="ã‚ャラクター Vis ã®ãƒ‡ãƒãƒƒã‚°" name="Debug Character Vis"/> - <menu_item_check label="骨組ã¿ã®è¡çªåˆ¤å®šã‚’表示" name="Show Collision Skeleton"/> - <menu_item_check label="エージェントã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆã‚’表示" name="Display Agent Target"/> + <menu_item_check label="骨組ã¿ã®è¡çªåˆ¤å®šã‚’表示ã™ã‚‹" name="Show Collision Skeleton"/> + <menu_item_check label="エージェントã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆã‚’表示ã™ã‚‹" name="Display Agent Target"/> --> <menu_item_call label="アタッãƒãƒ¡ãƒ³ãƒˆã‚’ダンプ" name="Dump Attachments"/> <menu_item_call label="ã‚¢ãƒã‚¿ãƒ¼ãƒ†ã‚¯ã‚¹ãƒãƒ£ã‚’デãƒãƒƒã‚°" name="Debug Avatar Textures"/> @@ -360,9 +358,9 @@ </menu> <menu_item_check label="HTTP Texture" name="HTTP Textures"/> <menu_item_call label="圧縮画åƒ" name="Compress Images"/> - <menu_item_check label="Output Debug Minidump" name="Output Debug Minidump"/> - <menu_item_check label="次回ã®èµ·å‹•時ã«ã‚³ãƒ³ã‚½ãƒ¼ãƒ«ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’表示" name="Console Window"/> - <menu_item_check label="管ç†è€…メニューを表示" name="View Admin Options"/> + <menu_item_check label="デãƒãƒƒã‚°ç”¨ã®ãƒŸãƒ‹ãƒ€ãƒ³ãƒ—を出力ã™ã‚‹" name="Output Debug Minidump"/> + <menu_item_check label="次回ã®èµ·å‹•時ã«ã‚³ãƒ³ã‚½ãƒ¼ãƒ«ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’表示ã™ã‚‹" name="Console Window"/> + <menu_item_check label="管ç†è€…メニューを表示ã™ã‚‹" name="View Admin Options"/> <menu_item_call label="管ç†è€…ステータスã®å‘¼ã³å‡ºã—" name="Request Admin Options"/> <menu_item_call label="管ç†è€…ステータス解除" name="Leave Admin Options"/> </menu> @@ -370,19 +368,19 @@ <menu label="Object"> <menu_item_call label="コピーをå–ã‚‹" name="Take Copy"/> <menu_item_call label="ç§ã‚’所有者ã«ã™ã‚‹" name="Force Owner To Me"/> - <menu_item_call label="所有者権é™ã®å®Ÿè¡Œ" name="Force Owner Permissive"/> + <menu_item_call label="所有者権é™ã‚’実行ã™ã‚‹" name="Force Owner Permissive"/> <menu_item_call label="削除" name="Delete"/> <menu_item_call label="ãƒãƒƒã‚¯" name="Lock"/> - <menu_item_call label="アセット ID ã‚’å–å¾—" name="Get Assets IDs"/> + <menu_item_call label="アセット ID ã‚’å–å¾—ã™ã‚‹" name="Get Assets IDs"/> </menu> <menu label="区画" name="Parcel"> <menu_item_call label="ç§ã‚’所有者ã«ã™ã‚‹" name="Owner To Me"/> - <menu_item_call label="リンデンコンテンツã«è¨å®š" name="Set to Linden Content"/> - <menu_item_call label="パブリックã®åœŸåœ°ã‚’å–å¾—" name="Claim Public Land"/> + <menu_item_call label="リンデンコンテンツã«è¨å®šã™ã‚‹" name="Set to Linden Content"/> + <menu_item_call label="パブリックã®åœŸåœ°ã‚’å–å¾—ã™ã‚‹" name="Claim Public Land"/> </menu> <menu label="リージョン/地域" name="Region"> <menu_item_call label="一時アセットデータをダンプ" name="Dump Temp Asset Data"/> - <menu_item_call label="リージョンã®çŠ¶æ…‹ã‚’ä¿å˜" name="Save Region State"/> + <menu_item_call label="リージョンã®çŠ¶æ…‹ã‚’ä¿å˜ã™ã‚‹" name="Save Region State"/> </menu> <menu_item_call label="グリッドツール" name="God Tools"/> </menu> diff --git a/indra/newview/skins/default/xui/ja/menu_wearable_list_item.xml b/indra/newview/skins/default/xui/ja/menu_wearable_list_item.xml new file mode 100644 index 0000000000..0d8049bc0a --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_wearable_list_item.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Outfit Wearable Context Menu"> + <menu_item_call label="ç€ã‚‹" name="wear"/> + <menu_item_call label="è¿½åŠ " name="wear_add"/> + <menu_item_call label="å–り外ã™" name="take_off_or_detach"/> + <menu_item_call label="å–り外ã™" name="detach"/> + <context_menu label="è£…ç€ â–¶" name="wearable_attach_to"/> + <context_menu label="HUDã«è£…ç€ â–¶" name="wearable_attach_to_hud"/> + <menu_item_call label="å–り外ã™" name="take_off"/> + <menu_item_call label="編集" name="edit"/> + <menu_item_call label="オブジェクトã®ãƒ—ãƒãƒ•ィール" name="object_profile"/> + <menu_item_call label="オリジナルを表示" name="show_original"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/ja/mime_types.xml b/indra/newview/skins/default/xui/ja/mime_types.xml index 2f945b2010..54663a0367 100644 --- a/indra/newview/skins/default/xui/ja/mime_types.xml +++ b/indra/newview/skins/default/xui/ja/mime_types.xml @@ -2,13 +2,13 @@ <mimetypes name="default"> <widgetset name="web"> <label name="web_label"> - ウェブ・コンテンツ + Webコンテンツ </label> <tooltip name="web_tooltip"> - ã“ã“ã«ã‚¦ã‚§ãƒ–・コンテンツãŒã‚りã¾ã™ã€‚ + ã“ã“ã«WebコンテンツãŒã‚りã¾ã™ã€‚ </tooltip> <playtip name="web_playtip"> - ウェブ・コンテンツを表示 + Webコンテンツを表示 </playtip> </widgetset> <widgetset name="movie"> @@ -119,7 +119,7 @@ </mimetype> <mimetype name="application/xhtml+xml"> <label name="application/xhtml+xml_label"> - ウェブ・ページ (XHTML) + Webページ (XHTML) </label> </mimetype> <mimetype name="application/x-director"> @@ -184,7 +184,7 @@ </mimetype> <mimetype menu="1" name="text/html"> <label name="text/html_label"> - ウェブ・ページ + Webページ </label> </mimetype> <mimetype menu="1" name="text/plain"> diff --git a/indra/newview/skins/default/xui/ja/notifications.xml b/indra/newview/skins/default/xui/ja/notifications.xml index b502fb2e6e..42f8ccbb32 100644 --- a/indra/newview/skins/default/xui/ja/notifications.xml +++ b/indra/newview/skins/default/xui/ja/notifications.xml @@ -11,18 +11,29 @@ </global> <template name="okbutton"> <form> - <button name="OK" text="$yestext"/> + <button name="OK_okbutton" text="$yestext"/> + </form> + </template> + <template name="okignore"> + <form> + <button name="OK_okignore" text="$yestext"/> </form> </template> - <template name="okignore"/> <template name="okcancelbuttons"> <form> - <button name="Cancel" text="$notext"/> + <button name="OK_okcancelbuttons" text="$yestext"/> + <button name="Cancel_okcancelbuttons" text="$notext"/> + </form> + </template> + <template name="okcancelignore"> + <form> + <button name="OK_okcancelignore" text="$yestext"/> + <button name="Cancel_okcancelignore" text="$notext"/> </form> </template> - <template name="okcancelignore"/> <template name="okhelpbuttons"> <form> + <button name="OK_okhelpbuttons" text="$yestext"/> <button name="Help" text="$helptext"/> </form> </template> @@ -30,16 +41,17 @@ <form> <button name="Yes" text="$yestext"/> <button name="No" text="$notext"/> + <button name="Cancel_yesnocancelbuttons" text="$canceltext"/> </form> </template> <notification functor="GenericAcknowledge" label="䏿˜Žã®é€šçŸ¥ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸" name="MissingAlert"> ã‚ãªãŸã® [APP_NAME] ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯ä»Šå—ã‘å–ã£ãŸé€šçŸ¥ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 最新ビューワãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã‚‹ã‹ã”確èªãã ã•ã„。 -エラー詳細: 「[_NAME]ã€ã¨ã„ã†é€šçŸ¥ã¯ notifications.xml ã«ã‚りã¾ã›ã‚“ã§ã—ãŸã€‚ +エラー詳細: 「 [_NAME] ã€ã¨ã„ã†é€šçŸ¥ã¯ notifications.xml ã«ã‚りã¾ã›ã‚“ã§ã—ãŸã€‚ <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="FloaterNotFound"> - フãƒãƒ¼ã‚¿ãƒ»ã‚¨ãƒ©ãƒ¼ï¼šä¸‹è¨˜ã®ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸï¼š + フãƒãƒ¼ã‚¿ã‚¨ãƒ©ãƒ¼ï¼šä¸‹è¨˜ã®ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸï¼š [CONTROLS] <usetemplate name="okbutton" yestext="OK"/> </notification> @@ -69,29 +81,38 @@ <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="WearableSave"> - ç¾åœ¨ã®è¡£æœ/ボディーパーツã®å¤‰æ›´ã‚’ä¿å˜ã—ã¾ã™ã‹ï¼Ÿ + ç¾åœ¨ã®è¡£é¡žã€èº«ä½“部ä½ã®å¤‰æ›´ã‚’ä¿å˜ã—ã¾ã™ã‹ï¼Ÿ <usetemplate canceltext="ã‚ャンセル" name="yesnocancelbuttons" notext="ä¿å˜ã—ãªã„" yestext="ä¿å˜"/> </notification> <notification name="CompileQueueSaveText"> - 次ã®ç†ç”±ã§ã€ã‚¹ã‚¯ãƒªãƒ—ト用テã‚ストã®ã‚¢ãƒƒãƒ—ãƒãƒ¼ãƒ‰æ™‚ã«å•題ãŒèµ·ã“りã¾ã—ãŸã€‚ [REASON] 後ã§ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 + 次ã®ç†ç”±ã§ã€ã‚¹ã‚¯ãƒªãƒ—ト用テã‚ストã®ã‚¢ãƒƒãƒ—ãƒãƒ¼ãƒ‰æ™‚ã«å•題ãŒèµ·ã“りã¾ã—ãŸã€‚ +[REASON] +後ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 </notification> <notification name="CompileQueueSaveBytecode"> - 次ã®ç†ç”±ã§ã€ã‚³ãƒ³ãƒ‘イルã—ãŸã‚¹ã‚¯ãƒªãƒ—トã®ã‚¢ãƒƒãƒ—ãƒãƒ¼ãƒ‰æ™‚ã«å•題ãŒèµ·ã“りã¾ã—ãŸã€‚ [REASON]後ã§ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 + 次ã®ç†ç”±ã§ã€ã‚³ãƒ³ãƒ‘イルã—ãŸã‚¹ã‚¯ãƒªãƒ—トã®ã‚¢ãƒƒãƒ—ãƒãƒ¼ãƒ‰æ™‚ã«å•題ãŒèµ·ã“りã¾ã—ãŸã€‚ +[REASON] +後ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 </notification> <notification name="WriteAnimationFail"> ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ãƒ‡ãƒ¼ã‚¿ã®æ›¸ãè¾¼ã¿ã«å•題ãŒã‚りã¾ã™ã€‚後ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 </notification> <notification name="UploadAuctionSnapshotFail"> - 次ã®ç†ç”±ã§ã€ã‚ªãƒ¼ã‚¯ã‚·ãƒ§ãƒ³ã®ã‚¹ãƒŠãƒƒãƒ—ショットã®ã‚¢ãƒƒãƒ—ãƒãƒ¼ãƒ‰æ™‚ã«å•題ãŒèµ·ã“りã¾ã—ãŸã€‚ [REASON] + 次ã®ç†ç”±ã§ã€ã‚ªãƒ¼ã‚¯ã‚·ãƒ§ãƒ³ã®ã‚¹ãƒŠãƒƒãƒ—ショットã®ã‚¢ãƒƒãƒ—ãƒãƒ¼ãƒ‰æ™‚ã«å•題ãŒèµ·ã“りã¾ã—ãŸã€‚ +[REASON] </notification> <notification name="UnableToViewContentsMoreThanOne"> - 一度ã«è¤‡æ•°ã®ã‚¢ã‚¤ãƒ†ãƒ ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯è¡¨ç¤ºã§ãã¾ã›ã‚“。 -é¸æŠžã™ã‚‹ã‚¢ã‚¤ãƒ†ãƒ ã‚’1ã¤ã ã‘ã«ã—ã¦ã€ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 + 一度ã«è¤‡æ•°ã®ã‚¢ã‚¤ãƒ†ãƒ ã®ä¸èº«ã‚’表示ã§ãã¾ã›ã‚“。 +アイテムを 1 ã¤ã ã‘é¸æŠžã—ã¦ã€ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 </notification> <notification name="SaveClothingBodyChanges"> - è¡£æœï¼èº«ä½“部ä½ã«å¯¾ã™ã‚‹å¤‰æ›´ã‚’ã™ã¹ã¦ä¿å˜ã—ã¾ã™ã‹ï¼Ÿ + è¡£æœã€èº«ä½“部ä½ã«å¯¾ã™ã‚‹å¤‰æ›´ã‚’ã™ã¹ã¦ä¿å˜ã—ã¾ã™ã‹ï¼Ÿ <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ä¿å˜ã—ãªã„" yestext="ã™ã¹ã¦ä¿å˜"/> </notification> + <notification name="FriendsAndGroupsOnly"> + フレンド以外ã‹ã‚‰ã®ã‚³ãƒ¼ãƒ«ã‚„インスタントメッセージを無視ã™ã‚‹è¨å®šã«ã—ãŸã“ã¨ã‚’ã€ç›¸æ‰‹ã«çŸ¥ã‚‰ã‚Œã‚‹ã“ã¨ã¯ã‚りã¾ã›ã‚“。 + <usetemplate name="okbutton" yestext="OK"/> + </notification> <notification name="GrantModifyRights"> 他人ã«ä¿®æ£æ¨©é™ã‚’与ãˆã‚‹ã¨ã€æ¨©é™ã‚’与ãˆã‚‰ã‚ŒãŸäººã¯ã‚ãªãŸãŒæ‰€æœ‰ã™ã‚‹ã‚¤ãƒ³ãƒ¯ãƒ¼ãƒ«ãƒ‰ã®ã‚ªãƒ–ジェクトを変更ã€å‰Šé™¤ã€æŒã¡å¸°ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ ã“ã®æ¨©é™ã‚’与ãˆã‚‹éš›ã«ã¯ååˆ†ã«æ³¨æ„ã—ã¦ãã ã•ã„。 [FIRST_NAME] [LAST_NAME] ã«ä¿®æ£æ¨©é™ã‚’与ãˆã¾ã™ã‹ï¼Ÿ @@ -103,7 +124,7 @@ <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> </notification> <notification name="RevokeModifyRights"> - [FIRST_NAME] [LAST_NAME]ã«å¯¾ã—ã¦å¤‰æ›´æ¨©é™ã‚’å–り消ã—ã¾ã™ã‹ï¼Ÿ + [FIRST_NAME] [LAST_NAME] ã«å¯¾ã—ã¦å¤‰æ›´æ¨©é™ã‚’å–り消ã—ã¾ã™ã‹ï¼Ÿ <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> </notification> <notification name="RevokeModifyRightsMultiple"> @@ -125,28 +146,27 @@ <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="AddGroupOwnerWarning"> - ã‚ãªãŸã¯ [ROLE_NAME]ã®å½¹å‰²ã«ãƒ¡ãƒ³ãƒãƒ¼ã‚’与ãˆã‚ˆã†ã¨ã—ã¦ã„ã¾ã™ã€‚ + ã‚ãªãŸã¯ [ROLE_NAME] ã®å½¹å‰²ã«ãƒ¡ãƒ³ãƒãƒ¼ã‚’与ãˆã‚ˆã†ã¨ã—ã¦ã„ã¾ã™ã€‚ 任命ã•れãŸãƒ¡ãƒ³ãƒãƒ¼ãŒè‡ªã‚‰é€€ä»»ã—ãªã„é™ã‚Šã€ -彼らを役柄ã‹ã‚‰å‰Šé™¤ã§ãã¾ã›ã‚“。 +役柄ã‹ã‚‰å‰Šé™¤ã§ãã¾ã›ã‚“。 æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate ignoretext="グループオーナーを新ã—ãè¿½åŠ ã™ã‚‹å‰ã«ç¢ºèª" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> + <usetemplate ignoretext="グループオーナーを新ã—ãè¿½åŠ ã™ã‚‹å‰ã®ç¢ºèª" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> </notification> <notification name="AssignDangerousActionWarning"> - ã‚ãªãŸã¯[ROLE_NAME]ã« [ACTION_NAME]ã®èƒ½åŠ›ã‚’ + ã‚ãªãŸã¯ [ROLE_NAME] ã« [ACTION_NAME] ã®èƒ½åŠ›ã‚’ 与ãˆã‚ˆã†ã¨ã—ã¦ã„ã¾ã™ã€‚ *è¦å‘Š* ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ 自分ã¨ä»–ã®ãƒ¡ãƒ³ãƒãƒ¼ã«ç¾åœ¨ã‚ˆã‚Šå¼·åŠ›ãªæ¨©é™ã‚’割り当ã¦ã€ -自分をオーナーã¨ã»ã¼åŒæ§˜ã®ç«‹å ´ã« -任命ã™ã‚‹ã“ã¨ã‚‚ã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚ ã“ã®è¡Œç‚ºã®æ„味をよãç†è§£ã—ã¦ã‹ã‚‰ -実行ã—ã¦ãã ã•ã„。 +自分をオーナーã¨ã»ã¼åŒæ§˜ã®ç«‹å ´ã«ä»»å‘½ã™ã‚‹ã“ã¨ã‚‚ã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚ +ã“ã®è¡Œç‚ºã®æ„味をよãç†è§£ã—ã¦ã‹ã‚‰å®Ÿè¡Œã—ã¦ãã ã•ã„。 -ã“ã®èƒ½åŠ›ã‚’[ROLE_NAME]ã«å‰²ã‚Šå½“ã¦ã¾ã™ã‹ï¼Ÿ +ã“ã®èƒ½åŠ›ã‚’ [ROLE_NAME] ã«å‰²ã‚Šå½“ã¦ã¾ã™ã‹ï¼Ÿ <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> </notification> <notification name="AssignDangerousAbilityWarning"> - ã‚ãªãŸã¯[ROLE_NAME]ã« [ACTION_NAME]ã®èƒ½åŠ›ã‚’ + ã‚ãªãŸã¯ [ROLE_NAME] ã« [ACTION_NAME] ã®èƒ½åŠ›ã‚’ 与ãˆã‚ˆã†ã¨ã—ã¦ã„ã¾ã™ã€‚ *è¦å‘Š* @@ -154,97 +174,99 @@ 自分ã¨ä»–ã®ãƒ¡ãƒ³ãƒãƒ¼ã«ã™ã¹ã¦ã®èƒ½åŠ›ã‚’å‰²ã‚Šå½“ã¦ã€ 自分をオーナーã¨ã»ã¼åŒæ§˜ã®ç«‹å ´ã«ä»»å‘½ã§ãã¾ã™ã€‚ -ã“ã®èƒ½åŠ›ã‚’[ROLE_NAME]ã«å‰²ã‚Šå½“ã¦ã¾ã™ã‹ï¼Ÿ +ã“ã®èƒ½åŠ›ã‚’ [ROLE_NAME] ã«å‰²ã‚Šå½“ã¦ã¾ã™ã‹ï¼Ÿ <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> </notification> <notification name="AttachmentDrop"> アタッãƒãƒ¡ãƒ³ãƒˆã‚’下ã«ç½®ã“ã†ã¨ã—ã¦ã„ã¾ã™ã€‚ ç¶šã‘ã¾ã™ã‹ï¼Ÿ - <usetemplate ignoretext="アタッãƒãƒ¡ãƒ³ãƒˆã‚’下ã«è½ã¨ã™å‰ã«ç¢ºèªã™ã‚‹" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> - </notification> - <notification name="ClickUnimplemented"> - 申ã—訳ã‚りã¾ã›ã‚“ãŒã€ã¾ã 未実装ã§ã™ã€‚ + <usetemplate ignoretext="アタッãƒãƒ¡ãƒ³ãƒˆã‚’下ã«è½ã¨ã™å‰ã®ç¢ºèª" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> </notification> <notification name="JoinGroupCanAfford"> - ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚åŠ ã™ã‚‹ã«ã¯ã€L$[COST]ã‹ã‹ã‚Šã¾ã™ã€‚ + ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚åŠ ã™ã‚‹ã«ã¯ã€L$ [COST] ã‹ã‹ã‚Šã¾ã™ã€‚ 続行ã—ã¾ã™ã‹ï¼Ÿ <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="å‚åŠ "/> </notification> + <notification name="JoinGroupNoCost"> + [NAME] ã¨ã„ã†ã‚°ãƒ«ãƒ¼ãƒ—ã«å…¥ã‚ã†ã¨ã—ã¦ã„ã¾ã™ã€‚ +ç¶šã‘ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="å‚åŠ "/> + </notification> <notification name="JoinGroupCannotAfford"> - ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«åŠ å…¥ã™ã‚‹ã«ã¯ã€L$[COST]å¿…è¦ã§ã™ã€‚ -L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚åŠ ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 + ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«åŠ å…¥ã™ã‚‹ã«ã¯ã€L$ [COST] å¿…è¦ã§ã™ã€‚ +L$ ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚åŠ ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 </notification> <notification name="CreateGroupCost"> - ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—を作るã«ã¯ L$100 ã‹ã‹ã‚Šã¾ã™ã€‚ + ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—を作るã«ã¯ L$ 100 ã‹ã‹ã‚Šã¾ã™ã€‚ 一人ã§ã¯ã‚°ãƒ«ãƒ¼ãƒ—ã«ãªã‚‰ãªã„ã®ã§ã€æ°¸ä¹…ã«å‰Šé™¤ã•れã¦ã—ã¾ã„ã¾ã™ã€‚ 48 時間以内ã«ãƒ¡ãƒ³ãƒãƒ¼ã‚’勧誘ã—ã€å…¥ä¼šã—ã¦ã‚‚らã£ã¦ãã ã•ã„。 <usetemplate canceltext="ã‚ャンセル" name="okcancelbuttons" notext="ã‚ャンセル" yestext="L$100 ã§ã‚°ãƒ«ãƒ¼ãƒ—を作æˆ"/> </notification> <notification name="LandBuyPass"> - L$[COST]ã§ [TIME]時間ã“ã®åœŸåœ°[PARCEL_NAME]ã«å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + L$ [COST] ã§ [TIME] 時間 [PARCEL_NAME] ã«å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ å…¥å ´è¨±å¯ã‚’購入ã—ã¾ã™ã‹ï¼Ÿ <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> </notification> <notification name="SalePriceRestriction"> ä¸ç‰¹å®šã®äººã«å£²å´ã™ã‚‹å ´åˆã«ã¯ã€ -売å´ä¾¡æ ¼ã¯L$0以上ã«è¨å®šã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ -売å´ä¾¡æ ¼ã‚’L$0ã«è¨å®šã™ã‚‹å ´åˆã¯ã€ +売å´ä¾¡æ ¼ã¯L$ 0 以上ã«è¨å®šã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ +売å´ä¾¡æ ¼ã‚’L$ 0 ã«è¨å®šã™ã‚‹å ´åˆã¯ã€ 売å´ã™ã‚‹å€‹äººã‚’é¸æŠžã—ã¦ãã ã•ã„。 </notification> <notification name="ConfirmLandSaleChange"> - é¸æŠžã•れãŸ[LAND_SIZE]平方メートルã®åœŸåœ°ã¯ã€å£²ã‚Šå‡ºã—ä¸ã«è¨å®šã•れã¦ã„ã¾ã™ã€‚ -売å´ä¾¡æ ¼L$[SALE_PRICE]ã§ã€[NAME]ã«å£²å´ã‚’èªå¯ã—ã¾ã™ã€‚ + é¸æŠžã—㟠[LAND_SIZE] 平方メートルã®åœŸåœ°ã¯ã€å£²ã‚Šå‡ºã—ä¸ã«è¨å®šã•れã¦ã„ã¾ã™ã€‚ +売å´ä¾¡æ ¼ L$ [SALE_PRICE] ã§ã€[NAME] ã«å£²å´ã‚’èªå¯ã—ã¾ã™ã€‚ <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> </notification> <notification name="ConfirmLandSaleToAnyoneChange"> 注æ„: 「誰ã«ã§ã‚‚販売ã€ã‚’クリックã™ã‚‹ã“ã¨ã§ã€ã‚ãªãŸã®åœŸåœ°ã¯ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«ã„る人ã«é™ã‚‰ãš [SECOND_LIFE] コミュニティ全体ã§åˆ©ç”¨å¯èƒ½ã¨ãªã‚Šã¾ã™ã€‚ é¸æŠžã—㟠[LAND_SIZE] 平方メートルã®åœŸåœ°ã¯ã€è²©å£²å¯¾è±¡ã«è¨å®šã•れã¾ã—ãŸã€‚ -è²©å£²ä¾¡æ ¼ L$[SALE_PRICE] ã§ã€[NAME] ãŒè²©å£²å¯¾è±¡è€…ã¨ãªã‚Šã¾ã™ã€‚ +è²©å£²ä¾¡æ ¼ L$ [SALE_PRICE] ã§ã€[NAME] ãŒè²©å£²å¯¾è±¡è€…ã¨ãªã‚Šã¾ã™ã€‚ <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> </notification> <notification name="ReturnObjectsDeededToGroup"> - ã“ã®åŒºç”»ã®ã‚°ãƒ«ãƒ¼ãƒ—[NAME]共有ã®ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトをã€ä»¥å‰ã®ã‚ªãƒ¼ãƒŠãƒ¼ã®æŒã¡ç‰©ã«æˆ»ãã†ã¨ã—ã¦ã„ã¾ã™ã€‚ + ã“ã®åŒºç”»ã®ã‚°ãƒ«ãƒ¼ãƒ— [NAME] 共有ã®ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトをã€ä»¥å‰ã®æ‰€æœ‰è€…ã®ã€ŒæŒã¡ç‰©ã€ã«æˆ»ãã†ã¨ã—ã¦ã„ã¾ã™ã€‚ æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ *è¦å‘Š* ã“れã«ã‚ˆã‚Šã€ -グループã«è²æ¸¡ã•れãŸè²æ¸¡ä¸å¯èƒ½ãªã‚ªãƒ–ジェクトã¯å‰Šé™¤ã•れã¾ã™ï¼ +グループã«è²æ¸¡ã•れãŸã€Œå†è²©ãƒ»ãƒ—レゼントä¸å¯ã€ã®ã‚ªãƒ–ジェクトã¯å‰Šé™¤ã•れã¾ã™ï¼ オブジェクト: [N] <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> </notification> <notification name="ReturnObjectsOwnedByUser"> ã“ã®åŒºç”»ã§ã€ -ä½äºº[NAME]ãŒæ‰€æœ‰ã™ã‚‹å…¨ã¦ã®ã‚ªãƒ–ジェクトを -å½¼ã‚‰ã®æŒã¡ç‰©ã«æœ¬å½“ã«è¿”å´ã—ã¦ã‚‚よã„ã§ã™ã‹ï¼Ÿ +ä½äºº [NAME] ãŒæ‰€æœ‰ã™ã‚‹å…¨ã¦ã®ã‚ªãƒ–ジェクトを +本人ã®ã€ŒæŒã¡ç‰©ã€ã«æœ¬å½“ã«è¿”å´ã—ã¦ã‚‚よã„ã§ã™ã‹ï¼Ÿ オブジェクト: [N] <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> </notification> <notification name="ReturnObjectsOwnedBySelf"> ã“ã®åœŸåœ°åŒºç”»å†…ã«ã‚ã‚‹ã€ã‚ãªãŸãŒæ‰€æœ‰ã™ã‚‹ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトを〠-ã‚ãªãŸã®æŒã¡ç‰©ã«æˆ»ãã†ã¨ã—ã¦ã„ã¾ã™ã€‚æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ +ã‚ãªãŸã®ã€ŒæŒã¡ç‰©ã€ã«æˆ»ãã†ã¨ã—ã¦ã„ã¾ã™ã€‚ç¶šã‘ã¾ã™ã‹ï¼Ÿ オブジェクト: [N] <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> </notification> <notification name="ReturnObjectsNotOwnedBySelf"> ã“ã®åœŸåœ°åŒºç”»å†…ã«ã‚ã‚‹ã€ã‚ãªãŸä»¥å¤–ãŒæ‰€æœ‰ã™ã‚‹ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトを〠-ãれãžã‚Œã®ã‚ªãƒ¼ãƒŠãƒ¼ã®æŒã¡ç‰©ã«æˆ»ãã†ã¨ã—ã¦ã„ã¾ã™ã€‚ +ãれãžã‚Œã®æ‰€æœ‰è€…ã®ã€ŒæŒã¡ç‰©ã€ã«æˆ»ãã†ã¨ã—ã¦ã„ã¾ã™ã€‚ æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ -グループã«è²æ¸¡ã•れãŸè²æ¸¡å¯èƒ½ã‚ªãƒ–ジェクトã¯ã€ä»¥å‰ã®ã‚ªãƒ¼ãƒŠãƒ¼ã«è¿”å´ã•れã¾ã™ã€‚ +グループã«è²æ¸¡ã•れãŸã€Œå†è²©ãƒ»ãƒ—レゼントå¯ã€ã®ã‚ªãƒ–ジェクトã¯ã€ä»¥å‰ã®æ‰€æœ‰è€…ã«è¿”å´ã•れã¾ã™ã€‚ *è¦å‘Š* ã“れã«ã‚ˆã‚Šã€ -グループã«è²æ¸¡ã•れãŸè²æ¸¡ä¸å¯èƒ½ãªã‚ªãƒ–ジェクトã¯å‰Šé™¤ã•れã¾ã™ï¼ +グループã«è²æ¸¡ã•れãŸã€Œå†è²©ãƒ»ãƒ—レゼントä¸å¯ã€ã®ã‚ªãƒ–ジェクトã¯å‰Šé™¤ã•れã¾ã™ï¼ オブジェクト: [N] <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> </notification> <notification name="ReturnObjectsNotOwnedByUser"> ã“ã®åœŸåœ°åŒºç”»å†…ã«ã‚る〠-[NAME]以外ã«ã‚ˆã‚‹æ‰€æœ‰ã®ã‚ªãƒ–ジェクトをã™ã¹ã¦ãれãžã‚Œã®ã‚ªãƒ¼ãƒŠãƒ¼ã®æŒã¡ç‰©ã«è¿”å´ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ -æ“作を続行ã—ã¾ã™ã‹ï¼Ÿã‚°ãƒ«ãƒ¼ãƒ—ã«è²æ¸¡ã•れãŸè²æ¸¡å¯èƒ½ã‚ªãƒ–ジェクトã¯ã€ä»¥å‰ã®ã‚ªãƒ¼ãƒŠãƒ¼ã«è¿”å´ã•れã¾ã™ã€‚ +[NAME]以外ã«ã‚ˆã‚‹æ‰€æœ‰ã®ã‚ªãƒ–ジェクトをã™ã¹ã¦ãれãžã‚Œã®æ‰€æœ‰è€…ã®ã€ŒæŒã¡ç‰©ã€ã«è¿”å´ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ +æ“作を続行ã—ã¾ã™ã‹ï¼Ÿã‚°ãƒ«ãƒ¼ãƒ—ã«è²æ¸¡ã•れãŸã€Œå†è²©ãƒ»ãƒ—レゼントå¯ã€ã®ã‚ªãƒ–ジェクトã¯ã€ä»¥å‰ã®æ‰€æœ‰è€…ã«è¿”å´ã•れã¾ã™ã€‚ *è¦å‘Š* ã“れã«ã‚ˆã‚Šã€ -グループã«è²æ¸¡ã•れãŸè²æ¸¡ä¸å¯èƒ½ãªã‚ªãƒ–ジェクトã¯å‰Šé™¤ã•れã¾ã™ï¼ +グループã«è²æ¸¡ã•れãŸã€Œå†è²©ãƒ»ãƒ—レゼントä¸å¯ã€ã®ã‚ªãƒ–ジェクトã¯å‰Šé™¤ã•れã¾ã™ï¼ オブジェクト: [N] <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> </notification> @@ -253,43 +275,42 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚åŠ ã™ã‚‹ã“ã¨ãŒã§ãã¾ <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> </notification> <notification name="DisableAllTopObjects"> - ã“ã®åœ°åŸŸå†…ã®ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトを無効ã«ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ + ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰å†…ã®ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトを無効ã«ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> </notification> <notification name="ReturnObjectsNotOwnedByGroup"> - ã“ã®åœŸåœ°ã®åŒºç”»ä¸Šã®ã‚ªãƒ–ジェクトã®ã†ã¡ã€ã‚°ãƒ«ãƒ¼ãƒ—[NAME] -ã¨ã®é–“ã§å…±æœ‰ã—ã¦ã„ãªã„オブジェクトをオーナーã«è¿”å´ã—ã¾ã™ã‹ï¼Ÿ + ã“ã®åœŸåœ°ã®åŒºç”»ä¸Šã®ã‚ªãƒ–ジェクトã®ã†ã¡ã€ã‚°ãƒ«ãƒ¼ãƒ— [NAME] ã¨ã®é–“ã§å…±æœ‰ã—ã¦ã„ãªã„オブジェクトを所有者ã«è¿”å´ã—ã¾ã™ã‹ï¼Ÿ オブジェクト: [N] <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> </notification> <notification name="UnableToDisableOutsideScripts"> スクリプトを無効ã«ã§ãã¾ã›ã‚“。 -ã“ã®åœ°åŸŸå…¨ä½“ãŒã€Œãƒ€ãƒ¡ãƒ¼ã‚¸æœ‰åйã€ã«è¨å®šã•れã¦ã„ã¾ã™ã€‚ +ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰å…¨ä½“ãŒã€Œãƒ€ãƒ¡ãƒ¼ã‚¸æœ‰åйã€ã«è¨å®šã•れã¦ã„ã¾ã™ã€‚ æ¦å™¨ã‚’使用ã™ã‚‹ã«ã¯ã‚¹ã‚¯ãƒªãƒ—トã®å®Ÿè¡Œã‚’許å¯ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ </notification> <notification name="MultipleFacesSelected"> ç¾åœ¨è¤‡æ•°ã®é¢ãŒé¸æŠžã•れã¦ã„ã¾ã™ã€‚ ã“ã®ã¾ã¾ç¶šã‘ãŸå ´åˆã€ãƒ¡ãƒ‡ã‚£ã‚¢ã®åˆ¥ã€…ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ãŒã‚ªãƒ–ジェクトã®è¤‡æ•°ã®é¢ã«è¨å®šã•れã¾ã™ã€‚ メディアを 1 ã¤ã®é¢ã ã‘ã«å–り付ã‘ã‚‹ã«ã¯ã€ã€Œé¢ã‚’é¸æŠžã€ã‚’é¸ã‚“ã§ã‚ªãƒ–ジェクトã®å¸Œæœ›ã™ã‚‹é¢ã‚’クリックã€ãれã‹ã‚‰ã€Œè¿½åŠ ã€ã‚’クリックã—ã¦ãã ã•ã„。 - <usetemplate ignoretext="メディアã¯é¸æŠžã—ãŸè¤‡æ•°ã®é¢ã«ã‚»ãƒƒãƒˆã•れã¾ã™ã€‚" name="okcancelignore" notext="ã‚ャンセル" yestext="OK"/> + <usetemplate ignoretext="メディアãŒé¸æŠžã—ãŸè¤‡æ•°ã®é¢ã«ã‚»ãƒƒãƒˆã•れるã¨ã" name="okcancelignore" notext="ã‚ャンセル" yestext="OK"/> </notification> <notification name="MustBeInParcel"> ç€åœ°ç‚¹ã‚’è¨å®šã™ã‚‹ã«ã¯ã€ã“ã®åŒºç”»ã®å†…å´ã« ç«‹ã£ã¦ãã ã•ã„。 </notification> <notification name="PromptRecipientEmail"> - å—ä¿¡è€…ã®æœ‰åйãªEメールアドレスを入力ã—ã¦ãã ã•ã„。 + å—ä¿¡è€…ã®æœ‰åйãªãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’入力ã—ã¦ãã ã•ã„。 </notification> <notification name="PromptSelfEmail"> - ã‚ãªãŸã®Eメール・アドレスを入力ã—ã¦ãã ã•ã„。 + ã‚ãªãŸã®ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’入力ã—ã¦ãã ã•ã„。 </notification> <notification name="PromptMissingSubjMsg"> デフォルトã®ä»¶åã¾ãŸã¯ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’付ã‘ã¦ã€ã‚¹ãƒŠãƒƒãƒ—ショットをé€ä¿¡ã—ã¾ã™ã‹ï¼Ÿ <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> </notification> <notification name="ErrorProcessingSnapshot"> - スナップショット・データã®å‡¦ç†ã‚¨ãƒ©ãƒ¼ + スナップショットデータã®å‡¦ç†ã‚¨ãƒ©ãƒ¼ </notification> <notification name="ErrorEncodingSnapshot"> スナップショットã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‰åŒ–ã§ã‚¨ãƒ©ãƒ¼ãŒå‡ºã¾ã—ãŸï¼ @@ -304,11 +325,11 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚åŠ ã™ã‚‹ã“ã¨ãŒã§ãã¾ [SECOND_LIFE] ã¸ã®ãƒã‚°ã‚¤ãƒ³ã‚’ç¶šã‘ã‚‹ã«ã¯ã€åˆ©ç”¨è¦ç´„ã«åŒæ„ã—ã¦ãã ã•ã„。 </notification> <notification name="CouldNotPutOnOutfit"> - æœè£…を装ç€ã§ãã¾ã›ã‚“。 -æœè£…フォルダã«è¡£æœã€èº«ä½“部ä½ã€ä»˜å±žå“ãŒã‚りã¾ã›ã‚“。 + アウトフィットを装ç€ã§ãã¾ã›ã‚“。 +アウトフィットフォルダã«è¡£é¡žã€èº«ä½“部ä½ã€ã‚¢ã‚¿ãƒƒãƒãƒ¡ãƒ³ãƒˆãŒã‚りã¾ã›ã‚“。 </notification> <notification name="CannotWearTrash"> - ゴミ箱ã«ã‚ã‚‹æœã‚„ボディーパーツã®ç€ç”¨ã¯ã§ãã¾ã›ã‚“。 + ã”ã¿ç®±ã«ã‚る衣類や身体部ä½ã®ç€ç”¨ã¯ã§ãã¾ã›ã‚“。 </notification> <notification name="MaxAttachmentsOnOutfit"> オブジェクトを付ã‘られã¾ã›ã‚“ã§ã—ãŸã€‚ @@ -318,15 +339,18 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚åŠ ã™ã‚‹ã“ã¨ãŒã§ãã¾ ã¾ã èªã¿è¾¼ã¾ã‚Œã¦ã„ãªã„ãŸã‚ã€ãã®ã‚¢ã‚¤ãƒ†ãƒ を装ç€ã§ãã¾ã›ã‚“。後ã§ã‚„り直ã—ã¦ãã ã•ã„。 </notification> <notification name="MustHaveAccountToLogIn"> - ãŠã£ã¨! 記入æ¼ã‚ŒãŒã‚りã¾ã™ã‚ˆã€‚ + ãŠã£ã¨ï¼è¨˜å…¥æ¼ã‚ŒãŒã‚りã¾ã™ã‚ˆã€‚ ã‚¢ãƒã‚¿ãƒ¼ã®ãƒ•ァーストãƒãƒ¼ãƒ ã¨ãƒ©ã‚¹ãƒˆãƒãƒ¼ãƒ ã®ä¸¡æ–¹ã‚’入力ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ -[SECOND_LIFE]ã«å…¥ã‚‹ã«ã¯ã€ã‚¢ã‚«ã‚¦ãƒ³ãƒˆãŒå¿…è¦ã§ã™ã€‚ アカウントを作æˆã—ã¾ã™ã‹ï¼Ÿ +[SECOND_LIFE] ã«å…¥ã‚‹ã«ã¯ã€ã‚¢ã‚«ã‚¦ãƒ³ãƒˆãŒå¿…è¦ã§ã™ã€‚ アカウントを作æˆã—ã¾ã™ã‹ï¼Ÿ <url name="url"> https://join.secondlife.com/index.php?lang=ja-JP </url> <usetemplate name="okcancelbuttons" notext="ã‚‚ã†ä¸€åº¦è©¦ã™" yestext="æ–°ã—ã„アカウントを作æˆ"/> </notification> + <notification name="InvalidCredentialFormat"> + 「ユーザーãƒãƒ¼ãƒ ã€æ¬„ã«ã‚¢ãƒã‚¿ãƒ¼ã®ãƒ•ァーストãƒãƒ¼ãƒ ã¨ãƒ©ã‚¹ãƒˆãƒãƒ¼ãƒ 両方を入力ã—ã¦ã‹ã‚‰ãƒã‚°ã‚¤ãƒ³ã—ã¦ãã ã•ã„。 + </notification> <notification name="AddClassified"> クラシファイド広告ã¯ã€æ¤œç´¢ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã¨ [http://secondlife.com/community/classifieds secondlife.com] ã®ã€Œã‚¯ãƒ©ã‚·ãƒ•ァイド広告ã€ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã«ä¸€é€±é–“掲載ã•れã¾ã™ã€‚ 広告を記入ã—ãŸã‚‰ã€ã€ŒæŽ²è¼‰...ã€ã‚’クリックã—ã¦ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«è¿½åŠ ã—ã¦ãã ã•ã„。 @@ -335,25 +359,29 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚åŠ ã™ã‚‹ã“ã¨ãŒã§ãã¾ <usetemplate ignoretext="æ–°è¦ã‚¯ãƒ©ã‚·ãƒ•ã‚¡ã‚¤ãƒ‰åºƒå‘Šä½œæˆæ–¹æ³•" name="okcancelignore" notext="å–り消ã—" yestext="OK"/> </notification> <notification name="DeleteClassified"> - クラシファイド広告[NAME]ã®å‰Šé™¤ã‚’ã—ã¾ã™ã‹ï¼Ÿ + クラシファイド広告 [NAME] を削除ã—ã¾ã™ã‹ï¼Ÿ æ”¯æ‰•ã„æ¸ˆã¿ã®æ–™é‡‘ã¯è¿”金ã•れã¾ã›ã‚“。 <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> </notification> <notification name="DeleteMedia"> ã“ã®é¢ã«ã‚るメディアを削除ã™ã‚‹é¸æŠžã‚’ã—ã¾ã—ãŸã€‚ ç¶šã‘ã¾ã™ã‹ï¼Ÿ - <usetemplate ignoretext="オブジェクトã‹ã‚‰ãƒ¡ãƒ‡ã‚£ã‚¢ã‚’削除ã™ã‚‹å‰ã«ç¢ºèªã™ã‚‹" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> + <usetemplate ignoretext="オブジェクトã‹ã‚‰ãƒ¡ãƒ‡ã‚£ã‚¢ã‚’削除ã™ã‚‹å‰ã®ç¢ºèª" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> </notification> <notification name="ClassifiedSave"> - クラシファイド広告[NAME]ã¸ã®å¤‰æ›´ã‚’ä¿å˜ã—ã¾ã™ã‹ï¼Ÿ + クラシファイド広告 [NAME] ã¸ã®å¤‰æ›´ã‚’ä¿å˜ã—ã¾ã™ã‹ï¼Ÿ <usetemplate canceltext="ã‚ャンセル" name="yesnocancelbuttons" notext="ä¿å˜ã—ãªã„" yestext="ä¿å˜"/> </notification> + <notification name="ClassifiedInsufficientFunds"> + クラシファイド広告を出ã™ã«ã¯ã€è³‡é‡‘ãŒè¶³ã‚Šã¾ã›ã‚“。 + <usetemplate name="okbutton" yestext="OK"/> + </notification> <notification name="DeleteAvatarPick"> - ピック[PICK]を削除ã—ã¾ã™ã‹ï¼Ÿ + <nolink>[PICK]</nolink> を削除ã—ã¾ã™ã‹ï¼Ÿ <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> </notification> <notification name="PromptGoToEventsPage"> - [SECOND_LIFE]イベント・ウェブ・ページã«ç§»å‹•ã—ã¾ã™ã‹ï¼Ÿ + [SECOND_LIFE] イベント Web ページã«ç§»å‹•ã—ã¾ã™ã‹ï¼Ÿ <url name="url"> http://secondlife.com/events/?lang=ja-JP </url> @@ -379,7 +407,7 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚åŠ ã™ã‚‹ã“ã¨ãŒã§ãã¾ æ–°ã—ã„スã‚ン㯠[APP_NAME] ã‚’å†èµ·å‹•後ã«è¡¨ç¤ºã•れã¾ã™ã€‚ </notification> <notification name="GoToAuctionPage"> - [SECOND_LIFE]ウェブ・ページã«ç§»å‹•ã—〠入æœã‚ã‚‹ã„ã¯ã‚ªãƒ¼ã‚¯ã‚·ãƒ§ãƒ³ã®è©³ç´°ã‚’確èªã—ã¾ã™ã‹ï¼Ÿ + [SECOND_LIFE]ã® Web ページã«ç§»å‹•ã—ã€å…¥æœã‚ã‚‹ã„ã¯ã‚ªãƒ¼ã‚¯ã‚·ãƒ§ãƒ³ã®è©³ç´°ã‚’確èªã—ã¾ã™ã‹ï¼Ÿ <url name="url"> http://secondlife.com/auctions/auction-detail.php?id=[AUCTION_ID] </url> @@ -429,7 +457,7 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚åŠ ã™ã‚‹ã“ã¨ãŒã§ãã¾ </notification> <notification name="StartRegionEmpty"> ãƒã‚°ã‚¤ãƒ³ä½ç½®ãŒæŒ‡å®šã•れã¦ã„ã¾ã›ã‚“。 -ãƒã‚°ã‚¤ãƒ³ä½ç½®ã®æ¬„ã«ãƒªãƒ¼ã‚¸ãƒ§ãƒ³åを入力ã™ã‚‹ã‹ã€ã€Œæœ€å¾Œã«ãƒã‚°ã‚¢ã‚¦ãƒˆã—ãŸå ´æ‰€ã€ã‹ã€Œè‡ªå®…(ホーム)ã€ã‚’é¸æŠžã—ã¦ãã ã•ã„。 +ãƒã‚°ã‚¤ãƒ³ä½ç½®ã®æ¬„ã«ãƒªãƒ¼ã‚¸ãƒ§ãƒ³åを入力ã™ã‚‹ã‹ã€ã€Œæœ€å¾Œã«ãƒã‚°ã‚¢ã‚¦ãƒˆã—ãŸå ´æ‰€ã€ã‹ã€Œãƒ›ãƒ¼ãƒ ã€ã‚’é¸æŠžã—ã¦ãã ã•ã„。 <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="CouldNotStartStopScript"> @@ -440,40 +468,36 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚åŠ ã™ã‚‹ã“ã¨ãŒã§ã㾠ファイルをダウンãƒãƒ¼ãƒ‰ã§ãã¾ã›ã‚“。 </notification> <notification name="CannotWriteFile"> - ファイル[[FILE]]を書ãè¾¼ã‚ã¾ã›ã‚“。 + ファイル [[FILE]] を書ãè¾¼ã‚ã¾ã›ã‚“。 </notification> <notification name="UnsupportedHardware"> - è¦å‘Šï¼š ãŠä½¿ã„ã®ã‚·ã‚¹ãƒ†ãƒ 㯠[APP_NAME] ã®å¿…è¦æœ€ä½Žé™ã®å‹•作環境を満ãŸã—ã¦ã„ã¾ã›ã‚“。 ã“ã®ã¾ã¾ [APP_NAME] を使用ã™ã‚‹ã¨ã€ãƒ‘フォーマンスã®ä½Žä¸‹ã‚’感ã˜ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。 æã‚Œå…¥ã‚Šã¾ã™ãŒ [SUPPORT_SITE] ã§ã¯ã‚µãƒãƒ¼ãƒˆå¯¾è±¡å¤–ã®ã‚·ã‚¹ãƒ†ãƒ ã«é–¢ã™ã‚‹æŠ€è¡“的サãƒãƒ¼ãƒˆã¯è¡Œã£ã¦ãŠã‚Šã¾ã›ã‚“。 + ãŠä½¿ã„ã®ã‚³ãƒ³ãƒ”ューター㯠[APP_NAME] ã®å¿…è¦æœ€ä½Žé™ã®å‹•作環境を満ãŸã—ã¦ã„ã¾ã›ã‚“。 パフォーマンスã®ä½Žä¸‹ã‚’感ã˜ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。 æã‚Œå…¥ã‚Šã¾ã™ãŒ [SUPPORT_SITE] ã§ã¯ã‚µãƒãƒ¼ãƒˆå¯¾è±¡å¤–ã®ã‚·ã‚¹ãƒ†ãƒ ã«é–¢ã™ã‚‹æŠ€è¡“的サãƒãƒ¼ãƒˆã¯è¡Œã£ã¦ãŠã‚Šã¾ã›ã‚“。 -最低動作環境 -[_URL] ã‚’é–‹ã„ã¦è©³ã—ã„æƒ…å ±ã‚’ç¢ºèªã—ã¾ã™ã‹ï¼Ÿ +[_URL] ã«ç§»å‹•ã—ã¦ç¢ºèªã‚’ã—ã¾ã™ã‹ï¼Ÿ <url name="url" option="0"> http://secondlife.com/support/sysreqs.php?lang=ja </url> - <usetemplate ignoretext="使用ã—ã¦ã„るコンピューターã®ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ãŒã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> + <usetemplate ignoretext="使用ä¸ã®ã‚³ãƒ³ãƒ”ューターã®ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ãŒã‚µãƒãƒ¼ãƒˆã•れã¦ã„ãªã„ã¨ã" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> </notification> <notification name="UnknownGPU"> - ãŠä½¿ã„ã®ã‚·ã‚¹ãƒ†ãƒ ã«ã¯ã€ç¾åœ¨ [APP_NAME] ãŒèªè˜ã§ããªã„ã‚°ãƒ©ãƒ•ã‚£ãƒƒã‚¯ã‚«ãƒ¼ãƒ‰ãŒæè¼‰ã•れã¦ã„ã¾ã™ã€‚ -[APP_NAME] ã§ã¾ã テストã•れã¦ã„ãªã„最新ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã®ãŸã‚ã ã¨è€ƒãˆã‚‰ã‚Œã¾ã™ã€‚ [APP_NAME] ã¯æ£å¸¸ã«å®Ÿè¡Œã•れるå¯èƒ½æ€§ãŒé«˜ã„ã§ã™ãŒã€è¡¨ç¤ºè¨å®šã‚’調整ã™ã‚‹å¿…è¦ãŒã‚ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。 + ãŠä½¿ã„ã®ã‚·ã‚¹ãƒ†ãƒ ã«ã¯ã€[APP_NAME] ãŒèªè˜ã§ããªã„ã‚°ãƒ©ãƒ•ã‚£ãƒƒã‚¯ã‚«ãƒ¼ãƒ‰ãŒæè¼‰ã•れã¦ã„ã¾ã™ã€‚ +[APP_NAME] ã§ã¾ã テストã•れã¦ã„ãªã„最新ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã®ãŸã‚ã ã¨è€ƒãˆã‚‰ã‚Œã¾ã™ã€‚ å•題ãªã„ã¨ã¯æ€ã„ã¾ã™ãŒã€ã‚°ãƒ©ãƒ•ィックã®è¨å®šã‚’調整ã™ã‚‹å¿…è¦ãŒã‚ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。 (ミー > 環境è¨å®š > グラフィック) <form name="form"> - <ignore name="ignore" text="使用ä¸ã®ã‚°ãƒ©ãƒ•ックカードãŒèªè˜ã•れã¾ã›ã‚“ã§ã—ãŸ"/> + <ignore name="ignore" text="使用ä¸ã®ã‚°ãƒ©ãƒ•ックカードãŒèªè˜ã•れãªã„ã¨ã"/> </form> </notification> <notification name="DisplaySettingsNoShaders"> グラフィックドライãƒã‚’åˆæœŸåŒ–ä¸ã« [APP_NAME] ãŒã‚¯ãƒ©ãƒƒã‚·ãƒ¥ã—ã¾ã—ãŸã€‚ -ドライãƒã®ä¸€èˆ¬çš„ãªã‚¨ãƒ©ãƒ¼ã‚’防ããŸã‚ã«ã€ã‚°ãƒ©ãƒ•ィックã®ã‚¯ã‚ªãƒªãƒ†ã‚£ãŒä½Žã«è¨å®šã•れã¾ã™ã€‚ ãã®ãŸã‚ã€ä¸€éƒ¨ã®ã‚°ãƒ©ãƒ•ィック特性ã«åˆ¶é™ãŒå‡ºã¾ã™ã€‚ +ドライãƒã®ä¸€èˆ¬çš„ãªã‚¨ãƒ©ãƒ¼ã‚’防ããŸã‚ã«ã€ç”»è³ªãŒä½Žã«è¨å®šã•れã¾ã™ã€‚ ãã®ãŸã‚ã€ä¸€éƒ¨ã®ã‚°ãƒ©ãƒ•ィック特性ã«åˆ¶é™ãŒå‡ºã¾ã™ã€‚ ãŠä½¿ã„ã®ã‚°ãƒ©ãƒ•ィックカードã®ãƒ‰ãƒ©ã‚¤ãƒã‚’アップデートã™ã‚‹ã‚ˆã†ãŠã™ã™ã‚ã—ã¾ã™ã€‚ -グラフィックã®ã‚¯ã‚ªãƒªãƒ†ã‚£ã¯ã€ç’°å¢ƒè¨å®š > グラフィック ã§è¨å®šã§ãã¾ã™ã€‚ +画質ã¯ã€ç’°å¢ƒè¨å®š > グラフィック ã§è¨å®šã§ãã¾ã™ã€‚ </notification> <notification name="RegionNoTerraforming"> - ã“ã®åœ°åŸŸ[REGION] ã¯ã€ãƒ†ãƒ©ãƒ•ォーミングãŒã§ãã¾ã›ã‚“。 + [REGION] ã§ã¯ã€åœ°å½¢ã®å¤‰æ›´ãŒã§ãã¾ã›ã‚“。 </notification> <notification name="CannotCopyWarning"> - ã‚ãªãŸã¯ã“ã®ã‚¢ã‚¤ãƒ†ãƒ ã®ã‚³ãƒ”ーを -許ã•れã¦ã„ãªã„ã®ã§ã€äººã«ã‚ã’る㨠-æŒã¡ç‰©ã‹ã‚‰å¤±ã‚れã¾ã™ã€‚ 本当㫠-ã“れをã‚ã’ãŸã„ã§ã™ã‹ï¼Ÿ + ã‚ãªãŸã«ã¯[ITEMS]ã¨ã„ã†ã‚¢ã‚¤ãƒ†ãƒ をコピーã™ã‚‹è¨±å¯ãŒã‚りã¾ã›ã‚“。他ã®ä½äººã«æä¾›ã™ã‚‹ã¨ã€ãã®ã‚¢ã‚¤ãƒ†ãƒ ã¯ã‚ãªãŸã®ã€ŒæŒã¡ç‰©ã€ã‹ã‚‰å‰Šé™¤ã•れã¾ã™ã€‚本当ã«ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’è²ã‚Šã¾ã™ã‹ï¼Ÿ <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> </notification> <notification name="CannotGiveItem"> @@ -483,34 +507,32 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚åŠ ã™ã‚‹ã“ã¨ãŒã§ãã¾ å–引ãŒã‚ャンセルã•れã¾ã—ãŸã€‚ </notification> <notification name="TooManyItems"> - 一度ã®ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªäº¤æ›ã§ã€42以上ã®ã‚¢ã‚¤ãƒ†ãƒ ã¯é€ã‚Œã¾ã›ã‚“。 + 一度㫠42 個以上ã®ã‚¢ã‚¤ãƒ†ãƒ ã¯æ¸¡ã›ã¾ã›ã‚“。 </notification> <notification name="NoItems"> - é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã‚’è²æ¸¡ã§ãる権é™ãŒã‚りã¾ã›ã‚“。 + é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã‚’æ¸¡ã™æ¨©é™ãŒã‚りã¾ã›ã‚“。 </notification> <notification name="CannotCopyCountItems"> - ã‚ãªãŸã¯é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã®[COUNT]ã®ã‚³ãƒ”ーを -許ã•れã¦ã„ã¾ã›ã‚“。 -ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã¯ã‚ãªãŸã®æŒã¡ç‰©ã‹ã‚‰å¤±ã‚れã¾ã™ã€‚ -本当ã«ã‚¢ã‚¤ãƒ†ãƒ ã‚’ã‚ã’ãŸã„ã§ã™ã‹ï¼Ÿ + ã‚ãªãŸã¯é¸æŠžã—㟠[COUNT] 個ã®ã‚¢ã‚¤ãƒ†ãƒ ã®ã®ã‚³ãƒ”ーを許ã•れã¦ã„ã¾ã›ã‚“。 +ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã¯ã‚ãªãŸã®ã€ŒæŒã¡ç‰©ã€ã‹ã‚‰å¤±ã‚れã¾ã™ã€‚ +本当ã«ã‚¢ã‚¤ãƒ†ãƒ を渡ã—ãŸã„ã§ã™ã‹ï¼Ÿ <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> </notification> <notification name="CannotGiveCategory"> - é¸æŠžã—ãŸãƒ•ã‚©ãƒ«ãƒ€ã‚’è²æ¸¡ã§ãる権é™ãŒã‚りã¾ã›ã‚“ + é¸æŠžã—ãŸãƒ•ã‚©ãƒ«ãƒ€ã‚’æ¸¡ã™æ¨©é™ãŒã‚りã¾ã›ã‚“ </notification> <notification name="FreezeAvatar"> ã“ã®ã‚¢ãƒã‚¿ãƒ¼ã‚’フリーズã—ã¾ã™ã‹ï¼Ÿ -ã‚¢ãƒã‚¿ãƒ¼ã¯ä¸€æ™‚çš„ã«å‹•ã‘ãªããªã‚Šã€ -ãƒãƒ£ãƒƒãƒˆãªã©ã€ã“ã®ä¸–界ã«å¯¾ã™ã‚‹é–¢ã‚りをæŒã¤ã“ã¨ãŒã§ããªããªã‚Šã¾ã™ã€‚ - <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="è§£å‡" yestext="フリーズ"/> +ã‚¢ãƒã‚¿ãƒ¼ã¯ä¸€æ™‚çš„ã«å‹•ã‘ãªããªã‚Šã€ãƒãƒ£ãƒƒãƒˆã‚’å«ã‚インワールドã§ä½•ã‚‚ã§ããªããªã‚Šã¾ã™ã€‚ + <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="解除" yestext="フリーズ"/> </notification> <notification name="FreezeAvatarFullname"> [AVATAR_NAME]をフリーズã—ã¾ã™ã‹ï¼Ÿ フリーズã•れãŸäººã¯ä¸€æ™‚çš„ã«å‹•ã‘ãªããªã‚Šã€ãƒãƒ£ãƒƒãƒˆãªã©ã€ã“ã®ä¸–界ã«å¯¾ã™ã‚‹é–¢ã‚りをæŒã¤ã“ã¨ãŒã§ããªããªã‚Šã¾ã™ã€‚ - <usetemplate canceltext="ã‚ャンセル" name="yesnocancelbuttons" notext="è§£å‡" yestext="フリーズ"/> + <usetemplate canceltext="ã‚ャンセル" name="yesnocancelbuttons" notext="解除" yestext="フリーズ"/> </notification> <notification name="EjectAvatarFullname"> - ã‚ãªãŸã®åœŸåœ°ã‹ã‚‰[AVATAR_NAME]を追放ã—ã¾ã™ã‹ï¼Ÿ + ã‚ãªãŸã®åœŸåœ°ã‹ã‚‰ [AVATAR_NAME] を追放ã—ã¾ã™ã‹ï¼Ÿ <usetemplate canceltext="ã‚ャンセル" name="yesnocancelbuttons" notext="追放ã¨ç¦æ¢" yestext="追放"/> </notification> <notification name="EjectAvatarNoBan"> @@ -529,9 +551,8 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚åŠ ã™ã‚‹ã“ã¨ãŒã§ãã¾ </notification> <notification name="AcquireErrorObjectSpan"> å–得エラー: -オブジェクトãŒè¤‡æ•°ã®åœ°åŸŸã«ã¾ãŸãŒã£ã¦å˜åœ¨ã—ã¦ã„ã¾ã™ã€‚ -å–å¾—ã™ã‚‹ã‚ªãƒ–ジェクトã¯ã€ -ã™ã¹ã¦åŒã˜åœ°åŸŸå†…ã«ç§»å‹•ã•ã›ã¦ãã ã•ã„。 +オブジェクトãŒè¤‡æ•°ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ã«ã¾ãŸãŒã£ã¦å˜åœ¨ã—ã¦ã„ã¾ã™ã€‚ +ã™ã¹ã¦åŒã˜ãƒªãƒ¼ã‚¸ãƒ§ãƒ³å†…ã«ç§»å‹•ã•ã›ã¦ã‹ã‚‰å–å¾—ã—ã¦ãã ã•ã„。 </notification> <notification name="PromptGoToCurrencyPage"> [EXTRA] @@ -543,32 +564,30 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚åŠ ã™ã‚‹ã“ã¨ãŒã§ãã¾ <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> </notification> <notification name="UnableToLinkObjects"> - ã“れらã®[COUNT]オブジェクトをリンクã§ãã¾ã›ã‚“。 -最大[MAX]オブジェクトをリンクã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + [COUNT] 個ã®ã‚ªãƒ–ジェクトをリンクã§ãã¾ã›ã‚“。 +リンクã§ãã‚‹ã®ã¯æœ€å¤§ [MAX] 個ã§ã™ã€‚ </notification> <notification name="CannotLinkIncompleteSet"> - セットã¨ã—ã¦æƒã£ã¦ã„るオブジェクトã®ã¿ãƒªãƒ³ã‚¯ã§ãã¾ã™ã€‚複数㮠-ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。 + ã‚»ãƒƒãƒˆã§æƒã£ã¦ã„るオブジェクトã®ã¿ãƒªãƒ³ã‚¯ã§ãã¾ã™ã€‚ +複数ã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。 </notification> <notification name="CannotLinkModify"> - ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトã«å¯¾ã™ã‚‹ä¿®æ£è¨±å¯ãŒã‚ãªãŸã«ãªã„ãŸã‚〠-リンクã§ãã¾ã›ã‚“。 + ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトã®ä¿®æ£è¨±å¯ãŒãªã„ãŸã‚リンクã§ãã¾ã›ã‚“。 -オブジェクトãŒã™ã¹ã¦ãƒãƒƒã‚¯ã•れã¦ãŠã‚‰ãšã€ã‚ãªãŸã®ã‚‚ã®ã§ã‚ã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。 +ã©ã®ã‚ªãƒ–ジェクトもãƒãƒƒã‚¯ã•れã¦ãŠã‚‰ãšã€ã‚ãªãŸã®ã‚‚ã®ã§ã‚ã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。 </notification> <notification name="CannotLinkDifferentOwners"> - 所有者ãŒç•°ãªã‚‹ãŸã‚ã€ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトを -リンクã§ãã¾ã›ã‚“。 + 所有者ãŒç•°ãªã‚‹ãŸã‚ã€ã‚ªãƒ–ジェクトをリンクã§ãã¾ã›ã‚“。 è‡ªåˆ†ãŒæ‰€æœ‰ã—ã¦ã„るオブジェクトã ã‘ã‚’é¸æŠžã—ã¦ãã ã•ã„。 </notification> <notification name="NoFileExtension"> - ファイル「[FILE]ã€ã®æ‹¡å¼µåãŒç„¡åйã§ã™ã€‚ + 「 [FILE] ã€ã®æ‹¡å¼µåãŒç„¡åйã§ã™ã€‚ ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®æ‹¡å¼µåãŒæ£ã—ã„ã‹ã©ã†ã‹ã‚’確èªã—ã¦ãã ã•ã„。 </notification> <notification name="InvalidFileExtension"> - ファイル拡張å[EXTENSION]ã¯ç„¡åйã§ã™ + [EXTENSION] ã¯ç„¡åйã§ã™ã€‚ æ£ã—ã„æ‹¡å¼µå:[VALIDS] <usetemplate name="okbutton" yestext="OK"/> </notification> @@ -577,11 +596,11 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚åŠ ã™ã‚‹ã“ã¨ãŒã§ãã¾ [FILE] </notification> <notification name="SoundFileNotRIFF"> - ファイルãŒRIFF WAVEファイルã¨ã—ã¦èªè˜ã•れã¾ã›ã‚“: + RIFF WAVE ファイルã¨ã—ã¦èªè˜ã•れã¾ã›ã‚“: [FILE] </notification> <notification name="SoundFileNotPCM"> - ファイルãŒPCM WAVEオーディオ・ファイルã¨ã—ã¦èªè˜ã•れã¾ã›ã‚“: + PCM WAVE オーディオファイルã¨ã—ã¦èªè˜ã•れã¾ã›ã‚“: [FILE] </notification> <notification name="SoundFileInvalidChannelCount"> @@ -589,98 +608,100 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚åŠ ã™ã‚‹ã“ã¨ãŒã§ãã¾ [FILE] </notification> <notification name="SoundFileInvalidSampleRate"> - ファイルã®ã‚µãƒ³ãƒ—ル・レートãŒã‚µãƒãƒ¼ãƒˆå¤–ã§ã™ï¼ˆ44.1kを指定ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ï¼‰ï¼š + ファイルã®ã‚µãƒ³ãƒ—ルレートãŒã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“(44.1k ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ï¼‰ï¼š [FILE] </notification> <notification name="SoundFileInvalidWordSize"> - ファイルã®ãƒ¯ãƒ¼ãƒ‰ãƒ»ã‚µã‚¤ã‚ºãŒã‚µãƒãƒ¼ãƒˆå¤–ã§ã™ï¼ˆ8ã¾ãŸã¯16ビットを指定ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ï¼‰ï¼š + ファイルã®ãƒ¯ãƒ¼ãƒ‰ã‚µã‚¤ã‚ºãŒã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“(8 ã¾ãŸã¯ 16 ビットã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ï¼‰ï¼š [FILE] </notification> <notification name="SoundFileInvalidHeader"> - WAVヘッダーã«ãƒ‡ãƒ¼ã‚¿ãƒ»ãƒãƒ£ãƒ³ã‚¯ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“: + WAV ヘッダーã«ãƒ‡ãƒ¼ã‚¿ãƒãƒ£ãƒ³ã‚¯ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“: [FILE] </notification> <notification name="SoundFileInvalidTooLong"> - オーディオ・ファイルãŒé•·ã™ãŽã¾ã™ã€‚(最大10秒): + オーディオファイルãŒé•·ã™ãŽã¾ã™ã€‚(最大 10 秒): [FILE] </notification> <notification name="ProblemWithFile"> - ファイル[FILE]ã«ã‚¨ãƒ©ãƒ¼ãŒã‚りã¾ã™ã€‚ + 「 [FILE] ã€ã«å•題ãŒã‚りã¾ã™ã€‚ [ERROR] </notification> <notification name="CannotOpenTemporarySoundFile"> - 書ãè¾¼ã¿ç”¨ã®ä¸€æ™‚圧縮サウンド・ファイルを開ãã“ã¨ãŒã§ãã¾ã›ã‚“:[FILE] + 書ãè¾¼ã¿ç”¨ã®ä¸€æ™‚圧縮サウンドファイルを開ãã“ã¨ãŒã§ãã¾ã›ã‚“:[FILE] </notification> <notification name="UnknownVorbisEncodeFailure"> - 未知ã®Vorbis æš—å·åŒ–ã«å¤±æ•—: [FILE] + 䏿˜Žã® Vorbis ã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‰ã«å¤±æ•—: [FILE] </notification> <notification name="CannotEncodeFile"> 次ã®ãƒ•ァイルã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‰ãŒã§ãã¾ã›ã‚“: [FILE] </notification> + <notification name="CorruptedProtectedDataStore"> + ä¿è·ã•れã¦ã„るデータをèªã¿ã¨ã‚‹ã“ã¨ãŒå‡ºæ¥ãªã„ãŸã‚リセットã•れã¾ã™ã€‚ + ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯è¨å®šã‚’変更ã™ã‚‹ã¨èµ·ã“ã‚‹ã“ã¨ãŒã‚りã¾ã™ã€‚ + <usetemplate name="okbutton" yestext="OK"/> + </notification> <notification name="CorruptResourceFile"> ç ´æã—ãŸãƒªã‚½ãƒ¼ã‚¹ãƒ•ァイル: [FILE] </notification> <notification name="UnknownResourceFileVersion"> - 未知ã®lindenリソースファイルã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ï¼š [FILE] + 䏿˜Žã®ãƒªãƒ³ãƒ‡ãƒ³ãƒªã‚½ãƒ¼ã‚¹ãƒ•ァイルã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ï¼š [FILE] </notification> <notification name="UnableToCreateOutputFile"> - æœè£…ファイルを作æˆã§ãã¾ã›ã‚“: [FILE] + 出力ファイルを作æˆã§ãã¾ã›ã‚“: [FILE] </notification> <notification name="DoNotSupportBulkAnimationUpload"> ç¾åœ¨ [APP_NAME] ã§ã¯ã€ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã®ä¸€æ‹¬ã‚¢ãƒƒãƒ—ãƒãƒ¼ãƒ‰ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“。 </notification> <notification name="CannotUploadReason"> - 次ã®ç†ç”±ã§ã€[FILE] をアップãƒãƒ¼ãƒ‰ã§ãã¾ã›ã‚“: [REASON] + 次ã®ç†ç”±ã§ã€ã€Œ [FILE] ã€ã‚’アップãƒãƒ¼ãƒ‰ã§ãã¾ã›ã‚“: [REASON] ã‚ã¨ã§ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 </notification> <notification name="LandmarkCreated"> 「 [LANDMARK_NAME] ã€ã‚’「 [FOLDER_NAME] ã€ãƒ•ォルダã«è¿½åŠ ã—ã¾ã—ãŸã€‚ </notification> <notification name="LandmarkAlreadyExists"> - ã“ã®ä½ç½®ã®ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã‚’æ—¢ã«æŒã£ã¦ã„ã¾ã™ã€‚ + ç¾åœ¨åœ°ã®ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã‚’æ—¢ã«æŒã£ã¦ã„ã¾ã™ã€‚ <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="CannotCreateLandmarkNotOwner"> - åœŸåœ°ã®æ‰€æœ‰è€…ãŒè¨±å¯ã—ã¦ã„ãªã„ãŸã‚〠-ランドマークを作æˆã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 + åœŸåœ°ã®æ‰€æœ‰è€…ãŒè¨±å¯ã—ã¦ã„ãªã„ãŸã‚ã€ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã‚’作æˆã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 </notification> <notification name="CannotRecompileSelectObjectsNoScripts"> - å†ç·¨é›†ã¯ä¸å¯èƒ½ã§ã™ã€‚ -スクリプト化ã•れãŸã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。 + 「リコンパイルã€ã§ãã¾ã›ã‚“。 +スクリプトã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。 </notification> <notification name="CannotRecompileSelectObjectsNoPermission"> - 「å†ç·¨é›†ã€ã¯ä¸å¯èƒ½ã§ã™ã€‚ + 「リコンパイルã€ã§ãã¾ã›ã‚“。 -å¤‰æ›´ä¿®æ£æ¨©é™ã®ã‚ã‚‹ -スクリプト化ã•れãŸã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。 +ä¿®æ£ä¿®æ£æ¨©é™ã®ã‚るスクリプトã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。 </notification> <notification name="CannotResetSelectObjectsNoScripts"> - 「å†è¨å®šã€ã‚’行ã†ã“ã¨ãŒã§ãã¾ã›ã‚“。 + 「å†è¨å®šã€ãŒã§ãã¾ã›ã‚“。 -スクリプト化ã•れãŸã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。 +スクリプトã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。 </notification> <notification name="CannotResetSelectObjectsNoPermission"> - 「å†è¨å®šã€ã‚’行ã†ã“ã¨ãŒã§ãã¾ã›ã‚“。 + 「å†è¨å®šã€ãŒã§ãã¾ã›ã‚“。 -å¤‰æ›´ä¿®æ£æ¨©é™ã®ã‚ã‚‹ -スクリプト化ã•れãŸã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。 +ä¿®æ£æ¨©é™ã®ã‚るスクリプトã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。 </notification> <notification name="CannotOpenScriptObjectNoMod"> - 編集権é™ã®ãªã„オブジェクトã®ã‚¹ã‚¯ãƒªãƒ—トを開ãã“ã¨ã¯ã§ãã¾ã›ã‚“。 + ä¿®æ£æ¨©é™ã®ãªã„オブジェクトã®ã‚¹ã‚¯ãƒªãƒ—トã¯é–‹ãã“ã¨ã¯ã§ãã¾ã›ã‚“。 </notification> <notification name="CannotSetRunningSelectObjectsNoScripts"> - スクリプトã®ã€Œå®Ÿè¡Œã€ã®è¨å®šãŒã§ãã¾ã›ã‚“。 + スクリプトã®ã€Œå®Ÿè¡Œã€ãŒã§ãã¾ã›ã‚“。 -スクリプト化ã•れãŸã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。 +スクリプトã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。 </notification> <notification name="CannotSetRunningNotSelectObjectsNoScripts"> - スクリプトを「実行ã—ãªã„ã€ã«è¨å®šã§ãã¾ã›ã‚“。 + スクリプトを「実行ã—ãªã„ã€è¨å®šã«ã§ãã¾ã›ã‚“。 -スクリプト化ã•れãŸã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。 +スクリプトã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。 </notification> <notification name="NoFrontmostFloater"> - ä¿å˜ã™ã¹ãfrontmostフãƒãƒ¼ã‚¿ãŒã‚りã¾ã›ã‚“。 + ä¿å˜ã™ã‚‹ frontmost フãƒãƒ¼ã‚¿ãŒã‚りã¾ã›ã‚“。 </notification> <notification name="SeachFilteredOnShortWords"> 指定ã—ãŸæ¤œç´¢ã‚¯ã‚¨ãƒªã¯å¤‰æ›´ã•れã€çŸã™ãŽã‚‹èªžå¥ã¯å–り除ã‹ã‚Œã¦ã„ã¾ã™ã€‚ @@ -703,35 +724,35 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚åŠ ã™ã‚‹ã“ã¨ãŒã§ãã¾ ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒä½•åº¦ã‚‚å‡ºã‚‹å ´åˆã¯ã€[SUPPORT_SITE] ã‚’ã”確èªãã ã•ã„。 </notification> <notification name="blocked_tport"> - 申ã—訳ã”ã–ã„ã¾ã›ã‚“。テレãƒãƒ¼ãƒˆã¯ç¾åœ¨ã€ãƒ–ãƒãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚ã‚‚ã†å°‘ã—後ã§ã‚„り直ã—ã¦ãã ã•ã„。 -やり直ã—ã¦ã‚‚テレãƒãƒ¼ãƒˆã§ããªã„å ´åˆã¯ã€ã„ã£ãŸã‚“ãƒã‚°ã‚¢ã‚¦ãƒˆã—ã€å†åº¦ãƒã‚°ã‚¤ãƒ³ã—ã¦å•題を解決ã—ã¦ãã ã•ã„。 + 申ã—訳ã”ã–ã„ã¾ã›ã‚“。テレãƒãƒ¼ãƒˆã¯ç¾åœ¨ã€ãƒ–ãƒãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚ã—ã°ã‚‰ãã—ã¦ã‹ã‚‰å†åº¦ãŠè©¦ã—ãã ã•ã„。 +ãれã§ã‚‚テレãƒãƒ¼ãƒˆã§ããªã„å ´åˆã¯ã€ãƒã‚°ã‚¢ã‚¦ãƒˆã—ã€ãƒã‚°ã‚¤ãƒ³ã—ç›´ã—ã¦å•題を解決ã—ã¦ãã ã•ã„。 </notification> <notification name="nolandmark_tport"> - 残念ãªãŒã‚‰ã€ã‚·ã‚¹ãƒ†ãƒ ã¯ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ç›®çš„地を探ã›ã¾ã›ã‚“ã§ã—ãŸã€‚ + 申ã—訳ã”ã–ã„ã¾ã›ã‚“。ランドマークã®ç›®çš„地ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ </notification> <notification name="timeout_tport"> - 申ã—訳ã”ã–ã„ã¾ã›ã‚“。システムã¯ãƒ†ãƒ¬ãƒãƒ¼ãƒˆæŽ¥ç¶šã‚’完了ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ -ã‚‚ã†å°‘ã—後ã§ã‚„り直ã—ã¦ãã ã•ã„。 + 申ã—訳ã”ã–ã„ã¾ã›ã‚“。システムã«ã‚ˆã‚‹ãƒ†ãƒ¬ãƒãƒ¼ãƒˆæŽ¥ç¶šãŒå®Œäº†ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ +ã—ã°ã‚‰ãã—ã¦ã‹ã‚‰å†åº¦ãŠè©¦ã—ãã ã•ã„。 </notification> <notification name="noaccess_tport"> - 残念ãªãŒã‚‰ã€ãã®ãƒ†ãƒ¬ãƒãƒ¼ãƒˆç›®çš„地ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒã‚りã¾ã›ã‚“。 + 残念ãªãŒã‚‰ã€ç›®çš„地ã¸ã‚¢ã‚¯ã‚»ã‚¹ãŒè¨±å¯ã•れã¦ã„ãªã„ãŸã‚ã€ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã§ãã¾ã›ã‚“。 </notification> <notification name="missing_attach_tport"> - 添付物ã¯ã€ã¾ã 到ç€ã—ã¦ã„ã¾ã›ã‚“。ã‚ã¨æ•°ç§’é–“ãŠå¾…ã¡ã„ãŸã ãã‹ã€ã„ã£ãŸã‚“ãƒã‚°ã‚¢ã‚¦ãƒˆã—ã€å†åº¦ãƒã‚°ã‚¤ãƒ³ã—ã¦ã‹ã‚‰ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã‚’やり直ã—ã¦ã ã•ã„。 + 添付物ãŒã¾ã 届ã„ã¦ã„ã¾ã›ã‚“。テレãƒãƒ¼ãƒˆã‚’ã™ã‚‹å‰ã«ã‚ã¨æ•°ç§’é–“ãŠå¾…ã¡ã„ãŸã ãã‹ã€ã„ã£ãŸã‚“ãƒã‚°ã‚¢ã‚¦ãƒˆã—ã€å†åº¦ãƒã‚°ã‚¤ãƒ³ã—ã¦ãã ã•ã„。 </notification> <notification name="too_many_uploads_tport"> - ã“ã®åœ°åŸŸã®è³‡ç”£ã‚ューãŒç¾åœ¨è¾¼ã¿åˆã£ã¦ã„ã‚‹ãŸã‚ã€ãƒ†ãƒ¬ãƒãƒ¼ãƒˆãƒ»ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’時間通りã«å‡¦ç†ã™ã‚‹ã“ã¨ãŒé›£ã—ã„状æ³ã§ã™ã€‚ -数分後ã«ã‚„り直ã™ã‹ã€ã¾ãŸã¯æ··é›‘ã—ã¦ã„ãªã„ä»–ã®åœ°åŸŸã‚’ãŠè©¦ã—ãã ã•ã„。 + ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã®ã‚¢ã‚»ãƒƒãƒˆã‚ューãŒç¾åœ¨æ··ã¿åˆã£ã¦ã„ã‚‹ãŸã‚ã€ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’ã™ãã«å‡¦ç†ã™ã‚‹ã“ã¨ãŒé›£ã—ã„状æ³ã§ã™ã€‚ +数分後ã«ã‚„り直ã™ã‹ã€æ··é›‘ã—ã¦ã„ãªã„ä»–ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã§ãŠè©¦ã—ãã ã•ã„。 </notification> <notification name="expired_tport"> - 申ã—訳ã”ã–ã„ã¾ã›ã‚“。システムã¯ãƒ†ãƒ¬ãƒãƒ¼ãƒˆãƒ»ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’時間ã©ãŠã‚Šã«å®Œäº†ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚数分後ã«ã‚„り直ã—ã¦ãã ã•ã„。 + 申ã—訳ã”ã–ã„ã¾ã›ã‚“。システムã¯ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’時間ã©ãŠã‚Šã«å®Œäº†ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚数分後ã«ã‚„り直ã—ã¦ãã ã•ã„。 </notification> <notification name="expired_region_handoff"> - 申ã—訳ã”ã–ã„ã¾ã›ã‚“。システムã¯åœ°åŸŸé–“ã®ç§»å‹•を時間ã©ãŠã‚Šã«å®Œäº†ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ + 申ã—訳ã”ã–ã„ã¾ã›ã‚“。システムã¯ãƒªãƒ¼ã‚¸ãƒ§ãƒ³é–“ã®ç§»å‹•を時間ã©ãŠã‚Šã«å®Œäº†ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ 数分後ã«ã‚„り直ã—ã¦ãã ã•ã„。 </notification> <notification name="no_host"> - テレãƒãƒ¼ãƒˆç›®çš„地を見ã¤ã‘られã¾ã›ã‚“。目的地ãŒä¸€æ™‚çš„ã«åˆ©ç”¨ã§ããªã„状態ã‹ã€ã¾ãŸã¯ã™ã§ã«æ¶ˆæ»…ã—ã¦ã„ã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚数分後ã«ã‚„り直ã—ã¦ãã ã•ã„。 + テレãƒãƒ¼ãƒˆç›®çš„地を見ã¤ã‘られã¾ã›ã‚“。目的地ãŒä¸€æ™‚çš„ã«åˆ©ç”¨ã§ããªã„状態ã‹ã€ã™ã§ã«æ¶ˆæ»…ã—ã¦ã„ã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚数分後ã«ã‚„り直ã—ã¦ãã ã•ã„。 </notification> <notification name="no_inventory_host"> æŒã¡ç‰©ã‚·ã‚¹ãƒ†ãƒ ã¯ç¾åœ¨åˆ©ç”¨ã§ãã¾ã›ã‚“。 @@ -741,9 +762,8 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚åŠ ã™ã‚‹ã“ã¨ãŒã§ã㾠区画ãŒé¸å®šã•れã¦ã„ã¾ã›ã‚“。 </notification> <notification name="CannotSetLandOwnerMultipleRegions"> - 複数ã®åœ°åŸŸãŒé¸æŠžã•れãŸãŸã‚〠-åœŸåœ°ã®æ‰€æœ‰æ¨©ã‚’å–å¾—ã§ãã¾ã›ã‚“。 -é¸æŠžã™ã‚‹é¢ç©ã‚’å°ã•ãã—ã¦ã€ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 + 複数ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ãŒé¸æŠžã•れãŸãŸã‚ã€åœŸåœ°ã®æ‰€æœ‰æ¨©ã‚’å–å¾—ã§ãã¾ã›ã‚“。 +é¸æŠžã™ã‚‹é¢ç©ã‚’å°ã•ãã—ã¦ã€ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 </notification> <notification name="ForceOwnerAuctionWarning"> ã“ã®åŒºç”»ã¯ã‚ªãƒ¼ã‚¯ã‚·ãƒ§ãƒ³ã«å‡ºã•れã¦ã„ã¾ã™ã€‚ 所有権を変更ã™ã‚‹ã¨ã‚ªãƒ¼ã‚¯ã‚·ãƒ§ãƒ³ã¯ã‚ャンセルã¨ãªã‚Šã€æ—¢ã«ã‚ªãƒ¼ã‚¯ã‚·ãƒ§ãƒ³ã«å‚åŠ ã—ã¦ã„ã‚‹ä½äººãŒã„れã°ãã®äººã«è¿·æƒ‘ã‚’ã‹ã‘ã¦ã—ã¾ã„ã¾ã™ã€‚ @@ -759,12 +779,12 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚åŠ ã™ã‚‹ã“ã¨ãŒã§ã㾠土地ãŒé¸æŠžã•れã¦ã„ã¾ã›ã‚“。 </notification> <notification name="CannotReleaseLandNothingSelected"> - åœŸåœ°ã‚’ç ´æ£„ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“: + åœŸåœ°ã‚’ç ´æ£„ã§ãã¾ã›ã‚“: 区画ãŒé¸å®šã•れã¦ã„ã¾ã›ã‚“。 </notification> <notification name="CannotReleaseLandNoRegion"> åœŸåœ°ã‚’ç ´æ£„ã§ãã¾ã›ã‚“: -地域ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 +リージョンãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 </notification> <notification name="CannotBuyLandNothingSelected"> 土地を購入ã§ãã¾ã›ã‚“: @@ -772,7 +792,7 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚åŠ ã™ã‚‹ã“ã¨ãŒã§ãã¾ </notification> <notification name="CannotBuyLandNoRegion"> 土地を購入ã§ãã¾ã›ã‚“: -ã“ã®åœŸåœ°ãŒã‚る地域を見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ +ã“ã®åœŸåœ°ãŒã‚るリージョンを見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ </notification> <notification name="CannotCloseFloaterBuyLand"> [APP_NAME] ãŒã“ã®å–å¼•ä¾¡æ ¼ã‚’è¦‹ç©ã‚‚ã‚‹ã¾ã§ã¯ã€åœŸåœ°ã®è³¼å…¥ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’é–‰ã˜ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 @@ -793,15 +813,7 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚åŠ ã™ã‚‹ã“ã¨ãŒã§ãã¾ åœŸåœ°ã‚’è²æ¸¡ã§ãã¾ã›ã‚“: 複数ã®åŒºç”»ãŒé¸æŠžã•れã¦ã„ã¾ã™ã€‚ -ã“れより1ã¤ã®åŒºç”»ã‚’é¸æŠžã—ã¦ãã ã•ã„。 - </notification> - <notification name="ParcelCanPlayMedia"> - ã“ã®å ´æ‰€ã§ã¯ã€ã‚¹ãƒˆãƒªãƒ¼ãƒŸãƒ³ã‚°ãƒ¡ãƒ‡ã‚£ã‚¢ã®å†ç”ŸãŒå¯èƒ½ã§ã™ã€‚ -ストリーミングメディアã«ã¯ã€é«˜é€Ÿã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒƒãƒˆæŽ¥ç¶šã‚’è¦ã—ã¾ã™ã€‚ - -利用å¯èƒ½ãªã¨ãã«ã‚¹ãƒˆãƒªãƒ¼ãƒŸãƒ³ã‚°ãƒ¡ãƒ‡ã‚£ã‚¢ã‚’å†ç”Ÿã—ã¾ã™ã‹ï¼Ÿ -(ã“ã®ã‚ªãƒ—ションã¯ã€ã€Œç’°å¢ƒè¨å®šã€ > 「プライãƒã‚·ãƒ¼ã€ã§ã‚ã¨ã‹ã‚‰ã§ã‚‚変更ã§ãã¾ã™ã€‚) - <usetemplate name="okcancelbuttons" notext="無効化" yestext="メディアをå†ç”Ÿ"/> +区画を 1 ã¤é¸æŠžã—ã¦ãã ã•ã„。 </notification> <notification name="CannotDeedLandWaitingForServer"> åœŸåœ°ã‚’è²æ¸¡ã§ãã¾ã›ã‚“: @@ -811,7 +823,7 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚åŠ ã™ã‚‹ã“ã¨ãŒã§ãã¾ </notification> <notification name="CannotDeedLandNoTransfer"> åœŸåœ°ã‚’è²æ¸¡ã§ãã¾ã›ã‚“: -ã“ã®åœ°åŸŸ [REGION] ã§ã¯åœŸåœ°ã®è²æ¸¡ãŒè¨±ã•れã¦ã„ã¾ã›ã‚“。 +[REGION] ã§ã¯åœŸåœ°ã®è²æ¸¡ãŒè¨±ã•れã¦ã„ã¾ã›ã‚“。 </notification> <notification name="CannotReleaseLandWatingForServer"> åœŸåœ°ã‚’ç ´æ£„ã§ãã¾ã›ã‚“: @@ -821,9 +833,9 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚åŠ ã™ã‚‹ã“ã¨ãŒã§ãã¾ </notification> <notification name="CannotReleaseLandSelected"> åœŸåœ°ã‚’ç ´æ£„ã§ãã¾ã›ã‚“: -ã‚ãªãŸã¯ã€é¸æŠžã—ãŸã™ã¹ã¦ã®åŒºç”»ã‚’所有ã—ã¦ã„ã¾ã›ã‚“。 +ã‚ãªãŸã¯ã€é¸æŠžã—ãŸåŒºç”»ã®ã™ã¹ã¦ã‚’所有ã—ã¦ã„ã¾ã›ã‚“。 -1ã¤ã®åŒºç”»ã‚’é¸æŠžã—ã¦ãã ã•ã„。 +区画を 1 ã¤é¸æŠžã—ã¦ãã ã•ã„。 </notification> <notification name="CannotReleaseLandDontOwn"> åœŸåœ°ã‚’ç ´æ£„ã§ãã¾ã›ã‚“: @@ -836,7 +848,7 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚åŠ ã™ã‚‹ã“ã¨ãŒã§ãã¾ </notification> <notification name="CannotReleaseLandNoTransfer"> åœŸåœ°ã‚’ç ´æ£„ã§ãã¾ã›ã‚“: -ã“ã® [REGION] ã§ã¯åœŸåœ°ã®è²æ¸¡ãŒè¨±ã•れã¦ã„ã¾ã›ã‚“。 +[REGION] ã§ã¯åœŸåœ°ã®è²æ¸¡ãŒè¨±ã•れã¦ã„ã¾ã›ã‚“。 </notification> <notification name="CannotReleaseLandPartialSelection"> åœŸåœ°ã‚’ç ´æ£„ã§ãã¾ã›ã‚“: @@ -845,9 +857,9 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚åŠ ã™ã‚‹ã“ã¨ãŒã§ãã¾ åŒºç”»å…¨ä½“ã‚’é¸æŠžã™ã‚‹ã‹ã€ã¾ãŸã¯ã€ã¾ãšæœ€åˆã«åŒºç”»ã‚’分割ã—ã¦ãã ã•ã„。 </notification> <notification name="ReleaseLandWarning"> - ã‚ãªãŸã¯ã€[AREA]平方メートルã®åœŸåœ°ã‚’ç ´æ£„ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ + ã‚ãªãŸã¯ã€[AREA] 平方メートルã®åœŸåœ°ã‚’ç ´æ£„ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ ã“ã®åŒºç”»ã‚’ç ´æ£„ã™ã‚‹ã¨ã‚ãªãŸã®åœŸåœ°ã§ã¯ãªããªã‚Šã¾ã™ãŒã€ -L$ã¯è¿”金ã•れã¾ã›ã‚“。 +L$ ã¯è¿”金ã•れã¾ã›ã‚“。 åœŸåœ°ã‚’ç ´æ£„ã—ã¾ã™ã‹ï¼Ÿ <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> @@ -864,7 +876,7 @@ L$ã¯è¿”金ã•れã¾ã›ã‚“。 区画ã®ä¸€éƒ¨ã‚’é¸æŠžã—ã¦ãã ã•ã„。 </notification> <notification name="LandDivideWarning"> - ã“ã®åœŸåœ°ã‚’分割ã™ã‚‹ã¨ã€2ã¤ã®åŒºç”»ã«åˆ¥ã‚Œã¾ã™ã€‚ + ã“ã®åœŸåœ°ã‚’分割ã™ã‚‹ã¨ã€2 ã¤ã®åŒºç”»ã«åˆ¥ã‚Œã¾ã™ã€‚ 区画ã”ã¨ã®è¨å®šãŒå¯èƒ½ã«ãªã‚Šã¾ã™ã€‚ ã“ã®æ“作を行ã†ã¨ã€ä¸€éƒ¨ã®è¨å®šãŒãƒ‡ãƒ•ォルトã«ãƒªã‚»ãƒƒãƒˆã•れã¾ã™ã€‚ 土地ã®åˆ†å‰²æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ @@ -884,19 +896,18 @@ L$ã¯è¿”金ã•れã¾ã›ã‚“。 </notification> <notification name="CannotJoinLandEntireParcelSelected"> 土地を統åˆã§ãã¾ã›ã‚“: -1ã¤ã®åŒºç”»ã—ã‹é¸æŠžã•れã¦ã„ã¾ã›ã‚“。 +区画㌠1 ã¤ã—ã‹é¸æŠžã•れã¦ã„ã¾ã›ã‚“。 両方ã®åŒºç”»ã‚’ã¾ãŸã„ã§åœŸåœ°ã‚’é¸æŠžã—ã¦ãã ã•ã„。 </notification> <notification name="CannotJoinLandSelection"> 土地を統åˆã§ãã¾ã›ã‚“: -1ã¤ä»¥ä¸Šã®åŒºç”»ã‚’é¸æŠžã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ +区画を 1 ã¤ä»¥ä¸Šé¸æŠžã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ 両方ã®åŒºç”»ã‚’ã¾ãŸã„ã§åœŸåœ°ã‚’é¸æŠžã—ã¦ãã ã•ã„。 </notification> <notification name="JoinLandWarning"> - ã“ã®åœŸåœ°ã‚’çµ±åˆã™ã‚‹ã¨ã€é¸æŠžã•れãŸé•·æ–¹å½¢ã«äº¤å·®ã™ã‚‹ -å…¨ã¦ã®åŒºç”»ã‚’基ã«ã—ã¦1ã¤ã®å¤§ããªåŒºç”»ãŒä½œæˆã•れã¾ã™ã€‚ + ã“ã®åœŸåœ°ã‚’çµ±åˆã™ã‚‹ã¨ã€é¸æŠžã•れãŸé•·æ–¹å½¢ã«äº¤å·®ã™ã‚‹å…¨ã¦ã®åŒºç”»ã‚’基ã«ã—ã¦ã€å¤§ããªåŒºç”»ãŒ 1 ã¤ä½œæˆã•れã¾ã™ã€‚ æ–°ã—ã„区画ã®åå‰ã¨ã‚ªãƒ—ションをå†è¨å®šã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ 土地を統åˆã—ã¾ã™ã‹ï¼Ÿ @@ -911,7 +922,7 @@ L$ã¯è¿”金ã•れã¾ã›ã‚“。 <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="コピー"/> </notification> <notification name="ResolutionSwitchFail"> - è§£åƒåº¦ã‚’ [RESX]x[RESY]ã«åˆ‡ã‚Šæ›¿ãˆã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ + è§£åƒåº¦ã‚’ [RESX]x[RESY] ã«åˆ‡ã‚Šæ›¿ãˆã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ </notification> <notification name="ErrorUndefinedGrasses"> ã‚¨ãƒ©ãƒ¼ï¼šæœªå®šç¾©ã®æ¤ç‰©ï¼š[SPECIES] @@ -920,44 +931,72 @@ L$ã¯è¿”金ã•れã¾ã›ã‚“。 ã‚¨ãƒ©ãƒ¼ï¼šæœªå®šç¾©ã®æ¨¹æœ¨ï¼š[SPECIES] </notification> <notification name="CannotSaveWearableOutOfSpace"> - 「[NAME]ã€ã‚’æœã®ãƒ•ァイルã«ä¿å˜ã§ãã¾ã›ã‚“。 コンピューター㮠-ディスクスペースを少ã—増やã—ã¦ã‹ã‚‰ã€ã‚‚ã†ä¸€åº¦ -ä¿å˜ã—ã¦ã¿ã¦ãã ã•ã„。 + 「 [NAME] ã€ã‚’衣類ã®ãƒ•ァイルã«ä¿å˜ã§ãã¾ã›ã‚“。 +コンピューターã®ãƒ‡ã‚£ã‚¹ã‚¯ã‚¹ãƒšãƒ¼ã‚¹ã‚’å°‘ã—増やã—ã¦ã‹ã‚‰ã€ã‚‚ã†ä¸€åº¦ä¿å˜ã—ã¦ã¿ã¦ãã ã•ã„。 </notification> <notification name="CannotSaveToAssetStore"> - [NAME] ã‚’ä¿å˜ã§ãã¾ã›ã‚“。 + 「 [NAME] ã€ã‚’ä¿å˜ã§ãã¾ã›ã‚“。 通常ã“れã¯ä¸€æ™‚çš„ãªã‚¨ãƒ©ãƒ¼ã§ã™ã€‚ 数分後ã«ã‚‚ã†ä¸€åº¦ç€ç”¨ç‰©ã‚’カスタマイズ・ä¿å˜ã—ã¦ãã ã•ã„。 </notification> <notification name="YouHaveBeenLoggedOut"> - [SECOND_LIFE] ã‹ã‚‰ãƒã‚°ã‚¢ã‚¦ãƒˆã—ã¾ã—ãŸï¼š + ã—ã¾ã£ãŸã€ [SECOND_LIFE] ã‹ã‚‰ãƒã‚°ã‚¢ã‚¦ãƒˆã•れã¦ã—ã¾ã„ã¾ã—ãŸã€‚ [MESSAGE] -「IMã¨ãƒãƒ£ãƒƒãƒˆã‚’見るã€ã‚’クリックã™ã‚‹ã¨ã€å¼•ãç¶šãæ—¢ã«é–‹ã„ã¦ã„ã‚‹ IM ã¨ãƒãƒ£ãƒƒãƒˆã‚’見るã“ã¨ãŒã§ãã¾ã™ã€‚ 「終了ã€ã‚’クリックã™ã‚‹ã¨ [APP_NAME] ã‚’ã™ãã«çµ‚了ã—ã¾ã™ã€‚ <usetemplate name="okcancelbuttons" notext="終了" yestext="IMã¨ãƒãƒ£ãƒƒãƒˆã‚’表示"/> </notification> <notification name="OnlyOfficerCanBuyLand"> グループ用ã®åœŸåœ°ã®è³¼å…¥ãŒã§ãã¾ã›ã‚“: ã‚ãªãŸã«ã¯ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªã‚°ãƒ«ãƒ¼ãƒ—ã®ãŸã‚ã«åœŸåœ°ã‚’購入ã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“。 </notification> - <notification label="ãƒ•ãƒ¬ãƒ³ãƒ‰ã‚’è¿½åŠ " name="AddFriend"> - フレンドã¨ã—ã¦è¿½åŠ ã™ã‚‹ã¨ã€ãŠäº’ã„ã®ç¾åœ¨åœ°ã®åœ°å›³ã¸ã®è¡¨ç¤ºè¨±å¯ã€ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹è¡¨ç¤ºã®è¨å®šã‚’ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + <notification label="フレンド登録" name="AddFriend"> + フレンド登録ã™ã‚‹ã¨ã€ãŠäº’ã„ã®ç¾åœ¨åœ°ã®åœ°å›³ã¸ã®è¡¨ç¤ºè¨±å¯ã€ã‚ªãƒ³ãƒ©ã‚¤ãƒ³çŠ¶æ…‹ã®è¡¨ç¤ºè¨å®šãŒã§ãã¾ã™ã€‚ [NAME] ã«ãƒ•レンドシップをé€ã‚Šã¾ã™ã‹ï¼Ÿ <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> </notification> - <notification label="ãƒ•ãƒ¬ãƒ³ãƒ‰ã‚’è¿½åŠ " name="AddFriendWithMessage"> - フレンドã¨ã—ã¦è¿½åŠ ã™ã‚‹ã¨ã€ãŠäº’ã„ã®ç¾åœ¨åœ°ã®åœ°å›³ã¸ã®è¡¨ç¤ºè¨±å¯ã€ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹è¡¨ç¤ºã®è¨å®šã‚’ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + <notification label="フレンド登録" name="AddFriendWithMessage"> + フレンド登録ã™ã‚‹ã¨ã€ãŠäº’ã„ã®ç¾åœ¨åœ°ã®åœ°å›³ã¸ã®è¡¨ç¤ºè¨±å¯ã€ã‚ªãƒ³ãƒ©ã‚¤ãƒ³çŠ¶æ…‹ã®è¡¨ç¤ºè¨å®šãŒã§ãã¾ã™ã€‚ -[NAME] ã«ãƒ•レンドシップã®ã‚ªãƒ•ァーをã—ã¾ã™ã‹ï¼Ÿ +[NAME] ã«ãƒ•レンドシップを申ã—出ã¾ã™ã‹ï¼Ÿ + <form name="form"> + <input name="message"> + フレンド登録ã—ã¦ãれã¾ã™ã‹ï¼Ÿ + </input> + <button name="Offer" text="OK"/> + <button name="Cancel" text="ã‚ャンセル"/> + </form> + </notification> + <notification label="アウトフィットをä¿å˜ã™ã‚‹" name="SaveOutfitAs"> + ç€ç”¨ä¸ã®ã‚¢ã‚¦ãƒˆãƒ•ィットを新ã—ã„アウトフットã¨ã—ã¦ä¿å˜ï¼š <form name="form"> <input name="message"> - フレンドã¨ã—ã¦ç™»éŒ²ã—ã¦ãれã¾ã™ã‹ï¼Ÿ + [DESC] (新) </input> <button name="Offer" text="OK"/> <button name="Cancel" text="ã‚ャンセル"/> </form> </notification> + <notification label="ç€ç”¨ç‰©ã‚’ä¿å˜" name="SaveWearableAs"> + アイテムを別åã§æŒã¡ç‰©ã«ä¿å˜ï¼š + <form name="form"> + <input name="message"> + [DESC](新è¦ï¼‰ + </input> + <button name="Offer" text="OK"/> + <button name="Cancel" text="å–り消ã—"/> + </form> + </notification> + <notification label="アウトフィットã®åå‰ã‚’変更ã™ã‚‹" name="RenameOutfit"> + æ–°ã—ã„アウトフィットã®åå‰ï¼š + <form name="form"> + <input name="new_name"> + [NAME] + </input> + <button name="Offer" text="OK"/> + <button name="Cancel" text="å–り消ã—"/> + </form> + </notification> <notification name="RemoveFromFriends"> - [FIRST_NAME] [LAST_NAME]をフレンドリストã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ + [FIRST_NAME] [LAST_NAME] をフレンドリストã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> </notification> <notification name="RemoveMultipleFromFriends"> @@ -966,135 +1005,140 @@ L$ã¯è¿”金ã•れã¾ã›ã‚“。 </notification> <notification name="GodDeleteAllScriptedPublicObjectsByUser"> **[AVATAR_NAME]** -所有ã®ã™ã¹ã¦ã®ã‚¹ã‚¯ãƒªãƒ—ト・オブジェクトをã“ã®ã‚·ãƒ 内ã®ä»–ã®ã™ã¹ã¦ã®åœŸåœ°ã‹ã‚‰å‰Šé™¤ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ +所有ã®ã™ã¹ã¦ã®ã‚¹ã‚¯ãƒªãƒ—トオブジェクトをã“ã®ã‚·ãƒ 内ã®ä»–ã®ã™ã¹ã¦ã®åœŸåœ°ã‹ã‚‰å‰Šé™¤ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> </notification> <notification name="GodDeleteAllScriptedObjectsByUser"> **[AVATAR_NAME]** -所有ã®ã™ã¹ã¦ã®ã‚¹ã‚¯ãƒªãƒ—ト・オブジェクトをã“ã®ã‚·ãƒ 内ã®ã™ã¹ã¦ã®åœŸåœ°ã‹ã‚‰å‰Šé™¤ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ +所有ã®ã™ã¹ã¦ã®ã‚¹ã‚¯ãƒªãƒ—トオブジェクトをã“ã®ã‚·ãƒ 内ã®ã™ã¹ã¦ã®åœŸåœ°ã‹ã‚‰å‰Šé™¤ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> </notification> <notification name="GodDeleteAllObjectsByUser"> **[AVATAR_NAME]** -所有ã®ã™ã¹ã¦ã®ã‚ªãƒ–ジェクト(スクリプト・オブジェクトã¨éžã‚¹ã‚¯ãƒªãƒ—ト・オブジェクト)を +所有ã®ã™ã¹ã¦ã®ã‚ªãƒ–ジェクト(スクリプトオブジェクトã¨éžã‚¹ã‚¯ãƒªãƒ—トオブジェクト)を ã“ã®ã‚·ãƒ 内ã®ã™ã¹ã¦ã®åœŸåœ°ã‹ã‚‰å‰Šé™¤ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> </notification> <notification name="BlankClassifiedName"> - クラシファイドã«åå‰ã‚’指定ã—ã¦ãã ã•ã„。 + クラシファイドã®åå‰ã‚’指定ã—ã¦ãã ã•ã„。 </notification> <notification name="MinClassifiedPrice"> - åºƒå‘Šæ–™ã®æ”¯æ‰•ã„金é¡ã¯ã€Lã¨[MIN_PRICE]ãŒä¸‹é™ã§ã™ã€‚ + åºƒå‘Šæ–™ã¯æœ€ä½Ž L$ [MIN_PRICE] å¿…è¦ã§ã™ã€‚ 金é¡ã‚’増やã—ã¦ãã ã•ã„。 </notification> + <notification name="ConfirmItemDeleteHasLinks"> + ã“ã“ã«ãƒªãƒ³ã‚¯ã•れãŸã‚¢ã‚¤ãƒ†ãƒ ãŒå°‘ãªãã¨ã‚‚1ã¤ã‚りã¾ã™ã€‚ ã“ã®ã‚¢ã‚¤ãƒ†ãƒ を削除ã™ã‚‹ã¨ã“ã“ã«ãƒªãƒ³ã‚¯ã•れãŸã‚‚ã®ãŒæ©Ÿèƒ½ã—ãªããªã‚Šã¾ã™ã€‚ リンクを先ã«å‰Šé™¤ã™ã‚‹ã“ã¨ã‚’å¼·ããŠå‹§ã‚ã—ã¾ã™ã€‚ + +ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ を削除ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> + </notification> <notification name="ConfirmObjectDeleteLock"> - é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã®1ã¤ä»¥ä¸ŠãŒãƒãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚ + é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã®ã†ã¡ã€å°‘ãªãã¨ã‚‚ 1 ã¤ãŒãƒãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚ -本当ã«ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å‰Šé™¤ã‚’ç¶šã‘ã¾ã™ã‹ï¼Ÿ +本当ã«å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> </notification> <notification name="ConfirmObjectDeleteNoCopy"> - é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã®1ã¤ä»¥ä¸ŠãŒã‚³ãƒ”ーã§ãã¾ã›ã‚“。 + é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã®ã†ã¡ã€å°‘ãªãã¨ã‚‚ 1 ã¤ãŒã‚³ãƒ”ーã§ãã¾ã›ã‚“。 -本当ã«ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å‰Šé™¤ã‚’ç¶šã‘ã¾ã™ã‹ï¼Ÿ +本当ã«å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> </notification> <notification name="ConfirmObjectDeleteNoOwn"> - é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã®1ã¤ä»¥ä¸Šã‚’ã€ã‚ãªãŸã¯æ‰€æœ‰ã—ã¦ã„ã¾ã›ã‚“。 + é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã®ã†ã¡ã€å°‘ãªãã¨ã‚‚ 1 ã¤ãŒã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ã¯ã‚りã¾ã›ã‚“。 -本当ã«ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å‰Šé™¤ã‚’ç¶šã‘ã¾ã™ã‹ï¼Ÿ +本当ã«å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> </notification> <notification name="ConfirmObjectDeleteLockNoCopy"> - 一ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトãŒãƒãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚ -一ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトãŒã‚³ãƒ”ーã§ãã¾ã›ã‚“。 + å°‘ãªãã¨ã‚‚ 1 ã¤ã®ã‚ªãƒ–ジェクトãŒãƒãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚ +å°‘ãªãã¨ã‚‚ 1 ã¤ã®ã‚ªãƒ–ジェクトãŒã‚³ãƒ”ーã§ãã¾ã›ã‚“。 -本当ã«ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å‰Šé™¤ã‚’ç¶šã‘ã¾ã™ã‹ï¼Ÿ +本当ã«å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> </notification> <notification name="ConfirmObjectDeleteLockNoOwn"> - 一ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトãŒãƒãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚ -1ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトをã€ã‚ãªãŸã¯æ‰€æœ‰ã—ã¦ã„ã¾ã›ã‚“。 + å°‘ãªãã¨ã‚‚ 1 ã¤ã®ã‚ªãƒ–ジェクトãŒãƒãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚ +å°‘ãªãã¨ã‚‚ 1 ã¤ã®ã‚ªãƒ–ジェクトãŒã€ã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ã¯ã‚りã¾ã›ã‚“。 -本当ã«ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å‰Šé™¤ã‚’ç¶šã‘ã¾ã™ã‹ï¼Ÿ +本当ã«å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> </notification> <notification name="ConfirmObjectDeleteNoCopyNoOwn"> - 一ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトãŒã‚³ãƒ”ーã§ãã¾ã›ã‚“。 -1ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトをã€ã‚ãªãŸã¯æ‰€æœ‰ã—ã¦ã„ã¾ã›ã‚“。 + å°‘ãªãã¨ã‚‚ 1 ã¤ã®ã‚ªãƒ–ジェクトãŒã‚³ãƒ”ーã§ãã¾ã›ã‚“。 +å°‘ãªãã¨ã‚‚ 1 ã¤ã®ã‚ªãƒ–ジェクトãŒã€ã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ã¯ã‚りã¾ã›ã‚“。 -本当ã«ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å‰Šé™¤ã‚’ç¶šã‘ã¾ã™ã‹ï¼Ÿ +本当ã«å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> </notification> <notification name="ConfirmObjectDeleteLockNoCopyNoOwn"> - 一ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトãŒãƒãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚ -一ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトãŒã‚³ãƒ”ーã§ãã¾ã›ã‚“。 -1ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトをã€ã‚ãªãŸã¯æ‰€æœ‰ã—ã¦ã„ã¾ã›ã‚“。 + å°‘ãªãã¨ã‚‚ 1 ã¤ã®ã‚ªãƒ–ジェクトãŒãƒãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚ +å°‘ãªãã¨ã‚‚ 1 ã¤ã®ã‚ªãƒ–ジェクトãŒã‚³ãƒ”ーã§ãã¾ã›ã‚“。 +å°‘ãªãã¨ã‚‚ 1 ã¤ã®ã‚ªãƒ–ジェクトãŒã€ã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ã¯ã‚りã¾ã›ã‚“。 -本当ã«ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å‰Šé™¤ã‚’ç¶šã‘ã¾ã™ã‹ï¼Ÿ +本当ã«å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> </notification> <notification name="ConfirmObjectTakeLock"> - 一ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトãŒãƒãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚ + å°‘ãªãã¨ã‚‚ 1 ã¤ã®ã‚ªãƒ–ジェクトãŒãƒãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚ -ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å–å¾—ã‚’ç¶šã‘ã¾ã™ã‹ï¼Ÿ +本当ã«ã“ã®ã¾ã¾å–å¾—ã‚’ç¶šã‘ã¾ã™ã‹ï¼Ÿ <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> </notification> <notification name="ConfirmObjectTakeNoOwn"> - å–å¾—ã—よã†ã¨ã—ã¦ã„るオブジェクトã«ã¯ã€ã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ãªã„オブジェクトãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚ -ã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ã¯ãªã„オブジェクトをå–å¾—ã™ã‚‹ã¨ã€æ¬¡ã®ã‚ªãƒ¼ãƒŠãƒ¼ã®æ¨©é™ãŒãã®ã‚ªãƒ–ジェクトã«é©ç”¨ã•れã¾ã™ã€‚ -ãã®ãŸã‚ã€å°†æ¥ã€å¤‰æ›´ã‚„コピーã®èƒ½åŠ›ãŒåˆ¶é™ã•れるå¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ + å–å¾—ã—よã†ã¨ã—ã¦ã„るオブジェクトã«ã¯ã€ã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ã¯ãªã„オブジェクトãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚ +ã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ã¯ãªã„オブジェクトをå–å¾—ã™ã‚‹ã¨ã€æ¬¡ã®æ‰€æœ‰è€…ã®æ¨©é™ãŒãã®ã‚ªãƒ–ジェクトã«é©ç”¨ã•れã¾ã™ã€‚ +ãã®ãŸã‚ã€å°†æ¥ã€ä¿®æ£ã‚„コピーã®èƒ½åŠ›ãŒåˆ¶é™ã•れるå¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ -ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å–å¾—ã‚’ç¶šã‘ã¾ã™ã‹ï¼Ÿ +本当ã«ã“ã®ã¾ã¾å–å¾—ã‚’ç¶šã‘ã¾ã™ã‹ï¼Ÿ <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> </notification> <notification name="ConfirmObjectTakeLockNoOwn"> - 1ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトãŒãƒãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚ -å–å¾—ã—よã†ã¨ã—ã¦ã„るオブジェクトã«ã¯ã€ã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ãªã„オブジェクトãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚ -ã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ã¯ãªã„オブジェクトをå–å¾—ã™ã‚‹ã¨ã€æ¬¡ã®ã‚ªãƒ¼ãƒŠãƒ¼ã®æ¨©é™ãŒãã®ã‚ªãƒ–ジェクトã«é©ç”¨ã•れã¾ã™ã€‚ -ãã®ãŸã‚ã€å°†æ¥ã€å¤‰æ›´ã‚„コピーã®èƒ½åŠ›ãŒåˆ¶é™ã•れるå¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ + å°‘ãªãã¨ã‚‚ 1 ã¤ã®ã‚ªãƒ–ジェクトãŒãƒãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚ +å–å¾—ã—よã†ã¨ã—ã¦ã„るオブジェクトã«ã¯ã€ã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ã¯ãªã„オブジェクトãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚ +ã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ã¯ãªã„オブジェクトをå–å¾—ã™ã‚‹ã¨ã€æ¬¡ã®æ‰€æœ‰è€…ã®æ¨©é™ãŒãã®ã‚ªãƒ–ジェクトã«é©ç”¨ã•れã¾ã™ã€‚ +ãã®ãŸã‚ã€å°†æ¥ã€ç·¨é›†ã‚„コピーã®èƒ½åŠ›ãŒåˆ¶é™ã•れるå¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ ã“ã®é¸æŠžå†…容ã®ã¾ã¾ã§ç¶šè¡Œã™ã‚‹ã“ã¨ã¯å¯èƒ½ã§ã™ãŒã€ -ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å–å¾—ã‚’ç¶šã‘ã¾ã™ã‹ï¼Ÿ +本当ã«ã“ã®ã¾ã¾å–å¾—ã‚’ç¶šã‘ã¾ã™ã‹ï¼Ÿ <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> </notification> <notification name="CantBuyLandAcrossMultipleRegions"> - 複数ã®åœ°åŸŸãŒé¸æŠžã•れãŸãŸã‚ã€åœŸåœ°ã‚’購入ã§ãã¾ã›ã‚“。 + 複数ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ãŒé¸æŠžã•れãŸãŸã‚ã€åœŸåœ°ã‚’購入ã§ãã¾ã›ã‚“。 é¸æŠžã™ã‚‹é¢ç©ã‚’å°ã•ãã—ã¦ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 </notification> <notification name="DeedLandToGroup"> ã“ã®åŒºç”»ã®è²æ¸¡ã«éš›ã—ã¦ã¯ã€ -ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ãŒå分ãªåœŸåœ°ã‚¯ãƒ¬ã‚¸ãƒƒãƒˆã‚’ä¿æœ‰ãŠã‚ˆã³ç¶æŒã—ã¦ã„ã‚‹ã“ã¨ãŒå¿…è¦ã§ã™ã€‚ -土地ã®è³¼å…¥ä¾¡æ ¼ã¯ã€ã‚ªãƒ¼ãƒŠãƒ¼ã«è¿”金ã•れã¾ã›ã‚“ã€‚è²æ¸¡ã•れãŸåŒºç”»ãŒå£²ã‚Œã‚‹ã¨ã€è²©å£²ä¾¡æ ¼ã¯ã‚°ãƒ«ãƒ¼ãƒ—・メンãƒãƒ¼ã«å‡ç‰ã«åˆ†é…ã•れã¾ã™ã€‚ +ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ãŒå分ãªåœŸåœ°ã‚¯ãƒ¬ã‚¸ãƒƒãƒˆã‚’ä¿æœ‰ãŠã‚ˆã³ç¶æŒã—ã¦ã„ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ +土地ã®è³¼å…¥ä¾¡æ ¼ã¯ã€æ‰€æœ‰è€…ã«è¿”金ã•れã¾ã›ã‚“ã€‚è²æ¸¡ã•れãŸåŒºç”»ãŒå£²ã‚Œã‚‹ã¨ã€å£²ä¸Šé‡‘é¡ã¯ã‚°ãƒ«ãƒ¼ãƒ—メンãƒãƒ¼ã«å‡ç‰ã«åˆ†é…ã•れã¾ã™ã€‚ -ã“ã®[AREA]平方メートルã®åœŸåœ°ã‚’ã€ã‚°ãƒ«ãƒ¼ãƒ— -「[GROUP_NAME]ã€ã«è²æ¸¡ã—ã¾ã™ã‹ï¼Ÿ +ã“ã® [AREA] 平方メートルã®åœŸåœ°ã‚’ã€ã‚°ãƒ«ãƒ¼ãƒ— +「 [GROUP_NAME] ã€ã«è²æ¸¡ã—ã¾ã™ã‹ï¼Ÿ <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> </notification> <notification name="DeedLandToGroupWithContribution"> - ã“ã®åŒºç”»ã®è²æ¸¡ã«éš›ã—ã¦ã¯ã€ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—㌠-å分ãªåœŸåœ°ã‚¯ãƒ¬ã‚¸ãƒƒãƒˆã‚’ä¿æœ‰ãŠã‚ˆã³ç¶æŒã—ã¦ã„ã‚‹ã“ã¨ãŒå¿…è¦ã§ã™ã€‚ + ã“ã®åŒºç”»ã®è²æ¸¡ã«éš›ã—ã¦ã¯ã€ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ãŒå分ãªåœŸåœ°ã‚¯ãƒ¬ã‚¸ãƒƒãƒˆã‚’ä¿æœ‰ãŠã‚ˆã³ç¶æŒã—ã¦ã„ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ ã“ã®è²æ¸¡ã«ã‚ˆã‚Šã€ -「[FIRST_NAME] [LAST_NAME]ã€ã‹ã‚‰ +「 [FIRST_NAME] [LAST_NAME] ã€ã‹ã‚‰ グループã«å¯¾ã—ã¦åœŸåœ°ãŒåŒæ™‚ã«æä¾›ã•れã¾ã™ã€‚ -土地ã®è³¼å…¥ä¾¡æ ¼ã¯ã€ã‚ªãƒ¼ãƒŠãƒ¼ã«è¿”金ã•れã¾ã›ã‚“。 -è²æ¸¡ã•れãŸåŒºç”»ãŒå£²ã‚Œã‚‹ã¨ã€è²©å£²æ–™é‡‘ã¯ã‚°ãƒ«ãƒ¼ãƒ—・メンãƒãƒ¼ã«å‡ç‰ã«åˆ†é…ã•れã¾ã™ã€‚ +土地ã®è³¼å…¥ä¾¡æ ¼ã¯ã€æ‰€æœ‰è€…ã«ã¯è¿”金ã•れã¾ã›ã‚“。 +è²æ¸¡ã•れãŸåŒºç”»ãŒå£²ã‚Œã‚‹ã¨ã€å£²ä¸Šé‡‘é¡ã¯ã‚°ãƒ«ãƒ¼ãƒ—メンãƒãƒ¼ã«å‡ç‰ã«åˆ†é…ã•れã¾ã™ã€‚ -ã“ã®[AREA]平方メートルã®åœŸåœ°ã‚’ã€ã‚°ãƒ«ãƒ¼ãƒ—「[GROUP_NAME]ã€ã«è²æ¸¡ã—ã¾ã™ã‹ï¼Ÿ +ã“ã® [AREA] 平方メートルã®åœŸåœ°ã‚’ã€ã€Œ [GROUP_NAME] ã€ã«è²æ¸¡ã—ã¾ã™ã‹ï¼Ÿ <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> </notification> <notification name="DisplaySetToSafe"> - -safeオプションを指定ã—ãŸã®ã§ã€ -表示è¨å®šã¯ã‚»ãƒ¼ãƒ•・レベルã«è¨å®šã•れã¦ã„ã¾ã™ã€‚ + -safe オプションを指定ã—ãŸã®ã§ã€ +表示è¨å®šã¯ã‚»ãƒ¼ãƒ•レベルã«è¨å®šã•れã¦ã„ã¾ã™ã€‚ </notification> <notification name="DisplaySetToRecommended"> - 表示è¨å®šã¯ã€ã‚ãªãŸã®ã‚·ã‚¹ãƒ†ãƒ æ§‹æˆã« -基ã¥ã„ã¦æŽ¨å¥¨ã•れãŸãƒ¬ãƒ™ãƒ«ã«è¨å®šã•れã¦ã„ã¾ã™ã€‚ + 表示è¨å®šã¯ã€ã‚ãªãŸã®ã‚·ã‚¹ãƒ†ãƒ æ§‹æˆã«åŸºã¥ã„ã¦æŽ¨å¥¨ã•れãŸãƒ¬ãƒ™ãƒ«ã«è¨å®šã•れã¦ã„ã¾ã™ã€‚ </notification> <notification name="ErrorMessage"> [ERROR_MESSAGE] + <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="AvatarMovedDesired"> 目的地ã¯ç¾åœ¨ã”利用ã„ãŸã ã‘ã¾ã›ã‚“。 @@ -1107,13 +1151,13 @@ L$ã¯è¿”金ã•れã¾ã›ã‚“。 <notification name="AvatarMovedHome"> ホームãƒã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã¯ç¾åœ¨ã”利用ã„ãŸã ã‘ã¾ã›ã‚“。 è¿‘ãã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«ç§»å‹•ã—ã¾ã—ãŸã€‚ -æ–°ãŸã«ãƒ›ãƒ¼ãƒ ã‚’è¨å®šã—ãªãŠã—ãŸã»ã†ãŒã„ã„ã‹ã‚‚ã—れã¾ã›ã‚“。 +æ–°ãŸã«ãƒ›ãƒ¼ãƒ ã‚’è¨å®šã—ç›´ã™å¿…è¦ãŒã‚ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。 </notification> <notification name="ClothingLoading"> ç¾åœ¨è¡£é¡žã‚’ダウンãƒãƒ¼ãƒ‰ä¸ã§ã™ã€‚ ã“ã®ã¾ã¾ [SECOND_LIFE] を通常通りã”使用ã„ãŸã ã‘ã¾ã™ã€‚他人ã‹ã‚‰ã¯ã‚ãªãŸã¯æ£ã—ã表示ã•れã¾ã™ã€‚ <form name="form"> - <ignore name="ignore" text="衣類ãŒãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ã•れるã¾ã§æ™‚é–“ãŒã‹ã‹ã£ã¦ã„ã¾ã™"/> + <ignore name="ignore" text="衣類ãŒãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ã•れるã¾ã§æ™‚é–“ãŒã‹ã‹ã£ã¦ã„ã‚‹ã¨ã"/> </form> </notification> <notification name="FirstRun"> @@ -1140,12 +1184,48 @@ L$ã¯è¿”金ã•れã¾ã›ã‚“。 ã¾ã‚‚ãªãã‚ãªãŸã®ã‚¢ãƒã‚¿ãƒ¼ãŒè¡¨ç¤ºã•れã¾ã™ã€‚ 矢å°ã‚ーを使用ã—ã¦æ©ãã¾ã™ã€‚ -ヘルプãŒå¿…è¦ãªã¨ãã‚„[SECOND_LIFE]ã«ã¤ã„ã¦çŸ¥ã‚ŠãŸã„ã¨ãã¯ã€ -F1ã‚ーを押ã—ã¦ãã ã•ã„。 +ヘルプãŒå¿…è¦ãªã¨ãã‚„ [SECOND_LIFE] ã«ã¤ã„ã¦çŸ¥ã‚ŠãŸã„ã¨ãã¯ã€ +F1 ã‚ーを押ã—ã¦ãã ã•ã„。 男性ã‚ã‚‹ã„ã¯å¥³æ€§ã®ã‚¢ãƒã‚¿ãƒ¼ã‚’é¸æŠžã—ã¦ãã ã•ã„。 ã‚ãªãŸã®æ±ºå®šã¯å¾Œã§å¤‰æ›´ã§ãã¾ã™ã€‚ <usetemplate name="okcancelbuttons" notext="女性" yestext="男性"/> </notification> + <notification name="CantTeleportToGrid"> + ç¾åœ¨ã®ã‚°ãƒªãƒƒãƒ‰ï¼ˆ[CURRENT_GRID])ã¨ã¯ã‚°ãƒªãƒƒãƒ‰ï¼ˆ[GRID])ãŒç•°ãªã‚‹ãŸã‚ã€[SLURL] ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ ビューワを閉ã˜ã¦ã‹ã‚‰ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="GeneralCertificateError"> + サーãƒãƒ¼ã«æŽ¥ç¶šã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ +[REASON] + +サブジェクトå: [SUBJECT_NAME_STRING] +発行元: [ISSUER_NAME_STRING] +有効日: [VALID_FROM] +æ¬¡ã®æ›´æ–°æ—¥ï¼š [VALID_TO] +MD5 フィンガープリント: [SHA1_DIGEST] +SHA1 フィンガープリント: [MD5_DIGEST] +ã‚ー使用法: [KEYUSAGE] +æ‹¡å¼µã‚ー使用法: [EXTENDEDKEYUSAGE] +サブジェクトã‚ーèªè˜åˆ¥å: [SUBJECTKEYIDENTIFIER] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="TrustCertificateError"> + ã“ã®ã‚µãƒ¼ãƒãƒ¼ã®èªè¨¼æ©Ÿé–¢ã¯ä¸æ˜Žã§ã™ã€‚ + +èªè¨¼æƒ…å ±ï¼š +サブジェクトå: [SUBJECT_NAME_STRING] +発行元: [ISSUER_NAME_STRING] +有効日: [VALID_FROM] +æ¬¡ã®æ›´æ–°æ—¥ï¼š [VALID_TO] +MD5 フィンガープリント: [SHA1_DIGEST] +SHA1 フィンガープリント: [MD5_DIGEST] +ã‚ー使用法: [KEYUSAGE] +æ‹¡å¼µã‚ー使用法: [EXTENDEDKEYUSAGE] +サブジェクトã‚ーèªè˜åˆ¥å: [SUBJECTKEYIDENTIFIER] + +ã“ã®èªè¨¼å±€ã‚’ä¿¡é ¼ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="信用ã™ã‚‹"/> + </notification> <notification name="NotEnoughCurrency"> [NAME] L$[PRICE] 残高ä¸è¶³ã®ãŸã‚実行ä¸å¯ã§ã™ã€‚ </notification> @@ -1153,29 +1233,28 @@ F1ã‚ーを押ã—ã¦ãã ã•ã„。 [NAME] ã¯ã€ã‚ãªãŸã«ã‚ªãƒ–ジェクトã®ç·¨é›†æ¨©é™ã‚’与ãˆã¾ã—ãŸã€‚ </notification> <notification name="RevokedModifyRights"> - [NAME] ã®ã‚ªãƒ–ジェクトを編集ã™ã‚‹æ¨©é™ã¯å–り消ã•れã¾ã—㟠+ [NAME] ã®ã‚ªãƒ–ジェクトを編集ã™ã‚‹æ¨©é™ã¯å–り消ã•れã¾ã—ãŸã€‚ </notification> <notification name="FlushMapVisibilityCaches"> - ã“ã®æ‰‹é †ã¯ã€ã“ã®åœ°åŸŸã®åœ°å›³ã®ã‚ャッシュを消去ã—ã¾ã™ã€‚ -ã“れãŒä¾¿åˆ©ãªã®ã¯ãƒ‡ãƒãƒƒã‚°æ™‚ã®ã¿ã§ã™ã€‚ -(作æˆä¸ã¯5分間経ã¤ã¨ã€å…¨å“¡ã®åœ°å›³ãŒå†åº¦ãƒã‚°ã‚¤ãƒ³å¾Œã« -æ›´æ–°ã•れã¾ã™ï¼‰ + ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã®åœ°å›³ã®ã‚ャッシュを消去ã—ã¾ã™ã€‚ +デãƒãƒƒã‚°ç›®çš„ã®ã¿ã«ä¾¿åˆ©ãªæ“作ã§ã™ã€‚ +(作æˆä¸ã¯ 5 分間経ã¤ã¨ã€å…¨å“¡ã®åœ°å›³ãŒå†åº¦ãƒã‚°ã‚¤ãƒ³å¾Œã«æ›´æ–°ã•れã¾ã™ï¼‰ <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> </notification> <notification name="BuyOneObjectOnly"> - 一度ã«ä¸€ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトをã¨è²·ã†ã“ã¨ã¯ã§ãã¾ã›ã‚“。 オブジェクトを一ã¤ã ã‘é¸ã‚“ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 + 一度㫠1 ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトを買ã†ã“ã¨ã¯ã§ãã¾ã›ã‚“。 オブジェクトを 1 ã¤ã ã‘é¸ã‚“ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 </notification> <notification name="OnlyCopyContentsOfSingleItem"> - 一度ã«è¤‡æ•°ã®ã‚¢ã‚¤ãƒ†ãƒ ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯ã‚³ãƒ”ーã§ãã¾ã›ã‚“。 -é¸æŠžã™ã‚‹ã‚ªãƒ–ジェクトを1ã¤ã ã‘ã«ã—ã¦ã€ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 + 一度ã«è¤‡æ•°ã®ã‚¢ã‚¤ãƒ†ãƒ ã®ä¸èº«ã‚’コピーã§ãã¾ã›ã‚“。 +オブジェクトを 1 ã¤ã ã‘é¸æŠžã—ã¦ã€ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> </notification> <notification name="KickUsersFromRegion"> - ã“ã®åœ°åŸŸã®å…¨ã¦ã®ä½äººã‚’ホームã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™ã‹ï¼Ÿ + ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«ã„ã‚‹å…¨ã¦ã®ä½äººã‚’ホームã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™ã‹ï¼Ÿ <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> </notification> <notification name="EstateObjectReturn"> - [USER_NAME]ãŒæ‰€æœ‰ã—ã¦ã„るオブジェクトを返å´ã—ã¾ã™ã‹ï¼Ÿ + [USER_NAME] ãŒæ‰€æœ‰ã—ã¦ã„るオブジェクトを返å´ã—ã¾ã™ã‹ï¼Ÿ <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> </notification> <notification name="InvalidTerrainBitDepth"> @@ -1186,17 +1265,16 @@ F1ã‚ーを押ã—ã¦ãã ã•ã„。 </notification> <notification name="InvalidTerrainSize"> 地域テクスãƒãƒ£ã‚’è¨å®šã§ãã¾ã›ã‚“ã§ã—ãŸï¼š -地形テクスãƒãƒ£[TEXTURE_NUM]ã¯ã€[TEXTURE_SIZE_X]x[TEXTURE_SIZE_Y]ã§ã¯å¤§ãã™ãŽã¾ã™ã€‚ +地形テクスãƒãƒ£ã€Œ [TEXTURE_NUM] ã€ã¯ã€[TEXTURE_SIZE_X]x[TEXTURE_SIZE_Y] ã§ã¯å¤§ãã™ãŽã¾ã™ã€‚ -テクスãƒãƒ£[TEXTURE_NUM]ã‚’24ビット512x512ã‹ãれ以下ã®ã‚¤ãƒ¡ãƒ¼ã‚¸ã¨äº¤æ›ã—ã€ã€Œé©ç”¨ã€ã‚’å†åº¦ã‚¯ãƒªãƒƒã‚¯ã—ã¦ãã ã•ã„。 +「 [TEXTURE_NUM] ã€ã‚’ 24 ビット 512x512 ã‹ãれ以下ã®ã‚¤ãƒ¡ãƒ¼ã‚¸ã¨äº¤æ›ã—ã€ã€Œé©ç”¨ã€ã‚’å†åº¦ã‚¯ãƒªãƒƒã‚¯ã—ã¦ãã ã•ã„。 </notification> <notification name="RawUploadStarted"> - アップãƒãƒ¼ãƒ‰é–‹å§‹ã€‚ 接続速度ã«ã‚ˆã£ã¦ã¯ã€ -最大2分間ã‹ã‹ã‚Šã¾ã™ã€‚ + アップãƒãƒ¼ãƒ‰ã‚’é–‹å§‹ã—ã¾ã—ãŸã€‚ 接続速度ã«ã‚ˆã£ã¦ã¯ã€æœ€å¤§ 2 分間ã‹ã‹ã‚Šã¾ã™ã€‚ </notification> <notification name="ConfirmBakeTerrain"> ç¾åœ¨ã®åœ°å½¢ã‚’構築ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ -ã“ã®æ“作を行ã†ã¨ã€ç¾åœ¨ã®åœ°å½¢ãŒä¸Šæ˜‡ï¼ä¸‹é™ã®åˆ¶é™ç¯„囲ã®ä¸å¿ƒã«ãªã‚Šã€ã€Œå¾©å¸°ã€ãƒ„ールã®ãƒ‡ãƒ•ォルトã«ãªã‚Šã¾ã™ã€‚ +ã“ã®æ“作を行ã†ã¨ã€ç¾åœ¨ã®åœ°å½¢ãŒä¸Šæ˜‡ãƒ»ä¸‹é™ã®åˆ¶é™ç¯„囲ã®ä¸å¿ƒã¨ãªã‚Šã€ã€Œå¾©å…ƒã€ãƒ„ールã®ãƒ‡ãƒ•ォルトã«ãªã‚Šã¾ã™ã€‚ æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> </notification> @@ -1204,35 +1282,34 @@ F1ã‚ーを押ã—ã¦ãã ã•ã„。 許å¯ä½äººã¯ [MAX_AGENTS] 人ã¾ã§ã§ã™ã€‚ </notification> <notification name="MaxBannedAgentsOnRegion"> - ç¦æ¢ä½äººã¯[MAX_BANNED]人ã¾ã§ã§ã™ã€‚ + ç¦æ¢ä½äººã¯ [MAX_BANNED] 人ã¾ã§ã§ã™ã€‚ </notification> <notification name="MaxAgentOnRegionBatch"> [NUM_ADDED] 個ã®ã‚¨ãƒ¼ã‚¸ã‚§ãƒ³ãƒˆã‚’è¿½åŠ ã—よã†ã¨ã—ã¦å¤±æ•—ã—ã¾ã—ãŸï¼š [MAX_AGENTS] [LIST_TYPE] 制é™ã‚’ [NUM_EXCESS] 個超éŽã—ã¦ã„ã¾ã™ã€‚ </notification> <notification name="MaxAllowedGroupsOnRegion"> - 許å¯ã‚°ãƒ«ãƒ¼ãƒ—ã¯[MAX_GROUPS]グループã¾ã§ã§ã™ã€‚ + 許å¯ã‚°ãƒ«ãƒ¼ãƒ—㯠[MAX_GROUPS] グループã¾ã§ã§ã™ã€‚ <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="構築ã™ã‚‹"/> </notification> <notification name="MaxManagersOnRegion"> - ä¸å‹•産マãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã¯[MAX_MANAGER]人ã¾ã§ã§ã™ã€‚ + ä¸å‹•産マãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã¯ [MAX_MANAGER] 人ã¾ã§ã§ã™ã€‚ </notification> <notification name="OwnerCanNotBeDenied"> - ä¸å‹•産オーナーをä¸å‹•ç”£ã€Œç¦æ¢ä½äººã€ãƒªã‚¹ãƒˆã«è¿½åŠ ã§ãã¾ã›ã‚“。 + ä¸å‹•産オーナーをä¸å‹•産ã®ã€Œç¦æ¢ä½äººã€ãƒªã‚¹ãƒˆã«è¿½åŠ ã§ãã¾ã›ã‚“。 </notification> <notification name="CanNotChangeAppearanceUntilLoaded"> - æœãŠã‚ˆã³å½¢ãŒãƒãƒ¼ãƒ‰ã•れるã¾ã§ã€å®¹å§¿ã®å¤‰æ›´ã¯ã§ãã¾ã›ã‚“。 + 衣類ãŠã‚ˆã³ã‚·ã‚§ã‚¤ãƒ—ãŒèªã¿è¾¼ã¾ã‚Œã‚‹ã¾ã§ã¯ã€å®¹å§¿ã®å¤‰æ›´ã¯ã§ãã¾ã›ã‚“。 </notification> <notification name="ClassifiedMustBeAlphanumeric"> - クラシファイド広告ã®åå‰ã¯ã€ã‚¢ãƒ«ãƒ•ァベット㋠-æ•°å—ã§å§‹ã‚ã¾ã™ã€‚ å¥èªç‚¹ã§ã¯å§‹ã‚られã¾ã›ã‚“。 + クラシファイド広告ã®åå‰ã¯ã€ã‚¢ãƒ«ãƒ•ã‚¡ãƒ™ãƒƒãƒˆã‹æ•°å—ã§å§‹ã‚ã¾ã™ã€‚å¥èªç‚¹ã§ã¯å§‹ã‚られã¾ã›ã‚“。 </notification> <notification name="CantSetBuyObject"> - オブジェクトãŒè²©å£²å¯¾è±¡ã§ã¯ãªã„ãŸã‚ã€ã‚ªãƒ–ジェクトã®è³¼å…¥ãŒè¨å®šã§ãã¾ã›ã‚“。 -販売対象ã®ã‚ªãƒ–ジェクトをè¨å®šã—ã€ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 + オブジェクトãŒè²©å£²å¯¾è±¡ã§ã¯ãªã„ãŸã‚ã€ã‚ªãƒ–ジェクトã®è³¼å…¥ãŒã§ãã¾ã›ã‚“。 +販売対象ã®ã‚ªãƒ–ジェクトを指定ã—ã¦ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 </notification> <notification name="FinishedRawDownload"> - æœªåŠ å·¥ã®åœ°å½¢ãƒ•ァイルを次ã¸ã¨ãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ã—ã¾ã—ãŸï¼š -[DOWNLOAD_PATH]。 + æœªåŠ å·¥ã®åœ°å½¢ãƒ•ァイルをダウンãƒãƒ¼ãƒ‰ã—ã¾ã—ãŸï¼š +[DOWNLOAD_PATH] </notification> <notification name="DownloadWindowsMandatory"> [APP_NAME] ã®æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒã”利用å¯èƒ½ã§ã™ã€‚ @@ -1296,59 +1373,57 @@ F1ã‚ーを押ã—ã¦ãã ã•ã„。 </notification> <notification name="DeedObjectToGroup"> ã“ã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’è²æ¸¡ã™ã‚‹ã¨ã‚°ãƒ«ãƒ¼ãƒ—ã¯ä»¥ä¸‹ã®ã“ã¨ãŒå¯èƒ½ã§ã™ï¼š -* ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã«æ”¯æ‰•ã‚れãŸL$ã‚’å—é ˜ã—ã¾ã™ã€‚ - <usetemplate ignoretext="オブジェクトをグループã«è²æ¸¡ã™ã‚‹å‰ã«ç¢ºèªã™ã‚‹" name="okcancelignore" notext="å–り消ã—" yestext="è²æ¸¡"/> +* ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã«æ”¯æ‰•ã‚れ㟠L$ ã‚’å—é ˜ã—ã¾ã™ã€‚ + <usetemplate ignoretext="オブジェクトをグループã«è²æ¸¡ã™ã‚‹å‰ã®ç¢ºèª" name="okcancelignore" notext="å–り消ã—" yestext="è²æ¸¡"/> </notification> <notification name="WebLaunchExternalTarget"> Web ブラウザを開ã„ã¦ã“ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„を表示ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate ignoretext="ブラウザを起動ã—㦠Web ページを見る" name="okcancelignore" notext="ã‚ャンセル" yestext="OK"/> + <usetemplate ignoretext="ブラウザを起動ã—㦠Web ページを見るã¨ã" name="okcancelignore" notext="ã‚ャンセル" yestext="OK"/> </notification> <notification name="WebLaunchJoinNow"> [http://jp.secondlife.com/account/ マイアカウント] ページã«ç§»å‹•ã—ã¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’管ç†ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate ignoretext="ブラウザを起動ã—ã¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’管ç†ã™ã‚‹" name="okcancelignore" notext="å–り消ã—" yestext="OK"/> + <usetemplate ignoretext="ブラウザを起動ã—ã¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’管ç†ã™ã‚‹ã¨ã" name="okcancelignore" notext="å–り消ã—" yestext="OK"/> </notification> <notification name="WebLaunchSecurityIssues"> - [SECOND_LIFE] Wikiã§ã€ -ã‚»ã‚ュリティå•é¡Œã‚’å ±å‘Šã™ã‚‹æ–¹æ³•ã‚’ã”覧ãã ã•ã„。 - <usetemplate ignoretext="ブラウザを起動ã—ã¦ã‚»ã‚ュリティå•題ã®å ±å‘Šã®ä»•方を確èªã™ã‚‹" name="okcancelignore" notext="ã‚ャンセル" yestext="OK"/> + [SECOND_LIFE] Wiki ã§ã€ã‚»ã‚ュリティå•é¡Œã‚’å ±å‘Šã™ã‚‹æ–¹æ³•ã‚’ã”覧ãã ã•ã„。 + <usetemplate ignoretext="ブラウザを起動ã—ã¦ã‚»ã‚ュリティå•題ã®å ±å‘Šã®ä»•方を確èªã™ã‚‹ã¨ã" name="okcancelignore" notext="ã‚ャンセル" yestext="OK"/> </notification> <notification name="WebLaunchQAWiki"> - [SECOND_LIFE] å“質ä¿è¨¼é–¢é€£Wikiã‚’ã”覧ãã ã•ã„。 - <usetemplate ignoretext="ブラウザを起動ã—㦠QA Wiki を見る" name="okcancelignore" notext="ã‚ャンセル" yestext="OK"/> + [SECOND_LIFE] å“質ä¿è¨¼é–¢é€£ Wiki ã‚’ã”覧ãã ã•ã„。 + <usetemplate ignoretext="ブラウザを起動ã—㦠QA Wiki を見るã¨ã" name="okcancelignore" notext="ã‚ャンセル" yestext="OK"/> </notification> <notification name="WebLaunchPublicIssue"> - [SECOND_LIFE]ã®ãƒ‘ブリックå•題トラッカーã§ã€ + [SECOND_LIFE] ã®ãƒ‘ブリックå•題トラッカーã§ã€ ãƒã‚°ã‚„ãã®ä»–ã®å•é¡Œã‚’å ±å‘Šã§ãã¾ã™ã€‚ - <usetemplate ignoretext="ブラウザを確èªã—ã¦ãƒ‘ブリックå•題トラッカーを使用ã™ã‚‹" name="okcancelignore" notext="ã‚ャンセル" yestext="ページã¸è¡Œã"/> + <usetemplate ignoretext="ブラウザを起動ã—ã¦ãƒ‘ブリックå•題トラッカーを使用ã™ã‚‹ã¨ã" name="okcancelignore" notext="ã‚ャンセル" yestext="ページã¸è¡Œã"/> </notification> <notification name="WebLaunchSupportWiki"> - Lindenå…¬å¼ãƒ–ãƒã‚°ã§ã€æœ€æ–°ã®ãƒ‹ãƒ¥ãƒ¼ã‚¹ã‚„æƒ…å ±ã‚’å…¥æ‰‹ã—ã¦ãã ã•ã„。 - <usetemplate ignoretext="ブラウザを起動ã—ã¦å…¬å¼ãƒ–ãƒã‚°ã‚’見る" name="okcancelignore" notext="å–り消ã—" yestext="OK"/> + Linden å…¬å¼ãƒ–ãƒã‚°ã§ã€æœ€æ–°ã®ãƒ‹ãƒ¥ãƒ¼ã‚¹ã‚„æƒ…å ±ã‚’å…¥æ‰‹ã—ã¦ãã ã•ã„。 + <usetemplate ignoretext="ブラウザを起動ã—ã¦å…¬å¼ãƒ–ãƒã‚°ã‚’見るã¨ã" name="okcancelignore" notext="å–り消ã—" yestext="OK"/> </notification> <notification name="WebLaunchLSLGuide"> スクリプトガイドを開ãã¾ã™ã‹ï¼Ÿ - <usetemplate ignoretext="ブラウザを起動ã—ã¦ã‚¹ã‚¯ãƒªãƒ—トガイドを見る" name="okcancelignore" notext="å–り消ã—" yestext="OK"/> + <usetemplate ignoretext="ブラウザを起動ã—ã¦ã‚¹ã‚¯ãƒªãƒ—トガイドを見るã¨ã" name="okcancelignore" notext="å–り消ã—" yestext="OK"/> </notification> <notification name="WebLaunchLSLWiki"> LSL ãƒãƒ¼ã‚¿ãƒ«ã§ã‚¹ã‚¯ãƒªãƒ—トã«é–¢ã™ã‚‹æƒ…å ±ã‚’ç¢ºèªã—ã¾ã™ã‹ï¼Ÿ - <usetemplate ignoretext="ブラウザを起動ã—㦠LSL ãƒãƒ¼ã‚¿ãƒ«ã‚’見る" name="okcancelignore" notext="å–り消ã—" yestext="ページã«ç§»å‹•"/> + <usetemplate ignoretext="ブラウザを起動ã—㦠LSL ãƒãƒ¼ã‚¿ãƒ«ã‚’見るã¨ã" name="okcancelignore" notext="å–り消ã—" yestext="ページã«ç§»å‹•"/> </notification> <notification name="ReturnToOwner"> é¸æŠžã—ãŸã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’ã€æ‰€æœ‰è€…ã«è¿”å´ã—ã¾ã™ã‹ï¼Ÿ -è²æ¸¡å¯èƒ½ãªã‚ªãƒ–ジェクト㯠-以å‰ã®æ‰€æœ‰è€…ã«è¿”å´ã•れã¾ã™ã€‚ +「å†è²©ãƒ»ãƒ—レゼントå¯ã€ã®è²æ¸¡ã•れãŸã‚ªãƒ–ジェクトã¯ã€ä»¥å‰ã®æ‰€æœ‰è€…ã«è¿”å´ã•れã¾ã™ã€‚ -*è¦å‘Š* 移転ãŒä¸å¯èƒ½ã®è²æ¸¡ã•れãŸã‚ªãƒ–ジェクトã¯å‰Šé™¤ã•れã¾ã™ï¼ - <usetemplate ignoretext="オブジェクトを所有者ã«è¿”å´ã™ã‚‹å‰ã«ç¢ºèªã™ã‚‹" name="okcancelignore" notext="å–り消ã—" yestext="OK"/> +*è¦å‘Š* 「å†è²©ãƒ»ãƒ—レゼントä¸å¯ã€ã®è²æ¸¡ã•れãŸã‚ªãƒ–ジェクトã¯ã€å‰Šé™¤ã•れã¾ã™ï¼ + <usetemplate ignoretext="オブジェクトを所有者ã«è¿”å´ã™ã‚‹å‰ã®ç¢ºèª" name="okcancelignore" notext="å–り消ã—" yestext="OK"/> </notification> <notification name="GroupLeaveConfirmMember"> - ç¾åœ¨ã‚ãªãŸã¯ [GROUP]ã®ãƒ¡ãƒ³ãƒãƒ¼ã§ã™ã€‚ -ã“ã“ã‹ã‚‰æŠœã‘ã¾ã™ã‹ï¼Ÿ + ç¾åœ¨ã‚ãªãŸã¯ [GROUP] ã®ãƒ¡ãƒ³ãƒãƒ¼ã§ã™ã€‚ +ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—を抜ã‘ã¾ã™ã‹ï¼Ÿ <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> </notification> <notification name="ConfirmKick"> - ã™ã¹ã¦ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’グリッド外ã«ã‚ックã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="å…¨ã¦ã®ãƒ¦ãƒ¼ã‚¶ã‚’追ã„出ã™"/> + 本当ã«ä½äººå…¨å“¡ã‚’グリッドã‹ã‚‰è¿½ã„出ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="ä½äººå…¨å“¡ã‚’追ã„出ã™"/> </notification> <notification name="MuteLinden"> リンデンをブãƒãƒƒã‚¯ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 @@ -1362,27 +1437,26 @@ F1ã‚ーを押ã—ã¦ãã ã•ã„。 <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="RemoveItemWarn"> - コンテンツを削除ã™ã‚‹ã¨ã€è¨±å¯ãŒã‚ã£ã¦ã‚‚ã€ã‚ªãƒ–ジェクトã«ãƒ€ãƒ¡ãƒ¼ã‚¸ã‚’与ãˆã‚‹ã“ã¨ãŒã‚りã¾ã™ã€‚ -ãã®ã‚¢ã‚¤ãƒ†ãƒ ã®å‰Šé™¤ã‚’ç¶šã‘ã¾ã™ã‹ï¼Ÿ + コンテンツを削除ã™ã‚‹ã¨ã€è¨±å¯ãŒã‚ã£ã¦ã‚‚ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã«æå‚·ã‚’ä¸Žãˆã‚‹ã“ã¨ãŒã‚りã¾ã™ã€‚ +削除を続ã‘ã¾ã™ã‹ï¼Ÿ <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> </notification> <notification name="CantOfferCallingCard"> - ç¾åœ¨ã‚³ãƒ¼ãƒªãƒ³ã‚°ã‚«ãƒ¼ãƒ‰ã‚’é€ã‚Œã¾ã›ã‚“。数分後ã«ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 + ç¾åœ¨ã‚³ãƒ¼ãƒªãƒ³ã‚°ã‚«ãƒ¼ãƒ‰ã‚’é€ã‚Œã¾ã›ã‚“。数分後ã«ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="CantOfferFriendship"> - ç¾åœ¨ãƒ•レンドシップをé€ã‚Œã¾ã›ã‚“。数分後ã«è©¦ã—ã¦ãã ã•ã„。 + ç¾åœ¨ãƒ•レンドシップをé€ã‚Œã¾ã›ã‚“。数分後ã«ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="BusyModeSet"> å–り込ã¿ä¸ãƒ¢ãƒ¼ãƒ‰ã«ãªã‚Šã¾ã—ãŸã€‚ ãƒãƒ£ãƒƒãƒˆã¨ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ãƒˆãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯è¡¨ç¤ºã•れã¾ã›ã‚“。 å—ä¿¡ã™ã‚‹ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ãƒˆãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ã¯å–り込ã¿ä¸è¿”ç”メッセージãŒè¡¨ç¤ºã•れã¾ã™ã€‚ テレãƒãƒ¼ãƒˆã®ã‚ªãƒ•ァーã¯å—ã‘å–り拒å¦ã¨ãªã‚Šã¾ã™ã€‚ アイテムã®ã‚ªãƒ•ァーã¯ã™ã¹ã¦ã”ã¿ç®±ã«å…¥ã‚Šã¾ã™ã€‚ - <usetemplate ignoretext="ãƒã‚°ã‚¤ãƒ³çŠ¶æ…‹ã‚’å–り込ã¿ä¸ãƒ¢ãƒ¼ãƒ‰ã«å¤‰æ›´ã™ã‚‹" name="okignore" yestext="OK"/> + <usetemplate ignoretext="ãƒã‚°ã‚¤ãƒ³çŠ¶æ…‹ã‚’å–り込ã¿ä¸ãƒ¢ãƒ¼ãƒ‰ã«å¤‰æ›´ã™ã‚‹ã¨ã" name="okignore" yestext="OK"/> </notification> <notification name="JoinedTooManyGroupsMember"> åŠ å…¥ã§ãã‚‹ã‚°ãƒ«ãƒ¼ãƒ—ã®æœ€å¤§é™ã«é”ã—ã¾ã—ãŸã€‚ ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«åŠ å…¥ã™ã‚‹ãŸã‚ã«ä»–ã®ã‚°ãƒ«ãƒ¼ãƒ—を脱退ã™ã‚‹ã‹ã€ã“ã®ç”³ã—入れをæ–ã£ã¦ãã ã•ã„。 [NAME] ãŒã‚ãªãŸã‚’グループã®ãƒ¡ãƒ³ãƒãƒ¼ã¨ã—ã¦å‹§èª˜ã—ã¦ã„ã¾ã™ã€‚ -[INVITE] <usetemplate name="okcancelbuttons" notext="辞退" yestext="å‚åŠ "/> </notification> <notification name="JoinedTooManyGroups"> @@ -1390,7 +1464,7 @@ F1ã‚ーを押ã—ã¦ãã ã•ã„。 <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="KickUser"> - ã©ã‚“ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã—ã¦ã€ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’追ã„出ã—ã¾ã™ã‹ï¼Ÿ + ã©ã®ã‚ˆã†ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’æ·»ãˆã¦ã“ã®ä½äººã‚’追ã„出ã—ã¾ã™ã‹ï¼Ÿ <form name="form"> <input name="message"> ã‚ãªãŸã¯ç®¡ç†è€…ã«ã‚ˆã‚Šãƒã‚°ã‚ªãƒ•ã•れã¾ã—ãŸã€‚ @@ -1400,7 +1474,7 @@ F1ã‚ーを押ã—ã¦ãã ã•ã„。 </form> </notification> <notification name="KickAllUsers"> - ã©ã‚“ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã—ã¦ã€ã‚°ãƒªãƒƒãƒ‰ã«ã„る全員を追ã„出ã—ã¾ã™ã‹ï¼Ÿ + ã©ã®ã‚ˆã†ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ã¤ã‘ã¦ã‚°ãƒªãƒƒãƒ‰ã«ã„る全員を追ã„出ã—ã¾ã™ã‹ï¼Ÿ <form name="form"> <input name="message"> ã‚ãªãŸã¯ç®¡ç†è€…ã«ã‚ˆã‚Šãƒã‚°ã‚ªãƒ•ã•れã¾ã—ãŸã€‚ @@ -1410,17 +1484,17 @@ F1ã‚ーを押ã—ã¦ãã ã•ã„。 </form> </notification> <notification name="FreezeUser"> - ã©ã‚“ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã—ã¦ã€ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’フリーズã—ã¾ã™ã‹ï¼Ÿ + ã©ã®ã‚ˆã†ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’æ·»ãˆã¦ã“ã®ä½äººã‚’フリーズã—ã¾ã™ã‹ï¼Ÿ <form name="form"> <input name="message"> - ã‚ãªãŸã¯ãƒ•リーズã•れã¦ã„ã¾ã™ã€‚ å‹•ãã“ã¨ã‚‚ãƒãƒ£ãƒƒãƒˆã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã›ã‚“。 管ç†è€…ãŒIMを通ã˜ã¦ã‚ãªãŸã«é€£çµ¡ã—ã¾ã™ã€‚ + ã‚ãªãŸã¯ãƒ•リーズã•れã¦ã„ã¾ã™ã€‚ å‹•ãã“ã¨ã‚‚ãƒãƒ£ãƒƒãƒˆã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã›ã‚“。 管ç†è€…㌠IM ã§ã‚ãªãŸã«é€£çµ¡ã—ã¾ã™ã€‚ </input> <button name="OK" text="OK"/> <button name="Cancel" text="å–り消ã—"/> </form> </notification> <notification name="UnFreezeUser"> - ã©ã‚“ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã—ã¦ã€ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®ãƒ•リーズを解除ã—ã¾ã™ã‹ï¼Ÿ + ã©ã®ã‚ˆã†ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’æ·»ãˆã¦ã“ã®ä½äººã®ãƒ•リーズを解除ã—ã¾ã™ã‹ï¼Ÿ <form name="form"> <input name="message"> ã‚‚ã†ãƒ•リーズã•れã¦ã„ã¾ã›ã‚“。 @@ -1430,40 +1504,43 @@ F1ã‚ーを押ã—ã¦ãã ã•ã„。 </form> </notification> <notification name="OfferTeleport"> - 次ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’æ·»ãˆã¦ã‚ãªãŸãŒä»Šã„ã‚‹å ´æ‰€ã¸ã®ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã‚’é€ã‚Šã¾ã™ã‹ï¼Ÿ + 次ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’æ·»ãˆã¦ç¾åœ¨åœ°ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã‚’é€ã‚Šã¾ã™ã‹ï¼Ÿ <form name="form"> <input name="message"> - [REGION]ã«æ¥ã¾ã›ã‚“ã‹ï¼Ÿ + [REGION] ã«æ¥ã¾ã›ã‚“ã‹ï¼Ÿ </input> <button name="OK" text="OK"/> <button name="Cancel" text="å–り消ã—"/> </form> </notification> <notification name="OfferTeleportFromGod"> - ユーザーをゴッド・コールã§å‘¼ã³å¯„ã›ã¾ã™ã‹ï¼Ÿ + ç¾åœ¨åœ°ã«ä½äººã‚’ゴッドサモンã—ã¾ã™ã‹ï¼Ÿ <form name="form"> <input name="message"> - [REGION]ã«æ¥ã¾ã›ã‚“ã‹ï¼Ÿ + [REGION] ã«æ¥ã¾ã›ã‚“ã‹ï¼Ÿ </input> <button name="OK" text="OK"/> <button name="Cancel" text="å–り消ã—"/> </form> </notification> <notification name="TeleportFromLandmark"> - 本当ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™ã‹ï¼Ÿ - <usetemplate ignoretext="ランドマークã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ãŸã„ã‹ç¢ºèªã™ã‚‹" name="okcancelignore" notext="ã‚ャンセル" yestext="テレãƒãƒ¼ãƒˆ"/> + ã“ã®ã¾ã¾ <nolink>[LOCATION]</nolink> ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™ã‹ï¼Ÿ + <usetemplate ignoretext="ランドマークã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ãŸã„ã‹ã©ã†ã‹ã®ç¢ºèª" name="okcancelignore" notext="ã‚ャンセル" yestext="テレãƒãƒ¼ãƒˆ"/> </notification> <notification name="TeleportToPick"> [PICK] ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™ã‹ï¼Ÿ - <usetemplate ignoretext="ピックã®å ´æ‰€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ãŸã„ã‹ç¢ºèªã™ã‚‹" name="okcancelignore" notext="ã‚ャンセル" yestext="テレãƒãƒ¼ãƒˆ"/> + <usetemplate ignoretext="ピックã®å ´æ‰€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ãŸã„ã‹ã©ã†ã‹ã®ç¢ºèª" name="okcancelignore" notext="ã‚ャンセル" yestext="テレãƒãƒ¼ãƒˆ"/> </notification> <notification name="TeleportToClassified"> [CLASSIFIED] ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™ã‹ï¼Ÿ - <usetemplate ignoretext="クラシファイド広告ã®å ´æ‰€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ãŸã„ã‹ç¢ºèªã™ã‚‹" name="okcancelignore" notext="ã‚ャンセル" yestext="テレãƒãƒ¼ãƒˆ"/> + <usetemplate ignoretext="クラシファイド広告ã®å ´æ‰€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ãŸã„ã‹ã©ã†ã‹ã®ç¢ºèª" name="okcancelignore" notext="ã‚ャンセル" yestext="テレãƒãƒ¼ãƒˆ"/> + </notification> + <notification name="TeleportToHistoryEntry"> + [HISTORY_ENTRY] ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™ã‹ï¼Ÿ + <usetemplate ignoretext="å±¥æ´ã®å ´æ‰€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ãŸã„ã‹ã©ã†ã‹ã®ç¢ºèª" name="okcancelignore" notext="ã‚ャンセル" yestext="テレãƒãƒ¼ãƒˆ"/> </notification> <notification label="ã‚ãªãŸã®ä¸å‹•産内ã®å…¨å“¡ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ä¿¡" name="MessageEstate"> - 今ã‚ãªãŸã®ä¸å‹•産ã«ã„る人全員ã«é€ã‚‹ -çŸã„メッセージを入力ã—ã¦ãã ã•ã„。 + 今ã‚ãªãŸã®ä¸å‹•産ã«ã„る人全員ã«é€ã‚‹ã€çŸã„メッセージを入力ã—ã¦ãã ã•ã„。 <form name="form"> <input name="message"/> <button name="OK" text="OK"/> @@ -1471,88 +1548,91 @@ F1ã‚ーを押ã—ã¦ãã ã•ã„。 </form> </notification> <notification label="Lindenã®ä¸å‹•産を変更" name="ChangeLindenEstate"> - ã‚ãªãŸã¯Linden所有ã®ä¸å‹•産(メインランドã€ãƒ†ã‚£ãƒ¼ãƒ³ã‚°ãƒªãƒƒãƒ‰ã€ã‚ªãƒªã‚¨ãƒ³ãƒ†ãƒ¼ã‚·ãƒ§ãƒ³ãªã©ï¼‰ã‚’変更ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ + ãƒªãƒ³ãƒ‡ãƒ³ãŒæ‰€æœ‰ã™ã‚‹ã‚¨ã‚¹ãƒ†ãƒ¼ãƒˆï¼ˆãƒ¡ã‚¤ãƒ³ãƒ©ãƒ³ãƒ‰ã€ãƒ†ã‚£ãƒ¼ãƒ³ã‚°ãƒªãƒƒãƒ‰ã€ã‚ªãƒªã‚¨ãƒ³ãƒ†ãƒ¼ã‚·ãƒ§ãƒ³ãªã©ï¼‰ã‚’変更ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ -ã“れã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®çµŒé¨“ã‚’æ ¹æœ¬ã‹ã‚‰æºã‚‹ãŒã—ã‹ããªã„「éžå¸¸ã«å±é™ºãªè¡Œç‚ºã€ã§ã™ã€‚ã“れã«ã‚ˆã‚Šã€ãƒ¡ã‚¤ãƒ³ãƒ©ãƒ³ãƒ‰ã§å¤šæ•°ã®åœ°åŸŸãŒå¤‰æ›´ã•れã€ã‚¹ãƒšãƒ¼ã‚¹ã‚µãƒ¼ãƒãƒ¼ã«æ‚ªå½±éŸ¿ãŒç”Ÿã˜ã¾ã™ã€‚ +ä½äººã®ä½“é¨“ã«æ ¹æœ¬çš„ã«å½±éŸ¿ã‚’与ãˆã‚‹ãŸã‚ã€éžå¸¸ã«å±é™ºãªè¡Œç‚ºã§ã™ã€‚ メインランドã§ã¯ã€ä½•åƒã¨ã„ã†ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ãŒå¤‰æ›´ã«ã‚ˆã‚‹å½±éŸ¿ã‚’å—ã‘ã€ãã®ãŸã‚スペースサーãƒãƒ¼ã«è² æ‹…ã‚’ã‹ã‘ã‚‹ã“ã¨ã«ãªã‚Šã¾ã™ã€‚ -æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ +ãれã§ã‚‚ç¶šã‘ã¾ã™ã‹ï¼Ÿ <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> </notification> <notification label="Lindenã®ä¸å‹•産ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’変更" name="ChangeLindenAccess"> - ã‚ãªãŸã¯Linden所有ã®ä¸å‹•産(メインランドã€ãƒ†ã‚£ãƒ¼ãƒ³ã‚°ãƒªãƒƒãƒ‰ã€ã‚ªãƒªã‚¨ãƒ³ãƒ†ãƒ¼ã‚·ãƒ§ãƒ³ãªã©ï¼‰ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãƒªã‚¹ãƒˆã‚’変更ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ + ã‚ãªãŸã¯ãƒªãƒ³ãƒ‡ãƒ³æ‰€æœ‰ã®ä¸å‹•産(メインランドã€ãƒ†ã‚£ãƒ¼ãƒ³ã‚°ãƒªãƒƒãƒ‰ã€ã‚ªãƒªã‚¨ãƒ³ãƒ†ãƒ¼ã‚·ãƒ§ãƒ³ãªã©ï¼‰ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãƒªã‚¹ãƒˆã‚’変更ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ ã“ã®è¡Œç‚ºã¯ã€Œå±é™ºã€ã§ã‚りã€ã‚°ãƒªãƒƒãƒ‰ã‹ã‚‰ã‚ªãƒ–ジェクトやãŠé‡‘ã®è»¢é€ã‚’ã‚‚ãŸã‚‰ã™ãƒãƒƒã‚ングを引ãèµ·ã“ã™å¯èƒ½æ€§ãŒã‚ã‚‹ãŸã‚ã€å®Œå…¨ã«ãれをæ„図ã—ãŸå ´åˆã®ã¿è¡Œã†ã¹ãã‚‚ã®ã§ã™ã€‚ -ã“れã«ã‚ˆã‚Šå¤šæ•°ã®åœ°åŸŸãŒå¤‰æ›´ã•れã€ã‚¹ãƒšãƒ¼ã‚¹ã‚µãƒ¼ãƒãƒ¼ã«æ‚ªå½±éŸ¿ãŒç”Ÿã˜ã¾ã™ã€‚ +ã“れã«ã‚ˆã‚Šå¤šæ•°ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ãŒå¤‰æ›´ã•れã€ã‚¹ãƒšãƒ¼ã‚¹ã‚µãƒ¼ãƒãƒ¼ã«æ‚ªå½±éŸ¿ãŒç”Ÿã˜ã¾ã™ã€‚ <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> </notification> <notification label="ä¸å‹•ç”£ã‚’é¸æŠž" name="EstateAllowedAgentAdd"> - ã“ã®ä¸å‹•産ã®è¨±å¯ãƒªã‚¹ãƒˆã ã‘ã«è¿½åŠ ã—ã¾ã™ã‹ï¼Ÿ ãれã¨ã‚‚[ALL_ESTATES]ã®ã™ã¹ã¦ã®è¨±å¯ãƒªã‚¹ãƒˆã«è¿½åŠ ã—ã¾ã™ã‹ï¼Ÿ + ã“ã®ä¸å‹•産é™å®šã®è¨±å¯ãƒªã‚¹ãƒˆã«è¿½åŠ ã—ã¾ã™ã‹ï¼Ÿ ãれã¨ã‚‚ [ALL_ESTATES] ã®è¨±å¯ãƒªã‚¹ãƒˆã«è¿½åŠ ã—ã¾ã™ã‹ï¼Ÿ <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ã™ã¹ã¦ã®ä¸å‹•産" yestext="ã“ã®ä¸å‹•産"/> </notification> <notification label="ä¸å‹•ç”£ã‚’é¸æŠž" name="EstateAllowedAgentRemove"> - 許å¯ãƒªã‚¹ãƒˆã‹ã‚‰ã®å‰Šé™¤ã‚’ã“ã®ä¸å‹•産ã«ã¤ã„ã¦ã®ã¿è¡Œã„ã¾ã™ã‹ï¼Ÿ ãれã¨ã‚‚ã€[ALL_ESTATES]ã«ã¤ã„ã¦è¡Œã„ã¾ã™ã‹ï¼Ÿ + ã“ã®ä¸å‹•産é™å®šã®è¨±å¯ãƒªã‚¹ãƒˆã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ ãれã¨ã‚‚ã€[ALL_ESTATES] ã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ã™ã¹ã¦ã®ä¸å‹•産" yestext="ã“ã®ä¸å‹•産"/> </notification> <notification label="ä¸å‹•ç”£ã‚’é¸æŠž" name="EstateAllowedGroupAdd"> - ã“ã®ä¸å‹•産ã®ã‚°ãƒ«ãƒ¼ãƒ—許å¯ãƒªã‚¹ãƒˆã ã‘ã«è¿½åŠ ã—ã¾ã™ã‹ï¼Ÿ ãれã¨ã‚‚[ALL_ESTATES]ã®ã‚°ãƒ«ãƒ¼ãƒ—許å¯ãƒªã‚¹ãƒˆã«è¿½åŠ ã—ã¾ã™ã‹ï¼Ÿ + ã“ã®ä¸å‹•産é™å®šã®ã‚°ãƒ«ãƒ¼ãƒ—許å¯ãƒªã‚¹ãƒˆã«è¿½åŠ ã—ã¾ã™ã‹ï¼Ÿ ãれã¨ã‚‚ [ALL_ESTATES] ã®ã‚°ãƒ«ãƒ¼ãƒ—許å¯ãƒªã‚¹ãƒˆã«è¿½åŠ ã—ã¾ã™ã‹ï¼Ÿ <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ã™ã¹ã¦ã®ä¸å‹•産" yestext="ã“ã®ä¸å‹•産"/> </notification> <notification label="ä¸å‹•ç”£ã‚’é¸æŠž" name="EstateAllowedGroupRemove"> - 許å¯ãƒªã‚¹ãƒˆã‹ã‚‰ã®å‰Šé™¤ã‚’ã“ã®ä¸å‹•産ã«ã¤ã„ã¦ã®ã¿è¡Œã„ã¾ã™ã‹ï¼Ÿ ãれã¨ã‚‚ã€[ALL_ESTATES]ã«ã¤ã„ã¦è¡Œã„ã¾ã™ã‹ï¼Ÿ + ã“ã®ä¸å‹•産é™å®šã®è¨±å¯ãƒªã‚¹ãƒˆã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ ãれã¨ã‚‚ã€[ALL_ESTATES] ã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ã™ã¹ã¦ã®ä¸å‹•産" yestext="ã“ã®ä¸å‹•産"/> </notification> <notification label="ä¸å‹•ç”£ã‚’é¸æŠž" name="EstateBannedAgentAdd"> - ã“ã®ä¸å‹•産ã«ã¤ã„ã¦ã®ã¿ã‚¢ã‚¯ã‚»ã‚¹ã‚’æ‹’å¦ã—ã¾ã™ã‹ï¼Ÿ ãれã¨ã‚‚[ALL_ESTATE]ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’æ‹’å¦ã—ã¾ã™ã‹ï¼Ÿ + ã“ã®ä¸å‹•産é™å®šã§ã‚¢ã‚¯ã‚»ã‚¹ã‚’æ‹’å¦ã—ã¾ã™ã‹ï¼Ÿ ãれã¨ã‚‚ [ALL_ESTATE] ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’æ‹’å¦ã—ã¾ã™ã‹ï¼Ÿ <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ã™ã¹ã¦ã®ä¸å‹•産" yestext="ã“ã®ä¸å‹•産"/> </notification> <notification label="ä¸å‹•ç”£ã‚’é¸æŠž" name="EstateBannedAgentRemove"> - ã“ã®ä½äººã‚’ã€ã“ã®ä¸å‹•産ã®ã¿ã€ã¾ãŸã¯[ALL_ESTATES]ã¸ã¨ã‚¢ã‚¯ã‚»ã‚¹ã§ãるよã†ã«ã€ç¦æ¢ãƒªã‚¹ãƒˆã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ + ã“ã®ä½äººãŒã€ã“ã®ä¸å‹•産é™å®šã€ã¾ãŸã¯ [ALL_ESTATES] ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãるよã†ã«ã€ç¦æ¢ãƒªã‚¹ãƒˆã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ã™ã¹ã¦ã®ä¸å‹•産" yestext="ã“ã®ä¸å‹•産"/> </notification> <notification label="ä¸å‹•ç”£ã‚’é¸æŠž" name="EstateManagerAdd"> - ã“ã®ä¸å‹•産ã®ã¿ã€ã¾ãŸã¯[ALL_ESTATES]ã«å¯¾ã—ã¦ã€ä¸å‹•産マãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã‚’è¿½åŠ ã—ã¾ã™ã‹ï¼Ÿ + ã“ã®ä¸å‹•産é™å®šã€ã¾ãŸã¯ [ALL_ESTATES] ã®ä¸å‹•産マãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã‚’è¿½åŠ ã—ã¾ã™ã‹ï¼Ÿ <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ã™ã¹ã¦ã®ä¸å‹•産" yestext="ã“ã®ä¸å‹•産"/> </notification> <notification label="ä¸å‹•ç”£ã‚’é¸æŠž" name="EstateManagerRemove"> - ä¸å‹•産マãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã‚’ã€ã“ã®ä¸å‹•産ã®ã¿ã€ã¾ãŸã¯[ALL_ESTATES]ã‹ã‚‰ã€å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ + ä¸å‹•産マãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã‚’ã€ã“ã®ä¸å‹•産é™å®šã€ã¾ãŸã¯ [ALL_ESTATES] ã‹ã‚‰ã€å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ã™ã¹ã¦ã®ä¸å‹•産" yestext="ã“ã®ä¸å‹•産"/> </notification> <notification label="ã‚ックを確èª" name="EstateKickUser"> - ã“ã®ä¸å‹•産ã‹ã‚‰[EVIL_USER]を追ã„出ã—ã¾ã™ã‹ï¼Ÿ + ã“ã®ä¸å‹•産ã‹ã‚‰ [EVIL_USER] を追ã„出ã—ã¾ã™ã‹ï¼Ÿ <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> </notification> <notification name="EstateChangeCovenant"> - ä¸å‹•産約款を変更ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ + ä¸å‹•産約款を変更ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ç¶šã‘ã¾ã™ã‹ï¼Ÿ <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> </notification> <notification name="RegionEntryAccessBlocked"> - ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ãã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã¸ã¯å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 年齢を確èªã™ã‚‹éš›ã®æƒ…å ±ã«ä¸è¶³ãŒã‚ã£ãŸãŸã‚ã¨è€ƒãˆã‚‰ã‚Œã¾ã™ã€‚ + ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ãã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ã¸ã¯å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 年齢を確èªã™ã‚‹éš›ã®æƒ…å ±ã«ä¸è¶³ãŒã‚ã£ãŸãŸã‚ã¨è€ƒãˆã‚‰ã‚Œã¾ã™ã€‚ 最新ビューワãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã‚‹ã‹ã‚’ã”確èªãã ã•ã„。ã“ã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã§ã®ã‚¢ã‚¯ã‚»ã‚¹ã«é–¢ã™ã‚‹è©³ç´°ã¯ãƒŠãƒ¬ãƒƒã‚¸ãƒ™ãƒ¼ã‚¹ã‚’ã”覧ãã ã•ã„。 <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="RegionEntryAccessBlocked_KB"> - ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ãã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã¸ã¯å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 + ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ãã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ã¸ã¯å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 ナレッジベースを開ãレーティング区分ã«ã¤ã„ã¦å¦ã³ã¾ã™ã‹ï¼Ÿ <url name="url"> http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/ja </url> - <usetemplate ignoretext="レーティング区分ã®åˆ¶é™ã®ãŸã‚ã€ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“" name="okcancelignore" notext="é–‰ã˜ã‚‹" yestext="ナレッジベースを開ã"/> + <usetemplate ignoretext="レーティング区分ã®åˆ¶é™ã®ãŸã‚ã€ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«å…¥ã‚‹ã“ã¨ãŒã§ããªã„ã¨ã" name="okcancelignore" notext="é–‰ã˜ã‚‹" yestext="ナレッジベースを開ã"/> </notification> <notification name="RegionEntryAccessBlocked_Notify"> - ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ãã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã¸ã¯å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 + ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ãã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ã¸ã¯å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 </notification> <notification name="RegionEntryAccessBlocked_Change"> - ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†è¨å®šã«ã‚ˆã‚Šã€ãã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã¸ã¯å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 + レーティング区分ã«é–¢ã™ã‚‹è¨å®šã«ã‚ˆã‚Šã€ãã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã«ã¯ç«‹ã¡å…¥ã‚Œã¾ã›ã‚“。 -「è¨å®šã‚’変更ã€ã‚’クリックã—ã¦ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã‚’上ã’ã‚‹ã¨ã€å…¥ã‚Œã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ ã‚ãªãŸã¯ä»Šå¾Œ [REGIONMATURITY] ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®æ¤œç´¢åŠã³ã‚¢ã‚¯ã‚»ã‚¹ãŒå¯èƒ½ã¨ãªã‚Šã¾ã™ã€‚ ã‚ã¨ã§è¨å®šã‚’å…ƒã«æˆ»ã—ãŸã„å ´åˆã¯ã€ã€Œç·¨é›†ã€ï¼žã€Œç’°å¢ƒè¨å®šã€ã‚’ã”覧ãã ã•ã„。 +ãã®åœ°åŸŸã«å…¥ã‚‹ã«ã¯ã€ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã®è¨å®šã‚’変更ã—ã¦ãã ã•ã„。変更ã™ã‚‹ã¨ã€[REGIONMATURITY]ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®æ¤œç´¢ã‚„アクセスãŒå¯èƒ½ã«ãªã‚Šã¾ã™ã€‚å¤‰æ›´å†…å®¹ã‚’å…ƒã«æˆ»ã™ã«ã¯ã€ãƒŸãƒ¼ > 環境è¨å®š > ä¸€èˆ¬ã‚’é¸æŠžã—ã¦ãã ã•ã„。 <form name="form"> <button name="OK" text="環境è¨å®šã®å¤‰æ›´"/> <button default="true" name="Cancel" text="é–‰ã˜ã‚‹"/> - <ignore name="ignore" text="é¸æŠžã—ãŸãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ãŒåŽŸå› ã§ã€ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“"/> + <ignore name="ignore" text="é¸æŠžã—ãŸãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ãŒåŽŸå› ã§ã€ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«å…¥ã‚Œãªã„ã¨ã"/> </form> </notification> + <notification name="PreferredMaturityChanged"> + ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†è¨å®šã¯ç¾åœ¨ [RATING] ã§ã™ã€‚ + </notification> <notification name="LandClaimAccessBlocked"> ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ã“ã®åœŸåœ°ã‚’å–å¾—ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 年齢を確èªã™ã‚‹éš›ã®æƒ…å ±ã«ä¸è¶³ãŒã‚ã£ãŸãŸã‚ã¨è€ƒãˆã‚‰ã‚Œã¾ã™ã€‚ @@ -1575,7 +1655,7 @@ F1ã‚ーを押ã—ã¦ãã ã•ã„。 ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†è¨å®šã«ã‚ˆã‚Šã€ã“ã®åœŸåœ°ã‚’å–å¾—ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 「è¨å®šã‚’変更ã€ã‚’クリックã—ã¦ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã‚’上ã’ã‚‹ã¨ã€å…¥ã‚Œã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ ã‚ãªãŸã¯ä»Šå¾Œ [REGIONMATURITY] ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®æ¤œç´¢åŠã³ã‚¢ã‚¯ã‚»ã‚¹ãŒå¯èƒ½ã¨ãªã‚Šã¾ã™ã€‚ ã‚ã¨ã§è¨å®šã‚’å…ƒã«æˆ»ã—ãŸã„å ´åˆã¯ã€ã€Œç·¨é›†ã€ï¼žã€Œç’°å¢ƒè¨å®šã€ã‚’ã”覧ãã ã•ã„。 - <usetemplate ignoretext="é¸æŠžã—ãŸãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ãŒåŽŸå› ã§ã€åœŸåœ°ã‚’å–å¾—ã§ãã¾ã›ã‚“" name="okcancelignore" notext="é–‰ã˜ã‚‹" yestext="è¨å®šã®å¤‰æ›´"/> + <usetemplate ignoretext="é¸æŠžã—ãŸãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ãŒåŽŸå› ã§ã€åœŸåœ°ã‚’å–å¾—ã§ããªã„ã¨ã" name="okcancelignore" notext="é–‰ã˜ã‚‹" yestext="è¨å®šã®å¤‰æ›´"/> </notification> <notification name="LandBuyAccessBlocked"> ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ã“ã®åœŸåœ°ã‚’購入ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 年齢を確èªã™ã‚‹éš›ã®æƒ…å ±ã«ä¸è¶³ãŒã‚ã£ãŸãŸã‚ã¨è€ƒãˆã‚‰ã‚Œã¾ã™ã€‚ @@ -1599,58 +1679,57 @@ F1ã‚ーを押ã—ã¦ãã ã•ã„。 ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†è¨å®šã«ã‚ˆã‚Šã€ã“ã®åœŸåœ°ã‚’購入ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 「è¨å®šã‚’変更ã€ã‚’クリックã—ã¦ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã‚’上ã’ã‚‹ã¨ã€å…¥ã‚Œã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ ã‚ãªãŸã¯ä»Šå¾Œ [REGIONMATURITY] ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®æ¤œç´¢åŠã³ã‚¢ã‚¯ã‚»ã‚¹ãŒå¯èƒ½ã¨ãªã‚Šã¾ã™ã€‚ ã‚ã¨ã§è¨å®šã‚’å…ƒã«æˆ»ã—ãŸã„å ´åˆã¯ã€ã€Œç·¨é›†ã€ï¼žã€Œç’°å¢ƒè¨å®šã€ã‚’ã”覧ãã ã•ã„。 - <usetemplate ignoretext="é¸æŠžã—ãŸãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ãŒåŽŸå› ã§ã€åœŸåœ°ã‚’購入ã§ãã¾ã›ã‚“" name="okcancelignore" notext="é–‰ã˜ã‚‹" yestext="è¨å®šã®å¤‰æ›´"/> + <usetemplate ignoretext="é¸æŠžã—ãŸãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ãŒåŽŸå› ã§ã€åœŸåœ°ã‚’購入ã§ããªã„ã¨ã" name="okcancelignore" notext="é–‰ã˜ã‚‹" yestext="è¨å®šã®å¤‰æ›´"/> </notification> <notification name="TooManyPrimsSelected"> é¸æŠžã—ãŸãƒ—リムãŒå¤šã™ãŽã¾ã™ã€‚ [MAX_PRIM_COUNT] å€‹é¸æŠžã™ã‚‹ã‹ã€ãƒ—リム数を減らã—ã¦ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="ProblemImportingEstateCovenant"> - ä¸å‹•産約款ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆæ™‚ã«å•題発生。 + ä¸å‹•産約款ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆæ™‚ã«å•題ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="ProblemAddingEstateManager"> æ–°ã—ã„ä¸å‹•産マãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã®è¿½åŠ ã«é–¢ã™ã‚‹å•題: -1ã¤ä»¥ä¸Šã®ä¸å‹•産ã§ã€ãƒžãƒãƒ¼ã‚¸ãƒ£ãƒ¼ãƒªã‚¹ãƒˆãŒæº€æ¯ã«ãªã£ã¦ã„ã¾ã™ã€‚ +ã„ãšã‚Œã‹ã®ä¸å‹•産ã®ãƒžãƒãƒ¼ã‚¸ãƒ£ãƒ¼ãƒªã‚¹ãƒˆãŒæº€æ¯ã«ãªã£ã¦ã„ã¾ã™ã€‚ </notification> <notification name="ProblemAddingEstateGeneric"> ä¸å‹•産リストã®è¿½åŠ ã«é–¢ã™ã‚‹å•題: -1ã¤ä»¥ä¸Šã®ä¸å‹•産ã§ã€ãƒªã‚¹ãƒˆãŒæº€æ¯ã«ãªã£ã¦ã„ã¾ã™ã€‚ +ã„ãšã‚Œã‹ã®ä¸å‹•産ã®ãƒªã‚¹ãƒˆãŒæº€æ¯ã«ãªã£ã¦ã„ã¾ã™ã€‚ </notification> <notification name="UnableToLoadNotecardAsset"> - ç¾åœ¨ãƒŽãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã®è³‡ç”£IDã‚’èªã¿è¾¼ã‚€ã“ã¨ãŒã§ãã¾ã›ã‚“。 + ç¾åœ¨ãƒŽãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã®ã‚¢ã‚»ãƒƒãƒˆ ID ã‚’èªã¿è¾¼ã‚€ã“ã¨ãŒã§ãã¾ã›ã‚“。 <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="NotAllowedToViewNotecard"> - è¦æ±‚ã•れãŸè³‡ç”£IDã«é–¢ã™ã‚‹ãƒŽãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã‚’閲覧ã™ã‚‹ã«ã¯æ¨©é™ãŒä¸å分ã§ã™ã€‚ + è¦æ±‚ã—ãŸã‚¢ã‚»ãƒƒãƒˆ ID ã«é–¢ã™ã‚‹ãƒŽãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã‚’閲覧ã™ã‚‹ã«ã¯ã€æ¨©é™ãŒä¸å分ã§ã™ã€‚ <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="MissingNotecardAssetID"> - ノートカード用資産IDãŒãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«ç™»éŒ²ã•れã¦ã„ã¾ã›ã‚“。 + ノートカード用ã®ã‚¢ã‚»ãƒƒãƒˆ ID ãŒãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«ç™»éŒ²ã•れã¦ã„ã¾ã›ã‚“。 <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="PublishClassified"> 注æ„ï¼šã‚¯ãƒ©ã‚·ãƒ•ã‚¡ã‚¤ãƒ‰åºƒå‘Šã®æ–™é‡‘ã¯æ‰•ã„æˆ»ã—ã•れã¾ã›ã‚“。 -L$[AMOUNT]ã§ã€ã“ã®ã‚¯ãƒ©ã‚·ãƒ•ァイド広告を今ã™ã公開ã—ã¾ã™ã‹ï¼Ÿ +L$ [AMOUNT] ã§ã€ã“ã®ã‚¯ãƒ©ã‚·ãƒ•ァイド広告を今ã™ã公開ã—ã¾ã™ã‹ï¼Ÿ <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> </notification> <notification name="SetClassifiedMature"> - ã“ã®åºƒå‘Šã«ã€ŒæŽ§ãˆã‚ã€ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯å«ã¾ã‚Œã¦ã„ã¾ã™ã‹ï¼Ÿ + ã“ã®åºƒå‘Šã«ã€ŒModerateã€ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯å«ã¾ã‚Œã¦ã„ã¾ã™ã‹ï¼Ÿ <usetemplate canceltext="ã‚ャンセル" name="yesnocancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> </notification> <notification name="SetGroupMature"> - ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«ã€ŒæŽ§ãˆã‚ã€ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã‹ï¼Ÿ + ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«ã€ŒModerateã€ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã‹ï¼Ÿ <usetemplate canceltext="ã‚ャンセル" name="yesnocancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> </notification> <notification label="å†èµ·å‹•を確èª" name="ConfirmRestart"> - ã“ã®åœ°åŸŸã‚’2分後ã«å†èµ·å‹•ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ -æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ + ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ 2 分後ã«å†èµ·å‹•ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ +ç¶šã‘ã¾ã™ã‹ï¼Ÿ <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> </notification> - <notification label="ã“ã®åœ°åŸŸå†…ã®å…¨å“¡ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ä¿¡" name="MessageRegion"> - ã“ã®åœ°åŸŸã«ã„る人全員ã«é€ã‚‹ -çŸã„メッセージを入力ã—ã¦ãã ã•ã„。 + <notification label="ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ä¿¡" name="MessageRegion"> + ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«ã„る人全員ã«é€ã‚‹çŸã„メッセージを入力ã—ã¦ãã ã•ã„。 <form name="form"> <input name="message"/> <button name="OK" text="OK"/> @@ -1658,16 +1737,16 @@ L$[AMOUNT]ã§ã€ã“ã®ã‚¯ãƒ©ã‚·ãƒ•ァイド広告を今ã™ã公開ã—ã¾ã™ã‹ï </form> </notification> <notification label="地域ã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†æŒ‡å®šå¤‰æ›´æ¸ˆã¿" name="RegionMaturityChange"> - ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ãŒã‚¢ãƒƒãƒ—デートã•れã¾ã—ãŸã€‚ + ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ãŒã‚¢ãƒƒãƒ—デートã•れã¾ã—ãŸã€‚ 地図ã«å¤‰æ›´ãŒåæ˜ ã•れるã¾ã§æ•°åˆ†ã‹ã‹ã‚‹ã“ã¨ãŒã‚りã¾ã™ã€‚ -アダルト専用リージョンã«å…¥ã‚‹ã«ã¯ã€ä½äººã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆãŒå¹´é½¢ç¢ºèªã‹æ”¯æ‰•方法ã®ã„ãšã‚Œã‹ã§ã€Œç¢ºèªæ¸ˆã¿ã€ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“。 +Adult 専用リージョンã«å…¥ã‚‹ã«ã¯ã€ä½äººã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆãŒå¹´é½¢ç¢ºèªã‹æ”¯æ‰•方法ã®ã„ãšã‚Œã‹ã§ã€Œç¢ºèªæ¸ˆã¿ã€ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“。 </notification> <notification label="ボイスãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ä¸ä¸€è‡´" name="VoiceVersionMismatch"> [APP_NAME] ã®ã“ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã¯ã€ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«ãŠã‘るボイスãƒãƒ£ãƒƒãƒˆã®äº’æ›æ€§ãŒã‚りã¾ã›ã‚“。 ボイスãƒãƒ£ãƒƒãƒˆã‚’æ£å¸¸ã«è¡Œã†ãŸã‚ã«ã¯ã€[APP_NAME] ã®ã‚¢ãƒƒãƒ—デートãŒå¿…è¦ã§ã™ã€‚ </notification> <notification label="オブジェクトを購入ã§ãã¾ã›ã‚“" name="BuyObjectOneOwner"> - 複数ã®ã‚ªãƒ¼ãƒŠãƒ¼ã‹ã‚‰åŒæ™‚ã«ã‚ªãƒ–ジェクトを購入ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 + è¤‡æ•°ã®æ‰€æœ‰è€…ã‹ã‚‰åŒæ™‚ã«ã‚ªãƒ–ジェクトを購入ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 å˜ä¸€ã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã€ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 </notification> <notification label="コンテンツを購入ã§ãã¾ã›ã‚“" name="BuyContentsOneOnly"> @@ -1675,62 +1754,64 @@ L$[AMOUNT]ã§ã€ã“ã®ã‚¯ãƒ©ã‚·ãƒ•ァイド広告を今ã™ã公開ã—ã¾ã™ã‹ï é¸æŠžã™ã‚‹ã‚ªãƒ–ジェクトを1ã¤ã ã‘ã«ã—ã¦ã€ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 </notification> <notification label="コンテンツを購入ã§ãã¾ã›ã‚“" name="BuyContentsOneOwner"> - 複数ã®ã‚ªãƒ¼ãƒŠãƒ¼ã‹ã‚‰åŒæ™‚ã«ã‚ªãƒ–ジェクトを購入ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 + è¤‡æ•°ã®æ‰€æœ‰è€…ã‹ã‚‰åŒæ™‚ã«ã‚ªãƒ–ジェクトを購入ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 å˜ä¸€ã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã€ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 </notification> <notification name="BuyOriginal"> - オリジナルã®ã‚ªãƒ–ジェクトを[OWNER]ã‹ã‚‰L$[PRICE]ã§è³¼å…¥ã—ã¾ã™ã‹ï¼Ÿ -ã“れã«ã‚ˆã‚Šã€ã‚ãªãŸãŒã‚ªãƒ–ジェクトã®ã‚ªãƒ¼ãƒŠãƒ¼ã«ãªã‚Šã¾ã™ã€‚ + オリジナルã®ã‚ªãƒ–ジェクトを [OWNER] ã‹ã‚‰ L$ [PRICE] ã§è³¼å…¥ã—ã¾ã™ã‹ï¼Ÿ +購入ã™ã‚‹ã¨ã€ã‚ãªãŸãŒã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æ‰€æœ‰è€…ã¨ãªã‚Šã¾ã™ã€‚ å¯èƒ½ãªæ“作ã¯ã€ -変更:[MODIFYPERM]ã€ã‚³ãƒ”ー:[COPYPERM]〠-å†è²©ï¼ãƒ—レゼント[RESELLPERM]ã§ã™ã€‚ +ä¿®æ£ï¼š[MODIFYPERM]ã€ã‚³ãƒ”ー:[COPYPERM]〠+å†è²©ãƒ»ãƒ—レゼント:[RESELLPERM] ã§ã™ã€‚ <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> </notification> <notification name="BuyOriginalNoOwner"> - L$[PRICE]ã§ã‚ªãƒªã‚¸ãƒŠãƒ«ã®ã‚ªãƒ–ジェクトを購入ã—ã¾ã™ã‹ï¼Ÿ -ã“れã«ã‚ˆã‚Šã€ã‚ãªãŸãŒã‚ªãƒ–ジェクトã®ã‚ªãƒ¼ãƒŠãƒ¼ã«ãªã‚Šã¾ã™ã€‚ + L$ [PRICE] ã§ã‚ªãƒªã‚¸ãƒŠãƒ«ã®ã‚ªãƒ–ジェクトを購入ã—ã¾ã™ã‹ï¼Ÿ +購入ã™ã‚‹ã¨ã€ã‚ãªãŸãŒã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æ‰€æœ‰è€…ã¨ãªã‚Šã¾ã™ã€‚ å¯èƒ½ãªæ“作ã¯ã€ -変更:[MODIFYPERM]ã€ã‚³ãƒ”ー:[COPYPERM]〠-å†è²©ï¼ãƒ—レゼント[RESELLPERM]ã§ã™ã€‚ +ä¿®æ£ï¼š[MODIFYPERM]ã€ã‚³ãƒ”ー:[COPYPERM]〠+å†è²©ãƒ»ãƒ—レゼント:[RESELLPERM] ã§ã™ã€‚ <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> </notification> <notification name="BuyCopy"> - コピーを[OWNER]ã‹ã‚‰L$[PRICE]ã§è³¼å…¥ã—ã¾ã™ã‹ï¼Ÿ -購入ã—ãŸã‚ªãƒ–ジェクトã¯ã€ã‚ãªãŸã®æŒã¡ç‰©ã«ã‚³ãƒ”ーã•れã¾ã™ã€‚ -å¯èƒ½ãªæ“作ã¯ã€å¤‰æ›´ï¼š[MODIFYPERM]ã€ã‚³ãƒ”ー:[COPYPERM]〠-å†è²©ï¼ãƒ—レゼント[RESELLPERM]ã§ã™ã€‚ + コピーを [OWNER] ã‹ã‚‰ L$ [PRICE] ã§è³¼å…¥ã—ã¾ã™ã‹ï¼Ÿ +購入ã—ãŸã‚ªãƒ–ジェクトã¯ã€ã‚ãªãŸã®ã€ŒæŒã¡ç‰©ã€ã«ã‚³ãƒ”ーã•れã¾ã™ã€‚ +å¯èƒ½ãªæ“作ã¯ã€ +ä¿®æ£ï¼š[MODIFYPERM]ã€ã‚³ãƒ”ー:[COPYPERM]〠+å†è²©ãƒ»ãƒ—レゼント:[RESELLPERM] ã§ã™ã€‚ <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> </notification> <notification name="BuyCopyNoOwner"> - L$[PRICE]ã§ã‚³ãƒ”ーを購入ã—ã¾ã™ã‹ï¼Ÿ -購入ã—ãŸã‚ªãƒ–ジェクトã¯ã€ã‚ãªãŸã®æŒã¡ç‰©ã«ã‚³ãƒ”ーã•れã¾ã™ã€‚ -å¯èƒ½ãªæ“作ã¯ã€å¤‰æ›´ï¼š[MODIFYPERM]ã€ã‚³ãƒ”ー:[COPYPERM]〠-å†è²©ï¼ãƒ—レゼント[RESELLPERM]ã§ã™ã€‚ + L$ [PRICE] ã§ã‚³ãƒ”ーを購入ã—ã¾ã™ã‹ï¼Ÿ +購入ã—ãŸã‚ªãƒ–ジェクトã¯ã€ã‚ãªãŸã®ã€ŒæŒã¡ç‰©ã€ã«ã‚³ãƒ”ーã•れã¾ã™ã€‚ +å¯èƒ½ãªæ“作ã¯ã€ +ä¿®æ£ï¼š[MODIFYPERM]ã€ã‚³ãƒ”ー:[COPYPERM]〠+å†è²©ãƒ»ãƒ—レゼント:[RESELLPERM] ã§ã™ã€‚ <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> </notification> <notification name="BuyContents"> - コンテンツを[OWNER]ã‹ã‚‰L$[PRICE]ã§è³¼å…¥ã—ã¾ã™ã‹ï¼Ÿ -購入ã—ãŸã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯ã€ã‚ãªãŸã®æŒã¡ç‰©ã«ã‚³ãƒ”ーã•れã¾ã™ã€‚ + ä¸èº«ã‚’ [OWNER] ã‹ã‚‰ L$ [PRICE] ã§è³¼å…¥ã—ã¾ã™ã‹ï¼Ÿ +購入ã—ãŸä¸èº«ã¯ã€ã‚ãªãŸã®ã€ŒæŒã¡ç‰©ã€ã«ã‚³ãƒ”ーã•れã¾ã™ã€‚ <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> </notification> <notification name="BuyContentsNoOwner"> - L$[PRICE]ã§ã‚³ãƒ³ãƒ†ãƒ³ãƒ„を購入ã—ã¾ã™ã‹ï¼Ÿ -購入ã—ãŸã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯ã€ã‚ãªãŸã®æŒã¡ç‰©ã«ã‚³ãƒ”ーã•れã¾ã™ã€‚ + L$ [PRICE] ã§ä¸èº«ã‚’購入ã—ã¾ã™ã‹ï¼Ÿ +購入ã—ãŸä¸èº«ã¯ã€ã‚ãªãŸã®ã€ŒæŒã¡ç‰©ã€ã«ã‚³ãƒ”ーã•れã¾ã™ã€‚ <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> </notification> <notification name="ConfirmPurchase"> ã“ã®å–引ã¯ä»¥ä¸‹ã®ã¨ãŠã‚Šè¡Œã‚れã¾ã™ï¼š [ACTION] -ã“ã®è³¼å…¥ã‚’続行ã—ã¾ã™ã‹ï¼Ÿ +購入を続ã‘ã¾ã™ã‹ï¼Ÿ <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> </notification> <notification name="ConfirmPurchasePassword"> ã“ã®å–引ã¯ä»¥ä¸‹ã®ã¨ãŠã‚Šè¡Œã‚れã¾ã™ï¼š [ACTION] -ã“ã®è³¼å…¥ã‚’続行ã—ã¾ã™ã‹ï¼Ÿ -パスワードをå†å…¥åŠ›ã—ã€ã€ŒOKã€ã‚’クリックã—ã¦ãã ã•ã„。 +購入を続ã‘ã¾ã™ã‹ï¼Ÿ +パスワードをå†å…¥åŠ›ã—ã€ã€Œ OK ã€ã‚’クリックã—ã¦ãã ã•ã„。 <form name="form"> <input name="message"/> <button name="ConfirmPurchase" text="OK"/> @@ -1739,31 +1820,31 @@ L$[AMOUNT]ã§ã€ã“ã®ã‚¯ãƒ©ã‚·ãƒ•ァイド広告を今ã™ã公開ã—ã¾ã™ã‹ï </notification> <notification name="SetPickLocation"> メモ: -本ピックã®ãƒã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã‚’æ›´æ–°ã—ã¾ã—ãŸãŒã€ +本ピックã®ä½ç½®ã‚’æ›´æ–°ã—ã¾ã—ãŸãŒã€ ä»–ã®è©³ç´°ã¯å…ƒã®å€¤ã®ã¾ã¾ã«ãªã‚Šã¾ã™ã€‚ <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="MoveInventoryFromObject"> - ã€Œã‚³ãƒ”ãƒ¼ç¦æ¢ã€ã®æŒã¡ç‰©ã‚¢ã‚¤ãƒ†ãƒ ãŒé¸æŠžã•れã¾ã—ãŸã€‚ -ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã¯ã‚³ãƒ”ーã•れãªã„ã¾ã¾ã€ã‚ãªãŸã®æŒã¡ç‰©ã«ç§»å‹•ã•れã¾ã™ã€‚ + 「コピーä¸å¯ã€ã®æŒã¡ç‰©ã‚¢ã‚¤ãƒ†ãƒ ã‚’é¸æŠžã—ã¾ã—ãŸã€‚ +ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã¯ã‚³ãƒ”ーã•れãªã„ã¾ã¾ã€ã‚ãªãŸã®ã€ŒæŒã¡ç‰©ã€ã«ç§»å‹•ã•れã¾ã™ã€‚ アイテムを動ã‹ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate ignoretext="「コピーä¸å¯ã€ã®ã‚¢ã‚¤ãƒ†ãƒ をオブジェクトã‹ã‚‰å‹•ã‹ã™å‰ã«è¦å‘Šã™ã‚‹" name="okcancelignore" notext="ã‚ャンセル" yestext="OK"/> + <usetemplate ignoretext="「コピーä¸å¯ã€ã®ã‚¢ã‚¤ãƒ†ãƒ をオブジェクトã‹ã‚‰å‹•ã‹ã™å‰ã®è¦å‘Š" name="okcancelignore" notext="ã‚ャンセル" yestext="OK"/> </notification> <notification name="MoveInventoryFromScriptedObject"> - ã€Œã‚³ãƒ”ãƒ¼ç¦æ¢ã€ã®æŒã¡ç‰©ã‚¢ã‚¤ãƒ†ãƒ ãŒé¸æŠžã•れã¾ã—ãŸã€‚ -ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã¯ã‚³ãƒ”ーã•れるã®ã§ã¯ãªãã€ã‚ãªãŸã®æŒã¡ç‰©ã«ç§»å‹•ã•れã¾ã™ã€‚ -ã“ã®ã‚ªãƒ–ジェクトã¯ã‚¹ã‚¯ãƒªãƒ—ト付ããªã®ã§ã€æŒã¡ç‰©ã«ç§»å‹•ã•ã›ã‚‹ã¨ + 「コピーä¸å¯ã€ã®æŒã¡ç‰©ã‚¢ã‚¤ãƒ†ãƒ ã‚’é¸æŠžã—ã¾ã—ãŸã€‚ +ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã¯ã‚³ãƒ”ーã•れãšã«ã€ã‚ãªãŸã®ã€ŒæŒã¡ç‰©ã€ã«ç§»å‹•ã•れã¾ã™ã€‚ +ã“ã®ã‚ªãƒ–ジェクトã¯ã‚¹ã‚¯ãƒªãƒ—ト付ããªã®ã§ã€ã€ŒæŒã¡ç‰©ã€ã«ç§»å‹•ã•ã›ã‚‹ã¨ スクリプトã«èª¤å‹•作ãŒèµ·ãã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ æŒã¡ç‰©ã‚¢ã‚¤ãƒ†ãƒ を移動ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate ignoretext="スクリプト入りã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’å£Šã™æã‚Œã®ã‚る「コピーä¸å¯ã€ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’å‹•ã‹ã™å‰ã«è¦å‘Šã™ã‚‹" name="okcancelignore" notext="ã‚ャンセル" yestext="OK"/> + <usetemplate ignoretext="スクリプト入りã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’å£Šã™æã‚Œã®ã‚る「コピーä¸å¯ã€ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’å‹•ã‹ã™å‰ã®è¦å‘Š" name="okcancelignore" notext="ã‚ャンセル" yestext="OK"/> </notification> <notification name="ClickActionNotPayable"> è¦å‘Šï¼š クリックã§ã€Œã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã«æ”¯æ‰•ã†ã€è¨å®šã‚’ã—ã¾ã—ãŸã€‚スクリプト㫠money()イベントãŒè¿½åŠ ã•れるã¨å‹•作ã—ã¾ã™ã€‚ <form name="form"> - <ignore name="ignore" text="money() スクリプトを入れãšã«ã‚ªãƒ–ジェクトを制作ä¸ã«ã€ã€Œã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã«æ”¯æ‰•ã†ã€ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã‚’è¨å®š"/> + <ignore name="ignore" text="オブジェクトを作æˆä¸ã«ã€money() スクリプトを入れãšã«ã€Œã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã«æ”¯æ‰•ã†ã€ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã‚’è¨å®šã—ãŸã¨ã"/> </form> </notification> <notification name="OpenObjectCannotCopy"> @@ -1771,16 +1852,16 @@ L$[AMOUNT]ã§ã€ã“ã®ã‚¯ãƒ©ã‚·ãƒ•ァイド広告を今ã™ã公開ã—ã¾ã™ã‹ï </notification> <notification name="WebLaunchAccountHistory"> [http://jp.secondlife.com/account/ マイアカウント] ページã«ç§»å‹•ã—ã¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆå±¥æ´ã‚’確èªã—ã¾ã™ã‹ï¼Ÿ - <usetemplate ignoretext="ブラウザを起動ã—ã¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆå±¥æ´ã‚’見る" name="okcancelignore" notext="å–り消ã—" yestext="ページã«ç§»å‹•"/> + <usetemplate ignoretext="ブラウザを起動ã—ã¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆå±¥æ´ã‚’見るã¨ã" name="okcancelignore" notext="å–り消ã—" yestext="ページã«ç§»å‹•"/> </notification> <notification name="ConfirmQuit"> - 終了ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate ignoretext="終了時ã«ç¢ºèªã™ã‚‹" name="okcancelignore" notext="終了ã—ãªã„" yestext="終了"/> + 終了ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ç¶šã‘ã¾ã™ã‹ï¼Ÿ + <usetemplate ignoretext="終了時ã®ç¢ºèª" name="okcancelignore" notext="終了ã—ãªã„" yestext="終了"/> </notification> <notification name="HelpReportAbuseEmailLL"> ã“ã®ãƒ„ールを利用ã—㦠[http://secondlife.com/corporate/tos.php 利用è¦ç´„] ã‚„ [http://jp.secondlife.com/corporate/cs.php コミュニティスタンダード] ã®é•åã‚’å ±å‘Šã—ã¦ãã ã•ã„。 -å ±å‘Šã•れãŸå«ŒãŒã‚‰ã›ã¯ã™ã¹ã¦èª¿æŸ»ãƒ»è§£æ±ºã•れã¾ã™ã€‚ 解決ã•れãŸã‚‚ã®ã¯ [http://secondlife.com/support/incidentreport.php Incident Report] ã§è¦‹ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ +å ±å‘Šã•れãŸå«ŒãŒã‚‰ã›ã¯ã™ã¹ã¦èª¿æŸ»ãƒ»è§£æ±ºã•れã¾ã™ã€‚ </notification> <notification name="HelpReportAbuseSelectCategory"> 嫌ãŒã‚‰ã›å ±å‘Šã®ã‚«ãƒ†ã‚´ãƒªã‚’é¸æŠžã—ã¦ãã ã•ã„。 @@ -1815,44 +1896,42 @@ L$[AMOUNT]ã§ã€ã“ã®ã‚¯ãƒ©ã‚·ãƒ•ァイド広告を今ã™ã公開ã—ã¾ã™ã‹ï (2) DMCA ã¾ãŸã¯ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®æ’¤åŽ»ã®æ‰‹é † コンテンツを [SECOND_LIFE] ã‹ã‚‰å‰Šé™¤ã—ã¦æ¬²ã—ã„ã¨ã„ã†ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’ã™ã‚‹ã«ã¯ã€å¼Šç¤¾ [http://secondlife.com/corporate/dmca.php DMCA ãƒãƒªã‚·ãƒ¼] ã§æç¤ºã•れã¦ã„ã‚‹ã¨ãŠã‚Šã€æœ‰åйãªä¾µå®³ã®é€šçŸ¥ã‚’æå‡ºã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“。. -ã“ã®ã¾ã¾å«ŒãŒã‚‰ã›ã®å ±å‘Šã‚’ç¶šã‘ãŸã„å ´åˆã¯ã€ã“ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’é–‰ã˜ã¦å ±å‘Šã‚’é€ã£ã¦ãã ã•ã„。 「コピーBotåŠã³æ¨©é™ã®æ‚ªç”¨ã€ã®ã‚«ãƒ†ã‚´ãƒªã‚’é¸ã‚“ã æ–¹ãŒé©åˆ‡ã®å ´åˆãŒã‚りã¾ã™ã€‚ +ã“ã®ã¾ã¾å«ŒãŒã‚‰ã›ã®å ±å‘Šã‚’ç¶šã‘ãŸã„å ´åˆã¯ã€ã“ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’é–‰ã˜ã¦å ±å‘Šã‚’é€ã£ã¦ãã ã•ã„。 「コピー Bot åŠã³æ¨©é™ã®æ‚ªç”¨ã€ã®ã‚«ãƒ†ã‚´ãƒªã‚’é¸ã‚“ã æ–¹ãŒé©åˆ‡ã®å ´åˆãŒã‚りã¾ã™ã€‚ ã”å”力ã‚りãŒã¨ã†ã”ã–ã„ã¾ã™ã€‚ Linden Lab </notification> <notification name="FailedRequirementsCheck"> - 以下ã®å¿…è¦ãªã‚³ãƒ³ãƒãƒ¼ãƒãƒ³ãƒˆãŒã€[FLOATER]ã‹ã‚‰æŠœã‘è½ã¡ã¦ã„ã¾ã™ + 以下ã®å¿…è¦ãªã‚³ãƒ³ãƒãƒ¼ãƒãƒ³ãƒˆãŒã€[FLOATER] ã‹ã‚‰æŠœã‘è½ã¡ã¦ã„ã¾ã™ [COMPONENTS] </notification> <notification label="æ—¢å˜ã®ä»˜å±žå“ã‚’ç½®æ›" name="ReplaceAttachment"> - 体ã®ã“ã®éƒ¨ä½ã«ã¯ã‚ªãƒ–ジェクトãŒè£…ç€ã•れã¦ã„ã¾ã™ã€‚ + 体ã®ã“ã®éƒ¨ä½ã«ã¯æ—¢ã«ã‚ªãƒ–ジェクトãŒè£…ç€ã•れã¦ã„ã¾ã™ã€‚ é¸æŠžã•れãŸã‚ªãƒ–ジェクトã¨ç½®ãæ›ãˆã¾ã™ã‹ï¼Ÿ <form name="form"> - <ignore name="ignore" save_option="true" text="装ç€ã—ã¦ã„るアイテムã¨é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ を入れ替ãˆã‚‹"/> + <ignore name="ignore" save_option="true" text="装ç€ã—ã¦ã„るアイテムã¨é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ を入れ替ãˆã‚‹ã¨ã"/> <button ignore="自動的ã«äº¤æ›" name="Yes" text="OK"/> <button ignore="交æ›ã—ãªã„" name="No" text="ã‚ャンセル"/> </form> </notification> <notification label="å–り込ã¿ä¸ã®è¦å‘Š" name="BusyModePay"> - ç¾åœ¨ã€å–り込ã¿ä¸ã®ãŸã‚ã€ã“ã®æ”¯æ‰•ã„㨠-å¼•ãæ›ãˆã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’å—ã‘å–ã‚‹ã“ã¨ãŒ -ã§ãã¾ã›ã‚“。 + ç¾åœ¨ã€ã€Œå–り込ã¿ä¸ã€ãƒ¢ãƒ¼ãƒ‰ã®ãŸã‚ã€æ”¯æ‰•ã„ã¨å¼•ãæ›ãˆã«ã‚¢ã‚¤ãƒ†ãƒ ã‚’å—ã‘å–ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 -ã“ã®å–引を完了ã™ã‚‹å‰ã«ã€å–り込ã¿ä¸ã®è¨å®šã‚’解除ã—ã¾ã™ã‹ï¼Ÿ +ã“ã®å–引を行ã†ãŸã‚ã«ã€Œå–り込ã¿ä¸ã€ã®è¨å®šã‚’解除ã—ã¾ã™ã‹ï¼Ÿ <form name="form"> - <ignore name="ignore" save_option="true" text="å–り込ã¿ä¸ãƒ¢ãƒ¼ãƒ‰ã®æ™‚ã«æ”¯æ‰•ã‚’ã™ã‚‹"/> - <button ignore="常ã«å–り込ã¿ä¸ã®è¨å®š" name="Yes" text="OK"/> - <button ignore="å–り込ã¿ä¸ã®è¨å®šã«ã—ãªã„" name="No" text="ã‚ャンセル"/> + <ignore name="ignore" save_option="true" text="å–り込ã¿ä¸ãƒ¢ãƒ¼ãƒ‰æ™‚ã«æ”¯æ‰•ã‚’ã™ã‚‹ã¨ã"/> + <button ignore="常ã«ã€Œå–り込ã¿ä¸ã€ã®è¨å®šã‚’解除" name="Yes" text="OK"/> + <button ignore="常ã«ã€Œå–り込ã¿ä¸ã€ã®è¨å®šã‚’継続" name="No" text="ã‚ャンセル"/> </form> </notification> <notification name="ConfirmDeleteProtectedCategory"> 「 [FOLDERNAME] 〠ã¯ã€ã‚·ã‚¹ãƒ†ãƒ フォルダã§ã™ã€‚ システムフォルダを削除ã™ã‚‹ã¨ä¸å®‰å®šã«ãªã‚‹ã“ã¨ãŒã‚りã¾ã™ã€‚ ç¶šã‘ã¾ã™ã‹ï¼Ÿ - <usetemplate ignoretext="システムフォルダを削除ã™ã‚‹å‰ã«ç¢ºèªã™ã‚‹" name="okcancelignore" notext="ã‚ャンセル" yestext="OK"/> + <usetemplate ignoretext="システムフォルダを削除ã™ã‚‹å‰ã®ç¢ºèª" name="okcancelignore" notext="ã‚ャンセル" yestext="OK"/> </notification> <notification name="ConfirmEmptyTrash"> - ã”ã¿ç®±ã®é …目をã™ã¹ã¦å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate ignoretext="æŒã¡ç‰©ã®ã”ã¿ç®±ãƒ•ォルダを空ã«ã™ã‚‹å‰ã«ç¢ºèªã™ã‚‹" name="okcancelignore" notext="ã‚ャンセル" yestext="OK"/> + ã”ã¿ç®±ã®ä¸èº«ã‚’ã™ã¹ã¦å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate ignoretext="æŒã¡ç‰©ã®ã”ã¿ç®±ãƒ•ォルダを空ã«ã™ã‚‹å‰ã®ç¢ºèª" name="okcancelignore" notext="ã‚ャンセル" yestext="OK"/> </notification> <notification name="ConfirmClearBrowserCache"> トラベルã€Webã€æ¤œç´¢ã®å±¥æ´ã‚’ã™ã¹ã¦å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ @@ -1867,16 +1946,16 @@ Linden Lab <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="ã¯ã„"/> </notification> <notification name="ConfirmEmptyLostAndFound"> - 紛失物ã®é …目をã™ã¹ã¦å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate ignoretext="紛失物フォルダを空ã«ã™ã‚‹å‰ã«ç¢ºèªã™ã‚‹" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> + 紛失物ã®ä¸èº«ã‚’ã™ã¹ã¦å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate ignoretext="紛失物フォルダを空ã«ã™ã‚‹å‰ã®ç¢ºèª" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> </notification> <notification name="CopySLURL"> 次㮠SLurl ãŒã‚¯ãƒªãƒƒãƒ—ボードã«ã‚³ãƒ”ーã•れã¾ã—ãŸï¼š [SLURL] -Webページã«ã“れをリンクã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã™ã€‚Webブラウザã®ã‚¢ãƒ‰ãƒ¬ã‚¹ãƒãƒ¼ã«è²¼ã‚Šä»˜ã‘ã¦è©¦ã—ã¦ã¿ã¦ãã ã•ã„。 +Web ページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã™ã€‚Web ブラウザã®ã‚¢ãƒ‰ãƒ¬ã‚¹ãƒãƒ¼ã«è²¼ã‚Šä»˜ã‘ã¦è©¦ã—ã¦ã¿ã¦ãã ã•ã„。 <form name="form"> - <ignore name="ignore" text="クリップボード㫠SLurl ãŒã‚³ãƒ”ーã•れる"/> + <ignore name="ignore" text="クリップボード㫠SLurl をコピーã™ã‚‹ã¨ã"/> </form> </notification> <notification name="WLSavePresetAlert"> @@ -1884,14 +1963,14 @@ Webページã«ã“れをリンクã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚ <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> </notification> <notification name="WLDeletePresetAlert"> - [SKY] を削除ã—ã¾ã™ã‹ï¼Ÿ + 「 [SKY] ã€ã‚’削除ã—ã¾ã™ã‹ï¼Ÿ <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> </notification> <notification name="WLNoEditDefault"> デフォルトã®è¨å®šã‚’編集ã—ãŸã‚Šå‰Šé™¤ã—ãŸã‚Šã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 </notification> <notification name="WLMissingSky"> - ã“ã®ãƒ‡ã‚¤ãƒ»ã‚µã‚¤ã‚¯ãƒ«ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯æ¬¡ã®å˜åœ¨ã—ãªã„「空ã€ãƒ•ァイルをå‚ç…§ã—ã¦ã„ã¾ã™ï¼š [SKY]。 + ã“ã®ãƒ‡ã‚¤ã‚µã‚¤ã‚¯ãƒ«ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯æ¬¡ã®å˜åœ¨ã—ãªã„「空ã€ãƒ•ァイルをå‚ç…§ã—ã¦ã„ã¾ã™ï¼š [SKY]。 </notification> <notification name="PPSaveEffectAlert"> ãƒã‚¹ãƒˆãƒ—ãƒã‚»ã‚¹åŠ¹æžœãŒå˜åœ¨ã—ã¾ã™ã€‚ 上書ãã—ã¾ã™ã‹ï¼Ÿ @@ -1927,7 +2006,7 @@ Webページã«ã“れをリンクã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚ デフォルトã®è¨å®šã‚’編集ã—ãŸã‚Šå‰Šé™¤ã—ãŸã‚Šã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 </notification> <notification name="ChatterBoxSessionStartError"> - [RECIPIENT]ã¨ã®æ–°ã—ã„ãƒãƒ£ãƒƒãƒˆã‚’é–‹å§‹ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ + [RECIPIENT] ã¨æ–°ã—ã„ãƒãƒ£ãƒƒãƒˆã‚’é–‹å§‹ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 [REASON] <usetemplate name="okbutton" yestext="OK"/> </notification> @@ -1937,21 +2016,21 @@ Webページã«ã“れをリンクã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚ <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="ForceCloseChatterBoxSession"> - [NAME]ã¨ã®ãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚’é–‰ã˜ã¾ã™ã€‚ + [NAME] ã¨ã®ãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚’é–‰ã˜ã¾ã™ã€‚ [REASON] <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="Cannot_Purchase_an_Attachment"> - オブジェクトãŒå–り付ã‘られã¦ã„ã‚‹ã¨ãã¯è³¼å…¥ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 + オブジェクトãŒå–り付ã‘られã¦ã„ã‚‹ã¾ã¾ã§ã¯è³¼å…¥ã§ãã¾ã›ã‚“。 </notification> - <notification label="デビット許å¯ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã«ã¤ã„ã¦" name="DebitPermissionDetails"> - ã“ã®è¦æ±‚を許å¯ã™ã‚‹ã¨ã€ã‚¹ã‚¯ãƒªãƒ—トã‹ã‚‰ã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã«ãƒªãƒ³ãƒ‡ãƒ³ãƒ‰ãƒ«ã‚’課金ã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚ -ã“ã®è¨±å¯ã‚’å–り消ã™ã«ã¯ã€ã‚ªãƒ–ジェクトã®ã‚ªãƒ¼ãƒŠãƒ¼ã¯ã‚ªãƒ–ジェクトを削除ã™ã‚‹ã‹ã€ã‚ªãƒ–ジェクトã®ã‚¹ã‚¯ãƒªãƒ—トをリセットã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“。 + <notification label="引ã出ã—許å¯ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã«ã¤ã„ã¦" name="DebitPermissionDetails"> + ã“ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’許å¯ã™ã‚‹ã¨ã€ã‚¹ã‚¯ãƒªãƒ—トã§ã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‹ã‚‰ãƒªãƒ³ãƒ‡ãƒ³ãƒ‰ãƒ«ã‚’引ã出ã›ã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ +ã“ã®è¨±å¯ã‚’å–り消ã™ã«ã¯ã€ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æ‰€æœ‰è€…ãŒã‚ªãƒ–ジェクトを削除ã™ã‚‹ã‹ã€ã‚ªãƒ–ジェクトã®ã‚¹ã‚¯ãƒªãƒ—トをリセットã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“。 <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="AutoWearNewClothing"> - 作æˆã—よã†ã¨ã—ã¦ã„る衣類を自動的ã«è£…ç€ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate ignoretext="「マイ 容姿ã€ã‚’編集ä¸ã«ã€ä½œæˆã™ã‚‹è¡£é¡žã‚’装ç€ã™ã‚‹" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> + 作æˆã™ã‚‹è¡£é¡žã‚’自動的ã«è£…ç€ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate ignoretext="「容姿ã€ã‚’編集ä¸ã«ã€ä½œæˆã™ã‚‹è¡£é¡žã‚’装ç€ã™ã‚‹ã¨ã" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> </notification> <notification name="NotAgeVerified"> 年齢確èªã‚’済ã¾ã›ã¦ã„ãªã„ã¨ã“ã®åŒºç”»ã‚’訪れるã“ã¨ãŒã§ãã¾ã›ã‚“。 [SECOND_LIFE] サイトã§å¹´é½¢ã®ç¢ºèªã‚’行ã„ã¾ã™ã‹ï¼Ÿ @@ -1960,7 +2039,7 @@ Webページã«ã“れをリンクã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚ <url name="url" option="0"> https://secondlife.com/account/verification.php?lang=ja </url> - <usetemplate ignoretext="å¹´é½¢ã®ç¢ºèªã‚’済ã¾ã›ã¦ã„ã¾ã›ã‚“" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> + <usetemplate ignoretext="å¹´é½¢ã®ç¢ºèªã‚’済ã¾ã›ã¦ã„ãªã„ã¨ã" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> </notification> <notification name="Cannot enter parcel: no payment info on file"> æ”¯æ‰•æƒ…å ±ãŒç™»éŒ²ã•れã¦ã„ãªã„ã¨ã“ã®ã‚¨ãƒªã‚¢ã‚’訪れるã“ã¨ãŒã§ãã¾ã›ã‚“。 [SECOND_LIFE] サイトã§ç™»éŒ²ã‚’行ã„ã¾ã™ã‹ï¼Ÿ @@ -1969,53 +2048,61 @@ Webページã«ã“れをリンクã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚ <url name="url" option="0"> https://secondlife.com/account/index.php?lang=ja </url> - <usetemplate ignoretext="æ”¯æ‰•æƒ…å ±ãŒç™»éŒ²ã•れã¦ã„ã¾ã›ã‚“" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> + <usetemplate ignoretext="æ”¯æ‰•æƒ…å ±ãŒç™»éŒ²ã•れã¦ã„ãªã„ã¨ã" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> </notification> <notification name="MissingString"> - æ–‡å—列[STRING_NAME]ãŒstrings.xmlã«å«ã¾ã‚Œã¦ã„ã¾ã›ã‚“ + æ–‡å—列 [STRING_NAME] ㌠strings.xml ã«å«ã¾ã‚Œã¦ã„ã¾ã›ã‚“。 </notification> <notification name="SystemMessageTip"> [MESSAGE] </notification> + <notification name="IMSystemMessageTip"> + [MESSAGE] + </notification> <notification name="Cancelled"> - å–り消ã•れã¾ã—㟠+ å–り消ã•れã¾ã—ãŸã€‚ </notification> <notification name="CancelledSit"> - 座るã®ã‚’å–り消ã•れã¾ã—㟠+ 座るã®ã‚’ã‚„ã‚ã¾ã—ãŸã€‚ </notification> <notification name="CancelledAttach"> - 添付ã¯å–り消ã•れã¾ã—㟠+ 添付ãŒå–り消ã•れã¾ã—ãŸã€‚ </notification> <notification name="ReplacedMissingWearable"> - æ¬ è½ã—ã¦ã„ã‚‹æœï¼èº«ä½“部ä½ã‚’デフォルトã«ç½®æ›ã—ã¾ã™ã€‚ + æ¬ è½ã—ã¦ã„る衣類や身体部ä½ã‚’デフォルトã«ç½®ãæ›ãˆã¾ã™ã€‚ </notification> <notification name="GroupNotice"> - ä»¶å: [SUBJECT], メッセージ: [MESSAGE] + ä»¶å: [SUBJECT]ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ï¼š [MESSAGE] </notification> <notification name="FriendOnline"> - [FIRST] [LAST] ã¯ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ã§ã™ã€‚ + [FIRST] [LAST] ã¯ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ã§ã™ </notification> <notification name="FriendOffline"> - [FIRST] [LAST] ã¯ã‚ªãƒ•ラインã§ã™ã€‚ + [FIRST] [LAST] ã¯ã‚ªãƒ•ラインã§ã™ </notification> <notification name="AddSelfFriend"> 残念ãªãŒã‚‰è‡ªåˆ†è‡ªèº«ã‚’フレンド登録ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 </notification> <notification name="UploadingAuctionSnapshot"> - インワールドã¨ã‚¦ã‚§ãƒ–・サイトã®ã‚¹ãƒŠãƒƒãƒ—ショットをアップãƒãƒ¼ãƒ‰ä¸ã§ã™... -ï¼ˆæ‰€è¦æ™‚間:約5分) + インワールド㨠Web サイトã®ã‚¹ãƒŠãƒƒãƒ—ショットをアップãƒãƒ¼ãƒ‰ä¸ã§ã™... +ï¼ˆæ‰€è¦æ™‚間:約 5 分) + </notification> + <notification name="UploadConfirmation"> + アップãƒãƒ¼ãƒ‰æ–™é‡‘㯠L$[AMOUNT] ã§ã™ã€‚ +ç¶šã‘ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="アップãƒãƒ¼ãƒ‰"/> </notification> <notification name="UploadPayment"> - アップãƒãƒ¼ãƒ‰ã« L$[AMOUNT] 支払ã„ã¾ã—ãŸã€‚ + アップãƒãƒ¼ãƒ‰ã« L$ [AMOUNT] 支払ã„ã¾ã—ãŸã€‚ </notification> <notification name="UploadWebSnapshotDone"> - Webサイトã®ã‚¹ãƒŠãƒƒãƒ—ショットãŒã‚¢ãƒƒãƒ—ãƒãƒ¼ãƒ‰ã•れã¾ã—ãŸã€‚ + Web サイトã®ã‚¹ãƒŠãƒƒãƒ—ショットãŒã‚¢ãƒƒãƒ—ãƒãƒ¼ãƒ‰ã•れã¾ã—ãŸã€‚ </notification> <notification name="UploadSnapshotDone"> インワールドã§ã®ã‚¹ãƒŠãƒƒãƒ—ショットã®ã‚¢ãƒƒãƒ—ãƒãƒ¼ãƒ‰ãŒå®Œäº†ã—ã¾ã—ãŸã€‚ </notification> <notification name="TerrainDownloaded"> - raw地形ãŒãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ã•れã¾ã—㟠+ raw 地形ãŒãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ã•れã¾ã—㟠</notification> <notification name="GestureMissing"> ジェスãƒãƒ£ãƒ¼ã® [NAME] ãŒãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 @@ -2027,11 +2114,11 @@ Webページã«ã“れをリンクã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚ データベースã«ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ãŒã‚りã¾ã›ã‚“。 </notification> <notification name="UnableToLoadLandmark"> - ランドマークをãƒãƒ¼ãƒ‰ã§ãã¾ã›ã‚“。 ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 + ランドマークをèªã¿è¾¼ã‚ã¾ã›ã‚“。 ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 </notification> <notification name="CapsKeyOn"> CapsLock ã‚ãƒ¼ãŒæœ‰åйã«ãªã£ã¦ã„ã¾ã™ã€‚ -パスワードã«å½±éŸ¿ãŒã‚ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。 +パスワードã«å½±éŸ¿ã™ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。 </notification> <notification name="NotecardMissing"> ノートカードãŒãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«ã‚りã¾ã›ã‚“。 @@ -2040,10 +2127,10 @@ Webページã«ã“れをリンクã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚ ã“ã®ãƒŽãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã‚’見る権é™ãŒã‚りã¾ã›ã‚“。 </notification> <notification name="RezItemNoPermissions"> - オブジェクトをrezã™ã‚‹ã«ã¯ãƒ‘ーミッション(承èªï¼‰ãŒä¸è¶³ã—ã¦ã¾ã™ã€‚ + オブジェクトを Rez ã™ã‚‹ã«ã¯æ¨©é™ãŒä¸è¶³ã—ã¦ã„ã¾ã™ã€‚ </notification> <notification name="UnableToLoadNotecard"> - ç¾åœ¨ãƒŽãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã®è³‡ç”£ã‚’ãƒãƒ¼ãƒ‰ã§ãã¾ã›ã‚“。 + ノートカードをèªã¿è¾¼ã‚ã¾ã›ã‚“。ã‚ã¨ã§å†åº¦ãŠè©¦ã—ãã ã•ã„。 </notification> <notification name="ScriptMissing"> データベースã«ã‚¹ã‚¯ãƒªãƒ—トãŒã‚りã¾ã›ã‚“。 @@ -2055,36 +2142,35 @@ Webページã«ã“れをリンクã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚ スクリプトをãƒãƒ¼ãƒ‰ã§ãã¾ã›ã‚“。 ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 </notification> <notification name="IncompleteInventory"> - ã‚ãªãŸã®æä¾›ã™ã‚‹ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯ã€ã“ã®å ´æ‰€ã§ã¯ã¾ã 全部æƒã„ã¾ã›ã‚“。 -å°‘ã—ã—ã¦ã‹ã‚‰ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 + ã‚ãªãŸã®æä¾›ã™ã‚‹ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯ã€ãƒãƒ¼ã‚«ãƒ«ã§ã¯ã¾ã 全部æƒã£ã¦ã„ã¾ã›ã‚“。 +ã—ã°ã‚‰ãã—ã¦ã‹ã‚‰ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 </notification> <notification name="CannotModifyProtectedCategories"> - ä¿è·ã•れãŸã‚«ãƒ†ã‚´ãƒªãƒ¼ã¯ä¿®æ£ã§ãã¾ã›ã‚“。 + ä¿è·ã•れãŸã‚«ãƒ†ã‚´ãƒªã¯ä¿®æ£ã§ãã¾ã›ã‚“。 </notification> <notification name="CannotRemoveProtectedCategories"> - ä¿è·ã•れãŸã‚«ãƒ†ã‚´ãƒªãƒ¼ã¯å‰Šé™¤ã§ãã¾ã›ã‚“。 + ä¿è·ã•れãŸã‚«ãƒ†ã‚´ãƒªã¯å‰Šé™¤ã§ãã¾ã›ã‚“。 </notification> <notification name="OfferedCard"> - ã‚ãªãŸã¯[FIRST] [LAST] ã« -コーリング・カードをé€ã‚Šã¾ã—ãŸã€‚ + [FIRST] [LAST] ã«ã‚³ãƒ¼ãƒªãƒ³ã‚°ã‚«ãƒ¼ãƒ‰ã‚’é€ã‚Šã¾ã—ãŸã€‚ </notification> <notification name="UnableToBuyWhileDownloading"> オブジェクトデータã®ãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ä¸ã¯è³¼å…¥ã§ãã¾ã›ã‚“。 -ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 +ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 </notification> <notification name="UnableToLinkWhileDownloading"> オブジェクトデータã®ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ä¸ã¯ãƒªãƒ³ã‚¯ã§ãã¾ã›ã‚“。 -ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 +ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 </notification> <notification name="CannotBuyObjectsFromDifferentOwners"> - オブジェクトã¯ä¸€åº¦ã«ã¤ãä¸€äººã®æ‰€æœ‰è€…ã‹ã‚‰è³¼å…¥ã§ãã¾ã™ã€‚ + オブジェクトã¯ä¸€åº¦ã«ä¸€äººã®æ‰€æœ‰è€…ã‹ã‚‰è³¼å…¥ã§ãã¾ã™ã€‚ オブジェクトを 1 ã¤ã ã‘é¸ã‚“ã§ãã ã•ã„。 </notification> <notification name="ObjectNotForSale"> ã“ã®ã‚ªãƒ–ジェクトã¯è²©å£²å¯¾è±¡ã§ã¯ã‚りã¾ã›ã‚“。 </notification> <notification name="EnteringGodMode"> - レベル[LEVEL]ã®ã‚´ãƒƒãƒ‰ãƒ»ãƒ¢ãƒ¼ãƒ‰ã«å…¥ã‚Šã¾ã™ + レベル [LEVEL] ã®ã‚´ãƒƒãƒ‰ãƒ¢ãƒ¼ãƒ‰ã«å…¥ã‚Šã¾ã™ </notification> <notification name="LeavingGodMode"> レベル [LEVEL] ã®ã‚´ãƒƒãƒ‰ãƒ¢ãƒ¼ãƒ‰ã‚’解除ã—ã¾ã™ @@ -2093,19 +2179,19 @@ Webページã«ã“れをリンクã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚ ã“れをコピーã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“。 </notification> <notification name="InventoryAccepted"> - [NAME] ãŒã‚ãªãŸãŒæ¸¡ã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã‚’å—ã‘å–りã¾ã—ãŸã€‚ + [NAME] ã¯ã€ã‚ãªãŸãŒæ¸¡ã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã‚’å—ã‘å–りã¾ã—ãŸã€‚ </notification> <notification name="InventoryDeclined"> - [NAME]ã¯ã€æŒã¡ç‰©ã®æä¾›ã‚’æ–りã¾ã—ãŸã€‚ + [NAME] ã¯ã€æŒã¡ç‰©ã®æä¾›ã‚’æ–りã¾ã—ãŸã€‚ </notification> <notification name="ObjectMessage"> [NAME]: [MESSAGE] </notification> <notification name="CallingCardAccepted"> - コーリング・カードãŒå—ç†ã•れã¾ã—ãŸã€‚ + コーリングカードãŒå—ç†ã•れã¾ã—ãŸã€‚ </notification> <notification name="CallingCardDeclined"> - ã‚³ãƒ¼ãƒªãƒ³ã‚°ãƒ»ã‚«ãƒ¼ãƒ‰ãŒæ‹’å¦ã•れã¾ã—ãŸã€‚ + ã‚³ãƒ¼ãƒªãƒ³ã‚°ã‚«ãƒ¼ãƒ‰ãŒæ‹’å¦ã•れã¾ã—ãŸã€‚ </notification> <notification name="TeleportToLandmark"> ç”»é¢å³ã®ã€Œå ´æ‰€ã€ãƒ‘ãƒãƒ«ã‚’é–‹ã„ã¦ã€ã€Œãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã€ã‚¿ãƒ–ã‚’é¸ã¶ã¨ã€[NAME] ã¨ã„ã£ãŸå ´æ‰€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã§ãã¾ã™ã€‚ @@ -2125,7 +2211,7 @@ Webページã«ã“れをリンクã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚ ã‚³ãƒŸãƒ¥ãƒ‹ãƒ†ã‚£ã‚¹ã‚¿ãƒ³ãƒ€ãƒ¼ãƒ‰ã«æ˜Žè¨˜ã•れã¦ã„るコンテンツ制é™ã«ã‚ˆã‚Šã€ã‚ãªãŸã®æ¤œç´¢èªžã®ä¸€éƒ¨ãŒé™¤å¤–ã•れã¾ã—ãŸã€‚ </notification> <notification name="NoContentToSearch"> - å°‘ãªãã¨ã‚‚ã©ã‚Œã‹ä¸€ã¤ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®ç¨®é¡žã‚’é¸æŠžã—ã¦æ¤œç´¢ã‚’行ã£ã¦ãã ã•ã„ã€‚ï¼ˆä¸€èˆ¬ã€æŽ§ãˆã‚ã€ã‚¢ãƒ€ãƒ«ãƒˆï¼‰ + å°‘ãªãã¨ã‚‚ã©ã‚Œã‹ä¸€ã¤ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®ç¨®é¡žã‚’é¸æŠžã—ã¦æ¤œç´¢ã‚’行ã£ã¦ãã ã•ã„。(Generalã€Moderateã€Adult) </notification> <notification name="GroupVote"> [NAME] ã¯æŠ•ç¥¨ã®ç”³è«‹ã‚’ã—ã¦ã„ã¾ã™ï¼š @@ -2153,10 +2239,10 @@ Webページã«ã“れをリンクã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚ </form> </notification> <notification name="TransferObjectsHighlighted"> - ã“ã®åŒºç”»ä¸Šã«å˜åœ¨ã™ã‚‹ã‚ªãƒ–ジェクトã®ã†ã¡ã€ã“ã®åŒºç”»ã®è³¼å…¥è€…ã«è²æ¸¡ã•れるオブジェクトãŒã™ã¹ã¦å¼·èª¿è¡¨ç¤ºã•れã¾ã™ã€‚ + ã“ã®åŒºç”»ã®è³¼å…¥è€…ã«å—ã‘æ¸¡ã•れるオブジェクトã¯ã€ã™ã¹ã¦åŒºç”»ä¸Šã§å¼·èª¿è¡¨ç¤ºã•れã¦ã„ã¾ã™ã€‚ -*è²æ¸¡ã•れる樹木やæ¤ç‰©ã¯ã€å¼·èª¿è¡¨ç¤ºã•れã¾ã›ã‚“。 +*å—ã‘æ¸¡ã•れる樹木やæ¤ç‰©ã¯ã€å¼·èª¿è¡¨ç¤ºã•れã¦ã„ã¾ã›ã‚“。 <form name="form"> <button name="Done" text="完了"/> </form> @@ -2178,42 +2264,42 @@ Webページã«ã“れをリンクã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚ プラグインをインストールã—ãªãŠã™ã‹ã€å•題ãŒè§£æ±ºã—ãªã„å ´åˆã¯ãƒ¡ãƒ¼ã‚«ãƒ¼ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。 <form name="form"> - <ignore name="ignore" text="メディアプラグインã®å®Ÿè¡Œã«å¤±æ•—"/> + <ignore name="ignore" text="メディアプラグインã®å®Ÿè¡Œã«å¤±æ•—ã—ãŸã¨ã"/> </form> </notification> <notification name="OwnedObjectsReturned"> - é¸æŠžã—ãŸåœŸåœ°ã®åŒºç”»ä¸Šã«ã‚ã£ãŸã‚ãªãŸã®ã‚ªãƒ–ジェクトã¯ã€ã‚ãªãŸã®æŒã¡ç‰©ã«è¿”å´ã•れã¾ã—ãŸã€‚ + é¸æŠžã—ãŸåœŸåœ°ã®åŒºç”»ä¸Šã«ã‚ã£ãŸã‚ãªãŸã®ã‚ªãƒ–ジェクトã¯ã€ã™ã¹ã¦ã‚ãªãŸã®ã€ŒæŒã¡ç‰©ã€ã«è¿”å´ã•れã¾ã—ãŸã€‚ </notification> <notification name="OtherObjectsReturned"> - é¸æŠžã•れã¦ã„る土地ã®åŒºç”»ä¸Šã«ã‚ã£ãŸ + é¸æŠžã—ãŸåœŸåœ°ã®åŒºç”»ä¸Šã«ã‚ã£ãŸ [FIRST] [LAST] - ãŒæ‰€æœ‰ã™ã‚‹ã‚ªãƒ–ジェクトã¯ã€ã‚ªãƒ¼ãƒŠãƒ¼ã®æŒã¡ç‰©ã«è¿”å´ã•れã¾ã—ãŸã€‚ + ãŒæ‰€æœ‰ã™ã‚‹ã‚ªãƒ–ジェクトã¯ã€ã™ã¹ã¦æ‰€æœ‰è€…ã®ã€ŒæŒã¡ç‰©ã€ã«è¿”å´ã•れã¾ã—ãŸã€‚ </notification> <notification name="OtherObjectsReturned2"> - 「[NAME]ã€ã¨ã„ã†åå‰ã®ä½äººãŒæ‰€æœ‰ã™ã‚‹ã€é¸æŠžã—ãŸåŒºç”»ã«ã‚るオブジェクトã¯ã€æ‰€æœ‰è€…ã«è¿”å´ã•れã¾ã—ãŸã€‚ + 「 [NAME] ã€ã¨ã„ã†åå‰ã®ä½äººãŒæ‰€æœ‰ã™ã‚‹ã€é¸æŠžã—ãŸåŒºç”»ä¸Šã®ã‚ªãƒ–ジェクトã¯ã€æœ¬äººã«è¿”å´ã•れã¾ã—ãŸã€‚ </notification> <notification name="GroupObjectsReturned"> - é¸æŠžã•れã¦ã„る区画上ã«ã‚りã€[GROUPNAME] ã¨ã„ã†ã‚°ãƒ«ãƒ¼ãƒ—ã¨å…±æœ‰ã ã£ãŸã‚ªãƒ–ジェクトã¯ã€ã‚ªãƒ¼ãƒŠãƒ¼ã®æŒã¡ç‰©ã«è¿”å´ã•れã¾ã—ãŸã€‚ -è²æ¸¡ã•れã¦ã„ãŸè²æ¸¡å¯èƒ½ãªã‚ªãƒ–ジェクトã¯ã€å‰ã®ã‚ªãƒ¼ãƒŠãƒ¼ã«è¿”å´ã•れã¾ã—ãŸã€‚ -グループã«è²æ¸¡ã•れã¦ã„ãŸè²æ¸¡ä¸å¯èƒ½ãªã‚ªãƒ–ジェクトã¯ã€å‰Šé™¤ã•れã¾ã—ãŸã€‚ + é¸æŠžã—ãŸåŒºç”»ä¸Šã®ã€[GROUPNAME] ã¨ã„ã†ã‚°ãƒ«ãƒ¼ãƒ—ã¨å…±æœ‰ã—ã¦ã„ãŸã‚ªãƒ–ジェクトã¯ã€ãれãžã‚Œã®æ‰€æœ‰è€…ã®ã€ŒæŒã¡ç‰©ã€ã«è¿”å´ã•れã¾ã—ãŸã€‚ +è²æ¸¡ã•れã¦ã„ãŸã€Œå†è²©ãƒ»ãƒ—レゼントå¯ã€ã®ã‚ªãƒ–ジェクトã¯ã€ä»¥å‰ã®æ‰€æœ‰è€…ã«è¿”å´ã•れã¾ã—ãŸã€‚ +グループã«è²æ¸¡ã•れã¦ã„ãŸã€Œå†è²©ãƒ»ãƒ—レゼントä¸å¯ã€ã®ã‚ªãƒ–ジェクトã¯ã€å‰Šé™¤ã•れã¾ã—ãŸã€‚ </notification> <notification name="UnOwnedObjectsReturned"> - é¸æŠžã•れãŸåœŸåœ°ã®åŒºç”»ä¸Šã«ã‚りã€ã‚ãªãŸã®æ‰€æœ‰ã§ã€Œãªã‹ã£ãŸã€ã‚ªãƒ–ジェクトã¯ã€æœ¬æ¥ã®ã‚ªãƒ¼ãƒŠãƒ¼ã«è¿”å´ã•れã¾ã—ãŸã€‚ + é¸æŠžã—ãŸåœŸåœ°ã®åŒºç”»ä¸Šã®ã€ã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ã¯ã€Œãªã‹ã£ãŸã€ã‚ªãƒ–ジェクトã¯ã€æœ¬æ¥ã®æ‰€æœ‰è€…ã«è¿”å´ã•れã¾ã—ãŸã€‚ </notification> <notification name="ServerObjectMessage"> [NAME] ã‹ã‚‰ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ï¼š -[MSG] +<nolink>[MSG]</nolink> </notification> <notification name="NotSafe"> ã“ã®åœŸåœ°ã§ã¯ãƒ€ãƒ¡ãƒ¼ã‚¸ãŒæœ‰åйã§ã™ã€‚ -ケガをã™ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。 æ»ã‚“ã§ã—ã¾ã£ãŸå ´åˆã¯ãƒ›ãƒ¼ãƒ ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã•れã¾ã™ã€‚ +ケガをã™ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。 æ»ã‚“ã§ã—ã¾ã£ãŸå ´åˆã¯ã€Œãƒ›ãƒ¼ãƒ ã€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã•れã¾ã™ã€‚ </notification> <notification name="NoFly"> ã“ã®ã‚¨ãƒªã‚¢ã§ã¯é£›è¡ŒãŒç¦æ¢ã•れã¦ã„ã¾ã™ã€‚ ã“ã“ã§ã¯é£›ã¹ã¾ã›ã‚“。 </notification> <notification name="PushRestricted"> - ã“ã®ã‚¨ãƒªã‚¢ã§ã¯ãƒ—ッシュãŒåˆ¶é™ã•れã¦ã„ã¾ã™ã€‚ 土地所有者以外ã¯ä»–人をプッシュã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 + ã“ã®ã‚¨ãƒªã‚¢ã§ã¯ãƒ—ッシュãŒç¦æ¢ã•れã¦ã„ã¾ã™ã€‚ 土地所有者以外ã¯ä»–人をプッシュã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 </notification> <notification name="NoVoice"> ã“ã®ã‚¨ãƒªã‚¢ã§ã¯ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆãŒç„¡åйã§ã™ã€‚ 誰ã‹ãŒè©±ã—ã¦ã„ã‚‹ã®ã‚’èžãã“ã¨ã¯ã§ãã¾ã›ã‚“。 @@ -2222,41 +2308,41 @@ Webページã«ã“れをリンクã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚ ã“ã®ã‚¨ãƒªã‚¢ã§ã¯åˆ¶ä½œãŒç¦æ¢ã•れã¦ã„ã¾ã™ã€‚ オブジェクトを制作ã—ãŸã‚Š Rez ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 </notification> <notification name="ScriptsStopped"> - 管ç†è€…ãŒã“ã®åœ°åŸŸå†…ã®ã‚¹ã‚¯ãƒªãƒ—ãƒˆã‚’ä¸€æ™‚åœæ¢ã•ã›ã¾ã—ãŸã€‚ + 管ç†è€…ãŒã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã®ã‚¹ã‚¯ãƒªãƒ—ãƒˆã‚’ä¸€æ™‚åœæ¢ã—ã¾ã—ãŸã€‚ </notification> <notification name="ScriptsNotRunning"> - ã“ã®åœ°åŸŸã§ã¯ã‚¹ã‚¯ãƒªãƒ—トã®ä½¿ç”¨ãŒç¦æ¢ã•れã¦ã„ã¾ã™ + ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯ã‚¹ã‚¯ãƒªãƒ—トã®ä½¿ç”¨ãŒç¦æ¢ã•れã¦ã„ã¾ã™ã€‚ </notification> <notification name="NoOutsideScripts"> ã“ã®åœŸåœ°ã§ã¯ã€å¤–部ã®ã‚¹ã‚¯ãƒªãƒ—トãŒç¦æ¢ã•れã¦ã„ã¾ã™ã€‚ -土地所有者ã®ã‚‚ã®ä»¥å¤–ã¯ã‚¹ã‚¯ãƒªãƒ—トã¯å®Ÿè¡Œã•れã¾ã›ã‚“。 +土地所有者ã®ã‚‚ã®ä»¥å¤–ã¯ã‚¹ã‚¯ãƒªãƒ—トãŒå®Ÿè¡Œã•れã¾ã›ã‚“。 </notification> <notification name="ClaimPublicLand"> ãã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«ã„ãªã„ã¨å…¬å…±ã®åœŸåœ°ã‚’å–å¾—ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 </notification> <notification name="RegionTPAccessBlocked"> - ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šãã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã¸ã¯å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 年齢確èªã‚’行ã†ã‹ã€æœ€æ–°ãƒ“ューワをインストールã—ã¦ãã ã•ã„。 + ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šãã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã¸ã¯å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 年齢確èªã‚’行ã†ã‹ã€æœ€æ–°ãƒ“ューワをインストールã—ã¦ãã ã•ã„。 ç¾åœ¨ã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã§ã‚¢ã‚¯ã‚»ã‚¹å¯èƒ½ãªã‚¨ãƒªã‚¢ã«é–¢ã™ã‚‹è©³ç´°ã¯ãƒŠãƒ¬ãƒƒã‚¸ãƒ™ãƒ¼ã‚¹ã‚’å‚ç…§ã—ã¦ãã ã•ã„。 </notification> <notification name="URBannedFromRegion"> - ã‚ãªãŸã¯åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã¸ã®ç«‹å…¥ãŒç¦æ¢ã•れã¦ã„ã¾ã™ã€‚ + ã‚ãªãŸã¯ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã¸ã®ç«‹å…¥ãŒç¦æ¢ã•れã¦ã„ã¾ã™ã€‚ </notification> <notification name="NoTeenGridAccess"> ã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã§ã¯ãƒ†ã‚£ãƒ¼ãƒ³ã‚°ãƒªãƒƒãƒ‰ã«æŽ¥ç¶šã§ãã¾ã›ã‚“。 </notification> <notification name="ImproperPaymentStatus"> - ã“ã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã«å…¥ã‚‹ãŸã‚ã«é©ã—ãŸæ”¯æ‰•ã„ステータスãŒã‚りã¾ã›ã‚“。 + ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«å…¥ã‚‹ãŸã‚ã«é©ã—ãŸæ”¯æ‰•ã„ステータスãŒã‚りã¾ã›ã‚“。 </notification> <notification name="MustGetAgeRgion"> - ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«å…¥ã‚‹ã«ã¯å¹´é½¢ç¢ºèªæ¸ˆã¿ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ + ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«å…¥ã‚‹ãŸã‚ã«ã¯ã€å¹´é½¢ç¢ºèªã‚’済ã¾ã›ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ </notification> <notification name="MustGetAgeParcel"> - ã“ã®åŒºç”»ã«å…¥ã‚‹ã«ã¯å¹´é½¢ç¢ºèªæ¸ˆã¿ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ + ã“ã®åŒºç”»ã«å…¥ã‚‹ãŸã‚ã«ã¯ã€å¹´é½¢ç¢ºèªã‚’済ã¾ã›ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ </notification> <notification name="NoDestRegion"> - 目的地ã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ + 目的地ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ </notification> <notification name="NotAllowedInDest"> 目的地ã«å…¥ã‚‹è¨±å¯ãŒã‚りã¾ã›ã‚“。 @@ -2274,20 +2360,20 @@ Webページã«ã“れをリンクã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚ テレãƒãƒ¼ãƒˆãŒã‚ャンセルã•れã¾ã—ãŸã€‚ </notification> <notification name="FullRegionTryAgain"> - å…¥ã‚ã†ã¨ã—ã¦ã„る地域(リージョン)ã¯ç¾åœ¨æº€å“¡ã§ã™ã€‚ + å…¥ã‚ã†ã¨ã—ã¦ã„るリージョンã¯ç¾åœ¨æº€å“¡ã§ã™ã€‚ ã—ã°ã‚‰ãã—ã¦ã‹ã‚‰å†åº¦ãŠè©¦ã—ãã ã•ã„。 </notification> <notification name="GeneralFailure"> よãã‚る失敗 </notification> <notification name="RoutedWrongRegion"> - ç•°ãªã‚‹åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã«è¿‚回ã•れã¾ã—ãŸã€‚ ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 + ç•°ãªã‚‹ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«è¿‚回ã•れã¾ã—ãŸã€‚ ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 </notification> <notification name="NoValidAgentID"> - エージェントIDãŒç„¡åйã§ã™ã€‚ + エージェント ID ãŒç„¡åйã§ã™ã€‚ </notification> <notification name="NoValidSession"> - セッションIDãŒç„¡åйã§ã™ã€‚ + セッション ID ãŒç„¡åйã§ã™ã€‚ </notification> <notification name="NoValidCircuit"> 回路コードãŒç„¡åйã§ã™ã€‚ @@ -2302,7 +2388,7 @@ Webページã«ã“れをリンクã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚ 内部エラーãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ </notification> <notification name="NoGoodTPDestination"> - ã“ã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã§ã¯é©åˆ‡ãªãƒ†ãƒ¬ãƒãƒ¼ãƒˆç›®çš„地ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ + ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯ã€é©åˆ‡ãªãƒ†ãƒ¬ãƒãƒ¼ãƒˆç›®çš„地ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ </notification> <notification name="InternalErrorRegionResolver"> 内部エラーãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ @@ -2314,16 +2400,7 @@ Webページã«ã“れをリンクã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚ 有効ãªåŒºç”»ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ </notification> <notification name="ObjectGiveItem"> - [NAME_SLURL] ãŒæ‰€æœ‰ã™ã‚‹ [OBJECTFROMNAME] ã¨ã„ã†åå‰ã®ã‚ªãƒ–ジェクトãŒã€ã‚ãªãŸã«ã“ã® [OBJECTTYPE] を渡ã—ã¾ã—ãŸï¼š -[ITEM_SLURL] - <form name="form"> - <button name="Keep" text="å—ã‘å–ã‚‹"/> - <button name="Discard" text="ç ´æ£„"/> - <button name="Mute" text="ブãƒãƒƒã‚¯"/> - </form> - </notification> - <notification name="ObjectGiveItemUnknownUser"> - ï¼ˆä¸æ˜Žã®ä½äººï¼‰ãŒæ‰€æœ‰ã™ã‚‹ [OBJECTFROMNAME] ã¨ã„ã†åå‰ã®ã‚ªãƒ–ジェクトãŒã€ã‚ãªãŸã«ã“ã® [OBJECTTYPE] を渡ã—ã¾ã—ãŸï¼š + [NAME_SLURL] ãŒæ‰€æœ‰ã™ã‚‹ [OBJECTFROMNAME] ã¨ã„ã†åå‰ã®ã‚ªãƒ–ジェクトãŒã€ã‚ãªãŸã« [OBJECTTYPE] を渡ã—ã¾ã—ãŸï¼š [ITEM_SLURL] <form name="form"> <button name="Keep" text="å—ã‘å–ã‚‹"/> @@ -2332,7 +2409,7 @@ Webページã«ã“れをリンクã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚ </form> </notification> <notification name="UserGiveItem"> - [NAME_SLURL] ãŒã‚ãªãŸã«ã“ã® [OBJECTTYPE] を渡ã—ã¾ã—ãŸï¼š + [NAME_SLURL] ãŒã‚ãªãŸã« [OBJECTTYPE] を渡ã—ã¾ã—ãŸï¼š [ITEM_SLURL] <form name="form"> <button name="Show" text="表示"/> @@ -2354,9 +2431,9 @@ Webページã«ã“れをリンクã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚ </form> </notification> <notification name="TeleportOffered"> - [NAME] ã¯ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã§ã‚ãªãŸã‚’呼んã§ã„ã¾ã™ã€‚ + [NAME_SLURL] ã¯ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã§ã‚ãªãŸã‚’呼んã§ã„ã¾ã™ã€‚ -[MESSAGE] +[MESSAGE] - [MATURITY_STR] <icon>[MATURITY_ICON]</icon> <form name="form"> <button name="Teleport" text="テレãƒãƒ¼ãƒˆ"/> <button name="Cancel" text="å–り消ã—"/> @@ -2374,40 +2451,44 @@ Webページã«ã“れをリンクã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚ </form> </notification> <notification name="OfferFriendship"> - [NAME]ã¯ã€ -フレンド登録を申ã—込んã§ã„ã¾ã™ã€‚ + [NAME_SLURL] ã¯ãƒ•レンド登録を申ã—込んã§ã„ã¾ã™ã€‚ [MESSAGE] -(デフォルトã§ãŠäº’ã„ã®ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ãƒ»ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ã‚’見るã“ã¨ãŒã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚) +(デフォルトè¨å®šã ã¨ãŠäº’ã„ã®ã‚ªãƒ³ãƒ©ã‚¤ãƒ³çŠ¶æ…‹ã‚’è¦‹ã‚‹ã“ã¨ãŒã§ãã¾ã™ï¼‰ <form name="form"> <button name="Accept" text="å—ã‘入れる"/> <button name="Decline" text="辞退"/> - <button name="Send IM" text="IMã‚’é€ä¿¡"/> </form> </notification> <notification name="FriendshipOffered"> [TO_NAME] ã«ãƒ•レンド登録を申ã—出ã¾ã—ãŸã€‚ </notification> <notification name="OfferFriendshipNoMessage"> - [NAME]ã¯ã€ + [NAME] ã¯ã€ フレンド登録を申ã—込んã§ã„ã¾ã™ã€‚ -(デフォルトã§ãŠäº’ã„ã®ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ãƒ»ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ã‚’見るã“ã¨ãŒã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚) +(デフォルトã§ãŠäº’ã„ã®ã‚ªãƒ³ãƒ©ã‚¤ãƒ³çŠ¶æ…‹ã‚’è¦‹ã‚‹ã“ã¨ãŒã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚) <form name="form"> <button name="Accept" text="å—ã‘入れる"/> <button name="Decline" text="æ‹’å¦"/> </form> </notification> <notification name="FriendshipAccepted"> - [NAME]ã¯ã€ãƒ•レンド 登録をå—ã‘入れã¾ã—ãŸã€‚ + [NAME]ã¯ã€ãƒ•レンド登録をå—ã‘入れã¾ã—ãŸã€‚ </notification> <notification name="FriendshipDeclined"> - [NAME]ã¯ã€ãƒ•レンド 登録をæ–りã¾ã—ãŸã€‚ + [NAME]ã¯ã€ãƒ•レンド登録をæ–りã¾ã—ãŸã€‚ + </notification> + <notification name="FriendshipAcceptedByMe"> + フレンドã®ç™»éŒ²ä¾é ¼ãŒæ‰¿èªã•れã¾ã—ãŸã€‚ + </notification> + <notification name="FriendshipDeclinedByMe"> + フレンドã®ç™»éŒ²ä¾é ¼ãŒæ‹’å¦ã•れã¾ã—ãŸã€‚ </notification> <notification name="OfferCallingCard"> [FIRST] [LAST] ãŒã‚³ãƒ¼ãƒªãƒ³ã‚°ã‚«ãƒ¼ãƒ‰ã‚’渡ãã†ã¨ã—ã¦ã„ã¾ã™ã€‚ -ã‚ãªãŸã®æŒã¡ç‰©ã«ãƒ–ックマークãŒè¿½åŠ ã•れã€ã“ã®ä½äººã«ç´ æ—©ã IM ã‚’é€ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ +ã‚ãªãŸã®ã€ŒæŒã¡ç‰©ã€ã«ãƒ–ックマークãŒè¿½åŠ ã•れã€ã“ã®ä½äººã«ç´ æ—©ã IM ã‚’é€ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ <form name="form"> <button name="Accept" text="å—ã‘入れる"/> <button name="Decline" text="辞退"/> @@ -2422,27 +2503,30 @@ Webページã«ã“れをリンクã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚ ã“ã®ã¾ã¾ã“ã“ã«ã„ã‚‹ã¨ãƒã‚°ã‚¢ã‚¦ãƒˆã•れã¾ã™ã€‚ </notification> <notification name="LoadWebPage"> - ウェブ・ページ[URL]ã‚’ãƒãƒ¼ãƒ‰ã—ã¾ã™ã‹ï¼Ÿ + Web ページ [URL] ã‚’èªã¿è¾¼ã¿ã¾ã™ã‹ï¼Ÿ [MESSAGE] -ãƒãƒ¼ãƒ‰å…ƒã®ã‚ªãƒ–ジェクト:[OBJECTNAME]ã€ã‚ªãƒ¼ãƒŠãƒ¼ï¼š[NAME]? +èªã¿è¾¼ã¿å…ƒã®ã‚ªãƒ–ジェクト:[OBJECTNAME]ã€æ‰€æœ‰è€…:[NAME] <form name="form"> - <button name="Gotopage" text="移動"/> + <button name="Gotopage" text="ページã«ç§»å‹•"/> <button name="Cancel" text="å–り消ã—"/> </form> </notification> <notification name="FailedToFindWearableUnnamed"> - データベースã«[TYPE]ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—㟠+ データベース㫠[TYPE] ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—㟠</notification> <notification name="FailedToFindWearable"> - データベースã«[DESC]ã¨ã„ã†åå‰ã®[TYPE]ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ + データベース㫠[DESC] ã¨ã„ã†åå‰ã® [TYPE] ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ + </notification> + <notification name="ShareToWebFailed"> + Web サイトã¸ã®ç”»åƒã®ã‚¢ãƒƒãƒ—ãƒãƒ¼ãƒ‰ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ </notification> <notification name="InvalidWearable"> ç€ç”¨ã—よã†ã¨ã—ã¦ã„るアイテムã¯ã‚ãªãŸã®ãƒ“ューワã§ã¯èªã¿è¾¼ã‚€ã“ã¨ãŒã§ãã¾ã›ã‚“。 [APP_NAME] ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’アップグレードã—ã¦ã‹ã‚‰ã“ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’ç€ç”¨ã—ã¦ãã ã•ã„。 </notification> <notification name="ScriptQuestion"> - 「[NAME]ã€ãŒæ‰€æœ‰ã™ã‚‹ã‚ªãƒ–ジェクト「[OBJECTNAME]ã€ã‚’: + [NAME] ãŒæ‰€æœ‰ã™ã‚‹ã‚ªãƒ–ジェクト「 [OBJECTNAME] ã€ã‚’: [QUESTIONS] よã‚ã—ã„ã§ã™ã‹ï¼Ÿ @@ -2466,27 +2550,19 @@ Webページã«ã“れをリンクã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚ </form> </notification> <notification name="ScriptDialog"> - [FIRST] [LAST]ã®ã€Œ[TITLE]〠+ [FIRST] [LAST] ã®ã€Œ [TITLE] 〠[MESSAGE] <form name="form"> <button name="Ignore" text="無視ã™ã‚‹"/> </form> </notification> <notification name="ScriptDialogGroup"> - [GROUPNAME]ã®ã€Œ[TITLE]〠+ [GROUPNAME] ã®ã€Œ [TITLE] 〠[MESSAGE] <form name="form"> <button name="Ignore" text="無視ã™ã‚‹"/> </form> </notification> - <notification name="ScriptToast"> - [FIRST] [LAST] ã®ã€Œ [TITLE] ã€ã¯ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚¤ãƒ³ãƒ—ットをリクエストã—ã¦ã„ã¾ã™ã€‚ - <form name="form"> - <button name="Open" text="ダイアãƒã‚°ã‚’é–‹ã"/> - <button name="Ignore" text="無視"/> - <button name="Block" text="ブãƒãƒƒã‚¯"/> - </form> - </notification> <notification name="BuyLindenDollarSuccess"> ãŠæ”¯æ‰•ã‚りãŒã¨ã†ã”ã–ã„ã¾ã™ã€‚ @@ -2496,9 +2572,9 @@ Webページã«ã“れをリンクã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚ </notification> <notification name="FirstOverrideKeys"> ã‚ãªãŸã®ç§»å‹•ã‚ãƒ¼ã‚’ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆãŒæ“作ã—ã¦ã„ã¾ã™ã€‚ -矢å°ã‹AWSDã®ã‚ーã§å‹•作を確èªã—ã¦ãã ã•ã„。 -銃ãªã©ã®ã‚ªãƒ–ジェクトã ã¨ã€ä¸€äººç§°è¦–点(マウスルック)ã«å¤‰æ›´ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ -Mã‚ーを押ã—ã¦å¤‰æ›´ã—ã¾ã™ã€‚ +矢å°ã‹ AWSD ã®ã‚ーã§å‹•作を確èªã—ã¦ãã ã•ã„。 +銃ãªã©ã®ã‚ªãƒ–ジェクトã ã¨ã€ä¸€äººç§°è¦–点ã«å¤‰æ›´ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ +M ã‚ーを押ã—ã¦å¤‰æ›´ã—ã¾ã™ã€‚ </notification> <notification name="FirstSandbox"> ã“ã“ã¯ã‚µãƒ³ãƒ‰ãƒœãƒƒã‚¯ã‚¹ã‚¨ãƒªã‚¢ã§ã™ã€‚ä½äººãŒåˆ¶ä½œã‚’å¦ã¶ã“ã¨ãŒã§ãã¾ã™ã€‚ @@ -2506,7 +2582,7 @@ Mã‚ーを押ã—ã¦å¤‰æ›´ã—ã¾ã™ã€‚ ã“ã“ã§åˆ¶ä½œã•れãŸã‚‚ã®ã¯æ™‚é–“ãŒçµŒã¤ã¨å‰Šé™¤ã•れã¾ã™ã€‚制作ã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã‚’å³ã‚¯ãƒªãƒƒã‚¯ã—ã¦ã€Œå–ã‚‹ã€ã‚’é¸ã³ã€æŒã¡ç‰©ã«å…¥ã‚Œã¦ãŠæŒã¡å¸°ã‚Šã™ã‚‹ã®ã‚’ãŠå¿˜ã‚Œãªã。 </notification> <notification name="MaxListSelectMessage"> - ã“ã®ãƒªã‚¹ãƒˆã‹ã‚‰[MAX_SELECT]個ã¾ã§ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’é¸æŠžã§ãã¾ã™ã€‚ + ã“ã®ãƒªã‚¹ãƒˆã‹ã‚‰ [MAX_SELECT] 個ã¾ã§ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’é¸æŠžã§ãã¾ã™ã€‚ </notification> <notification name="VoiceInviteP2P"> [NAME] ãŒã‚ãªãŸã‚’ボイスãƒãƒ£ãƒƒãƒˆã‚³ãƒ¼ãƒ«ã«æ‹›å¾…ã—ã¦ã„ã¾ã™ã€‚ @@ -2527,7 +2603,7 @@ Mã‚ーを押ã—ã¦å¤‰æ›´ã—ã¾ã™ã€‚ [FIRST] [LAST] ã¯ã‚¢ã‚¤ãƒ†ãƒ ã‚’å—ã‘å–りã€è‡ªå‹•çš„ã«ãƒ–ãƒãƒƒã‚¯ãŒè§£é™¤ã•れã¾ã—ãŸã€‚ </notification> <notification name="VoiceInviteGroup"> - [NAME] 㯠[GROUP]. ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã‚³ãƒ¼ãƒ«ã«å‚åŠ ã—ã¾ã—ãŸã€‚ + [NAME] 㯠[GROUP] ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã‚³ãƒ¼ãƒ«ã«å‚åŠ ã—ã¾ã—ãŸã€‚ å—ã‘入れるをクリックã™ã‚‹ã‹ã€æ–ã‚‹å ´åˆã¯æ‹’å¦ã‚’クリックã—ã¦ãã ã•ã„。 ブãƒãƒƒã‚¯ã‚’クリックã™ã‚‹ã¨ã€ã“ã®ç™ºä¿¡è€…をブãƒãƒƒã‚¯ã—ã¾ã™ã€‚ <form name="form"> <button name="Accept" text="å—ã‘入れる"/> @@ -2554,7 +2630,7 @@ Mã‚ーを押ã—ã¦å¤‰æ›´ã—ã¾ã™ã€‚ </form> </notification> <notification name="VoiceChannelFull"> - ã‚ãªãŸãŒå‚åŠ ã—よã†ã¨ã—ã¦ã„るボイスコール[VOICE_CHANNEL_NAME]ã¯ã€å‚åŠ è€…ãŒæœ€å¤§é™ã«é”ã—ã¾ã—ãŸã€‚後ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 + ã‚ãªãŸãŒå‚åŠ ã—よã†ã¨ã—ã¦ã„るボイスコール [VOICE_CHANNEL_NAME] ã¯ã€å‚åŠ è€…ãŒæœ€å¤§é™ã«é”ã—ã¾ã—ãŸã€‚後ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 </notification> <notification name="ProximalVoiceChannelFull"> ã“ã®ã‚¨ãƒªã‚¢ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã¯ã€æ··é›‘ã®ãŸã‚容é‡ã‚’è¶…ãˆã¦ã—ã¾ã£ã¦ã„ã¾ã™ã€‚申ã—訳ã‚りã¾ã›ã‚“ãŒã€ä»–ã®ã‚¨ãƒªã‚¢ã§ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã‚’ãŠè©¦ã—ãã ã•ã„。 @@ -2575,7 +2651,19 @@ Mã‚ーを押ã—ã¦å¤‰æ›´ã—ã¾ã™ã€‚ [VOICE_CHANNEL_NAME] ã¸ã®æŽ¥ç¶šã«å¤±æ•—ã—ã¾ã—ãŸã€‚ã‚ã¨ã§å†åº¦ãŠè©¦ã—ãã ã•ã„。 「近ãã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã€ã«å†æŽ¥ç¶šã•れã¾ã™ã€‚ </notification> <notification name="VoiceLoginRetry"> - ã‚ãªãŸç”¨ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒ³ãƒãƒ«ã‚’作æˆã—ã¦ã„ã¾ã™ã€‚1分ã»ã©ã‹ã‹ã‚Šã¾ã™ã€‚ + ボイスãƒãƒ£ãƒ³ãƒãƒ«ã‚’作æˆã—ã¦ã„ã¾ã™ã€‚1 分ã»ã©ã‹ã‹ã‚Šã¾ã™ã€‚ + </notification> + <notification name="VoiceEffectsExpired"> + ボイスモーフィング効果ã®1ã¤ã¾ãŸã¯è¤‡æ•°ã®æœ‰åŠ¹æœŸé™ãŒçµ‚了ã—ã¾ã—ãŸã€‚期é™ã‚’延長・更新ã™ã‚‹ã«ã¯[[URL]ã“ã¡ã‚‰ã‚’クリック]ã—ã¦ãã ã•ã„。 + </notification> + <notification name="VoiceEffectsExpiredInUse"> + ãƒœã‚¤ã‚¹ãƒ¢ãƒ¼ãƒ•ã‚£ãƒ³ã‚°åŠ¹æžœã®æœ‰åŠ¹æœŸé™ãŒçµ‚了ã—ãŸãŸã‚ã€ã‚ãªãŸã®é€šå¸¸ã®ãƒœã‚¤ã‚¹è¨å®šãŒé©ç”¨ã•れã¾ã—ãŸã€‚期é™ã‚’延長・更新ã™ã‚‹ã«ã¯[[URL]ã“ã¡ã‚‰ã‚’クリック]ã—ã¦ãã ã•ã„。 + </notification> + <notification name="VoiceEffectsWillExpire"> + ボイスモーフィング効果ã®1ã¤ã¾ãŸã¯è¤‡æ•°ã®æœ‰åŠ¹æœŸé™ãŒ[INTERVAL]日以内ã«çµ‚了ã—ã¾ã™ã€‚期é™ã‚’延長・更新ã™ã‚‹ã«ã¯[[URL]ã“ã¡ã‚‰ã‚’クリック]ã—ã¦ãã ã•ã„。 + </notification> + <notification name="VoiceEffectsNew"> + æ–°ã—ã„ボイスモーフィング効果ãŒç™»å ´ï¼ </notification> <notification name="Cannot enter parcel: not a group member"> 特定ã®ã‚°ãƒ«ãƒ¼ãƒ—メンãƒãƒ¼ã®ã¿ã“ã®ã‚¨ãƒªã‚¢ã‚’訪å•ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ @@ -2584,16 +2672,16 @@ Mã‚ーを押ã—ã¦å¤‰æ›´ã—ã¾ã™ã€‚ ç«‹å…¥ç¦æ¢ã•れã¦ã„ã‚‹ãŸã‚ã€åŒºç”»ã«å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 </notification> <notification name="Cannot enter parcel: not on access list"> - アクセス・リストã«å«ã¾ã‚Œã¦ã„ãªã„ãŸã‚ã€åŒºç”»ã«å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 + アクセスリストã«å«ã¾ã‚Œã¦ã„ãªã„ãŸã‚ã€åŒºç”»ã«å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 </notification> <notification name="VoiceNotAllowed"> - ã‚ãªãŸã«ã¯[VOICE_CHANNEL_NAME]ã®ãƒœã‚¤ã‚¹ãƒ»ãƒãƒ£ãƒƒãƒˆã«æŽ¥ç¶šã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“。 + ã‚ãªãŸã«ã¯ [VOICE_CHANNEL_NAME] ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã«æŽ¥ç¶šã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“。 </notification> <notification name="VoiceCallGenericError"> - [VOICE_CHANNEL_NAME]ã®ãƒœã‚¤ã‚¹ãƒ»ãƒãƒ£ãƒƒãƒˆã«æŽ¥ç¶šä¸ã«ã€ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚後ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 + [VOICE_CHANNEL_NAME] ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã«æŽ¥ç¶šä¸ã«ã€ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚後ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 </notification> <notification name="ServerVersionChanged"> - ç•°ãªã‚‹ã‚µãƒ¼ãƒãƒ¼ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«æ¥ã¾ã—ãŸã€‚パフォーマンスã«å½±éŸ¿ã™ã‚‹ã“ã¨ãŒã‚りã¾ã™ã€‚ [[URL] リリースノートを確èª] + サーãƒãƒ¼ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒç•°ãªã‚‹ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«æ¥ã¾ã—ãŸã€‚パフォーマンスã«å½±éŸ¿ã™ã‚‹ã“ã¨ãŒã‚りã¾ã™ã€‚ [[URL] リリースノートを確èª] </notification> <notification name="UnsupportedCommandSLURL"> クリックã—㟠SLurl ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“。 @@ -2613,7 +2701,7 @@ Mã‚ーを押ã—ã¦å¤‰æ›´ã—ã¾ã™ã€‚ </notification> <notification name="ConfirmCloseAll"> ã™ã¹ã¦ã® IM ã‚’é–‰ã˜ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelignore" notext="ã‚ャンセル" yestext="OK"/> + <usetemplate ignoretext="ã™ã¹ã¦ã® IM ã‚’é–‰ã˜ã‚‹å‰ã®ç¢ºèª" name="okcancelignore" notext="ã‚ャンセル" yestext="OK"/> </notification> <notification name="AttachmentSaved"> アタッãƒãƒ¡ãƒ³ãƒˆãŒä¿å˜ã•れã¾ã—ãŸã€‚ @@ -2642,6 +2730,96 @@ Mã‚ーを押ã—ã¦å¤‰æ›´ã—ã¾ã™ã€‚ é¸æŠžã—ãŸãƒœã‚¿ãƒ³ã‚’ç¾åœ¨è¡¨ç¤ºã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 ã˜ã‚…ã†ã¶ã‚“ãªã‚¹ãƒšãƒ¼ã‚¹ãŒã§ãれã°ãƒœã‚¿ãƒ³ã¯è¡¨ç¤ºã•れã¾ã™ã€‚ </notification> + <notification name="ShareNotification"> + 共有ã™ã‚‹ä½äººã‚’é¸æŠžã—ã¾ã™ã€‚ + </notification> + <notification name="ShareItemsConfirmation"> + 次ã®ã‚¢ã‚¤ãƒ†ãƒ を共有ã—ã¾ã™ã‹ï¼š + +[ITEMS] + +次ã®ä½äººã¨å…±æœ‰ã—ã¾ã™ã‹ï¼š + +[RESIDENTS] + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="ItemsShared"> + アイテムãŒå…±æœ‰ã•れã¾ã—ãŸã€‚ + </notification> + <notification name="DeedToGroupFail"> + グループã¸ã®è²æ¸¡ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ + </notification> + <notification name="AvatarRezNotification"> + (作æˆå¾Œ[EXISTENCE]秒経éŽï¼‰ +'[NAME]'ã¨ã„ã†ã‚¢ãƒã‚¿ãƒ¼ã¯[TIME]秒後ã«å§¿ã‚’ç¾ã‚ã—ã¾ã—ãŸã€‚ + </notification> + <notification name="AvatarRezSelfBakedDoneNotification"> + (作æˆå¾Œ[EXISTENCE]秒経éŽï¼‰ +アウトフィットã®ãƒ™ãƒ¼ã‚¯ã¯[TIME]秒後ã«å®Œäº†ã—ã¾ã—ãŸã€‚ + </notification> + <notification name="AvatarRezSelfBakedUpdateNotification"> + (作æˆå¾Œ[EXISTENCE]秒経éŽï¼‰ +å®¹å§¿ã®æ›´æ–°ã¯[TIME]秒後ã«é€ä¿¡ã•れã¾ã—ãŸã€‚ +[STATUS] + </notification> + <notification name="AvatarRezCloudNotification"> + ( [EXISTENCE] 秒) +ã‚¢ãƒã‚¿ãƒ¼ã€Œ NAME ã€ãŒã‚¯ãƒ©ã‚¦ãƒ‰ã«ãªã‚Šã¾ã—ãŸã€‚ + </notification> + <notification name="AvatarRezArrivedNotification"> + ( [EXISTENCE] 秒) +ã‚¢ãƒã‚¿ãƒ¼ã€Œ NAME ã€ãŒç¾ã‚Œã¾ã—ãŸã€‚ + </notification> + <notification name="AvatarRezLeftCloudNotification"> + ( [EXISTENCE] 秒) +ã‚¢ãƒã‚¿ãƒ¼ã€Œ [NAME] ã€ãŒ [TIME] ç§’ã§ã‚¯ãƒ©ã‚¦ãƒ‰çŠ¶æ…‹ã‹ã‚‰å‡ºç¾ã—ã¾ã™ã€‚ + </notification> + <notification name="AvatarRezEnteredAppearanceNotification"> + ( [EXISTENCE] 秒) +ã‚¢ãƒã‚¿ãƒ¼ã€Œ NAME ã€ãŒå®¹å§¿ç·¨é›†ãƒ¢ãƒ¼ãƒ‰ã«å…¥ã‚Šã¾ã—ãŸã€‚ + </notification> + <notification name="AvatarRezLeftAppearanceNotification"> + ( [EXISTENCE] 秒) +ã‚¢ãƒã‚¿ãƒ¼ã€Œ NAME ã€ãŒå®¹å§¿ç·¨é›†ãƒ¢ãƒ¼ãƒ‰ã‚’解除ã—ã¾ã—ãŸã€‚ + </notification> + <notification name="NoConnect"> + [PROTOCOL] [HOSTID]を使ã£ã¦æŽ¥ç¶šã§ãã¾ã›ã‚“。 +ãŠä½¿ã„ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚„ファイアウォールã®è¨å®šã‚’確èªã—ã¦ãã ã•ã„。 + <form name="form"> + <button name="OK" text="OK"/> + </form> + </notification> + <notification name="NoVoiceConnect"> + ボイスサーãƒãƒ¼ã«æŽ¥ç¶šã§ãã¾ã›ã‚“: + +[HOSTID] + +ボイスãƒãƒ£ãƒƒãƒˆã«ã‚ˆã‚‹ã‚³ãƒŸãƒ¥ãƒ‹ã‚±ãƒ¼ã‚·ãƒ§ãƒ³ãŒåˆ©ç”¨ã§ãã¾ã›ã‚“。 +ãŠä½¿ã„ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚„ファイアウォールã®è¨å®šã‚’確èªã—ã¦ãã ã•ã„。 + <form name="form"> + <button name="OK" text="OK"/> + </form> + </notification> + <notification name="AvatarRezLeftNotification"> + ( [EXISTENCE] 秒) +ã‚¢ãƒã‚¿ãƒ¼ã€Œ NAME ã€ãŒå®Œå…¨ã«èªã¿è¾¼ã¾ã‚Œã¾ã—ãŸã€‚ + </notification> + <notification name="AvatarRezSelfBakeNotification"> + (作æˆå¾Œ[EXISTENCE]秒経éŽï¼‰ +'[BODYREGION]'ã®[RESOLUTION]ã®ãƒ™ãƒ¼ã‚¯ãƒ‰ãƒ†ã‚¯ã‚¹ãƒãƒ£ã¯[TIME]秒後ã«ã‚¢ãƒƒãƒ—ãƒãƒ¼ãƒ‰ã•れã¾ã—ãŸã€‚ + </notification> + <notification name="ConfirmLeaveCall"> + ã“ã®ã‚³ãƒ¼ãƒ«ã‹ã‚‰æŠœã‘ã¾ã™ã‹ï¼Ÿ + <usetemplate ignoretext="コールã‹ã‚‰æŠœã‘ã‚‹å‰ã®ç¢ºèª" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> + </notification> + <notification name="ConfirmMuteAll"> + グループコールã®å‚åŠ è€…å…¨å“¡ã‚’ãƒŸãƒ¥ãƒ¼ãƒˆã—ã¾ã—ãŸã€‚ +ã‚ã¨ã‹ã‚‰ã“ã®ã‚³ãƒ¼ãƒ«ã«å‚åŠ ã™ã‚‹ä½äººã‚‚ +ミュートã•れã¾ã™ã€‚ã‚ãªãŸãŒã‚³ãƒ¼ãƒ«ã‚’終了ã—ã¦ã‚‚ä»–ã®å‚åŠ è€…ã®ãƒŸãƒ¥ãƒ¼ãƒˆçŠ¶æ…‹ãŒç¶šãã¾ã™ã€‚ + +全員をミュートã—ã¾ã™ã‹ï¼Ÿ + <usetemplate ignoretext="グループコールã®å‚åŠ è€…å…¨å“¡ã‚’ãƒŸãƒ¥ãƒ¼ãƒˆã™ã‚‹å‰ã®ç¢ºèª" name="okcancelignore" notext="å–り消ã—" yestext="OK"/> + </notification> <global name="UnsupportedCPU"> - ã‚ãªãŸã® CPU ã®é€Ÿåº¦ã¯å¿…é ˆå‹•ä½œç’°å¢ƒã®æ¡ä»¶ã‚’満ãŸã—ã¦ã„ã¾ã›ã‚“。 </global> @@ -2657,13 +2835,13 @@ Mã‚ーを押ã—ã¦å¤‰æ›´ã—ã¾ã™ã€‚ 510 </global> <global name="UnsupportedGPU"> - - ã‚ãªãŸã®ã‚°ãƒ©ãƒ•ィック・カードã¯å¿…é ˆå‹•ä½œç’°å¢ƒã®æ¡ä»¶ã‚’満ãŸã—ã¦ã„ã¾ã›ã‚“。 + - ã‚ãªãŸã®ã‚°ãƒ©ãƒ•ィックカードã¯å¿…é ˆå‹•ä½œç’°å¢ƒã®æ¡ä»¶ã‚’満ãŸã—ã¦ã„ã¾ã›ã‚“。 </global> <global name="UnsupportedRAM"> - - ã‚ãªãŸã®ã‚·ã‚¹ãƒ†ãƒ ・メモリã¯å¿…é ˆå‹•ä½œç’°å¢ƒã®æ¡ä»¶ã‚’満ãŸã—ã¦ã„ã¾ã›ã‚“。 + - ã‚ãªãŸã®ã‚·ã‚¹ãƒ†ãƒ メモリã¯å¿…é ˆå‹•ä½œç’°å¢ƒã®æ¡ä»¶ã‚’満ãŸã—ã¦ã„ã¾ã›ã‚“。 </global> <global name="You can only set your 'Home Location' on your land or at a mainland Infohub."> - 自分ã®åœŸåœ°ã‚’ãŠæŒã¡ã®å ´åˆã€ãƒ›ãƒ¼ãƒ ãƒã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã«è¨å®šã§ãã¾ã™ã€‚ -ãŠæŒã¡ã§ãªã„å ´åˆã¯ã€åœ°å›³ã§ã€Œã‚¤ãƒ³ãƒ•ã‚©ãƒãƒ–ã€ã‚’探ã—ã¦ãã ã•ã„。 + 自分ã®åœŸåœ°ã‚’ãŠæŒã¡ã®å ´åˆã€ã€Œãƒ›ãƒ¼ãƒ ã€ã«è¨å®šã§ãã¾ã™ã€‚ +ãŠæŒã¡ã§ãªã„å ´åˆã¯ã€åœ°å›³ã§ã€Œã‚¤ãƒ³ãƒ•ã‚©ãƒãƒ–ã€ã‚’ãŠæŽ¢ã—ãã ã•ã„。 </global> </notifications> diff --git a/indra/newview/skins/default/xui/ja/outfit_accordion_tab.xml b/indra/newview/skins/default/xui/ja/outfit_accordion_tab.xml new file mode 100644 index 0000000000..bac885e5d8 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/outfit_accordion_tab.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- *NOTE: mantipov: this xml is intended to be used inside panel_outfits_list.xml for each outfit folder--> +<!-- All accordion tabs in the My Appearance/My Outfits panel will be created from this one at runtume--> +<accordion_tab name="Mockup Tab" title="Mockup Tab"/> diff --git a/indra/newview/skins/default/xui/ja/panel_body_parts_list_item.xml b/indra/newview/skins/default/xui/ja/panel_body_parts_list_item.xml new file mode 100644 index 0000000000..de764d8025 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/panel_body_parts_list_item.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="wearable_item"> + <text name="item_name" value="..."/> +</panel> diff --git a/indra/newview/skins/default/xui/ja/panel_bodyparts_list_button_bar.xml b/indra/newview/skins/default/xui/ja/panel_bodyparts_list_button_bar.xml new file mode 100644 index 0000000000..42d8a21660 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/panel_bodyparts_list_button_bar.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="clothing_list_button_bar_panel"> + <button label="交æ›" name="switch_btn"/> + <button label="è²·ã„物 >" name="bodyparts_shop_btn"/> +</panel> diff --git a/indra/newview/skins/default/xui/ja/panel_bottomtray.xml b/indra/newview/skins/default/xui/ja/panel_bottomtray.xml index 414413a980..04b4893026 100644 --- a/indra/newview/skins/default/xui/ja/panel_bottomtray.xml +++ b/indra/newview/skins/default/xui/ja/panel_bottomtray.xml @@ -1,12 +1,13 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="bottom_tray"> - <string name="SpeakBtnToolTip"> - マイクã®ã‚ªãƒ³ãƒ»ã‚ªãƒ• - </string> - <string name="VoiceControlBtnToolTip"> - ボイスコントãƒãƒ¼ãƒ«ãƒ‘ãƒãƒ«ã®è¡¨ç¤ºãƒ»éžè¡¨ç¤º - </string> + <string name="SpeakBtnToolTip" value="マイクã®ã‚ªãƒ³ãƒ»ã‚ªãƒ•"/> + <string name="VoiceControlBtnToolTip" value="ボイスコントãƒãƒ¼ãƒ«ãƒ‘ãƒãƒ«ã®è¡¨ç¤ºãƒ»éžè¡¨ç¤º"/> <layout_stack name="toolbar_stack"> + <layout_panel name="speak_panel"> + <talk_button name="talk"> + <speak_button label="話ã™" label_selected="話ã™" name="speak_btn"/> + </talk_button> + </layout_panel> <layout_panel name="gesture_panel"> <gesture_combo_list label="ジェスãƒãƒ£ãƒ¼" name="Gesture" tool_tip="ジェスãƒãƒ£ãƒ¼ã®è¡¨ç¤ºãƒ»éžè¡¨ç¤º"/> </layout_panel> @@ -17,11 +18,26 @@ <button label="視界" name="camera_btn" tool_tip="カメラコントãƒãƒ¼ãƒ«ã®è¡¨ç¤ºãƒ»éžè¡¨ç¤º"/> </layout_panel> <layout_panel name="snapshot_panel"> - <button label="" name="snapshots" tool_tip="スナップショットを撮る"/> + <button label="" name="snapshots" tool_tip="スナップショットを撮りã¾ã™"/> + </layout_panel> + <layout_panel name="sidebar_btn_panel"> + <button label="サイドãƒãƒ¼" name="sidebar_btn" tool_tip="サイドãƒãƒ¼ã®è¡¨ç¤ºãƒ»éžè¡¨ç¤º"/> + </layout_panel> + <layout_panel name="build_btn_panel"> + <button label="制作" name="build_btn" tool_tip="制作ツールã®è¡¨ç¤ºãƒ»éžè¡¨ç¤º"/> + </layout_panel> + <layout_panel name="search_btn_panel"> + <button label="検索" name="search_btn" tool_tip="検索ã®è¡¨ç¤ºãƒ»éžè¡¨ç¤º"/> + </layout_panel> + <layout_panel name="world_map_btn_panel"> + <button label="地図" name="world_map_btn" tool_tip="世界地図ã®è¡¨ç¤ºãƒ»éžè¡¨ç¤º"/> + </layout_panel> + <layout_panel name="mini_map_btn_panel"> + <button label="ミニマップ" name="mini_map_btn" tool_tip="ミニマップã®è¡¨ç¤ºãƒ»éžè¡¨ç¤º"/> </layout_panel> <layout_panel name="im_well_panel"> <chiclet_im_well name="im_well"> - <button name="Unread IM messages" tool_tip="Conversations"/> + <button name="Unread IM messages" tool_tip="会話"/> </chiclet_im_well> </layout_panel> <layout_panel name="notification_well_panel"> diff --git a/indra/newview/skins/default/xui/ja/panel_bottomtray_lite.xml b/indra/newview/skins/default/xui/ja/panel_bottomtray_lite.xml new file mode 100644 index 0000000000..6eca8adfe5 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/panel_bottomtray_lite.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="bottom_tray_lite"> + <layout_stack name="toolbar_stack_lite"> + <layout_panel name="gesture_panel"> + <gesture_combo_list label="ジェスãƒãƒ£ãƒ¼" name="Gesture" tool_tip="ジェスãƒãƒ£ãƒ¼ã®è¡¨ç¤ºãƒ»éžè¡¨ç¤º"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/default/xui/ja/panel_classified_info.xml b/indra/newview/skins/default/xui/ja/panel_classified_info.xml index 7fc4e6f674..0aa0e8a8a9 100644 --- a/indra/newview/skins/default/xui/ja/panel_classified_info.xml +++ b/indra/newview/skins/default/xui/ja/panel_classified_info.xml @@ -1,23 +1,54 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="panel_classified_info"> <panel.string name="type_mature"> - 控ãˆã‚ + Moderate </panel.string> <panel.string name="type_pg"> - 一般コンテンツ + 「Generalã€ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ + </panel.string> + <panel.string name="l$_price"> + L$ [PRICE] + </panel.string> + <panel.string name="click_through_text_fmt"> + [TELEPORT] テレãƒãƒ¼ãƒˆã€ [MAP] 地図〠[PROFILE] プãƒãƒ•ィール + </panel.string> + <panel.string name="date_fmt"> + [year,datetime,slt]/[mthnum,datetime,slt]/[day,datetime,slt] + </panel.string> + <panel.string name="auto_renew_on"> + 有効 + </panel.string> + <panel.string name="auto_renew_off"> + 無効 </panel.string> <text name="title" value="ã‚¯ãƒ©ã‚·ãƒ•ã‚¡ã‚¤ãƒ‰åºƒå‘Šæƒ…å ±"/> <scroll_container name="profile_scroll"> <panel name="scroll_content_panel"> - <text name="classified_name" value="[name]"/> - <text name="classified_location" value="[loading...]"/> - <text name="content_type" value="[content type]"/> - <text name="category" value="[category]"/> - <check_box label="毎週自動更新" name="auto_renew"/> - <text name="price_for_listing" tool_tip="æŽ²è¼‰ä¾¡æ ¼"> - L$ [PRICE] - </text> - <text name="classified_desc" value="[description]"/> + <text_editor name="classified_name" value="[name]"/> + <text name="classified_location_label" value="å ´æ‰€ï¼š"/> + <text_editor name="classified_location" value="[loading...]"/> + <text name="content_type_label" value="内容ã®ç¨®é¡žï¼š"/> + <text_editor name="content_type" value="[content type]"/> + <text name="category_label" value="カテゴリ:"/> + <text_editor name="category" value="[category]"/> + <text name="creation_date_label" value="制作日:"/> + <text_editor name="creation_date" tool_tip="制作日" value="[date]"/> + <text name="price_for_listing_label" value="æŽ²è¼‰ä¾¡æ ¼ï¼š"/> + <text_editor name="price_for_listing" tool_tip="æŽ²è¼‰ä¾¡æ ¼" value="[price]"/> + <layout_stack name="descr_stack"> + <layout_panel name="clickthrough_layout_panel"> + <text name="click_through_label" value="クリック数:"/> + <text_editor name="click_through_text" tool_tip="Click through data" value="[clicks]"/> + </layout_panel> + <layout_panel name="price_layout_panel"> + <text name="auto_renew_label" value="自動更新:"/> + <text name="auto_renew" value="有効"/> + </layout_panel> + <layout_panel name="descr_layout_panel"> + <text name="classified_desc_label" value="説明:"/> + <text_editor name="classified_desc" value="[description]"/> + </layout_panel> + </layout_stack> </panel> </scroll_container> <panel name="buttons"> diff --git a/indra/newview/skins/default/xui/ja/panel_clothing_list_button_bar.xml b/indra/newview/skins/default/xui/ja/panel_clothing_list_button_bar.xml new file mode 100644 index 0000000000..2159f17fec --- /dev/null +++ b/indra/newview/skins/default/xui/ja/panel_clothing_list_button_bar.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="clothing_list_button_bar_panel"> + <button label="è¿½åŠ +" name="add_btn"/> + <button label="è²·ã„物 >" name="clothing_shop_btn"/> +</panel> diff --git a/indra/newview/skins/default/xui/ja/panel_clothing_list_item.xml b/indra/newview/skins/default/xui/ja/panel_clothing_list_item.xml new file mode 100644 index 0000000000..de764d8025 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/panel_clothing_list_item.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="wearable_item"> + <text name="item_name" value="..."/> +</panel> diff --git a/indra/newview/skins/default/xui/ja/panel_cof_wearables.xml b/indra/newview/skins/default/xui/ja/panel_cof_wearables.xml new file mode 100644 index 0000000000..b9bc10c220 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/panel_cof_wearables.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="cof_wearables"> + <accordion name="cof_wearables_accordion"> + <accordion_tab name="tab_attachments" title="アタッãƒãƒ¡ãƒ³ãƒˆ"/> + <accordion_tab name="tab_clothing" title="衣類"/> + <accordion_tab name="tab_body_parts" title="身体部ä½"/> + </accordion> +</panel> diff --git a/indra/newview/skins/default/xui/ja/panel_deletable_wearable_list_item.xml b/indra/newview/skins/default/xui/ja/panel_deletable_wearable_list_item.xml new file mode 100644 index 0000000000..91d90a5660 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/panel_deletable_wearable_list_item.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="deletable_wearable_item"> + <text name="item_name" value="..."/> +</panel> diff --git a/indra/newview/skins/default/xui/ja/panel_dummy_clothing_list_item.xml b/indra/newview/skins/default/xui/ja/panel_dummy_clothing_list_item.xml new file mode 100644 index 0000000000..6af84de0c7 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/panel_dummy_clothing_list_item.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="dummy_clothing_item"> + <text name="item_name" value="..."/> +</panel> diff --git a/indra/newview/skins/default/xui/ja/panel_edit_alpha.xml b/indra/newview/skins/default/xui/ja/panel_edit_alpha.xml index 7825d81c53..f2e3e6e993 100644 --- a/indra/newview/skins/default/xui/ja/panel_edit_alpha.xml +++ b/indra/newview/skins/default/xui/ja/panel_edit_alpha.xml @@ -1,9 +1,9 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="edit_alpha_panel"> <panel name="avatar_alpha_color_panel"> - <texture_picker label="アルファ(下)" name="Lower Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/> - <texture_picker label="アルファ(上)" name="Upper Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/> - <texture_picker label="é 部ã®ã‚¢ãƒ«ãƒ•ã‚¡" name="Head Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/> + <texture_picker label="アルファ (下)" name="Lower Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/> + <texture_picker label="アルファ (上)" name="Upper Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/> + <texture_picker label="é 部ã®ã‚¢ ルファ" name="Head Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/> <texture_picker label="ç›®ã®ã‚¢ãƒ«ãƒ•ã‚¡" name="Eye Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/> <texture_picker label="髪ã®ã‚¢ãƒ«ãƒ•ã‚¡" name="Hair Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_edit_classified.xml b/indra/newview/skins/default/xui/ja/panel_edit_classified.xml index 4cb5884f28..5e90076a74 100644 --- a/indra/newview/skins/default/xui/ja/panel_edit_classified.xml +++ b/indra/newview/skins/default/xui/ja/panel_edit_classified.xml @@ -3,12 +3,20 @@ <panel.string name="location_notice"> (掲載後更新) </panel.string> + <string name="publish_label"> + 掲載 + </string> + <string name="save_label"> + ä¿å˜ + </string> <text name="title"> クラシファイド広告ã®ç·¨é›† </text> <scroll_container name="profile_scroll"> <panel name="scroll_content_panel"> - <icon label="" name="edit_icon" tool_tip="クリックã—ã¦ç”»åƒã‚’é¸æŠž"/> + <panel name="snapshot_panel"> + <icon label="" name="edit_icon" tool_tip="クリックã—ã¦ç”»åƒã‚’é¸æŠž"/> + </panel> <text name="Name:"> タイトル: </text> @@ -22,20 +30,19 @@ ãƒãƒ¼ãƒ‡ã‚£ãƒ³ã‚°... </text> <button label="ç¾åœ¨åœ°ã«è¨å®š" name="set_to_curr_location_btn"/> - <combo_box name="content_type"> - <combo_item name="mature_ci"> - 控ãˆã‚コンテンツ - </combo_item> - <combo_item name="pg_ci"> - 一般コンテンツ - </combo_item> - </combo_box> + <text name="category_label" value="カテゴリ:"/> + <text name="content_type_label" value="内容ã®ç¨®é¡žï¼š"/> + <icons_combo_box label="「Generalã€ã‚³ãƒ³ãƒ†ãƒ³ãƒ„" name="content_type"> + <icons_combo_box.item label="「Moderateã€ã‚³ãƒ³ãƒ†ãƒ³ãƒ„" name="mature_ci" value="Mature"/> + <icons_combo_box.item label="「Generalã€ã‚³ãƒ³ãƒ†ãƒ³ãƒ„" name="pg_ci" value="PG"/> + </icons_combo_box> + <text name="price_for_listing_label" value="æŽ²è¼‰ä¾¡æ ¼ï¼š"/> <spinner label="L$" name="price_for_listing" tool_tip="æŽ²è¼‰ä¾¡æ ¼" value="50"/> <check_box label="毎週自動更新" name="auto_renew"/> </panel> </scroll_container> <panel label="bottom_panel" name="bottom_panel"> - <button label="ä¿å˜" name="save_changes_btn"/> + <button label="[LABEL]" name="save_changes_btn"/> <button label="ã‚ャンセル" name="cancel_btn"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_edit_eyes.xml b/indra/newview/skins/default/xui/ja/panel_edit_eyes.xml index 0cee85f685..94967999a1 100644 --- a/indra/newview/skins/default/xui/ja/panel_edit_eyes.xml +++ b/indra/newview/skins/default/xui/ja/panel_edit_eyes.xml @@ -3,7 +3,9 @@ <panel name="avatar_eye_color_panel"> <texture_picker label="çž³" name="Iris" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/> </panel> - <accordion name="wearable_accordion"> - <accordion_tab name="eyes_main_tab" title="ç›®"/> - </accordion> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="eyes_main_tab" title="ç›®"/> + </accordion> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_edit_gloves.xml b/indra/newview/skins/default/xui/ja/panel_edit_gloves.xml index 393bd15236..83e9abca85 100644 --- a/indra/newview/skins/default/xui/ja/panel_edit_gloves.xml +++ b/indra/newview/skins/default/xui/ja/panel_edit_gloves.xml @@ -4,7 +4,9 @@ <texture_picker label="生地" name="Fabric" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/> <color_swatch label="色・色彩é…åˆ" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/> </panel> - <accordion name="wearable_accordion"> - <accordion_tab name="gloves_main_tab" title="手袋"/> - </accordion> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="gloves_main_tab" title="手袋"/> + </accordion> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_edit_hair.xml b/indra/newview/skins/default/xui/ja/panel_edit_hair.xml index 065771df16..f73f760192 100644 --- a/indra/newview/skins/default/xui/ja/panel_edit_hair.xml +++ b/indra/newview/skins/default/xui/ja/panel_edit_hair.xml @@ -3,10 +3,12 @@ <panel name="avatar_hair_color_panel"> <texture_picker label="テクスãƒãƒ£" name="Texture" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠž"/> </panel> - <accordion name="wearable_accordion"> - <accordion_tab name="hair_color_tab" title="色"/> - <accordion_tab name="hair_style_tab" title="スタイル"/> - <accordion_tab name="hair_eyebrows_tab" title="眉毛"/> - <accordion_tab name="hair_facial_tab" title="フェイシャル"/> - </accordion> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="hair_color_tab" title="色"/> + <accordion_tab name="hair_style_tab" title="スタイル"/> + <accordion_tab name="hair_eyebrows_tab" title="眉毛"/> + <accordion_tab name="hair_facial_tab" title="フェイシャル"/> + </accordion> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_edit_jacket.xml b/indra/newview/skins/default/xui/ja/panel_edit_jacket.xml index 96a851cc4c..fe95061e57 100644 --- a/indra/newview/skins/default/xui/ja/panel_edit_jacket.xml +++ b/indra/newview/skins/default/xui/ja/panel_edit_jacket.xml @@ -5,7 +5,9 @@ <texture_picker label="生地・下" name="Lower Fabric" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/> <color_swatch label="色・色彩é…åˆ" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/> </panel> - <accordion name="wearable_accordion"> - <accordion_tab name="jacket_main_tab" title="ジャケット"/> - </accordion> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="jacket_main_tab" title="ジャケット"/> + </accordion> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_edit_pants.xml b/indra/newview/skins/default/xui/ja/panel_edit_pants.xml index f93d3d6b14..9f672337aa 100644 --- a/indra/newview/skins/default/xui/ja/panel_edit_pants.xml +++ b/indra/newview/skins/default/xui/ja/panel_edit_pants.xml @@ -4,7 +4,9 @@ <texture_picker label="生地" name="Fabric" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/> <color_swatch label="色・色彩é…åˆ" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/> </panel> - <accordion name="wearable_accordion"> - <accordion_tab name="pants_main_tab" title="パンツ"/> - </accordion> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="pants_main_tab" title="パンツ"/> + </accordion> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_edit_pick.xml b/indra/newview/skins/default/xui/ja/panel_edit_pick.xml index 88c05fbae7..e58fa979d7 100644 --- a/indra/newview/skins/default/xui/ja/panel_edit_pick.xml +++ b/indra/newview/skins/default/xui/ja/panel_edit_pick.xml @@ -1,5 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="ピック編集" name="panel_edit_pick"> + <panel.string name="location_notice"> + (掲載後更新) + </panel.string> <text name="title"> ピック編集 </text> @@ -22,7 +25,7 @@ </panel> </scroll_container> <panel label="bottom_panel" name="bottom_panel"> - <button label="[WHAT] ã‚’ä¿å˜" name="save_changes_btn"/> + <button label="ピックをä¿å˜" name="save_changes_btn"/> <button label="ã‚ャンセル" name="cancel_btn"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_edit_profile.xml b/indra/newview/skins/default/xui/ja/panel_edit_profile.xml index 2a850ab29c..cd81565acb 100644 --- a/indra/newview/skins/default/xui/ja/panel_edit_profile.xml +++ b/indra/newview/skins/default/xui/ja/panel_edit_profile.xml @@ -42,13 +42,13 @@ <line_editor name="homepage_edit" value="http://"/> <check_box label="æ¤œç´¢çµæžœã«è¡¨ç¤º" name="show_in_search_checkbox"/> <text name="title_acc_status_text" value="マイアカウント:"/> + <text_editor name="acc_status_text" value="ä½äººã€‚ æ”¯æ‰•æƒ…å ±æœªç™»éŒ²ã€‚"/> <text name="my_account_link" value="[[URL] マイアカウントã«ç§»å‹•]"/> - <text name="acc_status_text" value="ä½äººã€‚ æ”¯æ‰•æƒ…å ±æœªç™»éŒ²ã€‚"/> <text name="title_partner_text" value="マイパートナー:"/> - <text name="partner_edit_link" value="[[URL] 編集]"/> <panel name="partner_data_panel"> - <name_box name="partner_text" value="[FIRST] [LAST]"/> + <name_box initial_value="(å–å¾—ä¸ï¼‰" name="partner_text" value="[FIRST] [LAST]"/> </panel> + <text name="partner_edit_link" value="[[URL] 編集]" width="100"/> </panel> </panel> </scroll_container> diff --git a/indra/newview/skins/default/xui/ja/panel_edit_shape.xml b/indra/newview/skins/default/xui/ja/panel_edit_shape.xml index 1e20eb26b6..5a3a949150 100644 --- a/indra/newview/skins/default/xui/ja/panel_edit_shape.xml +++ b/indra/newview/skins/default/xui/ja/panel_edit_shape.xml @@ -1,23 +1,26 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="edit_shape_panel"> - <panel name="avatar_sex_panel"> - <text name="gender_text"> - 性別: - </text> - <radio_group name="sex_radio"> - <radio_item label="女性" name="radio"/> - <radio_item label="男性" name="radio2"/> - </radio_group> + <string name="meters"> + メートル + </string> + <string name="feet"> + フィート + </string> + <string name="height"> + 高ã•: + </string> + <text name="avatar_height"/> + <panel label="シャツ" name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="shape_body_tab" title="身体"/> + <accordion_tab name="shape_head_tab" title="é "/> + <accordion_tab name="shape_eyes_tab" title="ç›®"/> + <accordion_tab name="shape_ears_tab" title="耳"/> + <accordion_tab name="shape_nose_tab" title="é¼»"/> + <accordion_tab name="shape_mouth_tab" title="å£"/> + <accordion_tab name="shape_chin_tab" title="ã‚ã”"/> + <accordion_tab name="shape_torso_tab" title="上åŠèº«"/> + <accordion_tab name="shape_legs_tab" title="脚"/> + </accordion> </panel> - <accordion name="wearable_accordion"> - <accordion_tab name="shape_body_tab" title="身体"/> - <accordion_tab name="shape_head_tab" title="é "/> - <accordion_tab name="shape_eyes_tab" title="ç›®"/> - <accordion_tab name="shape_ears_tab" title="耳"/> - <accordion_tab name="shape_nose_tab" title="é¼»"/> - <accordion_tab name="shape_mouth_tab" title="å£"/> - <accordion_tab name="shape_chin_tab" title="ã‚ã”"/> - <accordion_tab name="shape_torso_tab" title="é "/> - <accordion_tab name="shape_legs_tab" title="脚"/> - </accordion> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_edit_shirt.xml b/indra/newview/skins/default/xui/ja/panel_edit_shirt.xml index b2eb8fa18e..457c0bceb8 100644 --- a/indra/newview/skins/default/xui/ja/panel_edit_shirt.xml +++ b/indra/newview/skins/default/xui/ja/panel_edit_shirt.xml @@ -4,7 +4,9 @@ <texture_picker label="生地" name="Fabric" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠž"/> <color_swatch label="色・色彩é…åˆ" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/> </panel> - <accordion name="wearable_accordion"> - <accordion_tab name="shirt_main_tab" title="シャツ"/> - </accordion> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="shirt_main_tab" title="シャツ"/> + </accordion> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_edit_shoes.xml b/indra/newview/skins/default/xui/ja/panel_edit_shoes.xml index 83e302f8f9..98b4c57fc7 100644 --- a/indra/newview/skins/default/xui/ja/panel_edit_shoes.xml +++ b/indra/newview/skins/default/xui/ja/panel_edit_shoes.xml @@ -4,7 +4,9 @@ <texture_picker label="生地" name="Fabric" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/> <color_swatch label="色・色彩é…åˆ" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/> </panel> - <accordion name="wearable_accordion"> - <accordion_tab name="shoes_main_tab" title="é´"/> - </accordion> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="shoes_main_tab" title="é´"/> + </accordion> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_edit_skin.xml b/indra/newview/skins/default/xui/ja/panel_edit_skin.xml index cd7efbec68..2c554dad94 100644 --- a/indra/newview/skins/default/xui/ja/panel_edit_skin.xml +++ b/indra/newview/skins/default/xui/ja/panel_edit_skin.xml @@ -5,10 +5,12 @@ <texture_picker label="上部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="Upper Tattoos" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠž"/> <texture_picker label="下部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="Lower Tattoos" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠž"/> </panel> - <accordion name="wearable_accordion"> - <accordion_tab name="skin_color_tab" title="肌ã®è‰²"/> - <accordion_tab name="skin_face_tab" title="é¡”ã®è©³ç´°"/> - <accordion_tab name="skin_makeup_tab" title="メイクアップ"/> - <accordion_tab name="skin_body_tab" title="身体ã®è©³ç´°"/> - </accordion> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="skin_color_tab" title="肌ã®è‰²"/> + <accordion_tab name="skin_face_tab" title="é¡”ã®è©³ç´°"/> + <accordion_tab name="skin_makeup_tab" title="メイクアップ"/> + <accordion_tab name="skin_body_tab" title="身体ã®è©³ç´°"/> + </accordion> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_edit_skirt.xml b/indra/newview/skins/default/xui/ja/panel_edit_skirt.xml index 0a0936a3a9..b169bab591 100644 --- a/indra/newview/skins/default/xui/ja/panel_edit_skirt.xml +++ b/indra/newview/skins/default/xui/ja/panel_edit_skirt.xml @@ -4,7 +4,9 @@ <texture_picker label="生地" name="Fabric" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠž"/> <color_swatch label="色・色彩é…åˆ" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/> </panel> - <accordion name="wearable_accordion"> - <accordion_tab name="skirt_main_tab" title="スカート"/> - </accordion> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="skirt_main_tab" title="スカート"/> + </accordion> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_edit_socks.xml b/indra/newview/skins/default/xui/ja/panel_edit_socks.xml index 7cbc75624f..b095257a56 100644 --- a/indra/newview/skins/default/xui/ja/panel_edit_socks.xml +++ b/indra/newview/skins/default/xui/ja/panel_edit_socks.xml @@ -4,7 +4,9 @@ <texture_picker label="生地" name="Fabric" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/> <color_swatch label="色・色彩é…åˆ" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/> </panel> - <accordion name="wearable_accordion"> - <accordion_tab name="socks_main_tab" title="é´ä¸‹"/> - </accordion> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="socks_main_tab" title="é´ä¸‹"/> + </accordion> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_edit_tattoo.xml b/indra/newview/skins/default/xui/ja/panel_edit_tattoo.xml index d6aec87b45..c3f8c12620 100644 --- a/indra/newview/skins/default/xui/ja/panel_edit_tattoo.xml +++ b/indra/newview/skins/default/xui/ja/panel_edit_tattoo.xml @@ -1,8 +1,9 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="edit_tattoo_panel"> <panel name="avatar_tattoo_color_panel"> - <texture_picker label="é 部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="Head Tattoo" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠž"/> - <texture_picker label="上部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="Upper Tattoo" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠž"/> - <texture_picker label="下部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="Lower Tattoo" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠž"/> + <texture_picker label="é 部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="Head Tattoo" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠž" width="70"/> + <texture_picker label="上部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="Upper Tattoo" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠž" width="70"/> + <texture_picker label="下部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="Lower Tattoo" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠž" width="70"/> + <color_swatch label="色・色彩é…åˆ" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_edit_underpants.xml b/indra/newview/skins/default/xui/ja/panel_edit_underpants.xml index 9287463b2c..fec34479c3 100644 --- a/indra/newview/skins/default/xui/ja/panel_edit_underpants.xml +++ b/indra/newview/skins/default/xui/ja/panel_edit_underpants.xml @@ -4,7 +4,9 @@ <texture_picker label="生地" name="Fabric" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/> <color_swatch label="色・色彩é…åˆ" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/> </panel> - <accordion name="wearable_accordion"> - <accordion_tab name="underpants_main_tab" title="下ç€ãƒ‘ンツ"/> - </accordion> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="underpants_main_tab" title="下ç€ãƒ‘ンツ"/> + </accordion> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_edit_undershirt.xml b/indra/newview/skins/default/xui/ja/panel_edit_undershirt.xml index 085ad97384..bd47d89947 100644 --- a/indra/newview/skins/default/xui/ja/panel_edit_undershirt.xml +++ b/indra/newview/skins/default/xui/ja/panel_edit_undershirt.xml @@ -4,7 +4,9 @@ <texture_picker label="生地" name="Fabric" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/> <color_swatch label="色・色彩é…åˆ" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/> </panel> - <accordion name="wearable_accordion"> - <accordion_tab name="undershirt_main_tab" title="下ç€ã‚·ãƒ£ãƒ„"/> - </accordion> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="undershirt_main_tab" title="下ç€ã‚·ãƒ£ãƒ„"/> + </accordion> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_edit_wearable.xml b/indra/newview/skins/default/xui/ja/panel_edit_wearable.xml index 2ae8e1863e..d63f047728 100644 --- a/indra/newview/skins/default/xui/ja/panel_edit_wearable.xml +++ b/indra/newview/skins/default/xui/ja/panel_edit_wearable.xml @@ -72,7 +72,7 @@ <string name="jacket_desc_text"> ジャケット: </string> - <string name="skirt_skirt_desc_text"> + <string name="skirt_desc_text"> スカート: </string> <string name="gloves_desc_text"> @@ -93,6 +93,12 @@ <text name="edit_wearable_title" value="シェイプを編集ä¸"/> <panel label="シャツ" name="wearable_type_panel"> <text name="description_text" value="シェイプ:"/> + <radio_group name="sex_radio"> + <radio_item label="" name="sex_male" tool_tip="男性" value="1"/> + <radio_item label="" name="sex_female" tool_tip="女性" value="0"/> + </radio_group> + <icon name="male_icon" tool_tip="男性"/> + <icon name="female_icon" tool_tip="女性"/> </panel> <panel name="button_panel"> <button label="別åã§ä¿å˜" name="save_as_button"/> diff --git a/indra/newview/skins/default/xui/ja/panel_friends.xml b/indra/newview/skins/default/xui/ja/panel_friends.xml index 80a68f8258..0c7114dbb7 100644 --- a/indra/newview/skins/default/xui/ja/panel_friends.xml +++ b/indra/newview/skins/default/xui/ja/panel_friends.xml @@ -3,8 +3,8 @@ <string name="Multiple"> 複数ã®ãƒ•レンド </string> - <scroll_list name="friend_list" tool_tip="複数ã®ãƒ•ãƒ¬ãƒ³ãƒ‰ã‚’é¸æŠžã™ã‚‹ã«ã¯ã€Shiftã‚ーã¾ãŸã¯Ctrlã‚ーを押ã—ãªãŒã‚‰åå‰ã‚’クリックã—ã¾ã™ã€‚"> - <column name="icon_online_status" tool_tip="オンライン・ステータス"/> + <scroll_list name="friend_list" tool_tip="複数ã®ãƒ•ãƒ¬ãƒ³ãƒ‰ã‚’é¸æŠžã™ã‚‹ã«ã¯ã€Shift ã‚ーã¾ãŸã¯ Ctrl ã‚ーを押ã—ãªãŒã‚‰åå‰ã‚’クリックã—ã¾ã™ã€‚"> + <column name="icon_online_status" tool_tip="オンライン状態"/> <column label="åå‰" name="friend_name" tool_tip="åå‰"/> <column name="icon_visible_online" tool_tip="フレンドã¯ã€ã‚ãªãŸãŒã‚ªãƒ³ãƒ©ã‚¤ãƒ³ã‹ã©ã†ã‹ç¢ºèªã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"/> <column name="icon_visible_map" tool_tip="フレンドã¯ã€åœ°å›³ã§ã‚ãªãŸã®å±…å ´æ‰€ã‚’è¦‹ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"/> @@ -15,18 +15,18 @@ <text name="friend_name_label" right="-10"> ãƒ•ãƒ¬ãƒ³ãƒ‰ã‚’é¸æŠžã—ã¦æ¨©åˆ©ã‚’変更... </text> - <check_box label="オンライン・ステータスã®ç¢ºèªã‚’許å¯ã™ã‚‹" name="online_status_cb" tool_tip="コーリングカードã‚ã‚‹ã„ã¯ãƒ•レンドリストã§ã“ã®ãƒ•レンドãŒã‚ªãƒ³ãƒ©ã‚¤ãƒ³çŠ¶æ…‹ã‚’ç¢ºèªã§ãるよã†è¨å®š"/> - <check_box label="世界地図上ã§ã‚ãªãŸã®å±…å ´æ‰€ã‚’æ¤œç´¢å¯èƒ½ã«ã™ã‚‹" name="map_status_cb" tool_tip="ã“ã®ãƒ•レンドãŒåœ°å›³ã§ç§ã®ä½ç½®ã‚’発見ã§ãるよã†ã«è¨å®š"/> - <check_box label="オブジェクトã®ä¿®æ£ã‚’許å¯ã™ã‚‹" name="modify_status_cb" tool_tip="ã“ã®ãƒ•レンドãŒã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’æ”¹é€ ã§ãる許å¯ã‚’与ãˆã‚‹"/> + <check_box label="オンライン状態ã®ç¢ºèªã‚’許å¯ã™ã‚‹" name="online_status_cb" tool_tip="コーリングカードã‚ã‚‹ã„ã¯ãƒ•レンドリストã§ã“ã®ãƒ•レンドãŒã‚ªãƒ³ãƒ©ã‚¤ãƒ³çŠ¶æ…‹ã‚’ç¢ºèªã§ãるよã†è¨å®šã—ã¾ã™"/> + <check_box label="世界地図上ã§ã‚ãªãŸã®å±…å ´æ‰€ã‚’æ¤œç´¢å¯èƒ½ã«ã™ã‚‹" name="map_status_cb" tool_tip="ã“ã®ãƒ•レンドãŒåœ°å›³ã§ç§ã®ä½ç½®ã‚’発見ã§ãるよã†ã«è¨å®šã—ã¾ã™"/> + <check_box label="オブジェクトã®ä¿®æ£ã‚’許å¯ã™ã‚‹" name="modify_status_cb" tool_tip="ã“ã®ãƒ•レンドã«ç§ã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’æ”¹é€ ã™ã‚‹è¨±å¯ã‚’与ãˆã¾ã™"/> <text name="process_rights_label"> 権利変更をプãƒã‚»ã‚¹ä¸... </text> </panel> <pad left="-95"/> - <button label="IM/コール" name="im_btn" tool_tip="インスタントメッセージ・セッションを開ã" width="90"/> + <button label="IM・コール" name="im_btn" tool_tip="インスタントメッセージセッションを開ãã¾ã™ã€‚" width="90"/> <button label="プãƒãƒ•ィール" name="profile_btn" tool_tip="写真ã€ã‚°ãƒ«ãƒ¼ãƒ—ã€ãŠã‚ˆã³ãã®ä»–ã®æƒ…å ±ã‚’è¡¨ç¤ºã—ã¾ã™ã€‚" width="90"/> - <button label="テレãƒãƒ¼ãƒˆ" name="offer_teleport_btn" tool_tip="ã“ã®ãƒ•レンドã«ã€ã‚ãªãŸã®ç¾åœ¨ã®ãƒã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã¾ã§ã®ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã‚’申ã—出ã¾ã™ã€‚" width="90"/> - <button label="支払ã†" name="pay_btn" tool_tip="リンデンドル (L$) ã‚’ã“ã®ãƒ•レンドã«ã‚ã’ã‚‹" width="90"/> + <button label="テレãƒãƒ¼ãƒˆ" name="offer_teleport_btn" tool_tip="ã“ã®ãƒ•レンドã«ã€ã‚ãªãŸã®ç¾åœ¨åœ°ã¸ã®ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã‚’申ã—出ã¾ã™ã€‚" width="90"/> + <button label="支払ã†" name="pay_btn" tool_tip="リンデンドル (L$) ã‚’ã“ã®ãƒ•レンドã«ã‚ã’ã¾ã™ã€‚" width="90"/> <button label="削除" name="remove_btn" tool_tip="ã“ã®äººç‰©ã‚’フレンドリストã‹ã‚‰å¤–ã—ã¾ã™ã€‚" width="90"/> - <button label="è¿½åŠ " name="add_btn" tool_tip="フレンド登録を申ã—出る" width="90"/> + <button label="è¿½åŠ " name="add_btn" tool_tip="フレンド登録を申ã—出ã¾ã™ã€‚" width="90"/> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_group_control_panel.xml b/indra/newview/skins/default/xui/ja/panel_group_control_panel.xml index 1c89675c1e..f7f575206a 100644 --- a/indra/newview/skins/default/xui/ja/panel_group_control_panel.xml +++ b/indra/newview/skins/default/xui/ja/panel_group_control_panel.xml @@ -5,7 +5,7 @@ <button label="ã‚°ãƒ«ãƒ¼ãƒ—æƒ…å ±" name="group_info_btn"/> </layout_panel> <layout_panel name="call_btn_panel"> - <button label="グループã«ã‚³ãƒ¼ãƒ«" name="call_btn"/> + <button label="グループコール" name="call_btn"/> </layout_panel> <layout_panel name="end_call_btn_panel"> <button label="コール終了" name="end_call_btn"/> diff --git a/indra/newview/skins/default/xui/ja/panel_group_general.xml b/indra/newview/skins/default/xui/ja/panel_group_general.xml index 538f3800bd..bfe69cbdd9 100644 --- a/indra/newview/skins/default/xui/ja/panel_group_general.xml +++ b/indra/newview/skins/default/xui/ja/panel_group_general.xml @@ -9,29 +9,50 @@ 一般的ãªã‚°ãƒ«ãƒ¼ãƒ—æƒ…å ±ãŒå¤‰æ›´ã•れã¾ã—ãŸã€‚ </panel.string> <panel.string name="incomplete_member_data_str"> - メンãƒãƒ¼ãƒ»ãƒ‡ãƒ¼ã‚¿ã‚’検索 + メンãƒãƒ¼ã®ãƒ‡ãƒ¼ã‚¿ã‚’検索 </panel.string> + <panel name="group_info_top"> + <texture_picker label="" name="insignia" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/> + <text name="prepend_founded_by"> + 創è¨è€…: + </text> + <name_box initial_value="(å–å¾—ä¸ï¼‰" name="founder_name"/> + <text name="join_cost_text"> + ç„¡æ–™ + </text> + <button label="å‚åŠ ã—ã¾ã™ï¼" name="btn_join"/> + </panel> <text_editor name="charter"> グループã®ç†å¿µã€æŒ‡é‡ã‚’記入ã—ã¦ãã ã•ã„ </text_editor> <name_list name="visible_members"> <name_list.columns label="メンãƒãƒ¼" name="name"/> <name_list.columns label="タイトル" name="title"/> + <name_list.columns label="ãƒã‚°ã‚¤ãƒ³" name="status"/> </name_list> + <text name="my_group_settngs_label"> + 個人ã®è¨å®š + </text> <text name="active_title_label"> - ç§ã®ã‚¿ã‚¤ãƒˆãƒ« + ç§ã®ã‚¿ã‚¤ãƒˆãƒ«ï¼š </text> <combo_box name="active_title" tool_tip="ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—をアクティブã«ã—ãŸã¨ãã«ã€ã‚¢ãƒã‚¿ãƒ¼åã®ä¸Šã«è¡¨ç¤ºã•れるタイトルをè¨å®šã—ã¾ã™ã€‚"/> <check_box label="グループ通知をå—ä¿¡" name="receive_notices" tool_tip="ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã‹ã‚‰ã®é€šçŸ¥ã‚’å—ä¿¡ã™ã‚‹ã‹ã©ã†ã‹ã®è¨å®šã‚’行ã„ã¾ã™ã€‚ グループã‹ã‚‰ã‚¹ãƒ‘ムãŒé€ã‚‰ã‚Œã¦ãã‚‹å ´åˆã¯ã“ã®ãƒœãƒƒã‚¯ã‚¹ã®ãƒã‚§ãƒƒã‚¯ã‚’外ã—ã¦ãã ã•ã„。"/> <check_box label="プãƒãƒ•ィールã«è¡¨ç¤º" name="list_groups_in_profile" tool_tip="ã‚ãªãŸã®ãƒ—ãƒãƒ•ィールã«ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—を表示ã™ã‚‹ã‹ã©ã†ã‹ã®è¨å®šã‚’行ã„ã¾ã™ã€‚"/> <panel name="preferences_container"> - <check_box label="会員募集" name="open_enrollement" tool_tip="招待ã•れãªãã¦ã‚‚æ–°è¦ãƒ¡ãƒ³ãƒãƒ¼ãŒåŠ å…¥ã§ãã‚‹ã‹ã©ã†ã‹ã‚’è¨å®šã—ã¾ã™ã€‚"/> - <check_box label="入会費" name="check_enrollment_fee" tool_tip="入会費ãŒå¿…è¦ã‹ã©ã†ã‹ã‚’è¨å®šã—ã¾ã™ã€‚"/> + <text name="group_settngs_label"> + グループã®è¨å®š + </text> + <check_box label="誰ã§ã‚‚入会ã§ãã¾ã™" name="open_enrollement" tool_tip="招待ã•れãªãã¦ã‚‚æ–°è¦ãƒ¡ãƒ³ãƒãƒ¼ãŒåŠ å…¥ã§ãã‚‹ã‹ã©ã†ã‹ã‚’è¨å®šã—ã¾ã™ã€‚"/> + <check_box label="入会費ãŒã‹ã‹ã‚Šã¾ã™" name="check_enrollment_fee" tool_tip="入会費ãŒå¿…è¦ã‹ã©ã†ã‹ã‚’è¨å®šã—ã¾ã™ã€‚"/> <spinner label="L$" name="spin_enrollment_fee" tool_tip="「入会費ã€ã«ãƒã‚§ãƒƒã‚¯ãŒå…¥ã£ã¦ã„ã‚‹å ´åˆã€æ–°è¦ãƒ¡ãƒ³ãƒãƒ¼ã¯æŒ‡å®šã•れãŸå…¥ä¼šè²»ã‚’支払ã‚ãªã‘れã°ã‚°ãƒ«ãƒ¼ãƒ—ã«å…¥ã‚Œã¾ã›ã‚“。"/> - <check_box initial_value="true" label="検索ã«è¡¨ç¤º" name="show_in_group_list" tool_tip="ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã‚’æ¤œç´¢çµæžœã«è¡¨ç¤ºã•ã›ã¾ã™"/> - <combo_box name="group_mature_check" tool_tip="ã‚ãªãŸã®ã‚°ãƒ«ãƒ¼ãƒ—ã«ã€ŒæŽ§ãˆã‚ã€ã«ãƒ¬ãƒ¼ãƒˆè¨å®šã•ã‚ŒãŸæƒ…å ±ãŒã‚ã‚‹ã‹ã©ã†ã‹ã‚’è¨å®šã—ã¾ã™"> - <combo_box.item label="一般コンテンツ" name="pg"/> - <combo_box.item label="控ãˆã‚コンテンツ" name="mature"/> + <combo_box name="group_mature_check" tool_tip="ã‚ãªãŸã®ã‚°ãƒ«ãƒ¼ãƒ—ã«ã€ŒModerateã€ã«ãƒ¬ãƒ¼ãƒˆè¨å®šã•ã‚ŒãŸæƒ…å ±ãŒã‚ã‚‹ã‹ã©ã†ã‹ã‚’è¨å®šã—ã¾ã™"> + <combo_item name="select_mature"> + - レーティングã®é¸æŠž - + </combo_item> + <combo_box.item label="「Moderateã€ã‚³ãƒ³ãƒ†ãƒ³ãƒ„" name="mature"/> + <combo_box.item label="「Generalã€ã‚³ãƒ³ãƒ†ãƒ³ãƒ„" name="pg"/> </combo_box> + <check_box initial_value="true" label="検索ã«è¡¨ç¤º" name="show_in_group_list" tool_tip="ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã‚’æ¤œç´¢çµæžœã«è¡¨ç¤ºã•ã›ã¾ã™"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/ja/panel_group_info_sidetray.xml index 0af1ce2ef2..4166108472 100644 --- a/indra/newview/skins/default/xui/ja/panel_group_info_sidetray.xml +++ b/indra/newview/skins/default/xui/ja/panel_group_info_sidetray.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="ã‚°ãƒ«ãƒ¼ãƒ—æƒ…å ±" name="GroupInfo"> <panel.string name="default_needs_apply_text"> - ç¾åœ¨ã®ã‚¿ãƒ–ã«ã¯ã€ä¿å˜ã•れã¦ã„ãªã„変更ãŒã‚りã¾ã™ã€‚ + ä¿å˜ã—ã¦ã„ãªã„変更ãŒã‚りã¾ã™ </panel.string> <panel.string name="want_apply_text"> 変更をä¿å˜ã—ã¾ã™ã‹ï¼Ÿ @@ -12,27 +12,24 @@ <panel.string name="group_join_free"> ç„¡æ–™ </panel.string> - <text name="group_name" value="(ãƒãƒ¼ãƒ‡ã‚£ãƒ³ã‚°...)"/> - <line_editor label="æ–°ã—ã„グループã®åå‰ã‚’入力" name="group_name_editor"/> - <texture_picker label="" name="insignia" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/> - <text name="prepend_founded_by"> - 創始者: - </text> - <name_box initial_value="(å–å¾—ä¸ï¼‰" name="founder_name"/> - <text name="join_cost_text"> - ç„¡æ–™ - </text> - <button label="å‚åŠ ã—ã¾ã™ï¼" name="btn_join"/> - <accordion name="groups_accordion"> - <accordion_tab name="group_general_tab" title="一般"/> - <accordion_tab name="group_roles_tab" title="役割"/> - <accordion_tab name="group_notices_tab" title="通知"/> - <accordion_tab name="group_land_tab" title="土地・資産"/> - </accordion> - <panel name="button_row"> - <button label="作æˆ" label_selected="æ–°ã—ã„グループ" name="btn_create"/> - <button label="グループãƒãƒ£ãƒƒãƒˆ" name="btn_chat"/> - <button label="グループコール" name="btn_call"/> - <button label="ä¿å˜" label_selected="ä¿å˜" name="btn_apply"/> + <panel name="group_info_top"> + <text name="group_name" value="(ãƒãƒ¼ãƒ‡ã‚£ãƒ³ã‚°...)"/> + <line_editor label="æ–°ã—ã„グループã®åå‰ã‚’入力ã—ã¦ãã ã•ã„" name="group_name_editor"/> </panel> + <layout_stack name="layout"> + <layout_panel name="group_accordions"> + <accordion name="groups_accordion"> + <accordion_tab name="group_general_tab" title="一般"/> + <accordion_tab name="group_roles_tab" title="役割"/> + <accordion_tab name="group_notices_tab" title="通知"/> + <accordion_tab name="group_land_tab" title="土地・資産"/> + </accordion> + </layout_panel> + <layout_panel name="button_row"> + <button label="ãƒãƒ£ãƒƒãƒˆ" name="btn_chat"/> + <button label="グループコール" name="btn_call" tool_tip="ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«ã‚³ãƒ¼ãƒ«ã™ã‚‹"/> + <button label="ä¿å˜" label_selected="ä¿å˜" name="btn_apply"/> + <button label="グループを作æˆ" name="btn_create" tool_tip="æ–°ã—ã„グループを作æˆ"/> + </layout_panel> + </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_group_invite.xml b/indra/newview/skins/default/xui/ja/panel_group_invite.xml index dc58359133..a21b340fdd 100644 --- a/indra/newview/skins/default/xui/ja/panel_group_invite.xml +++ b/indra/newview/skins/default/xui/ja/panel_group_invite.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="メンãƒãƒ¼ã‚’招待" name="invite_panel"> <panel.string name="confirm_invite_owner_str"> - æœ¬å½“ã«æ–°ã—ã„æ‰€æœ‰è€…を招待ã—ã¾ã™ã‹?ã“ã®æ“作ã¯å–り消ã—ã§ãã¾ã›ã‚“。 + æœ¬å½“ã«æ–°ã—ã„æ‰€æœ‰è€…を招待ã—ã¾ã™ã‹ï¼Ÿã“ã®æ“作ã¯å–り消ã—ã§ãã¾ã›ã‚“。 </panel.string> <panel.string name="loading"> (ãƒãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ï¼Žï¼Žï¼Ž) diff --git a/indra/newview/skins/default/xui/ja/panel_group_land_money.xml b/indra/newview/skins/default/xui/ja/panel_group_land_money.xml index cfbc51a44e..4b3a7f880b 100644 --- a/indra/newview/skins/default/xui/ja/panel_group_land_money.xml +++ b/indra/newview/skins/default/xui/ja/panel_group_land_money.xml @@ -1,65 +1,65 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="土地ã¨L$" name="land_money_tab"> - <string name="help_text"> + <panel.string name="help_text"> 「土地利用ã®åˆè¨ˆã€ãŒã€Œå¯„付ç·é¡ã€ä»¥ä¸‹ã€ã¾ãŸã¯åŒã˜ã«ãªã‚‹ã¾ã§è¦å‘ŠãŒè¡¨ç¤ºã•れã¾ã™ã€‚ - </string> - <button label="?" name="help_button"/> - <string name="cant_view_group_land_text"> + </panel.string> + <panel.string name="cant_view_group_land_text"> グループ所有地を確èªã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“。 - </string> - <string name="cant_view_group_accounting_text"> + </panel.string> + <panel.string name="epmty_view_group_land_text"> + ãªã— + </panel.string> + <panel.string name="cant_view_group_accounting_text"> グループã®ä¼šè¨ˆæƒ…å ±ã‚’ç¢ºèªã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“。 - </string> - <string name="loading_txt"> + </panel.string> + <panel.string name="loading_txt"> ãƒãƒ¼ãƒ‰ä¸ï¼Žï¼Žï¼Ž - </string> - <text name="group_land_heading"> - グループã®ä¿æœ‰åœ° - </text> - <scroll_list name="group_parcel_list"> - <column label="区画" name="name"/> - <column label="地域(リージョン)" name="location"/> - <column label="種類" name="type"/> - <column label="é¢ç©" name="area"/> - <column label="" name="hidden"/> - </scroll_list> - <button label="地図" label_selected="地図" name="map_button"/> - <text name="total_contributed_land_label"> - 寄付åˆè¨ˆï¼š - </text> - <text name="total_contributed_land_value" width="150"> - [AREA] 平方メートル - </text> - <text name="total_land_in_use_label"> - 土地利用ã®åˆè¨ˆï¼š - </text> - <text name="total_land_in_use_value" width="150"> - [AREA] 平方メートル - </text> - <text name="land_available_label"> - 利用å¯èƒ½ã®åœŸåœ°ï¼š - </text> - <text name="land_available_value" width="150"> - [AREA] 平方メートル - </text> - <text name="your_contribution_label"> - ã‚ãªãŸã®è²¢çŒ®ï¼š - </text> - <string name="land_contrib_error"> + </panel.string> + <panel.string name="land_contrib_error"> 土地ã®è²¢çŒ®ã‚’è¨å®šã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ - </string> - <text name="your_contribution_units"> - 平方メートル - </text> - <text name="your_contribution_max_value"> - (最大 [AMOUNT]) - </text> - <text name="group_over_limit_text"> - 土地を使用ã™ã‚‹ã«ã¯ã€åœŸåœ°ã‚¯ãƒ¬ã‚¸ãƒƒãƒˆãŒã‚‚ã£ã¨å¿…è¦ã§ã™ - </text> - <text name="group_money_heading"> - グループL$ - </text> + </panel.string> + <panel name="layout_panel_landmoney"> + <scroll_list name="group_parcel_list"> + <scroll_list.columns label="区画" name="name"/> + <scroll_list.columns label="地域" name="location"/> + <scroll_list.columns label="種類" name="type"/> + <scroll_list.columns label="é¢ç©" name="area"/> + </scroll_list> + <text name="total_contributed_land_label"> + 寄付åˆè¨ˆï¼š + </text> + <text name="total_contributed_land_value"> + [AREA] 平方メートル + </text> + <button label="地図" label_selected="地図" name="map_button"/> + <text name="total_land_in_use_label"> + 土地利用ã®åˆè¨ˆï¼š + </text> + <text name="total_land_in_use_value"> + [AREA] 平方メートル + </text> + <text name="land_available_label"> + 利用å¯èƒ½ã®åœŸåœ°ï¼š + </text> + <text name="land_available_value"> + [AREA] 平方メートル + </text> + <text name="your_contribution_label"> + ã‚ãªãŸã®è²¢çŒ®ï¼š + </text> + <text name="your_contribution_units"> + m² + </text> + <text name="your_contribution_max_value"> + (最大 [AMOUNT]) + </text> + <text name="group_over_limit_text"> + 土地利用をサãƒãƒ¼ãƒˆã™ã‚‹ãŸã‚ã®åœŸåœ°ã‚¯ãƒ¬ã‚¸ãƒƒãƒˆãŒè¶³ã‚Šã¾ã›ã‚“ + </text> + <text name="group_money_heading"> + グループ㮠L$ + </text> + </panel> <tab_container name="group_money_tab_container"> <panel label="計画" name="group_money_planning_tab"> <text_editor name="group_money_planning_text"> diff --git a/indra/newview/skins/default/xui/ja/panel_group_notices.xml b/indra/newview/skins/default/xui/ja/panel_group_notices.xml index c5168c4d7c..0b508bd79d 100644 --- a/indra/newview/skins/default/xui/ja/panel_group_notices.xml +++ b/indra/newview/skins/default/xui/ja/panel_group_notices.xml @@ -15,23 +15,23 @@ <scroll_list name="notice_list"> <scroll_list.columns label="" name="icon"/> <scroll_list.columns label="ä»¶å" name="subject"/> - <scroll_list.columns label="é€ã‚Šä¸»" name="from"/> + <scroll_list.columns label="é€ä¿¡è€…" name="from"/> <scroll_list.columns label="日付" name="date"/> </scroll_list> <text name="notice_list_none_found"> 見ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—㟠</text> - <button label="æ–°ã—ã„通知を作æˆ" label_selected="æ–°ã—ã„通知を作æˆ" name="create_new_notice" tool_tip="æ–°ã—ã„通知を作æˆ"/> - <button label="æ›´æ–°" label_selected="リスト更新" name="refresh_notices" tool_tip="通知リストを更新"/> + <button label="æ–°ã—ã„通知を作æˆ" label_selected="æ–°ã—ã„通知を作æˆ" name="create_new_notice" tool_tip="æ–°ã—ã„通知を作æˆã—ã¾ã™"/> + <button label="æ›´æ–°" label_selected="リスト更新" name="refresh_notices" tool_tip="通知リストを更新ã—ã¾ã™"/> <panel label="æ–°ã—ã„通知を作æˆ" name="panel_create_new_notice"> <text name="lbl"> - é€šçŸ¥ã‚’ä½œæˆ + 通知ã®ä½œæˆ </text> <text name="lbl3"> ä»¶å: </text> <text name="lbl4"> - メッセージ: + 内容: </text> <text name="lbl5"> 添付: @@ -39,7 +39,8 @@ <text name="string"> ã“ã“ã«ã‚¢ã‚¤ãƒ†ãƒ をドラッグ&ドãƒãƒƒãƒ—ã—ã¦æ·»ä»˜ã—ã¦ãã ã•ã„: </text> - <button label="å–り外ã™" label_selected="添付物を削除" name="remove_attachment"/> + <button label="æŒã¡ç‰©" name="open_inventory" tool_tip="æŒã¡ç‰©ã‚’é–‹ãã¾ã™"/> + <button label="å–り外ã™" label_selected="添付物を削除" name="remove_attachment" tool_tip="ã‚ãªãŸã®é€šçŸ¥ã‹ã‚‰æ·»ä»˜ã•れãŸã‚¢ã‚¤ãƒ†ãƒ を削除ã—ã¾ã™"/> <button label="é€ä¿¡" label_selected="é€ä¿¡" name="send_notice"/> <group_drop_target name="drop_target" tool_tip="æŒã¡ç‰©ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’ã“ã®ãƒœãƒƒã‚¯ã‚¹ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€é€šçŸ¥ã¨ä¸€ç·’ã«é€ã‚Šã¾ã™ã€‚ 添付ã™ã‚‹ã«ã¯ã€ãã®ã‚¢ã‚¤ãƒ†ãƒ ã®ã‚³ãƒ”ーã¨å†è²©ãƒ»ãƒ—ãƒ¬ã‚¼ãƒ³ãƒˆã®æ¨©é™ãŒã‚ãªãŸã«ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚"/> </panel> @@ -54,7 +55,7 @@ ä»¶å: </text> <text name="lbl4"> - メッセージ: + 内容: </text> <button label="添付アイテムを開ã" label_selected="添付物を開ã" name="open_attachment"/> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_group_roles.xml b/indra/newview/skins/default/xui/ja/panel_group_roles.xml index 1f2d28ca4f..8a629be910 100644 --- a/indra/newview/skins/default/xui/ja/panel_group_roles.xml +++ b/indra/newview/skins/default/xui/ja/panel_group_roles.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="メンãƒãƒ¼ã¨å½¹å‰²" name="roles_tab"> <panel.string name="default_needs_apply_text"> - ç¾åœ¨ã®ã‚¿ãƒ–ã«ã¯ã€ä¿å˜ã•れã¦ã„ãªã„変更ãŒã‚りã¾ã™ã€‚ + ä¿å˜ã—ã¦ã„ãªã„変更ãŒã‚りã¾ã™ </panel.string> <panel.string name="want_apply_text"> 変更をä¿å˜ã—ã¾ã™ã‹ï¼Ÿ @@ -17,7 +17,7 @@ Ctrl ã‚ーを押ã—ãªãŒã‚‰ãƒ¡ãƒ³ãƒãƒ¼åをクリックã™ã‚‹ã¨ <name_list name="member_list"> <name_list.columns label="メンãƒãƒ¼" name="name"/> <name_list.columns label="寄付" name="donated"/> - <name_list.columns label="ステータス" name="online"/> + <name_list.columns label="ãƒã‚°ã‚¤ãƒ³" name="online"/> </name_list> <button label="招待" name="member_invite"/> <button label="追放" name="member_eject"/> @@ -44,7 +44,7 @@ Ctrl ã‚ーを押ã—ãªãŒã‚‰ãƒ¡ãƒ³ãƒãƒ¼åをクリックã™ã‚‹ã¨ <filter_editor label="役割をé¸åˆ¥" name="filter_input"/> <scroll_list name="role_list"> <scroll_list.columns label="役割" name="name"/> - <scroll_list.columns label="肩書ã" name="title"/> + <scroll_list.columns label="タイトル" name="title"/> <scroll_list.columns label="#" name="members"/> </scroll_list> <button label="æ–°ã—ã„役割" name="role_create"/> diff --git a/indra/newview/skins/default/xui/ja/panel_groups.xml b/indra/newview/skins/default/xui/ja/panel_groups.xml index 785fd868ab..de81a6431a 100644 --- a/indra/newview/skins/default/xui/ja/panel_groups.xml +++ b/indra/newview/skins/default/xui/ja/panel_groups.xml @@ -1,12 +1,12 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel name="groups"> <text name="groupdesc"> - アクティブãªï½¸ï¾žï¾™ï½°ï¾Œï¾Ÿåã¯å¤ªå—ã§è¡¨ç¤ºã•れã¦ã„ã¾ã™ + アクティブãªã‚°ãƒ«ãƒ¼ãƒ—ã¯å¤ªå—ã§è¡¨ç¤ºã•れã¦ã„ã¾ã™ </text> - <text name="groupcount"> - ã‚ãªãŸã¯[COUNT] ï½¸ï¾žï¾™ï½°ï¾Œï¾Ÿã«æ‰€å±žã—ã¦ã„ã¾ã™ (最大[MAX]) + <text name="groupcount" width="270"> + [COUNT] ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«æ‰€å±žã—ã¦ã„ã¾ã™ (最大[MAX]) </text> - <button label="IM/コール" name="IM" + <button label="IM・コール" name="IM" tool_tip="インスタントメッセージ・セッションを開ã" /> <button label="æƒ…å ±" name="Info" /> <button label="アクティブ" name="Activate" /> diff --git a/indra/newview/skins/default/xui/ja/panel_im_control_panel.xml b/indra/newview/skins/default/xui/ja/panel_im_control_panel.xml index bfadcb13d3..f2429ac12a 100644 --- a/indra/newview/skins/default/xui/ja/panel_im_control_panel.xml +++ b/indra/newview/skins/default/xui/ja/panel_im_control_panel.xml @@ -9,11 +9,14 @@ <button label="フレンド登録" name="add_friend_btn"/> </layout_panel> <layout_panel name="teleport_btn_panel"> - <button label="テレãƒãƒ¼ãƒˆ" name="teleport_btn"/> + <button label="テレãƒãƒ¼ãƒˆ" name="teleport_btn" tool_tip="ã“ã®äººã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã‚’é€ã‚Šã¾ã™"/> </layout_panel> <layout_panel name="share_btn_panel"> <button label="共有" name="share_btn"/> </layout_panel> + <layout_panel name="pay_btn_panel"> + <button label="支払ã†" name="pay_btn"/> + </layout_panel> <layout_panel name="call_btn_panel"> <button label="コール" name="call_btn"/> </layout_panel> diff --git a/indra/newview/skins/default/xui/ja/panel_inventory_item.xml b/indra/newview/skins/default/xui/ja/panel_inventory_item.xml new file mode 100644 index 0000000000..d18047fbcf --- /dev/null +++ b/indra/newview/skins/default/xui/ja/panel_inventory_item.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="inventory_item"> + <text name="item_name" value="..."/> +</panel> diff --git a/indra/newview/skins/default/xui/ja/panel_landmark_info.xml b/indra/newview/skins/default/xui/ja/panel_landmark_info.xml index 9129c66a45..7fca66f90f 100644 --- a/indra/newview/skins/default/xui/ja/panel_landmark_info.xml +++ b/indra/newview/skins/default/xui/ja/panel_landmark_info.xml @@ -18,9 +18,6 @@ <string name="acquired_date"> [year,datetime,local] [mth,datetime,local] [day,datetime,local] [wkday,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] </string> - <string name="icon_PG" value="parcel_drk_PG"/> - <string name="icon_M" value="parcel_drk_M"/> - <string name="icon_R" value="parcel_drk_R"/> <button name="back_btn" tool_tip="戻る"/> <text name="title" value="å ´æ‰€ã®ãƒ—ãƒãƒ•ィール"/> <scroll_container name="place_scroll"> @@ -36,7 +33,7 @@ </panel> <panel name="landmark_edit_panel"> <text name="title_label" value="タイトル:"/> - <text name="notes_label" value="個人的メモ:"/> + <text name="notes_label" value="メモ:"/> <text name="folder_label" value="ランドマークã®ä½ç½®ï¼š"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_landmarks.xml b/indra/newview/skins/default/xui/ja/panel_landmarks.xml index 45767e8c50..993c52b561 100644 --- a/indra/newview/skins/default/xui/ja/panel_landmarks.xml +++ b/indra/newview/skins/default/xui/ja/panel_landmarks.xml @@ -2,13 +2,13 @@ <panel name="Landmarks"> <accordion name="landmarks_accordion"> <accordion_tab name="tab_favorites" title="ãŠæ°—ã«å…¥ã‚Šãƒãƒ¼"/> - <accordion_tab name="tab_landmarks" title="ランドマーク"/> + <accordion_tab name="tab_landmarks" title="マイ ランドマーク"/> <accordion_tab name="tab_inventory" title="æŒã¡ç‰©"/> <accordion_tab name="tab_library" title="ライブラリ"/> </accordion> <panel name="bottom_panel"> - <button name="options_gear_btn" tool_tip="ãã®ä»–ã®ã‚ªãƒ—ションを表示"/> - <button name="add_btn" tool_tip="æ–°ã—ã„ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã‚’è¿½åŠ "/> - <dnd_button name="trash_btn" tool_tip="é¸æŠžã—ãŸãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã‚’削除"/> + <button name="options_gear_btn" tool_tip="ãã®ä»–ã®ã‚ªãƒ—ションを表示ã—ã¾ã™"/> + <button name="add_btn" tool_tip="æ–°ã—ã„ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã‚’è¿½åŠ ã—ã¾ã™"/> + <dnd_button name="trash_btn" tool_tip="é¸æŠžã—ãŸãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã‚’削除ã—ã¾ã™"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_login.xml b/indra/newview/skins/default/xui/ja/panel_login.xml index 82c52abf38..47d7a88b4c 100644 --- a/indra/newview/skins/default/xui/ja/panel_login.xml +++ b/indra/newview/skins/default/xui/ja/panel_login.xml @@ -8,27 +8,23 @@ </panel.string> <layout_stack name="login_widgets"> <layout_panel name="login"> - <text name="first_name_text"> - ファーストãƒãƒ¼ãƒ : + <text name="username_text"> + ユーザーãƒãƒ¼ãƒ : </text> - <line_editor label="最åˆ" name="first_name_edit" tool_tip="[SECOND_LIFE] ファーストãƒãƒ¼ãƒ "/> - <text name="last_name_text"> - ラストãƒãƒ¼ãƒ : - </text> - <line_editor label="最後" name="last_name_edit" tool_tip="[SECOND_LIFE] ラストãƒãƒ¼ãƒ "/> + <line_editor label="ユーザーãƒãƒ¼ãƒ " name="username_edit" tool_tip="[SECOND_LIFE] ユーザーãƒãƒ¼ãƒ "/> <text name="password_text"> パスワード: </text> - <check_box label="記憶ã™ã‚‹" name="remember_check"/> + <check_box label="パスワードを記憶" name="remember_check"/> + <button label="ãƒã‚°ã‚¤ãƒ³" left_pad="30" name="connect_btn" width="60"/> <text name="start_location_text"> 開始地点: </text> - <combo_box name="start_location_combo"> + <combo_box name="start_location_combo" width="160"> <combo_box.item label="最後ã«ãƒã‚°ã‚¢ã‚¦ãƒˆã—ãŸå ´æ‰€" name="MyLastLocation"/> <combo_box.item label="ホーム" name="MyHome"/> <combo_box.item label="<地域åを入力>" name="Typeregionname"/> </combo_box> - <button label="ãƒã‚°ã‚¤ãƒ³" name="connect_btn"/> </layout_panel> <layout_panel name="links"> <text name="create_new_account_text"> diff --git a/indra/newview/skins/default/xui/ja/panel_main_inventory.xml b/indra/newview/skins/default/xui/ja/panel_main_inventory.xml index d533ce5e0d..ff968696b7 100644 --- a/indra/newview/skins/default/xui/ja/panel_main_inventory.xml +++ b/indra/newview/skins/default/xui/ja/panel_main_inventory.xml @@ -1,64 +1,28 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="ã‚‚ã®" name="main inventory panel"> - <panel.string name="Title"> - ã‚‚ã® + <panel.string name="ItemcountFetching"> + [ITEM_COUNT] 個ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’å–å¾—ä¸ã§ã™... [FILTER] </panel.string> + <panel.string name="ItemcountCompleted"> + [ITEM_COUNT] 個ã®ã‚¢ã‚¤ãƒ†ãƒ  [FILTER] + </panel.string> + <text name="ItemcountText"> + アイテム: + </text> <filter_editor label="æŒã¡ç‰©ã‚’フィルター" name="inventory search editor"/> <tab_container name="inventory filter tabs"> <inventory_panel label="æŒã¡ç‰©" name="All Items"/> - <inventory_panel label="最新" name="Recent Items"/> + <recent_inventory_panel label="最新" name="Recent Items"/> </tab_container> - <panel name="bottom_panel"> - <button name="options_gear_btn" tool_tip="ãã®ä»–ã®ã‚ªãƒ—ションを表示"/> - <button name="add_btn" tool_tip="æ–°ã—ã„アイテムã®è¿½åŠ "/> - <dnd_button name="trash_btn" tool_tip="é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ を削除"/> - </panel> - <menu_bar name="Inventory Menu"> - <menu label="ファイル" name="File"> - <menu_item_call label="é–‹ã" name="Open"/> - <menu label="アップãƒãƒ¼ãƒ‰" name="upload"> - <menu_item_call label="ç”»åƒ ï¼ˆL$ [COST] )..." name="Upload Image"/> - <menu_item_call label="サウンド (L$[COST] )..." name="Upload Sound"/> - <menu_item_call label="アニメーション (L$ [COST] )..." name="Upload Animation"/> - <menu_item_call label="一括 (ファイルã«ã¤ã L$[COST] )..." name="Bulk Upload"/> - </menu> - <menu_item_call label="æ–°ã—ã„ウィンドウ" name="New Window"/> - <menu_item_call label="フィルターを表示" name="Show Filters"/> - <menu_item_call label="フィルターをリセット" name="Reset Current"/> - <menu_item_call label="ã™ã¹ã¦ã®ãƒ•ォルダを閉ã˜ã‚‹" name="Close All Folders"/> - <menu_item_call label="ã”ã¿ç®±ã‚’空ã«ã™ã‚‹" name="Empty Trash"/> - <menu_item_call label="紛失物を空ã«ã™ã‚‹" name="Empty Lost And Found"/> - </menu> - <menu label="æ–°è¦ä½œæˆ" name="Create"> - <menu_item_call label="フォルダ" name="New Folder"/> - <menu_item_call label="スクリプト" name="New Script"/> - <menu_item_call label="æ–°ã—ã„ノートカード" name="New Note"/> - <menu_item_call label="ジェスãƒãƒ£ãƒ¼" name="New Gesture"/> - <menu label="衣類" name="New Clothes"> - <menu_item_call label="シャツ" name="New Shirt"/> - <menu_item_call label="パンツ" name="New Pants"/> - <menu_item_call label="é´" name="New Shoes"/> - <menu_item_call label="é´ä¸‹" name="New Socks"/> - <menu_item_call label="ジャケット" name="New Jacket"/> - <menu_item_call label="シャツ" name="New Skirt"/> - <menu_item_call label="手袋" name="New Gloves"/> - <menu_item_call label="下ç€ï¼ˆä¸Šï¼‰" name="New Undershirt"/> - <menu_item_call label="下ç€ï¼ˆä¸‹ï¼‰" name="New Underpants"/> - <menu_item_call label="アルファ" name="New Alpha"/> - <menu_item_call label="タトゥ" name="New Tattoo"/> - </menu> - <menu label="身体部ä½" name="New Body Parts"> - <menu_item_call label="シェイプ(体型)" name="New Shape"/> - <menu_item_call label="スã‚ン" name="New Skin"/> - <menu_item_call label="髪" name="New Hair"/> - <menu_item_call label="ç›®" name="New Eyes"/> - </menu> - </menu> - <menu label="ä¸¦ã¹æ›¿ãˆ" name="Sort"> - <menu_item_check label="åå‰é †" name="By Name"/> - <menu_item_check label="æ—¥ä»˜é †" name="By Date"/> - <menu_item_check label="フォルダを常ã«åå‰é †ã«ä¸¦ã¹ã‚‹" name="Folders Always By Name"/> - <menu_item_check label="システムフォルダを上ã«ä¸¦ã¹ã‚‹" name="System Folders To Top"/> - </menu> - </menu_bar> + <layout_stack name="bottom_panel"> + <layout_panel name="options_gear_btn_panel"> + <button name="options_gear_btn" tool_tip="オプションを表示ã—ã¾ã™"/> + </layout_panel> + <layout_panel name="add_btn_panel"> + <button name="add_btn" tool_tip="æ–°ã—ã„ã‚¢ã‚¤ãƒ†ãƒ ã‚’è¿½åŠ ã—ã¾ã™"/> + </layout_panel> + <layout_panel name="trash_btn_panel"> + <dnd_button name="trash_btn" tool_tip="é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ を削除ã—ã¾ã™"/> + </layout_panel> + </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_me.xml b/indra/newview/skins/default/xui/ja/panel_me.xml index fe51d8507d..dda5bc0009 100644 --- a/indra/newview/skins/default/xui/ja/panel_me.xml +++ b/indra/newview/skins/default/xui/ja/panel_me.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="マイ プãƒãƒ•ィール" name="panel_me"> <tab_container name="tabs"> - <panel label="プãƒãƒ•ィール" name="panel_profile"/> - <panel label="ピック" name="panel_picks"/> + <panel label="マイ プãƒãƒ•ィール" name="panel_profile"/> + <panel label="マイ ピック" name="panel_picks"/> </tab_container> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_media_settings_general.xml b/indra/newview/skins/default/xui/ja/panel_media_settings_general.xml index 74e414c381..6321dbb048 100644 --- a/indra/newview/skins/default/xui/ja/panel_media_settings_general.xml +++ b/indra/newview/skins/default/xui/ja/panel_media_settings_general.xml @@ -15,14 +15,14 @@ </text> <text name="current_url" tool_tip="メディアソースã®ç¾åœ¨ã®ãƒšãƒ¼ã‚¸" value=""/> <button label="リセット" name="current_url_reset_btn"/> - <check_box initial_value="false" label="自動ループ" name="auto_loop"/> - <check_box initial_value="false" label="最åˆã®ã‚¯ãƒªãƒƒã‚¯" name="first_click_interact"/> + <check_box initial_value="false" label="ループå†ç”Ÿ" name="auto_loop"/> + <check_box initial_value="false" label="最åˆã«ã‚¯ãƒªãƒƒã‚¯ã—ãŸã¨ãã®å‹•作" name="first_click_interact"/> <check_box initial_value="false" label="自動ズーム" name="auto_zoom"/> <check_box initial_value="false" label="自動メディアå†ç”Ÿ" name="auto_play"/> <text name="media_setting_note"> - 注: ä½äººã¯ã“ã®è¨å®šã‚’無視ã§ãã¾ã™ + 注æ„: ä½äººã¯ã“ã®è¨å®šã‚’無視ã§ãã¾ã™ </text> - <check_box initial_value="false" label="オブジェクトã®è¡¨é¢ã®ãƒ¡ãƒ‡ã‚£ã‚¢ã®è‡ªå‹•スケール" name="auto_scale"/> + <check_box initial_value="false" label="オブジェクトã®è¡¨é¢ã‚µã‚¤ã‚ºã«åˆã‚ã›ã¦è‡ªå‹•調整" name="auto_scale"/> <text name="size_label"> サイズ: </text> diff --git a/indra/newview/skins/default/xui/ja/panel_media_settings_permissions.xml b/indra/newview/skins/default/xui/ja/panel_media_settings_permissions.xml index 223bd3e28c..11d9ed4c16 100644 --- a/indra/newview/skins/default/xui/ja/panel_media_settings_permissions.xml +++ b/indra/newview/skins/default/xui/ja/panel_media_settings_permissions.xml @@ -11,10 +11,19 @@ ミニ </combo_item> </combo_box> + <text name="owner_label"> + 所有者 + </text> <check_box initial_value="false" label="ナビゲーションã¨ç›¸äº’作用力を有効ã«ã™ã‚‹" name="perms_owner_interact"/> <check_box initial_value="false" label="コントãƒãƒ¼ãƒ«ãƒãƒ¼ã‚’表示ã™ã‚‹" name="perms_owner_control"/> + <text name="group_label"> + グループ: + </text> <check_box initial_value="false" label="ナビゲーションã¨ç›¸äº’作用力を有効ã«ã™ã‚‹" name="perms_group_interact"/> <check_box initial_value="false" label="コントãƒãƒ¼ãƒ«ãƒãƒ¼ã‚’表示ã™ã‚‹" name="perms_group_control"/> + <text name="anyone_label"> + 全員 + </text> <check_box initial_value="false" label="ナビゲーションã¨ç›¸äº’作用力を有効ã«ã™ã‚‹" name="perms_anyone_interact"/> <check_box initial_value="false" label="コントãƒãƒ¼ãƒ«ãƒãƒ¼ã‚’表示ã™ã‚‹" name="perms_anyone_control"/> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_media_settings_security.xml b/indra/newview/skins/default/xui/ja/panel_media_settings_security.xml index 7822123a30..ea4fdb9ce5 100644 --- a/indra/newview/skins/default/xui/ja/panel_media_settings_security.xml +++ b/indra/newview/skins/default/xui/ja/panel_media_settings_security.xml @@ -1,12 +1,12 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="ã‚»ã‚ュリティ" name="Media Settings Security"> - <check_box initial_value="false" label="指定ã—ãŸURLパターンã«ã®ã¿ã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯ã™ã‚‹" name="whitelist_enable"/> + <check_box initial_value="false" label="指定ã—㟠URL パターンã‹ã‚‰å§‹ã¾ã‚‹æŽ¥ç¶šã‚’許å¯ã™ã‚‹" name="whitelist_enable"/> <text name="home_url_fails_some_items_in_whitelist"> - ホームページã«å¤±æ•—ã—ãŸã‚¨ãƒ³ãƒˆãƒªãƒ¼ãŒãƒžãƒ¼ã‚¯ã•れã¾ã—ãŸï¼š + ホームページã«å¤±æ•—ã—ãŸã‚¨ãƒ³ãƒˆãƒªãƒ¼ãŒã‚りã¾ã—ãŸï¼š </text> <button label="è¿½åŠ " name="whitelist_add"/> <button label="削除" name="whitelist_del"/> <text name="home_url_fails_whitelist"> - è¦å‘Šï¼š 「一般ã€ã‚¿ãƒ–ã§æŒ‡å®šã•れãŸãƒ›ãƒ¼ãƒ ページã¯ã€ã“ã®ãƒ›ãƒ¯ã‚¤ãƒˆãƒªã‚¹ãƒˆã‚’パスã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ 有効ãªã‚¨ãƒ³ãƒˆãƒªãƒ¼ãŒè¿½åŠ ã•れるã¾ã§ã¯ã€ç„¡åйã«ãªã‚Šã¾ã™ã€‚ + è¦å‘Šï¼š 「一般ã€ã‚¿ãƒ–ã§æŒ‡å®šã•れãŸãƒ›ãƒ¼ãƒ ページã¯ã€ãƒ›ãƒ¯ã‚¤ãƒˆãƒªã‚¹ãƒˆã«æŽ²è¼‰ã•れã¦ã„ã¾ã›ã‚“。 æ£ã—ã„æ©Ÿèƒ½ãŒè¨å®šã•れるã¾ã§ã€ã“ã®æ©Ÿèƒ½ã¯ä¸€æ™‚åœæ¢ã—ã¾ã™ã€‚ </text> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_my_profile.xml b/indra/newview/skins/default/xui/ja/panel_my_profile.xml index 4cce3798cf..17461ef771 100644 --- a/indra/newview/skins/default/xui/ja/panel_my_profile.xml +++ b/indra/newview/skins/default/xui/ja/panel_my_profile.xml @@ -28,13 +28,16 @@ <icon label="" name="real_world_edit_icon" tool_tip="下ã®ã€Œãƒ—ãƒãƒ•ィールã®ç·¨é›†ã€ãƒœã‚¿ãƒ³ã‚’押ã—ã¦ç”»åƒã‚’変更ã—ã¾ã™"/> <text name="title_rw_descr_text" value="ç¾å®Ÿä¸–界:"/> </panel> - <text name="title_member_text" value="ä½äººã¨ãªã£ãŸæ—¥ï¼š"/> + <text name="title_member_text" value="メンãƒãƒ¼ç™»éŒ²ï¼š"/> <text name="title_acc_status_text" value="アカウントã®çŠ¶æ…‹ï¼š"/> - <text name="acc_status_text"> + <text_editor name="acc_status_text"> ä½äººã€‚ æ”¯æ‰•æƒ…å ±æœªç™»éŒ²ã€‚ リンデン。 - </text> + </text_editor> <text name="title_partner_text" value="パートナー:"/> + <panel name="partner_data_panel"> + <name_box initial_value="(å–å¾—ä¸ï¼‰" name="partner_text"/> + </panel> <text name="title_groups_text" value="グループ:"/> </panel> </scroll_container> diff --git a/indra/newview/skins/default/xui/ja/panel_navigation_bar.xml b/indra/newview/skins/default/xui/ja/panel_navigation_bar.xml index a154442095..0426c4fe9a 100644 --- a/indra/newview/skins/default/xui/ja/panel_navigation_bar.xml +++ b/indra/newview/skins/default/xui/ja/panel_navigation_bar.xml @@ -1,15 +1,18 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="navigation_bar"> <panel name="navigation_panel"> - <button name="back_btn" tool_tip="å‰ã®å ´æ‰€"/> - <button name="forward_btn" tool_tip="次ã®å ´æ‰€"/> + <pull_button name="back_btn" tool_tip="å‰ã®å ´æ‰€ã¸æˆ»ã‚Šã¾ã™"/> + <pull_button name="forward_btn" tool_tip="次ã®å ´æ‰€ã¸é€²ã¿ã¾ã™"/> <button name="home_btn" tool_tip="「ホームã€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ"/> <location_input label="å ´æ‰€" name="location_combo"/> <search_combo_box label="検索" name="search_combo_box" tool_tip="検索"> <combo_editor label="[SECOND_LIFE] を検索:" name="search_combo_editor"/> </search_combo_box> </panel> - <favorites_bar name="favorite"> + <favorites_bar name="favorite" tool_tip="ランドマークをã“ã“ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€Second Lifeã®ãŠæ°—ã«å…¥ã‚Šã®å ´æ‰€ã«ç´ æ—©ãアクセスï¼"> + <label name="favorites_bar_label" tool_tip="ランドマークをã“ã“ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€Second Lifeã®ãŠæ°—ã«å…¥ã‚Šã®å ´æ‰€ã«ç´ æ—©ãアクセスï¼"> + ãŠæ°—ã«å…¥ã‚Šãƒãƒ¼ + </label> <chevron_button name=">>" tool_tip="ãŠæ°—ã«å…¥ã‚Šã‚’ã‚‚ã£ã¨è¡¨ç¤º"/> </favorites_bar> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/ja/panel_nearby_chat_bar.xml index 3dbabc62be..5998206f27 100644 --- a/indra/newview/skins/default/xui/ja/panel_nearby_chat_bar.xml +++ b/indra/newview/skins/default/xui/ja/panel_nearby_chat_bar.xml @@ -1,11 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="chat_bar"> - <string name="min_width"> - 192 - </string> - <string name="max_width"> - 320 - </string> <line_editor label="ã“ã“をクリックã—ã¦ãƒãƒ£ãƒƒãƒˆã‚’é–‹å§‹ã—ã¾ã™ã€‚" name="chat_box" tool_tip="Enter ã‚ーを押ã—ã¦ç™ºè¨€ã—ã€Ctrl + Enter ã‚ーã§å«ã³ã¾ã™ã€‚"/> <button name="show_nearby_chat" tool_tip="è¿‘ãã®ãƒãƒ£ãƒƒãƒˆãƒã‚°ã‚’表示・éžè¡¨ç¤º"/> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_nearby_media.xml b/indra/newview/skins/default/xui/ja/panel_nearby_media.xml new file mode 100644 index 0000000000..d0e423bd18 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/panel_nearby_media.xml @@ -0,0 +1,65 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="nearby_media"> + <string name="media_item_count_format"> + (メディアアイテム%ld ) + </string> + <string name="empty_item_text"> + <空> + </string> + <string name="parcel_media_name"> + 区画ストリーミングメディア + </string> + <string name="parcel_audio_name"> + 区画ストリーミングオーディオ + </string> + <string name="playing_suffix"> + (å†ç”Ÿä¸ï¼‰ + </string> + <panel name="minimized_controls"> + <button label="ã™ã¹ã¦åœæ¢" name="all_nearby_media_disable_btn" tool_tip="è¿‘ãã®ãƒ¡ãƒ‡ã‚£ã‚¢ã‚’ã™ã¹ã¦ã‚ªãƒ•ã«ã—ã¾ã™"/> + <button label="ã™ã¹ã¦é–‹å§‹" name="all_nearby_media_enable_btn" tool_tip="è¿‘ãã®ãƒ¡ãƒ‡ã‚£ã‚¢ã‚’ã™ã¹ã¦ã‚ªãƒ³ã«ã—ã¾ã™"/> + <button name="open_prefs_btn" tool_tip="メディアã®è¨å®šã‚’é–‹ãã¾ã™"/> + <button label="詳細 >>" label_selected="簡易 <<" name="more_btn" tool_tip="アドãƒãƒ³ã‚¹ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«"/> + <button label="詳細 >>" label_selected="簡易 <<" name="less_btn" tool_tip="アドãƒãƒ³ã‚¹ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«"/> + </panel> + <panel name="nearby_media_panel"> + <combo_box name="show_combo"> + <combo_box.item label="ã™ã¹ã¦" name="All"/> + <combo_box.item label="ã“ã®åŒºç”»å†…" name="WithinParcel"/> + <combo_box.item label="ã“ã®åŒºç”»å¤–" name="OutsideParcel"/> + <combo_box.item label="ä»–ã®ã‚¢ãƒã‚¿ãƒ¼" name="OnOthers"/> + </combo_box> + <scroll_list name="media_list"> + <scroll_list.columns label="近接" name="media_proximity"/> + <scroll_list.columns label="表示" name="media_visibility"/> + <scroll_list.columns label="クラス" name="media_class"/> + <scroll_list.columns label="åå‰" name="media_name"/> + <scroll_list.columns label="デãƒãƒƒã‚°" name="media_debug"/> + </scroll_list> + <panel> + <layout_stack name="media_controls"> + <layout_panel name="stop"> + <button name="stop_btn" tool_tip="é¸æŠžã—ãŸãƒ¡ãƒ‡ã‚£ã‚¢ã‚’åœæ¢"/> + </layout_panel> + <layout_panel name="play"> + <button name="play_btn" tool_tip="é¸æŠžã—ãŸãƒ¡ãƒ‡ã‚£ã‚¢ã‚’å†ç”Ÿ"/> + </layout_panel> + <layout_panel name="pause"> + <button name="pause_btn" tool_tip="é¸æŠžã—ãŸãƒ¡ãƒ‡ã‚£ã‚¢ã‚’ä¸€æ™‚åœæ¢"/> + </layout_panel> + <layout_panel name="volume_slider_ctrl"> + <slider_bar initial_value="0.5" name="volume_slider" tool_tip="é¸æŠžã—ãŸãƒ¡ãƒ‡ã‚£ã‚¢ã®éŸ³é‡"/> + </layout_panel> + <layout_panel name="mute"> + <button name="mute_btn" tool_tip="é¸æŠžã—ãŸãƒ¡ãƒ‡ã‚£ã‚¢ã®éŸ³ã‚’ミュート"/> + </layout_panel> + <layout_panel name="zoom"> + <button name="zoom_btn" tool_tip="é¸æŠžã—ãŸãƒ¡ãƒ‡ã‚£ã‚¢ã«ã‚ºãƒ¼ãƒ "/> + </layout_panel> + <layout_panel name="unzoom"> + <button name="unzoom_btn" tool_tip="é¸æŠžã—ãŸãƒ¡ãƒ‡ã‚£ã‚¢ã‹ã‚‰é ã–ã‹ã‚‹"/> + </layout_panel> + </layout_stack> + </panel> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/ja/panel_notes.xml b/indra/newview/skins/default/xui/ja/panel_notes.xml index 1948c54359..cbeb5a7f97 100644 --- a/indra/newview/skins/default/xui/ja/panel_notes.xml +++ b/indra/newview/skins/default/xui/ja/panel_notes.xml @@ -6,7 +6,7 @@ <panel name="profile_scroll_panel"> <text name="status_message" value="個人的メモ:"/> <text name="status_message2" value="ã“ã®äººã«è¨±å¯ï¼š"/> - <check_box label="オンライン状æ³ã®ç¢ºèª" name="status_check"/> + <check_box label="オンライン状態ã®ç¢ºèª" name="status_check"/> <check_box label="地図ã§å±…å ´æ‰€ã‚’ç¢ºèª" name="map_check"/> <check_box label="ç§ã®ã‚ªãƒ–ジェクトã®ç·¨é›†ãƒ»å‰Šé™¤ãƒ»å–å¾—" name="objects_check"/> </panel> @@ -15,9 +15,9 @@ <layout_panel name="notes_buttons_panel"> <button label="フレンド登録" name="add_friend" tool_tip="フレンド登録を申ã—出ã¾ã™"/> <button label="IM" name="im" tool_tip="インスタントメッセージを開ãã¾ã™"/> - <button label="コール" name="call" tool_tip="ã“ã®ä½äººã«ã‚³ãƒ¼ãƒ«ã™ã‚‹"/> - <button label="地図" name="show_on_map_btn" tool_tip="ä½äººã‚’地図上ã§è¡¨ç¤ºã™ã‚‹"/> - <button label="テレãƒãƒ¼ãƒˆ" name="teleport" tool_tip="テレãƒãƒ¼ãƒˆã‚’é€ã‚‹"/> + <button label="コール" name="call" tool_tip="ã“ã®ä½äººã«ã‚³ãƒ¼ãƒ«ã—ã¾ã™"/> + <button label="地図" name="show_on_map_btn" tool_tip="ä½äººã‚’地図上ã§è¡¨ç¤ºã—ã¾ã™"/> + <button label="テレãƒãƒ¼ãƒˆ" name="teleport" tool_tip="テレãƒãƒ¼ãƒˆã‚’é€ã‚Šã¾ã™"/> </layout_panel> </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_online_status.xml b/indra/newview/skins/default/xui/ja/panel_online_status.xml new file mode 100644 index 0000000000..fdc489f375 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/panel_online_status.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="friend_online_status" name="friend_online_status"/> diff --git a/indra/newview/skins/default/xui/ja/panel_online_status_toast.xml b/indra/newview/skins/default/xui/ja/panel_online_status_toast.xml new file mode 100644 index 0000000000..fdc489f375 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/panel_online_status_toast.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="friend_online_status" name="friend_online_status"/> diff --git a/indra/newview/skins/default/xui/ja/panel_outfit_edit.xml b/indra/newview/skins/default/xui/ja/panel_outfit_edit.xml new file mode 100644 index 0000000000..30b2c078d5 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/panel_outfit_edit.xml @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- Side tray Outfit Edit panel --> +<panel label="アウトフットã®ç·¨é›†" name="outfit_edit"> + <string name="No Outfit" value="アウトフィットãªã—"/> + <string name="unsaved_changes" value="ä¿å˜ã•れã¦ã„ãªã„変更"/> + <string name="now_editing" value="編集ã—ã¦ã„ã¾ã™..."/> + <panel.string name="not_available"> + (該当ãªã—) + </panel.string> + <panel.string name="unknown"> + ï¼ˆä¸æ˜Žï¼‰ + </panel.string> + <string name="Filter.All" value="ã™ã¹ã¦"/> + <string name="Filter.Clothes/Body" value="衣類/身体"/> + <string name="Filter.Objects" value="オブジェクト"/> + <string name="Filter.Custom" value="フィルターã®ã‚«ã‚¹ã‚¿ãƒžã‚¤ã‚º"/> + <text name="title" value="アウトフットã®ç·¨é›†"/> + <panel label="bottom_panel" name="header_panel"> + <panel label="bottom_panel" name="outfit_name_and_status"> + <text name="status" value="編集ã—ã¦ã„ã¾ã™..."/> + <text name="curr_outfit_name" value="[Current Outfit]"/> + </panel> + </panel> + <layout_stack name="im_panels"> + <layout_panel label="IM コントãƒãƒ¼ãƒ«ãƒ‘ãƒãƒ«" name="outfit_wearables_panel"> + <layout_stack name="filter_panels"> + <layout_panel name="add_button_and_combobox"> + <button label="ã•らã«è¿½åŠ ..." name="show_add_wearables_btn"/> + </layout_panel> + <layout_panel name="filter_panel"> + <filter_editor label="æŒã¡ç‰©ã®ç€ç”¨ç‰©ã‚’フィルター" name="look_item_filter"/> + </layout_panel> + </layout_stack> + </layout_panel> + <layout_panel name="add_wearables_panel"/> + </layout_stack> + <panel name="save_revert_button_bar"> + <button label="ä¿å˜" name="save_btn"/> + <button label="å…ƒã«æˆ»ã™" name="revert_btn"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/ja/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/ja/panel_outfits_inventory.xml index a109b1ab51..27bb224c18 100644 --- a/indra/newview/skins/default/xui/ja/panel_outfits_inventory.xml +++ b/indra/newview/skins/default/xui/ja/panel_outfits_inventory.xml @@ -1,14 +1,13 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="ã‚‚ã®" name="Outfits"> <tab_container name="appearance_tabs"> - <inventory_panel label="マイ アウトフィット" name="outfitslist_tab"/> - <inventory_panel label="ç€ç”¨ä¸" name="cof_accordionpanel"/> + <panel label="マイ アウトフィット" name="outfitslist_tab"/> + <inventory_panel label="ç€ç”¨ä¸" name="cof_tab"/> </tab_container> <panel name="bottom_panel"> - <button name="options_gear_btn" tool_tip="ãã®ä»–ã®ã‚ªãƒ—ションを表示"/> - <dnd_button name="trash_btn" tool_tip="é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ を削除"/> - <button label="アウトフィットをä¿å˜ã™ã‚‹" name="make_outfit_btn" tool_tip="容姿をアウトフィットã«ä¿å˜ã™ã‚‹"/> - <button label="装ç€" name="wear_btn" tool_tip="é¸æŠžã—ãŸã‚¢ã‚¦ãƒˆãƒ•ィットをç€ç”¨ã™ã‚‹"/> - <button label="M" name="look_edit_btn"/> + <button name="options_gear_btn" tool_tip="ãã®ä»–ã®ã‚ªãƒ—ションを表示ã—ã¾ã™"/> + <dnd_button name="trash_btn" tool_tip="é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ を削除ã—ã¾ã™"/> + <button label="別åã§ä¿å˜" name="save_btn"/> + <button label="装ç€" name="wear_btn" tool_tip="é¸æŠžã—ãŸã‚¢ã‚¦ãƒˆãƒ•ィットをç€ç”¨ã—ã¾ã™"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_people.xml b/indra/newview/skins/default/xui/ja/panel_people.xml index c955cf6e48..68af19910a 100644 --- a/indra/newview/skins/default/xui/ja/panel_people.xml +++ b/indra/newview/skins/default/xui/ja/panel_people.xml @@ -1,13 +1,23 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <!-- Side tray panel --> <panel label="人" name="people_panel"> - <string name="no_people" value="誰もã„ã¾ã›ã‚“"/> - <string name="no_one_near" value="è¿‘ãã«èª°ã‚‚ã„ã¾ã›ã‚“"/> + <string name="no_recent_people" value="最近交æµã—ãŸäººã¯ã„ã¾ã›ã‚“。 一緒ã«ä½•ã‹ã™ã‚‹ä»²é–“ã‚’ãŠæŽ¢ã—ã§ã™ã‹ï¼Ÿ [secondlife:///app/search/people 検索] ã‹ [secondlife:///app/worldmap 世界地図] ã‚’ãŠè©¦ã—ãã ã•ã„。"/> + <string name="no_filtered_recent_people" value="ãŠæŽ¢ã—ã®ã‚‚ã®ã¯è¦‹ã¤ã‹ã‚Šã¾ã—ãŸã‹ï¼Ÿ [secondlife:///app/search/people/[SEARCH_TERM] 検索] ã‚’ãŠè©¦ã—ãã ã•ã„。"/> + <string name="no_one_near" value="è¿‘ãã«èª°ã‚‚ã„ã¾ã›ã‚“。 一緒ã«ä½•ã‹ã™ã‚‹ä»²é–“ã‚’ãŠæŽ¢ã—ã§ã™ã‹ï¼Ÿ [secondlife:///app/search/people 検索] ã‹ [secondlife:///app/worldmap 世界地図] ã‚’ãŠè©¦ã—ãã ã•ã„。"/> + <string name="no_one_filtered_near" value="ãŠæŽ¢ã—ã®ã‚‚ã®ã¯è¦‹ã¤ã‹ã‚Šã¾ã—ãŸã‹ï¼Ÿ [secondlife:///app/search/people/[SEARCH_TERM] 検索] ã‚’ãŠè©¦ã—ãã ã•ã„。"/> <string name="no_friends_online" value="オンラインã®ãƒ•レンドã¯ã„ã¾ã›ã‚“"/> <string name="no_friends" value="フレンドã¯ã„ã¾ã›ã‚“"/> - <string name="no_groups" value="グループã¯ã‚りã¾ã›ã‚“"/> + <string name="no_friends_msg"> + å‹é”を見ã¤ã‘ã‚‹ã«ã¯ã€[secondlife:///app/search/people 検索] ã‚’ã™ã‚‹ã‹ã€ä½äººã‚’å³ã‚¯ãƒªãƒƒã‚¯ã—ã¦ãƒ•レンド登録ã—ã¦ãã ã•ã„。 +一緒ã«ä½•ã‹ã™ã‚‹ä»²é–“ã‚’ãŠæŽ¢ã—ã§ã™ã‹ï¼Ÿ [secondlife:///app/worldmap 世界地図] ã‚’ãŠè©¦ã—ãã ã•ã„。 + </string> + <string name="no_filtered_friends_msg"> + ãŠæŽ¢ã—ã®ã‚‚ã®ã¯è¦‹ã¤ã‹ã‚Šã¾ã—ãŸã‹ï¼Ÿ [secondlife:///app/search/people/[SEARCH_TERM] 検索] ã‚’ãŠè©¦ã—ãã ã•ã„。 + </string> <string name="people_filter_label" value="人をフィルター"/> <string name="groups_filter_label" value="グループをフィルター"/> + <string name="no_filtered_groups_msg" value="ãŠæŽ¢ã—ã®ã‚‚ã®ã¯è¦‹ã¤ã‹ã‚Šã¾ã—ãŸã‹ï¼Ÿ [secondlife:///app/search/groups/[SEARCH_TERM] 検索] ã‚’ãŠè©¦ã—ãã ã•ã„。"/> + <string name="no_groups_msg" value="ã‚°ãƒ«ãƒ¼ãƒ—ã‚’ãŠæŽ¢ã—ã§ã™ã‹ï¼Ÿ [secondlife:///app/search/groups 検索] ã‚’ãŠè©¦ã—ãã ã•ã„。"/> <filter_editor label="フィルター" name="filter_input"/> <tab_container name="tabs"> <panel label="è¿‘ã" name="nearby_panel"> @@ -16,22 +26,22 @@ <button name="add_friend_btn" tool_tip="é¸æŠžã—ãŸä½äººã‚’フレンドリストã«ç™»éŒ²"/> </panel> </panel> - <panel label="フレンド" name="friends_panel"> + <panel label="マイ フレンド" name="friends_panel"> <accordion name="friends_accordion"> <accordion_tab name="tab_online" title="オンライン"/> <accordion_tab name="tab_all" title="全員"/> </accordion> <panel label="bottom_panel" name="bottom_panel"> <button name="friends_viewsort_btn" tool_tip="オプション"/> - <button name="add_btn" tool_tip="フレンド登録を申ã—出る"/> - <button name="del_btn" tool_tip="é¸æŠžã—ãŸäººã‚’フレンドリストã‹ã‚‰å‰Šé™¤"/> + <button name="add_btn" tool_tip="フレンド登録を申ã—出ã¾ã™"/> + <button name="del_btn" tool_tip="é¸æŠžã—ãŸäººã‚’フレンドリストã‹ã‚‰å‰Šé™¤ã—ã¾ã™"/> </panel> </panel> - <panel label="グループ" name="groups_panel"> + <panel label="マイ グループ" name="groups_panel"> <panel label="bottom_panel" name="bottom_panel"> <button name="groups_viewsort_btn" tool_tip="オプション"/> - <button name="plus_btn" tool_tip="グループã«å‚åŠ / æ–°è¦ã‚°ãƒ«ãƒ¼ãƒ—を作æˆ"/> - <button name="activate_btn" tool_tip="é¸æŠžã—ãŸã‚°ãƒ«ãƒ¼ãƒ—をアクティベート"/> + <button name="plus_btn" tool_tip="グループã«å‚åŠ / æ–°è¦ã‚°ãƒ«ãƒ¼ãƒ—を作æˆã—ã¾ã™"/> + <button name="activate_btn" tool_tip="é¸æŠžã—ãŸã‚°ãƒ«ãƒ¼ãƒ—をアクティブã«ã—ã¾ã™"/> </panel> </panel> <panel label="最新" name="recent_panel"> @@ -42,13 +52,13 @@ </panel> </tab_container> <panel name="button_bar"> - <button label="プãƒãƒ•ィール" name="view_profile_btn" tool_tip="写真ã€ã‚°ãƒ«ãƒ¼ãƒ—ã€ãã®ä»–ä½äººæƒ…å ±ã‚’è¡¨ç¤º"/> - <button label="IM" name="im_btn" tool_tip="インスタントメッセージを開ã"/> - <button label="コール" name="call_btn" tool_tip="ã“ã®ä½äººã«ã‚³ãƒ¼ãƒ«ã™ã‚‹"/> - <button label="共有" name="share_btn"/> - <button label="テレãƒãƒ¼ãƒˆ" name="teleport_btn" tool_tip="テレãƒãƒ¼ãƒˆã‚’é€ã‚‹"/> - <button label="ã‚°ãƒ«ãƒ¼ãƒ—æƒ…å ±" name="group_info_btn" tool_tip="ã‚°ãƒ«ãƒ¼ãƒ—æƒ…å ±ã‚’è¡¨ç¤º"/> - <button label="グループãƒãƒ£ãƒƒãƒˆ" name="chat_btn" tool_tip="ãƒãƒ£ãƒƒãƒˆã‚’é–‹å§‹"/> - <button label="グループã«ã‚³ãƒ¼ãƒ«ã™ã‚‹" name="group_call_btn" tool_tip="ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«ã‚³ãƒ¼ãƒ«ã™ã‚‹"/> + <button label="プãƒãƒ•ィール" name="view_profile_btn" tool_tip="写真ã€ã‚°ãƒ«ãƒ¼ãƒ—ã€ãã®ä»–ä½äººæƒ…å ±ã‚’è¡¨ç¤ºã—ã¾ã™"/> + <button label="IM" name="im_btn" tool_tip="インスタントメッセージを開ãã¾ã™"/> + <button label="コール" name="call_btn" tool_tip="ã“ã®ä½äººã«ã‚³ãƒ¼ãƒ«ã—ã¾ã™"/> + <button label="共有" name="share_btn" tool_tip="æŒã¡ç‰©ã‚¢ã‚¤ãƒ†ãƒ を共有"/> + <button label="テレãƒãƒ¼ãƒˆ" name="teleport_btn" tool_tip="テレãƒãƒ¼ãƒˆã‚’é€ã‚Šã¾ã™"/> + <button label="ã‚°ãƒ«ãƒ¼ãƒ—æƒ…å ±" name="group_info_btn" tool_tip="ã‚°ãƒ«ãƒ¼ãƒ—æƒ…å ±ã‚’è¡¨ç¤ºã—ã¾ã™"/> + <button label="グループãƒãƒ£ãƒƒãƒˆ" name="chat_btn" tool_tip="ãƒãƒ£ãƒƒãƒˆã‚’é–‹å§‹ã—ã¾ã™"/> + <button label="グループコール" name="group_call_btn" tool_tip="ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«ã‚³ãƒ¼ãƒ«ã—ã¾ã™"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_picks.xml b/indra/newview/skins/default/xui/ja/panel_picks.xml index f74bf7a073..4f58c032da 100644 --- a/indra/newview/skins/default/xui/ja/panel_picks.xml +++ b/indra/newview/skins/default/xui/ja/panel_picks.xml @@ -10,8 +10,8 @@ <button name="new_btn" tool_tip="ç¾åœ¨åœ°ã®æ–°ã—ã„ピックã€ã¾ãŸã¯ã‚¯ãƒ©ã‚·ãƒ•ァイド広告を作æˆã—ã¾ã™"/> </panel> <panel name="buttons_cucks"> - <button label="æƒ…å ±" name="info_btn" tool_tip="ãƒ”ãƒƒã‚¯ã®æƒ…å ±ã‚’è¡¨ç¤º"/> - <button label="テレãƒãƒ¼ãƒˆ" name="teleport_btn" tool_tip="該当ã™ã‚‹ã‚¨ãƒªã‚¢ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ"/> - <button label="地図" name="show_on_map_btn" tool_tip="世界地図ã«è©²å½“ã™ã‚‹ã‚¨ãƒªã‚¢ã‚’表示"/> + <button label="æƒ…å ±" name="info_btn" tool_tip="ãƒ”ãƒƒã‚¯ã®æƒ…å ±ã‚’è¡¨ç¤ºã—ã¾ã™"/> + <button label="テレãƒãƒ¼ãƒˆ" name="teleport_btn" tool_tip="該当ã™ã‚‹ã‚¨ãƒªã‚¢ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™"/> + <button label="地図" name="show_on_map_btn" tool_tip="世界地図ã«è©²å½“ã™ã‚‹ã‚¨ãƒªã‚¢ã‚’表示ã—ã¾ã™"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_place_profile.xml b/indra/newview/skins/default/xui/ja/panel_place_profile.xml index ef4b71c4aa..b897e1d748 100644 --- a/indra/newview/skins/default/xui/ja/panel_place_profile.xml +++ b/indra/newview/skins/default/xui/ja/panel_place_profile.xml @@ -6,7 +6,7 @@ <string name="available" value="利用å¯"/> <string name="allocated" value="å‰²ã‚Šå½“ã¦æ¸ˆ"/> <string name="title_place" value="å ´æ‰€ã®ãƒ—ãƒãƒ•ィール"/> - <string name="title_teleport_history" value="テレãƒãƒ¼ãƒˆå±¥æ´ã®å ´æ‰€"/> + <string name="title_teleport_history" value="テレãƒãƒ¼ãƒˆã®å±¥æ´"/> <string name="not_available" value="(該当ãªã—)"/> <string name="unknown" value="ï¼ˆä¸æ˜Žï¼‰"/> <string name="public" value="(公開)"/> @@ -41,21 +41,6 @@ <string name="acquired_date"> [year,datetime,local] [mth,datetime,local] [day,datetime,local] [wkday,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] </string> - <string name="icon_PG" value="parcel_drk_PG"/> - <string name="icon_M" value="parcel_drk_M"/> - <string name="icon_R" value="parcel_drk_R"/> - <string name="icon_Voice" value="parcel_drk_Voice"/> - <string name="icon_VoiceNo" value="parcel_drk_VoiceNo"/> - <string name="icon_Fly" value="parcel_drk_Fly"/> - <string name="icon_FlyNo" value="parcel_drk_FlyNo"/> - <string name="icon_Push" value="parcel_drk_Push"/> - <string name="icon_PushNo" value="parcel_drk_PushNo"/> - <string name="icon_Build" value="parcel_drk_Build"/> - <string name="icon_BuildNo" value="parcel_drk_BuildNo"/> - <string name="icon_Scripts" value="parcel_drk_Scripts"/> - <string name="icon_ScriptsNo" value="parcel_drk_ScriptsNo"/> - <string name="icon_Damage" value="parcel_drk_Damage"/> - <string name="icon_DamageNo" value="parcel_drk_DamageNo"/> <button name="back_btn" tool_tip="戻る"/> <text name="title" value="å ´æ‰€ã®ãƒ—ãƒãƒ•ィール"/> <scroll_container name="place_scroll"> @@ -68,8 +53,8 @@ <text name="maturity_value" value="䏿˜Ž"/> <accordion name="advanced_info_accordion"> <accordion_tab name="parcel_characteristics_tab" title="区画"> - <panel> - <text name="rating_label" value="レーティング区分:"/> + <panel name="parcel_characteristics_panel"> + <text name="rating_label" value="レーティング:"/> <text name="rating_value" value="䏿˜Ž"/> <text name="voice_label" value="ボイス:"/> <text name="voice_value" value="オン"/> @@ -86,14 +71,14 @@ <button label="åœŸåœ°æƒ…å ±" name="about_land_btn"/> </panel> </accordion_tab> - <accordion_tab name="region_information_tab" title="リージョン"> - <panel> + <accordion_tab name="region_information_tab" title="リージョン(地域) "> + <panel name="region_information_panel"> <text name="region_name_label" value="リージョン:"/> <text name="region_name" value="Mooseland"/> <text name="region_type_label" value="種類:"/> <text name="region_type" value="Moose"/> - <text name="region_rating_label" value="レーティング区分:"/> - <text name="region_rating" value="アダルト"/> + <text name="region_rating_label" value="レーティング:"/> + <text name="region_rating" value="Adult"/> <text name="region_owner_label" value="所有者:"/> <text name="region_owner" value="moose Van Moose"/> <text name="region_group_label" value="グループ:"/> @@ -104,15 +89,15 @@ </panel> </accordion_tab> <accordion_tab name="estate_information_tab" title="エステート(ä¸å‹•産)"> - <panel> - <text name="estate_name_label" value="エステート(ä¸å‹•産):"/> - <text name="estate_rating_label" value="レーティング区分:"/> + <panel name="estate_information_panel"> + <text name="estate_name_label" value="エステート:"/> + <text name="estate_rating_label" value="レーティング:"/> <text name="estate_owner_label" value="所有者:"/> <text name="covenant_label" value="約款:"/> </panel> </accordion_tab> <accordion_tab name="sales_tab" title="販売ä¸"> - <panel> + <panel name="sales_panel"> <text name="sales_price_label" value="ä¾¡æ ¼ï¼š"/> <text name="area_label" value="é¢ç©ï¼š"/> <text name="traffic_label" value="トラフィック:"/> diff --git a/indra/newview/skins/default/xui/ja/panel_places.xml b/indra/newview/skins/default/xui/ja/panel_places.xml index b1c7a3308f..c83e3591a7 100644 --- a/indra/newview/skins/default/xui/ja/panel_places.xml +++ b/indra/newview/skins/default/xui/ja/panel_places.xml @@ -5,11 +5,12 @@ <filter_editor label="å ´æ‰€ã‚’ãƒ•ã‚£ãƒ«ã‚¿ãƒ¼" name="Filter"/> <panel name="button_panel"> <button label="テレãƒãƒ¼ãƒˆ" name="teleport_btn" tool_tip="該当ã™ã‚‹ã‚¨ãƒªã‚¢ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™"/> - <button label="地図" name="map_btn"/> + <button label="地図" name="map_btn" tool_tip="世界地図ã«è©²å½“ã™ã‚‹ã‚¨ãƒªã‚¢ã‚’表示"/> <button label="編集" name="edit_btn" tool_tip="ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã®æƒ…å ±ã‚’ç·¨é›†ã—ã¾ã™"/> - <button name="overflow_btn" tool_tip="ãã®ä»–ã®ã‚ªãƒ—ションを表示"/> - <button label="é–‰ã˜ã‚‹" name="close_btn"/> - <button label="ã‚ャンセル" name="cancel_btn"/> + <button label="â–¼" name="overflow_btn" tool_tip="ãã®ä»–ã®ã‚ªãƒ—ションを表示"/> <button label="ä¿å˜" name="save_btn"/> + <button label="ã‚ャンセル" name="cancel_btn"/> + <button label="é–‰ã˜ã‚‹" name="close_btn"/> + <button label="プãƒãƒ•ィール" name="profile_btn" tool_tip="å ´æ‰€ã®ãƒ—ãƒãƒ•ィールを表示"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/ja/panel_preferences_advanced.xml index d444cccd2d..fdf33b5402 100644 --- a/indra/newview/skins/default/xui/ja/panel_preferences_advanced.xml +++ b/indra/newview/skins/default/xui/ja/panel_preferences_advanced.xml @@ -1,27 +1,11 @@ <?xml version="1.0" encoding="utf-8"?> -<panel name="advanced"> - <panel.string name="resolution_format"> - [RES_X] x [RES_Y] - </panel.string> +<panel label="アドãƒãƒ³ã‚¹" name="advanced"> <panel.string name="aspect_ratio_text"> [NUM]:[DEN] </panel.string> - <check_box label="å¹ã出ã—ãƒãƒ£ãƒƒãƒˆ" name="bubble_text_chat"/> - <color_swatch name="background" tool_tip="å¹ã出ã—ãƒãƒ£ãƒƒãƒˆã®è‰²ã‚’é¸æŠžã—ã¾ã™"/> - <slider label="逿˜Žåº¦" name="bubble_chat_opacity"/> - <text name="AspectRatioLabel1" tool_tip="(幅/高ã•)"> - 縦横比 - </text> - <combo_box name="aspect_ratio" tool_tip="(幅/高ã•)"> - <combo_box.item label="4:3(標準CRT)" name="item1"/> - <combo_box.item label="5:4(1280x1024 LCD)" name="item2"/> - <combo_box.item label="8:5(ワイドスクリï¼ãƒ³ï¼‰" name="item3"/> - <combo_box.item label="16:9(ワイドスクリï¼ãƒ³ï¼‰" name="item4"/> - </combo_box> - <check_box label="自動検出" name="aspect_auto_detect"/> - <text name="heading1"> - カメラ: - </text> + <panel.string name="middle_mouse"> + マウスã®ä¸å¤® + </panel.string> <slider label="視界角" name="camera_fov"/> <slider label="è·é›¢" name="camera_offset_scale"/> <text name="heading2"> @@ -29,20 +13,25 @@ </text> <check_box label="制作・編集" name="edit_camera_movement" tool_tip="編集モードã®ã‚ªãƒ³ãƒ»ã‚ªãƒ•ã®åˆ‡ã‚Šæ›¿ãˆã«ã€è‡ªå‹•カメラãƒã‚¸ã‚·ãƒ§ãƒ³ã‚’使ã„ã¾ã™"/> <check_box label="容姿" name="appearance_camera_movement" tool_tip="編集モードã«å…¥ã£ãŸã¨ãã«ã€è‡ªå‹•カメラãƒã‚¸ã‚·ãƒ§ãƒ³ã‚’使ã„ã¾ã™"/> - <text name="heading3"> - ã‚¢ãƒã‚¿ãƒ¼ï¼š - </text> + <check_box initial_value="true" label="サイドãƒãƒ¼" name="appearance_sidebar_positioning" tool_tip="サイドãƒãƒ¼ã®åˆ‡ã‚Šæ›¿ãˆæ™‚ã«è‡ªå‹•カメラãƒã‚¸ã‚·ãƒ§ãƒ³ã‚’使ã„ã¾ã™"/> <check_box label="一人称視点ã§è¡¨ç¤ºã™ã‚‹" name="first_person_avatar_visible"/> <check_box label="常ã«ã‚ーæ“作ã§å‹•ãよã†ã«ã™ã‚‹" name="arrow_keys_move_avatar_check"/> <check_box label="上矢å°ã‚ー2度押ã—+長押ã—ã§èµ°ã‚‹" name="tap_tap_hold_to_run"/> <check_box label="話ã™ã¨ãã«ã‚¢ãƒã‚¿ãƒ¼ã®å£ã‚’å‹•ã‹ã™" name="enable_lip_sync"/> - <check_box label="スクリプトã®ã‚¨ãƒ©ãƒ¼ã‚’表示ã™ã‚‹" name="show_script_errors"/> + <check_box label="å¹ã出ã—ãƒãƒ£ãƒƒãƒˆ" name="bubble_text_chat"/> + <slider label="逿˜Žåº¦" name="bubble_chat_opacity"/> + <color_swatch name="background" tool_tip="å¹ã出ã—ãƒãƒ£ãƒƒãƒˆã®è‰²ã‚’é¸æŠžã—ã¾ã™"/> + <text name="UI Size:"> + UI サイズ + </text> + <check_box label="スクリプトã®ã‚¨ãƒ©ãƒ¼ã‚’表示:" name="show_script_errors"/> <radio_group name="show_location"> - <radio_item label="ãƒãƒ£ãƒƒãƒˆ" name="0"/> - <radio_item label="ウィンドウ" name="1"/> + <radio_item label="è¿‘ãã®ãƒãƒ£ãƒƒãƒˆ" name="0"/> + <radio_item label="別々ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" name="1"/> </radio_group> - <check_box label="トリガーã‚ーを押ã—ãŸã¨ãã«ã€ãƒžã‚¤ã‚¯ã‚’切り替ãˆã‚‹ï¼š" name="push_to_talk_toggle_check" tool_tip="ãƒˆã‚°ãƒ«ãƒ¢ãƒ¼ãƒ‰ã®æ™‚ã«ãƒˆãƒªã‚¬ãƒ¼ã‚ーを1度押ã—ã¦æ”¾ã™ã¨ã€ãƒžã‚¤ã‚¯ã®ã‚ªãƒ³ãƒ»ã‚ªãƒ•è¨å®šã‚’切り替ãˆã¾ã™ã€‚ トグルモードã§ã¯ãªã„ã¨ãã¯ã€ãƒˆãƒªã‚¬ãƒ¼ã‚ーを押ã—ãŸçŠ¶æ…‹ã®æ™‚ã®ã¿ã‚ãªãŸã®å£°ãŒç›¸æ‰‹ã«èžã“ãˆã¾ã™ã€‚"/> + <check_box label="ボイスã®ã‚ªãƒ³ãƒ»ã‚ªãƒ•切り替ãˆã«ä½¿ç”¨ã™ã‚‹ãƒˆãƒªã‚¬ãƒ¼ã‚ー:" name="push_to_talk_toggle_check" tool_tip="ãƒˆã‚°ãƒ«ãƒ¢ãƒ¼ãƒ‰ã®æ™‚ã«ãƒˆãƒªã‚¬ãƒ¼ã‚ーを 1 度押ã—ã¦æ”¾ã™ã¨ã€ãƒžã‚¤ã‚¯ã®ã‚ªãƒ³ãƒ»ã‚ªãƒ•è¨å®šã‚’切り替ãˆã¾ã™ã€‚ トグルモードã§ã¯ãªã„ã¨ãã¯ã€ãƒˆãƒªã‚¬ãƒ¼ã‚ーを押ã—ãŸçŠ¶æ…‹ã®æ™‚ã®ã¿ã‚ãªãŸã®å£°ãŒç›¸æ‰‹ã«èžã“ãˆã¾ã™ã€‚"/> <line_editor label="プッシュ・トゥ・スピークã®ãƒˆãƒªã‚¬ãƒ¼" name="modifier_combo"/> <button label="ã‚ーè¨å®š" name="set_voice_hotkey_button"/> - <button label="マウスã®ä¸å¤®ãƒœã‚¿ãƒ³" name="set_voice_middlemouse_button"/> + <button label="マウスã®ä¸å¤®ãƒœã‚¿ãƒ³" name="set_voice_middlemouse_button" tool_tip="マウスã®ä¸å¤®ãƒœã‚¿ãƒ³ã«ãƒªã‚»ãƒƒãƒˆã—ã¾ã™"/> + <button label="ãã®ä»–ã®ãƒ‡ã‚£ãƒã‚¤ã‚¹" name="joystick_setup_button"/> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_alerts.xml b/indra/newview/skins/default/xui/ja/panel_preferences_alerts.xml index 16af659326..7fd2e31698 100644 --- a/indra/newview/skins/default/xui/ja/panel_preferences_alerts.xml +++ b/indra/newview/skins/default/xui/ja/panel_preferences_alerts.xml @@ -4,11 +4,11 @@ 知らã›ã‚‹ï¼š </text> <check_box label="リンデンドルを使用・å—ã‘å–ã‚‹ã¨ã" name="notify_money_change_checkbox"/> - <check_box label="フレンドãŒãƒã‚°ã‚¢ã‚¦ãƒˆãƒ»ãƒã‚°ã‚¤ãƒ³ã™ã‚‹ã¨ã" name="friends_online_notify_checkbox"/> + <check_box label="フレンドãŒãƒã‚°ã‚¤ãƒ³ãƒ»ãƒã‚°ã‚¢ã‚¦ãƒˆã™ã‚‹ã¨ã" name="friends_online_notify_checkbox"/> <text name="show_label" width="300"> - 常ã«è¡¨ç¤ºã™ã‚‹é€šçŸ¥ï¼š + 常ã«è¡¨ç¤ºã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ï¼š </text> <text name="dont_show_label"> - 表示ã—ãªã„通知: + 表示ã—ãªã„メッセージ: </text> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml b/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml index ece18a75ca..86f880de09 100644 --- a/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml @@ -1,33 +1,39 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="ãƒãƒ£ãƒƒãƒˆ" name="chat"> + <text name="font_size"> + æ–‡å—ã®å¤§ãã•: + </text> <radio_group name="chat_font_size"> <radio_item label="å°" name="radio" value="0"/> <radio_item label="ä¸" name="radio2" value="1"/> <radio_item label="大" name="radio3" value="2"/> </radio_group> + <text name="font_colors"> + æ–‡å—ã®è‰²ï¼š + </text> <color_swatch label="自分" name="user"/> <text name="text_box1"> - ミー + 自分 </text> <color_swatch label="ãã®ä»–" name="agent"/> <text name="text_box2"> - ãã®ä»– + 他人 </text> <color_swatch label="IM" name="im"/> <text name="text_box3"> IM </text> - <color_swatch label="システム" name="system"/> + <color_swatch label="システム" name="system"/> <text name="text_box4"> - システム + システム</text> <color_swatch label="エラー" name="script_error"/> <text name="text_box5"> エラー </text> - <color_swatch label="オブジェクト" name="objects"/> + <color_swatch label="オブジェクト" name="objects"/> <text name="text_box6"> - オブジェクト + オブジェクト </text> <color_swatch label="所有者" name="owner"/> <text name="text_box7"> @@ -37,11 +43,17 @@ <text name="text_box9"> URL </text> - <check_box initial_value="true" label="ãƒãƒ£ãƒƒãƒˆä¸ã¯ã‚¿ã‚¤ãƒ”ング動作ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’å†ç”Ÿ" name="play_typing_animation"/> - <check_box label="オフライン時ã«å—ã‘å–ã£ãŸ IM をメールã§é€ä¿¡" name="send_im_to_email"/> - <check_box label="æ–‡å—ãƒãƒ£ãƒƒãƒˆã®å±¥æ´ã‚’有効ã«ã™ã‚‹" name="plain_text_chat_history"/> - <radio_group name="chat_window" tool_tip="インスタントメッセージを別ウィンドウã€ã¾ãŸã¯1ã¤ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã«è¤‡æ•°ã‚¿ãƒ–ã§è¡¨ç¤ºï¼ˆè¦å†èµ·å‹•)"> - <radio_item label="複数ウィンドウ" name="radio" value="0"/> - <radio_item label="1ã¤ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" name="radio2" value="1"/> + <check_box initial_value="true" label="ãƒãƒ£ãƒƒãƒˆä¸ã«ã‚¿ã‚¤ãƒ”ング動作ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’å†ç”Ÿ" name="play_typing_animation"/> + <check_box label="オフライン時ã«å—ã‘å–ã£ãŸ IM をメールã§å—ä¿¡" name="send_im_to_email"/> + <check_box label="IM ã¨ãƒãƒ£ãƒƒãƒˆå±¥æ´ã«æ–‡å—ã ã‘表示ã™ã‚‹" name="plain_text_chat_history"/> + <text name="show_ims_in_label"> + IM ã®è¡¨ç¤ºæ–¹æ³•: + </text> + <text name="requires_restart_label"> + (å†èµ·å‹•後ã«åæ˜ ï¼‰ + </text> + <radio_group name="chat_window" tool_tip="インスタントメッセージを別フãƒãƒ¼ã‚¿ãƒ¼ã€ã¾ãŸã¯1ã¤ã®ãƒ•ãƒãƒ¼ã‚¿ãƒ¼ã«è¤‡æ•°ã‚¿ãƒ–ã§è¡¨ç¤ºã—ã¾ã™ï¼ˆè¦å†èµ·å‹•)"> + <radio_item label="別々ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" name="radio" value="0"/> + <radio_item label="タブ" name="radio2" value="1"/> </radio_group> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_general.xml b/indra/newview/skins/default/xui/ja/panel_preferences_general.xml index 765662b96a..4ccb70b321 100644 --- a/indra/newview/skins/default/xui/ja/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/ja/panel_preferences_general.xml @@ -24,16 +24,16 @@ </text> <text name="maturity_desired_textbox"/> <combo_box name="maturity_desired_combobox"> - <combo_box.item label="ä¸€èˆ¬ã€æŽ§ãˆã‚ã€ã‚¢ãƒ€ãƒ«ãƒˆ" name="Desired_Adult"/> - <combo_box.item label="ä¸€èˆ¬ã¨æŽ§ãˆã‚" name="Desired_Mature"/> - <combo_box.item label="一般" name="Desired_PG"/> + <combo_box.item label="Generalã€Moderateã€Adult" name="Desired_Adult"/> + <combo_box.item label="General 㨠Moderate" name="Desired_Mature"/> + <combo_box.item label="General" name="Desired_PG"/> </combo_box> <text name="start_location_textbox"> ãƒã‚°ã‚¤ãƒ³ä½ç½®ï¼š </text> <combo_box name="start_location_combo"> <combo_box.item label="最後ã«ãƒã‚°ã‚¢ã‚¦ãƒˆã—ãŸå ´æ‰€" name="MyLastLocation" tool_tip="å¸¸ã«æœ€å¾Œã«ã„ãŸå ´æ‰€ã«ãƒã‚°ã‚¤ãƒ³"/> - <combo_box.item label="自宅(ホーム)" name="MyHome" tool_tip="常ã«è‡ªå®…(ホーム)ã«ãƒã‚°ã‚¤ãƒ³"/> + <combo_box.item label="ホーム" name="MyHome" tool_tip="常ã«ãƒ›ãƒ¼ãƒ (自宅)ã«ãƒã‚°ã‚¤ãƒ³"/> </combo_box> <check_box initial_value="true" label="ãƒã‚°ã‚¤ãƒ³ç”»é¢ã«è¡¨ç¤ºã™ã‚‹" name="show_location_checkbox"/> <text name="name_tags_textbox"> @@ -44,21 +44,21 @@ <radio_item label="オン" name="radio2" value="1"/> <radio_item label="一時的ã«è¡¨ç¤º" name="radio3" value="2"/> </radio_group> - <check_box label="ç§ã®åå‰ã‚’表示" name="show_my_name_checkbox1"/> + <check_box label="自分ã®åå‰ã‚’表示" name="show_my_name_checkbox1"/> <check_box initial_value="true" label="å°ã•ã„ã‚¢ãƒã‚¿ãƒ¼å" name="small_avatar_names_checkbox"/> <check_box label="グループタイトルを表示" name="show_all_title_checkbox1"/> <text name="effects_color_textbox"> - ç§ã®ãƒ“ームã®è‰²ï¼š + ビームã®è‰²ï¼š </text> <text name="title_afk_text"> 一時退å¸ã¾ã§ã®æ™‚間: </text> - <color_swatch label="" name="effect_color_swatch" tool_tip="カラー・ピッカーをクリックã—ã¦é–‹ã"/> + <color_swatch label="" name="effect_color_swatch" tool_tip="クリックã§ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/> <combo_box label="一時退å¸ã¾ã§ã®æ™‚間:" name="afk"> - <combo_box.item label="2分" name="item0"/> - <combo_box.item label="5分" name="item1"/> - <combo_box.item label="10分" name="item2"/> - <combo_box.item label="30分" name="item3"/> + <combo_box.item label="2 分" name="item0"/> + <combo_box.item label="5 分" name="item1"/> + <combo_box.item label="10 分" name="item2"/> + <combo_box.item label="30 分" name="item3"/> <combo_box.item label="一時退å¸è¨å®šãªã—" name="item4"/> </combo_box> <text name="text_box3"> diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/ja/panel_preferences_graphics1.xml index 191748fe91..75de773366 100644 --- a/indra/newview/skins/default/xui/ja/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/ja/panel_preferences_graphics1.xml @@ -1,19 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="表示" name="Display panel"> - <text name="WindowSizeLabel"> - ウィンドウ・サイズ: - </text> - <check_box label="全画é¢" name="windowed mode"/> - <combo_box name="windowsize combo"> - <combo_box.item label="640x480" name="640x480"/> - <combo_box.item label="800x600" name="800x600"/> - <combo_box.item label="720x480 (NTSC)" name="720x480"/> - <combo_box.item label="768x576 (PAL)" name="768x576"/> - <combo_box.item label="1024x768" name="1024x768"/> - </combo_box> - <text name="UI Size:"> - UI サイズ: - </text> <text name="QualitySpeed"> クオリティã¨ã‚¹ãƒ”ード: </text> @@ -55,7 +41,7 @@ <text name="AvatarRenderingText"> ã‚¢ãƒã‚¿ãƒ¼è¡¨ç¤ºï¼š </text> - <check_box initial_value="true" label="ã‚¢ãƒã‚¿ãƒ¼ã®ç²¾åº¦ã‚’上ã’ã‚‹" name="AvatarImpostors"/> + <check_box initial_value="true" label="ã‚¢ãƒã‚¿ãƒ¼ã®æç”»ã‚’簡略化" name="AvatarImpostors"/> <check_box initial_value="true" label="ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã‚¹ã‚ニング" name="AvatarVertexProgram"/> <check_box initial_value="true" label="ã‚¢ãƒã‚¿ãƒ¼ã®å¸ƒ" name="AvatarCloth"/> <slider label="æç”»è·é›¢ï¼š" name="DrawDistance"/> @@ -63,6 +49,10 @@ m </text> <slider label="最大パーティクル数:" name="MaxParticleCount"/> + <slider label="ã‚¢ãƒã‚¿ãƒ¼æœ€å¤§æç”»è·é›¢ï¼š" name="MaxAvatarDrawDistance"/> + <text name="DrawDistanceMeterText3"> + m + </text> <slider label="ãƒã‚¹ãƒˆãƒ—ãƒã‚»ã‚¹å“質:" name="RenderPostProcess"/> <text name="MeshDetailText"> メッシュ詳細: @@ -98,8 +88,8 @@ ライティング詳細: </text> <radio_group name="LightingDetailRadio"> - <radio_item label="å¤ªé™½ã¨æœˆã®ã¿" name="SunMoon"/> - <radio_item label="è¿‘ãã®ãƒãƒ¼ã‚«ãƒ«ã‚µã‚¤ãƒˆ" name="LocalLights"/> + <radio_item label="å¤ªé™½ã¨æœˆã®ã¿" name="SunMoon" value="0"/> + <radio_item label="è¿‘ãã®ãƒãƒ¼ã‚«ãƒ«ã‚µã‚¤ãƒˆ" name="LocalLights" value="1"/> </radio_group> <text name="TerrainDetailText"> 地形詳細: diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/ja/panel_preferences_privacy.xml index 7a7cb8b96b..b81889b412 100644 --- a/indra/newview/skins/default/xui/ja/panel_preferences_privacy.xml +++ b/indra/newview/skins/default/xui/ja/panel_preferences_privacy.xml @@ -3,22 +3,20 @@ <panel.string name="log_in_to_change"> ãƒã‚°ã‚¤ãƒ³ã—ã¦å¤‰æ›´ </panel.string> - <button label="å±¥æ´ã®æ¶ˆåŽ»" name="clear_cache"/> + <button label="å±¥æ´ã‚’消去" name="clear_cache" tool_tip="ãƒã‚°ã‚¤ãƒ³ç”»åƒã€æœ€å¾Œã«ã„ãŸå ´æ‰€ã€ãƒ†ãƒ¬ãƒãƒ¼ãƒˆå±¥æ´ã€Webã€ãƒ†ã‚¯ã‚¹ãƒãƒ£ã‚ャッシュを削除ã—ã¾ã™"/> <text name="cache_size_label_l"> (ä½ç½®ã€ç”»åƒã€webã€æ¤œç´¢å±¥æ´ï¼‰ </text> - <check_box label="ç§ã®ã‚ªãƒ³ãƒ©ã‚¤ãƒ³çжæ³ã‚’確èªã§ãã‚‹ã®ã¯ã€ãƒ•レンドã¨ã‚°ãƒ«ãƒ¼ãƒ—ã ã‘" name="online_visibility"/> - <check_box label="フレンドã¨ã‚°ãƒ«ãƒ¼ãƒ—以外ã‹ã‚‰ã¯ã‚³ãƒ¼ãƒ«ã¨IMã‚’å—ä¿¡ã—ãªã„" name="voice_call_friends_only_check"/> - <check_box label="コールãŒçµ‚了ã—ãŸã‚‰ãƒžã‚¤ã‚¯ã®ã‚¹ã‚¤ãƒƒãƒã‚’切る" name="auto_disengage_mic_check"/> - <check_box label="Cookieã‚’å—ã‘入れる" name="cookies_enabled"/> - <check_box label="ãƒ¡ãƒ‡ã‚£ã‚¢ãŒæœ‰åйã§ã™" name="media_enabled"/> - <check_box label="メディアを自動å†ç”Ÿã™ã‚‹" name="autoplay_enabled"/> + <check_box label="ç§ã®ã‚ªãƒ³ãƒ©ã‚¤ãƒ³çŠ¶æ…‹ã‚’ç¢ºèªã§ãã‚‹ã®ã¯ã€ãƒ•レンドã¨ã‚°ãƒ«ãƒ¼ãƒ—ã ã‘" name="online_visibility"/> + <check_box label="フレンドã¨ã‚°ãƒ«ãƒ¼ãƒ—以外ã‹ã‚‰ã¯ã‚³ãƒ¼ãƒ«ã¨ IM ã‚’å—ä¿¡ã—ãªã„" name="voice_call_friends_only_check"/> + <check_box label="コールãŒçµ‚了ã—ãŸã‚‰è‡ªå‹•çš„ã«ãƒžã‚¤ã‚¯ã®ã‚¹ã‚¤ãƒƒãƒã‚’切る" name="auto_disengage_mic_check"/> + <check_box label="Cookie ã‚’å—ã‘入れる" name="cookies_enabled"/> <text name="Logs:"> ãƒã‚°ï¼š </text> - <check_box label="コンピューターã«è¿‘ãã®ãƒãƒ£ãƒƒãƒˆãƒã‚°ã‚’ä¿å˜ã™ã‚‹" name="log_nearby_chat"/> - <check_box label="コンピューター㫠IM ãƒã‚°ã‚’ä¿å˜ã™ã‚‹" name="log_instant_messages"/> - <check_box label="ã‚¿ã‚¤ãƒ ã‚¹ã‚¿ãƒ³ãƒ—ã‚’è¿½åŠ ã™ã‚‹" name="show_timestamps_check_im"/> + <check_box label="è¿‘ãã®ãƒãƒ£ãƒƒãƒˆãƒã‚°ã‚’コンピューターã«ä¿å˜ã™ã‚‹" name="log_nearby_chat"/> + <check_box label="IM ãƒã‚°ã‚’コンピューターã«ä¿å˜ã™ã‚‹" name="log_instant_messages"/> + <check_box label="日時を入れる" name="show_timestamps_check_im"/> <text name="log_path_desc"> ãƒã‚°ã®ä¿å˜å ´æ‰€ï¼š </text> diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_setup.xml b/indra/newview/skins/default/xui/ja/panel_preferences_setup.xml index 12e21709ae..653d9fd3b3 100644 --- a/indra/newview/skins/default/xui/ja/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/ja/panel_preferences_setup.xml @@ -5,7 +5,7 @@ 一人称視点: </text> <text name=" Mouse Sensitivity"> - マウスã®ç²¾åº¦ + ãƒžã‚¦ã‚¹ã®æ„Ÿåº¦ </text> <check_box label="切り替ãˆ" name="invert_mouse"/> <text name="Network:"> @@ -18,29 +18,32 @@ kbps </text> <check_box label="カスタムãƒãƒ¼ãƒˆ" name="connection_port_enabled"/> - <spinner label="ãƒãƒ¼ãƒˆç•ªå·ï¼š" name="web_proxy_port"/> + <spinner label="ãƒãƒ¼ãƒˆç•ªå·ï¼š" name="connection_port"/> <text name="cache_size_label_l"> ã‚ャッシュサイズ </text> <text name="text_box5"> MB </text> - <button label="å‚ç…§" label_selected="å‚ç…§" name="set_cache"/> - <button label="リセット" label_selected="リセット" name="reset_cache"/> <text name="Cache location"> ã‚ャッシュã®ä¿å˜å ´æ‰€ï¼š </text> + <button label="å‚ç…§" label_selected="å‚ç…§" name="set_cache"/> + <button label="リセット" label_selected="リセット" name="reset_cache"/> <text name="Web:"> Web: </text> <radio_group name="use_external_browser"> - <radio_item label="内蔵ブラウザを使用" name="internal" tool_tip="内蔵ブラウザã§ãƒ˜ãƒ«ãƒ—ã‚„Webリンクãªã©ã‚’見ã¾ã™ã€‚[APP_NAME] å†…ã«æ–°ã—ã„ウィンドウã§ã“ã®ãƒ–ラウザãŒé–‹ãã¾ã™ã€‚"/> - <radio_item label="外部ブラウザ(IEã‚„Firefox)を使用" name="external" tool_tip="デフォルトã®ã‚·ã‚¹ãƒ†ãƒ Webブラウザã§ãƒ˜ãƒ«ãƒ—ã‚„Webリンク先ãªã©ã‚’見ã¾ã™ã€‚全画é¢ã§èµ·å‹•ä¸ã«ã¯ãŠã™ã™ã‚ã—ã¾ã›ã‚“。"/> + <radio_item label="指定ã®ãƒ–ラウザ(IE ã‚„ Firefox)を使用" name="external" tool_tip="デフォルトã®ã‚·ã‚¹ãƒ†ãƒ Web ブラウザã§ãƒ˜ãƒ«ãƒ—ã‚„ Web リンク先ãªã©ã‚’見ã¾ã™ã€‚全画é¢ã§èµ·å‹•ä¸ã«ã¯ãŠã™ã™ã‚ã—ã¾ã›ã‚“。" value="1"/> + <radio_item label="内蔵ブラウザを使用" name="internal" tool_tip="内蔵ブラウザã§ãƒ˜ãƒ«ãƒ—ã‚„ Web リンクãªã©ã‚’見ã¾ã™ã€‚[APP_NAME] å†…ã«æ–°ã—ã„ウィンドウã§ã“ã®ãƒ–ラウザãŒé–‹ãã¾ã™ã€‚" value=""/> </radio_group> - <check_box initial_value="false" label="Webプãƒã‚ã‚·" name="web_proxy_enabled"/> - <line_editor name="web_proxy_editor" tool_tip="使用ã™ã‚‹ãƒ—ãƒã‚ã‚·åã¾ãŸã¯IPアドレス"/> - <button label="å‚ç…§" label_selected="å‚ç…§" name="set_proxy"/> + <check_box initial_value="true" label="プラグインを有効ã«ã™ã‚‹" name="browser_plugins_enabled"/> + <check_box initial_value="true" label="Cookie ã‚’å—ã‘入れる" name="cookies_enabled"/> + <check_box initial_value="true" label="Javascript を有効ã«ã™ã‚‹" name="browser_javascript_enabled"/> + <check_box initial_value="false" label="Web プãƒã‚シを有効ã«ã™ã‚‹" name="web_proxy_enabled"/> <text name="Proxy location"> プãƒã‚シ: </text> + <line_editor name="web_proxy_editor" tool_tip="使用ã™ã‚‹ãƒ—ãƒã‚ã‚·ã®ãƒ›ã‚¹ãƒˆåã¾ãŸã¯ IP アドレス"/> + <spinner label="ãƒãƒ¼ãƒˆç•ªå·ï¼š" name="web_proxy_port"/> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml b/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml index 9fb0dd0b46..abbd29286b 100644 --- a/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml @@ -2,13 +2,20 @@ <panel label="サウンド" name="Preference Media panel"> <slider label="全体ã®éŸ³é‡" name="System Volume"/> <check_box initial_value="true" label="最å°åŒ–ã§ãƒŸãƒ¥ãƒ¼ãƒˆ" name="mute_when_minimized"/> - <slider label="風" name="Wind Volume"/> <slider label="ボタン" name="UI Volume"/> - <slider label="メディア" name="Media Volume"/> + <slider label="風" name="Wind Volume"/> <slider label="効果音" name="SFX Volume"/> <slider label="ストリーミング音楽" name="Music Volume"/> - <check_box label="ボイスを有効ã«ã™ã‚‹" name="enable_voice_check"/> - <slider label="ボイス" name="Voice Volume"/> + <check_box label="有効" name="music_enabled"/> + <slider label="メディア" name="Media Volume"/> + <check_box label="有効" name="enable_media"/> + <slider label="ボイスãƒãƒ£ãƒƒãƒˆ" name="Voice Volume"/> + <check_box label="有効" name="enable_voice_check"/> + <check_box label="メディアを自動å†ç”Ÿã™ã‚‹" name="media_auto_play_btn" tool_tip="ã“ã“ã«ãƒã‚§ãƒƒã‚¯ã‚’入れã¦ãƒ¡ãƒ‡ã‚£ã‚¢ã®è‡ªå‹•å†ç”Ÿã‚’許å¯ã—ã¾ã™" value="true"/> + <check_box label="ä»–ã®ã‚¢ãƒã‚¿ãƒ¼ã«å–り付ã‘られãŸãƒ¡ãƒ‡ã‚£ã‚¢ã‚’å†ç”Ÿã™ã‚‹" name="media_show_on_others_btn" tool_tip="ã“ã®ãƒã‚§ãƒƒã‚¯ã‚’外ã™ã¨ã€è¿‘ãã«ã„ã‚‹ä»–ã®ã‚¢ãƒã‚¿ãƒ¼ã«å–り付ã‘られãŸãƒ¡ãƒ‡ã‚£ã‚¢ã‚’éžè¡¨ç¤ºã«ã—ã¾ã™" value="true"/> + <text name="voice_chat_settings"> + ボイスãƒãƒ£ãƒƒãƒˆã®è¨å®š + </text> <text name="Listen from"> æ–¹å‘: </text> diff --git a/indra/newview/skins/default/xui/ja/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/ja/panel_prim_media_controls.xml index 0e1e2851e3..a9897c7ae4 100644 --- a/indra/newview/skins/default/xui/ja/panel_prim_media_controls.xml +++ b/indra/newview/skins/default/xui/ja/panel_prim_media_controls.xml @@ -13,10 +13,10 @@ </layout_stack> <layout_stack name="media_controls"> <layout_panel name="back"> - <button name="back_btn" tool_tip="Navigate back"/> + <button name="back_btn" tool_tip="å‰ã¸"/> </layout_panel> <layout_panel name="fwd"> - <button name="fwd_btn" tool_tip="Navigate forward"/> + <button name="fwd_btn" tool_tip="次ã¸"/> </layout_panel> <layout_panel name="home"> <button name="home_btn" tool_tip="ホームページ"/> @@ -51,10 +51,10 @@ <slider_bar initial_value="0.5" name="media_play_slider" tool_tip="ムービーå†ç”Ÿé€²è¡Œ"/> </layout_panel> <layout_panel name="skip_back"> - <button name="skip_back_btn" tool_tip="Step back"/> + <button name="skip_back_btn" tool_tip="å‰ã«ã‚¹ãƒ†ãƒƒãƒ—"/> </layout_panel> <layout_panel name="skip_forward"> - <button name="skip_forward_btn" tool_tip="Step forward"/> + <button name="skip_forward_btn" tool_tip="次ã«ã‚¹ãƒ†ãƒƒãƒ—"/> </layout_panel> <layout_panel name="media_volume"> <button name="media_mute_button" tool_tip="ミュート"/> @@ -64,10 +64,10 @@ <button name="zoom_frame_btn" tool_tip="メディアã«ã‚ºãƒ¼ãƒ イン"/> </layout_panel> <layout_panel name="close"> - <button name="close_btn" tool_tip="Zoom Back"/> + <button name="close_btn" tool_tip="ズームãƒãƒƒã‚¯"/> </layout_panel> <layout_panel name="new_window"> - <button name="new_window_btn" tool_tip="URLをブラウザã§é–‹ã"/> + <button name="new_window_btn" tool_tip="URL をブラウザã§é–‹ã"/> </layout_panel> </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_profile.xml b/indra/newview/skins/default/xui/ja/panel_profile.xml index 98969f5ab3..e7bc989c52 100644 --- a/indra/newview/skins/default/xui/ja/panel_profile.xml +++ b/indra/newview/skins/default/xui/ja/panel_profile.xml @@ -26,13 +26,16 @@ <panel name="first_life_image_panel"> <text name="title_rw_descr_text" value="ç¾å®Ÿä¸–界:"/> </panel> - <text name="title_member_text" value="ä½äººã¨ãªã£ãŸæ—¥ï¼š"/> + <text name="title_member_text" value="ä½äººç™»éŒ²ï¼š"/> <text name="title_acc_status_text" value="アカウントã®çŠ¶æ…‹ï¼š"/> - <text name="acc_status_text"> + <text_editor name="acc_status_text"> ä½äººã€‚ æ”¯æ‰•æƒ…å ±æœªç™»éŒ²ã€‚ リンデン。 - </text> + </text_editor> <text name="title_partner_text" value="パートナー:"/> + <panel name="partner_data_panel"> + <name_box initial_value="(å–å¾—ä¸ï¼‰" name="partner_text"/> + </panel> <text name="title_groups_text" value="グループ:"/> </panel> </scroll_container> @@ -40,9 +43,10 @@ <layout_panel name="profile_buttons_panel"> <button label="フレンド登録" name="add_friend" tool_tip="フレンド登録を申ã—出ã¾ã™"/> <button label="IM" name="im" tool_tip="インスタントメッセージを開ãã¾ã™"/> - <button label="コール" name="call" tool_tip="ã“ã®ä½äººã«ã‚³ãƒ¼ãƒ«ã™ã‚‹"/> - <button label="地図" name="show_on_map_btn" tool_tip="ä½äººã‚’地図上ã§è¡¨ç¤ºã™ã‚‹"/> - <button label="テレãƒãƒ¼ãƒˆ" name="teleport" tool_tip="テレãƒãƒ¼ãƒˆã‚’é€ã‚‹"/> + <button label="コール" name="call" tool_tip="ã“ã®ä½äººã«ã‚³ãƒ¼ãƒ«ã—ã¾ã™"/> + <button label="地図" name="show_on_map_btn" tool_tip="ä½äººã‚’地図上ã§è¡¨ç¤ºã—ã¾ã™"/> + <button label="テレãƒãƒ¼ãƒˆ" name="teleport" tool_tip="テレãƒãƒ¼ãƒˆã‚’é€ã‚Šã¾ã™"/> + <button label="â–¼" name="overflow_btn" tool_tip="ä½äººã«ãŠé‡‘を渡ã™ã‹æŒã¡ç‰©ã‚’共有ã—ã¾ã™"/> </layout_panel> <layout_panel name="profile_me_buttons_panel"> <button label="プãƒãƒ•ィールã®ç·¨é›†" name="edit_profile_btn" tool_tip="å€‹äººçš„ãªæƒ…å ±ã‚’ç·¨é›†ã—ã¾ã™"/> diff --git a/indra/newview/skins/default/xui/ja/panel_region_covenant.xml b/indra/newview/skins/default/xui/ja/panel_region_covenant.xml index 5f43f93113..5214f79141 100644 --- a/indra/newview/skins/default/xui/ja/panel_region_covenant.xml +++ b/indra/newview/skins/default/xui/ja/panel_region_covenant.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="約款" name="Covenant"> - <text font="SansSerifLarge" name="estate_section_lbl"> - エステート(ä¸å‹•産) + <text font="SansSerifLarge" name="estate_section_lbl" width="200"> + ä¸å‹•産 </text> <text name="estate_name_lbl"> åå‰ï¼š @@ -26,14 +26,14 @@ ã“ã®ä¸å‹•産ã«ã¯ç´„款ãŒã‚りã¾ã›ã‚“。 </text_editor> <button label="リセット" name="reset_covenant"/> - <text name="covenant_help_text"> + <text name="covenant_help_text" left="100"> 約款ã®å¤‰æ›´ã¯ä¸å‹•産全区画ã«é©ç”¨ã¨ãªã‚Šã¾ã™ã€‚ </text> - <text name="covenant_instructions"> - ã“ã®ä¸å‹•産約款ã®å¤‰æ›´ã‚’ã™ã‚‹éš›ã¯ã€ãƒŽãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã‚’ドラッグ&ドãƒãƒƒãƒ—ã—ã¦ãã ã•ã„。 + <text name="covenant_instructions" width="390"> + ã“ã®ä¸å‹•産約款を変更ã™ã‚‹éš›ã¯ã€ãƒŽãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã‚’ドラッグ&ドãƒãƒƒãƒ—ã—ã¦ãã ã•ã„。 </text> - <text bottom_delta="-34" font="SansSerifLarge" name="region_section_lbl"> - リージョン(地域) + <text bottom_delta="-34" font="SansSerifLarge" name="region_section_lbl" width="200"> + 地域 </text> <text name="region_name_lbl"> åå‰ï¼š diff --git a/indra/newview/skins/default/xui/ja/panel_region_debug.xml b/indra/newview/skins/default/xui/ja/panel_region_debug.xml index 4209fb17e5..f6865c12b1 100644 --- a/indra/newview/skins/default/xui/ja/panel_region_debug.xml +++ b/indra/newview/skins/default/xui/ja/panel_region_debug.xml @@ -6,11 +6,11 @@ <text name="region_text"> 未知 </text> - <check_box label="スクリプト無効化" name="disable_scripts_check" tool_tip="ã“ã®åœ°åŸŸã®ã‚¹ã‚¯ãƒªãƒ—トをã™ã¹ã¦ç„¡åŠ¹åŒ–"/> + <check_box label="スクリプト無効化" name="disable_scripts_check" tool_tip="ã“ã®åœ°åŸŸã®ã‚¹ã‚¯ãƒªãƒ—トをã™ã¹ã¦ç„¡åйã«ã—ã¾ã™"/> <button label="?" name="disable_scripts_help"/> - <check_box label="è¡çªã‚’無効化" name="disable_collisions_check" tool_tip="ã“ã®åœ°åŸŸã®éžã‚¢ãƒã‚¿ãƒ¼è¡çªã‚’無効化"/> + <check_box label="è¡çªã‚’無効化" name="disable_collisions_check" tool_tip="ã“ã®åœ°åŸŸã®éžã‚¢ãƒã‚¿ãƒ¼è¡çªã‚’無効ã«ã—ã¾ã™"/> <button label="?" name="disable_collisions_help"/> - <check_box label="物ç†ä½œç”¨ã‚’無効化" name="disable_physics_check" tool_tip="ã“ã®åœ°åŸŸã®ç‰©ç†ä½œç”¨ã‚’ã™ã¹ã¦ç„¡åŠ¹åŒ–"/> + <check_box label="物ç†ä½œç”¨ã‚’無効化" name="disable_physics_check" tool_tip="ã“ã®åœ°åŸŸã®ç‰©ç†ä½œç”¨ã‚’ã™ã¹ã¦ç„¡åйã«ã—ã¾ã™"/> <button label="?" name="disable_physics_help"/> <button label="é©ç”¨" name="apply_btn"/> <text name="objret_text_lbl" width="120"> @@ -27,14 +27,14 @@ オプション: </text> <check_box label="スクリプト付ãã®ã‚‚ã®" name="return_scripts" tool_tip="スクリプトã®ã‚ªãƒ–ジェクトã ã‘è¿”å´ã—ã¾ã™"/> - <check_box label="他人ã®åœŸåœ°ã«ã‚ã‚‹ã‚‚ã®" name="return_other_land" tool_tip="他人ã«å±žã™ã‚‹åœŸåœ°ã«ã‚るオブジェクトã®ã¿ã‚’è¿”å´"/> - <check_box label="ã“ã®ä¸å‹•産ã«å±žã™ã‚‹ã™ã¹ã¦ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã®ã‚‚ã®" name="return_estate_wide" tool_tip="ã“ã®ä¸å‹•産ã«å«ã¾ã‚Œã¦ã„ã‚‹ã™ã¹ã¦ã®åœ°åŸŸã®ã‚ªãƒ–ジェクトを返å´"/> + <check_box label="他人ã®åœŸåœ°ã«ã‚ã‚‹ã‚‚ã®" name="return_other_land" tool_tip="他人ã«å±žã™ã‚‹åœŸåœ°ã«ã‚るオブジェクトã®ã¿ã‚’è¿”å´ã—ã¾ã™"/> + <check_box label="ã“ã®ä¸å‹•産ã«å±žã™ã‚‹ã™ã¹ã¦ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã®ã‚‚ã®" name="return_estate_wide" tool_tip="ã“ã®ä¸å‹•産ã«å«ã¾ã‚Œã¦ã„ã‚‹ã™ã¹ã¦ã®åœ°åŸŸã®ã‚ªãƒ–ジェクトを返å´ã—ã¾ã™"/> <button label="è¿”å´" name="return_btn"/> <button label="上部コライダーå–å¾—" name="top_colliders_btn" tool_tip="è¡çªã™ã‚‹å¯èƒ½æ€§ãŒæœ€ã‚‚高ã„オブジェクトã®ãƒªã‚¹ãƒˆ"/> <button label="?" name="top_colliders_help"/> <button label="上部スクリプトå–å¾—" name="top_scripts_btn" tool_tip="スクリプトã®å®Ÿè¡Œã«æœ€ã‚‚時間を費やã—ã¦ã„るオブジェクトã®ãƒªã‚¹ãƒˆ"/> <button label="?" name="top_scripts_help"/> - <button label="地域å†èµ·å‹•" name="restart_btn" tool_tip="2分間ã®ã‚«ã‚¦ãƒ³ãƒˆãƒ€ã‚¦ãƒ³å¾Œã€åœ°åŸŸã‚’å†èµ·å‹•"/> + <button label="地域å†èµ·å‹•" name="restart_btn" tool_tip="2分間ã®ã‚«ã‚¦ãƒ³ãƒˆãƒ€ã‚¦ãƒ³å¾Œã€åœ°åŸŸã‚’å†èµ·å‹•ã—ã¾ã™"/> <button label="?" name="restart_help"/> - <button label="å†èµ·å‹•ã‚’é…å»¶" name="cancel_restart_btn" tool_tip="地域ã®å†èµ·å‹•を1時間é…å»¶ã™ã‚‹"/> + <button label="å†èµ·å‹•ã‚’é…å»¶" name="cancel_restart_btn" tool_tip="地域ã®å†èµ·å‹•を1時間é…å»¶ã—ã¾ã™"/> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_region_estate.xml b/indra/newview/skins/default/xui/ja/panel_region_estate.xml index 976cfacb3f..5b2ef36045 100644 --- a/indra/newview/skins/default/xui/ja/panel_region_estate.xml +++ b/indra/newview/skins/default/xui/ja/panel_region_estate.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="ä¸å‹•産" name="Estate"> <text name="estate_help_text"> - ã“ã®ã‚¿ãƒ–ã®è¨å®šã¸ã®å¤‰æ›´ã¯ã€ã‚¨ã‚¹ãƒ†ãƒ¼ãƒˆå†…ã®ã™ã¹ã¦ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«å½±éŸ¿ã•れã¾ã™ã€‚ + ã“ã®ã‚¿ãƒ–内ã®è¨å®šå¤‰æ›´ã¯ã€ä¸å‹•産内ã®ã™ã¹ã¦ã®åœ°åŸŸã«å½±éŸ¿ã—ã¾ã™ã€‚ </text> <text name="estate_text"> ä¸å‹•産: @@ -16,10 +16,10 @@ ï¼ˆä¸æ˜Žï¼‰ </text> <text name="Only Allow"> - 次ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã®ã‚¢ã‚¯ã‚»ã‚¹ç¦æ¢ï¼š + 次ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã®ã¿ã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯ï¼š </text> <check_box label="æ”¯æ‰•æƒ…å ±ç™»éŒ²æ¸ˆ" name="limit_payment" tool_tip="未確èªã®ä½äººã®ç«‹å…¥ã‚’ç¦æ¢ã—ã¾ã™"/> - <check_box label="年齢確èª" name="limit_age_verified" tool_tip="年齢確èªã‚’済ã¾ã›ã¦ã„ãªã„ä½äººã®ç«‹å…¥ã‚’ç¦æ¢ã—ã¾ã™ã€‚ 詳ã—ã„æƒ…å ±ã¯ [SUPPORT_SITE] ã‚’ã”覧下ã•ã„。"/> + <check_box label="å¹´é½¢ç¢ºèªæ¸ˆ" name="limit_age_verified" tool_tip="年齢確èªã‚’済ã¾ã›ã¦ã„ãªã„ä½äººã®ç«‹å…¥ã‚’ç¦æ¢ã—ã¾ã™ã€‚ 詳ã—ã„æƒ…å ±ã¯ [SUPPORT_SITE] ã‚’ã”覧下ã•ã„。"/> <check_box label="ボイスãƒãƒ£ãƒƒãƒˆã‚’許å¯" name="voice_chat_check"/> <button label="?" name="voice_chat_help"/> <text name="abuse_email_text"> @@ -40,7 +40,7 @@ <check_box label="太陽固定" name="fixed_sun_check"/> <button label="?" name="fixed_sun_help"/> <slider label="段階" name="sun_hour_slider"/> - <check_box label="パブリック・アクセスを許å¯" name="externally_visible_check"/> + <check_box label="パブリックアクセスを許å¯" name="externally_visible_check"/> <button label="?" name="externally_visible_help"/> <check_box label="直接テレãƒãƒ¼ãƒˆã‚’許å¯" name="allow_direct_teleport"/> <button label="?" name="allow_direct_teleport_help"/> @@ -69,6 +69,6 @@ <button label="?" name="ban_resident_help"/> <button label="è¿½åŠ ..." name="add_banned_avatar_btn"/> <button label="削除..." name="remove_banned_avatar_btn"/> - <button label="メッセージをä¸å‹•産ã¸é€ä¿¡..." name="message_estate_btn"/> - <button label="土地ã‹ã‚‰ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’追ã„出ã™..." name="kick_user_from_estate_btn"/> + <button label="メッセージをä¸å‹•産ã«é€ä¿¡..." name="message_estate_btn"/> + <button label="ä¸å‹•産ã‹ã‚‰ä½äººã‚’追ã„出ã™..." name="kick_user_from_estate_btn"/> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_region_general.xml b/indra/newview/skins/default/xui/ja/panel_region_general.xml index 00be5b6b03..54ec24773f 100644 --- a/indra/newview/skins/default/xui/ja/panel_region_general.xml +++ b/indra/newview/skins/default/xui/ja/panel_region_general.xml @@ -3,51 +3,41 @@ <text name="region_text_lbl"> 地域: </text> - <text left="90" name="region_text"> + <text left_delta="70" name="region_text"> 未知 </text> <text name="version_channel_text_lbl" width="100"> ãƒãƒ¼ã‚¸ãƒ§ãƒ³ï¼š </text> - <text left="90" name="version_channel_text"> + <text left_delta="70" name="version_channel_text"> 䏿˜Ž </text> <text name="region_type_lbl"> 種類: </text> - <text name="region_type"> + <text left_delta="70" name="region_type"> 䏿˜Ž </text> - <check_box label="土地整備をブãƒãƒƒã‚¯" name="block_terraform_check"/> - <button label="?" name="terraform_help"/> + <check_box label="地形編集をブãƒãƒƒã‚¯" name="block_terraform_check"/> <check_box label="飛行をブãƒãƒƒã‚¯" name="block_fly_check"/> - <button label="?" name="fly_help"/> <check_box label="ダメージを許å¯" name="allow_damage_check"/> - <button label="?" name="damage_help"/> <check_box label="プッシュを制é™" name="restrict_pushobject"/> - <button label="?" name="restrict_pushobject_help"/> <check_box label="土地ã®å†è²©ã‚’許å¯" name="allow_land_resell_check"/> - <button label="?" name="land_resell_help"/> - <check_box label="土地ã®çµ±åˆï¼åˆ†å‰²ã‚’許å¯" name="allow_parcel_changes_check"/> - <button label="?" name="parcel_changes_help"/> - <check_box label="åœŸåœ°ã®æ¤œç´¢è¡¨ç¤ºã‚’ブãƒãƒƒã‚¯" name="block_parcel_search_check" tool_tip="æ¤œç´¢çµæžœã§ã€ã“ã®åœ°åŸŸã¨åŒºç”»ã‚’人ã«è¦‹ã›ã‚‹"/> - <button label="?" name="parcel_search_help"/> + <check_box label="土地ã®çµ±åˆãƒ»åˆ†å‰²ã‚’許å¯" name="allow_parcel_changes_check"/> + <check_box label="åœŸåœ°ã®æ¤œç´¢è¡¨ç¤ºã‚’ブãƒãƒƒã‚¯" name="block_parcel_search_check" tool_tip="æ¤œç´¢çµæžœã§ã€ã“ã®åœ°åŸŸã¨åŒºç”»ã‚’表示ã™ã‚‹ã‹ã©ã†ã‹ã®è¨å®šã§ã™"/> <spinner label="ã‚¢ãƒã‚¿ãƒ¼æ•°ä¸Šé™" name="agent_limit_spin"/> - <button label="?" name="agent_limit_help"/> <spinner label="物体ボーナス" name="object_bonus_spin"/> - <button label="?" name="object_bonus_help"/> <text label="æˆäººæŒ‡å®š" name="access_text"> 区分: </text> - <combo_box label="控ãˆã‚" name="access_combo"> - <combo_box.item label="Adult" name="Adult"/> - <combo_box.item label="控ãˆã‚" name="Mature"/> - <combo_box.item label="一般" name="PG"/> - </combo_box> - <button label="?" name="access_help"/> + <icons_combo_box label="Moderate" name="access_combo"> + <icons_combo_box.item label="Adult" name="Adult" value="42"/> + <icons_combo_box.item label="Moderate" name="Mature" value="21"/> + <icons_combo_box.item label="General" name="PG" value="13"/> + </icons_combo_box> <button label="é©ç”¨" name="apply_btn"/> - <button label="ユーザー1人ホームテレãƒãƒ¼ãƒˆ" name="kick_btn"/> - <button label="ユーザー全員ホームテレãƒãƒ¼ãƒˆ" name="kick_all_btn"/> - <button label="メッセージを地域ã¸é€ä¿¡..." name="im_btn"/> + <button label="ä½äºº 1 åをホームã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ..." name="kick_btn"/> + <button label="ä½äººå…¨å“¡ã‚’ホームã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ..." name="kick_all_btn"/> + <button label="メッセージを地域ã«é€ä¿¡..." name="im_btn"/> <button label="テレãƒãƒ–ã®ç®¡ç†..." name="manage_telehub_btn"/> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_region_general_layout.xml b/indra/newview/skins/default/xui/ja/panel_region_general_layout.xml index 9673953d06..188a60eb60 100644 --- a/indra/newview/skins/default/xui/ja/panel_region_general_layout.xml +++ b/indra/newview/skins/default/xui/ja/panel_region_general_layout.xml @@ -1,21 +1,21 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="リージョン(地域)" name="General"> <text name="region_text_lbl"> - リージョン: + 地域: </text> - <text name="region_text"> + <text left_delta="70" name="region_text"> 䏿˜Ž </text> <text name="version_channel_text_lbl"> ãƒãƒ¼ã‚¸ãƒ§ãƒ³ï¼š </text> - <text name="version_channel_text"> + <text left_delta="70" name="version_channel_text"> 䏿˜Ž </text> <text name="region_type_lbl"> 種類: </text> - <text name="region_type"> + <text left_delta="70" name="region_type"> 䏿˜Ž </text> <check_box label="地形編集をブãƒãƒƒã‚¯" name="block_terraform_check"/> @@ -24,20 +24,20 @@ <check_box label="プッシュを制é™" name="restrict_pushobject"/> <check_box label="土地ã®å†è²©ã‚’許å¯" name="allow_land_resell_check"/> <check_box label="土地ã®çµ±åˆãƒ»åˆ†å‰²ã‚’許å¯" name="allow_parcel_changes_check"/> - <check_box label="åœŸåœ°ã®æ¤œç´¢æ•™ç¤ºã‚’ブãƒãƒƒã‚¯" name="block_parcel_search_check" tool_tip="ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã¨ãƒªãƒ¼ã‚¸ãƒ§ãƒ³å†…ã®åŒºç”»ã‚’æ¤œç´¢çµæžœã«è¡¨ç¤ºã™ã‚‹"/> - <spinner label="ã‚¢ãƒã‚¿ãƒ¼æ•°ä¸Šé™" name="agent_limit_spin"/> - <spinner label="オブジェクトボーナス" name="object_bonus_spin"/> + <check_box label="åœŸåœ°ã®æ¤œç´¢è¡¨ç¤ºã‚’ブãƒãƒƒã‚¯" name="block_parcel_search_check" tool_tip="æ¤œç´¢çµæžœã§ã€ã“ã®åœ°åŸŸã¨åŒºç”»ã‚’表示ã™ã‚‹ã‹ã©ã†ã‹ã®è¨å®šã§ã™"/> + <spinner label="ã‚¢ãƒã‚¿ãƒ¼æ•°ä¸Šé™" label_width="110" name="agent_limit_spin" width="190"/> + <spinner label="物体ボーナス" label_width="110" name="object_bonus_spin" width="190"/> <text label="レーティング区分" name="access_text"> レーティング区分: </text> - <combo_box label="控ãˆã‚" name="access_combo"> - <combo_box.item label="アダルト" name="Adult"/> - <combo_box.item label="控ãˆã‚" name="Mature"/> - <combo_box.item label="一般" name="PG"/> + <combo_box label="Moderate" name="access_combo"> + <combo_box.item label="Adult" name="Adult"/> + <combo_box.item label="Moderate" name="Mature"/> + <combo_box.item label="General" name="PG"/> </combo_box> <button label="é©ç”¨" name="apply_btn"/> - <button label="ユーザー1åをホームã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ..." name="kick_btn"/> - <button label="ユーザー全員をホームã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ..." name="kick_all_btn"/> - <button label="リージョンã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ä¿¡..." name="im_btn"/> + <button label="ä½äºº 1 åをホームã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ..." name="kick_btn"/> + <button label="ä½äººå…¨å“¡ã‚’ホームã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ..." name="kick_all_btn"/> + <button label="メッセージを地域ã«é€ä¿¡..." name="im_btn"/> <button label="テレãƒãƒ–ã®ç®¡ç†..." name="manage_telehub_btn"/> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_region_terrain.xml b/indra/newview/skins/default/xui/ja/panel_region_terrain.xml index d77f9749c2..8df803b2dc 100644 --- a/indra/newview/skins/default/xui/ja/panel_region_terrain.xml +++ b/indra/newview/skins/default/xui/ja/panel_region_terrain.xml @@ -18,13 +18,13 @@ <button label="?" name="fixed_sun_help" /> <slider label="段階" name="sun_hour_slider" /> <button label="é©ç”¨" name="apply_btn" /> - <button label="RAW地形ダウンãƒãƒ¼ãƒ‰..." name="download_raw_btn" - tool_tip="ä¸å‹•産オーナーã®ã¿åˆ©ç”¨å¯èƒ½ã€ç®¡ç†è€…ã¯åˆ©ç”¨ä¸å¯" /> + <button label="RAW 地形ダウンãƒãƒ¼ãƒ‰..." name="download_raw_btn" + tool_tip="ä¸å‹•産オーナーã®ã¿åˆ©ç”¨å¯èƒ½ã€ç®¡ç†è€…ã¯åˆ©ç”¨ä¸å¯ã§ã™" /> <button label="?" name="download_raw_help" /> - <button label="RAW地形アップãƒãƒ¼ãƒ‰..." name="upload_raw_btn" - tool_tip="ä¸å‹•産オーナーã®ã¿åˆ©ç”¨å¯èƒ½ã€ç®¡ç†è€…ã¯åˆ©ç”¨ä¸å¯" /> + <button label="RAW 地形アップãƒãƒ¼ãƒ‰..." name="upload_raw_btn" + tool_tip="ä¸å‹•産オーナーã®ã¿åˆ©ç”¨å¯èƒ½ã€ç®¡ç†è€…ã¯åˆ©ç”¨ä¸å¯ã§ã™" /> <button label="?" name="upload_raw_help" /> <button label="åœ°å½¢ã®æ§‹ç¯‰" name="bake_terrain_btn" - tool_tip="ç¾åœ¨ã®åœ°å½¢ã‚’上昇ï¼ä¸‹é™ç¯„囲ã®ä¸é–“点ã¨ã—ã¦è¨å®š" /> + tool_tip="ç¾åœ¨ã®åœ°å½¢ã‚’上昇・下é™ç¯„囲ã®ä¸é–“点ã¨ã—ã¦è¨å®šã—ã¾ã™" /> <button label="?" name="bake_terrain_help" /> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_region_texture.xml b/indra/newview/skins/default/xui/ja/panel_region_texture.xml index ea784df127..9e442ce091 100644 --- a/indra/newview/skins/default/xui/ja/panel_region_texture.xml +++ b/indra/newview/skins/default/xui/ja/panel_region_texture.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="地é¢ãƒ†ã‚¯ã‚¹ãƒãƒ£ãƒ¼" name="Textures"> +<panel label="地é¢ãƒ†ã‚¯ã‚¹ãƒãƒ£" name="Textures"> <text name="region_text_lbl"> 地域: </text> @@ -7,7 +7,7 @@ 未知 </text> <text name="detail_texture_text"> - 地形ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ãƒ¼ (512x512ã€24ビット .tgaファイルãŒå¿…è¦) + 地形ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ (512x512ã€24ビット .tgaファイルãŒå¿…è¦ã§ã™ï¼‰ </text> <text name="height_text_lbl"> 1(低) @@ -19,22 +19,22 @@ 3 </text> <text name="height_text_lbl4"> - 4(高) + 4(高) </text> <text name="height_text_lbl5"> - テクスãƒãƒ£ãƒ¼æ¨™é«˜ç¯„囲 + 地形テクスãƒãƒ£ã®éš†èµ·ç¯„囲 </text> <text name="height_text_lbl6"> - å—西 + 北西 </text> <text name="height_text_lbl7"> - 北西 + åŒ—æ± </text> <text name="height_text_lbl8"> - å—æ± + å—西 </text> <text name="height_text_lbl9"> - åŒ—æ± + å—æ± </text> <spinner label="低" name="height_start_spin_0"/> <spinner label="低" name="height_start_spin_1"/> @@ -45,13 +45,14 @@ <spinner label="高" name="height_range_spin_2"/> <spinner label="高" name="height_range_spin_3"/> <text name="height_text_lbl10"> - 数値ã¯ä¸Šã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ã®ãƒ–レンド範囲を示ã—ã¾ã™ã€‚ + 数値ã¯ä¸Šã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ãŒèª¿å’Œã™ã‚‹ç¯„囲を示ã—ã¾ã™ã€‚ </text> <text name="height_text_lbl11"> - 計測å˜ä½ã¯ãƒ¡ãƒ¼ãƒˆãƒ«ã§ã€ã€Œä½Žã€ã®å€¤ã¯ã€1番ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ã®é«˜ã•ã®ã€Œæœ€å¤§å€¤ã€ã§ã™ã€‚「高ã€ã®å€¤ã¯ã€4番ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ã®é«˜ã•ã®ã€Œæœ€ä½Žå€¤ã€ã§ã™ã€‚ + 計測å˜ä½ã¯ãƒ¡ãƒ¼ãƒˆãƒ«ã§ã€ã€Œä½Žã€ã®å€¤ã¯ã€1番ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ã®é«˜ã•ã® +「最大値ã€ã§ã™ã€‚「高ã€ã®å€¤ã¯ã€4番ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ã®é«˜ã•ã®ã€Œæœ€ä½Žå€¤ã€ã§ã™ã€‚ </text> <text name="height_text_lbl12"> - ãã—ã¦ã€Œé«˜ã€ã®å€¤ã¯ãƒ†ã‚¯ã‚¹ãƒãƒ£ãƒ¼#4ã®é«˜ã•ã®ä¸‹é™ã¨ãªã‚Šã¾ã™ã€‚ + ãã—ã¦ã€Œé«˜ã€ã®å€¤ã¯ãƒ†ã‚¯ã‚¹ãƒãƒ£#4ã®é«˜ã•ã®ä¸‹é™ã¨ãªã‚Šã¾ã™ã€‚ </text> <button label="é©ç”¨" name="apply_btn"/> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_script_limits_my_avatar.xml b/indra/newview/skins/default/xui/ja/panel_script_limits_my_avatar.xml index e8b5be63ae..494884c187 100644 --- a/indra/newview/skins/default/xui/ja/panel_script_limits_my_avatar.xml +++ b/indra/newview/skins/default/xui/ja/panel_script_limits_my_avatar.xml @@ -1,10 +1,13 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="マイ ã‚¢ãƒã‚¿ãƒ¼" name="script_limits_my_avatar_panel"> + <text name="script_memory"> + ã‚¢ãƒã‚¿ãƒ¼ã®ã‚¹ã‚¯ãƒªãƒ—ト使用 + </text> <text name="loading_text"> ãƒãƒ¼ãƒ‡ã‚£ãƒ³ã‚°... </text> <scroll_list name="scripts_list"> - <scroll_list.columns label="サイズ (kb)" name="size"/> + <scroll_list.columns label="サイズ (kb)" name="size" width="90"/> <scroll_list.columns label="URL" name="urls"/> <scroll_list.columns label="オブジェクトå" name="name"/> <scroll_list.columns label="å ´æ‰€" name="location"/> diff --git a/indra/newview/skins/default/xui/ja/panel_script_limits_region_memory.xml b/indra/newview/skins/default/xui/ja/panel_script_limits_region_memory.xml index fe0b44d8f4..d91eba9699 100644 --- a/indra/newview/skins/default/xui/ja/panel_script_limits_region_memory.xml +++ b/indra/newview/skins/default/xui/ja/panel_script_limits_region_memory.xml @@ -3,20 +3,18 @@ <text name="script_memory"> 区画スクリプトメモリ </text> - <text name="parcels_listed"> - 区画所有者: - </text> - <text name="memory_used"> - 使用ã•れãŸãƒ¡ãƒ¢ãƒªï¼š - </text> + <text name="parcels_listed"/> + <text name="memory_used"/> <text name="loading_text"> ãƒãƒ¼ãƒ‡ã‚£ãƒ³ã‚°... </text> <scroll_list name="scripts_list"> - <scroll_list.columns label="サイズ (kb)" name="size"/> + <scroll_list.columns label="サイズ (kb)" name="size" width="90"/> + <scroll_list.columns label="URL" name="urls"/> <scroll_list.columns label="オブジェクトå" name="name"/> - <scroll_list.columns label="ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æ‰€æœ‰è€…" name="owner"/> - <scroll_list.columns label="区画・ä½ç½®" name="location"/> + <scroll_list.columns label="ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æ‰€æœ‰è€…" name="owner" width="120"/> + <scroll_list.columns label="区画" name="parcel"/> + <scroll_list.columns label="å ´æ‰€" name="location"/> </scroll_list> <button label="リスト更新" name="refresh_list_btn"/> <button label="ãƒã‚¤ãƒ©ã‚¤ãƒˆ" name="highlight_btn"/> diff --git a/indra/newview/skins/default/xui/ja/panel_side_tray.xml b/indra/newview/skins/default/xui/ja/panel_side_tray.xml index ce5f0b940c..3fd14ece06 100644 --- a/indra/newview/skins/default/xui/ja/panel_side_tray.xml +++ b/indra/newview/skins/default/xui/ja/panel_side_tray.xml @@ -2,26 +2,28 @@ <!-- Side tray cannot show background because it is always partially on screen to hold tab buttons. --> <side_tray name="sidebar"> - <sidetray_tab description="サイドãƒãƒ¼ã‚’表示・éžè¡¨ç¤º" name="sidebar_openclose"/> - <sidetray_tab description="ホーム。" name="sidebar_home"> + <sidetray_tab description="サイドãƒãƒ¼ã‚’表示・éžè¡¨ç¤º" name="sidebar_openclose" tab_title="サイドãƒãƒ¼ã‚’é–‹ã・閉ã˜ã‚‹"/> + <sidetray_tab description="ホーム。" name="sidebar_home" tab_title="ホーム"> <panel label="ホーム" name="panel_home"/> </sidetray_tab> - <sidetray_tab description="ã‚ãªãŸã®å…¬é–‹ãƒ—ãƒãƒ•ィールã¨ãƒ”ックを編集ã—ã¦ãã ã•ã„。" name="sidebar_me"> - <panel label="ミー" name="panel_me"/> + <sidetray_tab description="ã‚ãªãŸã®å…¬é–‹ãƒ—ãƒãƒ•ィールã¨ãƒ”ックを編集ã—ã¦ãã ã•ã„。" name="sidebar_me" tab_title="マイ プãƒãƒ•ィール"> + <panel_container name="panel_container"> + <panel label="ミー" name="panel_me"/> + </panel_container> </sidetray_tab> - <sidetray_tab description="フレンドã€é€£çµ¡å…ˆã€è¿‘ãã®äººã‚’探ã—ã¦ãã ã•ã„。" name="sidebar_people"> + <sidetray_tab description="フレンドã€é€£çµ¡å…ˆã€è¿‘ãã®äººã‚’探ã—ã¦ãã ã•ã„。" name="sidebar_people" tab_title="人"> <panel_container name="panel_container"> <panel label="ã‚°ãƒ«ãƒ¼ãƒ—æƒ…å ±" name="panel_group_info_sidetray"/> <panel label="ブãƒãƒƒã‚¯ã•れãŸä½äººã¨ã‚ªãƒ–ジェクト" name="panel_block_list_sidetray"/> </panel_container> </sidetray_tab> - <sidetray_tab description="行ããŸã„å ´æ‰€ã€è¡Œã£ãŸã“ã¨ã®ã‚ã‚‹å ´æ‰€ã‚’æŽ¢ã—ã¦ãã ã•ã„。" label="å ´æ‰€" name="sidebar_places"> + <sidetray_tab description="行ããŸã„å ´æ‰€ã€è¡Œã£ãŸã“ã¨ã®ã‚ã‚‹å ´æ‰€ã‚’æŽ¢ã—ã¦ãã ã•ã„。" label="å ´æ‰€" name="sidebar_places" tab_title="å ´æ‰€"> <panel label="å ´æ‰€" name="panel_places"/> </sidetray_tab> - <sidetray_tab description="ã‚ãªãŸã®æŒã¡ç‰©ã‚’眺ã‚ã¦ãã ã•ã„。" name="sidebar_inventory"> + <sidetray_tab description="ã‚ãªãŸã®æŒã¡ç‰©ã‚’眺ã‚ã¦ãã ã•ã„。" name="sidebar_inventory" tab_title="æŒã¡ç‰©"> <panel label="æŒã¡ç‰©ã‚’編集" name="sidepanel_inventory"/> </sidetray_tab> - <sidetray_tab description="ã‚ãªãŸã®å®¹å§¿ã‚„ç¾åœ¨ã®è¦‹ãŸç›®ã‚’変更ã—ã¦ãã ã•ã„。" name="sidebar_appearance"> + <sidetray_tab description="ã‚ãªãŸã®å®¹å§¿ã‚„ç¾åœ¨ã®è¦‹ãŸç›®ã‚’変更ã—ã¦ãã ã•ã„。" name="sidebar_appearance" tab_title="容姿"> <panel label="容姿ã®ç·¨é›†" name="sidepanel_appearance"/> </sidetray_tab> </side_tray> diff --git a/indra/newview/skins/default/xui/ja/panel_sidetray_home_tab.xml b/indra/newview/skins/default/xui/ja/panel_sidetray_home_tab.xml index aef1f90298..ea17cd6526 100644 --- a/indra/newview/skins/default/xui/ja/panel_sidetray_home_tab.xml +++ b/indra/newview/skins/default/xui/ja/panel_sidetray_home_tab.xml @@ -22,13 +22,13 @@ </text> </panel> <panel name="sidebar_appearance"> - <text name="tab_name" value="マイ 容姿"/> + <text name="tab_name" value="容姿"/> <text name="tab_description"> ã‚ãªãŸã®å®¹å§¿ã‚„ç¾åœ¨ã®è¦‹ãŸç›®ã‚’変更ã—ã¾ã™ã€‚ </text> </panel> <panel name="sidebar_inventory"> - <text name="tab_name" value="マイ æŒã¡ç‰©"/> + <text name="tab_name" value="æŒã¡ç‰©"/> <text name="tab_description"> ã‚ãªãŸã®æŒã¡ç‰©ã‚’眺ã‚ã¾ã™ã€‚ </text> diff --git a/indra/newview/skins/default/xui/ja/panel_status_bar.xml b/indra/newview/skins/default/xui/ja/panel_status_bar.xml index 063e584762..c3a5127981 100644 --- a/indra/newview/skins/default/xui/ja/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/ja/panel_status_bar.xml @@ -21,10 +21,13 @@ <panel.string name="buycurrencylabel"> L$ [AMT] </panel.string> - <button label="" label_selected="" name="buycurrency" tool_tip="ç§ã®æ®‹é«˜"/> - <button label="L$ ã®è³¼å…¥" name="buyL" tool_tip="クリックã—㦠L$ を購入ã—ã¾ã™"/> + <panel name="balance_bg"> + <text name="balance" tool_tip="残高" value="L$20"/> + <button label="L$ ã®è³¼å…¥" name="buyL" tool_tip="クリックã—㦠L$ を購入ã—ã¾ã™"/> + </panel> <text name="TimeText" tool_tip="ç¾åœ¨æ™‚刻(太平洋)"> - 12:00 AM + 24:00 AM PST </text> + <button name="media_toggle_btn" tool_tip="ã™ã¹ã¦ã®ãƒ¡ãƒ‡ã‚£ã‚¢ã‚’é–‹å§‹ãƒ»åœæ¢ï¼ˆéŸ³æ¥½ã€ãƒ“デオã€Web ページ)"/> <button name="volume_btn" tool_tip="ã‚°ãƒãƒ¼ãƒãƒ«éŸ³é‡è¨å®š"/> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_teleport_history.xml b/indra/newview/skins/default/xui/ja/panel_teleport_history.xml index 2264ae965b..c1bf81f7e7 100644 --- a/indra/newview/skins/default/xui/ja/panel_teleport_history.xml +++ b/indra/newview/skins/default/xui/ja/panel_teleport_history.xml @@ -12,6 +12,6 @@ <accordion_tab name="6_months_and_older" title="åŠå¹´ä»¥ä¸Šå‰"/> </accordion> <panel label="bottom_panel" name="bottom_panel"> - <button name="gear_btn" tool_tip="ãã®ä»–ã®ã‚ªãƒ—ションを表示"/> + <button name="gear_btn" tool_tip="オプションを表示ã—ã¾ã™"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_voice_effect.xml b/indra/newview/skins/default/xui/ja/panel_voice_effect.xml new file mode 100644 index 0000000000..d787d6ff23 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/panel_voice_effect.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_voice_effect"> + <string name="no_voice_effect"> + ボイスモーフィングãªã— + </string> + <string name="preview_voice_effects"> + ボイスモーフィングをプレビュー â–¶ + </string> + <string name="get_voice_effects"> + ボイスモーフィングをå–å¾— â–¶ + </string> + <combo_box name="voice_effect" tool_tip="ãƒœã‚¤ã‚¹ãƒ¢ãƒ¼ãƒ•ã‚£ãƒ³ã‚°åŠ¹æžœã‚’é¸æŠžã—ã¦ã€éŸ³å£°ã‚’変更ã—ã¾ã™ã€‚"> + <combo_box.item label="ボイスモーフィングãªã—" name="no_voice_effect"/> + </combo_box> +</panel> diff --git a/indra/newview/skins/default/xui/ja/panel_world_map.xml b/indra/newview/skins/default/xui/ja/panel_world_map.xml index 2f5c2bf6a1..8ff853193a 100644 --- a/indra/newview/skins/default/xui/ja/panel_world_map.xml +++ b/indra/newview/skins/default/xui/ja/panel_world_map.xml @@ -30,6 +30,12 @@ <panel.string name="world_map_northwest"> 北西 </panel.string> + <panel.string name="world_map_person"> + 1 人 + </panel.string> + <panel.string name="world_map_people"> + [NUMBER] 人 + </panel.string> <text label="北" name="floater_map_north" text="北"> 北 </text> diff --git a/indra/newview/skins/default/xui/ja/role_actions.xml b/indra/newview/skins/default/xui/ja/role_actions.xml index 59fceca2db..0a63cedf10 100644 --- a/indra/newview/skins/default/xui/ja/role_actions.xml +++ b/indra/newview/skins/default/xui/ja/role_actions.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <role_actions> - <action_set description="ã“れらã®èƒ½åŠ›ã«ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—・メンãƒãƒ¼ã‚’è¿½åŠ ã€æŽ’é™¤ã—ã€æ‹›å¾…状ãªã—ã«æ–°ãƒ¡ãƒ³ãƒãƒ¼ã®å‚åŠ ã‚’èªã‚る権é™ãŒå«ã¾ã‚Œã¾ã™ã€‚" name="Membership"> + <action_set description="ã“れらã®èƒ½åŠ›ã«ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—メンãƒãƒ¼ã‚’è¿½åŠ ã€æŽ’é™¤ã—ã€æ‹›å¾…状ãªã—ã«æ–°ãƒ¡ãƒ³ãƒãƒ¼ã®å‚åŠ ã‚’èªã‚る権é™ãŒå«ã¾ã‚Œã¾ã™ã€‚" name="Membership"> <action description="ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«äººã‚’招待" longdescription="「役割ã€ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã®ã€Œãƒ¡ãƒ³ãƒãƒ¼ã€ã‚¿ãƒ–内ã«ã‚る「招待ã€ãƒœã‚¿ãƒ³ã‚’押ã—ã¦ã€ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«ãƒ¡ãƒ³ãƒãƒ¼ã‚’招待ã—ã¾ã™ã€‚" name="member invite" value="1"/> <action description="メンãƒãƒ¼ã‚’ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã‹ã‚‰è¿½æ”¾" longdescription="「役割ã€ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã®ã€Œãƒ¡ãƒ³ãƒãƒ¼ã€ã‚¿ãƒ–内ã«ã‚る「追放ã€ãƒœã‚¿ãƒ³ã‚’押ã—ã¦ã€ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã‹ã‚‰ãƒ¡ãƒ³ãƒãƒ¼ã‚’追放ã—ã¾ã™ã€‚ 「オーナーã€ã¯ã€ä»–ã®ã€Œã‚ªãƒ¼ãƒŠãƒ¼ã€ä»¥å¤–ã¯èª°ã§ã‚‚追放ã§ãã¾ã™ã€‚ 「オーナーã€ã§ã¯ãªã„人ãŒã€Œå…¨å“¡ï¼ˆEveryone)ã€ã«ã—ã‹å½¹å‰²ãŒãªã„å ´åˆã€ãƒ¡ãƒ³ãƒãƒ¼ã¯ã‚°ãƒ«ãƒ¼ãƒ—ã‹ã‚‰è¿½æ”¾ã•れるã“ã¨ãŒã‚りã¾ã™ã€‚ 「役割ã€ã‹ã‚‰ãƒ¡ãƒ³ãƒãƒ¼ã‚’削除ã™ã‚‹ã«ã¯ã€ã€Œå½¹å‰²ã‹ã‚‰ãƒ¡ãƒ³ãƒãƒ¼ã‚’削除ã€ã®èƒ½åŠ›ãŒä¸Žãˆã‚‰ã‚Œã¦ã„ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" name="member eject" value="2"/> <action description="「自由å‚åŠ ã€ã¨ã€Œå…¥ä¼šè²»ã€ã®åˆ‡ã‚Šæ›¿ãˆ" longdescription="「自由å‚åŠ ã€ã«åˆ‡ã‚Šæ›¿ãˆã‚‹ã¨ã€æ‹›å¾…ã•れãªãã¦ã‚‚æ–°ã—ã„メンãƒãƒ¼ãŒå…¥ä¼šã§ãã¾ã™ã€‚「入会費ã€ã¯ã€Œä¸€èˆ¬ã€ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã§å¤‰æ›´ã—ã¾ã™ã€‚" name="member options" value="3"/> @@ -8,29 +8,29 @@ <action_set description="ã“れらã®èƒ½åŠ›ã«ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—内ã®å½¹å‰²ã‚’è¿½åŠ ã€å‰Šé™¤ã€å¤‰æ›´ã—ã€å½¹å‰²ã«ãƒ¡ãƒ³ãƒãƒ¼ã‚’è¿½åŠ ã€å‰Šé™¤ã—ã€ã•らã«å½¹å‰²ã¸èƒ½åŠ›ã‚’å‰²ã‚Šå½“ã¦ã‚‹æ¨©é™ãŒå«ã¾ã‚Œã¾ã™ã€‚" name="Roles"> <action description="æ–°ã—ã„役割を作æˆ" longdescription="æ–°ã—ã„「役割ã€ã¯ã€ã€Œå½¹å‰²ã€ã‚»ã‚¯ã‚·ãƒ§ãƒ³ > 「役割ã€ã‚¿ãƒ–ã§ä½œæˆã—ã¾ã™ã€‚" name="role create" value="4"/> <action description="役割を削除" longdescription="「役割ã€ã¯ã€ã€Œå½¹å‰²ã€ã‚»ã‚¯ã‚·ãƒ§ãƒ³ > 「役割ã€ã‚¿ãƒ–ã§å‰Šé™¤ã§ãã¾ã™ã€‚" name="role delete" value="5"/> - <action description="「役割ã€ã®åå‰ã€è‚©æ›¸ãã€èª¬æ˜Žã€ãƒ¡ãƒ³ãƒãƒ¼å…¬é–‹ã®æœ‰ç„¡ã‚’変更" longdescription="「役割ã€ã®åå‰ã€è‚©æ›¸ãã€èª¬æ˜Žã€ãƒ¡ãƒ³ãƒãƒ¼å…¬é–‹ã®æœ‰ç„¡ã‚’変更ã—ã¾ã™ã€‚ 「役割ã€ã‚’é¸æŠžå¾Œã«ã€ã€Œå½¹å‰²ã€ã‚»ã‚¯ã‚·ãƒ§ãƒ³ > 「役割ã€ã‚¿ãƒ– ã®ä¸‹ã§è¨å®šã§ãã¾ã™ã€‚" name="role properties" value="6"/> + <action description="「役割ã€ã®åå‰ã€ã‚¿ã‚¤ãƒˆãƒ«ã€èª¬æ˜Žã€ãƒ¡ãƒ³ãƒãƒ¼å…¬é–‹ã®æœ‰ç„¡ã‚’変更" longdescription="「役割ã€ã®åå‰ã€ã‚¿ã‚¤ãƒˆãƒ«ã€èª¬æ˜Žã€ãƒ¡ãƒ³ãƒãƒ¼å…¬é–‹ã®æœ‰ç„¡ã‚’変更ã—ã¾ã™ã€‚ 「役割ã€ã‚’é¸æŠžå¾Œã«ã€ã€Œå½¹å‰²ã€ã‚»ã‚¯ã‚·ãƒ§ãƒ³ > 「役割ã€ã‚¿ãƒ– ã®ä¸‹ã§è¨å®šã§ãã¾ã™ã€‚" name="role properties" value="6"/> <action description="メンãƒãƒ¼ã‚’割り当ã¦äººã®å½¹å‰²ã«å‰²ã‚Šå½“ã¦ã‚‹" longdescription="「割り当ã¦ã‚‰ã‚ŒãŸå½¹å‰²ã€ï¼ˆã€Œå½¹å‰²ã€ã‚»ã‚¯ã‚·ãƒ§ãƒ³ > 「メンãƒãƒ¼ã€ã‚¿ãƒ–)ã®ãƒªã‚¹ãƒˆã§ã€ãƒ¡ãƒ³ãƒãƒ¼ã‚’「役割ã€ã«å‰²ã‚Šå½“ã¦ã¾ã™ã€‚ ã“ã®èƒ½åŠ›ãŒã‚るメンãƒãƒ¼ã¯ã€å‰²ã‚Šå½“ã¦ã‚‹äººãŒæ—¢ã«æ‰€å±žã™ã‚‹ã€Œå½¹å‰²ã€ã«ã®ã¿ãƒ¡ãƒ³ãƒãƒ¼ã‚’è¿½åŠ ã§ãã¾ã™ã€‚" name="role assign member limited" value="7"/> <action description="メンãƒãƒ¼ã‚’ä»»æ„ã®å½¹å‰²ã«å‰²ã‚Šå½“ã¦ã‚‹" longdescription="「割り当ã¦ã‚‰ã‚ŒãŸå½¹å‰²ã€ï¼ˆã€Œå½¹å‰²ã€ã‚»ã‚¯ã‚·ãƒ§ãƒ³ > 「メンãƒãƒ¼ã€ã‚¿ãƒ–)ã®ãƒªã‚¹ãƒˆã§ã€ãƒ¡ãƒ³ãƒãƒ¼ã‚’ã©ã®ã€Œå½¹å‰²ã€ã«ã‚‚割り当ã¦ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ *è¦å‘Š* ã“ã®ã€Œèƒ½åŠ›ã€ãŒã‚る「役割ã€ã‚’æŒã¤ãƒ¡ãƒ³ãƒãƒ¼ãªã‚‰èª°ã§ã‚‚自分自身ã¨ã€ä»–ã®ã€Œã‚ªãƒ¼ãƒŠãƒ¼ã€ä»¥å¤–ã®ãƒ¡ãƒ³ãƒãƒ¼ã‚’ç¾åœ¨ä»¥ä¸Šã®æ¨©é™ã®ã‚る「役割ã€ã«å‰²ã‚Šå½“ã¦ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ã¤ã¾ã‚Šã€ã€Œã‚ªãƒ¼ãƒŠãƒ¼ã€ä»¥å¤–ã®äººãŒã€Œã‚ªãƒ¼ãƒŠãƒ¼ã€ã«è¿‘ã„力をæŒã¤ã‚ˆã†è¨å®šã§ãã‚‹ã“ã¨ã«ãªã‚Šã¾ã™ã€‚ ã“ã®ã€Œèƒ½åŠ›ã€ã‚’割り当ã¦ã‚‹å‰ã«ã€è‡ªåˆ†ãŒã—よã†ã¨ã—ã¦ã„ã‚‹ã“ã¨ã‚’ã‚ˆãæŠŠæ¡ã—ã¦ãã ã•ã„。" name="role assign member" value="8"/> <action description="役割ã‹ã‚‰ãƒ¡ãƒ³ãƒãƒ¼ã‚’解除" longdescription="「割り当ã¦ã‚‰ã‚ŒãŸå½¹å‰²ã€ï¼ˆã€Œå½¹å‰²ã€ã‚»ã‚¯ã‚·ãƒ§ãƒ³ > 「メンãƒãƒ¼ã€ã‚¿ãƒ–)ã®ãƒªã‚¹ãƒˆã§ã€ãƒ¡ãƒ³ãƒãƒ¼ã‚’「役割ã€ã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã€‚ 「オーナーã€ã¯å‰Šé™¤ã§ãã¾ã›ã‚“。" name="role remove member" value="9"/> <action description="役割ã®èƒ½åŠ›ã®å‰²ã‚Šå½“ã¦ã¨è§£é™¤" longdescription="「許å¯ã•れãŸèƒ½åŠ›ã€ï¼ˆã€Œå½¹å‰²ã€ã‚»ã‚¯ã‚·ãƒ§ãƒ³ > 「役割ã€ã‚¿ãƒ–)ã®ãƒªã‚¹ãƒˆã«ã‚ã‚‹ã€å„「役割ã€ã®ã€Œèƒ½åŠ›ã€ã‚’割り当ã¦ãŸã‚Šã€å‰Šé™¤ã—ã¾ã™ã€‚ *è¦å‘Š* ã“ã®ã€Œèƒ½åŠ›ã€ãŒã‚る「役割ã€ã‚’æŒã¤ãƒ¡ãƒ³ãƒãƒ¼ãªã‚‰èª°ã§ã‚‚自分自身ã¨ã€ä»–ã®ã€Œã‚ªãƒ¼ãƒŠãƒ¼ã€ä»¥å¤–ã®ãƒ¡ãƒ³ãƒãƒ¼ã‚’ã™ã¹ã¦ã®ã€Œèƒ½åŠ›ã€ã€ã«å‰²ã‚Šå½“ã¦ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ã¤ã¾ã‚Šã€ã€Œã‚ªãƒ¼ãƒŠãƒ¼ã€ä»¥å¤–ã®äººãŒã€Œã‚ªãƒ¼ãƒŠãƒ¼ã€ã«è¿‘ã„æ¨©é™ã‚’æŒã¤ã‚ˆã†è¨å®šã§ãã‚‹ã“ã¨ã«ãªã‚Šã¾ã™ã€‚ ã“ã®ã€Œèƒ½åŠ›ã€ã‚’割り当ã¦ã‚‹å‰ã«ã€è‡ªåˆ†ãŒã—よã†ã¨ã—ã¦ã„ã‚‹ã“ã¨ã‚’ã‚ˆãæŠŠæ¡ã—ã¦ãã ã•ã„。" name="role change actions" value="10"/> </action_set> <action_set description="ã“れらã®èƒ½åŠ›ã«ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—ã®å…¬é–‹æ€§ã‚„ç†å¿µã€è¨˜ç« ã®å¤‰æ›´ã¨ã„ã£ãŸã€ã‚°ãƒ«ãƒ¼ãƒ—ã®ã‚¢ã‚¤ãƒ‡ãƒ³ãƒ†ã‚£ãƒ†ã‚£ã‚’ä¿®æ£ã™ã‚‹æ¨©é™ãŒå«ã¾ã‚Œã¾ã™ã€‚" name="Group Identity"> - <action description="ç†å¿µã€è¨˜ç« ã€ã€ŒWeb上ã§å…¬é–‹ã€ã€ãŠã‚ˆã³ã‚°ãƒ«ãƒ¼ãƒ—æƒ…å ±å†…ã§å…¬é–‹ã®ãƒ¡ãƒ³ãƒãƒ¼ã‚’変更。" longdescription="ç†å¿µã€è¨˜ç« ã€ã€Œæ¤œç´¢ã«è¡¨ç¤ºã€ã®å¤‰æ›´ã‚’ã—ã¾ã™ã€‚ 「一般ã€ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã§è¡Œãˆã¾ã™ã€‚" name="group change identity" value="11"/> + <action description="ç†å¿µã€è¨˜ç« ã€ã€ŒWeb 上ã§å…¬é–‹ã€ã€ãŠã‚ˆã³ã‚°ãƒ«ãƒ¼ãƒ—æƒ…å ±å†…ã§å…¬é–‹ã®ãƒ¡ãƒ³ãƒãƒ¼ã‚’変更。" longdescription="ç†å¿µã€è¨˜ç« ã€ã€Œæ¤œç´¢ã«è¡¨ç¤ºã€ã®å¤‰æ›´ã‚’ã—ã¾ã™ã€‚ 「一般ã€ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã§è¡Œãˆã¾ã™ã€‚" name="group change identity" value="11"/> </action_set> <action_set description="ã“れらã®ã€Œèƒ½åŠ›ã€ã«ã¯ã€ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã®æ‰€æœ‰åœ°ã®è²æ¸¡ã€ä¿®æ£ã€è²©å£²ã‚’ã™ã‚‹æ¨©é™ãŒã‚りã¾ã™ã€‚ ã€ŒåœŸåœ°æƒ…å ±ã€ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’見るã«ã¯ã€åœ°é¢ã‚’å³ã‚¯ãƒªãƒƒã‚¯ã—ã¦ã€ŒåœŸåœ°æƒ…å ±ã€ã‚’é¸ã¶ã‹ã€ãƒŠãƒ“ゲーションãƒãƒ¼ã®ã€Œiã€ã‚¢ã‚¤ã‚³ãƒ³ã‚’クリックã—ã¾ã™ã€‚" name="Parcel Management"> <action description="グループ用ã®åœŸåœ°ã®è²æ¸¡ã¨è³¼å…¥" longdescription="グループ用ã®åœŸåœ°ã®è²æ¸¡ã¨è³¼å…¥ã‚’行ã„ã¾ã™ã€‚ ã“ã®æ“作ã«ã¯ã€åœŸåœ°æƒ…å ±ç”»é¢ ï¼ž 一般タブを使ã„ã¾ã™ã€‚" name="land deed" value="12"/> - <action description="Lindenç·ç£ã«åœŸåœ°ã‚’æ˜Žã‘æ¸¡ã™" longdescription="Lindenç·ç£ã«åœŸåœ°ã‚’æ˜Žã‘æ¸¡ã—ã¾ã™ã€‚ *è¦å‘Š* ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã€ŒåœŸåœ°æƒ…å ±ã€ï¼žã€Œä¸€èˆ¬ã€ã§ã‚°ãƒ«ãƒ¼ãƒ—所有ã®åœŸåœ°ã‚’放棄ã—ã¦ã€å£²ã‚Šä¸Šã’ãªã—ã§Lindenç·ç£ã«æ˜Žã‘渡ã™ã“ã¨ãŒã§ãã¾ã™ã€‚ ã“ã®èƒ½åŠ›ã®å‰²ã‚Šå½“ã¦ã¯ã€ãã®ã“ã¨ã‚’ç†è§£ã—ãŸä¸Šã§è¡Œã£ã¦ãã ã•ã„。" name="land release" value="13"/> + <action description="リンデンç·ç£ã«åœŸåœ°ã‚’æ˜Žã‘æ¸¡ã™" longdescription="リンデンç·ç£ã«åœŸåœ°ã‚’æ˜Žã‘æ¸¡ã—ã¾ã™ã€‚ *è¦å‘Š* ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã€ŒåœŸåœ°æƒ…å ±ã€ï¼žã€Œä¸€èˆ¬ã€ã§ã‚°ãƒ«ãƒ¼ãƒ—所有ã®åœŸåœ°ã‚’放棄ã—ã¦ã€å£²ã‚Šä¸Šã’ãªã—ã§ãƒªãƒ³ãƒ‡ãƒ³ç·ç£ã«æ˜Žã‘渡ã™ã“ã¨ãŒã§ãã¾ã™ã€‚ ã“ã®èƒ½åŠ›ã®å‰²ã‚Šå½“ã¦ã¯ã€ãã®ã“ã¨ã‚’ç†è§£ã—ãŸä¸Šã§è¡Œã£ã¦ãã ã•ã„。" name="land release" value="13"/> <action description="å£²ã‚Šåœ°æƒ…å ±ã®è¨å®š" longdescription="å£²ã‚Šåœ°æƒ…å ±ã‚’è¨å®šã—ã¾ã™ã€‚ *è¦å‘Š* ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã€ŒåœŸåœ°æƒ…å ±ã€ï¼žã€Œä¸€èˆ¬ã€ã‚¿ãƒ–ã§ã‚°ãƒ«ãƒ¼ãƒ—所有ã®åœŸåœ°ã‚’è‡ªåˆ†ã®æ€ã„ã©ãŠã‚Šã«è²©å£²ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ ã“ã®èƒ½åŠ›ã®å‰²ã‚Šå½“ã¦ã¯ã€ãã®ã“ã¨ã‚’ç†è§£ã—ãŸä¸Šã§è¡Œã£ã¦ãã ã•ã„。" name="land set sale info" value="14"/> <action description="区画ã®å†åˆ†å‰²ã¨çµ±åˆ" longdescription="区画をå†åˆ†å‰²ã€çµ±åˆã—ã¾ã™ã€‚ 地é¢ã‚’å³ã‚¯ãƒªãƒƒã‚¯ã—ã¦ã€Œåœ°å½¢ã‚’編集ã€ã‚’é¸ã³ã€ãƒžã‚¦ã‚¹ã‚’土地ã®ä¸Šã§ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ç¯„å›²ã‚’é¸æŠžã—ã¾ã™ã€‚ å†åˆ†å‰²ã™ã‚‹ã«ã¯ã€åˆ†å‰²å¯¾è±¡ã‚’é¸ã‚“ã§ã€Œå†åˆ†å‰²ã€ã‚’クリックã—ã¾ã™ã€‚ çµ±åˆã™ã‚‹ã«ã¯ã€2ã¤ä»¥ä¸Šã®éš£æŽ¥ã™ã‚‹åŒºç”»ã‚’é¸ã‚“ã§ã€Œçµ±åˆã€ã‚’クリックã—ã¾ã™ã€‚" name="land divide join" value="15"/> </action_set> - <action_set description="ã“れらã®èƒ½åŠ›ã«ã¯ã€åŒºç”»åã€å…¬é–‹è¨å®šã€æ¤œç´¢ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã¸ã®ç™»éŒ²ã€ç€åœ°ç‚¹ãªã‚‰ã³ã«TPルートã®ã‚ªãƒ—ションを変更ã™ã‚‹æ¨©é™ãŒå«ã¾ã‚Œã¾ã™ã€‚" name="Parcel Identity"> + <action_set description="ã“れらã®èƒ½åŠ›ã«ã¯ã€åŒºç”»åã€å…¬é–‹è¨å®šã€æ¤œç´¢ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã¸ã®ç™»éŒ²ã€ç€åœ°ç‚¹ãªã‚‰ã³ã« TP ルートã®ã‚ªãƒ—ションを変更ã™ã‚‹æ¨©é™ãŒå«ã¾ã‚Œã¾ã™ã€‚" name="Parcel Identity"> <action description="ã€Œå ´æ‰€æ¤œç´¢ã«è¡¨ç¤ºã€ã‚’切り替ãˆã‚«ãƒ†ã‚´ãƒªã‚’è¨å®š" longdescription="ã€Œå ´æ‰€æ¤œç´¢ã«è¡¨ç¤ºã€ã«åˆ‡ã‚Šæ›¿ãˆã€ã€ŒåœŸåœ°æƒ…å ±ã€ > 「オプションã€ã‚¿ãƒ–ã§åŒºç”»ã®ã‚«ãƒ†ã‚´ãƒªã‚’è¨å®šã—ã¾ã™ã€‚" name="land find places" value="17"/> <action description="区画åã€èª¬æ˜Žã€ã€Œå ´æ‰€æ¤œç´¢ã«è¡¨ç¤ºã€ã®è¨å®šã‚’変更" longdescription="区画åã€èª¬æ˜Žã€ã€Œå ´æ‰€æ¤œç´¢ã«è¡¨ç¤ºã€ã®è¨å®šã‚’変更ã—ã¾ã™ã€‚ ã€ŒåœŸåœ°æƒ…å ±ã€ > 「オプションã€ã‚¿ãƒ–ã§è¡Œã„ã¾ã™ã€‚" name="land change identity" value="18"/> - <action description="ç€åœ°ç‚¹ãŠã‚ˆã³ãƒ†ãƒ¬ãƒãƒ¼ãƒˆãƒ»ãƒ«ãƒ¼ãƒˆã‚’è¨å®š" longdescription="ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—所有ã®åŒºç”»ä¸Šã§ç€åœ°ç‚¹ã‚’è¨å®šã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šå¤–部ã‹ã‚‰ã®ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã®åˆ°ç€ä½ç½®ã‚’指定ã§ãã‚‹ã¨å…±ã«ã€ãƒ†ãƒ¬ãƒãƒ¼ãƒˆãƒ»ãƒ«ãƒ¼ãƒˆã‚’è¨å®šã—ã¦ç´°ã‹ã制御ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ ã“ã®æ“作ã¯ã€ã€ŒåœŸåœ°æƒ…å ±ã€ï¼žã€Œã‚ªãƒ—ションã€ã‚¿ãƒ–ã§è¡Œã„ã¾ã™ã€‚" name="land set landing point" value="19"/> + <action description="ç€åœ°ç‚¹ãŠã‚ˆã³ãƒ†ãƒ¬ãƒãƒ¼ãƒˆãƒ«ãƒ¼ãƒˆã‚’è¨å®š" longdescription="ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—所有ã®åŒºç”»ä¸Šã§ç€åœ°ç‚¹ã‚’è¨å®šã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šå¤–部ã‹ã‚‰ã®ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã®åˆ°ç€ä½ç½®ã‚’指定ã§ãã‚‹ã¨å…±ã«ã€ãƒ†ãƒ¬ãƒãƒ¼ãƒˆãƒ«ãƒ¼ãƒˆã‚’è¨å®šã—ã¦ç´°ã‹ã制御ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ ã“ã®æ“作ã¯ã€ã€ŒåœŸåœ°æƒ…å ±ã€ï¼žã€Œã‚ªãƒ—ションã€ã‚¿ãƒ–ã§è¡Œã„ã¾ã™ã€‚" name="land set landing point" value="19"/> </action_set> <action_set description="ã“れらã®èƒ½åŠ›ã«ã¯ã€ã€Œã‚ªãƒ–ジェクトを作æˆã€ã€ã€Œåœ°å½¢ã‚’編集ã€ã€éŸ³æ¥½ã¨ãƒ¡ãƒ‡ã‚£ã‚¢ã®è¨å®šãªã©ã€åŒºç”»ã®ã‚ªãƒ—ションã«é–¢é€£ã™ã‚‹æ¨©é™ãŒå«ã¾ã‚Œã¾ã™ã€‚" name="Parcel Settings"> - <action description="音楽ã¨ãƒ¡ãƒ‡ã‚£ã‚¢ã®è¨å®šã‚’変更" longdescription="ストリーミング・ミュージックã¨å‹•ç”»ã®è¨å®šã‚’変更ã™ã‚‹ã«ã¯ã€ã€ŒåœŸåœ°æƒ…å ±ã€ ï¼ž 「メディアã€ã‚¿ãƒ–を使ã„ã¾ã™ã€‚" name="land change media" value="20"/> - <action description="「地形を編集ã€ã«åˆ‡ã‚Šæ›¿ãˆ" longdescription="「地形を編集ã€ã«åˆ‡ã‚Šæ›¿ãˆã¾ã™ã€‚ *è¦å‘Š* ã€ŒåœŸåœ°æƒ…å ±ã€ï¼žã€Œã‚ªãƒ—ションã€ï¼žã€Œåœ°å½¢ã‚’編集ã€ã®é †ã§é€²ã‚€ã¨ã€èª°ã§ã‚‚ã‚ãªãŸã®åœŸåœ°ã®å½¢ã®æ•´å‚™ã‚„ã€ãƒªãƒ³ãƒ‡ãƒ³ãƒ—ラントã®è¨ç½®ã€ç§»å‹•ãŒã§ãã¾ã™ã€‚ ã“ã®èƒ½åŠ›ã‚’å‰²ã‚ŠæŒ¯ã‚‹å‰ã«ã€ã“ã®ã“ã¨ã‚’よãç†è§£ã—ã¦ãŠã„ã¦ãã ã•ã„。 ã€ŒåœŸåœ°æƒ…å ±ã€ï¼žã€Œã‚ªãƒ—ションã€ã‚¿ãƒ–ã‹ã‚‰ã€Œåœ°å½¢ã‚’編集ã€ã«åˆ‡ã‚Šæ›¿ãˆã‚‰ã‚Œã¾ã™ã€‚" name="land edit" value="21"/> + <action description="音楽ã¨ãƒ¡ãƒ‡ã‚£ã‚¢ã®è¨å®šã‚’変更" longdescription="ストリーミングミュージックã¨å‹•ç”»ã®è¨å®šã‚’変更ã™ã‚‹ã«ã¯ã€ã€ŒåœŸåœ°æƒ…å ±ã€ ï¼ž 「メディアã€ã‚¿ãƒ–を使ã„ã¾ã™ã€‚" name="land change media" value="20"/> + <action description="「地形を編集ã€ã«åˆ‡ã‚Šæ›¿ãˆ" longdescription="「地形を編集ã€ã«åˆ‡ã‚Šæ›¿ãˆã¾ã™ã€‚ *è¦å‘Š* ã€ŒåœŸåœ°æƒ…å ±ã€ï¼žã€Œã‚ªãƒ—ションã€ï¼žã€Œåœ°å½¢ã‚’編集ã€ã®é †ã§é€²ã‚€ã¨ã€èª°ã§ã‚‚ã‚ãªãŸã®åœŸåœ°ã®å½¢ã®æ•´å‚™ã‚„ã€ãƒªãƒ³ãƒ‡ãƒ³è£½ã®æ¨¹æœ¨ã®è¨ç½®ã€ç§»å‹•ãŒã§ãã¾ã™ã€‚ ã“ã®èƒ½åŠ›ã‚’å‰²ã‚ŠæŒ¯ã‚‹å‰ã«ã€ã“ã®ã“ã¨ã‚’よãç†è§£ã—ã¦ãŠã„ã¦ãã ã•ã„。 ã€ŒåœŸåœ°æƒ…å ±ã€ï¼žã€Œã‚ªãƒ—ションã€ã‚¿ãƒ–ã‹ã‚‰ã€Œåœ°å½¢ã‚’編集ã€ã«åˆ‡ã‚Šæ›¿ãˆã‚‰ã‚Œã¾ã™ã€‚" name="land edit" value="21"/> <action description="ã€ŒåœŸåœ°æƒ…å ±ã€ï¼žã€Œã‚ªãƒ—ションã€ã‚¿ãƒ–内ã®ã•ã¾ã–ã¾ãªè¨å®šã‚’切り替ãˆ" longdescription="「安全(ダメージãªã—)ã€ã€ã€Œé£›è¡Œã€ã‚’切り替ãˆã€ä½äººã«ä»¥ä¸‹ã‚’許å¯ã—ã¾ã™ï¼š グループ所有地ã®ã€ŒåœŸåœ°æƒ…å ±ã€ > 「オプションã€ã‚¿ãƒ–内ã®ã€ã€Œåœ°å½¢ã‚’編集ã€ã€ã€Œåˆ¶ä½œã€ã€ã€Œãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã®ä½œæˆã€ã€ã€Œã‚¹ã‚¯ãƒªãƒ—トã®å®Ÿè¡Œã€ã€‚" name="land options" value="22"/> </action_set> <action_set description="ã“れらã®èƒ½åŠ›ã«ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—所有ã®åŒºç”»ã«é–¢ã™ã‚‹è¦åˆ¶ã‚’迂回ã™ã‚‹ã“ã¨ã‚’ã€ãƒ¡ãƒ³ãƒãƒ¼ã«è¨±å¯ã™ã‚‹æ¨©é™ãŒå«ã¾ã‚Œã¾ã™ã€‚" name="Parcel Powers"> @@ -41,24 +41,24 @@ <action description="グループã®åœŸåœ°ã¸ã®ã€Œãƒ›ãƒ¼ãƒ è¨å®šã€ã‚’許å¯" longdescription="ã“ã®ã€Œå½¹å‰²ã€ã‚’æŒã¤ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«è²æ¸¡ã•れãŸåŒºç”»ä¸Šã§ã€Œä¸–界ã€ãƒ¡ãƒ‹ãƒ¥ãƒ¼ > ランドマーク > ç¾åœ¨åœ°ã‚’ホームã«è¨å®š を使用ã—ã¦ã€ãƒ›ãƒ¼ãƒ ã®è¨å®šã‚’行ã†ã“ã¨ãŒã§ãã¾ã™ã€‚" name="land allow set home" value="28"/> </action_set> <action_set description="ã“れらã®èƒ½åŠ›ã«ã¯ã€ä½äººã®å‡çµã‚„追放をå«ã‚€ã€ã‚°ãƒ«ãƒ¼ãƒ—所有ã®åŒºç”»ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯ã€åˆ¶é™ã™ã‚‹æ¨©é™ãŒå«ã¾ã‚Œã¾ã™ã€‚" name="Parcel Access"> - <action description="区画アクセス・リストã®ç®¡ç†" longdescription="区画アクセス・リストã®ç®¡ç†ã¯ã€ã€ŒåœŸåœ°æƒ…å ±ã€ï¼žã€Œã‚¢ã‚¯ã‚»ã‚¹ã€ã‚¿ãƒ–ã§è¡Œã„ã¾ã™ã€‚" name="land manage allowed" value="29"/> + <action description="区画アクセスリストã®ç®¡ç†" longdescription="区画アクセス・リストã®ç®¡ç†ã¯ã€ã€ŒåœŸåœ°æƒ…å ±ã€ï¼žã€Œã‚¢ã‚¯ã‚»ã‚¹ã€ã‚¿ãƒ–ã§è¡Œã„ã¾ã™ã€‚" name="land manage allowed" value="29"/> <action description="åŒºç”»ç¦æ¢ãƒªã‚¹ãƒˆã®ç®¡ç†" longdescription="ã€ŒåœŸåœ°æƒ…å ±ã€ > 「アクセスã€ã‚¿ãƒ–ã®ã€åŒºç”»ã®ç¦æ¢ãƒªã‚¹ãƒˆã®ç®¡ç†ãŒã§ãã¾ã™ã€‚" name="land manage banned" value="30"/> <action description="ã€Œå…¥å ´è¨±å¯ã‚’販売ã€ã®è¨å®šã‚’変更" longdescription="ã€ŒåœŸåœ°æƒ…å ±ã€ > 「アクセスã€ã‚¿ãƒ–ã§ã€åŒºç”»ã®ã€Œå…¥å ´è¨±å¯ã‚’販売ã€ã®è¨å®šã‚’変更ã—ã¾ã™ã€‚" name="land manage passes" value="31"/> - <action description="区画上ã®ä½äººã®è¿½æ”¾ã¨å‡çµ" longdescription="ã“ã®ã€Œèƒ½åŠ›ã€ã‚’æŒã¤ã€Œå½¹å‰²ã€ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—所有地ã«ã„ã¦æ¬²ã—ããªã„ä½äººã‚’å³ã‚¯ãƒªãƒƒã‚¯ã—ã€ã€Œè¿½æ”¾ã€ã‚„「フリーズã€ã‚’é¸ã‚“ã§å¯¾å¿œã§ãã¾ã™ã€‚" name="land admin" value="32"/> + <action description="区画上ã®ä½äººã®è¿½æ”¾ã¨ãƒ•リーズ" longdescription="ã“ã®ã€Œèƒ½åŠ›ã€ã‚’æŒã¤ã€Œå½¹å‰²ã€ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—所有地ã«ã„ã¦æ¬²ã—ããªã„ä½äººã‚’å³ã‚¯ãƒªãƒƒã‚¯ã—ã€ã€Œè¿½æ”¾ã€ã‚„「フリーズã€ã‚’é¸ã‚“ã§å¯¾å¿œã§ãã¾ã™ã€‚" name="land admin" value="32"/> </action_set> <action_set description="ã“れらã®èƒ½åŠ›ã«ã¯ã€ã‚ªãƒ–ジェクトã®è¿”å´ã€ãƒªãƒ³ãƒ‡ãƒ³ãƒ—ラントã®è¨ç½®ã‚„移動をã€ãƒ¡ãƒ³ãƒãƒ¼ã«è¨±å¯ã™ã‚‹æ¨©é™ãŒå«ã¾ã‚Œã¾ã™ã€‚ ã“れã¯ãƒ¡ãƒ³ãƒãƒ¼ãŒã‚´ãƒŸå‡¦ç†ã‚„景観作æˆã‚’ã™ã‚‹éš›ã«ä¾¿åˆ©ã§ã™ãŒã€è¿”å´ã—ãŸã‚ªãƒ–ジェクトã¯å…ƒã«æˆ»ã›ãªã„ã®ã§ã€æ³¨æ„ã—ã¦è¡Œã„ã¾ã—ょã†ã€‚" name="Parcel Content"> <action description="グループ所有オブジェクトã®è¿”å´" longdescription="グループ所有ã®åŒºç”»ä¸Šã®ã‚ªãƒ–ジェクトã®ã†ã¡ã€ã‚°ãƒ«ãƒ¼ãƒ—所有ã®ã‚ªãƒ–ジェクトを返å´ã™ã‚‹ã«ã¯ã€ã€ŒåœŸåœ°æƒ…å ±ã€ï¼žã€Œã‚ªãƒ–ジェクトã€ã‚¿ãƒ–を使ã„ã¾ã™ã€‚" name="land return group owned" value="48"/> <action description="グループã«è¨å®šã•れã¦ã„るオブジェクトを返å´" longdescription="グループ所有ã®åŒºç”»ä¸Šã®ã‚ªãƒ–ジェクトã®ã†ã¡ã€ã‚°ãƒ«ãƒ¼ãƒ—ã«è¨å®šã•れã¦ã„るオブジェクトを返å´ã™ã‚‹ã«ã¯ã€ã€ŒåœŸåœ°æƒ…å ±ã€ï¼žã€Œã‚ªãƒ–ジェクトã€ã‚¿ãƒ–を使ã„ã¾ã™ã€‚" name="land return group set" value="33"/> - <action description="éžã‚°ãƒ«ãƒ¼ãƒ—・オブジェクトã®è¿”å´" longdescription="グループ所有ã®åŒºç”»ä¸Šã®ã‚ªãƒ–ジェクトã®ã†ã¡ã€ã‚°ãƒ«ãƒ¼ãƒ—以外ã®ã‚ªãƒ–ジェクトを返å´ã™ã‚‹ã«ã¯ã€ã€ŒåœŸåœ°æƒ…å ±ã€ï¼žã€Œã‚ªãƒ–ジェクトã€ã‚¿ãƒ–を使ã„ã¾ã™ã€‚" name="land return non group" value="34"/> - <action description="Lindenè£½ã®æ¤ç‰©ã‚’使用ã—ã¦æ™¯è¦³ä½œæˆ" longdescription="ãƒªãƒ³ãƒ‡ãƒ³è£½ã®æ¨¹æœ¨ã€æ¤ç‰©ã€è‰ã‚’æ¤ãˆã‚‹ã€æ™¯è¦³ã¥ãりã®èƒ½åŠ›ã§ã™ã€‚ ã“ã‚Œã‚‰ã®æ¤ç‰©ã¯ã‚ãªãŸã®æŒã¡ç‰©å†…ã®ã€Œãƒ©ã‚¤ãƒ–ラリ〠> 「オブジェクトã€ãƒ•ォルダã«ã‚りã¾ã™ã€‚「制作ã€ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã§ä½œæˆã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚" name="land gardening" value="35"/> + <action description="éžã‚°ãƒ«ãƒ¼ãƒ—オブジェクトã®è¿”å´" longdescription="グループ所有ã®åŒºç”»ä¸Šã®ã‚ªãƒ–ジェクトã®ã†ã¡ã€ã‚°ãƒ«ãƒ¼ãƒ—以外ã®ã‚ªãƒ–ジェクトを返å´ã™ã‚‹ã«ã¯ã€ã€ŒåœŸåœ°æƒ…å ±ã€ï¼žã€Œã‚ªãƒ–ジェクトã€ã‚¿ãƒ–を使ã„ã¾ã™ã€‚" name="land return non group" value="34"/> + <action description="ãƒªãƒ³ãƒ‡ãƒ³è£½ã®æ¤ç‰©ã‚’使用ã—ã¦æ™¯è¦³ä½œæˆ" longdescription="ãƒªãƒ³ãƒ‡ãƒ³è£½ã®æ¨¹æœ¨ã€æ¤ç‰©ã€è‰ã‚’æ¤ãˆã‚‹ã€æ™¯è¦³ã¥ãりã®èƒ½åŠ›ã§ã™ã€‚ ã“ã‚Œã‚‰ã®æ¤ç‰©ã¯ã‚ãªãŸã®æŒã¡ç‰©å†…ã®ã€Œãƒ©ã‚¤ãƒ–ラリ〠> 「オブジェクトã€ãƒ•ォルダã«ã‚りã¾ã™ã€‚「制作ã€ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã§ä½œæˆã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚" name="land gardening" value="35"/> </action_set> <action_set description="ã“れらã®ã€Œèƒ½åŠ›ã€ã«ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—所有ã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’è²æ¸¡ã€ä¿®æ£ã€è²©å£²ã™ã‚‹æ¨©é™ãŒå«ã¾ã‚Œã¾ã™ã€‚ 変更ã¯ã€Œåˆ¶ä½œãƒ„ール〠> 「一般ã€ã‚¿ãƒ–ã§è¡Œã„ã¾ã™ã€‚ オブジェクトをå³ã‚¯ãƒªãƒƒã‚¯ã—ã¦ã€Œç·¨é›†ã€ã‚’é–‹ãã¨è¨å®šå†…容を確èªã§ãã¾ã™ã€‚" name="Object Management"> <action description="グループã«ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’è²æ¸¡" longdescription="「制作ツール〠> 「一般ã€ã‚¿ãƒ–ã§ã€ã‚ªãƒ–ジェクトをグループã«è²æ¸¡ã—ã¾ã™ã€‚" name="object deed" value="36"/> <action description="ã‚°ãƒ«ãƒ¼ãƒ—æ‰€æœ‰ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æ“作(移動ã€ã‚³ãƒ”ーã€ä¿®æ£ï¼‰" longdescription="「制作ツール〠> 「一般ã€ã‚¿ãƒ–ã§ã€ã‚°ãƒ«ãƒ¼ãƒ—所有ã®ã‚ªãƒ–ジェクトをæ“作(移動ã€ã‚³ãƒ”ーã€ä¿®æ£ï¼‰ã—ã¾ã™ã€‚" name="object manipulate" value="38"/> <action description="グループ所有オブジェクトを販売å¯èƒ½ã«è¨å®š" longdescription="「制作ツール〠> 「一般ã€ã‚¿ãƒ–ã§ã€ã‚°ãƒ«ãƒ¼ãƒ—所有ã®ã‚ªãƒ–ジェクトを販売対象ã«è¨å®šã—ã¾ã™ã€‚" name="object set sale" value="39"/> </action_set> - <action_set description="ã“れらã®èƒ½åŠ›ã«ã¯ã€ãƒ¡ãƒ³ãƒãƒ¼ã«ã€ã‚°ãƒ«ãƒ¼ãƒ—ã®è² å‚µã®æ”¯æ‰•ã„ã¨åˆ©åå—ã‘å–ã‚Šã‚’è¦æ±‚ã™ã‚‹æ¨©é™ã€ã‚°ãƒ«ãƒ¼ãƒ—å£åº§å±¥æ´ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’制é™ã™ã‚‹æ¨©é™ãŒå«ã¾ã‚Œã¾ã™ã€‚" name="Accounting"> - <action description="ã‚°ãƒ«ãƒ¼ãƒ—è² å‚µã®è¿”済ã¨ã‚°ãƒ«ãƒ¼ãƒ—é…当ã®å—é ˜" longdescription="ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã«ã¤ã„ã¦ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—è² å‚µã®æ”¯æ‰•ã„ã¨ã‚°ãƒ«ãƒ¼ãƒ—é…当ã®å—ã‘å–りãŒè‡ªå‹•çš„ã«è¡Œã‚れã¾ã™ã€‚ ã¤ã¾ã‚Šã€ã“れらã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€æ¯Žæ—¥é…当ã•れるグループ所有ã®åœŸåœ°ã®å£²ã‚Šä¸Šã’金ã®ä¸€éƒ¨ã‚’å—ã‘å–ã‚‹ã¨å…±ã«ã€åŒºç”»ã®åºƒå‘Šè²»ãªã©ã‚’è² æ‹…ã™ã‚‹ã“ã¨ã«ãªã‚Šã¾ã™ã€‚" name="accounting accountable" value="40"/> + <action_set description="ã“れらã®èƒ½åŠ›ã«ã¯ã€ãƒ¡ãƒ³ãƒãƒ¼ã«ã€ã‚°ãƒ«ãƒ¼ãƒ—ã®è² å‚µã®æ”¯æ‰•ã„ã¨åˆ©åå—ã‘å–ã‚Šã‚’è¦æ±‚ã™ã‚‹æ¨©é™ã€ã‚°ãƒ«ãƒ¼ãƒ—å£åº§å±¥æ´ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’制é™ã™ã‚‹æ¨©é™ãŒå«ã¾ã‚Œã¾ã™ã€‚" name="Accounting"><action description="ã‚°ãƒ«ãƒ¼ãƒ—è² å‚µã®è¿”済ã¨ã‚°ãƒ«ãƒ¼ãƒ—é…当ã®å—é ˜" longdescription="ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã«ã¤ã„ã¦ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—è² å‚µã®æ”¯æ‰•ã„ã¨ã‚°ãƒ«ãƒ¼ãƒ—é…当ã®å—ã‘å–りãŒè‡ªå‹•çš„ã«è¡Œã‚れã¾ã™ã€‚ + ã¤ã¾ã‚Šã€ã“れらã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€æ¯Žæ—¥é…当ã•れるグループ所有地ã®å£²ã‚Šä¸Šã’金ã®ä¸€éƒ¨ã‚’å—ã‘å–ã‚‹ã¨å…±ã«ã€åŒºç”»ã®åºƒå‘Šè²»ãªã©ã‚’è² æ‹…ã™ã‚‹ã“ã¨ã«ãªã‚Šã¾ã™ã€‚" name="accounting accountable" value="40"/> </action_set> <action_set description="ã“れらã®èƒ½åŠ›ã«ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—通知ã®é€ä¿¡ã€å—ä¿¡ã€è¡¨ç¤ºã‚’メンãƒãƒ¼ã«è¨±å¯ã™ã‚‹æ¨©é™ãŒå«ã¾ã‚Œã¾ã™ã€‚" name="Notices"> <action description="通知をé€ä¿¡" longdescription="ã“ã®ã€Œèƒ½åŠ›ã€ã‚’æŒã¤ã€Œå½¹å‰²ã€ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã€Œã‚°ãƒ«ãƒ¼ãƒ—〠> 「通知ã€ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã‹ã‚‰é€šçŸ¥ã‚’é€ä¿¡ã§ãã¾ã™ã€‚" name="notices send" value="42"/> @@ -68,9 +68,9 @@ <action description="ææ¡ˆã‚’作æˆ" longdescription="ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€æŠ•票ã®å¯¾è±¡ã¨ãªã‚‹å•題æèµ·ã‚’ã€Œã‚°ãƒ«ãƒ¼ãƒ—æƒ…å ±ã€ï¼žã€Œå•題æèµ·ã€ã‚¿ãƒ–上ã§ä½œæˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" name="proposal start" value="44"/> <action description="å•題æèµ·ã«æŠ•票ã™ã‚‹" longdescription="ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—æƒ…å ±ï¼žææ¡ˆã‚¿ãƒ–ã§ææ¡ˆã«æŠ•ç¥¨ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" name="proposal vote" value="45"/> </action_set> - <action_set description=" ã“れらã®ã‚¢ãƒ“リティã«ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—・ãƒãƒ£ãƒƒãƒˆãƒ»ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚„グループ・ボイス・ãƒãƒ£ãƒƒãƒˆã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã®è¨±å¯ã‚„制é™ã®æ¨©é™ãŒå«ã¾ã‚Œã¾ã™ã€‚ " name="Chat"> - <action description="グループ・ãƒãƒ£ãƒƒãƒˆã«å‚åŠ ã™ã‚‹" longdescription=" ã“ã®ã‚¢ãƒ“リティをæŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—・ãƒãƒ£ãƒƒãƒˆãƒ»ã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ãƒ†ã‚ストãŠã‚ˆã³ãƒœã‚¤ã‚¹ã§å‚åŠ ã§ãã¾ã™ã€‚ " name="join group chat"/> - <action description="グループ・ボイス・ãƒãƒ£ãƒƒãƒˆã«å‚åŠ ã™ã‚‹" longdescription=" ã“ã®ã‚¢ãƒ“リティをæŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—・ボイス・ãƒãƒ£ãƒƒãƒˆãƒ»ã‚»ãƒƒã‚·ãƒ§ãƒ³ã«å‚åŠ ã§ãã¾ã™ã€‚ 注: ボイス・ãƒãƒ£ãƒƒãƒˆãƒ»ã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã«ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—・ãƒãƒ£ãƒƒãƒˆã«å‚åŠ ã™ã‚‹ã‚¢ãƒ“リティãŒå¿…è¦ã§ã™ã€‚ " name="join voice chat"/> - <action description="グループ・ãƒãƒ£ãƒƒãƒˆã‚’管ç†ã™ã‚‹" longdescription=" ã“ã®ã‚¢ãƒ“リティをæŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—・ボイス・ãƒãƒ£ãƒƒãƒˆãƒ»ã‚»ãƒƒã‚·ãƒ§ãƒ³ãŠã‚ˆã³ã‚°ãƒ«ãƒ¼ãƒ—・テã‚スト・ãƒãƒ£ãƒƒãƒˆãƒ»ã‚»ãƒƒã‚·ãƒ§ãƒ³ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚„å‚åŠ ã‚’ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ " name="moderate group chat"/> + <action_set description=" ã“れらã®èƒ½åŠ›ã«ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—ãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚„グループボイスãƒãƒ£ãƒƒãƒˆã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã®è¨±å¯ã‚„制é™ã®æ¨©é™ãŒå«ã¾ã‚Œã¾ã™ã€‚ " name="Chat"> + <action description="グループãƒãƒ£ãƒƒãƒˆã«å‚åŠ ã™ã‚‹" longdescription=" ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—ãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ãƒ†ã‚ストãŠã‚ˆã³ãƒœã‚¤ã‚¹ã§å‚åŠ ã§ãã¾ã™ã€‚ " name="join group chat"/> + <action description="グループボイスãƒãƒ£ãƒƒãƒˆã«å‚åŠ ã™ã‚‹" longdescription=" ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—ボイスãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ã«å‚åŠ ã§ãã¾ã™ã€‚ 注: ボイスãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã«ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—ãƒãƒ£ãƒƒãƒˆã«å‚åŠ ã™ã‚‹èƒ½åŠ›ãŒå¿…è¦ã§ã™ã€‚ " name="join voice chat"/> + <action description="グループãƒãƒ£ãƒƒãƒˆã‚’管ç†ã™ã‚‹" longdescription=" ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—ボイスãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ãŠã‚ˆã³ã‚°ãƒ«ãƒ¼ãƒ—テã‚ストãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚„å‚åŠ ã‚’ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ " name="moderate group chat"/> </action_set> </role_actions> diff --git a/indra/newview/skins/default/xui/ja/sidepanel_appearance.xml b/indra/newview/skins/default/xui/ja/sidepanel_appearance.xml index 4fba4b1567..c453699c57 100644 --- a/indra/newview/skins/default/xui/ja/sidepanel_appearance.xml +++ b/indra/newview/skins/default/xui/ja/sidepanel_appearance.xml @@ -1,16 +1,17 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="アウトフィット" name="appearance panel"> <string name="No Outfit" value="アウトフィットãªã—"/> + <string name="Unsaved Changes" value="ä¿å˜ã•れã¦ã„ãªã„変更"/> + <string name="Now Wearing" value="ç€ç”¨ã—ã¦ã„ã¾ã™..."/> <panel name="panel_currentlook"> - <button label="編集" name="editappearance_btn"/> - <text name="currentlook_title"> - (ä¿å˜ã•れã¦ã„ã¾ã›ã‚“) + <button label="E" name="editappearance_btn"/> + <button label="O" name="openoutfit_btn"/> + <text name="currentlook_status"> + (状態) </text> <text name="currentlook_name"> MyOutfit With a really Long Name like MOOSE </text> </panel> - <filter_editor label="アウトフィットã®ãƒ•ィルター" name="Filter"/> - <button label="装ç€" name="wear_btn"/> - <button label="æ–°ã—ã„アウトフィット" name="newlook_btn"/> + <filter_editor label="アウトフィットをフィルター" name="Filter"/> </panel> diff --git a/indra/newview/skins/default/xui/ja/sidepanel_inventory.xml b/indra/newview/skins/default/xui/ja/sidepanel_inventory.xml index 0c97fed901..648719b6bd 100644 --- a/indra/newview/skins/default/xui/ja/sidepanel_inventory.xml +++ b/indra/newview/skins/default/xui/ja/sidepanel_inventory.xml @@ -2,10 +2,12 @@ <panel label="ã‚‚ã®" name="objects panel"> <panel label="" name="sidepanel__inventory_panel"> <panel name="button_panel"> - <button label="プãƒãƒ•ィール" name="info_btn"/> - <button label="装ç€" name="wear_btn"/> + <button label="プãƒãƒ•ィール" name="info_btn" tool_tip="オブジェクトã®ãƒ—ãƒãƒ•ィールを表示ã™ã‚‹"/> + <button label="共有" name="share_btn" tool_tip="「æŒã¡ç‰©ã€ã®ã‚¢ã‚¤ãƒ†ãƒ を共有ã™ã‚‹"/> + <button label="ショッピング" name="shop_btn" tool_tip="マーケットプレイスã®ã‚µã‚¤ãƒˆã‚’é–‹ã"/> + <button label="装ç€" name="wear_btn" tool_tip="é¸æŠžã—ãŸã‚¢ã‚¦ãƒˆãƒ•ィットをç€ç”¨ã™ã‚‹"/> <button label="プレイ" name="play_btn"/> - <button label="テレãƒãƒ¼ãƒˆ" name="teleport_btn"/> + <button label="テレãƒãƒ¼ãƒˆ" name="teleport_btn" tool_tip="該当ã™ã‚‹ã‚¨ãƒªã‚¢ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã™ã‚‹"/> </panel> </panel> </panel> diff --git a/indra/newview/skins/default/xui/ja/sidepanel_task_info.xml b/indra/newview/skins/default/xui/ja/sidepanel_task_info.xml index c2d2af5346..ff9b5dc6aa 100644 --- a/indra/newview/skins/default/xui/ja/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/ja/sidepanel_task_info.xml @@ -37,8 +37,8 @@ Mixed Sale </panel.string> <text name="title" value="オブジェクトã®ãƒ—ãƒãƒ•ィール"/> - <text name="where" value="(ワールド内)"/> - <panel label=""> + <text name="where" value="(インワールド)"/> + <panel label="" name="properties_panel"> <text name="Name:"> åå‰ï¼š </text> @@ -60,7 +60,7 @@ <text name="Group_label"> グループ: </text> - <button name="button set group" tool_tip="ã“ã®ã‚ªãƒ–ジェクト権é™ã‚’共有ã™ã‚‹ã‚°ãƒ«ãƒ¼ãƒ—ã‚’é¸æŠž"/> + <button name="button set group" tool_tip="ã“ã®ã‚ªãƒ–ジェクト権é™ã‚’共有ã™ã‚‹ã‚°ãƒ«ãƒ¼ãƒ—ã‚’é¸æŠžã—ã¾ã™"/> <name_box initial_value="ãƒãƒ¼ãƒ‡ã‚£ãƒ³ã‚°..." name="Group Name Proxy"/> <button label="è²æ¸¡" label_selected="è²æ¸¡" name="button deed" tool_tip="ã“ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’è²æ¸¡ã™ã‚‹ã¨ã€Œæ¬¡ã®æ‰€æœ‰è€…ã€ã®æ¨©é™ãŒé©ç”¨ã•れã¾ã™ã€‚ グループ共有オブジェクトã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—ã®ã‚ªãƒ•ィサーãŒè²æ¸¡ã§ãã¾ã™ã€‚"/> <text name="label click action"> @@ -91,7 +91,7 @@ </text> <check_box label="ä¿®æ£" name="checkbox next owner can modify"/> <check_box label="コピー" name="checkbox next owner can copy"/> - <check_box label="å†è²©ãƒ»ãƒ—レゼント" name="checkbox next owner can transfer" tool_tip="æ¬¡ã®æ‰€æœ‰è€…ã¯ã“ã®ã‚ªãƒ–ジェクトを他人ã«ã‚ã’ãŸã‚Šå†è²©ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™"/> + <check_box label="å†è²©ãƒ»ãƒ—レゼント" name="checkbox next owner can transfer" tool_tip="æ¬¡ã®æ‰€æœ‰è€…ã¯ã“ã®ã‚ªãƒ–ジェクトを他人ã«ã‚ã’ãŸã‚Šå†è²©ã§ãã¾ã™"/> </panel> <check_box label="販売ä¸" name="checkbox for sale"/> <combo_box name="sale type"> @@ -124,5 +124,6 @@ <button label="é–‹ã" name="open_btn"/> <button label="支払ã†" name="pay_btn"/> <button label="è²·ã†" name="buy_btn"/> + <button label="詳細" name="details_btn"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/ja/strings.xml b/indra/newview/skins/default/xui/ja/strings.xml index 288ad4bc1d..8948722bf3 100644 --- a/indra/newview/skins/default/xui/ja/strings.xml +++ b/indra/newview/skins/default/xui/ja/strings.xml @@ -23,7 +23,22 @@ ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã®æ¤œå‡ºä¸ã§ã™... </string> <string name="StartupLoading"> - ãƒãƒ¼ãƒ‡ã‚£ãƒ³ã‚° + [APP_NAME] をインストールä¸ã§ã™... + </string> + <string name="StartupClearingCache"> + ã‚ャッシュをクリアä¸ã§ã™... + </string> + <string name="StartupInitializingTextureCache"> + テクスãƒãƒ£ã‚ãƒ£ãƒƒã‚·ãƒ¥ã‚’åˆæœŸåŒ–ä¸ã§ã™... + </string> + <string name="StartupInitializingVFS"> + VFS ã‚’åˆæœŸåŒ–ä¸ã§ã™... + </string> + <string name="ProgressRestoring"> + 復元ä¸ã§ã™... + </string> + <string name="ProgressChangingResolution"> + è§£åƒåº¦ã‚’変更ä¸ã§ã™... </string> <string name="Fullbright"> 明るã•全開(レガシー) @@ -38,16 +53,16 @@ èªè¨¼ã—ã¦ã„ã¾ã™... </string> <string name="LoginMaintenance"> - アカウント・メンテナンスを実行ã—ã¦ã„ã¾ã™... + アカウントã®ãƒ¡ãƒ³ãƒ†ãƒŠãƒ³ã‚¹ã‚’実行ã—ã¦ã„ã¾ã™... </string> <string name="LoginAttempt"> - å‰å›žã®ãƒã‚°ã‚¤ãƒ³ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ ãƒã‚°ã‚¤ãƒ³ä¸ã§ã™([NUMBER]回目) + å‰å›žã®ãƒã‚°ã‚¤ãƒ³ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ ãƒã‚°ã‚¤ãƒ³ä¸ã§ã™ï¼ˆ[NUMBER] 回目) </string> <string name="LoginPrecaching"> - ワールドをãƒãƒ¼ãƒ‰ã—ã¦ã„ã¾ã™... + ワールドをèªã¿è¾¼ã‚“ã§ã„ã¾ã™... </string> <string name="LoginInitializingBrowser"> - 埋ã‚è¾¼ã¿Webãƒ–ãƒ©ã‚¦ã‚¶ã‚’åˆæœŸåŒ–ã—ã¦ã„ã¾ã™... + 内蔵 Web ãƒ–ãƒ©ã‚¦ã‚¶ã‚’åˆæœŸåŒ–ã—ã¦ã„ã¾ã™... </string> <string name="LoginInitializingMultimedia"> マルãƒãƒ¡ãƒ‡ã‚£ã‚¢ã‚’åˆæœŸåŒ–ã—ã¦ã„ã¾ã™... @@ -56,7 +71,7 @@ フォントをãƒãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ä¸... </string> <string name="LoginVerifyingCache"> - ã‚ャッシュ・ファイルを検証ã—ã¦ã„ã¾ã™(æ‰€è¦æ™‚é–“ã¯60~90ç§’)... + ã‚ャッシュファイルを検証ã—ã¦ã„ã¾ã™ï¼ˆæ‰€è¦æ™‚間㯠60 ~ 90 秒)... </string> <string name="LoginProcessingResponse"> 応ç”を処ç†ã—ã¦ã„ã¾ã™... @@ -68,26 +83,47 @@ ç”»åƒã‚’デコードã—ã¦ã„ã¾ã™... </string> <string name="LoginInitializingQuicktime"> - QuickTimeã‚’åˆæœŸåŒ–ã—ã¦ã„ã¾ã™... + QuickTime ã‚’åˆæœŸåŒ–ã—ã¦ã„ã¾ã™... </string> <string name="LoginQuicktimeNotFound"> - QuickTimeãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã€‚åˆæœŸåŒ–ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ + QuickTime ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã€‚åˆæœŸåŒ–ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ </string> <string name="LoginQuicktimeOK"> - QuickTimeãŒæ£å¸¸ã«åˆæœŸåŒ–ã•れã¾ã—ãŸã€‚ + QuickTime ãŒæ£å¸¸ã«åˆæœŸåŒ–ã•れã¾ã—ãŸã€‚ </string> <string name="LoginWaitingForRegionHandshake"> - 地域ã®ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã‚’å¾…ã£ã¦ã„ã¾ã™... + リージョンã®ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã‚’å¾…ã£ã¦ã„ã¾ã™... </string> <string name="LoginConnectingToRegion"> - åœ°åŸŸã«æŽ¥ç¶šã—ã¦ã„ã¾ã™... + ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«æŽ¥ç¶šã—ã¦ã„ã¾ã™... </string> <string name="LoginDownloadingClothing"> - æœã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ã„ã¾ã™... + 衣類をダウンãƒãƒ¼ãƒ‰ã—ã¦ã„ã¾ã™... + </string> + <string name="InvalidCertificate"> + 証明書ãŒç„¡åйã¾ãŸã¯å£Šã‚Œã¦ã„ã¾ã™ã€‚ グリッド管ç†è€…ã«ã”連絡ãã ã•ã„。 + </string> + <string name="CertInvalidHostname"> + 無効ãªãƒ›ã‚¹ãƒˆãƒãƒ¼ãƒ ãŒã‚µãƒ¼ãƒãƒ¼ã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ã„ã¾ã—ãŸã€‚SLURL ã‹ã‚°ãƒªãƒƒãƒ‰ã®ãƒ›ã‚¹ãƒˆãƒãƒ¼ãƒ ã‚’ã”確èªãã ã•ã„。 + </string> + <string name="CertExpired"> + グリッドãŒè¿”ã—ãŸè¨¼æ˜Žæ›¸ã¯æœ‰åŠ¹æœŸé™ãŒçµ‚了ã—ã¦ã„ã‚‹ã¨è€ƒãˆã‚‰ã‚Œã¾ã™ã€‚ãŠä½¿ã„ã®ã‚·ã‚¹ãƒ†ãƒ クãƒãƒƒã‚¯ã‚’確èªã™ã‚‹ã‹ã€ã‚°ãƒªãƒƒãƒ‰ã®ç®¡ç†è€…ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。 + </string> + <string name="CertKeyUsage"> + SSL 証明書ã®ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ グリッド管ç†è€…ã«ã”連絡ãã ã•ã„。 + </string> + <string name="CertBasicConstraints"> + サーãƒãƒ¼ã®è¨¼æ˜Žæ›¸ãƒã‚§ãƒ¼ãƒ³ã«è¨¼æ˜Žæ›¸ãŒå¤šã™ãŽã¾ã™ã€‚ グリッド管ç†è€…ã«ã”連絡ãã ã•ã„。 + </string> + <string name="CertInvalidSignature"> + グリッドサーãƒãƒ¼ãŒè¿”ã—ãŸè¨¼æ˜Žæ›¸ã®ç½²åã‚’èªè¨¼ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚グリッドã®ç®¡ç†è€…ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。 </string> <string name="LoginFailedNoNetwork"> ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¨ãƒ©ãƒ¼ï¼š 接続を確立ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ãŠä½¿ã„ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯æŽ¥ç¶šã‚’ã”確èªãã ã•ã„。 </string> + <string name="LoginFailed"> + ãƒã‚°ã‚¤ãƒ³ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ + </string> <string name="Quit"> 終了 </string> @@ -97,23 +133,41 @@ <string name="AgentLostConnection"> ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«ä¸éƒ½åˆãŒç™ºç”Ÿã—ã¦ã„ã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ ã”使用ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒƒãƒˆæŽ¥ç¶šã‚’ã”確èªãã ã•ã„。 </string> + <string name="SavingSettings"> + è¨å®šã‚’ä¿å˜ä¸ã§ã™... + </string> + <string name="LoggingOut"> + ãƒã‚°ã‚¢ã‚¦ãƒˆä¸ã§ã™... + </string> + <string name="ShuttingDown"> + シャットダウンä¸ã§ã™... + </string> + <string name="YouHaveBeenDisconnected"> + ã‚ãªãŸãŒã„ãŸãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã¸ã®æŽ¥ç¶šãŒåˆ‡ã‚Œã¾ã—ãŸã€‚ + </string> + <string name="SentToInvalidRegion"> + 無効ãªãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã•れã¾ã—ãŸã€‚ + </string> + <string name="TestingDisconnect"> + ãƒ“ãƒ¥ãƒ¼ãƒ¯ã®æŽ¥ç¶šã‚’åˆ‡ã‚‹ãƒ†ã‚¹ãƒˆä¸ + </string> <string name="TooltipPerson"> 人 </string> <string name="TooltipNoName"> - (åå‰ãªã—) + (åå‰ãªã—) </string> <string name="TooltipOwner"> - オーナー: + 所有者: </string> <string name="TooltipPublic"> 公共 </string> <string name="TooltipIsGroup"> - (グループ) + (グループ) </string> <string name="TooltipForSaleL$"> - 売り出ã—ä¸:L$[AMOUNT] + 売り出ã—ä¸:L$ [AMOUNT] </string> <string name="TooltipFlagGroupBuild"> ã‚°ãƒ«ãƒ¼ãƒ—ä½œæˆ @@ -131,7 +185,7 @@ é£›è¡Œç¦æ¢ </string> <string name="TooltipFlagGroupScripts"> - グループ・スクリプト + グループスクリプト </string> <string name="TooltipFlagNoScripts"> スクリプトãªã— @@ -140,54 +194,94 @@ 土地: </string> <string name="TooltipMustSingleDrop"> - 1ã¤ã®ã‚¢ã‚¤ãƒ†ãƒ ã®ã¿ã‚’ã“ã“ã«ãƒ‰ãƒ©ãƒƒã‚°ã§ãã¾ã™ + アイテム㯠1 ã¤ã ã‘ã“ã“ã«ãƒ‰ãƒ©ãƒƒã‚°ã§ãã¾ã™ </string> <string name="TooltipHttpUrl"> - クリックã—ã¦ã“ã®Webページを見る + クリックã—ã¦ã“ã® Web ページを見ã¾ã™ </string> <string name="TooltipSLURL"> - クリックã—ã¦ã“ã®å ´æ‰€ã®æƒ…å ±ã‚’è¦‹ã‚‹ + クリックã—ã¦ã“ã®å ´æ‰€ã®æƒ…å ±ã‚’è¦‹ã¾ã™ </string> <string name="TooltipAgentUrl"> - クリックã—ã¦ã“ã®ä½äººã®ãƒ—ãƒãƒ•ィールを見る + クリックã—ã¦ã“ã®ä½äººã®ãƒ—ãƒãƒ•ィールを見ã¾ã™ + </string> + <string name="TooltipAgentMute"> + クリックã—ã¦ã“ã®ä½äººã«å¯¾ã—ã¦ç„¡è¦–è¨å®šã‚’ã—ã¾ã™ + </string> + <string name="TooltipAgentUnmute"> + クリックã—ã¦ã“ã®ä½äººã«å¯¾ã™ã‚‹ç„¡è¦–è¨å®šã‚’解除ã—ã¾ã™ + </string> + <string name="TooltipAgentIM"> + クリックã—ã¦ã“ã®ä½äººã« IM ã‚’é€ã‚Šã¾ã™ + </string> + <string name="TooltipAgentPay"> + クリックã—ã¦ã“ã®ä½äººã«æ”¯æ‰•ã„ã¾ã™ + </string> + <string name="TooltipAgentOfferTeleport"> + クリックã—ã¦ã“ã®ä½äººã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’é€ã‚Šã¾ã™ + </string> + <string name="TooltipAgentRequestFriend"> + クリックã—ã¦ã“ã®ä½äººã«ãƒ•レンド登録リクエストをé€ã‚Šã¾ã™ </string> <string name="TooltipGroupUrl"> - クリックã—ã¦ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã®èª¬æ˜Žæ–‡ã‚’見る + クリックã—ã¦ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã®èª¬æ˜Žæ–‡ã‚’見ã¾ã™ </string> <string name="TooltipEventUrl"> - クリックã—ã¦ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã®èª¬æ˜Žæ–‡ã‚’見る + クリックã—ã¦ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã®èª¬æ˜Žæ–‡ã‚’見ã¾ã™ </string> <string name="TooltipClassifiedUrl"> - クリックã—ã¦ã“ã®ã‚¯ãƒ©ã‚·ãƒ•ァイド広告を見る + クリックã—ã¦ã“ã®ã‚¯ãƒ©ã‚·ãƒ•ァイド広告を見ã¾ã™ </string> <string name="TooltipParcelUrl"> - クリックã—ã¦ã“ã®åŒºç”»ã®èª¬æ˜Žæ–‡ã‚’見る + クリックã—ã¦ã“ã®åŒºç”»ã®èª¬æ˜Žæ–‡ã‚’見ã¾ã™ </string> <string name="TooltipTeleportUrl"> - クリックã—ã¦ã“ã®å ´æ‰€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã™ã‚‹ + クリックã—ã¦ã“ã®å ´æ‰€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™ </string> <string name="TooltipObjectIMUrl"> - クリックã—ã¦ã“ã®ã‚ªãƒ–ジェクトã®èª¬æ˜Žæ–‡ã‚’見る + クリックã—ã¦ã“ã®ã‚ªãƒ–ジェクトã®èª¬æ˜Žæ–‡ã‚’見ã¾ã™ </string> <string name="TooltipMapUrl"> - クリックã—ã¦ã“ã®å ´æ‰€ã‚’地図ã«è¡¨ç¤ºã™ã‚‹ + クリックã—ã¦ã“ã®å ´æ‰€ã‚’地図ã«è¡¨ç¤ºã—ã¾ã™ </string> <string name="TooltipSLAPP"> - クリックã—㦠secondlife:// コマンドを出㙠+ クリックã—㦠secondlife:// コマンドを出ã—ã¾ã™ </string> - <string name="CurrentURL" value=" ç¾åœ¨ã®URL: [CurrentURL]"/> + <string name="CurrentURL" value=" ç¾åœ¨ã® URL: [CurrentURL]"/> + <string name="TooltipPrice" value="L$[PRICE]-"/> <string name="SLurlLabelTeleport"> テレãƒãƒ¼ãƒˆ </string> <string name="SLurlLabelShowOnMap"> 地図ã«è¡¨ç¤º </string> + <string name="SLappAgentMute"> + 無視 + </string> + <string name="SLappAgentUnmute"> + ミュート解除 + </string> + <string name="SLappAgentIM"> + IM + </string> + <string name="SLappAgentPay"> + 支払ㆠ+ </string> + <string name="SLappAgentOfferTeleport"> + 次ã®å ´æ‰€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã‚’é€ã‚Šã¾ã™ï¼š + </string> + <string name="SLappAgentRequestFriend"> + フレンド登録リクエスト + </string> <string name="BUTTON_CLOSE_DARWIN"> é–‰ã˜ã‚‹ (⌘W) </string> <string name="BUTTON_CLOSE_WIN"> é–‰ã˜ã‚‹ (Ctrl+W) </string> + <string name="BUTTON_CLOSE_CHROME"> + é–‰ã˜ã‚‹ + </string> <string name="BUTTON_RESTORE"> 復元 </string> @@ -227,12 +321,12 @@ <string name="AvatarNameMultiple"> (複数) </string> - <string name="AvatarNameHippos"> - (hippos) - </string> <string name="GroupNameNone"> (ãªã—) </string> + <string name="AvalineCaller"> + Avaline コール [ORDER] + </string> <string name="AssetErrorNone"> エラーãªã— </string> @@ -338,8 +432,11 @@ <string name="symbolic link"> リンク </string> + <string name="symbolic folder link"> + フォルダã®ãƒªãƒ³ã‚¯ + </string> <string name="AvatarEditingAppearance"> - (容姿ã®ç·¨é›†ï¼‰ + (容姿ã®ç·¨é›†ä¸ï¼‰ </string> <string name="AvatarAway"> 一時退å¸ä¸ @@ -387,28 +484,28 @@ æ³£ã </string> <string name="anim_dance1"> - ダンス1 + ダンス 1 </string> <string name="anim_dance2"> - ダンス2 + ダンス 2 </string> <string name="anim_dance3"> - ダンス3 + ダンス 3 </string> <string name="anim_dance4"> - ダンス4 + ダンス 4 </string> <string name="anim_dance5"> - ダンス5 + ダンス 5 </string> <string name="anim_dance6"> - ダンス6 + ダンス 6 </string> <string name="anim_dance7"> - ダンス7 + ダンス 7 </string> <string name="anim_dance8"> - ダンス8 + ダンス 8 </string> <string name="anim_express_disdain"> 侮蔑 @@ -588,16 +685,19 @@ 接続ã—ã¾ã—㟠</string> <string name="unavailable"> - ã‚ãªãŸã®ç¾åœ¨ã®ãƒã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã§ã¯ã€ãƒœã‚¤ã‚¹ã‚’利用ã§ãã¾ã›ã‚“。 + ç¾åœ¨åœ°ã§ã¯ã€ãƒœã‚¤ã‚¹ã‚’利用ã§ãã¾ã›ã‚“。 </string> <string name="hang_up"> インワールドボイスãƒãƒ£ãƒƒãƒˆã®é€šè©±ãŒåˆ‡æ–ã•れã¾ã—㟠</string> + <string name="reconnect_nearby"> + 「近ãã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã€ã«å†æŽ¥ç¶šã•れã¾ã™ + </string> <string name="ScriptQuestionCautionChatGranted"> - [REGIONNAME]ã®[REGIONPOS]ã¨ã„ã†å ´æ‰€ã«ã‚る「[OWNERNAME]ã€æ‰€æœ‰ã®ã€Œ[OBJECTNAME]ã€ã¨ã„ã†ã‚ªãƒ–ジェクトã¯ã€æ¬¡ã®æ¨©é™ã‚’許å¯ã—ã¾ã—ãŸï¼š [PERMISSIONS] + [REGIONNAME] ã® [REGIONPOS] ã¨ã„ã†å ´æ‰€ã«ã‚ã‚‹ã€ã€Œ [OWNERNAME] ã€ãŒæ‰€æœ‰ã™ã‚‹ã€Œ [OBJECTNAME] ã€ã¨ã„ã†ã‚ªãƒ–ジェクトã¯ã€æ¬¡ã®æ¨©é™ã‚’許å¯ã—ã¾ã—ãŸï¼š [PERMISSIONS] </string> <string name="ScriptQuestionCautionChatDenied"> - [REGIONNAME]ã®[REGIONPOS]ã¨ã„ã†å ´æ‰€ã«ã‚る「[OWNERNAME]ã€æ‰€æœ‰ã®ã€Œ[OBJECTNAME]ã€ã¨ã„ã†ã‚ªãƒ–ジェクトã¯ã€æ¬¡ã®æ¨©é™ã‚’æ‹’å¦ã—ã¾ã—ãŸï¼š [PERMISSIONS] + [REGIONNAME] ã® [REGIONPOS] ã¨ã„ã†å ´æ‰€ã«ã‚ã‚‹ã€ã€Œ [OWNERNAME] ã€ãŒæ‰€æœ‰ã™ã‚‹ã€Œ [OBJECTNAME] ã€ã¨ã„ã†ã‚ªãƒ–ジェクトã¯ã€æ¬¡ã®æ¨©é™ã‚’æ‹’å¦ã—ã¾ã—ãŸï¼š [PERMISSIONS] </string> <string name="ScriptTakeMoney"> リンデンドル(L$)を支払ㆠ@@ -636,10 +736,10 @@ 接続ã•れã¦ã„ã¾ã›ã‚“ </string> <string name="SIM_ACCESS_PG"> - 一般 + General </string> <string name="SIM_ACCESS_MATURE"> - 控ãˆã‚ + Moderate </string> <string name="SIM_ACCESS_ADULT"> Adult @@ -653,6 +753,12 @@ <string name="land_type_unknown"> ï¼ˆä¸æ˜Žï¼‰ </string> + <string name="Estate / Full Region"> + ä¸å‹•産 / フルリージョン + </string> + <string name="Mainland / Full Region"> + メインランド / フルリージョン + </string> <string name="all_files"> å…¨ã¦ã®ãƒ•ァイル </string> @@ -672,22 +778,22 @@ ãƒãƒ¼ãƒ‰ </string> <string name="targa_image_files"> - Targaç”»åƒ + Targa ç”»åƒ </string> <string name="bitmap_image_files"> ãƒ“ãƒƒãƒˆãƒžãƒƒãƒ—ç”»åƒ </string> <string name="avi_movie_file"> - AVIムービーファイル + AVI ムービーファイル </string> <string name="xaf_animation_file"> - XAFアニメーションファイル + XAF アニメーションファイル </string> <string name="xml_file"> - XMLファイル + XML ファイル </string> <string name="dot_raw_file"> - RAWファイル + RAW ファイル </string> <string name="compressed_image_files"> åœ§ç¸®ç”»åƒ @@ -758,6 +864,48 @@ <string name="invalid"> 無効 </string> + <string name="shirt_not_worn"> + シャツ未ç€ç”¨ + </string> + <string name="pants_not_worn"> + パンツ未ç€ç”¨ + </string> + <string name="shoes_not_worn"> + é´æœªç€ç”¨ + </string> + <string name="socks_not_worn"> + é´ä¸‹æœªç€ç”¨ + </string> + <string name="jacket_not_worn"> + ジャケット未ç€ç”¨ + </string> + <string name="gloves_not_worn"> + 手袋未ç€ç”¨ + </string> + <string name="undershirt_not_worn"> + 下ç€ï¼ˆä¸Šï¼‰æœªç€ç”¨ + </string> + <string name="underpants_not_worn"> + 下ç€ï¼ˆä¸‹ï¼‰æœªç€ç”¨ + </string> + <string name="skirt_not_worn"> + スカート未ç€ç”¨ + </string> + <string name="alpha_not_worn"> + アルファ未ç€ç”¨ + </string> + <string name="tattoo_not_worn"> + タトゥー未ç€ç”¨ + </string> + <string name="invalid_not_worn"> + 無効 + </string> + <string name="NewWearable"> + æ–°ã—ã„ [WEARABLE_ITEM] + </string> + <string name="CreateNewWearable"> + [WEARABLE_TYPE]ã‚’ä½œæˆ + </string> <string name="next"> 次㸠</string> @@ -786,13 +934,13 @@ 添付アイテムをä¿å˜ </string> <string name="TeleportOffer"> - テレãƒãƒ¼ãƒˆã‚’渡㙠+ テレãƒãƒ¼ãƒˆã‚’é€ã‚‹ </string> <string name="StartUpNotifications"> ä¸åœ¨ä¸ã«æ–°ã—ã„通知ãŒå±Šãã¾ã—ãŸã€‚ </string> <string name="OverflowInfoChannelString"> - You have %d more notification + ã‚ãªãŸã«ã¯ã•ら㫠%d 通ã®é€šçŸ¥ãŒã‚りã¾ã™ </string> <string name="BodyPartsRightArm"> å³è…• @@ -807,7 +955,7 @@ 左脚 </string> <string name="BodyPartsTorso"> - é + 上åŠèº« </string> <string name="BodyPartsRightLeg"> å³è„š @@ -822,18 +970,21 @@ 高 </string> <string name="LeaveMouselook"> - ESC ã‚ーを押ã—ã¦ãƒ¯ãƒ¼ãƒ«ãƒ‰ãƒ“ãƒ¥ãƒ¼ã«æˆ»ã‚‹ + ESC ã‚ーを押ã—ã¦ãƒ¯ãƒ¼ãƒ«ãƒ‰ãƒ“ãƒ¥ãƒ¼ã«æˆ»ã‚Šã¾ã™ </string> <string name="InventoryNoMatchingItems"> - 一致ã™ã‚‹ã‚¢ã‚¤ãƒ†ãƒ ãŒæŒã¡ç‰©ã«ã‚りã¾ã›ã‚“ã§ã—㟠+ ãŠæŽ¢ã—ã®ã‚‚ã®ã¯è¦‹ã¤ã‹ã‚Šã¾ã—ãŸã‹ï¼Ÿ [secondlife:///app/search/all/[SEARCH_TERM] 検索] ã‚’ãŠè©¦ã—ãã ã•ã„。 + </string> + <string name="PlacesNoMatchingItems"> + ãŠæŽ¢ã—ã®ã‚‚ã®ã¯è¦‹ã¤ã‹ã‚Šã¾ã—ãŸã‹ï¼Ÿ [secondlife:///app/search/places/[SEARCH_TERM] 検索] ã‚’ãŠè©¦ã—ãã ã•ã„。 </string> <string name="FavoritesNoMatchingItems"> - ã“ã“ã«ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã‚’ドラッグã—ã¦ã€ãŠæ°—ã«å…¥ã‚Šã«è¿½åŠ ã—ã¾ã™ã€‚ + ã“ã“ã«ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã‚’ドラッグã—ã¦ãŠæ°—ã«å…¥ã‚Šã«è¿½åŠ ã—ã¾ã™ã€‚ </string> <string name="InventoryNoTexture"> - æŒã¡ç‰©å†…ã«ã“ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ã®ã‚³ãƒ”ーãŒã‚りã¾ã›ã‚“ + 「æŒã¡ç‰©ã€å†…ã«ã“ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ã®ã‚³ãƒ”ーãŒã‚りã¾ã›ã‚“ </string> - <string name="no_transfer" value=" (å†è²©/プレゼントä¸å¯ï¼‰"/> + <string name="no_transfer" value=" (å†è²©ãƒ»ãƒ—レゼントä¸å¯ï¼‰"/> <string name="no_modify" value=" (編集ä¸å¯ï¼‰"/> <string name="no_copy" value=" (コピーä¸å¯ï¼‰"/> <string name="worn" value=" (ç€ç”¨ä¸ï¼‰"/> @@ -846,6 +997,7 @@ コンテンツãªã— </string> <string name="WornOnAttachmentPoint" value=" ([ATTACHMENT_POINT] ã«è£…ç€ä¸ï¼‰"/> + <string name="ActiveGesture" value="[GESLABEL] (アクティブ)"/> <string name="PermYes"> ã¯ã„ </string> @@ -860,6 +1012,7 @@ <string name="Wave" value=" 手を振る"/> <string name="HelloAvatar" value=" ã‚„ã‚ã€ã‚¢ãƒã‚¿ãƒ¼ï¼"/> <string name="ViewAllGestures" value=" ã™ã¹ã¦è¡¨ç¤º >>"/> + <string name="GetMoreGestures" value="ショッピング >>"/> <string name="Animations" value="アニメーションã€"/> <string name="Calling Cards" value="コーリングカードã€"/> <string name="Clothing" value="衣類ã€"/> @@ -874,7 +1027,7 @@ <string name="No Filters" value="ã„ã„㈠"/> <string name="Since Logoff" value=" - ãƒã‚°ã‚ªãƒ•以æ¥"/> <string name="InvFolder My Inventory"> - マイ æŒã¡ç‰© + æŒã¡ç‰© </string> <string name="InvFolder My Favorites"> ãŠæ°—ã«å…¥ã‚Š @@ -910,7 +1063,7 @@ æ–°è¦ãƒ•ォルダ </string> <string name="InvFolder Inventory"> - インベントリ + æŒã¡ç‰© </string> <string name="InvFolder Uncompressed Images"> 圧縮ã•れã¦ã„ãªã„ç”»åƒ @@ -945,6 +1098,9 @@ <string name="InvFolder My Outfits"> マイ アウトフィット </string> + <string name="InvFolder Accessories"> + アクセサリ + </string> <string name="InvFolder Friends"> フレンド </string> @@ -955,7 +1111,7 @@ 買ㆠ</string> <string name="BuyforL$"> - Buy for L$ + L$ ã§è³¼å…¥ </string> <string name="Stone"> 石 @@ -1256,7 +1412,7 @@ ï¼ˆä¸æ˜Žï¼‰ </string> <string name="SummaryForTheWeek" value="今週ã®ã¾ã¨ã‚。開始日ã¯"/> - <string name="NextStipendDay" value="次回ã®ãŠå°é£ã„支給日ã¯"/> + <string name="NextStipendDay" value="ã§ã™ã€‚次回ã®ãŠå°é£ã„支給日:"/> <string name="GroupIndividualShare" value=" グループ 個人ã®å‰²ã‚Šå½“ã¦"/> <string name="Balance"> 残高 @@ -1298,7 +1454,7 @@ 許å¯ã•れãŸä½äººï¼š ([ALLOWEDAGENTS] äººã€æœ€å¤§ [MAXACCESS] 人) </string> <string name="RegionInfoAllowedGroups"> - 許å¯ã•れãŸã‚°ãƒ«ãƒ¼ãƒ—: ([ALLOWEDGROUPS]ã€æœ€å¤§ [MAXACCESS] グループ) + 許å¯ã•れãŸã‚°ãƒ«ãƒ¼ãƒ—: ([ALLOWEDGROUPS]ã€æœ€å¤§ [MAXACCESS] ) </string> <string name="ScriptLimitsParcelScriptMemory"> 区画スクリプトメモリ @@ -1316,14 +1472,17 @@ 区画ã®ã‚¹ã‚¯ãƒªãƒ—トURL </string> <string name="ScriptLimitsURLsUsed"> - 使用ã•れãŸURL: [MAX] ä¸ [COUNT] :[AVAILABLE] åˆ©ç”¨å¯ + 使用ã•れ㟠URL: [MAX] ä¸ [COUNT] :[AVAILABLE] åˆ©ç”¨å¯ </string> <string name="ScriptLimitsURLsUsedSimple"> - 使用ã•れãŸURL: [COUNT] + 使用ã•れ㟠URL: [COUNT] </string> <string name="ScriptLimitsRequestError"> æƒ…å ±ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆä¸ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—㟠</string> + <string name="ScriptLimitsRequestNoParcelSelected"> + 区画ãŒé¸æŠžã•れã¦ã„ã¾ã›ã‚“。 + </string> <string name="ScriptLimitsRequestWrongRegion"> エラー: ã‚¹ã‚¯ãƒªãƒ—ãƒˆæƒ…å ±ã¯ç¾åœ¨åœ°ã®ã¿å–å¾—ã§ãã¾ã™ </string> @@ -1430,13 +1589,13 @@ HUD(ä¸å¤® 2) </string> <string name="ATTACH_HUD_TOP_RIGHT"> - HUDå³ä¸Š + HUD(å³ä¸Šï¼‰ </string> <string name="ATTACH_HUD_TOP_CENTER"> HUD(上・ä¸å¤®ï¼‰ </string> <string name="ATTACH_HUD_TOP_LEFT"> - HUD 左上 + HUD(左上) </string> <string name="ATTACH_HUD_CENTER_1"> HUD(ä¸å¤® 1) @@ -1465,6 +1624,12 @@ <string name="PanelContentsNewScript"> æ–°è¦ã‚¹ã‚¯ãƒªãƒ—ト </string> + <string name="PanelContentsTooltip"> + オブジェクトã®ä¸èº« + </string> + <string name="BusyModeResponseDefault"> + メッセージをé€ã£ãŸä½äººã¯ã€èª°ã«ã‚‚邪é”ã‚’ã•れãŸããªã„ãŸã‚ç¾åœ¨ã€Œå–り込ã¿ä¸ã€ãƒ¢ãƒ¼ãƒ‰ã§ã™ã€‚ ã‚ãªãŸã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ã€ã‚ã¨ã§ç¢ºèªã§ãるよã†ã« IM パãƒãƒ«ã«è¡¨ç¤ºã•れã¾ã™ã€‚ + </string> <string name="MuteByName"> (å称別) </string> @@ -1477,15 +1642,16 @@ <string name="MuteGroup"> (グループ) </string> + <string name="MuteExternal"> + (外部) + </string> <string name="RegionNoCovenant"> ã“ã®ä¸å‹•産ã«ã¯ç´„款ãŒã‚りã¾ã›ã‚“。 </string> <string name="RegionNoCovenantOtherOwner"> ã“ã®ä¸å‹•産ã«ã¯ç´„款ãŒã‚りã¾ã›ã‚“。 ã“ã®ä¸å‹•産上ã®åœŸåœ°ã¯ä¸å‹•産所有者ã«ã‚ˆã‚Šè²©å£²ã•れã€Linden Lab ã¯è²©å£²ã—ã¾ã›ã‚“。 販売ã«é–¢ã™ã‚‹ãŠå•ã„åˆã‚ã›ã¯ã€ä¸å‹•産所有者ã¾ã§ãŠé¡˜ã„致ã—ã¾ã™ã€‚ </string> - <string name="covenant_last_modified"> - æœ€çµ‚ä¿®æ£æ—¥ï¼š - </string> + <string name="covenant_last_modified" value="æœ€çµ‚ä¿®æ£æ—¥ï¼š"/> <string name="none_text" value=" (ãªã—) "/> <string name="never_text" value=" (無) "/> <string name="GroupOwned"> @@ -1501,7 +1667,10 @@ (掲載後更新) </string> <string name="NoPicksClassifiedsText"> - ã“ã“ã«ã¯ãƒ”ック・クラシファイド広告ã¯ã‚りã¾ã›ã‚“。 + ピックやクラシファイド広告を作æˆã—ã¦ã„ã¾ã›ã‚“。 作æˆã™ã‚‹ã«ã¯ã€ä¸‹ã«ã‚る「プラスã€ãƒœã‚¿ãƒ³ã‚’クリックã—ã¾ã™ã€‚ + </string> + <string name="NoAvatarPicksClassifiedsText"> + ピックã€ã¾ãŸã¯ã‚¯ãƒ©ã‚·ãƒ•ァイド広告ãŒã‚りã¾ã›ã‚“ </string> <string name="PicksClassifiedsLoadingText"> ãƒãƒ¼ãƒ‡ã‚£ãƒ³ã‚°... @@ -1531,25 +1700,25 @@ ãŒæ¸¡ã—ã¾ã—㟠</string> <string name="InvOfferYouDecline"> - You decline + æ‹’å¦ï¼š </string> <string name="InvOfferFrom"> - from + é€ä¿¡å…ƒï¼š </string> <string name="GroupMoneyTotal"> åˆè¨ˆ </string> <string name="GroupMoneyBought"> - ã¯è³¼å…¥ã—ã¾ã—㟠+ 購入: </string> <string name="GroupMoneyPaidYou"> - ãŒã‚ãªãŸã«æ”¯æ‰•ã„ã¾ã—㟠+ ã‚ãªãŸã«æ”¯æ‰•ã„: </string> <string name="GroupMoneyPaidInto"> paid into </string> <string name="GroupMoneyBoughtPassTo"> - bought pass to + å…¥å ´è¨±å¯ã‚’購入: </string> <string name="GroupMoneyPaidFeeForEvent"> ãŒã‚¤ãƒ™ãƒ³ãƒˆç”¨ã®è²»ç”¨ã‚’支払ã„ã¾ã—㟠@@ -1576,7 +1745,10 @@ ã‚ャンセル </string> <string name="UploadingCosts"> - %s ã®ã‚¢ãƒƒãƒ—ãƒãƒ¼ãƒ‰ä»£é‡‘: + [NAME] ã®ã‚¢ãƒƒãƒ—ãƒãƒ¼ãƒ‰æ–™é‡‘㯠L$[AMOUNT] ã§ã™ + </string> + <string name="BuyingCosts"> + ã“れを L$[AMOUNT] ã§è³¼å…¥ã—ã¾ã™ </string> <string name="UnknownFileExtension"> 䏿˜Žã®æ‹¡å¼µå: %s @@ -1679,7 +1851,7 @@ 土地ã®ãƒ¬ãƒ³ã‚¿ãƒ« </string> <string name="Property Rental"> - 建物ã®ãƒ¬ãƒ³ã‚¿ãƒ« + プãƒãƒ‘ティã®ãƒ¬ãƒ³ã‚¿ãƒ« </string> <string name="Special Attraction"> 特別アトラクション @@ -1849,13 +2021,13 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã ãƒ”ã‚¯ã‚»ãƒ«å½¢å¼æƒ…å ±ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ </string> <string name="MBTrueColorWindow"> - [APP_NAME] を実行ã™ã‚‹ã«ã¯ã€True Color(32ビット)ãŒå¿…è¦ã§ã™ã€‚ + [APP_NAME] を実行ã™ã‚‹ã«ã¯ã€True Color (32ビット)ãŒå¿…è¦ã§ã™ã€‚ ãŠä½¿ã„ã®ã‚³ãƒ³ãƒ”ューターã®ã€Œã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ãƒ‘ãƒãƒ«ã€ï¼žã€Œç”»é¢ã€ï¼žã€Œè¨å®šã€ã«è¡Œãã€ã€Œæœ€é«˜ (32 ビット)ã€ã«è¨å®šã—ã¦ãã ã•ã„。 </string> <string name="MBAlpha"> [APP_NAME] 㯠8 ビットã®ã‚¢ãƒ«ãƒ•ã‚¡ãƒãƒ£ãƒ³ãƒãƒ«ã‚’å–å¾—ã§ããªã„ãŸã‚実行ã§ãã¾ã›ã‚“。 通常ビデオカードã®ãƒ‰ãƒ©ã‚¤ãƒã®å•題ã§èµ·ã“りã¾ã™ã€‚ ãŠä½¿ã„ã®ã‚³ãƒ³ãƒ”ãƒ¥ãƒ¼ã‚¿ãƒ¼ã«æœ€æ–°ã®ãƒ“デオカードドライãƒãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã‚‹ã‹ã”確èªãã ã•ã„。 -ã¾ãŸã€ã€Œã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ãƒ‘ãƒãƒ«ã€ï¼žã€Œç”»é¢ã€ï¼žã€Œè¨å®šã€å†…ã§ã€ãƒ¢ãƒ‹ã‚¿ãƒ¼ãŒã€Œæœ€é«˜ (32ビット)ã€ã«è¨å®šã•れã¦ã„ã‚‹ã“ã¨ã‚‚ã”確èªãã ã•ã„。 +ã¾ãŸã€ã€Œã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ãƒ‘ãƒãƒ«ã€ï¼žã€Œç”»é¢ã€ï¼žã€Œè¨å®šã€å†…ã§ã€ãƒ¢ãƒ‹ã‚¿ãƒ¼ãŒã€Œæœ€é«˜ (32 ビット)ã€ã«è¨å®šã•れã¦ã„ã‚‹ã“ã¨ã‚‚ã”確èªãã ã•ã„。 ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒä½•åº¦ã‚‚å‡ºã‚‹å ´åˆã¯ã€[SUPPORT_SITE] ã¸ã”連絡ãã ã•ã„。 </string> <string name="MBPixelFmtSetErr"> @@ -1868,7 +2040,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã GL レンダーコンテã‚ストをアクティベートã§ãã¾ã›ã‚“ </string> <string name="MBVideoDrvErr"> - ãŠä½¿ã„ã®ã‚³ãƒ³ãƒ”ューターã®ãƒ“デオカードドライãƒãŒæ£å¸¸ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã§ããªã‹ã£ãŸã€ã¾ãŸã¯å¤ã„ã‹ã‚µãƒãƒ¼ãƒˆå¯¾è±¡å¤–ã®ãŸã‚ã€[APP_NAME] ã¯å®Ÿè¡Œã§ãã¾ã›ã‚“。 最新ã®ãƒ“デオカードドライãƒãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã‚‹ã®ã‚’確èªã—ã€ã•れã¦ã„ã‚‹å ´åˆã¯å†ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚’ãŠè©¦ã—ãã ã•ã„。 + ãŠä½¿ã„ã®ã‚³ãƒ³ãƒ”ューターã®ãƒ“デオカードドライãƒãŒæ£å¸¸ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã§ããªã‹ã£ãŸã€ã¾ãŸã¯å¤ã„ã‹ã‚µãƒãƒ¼ãƒˆå¯¾è±¡å¤–ã®ãŸã‚ã€[APP_NAME] ã¯å®Ÿè¡Œã§ãã¾ã›ã‚“。 最新ã®ãƒ“デオカードドライãƒãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã‚‹ã®ã‚’確èªã—ã€ã•れã¦ã„ã‚‹å ´åˆã¯å†ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚’ãŠè©¦ã—ãã ã•ã„。 ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒä½•åº¦ã‚‚å‡ºã‚‹å ´åˆã¯ã€[SUPPORT_SITE] ã¸ã”連絡ãã ã•ã„。 </string> @@ -1897,7 +2069,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã 後ã‚é«ªã®æ¯›å…ˆ </string> <string name="Baggy"> - ãŸã‚‹ã‚“ã§ã„ã‚‹ + ãŸã‚‹ã‚“ã 下ã¾ã¶ãŸ </string> <string name="Bangs"> å‰é«ª @@ -1987,7 +2159,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã 広 </string> <string name="Brow Size"> - 眉毛ã®å¤§ãã• + 眉毛上ã®éš†èµ· </string> <string name="Bug Eyes"> Bug Eyes @@ -2020,7 +2192,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã 膨らã¿å¤§ </string> <string name="Chaplin"> - Chaplin + ãƒãƒ£ãƒƒãƒ—リン </string> <string name="Cheek Bones"> ã»ãŠéª¨ @@ -2041,7 +2213,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã ã‚ã”ã®é•·ã• </string> <string name="Chin Heavy"> - ã‚ã”ã«é‡ç‚¹ + ã‚ã”を強調 </string> <string name="Chin In"> ã²ã„ãŸã‚ã” @@ -2233,7 +2405,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã ã²ãŸã„ã®è§’度 </string> <string name="Forehead Heavy"> - ã²ãŸã„ã«é‡ç‚¹ + ã²ãŸã„を強調 </string> <string name="Freckles"> ã—ã¿ãƒ»ãã°ã‹ã™ @@ -2314,7 +2486,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã é ã®å¤§ãã• </string> <string name="Head Stretch"> - é ã®ä¼¸ã³ + 縦横ã®é•·ã• </string> <string name="Heel Height"> ヒールã®é«˜ã• @@ -2383,7 +2555,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã ã‚ã”ã®å½¢ </string> <string name="Join"> - 寄ã›ãŸ + 寄ã›ãŸèƒ¸ </string> <string name="Jowls"> ãˆã‚‰ @@ -2488,7 +2660,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã å£ç´…ã®è‰² </string> <string name="Long"> - é•· + ãƒãƒ³ã‚° </string> <string name="Long Head"> å‰å¾Œå¹…ãŒåºƒã„é @@ -2884,7 +3056,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã 骨張ã£ãŸè„š </string> <string name="Separate"> - 離れ㟠+ 離れãŸèƒ¸ </string> <string name="Shallow"> ãªã ら㋠@@ -2932,7 +3104,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã é´ã®é•·ã• </string> <string name="Short"> - çŸ + ショート </string> <string name="Short Arms"> çŸ @@ -3046,7 +3218,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã 縦長 </string> <string name="Sunken"> - ã“ã‘㟠+ ã“ã‘ãŸã»ãŠ </string> <string name="Sunken Chest"> å° @@ -3061,7 +3233,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã å‰ã¸ </string> <string name="Tall"> - 高 + トール </string> <string name="Taper Back"> 後ã‚ã«å…ˆç´° @@ -3142,7 +3314,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã ã»ãŠã®ä¸Šéƒ¨ </string> <string name="Upper Chin Cleft"> - ã‚ã”上部ã®å‰²ã‚Œå…·åˆ + ã‚ã”上部ã®å‰²ã‚Œ </string> <string name="Upper Eyelid Fold"> 二é‡ã®å¹… @@ -3157,7 +3329,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã ウエストã®é«˜ã• </string> <string name="Well-Fed"> - ã¤ã¾ã£ãŸ + ã¤ã¾ã£ãŸã»ãŠ </string> <string name="White Hair"> 白髪 @@ -3178,7 +3350,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã ワイルド </string> <string name="Wrinkles"> - ã—ã‚ã‚り + ã—ã‚ </string> <string name="LocationCtrlAddLandmarkTooltip"> マイ ランドマークã«è¿½åŠ @@ -3190,7 +3362,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã ç¾åœ¨åœ°ã®è©³ç´°ã‚’見る </string> <string name="LocationCtrlComboBtnTooltip"> - マイãƒã‚±ãƒ¼ã‚·ãƒ§ãƒ³å±¥æ´ + マイ ãƒã‚±ãƒ¼ã‚·ãƒ§ãƒ³å±¥æ´ </string> <string name="LocationCtrlForSaleTooltip"> ã“ã®åœŸåœ°ã‚’購入 @@ -3213,6 +3385,15 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã <string name="LocationCtrlDamageTooltip"> 体力 </string> + <string name="LocationCtrlAdultIconTooltip"> + Adult リージョン + </string> + <string name="LocationCtrlModerateIconTooltip"> + Moderate リージョン + </string> + <string name="LocationCtrlGeneralIconTooltip"> + General リージョン + </string> <string name="UpdaterWindowTitle"> [APP_NAME] アップデート </string> @@ -3243,11 +3424,17 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã <string name="UpdaterFailStartTitle"> ビューワã®èµ·å‹•ã«å¤±æ•—ã—ã¾ã—㟠</string> + <string name="ItemsComingInTooFastFrom"> + [APP_NAME] : アイテム㌠[FROM_NAME] ã‹ã‚‰åŒæ™‚ã«ãŸãã•ã‚“èªã¿è¾¼ã¾ã‚Œã¦ã„ã‚‹ãŸã‚ã€è‡ªå‹•プレビュー㌠[TIME] 秒間無効ã¨ãªã‚Šã¾ã™ã€‚ + </string> + <string name="ItemsComingInTooFast"> + [APP_NAME] : アイテムãŒåŒæ™‚ã«ãŸãã•ã‚“èªã¿è¾¼ã¾ã‚Œã¦ã„ã‚‹ãŸã‚ã€è‡ªå‹•プレビュー㌠[TIME] 秒間無効ã¨ãªã‚Šã¾ã™ã€‚ + </string> <string name="IM_logging_string"> -- インスタントメッセージã®ä¿å˜é–‹å§‹ -- </string> <string name="IM_typing_start_string"> - [NAME] ã¯å…¥åŠ›ä¸... + [NAME] ã¯å…¥åŠ›ä¸ã§ã™... </string> <string name="Unnamed"> (åå‰ãªã—) @@ -3270,12 +3457,18 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã <string name="IM_moderator_label"> (モデレータ) </string> - <string name="started_call"> + <string name="answered_call"> + 相手ãŒã‚³ãƒ¼ãƒ«ã‚’å—ã‘ã¾ã—㟠+ </string> + <string name="you_started_call"> ボイスコールを開始ã—ã¾ã™ </string> - <string name="joined_call"> + <string name="you_joined_call"> ボイスコールã«å‚åŠ ã—ã¾ã—㟠</string> + <string name="name_started_call"> + [NAME] ã¯ãƒœã‚¤ã‚¹ã‚³ãƒ¼ãƒ«ã‚’é–‹å§‹ã—ã¾ã™ + </string> <string name="ringing-im"> ボイスコールã«å‚åŠ ... </string> @@ -3292,7 +3485,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã アドホックコンファレンス </string> <string name="inventory_item_offered-im"> - æŒã¡ç‰©ã‚¢ã‚¤ãƒ†ãƒ ãŒé€ã‚‰ã‚Œã¦ãã¾ã—㟠+ æŒã¡ç‰©ã‚¢ã‚¤ãƒ†ãƒ ã‚’é€ã‚Šã¾ã—㟠</string> <string name="share_alert"> æŒã¡ç‰©ã‹ã‚‰ã“ã“ã«ã‚¢ã‚¤ãƒ†ãƒ をドラッグã—ã¾ã™ @@ -3301,10 +3494,10 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã ã“ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ã„るユーザーã¯ã‚ãªãŸã ã‘ã§ã™ã€‚ </string> <string name="offline_message"> - [FIRST] [LAST]ã¯ã‚ªãƒ•ラインã§ã™ã€‚ + [FIRST] [LAST] ã¯ã‚ªãƒ•ラインã§ã™ã€‚ </string> <string name="invite_message"> - ã“ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã«å¿œç”/接続ã™ã‚‹å ´åˆã¯ã€[BUTTON NAME]をクリックã—ã¦ãã ã•ã„。 + ã“ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã«å¿œç”・接続ã™ã‚‹å ´åˆã¯ã€[BUTTON NAME] をクリックã—ã¦ãã ã•ã„。 </string> <string name="muted_message"> ã“ã®ä½äººã‚’ブãƒãƒƒã‚¯ã—ã¦ã„ã¾ã™ã€‚ メッセージをé€ã‚‹ã¨ã€ãƒ–ãƒãƒƒã‚¯ãŒè‡ªå‹•çš„ã«è§£é™¤ã•れã¾ã™ã€‚ @@ -3328,7 +3521,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã ã‚ãªãŸã«ã¯ãã®èƒ½åŠ›ãŒã‚りã¾ã›ã‚“。 </string> <string name="not_a_mod_error"> - ã‚ãªãŸã¯ã‚»ãƒƒã‚·ãƒ§ãƒ³ãƒ»ãƒ¢ãƒ‡ãƒ¬ãƒ¼ã‚¿ã§ã¯ã‚りã¾ã›ã‚“。 + ã‚ãªãŸã¯ã‚»ãƒƒã‚·ãƒ§ãƒ³ãƒ¢ãƒ‡ãƒ¬ãƒ¼ã‚¿ã§ã¯ã‚りã¾ã›ã‚“。 </string> <string name="muted"> グループã®ãƒ¢ãƒ‡ãƒ¬ãƒ¼ã‚¿ãƒ¼ãŒã€ã‚ãªãŸã®ãƒ†ã‚ストãƒãƒ£ãƒƒãƒˆã‚’ç¦æ¢ã—ã¾ã—ãŸã€‚ @@ -3337,13 +3530,13 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã グループモデレータãŒã‚ãªãŸã®ãƒ†ã‚ストãƒãƒ£ãƒƒãƒˆã‚’無効化ã—ã¾ã—㟠</string> <string name="add_session_event"> - [RECIPIENT] ã¨ã®ãƒãƒ£ãƒƒãƒˆãƒ»ã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’è¿½åŠ ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ + [RECIPIENT] ã¨ã®ãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’è¿½åŠ ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ </string> <string name="message"> [RECIPIENT] ã¨ã®ãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ä¿¡ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 </string> <string name="message_session_event"> - [RECIPIENT] ã¨ã®ãƒãƒ£ãƒƒãƒˆãƒ»ã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ + [RECIPIENT] ã¨ã®ãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ </string> <string name="mute"> モデレートä¸ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ @@ -3355,7 +3548,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã ã‚ãªãŸã¯ã‚°ãƒ«ãƒ¼ãƒ—ã‹ã‚‰å‰Šé™¤ã•れã¾ã—ãŸã€‚ </string> <string name="close_on_no_ability"> - ã“ã®ãƒãƒ£ãƒƒãƒˆãƒ»ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚’継続ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ + ã“ã®ãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚’継続ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ </string> <string name="unread_chat_single"> [SOURCES] ã¯ä½•ã‹æ–°ã—ã„ã“ã¨ã‚’言ã„ã¾ã—ãŸã€‚ @@ -3363,4 +3556,250 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã <string name="unread_chat_multiple"> [SOURCES] ã¯ä½•ã‹æ–°ã—ã„ã“ã¨ã‚’言ã„ã¾ã—ãŸã€‚ </string> + <string name="session_initialization_timed_out_error"> + セッションã®åˆæœŸåŒ–ãŒã‚¿ã‚¤ãƒ アウトã—ã¾ã—㟠+ </string> + <string name="voice_morphing_url"> + http://secondlife.com/landing/voicemorphing + </string> + <string name="paid_you_ldollars"> + [NAME] 㯠L$[AMOUNT] 支払ã„ã¾ã—㟠+ </string> + <string name="you_paid_ldollars"> + [NAME] ã« L$ [AMOUNT] を支払ã„ã¾ã—ãŸï¼š[REASON] + </string> + <string name="you_paid_ldollars_no_info"> + L$ [AMOUNT] を支払ã„ã¾ã—ãŸã€‚ + </string> + <string name="you_paid_ldollars_no_reason"> + [NAME] ã« L$ [AMOUNT] を支払ã„ã¾ã—ãŸã€‚ + </string> + <string name="you_paid_ldollars_no_name"> + L$ [AMOUNT] を支払ã„ã¾ã—ãŸï¼š[REASON] + </string> + <string name="for a parcel of land"> + 土地区画ã®ãŸã‚ + </string> + <string name="for a land access pass"> + 土地ã®å…¥å ´è¨±å¯ã‚’å¾—ã‚‹ãŸã‚ + </string> + <string name="for deeding land"> + åœŸåœ°ã‚’è²æ¸¡ã™ã‚‹ãŸã‚ + </string> + <string name="to create a group"> + グループを作æˆã™ã‚‹ãŸã‚ + </string> + <string name="to join a group"> + グループã«å‚åŠ ã™ã‚‹ãŸã‚ + </string> + <string name="to upload"> + アップãƒãƒ¼ãƒ‰ã™ã‚‹ãŸã‚ + </string> + <string name="giving"> + L$[AMOUNT] を渡ã—ã¾ã™ + </string> + <string name="uploading_costs"> + アップãƒãƒ¼ãƒ‰æ–™é‡‘㯠L$[AMOUNT] ã§ã™ + </string> + <string name="this_costs"> + 料金㯠L$[AMOUNT] ã§ã™ + </string> + <string name="buying_selected_land"> + é¸æŠžã—ãŸåœŸåœ°ã‚’ L$ [AMOUNT] ã§è³¼å…¥ã—ã¾ã™ + </string> + <string name="this_object_costs"> + ã“ã®ã‚ªãƒ–ジェクト㯠L$[AMOUNT] ã§ã™ + </string> + <string name="group_role_everyone"> + 全員 + </string> + <string name="group_role_officers"> + オフィサー + </string> + <string name="group_role_owners"> + オーナー + </string> + <string name="uploading_abuse_report"> + アップãƒãƒ¼ãƒ‰ä¸... + +嫌ãŒã‚‰ã›ã®å ±å‘Š + </string> + <string name="New Shape"> + æ–°ã—ã„シェイプ + </string> + <string name="New Skin"> + æ–°ã—ã„スã‚ン + </string> + <string name="New Hair"> + æ–°ã—ã„髪 + </string> + <string name="New Eyes"> + æ–°ã—ã„ç›® + </string> + <string name="New Shirt"> + æ–°ã—ã„シャツ + </string> + <string name="New Pants"> + æ–°ã—ã„パンツ + </string> + <string name="New Shoes"> + æ–°ã—ã„é´ + </string> + <string name="New Socks"> + æ–°ã—ã„é´ä¸‹ + </string> + <string name="New Jacket"> + æ–°ã—ã„ジャケット + </string> + <string name="New Gloves"> + æ–°ã—ã„æ‰‹è¢‹ + </string> + <string name="New Undershirt"> + æ–°ã—ã„下ç€ï¼ˆä¸Šï¼‰ + </string> + <string name="New Underpants"> + æ–°ã—ã„下ç€ï¼ˆä¸‹ï¼‰ + </string> + <string name="New Skirt"> + æ–°ã—ã„スカート + </string> + <string name="New Alpha"> + æ–°ã—ã„アルファ + </string> + <string name="New Tattoo"> + æ–°ã—ã„タトゥ + </string> + <string name="Invalid Wearable"> + 無効ãªç€ç”¨ç‰© + </string> + <string name="New Script"> + æ–°è¦ã‚¹ã‚¯ãƒªãƒ—ト + </string> + <string name="New Folder"> + æ–°è¦ãƒ•ォルダ + </string> + <string name="Contents"> + コンテンツ + </string> + <string name="Gesture"> + ジェスãƒãƒ£ãƒ¼ + </string> + <string name="Male Gestures"> + 男性用ジェスãƒãƒ£ãƒ¼ + </string> + <string name="Female Gestures"> + 女性用ジェスãƒãƒ£ãƒ¼ + </string> + <string name="Other Gestures"> + ãã®ä»–ã®ã‚¸ã‚§ã‚¹ãƒãƒ£ãƒ¼ + </string> + <string name="Speech Gestures"> + 会話ジェスãƒãƒ£ãƒ¼ + </string> + <string name="Common Gestures"> + 一般的ジェスãƒãƒ£ãƒ¼ + </string> + <string name="Male - Excuse me"> + 男性 - ã™ã¿ã¾ã›ã‚“ + </string> + <string name="Male - Get lost"> + 男性 - Get lost + </string> + <string name="Male - Blow kiss"> + 男性 - 投ã’ã‚ッス + </string> + <string name="Male - Boo"> + 男性 - Boo + </string> + <string name="Male - Bored"> + 男性 - 退屈 + </string> + <string name="Male - Hey"> + 男性 - Hey + </string> + <string name="Male - Laugh"> + 男性 - 笑ㆠ+ </string> + <string name="Male - Repulsed"> + 男性 - æ‹’çµ¶ + </string> + <string name="Male - Shrug"> + 男性 - è‚©ã‚’ã™ãã‚ã‚‹ + </string> + <string name="Male - Stick tougue out"> + 男性 - 舌を出㙠+ </string> + <string name="Male - Wow"> + 男性 - Wow + </string> + <string name="Female - Excuse me"> + 女性 – ã™ã¿ã¾ã›ã‚“ + </string> + <string name="Female - Get lost"> + 女性 – ã‚ã£ã¡è¡Œã£ã¦ã‚ˆ + </string> + <string name="Female - Blow kiss"> + 女性 - 投ã’ã‚ッス + </string> + <string name="Female - Boo"> + 女性 – ãƒ¯ãƒƒï¼ + </string> + <string name="Female - Bored"> + 女性 - 退屈 + </string> + <string name="Female - Hey"> + 女性 - Hey + </string> + <string name="Female - Laugh"> + 女性 - 笑ㆠ+ </string> + <string name="Female - Repulsed"> + 女性 - æ‹’çµ¶ + </string> + <string name="Female - Shrug"> + 女性 - è‚©ã‚’ã™ãã‚ã‚‹ + </string> + <string name="Female - Stick tougue out"> + 女性 - 舌を出㙠+ </string> + <string name="Female - Wow"> + 女性 - Wow + </string> + <string name="AvatarBirthDateFormat"> + [year,datetime,slt]/[mthnum,datetime,slt]/[day,datetime,slt] + </string> + <string name="DefaultMimeType"> + ãªã—/ãªã— + </string> + <string name="texture_load_dimensions_error"> + [WIDTH]*[HEIGHT] 以上ã®ç”»åƒã¯èªã¿è¾¼ã‚ã¾ã›ã‚“ + </string> + <string name="words_separator" value=","/> + <string name="server_is_down"> + 大変申ã—訳ã”ã–ã„ã¾ã›ã‚“ãŒã€äºˆæœŸã›ã¬å•題ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ + + status.secondlifegrid.netã§ã€ã‚µãƒ¼ãƒ“スã«é–¢ã™ã‚‹æ—¢çŸ¥ã®å•題ã«ã¤ã„ã¦ãŠèª¿ã¹ãã ã•ã„。 + å•題ãŒå¼•ãç¶šã発生ã™ã‚‹å ´åˆã¯ã€ãŠä½¿ã„ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚„ファイアウォールã®è¨å®šã‚’確èªã—ã¦ãã ã•ã„。 + </string> + <string name="dateTimeWeekdaysNames"> + 日曜日:月曜日:ç«æ›œæ—¥:水曜日:木曜日:金曜日:土曜日 + </string> + <string name="dateTimeWeekdaysShortNames"> + æ—¥:月:ç«:æ°´:木:金:土 + </string> + <string name="dateTimeMonthNames"> + 1月:2月:3月:4月:5月:6月:7月:8月:9月:10月:11月:12月 + </string> + <string name="dateTimeMonthShortNames"> + 1月:2月:3月:4月:5月:6月:7月:8月:9月:10月:11月:12月 + </string> + <string name="dateTimeDayFormat"> + [MDAY] + </string> + <string name="dateTimeAM"> + AM + </string> + <string name="dateTimePM"> + PM + </string> </strings> diff --git a/indra/newview/skins/default/xui/ja/teleport_strings.xml b/indra/newview/skins/default/xui/ja/teleport_strings.xml index 72c183d03b..2f67d43707 100644 --- a/indra/newview/skins/default/xui/ja/teleport_strings.xml +++ b/indra/newview/skins/default/xui/ja/teleport_strings.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<teleport_messages name=""> +<teleport_messages> <message_set name="errors"> <message name="invalid_tport"> テレãƒãƒ¼ãƒˆå‡¦ç†ä¸ã«å•題ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ ãƒã‚°ã‚¤ãƒ³ã—ç›´ã™å¿…è¦ãŒã‚ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。 @@ -10,14 +10,14 @@ ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒä½•åº¦ã‚‚å‡ºã‚‹å ´åˆã¯ã€[SUPPORT_SITE] ã‚’ã”確èªãã ã•ã„。 </message> <message name="blocked_tport"> - 申ã—訳ã”ã–ã„ã¾ã›ã‚“。テレãƒãƒ¼ãƒˆã¯ç¾åœ¨ã€ãƒ–ãƒãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚ã‚‚ã†å°‘ã—後ã§ã‚„り直ã—ã¦ãã ã•ã„。 + 申ã—訳ã”ã–ã„ã¾ã›ã‚“ãŒã€ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã¯ç¾åœ¨ã€ãƒ–ãƒãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚ã‚‚ã†å°‘ã—後ã§ã‚„り直ã—ã¦ãã ã•ã„。 やり直ã—ã¦ã‚‚テレãƒãƒ¼ãƒˆã§ããªã„å ´åˆã¯ã€ã„ã£ãŸã‚“ãƒã‚°ã‚¢ã‚¦ãƒˆã—ã€å†åº¦ãƒã‚°ã‚¤ãƒ³ã—ã¦å•題を解決ã—ã¦ãã ã•ã„。 </message> <message name="nolandmark_tport"> - 残念ãªãŒã‚‰ã€ã‚·ã‚¹ãƒ†ãƒ ã¯ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ç›®çš„地を探ã›ã¾ã›ã‚“ã§ã—ãŸã€‚ + 残念ãªãŒã‚‰ã€ã‚·ã‚¹ãƒ†ãƒ ã¯ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã®ç›®çš„地を探ã›ã¾ã›ã‚“ã§ã—ãŸã€‚ </message> <message name="timeout_tport"> - 申ã—訳ã”ã–ã„ã¾ã›ã‚“。システムã¯ãƒ†ãƒ¬ãƒãƒ¼ãƒˆæŽ¥ç¶šã‚’完了ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ + 申ã—訳ã”ã–ã„ã¾ã›ã‚“ãŒã€ã‚·ã‚¹ãƒ†ãƒ ã¯ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã®æŽ¥ç¶šã‚’完了ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ ã‚‚ã†å°‘ã—後ã§ã‚„り直ã—ã¦ãã ã•ã„。 </message> <message name="noaccess_tport"> @@ -27,18 +27,18 @@ 添付物ã¯ã€ã¾ã 到ç€ã—ã¦ã„ã¾ã›ã‚“。ã‚ã¨æ•°ç§’é–“ãŠå¾…ã¡ã„ãŸã ãã‹ã€ã„ã£ãŸã‚“ãƒã‚°ã‚¢ã‚¦ãƒˆã—ã€å†åº¦ãƒã‚°ã‚¤ãƒ³ã—ã¦ã‹ã‚‰ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã‚’やり直ã—ã¦ã ã•ã„。 </message> <message name="too_many_uploads_tport"> - ã“ã®åœ°åŸŸã®è³‡ç”£ã‚ューãŒç¾åœ¨è¾¼ã¿åˆã£ã¦ã„ã‚‹ãŸã‚ã€ãƒ†ãƒ¬ãƒãƒ¼ãƒˆãƒ»ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’時間通りã«å‡¦ç†ã™ã‚‹ã“ã¨ãŒé›£ã—ã„状æ³ã§ã™ã€‚ + ã“ã®åœ°åŸŸã®è³‡ç”£ã‚ューãŒç¾åœ¨è¾¼ã¿åˆã£ã¦ã„ã‚‹ãŸã‚ã€è¦æ±‚ã•れãŸãƒ†ãƒ¬ãƒãƒ¼ãƒˆã‚’処ç†ã™ã‚‹ã“ã¨ãŒé›£ã—ã„状æ³ã§ã™ã€‚ 数分後ã«ã‚„り直ã™ã‹ã€ã¾ãŸã¯æ··é›‘ã—ã¦ã„ãªã„ä»–ã®åœ°åŸŸã‚’ãŠè©¦ã—ãã ã•ã„。 </message> <message name="expired_tport"> - 申ã—訳ã”ã–ã„ã¾ã›ã‚“。システムã¯ãƒ†ãƒ¬ãƒãƒ¼ãƒˆãƒ»ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’時間ã©ãŠã‚Šã«å®Œäº†ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚数分後ã«ã‚„り直ã—ã¦ãã ã•ã„。 + 申ã—訳ã”ã–ã„ã¾ã›ã‚“ãŒã€ã‚·ã‚¹ãƒ†ãƒ ã¯è¦æ±‚ã•れãŸãƒ†ãƒ¬ãƒãƒ¼ãƒˆã‚’完了ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚数分後ã«ã‚„り直ã—ã¦ãã ã•ã„。 </message> <message name="expired_region_handoff"> - 申ã—訳ã”ã–ã„ã¾ã›ã‚“。システムã¯åœ°åŸŸé–“ã®ç§»å‹•を時間ã©ãŠã‚Šã«å®Œäº†ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ + 申ã—訳ã”ã–ã„ã¾ã›ã‚“ãŒã€ã‚·ã‚¹ãƒ†ãƒ ã¯åœ°åŸŸé–“ã®ç§»å‹•を時間ã©ãŠã‚Šã«å®Œäº†ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ 数分後ã«ã‚„り直ã—ã¦ãã ã•ã„。 </message> <message name="no_host"> - テレãƒãƒ¼ãƒˆç›®çš„地を見ã¤ã‘られã¾ã›ã‚“。目的地ãŒä¸€æ™‚çš„ã«åˆ©ç”¨ã§ããªã„状態ã‹ã€ã¾ãŸã¯ã™ã§ã«æ¶ˆæ»…ã—ã¦ã„ã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚数分後ã«ã‚„り直ã—ã¦ãã ã•ã„。 + テレãƒãƒ¼ãƒˆã®ç›®çš„地を見ã¤ã‘られã¾ã›ã‚“。目的地ãŒä¸€æ™‚çš„ã«åˆ©ç”¨ã§ããªã„状態ã‹ã€ã¾ãŸã¯ã™ã§ã«æ¶ˆæ»…ã—ã¦ã„ã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚数分後ã«ã‚„り直ã—ã¦ãã ã•ã„。 </message> <message name="no_inventory_host"> æŒã¡ç‰©ã‚·ã‚¹ãƒ†ãƒ ã¯ç¾åœ¨åˆ©ç”¨ã§ãã¾ã›ã‚“。 @@ -49,19 +49,22 @@ 目的地ã«é€ä¿¡ã—ã¦ã„ã¾ã™ã€‚ </message> <message name="redirecting"> - 別ã®ç›®çš„地ã«å†æ¡ˆå†…ã—ã¦ã„ã¾ã™ã€‚ + 別ã®ç›®çš„地ã«ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã—ã¦ã„ã¾ã™ã€‚ </message> <message name="relaying"> 目的地ã«ä¸ç¶™ã—ã¦ã„ã¾ã™ã€‚ </message> <message name="sending_home"> - ホームä½ç½®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’é€ä¿¡ã—ã¦ã„ã¾ã™ã€‚ + ホームä½ç½®ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’é€ä¿¡ã—ã¦ã„ã¾ã™ã€‚ </message> <message name="sending_landmark"> - ランドマークä½ç½®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’é€ä¿¡ã—ã¦ã„ã¾ã™ã€‚ + ランドマークä½ç½®ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’é€ä¿¡ã—ã¦ã„ã¾ã™ã€‚ </message> <message name="completing"> - テレãƒãƒ¼ãƒˆã‚’完了ã—ã¦ã„ã¾ã™ã€‚ + テレãƒãƒ¼ãƒˆã‚’完了ã—ã¾ã™ã€‚ + </message> + <message name="completed_from"> + [T_SLURL] ã‹ã‚‰ã®ãƒ†ãƒ¬ãƒãƒ¼ãƒˆãŒå®Œäº†ã—ã¾ã—㟠</message> <message name="resolving"> 目的地を解決ã—ã¦ã„ã¾ã™ã€‚ diff --git a/indra/newview/skins/default/xui/nl/floater_about.xml b/indra/newview/skins/default/xui/nl/floater_about.xml index 10c30eb361..f71f935c24 100644 --- a/indra/newview/skins/default/xui/nl/floater_about.xml +++ b/indra/newview/skins/default/xui/nl/floater_about.xml @@ -1,20 +1,60 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="floater_about" title="OVER [CAPITALIZED_APP_NAME]"> -<tab_container name="about_tab"> - <panel name="credits_panel"> - <text_editor name="credits_editor"> - Second Life wordt u aangeboden door Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl and many others. + <floater.string name="AboutHeader"> + [APP_NAME] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2] ([VIEWER_VERSION_3]) [BUILD_DATE] [BUILD_TIME] ([CHANNEL]) +[[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]] + </floater.string> + <floater.string name="AboutCompiler"> + Gemaakt met [COMPILER] versie [COMPILER_VERSION] + </floater.string> + <floater.string name="AboutPosition"> + U bent op [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] in [REGION] gelegen op [HOSTNAME] ([HOSTIP]) +[SERVER_VERSION] +[[SERVER_RELEASE_NOTES_URL] [ReleaseNotes]] + </floater.string> + <floater.string name="AboutSystem"> + CPU: [CPU] +Geheugen: [MEMORY_MB] MB +OS Versie: [OS_VERSION] +Grafische Kaard Vendor: [GRAPHICS_CARD_VENDOR] +Grafische Kaard: [GRAPHICS_CARD] + </floater.string> + <floater.string name="AboutDriver"> + Windows Grafische Driver Versie: [GRAPHICS_DRIVER_VERSION] + </floater.string> + <floater.string name="AboutLibs"> + OpenGL Versie: [OPENGL_VERSION] + +libcurl Versie: [LIBCURL_VERSION] +J2C Decoder Versie: [J2C_VERSION] +Audio Driver Versie: [AUDIO_DRIVER_VERSION] +Qt Webkit Versie: [QT_WEBKIT_VERSION] +Vivox Versie: [VIVOX_VERSION] + </floater.string> + <floater.string name="none"> + (none) + </floater.string> + <floater.string name="AboutTraffic"> + Pakketten Verloren: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%) + </floater.string> + <tab_container name="about_tab"> + <panel label="Info" name="support_panel"> + <button label="Kopiëren naar Klembord" name="copy_btn"/> + </panel> + <panel label="Credits" name="credits_panel"> + <text_editor name="credits_editor"> + Second Life wordt u aangeboden door Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl and many others. Een 'Dank u' voor de volgende bewoners voor het helpen zorgdragen dat dit de beste versie tot nu toe is: able whitman, Adeon Writer, adonaira aabye, Aeron Kohime, Agathos Frascati, Aimee Trescothick, Aleric Inglewood, Alissa Sabre, Aminom Marvin, Angela Talamasca, Aralara Rajal, Armin Weatherwax, Ashrilyn Hayashida, Athanasius Skytower, Aura Dirval, Barney Boomslang, Biancaluce Robbiani, Biker Offcourse, Borg Capalini, Bulli Schumann, catherine pfeffer, Chalice Yao, Corre Porta, Court Goodman, Cummere Mayo, Dale Innis, Darien Caldwell, Darjeeling Schoonhoven, Daten Thielt, dimentox travanti, Dirk Talamasca, Drew Dwi, Duckless Vandyke, Elanthius Flagstaff, Electro Burnstein, emiley tomsen, Escort DeFarge, Eva Rau, Ezian Ecksol, Fire Centaur, Fluf Fredriksson, Francisco Koolhoven, Frontera Thor, Frungi Stastny, Gally Young, gearsawe stonecutter, Gigs Taggart, Gordon Wendt, Gudmund Shepherd, Gypsy Paz, Harleen Gretzky, Henri Beauchamp, Inma Rau, Irene Muni, Iskar Ariantho, Jacek Antonelli, JB Kraft, Jessicka Graves, Joeseph Albanese, Joshua Philgarlic, Khyota Wulluf, kirstenlee Cinquetti, Latif Khalifa, Lex Neva, Lilibeth Andree, Lisa Lowe, Lunita Savira, Loosey Demonia, lum pfohl, Marcos Fonzarelli, MartinRJ Fayray, Marusame Arai, Matthew Dowd, Maya Remblai, McCabe Maxsted, Meghan Dench, Melchoir Tokhes, Menos Short, Michelle2 Zenovka, Mimika Oh, Minerva Memel, Mm Alder, Ochi Wolfe, Omei Turnbull, Pesho Replacement, Phantom Ninetails, phoenixflames kukulcan, Polo Gufler, prez pessoa, princess niven, Prokofy Neva, Qie Niangao, Rem Beattie, RodneyLee Jessop, Saijanai Kuhn, Seg Baphomet, Sergen Davies, Shirley Marquez, SignpostMarv Martin, Sindy Tsure, Sira Arbizu, Skips Jigsaw, Sougent Harrop, Spritely Pixel, Squirrel Wood, StarSong Bright, Subversive Writer, Sugarcult Dagger, Sylumm Grigorovich, Tammy Nowotny, Tanooki Darkes, Tayra Dagostino, Theoretical Chemistry, Thickbrick Sleaford, valerie rosewood, Vex Streeter, Vixen Heron, Whoops Babii, Winter Ventura, Xiki Luik, Yann Dufaux, Yina Yao, Yukinoroh Kamachi, Zolute Infinity, Zwagoth Klaar To be a success in business, be daring, be first, be different. --Henry Marchant - </text_editor> - </panel> - <panel name="licenses_panel"> - <text_editor name="credits_editor"> -3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion + </text_editor> + </panel> + <panel label="Licenties" name="licenses_panel"> + <text_editor name="credits_editor"> + 3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion APR Copyright (C) 2000-2004 The Apache Software Foundation cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se) DBus/dbus-glib Copyright (C) 2002, 2003 CodeFactory AB / Copyright (C) 2003, 2004 @@ -35,10 +75,7 @@ google-perftools Copyright (c) 2005, Google Inc. All rights reserved. See licenses.txt for details. Voice chat Audio coding: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C) - </text_editor> - </panel> -</tab_container> - <string name="you_are_at"> - U bent op [POSITION] - </string> + </text_editor> + </panel> + </tab_container> </floater> diff --git a/indra/newview/skins/default/xui/nl/floater_about_land.xml b/indra/newview/skins/default/xui/nl/floater_about_land.xml index 3a77de70d2..7b8f1b42ab 100644 --- a/indra/newview/skins/default/xui/nl/floater_about_land.xml +++ b/indra/newview/skins/default/xui/nl/floater_about_land.xml @@ -26,14 +26,14 @@ <text name="OwnerText" left="102" width="242"> Leyla Linden </text> - <button label="Profiel..." label_selected="Profiel..." name="Profile..."/> + <button label="Profiel" name="Profile..."/> <text name="Group:"> Groep: </text> <text left="102" name="GroupText" width="242"/> - <button label="Instellen..." label_selected="Instellen..." name="Set..."/> + <button label="Instellen" name="Set..."/> <check_box label="Overdracht aan groep toestaan" name="check deed" tool_tip="Een groepofficier kan dit land aan de groep overdragen, zodat het ondersteund wordt door de landallocatie van de groep."/> - <button label="Overdragen..." label_selected="Overdragen..." name="Deed..." tool_tip="U mag alleen land overdragen indien u een officier bent in de geselecteerde groep."/> + <button label="Overdragen" name="Deed..." tool_tip="U mag alleen land overdragen indien u een officier bent in de geselecteerde groep."/> <check_box label="Eigenaar maakt bijdrage met overdracht" name="check contrib" tool_tip="Wanneer het land is overgedragen aan de groep, draagt de voormalig eigenaar voldoende landtoewijzing bij om het te ondersteunen."/> <text name="For Sale:"> Te koop: @@ -44,7 +44,7 @@ <text name="For Sale: Price L$[PRICE]."> Prijs: L$[PRICE] (L$[PRICE_PER_SQM]/m²). </text> - <button label="Verkoop land..." label_selected="Verkoop land..." name="Sell Land..."/> + <button label="Verkoop land" name="Sell Land..."/> <text name="For sale to"> Te koop voor: [BUYER] </text> @@ -74,11 +74,11 @@ 0 </text> <button left="130" width="125" label="Koop land..." label_selected="Koop land..." name="Buy Land..."/> - <button label="Koop voor groep..." label_selected="Koop voor groep..." name="Buy For Group..."/> + <button label="Koop voor groep" name="Buy For Group..."/> <button left="130" width="125" label="Koop toegangspas..." label_selected="Koop toegangspas..." name="Buy Pass..." tool_tip="Een toegangspas geeft u tijdelijk toegang tot dit land."/> - <button label="Land Afstaan..." label_selected="Land Afstaan..." name="Abandon Land..."/> - <button label="Land terugvorderen..." label_selected="Land terugvorderen..." name="Reclaim Land..."/> - <button label="Lindenverkoop..." label_selected="Lindenverkoop..." name="Linden Sale..." tool_tip="Land moet in bezit zijn, de inhoud moet ingesteld zijn en niet al ter veiling zijn aangeboden."/> + <button label="Land Afstaan" name="Abandon Land..."/> + <button label="Land terugvorderen" name="Reclaim Land..."/> + <button label="Lindenverkoop" name="Linden Sale..." tool_tip="Land moet in bezit zijn, de inhoud moet ingesteld zijn en niet al ter veiling zijn aangeboden."/> <panel.string name="new users only"> Alleen nieuwe gebruikers </panel.string> @@ -224,7 +224,7 @@ of opgedeeld. [COUNT] </text> <button label="Toon" label_selected="Toon" name="ShowOwner" right="-135" width="60"/> - <button label="Retourneren..." label_selected="Retourneren..." name="ReturnOwner..." tool_tip="Retourneer objecten naar hun eigenaren." right="-10" width="119"/> + <button label="Retourneren" name="ReturnOwner..." tool_tip="Retourneer objecten naar hun eigenaren." right="-10" width="119"/> <text name="Set to group:" left="14" width="180"> Groep toewijzen: </text> @@ -232,7 +232,7 @@ of opgedeeld. [COUNT] </text> <button label="Toon" label_selected="Toon" name="ShowGroup" right="-135" width="60"/> - <button label="Retourneren..." label_selected="Retourneren..." name="ReturnGroup..." tool_tip="Retourneer objecten naar hun eigenaren." right="-10" width="119"/> + <button label="Retourneren" name="ReturnGroup..." tool_tip="Retourneer objecten naar hun eigenaren." right="-10" width="119"/> <text name="Owned by others:" left="14" width="128"> Eigendom van anderen: </text> @@ -240,7 +240,7 @@ of opgedeeld. [COUNT] </text> <button label="Toon" label_selected="Toon" name="ShowOther" right="-135" width="60"/> - <button label="Retourneren..." label_selected="Retourneren..." name="ReturnOther..." tool_tip="Retourneer objecten naar hun eigenaren." right="-10" width="119"/> + <button label="Retourneren" name="ReturnOther..." tool_tip="Retourneer objecten naar hun eigenaren." right="-10" width="119"/> <text name="Selected / sat upon:" left="14" width="193"> Geselecteerd/Er op gezeten </text> @@ -256,7 +256,7 @@ of opgedeeld. Objecteigenaren: </text> <button label="Ververs lijst" label_selected="Ververs lijst" name="Refresh List" bottom="-213"/> - <button label="Retourneer objecten..." label_selected="Retourneer objecten..." name="Return objects..." width="164" bottom="-213"/> + <button label="Retourneer objecten" name="Return objects..." width="164" bottom="-213"/> <name_list name="owner list" height="104"> <column label="Type" name="type"/> <column label="Naam" name="name"/> @@ -407,7 +407,7 @@ of opgedeeld. <text name="at URL:"> Media URL: </text> - <button label="Instellen..." label_selected="Instellen..." name="set_media_url" width="66"/> + <button label="Instellen" name="set_media_url"/> <text name="Description:"> Omschrijving: </text> diff --git a/indra/newview/skins/default/xui/nl/floater_customize.xml b/indra/newview/skins/default/xui/nl/floater_customize.xml index 4de26347e1..e6a4ed7a27 100644 --- a/indra/newview/skins/default/xui/nl/floater_customize.xml +++ b/indra/newview/skins/default/xui/nl/floater_customize.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater customize" title="UITERLIJK" width="551"> - <tab_container name="customize tab container" tab_min_width="120" width="549"> +<floater name="floater customize" title="UITERLIJK"> + <tab_container name="customize tab container" tab_min_width="120"> <placeholder label="Lichaamsdelen" name="body_parts_placeholder"/> <panel label="Postuur" name="Shape" left="124" width="389"> <button label="Herstel" label_selected="Herstel" name="Revert"/> @@ -462,7 +462,7 @@ slepen. Ook kunt u zelf van begin af aan een nieuwe creëren en dragen. <button label="Herstel" label_selected="Herstel" name="Revert"/> </panel> </tab_container> - <scroll_container left="254" name="panel_container"/> + <scroll_container name="panel_container"/> <button label="Annuleren" label_selected="Annuleren" name="Cancel"/> <button label="OK" label_selected="OK" name="Ok"/> <button label="Maak kleding..." label_selected="Maak kleding..." name="Make Outfit" left="110"/> diff --git a/indra/newview/skins/default/xui/nl/floater_joystick.xml b/indra/newview/skins/default/xui/nl/floater_joystick.xml index 505e3cd719..1d590dc1f3 100644 --- a/indra/newview/skins/default/xui/nl/floater_joystick.xml +++ b/indra/newview/skins/default/xui/nl/floater_joystick.xml @@ -45,7 +45,7 @@ <text name="ZDeadZone"> Z dode zone </text> - <text name="PitchDeadZone" left="4" width="110"> + <text name="PitchDeadZone"> Stampen dode zone </text> <text name="YawDeadZone"> diff --git a/indra/newview/skins/default/xui/nl/floater_mute_object.xml b/indra/newview/skins/default/xui/nl/floater_mute_object.xml index 7a34be1bd7..edea63b42c 100644 --- a/indra/newview/skins/default/xui/nl/floater_mute_object.xml +++ b/indra/newview/skins/default/xui/nl/floater_mute_object.xml @@ -1,13 +1,14 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="mute by name" title="NEGEER OBJECT OP NAAM"> - <text name="message" bottom_delta="-40"> - Negeer op naam heeft alleen invloed op object chat -en IM, niet op geluiden. U dient de naam van het object -exact te typen. +<floater name="mute by name" title="BLOKKEER VOORWERP BIJ NAAM"> + <text bottom_delta="-40" name="message"> + Blokkeer een Voorwerp: </text> - <line_editor name="object_name" bottom_delta="-58"> + <line_editor bottom_delta="-58" name="object_name"> Object naam </line_editor> + <text name="note"> + * Blokkeerd alleen object tekst, niet de geluiden + </text> <button label="Ok" name="OK"/> <button label="Annuleren" name="Cancel"/> </floater> diff --git a/indra/newview/skins/default/xui/nl/floater_report_abuse.xml b/indra/newview/skins/default/xui/nl/floater_report_abuse.xml index 19b11ede0a..a50773c2b3 100644 --- a/indra/newview/skins/default/xui/nl/floater_report_abuse.xml +++ b/indra/newview/skins/default/xui/nl/floater_report_abuse.xml @@ -1,30 +1,33 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="floater_report_abuse" title="MISBRUIK RAPPORTEREN"> - <check_box label="Voeg schermafbeelding toe" name="screen_check"/> + <floater.string name="Screenshot"> + Schermafbeelding + </floater.string> + <check_box label="Gebruik deze schermafbeelding" name="screen_check"/> <text name="reporter_title" width="110"> Rapporteur: </text> - <text name="reporter_field" left_delta="70"> - Loremipsum Dolorsitamut + <text left_delta="70" name="reporter_field"> + Loremipsum Dolorsitamut Longnamez </text> <text name="sim_title"> Regio: </text> - <text name="sim_field" left_delta="70"> + <text left_delta="70" name="sim_field"> Regionaam </text> <text name="pos_title"> Positie: </text> - <text name="pos_field" left_delta="70"> + <text left_delta="70" name="pos_field"> {128.1, 128.1, 15.4} </text> <text name="select_object_label"> - Klik de knop, daarna het object: + Klik de knop, vervolgens het misbruik voorwerp: </text> <button label="" label_selected="" name="pick_btn" tool_tip="Objectkiezer - Identificeer een object als het onderwerp van dit rapport"/> <text name="object_name_label"> - Naam: + voorwerp: </text> <text name="object_name" width="120"> Consetetur Sadipscing @@ -33,54 +36,53 @@ Eigenaar: </text> <text name="owner_name"> - Hendrerit Vulputate + Hendrerit Vulputate Kamawashi Longname </text> <combo_box name="category_combo" tool_tip="Categorie -- selecteer de categorie die dit rapport het best beschrijft"> - <combo_box.item name="Select_category" label="Selecteer categorie"/> - <combo_box.item name="Age__Age_play" label="Leeftijd > Leeftijd spelen"/> - <combo_box.item name="Age__Adult_resident_on_Teen_Second_Life" label="Leeftijd > Volwassen inwoner in Teen Second Life"/> - <combo_box.item name="Age__Underage_resident_outside_of_Teen_Second_Life" label="Leeftijd > Minderjarige inwoner buiten Teen Second Life"/> - <combo_box.item name="Assault__Combat_sandbox___unsafe_area" label="Aanval > Gevechtszandbak / onveilig gebied"/> - <combo_box.item name="Assault__Safe_area" label="Aanval > Veilig gebied"/> - <combo_box.item name="Assault__Weapons_testing_sandbox" label="Aanval > Zandbak voor het testen van wapens"/> - <combo_box.item name="Commerce__Failure_to_deliver_product_or_service" label="Handel > Product of dienst is niet geleverd"/> - <combo_box.item name="Disclosure__Real_world_information" label="Openbaring > Echte wereld informatie"/> - <combo_box.item name="Disclosure__Remotely_monitoring chat" label="Openbaring > Op afstand chat afluisteren"/> - <combo_box.item name="Disclosure__Second_Life_information_chat_IMs" label="Openbaring > Second Life informatie/chat/IMs"/> - <combo_box.item name="Disturbing_the_peace__Unfair_use_of_region_resources" label="Vredebreuk > Oneerlijk gebruik van regiomiddelen"/> - <combo_box.item name="Disturbing_the_peace__Excessive_scripted_objects" label="Vredebreuk > Excessieve gescripte objecten"/> - <combo_box.item name="Disturbing_the_peace__Object_littering" label="Vredebreuk > Objecten laten rondslingeren"/> - <combo_box.item name="Disturbing_the_peace__Repetitive_spam" label="Vredebreuk > Herhaalde spam"/> - <combo_box.item name="Disturbing_the_peace__Unwanted_advert_spam" label="Vredebreuk > Ongewenste reclame-spam"/> - <combo_box.item name="Fraud__L$" label="Fraude > L$"/> - <combo_box.item name="Fraud__Land" label="Fraude > Land"/> - <combo_box.item name="Fraud__Pyramid_scheme_or_chain_letter" label="Fraude > Piramideschema of kettingbrief"/> - <combo_box.item name="Fraud__US$" label="Fraude > US$"/> - <combo_box.item name="Harassment__Advert_farms___visual_spam" label="Intimidatie > Reclameverzamelingen / visuele spam"/> - <combo_box.item name="Harassment__Defaming_individuals_or_groups" label="Intimidatie > Individuen of groepen in diskrediet brengen"/> - <combo_box.item name="Harassment__Impeding_movement" label="Intimidatie > Beweging verhinderen"/> - <combo_box.item name="Harassment__Sexual_harassment" label="Intimidatie > Seksuele intimidatie"/> - <combo_box.item name="Harassment__Solicting_inciting_others_to_violate_ToS" label="Intimidatie > Anderen uitnodigen/aanzetten tot het schenden van de ToS"/> - <combo_box.item name="Harassment__Verbal_abuse" label="Intimidatie > Verbaal misbruik"/> - <combo_box.item name="Indecency__Broadly_offensive_content_or_conduct" label="Onfatsoenlijkheid > Globaal beledigende inhoud of gedrag"/> - <combo_box.item name="Indecency__Inappropriate_avatar_name" label="Onfatsoenlijkheid > Ongepaste avatar naam"/> - <combo_box.item name="Indecency__Mature_content_in_PG_region" label="Onfatsoenlijkheid > Ongepaste inhoud of gedrag in een PG regio"/> - <combo_box.item name="Indecency__Inappropriate_content_in_Mature_region" label="Onfatsoenlijkheid > Ongepaste inhoud of gedrag in een Mature regio"/> - <combo_box.item name="Intellectual_property_infringement_Content_Removal" label="Inbreuk op intellectueel eigendom > Verwijderen van inhoud"/> - <combo_box.item name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit" label="Inbreuk op intellectueel eigendom > CopyBot of misbruik van permissies"/> - <combo_box.item name="Intolerance" label="Intolerantie"/> - <combo_box.item name="Land__Abuse_of_sandbox_resources" label="Land > Misbruik van zandbakmiddelen"/> - <combo_box.item name="Land__Encroachment__Objects_textures" label="Land > Indringing > Objecten/texturen"/> - <combo_box.item name="Land__Encroachment__Particles" label="Land > Indringing > Particles"/> - <combo_box.item name="Land__Encroachment__Trees_plants" label="Land > Indringing > Bomen/planten"/> - <combo_box.item name="Wagering_gambling" label="Weddenschappen/gokken"/> - <combo_box.item name="Other" label="Anders"/> + <combo_box.item label="Selecteer categorie" name="Select_category"/> + <combo_box.item label="Leeftijd > Leeftijd spelen" name="Age__Age_play"/> + <combo_box.item label="Leeftijd > Volwassen inwoner in Teen Second Life" name="Age__Adult_resident_on_Teen_Second_Life"/> + <combo_box.item label="Leeftijd > Minderjarige inwoner buiten Teen Second Life" name="Age__Underage_resident_outside_of_Teen_Second_Life"/> + <combo_box.item label="Aanval > Gevechtszandbak / onveilig gebied" name="Assault__Combat_sandbox___unsafe_area"/> + <combo_box.item label="Aanval > Veilig gebied" name="Assault__Safe_area"/> + <combo_box.item label="Aanval > Zandbak voor het testen van wapens" name="Assault__Weapons_testing_sandbox"/> + <combo_box.item label="Handel > Product of dienst is niet geleverd" name="Commerce__Failure_to_deliver_product_or_service"/> + <combo_box.item label="Openbaring > Echte wereld informatie" name="Disclosure__Real_world_information"/> + <combo_box.item label="Openbaring > Op afstand chat afluisteren" name="Disclosure__Remotely_monitoring chat"/> + <combo_box.item label="Openbaring > Second Life informatie/chat/IMs" name="Disclosure__Second_Life_information_chat_IMs"/> + <combo_box.item label="Vredebreuk > Oneerlijk gebruik van regiomiddelen" name="Disturbing_the_peace__Unfair_use_of_region_resources"/> + <combo_box.item label="Vredebreuk > Excessieve gescripte objecten" name="Disturbing_the_peace__Excessive_scripted_objects"/> + <combo_box.item label="Vredebreuk > Objecten laten rondslingeren" name="Disturbing_the_peace__Object_littering"/> + <combo_box.item label="Vredebreuk > Herhaalde spam" name="Disturbing_the_peace__Repetitive_spam"/> + <combo_box.item label="Vredebreuk > Ongewenste reclame-spam" name="Disturbing_the_peace__Unwanted_advert_spam"/> + <combo_box.item label="Fraude > L$" name="Fraud__L$"/> + <combo_box.item label="Fraude > Land" name="Fraud__Land"/> + <combo_box.item label="Fraude > Piramideschema of kettingbrief" name="Fraud__Pyramid_scheme_or_chain_letter"/> + <combo_box.item label="Fraude > US$" name="Fraud__US$"/> + <combo_box.item label="Intimidatie > Reclameverzamelingen / visuele spam" name="Harassment__Advert_farms___visual_spam"/> + <combo_box.item label="Intimidatie > Individuen of groepen in diskrediet brengen" name="Harassment__Defaming_individuals_or_groups"/> + <combo_box.item label="Intimidatie > Beweging verhinderen" name="Harassment__Impeding_movement"/> + <combo_box.item label="Intimidatie > Seksuele intimidatie" name="Harassment__Sexual_harassment"/> + <combo_box.item label="Intimidatie > Anderen uitnodigen/aanzetten tot het schenden van de ToS" name="Harassment__Solicting_inciting_others_to_violate_ToS"/> + <combo_box.item label="Intimidatie > Verbaal misbruik" name="Harassment__Verbal_abuse"/> + <combo_box.item label="Onfatsoenlijkheid > Globaal beledigende inhoud of gedrag" name="Indecency__Broadly_offensive_content_or_conduct"/> + <combo_box.item label="Onfatsoenlijkheid > Ongepaste avatar naam" name="Indecency__Inappropriate_avatar_name"/> + <combo_box.item label="Onfatsoenlijkheid > Ongepaste inhoud of gedrag in een PG regio" name="Indecency__Mature_content_in_PG_region"/> + <combo_box.item label="Onfatsoenlijkheid > Ongepaste inhoud of gedrag in een Mature regio" name="Indecency__Inappropriate_content_in_Mature_region"/> + <combo_box.item label="Inbreuk op intellectueel eigendom > Verwijderen van inhoud" name="Intellectual_property_infringement_Content_Removal"/> + <combo_box.item label="Inbreuk op intellectueel eigendom > CopyBot of misbruik van permissies" name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit"/> + <combo_box.item label="Intolerantie" name="Intolerance"/> + <combo_box.item label="Land > Misbruik van zandbakmiddelen" name="Land__Abuse_of_sandbox_resources"/> + <combo_box.item label="Land > Indringing > Objecten/texturen" name="Land__Encroachment__Objects_textures"/> + <combo_box.item label="Land > Indringing > Particles" name="Land__Encroachment__Particles"/> + <combo_box.item label="Land > Indringing > Bomen/planten" name="Land__Encroachment__Trees_plants"/> + <combo_box.item label="Weddenschappen/gokken" name="Wagering_gambling"/> + <combo_box.item label="Anders" name="Other"/> </combo_box> <text name="abuser_name_title"> Misbruikernaam: </text> <button label="Kies inwoner" label_selected="" name="select_abuser" tool_tip="Selecteer de naam van de misbruiker uit een lijst"/> - <check_box label="Naam van misbruiker onbekend" name="omit_abuser_name" tool_tip="Vink dit aan wanneer u niet in staat bent de naam van de misbruiker te geven"/> <text name="abuser_name_title2"> Locatie van misbruik: </text> @@ -91,13 +93,11 @@ Details: </text> <text name="bug_aviso"> - Wees alstublieft zo specifiek mogelijk m.b.t. datum, locatie, -aard van het misbruik, relevante chat/IM tekst, en selecteer -het object indien mogelijk. + Wees zo specifiek mogelijk </text> <text name="incomplete_title"> - Let op: onvolledige rapporten zullen niet worden onderzocht. + Let Op: Onvolledige verslagen zullen niet worden onderzocht </text> - <button label="Annuleren" label_selected="Annuleren" name="cancel_btn"/> <button label="Misbruik rapporteren" label_selected="Misbruik rapporteren" name="send_btn"/> + <button label="Annuleren" label_selected="Annuleren" name="cancel_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/nl/floater_stats.xml b/indra/newview/skins/default/xui/nl/floater_stats.xml new file mode 100644 index 0000000000..0db3f76735 --- /dev/null +++ b/indra/newview/skins/default/xui/nl/floater_stats.xml @@ -0,0 +1,71 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Statistics" title="STATISTIEKEN"> + <scroll_container name="statistics_scroll"> + <container_view name="statistics_view"> + <stat_view label="Basis" name="basic"> + <stat_bar label="FPS" name="fps"/> + <stat_bar label="Bandbreedte" name="bandwidth"/> + <stat_bar label="Pakket Verlies" name="packet_loss"/> + <stat_bar label="Ping Sim" name="ping"/> + </stat_view> + <stat_view label="Geavanceerd" name="advanced"> + <stat_view label="Weergeven" name="render"> + <stat_bar label="KTris Tekenen" name="ktrisframe"/> + <stat_bar label="KTris Tekenen" name="ktrissec"/> + <stat_bar label="Totaal Voorwerpen" name="objs"/> + <stat_bar label="Nieuwe Voorwerpen" name="newobjs"/> + </stat_view> + <stat_view label="Textuur" name="texture"> + <stat_bar label="Count" name="numimagesstat"/> + <stat_bar label="Raw Count" name="numrawimagesstat"/> + <stat_bar label="GL Mem" name="gltexmemstat"/> + <stat_bar label="Formatted Mem" name="formattedmemstat"/> + <stat_bar label="Raw Mem" name="rawmemstat"/> + <stat_bar label="Bound Mem" name="glboundmemstat"/> + </stat_view> + <stat_view label="Netwerk" name="network"> + <stat_bar label="Pakketten In" name="packetsinstat"/> + <stat_bar label="Pakketten Uit" name="packetsoutstat"/> + <stat_bar label="Voorwerpen" name="objectkbitstat"/> + <stat_bar label="Textuur" name="texturekbitstat"/> + <stat_bar label="Bezit" name="assetkbitstat"/> + <stat_bar label="Lagen" name="layerskbitstat"/> + <stat_bar label="Daadwerkelijk In" name="actualinkbitstat"/> + <stat_bar label="Daadwerkelijk Out" name="actualoutkbitstat"/> + <stat_bar label="VFS Pending Ops" name="vfspendingoperations"/> + </stat_view> + </stat_view> + <stat_view label="Simulator" name="sim"> + <stat_bar label="Tijd Dilatatie" name="simtimedilation"/> + <stat_bar label="Sim FPS" name="simfps"/> + <stat_bar label="Physics FPS" name="simphysicsfps"/> + <stat_view label="Physics Details" name="physicsdetail"> + <stat_bar label="Pinned Objects" name="physicspinnedtasks"/> + <stat_bar label="Low LOD Objects" name="physicslodtasks"/> + <stat_bar label="Memory Allocated" name="physicsmemoryallocated"/> + <stat_bar label="Agent Updates/Sec" name="simagentups"/> + <stat_bar label="Main Agents" name="simmainagents"/> + <stat_bar label="Child Agents" name="simchildagents"/> + <stat_bar label="Voorwerpen" name="simobjects"/> + <stat_bar label="Actieve Voorwerpen" name="simactiveobjects"/> + <stat_bar label="Actieve Scripts" name="simactivescripts"/> + <stat_bar label="Actieve Evenementen" name="simscripteps"/> + <stat_bar label="Pakketten In" name="siminpps"/> + <stat_bar label="Pakketten Uit" name="simoutpps"/> + <stat_bar label="Wachtende Downloads" name="simpendingdownloads"/> + <stat_bar label="Wachtende Uploads" name="simpendinguploads"/> + <stat_bar label="Total Unacked Bytes" name="simtotalunackedbytes"/> + </stat_view> + <stat_view label="Tijd (ms)" name="simperf"> + <stat_bar label="Totale Frame Tijd" name="simframemsec"/> + <stat_bar label="Net Time" name="simnetmsec"/> + <stat_bar label="Physics Time" name="simsimphysicsmsec"/> + <stat_bar label="Simulatie Tijd" name="simsimothermsec"/> + <stat_bar label="Agent Tijd" name="simagentmsec"/> + <stat_bar label="Plaatjes Tijd" name="simimagesmsec"/> + <stat_bar label="Script Tijd" name="simscriptmsec"/> + </stat_view> + </stat_view> + </container_view> + </scroll_container> +</floater> diff --git a/indra/newview/skins/default/xui/nl/floater_tools.xml b/indra/newview/skins/default/xui/nl/floater_tools.xml index f79d3dbd6b..212cac0a5b 100644 --- a/indra/newview/skins/default/xui/nl/floater_tools.xml +++ b/indra/newview/skins/default/xui/nl/floater_tools.xml @@ -33,7 +33,10 @@ <combo_box.item name="Reference" label="Referentie" /> </combo_box> - <check_box left="136" label="Beide zijden uitrekken" name="checkbox uniform"/> + <check_box left="136" name="checkbox uniform"/> + <text name="checkbox uniform label"> + Beide zijden uitrekken + </text> <check_box left="136" label="Texturen uitrekken" name="checkbox stretch textures"/> <check_box left="136" label="Gebruik grid" name="checkbox snap to grid"/> <button label="Opties..." label_selected="Opties..." name="Options..." height="18" bottom_delta="-15"/> @@ -403,7 +406,7 @@ <text name="glow label"> Gloed </text> - <check_box label="Volledige helderheid" name="checkbox fullbright" bottom_delta="-21"/> + <check_box label="Volledige helderheid" name="checkbox fullbright"/> <text name="tex gen"> Mapping </text> diff --git a/indra/newview/skins/default/xui/nl/language_settings.xml b/indra/newview/skins/default/xui/nl/language_settings.xml index 71418d446a..dc4663705f 100644 --- a/indra/newview/skins/default/xui/nl/language_settings.xml +++ b/indra/newview/skins/default/xui/nl/language_settings.xml @@ -3,9 +3,9 @@ <strings> <!-- Locale Information --> - <string name="MicrosoftLocale">english</string> - <string name="DarwinLocale">C</string> - <string name="LinuxLocale">C</string> + <string name="MicrosoftLocale">dutch</string> + <string name="DarwinLocale">nl_NL.UTF-8</string> + <string name="LinuxLocale">nl_NL.UTF-8</string> <!-- datetimeToCodes["wkday"] = "%a"; // Thu diff --git a/indra/newview/skins/default/xui/nl/menu_inventory.xml b/indra/newview/skins/default/xui/nl/menu_inventory.xml index 6a514422b9..c3b47cbddb 100644 --- a/indra/newview/skins/default/xui/nl/menu_inventory.xml +++ b/indra/newview/skins/default/xui/nl/menu_inventory.xml @@ -12,7 +12,7 @@ <menu_item_call label="Nieuw script" name="New Script"/> <menu_item_call label="Nieuwe notitie" name="New Note"/> <menu_item_call label="Nieuw gebaar" name="New Gesture"/> - <menu name="New Clothes" label="Nieuwe Kleding"> + <menu label="Nieuwe Kleding" name="New Clothes"> <menu_item_call label="Nieuw shirt" name="New Shirt"/> <menu_item_call label="Nieuwe broek" name="New Pants"/> <menu_item_call label="Nieuwe schoenen" name="New Shoes"/> @@ -22,31 +22,47 @@ <menu_item_call label="Nieuwe handschoenen" name="New Gloves"/> <menu_item_call label="Nieuw onderhemd" name="New Undershirt"/> <menu_item_call label="Nieuwe onderbroek" name="New Underpants"/> + <menu_item_call label="Nieuw Alpha Masker" name="New Alpha Mask"/> + <menu_item_call label="Nieuwe Tattoo" name="New Tattoo"/> </menu> - <menu name="New Body Parts" label="Nieuwe Lichaamsdelen"> + <menu label="Nieuwe Lichaamsdelen" name="New Body Parts"> <menu_item_call label="Nieuwe postuur" name="New Shape"/> <menu_item_call label="Nieuwe huid" name="New Skin"/> <menu_item_call label="Nieuw haar" name="New Hair"/> <menu_item_call label="Nieuwe ogen" name="New Eyes"/> </menu> + <menu label="Change Type" name="Change Type"> + <menu_item_call label="Standaard" name="Default"/> + <menu_item_call label="Handschoenen" name="Gloves"/> + <menu_item_call label="Jas" name="Jacket"/> + <menu_item_call label="Broek" name="Pants"/> + <menu_item_call label="Vorm" name="Shape"/> + <menu_item_call label="Schoenen" name="Shoes"/> + <menu_item_call label="Overhemd" name="Shirt"/> + <menu_item_call label="Rok" name="Skirt"/> + <menu_item_call label="Onderbroek" name="Underpants"/> + <menu_item_call label="Onderhemd" name="Undershirt"/> + </menu> <menu_item_call label="Teleport" name="Landmark Open"/> <menu_item_call label="Open" name="Animation Open"/> <menu_item_call label="Open" name="Sound Open"/> <menu_item_call label="Verwijderen item" name="Purge Item"/> <menu_item_call label="Herstellen item" name="Restore Item"/> + <menu_item_call label="Ga Naar Link" name="Goto Link"/> <menu_item_call label="Open" name="Open"/> <menu_item_call label="Eigenschappen" name="Properties"/> <menu_item_call label="Hernoemen" name="Rename"/> <menu_item_call label="Kopieer asset UUID" name="Copy Asset UUID"/> <menu_item_call label="Kopiëren" name="Copy"/> <menu_item_call label="Plakken" name="Paste"/> + <menu_item_call label="Plak Als Link" name="Paste As Link"/> <menu_item_call label="Verwijderen" name="Delete"/> <menu_item_call label="Items uitdoen" name="Take Off Items"/> <menu_item_call label="Voeg toe aan kleding" name="Add To Outfit"/> <menu_item_call label="Vervang kleding" name="Replace Outfit"/> <menu_item_call label="Start conferentie chat" name="Conference Chat Folder"/> <menu_item_call label="Afspelen" name="Sound Play"/> - <menu_item_call label="Over landmarkering" name="Teleport To Landmark"/> + <menu_item_call label="Over Landmark" name="About Landmark"/> <menu_item_call label="In wereld afspelen" name="Animation Play"/> <menu_item_call label="Lokaal afspelen" name="Animation Audition"/> <menu_item_call label="Stuur instant message" name="Send Instant Message"/> @@ -54,8 +70,8 @@ <menu_item_call label="Start conferentie chat" name="Conference Chat"/> <menu_item_call label="Activeren" name="Activate"/> <menu_item_call label="Deactiveren" name="Deactivate"/> + <menu_item_call label="Opslaan Als" name="Save As"/> <menu_item_call label="Losmaken van jezelf" name="Detach From Yourself"/> - <menu_item_call label="Herstellen naar laatste positie" name="Restore to Last Position"/> <menu_item_call label="Dragen" name="Object Wear"/> <menu label="Bevestigen aan" name="Attach To"/> <menu label="Bevestigen aan HUD" name="Attach To HUD"/> diff --git a/indra/newview/skins/default/xui/nl/menu_inventory_add.xml b/indra/newview/skins/default/xui/nl/menu_inventory_add.xml new file mode 100644 index 0000000000..09330b9597 --- /dev/null +++ b/indra/newview/skins/default/xui/nl/menu_inventory_add.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_inventory_add"> + <menu label="Upload" name="upload"> + <menu_item_call label="Plaatje (L$[COST])..." name="Upload Image"/> + <menu_item_call label="Geluid (L$[COST])..." name="Upload Sound"/> + <menu_item_call label="Animatie (L$[COST])..." name="Upload Animation"/> + <menu_item_call label="Bulk (L$[COST] per bestand)..." name="Bulk Upload"/> + </menu> + <menu_item_call label="Nieuwe Map" name="New Folder"/> + <menu_item_call label="Nieuw Script" name="New Script"/> + <menu_item_call label="Nieuw Notitie" name="New Note"/> + <menu_item_call label="Nieuw Gebaar" name="New Gesture"/> + <menu label="Nieuwe Kleding" name="New Clothes"> + <menu_item_call label="Nieuw Overhemd" name="New Shirt"/> + <menu_item_call label="Nieuwe Broek" name="New Pants"/> + <menu_item_call label="Nieuwe Schoenen" name="New Shoes"/> + <menu_item_call label="Nieuwe Sokken" name="New Socks"/> + <menu_item_call label="Nieuw Jas" name="New Jacket"/> + <menu_item_call label="Nieuw Rok" name="New Skirt"/> + <menu_item_call label="Nieuwe Handschoenen" name="New Gloves"/> + <menu_item_call label="Nieuw Hemd" name="New Undershirt"/> + <menu_item_call label="Nieuwe Onderbroek" name="New Underpants"/> + <menu_item_call label="Nieuwe Alpha" name="New Alpha"/> + <menu_item_call label="Nieuwe Tattoo" name="New Tattoo"/> + </menu> + <menu label="Nieuwe Lichaamsdelen" name="New Body Parts"> + <menu_item_call label="Nieuwe Vorm" name="New Shape"/> + <menu_item_call label="Nieuwe Huid" name="New Skin"/> + <menu_item_call label="Nieuw Haar" name="New Hair"/> + <menu_item_call label="Nieuwe Ogen" name="New Eyes"/> + </menu> +</menu> diff --git a/indra/newview/skins/default/xui/nl/menu_mini_map.xml b/indra/newview/skins/default/xui/nl/menu_mini_map.xml index 0a6dfa3465..f7c09660ea 100644 --- a/indra/newview/skins/default/xui/nl/menu_mini_map.xml +++ b/indra/newview/skins/default/xui/nl/menu_mini_map.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="popup"> +<menu name="Popup"> <menu_item_call label="Zoom dichtbij" name="Zoom Close"/> <menu_item_call label="Zoom gemiddeld" name="Zoom Medium"/> <menu_item_call label="Zoom veraf" name="Zoom Far"/> diff --git a/indra/newview/skins/default/xui/nl/menu_picks.xml b/indra/newview/skins/default/xui/nl/menu_picks.xml new file mode 100644 index 0000000000..2e53dbda58 --- /dev/null +++ b/indra/newview/skins/default/xui/nl/menu_picks.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Picks"> + <menu_item_call label="Info" name="pick_info"/> + <menu_item_call label="Bewerken" name="pick_edit"/> + <menu_item_call label="Teleport" name="pick_teleport"/> + <menu_item_call label="Kaart" name="pick_map"/> + <menu_item_call label="Verweideren" name="pick_delete"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/nl/panel_group_roles.xml b/indra/newview/skins/default/xui/nl/panel_group_roles.xml index ffaaa8137a..507906c0d7 100644 --- a/indra/newview/skins/default/xui/nl/panel_group_roles.xml +++ b/indra/newview/skins/default/xui/nl/panel_group_roles.xml @@ -1,92 +1,50 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Leden & Rollen" name="roles_tab"> - <string name="default_needs_apply_text"> - Er zijn niet toegepaste wijzigingen op de huidige sub-tab. - </string> - <string name="want_apply_text"> - Wilt u deze wijzigingen toepassen? - </string> - <button label="?" name="help_button"/> - <panel name="members_header"> - <text name="static"> - Leden & Rollen - </text> - <text name="static2"> - Groepsleden krijgen Rollen met Mogelijkheden toegekend. Deze instellingen -kunnen eenvoudig aangepast worden, zodat meer organisatie en flexibiliteit -mogelijk is. - </text> - </panel> - <panel name="roles_header"> - <text name="static"> - Rollen - </text> - <text name="role_properties_modifiable"> - Selecteer een Rol hieronder. U kunt zijn Naam, Omschrijving en -Lid Titel wijzigen. - </text> - <text name="role_properties_not_modifiable"> - Selecteer een Rol hieronder om zijn eigenschappen, Leden en -toegestane Mogelijkheden te bekijken. - </text> - <text bottom_delta="-28" name="role_actions_modifiable"> - U kunt ook Mogelijkheden aan de Rol toekennen. - </text> - <text name="role_actions_not_modifiable"> - U kunt de toegekende Mogelijkheden bekijken, maar niet wijzigen. - </text> - </panel> - <panel name="actions_header"> - <text name="static"> - Mogelijkheden - </text> - <text name="static2"> - U kunt de Omschrijving van een Mogelijkheid bekijken en welke Rollen en -Leden de Mogelijkheid kunnen uitvoeren. - </text> - </panel> + <panel.string name="default_needs_apply_text"> + Er zijn niet opgeslagen veranderingen op de huidige tab + </panel.string> + <panel.string name="want_apply_text"> + Wilt u deze wijzigingen opslaan? + </panel.string> <tab_container height="164" name="roles_tab_container"> - <panel height="148" label="Leden" name="members_sub_tab" tool_tip="Leden"> - <line_editor bottom="127" name="search_text"/> - <button label="Zoeken" name="search_button"/> - <button label="Alles Tonen" name="show_all_button"/> - <name_list bottom_delta="-105" height="104" name="member_list"> - <column label="Lid Naam" name="name"/> - <column label="Gedoneerde Tier" name="donated"/> - <column label="Laatste Login" name="online"/> - </name_list> - <button label="Nieuw Lid Uitnodigen..." name="member_invite"/> - <button label="Uitwerpen uit de Groep" name="member_eject"/> - <string name="help_text"> + <panel height="148" label="LEDEN" name="members_sub_tab" tool_tip="Leden"> + <panel.string name="help_text"> U kunt Rollen aan Leden toewijzen of van Leden afnemen. Selecteer meerdere Leden door de Ctrl toets ingedrukt te houden en op hun namen te klikken. - </string> + </panel.string> + <filter_editor label="Filter Leden" name="filter_input"/> + <name_list bottom_delta="-105" height="104" name="member_list"> + <name_list.columns label="Lid Naam" name="name"/> + <name_list.columns label="Donaties" name="donated"/> + <name_list.columns label="Laatste Login" name="online"/> + </name_list> + <button label="Uitnodigen" name="member_invite"/> + <button label="Uitwerpen" name="member_eject"/> </panel> - <panel height="148" label="Rollen" name="roles_sub_tab"> - <line_editor bottom="127" name="search_text"/> - <button label="Zoeken" name="search_button"/> - <button label="Alles Tonen" name="show_all_button"/> + <panel height="148" label="ROLLEN" name="roles_sub_tab"> + <panel.string name="help_text"> + Rollen hebben een titel en een toegestane lijst met Vaardigheden die Leden kunnen uitvoeren. Leden kunnen tot 1 of meer Rollen behoren. Een groep kan tot 10 Rollen bevatten, inclusief de Iedereen en Eigenaren Rollen. + </panel.string> + <panel.string name="cant_delete_role"> + De 'Iedereen' en 'Eigenaren' Rollen zijn speciaal en kunnen niet verwijderd worden. + </panel.string> + <panel.string name="power_folder_icon"> + Inv_FolderClosed + </panel.string> + <filter_editor label="Filter Rollen" name="filter_input"/> <scroll_list bottom_delta="-104" height="104" name="role_list"> - <column label="Rol Naam" name="name"/> - <column label="Titel" name="title"/> - <column label="Leden" name="members"/> + <scroll_list.columns label="Rol" name="name"/> + <scroll_list.columns label="Titel" name="title"/> + <scroll_list.columns label="Leden" name="members"/> </scroll_list> - <button label="Nieuwe Rol Maken..." name="role_create"/> + <button label="Nieuwe Rol..." name="role_create"/> <button label="Rol Verwijderen" name="role_delete"/> - <string name="help_text"> - Rollen hebben een titel en een toegestane lijst met Mogelijkheden die Leden kunnen uitvoeren. Leden kunnen tot 1 of meer Rollen behoren. Een groep kan tot 10 Rollen bevatten, inclusief de Iedereen en Eigenaren Rollen. - </string> - <string name="cant_delete_role"> - De 'Iedereen' en 'Eigenaren' Rollen zijn speciaal en kunnen niet verwijderd worden. - </string> </panel> - <panel height="148" label="Mogelijkheden" name="actions_sub_tab"> - <line_editor bottom="127" name="search_text"/> - <button label="Zoeken" name="search_button"/> - <button label="Alles Tonen" name="show_all_button"/> - <scroll_list bottom_delta="-120" height="118" name="action_list" tool_tip="Selecteer een Mogelijkheid om meer details te bekijken."/> - <string name="help_text"> + <panel height="148" label="VAARDIGHEDEN" name="actions_sub_tab" tool_tip="Je kan een vaardigheid's beschrijving en welke Rollen en Leden kunnen uitvoeren van de Vaardigheid."> + <panel.string name="help_text"> Mogelijkheden stellen leden in staat om specifieke dingen in een groep te doen. Er is een brede variëteit aan Mogelijkheden. - </string> + </panel.string> + <filter_editor label="Filter Vaardigheden" name="filter_input"/> + <scroll_list bottom_delta="-120" height="118" name="action_list" tool_tip="Selecteer een Vaardigheid om meer details te bekijken"/> </panel> </tab_container> <panel name="members_footer"> @@ -96,15 +54,12 @@ Leden de Mogelijkheid kunnen uitvoeren. <text name="static2"> Toegestane Mogelijkheden </text> - <scroll_list name="member_allowed_actions" tool_tip="Kijk voor details van elke Toegestane Mogelijkheid in de Mogelijkheden tab."/> + <scroll_list name="member_allowed_actions" tool_tip="Voor details van elke Toegestane Vaardigheid in de Mogelijkheden tab"/> </panel> <panel name="roles_footer"> <text name="static"> Naam </text> - <text name="static2"> - Omschrijving - </text> <line_editor name="role_name"> Werknemers </line_editor> @@ -114,30 +69,33 @@ Leden de Mogelijkheid kunnen uitvoeren. <line_editor name="role_title"> (wachten) </line_editor> + <text name="static2"> + Omschrijving + </text> <text_editor name="role_description"> (wachten) </text_editor> <text name="static4"> - Toegewezen Leden + Toegewezen Rollen </text> + <check_box label="Leden Onthullen" name="role_visible_in_list" tool_tip="Bepaalt of leden van deze rol zichtbaar zijn in de Algemeen tab voor mensen buiten de groep."/> <text name="static5" tool_tip="Een lijst met Mogelijkheden die de geselecteerd rol kan uitvoeren."> Toegestane Mogelijkheden </text> - <check_box label="Leden zijn zichtbaar" name="role_visible_in_list" tool_tip="Bepaalt of leden van deze rol zichtbaar zijn in de Algemeen tab voor mensen buiten de groep."/> - <scroll_list name="role_allowed_actions" tool_tip="Kijk voor details van elke Toegestane Mogelijkheid in de Mogelijkheden tab."/> + <scroll_list name="role_allowed_actions" tool_tip="For details of each allowed ability see the abilities tab"/> </panel> <panel name="actions_footer"> <text name="static"> - Omschrijving + Vaardigheid omschrijving </text> <text_editor name="action_description"> Dit is de Mogelijkheid 'Werp Leden uit deze Groep'. Alleen een Eigenaar kan een andere Eigenaar uitwerpen. </text_editor> <text name="static2"> - Rollen met Mogelijkheid + Rollen met deze vaardigheid </text> <text name="static3"> - Leden met Mogelijkheid + Leden met deze vaardigheid </text> </panel> </panel> diff --git a/indra/newview/skins/default/xui/nl/panel_login.xml b/indra/newview/skins/default/xui/nl/panel_login.xml index 235e15e7fb..bcc888061f 100644 --- a/indra/newview/skins/default/xui/nl/panel_login.xml +++ b/indra/newview/skins/default/xui/nl/panel_login.xml @@ -6,34 +6,36 @@ <panel.string name="forgot_password_url"> http://secondlife.com/account/request.php?lang=nl-NL </panel.string> -<panel name="login_widgets"> - <text name="first_name_text"> - Voornaam: - </text> - <text name="last_name_text"> - Achternaam: - </text> - <text name="password_text"> - Wachtwoord: - </text> - <text name="start_location_text"> - Startlocatie: - </text> - <combo_box name="start_location_combo"> - <combo_box.item name="MyHome" label="Mijn Thuis"/> - <combo_box.item name="MyLastLocation" label="Mijn Laatste Locatie"/> - <combo_box.item name="Typeregionname" label="< Type regio naam >"/> - </combo_box> - <check_box label="Onthoud wachtwoord" name="remember_check"/> - <button label="Inloggen" label_selected="Inloggen" name="connect_btn"/> - <text name="create_new_account_text"> - Nieuw account maken - </text> - <text name="forgot_password_text"> - Naam of wachtwoord vergeten? - </text> - <text name="channel_text"> - [VERSION] - </text> -</panel> + <panel name="login_widgets"> + <text name="first_name_text"> + Voornaam: + </text> + <line_editor name="first_name_edit" tool_tip="[SECOND_LIFE] Voornaam"/> + <text name="last_name_text"> + Achternaam: + </text> + <line_editor name="last_name_edit" tool_tip="[SECOND_LIFE] Achternaam"/> + <text name="password_text"> + Paswoord: + </text> + <button label="Inloggen" label_selected="Inloggen" name="connect_btn"/> + <text name="start_location_text"> + Start locatie: + </text> + <combo_box name="start_location_combo"> + <combo_box.item label="Mijn Laatste Locatie" name="MyLastLocation"/> + <combo_box.item label="Mijn Thuis" name="MyHome"/> + <combo_box.item label="<Tik regio naam>" name="Typeregionname"/> + </combo_box> + <check_box label="Onthoud paswoord" name="remember_check"/> + <text name="create_new_account_text"> + Maak een nieuwe account + </text> + <text name="forgot_password_text"> + Naam of paswoord vergeten? + </text> + <text name="channel_text"> + [VERSION] + </text> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/nl/panel_main_inventory.xml b/indra/newview/skins/default/xui/nl/panel_main_inventory.xml new file mode 100644 index 0000000000..c533cc20c0 --- /dev/null +++ b/indra/newview/skins/default/xui/nl/panel_main_inventory.xml @@ -0,0 +1,64 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Dingen" name="main inventory panel"> + <panel.string name="Title"> + Dingen + </panel.string> + <filter_editor label="Filter" name="inventory search editor"/> + <tab_container name="inventory filter tabs"> + <inventory_panel label="Alle Voorwerpen" name="All Items"/> + <inventory_panel label="Recente Voorwerpen" name="Recent Items"/> + </tab_container> + <panel name="bottom_panel"> + <button name="options_gear_btn" tool_tip="Toon extra opties"/> + <button name="add_btn" tool_tip="Voeg nieuw voorwerp toe"/> + <dnd_button name="trash_btn" tool_tip="Remove selected item"/> + </panel> + <menu_bar name="Inventory Menu"> + <menu label="Bestand" name="File"> + <menu_item_call label="Open" name="Open"/> + <menu label="Upload" name="upload"> + <menu_item_call label="Plaatje (L$[COST])..." name="Upload Image"/> + <menu_item_call label="Geluid (L$[COST])..." name="Upload Sound"/> + <menu_item_call label="Animatie (L$[COST])..." name="Upload Animation"/> + <menu_item_call label="Bulk (L$[COST] per bestand)..." name="Bulk Upload"/> + </menu> + <menu_item_call label="Nieuw Venster" name="New Window"/> + <menu_item_call label="Toon Filters" name="Show Filters"/> + <menu_item_call label="Reset Filters" name="Reset Current"/> + <menu_item_call label="Sluit Alle Mappen" name="Close All Folders"/> + <menu_item_call label="Prullenbak Leegmaken" name="Empty Trash"/> + <menu_item_call label="Leeg Verloren En Gevonden" name="Empty Lost And Found"/> + </menu> + <menu label="Maken" name="Create"> + <menu_item_call label="Nieuwe Map" name="New Folder"/> + <menu_item_call label="Nieuw Script" name="New Script"/> + <menu_item_call label="Nieuwe Notitie" name="New Note"/> + <menu_item_call label="Nieuw Gebaar" name="New Gesture"/> + <menu label="Nieuwe Kleding" name="New Clothes"> + <menu_item_call label="Nieuw Overhemd" name="New Shirt"/> + <menu_item_call label="Nieuwe Broek" name="New Pants"/> + <menu_item_call label="Nieuwe Schoenen" name="New Shoes"/> + <menu_item_call label="Nieuwe Sokken" name="New Socks"/> + <menu_item_call label="Nieuwe Jas" name="New Jacket"/> + <menu_item_call label="Nieuwe Rok" name="New Skirt"/> + <menu_item_call label="Nieuwe Handschoenen" name="New Gloves"/> + <menu_item_call label="Nieuw Hemd" name="New Undershirt"/> + <menu_item_call label="Nieuwe Onderbroek" name="New Underpants"/> + <menu_item_call label="Nieuwe Alpha" name="New Alpha"/> + <menu_item_call label="Nieuwe Tattoo" name="New Tattoo"/> + </menu> + <menu label="Nieuwe Lichaamsdelen" name="New Body Parts"> + <menu_item_call label="Nieuwe Vorm" name="New Shape"/> + <menu_item_call label="Nieuwe Huid" name="New Skin"/> + <menu_item_call label="Nieuw Haar" name="New Hair"/> + <menu_item_call label="Nieuwe Ogen" name="New Eyes"/> + </menu> + </menu> + <menu label="Sorteer" name="Sort"> + <menu_item_check label="Bij Naam" name="By Name"/> + <menu_item_check label="Bij Datum" name="By Date"/> + <menu_item_check label="Mappen Altijd Op Naam" name="Folders Always By Name"/> + <menu_item_check label="Syteemmappen Naar Boven" name="System Folders To Top"/> + </menu> + </menu_bar> +</panel> diff --git a/indra/newview/skins/default/xui/nl/panel_region_estate.xml b/indra/newview/skins/default/xui/nl/panel_region_estate.xml index 7a5fa801d9..08b68c8d30 100644 --- a/indra/newview/skins/default/xui/nl/panel_region_estate.xml +++ b/indra/newview/skins/default/xui/nl/panel_region_estate.xml @@ -26,7 +26,7 @@ zullen alle regio's in de estate beïnvloeden. <text name="Only Allow"> Beperk toegang tot: </text> - <check_box label="Inwoners met betalingsinformatie opgeslagen" name="limit_payment" tool_tip="Verban ongeïdentificeerde inwoners."/> + <check_box label="Inwoners met betalingsinformatie opgeslagen" name="limit_payment" tool_tip="Verban ongeïdentificeerde inwoners."/> <check_box label="Leeftijdgeverifieerde volwassenen" name="limit_age_verified" tool_tip="Verban inwoners die hun leeftijd niet geverifieerd hebben. Zie support.secondlife.com voor meer informatie." bottom_delta="-30"/> <check_box label="Voice chat toestaan" name="voice_chat_check"/> <button label="?" name="voice_chat_help"/> diff --git a/indra/newview/skins/default/xui/nl/panel_world_map.xml b/indra/newview/skins/default/xui/nl/panel_world_map.xml index 11855b7fc1..d9a0b66fbc 100644 --- a/indra/newview/skins/default/xui/nl/panel_world_map.xml +++ b/indra/newview/skins/default/xui/nl/panel_world_map.xml @@ -1,5 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="world_map"> + <panel.string name="Loading"> + Laden... + </panel.string> + <panel.string name="InvalidLocation"> + Ongeldige Locatie + </panel.string> <panel.string name="world_map_north"> N </panel.string> diff --git a/indra/newview/skins/default/xui/nl/strings.xml b/indra/newview/skins/default/xui/nl/strings.xml index 0be5ec9e86..ae8d3b89dc 100644 --- a/indra/newview/skins/default/xui/nl/strings.xml +++ b/indra/newview/skins/default/xui/nl/strings.xml @@ -4,10 +4,21 @@ For example, the strings used in avatar chat bubbles, and strings that are returned from one component and may appear in many places--> <strings> - <string name="create_account_url">http://join.secondlife.com/index.php?lang=nl-NL</string> + <string name="SUPPORT_SITE"> + Second Life Ondersteunings Portaal + </string> + <string name="StartupDetectingHardware"> + Detecteert hardware... + </string> + <string name="StartupLoading"> + Laden + </string> <string name="LoginInProgress"> Inloggen. Het kan lijken dat [APP_NAME] is vastgelopen. Wacht u alstublieft... . </string> + <string name="LoginInProgressNoFrozen"> + Inloggen... + </string> <string name="LoginAuthenticating"> Authenticeren </string> @@ -26,11 +37,14 @@ <string name="LoginInitializingMultimedia"> Multimedia initialiseren... </string> + <string name="LoginInitializingFonts"> + Lettertypen laden... + </string> <string name="LoginVerifyingCache"> - Cache bestanden verifiëren (kan 60-90 seconden duren)... + Veriveren cache bestanden (kan 60-90 seconden duren)... </string> <string name="LoginProcessingResponse"> - Antwoord verwerken... + Reactie Verwerken... </string> <string name="LoginInitializingWorld"> Wereld initialiseren... @@ -56,9 +70,15 @@ <string name="LoginDownloadingClothing"> Kleding downloaden... </string> + <string name="LoginFailedNoNetwork"> + Netwerk Fout: Kon geen verbinding maken, kijk uw nerwerk connectie na alstublieft. + </string> <string name="Quit"> Afsluiten </string> + <string name="create_account_url"> + http://join.secondlife.com/index.php?lang=nl-NL + </string> <string name="AgentLostConnection"> Deze regio kan problemen ondervinden. Controleer alstublieft uw verbinding met het internet. </string> @@ -77,39 +97,9 @@ <string name="TooltipIsGroup"> (Groep) </string> - <string name="TooltipFlagScript"> - Script - </string> - <string name="TooltipFlagPhysics"> - Fysiek - </string> - <string name="TooltipFlagTouch"> - Aanraken - </string> - <string name="TooltipFlagL$"> - L$ - </string> - <string name="TooltipFlagDropInventory"> - Deponeer inventaris - </string> - <string name="TooltipFlagPhantom"> - Fantoom - </string> - <string name="TooltipFlagTemporary"> - Tijdelijk - </string> - <string name="TooltipFlagRightClickMenu"> - (Rechtsklikken voor menu) - </string> - <string name="TooltipFreeToCopy"> - Vrij te kopiëren - </string> <string name="TooltipForSaleL$"> Te koop: L$[AMOUNT] </string> - <string name="TooltipForSaleMsg"> - Te koop: [MESSAGE] - </string> <string name="TooltipFlagGroupBuild"> Groep bouwen </string> @@ -137,6 +127,76 @@ <string name="TooltipMustSingleDrop"> Slechts een enkel item kan hier naartoe gesleept worden </string> + <string name="TooltipHttpUrl"> + Klik om deze web pagina te bekijken + </string> + <string name="TooltipSLURL"> + Klik om deze locatie informatie te bekijken + </string> + <string name="TooltipAgentUrl"> + Klik om deze inwoner zijn profiel te bekijken + </string> + <string name="TooltipGroupUrl"> + Klik om deze groeps informatie te bekijken + </string> + <string name="TooltipEventUrl"> + Klik om deze evenement informatie te bekijken + </string> + <string name="TooltipClassifiedUrl"> + Klik om deze advertentie te bekijken + </string> + <string name="TooltipParcelUrl"> + Klik om deze perceel informatie te bekijken + </string> + <string name="TooltipTeleportUrl"> + Klik om naar deze lokatie te teleporteren + </string> + <string name="TooltipObjectIMUrl"> + Klik om deze object informatie te bekijken + </string> + <string name="TooltipMapUrl"> + Klik om deze locatie op een map te bekijken + </string> + <string name="TooltipSLAPP"> + Klik om het secondlife:// commando te starten + </string> + <string name="CurrentURL" value="HuidigeURL: [HuidigeURL]"/> + <string name="SLurlLabelTeleport"> + Teleporteer naar + </string> + <string name="SLurlLabelShowOnMap"> + Toon Map voor + </string> + <string name="BUTTON_CLOSE_DARWIN"> + Sluiten (⌘W) + </string> + <string name="BUTTON_CLOSE_WIN"> + Sluiten (Ctrl+W) + </string> + <string name="BUTTON_RESTORE"> + Restore + </string> + <string name="BUTTON_MINIMIZE"> + Minimaliseren + </string> + <string name="BUTTON_TEAR_OFF"> + Afscheuren + </string> + <string name="BUTTON_DOCK"> + Koppelen + </string> + <string name="BUTTON_UNDOCK"> + Loskoppelen + </string> + <string name="BUTTON_HELP"> + Toon Help + </string> + <string name="Searching"> + Zoeken... + </string> + <string name="NoneFound"> + Geen gevonden. + </string> <string name="RetrievingData"> Ophalen... </string> @@ -191,8 +251,77 @@ <string name="AssetErrorUnknownStatus"> Onbekende status </string> - <string name="AvatarEditingApparance"> - (Uiterlijk bewerken) + <string name="texture"> + textuur + </string> + <string name="sound"> + geluid + </string> + <string name="calling card"> + visitekaart + </string> + <string name="landmark"> + landmarkering + </string> + <string name="legacy script"> + legacy script + </string> + <string name="clothing"> + kleding + </string> + <string name="object"> + object + </string> + <string name="note card"> + notecard + </string> + <string name="folder"> + map + </string> + <string name="root"> + root + </string> + <string name="lsl2 script"> + LSL2 script + </string> + <string name="lsl bytecode"> + LSL bytecode + </string> + <string name="tga texture"> + tga textuur + </string> + <string name="body part"> + lichaamsdeel + </string> + <string name="snapshot"> + foto + </string> + <string name="lost and found"> + Verloren en Gevonden + </string> + <string name="targa image"> + targa plaatje + </string> + <string name="trash"> + Prullenbak + </string> + <string name="jpeg image"> + jpeg plaatje + </string> + <string name="animation"> + animatie + </string> + <string name="gesture"> + gebaar + </string> + <string name="simstate"> + simstate + </string> + <string name="favorite"> + favorieten + </string> + <string name="symbolic link"> + link </string> <string name="AvatarAway"> Afwezig @@ -414,7 +543,19 @@ Laden... </string> <string name="worldmap_offline"> - Offline + Off line + </string> + <string name="worldmap_results_none_found"> + Geen gevonden. + </string> + <string name="Ok"> + OK + </string> + <string name="Premature end of file"> + Vroegtijdig eind van bestand + </string> + <string name="ST_NO_JOINT"> + Kan niet ROOT of JOINT vinden. </string> <string name="whisper"> fluistert: @@ -422,6 +563,57 @@ <string name="shout"> schreeuwt: </string> + <string name="ringing"> + Verbinden met in-wereld voice chat... + </string> + <string name="connected"> + Verbonden + </string> + <string name="unavailable"> + Voice is niet beschikbaar op uw huidige locatie + </string> + <string name="hang_up"> + Verbinding met in-wereld voicechat verbroken + </string> + <string name="ScriptQuestionCautionChatGranted"> + '[OBJECTNAME]', een object van '[OWNERNAME]', gevestigd in [REGIONNAME] op [REGIONPOS], is toestemming verleend om te: [PERMISSIONS]. + </string> + <string name="ScriptQuestionCautionChatDenied"> + '[OBJECTNAME]', een object van '[OWNERNAME]', gevestigd in [REGIONNAME] op [REGIONPOS], is toestemming geweigerd om te: [PERMISSIONS]. + </string> + <string name="ScriptTakeMoney"> + Linden dollars (L$) van u wegnemen + </string> + <string name="ActOnControlInputs"> + Acteren op uw bedieningsinvoer + </string> + <string name="RemapControlInputs"> + Uw bedieningsinvoer herdefiniëren + </string> + <string name="AnimateYourAvatar"> + Animeer uw avatar + </string> + <string name="AttachToYourAvatar"> + Bevestig aan uw avatar + </string> + <string name="ReleaseOwnership"> + Eigendom vrijgeven en openbaar worden + </string> + <string name="LinkAndDelink"> + Koppelen met en ontkoppelen van andere objecten + </string> + <string name="AddAndRemoveJoints"> + Toevoegen en verwijderen koppelingen met andere objecten + </string> + <string name="ChangePermissions"> + Wijzig zijn permissies + </string> + <string name="TrackYourCamera"> + Volg uw camera + </string> + <string name="ControlYourCamera"> + Bedien uw camera + </string> <string name="SIM_ACCESS_PG"> PG </string> @@ -440,8 +632,6 @@ <string name="land_type_unknown"> (onbekend) </string> - <string name="covenant_never_modified">Laatst gewijzigd: (nooit)</string> - <string name="covenant_modified">Laatst gewijzigd: </string> <string name="all_files"> Alle bestanden </string> @@ -487,17 +677,739 @@ <string name="choose_the_directory"> Kies folder </string> + <string name="AvatarSetNotAway"> + Niet Afwezig Instellen + </string> + <string name="AvatarSetAway"> + Afwezig Instellen + </string> + <string name="AvatarSetNotBusy"> + Niet Bezig Instellen + </string> + <string name="AvatarSetBusy"> + Bezig Instellen + </string> + <string name="shape"> + Postuur + </string> + <string name="skin"> + Huid + </string> + <string name="hair"> + Haar + </string> + <string name="eyes"> + Ogen + </string> + <string name="shirt"> + Hemd + </string> + <string name="pants"> + Broek + </string> + <string name="shoes"> + Schoenen + </string> + <string name="socks"> + Sokken + </string> + <string name="jacket"> + Jas + </string> + <string name="gloves"> + Handschoenen + </string> + <string name="undershirt"> + onderhemd + </string> + <string name="underpants"> + Onderbroek + </string> + <string name="skirt"> + Rok + </string> + <string name="alpha"> + Alpha + </string> + <string name="tattoo"> + Tattoo + </string> + <string name="invalid"> + ongeldig + </string> + <string name="next"> + Volgende + </string> + <string name="ok"> + OK + </string> + <string name="GroupNotifyGroupNotice"> + Groep Mededeling + </string> + <string name="GroupNotifyGroupNotices"> + Groep Mededelingen + </string> + <string name="GroupNotifySentBy"> + Verzonden Door: + </string> + <string name="GroupNotifyAttached"> + Bijgevoegt: + </string> + <string name="GroupNotifyViewPastNotices"> + Bekijk alle mededelingen en bijlages van verzonden Mededelingen in het verleden + </string> + <string name="GroupNotifyOpenAttachment"> + Open Bijlage + </string> + <string name="GroupNotifySaveAttachment"> + Sla Bijlage Op + </string> + <string name="TeleportOffer"> + Teleporteer Aanbieding + </string> + <string name="StartUpNotification"> + [%d] Nieuwe mededelingen aangekomen terwijl u weg was ... + </string> + <string name="StartUpNotifications"> + [%d] Nieuwe mededelingen aangekomen terwijl u weg was ... + </string> + <string name="OverflowInfoChannelString"> + U heeft [%d] meer mededelingen + </string> + <string name="BodyPartsRightArm"> + Rechter Arm + </string> + <string name="BodyPartsHead"> + Hoofd + </string> + <string name="BodyPartsLeftArm"> + Linker Arm + </string> + <string name="BodyPartsLeftLeg"> + Linker Been + </string> + <string name="BodyPartsTorso"> + Torso + </string> + <string name="BodyPartsRightLeg"> + Rechter Been + </string> + <string name="GraphicsQualityLow"> + Laag + </string> + <string name="GraphicsQualityMid"> + Middel + </string> + <string name="GraphicsQualityHigh"> + Hoog + </string> + <string name="LeaveMouselook"> + Druk op ESC om terug te keren naar Wereld Zicht + </string> + <string name="InventoryNoMatchingItems"> + Geen overeenkomende objecten gevonden in de voorraad. + </string> + <string name="InventoryNoTexture"> + Je hebt geen kopie van deze texture in je inventaris + </string> + <string name="no_transfer" value="(no transfer)"/> + <string name="no_modify" value="(no modify)"/> + <string name="no_copy" value="(no copy)"/> + <string name="worn" value="(worn)"/> + <string name="link" value="(link)"/> + <string name="broken_link" value="(broken_link)""/> + <string name="LoadingContents"> + Loading contents... + </string> + <string name="NoContents"> + No contents + </string> + <string name="WornOnAttachmentPoint" value="(worn on [ATTACHMENT_POINT])"/> + <string name="Chat" value="Chat :"/> + <string name="Sound" value="Geluid :"/> + <string name="Wait" value="--- Wachten :"/> + <string name="AnimFlagStop" value="Stop Animatie :"/> + <string name="AnimFlagStart" value="Start Animatie :"/> + <string name="Wave" value="Wave"/> + <string name="HelloAvatar" value="Hallo, avatar!"/> + <string name="ViewAllGestures" value="Bekijk alles >"/> + <string name="Animations" value="Animaties,"/> + <string name="Calling Cards" value="Calling Cards,"/> + <string name="Clothing" value="Kleding,"/> + <string name="Gestures" value="Gestures,"/> + <string name="Landmarks" value="Landmarks,"/> + <string name="Notecards" value="Notecards,"/> + <string name="Objects" value="Objecten,"/> + <string name="Scripts" value="Scripts,"/> + <string name="Sounds" value="Geluiden,"/> + <string name="Textures" value="Textures,"/> + <string name="Snapshots" value="Snapshots,"/> + <string name="No Filters" value="Nee"/> + <string name="Since Logoff" value="- Sinds Afmelden"/> + <string name="InvFolder My Inventory"> + Mijn Inventaris + </string> + <string name="InvFolder My Favorites"> + Mijn Favorieten + </string> + <string name="InvFolder Library"> + Bibliotheek + </string> + <string name="InvFolder Textures"> + Textures + </string> + <string name="InvFolder Sounds"> + Geluiden + </string> + <string name="InvFolder Calling Cards"> + Calling Cards + </string> + <string name="InvFolder Landmarks"> + Landmarks + </string> + <string name="InvFolder Scripts"> + Scripts + </string> + <string name="InvFolder Clothing"> + Kleding + </string> + <string name="InvFolder Objects"> + Objecten + </string> + <string name="InvFolder Notecards"> + Notecards + </string> + <string name="InvFolder New Folder"> + Nieuwe Map + </string> + <string name="InvFolder Inventory"> + Inventaris + </string> + <string name="InvFolder Uncompressed Images"> + Ongecomprimeerde Afbeeldingen + </string> + <string name="InvFolder Body Parts"> + Lichaams Delen + </string> + <string name="InvFolder Trash"> + Afval + </string> + <string name="InvFolder Photo Album"> + Foto Album + </string> + <string name="InvFolder Lost And Found"> + Verloren en Gevonden + </string> + <string name="InvFolder Uncompressed Sounds"> + Ongecomprimeerde Geluiden + </string> + <string name="InvFolder Animations"> + Animaties + </string> + <string name="InvFolder Gestures"> + Gebaren + </string> + <string name="InvFolder favorite"> + Favoriten + </string> + <string name="InvFolder Current Outfit"> + Huidige Uitrusting + </string> + <string name="InvFolder My Outfits"> + Mijn Uitrustingen + </string> + <string name="InvFolder Friends"> + Vrienden + </string> + <string name="InvFolder All"> + Alles + </string> + <string name="Buy"> + Koop + </string> + <string name="BuyforL$"> + Koop voor L$ + </string> + <string name="Stone"> + Steen + </string> + <string name="Metal"> + Metaal + </string> + <string name="Glass"> + Glas + </string> + <string name="Wood"> + Hout + </string> + <string name="Flesh"> + Vlees + </string> + <string name="Plastic"> + Plastic + </string> + <string name="Rubber"> + Rubber + </string> + <string name="Light"> + Licht + </string> + <string name="KBShift"> + Shift + </string> + <string name="KBCtrl"> + Ctrl + </string> + <string name="Chest"> + Borstkas + </string> + <string name="Skull"> + Schedel + </string> + <string name="Left Shoulder"> + Linker Schouder + </string> + <string name="Right Shoulder"> + Rechter Schouder + </string> + <string name="Left Hand"> + Linker Hand + </string> + <string name="Right Hand"> + Rechter Hand + </string> + <string name="Left Foot"> + Linker Voet + </string> + <string name="Right Foot"> + Rechter Voet + </string> + <string name="Spine"> + Ruggegraat + </string> + <string name="Pelvis"> + Bekken + </string> + <string name="Mouth"> + Mond + </string> + <string name="Chin"> + Kin + </string> + <string name="Left Ear"> + Linker Oor + </string> + <string name="Right Ear"> + Rechter Oor + </string> + <string name="Left Eyeball"> + Linker Oogbal + </string> + <string name="Right Eyeball"> + Rechter Oogbal + </string> + <string name="Nose"> + Neus + </string> + <string name="R Upper Arm"> + R Boven Arm + </string> + <string name="R Forearm"> + R Onder Arm + </string> + <string name="L Upper Arm"> + L Boven Arm + </string> + <string name="L Forearm"> + L Onder Arm + </string> + <string name="Right Hip"> + Rechter Heup + </string> + <string name="R Upper Leg"> + R Boven Been + </string> + <string name="R Lower Leg"> + R Onder Been + </string> + <string name="Left Hip"> + Linker Heub + </string> + <string name="L Upper Leg"> + L Boven Been + </string> + <string name="L Lower Leg"> + L Onder Been + </string> + <string name="Stomach"> + Maag + </string> + <string name="Left Pec"> + Left Pec + </string> + <string name="Right Pec"> + Right Pec + </string> + <string name="YearsMonthsOld"> + [AGEYEARS] [AGEMONTHS] oud + </string> + <string name="YearsOld"> + [AGEYEARS] oud + </string> + <string name="MonthsOld"> + [AGEMONTHS] oud + </string> + <string name="WeeksOld"> + [AGEWEEKS] oud + </string> + <string name="DaysOld"> + [AGEDAYS] oud + </string> + <string name="TodayOld"> + Vandaag toegetreden + </string> + <string name="AgeYearsA"> + [COUNT] jaar + </string> + <string name="AgeYearsB"> + [COUNT] jaar + </string> + <string name="AgeYearsC"> + [COUNT] jaar + </string> + <string name="AgeMonthsA"> + [COUNT] maand + </string> + <string name="AgeMonthsB"> + [COUNT] maanden + </string> + <string name="AgeMonthsC"> + [COUNT] maanden + </string> + <string name="AgeWeeksA"> + [COUNT] week + </string> + <string name="AgeWeeksB"> + [COUNT] weken + </string> + <string name="AgeWeeksC"> + [COUNT] weken + </string> + <string name="AgeDaysA"> + [COUNT] dag + </string> + <string name="AgeDaysB"> + [COUNT] dagen + </string> + <string name="AgeDaysC"> + [COUNT] dagen + </string> + <string name="GroupMembersA"> + [COUNT] lid + </string> + <string name="GroupMembersB"> + [COUNT] leden + </string> + <string name="GroupMembersC"> + [COUNT] leden + </string> + <string name="AcctTypeResident"> + bewoner + </string> + <string name="AcctTypeTrial"> + Trial + </string> + <string name="AcctTypeCharterMember"> + Charter Member + </string> + <string name="AcctTypeEmployee"> + Linden Lab Werknemer + </string> + <string name="PaymentInfoUsed"> + Betalings info gebruikt + </string> + <string name="PaymentInfoOnFile"> + Betalings info op bestand + </string> + <string name="NoPaymentInfoOnFile"> + Geen betalings info op bestand + </string> + <string name="AgeVerified"> + Leeftijd gecontroleerd + </string> + <string name="NotAgeVerified"> + Niet leeftijd gecontroleerd + </string> + <string name="Center 2"> + Centrum 2 + </string> + <string name="Top Right"> + Rechts Boven + </string> + <string name="Top"> + Boven + </string> + <string name="Top Left"> + Links Boven + </string> + <string name="Center"> + Centrum + </string> + <string name="Bottom Left"> + Links beneden + </string> + <string name="Bottom"> + Beneden + </string> + <string name="Bottom Right"> + Rechts beneden + </string> + <string name="CompileQueueDownloadedCompiling"> + Dedownload, nu samenstellen + </string> + <string name="CompileQueueScriptNotFound"> + Script niet gevonden op server. + </string> + <string name="CompileQueueProblemDownloading"> + Problem downloading + </string> + <string name="CompileQueueInsufficientPermDownload"> + Onvoldoende rechten om een script te downloaden. + </string> + <string name="CompileQueueInsufficientPermFor"> + Onvoldoende rechten voor + </string> + <string name="CompileQueueUnknownFailure"> + Onbekende fout te downloaden + </string> + <string name="CompileQueueTitle"> + Hercompilatie vooruitgang + </string> + <string name="CompileQueueStart"> + Hercompilatie + </string> + <string name="ResetQueueTitle"> + Reset Vooruitgang + </string> + <string name="ResetQueueStart"> + reset + </string> + <string name="RunQueueTitle"> + Set Running Progress + </string> + <string name="RunQueueStart"> + set running + </string> + <string name="NotRunQueueTitle"> + Set Not Running Progress + </string> + <string name="NotRunQueueStart"> + set not running + </string> + <string name="CompileSuccessful"> + Compileren succesvol! + </string> + <string name="CompileSuccessfulSaving"> + Compileren succesvol, opslaan... + </string> + <string name="SaveComplete"> + Opslaan gereed. + </string> + <string name="ObjectOutOfRange"> + Script (object buiten het bereik) + </string> + <string name="GodToolsObjectOwnedBy"> + Object [OBJECT] eigendom van [OWNER] + </string> + <string name="GroupsNone"> + geen + </string> + <string name="Group" value="(group)"/> + <string name="Unknown"> + (Unknown) + </string> + <string name="SummaryForTheWeek" value="Samenvatting voor deze week, vanaf"/> + <string name="NextStipendDay" value="The next stipend day is"/> + <string name="GroupIndividualShare" value="Groep Individueel Aandeel"/> + <string name="Balance"> + Banksaldo + </string> + <string name="Credits"> + Credits + </string> + <string name="Debits"> + Debiteert + </string> + <string name="Total"> + Totaal + </string> + <string name="NoGroupDataFound"> + Geen groep gegevens gevonden voor groep + </string> + <string name="IMParentEstate"> + parent estate + </string> + <string name="IMMainland"> + mainland + </string> + <string name="IMTeen"> + tiener + </string> + <string name="RegionInfoError"> + fout + </string> + <string name="RegionInfoAllEstatesOwnedBy"> + all estates owned by [OWNER] + </string> + <string name="RegionInfoAllEstatesYouOwn"> + all estates that you own + </string> + <string name="RegionInfoAllEstatesYouManage"> + all estates that you manage for [OWNER] + </string> + <string name="RegionInfoAllowedResidents"> + Toegestane bewoners: ([ALLOWEDAGENTS], max [MAXACCESS]) + </string> + <string name="RegionInfoAllowedGroups"> + Toegestane groepen: ([ALLOWEDGROUPS], max [MAXACCESS]) + </string> + <string name="CursorPos"> + Lijn [LINE], Column [COLUMN] + </string> + <string name="PanelDirCountFound"> + [COUNT] gevonden + </string> + <string name="PanelContentsNewScript"> + Nieuw Script + </string> + <string name="MuteByName"> + (by name) + </string> + <string name="MuteAgent"> + (resident) + </string> + <string name="MuteObject"> + (object) + </string> + <string name="MuteGroup"> + (group) + </string> + <string name="RegionNoCovenant"> + There is no Covenant provided for this Estate. + </string> + <string name="RegionNoCovenantOtherOwner"> + There is no Covenant provided for this Estate. The land on this estate is being sold by the Estate owner, not Linden Lab. Please contact the Estate Owner for sales details. + </string> + <string name="covenant_last_modified"> + Laatst bewerkt: + </string> + <string name="none_text" value="(none)"/> + <string name="never_text" value="(never)"/> + <string name="GroupOwned"> + Groep Eigendom + </string> + <string name="Public"> + Openbaar + </string> + <string name="ClassifiedClicksTxt"> + Klikken: [TELEPORT] teleport, [MAP] map, [PROFILE] profiel + </string> + <string name="ClassifiedUpdateAfterPublish"> + (zal bijwerken na publiceren) + </string> + <string name="MultiPreviewTitle"> + Preview + </string> + <string name="MultiPropertiesTitle"> + Eigenschappen + </string> + <string name="InvOfferAnObjectNamed"> + Een object genaamd + </string> + <string name="InvOfferOwnedByGroup"> + Eigendom van groep + </string> + <string name="InvOfferOwnedByUnknownGroup"> + Eigendom van een onbekende groep + </string> + <string name="InvOfferOwnedBy"> + Eigendom van + </string> + <string name="InvOfferOwnedByUnknownUser"> + Eigendom van onbekende gebruiker + </string> + <string name="InvOfferGaveYou"> + gaf je + </string> + <string name="InvOfferYouDecline"> + You decline + </string> + <string name="InvOfferFrom"> + van + </string> + <string name="GroupMoneyTotal"> + Totaal + </string> + <string name="GroupMoneyBought"> + kocht + </string> + <string name="GroupMoneyPaidYou"> + betaald u + </string> + <string name="GroupMoneyPaidInto"> + gestort + </string> + <string name="GroupMoneyBoughtPassTo"> + bought pass to + </string> + <string name="GroupMoneyPaidFeeForEvent"> + betaalde vergoeding voor evenement + </string> + <string name="GroupMoneyPaidPrizeForEvent"> + betaalde prijs voor evenement + </string> + <string name="GroupMoneyBalance"> + Banksaldo + </string> + <string name="GroupMoneyCredits"> + Credits + </string> + <string name="GroupMoneyDebits"> + Debiteert + </string> + <string name="ViewerObjectContents"> + Inhoud + </string> + <string name="AcquiredItems"> + Verworven objecten + </string> + <string name="Cancel"> + Annuleren + </string> + <string name="UploadingCosts"> + Uploading [%s] kosten + </string> + <string name="UnknownFileExtension"> + Onbekende extensie [.%s] +Verwacht .wav, .tga, .bmp, .jpg, .jpeg, or .bvh + </string> + <string name="AddLandmarkNavBarMenu"> + Voeg Landmark toe... + </string> + <string name="EditLandmarkNavBarMenu"> + Bewerk Landmark... + </string> <string name="accel-mac-control"> - ⌃ + ⌃ </string> <string name="accel-mac-command"> - ⌘ + ⌘ </string> <string name="accel-mac-option"> - ⌥ + ⌥ </string> <string name="accel-mac-shift"> - ⇧ + ⇧ </string> <string name="accel-win-control"> Ctrl+ @@ -508,82 +1420,1790 @@ <string name="accel-win-shift"> Shift+ </string> - <string name="GraphicsQualityLow"> - Laag + <string name="FileSaved"> + Bestand Opgeslagen </string> - <string name="GraphicsQualityMid"> - Middel + <string name="Receiving"> + Ontvangen </string> - <string name="GraphicsQualityHigh"> + <string name="AM"> + AM + </string> + <string name="PM"> + PM + </string> + <string name="PST"> + PST + </string> + <string name="PDT"> + PDT + </string> + <string name="Forward"> + Vooruit + </string> + <string name="Left"> + Links + </string> + <string name="Right"> + Rechts + </string> + <string name="Back"> + Achteruit + </string> + <string name="North"> + Noord + </string> + <string name="South"> + Zuid + </string> + <string name="West"> + West + </string> + <string name="East"> + Oost + </string> + <string name="Up"> + Omhoog + </string> + <string name="Down"> + Omlaag + </string> + <string name="Any Category"> + Elke Categorie + </string> + <string name="Shopping"> + Boodschappen + </string> + <string name="Land Rental"> + Land Verhuur + </string> + <string name="Property Rental"> + Verhuur van onroerend goed + </string> + <string name="Special Attraction"> + Speciale Attractie + </string> + <string name="New Products"> + Nieuwe Producten + </string> + <string name="Employment"> + Employment + </string> + <string name="Wanted"> + Gezocht + </string> + <string name="Service"> + Service + </string> + <string name="Personal"> + Personal + </string> + <string name="None"> + Geen + </string> + <string name="Linden Location"> + Linden locatie + </string> + <string name="Adult"> + Adult + </string> + <string name="Arts&Culture"> + Kunst & Cultuur + </string> + <string name="Business"> + Zakelijk + </string> + <string name="Educational"> + Educatief + </string> + <string name="Gaming"> + Spelen + </string> + <string name="Hangout"> + Ontmoetingsplaats + </string> + <string name="Newcomer Friendly"> + Nieuwkomervriendelijk + </string> + <string name="Parks&Nature"> + Parken & natuur + </string> + <string name="Residential"> + Woongebied + </string> + <string name="Stage"> + Stage + </string> + <string name="Other"> + Anders + </string> + <string name="Any"> + Any + </string> + <string name="You"> + Jij + </string> + <string name="Multiple Media"> + Meerdere Media + </string> + <string name="Play Media"> + Play/Pause Media + </string> + <string name="MBCmdLineError"> + An error was found parsing the command line. +Please see: http://wiki.secondlife.com/wiki/Client_parameters +Error: + </string> + <string name="MBCmdLineUsg"> + [APP_NAME] Command line usage: + </string> + <string name="MBUnableToAccessFile"> + [APP_NAME] is unable to access a file that it needs. + +This can be because you somehow have multiple copies running, or your system incorrectly thinks a file is open. +If this message persists, restart your computer and try again. +If it continues to persist, you may need to completely uninstall [APP_NAME] and reinstall it. + </string> + <string name="MBFatalError"> + Fatal Error + </string> + <string name="MBRequiresAltiVec"> + [APP_NAME] requires a processor with AltiVec (G4 or later). + </string> + <string name="MBAlreadyRunning"> + [APP_NAME] is already running. +Check your task bar for a minimized copy of the program. +If this message persists, restart your computer. + </string> + <string name="MBFrozenCrashed"> + [APP_NAME] appears to have frozen or crashed on the previous run. +Would you like to send a crash report? + </string> + <string name="MBAlert"> + Alert + </string> + <string name="MBNoDirectX"> + [APP_NAME] is unable to detect DirectX 9.0b or greater. +[APP_NAME] uses DirectX to detect hardware and/or outdated drivers that can cause stability problems, poor performance and crashes. While you can run [APP_NAME] without it, we highly recommend running with DirectX 9.0b. + +Do you wish to continue? + </string> + <string name="MBWarning"> + Warning + </string> + <string name="MBNoAutoUpdate"> + Automatic updating is not yet implemented for Linux. +Please download the latest version from www.secondlife.com. + </string> + <string name="MBRegClassFailed"> + RegisterClass failed + </string> + <string name="MBError"> + Error + </string> + <string name="MBFullScreenErr"> + Unable to run fullscreen at [WIDTH] x [HEIGHT]. +Running in window. + </string> + <string name="MBDestroyWinFailed"> + Shutdown Error while destroying window (DestroyWindow() failed) + </string> + <string name="MBShutdownErr"> + Shutdown Error + </string> + <string name="MBDevContextErr"> + Can't make GL device context + </string> + <string name="MBPixelFmtErr"> + Can't find suitable pixel format + </string> + <string name="MBPixelFmtDescErr"> + Can't get pixel format description + </string> + <string name="MBTrueColorWindow"> + [APP_NAME] requires True Color (32-bit) to run. +Please go to your computer's display settings and set the color mode to 32-bit. + </string> + <string name="MBAlpha"> + [APP_NAME] is unable to run because it can't get an 8 bit alpha channel. Usually this is due to video card driver issues. +Please make sure you have the latest video card drivers installed. +Also be sure your monitor is set to True Color (32-bit) in Control Panels > Display > Settings. +If you continue to receive this message, contact the [SUPPORT_SITE]. + </string> + <string name="MBPixelFmtSetErr"> + Can't set pixel format + </string> + <string name="MBGLContextErr"> + Can't create GL rendering context + </string> + <string name="MBGLContextActErr"> + Can't activate GL rendering context + </string> + <string name="MBVideoDrvErr"> + [APP_NAME] is unable to run because your video card drivers did not install properly, are out of date, or are for unsupported hardware. Please make sure you have the latest video card drivers and even if you do have the latest, try reinstalling them. + +If you continue to receive this message, contact the [SUPPORT_SITE]. + </string> + <string name="5 O'Clock Shadow"> + Stoppels + </string> + <string name="All White"> + Alles Wit + </string> + <string name="Anime Eyes"> + Ogen Animeren + </string> + <string name="Arced"> + Gebogen + </string> + <string name="Arm Length"> + Arm Lengte + </string> + <string name="Attached"> + Bijgevoegt + </string> + <string name="Attached Earlobes"> + Bijgevoegde Oorlellen + </string> + <string name="Back Bangs"> + Achterkant Pony + </string> + <string name="Back Bangs Down"> + Achterkant Pony Neer + </string> + <string name="Back Bangs Up"> + Achterkant Pony Omhoog + </string> + <string name="Back Fringe"> + Achterkant Franje + </string> + <string name="Back Hair"> + Achterkant Haar + </string> + <string name="Back Hair Down"> + Achterkant Haar Neer + </string> + <string name="Back Hair Up"> + Achterkant Haar Omhoog + </string> + <string name="Baggy"> + Oogwallen + </string> + <string name="Bangs"> + Pony + </string> + <string name="Bangs Down"> + Pony Neer + </string> + <string name="Bangs Up"> + Pony Omhoog + </string> + <string name="Beady Eyes"> + Kraaloogjes + </string> + <string name="Belly Size"> + Buik Grootte + </string> + <string name="Big"> + Groot + </string> + <string name="Big Butt"> + Grote Kont + </string> + <string name="Big Eyeball"> + Grote Oogbol + </string> + <string name="Big Hair Back"> + Haar Volume Achter + </string> + <string name="Big Hair Front"> + Haar Volume Voor + </string> + <string name="Big Hair Top"> + Haar Volume Boven + </string> + <string name="Big Head"> + Groot Hoofd + </string> + <string name="Big Pectorals"> + Groote Borstspieren + </string> + <string name="Big Spikes"> + Grote Stekels + </string> + <string name="Black"> + Zwart + </string> + <string name="Blonde"> + Blond + </string> + <string name="Blonde Hair"> + Blond Haar + </string> + <string name="Blush"> + Blozen + </string> + <string name="Blush Color"> + Bloos Kleur + </string> + <string name="Blush Opacity"> + Bloos Opaciteit + </string> + <string name="Body Definition"> + Lichaam Definitie + </string> + <string name="Body Fat"> + Lichaam vet + </string> + <string name="Body Freckles"> + Lichaam Sproeten + </string> + <string name="Body Thick"> + Lichaam Dik + </string> + <string name="Body Thickness"> + Lichaam Dikte + </string> + <string name="Body Thin"> + Lichaam Dun + </string> + <string name="Bow Legged"> + Boog Benen + </string> + <string name="Breast Buoyancy"> + Borst Drijfvermogen + </string> + <string name="Breast Cleavage"> + Borst Splijting + </string> + <string name="Breast Size"> + Borst Grootte + </string> + <string name="Bridge Width"> + Brug Breedte + </string> + <string name="Broad"> + Breed + </string> + <string name="Brow Size"> + Wenkbrauw Grootte + </string> + <string name="Bug Eyes"> + Insect Ogen + </string> + <string name="Bugged Eyes"> + Insect Ogen + </string> + <string name="Bulbous"> + Bolle + </string> + <string name="Bulbous Nose"> + Bolle Neus + </string> + <string name="Bushy Eyebrows"> + Borstelige Wenkbrauwen + </string> + <string name="Bushy Hair"> + Borstelig Haar + </string> + <string name="Butt Size"> + Kont Grootte + </string> + <string name="bustle skirt"> + Bustle Skirt + </string> + <string name="no bustle"> + No Bustle + </string> + <string name="more bustle"> + More Bustle + </string> + <string name="Chaplin"> + Smalle Snor + </string> + <string name="Cheek Bones"> + Jukbeenderen + </string> + <string name="Chest Size"> + Borst Grootte + </string> + <string name="Chin Angle"> + Kin Hoek + </string> + <string name="Chin Cleft"> + Gespleten Kin + </string> + <string name="Chin Curtains"> + Kin Gordijnen + </string> + <string name="Chin Depth"> + Kin Diepte + </string> + <string name="Chin Heavy"> + Kin Zware + </string> + <string name="Chin In"> + Kin In + </string> + <string name="Chin Out"> + Kin uit + </string> + <string name="Chin-Neck"> + Kin-Nek + </string> + <string name="Clear"> + Opschonen + </string> + <string name="Cleft"> + Gespleten + </string> + <string name="Close Set Eyes"> + Close Set Eyes + </string> + <string name="Closed"> + Gesloten + </string> + <string name="Closed Back"> + Gesloten Achterkant + </string> + <string name="Closed Front"> + Gesloten Voorkant + </string> + <string name="Closed Left"> + Gesloten Links + </string> + <string name="Closed Right"> + Gesloten Rechts + </string> + <string name="Coin Purse"> + Verminder Grootte + </string> + <string name="Collar Back"> + Kraag Achterkant + </string> + <string name="Collar Front"> + Kraag Voorkant + </string> + <string name="Corner Down"> + Hoek Omlaag + </string> + <string name="Corner Normal"> + Hoek Normaal + </string> + <string name="Corner Up"> + Hoek Omhoog + </string> + <string name="Creased"> + Gevouwen + </string> + <string name="Crooked Nose"> + Kromte Neus + </string> + <string name="Cropped Hair"> + Bijgesneden Haar + </string> + <string name="Cuff Flare"> + Cuff Flare + </string> + <string name="Dark"> + Donker + </string> + <string name="Dark Green"> + Donker Groen + </string> + <string name="Darker"> + Donkerder + </string> + <string name="Deep"> + Diep + </string> + <string name="Default Heels"> + Standaard Hielen + </string> + <string name="Default Toe"> + Standaard Teen + </string> + <string name="Dense"> + Dicht + </string> + <string name="Dense hair"> + Dicht haar + </string> + <string name="Double Chin"> + Dubbele Kin + </string> + <string name="Downturned"> + Downturned + </string> + <string name="Duffle Bag"> + Vergroot Grootte + </string> + <string name="Ear Angle"> + Oor Hoek + </string> + <string name="Ear Size"> + Oor Grootte + </string> + <string name="Ear Tips"> + Oor Punten + </string> + <string name="Egg Head"> + Ei Hoofd + </string> + <string name="Eye Bags"> + Oog Zakken + </string> + <string name="Eye Color"> + Oog Kleur + </string> + <string name="Eye Depth"> + Oog Diepte + </string> + <string name="Eye Lightness"> + Oog Lichtheid + </string> + <string name="Eye Opening"> + Oog Opening + </string> + <string name="Eye Pop"> + Asymmetrisch + </string> + <string name="Eye Size"> + Oog Grootte + </string> + <string name="Eye Spacing"> + Oog Afstand + </string> + <string name="Eyeball Size"> + Oogbal Grootte + </string> + <string name="Eyebrow Arc"> + Wenkbrauw Boog + </string> + <string name="Eyebrow Density"> + Wenkbrauw Dichtheid + </string> + <string name="Eyebrow Height"> + Wenkbrauw Hoogte + </string> + <string name="Eyebrow Points"> + Wenkbrauw Punten + </string> + <string name="Eyebrow Size"> + Eyebrow Grootte + </string> + <string name="Eyelash Length"> + Eyelash Lengte + </string> + <string name="Eyeliner"> + Eyeliner + </string> + <string name="Eyeliner Color"> + Eyeliner Kleur + </string> + <string name="Eyes Back"> + Ogen Achteruit + </string> + <string name="Eyes Bugged"> + Insect Ogen + </string> + <string name="Eyes Forward"> + Ogen Vooruit + </string> + <string name="Eyes Long Head"> + Eyes Long Head + </string> + <string name="Eyes Shear Left Up"> + Eyes Shear Left Up + </string> + <string name="Eyes Shear Right Up"> + Eyes Shear Right Up + </string> + <string name="Eyes Short Head"> + Eyes Short Head + </string> + <string name="Eyes Spread"> + Eyes Spread + </string> + <string name="Eyes Sunken"> + Ingevallen Ogen + </string> + <string name="Eyes Together"> + Ogen Bij Elkaar + </string> + <string name="Face Shear"> + Gezicht Gelijkheid + </string> + <string name="Facial Definition"> + Gezichts Definitie + </string> + <string name="Far Set Eyes"> + Ogen Uit Elkaar + </string> + <string name="Fat"> + Dik + </string> + <string name="Fat Head"> + Dik Hoofd + </string> + <string name="Fat Lips"> + Dikke Lippen + </string> + <string name="Fat Lower"> + Fat Lower + </string> + <string name="Fat Lower Lip"> + Fat Lower Lip + </string> + <string name="Fat Torso"> + Fat Torso + </string> + <string name="Fat Upper"> + Fat Upper + </string> + <string name="Fat Upper Lip"> + Dikke Boven Lip + </string> + <string name="Female"> + Vrouw + </string> + <string name="Fingerless"> + Vingerloos + </string> + <string name="Fingers"> + Vingers + </string> + <string name="Flared Cuffs"> + Verbrede Vorm + </string> + <string name="Flat"> + Plat + </string> + <string name="Flat Butt"> + Platte Kont + </string> + <string name="Flat Head"> + Plat Hoofd + </string> + <string name="Flat Toe"> + Platte Teen + </string> + <string name="Foot Size"> + Voet Grootte + </string> + <string name="Forehead Angle"> + Voorhoofd Hoek + </string> + <string name="Forehead Heavy"> + Zwaar Voorhoofd + </string> + <string name="Freckles"> + Sproeten + </string> + <string name="Front Bangs Down"> + Voorkant Pony Omlaag + </string> + <string name="Front Bangs Up"> + Voorkant Pony Omhoog + </string> + <string name="Front Fringe"> + Voorste Rand + </string> + <string name="Front Hair"> + Gezichtshaar + </string> + <string name="Front Hair Down"> + Gezichtshaar Omlaag + </string> + <string name="Front Hair Up"> + Gezichtshaar Omhoog + </string> + <string name="Full Back"> + Volle Achterkant + </string> + <string name="Full Eyeliner"> + Volle Eyeliner + </string> + <string name="Full Front"> + Volle Voorkant + </string> + <string name="Full Hair Sides"> + Full Hair Sides + </string> + <string name="Full Sides"> + Volle Zijkanten + </string> + <string name="Glossy"> + Glanzend + </string> + <string name="Glove Fingers"> + Vinger Handschoenen + </string> + <string name="Glove Length"> + Handschoen Lengte + </string> + <string name="Hair"> + Haar + </string> + <string name="Hair Back"> + Haar: Zwart + </string> + <string name="Hair Front"> + Haar: Voorkant + </string> + <string name="Hair Sides"> + Haar: Zijkant + </string> + <string name="Hair Sweep"> + Hair Sweep + </string> + <string name="Hair Thickess"> + Haar Dikheid + </string> + <string name="Hair Thickness"> + Hair Dikheid + </string> + <string name="Hair Tilt"> + Hair Tilt + </string> + <string name="Hair Tilted Left"> + Hair Tilted Left + </string> + <string name="Hair Tilted Right"> + Hair Tilted Right + </string> + <string name="Hair Volume"> + Haar: Volume + </string> + <string name="Hand Size"> + Hand Grootte + </string> + <string name="Handlebars"> + Handlebars + </string> + <string name="Head Length"> + Hoofd Lengte + </string> + <string name="Head Shape"> + Hoofd Vorm + </string> + <string name="Head Size"> + Hooft Grootte + </string> + <string name="Head Stretch"> + Hoofd Uitrekken + </string> + <string name="Heel Height"> + Hiel Hoogte + </string> + <string name="Heel Shape"> + Hiel Vorm + </string> + <string name="Height"> + Hoogte + </string> + <string name="High"> Hoog </string> - - <!-- PARCEL_CATEGORY_UI_STRING --> - <string name="Linden Location">Linden locatie</string> - <string name="Adult">Adult</string> - <string name="Arts&Culture">Kunst & Cultuur</string> - <string name="Business">Zakelijk</string> - <string name="Educational">Educatief</string> - <string name="Gaming">Spelen</string> - <string name="Hangout">Ontmoetingsplaats</string> - <string name="Newcomer Friendly">Nieuwkomervriendelijk</string> - <string name="Parks&Nature">Parken & natuur</string> - <string name="Residential">Woongebied</string> - <string name="Shopping">Winkelen</string> - <string name="Other">Anders</string> - - <string name="ringing"> - Verbinden met in-wereld voice chat... + <string name="High Heels"> + Hoge Hielen </string> - <string name="connected"> - Verbonden + <string name="High Jaw"> + Hoge Kaak </string> - <string name="unavailable"> - Voice is niet beschikbaar op uw huidige locatie + <string name="High Platforms"> + High Platforms </string> - <string name="hang_up"> - Verbinding met in-wereld voicechat verbroken + <string name="High and Tight"> + Hoog en Strak + </string> + <string name="Higher"> + Hoger + </string> + <string name="Hip Length"> + Heup Lengte + </string> + <string name="Hip Width"> + Heup Breedte + </string> + <string name="In"> + Naar Binnen + </string> + <string name="In Shdw Color"> + Binnenste Schaduw Kleur + </string> + <string name="In Shdw Opacity"> + Binnenste Schaduw Opaciteit + </string> + <string name="Inner Eye Corner"> + Binnenste Oog Hoek + </string> + <string name="Inner Eye Shadow"> + Binnenste Oog Schaduw + </string> + <string name="Inner Shadow"> + Binnenste Schaduw + </string> + <string name="Jacket Length"> + Jas Lengte + </string> + <string name="Jacket Wrinkles"> + Jas Rimpels + </string> + <string name="Jaw Angle"> + Kaak Hoek + </string> + <string name="Jaw Jut"> + Jaw Jut + </string> + <string name="Jaw Shape"> + Kaak Vorm + </string> + <string name="Join"> + Samenvoegen + </string> + <string name="Jowls"> + Kaken + </string> + <string name="Knee Angle"> + Knie Hoek + </string> + <string name="Knock Kneed"> + Knieën Naar binnen + </string> + <string name="Large"> + Fors + </string> + <string name="Large Hands"> + Grote Handen + </string> + <string name="Left Part"> + Linker Deel + </string> + <string name="Leg Length"> + Been Lengte + </string> + <string name="Leg Muscles"> + Been Spieren + </string> + <string name="Less"> + Minder + </string> + <string name="Less Body Fat"> + Minder Lichaams Vet + </string> + <string name="Less Curtains"> + Less Curtains + </string> + <string name="Less Freckles"> + Minder Sproeten + </string> + <string name="Less Full"> + Minder Vol + </string> + <string name="Less Gravity"> + Minder Zwaartekracht + </string> + <string name="Less Love"> + Less Love + </string> + <string name="Less Muscles"> + Minder Spieren + </string> + <string name="Less Muscular"> + Minder Spieren + </string> + <string name="Less Rosy"> + Minder Rooskleurig + </string> + <string name="Less Round"> + Minder Rond + </string> + <string name="Less Saddle"> + Minder Heupen + </string> + <string name="Less Square"> + Minder Vierkant + </string> + <string name="Less Volume"> + Minder Volume + </string> + <string name="Less soul"> + Minder Ziel + </string> + <string name="Lighter"> + Lichter + </string> + <string name="Lip Cleft"> + Gespleten Lip + </string> + <string name="Lip Cleft Depth"> + Gespleten Lip Diepte + </string> + <string name="Lip Fullness"> + Lip Volheid + </string> + <string name="Lip Pinkness"> + Rozeheid Lippen + </string> + <string name="Lip Ratio"> + Lip Ratio + </string> + <string name="Lip Thickness"> + Lip Dikheid + </string> + <string name="Lip Width"> + Lip Breedte + </string> + <string name="Lipgloss"> + Lipgloss + </string> + <string name="Lipstick"> + Lipstick + </string> + <string name="Lipstick Color"> + Lipstick Kleur + </string> + <string name="Long"> + Lang + </string> + <string name="Long Head"> + Lang Hoofd + </string> + <string name="Long Hips"> + Lange Heupen + </string> + <string name="Long Legs"> + Lange Benen + </string> + <string name="Long Neck"> + Lange Nek + </string> + <string name="Long Pigtails"> + Long Pigtails + </string> + <string name="Long Ponytail"> + Lange Paardenstaart + </string> + <string name="Long Torso"> + Lang Torso + </string> + <string name="Long arms"> + Lange Armen + </string> + <string name="Longcuffs"> + Longcuffs + </string> + <string name="Loose Pants"> + Losse Broek + </string> + <string name="Loose Shirt"> + Los Shirt + </string> + <string name="Loose Sleeves"> + Losse Mouwen + </string> + <string name="Love Handles"> + Love Handles + </string> + <string name="Low"> + Laag + </string> + <string name="Low Heels"> + Lage Hielen + </string> + <string name="Low Jaw"> + Lage Kaak + </string> + <string name="Low Platforms"> + Lage Platforms + </string> + <string name="Low and Loose"> + Laag en Los + </string> + <string name="Lower"> + Lager + </string> + <string name="Lower Bridge"> + Lagere Brug + </string> + <string name="Lower Cheeks"> + Lagere Wangen + </string> + <string name="Male"> + Man + </string> + <string name="Middle Part"> + Middelste Deel + </string> + <string name="More"> + Meer + </string> + <string name="More Blush"> + Meer Blozen + </string> + <string name="More Body Fat"> + Meer Lichaams Vet + </string> + <string name="More Curtains"> + More Curtains + </string> + <string name="More Eyeshadow"> + Meer Oogshadow + </string> + <string name="More Freckles"> + Meer Sproeten + </string> + <string name="More Full"> + Meer Vol + </string> + <string name="More Gravity"> + Meer Zwaartekracht + </string> + <string name="More Lipstick"> + Meer Lippenstift + </string> + <string name="More Love"> + Meer Lovehandels + </string> + <string name="More Lower Lip"> + Meer Onder Lip + </string> + <string name="More Muscles"> + Meer Spieren + </string> + <string name="More Muscular"> + Meer Spieren + </string> + <string name="More Rosy"> + More Rosy + </string> + <string name="More Round"> + Meer Rond + </string> + <string name="More Saddle"> + Meer Heupen + </string> + <string name="More Sloped"> + Meer Hellend + </string> + <string name="More Square"> + Meer Vierkant + </string> + <string name="More Upper Lip"> + Meer Boven Lip + </string> + <string name="More Vertical"> + Meer Verticaal + </string> + <string name="More Volume"> + Meer Volume + </string> + <string name="More soul"> + Meer ziel + </string> + <string name="Moustache"> + Snor + </string> + <string name="Mouth Corner"> + Mond Hoek + </string> + <string name="Mouth Position"> + Mond Positie + </string> + <string name="Mowhawk"> + Hanekam + </string> + <string name="Muscular"> + Gespiert + </string> + <string name="Mutton Chops"> + Mutton Chops + </string> + <string name="Nail Polish"> + Nagel Lak + </string> + <string name="Nail Polish Color"> + Nagel Lak Kleur + </string> + <string name="Narrow"> + Smal + </string> + <string name="Narrow Back"> + Smalle Achterkant + </string> + <string name="Narrow Front"> + Smalle Voorkant + </string> + <string name="Narrow Lips"> + Smalle Lippen + </string> + <string name="Natural"> + Natural + </string> + <string name="Neck Length"> + Nek Lengte + </string> + <string name="Neck Thickness"> + Nek Dikheid + </string> + <string name="No Blush"> + Geen Bloos + </string> + <string name="No Eyeliner"> + Geen Eyeliner + </string> + <string name="No Eyeshadow"> + Geen Oogschaduw + </string> + <string name="No Heels"> + Geen Hakken + </string> + <string name="No Lipgloss"> + Geen Lipgloss + </string> + <string name="No Lipstick"> + Geen Lippenstift + </string> + <string name="No Part"> + Geen Deel + </string> + <string name="No Polish"> + Geen Glans + </string> + <string name="No Red"> + Geen Rood + </string> + <string name="No Spikes"> + Geen Stekels + </string> + <string name="No White"> + Geen Wit + </string> + <string name="No Wrinkles"> + Geen Rimpels + </string> + <string name="Normal Lower"> + Normaal Onder + </string> + <string name="Normal Upper"> + Normaal Boven + </string> + <string name="Nose Left"> + Neus Links + </string> + <string name="Nose Right"> + Neus Rechts + </string> + <string name="Nose Size"> + Neus Grootte + </string> + <string name="Nose Thickness"> + Neus Dickheid + </string> + <string name="Nose Tip Angle"> + Neus Top Hoek + </string> + <string name="Nose Tip Shape"> + Neus Top Vorm + </string> + <string name="Nose Width"> + Neus Breedte + </string> + <string name="Nostril Division"> + Nostril Division + </string> + <string name="Nostril Width"> + Neusgat Breedte + </string> + <string name="Old"> + Oud + </string> + <string name="Opaque"> + Ondoorzichtig + </string> + <string name="Open"> + Open + </string> + <string name="Open Back"> + Open Achterkant + </string> + <string name="Open Front"> + Open Voorkant + </string> + <string name="Open Left"> + Open Links + </string> + <string name="Open Right"> + Open Rechts + </string> + <string name="Orange"> + Oranje + </string> + <string name="Out"> + Uit + </string> + <string name="Out Shdw Color"> + Buitenste Schaduw Kleur + </string> + <string name="Out Shdw Opacity"> + Buitenste Schaduw Opaciteit + </string> + <string name="Outer Eye Corner"> + Buitenste Oog Hoek + </string> + <string name="Outer Eye Shadow"> + Buitenste Oog Schaduw + </string> + <string name="Outer Shadow"> + Buitenste Schaduw + </string> + <string name="Overbite"> + Overbeet + </string> + <string name="Package"> + Genitaliën + </string> + <string name="Painted Nails"> + Gelakte Nagels + </string> + <string name="Pale"> + Dof + </string> + <string name="Pants Crotch"> + Broek Kruis + </string> + <string name="Pants Fit"> + Broek Passend + </string> + <string name="Pants Length"> + Broek Lengte + </string> + <string name="Pants Waist"> + Broek Teille + </string> + <string name="Pants Wrinkles"> + Broek Rimpels + </string> + <string name="Part"> + Deel + </string> + <string name="Part Bangs"> + Part Bangs + </string> + <string name="Pectorals"> + Borstspieren + </string> + <string name="Pigment"> + Pigment + </string> + <string name="Pigtails"> + Pigtails + </string> + <string name="Pink"> + Roze + </string> + <string name="Pinker"> + Rozer + </string> + <string name="Platform Height"> + Platform Hoogte + </string> + <string name="Platform Width"> + Platform Breedte + </string> + <string name="Pointy"> + Puntig + </string> + <string name="Pointy Heels"> + Puntige Hielen + </string> + <string name="Pointy Toe"> + Puntige Tenen + </string> + <string name="Ponytail"> + Paardenstaard + </string> + <string name="Poofy Skirt"> + Poofy Skirt + </string> + <string name="Pop Left Eye"> + Asymmetrisch Links + </string> + <string name="Pop Right Eye"> + Asymmetrisch Rechts + </string> + <string name="Puffy"> + Opgezwollen + </string> + <string name="Puffy Eyelids"> + Opgezwollen Oogleden + </string> + <string name="Rainbow Color"> + Regenboog Kleur + </string> + <string name="Red Hair"> + Rood Haar + </string> + <string name="Red Skin"> + Rode Huid + </string> + <string name="Regular"> + Normaal + </string> + <string name="Regular Muscles"> + Normale Spieren + </string> + <string name="Right Part"> + Rechter Deel + </string> + <string name="Rosy Complexion"> + Rosy Complexion + </string> + <string name="Round"> + Rond + </string> + <string name="Round Forehead"> + Rond Voorhoofd + </string> + <string name="Ruddiness"> + Rossige kleur + </string> + <string name="Ruddy"> + Rossig + </string> + <string name="Rumpled Hair"> + Rumpled Hair + </string> + <string name="Saddle Bags"> + Saddle Bags + </string> + <string name="Saddlebags"> + Saddlebags + </string> + <string name="Scrawny"> + Magere + </string> + <string name="Scrawny Leg"> + Mager Been + </string> + <string name="Separate"> + Scheiden + </string> + <string name="Shading"> + Shading + </string> + <string name="Shadow hair"> + Schaduw Haar + </string> + <string name="Shallow"> + Ondiep + </string> + <string name="Shear Back"> + Shear Back + </string> + <string name="Shear Face"> + Shear Face + </string> + <string name="Shear Front"> + Shear Front + </string> + <string name="Shear Left"> + Shear Left + </string> + <string name="Shear Left Up"> + Shear Left Up + </string> + <string name="Shear Right"> + Shear Right + </string> + <string name="Shear Right Up"> + Shear Right Up + </string> + <string name="Sheared Back"> + Sheared Back + </string> + <string name="Sheared Front"> + Sheared Front + </string> + <string name="Shift Left"> + Verplaats Links + </string> + <string name="Shift Mouth"> + Verplaats Mond + </string> + <string name="Shift Right"> + Verplaats Rechts + </string> + <string name="Shirt Bottom"> + Hemd Onderkant + </string> + <string name="Shirt Fit"> + Hemd Passend + </string> + <string name="Shirt Wrinkles"> + Hemd Rimpels + </string> + <string name="Shoe Height"> + Schoen Hoogte + </string> + <string name="Short"> + Kort + </string> + <string name="Short Arms"> + Korte Armen + </string> + <string name="Short Legs"> + Korte Benen + </string> + <string name="Short Neck"> + Korte Nek + </string> + <string name="Short Pigtails"> + Short Pigtails + </string> + <string name="Short Ponytail"> + Korte Paardenstaart + </string> + <string name="Short Sideburns"> + Korte Bakkebaarden + </string> + <string name="Short Torso"> + Korte Torso + </string> + <string name="Short hips"> + Korte Heupen + </string> + <string name="Shoulders"> + Shouders + </string> + <string name="Side Bangs"> + Side Bangs + </string> + <string name="Side Bangs Down"> + Side Bangs Down + </string> + <string name="Side Bangs Up"> + Side Bangs Up + </string> + <string name="Side Fringe"> + Side Fringe + </string> + <string name="Sideburns"> + Bakkebaarden + </string> + <string name="Sides Hair"> + Sides Hair + </string> + <string name="Sides Hair Down"> + Sides Hair Down + </string> + <string name="Sides Hair Up"> + Sides Hair Up + </string> + <string name="Skinny"> + Broodmager + </string> + <string name="Skinny Neck"> + Smalle Nek + </string> + <string name="Skirt Fit"> + Skirt Fit + </string> + <string name="Skirt Length"> + Rok Lengte + </string> + <string name="Slanted Forehead"> + Schuin voorhoofd + </string> + <string name="Sleeve Length"> + Mouw Lengte + </string> + <string name="Sleeve Looseness"> + Mouw Losheid + </string> + <string name="Slit Back"> + Spleet: Achter + </string> + <string name="Slit Front"> + Spleet: Voor + </string> + <string name="Slit Left"> + Spleet: Links + </string> + <string name="Slit Right"> + Spleet: Rechts + </string> + <string name="Small"> + Klein + </string> + <string name="Small Hands"> + Kleine Handen + </string> + <string name="Small Head"> + Klein Hoofd + </string> + <string name="Smooth"> + Glad + </string> + <string name="Smooth Hair"> + Glad Haar + </string> + <string name="Socks Length"> + Sok Lengte + </string> + <string name="Some"> + enkele + </string> + <string name="Soulpatch"> + Soulpatch + </string> + <string name="Sparse"> + Schaars + </string> + <string name="Spiked Hair"> + Puntig Haar + </string> + <string name="Square"> + Vierkant + </string> + <string name="Square Toe"> + Vierkante Teen + </string> + <string name="Squash Head"> + Squash Head + </string> + <string name="Squash/Stretch Head"> + Squash/Stretch Head + </string> + <string name="Stretch Head"> + Uitgerekt Hoofd + </string> + <string name="Sunken"> + Verzonken + </string> + <string name="Sunken Chest"> + Verzonken Borstkas + </string> + <string name="Sunken Eyes"> + Verzonken Ogen + </string> + <string name="Sweep Back"> + Sweep Back + </string> + <string name="Sweep Forward"> + Sweep Forward + </string> + <string name="Swept Back"> + Swept Back + </string> + <string name="Swept Back Hair"> + Swept Back Hair + </string> + <string name="Swept Forward"> + Swept Forward + </string> + <string name="Swept Forward Hair"> + Swept Forward Hair + </string> + <string name="Tall"> + Lang + </string> + <string name="Taper Back"> + Spits Achter + </string> + <string name="Taper Front"> + Spits Voor + </string> + <string name="Thick Heels"> + Dikke Hielen + </string> + <string name="Thick Neck"> + Dikke Nek + </string> + <string name="Thick Toe"> + Dikke Teen + </string> + <string name="Thickness"> + Dikheid + </string> + <string name="Thin"> + Dun + </string> + <string name="Thin Eyebrows"> + Dunne Wenkbrouwen + </string> + <string name="Thin Lips"> + Dunne Lippen + </string> + <string name="Thin Nose"> + Dunne Neus + </string> + <string name="Tight Chin"> + Strakke Kin + </string> + <string name="Tight Cuffs"> + Strakke Manchetten + </string> + <string name="Tight Pants"> + Strakke Broek + </string> + <string name="Tight Shirt"> + Strak Hemd + </string> + <string name="Tight Skirt"> + Strakke Rok + </string> + <string name="Tight Sleeves"> + Strakke Mouwen + </string> + <string name="Tilt Left"> + Tilt Left + </string> + <string name="Tilt Right"> + Tilt Right + </string> + <string name="Toe Shape"> + Teen Vorm + </string> + <string name="Toe Thickness"> + Teen Dikheid + </string> + <string name="Torso Length"> + Borstkas Lengte + </string> + <string name="Torso Muscles"> + Borstkas Spieren + </string> + <string name="Torso Scrawny"> + Magere Borstkas + </string> + <string name="Unattached"> + Niet Verbonden + </string> + <string name="Uncreased"> + Uncreased + </string> + <string name="Underbite"> + onderbeet + </string> + <string name="Unnatural"> + Onnatuurlijk + </string> + <string name="Upper Bridge"> + Boven Brug + </string> + <string name="Upper Cheeks"> + Bovenste Wangen + </string> + <string name="Upper Chin Cleft"> + Bovenste Kin Gespleten + </string> + <string name="Upper Eyelid Fold"> + Bovenste Ooglid Gevouwen + </string> + <string name="Upturned"> + Omgekeerde + </string> + <string name="Very Red"> + Erg Rood + </string> + <string name="Waist Height"> + Taille Hoogte + </string> + <string name="Well-Fed"> + Goed Gevoed + </string> + <string name="White Hair"> + Wit Haar + </string> + <string name="Wide"> + Breed + </string> + <string name="Wide Back"> + Breede Achterkant + </string> + <string name="Wide Front"> + Breed Voorkant + </string> + <string name="Wide Lips"> + Breed Lippen + </string> + <string name="Wild"> + Wild + </string> + <string name="Wrinkles"> + Rimpels + </string> + <string name="LocationCtrlAddLandmarkTooltip"> + Add to My Landmarks + </string> + <string name="LocationCtrlEditLandmarkTooltip"> + Edit My Landmark + </string> + <string name="LocationCtrlInfoBtnTooltip"> + See more info about the current location + </string> + <string name="LocationCtrlComboBtnTooltip"> + My location history + </string> + <string name="UpdaterWindowTitle"> + [APP_NAME] Update + </string> + <string name="UpdaterNowUpdating"> + Now updating [APP_NAME]... + </string> + <string name="UpdaterNowInstalling"> + Installing [APP_NAME]... + </string> + <string name="UpdaterUpdatingDescriptive"> + Your [APP_NAME] Viewer is being updated to the latest release. This may take some time, so please be patient. + </string> + <string name="UpdaterProgressBarTextWithEllipses"> + Downloading update... + </string> + <string name="UpdaterProgressBarText"> + Downloading update + </string> + <string name="UpdaterFailDownloadTitle"> + Failed to download update + </string> + <string name="UpdaterFailUpdateDescriptive"> + An error occurred while updating [APP_NAME]. Please download the latest version from www.secondlife.com. + </string> + <string name="UpdaterFailInstallTitle"> + Failed to install update + </string> + <string name="UpdaterFailStartTitle"> + Failed to start viewer + </string> + <string name="IM_logging_string"> + -- Instant message logging enabled -- + </string> + <string name="IM_typing_start_string"> + [NAME] is typing... + </string> + <string name="Unnamed"> + (Unnamed) + </string> + <string name="IM_moderated_chat_label"> + (Moderated: Voices off by default) + </string> + <string name="IM_unavailable_text_label"> + Text chat is not available for this call. + </string> + <string name="IM_muted_text_label"> + Your text chat has been disabled by a Group Moderator. + </string> + <string name="IM_default_text_label"> + Click here to instant message. + </string> + <string name="IM_to_label"> + To + </string> + <string name="IM_moderator_label"> + (Moderator) </string> - <string name="ScriptQuestionCautionChatGranted"> - '[OBJECTNAME]', een object van '[OWNERNAME]', gevestigd in [REGIONNAME] op [REGIONPOS], is toestemming verleend om te: [PERMISSIONS]. - </string> - <string name="ScriptQuestionCautionChatDenied"> - '[OBJECTNAME]', een object van '[OWNERNAME]', gevestigd in [REGIONNAME] op [REGIONPOS], is toestemming geweigerd om te: [PERMISSIONS]. - </string> - <string name="ScriptTakeMoney"> - Linden dollars (L$) van u wegnemen - </string> - <string name="ActOnControlInputs"> - Acteren op uw bedieningsinvoer - </string> - <string name="RemapControlInputs"> - Uw bedieningsinvoer herdefiniëren - </string> - <string name="AnimateYourAvatar"> - Animeer uw avatar - </string> - <string name="AttachToYourAvatar"> - Bevestig aan uw avatar - </string> - <string name="ReleaseOwnership"> - Eigendom vrijgeven en openbaar worden - </string> - <string name="LinkAndDelink"> - Koppelen met en ontkoppelen van andere objecten - </string> - <string name="AddAndRemoveJoints"> - Toevoegen en verwijderen koppelingen met andere objecten - </string> - <string name="ChangePermissions"> - Wijzig zijn permissies - </string> - <string name="TrackYourCamera"> - Volg uw camera - </string> - <string name="ControlYourCamera"> - Bedien uw camera - </string> - <string name="only_user_message"> U bent de enige gebruiker in deze sessie. </string> @@ -626,31 +3246,4 @@ <string name="close_on_no_ability"> U heeft niet langer de mogelijkheid om in deze chatsessie te zijn. </string> - <string name="AcctTypeResident"> - Inwoner - </string> - <string name="AcctTypeTrial"> - Proef - </string> - <string name="AcctTypeCharterMember"> - Charter lid - </string> - <string name="AcctTypeEmployee"> - Linden Lab werknemer - </string> - <string name="PaymentInfoUsed"> - Betalingsinformatie gebruikt - </string> - <string name="PaymentInfoOnFile"> - Betalingsinformatie aanwezig - </string> - <string name="NoPaymentInfoOnFile"> - Geen betalingsinfo aanwezig - </string> - <string name="AgeVerified"> - Leeftijd geverifieerd - </string> - <string name="NotAgeVerified"> - Leeftijd niet geverifieerd - </string> </strings> diff --git a/indra/newview/skins/default/xui/nl/teleport_strings.xml b/indra/newview/skins/default/xui/nl/teleport_strings.xml index ff43e0f32f..12a81447c0 100644 --- a/indra/newview/skins/default/xui/nl/teleport_strings.xml +++ b/indra/newview/skins/default/xui/nl/teleport_strings.xml @@ -2,12 +2,12 @@ <teleport_messages> <message_set name="errors"> <message name="invalid_tport"> - Er is een probleem opgetreden bij het verwerken van uw verzoek voor een teleport. U dient wellicht opnieuw in te loggen voor uw kunt teleporteren. Wanneer u deze boodschap blijft ontvangen, controleert u dan alstublieft de Tech Support FAQ op: -www.secondlife.com/support + Probleem ondervonden bij het verwerken van uw verzoek voor een teleport. Het kan nodig zijn om opnieuw in te loggen voordat u kunt teleporteren. +Als u dit bericht blijft krijgen, controleert u dan alstublieft [SUPPORT_SITE]. </message> <message name="invalid_region_handoff"> - Er is een probleem opgetreden bij het oversteken naar een andere regio. U dient wellicht opnieuw in te loggen voor uw kunt oversteken naar andere regio's. Wanneer u deze boodschap blijft ontvangen, controleert u dan alstublieft de Tech Support FAQ op: -www.secondlife.com/support + Er is een probleem opgetreden bij het oversteken naar een andere regio. U dient wellicht opnieuw in te loggen voor uw kunt oversteken naar andere regio's. +Als u dit bericht blijft krijgen, controleert u dan alstublieft [SUPPORT_SITE]. </message> <message name="blocked_tport"> Sorry, teleport is momenteel geblokkeerd. Probeer het zo meteen opnieuw. Indien u nog steeds niet kunt teleporteren, log dan alstublieft uit en weer in om het probleem te verhelpen. diff --git a/indra/newview/skins/default/xui/pl/floater_about.xml b/indra/newview/skins/default/xui/pl/floater_about.xml index 29a5aca90d..b49247c4bf 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_about.xml +++ b/indra/newview/skins/default/xui/pl/floater_about.xml @@ -8,7 +8,7 @@ Buduj z [COMPILER] wersjÄ… [COMPILER_VERSION] </floater.string> <floater.string name="AboutPosition"> - Znajdujesz siÄ™ na pozycji [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] w [REGION] zlokalizowanym w [HOSTNAME] ([HOSTIP]) + PoÅ‚ożenie [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] w [REGION] zlokalizowanym w <nolink>[HOSTNAME]</nolink> ([HOSTIP]) [SERVER_VERSION] [[SERVER_RELEASE_NOTES_URL] [ReleaseNotes]] </floater.string> @@ -16,18 +16,18 @@ Procesor: [CPU] Pamięć: [MEMORY_MB] MB Wersja OS: [OS_VERSION] -Graphics Card Vendor: [GRAPHICS_CARD_VENDOR] -Karta Graficzna: [GRAPHICS_CARD] +Sprzedawca karty graficznej: [GRAPHICS_CARD_VENDOR] +Karta graficzna: [GRAPHICS_CARD] </floater.string> <floater.string name="AboutDriver"> - Windows Sterownik Karty Graficznej: [GRAPHICS_DRIVER_VERSION] + Windows Sterownik karty graficznej: [GRAPHICS_DRIVER_VERSION] </floater.string> <floater.string name="AboutLibs"> Wersja OpenGL: [OPENGL_VERSION] Wersja libcurl: [LIBCURL_VERSION] -Wersja Dekodera J2C: [J2C_VERSION] -Wersja Sterownika Audio: [AUDIO_DRIVER_VERSION] +Wersja dekodera J2C: [J2C_VERSION] +Wersja sterownika audio: [AUDIO_DRIVER_VERSION] Wersja Qt Webkit: [QT_WEBKIT_VERSION] Wersja Vivox: [VIVOX_VERSION] </floater.string> @@ -35,21 +35,19 @@ Wersja Vivox: [VIVOX_VERSION] (żadne) </floater.string> <floater.string name="AboutTraffic"> - Stracone Pakiety: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%) + Stracone pakiety: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%) </floater.string> <tab_container name="about_tab"> <panel label="Info" name="support_panel"> - <button label="Kopiuj do Schowka" name="copy_btn"/> + <button label="Kopiuj do schowka" name="copy_btn"/> </panel> <panel label="PodziÄ™kowania" name="credits_panel"> <text_editor name="credits_editor"> - Second Life zostaÅ‚o stworzone dla Was przez: Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl i wielu innych. + Second Life zostaÅ‚o stworzone dla Was przez: Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les and many others. - PodziÄ™kowania dla nastÄ™pujÄ…cych rezydentów za pomoc w pracy nad obecnÄ… wersjÄ… Second Life: able whitman, Adeon Writer, adonaira aabye, Aeron Kohime, Agathos Frascati, Aimee Trescothick, Aleric Inglewood, Alissa Sabre, Aminom Marvin, Angela Talamasca, Aralara Rajal, Armin Weatherwax, Ashrilyn Hayashida, Athanasius Skytower, Aura Dirval, Barney Boomslang, Biancaluce Robbiani, Biker Offcourse, Borg Capalini, Bulli Schumann, catherine pfeffer, Chalice Yao, Corre Porta, Court Goodman, Cummere Mayo, Dale Innis, Darien Caldwell, Darjeeling Schoonhoven, Daten Thielt, dimentox travanti, Dirk Talamasca, Drew Dwi, Duckless Vandyke, Elanthius Flagstaff, Electro Burnstein, emiley tomsen, Escort DeFarge, Eva Rau, Ezian Ecksol, Fire Centaur, Fluf Fredriksson, Francisco Koolhoven, Frontera Thor, Frungi Stastny, Gally Young, gearsawe stonecutter, Gigs Taggart, Gordon Wendt, Gudmund Shepherd, Gypsy Paz, Harleen Gretzky, Henri Beauchamp, Inma Rau, Irene Muni, Iskar Ariantho, Jacek Antonelli, JB Kraft, Jessicka Graves, Joeseph Albanese, Joshua Philgarlic, Khyota Wulluf, kirstenlee Cinquetti, Latif Khalifa, Lex Neva, Lilibeth Andree, Lisa Lowe, Lunita Savira, Loosey Demonia, lum pfohl, Marcos Fonzarelli, MartinRJ Fayray, Marusame Arai, Matthew Dowd, Maya Remblai, McCabe Maxsted, Meghan Dench, Melchoir Tokhes, Menos Short, Michelle2 Zenovka, Mimika Oh, Minerva Memel, Mm Alder, Ochi Wolfe, Omei Turnbull, Pesho Replacement, Phantom Ninetails, phoenixflames kukulcan, Polo Gufler, prez pessoa, princess niven, Prokofy Neva, Qie Niangao, Rem Beattie, RodneyLee Jessop, Saijanai Kuhn, Seg Baphomet, Sergen Davies, Shirley Marquez, SignpostMarv Martin, Sindy Tsure, Sira Arbizu, Skips Jigsaw, Sougent Harrop, Spritely Pixel, Squirrel Wood, StarSong Bright, Subversive Writer, Sugarcult Dagger, Sylumm Grigorovich, Tammy Nowotny, Tanooki Darkes, Tayra Dagostino, Theoretical Chemistry, Thickbrick Sleaford, valerie rosewood, Vex Streeter, Vixen Heron, Whoops Babii, Winter Ventura, Xiki Luik, Yann Dufaux, Yina Yao, Yukinoroh Kamachi, Zolute Infinity, Zwagoth Klaar - - - - I get by with a little help from my friends. --Richard Starkey +PodziÄ™kowania dla nastÄ™pujÄ…cych rezydentów za pomoc w pracy nad obecnÄ… wersjÄ… Second Life: (in progress) +It is a rare mind indeed that can render the hitherto non-existent blindingly obvious. The cry 'I could have thought of that' is a very popular and misleading one, for the fact is that they didn't, and a very significant and revealing fact it is too. + -- Douglas Adams </text_editor> </panel> <panel label="Licencje" name="licenses_panel"> diff --git a/indra/newview/skins/default/xui/pl/floater_about_land.xml b/indra/newview/skins/default/xui/pl/floater_about_land.xml index d456ea26b4..163868f200 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_about_land.xml +++ b/indra/newview/skins/default/xui/pl/floater_about_land.xml @@ -1,7 +1,68 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="floaterland" title="O POSIADÅOÅšCI"> + <floater.string name="maturity_icon_general"> + "Parcel_PG_Dark" + </floater.string> + <floater.string name="maturity_icon_moderate"> + "Parcel_M_Dark" + </floater.string> + <floater.string name="maturity_icon_adult"> + "Parcel_R_Dark" + </floater.string> + <floater.string name="Minutes"> + [MINUTES] minuty + </floater.string> + <floater.string name="Minute"> + minuta + </floater.string> + <floater.string name="Seconds"> + [SECONDS] sekundy + </floater.string> + <floater.string name="Remaining"> + pozostaÅ‚y + </floater.string> <tab_container name="landtab"> - <panel label="Ogólne" name="land_general_panel"> + <panel label="OGÓLNE" name="land_general_panel"> + <panel.string name="new users only"> + Tylko nowi Rezydenci + </panel.string> + <panel.string name="anyone"> + Każdy + </panel.string> + <panel.string name="area_text"> + Obszar: + </panel.string> + <panel.string name="area_size_text"> + [AREA] m² + </panel.string> + <panel.string name="auction_id_text"> + Numer aukcji: [ID] + </panel.string> + <panel.string name="need_tier_to_modify"> + Musisz zaakceptować zakup by móc modyfikować PosiadÅ‚ość. + </panel.string> + <panel.string name="group_owned_text"> + (WÅ‚asność Grupy) + </panel.string> + <panel.string name="profile_text"> + Profil... + </panel.string> + <panel.string name="info_text"> + Info... + </panel.string> + <panel.string name="public_text"> + (publiczne) + </panel.string> + <panel.string name="none_text"> + (brak) + </panel.string> + <panel.string name="sale_pending_text"> + (Sprzedaż w toku realizacji) + </panel.string> + <panel.string name="no_selection_text"> + PosiadÅ‚ość nie wybrana. +Idź do Åšwiat > O PosiadÅ‚oÅ›ci albo wybierz innÄ… posiadÅ‚ość żeby pokazać jej dane. + </panel.string> <text name="Name:"> Nazwa: </text> @@ -26,14 +87,16 @@ <text name="OwnerText"> Leyla Linden </text> - <button label="Profile..." label_selected="Profile..." name="Profile..."/> <text name="Group:"> Grupa: </text> - <button label="Ustaw..." label_selected="Ustaw..." name="Set..."/> - <check_box label="UdostÄ™pnij przypisywanie na grupÄ™" name="check deed" tool_tip="Oficer grupy ma prawo przepisać prawo wÅ‚asnoÅ›ci posiadÅ‚oÅ›ci na grupÄ™. PosiadÅ‚ość wspierana jest przez przydziaÅ‚y pochodzÄ…ce od czÅ‚onków grupy."/> - <button label="Przypisz..." label_selected="Przypisz..." name="Deed..." tool_tip="Prawo przypisania posiadÅ‚oÅ›ci na grupÄ™ może dokonać jedynie oficer grupy."/> - <check_box label="WÅ‚aÅ›cicel dokonuje wpÅ‚at zwiÄ…zanych z posiadÅ‚oÅ›ciÄ…" name="check contrib" tool_tip="Kiedy posiadÅ‚ość zostaje przypisana na grupÄ™, poprzedni wÅ‚aÅ›ciciel realizuje wpÅ‚aty z niÄ… zwiÄ…zane w celu jej utrzymania."/> + <text name="GroupText"> + Leyla Linden + </text> + <button label="Ustaw" name="Set..."/> + <check_box label="UdostÄ™pnij przypisywanie na GrupÄ™" name="check deed" tool_tip="Oficer Grupy ma prawo przepisać prawo wÅ‚asnoÅ›ci PosiadÅ‚oÅ›ci na GrupÄ™. PosiadÅ‚ość wspierana jest przez przydziaÅ‚y pochodzÄ…ce od czÅ‚onków Grupy."/> + <button label="Przypisz" name="Deed..." tool_tip="Prawo przypisania PosiadÅ‚oÅ›ci na GrupÄ™ może dokonać jedynie oficer Grupy."/> + <check_box label="WÅ‚aÅ›cicel dokonuje wpÅ‚at zwiÄ…zanych z PosiadÅ‚oÅ›ciÄ…" name="check contrib" tool_tip="Kiedy PosiadÅ‚ość zostaje przypisana na GrupÄ™, poprzedni WÅ‚aÅ›ciciel realizuje wpÅ‚aty z niÄ… zwiÄ…zane w celu jej utrzymania."/> <text name="For Sale:"> Na Sprzedaż: </text> @@ -41,9 +104,9 @@ Nie </text> <text name="For Sale: Price L$[PRICE]."> - Cena: L$[PRICE] (L$[PRICE_PER_SQM]/m²). + Cena: [PRICE]L$ ([PRICE_PER_SQM]L$/m²). </text> - <button label="Sprzedaj PosiadÅ‚ość..." label_selected="Sprzedaj PosiadÅ‚ość..." name="Sell Land..."/> + <button label="Sprzedaj posiadÅ‚ość" name="Sell Land..."/> <text name="For sale to"> Na sprzedaż dla: [BUYER] </text> @@ -53,7 +116,7 @@ <text name="Selling with no objects in parcel."> Obiekty nie sÄ… zawarte w sprzedaży. </text> - <button label="Anuluj Sprzedaż" label_selected="Anuluj Sprzedaż" name="Cancel Land Sale"/> + <button label="Anuluj sprzedaż" label_selected="Anuluj sprzedaż" name="Cancel Land Sale"/> <text name="Claimed:"> Data: </text> @@ -73,138 +136,93 @@ 0 </text> <button label="Kup PosiadÅ‚ość..." label_selected="Kup PosiadÅ‚ość..." left="130" name="Buy Land..." width="125"/> - <button label="Kup dla Grupy..." label_selected="Kup dla Grupy..." name="Buy For Group..."/> + <button label="Skrypt" name="Scripts..."/> + <button label="Kup dla Grupy" name="Buy For Group..."/> <button label="Kup PrzepustkÄ™..." label_selected="Kup PrzeputkÄ™..." left="130" name="Buy Pass..." tool_tip="Przepustka udostÄ™pnia tymczasowy wstÄ™p na posiadÅ‚ość." width="125"/> - <button label="Porzuć z PosiadÅ‚oÅ›ci..." label_selected="Porzuć z PosiadÅ‚oÅ›ci..." name="Abandon Land..."/> - <button label="Odzyskaj PosiadÅ‚ość..." label_selected="Odzyskaj PosiadÅ‚ość..." name="Reclaim Land..."/> - <button label="Sprzedaż przez Lindenów..." label_selected="Sprzedaż przez Lindenów..." name="Linden Sale..." tool_tip="PosiadÅ‚ość musi mieć wÅ‚aÅ›ciciela, zawartość oraz nie może być wystawiona na aukcÄ™."/> - <panel.string name="new users only"> - Tylko nowi użytkownicy - </panel.string> - <panel.string name="anyone"> - Każdy - </panel.string> - <panel.string name="area_text"> - Obszar: - </panel.string> - <panel.string name="area_size_text"> - [AREA] m² - </panel.string> - <panel.string name="auction_id_text"> - Numer aukcji: [ID] - </panel.string> - <panel.string name="need_tier_to_modify"> - Musisz zaakceptować zakup by móc modyfikować posiadÅ‚ość. - </panel.string> - <panel.string name="group_owned_text"> - (WÅ‚asność Grupy) - </panel.string> - <panel.string name="profile_text"> - Profil... - </panel.string> - <panel.string name="info_text"> - Info... - </panel.string> - <panel.string name="public_text"> - (publiczne) + <button label="Porzuć PosiadÅ‚ość" name="Abandon Land..."/> + <button label="Odzyskaj PosiadÅ‚ość" name="Reclaim Land..."/> + <button label="Sprzedaż przez Lindenów" name="Linden Sale..." tool_tip="PosiadÅ‚ość musi mieć WÅ‚aÅ›ciciela, zawartość oraz nie może być wystawiona na AukcjÄ™."/> + </panel> + <panel label="UMOWA" name="land_covenant_panel"> + <panel.string name="can_resell"> + PosiadÅ‚ość zakupiona w tym Regionie może być odsprzedana. </panel.string> - <panel.string name="none_text"> - (brak) + <panel.string name="can_not_resell"> + PosiadÅ‚ość zakupiona w tym Regionie nie może być odsprzedana. </panel.string> - <panel.string name="sale_pending_text"> - (Sprzedaż w Toku Realizacji) + <panel.string name="can_change"> + PosiadÅ‚ość zakupiona w tym Regionie może być łączona/dzielona. </panel.string> - <panel.string name="no_selection_text"> - PosiadÅ‚ość nie wybrana. -Idź do Åšwiat > O PosiadÅ‚oÅ›ci albo wybierz innÄ… posiadÅ‚ość żeby pokazać jej dane. + <panel.string name="can_not_change"> + PosiadÅ‚ość zakupiona w tym Regionie nie może być +łączona/dzielona. </panel.string> - </panel> - <panel label="Umowa" name="land_covenant_panel"> <text name="estate_section_lbl"> MajÄ…tek: </text> - <text name="estate_name_lbl"> - Nazwa: - </text> - <text name="estate_name_text" left="115"> + <text left="115" name="estate_name_text"> Główne </text> <text name="estate_owner_lbl"> WÅ‚aÅ›ciciel: </text> - <text name="estate_owner_text" left="115"> + <text left="115" name="estate_owner_text"> (brak) </text> - <text_editor name="covenant_editor" left="115"> + <text_editor left="115" name="covenant_editor"> Ta posiadÅ‚ość nie wymaga żadej umowy. </text_editor> - <text name="covenant_timestamp_text" left="115"> + <text left="115" name="covenant_timestamp_text"> Ostatnia Modyfikacja Wed Dec 31 16:00:00 1969 </text> <text name="region_section_lbl"> Region: </text> - <text name="region_name_lbl"> - Nazwa: - </text> - <text name="region_name_text" left="115"> + <text left="115" name="region_name_text"> leyla </text> <text name="region_landtype_lbl"> Typ: </text> - <text name="region_landtype_text" left="115"> + <text left="115" name="region_landtype_text"> Region Główny / Ziemia </text> <text name="region_maturity_lbl"> Rodzaj: </text> - <text name="region_maturity_text" left="115"> + <text left="115" name="region_maturity_text"> 'Adult' </text> <text name="resellable_lbl"> Odsprzedaj: </text> - <text name="resellable_clause" width="338" left="115"> - PosiadÅ‚ość zakupiona w tym regionie nie może być odsprzedana. + <text left="115" name="resellable_clause"> + PosiadÅ‚ość zakupiona w tym Regionie nie może być odsprzedana. </text> <text name="changeable_lbl"> Podziel: </text> - <text name="changeable_clause" width="338" left="115"> - PosiadÅ‚ość zakupiona w tym regionie nie może być + <text left="115" name="changeable_clause"> + PosiadÅ‚ość zakupiona w tym Regionie nie może być łączona/dzielona. </text> - <panel.string name="can_resell"> - PosiadÅ‚ość zakupiona w tym regionie może być odsprzedana. - </panel.string> - <panel.string name="can_not_resell"> - PosiadÅ‚ość zakupiona w tym regionie nie może być odsprzedana. - </panel.string> - <panel.string name="can_change"> - PosiadÅ‚ość zakupiona w tym regionie może być łączona/dzielona. + </panel> + <panel label="OBIEKTY" name="land_objects_panel"> + <panel.string name="objects_available_text"> + [COUNT] z [MAX] ([AVAILABLE] jest dostÄ™pne) </panel.string> - <panel.string name="can_not_change"> - PosiadÅ‚ość zakupiona w tym regionie nie może być -łączona/dzielona. + <panel.string name="objects_deleted_text"> + [COUNT] z [MAX] ([DELETED] zostanie usuniÄ™te) </panel.string> - </panel> - <panel label="Obiekty" name="land_objects_panel"> <text name="parcel_object_bonus"> - Ilość Ekstra Obiektów: [BONUS] + Ilość ekstra obiektów: [BONUS] </text> <text name="Simulator primitive usage:"> - Ilość używanych primóww: + Ilość używanych primów: </text> <text name="objects_available" width="230"> [COUNT] z [MAX] ([AVAILABLE] jest dostÄ™pne) </text> - <panel.string name="objects_available_text"> - [COUNT] z [MAX] ([AVAILABLE] jest dostÄ™pne) - </panel.string> - <panel.string name="objects_deleted_text"> - [COUNT] z [MAX] ([DELETED] zostanie usuniÄ™te) - </panel.string> <text name="Primitives parcel supports:"> Maksymalna ilość primów: </text> @@ -212,19 +230,19 @@ Idź do Åšwiat > O PosiadÅ‚oÅ›ci albo wybierz innÄ… posiadÅ‚ość żeby pokaz [COUNT] </text> <text name="Primitives on parcel:"> - Primy na posiadÅ‚oÅ›ci: + Primy na PosiadÅ‚oÅ›ci: </text> <text name="total_objects_text"> [COUNT] </text> <text name="Owned by parcel owner:"> - WÅ‚aÅ›ciciela posiadÅ‚oÅ›ci: + WÅ‚aÅ›ciciela PosiadÅ‚oÅ›ci: </text> <text name="owner_objects_text"> [COUNT] </text> <button label="Pokaż" label_selected="Pokaż" name="ShowOwner"/> - <button label="Zwróć..." label_selected="Zwróć..." name="ReturnOwner..." tool_tip="Zwróć obiekty do ich wÅ‚aÅ›cicieli."/> + <button label="Zwróć" name="ReturnOwner..." tool_tip="Zwróć obiekty do ich WÅ‚aÅ›cicieli."/> <text name="Set to group:"> Grupy: </text> @@ -232,7 +250,7 @@ Idź do Åšwiat > O PosiadÅ‚oÅ›ci albo wybierz innÄ… posiadÅ‚ość żeby pokaz [COUNT] </text> <button label="Pokaż" label_selected="Pokaż" name="ShowGroup"/> - <button label="Zwróć..." label_selected="Zwróć..." name="ReturnGroup..." tool_tip="Zwróć obiekty do ich wÅ‚aÅ›cicieli.."/> + <button label="Zwróć" name="ReturnGroup..." tool_tip="Zwróć obiekty do ich WÅ‚aÅ›cicieli.."/> <text name="Owned by others:"> Innych Rezydentów: </text> @@ -240,7 +258,7 @@ Idź do Åšwiat > O PosiadÅ‚oÅ›ci albo wybierz innÄ… posiadÅ‚ość żeby pokaz [COUNT] </text> <button label="Pokaż" label_selected="Pokaż" name="ShowOther"/> - <button label="Zwróć..." label_selected="Zwróć..." name="ReturnOther..." tool_tip="Zwróć obiekty do ich wÅ‚aÅ›cicieli."/> + <button label="Zwróć" name="ReturnOther..." tool_tip="Zwróć obiekty do ich WÅ‚aÅ›cicieli."/> <text name="Selected / sat upon:"> Wybranych: </text> @@ -251,25 +269,55 @@ Idź do Åšwiat > O PosiadÅ‚oÅ›ci albo wybierz innÄ… posiadÅ‚ość żeby pokaz Zwracaj obiekty innych Rezydentów (minut, 0 = wyłącz): </text> <text name="Object Owners:" width="108"> - WÅ‚aÅ›ciciel Obiektów: + WÅ‚aÅ›ciciel obiektów: </text> - <button label="OdÅ›wież ListÄ™" label_selected="OdÅ›wież ListÄ™" left="112" name="Refresh List"/> + <button label="OdÅ›wież listÄ™" label_selected="OdÅ›wież listÄ™" left="112" name="Refresh List" tool_tip="Refresh Object List"/> <button label="Zwróć obiekty..." label_selected="Zwróć obiekty..." left="224" name="Return objects..."/> <name_list name="owner list"> - <column label="Typ" name="type"/> - <column name="online_status"/> - <column label="Nazwa" name="name"/> - <column label="Liczba" name="count"/> - <column label="Najbardziej aktualne" name="mostrecent"/> + <name_list.columns label="Typ" name="type"/> + <name_list.columns name="online_status"/> + <name_list.columns label="Nazwa" name="name"/> + <name_list.columns label="Liczba" name="count"/> + <name_list.columns label="Najbardziej aktualne" name="mostrecent"/> </name_list> </panel> - <panel label="Opcje" name="land_options_panel"> + <panel label="OPCJE" name="land_options_panel"> + <panel.string name="search_enabled_tooltip"> + UdostÄ™pnij wyÅ›wietlanie tej PosiadÅ‚oÅ›ci w wyszukiwarce + </panel.string> + <panel.string name="search_disabled_small_tooltip"> + Wybrana opcja jest wyłączona, ponieważ wielkość PosiadÅ‚oÅ›ci wynosi 128 m² bÄ…dź mniej. +Jedynie wiÄ™ksze posiadÅ‚oÅ›ci mogÄ… być umieszczone w bazie wyszukiwarki. + </panel.string> + <panel.string name="search_disabled_permissions_tooltip"> + Wybrana opcja jest wyłączona ponieważ nie posiadasz prawa do modyfikacji PosiadÅ‚oÅ›ci. + </panel.string> + <panel.string name="mature_check_mature"> + Treść 'Mature' + </panel.string> + <panel.string name="mature_check_adult"> + Treść 'Adult' + </panel.string> + <panel.string name="mature_check_mature_tooltip"> + Twoja PosiadÅ‚ość bÄ…dź treść jakÄ… zawiera klasyfikowana jest jako 'Mature'. + </panel.string> + <panel.string name="mature_check_adult_tooltip"> + Informacje o Twojej PosiadÅ‚oÅ›ci i treÅ›ci jakÄ… zawiera klasyfikowane sÄ… jako 'Adult'. + </panel.string> + <panel.string name="landing_point_none"> + (brak) + </panel.string> + <panel.string name="push_restrict_text"> + Popychanie niedozwolone + </panel.string> + <panel.string name="push_restrict_region_text"> + Popychanie niedozwolone (Ustawienie Regionu) + </panel.string> <text name="allow_label"> UdostÄ™pnij innym Rezydentom: </text> - <check_box label="Edytowanie Terenu" name="edit land check" tool_tip="Wybrana - każdy może ksztaÅ‚tować Twój teren. Najlepiej jest zostawić tÄ… opcjÄ™ nie wybranÄ…, Ty zawsze możesz ksztaÅ‚towć Twój teren."/> - <check_box label="Zapisywania Miejsca" name="check landmark"/> - <check_box label="Latanie" name="check fly" tool_tip="Wybrana - Rezydenci mogÄ… latać na Twojej posiadÅ‚oÅ›ci. Nie wybrana - mogÄ… tylko wlatywać do lub latać ponad TwojÄ… posiadÅ‚oÅ›ciÄ…."/> + <check_box label="Edytowanie Terenu" name="edit land check" tool_tip="Wybrana - każdy może ksztaÅ‚tować Twój teren. Najlepiej jest zostawić tÄ… opcjÄ™ nie wybranÄ…, Ty zawsze możesz ksztaÅ‚tować Twój teren."/> + <check_box label="Latanie" name="check fly" tool_tip="Wybrana - Rezydenci mogÄ… latać na Twojej PosiadÅ‚oÅ›ci. Nie jest wybrana - mogÄ… tylko wlatywać do lub latać ponad TwojÄ… PosiadÅ‚oÅ›ciÄ…."/> <text name="allow_label2"> Budowanie: </text> @@ -288,87 +336,39 @@ Idź do Åšwiat > O PosiadÅ‚oÅ›ci albo wybierz innÄ… posiadÅ‚ość żeby pokaz <text name="land_options_label"> Opcje PosiadÅ‚oÅ›ci: </text> - <check_box label="Bezpieczna (brak zniszczeÅ„)" name="check safe" tool_tip="Wybrana - posiadÅ‚ość jest bezpieczna - zniszczenia w walce sÄ… zablokowane. Nie wybrana - zniszczenia w walce sÄ… włączone."/> - <check_box label="Popychanie niedozwolone" name="PushRestrictCheck" tool_tip="Nie pozwalaj skryptom na popychanie. Wybranie tej opcji może być przydatne do ograniczenia zakłóceÅ„ spokoju w Twojej posiadÅ‚oÅ›ci."/> - <check_box label="WyÅ›wietlaj w wyszukiwarce (30L$/tyg.)" name="ShowDirectoryCheck" tool_tip="UdostÄ™pnij ukazywanie siÄ™ nazwy posiadÅ‚oÅ›ci w wyszukiwarce"/> - <panel.string name="search_enabled_tooltip"> - UdostÄ™pnij wyÅ›wietlanie tej posiadÅ‚oÅ›ci w wyszukiwarce - </panel.string> - <panel.string name="search_disabled_small_tooltip"> - Wybrana opcja jest wyłączona ze wzglÄ™du iż wielkość posiadÅ‚oÅ›ci wynosi 128 m² bÄ…dź mniej. -Jedynie wiÄ™ksze posiadÅ‚oÅ›ci mogÄ… być umieszczone w bazie wyszukiwarki. - </panel.string> - <panel.string name="search_disabled_permissions_tooltip"> - Wybrana opcja jest wyłączona ponieważ nie posiadasz prawa do modyfikacji posiadÅ‚oÅ›ci. - </panel.string> + <check_box label="Bezpieczna (brak zniszczeÅ„)" name="check safe" tool_tip="Wybrana - PosiadÅ‚ość jest bezpieczna - zniszczenia w walce sÄ… zablokowane. Nie jest wybrana - zniszczenia w walce sÄ… włączone."/> + <check_box label="Popychanie niedozwolone" name="PushRestrictCheck" tool_tip="Nie pozwalaj skryptom na popychanie. Wybranie tej opcji może być przydatne do ograniczenia zakłóceÅ„ spokoju w Twojej PosiadÅ‚oÅ›ci."/> + <check_box label="WyÅ›wietlaj w wyszukiwarce (30L$/tyg.)" name="ShowDirectoryCheck" tool_tip="UdostÄ™pnij ukazywanie siÄ™ nazwy PosiadÅ‚oÅ›ci w wyszukiwarce"/> <combo_box name="land category with adult"> - <combo_box.item name="item0" label="Każda Kategoria" - /> - <combo_box.item name="item1" label="Linden Lokacja" - /> - <combo_box.item name="item2" label="'Adult'" - /> - <combo_box.item name="item3" label="Sztuka i Kultura" - /> - <combo_box.item name="item4" label="Biznes" - /> - <combo_box.item name="item5" label="Edukacyjna" - /> - <combo_box.item name="item6" label="Gra" - /> - <combo_box.item name="item7" label="Poznawanie ludzi" - /> - <combo_box.item name="item8" label="Przyjazne dla nowych" - /> - <combo_box.item name="item9" label="Park i Natura" - /> - <combo_box.item name="item10" label="Mieszkalna" - /> - <combo_box.item name="item11" label="Zakupy" - /> - <combo_box.item name="item12" label="Inna" - /> + <combo_box.item label="Każda kategoria" name="item0"/> + <combo_box.item label="Linden Lokalizacja" name="item1"/> + <combo_box.item label="'Adult'" name="item2"/> + <combo_box.item label="Sztuka i kultura" name="item3"/> + <combo_box.item label="Biznes" name="item4"/> + <combo_box.item label="Edukacyjna" name="item5"/> + <combo_box.item label="Gra" name="item6"/> + <combo_box.item label="Poznawanie ludzi" name="item7"/> + <combo_box.item label="Przyjazne dla nowych" name="item8"/> + <combo_box.item label="Park i natura" name="item9"/> + <combo_box.item label="Mieszkalna" name="item10"/> + <combo_box.item label="Zakupy" name="item11"/> + <combo_box.item label="Inna" name="item12"/> </combo_box> <combo_box name="land category"> - <combo_box.item name="item0" label="Każda Kategoria" - /> - <combo_box.item name="item1" label="Linden Lokacja" - /> - <combo_box.item name="item3" label="Sztuka i Kultura" - /> - <combo_box.item name="item4" label="Biznes" - /> - <combo_box.item name="item5" label="Edukacyjna" - /> - <combo_box.item name="item6" label="Gra" - /> - <combo_box.item name="item7" label="Poznawanie ludzi" - /> - <combo_box.item name="item8" label="Przyjazna dla nowych" - /> - <combo_box.item name="item9" label="Parki i Natura" - /> - <combo_box.item name="item10" label="Mieszkalna" - /> - <combo_box.item name="item11" label="Zakupy" - /> - <combo_box.item name="item12" label="Inna" - /> + <combo_box.item label="Każda kategoria" name="item0"/> + <combo_box.item label="Linden Lokalizacja" name="item1"/> + <combo_box.item label="Sztuka i kultura" name="item3"/> + <combo_box.item label="Biznes" name="item4"/> + <combo_box.item label="Edukacyjna" name="item5"/> + <combo_box.item label="Gra" name="item6"/> + <combo_box.item label="Poznawanie ludzi" name="item7"/> + <combo_box.item label="Przyjazna dla nowych" name="item8"/> + <combo_box.item label="Parki i natura" name="item9"/> + <combo_box.item label="Mieszkalna" name="item10"/> + <combo_box.item label="Zakupy" name="item11"/> + <combo_box.item label="Inna" name="item12"/> </combo_box> - <button label="?" label_selected="?" name="?"/> <check_box label="Treść 'Mature'" name="MatureCheck" tool_tip=""/> - <panel.string name="mature_check_mature"> - Treść 'Mature' - </panel.string> - <panel.string name="mature_check_adult"> - Treść 'Adult' - </panel.string> - <panel.string name="mature_check_mature_tooltip"> - Twoja posiadÅ‚ość bÄ…dź treść jakÄ… zawiera klasyfikowana jest jako 'Mature'. - </panel.string> - <panel.string name="mature_check_adult_tooltip"> - Informacje o Twojej posiadÅ‚oÅ›ci i treÅ›ci jakÄ… zawiera klasyfikowane sÄ… jako 'Adult'. - </panel.string> <text name="Snapshot:"> ZdjÄ™cie: </text> @@ -376,38 +376,27 @@ Jedynie wiÄ™ksze posiadÅ‚oÅ›ci mogÄ… być umieszczone w bazie wyszukiwarki. <text name="landing_point"> Punkt LÄ…dowania: [LANDING] </text> - <panel.string name="landing_point_none"> - (brak) - </panel.string> <button label="Ustaw" label_selected="Ustaw" name="Set" tool_tip="Ustal miejsce lÄ…dowania dla przybywajÄ…cych goÅ›ci. Używa poÅ‚ożenia Twojego awatara na tej posiadÅ‚oÅ›ci."/> <button label="Nowy" label_selected="Nowy" name="Clear" tool_tip="Clear the landing point."/> <text name="Teleport Routing: "> - Trasa Teleportacji: - </text> - <combo_box name="landing type" tool_tip="Trasa Teleportacj-ustaw w jaki sposób bÄ™dzie sÄ™ odbywać proces telportacji w posiadÅ‚oÅ›ci."> - <combo_box.item name="Blocked" label="Zablokowana" - /> - <combo_box.item name="LandingPoint" label="Punkt LÄ…dowania" - /> - <combo_box.item name="Anywhere" label="Gdziekolwiek" - /> + Trasa teleportacji: + </text> + <combo_box name="landing type" tool_tip="Trasa teleportacj-ustaw w jaki sposób bÄ™dzie sÄ™ odbywać proces telportacji w PosiadÅ‚oÅ›ci."> + <combo_box.item label="Zablokowana" name="Blocked"/> + <combo_box.item label="Punkt LÄ…dowania" name="LandingPoint"/> + <combo_box.item label="Gdziekolwiek" name="Anywhere"/> </combo_box> - <panel.string name="push_restrict_text"> - Popychanie niedozwolone - </panel.string> - <panel.string name="push_restrict_region_text"> - Popychanie niedozwolone (Ustawienie Regionu) - </panel.string> </panel> - <panel label="Media" name="land_media_panel"> + <panel label="MEDIA" name="land_media_panel"> <text name="with media:"> - Typ Mediów: + Typ mediów: </text> <combo_box name="media type" tool_tip=""/> <text name="at URL:"> - URL Mediów: + URL mediów: </text> - <button label="Ustaw..." label_selected="Ustaw..." name="set_media_url"/> + <button label="Ustaw" name="set_media_url"/> + <check_box label="Ukryj URL mediów" name="hide_media_url" tool_tip="Wybranie tej opcji, zablokuje widok adresu do medów wszystkim nieautoryzowanym Użytkownikom. Nie dotyczy to jednak typów HTML."/> <text name="Description:"> Opis: </text> @@ -418,18 +407,9 @@ TeksturÄ™: </text> <texture_picker label="" name="media texture" tool_tip="Kliknij by wybrać zdjÄ™cie"/> <text name="replace_texture_help"> - (Obiekty używajÄ…ce tej tekstury bÄ™dÄ… wyÅ›wietlaÅ‚y -film lub stronÄ™ internetowÄ… po naciÅ›niÄ™ciu -przycisku odtwarzania.) - </text> - <text name="Options:"> - Opcje -Mediów: + Obiekty używajÄ…ce tej tekstury bÄ™dÄ… wyÅ›wietlaÅ‚y film lub stronÄ™ internetowÄ… po naciÅ›niÄ™ciu przycisku odtwarzania. Wybierz miniaturÄ™, jeÅ›li chcesz zmienić teksturÄ™. </text> <check_box label="Automatyczna Skala" name="media_auto_scale" tool_tip="Wybranie tej opcji dobierze odpowiedni rozmiar zawartoÅ›ci mediów dla tej posiadÅ‚oÅ›ci automatycznie. Może to mieć znaczÄ…cy wpÅ‚yw na jakość odtwarzanego materialu - może zwolnić i zmniejszyć jakość materiaÅ‚u."/> - <check_box label="Powtórka Odtwarzania" name="media_loop" tool_tip="Odtwarzaj media z powtórkÄ…. Po wyÅ›wietleniu materialu, rozpocznie siÄ™ odtwarzanie od poczÄ…tku."/> - <check_box label="Ukryj URL Mediów" name="hide_media_url" tool_tip="Wybranie tej opcji, zablokuje widok adresu do medów wszystkim nieautoryzowanym użytkownikom. Nie dotyczy to jednak typów HTML."/> - <check_box label="Ukryj URL Muzyki" name="hide_music_url" tool_tip="Wybranie tej opcji, zablokuje widok adresu do medów muzycznych w posiadÅ‚oÅ›ci wszystkim nieautoryzowanym użytkownikom"/> <text name="media_size" tool_tip="Rozmiar dla Å‚adowania mediów internetowych. Zostaw 0 dla ustawieÅ„ domyÅ›lnych."> Rozmiar: </text> @@ -438,56 +418,48 @@ Mediów: <text name="pixels"> pixeli </text> - <text name="MusicURL:"> - URL Muzyki: - </text> - <text name="Sound:"> - DźwiÄ™k: - </text> - <check_box label="Restrykcja obiektów oraz gestur dozwolonych w tej posiadÅ‚oÅ›ci" name="check sound local"/> - <button label="?" label_selected="?" name="?" left="432"/> - <text name="Voice settings:"> - GÅ‚os: + <text name="Options:"> + Opcje +Mediów: </text> - <check_box label="Rozmowy Dozwolone" name="parcel_enable_voice_channel"/> - <check_box label="Rozmowy Dozwolone (ustawione przez majÄ…tek)" name="parcel_enable_voice_channel_is_estate_disabled"/> - <check_box label="Ogranicz komunikacjÄ™ gÅ‚osowÄ… w tej posiadÅ‚oÅ›ci." name="parcel_enable_voice_channel_parcel"/> + <check_box label="Powtórka Odtwarzania" name="media_loop" tool_tip="Odtwarzaj media z powtórkÄ…. Po wyÅ›wietleniu materialu, rozpocznie siÄ™ odtwarzanie od poczÄ…tku."/> </panel> - <panel label="DostÄ™p" name="land_access_panel"> + <panel label="DŹWIĘK" name="land_audio_panel"> + <check_box label="Ukryj URL muzyki" name="hide_music_url" tool_tip="Wybranie tej opcji, zablokuje widok adresu do medów muzycznych w posiadÅ‚oÅ›ci wszystkim nieautoryzowanym Użytkownikom"/> + <check_box label="Rozmowy dozwolone" name="parcel_enable_voice_channel"/> + <check_box label="Rozmowy dozwolone (ustawione przez MajÄ…tek)" name="parcel_enable_voice_channel_is_estate_disabled"/> + <check_box label="Ogranicz komunikacjÄ™ gÅ‚osowÄ… w tej posiadÅ‚oÅ›ci." name="parcel_enable_voice_channel_local"/> + </panel> + <panel label="DOSTĘP" name="land_access_panel"> + <panel.string name="access_estate_defined"> + (Zdefiniowane przez MajÄ…tek) + </panel.string> + <panel.string name="allow_public_access"> + UdostÄ™pnij dostÄ™p publiczny ([MATURITY]) + </panel.string> + <panel.string name="estate_override"> + Jedna lub wiÄ™cej z tych opcji ustawiona jest z poziomu PosiadÅ‚oÅ›ci + </panel.string> <text name="Limit access to this parcel to:"> - DostÄ™p do tej posiadÅ‚oÅ›ci: + DostÄ™p do tej PosiadÅ‚oÅ›ci: </text> - <check_box label="Publiczny" name="public_access"/> + <check_box label="Publiczny [MATURITY]" name="public_access"/> <text name="Only Allow"> Zablokuj dostÄ™p dla: </text> - <check_box label="Rezydentów niezarejestrowanych w systemie pÅ‚atniczym z Linden Lab" name="limit_payment" tool_tip="Ban unidentified residents."/> - <check_box label="Rezydentów z brakiem weryfikacji wieku " name="limit_age_verified" tool_tip="Zbanuj Rezydetów bez weryfikacji wieku. Odwiedź support.secondlife.com po wiÄ™cej informacji."/> - <panel.string name="estate_override"> - Jedna lub wiÄ™cej z tych opcji ustawiona jest z poziomu posiadÅ‚oÅ›ci - </panel.string> - <check_box label="UdostÄ™pnij wejÅ›cie grupie: [GROUP]" name="GroupCheck" tool_tip="Ustaw grupÄ™ w głównej zakÅ‚adce"/> - <check_box label="Sprzedaj wejÅ›ciówki:" name="PassCheck" tool_tip="Otwórz tymczasowy dostÄ™p do tej posiadÅ‚oÅ›ci"/> + <check_box label="Rezydentów zarejestrowanych w systemie pÅ‚atniczym Linden Lab [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="Zbanuj Rezydentów niezarejestrowanych w systemie pÅ‚atniczym z Linden Lab."/> + <check_box label="Weryfikacja Wieku: [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="Zbanuj Rezydetów bez Weryfikacji Wieku. Odwiedź support.secondlife.com po wiÄ™cej informacji."/> + <check_box label="UdostÄ™pnij wejÅ›cie Grupie: [GROUP]" name="GroupCheck" tool_tip="Ustaw GrupÄ™ w głównej zakÅ‚adce"/> + <check_box label="Sprzedaj przepustki:" name="PassCheck" tool_tip="Otwórz tymczasowy dostÄ™p do tej PosiadÅ‚oÅ›ci"/> <combo_box name="pass_combo"> - <combo_box.item name="Anyone" label="Każdemu" - /> - <combo_box.item name="Group" label="Grupie" - /> + <combo_box.item label="Każdemu" name="Anyone"/> + <combo_box.item label="Grupie" name="Group"/> </combo_box> <spinner label="Cena w L$:" name="PriceSpin"/> <spinner label="Ilość godzin dostÄ™pu:" name="HoursSpin"/> - <text label="Zawsze udostÄ™pniaj" name="AllowedText"> - Dozwoleni Rezydenci - </text> - <name_list name="AccessList" tool_tip="([LISTED] na liÅ›cie, [MAX] max)"/> - <button label="Dodaj..." label_selected="Dodaj..." name="add_allowed"/> - <button label="UsuÅ„" label_selected="UsuÅ„" name="remove_allowed"/> - <text label="Ban" name="BanCheck"> - NieporzÄ…dani Rezydenci (bany) - </text> - <name_list name="BannedList" tool_tip="([LISTED] na liÅ›cie, [MAX] max)"/> - <button label="Dodaj..." label_selected="Dodaj..." name="add_banned"/> - <button label="UsuÅ„" label_selected="UsuÅ„" name="remove_banned"/> + <panel name="Allowed_layout_panel"> + <name_list name="AccessList" tool_tip="([LISTED] na liÅ›cie, [MAX] maksimum)"/> + </panel> </panel> </tab_container> </floater> diff --git a/indra/newview/skins/default/xui/pl/floater_activeim.xml b/indra/newview/skins/default/xui/pl/floater_activeim.xml new file mode 100644 index 0000000000..2a34409f8b --- /dev/null +++ b/indra/newview/skins/default/xui/pl/floater_activeim.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_activeim" title="AKTYWNY IM"/> diff --git a/indra/newview/skins/default/xui/pl/floater_animation_preview.xml b/indra/newview/skins/default/xui/pl/floater_animation_preview.xml index 0524b8ade3..ca06665c65 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_animation_preview.xml +++ b/indra/newview/skins/default/xui/pl/floater_animation_preview.xml @@ -1,172 +1,187 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="Animation Preview" title=""> + <floater.string name="failed_to_initialize"> + Inicjalizacja ruchu nie powiodÅ‚a siÄ™. + </floater.string> + <floater.string name="anim_too_long"> + DÅ‚ugość pliku animacji wynosi [LENGTH] sekund. + +Maksymalna dÅ‚ugość pliku animacji wynosi [MAX_LENGTH] sekund. + </floater.string> + <floater.string name="failed_file_read"> + Brak możliwoÅ›ci odczytania plików animacji do wyÅ›wietlenia. + +[STATUS] + </floater.string> + <floater.string name="E_ST_OK"> + Ok + </floater.string> + <floater.string name="E_ST_EOF"> + NiewÅ‚aÅ›ciwe zakoÅ„czenie nazwy pliku. + </floater.string> + <floater.string name="E_ST_NO_CONSTRAINT"> + Brak możliwoÅ›ci wyÅ›wietlenia definicji ograniczenia. + </floater.string> + <floater.string name="E_ST_NO_FILE"> + Plik BVH nie może zostać otworzony. + </floater.string> + <floater.string name="E_ST_NO_HIER"> + NiewÅ‚aÅ›ciwy nagłówek HIERARCHI. + </floater.string> + <floater.string name="E_ST_NO_JOINT"> + ROOT oraz JOINT nieodnalezione. + </floater.string> + <floater.string name="E_ST_NO_NAME"> + Brak nazwy JOINT. + </floater.string> + <floater.string name="E_ST_NO_OFFSET"> + OFFSET nieodnalezione. + </floater.string> + <floater.string name="E_ST_NO_CHANNELS"> + CHANNELS nieodnalezione. + </floater.string> + <floater.string name="E_ST_NO_ROTATION"> + Brak otrzymania kolejnoÅ›ci obrotu. + </floater.string> + <floater.string name="E_ST_NO_AXIS"> + Brak osi obrotu. + </floater.string> + <floater.string name="E_ST_NO_MOTION"> + MOTION nieodnalezione. + </floater.string> + <floater.string name="E_ST_NO_FRAMES"> + Brak otrzymania liczby klatek obrazu. + </floater.string> + <floater.string name="E_ST_NO_FRAME_TIME"> + Brak otrzymania czasu dla iloÅ›ci klatek obrazu. + </floater.string> + <floater.string name="E_ST_NO_POS"> + Brak otrzymania wartoÅ›ci pozycji. + </floater.string> + <floater.string name="E_ST_NO_ROT"> + Nie można odczytać wartoÅ›ci obrotu. + </floater.string> + <floater.string name="E_ST_NO_XLT_FILE"> + Nie można otworzyć pliku tÅ‚umaczenia. + </floater.string> + <floater.string name="E_ST_NO_XLT_HEADER"> + Nie można przeczytać tÅ‚umaczenia nagłówka. + </floater.string> + <floater.string name="E_ST_NO_XLT_NAME"> + Nie można przetÅ‚umaczyć nazw. + </floater.string> + <floater.string name="E_ST_NO_XLT_IGNORE"> + Nie można przeczytać tÅ‚umaczenia dla wartoÅ›ci ignorowania. + </floater.string> + <floater.string name="E_ST_NO_XLT_RELATIVE"> + Nie można przeczytać tÅ‚umaczenia wartoÅ›ci relatywnej. + </floater.string> + <floater.string name="E_ST_NO_XLT_OUTNAME"> + Nie można przeczytać nazw wartoÅ›ci tÅ‚umaczenia. + </floater.string> + <floater.string name="E_ST_NO_XLT_MATRIX"> + Nie można przeczytać tÅ‚umaczenia pola. + </floater.string> + <floater.string name="E_ST_NO_XLT_MERGECHILD"> + Brak otrzymania nazwy dla mergechild. + </floater.string> + <floater.string name="E_ST_NO_XLT_MERGEPARENT"> + Brak otrzymania nazwy dla mergeparent. + </floater.string> + <floater.string name="E_ST_NO_XLT_PRIORITY"> + Brak wartoÅ›ci prerogatywy. + </floater.string> + <floater.string name="E_ST_NO_XLT_LOOP"> + Brak otrzymania wartoÅ›ci powtórzeÅ„. + </floater.string> + <floater.string name="E_ST_NO_XLT_EASEIN"> + Brak otrzymawnia wartoÅ›ci easeIn. + </floater.string> + <floater.string name="E_ST_NO_XLT_EASEOUT"> + Brak otrzymania wartoÅ›ci dla easeOut. + </floater.string> + <floater.string name="E_ST_NO_XLT_HAND"> + Brak otrzymania wartoÅ›ci morfizacji. + </floater.string> + <floater.string name="E_ST_NO_XLT_EMOTE"> + Niemożliwość przeczytania nazwy emocji. + </floater.string> + <floater.string name="E_ST_BAD_ROOT"> + NieprawidÅ‚owa nazwa, użyj "hip". + </floater.string> <text name="name_label"> Nazwa: </text> <text name="description_label"> Opis: </text> - <spinner label="PierwszeÅ„stwo" name="priority" - tool_tip="Kontroluj,animacje,które mogÄ… zostać zdominowane przez tÄ… animacjÄ™" /> - <check_box label="Powtarzaj" name="loop_check" tool_tip="Powtarzaj tÄ… animacjÄ™" /> - <spinner label="Od(%)" name="loop_in_point" - tool_tip="Wybierz punkt, od którego chcesz zacząć powtarzać animacjÄ™" /> - <spinner label="Do(%)" name="loop_out_point" - tool_tip="Wybierz punkt, od którego chcesz zakoÅ„czyć powtarznie animacji" /> + <spinner label="PierwszeÅ„stwo" name="priority" tool_tip="Kontroluj animacje,które mogÄ… zostać zdominowane przez tÄ… animacjÄ™"/> + <check_box label="Powtarzaj" name="loop_check" tool_tip="Powtarzaj tÄ… animacjÄ™"/> + <spinner label="Od(%)" name="loop_in_point" tool_tip="Wybierz punkt, od którego chcesz zacząć powtarzać animacjÄ™"/> + <spinner label="Do(%)" name="loop_out_point" tool_tip="Wybierz punkt, od którego chcesz zakoÅ„czyć powtarzanie animacji"/> <text name="hand_label"> Pozycja RÄ™ki </text> - <combo_box label="" name="hand_pose_combo" - tool_tip="Kontroluje co robi rÄ™ka podczas animacji"> - <combo_item name="Spread"> - RozciÄ…gaj - </combo_item> - <combo_item name="Relaxed"> - Odpocznij - </combo_item> - <combo_item name="PointBoth"> - Wskazuj - </combo_item> - <combo_item name="Fist"> - Pięść - </combo_item> - <combo_item name="RelaxedLeft"> - Lewa-Odpocznij - </combo_item> - <combo_item name="PointLeft"> - Wskazuj LewÄ… - </combo_item> - <combo_item name="FistLeft"> - ZaciÅ›nij LewÄ… - </combo_item> - <combo_item name="RelaxedRight"> - Prawa-Odpocznj - </combo_item> - <combo_item name="PointRight"> - Wskazuj PrawÄ… - </combo_item> - <combo_item name="FistRight"> - ZaciÅ›nij PrawÄ… - </combo_item> - <combo_item name="SaluteRight"> - Salutuj PrawÄ… - </combo_item> - <combo_item name="Typing"> - Pisz - </combo_item> - <combo_item name="PeaceRight"> - Prawa-Pokój - </combo_item> + <combo_box label="" name="hand_pose_combo" tool_tip="Kontroluje co robi rÄ™ka podczas animacji"> + <combo_box.item label="RozciÄ…gaj" name="Spread"/> + <combo_box.item label="Odpocznij" name="Relaxed"/> + <combo_box.item label="Wskazuj" name="PointBoth"/> + <combo_box.item label="Pięść" name="Fist"/> + <combo_box.item label="Lewa-Odpocznij" name="RelaxedLeft"/> + <combo_box.item label="Wskazuj LewÄ…" name="PointLeft"/> + <combo_box.item label="ZaciÅ›nij LewÄ…" name="FistLeft"/> + <combo_box.item label="Prawa-Odpocznij" name="RelaxedRight"/> + <combo_box.item label="Wskazuj PrawÄ…" name="PointRight"/> + <combo_box.item label="ZaciÅ›nij PrawÄ…" name="FistRight"/> + <combo_box.item label="Salutuj PrawÄ…" name="SaluteRight"/> + <combo_box.item label="Pisz" name="Typing"/> + <combo_box.item label="Prawa-Pokój" name="PeaceRight"/> </combo_box> <text name="emote_label"> Ekspresja </text> - <combo_box label="" name="emote_combo" - tool_tip="Kontroluj mimikÄ™ twarzy w czasie animacji"> - <combo_item name="[None]"> - [Å»adne] - </combo_item> - <combo_item name="Aaaaah"> - Aaaaah - </combo_item> - <combo_item name="Afraid"> - Obawa - </combo_item> - <combo_item name="Angry"> - ZÅ‚ość - </combo_item> - <combo_item name="BigSmile"> - Duży UÅ›miech - </combo_item> - <combo_item name="Bored"> - Znudzenie - </combo_item> - <combo_item name="Cry"> - PÅ‚acz - </combo_item> - <combo_item name="Disdain"> - Wzgarda - </combo_item> - <combo_item name="Embarrassed"> - ZakÅ‚opotanie - </combo_item> - <combo_item name="Frown"> - Marszczenie Brwi - </combo_item> - <combo_item name="Kiss"> - PocaÅ‚unek - </combo_item> - <combo_item name="Laugh"> - Åšmiech - </combo_item> - <combo_item name="Plllppt"> - Plllppt - </combo_item> - <combo_item name="Repulsed"> - Odrzucenie - </combo_item> - <combo_item name="Sad"> - Smutek - </combo_item> - <combo_item name="Shrug"> - Wzruszanie Ramionami - </combo_item> - <combo_item name="Smile"> - UÅ›miech - </combo_item> - <combo_item name="Surprise"> - Niespodzianka - </combo_item> - <combo_item name="Wink"> - MrugniÄ™cie - </combo_item> - <combo_item name="Worry"> - Zmartwienie - </combo_item> + <combo_box label="" name="emote_combo" tool_tip="Kontroluj mimikÄ™ twarzy w czasie animacji"> + <combo_box.item label="(Å»adne)" name="[None]"/> + <combo_box.item label="Aaaaah" name="Aaaaah"/> + <combo_box.item label="Obawa" name="Afraid"/> + <combo_box.item label="ZÅ‚ość" name="Angry"/> + <combo_box.item label="Duży UÅ›miech" name="BigSmile"/> + <combo_box.item label="Znudzenie" name="Bored"/> + <combo_box.item label="PÅ‚acz" name="Cry"/> + <combo_box.item label="Wzgarda" name="Disdain"/> + <combo_box.item label="ZakÅ‚opotanie" name="Embarrassed"/> + <combo_box.item label="Marszczenie Brwi" name="Frown"/> + <combo_box.item label="PocaÅ‚unek" name="Kiss"/> + <combo_box.item label="Åšmiech" name="Laugh"/> + <combo_box.item label="Plllppt" name="Plllppt"/> + <combo_box.item label="Odrzucenie" name="Repulsed"/> + <combo_box.item label="Smutek" name="Sad"/> + <combo_box.item label="Wzruszenie Ramionami" name="Shrug"/> + <combo_box.item label="UÅ›miech" name="Smile"/> + <combo_box.item label="Niespodzianka" name="Surprise"/> + <combo_box.item label="MrugniÄ™cie" name="Wink"/> + <combo_box.item label="Zmartwienie" name="Worry"/> </combo_box> <text name="preview_label"> PrzeglÄ…daj kiedy: </text> - <combo_box label="" name="preview_base_anim" - tool_tip="Przetestuj zachowanie animacji kiedy awatar wykonuje normalne czynnoÅ›ci"> - <combo_item name="Standing"> - Stoisz - </combo_item> - <combo_item name="Walking"> - Chodzisz - </combo_item> - <combo_item name="Sitting"> - Siedzisz - </combo_item> - <combo_item name="Flying"> - Latasz - </combo_item> + <combo_box label="" name="preview_base_anim" tool_tip="Przetestuj zachowanie animacji kiedy awatar wykonuje normalne czynnoÅ›ci"> + <combo_box.item label="Stoisz" name="Standing"/> + <combo_box.item label="Chodzisz" name="Walking"/> + <combo_box.item label="Siedzisz" name="Sitting"/> + <combo_box.item label="Latasz" name="Flying"/> </combo_box> - <spinner label="ZÅ‚agodzić w (sekund)" name="ease_in_time" - tool_tip="Ilość Czasu (w sekundach), w których animacje mieszajÄ… siÄ™" /> - <spinner label="ZÅ‚agodzić na zewnÄ…trz (sekund)" name="ease_out_time" - tool_tip="Ilość Czasu (w sekundach), w których animacje oddzielajÄ… siÄ™" /> - <button label="" name="play_btn" tool_tip="Play/pause your animation." /> - <button label="" name="stop_btn" tool_tip="Stop animation playback" /> - <slider label="" name="playback_slider" /> + <spinner label="ZÅ‚agodzić w (sekund)" name="ease_in_time" tool_tip="Ilość Czasu (w sekundach), w których animacje mieszajÄ… siÄ™"/> + <spinner label="ZÅ‚agodzić na zewnÄ…trz (sekund)" name="ease_out_time" tool_tip="Ilość Czasu (w sekundach), w których animacje oddzielajÄ… siÄ™"/> + <button label="" name="play_btn" tool_tip="Odtwarzaj animacjÄ™"/> + <button name="pause_btn" tool_tip="Zatrzymaj animacjÄ™"/> + <button label="" name="stop_btn" tool_tip="Stop animation playback"/> + <slider label="" name="playback_slider"/> <text name="bad_animation_text"> Brak możliwoÅ›ci wczytania pliku animacji. Doradzamy eksport plików BVH z Poser 4. </text> - <button label="Anuluj" name="cancel_btn" /> - <button label="ZaÅ‚aduj (L$[AMOUNT])" name="ok_btn" /> - <string name="failed_to_initialize"> - Inicjalizacja ruchu nie powiodÅ‚a siÄ™. - </string> - <string name="anim_too_long"> - DÅ‚ugość pliku animacji wynosi [LENGTH] sekund. - -Maksymalna dÅ‚ugość pliku animacji wynosi [MAX_LENGTH] sekund. - </string> - <string name="failed_file_read"> - Niemożliwość odczytania pliku animacji do wyÅ›wietlenia. - -[STATUS] - </string> + <button label="ZaÅ‚aduj ([AMOUNT]L$)" name="ok_btn"/> + <button label="Anuluj" name="cancel_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/pl/floater_auction.xml b/indra/newview/skins/default/xui/pl/floater_auction.xml index 37e35ed1e9..9399fa1115 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_auction.xml +++ b/indra/newview/skins/default/xui/pl/floater_auction.xml @@ -1,9 +1,11 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="floater_auction" title="ROZPOCZNIJ SPRZEDAÅ» POSIADÅOÅšCI"> - <check_box label="ZawierajÄ…c żółte ogrodzenie" name="fence_check" /> - <button label="ZdjÄ™ce" label_selected="ZdjÄ™ce" name="snapshot_btn" /> - <button label="OK" label_selected="OK" name="ok_btn" /> - <string name="already for sale"> - Nie możesz umieÅ›cić posiadÅ‚oÅ›ci na aukcji, jeżeli już zostaÅ‚a wystawiona na sprzedaż. - </string> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_auction" title="ROZPOCZNIJ SPRZEDAÅ» POSIADÅOÅšCI LINDENÓW"> + <floater.string name="already for sale"> + Nie możesz umieÅ›cić PosiadÅ‚oÅ›ci na Aukcji, jeżeli już zostaÅ‚a wystawiona na sprzedaż. + </floater.string> + <check_box initial_value="true" label="ZawierajÄ…c żółte ogrodzenie" name="fence_check"/> + <button label="ZdjÄ™ce" label_selected="ZdjÄ™ce" name="snapshot_btn"/> + <button label="Sprzedaj każdemu" label_selected="Sprzedaj Każdemu" name="sell_to_anyone_btn"/> + <button label="Wyczyść ustawienia" label_selected="Wyczyść ustawienia" name="reset_parcel_btn"/> + <button label="Rozpocznij AukcjÄ™" label_selected="Rozpocznij AukcjÄ™" name="start_auction_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/pl/floater_avatar_picker.xml b/indra/newview/skins/default/xui/pl/floater_avatar_picker.xml index 8c09f7294c..0897f59570 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_avatar_picker.xml +++ b/indra/newview/skins/default/xui/pl/floater_avatar_picker.xml @@ -1,40 +1,46 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="avatarpicker" title="WYBIERZ REZYDENTA"> + <floater.string name="not_found"> + '[TEXT]' nie zostaÅ‚o odnalezione + </floater.string> + <floater.string name="no_one_near"> + Nie ma nikogo w pobliżu + </floater.string> + <floater.string name="no_results"> + Brak wyników + </floater.string> + <floater.string name="searching"> + Wyszukiwanie... + </floater.string> + <string label="Wybierz" label_selected="Wybierz" name="Select"> + Wybierz + </string> + <string name="Close"> + Zamknij + </string> <tab_container name="ResidentChooserTabs"> <panel label="Znajdź" name="SearchPanel"> <text name="InstructSearchResidentName"> - Wpisz imiÄ™ Rezydenta: + Wpisz fragment imienia: </text> - <button label="Znajdź" label_selected="Znajdź" name="Find"/> + <button label="Szukaj" label_selected="Szukaj" name="Find"/> </panel> - <panel label="Wizytówka" name="CallingCardsPanel"> - <text name="InstructSelectCallingCard"> - Wybierz wizytówkÄ™: + <panel label="Znajomi" name="FriendsPanel"> + <text name="InstructSelectFriend"> + Wybierz osobÄ™: </text> </panel> <panel label="Obok mnie:" name="NearMePanel"> <text name="InstructSelectResident"> - Wybierz Rezydenta obok: + Wybierz osobÄ™ w pobliżu: </text> - <button label="OdÅ›wież" label_selected="OdÅ›wież" name="Refresh"/> <slider label="ZasiÄ™g" name="near_me_range"/> <text name="meters"> Metry </text> + <button label="OdÅ›wież" label_selected="OdÅ›wież" name="Refresh"/> </panel> </tab_container> - <button label="Wybierz" label_selected="Wybierz" name="Select"/> - <button label="Anuluj" label_selected="Anuluj" name="Cancel"/> - <string name="not_found"> - '[TEXT]' nie zostaÅ‚o odnalezione - </string> - <string name="no_one_near"> - Nikt w pobliżu - </string> - <string name="no_results"> - Brak wyników - </string> - <string name="searching"> - Wyszukiwanie... - </string> + <button label="OK" label_selected="OK" name="ok_btn"/> + <button label="Cofnij" label_selected="Cofnij" name="cancel_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/pl/floater_avatar_textures.xml b/indra/newview/skins/default/xui/pl/floater_avatar_textures.xml index dce2330807..11651ad7e8 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_avatar_textures.xml +++ b/indra/newview/skins/default/xui/pl/floater_avatar_textures.xml @@ -1,30 +1,43 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="avatar_texture_debug" title="TEKSTURY AWATARA"> - <text name="baked_label"> - Tekstury Renderowane - </text> + <floater.string name="InvalidAvatar"> + NIEWÅAÅšCIWY AWATAR + </floater.string> <text name="composite_label"> - Tekstury Kompozytowe + Tekstury kompozytowe </text> - <texture_picker label="GÅ‚owa" name="baked_head" /> - <texture_picker label="Makijaż" name="head_bodypaint" /> - <texture_picker label="WÅ‚osy" name="hair" /> - <button label="Zrzuć" label_selected="Zrzuć" name="Dump" /> - <texture_picker label="Oczy" name="baked_eyes" /> - <texture_picker label="Oko" name="eye_texture" /> - <texture_picker label="Góra Część CiaÅ‚a" name="baked_upper_body" /> - <texture_picker label="Tatuaż Górnej Części CiaÅ‚a" name="upper_bodypaint" /> - <texture_picker label="Podkoszulek" name="undershirt" /> - <texture_picker label="RÄ™kawiczki" name="gloves" /> - <texture_picker label="Koszula" name="shirt" /> - <texture_picker label="Górna Część Kurtki" name="upper_jacket" /> - <texture_picker label="Dolna Część CiaÅ‚a" name="baked_lower_body" /> - <texture_picker label="Tatuaż Dolnej Części CiaÅ‚a" name="lower_bodypaint" /> - <texture_picker label="Bielizna" name="underpants" /> - <texture_picker label="Skarpety" name="socks" /> - <texture_picker label="Buty" name="shoes" /> - <texture_picker label="Spodnie" name="pants" /> - <texture_picker label="Kurtka" name="jacket" /> - <texture_picker label="Spódnica" name="baked_skirt" /> - <texture_picker label="Spódnica" name="skirt_texture" /> + <button label="Zrzuć" label_selected="Zrzuć" name="Dump"/> + <scroll_container name="profile_scroll"> + <panel name="scroll_content_panel"> + <texture_picker label="WÅ‚osy" name="hair-baked"/> + <texture_picker label="WÅ‚osy" name="hair_grain"/> + <texture_picker label="Alpha wÅ‚osów" name="hair_alpha"/> + <texture_picker label="GÅ‚owa" name="head-baked"/> + <texture_picker label="Makijaż" name="head_bodypaint"/> + <texture_picker label="Alpha gÅ‚owy" name="head_alpha"/> + <texture_picker label="Tatuaż gÅ‚owy" name="head_tattoo"/> + <texture_picker label="Oczy" name="eyes-baked"/> + <texture_picker label="Oko" name="eyes_iris"/> + <texture_picker label="Alpha oczu" name="eyes_alpha"/> + <texture_picker label="Górna część ciaÅ‚a" name="upper-baked"/> + <texture_picker label="Górny wzór na ciele" name="upper_bodypaint"/> + <texture_picker label="Podkoszulek" name="upper_undershirt"/> + <texture_picker label="RÄ™kawiczki" name="upper_gloves"/> + <texture_picker label="Koszula" name="upper_shirt"/> + <texture_picker label="Kurtka górna" name="upper_jacket"/> + <texture_picker label="Alpha górna" name="upper_alpha"/> + <texture_picker label="Tatuaż górny" name="upper_tattoo"/> + <texture_picker label="Dolna część ciaÅ‚a" name="lower-baked"/> + <texture_picker label="Dolny wzór na ciele" name="lower_bodypaint"/> + <texture_picker label="Bielizna" name="lower_underpants"/> + <texture_picker label="Skarpetki" name="lower_socks"/> + <texture_picker label="Buty" name="lower_shoes"/> + <texture_picker label="Spodnie" name="lower_pants"/> + <texture_picker label="Kurtka" name="lower_jacket"/> + <texture_picker label="Alpha dolna" name="lower_alpha"/> + <texture_picker label="Tatuaż dolny" name="lower_tattoo"/> + <texture_picker label="Spódnica" name="skirt-baked"/> + <texture_picker label="Spódnica" name="skirt"/> + </panel> + </scroll_container> </floater> diff --git a/indra/newview/skins/default/xui/pl/floater_beacons.xml b/indra/newview/skins/default/xui/pl/floater_beacons.xml index 6e7013f2d7..547db2b351 100644 --- a/indra/newview/skins/default/xui/pl/floater_beacons.xml +++ b/indra/newview/skins/default/xui/pl/floater_beacons.xml @@ -1,15 +1,21 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="beacons" title="EMITERY"> <panel name="beacons_panel"> - <check_box label="Obiekty Dotykalne" name="touch_only"/> - <check_box label="Obiekty Skryptowane" name="scripted"/> - <check_box label="Obiekty Fizyczne" name="physical"/> - <check_box label="ŹródÅ‚a DźwiÄ™ku" name="sounds"/> - <check_box label="ŹródÅ‚a CzÄ…steczek" name="particles"/> - <check_box label="PodkreÅ›l Emitery" name="highlights"/> - <check_box label="Pokaż Emitery" name="beacons"/> - <text name="beacon_width_label"> - ZasiÄ™g Emiterów: + <text name="label_show"> + Pokaż emitery: </text> + <check_box label="Emitery" name="beacons"/> + <check_box label="PodkreÅ›l emitery" name="highlights"/> + <text name="beacon_width_label" tool_tip="ZasiÄ™g emiterów"> + Szer. + </text> + <text name="label_objects"> + Dla tych obiektów: + </text> + <check_box label="Obiekty fizyczne" name="physical"/> + <check_box label="Obiekty skryptowane" name="scripted"/> + <check_box label="Obiekty dotykalne" name="touch_only"/> + <check_box label="ŹródÅ‚a dźwiÄ™ku" name="sounds"/> + <check_box label="ŹródÅ‚a czÄ…steczek" name="particles"/> </panel> </floater> diff --git a/indra/newview/skins/default/xui/pl/floater_build_options.xml b/indra/newview/skins/default/xui/pl/floater_build_options.xml index f538be218c..5d296aa725 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_build_options.xml +++ b/indra/newview/skins/default/xui/pl/floater_build_options.xml @@ -1,8 +1,11 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="build options floater" title="OPCJE SIATKI"> - <spinner label="Jednostka Siatki (metry)" name="GridResolution" /> - <spinner label="Rozmiary Siatki (metry)" name="GridDrawSize" /> - <check_box label="UdostÄ™pnij Podjednostkowe Dopasowywanie" name="GridSubUnit" /> - <check_box label="Pokaż Sekcje SkoÅ›ne" name="GridCrossSection" /> - <slider label="Nieprzezroczystość Siatki" name="GridOpacity" /> + <spinner label="Jednostki siatki (metery)" name="GridResolution"/> + <spinner label="Rozmiary siatki (metry)" name="GridDrawSize"/> + <check_box label="Pokaż podjednostki" name="GridSubUnit"/> + <check_box label="Pokaż przekroje" name="GridCrossSection"/> + <text name="grid_opacity_label" tool_tip="Nieprzeźroczystość siatki:"> + Nieprzeźroczystość: + </text> + <slider label="Nieprzezroczystość siatki" name="GridOpacity"/> </floater> diff --git a/indra/newview/skins/default/xui/pl/floater_bulk_perms.xml b/indra/newview/skins/default/xui/pl/floater_bulk_perms.xml index f06615642e..f4721b05d8 100644 --- a/indra/newview/skins/default/xui/pl/floater_bulk_perms.xml +++ b/indra/newview/skins/default/xui/pl/floater_bulk_perms.xml @@ -1,44 +1,54 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="floaterbulkperms" title="HURTOWA ZMIANA PRAW ZAWARTOÅšCI"> - <text name="applyto"> - Rodzaj ZawartoÅ›ci - </text> + <floater.string name="nothing_to_modify_text"> + Selekcja zawiera zawartość niemodfyfikowalnÄ… + </floater.string> + <floater.string name="status_text"> + Ustawienie praw na [NAME] + </floater.string> + <floater.string name="start_text"> + RozpoczÄ™cie proÅ›by o zmianÄ™ praw... + </floater.string> + <floater.string name="done_text"> + ZakoÅ„czenie proÅ›by o zmianÄ™ praw. + </floater.string> <check_box label="Animacje" name="check_animation"/> - <check_box label="Części CiaÅ‚a" name="check_bodypart"/> + <icon name="icon_animation" tool_tip="Animacja"/> + <check_box label="Części ciaÅ‚a" name="check_bodypart"/> + <icon name="icon_bodypart" tool_tip="Części CiaÅ‚a"/> <check_box label="Ubranie" name="check_clothing"/> + <icon name="icon_clothing" tool_tip="Ubranie"/> <check_box label="Gestury" name="check_gesture"/> - <check_box label="ZapamiÄ™tane Miejsca" name="check_landmark"/> + <icon name="icon_gesture" tool_tip="Gestury"/> <check_box label="Noty" name="check_notecard"/> + <icon name="icon_notecard" tool_tip="Noty"/> <check_box label="Obiekty" name="check_object"/> + <icon name="icon_object" tool_tip="Obiekty"/> <check_box label="Skrypty" name="check_script"/> + <icon name="icon_script" tool_tip="Skrypty"/> <check_box label="DźwiÄ™ki" name="check_sound"/> + <icon name="icon_sound" tool_tip="DźwiÄ™ki"/> <check_box label="Tekstury" name="check_texture"/> - <button width="115" font="SansSerifSmall" label="Wybierz Wszystkie" label_selected="Wszystkie" name="check_all"/> - <button width="115" font="SansSerifSmall" label="Odznacz Wszystkie" label_selected="Å»adne" name="check_none"/> + <icon name="icon_texture" tool_tip="Tekstury"/> + <button font="SansSerifSmall" label="√ Wszystkie" label_selected="Wszystkie" name="check_all" width="115"/> + <button font="SansSerifSmall" label="Å»adne" label_selected="Å»adne" name="check_none" width="115"/> <text name="newperms"> - Nowe Prawa + Nowe prawa zawartoÅ›ci + </text> + <text name="GroupLabel"> + Grupa: </text> - <check_box label="UdostÄ™pnij Grupie" name="share_with_group"/> - <check_box label="Pozwól kopiować każdemu" name="everyone_copy"/> + <check_box label="UdostÄ™pnij" name="share_with_group"/> + <text name="AnyoneLabel"> + Każdy: + </text> + <check_box label="Kopiuj" name="everyone_copy"/> <text name="NextOwnerLabel"> NastÄ™pny WÅ‚aÅ›ciciel: </text> <check_box label="Modyfikuje" name="next_owner_modify"/> <check_box label="Kopiuje" name="next_owner_copy"/> - <check_box label="Oddaje/Sprzedaje" name="next_owner_transfer"/> - <button label="Pomoc" name="help"/> - <button label="Zastosuj" name="apply"/> - <button label="Zamknij" name="close"/> - <string name="nothing_to_modify_text"> - Selekcja zawiera zawartość niemodfyfikowalnÄ… - </string> - <string name="status_text"> - Ustawienie praw na [NAME] - </string> - <string name="start_text"> - RozpoczÄ™cie proÅ›by o zmianÄ™ praw... - </string> - <string name="done_text"> - ZakoÅ„czenie proÅ›by o zmianÄ™ praw. - </string> + <check_box initial_value="true" label="Oddaj/Sprzedaj" name="next_owner_transfer" tool_tip="NastÄ™pny wÅ‚aÅ›ciciel może oddać lub sprzedać ten obiekt."/> + <button label="OK" name="apply"/> + <button label="Anuluj" name="close"/> </floater> diff --git a/indra/newview/skins/default/xui/pl/floater_bumps.xml b/indra/newview/skins/default/xui/pl/floater_bumps.xml index 10f9d73284..1f1b29a83e 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_bumps.xml +++ b/indra/newview/skins/default/xui/pl/floater_bumps.xml @@ -1,21 +1,24 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="floater_bumps" title="ZDERZENIA, POPCHNIĘCIA, UDERZENIA"> - <string name="none_detected"> + <floater.string name="none_detected"> Brak - </string> - <string name="bump"> + </floater.string> + <floater.string name="bump"> [TIME] [FIRST] [LAST] awatar zderzyÅ‚ siÄ™ z TobÄ… - </string> - <string name="llpushobject"> + </floater.string> + <floater.string name="llpushobject"> [TIME] [FIRST] [LAST] awatar popchnÄ…Å‚ CiÄ™ swoim skryptem - </string> - <string name="selected_object_collide"> + </floater.string> + <floater.string name="selected_object_collide"> [TIME] [FIRST] [LAST] awatar uderzyÅ‚ CiÄ™ swoim obiektem - </string> - <string name="scripted_object_collide"> + </floater.string> + <floater.string name="scripted_object_collide"> [TIME] [FIRST] [LAST] awatar uderzyÅ‚ CiÄ™ swoim skryptowanym obiektem - </string> - <string name="physical_object_collide"> + </floater.string> + <floater.string name="physical_object_collide"> [TIME] [FIRST] [LAST] awatar uderzyÅ‚ CiÄ™ swoim fizycznym obiektem - </string> + </floater.string> + <floater.string name="timeStr"> + [[hour,datetime,slt]:[min,datetime,slt]] + </floater.string> </floater> diff --git a/indra/newview/skins/default/xui/pl/floater_buy_contents.xml b/indra/newview/skins/default/xui/pl/floater_buy_contents.xml index ebe1c9dfd8..94f2b50450 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_buy_contents.xml +++ b/indra/newview/skins/default/xui/pl/floater_buy_contents.xml @@ -1,14 +1,14 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="floater_buy_contents" title="KUP ZAWARTOŚĆ"> <text name="contains_text"> [NAME] zawiera: </text> <text name="buy_text"> - Kupić za L$[AMOUNT] od [NAME]? + Kupić za [AMOUNT]L$ od [NAME]? </text> - <button label="Anuluj" label_selected="Anuluj" name="cancel_btn" /> - <button label="Kup" label_selected="Kup" name="buy_btn" /> - <check_box label="Załóż ubrania teraz" name="wear_check" /> + <button label="Anuluj" label_selected="Anuluj" name="cancel_btn"/> + <button label="Kup" label_selected="Kup" name="buy_btn"/> + <check_box label="Załóż ubrania teraz" name="wear_check"/> <string name="no_copy_text"> (bez prawa kopiowania) </string> diff --git a/indra/newview/skins/default/xui/pl/floater_buy_currency.xml b/indra/newview/skins/default/xui/pl/floater_buy_currency.xml index 5e59482883..f2a6579dc3 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_buy_currency.xml +++ b/indra/newview/skins/default/xui/pl/floater_buy_currency.xml @@ -1,50 +1,43 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="buy currency" title="KUP $L"> - <text name="info_buying"> - Kup L$: - </text> - <text name="info_cannot_buy"> - Brak możliwoÅ›ci zakupu L$ teraz: - </text> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="buy currency" title="KUP L$"> + <floater.string name="buy_currency"> + Kup [LINDENS] L$ za [LOCALAMOUNT] + </floater.string> <text name="info_need_more"> - Potrzebujesz wiecÄ™j L$: + Potrzebujesz wiÄ™cej L$ </text> - <text name="error_message"> - Pojawienie siÄ™ błędu. - </text> - <button label="Idź do strony internetowej" name="error_web" width="168"/> <text name="contacting"> Kontaktowanie z LindeX... </text> - <text name="buy_action_unknown"> - Kup L$ w systemie walutowej wymiany LindeX + <text name="info_buying"> + Kup L$ </text> - <text name="buy_action"> - [NAME] [PRICE]L$ + <text name="balance_label"> + Obecnie posiadasz + </text> + <text name="balance_amount"> + [AMT]L$ </text> <text name="currency_action"> Kup </text> - <line_editor name="currency_amt" left_delta="32"> + <text name="currency_label"> + L$ + </text> + <line_editor label="L$" left_delta="32" name="currency_amt"> 1234 </line_editor> + <text name="buying_label"> + Cena + </text> <text name="currency_est"> za [LOCALAMOUNT] </text> <text name="getting_data"> - Otrzymywanie danych... + Kalkulowanie... </text> - <text name="balance_label"> - Obecnie posiadasz - </text> - <text name="balance_amount"> - [AMT]L$ - </text> - <text name="buying_label"> - Kupujesz - </text> - <text name="buying_amount"> - [AMT]L$ + <text name="buy_action"> + [ACTION] </text> <text name="total_label"> Twój nowy stan konta @@ -52,18 +45,22 @@ <text name="total_amount"> [AMT]L$ </text> - <text name="purchase_warning_repurchase" height="48" bottom_delta="-64" right="-10"> - DokonujÄ…c potwierdzenia na podanÄ… transakcjÄ™, -wyrażasz zgodÄ™ jedynie na zakup waluty. -Sprobuj wykonać operacjÄ™ ponownie. + <text name="currency_links"> + [http://www.secondlife.com/my/account/payment_method_management.php metoda pÅ‚atnoÅ›ci] | [http://www.secondlife.com/my/account/currency.php waluta] | [http://www.secondlife.com/my/account/exchange_rates.php kurs wymiany] + </text> + <text name="exchange_rate_note"> + Wpisz ponownie kwotÄ™ aby zobaczyć ostatni kurs wymiany. </text> - <text name="purchase_warning_notenough" bottom_delta="16"> - Nie zakupujesz wystarczajÄ…cej iloÅ›ci waluty. -ProszÄ™ zwiÄ™kszyć ilość. + <text bottom_delta="-64" height="48" name="purchase_warning_repurchase" right="-10"> + Potwierdzasz zakup L$, nie obiektu. + </text> + <text bottom_delta="16" name="purchase_warning_notenough"> + Nie zakupiono wystarczajÄ…cej iloÅ›ci L$. ProszÄ™ zwiÄ™kszyć kwotÄ™. + </text> + <button label="Kup teraz" name="buy_btn"/> + <button label="Anuluj" name="cancel_btn"/> + <text name="info_cannot_buy"> + Nie można kupić </text> - <button label="Anuluj" name="cancel_btn" /> - <button label="Kup" name="buy_btn" /> - <string name="buy_currency"> - Kup [LINDENS]L$ za [LOCALAMOUNT] - </string> + <button label="Przejdź na stronÄ™ WWW" name="error_web" width="168"/> </floater> diff --git a/indra/newview/skins/default/xui/pl/floater_buy_land.xml b/indra/newview/skins/default/xui/pl/floater_buy_land.xml index 648888828b..7b4f459b4e 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_buy_land.xml +++ b/indra/newview/skins/default/xui/pl/floater_buy_land.xml @@ -1,5 +1,130 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="buy land" title="BUY LAND"> +<floater name="buy land" title="KUP POSIADÅOŚĆ"> + <floater.string name="can_resell"> + Może być odsprzedana. + </floater.string> + <floater.string name="can_not_resell"> + Nie może być odsprzedana. + </floater.string> + <floater.string name="can_change"> + MogÄ… być łączone i dzielone. + </floater.string> + <floater.string name="can_not_change"> + Nie mogÄ… być łączone ani dzielone. + </floater.string> + <floater.string name="cant_buy_for_group"> + Nie masz pozwolenia na zakup PosiadÅ‚oÅ›ci dla Twojej aktywnej Grupy. + </floater.string> + <floater.string name="no_land_selected"> + Obszar nie jest wybrany. + </floater.string> + <floater.string name="multiple_parcels_selected"> + WybraÅ‚eÅ› wiele różnych PosiadÅ‚oÅ›ci. +Spróbuj wybrać mniejszy obszar. + </floater.string> + <floater.string name="no_permission"> + Nie masz pozwolenia na zakup PosiadÅ‚oÅ›ci dla Twojej aktywnej Grupy. + </floater.string> + <floater.string name="parcel_not_for_sale"> + Wybrana PosiadÅ‚ość nie jest na sprzedaż. + </floater.string> + <floater.string name="group_already_owns"> + Ta PosiadÅ‚ość już należy do Grupy. + </floater.string> + <floater.string name="you_already_own"> + Ta PosiadÅ‚ość już należy do Ciebie. + </floater.string> + <floater.string name="set_to_sell_to_other"> + Wybrana PosiadÅ‚ość bÄ™dzie sprzedana komuÅ› innemu. + </floater.string> + <floater.string name="no_public_land"> + Wybrany obszar nie ma publicznych PosiadÅ‚oÅ›ci. + </floater.string> + <floater.string name="not_owned_by_you"> + WybraÅ‚eÅ› PosiadÅ‚ość, której WÅ‚aÅ›cicielem jest inny Rezydent. +Spróbuj wybrać ponownie mniejszÄ… powierzchniÄ™ PosiadÅ‚oÅ›ci. + </floater.string> + <floater.string name="processing"> + Przetwarzanie Twojego zakupu... + +(Może zająć kilka minut) + </floater.string> + <floater.string name="fetching_error"> + Błąd podczas wczytywania informacji zakupu PosiadÅ‚oÅ›ci. + </floater.string> + <floater.string name="buying_will"> + Zakup tej PosiadÅ‚oÅ›ci spowoduje: + </floater.string> + <floater.string name="buying_for_group"> + Zakup ziemi dla Grupy: + </floater.string> + <floater.string name="cannot_buy_now"> + Nie możesz teraz kupić: + </floater.string> + <floater.string name="not_for_sale"> + Nie jest na sprzedaż: + </floater.string> + <floater.string name="none_needed"> + Poprawność danych. + </floater.string> + <floater.string name="must_upgrade"> + Musisz mieć konto Premium żebyÅ› mógÅ‚ mieć PosiadÅ‚oÅ›ci. + </floater.string> + <floater.string name="cant_own_land"> + Twoje konto pozwala Ci mieć PosiadÅ‚oÅ›ci. + </floater.string> + <floater.string name="land_holdings"> + JesteÅ› wÅ‚aÅ›cicielem [BUYER] m² ziemi. + </floater.string> + <floater.string name="pay_to_for_land"> + ZapÅ‚ać [SELLER] [AMOUNT]L$ za PosiadÅ‚ość + </floater.string> + <floater.string name="buy_for_US"> + Kup L$ [AMOUNT] za [LOCAL_AMOUNT], + </floater.string> + <floater.string name="parcel_meters"> + Podana posiadÅ‚ość to [AMOUNT] m² ziemi. + </floater.string> + <floater.string name="premium_land"> + Podana posiadÅ‚ość jest w cenie premium adekwatnie jak za [AMOUNT] m². + </floater.string> + <floater.string name="discounted_land"> + Wybrana posiadÅ‚ość jest w cenie zniżkowej adekwatnie jak za [AMOUNT] m². + </floater.string> + <floater.string name="meters_supports_object"> + [AMOUNT] m² +wspiera [AMOUNT2] obiektów + </floater.string> + <floater.string name="sold_with_objects"> + sprzedane z obiektami + </floater.string> + <floater.string name="sold_without_objects"> + obiekty nie sÄ… zawarte w sprzedaży + </floater.string> + <floater.string name="info_price_string"> + L$ [PRICE] +(L$ [PRICE_PER_SQM]/m²) +[SOLD_WITH_OBJECTS] + </floater.string> + <floater.string name="insufficient_land_credits"> + Grupa [GROUP] musi mieć wystarczajÄ…cy kredyt na +używanie PosiadÅ‚oÅ›ci żeby sfinalizować ten zakup. + </floater.string> + <floater.string name="have_enough_lindens"> + Masz [AMOUNT]L$ co wystarcza na zakup tej PosiadÅ‚oÅ›ci. + </floater.string> + <floater.string name="not_enough_lindens"> + Masz tylko [AMOUNT]L$ i potrzebujesz [AMOUNT2]L$ dodatkowo. + </floater.string> + <floater.string name="balance_left"> + Po zakupie zostanie Ci [AMOUNT]L$. + </floater.string> + <floater.string name="balance_needed"> + Musisz dokupić [AMOUNT]L$ żeby kupić tÄ… PosiadÅ‚ość. + </floater.string> + <floater.string name="no_parcel_selected"> + (PosiadÅ‚ość nie zostaÅ‚a wybrana) + </floater.string> <text name="region_name_label"> Region: </text> @@ -74,9 +199,9 @@ sprzedaż z obiektami Tylko czÅ‚onkowie z kontem Premium mogÄ… mieć PosiadÅ‚osci. </text> <combo_box name="account_level"> - <combo_box.item name="US$9.95/month,billedmonthly" label="9.95US$/miesiÄ…c, pÅ‚atne miesiÄ™cznie" /> - <combo_box.item name="US$7.50/month,billedquarterly" label="7.50US$/miesiÄ…c, pÅ‚atne kwartalnie" /> - <combo_box.item name="US$6.00/month,billedannually" label="6.00US$/miesiÄ…c, pÅ‚atne rocznie" /> + <combo_box.item label="US$9.95/miesiÄ™cznie, naliczane miesiÄ™cznie" name="US$9.95/month,billedmonthly"/> + <combo_box.item label="US$7.50/miesiÄ™cznie, naliczane kwartalnie" name="US$7.50/month,billedquarterly"/> + <combo_box.item label="US$6.00/miesiÄ™cznie, naliczane rocznie" name="US$6.00/month,billedannually"/> </combo_box> <text name="land_use_action"> ZwiÄ™ksz opÅ‚atÄ™ za używanie PosiadÅ‚oÅ›ci do 40US$/miesiÄ…c. @@ -98,140 +223,12 @@ PosiadÅ‚ość ta zawiera 512 m² ziemi. 1000 </line_editor> <text name="currency_est"> - za okoÅ‚o [AMOUNT2]US$ + za [LOCAL_AMOUNT] </text> <text name="currency_balance"> Masz 2,100L$. </text> - <check_box label="Zabierz [AMOUNT] metrów donacji z Grupy." name="remove_contribution"/> + <check_box label="UsuÅ„ [AMOUNT] m² z kontrybucji w grupie." name="remove_contribution"/> <button label="Zakup" name="buy_btn"/> <button label="Anuluj" name="cancel_btn"/> - <string name="can_resell"> - Może być odsprzedana. - </string> - <string name="can_not_resell"> - Nie może być odsprzedana. - </string> - <string name="can_change"> - MogÄ… być łączone i dzielone. - </string> - <string name="can_not_change"> - Nie mogÄ… być łączone ani dzielone. - </string> - <string name="cant_buy_for_group"> - Nie masz pozwolenia na zakup PosiadÅ‚oÅ›ci dla Twojej aktywnej Grupy. - </string> - <string name="no_land_selected"> - Obszar nie jest wybrany. - </string> - <string name="multiple_parcels_selected"> - WybraÅ‚eÅ› wiele różnych PosiadÅ‚oÅ›ci. -Spróbuj wybrać mniejszy obszar. - </string> - <string name="no_permission"> - Nie masz pozwolenia na zakup PosiadÅ‚oÅ›ci dla Twojej aktywnej Grupy. - </string> - <string name="parcel_not_for_sale"> - Wybrana PosiadÅ‚ość nie jest na sprzedaż. - </string> - <string name="group_already_owns"> - Ta PosiadÅ‚ość już należy do Grupy. - </string> - <string name="you_already_own"> - Ta PosiadÅ‚ość już należy do Ciebie. - </string> - <string name="set_to_sell_to_other"> - Wybrana PosiadÅ‚ość bÄ™dzie sprzedana komu innemu. - </string> - <string name="no_public_land"> - Wybrany obszar nie ma publicznych PosiadÅ‚oÅ›ci. - </string> - <string name="not_owned_by_you"> - Wybrana PosiadÅ‚ość należy do kogoÅ› innego. -Spróbuj wybrać inny obszar. - </string> - <string name="processing"> - Przetwarzanie Twojego zakupu... - -(Może zająć kilka minut) - </string> - <string name="fetching_error"> - Błąd podczas wczytywania informacji zakupu PosiadÅ‚oÅ›ci. - </string> - <string name="buying_will"> - Zakup tej PosiadÅ‚oÅ›ci spowoduje: - </string> - <string name="buying_for_group"> - Zakup ziemi dla grupy: - </string> - <string name="cannot_buy_now"> - Nie możesz teraz kupić: - </string> - <string name="not_for_sale"> - Nie jest na sprzedaż: - </string> - <string name="none_needed"> - Poprawność danych. - </string> - <string name="must_upgrade"> - Musisz mieć konto Premium żebyÅ› mógÅ‚ mieć PosiadÅ‚oÅ›ci. - </string> - <string name="cant_own_land"> - Twoje konto pozwala Ci mieć PosiadÅ‚oÅ›ci. - </string> - <string name="land_holdings"> - JesteÅ› wÅ‚aÅ›cicielem [BUYER] m² ziemi. - </string> - <string name="pay_to_for_land"> - ZapÅ‚ać [SELLER] [AMOUNT]L$ za PosiadÅ‚ość - </string> - <string name="buy_for_US"> - Kup L$ [AMOUNT] za US$ [AMOUNT2], - </string> - <string name="parcel_meters"> - Podana posiadÅ‚ość to [AMOUNT] m² ziemi. - </string> - <string name="premium_land"> - Podana posiadÅ‚ość jest w cenie premium adekwatnie jak za [AMOUNT] m². - </string> - <string name="discounted_land"> - Wybrana posiadÅ‚ość jest w cenie zniżkowej adekwatnie jak za [AMOUNT] m². - </string> - <string name="meters_supports_object"> - [AMOUNT] m² -wspiera [AMOUNT2] obiektów - </string> - <string name="sold_with_objects"> - sprzedane z obiektami - </string> - <string name="sold_without_objects"> - obiekty nie sÄ… zawarte w sprzedaży - </string> - <string name="info_price_string"> - L$ [PRICE] -(L$ [PRICE_PER_SQM]/m²) -[SOLD_WITH_OBJECTS] - </string> - <string name="insufficient_land_credits"> - Grupa [GROUP] musi mieć wystarczajÄ…cy kredyt na -używanie PosiadÅ‚oÅ›ci żeby sfinalizować ten zakup. - </string> - <string name="have_enough_lindens"> - Masz [AMOUNT]L$ co wystarcza na zakup tej PosiadÅ‚oÅ›ci. - </string> - <string name="not_enough_lindens"> - Masz tylko [AMOUNT]L$ i potrzebujesz [AMOUNT2]L$ dodatkowo. - </string> - <string name="balance_left"> - Po zakupie zostanie Ci [AMOUNT]L$. - </string> - <string name="balance_needed"> - Musisz dokupić [AMOUNT]L$ żeby kupić tÄ… PosiadÅ‚ość. - </string> - <string name="no_parcel_selected"> - (PosiadÅ‚ość nie wybrana) - </string> - <string name="buy_currency"> - Kup [LINDENS]L$ za okoÅ‚o [USD]US$ - </string> </floater> diff --git a/indra/newview/skins/default/xui/pl/floater_buy_object.xml b/indra/newview/skins/default/xui/pl/floater_buy_object.xml index bad7982228..7958ed76a1 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_buy_object.xml +++ b/indra/newview/skins/default/xui/pl/floater_buy_object.xml @@ -1,13 +1,13 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="contents" title="KUP KOPIĘ OBIEKTU"> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="contents" title="KUP KOPIĘ"> <text name="contents_text"> - i jej zawartość: + i jej zawartość </text> <text name="buy_text"> Kupić za [AMOUNT]L$ od [NAME]? </text> - <button label="Anuluj" label_selected="Anuluj" name="cancel_btn" /> - <button label="Kup" label_selected="Kup" name="buy_btn" /> + <button label="Anuluj" label_selected="Anuluj" name="cancel_btn"/> + <button label="Kup" label_selected="Kup" name="buy_btn"/> <string name="title_buy_text"> Kup </string> diff --git a/indra/newview/skins/default/xui/pl/floater_camera.xml b/indra/newview/skins/default/xui/pl/floater_camera.xml index 5957018144..aec75f026f 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_camera.xml +++ b/indra/newview/skins/default/xui/pl/floater_camera.xml @@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="camera_floater" title=""> <floater.string name="rotate_tooltip"> Obracaj kamerÄ™ wokół obiektu @@ -9,8 +9,35 @@ <floater.string name="move_tooltip"> Poruszaj kamerÄ… w dół/górÄ™ oraz w prawo/lewo </floater.string> + <floater.string name="orbit_mode_title"> + Obracaj + </floater.string> + <floater.string name="pan_mode_title"> + W prawo lub w lewo + </floater.string> + <floater.string name="avatar_view_mode_title"> + Ustawienia + </floater.string> + <floater.string name="free_mode_title"> + Zobacz obiekt + </floater.string> <panel name="controls"> - <joystick_track name="cam_track_stick" tool_tip="Poruszaj kamerÄ… w dół/górÄ™ oraz w prawo/lewo"/> - <joystick_zoom name="zoom" tool_tip="Najedź kamerÄ… w kierunku obiektu"/> + <joystick_track name="cam_track_stick" tool_tip="Poruszaj kamerÄ… w górÄ™, w dół, w lewo i w prawo"/> + <panel name="zoom" tool_tip="Najedź kamerÄ… w kierunku obiektu"> + <slider_bar name="zoom_slider" tool_tip="Przybliż kamerÄ™ do ogniskowej"/> + </panel> + <joystick_rotate name="cam_rotate_stick" tool_tip="Obracaj kamerÄ™ wokoÅ‚ osi"/> + <panel name="camera_presets"> + <button name="rear_view" tool_tip="Widok z tyÅ‚u"/> + <button name="group_view" tool_tip="PodglÄ…d Grupy"/> + <button name="front_view" tool_tip="Widok z przodu"/> + <button name="mouselook_view" tool_tip="Widok panoramiczny"/> + </panel> + </panel> + <panel name="buttons"> + <button label="" name="orbit_btn" tool_tip="Obracaj kamerÄ™"/> + <button label="" name="pan_btn" tool_tip="Kamera horyzontalna"/> + <button label="" name="avatarview_btn" tool_tip="Ustawienia"/> + <button label="" name="freecamera_btn" tool_tip="PodglÄ…d obiektu"/> </panel> </floater> diff --git a/indra/newview/skins/default/xui/pl/floater_choose_group.xml b/indra/newview/skins/default/xui/pl/floater_choose_group.xml index 72b6617094..877cedc0bc 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_choose_group.xml +++ b/indra/newview/skins/default/xui/pl/floater_choose_group.xml @@ -1,8 +1,8 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="groups" title="GRUPY"> <text name="groupdesc"> - Wybierz grupÄ™: + Wybierz GrupÄ™: </text> - <button label="OK" label_selected="OK" name="OK" /> - <button label="Anuluj" label_selected="Anuluj" name="Cancel" /> + <button label="OK" label_selected="OK" name="OK"/> + <button label="Anuluj" label_selected="Anuluj" name="Cancel"/> </floater> diff --git a/indra/newview/skins/default/xui/pl/floater_color_picker.xml b/indra/newview/skins/default/xui/pl/floater_color_picker.xml index 904a2cc270..a607ca982f 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_color_picker.xml +++ b/indra/newview/skins/default/xui/pl/floater_color_picker.xml @@ -1,5 +1,5 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="ColorPicker" title="WYBÓR KOLORU"> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="ColorPicker" title="WYBIERZ KOLOR"> <text name="r_val_text"> Czerwony: </text> @@ -18,14 +18,14 @@ <text name="l_val_text"> Luminacja: </text> - <check_box label="Zastosuj od razu" name="apply_immediate" /> - <button label="" label_selected="" name="color_pipette" /> - <button label="Anuluj" label_selected="Anuluj" name="cancel_btn" /> - <button label="Wybierz" label_selected="Wybierz" name="select_btn" /> + <check_box label="Zastosuj teraz" name="apply_immediate"/> + <button label="" label_selected="" name="color_pipette"/> + <button label="Anuluj" label_selected="Anuluj" name="cancel_btn"/> + <button label="OK" label_selected="OK" name="select_btn"/> <text name="Current color:"> - Obecny Kolor: + Obecny kolor: </text> <text name="(Drag below to save.)"> - (PrzeciÄ…gnij tutaj) + (PrzeciÄ…gnij tutaj aby zapisać) </text> </floater> diff --git a/indra/newview/skins/default/xui/pl/floater_critical.xml b/indra/newview/skins/default/xui/pl/floater_critical.xml index 8221a4e1bd..8221a4e1bd 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_critical.xml +++ b/indra/newview/skins/default/xui/pl/floater_critical.xml diff --git a/indra/newview/skins/default/xui/pl/floater_customize.xml b/indra/newview/skins/default/xui/pl/floater_customize.xml index 0c01d15faf..dd1d5cf684 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_customize.xml +++ b/indra/newview/skins/default/xui/pl/floater_customize.xml @@ -1,7 +1,9 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="floater customize" title="WYGLÄ„D"> <tab_container name="customize tab container"> - <placeholder label="Części CiaÅ‚a" name="body_parts_placeholder"/> + <text label="Części CiaÅ‚a" name="body_parts_placeholder"> + Części ciaÅ‚a + </text> <panel label="KsztaÅ‚t" name="Shape"> <button label="Wróć" label_selected="Wróć" name="Revert"/> <button label="CiaÅ‚o" label_selected="CiaÅ‚o" name="Body"/> @@ -14,8 +16,8 @@ <button label="Tułów" label_selected="Tułów" name="Torso"/> <button label="Nogi" label_selected="Nogi" name="Legs"/> <radio_group name="sex radio"> - <radio_item name="radio" label="Kobieta"/> - <radio_item name="radio2" label="Mężczyzna"/> + <radio_item label="Kobieta" name="radio" value="0"/> + <radio_item label="Mężczyzna" name="radio2" value="1"/> </radio_group> <text name="title"> [DESC] @@ -33,9 +35,7 @@ Zapisane w [PATH] </text> <text name="not worn instructions"> - Załóż nowy ksztaÅ‚t poprzez przeciÄ…gniÄ™cie go ze swojej szafy -na awatara. Alternatywnie, możesz także stworzyć wÅ‚asny ksztaÅ‚t -z plików roboczych. + Załóż nowy ksztaÅ‚t poprzez przeciÄ…gniÄ™cie go ze swojej szafy na awatara. Alternatywnie, możesz także stworzyć wÅ‚asny ksztaÅ‚t z plików roboczych. </text> <text name="no modify instructions"> Nie posiadasz prawa do modyfikowania tego ksztaÅ‚tu. @@ -43,15 +43,15 @@ z plików roboczych. <text name="Item Action Label"> KsztaÅ‚t: </text> - <button label="Nowy KsztaÅ‚t" label_selected="Nowy KsztaÅ‚t" name="Create New"/> + <button label="Nowy ksztaÅ‚t" label_selected="Nowy ksztaÅ‚t" name="Create New"/> <button label="Zapisz" label_selected="Zapisz" name="Save"/> - <button label="Zapisz Jako..." label_selected="Zapisz Jako..." name="Save As"/> + <button label="Zapisz jako..." label_selected="Zapisz jako..." name="Save As"/> </panel> <panel label="Skórka" name="Skin"> - <button label="Kolor Skórki" label_selected="Kolor Skórki" name="Skin Color"/> - <button label="Detale Twarzy" label_selected="Detale Twarzy" name="Face Detail"/> + <button label="Kolor skórki" label_selected="Kolor skórki" name="Skin Color"/> + <button label="Detale twarzy" label_selected="Detale twarzy" name="Face Detail"/> <button label="Makijaż" label_selected="Makijaż" name="Makeup"/> - <button label="Detale CiaÅ‚a" label_selected="Detale CiaÅ‚a" name="Body Detail"/> + <button label="Detale ciaÅ‚a" label_selected="Detale ciaÅ‚a" name="Body Detail"/> <text name="title"> [DESC] </text> @@ -68,9 +68,7 @@ z plików roboczych. Zapisane w [PATH] </text> <text name="not worn instructions"> - Załóż nowÄ… skórkÄ™ poprzez przeciÄ…gniÄ™cie jej ze swojej szafy -na awatara. Alternatywnie, możesz także stworzyć wÅ‚asnÄ… skórkÄ™ -z plików roboczych. + Załóż nowÄ… skórkÄ™ poprzez przeciÄ…gniÄ™cie jej ze swojej szafy na awatara. Alternatywnie, możesz także stworzyć wÅ‚asnÄ… skórkÄ™ z plików roboczych. </text> <text name="no modify instructions"> Nie posiadasz prawa do modyfikowania tej skórki. @@ -78,12 +76,12 @@ z plików roboczych. <text name="Item Action Label"> Skórka: </text> - <texture_picker label="Tatuaże GÅ‚owy" name="Head Tattoos" tool_tip="Kliknij by wybrać teksturÄ™"/> - <texture_picker label="Tatuaże Górne" name="Upper Tattoos" tool_tip="Kliknij by wybrać teksturÄ™"/> - <texture_picker label="Tatuaże Dolne" name="Lower Tattoos" tool_tip="Kliknij by wybrać teksturÄ™"/> - <button label="Nowa Skórka" label_selected="Nowa Skórka" name="Create New"/> + <texture_picker label="Tatuaże gÅ‚owy" name="Head Tattoos" tool_tip="Kliknij by wybrać teksturÄ™"/> + <texture_picker label="Tatuaże górne" name="Upper Tattoos" tool_tip="Kliknij by wybrać teksturÄ™"/> + <texture_picker label="Tatuaże dolne" name="Lower Tattoos" tool_tip="Kliknij by wybrać teksturÄ™"/> + <button label="Nowa skórka" label_selected="Nowa skórka" name="Create New"/> <button label="Zapisz" label_selected="Zapisz" name="Save"/> - <button label="Zapisz Jako..." label_selected="Zapisz Jako..." name="Save As"/> + <button label="Zapisz jako..." label_selected="Zapisz jako..." name="Save As"/> <button label="Wróć" label_selected="Wróć" name="Revert"/> </panel> <panel label="WÅ‚osy" name="Hair"> @@ -107,9 +105,7 @@ z plików roboczych. Zapisane w [PATH] </text> <text name="not worn instructions"> - Załóż nowe wÅ‚osy poprzez przeciÄ…gniÄ™cie ich ze swojej szafy -na awatara. Alternatywnie, możesz także stworzyć wÅ‚asne wÅ‚osy -z plików roboczych. + Załóż nowe wÅ‚osy poprzez przeciÄ…gniÄ™cie ich ze swojej szafy na awatara. Alternatywnie, możesz także stworzyć wÅ‚asne wÅ‚osy z plików roboczych. </text> <text name="no modify instructions"> Nie posiadasz prawa do modyfikowania tych wÅ‚osów. @@ -118,9 +114,9 @@ z plików roboczych. WÅ‚osy: </text> <texture_picker label="Tekstura" name="Texture" tool_tip="Kliknij by wybrać teksturÄ™"/> - <button label="Nowe WÅ‚osy" label_selected="Nowe WÅ‚osy" name="Create New"/> + <button label="Nowe wÅ‚osy" label_selected="Nowe wÅ‚osy" name="Create New"/> <button label="Zapisz" label_selected="Zapisz" name="Save"/> - <button label="Zapisz Jako..." label_selected="Zapisz Jako..." name="Save As"/> + <button label="Zapisz jako..." label_selected="Zapisz jako..." name="Save As"/> <button label="Wróć" label_selected="Wróć" name="Revert"/> </panel> <panel label="Oczy" name="Eyes"> @@ -140,9 +136,7 @@ z plików roboczych. Zapisane w [PATH] </text> <text name="not worn instructions"> - Załóż nowe oczy poprzez przeciÄ…gniÄ™cie ich ze swojej szafy -na awatara. Alternatywnie, możesz także stworzyć wÅ‚asne oczy -z plików roboczych. + Załóż nowe oczy poprzez przeciÄ…gniÄ™cie ich ze swojej szafy na awatara. Alternatywnie, możesz także stworzyć wÅ‚asne oczy z plików roboczych. </text> <text name="no modify instructions"> Nie posiadasz prawa do modyfikowania tych oczów. @@ -151,19 +145,21 @@ z plików roboczych. Oczy: </text> <texture_picker label="TÄ™czówka" name="Iris" tool_tip="Kliknij by wybrać teksturÄ™"/> - <button label="Nowe Oczy" label_selected="Nowe Oczy" name="Create New"/> + <button label="Nowe oczy" label_selected="Nowe oczy" name="Create New"/> <button label="Zapisz" label_selected="Zapisz" name="Save"/> - <button label="Zapisz Jako..." label_selected="Zapisz Jako..." name="Save As"/> + <button label="Zapisz jako..." label_selected="Zapisz jako..." name="Save As"/> <button label="Wróć" label_selected="Wróć" name="Revert"/> </panel> - <panel label="Ubrania" name="clothes_placeholder"/> + <text label="Ubrania" name="clothes_placeholder"> + Ubrania + </text> <panel label="Koszula" name="Shirt"> <texture_picker label="MateriaÅ‚" name="Fabric" tool_tip="Kliknij by wybrać teksturÄ™"/> - <color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij by wybrać kolor"/> - <button label="Nowa Koszula" label_selected="Nowa Koszula" name="Create New"/> + <color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij aby wybrać kolor"/> <button label="Zdejmij" label_selected="Zdejmij" name="Take Off"/> + <button label="Nowa Koszula" label_selected="Nowa Koszula" name="Create New"/> <button label="Zapisz" label_selected="Zapisz" name="Save"/> - <button label="Zapisz Jako..." label_selected="Zapisz Jako..." name="Save As"/> + <button label="Zapisz jako..." label_selected="Zapisz jako..." name="Save As"/> <button label="Wróć" label_selected="Wróć" name="Revert"/> <text name="title"> [DESC] @@ -181,9 +177,7 @@ z plików roboczych. Zapisane w [PATH] </text> <text name="not worn instructions"> - Załóż nowÄ… koszulÄ™ poprzez przeciÄ…gniÄ™cie jej ze swojej szafy -na awatara. Alternatywnie, możesz także stworzyć wÅ‚asnÄ… koszulÄ™ -z plików roboczych. + Załóż nowÄ… koszulÄ™ poprzez przeciÄ…gniÄ™cie jej ze swojej szafy na awatara. Alternatywnie, możesz także stworzyć wÅ‚asnÄ… koszulÄ™ z plików roboczych. </text> <text name="no modify instructions"> Nie posiadasz prawa do modyfikowania tej koszuli. @@ -194,11 +188,11 @@ z plików roboczych. </panel> <panel label="Spodnie" name="Pants"> <texture_picker label="MateriaÅ‚" name="Fabric" tool_tip="Kliknij tutaj by wybrać teksturÄ™"/> - <color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij by wybrać kolor"/> - <button label="Nowe Spodnie" label_selected="Nowe Spodnie" name="Create New"/> + <color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij aby wybrać kolor"/> <button label="Zdejmij" label_selected="Zdejmij" name="Take Off"/> + <button label="Nowe spodnie" label_selected="Nowe spodnie" name="Create New"/> <button label="Zapisz" label_selected="Zapisz" name="Save"/> - <button label="Zapisz Jako..." label_selected="Zapisz Jako..." name="Save As"/> + <button label="Zapisz jako..." label_selected="Zapisz jako..." name="Save As"/> <button label="Wróć" label_selected="Wróć" name="Revert"/> <text name="title"> [DESC] @@ -216,9 +210,7 @@ z plików roboczych. Zapisane w [PATH] </text> <text name="not worn instructions"> - Załóż nowe spodnie poprzez przeciÄ…gniÄ™cie ich ze swojej szafy -na awatara. Alternatywnie, możesz także stworzyć wÅ‚asne spodnie -z plików roboczych. + Załóż nowe spodnie poprzez przeciÄ…gniÄ™cie ich ze swojej szafy na awatara. Alternatywnie, możesz także stworzyć wÅ‚asne spodnie z plików roboczych. </text> <text name="no modify instructions"> Nie posiadasz prawa do modyfikowania tych spodni. @@ -244,10 +236,9 @@ z plików roboczych. Zapisane w [PATH] </text> <text name="not worn instructions"> - Załóż nowe buty poprzez przeciÄ…gniÄ™cie ich ze swojej szafy -na awatara. Alternatywnie, możesz także stworzyć wÅ‚asne buty -z plików roboczych. + Załóż nowe buty poprzez przeciÄ…gniÄ™cie ich ze swojej szafy na awatara. Alternatywnie, możesz także stworzyć wÅ‚asne buty z plików roboczych. </text> + <button label="Nowe Buty" label_selected="Nowe Buty" name="Create New"/> <text name="no modify instructions"> Nie posiadasz prawa do modyfikowania tych butów. </text> @@ -255,11 +246,10 @@ z plików roboczych. Buty: </text> <texture_picker label="MateriaÅ‚" name="Fabric" tool_tip="Kliknij by wybrać teksturÄ™"/> - <color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij by wybrać kolor"/> - <button label="Nowe Buty" label_selected="Nowe Buty" name="Create New"/> + <color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij aby wybrać kolor"/> <button label="Zdejmij" label_selected="Zdejmij" name="Take Off"/> <button label="Zapisz" label_selected="Zapisz" name="Save"/> - <button label="Zapisz Jako..." label_selected="Zapisz Jako..." name="Save As"/> + <button label="Zapisz jako..." label_selected="Zapisz jako..." name="Save As"/> <button label="Wróć" label_selected="Wróć" name="Revert"/> </panel> <panel label="Skarpety" name="Socks"> @@ -279,10 +269,9 @@ z plików roboczych. Zapisane w [PATH] </text> <text name="not worn instructions"> - Załóż nowe skarpety poprzez przeciÄ…gniÄ™cie ich ze swojej szafy -na awatara. Alternatywnie, możesz także stworzyć wÅ‚asne skarpety -z plików roboczych. + Załóż nowe skarpety poprzez przeciÄ…gniÄ™cie ich ze swojej szafy na awatara. Alternatywnie, możesz także stworzyć wÅ‚asne skarpety z plików roboczych. </text> + <button label="Nowe Skarpety" label_selected="Nowe Skarpety" name="Create New"/> <text name="no modify instructions"> Nie posiadasz prawa do modyfikowania tych skarpet. </text> @@ -290,11 +279,10 @@ z plików roboczych. Skarpetki: </text> <texture_picker label="MateriaÅ‚" name="Fabric" tool_tip="Kliknij by wybrać teksturÄ™"/> - <color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij by wybrać kolor"/> - <button label="Nowe Skarpety" label_selected="Nowe Skarpety" name="Create New"/> + <color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij aby wybrać kolor"/> <button label="Zdejmij" label_selected="Zdejmij" name="Take Off"/> <button label="Zapisz" label_selected="Zapisz" name="Save"/> - <button label="Zapisz Jako..." label_selected="Zapisz Jako..." name="Save As"/> + <button label="Zapisz jako..." label_selected="Zapisz jako..." name="Save As"/> <button label="Wróć" label_selected="Wróć" name="Revert"/> </panel> <panel label="Kurtka" name="Jacket"> @@ -314,23 +302,21 @@ z plików roboczych. Zapisane w [PATH] </text> <text name="not worn instructions"> - Załóż nowÄ… kurtkÄ™ poprzez przeciÄ…gniÄ™cie jej ze swojej szafy -na awatara. Alternatywnie, możesz także stworzyć wÅ‚asnÄ… kurtkÄ™ -z plików roboczych. + Załóż nowÄ… kurtkÄ™ poprzez przeciÄ…gniÄ™cie jej ze swojej szafy na awatara. Alternatywnie, możesz także stworzyć wÅ‚asnÄ… kurtkÄ™ z plików roboczych. </text> + <button label="Nowa Kurtka" label_selected="Nowa Kurtka" name="Create New"/> <text name="no modify instructions"> Nie posiadasz prawa do modyfikowania tej kurtki. </text> <text name="Item Action Label"> Kurtka: </text> - <texture_picker label="Górny MateriaÅ‚" name="Upper Fabric" tool_tip="Kliknij by wybrać teksturÄ™" width="76"/> - <texture_picker label="Dolny MateriaÅ‚" name="Lower Fabric" tool_tip="Kliknij by wybrać kolor" width="76"/> - <color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij by wybrać kolor" width="76"/> - <button label="Nowa Kurtka" label_selected="Nowa Kurtka" name="Create New"/> + <texture_picker label="Górny materiaÅ‚" name="Upper Fabric" tool_tip="Kliknij by wybrać teksturÄ™" width="76"/> + <texture_picker label="Dolny materiaÅ‚" name="Lower Fabric" tool_tip="Kliknij by wybrać kolor" width="76"/> + <color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij aby wybrać kolor" width="76"/> <button label="Zdejmij" label_selected="Zdejmij" name="Take Off"/> <button label="Zapisz" label_selected="Zapisz" name="Save"/> - <button label="Zapisz Jako..." label_selected="Zapisz Jako..." name="Save As"/> + <button label="Zapisz jako..." label_selected="Zapisz jako..." name="Save As"/> <button label="Wróć" label_selected="Wróć" name="Revert"/> </panel> <panel label="RÄ™kawiczki" name="Gloves"> @@ -350,10 +336,9 @@ z plików roboczych. Zapisane w [PATH] </text> <text name="not worn instructions"> - Załóż nowe rÄ™kawiczki poprzez przeciÄ…gniÄ™cie ich ze swojej szafy -na awatara. Alternatywnie, możesz także stworzyć wÅ‚asne rÄ™kawiczki -z plików roboczych. + Załóż nowe rÄ™kawiczki poprzez przeciÄ…gniÄ™cie ich ze swojej szafy na awatara. Alternatywnie, możesz także stworzyć wÅ‚asne rÄ™kawiczki z plików roboczych. </text> + <button label="Nowe RÄ™kawiczki" label_selected="Nowe RÄ™kawiczki" name="Create New"/> <text name="no modify instructions"> Nie posiadasz prawa do modyfikowania tych rÄ™kawiczek </text> @@ -361,11 +346,10 @@ z plików roboczych. RÄ™kawiczki: </text> <texture_picker label="MateriaÅ‚" name="Fabric" tool_tip="Kliknij by wybrać teksturÄ™"/> - <color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij by wybrać kolor"/> - <button label="Nowe RÄ™kawiczki" label_selected="Nowe RÄ™kawiczki" name="Create New"/> + <color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij aby wybrać kolor"/> <button label="Zdejmij" label_selected="Zdejmij" name="Take Off"/> <button label="Zapisz" label_selected="Zapisz" name="Save"/> - <button label="Zapisz Jako..." label_selected="Zapisz Jako..." name="Save As"/> + <button label="Zapisz jako..." label_selected="Zapisz jako..." name="Save As"/> <button label="Wróć" label_selected="Wróć" name="Revert"/> </panel> <panel label="Podkoszulek" name="Undershirt"> @@ -385,10 +369,9 @@ z plików roboczych. Zapisane w [PATH] </text> <text name="not worn instructions"> - Załóż nowy podkoszulek poprzez przeciÄ…gniÄ™cie ich ze swojej szafy -na awatara. Alternatywnie, możesz także stworzyć wÅ‚asny podkoszulek -z plików roboczych. + Załóż nowy podkoszulek poprzez przeciÄ…gniÄ™cie ich ze swojej szafy na awatara. Alternatywnie, możesz także stworzyć wÅ‚asny podkoszulek z plików roboczych. </text> + <button label="Nowy Podkoszulek" label_selected="Nowy Podkoszulek" name="Create New"/> <text name="no modify instructions"> Nie posiadasz prawa do modyfikowania tego podkoszulka. </text> @@ -396,11 +379,10 @@ z plików roboczych. Podkoszulka: </text> <texture_picker label="MateriaÅ‚" name="Fabric" tool_tip="Kliknij by wybrać teksturÄ™"/> - <color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij by wybrać kolor"/> - <button label="Nowy Podkoszulek" label_selected="Nowy Podkoszulek" name="Create New"/> + <color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij aby wybrać kolor"/> <button label="Zdejmij" label_selected="Zdejmij" name="Take Off"/> <button label="Zapisz" label_selected="Zapisz" name="Save"/> - <button label="Zapisz Jako..." label_selected="Zapisz Jako..." name="Save As"/> + <button label="Zapisz jako..." label_selected="Zapisz jako..." name="Save As"/> <button label="Wróć" label_selected="Wróć" name="Revert"/> </panel> <panel label="Bielizna" name="Underpants"> @@ -420,10 +402,9 @@ z plików roboczych. Zapisane w [PATH] </text> <text name="not worn instructions"> - Załóż nowÄ… bieliznÄ™ poprzez przeciÄ…gniÄ™cie jej ze swojej szafy -na awatara. Alternatywnie, możesz także stworzyć wÅ‚asnÄ… bieliznÄ™ -z plików roboczych. + Załóż nowÄ… bieliznÄ™ poprzez przeciÄ…gniÄ™cie jej ze swojej szafy na awatara. Alternatywnie, możesz także stworzyć wÅ‚asnÄ… bieliznÄ™ z plików roboczych. </text> + <button label="Nowa Bielizna" label_selected="Nowa Bielizna" name="Create New"/> <text name="no modify instructions"> Nie posiadasz prawa do modyfikowania tej bielizny. </text> @@ -431,11 +412,10 @@ z plików roboczych. Bielizna: </text> <texture_picker label="MateriaÅ‚" name="Fabric" tool_tip="Kliknij by wybrać teksturÄ™"/> - <color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij by wybrać kolor"/> - <button label="Nowa Bielizna" label_selected="Nowa Bielizna" name="Create New"/> + <color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij aby wybrać kolor"/> <button label="Zdejmij" label_selected="Zdejmij" name="Take Off"/> <button label="Zapisz" label_selected="Zapisz" name="Save"/> - <button label="Zapisz Jako..." label_selected="Zapisz Jako..." name="Save As"/> + <button label="Zapisz jako..." label_selected="Zapisz jako..." name="Save As"/> <button label="Wróć" label_selected="Wróć" name="Revert"/> </panel> <panel label="Spódnica" name="Skirt"> @@ -455,10 +435,9 @@ z plików roboczych. Zapisane w [PATH] </text> <text name="not worn instructions"> - Załóż nowÄ… spódnicÄ™ poprzez przeciÄ…gniÄ™cie jej ze swojej szafy -na awatara. Alternatywnie, możesz także stworzyć wÅ‚asnÄ… spódnicÄ™ -z plików roboczych. + Załóż nowÄ… spódnicÄ™ poprzez przeciÄ…gniÄ™cie jej ze swojej szafy na awatara. Alternatywnie, możesz także stworzyć wÅ‚asnÄ… spódnicÄ™ z plików roboczych. </text> + <button label="Nowa Spódnica" label_selected="Nowa Spódnica" name="Create New"/> <text name="no modify instructions"> Nie posiadasz prawa do modyfikowania tej spódnicy. </text> @@ -466,15 +445,85 @@ z plików roboczych. Spódnica: </text> <texture_picker label="MateriaÅ‚" name="Fabric" tool_tip="Kliknij by wybrać teksturÄ™"/> - <color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij by wybrać kolor"/> - <button label="Nowa Spódnica" label_selected="Nowa Spódnica" name="Create New"/> + <color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij aby wybrać kolor"/> + <button label="Zdejmij" label_selected="Zdejmij" name="Take Off"/> + <button label="Zapisz" label_selected="Zapisz" name="Save"/> + <button label="Zapisz jako..." label_selected="Zapisz jako..." name="Save As"/> + <button label="Wróć" label_selected="Wróć" name="Revert"/> + </panel> + <panel label="Tatuaż" name="Tattoo"> + <text name="title"> + [DESC] + </text> + <text name="title_no_modify"> + [DESC]: nie można modyfikować + </text> + <text name="title_loading"> + [DESC]: Å‚adowanie... + </text> + <text name="title_not_worn"> + [DESC]: nienaÅ‚ożone + </text> + <text name="path"> + Zapisane w [PATH] + </text> + <text name="not worn instructions"> + Załóż nowy tatuaż poprzez przeciÄ…gniÄ™cie go ze swojej szafy na awatara. Alternatywnie, możesz także stworzyć wÅ‚asny tatuaż z plików roboczych. + </text> + <button label="Utwórz Nowy Tatuaż" label_selected="Stwórz Nowy Tatuaż" name="Create New"/> + <text name="no modify instructions"> + Nie posiadasz uprawnieÅ„ do modyfikowania tych ubraÅ„/części ciaÅ‚a. + </text> + <text name="Item Action Label"> + Tatuaż: + </text> + <texture_picker label="Tatuaż gÅ‚owy" name="Head Tattoo" tool_tip="Kliknij aby wybrać teksturÄ™"/> + <texture_picker label="Górny tatuaż" name="Upper Tattoo" tool_tip="Kliknij aby wybrać teksturÄ™"/> + <texture_picker label="Tatuaż dolnej części ciaÅ‚a" name="Lower Tattoo" tool_tip="Kliknij aby wybrać teksturÄ™"/> + <button label="Zdejmij" label_selected="Zdejmij" name="Take Off"/> + <button label="Zapisz" label_selected="Zapisz" name="Save"/> + <button label="Zapisz jako..." label_selected="Zapisz jako..." name="Save As"/> + <button label="Wróć" label_selected="Wróć" name="Revert"/> + </panel> + <panel label="Alpha" name="Alpha"> + <text name="title"> + [DESC] + </text> + <text name="title_no_modify"> + [DESC]: nie można modyfikować + </text> + <text name="title_loading"> + [DESC]: Å‚adowanie... + </text> + <text name="title_not_worn"> + [DESC]: nienaÅ‚ożone + </text> + <text name="path"> + Zapisane w [PATH] + </text> + <text name="not worn instructions"> + Załóż nowÄ… maskÄ™ alpha poprzez przeciÄ…gniÄ™cie jej ze swojej szafy na awatara. Alternatywnie, możesz także stworzyć wÅ‚asnÄ… z plików roboczych. + </text> + <button label="Stwórz nowÄ… Alpha" label_selected="Utwórz NowÄ… Alpha" name="Create New"/> + <text name="no modify instructions"> + Nie posiadasz uprawnieÅ„ do modyfikowania tych ubraÅ„/części ciaÅ‚a. + </text> + <text name="Item Action Label"> + Alpha: + </text> + <texture_picker label="Dolna Alpha" name="Lower Alpha" tool_tip="Kliknij aby wybrać teksturÄ™"/> + <texture_picker label="Alpha górnej części ciaÅ‚a" name="Upper Alpha" tool_tip="Kliknij aby wybrać teksturÄ™"/> + <texture_picker label="Alpha gÅ‚owy" name="Head Alpha" tool_tip="Kliknij aby wybrać teksturÄ™"/> + <texture_picker label="Alpha oka" name="Eye Alpha" tool_tip="Kliknij aby wybrać teksturÄ™"/> + <texture_picker label="Alpha wÅ‚osów" name="Hair Alpha" tool_tip="Kliknij aby wybrać teksturÄ™"/> <button label="Zdejmij" label_selected="Zdejmij" name="Take Off"/> <button label="Zapisz" label_selected="Zapisz" name="Save"/> - <button label="Zapisz Jako..." label_selected="Zapisz Jako..." name="Save As"/> + <button label="Zapisz jako..." label_selected="Zapisz jako..." name="Save As"/> <button label="Wróć" label_selected="Wróć" name="Revert"/> </panel> </tab_container> + <button label="Info o skrypcie" label_selected="Info o skrypcie" name="script_info" tool_tip="Pokaż skrypty przyłączone do Twojego awatara"/> + <button label="Stwórz ubranie" label_selected="Stwórz Ubranie" name="make_outfit_btn"/> <button label="Anuluj" label_selected="Anuluj" name="Cancel"/> <button label="OK" label_selected="OK" name="Ok"/> - <button label="Stwórz Ubranie..." label_selected="Stwórz Ubranie..." name="Make Outfit" width="115"/> </floater> diff --git a/indra/newview/skins/default/xui/pl/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/pl/floater_day_cycle_options.xml index 6671bb853e..0cb2114f99 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_day_cycle_options.xml +++ b/indra/newview/skins/default/xui/pl/floater_day_cycle_options.xml @@ -62,7 +62,7 @@ <button label="Dodaj" label_selected="Dodaj" name="WLAddKey" /> <button label="UsuÅ„" label_selected="UsuÅ„" name="WLDeleteKey" /> <text name="WLCurKeyFrameText"> - Preferencje Czasu: + Preferencje czasu: </text> <text name="WLCurKeyTimeText"> Czas: @@ -78,7 +78,7 @@ </text> <combo_box label="5 min" name="WLSnapOptions" /> <text name="DayCycleText2"> - DÅ‚ugość Cyklu: + DÅ‚ugość cyklu: </text> <spinner label="Godz" name="WLLengthOfDayHour" /> <spinner label="Min" name="WLLengthOfDayMin" /> @@ -88,11 +88,11 @@ </text> <button label="Start" label_selected="Start" name="WLAnimSky" /> <button label="Stop" label_selected="Stop" name="WLStopAnimSky" /> - <button label="Używaj Czasu Regionu" label_selected="Używaj Czasu Regionu" + <button label="Używaj czasu regionu" label_selected="Używaj czasu regionu" name="WLUseLindenTime" /> - <button label="Zapisz Test Dnia" label_selected="Zapisz Test Dnia" + <button label="Zapisz test dnia" label_selected="Zapisz test dnia" name="WLSaveDayCycle" /> - <button label="ZaÅ‚aduj Test Dnia" label_selected="ZaÅ‚aduj Test Dnia" + <button label="ZaÅ‚aduj test dnia" label_selected="ZaÅ‚aduj test dnia" name="WLLoadDayCycle" /> </panel> </tab_container> diff --git a/indra/newview/skins/default/xui/pl/floater_device_settings.xml b/indra/newview/skins/default/xui/pl/floater_device_settings.xml index e79478731d..c485fb2e29 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_device_settings.xml +++ b/indra/newview/skins/default/xui/pl/floater_device_settings.xml @@ -1,3 +1,2 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="floater_device_settings" - title="USTAWIENIA URZÄ„DZEŃ KOMUNIKACJI GÅOSOWEJ" /> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_device_settings" title="USTAWIENIA URZÄ„DZEŃ KOMUNIKACJI GÅOSOWEJ"/> diff --git a/indra/newview/skins/default/xui/pl/floater_env_settings.xml b/indra/newview/skins/default/xui/pl/floater_env_settings.xml index e197d94b27..3ab854fbbb 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_env_settings.xml +++ b/indra/newview/skins/default/xui/pl/floater_env_settings.xml @@ -1,26 +1,28 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="Environment Editor Floater" title="EDYTOR ÅšRODOWISKA"> + <floater.string name="timeStr"> + [hour12,datetime,utc]:[min,datetime,utc] [ampm,datetime,utc] + </floater.string> <text name="EnvTimeText"> Czas </text> <text name="EnvTimeText2"> 12:00 PM </text> - <slider label="" name="EnvTimeSlider" /> + <slider label="" name="EnvTimeSlider"/> <text name="EnvCloudText"> Chmury: </text> - <slider label="" name="EnvCloudSlider" /> + <slider label="" name="EnvCloudSlider"/> <text name="EnvWaterColorText"> - Kolor Wody + Kolor wody </text> - <color_swatch label="" name="EnvWaterColor" tool_tip="Kliknij by wybrać kolor" /> + <color_swatch label="" name="EnvWaterColor" tool_tip="Kliknij aby wybrać kolor"/> <text name="EnvWaterFogText"> Zamglenie: </text> - <slider label="" name="EnvWaterFogSlider" /> - <button label="Używaj Czasu Regionu" name="EnvUseEstateTimeButton" /> - <button label="Zaawansowane Niebo" name="EnvAdvancedSkyButton" /> - <button label="Zaawansowana Woda" name="EnvAdvancedWaterButton" /> - <button label="?" name="EnvSettingsHelpButton" /> + <slider label="" name="EnvWaterFogSlider"/> + <button label="Używaj czasu regionu" name="EnvUseEstateTimeButton"/> + <button label="Zaawansowane niebo" name="EnvAdvancedSkyButton"/> + <button label="Zaawansowana woda" name="EnvAdvancedWaterButton"/> </floater> diff --git a/indra/newview/skins/default/xui/pl/floater_event.xml b/indra/newview/skins/default/xui/pl/floater_event.xml new file mode 100644 index 0000000000..7588493464 --- /dev/null +++ b/indra/newview/skins/default/xui/pl/floater_event.xml @@ -0,0 +1,72 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater label="IMPREZA" name="Event" title="IMPREZA"> + <floater.string name="none"> + żadne + </floater.string> + <floater.string name="notify"> + Zawiadom + </floater.string> + <floater.string name="dont_notify"> + Nie zawiadamiaj + </floater.string> + <floater.string name="moderate"> + Mature + </floater.string> + <floater.string name="adult"> + Adult + </floater.string> + <floater.string name="general"> + PG + </floater.string> + <floater.string name="unknown"> + Nieznana + </floater.string> + <layout_stack name="layout"> + <layout_panel name="profile_stack"> + <text name="event_name"> + Brak nazwy dla wydarzenia. + </text> + <text name="event_category"> + (bez kategorii) + </text> + <text name="event_runby_label"> + Prowadzona przez: + </text> + <text initial_value="(przetwarzanie)" name="event_runby"/> + <text name="event_date_label"> + Data: + </text> + <text name="event_date"> + 10/10/2010 + </text> + <text name="event_duration_label"> + DÅ‚ugość: + </text> + <text name="event_duration"> + 1 godzina + </text> + <text name="event_covercharge_label"> + OpÅ‚ata: + </text> + <text name="event_cover"> + Bez opÅ‚aty + </text> + <text name="event_location_label"> + Lokalizacja: + </text> + <text name="event_location" value="SampleParcel, Name Long (145, 228, 26)"/> + <text name="rating_label" value="Rodzaj:"/> + <text name="rating_value" value="nieznane"/> + <expandable_text name="event_desc"> + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. + </expandable_text> + </layout_panel> + <layout_panel name="button_panel"> + <button name="create_event_btn" tool_tip="Stwórz ImprezÄ™"/> + <button name="god_delete_event_btn" tool_tip="Skasuj ImprezÄ™"/> + <button label="Zawiadom mnie" name="notify_btn"/> + <button label="Teleportuj" name="teleport_btn"/> + <button label="Mapa" name="map_btn"/> + </layout_panel> + </layout_stack> +</floater> diff --git a/indra/newview/skins/default/xui/pl/floater_gesture.xml b/indra/newview/skins/default/xui/pl/floater_gesture.xml index 4685eb6afe..750a9e4a66 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_gesture.xml +++ b/indra/newview/skins/default/xui/pl/floater_gesture.xml @@ -1,16 +1,27 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="gestures" title="AKTYWNE GESTY"> - <text name="help_label"> - Kliknij podwójnie by aktywować gÅ‚os i animacjÄ™ gestu. - </text> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater label="Miejsca" name="gestures" title="GESTY"> + <floater.string name="loading"> + Åadowanie... + </floater.string> + <floater.string name="playing"> + (Odtwarzanie) + </floater.string> + <floater.string name="copy_name"> + Kopia [COPY_NAME] + </floater.string> <scroll_list name="gesture_list"> - <column label="Aktywuj" name="trigger" /> - <column label="Klucz" name="shortcut" /> - <column label="" name="key" /> - <column label="Nazwa" name="name" /> + <scroll_list.columns label="Nazwa" name="name"/> + <scroll_list.columns label="Czat" name="trigger"/> + <scroll_list.columns label="" name="key"/> + <scroll_list.columns label="Klucz" name="shortcut"/> </scroll_list> - <button label="Nowy" name="new_gesture_btn" /> - <button label="Edytuj" name="edit_btn" /> - <button label="Odtwarzaj" name="play_btn" /> - <button label="Zatrzymaj" name="stop_btn" /> + <panel label="bottom_panel" name="bottom_panel"> + <menu_button name="gear_btn" tool_tip="WiÄ™cej opcji"/> + <button name="new_gesture_btn" tool_tip="Stwórz nowÄ… gesturÄ™"/> + <button name="activate_btn" tool_tip="Aktywuj/Dezaktywuj wybrany gest"/> + <button name="del_btn" tool_tip="UsuÅ„ gest"/> + </panel> + <button label="Edytuj" name="edit_btn"/> + <button label="Odtwarzaj" name="play_btn"/> + <button label="Zatrzymaj" name="stop_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/pl/floater_god_tools.xml b/indra/newview/skins/default/xui/pl/floater_god_tools.xml index a3ccffac03..4d49c32fc1 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_god_tools.xml +++ b/indra/newview/skins/default/xui/pl/floater_god_tools.xml @@ -2,26 +2,25 @@ <floater name="godtools floater" title="BOSKIE NARZĘDZIA"> <tab_container name="GodTools Tabs"> <panel label="Grid" name="grid"> - <button width="205" label="UsuÅ„ wszystkich użytkowników" label_selected="UsuÅ„ wszystkich użytkowników" name="Kick all users"/> - <button width="285" label="Wyrównaj Widoczność Buforu Mapy Regionu" label_selected="Wyrównaj Widoczność Buforu Mapy Regionu" name="Flush This Region's Map Visibility Caches"/> + <button label="Wyrzuć wszystkich Rezydentów" label_selected="Wyrzuć wszystkich Rezydentów" name="Kick all users" width="205"/> + <button label="Wyrównaj widoczność buforu mapy Regionu" label_selected="Wyrównaj widoczność buforu mapy Regionu" name="Flush This Region's Map Visibility Caches" width="285"/> </panel> <panel label="Region" name="region"> <text name="Sim Name:" width="100"> Nazwa Symulatora: </text> - <line_editor left="115" name="region name" width="178" /> - <line_editor name="region name"/> - <check_box label="WstÄ™p" name="check prelude" /> + <line_editor left="115" name="region name" width="178"/> + <check_box label="WstÄ™p" name="check prelude" tool_tip="Set this to make the region a prelude"/> <check_box label="Korekta SÅ‚oÅ„ca" name="check fixed sun" tool_tip="Skorektuj ustawienia pozycji sÅ‚oÅ„ca."/> - <check_box height="32" label="Zresetuj PozycjÄ™ Miejsca Startowego" name="check reset home" /> - <check_box bottom_delta="-32" label="Widoczny" name="check visible" tool_tip="Wybierz tÄ™ opcjÄ™ by ustawić region widocznym dla wszystkich."/> + <check_box height="32" label="Zresetuj pozycjÄ™ Miejsca Startowego" name="check reset home" tool_tip="Zresetuj miejsce startu Rezydentów po teleportacji"/> + <check_box bottom_delta="-32" label="Widoczny" name="check visible" tool_tip="Wybierz tÄ… opcjÄ™ by ustawić region widocznym dla wszystkich."/> <check_box label="Zniszczenia" name="check damage" tool_tip="Wybierz tÄ™ opcjÄ™ by uruchomić opcjÄ™ zniszczeÅ„ w regionie."/> - <check_box label="Zablokuj Monitorowanie Trafficu" name="block dwell" tool_tip="Wybierz tÄ™ opcjÄ™ by zablokować monitorowanie trafficu w regionie."/> - <check_box label="Zablokuj Terraformowanie" name="block terraform" tool_tip="Wybierz tÄ™ opcjÄ™ by zablokować terraforming w regionie"/> - <check_box label="Piaskownica" name="is sandbox" /> - <button width="138" label="Ustal Teren" label_selected="Ustal Teren" name="Bake Terrain" tool_tip="ZapamiÄ™taj obecny teren jako poczÄ…tkowy dla cofniÄ™cia modyfikacji terenu."/> - <button width="138" label="CofniÄ™cie Modyfikacji" label_selected="CofniÄ™cie Modyfikacji" name="Revert Terrain" tool_tip="Przywróć Ustawienia DomyÅ›lne Regionu."/> - <button width="138" label="ZamieÅ„ Teren" label_selected="ZamieÅ„ Teren" name="Swap Terrain" /> + <check_box label="Zablokuj Monitorowanie Trafficu" name="block dwell" tool_tip="Wybierz tÄ… opcjÄ™ by zablokować monitorowanie trafficu w regionie."/> + <check_box label="Zablokuj Terraformowanie" name="block terraform" tool_tip="Wybierz tÄ… opcjÄ™ by zablokować terraforming w regionie"/> + <check_box label="Piaskownica" name="is sandbox" tool_tip="Toggle whether this is a sandbox region"/> + <button label="Ustal teren" label_selected="Ustal teren" name="Bake Terrain" tool_tip="ZapamiÄ™taj obecny teren jako poczÄ…tkowy dla cofniÄ™cia modyfikacji terenu." width="138"/> + <button label="CofniÄ™cie modyfikacji" label_selected="CofniÄ™cie modyfikacji" name="Revert Terrain" tool_tip="Przywróć ustawienia domyÅ›lne Regionu." width="138"/> + <button label="ZamieÅ„ teren" label_selected="ZamieÅ„ teren" name="Swap Terrain" tool_tip="Swap current terrain with default" width="138"/> <text name="estate id"> ID Regionu: </text> @@ -33,46 +32,46 @@ <text name="Grid Pos: "> Pozycje Gridu: </text> - <line_editor name="gridposx" tool_tip="Pozycja x gridu dla regionu" left_delta="110" width="35" /> - <line_editor name="gridposy" tool_tip="Pozycja y gridu dla regionu" left_delta="45" width="35" /> + <line_editor left_delta="110" name="gridposx" tool_tip="Pozycja x gridu dla regionu" width="35"/> + <line_editor left_delta="45" name="gridposy" tool_tip="Pozycja y gridu dla regionu" width="35"/> <text name="Redirect to Grid: "> Przełącz do gridu: </text> - <line_editor left_delta="110" name="redirectx" width="35" /> - <line_editor left_delta="45" name="redirecty" width="35" /> - <spinner name="billable factor"/> + <line_editor left_delta="110" name="redirectx" width="35"/> + <line_editor left_delta="45" name="redirecty" width="35"/> <text name="billable factor text"> - Czynnik PÅ‚atnoÅ›ci: + Czynnik pÅ‚atnoÅ›ci: </text> - <spinner name="land cost"/> + <spinner name="billable factor"/> <text name="land cost text"> L$/m²: </text> - <button label="OdÅ›wież" label_selected="OdÅ›wież" name="Refresh" /> - <button label="Zastosuj" label_selected="Zastosuj" name="Apply" /> - <button width="150" left="156" label="Wybierz Region" label_selected="Wybierz Region" name="Select Region" tool_tip="Wybierz caÅ‚y region za pomocÄ… narzÄ™dzi edycji terenu"/> - <button width="150" left="156" label="Automatyczne Zapisanie" label_selected="Automatyczne Zapisanie" name="Autosave now" /> + <spinner name="land cost"/> + <button label="OdÅ›wież" label_selected="OdÅ›wież" name="Refresh" tool_tip="Click here to refresh the above information"/> + <button label="Zastosuj" label_selected="Zastosuj" name="Apply" tool_tip="Click here to apply any changes from above"/> + <button label="Wybierz Region" label_selected="Wybierz Region" left="156" name="Select Region" tool_tip="Wybierz caÅ‚y Region za pomocÄ… narzÄ™dzi edycji terenu" width="150"/> + <button label="Automatyczne zapisanie" label_selected="Automatyczne zapisanie" left="156" name="Autosave now" tool_tip="Save gzipped state to autosave directory" width="150"/> </panel> <panel label="Obiekty" name="objects"> <text name="Sim Name:" width="105"> Nazwa Symulatora: </text> - <text name="region name" left_delta="110"> + <text left_delta="110" name="region name"> Welsh </text> - <check_box label="Wyłącz Skrypty" name="disable scripts" /> - <check_box label="Deaktywuj Kolizje" name="disable collisions" /> - <check_box label="WylÄ…cz FizykÄ™" name="disable physics" /> - <button label="Zastosuj" label_selected="Zastosuj" name="Apply" /> - <button label="Ustaw Cel" label_selected="Set Target" name="Set Target" /> + <check_box label="Wyłącz skrypty" name="disable scripts" tool_tip="Set this to disable all scripts in this region"/> + <check_box label="Deaktywuj kolizje" name="disable collisions" tool_tip="Set this to disable non-agent collisions in this region"/> + <check_box label="WylÄ…cz fizykÄ™" name="disable physics" tool_tip="Set this to disable all physics in this region"/> + <button label="Zastosuj" label_selected="Zastosuj" name="Apply" tool_tip="Click here to apply any changes from above"/> + <button label="Ustaw Cel" label_selected="Set Target" name="Set Target" tool_tip="Set the target avatar for object deletion"/> <text name="target_avatar_name"> (brak) </text> - <button label="UsuÅ„ cel z oskryptowanych obiektów na innych posiadÅ‚oÅ›ciach" label_selected="UsuÅ„ cel 's skryptowane obiekty na innych posiadÅ‚oÅ›ciach" name="Delete Target's Scripted Objects On Others Land" /> - <button label="UsuÅ„ cel z oskryptowanych obiektów na jakichkolwiek posiadÅ‚oÅ›ciach" label_selected="UsuÅ„ cel 's skryptowane obiekty na jakichkolwiek posiadÅ‚oÅ›ciach" name="Delete Target's Scripted Objects On *Any* Land" /> - <button label="UsuÅ„ wszystkie cele i obiekty" label_selected="UsuÅ„ wszystkie cele i obiekty" name="Delete *ALL* Of Target's Objects" /> - <button label="Główne Kolizje" label_selected="Główne Kolizje" name="Get Top Colliders" /> - <button label="Główne Skrypty" label_selected="Główne Skrypty" name="Get Top Scripts" /> + <button label="UsuÅ„ cel z oskryptowanych obiektów na innych posiadÅ‚oÅ›ciach" label_selected="UsuÅ„ cel 's skryptowane obiekty na innych posiadÅ‚oÅ›ciach" name="Delete Target's Scripted Objects On Others Land" tool_tip="Delete all scripted objects owned by the target on land not owned by the target. (no copy) objects will be returned."/> + <button label="UsuÅ„ cel z oskryptowanych obiektów na jakichkolwiek posiadÅ‚oÅ›ciach" label_selected="UsuÅ„ cel 's skryptowane obiekty na jakichkolwiek posiadÅ‚oÅ›ciach" name="Delete Target's Scripted Objects On *Any* Land" tool_tip="Delete all scripted objects owned by the target in this region. (no copy) objects will be returned."/> + <button label="UsuÅ„ wszystkie cele i obiekty" label_selected="UsuÅ„ wszystkie cele i obiekty" name="Delete *ALL* Of Target's Objects" tool_tip="Delete all objects owned by the target in this region. (no copy) objects will be returned."/> + <button label="Główne kolizje" label_selected="Główne kolizje" name="Get Top Colliders" tool_tip="Gets list of objects experiencing the most narrowphase callbacks"/> + <button label="Główne skrypty" label_selected="Główne skrypty" name="Get Top Scripts" tool_tip="Gets list of objects spending the most time running scripts"/> <button label="Treść skryptów" label_selected="Treść skryptów" name="Scripts digest" tool_tip="WyÅ›wietla listÄ™ wszystkich skryptów i liczbÄ™ ich zastosowaÅ„."/> </panel> <panel label="Zażądaj" name="request"> @@ -80,17 +79,17 @@ Cel: </text> <combo_box name="destination"> - <combo_box.item name="item1" label="Selekcja" /> - <combo_box.item name="item2" label="Agent Regionu" /> + <combo_box.item label="Selekcja" name="item1"/> + <combo_box.item label="Agent Regionu" name="item2"/> </combo_box> <text name="Request:"> Żądanie: </text> <combo_box name="request"> - <combo_box.item name="item1" label="kolidery <kroki>" /> - <combo_box.item name="item2" label="skrypty <policz>,<opcjonalnie powtórzenie>" /> - <combo_box.item name="item3" label="obiekty <powtórzenia>" /> - <combo_box.item name="item4" label="rez <asset_id>" /> + <combo_box.item label="kolidery <kroki>" name="item1"/> + <combo_box.item label="skrypty <policz>,<opcjonalnie powtórzenie>" name="item2"/> + <combo_box.item label="obiekty <powtórzenia>" name="item3"/> + <combo_box.item label="rez <asset_id>" name="item4"/> </combo_box> <text name="Parameter:"> Parameter: diff --git a/indra/newview/skins/default/xui/pl/floater_hardware_settings.xml b/indra/newview/skins/default/xui/pl/floater_hardware_settings.xml index 39695a67b6..bd5dd7e7d2 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_hardware_settings.xml +++ b/indra/newview/skins/default/xui/pl/floater_hardware_settings.xml @@ -1,28 +1,28 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="Hardware Settings Floater" title="USTAWIENIA SPRZĘTOWE"> <text name="Filtering:"> Filtrowanie: </text> - <check_box label="Filtrowanie Anizotropowe" name="ani" /> + <check_box label="Filtr anizotropowy" name="ani"/> <text name="Antialiasing:"> - Antialiasing: + Antyaliasing: </text> <combo_box label="Antialiasing" name="fsaa" width="84"> - <combo_box.item name="FSAADisabled" label="Wyłączone" /> - <combo_box.item name="2x" label="2x" /> - <combo_box.item name="4x" label="4x" /> - <combo_box.item name="8x" label="8x" /> - <combo_box.item name="16x" label="16x" /> + <combo_box.item label="Wyłączone" name="FSAADisabled"/> + <combo_box.item label="2x" name="2x"/> + <combo_box.item label="4x" name="4x"/> + <combo_box.item label="8x" name="8x"/> + <combo_box.item label="16x" name="16x"/> </combo_box> - <spinner label="Gamma:" name="gamma" /> + <spinner label="Gamma:" name="gamma"/> <text name="(brightness, lower is brighter)"> - (jaskrawość, mniej jest jaÅ›niej, 0=domyÅ›lny) + (0=domyÅ›lna jaskrawość, niższa wartość=jaÅ›niej) </text> <text name="Enable VBO:"> Włącz VBO: </text> - <check_box label="Włącz Bufor Vertexów OpenGL" name="vbo" tool_tip="" /> - <slider label="Pamięć Tekstur (MB):" name="GrapicsCardTextureMemory" tool_tip="" /> - <spinner label="Stosunek Dystansu MgÅ‚y:" name="fog" /> - <button label="OK" label_selected="OK" name="OK" /> + <check_box initial_value="true" label="Włącz rozszerzenie OpenGL" name="vbo" tool_tip=""/> + <slider label="Pamięć na tekstury (MB):" name="GraphicsCardTextureMemory" tool_tip="Ilość alokacji pamiÄ™ci dla tekstur. DomyÅ›lne dla karty pamiÄ™ci video. Obniżenie poziomu tych funkcji może polepszyć wydajność systemowÄ… jednak spowoduje zmniejszenie jakoÅ›ci i wyrazistoÅ›ci tekstur."/> + <spinner label="Stosunek dystansu mgÅ‚y:" name="fog"/> + <button label="OK" label_selected="OK" name="OK"/> </floater> diff --git a/indra/newview/skins/default/xui/pl/floater_help_browser.xml b/indra/newview/skins/default/xui/pl/floater_help_browser.xml new file mode 100644 index 0000000000..dfd5f907e5 --- /dev/null +++ b/indra/newview/skins/default/xui/pl/floater_help_browser.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_help_browser" title="PRZEGLÄ„DARKA POMOCY"> + <floater.string name="loading_text"> + Åadowanie... + </floater.string> + <layout_stack name="stack1"> + <layout_panel name="external_controls"/> + </layout_stack> +</floater> diff --git a/indra/newview/skins/default/xui/pl/floater_hud.xml b/indra/newview/skins/default/xui/pl/floater_hud.xml index ff2d702132..a5d85aca4e 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_hud.xml +++ b/indra/newview/skins/default/xui/pl/floater_hud.xml @@ -1,2 +1,2 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="floater_hud" title="SAMOUCZEK" /> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_hud" title="SAMOUCZEK"/> diff --git a/indra/newview/skins/default/xui/pl/floater_im.xml b/indra/newview/skins/default/xui/pl/floater_im.xml index 67c9d13496..e40935ccb7 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_im.xml +++ b/indra/newview/skins/default/xui/pl/floater_im.xml @@ -1,7 +1,7 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <multi_floater name="im_floater" title="Wiadomość (IM)"> <string name="only_user_message"> - JesteÅ› jedynÄ… osobÄ… w tej konferencji. + JesteÅ› jedynym uczestnikiem tej konferencji. </string> <string name="offline_message"> [FIRST] [LAST] - ta osoba jest obecnie niedostÄ™pna. @@ -10,7 +10,7 @@ Kliknij na [BUTTON NAME] przycisk by zaakceptować/dołączyć do tej rozmowy. </string> <string name="muted_message"> - Ten Rezydent jest przez Ciebie wyciszony. WysyÅ‚anie wiadomoÅ›ci automatycznie wyłączy tryb wyciszenia. + ZablokowaÅ‚eÅ› tego Rezydenta. WysÅ‚anie wiadomoÅ›ci automatycznie odblokuje go. </string> <string name="generic_request_error"> Błąd. Spróbuj ponownie za kilka minut. @@ -31,7 +31,7 @@ Moderator wyciszyÅ‚ CiÄ™. </string> <string name="add_session_event"> - Nie można dodać nikogo do czatu z [RECIPIENT]. + Niemożliwość dodania Rezydentów do tej konferencji z [RECIPIENT]. </string> <string name="message_session_event"> Nie można wysÅ‚ać Twojej wiadomoÅ›ci do sesji czatu z [RECIPIENT]. diff --git a/indra/newview/skins/default/xui/pl/floater_im_container.xml b/indra/newview/skins/default/xui/pl/floater_im_container.xml new file mode 100644 index 0000000000..ddf0790fa8 --- /dev/null +++ b/indra/newview/skins/default/xui/pl/floater_im_container.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<multi_floater name="floater_im_box" title="ROZMOWY"/> diff --git a/indra/newview/skins/default/xui/pl/floater_im_session.xml b/indra/newview/skins/default/xui/pl/floater_im_session.xml new file mode 100644 index 0000000000..db513f787c --- /dev/null +++ b/indra/newview/skins/default/xui/pl/floater_im_session.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="panel_im"> + <layout_stack name="im_panels"> + <layout_panel label="Panel kontroli wiadomoÅ›ci prywatnej (IM)" name="panel_im_control_panel"/> + <layout_panel> + <line_editor label="Do" name="chat_editor"/> + </layout_panel> + </layout_stack> +</floater> diff --git a/indra/newview/skins/default/xui/pl/floater_image_preview.xml b/indra/newview/skins/default/xui/pl/floater_image_preview.xml index 27f898a66b..a27e8ffed3 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_image_preview.xml +++ b/indra/newview/skins/default/xui/pl/floater_image_preview.xml @@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="Image Preview" title=""> <text name="name_label"> Nazwa: @@ -10,23 +10,23 @@ WyÅ›wietl obraz jako: </text> <combo_box label="Rodzaj Ubrania" name="clothing_type_combo"> - <combo_box.item name="Image" label="Obraz" /> - <combo_box.item name="Hair" label="WÅ‚osy" /> - <combo_box.item name="FemaleHead" label="Damska GÅ‚owa" /> - <combo_box.item name="FemaleUpperBody" label="Damska Górna Część CiaÅ‚a" /> - <combo_box.item name="FemaleLowerBody" label="Damska Górna Część CiaÅ‚a" /> - <combo_box.item name="MaleHead" label="MÄ™ska GÅ‚owa" /> - <combo_box.item name="MaleUpperBody" label="MÄ™ska Górna Część CiaÅ‚a" /> - <combo_box.item name="MaleLowerBody" label="MÄ™ska Dolna Część CiaÅ‚a" /> - <combo_box.item name="Skirt" label="Spódnica" /> - <combo_box.item name="SculptedPrim" label="Sculpt" /> + <combo_box.item label="Obraz" name="Image"/> + <combo_box.item label="WÅ‚osy" name="Hair"/> + <combo_box.item label="Damska gÅ‚owa" name="FemaleHead"/> + <combo_box.item label="Damska górna część ciaÅ‚a" name="FemaleUpperBody"/> + <combo_box.item label="Damska górna część ciaÅ‚a" name="FemaleLowerBody"/> + <combo_box.item label="MÄ™ska gÅ‚owa" name="MaleHead"/> + <combo_box.item label="MÄ™ska górna część ciaÅ‚a" name="MaleUpperBody"/> + <combo_box.item label="MÄ™ska dolna część ciaÅ‚a" name="MaleLowerBody"/> + <combo_box.item label="Spódnica" name="Skirt"/> + <combo_box.item label="Prim sculptowy" name="SculptedPrim"/> </combo_box> <text name="bad_image_text"> Nie można wczytać obrazu. Spróbuj zapisać obraz jako 24 bitowÄ… Targa (.tga). </text> - <check_box label="Użyj kompresji bez strat" name="lossless_check" /> - <button label="Anuluj" name="cancel_btn" /> - <button label="ZaÅ‚aduj ([AMOUNT]L$)" name="ok_btn" /> + <check_box label="Użyj kompresji bez strat" name="lossless_check"/> + <button label="Anuluj" name="cancel_btn"/> + <button label="ZaÅ‚aduj ([AMOUNT]L$)" name="ok_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/pl/floater_incoming_call.xml b/indra/newview/skins/default/xui/pl/floater_incoming_call.xml new file mode 100644 index 0000000000..e5ec3804ae --- /dev/null +++ b/indra/newview/skins/default/xui/pl/floater_incoming_call.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="incoming call" title="DZWONI NIEZNANA OSOBA"> + <floater.string name="lifetime"> + 5 + </floater.string> + <floater.string name="localchat"> + Rozmowy gÅ‚osowe w pobliżu + </floater.string> + <floater.string name="anonymous"> + anonimowy + </floater.string> + <floater.string name="VoiceInviteP2P"> + dzwoni. + </floater.string> + <floater.string name="VoiceInviteAdHoc"> + rozpoczÄ…Å‚ rozmowÄ™ gÅ‚osowÄ… w czacie konferencji. + </floater.string> + <floater.string name="VoiceInviteGroup"> + zaczyna rozmowÄ™ z grupÄ… [GROUP]. + </floater.string> + <text name="question"> + Czy chcesz opuÅ›cić [CURRENT_CHAT] i dołączyć do tej rozmowy gÅ‚osowej? + </text> + <button label="Zaakceptuj" label_selected="Zaakceptuj" name="Accept"/> + <button label="Odmów" label_selected="Odmów" name="Reject"/> + <button label="Rozpocznij IM" name="Start IM"/> +</floater> diff --git a/indra/newview/skins/default/xui/pl/floater_inspect.xml b/indra/newview/skins/default/xui/pl/floater_inspect.xml index c98e0541d8..2c66f2851d 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_inspect.xml +++ b/indra/newview/skins/default/xui/pl/floater_inspect.xml @@ -1,13 +1,14 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="inspect" title="INSPEKCJA OBIEKTÓW"> + <floater.string name="timeStamp"> + [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local] + </floater.string> <scroll_list name="object_list" tool_tip=""> - <column label="Nazwa" name="object_name" /> - <column label="WÅ‚aÅ›ciciel" name="owner_name" /> - <column label="Twórca" name="creator_name" /> - <column label="Data Kreacji" name="creation_date" /> + <scroll_list.columns label="Nazwa" name="object_name"/> + <scroll_list.columns label="WÅ‚aÅ›ciciel" name="owner_name"/> + <scroll_list.columns label="Twórca" name="creator_name"/> + <scroll_list.columns label="Data kreacji" name="creation_date"/> </scroll_list> - <button label="Profil WÅ‚aÅ›ciciela..." label_selected="" name="button owner" - tool_tip="" /> - <button label="Profil Twórcy..." label_selected="" name="button creator" - tool_tip="" /> + <button label="Profil WÅ‚aÅ›ciciela..." label_selected="" name="button owner" tool_tip=""/> + <button label="Profil Twórcy..." label_selected="" name="button creator" tool_tip=""/> </floater> diff --git a/indra/newview/skins/default/xui/pl/floater_inventory.xml b/indra/newview/skins/default/xui/pl/floater_inventory.xml index 157be76c4d..0dc4d5b96d 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_inventory.xml +++ b/indra/newview/skins/default/xui/pl/floater_inventory.xml @@ -1,47 +1,16 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="Inventory" title="MOJA SZAFA"> - <search_editor label="Wyszukiwarka" name="inventory search editor"/> - <tab_container name="inventory filter tabs"> - <inventory_panel label="Wszystkie Obiekty" name="All Items"/> - <inventory_panel label="Nowe Obiekty" name="Recent Items"/> - </tab_container> - <menu_bar name="Inventory Menu"> - <menu label="Plik" name="File"> - <menu_item_call label="Otwórz" name="Open"/> - <menu_item_call label="Nowe Okno" name="New Window"/> - <menu_item_call label="Pokaż Filtr" name="Show Filters"/> - <menu_item_call label="Zresetuj Filtr" name="Reset Current"/> - <menu_item_call label="Zamknij Wszystkie Foldery" name="Close All Folders"/> - <menu_item_call label="Opróżnij Kosz" name="Empty Trash"/> - </menu> - <menu label="Stwórz" name="Create"> - <menu_item_call label="Nowy Folder" name="New Folder"/> - <menu_item_call label="Nowy Skrypt" name="New Script"/> - <menu_item_call label="NowÄ… NotÄ™" name="New Note"/> - <menu_item_call label="Nowy Gest" name="New Gesture"/> - <menu name="New Clothes"> - <menu_item_call label="Nowa Koszula" name="New Shirt"/> - <menu_item_call label="Nowe Spodnie" name="New Pants"/> - <menu_item_call label="Nowe Buty" name="New Shoes"/> - <menu_item_call label="Nowe Skarpety" name="New Socks"/> - <menu_item_call label="Nowa Kurtka" name="New Jacket"/> - <menu_item_call label="Nowa Spódnica" name="New Skirt"/> - <menu_item_call label="Nowe RÄ™kawiczki" name="New Gloves"/> - <menu_item_call label="Nowy Podkoszulek" name="New Undershirt"/> - <menu_item_call label="Nowa Bielizna" name="New Underpants"/> - </menu> - <menu name="New Body Parts"> - <menu_item_call label="Nowy KsztaÅ‚t" name="New Shape"/> - <menu_item_call label="NowÄ… SkórkÄ™" name="New Skin"/> - <menu_item_call label="Nowe WÅ‚osy" name="New Hair"/> - <menu_item_call label="Nowe Oczy" name="New Eyes"/> - </menu> - </menu> - <menu label="PorzÄ…dkuj" name="Sort"> - <menu_item_check label="WedÅ‚ug Nazwy" name="By Name"/> - <menu_item_check label="WedÅ‚ug Daty" name="By Date"/> - <menu_item_check label="Foldery Zawsze WedÅ‚ug Nazwy" name="Folders Always By Name"/> - <menu_item_check label="UÅ‚ożenie Folderów od Góry" name="System Folders To Top"/> - </menu> - </menu_bar> + <floater.string name="Title"> + MOJA SZAFA + </floater.string> + <floater.string name="TitleFetching"> + MOJA SZAFA (Dostarczanie [ITEM_COUNT] obiektów...) [FILTER] + </floater.string> + <floater.string name="TitleCompleted"> + MOJA SZAFA ([ITEM_COUNT] Obiektów) [FILTER] + </floater.string> + <floater.string name="Fetched"> + Dostarczono + </floater.string> + <panel label="Panel Moja Szafa" name="Inventory Panel"/> </floater> diff --git a/indra/newview/skins/default/xui/pl/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/pl/floater_inventory_item_properties.xml index 665172dd49..1e63987585 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_inventory_item_properties.xml +++ b/indra/newview/skins/default/xui/pl/floater_inventory_item_properties.xml @@ -1,5 +1,20 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="item properties" title="WÅAÅšCIWOÅšCI OBIEKTÓW W SZAFIE"> + <floater.string name="unknown"> + (nieznany) + </floater.string> + <floater.string name="public"> + (publiczny) + </floater.string> + <floater.string name="you_can"> + Opcje: + </floater.string> + <floater.string name="owner_can"> + WÅ‚aÅ›ciciel może: + </floater.string> + <floater.string name="acquiredDate"> + [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local] + </floater.string> <text name="LabelItemNameTitle"> Nazwa: </text> @@ -12,14 +27,14 @@ <text name="LabelCreatorName"> Nicole Linden </text> - <button label="Profil..." label_selected="" name="BtnCreator" /> + <button label="Profil..." label_selected="" name="BtnCreator"/> <text name="LabelOwnerTitle"> WÅ‚aÅ›ciciel: </text> <text name="LabelOwnerName"> Thrax Linden </text> - <button label="Profil..." label_selected="" name="BtnOwner" /> + <button label="Profil..." label_selected="" name="BtnOwner"/> <text name="LabelAcquiredTitle"> Nabyte: </text> @@ -27,55 +42,32 @@ Wed May 24 12:50:46 2006 </text> <text name="OwnerLabel"> - Opcje: - </text> - <check_box label="Modyfikuj" name="CheckOwnerModify" /> - <check_box label="Kopiuj" name="CheckOwnerCopy" /> - <check_box label="Sprzedaj/Oddaj" name="CheckOwnerTransfer" /> - <text name="BaseMaskDebug"> - P: - </text> - <text name="OwnerMaskDebug"> - W: + Ty: </text> - <text name="GroupMaskDebug"> - G: + <check_box label="Edytuj" name="CheckOwnerModify"/> + <check_box label="Kopiuj" name="CheckOwnerCopy"/> + <check_box label="Odsprzedaż" name="CheckOwnerTransfer"/> + <text name="AnyoneLabel"> + Każdy: </text> - <text name="EveryoneMaskDebug"> - W: + <check_box label="Kopiuj" name="CheckEveryoneCopy"/> + <text name="GroupLabel"> + Grupa: </text> - <text name="NextMaskDebug"> - N: - </text> - <check_box label="UdostÄ™pnij grupie" name="CheckShareWithGroup" /> - <check_box label="UdostÄ™pnij kopiowanie każdemu" name="CheckEveryoneCopy" /> + <check_box label="UdostÄ™pnij" name="CheckShareWithGroup"/> <text name="NextOwnerLabel"> - NastÄ™pna Osoba: - </text> - <check_box label="Modyfikuje" name="CheckNextOwnerModify" /> - <check_box label="Kopiuje" name="CheckNextOwnerCopy" /> - <check_box label="Sprzedaje/Oddaje" name="CheckNextOwnerTransfer" /> - <text name="SaleLabel"> - Zaznacz ArtykuÅ‚: + NastÄ™pny wÅ‚aÅ›ciciel: + </text> + <check_box label="Edytuj" name="CheckNextOwnerModify"/> + <check_box label="Kopiuje" name="CheckNextOwnerCopy"/> + <check_box label="Odsprzedaż" name="CheckNextOwnerTransfer"/> + <check_box label="Sprzedaż" name="CheckPurchase"/> + <combo_box name="combobox sale copy"> + <combo_box.item label="Kopiuj" name="Copy"/> + <combo_box.item label="Oryginalny" name="Original"/> + </combo_box> + <spinner label="Cena:" name="Edit Cost"/> + <text name="CurrencySymbol"> + L$ </text> - <check_box label="Sprzedaż" name="CheckPurchase" /> - <radio_group name="RadioSaleType"> - <radio_item name="radio" label="OryginaÅ‚" /> - <radio_item name="radio2" label="Kopia" /> - </radio_group> - <text name="TextPrice"> - Cena: L$ - </text> - <string name="unknown"> - (nieznany) - </string> - <string name="public"> - (publiczny) - </string> - <string name="you_can"> - Opcje: - </string> - <string name="owner_can"> - WÅ‚aÅ›ciciel może: - </string> </floater> diff --git a/indra/newview/skins/default/xui/pl/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/pl/floater_inventory_view_finder.xml index 9204262304..bd7b221c5d 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_inventory_view_finder.xml +++ b/indra/newview/skins/default/xui/pl/floater_inventory_view_finder.xml @@ -4,7 +4,7 @@ <check_box label="Wizytówki" name="check_calling_card" /> <check_box label="Ubrania" name="check_clothing" /> <check_box label="Gesty" name="check_gesture" /> - <check_box label="ZakÅ‚adki Miejsc" name="check_landmark" /> + <check_box label="Landmarki" name="check_landmark" /> <check_box label="Noty" name="check_notecard" /> <check_box label="Obiekty" name="check_object" /> <check_box label="Skrypty" name="check_script" /> diff --git a/indra/newview/skins/default/xui/pl/floater_joystick.xml b/indra/newview/skins/default/xui/pl/floater_joystick.xml index 22ac458b85..2b1e362b98 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_joystick.xml +++ b/indra/newview/skins/default/xui/pl/floater_joystick.xml @@ -1,110 +1,110 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Joystick" width="590" title="KONFIGURACJA JOYSTICKA"> - <check_box name="enable_joystick" label="Aktywuj Joystick:"/> +<floater name="Joystick" title="KONFIGURACJA JOYSTICKA"> + <check_box label="Aktywuj Joystick:" name="enable_joystick"/> <text left="130" name="joystick_type" width="360"/> - <spinner label="Kalibracja Osi X" left="20" width="170" label_width="130" name="JoystickAxis1"/> - <spinner label="Kalibracja Osi Y" left="210" width="170" label_width="130" name="JoystickAxis2" /> - <spinner label="Kalibracja Osi Z" left="400" width="170" label_width="130" name="JoystickAxis0" /> - <spinner label="Kalibracja Wznoszenia" left="20" width="170" label_width="130" name="JoystickAxis4" /> - <spinner label="Kalibracja Wychylania" left="210" width="170" label_width="130" name="JoystickAxis5" /> - <spinner label="Kalibracja Obrotu" left="400" width="170" label_width="130" name="JoystickAxis3"/> - <spinner label="Kalibracja PowiÄ™kszania" width="170" label_width="130" name="JoystickAxis6" /> - <check_box label="BezpoÅ›rednie" left="205" name="ZoomDirect" /> - <check_box label="Kursor 3D" left="340" name="Cursor3D" /> - <check_box label="Automatyczne" left="450" name="AutoLeveling" /> - <text left="22" name="Control Modes:"> + <spinner label="Kalibracja Osi X" label_width="130" left="20" name="JoystickAxis1" width="170"/> + <spinner label="Kalibracja Osi Y" label_width="130" left="210" name="JoystickAxis2" width="170"/> + <spinner label="Kalibracja Osi Z" label_width="100" left="400" name="JoystickAxis0" width="140"/> + <spinner label="Kalibracja wznoszenia" label_width="130" left="20" name="JoystickAxis4" width="170"/> + <spinner label="Kalibracja wychylania" label_width="130" left="210" name="JoystickAxis5" width="170"/> + <spinner label="Kalibracja obrotu" label_width="100" left="400" name="JoystickAxis3" width="140"/> + <spinner label="Kalibracja powiÄ™kszania" label_width="130" name="JoystickAxis6" width="170"/> + <check_box label="BezpoÅ›rednie" left="205" name="ZoomDirect"/> + <check_box label="Kursor 3D" left="340" name="Cursor3D"/> + <check_box label="Automatyczne" left="450" name="AutoLeveling"/> + <text name="Control Modes:"> Kontroluj: </text> - <check_box left="130" width="90" name="JoystickAvatarEnabled" label="Awatara"/> - <check_box left="205" width="90" name="JoystickBuildEnabled" label="Budowanie"/> - <check_box left="282" width="90" name="JoystickFlycamEnabled" label="KamerÄ™ podczas latania"/> - <text width="104" name="XScale"> + <check_box label="Awatara" name="JoystickAvatarEnabled" width="90"/> + <check_box label="Budowanie" name="JoystickBuildEnabled" width="90"/> + <check_box label="KamerÄ™ podczas latania" left="300" name="JoystickFlycamEnabled" width="90"/> + <text name="XScale"> Skala X </text> - <spinner left="133" name="AvatarAxisScale1" /> - <spinner left="208" name="BuildAxisScale1" /> - <spinner left="283" name="FlycamAxisScale1" /> - <text width="104" name="YScale"> + <spinner name="AvatarAxisScale1"/> + <spinner name="BuildAxisScale1"/> + <spinner left="300" name="FlycamAxisScale1"/> + <text name="YScale"> Skala Y </text> - <spinner left="133" name="AvatarAxisScale2" /> - <spinner left="208" name="BuildAxisScale2" /> - <spinner left="283" name="FlycamAxisScale2" /> - <text width="104" name="ZScale"> + <spinner name="AvatarAxisScale2"/> + <spinner name="BuildAxisScale2"/> + <spinner left="300" name="FlycamAxisScale2"/> + <text name="ZScale"> Skala Z </text> - <spinner left="133" name="AvatarAxisScale0" /> - <spinner left="208" name="BuildAxisScale0" /> - <spinner left="283" name="FlycamAxisScale0" /> - <text width="104" name="PitchScale"> - Skala Wznoszenia - </text> - <spinner left="133" name="AvatarAxisScale4" /> - <spinner left="208" name="BuildAxisScale4" /> - <spinner left="283" name="FlycamAxisScale4" /> - <text width="104" name="YawScale"> - Skala Odchylania - </text> - <spinner left="133" name="AvatarAxisScale5" /> - <spinner left="208" name="BuildAxisScale5" /> - <spinner left="283" name="FlycamAxisScale5" /> - <text width="104" name="RollScale"> - Skala Obrotu - </text> - <spinner left="208" name="BuildAxisScale3" /> - <spinner left="283" name="FlycamAxisScale3" /> - <text width="104" name="XDeadZone"> - Tolerancja Osi X - </text> - <spinner left="133" name="AvatarAxisDeadZone1" /> - <spinner left="208" name="BuildAxisDeadZone1" /> - <spinner left="283" name="FlycamAxisDeadZone1" /> - <text width="104" name="YDeadZone"> - Tolerancja Osi Y - </text> - <spinner left="133" name="AvatarAxisDeadZone2" /> - <spinner left="208" name="BuildAxisDeadZone2" /> - <spinner left="283" name="FlycamAxisDeadZone2" /> - <text width="104" name="ZDeadZone"> - Tolerancja Osi Z - </text> - <spinner left="133" name="AvatarAxisDeadZone0" /> - <spinner left="208" name="BuildAxisDeadZone0" /> - <spinner left="283" name="FlycamAxisDeadZone0" /> - <text width="104" name="PitchDeadZone"> - Tolerancja Wznoszenia - </text> - <spinner left="133" name="AvatarAxisDeadZone4" /> - <spinner left="208" name="BuildAxisDeadZone4" /> - <spinner left="283" name="FlycamAxisDeadZone4" /> - <text width="104" name="YawDeadZone"> - Tolerancja Odchylania - </text> - <spinner left="133" name="AvatarAxisDeadZone5" /> - <spinner left="208" name="BuildAxisDeadZone5" /> - <spinner left="283" name="FlycamAxisDeadZone5" /> - <text width="104" name="RollDeadZone"> - Tolerancja Obrotu - </text> - <spinner left="208" name="BuildAxisDeadZone3" /> - <spinner left="283" name="FlycamAxisDeadZone3" /> - <text width="104" name="Feathering"> + <spinner name="AvatarAxisScale0"/> + <spinner name="BuildAxisScale0"/> + <spinner left="300" name="FlycamAxisScale0"/> + <text name="PitchScale"> + Skala wznoszenia + </text> + <spinner name="AvatarAxisScale4"/> + <spinner name="BuildAxisScale4"/> + <spinner left="300" name="FlycamAxisScale4"/> + <text name="YawScale"> + Skala odchylania + </text> + <spinner name="AvatarAxisScale5"/> + <spinner name="BuildAxisScale5"/> + <spinner left="300" name="FlycamAxisScale5"/> + <text name="RollScale"> + Skala obrotu + </text> + <spinner name="BuildAxisScale3"/> + <spinner left="300" name="FlycamAxisScale3"/> + <text name="XDeadZone"> + Tolerancja osi X + </text> + <spinner name="AvatarAxisDeadZone1"/> + <spinner name="BuildAxisDeadZone1"/> + <spinner left="300" name="FlycamAxisDeadZone1"/> + <text name="YDeadZone"> + Tolerancja osi Y + </text> + <spinner name="AvatarAxisDeadZone2"/> + <spinner name="BuildAxisDeadZone2"/> + <spinner left="300" name="FlycamAxisDeadZone2"/> + <text name="ZDeadZone"> + Tolerancja osi Z + </text> + <spinner name="AvatarAxisDeadZone0"/> + <spinner name="BuildAxisDeadZone0"/> + <spinner left="300" name="FlycamAxisDeadZone0"/> + <text name="PitchDeadZone"> + Tolerancja wznoszenia + </text> + <spinner name="AvatarAxisDeadZone4"/> + <spinner name="BuildAxisDeadZone4"/> + <spinner left="300" name="FlycamAxisDeadZone4"/> + <text name="YawDeadZone"> + Tolerancja odchylania + </text> + <spinner name="AvatarAxisDeadZone5"/> + <spinner name="BuildAxisDeadZone5"/> + <spinner left="300" name="FlycamAxisDeadZone5"/> + <text name="RollDeadZone"> + Tolerancja obrotu + </text> + <spinner name="BuildAxisDeadZone3"/> + <spinner left="300" name="FlycamAxisDeadZone3"/> + <text name="Feathering"> Przenikanie </text> - <slider left="125" label="" name="AvatarFeathering" /> - <slider left="200" label="" name="BuildFeathering" /> - <slider left="275" label="" name="FlycamFeathering" /> - <text width="104" name="ZoomScale2"> - Skala PowiÄ™kszania + <slider label="" name="AvatarFeathering"/> + <slider label="" name="BuildFeathering"/> + <slider label="" left_delta="81" name="FlycamFeathering"/> + <text name="ZoomScale2"> + Skala powiÄ™kszania </text> - <spinner left="283" label="" name="FlycamAxisScale6" /> - <text width="104" name="ZoomDeadZone"> - Tolerancja PowiÄ™kszania + <spinner label="" left="300" name="FlycamAxisScale6"/> + <text name="ZoomDeadZone"> + Tolerancja powiÄ™kszania </text> - <spinner left="283" label="" name="FlycamAxisDeadZone6" /> - <button left="366" label="Ustawienia DomyÅ›lne" name="SpaceNavigatorDefaults" /> - <button left="366" label="OK" label_selected="OK" name="ok_btn" /> - <button label="Anuluj" label_selected="Anuluj" name="cancel_btn" /> + <spinner label="" left="300" name="FlycamAxisDeadZone6"/> + <button label="Ustawienia domyÅ›lne" name="SpaceNavigatorDefaults"/> + <button label="OK" label_selected="OK" left="366" name="ok_btn"/> + <button label="Anuluj" label_selected="Anuluj" name="cancel_btn"/> <stat_view label="Monitor Joysticka" name="axis_view"> <stat_bar label="OÅ› 0" name="axis0"/> <stat_bar label="OÅ› 1" name="axis1"/> @@ -113,7 +113,7 @@ <stat_bar label="OÅ› 4" name="axis4"/> <stat_bar label="OÅ› 5" name="axis5"/> </stat_view> - <string name="NoDevice"> + <string name="NoDevice"> brak podłącznego urzÄ…dzenia </string> </floater> diff --git a/indra/newview/skins/default/xui/pl/floater_lagmeter.xml b/indra/newview/skins/default/xui/pl/floater_lagmeter.xml index 69d563bdba..8038550bcb 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_lagmeter.xml +++ b/indra/newview/skins/default/xui/pl/floater_lagmeter.xml @@ -1,154 +1,151 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="floater_lagmeter" title="POMIAR LAGÓW"> - <button label="" label_selected="" name="client_lagmeter" - tool_tip="Status lagów klienta" /> - <text name="client"> - Klient: - </text> - <text name="client_text"> - W normie - </text> - <button label="" label_selected="" name="network_lagmeter" - tool_tip="Network lag status" /> - <text name="network"> - Sieć: - </text> - <text name="network_text"> - W normie - </text> - <button label="" label_selected="" name="server_lagmeter" tool_tip="Server lag status" /> - <text name="server"> - Serwer: - </text> - <text name="server_text"> - W normie - </text> - <button label="?" name="server_help" /> - <button label=">>" name="minimize" /> - <string name="max_title_msg"> - Pomiar Lagów - </string> - <string name="max_width_px"> + <floater.string name="max_title_msg"> + Pomiar lagów + </floater.string> + <floater.string name="max_width_px"> 360 - </string> - <string name="min_title_msg"> + </floater.string> + <floater.string name="min_title_msg"> Lag - </string> - <string name="min_width_px"> + </floater.string> + <floater.string name="min_width_px"> 90 - </string> - <string name="client_text_msg"> + </floater.string> + <floater.string name="client_text_msg"> Klient - </string> - <string name="client_frame_rate_critical_fps"> + </floater.string> + <floater.string name="client_frame_rate_critical_fps"> 10 - </string> - <string name="client_frame_rate_warning_fps"> + </floater.string> + <floater.string name="client_frame_rate_warning_fps"> 15 - </string> - <string name="client_frame_time_window_bg_msg"> + </floater.string> + <floater.string name="client_frame_time_window_bg_msg"> W normie, okno w tle - </string> - <string name="client_frame_time_critical_msg"> + </floater.string> + <floater.string name="client_frame_time_critical_msg"> Ilość klatek na sekundÄ™ klienta poniżej [CLIENT_FRAME_RATE_CRITICAL] - </string> - <string name="client_frame_time_warning_msg"> + </floater.string> + <floater.string name="client_frame_time_warning_msg"> Ilość klatek na sekundÄ™ pomiÄ™dzy [CLIENT_FRAME_RATE_CRITICAL] i [CLIENT_FRAME_RATE_WARNING] - </string> - <string name="client_frame_time_normal_msg"> + </floater.string> + <floater.string name="client_frame_time_normal_msg"> W normie - </string> - <string name="client_draw_distance_cause_msg"> - Przyczyna: Dystans rysowania jest za wysoki - </string> - <string name="client_texture_loading_cause_msg"> - Przyczyna: Åadowanie obrazu - </string> - <string name="client_texture_memory_cause_msg"> - Przyczyna: Za dużo obrazów w pamiÄ™ci - </string> - <string name="client_complex_objects_cause_msg"> - Przyczyna: Za dużo zÅ‚ożonych obiektów - </string> - <string name="network_text_msg"> + </floater.string> + <floater.string name="client_draw_distance_cause_msg"> + Przyczyna: dystans rysowania jest za wysoki + </floater.string> + <floater.string name="client_texture_loading_cause_msg"> + Przyczyna: Å‚adowanie obrazu + </floater.string> + <floater.string name="client_texture_memory_cause_msg"> + Przyczyna: za dużo obrazów w pamiÄ™ci + </floater.string> + <floater.string name="client_complex_objects_cause_msg"> + Przyczyna: za dużo zÅ‚ożonych obiektów + </floater.string> + <floater.string name="network_text_msg"> Sieć - </string> - <string name="network_packet_loss_critical_pct"> + </floater.string> + <floater.string name="network_packet_loss_critical_pct"> 10 - </string> - <string name="network_packet_loss_warning_pct"> + </floater.string> + <floater.string name="network_packet_loss_warning_pct"> 5 - </string> - <string name="network_packet_loss_critical_msg"> + </floater.string> + <floater.string name="network_packet_loss_critical_msg"> Utrata pakietów przekracza [NETWORK_PACKET_LOSS_CRITICAL]% - </string> - <string name="network_packet_loss_warning_msg"> + </floater.string> + <floater.string name="network_packet_loss_warning_msg"> Utrata pakietów przekracza [NETWORK_PACKET_LOSS_WARNING]%-[NETWORK_PACKET_LOSS_CRITICAL]% - </string> - <string name="network_performance_normal_msg"> + </floater.string> + <floater.string name="network_performance_normal_msg"> W normie - </string> - <string name="network_ping_critical_ms"> + </floater.string> + <floater.string name="network_ping_critical_ms"> 600 - </string> - <string name="network_ping_warning_ms"> + </floater.string> + <floater.string name="network_ping_warning_ms"> 300 - </string> - <string name="network_ping_critical_msg"> + </floater.string> + <floater.string name="network_ping_critical_msg"> Fatalny ping - [NETWORK_PING_CRITICAL] ms - </string> - <string name="network_ping_warning_msg"> + </floater.string> + <floater.string name="network_ping_warning_msg"> Wolny ping - [NETWORK_PING_WARNING]-[NETWORK_PING_CRITICAL] ms - </string> - <string name="network_packet_loss_cause_msg"> + </floater.string> + <floater.string name="network_packet_loss_cause_msg"> ZÅ‚e połączenie lub przepustowość. - </string> - <string name="network_ping_cause_msg"> + </floater.string> + <floater.string name="network_ping_cause_msg"> ZÅ‚e połączenie lub aplikacja współdzielÄ…ca pliki. - </string> - <string name="server_text_msg"> + </floater.string> + <floater.string name="server_text_msg"> Serwer - </string> - <string name="server_frame_rate_critical_fps"> + </floater.string> + <floater.string name="server_frame_rate_critical_fps"> 20 - </string> - <string name="server_frame_rate_warning_fps"> + </floater.string> + <floater.string name="server_frame_rate_warning_fps"> 30 - </string> - <string name="server_single_process_max_time_ms"> + </floater.string> + <floater.string name="server_single_process_max_time_ms"> 20 - </string> - <string name="server_frame_time_critical_msg"> + </floater.string> + <floater.string name="server_frame_time_critical_msg"> Ilość klatek na sekundÄ™ poniżej [SERVER_FRAME_RATE_CRITICAL] - </string> - <string name="server_frame_time_warning_msg"> + </floater.string> + <floater.string name="server_frame_time_warning_msg"> Ilość klatek na sekundÄ™ pomiÄ™dzy [SERVER_FRAME_RATE_CRITICAL] i [SERVER_FRAME_RATE_WARNING] - </string> - <string name="server_frame_time_normal_msg"> + </floater.string> + <floater.string name="server_frame_time_normal_msg"> W normie - </string> - <string name="server_physics_cause_msg"> - Przyczyna: Za dużo obiektów fizycznych - </string> - <string name="server_scripts_cause_msg"> - Przyczyna: Za dużo obieków skryptowanych - </string> - <string name="server_net_cause_msg"> - Przyczyna: Za duży ruch w sieci - </string> - <string name="server_agent_cause_msg"> - Przyczyna: Za dużo poruszajÄ…cych siÄ™ awatarów w regionie - </string> - <string name="server_images_cause_msg"> - Przyczyna: Za dużo kalkulacji obrazu - </string> - <string name="server_generic_cause_msg"> - Przyczyna: Symulator Å‚aduje siÄ™ zbyt powoli - </string> - <string name="smaller_label"> + </floater.string> + <floater.string name="server_physics_cause_msg"> + Przyczyna: za dużo obiektów fizycznych + </floater.string> + <floater.string name="server_scripts_cause_msg"> + Przyczyna: za dużo obieków skryptowanych + </floater.string> + <floater.string name="server_net_cause_msg"> + Przyczyna: za duży ruch w sieci + </floater.string> + <floater.string name="server_agent_cause_msg"> + Przyczyna: za dużo poruszajÄ…cych siÄ™ awatarów w regionie + </floater.string> + <floater.string name="server_images_cause_msg"> + Przyczyna: za dużo kalkulacji obrazu + </floater.string> + <floater.string name="server_generic_cause_msg"> + Przyczyna: symulator Å‚aduje siÄ™ zbyt powoli + </floater.string> + <floater.string name="smaller_label"> >> - </string> - <string name="bigger_label"> + </floater.string> + <floater.string name="bigger_label"> << - </string> + </floater.string> + <button label="" label_selected="" name="client_lagmeter" tool_tip="Status lagów klienta"/> + <text name="client"> + Klient + </text> + <text name="client_text"> + W normie + </text> + <button label="" label_selected="" name="network_lagmeter" tool_tip="Network lag status"/> + <text name="network"> + Sieć + </text> + <text name="network_text"> + W normie + </text> + <button label="" label_selected="" name="server_lagmeter" tool_tip="Server lag status"/> + <text name="server"> + Serwer + </text> + <text name="server_text"> + W normie + </text> + <button label=">>" name="minimize" tool_tip="Złącz rozmiar pliku xml"/> </floater> diff --git a/indra/newview/skins/default/xui/pl/floater_land_holdings.xml b/indra/newview/skins/default/xui/pl/floater_land_holdings.xml index 13e6a8b16d..72a078949a 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_land_holdings.xml +++ b/indra/newview/skins/default/xui/pl/floater_land_holdings.xml @@ -1,14 +1,14 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="land holdings floater" title="MOJA POSIADÅOŚĆ"> <scroll_list name="parcel list"> - <column label="Nazwa posiadÅ‚oÅ›ci" name="name"/> + <column label="PosiadÅ‚ość" name="name"/> <column label="Region" name="location"/> <column label="Typ" name="type"/> <column label="Obszar" name="area"/> <column label="" name="hidden"/> </scroll_list> <button label="Teleportuj" label_selected="Teleport" name="Teleport" tool_tip="Teleportuj siÄ™ do centrum tej PosiadÅ‚oÅ›ci."/> - <button label="Pokaż na Mapie" label_selected="Pokaż na mapie" name="Show on Map" tool_tip="Pokaż to miejsce na mapie Å›wiata."/> + <button label="Mapa" label_selected="Mapa" name="Show on Map" tool_tip="Pokaż to miejsce na mapie Å›wiata."/> <text name="contrib_label"> Kontrybucje do Twoich Grup: </text> @@ -20,21 +20,21 @@ Dozwolone udziaÅ‚y przy obecnym planie pÅ‚atnoÅ›ci: </text> <text name="allowed_text"> - [AREA] metrów + [AREA] m² </text> <text name="current_label"> UdziaÅ‚y w PosiadÅ‚oÅ›ciach: </text> <text name="current_text"> - [AREA] metrów + [AREA] m² </text> <text name="available_label"> DostÄ™pne na zakup PosiadÅ‚oÅ›ci: </text> <text name="available_text"> - [AREA] metrów + [AREA] m² </text> <string name="area_string"> - [AREA] metrów + [AREA] m² </string> </floater> diff --git a/indra/newview/skins/default/xui/pl/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/pl/floater_live_lsleditor.xml index 8120ff8c77..e03c5faaeb 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_live_lsleditor.xml +++ b/indra/newview/skins/default/xui/pl/floater_live_lsleditor.xml @@ -1,12 +1,15 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="script ed float" title="SKRYPT: NOWY SKRYPT"> - <button label="Zresetuj" label_selected="Zresetuj" name="Reset" /> - <check_box label="Włącz" name="running" /> - <check_box label="Mono" name="mono" /> - <string name="not_allowed"> - Nie masz praw by widzieć zawartość tego skryptu. - </string> - <string name="script_running"> + <floater.string name="not_allowed"> + Nie posiadasz praw do zobaczenia lub edycji kodu tego skryptu ponieważ udostÄ™pnione Ci prawa to "brak kopiowania". Musisz posiadać peÅ‚ne prawa by móc zobaczyć lub edytować kod skryptu w zawartoÅ›ci obiektu. + </floater.string> + <floater.string name="script_running"> Włącz - </string> + </floater.string> + <floater.string name="Title"> + SKRYPT: [NAME] + </floater.string> + <button label="Zresetuj" label_selected="Zresetuj" name="Reset"/> + <check_box initial_value="true" label="Włącz" name="running"/> + <check_box initial_value="true" label="Mono" name="mono"/> </floater> diff --git a/indra/newview/skins/default/xui/pl/floater_lsl_guide.xml b/indra/newview/skins/default/xui/pl/floater_lsl_guide.xml index 5601aa4464..7b1b395f87 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_lsl_guide.xml +++ b/indra/newview/skins/default/xui/pl/floater_lsl_guide.xml @@ -1,7 +1,7 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="script ed float" title="LSL WIKI"> - <check_box label="Idź za kursorem" name="lock_check" /> - <combo_box label="Zablokuj" name="history_combo" /> - <button label="Wróć" name="back_btn" /> - <button label="Do Przodu" name="fwd_btn" /> + <check_box label="Idź za kursorem" name="lock_check"/> + <combo_box label="Zablokuj" name="history_combo"/> + <button label="Wróć" name="back_btn"/> + <button label="Do przodu" name="fwd_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/pl/floater_map.xml b/indra/newview/skins/default/xui/pl/floater_map.xml index 6eabde7c52..1e5f3e6d46 100644 --- a/indra/newview/skins/default/xui/pl/floater_map.xml +++ b/indra/newview/skins/default/xui/pl/floater_map.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Map"> +<floater name="Map" title="Mini-Mapa"> <floater.string name="mini_map_north"> N </floater.string> diff --git a/indra/newview/skins/default/xui/pl/floater_media_browser.xml b/indra/newview/skins/default/xui/pl/floater_media_browser.xml index 74210c75e5..9787736ad8 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_media_browser.xml +++ b/indra/newview/skins/default/xui/pl/floater_media_browser.xml @@ -1,19 +1,19 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="floater_about" title="PRZEGLÄ„DARKA MEDIÓW"> <layout_stack name="stack1"> <layout_panel name="nav_controls"> - <button label="Wróć" name="back" /> - <button label="Do Przodu" name="forward" /> - <button label="ZaÅ‚aduj" name="reload" /> - <button label="Idź" name="go" /> + <button label="Wróć" name="back"/> + <button label="Do przodu" name="forward"/> + <button label="ZaÅ‚aduj" name="reload"/> + <button label="Idź" name="go"/> </layout_panel> <layout_panel name="parcel_owner_controls"> - <button label="WyÅ›lij Obecny URL do PosiadÅ‚oÅ›ci" name="assign" /> + <button label="WyÅ›lij bieżącÄ… stronÄ™ do Parceli" name="assign"/> </layout_panel> <layout_panel name="external_controls"> - <button label="Użyj Mojej PrzeglÄ…darki" name="open_browser" /> - <check_box label="Zawsze otwieraj w mojej przeglÄ…darce internetowej" name="open_always" /> - <button label="Zamknij" name="close" /> + <button label="Użyj mojej przeglÄ…darki" name="open_browser"/> + <check_box label="Zawsze otwieraj w mojej przeglÄ…darce internetowej" name="open_always"/> + <button label="Zamknij" name="close"/> </layout_panel> </layout_stack> </floater> diff --git a/indra/newview/skins/default/xui/pl/floater_media_settings.xml b/indra/newview/skins/default/xui/pl/floater_media_settings.xml new file mode 100644 index 0000000000..5a36331c9a --- /dev/null +++ b/indra/newview/skins/default/xui/pl/floater_media_settings.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="media_settings" title="MEDIA"> + <button label="OK" label_selected="OK" name="OK"/> + <button label="Anuluj" label_selected="Anuluj" name="Cancel"/> + <button label="Zastosuj" label_selected="Zastosuj" name="Apply"/> +</floater> diff --git a/indra/newview/skins/default/xui/pl/floater_mem_leaking.xml b/indra/newview/skins/default/xui/pl/floater_mem_leaking.xml index 88a878af72..9ce99692d0 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_mem_leaking.xml +++ b/indra/newview/skins/default/xui/pl/floater_mem_leaking.xml @@ -1,7 +1,7 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="MemLeak" title="SYMULACJA PRZECIEKÓW ALOKACJI PAMIĘCI"> - <spinner label="PrÄ™dkość Przecieków (byty na klatkÄ™):" name="leak_speed" /> - <spinner label="Max Przecieki (MB):" name="max_leak" /> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="MemLeak" title="STYMULACJA WYCIEKU PAMIĘCI"> + <spinner label="PrÄ™dkość przecieków (byty na klatkÄ™):" name="leak_speed"/> + <spinner label="Max przecieki (MB):" name="max_leak"/> <text name="total_leaked_label"> PrzeciekÅ‚o: [SIZE] KB </text> @@ -11,8 +11,8 @@ <text name="note_label_2"> [NOTE2] </text> - <button label="Start" name="start_btn" /> - <button label="Stop" name="stop_btn" /> - <button label="Uwolnij" name="release_btn" /> - <button label="Zamknij" name="close_btn" /> + <button label="Start" name="start_btn"/> + <button label="Stop" name="stop_btn"/> + <button label="Uwolnij" name="release_btn"/> + <button label="Zamknij" name="close_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/pl/floater_moveview.xml b/indra/newview/skins/default/xui/pl/floater_moveview.xml index e28cfd589d..9c97a8a0e7 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_moveview.xml +++ b/indra/newview/skins/default/xui/pl/floater_moveview.xml @@ -1,15 +1,43 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="move_floater"> -<panel name="panel_actions"> - <button label="" label_selected="" name="turn left btn" tool_tip="Obróć w lewo" /> - <button label="" label_selected="" name="turn right btn" tool_tip="Obroć w Prawo" /> - <button label="" label_selected="" name="move up btn" - tool_tip="Skocz lub zacznij latać w górÄ™" /> - <button label="" label_selected="" name="move down btn" - tool_tip="Pochyl siÄ™ lub zacznij latać w dół" /> - <joystick_slide name="slide left btn" tool_tip="PrzesuÅ„ w lewo" /> - <joystick_slide name="slide right btn" tool_tip="PrzesuÅ„ w prawo" /> - <joystick_turn name="forward btn" tool_tip="PrzesuÅ„ do przodu" /> - <joystick_turn name="backward btn" tool_tip="PrzesuÅ„ do tyÅ‚u" /> -</panel> + <string name="walk_forward_tooltip"> + Idź (naciÅ›nij StrzaÅ‚kÄ™ w GórÄ™ lub W) + </string> + <string name="walk_back_tooltip"> + Idź do tyÅ‚u (naciÅ›nij StrzaÅ‚kÄ™ w Dół lub S) + </string> + <string name="run_forward_tooltip"> + Biegnij do przodu (naciÅ›nij StrzaÅ‚kÄ™ w GórÄ™ lub W) + </string> + <string name="run_back_tooltip"> + Biegnij do przodu (naciÅ›nij StrzaÅ‚kÄ™ w Dół lub S) + </string> + <string name="fly_forward_tooltip"> + Leć do przodu (naciÅ›nij StrzaÅ‚kÄ™ w GórÄ™ lub W) + </string> + <string name="fly_back_tooltip"> + Leć do tyÅ‚u (naciÅ›nij StrzaÅ‚kÄ™ na Dół lub S) + </string> + <string name="walk_title"> + Idź + </string> + <string name="run_title"> + Biegnij + </string> + <string name="fly_title"> + Lataj + </string> + <panel name="panel_actions"> + <button label="" label_selected="" name="turn left btn" tool_tip="Obróć w lewo (naciÅ›nij LewÄ… StrzaÅ‚kÄ™ lub A)"/> + <button label="" label_selected="" name="turn right btn" tool_tip="Obróć w prawo (naciÅ›nij PrawÄ… StrzaÅ‚kÄ™ lub D)"/> + <button label="" label_selected="" name="move up btn" tool_tip="Leć do góry, naciÅ›nij E"/> + <button label="" label_selected="" name="move down btn" tool_tip="Leć w dół, naciÅ›nij C"/> + <joystick_turn name="forward btn" tool_tip="Idź (naciÅ›nij StrzaÅ‚kÄ™ w GórÄ™ lub W)"/> + <joystick_turn name="backward btn" tool_tip="Cofaj siÄ™ (naciÅ›nij StrzaÅ‚kÄ™ w Dół lub S)"/> + </panel> + <panel name="panel_modes"> + <button label="" name="mode_walk_btn" tool_tip="Tryb chodzenia"/> + <button label="" name="mode_run_btn" tool_tip="Tryb biegu"/> + <button label="" name="mode_fly_btn" tool_tip="Tryb latania"/> + </panel> </floater> diff --git a/indra/newview/skins/default/xui/pl/floater_mute_object.xml b/indra/newview/skins/default/xui/pl/floater_mute_object.xml index 8055617371..4af5872ef5 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_mute_object.xml +++ b/indra/newview/skins/default/xui/pl/floater_mute_object.xml @@ -9,6 +9,6 @@ <text name="note"> * Zablokuj jedynie tekst obiektu, bez dźwiÄ™ku </text> - <button label="Ok" name="OK"/> + <button label="OK" name="OK"/> <button label="Anuluj" name="Cancel"/> </floater> diff --git a/indra/newview/skins/default/xui/pl/floater_my_friends.xml b/indra/newview/skins/default/xui/pl/floater_my_friends.xml index 0bcf6ba4d5..847c93f891 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_my_friends.xml +++ b/indra/newview/skins/default/xui/pl/floater_my_friends.xml @@ -1,7 +1,7 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="floater_my_friends" title="KONTAKTY"> <tab_container name="friends_and_groups"> - <panel label="Znajomi" name="friends_panel" /> - <panel label="Grupy" name="groups_panel" /> + <panel label="Znajomi" name="friends_panel"/> + <panel label="Grupy" name="groups_panel"/> </tab_container> </floater> diff --git a/indra/newview/skins/default/xui/pl/floater_nearby_chat.xml b/indra/newview/skins/default/xui/pl/floater_nearby_chat.xml new file mode 100644 index 0000000000..e00b3188ea --- /dev/null +++ b/indra/newview/skins/default/xui/pl/floater_nearby_chat.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="nearby_chat" title="CZAT LOKALNY"/> diff --git a/indra/newview/skins/default/xui/pl/floater_openobject.xml b/indra/newview/skins/default/xui/pl/floater_openobject.xml index fbbed0f11d..8e94ae821c 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_openobject.xml +++ b/indra/newview/skins/default/xui/pl/floater_openobject.xml @@ -1,10 +1,8 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="objectcontents" title="ZAWARTOŚĆ OBIEKTU"> <text name="object_name"> [DESC]: </text> - <button label="Kopiuj do Szafy" label_selected="Kopiuj do Szafy" - name="copy_to_inventory_button" /> - <button label="Kopiuj i Zalóż" label_selected="Kopiuj i Załóż" - name="copy_and_wear_button" /> + <button label="Kopiuj do Szafy" label_selected="Kopiuj do Szafy" name="copy_to_inventory_button"/> + <button label="Kopiuj i zalóż" label_selected="Kopiuj i załóż" name="copy_and_wear_button"/> </floater> diff --git a/indra/newview/skins/default/xui/pl/floater_outfit_save_as.xml b/indra/newview/skins/default/xui/pl/floater_outfit_save_as.xml new file mode 100644 index 0000000000..a8d2e10c5f --- /dev/null +++ b/indra/newview/skins/default/xui/pl/floater_outfit_save_as.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="modal container" title="Stwórz ubranie"> + <button label="Zapisz" label_selected="Zapisz" name="Save"/> + <button label="Anuluj" label_selected="Anuluj" name="Cancel"/> + <text name="Save item as:"> + Zapisz to co mam w tej chwili zaÅ‚ożone +jako nowy komplet ubrania: + </text> + <line_editor name="name ed"> + [DESC] (nowy) + </line_editor> +</floater> diff --git a/indra/newview/skins/default/xui/pl/floater_outgoing_call.xml b/indra/newview/skins/default/xui/pl/floater_outgoing_call.xml new file mode 100644 index 0000000000..8a70cb3247 --- /dev/null +++ b/indra/newview/skins/default/xui/pl/floater_outgoing_call.xml @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="outgoing call" title="ROZMOWA GÅOSOWA"> + <floater.string name="lifetime"> + 5 + </floater.string> + <floater.string name="localchat"> + Rozmowy gÅ‚osowe w pobliżu + </floater.string> + <floater.string name="anonymous"> + anonimowy + </floater.string> + <floater.string name="VoiceInviteP2P"> + dzwoni. + </floater.string> + <floater.string name="VoiceInviteAdHoc"> + uczestniczy w konferencyjnej rozmowie gÅ‚osowej + </floater.string> + <text name="connecting"> + ÅÄ…czy z [CALLEE_NAME] + </text> + <text name="calling"> + Dzwoni [CALEE_NAME] + </text> + <text name="noanswer"> + Brak odpowiedzi. ProszÄ™ spróbować ponownie później. + </text> + <text name="nearby"> + ZostaleÅ› rozłączony z [VOICE_CHANNEL_NAME]. [RECONNECT_NEARBY] + </text> + <text name="nearby_P2P_by_other"> + [VOICE_CHANNEL_NAME] zakoÅ„czyÅ‚/a rozmowÄ™ gÅ‚osowÄ…. [RECONNECT_NEARBY] + </text> + <text name="nearby_P2P_by_agent"> + ZakoÅ„czyÅ‚eÅ› rozmowÄ™. [RECONNECT_NEARBY] + </text> + <text name="leaving"> + Opuszcza [CURRENT_CHAT] + </text> + <button label="Anuluj" label_selected="Anuluj" name="Cancel"/> +</floater> diff --git a/indra/newview/skins/default/xui/pl/floater_pay.xml b/indra/newview/skins/default/xui/pl/floater_pay.xml index dfb1b6616c..dccb7ed2bb 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_pay.xml +++ b/indra/newview/skins/default/xui/pl/floater_pay.xml @@ -1,22 +1,26 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="Give Money" title=""> - <button label="L$1" label_selected="L$1" name="fastpay 1" /> - <button label="L$5" label_selected="L$5" name="fastpay 5" /> - <button label="L$10" label_selected="L$10" name="fastpay 10" /> - <button label="L$20" label_selected="L$20" name="fastpay 20" /> - <button label="ZapÅ‚ać" label_selected="ZapÅ‚ać" name="pay btn" /> - <button label="Anuluj" label_selected="Anuluj" name="cancel btn" /> + <string name="payee_group"> + ZapÅ‚ać Grupie + </string> + <string name="payee_resident"> + ZapÅ‚ać Rezydentowi + </string> <text name="payee_label"> - ZapÅ‚ata dla: + ZapÅ‚ać: </text> + <icon name="icon_person" tool_tip="Osoba"/> <text name="payee_name"> [FIRST] [LAST] </text> - <text name="fastpay text" halign="left" left="12"> - Szybka ZapÅ‚ata: - </text> + <button label="L$1" label_selected="L$1" name="fastpay 1"/> + <button label="L$5" label_selected="L$5" name="fastpay 5"/> + <button label="L$10" label_selected="L$10" name="fastpay 10"/> + <button label="L$20" label_selected="L$20" name="fastpay 20"/> <text name="amount text"> - Suma: + lub wybierz kwotÄ™: </text> - <line_editor left="52" name="amount" /> + <line_editor left="52" name="amount"/> + <button label="ZapÅ‚ać" label_selected="ZapÅ‚ać" name="pay btn"/> + <button label="Anuluj" label_selected="Anuluj" name="cancel btn"/> </floater> diff --git a/indra/newview/skins/default/xui/pl/floater_pay_object.xml b/indra/newview/skins/default/xui/pl/floater_pay_object.xml index 376f517aaa..d0c69a6c21 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_pay_object.xml +++ b/indra/newview/skins/default/xui/pl/floater_pay_object.xml @@ -1,31 +1,30 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="Give Money" title=""> - <text name="payee_group" width="100" halign="left"> - ZapÅ‚ać Grupie: - </text> - <text name="payee_resident" width="120" halign="left" > - ZapÅ‚ać Rezydentowi: - </text> - <text name="payee_name" left="125"> + <string halign="left" name="payee_group" width="100"> + ZapÅ‚ać Grupie + </string> + <string halign="left" name="payee_resident" width="120"> + ZapÅ‚ać Rezydentowi + </string> + <icon name="icon_person" tool_tip="Osoba"/> + <text left="125" name="payee_name"> [FIRST] [LAST] </text> - <text name="object_name_label" left="5" width="95" halign="left"> + <text halign="left" left="5" name="object_name_label" width="95"> Poprzez Obiekt: </text> - <text name="object_name_text" left="105" > - ... - </text> - <text name="fastpay text" width="95" halign="left"> - Szybka ZapÅ‚ata: + <icon name="icon_object" tool_tip="Obiekt"/> + <text left="105" name="object_name_text"> + Poprzez obiekt </text> - <text name="amount text" left="5" halign="left"> - Suma: + <button label="L$1" label_selected="L$1" left="105" name="fastpay 1"/> + <button label="L$5" label_selected="L$5" left="190" name="fastpay 5"/> + <button label="L$10" label_selected="L$10" left="105" name="fastpay 10"/> + <button label="L$20" label_selected="L$20" left="190" name="fastpay 20"/> + <text halign="left" left="5" name="amount text"> + lub wybierz kwotÄ™: </text> - <button label="L$1" label_selected="L$1" name="fastpay 1" left="105"/> - <button label="L$5" label_selected="L$5" name="fastpay 5" left="190"/> - <button label="L$10" label_selected="L$10" name="fastpay 10" left="105"/> - <button label="L$20" label_selected="L$20" name="fastpay 20" left="190"/> - <button label="ZapÅ‚ać" label_selected="ZapÅ‚ać" name="pay btn" /> - <button label="Anuluj" label_selected="Anuluj" name="cancel btn" /> - <line_editor left="50" name="amount" width="50" /> + <line_editor left="50" name="amount" width="50"/> + <button label="ZapÅ‚ać" label_selected="ZapÅ‚ać" name="pay btn"/> + <button label="Anuluj" label_selected="Anuluj" name="cancel btn"/> </floater> diff --git a/indra/newview/skins/default/xui/pl/floater_perm_prefs.xml b/indra/newview/skins/default/xui/pl/floater_perm_prefs.xml index 834552e2b0..2128cfa3c8 100644 --- a/indra/newview/skins/default/xui/pl/floater_perm_prefs.xml +++ b/indra/newview/skins/default/xui/pl/floater_perm_prefs.xml @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="perm prefs" title="PRAWA DOMYÅšLNE"> +<floater name="perm prefs" title="USTAWIENIA DOMYÅšLNE ÅADOWANIA"> <panel label="Prawa" name="permissions"> <button label="?" label_selected="?" name="help"/> <check_box label="UdostÄ™pnij grupie" name="share_with_group"/> <check_box label="Pozwól kopiować każdemu" name="everyone_copy"/> <text name="NextOwnerLabel"> - NastÄ™pny wÅ‚aÅ›ciciel: + NastÄ™pny WÅ‚aÅ›ciciel: </text> <check_box label="Modyfikuje" name="next_owner_modify"/> <check_box label="Kopiuje" name="next_owner_copy"/> diff --git a/indra/newview/skins/default/xui/pl/floater_post_process.xml b/indra/newview/skins/default/xui/pl/floater_post_process.xml index 6bd91f97b1..a3515915bf 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_post_process.xml +++ b/indra/newview/skins/default/xui/pl/floater_post_process.xml @@ -16,40 +16,40 @@ </text> <slider label="" name="wmiColorFilterContrast" /> <text name="wmiColorFilterBaseText"> - Kontrast Koloru Podstawowego + Kontrast koloru podstawowego </text> <slider label="R" name="wmiColorFilterBaseR" /> <slider label="G" name="wmiColorFilterBaseG" /> <slider label="B" name="wmiColorFilterBaseB" /> <slider label="I" name="wmiColorFilterBaseI" /> </panel> - <panel label="Wizja Nocna" name="wmiNightVisionPanel"> + <panel label="Wizja nocna" name="wmiNightVisionPanel"> <check_box label="UdostÄ™pnij" name="wmiNightVisionToggle" /> <text name="wmiNightVisionBrightMultText"> - Wielokrotne Wzmocnienie ÅšwiatÅ‚a + Wielokrotne wzmocnienie Å›wiatÅ‚a </text> <slider label="" name="wmiNightVisionBrightMult" /> <text name="wmiNightVisionNoiseSizeText"> - Rozmiar Szumu + Rozmiar szumu </text> <slider label="" name="wmiNightVisionNoiseSize" /> <text name="wmiNightVisionNoiseStrengthText"> - Moc Szumu + Moc szumu </text> <slider label="" name="wmiNightVisionNoiseStrength" /> </panel> <panel label="Bloom" name="wmiBloomPanel"> <check_box label="UdostÄ™pnij" name="wmiBloomToggle" /> <text name="wmiBloomExtractText"> - Ekstracja Luminacji + Ekstracja luminacji </text> <slider label="" name="wmiBloomExtract" /> <text name="wmiBloomSizeText"> - Rozmiar Rozmazania Obrazu + Rozmiar rozmazania obrazu </text> <slider label="" name="wmiBloomSize" /> <text name="wmiBloomStrengthText"> - Moc Rozmazania Obrazu + Moc rozmazania obrazu </text> <slider label="" name="wmiBloomStrength" /> </panel> diff --git a/indra/newview/skins/default/xui/pl/floater_postcard.xml b/indra/newview/skins/default/xui/pl/floater_postcard.xml index 8f4018924d..095974aa61 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_postcard.xml +++ b/indra/newview/skins/default/xui/pl/floater_postcard.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Postcard" title="WYÅšLIJ POCZTÓWKĘ"> +<floater name="Postcard" title="WYÅšLIJ POCZTÓWKĘ (EMAIL)"> <text name="to_label"> Email Odbiorcy: </text> @@ -20,12 +20,12 @@ Wpisz treść swojej wiadomoÅ›ci tutaj </text_editor> <text name="fine_print"> - Jeżeli odbiorca tej pocztówki dołączy do [SECOND_LIFE], otrzymasz bonusa. + Jeżeli Odbiorca tej pocztówki dołączy do [SECOND_LIFE], otrzymasz bonus. </text> <button label="Anuluj" name="cancel_btn"/> <button label="WyÅ›lij" name="send_btn"/> <string name="default_subject"> - Pocztówki z [SECOND_LIFE] + Pocztówka z [SECOND_LIFE]. </string> <string name="default_message"> Sprawdź i przekonaj siÄ™ sam! diff --git a/indra/newview/skins/default/xui/pl/floater_preferences.xml b/indra/newview/skins/default/xui/pl/floater_preferences.xml index 2be663283f..3f62d764c6 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_preferences.xml +++ b/indra/newview/skins/default/xui/pl/floater_preferences.xml @@ -1,8 +1,15 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="Preferences" title="USTAWIENIA"> - <button label="OK" label_selected="OK" name="OK" /> - <button label="Anuluj" label_selected="Anuluj" name="Cancel" /> - <button label="Zastosuj" label_selected="Zastosuj" name="Apply" /> - <button label="O Second Life" label_selected="O Second Life" name="About..." /> - <button label="Pomoc" label_selected="Pomoc" name="Help" /> + <button label="OK" label_selected="OK" name="OK"/> + <button label="Anuluj" label_selected="Anuluj" name="Cancel"/> + <tab_container name="pref core"> + <panel label="Ogólne" name="general"/> + <panel label="Grafika" name="display"/> + <panel label="Prywatność" name="im"/> + <panel label="DźwiÄ™k & Media" name="audio"/> + <panel label="Czat" name="chat"/> + <panel label="Powiadomienia" name="msgs"/> + <panel label="Ustawienie" name="input"/> + <panel label="Zaawansowane" name="advanced1"/> + </tab_container> </floater> diff --git a/indra/newview/skins/default/xui/pl/floater_preview_animation.xml b/indra/newview/skins/default/xui/pl/floater_preview_animation.xml index 7139c470a4..6ce6914771 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_preview_animation.xml +++ b/indra/newview/skins/default/xui/pl/floater_preview_animation.xml @@ -1,10 +1,11 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="preview_anim"> + <floater.string name="Title"> + Animacja: [NAME] + </floater.string> <text name="desc txt"> Opis: </text> - <button label="Używaj w Åšwiecie" label_selected="Stop" name="Anim play btn" - tool_tip="Animacja bÄ™dzie widoczna dla wszystkich." width="131" left="20"/> - <button label="Używaj lokalnie" label_selected="Stop" name="Anim audition btn" - tool_tip="Animacja bÄ™dzie widoczna tylko dla Ciebie." width="125" left="162"/> + <button label="Uruchom in-world" label_selected="Stop" left="20" name="Anim play btn" tool_tip="Uruchom animacjÄ™ by widzieli jÄ… pozostali Rezydenci" width="131"/> + <button label="Używaj lokalnie" label_selected="Stop" left="162" name="Anim audition btn" tool_tip="Uruchom animacjÄ™ widocznÄ… tylko przez Ciebie" width="125"/> </floater> diff --git a/indra/newview/skins/default/xui/pl/floater_preview_classified.xml b/indra/newview/skins/default/xui/pl/floater_preview_classified.xml index eae9ba2690..d3d6588397 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_preview_classified.xml +++ b/indra/newview/skins/default/xui/pl/floater_preview_classified.xml @@ -1,2 +1,6 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="classified_preview" title="REKLAMA" /> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="classified_preview" title="INFO O REKLAMIE"> + <floater.string name="Title"> + Reklama: [NAME] + </floater.string> +</floater> diff --git a/indra/newview/skins/default/xui/pl/floater_preview_event.xml b/indra/newview/skins/default/xui/pl/floater_preview_event.xml index 9fc0ff4da6..5d9e47bc00 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_preview_event.xml +++ b/indra/newview/skins/default/xui/pl/floater_preview_event.xml @@ -1,2 +1,6 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="event_preview" title="INFORMACJE O IMPREZIE" /> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="event_preview" title="INFO O IMPREZIE"> + <floater.string name="Title"> + Impreza: [NAME] + </floater.string> +</floater> diff --git a/indra/newview/skins/default/xui/pl/floater_preview_gesture.xml b/indra/newview/skins/default/xui/pl/floater_preview_gesture.xml index 1c7a3f6631..05758ac04d 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_preview_gesture.xml +++ b/indra/newview/skins/default/xui/pl/floater_preview_gesture.xml @@ -1,14 +1,32 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="gesture_preview"> - <string name="stop_txt"> + <floater.string name="step_anim"> + Animacja + </floater.string> + <floater.string name="step_sound"> + DźwiÄ™k: + </floater.string> + <floater.string name="step_chat"> + Czat: + </floater.string> + <floater.string name="step_wait"> + Wstrzymaj: + </floater.string> + <floater.string name="stop_txt"> Stop - </string> - <string name="preview_txt"> + </floater.string> + <floater.string name="preview_txt"> Pokaż - </string> - <string name="none_text"> + </floater.string> + <floater.string name="none_text"> -- Brak -- - </string> + </floater.string> + <floater.string name="Title"> + Gest: [NAME] + </floater.string> + <text name="name_text"> + Nazwa: + </text> <text name="desc_label"> Opis: </text> @@ -27,29 +45,23 @@ <text name="library_label"> Zbiór: </text> + <scroll_list name="library_list"/> + <button label="Dodaj >>" name="add_btn"/> <text name="steps_label"> Etapy: </text> - <scroll_list name="library_list"> - Animacja -DźwiÄ™k -Czat -Wstrzymaj - </scroll_list> - <button label="Dodaj >>" name="add_btn"/> - <button label="W GórÄ™" name="up_btn"/> - <button label="W Dół" name="down_btn"/> + <button label="W górÄ™" name="up_btn"/> + <button label="W dół" name="down_btn"/> <button label="UsuÅ„" name="delete_btn"/> - <text name="help_label"> - Wszystkie etapy nastÄ…piÄ… razem, -chyba, że dodasz pauzy. - </text> <radio_group name="animation_trigger_type"> - <radio_item name="start" label="Start" /> - <radio_item name="stop" label="Stop" /> + <radio_item label="Start" name="start"/> + <radio_item label="Stop" name="stop"/> </radio_group> <check_box label="do koÅ„ca animacji" name="wait_anim_check"/> <check_box label="czas w sekundach" name="wait_time_check"/> + <text name="help_label"> + Wszystkie etapy nastÄ…piÄ… razem, chyba, że dodasz pauzy. + </text> <check_box label="Aktywny" name="active_check" tool_tip="Aktywne gesty można włączać używajÄ…c przypisanej frazy w czacie albo używajÄ…c przypisanego klawisza skrótowego. W przypaku konfliktu przypisaÅ„ gesty zazwyczaj nie bÄ™dÄ… dziaÅ‚ać."/> <button label="Pokaż" name="preview_btn"/> <button label="Zapisz" name="save_btn"/> diff --git a/indra/newview/skins/default/xui/pl/floater_preview_gesture_info.xml b/indra/newview/skins/default/xui/pl/floater_preview_gesture_info.xml new file mode 100644 index 0000000000..d31cada96d --- /dev/null +++ b/indra/newview/skins/default/xui/pl/floater_preview_gesture_info.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Gesture" title="GEST"/> diff --git a/indra/newview/skins/default/xui/pl/floater_preview_gesture_shortcut.xml b/indra/newview/skins/default/xui/pl/floater_preview_gesture_shortcut.xml new file mode 100644 index 0000000000..d33b799476 --- /dev/null +++ b/indra/newview/skins/default/xui/pl/floater_preview_gesture_shortcut.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Gesture" title="GESTY"> + <text name="trigger_label"> + Czat: + </text> + <text name="key_label"> + Klawiatura: + </text> + <combo_box label="Å»aden" name="modifier_combo"/> + <combo_box label="Å»aden" name="key_combo"/> + <text name="replace_text" tool_tip="ZmieÅ„ włączajÄ…cÄ… frazÄ™ na innÄ…. Na przykÅ‚ad zmiana 'witam' na 'cześć' zmieni czat 'ChciaÅ‚em powiedzieć witam' na 'ChciaÅ‚em powiedzieć cześć' i pokaże animacjÄ™!"> + ZamieÅ„ na: + </text> + <line_editor name="replace_editor" tool_tip="ZmieÅ„ włączajÄ…cÄ… frazÄ™ na innÄ…. Na przykÅ‚ad zmiana 'witam' na 'cześć' zmieni czat 'ChciaÅ‚em powiedzieć witam' na 'ChciaÅ‚em powiedzieć cześć' i pokaże animacjÄ™"/> +</floater> diff --git a/indra/newview/skins/default/xui/pl/floater_preview_gesture_steps.xml b/indra/newview/skins/default/xui/pl/floater_preview_gesture_steps.xml new file mode 100644 index 0000000000..6592d9dad0 --- /dev/null +++ b/indra/newview/skins/default/xui/pl/floater_preview_gesture_steps.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Gesture" title="GESTY"/> diff --git a/indra/newview/skins/default/xui/pl/floater_preview_notecard.xml b/indra/newview/skins/default/xui/pl/floater_preview_notecard.xml index b9f80490ab..1ad07c236b 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_preview_notecard.xml +++ b/indra/newview/skins/default/xui/pl/floater_preview_notecard.xml @@ -1,16 +1,22 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="preview notecard" title="NOTA:"> - <button label="Zapisz" label_selected="Zapisz" name="Save" /> + <floater.string name="no_object"> + Nie można znaleźć obiektu zawierajÄ…cego tÄ… notkÄ™. + </floater.string> + <floater.string name="not_allowed"> + Nie masz pozwolenia na zobaczenie tej notki. + </floater.string> + <floater.string name="Title"> + Notka: [NAME] + </floater.string> + <floater.string label="Zapisz" label_selected="Zapisz" name="Save"> + Zapisz + </floater.string> <text name="desc txt"> Opis: </text> <text_editor name="Notecard Editor"> Åadowanie... </text_editor> - <string name="no_object"> - Nie można znaleść obiektu zawierajÄ…cego tÄ… notkÄ™. - </string> - <string name="not_allowed"> - Nie masz pozwolenia na zobaczenie tej notki. - </string> + <button label="Zapisz" label_selected="Zapisz" name="Save"/> </floater> diff --git a/indra/newview/skins/default/xui/pl/floater_preview_sound.xml b/indra/newview/skins/default/xui/pl/floater_preview_sound.xml index 656b9bec38..d02b3ca75e 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_preview_sound.xml +++ b/indra/newview/skins/default/xui/pl/floater_preview_sound.xml @@ -1,12 +1,11 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="preview_sound"> + <floater.string name="Title"> + DźwiÄ™k: [NAME] + </floater.string> <text name="desc txt"> Opis: </text> - <button label="Odtwarzaj Lokalnie" label_selected="Odtwarzaj Lokalnie" - name="Sound audition btn" - tool_tip="DźwiÄ™k bÄ™dzie sÅ‚yszalny tylko dla Ciebie." /> - <button label="Odtwarzaj w Åšwiecie" label_selected="Odtwarzaj w Åšwiecie" - name="Sound play btn" - tool_tip="DźwiÄ™k bÄ™dzie sÅ‚yszalny przez wszystkich." width="130" left_delta="-136"/> + <button label="Odtwarzaj" label_selected="Odtwarzaj" left_delta="-136" name="Sound play btn" tool_tip="DźwiÄ™k bÄ™dzie sÅ‚yszalny przez wszystkich." width="130"/> + <button label="Odtwarzaj Lokalnie" label_selected="Odtwarzaj lokalnie" name="Sound audition btn" tool_tip="DźwiÄ™k bÄ™dzie sÅ‚yszalny tylko dla Ciebie."/> </floater> diff --git a/indra/newview/skins/default/xui/pl/floater_preview_texture.xml b/indra/newview/skins/default/xui/pl/floater_preview_texture.xml index 8bcd800411..e58acee139 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_preview_texture.xml +++ b/indra/newview/skins/default/xui/pl/floater_preview_texture.xml @@ -1,9 +1,47 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="preview_texture"> + <floater.string name="Title"> + Tekstura: [NAME] + </floater.string> + <floater.string name="Copy"> + Kopiuj do Szafy + </floater.string> <text name="desc txt"> Opis: </text> <text name="dimensions"> - Wymiary: [WIDTH] x [HEIGHT] + [WIDTH]px x [HEIGHT]px </text> + <text name="aspect_ratio"> + Zobacz proporcje + </text> + <combo_box name="combo_aspect_ratio" tool_tip="WyÅ›wietl w domyÅ›lnych proporcjach"> + <combo_item name="Unconstrained"> + Swobodny + </combo_item> + <combo_item name="1:1" tool_tip="Insygnia Grupy lub realny Profil"> + 1:1 + </combo_item> + <combo_item name="4:3" tool_tip="[SECOND_LIFE] profil"> + 4:3 + </combo_item> + <combo_item name="10:7" tool_tip="Reklamy i atrakcje, landmarki"> + 10:7 + </combo_item> + <combo_item name="3:2" tool_tip="O PosiadÅ‚oÅ›ci"> + 3:2 + </combo_item> + <combo_item name="16:10"> + 16:10 + </combo_item> + <combo_item name="16:9" tool_tip="LubiÄ™"> + 16:9 + </combo_item> + <combo_item name="2:1"> + 2:1 + </combo_item> + </combo_box> + <button label="OK" name="Keep"/> + <button label="Wyrzuć" name="Discard"/> + <button label="Zapisz jako" name="save_tex_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/pl/floater_publish_classified.xml b/indra/newview/skins/default/xui/pl/floater_publish_classified.xml new file mode 100644 index 0000000000..12cda04e10 --- /dev/null +++ b/indra/newview/skins/default/xui/pl/floater_publish_classified.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="publish_classified" title="Publikowanie Reklam"> + <text name="explanation_text"> + Twoja reklama zostanie wyÅ›wietlana przez okres jednego tygodnia od daty jej publikacji. + +PamiÄ™taj, opÅ‚aty za reklamy nie podlegajÄ… prawu zwrotu. + </text> + <spinner label="Cena za ReklamÄ™:" name="price_for_listing" tool_tip="Cena za umieszczenie reklamy w wyszukiwarce." value="50"/> + <text name="l$_text" value="L$"/> + <text name="more_info_text"> + WiÄ™cej info (link do pomocy) + </text> + <button label="Publikuj" name="publish_btn"/> + <button label="Anuluj" name="cancel_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/pl/floater_region_info.xml b/indra/newview/skins/default/xui/pl/floater_region_info.xml index ca3c1391db..a1f7785f48 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_region_info.xml +++ b/indra/newview/skins/default/xui/pl/floater_region_info.xml @@ -1,2 +1,2 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="regioninfo" title="REGION/MAJÄ„TEK" /> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="regioninfo" title="REGION/MAJÄ„TEK"/> diff --git a/indra/newview/skins/default/xui/pl/floater_report_abuse.xml b/indra/newview/skins/default/xui/pl/floater_report_abuse.xml index 18ce1b230f..a6f8ba6c11 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_report_abuse.xml +++ b/indra/newview/skins/default/xui/pl/floater_report_abuse.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="floater_report_abuse" title="RAPORT O NADUÅ»YCIU"> <floater.string name="Screenshot"> - ZdjÄ™cie Ekranu + ZdjÄ™cie ekranu </floater.string> <check_box label="Załącz zdjÄ™cie do raportu" name="screen_check"/> <text name="reporter_title"> @@ -40,42 +40,42 @@ </text> <combo_box name="category_combo" tool_tip="Wybór kategorii - wybierz kategoriÄ™, której dotyczy raport"> <combo_box.item label="Wybierz KategoriÄ™:" name="Select_category"/> - <combo_box.item label="Wiek > Udawanie Nieletniej Osoby" name="Age__Age_play"/> + <combo_box.item label="Wiek > Udawanie nieletniej osoby" name="Age__Age_play"/> <combo_box.item label="Wiek > DorosÅ‚y Rezydent w Teen Second Life" name="Age__Adult_resident_on_Teen_Second_Life"/> <combo_box.item label="Wiek > Nieletni Rezydent poza Teen Second Life" name="Age__Underage_resident_outside_of_Teen_Second_Life"/> - <combo_box.item label="Napaść > Strefa Militarna / Niebezpieczny Obszar" name="Assault__Combat_sandbox___unsafe_area"/> - <combo_box.item label="Napaść > Bezpieczny Obszar" name="Assault__Safe_area"/> - <combo_box.item label="Napaść > Obszar do Testowania Broni" name="Assault__Weapons_testing_sandbox"/> - <combo_box.item label="Handel > Niedostarczenie Produktu lub UsÅ‚ugi" name="Commerce__Failure_to_deliver_product_or_service"/> - <combo_box.item label="Naruszenie PrywatnoÅ›ci > Dane Osobiste" name="Disclosure__Real_world_information"/> - <combo_box.item label="Ujawnienie > Monitorowanie Czatu" name="Disclosure__Remotely_monitoring chat"/> - <combo_box.item label="Ujawnienie > Dane z Second Life / Czatu / IM" name="Disclosure__Second_Life_information_chat_IMs"/> - <combo_box.item label="Zakłócanie Spokoju > Nieuczciwe Używanie Zasobów Regionu" name="Disturbing_the_peace__Unfair_use_of_region_resources"/> - <combo_box.item label="Zakłócanie Spokoju > Przesadnie Skryptowane Obiekty" name="Disturbing_the_peace__Excessive_scripted_objects"/> - <combo_box.item label="Zakłócanie Spokoju > Åšmiecenie Obiektami" name="Disturbing_the_peace__Object_littering"/> - <combo_box.item label="Zakłócanie Spokoju > CiÄ…gÅ‚y Spam" name="Disturbing_the_peace__Repetitive_spam"/> - <combo_box.item label="Zakłócanie Spokoju > NieporzÄ…dany Spam Reklamowy" name="Disturbing_the_peace__Unwanted_advert_spam"/> + <combo_box.item label="Napaść > strefa militarna / niebezpieczny obszar" name="Assault__Combat_sandbox___unsafe_area"/> + <combo_box.item label="Napaść > nezpieczny obszar" name="Assault__Safe_area"/> + <combo_box.item label="Napaść > obszar do testowania broni" name="Assault__Weapons_testing_sandbox"/> + <combo_box.item label="Handel > niedostarczenie produktu lub usÅ‚ugi" name="Commerce__Failure_to_deliver_product_or_service"/> + <combo_box.item label="Naruszenie prywatnoÅ›ci > dane osobiste" name="Disclosure__Real_world_information"/> + <combo_box.item label="Ujawnienie > monitorowanie czatu" name="Disclosure__Remotely_monitoring chat"/> + <combo_box.item label="Ujawnienie > dane z Second Life / Czatu / IM" name="Disclosure__Second_Life_information_chat_IMs"/> + <combo_box.item label="Zakłócanie spokoju > nieuczciwe używanie zasobów Regionu" name="Disturbing_the_peace__Unfair_use_of_region_resources"/> + <combo_box.item label="Zakłócanie spokoju > przesadnie skryptowane obiekty" name="Disturbing_the_peace__Excessive_scripted_objects"/> + <combo_box.item label="Zakłócanie spokoju > Å›miecenie obiektami" name="Disturbing_the_peace__Object_littering"/> + <combo_box.item label="Zakłócanie spokoju > ciÄ…gÅ‚y spam" name="Disturbing_the_peace__Repetitive_spam"/> + <combo_box.item label="Zakłócanie spokoju > nieporzÄ…dany spam reklamowy" name="Disturbing_the_peace__Unwanted_advert_spam"/> <combo_box.item label="Oszustwo > L$" name="Fraud__L$"/> <combo_box.item label="Oszustwo > PosiadÅ‚oÅ›ci" name="Fraud__Land"/> - <combo_box.item label="Oszustwo > Piramidy albo Listy ÅaÅ„cuchowe" name="Fraud__Pyramid_scheme_or_chain_letter"/> + <combo_box.item label="Oszustwo > piramidy albo listy Å‚aÅ„cuchowe" name="Fraud__Pyramid_scheme_or_chain_letter"/> <combo_box.item label="Oszustwo > US$" name="Fraud__US$"/> - <combo_box.item label="PrzeÅ›ladowanie > Farmy Reklamowe / Wizualny Spam" name="Harassment__Advert_farms___visual_spam"/> - <combo_box.item label="PrzeÅ›ladowanie > ZniesÅ‚awianie Jedostek lub Grup" name="Harassment__Defaming_individuals_or_groups"/> - <combo_box.item label="PrzeÅ›ladowanie > Ograniczanie Ruchu" name="Harassment__Impeding_movement"/> - <combo_box.item label="PrzeÅ›ladowanie > Molestowanie Seksualne" name="Harassment__Sexual_harassment"/> - <combo_box.item label="PrzeÅ›ladowanie > Namawianie/ZachÄ™canie Innych do Åamania Warunków Umowy (ToS)" name="Harassment__Solicting_inciting_others_to_violate_ToS"/> + <combo_box.item label="PrzeÅ›ladowanie > farmy reklamowe / wizualny spam" name="Harassment__Advert_farms___visual_spam"/> + <combo_box.item label="PrzeÅ›ladowanie > zniesÅ‚awianie jedostek lub grup" name="Harassment__Defaming_individuals_or_groups"/> + <combo_box.item label="PrzeÅ›ladowanie > Ograniczanie ruchu" name="Harassment__Impeding_movement"/> + <combo_box.item label="PrzeÅ›ladowanie > Molestowanie seksualne" name="Harassment__Sexual_harassment"/> + <combo_box.item label="PrzeÅ›ladowanie > Namawianie/ZachÄ™canie innych do Å‚amania warunków umowy (ToS)" name="Harassment__Solicting_inciting_others_to_violate_ToS"/> <combo_box.item label="PrzeÅ›ladowanie > Znieważanie SÅ‚owne" name="Harassment__Verbal_abuse"/> - <combo_box.item label="Nieprzyzwoitość > Obraźliwa Treść lub PostÄ™powanie" name="Indecency__Broadly_offensive_content_or_conduct"/> - <combo_box.item label="Nieprzyzwoitość > Niestosowne ImiÄ™ Awatara" name="Indecency__Inappropriate_avatar_name"/> - <combo_box.item label="Nieprzyzwoitość > Obraźliwa treść i postÄ™powanie w regionie 'PG'" name="Indecency__Mature_content_in_PG_region"/> - <combo_box.item label="Nieprzyzwoitość > Obraźliwa treść i postÄ™powanie w regionie 'Mature'" name="Indecency__Inappropriate_content_in_Mature_region"/> - <combo_box.item label="Naruszenie WÅ‚asnoÅ›ci Intelektualnej > UsuniÄ™cie TreÅ›ci" name="Intellectual_property_infringement_Content_Removal"/> - <combo_box.item label="Naruszenie WÅ‚asnoÅ›ci Intelektualnej > CopyBot albo Nadużycie Przywilejów" name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit"/> + <combo_box.item label="Nieprzyzwoitość > Obraźliwa treść lub postÄ™powanie" name="Indecency__Broadly_offensive_content_or_conduct"/> + <combo_box.item label="Nieprzyzwoitość > Niestosowne imiÄ™ awatara" name="Indecency__Inappropriate_avatar_name"/> + <combo_box.item label="Nieprzyzwoitość > Obraźliwa treść i postÄ™powanie w Regionie 'PG'" name="Indecency__Mature_content_in_PG_region"/> + <combo_box.item label="Nieprzyzwoitość > Obraźliwa treść i postÄ™powanie w Regionie 'Mature'" name="Indecency__Inappropriate_content_in_Mature_region"/> + <combo_box.item label="Naruszenie wÅ‚asnoÅ›ci intelektualnej > usuniÄ™cie treÅ›ci" name="Intellectual_property_infringement_Content_Removal"/> + <combo_box.item label="Naruszenie wÅ‚asnoÅ›ci intelektualnej > CopyBot albo nadużycie przywilejów" name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit"/> <combo_box.item label="Nietolerancja" name="Intolerance"/> - <combo_box.item label="PosiadÅ‚oÅ›ci > Nadużywanie Piaskownicy" name="Land__Abuse_of_sandbox_resources"/> - <combo_box.item label="PosiadÅ‚oÅ›ci > Naruszenie > Obiekty/Tekstury" name="Land__Encroachment__Objects_textures"/> - <combo_box.item label="PosiadÅ‚oÅ›ci > Naruszenie > CzÄ…steczki" name="Land__Encroachment__Particles"/> - <combo_box.item label="PosiadÅ‚oÅ›ci > Naruszenie > Drzewa/RoÅ›liny" name="Land__Encroachment__Trees_plants"/> + <combo_box.item label="PosiadÅ‚oÅ›ci > nadużywanie piaskownicy" name="Land__Abuse_of_sandbox_resources"/> + <combo_box.item label="PosiadÅ‚oÅ›ci > naruszenie > obiekty/tekstury" name="Land__Encroachment__Objects_textures"/> + <combo_box.item label="PosiadÅ‚oÅ›ci > naruszenie > czÄ…steczki" name="Land__Encroachment__Particles"/> + <combo_box.item label="PosiadÅ‚oÅ›ci > naruszenie > drzewa/roÅ›liny" name="Land__Encroachment__Trees_plants"/> <combo_box.item label="ZakÅ‚ady/Hazard" name="Wagering_gambling"/> <combo_box.item label="Inne" name="Other"/> </combo_box> diff --git a/indra/newview/skins/default/xui/pl/floater_script_debug.xml b/indra/newview/skins/default/xui/pl/floater_script_debug.xml index 714a600262..714a600262 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_script_debug.xml +++ b/indra/newview/skins/default/xui/pl/floater_script_debug.xml diff --git a/indra/newview/skins/default/xui/pl/floater_script_debug_panel.xml b/indra/newview/skins/default/xui/pl/floater_script_debug_panel.xml new file mode 100644 index 0000000000..e70a30fa24 --- /dev/null +++ b/indra/newview/skins/default/xui/pl/floater_script_debug_panel.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="script" short_title="[ALL SCRIPTS]" title="[ALL SCRIPTS]"/> diff --git a/indra/newview/skins/default/xui/pl/floater_script_limits.xml b/indra/newview/skins/default/xui/pl/floater_script_limits.xml new file mode 100644 index 0000000000..dd13d641a0 --- /dev/null +++ b/indra/newview/skins/default/xui/pl/floater_script_limits.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="scriptlimits" title="SKRYPT"/> diff --git a/indra/newview/skins/default/xui/pl/floater_script_preview.xml b/indra/newview/skins/default/xui/pl/floater_script_preview.xml index e3e72e15a3..eb6a1df77b 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_script_preview.xml +++ b/indra/newview/skins/default/xui/pl/floater_script_preview.xml @@ -1,5 +1,8 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="preview lsl text" title="SKRYPT: SKRYPT OBROTU"> + <floater.string name="Title"> + Skrypt: [NAME] + </floater.string> <text name="desc txt"> Opis: </text> diff --git a/indra/newview/skins/default/xui/pl/floater_script_queue.xml b/indra/newview/skins/default/xui/pl/floater_script_queue.xml index 7655f5fcac..bdfdba569e 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_script_queue.xml +++ b/indra/newview/skins/default/xui/pl/floater_script_queue.xml @@ -1,4 +1,19 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="queue" title="ZRESETUJ PRACĘ W TOKU"> - <button label="Zamknij" label_selected="Zamknij" name="close" /> + <floater.string name="Starting"> + RozpoczÄ™cie [START] [COUNT] elementów. + </floater.string> + <floater.string name="Done"> + Wykonane. + </floater.string> + <floater.string name="Resetting"> + Trwa resetowanie + </floater.string> + <floater.string name="Running"> + Skrypt dziaÅ‚a + </floater.string> + <floater.string name="NotRunning"> + Skrypt nie dziaÅ‚a + </floater.string> + <button label="Zamknij" label_selected="Zamknij" name="close"/> </floater> diff --git a/indra/newview/skins/default/xui/pl/floater_script_search.xml b/indra/newview/skins/default/xui/pl/floater_script_search.xml index 255ab4264c..cb010daee4 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_script_search.xml +++ b/indra/newview/skins/default/xui/pl/floater_script_search.xml @@ -1,10 +1,9 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="script search" title="SZUKAJ SKRYPTU"> - <check_box label="CapsLoock Nieaktywny" name="case_text" /> - <button label="Szukaj" label_selected="Szukaj" name="search_btn" /> - <button label="ZamieÅ„" label_selected="ZamieÅ„" name="replace_btn" /> - <button label="ZamieÅ„ Wszystko" label_selected="ZamieÅ„ Wszystko" - name="replace_all_btn" /> + <check_box label="CapsLoock nieaktywny" name="case_text"/> + <button label="Szukaj" label_selected="Szukaj" name="search_btn"/> + <button label="ZamieÅ„" label_selected="ZamieÅ„" name="replace_btn"/> + <button label="ZamieÅ„ Wszystko" label_selected="ZamieÅ„ wszystko" name="replace_all_btn"/> <text name="txt"> Szukaj </text> diff --git a/indra/newview/skins/default/xui/pl/floater_search.xml b/indra/newview/skins/default/xui/pl/floater_search.xml new file mode 100644 index 0000000000..a0198670e4 --- /dev/null +++ b/indra/newview/skins/default/xui/pl/floater_search.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_search" title="SZUKAJ"> + <floater.string name="loading_text"> + Åadowanie... + </floater.string> + <floater.string name="done_text"> + Wykonano + </floater.string> + <layout_stack name="stack1"> + <layout_panel name="browser_layout"> + <text name="refresh_search"> + Ustaw wyszukiwanie na odzwierciedlanie poziomu boskiego + </text> + </layout_panel> + </layout_stack> +</floater> diff --git a/indra/newview/skins/default/xui/pl/floater_select_key.xml b/indra/newview/skins/default/xui/pl/floater_select_key.xml index 194a6da1bd..190ad61352 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_select_key.xml +++ b/indra/newview/skins/default/xui/pl/floater_select_key.xml @@ -1,7 +1,7 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="modal container" title=""> - <button label="Anuluj" label_selected="Anuluj" name="Cancel" /> + <button label="Anuluj" label_selected="Anuluj" name="Cancel"/> <text name="Save item as:"> - By wybrać wciÅ›nij klawisz + NaciÅ›nij klawisz aby ustawić przełącznik Mówić. </text> </floater> diff --git a/indra/newview/skins/default/xui/pl/floater_sell_land.xml b/indra/newview/skins/default/xui/pl/floater_sell_land.xml index a306ec2c34..eb1ed74797 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_sell_land.xml +++ b/indra/newview/skins/default/xui/pl/floater_sell_land.xml @@ -1,62 +1,65 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="sell land" title="SELL LAND"> - <scroll_container name="profile_scroll"> - <panel name="scroll_content_panel"> - <text name="info_parcel_label"> - PosiadÅ‚ość: - </text> - <text name="info_parcel"> - NAZWA POSIADÅOÅšCI - </text> - <text name="info_size_label"> - Obszar: - </text> - <text name="info_size"> - [AREA] m. - </text> - <text name="info_action"> - Aby sprzedać tÄ… PosiadÅ‚ość: - </text> - <text name="price_label"> - Ustal cenÄ™: - </text> - <text name="price_text"> - Wybierz wÅ‚aÅ›ciwÄ… cenÄ™ za tÄ… PosiadÅ‚ość. - </text> - <text name="price_ld"> - L$ - </text> - <text name="price_per_m"> - ([PER_METER]L$ za metr) - </text> - <text name="sell_to_label"> - Kupiec: - </text> - <text name="sell_to_text"> - Wybierz sprzedaż dla kogokolwiek albo dla wybranego kupca. - </text> - <combo_box name="sell_to"> - <combo_box.item name="--selectone--" label="wybierz --" /> - <combo_box.item name="Anyone" label="Ktokolwiek" /> - <combo_box.item name="Specificuser:" label="Wybrany kupiec:" /> - </combo_box> - <button label="Wybierz..." name="sell_to_select_agent" /> - <text name="sell_objects_label"> - Obiekty sprzedawane razem z PosiadÅ‚oÅ›ciÄ…? - </text> - <text name="sell_objects_text"> - Przekazywalne obiekty wÅ‚aÅ›ciciela PosiadÅ‚oÅ›ci zmieniÄ… wÅ‚aÅ›ciciela. - </text> - <radio_group name="sell_objects"> - <radio_item name="no" label="Nie, zatrzymaj obiekty" /> - <radio_item name="yes" label="Tak, sprzedaj obiekty razem z PosiadÅ‚oÅ›ciÄ…" /> - </radio_group> - <button label="Pokaż Obiekty" name="show_objects" /> - <text name="nag_message_label"> - PAMIĘTAJ: Sprzedaż jest nieodwracalna. - </text> - <button label="Wystaw ZiemiÄ™ na Sprzedaż" name="sell_btn" /> - <button label="Anuluj" name="cancel_btn" /> - </panel> - </scroll_container> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="sell land" title="SPRZEDAJ POSIADÅOŚĆ"> + <scroll_container name="profile_scroll"> + <panel name="scroll_content_panel"> + <text name="info_parcel_label"> + PosiadÅ‚ość: + </text> + <text name="info_parcel"> + NAZWA POSIADÅOÅšCI + </text> + <text name="info_size_label"> + Rozmiar: + </text> + <text name="info_size"> + [AREA] m² + </text> + <text name="info_action"> + Aby sprzedać tÄ… PosiadÅ‚ość: + </text> + <text name="price_label"> + 1. Ustal cenÄ™: + </text> + <text name="price_text"> + Wybierz wÅ‚aÅ›ciwÄ… cenÄ™ za tÄ… PosiadÅ‚ość. + </text> + <text name="price_ld"> + L$ + </text> + <line_editor name="price"> + 0 + </line_editor> + <text name="price_per_m"> + (L$[PER_METER] za m²) + </text> + <text name="sell_to_label"> + 2. Sprzedaj PosiadÅ‚ość: + </text> + <text name="sell_to_text"> + Wybierz sprzedaż dla kogokolwiek albo dla wybranego kupca. + </text> + <combo_box name="sell_to"> + <combo_box.item label="- Wybierz -" name="--selectone--"/> + <combo_box.item label="Ktokolwiek" name="Anyone"/> + <combo_box.item label="Wybrany Kupiec:" name="Specificuser:"/> + </combo_box> + <button label="Wybierz" name="sell_to_select_agent"/> + <text name="sell_objects_label"> + 3. Obiekty sprzedawane razem z PosiadÅ‚oÅ›ciÄ…? + </text> + <text name="sell_objects_text"> + Przekazywalne obiekty wÅ‚aÅ›ciciela PosiadÅ‚oÅ›ci zmieniÄ… wÅ‚aÅ›ciciela. + </text> + <radio_group name="sell_objects"> + <radio_item label="Nie, zatrzymaj obiekty" name="no"/> + <radio_item label="Tak, sprzedaj obiekty razem z PosiadÅ‚oÅ›ciÄ…" name="yes"/> + </radio_group> + <button label="Pokaż Obiekty" name="show_objects"/> + <text name="nag_message_label"> + PAMIĘTAJ: Sprzedaż jest nieodwracalna. + </text> + <button label="Wystaw ziemiÄ™ na sprzedaż" name="sell_btn"/> + <button label="Anuluj" name="cancel_btn"/> + </panel> + </scroll_container> </floater> diff --git a/indra/newview/skins/default/xui/pl/floater_settings_debug.xml b/indra/newview/skins/default/xui/pl/floater_settings_debug.xml index f87e2edecc..7c29d52e7b 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_settings_debug.xml +++ b/indra/newview/skins/default/xui/pl/floater_settings_debug.xml @@ -1,10 +1,10 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="settings_debug" title="USTAWIENIA USUWANIA BÅĘDÓW"> - <combo_box name="boolean_combo"> - <combo_box.item name="TRUE" label="PRAWDA" /> - <combo_box.item name="FALSE" label="NIEPRAWDA" /> - </combo_box> - <color_swatch label="Kolor" name="color_swatch"/> +<floater name="settings_debug" title="USTAWIENIA DEBUGOWANIA"> + <radio_group name="boolean_combo"> + <radio_item label="PRAWDA" name="TRUE" value="prawda"/> + <radio_item label="NIEPRAWDA" name="FALSE" value=""/> + </radio_group> + <color_swatch label="Kolor" name="val_color_swatch"/> <spinner label="x" name="val_spinner_1"/> <spinner label="x" name="val_spinner_2"/> <spinner label="x" name="val_spinner_3"/> diff --git a/indra/newview/skins/default/xui/pl/floater_snapshot.xml b/indra/newview/skins/default/xui/pl/floater_snapshot.xml index c807087170..df4e5b43bc 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_snapshot.xml +++ b/indra/newview/skins/default/xui/pl/floater_snapshot.xml @@ -4,23 +4,23 @@ Lokacja zapisu </text> <radio_group label="Rodzaje zdjęć" name="snapshot_type_radio"> - <radio_item name="postcard" label="WyÅ›lij (email) pocztówkÄ™" /> - <radio_item name="texture" label="ZaÅ‚aduj do szafy ([AMOUNT]L$)" /> - <radio_item name="local" label="Zapisz na dysk" /> + <radio_item label="Email" name="postcard"/> + <radio_item label="ZaÅ‚aduj do Szafy (L$[AMOUNT])" name="texture"/> + <radio_item label="Zapisz na dysk" name="local"/> </radio_group> <text name="file_size_label"> - Rozmiar pliku: [SIZE] KB + [SIZE] KB </text> - <button label="OdÅ›wież ZdjÄ™cie" name="new_snapshot_btn"/> + <button label="OdÅ›wież zdjÄ™cie" name="new_snapshot_btn"/> <button label="WyÅ›lij" name="send_btn"/> <button label="ZaÅ‚aduj (L$[AMOUNT])" name="upload_btn"/> <flyout_button label="Zapisz" name="save_btn" tool_tip="Zapisz zdjÄ™cie na dysk"> - <flyout_button.item name="save_item" label="Zapisz"/> - <flyout_button.item name="saveas_item" label="Zapisz Jako..."/> + <flyout_button.item label="Zapisz" name="save_item"/> + <flyout_button.item label="Zapisz jako..." name="saveas_item"/> </flyout_button> <button label="Anuluj" name="discard_btn"/> - <button label="WiÄ™cej >>" name="more_btn" tool_tip="Ustawienia Zaawansowane"/> - <button label="<< Mniej" name="less_btn" tool_tip="Ustawienia Zaawansowane"/> + <button label="WiÄ™cej" name="more_btn" tool_tip="Zaawansowane"/> + <button label="Mniej" name="less_btn" tool_tip="Zaawansowane"/> <text name="type_label2"> Wymiar </text> @@ -28,45 +28,45 @@ Format </text> <combo_box label="Rozdzielczość" name="postcard_size_combo"> - <combo_box.item name="CurrentWindow" label="Obecne Okno" /> - <combo_box.item name="640x480" label="640x480" /> - <combo_box.item name="800x600" label="800x600" /> - <combo_box.item name="1024x768" label="1024x768" /> - <combo_box.item name="Custom" label="Wybierz" /> + <combo_box.item label="Obecne Okno" name="CurrentWindow"/> + <combo_box.item label="640x480" name="640x480"/> + <combo_box.item label="800x600" name="800x600"/> + <combo_box.item label="1024x768" name="1024x768"/> + <combo_box.item label="Wybierz" name="Custom"/> </combo_box> <combo_box label="Rozdzielczość" name="texture_size_combo"> - <combo_box.item name="CurrentWindow" label="Obecne Okno" /> - <combo_box.item name="Small(128x128)" label="MaÅ‚y (128x128)" /> - <combo_box.item name="Medium(256x256)" label="Åšredni (256x256)" /> - <combo_box.item name="Large(512x512)" label="Duży (512x512)" /> - <combo_box.item name="Custom" label="Wybierz" /> + <combo_box.item label="Obecne Okno" name="CurrentWindow"/> + <combo_box.item label="MaÅ‚y (128x128)" name="Small(128x128)"/> + <combo_box.item label="Åšredni (256x256)" name="Medium(256x256)"/> + <combo_box.item label="Duży (512x512)" name="Large(512x512)"/> + <combo_box.item label="Wybierz" name="Custom"/> </combo_box> <combo_box label="Rozdzielczość" name="local_size_combo"> - <combo_box.item name="CurrentWindow" label="Obecne Okno" /> - <combo_box.item name="320x240" label="320x240" /> - <combo_box.item name="640x480" label="640x480" /> - <combo_box.item name="800x600" label="800x600" /> - <combo_box.item name="1024x768" label="1024x768" /> - <combo_box.item name="1280x1024" label="1280x1024" /> - <combo_box.item name="1600x1200" label="1600x1200" /> - <combo_box.item name="Custom" label="Wybierz" /> + <combo_box.item label="Obecne Okno" name="CurrentWindow"/> + <combo_box.item label="320x240" name="320x240"/> + <combo_box.item label="640x480" name="640x480"/> + <combo_box.item label="800x600" name="800x600"/> + <combo_box.item label="1024x768" name="1024x768"/> + <combo_box.item label="1280x1024" name="1280x1024"/> + <combo_box.item label="1600x1200" name="1600x1200"/> + <combo_box.item label="Wybierz" name="Custom"/> </combo_box> <combo_box label="Format" name="local_format_combo"> - <combo_box.item name="PNG" label="PNG" /> - <combo_box.item name="JPEG" label="JPEG" /> - <combo_box.item name="BMP" label="BMP" /> + <combo_box.item label="PNG" name="PNG"/> + <combo_box.item label="JPEG" name="JPEG"/> + <combo_box.item label="BMP" name="BMP"/> </combo_box> <spinner label="Szer." name="snapshot_width"/> <spinner label="Wys." name="snapshot_height"/> - <check_box label="Ograniczone Proporcje" name="keep_aspect_check"/> - <slider label="Jakość ZdjÄ™cia" name="image_quality_slider"/> + <check_box label="Ograniczone proporcje" name="keep_aspect_check"/> + <slider label="Jakość zdjÄ™cia" name="image_quality_slider"/> <text name="layer_type_label"> Zapisz: </text> <combo_box label="Warstwy Obrazu" name="layer_types"> - <combo_box.item name="Colors" label="Kolory" /> - <combo_box.item name="Depth" label="Głębokość" /> - <combo_box.item name="ObjectMattes" label="Obiekty Åšlepe" /> + <combo_box.item label="Kolory" name="Colors"/> + <combo_box.item label="Głębokość" name="Depth"/> + <combo_box.item label="Obiekty Å›lepe" name="ObjectMattes"/> </combo_box> <check_box label="Pokaż interfejs na zdjÄ™ciu" name="ui_check"/> <check_box label="Pokaż obiekty HUD na zdjÄ™ciu" name="hud_check"/> diff --git a/indra/newview/skins/default/xui/pl/floater_sound_preview.xml b/indra/newview/skins/default/xui/pl/floater_sound_preview.xml index 0826508fd6..ac041dff6a 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_sound_preview.xml +++ b/indra/newview/skins/default/xui/pl/floater_sound_preview.xml @@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="Sound Preview" title="DŹWIĘK.WAV"> <text name="name_label"> Opis: @@ -6,6 +6,6 @@ <text name="description_label"> Opis: </text> - <button label="Anuluj" label_selected="Anuluj" name="cancel_btn" /> - <button label="ZaÅ‚aduj (L$[AMOUNT])" label_selected="ZaÅ‚aduj (L$[AMOUNT])" name="ok_btn" /> + <button label="Anuluj" label_selected="Anuluj" name="cancel_btn"/> + <button label="ZaÅ‚aduj ([AMOUNT]L$)" label_selected="ZaÅ‚aduj ([AMOUNT]L$)" name="ok_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/pl/floater_stats.xml b/indra/newview/skins/default/xui/pl/floater_stats.xml index acd3df0585..ee5fba4d63 100644 --- a/indra/newview/skins/default/xui/pl/floater_stats.xml +++ b/indra/newview/skins/default/xui/pl/floater_stats.xml @@ -3,17 +3,17 @@ <scroll_container name="statistics_scroll"> <container_view name="statistics_view"> <stat_view label="Podstawowe" name="basic"> - <stat_bar label="Ilość Obrazów/Sec (FPS)" name="fps"/> + <stat_bar label="Ilość obrazów/sek (FPS)" name="fps"/> <stat_bar label="Przepustowość" name="bandwidth"/> - <stat_bar label="Stracone Pakiety" name="packet_loss"/> - <stat_bar label="Ping Sim" name="ping"/> + <stat_bar label="Stracone pakiety" name="packet_loss"/> + <stat_bar label="Ping sim" name="ping"/> </stat_view> <stat_view label="Zaawansowane" name="advanced"> <stat_view label="Renderuj" name="render"> <stat_bar label="KTris Drawn" name="ktrisframe"/> <stat_bar label="KTris Drawn" name="ktrissec"/> - <stat_bar label="Wszystkie Obiekty" name="objs"/> - <stat_bar label="Nowe Obiekty" name="newobjs"/> + <stat_bar label="Wszystkie obiekty" name="objs"/> + <stat_bar label="Nowe obiekty" name="newobjs"/> </stat_view> <stat_view label="Tekstura" name="texture"> <stat_bar label="Suma" name="numimagesstat"/> @@ -24,8 +24,8 @@ <stat_bar label="Bound Mem" name="glboundmemstat"/> </stat_view> <stat_view label="Sieć" name="network"> - <stat_bar label="Pakiety WewnÄ™trzne" name="packetsinstat"/> - <stat_bar label="Pakiety ZewnÄ™trzne" name="packetsoutstat"/> + <stat_bar label="Pakiety wewnÄ™trzne" name="packetsinstat"/> + <stat_bar label="Pakiety zewnÄ™trzne" name="packetsoutstat"/> <stat_bar label="Obiekty" name="objectkbitstat"/> <stat_bar label="Tesktura" name="texturekbitstat"/> <stat_bar label="Asset" name="assetkbitstat"/> @@ -40,30 +40,30 @@ <stat_bar label="Ilość Obrazów/Sec na Symulatorze (Sim FPS)" name="simfps"/> <stat_bar label="Fizyka Obrazów/Sec" name="simphysicsfps"/> <stat_view label="Szczegóły Fizyki" name="physicsdetail"> - <stat_bar label="Pinned Objects" name="physicspinnedtasks"/> + <stat_bar label="Pinned objects" name="physicspinnedtasks"/> <stat_bar label="Niskie LOD Obiektów" name="physicslodtasks"/> - <stat_bar label="Alokacja PamiÄ™ci" name="physicsmemoryallocated"/> - <stat_bar label="Aktualizacja Agentów/Sec" name="simagentups"/> - <stat_bar label="Główni Agenci" name="simmainagents"/> - <stat_bar label="Child Agents" name="simchildagents"/> + <stat_bar label="Alokacja pamiÄ™ci" name="physicsmemoryallocated"/> + <stat_bar label="Aktualizacja agentów/Sek" name="simagentups"/> + <stat_bar label="Główni agenci" name="simmainagents"/> + <stat_bar label="Child agents" name="simchildagents"/> <stat_bar label="Obiekty" name="simobjects"/> - <stat_bar label="Aktywne Obiekty" name="simactiveobjects"/> - <stat_bar label="Aktywne Skrypty" name="simactivescripts"/> - <stat_bar label="Wydarzenie Skryptowe" name="simscripteps"/> - <stat_bar label="Pakiety WewnÄ™trzne" name="siminpps"/> - <stat_bar label="Pakiety ZewnÄ™trzne" name="simoutpps"/> - <stat_bar label="Oczekiwane na Pobranie" name="simpendingdownloads"/> - <stat_bar label="Oczekiwane na ZaÅ‚adowanie" name="simpendinguploads"/> - <stat_bar label="Wszystkie Niepotwierdzone Bity" name="simtotalunackedbytes"/> + <stat_bar label="Aktywne obiekty" name="simactiveobjects"/> + <stat_bar label="Aktywne skrypty" name="simactivescripts"/> + <stat_bar label="Wydarzenie skryptowe" name="simscripteps"/> + <stat_bar label="Pakiety wewnÄ™trzne" name="siminpps"/> + <stat_bar label="Pakiety zewnÄ™trzne" name="simoutpps"/> + <stat_bar label="Oczekiwane na pobranie" name="simpendingdownloads"/> + <stat_bar label="Oczekiwane na zaÅ‚adowanie" name="simpendinguploads"/> + <stat_bar label="Wszystkie niepotwierdzone bity" name="simtotalunackedbytes"/> </stat_view> <stat_view label="Czas (ms)" name="simperf"> - <stat_bar label="CaÅ‚kowity Czas Obrazu" name="simframemsec"/> - <stat_bar label="Czas Sieciowy" name="simnetmsec"/> - <stat_bar label="Czas Fizyki" name="simsimphysicsmsec"/> - <stat_bar label="Czas Symulatora" name="simsimothermsec"/> - <stat_bar label="Czas Agenta" name="simagentmsec"/> - <stat_bar label="Czas Obrazu" name="simimagesmsec"/> - <stat_bar label="Czas Skryptu" name="simscriptmsec"/> + <stat_bar label="CaÅ‚kowity czas obrazu" name="simframemsec"/> + <stat_bar label="Czas sieciowy" name="simnetmsec"/> + <stat_bar label="Czas fizyki" name="simsimphysicsmsec"/> + <stat_bar label="Czas symulatora" name="simsimothermsec"/> + <stat_bar label="Czas agenta" name="simagentmsec"/> + <stat_bar label="Czas obrazu" name="simimagesmsec"/> + <stat_bar label="Czas skryptu" name="simscriptmsec"/> </stat_view> </stat_view> </container_view> diff --git a/indra/newview/skins/default/xui/pl/floater_sys_well.xml b/indra/newview/skins/default/xui/pl/floater_sys_well.xml new file mode 100644 index 0000000000..e6c73af4f3 --- /dev/null +++ b/indra/newview/skins/default/xui/pl/floater_sys_well.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="sys_well_window" title="ZAWIADOMIENIA"> + <string name="title_im_well_window"> + ROZMOWY + </string> + <string name="title_notification_well_window"> + ZAWIADOMIENIA + </string> +</floater> diff --git a/indra/newview/skins/default/xui/pl/floater_telehub.xml b/indra/newview/skins/default/xui/pl/floater_telehub.xml index 9f564452a9..32cc08810d 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_telehub.xml +++ b/indra/newview/skins/default/xui/pl/floater_telehub.xml @@ -1,5 +1,5 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="telehub" title="OBSÅUGA TELEPORTERA" min_height="300" height="300" > +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater height="300" min_height="300" name="telehub" title="TELPORTER"> <text name="status_text_connected" width="250"> Teleporter połączony z obiektem [OBJECT] </text> @@ -12,20 +12,17 @@ <text name="help_text_not_connected"> Wybierz obiekt i kliknij Połącz z teleporterem </text> - <button label="Połącz z teleporterem" name="connect_btn" width="132" /> - <button label="Rozłącz" name="disconnect_btn" left="152" width="88"/> + <button label="Połącz z teleporterem" name="connect_btn" width="132"/> + <button label="Rozłącz" left="152" name="disconnect_btn" width="88"/> <text name="spawn_points_text" width="250"> - Punkty SkÅ‚adowe (pozycje - nie obiekty!): + Punkty skÅ‚adowe (pozycje - nie obiekty!): </text> - <button label="Dodaj Punkt" name="add_spawn_point_btn" /> - <button label="UsuÅ„ Punkt" name="remove_spawn_point_btn" /> + <button label="Dodaj punkt" name="add_spawn_point_btn"/> + <button label="UsuÅ„ punkt" name="remove_spawn_point_btn"/> <text name="spawn_point_help"> - Wybierz obiekt i wybierz Dodaj by sprecyzować -pozycjÄ™. Wówczas możesz przesunąć lub -usunąć obiekt. Pozycje sÄ… relatywne do części -centralnej teleportera. - -Wybierz obiekt z listy by zobaczyć jego pozycjÄ™ -w Å›wiecie. + Wybierz obiekt i wybierz "Dodaj" by sprecyzować pozycjÄ™. +Możesz przesunąć lub usunąć obiekt. +Pozycje sÄ… relatywne do części centralnej teleportera. +Wybierz obiekt z listy by zobaczyć jego pozycjÄ™ w Å›wiecie. </text> </floater> diff --git a/indra/newview/skins/default/xui/pl/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/pl/floater_texture_ctrl.xml index 48366e2b64..52c0cb8a93 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_texture_ctrl.xml +++ b/indra/newview/skins/default/xui/pl/floater_texture_ctrl.xml @@ -1,23 +1,23 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="texture picker" title="WYBÓR TEKSTURY"> +<floater name="texture picker" title="ULUBIONE: TEKSTURA"> <string name="choose_picture"> Kliknij by wybrać obraz </string> <text name="Multiple"> - Wiele + Wiele tekstur </text> <text name="unknown"> - Wymiary: [DIMENSIONS] + Rozmiar: [DIMENSIONS] </text> <button label="DomyÅ›lna" label_selected="DomyÅ›lna" name="Default"/> <button label="Å»adna" label_selected="Å»adna" name="None"/> <button label="Pusta" label_selected="Pusta" name="Blank"/> - <check_box label="Pokaż Foldery" name="show_folders_check"/> - <search_editor label="Wpisz nazwÄ™ tutaj by wyszukać" name="inventory search editor"/> - <check_box label="Zastosuj od razu" name="apply_immediate_check"/> + <check_box label="Pokaż foldery" name="show_folders_check"/> + <search_editor label="Filtruj tektury" name="inventory search editor"/> + <check_box label="Zastosuj teraz" name="apply_immediate_check"/> <button label="" label_selected="" name="Pipette"/> <button label="Anuluj" label_selected="Anuluj" name="Cancel"/> - <button label="Wybierz" label_selected="Wybierz" name="Select"/> + <button label="OK" label_selected="OK" name="Select"/> <string name="pick title"> Wybór: </string> diff --git a/indra/newview/skins/default/xui/pl/floater_tools.xml b/indra/newview/skins/default/xui/pl/floater_tools.xml index e898c283c5..5b4f99e9d1 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_tools.xml +++ b/indra/newview/skins/default/xui/pl/floater_tools.xml @@ -1,45 +1,84 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="toolbox floater" title="" short_title="BUDUJ"> +<floater name="toolbox floater" short_title="BUDUJ" title=""> + <floater.string name="status_rotate"> + PrzeciÄ…gaj kolorowe pierÅ›cienie żeby obracać obiekt + </floater.string> + <floater.string name="status_scale"> + Kliknij i przeciÄ…gaj żeby rozciÄ…gnąć wybranÄ… stronÄ™ + </floater.string> + <floater.string name="status_move"> + Wybierz opcjÄ™: + </floater.string> + <floater.string name="status_modifyland"> + Kliknij i przytrzymaj żeby modyfikować teren + </floater.string> + <floater.string name="status_camera"> + Kliknij i przeciÄ…gnij żeby zmienić widok + </floater.string> + <floater.string name="status_grab"> + PrzeciÄ…gnij by przesunąć, wybierz Ctrl by podnieść, wybierz Ctrl-Shift by obrócić + </floater.string> + <floater.string name="status_place"> + Kliknij in-world by zacząć budować + </floater.string> + <floater.string name="status_selectland"> + Edytowanie Terenu: + </floater.string> + <floater.string name="grid_screen_text"> + Widok + </floater.string> + <floater.string name="grid_local_text"> + Lokalna + </floater.string> + <floater.string name="grid_world_text"> + Åšwiat + </floater.string> + <floater.string name="grid_reference_text"> + WzglÄ™da + </floater.string> + <floater.string name="grid_attachment_text"> + Załączniki + </floater.string> <button label="" label_selected="" name="button focus" tool_tip="Zbliżenie"/> <button label="" label_selected="" name="button move" tool_tip="PrzesuniÄ™cie"/> <button label="" label_selected="" name="button edit" tool_tip="Edycja"/> <button label="" label_selected="" name="button create" tool_tip="Stwórz"/> <button label="" label_selected="" name="button land" tool_tip="Teren"/> + <text name="text status"> + PrzeciÄ…gnij żeby przenieść, shift-przeciÄ…gnij żeby skopiować + </text> <radio_group name="focus_radio_group"> <radio_item label="Zbliżenie" name="radio zoom"/> <radio_item label="Obracanie (Ctrl)" name="radio orbit"/> - <radio_item label="PrzesuniÄ™cie (Ctrl-Shift)" name="radio pan"/> + <radio_item label="PrzesuniÄ™cie (Ctrl+Shift)" name="radio pan"/> </radio_group> <radio_group name="move_radio_group"> <radio_item label="PrzesuÅ„" name="radio move"/> <radio_item label="PodnieÅ› (Ctrl)" name="radio lift"/> - <radio_item label="Obróć (Ctrl-Shift)" name="radio spin"/> + <radio_item label="Obracanie (Ctrl+Shift)" name="radio spin"/> </radio_group> <radio_group name="edit_radio_group"> - <radio_item label="Pozycja" name="radio position"/> + <radio_item label="PrzesuÅ„" name="radio position"/> <radio_item label="Obróć (Ctrl)" name="radio rotate"/> - <radio_item label="RozciÄ…gnij (Ctrl-Shift)" name="radio stretch"/> - <radio_item label="Wybierz TeksturÄ™" name="radio select face"/> + <radio_item label="RozciÄ…gnij (Ctrl+Shift)" name="radio stretch"/> + <radio_item label="Wybierz teksturÄ™" name="radio select face"/> </radio_group> - <check_box label="Edytuj Połączone Części" name="checkbox edit linked parts"/> - <text name="text ruler mode"> - Linijka: + <check_box label="Edytuj połączone części" name="checkbox edit linked parts"/> + <text name="RenderingCost" tool_tip="Pokazuje koszt renderowania tego obiektu"> + þ: [COUNT] </text> - <combo_box name="combobox grid mode"> - <combo_box.item name="World" label="Åšwiat" - /> - <combo_box.item name="Local" label="Lokalna" - /> - <combo_box.item name="Reference" label="WzglÄ™dna" - /> - </combo_box> - <check_box label="RozciÄ…gnij 2 Strony" name="checkbox uniform"/> - <check_box label="RozciÄ…gnij TeksturÄ™" name="checkbox stretch textures"/> - <check_box label="Użyj Siatki" name="checkbox snap to grid"/> - <button label="Opcje..." label_selected="Opcje..." name="Options..."/> - <text name="text status"> - PrzeciÄ…gnij żeby przenieść, shift-przeciÄ…gnij żeby skopiować + <check_box name="checkbox uniform"/> + <text name="checkbox uniform label"> + RozciÄ…gnij 2 Strony </text> + <check_box initial_value="true" label="RozciÄ…gnij TeksturÄ™" name="checkbox stretch textures"/> + <check_box initial_value="true" label="Użyj siatki" name="checkbox snap to grid"/> + <combo_box name="combobox grid mode" tool_tip="Wybierz rodzaj linijki siatki dla pozycjonowania obiektu"> + <combo_box.item label="Åšwiat" name="World"/> + <combo_box.item label="Lokalna" name="Local"/> + <combo_box.item label="WzglÄ™dna" name="Reference"/> + </combo_box> + <button label="Opcje..." label_selected="Opcje..." name="Options..." tool_tip="WiÄ™cej opcji siatki"/> <button label="" label_selected="" name="ToolCube" tool_tip="SzeÅ›cian"/> <button label="" label_selected="" name="ToolPrism" tool_tip="GraniastosÅ‚up"/> <button label="" label_selected="" name="ToolPyramid" tool_tip="OstrosÅ‚up"/> @@ -57,7 +96,7 @@ <button label="" label_selected="" name="ToolGrass" tool_tip="Trawa"/> <check_box label="Trzymaj zaznaczone" name="checkbox sticky"/> <check_box label="Kopiuj zaznaczone" name="checkbox copy selection"/> - <check_box label="Åšrodek" name="checkbox copy centers"/> + <check_box initial_value="true" label="Åšrodek" name="checkbox copy centers"/> <check_box label="Obróć" name="checkbox copy rotates"/> <radio_group name="land_radio_group"> <radio_item label="Zaznaczanie" name="radio select land"/> @@ -68,7 +107,6 @@ <radio_item label="FaÅ‚dowanie" name="radio noise"/> <radio_item label="Cofnij modyfikacjÄ™" name="radio revert"/> </radio_group> - <button label="Zastosuj" label_selected="Zastosuj" name="button apply to selection" tool_tip="Modyfikuj zaznaczony teren"/> <text name="Bulldozer:"> Burzenie: </text> @@ -78,15 +116,52 @@ <text name="Strength:"> SiÅ‚a </text> - <volume_slider name="slider force"/> + <slider_bar initial_value="0.00" name="slider force"/> + <button label="Zastosuj" label_selected="Zastosuj" name="button apply to selection" tool_tip="Modyfikuj zaznaczony teren"/> <text name="obj_count"> - Wybrane obiekty: [COUNT] + Obiekty: [COUNT] </text> <text name="prim_count"> - primy: [COUNT] + Primy: [COUNT] </text> <tab_container name="Object Info Tabs"> <panel label="Ogólne" name="General"> + <panel.string name="text deed continued"> + Przypisz + </panel.string> + <panel.string name="text deed"> + Przypisz + </panel.string> + <panel.string name="text modify info 1"> + Możesz modyfikować ten obiekt + </panel.string> + <panel.string name="text modify info 2"> + Możesz modyfikować te obiekty + </panel.string> + <panel.string name="text modify info 3"> + Nie możesz modyfikować tego obiektu + </panel.string> + <panel.string name="text modify info 4"> + Nie możesz modyfikować tych obiektów + </panel.string> + <panel.string name="text modify warning"> + Musisz zaznaczyć caÅ‚y obiekt by ustawić prawa. + </panel.string> + <panel.string name="Cost Default"> + Cena: L$ + </panel.string> + <panel.string name="Cost Total"> + Cena caÅ‚kowita: L$ + </panel.string> + <panel.string name="Cost Per Unit"> + Cena za: L$ + </panel.string> + <panel.string name="Cost Mixed"> + Cena mieszana + </panel.string> + <panel.string name="Sale Mixed"> + Sprzedaż mieszana + </panel.string> <text name="Name:"> Nazwa: </text> @@ -101,133 +176,74 @@ <text name="Creator Name"> Thrax Linden </text> - <button label="Profil..." label_selected="Profil..." name="button creator profile"/> <text name="Owner:"> WÅ‚aÅ›ciciel: </text> <text name="Owner Name"> Thrax Linden </text> - <button label="Profil..." label_selected="Profil..." name="button owner profile"/> <text name="Group:"> Grupa: </text> - <text name="Group Name Proxy"> - The Lindens - </text> - <button label="Ustaw..." label_selected="Ustaw..." name="button set group"/> - <text name="Permissions:"> - Prawa: - </text> - - <check_box label="UdostÄ™pnij grupie" name="checkbox share with group" tool_tip="Pozwól czÅ‚onkom grupy przesuwać, modyfikować, kopiować i usuwać."/> - <string name="text deed continued"> - Przypisz... - </string> - <string name="text deed"> - Przypisz - </string> - <button label="Przypisz..." label_selected="Przypisz..." name="button deed" tool_tip=""/> - <check_box label="Pozwól przesuwać każdemu" name="checkbox allow everyone move"/> - <check_box label="Pozwól kopiować każdemu" name="checkbox allow everyone copy"/> - <check_box label="Pokaż w wyszukiwarce" name="search_check" tool_tip="UdostÄ™pnij wyÅ›wietlanie siÄ™ tego przedmiotu w wynikach wyszukiwania"/> - <check_box label="Na Sprzedaż" name="checkbox for sale"/> - <text name="Cost"> - Cena: L$ + <button label="Ustaw..." label_selected="Ustaw..." name="button set group" tool_tip="Wybierz grupÄ™, która uzyska dostÄ™p do praw obiektu"/> + <name_box initial_value="Åadowanie..." name="Group Name Proxy"/> + <button label="Przypisz" label_selected="Przypisz" name="button deed" tool_tip="Przypisanie oddaje prawa nastÄ™pnemu wÅ‚aÅ›cicielowi. Obiekty posiadane przez grupÄ™ mogÄ… zostać przypisane przez oficera grupy."/> + <check_box label="UdostÄ™pnij" name="checkbox share with group" tool_tip="Pozwól czÅ‚onkom grupy na dzielenie praw do modyfikacji tego obiektu. Musisz przypisać obiekt aby uaktywnić ograniczenia dla ról."/> + <text name="label click action"> + Kliknij: </text> - <line_editor name="Edit Cost"/> + <combo_box name="clickaction"> + <combo_box.item label="Dotknij (domyÅ›lne)" name="Touch/grab(default)"/> + <combo_box.item label="UsiÄ…dź na obiekcie" name="Sitonobject"/> + <combo_box.item label="Kup obiekt" name="Buyobject"/> + <combo_box.item label="ZapÅ‚ać obiektowi" name="Payobject"/> + <combo_box.item label="Otwórz" name="Open"/> + <combo_box.item label="Przybliż" name="Zoom"/> + </combo_box> + <check_box label="Na sprzedaż:" name="checkbox for sale"/> <combo_box name="sale type"> <combo_box.item label="Kopia" name="Copy"/> <combo_box.item label="Zawartość" name="Contents"/> <combo_box.item label="OrginaÅ‚" name="Original"/> </combo_box> - - <text name="label click action"> - Lewe KlikniÄ™cie: - </text> - <combo_box name="clickaction"> - <combo_box.item name="Touch/grab(default)" label="Dotknij (domyÅ›lne)" - /> - <combo_box.item name="Sitonobject" label="UsiÄ…dź na Obiekcie" - /> - <combo_box.item name="Buyobject" label="Kup Obiekt" - /> - <combo_box.item name="Payobject" label="ZapÅ‚ać Obiektowi" - /> - <combo_box.item name="Open" label="Otwórz" - /> - <combo_box.item name="Play" label="Odtwarzaj Media" - /> - <combo_box.item name="Opemmedia" label="Otwrórz Media" - /> - </combo_box> - <panel name="perms_build"> - <text name="perm_modify"> - Nie masz prawda do modyfikacji tego obiektu - </text> - <text name="B:"> - B: - </text> - <text name="O:"> - O: - </text> - <text name="G:"> - G: - </text> - <text name="E:"> - E: - </text> - <text name="N:"> - N: - </text> - <text name="F:"> - F: - </text> - <text name="Next owner can:"> - NastÄ™pny wÅ‚aÅ›ciciel: - </text> - <check_box label="Zmienia" name="checkbox next owner can modify"/> - <check_box label="Kopiuje" name="checkbox next owner can copy"/> - <check_box name="checkbox next owner can transfer"/> - </panel> - <string name="text modify info 1"> - Możesz modyfikować ten obiekt - </string> - <string name="text modify info 2"> - Możesz modyfikować te obiekty - </string> - <string name="text modify info 3"> - Nie możesz modyfikować tego obiektu - </string> - <string name="text modify info 4"> - Nie możesz modyfikować tych obieków - </string> - <string name="text modify warning"> - Musisz zaznaczyć caÅ‚y obiekt by ustawić prawa - </string> - <string name="Cost Default"> - Cena: L$ - </string> - <string name="Cost Total"> - Cena CaÅ‚oÅ›ci: L$ - </string> - <string name="Cost Per Unit"> - Cena Za: L$ - </string> - <string name="Cost Mixed"> - Cena Mieszana - </string> - <string name="Sale Mixed"> - Sprzedaż Mieszana - </string> + <spinner label="Cena: L$" name="Edit Cost"/> + <check_box label="Pokaż w wyszukiwarce" name="search_check" tool_tip="UdostÄ™pnij wyÅ›wietlanie siÄ™ tego przedmiotu w wynikach wyszukiwania"/> + <panel name="perms_build"> + <text name="perm_modify"> + Możesz modyfikować ten obiekt + </text> + <text name="Anyone can:"> + Każdy: + </text> + <check_box label="PrzesuÅ„" name="checkbox allow everyone move"/> + <check_box label="Kopiuj" name="checkbox allow everyone copy"/> + <text name="Next owner can:"> + NastÄ™pny WÅ‚aÅ›ciciel: + </text> + <check_box label="Zmienia" name="checkbox next owner can modify"/> + <check_box label="Kopiuje" name="checkbox next owner can copy"/> + <check_box label="Oddaje/Sprzedaje" name="checkbox next owner can transfer" tool_tip="NastÄ™pny WÅ‚aÅ›ciciel może oddawać lub sprzedawać ten obiekt"/> + <text name="B:"> + B: + </text> + <text name="O:"> + O: + </text> + <text name="G:"> + G: + </text> + <text name="E:"> + E: + </text> + <text name="N:"> + N: + </text> + <text name="F:"> + F: + </text> + </panel> </panel> <panel label="Obiekt" name="Object"> - <text name="select_single"> - Wybierz tylko jeden element by edytować jego parametry - </text> - <text name="edit_object"> - Edytuj parametry obiektu: - </text> <check_box label="Zablokowany" name="checkbox locked" tool_tip="Chroni obiekty przed ich przesuniÄ™ciem lub usuniÄ™ciem. Pomocne także w czasie budowania by uniknÄ…c niepotrzebnych edycji."/> <check_box label="Fizyczny" name="Physical Checkbox Ctrl" tool_tip="Umożliwia obcność siÅ‚ grawitacyjnych i oddziaÅ‚ywania pomiÄ™dzy obiektami."/> <check_box label="Tymczasowy" name="Temporary Checkbox Ctrl" tool_tip="Umożliwia usuniÄ™cie obiektu po 1 minucie od jego stworzenia."/> @@ -250,48 +266,27 @@ <spinner label="X" name="Rot X"/> <spinner label="Y" name="Rot Y"/> <spinner label="Z" name="Rot Z"/> - <text name="label material"> - MateriaÅ‚ - </text> - <combo_box name="material"> - <combo_box.item name="Stone" label="KamieÅ„" - /> - <combo_box.item name="Metal" label="Metal" - /> - <combo_box.item name="Glass" label="SzkÅ‚o" - /> - <combo_box.item name="Wood" label="Drewno" - /> - <combo_box.item name="Flesh" label="CiaÅ‚o" - /> - <combo_box.item name="Plastic" label="Plastik" - /> - <combo_box.item name="Rubber" label="Guma" - /> - </combo_box> - <text name="label basetype"> - Rodzaj Bloku Budowalnego - </text> <combo_box name="comboBaseType"> - <combo_box.item name="Box" label="Klocek" - /> - <combo_box.item name="Cylinder" label="Walec" - /> - <combo_box.item name="Prism" label="GraniastosÅ‚up" - /> - <combo_box.item name="Sphere" label="Kula" - /> - <combo_box.item name="Torus" label="Torus" - /> - <combo_box.item name="Tube" label="Rura" - /> - <combo_box.item name="Ring" label="PierÅ›cieÅ„" - /> - <combo_box.item name="Sculpted" label="Skulpty" - /> + <combo_box.item label="Klocek" name="Box"/> + <combo_box.item label="Walec" name="Cylinder"/> + <combo_box.item label="GraniastosÅ‚up" name="Prism"/> + <combo_box.item label="Kula" name="Sphere"/> + <combo_box.item label="Torus" name="Torus"/> + <combo_box.item label="Rura" name="Tube"/> + <combo_box.item label="PierÅ›cieÅ„" name="Ring"/> + <combo_box.item label="Skulpty" name="Sculpted"/> + </combo_box> + <combo_box name="material"> + <combo_box.item label="KamieÅ„" name="Stone"/> + <combo_box.item label="Metal" name="Metal"/> + <combo_box.item label="SzkÅ‚o" name="Glass"/> + <combo_box.item label="Drewno" name="Wood"/> + <combo_box.item label="CiaÅ‚o" name="Flesh"/> + <combo_box.item label="Plastik" name="Plastic"/> + <combo_box.item label="Guma" name="Rubber"/> </combo_box> <text name="text cut"> - Wykrój poczÄ…tek i koniec + Wykrój (poczÄ…tek/koniec) </text> <spinner label="P" name="cut begin"/> <spinner label="K" name="cut end"/> @@ -307,17 +302,13 @@ KsztaÅ‚t Wydrążenia </text> <combo_box name="hole"> - <combo_box.item name="Default" label="DomyÅ›lny" - /> - <combo_box.item name="Circle" label="KoÅ‚o" - /> - <combo_box.item name="Square" label="Kwadrat" - /> - <combo_box.item name="Triangle" label="TrójkÄ…t" - /> + <combo_box.item label="DomyÅ›lny" name="Default"/> + <combo_box.item label="KoÅ‚o" name="Circle"/> + <combo_box.item label="Kwadrat" name="Square"/> + <combo_box.item label="TrójkÄ…t" name="Triangle"/> </combo_box> <text name="text twist"> - SkrÄ™cenie + SkrÄ™cenie (poczÄ…tek/koniec) </text> <spinner label="P" name="Twist Begin"/> <spinner label="K" name="Twist End"/> @@ -325,23 +316,23 @@ Zwężenie </text> <text name="scale_hole"> - Rozmiar Wgłębienia + Rozmiar wgłębienia </text> <spinner label="X" name="Taper Scale X"/> <spinner label="Y" name="Taper Scale Y"/> <text name="text topshear"> - PrzesuniÄ™cie Górne + PrzesuniÄ™cie górne </text> <spinner label="X" name="Shear X"/> <spinner label="Y" name="Shear Y"/> <text name="advanced_cut"> - Wykrojenie Przekroju + Wykrojenie przekroju (poczÄ…tek/koniec) </text> <text name="advanced_dimple"> - PrzesuniÄ™cie Promienia + PrzesuniÄ™cie promienia (poczÄ…tek/koniec) </text> <text name="advanced_slice"> - Przetnij poczÄ…tek i koniec + Przetnij(poczÄ…tek/koniec) </text> <spinner label="P" name="Path Limit Begin"/> <spinner label="K" name="Path Limit End"/> @@ -358,23 +349,18 @@ </text> <spinner name="Radius Offset"/> <spinner name="Revolutions"/> - <texture_picker label="Tekstura Skulptowa" name="sculpt texture control" tool_tip="Click to choose a picture"/> - <check_box label="Odbicie" name="sculpt mirror control" tool_tip="Odwraca skulpt wzdłóż osi X."/> - <check_box label="Åšrodek na zewnÄ…trz" name="sculpt invert control" tool_tip="Odwarca normalne skulptu."/> + <texture_picker label="Tekstura skulptowa" name="sculpt texture control" tool_tip="Click to choose a picture"/> + <check_box label="Odbicie" name="sculpt mirror control" tool_tip="Odwraca skulpt wzdÅ‚uż osi X."/> + <check_box label="Åšrodek na zewnÄ…trz" name="sculpt invert control" tool_tip="Odwraca normalne skulptu."/> <text name="label sculpt type"> - Typ ÅšciÄ™gna + Typ Å›ciÄ™gna </text> <combo_box name="sculpt type control"> - <combo_box.item name="None" label="(żadne)" - /> - <combo_box.item name="Sphere" label="Kula" - /> - <combo_box.item name="Torus" label="Torus" - /> - <combo_box.item name="Plane" label="PÅ‚aczyzna" - /> - <combo_box.item name="Cylinder" label="Walec" - /> + <combo_box.item label="(żadne)" name="None"/> + <combo_box.item label="Kula" name="Sphere"/> + <combo_box.item label="Torus" name="Torus"/> + <combo_box.item label="PÅ‚aszczyzna" name="Plane"/> + <combo_box.item label="Walec" name="Cylinder"/> </combo_box> </panel> <panel label="Atrybuty" name="Features"> @@ -384,7 +370,7 @@ <text name="edit_object"> Edytuj cechy obiektu: </text> - <check_box label="Elastyczność" name="Flexible1D Checkbox Ctrl" tool_tip=""/> + <check_box label="Elastyczność" name="Flexible1D Checkbox Ctrl" tool_tip="Elastyczność wzdÅ‚uż osi Z (tylko po stronie klienta)"/> <spinner label="GÅ‚adkość" name="FlexNumSections"/> <spinner label="Ciężar" name="FlexGravity"/> <spinner label="Drżenie" name="FlexFriction"/> @@ -394,124 +380,99 @@ <spinner label="SiÅ‚a Y" name="FlexForceY"/> <spinner label="SiÅ‚a Z" name="FlexForceZ"/> <check_box label="ÅšwiatÅ‚o" name="Light Checkbox Ctrl" tool_tip="Umożliwia emitajcÄ™ Å›wiatÅ‚a"/> - <text name="label color"> - Kolor - </text> - <color_swatch label="" name="colorswatch" tool_tip="Kliknij by wybrać kolor"/> + <color_swatch label="" name="colorswatch" tool_tip="Kliknij aby wybrać kolor"/> + <texture_picker label="" name="light texture control" tool_tip="Kliknij aby wybrać obraz (efekt wystÄ™puje tylko z aktywowanym opóźnionym renderowaniem)"/> <spinner label="SiÅ‚a" name="Light Intensity"/> + <spinner label="FOV" name="Light FOV"/> <spinner label="PromieÅ„" name="Light Radius"/> + <spinner label="Przybliżenie" name="Light Focus"/> <spinner label="Spadek" name="Light Falloff"/> + <spinner label="Otoczenie/Nastrój" name="Light Ambiance"/> </panel> <panel label="Tekstura" name="Texture"> + <panel.string name="string repeats per meter"> + Powtórzenia / m + </panel.string> + <panel.string name="string repeats per face"> + Powtórzenia + </panel.string> <texture_picker label="Tekstura" name="texture control" tool_tip="Kliknij by wybrać obraz"/> - <color_swatch label="Kolor" name="colorswatch" tool_tip="Kliknij by wybrać kolor"/> - <text name="color trans" left="170" width="99"> + <color_swatch label="Kolor" name="colorswatch" tool_tip="Kliknij aby wybrać kolor"/> + <text left="170" name="color trans" width="99"> Przezroczystość% </text> <spinner left="170" name="ColorTrans"/> - <text name="glow label" left="170"> + <text left="170" name="glow label"> Blask </text> <spinner left="170" name="glow"/> - <check_box label="Jaskrawość" name="checkbox fullbright" left="170"/> + <check_box label="Jaskrawość" left="170" name="checkbox fullbright"/> <text name="tex gen"> Mapowanie </text> <combo_box name="combobox texgen"> - <combo_box.item name="Default" label="DomyÅ›lne" - /> - <combo_box.item name="Planar" label="Planarne" - /> + <combo_box.item label="DomyÅ›lne" name="Default"/> + <combo_box.item label="Planarne" name="Planar"/> </combo_box> <text name="label shininess"> PoÅ‚ysk </text> <combo_box name="combobox shininess"> - <combo_box.item name="None" label="Å»adny" - /> - <combo_box.item name="Low" label="Niski" - /> - <combo_box.item name="Medium" label="Åšredni" - /> - <combo_box.item name="High" label="Wysoki" - /> + <combo_box.item label="Å»adny" name="None"/> + <combo_box.item label="Niski" name="Low"/> + <combo_box.item label="Åšredni" name="Medium"/> + <combo_box.item label="Wysoki" name="High"/> </combo_box> <text name="label bumpiness"> Powierzchnia </text> <combo_box name="combobox bumpiness"> - <combo_box.item name="None" label="Å»adna" - /> - <combo_box.item name="Brightness" label="NajjaÅ›niejsza" - /> - <combo_box.item name="Darkness" label="Najciemniejsza" - /> - <combo_box.item name="woodgrain" label="Drewniano-ziarnista" - /> - <combo_box.item name="bark" label="Kory Drzewa" - /> - <combo_box.item name="bricks" label="CegieÅ‚" - /> - <combo_box.item name="checker" label="Planszy Szachowej" - /> - <combo_box.item name="concrete" label="Betonu" - /> - <combo_box.item name="crustytile" label="PÅ‚ytki/Kafelki" - /> - <combo_box.item name="cutstone" label="Kamienia" - /> - <combo_box.item name="discs" label="Dysku CD" - /> - <combo_box.item name="gravel" label="Å»wiru" - /> - <combo_box.item name="petridish" label="Skamieliny" - /> - <combo_box.item name="siding" label="Brzegu" - /> - <combo_box.item name="stonetile" label="PÅ‚ytki Kamiennej" - /> - <combo_box.item name="stucco" label="Stucco" - /> - <combo_box.item name="suction" label="Suction" - /> - <combo_box.item name="weave" label="Fali" - /> + <combo_box.item label="Å»adna" name="None"/> + <combo_box.item label="NajjaÅ›niejsza" name="Brightness"/> + <combo_box.item label="Najciemniejsza" name="Darkness"/> + <combo_box.item label="Drewniano-ziarnista" name="woodgrain"/> + <combo_box.item label="Kory Drzewa" name="bark"/> + <combo_box.item label="CegieÅ‚" name="bricks"/> + <combo_box.item label="Planszy Szachowej" name="checker"/> + <combo_box.item label="Betonu" name="concrete"/> + <combo_box.item label="PÅ‚ytki/Kafelki" name="crustytile"/> + <combo_box.item label="Kamienia" name="cutstone"/> + <combo_box.item label="Dysku CD" name="discs"/> + <combo_box.item label="Å»wiru" name="gravel"/> + <combo_box.item label="Skamieliny" name="petridish"/> + <combo_box.item label="Brzegu" name="siding"/> + <combo_box.item label="PÅ‚ytki Kamiennej" name="stonetile"/> + <combo_box.item label="Stucco" name="stucco"/> + <combo_box.item label="Suction" name="suction"/> + <combo_box.item label="Fali" name="weave"/> </combo_box> <text name="tex scale"> - Ilość powtórzeÅ„ + Powtórzenia </text> <spinner label="Poziomo (U)" name="TexScaleU"/> <check_box label="Odwróć" name="checkbox flip s"/> <spinner label="Pionowo (V)" name="TexScaleV"/> <check_box label="Odwróć" name="checkbox flip t"/> - <text name="tex rotate"> - Obrót (stopnie) - </text> - <spinner name="TexRot"/> - <string name="string repeats per meter"> - Powtórzenia / m - </string> - <string name="string repeats per face"> - Powtórzenia - </string> - <text name="rpt"> - Powtórzenia / m - </text> - <spinner name="rptctrl"/> + <spinner label="PowtórzeniaËš" name="TexRot"/> + <spinner label="Powtórzenia / metr" name="rptctrl"/> <button label="Zastosuj" label_selected="Zastosuj" name="button apply"/> <text name="tex offset"> - Dopasowanie + Wyrównanie tekstury </text> <spinner label="Poziome (U)" name="TexOffsetU"/> <spinner label="Pionowe (V)" name="TexOffsetV"/> - <text name="textbox autofix"> - Dopasuj TeksturÄ™ Mediów -(najpierw zaÅ‚aduj) - </text> - <button label="Dopasuj" label_selected="Dopasuj" name="button align" left="160"/> + <panel name="Add_Media"> + <text name="media_tex"> + Media + </text> + <button name="add_media" tool_tip="Dodaj media"/> + <button name="delete_media" tool_tip="UsuÅ„ tÄ… teksturÄ™ mediów"/> + <button name="edit_media" tool_tip="Edytuj media"/> + <button label="Dodaj" label_selected="Dopasuj teksturÄ™ mediów" name="button align" tool_tip="Dodaj teksturÄ™ mediów (musi siÄ™ najpierw zaÅ‚adować)"/> + </panel> </panel> <panel label="Treść" name="Contents"> - <button label="Nowy Skrypt" label_selected="Nowy Skrypt" name="button new script"/> + <button label="Nowy skrypt" label_selected="Nowy skrypt" name="button new script"/> <button label="Prawa" name="button permissions"/> </panel> </tab_container> @@ -520,62 +481,29 @@ Informacje o PosiadÅ‚oÅ›ci </text> <text name="label_area_price"> - Cena: L$[PRICE] za [AREA] m + Cena: L$[PRICE] za [AREA] m² </text> <text name="label_area"> - Obszar: [AREA] m + Obszar: [AREA] m² </text> - <button label="O PosiadÅ‚oÅ›ci..." label_selected="O PosiadÅ‚oÅ›ci..." name="button about land"/> - <check_box label="Pokaż WÅ‚aÅ›cicieli" name="checkbox show owners" tool_tip="Pokoloruj posiadÅ‚oÅ›ci zgodnie z przynależnoÅ›ciÄ… do wÅ‚aÅ›ciciela: Zielony = Twoja PosiadÅ‚ość Morski = PosiadÅ‚ość Twojej Grupy Czerwony = PosiadÅ‚oÅ›ci Innych Żółty = Na Sprzedaż Fioletowy = Na AukcjÄ™ Szary = Publiczna"/> - <button label="?" label_selected="?" name="button show owners help" left_delta="120"/> + <button label="O PosiadÅ‚oÅ›ci" label_selected="O PosiadÅ‚oÅ›ci" name="button about land"/> + <check_box label="Pokaż WÅ‚aÅ›cicieli" name="checkbox show owners" tool_tip="Pokoloruj PosiadÅ‚oÅ›ci zgodnie z przynależnoÅ›ciÄ… do WÅ‚aÅ›ciciela: + +Zielony = Twoja PosiadÅ‚ość +Morski = PosiadÅ‚ość Twojej Grupy +Czerwony = PosiadÅ‚oÅ›ci innych +Żółty = Na sprzedaż +Fioletowy = Na aukcjÄ™ +Szary = Publiczna"/> <text name="label_parcel_modify"> Modyfikuj PosiadÅ‚ość </text> <button label="Podziel" label_selected="Podziel" name="button subdivide land"/> <button label="Złącz" label_selected="Złącz" name="button join land"/> <text name="label_parcel_trans"> - Transakcje na posiadÅ‚oÅ›ci + Transakcje na PosiadÅ‚oÅ›ci </text> - <button label="Kup" label_selected="Kup" name="button buy land"/> - <button label="Anuluj" label_selected="Anuluj" name="button abandon land"/> + <button label="Kup PosiadÅ‚ość" label_selected="Kup PosiadÅ‚ość" name="button buy land"/> + <button label="Porzuć PosiadÅ‚ość" label_selected="Porzuć PosiadÅ‚ość" name="button abandon land"/> </panel> - <floater.string name="status_rotate"> - PrzeciÄ…gaj kolorowe pierÅ›cienie żeby obracać obiekt - </floater.string> - <floater.string name="status_scale"> - Kliknij i przeciÄ…gaj żeby rozciÄ…gnąć wybranÄ… stronÄ™ - </floater.string> - <floater.string name="status_move"> - Wybierz opcjÄ™: - </floater.string> - <floater.string name="status_modifyland"> - Kliknij i przytrzymaj żeby modyfikować teren - </floater.string> - <floater.string name="status_camera"> - Kliknij i przeciÄ…gnij żeby zmienić widok - </floater.string> - <floater.string name="status_grab"> - PrzeciÄ…gnij by przesunąć, wybierz Ctrl by podnieść, wybierz Ctrl-Shift by obrócić - </floater.string> - <floater.string name="status_place"> - Kliknij in-world by zacząć budować - </floater.string> - <floater.string name="status_selectland"> - Edytowanie Terenu: - </floater.string> - <floater.string name="grid_screen_text"> - Widok - </floater.string> - <floater.string name="grid_local_text"> - Lokalna - </floater.string> - <floater.string name="grid_world_text"> - Åšwiat - </floater.string> - <floater.string name="grid_reference_text"> - WzglÄ™da - </floater.string> - <floater.string name="grid_attachment_text"> - Załączniki - </floater.string> </floater> diff --git a/indra/newview/skins/default/xui/pl/floater_top_objects.xml b/indra/newview/skins/default/xui/pl/floater_top_objects.xml index e7299b0abb..6afbce7e10 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_top_objects.xml +++ b/indra/newview/skins/default/xui/pl/floater_top_objects.xml @@ -1,55 +1,56 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="top_objects" title="ÅADOWANIE..."> +<floater name="top_objects" title="Główne Obiekty"> + <floater.string name="top_scripts_title"> + Główne skrypty + </floater.string> + <floater.string name="top_scripts_text"> + [COUNT] skryptów dziaÅ‚a w czasie [TIME] ms + </floater.string> + <floater.string name="scripts_score_label"> + Czas + </floater.string> + <floater.string name="scripts_mono_time_label"> + Mono Time + </floater.string> + <floater.string name="top_colliders_title"> + Główne kolizje + </floater.string> + <floater.string name="top_colliders_text"> + [COUNT] obiektów odczuwa dziaÅ‚anie wielu potencjalnych kolizji + </floater.string> + <floater.string name="colliders_score_label"> + Wynik + </floater.string> + <floater.string name="none_descriptor"> + Nieodnalezione + </floater.string> <text name="title_text"> Åadowanie... </text> <scroll_list name="objects_list"> - <column label="Wynik" name="score"/> - <column label="Nazwa" name="name"/> - <column label="WÅ‚aÅ›ciciel" name="owner"/> - <column label="Miejsce" name="location"/> - <column label="Czas" name="time"/> - <column label="Mono Time" name="mono_time"/> + <scroll_list.columns label="Wynik" name="score"/> + <scroll_list.columns label="Nazwa" name="name"/> + <scroll_list.columns label="WÅ‚aÅ›ciciel" name="owner"/> + <scroll_list.columns label="Miejsce" name="location"/> + <scroll_list.columns label="Czas" name="time"/> + <scroll_list.columns label="Mono Time" name="mono_time"/> + <scroll_list.columns label="URL" name="URLs"/> </scroll_list> <text name="id_text"> - ID Obiektu: + ID obiektu: </text> - <button label="Pokaż Emitery" name="show_beacon_btn"/> + <button label="Pokaż emitery" name="show_beacon_btn"/> <text name="obj_name_text"> - Nazwa Obiektu: + Nazwa obiektu: </text> <button label="Filtr" name="filter_object_btn"/> <text name="owner_name_text"> - Owner Name: + WÅ‚aÅ›ciciel: </text> <button label="Filter" name="filter_owner_btn"/> - <button label="Zwróć Wybrane" name="return_selected_btn"/> - <button label="Zwróć Wszystko" name="return_all_btn"/> - <button label="Deaktywuj Wybrane" name="disable_selected_btn"/> - <button label="Deaktywuj Wszystko" name="disable_all_btn"/> <button label="OdÅ›wież" name="refresh_btn"/> - <string name="top_scripts_title"> - Główne Skrypty - </string> - <string name="top_scripts_text"> - [COUNT] skryptów dziaÅ‚a w czasie [TIME] ms - </string> - <string name="scripts_score_label"> - Czas - </string> - <string name="scripts_mono_time_label"> - Mono Time - </string> - <string name="top_colliders_title"> - Główne Kolizje - </string> - <string name="top_colliders_text"> - [COUNT] obiektów odczuwa dziaÅ‚anie wielu potencjalnych kolizji - </string> - <string name="colliders_score_label"> - Wynik - </string> - <string name="none_descriptor"> - Nie odnalezione - </string> + <button label="Zwróć wybrane" name="return_selected_btn"/> + <button label="Zwróć wszystko" name="return_all_btn"/> + <button label="Deaktywuj wybrane" name="disable_selected_btn"/> + <button label="Deaktywuj wszystko" name="disable_all_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/pl/floater_tos.xml b/indra/newview/skins/default/xui/pl/floater_tos.xml index b9a146df22..6f71488347 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_tos.xml +++ b/indra/newview/skins/default/xui/pl/floater_tos.xml @@ -1,11 +1,10 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="modal container" title=""> - <button label="Kontynuuj" label_selected="Kontynuuj" name="Continue" /> - <button label="Anuluj" label_selected="Anuluj" name="Cancel" /> - <check_box label="Zgadzam siÄ™ na Warunki Serwisu (Terms of Service)" name="agree_chk" /> + <button label="Kontynuuj" label_selected="Kontynuuj" name="Continue"/> + <button label="Anuluj" label_selected="Anuluj" name="Cancel"/> + <check_box label="Zgadzam siÄ™ na Warunki Serwisu (Terms of Service) i PolitykÄ™ PrywatnoÅ›ci (Privacy Policy)" name="agree_chk"/> <text name="tos_heading"> - ProszÄ™ dokÅ‚adnie przeczytać nastÄ™pujÄ…ce Warunki Serwisu (Terms of Service). Musisz -zaakceptować umowÄ™ żeby kontynuować logowanie do [SECOND_LIFE]. + ProszÄ™ dokÅ‚adnie przeczytać nastÄ™pujÄ…ce Warunki Serwisu (Terms of Service) i PolitykÄ™ PrywatnoÅ›ci (Privacy Policy). Musisz zaakceptować umowÄ™ żeby kontynuować logowanie do [SECOND_LIFE]. </text> <text_editor name="tos_text"> TOS_TEXT diff --git a/indra/newview/skins/default/xui/pl/floater_url_entry.xml b/indra/newview/skins/default/xui/pl/floater_url_entry.xml index fc170d8d1b..fc170d8d1b 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_url_entry.xml +++ b/indra/newview/skins/default/xui/pl/floater_url_entry.xml diff --git a/indra/newview/skins/default/xui/pl/floater_voice_controls.xml b/indra/newview/skins/default/xui/pl/floater_voice_controls.xml new file mode 100644 index 0000000000..6bee3e911c --- /dev/null +++ b/indra/newview/skins/default/xui/pl/floater_voice_controls.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_voice_controls" title="Przełączniki GÅ‚osu"> + <string name="title_nearby"> + ROZMOWY GÅOSOWE W POBLIÅ»U + </string> + <string name="title_group"> + Rozmowa gÅ‚osowa z grupÄ… [GROUP] + </string> + <string name="title_adhoc"> + Konferencja + </string> + <string name="title_peer_2_peer"> + Rozmowa gÅ‚osowa z [NAME] + </string> + <string name="no_one_near"> + Nikt w pobliżu nie ma aktywnych rozmów gÅ‚osowych + </string> + <layout_stack name="my_call_stack"> + <layout_panel name="my_panel"> + <text name="user_text" value="Mój awatar:"/> + </layout_panel> + <layout_panel name="leave_call_btn_panel"> + <button label="ZakoÅ„cz" name="leave_call_btn"/> + </layout_panel> + </layout_stack> +</floater> diff --git a/indra/newview/skins/default/xui/pl/floater_water.xml b/indra/newview/skins/default/xui/pl/floater_water.xml index 7333633c1d..9720dae516 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_water.xml +++ b/indra/newview/skins/default/xui/pl/floater_water.xml @@ -1,32 +1,32 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="Water Floater" title="ZAAWANSOWANY EDYTOR WODY"> <text name="KeyFramePresetsText"> - Ustawienia Wody: + Ustawienia wody: </text> - <button label="Nowe" label_selected="Nowe" name="WaterNewPreset" /> - <button label="Zapisz" label_selected="Zapisz" name="WaterSavePreset" /> - <button label="UsuÅ„" label_selected="UsuÅ„" name="WaterDeletePreset" /> + <button label="Nowe" label_selected="Nowe" name="WaterNewPreset"/> + <button label="Zapisz" label_selected="Zapisz" name="WaterSavePreset"/> + <button label="UsuÅ„" label_selected="UsuÅ„" name="WaterDeletePreset"/> <tab_container name="Water Tabs"> - <panel label="Ustawienia" name="Settings"> + <panel label="USTAWIENIA" name="Settings"> <text name="BHText"> - Kolor Podwodnej MgÅ‚y + Kolor podwodnej mgÅ‚y </text> - <button label="?" name="WaterFogColorHelp" /> - <color_swatch label="" name="WaterFogColor" tool_tip="Kliknij by wybrać kolor" /> + <button label="?" name="WaterFogColorHelp"/> + <color_swatch label="" name="WaterFogColor" tool_tip="Kliknij aby wybrać kolor"/> <text name="WaterFogDensText"> - WykÅ‚adnik GÄ™stoÅ›ci MgÅ‚y + WykÅ‚adnik gÄ™stoÅ›ci mgÅ‚y </text> - <button label="?" name="WaterFogDensityHelp" /> - <slider label="" name="WaterFogDensity" /> + <button label="?" name="WaterFogDensityHelp"/> + <slider label="" name="WaterFogDensity"/> <text name="WaterUnderWaterFogModText"> - Modyfikator MgÅ‚y + Modyfikator mgÅ‚y </text> - <button label="?" name="WaterUnderWaterFogModHelp" /> - <slider label="" name="WaterUnderWaterFogMod" /> + <button label="?" name="WaterUnderWaterFogModHelp"/> + <slider label="" name="WaterUnderWaterFogMod"/> <text name="BDensText"> - Skala ZmarszczeÅ„ + Skala zmarszczeÅ„ </text> - <button label="?" name="WaterNormalScaleHelp" /> + <button label="?" name="WaterNormalScaleHelp"/> <text name="BHText2"> 1 </text> @@ -36,65 +36,65 @@ <text name="BHText4"> 3 </text> - <slider label="" name="WaterNormalScaleX" /> - <slider label="" name="WaterNormalScaleY" /> - <slider label="" name="WaterNormalScaleZ" /> + <slider label="" name="WaterNormalScaleX"/> + <slider label="" name="WaterNormalScaleY"/> + <slider label="" name="WaterNormalScaleZ"/> <text name="HDText"> Skala Fresnela </text> - <button label="?" name="WaterFresnelScaleHelp" /> - <slider label="" name="WaterFresnelScale" /> + <button label="?" name="WaterFresnelScaleHelp"/> + <slider label="" name="WaterFresnelScale"/> <text name="FresnelOffsetText"> PrzesuniÄ™cie Fresnela </text> - <button label="?" name="WaterFresnelOffsetHelp" /> - <slider label="" name="WaterFresnelOffset" /> + <button label="?" name="WaterFresnelOffsetHelp"/> + <slider label="" name="WaterFresnelOffset"/> <text name="DensMultText"> - Górna Refrakcja + Górna refrakcja </text> - <button label="?" name="WaterScaleAboveHelp" /> - <slider label="" name="WaterScaleAbove" /> + <button label="?" name="WaterScaleAboveHelp"/> + <slider label="" name="WaterScaleAbove"/> <text name="WaterScaleBelowText"> - Dolna Refrakcja + Dolna refrakcja </text> - <button label="?" name="WaterScaleBelowHelp" /> - <slider label="" name="WaterScaleBelow" /> + <button label="?" name="WaterScaleBelowHelp"/> + <slider label="" name="WaterScaleBelow"/> <text name="MaxAltText"> - Mnożnik Rozmycia + Mnożnik rozmycia </text> - <button label="?" name="WaterBlurMultiplierHelp" /> - <slider label="" name="WaterBlurMult" /> + <button label="?" name="WaterBlurMultiplierHelp"/> + <slider label="" name="WaterBlurMult"/> </panel> - <panel label="Rysowanie" name="Waves"> + <panel label="OBRAZ" name="Waves"> <text name="BHText"> - Kierunek Dużych Fal + Kierunek dużych fal </text> - <button label="?" name="WaterWave1Help" /> + <button label="?" name="WaterWave1Help"/> <text name="WaterWave1DirXText"> X </text> <text name="WaterWave1DirYText"> Y </text> - <slider label="" name="WaterWave1DirX" /> - <slider label="" name="WaterWave1DirY" /> + <slider label="" name="WaterWave1DirX"/> + <slider label="" name="WaterWave1DirY"/> <text name="BHText2"> - Kierunek MaÅ‚ych Fal + Kierunek maÅ‚ych fal </text> - <button label="?" name="WaterWave2Help" /> + <button label="?" name="WaterWave2Help"/> <text name="WaterWave2DirXText"> X </text> <text name="WaterWave2DirYText"> Y </text> - <slider label="" name="WaterWave2DirX" /> - <slider label="" name="WaterWave2DirY" /> + <slider label="" name="WaterWave2DirX"/> + <slider label="" name="WaterWave2DirY"/> <text name="BHText3"> - Mapa Normalnych + Mapa normalnych </text> - <button label="?" name="WaterNormalMapHelp" /> - <texture_picker label="" name="WaterNormalMap" /> + <button label="?" name="WaterNormalMapHelp"/> + <texture_picker label="" name="WaterNormalMap"/> </panel> </tab_container> <string name="WLDefaultWaterNames"> diff --git a/indra/newview/skins/default/xui/pl/floater_wearable_save_as.xml b/indra/newview/skins/default/xui/pl/floater_wearable_save_as.xml index 2d4582392c..925295102e 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_wearable_save_as.xml +++ b/indra/newview/skins/default/xui/pl/floater_wearable_save_as.xml @@ -1,9 +1,9 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="modal container" title=""> - <button label="Zapisz" label_selected="Zapisz" name="Save" /> - <button label="Anuluj" label_selected="Anuluj" name="Cancel" /> + <button label="Zapisz" label_selected="Zapisz" name="Save"/> + <button label="Anuluj" label_selected="Anuluj" name="Cancel"/> <text name="Save item as:"> - Zachowaj jako: + Zapisz obiekt w mojej Szafie jako: </text> <line_editor name="name ed"> Nowe [DESC] diff --git a/indra/newview/skins/default/xui/pl/floater_whitelist_entry.xml b/indra/newview/skins/default/xui/pl/floater_whitelist_entry.xml new file mode 100644 index 0000000000..4081b8a37e --- /dev/null +++ b/indra/newview/skins/default/xui/pl/floater_whitelist_entry.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="whitelist_entry" title="BIAÅA LISTA"> + <text name="media_label"> + Wprowadź URL lub wzorzec URL dla dodania do listy dozwolonych domen + </text> + <line_editor name="whitelist_entry" tool_tip="Wprowadź URL lub wzorzec URL do BiaÅ‚ej Listy"/> + <button label="OK" name="ok_btn"/> + <button label="Anuluj" name="cancel_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/pl/floater_windlight_options.xml b/indra/newview/skins/default/xui/pl/floater_windlight_options.xml index 86ef9300da..49e523fae8 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_windlight_options.xml +++ b/indra/newview/skins/default/xui/pl/floater_windlight_options.xml @@ -1,19 +1,18 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="WindLight floater" title="ZAAWANSOWANY EDYTOR NIEBA"> <text name="KeyFramePresetsText"> - Ustawienia Nieba: + Ustawienia nieba: </text> - <button label="Nowe" label_selected="Nowe" name="WLNewPreset" /> - <button label="Zapisz" label_selected="Zapisz" name="WLSavePreset" /> - <button label="UsuÅ„" label_selected="UsuÅ„" name="WLDeletePreset" /> - <button label="Edytor Cyklu Dnia" label_selected="Edytor Cyklu Dnia" - name="WLDayCycleMenuButton" /> + <button label="Nowe" label_selected="Nowe" name="WLNewPreset"/> + <button label="Zapisz" label_selected="Zapisz" name="WLSavePreset"/> + <button label="UsuÅ„" label_selected="UsuÅ„" name="WLDeletePreset"/> + <button label="Edytor cyklu dnia" label_selected="Edytor cyklu dnia" name="WLDayCycleMenuButton"/> <tab_container name="WindLight Tabs"> - <panel label="Atmosfera" name="Atmosphere"> + <panel label="ATMOSFERA" name="Atmosphere"> <text name="BHText"> - Horyzont Błękitu + Horyzont błękitu </text> - <button label="?" name="WLBlueHorizonHelp" /> + <button label="?" name="WLBlueHorizonHelp"/> <text name="BHText2"> R </text> @@ -26,19 +25,19 @@ <text name="BHText5"> I </text> - <slider label="" name="WLBlueHorizonR" /> - <slider label="" name="WLBlueHorizonG" /> - <slider label="" name="WLBlueHorizonB" /> - <slider label="" name="WLBlueHorizonI" /> + <slider label="" name="WLBlueHorizonR"/> + <slider label="" name="WLBlueHorizonG"/> + <slider label="" name="WLBlueHorizonB"/> + <slider label="" name="WLBlueHorizonI"/> <text name="BDensText"> - Horyzont Zamglenia + Horyzont zamglenia </text> - <button label="?" name="WLHazeHorizonHelp" /> - <slider label="" name="WLHazeHorizon" /> + <button label="?" name="WLHazeHorizonHelp"/> + <slider label="" name="WLHazeHorizon"/> <text name="BDensText2"> - GÄ™stość Błękitu + GÄ™stość błękitu </text> - <button label="?" name="WLBlueDensityHelp" /> + <button label="?" name="WLBlueDensityHelp"/> <text name="BHText6"> R </text> @@ -51,36 +50,36 @@ <text name="BHText9"> I </text> - <slider label="" name="WLBlueDensityR" /> - <slider label="" name="WLBlueDensityG" /> - <slider label="" name="WLBlueDensityB" /> - <slider label="" name="WLBlueDensityI" /> + <slider label="" name="WLBlueDensityR"/> + <slider label="" name="WLBlueDensityG"/> + <slider label="" name="WLBlueDensityB"/> + <slider label="" name="WLBlueDensityI"/> <text name="HDText"> - GÄ™stość Zamglenia + GÄ™stość zamglenia </text> - <button label="?" name="WLHazeDensityHelp" /> - <slider label="" name="WLHazeDensity" /> + <button label="?" name="WLHazeDensityHelp"/> + <slider label="" name="WLHazeDensity"/> <text name="DensMultText"> - Mnożnik GÄ™soÅ›ci + Mnożnik gÄ™soÅ›ci </text> - <button label="?" name="WLDensityMultHelp" /> - <slider label="" name="WLDensityMult" /> + <button label="?" name="WLDensityMultHelp"/> + <slider label="" name="WLDensityMult"/> <text name="WLDistanceMultText"> - Mnożnik Dystansu + Mnożnik dystansu </text> - <button label="?" name="WLDistanceMultHelp" /> - <slider label="" name="WLDistanceMult" /> + <button label="?" name="WLDistanceMultHelp"/> + <slider label="" name="WLDistanceMult"/> <text name="MaxAltText"> - Max Wysokość + Max wysokość </text> - <button label="?" name="WLMaxAltitudeHelp" /> - <slider label="" name="WLMaxAltitude" /> + <button label="?" name="WLMaxAltitudeHelp"/> + <slider label="" name="WLMaxAltitude"/> </panel> - <panel label="ÅšwiatÅ‚o" name="Lighting"> + <panel label="ÅšWIATÅO" name="Lighting"> <text name="SLCText"> - Kolor SÅ‚oÅ„ca/Księżyca + Kolor sÅ‚oÅ„ca/księżyca </text> - <button label="?" name="WLSunlightColorHelp" /> + <button label="?" name="WLSunlightColorHelp"/> <text name="BHText"> R </text> @@ -93,19 +92,19 @@ <text name="BHText4"> I </text> - <slider label="" name="WLSunlightR" /> - <slider label="" name="WLSunlightG" /> - <slider label="" name="WLSunlightB" /> - <slider label="" name="WLSunlightI" /> + <slider label="" name="WLSunlightR"/> + <slider label="" name="WLSunlightG"/> + <slider label="" name="WLSunlightB"/> + <slider label="" name="WLSunlightI"/> <text name="TODText"> - Pozycja SÅ‚oÅ„ca/Księżyca + Pozycja sÅ‚oÅ„ca/księżyca </text> - <button label="?" name="WLTimeOfDayHelp" /> - <slider label="" name="WLSunAngle" /> + <button label="?" name="WLTimeOfDayHelp"/> + <slider label="" name="WLSunAngle"/> <text name="WLAmbientText"> Otoczenie </text> - <button label="?" name="WLAmbientHelp" /> + <button label="?" name="WLAmbientHelp"/> <text name="BHText5"> R </text> @@ -118,37 +117,37 @@ <text name="BHText8"> I </text> - <slider label="" name="WLAmbientR" /> - <slider label="" name="WLAmbientG" /> - <slider label="" name="WLAmbientB" /> - <slider label="" name="WLAmbientI" /> + <slider label="" name="WLAmbientR"/> + <slider label="" name="WLAmbientG"/> + <slider label="" name="WLAmbientB"/> + <slider label="" name="WLAmbientI"/> <text name="WLEastAngleText"> - Pozycja Wschodu + Pozycja wschodu </text> - <button label="?" name="WLEastAngleHelp" /> - <slider label="" name="WLEastAngle" /> + <button label="?" name="WLEastAngleHelp"/> + <slider label="" name="WLEastAngle"/> <text name="SunGlowText"> - Blask SÅ‚oÅ„ca + Blask sÅ‚oÅ„ca </text> - <button label="?" name="WLSunGlowHelp" /> - <slider label="Ostrość" name="WLGlowB" /> - <slider label="Rozmiar" name="WLGlowR" /> + <button label="?" name="WLSunGlowHelp"/> + <slider label="Ostrość" name="WLGlowB"/> + <slider label="Rozmiar" name="WLGlowR"/> <text name="SceneGammaText"> - Jasność Obrazu + Jasność obrazu </text> - <button label="?" name="WLSceneGammaHelp" /> - <slider label="" name="WLGamma" /> + <button label="?" name="WLSceneGammaHelp"/> + <slider label="" name="WLGamma"/> <text name="WLStarText"> - Blask Gwiazd + Blask gwiazd </text> - <button label="?" name="WLStarBrightnessHelp" /> - <slider label="" name="WLStarAlpha" /> + <button label="?" name="WLStarBrightnessHelp"/> + <slider label="" name="WLStarAlpha"/> </panel> - <panel label="Chmury" name="Clouds"> + <panel label="CHMURY" name="Clouds"> <text name="WLCloudColorText"> - Kolor Chmur + Kolor chmur </text> - <button label="?" name="WLCloudColorHelp" /> + <button label="?" name="WLCloudColorHelp"/> <text name="BHText"> R </text> @@ -161,14 +160,14 @@ <text name="BHText4"> I </text> - <slider label="" name="WLCloudColorR" /> - <slider label="" name="WLCloudColorG" /> - <slider label="" name="WLCloudColorB" /> - <slider label="" name="WLCloudColorI" /> + <slider label="" name="WLCloudColorR"/> + <slider label="" name="WLCloudColorG"/> + <slider label="" name="WLCloudColorB"/> + <slider label="" name="WLCloudColorI"/> <text name="WLCloudColorText2"> Chmury (XY/GÄ™stość) </text> - <button label="?" name="WLCloudDensityHelp" /> + <button label="?" name="WLCloudDensityHelp"/> <text name="BHText5"> X </text> @@ -178,23 +177,23 @@ <text name="BHText7"> G </text> - <slider label="" name="WLCloudX" /> - <slider label="" name="WLCloudY" /> - <slider label="" name="WLCloudDensity" /> + <slider label="" name="WLCloudX"/> + <slider label="" name="WLCloudY"/> + <slider label="" name="WLCloudDensity"/> <text name="WLCloudCoverageText"> - Pokrycie Chmur + Pokrycie chmur </text> - <button label="?" name="WLCloudCoverageHelp" /> - <slider label="" name="WLCloudCoverage" /> + <button label="?" name="WLCloudCoverageHelp"/> + <slider label="" name="WLCloudCoverage"/> <text name="WLCloudScaleText"> - Skala Chmur + Skala chmur </text> - <button label="?" name="WLCloudScaleHelp" /> - <slider label="" name="WLCloudScale" /> + <button label="?" name="WLCloudScaleHelp"/> + <slider label="" name="WLCloudScale"/> <text name="WLCloudDetailText"> - Szczegóły (XY/GÄ™stość) + Szczegóły (XY/gÄ™stość) </text> - <button label="?" name="WLCloudDetailHelp" /> + <button label="?" name="WLCloudDetailHelp"/> <text name="BHText8"> X </text> @@ -204,23 +203,23 @@ <text name="BHText10"> G </text> - <slider label="" name="WLCloudDetailX" /> - <slider label="" name="WLCloudDetailY" /> - <slider label="" name="WLCloudDetailDensity" /> + <slider label="" name="WLCloudDetailX"/> + <slider label="" name="WLCloudDetailY"/> + <slider label="" name="WLCloudDetailDensity"/> <text name="WLCloudScrollXText"> - Przewijanie Chmur X + Przewijanie chmur X </text> - <button label="?" name="WLCloudScrollXHelp" /> - <check_box label="Zablokuj" name="WLCloudLockX" /> - <slider label="" name="WLCloudScrollX" /> + <button label="?" name="WLCloudScrollXHelp"/> + <check_box label="Zablokuj" name="WLCloudLockX"/> + <slider label="" name="WLCloudScrollX"/> <text name="WLCloudScrollYText"> - Przewijanie Chmur Y + Przewijanie chmur Y </text> - <button label="?" name="WLCloudScrollYHelp" /> - <check_box label="Zablokuj" name="WLCloudLockY" /> - <slider label="" name="WLCloudScrollY" /> - <check_box label="Klasyczne Chmury" name="DrawClassicClouds" /> - <button label="?" name="WLClassicCloudsHelp" /> + <button label="?" name="WLCloudScrollYHelp"/> + <check_box label="Zablokuj" name="WLCloudLockY"/> + <slider label="" name="WLCloudScrollY"/> + <check_box label="Klasyczne chmury" name="DrawClassicClouds"/> + <button label="?" name="WLClassicCloudsHelp"/> </panel> </tab_container> <string name="WLDefaultSkyNames"> diff --git a/indra/newview/skins/default/xui/pl/floater_window_size.xml b/indra/newview/skins/default/xui/pl/floater_window_size.xml new file mode 100644 index 0000000000..2a6c257e54 --- /dev/null +++ b/indra/newview/skins/default/xui/pl/floater_window_size.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="window_size" title="WYMIARY OKNA"> + <string name="resolution_format"> + [RES_X] x [RES_Y] + </string> + <text name="windowsize_text"> + Ustaw rozmiar okna: + </text> + <combo_box name="window_size_combo" tool_tip="szerokość x wysokość"> + <combo_box.item label="1000 x 700 (domyÅ›lnie)" name="item0"/> + <combo_box.item label="1024 x 768" name="item1"/> + <combo_box.item label="1280 x 720 (720p)" name="item2"/> + <combo_box.item label="1920 x 1080 (1080p)" name="item3"/> + </combo_box> + <button label="Ustaw" name="set_btn"/> + <button label="Anuluj" name="cancel_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/pl/floater_world_map.xml b/indra/newview/skins/default/xui/pl/floater_world_map.xml index 36e3b0651b..05287ad42a 100755..100644 --- a/indra/newview/skins/default/xui/pl/floater_world_map.xml +++ b/indra/newview/skins/default/xui/pl/floater_world_map.xml @@ -1,59 +1,70 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="worldmap" title="MAPA ÅšWIATA"> - <tab_container name="maptab"> - <panel label="Obiekty" name="objects_mapview"/> - <panel label="Teren" name="terrain_mapview"/> - </tab_container> - <text name="you_label"> - Ty - </text> - <icon left="1058" name="home"/> - <text name="home_label"> - Start - </text> - <text name="auction_label"> - Aukcja - </text> - <text name="land_for_sale_label"> - Na Sprzedaż - </text> - <button width="122" left="1116" label="Teleportuj do Start" label_selected="Teleportuj do Start" name="Go Home" tool_tip="Teleportuj siÄ™ do miejsca startowego"/> - <check_box label="Rezydent" name="people_chk"/> - <check_box label="Infohub" name="infohub_chk"/> - <check_box label="Telehub" name="telehubchk"/> - <check_box label="PosiadÅ‚ość na sprzedaż" name="land_for_sale_chk"/> - <text name="events_label"> - Wydarzenia: - </text> - <check_box label="'PG'" name="event_chk"/> - <check_box label="'Mature'" name="event_mature_chk"/> - <check_box label="'Adult'" name="event_adult_chk"/> - <icon bottom="-196" name="avatar_icon"/> - <combo_box label="DostÄ™pni Znajomi" name="friend combo" tool_tip="Znajomi na mapie"> - <combo_box.item name="item1" label="DostÄ™pni Znajomi" /> - </combo_box> - <combo_box label="Zapisane Miejsca" name="landmark combo" tool_tip="Zapisane miejsca na mapie"> - <combo_box.item name="item1" label="Zapisane Miejsca" /> - </combo_box> - <line_editor label="Szukaj po nazwie regionu" name="location" tool_tip="Wpisz nazwÄ™ regionu"/> - <button label="Szukaj" name="DoSearch" tool_tip="Wyszukiwaie regionu"/> - <text name="search_label"> - Wyniki wyszukiwania: - </text> - <scroll_list name="search_results" bottom_delta="-310" height="304" > - <column label="" name="icon"/> - <column label="" name="sim_name"/> - </scroll_list> - <text name="location_label"> - PoÅ‚ożenie: - </text> - <spinner name="spin x" tool_tip="współrzÄ™dne X na mapie"/> - <spinner name="spin y" tool_tip="współrzÄ™dne Y na mapie"/> - <spinner name="spin z" tool_tip="współrzÄ™dne Z na mapie"/> - <button label="Teleportuj" label_selected="Teleportuj" name="Teleport" tool_tip="Teleportuj do wybranego miejsca"/> - <button label="Pokaż Cel" label_selected="Pokaż Cel" name="Show Destination" tool_tip="Wycentruj miejsce celu na mapie"/> - <button label="Wyczyść" label_selected="Wyczyść" name="Clear" tool_tip="Stop tracking"/> - <button label="Pokaż moje miejsce" label_selected="Pokaż moje miejsce" name="Show My Location" tool_tip="Wycentruj pozcjÄ™ awatara na mapie"/> - <button label="Kopiuj SLurl do schowka" name="copy_slurl" tool_tip="Kopie SLurl obecnego miejsca bÄ™dÄ™ mogÅ‚y zostać użyte na stronie internetowej."/> - <slider label="Skala" name="zoom slider"/> + <panel name="layout_panel_1"> + <text name="events_label"> + Legenda + </text> + </panel> + <panel name="layout_panel_2"> + <button name="Show My Location" tool_tip="WyÅ›rodkuj mapÄ™ w miejscu, gdzie znajduje siÄ™ mój awatar"/> + <text name="me_label"> + Ja + </text> + <text name="person_label"> + Osoba + </text> + <text name="infohub_label"> + Infohub + </text> + <text name="land_sale_label"> + Sprzedaż PosiadÅ‚oÅ›ci + </text> + <text name="by_owner_label"> + przez WÅ‚aÅ›ciciela + </text> + <text name="auction_label"> + aukcja PosiadÅ‚oÅ›ci + </text> + <button name="Go Home" tool_tip="Teleportuj do mojego Miejsca Startowego"/> + <text name="Home_label"> + Miejsce Startu + </text> + <text name="events_label"> + Wydarzenia: + </text> + <text name="pg_label"> + Ogólne + </text> + <check_box name="event_mature_chk"/> + <text name="mature_label"> + Moderuj + </text> + <text name="adult_label"> + Adult + </text> + </panel> + <panel name="layout_panel_3"> + <text name="find_on_map_label"> + Znajdź na mapie + </text> + </panel> + <panel name="layout_panel_4"> + <combo_box label="DostÄ™pni Znajomi" name="friend combo" tool_tip="Pokaż znajomych na mapie"> + <combo_box.item label="Moi DostÄ™pni Znajomi" name="item1"/> + </combo_box> + <combo_box label="Zapisane Miejsca" name="landmark combo" tool_tip="Pokaż zapisane miejsce na mapie"> + <combo_box.item label="Zapisane Miejsca" name="item1"/> + </combo_box> + <search_editor label="Regiony WedÅ‚ug Nazwy" name="location" tool_tip="Wpisz nazwÄ™ regionu"/> + <button label="Znajdź" name="DoSearch" tool_tip="Szukaj regionu"/> + <button name="Clear" tool_tip="Wyczyść zapamiÄ™tane linie oraz zresetuj mapÄ™"/> + <button label="Teleportuj" name="Teleport" tool_tip="Teleportuj do wybranego miejsca"/> + <button label="Kopiuj SLurl" name="copy_slurl" tool_tip="Kopie obecnego miejsca jako SLurl mogÄ… zostać użyte na stronie internetowej."/> + <button label="Pokaż wybrane" name="Show Destination" tool_tip="WyÅ›rodkuj mapÄ™ w wybranym miejscu"/> + </panel> + <panel name="layout_panel_5"> + <text name="zoom_label"> + Przybliż + </text> + </panel> </floater> diff --git a/indra/newview/skins/default/xui/pl/inspect_avatar.xml b/indra/newview/skins/default/xui/pl/inspect_avatar.xml new file mode 100644 index 0000000000..3ee0b976eb --- /dev/null +++ b/indra/newview/skins/default/xui/pl/inspect_avatar.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- + Not can_close / no title to avoid window chrome + Single instance - only have one at a time, recycle it each spawn +--> +<floater name="inspect_avatar"> + <string name="Subtitle"> + [AGE] + </string> + <string name="Details"> + [SL_PROFILE] + </string> + <slider name="volume_slider" tool_tip="Posiom GÅ‚oÅ›noÅ›ci" value="0.5"/> + <button label="Dodaj Znajomość" name="add_friend_btn"/> + <button label="IM" name="im_btn"/> + <button label="Profil" name="view_profile_btn"/> + <panel name="moderator_panel"> + <button label="Wyłącz komunikacjÄ™ gÅ‚osowÄ…" name="disable_voice"/> + <button label="Włącz komunikacjÄ™ gÅ‚osowÄ…" name="enable_voice"/> + </panel> +</floater> diff --git a/indra/newview/skins/default/xui/pl/inspect_group.xml b/indra/newview/skins/default/xui/pl/inspect_group.xml new file mode 100644 index 0000000000..0a2a62ce74 --- /dev/null +++ b/indra/newview/skins/default/xui/pl/inspect_group.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- + Not can_close / no title to avoid window chrome + Single instance - only have one at a time, recycle it each spawn +--> +<floater name="inspect_group"> + <string name="PrivateGroup"> + Grupa prywatna + </string> + <string name="FreeToJoin"> + WstÄ™p wolny + </string> + <string name="CostToJoin"> + L$[AMOUNT] by dołączyć + </string> + <string name="YouAreMember"> + JesteÅ› czÅ‚onkiem + </string> + <button label="Dołącz" name="join_btn"/> + <button label="Opuść" name="leave_btn"/> + <button label="Zobacz Profil" name="view_profile_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/pl/inspect_object.xml b/indra/newview/skins/default/xui/pl/inspect_object.xml new file mode 100644 index 0000000000..2e15691463 --- /dev/null +++ b/indra/newview/skins/default/xui/pl/inspect_object.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- + Not can_close / no title to avoid window chrome + Single instance - only have one at a time, recycle it each spawn +--> +<floater name="inspect_object"> + <string name="Creator"> + Przez [CREATOR] + </string> + <string name="CreatorAndOwner"> + przez [CREATOR] +wÅ‚aÅ›ciciel [OWNER] + </string> + <string name="Price"> + L$[AMOUNT] + </string> + <string name="PriceFree"> + Darmowe! + </string> + <string name="Touch"> + Dotknij + </string> + <string name="Sit"> + UsiÄ…dź tutaj + </string> + <button label="Kup" name="buy_btn"/> + <button label="ZapÅ‚ać" name="pay_btn"/> + <button label="Weź kopiÄ™" name="take_free_copy_btn"/> + <button label="Dotknij" name="touch_btn"/> + <button label="UsiÄ…dź tutaj" name="sit_btn"/> + <button label="Otwórz" name="open_btn"/> + <icon name="secure_browsing" tool_tip="Zabezpiecz przeglÄ…danie"/> + <button label="WiÄ™cej" name="more_info_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/pl/inspect_remote_object.xml b/indra/newview/skins/default/xui/pl/inspect_remote_object.xml new file mode 100644 index 0000000000..0d570940c1 --- /dev/null +++ b/indra/newview/skins/default/xui/pl/inspect_remote_object.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- + Not can_close / no title to avoid window chrome + Single instance - only have one at a time, recycle it each spawn +--> +<floater name="inspect_remote_object"> + <text name="object_owner_label"> + WÅ‚aÅ›ciciel: + </text> + <button label="Mapa" name="map_btn"/> + <button label="Zablokuj" name="block_btn"/> + <button label="Zamknij" name="close_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/pl/language_settings.xml b/indra/newview/skins/default/xui/pl/language_settings.xml index 71418d446a..debc451a33 100644 --- a/indra/newview/skins/default/xui/pl/language_settings.xml +++ b/indra/newview/skins/default/xui/pl/language_settings.xml @@ -3,9 +3,9 @@ <strings> <!-- Locale Information --> - <string name="MicrosoftLocale">english</string> - <string name="DarwinLocale">C</string> - <string name="LinuxLocale">C</string> + <string name="MicrosoftLocale">polish</string> + <string name="DarwinLocale">pl_PL.UTF-8</string> + <string name="LinuxLocale">pl_PL.UTF-8</string> <!-- datetimeToCodes["wkday"] = "%a"; // Thu diff --git a/indra/newview/skins/default/xui/pl/menu_attachment_self.xml b/indra/newview/skins/default/xui/pl/menu_attachment_self.xml index 1107a5d9d1..ff695be205 100644 --- a/indra/newview/skins/default/xui/pl/menu_attachment_self.xml +++ b/indra/newview/skins/default/xui/pl/menu_attachment_self.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Attachment Pie"> - <menu_item_call label="Dotnij" name="Attachment Object Touch"/> + <menu_item_call label="Dotknij" name="Attachment Object Touch"/> <menu_item_call label="Edytuj" name="Edit..."/> <menu_item_call label="Odłącz" name="Detach"/> <menu_item_call label="Opuść" name="Drop"/> diff --git a/indra/newview/skins/default/xui/pl/menu_avatar_self.xml b/indra/newview/skins/default/xui/pl/menu_avatar_self.xml index 427c0d464b..0bca90168f 100644 --- a/indra/newview/skins/default/xui/pl/menu_avatar_self.xml +++ b/indra/newview/skins/default/xui/pl/menu_avatar_self.xml @@ -1,8 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Self Pie"> <menu_item_call label="WstaÅ„" name="Stand Up"/> - <context_menu label="Zdejmij >" name="Take Off >"> - <context_menu label="Ubranie >" name="Clothes >"> + <context_menu label="Zdejmij â–¶" name="Take Off >"> + <context_menu label="Ubrania â–¶" name="Clothes >"> <menu_item_call label="KoszulkÄ™" name="Shirt"/> <menu_item_call label="Spodnie" name="Pants"/> <menu_item_call label="SpódnicÄ™" name="Skirt"/> @@ -16,8 +16,8 @@ <menu_item_call label="Ubranie Przezroczyste" name="Self Alpha"/> <menu_item_call label="Wszystko" name="All Clothes"/> </context_menu> - <context_menu label="HUD >" name="Object Detach HUD"/> - <context_menu label="Odłącz >" name="Object Detach"/> + <context_menu label="HUD â–¶" name="Object Detach HUD"/> + <context_menu label="Odłącz â–¶" name="Object Detach"/> <menu_item_call label="Odłącz Wszystko" name="Detach All"/> </context_menu> <menu_item_call label="Mój WyglÄ…d" name="Appearance..."/> diff --git a/indra/newview/skins/default/xui/pl/menu_bottomtray.xml b/indra/newview/skins/default/xui/pl/menu_bottomtray.xml index 818dfc08ae..9fcf1b3440 100644 --- a/indra/newview/skins/default/xui/pl/menu_bottomtray.xml +++ b/indra/newview/skins/default/xui/pl/menu_bottomtray.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="hide_camera_move_controls_menu"> - <menu_item_check label="Przycisk Gesturek" name="ShowGestureButton"/> + <menu_item_check label="Przycisk Gestur" name="ShowGestureButton"/> <menu_item_check label="Przycisk Ruchu" name="ShowMoveButton"/> <menu_item_check label="Przycisk Widoku" name="ShowCameraButton"/> <menu_item_check label="Przycisk Zdjęć" name="ShowSnapshotButton"/> @@ -8,5 +8,5 @@ <menu_item_call label="Kopiuj" name="NearbyChatBar_Copy"/> <menu_item_call label="Wklej" name="NearbyChatBar_Paste"/> <menu_item_call label="UsuÅ„" name="NearbyChatBar_Delete"/> - <menu_item_call label="Zaznacz Wszystko" name="NearbyChatBar_Select_All"/> + <menu_item_call label="Zaznacz wszystko" name="NearbyChatBar_Select_All"/> </menu> diff --git a/indra/newview/skins/default/xui/pl/menu_favorites.xml b/indra/newview/skins/default/xui/pl/menu_favorites.xml index 0a0b54a548..cbacaf4beb 100644 --- a/indra/newview/skins/default/xui/pl/menu_favorites.xml +++ b/indra/newview/skins/default/xui/pl/menu_favorites.xml @@ -3,7 +3,7 @@ <menu_item_call label="Teleportuj" name="Teleport To Landmark"/> <menu_item_call label="Zobacz/Edytuj Ulubione Miejsce" name="Landmark Open"/> <menu_item_call label="Kopiuj SLurl" name="Copy slurl"/> - <menu_item_call label="Pokaż na Mapie" name="Show On Map"/> + <menu_item_call label="Pokaż na mapie" name="Show On Map"/> <menu_item_call label="Kopiuj" name="Landmark Copy"/> <menu_item_call label="Wklej" name="Landmark Paste"/> <menu_item_call label="UsuÅ„" name="Delete"/> diff --git a/indra/newview/skins/default/xui/pl/menu_hide_navbar.xml b/indra/newview/skins/default/xui/pl/menu_hide_navbar.xml index 1c2687338d..d30f5a4d3f 100644 --- a/indra/newview/skins/default/xui/pl/menu_hide_navbar.xml +++ b/indra/newview/skins/default/xui/pl/menu_hide_navbar.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="hide_navbar_menu"> - <menu_item_check label="Pokaż Pasek Nawigacji" name="ShowNavbarNavigationPanel"/> - <menu_item_check label="Pokaż Pasek Ulubionych" name="ShowNavbarFavoritesPanel"/> + <menu_item_check label="Pokaż pasek Nawigacji" name="ShowNavbarNavigationPanel"/> + <menu_item_check label="Pokaż pasek Ulubionych" name="ShowNavbarFavoritesPanel"/> </menu> diff --git a/indra/newview/skins/default/xui/pl/menu_im_well_button.xml b/indra/newview/skins/default/xui/pl/menu_im_well_button.xml new file mode 100644 index 0000000000..207bc2211b --- /dev/null +++ b/indra/newview/skins/default/xui/pl/menu_im_well_button.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="IM Well Button Context Menu"> + <menu_item_call label="Zamknij wszystkie" name="Close All"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/pl/menu_imchiclet_adhoc.xml b/indra/newview/skins/default/xui/pl/menu_imchiclet_adhoc.xml index 925272d5ee..4ead44878a 100644 --- a/indra/newview/skins/default/xui/pl/menu_imchiclet_adhoc.xml +++ b/indra/newview/skins/default/xui/pl/menu_imchiclet_adhoc.xml @@ -1,4 +1,4 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="IMChiclet AdHoc Menu"> - <menu_item_call label="ZakoÅ„cz RozmowÄ™" name="End Session"/> + <menu_item_call label="ZakoÅ„cz rozmowÄ™" name="End Session"/> </menu> diff --git a/indra/newview/skins/default/xui/pl/menu_imchiclet_group.xml b/indra/newview/skins/default/xui/pl/menu_imchiclet_group.xml index dc232c096d..c53f72c043 100644 --- a/indra/newview/skins/default/xui/pl/menu_imchiclet_group.xml +++ b/indra/newview/skins/default/xui/pl/menu_imchiclet_group.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="IMChiclet Group Menu"> <menu_item_call label="O Grupie" name="Show Profile"/> - <menu_item_call label="Pokaż SesjÄ™" name="Chat"/> - <menu_item_call label="ZakoÅ„cz RozmowÄ™" name="End Session"/> + <menu_item_call label="Pokaż sesjÄ™" name="Chat"/> + <menu_item_call label="ZakoÅ„cz rozmowÄ™" name="End Session"/> </menu> diff --git a/indra/newview/skins/default/xui/pl/menu_imchiclet_p2p.xml b/indra/newview/skins/default/xui/pl/menu_imchiclet_p2p.xml index df991cbc36..c0c812c0a7 100644 --- a/indra/newview/skins/default/xui/pl/menu_imchiclet_p2p.xml +++ b/indra/newview/skins/default/xui/pl/menu_imchiclet_p2p.xml @@ -2,6 +2,6 @@ <menu name="IMChiclet P2P Menu"> <menu_item_call label="Zobacz Profil" name="Show Profile"/> <menu_item_call label="Dodaj Znajomość" name="Add Friend"/> - <menu_item_call label="Pokaż SesjÄ™" name="Send IM"/> - <menu_item_call label="ZakoÅ„cz RozmowÄ™" name="End Session"/> + <menu_item_call label="Pokaż sesjÄ™" name="Send IM"/> + <menu_item_call label="ZakoÅ„cz rozmowÄ™" name="End Session"/> </menu> diff --git a/indra/newview/skins/default/xui/pl/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/pl/menu_inspect_avatar_gear.xml index 22d81cb823..325072d0fb 100644 --- a/indra/newview/skins/default/xui/pl/menu_inspect_avatar_gear.xml +++ b/indra/newview/skins/default/xui/pl/menu_inspect_avatar_gear.xml @@ -7,11 +7,13 @@ <menu_item_call label="Teleportuj" name="teleport"/> <menu_item_call label="ZaproÅ› do Grupy" name="invite_to_group"/> <menu_item_call label="Zablokuj" name="block"/> + <menu_item_call label="Odblokuj" name="unblock"/> <menu_item_call label="Raport" name="report"/> <menu_item_call label="Unieruchom" name="freeze"/> <menu_item_call label="Wyrzuć" name="eject"/> <menu_item_call label="Debug" name="debug"/> - <menu_item_call label="Znajdź na Mapie" name="find_on_map"/> + <menu_item_call label="Znajdź na mapie" name="find_on_map"/> <menu_item_call label="Przybliż" name="zoom_in"/> <menu_item_call label="ZapÅ‚ać" name="pay"/> + <menu_item_call label="UdostÄ™pnij" name="share"/> </menu> diff --git a/indra/newview/skins/default/xui/pl/menu_inspect_object_gear.xml b/indra/newview/skins/default/xui/pl/menu_inspect_object_gear.xml index 988c31a6e4..2c56d2ca3d 100644 --- a/indra/newview/skins/default/xui/pl/menu_inspect_object_gear.xml +++ b/indra/newview/skins/default/xui/pl/menu_inspect_object_gear.xml @@ -5,7 +5,7 @@ <menu_item_call label="ZapÅ‚ać" name="pay"/> <menu_item_call label="Kup" name="buy"/> <menu_item_call label="Weź" name="take"/> - <menu_item_call label="Weź KopiÄ™" name="take_copy"/> + <menu_item_call label="Weź kopiÄ™" name="take_copy"/> <menu_item_call label="Otwórz" name="open"/> <menu_item_call label="Edytuj" name="edit"/> <menu_item_call label="Ubierz" name="wear"/> @@ -13,5 +13,5 @@ <menu_item_call label="Zablokuj" name="block"/> <menu_item_call label="Przybliż" name="zoom_in"/> <menu_item_call label="UsuÅ„" name="remove"/> - <menu_item_call label="WiÄ™cej Informacji" name="more_info"/> + <menu_item_call label="WiÄ™cej informacji" name="more_info"/> </menu> diff --git a/indra/newview/skins/default/xui/pl/menu_inventory.xml b/indra/newview/skins/default/xui/pl/menu_inventory.xml index 75c84c275d..7fe9da3c0c 100755..100644 --- a/indra/newview/skins/default/xui/pl/menu_inventory.xml +++ b/indra/newview/skins/default/xui/pl/menu_inventory.xml @@ -4,32 +4,32 @@ <menu_item_call label="Otwórz" name="Task Open"/> <menu_item_call label="Odtwarzaj" name="Task Play"/> <menu_item_call label="WÅ‚aÅ›ciwoÅ›ci" name="Task Properties"/> - <menu_item_call label="ZmieÅ„ NazwÄ™" name="Task Rename"/> + <menu_item_call label="ZmieÅ„ nazwÄ™" name="Task Rename"/> <menu_item_call label="UsuÅ„" name="Task Remove"/> <menu_item_call label="Opróżnij Kosz" name="Empty Trash"/> <menu_item_call label="Opróżnij Folder Zgubione i Odnalezione" name="Empty Lost And Found"/> - <menu_item_call label="Nowy Folder" name="New Folder"/> - <menu_item_call label="Nowy Skrypt" name="New Script"/> - <menu_item_call label="Nowa Nota" name="New Note"/> - <menu_item_call label="Nowy Gest" name="New Gesture"/> + <menu_item_call label="Nowy folder" name="New Folder"/> + <menu_item_call label="Nowy skrypt" name="New Script"/> + <menu_item_call label="Nowa nota" name="New Note"/> + <menu_item_call label="Nowy gest" name="New Gesture"/> <menu label="Nowe Ubranie" name="New Clothes"> - <menu_item_call label="Nowa Koszulka" name="New Shirt"/> - <menu_item_call label="Nowe Spodnie" name="New Pants"/> - <menu_item_call label="Nowe Buty" name="New Shoes"/> - <menu_item_call label="Nowe Skarpety" name="New Socks"/> - <menu_item_call label="Nowa Kurtka" name="New Jacket"/> - <menu_item_call label="Nowa Spódnica" name="New Skirt"/> - <menu_item_call label="Nowe RÄ™kawiczki" name="New Gloves"/> - <menu_item_call label="Nowy Podkoszulek" name="New Undershirt"/> - <menu_item_call label="Nowa Bielizna" name="New Underpants"/> - <menu_item_call label="Nowa Maska Przezroczysta" name="New Alpha Mask"/> - <menu_item_call label="Nowy Tatuaż" name="New Tattoo"/> + <menu_item_call label="Nowa koszulka" name="New Shirt"/> + <menu_item_call label="Nowe spodnie" name="New Pants"/> + <menu_item_call label="Nowe buty" name="New Shoes"/> + <menu_item_call label="Nowe skarpety" name="New Socks"/> + <menu_item_call label="Nowa kurtka" name="New Jacket"/> + <menu_item_call label="Nowa spódnica" name="New Skirt"/> + <menu_item_call label="Nowe rÄ™kawiczki" name="New Gloves"/> + <menu_item_call label="Nowy podkoszulek" name="New Undershirt"/> + <menu_item_call label="Nowa bielizna" name="New Underpants"/> + <menu_item_call label="Nowa maska Alpha" name="New Alpha Mask"/> + <menu_item_call label="Nowy tatuaż" name="New Tattoo"/> </menu> <menu label="Nowa Część CiaÅ‚a" name="New Body Parts"> - <menu_item_call label="Nowy KsztaÅ‚t" name="New Shape"/> - <menu_item_call label="Nowa Skórka" name="New Skin"/> - <menu_item_call label="Nowe WÅ‚osy" name="New Hair"/> - <menu_item_call label="Nowe Oczy" name="New Eyes"/> + <menu_item_call label="Nowy ksztaÅ‚t" name="New Shape"/> + <menu_item_call label="Nowa skórka" name="New Skin"/> + <menu_item_call label="Nowe wÅ‚osy" name="New Hair"/> + <menu_item_call label="Nowe oczy" name="New Eyes"/> </menu> <menu label="ZmieÅ„ CzcionkÄ™" name="Change Type"> <menu_item_call label="DomyÅ›lna" name="Default"/> @@ -46,32 +46,31 @@ <menu_item_call label="Teleportuj" name="Landmark Open"/> <menu_item_call label="Otwórz" name="Animation Open"/> <menu_item_call label="Otwórz" name="Sound Open"/> - <menu_item_call label="UsuÅ„ Obiekt" name="Purge Item"/> - <menu_item_call label="Przywróć Obiekt" name="Restore Item"/> - <menu_item_call label="Otwórz Link" name="Goto Link"/> + <menu_item_call label="ZmieÅ„ strój" name="Replace Outfit"/> + <menu_item_call label="Dodaj do stroju" name="Add To Outfit"/> + <menu_item_call label="UsuÅ„ obiekt" name="Purge Item"/> + <menu_item_call label="Przywróć obiekt" name="Restore Item"/> <menu_item_call label="Otwórz" name="Open"/> <menu_item_call label="WÅ‚aÅ›ciwoÅ›ci" name="Properties"/> - <menu_item_call label="ZmieÅ„ NazwÄ™" name="Rename"/> - <menu_item_call label="Kopiuj Dane UUID" name="Copy Asset UUID"/> + <menu_item_call label="ZmieÅ„ nazwÄ™" name="Rename"/> + <menu_item_call label="Kopiuj dane UUID" name="Copy Asset UUID"/> <menu_item_call label="Kopiuj" name="Copy"/> <menu_item_call label="Wklej" name="Paste"/> - <menu_item_call label="Wklej jako Link" name="Paste As Link"/> + <menu_item_call label="Wklej jako link" name="Paste As Link"/> <menu_item_call label="UsuÅ„" name="Delete"/> - <menu_item_call label="Zdejmij Obiekt" name="Take Off Items"/> - <menu_item_call label="Dodaj do Stroju" name="Add To Outfit"/> - <menu_item_call label="ZmieÅ„ Strój" name="Replace Outfit"/> - <menu_item_call label="Rozpocznij KonferencjÄ™ CzatowÄ…" name="Conference Chat Folder"/> + <menu_item_call label="Skasuj Folder Systemu" name="Delete System Folder"/> + <menu_item_call label="Rozpocznij konferencjÄ™ czatowÄ…" name="Conference Chat Folder"/> <menu_item_call label="Odtwarzaj" name="Sound Play"/> <menu_item_call label="O Miejscu" name="About Landmark"/> - <menu_item_call label="Odtwarzaj w Åšwiecie" name="Animation Play"/> - <menu_item_call label="Odtwarzaj Lokalnie" name="Animation Audition"/> + <menu_item_call label="Używaj in-world" name="Animation Play"/> + <menu_item_call label="Odtwarzaj lokalnie" name="Animation Audition"/> <menu_item_call label="WyÅ›lij IM" name="Send Instant Message"/> - <menu_item_call label="Zaoferuj TeleportacjÄ™..." name="Offer Teleport..."/> - <menu_item_call label="Rozpocznij KonferencjÄ™ CzatowÄ…" name="Conference Chat"/> + <menu_item_call label="Teleportuj..." name="Offer Teleport..."/> + <menu_item_call label="Rozpocznij konferencjÄ™ czatowÄ…" name="Conference Chat"/> <menu_item_call label="Aktywuj" name="Activate"/> <menu_item_call label="Deaktywuj" name="Deactivate"/> <menu_item_call label="Zapisz jako" name="Save As"/> - <menu_item_call label="Odłącz od Siebie" name="Detach From Yourself"/> + <menu_item_call label="Odłącz od siebie" name="Detach From Yourself"/> <menu_item_call label="Ubierz" name="Object Wear"/> <menu label="Dołącz do" name="Attach To"/> <menu label="Dołącz do Załączników HUD" name="Attach To HUD"/> diff --git a/indra/newview/skins/default/xui/pl/menu_inventory_add.xml b/indra/newview/skins/default/xui/pl/menu_inventory_add.xml index 5b8c5426dd..b4d85c2c5c 100644 --- a/indra/newview/skins/default/xui/pl/menu_inventory_add.xml +++ b/indra/newview/skins/default/xui/pl/menu_inventory_add.xml @@ -1,32 +1,32 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="menu_inventory_add"> <menu label="ZaÅ‚aduj" name="upload"> - <menu_item_call label="Obraz (L$[COST])..." name="Upload Image"/> - <menu_item_call label="DźwiÄ™k (L$[COST])..." name="Upload Sound"/> - <menu_item_call label="AnimacjÄ™ (L$[COST])..." name="Upload Animation"/> - <menu_item_call label="Zbiór Plików (L$[COST] za jeden plik)..." name="Bulk Upload"/> + <menu_item_call label="obraz (L$[COST])..." name="Upload Image"/> + <menu_item_call label="dźwiÄ™k (L$[COST])..." name="Upload Sound"/> + <menu_item_call label="animacjÄ™ (L$[COST])..." name="Upload Animation"/> + <menu_item_call label="zbiór plików (L$[COST] za jeden plik)..." name="Bulk Upload"/> </menu> - <menu_item_call label="Nowy Folder" name="New Folder"/> - <menu_item_call label="Nowy Skrypt" name="New Script"/> - <menu_item_call label="Nowa Nota" name="New Note"/> - <menu_item_call label="Nowa Gesturka" name="New Gesture"/> + <menu_item_call label="Nowy folder" name="New Folder"/> + <menu_item_call label="Nowy skrypt" name="New Script"/> + <menu_item_call label="Nowa nota" name="New Note"/> + <menu_item_call label="Nowy gest" name="New Gesture"/> <menu label="Nowe Ubranie" name="New Clothes"> - <menu_item_call label="Nowa Koszulka" name="New Shirt"/> - <menu_item_call label="Nowe Spodnie" name="New Pants"/> - <menu_item_call label="Nowe Buty" name="New Shoes"/> - <menu_item_call label="Nowe Skarpetki" name="New Socks"/> - <menu_item_call label="Nowa Kurtka" name="New Jacket"/> - <menu_item_call label="Nowa Spódnica" name="New Skirt"/> - <menu_item_call label="Nowe RÄ™kawiczki" name="New Gloves"/> - <menu_item_call label="Nowy Podkoszulek" name="New Undershirt"/> - <menu_item_call label="Nowa Bielizna" name="New Underpants"/> - <menu_item_call label="Nowe Ubranie Przezroczyste" name="New Alpha"/> - <menu_item_call label="Nowy Tatuaż" name="New Tattoo"/> + <menu_item_call label="Nowa koszulka" name="New Shirt"/> + <menu_item_call label="Nowe spodnie" name="New Pants"/> + <menu_item_call label="Nowe buty" name="New Shoes"/> + <menu_item_call label="Nowe skarpetki" name="New Socks"/> + <menu_item_call label="Nowa kurtka" name="New Jacket"/> + <menu_item_call label="Nowa spódnica" name="New Skirt"/> + <menu_item_call label="Nowe rÄ™kawiczki" name="New Gloves"/> + <menu_item_call label="Nowy podkoszulek" name="New Undershirt"/> + <menu_item_call label="Nowa bielizna" name="New Underpants"/> + <menu_item_call label="Nowe ubranie Przezroczyste" name="New Alpha"/> + <menu_item_call label="Nowy tatuaż" name="New Tattoo"/> </menu> <menu label="Nowa Część CiaÅ‚a" name="New Body Parts"> - <menu_item_call label="Nowy KsztaÅ‚t" name="New Shape"/> - <menu_item_call label="Nowa Skórka" name="New Skin"/> - <menu_item_call label="Nowe WÅ‚osy" name="New Hair"/> - <menu_item_call label="Nowe Oczy" name="New Eyes"/> + <menu_item_call label="Nowy ksztaÅ‚t" name="New Shape"/> + <menu_item_call label="Nowa skórka" name="New Skin"/> + <menu_item_call label="Nowe wÅ‚osy" name="New Hair"/> + <menu_item_call label="Nowe oczy" name="New Eyes"/> </menu> </menu> diff --git a/indra/newview/skins/default/xui/pl/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/pl/menu_inventory_gear_default.xml index 8f5f94a02f..2ec3741682 100644 --- a/indra/newview/skins/default/xui/pl/menu_inventory_gear_default.xml +++ b/indra/newview/skins/default/xui/pl/menu_inventory_gear_default.xml @@ -1,14 +1,14 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="menu_gear_default"> - <menu_item_call label="Nowe Okno Szafy" name="new_window"/> - <menu_item_call label="PorzÄ…dkuj WedÅ‚ug Nazwy" name="sort_by_name"/> - <menu_item_call label="PorzÄ…dkuj WedÅ‚ug Daty" name="sort_by_recent"/> - <menu_item_call label="Pokaż Filtry" name="show_filters"/> - <menu_item_call label="Zresetuj Filtry" name="reset_filters"/> - <menu_item_call label="Zamknij Wszystkie Foldery" name="close_folders"/> + <menu_item_call label="Nowe okno Szafy" name="new_window"/> + <menu_item_call label="PorzÄ…dkuj wedÅ‚ug nazwy" name="sort_by_name"/> + <menu_item_call label="PorzÄ…dkuj wedÅ‚ug daty" name="sort_by_recent"/> + <menu_item_call label="Pokaż filtry" name="show_filters"/> + <menu_item_call label="Zresetuj filtry" name="reset_filters"/> + <menu_item_call label="Zamknij wszystkie foldery" name="close_folders"/> <menu_item_call label="Opróżnij Kosz" name="empty_trash"/> <menu_item_call label="Opróżnij Zagubione i Odnalezione" name="empty_lostnfound"/> - <menu_item_call label="Zapisz TeksturÄ™ Jako" name="Save Texture As"/> - <menu_item_call label="Znajdź OryginaÅ‚" name="Find Original"/> - <menu_item_call label="Znajdź Wszystkie Linki" name="Find All Links"/> + <menu_item_call label="Zapisz teksturÄ™ jako" name="Save Texture As"/> + <menu_item_call label="Znajdź oryginaÅ‚" name="Find Original"/> + <menu_item_call label="Znajdź wszystkie linki" name="Find All Links"/> </menu> diff --git a/indra/newview/skins/default/xui/pl/menu_land.xml b/indra/newview/skins/default/xui/pl/menu_land.xml index 2c89b43525..1e1ce73089 100644 --- a/indra/newview/skins/default/xui/pl/menu_land.xml +++ b/indra/newview/skins/default/xui/pl/menu_land.xml @@ -1,9 +1,9 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Land Pie"> <menu_item_call label="O PosiadÅ‚oÅ›ci" name="Place Information..."/> - <menu_item_call label="UsiÄ…dź Tutaj" name="Sit Here"/> + <menu_item_call label="UsiÄ…dź tutaj" name="Sit Here"/> <menu_item_call label="Kup PosiadÅ‚ość" name="Land Buy"/> - <menu_item_call label="Kup WstÄ™p" name="Land Buy Pass"/> + <menu_item_call label="Kup przepustkÄ™" name="Land Buy Pass"/> <menu_item_call label="Buduj" name="Create"/> - <menu_item_call label="Edytuj Teren" name="Edit Terrain"/> + <menu_item_call label="Edytuj teren" name="Edit Terrain"/> </context_menu> diff --git a/indra/newview/skins/default/xui/pl/menu_landmark.xml b/indra/newview/skins/default/xui/pl/menu_landmark.xml index 8cd7e03bf1..aa5808390c 100644 --- a/indra/newview/skins/default/xui/pl/menu_landmark.xml +++ b/indra/newview/skins/default/xui/pl/menu_landmark.xml @@ -3,5 +3,5 @@ <menu_item_call label="Kopiuj SLurl" name="copy"/> <menu_item_call label="UsuÅ„" name="delete"/> <menu_item_call label="Utwórz" name="pick"/> - <menu_item_call label="Dodaj do Paska Ulubionych" name="add_to_favbar"/> + <menu_item_call label="Dodaj do paska Ulubionych" name="add_to_favbar"/> </toggleable_menu> diff --git a/indra/newview/skins/default/xui/pl/menu_login.xml b/indra/newview/skins/default/xui/pl/menu_login.xml index 5084b59397..ed4937182f 100755..100644 --- a/indra/newview/skins/default/xui/pl/menu_login.xml +++ b/indra/newview/skins/default/xui/pl/menu_login.xml @@ -2,10 +2,11 @@ <menu_bar name="Login Menu"> <menu label="Ja" name="File"> <menu_item_call label="Ustawienia" name="Preferences..."/> - <menu_item_call label="Wyłącz Program" name="Quit"/> + <menu_item_call label="Wyłącz program" name="Quit"/> </menu> <menu label="Pomoc" name="Help"> <menu_item_call label="[SECOND_LIFE]: Pomoc" name="Second Life Help"/> + <menu_item_call label="O [APP_NAME]" name="About Second Life"/> </menu> <menu label="Debug" name="Debug"> <menu label="Edytuj" name="Edit"> @@ -16,15 +17,15 @@ <menu_item_call label="Wklej" name="Paste"/> <menu_item_call label="UsuÅ„" name="Delete"/> <menu_item_call label="Powiel" name="Duplicate"/> - <menu_item_call label="Zaznacz Wszystko" name="Select All"/> + <menu_item_call label="Zaznacz wszystko" name="Select All"/> <menu_item_call label="Odznacz" name="Deselect"/> </menu> - <menu_item_call label="Ustawienia Debugowania" name="Debug Settings"/> - <menu_item_call label="Ustawienia UI/Kolor" name="UI/Color Settings"/> - <menu_item_call label="Pokaż schowek" name="Show Side Tray"/> + <menu_item_call label="Ustawienia debugowania" name="Debug Settings"/> + <menu_item_call label="Ustawienia UI/kolor" name="UI/Color Settings"/> <menu label="UI Testy" name="UI Tests"/> + <menu_item_call label="Ustaw rozmiar interfejsu..." name="Set Window Size..."/> <menu_item_call label="WyÅ›wietl TOS" name="TOS"/> - <menu_item_call label="WyÅ›wietl Wiadomość KrytycznÄ…" name="Critical"/> - <menu_item_call label="Test PrzeglÄ…darki Internetowej" name="Web Browser Test"/> + <menu_item_call label="WyÅ›wietl wiadomość krytycznÄ…" name="Critical"/> + <menu_item_call label="Test przeglÄ…darki internetowej" name="Web Browser Test"/> </menu> </menu_bar> diff --git a/indra/newview/skins/default/xui/pl/menu_mini_map.xml b/indra/newview/skins/default/xui/pl/menu_mini_map.xml index 4152fb41c8..94e4c91abb 100644 --- a/indra/newview/skins/default/xui/pl/menu_mini_map.xml +++ b/indra/newview/skins/default/xui/pl/menu_mini_map.xml @@ -1,9 +1,9 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="popup"> - <menu_item_call label="Zoom Blisko" name="Zoom Close"/> - <menu_item_call label="Zoom Åšrednio" name="Zoom Medium"/> - <menu_item_call label="Zoom Daleko" name="Zoom Far"/> - <menu_item_check label="Obróć MapÄ™" name="Rotate Map"/> +<menu name="Popup"> + <menu_item_call label="Zoom blisko" name="Zoom Close"/> + <menu_item_call label="Zoom Å›rednio" name="Zoom Medium"/> + <menu_item_call label="Zoom daleko" name="Zoom Far"/> + <menu_item_check label="Obróć mapÄ™" name="Rotate Map"/> <menu_item_call label="Zatrzymaj" name="Stop Tracking"/> <menu_item_call label="Mapa Åšwiata" name="World Map"/> </menu> diff --git a/indra/newview/skins/default/xui/pl/menu_navbar.xml b/indra/newview/skins/default/xui/pl/menu_navbar.xml index 8d84f3e764..f38b805ee2 100644 --- a/indra/newview/skins/default/xui/pl/menu_navbar.xml +++ b/indra/newview/skins/default/xui/pl/menu_navbar.xml @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="Navbar Menu"> - <menu_item_check label="Pokaż WspółrzÄ™dne" name="Show Coordinates"/> - <menu_item_check label="Pokaż WÅ‚aÅ›ciwoÅ›ci PosiadÅ‚oÅ›ci" name="Show Parcel Properties"/> + <menu_item_check label="Pokaż współrzÄ™dne" name="Show Coordinates"/> + <menu_item_check label="Pokaż wÅ‚aÅ›ciwoÅ›ci PosiadÅ‚oÅ›ci" name="Show Parcel Properties"/> <menu_item_call label="Ulubione Miejsce" name="Landmark"/> <menu_item_call label="Wytnij" name="Cut"/> <menu_item_call label="Kopiuj" name="Copy"/> <menu_item_call label="Wklej" name="Paste"/> <menu_item_call label="UsuÅ„" name="Delete"/> - <menu_item_call label="Zaznacz Wszystko" name="Select All"/> + <menu_item_call label="Zaznacz wszystko" name="Select All"/> </menu> diff --git a/indra/newview/skins/default/xui/pl/menu_nearby_chat.xml b/indra/newview/skins/default/xui/pl/menu_nearby_chat.xml index 78b8c0a4fc..fe5bc6ba6f 100644 --- a/indra/newview/skins/default/xui/pl/menu_nearby_chat.xml +++ b/indra/newview/skins/default/xui/pl/menu_nearby_chat.xml @@ -1,9 +1,9 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="NearBy Chat Menu"> - <menu_item_call label="Pokaż Osoby w Pobliżu..." name="nearby_people"/> - <menu_item_check label="Pokaż Zablokowany Tekst" name="muted_text"/> - <menu_item_check label="WyÅ›wietlaj Ikonki Znajomych" name="show_buddy_icons"/> - <menu_item_check label="WyÅ›wietlaj Imiona" name="show_names"/> - <menu_item_check label="WyÅ›wietlaj Ikonki i Imiona" name="show_icons_and_names"/> - <menu_item_call label="Rozmiar Czcionki" name="font_size"/> + <menu_item_call label="Pokaż osoby w pobliżu..." name="nearby_people"/> + <menu_item_check label="Pokaż zablokowany tekst" name="muted_text"/> + <menu_item_check label="WyÅ›wietlaj ikonki znajomych" name="show_buddy_icons"/> + <menu_item_check label="WyÅ›wietlaj imiona" name="show_names"/> + <menu_item_check label="WyÅ›wietlaj ikonki i imiona" name="show_icons_and_names"/> + <menu_item_call label="Rozmiar czcionki" name="font_size"/> </menu> diff --git a/indra/newview/skins/default/xui/pl/menu_notification_well_button.xml b/indra/newview/skins/default/xui/pl/menu_notification_well_button.xml new file mode 100644 index 0000000000..bd3d42f9b1 --- /dev/null +++ b/indra/newview/skins/default/xui/pl/menu_notification_well_button.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Notification Well Button Context Menu"> + <menu_item_call label="Zamknij" name="Close All"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/pl/menu_object.xml b/indra/newview/skins/default/xui/pl/menu_object.xml index bdeeb61bf4..763b120f89 100644 --- a/indra/newview/skins/default/xui/pl/menu_object.xml +++ b/indra/newview/skins/default/xui/pl/menu_object.xml @@ -4,21 +4,24 @@ <menu_item_call label="Edytuj" name="Edit..."/> <menu_item_call label="Buduj" name="Build"/> <menu_item_call label="Otwórz" name="Open"/> - <menu_item_call label="UsiÄ…dź Tutaj" name="Object Sit"/> + <menu_item_call label="UsiÄ…dź tutaj" name="Object Sit"/> + <menu_item_call label="WstaÅ„" name="Object Stand Up"/> <menu_item_call label="Sprawdź" name="Object Inspect"/> - <context_menu label="Połóż >" name="Put On"> + <menu_item_call label="Przybliż" name="Zoom In"/> + <context_menu label="Załóż na â–¶" name="Put On"> <menu_item_call label="Załóż" name="Wear"/> - <context_menu label="Dołącz do >" name="Object Attach"/> - <context_menu label="Dołącz do HUD >" name="Object Attach HUD"/> + <context_menu label="Dołącz â–¶" name="Object Attach"/> + <context_menu label="Dołącz HUD â–¶" name="Object Attach HUD"/> </context_menu> - <context_menu label="UsuÅ„ >" name="Remove"> - <menu_item_call label="Weź" name="Pie Object Take"/> + <context_menu label="UsuÅ„ â–¶" name="Remove"> <menu_item_call label="Raport" name="Report Abuse..."/> <menu_item_call label="Zablokuj" name="Object Mute"/> <menu_item_call label="Zwróć" name="Return..."/> <menu_item_call label="UsuÅ„" name="Delete"/> </context_menu> - <menu_item_call label="Weź KopiÄ™" name="Take Copy"/> + <menu_item_call label="Kup" name="Pie Object Bye"/> + <menu_item_call label="Weź" name="Pie Object Take"/> + <menu_item_call label="Weź kopiÄ™" name="Take Copy"/> <menu_item_call label="ZapÅ‚ać" name="Pay..."/> <menu_item_call label="Kup" name="Buy..."/> </context_menu> diff --git a/indra/newview/skins/default/xui/pl/menu_participant_list.xml b/indra/newview/skins/default/xui/pl/menu_participant_list.xml index 604ee2d104..079b8558da 100644 --- a/indra/newview/skins/default/xui/pl/menu_participant_list.xml +++ b/indra/newview/skins/default/xui/pl/menu_participant_list.xml @@ -1,16 +1,20 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Participant List Context Menu"> + <menu_item_check label="Sortuj wedÅ‚ug imienia" name="SortByName"/> + <menu_item_check label="Sortuj wedÅ‚ug ostatniego mówcy" name="SortByRecentSpeakers"/> <menu_item_call label="Zobacz Profil" name="View Profile"/> <menu_item_call label="Dodaj Znajomość" name="Add Friend"/> <menu_item_call label="IM" name="IM"/> <menu_item_call label="ZadzwoÅ„" name="Call"/> <menu_item_call label="UdostÄ™pnij" name="Share"/> <menu_item_call label="ZapÅ‚ać" name="Pay"/> - <menu_item_check label="Zablokuj/Odblokuj" name="Block/Unblock"/> - <menu_item_check label="Zablokuj Tekst" name="MuteText"/> - <menu_item_check label="Odblokuj Tekst" name="AllowTextChat"/> - <menu_item_call label="Zablokuj tego uczestnika" name="ModerateVoiceMuteSelected"/> - <menu_item_call label="Zablokuj wszystkich pozostaÅ‚ych" name="ModerateVoiceMuteOthers"/> - <menu_item_call label="Oblokuj tego uczestnika" name="ModerateVoiceUnMuteSelected"/> - <menu_item_call label="Odblokuj wszystkich pozostaÅ‚ych" name="ModerateVoiceUnMuteOthers"/> + <menu_item_check label="Zablokuj gÅ‚os" name="Block/Unblock"/> + <menu_item_check label="Zablokuj tekst" name="MuteText"/> + <context_menu label="Opcje Moderatora >" name="Moderator Options"> + <menu_item_check label="Czat/IM dozwolony" name="AllowTextChat"/> + <menu_item_call label="Wycisz tego uczestnika" name="ModerateVoiceMuteSelected"/> + <menu_item_call label="Wycisz wszystkich pozostaÅ‚ych" name="ModerateVoiceMuteOthers"/> + <menu_item_call label="Odblokuj wyciszenie tego uczestnika" name="ModerateVoiceUnMuteSelected"/> + <menu_item_call label="Odblokuj wyciszenie wszystkich" name="ModerateVoiceUnMuteOthers"/> + </context_menu> </context_menu> diff --git a/indra/newview/skins/default/xui/pl/menu_people_friends_view_sort.xml b/indra/newview/skins/default/xui/pl/menu_people_friends_view_sort.xml index 0043030035..9c33fad00f 100644 --- a/indra/newview/skins/default/xui/pl/menu_people_friends_view_sort.xml +++ b/indra/newview/skins/default/xui/pl/menu_people_friends_view_sort.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="menu_group_plus"> - <menu_item_check label="PorzÄ…dkuj WedÅ‚ug Nazwy" name="sort_name"/> - <menu_item_check label="PorzÄ…dkuj WedÅ‚ug Statusu" name="sort_status"/> - <menu_item_check label="WyÅ›wietlaj Ikonki" name="view_icons"/> - <menu_item_call label="Pokaż Zablokowanych Rezydentów & Obiekty" name="show_blocked_list"/> + <menu_item_check label="PorzÄ…dkuj wedÅ‚ug nazwy" name="sort_name"/> + <menu_item_check label="PorzÄ…dkuj wedÅ‚ug statusu" name="sort_status"/> + <menu_item_check label="WyÅ›wietlaj ikonki" name="view_icons"/> + <menu_item_call label="Pokaż zablokowanych Rezydentów & obiekty" name="show_blocked_list"/> </menu> diff --git a/indra/newview/skins/default/xui/pl/menu_people_groups.xml b/indra/newview/skins/default/xui/pl/menu_people_groups.xml new file mode 100644 index 0000000000..567482dcda --- /dev/null +++ b/indra/newview/skins/default/xui/pl/menu_people_groups.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_group_plus"> + <menu_item_call label="Zobacz Info" name="View Info"/> + <menu_item_call label="Czat" name="Chat"/> + <menu_item_call label="Rozmowa" name="Call"/> + <menu_item_call label="Aktywuj" name="Activate"/> + <menu_item_call label="Opuść" name="Leave"/> +</menu> diff --git a/indra/newview/skins/default/xui/pl/menu_people_groups_view_sort.xml b/indra/newview/skins/default/xui/pl/menu_people_groups_view_sort.xml index f661cfeba0..4be60d9b83 100644 --- a/indra/newview/skins/default/xui/pl/menu_people_groups_view_sort.xml +++ b/indra/newview/skins/default/xui/pl/menu_people_groups_view_sort.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="menu_group_plus"> - <menu_item_check label="WyÅ›wietlaj Ikonki Grupy" name="Display Group Icons"/> - <menu_item_call label="Opuść Zaznaczone Grupy" name="Leave Selected Group"/> + <menu_item_check label="WyÅ›wietlaj ikonki Grupy" name="Display Group Icons"/> + <menu_item_call label="Opuść zaznaczone Grupy" name="Leave Selected Group"/> </menu> diff --git a/indra/newview/skins/default/xui/pl/menu_people_nearby.xml b/indra/newview/skins/default/xui/pl/menu_people_nearby.xml index 0f80b56c16..afe3a5200b 100644 --- a/indra/newview/skins/default/xui/pl/menu_people_nearby.xml +++ b/indra/newview/skins/default/xui/pl/menu_people_nearby.xml @@ -2,9 +2,12 @@ <context_menu name="Avatar Context Menu"> <menu_item_call label="Zobacz Profil" name="View Profile"/> <menu_item_call label="Dodaj Znajomość" name="Add Friend"/> + <menu_item_call label="UsuÅ„ z listy Znajomych" name="Remove Friend"/> <menu_item_call label="IM" name="IM"/> <menu_item_call label="ZadzwoÅ„" name="Call"/> + <menu_item_call label="Mapa" name="Map"/> <menu_item_call label="UdostÄ™pnij" name="Share"/> <menu_item_call label="ZapÅ‚ać" name="Pay"/> <menu_item_check label="Zablokuj/Odblokuj" name="Block/Unblock"/> + <menu_item_call label="Teleportuj" name="teleport"/> </context_menu> diff --git a/indra/newview/skins/default/xui/pl/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/pl/menu_people_nearby_multiselect.xml index 156c10e3f3..bc89402a96 100644 --- a/indra/newview/skins/default/xui/pl/menu_people_nearby_multiselect.xml +++ b/indra/newview/skins/default/xui/pl/menu_people_nearby_multiselect.xml @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Multi-Selected People Context Menu"> <menu_item_call label="Dodaj Znajomych" name="Add Friends"/> + <menu_item_call label="UsuÅ„ Znajomych" name="Remove Friend"/> <menu_item_call label="IM" name="IM"/> <menu_item_call label="ZadzwoÅ„" name="Call"/> <menu_item_call label="UdostÄ™pnij" name="Share"/> diff --git a/indra/newview/skins/default/xui/pl/menu_people_nearby_view_sort.xml b/indra/newview/skins/default/xui/pl/menu_people_nearby_view_sort.xml index 9e5f1a5917..8ec3820f84 100644 --- a/indra/newview/skins/default/xui/pl/menu_people_nearby_view_sort.xml +++ b/indra/newview/skins/default/xui/pl/menu_people_nearby_view_sort.xml @@ -1,8 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="menu_group_plus"> - <menu_item_check label="PorzÄ…dkuj WedÅ‚ug Ostatnich Rozmówców" name="sort_by_recent_speakers"/> - <menu_item_check label="PorzÄ…dkuj WedÅ‚ug Nazwy" name="sort_name"/> - <menu_item_check label="PorzÄ…dkuj WedÅ‚ug OdlegÅ‚oÅ›ci" name="sort_distance"/> - <menu_item_check label="WyÅ›wietlaj Ikonki" name="view_icons"/> - <menu_item_call label="Pokaż Zablokowanych Rezydentów & Obiekty" name="show_blocked_list"/> + <menu_item_check label="PorzÄ…dkuj wedÅ‚ug ostatnich rozmówców" name="sort_by_recent_speakers"/> + <menu_item_check label="PorzÄ…dkuj wedÅ‚ug nazwy" name="sort_name"/> + <menu_item_check label="PorzÄ…dkuj wedÅ‚ug odlegÅ‚oÅ›ci" name="sort_distance"/> + <menu_item_check label="WyÅ›wietlaj ikonki" name="view_icons"/> + <menu_item_call label="Pokaż zablokowanych Rezydentów & obiekty" name="show_blocked_list"/> </menu> diff --git a/indra/newview/skins/default/xui/pl/menu_people_recent_view_sort.xml b/indra/newview/skins/default/xui/pl/menu_people_recent_view_sort.xml index 418b67bce8..b474a556bd 100644 --- a/indra/newview/skins/default/xui/pl/menu_people_recent_view_sort.xml +++ b/indra/newview/skins/default/xui/pl/menu_people_recent_view_sort.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="menu_group_plus"> - <menu_item_check label="PorzÄ…dkuj WedÅ‚ug Daty" name="sort_most"/> - <menu_item_check label="PorzÄ…dkuj WedÅ‚ug Nazwy" name="sort_name"/> - <menu_item_check label="WyÅ›wietlaj Ikonki" name="view_icons"/> - <menu_item_call label="Pokaż Zablokowanych Rezydentów & Obiekty" name="show_blocked_list"/> + <menu_item_check label="PorzÄ…dkuj wedÅ‚ug daty" name="sort_most"/> + <menu_item_check label="PorzÄ…dkuj wedÅ‚ug nazwy" name="sort_name"/> + <menu_item_check label="WyÅ›wietlaj ikonki" name="view_icons"/> + <menu_item_call label="Pokaż zablokowanych Rezydentów & obiekty" name="show_blocked_list"/> </menu> diff --git a/indra/newview/skins/default/xui/pl/menu_picks_plus.xml b/indra/newview/skins/default/xui/pl/menu_picks_plus.xml index 14ab9c2978..8f196612a8 100644 --- a/indra/newview/skins/default/xui/pl/menu_picks_plus.xml +++ b/indra/newview/skins/default/xui/pl/menu_picks_plus.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <toggleable_menu name="picks_plus_menu"> - <menu_item_call label="Utwórz" name="create_pick"/> + <menu_item_call label="Stwórz" name="create_pick"/> <menu_item_call label="Nowa Reklama" name="create_classified"/> </toggleable_menu> diff --git a/indra/newview/skins/default/xui/pl/menu_place.xml b/indra/newview/skins/default/xui/pl/menu_place.xml index 72f4b1265f..312bfc6bb0 100644 --- a/indra/newview/skins/default/xui/pl/menu_place.xml +++ b/indra/newview/skins/default/xui/pl/menu_place.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <toggleable_menu name="place_overflow_menu"> - <menu_item_call label="Zapisz Ulubione Miejsce" name="landmark"/> + <menu_item_call label="Zapisz Landmark" name="landmark"/> <menu_item_call label="Utwórz" name="pick"/> - <menu_item_call label="Kup WstÄ™p" name="pass"/> + <menu_item_call label="Kup PrzepustkÄ™" name="pass"/> <menu_item_call label="Edytuj" name="edit"/> </toggleable_menu> diff --git a/indra/newview/skins/default/xui/pl/menu_place_add_button.xml b/indra/newview/skins/default/xui/pl/menu_place_add_button.xml index a737fc49ce..6175671fb9 100644 --- a/indra/newview/skins/default/xui/pl/menu_place_add_button.xml +++ b/indra/newview/skins/default/xui/pl/menu_place_add_button.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="menu_folder_gear"> - <menu_item_call label="Dodaj Folder" name="add_folder"/> - <menu_item_call label="Dodaj do Ulubionych Miejsc" name="add_landmark"/> + <menu_item_call label="Dodaj folder" name="add_folder"/> + <menu_item_call label="Dodaj do Landmarków" name="add_landmark"/> </menu> diff --git a/indra/newview/skins/default/xui/pl/menu_places_gear_folder.xml b/indra/newview/skins/default/xui/pl/menu_places_gear_folder.xml index f5ece87b28..d17b6c1033 100644 --- a/indra/newview/skins/default/xui/pl/menu_places_gear_folder.xml +++ b/indra/newview/skins/default/xui/pl/menu_places_gear_folder.xml @@ -1,15 +1,15 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="menu_folder_gear"> - <menu_item_call label="Dodaj do Ulubionych Miejsc" name="add_landmark"/> - <menu_item_call label="Dodaj Folder" name="add_folder"/> + <menu_item_call label="Dodaj do Landmarków" name="add_landmark"/> + <menu_item_call label="Dodaj folder" name="add_folder"/> <menu_item_call label="Wytnij" name="cut"/> <menu_item_call label="Kopiuj" name="copy_folder"/> <menu_item_call label="Wklej" name="paste"/> - <menu_item_call label="ZmieÅ„ NazwÄ™" name="rename"/> + <menu_item_call label="ZmieÅ„ nazwÄ™" name="rename"/> <menu_item_call label="UsuÅ„" name="delete"/> <menu_item_call label="RozwiÅ„" name="expand"/> <menu_item_call label="Schowaj" name="collapse"/> - <menu_item_call label="RozwiÅ„ Wszystkie Foldery" name="expand_all"/> - <menu_item_call label="Schowaj Wszystkie Foldery" name="collapse_all"/> + <menu_item_call label="RozwiÅ„ wszystkie foldery" name="expand_all"/> + <menu_item_call label="Schowaj wszystkie foldery" name="collapse_all"/> <menu_item_check label="Sortuj wedÅ‚ug daty" name="sort_by_date"/> </menu> diff --git a/indra/newview/skins/default/xui/pl/menu_places_gear_landmark.xml b/indra/newview/skins/default/xui/pl/menu_places_gear_landmark.xml index e88f650ed0..0720aea8aa 100644 --- a/indra/newview/skins/default/xui/pl/menu_places_gear_landmark.xml +++ b/indra/newview/skins/default/xui/pl/menu_places_gear_landmark.xml @@ -1,18 +1,18 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="menu_ladmark_gear"> <menu_item_call label="Teleportuj" name="teleport"/> - <menu_item_call label="WiÄ™cej Informacji" name="more_info"/> - <menu_item_call label="Pokaż na Mapie" name="show_on_map"/> - <menu_item_call label="Dodaj do Ulubionych Miejsc" name="add_landmark"/> - <menu_item_call label="Dodaj Folder" name="add_folder"/> + <menu_item_call label="WiÄ™cej informacji" name="more_info"/> + <menu_item_call label="Pokaż na mapie" name="show_on_map"/> + <menu_item_call label="Dodaj do Landmarków" name="add_landmark"/> + <menu_item_call label="Dodaj folder" name="add_folder"/> <menu_item_call label="Wytnij" name="cut"/> - <menu_item_call label="Kopiuj Ulubione Miejsce" name="copy_landmark"/> + <menu_item_call label="Kopiuj Landmark" name="copy_landmark"/> <menu_item_call label="Kopiuj SLurl" name="copy_slurl"/> <menu_item_call label="Wklej" name="paste"/> - <menu_item_call label="ZmieÅ„ NazwÄ™" name="rename"/> + <menu_item_call label="ZmieÅ„ nazwÄ™" name="rename"/> <menu_item_call label="UsuÅ„" name="delete"/> - <menu_item_call label="RozwiÅ„ Wszystkie Foldery" name="expand_all"/> - <menu_item_call label="Schowaj Wszystkie Foldery" name="collapse_all"/> + <menu_item_call label="RozwiÅ„ wszystkie foldery" name="expand_all"/> + <menu_item_call label="Schowaj wszystkie foldery" name="collapse_all"/> <menu_item_check label="Sortuj wedÅ‚ug daty" name="sort_by_date"/> <menu_item_call label="Stwórz Ulubione" name="create_pick"/> </menu> diff --git a/indra/newview/skins/default/xui/pl/menu_profile_overflow.xml b/indra/newview/skins/default/xui/pl/menu_profile_overflow.xml index 8405d48e49..ef836c8ecf 100644 --- a/indra/newview/skins/default/xui/pl/menu_profile_overflow.xml +++ b/indra/newview/skins/default/xui/pl/menu_profile_overflow.xml @@ -1,5 +1,12 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <toggleable_menu name="profile_overflow_menu"> + <menu_item_call label="Mapa" name="show_on_map"/> <menu_item_call label="ZapÅ‚ać" name="pay"/> <menu_item_call label="UdostÄ™pnij" name="share"/> + <menu_item_call label="Zablokuj" name="block"/> + <menu_item_call label="Odblokuj" name="unblock"/> + <menu_item_call label="Wyrzuć" name="kick"/> + <menu_item_call label="Unieruchom" name="freeze"/> + <menu_item_call label="Uruchom" name="unfreeze"/> + <menu_item_call label="CSR" name="csr"/> </toggleable_menu> diff --git a/indra/newview/skins/default/xui/pl/menu_slurl.xml b/indra/newview/skins/default/xui/pl/menu_slurl.xml index 719959df6a..719959df6a 100755..100644 --- a/indra/newview/skins/default/xui/pl/menu_slurl.xml +++ b/indra/newview/skins/default/xui/pl/menu_slurl.xml diff --git a/indra/newview/skins/default/xui/pl/menu_teleport_history_item.xml b/indra/newview/skins/default/xui/pl/menu_teleport_history_item.xml index 7e58747267..cd36c116b0 100644 --- a/indra/newview/skins/default/xui/pl/menu_teleport_history_item.xml +++ b/indra/newview/skins/default/xui/pl/menu_teleport_history_item.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Teleport History Item Context Menu"> <menu_item_call label="Teleportuj" name="Teleport"/> - <menu_item_call label="WiÄ™cej Szczegółów" name="More Information"/> + <menu_item_call label="WiÄ™cej szczegółów" name="More Information"/> <menu_item_call label="Kopiuj do schowka" name="CopyToClipboard"/> </context_menu> diff --git a/indra/newview/skins/default/xui/pl/menu_url_agent.xml b/indra/newview/skins/default/xui/pl/menu_url_agent.xml index 0f210b140b..7c90e6582d 100644 --- a/indra/newview/skins/default/xui/pl/menu_url_agent.xml +++ b/indra/newview/skins/default/xui/pl/menu_url_agent.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> <menu_item_call label="Pokaż Profil Rezydenta" name="show_agent"/> - <menu_item_call label="Kopiuj NazwÄ™ do Schowka" name="url_copy_label"/> + <menu_item_call label="Kopiuj nazwÄ™ do schowka" name="url_copy_label"/> <menu_item_call label="Kopiuj SLurl do schowka" name="url_copy"/> </context_menu> diff --git a/indra/newview/skins/default/xui/pl/menu_url_group.xml b/indra/newview/skins/default/xui/pl/menu_url_group.xml index 38e4360691..109f96e562 100644 --- a/indra/newview/skins/default/xui/pl/menu_url_group.xml +++ b/indra/newview/skins/default/xui/pl/menu_url_group.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> - <menu_item_call label="Pokaż Szczegóły o Grupie" name="show_group"/> - <menu_item_call label="Kopiuj GrupÄ™ do Schowka" name="url_copy_label"/> + <menu_item_call label="Pokaż szczegóły o Grupie" name="show_group"/> + <menu_item_call label="Kopiuj GrupÄ™ do schowka" name="url_copy_label"/> <menu_item_call label="Kopiuj SLurl do schowka" name="url_copy"/> </context_menu> diff --git a/indra/newview/skins/default/xui/pl/menu_url_http.xml b/indra/newview/skins/default/xui/pl/menu_url_http.xml index 0d8793d41e..e73f7b6745 100644 --- a/indra/newview/skins/default/xui/pl/menu_url_http.xml +++ b/indra/newview/skins/default/xui/pl/menu_url_http.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> - <menu_item_call label="Otwórz PrzeglÄ…darkÄ™ InternetowÄ…" name="url_open"/> - <menu_item_call label="Otwórz w WewnÄ™trzenej PrzeglÄ…darce" name="url_open_internal"/> - <menu_item_call label="Otwórz w ZewnÄ™trznej PrzeglÄ…darce" name="url_open_external"/> + <menu_item_call label="Otwórz przeglÄ…darkÄ™ internetowÄ…" name="url_open"/> + <menu_item_call label="Otwórz w wewnÄ™trzenej przeglÄ…darce" name="url_open_internal"/> + <menu_item_call label="Otwórz w zewnÄ™trznej przeglÄ…darce" name="url_open_external"/> <menu_item_call label="Kopiuj URL do schowka" name="url_copy"/> </context_menu> diff --git a/indra/newview/skins/default/xui/pl/menu_url_inventory.xml b/indra/newview/skins/default/xui/pl/menu_url_inventory.xml index c11860d6fe..ce3309cba0 100644 --- a/indra/newview/skins/default/xui/pl/menu_url_inventory.xml +++ b/indra/newview/skins/default/xui/pl/menu_url_inventory.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> - <menu_item_call label="Pokaż Obiekt w Szafie" name="show_item"/> - <menu_item_call label="Kopiuj NazwÄ™ do Schowka" name="url_copy_label"/> + <menu_item_call label="Pokaż obiekt w Szafie" name="show_item"/> + <menu_item_call label="Kopiuj nazwÄ™ do schowka" name="url_copy_label"/> <menu_item_call label="Kopiuj SLurl do schowka" name="url_copy"/> </context_menu> diff --git a/indra/newview/skins/default/xui/pl/menu_url_map.xml b/indra/newview/skins/default/xui/pl/menu_url_map.xml index becbd8276f..179ab1f676 100644 --- a/indra/newview/skins/default/xui/pl/menu_url_map.xml +++ b/indra/newview/skins/default/xui/pl/menu_url_map.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> - <menu_item_call label="Pokaż na Mapie" name="show_on_map"/> - <menu_item_call label="Teleportuj do Miejsca" name="teleport_to_location"/> + <menu_item_call label="Pokaż na mapie" name="show_on_map"/> + <menu_item_call label="Teleportuj do miejsca" name="teleport_to_location"/> <menu_item_call label="Kopiuj SLurl do schowka" name="url_copy"/> </context_menu> diff --git a/indra/newview/skins/default/xui/pl/menu_url_objectim.xml b/indra/newview/skins/default/xui/pl/menu_url_objectim.xml index 0bdf1da2a4..7576208a9e 100644 --- a/indra/newview/skins/default/xui/pl/menu_url_objectim.xml +++ b/indra/newview/skins/default/xui/pl/menu_url_objectim.xml @@ -1,8 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> - <menu_item_call label="Pokaż Szczegóły o Obiekcie" name="show_object"/> - <menu_item_call label="Pokaż na Mapie" name="show_on_map"/> - <menu_item_call label="Teleportuj to Miejsca Obiektu" name="teleport_to_object"/> - <menu_item_call label="Kopiuj NazwÄ™ Obiektu do Schowka" name="url_copy_label"/> + <menu_item_call label="Pokaż szczegóły o obiekcie" name="show_object"/> + <menu_item_call label="Pokaż na mapie" name="show_on_map"/> + <menu_item_call label="Teleportuj to miejsca obiektu" name="teleport_to_object"/> + <menu_item_call label="Kopiuj nazwÄ™ obiektu do schowka" name="url_copy_label"/> <menu_item_call label="Kopiuj SLurl do schowka" name="url_copy"/> </context_menu> diff --git a/indra/newview/skins/default/xui/pl/menu_url_parcel.xml b/indra/newview/skins/default/xui/pl/menu_url_parcel.xml index 881c010bc1..43b945b8be 100644 --- a/indra/newview/skins/default/xui/pl/menu_url_parcel.xml +++ b/indra/newview/skins/default/xui/pl/menu_url_parcel.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> - <menu_item_call label="Pokaż Szczegóły o Miejscu" name="show_parcel"/> - <menu_item_call label="Pokaż na Mapie" name="show_on_map"/> + <menu_item_call label="Pokaż szczegóły o Miejscu" name="show_parcel"/> + <menu_item_call label="Pokaż na mapie" name="show_on_map"/> <menu_item_call label="Kopiuj SLurl do schowka" name="url_copy"/> </context_menu> diff --git a/indra/newview/skins/default/xui/pl/menu_url_slurl.xml b/indra/newview/skins/default/xui/pl/menu_url_slurl.xml index b9fa692365..456146d8e5 100644 --- a/indra/newview/skins/default/xui/pl/menu_url_slurl.xml +++ b/indra/newview/skins/default/xui/pl/menu_url_slurl.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> - <menu_item_call label="Pokaż Szczegóły o Miejscu" name="show_place"/> - <menu_item_call label="Pokaż na Mapie" name="show_on_map"/> + <menu_item_call label="Pokaż szczegóły o Miejscu" name="show_place"/> + <menu_item_call label="Pokaż na mapie" name="show_on_map"/> <menu_item_call label="Teleportuj do miejsca" name="teleport_to_location"/> <menu_item_call label="Kopiuj SLurl do schowka" name="url_copy"/> </context_menu> diff --git a/indra/newview/skins/default/xui/pl/menu_viewer.xml b/indra/newview/skins/default/xui/pl/menu_viewer.xml index 2a5842e553..d1f0ac0e5c 100755..100644 --- a/indra/newview/skins/default/xui/pl/menu_viewer.xml +++ b/indra/newview/skins/default/xui/pl/menu_viewer.xml @@ -7,44 +7,45 @@ <menu_item_call label="Mój Profil" name="Profile"/> <menu_item_call label="Mój WyglÄ…d" name="Appearance"/> <menu_item_check label="Moja Szafa" name="Inventory"/> - <menu_item_call label="Pokaż SzafÄ™ w Schowku" name="ShowSidetrayInventory"/> - <menu_item_call label="Moje Gesturki" name="Gestures"/> + <menu_item_check label="Moja Szafa" name="ShowSidetrayInventory"/> + <menu_item_check label="Moje Gesty" name="Gestures"/> <menu label="Mój Status" name="Status"> <menu_item_call label="Tryb Oddalenia" name="Set Away"/> <menu_item_call label="Tryb Pracy" name="Set Busy"/> </menu> - <menu_item_call label="ZarzÄ…daj Statusu Administratora" name="Request Admin Options"/> + <menu_item_call label="Zażądaj Statusu Administratora" name="Request Admin Options"/> <menu_item_call label="Wyłącz Status Administratora" name="Leave Admin Options"/> <menu_item_call label="Wyłącz [APP_NAME]" name="Quit"/> </menu> - <menu label="Kommunikacja" name="Communicate"> + <menu label="Komunikacja" name="Communicate"> <menu_item_call label="Znajomi" name="My Friends"/> <menu_item_call label="Grupy" name="My Groups"/> <menu_item_check label="Czat Lokalny" name="Nearby Chat"/> <menu_item_call label="Osoby w Pobliżu" name="Active Speakers"/> - <menu_item_check label="Media w Pobliżu" name="Nearby Media"/> </menu> <menu label="Åšwiat" name="World"> - <menu_item_check label="Ustawienia Ruchu" name="Movement Controls"/> - <menu_item_check label="Widok" name="Camera Controls"/> - <menu_item_call label="O PosiadÅ‚oÅ›ci" name="About Land"/> - <menu_item_call label="Region/MajÄ…tek" name="Region/Estate"/> + <menu_item_check label="Mini-Mapa" name="Mini-Map"/> + <menu_item_check label="Mapa Åšwiata" name="World Map"/> + <menu_item_call label="Zrób ZdjÄ™cie" name="Take Snapshot"/> + <menu_item_call label="ZapamiÄ™taj to Miejsce" name="Create Landmark Here"/> + <menu label="Miejsce" name="Land"> + <menu_item_call label="O PosiadÅ‚oÅ›ci" name="About Land"/> + <menu_item_call label="Region/MajÄ…tek" name="Region/Estate"/> + </menu> <menu_item_call label="Kup PosiadÅ‚ość" name="Buy Land"/> <menu_item_call label="Moje PosiadÅ‚oÅ›ci" name="My Land"/> - <menu label="Pokaż" name="Land"> - <menu_item_check label="Linie Banu" name="Ban Lines"/> + <menu label="Pokaż" name="LandShow"> + <menu_item_check label="Ustawienia Ruchu" name="Movement Controls"/> + <menu_item_check label="Zobacz Ustawienia" name="Camera Controls"/> + <menu_item_check label="Linie Bana" name="Ban Lines"/> <menu_item_check label="Emitery" name="beacons"/> <menu_item_check label="Granice PosiadÅ‚oÅ›ci" name="Property Lines"/> <menu_item_check label="WÅ‚aÅ›ciciele PosiadÅ‚oÅ›ci" name="Land Owners"/> + <menu_item_check label="WspółrzÄ™dne" name="Coordinates"/> + <menu_item_check label="WÅ‚aÅ›ciwoÅ›ci PosiadÅ‚oÅ›ci" name="Parcel Properties"/> </menu> - <menu label="Ulubione Miejsca" name="Landmarks"> - <menu_item_call label="Zapisz Ulubione Miejsce" name="Create Landmark Here"/> - <menu_item_call label="Ustaw Miejsce Startu" name="Set Home to Here"/> - </menu> - <menu_item_call label="Miejsce Startu" name="Teleport Home"/> - <menu_item_check label="Mini-Mapa" name="Mini-Map"/> - <menu_item_check label="Mapa Åšwiata" name="World Map"/> - <menu_item_call label="Zrób ZdjÄ™cie" name="Take Snapshot"/> + <menu_item_call label="Teleportuj do Miejsca Startu" name="Teleport Home"/> + <menu_item_call label="Ustaw Miejsce Startu" name="Set Home to Here"/> <menu label="SÅ‚oÅ„ce" name="Environment Settings"> <menu_item_call label="Wschód SÅ‚oÅ„ca" name="Sunrise"/> <menu_item_call label="PoÅ‚udnie" name="Noon"/> @@ -74,12 +75,14 @@ <menu_item_call label="Zaznacz Wszystko" name="Select All"/> <menu_item_call label="Cofnij Zaznaczenie" name="Deselect"/> </menu> - <menu_item_call label="Grupuj" name="Link"/> + <menu_item_call label="Linkuj" name="Link"/> <menu_item_call label="Rozlinkuj" name="Unlink"/> + <menu_item_check label="Edytuj Zgrupowane Obiekty" name="Edit Linked Parts"/> <menu_item_call label="Ogniskowa Selekcji" name="Focus on Selection"/> <menu_item_call label="Przybliż do Selekcji" name="Zoom to Selection"/> <menu label="Obiekt" name="Object"> - <menu_item_call label="Kup" name="Menu Object Take"/> + <menu_item_call label="Kup" name="Menu Object Buy"/> + <menu_item_call label="Weź" name="Menu Object Take"/> <menu_item_call label="Weź KopiÄ™" name="Take Copy"/> <menu_item_call label="Zapisz Obiekt do Szafy" name="Save Object Back to My Inventory"/> <menu_item_call label="Zapisz do TreÅ›ci Obiektu" name="Save Object Back to Object Contents"/> @@ -92,25 +95,18 @@ <menu_item_call label="Wstrzymaj DziaÅ‚anie Skryptów w Selekcji" name="Set Scripts to Not Running"/> </menu> <menu label="Opcje" name="Options"> - <menu_item_check label="Edytuj Części Zlinkowane" name="Edit Linked Parts"/> <menu_item_call label="Ustaw DomyÅ›lne Pozwolenia Åadowania" name="perm prefs"/> <menu_item_check label="Pokaż Zaawansowane Pozwolenia" name="DebugPermissions"/> - <menu label="Selekcja" name="Selection"> - <menu_item_check label="Wybierz Tylko Moje Obiekty" name="Select Only My Objects"/> - <menu_item_check label="Zaznacz Tylko PoruszajÄ…ce siÄ™ Obiekty" name="Select Only Movable Objects"/> - <menu_item_check label="Wybierz Przez Zaznaczenie" name="Select By Surrounding"/> - </menu> - <menu label="Pokaż" name="Show"> - <menu_item_check label="Pokaż UkrytÄ… SelekcjÄ™" name="Show Hidden Selection"/> - <menu_item_check label="Pokaż PromieÅ„ ÅšwiatÅ‚a dla Selekcji" name="Show Light Radius for Selection"/> - <menu_item_check label="Pokaż Emitery Selekcji" name="Show Selection Beam"/> - </menu> - <menu label="Siatka" name="Grid"> - <menu_item_check label="PrzeciÄ…gnij Obiekt" name="Snap to Grid"/> - <menu_item_call label="PrzeciÄ…gnij Obiekt XY do Siatki" name="Snap Object XY to Grid"/> - <menu_item_call label="Zastosuj Zaznaczenie dla Siatki" name="Use Selection for Grid"/> - <menu_item_call label="Ustawienia Siatki" name="Grid Options"/> - </menu> + <menu_item_check label="Wybierz Tylko Moje Obiekty" name="Select Only My Objects"/> + <menu_item_check label="Wybierz Tylko Obiekty Przesuwalne" name="Select Only Movable Objects"/> + <menu_item_check label="Wybierz przez Otoczenie" name="Select By Surrounding"/> + <menu_item_check label="Zobacz UkrytÄ… SelekcjÄ™" name="Show Hidden Selection"/> + <menu_item_check label="Pokaż PromieÅ„ Emitera dla Selekcji" name="Show Light Radius for Selection"/> + <menu_item_check label="Pokaż Emiter Selekcji" name="Show Selection Beam"/> + <menu_item_check label="Uruchom SiatkÄ™" name="Snap to Grid"/> + <menu_item_call label="PrzeciÄ…gnij Obiekt do Siatki" name="Snap Object XY to Grid"/> + <menu_item_call label="Wybierz Zaznaczenie Siatki" name="Use Selection for Grid"/> + <menu_item_call label="Opcje Siatki" name="Grid Options"/> </menu> <menu label="Wybierz Zlinkowane Części" name="Select Linked Parts"> <menu_item_call label="Wybierz NastÄ™pnÄ… Część" name="Select Next Part"/> @@ -121,15 +117,15 @@ </menu> <menu label="Pomoc" name="Help"> <menu_item_call label="[SECOND_LIFE] Portal Pomocy" name="Second Life Help"/> - <menu_item_call label="Samouczek" name="Tutorial"/> <menu_item_call label="Złóż Raport o Nadużyciu" name="Report Abuse"/> <menu_item_call label="ZgÅ‚oÅ› Błędy Klienta" name="Report Bug"/> + <menu_item_call label="O [APP_NAME]" name="About Second Life"/> </menu> <menu label="Zaawansowane" name="Advanced"> - <menu_item_check label="Uruchom Tryb Oddalenia po 30 Minutach" name="Go Away/AFK When Idle"/> <menu_item_call label="Zatrzymaj Wszystkie Animacje" name="Stop Animating My Avatar"/> <menu_item_call label="Odswież WyÅ›wietlanie Tekstur" name="Rebake Texture"/> <menu_item_call label="DomyÅ›lne Ustawienia Rozmiaru Interfejsu" name="Set UI Size to Default"/> + <menu_item_call label="Ustaw Rozmiar Interfejsu..." name="Set Window Size..."/> <menu_item_check label="Ogranicz Dystans Selekcji" name="Limit Select Distance"/> <menu_item_check label="Wyłącz Ograniczenia ZasiÄ™gu Kamery" name="Disable Camera Distance"/> <menu_item_check label="Wysoka Rozdzielczość Zdjęć" name="HighResSnapshot"/> @@ -176,8 +172,8 @@ <menu_item_check label="Uruchom Wiele WÄ…tków" name="Run Multiple Threads"/> <menu_item_call label="Wyczyść Bufor Danych Grupy" name="ClearGroupCache"/> <menu_item_check label="WygÅ‚adzanie Ruchu Myszki" name="Mouse Smoothing"/> - <menu_item_check label="Pokaż WiadomoÅ›ci w Pobliżu" name="IMInChat"/> <menu label="Skróty" name="Shortcuts"> + <menu_item_call label="Obraz (L$[COST])..." name="Upload Image"/> <menu_item_check label="Szukaj" name="Search"/> <menu_item_call label="Zwolnij Klawisze" name="Release Keys"/> <menu_item_call label="DomyÅ›lne Ustawienia Rozmiaru Interfejsu" name="Set UI Size to Default"/> @@ -189,7 +185,7 @@ <menu_item_call label="Widok Panoramiczny" name="Mouselook"/> <menu_item_check label="Wolna Kamera" name="Joystick Flycam"/> <menu_item_call label="Reset Widoku" name="Reset View"/> - <menu_item_call label="Zobacz Ostatniego Rozmówce" name="Look at Last Chatter"/> + <menu_item_call label="Zobacz Ostatniego RozmówcÄ™" name="Look at Last Chatter"/> <menu label="Wybierz NarzÄ™dzie Budowania" name="Select Tool"> <menu_item_call label="NarzÄ™dzie Ogniskowej" name="Focus"/> <menu_item_call label="NarzÄ™dzie Ruchu" name="Move"/> @@ -205,7 +201,7 @@ <menu_item_call label="Pokaż Ustawienia Debugowania" name="Debug Settings"/> <menu_item_check label="Pokaż Menu Progresu" name="Debug Mode"/> </menu> - <menu label="PostÄ™p" name="Develop"> + <menu label="PostÄ™p..." name="Develop"> <menu label="Konsola" name="Consoles"> <menu_item_check label="Konsola Tekstur" name="Texture Console"/> <menu_item_check label="Debugowanie ZdarzeÅ„ Konsoli" name="Debug Console"/> @@ -217,6 +213,7 @@ <menu_item_call label="Info Regionu do Debugowania Konsoli" name="Region Info to Debug Console"/> <menu_item_check label="Kamera" name="Camera"/> <menu_item_check label="Wiatr" name="Wind"/> + <menu_item_check label="Znak" name="Badge"/> </menu> <menu label="Pokaż Informacje" name="Display Info"> <menu_item_check label="Pokaż Czas" name="Show Time"/> diff --git a/indra/newview/skins/default/xui/pl/mime_types.xml b/indra/newview/skins/default/xui/pl/mime_types.xml index c90d5761e6..cbf2afa91d 100755..100644 --- a/indra/newview/skins/default/xui/pl/mime_types.xml +++ b/indra/newview/skins/default/xui/pl/mime_types.xml @@ -2,13 +2,13 @@ <mimetypes name="default"> <widgetset name="web"> <label name="web_label"> - Zawartość Strony Internetowej + Zawartość przeglÄ…darki internetowej </label> <tooltip name="web_tooltip"> - To miejsce posiada zawartość strony internetowej + To miejsce posiada zawartość przeglÄ…darki internetowej </tooltip> <playtip name="web_playtip"> - Pokaż zawartość strony internetowej + Pokaż zawartość przeglÄ…darki internetowej </playtip> </widgetset> <widgetset name="movie"> diff --git a/indra/newview/skins/default/xui/pl/mime_types_linux.xml b/indra/newview/skins/default/xui/pl/mime_types_linux.xml new file mode 100644 index 0000000000..a2b8168b51 --- /dev/null +++ b/indra/newview/skins/default/xui/pl/mime_types_linux.xml @@ -0,0 +1,217 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<mimetypes name="default"> + <widgetset name="web"> + <label name="web_label"> + Zawartość przeglÄ…darki internetowej + </label> + <tooltip name="web_tooltip"> + W tym miejscu można zobaczyć zawartość przeglÄ…darki internetowej + </tooltip> + <playtip name="web_playtip"> + Pokaż zawartość przeglÄ…darki internetowej + </playtip> + </widgetset> + <widgetset name="movie"> + <label name="movie_label"> + Film + </label> + <tooltip name="movie_tooltip"> + To miejsce wyÅ›witela filmy + </tooltip> + <playtip name="movie_playtip"> + Zacznij odtwarzanie filmu + </playtip> + </widgetset> + <widgetset name="image"> + <label name="image_label"> + Obraz + </label> + <tooltip name="image_tooltip"> + W tym miejscu można zobaczyć obrazy + </tooltip> + <playtip name="image_playtip"> + Zobacz obrazy wyÅ›wietlane w tym miejscu + </playtip> + </widgetset> + <widgetset name="audio"> + <label name="audio_label"> + Audio + </label> + <tooltip name="audio_tooltip"> + W tym miejscu odtwarzane jest audio + </tooltip> + <playtip name="audio_playtip"> + Zacznij odtwarzanie audio + </playtip> + </widgetset> + <scheme name="rtsp"> + <label name="rtsp_label"> + Strumieniowe w czasie rzeczywistym + </label> + </scheme> + <mimetype name="blank"> + <label name="blank_label"> + - Å»adne - + </label> + </mimetype> + <mimetype name="none/none"> + <label name="none/none_label"> + - Å»adne - + </label> + </mimetype> + <mimetype name="audio/*"> + <label name="audio2_label"> + Audio + </label> + </mimetype> + <mimetype name="video/*"> + <label name="video2_label"> + Video + </label> + </mimetype> + <mimetype name="image/*"> + <label name="image2_label"> + Obraz + </label> + </mimetype> + <mimetype name="video/vnd.secondlife.qt.legacy"> + <label name="vnd.secondlife.qt.legacy_label"> + Film (QuickTime) + </label> + </mimetype> + <mimetype name="application/javascript"> + <label name="application/javascript_label"> + Javascript + </label> + </mimetype> + <mimetype name="application/ogg"> + <label name="application/ogg_label"> + Ogg Audio/Video + </label> + </mimetype> + <mimetype name="application/pdf"> + <label name="application/pdf_label"> + Dokument PDF + </label> + </mimetype> + <mimetype name="application/postscript"> + <label name="application/postscript_label"> + Dokument Postscript + </label> + </mimetype> + <mimetype name="application/rtf"> + <label name="application/rtf_label"> + Tekst (RTF) + </label> + </mimetype> + <mimetype name="application/smil"> + <label name="application/smil_label"> + Synchronized Multimedia Integration Language (SMIL) + </label> + </mimetype> + <mimetype name="application/xhtml+xml"> + <label name="application/xhtml+xml_label"> + Strona internetowa (XHTML) + </label> + </mimetype> + <mimetype name="application/x-director"> + <label name="application/x-director_label"> + Macromedia Director + </label> + </mimetype> + <mimetype name="audio/mid"> + <label name="audio/mid_label"> + Audio (MIDI) + </label> + </mimetype> + <mimetype name="audio/mpeg"> + <label name="audio/mpeg_label"> + Audio (MP3) + </label> + </mimetype> + <mimetype name="audio/x-aiff"> + <label name="audio/x-aiff_label"> + Audio (AIFF) + </label> + </mimetype> + <mimetype name="audio/x-wav"> + <label name="audio/x-wav_label"> + Audio (WAV) + </label> + </mimetype> + <mimetype name="image/bmp"> + <label name="image/bmp_label"> + Obraz (BMP) + </label> + </mimetype> + <mimetype name="image/gif"> + <label name="image/gif_label"> + Obraz (GIF) + </label> + </mimetype> + <mimetype name="image/jpeg"> + <label name="image/jpeg_label"> + Obraz (JPEG) + </label> + </mimetype> + <mimetype name="image/png"> + <label name="image/png_label"> + Obraz (PNG) + </label> + </mimetype> + <mimetype name="image/svg+xml"> + <label name="image/svg+xml_label"> + Obraz (SVG) + </label> + </mimetype> + <mimetype name="image/tiff"> + <label name="image/tiff_label"> + Obraz (TIFF) + </label> + </mimetype> + <mimetype name="text/html"> + <label name="text/html_label"> + Strona internetowa + </label> + </mimetype> + <mimetype name="text/plain"> + <label name="text/plain_label"> + Tekst + </label> + </mimetype> + <mimetype name="text/xml"> + <label name="text/xml_label"> + XML + </label> + </mimetype> + <mimetype name="video/mpeg"> + <label name="video/mpeg_label"> + Film (MPEG) + </label> + </mimetype> + <mimetype name="video/mp4"> + <label name="video/mp4_label"> + Film (MP4) + </label> + </mimetype> + <mimetype name="video/quicktime"> + <label name="video/quicktime_label"> + Film (QuickTime) + </label> + </mimetype> + <mimetype name="video/x-ms-asf"> + <label name="video/x-ms-asf_label"> + Film (Windows Media ASF) + </label> + </mimetype> + <mimetype name="video/x-ms-wmv"> + <label name="video/x-ms-wmv_label"> + Film (Windows Media WMV) + </label> + </mimetype> + <mimetype name="video/x-msvideo"> + <label name="video/x-msvideo_label"> + Film (AVI) + </label> + </mimetype> +</mimetypes> diff --git a/indra/newview/skins/default/xui/pl/mime_types_mac.xml b/indra/newview/skins/default/xui/pl/mime_types_mac.xml new file mode 100644 index 0000000000..ae860249bb --- /dev/null +++ b/indra/newview/skins/default/xui/pl/mime_types_mac.xml @@ -0,0 +1,217 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<mimetypes name="default"> + <widgetset name="web"> + <label name="web_label"> + Zawartość przeglÄ…darki internetowej + </label> + <tooltip name="web_tooltip"> + W tym miejscu można zobaczyć zawartość przeglÄ…darki internetowej + </tooltip> + <playtip name="web_playtip"> + Pokaż zawartość przeglÄ…darki internetowej + </playtip> + </widgetset> + <widgetset name="movie"> + <label name="movie_label"> + Film + </label> + <tooltip name="movie_tooltip"> + To miejsce posiada zawartość filmowÄ… + </tooltip> + <playtip name="movie_playtip"> + OglÄ…daj Film + </playtip> + </widgetset> + <widgetset name="image"> + <label name="image_label"> + Obraz + </label> + <tooltip name="image_tooltip"> + To miejsce posiada zwartość graficznÄ… + </tooltip> + <playtip name="image_playtip"> + Zobacz zdjÄ™cie miejsca + </playtip> + </widgetset> + <widgetset name="audio"> + <label name="audio_label"> + Audio + </label> + <tooltip name="audio_tooltip"> + To miejsce posiada zwartość audio + </tooltip> + <playtip name="audio_playtip"> + Rozpocznij odtwarzanie audio + </playtip> + </widgetset> + <scheme name="rtsp"> + <label name="rtsp_label"> + Synchroniczne Strumienie Medialne + </label> + </scheme> + <mimetype name="blank"> + <label name="blank_label"> + - Å»adne - + </label> + </mimetype> + <mimetype name="none/none"> + <label name="none/none_label"> + - Å»adne - + </label> + </mimetype> + <mimetype name="audio/*"> + <label name="audio2_label"> + Audio + </label> + </mimetype> + <mimetype name="video/*"> + <label name="video2_label"> + Video + </label> + </mimetype> + <mimetype name="image/*"> + <label name="image2_label"> + Obraz + </label> + </mimetype> + <mimetype name="video/vnd.secondlife.qt.legacy"> + <label name="vnd.secondlife.qt.legacy_label"> + Film (QuickTime) + </label> + </mimetype> + <mimetype name="application/javascript"> + <label name="application/javascript_label"> + Skrypt Java + </label> + </mimetype> + <mimetype name="application/ogg"> + <label name="application/ogg_label"> + Ogg Audio/Video + </label> + </mimetype> + <mimetype name="application/pdf"> + <label name="application/pdf_label"> + Dokument PDF + </label> + </mimetype> + <mimetype name="application/postscript"> + <label name="application/postscript_label"> + Dokument Postscript + </label> + </mimetype> + <mimetype name="application/rtf"> + <label name="application/rtf_label"> + Dokument RTF + </label> + </mimetype> + <mimetype name="application/smil"> + <label name="application/smil_label"> + JÄ™zyk Integracyjnej Synchronizacji Multimedialnej (SMIL) + </label> + </mimetype> + <mimetype name="application/xhtml+xml"> + <label name="application/xhtml+xml_label"> + Strona Internetowa (XHTML) + </label> + </mimetype> + <mimetype name="application/x-director"> + <label name="application/x-director_label"> + Macromedia Director + </label> + </mimetype> + <mimetype name="audio/mid"> + <label name="audio/mid_label"> + Audio (MIDI) + </label> + </mimetype> + <mimetype name="audio/mpeg"> + <label name="audio/mpeg_label"> + Audio (MP3) + </label> + </mimetype> + <mimetype name="audio/x-aiff"> + <label name="audio/x-aiff_label"> + Audio (AIFF) + </label> + </mimetype> + <mimetype name="audio/x-wav"> + <label name="audio/x-wav_label"> + Audio (WAV) + </label> + </mimetype> + <mimetype name="image/bmp"> + <label name="image/bmp_label"> + Obraz (BMP) + </label> + </mimetype> + <mimetype name="image/gif"> + <label name="image/gif_label"> + Obraz (GIF) + </label> + </mimetype> + <mimetype name="image/jpeg"> + <label name="image/jpeg_label"> + Obraz (JPEG) + </label> + </mimetype> + <mimetype name="image/png"> + <label name="image/png_label"> + Obraz (PNG) + </label> + </mimetype> + <mimetype name="image/svg+xml"> + <label name="image/svg+xml_label"> + Obraz (SVG) + </label> + </mimetype> + <mimetype name="image/tiff"> + <label name="image/tiff_label"> + Obraz (TIFF) + </label> + </mimetype> + <mimetype name="text/html"> + <label name="text/html_label"> + Strona Internetowa + </label> + </mimetype> + <mimetype name="text/plain"> + <label name="text/plain_label"> + Tekst + </label> + </mimetype> + <mimetype name="text/xml"> + <label name="text/xml_label"> + XML + </label> + </mimetype> + <mimetype name="video/mpeg"> + <label name="video/mpeg_label"> + Film (MPEG) + </label> + </mimetype> + <mimetype name="video/mp4"> + <label name="video/mp4_label"> + Film (MP4) + </label> + </mimetype> + <mimetype name="video/quicktime"> + <label name="video/quicktime_label"> + Film (QuickTime) + </label> + </mimetype> + <mimetype name="video/x-ms-asf"> + <label name="video/x-ms-asf_label"> + Film (Windows Media ASF) + </label> + </mimetype> + <mimetype name="video/x-ms-wmv"> + <label name="video/x-ms-wmv_label"> + Film (Windows Media WMV) + </label> + </mimetype> + <mimetype name="video/x-msvideo"> + <label name="video/x-msvideo_label"> + Film (AVI) + </label> + </mimetype> +</mimetypes> diff --git a/indra/newview/skins/default/xui/pl/notifications.xml b/indra/newview/skins/default/xui/pl/notifications.xml index 3cf9be507d..12d68ed30e 100644 --- a/indra/newview/skins/default/xui/pl/notifications.xml +++ b/indra/newview/skins/default/xui/pl/notifications.xml @@ -9,72 +9,43 @@ <global name="implicitclosebutton"> Zamknij </global> - <template name="okbutton"> - <form> - <button - name="OK" - text="$yestext"/> - </form> - </template> - - <template name="okignore"> - <form> - <button - name="OK" - text="$yestext"/> - <ignore text="$ignoretext"/> - </form> - </template> - - <template name="okcancelbuttons"> - <form> - <button - name="OK" - text="$yestext"/> - <button - name="Cancel" - text="$notext"/> - </form> - </template> - - <template name="okcancelignore"> - <form> - <button - name="OK" - text="$yestext"/> - <button - name="Cancel" - text="$notext"/> - <ignore text="$ignoretext"/> - </form> - </template> - - <template name="okhelpbuttons"> - <form> - <button - name="OK" - text="$yestext"/> - <button - name="Help" - text="$helptext"/> - </form> - </template> - - <template name="yesnocancelbuttons"> - <form> - <button - name="Yes" - text="$yestext"/> - <button - name="No" - text="$notext"/> - <button - name="Cancel" - text="$canceltext"/> - </form> - </template> + <template name="okbutton"> + <form> + <button name="OK_okbutton" text="$yestext"/> + </form> + </template> + <template name="okignore"> + <form> + <button name="OK_okignore" text="$yestext"/> + </form> + </template> + <template name="okcancelbuttons"> + <form> + <button name="OK_okcancelbuttons" text="$yestext"/> + <button name="Cancel_okcancelbuttons" text="$notext"/> + </form> + </template> + <template name="okcancelignore"> + <form> + <button name="OK_okcancelignore" text="$yestext"/> + <button name="Cancel_okcancelignore" text="$canceltext"/> + </form> + </template> + <template name="okhelpbuttons"> + <form> + <button name="OK_okhelpbuttons" text="$yestext"/> + <button name="Help" text="$helptext"/> + </form> + </template> + <template name="yesnocancelbuttons"> + <form> + <button name="Yes" text="$yestext"/> + <button name="No" text="$notext"/> + <button name="Cancel_yesnocancelbuttons" text="$canceltext"/> + </form> + </template> <notification functor="GenericAcknowledge" label="Nieznany rodzaj komunikatu" name="MissingAlert"> - Twoja wersja klienta [APP_NAME] nie może wyÅ›wietlić odebranej wiadomoÅ›ci. + Twoja wersja klienta [APP_NAME] nie może wyÅ›wietlić odebranej wiadomoÅ›ci. Upewnij siÄ™, że posiadasz najnowszÄ… wersjÄ™ klienta. Szczegóły błędu: Błąd o nazwie '[_NAME]' nie zostaÅ‚ odnaleziony w pliku notifications.xml. <usetemplate name="okbutton" yestext="OK"/> @@ -97,24 +68,18 @@ Szczegóły błędu: Błąd o nazwie '[_NAME]' nie zostaÅ‚ odnaleziony <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Tak"/> </notification> <notification name="BadInstallation"> - Podczas aktualizacji klienta [APP_NAME] wystÄ…piÅ‚ błąd. ProszÄ™ odwiedzić stronÄ™ secondlife.com by Å›ciÄ…gnąć najnowszÄ… wersje klienta. - <usetemplate - name="okbutton" - yestext="OK"/> + Podczas aktualizacji [APP_NAME] wystÄ…piÅ‚ błąd. ProszÄ™ odwiedzić stronÄ™ [http://get.secondlife.com download the latest version] by Å›ciÄ…gnąć najnowszÄ… wersje klienta. + <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="LoginFailedNoNetwork"> - Błąd sieci: Brak połączenia. + Brak połączenia z [SECOND_LIFE_GRID]. '[DIAGNOSTIC]' Sprawdź stan swojego połączenia sieciowego. - <usetemplate - name="okbutton" - yestext="OK"/> + <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="MessageTemplateNotFound"> Wzór komunikatu dla [PATH] nie odnaleziony. - <usetemplate - name="okbutton" - yestext="OK"/> + <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="WearableSave"> Zapisać zmiany dotyczÄ…ce ubrania/części ciaÅ‚a? @@ -124,7 +89,7 @@ Sprawdź stan swojego połączenia sieciowego. W trakcie Å‚adwania tekstu dla skryptu pojawiÅ‚ siÄ™ problem z nastÄ™pujÄ…cego powodu: [REASON]. Spróbuj ponownie za kilka minut. </notification> <notification name="CompileQueueSaveBytecode"> - W trakcie Å‚adwania skompilowanego skryptu pojawiÅ‚ siÄ™ problem z nastÄ™pujÄ…cego powodu: [REASON]. Spróbuj ponownie za kilka minut. + W trakcie Å‚adowania skompilowanego skryptu pojawiÅ‚ siÄ™ problem z nastÄ™pujÄ…cego powodu: [REASON]. Spróbuj ponownie za kilka minut. </notification> <notification name="WriteAnimationFail"> Problem w zapisywaniu danych animacji. Spróbuj ponownie za kilka minut. @@ -140,15 +105,17 @@ Wybierz pojedynczy obiekt i spróbuj jeszcze raz. Zapisać wszystkie zmiany dotyczÄ…ce ubrania/czeÅ›ci ciaÅ‚a? <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Nie Zapisuj" yestext="Zapisz"/> </notification> + <notification name="FriendsAndGroupsOnly"> + Osoby spoza listy znajomych, których rozmowy gÅ‚osowe i IM sÄ… ignorowane, nie wiedzÄ… o tym. + <usetemplate name="okbutton" yestext="OK"/> + </notification> <notification name="GrantModifyRights"> - Udzielenie praw modyfikacji innemu Rezydentowi umożliwia modyfikacjÄ™, usuwanie lub wziÄ™cie JAKIEGOKOLWIEK z Twoich obiektów. -Używaj tej opcji z rozwagÄ…! + Udzielenie praw modyfikacji innemu Rezydentowi umożliwia modyfikacjÄ™, usuwanie lub wziÄ™cie JAKIEGOKOLWIEK z Twoich obiektów. Używaj tej opcji z rozwagÄ…! Czy chcesz dać prawa modyfikacji osobie [FIRST_NAME] [LAST_NAME]? <usetemplate name="okcancelbuttons" notext="Nie" yestext="Tak"/> </notification> <notification name="GrantModifyRightsMultiple"> - Udzielenie praw modyfikacji innym Rezydentom umożliwia im modyfikacjÄ™, usuwanie lub wziÄ™cie JAKIEGOKOLWIEK z Twoich obiektów. -Używaj tej opcji z rozwagÄ…! + Udzielenie praw modyfikacji innym Rezydentom umożliwia im modyfikacjÄ™, usuwanie lub wziÄ™cie JAKIEGOKOLWIEK z Twoich obiektów. Używaj tej opcji z rozwagÄ…! Czy chcesz dać prawa modyfikacji wybranym osobom? <usetemplate name="okcancelbuttons" notext="Nie" yestext="Tak"/> </notification> @@ -179,7 +146,7 @@ Czy chcesz dać prawa modyfikacji wybranym osobom? Ta funkcja nie może być odebrana. CzÅ‚onkowie muszÄ… sami zrezygnować z peÅ‚nienia tej funkcji. Chcesz kontynuować? - <usetemplate ignoretext="Podczas dodawania czÅ‚onków grupy do funkcji wÅ‚aÅ›ciciela" name="okcancelignore" notext="Nie" yestext="Tak"/> + <usetemplate ignoretext="Przed dodaniem nowego wÅ‚aÅ›ciciela do grupy, proszÄ™ potwierdzić swojÄ… decyzjÄ™." name="okcancelignore" notext="Nie" yestext="Tak"/> </notification> <notification name="AssignDangerousActionWarning"> Dodajesz przywilej [ACTION_NAME] do fukcji [ROLE_NAME]. @@ -201,67 +168,31 @@ Udzielaj tego przywileju z rozwagÄ…. Dodać ten przywilej do funkcji [ROLE_NAME]? <usetemplate name="okcancelbuttons" notext="Nie" yestext="Tak"/> </notification> - <notification name="ClickPublishHelpLand"> - Wybranie opcji Publikuj w Wyszukiwarce Wybranie tej opcji umożliwi pokazywanie: -- tej posiadÅ‚oÅ›ci w wynikach wyszukiwarki -- publicznych obiektów na tej posiadÅ‚oÅ›ci -- tej posiadÅ‚oÅ›ci w przeglÄ…darce internetowej - </notification> - <notification name="ClickSoundHelpLand"> - Media oraz muzyka sÄ… aktywne wedÅ‚ug ustawieÅ„ posiadÅ‚oÅ›ci dla mediów. DźwiÄ™k oraz komunikacja gÅ‚osowa mogÄ… być ograniczone w danej posiadÅ‚oÅ›ci, w zależnoÅ›ci od ustawieÅ„ rodzaju treÅ›ci jakÄ… zawiera. Skorzystaj z [SECOND_LIFE]:Pomoc by uzyskać wiÄ™cej informacji na temat dostÄ™pu do regionów z podanym rodzajem treÅ›ci jakÄ… zawiera. - <url name="url"> - https://support.secondlife.com/ics/support/default.asp?deptID=4417&task=knowledge&questionID=5046 - </url> - <usetemplate - name="okcancelbuttons" - yestext="[SECOND_LIFE]:Pomoc" - notext="Zamknij" /> - </notification> - <notification name="ClickSearchHelpAll"> - Wyniki wyszukiwania wyÅ›wietlajÄ… siÄ™ na podstawie rodzaju zakÅ‚adki wyszukiwarki, z której korzystasz, rodzaju statusu Twojego wieku, wybranej kategorii, oraz innych czynników. By uzyskać wiecej szczegółów skorzystaj z [SECOND_LIFE]:Pomoc. - <url name="url"> - https://support.secondlife.com/ics/support/default.asp?deptID=4417&task=knowledge&questionID=4722 - </url> - <usetemplate - name="okcancelbuttons" - yestext="[SECOND_LIFE]:Pomoc" - notext="Zamknij" /> - </notification> - <notification name="ClickPublishHelpLandDisabled"> - Ta posiadÅ‚ość nie może być pokazywana w wynikach wyszukiwania ponieważ region w którym siÄ™ znajduje zabrania tego. - </notification> - <notification name="ClickPublishHelpAvatar"> - Wybranie opcji Publikuj w Wyszukiwarce umożliwi pokazywanie: -- Twojego profilu w wynikach wyszukiwarki -- linku do Twojego profilu na publicznych stronach - </notification> - <notification name="ClickPartnerHelpAvatar"> - Możesz zaproponować zwiÄ…zek innemu Rezydentowi lub rozwiÄ…zać istniejÄ…cy zwiÄ…zek na stronie internetowej [SECOND_LIFE]. - -Chcesz dowiedzieć siÄ™ wiÄ™cej na temat zwiÄ…zków w [SECOND_LIFE]? - <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Idź na stronÄ™"/> - </notification> - <notification name="ClickUploadHelpPermissions"> - Twoje domyÅ›lne ustawienia praw dla Twoich obiektów mogÄ… nie dziaÅ‚ać poprawnie w starszych regionach. - </notification> - <notification name="ClickWebProfileHelpAvatar"> - Jeżeli ten Rezydent posiada link URL w profilu możesz: - * Kliknąć 'ZaÅ‚aduj' żeby zobaczyć stronÄ™ w tej zakÅ‚adce WWW. - * Kliknąć 'ZaÅ‚aduj' > 'Użyj zewnÄ™trznej przeglÄ…darki' żeby zobaczyć stronÄ™ używajÄ…c domyÅ›lnej zewnÄ™trznej przeglÄ…darki. - * Kliknąć 'ZaÅ‚aduj' > 'Otwórz URL strony profilu' żeby wrócić do strony tego Rezydenta po jej opuszczeniu. - -OglÄ…dajÄ…c swój profil możesz wpisać dowolny link URL i kliknąć OK żeby go zapisać. -Rezydenci mogÄ… odwiedzać podany adres, kiedy przeglÄ…dajÄ… Twój profil. + <notification name="AttachmentDrop"> + WybraÅ‚eÅ› opcjÄ™ opuszczenia swojego załącznika. + Czy chcesz kontynuować? + <usetemplate ignoretext="Potwierdź przed zdjÄ™ciem załącznika." name="okcancelignore" notext="Nie" yestext="Tak"/> </notification> <notification name="JoinGroupCanAfford"> Dołączenie do tej grupy kosztuje [COST]L$. Chcesz kontynuować? <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Dołącz"/> </notification> + <notification name="JoinGroupNoCost"> + Dołączasz do grupy [NAME]. +Czy chcesz kontynuować? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Zaakceptuj"/> + </notification> <notification name="JoinGroupCannotAfford"> CzÅ‚onkostwo w tej grupie kosztuje [COST]L$ Masz za maÅ‚o L$ żeby zostać czÅ‚onkiem. </notification> + <notification name="CreateGroupCost"> + Stworzenie tej grupy kosztuje 100L$. +W grupie powinien być wiÄ™cej niż jeden czÅ‚onek, albo zostanie na zawsze skasowana. +ZaproÅ› proszÄ™ czÅ‚onków w ciÄ…gu 48 godzin. + <usetemplate canceltext="Anuluj" name="okcancelbuttons" notext="Anuluj" yestext="Stwórz grupÄ™ za 100L$"/> + </notification> <notification name="LandBuyPass"> Za [COST]L$ możesz odwiedzić tÄ… posiadÅ‚ość ('[PARCEL_NAME]') na [TIME] godzin. Chcesz kupić przepustkÄ™? <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> @@ -276,9 +207,9 @@ Cena wynosi [SALE_PRICE]L$ i sprzedaż bÄ™dzie autoryzowana dla [NAME]. <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> </notification> <notification name="ConfirmLandSaleToAnyoneChange"> - UWAGA: WybierajÄ…c Sprzedaż dla Kogokolwiek umożliwiasz zakup posiadÅ‚oÅ›ci wszystkim Rezydentom [SECOND_LIFE]. + UWAGA: WybierajÄ…c opcjÄ™ "Sprzedaj Każdemu" udostÄ™pniasz swojÄ… posiadÅ‚ość do sprzedaży dla jakiegokolwiek Rezydenta [SECOND_LIFE] , nawet osób nieobecnych w tym regionie. -PosiadÅ‚ość o powierzchni [LAND_SIZE] m zostaje wystawiona na sprzedaż. +PosiadÅ‚ość o powierzchni [LAND_SIZE] m² zostaje wystawiona na sprzedaż. Cena wynosi [SALE_PRICE]L$ i sprzedaż bÄ™dzie autoryzowana dla [NAME]. <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> </notification> @@ -324,7 +255,7 @@ Obiekty: [N] <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> </notification> <notification name="DisableAllTopObjects"> - Czy na pewno chcesz deaktywować wszystkie obiekty w tym regionie? + Czy na pewno chcesz deaktywować wszystkie obiekty w tym Regionie? <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> </notification> <notification name="ReturnObjectsNotOwnedByGroup"> @@ -338,6 +269,12 @@ Obiekty: [N] Ten region pozwala na uszkodzenia. Skrypty muszÄ… pozostać aktywne dla prawidÅ‚owego dziaÅ‚ania broni. </notification> + <notification name="MultipleFacesSelected"> + Obecnie zaznaczono wiele powierzchni. +JeÅ›li dziaÅ‚anie bÄ™dzie kontynuowane, oddzielne media bÄ™dÄ… ustawione na wielu powierzchniach obiektu. +W celu umieszczenia mediów tylko na jednej powierzchni skorzystaj z Wybierz PowierzchniÄ™ i kliknij na wybranej powierzchni obiektu oraz kliknij Dodaj. + <usetemplate ignoretext="Media zostanÄ… ustawione na wielu zaznaczonych powierzchniach" name="okcancelignore" notext="Anuluj" yestext="OK"/> + </notification> <notification name="MustBeInParcel"> Musisz znajdować siÄ™ wewnÄ…trz posiadÅ‚oÅ›ci żeby wybrać punkt lÄ…dowania. </notification> @@ -373,6 +310,10 @@ Folder stroju nie zawiera żadnego ubrania, części ciaÅ‚a ani załączników. <notification name="CannotWearTrash"> Nie możesz zaÅ‚ożyć ubrania, które znajduje siÄ™ w koszu. </notification> + <notification name="MaxAttachmentsOnOutfit"> + Nie można dołączyć obiektu. +Limit [MAX_ATTACHMENTS] załączników zostaÅ‚ przekroczony. ProszÄ™ najpierw odłączyć inny obiekt. + </notification> <notification name="CannotWearInfoNotComplete"> Nie możesz zaÅ‚ożyć tego artkuÅ‚u ponieważ nie zaÅ‚adowaÅ‚ siÄ™ poprawnie. Spróbuj ponownie za kilka minut. </notification> @@ -382,27 +323,36 @@ Czy chcesz przejść na stronÄ™ www.secondlife.com by zaÅ‚ożyć konto? <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> </notification> <notification name="AddClassified"> - OgÅ‚oszenia reklamowe ukazujÄ… siÄ™ w zakÅ‚adce Reklama w wyszukiwarce (Szukaj) oraz na stronie internetowej www.secondlife.com przez tydzieÅ„. + OgÅ‚oszenia reklamowe ukazujÄ… siÄ™ w zakÅ‚adce Reklama w wyszukiwarce (Szukaj) oraz na [http://secondlife.com/community/classifieds secondlife.com] przez tydzieÅ„. Napisz treść swojej reklamy, kliknij Zamieść by dodać katalogu ogÅ‚oszeÅ„. -Po zamieszczeniu reklamy zostaniesz poproszony o sprecyzowanie opÅ‚aty za reklamÄ™. +Po zamieszczeniu reklamy zostaniesz poproszony o sprecyzowanie opÅ‚aty za ReklamÄ™. Im wyższa opÅ‚ata tym wyżej Twoja reklama wyÅ›wietla siÄ™ w katalogu i wyszukiwarce po wpisaniu słów kluczowych. - <usetemplate ignoretext="W momencie dodawania nowej reklamy" name="okcancelignore" notext="Anuluj" yestext="OK"/> + <usetemplate ignoretext="Jak stworzyć nowÄ… reklamÄ™?" name="okcancelignore" notext="Anuluj" yestext="OK"/> </notification> <notification name="DeleteClassified"> Usunąć reklamÄ™ '[NAME]'? PamiÄ™taj! Nie ma rekompensaty za poniesione koszta. <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> </notification> + <notification name="DeleteMedia"> + Wybrano usuniÄ™cie mediów zwiÄ…zanych z tÄ… powierzchniÄ…. +Czy na pewno chcesz kontynuować? + <usetemplate ignoretext="Potwierdź przed usuniÄ™ciem mediów z obiektu" name="okcancelignore" notext="Nie" yestext="Tak"/> + </notification> <notification name="ClassifiedSave"> - Zapisać zmiany w reklamie [NAME]? + Zapisać zmiany w Reklamie [NAME]? <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Nie Zapisuj" yestext="Zapisz"/> </notification> + <notification name="ClassifiedInsufficientFunds"> + Nie posiadasz wystarczajÄ…cych Å›rodków aby dodać ReklamÄ™. + <usetemplate name="okbutton" yestext="OK"/> + </notification> <notification name="DeleteAvatarPick"> Usunąć wybór [PICK] z kategorii LubiÄ™? <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> </notification> <notification name="PromptGoToEventsPage"> - Odwiedzić internetowÄ… stronÄ™ imprez [SECOND_LIFE]? + Odwiedzić internetowÄ… stronÄ™ Imprez [SECOND_LIFE]? <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> </notification> <notification name="SelectProposalToView"> @@ -411,26 +361,18 @@ PamiÄ™taj! Nie ma rekompensaty za poniesione koszta. <notification name="SelectHistoryItemToView"> Wybierz obiekt z historii, który chcesz zobaczyć. </notification> - <notification name="ResetShowNextTimeDialogs"> - Zresetować 'Pokaż nastÄ™pnym razem' opcjÄ™ we wszystkich dialogach? - <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> - </notification> - <notification name="SkipShowNextTimeDialogs"> - Wyłączyć 'Pokaż nastÄ™pnym razem' opcjÄ™ we wszystkich dialogach? - <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> - </notification> <notification name="CacheWillClear"> - Bufor danych na dysku zostanie zresetowany po relogu do [APP_NAME]. + Bufor danych zostanie wyczyszczony po restarcie aplikacji [APP_NAME]. </notification> <notification name="CacheWillBeMoved"> - Bufor danych na dysku zostanie przemieszczony po relogu do [APP_NAME]. -Bufor bÄ™dzie również wyczyszczony. + Bufor danych zostanie przeniesiony po restarcie aplikacji [APP_NAME]. +PamiÄ™taj: Opcja ta wyczyszcza bufor danych. </notification> <notification name="ChangeConnectionPort"> - Ustawienia portu zostanÄ… wprowadzone po relogu do [APP_NAME]. + Ustawienia portu zostajÄ… zaktualizowane po restarcie aplikacji [APP_NAME]. </notification> <notification name="ChangeSkin"> - Nowa skórka zostanie wprowadzona po relogu do [APP_NAME]. + Nowa skórka zostanie wczytana po restarcie aplikacji [APP_NAME]. </notification> <notification name="GoToAuctionPage"> Odwiedzić stronÄ™ internetowÄ… [SECOND_LIFE] żeby zobaczyć szczgóły aukcji lub zrobić ofertÄ™? @@ -450,17 +392,17 @@ UsuÅ„ kilka etapów i zapisz jeszcze raz. </notification> <notification name="GestureSaveFailedObjectNotFound"> Nie można zapisać gestu ponieważ obiekt lub szafa powiÄ…zanego obiektu nie zostaÅ‚ znaleziony. -Obiekt może znajdować siÄ™ zbyt daleko albo zostaÅ‚ usuniety. +Obiekt może znajdować siÄ™ zbyt daleko albo zostaÅ‚ usuniÄ™ty. </notification> <notification name="GestureSaveFailedReason"> - Nie można zapisać gestu z nastÄ™pujÄ…cego powodu: [REASON]. Spróbuj zapisać jeszcze raz póżniej. + Nie można zapisać gestu z nastÄ™pujÄ…cego powodu: [REASON]. Spróbuj zapisać jeszcze raz później. </notification> <notification name="SaveNotecardFailObjectNotFound"> Nie można zapisać notki ponieważ obiekt lub szafa powiÄ…zanego obiektu nie zostaÅ‚ znaleziony. Obiekt może znajdować siÄ™ zbyt daleko albo zostaÅ‚ usuniety. </notification> <notification name="SaveNotecardFailReason"> - Nie można zapisać notki z nastÄ™pujÄ…cego powodu: [REASON]. Spróbuj zapisać jeszcze raz póżniej. + Nie można zapisać notki z nastÄ™pujÄ…cego powodu: [REASON]. Spróbuj zapisać jeszcze raz później. </notification> <notification name="ScriptCannotUndo"> Nie można cofnąć wszystkich zmian w Twojej wersji skryptu. @@ -469,7 +411,7 @@ Czy chcesz zaÅ‚adować ostatniÄ… wersjÄ™ zapisanÄ… na serwerze? <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> </notification> <notification name="SaveScriptFailReason"> - Nie można zapisać skryptu z nastÄ™pujÄ…cego powodu: [REASON]. Spróbuj zapisać jeszcze raz póżniej. + Nie można zapisać skryptu z nastÄ™pujÄ…cego powodu: [REASON]. Spróbuj zapisać jeszcze raz później. </notification> <notification name="SaveScriptFailObjectNotFound"> Nie można zapisać skryptu ponieważ obiekt w którym siÄ™ zawiera nie zostaÅ‚ znaleziony. @@ -478,6 +420,11 @@ Obiekt może znajdować siÄ™ zbyt daleko albo zostaÅ‚ usuniety. <notification name="SaveBytecodeFailReason"> Nie można zapisać skompilowanego skryptu z nastÄ™pujÄ…cego powodu: [REASON]. Spróbuj zapisać jeszcze raz póżniej. </notification> + <notification name="StartRegionEmpty"> + Oops, Twoje miejsce startu nie zostaÅ‚o okreÅ›lone. +Wpisz proszÄ™ nazwÄ™ regionu w lokalizacjÄ™ startu w polu Lokalizacja Startu lub wybierz Moja Ostatnia Lokalizacja albo Miejsce Startu. + <usetemplate name="okbutton" yestext="OK"/> + </notification> <notification name="CouldNotStartStopScript"> Nie można uruchomić lub zatrzymać skryptu ponieważ obiekt w którym siÄ™ zawiera nie zostaÅ‚ znaleziony. Obiekt może znajdować siÄ™ zbyt daleko albo zostaÅ‚ usuniety. @@ -489,26 +436,26 @@ Obiekt może znajdować siÄ™ zbyt daleko albo zostaÅ‚ usuniety. Nie można zapisać pliku [[FILE]] </notification> <notification name="UnsupportedHardware"> - Uwaga: Twój system nie speÅ‚nia minimalnych wymagaÅ„ sprzÄ™towych [APP_NAME]. Jakość i prÄ™dkość [APP_NAME] mogÄ… być pogorszone. Niestety, nie bÄ™dziemy w stanie udzielić Ci technicznej pomocy, ponieważ konfiguracja Twojego systemu nie speÅ‚nia wymagaÅ„ sprzÄ™towych. + Niestety Twój komputer nie speÅ‚nia minimalnych wymogów sprzÄ™towych dla poprawnego dziaÅ‚ania [APP_NAME]. Możesz odczuwać bardzo niskÄ… wydajność operacyjnÄ…. Niestety portal pomocy, [SUPPORT_SITE] nie posiada informacji na temat poprawnej konfiguracji technicznej Twojego systemu. -MINSPECS -Czy chcesz odwiedzić stronÄ™ [_URL] po dodatkowe informacje? +Po wiÄ™cej info, odwiedź stronÄ™ [_URL] . <url name="url" option="0"> http://www.secondlife.com/corporate/sysreqs.php </url> - <usetemplate ignoretext="Zignoruj ostrzeżenie" name="okcancelignore" notext="Nie" yestext="Tak"/> + <usetemplate ignoretext="Dysk twardy mojego komputera nie jest wspomagany" name="okcancelignore" notext="Nie" yestext="Tak"/> </notification> <notification name="UnknownGPU"> - Twój system jest wyposażony w kartÄ™ graficznÄ… której jeszcze nie znamy. -To siÄ™ czÄ™sto zdarza z nowym sprzÄ™tem, którego jeszcze nie testowaliÅ›my. -[APP_NAME] najprawdopodobniej bÄ™dzie dziaÅ‚aÅ‚o poprawnie. Możliwe, że bÄ™dziesz musiaÅ‚ wyregulować ustawienia grafiki. -(Edycja > Ustawienia > Grafika). + Twój system jest wyposażony w kartÄ™ graficznÄ…, która nie jest rozpoznana przez [APP_NAME]. +Zdarza siÄ™ to czÄ™stow w przypadku nowego sprzÄ™tu, który nie byÅ‚ testowany z [APP_NAME]. Prawdopodobnie wystarczy dostosowanie ustawieÅ„ grafiki aby dziaÅ‚anie byÅ‚o poprawne. +(Ja > WÅ‚aÅ›ciwoÅ›ci > Grafika). <form name="form"> - <ignore name="ignore" text="Zignoruj ostrzeżenie"/> + <ignore name="ignore" text="Karta graficzna nie zostaÅ‚a zidentyfikowana."/> </form> </notification> <notification name="DisplaySettingsNoShaders"> - [APP_NAME] zawiesiÅ‚ siÄ™ podczas inicjalizacji sterowników graficznych. Jakość grafiki zostaÅ‚a zmniejszona - może pomoże. Pewne funkcje graficzne zostaÅ‚y wyłączone. Zalecamy aktualizcje strerowników grapicznych. + [APP_NAME] zawiesiÅ‚ siÄ™ podczas inicjalizacji sterowników graficznych. +Jakość grafiki zostaÅ‚a zmniejszona - może pomoże. +Pewne funkcje graficzne zostaÅ‚y wyłączone. Zalecamy aktualizcje sterowników graficznych. Możesz podnieść jakość grafiki pod Ustawienia > Grafika. </notification> <notification name="RegionNoTerraforming"> @@ -553,6 +500,9 @@ Ta osoba tymczasowo nie bÄ™dzie mógÅ‚a siÄ™ poruszać, nie bÄ™dzie mógÅ‚ używ Wyrzucić [AVATAR_NAME] z Twojej posiadÅ‚oÅ›ci? <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Wyrzuć i zabroÅ„ wstÄ™pu (ban)" yestext="Wyrzuć"/> </notification> + <notification name="EjectAvatarFromGroup"> + Wyrzuć [AVATAR_NAME] z grupy [GROUP_NAME] + </notification> <notification name="AcquireErrorTooManyObjects"> BÅÄ„D OTRZYMYWANIA: Zbyt wiele wybranych obiektów. </notification> @@ -562,12 +512,12 @@ Ta osoba tymczasowo nie bÄ™dzie mógÅ‚a siÄ™ poruszać, nie bÄ™dzie mógÅ‚ używ <notification name="PromptGoToCurrencyPage"> [EXTRA] -Iść na stronÄ™ [_URL] po informacje dotyczÄ…ce zakupu L$? +Odwiedź stronÄ™ [_URL] po wiÄ™cej informacji na temat zakupu L$? <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> </notification> <notification name="UnableToLinkObjects"> Nie można połączyć [COUNT] obiektów. -Maksimalnie można połączyć [MAX] obiektów. +Maksymalnie można połączyć [MAX] obiektów. </notification> <notification name="CannotLinkIncompleteSet"> Możesz łączyć tylko kompletne zbiory obiektów i musisz wybrać wiÄ™cej niż jeden obiekt. @@ -643,12 +593,19 @@ Oczekiwana - [VALIDS] Nie można utworzyć pliku wyjÅ›ciowego: [FILE] </notification> <notification name="DoNotSupportBulkAnimationUpload"> - Åadowanie zbiorów plików animacji nie jest jeszcze dostÄ™pne. + [APP_NAME] obecnie nie wspomaga Å‚adowania grupowego plików animacji. </notification> <notification name="CannotUploadReason"> Åadowanie pliku [FILE] nie powiodÅ‚o siÄ™ z powodu: [REASON] Spróbuj jeszcze raz póżniej. </notification> + <notification name="LandmarkCreated"> + Dodano "[LANDMARK_NAME]" do folderu [FOLDER_NAME]. + </notification> + <notification name="LandmarkAlreadyExists"> + Posiadasz już landmark dla tej lokalizacji. + <usetemplate name="okbutton" yestext="OK"/> + </notification> <notification name="CannotCreateLandmarkNotOwner"> Nie możesz zapamiÄ™tać tego miejsca (LM) ponieważ wÅ‚aÅ›ciciel posiadÅ‚oÅ›ci nie pozwala na to. </notification> @@ -672,6 +629,9 @@ Wybierz obiekty zawierajÄ…ce skrypty. Wybierz skryptowane obiekty do których masz prawa modyfikacji. </notification> + <notification name="CannotOpenScriptObjectNoMod"> + Nie można otworzyć skryptu bez prawa do modyfikacji obiektu. + </notification> <notification name="CannotSetRunningSelectObjectsNoScripts"> 'Uruchomienie' skryptów nie powiodÅ‚o siÄ™. @@ -697,52 +657,47 @@ Nowe zapytanie: [FINALQUERY] Teleportacja nie powiodÅ‚a siÄ™. [REASON] </notification> - - <notification name="invalid_tport"> -WystÄ…piÅ‚ problem z teleportacjÄ…. Wyloguj siÄ™ i zaloguj ponownie. -JeÅ›li nadal otrzymujesz ten komunikat sprawdź Pomoc TechnicznÄ… na stronie: -www.secondlife.com/support. - </notification> - <notification name="invalid_region_handoff"> -WystÄ…piÅ‚ problem ze zmianÄ… regionu. Wyloguj siÄ™ i zaloguj ponownie. -JeÅ›li nadal otrzymujesz ten komunikat sprawdź Pomoc TechnicznÄ… na stronie: -www.secondlife.com/support. - </notification> - <notification name="blocked_tport"> -Przepraszamy, teleportacja jest chwilowo niedostÄ™pna. Spróbuj jeszcze raz. + <notification name="invalid_tport"> + Niestety, pojawiÅ‚ siÄ™ błąd podczas próby teleportacji. Proponujemy wylogowanie siÄ™ i spróbowanie teleportacji ponownie. +Jeżeli nadal otrzymujesz tÄ™ wiadomość proponujemy odwiedzić stronÄ™ [SUPPORT_SITE]. + </notification> + <notification name="invalid_region_handoff"> + Niestety, pojawiÅ‚ siÄ™ błąd podczas próby przedostania siÄ™ na drugi region. Proponujemy wylogowanie siÄ™ i spróbowanie przedostania siÄ™ na drugi region ponownie. +Jeżeli nadal otrzymujesz tÄ™ wiadomość proponujemy odwiedzić stronÄ™ [SUPPORT_SITE]. + </notification> + <notification name="blocked_tport"> + Przepraszamy, teleportacja jest chwilowo niedostÄ™pna. Spróbuj jeszcze raz. JeÅ›li nadal nie możesz siÄ™ teleportować wyloguj siÄ™ i ponownie zaloguj. - </notification> - <notification name="nolandmark_tport"> -Przepraszamy, ale nie możemy znaleźć miejsca docelowego. - </notification> - <notification name="timeout_tport"> -Przepraszamy, ale nie udaÅ‚o siÄ™ przeprowadzić teleportacji. Spróbuj jeszcze raz. - </notification> - <notification name="noaccess_tport"> -Przepraszamy, ale nie masz dostÄ™pu do miejsca docelowego. - </notification> - <notification name="missing_attach_tport"> -Czekamy na Twoje akcesoria. Możesz poczekać kilka minut lub zrobić relog przed nastÄ™pnÄ… próbÄ… teleportacji. - </notification> - <notification name="too_many_uploads_tport"> -Obecnie ten region ma problemy z Å‚adowaniem obiektów w zwiÄ…zku z czym teleportacja bardzo sie opóznia. + </notification> + <notification name="nolandmark_tport"> + Przepraszamy, ale nie możemy znaleźć miejsca docelowego. + </notification> + <notification name="timeout_tport"> + Przepraszamy, ale nie udaÅ‚o siÄ™ przeprowadzić teleportacji. Spróbuj jeszcze raz. + </notification> + <notification name="noaccess_tport"> + Przepraszamy, ale nie masz dostÄ™pu do miejsca docelowego. + </notification> + <notification name="missing_attach_tport"> + Czekamy na Twoje akcesoria. Możesz poczekać kilka minut lub zrobić relog przed nastÄ™pnÄ… próbÄ… teleportacji. + </notification> + <notification name="too_many_uploads_tport"> + Obecnie ten region ma problemy z Å‚adowaniem obiektów w zwiÄ…zku z czym teleportacja bardzo sie opóźnia. Spróbuj jeszcze raz za kilka minut albo teleportuj siÄ™ do mniej zatÅ‚oczonego miejsca. - </notification> - <notification name="expired_tport"> -Przepraszamy, ale nie udaÅ‚o siÄ™ przeprowadzić teleportacji wystarczajÄ…co szybko. Spróbuj jeszcze raz za kilka minut. - </notification> - <notification name="expired_region_handoff"> -Przepraszamy, ale nie udaÅ‚o siÄ™ przeprowadzić zmiany regionu wystarczajÄ…co szybko. Spróbuj jeszcze raz za kilka minut. - </notification> - <notification name="no_host"> -Nie możemy znaleść miejsca docelowego. To miejsce może być chwilowo nieosiÄ…galne albo przestaÅ‚o istnieć. + </notification> + <notification name="expired_tport"> + Przepraszamy, ale nie udaÅ‚o siÄ™ przeprowadzić teleportacji wystarczajÄ…co szybko. Spróbuj jeszcze raz za kilka minut. + </notification> + <notification name="expired_region_handoff"> + Przepraszamy, ale nie udaÅ‚o siÄ™ przeprowadzić zmiany regionu wystarczajÄ…co szybko. Spróbuj jeszcze raz za kilka minut. + </notification> + <notification name="no_host"> + Nie możemy znaleść miejsca docelowego. To miejsce może być chwilowo nieosiÄ…galne albo przestaÅ‚o istnieć. Spróbuj jeszcze raz za kilka minut. - </notification> - <notification name="no_inventory_host"> -Szafa chwilowo nie dziaÅ‚a. - </notification> - - + </notification> + <notification name="no_inventory_host"> + Szafa chwilowo nie dziaÅ‚a. + </notification> <notification name="CannotSetLandOwnerNothingSelected"> Nie można wybrać wÅ‚aÅ›ciciela posiadÅ‚oÅ›ci. PosiadÅ‚ość nie zostaÅ‚a wybrana. @@ -751,7 +706,8 @@ PosiadÅ‚ość nie zostaÅ‚a wybrana. Nie można wybrać wÅ‚aÅ›ciciela posiadÅ‚oÅ›ci ponieważ wybrany obszar przekracza granicÄ™ regionów. Wybierz mniejszy obszar i spróbuj jeszcze raz. </notification> <notification name="ForceOwnerAuctionWarning"> - Ta posiadÅ‚ość jest wystawiona na aukcjÄ™. Wymuszenie wÅ‚asnoÅ›ci anulue aukcjÄ™ i potencjalnie może zdenerwować zainteresowanych Rezydentów, jeżeli licytacja już siÄ™ rozpoczęła. Wymusić wÅ‚asność? + Ta posiadÅ‚ość jest wystawiona na aukcjÄ™. Wymuszenie wÅ‚asnoÅ›ci anuluje aukcjÄ™ i potencjalnie może zdenerwować zainteresowanych Rezydentów, jeżeli licytacja już siÄ™ rozpoczęła. +Wymusić wÅ‚asność? <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> </notification> <notification name="CannotContentifyNothingSelected"> @@ -779,7 +735,7 @@ PosiadÅ‚ość nie zostaÅ‚a wybrana. Region nie znaleziony. </notification> <notification name="CannotCloseFloaterBuyLand"> - Dialog Kup PosiadÅ‚ość nie może zostać zamkniÄ™ty dopóki [APP_NAME] nie oszacuje ceny tej tranzakcji. + Okno zakupu landu nie może zostać zamkniÄ™te dopóki aplikacja [APP_NAME] nie okreÅ›li ceny dla tej transkacji. </notification> <notification name="CannotDeedLandNothingSelected"> Nie można przekazać posiadÅ‚oÅ›ci: @@ -790,8 +746,8 @@ PosiadÅ‚ość nie zostaÅ‚a wybrana. Grupa nie zostaÅ‚a wybrana. </notification> <notification name="CannotDeedLandNoRegion"> - Nie można przekazać posiadÅ‚oÅ›ci: -Region nie znaleziony. + Brak możliwoÅ›ci przepisania posiadÅ‚oÅ›ci grupie: +Region, gdzie posiadÅ‚ość siÄ™ znajduje nie zostaÅ‚ odnaleziony. </notification> <notification name="CannotDeedLandMultipleSelected"> Nie można przekazać posiadÅ‚oÅ›ci: @@ -799,14 +755,6 @@ Wiele posiadÅ‚oÅ›ci jest wybranych. Spróbuj wybrać pojedynczÄ… posiadÅ‚ość. </notification> - <notification name="ParcelCanPlayMedia"> - To miejsce może odtwarzać strumienie mediów. -Odtwarzanie strumieni wymaga szybkiego połączenia do Internetu. - -Odtwarzać dostÄ™pne strumienie mediów? -(Selekcja może zostać zmieniona póżniej pod Ustawienia > Audio i Video.) - <usetemplate name="okcancelbuttons" notext="Wyłącz" yestext="Odtwarzaj"/> - </notification> <notification name="CannotDeedLandWaitingForServer"> Nie można przekazać posiadÅ‚oÅ›ci: Serwer aktualizuje dane wÅ‚asnoÅ›ci. @@ -836,8 +784,8 @@ Nie masz praw do porzucenia tej posiadÅ‚oÅ›ci. Twoje posiadÅ‚oÅ›ci sÄ… podkreÅ›lone na zielono. </notification> <notification name="CannotReleaseLandRegionNotFound"> - Nie można porzucić posiadÅ‚oÅ›ci: -Region nie znaleziony. + Brak możliwoÅ›ci porzucenia posiadÅ‚oÅ›ci: +Region, gdzie posiadÅ‚ość siÄ™ znajduje nie zostaÅ‚ odnaleziony. </notification> <notification name="CannotReleaseLandNoTransfer"> Nie możesz porzucić posiadÅ‚oÅ›ci: @@ -875,12 +823,12 @@ Podzielić posiadÅ‚ość? <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> </notification> <notification name="CannotDivideLandNoRegion"> - Nie można podzielić posiadÅ‚oÅ›ci: -Region nie znaleziony. + Brak możliwoÅ›ci podziaÅ‚u posiadÅ‚oÅ›ci: +Region, gdzie posiadÅ‚ość siÄ™ znajduje nie zostaÅ‚ odnaleziony. </notification> <notification name="CannotJoinLandNoRegion"> - Nie można połączyć posiadÅ‚oÅ›ci: -Region nie znaleziony. + Brak możliwoÅ›ci złączenia posiadÅ‚oÅ›ci: +Region, gdzie posiadÅ‚ość siÄ™ znajduje nie zostaÅ‚ odnaleziony. </notification> <notification name="CannotJoinLandNothingSelected"> Nie można połączyć posiadÅ‚oÅ›ci: @@ -904,17 +852,6 @@ Wybierz obaszar usytuowany na obu posiadÅ‚oÅ›ciach. Połączyć posiadÅ‚oÅ›ci? <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> </notification> - <notification name="ShowOwnersHelp"> - Pokaż wÅ‚aÅ›cicieli: -Pokoloruj posiadÅ‚oÅ›ci zgodnie z przynależnoÅ›ciÄ… do wÅ‚aÅ›ciciela - -Zielony = Twoja PosiadÅ‚ość -Morski = PosiadÅ‚ość Twojej Grupy -Czerwony = PosiadÅ‚oÅ›ci Innych -Żółty = Na Sprzedaż -Fioletowy = Na AukcjÄ™ -Szary = Publiczna - </notification> <notification name="ConfirmNotecardSave"> Ta notka musi być zapisana żeby mogÅ‚a być skopiowana lub zobaczona. Zapisać notkÄ™? <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> @@ -927,10 +864,10 @@ Szary = Publiczna Zmiana rozdzielczoÅ›ci do [RESX] x [RESY] nie powidÅ‚a siÄ™ </notification> <notification name="ErrorUndefinedGrasses"> - Błąd: Niezdefiniowane trawy: [SPECIES] + Błąd: niezdefiniowane trawy: [SPECIES] </notification> <notification name="ErrorUndefinedTrees"> - BÅ‚ad: Niezdefiniowane drzewa: [SPECIES] + BÅ‚ad: niezdefiniowane drzewa: [SPECIES] </notification> <notification name="CannotSaveWearableOutOfSpace"> Nie można zapisać '[NAME]' do pliku stroju. Musisz zwolnić trochÄ™ miejsca na Twoim komputerze i zapisać strój jeszcze raz. @@ -940,11 +877,8 @@ Szary = Publiczna Zazwyczaj jest to tymczasowy problem. Możesz kontynuować modyfikacje i zapisać strój ponownie za kilka minut. </notification> <notification name="YouHaveBeenLoggedOut"> - Twoja sesja [SECOND_LIFE] zostaÅ‚a zakoÅ„czona: -[MESSAGE] - -Kliknij Kontynuuj żeby zobaczyć IMy i czat. -Å»adne inne operacje nie bÄ™dÄ… dozwolone. Kliknij Wyłącz w celu natychmiastowego opuszczenia [APP_NAME]. + NastÄ…piÅ‚o wylogowanie z [SECOND_LIFE] + [MESSAGE] <usetemplate name="okcancelbuttons" notext="Wyłącz" yestext="Kontynuuj"/> </notification> <notification name="OnlyOfficerCanBuyLand"> @@ -996,7 +930,7 @@ ze wszystkich posiadÅ‚oÅ›ci w tym symulatorze? <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> </notification> <notification name="BlankClassifiedName"> - Musisz nadać tytuÅ‚ Twojej reklamie. + Musisz nadać tytuÅ‚ Twojej Reklamie. </notification> <notification name="MinClassifiedPrice"> Minimalna cena za publikacjÄ™ wynosi [MIN_PRICE]L$. @@ -1097,29 +1031,39 @@ Przekazać tÄ… posiadÅ‚ość o powierzchni [AREA] m² grupie '[GROUP_NAME]& </notification> <notification name="ErrorMessage"> [ERROR_MESSAGE] + <usetemplate name="okbutton" yestext="OK"/> </notification> - <notification name="AvatarMoved"> - Twoje miejsce [TYPE] jest obecnie niedostÄ™pne. [HELP] -Przeniesiono CiÄ™ do pobliskiego regionu. + <notification name="AvatarMovedDesired"> + Miejsce, do którego chcesz siÄ™ teleportować jest chwilowo nieobecne. +ZostaÅ‚eÅ› przeniesiony do regionu sÄ…siedniego. + </notification> + <notification name="AvatarMovedLast"> + Twoje miejsce startu jest obecnie niedostÄ™pne. +ZostaÅ‚eÅ› przeniesiony do sÄ…siedniego regionu. + </notification> + <notification name="AvatarMovedHome"> + Twoje miejsce startu jest obecnie niedostÄ™pne. +ZostaÅ‚eÅ› przeniesiony do pobliskiego regionu. +Możesz ustawić nowe miejsce startu. </notification> <notification name="ClothingLoading"> Twoje ubranie wciąż siÄ™ Å‚aduje. Możesz normalnie używać [SECOND_LIFE], inni użytkownicy bÄ™dÄ… CiÄ™ widzieli poprawnie. <form name="form"> - <ignore name="ignore" text="Åadowanie ubrania zajmuje dużo czasu"/> + <ignore name="ignore" text="Åadowanie ubraÅ„ nadal trwa"/> </form> </notification> <notification name="FirstRun"> Instalacja [APP_NAME] zakoÅ„czona. Jeżeli używasz [SECOND_LIFE] po raz pierwszy to musisz stworzyć konto żeby móc siÄ™ zalogować. -Przejść na stronÄ™ www.secondlife.com żeby stworzyć nowe konto? +Czy chcesz przejść na stronÄ™ [http://join.secondlife.com secondlife.com] żeby stworzyć nowe konto? <usetemplate name="okcancelbuttons" notext="Kontynuuj" yestext="Nowe Konto..."/> </notification> <notification name="LoginPacketNeverReceived"> - Problemy z połączeniem. Problem może być spowodowany Twoim połączeniem z Internetem albo może istnieć po stronie serwerów [SECOND_LIFE]. + Problemy z połączeniem. Problem może być spowodowany Twoim połączeniem z Internetem albo może istnieć po stronie [SECOND_LIFE_GRID]. -Możesz sprawdzić swoje połączenie z Internetem i spróbować ponownie za kilka minut albo kliknij Pomoc żeby połączyć siÄ™ ze stronÄ… pomocy technicznej albo wybierz Teleportuj żeby spróbować teleportacji do Twojego miejsca startu. +Możesz sprawdzić swoje połączenie z Internetem i spróbować ponownie za kilka minut lub połączyć siÄ™ ze stronÄ… pomocy technicznej tutaj [SUPPORT_SITE] lub wybrać Teleportuj by teleportować siÄ™ do swojego miejsca startu. <form name="form"> <button name="OK" text="OK"/> <button name="Help" text="Pomoc"/> @@ -1139,10 +1083,10 @@ Ten wybór bÄ™dzie można później zmienić. [NAME] [PRICE]L$ Masz za maÅ‚o L$. </notification> <notification name="GrantedModifyRights"> - Masz teraz prawa modyfikacji obiektów należących do [FIRST_NAME] [LAST_NAME]. + Masz teraz prawa modyfikacji obiektów należących do [NAME]. </notification> <notification name="RevokedModifyRights"> - Prawa modyfikacji obiektów należących do [FIRST_NAME] [LAST_NAME] zostaÅ‚y Ci odebrane. + Prawa modyfikacji obiektów należących do [NAME] zostaÅ‚y Ci odebrane. </notification> <notification name="FlushMapVisibilityCaches"> To spowoduje wyczyszczenie buforów map regionu. @@ -1188,10 +1132,10 @@ ZamieÅ„ teksturÄ™ [TEXTURE_NUM] na 24-o bitowÄ… teksturÄ™ o wymiarze 512x512 lub Maksymalna liczba goÅ›ci wynosi [MAX_AGENTS]. </notification> <notification name="MaxBannedAgentsOnRegion"> - Maksymalna liczba nieporzÄ…danych Rezydentów (banów) wynosi [MAX_BANNED]. + Maksymalna liczba niepożądanych Rezydentów (banów) wynosi [MAX_BANNED]. </notification> <notification name="MaxAgentOnRegionBatch"> - Próba dodania [NUM_ADDED] osób nie powidÅ‚a siÄ™: + Próba dodania [NUM_ADDED] osób nie powiodÅ‚a siÄ™: [MAX_AGENTS] [LIST_TYPE] limit przekroczony o [NUM_EXCESS]. </notification> <notification name="MaxAllowedGroupsOnRegion"> @@ -1236,12 +1180,30 @@ Aktualizacja nie jest wymagana ale jest zalecana w celu poprawy prÄ™dkoÅ›ci i st Aktualizacja nie jest wymagana ale jest zalecana w celu poprawy prÄ™dkoÅ›ci i stabilnoÅ›ci. <usetemplate name="okcancelbuttons" notext="Kontynuuj" yestext="ZaÅ‚aduj"/> </notification> + <notification name="DownloadLinuxMandatory"> + Nowa wersja [APP_NAME] jest dostÄ™pna. +[MESSAGE] +Musisz pobrać aktualizacjÄ™ aby korzystać z [APP_NAME]. + <usetemplate name="okcancelbuttons" notext="Wyjdź" yestext="Pobieranie"/> + </notification> + <notification name="DownloadLinux"> + Aktualizacja [APP_NAME] jest dostÄ™pna. +[MESSAGE] +Ta aktualizacja nie jest wymagana ale zaleca siÄ™ jej instalacjÄ™ w celu poprawienia szybkoÅ›ci i stabilnoÅ›ci. + <usetemplate name="okcancelbuttons" notext="Kontynuuj" yestext="Pobieranie"/> + </notification> + <notification name="DownloadLinuxReleaseForDownload"> + Uaktualniona wersja [APP_NAME]zostaÅ‚a opublikowana. +[MESSAGE] +Aktualizacja nie jest wymagana ale jest zalecana w celu poprawy prÄ™dkoÅ›ci i stabilnoÅ›ci. + <usetemplate name="okcancelbuttons" notext="Kontynuuj" yestext="Pobieranie"/> + </notification> <notification name="DownloadMacMandatory"> Nowa wersja [APP_NAME] zostaÅ‚a opublikowana. [MESSAGE] Musisz zainstalować nowÄ… wersjÄ™ żeby używać [APP_NAME]. -ZaÅ‚adować do foldera Aplikacji? +Pobrać i zapisać w folderze Aplikacji? <usetemplate name="okcancelbuttons" notext="Wyłącz program" yestext="ZaÅ‚aduj"/> </notification> <notification name="DownloadMac"> @@ -1249,7 +1211,7 @@ ZaÅ‚adować do foldera Aplikacji? [MESSAGE] Aktualizacja nie jest wymagana ale jest zalecana w celu poprawy prÄ™dkoÅ›ci i stabilnoÅ›ci. -ZaÅ‚adować do foldera Aplikacji? +Pobrać i zapisać w folderze Aplikacji? <usetemplate name="okcancelbuttons" notext="Kontynuuj" yestext="ZaÅ‚aduj"/> </notification> <notification name="DownloadMacReleaseForDownload"> @@ -1257,55 +1219,51 @@ ZaÅ‚adować do foldera Aplikacji? [MESSAGE] Aktualizacja nie jest wymagana ale jest zalecana w celu poprawy prÄ™dkoÅ›ci i stabilnoÅ›ci. -ZaÅ‚adować do foldera Aplikacji? +Pobrać i zapisać w folderze Aplikacji? <usetemplate name="okcancelbuttons" notext="Kontynuuj" yestext="ZaÅ‚aduj"/> </notification> <notification name="DeedObjectToGroup"> - Przekazanie tego obiektu spowoduje, że grupa: + Przekazanie tego obiektu spowoduje, że Grupa: * Otrzyma L$ zapÅ‚acone temu obiektowi - <usetemplate ignoretext="PrzekazujÄ…c obiekty grupom" name="okcancelignore" notext="Anuluj" yestext="Przekaż"/> + <usetemplate ignoretext="ProszÄ™ potwierdzić decyzjÄ™ przed przepisaniem obiektu do grupy" name="okcancelignore" notext="Anuluj" yestext="Przekaż"/> </notification> <notification name="WebLaunchExternalTarget"> - Otworzyć systemowÄ… przegłądarke żeby zobaczyć tÄ… zawartość? - <usetemplate ignoretext="OtwierajÄ…c systemowÄ… przeglÄ…darkÄ™ żeby zobaczyć stronÄ™" name="okcancelignore" notext="Anuluj" yestext="OK"/> + Czy chcesz otworzyć swojÄ… przeglÄ…darkÄ™ internetowÄ… by zobaczyć zawartość? + <usetemplate ignoretext="Uruchom przeglÄ…darkÄ™ internetowÄ… by zobaczyć stronÄ™ internetowÄ…" name="okcancelignore" notext="Anuluj" yestext="OK"/> </notification> <notification name="WebLaunchJoinNow"> - Otworzyć stronÄ™ www.secondlife.com żeby zarzÄ…dzać Twoim kontem? - <usetemplate ignoretext="OtwierajÄ…c systemowÄ… przeglÄ…darkÄ™ żeby zarzÄ…dzać Twoim kontem" name="okcancelignore" notext="Anuluj" yestext="OK"/> + By dokonać zmian i aktualizacji swojego konta, odwiedź [http://secondlife.com/account/ Dashboard]. + <usetemplate ignoretext="Uruchom przeglÄ…darkÄ™ internetowÄ… by dokonać zmian w konfiguracji mojego konta" name="okcancelignore" notext="Anuluj" yestext="OK"/> </notification> <notification name="WebLaunchSecurityIssues"> Odwiedź [SECOND_LIFE] Wiki i zobacz jak zgÅ‚aszać problemy z bezpieczeÅ„stwem danych. - <usetemplate ignoretext="OtwierajÄ…c przeglÄ…darkÄ™ żeby zobaczyć Wiki kwestii bezpieczeÅ„stwa danych" name="okcancelignore" notext="Anuluj" yestext="OK"/> + <usetemplate ignoretext="Uruchom przeglÄ…darkÄ™ internetowÄ… by dowiedzieć siÄ™ wiÄ™cej na temat zgÅ‚aszania problemów bezpieczeÅ„stwa" name="okcancelignore" notext="Anuluj" yestext="OK"/> </notification> <notification name="WebLaunchQAWiki"> Odwiedź [SECOND_LIFE] Wiki pytaÅ„ i odpowiedzi. - <usetemplate ignoretext="OtwierajÄ…c przeglÄ…darkÄ™ żeby zobaczyć Wiki pytaÅ„ i odpowiedzi" name="okcancelignore" notext="Anuluj" yestext="OK"/> + <usetemplate ignoretext="Uruchom przeglÄ…darkÄ™ internetowÄ… by zobaczyć QA Wiki" name="okcancelignore" notext="Anuluj" yestext="OK"/> </notification> <notification name="WebLaunchPublicIssue"> Odwiedź [SECOND_LIFE] katalog publicznych problemów, gdzie możesz zgÅ‚aszać błędy i inne problemy. - <usetemplate ignoretext="OtwierajÄ…c przeglÄ…darkÄ™ żeby zobaczyć katalog publicznych problemów" name="okcancelignore" notext="Anuluj" yestext="OK"/> - </notification> - <notification name="WebLaunchPublicIssueHelp"> - Odwiedź [SECOND_LIFE] Wiki i sprawdź jak używać katalogu publicznych problemów. - <usetemplate ignoretext="OtwierajÄ…c przeglÄ…darkÄ™ żeby zobaczyć Wiki katalogu publicznych problemów" name="okcancelignore" notext="Anuluj" yestext="OK"/> + <usetemplate ignoretext="Uruchom przeglÄ…darkÄ™ internetowÄ… by wysÅ‚ać Błędy Klienta" name="okcancelignore" notext="Anuluj" yestext="OK"/> </notification> <notification name="WebLaunchSupportWiki"> Otwórz oficjalny blog Lindenów żeby zobaczyć nowe wiadomoÅ›ci i informacje. - <usetemplate ignoretext="OtwierajÄ…c przeglÄ…darkÄ™ żeby zobaczyć blog" name="okcancelignore" notext="Anuluj" yestext="OK"/> + <usetemplate ignoretext="Uruchom przeglÄ…darkÄ™ internetowÄ… by zobaczyć blog" name="okcancelignore" notext="Anuluj" yestext="OK"/> </notification> <notification name="WebLaunchLSLGuide"> - Otworzyć przewodnik skryptowania po pomoc ze skryptami? - <usetemplate ignoretext="OtwierajÄ…c przeglÄ…darkÄ™ żeby zobaczyć przewodnik skryptowania" name="okcancelignore" notext="Anuluj" yestext="OK"/> + Czy chcesz otworzyć samouczek JÄ™zyka Skryptowania? + <usetemplate ignoretext="Uruchom przeglÄ…darkÄ™ internetowÄ… by samouczek JÄ™zyka Skryptowania" name="okcancelignore" notext="Anuluj" yestext="OK"/> </notification> <notification name="WebLaunchLSLWiki"> - Otworzyć portal LSL po pomoc ze skryptami? - <usetemplate ignoretext="OtwierajÄ…c przeglÄ…darkÄ™ żeby zobaczyć portal LSL" name="okcancelignore" notext="Anuluj" yestext="OK"/> + Czy napewno chcesz odwiedzić portal LSL Portal? + <usetemplate ignoretext="Uruchom przeglÄ…darkÄ™ internetowÄ… by LSL Portal" name="okcancelignore" notext="Anuluj" yestext="OK"/> </notification> <notification name="ReturnToOwner"> Czy na pewno chcesz zwrócić wybrane obiekty do ich wÅ‚aÅ›cicieli? Wszystkie udostÄ™pnione obiekty z prawem transferu zostanÄ… zwrócone poprzednim wÅ‚aÅ›cicielom. *UWAGA* Wszystkie udostÄ™pnione obiekty bez prawa transferu zostanÄ… usuniÄ™te! - <usetemplate ignoretext="ZwracajÄ…c obiekty ich wÅ‚aÅ›cicielom" name="okcancelignore" notext="Anuluj" yestext="OK"/> + <usetemplate ignoretext="Potwierdź zanim zwrócisz obiekty do ich wÅ‚aÅ›cicieli" name="okcancelignore" notext="Anuluj" yestext="OK"/> </notification> <notification name="GroupLeaveConfirmMember"> JesteÅ› czÅ‚onkiem grupy [GROUP]. @@ -1313,18 +1271,18 @@ Chcesz opuÅ›cić grupÄ™? <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> </notification> <notification name="ConfirmKick"> - NA PEWNO chcesz wyrzucić wszystkich użytkowników z sieci? - <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Wyrzuć Wszystkich Użytkowników"/> + Napewno chcesz wyrzucić wszystkich Rezydentów z gridu? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Wyrzuć wszystkich Rezydentów"/> </notification> <notification name="MuteLinden"> - Przepraszamy, ale nie możesz wyciszyć Lindena. + Przepraszamy, ale nie możesz zablokować Lindena. <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="CannotStartAuctionAlreadyForSale"> Aukcja nie może zostać rozpoczÄ™ta w posiadÅ‚oÅ›ci, która zostaÅ‚a już wczeÅ›niej wystawiona na aukcjÄ™. Deaktywuj opcjÄ™ sprzedaży posiadÅ‚oÅ›ci jeżeli chcesz rozpocząć aukcjÄ™. </notification> - <notification label="Błąd Wyciszenia Obiektu Przez NazwÄ™" name="MuteByNameFailed"> - Ta osoba zostaÅ‚a już wyciszona przez Ciebie. + <notification label="Zablokuj obiekty wedÅ‚ug wpisanej nazwy" name="MuteByNameFailed"> + Rezydent/obiekt jest już zablokowany. <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="RemoveItemWarn"> @@ -1341,19 +1299,21 @@ Chcesz opuÅ›cić grupÄ™? </notification> <notification name="BusyModeSet"> Tryb Pracy jest włączony. -Czat i IMy bedÄ… ukryte. WysÅ‚ane IMy bÄ™dÄ… otrzymywaÅ‚y TwojÄ… odpowiedź Trybu Pracy. Propozycje teleportacji bÄ™dÄ… odrzucone. -Dodatkowo, wszystkie podarowane dla Ciebie obiekty bÄ™dÄ… automatycznie zapisywane w folderze "Kosz" w Twojej szafie. - <usetemplate ignoretext="WłączajÄ…c Tryb Pracy" name="okignore" yestext="OK"/> +Czat i IM bÄ™dÄ… ukryte. WysÅ‚ane IM bÄ™dÄ… otrzymywaÅ‚y TwojÄ… odpowiedź Trybu Pracy. Propozycje teleportacji bÄ™dÄ… odrzucone. +Dodatkowo, wszystkie podarowane dla Ciebie obiekty bÄ™dÄ… automatycznie zapisywane w folderze "Kosz" w Twojej szafie. + <usetemplate ignoretext="Status zmieniony na Tryb Pracy" name="okignore" yestext="OK"/> </notification> <notification name="JoinedTooManyGroupsMember"> - Należysz już do maksymalnej iloÅ›ci grup. -Musisz opuÅ›cić przynajmniej jednÄ… grupÄ™ żeby przyjąć czÅ‚onkostwo w tej grupie, albo musisz odmówić. W celu opuszczenia grupy wybierz opcjÄ™ 'Grupy...' z menu 'Edycja'. + Należysz już do maksymalnej iloÅ›ci grup. Opuść proszÄ™ przynajmniej jednÄ… grupÄ™ żeby przyjąć czÅ‚onkostwo w tej grupie, albo odmów. [NAME] oferuje Ci czÅ‚onkostwo w grupie. -[INVITE] <usetemplate name="okcancelbuttons" notext="Odmów" yestext="Przyjmij"/> </notification> + <notification name="JoinedTooManyGroups"> + Należysz już do maksymalnej iloÅ›ci grup. Opuść proszÄ™ przynajmiej jednÄ… grupÄ™ żeby przyjąć czÅ‚onkostwo w tej grupie, albo odmów. + <usetemplate name="okbutton" yestext="OK"/> + </notification> <notification name="KickUser"> - Z jakim komunikatem wyrzucić tego użytkownia? + Wyrzuć tego Rezydenta, wysyÅ‚ajÄ…c nastÄ™pujÄ…cy komunikat. <form name="form"> <input name="message"> Administrator wylogowaÅ‚ CiÄ™. @@ -1373,7 +1333,7 @@ Musisz opuÅ›cić przynajmniej jednÄ… grupÄ™ żeby przyjąć czÅ‚onkostwo w tej g </form> </notification> <notification name="FreezeUser"> - Z jakim komunikatem unieruchomić tego użytkownia? + Unieruchom tego Rezydenta, wysyÅ‚ajÄ…c nastÄ™pujÄ…cy komunikat. <form name="form"> <input name="message"> Unieruchomiono CiÄ™. Nie możesz siÄ™ ruszać ani rozmawiać. Administrator skontaktuje siÄ™ z TobÄ… poprzez IM. @@ -1383,7 +1343,7 @@ Musisz opuÅ›cić przynajmniej jednÄ… grupÄ™ żeby przyjąć czÅ‚onkostwo w tej g </form> </notification> <notification name="UnFreezeUser"> - Z jakim komunikatem odblokować tego użytkownia? + Cofnij unieruchomienie tego Rezydenta, wysyÅ‚ajÄ…c nastÄ™pujÄ…cy komunikat. <form name="form"> <input name="message"> Odblokowano CiÄ™. @@ -1403,7 +1363,7 @@ Musisz opuÅ›cić przynajmniej jednÄ… grupÄ™ żeby przyjąć czÅ‚onkostwo w tej g </form> </notification> <notification name="OfferTeleportFromGod"> - Wymusić przeniesienie użytkownika do miejsca Twojego pobytu? + WysÅ‚ać propozycjÄ™ teleportacji do Twojego miejsca? <form name="form"> <input name="message"> Zapraszam do siebie. Region: [REGION] @@ -1413,8 +1373,16 @@ Musisz opuÅ›cić przynajmniej jednÄ… grupÄ™ żeby przyjąć czÅ‚onkostwo w tej g </form> </notification> <notification name="TeleportFromLandmark"> - Na pewno chcesz siÄ™ teleportować? - <usetemplate ignoretext="TeleportujÄ…c z miejsca (LM) z Twojej szafy" name="okcancelignore" notext="Anuluj" yestext="Teleportuj"/> + Na pewno chcesz siÄ™ teleportować do <nolink>[LOCATION]</nolink>? + <usetemplate ignoretext="Potwierdź próbÄ™ teleportacji do zapisanego miejsca" name="okcancelignore" notext="Anuluj" yestext="Teleportuj"/> + </notification> + <notification name="TeleportToPick"> + Teleportuj do [PICK]? + <usetemplate ignoretext="Potwierdź, że chcesz teleportować siÄ™ do miejsca w Ulubionych" name="okcancelignore" notext="Anuluj" yestext="Teleportuj"/> + </notification> + <notification name="TeleportToClassified"> + Teleportuj do [CLASSIFIED]? + <usetemplate ignoretext="Potwierdź, że chcesz teleportować siÄ™ do lokalizacji z Reklamy" name="okcancelignore" notext="Anuluj" yestext="Teleportuj"/> </notification> <notification label="Wiadomość do Wszystkich w Twoim MajÄ…tku" name="MessageEstate"> Wpisz krótkÄ… wiadomość która zostanie wysÅ‚ana do wszystkich osób w Twoim majÄ…tku. @@ -1425,9 +1393,9 @@ Musisz opuÅ›cić przynajmniej jednÄ… grupÄ™ żeby przyjąć czÅ‚onkostwo w tej g </form> </notification> <notification label="Zmiana MajÄ…tku Lindenów" name="ChangeLindenEstate"> - Dokonujesz zmiany w Regionie Głównym należącym do Lindenów (Regiony Główne, Teen Grid, Orientacja). - -Żądana operacja jest wyjÄ…tkowo niebezpieczna dla wszystkich Rezydentów przebywajÄ…cych w regionie. Dodatkowo, zmiany dokonane w Regionie Głównym mogÄ… spowodować problemy przestrzeni serwerowej innych regionów. + Czy napewno chcesz zmienić ustawienia majÄ…tku Linden (mainland, teen grid, orientacja, itp). + +Jest to wyjÄ…tkowo niebezpieczna decyzja, odczuwalna przez wszystkich Rezydentów. Dla mainland, spowoduje to zmianÄ™ tysiÄ™cy regionów oraz ich przestrzeÅ„ serwerowÄ…. Kontynuować? <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> @@ -1485,9 +1453,7 @@ Kontynuować? Ze wzglÄ™du na Twój wiek, nie jesteÅ› uprawniony do przebywania w tym regionie. Może być to wynikiem braku informacji na temat weryfikacji Twojego wieku. Upewnij siÄ™, że masz zainstalowanÄ… najnowszÄ… wersjÄ™ klienta i skorzystaj z [SECOND_LIFE]:Pomoc by uzyskać wiÄ™cej informacji na temat dostÄ™pu do regionów z podanym rodzajem treÅ›ci jakÄ… zawiera. - <usetemplate - name="okbutton" - yestext="OK"/> + <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="RegionEntryAccessBlocked_KB"> Ze wzglÄ™du na Twój wiek, nie jesteÅ› uprawniony do przebywania w tym regionie. @@ -1496,37 +1462,26 @@ Skorzystaj z [SECOND_LIFE]:Pomoc by uzyskać wiÄ™cej informacji na temat dostÄ™p <url name="url"> https://support.secondlife.com/ics/support/default.asp?deptID=4417&task=knowledge&questionID=6010 </url> - <usetemplate - name="okcancelignore" - yestext="[SECOND_LIFE]:Pomoc" - notext="Zamknij" - ignoretext="DostÄ™p do posiadÅ‚oÅ›ci jest zablokowany ze wzglÄ™du na rodzaj treÅ›ci jakÄ… zawiera"/> + <usetemplate ignoretext="Ze wzglÄ™du na Twój wiek, nie jesteÅ› uprawniony do przebywania w tym regionie. Może być to wynikiem braku informacji na temat weryfikacji Twojego wieku." name="okcancelignore" notext="Zamknij" yestext="[SECOND_LIFE]:Pomoc"/> </notification> <notification name="RegionEntryAccessBlocked_Notify"> Ze wzglÄ™du na Twój wiek, nie jesteÅ› uprawniony do przebywania w tym regionie. </notification> <notification name="RegionEntryAccessBlocked_Change"> - W zwiÄ…zku ze statusem ustawieÅ„ Twojego wieku, nie jesteÅ› uprawniony do przebywania w tym regionie. - -Możeszy wybrać 'ZmieÅ„ Ustawienia' by dokonać zmian w ustawieniach Twojego wieku by uzyskać dostÄ™p do regionu. Wówczas bÄ™dziesz w stanie znaleźć oraz mieć dostÄ™p do [REGIONMATURITY] treÅ›ci. Jeżeli zdecydujesz siÄ™ na powrót do poprzednich ustawieÅ„, wybierz Edycja > Ustawienia... > Główne. - <form name="form"> - <button - name="OK" - text="ZmieÅ„ Ustawienia"/> - <button - default="true" - name="Cancel" - text="Zamknij"/> - <ignore name="ignore" text="DostÄ™p do posiadÅ‚oÅ›ci jest zablokowany ze wzglÄ™du na ustawienia rodzaju treÅ›ci jakÄ… zawiera"/> - </form> + Ze wzglÄ™du na Twój wiek, nie jesteÅ› uprawniony do przebywania w tym regionie. + +Możesz wybrać 'ZmieÅ„ Ustawienia' by dokonać zmian w ustawieniach Twojego wieku by uzyskać dostÄ™p do regionu. Wówczas bÄ™dziesz w stanie znaleźć oraz mieć dostÄ™p do [REGIONMATURITY] treÅ›ci. Jeżeli zdecydujesz siÄ™ na powrót do poprzednich ustawieÅ„, wybierz Ja > Ustawienia > Główne. + <form name="form"> + <button name="OK" text="ZmieÅ„ Ustawienia"/> + <button default="true" name="Cancel" text="Zamknij"/> + <ignore name="ignore" text="Moje ustawienia wieku nie dopuszczajÄ… do regionu"/> + </form> </notification> <notification name="LandClaimAccessBlocked"> W zwiÄ…zku ze statusem ustawieÅ„ Twojego wieku, nie możesz odzyskać tej posiadÅ‚oÅ›ci. Możesz potrzebować weryfikacji wieku bÄ…dź instalacji najnowszej wersji klienta. Upewnij siÄ™, że masz zainstalowanÄ… najnowszÄ… wersjÄ™ klienta i skorzystaj z [SECOND_LIFE]:Pomoc by uzyskać wiÄ™cej informacji na temat dostÄ™pu do regionów z podanym rodzajem treÅ›ci jakÄ… zawiera. - <usetemplate - name="okbutton" - yestext="OK"/> + <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="LandClaimAccessBlocked_KB"> Ze wzglÄ™du na Twój wiek, nie możesz odzyskać tej posiadÅ‚oÅ›ci. @@ -1535,11 +1490,7 @@ Skorzystaj z [SECOND_LIFE]:Pomoc by uzyskać wiÄ™cej informacji na temat dostÄ™p <url name="url"> https://support.secondlife.com/ics/support/default.asp?deptID=4417&task=knowledge&questionID=6010 </url> - <usetemplate - name="okcancelignore" - yestext="[SECOND_LIFE]:Pomoc" - notext="Zamknij" - ignoretext="Odzyskanie posiadÅ‚oÅ›ci jest zablokowane ze wzglÄ™du na rodzaj treÅ›ci jakÄ… zwiera"/> + <usetemplate ignoretext="W zwiÄ…zku ze statusem ustawieÅ„ Twojego wieku, nie możesz odzyskać tej posiadÅ‚oÅ›ci." name="okcancelignore" notext="Zamknij" yestext="[SECOND_LIFE]:Pomoc"/> </notification> <notification name="LandClaimAccessBlocked_Notify"> Ze wzglÄ™du na Twój wiek, nie możesz odzyskać tej posiadÅ‚oÅ›ci. @@ -1547,20 +1498,14 @@ Skorzystaj z [SECOND_LIFE]:Pomoc by uzyskać wiÄ™cej informacji na temat dostÄ™p <notification name="LandClaimAccessBlocked_Change"> W zwiÄ…zku ze statusem ustawieÅ„ Twojego wieku, nie możesz odzyskać tej posiadÅ‚oÅ›ci. -Możeszy wybrać 'ZmieÅ„ Ustawienia' by dokonać zmian w ustawieniach Twojego wieku by uzyskać dostÄ™p do posiadÅ‚oÅ›ci. Wówczas bÄ™dziesz w stanie znaleźć, oraz mieć dostÄ™p do [REGIONMATURITY] treÅ›ci. Jeżeli zdecydujesz siÄ™ na powrót do poprzednich ustawieÅ„, wybierz Edycja > Ustawienia... > Główne. - <usetemplate - name="okcancelignore" - yestext="ZmieÅ„ Ustawienia" - notext="Zamknij" - ignoretext="Odzyskanie posiadÅ‚oÅ›ci jest zablokowane ze wzglÄ™du na ustawienia rodzaju treÅ›ci jakÄ… zawiera"/> +Możesz wybrać 'ZmieÅ„ Ustawienia' by dokonać zmian w ustawieniach Twojego wieku by uzyskać dostÄ™p do regionu. Wówczas bÄ™dziesz w stanie znaleźć oraz mieć dostÄ™p do [REGIONMATURITY] treÅ›ci. Jeżeli zdecydujesz siÄ™ na powrót do poprzednich ustawieÅ„, wybierz Ja > Ustawienia > Główne. + <usetemplate ignoretext="Ze wzglÄ™du na Twój wiek, nie możesz odzyskać tej posiadÅ‚oÅ›ci." name="okcancelignore" notext="Zamknij" yestext="ZmieÅ„ Ustawienia"/> </notification> <notification name="LandBuyAccessBlocked"> Ze wzglÄ™du na Twój wiek, nie możesz kupić tej posiadÅ‚oÅ›ci. Może być to wynikiem braku informacji na temat weryfikacji Twojego wieku. Upewnij siÄ™, że masz zainstalowanÄ… najnowszÄ… wersjÄ™ klienta i skorzystaj z [SECOND_LIFE]:Pomoc by uzyskać wiÄ™cej informacji na temat dostÄ™pu do regionów z podanym rodzajem treÅ›ci jakÄ… zawiera. - <usetemplate - name="okbutton" - yestext="OK"/> + <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="LandBuyAccessBlocked_KB"> Ze wzglÄ™du na Twój wiek, nie możesz kupić tej posiadÅ‚oÅ›ci. @@ -1569,11 +1514,7 @@ Skorzystaj z [SECOND_LIFE]:Pomoc by uzyskać wiÄ™cej informacji na temat dostÄ™p <url name="url"> https://support.secondlife.com/ics/support/default.asp?deptID=4417&task=knowledge&questionID=6010 </url> - <usetemplate - name="okcancelignore" - yestext="[SECOND_LIFE]:Pomoc" - notext="Zamknij" - ignoretext="Zakup posiadÅ‚oÅ›ci jest zablokowany ze wzglÄ™du na rodzaj treÅ›ci jakÄ… zawiera"/> + <usetemplate ignoretext="Ze wzglÄ™du na Twój wiek, nie możesz kupić tej posiadÅ‚oÅ›ci." name="okcancelignore" notext="Zamknij" yestext="[SECOND_LIFE]:Pomoc"/> </notification> <notification name="LandBuyAccessBlocked_Notify"> Ze wzglÄ™du na Twój wiek, nie możesz kupić tej posiadÅ‚oÅ›ci. @@ -1581,12 +1522,11 @@ Skorzystaj z [SECOND_LIFE]:Pomoc by uzyskać wiÄ™cej informacji na temat dostÄ™p <notification name="LandBuyAccessBlocked_Change"> W zwiÄ…zku ze statusem ustawieÅ„ Twojego wieku, nie możesz kupić tej posiadÅ‚oÅ›ci. -Możesz wybrać 'ZmieÅ„ Ustawienia' by dokonać zmian w ustawieniach Twojego wieku by uzyskać dostÄ™p do posiadÅ‚oÅ›ci. Wówczas bÄ™dziesz w stanie znaleźć oraz mieć dostÄ™p do [REGIONMATURITY] treÅ›ci. Jeżeli zdecydujesz siÄ™ na powrót do poprzednich ustawieÅ„, wybierz Edycja > Ustawienia... > Główne. - <usetemplate - name="okcancelignore" - yestext="ZmieÅ„ Ustawienia" - notext="Zamknij" - ignoretext="Zakup posiadÅ‚oÅ›ci jest zablokowany ze wzglÄ™du na ustawienia rodzaju treÅ›ci jakÄ… zawiera"/> +Możesz wybrać 'ZmieÅ„ Ustawienia' by dokonać zmian w ustawieniach Twojego wieku by uzyskać dostÄ™p do regionu. Wówczas bÄ™dziesz w stanie znaleźć oraz mieć dostÄ™p do [REGIONMATURITY] treÅ›ci. Jeżeli zdecydujesz siÄ™ na powrót do poprzednich ustawieÅ„, wybierz Ja > Ustawienia > Główne. + <usetemplate ignoretext="W zwiÄ…zku ze statusem ustawieÅ„ Twojego wieku, nie możesz kupić tej posiadÅ‚oÅ›ci." name="okcancelignore" notext="Zamknij" yestext="ZmieÅ„ Ustawienia"/> + </notification> + <notification name="TooManyPrimsSelected"> + Zbyt wiele wybranych obiektów. Wybierz [MAX_PRIM_COUNT] lub mniej i spróbuj ponownie </notification> <notification name="ProblemImportingEstateCovenant"> Problem z importem umowy majÄ…tku. @@ -1600,9 +1540,7 @@ Możesz wybrać 'ZmieÅ„ Ustawienia' by dokonać zmian w ustawieniach T </notification> <notification name="UnableToLoadNotecardAsset"> Brak możliwoÅ›ci zaÅ‚adowania noty w tej chwili. - <usetemplate - name="okbutton" - yestext="OK"/> + <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="NotAllowedToViewNotecard"> NiewystarczajÄ…ce prawa do zobaczenia notki przypisanej do wybranego ID. @@ -1620,19 +1558,11 @@ ZamieÅ›cić tÄ… reklamÄ™ za [AMOUNT]L$? </notification> <notification name="SetClassifiedMature"> Czy ta reklama zawiera treść 'Mature'? - <usetemplate - canceltext="Anuluj" - name="yesnocancelbuttons" - notext="Nie" - yestext="Tak"/> + <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Nie" yestext="Tak"/> </notification> <notification name="SetGroupMature"> Czy ta grupa zawiera treść 'Mature'? - <usetemplate - canceltext="Anuluj" - name="yesnocancelbuttons" - notext="Nie" - yestext="Tak"/> + <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Nie" yestext="Tak"/> </notification> <notification label="Potwierdź Restart" name="ConfirmRestart"> Na pewno chcesz zrobić restart tego regionu za 2 minuty? @@ -1646,201 +1576,14 @@ ZamieÅ›cić tÄ… reklamÄ™ za [AMOUNT]L$? <button name="Cancel" text="Anuluj"/> </form> </notification> - <notification label="Blokowanie KsztaÅ‚towania Terenu" name="HelpRegionBlockTerraform"> - Jeżeli ta opcja jest wybrana wÅ‚aÅ›ciciele posiadÅ‚oÅ›ci nie bÄ™dÄ… mogli ksztaÅ‚tować terenu niezależnie od ustawienia opcji 'Edycja Terenu' dla posiadÅ‚oÅ›ci. - -DomyÅ›lnie: nie wybrana - </notification> - <notification label="Blokowanie Latania" name="HelpRegionBlockFly"> - Jeżeli ta opcja jest wybrana ludzie nie bÄ™dÄ… mogli latać w tym regionie niezależnie od ustawienia opcji 'Latanie' dla posiadÅ‚oÅ›ci. - -DomyÅ›lnie: nie wybrana - </notification> - <notification label="Zezwalanie na Uszkodzenia" name="HelpRegionAllowDamage"> - Jeżeli ta opcja jest wybrana system zdrowia bÄ™dzie aktywny we wszystkich posiadÅ‚oÅ›ciach niezależnie od ustawieÅ„ dla indywidualnych posiadÅ‚oÅ›ci. Jeżeli ta opcja nie jest wybrana wÅ‚aÅ›ciciele indywidualych posiadÅ‚oÅ›ci bÄ™dÄ… mogli kontrolować system zdrowia w swoich posiadÅ‚oÅ›ciach. - -DomyÅ›lnie: nie wybrana - </notification> - <notification label="Limit Liczby Awatarów" name="HelpRegionAgentLimit"> - Wybierz maksymalnÄ… liczbÄ™ awatarów dozwolonÄ… w tym regionie. -Wydajność systemu może siÄ™ zmieniać w zależnoÅ›ci od liczby obecnych awatarów. - -DomyÅ›lnie: 40 - </notification> - <notification label="Ekstra Obiekty" name="HelpRegionObjectBonus"> - Ekstra Obiekty jest to mnożnik dla dozwolonych elementów (obiektów prostych). Dozwolony zakres to 1 do 10. Ustawienie '1' pozwala na 117 elementów na każdej posiadÅ‚oÅ›ci o powierzchni 512m. Ustawienie '2' pozwala na 234 elementy, czyli dwa razy tyle, itd. -Maksymalna liczba elementów w regionie to 15000 niezależnie od ustawienia Ekstra Obiektów. PamiÄ™taj - zmniejszenie Ekstra Obiektów po fakcie może spowodować odsyÅ‚anie lub usuwanie istniejÄ…cych obiektów. - -DomyÅ›lnie: 1,0 - </notification> - <notification label="Treść" name="HelpRegionMaturity"> - Aktywuj opcjÄ™ klasyfikacji regionu ze wzglÄ™du na treść jakÄ… zawiera, która zostaje wyÅ›wietlana w górnym pasku widoku w nazwie regionu oraz w podpowiedziach Mapy Åšwiata. Dodatkowo, opcja ta wpÅ‚ywa na dostÄ™p do wyników w czasie wyszukiwania danego regionu. By móc odwiedzić dany region lub mieć dostÄ™p do jego wyników w czasie wyszukiwania, Rezydent musi mieć takie same ustawienia dla treÅ›ci jak dany region. - -By dokonana zmiana zostaÅ‚a zsynchronizowana z MapÄ… Åšwiata, poczekaj kilka minut. - </notification> - <notification label="Blokowanie Popychania" name="HelpRegionRestrictPushObject"> - Ta opcja powoduje, że popychanie bÄ™dzie ograniczone w caÅ‚ym regionie. Jeżeli ta opcja jest wybrana Rezydenci mogÄ… być popchniÄ™ci tylko przez samych siebie lub przez wÅ‚aÅ›ciciela posiadÅ‚oÅ›ci. -(Popychanie odnosi sie do funkcji llPushObject() w LSL.) - -DomyÅ›lnie: nie wybrana - </notification> - <notification label="Dzielenie / ÅÄ…czenie PosiadÅ‚oÅ›ci" name="HelpParcelChanges"> - Ta opcja kontroluje czy posiadÅ‚oÅ›ci nie należące do wÅ‚aÅ›ciciela tego majÄ…tku mogÄ… być łączone / dzielone. -Jeżeli opcja nie jest wybrana: -* Tylko wÅ‚aÅ›ciciele majÄ…tku i zarzÄ…dcy mogÄ… łączyć / dzielić posiadÅ‚oÅ›ci. -* Tylko posiadÅ‚oÅ›ci należące do wÅ‚aÅ›ciciela albo do grupy mogÄ… być - łączone / dzielone przez czÅ‚onków z wystarczajÄ…cymi prawami. -Jeżeli ta opcja jest wybrana: -* Wszyscy wÅ‚aÅ›ciciele mogÄ… łączyć / dzielić swoje posiadÅ‚oÅ›ci. -* PosiadÅ‚oÅ›ci należące do grupy mogÄ… być łączone / dzielone - przez czÅ‚onków z wystarczajÄ…cymi prawami. - -DomyÅ›lnie: wybrana - </notification> - <notification label="Nie Pokazuj w Wyszukiwaniu" name="HelpRegionSearch"> - Wybranie tej opcji uniemożliwi wÅ‚aÅ›cicielom posiadÅ‚ość wyÅ›wietlanie ich posiadÅ‚oÅ›ci w wyszukiwaniu -DomyÅ›linie: nie wybrana - </notification> <notification label="Zmienione Restrykcje Wieku dla Regionu" name="RegionMaturityChange"> Ustawienie restrykcji wieku dla regionu zostaÅ‚o zmienione. Zazwyczaj musi upÅ‚ynąć nieco czasu zanim ta zmiana zostanie odzwierciedlona na mapie. - </notification> - <notification label="Odsprzedaż PosiadÅ‚oÅ›ci" name="HelpRegionLandResell"> - WÅ‚aÅ›ciciele majÄ…tku i zarzÄ…dcy mogÄ… sprzedawać posiadÅ‚oÅ›ci należące do wÅ‚aÅ›ciciela majÄ…tku. -Jeżeli ta opcja nie jest wybrana kupujÄ…cy nie bÄ™dÄ… mogli odsprzedać posiadÅ‚oÅ›ci w tym regionie. -Jeżeli ta opcja jest wybrana kupujÄ…cy bÄ™dÄ… mogli odsprzedać posiadÅ‚oÅ›ci w tym regionie. - -DomyÅ›linie: nie pozwalaj - </notification> - <notification label="Wyłącz Skrypty" name="HelpRegionDisableScripts"> - SÅ‚aba wydajność / prÄ™dkość symulatora może być spowodowana przez skrypt. Otwórz panel Statystyki (Ctrl+Shift+1). Sprawdź ilość klatek na sekundÄ™ (FPS) w Fizyce Symulatora. Jeżeli jest mniej niż 45 wybierz panel Czas znajdujÄ…cy siÄ™ na dole panelu Statystyki. Jeżeli Czas Skryptów wynosi 25 ms lub wiÄ™cej kliknij na Główne Skrypty. Zobaczysz listÄ™ nazw i lokacji skryptów które mogÄ… być odpowiedzialne za pogorszenie wydajnoÅ›ci. - -Wybranie opcji Wyłącz Skrypty i naciÅ›niÄ™cie Zastosuj tymczasowo wyłączy wszystkie skrypty w tym regionie. Wybranie tej opcji może być niezbÄ™dne w celu umożliwienia podróży do lokacji wymienionego Głównego Skryptu. -Po przebyciu na miejsce zobacz skrypt i sprawdź czy jest on źródÅ‚em problemu. W razie potrzeby skontaktuj siÄ™ z wÅ‚aÅ›cicielem skryptu albo usuÅ„ lub zwróć obiekt. -Wyłączenie opcji Wyłącz Skrypty i naciÅ›niÄ™cie Zastosuj ponownie włączy skrypty w tym regionie. - -DomyÅ›lnie: nie wybrana - </notification> - <notification label="Wyłącz Kolizje" name="HelpRegionDisableCollisions"> - SÅ‚aba wydajność / prÄ™dkość symulatora może być spowodowana przez fizyczne obiekty. Otwórz panel Statystyki (Ctrl+Shift+1). Sprawdź ilość klatek na sekundÄ™ (FPS) w Fizyce Symulatora. Jeżeli jest mniej niż 45 wybierz panel Czas znajdujÄ…cy siÄ™ na dole panelu Statystyki. Jeżeli Czas Symulatora (Fizyka) wynosi 20 ms lub wiÄ™cej kliknij na Główne Kolizje. Zobaczysz listÄ™ nazw i lokacji fizycznych obiektów które mogÄ… być odpowiedzialne za pogorszenie wydajnoÅ›ci. - -Wybranie opcji Wyłącz Kolizje i naciÅ›niÄ™cie Zastosuj tymczasowo wyłączy kolizje obiektów. Wybranie tej opcji może być niezbÄ™dne w celu umożliwienia podróży do lokacji wymienionych Główneych Kolizji. -Po przebyciu na miejsce zobacz obiekt i sprawdź czy jest on źródÅ‚em kolizji z innymi obiektami. W razie potrzeby skontaktuj siÄ™ z wÅ‚aÅ›cicielem obiektu albo usuÅ„ lub zwróć obiekt. -Wyłączenie opcji Wyłącz Kolizje i naciÅ›niÄ™cie Zastosuj ponownie włączy kolizje w tym regionie. - -DomyÅ›lnie: nie wybrana - </notification> - <notification label="Wyłącz FizykÄ™" name="HelpRegionDisablePhysics"> - Opcja Wyłącz FizykÄ™ jest podobna do opcji Wyłącz Kolizje i spowoduje wyłączenie symulacji fizyki. Oznacza to, że nie tylko obiekty przestanÄ… siÄ™ zderzać, ale również awatary nie bÄ™dÄ… siÄ™ mogÅ‚y poruszać. - -Ta opcja powinna być używana wyłącznie w przypadku kiedy użycie opcji Wyłącz Kolizje nie zwiÄ™ksza wystarczajÄ…co wydajnoÅ›ci symulatora w celu sprawdzenia problemów zwiÄ…zanych z fizykÄ… i z kolizjami. - -Po zakoÅ„czeniu badaÅ„ musisz ponownie włączyć fizykÄ™ żeby awatary mogÅ‚y siÄ™ poruszać. - -DomyÅ›lnie: nie wybrana - </notification> - <notification label="Główne Kolizje" name="HelpRegionTopColliders"> - Pokaż listÄ™ obiektów potencjalnie doÅ›wiadczajÄ…cych najwiÄ™kszej iloÅ›ci kolizji miÄ™dzy obiektami. Te obiekty mogÄ… być odpowiedzialne za zmniejszenie wydajnoÅ›ci. Wybierz Widok > Statystyki i zobacz Symulator > Czas > Czas Symulatora (Fizyka) i sprawdź czy wiÄ™cej niż 20 ms jest spÄ™dzane w fizyce. - </notification> - <notification label="Główne Skrypty" name="HelpRegionTopScripts"> - Pokaż listÄ™ obiektów spÄ™dzajÄ…cych najwÄ™cej czasu wykonujÄ…c skrypty LSL. Te obiekty mogÄ… być odpowiedzialne za zmniejszenie wydajnoÅ›ci. Wybierz Widok > Statystyki i zobacz Symulator > Czas > Czas Skryptów i sprawdź czy wiÄ™cej niż 25 ms jest spÄ™dzane w skryptach. - </notification> - <notification label="Restart Regionu" name="HelpRegionRestart"> - Restart procesu na serwerze obsÅ‚ugujÄ…cym ten region za dwie minuty. Wszyscy Rezydenci w tym regionie zostanÄ… wylogowani. Region zapisze swoje dane i powinien wystartować w przeciÄ…gu 90 sekund. - -Restart regionu nie naprawi wiÄ™kszoÅ›ci problemów zwiÄ…zanych z wydajnoÅ›ciÄ… / prÄ™dkoÅ›ciÄ… i generalnie powinnien być używany na polecenie. - </notification> - <notification label="Poziom Wody" name="HelpRegionWaterHeight"> - Jest to poziom w metrach gdzie pojawia siÄ™ woda. Jeżeli jest wybrana inna wartość niż 20 i Twoja woda sÄ…siaduje z krawÄ™dziÄ… Å›wiata lub pustym miejscem to bÄ™dzie widoczny uskok. - -DomyÅ›lnie: 20 - </notification> - <notification label="Wznoszenie Terenu" name="HelpRegionTerrainRaise"> - Jest to dystans w metrach o który wÅ‚aÅ›ciciele posiadÅ‚oÅ›ci mogÄ… podnieść teren powyżej ustalonego poziomu odniesienia. - -DomyÅ›lnie: 4 - </notification> - <notification label="Obniżanie Terenu" name="HelpRegionTerrainLower"> - Jest to dystans w metrach o który wÅ‚aÅ›ciciele posiadÅ‚oÅ›ci mogÄ… obniżyć teren poniżej ustalonego poziomu odniesienia. - -DomyÅ›lnie: -4 - </notification> - <notification label="Åadowanie RAW Terenu" name="HelpRegionUploadRaw"> - Ten przycisk Å‚aduje plik .RAW dla tego regionu. -Plik musi mieć poprawne wymiary (RGB, 256x256) i 13 kanałów. -Najprostszy sposób na stworzenie pliku terenu to zapisanie istniejÄ…cego pliku RAW. Zalecany pierwszy krok to modyfikacje kanaÅ‚u czerwieni (wysokość terenu) i Å‚adowanie nowego pliku. - -Åadowanie pliku może zająć 45 sekund. ZaÅ‚adowanie terenu nie przemieÅ›ci obiektów znajdujÄ…cych siÄ™ na tym terenie, tylko teren i prawa przypisane do posiadÅ‚oÅ›ci ulegnÄ… zmianie. Może to spowodować, że niektóre obiekty zniknÄ… pod ziemiÄ…. - -Aby uzyskać wiÄ™cej informacji o edycji map wysokoÅ›ci sprawdź F1 Pomoc. - </notification> - <notification label="Zapisywanie RAW Terenu" name="HelpRegionDownloadRaw"> - Ten przycisk zapisuje plik zawierajÄ…cy mapÄ™ wysokoÅ›ci, wymiary posiadÅ‚oÅ›ci, dane o posiadÅ‚oÅ›ciach na sprzedaż i niektóre prawa przypisane do posiadÅ‚oÅ›ci w tym regionie. Jeżeli otwierasz ten plik w programie takim jak Photoshop musisz zdefniować wymiary dokumentu jako: RGB, 256x256, 13 kanałów. Ten plik terenu nie może zostać otwarty w żaden inny sposób. - -Aby uzyskać wiÄ™cej informacji o edycji map wysokoÅ›ci sprawdź F1 Pomoc. - </notification> - <notification label="Używaj SÅ‚oÅ„ca MajÄ…tku" name="HelpRegionUseEstateSun"> - Ta opcja ustala pozycjÄ™ sÅ‚oÅ„ca w tym regionie żeby byÅ‚a taka sama jak pozycja sÅ‚oÅ„ca w reszcie majÄ…tku. - -DomyÅ›lnie: włączona - </notification> - <notification label="StaÅ‚e SÅ‚oÅ„ce" name="HelpRegionFixedSun"> - Ta opcja ustala pozycjÄ™ sÅ‚oÅ„ca do pozycji w suwaku faz i unieruchamia sÅ‚oÅ„ce w wybranej pozycji. - -DomyÅ›lnie: nie włączona - </notification> - <notification label="Ustalanie Terenu" name="HelpRegionBakeTerrain"> - Ten przycisk zapisuje obecne uksztaÅ‚towanie terenu jako nowy punkt odniesienia dla regionu. Po ustaleniu punktu odniesienia teren może zostać odtworzony do zapisanego ksztaÅ‚tu wybierajÄ…c opcjÄ™ Odtwórz w Edycji Terenu. Zapisany, ustalony teren jest również punktem odniesienia dla górnego i dolnego limitu zmian wysokoÅ›ci. - </notification> - <notification label="ZarzÄ…dcy MajÄ…tku" name="HelpEstateEstateManager"> - ZarzÄ…dca majÄ…tku jest Rezydentem oddelegowanym przez Ciebie do kontroli ustawieÅ„ regionu i majÄ…tku. ZarzÄ…dca majÄ…tku może zmieniać wszystkie ustawienia dostÄ™pne na tym panelu, za wyjÄ…tkiem Å‚adowania, zapisywania i ustalania terenu. W szczgólnoÅ›ci może kontrolować dostÄ™p innych Rezydentów (bany) do Twojego majÄ…tku. - -ZarzÄ…dcy majÄ…tku mogÄ… być dodawani i usuwani wyłącznie przez wÅ‚aÅ›ciciela majÄ…tku. Wybieraj na zarzÄ…dców tylko tych Rezydentów którym ufasz ponieważ ponosisz odpowiedzialność za ich dziaÅ‚ania. - </notification> - <notification label="Używaj Globalnego Czasu" name="HelpEstateUseGlobalTime"> - Ta opcja ustala pozycjÄ™ sÅ‚oÅ„ca w Twoim majÄ…tku żeby byÅ‚a taka sama jak pozycja sÅ‚oÅ„ca w regionach głównych należących do Lindenów. - </notification> - <notification label="StaÅ‚e SÅ‚oÅ„ce" name="HelpEstateFixedSun"> - Ta opcja ustala pozycjÄ™ sÅ‚oÅ„ca do pozycji w suwaku faz i unieruchamia sÅ‚oÅ„ce w wybranej pozycji. - </notification> - <notification label="DostÄ™p Publiczny" name="HelpEstateExternallyVisible"> - Ta opcja kontroluje czy Rezydenci znajdujÄ…cy siÄ™ w innych majÄ…tkach mogÄ… przenosić siÄ™ do tego majÄ…tku jeżeli nie sÄ… umieszczeni na liÅ›cie dostÄ™pu. - -DomyÅ›lnie: włączona - </notification> - <notification label="Pozwalaj na BezpoÅ›redniÄ… TeleportacjÄ™" name="HelpEstateAllowDirectTeleport"> - Włączenie tej opcji pozwala Rezydentom na bezpoÅ›redniÄ… teleportacjÄ™ do dowolnego miejsca a Twoim majÄ…tku. Jeżeli ta opcja nie jest wyłączona Rezydenci mogÄ… siÄ™ teleportować do najbliższego teleportera. -DomyÅ›lnie: nie włączona - </notification> - <notification label="DostÄ™p do MajÄ…tku" name="HelpEstateAllowResident"> - DostÄ™p do tego majÄ…tku bÄ™dzie ograniczony do wymienionych Rezydentów i poniższych grup. Ta opcja jest dostÄ™pna tylko wtedy kiedy opcja DostÄ™pu Publicznego jest wyłączona. - </notification> - <notification label="DostÄ™p Grup do MajÄ…tku" name="HelpEstateAllowGroup"> - DostÄ™p do tego majÄ…tku bÄ™dzie ograniczony do wymienionych grup i powyższych Rezydentów. Ta opcja jest dostÄ™pna tylko wtedy kiedy opcja DostÄ™pu Publicznego jest wyłączona. - </notification> - <notification label="Email o Nadużyciach" name="HelpEstateAbuseEmailAddress"> - Wpisanie ważnego email adresu spowoduje, że raporty o nadużyciach w obrÄ™bie tego majÄ…tku bÄ™dÄ… wysyÅ‚ane na ten adres. Zostawienie pustego miejsca spowoduje, że raporty o nadużyciach bÄ™dÄ… wysyÅ‚ane wyłącznie do Linden Lab. - </notification> - <notification label="WstÄ™p Wzbroniony (bany)" name="HelpEstateBanResident"> - Rezydenci umieszczeni na tej liÅ›cie nie majÄ… dostÄ™pu do Twojego majÄ…tku, niezależnie od jakichkolwiek innych ustawieÅ„. - </notification> - <notification label="Pozwalaj na Rozmowy" name="HelpEstateVoiceChat"> - PosiadÅ‚oÅ›ci w tym majÄ…tku mogÄ… mieć wÅ‚asne kanaÅ‚y gÅ‚osu pozwalajÄ…ce Rezydentom na rozmowy z osobami w pobliżu. - -DomyÅ›lnie: nie włączone +Aby wejść do regionu Adult, Rezydenci muszÄ… posiadać zweryfikowane konto, albo w wyniku weryfikacji wieku albo pÅ‚atoÅ›ci. </notification> <notification label="Wersja Niezgodna z Systemem Rozmów" name="VoiceVersionMismatch"> - Ta wersja [APP_NAME] nie jest kompatybilna z systemem Rozmów w tym regionie. Musisz zainstalować aktualnÄ… wersjÄ™ [APP_NAME] żeby Rozmowy dziaÅ‚aÅ‚y porawnie. - </notification> - <notification label="Umowa MajÄ…tku" name="HelpEstateCovenant"> - Włączenie opcji umowy majÄ…tku jest wymagane w celu umożliwienia sprzedaży posiadÅ‚oÅ›ci w obrÄ™bie majÄ…tku. -Jeżeli opcja umowy nie jest wybrana sprzedaż posiadÅ‚oÅ›ci nie jest dozwolona. Notka okreÅ›lajÄ…ca TwojÄ… umowÄ™ może być pusta jeżeli nie chcesz ustalić zasad specyficznych dla Twojego majÄ…tku i jeżeli nie chcesz uprzedzać nabywców o faktach odnoszÄ…cych siÄ™ do posiadÅ‚oÅ›ci przed zakupem. - -Umowa może być używana w celu okreÅ›lenia zasad, zaleceÅ„, przekazywania informacji o kulturze lub, po prostu, Twoich wÅ‚asnych oczekiwaÅ„ w odniesieniu do potencjalnego nabywacy. -Możesz zdefiniować zasady podziaÅ‚u posidÅ‚oÅ›ci, prawa budowlane, zasady opÅ‚at i wszystkie dodatkowe informacje z którymi nowy wÅ‚aÅ›ciciel powinien zapoznać siÄ™ i zaakceptować przed zakupem. - -Nabywca musi wybrać opcjÄ™ akceptacji umowy żeby trasakcja mogÅ‚a zostać sfinalizowana. Umowa majÄ…tku jest zawsze dostÄ™pna w dialogu O PosiadÅ‚oÅ›ci dla każedej posiadÅ‚oÅ›ci ze zdefinowanÄ… umowÄ…. + Ta wersja [APP_NAME] nie jest kompatybilna z systemem rozmów w tym Regionie. Musisz zainstalować aktualnÄ… wersjÄ™ [APP_NAME] aby komunikacja gÅ‚osowa dziaÅ‚aÅ‚a poprawnie. </notification> <notification label="Nie Można Kupić Obiektów" name="BuyObjectOneOwner"> Jednorazowo możesz kupować tylko od jednego wÅ‚aÅ›ciciela. @@ -1917,63 +1660,45 @@ Wpisz hasÅ‚o ponownie i kliknij OK. </notification> <notification name="SetPickLocation"> Uwaga: -Lokacja tego wyboru zostaÅ‚a zaktualizowana ale pozostaÅ‚e szczegóły zachowajÄ… oryginalne wartoÅ›ci. +Lokalizacja tego wyboru zostaÅ‚a zaktualizowana ale pozostaÅ‚e szczegóły zachowajÄ… oryginalne wartoÅ›ci. <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="MoveInventoryFromObject"> - Wybrane obiekty szafy nie majÄ… praw kopiowania. -Obiekty zostanÄ… przeniesione do Twojej szafy, nie zostanÄ… skopiowane. + Wybrane obiekty Szafy nie majÄ… praw kopiowania. +Obiekty zostanÄ… przeniesione do Twojej Szafy, nie zostanÄ… skopiowane. -Przenieść obiekty szafy? - <usetemplate ignoretext="PrzenoszÄ…c szafÄ™ bez praw kopiowania z obiektów" name="okcancelignore" notext="Anuluj" yestext="OK"/> +Przenieść obiekty Szafy? + <usetemplate ignoretext="Uprzedź przed przeniesieniem zawartoÅ›ci niekopiowalnej z obiektu" name="okcancelignore" notext="Anuluj" yestext="OK"/> </notification> <notification name="MoveInventoryFromScriptedObject"> - Wybrane obiekty szafy nie majÄ… praw kopiowania. + Wybrane obiekty Szafy nie majÄ… praw kopiowania. Obiekty zostanÄ… przeniesione do Twojej Szafy, nie zostanÄ… skopiowane. -Ponieważ obiekty zawierajÄ… skrypty, przeniesienie obiektów do Twojej szafy może spowodować niepoprawne dziaÅ‚anie skryptów. +Ponieważ obiekty zawierajÄ… skrypty, przeniesienie obiektów do Twojej Szafy może spowodować niepoprawne dziaÅ‚anie skryptów. Przenieść obiekty szafy? - <usetemplate ignoretext="PrzenoszÄ…c szafÄ™ bez praw kopiowania ze skryptowanych obiektów" name="okcancelignore" notext="Anuluj" yestext="OK"/> + <usetemplate ignoretext="Uprzedź przed przeniesieniem zawartoÅ›ci niekopiowalnej z obiektu, która może uszkodzić skrypty obiektu" name="okcancelignore" notext="Anuluj" yestext="OK"/> </notification> <notification name="ClickActionNotPayable"> - Uwaga: Opcja 'ZapÅ‚ać Obiektowi' zostaÅ‚a wybrana, ale żeby ta opcja dziaÅ‚aÅ‚a musi być dodany skrypt z funkcjÄ… money(). + Uwaga: Opcja ZapÅ‚ać Obiektowi zostaÅ‚a wybrana, ale żeby ta opcja dziaÅ‚aÅ‚a musi być dodany skrypt z funkcjÄ… money(). <form name="form"> - <ignore name="ignore" text="WybierajÄ…c opcjÄ™ ZapÅ‚ać Obiektowi dla obiektów bez funkcji money()"/> + <ignore name="ignore" text="Opcja ZapÅ‚ać Obiektowi zostaÅ‚a aktywowana podczas budowania obiektów bez skryptu z funkcjÄ… money()."/> </form> </notification> <notification name="OpenObjectCannotCopy"> W tym obiekcie nie ma elementów które możesz skopiować. </notification> <notification name="WebLaunchAccountHistory"> - Przejść na stronÄ™ [SECOND_LIFE] żeby zobaczyć historiÄ™ konta? - <usetemplate ignoretext="ÅadujÄ…c stronÄ™ historii konta." name="okcancelignore" notext="Anuluj" yestext="Idź na stronÄ™"/> - </notification> - <notification name="ClickOpenF1Help"> - Przejść na stronÄ™ [SECOND_LIFE]? - <usetemplate ignoretext="OdwiedzajÄ…c stronÄ™ [SECOND_LIFE]." name="okcancelignore" notext="Anuluj" yestext="Idź"/> + Przejść na stronÄ™ [http://secondlife.com/account/ Dashboard] żeby zobaczyć historiÄ™ konta? + <usetemplate ignoretext="Uruchom przeglÄ…darkÄ™ internetowÄ… by zobaczyć historiÄ™ konta" name="okcancelignore" notext="Anuluj" yestext="Idź na stronÄ™"/> </notification> <notification name="ConfirmQuit"> Na pewno chcesz skoÅ„czyć? - <usetemplate ignoretext="WyłączajÄ…c [APP_NAME]." name="okcancelignore" notext="Kontynuuj" yestext="Wyłącz"/> + <usetemplate ignoretext="Na pewno chcesz skoÅ„czyć?" name="okcancelignore" notext="Nie koÅ„cz" yestext="Wyłącz"/> </notification> <notification name="HelpReportAbuseEmailLL"> - Używaj tej opcji do zgÅ‚aszania nadużyć Warunków Umowy (Terms of Service) i Standardów SpoÅ‚eczeÅ„stwa (Community Standards). Zobacz: - -http://secondlife.com/corporate/tos.php -http://secondlife.com/corporate/cs.php - -Wszystkie zgÅ‚oszone nadużycia Warunków Umowy (Terms of Service) i Standardów SpoÅ‚eczeÅ„stwa (Community Standards) sÄ… badane i rozwiÄ…zywane. Możesz zobaczyć konkluzjÄ™ zgÅ‚oszenia w Raporcie ZgÅ‚oszeÅ„ pod: + Używaj tej opcji do zgÅ‚aszania nadużyć [http://secondlife.com/corporate/tos.php Warunków Umowy (Terms of Service)] i [http://secondlife.com/corporate/cs.php Standardów SpoÅ‚eczeÅ„stwa (Community Standards)]. -http://secondlife.com/support/incidentreport.php - </notification> - <notification name="HelpReportAbuseEmailEO"> - UWAGA: Ten raport zostanie wysÅ‚any do wÅ‚aÅ›ciciela regionu w którym siÄ™ znajdujesz i nie bÄ™dzie wysÅ‚any do Linden Lab. - -W ramach serwisu dla Rezydentów i goÅ›ci wÅ‚aÅ›ciciel tego regionu postanowiÅ‚ odbierać i rozwiÄ…zywać wszystkie reporty wysÅ‚ane z tego regionu. Linden Lab nie bÄ™dzie analizowaÅ‚ żadnych reportów zgÅ‚oszonych z tego miejsca. - -WÅ‚aÅ›ciciel regionu bÄ™dzie rozpatrywaÅ‚ raporty w oparciu o lokalne prawa tego regionu zdefiniowane w umowie majÄ…tku. (Możesz zobaczyć umowÄ™ wybierajÄ…c opcjÄ™ O PosiadÅ‚oÅ›ci z menu Åšwiat.) - -RozwiÄ…zanie tego raportu odnosi siÄ™ wyłącznie do tego regionu; konkluzja tego raportu nie bÄ™dzie miaÅ‚a wpÅ‚ywu na dostÄ™p Rezydentów do innych regionów w [SECOND_LIFE]. Wyłącznie Linden Lab może caÅ‚kowicie odebrać dostÄ™p do [SECOND_LIFE]. +Wszystkie zgÅ‚oszone nadużycia sÄ… badane i rozwiÄ…zywane. </notification> <notification name="HelpReportAbuseSelectCategory"> Wybierz kategoriÄ™ dla tego raportu o nadużyciu. @@ -2001,9 +1726,9 @@ DokÅ‚adne dane pomogÄ… nam w klasyfikacji i prztwarzaniu raportu. Jeżeli skÅ‚adasz raport dotyczÄ…cy naruszenia praw autorskich proszÄ™ siÄ™ upewnić, że robisz to poprawnie: -(1) Przypadek Nadużycia. Możesz zÅ‚ożyć raport jeżeli sÄ…dzisz, że Rezydent narusza system przywilejów [SECOND_LIFE], na przykÅ‚ad używajÄ…c CopyBot lub podobnych narzÄ™dzi robiÄ…cych kopie, naruszajÄ…c prawa autorskie. Komisja Nadużyć bada wykrocznia i stosuje akcje dyscyplinarne za zachowania sprzeczne z zasadami Warunków Umowy (Terms of Service) i Standardów SpoÅ‚eczeÅ„stwa (Community Standards) [SECOND_LIFE]. Komisja Nadużyć nie zajmuje siÄ™ i nie odpowiada na żądania usuniÄ™cia treÅ›ci ze Å›rodowiska [SECOND_LIFE]. +(1) Przypadek Nadużycia. Możesz zÅ‚ożyć raport jeżeli sÄ…dzisz, że Rezydent narusza system przywilejów [SECOND_LIFE], na przykÅ‚ad używajÄ…c CopyBot lub podobnych narzÄ™dzi robiÄ…cych kopie, naruszajÄ…c prawa autorskie. Komisja Nadużyć bada wykroczenia i stosuje akcje dyscyplinarne za zachowania sprzeczne z zasadami Warunków Umowy [SECOND_LIFE] [http://secondlife.com/corporate/tos.php Terms of Service] i Standardów SpoÅ‚eczeÅ„stwa [http://secondlife.com/corporate/cs.php Community Standards]. Komisja Nadużyć nie zajmuje siÄ™ i nie odpowiada na żądania usuniÄ™cia treÅ›ci ze Å›rodowiska [SECOND_LIFE]. -(2) Przypadek DMCA lub Usuwanie TreÅ›ci. Aby wystÄ…pić z żądaniem o usuniÄ™cie treÅ›ci ze Å›rodowiska [SECOND_LIFE] MUSISZ przedÅ‚ożyć ważne zawiadomienie o nadużyciu zgodne z naszÄ… polisÄ… DMCA pod http://secondlife.com/corporate/dmca.php. +(2) Przypadek DMCA lub Usuwanie TreÅ›ci. Aby wystÄ…pić z żądaniem o usuniÄ™cie treÅ›ci ze Å›rodowiska [SECOND_LIFE] MUSISZ przedÅ‚ożyć ważne zawiadomienie o nadużyciu zgodne z naszÄ… politykÄ… DMCA [http://secondlife.com/corporate/dmca.php DMCA Policy]. Jeżeli chcesz kontynuować dalej zamknij to okno i dokoÅ„cz wysyÅ‚anie raportu. Może być potrzebny wybór kategorii 'CopyBot albo Nadużycie Przywilejów'. @@ -2019,7 +1744,7 @@ Linden Lab Obecnie masz już dołączony obiekt do tej części Twojego ciaÅ‚a. Chcesz go zamienić na wybrany obiekt? <form name="form"> - <ignore name="ignore" save_option="true" text="ZamieniajÄ…c istniejÄ…ce dodatki"/> + <ignore name="ignore" save_option="true" text="Obecnie masz już dołączony obiekt do tej części Twojego ciaÅ‚a.Chcesz go zamienić na wybrany obiekt?"/> <button ignore="ZamieÅ„ Automatycznie" name="Yes" text="OK"/> <button ignore="Nie Zamieniaj" name="No" text="Anuluj"/> </form> @@ -2029,18 +1754,22 @@ Chcesz go zamienić na wybrany obiekt? Chcesz wyłączyć Tryb Pracy przed zakoÅ„czeniem tej tranzakcji? <form name="form"> - <ignore name="ignore" save_option="true" text="PÅ‚acÄ…c osobie lub obiektowi bÄ™dÄ…c w Trybie Pracy"/> + <ignore name="ignore" save_option="true" text="JesteÅ› w Trybie Pracy co oznacza, że nie dostaniesz żadnych obiektów w zamian za tÄ… opÅ‚atÄ™. Chcesz wyłączyć Tryb Pracy przed zakoÅ„czeniem tej transakcji?"/> <button ignore="Zawsz wyłączaj Tryb Pracy" name="Yes" text="OK"/> <button ignore="Nie wyłączaj Trybu Pracy" name="No" text="Anuluj"/> </form> </notification> + <notification name="ConfirmDeleteProtectedCategory"> + Ten folder '[FOLDERNAME]' to folder systemowy. UsuniÄ™cie foldera systemowego spowoduje niestabilność. Czy na pewno chcesz go skasować? + <usetemplate ignoretext="Potwierdź zanim folder systemu zostanie skasowany" name="okcancelignore" notext="Anuluj" yestext="OK"/> + </notification> <notification name="ConfirmEmptyTrash"> - Na pewno chcesz permanentnie usunąć zawartość Åšmietnika? - <usetemplate ignoretext="UsuwajÄ…c zawartość Åšmietnika" name="okcancelignore" notext="Anuluj" yestext="OK"/> + Na pewno chcesz permanentnie usunąć zawartość Kosza? + <usetemplate ignoretext="Potwierdź przed usuniÄ™ciem zawartoÅ›ci Kosza" name="okcancelignore" notext="Anuluj" yestext="OK"/> </notification> <notification name="ConfirmClearBrowserCache"> Na pewno chcesz wyczyÅ›cić bufor przeglÄ…darki? - <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Tak"/> + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> </notification> <notification name="ConfirmClearCookies"> Na pewno chcesz wyczyÅ›cić ciasteczka? @@ -2051,39 +1780,18 @@ Chcesz wyłączyć Tryb Pracy przed zakoÅ„czeniem tej tranzakcji? <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Tak"/> </notification> <notification name="ConfirmEmptyLostAndFound"> - Na pewno chcesz permanentnie usunąć zawartość Twojego foldera Zgubione i Znalezione? - <usetemplate ignoretext="UsuwajÄ…c szafÄ™ z Twojego foldera Zgubione i Znalezione" name="okcancelignore" notext="Nie" yestext="Tak"/> + Na pewno chcesz permanentnie usunąć zawartość Twojego foldera Zgubione i Odnalezione? + <usetemplate ignoretext="Potwierdź przed usuniÄ™ciem zawartoÅ›ci foldera Zagubione i Odnalezione" name="okcancelignore" notext="Nie" yestext="Tak"/> </notification> <notification name="CopySLURL"> - NastÄ™pujÄ…cy link SLurl zostaÅ‚ skopiowany do pamiÄ™ci podrÄ™cznej: + NastÄ™pujÄ…cy link SLURL zostaÅ‚ skopiowany do schowka: [SLURL] -Zamieść go na stronie Internetowej żeby umożliwić innym Å‚atwy dostÄ™p do tego miejsca, albo wklej go do panela adresu Twojej przeglÄ…darki żeby go wypróbować. +Zamieść go na stronie internetowej żeby umożliwić innym Å‚atwy dostÄ™p do tego miejsca, albo wklej go do panela adresu Twojej przeglÄ…darki żeby go otworzyć. <form name="form"> - <ignore name="ignore" text="KopiujÄ…c SLurl do pamiÄ™ci podrÄ™cznej"/> + <ignore name="ignore" text="SLurl skopiowany do schowka"/> </form> </notification> - <notification name="GraphicsPreferencesHelp"> - Ten panel kontroluje wymiary i rozdzielczość okna oraz jakość grafiki klienta. Panel Ustawienia > Grafika pozwala na wybór jednego z czterech poziomów jakoÅ›ci grafiki: Niska, Åšrednia, Wysoka i Super. Możesz również dostosować grafikÄ™ do wÅ‚asnych potrzeb wybierajÄ…c opcjÄ™ Zaawansowane i zmieniajÄ…c nastÄ™pujÄ…ce ustawienia: - -Shadery: Opcja ta pozwala włączyć i wyłączyć różne rodzaje shaderów pikseli. - -Ustawienia Odbić: OkreÅ›la rodzaje obiektów które mogÄ… odbijać siÄ™ w wodzie. - -Prezentacja Awatarów: OkreÅ›la opcje majÄ…ce wpÅ‚yw na rysowanie awatarów przez klienta. - -Głębia Rysowania: OkreÅ›la od jakiej odlegÅ‚oÅ›ci od pozycji kamery obiekty bÄ™dÄ… rysowane w tle. - -Liczba CzÄ…steczek: OkreÅ›la maksymalnÄ… liczbÄ™ czÄ…steczek widocznych jednoczeÅ›nie na ekranie. - -Jakość Post-Procesu: OkreÅ›la rozdzielczość z jakÄ… jest wyÅ›wietlana poÅ›wiata. - -Szczegóły Meszu: OkreÅ›la ilość szczegółów albo liczbÄ™ trójkÄ…tów używanÄ… przy rysowaniu pewnych obiektów. WiÄ™ksza wartość zwalnia prÄ™dkość rysowania ale powoduje, że obiekty wyglÄ…dajÄ… bardziej szczgółowo. - -Ustawienia ÅšwiatÅ‚a: OkreÅ›la jaki rodzaj Å›wiatÅ‚a jest używany do rysowania. - -Szczegóły Terenu: OkreÅ›la ilość szczgółów widocznÄ… w teksturach terenu. - </notification> <notification name="WLSavePresetAlert"> Chcesz zmienić zapisane ustawienia? <usetemplate name="okcancelbuttons" notext="Nie" yestext="Tak"/> @@ -2102,152 +1810,6 @@ Szczegóły Terenu: OkreÅ›la ilość szczgółów widocznÄ… w teksturach terenu. Efekt Post-Procesu już istnieje. Chcesz zapisać nowy na jego miejsce? <usetemplate name="okcancelbuttons" notext="Nie" yestext="Tak"/> </notification> - <notification name="HelpEditSky"> - Ustaw suwaki żeby stworzyć i zapisać zbiór nieb. - </notification> - <notification name="HelpEditDayCycle"> - Wybierz których nieb używać w przeciÄ…gu dnia. - </notification> - <notification name="EnvSettingsHelpButton"> - Te ustawienia zmieniajÄ… wyglÄ…d Å›rodowiska na Twoim komputerze. Twoja karta graficzna musi posiadać opcjÄ™ shaderów atmosfery aby umożliwić dostÄ™p do wszystkich ustawieÅ„. - -Ustaw suwak "Pora Dnia" żeby zmienić lokalnÄ… porÄ™ dnia w kliencie. - -Ustaw suwak "Chmury" żeby zmienić ilość chmur widocznÄ… na niebie. - -Wybierz kolor w selekcji "Kolor Wody" żeby zmienić kolor wody. - -Ustaw suwak "Zamglenie" żeby zmienić gÄ™stość zamglenia pod wodÄ…. - -Kliknij "Używaj Czasu Regionu" żeby dostosowywać porÄ™ dnia do pory dnia w regionie. - -Kliknij "Zaawansowane Niebo" żeby wybrać bardziej szczegółowy edytor ustawieÅ„ nieba. - -Kliknij "Zaawansowana Woda" żeby wybrać bardziej szczegółowy edytor ustawieÅ„ wody. - </notification> - <notification name="HelpDayCycle"> - Edytor Cyklu Dnia pozwala na kontrolÄ™ nieba podczas cyklu dnia/nocy w [SECOND_LIFE]. Ten cykl jest używany przez suwak Pora Dnia w podstawowym Edytorze Åšrodowiska. - -Edytor Cyklu Dnia ustala klatki odniesienia. SÄ… to punkty (widoczne jako szare plamki na wykresie czasu) które majÄ… przypisane Ustawienia Nieba. W miarÄ™ upÅ‚ywu czasu niebo jest animowane używajÄ…c Å›rednich pomiÄ™dzy klatkami odniesienia. - -Żółta strzaÅ‚ka powyżej linii czasu odpowiada biżącemu widokowi opartemu na Porze Dnia. Kliknij i przeciÄ…gnij strzaÅ‚kÄ™ żeby zobaczyć animacjÄ™ w przeciÄ…gu dnia. Możesz dodawać i usuwać klatki odniesienia używająć przycisków Dodaj i UsuÅ„ po prawej stronie linii czasu. - -DÅ‚ugość Cyklu dyktuje caÅ‚kowitÄ… dÅ‚ugość "dnia". Wybranie maÅ‚ej wartoÅ›ci (na przykÅ‚ad 2 min) oznacza, że Twoja 24-o godzinna linia czasu bÄ™dzie animowana w caÅ‚oÅ›ci w przeciÄ…gu dwóch minut czasu rzeczywistego! Po wybraniu odpowiednich ustawieÅ„ linii czasu i klatek odniesienia użyj przycisków Start i Stop żeby zobaczyć rezultaty. PamiÄ™taj - zawsze możesz używać żółtej strzaÅ‚ki wskażnika czasu powyżej linii czasu żeby zmieniać animacjÄ™ dynamicznie. Użycie przycisku Używaj Czasu Regionu zsynchronizuje TwojÄ… dÅ‚ugość dnia i czas z cyklem Regionu. - -Po zdefiniowaniu Cyklu Dnia możesz zapisać i zaÅ‚adować ustawienia używajÄ…c przycisków Zapisz Test Dnia i ZaÅ‚aduj Test Dnia. Uwaga, obecnie tylko jeden Cykl Dnia jest dozwolony. - </notification> - <notification name="HelpBlueHorizon"> - Ustaw suwaki Czerwony/Zielony/Niebieski (RGB) żeby zmienić kolor nieba. Możesz używać suwaka Intensywność (I) żeby zmieniać ustawienia suwaków wszystkich kolorów (RGB) jednoczeÅ›nie. - </notification> - <notification name="HelpHazeHorizon"> - Horyzont Zamglenia jest jednym z ważniejszych parametrów kontrolujÄ…cych oÅ›wietlenie sceny. Jest efektywnym do symulacji wielu ustawieÅ„ oÅ›wietlenia takich jak rozbyski sÅ‚oÅ„ca i ciemniejsze ustawienia zamkniÄ™tej przesÅ‚ony. - </notification> - <notification name="HelpBlueDensity"> - GÄ™stość Błękitu ma wpÅ‚yw na nasycenie koloru nieba i mgÅ‚y. Jeżeli przesuniesz suwak IntensywnoÅ›ci (I) w prawo kolory bÄ™dÄ… jaÅ›niejsze i żywsze. Jeżeli przesuniesz caÅ‚kowicie w lewo kolory bÄ™dÄ… rozmywać siÄ™ aż do przejÅ›cia w biel i czerÅ„. Jeżeli chcesz precyzyjnie kontrolować balans koloru nieba możesz używać suwaków kolorów Czerwony/Zielony/Niebieski (RGB) w celu zmiany nasycenia indywidualnych skÅ‚adników. - </notification> - <notification name="HelpHazeDensity"> - GÄ™stość Zamglenia kontroluje zawartość mÄ™tnego, szarego zamglenia w atmosferze. Jest to przydatne do symulacji scen z dużą iloÅ›ciÄ… dymu i zanieczyszczeÅ„. -Oraz do symulacji mgÅ‚y i zamgleÅ„. - </notification> - <notification name="HelpDensityMult"> - Mnożnik GÄ™stoÅ›ci wpÅ‚ywa na gÄ™stość atmosfery w caÅ‚oÅ›ci. Niskie ustawienie sprawia wrażenie lekkiego powietrza, wyższe ustawienia tworzÄ… bardzo ciężki, zamglony efekt. - </notification> - <notification name="HelpDistanceMult"> - Mnożnik Dystansu wpÅ‚ywa na postrzeganie dystansu. Wartość zero niweluje wpÅ‚yw dystansu na wyglÄ…d terenu i obiektów. -WartoÅ›ci wiÄ™ksze od 1 symulujÄ… wiÄ™kszy dystans tworzÄ…c silniejszy efekt atmosferyczny. - </notification> - <notification name="HelpMaxAltitude"> - Max Wysokość wpÅ‚ywa na obliczanie Å›wiatÅ‚a atmosferycznego. -O póżniejszych porach dnia ta wartość jest przydatna do regulacji percepcji dystansu zachodÄ…cego sÅ‚oÅ„ca. - </notification> - <notification name="HelpSunlightColor"> - Reguluje kolor i intensywność bezpoÅ›redniego Å›wiatÅ‚a w scenie. - </notification> - <notification name="HelpSunAmbient"> - Reguluje kolor i intensywność rozproszonego Å›wiatÅ‚a atmosferycznego w scenie. - </notification> - <notification name="HelpSunGlow"> - Suwak Rozmiar kontroluje wielkość sÅ‚oÅ„ca. -Suwak Ostrość kontroluje ostrość sÅ‚oÅ„ca na niebie. - </notification> - <notification name="HelpSceneGamma"> - Reguluje dystrybucjÄ™ Å›wiatÅ‚a i cienia na ekranie. - </notification> - <notification name="HelpStarBrightness"> - Reguluje blask gwiazd na niebie. - </notification> - <notification name="HelpTimeOfDay"> - Kontroluje pozycjÄ™ sÅ‚oÅ„ca na niebie. -Zbliżone do wysokoÅ›ci. - </notification> - <notification name="HelpEastAngle"> - Kontroluje pozycjÄ™ sÅ‚oÅ„ca na niebie. -Zbliżone do azymutu. - </notification> - <notification name="HelpCloudColor"> - Kontroluje kolor chmur. Generalnie powinny być biaÅ‚awe, ale hej, pobaw siÄ™ jeżeli masz ochotÄ™. - </notification> - <notification name="HelpCloudDetail"> - Kontroluje szczegółowy obraz naÅ‚ożony na górÄ™ głównego obrazu chmur. X i Y kontrolujÄ… jego pozycjÄ™. G (GÄ™stość) kontroluje jak puchate lub postrzÄ™pione sÄ… chmury. - </notification> - <notification name="HelpCloudDensity"> - Suwaki X i Y kontrolujÄ… pozycjÄ™ chmur. -Suwak G (GÄ™stość) kontroluje gÄ™stość chmur. - </notification> - <notification name="HelpCloudCoverage"> - Kontroluje ilość chmur pokrywajÄ…cych niebo. - </notification> - <notification name="HelpCloudScale"> - Kontroluje skalÄ™ obrazu chmur na kopule nieba. - </notification> - <notification name="HelpCloudScrollX"> - Kontroluje prÄ™dkość przemieszczania chmur wzdÅ‚uż osi X. - </notification> - <notification name="HelpCloudScrollY"> - Kontroluje prÄ™dkość przemieszczania chmur wzdÅ‚uż osi Y. - </notification> - <notification name="HelpClassicClouds"> - Wybierz tÄ… opcjÄ™ w celu używania dodatkowo starszej, klasycznej wersji chmur [SECOND_LIFE]. - </notification> - <notification name="HelpWaterFogColor"> - Kontroluje kolor podwodnej mgÅ‚y. - </notification> - <notification name="HelpWaterFogDensity"> - Kontroluje gÄ™stość mgÅ‚y i głębie wizji pod wodÄ…. - </notification> - <notification name="HelpUnderWaterFogMod"> - Modyfikuje wpÅ‚yw wykÅ‚adnika gÄ™stoÅ›ci mgÅ‚y na głębie wizji awatara pod wodÄ…. - </notification> - <notification name="HelpWaterGlow"> - Kontroluje emisjÄ™ Å›wiatÅ‚a z powierzchni wody. - </notification> - <notification name="HelpWaterNormalScale"> - Kontroluje skalÄ™ trzech zmarszczeÅ„ które tworzÄ… wodÄ™. - </notification> - <notification name="HelpWaterFresnelScale"> - Kontroluje jak dużo Å›wiatÅ‚a jest odbijane pod różnymi kÄ…tami. - </notification> - <notification name="HelpWaterFresnelOffset"> - Kontroluje jak dużo intensywnoÅ›ci Å›wiatÅ‚a jest odbijane. - </notification> - <notification name="HelpWaterScaleAbove"> - Kontroluje jak dużo Å›wiatÅ‚a odbija siÄ™ od górnej powierzchni wody. - </notification> - <notification name="HelpWaterScaleBelow"> - Kontroluje jak dużo Å›wiatÅ‚a odbija siÄ™ od dolnej powierzchni wody. - </notification> - <notification name="HelpWaterBlurMultiplier"> - Kontroluje jak fale i odbicia sÄ… mieszane. - </notification> - <notification name="HelpWaterNormalMap"> - Kontroluje która mapa normalnych jest używana w wodzie do okreÅ›lania odbić/zaÅ‚amaÅ„. - </notification> - <notification name="HelpWaterWave1"> - Kontroluje gdzie i jak szybko duża wersja mapy normalnych przemieszcza siÄ™ wzdÅ‚uż osi X i Y. - </notification> - <notification name="HelpWaterWave2"> - Kontroluje gdzie i jak szybko maÅ‚a wersja mapy normalnych przemieszcza siÄ™ wzdÅ‚uż osi X i Y. - </notification> <notification name="NewSkyPreset"> Nazwij nowe niebo. <form name="form"> @@ -2275,7 +1837,7 @@ Suwak G (GÄ™stość) kontroluje gÄ™stość chmur. Ustawienie już istnieje! </notification> <notification name="WaterNoEditDefault"> - DomyÅ›le ustawienie nie może być zmienione ani usuniÄ™te. + DomyÅ›lne ustawienie nie może być zmienione ani usuniÄ™te. </notification> <notification name="ChatterBoxSessionStartError"> Błąd podczas rozpoczynania czatu/IM z [RECIPIENT]. @@ -2293,8 +1855,7 @@ Suwak G (GÄ™stość) kontroluje gÄ™stość chmur. <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="Cannot_Purchase_an_Attachment"> - Rzeczy nie mogÄ… być kupione jeżeli - sÄ… częściÄ… załącznika. + Rzeczy nie mogÄ… być kupione jeżeli sÄ… częściÄ… załącznika. </notification> <notification label="ProÅ›ba o ZgodÄ™ na Pobieranie L$" name="DebitPermissionDetails"> AkceptujÄ…c tÄ… proÅ›bÄ™ wyrażasz zgodÄ™ na ciÄ…gÅ‚e pobieranie Lindenów (L$) z Twojego konta. Å»eby cofnąć to pozwolenie wÅ‚aÅ›ciciel obiektu bÄ™dzie musiaÅ‚ usunąć ten obiekt albo zresetowć skrypty obieku. @@ -2302,27 +1863,25 @@ Suwak G (GÄ™stość) kontroluje gÄ™stość chmur. </notification> <notification name="AutoWearNewClothing"> Czy chcesz automatycznie nosić ubranie które tworzysz? - <usetemplate ignoretext="Automatycznie noÅ› nowe ubranie" name="okcancelignore" notext="Nie" yestext="Tak"/> + <usetemplate ignoretext="Załóż ubranie automatycznie bÄ™dÄ…c w trybie Edycji WyglÄ…du" name="okcancelignore" notext="Nie" yestext="Tak"/> </notification> <notification name="NotAgeVerified"> - Nie masz dostÄ™pu do tej posiadÅ‚oÅ›ci ze wzglÄ™du na brak weryfikacji Twojego wieku. -Czy chcesz odwiedzić stronÄ™ [SECOND_LIFE] żeby to zmienić? + Nie masz dostÄ™pu do tej posiadÅ‚oÅ›ci ze wzglÄ™du na brak weryfikacji Twojego wieku. Czy chcesz odwiedzić stronÄ™ [SECOND_LIFE] żeby to zmienić? [_URL] <url name="url" option="0"> https://secondlife.com/account/verification.php </url> - <usetemplate ignoretext="Ostrzegaj o braku weryfikacji wieku" name="okcancelignore" notext="Nie" yestext="Tak"/> + <usetemplate ignoretext="Brak weryfikacji wieku" name="okcancelignore" notext="Nie" yestext="Tak"/> </notification> <notification name="Cannot enter parcel: no payment info on file"> - Nie masz dostÄ™pu do tej posiadÅ‚oÅ›ci ze wzglÄ™du na brak danych o Twoim koncie. -Czy chcesz odwiedzić stronÄ™ [SECOND_LIFE] żeby to zmienić? + Nie masz dostÄ™pu do tej posiadÅ‚oÅ›ci ze wzglÄ™du na brak danych o Twoim koncie. Czy chcesz odwiedzić stronÄ™ [SECOND_LIFE] żeby to zmienić? [_URL] <url name="url" option="0"> https://secondlife.com/account/ </url> - <usetemplate ignoretext="Ostrzegaj o braku danych konta" name="okcancelignore" notext="Nie" yestext="Tak"/> + <usetemplate ignoretext="Brak danych o koncie" name="okcancelignore" notext="Nie" yestext="Tak"/> </notification> <notification name="MissingString"> Zdanie [STRING_NAME] nie znalezione w strings.xml @@ -2371,11 +1930,10 @@ Czy chcesz odwiedzić stronÄ™ [SECOND_LIFE] żeby to zmienić? Plik terrain.raw Å›ciÄ…gniety. </notification> <notification name="GestureMissing"> - Gest [NAME] nie znaleziony w bazie danych. + Gesturka [NAME] nie znaleziony w bazie danych. </notification> <notification name="UnableToLoadGesture"> Åadowanie gestu [NAME] nie powiodÅ‚o siÄ™. -Spróbuj jeszcze raz. </notification> <notification name="LandmarkMissing"> Miejsce (LM) nie znalezione w bazie danych. @@ -2444,7 +2002,7 @@ Wybierz jeden obiekt. Wyłączanie trybu boskiego, poziom [LEVEL] </notification> <notification name="CopyFailed"> - Kopiowanie siÄ™ nie powiodÅ‚o - nie masz pozwolenia + Nie masz praw do skopiowania wybranych obiektów. </notification> <notification name="InventoryAccepted"> Podarunek od Ciebie zostaÅ‚ przyjÄ™ty przez [NAME]. @@ -2462,12 +2020,14 @@ Wybierz jeden obiekt. Twoja wizytówka zostaÅ‚a odrzucona. </notification> <notification name="TeleportToLandmark"> - JesteÅ› w Głównym Regionie i możesz siÄ™ stÄ…d teleportować do innych miejsc jak '[NAME]' wybierajÄ…c Moja Szafa w prawym dolnym rogu ekranu i wybierajÄ…c folder Miejsca (LM). -Kliknij dwa razy na miejsce (LM) i wybierz Teleportuj żeby tam siÄ™ przenieść. + JesteÅ› w Głównym Regionie i możesz siÄ™ stÄ…d teleportować do innych miejsc jak '[NAME]' wybierajÄ…c Moja Szafa w prawym dolnym rogu ekranu +i wybierajÄ…c folder Zapisane Miejsca (LM). +(Kliknij dwa razy na miejsce (LM) i wybierz 'Teleport' żeby tam siÄ™ przenieść.) </notification> <notification name="TeleportToPerson"> - JesteÅ› w Głównym Regionie i możesz komunikować siÄ™ z innymi Rezydentami jak '[NAME]' wybierajÄ…c Moja Szafa w prawym dolnym rogu ekranu i wybierajÄ…c folder Wizytówki. -Kliknij dwa razy na wizytówce, wybierz WyÅ›lij IM i napisz wiadomość. + Możesz skontaktować siÄ™ z Rezydentem '[NAME]' poprzez otworzenie panelu Ludzie po prawej stronie ekranu. +Wybierz Rezydenta z listy, nastÄ™pnie kliknij 'IM' na dole panelu. +(Możesz także kliknąć podwójnie na ich imiÄ™ na liÅ›cie, lub prawym przyciskiem i wybrać 'IM'). </notification> <notification name="CantSelectLandFromMultipleRegions"> Nie możesz przekraczać granic serwera wybierajÄ…c obszar. @@ -2490,6 +2050,9 @@ Spróbuj wybrać mniejszy obszar. <notification name="SystemMessage"> [MESSAGE] </notification> + <notification name="PaymentRecived"> + [MESSAGE] + </notification> <notification name="EventNotification"> Zawiadomienie o Imprezie: @@ -2515,7 +2078,19 @@ Spróbuj wybrać mniejszy obszar. </notification> <notification name="NoQuickTime"> WyglÄ…da na to, że QuickTime z Apple nie jest zainstalowany na Twoim komputerze. -Jeżeli chcesz odtwarzać media na tej posiadÅ‚oÅ›ci które używajÄ… QuickTime idź do http://www.apple.com/quicktime i zainstaluj odtwarzacz. +Jeżeli chcesz odtwarzać media na tej posiadÅ‚oÅ›ci które używajÄ… QuickTime idź do [http://www.apple.com/quicktime QuickTime site] i zainstaluj odtwarzacz. + </notification> + <notification name="NoPlugin"> + Nie znaleziono wtyczki mediów dla "[MIME_TYPE]" typu mime. Media tego typu bÄ™dÄ… niedostÄ™pne. + </notification> + <notification name="MediaPluginFailed"> + NastÄ™pujÄ…ce wtyczki mediów nie dziaÅ‚ajÄ…: + [PLUGIN] + +Zainstaluj proszÄ™ wtyczki ponownie lub skontaktuj siÄ™ z dostawcÄ… jeÅ›li nadal problem bÄ™dzie wystÄ™powaÅ‚. + <form name="form"> + <ignore name="ignore" text="Wtyczka mediów nie dziaÅ‚a"/> + </form> </notification> <notification name="OwnedObjectsReturned"> Twoje obiekty z wybranej posiadÅ‚oÅ›ci zostaÅ‚y zwrócone do Twojej Szafy. @@ -2524,7 +2099,7 @@ Jeżeli chcesz odtwarzać media na tej posiadÅ‚oÅ›ci które używajÄ… QuickTime Obiekty należące do [FIRST] [LAST] na wybranej posiadÅ‚oÅ›ci zostaÅ‚y zwrócone do szafy tej osoby. </notification> <notification name="OtherObjectsReturned2"> - Obiekty z wybranej posiadÅ‚oÅ›ci należącej do Rezydenta '[NAME]' zostaÅ‚y zwrócone do ich wÅ‚aÅ›ciciela. + Obiekty z posiadÅ‚oÅ›ci należącej do Rezydenta'[NAME]' zostaÅ‚y zwrócone do wÅ‚aÅ›ciciela. </notification> <notification name="GroupObjectsReturned"> Obiekty z wybranej posiadÅ‚oÅ›ci przypisane do grupy [GROUPNAME] zostaÅ‚y zwrócone do szafy ich wÅ‚aÅ›cicieli. @@ -2534,6 +2109,10 @@ Nieprzekazywalne obiekty przekazane grupie zostaÅ‚y usuniÄ™te. <notification name="UnOwnedObjectsReturned"> Obiekty z wybranej posiadÅ‚oÅ›ci które nie należą do Ciebie zostaÅ‚y zwrócone do ich wÅ‚aÅ›cicieli. </notification> + <notification name="ServerObjectMessage"> + Wiadomość od [NAME]: +<nolink>[MSG]</nolink> + </notification> <notification name="NotSafe"> Ta posiadÅ‚ość pozwala na uszkodzenia. Możesz doznać tutaj urazu. Jeżeli zginiesz nastÄ…pi teleportacja do Twojego miejsca startu. @@ -2543,15 +2122,13 @@ Możesz doznać tutaj urazu. Jeżeli zginiesz nastÄ…pi teleportacja do Twojego m Nie możesz tutaj latać. </notification> <notification name="PushRestricted"> - Popychanie niedozwolone. -Nie możesz tutaj popychać innych, chyba, że jesteÅ› wÅ‚aÅ›cicielem tej posiadÅ‚oÅ›ci. + Popychanie niedozwolone. Nie możesz tutaj popychać innych, chyba, że jesteÅ› wÅ‚aÅ›cicielem tej posiadÅ‚oÅ›ci. </notification> <notification name="NoVoice"> Ta posiadÅ‚ość nie pozwala na rozmowy. </notification> <notification name="NoBuild"> - Ta posiadÅ‚ość nie pozwala na budowanie. -Nie możesz tworzyć tutaj obiektów. + Ta posiadÅ‚ość nie pozwala na budowanie. Nie możesz tworzyć tutaj obiektów. </notification> <notification name="ScriptsStopped"> Administrator czasowo zatrzymaÅ‚ skrypty w tym regionie. @@ -2561,7 +2138,8 @@ Nie możesz tworzyć tutaj obiektów. </notification> <notification name="NoOutsideScripts"> Ta posiadÅ‚ość nie pozwala na zewnÄ™trzne skrypty. -Å»adne skrypty nie bÄ™dÄ… tutaj dziaÅ‚ać za wyjÄ…tkiem skryptów zleżących do wÅ‚aÅ›ciciela posiadÅ‚oÅ›ci. + +Å»adne skrypty nie bÄ™dÄ… tutaj dziaÅ‚ać za wyjÄ…tkiem skryptów należących do wÅ‚aÅ›ciciela posiadÅ‚oÅ›ci. </notification> <notification name="ClaimPublicLand"> Tylko publiczne posiadÅ‚oÅ›ci w tym regionie mogÄ… być przejÄ™te. @@ -2577,16 +2155,9 @@ Skorzystaj z [SECOND_LIFE]:Pomoc by uzyskać wiÄ™cej informacji na temat dostÄ™p <notification name="NoTeenGridAccess"> Twoje konto nie może zostać połączone z podanym regionem Teen Grid. </notification> - <notification name="NoHelpIslandTP"> - Brak możliwoÅ›ci ponownej teleportacji do Help Island. -Odwiedź 'Help Island Public' by powtórzyć szkolenie. - </notification> <notification name="ImproperPaymentStatus"> Nie posiadasz odpowiedniego statusu pÅ‚atniczego by uzyskać dostÄ™p do regionu. </notification> - <notification name="MustGetAgeRegion"> - By odwiedzić ten region, Twoje konto musi zostać poddane weryfikacji wieku. - </notification> <notification name="MustGetAgeParcel"> By móc przebywać na tej posiadÅ‚oÅ›ci wymagana jest weryfikacja Twojego wieku. </notification> @@ -2649,31 +2220,35 @@ Spróbuj ponowanie za kilka minut. Nieważana posiadÅ‚ość. </notification> <notification name="ObjectGiveItem"> - Obiekt [OBJECTFROMNAME] należący do [FIRST] [LAST] daÅ‚ Ci [OBJECTTYPE] [OBJECTNAME]. + Obiekt [OBJECTFROMNAME] należący do [NAME_SLURL] daÅ‚ Ci [OBJECTTYPE]: +[ITEM_SLURL] <form name="form"> <button name="Keep" text="Zachowaj"/> <button name="Discard" text="Wyrzuć"/> - <button name="Mute" text="Wycisz"/> + <button name="Mute" text="Zablokuj"/> </form> </notification> <notification name="ObjectGiveItemUnknownUser"> - Obiekt [OBJECTFROMNAME] należący do (wÅ‚aÅ›ciciel nieznany) daÅ‚ Ci [OBJECTTYPE] [OBJECTNAME]. + Obiekt [OBJECTFROMNAME] należący (wÅ‚aÅ›ciciel nieznany) daÅ‚ Ci [OBJECTTYPE]: +[ITEM_SLURL] <form name="form"> <button name="Keep" text="Zachowaj"/> <button name="Discard" text="Wyrzuć"/> - <button name="Mute" text="Wycisz"/> + <button name="Mute" text="Zablokuj"/> </form> </notification> <notification name="UserGiveItem"> - [NAME] daÅ‚ Ci [OBJECTTYPE] '[OBJECTNAME]'. + [NAME_SLURL] daÅ‚ Ci [OBJECTTYPE]: +[ITEM_SLURL] <form name="form"> - <button name="Keep" text="Zachowaj"/> + <button name="Show" text="Pokaż"/> <button name="Discard" text="Wyrzuć"/> - <button name="Mute" text="Wycisz"/> + <button name="Mute" text="Zablokuj"/> </form> </notification> <notification name="GodMessage"> [NAME] + [MESSAGE] </notification> <notification name="JoinGroup"> @@ -2685,7 +2260,7 @@ Spróbuj ponowanie za kilka minut. </form> </notification> <notification name="TeleportOffered"> - [NAME] proponuje Ci teleportacjÄ™ do siebie: + [NAME] proponuje Ci teleportcjÄ™ do siebie: [MESSAGE] <form name="form"> @@ -2693,6 +2268,9 @@ Spróbuj ponowanie za kilka minut. <button name="Cancel" text="Anuluj"/> </form> </notification> + <notification name="TeleportOfferSent"> + Oferta teleportacji wysÅ‚ana do [TO_NAME] + </notification> <notification name="GotoURL"> [MESSAGE] [URL] @@ -2712,6 +2290,9 @@ Spróbuj ponowanie za kilka minut. <button name="Decline" text="Odmów"/> </form> </notification> + <notification name="FriendshipOffered"> + Oferta znajomoÅ›ci dla [TO_NAME] + </notification> <notification name="OfferFriendshipNoMessage"> [NAME] proponuje Ci znajomość. @@ -2727,9 +2308,15 @@ Spróbuj ponowanie za kilka minut. <notification name="FriendshipDeclined"> Twoja propozycja znajomoÅ›ci zostaÅ‚a odrzucona przez [NAME]. </notification> + <notification name="FriendshipAcceptedByMe"> + Propozycja znajomoÅ›ci zostaÅ‚a zaakceptowana. + </notification> + <notification name="FriendshipDeclinedByMe"> + Propozycja znajomoÅ›ci zostaÅ‚a odrzucona. + </notification> <notification name="OfferCallingCard"> - [FIRST] [LAST] daje Ci swojÄ… wizytówkÄ™. -Wizytówka w Twojej Szafie może być używana do komunikowania siÄ™ (IM) z tym Rezydentem. + [FIRST] [LAST] daje Tobie swojÄ… wizytówkÄ™. +Wizytówka bÄ™dzie znajdowaÅ‚a siÄ™ w Szafie i umożliwi szybkie wysÅ‚anie IM do tego Rezydenta. <form name="form"> <button name="Accept" text="Zaakceptuj"/> <button name="Decline" text="Odmów"/> @@ -2740,7 +2327,7 @@ Wizytówka w Twojej Szafie może być używana do komunikowania siÄ™ (IM) z tym NastÄ…pi wylogowanie jeżeli zostaniesz w tym regionie. </notification> <notification name="RegionRestartSeconds"> - Restart regionu za [MINUTES] sek. + Restart regionu za [SECONDS] sec. NastÄ…pi wylogowanie jeżeli zostaniesz w tym regionie. </notification> <notification name="LoadWebPage"> @@ -2761,7 +2348,7 @@ Obiekt: [OBJECTNAME], wÅ‚aÅ›ciciel: [NAME]? [TYPE] [DESC] - nie znaleziono w bazie danych. </notification> <notification name="InvalidWearable"> - Obiekt, który chcesz zaÅ‚ożyć używa narzÄ™dzia nieobecnego w wersji klienta, którÄ… używasz. By go zaÅ‚ożyć Å›ciÄ…gnij najnowszÄ… wersjÄ™ klienta [APP_NAME]. + Obiekt, który chcesz zaÅ‚ożyć używa narzÄ™dzia nieobecnego w wersji klienta, którÄ… używasz. By go zaÅ‚ożyć Å›ciÄ…gnij najnowszÄ… wersjÄ™ [APP_NAME]. </notification> <notification name="ScriptQuestion"> '[OBJECTNAME]', wÅ‚aÅ›ciciel: '[NAME]', chciaÅ‚ by: @@ -2771,14 +2358,14 @@ Zgadzasz siÄ™? <form name="form"> <button name="Yes" text="Tak"/> <button name="No" text="Nie"/> - <button name="Mute" text="Wycisz"/> + <button name="Mute" text="Zablokuj"/> </form> </notification> <notification name="ScriptQuestionCaution"> - '[OBJECTNAME]', wÅ‚aÅ›ciciel: '[NAME]', chciaÅ‚ by: + Obiekt '[OBJECTNAME]', należący do '[NAME]' proponuje Ci: [QUESTIONS] -Jeżeli nie ufasz temu obiektowi lub jego twórcy - odmów. Wybierz Szczegóły żeby otrzymać wiÄ™cej informacji. +Jeżeli nie znasz tego obiektu lub kreatora, odmów. Zgadzasz siÄ™? <form name="form"> @@ -2801,39 +2388,12 @@ Zgadzasz siÄ™? <button name="Ignore" text="Zignoruj"/> </form> </notification> - <notification name="FirstBalanceIncrease"> - Przekazano Ci [AMOUNT]L$. -Obiekty i inni użytkownicy mogÄ… Ci dawać L$. -Twój balans jest wyÅ›wietlony w prawym górnym rogu ekranu. - </notification> - <notification name="FirstBalanceDecrease"> - Pobrano od Ciebie [AMOUNT]L$. -Twój balans jest wyÅ›wietlony w prawym górnym rogu ekranu. - </notification> - <notification name="FirstSit"> - Siedzisz. -Używaj strzaÅ‚ek (albo AWSD) żeby zmieniać widok. -NaciÅ›nij przycisk WstaÅ„ żeby sie podnieść. - </notification> - <notification name="FirstMap"> - Kliknij i przeciÄ…gnij by przsuwać mapÄ™. -Kliknij dwa razy żeby siÄ™ teleportować. -Używaj narzÄ™dzi po prawej stronie żeby znajdować i wyÅ›wietlać różne obiekty. - </notification> - <notification name="FirstBuild"> - Możesz budować nowe obiekty w niektórych miejscach. -Używaj narzÄ™dzi w lewym górnym rogu żeby budować, przyciskaj Ctrl lub Alt żeby szybko zmieniać narzÄ™dzia. -NaciÅ›nij Esc żeby skoÅ„czyć budować. - </notification> - <notification name="FirstLeftClickNoHit"> - Lewy klik żeby używać specjalnych obiektów. -Jeżeli strzaÅ‚ka zmieni siÄ™ na rÄ…czkÄ™ możesz używać tego obiektu. -Prawy klik zawsze pokazuje menu dostÄ™pnych operacji. - </notification> - <notification name="FirstTeleport"> - NastÄ…piÅ‚a teleportacja. -JesteÅ› przy Infohub najbliższej Twojego celu. -Twój cel jest zaznaczony wysokim czerwonym wskaźnikiem. + <notification name="BuyLindenDollarSuccess"> + DziÄ™kujemy za wpÅ‚atÄ™! + +Twój stan konta L$ zostanie zaktualizowany w momencie zakoÅ„czenia transakcji. Jeżeli w ciÄ…gu 20 minut, Twój balans konta nie ulegnie zmianie, transakcja zostaÅ‚a anulowana. W tym przypadku, pobrana kwota zostanie zwrócona na stan konta w US$. + +Status transkacji możesz sprawdzić odwiedzajÄ…c HistoriÄ™ Transakcji swojego konta na [http://secondlife.com/account/ Dashboard] </notification> <notification name="FirstOverrideKeys"> Twoje sterujÄ…ce klawisze zostaÅ‚y przejÄ™te przez obiekt. @@ -2841,41 +2401,10 @@ Użyj strzaÅ‚ek lub AWSD żeby sprawdzić ich dziaÅ‚anie. Niektóre obiekty (np broÅ„) wymagajÄ… trybu panoramicznego. Nacisnij 'M' żeby go wybrać. </notification> - <notification name="FirstAppearance"> - Edytujesz swój wyglÄ…d. -Używaj strzaÅ‚ek do obracania i zbliżenia. -Po skoÅ„czeniu wybierz 'Zapisz Zmiany' -żeby zapisać Twój wyglÄ…d i wyjść. -Możesz edytować wyglÄ…d jak czÄ™sto chcesz. - </notification> - <notification name="FirstInventory"> - To jest Twoja Szafa, który zawiera obikty, notki, ubrania i inne Twoje rzeczy. -* Å»eby zaÅ‚ożyć obiekt lub strój (folder) przeciÄ…gnij go na siebie. -* Å»eby przenieść obiekt do Å›wiata przeciÄ…gnij go na grunt. -* Å»eby przeczytać notkÄ™ kliknij na niej dwa razy. - </notification> <notification name="FirstSandbox"> Ten region to piaskownica. -Obiekty które tu zbudujesz mogÄ… zostać usuniÄ™te jak opuÅ›cisz ten obszar - piaskownice sÄ… regularnie czyszczone, sprawdź informacje na górze ekranu obok nazwy regionu. -Piaskownice spotyka siÄ™ rzadko i sÄ… zawsze oznakowane. - </notification> - <notification name="FirstFlexible"> - To jest elastyczny obiekt. -Obiekty elastyczne nie mogÄ… być fizyczne i muszÄ… być typu fantom. - </notification> - <notification name="FirstDebugMenus"> - Zaawansowane menu zostaÅ‚o włączone. -To menu zawiera funkcje użyteczne dla programistów analizujÄ…cych [SECOND_LIFE]. -To menu jest aktywowane dziÄ™ki kombinacji klawiszy Ctrl+Alt+D (Windows) lub ⌥⌘D (Mac). - </notification> - <notification name="FirstSculptedPrim"> - Edytujesz sculpt. -Skulpty wymagajÄ… specjalnych tekstur które definiujÄ… ich ksztaÅ‚t. -PrzykÅ‚ady tekstur znajdujÄ… siÄ™ w bibliotece szafy. - </notification> - <notification name="FirstMedia"> - Odtwarzasz media. Możesz wybrać automatyczne odtwarzanie w Ustawieniach pod Audio i Video. Odtwarzanie mediów w miejscach którym nie ufasz może być niebezpieczne. +Obiekty które tu zbudujesz mogÄ… zostać usuniÄ™te jak opuÅ›cisz ten obszar - piaskownice sÄ… regularnie czyszczone, sprawdź informacje na górze ekranu obok nazwy regionu. </notification> <notification name="MaxListSelectMessage"> Maksymalnie możesz wybrać [MAX_SELECT] rzeczy @@ -2884,50 +2413,47 @@ z tej listy. <notification name="VoiceInviteP2P"> [NAME] zaprasza CiÄ™ do rozmowy gÅ‚osem. Wybierz Zaakceptuj żeby rozmawiać albo Odmów żeby nie przyjąć zaproszenia. -Wybierz Wycisz żeby wyciszyć dzwoniÄ…cÄ… osobÄ™. +Wybierz Zablokuj żeby wyciszyć dzwoniÄ…cÄ… osób <form name="form"> <button name="Accept" text="Zaakceptuj"/> <button name="Decline" text="Odmów"/> - <button name="Mute" text="Wycisz"/> + <button name="Mute" text="Zablokuj"/> </form> </notification> <notification name="AutoUnmuteByIM"> - Wiadomość (IM) zostaÅ‚a wysÅ‚ana do [FIRST] [LAST] i wyciszenie zostaÅ‚o automatycznie usuniÄ™te. + Wiadomość (IM) zostaÅ‚a wysÅ‚ana do [FIRST] [LAST] i blokada zostaÅ‚a automatycznie usuniÄ™ta. </notification> <notification name="AutoUnmuteByMoney"> - PieniÄ…dze zostaÅ‚y przekazane do [FIRST] [LAST] i wyciszenie zostaÅ‚o automatycznie usuniÄ™te. + PieniÄ…dze zostaÅ‚y przekazane do [FIRST] [LAST] i blokada zostaÅ‚a automatycznie usuniÄ™ta. </notification> <notification name="AutoUnmuteByInventory"> - Oferta z szafy dla [FIRST] [LAST] automatycznie usunęła wyciszenie. + Oferta z szafy dla [FIRST] [LAST] i blokada zostaÅ‚a automatycznie usuniÄ™ta. </notification> <notification name="VoiceInviteGroup"> [NAME] zaczyna rozmowÄ™ z grupÄ… [GROUP]. -Wybierz Zaakceptuj żeby rozmawiać albo Odmów żeby nie przyjąć zaproszenia. -Wybierz Wycisz żeby wyciszyć dzwoniÄ…cÄ… osobÄ™. +Wybierz Zaakceptuj żeby rozmawiać albo Odmów żeby nie przyjąć zaproszenia. Wybierz Zablokuj żeby wyciszyć dzwoniÄ…cÄ… osobÄ™. <form name="form"> <button name="Accept" text="Zaakceptuj"/> <button name="Decline" text="Odmów"/> - <button name="Mute" text="Wycisz"/> + <button name="Mute" text="Zablokuj"/> </form> </notification> <notification name="VoiceInviteAdHoc"> [NAME] zaczyna konferencjÄ™ gÅ‚osem. -Wybierz Zaakceptuj żeby rozmawiać albo Odmów żeby nie przyjąć zaproszenia. -Wybierz Wycisz żeby wyciszyć dzwoniÄ…cÄ… osobÄ™. +Wybierz Zaakceptuj żeby rozmawiać albo Odmów żeby nie przyjąć zaproszenia. Wybierz Zablokuj żeby wyciszyć dzwoniÄ…cÄ… osobÄ™. <form name="form"> <button name="Accept" text="Zaakceptuj"/> <button name="Decline" text="Odmów"/> - <button name="Mute" text="Wycisz"/> + <button name="Mute" text="Zablokuj"/> </form> </notification> <notification name="InviteAdHoc"> [NAME] zaprasza CiÄ™ do konferencji poprzez Czat/IM. -Wybierz Zaakceptuj żeby zacząć czat albo Odmów żeby nie przyjąć zaproszenia. -Wybierz Wycisz żeby wyciszyć tÄ… osobÄ™. +Wybierz Zaakceptuj żeby zacząć czat albo Odmów żeby nie przyjąć zaproszenia. Wybierz Zablokuj żeby wyciszyć tÄ… osobÄ™. <form name="form"> <button name="Accept" text="Zaakceptuj"/> <button name="Decline" text="Odmów"/> - <button name="Mute" text="Wycisz"/> + <button name="Mute" text="Block"/> </form> </notification> <notification name="VoiceChannelFull"> @@ -2970,10 +2496,54 @@ Wybierz Wycisz żeby wyciszyć tÄ… osobÄ™. Błąd podczas łączenia z rozmowÄ… [VOICE_CHANNEL_NAME]. Spróbuj póżniej. </notification> <notification name="ServerVersionChanged"> - Ten region używa innej wersji symulatora. Kliknij na tÄ… wiadomość żeby uzyskać wiÄ™cej informacji. + Ten region używa innej wersji symulatora. Kliknij na tÄ… wiadomość żeby uzyskać wiÄ™cej informacji: [[URL] View the release notes.] + </notification> + <notification name="UnsupportedCommandSLURL"> + Nie można otworzyć wybranego SLurl. </notification> - <notification name="UnableToOpenCommandURL"> - Wybrany link nie daje siÄ™ otworzyć z tej przeglÄ…darki. + <notification name="BlockedSLURL"> + SLurl zostaÅ‚ otrzymany z niesprawdzonej przeglÄ…darki i zostaÅ‚ zablokowany dla bezpieczeÅ„stwa. + </notification> + <notification name="ThrottledSLURL"> + Wiele SLurlów zostaÅ‚o otrzymanych w krótkim czasie od niesprawdzonej przeglÄ…darki. +ZostanÄ… zablokowane na kilka sekund dla bezpieczeÅ„stwa. + </notification> + <notification name="IMToast"> + [MESSAGE] + <form name="form"> + <button name="respondbutton" text="Odpowiedź"/> + </form> + </notification> + <notification name="ConfirmCloseAll"> + Czy chcesz zamknąć wszystkie wiadomoÅ›ci IM? + <usetemplate ignoretext="Potwierdź, przed zamkniÄ™ciem wszystkich wiadomoÅ›ci prywatnych (IM)." name="okcancelignore" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="AttachmentSaved"> + Załącznik zostaÅ‚ zapisany. + </notification> + <notification name="UnableToFindHelpTopic"> + Nie można znależć tematu pomocy dla tego elementu. + </notification> + <notification name="ObjectMediaFailure"> + Błąd serwera: aktualizacja mediów nie powiodÅ‚a siÄ™. +'[ERROR]' + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="TextChatIsMutedByModerator"> + Twój czat zostaÅ‚ wyciszony przez moderatora. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="VoiceIsMutedByModerator"> + Twoja rozmowa gÅ‚osowa zostaÅ‚a wyciszona przez moderatora. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="ConfirmClearTeleportHistory"> + Czy na pewno chcesz usunąć historiÄ™ teleportacji? + <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> + </notification> + <notification name="BottomTrayButtonCanNotBeShown"> + Wybrany przycisk nie może zostać wyÅ›wietlony w tej chwili. +Przycisk zostanie wyÅ›wietlony w przypadku dostatecznej iloÅ›ci przestrzeni. </notification> <global name="UnsupportedCPU"> - PrÄ™dkość Twojego CPU nie speÅ‚nia minimalnych wymagaÅ„. @@ -2981,7 +2551,7 @@ Wybierz Wycisz żeby wyciszyć tÄ… osobÄ™. <global name="UnsupportedGLRequirements"> WyglÄ…da na to, że Twój system nie speÅ‚nia wymagaÅ„ sprzÄ™towych [APP_NAME]. [APP_NAME] wymaga karty graficznej kompatybilnej z OpenGL z multiteksturami. Jeżeli masz takÄ… kartÄ™ zainstaluj najnowsze sterowniki do niej i uaktualnienia systemu operacyjnego. -Jeżeli wciąż masz problemy sprawdź: http://www.secondlife.com/support +Jeżeli wciąż masz problemy sprawdź: [SUPPORT_SITE]. </global> <global name="UnsupportedCPUAmount"> 796 @@ -2995,10 +2565,8 @@ Jeżeli wciąż masz problemy sprawdź: http://www.secondlife.com/support <global name="UnsupportedRAM"> - Pamięć Twojego systemu nie speÅ‚nia minimalnych wymagaÅ„. </global> - <global name="PermYes"> - Tak - </global> - <global name="PermNo"> - Nie + <global name="You can only set your 'Home Location' on your land or at a mainland Infohub."> + JeÅ›li jesteÅ› wÅ‚aÅ›cicielem posiadÅ‚oÅ›ci, możesz ustawić na niej miejsce startu. +W innym przypadku możesz poszukać na mapie miejsca oznaczone jako "Infohub". </global> </notifications> diff --git a/indra/newview/skins/default/xui/pl/panel_active_object_row.xml b/indra/newview/skins/default/xui/pl/panel_active_object_row.xml new file mode 100644 index 0000000000..57dc8a3dd7 --- /dev/null +++ b/indra/newview/skins/default/xui/pl/panel_active_object_row.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_activeim_row"> + <string name="unknown_obj"> + Nieznany Obiekt + </string> + <text name="object_name"> + Nienazwany Obiekt + </text> +</panel> diff --git a/indra/newview/skins/default/xui/pl/panel_adhoc_control_panel.xml b/indra/newview/skins/default/xui/pl/panel_adhoc_control_panel.xml new file mode 100644 index 0000000000..6cd47c6ce7 --- /dev/null +++ b/indra/newview/skins/default/xui/pl/panel_adhoc_control_panel.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_im_control_panel"> + <layout_stack name="vertical_stack"> + <layout_panel name="call_btn_panel"> + <button label="DzwoÅ„" name="call_btn"/> + </layout_panel> + <layout_panel name="end_call_btn_panel"> + <button label="ZakoÅ„cz Rozmowe" name="end_call_btn"/> + </layout_panel> + <layout_panel name="voice_ctrls_btn_panel"> + <button label="Przełączniki GÅ‚osu" name="voice_ctrls_btn"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/default/xui/pl/panel_audio_device.xml b/indra/newview/skins/default/xui/pl/panel_audio_device.xml index fc3b3776f0..fa8dde77eb 100755..100644 --- a/indra/newview/skins/default/xui/pl/panel_audio_device.xml +++ b/indra/newview/skins/default/xui/pl/panel_audio_device.xml @@ -13,7 +13,7 @@ Poziom WejÅ›cia </text> <text_editor name="voice_intro_text1"> - Użyj suwaka by dostosować jak gÅ‚oÅ›no CiÄ™ sÅ‚ychać dla innych Rezydentów. By przetestować poziom wejÅ›cia, zacznij mówić do mikrofonu. + Użyj suwaka by dostosować jak gÅ‚oÅ›no CiÄ™ sÅ‚ychać dla innych Rezydentów. W celu przetestowania poziomu wejÅ›cia, zacznij mówić do mikrofonu. </text_editor> <volume_slider name="mic_volume_slider" tool_tip="By zmienić poziom gÅ‚oÅ›noÅ›ci użyj suwaka" /> diff --git a/indra/newview/skins/default/xui/pl/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/pl/panel_avatar_list_item.xml new file mode 100644 index 0000000000..917610d3e9 --- /dev/null +++ b/indra/newview/skins/default/xui/pl/panel_avatar_list_item.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="avatar_list_item"> + <string name="FormatSeconds"> + [COUNT]s + </string> + <string name="FormatMinutes"> + [COUNT]m + </string> + <string name="FormatHours"> + [COUNT]h + </string> + <string name="FormatDays"> + [COUNT]d + </string> + <string name="FormatWeeks"> + [COUNT]tyg + </string> + <string name="FormatMonths"> + [COUNT]mc + </string> + <string name="FormatYears"> + [COUNT]lat + </string> + <text name="avatar_name" value="Nieznane"/> + <button name="profile_btn" tool_tip="Zobacz profil"/> +</panel> diff --git a/indra/newview/skins/default/xui/pl/panel_block_list_sidetray.xml b/indra/newview/skins/default/xui/pl/panel_block_list_sidetray.xml index d7fcb8c966..122d834bdd 100644 --- a/indra/newview/skins/default/xui/pl/panel_block_list_sidetray.xml +++ b/indra/newview/skins/default/xui/pl/panel_block_list_sidetray.xml @@ -3,8 +3,8 @@ <text name="title_text"> Lista Blokad </text> - <scroll_list name="blocked" tool_tip="Lista zablokowanych obecnie rezydentów"/> - <button label="Zablokuj Rezydenta..." label_selected="Zablokuj Rezydenta..." name="Block resident..." tool_tip="Wybierz rezydenta, którego chcesz zablokować"/> + <scroll_list name="blocked" tool_tip="Lista Zablokowanych Osób"/> + <button label="Zablokuj Rezydenta..." label_selected="Zablokuj Rezydenta..." name="Block resident..." tool_tip="Wybierz Rezydenta aby zablokować"/> <button label="Zablokuj obiekt wedÅ‚ug nazwy..." label_selected="Zablokuj obiekt wedÅ‚ug nazwy..." name="Block object by name..."/> - <button label="Odblokuj" label_selected="Odblokuj" name="Unblock" tool_tip="UsuÅ„ rezydenta lub obiekt z listy blokad"/> + <button label="Odblokuj" label_selected="Odblokuj" name="Unblock" tool_tip="UsuÅ„ Rezydenta lub Obiekt z Listy Zablokowanych"/> </panel> diff --git a/indra/newview/skins/default/xui/pl/panel_bottomtray.xml b/indra/newview/skins/default/xui/pl/panel_bottomtray.xml new file mode 100644 index 0000000000..e21d8a077d --- /dev/null +++ b/indra/newview/skins/default/xui/pl/panel_bottomtray.xml @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="bottom_tray"> + <string name="SpeakBtnToolTip"> + Włącza/Wyłącza mikrofon + </string> + <string name="VoiceControlBtnToolTip"> + Pokazuje/Ukrywa panel kontroli gÅ‚osu + </string> + <layout_stack name="toolbar_stack"> + <layout_panel name="speak_panel"> + <talk_button name="talk"> + <speak_button label="Mów" label_selected="Mów" name="speak_btn"/> + </talk_button> + </layout_panel> + <layout_panel name="gesture_panel"> + <gesture_combo_list label="Gestury" name="Gesture" tool_tip="Pokazuje/Ukrywa gestury"/> + </layout_panel> + <layout_panel name="movement_panel"> + <button label="Ruch" name="movement_btn" tool_tip="Pokaż/Ukryj Ustawienia Ruchu"/> + </layout_panel> + <layout_panel name="cam_panel"> + <button label="Widok" name="camera_btn" tool_tip="Pokaż/Ukryj Ustawienia Kamery"/> + </layout_panel> + <layout_panel name="snapshot_panel"> + <button label="" name="snapshots" tool_tip="Zrób ZdjÄ™cie"/> + </layout_panel> + <layout_panel name="im_well_panel"> + <chiclet_im_well name="im_well"> + <button name="Unread IM messages" tool_tip="Rozmowy"/> + </chiclet_im_well> + </layout_panel> + <layout_panel name="notification_well_panel"> + <chiclet_notification name="notification_well"> + <button name="Unread" tool_tip="OgÅ‚oszenia"/> + </chiclet_notification> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/default/xui/pl/panel_bottomtray_lite.xml b/indra/newview/skins/default/xui/pl/panel_bottomtray_lite.xml new file mode 100644 index 0000000000..77d2e86b7e --- /dev/null +++ b/indra/newview/skins/default/xui/pl/panel_bottomtray_lite.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="bottom_tray_lite"> + <layout_stack name="toolbar_stack_lite"> + <layout_panel name="gesture_panel"> + <gesture_combo_list label="Gest" name="Gest" tool_tip="Pokaż/ukryj gestury"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/default/xui/pl/panel_classified_info.xml b/indra/newview/skins/default/xui/pl/panel_classified_info.xml new file mode 100644 index 0000000000..0b275d6dcf --- /dev/null +++ b/indra/newview/skins/default/xui/pl/panel_classified_info.xml @@ -0,0 +1,53 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_classified_info"> + <panel.string name="l$_price"> + L$[PRICE] + </panel.string> + <panel.string name="click_through_text_fmt"> + [TELEPORT] teleport, [MAP] map, [PROFILE] profile + </panel.string> + <panel.string name="date_fmt"> + [mthnum,datetime,slt]/[day,datetime,slt]/[year,datetime,slt] + </panel.string> + <panel.string name="auto_renew_on"> + Aktywne + </panel.string> + <panel.string name="auto_renew_off"> + Wyłączone + </panel.string> + <text name="title" value="Reklama"/> + <scroll_container name="profile_scroll"> + <panel name="scroll_content_panel"> + <text_editor name="classified_name" value="[name]"/> + <text name="classified_location_label" value="Miejsce:"/> + <text_editor name="classified_location" value="[loading...]"/> + <text name="content_type_label" value="Rodzaj ZawartoÅ›ci:"/> + <text_editor name="content_type" value="[content type]"/> + <text name="category_label" value="Kategoria:"/> + <text_editor name="category" value="[category]"/> + <text name="creation_date_label" value="Data stworzenia:"/> + <text_editor name="creation_date" tool_tip="Data stworzenia" value="[date]"/> + <text name="price_for_listing_label" value="Cena za wyÅ›wietlenie:"/> + <text_editor name="price_for_listing" tool_tip="Cena za umieszczenie reklamy." value="[price]"/> + <layout_stack name="descr_stack"> + <layout_panel name="clickthrough_layout_panel"> + <text name="click_through_label" value="KlikniÄ™cia:"/> + <text_editor name="click_through_text" tool_tip="Kliknij wedÅ‚ug daty" value="[clicks]"/> + </layout_panel> + <layout_panel name="price_layout_panel"> + <text name="auto_renew_label" value="Automatyczne przedÅ‚użenie:"/> + <text name="auto_renew" value="Aktywne"/> + </layout_panel> + <layout_panel name="descr_layout_panel"> + <text name="classified_desc_label" value="Opis:"/> + <text_editor name="classified_desc" value="[description]"/> + </layout_panel> + </layout_stack> + </panel> + </scroll_container> + <panel name="buttons"> + <button label="Teleportuj" name="teleport_btn"/> + <button label="Mapa" name="show_on_map_btn"/> + <button label="Edytuj" name="edit_btn"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/pl/panel_edit_alpha.xml b/indra/newview/skins/default/xui/pl/panel_edit_alpha.xml new file mode 100644 index 0000000000..ac2739633e --- /dev/null +++ b/indra/newview/skins/default/xui/pl/panel_edit_alpha.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="edit_alpha_panel"> + <panel name="avatar_alpha_color_panel"> + <texture_picker label="Alpha Dolnej Części CiaÅ‚a" name="Lower Alpha" tool_tip="Kliknij aby wybrać teksturÄ™"/> + <texture_picker label="Alpha Górnej Części CiaÅ‚a" name="Upper Alpha" tool_tip="Kliknij aby wybrać teksturÄ™"/> + <texture_picker label="Alpha GÅ‚owy" name="Head Alpha" tool_tip="Kliknij aby wybrać teksturÄ™"/> + <texture_picker label="Alpha Oka" name="Eye Alpha" tool_tip="Kliknij aby wybrać teksturÄ™"/> + <texture_picker label="Alpha WÅ‚osów" name="Hair Alpha" tool_tip="Kliknij aby wybrać teksturÄ™"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/pl/panel_edit_classified.xml b/indra/newview/skins/default/xui/pl/panel_edit_classified.xml new file mode 100644 index 0000000000..6395d5c59a --- /dev/null +++ b/indra/newview/skins/default/xui/pl/panel_edit_classified.xml @@ -0,0 +1,48 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Edytuj ReklamÄ™" name="panel_edit_classified"> + <panel.string name="location_notice"> + (zostanie zaktualizowane po zapisaniu) + </panel.string> + <string name="publish_label"> + Publikuj + </string> + <string name="save_label"> + Zapisz + </string> + <text name="title"> + Edytuj ReklamÄ™ + </text> + <scroll_container name="profile_scroll"> + <panel name="scroll_content_panel"> + <panel name="snapshot_panel"> + <icon label="" name="edit_icon" tool_tip="Kliknij by wybrać teksturÄ™"/> + </panel> + <text name="Name:"> + TytuÅ‚: + </text> + <text name="description_label"> + Opis: + </text> + <text name="location_label"> + Lokalizacja: + </text> + <text name="classified_location"> + Å‚adowanie... + </text> + <button label="Ustaw na bieżącÄ… lokalizacjÄ™" name="set_to_curr_location_btn"/> + <text name="category_label" value="Kategoria:"/> + <text name="content_type_label" value="Typ ZawartoÅ›ci:"/> + <icons_combo_box label="Treść Ogólna" name="content_type"> + <icons_combo_box.item label="Moderuj Treść" name="mature_ci" value="Mature"/> + <icons_combo_box.item label="Treść Ogólna" name="pg_ci" value="PG"/> + </icons_combo_box> + <text name="price_for_listing_label" value="Cena za wyÅ›wietlenie:"/> + <spinner label="L$" name="price_for_listing" tool_tip="Cena za umieszczenie reklamy." value="50"/> + <check_box label="Ponawiaj automatycznie co tydzieÅ„." name="auto_renew"/> + </panel> + </scroll_container> + <panel label="bottom_panel" name="bottom_panel"> + <button label="[LABEL]" name="save_changes_btn"/> + <button label="Anuluj" name="cancel_btn"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/pl/panel_edit_eyes.xml b/indra/newview/skins/default/xui/pl/panel_edit_eyes.xml new file mode 100644 index 0000000000..5e7a3a8fa0 --- /dev/null +++ b/indra/newview/skins/default/xui/pl/panel_edit_eyes.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="edit_eyes_panel"> + <panel name="avatar_eye_color_panel"> + <texture_picker label="Iris" name="Iris" tool_tip="Kliknij aby wybrać teksturÄ™"/> + </panel> + <accordion name="wearable_accordion"> + <accordion_tab name="eyes_main_tab" title="Oczy"/> + </accordion> +</panel> diff --git a/indra/newview/skins/default/xui/pl/panel_edit_gloves.xml b/indra/newview/skins/default/xui/pl/panel_edit_gloves.xml new file mode 100644 index 0000000000..8b16506d9c --- /dev/null +++ b/indra/newview/skins/default/xui/pl/panel_edit_gloves.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="edit_gloves_panel"> + <panel name="avatar_gloves_color_panel"> + <texture_picker label="MateriaÅ‚" name="Fabric" tool_tip="Kliknij aby wybrać teksturÄ™"/> + <color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij aby wybrać teksturÄ™"/> + </panel> + <accordion name="wearable_accordion"> + <accordion_tab name="gloves_main_tab" title="RÄ™kawiczki"/> + </accordion> +</panel> diff --git a/indra/newview/skins/default/xui/pl/panel_edit_hair.xml b/indra/newview/skins/default/xui/pl/panel_edit_hair.xml new file mode 100644 index 0000000000..567ff10506 --- /dev/null +++ b/indra/newview/skins/default/xui/pl/panel_edit_hair.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="edit_hair_panel"> + <panel name="avatar_hair_color_panel"> + <texture_picker label="Tekstura" name="Texture" tool_tip="Kliknij aby wybrać teksturÄ™"/> + </panel> + <accordion name="wearable_accordion"> + <accordion_tab name="hair_color_tab" title="Kolor"/> + <accordion_tab name="hair_style_tab" title="Styl"/> + <accordion_tab name="hair_eyebrows_tab" title="Brwi"/> + <accordion_tab name="hair_facial_tab" title="Twarzy"/> + </accordion> +</panel> diff --git a/indra/newview/skins/default/xui/pl/panel_edit_jacket.xml b/indra/newview/skins/default/xui/pl/panel_edit_jacket.xml new file mode 100644 index 0000000000..f4ea9303aa --- /dev/null +++ b/indra/newview/skins/default/xui/pl/panel_edit_jacket.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="edit_jacket_panel"> + <panel name="avatar_jacket_color_panel"> + <texture_picker label="Górny materiaÅ‚" name="Upper Fabric" tool_tip="Kliknij aby wybrać teksturÄ™"/> + <texture_picker label="Dolny materiaÅ‚" name="Lower Fabric" tool_tip="Kliknij aby wybrać teksturÄ™"/> + <color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij aby wybrać kolor"/> + </panel> + <accordion name="wearable_accordion"> + <accordion_tab name="jacket_main_tab" title="Kurtka"/> + </accordion> +</panel> diff --git a/indra/newview/skins/default/xui/pl/panel_edit_pants.xml b/indra/newview/skins/default/xui/pl/panel_edit_pants.xml new file mode 100644 index 0000000000..247d63c5a3 --- /dev/null +++ b/indra/newview/skins/default/xui/pl/panel_edit_pants.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="edit_pants_panel"> + <panel name="avatar_pants_color_panel"> + <texture_picker label="MateriaÅ‚" name="Fabric" tool_tip="Kliknij aby wybrać teksturÄ™"/> + <color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij aby wybrać kolor"/> + </panel> + <accordion name="wearable_accordion"> + <accordion_tab name="pants_main_tab" title="Spodnie"/> + </accordion> +</panel> diff --git a/indra/newview/skins/default/xui/pl/panel_edit_pick.xml b/indra/newview/skins/default/xui/pl/panel_edit_pick.xml new file mode 100644 index 0000000000..22fb00671d --- /dev/null +++ b/indra/newview/skins/default/xui/pl/panel_edit_pick.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Edytuj Ulubione" name="panel_edit_pick"> + <panel.string name="location_notice"> + (aktualizacja nastÄ…pi po zapisaniu) + </panel.string> + <text name="title"> + Edytuj Ulubione + </text> + <scroll_container name="profile_scroll"> + <panel name="scroll_content_panel"> + <icon label="" name="edit_icon" tool_tip="Kliknij aby wybrać teksturÄ™"/> + <text name="Name:"> + TytuÅ‚: + </text> + <text name="description_label"> + Opis: + </text> + <text name="location_label"> + Lokalizacja: + </text> + <text name="pick_location"> + Å‚adowanie... + </text> + <button label="Ustaw na bieżąca lokalizacjÄ™" name="set_to_curr_location_btn"/> + </panel> + </scroll_container> + <panel label="bottom_panel" name="bottom_panel"> + <button label="Zapisz obrazek" name="save_changes_btn"/> + <button label="Anuluj" name="cancel_btn"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/pl/panel_edit_profile.xml b/indra/newview/skins/default/xui/pl/panel_edit_profile.xml index 97fa3118f8..edd7415751 100644 --- a/indra/newview/skins/default/xui/pl/panel_edit_profile.xml +++ b/indra/newview/skins/default/xui/pl/panel_edit_profile.xml @@ -1,45 +1,51 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<panel name="edit_profile_panel"> - <string name="CaptionTextAcctInfo"> - [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION] - </string> - <string name="AcctTypeResident" - value="Rezydent" /> - <string name="AcctTypeTrial" - value="Próbne" /> - <string name="AcctTypeCharterMember" - value="CzÅ‚onek-zalożyciel" /> - <string name="AcctTypeEmployee" - value="Pracownik Linden Lab" /> - <string name="PaymentInfoUsed" - value="Dane Konta Używane" /> - <string name="PaymentInfoOnFile" - value="Dane Konta DostÄ™pne" /> - <string name="NoPaymentInfoOnFile" - value="Brak Danych Konta" /> - <string name="AgeVerified" - value="Wiek Zweryfikowany" /> - <string name="NotAgeVerified" - value="Brak Weryfikacji Wieku" /> - <string name="partner_edit_link_url"> - http://www.secondlife.com/account/partners.php?lang=pl - </string> - <panel name="scroll_content_panel"> - <panel name="data_panel" > - <panel name="lifes_images_panel"> - <panel name="second_life_image_panel"> - <text name="second_life_photo_title_text"> - [SECOND_LIFE]: - </text> - </panel> - </panel> - <text name="title_partner_text" value="Partner:"/> - <panel name="partner_data_panel"> - <text name="partner_text" value="[FIRST] [LAST]"/> - </panel> - <text name="text_box3"> - PracuÅ› Mówi: - </text> - </panel> - </panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Edycja profilu" name="edit_profile_panel"> + <string name="CaptionTextAcctInfo"> + [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION] + </string> + <string name="RegisterDateFormat"> + [REG_DATE] ([AGE]) + </string> + <string name="AcctTypeResident" value="Rezydent"/> + <string name="AcctTypeTrial" value="Próbne"/> + <string name="AcctTypeCharterMember" value="CzÅ‚onek-zalożyciel"/> + <string name="AcctTypeEmployee" value="Pracownik Linden Lab"/> + <string name="PaymentInfoUsed" value="Dane konta używane"/> + <string name="PaymentInfoOnFile" value="Dane konta dostÄ™pne"/> + <string name="NoPaymentInfoOnFile" value="Brak danych konta"/> + <string name="AgeVerified" value="Wiek zweryfikowany"/> + <string name="NotAgeVerified" value="Brak weryfikacji wieku"/> + <string name="partner_edit_link_url"> + http://www.secondlife.com/account/partners.php?lang=pl + </string> + <string name="no_partner_text" value="Å»adne"/> + <scroll_container name="profile_scroll"> + <panel name="scroll_content_panel"> + <panel name="data_panel"> + <panel name="lifes_images_panel"> + <icon label="" name="2nd_life_edit_icon" tool_tip="Kliknij aby wybrać teksturÄ™"/> + </panel> + <panel name="first_life_image_panel"> + <text name="real_world_photo_title_text" value="Å»ycie#1:"/> + </panel> + <icon label="" name="real_world_edit_icon" tool_tip="Kliknij aby wybrać teksturÄ™"/> + <text name="title_homepage_text"> + WWW: + </text> + <check_box label="Pokaż w wyszukiwarce" name="show_in_search_checkbox"/> + <text name="title_acc_status_text" value="Moje Konto:"/> + <text name="my_account_link" value="[[URL] idź do Dashboard]"/> + <text name="acc_status_text" value="Rezydent. Brak danych konta."/> + <text name="title_partner_text" value="Partner:"/> + <text name="partner_edit_link" value="[[URL] Edytuj]"/> + <panel name="partner_data_panel"> + <text initial_value="(wyszukiwanie)" name="partner_text" value="[FIRST] [LAST]"/> + </panel> + </panel> + </panel> + </scroll_container> + <panel name="profile_me_buttons_panel"> + <button label="Zapisz zmiany" name="save_btn"/> + <button label="Anuluj" name="cancel_btn"/> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/pl/panel_edit_shape.xml b/indra/newview/skins/default/xui/pl/panel_edit_shape.xml new file mode 100644 index 0000000000..3cacbd7fdd --- /dev/null +++ b/indra/newview/skins/default/xui/pl/panel_edit_shape.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="edit_shape_panel"> + <panel name="avatar_sex_panel"> + <text name="gender_text"> + PÅ‚eć: + </text> + <radio_group name="sex_radio"> + <radio_item label="Kobieta" name="radio"/> + <radio_item label="Mężczyzna" name="radio2"/> + </radio_group> + </panel> + <accordion name="wearable_accordion"> + <accordion_tab name="shape_body_tab" title="CiaÅ‚o"/> + <accordion_tab name="shape_head_tab" title="GÅ‚owa"/> + <accordion_tab name="shape_eyes_tab" title="Oczy"/> + <accordion_tab name="shape_ears_tab" title="Uszy"/> + <accordion_tab name="shape_nose_tab" title="Nos"/> + <accordion_tab name="shape_mouth_tab" title="Usta"/> + <accordion_tab name="shape_chin_tab" title="Podbródek"/> + <accordion_tab name="shape_torso_tab" title="Tułów"/> + <accordion_tab name="shape_legs_tab" title="Nogi"/> + </accordion> +</panel> diff --git a/indra/newview/skins/default/xui/pl/panel_edit_shirt.xml b/indra/newview/skins/default/xui/pl/panel_edit_shirt.xml new file mode 100644 index 0000000000..27d8981e80 --- /dev/null +++ b/indra/newview/skins/default/xui/pl/panel_edit_shirt.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="edit_shirt_panel"> + <panel name="avatar_shirt_color_panel"> + <texture_picker label="MateriaÅ‚" name="Fabric" tool_tip="Kliknij by wybrać grafikÄ™"/> + <color_swatch label="Kolor/OdcieÅ„" name="Color/Tint" tool_tip="Kliknij by wybrać kolor"/> + </panel> + <accordion name="wearable_accordion"> + <accordion_tab name="shirt_main_tab" title="Spódnica"/> + </accordion> +</panel> diff --git a/indra/newview/skins/default/xui/pl/panel_edit_shoes.xml b/indra/newview/skins/default/xui/pl/panel_edit_shoes.xml new file mode 100644 index 0000000000..09eb1008e8 --- /dev/null +++ b/indra/newview/skins/default/xui/pl/panel_edit_shoes.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="edit_shoes_panel"> + <panel name="avatar_shoes_color_panel"> + <texture_picker label="MateriaÅ‚" name="Fabric" tool_tip="Kliknij aby wybrać teksturÄ™"/> + <color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij aby wybrać kolor"/> + </panel> + <accordion name="wearable_accordion"> + <accordion_tab name="shoes_main_tab" title="Buty"/> + </accordion> +</panel> diff --git a/indra/newview/skins/default/xui/pl/panel_edit_skin.xml b/indra/newview/skins/default/xui/pl/panel_edit_skin.xml new file mode 100644 index 0000000000..617aad8650 --- /dev/null +++ b/indra/newview/skins/default/xui/pl/panel_edit_skin.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="edit_skin_panel"> + <panel name="avatar_skin_color_panel"> + <texture_picker label="Tatuaż na gÅ‚owie" name="Head Tattoos" tool_tip="Kliknij aby wybrać teksturÄ™"/> + <texture_picker label="Górny tatuaż" name="Upper Tattoos" tool_tip="Kliknij aby wybrać teksturÄ™"/> + <texture_picker label="Dolny tatuaż" name="Lower Tattoos" tool_tip="Kliknij aby wybrać teksturÄ™"/> + </panel> + <accordion name="wearable_accordion"> + <accordion_tab name="skin_color_tab" title="Kolor skórki"/> + <accordion_tab name="skin_face_tab" title="Szczegóły twarzy"/> + <accordion_tab name="skin_makeup_tab" title="Makijaż"/> + <accordion_tab name="skin_body_tab" title="Szczegóły budowy ciaÅ‚a"/> + </accordion> +</panel> diff --git a/indra/newview/skins/default/xui/pl/panel_edit_skirt.xml b/indra/newview/skins/default/xui/pl/panel_edit_skirt.xml new file mode 100644 index 0000000000..f89148ffac --- /dev/null +++ b/indra/newview/skins/default/xui/pl/panel_edit_skirt.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="edit_skirt_panel"> + <panel name="avatar_skirt_color_panel"> + <texture_picker label="MateriaÅ‚" name="Fabric" tool_tip="Kliknij aby wybrać teksturÄ™"/> + <color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij aby wybrać kolor"/> + </panel> + <accordion name="wearable_accordion"> + <accordion_tab name="skirt_main_tab" title="Spódnica"/> + </accordion> +</panel> diff --git a/indra/newview/skins/default/xui/pl/panel_edit_socks.xml b/indra/newview/skins/default/xui/pl/panel_edit_socks.xml new file mode 100644 index 0000000000..5481c73804 --- /dev/null +++ b/indra/newview/skins/default/xui/pl/panel_edit_socks.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="edit_socks_panel"> + <panel name="avatar_socks_color_panel"> + <texture_picker label="MateriaÅ‚" name="Fabric" tool_tip="Kliknij aby wybrać teksturÄ™"/> + <color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij aby wybrać kolor"/> + </panel> + <accordion name="wearable_accordion"> + <accordion_tab name="socks_main_tab" title="Skarpetki"/> + </accordion> +</panel> diff --git a/indra/newview/skins/default/xui/pl/panel_edit_tattoo.xml b/indra/newview/skins/default/xui/pl/panel_edit_tattoo.xml new file mode 100644 index 0000000000..b5e1828588 --- /dev/null +++ b/indra/newview/skins/default/xui/pl/panel_edit_tattoo.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="edit_tattoo_panel"> + <panel name="avatar_tattoo_color_panel"> + <texture_picker label="Tatuaż gÅ‚owy" name="Head Tattoo" tool_tip="Kliknij by wybrać grafikÄ™"/> + <texture_picker label="Tatuaż górnej części ciaÅ‚a" name="Upper Tattoo" tool_tip="Kliknij by wybrać grafikÄ™"/> + <texture_picker label="Tatuaż dolnej części ciaÅ‚a" name="Lower Tattoo" tool_tip="Kliknij by wybrać grafikÄ™"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/pl/panel_edit_underpants.xml b/indra/newview/skins/default/xui/pl/panel_edit_underpants.xml new file mode 100644 index 0000000000..94034aa8ab --- /dev/null +++ b/indra/newview/skins/default/xui/pl/panel_edit_underpants.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="edit_underpants_panel"> + <panel name="avatar_underpants_color_panel"> + <texture_picker label="MateriaÅ‚" name="Fabric" tool_tip="Kliknij aby wybrać kolor"/> + <color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij aby wybrać kolor"/> + </panel> + <accordion name="wearable_accordion"> + <accordion_tab name="underpants_main_tab" title="Bielizna"/> + </accordion> +</panel> diff --git a/indra/newview/skins/default/xui/pl/panel_edit_undershirt.xml b/indra/newview/skins/default/xui/pl/panel_edit_undershirt.xml new file mode 100644 index 0000000000..72b72b76de --- /dev/null +++ b/indra/newview/skins/default/xui/pl/panel_edit_undershirt.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="edit_undershirt_panel"> + <panel name="avatar_undershirt_color_panel"> + <texture_picker label="MateriaÅ‚" name="Fabric" tool_tip="Kliknij aby wybrać teksturÄ™"/> + <color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij aby wybrać kolor"/> + </panel> + <accordion name="wearable_accordion"> + <accordion_tab name="undershirt_main_tab" title="Podkoszulek"/> + </accordion> +</panel> diff --git a/indra/newview/skins/default/xui/pl/panel_edit_wearable.xml b/indra/newview/skins/default/xui/pl/panel_edit_wearable.xml new file mode 100644 index 0000000000..cf17afea3f --- /dev/null +++ b/indra/newview/skins/default/xui/pl/panel_edit_wearable.xml @@ -0,0 +1,101 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Ubranie/części ciaÅ‚a" name="panel_edit_wearable"> + <string name="edit_shape_title"> + Edycja ksztaÅ‚tu + </string> + <string name="edit_skin_title"> + Edycja skórki + </string> + <string name="edit_hair_title"> + Edycja wÅ‚osów + </string> + <string name="edit_eyes_title"> + Edycja oczu + </string> + <string name="edit_shirt_title"> + Edycja spódnicy + </string> + <string name="edit_pants_title"> + Edycja spodni + </string> + <string name="edit_shoes_title"> + Edycja butów + </string> + <string name="edit_socks_title"> + Edycja skarpetek + </string> + <string name="edit_jacket_title"> + Edycja kurtki + </string> + <string name="edit_skirt_title"> + Edycja spódnicy + </string> + <string name="edit_gloves_title"> + Edycja rÄ™kawiczek + </string> + <string name="edit_undershirt_title"> + Edycja podkoszulki + </string> + <string name="edit_underpants_title"> + Edycja bielizny + </string> + <string name="edit_alpha_title"> + Edycja maski Alpha + </string> + <string name="edit_tattoo_title"> + Edycja tatuażu + </string> + <string name="shape_desc_text"> + KsztaÅ‚t: + </string> + <string name="skin_desc_text"> + Skórka: + </string> + <string name="hair_desc_text"> + WÅ‚osy: + </string> + <string name="eyes_desc_text"> + Oczy: + </string> + <string name="shirt_desc_text"> + Koszula: + </string> + <string name="pants_desc_text"> + Spodnie: + </string> + <string name="shoes_desc_text"> + Buty: + </string> + <string name="socks_desc_text"> + Skarpetki: + </string> + <string name="jacket_desc_text"> + Kurtka: + </string> + <string name="skirt_skirt_desc_text"> + Spódnica: + </string> + <string name="gloves_desc_text"> + RÄ™kawiczki: + </string> + <string name="undershirt_desc_text"> + Podkoszulek: + </string> + <string name="underpants_desc_text"> + Bielizna: + </string> + <string name="alpha_desc_text"> + Maska Alpha: + </string> + <string name="tattoo_desc_text"> + Tatuaż: + </string> + <text name="edit_wearable_title" value="Edycja KsztaÅ‚tu"/> + <panel label="Koszula" name="wearable_type_panel"> + <text name="description_text" value="KsztaÅ‚t:"/> + </panel> + <panel name="button_panel"> + <button label="Zapisz" name="save_as_button"/> + <button label="Wróć" name="revert_button"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/pl/panel_friends.xml b/indra/newview/skins/default/xui/pl/panel_friends.xml index b6df36f199..fca0dad380 100755..100644 --- a/indra/newview/skins/default/xui/pl/panel_friends.xml +++ b/indra/newview/skins/default/xui/pl/panel_friends.xml @@ -1,27 +1,20 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="friends"> <string name="Multiple"> - Znajomi... + Znajomi </string> - <scroll_list name="friend_list" - tool_tip="By wybrać wielu znajomych za jednym razem przetrzymaj klawisz shift lub control"> - <column name="icon_online_status" tool_tip="Status dostÄ™pnoÅ›ci" /> - <column label="ImiÄ™" name="friend_name" tool_tip="ImiÄ™" /> - <column name="icon_visible_online" - tool_tip="Ta osoba może widzieć czy jesteÅ› w Second Life" /> - <column name="icon_visible_map" - tool_tip="Ta osoba może zlokalizować CiÄ™ na mapie" /> - <column name="icon_edit_mine" - tool_tip="Ta osoba może edytować, usunąć lub wziąć Twoje obiekty" /> - <column name="icon_edit_theirs" tool_tip="Możesz edytować obiekty tej osoby" /> + <scroll_list name="friend_list" tool_tip="By wybrać wielu znajomych za jednym razem przetrzymaj klawisz shift lub control"> + <column name="icon_online_status" tool_tip="Status dostÄ™pnoÅ›ci"/> + <column label="ImiÄ™" name="friend_name" tool_tip="ImiÄ™"/> + <column name="icon_visible_online" tool_tip="Ta osoba może widzieć czy jesteÅ› w Second Life"/> + <column name="icon_visible_map" tool_tip="Ta osoba może zlokalizować CiÄ™ na mapie"/> + <column name="icon_edit_mine" tool_tip="Ta osoba może edytować, usunąć lub wziąć Twoje obiekty"/> + <column name="icon_edit_theirs" tool_tip="Możesz edytować obiekty tej osoby"/> </scroll_list> - <button label="Czat/IM" name="im_btn" tool_tip="Rozpocznij sesjÄ™ czatu/IM" /> - <button label="Profil" name="profile_btn" - tool_tip="Pokaż zdjÄ™cia, grupy i inne informacje" /> - <button label="Teleportuj..." name="offer_teleport_btn" - tool_tip="Zaoferuj teleportacjÄ™ do siebie" /> - <button label="ZapÅ‚ać..." name="pay_btn" tool_tip="ZapÅ‚ać L$ tej osobie" /> - <button label="UsuÅ„..." name="remove_btn" - tool_tip="UsuÅ„ tÄ™ osobÄ™ z listy znajomych" /> - <button label="Dodaj..." name="add_btn" tool_tip="Zaproponuj znajomość" /> + <button label="Czat/IM" name="im_btn" tool_tip="Rozpocznij sesjÄ™ czatu/IM"/> + <button label="Profil" name="profile_btn" tool_tip="Pokaż zdjÄ™cia, grupy i inne informacje"/> + <button label="Teleportuj" name="offer_teleport_btn" tool_tip="Zaoferuj teleportacjÄ™ do siebie"/> + <button label="ZapÅ‚ać" name="pay_btn" tool_tip="ZapÅ‚ać L$ tej osobie"/> + <button label="UsuÅ„" name="remove_btn" tool_tip="UsuÅ„ tÄ™ osobÄ™ z listy znajomych"/> + <button label="Dodaj" name="add_btn" tool_tip="Zaoferuj znajomość"/> </panel> diff --git a/indra/newview/skins/default/xui/pl/panel_group_control_panel.xml b/indra/newview/skins/default/xui/pl/panel_group_control_panel.xml new file mode 100644 index 0000000000..b57ec8f2e6 --- /dev/null +++ b/indra/newview/skins/default/xui/pl/panel_group_control_panel.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_im_control_panel"> + <layout_stack name="vertical_stack"> + <layout_panel name="group_info_btn_panel"> + <button label="Grupa" name="group_info_btn"/> + </layout_panel> + <layout_panel name="call_btn_panel"> + <button label="DzwoÅ„" name="call_btn"/> + </layout_panel> + <layout_panel name="end_call_btn_panel"> + <button label="ZakoÅ„cz RozmowÄ™" name="end_call_btn"/> + </layout_panel> + <layout_panel name="voice_ctrls_btn_panel"> + <button label="Przełączniki GÅ‚osu" name="voice_ctrls_btn"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/default/xui/pl/panel_group_general.xml b/indra/newview/skins/default/xui/pl/panel_group_general.xml index d09ff72226..67fa0bf085 100755..100644 --- a/indra/newview/skins/default/xui/pl/panel_group_general.xml +++ b/indra/newview/skins/default/xui/pl/panel_group_general.xml @@ -1,70 +1,55 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Ogólne" name="general_tab"> - <string name="help_text"> - ZakÅ‚adka Ogólne zawiera informacje na temat tej grupy, listÄ™ wÅ‚aÅ›cicieli, widocznych czÅ‚onków, ustawienia grupy oraz opcje czÅ‚onkostwa. - </string> - <string name="group_info_unchanged"> + <panel.string name="help_text"> + ZakÅ‚adka Główne zawiera ogólne informacje na temat tej grupy, ustawieÅ„ dla caÅ‚ej grupy oraz danego czÅ‚onka. + +By otrzymać pomoc i dodatkowe wskazówki przesuÅ„ kursor na przyciski. + </panel.string> + <panel.string name="group_info_unchanged"> Ogólne informacje na temat grupy ulegÅ‚y zmianie. - </string> - <button label="?" label_selected="?" name="help_button"/> - <line_editor label="Wpisz nazwÄ™ grupy tutaj" name="group_name_editor"/> - <text name="group_name"> - Wpisz nazwÄ™ grupy tutaj - </text> - <text name="prepend_founded_by"> - ZaÅ‚ożyciel: - </text> - <text name="founder_name"> - (proszÄ™ czekać) - </text> - <text name="group_charter_label"> - Status Grupy - </text> - <texture_picker label="Insygnia Grupy" name="insignia" tool_tip="Kliknij by wybrać zdjÄ™cie"/> + </panel.string> + <panel.string name="incomplete_member_data_str"> + Wyszukiwanie informacji o czÅ‚onku + </panel.string> + <panel name="group_info_top"> + <texture_picker label="" name="insignia" tool_tip="Kliknij by wybrać obraz"/> + <text name="prepend_founded_by"> + ZaÅ‚ożyciel: + </text> + <name_box initial_value="(przetwarzanie)" name="founder_name"/> + <text name="join_cost_text"> + WstÄ™p wolny + </text> + <button label="DOÅÄ„CZ TERAZ!" name="btn_join"/> + </panel> <text_editor name="charter"> Status Grupy </text_editor> - <button label="Dołącz (L$0)" label_selected="Dołącz (L$0)" name="join_button"/> - <button label="Szczegóły" label_selected="Szczegóły" name="info_button"/> - <text name="text_owners_and_visible_members"> - WÅ‚aÅ›ciciele i widoczni czÅ‚onkowie - </text> - <text name="text_owners_are_shown_in_bold"> - (WÅ‚aÅ›ciciele wyÅ›wietlajÄ… siÄ™ pogrubionÄ… czcionkÄ…) - </text> <name_list name="visible_members"> - <name_list.columns label="ImiÄ™" name="name"/> + <name_list.columns label="CzÅ‚onek" name="name"/> <name_list.columns label="TytuÅ‚" name="title"/> - <name_list.columns label="Ostatnio w SL" name="online"/> + <name_list.columns label="Status" name="status"/> </name_list> - <text name="text_group_preferences"> - Ustawienia Grupy + <text name="my_group_settngs_label"> + ja </text> + <text name="active_title_label"> + Mój Aktywny TytuÅ‚: + </text> + <combo_box name="active_title" tool_tip="Ustaw tytuÅ‚ który wyÅ›wietla siÄ™ kiedy grupa jest aktywna."/> + <check_box label="Otrzymuj grupowe ogÅ‚oszenia" name="receive_notices" tool_tip="Zaznacz jeżeli chcesz otrzymywać ogÅ‚oszenia z tej grupy. Anuluj z zaznaczenia, jeżeli nie chcesz otrzymywać żadnych ogÅ‚oszeÅ„ z tej grupy."/> + <check_box label="WyÅ›wietl grupÄ™ w profilu" name="list_groups_in_profile" tool_tip="Zaznacz jeżeli chcesz by grupa wyÅ›wietlaÅ‚a siÄ™ w Twoim profilu"/> <panel name="preferences_container"> - <check_box label="WyÅ›wietlaj w wyszukiwarce" name="show_in_group_list" tool_tip="UdostÄ™pnij info o grupie w wyszukiwarce"/> - <check_box label="Wolny WstÄ™p" name="open_enrollement" tool_tip="Sprawdź czy grupa oferuje wolny wstÄ™p i nie wymaga zaproszenia."/> - <check_box label="OpÅ‚ata WstÄ™pu:" name="check_enrollment_fee" tool_tip="Ustaw opÅ‚atÄ™ za przyłączenie siÄ™ do grupy."/> - <spinner name="spin_enrollment_fee" tool_tip="Nowi czÅ‚onkowie grupy muszÄ… zapÅ‚acić wymaganÄ… opÅ‚atÄ™ by dołączyć do grupy."/> + <text name="group_settngs_label"> + Grupa + </text> + <check_box label="Wolny wstÄ™p" name="open_enrollement" tool_tip="Sprawdź czy grupa oferuje wolny wstÄ™p i nie wymaga zaproszenia."/> + <check_box label="OpÅ‚ata wstÄ™pu" name="check_enrollment_fee" tool_tip="Ustaw opÅ‚atÄ™ za przyłączenie siÄ™ do grupy."/> + <spinner label="L$" name="spin_enrollment_fee" tool_tip="Nowi czÅ‚onkowie grupy muszÄ… zapÅ‚acić wymaganÄ… opÅ‚atÄ™ by dołączyć do grupy."/> <combo_box name="group_mature_check" tool_tip="Wybierz jeżeli uważasz, iż Twoja grupa klasyfikowana jest jako 'Mature'."> - <combo_box.item name="select_mature" label="- Wybierz Treść -"/> - <combo_box.item name="mature" label="Treść 'Mature'"/> - <combo_box.item name="pg" label="Treść 'PG'"/> + <combo_box.item label="Treść 'PG'" name="pg"/> + <combo_box.item label="Treść 'Mature'" name="mature"/> </combo_box> - <panel name="title_container"> - <text name="active_title_label"> - Mój Aktywny TytuÅ‚ - </text> - <combo_box name="active_title" tool_tip="Ustaw tytuÅ‚ który wyÅ›wietla siÄ™ kiedy grupa jest aktywna."/> - </panel> - <check_box label="Otrzymuj grupowe ogÅ‚oszenia" name="receive_notices" tool_tip="Zaznacz jeżeli chcesz otrzymywać ogÅ‚oszenia z tej grupy. Anuluj z zaznaczenia, jeżeli nie chcesz otrzymywać żadnych ogÅ‚oszeÅ„ z tej grupy."/> - <check_box label="WyÅ›wietl grupÄ™ w profilu" name="list_groups_in_profile" tool_tip="Zaznacz jeżeli chcesz by grupa wyÅ›wietlaÅ‚a siÄ™ w Twoim profilu"/> + <check_box initial_value="true" label="WyÅ›wietlaj w wyszukiwarce" name="show_in_group_list" tool_tip="UdostÄ™pnij info o grupie w wyszukiwarce"/> </panel> - <string name="incomplete_member_data_str"> - Wyszukiwanie informacji o czÅ‚onku - </string> - <string name="confirm_group_create_str"> - Koszt utworzenia tej grupy wynosi L$100. -Czy napewno jesteÅ› PEWNY,że chcesz zapÅ‚acić L$100 by utworzyć grupÄ™? -PamiÄ™taj, jeżeli w ciÄ…gu 48h od utworzenia grupy nikt do niej nie dołączy, informacje o grupie zostanÄ… usuniÄ™te z bazy, a nazwa grupy zablokowana do użycia w przyszÅ‚oÅ›ci. - </string> </panel> diff --git a/indra/newview/skins/default/xui/pl/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/pl/panel_group_info_sidetray.xml new file mode 100644 index 0000000000..509c2893cf --- /dev/null +++ b/indra/newview/skins/default/xui/pl/panel_group_info_sidetray.xml @@ -0,0 +1,35 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="O Grupie" name="GroupInfo"> + <panel.string name="default_needs_apply_text"> + Nie zapisaÅ‚eÅ› zmian + </panel.string> + <panel.string name="want_apply_text"> + Czy chcesz zachować te zmiany? + </panel.string> + <panel.string name="group_join_btn"> + Dołącz (L$[AMOUNT]) + </panel.string> + <panel.string name="group_join_free"> + Darmowe + </panel.string> + <panel name="group_info_top"> + <text name="group_name" value="(Åadowanie...)"/> + <line_editor label="Wpisz nazwÄ™ swojej nowej grupy tutaj" name="group_name_editor"/> + </panel> + <layout_stack name="layout"> + <layout_panel name="group_accordions"> + <accordion name="groups_accordion"> + <accordion_tab name="group_general_tab" title="Ogólne"/> + <accordion_tab name="group_roles_tab" title="Funkcja"/> + <accordion_tab name="group_notices_tab" title="Notki"/> + <accordion_tab name="group_land_tab" title="Posiadlość/MajÄ…tek"/> + </accordion> + </layout_panel> + <layout_panel name="button_row"> + <button label="Czat" name="btn_chat"/> + <button label="Konferencja GÅ‚osowa" name="btn_call" tool_tip="Konferencja GÅ‚osowa"/> + <button label="Zapisz" label_selected="Zapisz" name="btn_apply"/> + <button label="Stwórz nowÄ… GrupÄ™" name="btn_create" tool_tip="Stwórz nowÄ… GrupÄ™"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/default/xui/pl/panel_group_invite.xml b/indra/newview/skins/default/xui/pl/panel_group_invite.xml index 12d48279ad..e520c06944 100755..100644 --- a/indra/newview/skins/default/xui/pl/panel_group_invite.xml +++ b/indra/newview/skins/default/xui/pl/panel_group_invite.xml @@ -1,23 +1,27 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Zaproszenie do Grupy" name="invite_panel"> + <panel.string name="confirm_invite_owner_str"> + JesteÅ› pewny, że chcesz wybrać nowych wÅ‚aÅ›cieli grupy? Ta decyzja jest ostateczna! + </panel.string> + <panel.string name="loading"> + (Å‚adowanie...) + </panel.string> + <panel.string name="already_in_group"> + Niektórzy Rezydenci, których wybraÅ‚eÅ› już należą do grupy i nie otrzymali zaproszenia. + </panel.string> <text name="help_text"> - Możesz zaprosić kilku Rezydentów -do swojej grupy. Wybierz 'Otwórz -Katalog Osobisty' by rozpocząć. + Możesz zaprosić kilku Rezydentów do swojej grupy. Wybierz 'Otwórz Katalog Osobisty' aby rozpocząć. </text> <button label="Otwórz Katalog Osobisty" name="add_button" tool_tip=""/> - <name_list name="invitee_list" tool_tip="" /> - <button label="UsuÅ„ z Listy" name="remove_button" tool_tip="" /> + <name_list name="invitee_list" tool_tip="Przytrzymaj klawisz Ctrl i kliknij imiÄ™ Rezydenta aby wybrać kilka osób."/> + <button label="UsuÅ„ z Listy" name="remove_button" tool_tip="Usuwa wybranych powyżej Rezydentów z listy zaproszeÅ„."/> <text name="role_text"> Wybierz rolÄ™ dla nowego czÅ‚onka: </text> - <combo_box name="role_name" tool_tip="" /> - <button label="WyÅ›lij Zaproszenia" name="ok_button" /> - <button label="Anuluj" name="cancel_button" /> - <string name="confirm_invite_owner_str"> - JesteÅ› pewny, że chcesz wybrać nowych wÅ‚aÅ›cieli grupy? Ta decyzja jest ostateczna! - </string> - <string name="loading"> - (loading...) + <combo_box name="role_name" tool_tip="Wybierz z listy Role, które możesz przypisać CzÅ‚onkom"/> + <button label="WyÅ›lij Zaproszenia" name="ok_button"/> + <button label="Anuluj" name="cancel_button"/> + <string name="GroupInvitation"> + Zaproszenie do Grupy </string> </panel> diff --git a/indra/newview/skins/default/xui/pl/panel_group_land_money.xml b/indra/newview/skins/default/xui/pl/panel_group_land_money.xml index dbfa8e3122..a52b7f7745 100755..100644 --- a/indra/newview/skins/default/xui/pl/panel_group_land_money.xml +++ b/indra/newview/skins/default/xui/pl/panel_group_land_money.xml @@ -1,84 +1,81 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="PosiadÅ‚oÅ›ci i L$" name="land_money_tab"> - <string name="help_text"> - PosiadÅ‚oÅ›ci, które sÄ… wÅ‚asnoÅ›ciÄ… grupy zawierajÄ… dane poszczególnych kontrybucji ich czÅ‚onków. W przypadku kiedy caÅ‚kowita ilość metrów przypisanej danej posiadÅ‚oÅ›ci przez grupÄ™ jest mniejsza lub równa caÅ‚kowitej liczbie kontrybucji dla przypisanej iloÅ›ci metrów pojawia siÄ™ ostrzeżenie. ZakÅ‚adki: Planowanie, Szczegóły oraz Sprzedaże udostÄ™pniajÄ… informacje na temat statusu finansowego grupy. - </string> - <button label="?" name="help_button"/> - <string name="cant_view_group_land_text"> + <panel.string name="help_text"> + Ostrzeżenie pojawia siÄ™ kiedy ÅÄ…czna Powierzchnia PosiadÅ‚oÅ›ci jest mniejsza lub = Kontrybucjom + </panel.string> + <panel.string name="cant_view_group_land_text"> Nie masz pozwolenia na oglÄ…danie PosiadÅ‚oÅ›ci Grupy. - </string> - <string name="cant_view_group_accounting_text"> + </panel.string> + <panel.string name="cant_view_group_accounting_text"> Nie masz dostÄ™pu do konta, finansów Grupy. - </string> - <string name="loading_txt"> + </panel.string> + <panel.string name="loading_txt"> Åadowanie... - </string> - <text name="group_land_heading"> - PosiadÅ‚oÅ›ci Grupy - </text> - <scroll_list name="group_parcel_list"> - <column label="PosiadÅ‚oÅ›ci" name="name"/> - <column label="Region" name="location"/> - <column label="Typ" name="type"/> - <column label="Obszar" name="area"/> - <column label="" name="hidden"/> - </scroll_list> - <button label="Pokaż na Mapie" label_selected="Pokaż na Mapie" name="map_button"/> - <text name="total_contributed_land_label"> - Kontrybucje: - </text> - <text name="total_contributed_land_value"> - [AREA] metrów - </text> - <text name="total_land_in_use_label"> - Używane PosiadÅ‚oÅ›ci: - </text> - <text name="total_land_in_use_value"> - [AREA] metrów - </text> - <text name="land_available_label"> - DostÄ™pne PosiadÅ‚oÅ›ci: - </text> - <text name="land_available_value"> - [AREA] metrów - </text> - <text name="your_contribution_label"> - Twoje Kontrybucje: - </text> - <string name="land_contrib_error"> + </panel.string> + <panel.string name="land_contrib_error"> Nie można ustalić Twoich kontrybucji. - </string> - <text name="your_contribution_units"> - ( m ) - </text> - <text name="your_contribution_max_value"> - ([AMOUNT] maksimum) - </text> - <text name="group_over_limit_text"> - CzÅ‚onkowie Grupy muszÄ… zwiÄ™kszyć kredyt na używanie PosiadÅ‚oÅ›ci. - </text> - <text name="group_money_heading"> - L$ Grupy - </text> + </panel.string> + <panel name="layout_panel_landmoney"> + <scroll_list name="group_parcel_list"> + <scroll_list.columns label="PosiadÅ‚ość" name="name"/> + <scroll_list.columns label="Region" name="location"/> + <scroll_list.columns label="Typ" name="type"/> + <scroll_list.columns label="Obszar" name="area"/> + </scroll_list> + <text name="total_contributed_land_label"> + Kontrybucje: + </text> + <text name="total_contributed_land_value"> + [AREA] m² + </text> + <button label="Mapa" label_selected="Mapa" name="map_button"/> + <text name="total_land_in_use_label"> + Używane PosiadÅ‚oÅ›ci: + </text> + <text name="total_land_in_use_value"> + [AREA] m² + </text> + <text name="land_available_label"> + DostÄ™pne PosiadÅ‚oÅ›ci: + </text> + <text name="land_available_value"> + [AREA] m² + </text> + <text name="your_contribution_label"> + Twoje Kontrybucje: + </text> + <text name="your_contribution_units"> + m² + </text> + <text name="your_contribution_max_value"> + ([AMOUNT] max) + </text> + <text name="group_over_limit_text"> + Należy zwiÄ™szyć kredyt na używanie PosiadÅ‚oÅ›ci. + </text> + <text name="group_money_heading"> + L$ Grupy + </text> + </panel> <tab_container name="group_money_tab_container"> - <panel label="Planowanie" name="group_money_planning_tab"> + <panel label="PLANOWANIE" name="group_money_planning_tab"> <text_editor name="group_money_planning_text"> - Obliczanie... + Åadowanie... </text_editor> </panel> - <panel label="Szczegóły" name="group_money_details_tab"> + <panel label="SZCZEGÓÅY" name="group_money_details_tab"> <text_editor name="group_money_details_text"> - Obliczanie... + Åadowanie... </text_editor> - <button label="< WczeÅ›niej" label_selected="< WczeÅ›niej" name="earlier_details_button" tool_tip="Do tyÅ‚u w czasie"/> - <button label="Później >" label_selected="Później >" name="later_details_button" tool_tip="Do przodu w czasie"/> + <button label="< WczeÅ›niej" label_selected="< WczeÅ›niej" name="earlier_details_button" tool_tip="WczeÅ›niej"/> + <button label="Później >" label_selected="Później >" name="later_details_button" tool_tip="Później"/> </panel> - <panel label="Sprzedaż" name="group_money_sales_tab"> + <panel label="SPRZEDAÅ»" name="group_money_sales_tab"> <text_editor name="group_money_sales_text"> - Obliczanie... + Åadowanie... </text_editor> - <button label="< WczeÅ›niej" label_selected="< WczeÅ›niej" name="earlier_sales_button" tool_tip="Do tyÅ‚u w czasie"/> - <button label="Później >" label_selected="Później >" name="later_sales_button" tool_tip="Do przodu w czasie"/> + <button label="< WczeÅ›niej" label_selected="< WczeÅ›niej" name="earlier_sales_button" tool_tip="WczeÅ›niej"/> + <button label="Później >" label_selected="Później >" name="later_sales_button" tool_tip="Później"/> </panel> </tab_container> </panel> diff --git a/indra/newview/skins/default/xui/pl/panel_group_list_item.xml b/indra/newview/skins/default/xui/pl/panel_group_list_item.xml new file mode 100644 index 0000000000..a8b4056976 --- /dev/null +++ b/indra/newview/skins/default/xui/pl/panel_group_list_item.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="group_list_item"> + <text name="group_name" value="Nieznana"/> + <button name="profile_btn" tool_tip="Zobacz profil"/> +</panel> diff --git a/indra/newview/skins/default/xui/pl/panel_group_notices.xml b/indra/newview/skins/default/xui/pl/panel_group_notices.xml index 1c19571ec0..31882ab0e6 100755..100644 --- a/indra/newview/skins/default/xui/pl/panel_group_notices.xml +++ b/indra/newview/skins/default/xui/pl/panel_group_notices.xml @@ -1,38 +1,30 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="OgÅ‚oszenia" name="notices_tab"> - <string name="help_text"> + <panel.string name="help_text"> OgÅ‚oszenia to szybka droga do komunikowania siÄ™ ze wszystkmi czÅ‚onkami grupy poprzez wysylanie ich na grupowym kanale. Dodatkowo, do ogÅ‚oszenia można doÅ‚aÅ„czać załączniki. OgÅ‚oszenia docierajÄ… jedynie do czÅ‚onków grupy, którzy majÄ… zdolność ich otrzymywania. By nie otrzymywać ogÅ‚oszeÅ„, w zakÅ‚adce Ogólne pozostaw niezaznaczonym "Otrzymuj grupowe ogÅ‚oszenia". - </string> - <string name="no_notices_text"> + </panel.string> + <panel.string name="no_notices_text"> Brak przeszÅ‚ych ogÅ‚oszeÅ„ - </string> - <button label="?" label_selected="?" name="help_button" /> - <text name="lbl"> - Archiwum Grupowych OgÅ‚oszeÅ„ - </text> + </panel.string> <text name="lbl2"> - OgÅ‚oszenia przechowywane sÄ… przez 14 dni. + OgÅ‚oszenia przechowywane sÄ… przez 14 dni. Limit dzienny ogÅ‚oszeÅ„ dla grupy wynosi 200. </text> <scroll_list name="notice_list"> - <column label="" name="icon" /> - <column label="Temat" name="subject" /> - <column label="Autor" name="from" /> - <column label="Data" name="date" /> + <scroll_list.columns label="" name="icon"/> + <scroll_list.columns label="Temat" name="subject"/> + <scroll_list.columns label="Autor" name="from"/> + <scroll_list.columns label="Data" name="date"/> </scroll_list> <text name="notice_list_none_found"> - Nie znalezione. + Nie znaleziono </text> - <button label="Stwórz Nowe OgÅ‚oszenie" label_selected="Stwórz Nowe OgÅ‚oszenie" - name="create_new_notice" /> - <button label="OdÅ›wież" label_selected="OdÅ›wież ListÄ™" name="refresh_notices" /> + <button label="Stwórz OgÅ‚oszenie" label_selected="Stwórz Nowe OgÅ‚oszenie" name="create_new_notice" tool_tip="Stwórz OgÅ‚oszenie"/> + <button label="OdÅ›wież" label_selected="OdÅ›wież ListÄ™" name="refresh_notices" tool_tip="Użyj OdÅ›wież by zobaczyć czy nowe ogÅ‚oszenia zostaÅ‚y wysÅ‚ane."/> <panel label="Stwórz Nowe OgÅ‚oszenie" name="panel_create_new_notice"> <text name="lbl"> Stwórz OgÅ‚oszenie </text> - <text name="lbl2"> - Możesz także dołączyć pojedynczy załącznik ze swojej szafy. Załącznik musi mieć prawo modyfikacyjne do kopiowania oraz transferu. - </text> <text name="lbl3"> Temat: </text> @@ -42,17 +34,19 @@ Limit dzienny ogÅ‚oszeÅ„ dla grupy wynosi 200. <text name="lbl5"> Załącz: </text> - <button label="UsuÅ„ Załącznik" label_selected="UsuÅ„ Załącznik" - name="remove_attachment" /> - <button label="WyÅ›lij" label_selected="WyÅ›lij" name="send_notice" /> - <panel name="drop_target" tool_tip="" /> + <text name="string"> + PrzeciÄ…gnij i upuść załącznik tutaj aby go dodać: + </text> + <button label="UsuÅ„ załącznik" label_selected="UsuÅ„ Załącznik" name="remove_attachment" tool_tip="UsuÅ„ załącznik z noty"/> + <button label="WyÅ›lij" label_selected="WyÅ›lij" name="send_notice"/> + <group_drop_target name="drop_target" tool_tip="PrzeciÄ…gnij załącznik ze swojej Szafy na pole docelowe aby wysÅ‚ać go z OgÅ‚oszeniem. Musisz posiadać prawo do kopiowania i transferu załącznika aby go dodać do ogÅ‚oszenia."/> </panel> - <panel label="Zobacz PrzeszÅ‚e OgÅ‚oszenia" name="panel_view_past_notice"> + <panel label="Zobacz przeszÅ‚e OgÅ‚oszenia" name="panel_view_past_notice"> <text name="lbl"> - OgÅ‚oszenia Zachowane + OgÅ‚oszenia zachowane </text> <text name="lbl2"> - By wysÅ‚ać nowe ogÅ‚oszenie, kliknij Stwórz Nowe OgÅ‚oszenie. + W celu wysÅ‚ania nowego ogÅ‚oszenia kliknij przycisk + </text> <text name="lbl3"> Temat: @@ -60,7 +54,6 @@ Limit dzienny ogÅ‚oszeÅ„ dla grupy wynosi 200. <text name="lbl4"> Treść: </text> - <button label="Otwórz Załącznik" label_selected="Otwórz Załącznik" - name="open_attachment" /> + <button label="Otwórz Załącznik" label_selected="Otwórz Załącznik" name="open_attachment"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/pl/panel_group_notify.xml b/indra/newview/skins/default/xui/pl/panel_group_notify.xml new file mode 100644 index 0000000000..d81c3f68f2 --- /dev/null +++ b/indra/newview/skins/default/xui/pl/panel_group_notify.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="instant_message" name="panel_group_notify"> + <panel label="header" name="header"> + <text name="title" value="ImiÄ™ Nadawcy / Nazwa Grupy"/> + </panel> + <text name="attachment" value="Załącznik"/> + <button label="OK" name="btn_ok"/> +</panel> diff --git a/indra/newview/skins/default/xui/pl/panel_group_roles.xml b/indra/newview/skins/default/xui/pl/panel_group_roles.xml index dd46b4aeaa..8a422e2586 100755..100644 --- a/indra/newview/skins/default/xui/pl/panel_group_roles.xml +++ b/indra/newview/skins/default/xui/pl/panel_group_roles.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="CzÅ‚onkowie" name="roles_tab"> <panel.string name="default_needs_apply_text"> - ZakÅ‚adka zawiera niezapisane zmiany + Panel zawiera niezapisane zmiany. </panel.string> <panel.string name="want_apply_text"> Czy chcesz zapisać zmiany? @@ -16,7 +16,7 @@ Możesz wybrać wielu CzÅ‚onków naciskajÄ…c Ctrl i klikajÄ…c na ich imionach. <name_list name="member_list"> <name_list.columns label="CzÅ‚onek" name="name"/> <name_list.columns label="Dotacje" name="donated"/> - <name_list.columns label="Ostatnio w SL" name="online"/> + <name_list.columns label="Status" name="online"/> </name_list> <button label="ZaproÅ› do Grupy" name="member_invite"/> <button label="UsuÅ„ z Grupy" name="member_eject"/> @@ -29,7 +29,7 @@ jednÄ… lub wiele funkcji. Każda grupa może posiadać maksymalnie 10 funkcji, łącznie z funkcjÄ… Każdy i WÅ‚aÅ›ciciel. </panel.string> <panel.string name="cant_delete_role"> - Specjalne Funkcje Każdy i WÅ‚aÅ›ciciel nie mogÄ… zostać usuniÄ™te. + Funkcje "Wszyscy" oraz "WÅ‚aÅ›ciciele" sÄ… domyÅ›lnie oraz nie mogÄ… zostać usuniÄ™te. </panel.string> <panel.string name="power_folder_icon"> Inv_FolderClosed @@ -38,7 +38,7 @@ jednÄ… lub wiele funkcji. Każda grupa może posiadać maksymalnie 10 funkcji, <scroll_list name="role_list"> <scroll_list.columns label="Funkcja" name="name"/> <scroll_list.columns label="TytuÅ‚" name="title"/> - <scroll_list.columns label="Liczba" name="members"/> + <scroll_list.columns label="#" name="members"/> </scroll_list> <button label="Stwórz NowÄ… FunkcjÄ™" name="role_create"/> <button label="UsuÅ„ FunkcjÄ™" name="role_delete"/> @@ -57,7 +57,7 @@ Istnieje wiele Przywilei. </tab_container> <panel name="members_footer"> <text name="static"> - Funkcje + Przywileje </text> <scroll_list name="member_assigned_roles"> <scroll_list.columns label="" name="checkbox"/> @@ -73,13 +73,13 @@ Istnieje wiele Przywilei. </panel> <panel name="roles_footer"> <text name="static"> - Nazwa + Nazwa Funkcji </text> <line_editor name="role_name"> Liczba </line_editor> <text name="static3"> - TytuÅ‚ + Nazwa Funkcji </text> <line_editor name="role_title"> (proszÄ™ czekać) diff --git a/indra/newview/skins/default/xui/pl/panel_groups.xml b/indra/newview/skins/default/xui/pl/panel_groups.xml index 9df90fc797..9df90fc797 100755..100644 --- a/indra/newview/skins/default/xui/pl/panel_groups.xml +++ b/indra/newview/skins/default/xui/pl/panel_groups.xml diff --git a/indra/newview/skins/default/xui/pl/panel_im_control_panel.xml b/indra/newview/skins/default/xui/pl/panel_im_control_panel.xml new file mode 100644 index 0000000000..ffd75994cb --- /dev/null +++ b/indra/newview/skins/default/xui/pl/panel_im_control_panel.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_im_control_panel"> + <layout_stack name="button_stack"> + <layout_panel name="view_profile_btn_panel"> + <button label="Profil" name="view_profile_btn"/> + </layout_panel> + <layout_panel name="add_friend_btn_panel"> + <button label="Poznaj" name="add_friend_btn"/> + </layout_panel> + <layout_panel name="teleport_btn_panel"> + <button label="Teleportuj" name="teleport_btn" tool_tip="Teleportuj"/> + </layout_panel> + <layout_panel name="share_btn_panel"> + <button label="UdostÄ™pnij" name="share_btn"/> + </layout_panel> + <layout_panel name="pay_btn_panel"> + <button label="ZapÅ‚ać" name="pay_btn"/> + </layout_panel> + <layout_panel name="call_btn_panel"> + <button label="DzwoÅ„" name="call_btn"/> + </layout_panel> + <layout_panel name="end_call_btn_panel"> + <button label="ZakoÅ„cz RozmowÄ™" name="end_call_btn"/> + </layout_panel> + <layout_panel name="voice_ctrls_btn_panel"> + <button label="Przełączniki GÅ‚osu" name="voice_ctrls_btn"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/default/xui/pl/panel_landmark_info.xml b/indra/newview/skins/default/xui/pl/panel_landmark_info.xml new file mode 100644 index 0000000000..64479176fa --- /dev/null +++ b/indra/newview/skins/default/xui/pl/panel_landmark_info.xml @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="landmark_info"> + <string name="title_create_landmark" value="ZapamiÄ™taj Miejsce"/> + <string name="title_edit_landmark" value="Edytuj ZapamiÄ™tane Miejsce"/> + <string name="title_landmark" value="ZapamiÄ™tane Miejsce (LM)"/> + <string name="not_available" value="(N\A)"/> + <string name="unknown" value="(nieznane)"/> + <string name="public" value="(publiczne)"/> + <string name="server_update_text"> + Informacje o miejscu nie sÄ… dostÄ™pne bez aktualizacji serwera. + </string> + <string name="server_error_text"> + Informacje o miejscu nie sÄ… dostÄ™pne w tej chwili. Prosimy sprobować później. + </string> + <string name="server_forbidden_text"> + Informacje o miejscu sÄ… niedostÄ™pne z powodu braku dostÄ™pu. Prosimy sprawdzić swoje prawa z wÅ‚aÅ›cicielem posiadÅ‚oÅ›ci. + </string> + <string name="acquired_date"> + [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local] + </string> + <button name="back_btn" tool_tip="Cofnij"/> + <text name="title" value="Profil Miejsca"/> + <scroll_container name="place_scroll"> + <panel name="scrolling_panel"> + <text name="maturity_value" value="nieznany"/> + <panel name="landmark_info_panel"> + <text name="owner_label" value="WÅ‚aÅ›ciciel:"/> + <text name="creator_label" value="Twórca:"/> + <text name="created_label" value="Stworzone:"/> + </panel> + <panel name="landmark_edit_panel"> + <text name="title_label" value="TytuÅ‚:"/> + <text name="notes_label" value="Moje notatki:"/> + <text name="folder_label" value="Lokalizacja zapisanego miejsca:"/> + </panel> + </panel> + </scroll_container> +</panel> diff --git a/indra/newview/skins/default/xui/pl/panel_landmarks.xml b/indra/newview/skins/default/xui/pl/panel_landmarks.xml new file mode 100644 index 0000000000..dcc495b5a8 --- /dev/null +++ b/indra/newview/skins/default/xui/pl/panel_landmarks.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="Landmarks"> + <accordion name="landmarks_accordion"> + <accordion_tab name="tab_favorites" title="Ulubione"/> + <accordion_tab name="tab_landmarks" title="Landmarki"/> + <accordion_tab name="tab_inventory" title="Moja Szafa"/> + <accordion_tab name="tab_library" title="Biblioteka"/> + </accordion> + <panel name="bottom_panel"> + <button name="options_gear_btn" tool_tip="Pokaż dodatkowe opcje"/> + <button name="add_btn" tool_tip="Dodaj nowy landmark"/> + <dnd_button name="trash_btn" tool_tip="UsuÅ„ zaznaczony landmark"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/pl/panel_login.xml b/indra/newview/skins/default/xui/pl/panel_login.xml index cec7e34da5..6b0061926b 100755..100644 --- a/indra/newview/skins/default/xui/pl/panel_login.xml +++ b/indra/newview/skins/default/xui/pl/panel_login.xml @@ -6,33 +6,29 @@ <panel.string name="forgot_password_url"> http://secondlife.com/account/request.php </panel.string> - <panel name="login_widgets"> - <text name="first_name_text"> - ImiÄ™: - </text> - <line_editor name="first_name_edit" tool_tip="[SECOND_LIFE] ImiÄ™"/> - <text name="last_name_text"> - Nazwisko - </text> - <line_editor name="last_name_edit" tool_tip="[SECOND_LIFE] Nazwisko"/> - <text name="password_text"> - HasÅ‚o: - </text> - <button label="Zaloguj" label_selected="Zaloguj" name="connect_btn"/> - <text name="start_location_text"> - Miejsce Startu: - </text> - <combo_box name="start_location_combo"> - <combo_box.item label="Moje Ostatnie Miejsce" name="MyLastLocation"/> - <combo_box.item label="Moje Miejsce Startu" name="MyHome"/> - <combo_box.item label="<Wpisz nazwÄ™ regionu>" name="Typeregionname"/> - </combo_box> - <check_box label="ZapamiÄ™taj HasÅ‚o" name="remember_check"/> - <text name="create_new_account_text"> - Załóż Nowe Konto - </text> - <text name="forgot_password_text"> - Nie pamiÄ™tasz swojego imienia lub hasÅ‚a? - </text> - </panel> + <layout_stack name="login_widgets"> + <layout_panel name="login"> + <text name="first_name_text"> + ImiÄ™: + </text> + <line_editor label="ImiÄ™" name="first_name_edit" tool_tip="[SECOND_LIFE] First Name"/> + <line_editor label="Nazwisko" name="last_name_edit" tool_tip="[SECOND_LIFE] Last Name"/> + <check_box label="ZapamiÄ™taj HasÅ‚o" name="remember_check"/> + <text name="start_location_text"> + Rozpocznij w: + </text> + <combo_box name="start_location_combo"> + <combo_box.item label="Moje Miejsce Startu" name="MyHome"/> + </combo_box> + <button label="Połącz" name="connect_btn"/> + </layout_panel> + <layout_panel name="links"> + <text name="create_new_account_text"> + Utwórz nowe konto + </text> + <text name="login_help"> + Potrzebujesz pomocy z logowaniem siÄ™? + </text> + </layout_panel> + </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/pl/panel_main_inventory.xml b/indra/newview/skins/default/xui/pl/panel_main_inventory.xml index e34fd69671..e0d9def8b3 100644 --- a/indra/newview/skins/default/xui/pl/panel_main_inventory.xml +++ b/indra/newview/skins/default/xui/pl/panel_main_inventory.xml @@ -1,26 +1,22 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Rzeczy" name="main inventory panel"> - <panel.string name="Title"> - Rzeczy + <panel.string name="ItemcountFetching"> + Dostarczanie [ITEM_COUNT] obiektów... [FILTER] </panel.string> - <filter_editor label="Filtr" name="inventory search editor"/> - <tab_container name="inventory filter tabs"> - <inventory_panel label="Wszystkie Obiekty" name="All Items"/> - <inventory_panel label="Ostatnio Dodane Obiekty" name="Recent Items"/> - </tab_container> - <panel name="bottom_panel"> - <button name="options_gear_btn" tool_tip="Pokaż dodatkowe opcje"/> - <button name="add_btn" tool_tip="Dodaj nowy obiekt"/> - <dnd_button name="trash_btn" tool_tip="UsuÅ„ wybrany obiekt"/> - </panel> + <panel.string name="ItemcountCompleted"> + [ITEM_COUNT] obiekty [FILTER] + </panel.string> + <text name="ItemcountText"> + Obiekty: + </text> <menu_bar name="Inventory Menu"> <menu label="Plik" name="File"> <menu_item_call label="Otwórz" name="Open"/> <menu label="ZaÅ‚aduj" name="upload"> - <menu_item_call label="Obraz (L$[COST])..." name="Upload Image"/> - <menu_item_call label="DźwiÄ™k (L$[COST])..." name="Upload Sound"/> - <menu_item_call label="AnimacjÄ™ (L$[COST])..." name="Upload Animation"/> - <menu_item_call label="Zbiór Plików (L$[COST] za jeden plik)..." name="Bulk Upload"/> + <menu_item_call label="obraz (L$[COST])..." name="Upload Image"/> + <menu_item_call label="dźwiÄ™k (L$[COST])..." name="Upload Sound"/> + <menu_item_call label="animacjÄ™ (L$[COST])..." name="Upload Animation"/> + <menu_item_call label="zbiór plików (L$[COST] za jeden plik)..." name="Bulk Upload"/> </menu> <menu_item_call label="Nowe Okno" name="New Window"/> <menu_item_call label="Pokaż Filtry" name="Show Filters"/> @@ -30,35 +26,45 @@ <menu_item_call label="Opróżnij Folder Zgubione i Znalezione" name="Empty Lost And Found"/> </menu> <menu label="Stwórz" name="Create"> - <menu_item_call label="Nowy Folder" name="New Folder"/> - <menu_item_call label="Nowy Skrypt" name="New Script"/> - <menu_item_call label="NowÄ… NotÄ™" name="New Note"/> - <menu_item_call label="NowÄ… GesturkÄ™" name="New Gesture"/> + <menu_item_call label="Nowy folder" name="New Folder"/> + <menu_item_call label="Nowy skrypt" name="New Script"/> + <menu_item_call label="Nowa nota" name="New Note"/> + <menu_item_call label="Nowy gest" name="New Gesture"/> <menu label="Nowe Ubranie" name="New Clothes"> - <menu_item_call label="NowÄ… KoszulkÄ™" name="New Shirt"/> - <menu_item_call label="Nowe Spodnie" name="New Pants"/> - <menu_item_call label="Nowe Buty" name="New Shoes"/> - <menu_item_call label="Nowe Skarpetki" name="New Socks"/> - <menu_item_call label="NowÄ… KurtkÄ™" name="New Jacket"/> - <menu_item_call label="NowÄ… SpódnicÄ™" name="New Skirt"/> - <menu_item_call label="Nowe RÄ™kawiczki" name="New Gloves"/> - <menu_item_call label="Nowy Podkoszulek" name="New Undershirt"/> - <menu_item_call label="NowÄ… BieliznÄ™" name="New Underpants"/> - <menu_item_call label="Nowe Ubranie Przezroczyste" name="New Alpha"/> - <menu_item_call label="Nowy Tatuaż" name="New Tattoo"/> + <menu_item_call label="NowÄ… kkoszulkÄ™" name="New Shirt"/> + <menu_item_call label="Nowe spodnie" name="New Pants"/> + <menu_item_call label="Nowe buty" name="New Shoes"/> + <menu_item_call label="Nowe skarpetki" name="New Socks"/> + <menu_item_call label="NowÄ… kurtkÄ™" name="New Jacket"/> + <menu_item_call label="NowÄ… spódnicÄ™" name="New Skirt"/> + <menu_item_call label="Nowe rÄ™kawiczki" name="New Gloves"/> + <menu_item_call label="Nowy podkoszulek" name="New Undershirt"/> + <menu_item_call label="NowÄ… bieliznÄ™" name="New Underpants"/> + <menu_item_call label="Nowe ubranie Alpha" name="New Alpha"/> + <menu_item_call label="Nowy tatuaż" name="New Tattoo"/> </menu> <menu label="NowÄ… Część CiaÅ‚a" name="New Body Parts"> - <menu_item_call label="Nowy KsztaÅ‚t" name="New Shape"/> - <menu_item_call label="NowÄ… SkórkÄ™" name="New Skin"/> - <menu_item_call label="Nowe WÅ‚osy" name="New Hair"/> - <menu_item_call label="Nowe Oczy" name="New Eyes"/> + <menu_item_call label="Nowy ksztaÅ‚t" name="New Shape"/> + <menu_item_call label="NowÄ… skórkÄ™" name="New Skin"/> + <menu_item_call label="Nowe wÅ‚osy" name="New Hair"/> + <menu_item_call label="Nowe oczy" name="New Eyes"/> </menu> </menu> <menu label="UporzÄ…dkuj" name="Sort"> - <menu_item_check label="WegÅ‚ug Nazwy" name="By Name"/> - <menu_item_check label="WedÅ‚ug Daty" name="By Date"/> + <menu_item_check label="WegÅ‚ug bazwy" name="By Name"/> + <menu_item_check label="WedÅ‚ug daty" name="By Date"/> <menu_item_check label="Foldery zawsze wedÅ‚ug nazwy" name="Folders Always By Name"/> - <menu_item_check label="Foldery Systemowe od Góry" name="System Folders To Top"/> + <menu_item_check label="Foldery Systemowe od góry" name="System Folders To Top"/> </menu> </menu_bar> + <filter_editor label="Filtr" name="inventory search editor"/> + <tab_container name="inventory filter tabs"> + <inventory_panel label="Wszystkie obiekty" name="All Items"/> + <inventory_panel label="Ostatnio dodane obiekty" name="Recent Items"/> + </tab_container> + <panel name="bottom_panel"> + <button name="options_gear_btn" tool_tip="Pokaż dodatkowe opcje"/> + <button name="add_btn" tool_tip="Dodaj nowy obiekt"/> + <dnd_button name="trash_btn" tool_tip="UsuÅ„ wybrany obiekt"/> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/pl/panel_me.xml b/indra/newview/skins/default/xui/pl/panel_me.xml new file mode 100644 index 0000000000..72a5f51520 --- /dev/null +++ b/indra/newview/skins/default/xui/pl/panel_me.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Mój Profil" name="panel_me"> + <tab_container name="tabs"> + <panel label="PROFIL" name="panel_profile"/> + <panel label="ULUBIONE" name="panel_picks"/> + </tab_container> +</panel> diff --git a/indra/newview/skins/default/xui/pl/panel_media_settings_general.xml b/indra/newview/skins/default/xui/pl/panel_media_settings_general.xml new file mode 100644 index 0000000000..03b063ddfe --- /dev/null +++ b/indra/newview/skins/default/xui/pl/panel_media_settings_general.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Ogólne" name="Media Settings General"> + <text name="home_label"> + Strona Domowa: + </text> + <text name="home_fails_whitelist_label"> + (ta strona nie zostaÅ‚a zaakceptowana przez filtr listy dostÄ™powej) + </text> + <line_editor name="home_url" tool_tip="Strona domowa dla źródla mediów"/> + <text name="preview_label"> + Pokaż + </text> + <text name="current_url_label"> + Obecna Strona: + </text> + <text name="current_url" tool_tip="The current page for this media source" value=""/> + <button label="Zresetuj" name="current_url_reset_btn"/> + <check_box initial_value="false" label="PÄ™tla" name="auto_loop"/> + <check_box initial_value="false" label="Interakcja KlikniÄ™cia" name="first_click_interact"/> + <check_box initial_value="false" label="AutopowiÄ™kszenie" name="auto_zoom"/> + <check_box initial_value="false" label="Automatyczne Odtwarzanie Mediów" name="auto_play"/> + <text name="media_setting_note"> + PamiÄ™taj: Rezydenci mogÄ… zmienić to ustawienie + </text> + <check_box initial_value="false" label="Automatyczne dopasowanie mediów na twarzy lub obiekcie" name="auto_scale"/> + <text name="size_label"> + Rozmiar: + </text> + <text name="X_label"> + X + </text> +</panel> diff --git a/indra/newview/skins/default/xui/pl/panel_media_settings_permissions.xml b/indra/newview/skins/default/xui/pl/panel_media_settings_permissions.xml new file mode 100644 index 0000000000..939bcbbb42 --- /dev/null +++ b/indra/newview/skins/default/xui/pl/panel_media_settings_permissions.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Dopasuj" name="Media settings for controls"> + <text name="controls_label"> + Ustawienia: + </text> + <combo_box name="controls"> + <combo_item name="Standard"> + Standardowe + </combo_item> + <combo_item name="Mini"> + Mini + </combo_item> + </combo_box> + <check_box initial_value="false" label="Pozwól na nawigacjÄ™ & interaktywność" name="perms_owner_interact"/> + <check_box initial_value="false" label="Pokaż Pasek Kontroli" name="perms_owner_control"/> + <check_box initial_value="false" label="Pozwól na nawigacjÄ™ & Interaktywność" name="perms_group_interact"/> + <check_box initial_value="false" label="Pokaż Pasek Kontroli" name="perms_group_control"/> + <check_box initial_value="false" label="Pozwól na nawigacjÄ™ & interaktywność" name="perms_anyone_interact"/> + <check_box initial_value="false" label="Pokaż Pasek Kontroli" name="perms_anyone_control"/> +</panel> diff --git a/indra/newview/skins/default/xui/pl/panel_media_settings_security.xml b/indra/newview/skins/default/xui/pl/panel_media_settings_security.xml new file mode 100644 index 0000000000..da3142b54e --- /dev/null +++ b/indra/newview/skins/default/xui/pl/panel_media_settings_security.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Ochrona" name="Media Settings Security"> + <check_box initial_value="false" label="DostÄ™p dozwolony tylko dla wybranych URL" name="whitelist_enable"/> + <text name="home_url_fails_some_items_in_whitelist"> + WejÅ›cia na stronÄ™ WWW, które siÄ™ nie powiodÅ‚y sÄ… zaznaczone: + </text> + <button label="Dodaj" name="whitelist_add"/> + <button label="UsuÅ„" name="whitelist_del"/> + <text name="home_url_fails_whitelist"> + UWAGA: WWW wyszczególnione w Ogólne nie przeszÅ‚y BiaÅ‚ej Listy. ZostaÅ‚a ona wyłączona dopóki poprawny zapis nie zostanie dodany. + </text> +</panel> diff --git a/indra/newview/skins/default/xui/pl/panel_my_profile.xml b/indra/newview/skins/default/xui/pl/panel_my_profile.xml new file mode 100644 index 0000000000..7ca762b825 --- /dev/null +++ b/indra/newview/skins/default/xui/pl/panel_my_profile.xml @@ -0,0 +1,35 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Profil" name="panel_profile"> + <string name="no_partner_text" value="Å»adne"/> + <string name="no_group_text" value="Å»adne"/> + <string name="RegisterDateFormat"> + [REG_DATE] ([AGE]) + </string> + <layout_stack name="layout"> + <layout_panel name="profile_stack"> + <scroll_container name="profile_scroll"> + <panel name="scroll_content_panel"> + <panel name="second_life_image_panel"> + <icon label="" name="2nd_life_edit_icon" tool_tip="Kliknij przycisk Edytuj Profil by zmienić zdjÄ™cie"/> + <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/> + </panel> + <panel name="first_life_image_panel"> + <icon label="" name="real_world_edit_icon" tool_tip="Kliknij przycisk Edytuj Profil by zmienić zdjÄ™cie"/> + <text name="title_rw_descr_text" value="Å»ycie#1:"/> + </panel> + <text name="title_member_text" value="Urodziny:"/> + <text name="title_acc_status_text" value="Konto:"/> + <text name="title_partner_text" value="Partner:"/> + <panel name="partner_data_panel"> + <name_box initial_value="(przetwarzanie)" name="partner_text"/> + </panel> + <text name="title_groups_text" value="Grupy:"/> + </panel> + </scroll_container> + </layout_panel> + <layout_panel name="profile_me_buttons_panel"> + <button label="Edytuj Profil" name="edit_profile_btn" tool_tip="Edytuj swoje dane"/> + <button label="Edytuj WyglÄ…d" name="edit_appearance_btn" tool_tip="Stwórz/edytuj swój wyglÄ…d: dane fizyczne, ubrania itp."/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/default/xui/pl/panel_navigation_bar.xml b/indra/newview/skins/default/xui/pl/panel_navigation_bar.xml new file mode 100644 index 0000000000..b01e686c41 --- /dev/null +++ b/indra/newview/skins/default/xui/pl/panel_navigation_bar.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="navigation_bar"> + <panel name="navigation_panel"> + <pull_button name="back_btn" tool_tip="Wróć do poprzedniej lokalizacji"/> + <pull_button name="forward_btn" tool_tip="Idź do nastÄ™pnej lokalizacji"/> + <button name="home_btn" tool_tip="Teleportuj do miejsca startu"/> + <location_input label="Lokalizacja" name="location_combo"/> + <search_combo_box label="Szukaj" name="search_combo_box" tool_tip="Szukaj"> + <combo_editor label="Szukaj [SECOND_LIFE]" name="search_combo_editor"/> + </search_combo_box> + </panel> + <favorites_bar name="favorite" tool_tip="PrzeciÄ…gnij swoje landmarki tutaj by szybko dostać siÄ™ do swoich ulubionych miejsc w Second Life!"> + <label name="favorites_bar_label" tool_tip="PrzeciÄ…gnij swoje landmarki tutaj by szybko dostać siÄ™ do swoich ulubionych miejsc w Second Life!"> + Pasek Ulubionych + </label> + <chevron_button name=">>" tool_tip="Pokaż wiÄ™cej Moich Ulubionych"/> + </favorites_bar> +</panel> diff --git a/indra/newview/skins/default/xui/pl/panel_nearby_chat.xml b/indra/newview/skins/default/xui/pl/panel_nearby_chat.xml new file mode 100644 index 0000000000..bcecaeabb3 --- /dev/null +++ b/indra/newview/skins/default/xui/pl/panel_nearby_chat.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- All our XML is utf-8 encoded. --> +<panel name="nearby_chat"> + <panel name="chat_caption"> + <text name="sender_name"> + CZAT LOKALNY + </text> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/pl/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/pl/panel_nearby_chat_bar.xml new file mode 100644 index 0000000000..2d1decd960 --- /dev/null +++ b/indra/newview/skins/default/xui/pl/panel_nearby_chat_bar.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="chat_bar"> + <string name="min_width"> + 192 + </string> + <string name="max_width"> + 320 + </string> + <line_editor label="Kliknij tutaj aby rozmawiać." name="chat_box" tool_tip="NaciÅ›nij Enter aby mówić, Ctrl + Enter aby krzyknąć"/> + <button name="show_nearby_chat" tool_tip="Pokazuje/ukrywa pobliski Czat"/> +</panel> diff --git a/indra/newview/skins/default/xui/pl/panel_nearby_media.xml b/indra/newview/skins/default/xui/pl/panel_nearby_media.xml new file mode 100644 index 0000000000..a05c0d856f --- /dev/null +++ b/indra/newview/skins/default/xui/pl/panel_nearby_media.xml @@ -0,0 +1,67 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="nearby_media"> + <string name="empty_item_text"> + <empty> + </string> + <string name="parcel_media_name"> + StrumieÅ„ Mediów PosiadÅ‚oÅ›ci + </string> + <string name="parcel_audio_name"> + StrumieÅ„ Audio PosiadÅ‚oÅ›ci + </string> + <string name="playing_suffix"> + (odtwarzanie) + </string> + <panel name="minimized_controls"> + <button label="Zatrzymaj" name="all_nearby_media_disable_btn" tool_tip="Wyłącz wszystkie media w pobliżu"/> + <button label="Włącz" name="all_nearby_media_enable_btn" tool_tip="Włącz wszystkie media w pobliżu"/> + <button name="open_prefs_btn" tool_tip="Uruchom preferencje medialne"/> + <button label="WiÄ™cej >>" label_selected="Mniej <<" name="more_less_btn" tool_tip="Zaawansowane"/> + </panel> + <panel name="nearby_media_panel"> + <text name="nearby_media"> + Media w pobliżu + </text> + <text name="show"> + Pokaż: + </text> + <combo_box name="show_combo"> + <combo_box.item label="Wszystkie" name="All"/> + <combo_box.item label="Na obecnej Parceli" name="WithinParcel"/> + <combo_box.item label="Poza PosiadÅ‚oÅ›ciÄ…" name="OutsideParcel"/> + <combo_box.item label="Na innych awatarach" name="OnOthers"/> + </combo_box> + <scroll_list name="media_list"> + <scroll_list.columns label="DokÅ‚adność" name="media_proximity"/> + <scroll_list.columns label="Widoczność" name="media_visibility"/> + <scroll_list.columns label="Klasa" name="media_class"/> + <scroll_list.columns label="Nazwa" name="media_name"/> + <scroll_list.columns label="Debugowanie" name="media_debug"/> + </scroll_list> + <panel name="media_controls_panel"> + <layout_stack name="media_controls"> + <layout_panel name="stop"> + <button name="stop_btn" tool_tip="Zatrzymaj wybrane media"/> + </layout_panel> + <layout_panel name="play"> + <button name="play_btn" tool_tip="Odtwarzaj wybrane media"/> + </layout_panel> + <layout_panel name="pause"> + <button name="pause_btn" tool_tip="Zatrzymaj wybrane media"/> + </layout_panel> + <layout_panel name="volume_slider_ctrl"> + <slider_bar initial_value="0.5" name="volume_slider" tool_tip="Regulacja audio dla wybranych mediów"/> + </layout_panel> + <layout_panel name="mute"> + <button name="mute_btn" tool_tip="Wycisz audio wybranych mediów"/> + </layout_panel> + <layout_panel name="zoom"> + <button name="zoom_btn" tool_tip="Przybliż do wybranych mediów"/> + </layout_panel> + <layout_panel name="unzoom"> + <button name="unzoom_btn" tool_tip="Oddal od wybranych mediów"/> + </layout_panel> + </layout_stack> + </panel> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/pl/panel_notes.xml b/indra/newview/skins/default/xui/pl/panel_notes.xml new file mode 100644 index 0000000000..35cb7e1bce --- /dev/null +++ b/indra/newview/skins/default/xui/pl/panel_notes.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Notatki & Prywatność" name="panel_notes"> + <layout_stack name="layout"> + <panel name="notes_stack"> + <scroll_container name="profile_scroll"> + <panel name="profile_scroll_panel"> + <text name="status_message" value="Notatki:"/> + <text name="status_message2" value="Pozwól tej osobie na:"/> + <check_box label="Widzenie mojego statusu" name="status_check"/> + <check_box label="Lokalizowanie mnie na mapie" name="map_check"/> + <check_box label="Edytowanie, kasowanie lub zabieranie moich obiektów" name="objects_check"/> + </panel> + </scroll_container> + </panel> + <panel name="notes_buttons_panel"> + <button label="Dodaj do znajomych" name="add_friend" tool_tip="Zaoferuj znajomość Rezydentowi"/> + <button label="IM" name="im" tool_tip="Otwórz wiadomoÅ›ci IM"/> + <button label="DzwoÅ„" name="call" tool_tip="ZadzwoÅ„ do Rezydenta"/> + <button label="Mapa" name="show_on_map_btn" tool_tip="Pokaż Rezydenta na mapie"/> + <button label="Teleportuj" name="teleport" tool_tip="Teleportuj"/> + </panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/default/xui/pl/panel_online_status.xml b/indra/newview/skins/default/xui/pl/panel_online_status.xml new file mode 100644 index 0000000000..fdc489f375 --- /dev/null +++ b/indra/newview/skins/default/xui/pl/panel_online_status.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="friend_online_status" name="friend_online_status"/> diff --git a/indra/newview/skins/default/xui/pl/panel_online_status_toast.xml b/indra/newview/skins/default/xui/pl/panel_online_status_toast.xml new file mode 100644 index 0000000000..fdc489f375 --- /dev/null +++ b/indra/newview/skins/default/xui/pl/panel_online_status_toast.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="friend_online_status" name="friend_online_status"/> diff --git a/indra/newview/skins/default/xui/pl/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/pl/panel_outfits_inventory.xml new file mode 100644 index 0000000000..5e7fd46754 --- /dev/null +++ b/indra/newview/skins/default/xui/pl/panel_outfits_inventory.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Rzeczy" name="Outfits"> + <tab_container name="appearance_tabs"> + <inventory_panel label="MOJE UBRANIA" name="outfitslist_tab"/> + <inventory_panel label="ZAÅOÅ»ONE" name="cof_tab"/> + </tab_container> + <panel name="bottom_panel"> + <button name="options_gear_btn" tool_tip="Pokaż opcje dodatkowe"/> + <dnd_button name="trash_btn" tool_tip="UsuÅ„ zaznaczony obiekt"/> + <button label="Zapisz Ubranie" name="make_outfit_btn" tool_tip="Zapisz wyglÄ…d jako ubranie"/> + <button label="Ubierz" name="wear_btn" tool_tip="Ubierz wybrany obiekt"/> + <button label="M" name="look_edit_btn"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/pl/panel_outfits_inventory_gear_default.xml b/indra/newview/skins/default/xui/pl/panel_outfits_inventory_gear_default.xml new file mode 100644 index 0000000000..5b77c390ca --- /dev/null +++ b/indra/newview/skins/default/xui/pl/panel_outfits_inventory_gear_default.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_gear_default"> + <menu_item_call label="ZastÄ…p Obecne Ubranie" name="wear"/> + <menu_item_call label="Dodaj do Obecnego Ubrania" name="add"/> + <menu_item_call label="UsuÅ„ z Obecnego Ubrania" name="remove"/> + <menu_item_call label="ZmieÅ„ nazwÄ™" name="rename"/> + <menu_item_call label="UsuÅ„ Link" name="remove_link"/> + <menu_item_call label="UsuÅ„ Ubranie" name="delete"/> +</menu> diff --git a/indra/newview/skins/default/xui/pl/panel_people.xml b/indra/newview/skins/default/xui/pl/panel_people.xml new file mode 100644 index 0000000000..09958c84d6 --- /dev/null +++ b/indra/newview/skins/default/xui/pl/panel_people.xml @@ -0,0 +1,59 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- Side tray panel --> +<panel label="Ludzie" name="people_panel"> + <string name="no_people" value="Brak ludzi"/> + <string name="no_one_near" value="Nikogo w pobliżu"/> + <string name="no_friends_online" value="Brak dostÄ™pnych Znajomych"/> + <string name="no_friends" value="Brak Znajomych"/> + <string name="people_filter_label" value="Filtruj Ludzi"/> + <string name="groups_filter_label" value="Filtruj Grupy"/> + <string name="no_filtered_groups_msg" value="[secondlife:///app/search/groups Może spróbuj odnaleźć GrupÄ™ korzystajÄ…c z Szukaj?]"/> + <string name="no_groups_msg" value="[secondlife:///app/search/groups Spróbuj wyszukać grupy aby do nich dołączyć.]"/> + <filter_editor label="Filtr" name="filter_input"/> + <tab_container name="tabs"> + <panel label="W POBLIÅ»U" name="nearby_panel"> + <panel label="bottom_panel" name="bottom_panel"> + <button name="nearby_view_sort_btn" tool_tip="Opcje"/> + <button name="add_friend_btn" tool_tip="Dodaj wybranego Rezydenta do Znajomych"/> + </panel> + </panel> + <panel label="ZNAJOMI" name="friends_panel"> + <accordion name="friends_accordion"> + <accordion_tab name="tab_online" title="DostÄ™pni"/> + <accordion_tab name="tab_all" title="Wszyscy"/> + </accordion> + <panel label="bottom_panel" name="bottom_panel"> + <button name="friends_viewsort_btn" tool_tip="Opcje"/> + <button name="add_btn" tool_tip="Zaproponuj znajomość"/> + <button name="del_btn" tool_tip="UsuÅ„ wybranÄ… osobÄ™ ze swojej listy znajomych"/> + </panel> + <text name="no_friends_msg"> + By dodać nowÄ… znajomość skorzystaj ze strony [secondlife:///app/search/people ogólne wyszukiwanie] lub kliknij prawym przyciskiem myszki na Rezydenta by wysÅ‚ać mu zaproszenie. +Jeżeli szukasz ludzi, z którymi można siÄ™ spotkać, kliknij tutaj [secondlife:///app/worldmap skorzystaj z mapy]. + </text> + </panel> + <panel label="GRUPY" name="groups_panel"> + <panel label="bottom_panel" name="bottom_panel"> + <button name="groups_viewsort_btn" tool_tip="Opcje"/> + <button name="plus_btn" tool_tip="Dołącz do grupy/Stwórz nowÄ… grupÄ™"/> + <button name="activate_btn" tool_tip="Aktywuj wybranÄ… grupÄ™"/> + </panel> + </panel> + <panel label="OSTATNIE" name="recent_panel"> + <panel label="bottom_panel" name="bottom_panel"> + <button name="recent_viewsort_btn" tool_tip="Opcje"/> + <button name="add_friend_btn" tool_tip="Dodaj wybranego Rezydenta do Znajomych"/> + </panel> + </panel> + </tab_container> + <panel name="button_bar"> + <button width="55" label="Profil" name="view_profile_btn" tool_tip="Pokaż zdjÄ™cie, grupy i inne informacje o Rezydencie"/> + <button width="35" label="IM" name="im_btn" tool_tip="Rozpocznij rozmowÄ™ prywatnÄ… (IM)"/> + <button width="62" label="ZadzwoÅ„" name="call_btn" tool_tip="ZadzwoÅ„ do tego Rezydenta"/> + <button width="72" label="Podziel siÄ™" name="share_btn"/> + <button width="70" label="Teleportuj" name="teleport_btn" tool_tip="Zaproponuj teleportacjÄ™"/> + <button width="69" label="Profil grupy" name="group_info_btn" tool_tip="Pokaż informacje o grupie"/> + <button width="124" label="Konferencja Grupowa" name="chat_btn" tool_tip="Rozpocznij konferencÄ™"/> + <button width="108" label="Rozmowa GÅ‚osowa" name="group_call_btn" tool_tip="Rozmowa GÅ‚osowa w tej Grupie"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/pl/panel_pick_info.xml b/indra/newview/skins/default/xui/pl/panel_pick_info.xml new file mode 100644 index 0000000000..0454ecc430 --- /dev/null +++ b/indra/newview/skins/default/xui/pl/panel_pick_info.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_pick_info"> + <text name="title" value="Info o Ulubionych"/> + <scroll_container name="profile_scroll"> + <panel name="scroll_content_panel"> + <text name="pick_name" value="[name]"/> + <text name="pick_location" value="[loading...]"/> + <text name="pick_desc" value="[description]"/> + </panel> + </scroll_container> + <panel name="buttons"> + <button label="Teleportuj" name="teleport_btn"/> + <button label="Mapa" name="show_on_map_btn"/> + <button label="Edytuj" name="edit_btn"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/pl/panel_picks.xml b/indra/newview/skins/default/xui/pl/panel_picks.xml new file mode 100644 index 0000000000..5d69c25ff3 --- /dev/null +++ b/indra/newview/skins/default/xui/pl/panel_picks.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Ulubione" name="panel_picks"> + <string name="no_picks" value="Brak Ulubionych"/> + <string name="no_classifieds" value="Brak Reklam"/> + <text name="empty_picks_panel_text"> + Brak ulubionych/reklam w tym miejscu + </text> + <accordion name="accordion"> + <accordion_tab name="tab_picks" title="Ulubione"/> + <accordion_tab name="tab_classifieds" title="Reklamy"/> + </accordion> + <panel label="bottom_panel" name="edit_panel"> + <button name="new_btn" tool_tip="Stwórz w obecnym miejscu nowÄ… zakÅ‚adkÄ™ w ulubionych lub reklamÄ™"/> + </panel> + <panel name="buttons_cucks"> + <button label="Info" name="info_btn" tool_tip="Pokaż info o ulubionych"/> + <button label="Teleportuj" name="teleport_btn" tool_tip="Teleportuj do odpowiadajÄ…cego miejsca"/> + <button label="Mapa" name="show_on_map_btn" tool_tip="Pokaż odpowiadajÄ…ce miejsce w Mapie Åšwiata"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/pl/panel_place_profile.xml b/indra/newview/skins/default/xui/pl/panel_place_profile.xml new file mode 100644 index 0000000000..3714a141db --- /dev/null +++ b/indra/newview/skins/default/xui/pl/panel_place_profile.xml @@ -0,0 +1,111 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="place_profile"> + <string name="on" value="Włącz"/> + <string name="off" value="Wyłącz"/> + <string name="anyone" value="Każdy"/> + <string name="available" value="dostÄ™pny"/> + <string name="allocated" value="przydzielony"/> + <string name="title_place" value="Profil Miejsca"/> + <string name="title_teleport_history" value="Historia teleportacji"/> + <string name="not_available" value="(brak)"/> + <string name="unknown" value="(nieznany)"/> + <string name="public" value="(publiczny)"/> + <string name="none_text" value="(żaden)"/> + <string name="sale_pending_text" value="(Sprzedaż w Toku Realizacji)"/> + <string name="group_owned_text" value="(WÅ‚asność Grupy)"/> + <string name="price_text" value="L$"/> + <string name="area_text" value="m²"/> + <string name="all_residents_text" value="Każdemu"/> + <string name="group_text" value="Grupie"/> + <string name="can_resell"> + PosiadÅ‚ość zakupiona w tym regionie może być odsprzedana. + </string> + <string name="can_not_resell"> + PosiadÅ‚ość zakupiona w tym regionie nie może być odsprzedana. + </string> + <string name="can_change"> + PosiadÅ‚ość zakupiona w tym regionie może być łączona/dzielona. + </string> + <string name="can_not_change"> + PosiadÅ‚ość zakupiona w tym regionie nie może być łączona/dzielona. + </string> + <string name="server_update_text"> + Informacje o tym miejscu nie bÄ™dÄ… dostÄ™pne bez aktualizacji serwera. + </string> + <string name="server_error_text"> + Informacje o tym miejscu sÄ… obecnie niedostÄ™pne, spróbuj później. + </string> + <string name="server_forbidden_text"> + DostÄ™p do informacji o tym miejscu jest ograniczony. Zweryfikuj swoje przywileje z wÅ‚aÅ›cicielem posiadÅ‚oÅ›ci. + </string> + <string name="acquired_date"> + [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local] + </string> + <button name="back_btn" tool_tip="Cofnij"/> + <text name="title" value="Profil Miejsca"/> + <scroll_container name="place_scroll"> + <panel name="scrolling_panel"> + <text name="owner_label" value="WÅ‚aÅ›ciciel:"/> + <text name="maturity_value" value="nieznany"/> + <accordion name="advanced_info_accordion"> + <accordion_tab name="parcel_characteristics_tab" title="PosiadÅ‚ość"> + <panel name="parcel_characteristics_panel"> + <text name="rating_label" value="Rodzaj:"/> + <text name="rating_value" value="nieznane"/> + <text name="voice_label" value="Komunikacja GÅ‚osowa:"/> + <text name="voice_value" value="Włączone"/> + <text name="fly_label" value="Lataj:"/> + <text name="fly_value" value="Włączone"/> + <text name="push_label" value="PopchniÄ™cia:"/> + <text name="push_value" value="Wyłączone"/> + <text name="build_label" value="Budowanie:"/> + <text name="build_value" value="Włączone"/> + <text name="scripts_label" value="Skrypty:"/> + <text name="scripts_value" value="Włączone"/> + <text name="damage_label" value="Zniszczenia:"/> + <text name="damage_value" value="Wyłączone"/> + <button label="O PosiadÅ‚oÅ›ci" name="about_land_btn"/> + </panel> + </accordion_tab> + <accordion_tab name="region_information_tab" title="Region"> + <panel name="region_information_panel"> + <text name="region_name_label" value="Region:"/> + <text name="region_name" value="Mooseland"/> + <text name="region_type_label" value="Typ:"/> + <text name="region_type" value="Moose"/> + <text name="region_rating_label" value="Rodzaj:"/> + <text name="region_rating" value="Adult"/> + <text name="region_owner_label" value="WÅ‚aÅ›ciciel:"/> + <text name="region_owner" value="moose Van Moose"/> + <text name="region_group_label" value="Grupa:"/> + <text name="region_group"> + The Mighty Moose of mooseville soundvillemoose + </text> + <button label="Region/MajÄ…tek" name="region_info_btn"/> + </panel> + </accordion_tab> + <accordion_tab name="estate_information_tab" title="MajÄ…tek"> + <panel name="estate_information_panel"> + <text name="estate_name_label" value="MajÄ…tek:"/> + <text name="estate_rating_label" value="Rodzaj:"/> + <text name="estate_owner_label" value="WÅ‚aÅ›ciciel:"/> + <text name="covenant_label" value="Umowa:"/> + </panel> + </accordion_tab> + <accordion_tab name="sales_tab" title="Na Sprzedaż"> + <panel name="sales_panel"> + <text name="sales_price_label" value="Cena:"/> + <text name="area_label" value="Powierzchnia:"/> + <text name="traffic_label" value="Ruch:"/> + <text name="primitives_label" value="Primy:"/> + <text name="parcel_scripts_label" value="Skrypty:"/> + <text name="terraform_limits_label" value="Ograniczenia terraformingu:"/> + <text name="subdivide_label" value="Podziel/Złącz:"/> + <text name="resale_label" value="Możliwość sprzedaży:"/> + <text name="sale_to_label" value="Na sprzedaż:"/> + </panel> + </accordion_tab> + </accordion> + </panel> + </scroll_container> +</panel> diff --git a/indra/newview/skins/default/xui/pl/panel_places.xml b/indra/newview/skins/default/xui/pl/panel_places.xml new file mode 100644 index 0000000000..c7f3f00d98 --- /dev/null +++ b/indra/newview/skins/default/xui/pl/panel_places.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Miejsca" name="places panel"> + <string name="landmarks_tab_title" value="MOJE LANDMARKI"/> + <string name="teleport_history_tab_title" value="HISTORIA TELEPORTÓW"/> + <filter_editor label="Filtruj Moje Miejsca" name="Filter"/> + <panel name="button_panel"> + <button label="Teleportuj" name="teleport_btn" tool_tip="Teleportuj do wybranego miejsca"/> + <button label="Mapa" name="map_btn"/> + <button label="Edytuj" name="edit_btn" tool_tip="Edytuj informacje landmarka"/> + <button label="â–¼" name="overflow_btn" tool_tip="Pokaż opcje dodatkowe"/> + <button label="Zamknij" name="close_btn"/> + <button label="Anuluj" name="cancel_btn"/> + <button label="Zapisz" name="save_btn"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/pl/panel_preferences_advanced.xml index c3bd66274b..9905bbbc18 100644 --- a/indra/newview/skins/default/xui/pl/panel_preferences_advanced.xml +++ b/indra/newview/skins/default/xui/pl/panel_preferences_advanced.xml @@ -1,48 +1,32 @@ <?xml version="1.0" encoding="utf-8"?> -<panel name="advanced"> - <panel.string name="resolution_format"> - [RES_X] x [RES_Y] - </panel.string> +<panel label="Zaawansowane" name="advanced"> <panel.string name="aspect_ratio_text"> [NUM]:[DEN] </panel.string> - <check_box label="Czat Chmurkowy" name="bubble_text_chat"/> - <color_swatch name="background" tool_tip="Wybierz kolor czatu w chmurce"/> - <slider label="Intensywność" name="bubble_chat_opacity"/> - <text name="AspectRatioLabel1" tool_tip="width / height"> - Proporcje - </text> - <combo_box name="aspect_ratio" tool_tip="width / height"> - <combo_box.item label="4:3 (Standardowy CRT)" name="item1"/> - <combo_box.item label="5:4 (1280x1024 LCD)" name="item2"/> - <combo_box.item label="8:5 (Panoramiczny)" name="item3"/> - <combo_box.item label="16:9 (Panoramiczny)" name="item4"/> - </combo_box> - <check_box label="Automatyczne Wykrywanie" name="aspect_auto_detect"/> - <text name="heading1"> - Kamery: - </text> - <slider label="KÄ…t Widoku" name="camera_fov"/> + <panel.string name="middle_mouse"> + Åšrodkowy klawisz myszki + </panel.string> + <slider label="KÄ…t widoku" name="camera_fov"/> <slider label="OdlegÅ‚ość" name="camera_offset_scale"/> <text name="heading2"> - Automatyczne pozycjonowanie dla: + Automatyczna pozycja dla: </text> <check_box label="Buduj/Edytuj" name="edit_camera_movement" tool_tip="Używaj automatycznego pozycjonowania kamery aktywujÄ…c i deaktywujÄ…c tryb edycji"/> <check_box label="WyglÄ…d" name="appearance_camera_movement" tool_tip="Używaj automatycznego pozycjonowania kamery podczas trybu edycji"/> - <text name="heading3"> - Awatary: - </text> <check_box label="Pokaż w trybie widoku panoramicznego" name="first_person_avatar_visible"/> <check_box label="Aktywacja klawiszy strzaÅ‚ek do poruszania awatarem" name="arrow_keys_move_avatar_check"/> <check_box label="kliknij-kliknij-przytrzymaj, aby uruchomić" name="tap_tap_hold_to_run"/> <check_box label="Poruszaj ustami awatara kiedy używana jest komunikacja gÅ‚osowa" name="enable_lip_sync"/> - <check_box label="Pokaż błędy skryptów" name="show_script_errors"/> + <check_box label="Czat Chmurkowy" name="bubble_text_chat"/> + <slider label="Intensywność" name="bubble_chat_opacity"/> + <color_swatch name="background" tool_tip="Wybierz kolor czatu w chmurce"/> + <check_box label="Pokaż błędy skryptu w:" name="show_script_errors"/> <radio_group name="show_location"> - <radio_item label="W czacie" name="0"/> - <radio_item label="W oknie" name="1"/> + <radio_item label="Czat Lokalny" name="0"/> + <radio_item label="Osobne okno:" name="1"/> </radio_group> - <check_box label="Uruchom tryb mówienia przez mikrofon podczas nasiÅ›niÄ™cia przycisku Mów:" name="push_to_talk_toggle_check" tool_tip="Jeżeli jesteÅ› w trybie mówienia, w celu aktywacji lub deaktywacji swojego mikrofonu wybierz i wyłącz przycisk Mów tylko raz. Jeżeli nie jesteÅ› w trybie mówienia, mikrofon przesyÅ‚a Twój gÅ‚os tylko w momencie aktywacji peÅ‚nej przycisku Mów."/> + <check_box label="Włącz/Wyłącz gÅ‚os:" name="push_to_talk_toggle_check" tool_tip="Jeżeli jesteÅ› w trybie mówienia, w celu aktywacji lub deaktywacji swojego mikrofonu wybierz i wyłącz przycisk Mów tylko raz. Jeżeli nie jesteÅ› w trybie mówienia, mikrofon przesyÅ‚a Twój gÅ‚os tylko w momencie aktywacji peÅ‚nej przycisku Mów."/> <line_editor label="NaciÅ›nij Mów by rozpocząć komunikacjÄ™ gÅ‚osowÄ…" name="modifier_combo"/> <button label="wybierz Klawisz" name="set_voice_hotkey_button"/> - <button label="Åšrodkowy Przycisk Myszki" name="set_voice_middlemouse_button"/> + <button label="Åšrodkowy Przycisk Myszki" name="set_voice_middlemouse_button" tool_tip="Zresetuj do Å›rodkowego przycisku myszy"/> </panel> diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_alerts.xml b/indra/newview/skins/default/xui/pl/panel_preferences_alerts.xml index 7195c30f20..e843342aa2 100755..100644 --- a/indra/newview/skins/default/xui/pl/panel_preferences_alerts.xml +++ b/indra/newview/skins/default/xui/pl/panel_preferences_alerts.xml @@ -4,11 +4,11 @@ Powiadom mnie: </text> <check_box label="Kiedy wydajÄ™ lub otrzymujÄ™ L$" name="notify_money_change_checkbox"/> - <check_box label="Kiedy moi znajomi siÄ™ logujÄ… lub wylogowujÄ…" name="friends_online_notify_checkbox"/> + <check_box label="Kiedy moi Znajomi zalogowujÄ… siÄ™ i wylogowujÄ…" name="friends_online_notify_checkbox"/> <text name="show_label"> - Zawsze pokazuj te powiadomienia: + Zawsze pokazuj: </text> <text name="dont_show_label"> - Nigdy nie pokazuj tych powiadomieÅ„: + Nie pokazuj: </text> </panel> diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml b/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml index 5599c21686..ae13cf662f 100755..100644 --- a/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml @@ -1,10 +1,16 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Czat/IM" name="chat"> + <text name="font_size"> + Rozmiar czcionki: + </text> <radio_group name="chat_font_size"> - <radio_item label="MaÅ‚a" name="radio"/> - <radio_item label="Åšrednia" name="radio2"/> - <radio_item label="Duża" name="radio3"/> + <radio_item label="MaÅ‚a" name="radio" value="0"/> + <radio_item label="Åšrednia" name="radio2" value="1"/> + <radio_item label="Duża" name="radio3" value="2"/> </radio_group> + <text name="font_colors"> + Kolor czcionki: + </text> <color_swatch label="Ty" name="user"/> <text name="text_box1"> Ja @@ -39,4 +45,14 @@ </text> <check_box initial_value="true" label="Używaj animacji podczas pisania" name="play_typing_animation"/> <check_box label="WysyÅ‚aj wszystkie wiadomoÅ›ci (IM) na mojÄ… skrzynkÄ™ pocztowÄ… kiedy jestem niedostÄ™pny" name="send_im_to_email"/> + <text name="show_ims_in_label"> + Pokaż wiadomoÅ›ci (IM) w: + </text> + <text name="requires_restart_label"> + (restart wymagany) + </text> + <radio_group name="chat_window" tool_tip="Pokaż wiadomoÅ›ci IM osobno lub razem (restart wymagany)"> + <radio_item label="Osobne okna" name="radio" value="0"/> + <radio_item label="Etykiety" name="radio2" value="1"/> + </radio_group> </panel> diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_general.xml b/indra/newview/skins/default/xui/pl/panel_preferences_general.xml index 97b4975f29..e7134f23c3 100755..100644 --- a/indra/newview/skins/default/xui/pl/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/pl/panel_preferences_general.xml @@ -1,91 +1,67 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Ogólne" name="general_panel"> - <combo_box name="start_location_combo"> - <combo_box.item name="MyHome" tool_tip="DomyÅ›lnie loguj mnie do mojego miejsca startu." label="Mój Start"/> - <combo_box.item name="MyLastLocation" tool_tip="DomyÅ›lnie loguj mnie do ostatnio odwiedzonego miejsca." label="Ostatnie Miejsce"/> - </combo_box> - <check_box label="Pokaż Miejsce Startu podczas Logowania" name="show_location_checkbox"/> - <combo_box name="fade_out_combobox"> - <combo_box.item name="Never" label="Nigdy"/> - <combo_box.item name="Show Temporarily" label="Tymczasowo"/> - <combo_box.item name="Always" label="Zawsze"/> - </combo_box> - <check_box label="Używaj MaÅ‚ych Imion Awatarów" name="small_avatar_names_checkbox"/> - <check_box label="Nie WyÅ›wietlaj Mojego Imienia" name="show_my_name_checkbox"/> - <text name="group_titles_textbox"> - TytuÅ‚y Grupowe: - </text> - <check_box label="Nie WyÅ›wietlaj Å»adnych Tytułów Grupowych" name="show_all_title_checkbox"/> - <check_box label="Nie WyÅ›wietlaj Mojego TytuÅ‚u Grupowego" name="show_my_title_checkbox"/> - <color_swatch label="" name="effect_color_swatch" tool_tip="Selekcja koloru"/> - <text name="UI Size:"> - Wymiar Interfejsu (UI): + <text name="language_textbox"> + JÄ™zyk: </text> - <slider name="ui_scale_slider"/> - <check_box label="Używaj Skali Nizależnej od RozdzielczoÅ›ci" name="ui_auto_scale"/> - <spinner label="Zasypiaj w:" name="afk_timeout_spinner"/> - <check_box label="Powiadamiaj o Wydatkach i Zarobkach (L$)" name="notify_money_change_checkbox"/> - <text name="maturity_desired_label"> - Treść: + <combo_box name="language_combobox"> + <combo_box.item label="DomyÅ›lny" name="System Default Language"/> + <combo_box.item label="English (Angielski)" name="English"/> + <combo_box.item label="Dansk (DuÅ„ski) - Beta" name="Danish"/> + <combo_box.item label="Deutsch (Niemiecki) - Beta" name="Deutsch(German)"/> + <combo_box.item label="Español (HiszpaÅ„ski) - Beta" name="Spanish"/> + <combo_box.item label="Français (Francuski) - Beta" name="French"/> + <combo_box.item label="Italiano (WÅ‚oski) - Beta" name="Italian"/> + <combo_box.item label="Nederlands (Niderlandzki) - Beta" name="Dutch"/> + <combo_box.item label="Polski - Beta" name="Polish"/> + <combo_box.item label="Portugués (Portugalski) - Beta" name="Portugese"/> + <combo_box.item label="日本語 (JapoÅ„ski) - Beta" name="(Japanese)"/> + </combo_box> + <text name="language_textbox2"> + (Restart wymagany) </text> <text name="maturity_desired_prompt"> ChcÄ™ uzyskać dostÄ™p do miejsc zakwalifikowanych jako: </text> + <text name="maturity_desired_textbox"/> <combo_box name="maturity_desired_combobox"> - <combo_box.item name="Desired_Adult" label="'PG', 'Mature' oraz 'Adult'"/> - <combo_box.item name="Desired_Mature" label="'PG' i 'Mature'"/> - <combo_box.item name="Desired_PG" label="'PG'"/> + <combo_box.item label="'PG', 'Mature' oraz 'Adult'" name="Desired_Adult"/> + <combo_box.item label="'PG' i 'Mature'" name="Desired_Mature"/> + <combo_box.item label="'PG'" name="Desired_PG"/> </combo_box> - <text name="maturity_desired_textbox"> - 'PG' - </text> <text name="start_location_textbox"> Miejsce Startu: </text> - <text name="show_names_textbox"> + <combo_box name="start_location_combo"> + <combo_box.item label="Ostatnie Miejsce" name="MyLastLocation" tool_tip="DomyÅ›lnie loguj mnie do ostatnio odwiedzonego miejsca."/> + <combo_box.item label="Mój Start" name="MyHome" tool_tip="DomyÅ›lnie loguj mnie do mojego miejsca startu."/> + </combo_box> + <check_box initial_value="true" label="Pokaż przy zalogowaniu" name="show_location_checkbox"/> + <text name="name_tags_textbox"> Imiona: </text> + <radio_group name="Name_Tag_Preference"> + <radio_item label="Wyłącz" name="radio" value="0"/> + <radio_item label="Włącz" name="radio2" value="1"/> + <radio_item label="Pokaż w skrócie" name="radio3" value="2"/> + </radio_group> + <check_box label="WyÅ›wietl moje imiÄ™:" name="show_my_name_checkbox1"/> + <check_box initial_value="true" label="Używaj MaÅ‚ych Imion Awatarów" name="small_avatar_names_checkbox"/> + <check_box label="WyÅ›wietl TytuÅ‚ Grupowy" name="show_all_title_checkbox1"/> <text name="effects_color_textbox"> - Kolor dla Moich Efektów: - </text> - <text name="seconds_textbox"> - sekund - </text> - <text name="crash_report_textbox"> - ZgÅ‚aszanie Błędów: - </text> - <text name="language_textbox"> - JÄ™zyk: + Kolor moich efektów: </text> - <text name="language_textbox2"> - (Restart wymagany) + <text name="title_afk_text"> + Zasypiaj w czasie: </text> - <string name="region_name_prompt"> - <Wpisz Region> - </string> - <combo_box name="crash_behavior_combobox"> - <combo_box.item name="Askbeforesending" label="Pytaj przed wysÅ‚aniem"/> - <combo_box.item name="Alwayssend" label="Zawsze wysyÅ‚aj"/> - <combo_box.item name="Neversend" label="Nigdy nie wysyÅ‚aj"/> - </combo_box> - <combo_box name="language_combobox"> - <combo_box.item name="System Default Language" label="DomyÅ›lny"/> - <combo_box.item name="English" label="English (Angielski)"/> - <combo_box.item name="Danish" label="Dansk (DuÅ„ski) - Beta"/> - <combo_box.item name="Deutsch(German)" label="Deutsch (Niemiecki) - Beta"/> - <combo_box.item name="Spanish" label="Español (HiszpaÅ„ski) - Beta"/> - <combo_box.item name="French" label="Français (Francuski) - Beta"/> - <combo_box.item name="Italian" label="Italiano (WÅ‚oski) - Beta"/> - <combo_box.item name="Hungarian" label="Magyar (WÄ™gierski) - Beta"/> - <combo_box.item name="Dutch" label="Nederlands (Niderlandzki) - Beta"/> - <combo_box.item name="Polish" label="Polski - Beta"/> - <combo_box.item name="Portugese" label="Portugués (Portugalski) - Beta"/> - <combo_box.item name="Russian" label="РуÑÑкий (Rosyjski) - Beta"/> - <combo_box.item name="Turkish" label="Türkçe (Turecki) - Beta"/> - <combo_box.item name="Ukrainian" label="УкраїнÑька (UkraiÅ„ski) - Beta"/> - <combo_box.item name="Chinese" label="䏿–‡ (简体) (ChiÅ„ski) - Beta"/> - <combo_box.item name="(Japanese)" label="日本語 (JapoÅ„ski) - Beta"/> - <combo_box.item name="(Korean)" label="한êµì–´ (KoreaÅ„ski) - Beta"/> + <color_swatch label="" name="effect_color_swatch" tool_tip="Selekcja koloru"/> + <combo_box label="Czas Trybu Oddalenia:" name="afk"> + <combo_box.item label="2 minuty" name="item0"/> + <combo_box.item label="5 minut" name="item1"/> + <combo_box.item label="10 minut" name="item2"/> + <combo_box.item label="30 minut" name="item3"/> + <combo_box.item label="nigdy" name="item4"/> </combo_box> - <check_box label="JÄ™zyk znany publicznie" name="language_is_public" tool_tip="Pozwala obiektom w Å›wiecie poznać Twój wybór jÄ™zyk."/> + <text name="text_box3"> + Odpowiedź w trybie pracy: + </text> </panel> diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/pl/panel_preferences_graphics1.xml index ddd4c736d6..bc08e025dd 100755..100644 --- a/indra/newview/skins/default/xui/pl/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/pl/panel_preferences_graphics1.xml @@ -1,42 +1,18 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Grafika" name="Display panel"> - <button label="?" name="GraphicsPreferencesHelpButton" /> - <check_box label="Uruchom Second Life w oknie" name="windowed mode" /> - <text_editor name="FullScreenInfo"> - Wyłączone = klient uruchamiany w trybie peÅ‚noekranowym. - </text_editor> - <text name="WindowSizeLabel"> - Wymiary Okna: + <text name="UI Size:"> + UI rozmiar: </text> - <combo_box name="windowsize combo"> - <combo_box.item name="640x480" label="640x480" /> - <combo_box.item name="800x600" label="800x600" /> - <combo_box.item name="720x480" label="720x480 (NTSC)" /> - <combo_box.item name="768x576" label="768x576 (PAL)" /> - <combo_box.item name="1024x768" label="1024x768" /> - </combo_box> - <text name="DisplayResLabel"> - Rozdzielczość: - </text> - <text name="AspectRatioLabel1" tool_tip="width / height"> - Proporcje: - </text> - <combo_box name="aspect_ratio" tool_tip="width / height"> - <combo_box.item name="4:3(StandardCRT)" label="4:3 (Standardowy CRT)" /> - <combo_box.item name="5:4(1280x1024LCD)" label="5:4 (1280x1024 LCD)" /> - <combo_box.item name="8:5(Widescreen)" label="8:5 (Panoramiczny)" /> - <combo_box.item name="16:9(Widescreen)" label="16:9 (Panoramiczny)" /> - </combo_box> - <check_box label="Detekcja proporcji" name="aspect_auto_detect" /> - <text name="HigherText"> - Jakość i - </text> - <text name="QualityText"> - PrÄ™dkość: + <text name="QualitySpeed"> + Jakość i prÄ™dkość: </text> <text name="FasterText"> PrÄ™dkość </text> + <text name="BetterText"> + Lepiej + </text> + <slider label="" name="QualityPerformanceSelection"/> <text name="ShadersPrefText"> Niska </text> @@ -49,99 +25,82 @@ <text name="ShadersPrefText4"> Super </text> - <text name="HigherText2"> - Wyższa - </text> - <text name="QualityText2"> - Jakość - </text> - <slider label="" name="QualityPerformanceSelection" /> - <check_box label="Zaawansowane" name="CustomSettings" /> - <panel name="CustomGraphics Panel"> - <text name="ShadersText"> - Shadery: - </text> - <check_box label="Mapowanie WypukÅ‚oÅ›ci i PoÅ‚ysk" name="BumpShiny" /> - <check_box label="Podstawowe Shadery" name="BasicShaders" - tool_tip="Wyłączenie tej opcji może naprawić błędy niektórych sterowników graficznych." /> - <check_box label="Shadery Atmosfery" name="WindLightUseAtmosShaders" /> - <check_box label="Odbicia w Wodzie" name="Reflections" /> - <text name="ReflectionDetailText"> - Ustawienia Odbić: - </text> - <radio_group name="ReflectionDetailRadio"> - <radio_item name="0" label="Teren i Drzewa" /> - <radio_item name="1" label="Obiekty Statyczne" /> - <radio_item name="2" label="Awatary i Obiekty" /> - <radio_item name="3" label="Wszystko" /> - </radio_group> - <text name="AvatarRenderingText"> - Prezentacja Awatarów: - </text> - <check_box label="Impostoryzacja Awatarowa" name="AvatarImpostors" /> - <check_box label="Skinning" name="AvatarVertexProgram" /> - <check_box label="Ubranie Awatarów" name="AvatarCloth" /> - <text name="DrawDistanceMeterText1"> - m - </text> - <text name="DrawDistanceMeterText2"> - m - </text> - <slider label="Głębia Rysowania:" name="DrawDistance" /> - <slider label="Liczba CzÄ…steczek:" name="MaxParticleCount" /> - <slider label="Jakość Post-Procesu:" name="RenderPostProcess" /> - <text name="MeshDetailText"> - Szczegóły Meszu: - </text> - <slider label=" Obiekty:" name="ObjectMeshDetail" /> - <slider label=" Elastyczne:" name="FlexibleMeshDetail" /> - <slider label=" Drzewa:" name="TreeMeshDetail" /> - <slider label=" Awatary:" name="AvatarMeshDetail" /> - <slider label=" Teren:" name="TerrainMeshDetail" /> - <slider label=" Niebo:" name="SkyMeshDetail" /> - <text name="PostProcessText"> - MaÅ‚o - </text> - <text name="ObjectMeshDetailText"> - MaÅ‚o - </text> - <text name="FlexibleMeshDetailText"> - MaÅ‚o - </text> - <text name="TreeMeshDetailText"> - MaÅ‚o - </text> - <text name="AvatarMeshDetailText"> - MaÅ‚o - </text> - <text name="TerrainMeshDetailText"> - MaÅ‚o - </text> - <text name="SkyMeshDetailText"> - MaÅ‚o - </text> - <text name="LightingDetailText"> - Ustawienia ÅšwiatÅ‚a: - </text> - <radio_group name="LightingDetailRadio"> - <radio_item name="SunMoon" label="Tylko SÅ‚oÅ„ce i Księżyc" /> - <radio_item name="LocalLights" label="Tylko Bliskie ÅšwiatÅ‚a" /> - </radio_group> - <text name="TerrainDetailText"> - Szczgóły Terenu: - </text> - <radio_group name="TerrainDetailRadio"> - <radio_item name="0" label="MaÅ‚o" /> - <radio_item name="2" label="Dużo" /> - </radio_group> + <panel label="CustomGraphics" name="CustomGraphics Panel"> + <text name="ShadersText"> + Cieniowanie pixeli (shadery): + </text> + <check_box initial_value="true" label="Mapowanie WypukÅ‚oÅ›ci i PoÅ‚ysk" name="BumpShiny"/> + <check_box initial_value="true" label="Podstawowe Shadery" name="BasicShaders" tool_tip="Wyłączenie tej opcji może naprawić błędy niektórych sterowników graficznych."/> + <check_box initial_value="true" label="Shadery Atmosfery" name="WindLightUseAtmosShaders"/> + <check_box initial_value="true" label="Refleksy w wodzie" name="Reflections"/> + <text name="ReflectionDetailText"> + Ustawienia refleksów: + </text> + <radio_group name="ReflectionDetailRadio"> + <radio_item label="Teren i drzewa" name="0"/> + <radio_item label="Obiekty Statyczne" name="1"/> + <radio_item label="Awatary i Obiekty" name="2"/> + <radio_item label="Wszystko" name="3"/> + </radio_group> + <text name="AvatarRenderingText"> + Rendering awatarów + </text> + <check_box initial_value="true" label="Impostoryzacja Awatarowa" name="AvatarImpostors"/> + <check_box initial_value="true" label="Rendering awatara przez GPU" name="AvatarVertexProgram"/> + <check_box initial_value="true" label="Oddzielne warstwy ubraÅ„" name="AvatarCloth"/> + <slider label="Pole widzenia:" name="DrawDistance"/> + <text name="DrawDistanceMeterText2"> + m + </text> + <slider label="Liczba czÄ…steczek:" name="MaxParticleCount"/> + <slider label="Jakość Post-Procesu:" name="RenderPostProcess"/> + <text name="MeshDetailText"> + Szczególy obiektów: + </text> + <slider label=" Przedmioty:" name="ObjectMeshDetail"/> + <slider label=" Obiekty elastyczne:" name="FlexibleMeshDetail"/> + <slider label=" Drzewa:" name="TreeMeshDetail"/> + <slider label=" Awatary:" name="AvatarMeshDetail"/> + <slider label=" Teren:" name="TerrainMeshDetail"/> + <slider label=" Niebo:" name="SkyMeshDetail"/> + <text name="PostProcessText"> + MaÅ‚o + </text> + <text name="ObjectMeshDetailText"> + MaÅ‚o + </text> + <text name="FlexibleMeshDetailText"> + MaÅ‚o + </text> + <text name="TreeMeshDetailText"> + MaÅ‚o + </text> + <text name="AvatarMeshDetailText"> + MaÅ‚o + </text> + <text name="TerrainMeshDetailText"> + MaÅ‚o + </text> + <text name="SkyMeshDetailText"> + MaÅ‚o + </text> + <text name="LightingDetailText"> + Ustawienia Å›wiateÅ‚: + </text> + <radio_group name="LightingDetailRadio"> + <radio_item label="Tylko SÅ‚oÅ„ce i Księżyc" name="SunMoon" value="0"/> + <radio_item label="Tylko Bliskie ÅšwiatÅ‚a" name="LocalLights" value="1"/> + </radio_group> + <text name="TerrainDetailText"> + Szczegóły terenu: + </text> + <radio_group name="TerrainDetailRadio"> + <radio_item label="Niska" name="0"/> + <radio_item label="Wysoka" name="2"/> + </radio_group> </panel> - <button label="Ustawienia DomyÅ›lne" name="Defaults" /> - <button label="Ustawnia SprzÄ™towe" label_selected="Ustawienia SprzÄ™towe" - name="GraphicsHardwareButton" /> - <panel.string name="resolution_format"> - [RES_X] x [RES_Y] - </panel.string> - <panel.string name="aspect_ratio_text"> - [NUM]:[DEN] - </panel.string> + <button label="Zastosuj" label_selected="Zastosuj" name="Apply"/> + <button label="Zresetuj" name="Defaults"/> + <button label="Zaawansowane" name="Advanced"/> + <button label="SprzÄ™t" label_selected="SprzÄ™t" name="GraphicsHardwareButton"/> </panel> diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/pl/panel_preferences_privacy.xml index e3cdaae840..9504019f79 100755..100644 --- a/indra/newview/skins/default/xui/pl/panel_preferences_privacy.xml +++ b/indra/newview/skins/default/xui/pl/panel_preferences_privacy.xml @@ -1,33 +1,25 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Komunikacja" name="im"> - <text name="text_box"> - Mój Status Online: + <panel.string name="log_in_to_change"> + Zaloguj siÄ™ ponownie, aby zmienić + </panel.string> + <button label="Wyczyść HistoriÄ™" name="clear_cache" tool_tip="Wyczyść obraz zapisu, ostatniej lokalizacji, historii teleportów, stron i bufor danych tekstur"/> + <text name="cache_size_label_l"> + (Miejsca, obrazy, przeglÄ…darka internetowa, wyszukiwarka historii) </text> - <check_box label="Mój status online jest dostepny tylko dla Znajomych i Grup" - name="online_visibility" /> - <text name="text_box2"> - Ustawienia IM: + <check_box label="Mój status online jest dostÄ™pny tylko dla znajomych i grup do których należę" name="online_visibility"/> + <check_box label="Możliwość wysyÅ‚ania wiadomoÅ›ci prywatnej (IM) oraz rozmowy gÅ‚osowej tylko dla znajomych i grup do których należę" name="voice_call_friends_only_check"/> + <check_box label="Wyłącz mikrofon po zakoÅ„czeniu rozmowy gÅ‚osowej" name="auto_disengage_mic_check"/> + <check_box label="Akceptuj Ciasteczka" name="cookies_enabled"/> + <text name="Logs:"> + Logi: </text> - <string name="log_in_to_change"> - zaloguj siÄ™ żeby zmienić - </string> - <check_box label="WysyÅ‚aj IMy na email ([EMAIL])" name="send_im_to_email" /> - <check_box label="Dołącz IMy do Konsola Czatu" name="include_im_in_chat_console" /> - <check_box label="Pokazuj czas w IM" name="show_timestamps_check" /> - <check_box label="Powiadamiaj o zalogowanych znajomych" - name="friends_online_notify_checkbox" /> - <text name="text_box3"> - PracuÅ› Mówi: + <check_box label="Zapisz logi rozmów ogólnych na moim komputerze" name="log_nearby_chat"/> + <check_box label="Zapisuj logi wiadomoÅ›ci prywatnych (IM) na moim komputerze" name="log_instant_messages"/> + <check_box label="Pokazuj czas" name="show_timestamps_check_im"/> + <text name="log_path_desc"> + Lokalizacja zapisu: </text> - <text name="text_box4"> - Ustawienia Zapisu: - </text> - <check_box label="Zapisuj IMy" name="log_instant_messages" /> - <check_box label="Pokazuj czas w zapisie IM" name="log_instant_messages_timestamp" /> - <check_box label="Pokazuj koniec ostatniego dialogu IM" name="log_show_history" /> - <check_box label="Zapisuj czat" name="log_chat" /> - <check_box label="Pokazuj czas w zapisie czatu" name="log_chat_timestamp" /> - <check_box label="Pokazuj nowe IMy w zapisie czatu" name="log_chat_IM" /> - <check_box label="Pokazuj czas łącznie z datÄ…" name="log_date_timestamp" /> - <button label="Lokacja" label_selected="Lokacja" name="log_path_button" /> + <button label="PrzeglÄ…daj" label_selected="PrzeglÄ…daj" name="log_path_button"/> + <button label="Lista Zablokowanych" name="block_list"/> </panel> diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_setup.xml b/indra/newview/skins/default/xui/pl/panel_preferences_setup.xml index 1e2289b496..98fdffeb50 100755..100644 --- a/indra/newview/skins/default/xui/pl/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/pl/panel_preferences_setup.xml @@ -1,31 +1,50 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Joystick i Kamera" name="Input panel"> - <text name=" Mouselook Options:"> - Widok Panoramiczny: +<panel label="Ustawienia" name="Input panel"> + <button label="Ustawienia Joysticka" name="joystick_setup_button"/> + <text name="Mouselook:"> + Widok panoramiczny: </text> - <text name=" Mouse Sensitivity:"> - CzuÅ‚ość Myszki: + <text name=" Mouse Sensitivity"> + CzuÅ‚ość Myszki </text> - <slider_bar name="mouse_sensitivity"/> - <check_box label="ZamieÅ„ klawisze myszy" name="invert_mouse"/> - <text name=" Auto Fly Options:"> - Automatczne Latanie: + <slider name="mouse_sensitivity"/> + <check_box label="ZmieÅ„ klawisze myszki" name="invert_mouse"/> + <text name="Network:"> + Sieć: </text> - <check_box label="Lataj/LÄ…duj UżywajÄ…c Klawiszy PgUp/PgDn" name="automatic_fly"/> - <text name=" Camera Options:"> - Ustawienia Kamery: + <text name="Maximum bandwidth"> + Maksymalna przepustowość </text> - <text name="camera_fov_label"> - KÄ…t Widoku Kamery: + <text name="text_box2"> + kbps </text> - <text name="Camera Follow Distance:"> - Dystans Kamery: + <check_box label="Port dedykowany dla aplikacji" name="connection_port_enabled"/> + <spinner label="Numer Portu:" name="connection_port"/> + <text name="cache_size_label_l"> + Rozmiar bufora danych </text> - <check_box label="Edycja - Automatyczny Ruch Kamery" name="edit_camera_movement" tool_tip="Używaj automatycznego ustawienia kamery podczas włączania i wyłączania trybu edycji"/> - <check_box label="WyglÄ…d - Automatyczny Ruch Kamery" name="appearance_camera_movement" tool_tip="Używaj automatycznego ustawienia kamery w trybu edycji"/> - <text name="text2"> - WyÅ›wietlanie Awatara: + <text name="text_box5"> + MB </text> - <check_box label="Awatar Widoczny w Trybie Panoramicznym" name="first_person_avatar_visible"/> - <button label="Ustawienia Joysticka" name="joystick_setup_button"/> + <text name="Cache location"> + Lokalizacja bufora danych: + </text> + <button label="Ustaw" label_selected="Ustaw" name="set_cache"/> + <button label="Zresetuj" label_selected="Zresetuj" name="reset_cache"/> + <text name="Web:"> + Internet: + </text> + <radio_group name="use_external_browser"> + <radio_item label="Użyj zewnÄ™trznej przeglÄ…darki (IE, Firefox, Safari)" name="external" tool_tip="Używaj zewnÄ™trznej przeglÄ…darki. Nie jest to rekomendowane w trybie peÅ‚noekranowym." value="1"/> + <radio_item label="Używaj wbudowanej przeglÄ…darki." name="internal" tool_tip="Używaj wbudowanej przeglÄ…darki. Ta przeglÄ…darka otworzy nowe okno w [APP_NAME]." value=""/> + </radio_group> + <check_box label="Zezwalaj na wtyczki" name="browser_plugins_enabled"/> + <check_box label="Akceptuj ciasteczka z Internetu" name="cookies_enabled"/> + <check_box label="Zezwalaj na Javascript" name="browser_javascript_enabled"/> + <check_box label="Używaj Serwera Proxy" name="web_proxy_enabled"/> + <text name="Proxy location"> + Lokalizacja Proxy: + </text> + <line_editor name="web_proxy_editor" tool_tip="Nazwa lub IP proxy, którego chcesz użyć"/> + <spinner label="Numer portu:" name="web_proxy_port"/> </panel> diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_sound.xml b/indra/newview/skins/default/xui/pl/panel_preferences_sound.xml index f9b5d221a5..6ab5be77d8 100755..100644 --- a/indra/newview/skins/default/xui/pl/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/pl/panel_preferences_sound.xml @@ -1,14 +1,21 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="DźwiÄ™ki" name="Preference Media panel"> <slider label="Główny" name="System Volume"/> - <check_box initial_value="true" label="Wycisz podczas minimalizacji" name="mute_when_minimized"/> - <slider label="Otoczenie" name="Wind Volume"/> + <check_box label="Wycisz podczas minimalizacji" name="mute_when_minimized"/> <slider label="Interfejs" name="UI Volume"/> + <slider label="Otoczenie" name="Wind Volume"/> + <slider label="Efekty dźwiÄ™kowe" name="SFX Volume"/> + <slider label="Muzyka strumieniowa" name="Music Volume"/> + <check_box label="Odtwarzaj media audio" name="music_enabled"/> <slider label="Media" name="Media Volume"/> - <slider label="Efekty DźwiÄ™kowe" name="SFX Volume"/> - <slider label="Muzyka Strumieniowa" name="Music Volume"/> - <check_box label="GÅ‚os" name="enable_voice_check"/> - <slider label="GÅ‚os" name="Voice Volume"/> + <check_box label="Odtwarzaj media" name="enable_media"/> + <slider label="Komunikacja GÅ‚osowa" name="Voice Volume"/> + <check_box label="Pozwól na rozmowy gÅ‚osowe" name="enable_voice_check"/> + <check_box label="Automatycznie odtwarzaj media" name="media_auto_play_btn" tool_tip="Zaznacz tÄ™ funkcjÄ™ by uruchomić automatyczne uruchamianie mediów"/> + <check_box label="Uruchom media załączone do innych awatarów" name="media_show_on_others_btn" tool_tip="Odznacz tÄ™ funkcjÄ™ by ukryć media załączone to awatarów w publiżu"/> + <text name="voice_chat_settings"> + Ustawienia Komunikacji GÅ‚osowej + </text> <text name="Listen from"> Odtwarzaj z: </text> diff --git a/indra/newview/skins/default/xui/pl/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/pl/panel_prim_media_controls.xml new file mode 100644 index 0000000000..f10ce5ea4d --- /dev/null +++ b/indra/newview/skins/default/xui/pl/panel_prim_media_controls.xml @@ -0,0 +1,79 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="MediaControlsPanel"> + <string name="min_width"> + 300 + </string> + <string name="min_height"> + 75 + </string> + <string name="zoom_medium_padding"> + 1.1 + </string> + <string name="top_world_view_avoid_zone"> + 50 + </string> + <layout_stack name="progress_indicator_area"> + <panel name="media_progress_indicator"> + <progress_bar name="media_progress_bar" tool_tip="Wczytywanie mediów"/> + </panel> + </layout_stack> + <layout_stack name="media_controls"> + <layout_panel name="back"> + <button name="back_btn" tool_tip="Przejdź do poprzedniego"/> + </layout_panel> + <layout_panel name="fwd"> + <button name="fwd_btn" tool_tip="Przejdź do nastÄ™pnego"/> + </layout_panel> + <layout_panel name="home"> + <button name="home_btn" tool_tip="Strona Domowa"/> + </layout_panel> + <layout_panel name="media_stop"> + <button name="media_stop_btn" tool_tip="Zatrzymaj media"/> + </layout_panel> + <layout_panel name="reload"> + <button name="reload_btn" tool_tip="OdÅ›wież"/> + </layout_panel> + <layout_panel name="stop"> + <button name="stop_btn" tool_tip="Zatrzymaj wczytywanie"/> + </layout_panel> + <layout_panel name="play"> + <button name="play_btn" tool_tip="Odtwarzaj Media"/> + </layout_panel> + <layout_panel name="pause"> + <button name="pause_btn" tool_tip="Wstrzymaj media"/> + </layout_panel> + <layout_panel name="media_address"> + <line_editor name="media_address_url" tool_tip="URL Mediów"/> + <layout_stack name="media_address_url_icons"> + <layout_panel> + <icon name="media_whitelist_flag" tool_tip="BiaÅ‚a Lista aktywna"/> + </layout_panel> + <layout_panel> + <icon name="media_secure_lock_flag" tool_tip="Zabezpiecz przeglÄ…danie"/> + </layout_panel> + </layout_stack> + </layout_panel> + <layout_panel name="media_play_position"> + <slider_bar initial_value="0.5" name="media_play_slider" tool_tip="PostÄ™p odtwarzania filmu"/> + </layout_panel> + <layout_panel name="skip_back"> + <button name="skip_back_btn" tool_tip="PrzewiÅ„ do tyÅ‚u"/> + </layout_panel> + <layout_panel name="skip_forward"> + <button name="skip_forward_btn" tool_tip="PrzewiÅ„ do przodu"/> + </layout_panel> + <layout_panel name="media_volume"> + <button name="media_mute_button" tool_tip="Wycisz Media"/> + <slider name="volume_slider" tool_tip="GÅ‚oÅ›ność Mediów"/> + </layout_panel> + <layout_panel name="zoom_frame"> + <button name="zoom_frame_btn" tool_tip="Przybliż do mediów"/> + </layout_panel> + <layout_panel name="close"> + <button name="close_btn" tool_tip="Oddal"/> + </layout_panel> + <layout_panel name="new_window"> + <button name="new_window_btn" tool_tip="Otwórz URL w przeglÄ…darce"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/default/xui/pl/panel_profile.xml b/indra/newview/skins/default/xui/pl/panel_profile.xml new file mode 100644 index 0000000000..766ed94822 --- /dev/null +++ b/indra/newview/skins/default/xui/pl/panel_profile.xml @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Profil" name="panel_profile"> + <string name="no_partner_text" value="Brak"/> + <string name="no_group_text" value="Å»adne"/> + <string name="RegisterDateFormat"> + [REG_DATE] ([AGE]) + </string> + <layout_stack name="layout"> + <layout_panel name="profile_stack"> + <scroll_container name="profile_scroll"> + <panel name="profile_scroll_panel"> + <panel name="second_life_image_panel"> + <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/> + </panel> + <panel name="first_life_image_panel"> + <text name="title_rw_descr_text" value="Å»ycie#1:"/> + </panel> + <text name="title_member_text" value="Urodziny:"/> + <text name="title_acc_status_text" value="Konto:"/> + <text name="title_partner_text" value="Partner:"/> + <panel name="partner_data_panel"> + <name_box initial_value="(przetwarzanie)" name="partner_text"/> + </panel> + <text name="title_groups_text" value="Grupy:"/> + </panel> + </scroll_container> + </layout_panel> + <layout_panel name="profile_buttons_panel"> + <button label="Poznaj" name="add_friend" tool_tip="Zaoferuj znajomość Rezydentowi"/> + <button label="IM" name="im" tool_tip="Rozpocznij sesjÄ™ czatu (IM)"/> + <button label="DzwoÅ„" name="call" tool_tip="ZadzwoÅ„"/> + <button label="Mapa" name="show_on_map_btn" tool_tip="Pokaż Rezydenta na mapie"/> + <button label="Teleportuj" name="teleport" tool_tip="Teleportuj"/> + <button label="â–¼" name="overflow_btn" tool_tip="ZapÅ‚ać lub udostÄ™pnij obiekty Rezydentowi"/> + </layout_panel> + <layout_panel name="profile_me_buttons_panel"> + <button label="Edytuj Profil" name="edit_profile_btn" tool_tip="Edytuj swoje dane"/> + <button label="Edytuj WyglÄ…d" name="edit_appearance_btn" tool_tip="Stwórz/edytuj swój wyglÄ…d: dane fizyczne, ubranie..."/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/default/xui/pl/panel_profile_view.xml b/indra/newview/skins/default/xui/pl/panel_profile_view.xml new file mode 100644 index 0000000000..637b278ef2 --- /dev/null +++ b/indra/newview/skins/default/xui/pl/panel_profile_view.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_target_profile"> + <string name="status_online"> + Obecnie w SL + </string> + <string name="status_offline"> + Nieaktywny + </string> + <text_editor name="user_name" value="(Åadowanie...)"/> + <text name="status" value="Obecnie w SL"/> + <tab_container name="tabs"> + <panel label="PROFIL" name="panel_profile"/> + <panel label="ULUBIONE" name="panel_picks"/> + <panel label="NOTATKI & PRYWATNOŚĆ" name="panel_notes"/> + </tab_container> +</panel> diff --git a/indra/newview/skins/default/xui/pl/panel_region_covenant.xml b/indra/newview/skins/default/xui/pl/panel_region_covenant.xml index f20387dd25..2b37dd96b7 100755..100644 --- a/indra/newview/skins/default/xui/pl/panel_region_covenant.xml +++ b/indra/newview/skins/default/xui/pl/panel_region_covenant.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Umowa" name="Covenant"> <text name="estate_section_lbl"> - MajÄ…tek: + MajÄ…tek </text> <text name="estate_name_lbl"> Nazwa: @@ -26,45 +26,45 @@ Brak umowy dla tego majÄ…tku. </text_editor> <button label="Wyresetuj" name="reset_covenant"/> - <text name="covenant_help_text" bottom_delta="-6"> + <text bottom_delta="-6" name="covenant_help_text"> Zmiany w umowie zostanÄ… wyÅ›wietlone we wszystkich posiadÅ‚oÅ›ciach majÄ…tku. </text> - <text name="covenant_instructions" bottom_delta="-36"> + <text bottom_delta="-36" name="covenant_instructions"> PrzeciÄ…gnij oraz wrzuć notÄ™ by zmienić umowÄ™ dla tego majÄ…tku. </text> <text name="region_section_lbl"> - Region: + Region </text> <text name="region_name_lbl"> Nazwa: </text> - <text name="region_name_text" left="115"> + <text left="115" name="region_name_text"> leyla </text> <text name="region_landtype_lbl"> Typ: </text> - <text name="region_landtype_text" left="115"> + <text left="115" name="region_landtype_text"> Region Główny / Ziemia </text> <text name="region_maturity_lbl"> Rodzaj: </text> - <text name="region_maturity_text" left="115"> + <text left="115" name="region_maturity_text"> 'Adult' </text> <text name="resellable_lbl"> Odsprzedaj: </text> - <text name="resellable_clause" left="115" width="350"> - PosiadÅ‚ość zakupiona w tym regionie nie może być odsprzedana. + <text left="115" name="resellable_clause" width="350"> + PosiadÅ‚ość kupiona w tym Regionie nie może być odsprzedana. </text> <text name="changeable_lbl"> Podziel: </text> - <text name="changeable_clause" left="115" width="350"> - PosiadÅ‚ość zakupiona w tym regionie nie może być + <text left="115" name="changeable_clause" width="350"> + PosiadÅ‚ość kupiona w tym Regionie nie może być łączona/dzielona. </text> <string name="can_resell"> diff --git a/indra/newview/skins/default/xui/pl/panel_region_debug.xml b/indra/newview/skins/default/xui/pl/panel_region_debug.xml index fe7b554a13..c5b08383dc 100755..100644 --- a/indra/newview/skins/default/xui/pl/panel_region_debug.xml +++ b/indra/newview/skins/default/xui/pl/panel_region_debug.xml @@ -6,15 +6,15 @@ <text name="region_text"> brak danych </text> - <check_box label="Zablokuj Skrypty" name="disable_scripts_check" tool_tip="Zablokuj wszystkie skrypty w tym Regionie"/> + <check_box label="Zablokuj skrypty" name="disable_scripts_check" tool_tip="Zablokuj wszystkie skrypty w tym Regionie"/> <button label="?" name="disable_scripts_help"/> - <check_box label="Zablokuj Kolizje" name="disable_collisions_check" tool_tip="Zablokuj kolizje obiektów (nie Awatarów) w tym Regionie"/> + <check_box label="Zablokuj kolizje" name="disable_collisions_check" tool_tip="Zablokuj kolizje obiektów (nie awatarów) w tym Regionie"/> <button label="?" name="disable_collisions_help"/> - <check_box label="Zablokuj FizykÄ™" name="disable_physics_check" tool_tip="Zablokuj wpÅ‚yw fizyki w tym Regionie"/> + <check_box label="Zablokuj fizykÄ™" name="disable_physics_check" tool_tip="Zablokuj wpÅ‚yw fizyki w tym Regionie"/> <button label="?" name="disable_physics_help"/> <button label="Zastosuj" name="apply_btn"/> <text name="objret_text_lbl"> - Zwrot Obiektu + Zwrot obiektu </text> <text name="resident_text_lbl"> Rezydent: @@ -22,19 +22,19 @@ <line_editor name="target_avatar_name"> (brak) </line_editor> - <button label="Wybierz..." name="choose_avatar_btn"/> + <button label="Wybierz" name="choose_avatar_btn"/> <text name="options_text_lbl"> Opcje: </text> - <check_box label="OdeÅ›lij wyłącznie obiekty ze skryptami" name="return_scripts" tool_tip="OdeÅ›lij wyłącznie obiekty ze skryptami."/> + <check_box label="Ze skryptami" name="return_scripts" tool_tip="OdeÅ›lij wyłącznie obiekty ze skryptami"/> <check_box label="OdeÅ›lij wyłącznie obiekty które sÄ… na posiadÅ‚oÅ›ciach innych osób" name="return_other_land" tool_tip="OdeÅ›lij wyłącznie obiekty które sÄ… na posiadÅ‚oÅ›ciach innych osób"/> - <check_box label="OdeÅ›lij obiekty z wszystkich regionów w tym majÄ…tku" name="return_estate_wide" tool_tip="OdeÅ›lij obiekty z wszystkich regionów w tym majÄ…tku"/> + <check_box label="W każdym regionie tego majÄ…tku" name="return_estate_wide" tool_tip="OdeÅ›lij obiekty z wszystkich regionów w tym majÄ…tku"/> <button label="OdeÅ›lij" name="return_btn"/> - <button label="Znajdź Główne Kolizje..." name="top_colliders_btn" tool_tip="Lista obiektów doÅ›wiadczajÄ…cych najwiÄ™cej potencjalnych kolizji"/> + <button label="Znajdź główne kolizje..." name="top_colliders_btn" tool_tip="Lista obiektów doÅ›wiadczajÄ…cych najwiÄ™cej potencjalnych kolizji"/> <button label="?" name="top_colliders_help"/> - <button label="Główne Skrypty..." name="top_scripts_btn" tool_tip="Lista obiektów najdÅ‚użej wykonujÄ…cych skrypty"/> + <button label="Główne skrypty..." name="top_scripts_btn" tool_tip="Lista obiektów najdÅ‚użej wykonujÄ…cych skrypty"/> <button label="?" name="top_scripts_help"/> <button label="Restart Regionu" name="restart_btn" tool_tip="Odliczanie i restart Regionu za dwie minuty"/> <button label="?" name="restart_help"/> - <button label="Opóźnij Restart" name="cancel_restart_btn" tool_tip="Opóźnij restart Regionu o godzinÄ™"/> + <button label="Opóźnij restart" name="cancel_restart_btn" tool_tip="Opóźnij restart Regionu o godzinÄ™"/> </panel> diff --git a/indra/newview/skins/default/xui/pl/panel_region_estate.xml b/indra/newview/skins/default/xui/pl/panel_region_estate.xml index 4275f3f647..a796274738 100755..100644 --- a/indra/newview/skins/default/xui/pl/panel_region_estate.xml +++ b/indra/newview/skins/default/xui/pl/panel_region_estate.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="MajÄ…tek" name="Estate"> <text name="estate_help_text"> - Zmiany ustawieÅ„ na tej zakÅ‚adce odnoszÄ… siÄ™ -do wszystkich Regionów w tym MajÄ…tku. + Zmiany w tej zakÅ‚adce bÄ™dÄ… odczuwalne w caÅ‚ym Regionie. </text> <text name="estate_text"> MajÄ…tek: @@ -11,24 +10,24 @@ do wszystkich Regionów w tym MajÄ…tku. (brak danych) </text> <text name="owner_text"> - WÅ‚aÅ›ciciel: + WÅ‚aÅ›ciciel MajÄ…tku: </text> <text name="estate_owner"> (brak danych) </text> - <check_box label="Używaj Czasu Åšwiatowego" name="use_global_time_check"/> + <check_box label="Używaj czasu Å›wiatowego" name="use_global_time_check"/> <button label="?" name="use_global_time_help"/> <check_box label="StaÅ‚e SÅ‚oÅ„ce" name="fixed_sun_check"/> <button label="?" name="fixed_sun_help"/> - <slider label="Pora Doby" name="sun_hour_slider"/> - <check_box label="DostÄ™p Publiczny" name="externally_visible_check"/> + <slider label="Pora doby" name="sun_hour_slider"/> + <check_box label="DostÄ™p publiczny" name="externally_visible_check"/> <button label="?" name="externally_visible_help"/> <text name="Only Allow"> - DostÄ™p Ograniczony do: + Ogranicz dostÄ™p dla kont zweryfikowanych przez: </text> - <check_box label="Rezydenci z danymi o koncie" name="limit_payment" tool_tip="Zablokuj niepożądanych Rezydentów."/> - <check_box label="DoroÅ›li ze sprawdzonym wiekiem" name="limit_age_verified" tool_tip="Zablokuj Rezydentów którzy nie zweryfikowali swojego wieku. Dodatkowe informacje pod support.secondlife.com."/> - <check_box label="Rozmowy Dozwolone" name="voice_chat_check"/> + <check_box label="Rezydenci z danymi o koncie" name="limit_payment" tool_tip="Zbanuj niezidentyfikowanych Rezydentów"/> + <check_box label="Rezydenci, którzy dokonali weryfikacji wieku" name="limit_age_verified" tool_tip="Zbanuj Rezydentów, którzy nie zweryfikowali swojego wieku. Odwiedź stronÄ™ [SUPPORT_SITE] po wiÄ™cej informacji."/> + <check_box label="Rozmowy dozwolone" name="voice_chat_check"/> <button label="?" name="voice_chat_help"/> <check_box label="Teleportacja Dozwolona" name="allow_direct_teleport"/> <button label="?" name="allow_direct_teleport_help"/> @@ -41,7 +40,7 @@ do wszystkich Regionów w tym MajÄ…tku. </string> <button label="?" name="abuse_email_address_help"/> <button label="Zastosuj" name="apply_btn"/> - <button label="Wyrzuć Awatara z MajÄ…tku..." name="kick_user_from_estate_btn"/> + <button label="Wyrzuć Rezydenta z MajÄ…tku..." name="kick_user_from_estate_btn"/> <button label="WyÅ›lij Wiadomość do MajÄ…tku..." name="message_estate_btn"/> <text name="estate_manager_label"> ZarzÄ…dcy MajÄ…tku: diff --git a/indra/newview/skins/default/xui/pl/panel_region_general.xml b/indra/newview/skins/default/xui/pl/panel_region_general.xml index 20296dac71..1410a2a882 100755..100644 --- a/indra/newview/skins/default/xui/pl/panel_region_general.xml +++ b/indra/newview/skins/default/xui/pl/panel_region_general.xml @@ -18,36 +18,26 @@ <text name="region_type"> nieznany </text> - <check_box label="Zablokuj Zmiany Terenu" name="block_terraform_check"/> - <button label="?" name="terraform_help"/> - <check_box label="Zablokuj Latanie" name="block_fly_check"/> - <button label="?" name="fly_help"/> - <check_box label="Uszkodzenia Dozwolone" name="allow_damage_check"/> - <button label="?" name="damage_help"/> - <check_box label="Zablokuj Popychanie" name="restrict_pushobject"/> - <button label="?" name="restrict_pushobject_help"/> - <check_box label="Odsprzedaż Dozwolona" name="allow_land_resell_check"/> - <button label="?" name="land_resell_help"/> - <check_box label="ÅÄ…czenie/Dzielenie Dozwolone" name="allow_parcel_changes_check"/> - <button label="?" name="parcel_changes_help"/> - <check_box label="Zablokuj Wyszukiwanie" name="block_parcel_search_check" tool_tip="Pozwól na wyÅ›wietlanie nazwy regionu i posiadÅ‚oÅ›ci w wynikach wyszukiwania"/> - <button label="?" name="parcel_search_help"/> + <check_box label="Zablokuj zmiany terenu" name="block_terraform_check"/> + <check_box label="Zablokuj latanie" name="block_fly_check"/> + <check_box label="Uszkodzenia dozwolone" name="allow_damage_check"/> + <check_box label="Zablokuj popychanie" name="restrict_pushobject"/> + <check_box label="Odsprzedaż dozwolona" name="allow_land_resell_check"/> + <check_box label="ÅÄ…czenie/Dzielenie dozwolone" name="allow_parcel_changes_check"/> + <check_box label="Zablokuj wyszukiwanie" name="block_parcel_search_check" tool_tip="Pozwól na wyÅ›wietlanie nazwy regionu i posiadÅ‚oÅ›ci w wynikach wyszukiwania"/> <spinner label="Limit GoÅ›ci" name="agent_limit_spin"/> - <button label="?" name="agent_limit_help"/> - <spinner label="Ekstra Obiekty" name="object_bonus_spin"/> - <button label="?" name="object_bonus_help"/> - <text label="Ograniczenia Wieku" name="access_text"> + <spinner label="Ekstra obiekty" name="object_bonus_spin"/> + <text label="Ograniczenia wieku" name="access_text"> Rodzaj: </text> - <combo_box label="'Mature'" name="access_combo"> - <combo_box.item label="'Adult'" name="Adult"/> - <combo_box.item label="'Mature'" name="Mature"/> - <combo_box.item label="'PG'" name="PG"/> - </combo_box> - <button label="?" name="access_help"/> + <icons_combo_box label="'Mature'" name="access_combo"> + <icons_combo_box.item label="'Adult'" name="Adult" value="42"/> + <icons_combo_box.item label="'Mature'" name="Mature" value="21"/> + <icons_combo_box.item label="'PG'" name="PG" value="13"/> + </icons_combo_box> <button label="Zastosuj" name="apply_btn"/> - <button label="Wyrzuć Awatara..." name="kick_btn"/> - <button label="Wyrzuć Wszystkich..." name="kick_all_btn"/> - <button label="WyÅ›lij Wiadomość do Regionu..." name="im_btn"/> - <button label="ObsÅ‚uga Teleportera..." name="manage_telehub_btn"/> + <button label="Teleportuj do Miejsca Startu jednego Rezydenta..." name="kick_btn"/> + <button label="Teleportuj do Miejsca Startu wszystkich Rezydentów..." name="kick_all_btn"/> + <button label="WyÅ›lij wiadomość do Regionu..." name="im_btn"/> + <button label="ObsÅ‚uga teleportera..." name="manage_telehub_btn"/> </panel> diff --git a/indra/newview/skins/default/xui/pl/panel_region_general_layout.xml b/indra/newview/skins/default/xui/pl/panel_region_general_layout.xml new file mode 100644 index 0000000000..ffa8f1e18a --- /dev/null +++ b/indra/newview/skins/default/xui/pl/panel_region_general_layout.xml @@ -0,0 +1,43 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Region" name="General"> + <text name="region_text_lbl"> + Region: + </text> + <text name="region_text"> + nieznany + </text> + <text name="version_channel_text_lbl"> + Wersja: + </text> + <text name="version_channel_text"> + nieznany + </text> + <text name="region_type_lbl"> + Typ: + </text> + <text name="region_type"> + nieznany + </text> + <check_box label="Zablokuj zmiany terenu" name="block_terraform_check"/> + <check_box label="Zablokuj latanie" name="block_fly_check"/> + <check_box label="Uszkodzenia dozwolone" name="allow_damage_check"/> + <check_box label="Zablokuj popychanie" name="restrict_pushobject"/> + <check_box label="Odsprzedaż dozwolona" name="allow_land_resell_check"/> + <check_box label="ÅÄ…czenie/Dzielenie dozwolone" name="allow_parcel_changes_check"/> + <check_box label="Zablokuj wyszukiwanie" name="block_parcel_search_check" tool_tip="Pozwól na wyÅ›wietlanie nazwy Regionu i PosiadÅ‚oÅ›ci w wynikach wyszukiwania"/> + <spinner label="Limit GoÅ›ci" name="agent_limit_spin"/> + <spinner label="Ekstra obiekty" name="object_bonus_spin"/> + <text label="Restrykcje wieku" name="access_text"> + Rodzaj: + </text> + <combo_box label="Moderuj" name="access_combo"> + <combo_box.item label="Adult" name="Adult"/> + <combo_box.item label="Moderuj" name="Mature"/> + <combo_box.item label="Ogólne" name="PG"/> + </combo_box> + <button label="Zastosuj" name="apply_btn"/> + <button label="Teleportuj do Miejsca Startu jednego Rezydenta..." name="kick_btn"/> + <button label="Teleportuj do Miejsca Startu wszystkich Rezydentów..." name="kick_all_btn"/> + <button label="WyÅ›lij wiadomość do Regionu..." name="im_btn"/> + <button label="ObsÅ‚uga teleportera..." name="manage_telehub_btn"/> +</panel> diff --git a/indra/newview/skins/default/xui/pl/panel_region_terrain.xml b/indra/newview/skins/default/xui/pl/panel_region_terrain.xml index b206616e34..917ae91774 100755..100644 --- a/indra/newview/skins/default/xui/pl/panel_region_terrain.xml +++ b/indra/newview/skins/default/xui/pl/panel_region_terrain.xml @@ -6,22 +6,22 @@ <text name="region_text"> brak danych </text> - <spinner label="Poziom Wody" name="water_height_spin" /> + <spinner label="Poziom wody" name="water_height_spin" /> <button label="?" name="water_height_help" /> - <spinner label="Górny Limit Terenu" name="terrain_raise_spin" /> + <spinner label="Górny limit terenu" name="terrain_raise_spin" /> <button label="?" name="terrain_raise_help" /> - <spinner label="Dolny Limit Terenu" name="terrain_lower_spin" /> + <spinner label="Dolny limit terenu" name="terrain_lower_spin" /> <button label="?" name="terrain_lower_help" /> <check_box label="Używaj SÅ‚oÅ„ca MajÄ…tku" name="use_estate_sun_check" /> <button label="?" name="use_estate_sun_help" /> <check_box label="StaÅ‚e SÅ‚oÅ„ce" name="fixed_sun_check" /> <button label="?" name="fixed_sun_help" /> - <slider label="Pora Doby" name="sun_hour_slider" /> + <slider label="Pora doby" name="sun_hour_slider" /> <button label="Zastosuj" name="apply_btn" /> - <button label="Zapisz Surowy Teren..." name="download_raw_btn" + <button label="Zapisz surowy teren..." name="download_raw_btn" tool_tip="DostÄ™pne tylko dla WÅ‚aÅ›cicieli MajÄ…tku, nie dla ZarzÄ…dców" /> <button label="?" name="download_raw_help" /> - <button label="ZaÅ‚aduj Surowy Teren..." name="upload_raw_btn" + <button label="ZaÅ‚aduj surowy teren..." name="upload_raw_btn" tool_tip="DostÄ™pne tylko dla WÅ‚aÅ›cicieli MajÄ…tku, nie dla ZarzÄ…dców" /> <button label="?" name="upload_raw_help" /> <button label="Ustal Teren" name="bake_terrain_btn" diff --git a/indra/newview/skins/default/xui/pl/panel_region_texture.xml b/indra/newview/skins/default/xui/pl/panel_region_texture.xml index d24579fc75..156f3db63f 100755..100644 --- a/indra/newview/skins/default/xui/pl/panel_region_texture.xml +++ b/indra/newview/skins/default/xui/pl/panel_region_texture.xml @@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Tekstury Gruntu" name="Textures"> <text name="region_text_lbl"> Region: @@ -25,33 +25,33 @@ Zakres Poziomów dla Tekstury </text> <text name="height_text_lbl6"> - PoÅ‚udnie-Zachód + Północny-Zachód </text> <text name="height_text_lbl7"> - Północ-Zachód + Północny-Wschód </text> <text name="height_text_lbl8"> - PoÅ‚udnie-Wschód + PoÅ‚udniowy-Zachód </text> <text name="height_text_lbl9"> - Północ-Wschód - </text> - <spinner label="Dół" name="height_start_spin_0" /> - <spinner label="Dół" name="height_start_spin_1" /> - <spinner label="Dół" name="height_start_spin_2" /> - <spinner label="Dół" name="height_start_spin_3" /> - <spinner label="Góra" name="height_range_spin_0" /> - <spinner label="Góra" name="height_range_spin_1" /> - <spinner label="Góra" name="height_range_spin_2" /> - <spinner label="Góra" name="height_range_spin_3" /> + PoÅ‚udniowy-Wschód + </text> + <spinner label="Dół" name="height_start_spin_0"/> + <spinner label="Dół" name="height_start_spin_1"/> + <spinner label="Dół" name="height_start_spin_2"/> + <spinner label="Dół" name="height_start_spin_3"/> + <spinner label="Góra" name="height_range_spin_0"/> + <spinner label="Góra" name="height_range_spin_1"/> + <spinner label="Góra" name="height_range_spin_2"/> + <spinner label="Góra" name="height_range_spin_3"/> <text name="height_text_lbl10"> WartoÅ›ci reprezentujÄ… zakresy zlewania powyższych tekstur. </text> <text name="height_text_lbl11"> - Wartość DÓÅ, wyrażona w metrach, to MAKSYMALNY poziom dla tekstury #1, + Wartość DÓÅ, wyrażona w metrach, to MAKSYMALNY poziom dla tekstury #1, a wartość GÓRA to MINIMALNY poziom dla tekstury #4. </text> <text name="height_text_lbl12"> a wartość GÓRA to MINIMALNY poziom dla tekstury #4. </text> - <button label="Zastosuj" name="apply_btn" /> + <button label="Zastosuj" name="apply_btn"/> </panel> diff --git a/indra/newview/skins/default/xui/pl/panel_script_ed.xml b/indra/newview/skins/default/xui/pl/panel_script_ed.xml new file mode 100644 index 0000000000..09c3d8ad04 --- /dev/null +++ b/indra/newview/skins/default/xui/pl/panel_script_ed.xml @@ -0,0 +1,43 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="script panel"> + <panel.string name="loading"> + Åadowanie... + </panel.string> + <panel.string name="can_not_view"> + Nie posiadasz praw do zobaczenia lub edycji kodu tego skryptu ponieważ udostÄ™pnione Ci prawa to "brak kopiowania". Musisz posiadać peÅ‚ne prawa by móc zobaczyć lub edytować kod skryptu w zawartoÅ›ci obiektu. + </panel.string> + <panel.string name="public_objects_can_not_run"> + Publiczne obiekty nie mogÄ… uruchamiać skryptów + </panel.string> + <panel.string name="script_running"> + Uruchomione + </panel.string> + <panel.string name="Title"> + Skrypt: [NAME] + </panel.string> + <text_editor name="Script Editor"> + Åadowanie... + </text_editor> + <button label="Zapisz" label_selected="Zapisz" name="Save_btn"/> + <combo_box label="Wklej..." name="Insert..."/> + <menu_bar name="script_menu"> + <menu label="Plik" name="File"> + <menu_item_call label="Zapisz" name="Save"/> + <menu_item_call label="Cofnij wszystkie zmiany" name="Revert All Changes"/> + </menu> + <menu label="Edytuj" name="Edit"> + <menu_item_call label="Cofnij" name="Undo"/> + <menu_item_call label="Do Przodu" name="Redo"/> + <menu_item_call label="Wytnij" name="Cut"/> + <menu_item_call label="Kopiuj" name="Copy"/> + <menu_item_call label="Wklej" name="Paste"/> + <menu_item_call label="Wybierz Wszystko" name="Select All"/> + <menu_item_call label="Odznacz" name="Deselect"/> + <menu_item_call label="Znajdź / ZamieÅ„..." name="Search / Replace..."/> + </menu> + <menu label="Pomoc" name="Help"> + <menu_item_call label="Pomoc..." name="Help..."/> + <menu_item_call label="Pomoc..." name="Keyword Help..."/> + </menu> + </menu_bar> +</panel> diff --git a/indra/newview/skins/default/xui/pl/panel_script_limits_my_avatar.xml b/indra/newview/skins/default/xui/pl/panel_script_limits_my_avatar.xml new file mode 100644 index 0000000000..e1863517a2 --- /dev/null +++ b/indra/newview/skins/default/xui/pl/panel_script_limits_my_avatar.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="MÓJ AWATAR" name="script_limits_my_avatar_panel"> + <text name="script_memory"> + Zużycie Skryptów przez Awatara + </text> + <text name="loading_text"> + Åadowanie... + </text> + <scroll_list name="scripts_list"> + <scroll_list.columns label="Rozmiar (kb)" name="size"/> + <scroll_list.columns label="URL" name="urls"/> + <scroll_list.columns label="Nazwa Obiektu" name="name"/> + <scroll_list.columns label="Lokalizacja" name="location"/> + </scroll_list> + <button label="OdÅ›wież listÄ™" name="refresh_list_btn"/> +</panel> diff --git a/indra/newview/skins/default/xui/pl/panel_script_limits_region_memory.xml b/indra/newview/skins/default/xui/pl/panel_script_limits_region_memory.xml new file mode 100644 index 0000000000..1419a9c9f6 --- /dev/null +++ b/indra/newview/skins/default/xui/pl/panel_script_limits_region_memory.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="PAMIĘĆ REGIONU" name="script_limits_region_memory_panel"> + <text name="script_memory"> + Pamięć Skryptu Parceli + </text> + <text name="loading_text"> + Åadowanie... + </text> + <scroll_list name="scripts_list"> + <scroll_list.columns label="Rozmiar (kb)" name="size"/> + <scroll_list.columns label="URL" name="urls"/> + <scroll_list.columns label="Nazwa Obiektu" name="name"/> + <scroll_list.columns label="WÅ‚aÅ›ciciel" name="owner"/> + <scroll_list.columns label="Parcela" name="parcel"/> + <scroll_list.columns label="Lokalizacja" name="location"/> + </scroll_list> + <button label="OdÅ›wież listÄ™" name="refresh_list_btn"/> + <button label="Pokaż" name="highlight_btn"/> + <button label="Zwróć" name="return_btn"/> +</panel> diff --git a/indra/newview/skins/default/xui/pl/panel_scrolling_param.xml b/indra/newview/skins/default/xui/pl/panel_scrolling_param.xml index 70a6e39412..70a6e39412 100755..100644 --- a/indra/newview/skins/default/xui/pl/panel_scrolling_param.xml +++ b/indra/newview/skins/default/xui/pl/panel_scrolling_param.xml diff --git a/indra/newview/skins/default/xui/pl/panel_side_tray.xml b/indra/newview/skins/default/xui/pl/panel_side_tray.xml new file mode 100644 index 0000000000..f34fd0e108 --- /dev/null +++ b/indra/newview/skins/default/xui/pl/panel_side_tray.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- Side tray cannot show background because it is always + partially on screen to hold tab buttons. --> +<side_tray name="sidebar"> + <sidetray_tab description="Przełącz Panel Boczny" name="sidebar_openclose" tab_title="Przełącz Panel Boczny"/> + <sidetray_tab description="Miejsce Startu." name="sidebar_home" tab_title="Home"> + <panel label="miejsce startu" name="panel_home"/> + </sidetray_tab> + <sidetray_tab description="Edytuj swój publiczny profil oraz ulubione zakÅ‚adki." name="sidebar_me" tab_title="My Profile"> + <panel_container name="panel_container"> + <panel label="Ja" name="panel_me"/> + </panel_container> + </sidetray_tab> + <sidetray_tab description="Znajdź swoich znajomych, kontakty oraz Rezydentów w pobliżu Ciebie." name="sidebar_people" tab_title="People"> + <panel_container name="panel_container"> + <panel label="Grupa" name="panel_group_info_sidetray"/> + <panel label="Zablokowani Rezydenci & Obiekty" name="panel_block_list_sidetray"/> + </panel_container> + </sidetray_tab> + <sidetray_tab description="Znajdź i odwiedź miejsca, w których byÅ‚eÅ› wczeÅ›niej." label="Miejsca" name="sidebar_places" tab_title="Places"> + <panel label="Miejsca" name="panel_places"/> + </sidetray_tab> + <sidetray_tab description="PrzeglÄ…daj SzafÄ™." name="sidebar_inventory" tab_title="My Inventory"> + <panel label="Edytuj SzafÄ™" name="sidepanel_inventory"/> + </sidetray_tab> + <sidetray_tab description="ZmieÅ„ swój obecny wyglÄ…d i ubranie." name="sidebar_appearance" tab_title="My Appearance"> + <panel label="Edytuj WyglÄ…d" name="sidepanel_appearance"/> + </sidetray_tab> +</side_tray> diff --git a/indra/newview/skins/default/xui/pl/panel_side_tray_tab_caption.xml b/indra/newview/skins/default/xui/pl/panel_side_tray_tab_caption.xml new file mode 100644 index 0000000000..0ae9c1cf61 --- /dev/null +++ b/indra/newview/skins/default/xui/pl/panel_side_tray_tab_caption.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="sidetray_tab_panel"> + <text name="sidetray_tab_title" value="Schowek"/> + <button name="show_help" tool_tip="Pomoc"/> +</panel> diff --git a/indra/newview/skins/default/xui/pl/panel_stand_stop_flying.xml b/indra/newview/skins/default/xui/pl/panel_stand_stop_flying.xml new file mode 100644 index 0000000000..0f99f3911c --- /dev/null +++ b/indra/newview/skins/default/xui/pl/panel_stand_stop_flying.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- Width and height of this panel should be synchronized with "panel_modes" in the floater_moveview.xml--> +<panel name="panel_stand_stop_flying"> + <button label="WstaÅ„" name="stand_btn" tool_tip="Kliknij tutaj by wstać."/> + <button label="Zatrzymaj latanie" name="stop_fly_btn" tool_tip="Zatrzymaj latanie"/> +</panel> diff --git a/indra/newview/skins/default/xui/pl/panel_status_bar.xml b/indra/newview/skins/default/xui/pl/panel_status_bar.xml index 9226e67dff..313c2732ff 100755..100644 --- a/indra/newview/skins/default/xui/pl/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/pl/panel_status_bar.xml @@ -1,39 +1,31 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="status"> - <text name="ParcelNameText" tool_tip="Nazwa posiadÅ‚oÅ›ci w której siÄ™ znajdujesz. Po wiÄ™cej informacji kliknij O PosiadÅ‚oÅ›ci."> - Nazwa PosiadÅ‚oÅ›ci - </text> - <text name="BalanceText" tool_tip="Stan Konta"> - Åadowanie... - </text> - <button label="" label_selected="" name="buycurrency" tool_tip="Kup $L" /> - <text name="TimeText" tool_tip="Obecny Czas (Pacyficzny)"> - 12:00 AM - </text> - <string name="StatBarDaysOfWeek"> + <panel.string name="StatBarDaysOfWeek"> Niedziela:PoniedziaÅ‚ek:Wtorek:Åšroda:Czwartek:PiÄ…tek:Sobota - </string> - <string name="StatBarMonthsOfYear"> + </panel.string> + <panel.string name="StatBarMonthsOfYear"> StyczeÅ„:Luty:Marzec:KwiecieÅ„:Maj:Czerwiec:Lipiec:StyczeÅ„:WrzesieÅ„:Październik:Listopad:GrudzieÅ„ - </string> - <button label="" label_selected="" name="scriptout" tool_tip="Błędy i Ostrzeżenia Skryptów" /> - <button label="" label_selected="" name="health" tool_tip="Stan" /> - <text name="HealthText" tool_tip="Stan"> - 100% - </text> - <button label="" label_selected="" name="no_fly" tool_tip="Latanie jest niedozwolone" /> - <button label="" label_selected="" name="no_build" tool_tip="Budowanie/rezzowanie jest niedozwolone" /> - <button label="" label_selected="" name="no_scripts" tool_tip="Używanie skryptów jest niedozwolone" /> - <button label="" label_selected="" name="restrictpush" tool_tip="PochniÄ™cia sÄ… niedozwolone" /> - <button label="" label_selected="" name="status_no_voice" tool_tip="Używanie komunikacji gÅ‚osowej jest niedozwolone" /> - <button label="" label_selected="" name="buyland" tool_tip="Kup tÄ… posiadÅ‚ość" /> - <button label="" name="menubar_search_bevel_bg" /> - <line_editor label="Szukaj" name="search_editor" tool_tip="Szukaj w [SECOND_LIFE]" /> - <button label="" label_selected="" name="search_btn" tool_tip="Szukaj w [SECOND_LIFE]" /> - <string name="packet_loss_tooltip"> - Utracone Pakiety - </string> - <string name="bandwidth_tooltip"> + </panel.string> + <panel.string name="packet_loss_tooltip"> + Utracone pakiety + </panel.string> + <panel.string name="bandwidth_tooltip"> Przepustowość - </string> + </panel.string> + <panel.string name="time"> + [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt] + </panel.string> + <panel.string name="timeTooltip"> + [weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt] + </panel.string> + <panel.string name="buycurrencylabel"> + L$ [AMT] + </panel.string> + <button label="" label_selected="" name="buycurrency" tool_tip="Bilans"/> + <button label="Kup L$" name="buyL" tool_tip="Kliknij aby kupić L$"/> + <text name="TimeText" tool_tip="Obecny Czas (Pacyficzny)"> + 24:00 AM PST + </text> + <button name="media_toggle_btn" tool_tip="Start/Stop Wszystkie Media (Muzyka, Video, WWW)"/> + <button name="volume_btn" tool_tip="Regulacja GÅ‚oÅ›noÅ›ci"/> </panel> diff --git a/indra/newview/skins/default/xui/pl/panel_teleport_history.xml b/indra/newview/skins/default/xui/pl/panel_teleport_history.xml new file mode 100644 index 0000000000..d143843eaf --- /dev/null +++ b/indra/newview/skins/default/xui/pl/panel_teleport_history.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="Teleport History"> + <accordion name="history_accordion"> + <accordion_tab name="today" title="Dzisiaj"/> + <accordion_tab name="yesterday" title="Wczoraj"/> + <accordion_tab name="2_days_ago" title="2 dni temu"/> + 5 + <accordion_tab name="3_days_ago" title="3 dni temu"/> + <accordion_tab name="4_days_ago" title="4 dni temu"/> + <accordion_tab name="5_days_ago" title="5 dni temu"/> + <accordion_tab name="6_days_and_older" title="6 dni i wiÄ™cej"/> + <accordion_tab name="1_month_and_older" title="1 miesiÄ…c i wiÄ™cej"/> + <accordion_tab name="6_months_and_older" title="6 miesiÄ™cy i wiÄ™cej"/> + </accordion> + <panel name="bottom_panel"> + <button name="gear_btn" tool_tip="Pokaż dodatkowe opcje"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/pl/panel_teleport_history_item.xml b/indra/newview/skins/default/xui/pl/panel_teleport_history_item.xml new file mode 100644 index 0000000000..f0fe28c4ce --- /dev/null +++ b/indra/newview/skins/default/xui/pl/panel_teleport_history_item.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="teleport_history_item"> + <button name="profile_btn" tool_tip="Pokaż info o obiekcie"/> +</panel> diff --git a/indra/newview/skins/default/xui/pl/panel_world_map.xml b/indra/newview/skins/default/xui/pl/panel_world_map.xml index 70479fe209..849b01a1ce 100644 --- a/indra/newview/skins/default/xui/pl/panel_world_map.xml +++ b/indra/newview/skins/default/xui/pl/panel_world_map.xml @@ -4,7 +4,7 @@ Åadowanie... </panel.string> <panel.string name="InvalidLocation"> - NiewÅ‚aÅ›ciwa Lokalizacja + NiewÅ‚aÅ›ciwa lokalizacja </panel.string> <panel.string name="world_map_north"> N diff --git a/indra/newview/skins/default/xui/pl/role_actions.xml b/indra/newview/skins/default/xui/pl/role_actions.xml index 5711eacf2f..ccfa5f222e 100755..100644 --- a/indra/newview/skins/default/xui/pl/role_actions.xml +++ b/indra/newview/skins/default/xui/pl/role_actions.xml @@ -1,197 +1,76 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <role_actions> - <action_set - description="Przywileje pozwajajÄ…ce na dodawanie i usuwanie CzÅ‚onków oraz pozwalajÄ… nowym CzÅ‚onkom na dodawanie siÄ™ bez zaproszenia." - name="Membership"> - <action description="Zapraszanie do Grupy" - longdescription="Zapraszanie nowych Ludzi do Grupy używajÄ…c 'ZaproÅ› NowÄ… OsobÄ™...' pod CzÅ‚onkowie > CzÅ‚onkowie." - name="member invite" /> - <action description="Usuwanie z Grupy" - longdescription="Usuwanie CzÅ‚onków z Grupy używajÄ…c 'UsuÅ„ z Grupy' pod CzÅ‚onkowie > CzÅ‚onkowie. WÅ‚aÅ›ciciel może usunąć każdego za wyjÄ…tkiem innego WÅ‚aÅ›ciciela. Jeżeli nie jesteÅ› WÅ‚aÅ›cicielem możesz tylko usuwać CzÅ‚onków w Funkcji Każdy i tylko wtedy kiedy nie majÄ… żadnej innej Funkcji. Aby odebrać CzÅ‚onkowi FunkcjÄ™ musisz mieć Przywilej 'Odbieranie Funkcji'." - name="member eject" /> - <action - description="Selekcja opcji 'Wolne Zapisy' i wybór 'OpÅ‚aty WstÄ™pnej'" - longdescription="Selekcja opcji 'Wolne Zapisy' (pozwola nowym CzÅ‚onkom na dodawanie sie bez zaproszenia) i wybiór 'OpÅ‚aty WstÄ™pnej' w Ustawieniach Grupy w sekcji Ogólne." - name="member options" /> + <action_set description="Przywileje pozwajajÄ…ce na dodawanie i usuwanie CzÅ‚onków oraz pozwalajÄ… nowym CzÅ‚onkom na dodawanie siÄ™ bez zaproszenia." name="Membership"> + <action description="Zapraszanie do Grupy" longdescription="Zapraszanie nowych Ludzi do Grupy używajÄ…c przycisku 'ZaproÅ›' w sekcji Ról > CzÅ‚onkowie" name="member invite"/> + <action description="Usuwanie z Grupy" longdescription="Usuwanie CzÅ‚onków z Grupy używajÄ…c 'UsuÅ„ z Grupy'; pod CzÅ‚onkowie > CzÅ‚onkowie. WÅ‚aÅ›ciciel może usunąć każdego za wyjÄ…tkiem innego WÅ‚aÅ›ciciela. Jeżeli nie jesteÅ› WÅ‚aÅ›cicielem możesz tylko usuwać CzÅ‚onków w Funkcji Każdy i tylko wtedy kiedy nie majÄ… żadnej innej Funkcji. Aby odebrać CzÅ‚onkowi FunkcjÄ™ musisz mieć Przywilej 'Odbieranie Funkcji'." name="member eject"/> + <action description="Selekcja opcji 'Wolne Zapisy' i wybór 'OpÅ‚aty WstÄ™pnej'" longdescription="Selekcja opcji 'Wolne Zapisy' (pozwala nowym CzÅ‚onkom na dodawanie siÄ™ bez zaproszenia) i wybór 'OpÅ‚aty WstÄ™pnej' w Ustawieniach Grupy w sekcji Ogólne." name="member options"/> </action_set> - <action_set - description="Przywileje pozwalajÄ…ce na dodawanie, usuwanie i edycjÄ™ Funkcji w Grupie, oraz na nadawanie i odbieranie Funkcji, oraz na przypisywanie Przywilejów do Funkcji." - name="Roles"> - <action description="Dodawanie Funkcji" - longdescription="Dodawanie nowych Funkcji pod CzÅ‚onkowie > Funkcje." - name="role create" /> - <action description="Usuwanie Funkcji" - longdescription="Usuwanie Funkcji pod CzÅ‚onkowie > Funkcje." - name="role delete" /> - <action description="Zmiany nazw Funkcji, Tytułów i Opisów" - longdescription="Zmiany nazw Funkcji, Tytułów i Opisów w dolnej części CzÅ‚onkowie > Funkcje po wybraniu Funkcje." - name="role properties" /> - <action description="Przypisywanie CzÅ‚onków do posiadanych Funkcji" - longdescription="Przypisywanie CzÅ‚onków do Funkcji w sekcji Przypisane Funkcje pod CzÅ‚onkowie > CzÅ‚onkowie. CzÅ‚onek z tym Przywilejem może dodawać CzÅ‚onków do Funkcji które sam już posiada." - name="role assign member limited" /> - <action description="Przypisywanie CzÅ‚onków do wszystkich Funkcji" - longdescription="Przypisywanie CzÅ‚onków do wszystkich Funkcji w sekcji Przypisane Funkcje pod CzÅ‚onkowie > CzÅ‚onkowie. *UWAGA* CzÅ‚onek w Funkcji z tym Przywilejem może przypisać siebie i innych CzÅ‚onków nie bÄ™dÄ…cych WÅ‚aÅ›cicielami do Funkcji dajÄ…cych wiÄ™cej Przywilejów niż posiadane obecnie potencjalnie dajÄ…ce możliwoÅ›ci zbliżone do możliwoÅ›ci WÅ‚aÅ›ciciela. Udzielaj tego Przywileju z rozwagÄ…." - name="role assign member" /> - <action description="Odbieranie Funkcji" - longdescription="Odbieranie Funkcji w sekcji Przypisane Funkcje pod CzÅ‚onkowie > CzÅ‚onkowie. Funkcja WÅ‚aÅ›ciciela nie może być odebrana." - name="role remove member" /> - <action description="Dodawanie i Usuwanie Przywilejów z Funkcji" - longdescription="Dodawanie i Usuwanie Przywilejów z Funkcji w sekcji Przwileje pod CzÅ‚onkowie > Funkcje. *UWAGA* CzÅ‚onek w Funkcji z tym Przywilejem może przypisać sobie i innychm CzÅ‚onkom nie bÄ™dÄ…cym WÅ‚aÅ›cicielami wszystkie Przywileje potencjalnie dajÄ…ce możliwoÅ›ci zbliżone do możliwoÅ›ci WÅ‚aÅ›ciciela. Udzielaj tego Przywileju z rozwagÄ…." - name="role change actions" /> + <action_set description="Przywileje pozwalajÄ…ce na dodawanie, usuwanie i edycjÄ™ Funkcji w Grupie, oraz na nadawanie i odbieranie Funkcji, oraz na przypisywanie Przywilejów do Funkcji." name="Roles"> + <action description="Dodawanie Funkcji" longdescription="Dodawanie nowych Funkcji pod CzÅ‚onkowie > Funkcje." name="role create"/> + <action description="Usuwanie Funkcji" longdescription="UsuÅ„ Funkcje w zakÅ‚adce Funkcje > Funkcje" name="role delete"/> + <action description="Zmiany nazw Funkcji, Tytułów i Opisów i widoczność CzÅ‚onków w Informacjach o Grupie" longdescription="Zmiany nazw Funkcji, Tytułów i Opisów i wybór czy CzÅ‚onkowie z danÄ… RolÄ… sÄ… widoczni Informacji o Grupie w dolnej części sekcji Funkcji > Funkcje po wybraniu Funkcje." name="role properties"/> + <action description="Przypisywanie CzÅ‚onków do posiadanych Funkcji" longdescription="Przypisywanie CzÅ‚onków do Funkcji w sekcji Przypisane Funkcje pod CzÅ‚onkowie > CzÅ‚onkowie. CzÅ‚onek z tym Przywilejem może dodawać CzÅ‚onków do Funkcji które sam już posiada." name="role assign member limited"/> + <action description="Przypisywanie CzÅ‚onków do wszystkich Funkcji" longdescription="Przypisywanie CzÅ‚onków do wszystkich Funkcji w sekcji Przypisane Funkcje pod CzÅ‚onkowie > CzÅ‚onkowie. *UWAGA* CzÅ‚onek w Funkcji z tym Przywilejem może przypisać siebie i innych CzÅ‚onków nie bÄ™dÄ…cych WÅ‚aÅ›cicielami do Funkcji dajÄ…cych wiÄ™cej Przywilejów niż posiadane obecnie potencjalnie dajÄ…ce możliwoÅ›ci zbliżone do możliwoÅ›ci WÅ‚aÅ›ciciela. Udzielaj tego Przywileju z rozwagÄ…." name="role assign member"/> + <action description="Odbieranie Funkcji" longdescription="Odbieranie Funkcji w sekcji Przypisane Funkcje pod CzÅ‚onkowie > CzÅ‚onkowie. Funkcja WÅ‚aÅ›ciciela nie może być odebrana." name="role remove member"/> + <action description="Dodawanie i Usuwanie Przywilejów z Funkcji" longdescription="Dodawanie i Usuwanie Przywilejów z Funkcji w sekcji Przwileje pod CzÅ‚onkowie > Funkcje. *UWAGA* CzÅ‚onek w Funkcji z tym Przywilejem może przypisać sobie i innym CzÅ‚onkom nie bÄ™dÄ…cym WÅ‚aÅ›cicielami wszystkie Przywileje potencjalnie dajÄ…ce możliwoÅ›ci zbliżone do możliwoÅ›ci WÅ‚aÅ›ciciela. Udzielaj tego Przywileju z rozwagÄ…." name="role change actions"/> </action_set> - <action_set - description="Przywileje pozwalajÄ…ce na edycjÄ™ atrybutów Grupy takich jak widoczność w wyszukiwarce, status i insygnia." - name="Group Identity"> - <action - description="Zmiany Statusu Grupy, Insygniów, 'Widoczność w Wyszukiwarce' i widoczność CzÅ‚onków w Informacjach o Grupie." - longdescription="Zmiany Statusu Grupy, Insygniów, 'Widoczność w Wyszukiwarce' i widoczność CzÅ‚onków w Informacjach o Grupie. DostÄ™p poprzez ustawienia Ogólne." - name="group change identity" /> + <action_set description="Przywileje pozwalajÄ…ce na edycjÄ™ atrybutów Grupy takich jak widoczność w wyszukiwarce, status i insygnia." name="Group Identity"> + <action description="Zmiany Statusu Grupy, Insygniów, 'Widoczność w Wyszukiwarce' i widoczność CzÅ‚onków w Informacjach o Grupie." longdescription="Zmiany Statusu Grupy, Insygniów, i Widoczność w Wyszukiwarce. DostÄ™p poprzez ustawienia Ogólne." name="group change identity"/> </action_set> - <action_set - description="Przywileje pozwalajÄ…ce na przypisywanie, modyfikacje i sprzedaż PosiadÅ‚oÅ›ci Grupy. Aby zobaczyć okno O PosiadloÅ›ci wybierz grunt prawym klawiszem myszki i wybierz 'O PosiadloÅ›ci' albo wybierz O PosiadÅ‚oÅ›ci w głównym menu." - name="Parcel Management"> - <action description="Przypisywanie i kupowanie PosiadÅ‚oÅ›ci dla Grupy" - longdescription="Przypisywanie i kupowanie PosiadÅ‚oÅ›ci dla Grupy. DostÄ™p poprzez O PosiadloÅ›ci > ustawienia Ogólne." - name="land deed" /> - <action description="Oddawanie PosiadÅ‚oÅ›ci do Linden Lab" - longdescription="Oddawanie PosiadÅ‚oÅ›ci do Linden Lab. *UWAGA* CzÅ‚onek w Funkcji z tym Przywilejem może porzucać PosiadloÅ›ci Grupy poprzez O PosiadloÅ›ci > ustawienia Ogólne oddajÄ…c PosiadÅ‚oÅ›ci za darmo do Linden Labs! Udzielaj tego Przywileju z rozwagÄ…." - name="land release" /> - <action description="Sprzedaż PosiadÅ‚oÅ›ci" - longdescription="Sprzedaż PosiadÅ‚oÅ›ci. *UWAGA* CzÅ‚onek w Funkcji z tym Przywilejem może sprzedawać PosiadloÅ›ci Grupy poprzez O PosiadloÅ›ci > ustawienia Ogólne! Udzielaj tego Przywileju z rozwagÄ…." - name="land set sale info" /> - <action description="PodziaÅ‚ i ÅÄ…czenie PosiadÅ‚oÅ›ci" - longdescription="PodziaÅ‚ i ÅÄ…czenie PosiadÅ‚oÅ›ci. DostÄ™p poprzez wybranie gruntu prawym klawiszem myszki, 'Edycja Terenu', i przesuwanie myszkÄ… po gruncie wybierajÄ…c obszar. Aby podzielić wybierz obszar i naciÅ›nij 'Podziel...'. Aby połączyć wybierz dwie albo wiÄ™cej sÄ…siadujÄ…ce PosiadÅ‚oÅ›ci i naciÅ›nij 'Połącz...'." - name="land divide join" /> + <action_set description="Przywileje pozwalajÄ…ce na przypisywanie, modyfikacje i sprzedaż PosiadÅ‚oÅ›ci Grupy. Aby zobaczyć okno O PosiadÅ‚oÅ›ci wybierz grunt prawym klawiszem myszki i wybierz 'O PosiadÅ‚oÅ›ci' albo wybierz ikonÄ™ 'i' w głównym menu." name="Parcel Management"> + <action description="Przypisywanie i kupowanie PosiadÅ‚oÅ›ci dla Grupy" longdescription="Przypisywanie i kupowanie PosiadÅ‚oÅ›ci dla Grupy. DostÄ™p poprzez O PosiadloÅ›ci > ustawienia Ogólne." name="land deed"/> + <action description="Oddawanie PosiadÅ‚oÅ›ci do Linden Lab" longdescription="Oddawanie PosiadÅ‚oÅ›ci do Linden Lab. *UWAGA* CzÅ‚onek w Funkcji z tym Przywilejem może porzucać PosiadloÅ›ci Grupy poprzez O PosiadloÅ›ci > ustawienia Ogólne oddajÄ…c PosiadÅ‚oÅ›ci za darmo do Linden Labs! Udzielaj tego Przywileju z rozwagÄ…." name="land release"/> + <action description="Sprzedaż PosiadÅ‚oÅ›ci" longdescription="Sprzedaż PosiadÅ‚oÅ›ci. *UWAGA* CzÅ‚onek w Funkcji z tym Przywilejem może sprzedawać PosiadloÅ›ci Grupy poprzez O PosiadloÅ›ci > ustawienia Ogólne! Udzielaj tego Przywileju z rozwagÄ…." name="land set sale info"/> + <action description="PodziaÅ‚ i ÅÄ…czenie PosiadÅ‚oÅ›ci" longdescription="PodziaÅ‚ i ÅÄ…czenie PosiadÅ‚oÅ›ci. DostÄ™p poprzez wybranie gruntu prawym klawiszem myszki, 'Edycja Terenu', i przesuwanie myszkÄ… po gruncie wybierajÄ…c obszar. Aby podzielić wybierz obszar i naciÅ›nij 'Podziel'. Aby połączyć wybierz dwie albo wiÄ™cej sÄ…siadujÄ…ce PosiadÅ‚oÅ›ci i naciÅ›nij 'Połącz'." name="land divide join"/> </action_set> - <action_set - description="Przywileje pozwalajÄ…ce na zmianÄ™ nazwy PosiadÅ‚oÅ›ci, widoczność w wyszukiwarce, widoczność w wyszukiwarce, wybór miejsce lÄ…dowania i zmianÄ™ ustawieÅ„ teleportacji (TP)." - name="Parcel Identity"> - <action - description="Selekcja opcji 'Pokazuj w szukaniu miejsc' i wybór kategorii" - longdescription="Selekcja opcji 'Pokazuj w szukaniu miejsc' i wybór kategorii PosiadÅ‚oÅ›ci pod O PosiadÅ‚oÅ›ci > Opcje." - name="land find places" /> - <action - description="Zmiany nazwy PosiadÅ‚oÅ›ci, opisu i selekcja 'Widoczność w Wyszukiwarce'" - longdescription="Zmiany nazwy PosiadÅ‚oÅ›ci, opisu i selekcja 'Widoczność w Wyszukiwarce'. DostÄ™p poprzez O PosiadÅ‚oÅ›ci > Opcje." - name="land change identity" /> - <action description="Wybór miejsca lÄ…dowania i ustawienia teleportacji (TP)" - longdescription="Na PosiadÅ‚oÅ›ci Grupy CzÅ‚onek w Funkcji z tym Przywilejem może wybrać miejsce gdzie teleportujÄ…ce siÄ™ osoby bÄ™dÄ… ladować oraz może ustalić dodatkowe parametry teleportacji (TP). DostÄ™p poprzez O PosiadÅ‚oÅ›ci > Opcje." - name="land set landing point" /> + <action_set description="Przywileje pozwalajÄ…ce na zmianÄ™ nazwy PosiadÅ‚oÅ›ci, widoczność w wyszukiwarce, widoczność w wyszukiwarce, wybór miejsce lÄ…dowania i zmianÄ™ ustawieÅ„ teleportacji (TP)." name="Parcel Identity"> + <action description="Selekcja opcji 'Pokazuj w szukaniu miejsc' i wybór kategorii" longdescription="Selekcja opcji 'Pokazuj w szukaniu miejsc' i wybór kategorii PosiadÅ‚oÅ›ci pod O PosiadÅ‚oÅ›ci > Opcje." name="land find places"/> + <action description="Zmiany nazwy PosiadÅ‚oÅ›ci, opisu i selekcja 'Widoczność w Wyszukiwarce'" longdescription="Zmiany nazwy PosiadÅ‚oÅ›ci, opisu i selekcja 'Widoczność w Wyszukiwarce'. DostÄ™p poprzez O PosiadÅ‚oÅ›ci > Opcje." name="land change identity"/> + <action description="Wybór miejsca lÄ…dowania i ustawienia teleportacji (TP)" longdescription="Na PosiadÅ‚oÅ›ci Grupy CzÅ‚onek w Funkcji z tym Przywilejem może wybrać miejsce gdzie teleportujÄ…ce siÄ™ osoby bÄ™dÄ… ladować oraz może ustalić dodatkowe parametry teleportacji (TP). DostÄ™p poprzez O PosiadÅ‚oÅ›ci > Opcje." name="land set landing point"/> </action_set> - <action_set - description="Przywileje pozwalajÄ…ce na zmianÄ™ opcji PosiadÅ‚oÅ›ci takich jak 'Tworzenie Obiektów', 'Edycja Terenu' i zmianÄ™ ustawieÅ„ muzyki & mediów." - name="Parcel Settings"> - <action description="Zmiany ustawieÅ„ muzyki & mediów" - longdescription="Zmiany ustawieÅ„ muzyki & mediów pod O PosiadÅ‚oÅ›ci > Media." - name="land change media" /> - <action description="Selekcja opcji 'Edycja Terenu'" - longdescription="Selekcja opcji 'Edycja Terenu'. *UWAGA* O PosiadÅ‚oÅ›ci > Opcje > Edycja Terenu pozwala każdemu na formowanie gruntów Twojej PosiadÅ‚oÅ›ci oraz na przemieszczanie roÅ›lin z Linden Labs. Udzielaj tego Przywileju z rozwagÄ…. Selekcja opcji Edycji Terenu jest dostÄ™pna poprzez O PosiadÅ‚oÅ›ci > Opcje." - name="land edit" /> - <action description="Dodatkowe ustawienia O PosiadÅ‚oÅ›ci > Opcje" - longdescription="Selekcja opcji 'BezpieczeÅ„stwo (brak uszkodzeÅ„)', 'Latanie', opcje dla innych Rezydentów: 'Tworzenie Obiektów', 'Edycja Terenu', 'ZapamiÄ™tywanie Miejsca (LM)', 'Skrypty' na PosiadÅ‚oÅ›ciach Grupy pod O PosiadÅ‚oÅ›ci > Opcje." - name="land options" /> + <action_set description="Przywileje pozwalajÄ…ce na zmianÄ™ opcji PosiadÅ‚oÅ›ci takich jak 'Tworzenie Obiektów', 'Edycja Terenu' i zmianÄ™ ustawieÅ„ muzyki & mediów." name="Parcel Settings"> + <action description="Zmiany ustawieÅ„ muzyki & mediów" longdescription="Zmiany ustawieÅ„ muzyki & mediów pod O PosiadÅ‚oÅ›ci > Media." name="land change media"/> + <action description="Selekcja opcji 'Edycja Terenu'" longdescription="Selekcja opcji 'Edycja Terenu'. *UWAGA* O PosiadÅ‚oÅ›ci > Opcje > Edycja Terenu pozwala każdemu na formowanie gruntów Twojej PosiadÅ‚oÅ›ci oraz na przemieszczanie roÅ›lin z Linden Labs. Udzielaj tego Przywileju z rozwagÄ…. Selekcja opcji Edycji Terenu jest dostÄ™pna poprzez O PosiadÅ‚oÅ›ci > Opcje." name="land edit"/> + <action description="Dodatkowe ustawienia O PosiadÅ‚oÅ›ci > Opcje" longdescription="Selekcja opcji 'BezpieczeÅ„stwo (brak uszkodzeÅ„)' 'Latanie', opcje dla innych Rezydentów: 'Tworzenie Obiektów'; 'Edycja Terenu', 'ZapamiÄ™tywanie Miejsca (LM)', i 'Skrypty' na PosiadÅ‚oÅ›ciach Grupy pod O PosiadÅ‚oÅ›ci > Opcje." name="land options"/> </action_set> - <action_set - description="Przywileje pozwalajÄ…ce CzÅ‚onkom na omijanie ograniczeÅ„ na PosiadÅ‚oÅ›ciach Grupy." - name="Parcel Powers"> - <action description="Pozwól na EdycjÄ™ Terenu" - longdescription="CzÅ‚onkowie w Funkcji z tym Przywilejem mogÄ… zawsze edytować teren na PosiadÅ‚oÅ›ciach Grupy." - name="land allow edit land" /> - <action description="Pozwól na Latanie" - longdescription="CzÅ‚onkowie w Funkcji z tym Przywilejem mogÄ… zawsze latać na PosiadÅ‚oÅ›ciach Grupy." - name="land allow fly" /> - <action description="Pozwól na Tworzenie Obiektów" - longdescription="CzÅ‚onkowie w Funkcji z tym Przywilejem mogÄ… zawsze tworzyć obiekty na PosiadÅ‚oÅ›ciach Grupy." - name="land allow create" /> - <action description="Pozwól na ZapamiÄ™tywanie Miejsc (LM)" - longdescription="CzÅ‚onkowie w Funkcji z tym Przywilejem mogÄ… zawsze zapamiÄ™tywać miejsca (LM) na PosiadÅ‚oÅ›ciach Grupy." - name="land allow landmark" /> - <action description="Pozwól na wybór Miejsca Startu na PosiadÅ‚oÅ›ciach Grupy" - longdescription="CzÅ‚onkowie w Funkcji z tym Przywilejem mogÄ… zawsze wybrać Miejsce Startu na PosiadÅ‚oÅ›ciach Grupy." - name="land allow set home" /> + <action_set description="Przywileje pozwalajÄ…ce CzÅ‚onkom na omijanie ograniczeÅ„ na PosiadÅ‚oÅ›ciach Grupy." name="Parcel Powers"> + <action description="Pozwól na EdycjÄ™ Terenu" longdescription="CzÅ‚onkowie w Funkcji z tym Przywilejem mogÄ… zawsze edytować teren na PosiadÅ‚oÅ›ciach Grupy." name="land allow edit land"/> + <action description="Pozwól na Latanie" longdescription="CzÅ‚onkowie w Funkcji z tym Przywilejem mogÄ… zawsze latać na PosiadÅ‚oÅ›ciach Grupy." name="land allow fly"/> + <action description="Pozwól na Tworzenie Obiektów" longdescription="CzÅ‚onkowie w Funkcji z tym Przywilejem mogÄ… zawsze tworzyć obiekty na PosiadÅ‚oÅ›ciach Grupy." name="land allow create"/> + <action description="Pozwól na ZapamiÄ™tywanie Miejsc (LM)" longdescription="CzÅ‚onkowie w Funkcji z tym Przywilejem mogÄ… zawsze zapamiÄ™tywać miejsca (LM) na PosiadÅ‚oÅ›ciach Grupy." name="land allow landmark"/> + <action description="Pozwól na wybór Miejsca Startu na PosiadÅ‚oÅ›ciach Grupy" longdescription="CzÅ‚onkowie w Funkcji z tym Przywilejem mogÄ… używać menu Åšwiat > ZapamiÄ™taj Miejsce > Miejsce Startu na PosiadÅ‚oÅ›ci przypisanej Grupie." name="land allow set home"/> </action_set> - <action_set - description="Przywileje pozwalajÄ…ce na dawanie i odbieranie dostÄ™pu do PosiadÅ‚oÅ›ci Grupy zawierajÄ…ce możliwoÅ›ci unieruchomiania i wyrzucania Rezydentów." - name="Parcel Access"> - <action description="ZarzÄ…dzanie ListÄ… DostÄ™pu do PosiadÅ‚oÅ›ci" - longdescription="ZarzÄ…dzanie ListÄ… DostÄ™pu do PosiadÅ‚oÅ›ci pod O PosiadÅ‚oÅ›ci > DostÄ™p." - name="land manage allowed" /> - <action description="ZarzÄ…dzanie ListÄ… UsuniÄ™tych z PosiadÅ‚oÅ›ci (Bany)" - longdescription="ZarzÄ…dzanie ListÄ… UsuniÄ™tych z PosiadÅ‚oÅ›ci (Bany) pod O PosiadloÅ›ci > Usuwanie." - name="land manage banned" /> - <action description="Selekcja opcji 'WstÄ™p PÅ‚atny...'" - longdescription="Selekcja opcji 'WstÄ™p PÅ‚atny...' pod O PosiadÅ‚oÅ›ci > DostÄ™p." - name="land manage passes" /> - <action description="Wyrzucanie i unieruchamianie Rezydentów na PosiadÅ‚oÅ›ciach" - longdescription="CzÅ‚onkowie w Funkcji z tym Przywilejem mogÄ… wpÅ‚ywać na niepożądanych na PosiadÅ‚oÅ›ciach Grupy Rezydentów wybierajÄ…c ich prawym klawiszem myszki i wybierajÄ…c WiÄ™cej > 'Wyrzuć...' albo 'Unieruchom...'." - name="land admin" /> + <action_set description="Przywileje pozwalajÄ…ce na dawanie i odbieranie dostÄ™pu do PosiadÅ‚oÅ›ci Grupy zawierajÄ…ce możliwoÅ›ci unieruchomiania i wyrzucania Rezydentów." name="Parcel Access"> + <action description="ZarzÄ…dzanie ListÄ… DostÄ™pu do PosiadÅ‚oÅ›ci" longdescription="ZarzÄ…dzanie ListÄ… DostÄ™pu do PosiadÅ‚oÅ›ci pod O PosiadÅ‚oÅ›ci > DostÄ™p." name="land manage allowed"/> + <action description="ZarzÄ…dzanie ListÄ… UsuniÄ™tych z PosiadÅ‚oÅ›ci (Bany)" longdescription="ZarzÄ…dzanie ListÄ… DostÄ™pu do PosiadÅ‚oÅ›ci pod O PosiadÅ‚oÅ›ci > DostÄ™p." name="land manage banned"/> + <action description="Selekcja opcji 'WstÄ™p PÅ‚atny'" longdescription="Selekcja opcji 'WstÄ™p PÅ‚atny'; pod O PosiadÅ‚oÅ›ci > DostÄ™p." name="land manage passes"/> + <action description="Wyrzucanie i unieruchamianie Rezydentów na PosiadÅ‚oÅ›ciach" longdescription="CzÅ‚onkowie w Funkcji z tym Przywilejem mogÄ… wpÅ‚ywać na niepożądanych na PosiadÅ‚oÅ›ciach Grupy Rezydentów wybierajÄ…c ich prawym klawiszem myszki i wybierajÄ…c ';Wyrzuć' albo 'Unieruchom'." name="land admin"/> </action_set> - <action_set - description="Przywileje pozwalajÄ…ce na odsyÅ‚anie obiektów i przemieszczanie roÅ›lin z Linden Lab. Użyteczne przy porzÄ…dkowaniu i przemieszczaniu roÅ›linnoÅ›ci. *UWAGA* OdsyÅ‚anie obiektów jest nieodwracalne." - name="Parcel Content"> - <action description="OdsyÅ‚anie obiektów należących do Grupy" - longdescription="OdsyÅ‚anie obiektów należących do Grupy pod O PosiadÅ‚oÅ›ci > Obiekty." - name="land return group owned" /> - <action description="OdsyÅ‚anie obiektów przypisanych do Grupy" - longdescription="OdsyÅ‚anie obiektów przypisanych do Grupy pod O PosiadÅ‚oÅ›ci > Obiekty." - name="land return group set" /> - <action description="OdsyÅ‚anie obiektów nie przypisanych do Grupy" - longdescription="OdsyÅ‚anie obiektów nie przypisanych do Grupy pod O PosiadÅ‚oÅ›ci > Obiekty." - name="land return non group" /> - <action description="Ogrodnictwo używajÄ…c roÅ›lin z Linden Lab" - longdescription="Ogrodnictwo pozwala na umieszczanie i przemieszczanie drzew, roÅ›lin i trawy z Linden Lab. Te obiekty znajdujÄ… siÄ™ w Twojej Szafie pod Zbiór > Obiekty, mogÄ… też być stworzone używajÄ…c przycisku Buduj." - name="land gardening" /> + <action_set description="Przywileje pozwalajÄ…ce na odsyÅ‚anie obiektów i przemieszczanie roÅ›lin z Linden Lab. Użyteczne przy porzÄ…dkowaniu i przemieszczaniu roÅ›linnoÅ›ci. *UWAGA* OdsyÅ‚anie obiektów jest nieodwracalne." name="Parcel Content"> + <action description="OdsyÅ‚anie obiektów należących do Grupy" longdescription="OdsyÅ‚anie obiektów należących do Grupy pod O PosiadÅ‚oÅ›ci > Obiekty." name="land return group owned"/> + <action description="OdsyÅ‚anie obiektów przypisanych do Grupy" longdescription="OdsyÅ‚anie obiektów przypisanych do Grupy pod O PosiadÅ‚oÅ›ci > Obiekty." name="land return group set"/> + <action description="OdsyÅ‚anie obiektów nie przypisanych do Grupy" longdescription="OdsyÅ‚anie obiektów nie przypisanych do Grupy pod O PosiadÅ‚oÅ›ci > Obiekty." name="land return non group"/> + <action description="Ogrodnictwo używajÄ…c roÅ›lin z Linden Lab" longdescription="Możliwość przemieszczenia roÅ›lin z Linden Lab. Obiekty te mogÄ… zostać odnalezione w Twojej Szafie, w folderze Biblioteka > Folderze Obiektów lub mogÄ… zostać stworzone dziÄ™ki aktywacji NarzÄ™dzi Edycji." name="land gardening"/> </action_set> - <action_set - description="Przywileje pozwalajÄ…ce na przypisywanie, modyfikacje i sprzedaż obiektów należących do Grupy. DostÄ™p poprzez NarzÄ™dzia Edycji > Ogólne. Wybierz obiekt prawym klawiszem myszki i wybierz Edycja żeby zobaczyć ustawienia." - name="Object Management"> - <action description="Przypisywanie obiektów do Grupy" - longdescription="Przypisywanie obiektów do Grupy pod NarzÄ™dzia Edycji > Ogólne." - name="object deed" /> - <action - description="Manipulowanie (wklejanie, kopiowanie, modyfikacja) obiektami należącymi do Grupy" - longdescription="Manipulowanie (wklejanie, kopiowanie, modyfikacja) obiektami należącymi do Grupy pod NarzÄ™dzia Edycji > Ogólne." - name="object manipulate" /> - <action description="Sprzedaż obiektów należących do Grupy" - longdescription="Sprzedaż obiektów należących do Grupy pod NarzÄ™dzia Edycji > Ogólne." - name="object set sale" /> + <action_set description="Przywileje pozwalajÄ…ce na odsyÅ‚anie obiektów i przemieszczenia roÅ›lin z Linden Lab. Użyteczne przy porzÄ…dkowaniu i przemieszczenia roÅ›linnoÅ›ci. *UWAGA* OdsyÅ‚anie obiektów jest nieodwracalne." name="Object Management"> + <action description="Przypisywanie obiektów do Grupy" longdescription="Przypisywanie obiektów do Grupy w NarzÄ™dziach Edycji > Ogólne" name="object deed"/> + <action description="Manipulowanie (wklejanie, kopiowanie, modyfikacja) obiektami należącymi do Grupy" longdescription="Manipulowanie (wklejanie, kopiowanie, modyfikacja) obiektami należącymi do Grupy w NarzÄ™dziach Edycji > Ogólne" name="object manipulate"/> + <action description="Sprzedaż obiektów należących do Grupy" longdescription="Sprzedaż obiektów należących do Grupy pod NarzÄ™dzia Edycji > Ogólne." name="object set sale"/> </action_set> - <action_set - description="Przywileje pozwalajÄ…ce na wybór opÅ‚at grupowych, otrzymywanie dochodu i ograniczanie dostÄ™pu do historii konta grupy." - name="Accounting"> - <action description="OpÅ‚aty grupowe i dochód grupowy" - longdescription="CzÅ‚onkowie w Funkcji z tym Przywilejem bÄ™dÄ… automatycznie wnosić opÅ‚aty grupowe i bÄ™dÄ… otrzymywać dochód grupowy. Tzn. bÄ™dÄ… codziennie otrzymywać część dochodu ze sprzedaży PosiadÅ‚oÅ›ci Grupy oraz bÄ™dÄ… partycypować w kosztach ogÅ‚oszeÅ„ itp." - name="accounting accountable" /> + <action_set description="Przywileje pozwalajÄ…ce na wybór opÅ‚at grupowych, otrzymywanie dochodu i ograniczanie dostÄ™pu do historii konta grupy." name="Accounting"> + <action description="OpÅ‚aty grupowe i dochód grupowy" longdescription="CzÅ‚onkowie w Funkcji z tym Przywilejem bÄ™dÄ… automatycznie wnosić opÅ‚aty grupowe i bÄ™dÄ… otrzymywać dochód grupowy. Tzn. bÄ™dÄ… codziennie otrzymywać część dochodu ze sprzedaży PosiadÅ‚oÅ›ci Grupy oraz bÄ™dÄ… partycypować w kosztach ogÅ‚oszeÅ„ itp." name="accounting accountable"/> </action_set> - <action_set - description="Przywileje pozwalajÄ…ce na wysyÅ‚anie, odbieranie i czytanie Notek Grupy." - name="Notices"> - <action description="WysyÅ‚anie Notek" - longdescription="CzÅ‚onkowie w Funkcji z tym Przywilejem mogÄ… wysyÅ‚ać Notki wybierajÄ…c O Grupie > Notek." - name="notices send" /> - <action description="Odbieranie Notek i dostÄ™p do dawniejszych Notek" - longdescription="CzÅ‚onkowie w Funkcji z tym Przywilejem mogÄ… odbierać nowe i czytać dawniejsze Notki wybierajÄ…c O Grupie > Notki." - name="notices receive" /> + <action_set description="Przywileje pozwalajÄ…ce na wysyÅ‚anie, odbieranie i czytanie Notek Grupy." name="Notices"> + <action description="WysyÅ‚anie Notek" longdescription="CzÅ‚onkowie w Funkcji z tym Przywilejem mogÄ… wysyÅ‚ać Notki wybierajÄ…c O Grupie > Notek." name="notices send"/> + <action description="Odbieranie Notek i dostÄ™p do dawniejszych Notek" longdescription="CzÅ‚onkowie w Funkcji z tym Przywilejem mogÄ… odbierać nowe i czytać dawniejsze Notki wybierajÄ…c O Grupie > Notki." name="notices receive"/> </action_set> - <action_set - description="Przywileje pozwalajÄ…ce na zgÅ‚aszanie Propozycji, gÅ‚osowanie nad Propozycjami i Å›ledzenie historii gÅ‚osowania." - name="Proposals"> - <action description="ZgÅ‚aszanie Propozycji" - longdescription="CzÅ‚onkowie w Funkcji z tym Przywilejem mogÄ… zgÅ‚aszać Propozycje do gÅ‚osowania wybierajÄ…c O Grupie > Propozycje." - name="proposal start" /> - <action description="GÅ‚osowanie nad Propozycjami" - longdescription="CzÅ‚onkowie w Funkcji z tym Przywilejem mogÄ… gÅ‚osować nad Propozycjami zgÅ‚oszonymi do gÅ‚osowania wybierajÄ…c O Grupie > Propozycje." - name="proposal vote" /> + <action_set description="Przywileje pozwalajÄ…ce na zgÅ‚aszanie Propozycji, gÅ‚osowanie nad Propozycjami i Å›ledzenie historii gÅ‚osowania." name="Proposals"> + <action description="ZgÅ‚aszanie Propozycji" longdescription="CzÅ‚onkowie w Funkcji z tym Przywilejem mogÄ… zgÅ‚aszać Propozycje do gÅ‚osowania wybierajÄ…c O Grupie > Propozycje." name="proposal start"/> + <action description="GÅ‚osowanie nad Propozycjami" longdescription="CzÅ‚onkowie w Funkcji z tym Przywilejem mogÄ… gÅ‚osować nad Propozycjami zgÅ‚oszonymi do gÅ‚osowania wybierajÄ…c O Grupie > Propozycje." name="proposal vote"/> </action_set> <action_set description="Przywileje kontrolujÄ…ce czat i rozmowy grupowe." name="Chat"> - <action description="DostÄ™p do Czatu Grupowego" - longdescription="CzÅ‚onkowie w Funkcji z tym Przywilejem mogÄ… uczestniczyć w czacie i rozmowach grupowych." - name="join group chat" /> - <action description="DostÄ™p do Rozmów Grupowych" - longdescription="CzÅ‚onkowie w Funkcji z tym Przywilejem mogÄ… uczestniczyć w rozmowach grupowych. UWAGA: DostÄ™p do Czatu Grupowego jest wymagany dla rozmów grupowych." - name="join voice chat" /> - <action description="Moderator Czatu Grupowego" - longdescription="CzÅ‚onkowie w Funkcji z tym Przywilejem mogÄ… kontrolować dostÄ™p do czatu i rozmów grupowych." - name="moderate group chat" /> + <action description="DostÄ™p do Czatu Grupowego" longdescription="CzÅ‚onkowie w Funkcji z tym Przywilejem mogÄ… uczestniczyć w czacie i rozmowach grupowych." name="join group chat"/> + <action description="DostÄ™p do Rozmów Grupowych" longdescription="CzÅ‚onkowie w Funkcji z tym Przywilejem mogÄ… uczestniczyć w rozmowach grupowych. UWAGA: DostÄ™p do Czatu Grupowego jest wymagany dla rozmów grupowych." name="join voice chat"/> + <action description="Moderator Czatu Grupowego" longdescription="CzÅ‚onkowie w Funkcji z tym Przywilejem mogÄ… kontrolować dostÄ™p do czatu i rozmów grupowych." name="moderate group chat"/> </action_set> </role_actions> diff --git a/indra/newview/skins/default/xui/pl/sidepanel_appearance.xml b/indra/newview/skins/default/xui/pl/sidepanel_appearance.xml new file mode 100644 index 0000000000..ecbf262777 --- /dev/null +++ b/indra/newview/skins/default/xui/pl/sidepanel_appearance.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Ubrania" name="appearance panel"> + <string name="No Outfit" value="Bez Ubrania"/> + <panel name="panel_currentlook"> + <text name="currentlook_title"> + (niezapisane) + </text> + </panel> + <filter_editor label="PrzeglÄ…daj Ubrania" name="Filter"/> +</panel> diff --git a/indra/newview/skins/default/xui/pl/sidepanel_inventory.xml b/indra/newview/skins/default/xui/pl/sidepanel_inventory.xml new file mode 100644 index 0000000000..d7a813b1b7 --- /dev/null +++ b/indra/newview/skins/default/xui/pl/sidepanel_inventory.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Rzeczy" name="objects panel"> + <panel label="" name="sidepanel__inventory_panel"> + <panel name="button_panel"> + <button label="Profil" name="info_btn"/> + <button label="Ubierz" name="wear_btn"/> + <button label="Odtwarzaj" name="play_btn"/> + <button label="Teleportuj" name="teleport_btn"/> + </panel> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/pl/sidepanel_item_info.xml b/indra/newview/skins/default/xui/pl/sidepanel_item_info.xml new file mode 100644 index 0000000000..3b038a7102 --- /dev/null +++ b/indra/newview/skins/default/xui/pl/sidepanel_item_info.xml @@ -0,0 +1,73 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="item properties" title="Profil Obiektu"> + <panel.string name="unknown"> + (nieznany) + </panel.string> + <panel.string name="public"> + (publiczny) + </panel.string> + <panel.string name="you_can"> + Ty możesz: + </panel.string> + <panel.string name="owner_can"> + WÅ‚aÅ›ciciel może: + </panel.string> + <panel.string name="acquiredDate"> + [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local] + </panel.string> + <text name="title" value="Profil Obiektu"/> + <text name="where" value="(Szafa)"/> + <panel label=""> + <text name="LabelItemNameTitle"> + Nazwa: + </text> + <text name="LabelItemDescTitle"> + Opis: + </text> + <text name="LabelCreatorTitle"> + Twórca: + </text> + <button label="Profil..." name="BtnCreator"/> + <text name="LabelOwnerTitle"> + WÅ‚aÅ›ciciel: + </text> + <button label="Profil..." name="BtnOwner"/> + <text name="LabelAcquiredTitle"> + Nabyte: + </text> + <text name="LabelAcquiredDate"> + Wed May 24 12:50:46 2006 + </text> + <panel name="perms_inv"> + <text name="perm_modify"> + Ty możesz: + </text> + <check_box label="Zmienia" name="CheckOwnerModify"/> + <check_box label="Kopiuje" name="CheckOwnerCopy"/> + <check_box label="Sprzedaje/Oddaje" name="CheckOwnerTransfer"/> + <text name="AnyoneLabel"> + Każdy: + </text> + <check_box label="Kopiuje" name="CheckEveryoneCopy"/> + <text name="GroupLabel"> + Grupa: + </text> + <check_box label="UdostÄ™pnij" name="CheckShareWithGroup" tool_tip="Pozwól wszystkim czÅ‚onkom ustawionej grupy na dzielenie prawa do modyfikacji dla tego obiektu. Musisz Przypisać aby aktywować ograniczenia wynikajÄ…ce z roli."/> + <text name="NextOwnerLabel"> + NastÄ™pny WÅ‚aÅ›ciciel: + </text> + <check_box label="Modyfikuje" name="CheckNextOwnerModify"/> + <check_box label="Kopiuje" name="CheckNextOwnerCopy"/> + <check_box label="Sprzedaje/Oddaje" name="CheckNextOwnerTransfer" tool_tip="NastÄ™pny wÅ‚aÅ›ciciel może oddać lub sprzedać ten obiekt"/> + </panel> + <check_box label="Na Sprzedaż" name="CheckPurchase"/> + <combo_box name="combobox sale copy"> + <combo_box.item label="Kopia" name="Copy"/> + <combo_box.item label="OriginaÅ‚" name="Original"/> + </combo_box> + <spinner label="Cena: L$" name="Edit Cost"/> + </panel> + <panel name="button_panel"> + <button label="Anuluj" name="cancel_btn"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/pl/sidepanel_task_info.xml b/indra/newview/skins/default/xui/pl/sidepanel_task_info.xml new file mode 100644 index 0000000000..17cd13f970 --- /dev/null +++ b/indra/newview/skins/default/xui/pl/sidepanel_task_info.xml @@ -0,0 +1,129 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="object properties" title="Profil Obiektu"> + <panel.string name="text deed continued"> + Przypisz + </panel.string> + <panel.string name="text deed"> + Przypisz + </panel.string> + <panel.string name="text modify info 1"> + Możesz modyfikować ten obiekt + </panel.string> + <panel.string name="text modify info 2"> + Możesz modyfikować te obiekty + </panel.string> + <panel.string name="text modify info 3"> + Nie możesz modyfikować tego obiektu + </panel.string> + <panel.string name="text modify info 4"> + Nie możesz modyfikować tych obiektów + </panel.string> + <panel.string name="text modify warning"> + Ten obiekt ma części zgrupowane + </panel.string> + <panel.string name="Cost Default"> + Cena: L$ + </panel.string> + <panel.string name="Cost Total"> + Cena caÅ‚kowita: L$ + </panel.string> + <panel.string name="Cost Per Unit"> + Cena za jednostkÄ™: L$ + </panel.string> + <panel.string name="Cost Mixed"> + Cena mieszana + </panel.string> + <panel.string name="Sale Mixed"> + Sprzedaż mieszana + </panel.string> + <text name="title" value="Profil Obiektu"/> + <text name="where" value="(w Å›wiecie)"/> + <panel label="" name="properties_panel"> + <text name="Name:"> + Nazwa: + </text> + <text name="Description:"> + Opis: + </text> + <text name="CreatorNameLabel"> + Twórca: + </text> + <text name="Creator Name"> + Erica Linden + </text> + <text name="Owner:"> + WÅ‚aÅ›ciciel: + </text> + <text name="Owner Name"> + Erica Linden + </text> + <text name="Group_label"> + Grupa: + </text> + <button name="button set group" tool_tip="Wybierz grupÄ™ by udostÄ™pnić jej prawa do tego obiektu"/> + <name_box initial_value="Åadowanie..." name="Group Name Proxy"/> + <button label="Przypisz" label_selected="Przypisz" name="button deed" tool_tip="Opcja przepisania udostÄ™pnia obiektowi takie same prawa jak zostaÅ‚y zaznaczone dla nastÄ™pnego wÅ‚aÅ›ciciela. Obiekty udostÄ™pnione grupie mogÄ… zostać przepisane dla grupy przez oficera grupy."/> + <text name="label click action"> + Kliknij by: + </text> + <combo_box name="clickaction"> + <combo_box.item label="Dotknij (domyÅ›lne)" name="Touch/grab(default)"/> + <combo_box.item label="UsiÄ…dź na obiekcie" name="Sitonobject"/> + <combo_box.item label="Kup obiekt" name="Buyobject"/> + <combo_box.item label="ZapÅ‚ać obiektowi" name="Payobject"/> + <combo_box.item label="Otwórz" name="Open"/> + </combo_box> + <panel name="perms_inv"> + <text name="perm_modify"> + Możesz modyfikować ten obiekt + </text> + <text name="Anyone can:"> + Każdy: + </text> + <check_box label="Kopiuj" name="checkbox allow everyone copy"/> + <check_box label="PrzesuÅ„" name="checkbox allow everyone move"/> + <text name="GroupLabel"> + Groupie: + </text> + <check_box label="UdostÄ™pnij" name="checkbox share with group" tool_tip="UdostÄ™pnij prawa do modyfikacji tego obiektu wszystkim czÅ‚onkom, którzy posiadajÄ… przywilej modyfikacji obiektów grupy. By ograniczyć, przypisz obiekt do grupy."/> + <text name="NextOwnerLabel"> + NastÄ™pny WÅ‚aÅ›ciciel: + </text> + <check_box label="Modyfikuj" name="checkbox next owner can modify"/> + <check_box label="Kopiuj" name="checkbox next owner can copy"/> + <check_box label="Oddaj" name="checkbox next owner can transfer" tool_tip="NastÄ™pny wÅ‚aÅ›ciciel może sprzedać lub oddać ten obiekt"/> + </panel> + <check_box label="Na Sprzedaż" name="checkbox for sale"/> + <combo_box name="sale type"> + <combo_box.item label="Kopiuj" name="Copy"/> + <combo_box.item label="Treść" name="Contents"/> + <combo_box.item label="OryginaÅ‚" name="Original"/> + </combo_box> + <spinner label="Cena: L$" name="Edit Cost"/> + <check_box label="Pokaż w wyszukiwarce" name="search_check" tool_tip="UdostÄ™pnij widzialność tego obiektu w wyszukiwarce"/> + <text name="B:"> + B: + </text> + <text name="O:"> + O: + </text> + <text name="G:"> + G: + </text> + <text name="E:"> + E: + </text> + <text name="N:"> + N: + </text> + <text name="F:"> + F: + </text> + </panel> + <panel name="button_panel"> + <button label="Otwórz" name="open_btn"/> + <button label="ZapÅ‚ać" name="pay_btn"/> + <button label="Kup" name="buy_btn"/> + <button label="Szczegóły" name="details_btn"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/pl/strings.xml b/indra/newview/skins/default/xui/pl/strings.xml index e8dcfac02d..c72f783a51 100755..100644 --- a/indra/newview/skins/default/xui/pl/strings.xml +++ b/indra/newview/skins/default/xui/pl/strings.xml @@ -1,9 +1,12 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <!-- This file contains strings that used to be hardcoded in the source. It is only for those strings which do not belong in a floater. - For example, the strings used in avatar chat bubbles, and strings + For example, the strings used in avatar chat bubbles, and strings that are returned from one component and may appear in many places--> <strings> + <string name="CAPITALIZED_APP_NAME"> + SECOND LIFE + </string> <string name="SUPPORT_SITE"> Portal Pomocy Second Life </string> @@ -11,7 +14,22 @@ Wykrywanie dysku twardego... </string> <string name="StartupLoading"> - Åadowanie + Åadowanie [APP_NAME]... + </string> + <string name="StartupClearingCache"> + Czyszczenie bufora danych... + </string> + <string name="StartupInitializingTextureCache"> + Inicjowanie bufora danych tekstur... + </string> + <string name="StartupInitializingVFS"> + Inicjowanie VFS... + </string> + <string name="ProgressRestoring"> + Przywracanie... + </string> + <string name="ProgressChangingResolution"> + Zmiana rozdzielczoÅ›ci... </string> <string name="LoginInProgress"> Trwa logowanie. [APP_NAME] ProszÄ™ czekać. @@ -73,12 +91,33 @@ <string name="LoginFailedNoNetwork"> Błąd sieci: Brak połączenia z sieciÄ…, sprawdź status swojego połączenia internetowego. </string> + <string name="LoginFailed"> + Logowanie nie powiodÅ‚o siÄ™. + </string> <string name="Quit"> Wyłącz Program </string> <string name="AgentLostConnection"> Ten region może mieć problemy. Sprawdź podłączenie do Internetu. </string> + <string name="SavingSettings"> + Zachowanie ustawieÅ„... + </string> + <string name="LoggingOut"> + Trwa wylogowanie... + </string> + <string name="ShuttingDown"> + Zamykanie... + </string> + <string name="YouHaveBeenDisconnected"> + NastÄ…piÅ‚o rozłączenie z regionem. + </string> + <string name="SentToInvalidRegion"> + Region jest niedostÄ™pny. + </string> + <string name="TestingDisconnect"> + NastÄ…piÅ‚o rozłączenie testowania klienta + </string> <string name="TooltipPerson"> Osoba </string> @@ -131,7 +170,25 @@ Kliknij by zobaczyć szczegóły tego miejsca </string> <string name="TooltipAgentUrl"> - Kliknij by zobaczyć profil tego rezydenta + Kliknij aby zobaczyc profil Rezydenta + </string> + <string name="TooltipAgentMute"> + Kliknij aby wyciszyc tego Rezydenta + </string> + <string name="TooltipAgentUnmute"> + Kliknij aby cofnąć zablokowanie tego Rezydenta + </string> + <string name="TooltipAgentIM"> + Kliknij aby wysÅ‚ać wiadomość IM do tego Rezydenta + </string> + <string name="TooltipAgentPay"> + Kliknij aby zapÅ‚acić temu Rezydentowi + </string> + <string name="TooltipAgentOfferTeleport"> + Kliknij aby oferować teleport temu Rezydentowi + </string> + <string name="TooltipAgentRequestFriend"> + Kliknij aby wysÅ‚ać temu Rezydentowi zaproszenie do Znajomych </string> <string name="TooltipGroupUrl"> Kliknij by zobaczyć opis tej grupy @@ -158,14 +215,33 @@ Kliknij by uruchomić secondlife:// command </string> <string name="CurrentURL" value=" Obecny Adres: [CurrentURL]"/> + <string name="TooltipPrice" value="L$[PRICE]-"/> <string name="SLurlLabelTeleport"> Teleportuj do </string> <string name="SLurlLabelShowOnMap"> Pokaż na Mapie </string> + <string name="SLappAgentMute"> + Zablokuj + </string> + <string name="SLappAgentUnmute"> + Cofnij zablokowanie + </string> + <string name="SLappAgentIM"> + IM + </string> + <string name="SLappAgentPay"> + ZapÅ‚ać + </string> + <string name="SLappAgentOfferTeleport"> + Teleportuj do + </string> + <string name="SLappAgentRequestFriend"> + Oferta znajomoÅ›ci + </string> <string name="BUTTON_CLOSE_DARWIN"> - Zamknij (⌘W) + Zamknij (⌘W) </string> <string name="BUTTON_CLOSE_WIN"> Zamknij (Ctrl+W) @@ -182,9 +258,6 @@ <string name="BUTTON_DOCK"> Przyłącz </string> - <string name="BUTTON_UNDOCK"> - Odłącz - </string> <string name="BUTTON_HELP"> Pokaż Pomoc </string> @@ -209,9 +282,6 @@ <string name="AvatarNameWaiting"> (Å‚adowanie) </string> - <string name="AvatarNameHippos"> - (hippos) - </string> <string name="GroupNameNone"> (brak danych) </string> @@ -320,6 +390,9 @@ <string name="symbolic link"> link </string> + <string name="symbolic folder link"> + link folderu + </string> <string name="AvatarAway"> Åšpi </string> @@ -572,6 +645,9 @@ <string name="hang_up"> Połączenie rozmowy utracone. </string> + <string name="reconnect_nearby"> + Przełączanie do pobliskich rozmów gÅ‚osowych + </string> <string name="ScriptQuestionCautionChatGranted"> '[OBJECTNAME]', wÅ‚aÅ›ciciel: '[OWNERNAME]', poÅ‚ożenie: [REGIONNAME] [REGIONPOS], pozwala Ci na: [PERMISSIONS]. </string> @@ -734,6 +810,9 @@ <string name="invalid"> niewÅ‚aÅ›ciwa funkcja </string> + <string name="NewWearable"> + Nowa [WEARABLE_ITEM] + </string> <string name="next"> NastÄ™pne </string> @@ -764,11 +843,8 @@ <string name="TeleportOffer"> Oferta teleportacji </string> - <string name="StartUpNotification"> - [%d] nowe zawiadomienie zostaÅ‚o wysÅ‚ane kiedy byÅ‚eÅ› w trybie oddalenia... - </string> <string name="StartUpNotifications"> - [%d] nowe zawiadomienia zostaÅ‚y wysÅ‚ane kiedy byÅ‚eÅ› w trybie oddalenia... + Nowe zawiadomienia zostaÅ‚y wysÅ‚ane kiedy byÅ‚eÅ› w trybie oddalenia... </string> <string name="OverflowInfoChannelString"> Masz jeszcze [%d] powiadomieÅ„ @@ -804,11 +880,13 @@ Wybierz ESC by powrócić do trybu widoku normalne </string> <string name="InventoryNoMatchingItems"> - Brak wyników w szafie dla wpisanego sÅ‚owa. + Obiektu nie znaleziono w Szafie. Spróbuj [secondlife:///app/search/groups "Search"]. + </string> + <string name="FavoritesNoMatchingItems"> + PrzeciÄ…gnij landmark tutaj aby dodać go do swoich ulubionych. </string> <string name="InventoryNoTexture"> - Nie posiadasz kopi -tej tekstury w swojej szafie + Nie posiadasz kopii tej tekstury w Twojej Szafie. </string> <string name="no_transfer" value=" (brak oddawania)"/> <string name="no_modify" value=" (brak modyfikowania)"/> @@ -823,6 +901,7 @@ tej tekstury w swojej szafie Brak zawartoÅ›ci </string> <string name="WornOnAttachmentPoint" value=" (zaÅ‚ożony na [ATTACHMENT_POINT])"/> + <string name="ActiveGesture" value="[GESLABEL] (aktywne)"/> <string name="Chat" value=" Czat :"/> <string name="Sound" value=" DźwiÄ™k :"/> <string name="Wait" value=" --- Zaczekaj :"/> @@ -916,6 +995,9 @@ tej tekstury w swojej szafie <string name="InvFolder My Outfits"> Moje Ubranie </string> + <string name="InvFolder Accessories"> + Akcesoria + </string> <string name="InvFolder Friends"> Znajomi </string> @@ -1266,11 +1348,164 @@ tej tekstury w swojej szafie wszystkie majÄ…tki, które nadzorujesz dla [OWNER] </string> <string name="RegionInfoAllowedResidents"> - Rezydenci majÄ…cy dostÄ™p: ([ALLOWEDAGENTS], max [MAXACCESS]) + Dozwoleni Rezydenci: ([ALLOWEDAGENTS], maks. [MAXACCESS]) </string> <string name="RegionInfoAllowedGroups"> Grupy majÄ…ce dostÄ™p: ([ALLOWEDGROUPS], max [MAXACCESS]) </string> + <string name="ScriptLimitsParcelScriptMemory"> + Pamięć Skryptów Parceli + </string> + <string name="ScriptLimitsParcelsOwned"> + Parcele: [PARCELS] + </string> + <string name="ScriptLimitsMemoryUsed"> + Pamięć wykorzystana: [COUNT] kb z [MAX] kb; [AVAILABLE] kb pozostaÅ‚o + </string> + <string name="ScriptLimitsMemoryUsedSimple"> + Pamięć wykorzystana: [COUNT] kb + </string> + <string name="ScriptLimitsParcelScriptURLs"> + Skrypty URL Parceli + </string> + <string name="ScriptLimitsURLsUsed"> + URL: [COUNT] z [MAX]; [AVAILABLE] dostÄ™pne + </string> + <string name="ScriptLimitsURLsUsedSimple"> + URL: [COUNT] + </string> + <string name="ScriptLimitsRequestError"> + Błąd wyszukiwania informacji + </string> + <string name="ScriptLimitsRequestNoParcelSelected"> + PosiadÅ‚ość nie zostaÅ‚a wybrana + </string> + <string name="ScriptLimitsRequestWrongRegion"> + Błąd: informacja o skrypcie jest dostÄ™pna tylko w obecnym regionie. + </string> + <string name="ScriptLimitsRequestWaiting"> + Wyszukiwanie informacji... + </string> + <string name="ScriptLimitsRequestDontOwnParcel"> + Nie masz pozwolenia na sprawdzenie parceli. + </string> + <string name="SITTING_ON"> + UsiÄ…dź na + </string> + <string name="ATTACH_CHEST"> + Klatka piersiowa + </string> + <string name="ATTACH_HEAD"> + GÅ‚owa + </string> + <string name="ATTACH_LSHOULDER"> + Lewe RamiÄ™ + </string> + <string name="ATTACH_RSHOULDER"> + RamiÄ™ Prawe + </string> + <string name="ATTACH_LHAND"> + RÄ™ka Lewa + </string> + <string name="ATTACH_RHAND"> + Prawa RÄ™ka + </string> + <string name="ATTACH_LFOOT"> + Lewa Stopa + </string> + <string name="ATTACH_RFOOT"> + Stopa Prawa + </string> + <string name="ATTACH_BACK"> + Plecy + </string> + <string name="ATTACH_PELVIS"> + Miednica + </string> + <string name="ATTACH_MOUTH"> + Usta + </string> + <string name="ATTACH_CHIN"> + Podbródek + </string> + <string name="ATTACH_LEAR"> + Ucho Lewe + </string> + <string name="ATTACH_REAR"> + Prawe Ucho + </string> + <string name="ATTACH_LEYE"> + Lewe Oko + </string> + <string name="ATTACH_REYE"> + Prawe Oko + </string> + <string name="ATTACH_NOSE"> + Nos + </string> + <string name="ATTACH_RUARM"> + RamiÄ™ P Górne + </string> + <string name="ATTACH_RLARM"> + Prawe dolne ramiÄ™ + </string> + <string name="ATTACH_LUARM"> + RamiÄ™ L Górne + </string> + <string name="ATTACH_LLARM"> + Lewe dolne ramiÄ™ + </string> + <string name="ATTACH_RHIP"> + Biodro prawe + </string> + <string name="ATTACH_RULEG"> + P Górna Noga + </string> + <string name="ATTACH_RLLEG"> + Noga P Dolna + </string> + <string name="ATTACH_LHIP"> + Biodro Lewe + </string> + <string name="ATTACH_LULEG"> + L Górna Noga + </string> + <string name="ATTACH_LLLEG"> + Noga L Dolna + </string> + <string name="ATTACH_BELLY"> + Brzuch + </string> + <string name="ATTACH_RPEC"> + Prawa klatka + </string> + <string name="ATTACH_LPEC"> + Lewa klatka + </string> + <string name="ATTACH_HUD_CENTER_2"> + HUD Åšrodek 2 + </string> + <string name="ATTACH_HUD_TOP_RIGHT"> + HUD P Górny + </string> + <string name="ATTACH_HUD_TOP_CENTER"> + HUD Åšrodek Górny + </string> + <string name="ATTACH_HUD_TOP_LEFT"> + HUD L Góra + </string> + <string name="ATTACH_HUD_CENTER_1"> + HUD Åšrodek 1 + </string> + <string name="ATTACH_HUD_BOTTOM_LEFT"> + HUD Dolna L Strona + </string> + <string name="ATTACH_HUD_BOTTOM"> + HUD Dolny + </string> + <string name="ATTACH_HUD_BOTTOM_RIGHT"> + HUD Dolna P Strona + </string> <string name="CursorPos"> Linia [LINE], Kolumna [COLUMN] </string> @@ -1280,11 +1515,17 @@ tej tekstury w swojej szafie <string name="PanelContentsNewScript"> Nowy Skrypt </string> + <string name="PanelContentsTooltip"> + Zawartość obiektu + </string> + <string name="BusyModeResponseDefault"> + Rezydent, do którego wysÅ‚aÅ‚eÅ› wiadomość prywatnÄ… znajduje siÄ™ w trybie pracy. Oznacza to, iż Twoja wiadomość zostanie zapisana do przeglÄ…dniÄ™cia poźniej. + </string> <string name="MuteByName"> (wedÅ‚ug nazwy) </string> <string name="MuteAgent"> - (rezydenta) + (Rezydent) </string> <string name="MuteObject"> (obiekt) @@ -1315,6 +1556,15 @@ tej tekstury w swojej szafie <string name="ClassifiedUpdateAfterPublish"> (zostanie zaktualizowane po publikacji) </string> + <string name="NoPicksClassifiedsText"> + Nie dodaÅ‚eÅ› nic do Ulubionych i Reklam. Kliknij na poniższy przycisk Dodaj aby dodać miejsce do Ulubionych lub Reklamy. + </string> + <string name="NoAvatarPicksClassifiedsText"> + Użytkownik nie posiada Ulubionych lub Reklam + </string> + <string name="PicksClassifiedsLoadingText"> + Åadowanie... + </string> <string name="MultiPreviewTitle"> PodglÄ…d </string> @@ -1385,22 +1635,36 @@ tej tekstury w swojej szafie Anuluj </string> <string name="UploadingCosts"> - Koszty zaÅ‚adowania [%s] + ZaÅ‚adowanie [NAME] kosztuje [AMOUNT]L$ + </string> + <string name="BuyingCosts"> + Cena zakupu tego wynosi L$ [AMOUNT] </string> <string name="UnknownFileExtension"> Nieznane rozszerzenie dla pliku [.%s] Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh </string> + <string name="MuteObject2"> + Zablokuj + </string> <string name="AddLandmarkNavBarMenu"> Dodaj Ulubione Miejsce... </string> <string name="EditLandmarkNavBarMenu"> Edytuj Ulubione Miejce... </string> - <string name="accel-mac-control">⌃</string> - <string name="accel-mac-command">⌘</string> - <string name="accel-mac-option">⌥</string> - <string name="accel-mac-shift">⇧</string> + <string name="accel-mac-control"> + ⌃ + </string> + <string name="accel-mac-command"> + ⌘ + </string> + <string name="accel-mac-option"> + ⌥ + </string> + <string name="accel-mac-shift"> + ⇧ + </string> <string name="accel-win-control"> Ctrl+ </string> @@ -1638,43 +1902,25 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj siÄ™ z [SUPPORT_SITE]. CieÅ„ o godzinie 5 </string> <string name="All White"> - Wszystko BiaÅ‚e + Wszystko biaÅ‚e </string> <string name="Anime Eyes"> - Animuj Oczy + Animuj oczy </string> <string name="Arced"> Obrócony </string> <string name="Arm Length"> - DÅ‚ugość Ramienia + DÅ‚ugość ramienia </string> <string name="Attached"> Dołączone </string> <string name="Attached Earlobes"> - PÅ‚atki Uszu Dołączone - </string> - <string name="Back Bangs"> - Tylnie Pasemka - </string> - <string name="Back Bangs Down"> - Tylnie Pasemka w Dół - </string> - <string name="Back Bangs Up"> - Tylnie Pasemka do Góry + PÅ‚atki uszu dołączone </string> <string name="Back Fringe"> - Tylnia Grzywka - </string> - <string name="Back Hair"> - Back Hair - </string> - <string name="Back Hair Down"> - Back Hair Down - </string> - <string name="Back Hair Up"> - Back Hair Up + Tylnia grzywka </string> <string name="Baggy"> Wypchane @@ -1682,12 +1928,6 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj siÄ™ z [SUPPORT_SITE]. <string name="Bangs"> Pasemka </string> - <string name="Bangs Down"> - Pasemka w Dół - </string> - <string name="Bangs Up"> - Pasemka do Góry - </string> <string name="Beady Eyes"> Oczy ZaÅ‚zawione </string> @@ -1700,17 +1940,14 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj siÄ™ z [SUPPORT_SITE]. <string name="Big Butt"> Duży PoÅ›ladek </string> - <string name="Big Eyeball"> - Duża GaÅ‚ka Oczna - </string> <string name="Big Hair Back"> - Duże WÅ‚osy: z TyÅ‚u + Duże WÅ‚osy: z tyÅ‚u </string> <string name="Big Hair Front"> - Duże WÅ‚osy: z Przodu + Duże WÅ‚osy: z przodu </string> <string name="Big Hair Top"> - Duże WÅ‚osy: z Góry + Duże WÅ‚osy: z góry </string> <string name="Big Head"> Duża GÅ‚owa @@ -1728,22 +1965,22 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj siÄ™ z [SUPPORT_SITE]. Blond </string> <string name="Blonde Hair"> - WÅ‚osy Koloru Blond + WÅ‚osy Blond </string> <string name="Blush"> Rumieniec </string> <string name="Blush Color"> - Kolor RumieÅ„ca + Kolor rumieÅ„ca </string> <string name="Blush Opacity"> - Intensywność RumieÅ„ca + Intensywność rumieÅ„ca </string> <string name="Body Definition"> - Detale CiaÅ‚a + Detale ciaÅ‚a </string> <string name="Body Fat"> - Zawartość Tkanki TÅ‚uszczowej + Zawartość tkanki tÅ‚uszczowej </string> <string name="Body Freckles"> Piegi @@ -1761,13 +1998,13 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj siÄ™ z [SUPPORT_SITE]. Bow Legged </string> <string name="Breast Buoyancy"> - JÄ™drność Piersi + JÄ™drność piersi </string> <string name="Breast Cleavage"> - OdstÄ™p MiÄ™dzy Piersiami + OdstÄ™p miÄ™dzy piersiami </string> <string name="Breast Size"> - Rozmiar Piersi + Rozmiar piersi </string> <string name="Bridge Width"> Szerokość @@ -1776,7 +2013,7 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj siÄ™ z [SUPPORT_SITE]. Szerokie </string> <string name="Brow Size"> - Rozmiar CzoÅ‚a + Rozmiar czoÅ‚a </string> <string name="Bug Eyes"> Bug Eyes @@ -1812,34 +2049,34 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj siÄ™ z [SUPPORT_SITE]. Chaplin </string> <string name="Cheek Bones"> - KoÅ›ci Policzkowe + KoÅ›ci policzkowe </string> <string name="Chest Size"> - Rozmiar Klatki Piersiowej + Rozmiar klatki piersiowej </string> <string name="Chin Angle"> - KÄ…t Podbródka + KÄ…t podbródka </string> <string name="Chin Cleft"> - DoÅ‚ek w Podbródku + DoÅ‚ek w podbródku </string> <string name="Chin Curtains"> - ZasÅ‚oniÄ™cie Podbródka + ZasÅ‚oniÄ™cie podbródka </string> <string name="Chin Depth"> - DÅ‚ugość Podbródka + DÅ‚ugość podbródka </string> <string name="Chin Heavy"> - Ciężar Podbródka + Ciężar podbródka </string> <string name="Chin In"> - Podbródek WewnÄ…trz + Podbródek wewnÄ…trz </string> <string name="Chin Out"> - Podbródek ZewnÄ™trzny + Podbródek zewnÄ™trzny </string> <string name="Chin-Neck"> - Podwójny Podbródek + Podwójny podbródek </string> <string name="Clear"> Wyczyść @@ -1854,32 +2091,29 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj siÄ™ z [SUPPORT_SITE]. ZamkniÄ™te </string> <string name="Closed Back"> - ZamkniÄ™te z TyÅ‚u + ZamkniÄ™te z tyÅ‚u </string> <string name="Closed Front"> - ZamkniÄ™te z Przodu + ZamkniÄ™te z przodu </string> <string name="Closed Left"> - Lewe Oko ZamkniÄ™te + Lewe Oko zamkniÄ™te </string> <string name="Closed Right"> - Prawe Oko ZamkniÄ™te + Prawe Oko zamkniÄ™te </string> <string name="Coin Purse"> Coin Purse </string> <string name="Collar Back"> - KoÅ‚nierz z TyÅ‚u + KoÅ‚nierz z tyÅ‚u </string> <string name="Collar Front"> - KoÅ‚nierz z Przodu + KoÅ‚nierz z przodu </string> <string name="Corner Down"> Corner Down </string> - <string name="Corner Normal"> - Corner Normal - </string> <string name="Corner Up"> Corner Up </string> @@ -1887,10 +2121,7 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj siÄ™ z [SUPPORT_SITE]. Pognieciony </string> <string name="Crooked Nose"> - Skrzywienie Nosa - </string> - <string name="Cropped Hair"> - PrzyciÄ™te WÅ‚osy + Skrzywienie nosa </string> <string name="Cuff Flare"> Cuff Flare @@ -1899,7 +2130,7 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj siÄ™ z [SUPPORT_SITE]. Ciemne </string> <string name="Dark Green"> - Ciemne Zielone + Ciemne zielone </string> <string name="Darker"> Ciemniejsze @@ -1910,17 +2141,11 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj siÄ™ z [SUPPORT_SITE]. <string name="Default Heels"> DomyÅ›lne Buty na Obcasie </string> - <string name="Default Toe"> - DomyÅ›lny Palec - </string> <string name="Dense"> GÄ™stość </string> - <string name="Dense hair"> - GÄ™ste WÅ‚osy - </string> <string name="Double Chin"> - Podwójny Podbródek + Podwójny podbródek </string> <string name="Downturned"> Downturned @@ -1929,61 +2154,58 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj siÄ™ z [SUPPORT_SITE]. Duffle Bag </string> <string name="Ear Angle"> - Odstawanie Uszu + Odstawanie uszu </string> <string name="Ear Size"> - Rozmiar Uszu + Rozmiar uszu </string> <string name="Ear Tips"> - WierzchoÅ‚ki Uszu + WierzchoÅ‚ki uszu </string> <string name="Egg Head"> - Jajowata GÅ‚owa + Jajowata gÅ‚owa </string> <string name="Eye Bags"> - Woreczek Åzowy + Woreczek Å‚zowy </string> <string name="Eye Color"> - Kolor Oczu + Kolor oczu </string> <string name="Eye Depth"> - Głębokość Osadzenia Oczu + Głębokość osadzenia oczu </string> <string name="Eye Lightness"> - Ustawienie JasnoÅ›ci Oczu + Ustawienie jasnoÅ›ci oczu </string> <string name="Eye Opening"> - Oczy Otwarte + Oczy otwarte </string> <string name="Eye Pop"> - Różnica w WielkoÅ›ci Oczu + Różnica w wielkoÅ›ci oczu </string> <string name="Eye Size"> - Rozmiar Oczu + Rozmiar oczu </string> <string name="Eye Spacing"> - Rozstaw Oczu - </string> - <string name="Eyeball Size"> - Wielkość GaÅ‚ki Ocznej + Rozstaw oczu </string> <string name="Eyebrow Arc"> - Åuk Brwiowy + Åuk brwiowy </string> <string name="Eyebrow Density"> - GÄ™stość Brwi + GÄ™stość brwi </string> <string name="Eyebrow Height"> - Wysokość Brwi + Wysokość brwi </string> <string name="Eyebrow Points"> - KsztaÅ‚t Brwi + KsztaÅ‚t brwi </string> <string name="Eyebrow Size"> - Rozmiar Brwi + Rozmiar brwi </string> <string name="Eyelash Length"> - DÅ‚ugość RzÄ™s + DÅ‚ugość rzÄ™s </string> <string name="Eyeliner"> Eyeliner @@ -1991,68 +2213,20 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj siÄ™ z [SUPPORT_SITE]. <string name="Eyeliner Color"> Kolor Eyeliner'a </string> - <string name="Eyes Back"> - Eyes Back - </string> <string name="Eyes Bugged"> Eyes Bugged </string> - <string name="Eyes Forward"> - Eyes Forward - </string> - <string name="Eyes Long Head"> - Eyes Long Head - </string> - <string name="Eyes Shear Left Up"> - Eyes Shear Left Up - </string> - <string name="Eyes Shear Right Up"> - Eyes Shear Right Up - </string> - <string name="Eyes Short Head"> - Eyes Short Head - </string> - <string name="Eyes Spread"> - Rozmieszczenie Oczu - </string> - <string name="Eyes Sunken"> - Eyes Sunken - </string> - <string name="Eyes Together"> - Oczy Razem - </string> <string name="Face Shear"> - UsuniÄ™cie Twarzy + UsuniÄ™cie twarzy </string> <string name="Facial Definition"> - Detale Twarzy + Detale twarzy </string> <string name="Far Set Eyes"> Far Set Eyes </string> - <string name="Fat"> - Grubość - </string> - <string name="Fat Head"> - Gruba GÅ‚owa - </string> <string name="Fat Lips"> - Grube Usta - </string> - <string name="Fat Lower"> - Fat Lower - </string> - <string name="Fat Lower Lip"> - Fat Lower Lip - </string> - <string name="Fat Torso"> - Gruby Tułów - </string> - <string name="Fat Upper"> - Fat Upper - </string> - <string name="Fat Upper Lip"> - Fat Upper Lip + Grube usta </string> <string name="Female"> Kobieta @@ -2064,64 +2238,49 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj siÄ™ z [SUPPORT_SITE]. Palce </string> <string name="Flared Cuffs"> - Flared Cuffs + Rozszerzane rÄ™kawy </string> <string name="Flat"> PÅ‚askość </string> <string name="Flat Butt"> - PÅ‚askie PoÅ›ladki + PÅ‚askie poÅ›ladki </string> <string name="Flat Head"> - PÅ‚aska GÅ‚owa + PÅ‚aska gÅ‚owa </string> <string name="Flat Toe"> - PÅ‚aski Palec + PÅ‚aski palec </string> <string name="Foot Size"> - Rozmiar Stopy + Rozmiar stopy </string> <string name="Forehead Angle"> - KsztaÅ‚t CzoÅ‚a + KsztaÅ‚t czoÅ‚a </string> <string name="Forehead Heavy"> - Ciężar CzoÅ‚a + Ciężar czoÅ‚a </string> <string name="Freckles"> Piegi </string> - <string name="Front Bangs Down"> - Przednie Pasemka w Dół - </string> - <string name="Front Bangs Up"> - Przednie Pasemka do Góry - </string> <string name="Front Fringe"> Przednia Grzywka </string> - <string name="Front Hair"> - Front Hair - </string> - <string name="Front Hair Down"> - Front Hair Down - </string> - <string name="Front Hair Up"> - Przednie WÅ‚osy do Góry - </string> <string name="Full Back"> - GÄ™stość WÅ‚osów po Bokach + GÄ™stość wÅ‚osów po bokach </string> <string name="Full Eyeliner"> - GÄ™sty Eyeliner + GÄ™sta kredka do oczu </string> <string name="Full Front"> - GÄ™sty Przód + GÄ™sty przód </string> <string name="Full Hair Sides"> - GÄ™ste WÅ‚osy po Bokach + GÄ™ste wÅ‚osy po bokach </string> <string name="Full Sides"> - GÄ™ste Boki + GÄ™ste boki </string> <string name="Glossy"> BÅ‚yszczÄ…ce @@ -2130,64 +2289,64 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj siÄ™ z [SUPPORT_SITE]. RÄ™kawiczki </string> <string name="Glove Length"> - DÅ‚ugość RÄ™kawiczek + DÅ‚ugość rÄ™kawiczek </string> <string name="Hair"> WÅ‚osy </string> <string name="Hair Back"> - WÅ‚osy: z TyÅ‚u + WÅ‚osy: z tyÅ‚u </string> <string name="Hair Front"> - WÅ‚osy: z Przodu + WÅ‚osy: z przodu </string> <string name="Hair Sides"> - Hair: Boki + WÅ‚osy: boki </string> <string name="Hair Sweep"> - Kierunek Zaczesania + Kierunek zaczesania </string> <string name="Hair Thickess"> - Grubość WÅ‚osów + Grubość wÅ‚osów </string> <string name="Hair Thickness"> - Grubość WÅ‚osów + Grubość wÅ‚osów </string> <string name="Hair Tilt"> - PrzesuniÄ™cie Fryzury + Przes. fryzury </string> <string name="Hair Tilted Left"> - PrzesuniÄ™cie Fryzury w Lewo + Przes. fryzury L </string> <string name="Hair Tilted Right"> - PrzesuniÄ™cie Fryzury w Prawo + Przes. fryzury P </string> <string name="Hair Volume"> - WÅ‚osy: ObjÄ™tość + WÅ‚osy: objÄ™tość </string> <string name="Hand Size"> - Rozmiar DÅ‚oni + Rozmiar dÅ‚oni </string> <string name="Handlebars"> Handlebars </string> <string name="Head Length"> - DÅ‚ugość GÅ‚owy + DÅ‚ugość gÅ‚owy </string> <string name="Head Shape"> - KsztaÅ‚t GÅ‚owy + KsztaÅ‚t gÅ‚owy </string> <string name="Head Size"> - Rozmiar GÅ‚owy + Rozmiar gÅ‚owy </string> <string name="Head Stretch"> - RozciÄ…gniÄ™cie GÅ‚owy + RozciÄ…gniÄ™cie gÅ‚owy </string> <string name="Heel Height"> - Wysokość Obcasa + Wysokość obcasa </string> <string name="Heel Shape"> - Ksztalt Obcasa + Ksztalt obcasa </string> <string name="Height"> Wysokość @@ -2196,7 +2355,7 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj siÄ™ z [SUPPORT_SITE]. Wysoka </string> <string name="High Heels"> - Wysokie Obcasy + Wysokie obcasy </string> <string name="High Jaw"> High Jaw @@ -2211,34 +2370,34 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj siÄ™ z [SUPPORT_SITE]. Wyżej </string> <string name="Hip Length"> - DÅ‚ugość Bioder + DÅ‚ugość bioder </string> <string name="Hip Width"> - Szerokość Bioder + Szerokość bioder </string> <string name="In"> W </string> <string name="In Shdw Color"> - WewnÄ™trzny Kolor Cienia + WewnÄ™trzny kolor cienia </string> <string name="In Shdw Opacity"> - WewnÄ™trzna Intensywność Cienia + WewnÄ™trzna intensywność cienia </string> <string name="Inner Eye Corner"> - WenwÄ™trzny Bok Oka + WenwÄ™trzny bok oka </string> <string name="Inner Eye Shadow"> - WewnÄ™trzny CieÅ„ Oka + WewnÄ™trzny cieÅ„ oka </string> <string name="Inner Shadow"> - WewnÄ™trzny CieÅ„ + WewnÄ™trzny cieÅ„ </string> <string name="Jacket Length"> - DÅ‚ugość Kurtki + DÅ‚ugość kurtki </string> <string name="Jacket Wrinkles"> - Zmarszczki na Kurtce + Zmarszczki na kurtce </string> <string name="Jaw Angle"> Jaw Angle @@ -2256,7 +2415,7 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj siÄ™ z [SUPPORT_SITE]. Jowls </string> <string name="Knee Angle"> - KÄ…t Kolana + KÄ…t kolana </string> <string name="Knock Kneed"> Knock Kneed @@ -2265,22 +2424,22 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj siÄ™ z [SUPPORT_SITE]. Duże </string> <string name="Large Hands"> - Duże DÅ‚onie + Duże dÅ‚onie </string> <string name="Left Part"> Left Part </string> <string name="Leg Length"> - DÅ‚ugość Nogi + DÅ‚ugość nogi </string> <string name="Leg Muscles"> - Umięśnione Nogi + Umięśnione nogi </string> <string name="Less"> Mniej </string> <string name="Less Body Fat"> - Mniejsza ZawartoÅ›ci Tkanki TÅ‚uszczowej + Mniejsza zawartoÅ›ci tkanki tÅ‚uszczowej </string> <string name="Less Curtains"> Less Curtains @@ -2289,7 +2448,7 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj siÄ™ z [SUPPORT_SITE]. Mniej Piegów </string> <string name="Less Full"> - Less Full + Mniej PeÅ‚ne </string> <string name="Less Gravity"> Mniej Ciężaru @@ -2298,25 +2457,25 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj siÄ™ z [SUPPORT_SITE]. Less Love </string> <string name="Less Muscles"> - Mniej Mięśni + Mniej mięśni </string> <string name="Less Muscular"> - Mniej Umięśnienia + Mniej umięśnienia </string> <string name="Less Rosy"> Less Rosy </string> <string name="Less Round"> - Mniej ZaaokrÄ…glone + Mniej zaaokrÄ…glone </string> <string name="Less Saddle"> Less Saddle </string> <string name="Less Square"> - Mniej Kwadratowe + Mniej kwadratowe </string> <string name="Less Volume"> - Mniej ObjÄ™toÅ›ci + Mniej objÄ™toÅ›ci </string> <string name="Less soul"> Less soul @@ -2325,25 +2484,25 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj siÄ™ z [SUPPORT_SITE]. Lżejsze </string> <string name="Lip Cleft"> - Szerokość Rozszczepienia Górnej Wargi + Szerokość Rozszczepienia górnej wargi </string> <string name="Lip Cleft Depth"> - Głębokość Rozszczepienia Górnej Wargi + Głębokość rozszczepienia górnej wargi </string> <string name="Lip Fullness"> - PeÅ‚ność Ust + PeÅ‚ne usta </string> <string name="Lip Pinkness"> - Róż Ust + Róż ust </string> <string name="Lip Ratio"> - Proporcje Ust + Proporcje ust </string> <string name="Lip Thickness"> - Grubość Ust + Grubość ust </string> <string name="Lip Width"> - Szerokość Ust + Szerokość ust </string> <string name="Lipgloss"> PoÅ‚ysk @@ -2352,46 +2511,43 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj siÄ™ z [SUPPORT_SITE]. Szminka </string> <string name="Lipstick Color"> - Kolor Szminki + Kolor szminki </string> <string name="Long"> Dlugość </string> <string name="Long Head"> - DÅ‚uga GÅ‚owa + DÅ‚uga gÅ‚owa </string> <string name="Long Hips"> - DÅ‚ugie Biodra + DÅ‚ugie biodra </string> <string name="Long Legs"> - DÅ‚ugie Nogi + DÅ‚ugie nogi </string> <string name="Long Neck"> - DÅ‚ugi Kark + DÅ‚ugi kark </string> <string name="Long Pigtails"> - DÅ‚ugi Warkocz + DÅ‚ugi warkocz </string> <string name="Long Ponytail"> - DÅ‚ugi Kucyk + DÅ‚ugi kucyk </string> <string name="Long Torso"> - DÅ‚ugi Tułów + DÅ‚ugi tułów </string> <string name="Long arms"> - Dlugie Ramiona - </string> - <string name="Longcuffs"> - DÅ‚ugie RÄ™kawy + Dlugie ramiona </string> <string name="Loose Pants"> - Luźne Spodnie + Luźne spodnie </string> <string name="Loose Shirt"> - Luźna Koszulka + Luźna koszulka </string> <string name="Loose Sleeves"> - Luźne RÄ™kawy + Luźne rÄ™kawy </string> <string name="Love Handles"> Love Handles @@ -2400,16 +2556,16 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj siÄ™ z [SUPPORT_SITE]. Nisko </string> <string name="Low Heels"> - Niskie Obcasy + Niskie obcasy </string> <string name="Low Jaw"> - Niska SzczÄ™ka + Niska szczÄ™ka </string> <string name="Low Platforms"> Low Platforms </string> <string name="Low and Loose"> - Niskie i Luźne + Niskie i luźne </string> <string name="Lower"> Niżej @@ -2424,7 +2580,7 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj siÄ™ z [SUPPORT_SITE]. Mężczyzna </string> <string name="Middle Part"> - Część Åšrodkowa + Część Å›rodkowa </string> <string name="More"> WiÄ™cej @@ -2433,7 +2589,7 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj siÄ™ z [SUPPORT_SITE]. More Blush </string> <string name="More Body Fat"> - WiÄ™cej ZawartoÅ›ci Tkanki TÅ‚uszczowej + WiÄ™cej zawartoÅ›ci tkanki tÅ‚uszczowej </string> <string name="More Curtains"> More Curtains @@ -2442,34 +2598,34 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj siÄ™ z [SUPPORT_SITE]. More Eyeshadow </string> <string name="More Freckles"> - WiÄ™cej Piegów + WiÄ™cej piegów </string> <string name="More Full"> More Full </string> <string name="More Gravity"> - WiÄ™cej Ciężaru + WiÄ™cej ciężaru </string> <string name="More Lipstick"> - WiÄ™cej Szminki + WiÄ™cej szminki </string> <string name="More Love"> More Love </string> <string name="More Lower Lip"> - WiÄ™cej Dolnej Wargi + WiÄ™cej dolnej wargi </string> <string name="More Muscles"> - WiÄ™cej Mięśni + WiÄ™cej mięśni </string> <string name="More Muscular"> - WiÄ™cej Umięśnienia + WiÄ™cej umięśnienia </string> <string name="More Rosy"> More Rosy </string> <string name="More Round"> - WiÄ™cej ZaokrÄ…glenia + WiÄ™cej zaokrÄ…glenia </string> <string name="More Saddle"> More Saddle @@ -2478,16 +2634,16 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj siÄ™ z [SUPPORT_SITE]. More Sloped </string> <string name="More Square"> - WiÄ™cej Kwadratowy + WiÄ™cej kwadratowy </string> <string name="More Upper Lip"> - WiÄ™cej Górnej Wargi + WiÄ™cej górnej wargi </string> <string name="More Vertical"> More Vertical </string> <string name="More Volume"> - WiÄ™cej ObjÄ™toÅ›ci + WiÄ™cej objÄ™toÅ›ci </string> <string name="More soul"> More soul @@ -2511,10 +2667,10 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj siÄ™ z [SUPPORT_SITE]. Mutton Chops </string> <string name="Nail Polish"> - Lakier na Paznokciach + Lakier na paznokciach </string> <string name="Nail Polish Color"> - Kolor Lakieru na Paznokciach + Kolor lakieru na paznokciach </string> <string name="Narrow"> WÄ…skie @@ -2532,10 +2688,10 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj siÄ™ z [SUPPORT_SITE]. Naturalne </string> <string name="Neck Length"> - DÅ‚ugość Karku + DÅ‚ugość karku </string> <string name="Neck Thickness"> - Grubość Karku + Grubość karku </string> <string name="No Blush"> No Blush @@ -2544,70 +2700,64 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj siÄ™ z [SUPPORT_SITE]. Brak Eyeliner's </string> <string name="No Eyeshadow"> - Brak Cienia pod PowiekÄ… - </string> - <string name="No Heels"> - Brak Obcasów + Brak cienia pod powiekÄ… </string> <string name="No Lipgloss"> - Brak PoÅ‚ysku + Brak poÅ‚ysku </string> <string name="No Lipstick"> - Brak Szminki + Brak szminki </string> <string name="No Part"> No Part </string> <string name="No Polish"> - Brak Lakieru + Brak lakieru </string> <string name="No Red"> - Brak Czerwieni + Brak czerwieni </string> <string name="No Spikes"> - Brak Szpiców + Brak szpiców </string> <string name="No White"> - Brak BiaÅ‚ego + Brak biaÅ‚ego </string> <string name="No Wrinkles"> - Brak Zmarszczek + Brak zmarszczek </string> <string name="Normal Lower"> - Dół Normalny + Dół normalny </string> <string name="Normal Upper"> - Góra Normalna + Góra normalna </string> <string name="Nose Left"> - Nos w StronÄ™ LewÄ… + Nos w stronÄ™ lewÄ… </string> <string name="Nose Right"> - Nos w StronÄ™ PrawÄ… + Nos w stronÄ™ prawÄ… </string> <string name="Nose Size"> - Rozmiar Nosa + Rozmiar nosa </string> <string name="Nose Thickness"> - Grubość Nosa + Grubość nosa </string> <string name="Nose Tip Angle"> - KÄ…t Czubka Nosa + KÄ…t czubka nosa </string> <string name="Nose Tip Shape"> - KsztaÅ‚t Czubka Nosa + KsztaÅ‚t czubka nosa </string> <string name="Nose Width"> - Szerokość Nosa + Szerokość nosa </string> <string name="Nostril Division"> - Przegroda Nosa + Przegroda nosa </string> <string name="Nostril Width"> - Wielkość Dziurek w Nosie - </string> - <string name="Old"> - Stare + Wielkość dziurek w nosie </string> <string name="Opaque"> Intensywność @@ -2616,16 +2766,16 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj siÄ™ z [SUPPORT_SITE]. Otwarte </string> <string name="Open Back"> - Otwarte z TyÅ‚u + Otwarte z tyÅ‚u </string> <string name="Open Front"> - Otwarte z Przodu + Otwarte z przodu </string> <string name="Open Left"> - Otwarte z Lewej + Otwarte z lewej </string> <string name="Open Right"> - Otwarte z Prawej + Otwarte z prawej </string> <string name="Orange"> PomaraÅ„czowe @@ -2634,19 +2784,19 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj siÄ™ z [SUPPORT_SITE]. ZewnÄ™trznie </string> <string name="Out Shdw Color"> - ZewnÄ™trzny Kolor Cienia + ZewnÄ™trzny kolor cienia </string> <string name="Out Shdw Opacity"> - ZewnÄ™trzna Grubość Cienia + ZewnÄ™trzna grubość cienia </string> <string name="Outer Eye Corner"> - ZewnÄ™trzny Bok Oka + ZewnÄ™trzny bok oka </string> <string name="Outer Eye Shadow"> - ZewnÄ™trzny CieÅ„ Oka + ZewnÄ™trzny cieÅ„ oka </string> <string name="Outer Shadow"> - ZewnÄ™trzny CieÅ„ + ZewnÄ™trzny cieÅ„ </string> <string name="Overbite"> Overbite @@ -2655,25 +2805,25 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj siÄ™ z [SUPPORT_SITE]. Package </string> <string name="Painted Nails"> - Pomalowane Paznokcie + Pomalowane paznokcie </string> <string name="Pale"> Pale </string> <string name="Pants Crotch"> - Krocze Spodni + Krocze spodni </string> <string name="Pants Fit"> Pants Fit </string> <string name="Pants Length"> - DÅ‚ugość Spodni + DÅ‚ugość spodni </string> <string name="Pants Waist"> - Talia Spodni + Talia spodni </string> <string name="Pants Wrinkles"> - Zmarszczki Spodni + Zmarszczki spodni </string> <string name="Part"> Część @@ -2682,7 +2832,7 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj siÄ™ z [SUPPORT_SITE]. Part Bangs </string> <string name="Pectorals"> - Mięśnie Klatki Piersiowej + Mięśnie klatki piersiowej </string> <string name="Pigment"> Pigment @@ -2708,9 +2858,6 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj siÄ™ z [SUPPORT_SITE]. <string name="Pointy Heels"> Pointy Heels </string> - <string name="Pointy Toe"> - Pointy Toe - </string> <string name="Ponytail"> Kucyk </string> @@ -2735,27 +2882,18 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj siÄ™ z [SUPPORT_SITE]. <string name="Red Hair"> Czerwone WÅ‚osy </string> - <string name="Red Skin"> - Czerwona Skóra - </string> <string name="Regular"> Regularne </string> - <string name="Regular Muscles"> - Regularne Mięśnie - </string> <string name="Right Part"> - Prawa Cześć + Prawa część </string> <string name="Rosy Complexion"> - Kompleksowość Różu + Kompleksowość różu </string> <string name="Round"> ZaokrÄ…glenie </string> - <string name="Round Forehead"> - ZaokrÄ…glenie na Czole - </string> <string name="Ruddiness"> Rudowatość </string> @@ -2768,62 +2906,44 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj siÄ™ z [SUPPORT_SITE]. <string name="Saddle Bags"> Saddle Bags </string> - <string name="Saddlebags"> - Saddlebags - </string> - <string name="Scrawny"> - Scrawny - </string> <string name="Scrawny Leg"> Scrawny Leg </string> <string name="Separate"> Odzielne </string> - <string name="Shading"> - Cieniowanie - </string> - <string name="Shadow hair"> - Cieniowane WÅ‚osy - </string> <string name="Shallow"> PÅ‚ytkie </string> <string name="Shear Back"> - Tylne UsuniÄ™cie WÅ‚osów + Tylne usuniÄ™cie wÅ‚osów </string> <string name="Shear Face"> - UsuniÄ™cie Twarzy + UsuniÄ™cie twarzy </string> <string name="Shear Front"> - Przednie UsuniÄ™cie WÅ‚osów - </string> - <string name="Shear Left"> - UsuniÄ™cie z Lewej Strony + Przednie usuniÄ™cie wÅ‚osów </string> <string name="Shear Left Up"> - UsuniÄ™cie od Lewej Strony do Góry - </string> - <string name="Shear Right"> - UsuniÄ™cie z Prawej Strony + UsuniÄ™cie od lewej strony do góry </string> <string name="Shear Right Up"> - UsuniÄ™cie od Prawej Strony do Góry + UsuniÄ™cie od prawej strony do góry </string> <string name="Sheared Back"> - Tylnie UsuniÄ™cie WÅ‚osów + Tylnie usuniÄ™cie wÅ‚osów </string> <string name="Sheared Front"> - Przednie UsuniÄ™cie WÅ‚osów + Przednie usuniÄ™cie wÅ‚osów </string> <string name="Shift Left"> - PrzesuÅ„ w Lewo + PrzesuÅ„ w lewo </string> <string name="Shift Mouth"> - PrzesuÅ„ Usta + PrzesuÅ„ usta </string> <string name="Shift Right"> - PrzesuÅ„ w Prawo + PrzesuÅ„ w prawo </string> <string name="Shirt Bottom"> Dolna Część Koszulki @@ -2832,22 +2952,22 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj siÄ™ z [SUPPORT_SITE]. Shirt Fit </string> <string name="Shirt Wrinkles"> - Zmarszczki na Koszulce + Zmarszczki na koszulce </string> <string name="Shoe Height"> - Wysokość Buta + Wysokość buta </string> <string name="Short"> Krótkie </string> <string name="Short Arms"> - Krótkie Ramiona + Krótkie ramiona </string> <string name="Short Legs"> - Krótkie Nogi + Krótkie nogi </string> <string name="Short Neck"> - Krótki Kark + Krótki kark </string> <string name="Short Pigtails"> Short Pigtails @@ -2859,25 +2979,16 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj siÄ™ z [SUPPORT_SITE]. Krótkie Baczki </string> <string name="Short Torso"> - Krótki Tułów + Krótki tułów </string> <string name="Short hips"> - Krótkie Biodra + Krótkie biodra </string> <string name="Shoulders"> Ramiona </string> - <string name="Side Bangs"> - Boczne Pasemka - </string> - <string name="Side Bangs Down"> - Boczne Pasemka w Dół - </string> - <string name="Side Bangs Up"> - Boczne Pasemka do Góry - </string> <string name="Side Fringe"> - Boczna Grzywka + Boczna grzywka </string> <string name="Sideburns"> Baczki @@ -2891,9 +3002,6 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj siÄ™ z [SUPPORT_SITE]. <string name="Sides Hair Up"> Boczne WÅ‚osy do Góry </string> - <string name="Skinny"> - SmukÅ‚ość - </string> <string name="Skinny Neck"> SmukÅ‚y Kark </string> @@ -2901,16 +3009,16 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj siÄ™ z [SUPPORT_SITE]. Skirt Fit </string> <string name="Skirt Length"> - DÅ‚ugość Spódnicy + DÅ‚ugość spódnicy </string> <string name="Slanted Forehead"> - UkoÅ›ne CzoÅ‚o + UkoÅ›ne czoÅ‚o </string> <string name="Sleeve Length"> - DÅ‚ugość RÄ™kawów + DÅ‚ugość rÄ™kawów </string> <string name="Sleeve Looseness"> - Luźność RÄ™kawów + Luźność rÄ™kawów </string> <string name="Slit Back"> Slit: Back @@ -2928,22 +3036,19 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj siÄ™ z [SUPPORT_SITE]. MaÅ‚e </string> <string name="Small Hands"> - MaÅ‚e DÅ‚onie + MaÅ‚e dÅ‚onie </string> <string name="Small Head"> - MaÅ‚a GÅ‚owa + MaÅ‚a gÅ‚owa </string> <string name="Smooth"> GÅ‚adkie </string> <string name="Smooth Hair"> - GÅ‚adkie WÅ‚osy + GÅ‚adkie wÅ‚osy </string> <string name="Socks Length"> - DÅ‚ugość Skarpetek - </string> - <string name="Some"> - Some + DÅ‚ugość skarpetek </string> <string name="Soulpatch"> Soulpatch @@ -2958,16 +3063,13 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj siÄ™ z [SUPPORT_SITE]. Kwadratowe </string> <string name="Square Toe"> - Kwadratowy Palec + Kwadratowy palec </string> <string name="Squash Head"> - ÅšciÅ›niÄ™ta GÅ‚owa - </string> - <string name="Squash/Stretch Head"> - ÅšciÅ›niÄ™ta/RozciÄ…gniÄ™ta GÅ‚owa + ÅšciÅ›niÄ™ta gÅ‚owa </string> <string name="Stretch Head"> - RozciÄ…gniÄ™ta GÅ‚owa + RozciÄ…gniÄ™ta gÅ‚owa </string> <string name="Sunken"> Sunken @@ -2984,18 +3086,6 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj siÄ™ z [SUPPORT_SITE]. <string name="Sweep Forward"> Sweep Forward </string> - <string name="Swept Back"> - Swept Back - </string> - <string name="Swept Back Hair"> - Swept Back Hair - </string> - <string name="Swept Forward"> - Swept Forward - </string> - <string name="Swept Forward Hair"> - Swept Forward Hair - </string> <string name="Tall"> Wysokość </string> @@ -3006,67 +3096,58 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj siÄ™ z [SUPPORT_SITE]. Taper Front </string> <string name="Thick Heels"> - Grube Obcasy + Grube obcasy </string> <string name="Thick Neck"> - Gruby Kark + Gruby kark </string> <string name="Thick Toe"> - Gruby Palec - </string> - <string name="Thickness"> - Grubość + Gruby palec </string> <string name="Thin"> WÄ…ski </string> <string name="Thin Eyebrows"> - WÄ…skie Brwi + WÄ…skie brwi </string> <string name="Thin Lips"> - WÄ…skie Usta + WÄ…skie usta </string> <string name="Thin Nose"> - WÄ…ski Nos + WÄ…ski nos </string> <string name="Tight Chin"> - ObcisÅ‚y Podbródek + ObcisÅ‚y podbródek </string> <string name="Tight Cuffs"> - ObcisÅ‚e RÄ™kawy + ObcisÅ‚e rÄ™kawy </string> <string name="Tight Pants"> - ObciesÅ‚e Spodnie + ObciesÅ‚e spodnie </string> <string name="Tight Shirt"> - ObcisÅ‚y Podkoszulek + ObcisÅ‚y podkoszulek </string> <string name="Tight Skirt"> - Tight Skirt + WÄ…ska spódnica </string> <string name="Tight Sleeves"> - ObcisÅ‚e RÄ™kawy - </string> - <string name="Tilt Left"> - PrzesuÅ„ w Lewo - </string> - <string name="Tilt Right"> - PrzesuÅ„ w Prawo + ObcisÅ‚e rÄ™kawy </string> <string name="Toe Shape"> - KsztaÅ‚t Palca + KsztaÅ‚t palca </string> <string name="Toe Thickness"> - Grubość Palca + Grubość palca </string> <string name="Torso Length"> - DÅ‚ugość TuÅ‚owia + DÅ‚ugość tuÅ‚owia </string> <string name="Torso Muscles"> - Mięśnie TuÅ‚owia + Mięśnie tuÅ‚owia </string> <string name="Torso Scrawny"> - Wychudzony Tułów + Wychudzony tułów </string> <string name="Unattached"> Nieprzyłączone @@ -3081,43 +3162,43 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj siÄ™ z [SUPPORT_SITE]. Nienaturalne </string> <string name="Upper Bridge"> - Górny Mostek + Górny mostek </string> <string name="Upper Cheeks"> - Górne Policzki + Górne policzki </string> <string name="Upper Chin Cleft"> - Roszczepienie Górnego Podbródka + Roszczepienie górnego podbródka </string> <string name="Upper Eyelid Fold"> - Górna Powieka + Górna powieka </string> <string name="Upturned"> Zadarta </string> <string name="Very Red"> - Bardzo Czerwona + Bardzo czerwona </string> <string name="Waist Height"> - Wysokość Tali + Wysokość talii </string> <string name="Well-Fed"> Well-Fed </string> <string name="White Hair"> - BiaÅ‚e WÅ‚osy + BiaÅ‚e wÅ‚osy </string> <string name="Wide"> Szerokie </string> <string name="Wide Back"> - Szeroki TyÅ‚ + Szeroki tyÅ‚ </string> <string name="Wide Front"> - Szeroki Przód + Szeroki przód </string> <string name="Wide Lips"> - Szerokie Usta + Szerokie usta </string> <string name="Wild"> Dzikość @@ -3194,6 +3275,21 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj siÄ™ z [SUPPORT_SITE]. <string name="IM_moderator_label"> (Moderator) </string> + <string name="started_call"> + RozpoczÄ™ta rozmowa gÅ‚osowa + </string> + <string name="joined_call"> + DołączyÅ‚ do rozmowy gÅ‚osowej + </string> + <string name="ringing-im"> + Rozmowa gÅ‚osowa... + </string> + <string name="connected-im"> + Połączono, kliknij ZakoÅ„cz Rozmowe aby siÄ™ rozłączyć + </string> + <string name="hang_up-im"> + Rozmowa gÅ‚osowa zakoÅ„czona + </string> <string name="only_user_message"> JesteÅ› jedynÄ… osobÄ… w tej konferencji. </string> @@ -3203,6 +3299,12 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj siÄ™ z [SUPPORT_SITE]. <string name="invite_message"> Kliknij na [BUTTON NAME] przycisk by zaakceptować/dołączyć do tej rozmowy. </string> + <string name="muted_message"> + ZablokowaÅ‚eÅ› tego Rezydenta. WysÅ‚anie wiadomoÅ›ci automatycznie odblokuje go. + </string> + <string name="generic"> + Błąd zapytania, proszÄ™ spróbować później + </string> <string name="generic_request_error"> Błąd. Spróbuj ponownie za kilka minut. </string> @@ -3221,19 +3323,153 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj siÄ™ z [SUPPORT_SITE]. <string name="not_a_mod_error"> Nie jesteÅ› moderatorem konferencji. </string> + <string name="muted"> + Moderator grupy wyłączyÅ‚ czat. + </string> <string name="muted_error"> Moderator wyciszyÅ‚ CiÄ™. </string> <string name="add_session_event"> Nie można dodać nikogo do czatu z [RECIPIENT]. </string> + <string name="message"> + Nie można wysÅ‚ać Twojej wiadomoÅ›ci do sesji czatu z [RECIPIENT]. + </string> <string name="message_session_event"> Nie można wysÅ‚ać Twojej wiadomoÅ›ci do sesji czatu z [RECIPIENT]. </string> + <string name="mute"> + Błąd poczas moderacji. + </string> + <string name="removed"> + ZostaÅ‚eÅ› usuniÄ™ty z grupy + </string> <string name="removed_from_group"> UsuniÄ™to CiÄ™ z grupy. </string> <string name="close_on_no_ability"> Nie posiadasz praw by uczestniczyć w tej konferencji. </string> + <string name="unread_chat_single"> + [SOURCES] powiedziaÅ‚/a coÅ› nowego + </string> + <string name="unread_chat_multiple"> + [SOURCES] powiedziaÅ‚/a coÅ› nowego + </string> + <string name="paid_you_ldollars"> + [NAME] zapÅ‚aciÅ‚ Ci L$[AMOUNT] + </string> + <string name="you_paid_ldollars"> + ZapÅ‚acono [NAME] [AMOUNT]L$ [REASON]. + </string> + <string name="you_paid_ldollars_no_reason"> + ZapÅ‚acono [NAME] [AMOUNT]L$. + </string> + <string name="you_paid_ldollars_no_name"> + ZapÅ‚acono [AMOUNT]L$ [REASON]. + </string> + <string name="for a parcel of land"> + za posiadÅ‚ość + </string> + <string name="for a land access pass"> + za przepustkÄ™ na PosiadÅ‚ość + </string> + <string name="for deeding land"> + dla przypisania PosiadÅ‚oÅ›ci + </string> + <string name="to create a group"> + aby stworzyć grupÄ™ + </string> + <string name="to join a group"> + aby dołączyć do grupy + </string> + <string name="to upload"> + aby pobrać + </string> + <string name="giving"> + Dajesz L$ [AMOUNT] + </string> + <string name="uploading_costs"> + Åadowanie kosztuje [AMOUNT]L$ + </string> + <string name="this_costs"> + To kosztuje [AMOUNT]L$ + </string> + <string name="buying_selected_land"> + Kupno wybranej PosiadÅ‚oÅ›ci [AMOUNT]L$ + </string> + <string name="this_object_costs"> + Ten obiekt kosztuje [AMOUNT]L$ + </string> + <string name="group_role_everyone"> + Każdy + </string> + <string name="group_role_officers"> + Oficerowie + </string> + <string name="group_role_owners"> + WÅ‚aÅ›ciciele + </string> + <string name="uploading_abuse_report"> + Pobieranie... + +Raport o Nadużyciu + </string> + <string name="New Shape"> + Nowy ksztalt + </string> + <string name="New Skin"> + Nowa skórka + </string> + <string name="New Hair"> + Nowe wÅ‚osy + </string> + <string name="New Eyes"> + Nowe oczy + </string> + <string name="New Shirt"> + Nowa koszula + </string> + <string name="New Pants"> + Nowe spodnie + </string> + <string name="New Shoes"> + Nowe buty + </string> + <string name="New Socks"> + Nowe skarpetki + </string> + <string name="New Jacket"> + Nowa kurtka + </string> + <string name="New Gloves"> + Nowe rÄ™kawiczki + </string> + <string name="New Undershirt"> + Nowy podkoszulek + </string> + <string name="New Underpants"> + Nowa bielizna + </string> + <string name="New Skirt"> + Nowa spódnica + </string> + <string name="New Alpha"> + Nowa Alpha + </string> + <string name="New Tattoo"> + Nowy tatuaż + </string> + <string name="Invalid Wearable"> + Nieaktualne ubranie/część ciaÅ‚a + </string> + <string name="New Script"> + Nowy skrypt + </string> + <string name="New Folder"> + Nowy folder + </string> + <string name="Contents"> + Zawartość + </string> </strings> diff --git a/indra/newview/skins/default/xui/pl/teleport_strings.xml b/indra/newview/skins/default/xui/pl/teleport_strings.xml index 906978effe..6c4723dd7e 100755..100644 --- a/indra/newview/skins/default/xui/pl/teleport_strings.xml +++ b/indra/newview/skins/default/xui/pl/teleport_strings.xml @@ -62,6 +62,9 @@ Spróbuj jeszcze raz za kilka minut. <message name="completing"> Finalizowanie teleportacji. </message> + <message name="completed_from"> + Teleportacja zakoÅ„czona z [T_SLURL] + </message> <message name="resolving"> Namierzanie celu. </message> diff --git a/indra/newview/skins/default/xui/pl/xui_version.xml b/indra/newview/skins/default/xui/pl/xui_version.xml index 0e777751d3..0e777751d3 100755..100644 --- a/indra/newview/skins/default/xui/pl/xui_version.xml +++ b/indra/newview/skins/default/xui/pl/xui_version.xml diff --git a/indra/newview/skins/default/xui/pt/floater_about.xml b/indra/newview/skins/default/xui/pt/floater_about.xml index 704e2f4107..4044110b47 100644 --- a/indra/newview/skins/default/xui/pt/floater_about.xml +++ b/indra/newview/skins/default/xui/pt/floater_about.xml @@ -1,19 +1,60 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_about" title="SOBRE O [CAPITALIZED_APP_NAME]"> -<tab_container name="about_tab"> - <panel name="credits_panel"> - <text_editor name="credits_editor"> - Second Life é oferecido a você por Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl e muitos outros. +<floater name="floater_about" title="SOBRE [CAPITALIZED_APP_NAME]"> + <floater.string name="AboutHeader"> + [APP_NAME] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2] ([VIEWER_VERSION_3]) [BUILD_DATE] [BUILD_TIME] ([CHANNEL])[[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]] + </floater.string> + <floater.string name="AboutCompiler"> + ConstruÃdo com [COMPILER] versão [COMPILER_VERSION] + </floater.string> + <floater.string name="AboutPosition"> + Você está em [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] em [REGION] localizado em [HOSTNAME]</nolink>([HOSTIP]) +[SERVER_VERSION] +[[SERVER_RELEASE_NOTES_URL] [ReleaseNotes]] + </floater.string> + <floater.string name="AboutSystem"> + CPU: [CPU] +Memória: [MEMORY_MB] MBs +Versão OS: [OS_VERSION] +Placa de vÃdeo: [GRAPHICS_CARD_VENDOR] +Placa gráfica: [GRAPHICS_CARD] + </floater.string> + <floater.string name="AboutDriver"> + Versão do driver de vÃdeo Windows: [GRAPHICS_CARD_VENDOR] + </floater.string> + <floater.string name="AboutLibs"> + Versão OpenGL: [OPENGL_VERSION] - Obrigado aos seguintes residentes por ajudar a garantir para que esta versão seja ainda melhor: able whitman, Adeon Writer, adonaira aabye, Aeron Kohime, Agathos Frascati, Aimee Trescothick, Aleric Inglewood, Alissa Sabre, Aminom Marvin, Angela Talamasca, Aralara Rajal, Armin Weatherwax, Ashrilyn Hayashida, Athanasius Skytower, Aura Dirval, Barney Boomslang, Biancaluce Robbiani, Biker Offcourse, Borg Capalini, Bulli Schumann, catherine pfeffer, Chalice Yao, Corre Porta, Court Goodman, Cummere Mayo, Dale Innis, Darien Caldwell, Darjeeling Schoonhoven, Daten Thielt, dimentox travanti, Dirk Talamasca, Drew Dwi, Duckless Vandyke, Elanthius Flagstaff, Electro Burnstein, emiley tomsen, Escort DeFarge, Eva Rau, Ezian Ecksol, Fire Centaur, Fluf Fredriksson, Francisco Koolhoven, Frontera Thor, Frungi Stastny, Gally Young, gearsawe stonecutter, Gigs Taggart, Gordon Wendt, Gudmund Shepherd, Gypsy Paz, Harleen Gretzky, Henri Beauchamp, Inma Rau, Irene Muni, Iskar Ariantho, Jacek Antonelli, JB Kraft, Jessicka Graves, Joeseph Albanese, Joshua Philgarlic, Khyota Wulluf, kirstenlee Cinquetti, Latif Khalifa, Lex Neva, Lilibeth Andree, Lisa Lowe, Lunita Savira, Loosey Demonia, lum pfohl, Marcos Fonzarelli, MartinRJ Fayray, Marusame Arai, Matthew Dowd, Maya Remblai, McCabe Maxsted, Meghan Dench, Melchoir Tokhes, Menos Short, Michelle2 Zenovka, Mimika Oh, Minerva Memel, Mm Alder, Ochi Wolfe, Omei Turnbull, Pesho Replacement, Phantom Ninetails, phoenixflames kukulcan, Polo Gufler, prez pessoa, princess niven, Prokofy Neva, Qie Niangao, Rem Beattie, RodneyLee Jessop, Saijanai Kuhn, Seg Baphomet, Sergen Davies, Shirley Marquez, SignpostMarv Martin, Sindy Tsure, Sira Arbizu, Skips Jigsaw, Sougent Harrop, Spritely Pixel, Squirrel Wood, StarSong Bright, Subversive Writer, Sugarcult Dagger, Sylumm Grigorovich, Tammy Nowotny, Tanooki Darkes, Tayra Dagostino, Theoretical Chemistry, Thickbrick Sleaford, valerie rosewood, Vex Streeter, Vixen Heron, Whoops Babii, Winter Ventura, Xiki Luik, Yann Dufaux, Yina Yao, Yukinoroh Kamachi, Zolute Infinity, Zwagoth Klaar +Versão libcurl: [LIBCURL_VERSION] +Versão J2C Decoder: [J2C_VERSION] +Versão do driver de áudio: [AUDIO_DRIVER_VERSION] +Versão Qt Webkit: [QT_WEBKIT_VERSION] +Versão do servidor de voz: [VOICE_VERSION] + </floater.string> + <floater.string name="none"> + (nenhum) + </floater.string> + <floater.string name="AboutTraffic"> + Packets Lost: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%) + </floater.string> + <tab_container name="about_tab"> + <panel label="Info" name="support_panel"> + <button label="Copiar" name="copy_btn"/> + </panel> + <panel label="Créditos" name="credits_panel"> + <text_editor name="credits_editor"> + O Second Life é o resultado do trabalho de Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les e muitos mais. +Agradecemos também aos seguintes residentes por sua colaboração na mais nova versão do Second Life: Drew Dwi, Zai Lynch, Latif Khalifa, Ellla McMahon, Harleen Gretzky, Squirrel Wood, Malarthi Behemoth, Dante Tucker, Buckaroo Mu, Eddi Decosta, Dirk, Talamasca, Torben Trautman, Irene Muni, Lilly Zenovka, Vick Forcella, Sasy Scarborough, Gentle Welinder, Elric Anatine, Techwolf Lupindo, Dusan Writer, WolfPup Lowenhar, Marianne McCann, Fiachra Lach, Sitearm Madonna, Sudane Erato, Sahkolihaa Contepomi, Sachi Vixen, Questar Utu, Dimitrio Lewis, Matto Destiny, Scrim Pinion, Radio Signals, Psi Merlin, Pixel Gausman, Mel Vanbeeck, Laurent Bechir, Lamorna Proctor, Lares Carter, Gwyneth Llewelyn, Hydra Shaftoe, Holger Gilruth, Gentle Heron, Carla Broek, Boroondas Gupte, Fury Rosewood, Flower Ducatillon, Colpo Wexler, gwampa Lomu, Borg Capalini, Beansy Twine, Ardy Lay, , 45ms Zhong, Adeon Writer, Aeonix Aeon, Ai Austin, Aiko Ying, Alexandrea Fride, Alliez Mysterio, Annie Milestone, Annika Genezzia, Ansariel Hiller, ArminasX Saiman, Arya Braveheart, Asaeda Meltingdots, Asturkon Jua, Avallyn Oakleaf, Avatar Quinzet, BabyA Littlething, Bacchus Ireto, Bazaar, Riva, Benjamin Bigdipper, Beth Walcher, Bezilon Kasei, Biancaluce Robbiani, Bill Walach, blakopal Galicia, Blitzckreed Levenque, Bryn Oh, Callipygian Christensen, Cap Carver, Carr Arbenlow, Chantal Harvey, Charles Courtois, Charlie Sazaland, Cherry Cheevers, ChickyBabes Zuzu, Christopher Organiser, Ciaran Laval, Clara Young, Celierra Darling, Corinne Helendale, Corro Moseley, Coughdrop Littlething, Darien Caldwell, Dartagan Shepherd, Debs Regent, Decro Schmooz, Denim Kamachi, DiJodi Dubratt, Dil Spitz, Edgware Marker, Egehan Dryke, Emma Portilo, Emmie Fairymeadow, Evangelista Emerald, Faelon Swordthain, Frenchimmo Sabra, Gaberoonie Zanzibar, Ganymedes Costagravas, Gene Frostbite, GeneJ Composer, Giggles Littlebird, Grady Echegaray, Guni Greenstein, Gypsy Tripsa, Hackshaven Harford, Ham Rambler, Han Shuffle, Hanglow Short, Hatzfeld Runo, herina Bode, Horatio Freund, Hypatia Callisto, Hypatia Pickens, Identity Euler, Imnotgoing Sideways, Innula Zenovka, Iyoba Tarantal, Jack Abraham, Jagga Meredith, Jennifer Boyle, Jeremy Marquez, Jessica Qin, Jinx Nordberg, Jo Bernandes, Jocial Sonnenkern, Joel Savard, Jondan Lundquist, Josef Munster, Josette Windlow, Juilan Tripsa, Juro Kothari, Justin RiversRunRed, Kagehi Kohn, Kaimen Takahe, Keklily Longfall, Ken Lavender, Kestral Karas, Khisme Nitely, Kimar Coba, Kithrak Kirkorian, Kitty Barnett, Kolor Fall, Komiko Okamoto, Korvel Noh, Larry Pixel, Leal Choche, len Starship, Lenae Munz, Lexi Frua, Lillie Cordeaux, Lizzy Macarthur, LSL Scientist, Luban Yiyuan, Luc Starsider, Maccus McCullough, Madison Blanc, Maggie Darwin, Mallory Destiny, Manx Wharton, Marc Claridge, Marc2 Sands, Matthew Anthony, Maxim RiversRunRed, Medhue Simoni, Melinda Latynina, Mencius Watts, Michi Lumin, Midian Farspire, Miles Glaz, Mindy Mathy, Mitch Wagner, Mo Hax, Mourna Biziou, Nao Noe, naofan Teardrop, Naomah Beaumont, Nathiel Siamendes, Nber Medici, Neko Link, Netpat Igaly, Neutron Chesnokov, Newfie Pendragon, Nicholai Laviscu, Nick Rhodes, Nicoladie Gymnast, Ollie Kubrick, Orenj Marat, Orion Delphis, Oryx Tempel, Parvati Silverweb, PeterPunk Mooney, Pixel Scientist, Pounce Teazle, Professor Noarlunga, Quantum Destiny, Quicksilver Hermes, Ralf Setsuko, RAT Quan, RedMokum Bravin, Revolution Perenti, Rezit Sideways, Rich Grainger, Rosco Teardrop, Rose Evans, Rudee Voom, RufusTT Horsefly, Saii Hallard, SaintLEOlions Zimer, Samm Larkham, Satanello Miami, SexySteven Morrisey, Sheet Spotter, Shnurui Troughton, sicarius Thorne, Sicarius Toxx, Sini Nubalo, SLB Wirefly, snowy Sidran, Soupa Segura, ST Mensing, Starshine Halasy, Stickman Ingmann, Synystyr Texan, Takeda Terrawyng, Tali Rosca, Templar Merlin, Tezcatlipoca Bisiani, Tiel Stonecutter, Tony Kembia, TouchaHoney Perhaps, Trey Reanimator, TriloByte Zanzibar, Trinity Dechou, Trinity Dejavu, Unlikely Quintessa, UsikuFarasi Kanarik, Veritas Raymaker, Vex Streeter, Viaticus Speculaas, Villain Baroque, Vixie Durant, Void Singer, Watty Berkson, Westley Schridde, Westley Streeter, Whimsy Winx, Winter Ventura, Wundur Primbee, xstorm Radek, YongYong Francois, Zak Westminster, Zana Kohime, Zaren Alexander, Zeja Pyle, ZenMondo Wormser, Zoex Flanagan e muitos mais. - Para ter sucesso nos negócios, seja ousado, seja o primeiro, seja diferente. --Henry Marchant - </text_editor> - </panel> - <panel name="licenses_panel"> - <text_editor name="credits_editor"> - 3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion + + + +"O trabalho continua, a causa vive, a esperança persiste, e os sonhos nunca morrem" - Edward Kennedy + </text_editor> + </panel> + <panel label="Licenças" name="licenses_panel"> + <text_editor name="credits_editor"> + 3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion APR Copyright (C) 2000-2004 The Apache Software Foundation cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se) DBus/dbus-glib Copyright (C) 2002, 2003 CodeFactory AB / Copyright (C) 2003, 2004 Red Hat, Inc. @@ -34,10 +75,7 @@ Todos os direitos reservados. Veja licenças.txt para detalhes. Voice chat Audio coding: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C) - </text_editor> - </panel> -</tab_container> - <string name="you_are_at"> - Você está em [POSITION] - </string> + </text_editor> + </panel> + </tab_container> </floater> diff --git a/indra/newview/skins/default/xui/pt/floater_about_land.xml b/indra/newview/skins/default/xui/pt/floater_about_land.xml index 19981cf48c..56ffcbdece 100644 --- a/indra/newview/skins/default/xui/pt/floater_about_land.xml +++ b/indra/newview/skins/default/xui/pt/floater_about_land.xml @@ -1,7 +1,71 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="floaterland" title="SOBRE O TERRENO"> + <floater.string name="maturity_icon_general"> + "Parcel_PG_Dark + </floater.string> + <floater.string name="maturity_icon_moderate"> + "Parcel_M_Dark" + </floater.string> + <floater.string name="maturity_icon_adult"> + "Parcel_R_Dark" + </floater.string> + <floater.string name="Minutes"> + [MINUTES] minutos + </floater.string> + <floater.string name="Minute"> + minuto + </floater.string> + <floater.string name="Seconds"> + [SECONDS] segundos + </floater.string> + <floater.string name="Remaining"> + faltam + </floater.string> <tab_container name="landtab"> - <panel label="Geral" name="land_general_panel"> + <panel label="GERAL" name="land_general_panel"> + <panel.string name="new users only"> + Somente novos residentes + </panel.string> + <panel.string name="anyone"> + Qualquer um + </panel.string> + <panel.string name="area_text"> + Ãrea + </panel.string> + <panel.string name="area_size_text"> + [AREA] m² + </panel.string> + <panel.string name="auction_id_text"> + ID do Leilão: [ID] + </panel.string> + <panel.string name="need_tier_to_modify"> + Sua compra deve ser aprovada para você modificar este terreno. + </panel.string> + <panel.string name="group_owned_text"> + (Propriedade do grupo) + </panel.string> + <panel.string name="profile_text"> + Perfil... + </panel.string> + <panel.string name="info_text"> + Informação... + </panel.string> + <panel.string name="public_text"> + (público) + </panel.string> + <panel.string name="none_text"> + (nenhum) + </panel.string> + <panel.string name="sale_pending_text"> + (Venda pendendo) + </panel.string> + <panel.string name="no_selection_text"> + Nenhum lote selecionado. +Vá para o menu Mundo > Sobre o terreno ou selecione outro lote para mostrar os detalhes. + </panel.string> + <panel.string name="time_stamp_template"> + [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local] + </panel.string> <text name="Name:"> Nome: </text> @@ -18,7 +82,7 @@ Classificação: </text> <text name="ContentRatingText"> - Adult + Adulto </text> <text name="Owner:"> Proprietário: @@ -26,36 +90,38 @@ <text name="OwnerText"> Leyla Linden </text> - <button label="Perfil..." label_selected="Perfil..." name="Profile..."/> <text name="Group:"> Grupo: </text> - <button label="Ajustar..." label_selected="Ajustar..." name="Set..."/> - <check_box label="Permitir posse para o grupo" name="check deed" tool_tip="O gerente do grupo pode acionar essa terra ao grupo, então esta será mantida pelo gestor da ilha"/> - <button label="Passar..." label_selected="Passar..." name="Deed..." tool_tip="Você só pode delegar esta terra se você for um gerente selecionado pelo grupo."/> - <check_box label="Proprietário faz contribuição com delegação" name="check contrib" tool_tip="Quando a terra é delegada ao grupo, o proprietário anterior contribui alocando terra suficiente para mantê-la."/> + <text name="GroupText"> + Leyla Linden + </text> + <button label="Ajustar" name="Set..."/> + <check_box label="Permitir doação para o grupo" name="check deed" tool_tip="Oficiais do grupo podem doar esse terreno ao grupo, passando a administração para o gestor da ilha"/> + <button label="Passar" name="Deed..." tool_tip="Você só pode doar o terreno se você for um dos oficiais do grupo selecionado."/> + <check_box label="Proprietário faz contribuição com doação" name="check contrib" tool_tip="Quando o terreno é doado ao grupo, o proprietário anterior contribui alocando terra suficiente para mantê-la."/> <text name="For Sale:"> - À Venda: + À venda: </text> <text name="Not for sale."> - Não está à Venda. + Não está à venda. </text> <text name="For Sale: Price L$[PRICE]."> Preço: L$[PRICE] (L$[PRICE_PER_SQM]/m²). </text> - <button label="Vender Terra..." label_selected="Vender Terra..." name="Sell Land..."/> + <button label="Vender Terra" name="Sell Land..."/> <text name="For sale to"> À venda para: [BUYER] </text> <text name="Sell with landowners objects in parcel."> - À venda (Objetos incluÃdos). + À venda (objetos incluÃdos). </text> <text name="Selling with no objects in parcel."> - À venda (Objetos não incluÃdos). + À venda (objetos não incluÃdos). </text> <button label="Cancelar venda do terreno" label_selected="Cancelar venda do terreno" left="275" name="Cancel Land Sale" width="165"/> <text name="Claimed:"> - Reclamado: + Posse em: </text> <text name="DateClaimText"> Ter Ago 15 13:47:25 2006 @@ -72,62 +138,32 @@ <text name="DwellText"> 0 </text> - <button label="Comprar Terra..." label_selected="Comprar Terra..." left="130" name="Buy Land..." width="125"/> - <button label="Comprar para o Grupo..." label_selected="Comprar para o Grupo..." name="Buy For Group..."/> - <button label="Comprar Passe..." label_selected="Comprar Passe..." left="130" name="Buy Pass..." tool_tip="Um passe concede a você acesso temporário a esta terra." width="125"/> - <button label="Abandonar Terra.." label_selected="Abandonar Terra.." name="Abandon Land..."/> - <button label="Reclamar Terra..." label_selected="Reclamar Terra..." name="Reclaim Land..."/> - <button label="Venda Linden..." label_selected="Venda Linden..." name="Linden Sale..." tool_tip="A terra precisa ser possuÃda, estar com o conteúdo configurado e não estar pronta para leilão."/> - <panel.string name="new users only"> - Somente novos usuários - </panel.string> - <panel.string name="anyone"> - Qualquer um - </panel.string> - <panel.string name="area_text"> - Ãrea - </panel.string> - <panel.string name="area_size_text"> - [AREA] m² - </panel.string> - <panel.string name="auction_id_text"> - ID do Leilão: [ID] - </panel.string> - <panel.string name="need_tier_to_modify"> - Você deve ter sua compra aprovada para modificar este terreno. - </panel.string> - <panel.string name="group_owned_text"> - (PossuÃdo pelo Grupo) - </panel.string> - <panel.string name="profile_text"> - Perfil... - </panel.string> - <panel.string name="info_text"> - Informação... - </panel.string> - <panel.string name="public_text"> - (público) + <button label="Comprar terreno..." label_selected="Comprar terreno..." left="130" name="Buy Land..." width="125"/> + <button label="Dados do script" name="Scripts..."/> + <button label="Comprar para o grupo" name="Buy For Group..."/> + <button label="Comprar passe..." label_selected="Comprar passe..." left="130" name="Buy Pass..." tool_tip="Um passe concede a você acesso temporário a este terreno." width="125"/> + <button label="Abandonar terreno..." label_selected="Abandonar terreno..." name="Abandon Land..."/> + <button label="Pedir terreno" name="Reclaim Land..."/> + <button label="Venda Linden" name="Linden Sale..." tool_tip="O terreno precisa ser possuÃdo, estar com o conteúdo configurado e não estar pronto para leilão."/> + </panel> + <panel label="CONTRATO" name="land_covenant_panel"> + <panel.string name="can_resell"> + Permitido para terrenos comprados nesta região. </panel.string> - <panel.string name="none_text"> - (nenhum) + <panel.string name="can_not_resell"> + Proibido para terrenos comprados nesta região. </panel.string> - <panel.string name="sale_pending_text"> - (Venda Pendente) + <panel.string name="can_change"> + Permitido subdividir terrenos comprados nesta região. </panel.string> - <panel.string name="no_selection_text"> - Nenhum lote selecionado. -Vá para o menu Mundo > Sobre a Terra ou selecione outro lote para mostrar seus detalhes. + <panel.string name="can_not_change"> + Proibido compartilhar ou subdividir terrenos comprados nesta região. </panel.string> - </panel> - <panel label="Corretor" name="land_covenant_panel"> <text name="estate_section_lbl"> Propriedade: </text> - <text name="estate_name_lbl"> - Nome: - </text> <text name="estate_name_text"> - mainland + continente </text> <text name="estate_owner_lbl"> Dono: @@ -139,14 +175,11 @@ Vá para o menu Mundo > Sobre a Terra ou selecione outro lote para mostrar se Não há corretor para esta Propriedade. </text_editor> <text name="covenant_timestamp_text"> - Última Alteração: Qua, Dez 31 16:00:00 1969 + Última modificação: Qua, Dez 31 16:00:00 1969 </text> <text name="region_section_lbl"> Região: </text> - <text name="region_name_lbl"> - Nome: - </text> <text name="region_name_text"> leyla </text> @@ -160,59 +193,45 @@ Vá para o menu Mundo > Sobre a Terra ou selecione outro lote para mostrar se Classificação: </text> <text name="region_maturity_text"> - Adult + Adulto </text> <text name="resellable_lbl"> Revender: </text> <text name="resellable_clause"> - Terra nesta região não pode ser revendida. + Proibido revender terrenos nesta região. </text> <text name="changeable_lbl"> Subdividir: </text> <text name="changeable_clause"> - Terra nesta região não pode ser unida/sub-dividida. + Proibido juntar/subdividir terrenos nesta região. </text> - <panel.string name="can_resell"> - Terra comprada nesta região pode ser revendida. - </panel.string> - <panel.string name="can_not_resell"> - Terra comprada nesta região não pode ser revendida. - </panel.string> - <panel.string name="can_change"> - Terra comprada nesta região pode ser compartilhada -ou sub-dividida. + </panel> + <panel label="OBJETOS" name="land_objects_panel"> + <panel.string name="objects_available_text"> + [COUNT] de [MAX] ([AVAILABLE] disponÃveis) </panel.string> - <panel.string name="can_not_change"> - Terra comprada nesta região não pode ser compartilhada -ou sub-dividida. + <panel.string name="objects_deleted_text"> + [COUNT] de [MAX] ([DELETED] serão deletados) </panel.string> - </panel> - <panel label="Objetos" name="land_objects_panel"> <text name="parcel_object_bonus"> - Fator de Bonus para Objetos na Região: [BONUS] + Fator de bônus para objetos na região: [BONUS] </text> <text name="Simulator primitive usage:"> - Uso do simulador de primitivas: + Uso de prims: </text> <text left="214" name="objects_available" width="230"> [COUNT] de [MAX] ([AVAILABLE] disponÃveis) </text> - <panel.string name="objects_available_text"> - [COUNT] de [MAX] ([AVAILABLE] disponÃveis) - </panel.string> - <panel.string name="objects_deleted_text"> - [COUNT] de [MAX] ([DELETED] serão deletados) - </panel.string> <text name="Primitives parcel supports:" width="200"> - Primitivas suportadas pelo lote: + Prims suportados pelo lote: </text> <text left="214" name="object_contrib_text" width="152"> [COUNT] </text> <text name="Primitives on parcel:"> - Primitivas no Lote: + Prims no lote: </text> <text left="214" name="total_objects_text" width="48"> [COUNT] @@ -224,73 +243,46 @@ ou sub-dividida. [COUNT] </text> <button label="Mostrar" label_selected="Mostrar" name="ShowOwner" right="-135" width="60"/> - <button label="Retornar..." label_selected="Retornar..." name="ReturnOwner..." right="-10" tool_tip="Retornar os objetos aos seus donos." width="119"/> + <button label="Devolver" name="ReturnOwner..." right="-10" tool_tip="Devolver objetos a seus donos." width="119"/> <text left="14" name="Set to group:" width="180"> - Configurados ao grupo: + Reservado para o grupo: </text> <text left="214" name="group_objects_text" width="48"> [COUNT] </text> <button label="Mostrar" label_selected="Mostrar" name="ShowGroup" right="-135" width="60"/> - <button label="Retornar..." label_selected="Retornar..." name="ReturnGroup..." right="-10" tool_tip="Retornar os objetos para seus donos." width="119"/> + <button label="Devolver" name="ReturnGroup..." right="-10" tool_tip="Devolver objetos a seus donos." width="119"/> <text left="14" name="Owned by others:" width="128"> - Propriedade de Outros: + Propriedade de outros: </text> <text left="214" name="other_objects_text" width="48"> [COUNT] </text> <button label="Mostrar" label_selected="Mostrar" name="ShowOther" right="-135" width="60"/> - <button label="Retornar..." label_selected="Retornar..." name="ReturnOther..." right="-10" tool_tip="Retornar os objetos aos seus donos." width="119"/> + <button label="Devolver" name="ReturnOther..." right="-10" tool_tip="Devolver objetos a seus donos." width="119"/> <text left="14" name="Selected / sat upon:" width="193"> Selecionado/Sentado: </text> <text left="214" name="selected_objects_text" width="48"> [COUNT] </text> - <text left="4" name="Autoreturn" width="412"> - Auto-retornar objetos dos outros residentes (minutos, 0 para desligado): + <text name="Autoreturn"> + Devolver objetos de outros residentes (p/ desligar tecle 0) </text> <line_editor name="clean other time" right="-10"/> <text name="Object Owners:"> - Donos dos Objetos: + Donos dos objetos: </text> - <button label="Atualizar Lista" label_selected="Atualizar Lista" name="Refresh List" left="118"/> - <button label="Retornar objetos..." label_selected="Retornar objetos..." name="Return objects..." left="230"/> + <button label="Atualizar lista" label_selected="Atualizar lista" left="118" name="Refresh List" tool_tip="Refresh Object List"/> + <button label="Devolver objetos..." label_selected="Devolver objetos..." left="230" name="Return objects..."/> <name_list name="owner list"> - <column label="Tipo" name="type"/> - <column label="Nome" name="name"/> - <column label="Contar" name="count"/> - <column label="Mais recente" name="mostrecent"/> + <name_list.columns label="Tipo" name="type"/> + <name_list.columns label="Nome" name="name"/> + <name_list.columns label="Contar" name="count"/> + <name_list.columns label="Mais recente" name="mostrecent"/> </name_list> </panel> - <panel label="Opções" name="land_options_panel"> - <text name="allow_label"> - Permitir outros residentes a: - </text> - <check_box label="Editar Terreno" name="edit land check" tool_tip="Se ativado, qualquer um pode modificar a forma da sua terra. É melhor deixar esta opção desativada, uma vez que você sempre pode editar seu próprio terreno."/> - <check_box label="Criar Landmarks" name="check landmark"/> - <check_box label="Voar" name="check fly" tool_tip="Se ativado, os Residentes podem voar na sua terra. Se desativado, eles podem voar apenas para dentro e por cima de sua terra."/> - <text name="allow_label2" left="172"> - Criar Objetos: - </text> - <check_box label="Residentes" name="edit objects check"/> - <check_box label="Grupo" name="edit group objects check"/> - <text name="allow_label3" left="172"> - Entrada do Objeto: - </text> - <check_box label="Residentes" name="all object entry check"/> - <check_box label="Grupo" name="group object entry check"/> - <text name="allow_label4" left="172"> - Executar Scripts: - </text> - <check_box label="Residentes" name="check other scripts"/> - <check_box label="Grupo" name="check group scripts"/> - <text name="land_options_label"> - Opções de Terra: - </text> - <check_box label="Salvo (sem dano)" name="check safe" tool_tip="Se ativado, ajusta o terreno para Seguro, desabilitando combate com danos. Se não ativado, o combate com danos é habilitado."/> - <check_box label="Sem Empurrar" name="PushRestrictCheck" tool_tip="Evita scripts que empurram. A ativação dessa opção pode ser útil para prevenir comportamentos desordeiros na sua terra."/> - <check_box label="Mostra o Lugar na Busca (L$30/semana) sob" name="ShowDirectoryCheck" tool_tip="Permitir que as pessoas vejam este terreno nos resultados de busca"/> + <panel label="OPÇÕES" name="land_options_panel"> <panel.string name="search_enabled_tooltip"> Permitir que as pessoas vejam este lote nos resultados de busca </panel.string> @@ -301,74 +293,83 @@ Apenas lotes maiores podem ser listados na busca. <panel.string name="search_disabled_permissions_tooltip"> Esta opção está desabilitada porque você não pode modificar as opções deste lote. </panel.string> - <combo_box name="land category with adult" left="265" width="155"> - <combo_box.item name="item0" label="Qualquer Categoria" - /> - <combo_box.item name="item1" label="Locação Linden" - /> - <combo_box.item name="item2" label="Adult" - /> - <combo_box.item name="item3" label="Artes e Cultura" - /> - <combo_box.item name="item4" label="Negócios" - /> - <combo_box.item name="item5" label="Educacional" - /> - <combo_box.item name="item6" label="Jogos" - /> - <combo_box.item name="item7" label="Moradia" - /> - <combo_box.item name="item8" label="Amigável a Novos Usuários" - /> - <combo_box.item name="item9" label="Parques & Natureza" - /> - <combo_box.item name="item10" label="Residencial" - /> - <combo_box.item name="item11" label="Compras" - /> - <combo_box.item name="item12" label="Outros" - /> - </combo_box> - <combo_box name="land category" left="265" width="155"> - <combo_box.item name="item0" label="Qualquer Categoria" - /> - <combo_box.item name="item1" label="Locação Linden" - /> - <combo_box.item name="item3" label="Artes e Cultura" - /> - <combo_box.item name="item4" label="Negócios" - /> - <combo_box.item name="item5" label="Educacional" - /> - <combo_box.item name="item6" label="Jogos" - /> - <combo_box.item name="item7" label="Moradia" - /> - <combo_box.item name="item8" label="Amigável a Novos Usuários" - /> - <combo_box.item name="item9" label="Parques e Natureza" - /> - <combo_box.item name="item10" label="Residencial" - /> - <combo_box.item name="item11" label="Compras" - /> - <combo_box.item name="item12" label="Outros" - /> - </combo_box> - <button label="?" label_selected="?" left="426" name="?"/> - <check_box label="Conteúdo Mature" name="MatureCheck" tool_tip=""/> <panel.string name="mature_check_mature"> - Conteúdo Mature + Conteúdo Adulto </panel.string> <panel.string name="mature_check_adult"> - Conteúdo Adult + Conteúdo Adulto </panel.string> <panel.string name="mature_check_mature_tooltip"> - A informação do seu lote ou seu conteúdo são considerados mature. + Os dados do seu lote ou seu conteúdo são considerados adulto. </panel.string> <panel.string name="mature_check_adult_tooltip"> - A informação do seu lote ou seu conteúdo são considerados adult. + Os dados do seu lote ou seu conteúdo são considerados adulto. + </panel.string> + <panel.string name="landing_point_none"> + (nenhum) </panel.string> + <panel.string name="push_restrict_text"> + Proibido empurrar + </panel.string> + <panel.string name="push_restrict_region_text"> + Proibido empurrar (regulamento da região) + </panel.string> + <text name="allow_label"> + Autorizar outros residentes a: + </text> + <check_box label="Editar terreno" name="edit land check" tool_tip="Se ativado, qualquer um pode modificar o terreno. É melhor deixar esta opção desativada, uma vez que você sempre pode editar seu próprio terreno."/> + <check_box label="Voar" name="check fly" tool_tip="Se ativado, residentes podem voar sobre seu terreno. Se desativado, eles podem voar apenas até chegar ou sobrevoar o seu terreno."/> + <text name="allow_label2"> + Criar objetos: + </text> + <check_box label="Residentes" name="edit objects check"/> + <check_box label="Grupo" name="edit group objects check"/> + <text name="allow_label3"> + Entrada de objetos: + </text> + <check_box label="Residentes" name="all object entry check"/> + <check_box label="Grupo" name="group object entry check"/> + <text name="allow_label4"> + Executar scripts: + </text> + <check_box label="Residentes" name="check other scripts"/> + <check_box label="Grupo" name="check group scripts"/> + <text name="land_options_label"> + Opções do terreno: + </text> + <check_box label="Seguro (sem danos)" name="check safe" tool_tip="Se ativado, ajusta o terreno para Seguro, impedindo lutas com danos. Se não ativado, lutas com danos é habilitado."/> + <check_box label="Proibido empurrar" name="PushRestrictCheck" tool_tip="Evita scripts que empurram. Ativar essa opção ajuda a prevenir comportamentos desordeiros no seu terreno."/> + <check_box label="Mostrar terreno nos resultados de busca (L$30/semana)" name="ShowDirectoryCheck" tool_tip="Permitir que as pessoas vejam este terreno nos resultados de busca"/> + <combo_box left="265" name="land category with adult" width="155"> + <combo_box.item label="Qualquer categoria" name="item0"/> + <combo_box.item label="Locação Linden" name="item1"/> + <combo_box.item label="Adulto" name="item2"/> + <combo_box.item label="Artes e cultura" name="item3"/> + <combo_box.item label="Negócios" name="item4"/> + <combo_box.item label="Educacional" name="item5"/> + <combo_box.item label="Jogos" name="item6"/> + <combo_box.item label="Moradia" name="item7"/> + <combo_box.item label="Amigável a novos usuários" name="item8"/> + <combo_box.item label="Parques & Natureza" name="item9"/> + <combo_box.item label="Residencial" name="item10"/> + <combo_box.item label="Compras" name="item11"/> + <combo_box.item label="Outros" name="item12"/> + </combo_box> + <combo_box left="265" name="land category" width="155"> + <combo_box.item label="Qualquer categoria" name="item0"/> + <combo_box.item label="Locação Linden" name="item1"/> + <combo_box.item label="Artes e cultura" name="item3"/> + <combo_box.item label="Negócios" name="item4"/> + <combo_box.item label="Educacional" name="item5"/> + <combo_box.item label="Jogos" name="item6"/> + <combo_box.item label="Moradia" name="item7"/> + <combo_box.item label="Amigável a novos usuários" name="item8"/> + <combo_box.item label="Parques e Natureza" name="item9"/> + <combo_box.item label="Residencial" name="item10"/> + <combo_box.item label="Compras" name="item11"/> + <combo_box.item label="Outros" name="item12"/> + </combo_box> + <check_box label="Conteúdo adulto" name="MatureCheck" tool_tip=""/> <text name="Snapshot:"> Foto: </text> @@ -376,39 +377,28 @@ Apenas lotes maiores podem ser listados na busca. <text name="landing_point"> Ponto de Aterrissagem: [LANDING] </text> - <panel.string name="landing_point_none"> - (nenhum) - </panel.string> - <button label="Definir" label_selected="Definir" name="Set" tool_tip="Define o ponto de aterrissagem aonde o visitante chega. Define para o ponto em que seu avatar se encontra neste lote."/> + <button label="Definir" label_selected="Definir" name="Set" tool_tip="Define o ponto de aterrissagem de visitantes. Define para o ponto em que seu avatar se encontra neste lote."/> <button label="Limpar" label_selected="Limpar" name="Clear" tool_tip="Limpar o ponto de aterrissagem."/> <text name="Teleport Routing: "> - Rota de Tele-transporte: - </text> - <combo_box width="160" left="140" name="landing type" tool_tip="Rota de Teletransporte -- Selecione como tratar os tele-transportes no seu lote."> - <combo_box.item name="Blocked" label="Bloqueado" - /> - <combo_box.item name="LandingPoint" label="Ponto de Aterrissagem" - /> - <combo_box.item name="Anywhere" label="Qualquer lugar" - /> + Rota de teletransporte: + </text> + <combo_box left="140" name="landing type" tool_tip="Rota de Teletransporte -- Selecione como tratar os teletransportes no seu lote." width="160"> + <combo_box.item label="Bloqueado" name="Blocked"/> + <combo_box.item label="Ponto de aterrissagem" name="LandingPoint"/> + <combo_box.item label="Qualquer lugar" name="Anywhere"/> </combo_box> - <panel.string name="push_restrict_text"> - Sem Empurrar - </panel.string> - <panel.string name="push_restrict_region_text"> - Sem Empurrar (Imposição na Região) - </panel.string> </panel> - <panel label="MÃdia" name="land_media_panel"> + <panel label="MÃDIA" name="land_media_panel"> <text name="with media:" width="85"> Tipo de MÃdia: </text> <combo_box left="97" name="media type" tool_tip="Especificar se a URL é um filme, uma página web ou outra mÃdia"/> <text name="at URL:" width="85"> - URL da MÃdia: + Página web: </text> <line_editor left="97" name="media_url"/> <button label="Definir..." label_selected="Definir..." name="set_media_url"/> + <check_box label="Esconder a URL da mÃdia" left="97" name="hide_media_url" tool_tip="Ativando esta opção, a URL da mÃdia se ocultará para quaisquer visualizadores não autorizados a ver esta informação do lote. Notar que isto não está disponÃvel para tipos HTML."/> <text name="Description:"> Descrição: </text> @@ -419,18 +409,9 @@ Textura: </text> <texture_picker label="" left="97" name="media texture" tool_tip="Clique para escolher uma imagem"/> <text name="replace_texture_help"> - (Objetos usando esta textura, mostrarão o filme ou -a página web depois que você clicar na seta de -reproduzir.) - </text> - <text name="Options:"> - Opções de -MÃdia: + Objetos com esta textura vão aparecer no filme ou página da web depois de clicar em Tocar. Selecione outras texturas clicando nas miniaturas. </text> <check_box label="Escala automática" left="97" name="media_auto_scale" tool_tip="Marcando esta opção o conteúdo se ajustará ao lote automaticamente. A mÃdia pode se tornar lenta e com baixa qualidade visual mas nenhum outro ajuste de textura ou alinhamento será necessário."/> - <check_box label="MÃdia em Repetição" name="media_loop" tool_tip="Executar a mÃdia repetidamente. Quando a mÃdia terminar a execução, ela reiniciará do começo."/> - <check_box label="Esconder a URL da MÃdia" left="97" name="hide_media_url" tool_tip="Ativando esta opção, a URL da mÃdia se ocultará para quaisquer visualizadores não autorizados a ver esta informação do lote. Notar que isto não está disponÃvel para tipos HTML."/> - <check_box label="Esconder a URL de Música" name="hide_music_url" tool_tip="Ativando esta opção, a URL de música se esconderá para visualizadores não autorizados a ver esta informação do lote"/> <text left="102" name="media_size" tool_tip="Tamanho para desenhar a mÃdia Web, deixar 0 como padrão." width="115"> Tamanho da mÃdia: </text> @@ -439,57 +420,48 @@ MÃdia: <text name="pixels"> pixels </text> - <text name="MusicURL:"> - URL da Música: - </text> - <line_editor left="97" name="music_url"/> - <text name="Sound:"> - Som: - </text> - <check_box label="Restringir gestos e sons de objetos a este lote" left="97" name="check sound local"/> - <button label="?" label_selected="?" name="?"/> - <text name="Voice settings:"> - Voz: + <text name="Options:"> + Opções de +MÃdia: </text> - <check_box left="97" label="Habilitar Voz" name="parcel_enable_voice_channel"/> - <check_box left="97" label="Habilitar Voz (definida pela Propriedade)" name="parcel_enable_voice_channel_is_estate_disabled"/> - <check_box left="117" label="Restringir Voz a este lote" name="parcel_enable_voice_channel_parcel"/> + <check_box label="Repetir mÃdia" name="media_loop" tool_tip="Executar a mÃdia repetidamente. Quando a mÃdia chegar ao fim, ela recomeça."/> </panel> - <panel label="Acesso" name="land_access_panel"> + <panel label="SOM" name="land_audio_panel"> + <check_box label="Ocultar URL" name="hide_music_url" tool_tip="Selecionar esta opção oculta o URL de música a visitantes não autorizados aos dados do terreno."/> + <check_box label="Ativar voz" name="parcel_enable_voice_channel"/> + <check_box label="Ativar voz (definições do terreno)" name="parcel_enable_voice_channel_is_estate_disabled"/> + <check_box label="Limitar bate-papo de voz a este lote" name="parcel_enable_voice_channel_local"/> + </panel> + <panel label="ACESSO" name="land_access_panel"> + <panel.string name="access_estate_defined"> + (Definições do terreno) + </panel.string> + <panel.string name="allow_public_access"> + Acesso para público: [MATURITY] + </panel.string> + <panel.string name="estate_override"> + Uma ou mais destas opções está definida no nÃvel de propriedade. + </panel.string> <text name="Limit access to this parcel to:"> - Acesso a Este Lote + Acesso a este lote </text> - <check_box label="Permitir Acesso Público" name="public_access"/> + <check_box label="Acesso para público categoria [MATURITY]" name="public_access"/> <text name="Only Allow"> - Bloquear Acesso por: + Restringir acesso a contas confirmardas por: </text> - <check_box label="Residentes que não forneceram informações de pagamento para a Linden Lab" name="limit_payment" tool_tip="Banir residentes não identificados."/> - <check_box label="Residentes que não tiveram a idade de adulto confirmada" name="limit_age_verified" tool_tip="Banir residentes que não tiveram sua idade verificada. Veja support.secondlife.com para maiores informações."/> - <panel.string name="estate_override"> - Uma ou mais destas opções está definida no nÃvel de propriedade. - </panel.string> - <check_box label="Permitir Acesso do Grupo: [GROUP]" name="GroupCheck" tool_tip="Definir grupo na aba Geral."/> + <check_box label="Dados de pagamento fornecidos [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="Banir residentes sem identificação."/> + <check_box label="Idade comprovada: [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="Banir residentes que não comprovaram a idade. Consulte o [SUPPORT_SITE] para saber mais."/> + <check_box label="Permitir acesso do grupo: [GROUP]" name="GroupCheck" tool_tip="Definir grupo na aba Geral."/> <check_box label="Vender passes para:" name="PassCheck" tool_tip="Permite acesso temporário a este terreno"/> <combo_box name="pass_combo"> - <combo_box.item name="Anyone" label="Qualquer um" - /> - <combo_box.item name="Group" label="Grupo" - /> + <combo_box.item label="Qualquer um" name="Anyone"/> + <combo_box.item label="Grupo" name="Group"/> </combo_box> <spinner label="Preço em L$:" name="PriceSpin"/> - <spinner label="Horas de Acesso:" name="HoursSpin"/> - <text label="Permitir Sempre" name="AllowedText"> - Residentes Permitidos - </text> - <name_list name="AccessList" tool_tip="([LISTED] listados, [MAX] máximo)"/> - <button label="Adicionar..." label_selected="Adicionar..." name="add_allowed"/> - <button label="Remover" label_selected="Remover" name="remove_allowed"/> - <text label="Banir" name="BanCheck"> - Residentes Banidos - </text> - <name_list name="BannedList" tool_tip="([LISTED] listados, [MAX] máximo)"/> - <button label="Adicionar..." label_selected="Adicionar..." name="add_banned"/> - <button label="Remover" label_selected="Remover" name="remove_banned"/> + <spinner label="Horas de acesso:" name="HoursSpin"/> + <panel name="Allowed_layout_panel"> + <name_list name="AccessList" tool_tip="(Total [LISTED], máx de [MAX])"/> + </panel> </panel> </tab_container> </floater> diff --git a/indra/newview/skins/default/xui/pt/floater_activeim.xml b/indra/newview/skins/default/xui/pt/floater_activeim.xml new file mode 100644 index 0000000000..892ccdf974 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/floater_activeim.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_activeim" title="MI ativa"/> diff --git a/indra/newview/skins/default/xui/pt/floater_animation_preview.xml b/indra/newview/skins/default/xui/pt/floater_animation_preview.xml index f3297ea5ee..3ec81612a1 100644 --- a/indra/newview/skins/default/xui/pt/floater_animation_preview.xml +++ b/indra/newview/skins/default/xui/pt/floater_animation_preview.xml @@ -1,70 +1,180 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="Animation Preview" title=""> + <floater.string name="failed_to_initialize"> + Não foi possÃvel iniciar o movimento + </floater.string> + <floater.string name="anim_too_long"> + O arquivo de animação tem [LENGTH] segundos de duração. + +A duração máxima de animação permitida é de [MAX_LENGTH] segundos. + </floater.string> + <floater.string name="failed_file_read"> + Não foi possÃvel ler o arquivo de animação. + +[STATUS] + </floater.string> + <floater.string name="E_ST_OK"> + OK + </floater.string> + <floater.string name="E_ST_EOF"> + Fim de arquivo prematuro + </floater.string> + <floater.string name="E_ST_NO_CONSTRAINT"> + ImpossÃvel ler definição constraint. + </floater.string> + <floater.string name="E_ST_NO_FILE"> + ImpossÃvel abrir arquivo BVH. + </floater.string> + <floater.string name="E_ST_NO_HIER"> + Invalid HIERARCHY header. + </floater.string> + <floater.string name="E_ST_NO_JOINT"> + RAIZ ou JUNTA não encontrados. + </floater.string> + <floater.string name="E_ST_NO_NAME"> + ImpossÃvel obter nome JOINT. + </floater.string> + <floater.string name="E_ST_NO_OFFSET"> + ImpossÃvel localizar OFFSET. + </floater.string> + <floater.string name="E_ST_NO_CHANNELS"> + ImpossÃvel localizar CHANNELS. + </floater.string> + <floater.string name="E_ST_NO_ROTATION"> + ImpossÃvel obter ordem de rotação. + </floater.string> + <floater.string name="E_ST_NO_AXIS"> + ImpossÃvel obter eixo de rotação. + </floater.string> + <floater.string name="E_ST_NO_MOTION"> + ImpossÃvel localizar MOTION. + </floater.string> + <floater.string name="E_ST_NO_FRAMES"> + ImpossÃvel determinar número de quadros. + </floater.string> + <floater.string name="E_ST_NO_FRAME_TIME"> + ImpossÃvel determinar tempo dos quadros. + </floater.string> + <floater.string name="E_ST_NO_POS"> + ImpossÃvel definir posicionamento. + </floater.string> + <floater.string name="E_ST_NO_ROT"> + ImpossÃvel definir valores da rotação. + </floater.string> + <floater.string name="E_ST_NO_XLT_FILE"> + ImpossÃvel abrir arquivo de tradução. + </floater.string> + <floater.string name="E_ST_NO_XLT_HEADER"> + ImpossÃvel ler cabeçalho de tradução. + </floater.string> + <floater.string name="E_ST_NO_XLT_NAME"> + ImpossÃvel ler nomes traduzidos. + </floater.string> + <floater.string name="E_ST_NO_XLT_IGNORE"> + ImpossÃvel obter valor traduzido a ignorar. + </floater.string> + <floater.string name="E_ST_NO_XLT_RELATIVE"> + ImpossÃvel obter valor traduzido relativo. + </floater.string> + <floater.string name="E_ST_NO_XLT_OUTNAME"> + ImpossÃvel obter valor traduzido. + </floater.string> + <floater.string name="E_ST_NO_XLT_MATRIX"> + ImpossÃvel ler matriz de tradução. + </floater.string> + <floater.string name="E_ST_NO_XLT_MERGECHILD"> + ImpossÃvel obter nome mergechild. + </floater.string> + <floater.string name="E_ST_NO_XLT_MERGEPARENT"> + ImpossÃvel obter nome mergeparent. + </floater.string> + <floater.string name="E_ST_NO_XLT_PRIORITY"> + ImpossÃvel obter valor prioritário. + </floater.string> + <floater.string name="E_ST_NO_XLT_LOOP"> + ImpossÃvel obter valor do loop. + </floater.string> + <floater.string name="E_ST_NO_XLT_EASEIN"> + ImpossÃvel obter valor easeIn. + </floater.string> + <floater.string name="E_ST_NO_XLT_EASEOUT"> + ImpossÃvel obter valor easeOut. + </floater.string> + <floater.string name="E_ST_NO_XLT_HAND"> + ImpossÃvel obter valor de morph da mão. + </floater.string> + <floater.string name="E_ST_NO_XLT_EMOTE"> + ImpossÃvel ler nome do emote. + </floater.string> + <floater.string name="E_ST_BAD_ROOT"> + Nome da junta incorreto, use "quadril". + </floater.string> <text name="name_label"> Nome: </text> <text name="description_label"> Descrição: </text> - <spinner label_width="72" width="110" label="Prioridade" name="priority" tool_tip="Controla quais animações podem se sobrepor a esta animação."/> - <check_box label="Loop" name="loop_check" tool_tip="Executa a animação repetidamente."/> - <spinner label_width="56" left="65" width="116" label="Dentro(%)" name="loop_in_point" tool_tip="Ajusta o ponto da animação onde a repetição começa."/> - <spinner label_width="40" left="185" label="Fora(%)" name="loop_out_point" tool_tip="Ajusta o ponto da animação onde a repetição termina."/> + <spinner label="Prioridade" label_width="72" name="priority" tool_tip="Controla quais animações podem ser interrompidas por esta animação" width="110"/> + <check_box label="Loop" name="loop_check" tool_tip="Executa esta animação sem parar"/> + <spinner label="Dentro(%)" label_width="56" left="65" name="loop_in_point" tool_tip="Define o ponto em que a animação em loop reinicia" width="116"/> + <spinner label="Fora(%)" label_width="40" left="185" name="loop_out_point" tool_tip="Define o ponto em que a animação em loop acaba"/> <text name="hand_label"> Pose de Mão </text> - <combo_box left_delta="100" width="184" name="hand_pose_combo" tool_tip="Controla o que as mãos fazem durante a animação"> - <combo_box.item name="Spread" label="Espreguiçar" /> - <combo_box.item name="Relaxed" label="Relaxado" /> - <combo_box.item name="PointBoth" label="Apontar Ambos" /> - <combo_box.item name="Fist" label="Punho" /> - <combo_box.item name="RelaxedLeft" label="Relaxado para Esquerda" /> - <combo_box.item name="PointLeft" label="Apontar à Esquerda" /> - <combo_box.item name="FistLeft" label="Punho Esquerdo" /> - <combo_box.item name="RelaxedRight" label="Relaxado para Direita" /> - <combo_box.item name="PointRight" label="Apontar à Direita" /> - <combo_box.item name="FistRight" label="Punho Direito" /> - <combo_box.item name="SaluteRight" label="Saudar à Direita" /> - <combo_box.item name="Typing" label="Digitando" /> - <combo_box.item name="PeaceRight" label="PacÃfico à Direita" /> + <combo_box left_delta="100" name="hand_pose_combo" tool_tip="Controla os gestos das mãos durante a animação" width="184"> + <combo_box.item label="Abrir" name="Spread"/> + <combo_box.item label="Relaxado" name="Relaxed"/> + <combo_box.item label="Apontar ambas" name="PointBoth"/> + <combo_box.item label="Punho" name="Fist"/> + <combo_box.item label="E relaxada" name="RelaxedLeft"/> + <combo_box.item label="Apontar E" name="PointLeft"/> + <combo_box.item label="Punho E" name="FistLeft"/> + <combo_box.item label="D relaxada" name="RelaxedRight"/> + <combo_box.item label="Apontar D" name="PointRight"/> + <combo_box.item label="Punho D" name="FistRight"/> + <combo_box.item label="Saudação D" name="SaluteRight"/> + <combo_box.item label="Escrevendo" name="Typing"/> + <combo_box.item label="Paz D" name="PeaceRight"/> </combo_box> <text name="emote_label"> Expressão </text> - <combo_box left_delta="100" width="184" name="emote_combo" tool_tip="Controla o que a face faz durante a animação."> - <combo_box.item name="[None]" label="None]" /> - <combo_box.item name="Aaaaah" label="Aaaaah" /> - <combo_box.item name="Afraid" label="Temeroso" /> - <combo_box.item name="Angry" label="Raivoso" /> - <combo_box.item name="BigSmile" label="Sorrisão" /> - <combo_box.item name="Bored" label="Entediado" /> - <combo_box.item name="Cry" label="Chorar" /> - <combo_box.item name="Disdain" label="Desprezar" /> - <combo_box.item name="Embarrassed" label="Envergonhado" /> - <combo_box.item name="Frown" label="Franzir a testa" /> - <combo_box.item name="Kiss" label="Beijar" /> - <combo_box.item name="Laugh" label="Rir" /> - <combo_box.item name="Plllppt" label="Plllppt" /> - <combo_box.item name="Repulsed" label="Enojado" /> - <combo_box.item name="Sad" label="Triste" /> - <combo_box.item name="Shrug" label="Indiferença" /> - <combo_box.item name="Smile" label="Sorriso" /> - <combo_box.item name="Surprise" label="Surpreso" /> - <combo_box.item name="Wink" label="Piscar" /> - <combo_box.item name="Worry" label="Preocupado" /> + <combo_box left_delta="100" name="emote_combo" tool_tip="Controla as expressões faciais durante a animação" width="184"> + <item label="(nenhum)" name="[None]" value=""/> + <item label="Aaaaah" name="Aaaaah" value="Aaaaah"/> + <item label="Com medo" name="Afraid" value="Com medo"/> + <item label="Bravo" name="Angry" value="Bravo"/> + <item label="Sorriso contagiante" name="BigSmile" value="Sorriso contagiante"/> + <item label="À toa" name="Bored" value="À toa"/> + <item label="Chorar" name="Cry" value="Chorar"/> + <item label="Desdenho" name="Disdain" value="Desdenho"/> + <item label="Com vergonha" name="Embarrassed" value="Com vergonha"/> + <item label="Franzir testa" name="Frown" value="Franzir testa"/> + <item label="Beijo" name="Kiss" value="Beijo"/> + <item label="Rir" name="Laugh" value="Rir"/> + <item label="Mostrar a lÃngua" name="Plllppt" value="Mostrar a lÃngua"/> + <item label="Asco" name="Repulsed" value="Asco"/> + <item label="Triste" name="Sad" value="Triste"/> + <item label="Encolher os ombros" name="Shrug" value="Encolher os ombros"/> + <item label="Sorriso" name="Smile" value="Sorriso"/> + <item label="Surpresa" name="Surprise" value="Surpresa"/> + <item label="Piscar" name="Wink" value="Piscar"/> + <item label="Preocupado" name="Worry" value="Preocupado"/> </combo_box> <text name="preview_label" width="250"> Prever enquanto </text> - <combo_box left_delta="100" width="130" name="preview_base_anim" tool_tip="Use isto para testar o comportamento de sua animação enquanto seu avatar executa ações comuns."> - <combo_box.item name="Standing" label="Parado" /> - <combo_box.item name="Walking" label="Andando" /> - <combo_box.item name="Sitting" label="Sentando" /> - <combo_box.item name="Flying" label="Voando" /> + <combo_box left_delta="100" name="preview_base_anim" tool_tip="Use isto para testar o comportamento de sua animação enquanto seu avatar executa ações comuns." width="130"> + <item label="Em pé" name="Standing" value="Em pé"/> + <item label="Andando" name="Walking" value="Andando"/> + <item label="Sentado" name="Sitting" value="Sentado"/> + <item label="Voando" name="Flying" value="Voando"/> </combo_box> - <spinner label_width="125" width="192" label="Facilitar a entrada (sec)" name="ease_in_time" tool_tip="Quantidade de tempo (em segundos) para que as animações se mesclem."/> - <spinner bottom_delta="-20" label_width="125" left="10" width="192" label="Facilitar a saÃda (sec)" name="ease_out_time" tool_tip="Quantidade de tempo (em segundos) para que a animações se mesclem."/> - <button bottom_delta="-32" name="play_btn" tool_tip="Executa/pausa sua animação."/> + <spinner label="Facilitar a entrada (sec)" label_width="125" name="ease_in_time" tool_tip="Tempo (em segundos) da transição inicial da animação" width="192"/> + <spinner bottom_delta="-20" label="Facilitar a saÃda (sec)" label_width="125" left="10" name="ease_out_time" tool_tip="Tempo (em segundos) da transição de saÃda da animação" width="192"/> + <button bottom_delta="-32" name="play_btn" tool_tip="Executar animação"/> + <button name="pause_btn" tool_tip="Pausar a animação"/> <button label="" name="stop_btn" tool_tip="Interrompe a execução da animação."/> <text name="bad_animation_text"> Incapaz de ler o arquivo de animação. @@ -72,19 +182,6 @@ Nós recomendamos exportar arquivos BVH do Poser 4. </text> - <button label="Cancelar" name="cancel_btn"/> <button label="Carregar (L$[AMOUNT])" name="ok_btn"/> - <string name="failed_to_initialize"> - Não foi possÃvel iniciar o movimento - </string> - <string name="anim_too_long"> - O arquivo de animação tem [LENGTH] segundos de duração. - -A duração máxima de animação permitida é de [MAX_LENGTH] segundos. - </string> - <string name="failed_file_read"> - Não foi possÃvel ler o arquivo de animação. - -[STATUS] - </string> + <button label="Cancelar" name="cancel_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/pt/floater_auction.xml b/indra/newview/skins/default/xui/pt/floater_auction.xml index 34cd17d781..074f7bf001 100644 --- a/indra/newview/skins/default/xui/pt/floater_auction.xml +++ b/indra/newview/skins/default/xui/pt/floater_auction.xml @@ -1,9 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_auction" title="INICIAR A VENDA DE TERRENOS DA LINDEN"> - <check_box label="Incluir marcador de seleção amarelo" name="fence_check"/> - <button label="Foto" label_selected="Foto" name="snapshot_btn"/> - <button label="OK" label_selected="OK" name="ok_btn"/> - <text name="already for sale"> +<floater name="floater_auction" title="INICIAR VENDA DE TERRENO LINDEN START"> + <floater.string name="already for sale"> Você não pode leiloar terrenos que já estão configurados para venda. - </text> + </floater.string> + <check_box initial_value="true" label="Incluir marcador de seleção amarelo" name="fence_check"/> + <button label="Foto" label_selected="Foto" name="snapshot_btn"/> + <button label="Vender a qualquer um" label_selected="Vender a qualquer um" name="sell_to_anyone_btn"/> + <button label="Clear Settings" label_selected="Limpar configurações" name="reset_parcel_btn"/> + <button label="Iniciar Leilão" label_selected="Iniciar Leilão" name="start_auction_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/pt/floater_avatar_picker.xml b/indra/newview/skins/default/xui/pt/floater_avatar_picker.xml index 186ef30e1b..a2e6f7945a 100644 --- a/indra/newview/skins/default/xui/pt/floater_avatar_picker.xml +++ b/indra/newview/skins/default/xui/pt/floater_avatar_picker.xml @@ -1,42 +1,47 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="avatarpicker" title="ESCOLHA O RESIDENTE" min_width="285" width="285"> +<floater min_width="285" name="avatarpicker" title="SELECIONE O RESIDENTE" width="285"> + <floater.string name="not_found"> + '[TEXT]' não encontrado + </floater.string> + <floater.string name="no_one_near"> + Ninguém por perto + </floater.string> + <floater.string name="no_results"> + Nenhum resultado + </floater.string> + <floater.string name="searching"> + Buscando... + </floater.string> + <string label="Selecionar" label_selected="Selecionar" name="Select"> + Selecionar + </string> + <string name="Close"> + Fechar + </string> <tab_container name="ResidentChooserTabs" width="275"> <panel label="Buscar" name="SearchPanel"> <text name="InstructSearchResidentName"> - Digite parte do nome do Residente: + Digite parte do nome de alguém: </text> - <button label="Encontrar" label_selected="Encontrar" name="Find"/> + <button label="OK" label_selected="OK" name="Find"/> </panel> - <panel label="Cartões de Visita" name="CallingCardsPanel"> - <text name="InstructSelectCallingCard"> - Selecione um cartão de visita: + <panel label="Amigos" name="FriendsPanel"> + <text name="InstructSelectFriend"> + Selecione alguém: </text> </panel> <panel label="Próximo a Mim" name="NearMePanel"> <text name="InstructSelectResident"> - Selecione residente -próximo: + Selecione alguém por perto: </text> - <button font="SansSerifSmall" left_delta="1" width="115" label="Atualizar Lista" label_selected="Atualizar Lista" name="Refresh"/> - <slider label="Faixa" name="near_me_range" bottom_delta="-36"/> + <slider bottom_delta="-36" label="Faixa" name="near_me_range"/> <text name="meters"> Metros </text> - <scroll_list bottom_delta="-169" height="159" name="NearMe" /> + <button font="SansSerifSmall" label="Atualizar Lista" label_selected="Atualizar Lista" left_delta="1" name="Refresh" width="115"/> + <scroll_list bottom_delta="-169" height="159" name="NearMe"/> </panel> </tab_container> - <button label="Selecionar" label_selected="Selecionar" name="Select"/> - <button label="Cancelar" label_selected="Cancelar" name="Cancel"/> - <string name="not_found"> - '[TEXT]' não encontrado - </string> - <string name="no_one_near"> - Ninguém proximo - </string> - <string name="no_results"> - Nenhum resultado - </string> - <string name="searching"> - Buscando... - </string> + <button label="OK" label_selected="OK" name="ok_btn"/> + <button label="Cancelar" label_selected="Cancelar" name="cancel_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/pt/floater_avatar_textures.xml b/indra/newview/skins/default/xui/pt/floater_avatar_textures.xml index 04a78efb12..9473ee7ce9 100644 --- a/indra/newview/skins/default/xui/pt/floater_avatar_textures.xml +++ b/indra/newview/skins/default/xui/pt/floater_avatar_textures.xml @@ -1,30 +1,50 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="avatar_texture_debug" title="TEXTURAS DO AVATAR"> - <text name="baked_label"> - Texturas sobrepostas - </text> - <text name="composite_label"> - Texturas compostas - </text> - <texture_picker label="Cabeça" name="baked_head"/> - <texture_picker label="Maquiagem" name="head_bodypaint"/> - <texture_picker label="Cabelo" name="hair"/> - <button label="Tombar" label_selected="Tombar" name="Dump"/> - <texture_picker label="Olhos" name="baked_eyes"/> - <texture_picker label="Olho" name="eye_texture"/> - <texture_picker label="Parte de cima" name="baked_upper_body"/> - <texture_picker label="Tatuagem para partes de cima" name="upper_bodypaint"/> - <texture_picker label="Camiseta" name="undershirt"/> - <texture_picker label="Luvas" name="gloves"/> - <texture_picker label="Camisa" name="shirt"/> - <texture_picker label="Jaqueta" name="upper_jacket"/> - <texture_picker label="Parte de baixo" name="baked_lower_body"/> - <texture_picker label="Tatuagem para partes de baixo" name="lower_bodypaint"/> - <texture_picker label="Roupas de baixo" name="underpants"/> - <texture_picker label="Meias" name="socks"/> - <texture_picker label="Calçados" name="shoes"/> - <texture_picker label="Calças" name="pants"/> - <texture_picker label="Jaqueta" name="jacket"/> - <texture_picker label="Saia" name="baked_skirt"/> - <texture_picker label="Saia" name="skirt_texture"/> +<floater name="avatar_texture_debug" title="TEXTURAS DE AVATAR"> + <floater.string name="InvalidAvatar"> + AVATAR INVÃLIDO + </floater.string> + <scroll_container name="profile_scroll"> + <panel name="scroll_content_panel"> + <text name="label"> + Pronto +Texturas + </text> + <text name="composite_label"> + Compósito: +Texturas + </text> + <button label="Enviar IDs para painel" label_selected="Dump" name="Dump"/> + <panel name="scroll_content_panel"> + <texture_picker label="Cabelo" name="hair-baked"/> + <texture_picker label="Cabelo" name="hair_grain"/> + <texture_picker label="Cabelo alpha" name="hair_alpha"/> + <texture_picker label="Cabeça" name="head-baked"/> + <texture_picker label="Maquilagem" name="head_bodypaint"/> + <texture_picker label="Cabeça Alpha" name="head_alpha"/> + <texture_picker label="Tatuagem na cabeça" name="head_tattoo"/> + <texture_picker label="Olhos" name="eyes-baked"/> + <texture_picker label="Olho" name="eyes_iris"/> + <texture_picker label="Olhos Alpha" name="eyes_alpha"/> + <texture_picker label="Cintura acima" name="upper-baked"/> + <texture_picker label="Pintura corporal, cintura para cima" name="upper_bodypaint"/> + <texture_picker label="Camiseta" name="upper_undershirt"/> + <texture_picker label="Luvas" name="upper_gloves"/> + <texture_picker label="Camisa" name="upper_shirt"/> + <texture_picker label="Jaqueta (cima)" name="upper_jacket"/> + <texture_picker label="Alpha de cima" name="upper_alpha"/> + <texture_picker label="Tatuagem parte de cima" name="upper_tattoo"/> + <texture_picker label="Cintura para baixo" name="lower-baked"/> + <texture_picker label="Cintura para baixo" name="lower_bodypaint"/> + <texture_picker label="Roupa de baixo" name="lower_underpants"/> + <texture_picker label="Meias" name="lower_socks"/> + <texture_picker label="Sapatos" name="lower_shoes"/> + <texture_picker label="Calças" name="lower_pants"/> + <texture_picker label="Jaqueta" name="lower_jacket"/> + <texture_picker label="Alpha inferior" name="lower_alpha"/> + <texture_picker label="Tatuagem de baixo" name="lower_tattoo"/> + <texture_picker label="Saia" name="skirt-baked"/> + <texture_picker label="Saia" name="skirt"/> + </panel> + </panel> + </scroll_container> </floater> diff --git a/indra/newview/skins/default/xui/pt/floater_beacons.xml b/indra/newview/skins/default/xui/pt/floater_beacons.xml index 82f055745f..b16ff6003e 100644 --- a/indra/newview/skins/default/xui/pt/floater_beacons.xml +++ b/indra/newview/skins/default/xui/pt/floater_beacons.xml @@ -1,15 +1,21 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="beacons" title="BALIZAS"> <panel name="beacons_panel"> - <check_box label="Objetos programados com toque apenas" name="touch_only"/> - <check_box label="Objetos programados" name="scripted"/> - <check_box label="Objetos fÃsicos" name="physical"/> - <check_box label="Fontes de Som" name="sounds"/> - <check_box label="Fontes de PartÃculas" name="particles"/> - <check_box label="Renderização de Highlights" name="highlights"/> - <check_box label="Renderização de Balizas" name="beacons"/> - <text name="beacon_width_label"> - Largura da Baliza + <text name="label_show"> + Mostrar: </text> + <check_box label="Balizas" name="beacons"/> + <check_box label="Realce" name="highlights"/> + <text name="beacon_width_label" tool_tip="Largura da baliza"> + Largura: + </text> + <text name="label_objects"> + Para estes objetos: + </text> + <check_box label="FÃsicos" name="physical"/> + <check_box label="Com script" name="scripted"/> + <check_box label="Só tocar" name="touch_only"/> + <check_box label="Fontes de som" name="sounds"/> + <check_box label="Fontes de partÃculas" name="particles"/> </panel> </floater> diff --git a/indra/newview/skins/default/xui/pt/floater_build_options.xml b/indra/newview/skins/default/xui/pt/floater_build_options.xml index bce78fad21..71a1483dde 100644 --- a/indra/newview/skins/default/xui/pt/floater_build_options.xml +++ b/indra/newview/skins/default/xui/pt/floater_build_options.xml @@ -1,8 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="build options floater" title="OPÇÕES DE GRADE"> - <spinner label="Uni. Grade (metros)" name="GridResolution" width="180" label_width="122"/> - <spinner label="Ext. da Grade (metros)" name="GridDrawSize" width="180" label_width="122"/> - <check_box label="Habilitar ajuste de sub-grade" name="GridSubUnit"/> - <check_box label="Mostrar as seções de cruzamento" name="GridCrossSection"/> + <spinner label="Unidade da grade (metros)" label_width="122" name="GridResolution" width="180"/> + <spinner label="Ext. da Grade (metros)" label_width="122" name="GridDrawSize" width="180"/> + <check_box label="Encaixar em sub-unidades" name="GridSubUnit"/> + <check_box label="Ver corte transversal" name="GridCrossSection"/> + <text name="grid_opacity_label" tool_tip="Opacidade da grade"> + Opacidade: + </text> <slider label="Opacidade da grade" name="GridOpacity" width="220"/> </floater> diff --git a/indra/newview/skins/default/xui/pt/floater_bulk_perms.xml b/indra/newview/skins/default/xui/pt/floater_bulk_perms.xml index 7443e19721..8823d04b62 100644 --- a/indra/newview/skins/default/xui/pt/floater_bulk_perms.xml +++ b/indra/newview/skins/default/xui/pt/floater_bulk_perms.xml @@ -1,44 +1,54 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floaterbulkperms" title="MUDANÇA CONJUNTA DAS PERMISSÕES DE CONTEÚDO"> - <text name="applyto"> - Tipos de Conteúdo - </text> +<floater name="floaterbulkperms" title="EDITAR AUTORIZAÇÕES DE CONTEÚDO"> + <floater.string name="nothing_to_modify_text"> + A seleção não contém nenhum conteúdo editável. + </floater.string> + <floater.string name="status_text"> + Definindo permissões em [NAME] + </floater.string> + <floater.string name="start_text"> + Solicitando mudança de permissão... + </floater.string> + <floater.string name="done_text"> + Solicitação de mudança de permissão concluÃda. + </floater.string> <check_box label="Animação" name="check_animation"/> - <check_box label="Partes do Corpo" name="check_bodypart"/> + <icon name="icon_animation" tool_tip="Animação"/> + <check_box label="Partes do corpo" name="check_bodypart"/> + <icon name="icon_bodypart" tool_tip="Partes do corpo"/> <check_box label="Roupas" name="check_clothing"/> + <icon name="icon_clothing" tool_tip="Vestuário"/> <check_box label="Gestos" name="check_gesture"/> - <check_box label="Landmarks" name="check_landmark"/> - <check_box label="Notecards" name="check_notecard"/> + <icon name="icon_gesture" tool_tip="Gestos"/> + <check_box label="Anotações" name="check_notecard"/> + <icon name="icon_notecard" tool_tip="Anotações"/> <check_box label="Objetos" name="check_object"/> + <icon name="icon_object" tool_tip="Objects"/> <check_box label="Scripts" name="check_script"/> + <icon name="icon_script" tool_tip="Scripts"/> <check_box label="Sons" name="check_sound"/> + <icon name="icon_sound" tool_tip="Sons"/> <check_box label="Texturas" name="check_texture"/> - <button label="Marcar Todas" label_selected="Todas" name="check_all"/> - <button label="Desmarcar Todas" label_selected="Nenhuma" name="check_none"/> + <icon name="icon_texture" tool_tip="Texturas"/> + <button label="Tudo" label_selected="Todas" name="check_all"/> + <button label="Limpar" label_selected="Nenhuma" name="check_none"/> <text name="newperms"> - Novas Permissões + Novas autorizações de conteúdo + </text> + <text name="GroupLabel"> + Grupo: </text> - <check_box label="Compartilhar com o grupo" name="share_with_group"/> - <check_box label="Permitir que qualquer um copie" name="everyone_copy"/> + <check_box label="Compartilhar" name="share_with_group"/> + <text name="AnyoneLabel"> + Todos: + </text> + <check_box label="Copiar" name="everyone_copy"/> <text name="NextOwnerLabel"> - O próximo dono pode: + Próximo proprietário: </text> <check_box label="Modificar" name="next_owner_modify"/> <check_box label="Copiar" name="next_owner_copy"/> - <check_box label="Revender/Dar" name="next_owner_transfer"/> - <button label="Ajuda" name="help"/> - <button label="Aplicar" name="apply"/> - <button label="Fechar" name="close"/> - <string name="nothing_to_modify_text"> - A seleção não contém nenhum conteúdo editável. - </string> - <string name="status_text"> - Definindo permissões em [NAME] - </string> - <string name="start_text"> - Iniciando solicitação de mudança de permissão... - </string> - <string name="done_text"> - Solicitação de mudança de permissão concluÃda. - </string> + <check_box initial_value="true" label="Transferir" name="next_owner_transfer" tool_tip="O próximo dono poderá revender ou dar este objeto"/> + <button label="OK" name="apply"/> + <button label="Cancelar" name="close"/> </floater> diff --git a/indra/newview/skins/default/xui/pt/floater_bumps.xml b/indra/newview/skins/default/xui/pt/floater_bumps.xml index 1833cd4335..5e656f4730 100644 --- a/indra/newview/skins/default/xui/pt/floater_bumps.xml +++ b/indra/newview/skins/default/xui/pt/floater_bumps.xml @@ -1,21 +1,24 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="floater_bumps" title="COLISÕES, IMPULSOS E BATIDAS"> - <text name="none_detected"> + <floater.string name="none_detected"> Nada detectado - </text> - <text name="bump"> + </floater.string> + <floater.string name="bump"> [TIME] [FIRST] [LAST] conflitou com você - </text> - <text name="llpushobject"> + </floater.string> + <floater.string name="llpushobject"> [TIME] [FIRST] [LAST] empurrou você com um script - </text> - <text name="selected_object_collide"> + </floater.string> + <floater.string name="selected_object_collide"> [TIME] [FIRST] [LAST] o atingiu com um objeto - </text> - <text name="scripted_object_collide"> + </floater.string> + <floater.string name="scripted_object_collide"> [TIME] [FIRST] [LAST] o atingiu com um objeto programado - </text> - <text name="physical_object_collide"> + </floater.string> + <floater.string name="physical_object_collide"> [TIME] [FIRST] [LAST] o atingiu com um objeto fÃsico - </text> + </floater.string> + <floater.string name="timeStr"> + [[hour,datetime,slt]:[min,datetime,slt]] + </floater.string> </floater> diff --git a/indra/newview/skins/default/xui/pt/floater_buy_contents.xml b/indra/newview/skins/default/xui/pt/floater_buy_contents.xml index 322a07575a..c64523ceb3 100644 --- a/indra/newview/skins/default/xui/pt/floater_buy_contents.xml +++ b/indra/newview/skins/default/xui/pt/floater_buy_contents.xml @@ -7,8 +7,8 @@ Comprar por L$[AMOUNT] de(a) [NAME]? </text> <button label="Cancelar" label_selected="Cancelar" name="cancel_btn" width="73"/> - <button label="Comprar" label_selected="Comprar" name="buy_btn" width="73" left_delta="-77"/> - <check_box label="Vestir roupa agora" name="wear_check" left_delta="-130"/> + <button label="Comprar" label_selected="Comprar" left_delta="-77" name="buy_btn" width="73"/> + <check_box label="Vestir roupa agora" left_delta="-130" name="wear_check"/> <string name="no_copy_text"> (sem copiar) </string> diff --git a/indra/newview/skins/default/xui/pt/floater_buy_currency.xml b/indra/newview/skins/default/xui/pt/floater_buy_currency.xml index f17c069ecf..a737212b50 100644 --- a/indra/newview/skins/default/xui/pt/floater_buy_currency.xml +++ b/indra/newview/skins/default/xui/pt/floater_buy_currency.xml @@ -1,71 +1,66 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="buy currency" title="COMPRAR DINHEIRO"> - <text name="info_buying"> - Comprando Dinheiro: - </text> - <text name="info_cannot_buy"> - Não pode comprar agora: - </text> +<floater name="buy currency" title="Comprar L$"> + <floater.string name="buy_currency"> + Compre L$ [LINDENS] por aprox. [LOCALAMOUNT] + </floater.string> <text name="info_need_more"> - Você precisa de mais dinheiro: + Você precisa de mais L$ </text> - <text name="error_message"> - Algo não está certo. - </text> - <button label="Ir para o website" name="error_web"/> <text name="contacting"> Contatando LindeX... </text> - <text name="buy_action_unknown"> - Comprar L$ no câmbio atual da LindeX - </text> - <text name="buy_action"> - [NAME] L$ [PRICE] - </text> - <text name="currency_action" width="60"> + <text name="info_buying"> Comprar L$ </text> - <line_editor name="currency_amt" left_delta="65" width="70"> - 1234 - </line_editor> - <text name="currency_est" left_delta="72"> - por aproxim. [LOCALAMOUNT] - </text> - <text name="getting_data"> - Obtendo dados... - </text> <text name="balance_label"> - Você tem atualmente + Tenho </text> <text name="balance_amount"> L$ [AMT] </text> + <text name="currency_action" width="60"> + Comprar + </text> + <text name="currency_label"> + L$ + </text> + <line_editor label="L$" left_delta="65" name="currency_amt" width="70"> + 1234 + </line_editor> <text name="buying_label"> - Você está comprando + O preço é </text> - <text name="buying_amount"> - L$ [AMT] + <text left_delta="72" name="currency_est"> + aprox. [LOCALAMOUNT] + </text> + <text name="getting_data"> + Calculando... + </text> + <text name="buy_action"> + [ACTION] </text> <text name="total_label"> - Seu saldo será + Saldo resultante: </text> <text name="total_amount"> L$ [AMT] </text> <text name="currency_links"> - [http://www.secondlife.com/my/account/payment_method_management.php?lang=pt-BR payment method] | [http://www.secondlife.com/my/account/currency.php?lang=pt-BR currency] | [http://www.secondlife.com/my/account/exchange_rates.php?lang=pt-BR exchange rate] + [http://www.secondlife.com/my/account/payment_method_management.php payment method] | [http://www.secondlife.com/my/account/currency.php currency] | [http://www.secondlife.com/my/account/exchange_rates.php exchange rate] + </text> + <text name="exchange_rate_note"> + Digite o valor novamente para ver o câmbio atual. </text> <text name="purchase_warning_repurchase"> - Confirmando esta compra só compra a moeda. -Você precisará tentar novamente a operação. + Confirmar esta transação compra somente L$, não o objeto. </text> <text name="purchase_warning_notenough"> - Você não está comprando moeda suficiente. -Aumente a quantidade de compra. + O valor da transação não é suficiente. Aumente o volume da compra. </text> + <button label="Comprar já!" name="buy_btn"/> <button label="Fechar" name="cancel_btn"/> - <button label="Adquirir" name="buy_btn"/> - <string name="buy_currency"> - Comprar L$ [LINDENS] por aproxim. [LOCALAMOUNT] - </string> + <text name="info_cannot_buy"> + Transação incompleta + </text> + <button label="Prosseguir para a web" name="error_web"/> </floater> diff --git a/indra/newview/skins/default/xui/pt/floater_buy_currency_html.xml b/indra/newview/skins/default/xui/pt/floater_buy_currency_html.xml new file mode 100644 index 0000000000..24e41ac8c8 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/floater_buy_currency_html.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_buy_currency_html" title="COMPRAR MOEDA"/> diff --git a/indra/newview/skins/default/xui/pt/floater_buy_land.xml b/indra/newview/skins/default/xui/pt/floater_buy_land.xml index 6e502ad6e5..5c5ee3b7a0 100644 --- a/indra/newview/skins/default/xui/pt/floater_buy_land.xml +++ b/indra/newview/skins/default/xui/pt/floater_buy_land.xml @@ -1,27 +1,151 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="buy land" title="COMPRAR TERRA"> +<floater name="buy land" title="COMPRAR TERRENO"> + <floater.string name="can_resell"> + Pode ser revendida. + </floater.string> + <floater.string name="can_not_resell"> + Não pode ser revendida. + </floater.string> + <floater.string name="can_change"> + Pode ser unida ou subdivida. + </floater.string> + <floater.string name="can_not_change"> + Não pode ser unida ou subdividida. + </floater.string> + <floater.string name="cant_buy_for_group"> + Você não tem permissão para comprar terra para seu grupo ativo. + </floater.string> + <floater.string name="no_land_selected"> + Nenhuma terra selecionada. + </floater.string> + <floater.string name="multiple_parcels_selected"> + Múltiplos e diferentes lotes selecionados. Tente selecionar uma área menor. + </floater.string> + <floater.string name="no_permission"> + Você não tem permissão para comprar uma terra para seu grupo ativo. + </floater.string> + <floater.string name="parcel_not_for_sale"> + O lote selecionado não está a venda. + </floater.string> + <floater.string name="group_already_owns"> + O grupo já possui o lote. + </floater.string> + <floater.string name="you_already_own"> + Você já possui o lote. + </floater.string> + <floater.string name="set_to_sell_to_other"> + O lote selecionado está configurado para ser vendido para outro grupo. + </floater.string> + <floater.string name="no_public_land"> + A área selecionada não tem terras públicas. + </floater.string> + <floater.string name="not_owned_by_you"> + Terrenos de outros residentes foram selecionados. +Tente selecionar uma área menor. + </floater.string> + <floater.string name="processing"> + Processando sua compra... + +(Isso pode levar um minuto.) + </floater.string> + <floater.string name="fetching_error"> + Houve um erro ao buscar informações sobre compra de terras. + </floater.string> + <floater.string name="buying_will"> + Comprar esta terra irá: + </floater.string> + <floater.string name="buying_for_group"> + Ao comprar terra para o grupo: + </floater.string> + <floater.string name="cannot_buy_now"> + Não foi possÃvel comprar agora: + </floater.string> + <floater.string name="not_for_sale"> + Não disponÃvel para venda: + </floater.string> + <floater.string name="none_needed"> + nada necessário + </floater.string> + <floater.string name="must_upgrade"> + Sua conta deve ser evoluÃda para adquirir um lote. + </floater.string> + <floater.string name="cant_own_land"> + Sua conta pode possuir uma terra. + </floater.string> + <floater.string name="land_holdings"> + Você tem [BUYER] m². + </floater.string> + <floater.string name="pay_to_for_land"> + Pagar L$ [AMOUNT] para [SELLER] por esta terra + </floater.string> + <floater.string name="buy_for_US"> + Compre L$ [AMOUNT] por cerca de [LOCAL_AMOUNT], + </floater.string> + <floater.string name="parcel_meters"> + Este lote tem [AMOUNT] m² + </floater.string> + <floater.string name="premium_land"> + Esse é um terreno premium e custa o equivalente a [AMOUNT] m². + </floater.string> + <floater.string name="discounted_land"> + Esse é um terreno com desconto, e custa o equivalente a [AMOUNT] m². + </floater.string> + <floater.string name="meters_supports_object"> + [AMOUNT] m² +suporta [AMOUNT2] objetos + </floater.string> + <floater.string name="sold_with_objects"> + vendido com objetos + </floater.string> + <floater.string name="sold_without_objects"> + objetos não incluÃdos + </floater.string> + <floater.string name="info_price_string"> + L$ [PRICE] +(L$ [PRICE_PER_SQM]/m²) +[SOLD_WITH_OBJECTS] + </floater.string> + <floater.string name="insufficient_land_credits"> + O grupo [GROUP] precisará de fundos suficientes de terras +contribuÃdas para cobrir este lote antes da aquisição se completar. + </floater.string> + <floater.string name="have_enough_lindens"> + Você tem L$ [AMOUNT], suficiente para comprar este lote. + </floater.string> + <floater.string name="not_enough_lindens"> + Você tem somente L$ [AMOUNT], e precisa de mais L$ [AMOUNT2]. + </floater.string> + <floater.string name="balance_left"> + Após a compra, restará L$ [AMOUNT]. + </floater.string> + <floater.string name="balance_needed"> + Você precisa comprar pelo menos L$ [AMOUNT] para ter recursos para este lote. + </floater.string> + <floater.string name="no_parcel_selected"> + (nenhum lote selecionado) + </floater.string> <text name="region_name_label"> Região: </text> - <text name="region_name_text" left="560"> + <text left="560" name="region_name_text"> (desconhecido) </text> <text name="region_type_label"> Tipo: </text> - <text name="region_type_text" left="560"> + <text left="560" name="region_type_text"> (desconhecido) </text> <text name="estate_name_label"> Propriedade: </text> - <text name="estate_name_text" left="560"> + <text left="560" name="estate_name_text"> (desconhecido) </text> - <text name="estate_owner_label" width="105" right="565"> + <text name="estate_owner_label" right="565" width="105"> Dono da propriedade: </text> - <text name="estate_owner_text" left="560" > + <text left="560" name="estate_owner_text"> (desconhecido) </text> <text name="resellable_changeable_label"> @@ -40,7 +164,7 @@ <text_editor name="covenant_editor"> Carregando... </text_editor> - <check_box label="Eu concordo com as definições do Corretor feitas acima." name="agree_covenant"/> + <check_box label="Eu concordo com as definições do Corretor feitas acima." name="agree_covenant"/> <text name="info_parcel_label"> Lote: </text> @@ -58,8 +182,7 @@ </text> <text name="info_price"> L$ 1500 -(L$ 1.1/m²) -vendido com os objetos +(L$ 1,1/m²) inclui objetos </text> <text name="info_action"> Comprar este lote irá: @@ -67,7 +190,7 @@ vendido com os objetos <text name="error_message"> Algo ainda não está correto. </text> - <button label="Ir para a página da web" name="error_web" width="150" /> + <button label="Ir para a página da web" name="error_web" width="150"/> <text name="account_action"> Evoluir sua conta para membro Premium </text> @@ -75,16 +198,16 @@ vendido com os objetos Somente membros Premium podem possuir terra. </text> <combo_box name="account_level"> - <combo_box.item name="US$9.95/month,billedmonthly" label="US$9.95/mês, debitado mensalmente" /> - <combo_box.item name="US$7.50/month,billedquarterly" label="US$7.50/mês, debitado trimestralmente" /> - <combo_box.item name="US$6.00/month,billedannually" label="US$6.00/mês, debitado anualmente" /> + <combo_box.item label="US$9.95/mês, pagamento mensal" name="US$9.95/month,billedmonthly"/> + <combo_box.item label="US$7,50/mês, pagamento trimestral" name="US$7.50/month,billedquarterly"/> + <combo_box.item label="US$6.00/mês, pagamento trimestral" name="US$6.00/month,billedannually"/> </combo_box> <text name="land_use_action"> Aumente sua taxa de locação de terra para US$ 40/mês. </text> <text name="land_use_reason"> - Você possui 1309 m² de terra. -Este lote tem 512 m² de terra. + Você tem 1309 m². +Este lote mede 512 m². </text> <text name="purchase_action"> Pagar ao Residente Joe L$4000 pela terra @@ -95,142 +218,16 @@ Este lote tem 512 m² de terra. <text name="currency_action" width="116"> Compre L$ adicionais </text> - <line_editor name="currency_amt" left="190" width="65"> + <line_editor left="190" name="currency_amt" width="65"> 1000 </line_editor> <text name="currency_est"> - por aproxim. US$ [AMOUNT2] + cerca de [LOCAL_AMOUNT] </text> <text name="currency_balance"> Você tem L$2,100. </text> - <check_box label="Remover [AMOUNT] m² de contribuição do grupo." name="remove_contribution"/> + <check_box label="Subtrair [AMOUNT] m² da minha contribuição." name="remove_contribution"/> <button label="Adquirir" name="buy_btn"/> <button label="Cancelar" name="cancel_btn"/> - <string name="can_resell"> - Pode ser revendida. - </string> - <string name="can_not_resell"> - Não pode ser revendida. - </string> - <string name="can_change"> - Pode ser unida ou subdivida. - </string> - <string name="can_not_change"> - Não pode ser unida ou subdividida. - </string> - <string name="cant_buy_for_group"> - Você não tem permissão para comprar terra para seu grupo ativo. - </string> - <string name="no_land_selected"> - Nenhuma terra selecionada. - </string> - <string name="multiple_parcels_selected"> - Múltiplos e diferentes lotes selecionados. Tente selecionar uma área menor. - </string> - <string name="no_permission"> - Você não tem permissão para comprar uma terra para seu grupo ativo. - </string> - <string name="parcel_not_for_sale"> - O lote selecionado não está a venda. - </string> - <string name="group_already_owns"> - O grupo já possui o lote. - </string> - <string name="you_already_own"> - Você já possui o lote. - </string> - <string name="set_to_sell_to_other"> - O lote selecionado está configurado para ser vendido para outro grupo. - </string> - <string name="no_public_land"> - A área selecionada não tem terras públicas. - </string> - <string name="not_owned_by_you"> - Está selecionada uma terra pertencente a outro usuário. Tente selecionar uma área menor. - </string> - <string name="processing"> - Processando sua compra... - -(Isso pode levar um minuto.) - </string> - <string name="fetching_error"> - Houve um erro ao buscar informações sobre compra de terras. - </string> - <string name="buying_will"> - Comprar esta terra irá: - </string> - <string name="buying_for_group"> - Ao comprar terra para o grupo: - </string> - <string name="cannot_buy_now"> - Não foi possÃvel comprar agora: - </string> - <string name="not_for_sale"> - Não disponÃvel para venda: - </string> - <string name="none_needed"> - nada necessário - </string> - <string name="must_upgrade"> - Sua conta deve ser evoluÃda para adquirir um lote. - </string> - <string name="cant_own_land"> - Sua conta pode possuir uma terra. - </string> - <string name="land_holdings"> - Você possui [BUYER] m² de terra. - </string> - <string name="pay_to_for_land"> - Pagar L$ [AMOUNT] para [SELLER] por esta terra - </string> - <string name="buy_for_US"> - Comprar L$ [AMOUNT] por aprox. US$ [AMOUNT2], - </string> - <string name="parcel_meters"> - Este lote tem [AMOUNT] m². - </string> - <string name="premium_land"> - Esta terra é premium e será taxada como [AMOUNT] m². - </string> - <string name="discounted_land"> - Esta terra tem desconto e será taxada como [AMOUNT] m². - </string> - <string name="meters_supports_object"> - [AMOUNT] m² -aceita [AMOUNT2] objetos - </string> - <string name="sold_with_objects"> - vendido com objetos - </string> - <string name="sold_without_objects"> - objetos não incluÃdos - </string> - <string name="info_price_string"> - L$ [PRICE] -(L$ [PRICE_PER_SQM]/m²) -[SOLD_WITH_OBJECTS] - </string> - <string name="insufficient_land_credits"> - O grupo [GROUP] precisará de fundos suficientes de terras -contribuÃdas para cobrir este lote antes da aquisição se completar. - </string> - <string name="have_enough_lindens"> - Você tem L$ [AMOUNT], suficiente para comprar este lote. - </string> - <string name="not_enough_lindens"> - Você tem somente L$ [AMOUNT], e precisa de mais L$ [AMOUNT2]. - </string> - <string name="balance_left"> - Após a compra, restará L$ [AMOUNT]. - </string> - <string name="balance_needed"> - Você precisa comprar pelo menos L$ [AMOUNT] para ter recursos para este lote. - </string> - <string name="no_parcel_selected"> - (nenhum lote selecionado) - </string> - <string name="buy_currency"> - Comprar L$ [LINDENS] por aproxim. US$ [USD] - </string> </floater> diff --git a/indra/newview/skins/default/xui/pt/floater_buy_object.xml b/indra/newview/skins/default/xui/pt/floater_buy_object.xml index e9968ed8f8..d71eb04cc4 100644 --- a/indra/newview/skins/default/xui/pt/floater_buy_object.xml +++ b/indra/newview/skins/default/xui/pt/floater_buy_object.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="contents" title="COMPRAR CÓPIA DO OBJETO"> <text name="contents_text"> - e seus conteúdos: + Contém: </text> <text name="buy_text"> Comprar por L$[AMOUNT] de(a) [NAME]? diff --git a/indra/newview/skins/default/xui/pt/floater_camera.xml b/indra/newview/skins/default/xui/pt/floater_camera.xml index b61e261148..7343bd9aa8 100644 --- a/indra/newview/skins/default/xui/pt/floater_camera.xml +++ b/indra/newview/skins/default/xui/pt/floater_camera.xml @@ -9,8 +9,28 @@ <floater.string name="move_tooltip"> Mover a Câmera para Cima e para Baixo, para a Esquerda e para a Direita </floater.string> + <floater.string name="camera_modes_title"> + Modos de câmera + </floater.string> + <floater.string name="pan_mode_title"> + Pan zoom orbital + </floater.string> + <floater.string name="presets_mode_title"> + Ângulos predefinidos + </floater.string> + <floater.string name="free_mode_title"> + Visualizar objeto + </floater.string> <panel name="controls"> - <joystick_track name="cam_track_stick" tool_tip="Mover a Câmera para Cima e para Baixo, para a Esquerda e para a Direita"/> - <joystick_zoom name="zoom" tool_tip="Aproximar a Câmera in direção ao Foco"/> + <panel name="zoom" tool_tip="Aproximar a Câmera in direção ao Foco"> + <joystick_rotate name="cam_rotate_stick" tool_tip="Girar câmera ao redor do foco"/> + <slider_bar name="zoom_slider" tool_tip="Zoom de câmera para focalizar"/> + <joystick_track name="cam_track_stick" tool_tip="Move a câmera para cima e para baixo, direita e esquerda"/> + </panel> + </panel> + <panel name="buttons"> + <button label="" name="presets_btn" tool_tip="Ângulos predefinidos"/> + <button label="" name="pan_btn" tool_tip="Pan zoom orbital"/> + <button label="" name="avatarview_btn" tool_tip="Modos de câmera"/> </panel> </floater> diff --git a/indra/newview/skins/default/xui/pt/floater_choose_group.xml b/indra/newview/skins/default/xui/pt/floater_choose_group.xml index ae395734e9..60f01a3733 100644 --- a/indra/newview/skins/default/xui/pt/floater_choose_group.xml +++ b/indra/newview/skins/default/xui/pt/floater_choose_group.xml @@ -1,8 +1,8 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="groups" title="GRUPOS"> <text name="groupdesc"> Escolha um grupo: </text> - <button label="OK" label_selected="OK" name="OK" /> - <button label="Cancelar" label_selected="Cancelar" name="Cancel" /> + <button label="OK" label_selected="OK" name="OK"/> + <button label="Cancelar" label_selected="Cancelar" name="Cancel"/> </floater> diff --git a/indra/newview/skins/default/xui/pt/floater_color_picker.xml b/indra/newview/skins/default/xui/pt/floater_color_picker.xml index 6a4263f4ff..4ea014335f 100644 --- a/indra/newview/skins/default/xui/pt/floater_color_picker.xml +++ b/indra/newview/skins/default/xui/pt/floater_color_picker.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="ColorPicker" title="SELETOR DE COR"> +<floater name="ColorPicker" title="DESTAQUE DE COR"> <text name="r_val_text"> Vermelho: </text> @@ -18,15 +18,14 @@ <text name="l_val_text"> Lum: </text> - <check_box label="Aplicar imediatamente" name="apply_immediate"/> - <button left_delta="150" name="color_pipette" /> - <button left_delta="55" label="Cancelar" label_selected="Cancelar" name="cancel_btn"/> - <button label="Selecionar" label_selected="Selecionar" name="select_btn"/> + <check_box label="inscrever-se agora" name="apply_immediate"/> + <button left_delta="150" name="color_pipette"/> + <button label="Cancelar" label_selected="Cancelar" left_delta="55" name="cancel_btn"/> + <button label="OK" label_selected="OK" name="select_btn"/> <text name="Current color:"> Cor atual: </text> <text name="(Drag below to save.)"> - (Arraste abaixo - para salvar) + (Arrastar abaixo para salvar) </text> </floater> diff --git a/indra/newview/skins/default/xui/pt/floater_customize.xml b/indra/newview/skins/default/xui/pt/floater_customize.xml index 55946933e7..a9ec0b9b1f 100644 --- a/indra/newview/skins/default/xui/pt/floater_customize.xml +++ b/indra/newview/skins/default/xui/pt/floater_customize.xml @@ -1,7 +1,9 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater customize" title="APARÊNCIA" width="546"> - <tab_container name="customize tab container" tab_min_width="115" width="544"> - <placeholder label="Partes de corpo" name="body_parts_placeholder"/> +<floater name="floater customize" title="APARÊNCIA"> + <tab_container name="customize tab container" tab_min_width="115"> + <text label="Corpo" name="body_parts_placeholder"> + Partes do corpo + </text> <panel label="Forma" name="Shape"> <button label="Reverter" label_selected="Reverter" name="Revert"/> <button label="Corpo" label_selected="Corpo" name="Body"/> @@ -14,8 +16,8 @@ <button label="Tórax" label_selected="Tórax" name="Torso"/> <button label="Pernas" label_selected="Pernas" name="Legs"/> <radio_group name="sex radio"> - <radio_item name="radio" label="Feminino" /> - <radio_item name="radio2" label="Masculino" /> + <radio_item label="Feminino" name="radio" value="0"/> + <radio_item label="Masculino" name="radio2" value="1"/> </radio_group> <text name="title"> [DESC] @@ -33,8 +35,7 @@ Localizado em [PATH] </text> <text name="not worn instructions"> - Coloque uma nova forma arrastando uma do seu inventário para seu avatar. -Alternativamente, você pode criar uma nova de um esboço e usá-la. + Para obter um fÃsico novo, arraste um do inventário para o seu avatar. Ou crie um novo. </text> <text name="no modify instructions"> Você não tem permissão para modificar esta vestimenta. @@ -42,15 +43,15 @@ Alternativamente, você pode criar uma nova de um esboço e usá-la. <text name="Item Action Label"> Forma: </text> - <button label="Criar Nova Forma" label_selected="Criar Nova Forma" name="Create New"/> + <button label="Nova" label_selected="Nova" name="Create New"/> <button label="Salvar" label_selected="Salvar" name="Save"/> <button label="Salvar como..." label_selected="Salvar como..." name="Save As"/> </panel> <panel label="Pele" name="Skin"> - <button width="115" label="Cor de Pele" label_selected="Cor de Pele" name="Skin Color"/> - <button width="115" label="Detalhes Faciais" label_selected="Detalhes Faciais" name="Face Detail"/> - <button width="115" label="Maquiagem" label_selected="Maquiagem" name="Makeup"/> - <button width="115" label="Detalhes do Corpo" label_selected="Detalhes do Corpo" name="Body Detail"/> + <button label="Cor de pele" label_selected="Cor de pele" name="Skin Color" width="115"/> + <button label="Detalhes faciais" label_selected="Detalhes faciais" name="Face Detail" width="115"/> + <button label="Maquilagem" label_selected="Maquilagem" name="Makeup" width="115"/> + <button label="Detalhes do corpo" label_selected="Detalhes do corpo" name="Body Detail" width="115"/> <text name="title"> [DESC] </text> @@ -67,9 +68,7 @@ Alternativamente, você pode criar uma nova de um esboço e usá-la. Localizada em [PATH] </text> <text name="not worn instructions"> - Coloque uma nova pele arrastando uma de seu inventário para seu avatar. -Alternativamente, você pode criar uma nova forma a partir de um esboço -e usá-la. + Para obter uma pele nova, arraste uma do inventário para o seu avatar. Ou crie uma pele nova. </text> <text name="no modify instructions"> Você não tem permissão para modificar esta vestimenta. @@ -77,19 +76,19 @@ e usá-la. <text name="Item Action Label"> Pele: </text> - <texture_picker width="86" label="Tattoo: cabeça" name="Head Tattoos" tool_tip="Clique para escolher um desenho"/> - <texture_picker width="86" label="Tattoo: superior" name="Upper Tattoos" tool_tip="Clique para escolher um desenho"/> - <texture_picker width="86" label="Tattoo: inferior" name="Lower Tattoos" tool_tip="Clique para escolher um desenho"/> - <button label="Criar Nova Pele" label_selected="Criar Nova Pele" name="Create New"/> + <texture_picker label="Tattoo: cabeça" name="Head Tattoos" tool_tip="Clique para escolher um desenho" width="86"/> + <texture_picker label="Tattoo: superior" name="Upper Tattoos" tool_tip="Clique para escolher um desenho" width="86"/> + <texture_picker label="Tattoo: inferior" name="Lower Tattoos" tool_tip="Clique para escolher um desenho" width="86"/> + <button label="Novo" label_selected="Novo" name="Create New"/> <button label="Salvar" label_selected="Salvar" name="Save"/> <button label="Salvar como..." label_selected="Salvar como..." name="Save As"/> <button label="Reverter" label_selected="Reverter" name="Revert"/> </panel> <panel label="Cabelo" name="Hair"> - <button width="115" label="Cor" label_selected="Cor" name="Color"/> - <button width="115" label="Estilo" label_selected="Estilo" name="Style"/> - <button width="115" label="Sombrancelhas" label_selected="Sombrancelhas" name="Eyebrows"/> - <button width="115" label="Rosto" label_selected="Rosto" name="Facial"/> + <button label="Cor" label_selected="Cor" name="Color" width="115"/> + <button label="Estilo" label_selected="Estilo" name="Style" width="115"/> + <button label="Sombrancelhas" label_selected="Sombrancelhas" name="Eyebrows" width="115"/> + <button label="Rosto" label_selected="Rosto" name="Facial" width="115"/> <text name="title"> [DESC] </text> @@ -106,9 +105,7 @@ e usá-la. Localizado em [PATH] </text> <text name="not worn instructions"> - Ponha um novo cabelo em seu avatar arrastando um do seu inventário. -Alternativamente, você pode criar um novo modelo a partir de um esboço -e usá-lo. + Para obter um cabelo novo, arraste um tipo de cabelo do inventário para o seu avatar. Ou crie um cabelo novo. </text> <text name="no modify instructions"> Você não ter permissão para modificar essa vestimenta. @@ -117,7 +114,7 @@ e usá-lo. Cabelo: </text> <texture_picker label="Texture" name="Texture" tool_tip="Clique para escolher uma imagem"/> - <button label="Criar Novo Cabelo" label_selected="Criar Novo Cabelo" name="Create New"/> + <button label="Criar novo cabelo" label_selected="Criar novo cabelo" name="Create New"/> <button label="Salvar" label_selected="Salvar" name="Save"/> <button label="Salvar como..." label_selected="Salvar como..." name="Save As"/> <button label="Reverter" label_selected="Reverter" name="Revert"/> @@ -139,8 +136,7 @@ e usá-lo. Localizado em [PATH] </text> <text name="not worn instructions"> - Para colocar novos olhos, arraste um do seu inventário para seu avatar. -Alternativamente, você pode criar um novo modelo de um esboço e usá-lo. + Para obter novos olhos, arraste um tipo de olhos do inventário para o seu avatar. Ou crie olhos novos. </text> <text name="no modify instructions"> Você não tem permissão para alterar esta vestimenta. @@ -149,17 +145,19 @@ Alternativamente, você pode criar um novo modelo de um esboço e usá-lo. Olhos: </text> <texture_picker label="Ãris" name="Iris" tool_tip="Clique para escolher uma imagem"/> - <button label="Criar Novos Olhos" label_selected="Criar Novos Olhos" name="Create New"/> + <button label="Criar novos olhos" label_selected="Criar novos olhos" name="Create New"/> <button label="Salvar" label_selected="Salvar" name="Save"/> <button label="Salvar como..." label_selected="Salvar como..." name="Save As"/> <button label="Reverter" label_selected="Reverter" name="Revert"/> </panel> - <panel label="Roupas" name="clothes_placeholder"/> + <text label="Roupas" name="clothes_placeholder"> + Roupa + </text> <panel label="Camisa" name="Shirt"> <texture_picker label="Tecido" name="Fabric" tool_tip="Clique para escolher uma imagem"/> - <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Clique para pegar o conta-gotas"/> - <button label="Criar Nova Camisa" label_selected="Criar Nova Camisa" name="Create New"/> + <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Selecionar a cor"/> <button label="Remover" label_selected="Remover" name="Take Off"/> + <button label="Criar nova camisa" label_selected="Criar nova camisa" name="Create New"/> <button label="Salvar" label_selected="Salvar" name="Save"/> <button label="Salvar como..." label_selected="Salvar como..." name="Save As"/> <button label="Reverter" label_selected="Reverter" name="Revert"/> @@ -179,9 +177,7 @@ Alternativamente, você pode criar um novo modelo de um esboço e usá-lo. Localizado em [PATH] </text> <text name="not worn instructions"> - Para por uma nova camisa em seu avatar, arraste uma do seu inventário para -seu avatar. Alternativamente, você pode criar um novo modelo a partir de -um esboço e usá-lo. + Para obter uma camisa nova, arraste uma do inventário para o seu avatar. Ou crie uma camisa nova. </text> <text name="no modify instructions"> Você não ter permissão para modificar esta vestimenta. @@ -192,9 +188,9 @@ um esboço e usá-lo. </panel> <panel label="Calças" name="Pants"> <texture_picker label="Tecido" name="Fabric" tool_tip="Clique para escolher uma imagem"/> - <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Clique para abrir o conta-gotas."/> - <button label="Criar Novas Calças" label_selected="Criar Novas Calças" name="Create New"/> + <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Selecionar a cor"/> <button label="Remover" label_selected="Remover" name="Take Off"/> + <button label="Criar novas calças" label_selected="Criar novas calças" name="Create New"/> <button label="Salvar" label_selected="Salvar" name="Save"/> <button label="Salvar como..." label_selected="Salvar como..." name="Save As"/> <button label="Reverter" label_selected="Reverter" name="Revert"/> @@ -214,9 +210,7 @@ um esboço e usá-lo. Localizado em [PATH] </text> <text name="not worn instructions"> - Para por uma nova calça em seu avatar, basta arrastar uma outra do seu -inventário. Alternativamente, você pode criar um novo modelo a partir -de um esboço e usá-lo. + Para obter calças novas, arraste uma do inventário para o seu avatar. Ou crie calças novas. </text> <text name="no modify instructions"> Você não tem permissão para modificar esta vestimenta. @@ -242,10 +236,9 @@ de um esboço e usá-lo. Localizado em [PATH] </text> <text name="not worn instructions"> - Para por novos sapatos em seu avatar, basta arrastar um novo do seu -inventário. Alternativamente, você pode criar um novo modelo a partir -de um esboço e usá-lo. + Para obter novos olhos, arraste um tipo de olhos do inventário para o seu avatar. Ou crie olhos novos. </text> + <button label="Criar novos sapatos" label_selected="Criar novos sapatos" name="Create New" width="166"/> <text name="no modify instructions"> Você não tem permissão para modificar esta vestimenta. </text> @@ -253,8 +246,7 @@ de um esboço e usá-lo. Sapatos: </text> <texture_picker label="Tecido" name="Fabric" tool_tip="Clique para escolher uma imagem"/> - <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Clique para pegar o conta-gotas"/> - <button label="Criar Novos Sapatos" label_selected="Criar Novos Sapatos" name="Create New" width="166"/> + <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Selecionar a cor"/> <button label="Remover" label_selected="Remover" name="Take Off"/> <button label="Salvar" label_selected="Salvar" name="Save"/> <button label="Salvar como..." label_selected="Salvar como..." name="Save As"/> @@ -277,10 +269,9 @@ de um esboço e usá-lo. Localizado em [PATH] </text> <text name="not worn instructions"> - Para por novas meias em seu avatar, basta arrastar uma nova do seu -inventário. Alternativamente, você pode criar novas meias a partir de -um esboço e usá-las. + Para obter meias novas, arraste um par do inventário para o seu avatar. Ou crie meias novas. </text> + <button label="Criar novas meias" label_selected="Criar novas meias" name="Create New"/> <text name="no modify instructions"> Você não tem permissão para modificar essa vestimenta. </text> @@ -288,8 +279,7 @@ um esboço e usá-las. Meias: </text> <texture_picker label="Tecido" name="Fabric" tool_tip="Clique para escolher uma imagem"/> - <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Clique para pegar o conta-gotas"/> - <button label="Criar Novas Meias" label_selected="Criar Novas Meias" name="Create New"/> + <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Selecionar a cor"/> <button label="Remover" label_selected="Remover" name="Take Off"/> <button label="Salvar" label_selected="Salvar" name="Save"/> <button label="Salvar como..." label_selected="Salvar como..." name="Save As"/> @@ -312,20 +302,18 @@ um esboço e usá-las. Localizado em [PATH] </text> <text name="not worn instructions"> - Para por uma nova jaqueta em seu avatar, basta arrastar um novo modelo -do seu inventário. Alternativamente, você pode criar um novo modelo a -partir de um esboço e usá-lo. + Para por uma jaqueta nova, arraste uma do inventário para o seu avatar. Ou crie uma jaqueta nova. </text> + <button label="Criar nova jaqueta" label_selected="Criar nova jaqueta" name="Create New"/> <text name="no modify instructions"> Você não tem permissão para modificar esta vestimenta. </text> <text name="Item Action Label"> Jaqueta: </text> - <texture_picker label="Tecido Superior" name="Upper Fabric" tool_tip="Clique para escolher uma imagem." width="84"/> + <texture_picker label="Tecido superior" name="Upper Fabric" tool_tip="Clique para escolher uma imagem." width="84"/> <texture_picker label="Tecido Inferior" name="Lower Fabric" tool_tip="Clique para escolher uma imagem." width="84"/> - <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Clique para pegar o conta-gotas"/> - <button label="Criar Nova Jaqueta" label_selected="Criar Nova Jaqueta" name="Create New"/> + <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Selecionar a cor"/> <button label="Remover" label_selected="Remover" name="Take Off"/> <button label="Salvar" label_selected="Salvar" name="Save"/> <button label="Salvar como..." label_selected="Salvar como..." name="Save As"/> @@ -348,10 +336,9 @@ partir de um esboço e usá-lo. Localizado em [PATH] </text> <text name="not worn instructions"> - Para colocar uma nova jaqueta em seu avatar, basta arrastar um novo modelo -do seu inventário. Alternativamente, você pode criar uma novo modelo a -partir de um esboço e usá-lo. + Para obter luvas novas, arraste um par do inventário para o seu avatar. Ou crie luvas novas. </text> + <button label="Criar novas luvas" label_selected="Criar novas luvas" name="Create New"/> <text name="no modify instructions"> Você não tem permissão para modificar essa vestimenta. </text> @@ -359,8 +346,7 @@ partir de um esboço e usá-lo. Luvas: </text> <texture_picker label="Tecido" name="Fabric" tool_tip="Clique para escolher uma imagem"/> - <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Clique para abrir o conta-gotas"/> - <button label="Criar Novas Luvas" label_selected="Criar Novas Luvas" name="Create New"/> + <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Selecionar a cor"/> <button label="Remover" label_selected="Remover" name="Take Off"/> <button label="Salvar" label_selected="Salvar" name="Save"/> <button label="Salvar como..." label_selected="Salvar como..." name="Save As"/> @@ -383,10 +369,9 @@ partir de um esboço e usá-lo. Localizado em [PATH] </text> <text name="not worn instructions"> - Para por uma nova Camiseta em seu avatar, basta arrastar um novo modelo -de seu inventário. Alternativamente, você pode criar um novo modelo a -partir de um esboço e usá-lo. + Para obter uma camiseta nova, arraste uma do inventário para o seu avatar. Ou crie uma camiseta nova. </text> + <button label="Criar nova camiseta" label_selected="Criar nova camiseta" name="Create New"/> <text name="no modify instructions"> Você não ter permissão para modificar essa vestimenta. </text> @@ -394,8 +379,7 @@ partir de um esboço e usá-lo. Camiseta: </text> <texture_picker label="Tecido" name="Fabric" tool_tip="Clique para escolher uma imagem"/> - <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Clique para abrir o conta-gotas"/> - <button label="Criar Nova Camiseta" label_selected="Criar Nova Camiseta" name="Create New"/> + <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Selecionar a cor"/> <button label="Remover" label_selected="Remover" name="Take Off"/> <button label="Salvar" label_selected="Salvar" name="Save"/> <button label="Salvar como..." label_selected="Salvar como..." name="Save As"/> @@ -418,19 +402,17 @@ partir de um esboço e usá-lo. Localizado em [PATH] </text> <text name="not worn instructions"> - Para por novas roupas de baixo em seu avatar, basta arrastar um novo -modelo do seu inventário. Alternativamente, você pode criar um novo -modelo a partir de um esboço e usá-lo. + Para obter roupa de baixo nova, arraste um modelo do inventário para o seu avatar. Ou crie uma roupa de baixo nova. </text> + <button label="Criar novas" label_selected="Criar novas" name="Create New" width="180"/> <text name="no modify instructions"> Você não tem permissão para modificar essa vestimenta. </text> <text name="Item Action Label"> - Roupas de Baixo: + Roupas de baixo: </text> <texture_picker label="Tecido" name="Fabric" tool_tip="Clique para escolher uma imagem"/> - <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Clique para pegar o conta-gotas"/> - <button label="Criar Novas Roupas de Baixo" label_selected="Criar Novas Roupas de Baixo" name="Create New" width="180"/> + <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Selecionar a cor"/> <button label="Remover" label_selected="Remover" name="Take Off"/> <button label="Salvar" label_selected="Salvar" name="Save"/> <button label="Salvar como..." label_selected="Salvar como..." name="Save As"/> @@ -453,10 +435,9 @@ modelo a partir de um esboço e usá-lo. Localizado em [PATH] </text> <text name="not worn instructions"> - Para por uma nova saia em seu avatar, basta arrastar um novo modelo -do seu inventário. Alternativamente, você pode criar um novo modelo a -partir de um esboço e usá-lo. + Para obter um saia nova, arraste uma saia do inventário para o seu avatar. Ou crie uma saia nova. </text> + <button label="Criar nova saia" label_selected="Criar nova saia" name="Create New"/> <text name="no modify instructions"> Você não tem permissão para modificar esta vestimenta. </text> @@ -464,16 +445,86 @@ partir de um esboço e usá-lo. Saia: </text> <texture_picker label="Tecido" name="Fabric" tool_tip="Clique para escolher uma imagem"/> - <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Click to open Color Picker"/> - <button label="Criar Nova Saia" label_selected="Criar Nova Saia" name="Create New"/> + <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Selecionar a cor"/> <button label="Remover" label_selected="Remover" name="Take Off"/> <button label="Salvar" label_selected="Salvar" name="Save"/> <button label="Salvar como..." label_selected="Salvar como..." name="Save As"/> <button label="Reverter" label_selected="Reverter" name="Revert"/> </panel> + <panel label="Tatuagem" name="Tattoo"> + <text name="title"> + [DESC]: + </text> + <text name="title_no_modify"> + [DESC]: não pode ser modificado + </text> + <text name="title_loading"> + [DESC]: Carregando... + </text> + <text name="title_not_worn"> + [DESC]: não vestido + </text> + <text name="path"> + Localização: [PATH] + </text> + <text name="not worn instructions"> + Para por uma tatuagem nova, arraste uma tatuagem do inventário para o seu avatar. Ou crie uma tatuagem nova. + </text> + <button label="Criar tatuagem" label_selected="Criar tatuagem" name="Create New"/> + <text name="no modify instructions"> + Você não está autorizado a modificar este acessório. + </text> + <text name="Item Action Label"> + Tatuagem: + </text> + <texture_picker label="Tatuagem na cabeça" name="Head Tattoo" tool_tip="Selecionar imagem"/> + <texture_picker label="Tatuagem parte de cima" name="Upper Tattoo" tool_tip="Selecionar imagem"/> + <texture_picker label="Tatuagem de baixo" name="Lower Tattoo" tool_tip="Selecionar imagem"/> + <button label="Tirar" label_selected="Tirar" name="Take Off"/> + <button label="Salvar" label_selected="Salvar" name="Save"/> + <button label="Salvar como..." label_selected="Salvar como..." name="Save As"/> + <button label="Reverter" label_selected="Reverter" name="Revert"/> + </panel> + <panel label="Alpha" name="Alpha"> + <text name="title"> + [DESC]: + </text> + <text name="title_no_modify"> + [DESC]: não pode ser modificado + </text> + <text name="title_loading"> + [DESC]: Carregando... + </text> + <text name="title_not_worn"> + [DESC]: não vestido + </text> + <text name="path"> + Localização: [PATH] + </text> + <text name="not worn instructions"> + Para por uma máscara alpha nova, arraste a máscara do inventário para o seu avatar. Ou crie uma máscara nova. + </text> + <button label="Criar Alpha novo" label_selected="Criar Alpha novo" name="Create New"/> + <text name="no modify instructions"> + Você não está autorizado a modificar este acessório. + </text> + <text name="Item Action Label"> + Alpha: + </text> + <texture_picker label="Alpha inferior" name="Lower Alpha" tool_tip="Selecionar imagem"/> + <texture_picker label="Alpha de cima" name="Upper Alpha" tool_tip="Selecionar imagem"/> + <texture_picker label="Cabeça Alpha" name="Head Alpha" tool_tip="Selecionar imagem"/> + <texture_picker label="Olhos Alpha" name="Eye Alpha" tool_tip="Selecionar imagem"/> + <texture_picker label="Cabelo alpha" name="Hair Alpha" tool_tip="Selecionar imagem"/> + <button label="Tirar" label_selected="Tirar" name="Take Off"/> + <button label="Salvar" label_selected="Salvar" name="Save"/> + <button label="Salvar como..." label_selected="Salvar como..." name="Save As"/> + <button label="Reverter" label_selected="Reverter" name="Revert"/> + </panel> </tab_container> <scroll_container left="249" name="panel_container"/> + <button label="Dados do script" label_selected="Dados do script" name="script_info" tool_tip="Mostrar scripts anexados ao seu avatar"/> + <button label="Criar look" label_selected="Criar look" name="make_outfit_btn"/> <button label="Cancelar" label_selected="Cancelar" name="Cancel"/> <button label="OK" label_selected="OK" name="Ok"/> - <button label="Criar Vestimenta..." label_selected="Criar Vestimenta..." name="Make Outfit" left="117" width="125" /> </floater> diff --git a/indra/newview/skins/default/xui/pt/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/pt/floater_day_cycle_options.xml index 42f34a3d82..306487939e 100644 --- a/indra/newview/skins/default/xui/pt/floater_day_cycle_options.xml +++ b/indra/newview/skins/default/xui/pt/floater_day_cycle_options.xml @@ -30,9 +30,9 @@ <text name="WL12am2"> 24:00 </text> - <button font="SansSerifSmall" width="96" left="546" label="Adicionar chave" label_selected="Adicionar chave" name="WLAddKey"/> - <button font="SansSerifSmall" width="96" left="546" label="Apagar chave" label_selected="Apagar chave" name="WLDeleteKey"/> - <text name="WLCurKeyFrameText" width="190" left="17"> + <button label="Adicionar chave" label_selected="Adicionar chave" name="WLAddKey"/> + <button label="Apagar chave" label_selected="Apagar chave" name="WLDeleteKey"/> + <text name="WLCurKeyFrameText"> Configurações de Quadro-chave: </text> <text name="WLCurKeyTimeText"> @@ -47,7 +47,7 @@ <text name="DayCycleText"> Grudar: </text> - <combo_box label="5 minutos" name="WLSnapOptions" width="85"/> + <combo_box label="5 minutos" name="WLSnapOptions"/> <text name="DayCycleText2"> Duração do Ciclo: </text> @@ -55,11 +55,11 @@ <spinner label="Minuto" name="WLLengthOfDayMin"/> <spinner label="Segundo" name="WLLengthOfDaySec"/> <text name="DayCycleText3"> - Prévia: + Visualizar </text> <button label="Tocar" label_selected="Tocar" name="WLAnimSky"/> <button label="Pare!" label_selected="Pare" name="WLStopAnimSky"/> - <button width="175" font="SansSerifSmall" label="Usar o horário da Propriedade" label_selected="Ir para o horário da Propriedade" name="WLUseLindenTime"/> + <button label="Usar o horário da Propriedade" label_selected="Ir para o horário da Propriedade" name="WLUseLindenTime"/> <button label="Salvar o Dia teste" label_selected="Salvar o Dia teste" name="WLSaveDayCycle"/> <button label="Carregar o Dia teste" label_selected="Carregar o Dia teste" name="WLLoadDayCycle"/> </panel> diff --git a/indra/newview/skins/default/xui/pt/floater_device_settings.xml b/indra/newview/skins/default/xui/pt/floater_device_settings.xml index fa4da834b8..48a4a6ef6f 100644 --- a/indra/newview/skins/default/xui/pt/floater_device_settings.xml +++ b/indra/newview/skins/default/xui/pt/floater_device_settings.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_device_settings" title="AJUSTES DO DISPOSITIVO DE CONVERSA POR VOZ"/> +<floater name="floater_device_settings" title="CONFIGURAÇÃO DE DISPOSITIVO DE VOZ"/> diff --git a/indra/newview/skins/default/xui/pt/floater_env_settings.xml b/indra/newview/skins/default/xui/pt/floater_env_settings.xml index 4a43801b48..3ca8d934c9 100644 --- a/indra/newview/skins/default/xui/pt/floater_env_settings.xml +++ b/indra/newview/skins/default/xui/pt/floater_env_settings.xml @@ -1,5 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="Environment Editor Floater" title="EDITOR DO AMBIENTE"> + <floater.string name="timeStr"> + [hour12,datetime,utc]:[min,datetime,utc] [ampm,datetime,utc] + </floater.string> <text name="EnvTimeText"> Hora do Dia </text> @@ -13,13 +16,12 @@ Nuvens <text name="EnvWaterColorText"> Cor da água </text> - <color_swatch label="" name="EnvWaterColor" tool_tip="Clique para abrir o Editor de cores"/> + <color_swatch label="" name="EnvWaterColor" tool_tip="Selecionar a cor"/> <text name="EnvWaterFogText"> Névoa da água </text> <button bottom="-144" label="Usar hora da propriedade" name="EnvUseEstateTimeButton" width="155"/> - <button label="Céu Avançado" name="EnvAdvancedSkyButton" width="155" left="167"/> - <button label="Ãgua Avançada" name="EnvAdvancedWaterButton" width="155" left="326"/> - <button label="?" name="EnvSettingsHelpButton"/> + <button label="Céu Avançado" left="167" name="EnvAdvancedSkyButton" width="155"/> + <button label="Ãgua Avançada" left="326" name="EnvAdvancedWaterButton" width="155"/> </floater> diff --git a/indra/newview/skins/default/xui/pt/floater_event.xml b/indra/newview/skins/default/xui/pt/floater_event.xml new file mode 100644 index 0000000000..1cd4dcbda4 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/floater_event.xml @@ -0,0 +1,72 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater label="Evento" name="Event" title="DETALHES DO EVENTO"> + <floater.string name="none"> + nenhum + </floater.string> + <floater.string name="notify"> + Avisar + </floater.string> + <floater.string name="dont_notify"> + Não avisar + </floater.string> + <floater.string name="moderate"> + Moderado + </floater.string> + <floater.string name="adult"> + Adulto + </floater.string> + <floater.string name="general"> + Público geral + </floater.string> + <floater.string name="unknown"> + Desconhecido + </floater.string> + <layout_stack name="layout"> + <layout_panel name="profile_stack"> + <text name="event_name"> + Evento sem nome... Terror! Terror Aterrorizante. + </text> + <text name="event_category"> + (não categorizado) + </text> + <text name="event_runby_label"> + Organização: + </text> + <text initial_value="(pesquisando)" name="event_runby"/> + <text name="event_date_label"> + Data: + </text> + <text name="event_date"> + 10/10/2010 + </text> + <text name="event_duration_label"> + Duração: + </text> + <text name="event_duration"> + 1 hora + </text> + <text name="event_covercharge_label"> + Cover: + </text> + <text name="event_cover"> + Grátis + </text> + <text name="event_location_label"> + Localização: + </text> + <text name="event_location" value="LoteExemplo, Nome extenso (145, 228, 26)"/> + <text name="rating_label" value="Classificação:"/> + <text name="rating_value" value="(Desconhecido)"/> + <expandable_text name="event_desc"> + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. + </expandable_text> + </layout_panel> + <layout_panel name="button_panel"> + <button name="create_event_btn" tool_tip="Criar evento"/> + <button name="god_delete_event_btn" tool_tip="Excluir evento"/> + <button label="Avise-me" name="notify_btn"/> + <button label="Teletransportar" name="teleport_btn"/> + <button label="Mapa" name="map_btn"/> + </layout_panel> + </layout_stack> +</floater> diff --git a/indra/newview/skins/default/xui/pt/floater_gesture.xml b/indra/newview/skins/default/xui/pt/floater_gesture.xml index b0bc42685d..2e5b92aaf7 100644 --- a/indra/newview/skins/default/xui/pt/floater_gesture.xml +++ b/indra/newview/skins/default/xui/pt/floater_gesture.xml @@ -1,14 +1,25 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="gestures" title="GESTOS ATIVOS"> - <text name="help_label"> - Clicar duas vezes no gesto para executar animações e sons. - </text> +<floater label="Lugares" name="gestures" title="GESTOS"> + <floater.string name="loading"> + Carregando... + </floater.string> + <floater.string name="playing"> + (Em execução) + </floater.string> + <floater.string name="copy_name"> + Cópia de [COPY_NAME] + </floater.string> <scroll_list name="gesture_list"> - <column label="Acionar" name="trigger"/> - <column label="Chave" name="shortcut"/> - <column label="Nome" name="name"/> + <scroll_list.columns label="Nome" name="name"/> + <scroll_list.columns label="Bate-papo" name="trigger"/> + <scroll_list.columns label="Chave" name="shortcut"/> </scroll_list> - <button label="Novo" name="new_gesture_btn"/> + <panel label="bottom_panel" name="bottom_panel"> + <menu_button name="gear_btn" tool_tip="Mais opções"/> + <button name="new_gesture_btn" tool_tip="Criar novo gesto"/> + <button name="activate_btn" tool_tip="Ativar/Desativar gesto selecionado"/> + <button name="del_btn" tool_tip="Excluir este gesto"/> + </panel> <button label="Editar" name="edit_btn"/> <button label="Executar" name="play_btn"/> <button label="Parar" name="stop_btn"/> diff --git a/indra/newview/skins/default/xui/pt/floater_god_tools.xml b/indra/newview/skins/default/xui/pt/floater_god_tools.xml index 4b7b2eb34e..8003a35d16 100644 --- a/indra/newview/skins/default/xui/pt/floater_god_tools.xml +++ b/indra/newview/skins/default/xui/pt/floater_god_tools.xml @@ -2,20 +2,19 @@ <floater name="godtools floater" title="FERRAMENTAS DE DEUS"> <tab_container name="GodTools Tabs"> <panel label="Grade" name="grid"> - <button label="Desconectar todos os usuários" label_selected="Desconectar todos os usuários" name="Kick all users"/> - <button label="Limpar os cachês de visibilidade do mapa da região." label_selected="Limpar os cachês de visibilidade do mapa da região." name="Flush This Region's Map Visibility Caches"/> + <button label="Limpar os caches de visibilidade do mapa da região." label_selected="Limpar os caches de visibilidade do mapa da região." name="Flush This Region's Map Visibility Caches"/> </panel> <panel label="Região" name="region"> - <text name="Sim Name:"> - Nome do Simulador: + <text name="Region Name:"> + Nome da região: </text> <check_box label="Prelúdio" name="check prelude" tool_tip="Ajustar para tornar esta região um prelúdio."/> <check_box label="Fixar Sol" name="check fixed sun" tool_tip="Fixa a posição do sol (como em Região/Estados) > Terreno."/> - <check_box label="Redefinir Home no teletransporte" name="check reset home" tool_tip="Quando um residente se teletransporta, redefine sua home para a posição de destino."/> + <check_box label="Redefinir InÃcio no teletransporte" name="check reset home" tool_tip="Quando um residente sair, definir o destino com sua posição inicial."/> <check_box label="VisÃvel" name="check visible" tool_tip="Ajustar para fazer essa região visÃvel para os não-deuses"/> <check_box label="Dano" name="check damage" tool_tip="Ajustar para permitir dano nesta região"/> <check_box label="Bloquear ratreamento do Tráfego" name="block dwell" tool_tip="Configure isto para fazer a região não computar o tráfego."/> - <check_box label="Bloquear Terraform" name="block terraform" tool_tip="Ajustar para desabilitar as pessoas a terraplanarem seus terrenos"/> + <check_box label="Bloquear terraplenagens" name="block terraform" tool_tip="Ajustar para desabilitar as pessoas a terraplanarem seus terrenos"/> <check_box label="Sandbox" name="is sandbox" tool_tip="Alterar se esta região for uma sandbox."/> <button label="Nivelar o terreno" label_selected="Nivelar o Terreno" name="Bake Terrain" tool_tip="Salva o terreno atual como padrão."/> <button label="Reverter Terreno" label_selected="Reverter Terreno" name="Revert Terrain" tool_tip="Substituir o terreno atual pelo padrão."/> @@ -47,8 +46,8 @@ <button label="Autosalvar Agora" label_selected="Autosalvar Agora" name="Autosave now" tool_tip="Salvar estado compactado para o diretório de gravação automática."/> </panel> <panel label="Objetos" name="objects"> - <text name="Sim Name:"> - Sim Nome: + <text name="Region Name:"> + Nome da região: </text> <text name="region name"> Welsh @@ -64,26 +63,26 @@ <button label="Apagar objetos programados do alvo em outras terras" label_selected="Apagar objetos programados do alvo em outras terras" name="Delete Target's Scripted Objects On Others Land" tool_tip="Apagar todos os objetos programados possuÃdos pelo alvo nas terras fora do domÃnio do alvo. Objetos (sem cópia) irão retornar."/> <button label="Apagar objetos programados do Alvo em qualquer terreno" label_selected="Apagar objetos programados do Alvo em qualquer terreno" name="Delete Target's Scripted Objects On *Any* Land" tool_tip="Apagar todos os objetos programados do alvo nesta região. Objetos (sem cópia) irão retornar."/> <button label="Apagar *TODOS* os objetos do alvo" label_selected="Apagar *TODOS* os objetos do alvo" name="Delete *ALL* Of Target's Objects" tool_tip="Apagar todos os objetos possuÃdos pelo alvo nesta região. Objetos (sem cópia) objetos irão retornar."/> - <button label="Pegar os maiores colidentes" label_selected="Pegar os maiores colidentes" name="Get Top Colliders" tool_tip="Pega a lista de objetos que estão experimentando as chamadas mais freqüentes."/> - <button label="Pegar os scripts principais" label_selected="Pegar os scripts principais" name="Get Top Scripts" tool_tip="Pegar a lista de objetos programados com a maior duração em tempo de execução."/> - <button label="Informações de Scripts" label_selected="Informações de Scripts" name="Scripts digest" tool_tip="Pega uma lista de todos os scripts e o número de ocorrências de cada um."/> + <button label="Principais colidentes" label_selected="Lista dos maiores colidentes" name="Get Top Colliders" tool_tip="Gera a lista de objetos que estão experimentando as chamadas mais frequentes."/> + <button label="Principais scripts" label_selected="Lista dos scripts principais" name="Get Top Scripts" tool_tip="Gera a lista de objetos programados com a maior duração em tempo de execução."/> + <button label="Dados dos scripts" label_selected="Dados dos scripts" name="Scripts digest" tool_tip="Gera uma lista de todos os scripts e o número de ocorrências de cada um."/> </panel> <panel label="Requisição" name="request"> <text name="Destination:"> Destino: </text> <combo_box name="destination"> - <combo_box.item name="item1" label="Seleção" /> - <combo_box.item name="item2" label="Região do Agente" /> + <combo_box.item label="Seleção" name="item1"/> + <combo_box.item label="Região do Agente" name="item2"/> </combo_box> <text name="Request:"> Requisição: </text> <combo_box name="request"> - <combo_box.item name="item1" label="Passos de Colisão" /> - <combo_box.item name="item2" label="Contagem de scripts, padrão opcional" /> - <combo_box.item name="item3" label="Padrão de Objetos" /> - <combo_box.item name="item4" label="rez <asset_id>" /> + <combo_box.item label="Passos de Colisão" name="item1"/> + <combo_box.item label="Contagem de scripts, padrão opcional" name="item2"/> + <combo_box.item label="Padrão de Objetos" name="item3"/> + <combo_box.item label="rez <asset_id>" name="item4"/> </combo_box> <text name="Parameter:"> Parametro: diff --git a/indra/newview/skins/default/xui/pt/floater_hardware_settings.xml b/indra/newview/skins/default/xui/pt/floater_hardware_settings.xml index 8921e6ea12..c666a941fe 100644 --- a/indra/newview/skins/default/xui/pt/floater_hardware_settings.xml +++ b/indra/newview/skins/default/xui/pt/floater_hardware_settings.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Hardware Settings Floater" title="AJUSTES DE HARDWARE"> +<floater name="Hardware Settings Floater" title="CONFIGURAÇÃO DO HARDWARE"> <text name="Filtering:"> Filtragem: </text> @@ -8,21 +8,21 @@ Suavização: </text> <combo_box label="Suavização" name="fsaa" width="94"> - <combo_box.item name="FSAADisabled" label="Desabilitado"/> - <combo_box.item name="2x" label="2x"/> - <combo_box.item name="4x" label="4x"/> - <combo_box.item name="8x" label="8x"/> - <combo_box.item name="16x" label="16x"/> + <combo_box.item label="Desativado" name="FSAADisabled"/> + <combo_box.item label="2x" name="2x"/> + <combo_box.item label="4x" name="4x"/> + <combo_box.item label="8x" name="8x"/> + <combo_box.item label="16x" name="16x"/> </combo_box> <spinner label="Gama:" name="gamma"/> <text name="(brightness, lower is brighter)"> - (brilho, quanto menor, mais brilho, 0=usar padrão) + (0 = brilho padrão, menor = mais brilho) </text> <text name="Enable VBO:"> Habilitar VBO: </text> - <check_box label="Habilitar Objetos com Armazenamento de Vértices" name="vbo" tool_tip="Habilitando-o em máquinas novas, ele oferece um ganho de performance. Contudo, as máquinas antigas tem freqüentemente implementações pobres de VBOs e você pode ter travamentos quando esta opção é habilitada."/> - <slider label="Memória de Textura (MB):" name="GrapicsCardTextureMemory" tool_tip="Quantidade de memória a se reservar para texturas. Usa por padrão, a Memória da Placa de VÃdeo. Sua redução pode aumentar a performance mas pode também deixar as texturas borradas."/> - <spinner label="Relação de Distância de Nevoeiro:" name="fog"/> + <check_box initial_value="true" label="Habilitar Objetos com Armazenamento de Vértices" name="vbo" tool_tip="Habilitando-o em máquinas novas, ele oferece um ganho de performance. Contudo, as máquinas antigas tem freqüentemente implementações pobres de VBOs e você pode ter travamentos quando esta opção é habilitada."/> + <slider label="Memória de texturas (MB):" name="GraphicsCardTextureMemory" tool_tip="Quanto da memória deve ser alocado para texturas. O padrão é definido pela memória da placa de vÃdeo. Reduzir este valor pode melhorar o desempenho, mas as texturas podem fica fora de foco."/> + <spinner label="Relação de Distância de Nevoeiro:" name="fog"/> <button label="OK" label_selected="OK" name="OK"/> </floater> diff --git a/indra/newview/skins/default/xui/pt/floater_help_browser.xml b/indra/newview/skins/default/xui/pt/floater_help_browser.xml new file mode 100644 index 0000000000..9cc8a0a6b2 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/floater_help_browser.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_help_browser" title="NAVEGADOR DA AJUDA"> + <floater.string name="loading_text"> + Carregando... + </floater.string> + <layout_stack name="stack1"> + <layout_panel name="external_controls"/> + </layout_stack> +</floater> diff --git a/indra/newview/skins/default/xui/pt/floater_im.xml b/indra/newview/skins/default/xui/pt/floater_im.xml index 75c3409339..c81d0dd7ef 100644 --- a/indra/newview/skins/default/xui/pt/floater_im.xml +++ b/indra/newview/skins/default/xui/pt/floater_im.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <multi_floater name="im_floater" title="Mensagem Instantânea"> <string name="only_user_message"> - Você é o único usuário desta sessão. + Você é o único residente nesta sessão </string> <string name="offline_message"> [FIRST] [LAST] está offline. @@ -10,7 +10,7 @@ Clique no botão [BUTTON NAME] para aceitar/ conectar a este bate-papo em voz. </string> <string name="muted_message"> - Você emudeceu este residente. Enviar uma mensagem vai automaticamente reativá-lo novamente. + Você bloqueou este residente. Se quiser retirar o bloqueio, basta enviar uma mensagem. </string> <string name="generic_request_error"> Erro na requisição, por favor, tente novamente. @@ -31,7 +31,7 @@ Um moderador do grupo desabilitou seu bate-papo em texto. </string> <string name="add_session_event"> - Não foi possÃvel adicionar usuários na sessão de bate-papo com [RECIPIENT]. + Não foi possÃvel adicionar residentes ao bate-papo com [RECIPIENT]. </string> <string name="message_session_event"> Não foi possÃvel enviar sua mensagem na sessão de bate- papo com [RECIPIENT]. diff --git a/indra/newview/skins/default/xui/pt/floater_im_container.xml b/indra/newview/skins/default/xui/pt/floater_im_container.xml new file mode 100644 index 0000000000..0fbb826a96 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/floater_im_container.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<multi_floater name="floater_im_box" title="CONVERSAS"/> diff --git a/indra/newview/skins/default/xui/pt/floater_im_session.xml b/indra/newview/skins/default/xui/pt/floater_im_session.xml new file mode 100644 index 0000000000..39dde3408b --- /dev/null +++ b/indra/newview/skins/default/xui/pt/floater_im_session.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="panel_im"> + <layout_stack name="im_panels"> + <layout_panel label="Painel de controle de MI" name="panel_im_control_panel"/> + <layout_panel> + <line_editor label="Para" name="chat_editor"/> + </layout_panel> + </layout_stack> +</floater> diff --git a/indra/newview/skins/default/xui/pt/floater_image_preview.xml b/indra/newview/skins/default/xui/pt/floater_image_preview.xml index a0d8c02ef0..3582923ed0 100644 --- a/indra/newview/skins/default/xui/pt/floater_image_preview.xml +++ b/indra/newview/skins/default/xui/pt/floater_image_preview.xml @@ -10,17 +10,17 @@ Prévia da imagem como: </text> - <combo_box label="Tipo de Roupas" name="clothing_type_combo" left="100" width="186"> - <combo_box.item name="Image" label="Imagem" /> - <combo_box.item name="Hair" label="Cabelo" /> - <combo_box.item name="FemaleHead" label="Cabeça Feminina" /> - <combo_box.item name="FemaleUpperBody" label="Parte Superior do Corpo Feminino" /> - <combo_box.item name="FemaleLowerBody" label="Parte Inferior do Corpo Feminino" /> - <combo_box.item name="MaleHead" label="Cabeça Masculina" /> - <combo_box.item name="MaleUpperBody" label="Parte Superior do Corpo Masculino" /> - <combo_box.item name="MaleLowerBody" label="Parte Inferiro do Corpo Masculino" /> - <combo_box.item name="Skirt" label="Saia" /> - <combo_box.item name="SculptedPrim" label="Primitiva Esculpida" /> + <combo_box label="Tipo de Roupas" left="100" name="clothing_type_combo" width="186"> + <item label="Imagem" name="Image" value="Imagem"/> + <item label="Cabelo" name="Hair" value="Cabelo"/> + <item label="Cabeça de mulher" name="FemaleHead" value="Cabeça de mulher"/> + <item label="Cintura para cima, mulher" name="FemaleUpperBody" value="Cintura para cima, mulher"/> + <item label="Cintura para baixo, mulher" name="FemaleLowerBody" value="Cintura para baixo, mulher"/> + <item label="Cabeça de homem" name="MaleHead" value="Cabeça de homem"/> + <item label="Cintura para cima, homem" name="MaleUpperBody" value="Cintura para cima, homem"/> + <item label="Cintura para baixo, homem" name="MaleLowerBody" value="Cintura para baixo, homem"/> + <item label="Saia" name="Skirt" value="Saia"/> + <item label="Prim esculpido" name="SculptedPrim" value="Prim esculpido"/> </combo_box> <text name="bad_image_text"> Incapaz de ler a imagem. diff --git a/indra/newview/skins/default/xui/pt/floater_incoming_call.xml b/indra/newview/skins/default/xui/pt/floater_incoming_call.xml new file mode 100644 index 0000000000..4b9553adfe --- /dev/null +++ b/indra/newview/skins/default/xui/pt/floater_incoming_call.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="incoming call" title="LIGAÇÃO DE DESCONHECIDO"> + <floater.string name="lifetime"> + 5 + </floater.string> + <floater.string name="localchat"> + Bate-papo local + </floater.string> + <floater.string name="anonymous"> + anônimo + </floater.string> + <floater.string name="VoiceInviteP2P"> + está ligando. + </floater.string> + <floater.string name="VoiceInviteAdHoc"> + entrou numa ligação de voz via conferência. + </floater.string> + <floater.string name="VoiceInviteGroup"> + chegou ao canal de voz do '[GROUP]'. + </floater.string> + <floater.string name="VoiceInviteQuestionGroup"> + Deseja sair do [CURRENT_CHAT] e entrar na ligação de '[GROUP]'? + </floater.string> + <floater.string name="VoiceInviteQuestionDefault"> + Sair do [CURRENT_CHAT] e entrar neste bate-papo de voz? + </floater.string> + <text name="question"> + Sair do [CURRENT_CHAT] e entrar neste bate-papo? + </text> + <button label="Aceitar" label_selected="Aceitar" name="Accept"/> + <button label="Rejeitar" label_selected="Rejeitar" name="Reject"/> + <button label="Enviar MI" name="Start IM"/> +</floater> diff --git a/indra/newview/skins/default/xui/pt/floater_inspect.xml b/indra/newview/skins/default/xui/pt/floater_inspect.xml index 97c2c6eaeb..6a00b1a628 100644 --- a/indra/newview/skins/default/xui/pt/floater_inspect.xml +++ b/indra/newview/skins/default/xui/pt/floater_inspect.xml @@ -1,11 +1,14 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="inspect" title="INSPECIONAR OBJETO" min_width="450"> +<floater min_width="450" name="inspect" title="EXAMINAR OBJETOS"> + <floater.string name="timeStamp"> + [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local] + </floater.string> <scroll_list name="object_list" tool_tip="Selecione um objeto nesta lista para destacá-lo in-world"> - <column label="Nome do Objeto" name="object_name"/> - <column label="Proprietário" name="owner_name"/> - <column label="Criador" name="creator_name"/> - <column label="Data de Criação" name="creation_date"/> + <scroll_list.columns label="Nome do Objeto" name="object_name"/> + <scroll_list.columns label="Proprietário" name="owner_name"/> + <scroll_list.columns label="Criador" name="creator_name"/> + <scroll_list.columns label="Data de Criação" name="creation_date"/> </scroll_list> - <button width="185" label="Ver Perfil do Proprietário..." label_selected="" name="button owner" tool_tip="Veja o perfil do proprietário do objeto destacado"/> - <button width="165" left="205" label="Ver perfil do criador..." label_selected="" name="button creator" tool_tip="Veja o perfil do criador original do objeto destacado"/> + <button label="Ver Perfil do Proprietário..." label_selected="" name="button owner" tool_tip="Veja o perfil do proprietário do objeto destacado" width="185"/> + <button label="Ver perfil do criador..." label_selected="" left="205" name="button creator" tool_tip="Veja o perfil do criador original do objeto destacado" width="165"/> </floater> diff --git a/indra/newview/skins/default/xui/pt/floater_inventory.xml b/indra/newview/skins/default/xui/pt/floater_inventory.xml index 1c2a3a9233..ae3312eab0 100644 --- a/indra/newview/skins/default/xui/pt/floater_inventory.xml +++ b/indra/newview/skins/default/xui/pt/floater_inventory.xml @@ -1,47 +1,16 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Inventory" title="INVENTÃRIO"> - <search_editor label="Escreva aqui para busca" name="inventory search editor"/> - <tab_container name="inventory filter tabs"> - <inventory_panel label="Todos os Itens" name="All Items"/> - <inventory_panel label="Itens Recentes" name="Recent Items"/> - </tab_container> - <menu_bar name="Inventory Menu"> - <menu label="Arquivo" name="File"> - <menu_item_call label="Abrir" name="Open"/> - <menu_item_call label="Nova Janela" name="New Window"/> - <menu_item_call label="Mostrar Filtros" name="Show Filters"/> - <menu_item_call label="Redefinir Filtros" name="Reset Current"/> - <menu_item_call label="Fechar Todas as Pastas" name="Close All Folders"/> - <menu_item_call label="Limpar Lixeira" name="Empty Trash"/> - </menu> - <menu label="Criar" name="Create"> - <menu_item_call label="Nova Pasta" name="New Folder"/> - <menu_item_call label="Novo Script" name="New Script"/> - <menu_item_call label="Nova Nota" name="New Note"/> - <menu_item_call label="Novo Gesto" name="New Gesture"/> - <menu label="Nova Roupa" name="New Clothes"> - <menu_item_call label="Nova Camisa" name="New Shirt"/> - <menu_item_call label="Nova Calça" name="New Pants"/> - <menu_item_call label="Novos Sapatos" name="New Shoes"/> - <menu_item_call label="Novas Meias" name="New Socks"/> - <menu_item_call label="Nova Jaqueta" name="New Jacket"/> - <menu_item_call label="Nova Saia" name="New Skirt"/> - <menu_item_call label="Novas Luvas" name="New Gloves"/> - <menu_item_call label="Nova Anágua" name="New Undershirt"/> - <menu_item_call label="Novas Roupas de Baixo" name="New Underpants"/> - </menu> - <menu label="Parte do corpo" name="New Body Parts"> - <menu_item_call label="Nova Forma" name="New Shape"/> - <menu_item_call label="Nova Pele" name="New Skin"/> - <menu_item_call label="Novo Cabelo" name="New Hair"/> - <menu_item_call label="Novos Olhos" name="New Eyes"/> - </menu> - </menu> - <menu label="Ordenar" name="Sort"> - <menu_item_check label="Por Nome" name="By Name"/> - <menu_item_check label="Por Data" name="By Date"/> - <menu_item_check label="Pastas Sempre por Nome" name="Folders Always By Name"/> - <menu_item_check label="Pastas do sistema primeiro" name="System Folders To Top"/> - </menu> - </menu_bar> +<floater name="Inventory" title="MEU INVENTÃRIO"> + <floater.string name="Title"> + MEU INVENTÃRIO + </floater.string> + <floater.string name="TitleFetching"> + MEU INVENTÃRIO (Pegando [ITEM_COUNT] items...) [FILTER] + </floater.string> + <floater.string name="TitleCompleted"> + MEU INVENTÃRIO ([ITEM_COUNT] items) [FILTER] + </floater.string> + <floater.string name="Fetched"> + Obtido + </floater.string> + <panel label="Painel do inventário" name="Inventory Panel"/> </floater> diff --git a/indra/newview/skins/default/xui/pt/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/pt/floater_inventory_item_properties.xml index 2a6b02f9c2..8fe69c097d 100644 --- a/indra/newview/skins/default/xui/pt/floater_inventory_item_properties.xml +++ b/indra/newview/skins/default/xui/pt/floater_inventory_item_properties.xml @@ -1,5 +1,20 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="item properties" title="PROPRIEDADES DO ITEM DE INVENTÃRIO"> +<floater name="item properties" title="PROPRIEDADES DE ITEM NO INVENTÃRIO"> + <floater.string name="unknown"> + (desconhecido) + </floater.string> + <floater.string name="public"> + (público) + </floater.string> + <floater.string name="you_can"> + Você pode: + </floater.string> + <floater.string name="owner_can"> + Proprietário pode : + </floater.string> + <floater.string name="acquiredDate"> + [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local] + </floater.string> <text name="LabelItemNameTitle"> Nome: </text> @@ -27,55 +42,32 @@ Qua Mai 24 12:50:46 2006 </text> <text name="OwnerLabel"> - Você pode: + Você: </text> - <check_box label="Modificar" name="CheckOwnerModify"/> + <check_box label="Editar" name="CheckOwnerModify"/> <check_box label="Copiar" name="CheckOwnerCopy"/> - <check_box label="Revender/Doar" name="CheckOwnerTransfer"/> - <text name="BaseMaskDebug"> - B: - </text> - <text name="OwnerMaskDebug"> - O: - </text> - <text name="GroupMaskDebug"> - G: + <check_box label="Revender" name="CheckOwnerTransfer"/> + <text name="AnyoneLabel"> + Todos: </text> - <text name="EveryoneMaskDebug"> - E: + <check_box label="Cortar" name="CheckEveryoneCopy"/> + <text name="GroupLabel"> + Grupo: </text> - <text name="NextMaskDebug"> - N: - </text> - <check_box label="Compartilhar com o grupo" name="CheckShareWithGroup"/> - <check_box label="Permitir qualquer um copiar" name="CheckEveryoneCopy"/> + <check_box label="Compartilhar" name="CheckShareWithGroup"/> <text name="NextOwnerLabel" width="230"> - Próximo dono pode: + Próximo proprietário: </text> - <check_box label="Modificar" name="CheckNextOwnerModify"/> + <check_box label="Editar" name="CheckNextOwnerModify"/> <check_box label="Copiar" name="CheckNextOwnerCopy"/> - <check_box label="Revender/Doar" name="CheckNextOwnerTransfer"/> - <text name="SaleLabel"> - Marcar Item: - </text> + <check_box label="Revender" name="CheckNextOwnerTransfer"/> <check_box label="À venda" name="CheckPurchase"/> - <radio_group name="RadioSaleType"> - <radio_item name="radio" label="Original" /> - <radio_item name="radio2" label="Cópia" /> - </radio_group> - <text name="TextPrice"> - Price: L$ + <combo_box name="combobox sale copy"> + <combo_box.item label="Cortar" name="Copy"/> + <combo_box.item label="Original" name="Original"/> + </combo_box> + <spinner label="Preço:" name="Edit Cost"/> + <text name="CurrencySymbol"> + L$ </text> - <string name="unknown"> - (desconhecido) - </string> - <string name="public"> - (público) - </string> - <string name="you_can"> - Você pode: - </string> - <string name="owner_can"> - Proprietário pode : - </string> </floater> diff --git a/indra/newview/skins/default/xui/pt/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/pt/floater_inventory_view_finder.xml index 57cdd50dcc..d21e574011 100644 --- a/indra/newview/skins/default/xui/pt/floater_inventory_view_finder.xml +++ b/indra/newview/skins/default/xui/pt/floater_inventory_view_finder.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Inventory Finder" title="ITENS_DE_INVENTÃRIO_RECENTES" width="165"> +<floater name="Inventory Finder" title="ITENS_DE_INVENTÃRIO_RECENTES"> <check_box label="Animação" name="check_animation"/> <check_box label="Cartões de chamadas" name="check_calling_card"/> <check_box label="Roupas" name="check_clothing"/> @@ -13,8 +13,8 @@ <check_box label="Fotos" name="check_snapshot"/> <button label="Tudo" label_selected="Tudo" name="All"/> <button label="Nenhum" label_selected="Nenhum" name="None"/> - <check_box label="Sempre mostrar as pastas" name="check_show_empty" left="3"/> - <check_box label="Desde o Logoff" name="check_since_logoff" left="3"/> + <check_box label="Sempre mostrar as pastas" name="check_show_empty"/> + <check_box label="Desde o Logoff" name="check_since_logoff"/> <text name="- OR -"> - OU - </text> diff --git a/indra/newview/skins/default/xui/pt/floater_joystick.xml b/indra/newview/skins/default/xui/pt/floater_joystick.xml index 0793a0b161..98d8c0e319 100644 --- a/indra/newview/skins/default/xui/pt/floater_joystick.xml +++ b/indra/newview/skins/default/xui/pt/floater_joystick.xml @@ -1,23 +1,23 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="Joystick" title="CONFIGURAÇÃO DO JOYSTICK"> - <check_box name="enable_joystick" label="Habilitar Joystick:"/> + <check_box label="Habilitar Joystick:" name="enable_joystick"/> <text left="135" name="joystick_type" width="360"/> - <spinner label="Mapeamento: eixo X" name="JoystickAxis1" label_width="124" width="164"/> - <spinner label="Mapeamento: eixo Y" name="JoystickAxis2" label_width="124" width="164"/> - <spinner label="Mapeamento: eixo Z" name="JoystickAxis0" label_width="124" width="164"/> - <spinner label="Mapeamento: Elevação" name="JoystickAxis4" label_width="124" width="164"/> - <spinner label="Mapeamento: Guinada" name="JoystickAxis5" label_width="124" width="164"/> - <spinner label="Mapeamento: Rolagem" name="JoystickAxis3" label_width="124" width="164"/> - <spinner label="Mapeamento: Zoom" name="JoystickAxis6" label_width="124" width="164"/> - <check_box label="Zoom Direto" name="ZoomDirect" left="194"/> + <spinner label="Mapeamento: eixo X" label_width="124" name="JoystickAxis1" width="164"/> + <spinner label="Mapeamento: eixo Y" label_width="124" name="JoystickAxis2" width="164"/> + <spinner label="Mapeamento: eixo Z" label_width="124" name="JoystickAxis0" width="164"/> + <spinner label="Mapeamento: Elevação" label_width="124" name="JoystickAxis4" width="164"/> + <spinner label="Mapeamento: Guinada" label_width="124" name="JoystickAxis5" width="164"/> + <spinner label="Mapeamento: Rolagem" label_width="124" name="JoystickAxis3" width="164"/> + <spinner label="Mapeamento: Zoom" label_width="124" name="JoystickAxis6" width="164"/> + <check_box label="Zoom Direto" left="194" name="ZoomDirect"/> <check_box label="Cursor 3D" name="Cursor3D"/> <check_box label="NÃvel Automático" name="AutoLeveling"/> <text name="Control Modes:"> Modos de Controle: </text> - <check_box name="JoystickAvatarEnabled" label="Avatar"/> - <check_box name="JoystickBuildEnabled" left="192" label="Construir"/> - <check_box name="JoystickFlycamEnabled" label="Camera aérea"/> + <check_box label="Avatar" name="JoystickAvatarEnabled"/> + <check_box label="Construir" name="JoystickBuildEnabled"/> + <check_box label="Camera aérea" name="JoystickFlycamEnabled"/> <text name="XScale"> Escala X </text> @@ -27,13 +27,13 @@ <text name="ZScale"> Escala Z </text> - <text name="PitchScale" left="3" width="115"> + <text name="PitchScale"> Escala de Elevação </text> - <text name="YawScale" left="3" width="115"> + <text name="YawScale"> Escala da Guinada </text> - <text name="RollScale" left="3" width="115"> + <text name="RollScale"> Escala de Rolagem </text> <text name="XDeadZone"> @@ -45,13 +45,13 @@ <text name="ZDeadZone"> Zona Morta Z </text> - <text name="PitchDeadZone" left="3" width="115"> + <text name="PitchDeadZone"> Zona Morta: Elevação </text> - <text name="YawDeadZone" left="3" width="115"> + <text name="YawDeadZone"> Zona Morta: Guinada </text> - <text name="RollDeadZone" left="3" width="115"> + <text name="RollDeadZone"> Zona Morta: Rolagem </text> <text name="Feathering"> @@ -60,10 +60,10 @@ <text name="ZoomScale2"> Escala de Zoom </text> - <text name="ZoomDeadZone" width="110" left="4"> + <text name="ZoomDeadZone"> Zona Morta de Zoom </text> - <button label="Padrões do SpaceNavigator" name="SpaceNavigatorDefaults" font="SansSerifSmall"/> + <button font="SansSerifSmall" label="Padrões do SpaceNavigator" name="SpaceNavigatorDefaults"/> <button label="OK" label_selected="OK" name="ok_btn"/> <button label="Cancelar" label_selected="Cancelar" name="cancel_btn"/> <stat_view label="Monitor do Joystick" name="axis_view"> diff --git a/indra/newview/skins/default/xui/pt/floater_lagmeter.xml b/indra/newview/skins/default/xui/pt/floater_lagmeter.xml index 2728633438..9932318293 100644 --- a/indra/newview/skins/default/xui/pt/floater_lagmeter.xml +++ b/indra/newview/skins/default/xui/pt/floater_lagmeter.xml @@ -1,155 +1,154 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_lagmeter" title="MEDIDOR DE ATRASO"> - <button label="" label_selected="" name="client_lagmeter" tool_tip="Status de atraso no Cliente"/> - <text left="30" name="client_lag_cause" right="-10" /> - <text left="30" name="network_lag_cause" right="-10" /> - <text left="30" name="server_lag_cause" right="-32" /> - <text name="client"> - Cliente: - </text> - <text name="client_text" font="SansSerifSmall"> - Normal - </text> - <button label="" label_selected="" name="network_lagmeter" tool_tip="Status de atraso na rede"/> - <text name="network"> - Rede: - </text> - <text name="network_text" font="SansSerifSmall"> - Normal - </text> - <button label="" label_selected="" name="server_lagmeter" tool_tip="Status de atraso no servidor"/> - <text name="server"> - Servidor: - </text> - <text name="server_text" font="SansSerifSmall"> - Normal - </text> - <button label="?" name="server_help"/> - <button label=">>" name="minimize"/> - <string name="max_title_msg"> +<floater name="floater_lagmeter" title="LAG - Ãndice"> + <floater.string name="max_title_msg"> Medidor de Atraso - </string> - <string name="max_width_px"> + </floater.string> + <floater.string name="max_width_px"> 360 - </string> - <string name="min_title_msg"> + </floater.string> + <floater.string name="min_title_msg"> Atraso - </string> - <string name="min_width_px"> + </floater.string> + <floater.string name="min_width_px"> 90 - </string> - <string name="client_text_msg"> + </floater.string> + <floater.string name="client_text_msg"> Cliente - </string> - <string name="client_frame_rate_critical_fps"> + </floater.string> + <floater.string name="client_frame_rate_critical_fps"> 10 - </string> - <string name="client_frame_rate_warning_fps"> + </floater.string> + <floater.string name="client_frame_rate_warning_fps"> 15 - </string> - <string name="client_frame_time_window_bg_msg"> + </floater.string> + <floater.string name="client_frame_time_window_bg_msg"> Normal, janela por baixo - </string> - <string name="client_frame_time_critical_msg"> + </floater.string> + <floater.string name="client_frame_time_critical_msg"> Taxa de quadros do Cliente abaixo de [CLIENT_FRAME_RATE_CRITICAL] - </string> - <string name="client_frame_time_warning_msg"> + </floater.string> + <floater.string name="client_frame_time_warning_msg"> Taxa de quadros do Cliente entre [CLIENT_FRAME_RATE_CRITICAL] e [CLIENT_FRAME_RATE_WARNING] - </string> - <string name="client_frame_time_normal_msg"> + </floater.string> + <floater.string name="client_frame_time_normal_msg"> Normal - </string> - <string name="client_draw_distance_cause_msg"> + </floater.string> + <floater.string name="client_draw_distance_cause_msg"> Causa possÃvel: Distância de desenho ajustada muito alta - </string> - <string name="client_texture_loading_cause_msg"> + </floater.string> + <floater.string name="client_texture_loading_cause_msg"> Causa possÃvel: Carregamento de Imagens - </string> - <string name="client_texture_memory_cause_msg"> + </floater.string> + <floater.string name="client_texture_memory_cause_msg"> Causa possÃvel: Muitas imagens na memória - </string> - <string name="client_complex_objects_cause_msg"> + </floater.string> + <floater.string name="client_complex_objects_cause_msg"> Causa possÃvel: Muitos objetos complexos na cena - </string> - <string name="network_text_msg"> + </floater.string> + <floater.string name="network_text_msg"> Rede - </string> - <string name="network_packet_loss_critical_pct"> + </floater.string> + <floater.string name="network_packet_loss_critical_pct"> 10 - </string> - <string name="network_packet_loss_warning_pct"> + </floater.string> + <floater.string name="network_packet_loss_warning_pct"> 5 - </string> - <string name="network_packet_loss_critical_msg"> + </floater.string> + <floater.string name="network_packet_loss_critical_msg"> Conexão está caindo para cerca de [NETWORK_PACKET_LOSS_CRITICAL]% de pacotes - </string> - <string name="network_packet_loss_warning_msg"> + </floater.string> + <floater.string name="network_packet_loss_warning_msg"> Conexão está caindo [NETWORK_PACKET_LOSS_WARNING]%-[NETWORK_PACKET_LOSS_CRITICAL]% de pacotes - </string> - <string name="network_performance_normal_msg"> + </floater.string> + <floater.string name="network_performance_normal_msg"> Normal - </string> - <string name="network_ping_critical_ms"> + </floater.string> + <floater.string name="network_ping_critical_ms"> 600 - </string> - <string name="network_ping_warning_ms"> + </floater.string> + <floater.string name="network_ping_warning_ms"> 300 - </string> - <string name="network_ping_critical_msg"> + </floater.string> + <floater.string name="network_ping_critical_msg"> Tempo de conexão de ping é cerca de [NETWORK_PING_CRITICAL] ms - </string> - <string name="network_ping_warning_msg"> + </floater.string> + <floater.string name="network_ping_warning_msg"> Tempo de conexão de ping é [NETWORK_PING_WARNING]-[NETWORK_PING_CRITICAL] ms - </string> - <string name="network_packet_loss_cause_msg"> + </floater.string> + <floater.string name="network_packet_loss_cause_msg"> PossÃvel conexão ruim ou 'Largura de Banda' escolhida muito alta. - </string> - <string name="network_ping_cause_msg"> + </floater.string> + <floater.string name="network_ping_cause_msg"> PossÃvel conexão ruim ou aplicativos compartilhando arquivos. - </string> - <string name="server_text_msg"> + </floater.string> + <floater.string name="server_text_msg"> Servidor - </string> - <string name="server_frame_rate_critical_fps"> + </floater.string> + <floater.string name="server_frame_rate_critical_fps"> 20 - </string> - <string name="server_frame_rate_warning_fps"> + </floater.string> + <floater.string name="server_frame_rate_warning_fps"> 30 - </string> - <string name="server_single_process_max_time_ms"> + </floater.string> + <floater.string name="server_single_process_max_time_ms"> 20 - </string> - <string name="server_frame_time_critical_msg"> + </floater.string> + <floater.string name="server_frame_time_critical_msg"> Taxa de quadros abaixo de [SERVER_FRAME_RATE_CRITICAL] - </string> - <string name="server_frame_time_warning_msg"> + </floater.string> + <floater.string name="server_frame_time_warning_msg"> Taxa de quadros entre [SERVER_FRAME_RATE_CRITICAL] e [SERVER_FRAME_RATE_WARNING] - </string> - <string name="server_frame_time_normal_msg"> + </floater.string> + <floater.string name="server_frame_time_normal_msg"> Normal - </string> - <string name="server_physics_cause_msg"> + </floater.string> + <floater.string name="server_physics_cause_msg"> Causa possÃvel: Muitos objetos fÃsicos - </string> - <string name="server_scripts_cause_msg"> + </floater.string> + <floater.string name="server_scripts_cause_msg"> Causa possÃvel: Muitos objetos com scripts - </string> - <string name="server_net_cause_msg"> + </floater.string> + <floater.string name="server_net_cause_msg"> Causa possÃvel: Muito tráfego na rede - </string> - <string name="server_agent_cause_msg"> + </floater.string> + <floater.string name="server_agent_cause_msg"> Causa possÃvel: Muitas pessoas se movendo na região - </string> - <string name="server_images_cause_msg"> + </floater.string> + <floater.string name="server_images_cause_msg"> Causa possÃvel: Muitos cálculos de imagem - </string> - <string name="server_generic_cause_msg"> + </floater.string> + <floater.string name="server_generic_cause_msg"> Causa possÃvel: Carga no simulador muito pesada - </string> - <string name="smaller_label"> + </floater.string> + <floater.string name="smaller_label"> >> - </string> - <string name="bigger_label"> + </floater.string> + <floater.string name="bigger_label"> << - </string> + </floater.string> + <button label="" label_selected="" name="client_lagmeter" tool_tip="Status de atraso no Cliente"/> + <text name="client"> + Cliente + </text> + <text font="SansSerifSmall" name="client_text"> + Normal + </text> + <text left="30" name="client_lag_cause" right="-10"/> + <button label="" label_selected="" name="network_lagmeter" tool_tip="Status de atraso na rede"/> + <text name="network"> + Rede + </text> + <text font="SansSerifSmall" name="network_text"> + Normal + </text> + <text left="30" name="network_lag_cause" right="-10"/> + <button label="" label_selected="" name="server_lagmeter" tool_tip="Status de atraso no servidor"/> + <text name="server"> + Servidor + </text> + <text font="SansSerifSmall" name="server_text"> + Normal + </text> + <text left="30" name="server_lag_cause" right="-32"/> + <button label=">>" name="minimize" tool_tip="Alternar o tamanho da janela"/> </floater> diff --git a/indra/newview/skins/default/xui/pt/floater_land_holdings.xml b/indra/newview/skins/default/xui/pt/floater_land_holdings.xml index d8588e2f05..2b0d6790f2 100644 --- a/indra/newview/skins/default/xui/pt/floater_land_holdings.xml +++ b/indra/newview/skins/default/xui/pt/floater_land_holdings.xml @@ -1,13 +1,13 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="land holdings floater" title="MEU TERRENO"> +<floater name="land holdings floater" title="MEUS TERRENOS"> <scroll_list name="parcel list"> - <column label="Nome do Lote" name="name"/> + <column label="Lote" name="name"/> <column label="Região" name="location"/> <column label="Tipo" name="type"/> <column label="Ãrea" name="area"/> </scroll_list> <button label="Teletransporte" label_selected="Teletransporte" name="Teleport" tool_tip="Teletransportar para o centro do terreno."/> - <button width="130" label="Mostrar no mapa" label_selected="Mostrar no mapa" name="Show on Map" tool_tip="Mostrar esse terreno no mapa do mundo."/> + <button label="Mapa" label_selected="Mapa" name="Show on Map" tool_tip="Mostrar terreno na mápa-mundi" width="130"/> <text name="contrib_label"> Contribuições para os seus grupos: </text> @@ -18,19 +18,19 @@ <text name="allowed_label" width="380"> Propriedades de terreno permitidas com o plano de pagamento atual: </text> - <text name="allowed_text" left_delta="390"> + <text left_delta="390" name="allowed_text"> [AREA] m² </text> <text name="current_label"> Propriedades de terrenos atuais: </text> - <text name="current_text" left_delta="390"> + <text left_delta="390" name="current_text"> [AREA] m² </text> <text name="available_label"> DisponÃvel para compra de terras: </text> - <text name="available_text" left_delta="390"> + <text left_delta="390" name="available_text"> [AREA] m² </text> <string name="area_string"> diff --git a/indra/newview/skins/default/xui/pt/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/pt/floater_live_lsleditor.xml index c0b726c476..5ad116ac8a 100644 --- a/indra/newview/skins/default/xui/pt/floater_live_lsleditor.xml +++ b/indra/newview/skins/default/xui/pt/floater_live_lsleditor.xml @@ -1,12 +1,15 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="script ed float" title="SCRIPT: NOVO SCRIPT"> - <button label="Resetar" label_selected="Resetar" name="Reset"/> - <check_box label="Correndo" name="running"/> - <check_box label="Mono" name="mono" left="86"/> - <string name="not_allowed"> - Você não tem permissão para visualizar este script. - </string> - <string name="script_running"> + <floater.string name="not_allowed"> + Você não pode ver ou editar o script, uma vez que está definido como "não" copiar. Você precisa de permissões para ver ou editar um script dentro de um objeto. + </floater.string> + <floater.string name="script_running"> Executando - </string> + </floater.string> + <floater.string name="Title"> + SCRIPT: [NAME] + </floater.string> + <button label="Resetar" label_selected="Resetar" name="Reset"/> + <check_box initial_value="true" label="Correndo" name="running"/> + <check_box initial_value="true" label="Mono" left="86" name="mono"/> </floater> diff --git a/indra/newview/skins/default/xui/pt/floater_lsl_guide.xml b/indra/newview/skins/default/xui/pt/floater_lsl_guide.xml index 49a9e7fcf5..73f187f0e4 100644 --- a/indra/newview/skins/default/xui/pt/floater_lsl_guide.xml +++ b/indra/newview/skins/default/xui/pt/floater_lsl_guide.xml @@ -1,7 +1,7 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="script ed float" title="LSL WIKI"> - <check_box label="Seguir o Cursor" name="lock_check" /> - <combo_box label="Bloquear" name="history_combo" left_delta="120" width="70"/> - <button label="Anterior" name="back_btn" left_delta="75"/> - <button label="Posterior" name="fwd_btn" /> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="script ed float" title="LSL REFERENCE"> + <check_box label="Seguir o Cursor" name="lock_check"/> + <combo_box label="Bloquear" left_delta="120" name="history_combo" width="70"/> + <button label="Anterior" left_delta="75" name="back_btn"/> + <button label="Posterior" name="fwd_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/pt/floater_map.xml b/indra/newview/skins/default/xui/pt/floater_map.xml index ff60f77c4b..f8e4e76752 100644 --- a/indra/newview/skins/default/xui/pt/floater_map.xml +++ b/indra/newview/skins/default/xui/pt/floater_map.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Map"> +<floater name="Map" title=""> <floater.string name="mini_map_north"> N </floater.string> diff --git a/indra/newview/skins/default/xui/pt/floater_media_browser.xml b/indra/newview/skins/default/xui/pt/floater_media_browser.xml index 1cd6d5662c..7491218067 100644 --- a/indra/newview/skins/default/xui/pt/floater_media_browser.xml +++ b/indra/newview/skins/default/xui/pt/floater_media_browser.xml @@ -15,7 +15,7 @@ <button label="Ir" left_delta="505" name="go" width="35"/> </layout_panel> <layout_panel name="parcel_owner_controls"> - <button label="Enviar a URL atual para o terreno" name="assign"/> + <button label="Enviar esta página para lote" name="assign"/> </layout_panel> <layout_panel name="external_controls"> <button label="Abrir no meu Navegador de Web" name="open_browser" width="196"/> diff --git a/indra/newview/skins/default/xui/pt/floater_media_settings.xml b/indra/newview/skins/default/xui/pt/floater_media_settings.xml new file mode 100644 index 0000000000..5af002c502 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/floater_media_settings.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="media_settings" title="CONFIGURAÇÕES DE MÃDIA"> + <button label="OK" label_selected="OK" name="OK"/> + <button label="Cancelar" label_selected="Cancelar" name="Cancel"/> + <button label="Aplicar" label_selected="Aplicar" name="Apply"/> +</floater> diff --git a/indra/newview/skins/default/xui/pt/floater_mem_leaking.xml b/indra/newview/skins/default/xui/pt/floater_mem_leaking.xml index 4f93eb90e5..efb5da4ace 100644 --- a/indra/newview/skins/default/xui/pt/floater_mem_leaking.xml +++ b/indra/newview/skins/default/xui/pt/floater_mem_leaking.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="MemLeak" title="SIMULAÇÃO DE PERDA DE MEMÓRIA"> +<floater name="MemLeak" title="SIMULAR UM VAZAMENTO DE MEMÓRIA"> <spinner label="Velocidade da Perda (bytes por quadro):" name="leak_speed"/> <spinner label="Máximo de Memória Perdida (MB):" name="max_leak"/> <text name="total_leaked_label"> diff --git a/indra/newview/skins/default/xui/pt/floater_moveview.xml b/indra/newview/skins/default/xui/pt/floater_moveview.xml index 996a974254..b1dc65e3af 100644 --- a/indra/newview/skins/default/xui/pt/floater_moveview.xml +++ b/indra/newview/skins/default/xui/pt/floater_moveview.xml @@ -1,13 +1,75 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="move_floater"> -<panel name="panel_actions"> - <button label="" label_selected="" name="turn left btn" tool_tip="Virar à esquerda"/> - <button label="" label_selected="" name="turn right btn" tool_tip="Virar à direita"/> - <button label="" label_selected="" name="move up btn" tool_tip="Pular ou Voar"/> - <button label="" label_selected="" name="move down btn" tool_tip="Agaixar ou pousar"/> - <joystick_slide name="slide left btn" tool_tip="Mover para a esquerda"/> - <joystick_slide name="slide right btn" tool_tip="Mover para a direita"/> - <joystick_turn name="forward btn" tool_tip="Mover para a frente."/> - <joystick_turn name="backward btn" tool_tip="Mover para trás"/> -</panel> + <string name="walk_forward_tooltip"> + Andar para frente (flecha para cima ou W) + </string> + <string name="walk_back_tooltip"> + Andar para trás (flecha para baixo ou S) + </string> + <string name="walk_left_tooltip"> + Andar para a esquerda (Shift + Seta esquerda ou A) + </string> + <string name="walk_right_tooltip"> + Andar para a direita (Shift + Seta direita ou D) + </string> + <string name="run_forward_tooltip"> + Correr para frente (flecha para cima ou W) + </string> + <string name="run_back_tooltip"> + Correr para trás (flecha para baixo ou S) + </string> + <string name="run_left_tooltip"> + Correr para a esquerda (Shift + Seta esquerda ou A) + </string> + <string name="run_right_tooltip"> + Correr para a direita (Shift + Seta direita ou D) + </string> + <string name="fly_forward_tooltip"> + Voar para frente (flecha para cima ou W) + </string> + <string name="fly_back_tooltip"> + Voar para trás (flecha para baixo ou S) + </string> + <string name="fly_left_tooltip"> + Voar para a esquerda (Shift + Seta esquerda ou A) + </string> + <string name="fly_right_tooltip"> + Voar para a direita (Shift + Seta direita ou D) + </string> + <string name="fly_up_tooltip"> + Voar para cima (tecla E) + </string> + <string name="fly_down_tooltip"> + Voar para baixo (tecla C) + </string> + <string name="jump_tooltip"> + Pular (tecla E) + </string> + <string name="crouch_tooltip"> + Agachar (tecla C) + </string> + <string name="walk_title"> + Andar + </string> + <string name="run_title"> + Correr + </string> + <string name="fly_title"> + Voar + </string> + <panel name="panel_actions"> + <button label="" label_selected="" name="move up btn" tool_tip="Voar para cima (tecla E)"/> + <button label="" label_selected="" name="turn left btn" tool_tip="Virar à esquerda (flecha ESQ ou A)"/> + <joystick_slide name="move left btn" tool_tip="Andar para a esquerda (Shift + Seta esquerda ou A)"/> + <button label="" label_selected="" name="move down btn" tool_tip="Voar para baixo (tecla C)"/> + <button label="" label_selected="" name="turn right btn" tool_tip="Virar à direita (flecha DIR ou D)"/> + <joystick_slide name="move right btn" tool_tip="Andar para a direita (Shift + Seta direita ou D)"/> + <joystick_turn name="forward btn" tool_tip="Andar para frente (flecha para cima ou W)"/> + <joystick_turn name="backward btn" tool_tip="Andar para trás (flecha para baixo ou S)"/> + </panel> + <panel name="panel_modes"> + <button label="" name="mode_walk_btn" tool_tip="Modo caminhar"/> + <button label="" name="mode_run_btn" tool_tip="Modo correr"/> + <button label="" name="mode_fly_btn" tool_tip="Modo voar"/> + </panel> </floater> diff --git a/indra/newview/skins/default/xui/pt/floater_mute_object.xml b/indra/newview/skins/default/xui/pt/floater_mute_object.xml index cc669951c3..97fbd35fcc 100644 --- a/indra/newview/skins/default/xui/pt/floater_mute_object.xml +++ b/indra/newview/skins/default/xui/pt/floater_mute_object.xml @@ -1,12 +1,14 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="mute by name" title="SILENCIAR OBJETO PELO NOME"> +<floater name="mute by name" title="BLOQUEAR OBJETO POR NOME"> <text name="message"> - Silenciar pelo nome afeta apenas conversa de objeto e MI, -não sons. Você deve digitar o nome exato do objeto. + Bloquear o objeto: </text> <line_editor name="object_name"> Nome do objeto </line_editor> + <text name="note"> + * Bloquear apenas texto do objeto, não sons + </text> <button label="OK" name="OK"/> <button label="Cancelar" name="Cancel"/> </floater> diff --git a/indra/newview/skins/default/xui/pt/floater_nearby_chat.xml b/indra/newview/skins/default/xui/pt/floater_nearby_chat.xml new file mode 100644 index 0000000000..5ba2dcd925 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/floater_nearby_chat.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="nearby_chat" title="Bate-papo local"/> diff --git a/indra/newview/skins/default/xui/pt/floater_outfit_save_as.xml b/indra/newview/skins/default/xui/pt/floater_outfit_save_as.xml new file mode 100644 index 0000000000..dec8a7676a --- /dev/null +++ b/indra/newview/skins/default/xui/pt/floater_outfit_save_as.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="modal container" title="Salvar este look"> + <button label="Salvar" label_selected="Salvar" name="Save"/> + <button label="Cancelar" label_selected="Cancelar" name="Cancel"/> + <text name="Save item as:"> + Veja o meu novo visual: + </text> + <line_editor name="name ed"> + [DESC] (new) + </line_editor> +</floater> diff --git a/indra/newview/skins/default/xui/pt/floater_outgoing_call.xml b/indra/newview/skins/default/xui/pt/floater_outgoing_call.xml new file mode 100644 index 0000000000..35afde7612 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/floater_outgoing_call.xml @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="outgoing call" title="LIGANDO"> + <floater.string name="lifetime"> + 5 + </floater.string> + <floater.string name="localchat"> + Bate-papo local + </floater.string> + <floater.string name="anonymous"> + anônimo + </floater.string> + <floater.string name="VoiceInviteP2P"> + está ligando. + </floater.string> + <floater.string name="VoiceInviteAdHoc"> + entrou numa ligação de voz via conferência. + </floater.string> + <text name="connecting"> + Conectando com [CALLEE_NAME] + </text> + <text name="calling"> + Ligando para [CALLEE_NAME] + </text> + <text name="noanswer"> + Não há resposta. Tente novamente mais tarde. + </text> + <text name="nearby"> + Você saiu da ligação com [VOICE_CHANNEL_NAME]. [RECONNECT_NEARBY] + </text> + <text name="nearby_P2P_by_other"> + A ligação foi desligada. [RECONNECT_NEARBY] + </text> + <text name="nearby_P2P_by_agent"> + Você encerrou a ligação. [RECONNECT_NEARBY] + </text> + <text name="leaving"> + Saindo de [CURRENT_CHAT]. + </text> + <button label="Cancelar" label_selected="Cancelar" name="Cancel"/> +</floater> diff --git a/indra/newview/skins/default/xui/pt/floater_pay.xml b/indra/newview/skins/default/xui/pt/floater_pay.xml index 187df8fd18..81c861687f 100644 --- a/indra/newview/skins/default/xui/pt/floater_pay.xml +++ b/indra/newview/skins/default/xui/pt/floater_pay.xml @@ -1,21 +1,25 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="Give Money" title=""> - <button label="L$1" label_selected="L$1" name="fastpay 1" left="112" /> - <button label="L$5" label_selected="L$5" name="fastpay 5" /> - <button label="L$10" label_selected="L$10" name="fastpay 10" left="112" /> - <button label="L$20" label_selected="L$20" name="fastpay 20" /> - <button label="Pagar" label_selected="Pagar" name="pay btn" /> - <button label="Cancelar" label_selected="Cancelar" name="cancel btn" /> - <text name="payee_label" width="110" left="5"> - Pagar residente: + <string name="payee_group"> + Pagar grupo + </string> + <string name="payee_resident"> + Pagar residente + </string> + <text left="5" name="payee_label" width="110"> + Pagar: </text> - <text name="payee_name" left="115"> + <icon name="icon_person" tool_tip="Pessoa"/> + <text left="115" name="payee_name"> [FIRST] [LAST] </text> - <text name="fastpay text" width="120" halign="left"> - Pagamento rápido: - </text> - <text name="amount text" left="4" > - Quantia: + <button label="L$1" label_selected="L$1" left="112" name="fastpay 1"/> + <button label="L$5" label_selected="L$5" name="fastpay 5"/> + <button label="L$10" label_selected="L$10" left="112" name="fastpay 10"/> + <button label="L$20" label_selected="L$20" name="fastpay 20"/> + <text left="4" name="amount text"> + Outro valor: </text> + <button label="Pagar" label_selected="Pagar" name="pay btn"/> + <button label="Cancelar" label_selected="Cancelar" name="cancel btn"/> </floater> diff --git a/indra/newview/skins/default/xui/pt/floater_pay_object.xml b/indra/newview/skins/default/xui/pt/floater_pay_object.xml index 3a3dd9e52e..464afd7f18 100644 --- a/indra/newview/skins/default/xui/pt/floater_pay_object.xml +++ b/indra/newview/skins/default/xui/pt/floater_pay_object.xml @@ -1,31 +1,30 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="Give Money" title=""> - <text name="payee_group" width="100" halign="left"> - Pagar Grupo: - </text> - <text name="payee_resident" width="120" halign="left" > - Pagar residente: - </text> - <text name="payee_name" left="105"> + <string halign="left" name="payee_group" width="100"> + Pagar grupo + </string> + <string halign="left" name="payee_resident" width="120"> + Pagar residente + </string> + <icon name="icon_person" tool_tip="Pessoa"/> + <text left="105" name="payee_name"> [FIRST] [LAST] </text> - <text name="object_name_label" left="5" width="95" halign="left"> + <text halign="left" left="5" name="object_name_label" width="95"> Via objeto: </text> - <text name="object_name_text" left="105" > - ... - </text> - <text name="fastpay text" width="115" halign="left"> - Pagamento Rápido: + <icon name="icon_object" tool_tip="Objects"/> + <text left="105" name="object_name_text"> + Meu objeto maravilho, fantástico e com nome comprido e imaginativo </text> - <text name="amount text" left="5" halign="left"> - Quantia: + <button label="L$1" label_selected="L$1" left="125" name="fastpay 1" width="70"/> + <button label="L$5" label_selected="L$5" left="200" name="fastpay 5" width="70"/> + <button label="L$10" label_selected="L$10" left="125" name="fastpay 10" width="70"/> + <button label="L$20" label_selected="L$20" left="200" name="fastpay 20" width="70"/> + <text halign="left" left="5" name="amount text"> + Outro valor: </text> - <button label="L$1" label_selected="L$1" name="fastpay 1" left="125" width="70"/> - <button label="L$5" label_selected="L$5" name="fastpay 5" left="200" width="70"/> - <button label="L$10" label_selected="L$10" name="fastpay 10" left="125" width="70"/> - <button label="L$20" label_selected="L$20" name="fastpay 20" left="200" width="70"/> - <button label="Pagar" label_selected="Pagar" name="pay btn" /> - <button label="Cancelar" label_selected="Cancelar" name="cancel btn" /> - <line_editor left="60" name="amount" width="50" /> + <line_editor left="60" name="amount" width="50"/> + <button label="Pagar" label_selected="Pagar" name="pay btn"/> + <button label="Cancelar" label_selected="Cancelar" name="cancel btn"/> </floater> diff --git a/indra/newview/skins/default/xui/pt/floater_postcard.xml b/indra/newview/skins/default/xui/pt/floater_postcard.xml index cf63726df2..9740fbcb4d 100644 --- a/indra/newview/skins/default/xui/pt/floater_postcard.xml +++ b/indra/newview/skins/default/xui/pt/floater_postcard.xml @@ -1,22 +1,22 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Postcard" title="FOTO POR EMAIL"> +<floater name="Postcard" title="ENVIAR FOTO VIA EMAIL"> <text name="to_label" width="135"> - Email do Destinatário: + Para (email): </text> - <line_editor name="to_form" left="143" width="127" /> + <line_editor left="143" name="to_form" width="127"/> <text name="from_label"> - Seu Email: + De (email): </text> - <line_editor name="from_form" left="143" width="127" /> + <line_editor left="143" name="from_form" width="127"/> <text name="name_label"> Seu nome: </text> - <line_editor name="name_form" left="143" width="127" /> + <line_editor left="143" name="name_form" width="127"/> <text name="subject_label"> Assunto: </text> - <line_editor name="subject_form" left="143" width="127" /> - <line_editor label="Digite seu assunto aqui." name="subject_form"/> + <line_editor left="143" name="subject_form" width="127"/> + <line_editor label="Digite o assunto aqui" name="subject_form"/> <text name="msg_label"> Mensagem: </text> @@ -29,7 +29,7 @@ <button label="Cancelar" name="cancel_btn"/> <button label="Enviar" name="send_btn"/> <string name="default_subject"> - Cartão postal do [SECOND_LIFE] + Postal do [SECOND_LIFE]. </string> <string name="default_message"> Dá uma olhada nisto! diff --git a/indra/newview/skins/default/xui/pt/floater_preferences.xml b/indra/newview/skins/default/xui/pt/floater_preferences.xml index d2c3c79160..2c76a72ca8 100644 --- a/indra/newview/skins/default/xui/pt/floater_preferences.xml +++ b/indra/newview/skins/default/xui/pt/floater_preferences.xml @@ -1,9 +1,15 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Preferences" title="PREFERÊNCIAS" min_width="332" width="628"> +<floater name="Preferences" title="PREFERÊNCIAS"> <button label="OK" label_selected="OK" name="OK"/> <button label="Cancelar" label_selected="Cancelar" name="Cancel"/> - <button label="Aplicar" label_selected="Aplicar" name="Apply"/> - <button label="Sobre" label_selected="Sobre" name="About..."/> - <button label="Ajuda" label_selected="Ajuda" name="Help"/> - <tab_container name="pref core" tab_width="128" width="628" /> + <tab_container name="pref core"> + <panel label="Geral" name="general"/> + <panel label="VÃdeo" name="display"/> + <panel label="Privacidade" name="im"/> + <panel label="Som e mÃdia" name="audio"/> + <panel label="Bate-papo" name="chat"/> + <panel label="Notificações" name="msgs"/> + <panel label="Configurações" name="input"/> + <panel label="Avançado" name="advanced1"/> + </tab_container> </floater> diff --git a/indra/newview/skins/default/xui/pt/floater_preview_animation.xml b/indra/newview/skins/default/xui/pt/floater_preview_animation.xml index 26ca8f87e0..b66159354f 100644 --- a/indra/newview/skins/default/xui/pt/floater_preview_animation.xml +++ b/indra/newview/skins/default/xui/pt/floater_preview_animation.xml @@ -1,8 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="preview_anim"> + <floater.string name="Title"> + Animação: [NOME] + </floater.string> <text name="desc txt"> Descrição: </text> - <button label="Executar in World" label_selected="Parar" left="20" name="Anim play btn" tool_tip="Executar esta animação para que outros vejam." width="131"/> - <button label="Executar localmente" label_selected="Parar" left="162" name="Anim audition btn" tool_tip="Executar esta animação somente para você ver." width="125"/> + <button label="Tocar inworld" label_selected="Parar" left="20" name="Anim play btn" tool_tip="Tocar essa animação de forma que outros possam ver" width="131"/> + <button label="Executar localmente" label_selected="Parar" left="162" name="Anim audition btn" tool_tip="Tocar essa animação de forma que apenas você possa ver" width="125"/> </floater> diff --git a/indra/newview/skins/default/xui/pt/floater_preview_classified.xml b/indra/newview/skins/default/xui/pt/floater_preview_classified.xml index 0e8814b9f8..bb626430ed 100644 --- a/indra/newview/skins/default/xui/pt/floater_preview_classified.xml +++ b/indra/newview/skins/default/xui/pt/floater_preview_classified.xml @@ -1,2 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="classified_preview" title="INFORMAÇÃO DO ANÚNCIO CLASSIFICADO"/> +<floater name="classified_preview" title="INFORMAÇÕES CLASSIFICADAS"> + <floater.string name="Title"> + Classificados: [NAME] + </floater.string> +</floater> diff --git a/indra/newview/skins/default/xui/pt/floater_preview_event.xml b/indra/newview/skins/default/xui/pt/floater_preview_event.xml index c03feacf0c..b422580f3b 100644 --- a/indra/newview/skins/default/xui/pt/floater_preview_event.xml +++ b/indra/newview/skins/default/xui/pt/floater_preview_event.xml @@ -1,2 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="event_preview" title="INFORMAÇÃO DO EVENTO"/> +<floater name="event_preview" title="DADOS DO EVENTO"> + <floater.string name="Title"> + Evento: [NAME] + </floater.string> +</floater> diff --git a/indra/newview/skins/default/xui/pt/floater_preview_gesture.xml b/indra/newview/skins/default/xui/pt/floater_preview_gesture.xml index 87bf86c282..48f27f1968 100644 --- a/indra/newview/skins/default/xui/pt/floater_preview_gesture.xml +++ b/indra/newview/skins/default/xui/pt/floater_preview_gesture.xml @@ -1,14 +1,32 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="gesture_preview"> - <string name="stop_txt"> + <floater.string name="step_anim"> + Selecionar animação: + </floater.string> + <floater.string name="step_sound"> + Selecionar animação: + </floater.string> + <floater.string name="step_chat"> + Diga por bate-papo: + </floater.string> + <floater.string name="step_wait"> + Espere: + </floater.string> + <floater.string name="stop_txt"> Parar - </string> - <string name="preview_txt"> + </floater.string> + <floater.string name="preview_txt"> Prévia - </string> - <string name="none_text"> + </floater.string> + <floater.string name="none_text"> -- Nenhum -- - </string> + </floater.string> + <floater.string name="Title"> + Gesto: [NAME] + </floater.string> + <text name="name_text"> + Nome: + </text> <text name="desc_label"> Descrição: </text> @@ -22,37 +40,30 @@ <text name="key_label"> Tecla de Atalho: </text> - <combo_box label="Nenhum" name="modifier_combo" left="116" width="76"/> - <combo_box label="Nenhum" name="key_combo" width="76" left_delta="80"/> + <combo_box label="Nenhum" left="116" name="modifier_combo" width="76"/> + <combo_box label="Nenhum" left_delta="80" name="key_combo" width="76"/> <text name="library_label"> Biblioteca: </text> + <scroll_list name="library_list" width="84"/> + <button label="Incluir" left="118" name="add_btn" width="87"/> <text name="steps_label"> Passos: </text> - <scroll_list name="library_list" width="84"> - Animação -Som -Bate Papo -Esperar - </scroll_list> - <button label="Incluir" name="add_btn" left="118" width="87"/> - <button label="Mover Para Cima" name="up_btn" width="114" left_delta="-13"/> - <button label="Mover Para Baixo" name="down_btn" width="114"/> - <button label="Remover" name="delete_btn" width="84" left_delta="13"/> - <scroll_list left="226" name="step_list" width="205" /> - <text name="help_label"> - Todos os passos acontecem -simultaneamente, a menos que -você inclua passos de espera. - </text> + <scroll_list left="226" name="step_list" width="205"/> + <button label="P/ cima" left_delta="-13" name="up_btn" width="114"/> + <button label="P/ baixo" name="down_btn" width="114"/> + <button label="Remover" left_delta="13" name="delete_btn" width="84"/> <radio_group name="animation_trigger_type"> - <radio_item name="start" label="Iniciar" /> - <radio_item name="stop" label="Parar" /> + <radio_item label="OK" name="start"/> + <radio_item label="Pare" name="stop"/> </radio_group> - <check_box bottom_delta="34" label="até que as animações estejam concluÃdas" name="wait_anim_check"/> + <check_box bottom_delta="34" label="até que as animações estejam concluÃdas" name="wait_anim_check"/> <check_box bottom_delta="-30" label="tempo em segundos" name="wait_time_check"/> - <line_editor left_delta="130" name="wait_time_editor" /> + <line_editor left_delta="130" name="wait_time_editor"/> + <text name="help_label"> + Se não incluir etapas de espera, todas as etapas ocorrem ao mesmo tempo. + </text> <check_box label="Ativar" name="active_check" tool_tip="Gestos ativos podem ser gatilhados escrevendo suas frases de gatilho no chat ou através de suas teclas de atalho. Gestos normalmente ficam inativos quando existe um conflito nas teclas de atalho."/> <button label="Prévia" name="preview_btn"/> <button label="Salvar" name="save_btn"/> diff --git a/indra/newview/skins/default/xui/pt/floater_preview_gesture_info.xml b/indra/newview/skins/default/xui/pt/floater_preview_gesture_info.xml new file mode 100644 index 0000000000..aabcff70d3 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/floater_preview_gesture_info.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Gesture" title="ATALHO DE GESTO"/> diff --git a/indra/newview/skins/default/xui/pt/floater_preview_gesture_shortcut.xml b/indra/newview/skins/default/xui/pt/floater_preview_gesture_shortcut.xml new file mode 100644 index 0000000000..64bb7785f6 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/floater_preview_gesture_shortcut.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Gesture" title="ATALHO DE GESTO"> + <text name="trigger_label"> + Bate-papo: + </text> + <text name="key_label"> + Tecla: + </text> + <combo_box label="Nenhum" name="modifier_combo"/> + <combo_box label="Nenhum" name="key_combo"/> + <text name="replace_text" tool_tip="Substituir a(s) palavra(s) de comando. Por exemplo, substitua o comando 'olá' por 'oi' para trocar 'Olá, tudo bem' por 'Oi tudo bem'. O gesto também será executado."> + Trocar: + </text> + <line_editor name="replace_editor" tool_tip="Substituir a(s) palavra(s) de comando. Por exemplo, substitua o comando 'olá' por 'oi' para trocar 'Olá, tudo bem' por 'Oi tudo bem'. O gesto também será executado."/> +</floater> diff --git a/indra/newview/skins/default/xui/pt/floater_preview_gesture_steps.xml b/indra/newview/skins/default/xui/pt/floater_preview_gesture_steps.xml new file mode 100644 index 0000000000..aabcff70d3 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/floater_preview_gesture_steps.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Gesture" title="ATALHO DE GESTO"/> diff --git a/indra/newview/skins/default/xui/pt/floater_preview_notecard.xml b/indra/newview/skins/default/xui/pt/floater_preview_notecard.xml index 6f8944942a..d094c1b63a 100644 --- a/indra/newview/skins/default/xui/pt/floater_preview_notecard.xml +++ b/indra/newview/skins/default/xui/pt/floater_preview_notecard.xml @@ -1,16 +1,20 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="preview notecard" title="NOTA:"> - <button label="Salvar" label_selected="Salvar" name="Save"/> +<floater name="preview notecard" title="Anotação:"> + <floater.string name="no_object"> + O objeto com esta anotação não foi encontrado. + </floater.string> + <floater.string name="not_allowed"> + Você não está autorizado a ler esta nota. + </floater.string> + <floater.string name="Title"> + Anotação: [NAME] + </floater.string> <text name="desc txt"> Descrição: </text> <text_editor name="Notecard Editor"> Carregando... </text_editor> - <string name="no_object"> - Não foi possÃvel encontrar o objeto que contém esta nota. - </string> - <string name="not_allowed"> - Você não tem permissão de visualizar esta nota. - </string> + <button label="Salvar" label_selected="Salvar" name="Save"/> + <button label="Excluir" label_selected="Excluir" name="Delete"/> </floater> diff --git a/indra/newview/skins/default/xui/pt/floater_preview_sound.xml b/indra/newview/skins/default/xui/pt/floater_preview_sound.xml index 3dd2f84f91..7c5a1538f2 100644 --- a/indra/newview/skins/default/xui/pt/floater_preview_sound.xml +++ b/indra/newview/skins/default/xui/pt/floater_preview_sound.xml @@ -1,8 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="preview_sound"> + <floater.string name="Title"> + Som: [NAME] + </floater.string> <text name="desc txt"> Descrição: </text> - <button left_delta="-132" label="Executar in-World" label_selected="Executar in-World" name="Sound play btn" tool_tip="Executar este som para que todos possam ouvi-lo."/> - <button width="135" left="152" label="Executar Localmente" label_selected="Executar Localmente" name="Sound audition btn" tool_tip="Executar este som somente para você ouvir."/> + <button label="Tocar inworld" label_selected="Tocar inworld" left_delta="-132" name="Sound play btn" tool_tip="Tocar som para todos ouvirem"/> + <button label="Executar Localmente" label_selected="Executar Localmente" left="152" name="Sound audition btn" tool_tip="Tocar som de forma que apenas você possa ouvir" width="135"/> </floater> diff --git a/indra/newview/skins/default/xui/pt/floater_preview_texture.xml b/indra/newview/skins/default/xui/pt/floater_preview_texture.xml index 72bc42fa19..6f39635240 100644 --- a/indra/newview/skins/default/xui/pt/floater_preview_texture.xml +++ b/indra/newview/skins/default/xui/pt/floater_preview_texture.xml @@ -1,9 +1,47 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="preview_texture"> + <floater.string name="Title"> + Textura: [NAME] + </floater.string> + <floater.string name="Copy"> + Copiar para inventário + </floater.string> <text name="desc txt"> Descrição: </text> <text name="dimensions"> - Dimensões: [WIDTH] x [HEIGHT] + [WIDTH]px x [HEIGHT]px </text> + <text name="aspect_ratio"> + Visualizar relação de aspecto + </text> + <combo_box name="combo_aspect_ratio" tool_tip="Visualizar com proporção de aspecto fixa"> + <combo_item name="Unconstrained"> + Sem limites + </combo_item> + <combo_item name="1:1" tool_tip="SÃmbolo ou perfil RW do grupo"> + 1:1 + </combo_item> + <combo_item name="4:3" tool_tip="[SECOND_LIFE] perfil"> + 4:3 + </combo_item> + <combo_item name="10:7" tool_tip="Procurar anúncios classificados e marcos"> + 10:7 + </combo_item> + <combo_item name="3:2" tool_tip="Sobre terrenos"> + 3:2 + </combo_item> + <combo_item name="16:10"> + 16:10 + </combo_item> + <combo_item name="16:9" tool_tip="Perfis destacados"> + 16:9 + </combo_item> + <combo_item name="2:1"> + 2:1 + </combo_item> + </combo_box> + <button label="OK" name="Keep"/> + <button label="Descartar" name="Discard"/> + <button label="Salvar como" name="save_tex_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/pt/floater_publish_classified.xml b/indra/newview/skins/default/xui/pt/floater_publish_classified.xml new file mode 100644 index 0000000000..988f8f2ce1 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/floater_publish_classified.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="publish_classified" title="Publicando anúncio"> + <text name="explanation_text"> + Seu anúncio será publicado por uma semana a partir da data de publicação. + +Lembre-se, o pagamento do anúncio não é reembolsável + </text> + <spinner label="Preço do anúncio:" name="price_for_listing" tool_tip="Preço do anúncio." value="50"/> + <text name="l$_text" value="L$"/> + <text name="more_info_text"> + Mais informações (link para ajuda com anúncios) + </text> + <button label="Publicar" name="publish_btn"/> + <button label="Cancelar" name="cancel_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/pt/floater_report_abuse.xml b/indra/newview/skins/default/xui/pt/floater_report_abuse.xml index 0d226a9502..08413a9231 100644 --- a/indra/newview/skins/default/xui/pt/floater_report_abuse.xml +++ b/indra/newview/skins/default/xui/pt/floater_report_abuse.xml @@ -1,11 +1,14 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="floater_report_abuse" title="REPORTAR ABUSO"> - <check_box label="Incluir cópia da tela" name="screen_check"/> + <floater.string name="Screenshot"> + Captura de tela + </floater.string> + <check_box label="Usar esta captura de tela" name="screen_check"/> <text name="reporter_title"> Denunciador: </text> <text name="reporter_field"> - Loremipsum Dolorsitamut + Loremipsum Dolorsitamut Longnamez </text> <text name="sim_title"> Região: @@ -20,11 +23,11 @@ {128.1, 128.1, 15.4} </text> <text name="select_object_label"> - Clique no botão e em seguida no objeto: + Clique no botão e em seguida no objeto abusivo: </text> <button label="" label_selected="" name="pick_btn" tool_tip="Object Picker - Identifica um objeto como o assunto deste report"/> <text name="object_name_label"> - Nome: + Objeto: </text> <text name="object_name"> Consetetur Sadipscing @@ -33,54 +36,53 @@ Proprietário: </text> <text name="owner_name"> - Hendrerit Vulputate + Hendrerit Vulputate Kamawashi Longname </text> <combo_box name="category_combo" tool_tip="Categoria -- Selecione a categoria que melhor descreve este report"> - <combo_box.item name="Select_category" label="Selecionar categoria"/> - <combo_box.item name="Age__Age_play" label="Idade > Idade no jogo"/> - <combo_box.item name="Age__Adult_resident_on_Teen_Second_Life" label="Idade > Residente adulto no Second Life Jovem"/> - <combo_box.item name="Age__Underage_resident_outside_of_Teen_Second_Life" label="Idade > Residente menor de idade fora do Second Life Teen"/> - <combo_box.item name="Assault__Combat_sandbox___unsafe_area" label="Assalto > Sandbox de combate / área não segura"/> - <combo_box.item name="Assault__Safe_area" label="Assalto > Ãrea segura"/> - <combo_box.item name="Assault__Weapons_testing_sandbox" label="Assalto > Testando armas em sandbox"/> - <combo_box.item name="Commerce__Failure_to_deliver_product_or_service" label="Comércio > Falha em enviar produto ou serviço"/> - <combo_box.item name="Disclosure__Real_world_information" label="Revelar > Informação do mundo real"/> - <combo_box.item name="Disclosure__Remotely_monitoring chat" label="Revelar > Conversa monitorada remotamente"/> - <combo_box.item name="Disclosure__Second_Life_information_chat_IMs" label="Revelar > Informação do Second Life/conversa/MIs"/> - <combo_box.item name="Disturbing_the_peace__Unfair_use_of_region_resources" label="Distúrbio da paz > Uso injusto dos recursos da região"/> - <combo_box.item name="Disturbing_the_peace__Excessive_scripted_objects" label="Distúrbio da paz > Objetos com excesso de scripts"/> - <combo_box.item name="Disturbing_the_peace__Object_littering" label="Distúrbio da paz > Objeto despejando lixo"/> - <combo_box.item name="Disturbing_the_peace__Repetitive_spam" label="Distúrbio da paz > Spam repetitivo"/> - <combo_box.item name="Disturbing_the_peace__Unwanted_advert_spam" label="Distúrbio da paz > Spam de anúncio indesejado"/> - <combo_box.item name="Fraud__L$" label="Fraude > L$"/> - <combo_box.item name="Fraud__Land" label="Fraude > Terra"/> - <combo_box.item name="Fraud__Pyramid_scheme_or_chain_letter" label="Fraude > Esquema de pirâmide ou cartas encadeadas"/> - <combo_box.item name="Fraud__US$" label="Fraude > R$"/> - <combo_box.item name="Harassment__Advert_farms___visual_spam" label="Perturbação > Fazendas de Anúncios / spam visual"/> - <combo_box.item name="Harassment__Defaming_individuals_or_groups" label="Perturbação > Difamação de indivÃduos ou grupos"/> - <combo_box.item name="Harassment__Impeding_movement" label="Perturbação > Impedindo movimentos"/> - <combo_box.item name="Harassment__Sexual_harassment" label="Perturbação > Perturbação sexual"/> - <combo_box.item name="Harassment__Solicting_inciting_others_to_violate_ToS" label="Perturbação > Solicitando/incitando outros a violarem o ToS"/> - <combo_box.item name="Harassment__Verbal_abuse" label="Perturbação > Abuso verbal"/> - <combo_box.item name="Indecency__Broadly_offensive_content_or_conduct" label="Indecência > Conteúdo ou conduta amplamente ofensivos"/> - <combo_box.item name="Indecency__Inappropriate_avatar_name" label="Indecência > Nome de avatar inapropriado"/> - <combo_box.item name="Indecency__Mature_content_in_PG_region" label="Indecência > Conduta ou conteúdo inapropriados numa região PG"/> - <combo_box.item name="Indecency__Inappropriate_content_in_Mature_region" label="Indecência > Conduta ou conteúdo inapropriados numa região Mature"/> - <combo_box.item name="Intellectual_property_infringement_Content_Removal" label="Violação de propriedade intelectual > Remoção de Conteúdo"/> - <combo_box.item name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit" label="Violação de Propriedade intelectual > Cópia Ilegal ou Aproveitar-se de Permissões"/> - <combo_box.item name="Intolerance" label="Intolerância"/> - <combo_box.item name="Land__Abuse_of_sandbox_resources" label="Terra > Abuso dos recursos da sandbox"/> - <combo_box.item name="Land__Encroachment__Objects_textures" label="Terra > Invasão > Objetos/texturas"/> - <combo_box.item name="Land__Encroachment__Particles" label="Terra > Invasão > PartÃculas"/> - <combo_box.item name="Land__Encroachment__Trees_plants" label="Terra > Violação > Ãrvores/plantas"/> - <combo_box.item name="Wagering_gambling" label="Apostas/jogos de azar"/> - <combo_box.item name="Other" label="Outro"/> + <combo_box.item label="Selecionar categoria" name="Select_category"/> + <combo_box.item label="Idade > Idade no jogo" name="Age__Age_play"/> + <combo_box.item label="Idade > Residente adulto ou adolescente" name="Age__Adult_resident_on_Teen_Second_Life"/> + <combo_box.item label="Idade > Residente menor de idade, fora do Second Life teen" name="Age__Underage_resident_outside_of_Teen_Second_Life"/> + <combo_box.item label="Assalto > Sandbox de combate / área não segura" name="Assault__Combat_sandbox___unsafe_area"/> + <combo_box.item label="Assalto > Ãrea segura" name="Assault__Safe_area"/> + <combo_box.item label="Assalto > Testando armas em sandbox" name="Assault__Weapons_testing_sandbox"/> + <combo_box.item label="Comércio > Falha em enviar produto ou serviço" name="Commerce__Failure_to_deliver_product_or_service"/> + <combo_box.item label="Revelar > Informação do mundo real" name="Disclosure__Real_world_information"/> + <combo_box.item label="Revelar > Conversa monitorada remotamente" name="Disclosure__Remotely_monitoring chat"/> + <combo_box.item label="Revelar > Informação do Second Life/conversa/MIs" name="Disclosure__Second_Life_information_chat_IMs"/> + <combo_box.item label="Distúrbio da paz > Uso injusto dos recursos da região" name="Disturbing_the_peace__Unfair_use_of_region_resources"/> + <combo_box.item label="Distúrbio da paz > Objetos com excesso de scripts" name="Disturbing_the_peace__Excessive_scripted_objects"/> + <combo_box.item label="Distúrbio da paz > Objeto despejando lixo" name="Disturbing_the_peace__Object_littering"/> + <combo_box.item label="Distúrbio da paz > Spam repetitivo" name="Disturbing_the_peace__Repetitive_spam"/> + <combo_box.item label="Distúrbio da paz > Spam de anúncio indesejado" name="Disturbing_the_peace__Unwanted_advert_spam"/> + <combo_box.item label="Fraude > L$" name="Fraud__L$"/> + <combo_box.item label="Fraude > Terra" name="Fraud__Land"/> + <combo_box.item label="Fraude > Esquema de pirâmide ou cartas encadeadas" name="Fraud__Pyramid_scheme_or_chain_letter"/> + <combo_box.item label="Fraude > R$" name="Fraud__US$"/> + <combo_box.item label="Perturbação > Fazendas de Anúncios / spam visual" name="Harassment__Advert_farms___visual_spam"/> + <combo_box.item label="Perturbação > Difamação de indivÃduos ou grupos" name="Harassment__Defaming_individuals_or_groups"/> + <combo_box.item label="Perturbação > Impedindo movimentos" name="Harassment__Impeding_movement"/> + <combo_box.item label="Perturbação > Perturbação sexual" name="Harassment__Sexual_harassment"/> + <combo_box.item label="Perturbação > Solicitando/incitando outros a violarem o ToS" name="Harassment__Solicting_inciting_others_to_violate_ToS"/> + <combo_box.item label="Perturbação > Abuso verbal" name="Harassment__Verbal_abuse"/> + <combo_box.item label="Indecência > Conteúdo ou conduta amplamente ofensivos" name="Indecency__Broadly_offensive_content_or_conduct"/> + <combo_box.item label="Indecência > Nome de avatar inapropriado" name="Indecency__Inappropriate_avatar_name"/> + <combo_box.item label="Indecência > Conduta ou conteúdo inapropriados numa região PG" name="Indecency__Mature_content_in_PG_region"/> + <combo_box.item label="Indecência > Conduta ou conteúdo inapropriados numa região Mature" name="Indecency__Inappropriate_content_in_Mature_region"/> + <combo_box.item label="Violação de propriedade intelectual > Remoção de Conteúdo" name="Intellectual_property_infringement_Content_Removal"/> + <combo_box.item label="Violação de Propriedade intelectual > Cópia Ilegal ou Aproveitar-se de Permissões" name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit"/> + <combo_box.item label="Intolerância" name="Intolerance"/> + <combo_box.item label="Terra > Abuso dos recursos da sandbox" name="Land__Abuse_of_sandbox_resources"/> + <combo_box.item label="Terra > Invasão > Objetos/texturas" name="Land__Encroachment__Objects_textures"/> + <combo_box.item label="Terra > Invasão > PartÃculas" name="Land__Encroachment__Particles"/> + <combo_box.item label="Terra > Violação > Ãrvores/plantas" name="Land__Encroachment__Trees_plants"/> + <combo_box.item label="Apostas/jogos de azar" name="Wagering_gambling"/> + <combo_box.item label="Outro" name="Other"/> </combo_box> <text name="abuser_name_title"> Nome do Denunciado: </text> - <button label="Escolher Residente" label_selected="" name="select_abuser" tool_tip="Selecione o nome do Denunciado numa lista"/> - <check_box label="Não sei o nome do denunciado" name="omit_abuser_name" tool_tip="Marque aqui se você não consegue fornecer o nome do denunciado"/> + <button label="Selecionar" label_selected="" name="select_abuser" tool_tip="Selecione o nome do Denunciado numa lista"/> <text name="abuser_name_title2"> Local do Abuso: </text> @@ -91,13 +93,11 @@ Detalhes: </text> <text name="bug_aviso"> - Por favor, seja especÃfico(a) sobre data, localidade, -natureza do abuso, texto relevante de conversa/MI e -selecione o objeto, se possÃvel. + Seja o mais especÃfico possÃvel </text> <text name="incomplete_title"> - Nota: Relatos incompletos não serão investigados. + * Denúncias incompletas não serão investigadas </text> - <button label="Cancelar" label_selected="Cancelar" name="cancel_btn"/> <button label="Reportar Abuso" label_selected="Reportar Abuso" name="send_btn"/> + <button label="Cancelar" label_selected="Cancelar" name="cancel_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/pt/floater_script_debug_panel.xml b/indra/newview/skins/default/xui/pt/floater_script_debug_panel.xml new file mode 100644 index 0000000000..e70a30fa24 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/floater_script_debug_panel.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="script" short_title="[ALL SCRIPTS]" title="[ALL SCRIPTS]"/> diff --git a/indra/newview/skins/default/xui/pt/floater_script_limits.xml b/indra/newview/skins/default/xui/pt/floater_script_limits.xml new file mode 100644 index 0000000000..64a8a49c85 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/floater_script_limits.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="scriptlimits" title="DADOS DO SCRIPT"/> diff --git a/indra/newview/skins/default/xui/pt/floater_script_preview.xml b/indra/newview/skins/default/xui/pt/floater_script_preview.xml index 3c0570791c..5be866d052 100644 --- a/indra/newview/skins/default/xui/pt/floater_script_preview.xml +++ b/indra/newview/skins/default/xui/pt/floater_script_preview.xml @@ -1,5 +1,8 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="preview lsl text" title="SCRIPT: ROTATION SCRIPT"> + <floater.string name="Title"> + SCRIPT: [NAME] + </floater.string> <text name="desc txt"> Descrição: </text> diff --git a/indra/newview/skins/default/xui/pt/floater_script_queue.xml b/indra/newview/skins/default/xui/pt/floater_script_queue.xml index 6e0e174c07..5fb6dd1c35 100644 --- a/indra/newview/skins/default/xui/pt/floater_script_queue.xml +++ b/indra/newview/skins/default/xui/pt/floater_script_queue.xml @@ -1,4 +1,19 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="queue" title="RESETAR PROGRESSO"> + <floater.string name="Starting"> + Iniciando [START] de [COUNT] items. + </floater.string> + <floater.string name="Done"> + Pronto. + </floater.string> + <floater.string name="Resetting"> + Redefinindo + </floater.string> + <floater.string name="Running"> + Executando + </floater.string> + <floater.string name="NotRunning"> + Inerte + </floater.string> <button label="Fechar" label_selected="Fechar" name="close"/> </floater> diff --git a/indra/newview/skins/default/xui/pt/floater_script_search.xml b/indra/newview/skins/default/xui/pt/floater_script_search.xml index 3a62f1711f..8878590a4e 100644 --- a/indra/newview/skins/default/xui/pt/floater_script_search.xml +++ b/indra/newview/skins/default/xui/pt/floater_script_search.xml @@ -1,15 +1,15 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="script search" title="BUSCA DE SCRIPT" width="320"> - <check_box label="Não diferenciar Maiúsculas de Minúsculas" name="case_text" left="75"/> +<floater name="script search" title="BUSCAR SCRIPT" width="320"> + <check_box label="Não diferenciar Maiúsculas de Minúsculas" left="75" name="case_text"/> <button label="Buscar" label_selected="Buscar" name="search_btn" width="85"/> - <button label="Substituir" label_selected="Substituir" name="replace_btn" left="100" width="85"/> - <button label="Substituir Tudo" label_selected="Substituir Tudo" name="replace_all_btn" left="190" width="122"/> + <button label="Substituir" label_selected="Substituir" left="100" name="replace_btn" width="85"/> + <button label="Substituir Tudo" label_selected="Substituir Tudo" left="190" name="replace_all_btn" width="122"/> <text name="txt" width="65"> Buscar </text> <text name="txt2" width="65"> Substituir </text> - <line_editor left="75" name="search_text" width="240" /> - <line_editor left="75" name="replace_text" width="240" /> + <line_editor left="75" name="search_text" width="240"/> + <line_editor left="75" name="replace_text" width="240"/> </floater> diff --git a/indra/newview/skins/default/xui/pt/floater_search.xml b/indra/newview/skins/default/xui/pt/floater_search.xml new file mode 100644 index 0000000000..4bf7181180 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/floater_search.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_search" title="BUSCAR"> + <floater.string name="loading_text"> + Carregando... + </floater.string> + <floater.string name="done_text"> + Pronto + </floater.string> + <layout_stack name="stack1"> + <layout_panel name="browser_layout"> + <text name="refresh_search"> + Buscar novamente com status God + </text> + </layout_panel> + </layout_stack> +</floater> diff --git a/indra/newview/skins/default/xui/pt/floater_select_key.xml b/indra/newview/skins/default/xui/pt/floater_select_key.xml index e41a565d11..7264a5a713 100644 --- a/indra/newview/skins/default/xui/pt/floater_select_key.xml +++ b/indra/newview/skins/default/xui/pt/floater_select_key.xml @@ -2,6 +2,6 @@ <floater name="modal container" title=""> <button label="Cancelar" label_selected="Cancelar" name="Cancel"/> <text name="Save item as:"> - Aperte uma tecla para selecionar + Pressione uma tecla para definir o seu botão Falar. </text> </floater> diff --git a/indra/newview/skins/default/xui/pt/floater_sell_land.xml b/indra/newview/skins/default/xui/pt/floater_sell_land.xml index f58c4098ef..e6d4dc7ed6 100644 --- a/indra/newview/skins/default/xui/pt/floater_sell_land.xml +++ b/indra/newview/skins/default/xui/pt/floater_sell_land.xml @@ -1,65 +1,65 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="sell land" title="VENDER TERRENO"> - <scroll_container name="profile_scroll"> - <panel name="scroll_content_panel"> - <text name="info_parcel_label"> - Lote: - </text> - <text name="info_parcel"> - Nome do Lote - </text> - <text name="info_size_label"> - Tamanho: - </text> - <text name="info_size"> - [AREA] m² - </text> - <text name="info_action" bottom_delta="-67"> - Para vender este lote: - </text> - <icon bottom_delta="-66" name="step_price" /> - <text name="price_label"> - Defina um preço: - </text> - <text name="price_text"> - Escolha um preço apropriado para esta terra. - </text> - <text name="price_ld"> - L$ - </text> - <text name="price_per_m"> - (L$[PER_METER] por m²) - </text> - <text name="sell_to_label"> - Vender esta terra para: - </text> - <text name="sell_to_text"> - Escolha se venderá para qualquer um ou para um comprador em -particular. - </text> - <combo_box name="sell_to" bottom_delta="-32"> - <combo_box.item name="--selectone--" label="Selecione um --" /> - <combo_box.item name="Anyone" label="Qualquer um" /> - <combo_box.item name="Specificuser:" label="Usuário EspecÃfico:" /> - </combo_box> - <button label="Selecione..." name="sell_to_select_agent"/> - <text name="sell_objects_label"> - Vender os objetos com a terra? - </text> - <text name="sell_objects_text"> - Os objetos tranferÃveis do proprietário do terreno que estão neste -lote irão mudar de propriedade. - </text> - <radio_group name="sell_objects" bottom_delta="-58"> - <radio_item name="no" label="Não, manter a propriedade sobre os objetos" /> - <radio_item name="yes" label="Sim, vender objetos com a terra" /> - </radio_group> - <button label="Mostrar Objetos" name="show_objects"/> - <text name="nag_message_label"> - LEMBRE-SE: Todas as vendas são finais. - </text> - <button label="Definir Terra para Venda" name="sell_btn"/> - <button label="Cancelar" name="cancel_btn"/> - </panel> - </scroll_container> + <scroll_container name="profile_scroll"> + <panel name="scroll_content_panel"> + <text name="info_parcel_label"> + Lote: + </text> + <text name="info_parcel"> + NOME DO LOTE + </text> + <text name="info_size_label"> + Tamanho: + </text> + <text name="info_size"> + [AREA] m² + </text> + <text bottom_delta="-67" name="info_action"> + Para vender este terreno: + </text> + <text name="price_label"> + 1. Preço: + </text> + <text name="price_text"> + Determine o preço adequado. + </text> + <text name="price_ld"> + L$ + </text> + <line_editor name="price"> + 0 + </line_editor> + <text name="price_per_m"> + (L$[PER_METER] por m²) + </text> + <text name="sell_to_label"> + 2. Vender para: + </text> + <text name="sell_to_text"> + Vender para qualquer pessoa ou determinado comprador. + </text> + <combo_box bottom_delta="-32" name="sell_to"> + <combo_box.item label="- Selecione -" name="--selectone--"/> + <combo_box.item label="Todos" name="Anyone"/> + <combo_box.item label="Pessoa especÃfica:" name="Specificuser:"/> + </combo_box> + <button label="Selecionar" name="sell_to_select_agent"/> + <text name="sell_objects_label"> + 3. Vender o terreno com os objetos? + </text> + <text name="sell_objects_text"> + O objetos transferÃveis do terreno passam a ser do novo dono. + </text> + <radio_group bottom_delta="-58" name="sell_objects"> + <radio_item label="Não, os objetos continuam sendo meus" name="no"/> + <radio_item label="Sim, vender o terreno com os objetos" name="yes"/> + </radio_group> + <button label="Mostrar objetos" name="show_objects"/> + <text name="nag_message_label"> + LEMBRE-SE: Qualquer transação de compra e venda é irreversÃvel. + </text> + <button label="Colocar terreno à venda" name="sell_btn"/> + <button label="Cancelar" name="cancel_btn"/> + </panel> + </scroll_container> </floater> diff --git a/indra/newview/skins/default/xui/pt/floater_settings_debug.xml b/indra/newview/skins/default/xui/pt/floater_settings_debug.xml index 394a9771e0..c6694d13b2 100644 --- a/indra/newview/skins/default/xui/pt/floater_settings_debug.xml +++ b/indra/newview/skins/default/xui/pt/floater_settings_debug.xml @@ -1,10 +1,10 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="settings_debug" title="CONFIGURAÇÕES DE DEBUG"> - <combo_box name="boolean_combo"> - <combo_box.item name="TRUE" label="VERDADEIRO" /> - <combo_box.item name="FALSE" label="FALSO" /> - </combo_box> - <color_swatch label="Cor" name="color_swatch"/> +<floater name="settings_debug" title="DEBUG SETTINGS"> + <radio_group name="boolean_combo"> + <radio_item label="TRUE" name="TRUE" value="verdadeiro"/> + <radio_item label="FALSE" name="FALSE" value=""/> + </radio_group> + <color_swatch label="Cor" name="val_color_swatch"/> <spinner label="x" name="val_spinner_1"/> <spinner label="x" name="val_spinner_2"/> <spinner label="x" name="val_spinner_3"/> diff --git a/indra/newview/skins/default/xui/pt/floater_snapshot.xml b/indra/newview/skins/default/xui/pt/floater_snapshot.xml index c3c4c73a89..1d86b0d413 100644 --- a/indra/newview/skins/default/xui/pt/floater_snapshot.xml +++ b/indra/newview/skins/default/xui/pt/floater_snapshot.xml @@ -1,79 +1,23 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Snapshot" title="PRÉVIA DA FOTO"> - <text name="type_label"> - Destino da foto - </text> - <radio_group label="Tipo de Foto" name="snapshot_type_radio"> - <radio_item name="postcard" label="Enviar por email" /> - <radio_item name="texture" label="Salvar no seu inventário (L$[AMOUNT])" /> - <radio_item name="local" label="Salvar no seu disco rÃgido" /> - </radio_group> - <text name="file_size_label"> - Tamanho do arquivo: [SIZE] KB - </text> - <button label="Atualizar a foto" name="new_snapshot_btn"/> - <button label="Enviar" name="send_btn"/> - <button label="Salvar (L$[AMOUNT])" name="upload_btn"/> - <flyout_button label="Salvar" name="save_btn" tool_tip="Salvar imagem em um arquivo"> - <flyout_button.item name="save_item" label="Salvar"/> - <flyout_button.item name="saveas_item" label="Salvar como..."/> - </flyout_button> - <button label="Cancelar" name="discard_btn"/> - <button label="Mais >" name="more_btn" tool_tip="Opções Avançadas"/> - <button label="< Menos" name="less_btn" tool_tip="Opções Avançadas"/> - <text name="type_label2"> - Tamanho - </text> - <text name="format_label"> - Formato - </text> - <combo_box label="Resolução" name="postcard_size_combo"> - <combo_box.item name="CurrentWindow" label="Janela Atual" /> - <combo_box.item name="640x480" label="640x480" /> - <combo_box.item name="800x600" label="800x600" /> - <combo_box.item name="1024x768" label="1024x768" /> - <combo_box.item name="Custom" label="Customizado" /> - </combo_box> - <combo_box label="Resolução" name="texture_size_combo"> - <combo_box.item name="CurrentWindow" label="Janela Atual" /> - <combo_box.item name="Small(128x128)" label="Pequeno (128x128)" /> - <combo_box.item name="Medium(256x256)" label="Médio (256x256)" /> - <combo_box.item name="Large(512x512)" label="Grande (512x512)" /> - <combo_box.item name="Custom" label="Customizado" /> - </combo_box> - <combo_box label="Resolução" name="local_size_combo"> - <combo_box.item name="CurrentWindow" label="Janela Atual" /> - <combo_box.item name="320x240" label="320x240" /> - <combo_box.item name="640x480" label="640x480" /> - <combo_box.item name="800x600" label="800x600" /> - <combo_box.item name="1024x768" label="1024x768" /> - <combo_box.item name="1280x1024" label="1280x1024" /> - <combo_box.item name="1600x1200" label="1600x1200" /> - <combo_box.item name="Custom" label="Customizado" /> - </combo_box> - <combo_box label="Formato" name="local_format_combo"> - <combo_box.item name="PNG" label="PNG" /> - <combo_box.item name="JPEG" label="JPEG" /> - <combo_box.item name="BMP" label="BMP" /> - </combo_box> - <spinner label="Largura" name="snapshot_width" label_width="41" width="101"/> - <spinner label="Altura" name="snapshot_height" label_width="31" width="91" left="119"/> - <check_box label="Restringir proporções" name="keep_aspect_check"/> - <slider label="Qualidade da Imagem" name="image_quality_slider"/> - <text name="layer_type_label"> - Capturar: - </text> - <combo_box label="Camadas da Imagem" name="layer_types"> - <combo_box.item name="Colors" label="Cores" /> - <combo_box.item name="Depth" label="Formato" /> - <combo_box.item name="ObjectMattes" label="Decoração do Objeto" /> - </combo_box> - <check_box label="Mostrar interface na Foto" name="ui_check"/> - <check_box bottom_delta="-17" label="Mostrar Objetos HUD na Foto" name="hud_check"/> - <check_box bottom_delta="-17" label="Manter aberto após salvar" name="keep_open_check"/> - <check_box bottom_delta="-17" label="Quadro Congelado (prévia da tela inteira)" name="freeze_frame_check"/> - <check_box bottom_delta="-29" label="Auto-atualizar" name="auto_snapshot_check"/> - <string name="unknown"> +<floater name="Snapshot" title="Foto"> + <floater.string name="unknown"> desconhecido - </string> + </floater.string> + <button label="Atualizar a foto" name="new_snapshot_btn"/> + <line_editor label="Descrição" name="description"/> + <panel name="panel_snapshot_main"> + <button label="Compartilhar foto" name="share"/> + <button label="Salvar foto" name="save"/> + <button label="Usar como foto do perfil" name="set_profile_pic"/> + </panel> + <panel name="panel_snapshot_share"> + <button label="Compartilhar na web" name="share_to_web"/> + <button label="Enviar foto por email" name="share_to_email"/> + <button label="Atrás" name="cancel_share"/> + </panel> + <panel name="panel_snapshot_save"> + <button label="Salvar no meu inventário" name="save_to_inventory"/> + <button label="Salvar no meu PC" name="save_to_computer"/> + <button label="Atrás" name="cancel_save"/> + </panel> </floater> diff --git a/indra/newview/skins/default/xui/pt/floater_sound_preview.xml b/indra/newview/skins/default/xui/pt/floater_sound_preview.xml index d5d252c0dd..e62260c2e3 100644 --- a/indra/newview/skins/default/xui/pt/floater_sound_preview.xml +++ b/indra/newview/skins/default/xui/pt/floater_sound_preview.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Sound Preview" title="SOUND.WAV"> +<floater name="Sound Preview" title="SOM.WAV"> <text name="name_label"> Nome: </text> diff --git a/indra/newview/skins/default/xui/pt/floater_statistics.xml b/indra/newview/skins/default/xui/pt/floater_statistics.xml index c56c9fb2e0..ecbf638157 100644 --- a/indra/newview/skins/default/xui/pt/floater_statistics.xml +++ b/indra/newview/skins/default/xui/pt/floater_statistics.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="stats floater" title="STATÃSTICA"/> +<floater name="stats floater" title="ESTATÃSTICAS"/> diff --git a/indra/newview/skins/default/xui/pt/floater_stats.xml b/indra/newview/skins/default/xui/pt/floater_stats.xml new file mode 100644 index 0000000000..11589b31b6 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/floater_stats.xml @@ -0,0 +1,71 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Statistics" title="ESTATÃSTICAS"> + <scroll_container name="statistics_scroll"> + <container_view name="statistics_view"> + <stat_view label="Básico" name="basic"> + <stat_bar label="FPS" name="fps"/> + <stat_bar label="Bandwidth" name="bandwidth"/> + <stat_bar label="Bandwidth" name="packet_loss"/> + <stat_bar label="Ping Sim" name="ping"/> + </stat_view> + <stat_view label="Avançado" name="advanced"> + <stat_view label="Render" name="render"> + <stat_bar label="KTris Drawn" name="ktrisframe"/> + <stat_bar label="KTris Drawn" name="ktrissec"/> + <stat_bar label="Total Objects" name="objs"/> + <stat_bar label="New Objects" name="newobjs"/> + </stat_view> + <stat_view label="Texture" name="texture"> + <stat_bar label="Count" name="numimagesstat"/> + <stat_bar label="Raw Count" name="numrawimagesstat"/> + <stat_bar label="GL Mem" name="gltexmemstat"/> + <stat_bar label="Formatted Mem" name="formattedmemstat"/> + <stat_bar label="Raw Mem" name="rawmemstat"/> + <stat_bar label="Bound Mem" name="glboundmemstat"/> + </stat_view> + <stat_view label="Rede" name="network"> + <stat_bar label="Packets In" name="packetsinstat"/> + <stat_bar label="Packets Out" name="packetsoutstat"/> + <stat_bar label="Objects" name="objectkbitstat"/> + <stat_bar label="Texture" name="texturekbitstat"/> + <stat_bar label="Asset" name="assetkbitstat"/> + <stat_bar label="Layers" name="layerskbitstat"/> + <stat_bar label="Actual In" name="actualinkbitstat"/> + <stat_bar label="Actual Out" name="actualoutkbitstat"/> + <stat_bar label="VFS Pending Ops" name="vfspendingoperations"/> + </stat_view> + </stat_view> + <stat_view label="Simulator" name="sim"> + <stat_bar label="Time Dilation" name="simtimedilation"/> + <stat_bar label="Sim FPS" name="simfps"/> + <stat_bar label="Physics FPS" name="simphysicsfps"/> + <stat_view label="Physics Details" name="physicsdetail"> + <stat_bar label="Pinned Objects" name="physicspinnedtasks"/> + <stat_bar label="Low LOD Objects" name="physicslodtasks"/> + <stat_bar label="Memory Allocated" name="physicsmemoryallocated"/> + <stat_bar label="Agent Updates/Sec" name="simagentups"/> + <stat_bar label="Main Agents" name="simmainagents"/> + <stat_bar label="Child Agents" name="simchildagents"/> + <stat_bar label="Objects" name="simobjects"/> + <stat_bar label="Active Objects" name="simactiveobjects"/> + <stat_bar label="Active Scripts" name="simactivescripts"/> + <stat_bar label="Script Events" name="simscripteps"/> + <stat_bar label="Packets In" name="siminpps"/> + <stat_bar label="Packets Out" name="simoutpps"/> + <stat_bar label="Pending Downloads" name="simpendingdownloads"/> + <stat_bar label="Pending Uploads" name="simpendinguploads"/> + <stat_bar label="Total Unacked Bytes" name="simtotalunackedbytes"/> + </stat_view> + <stat_view label="Time (ms)" name="simperf"> + <stat_bar label="Total Frame Time" name="simframemsec"/> + <stat_bar label="Net Time" name="simnetmsec"/> + <stat_bar label="Physics Time" name="simsimphysicsmsec"/> + <stat_bar label="Simulation Time" name="simsimothermsec"/> + <stat_bar label="Agent Time" name="simagentmsec"/> + <stat_bar label="Images Time" name="simimagesmsec"/> + <stat_bar label="Script Time" name="simscriptmsec"/> + </stat_view> + </stat_view> + </container_view> + </scroll_container> +</floater> diff --git a/indra/newview/skins/default/xui/pt/floater_sys_well.xml b/indra/newview/skins/default/xui/pt/floater_sys_well.xml new file mode 100644 index 0000000000..38beec022c --- /dev/null +++ b/indra/newview/skins/default/xui/pt/floater_sys_well.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="sys_well_window" title="AVISOS"> + <string name="title_im_well_window"> + CONVERSAS + </string> + <string name="title_notification_well_window"> + AVISOS + </string> +</floater> diff --git a/indra/newview/skins/default/xui/pt/floater_telehub.xml b/indra/newview/skins/default/xui/pt/floater_telehub.xml index 5c775ab45d..6b35d3f919 100644 --- a/indra/newview/skins/default/xui/pt/floater_telehub.xml +++ b/indra/newview/skins/default/xui/pt/floater_telehub.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="telehub" title="TELEHUB" min_height="310" height="310" width="286"> +<floater height="310" min_height="310" name="telehub" title="TELEHUB" width="286"> <text name="status_text_connected"> Telehub conectado ao objeto [OBJECT] </text> @@ -17,16 +17,13 @@ <text name="spawn_points_text" width="265"> Pontos de Nascimento (posições, não objetos): </text> - <scroll_list name="spawn_points_list" width="265" /> - <button width="135" label="Adicionar Nascimento" name="add_spawn_point_btn"/> - <button width="130" label="Remover Nascimento" name="remove_spawn_point_btn" left="150"/> + <scroll_list name="spawn_points_list" width="265"/> + <button label="Adicionar Nascimento" name="add_spawn_point_btn" width="135"/> + <button label="Remover Nascimento" left="150" name="remove_spawn_point_btn" width="130"/> <text name="spawn_point_help"> - Selecione um objeto e clique Adicionar para -especificar a posição. -Em seguida, você pode mover ou apagar o objeto. -As posições são relativas ao centro do telehub. - -Selecione um item na lista para mostrar a posição -in-world. + Selecione o objeto e clique em 'Adicionar spawn' para especificar a posição. +O objeto pode ser excluÃdo ou movido posteriormente. +As posições são definidas em relação ao centro do telehub. +Selecione um item da lista para realçá-lo inworld. </text> </floater> diff --git a/indra/newview/skins/default/xui/pt/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/pt/floater_texture_ctrl.xml index b63c4a9bbf..144bc0340e 100644 --- a/indra/newview/skins/default/xui/pt/floater_texture_ctrl.xml +++ b/indra/newview/skins/default/xui/pt/floater_texture_ctrl.xml @@ -1,22 +1,22 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="texture picker" title="PEGAR: TEXTURA"> +<floater name="texture picker" title="DESTAQUE: TEXTURA"> <string name="choose_picture"> Clique para escolher uma imagem </string> <text name="Multiple"> - Multiplo + Multiplas texturas </text> <text name="unknown"> - Dimensões: [DIMENSIONS] + Tamanho: [DIMENSÕES] </text> <button label="Padrão" label_selected="Padrão" name="Default"/> <button label="Nenhum" label_selected="Nenhum" name="None"/> <button label="Branco" label_selected="Branco" name="Blank"/> - <check_box label="Mostrar Pastas" name="show_folders_check"/> - <search_editor label="Clique aqui para buscar" name="inventory search editor"/> - <check_box label="Aplicar Imediatamente" name="apply_immediate_check"/> + <check_box label="Exibir pastas" name="show_folders_check"/> + <search_editor label="Filtrar texturas" name="inventory search editor"/> + <check_box label="Applicar agora" name="apply_immediate_check"/> <button label="Cancelar" label_selected="Cancelar" name="Cancel"/> - <button label="Selecionar" label_selected="Selecionar" name="Select"/> + <button label="OK" label_selected="OK" name="Select"/> <string name="pick title"> Pegar: </string> diff --git a/indra/newview/skins/default/xui/pt/floater_tools.xml b/indra/newview/skins/default/xui/pt/floater_tools.xml index b9ab018606..dbc8b3ffbe 100644 --- a/indra/newview/skins/default/xui/pt/floater_tools.xml +++ b/indra/newview/skins/default/xui/pt/floater_tools.xml @@ -1,45 +1,84 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="toolbox floater" title="" short_title="CONSTRUIR" width="288"> +<floater name="toolbox floater" short_title="BUILD TOOLS" title="" width="288"> + <floater.string name="status_rotate"> + Arrastar as bandas coloridas para girar o objeto + </floater.string> + <floater.string name="status_scale"> + Clicar e arrastar para esticar o lado selecionado + </floater.string> + <floater.string name="status_move"> + Arrastar para mover, Shift-arrastar para copiar + </floater.string> + <floater.string name="status_modifyland"> + Clicar e reter para modificar a terra + </floater.string> + <floater.string name="status_camera"> + Clique e arraste para mexer a câmera + </floater.string> + <floater.string name="status_grab"> + Arraste para mexer, Ctrl para levantar, Ctrl+Shift para girar + </floater.string> + <floater.string name="status_place"> + Clique no mundo para construir + </floater.string> + <floater.string name="status_selectland"> + Clicar e arrastar para selecionar a terra + </floater.string> + <floater.string name="grid_screen_text"> + Tela + </floater.string> + <floater.string name="grid_local_text"> + Local + </floater.string> + <floater.string name="grid_world_text"> + Mundo + </floater.string> + <floater.string name="grid_reference_text"> + Referência + </floater.string> + <floater.string name="grid_attachment_text"> + Anexo + </floater.string> <button label="" label_selected="" name="button focus" tool_tip="Foco"/> <button label="" label_selected="" name="button move" tool_tip="Mover"/> <button label="" label_selected="" name="button edit" tool_tip="Editar"/> <button label="" label_selected="" name="button create" tool_tip="Criar"/> <button label="" label_selected="" name="button land" tool_tip="Terra"/> + <text name="text status" width="280"> + Arraste para mover, shift+Arrastar para Copiar + </text> <radio_group name="focus_radio_group"> <radio_item label="Zoom" name="radio zoom"/> <radio_item label="Órbita (Ctrl)" name="radio orbit"/> - <radio_item label="Pan (Ctrl-Shift)" name="radio pan"/> + <radio_item label="Pan (Ctrl+Shift)" name="radio pan"/> </radio_group> <radio_group name="move_radio_group"> <radio_item label="Mover" name="radio move"/> <radio_item label="Suspender (Ctrl)" name="radio lift"/> - <radio_item label="Girar (Ctrl-Shift)" name="radio spin"/> + <radio_item label="Spin (Ctrl+Shift)" name="radio spin"/> </radio_group> <radio_group name="edit_radio_group"> - <radio_item label="Posição" name="radio position"/> + <radio_item label="Movimentar" name="radio position"/> <radio_item label="Rotacionar (Ctrl)" name="radio rotate"/> - <radio_item label="Esticar (Ctrl-Shift)" name="radio stretch"/> - <radio_item label="Selecionar Textura" name="radio select face"/> + <radio_item label="Stretch (Ctrl+Shift)" name="radio stretch"/> + <radio_item label="Face selecionada" name="radio select face"/> </radio_group> - <check_box label="Editar partes unidas" name="checkbox edit linked parts"/> - <text name="text ruler mode"> - Régua: + <check_box label="Editar partes linkadas" name="checkbox edit linked parts"/> + <text name="RenderingCost" tool_tip="Mostra o cálculo do custo de renderização do objeto"> + þ: [COUNT] </text> - <combo_box name="combobox grid mode"> - <combo_box.item name="World" label="Mundo" - /> - <combo_box.item name="Local" label="Local" - /> - <combo_box.item name="Reference" label="Referência" - /> - </combo_box> - <check_box label="Esticar ambos os lados" name="checkbox uniform"/> - <check_box label="Esticar Texturas" name="checkbox stretch textures"/> - <check_box label="Usar Grade" name="checkbox snap to grid"/> - <button label="Opções..." label_selected="Opções..." name="Options..."/> - <text name="text status" width="280"> - Arraste para mover, shift+Arrastar para Copiar + <check_box label="" name="checkbox uniform"/> + <text label="Esticar ambos lados" name="checkbox uniform label"> + Esticar ambos lados </text> + <check_box initial_value="true" label="Esticar texturas" name="checkbox stretch textures"/> + <check_box initial_value="true" label="Mostrar na grade" name="checkbox snap to grid"/> + <combo_box name="combobox grid mode" tool_tip="Selecione o tipo de régua da grade onde o objeto será colocado"> + <combo_box.item label="Grid SL" name="World"/> + <combo_box.item label="Grid local" name="Local"/> + <combo_box.item label="Grid de referência" name="Reference"/> + </combo_box> + <button label="Opções..." label_selected="Opções..." name="Options..." tool_tip="Mais opções de grade"/> <button label="" label_selected="" name="ToolCube" tool_tip="Cubo"/> <button label="" label_selected="" name="ToolPrism" tool_tip="Prisma"/> <button label="" label_selected="" name="ToolPyramid" tool_tip="Pirâmide"/> @@ -55,10 +94,10 @@ <button label="" label_selected="" name="ToolRing" tool_tip="Anel"/> <button label="" label_selected="" name="ToolTree" tool_tip="Ãrvore"/> <button label="" label_selected="" name="ToolGrass" tool_tip="Grama"/> - <check_box label="Manter selecionado" name="checkbox sticky"/> - <check_box label="Copiar selecionado" name="checkbox copy selection"/> - <check_box label="Centro" name="checkbox copy centers"/> - <check_box label="Rotacionar" name="checkbox copy rotates"/> + <check_box label="Ficar com ferramenta selecionada" name="checkbox sticky"/> + <check_box label="Copiar seleção" name="checkbox copy selection"/> + <check_box initial_value="true" label="Copiar parte central" name="checkbox copy centers"/> + <check_box label="Girar cópia" name="checkbox copy rotates"/> <radio_group name="land_radio_group"> <radio_item label="Selecionar Terra" name="radio select land"/> <radio_item label="Aplainar" name="radio flatten"/> @@ -68,7 +107,6 @@ <radio_item label="Endurecer" name="radio noise"/> <radio_item label="Reverter" name="radio revert"/> </radio_group> - <button label="Aplicar" label_selected="Aplicar" name="button apply to selection" tool_tip="Modificar Terra Selecionada"/> <text name="Bulldozer:"> Escavadeira: </text> @@ -78,14 +116,51 @@ <text name="Strength:"> Força </text> - <text name="obj_count" left="134"> - Objetos selecionados: [COUNT] + <button label="Aplicar" label_selected="Aplicar" name="button apply to selection" tool_tip="Modificar a terra selecionada"/> + <text left="134" name="obj_count"> + Objetos: [COUNT] </text> - <text name="prim_count" left="134"> - primitivas: [COUNT] + <text left="134" name="prim_count"> + Prims: [COUNT] </text> <tab_container name="Object Info Tabs" tab_max_width="60" tab_min_width="30" width="288"> <panel label="Comum" name="General"> + <panel.string name="text deed continued"> + Doar + </panel.string> + <panel.string name="text deed"> + Doar + </panel.string> + <panel.string name="text modify info 1"> + Você pode modificar este objeto + </panel.string> + <panel.string name="text modify info 2"> + Você pode modificar estes objetos + </panel.string> + <panel.string name="text modify info 3"> + Você não pode modificar este objeto + </panel.string> + <panel.string name="text modify info 4"> + Você não pode modificar estes objetos + </panel.string> + <panel.string name="text modify warning"> + Selecione o objeto intereiro para configurar as autorizações + </panel.string> + <panel.string name="Cost Default"> + Preço: L$ + </panel.string> + <panel.string name="Cost Total"> + Total: L$ + </panel.string> + <panel.string name="Cost Per Unit"> + Preço unitário: L$ + </panel.string> + <panel.string name="Cost Mixed"> + Preço Misturado + </panel.string> + <panel.string name="Sale Mixed"> + Venda Misturada + </panel.string> <text name="Name:"> Nome: </text> @@ -98,135 +173,77 @@ <text name="Creator Name"> Thrax Linden </text> - <button label="Perfil..." label_selected="Perfil..." name="button creator profile"/> <text name="Owner:"> Proprietário: </text> <text name="Owner Name"> Thrax Linden </text> - <button label="Perfil..." label_selected="Perfil..." name="button owner profile"/> <text name="Group:"> Grupo: </text> - <text name="Group Name Proxy"> - The Lindens - </text> - <button label="Definir..." label_selected="Definir..." name="button set group"/> - <text name="Permissions:"> - Permissões: - </text> - - <check_box label="Compartilhar com o Grupo" name="checkbox share with group" tool_tip="Permite que todos os membros do grupo definido compartilhem e usem suas permissões para este objeto. Você precisa Doar ao Grupo para habilitar as restrições de função."/> - <string name="text deed continued"> - Doar... - </string> - <string name="text deed"> - Doar - </string> - <button label="Doar..." label_selected="Doar..." name="button deed" tool_tip="Objetos compartilhados do Grupo pode ser doados pelo gerente do grupo."/> - <check_box label="Permitir que qualquer um mova" name="checkbox allow everyone move"/> - <check_box label="Permitir que qualquer um copie" name="checkbox allow everyone copy"/> - <check_box label="Mostrar na busca" name="search_check" tool_tip="Permitir que as pessoas vejam este objeto nos resultados de busca"/> - <check_box label="À Venda" name="checkbox for sale"/> - <text name="Cost"> - Preço: L$ - </text> + <button label="Definir..." label_selected="Definir..." name="button set group" tool_tip="Selecione o grupo que terá acesso à autorização do objeto"/> + <name_box initial_value="Carregando..." name="Group Name Proxy"/> + <button label="Doar" label_selected="Doar" name="button deed" tool_tip="Ao doar este item, o próximo dono terá permissões de próximo dono. Objetos de grupos podem ser doados por um oficial do grupo."/> + <check_box label="Compartilhar" name="checkbox share with group" tool_tip="Permitir que todos os membros do grupo tenhas suas permissões de modificação para este objeto. Faça uma doação para ativar restrições de função."/> + <text name="label click action"> + Clique para: + </text> + <combo_box name="clickaction"> + <combo_box.item label="Tocar (padrão)" name="Touch/grab(default)"/> + <combo_box.item label="Sentar no objeto" name="Sitonobject"/> + <combo_box.item label="Comprar objeto" name="Buyobject"/> + <combo_box.item label="Pagar Objeto" name="Payobject"/> + <combo_box.item label="Abrir" name="Open"/> + <combo_box.item label="Zoom" name="Zoom"/> + </combo_box> + <check_box label="À venda" name="checkbox for sale"/> <combo_box name="sale type"> <combo_box.item label="Cópia" name="Copy"/> <combo_box.item label="Conteúdo" name="Contents"/> <combo_box.item label="Original" name="Original"/> </combo_box> - - <text name="label click action" width="220"> - Quando clicado com o botão esquerdo: - </text> - <combo_box name="clickaction" width="192"> - <combo_box.item name="Touch/grab(default)" label="Tocar/Pegar (padrão)" - /> - <combo_box.item name="Sitonobject" label="Sentar no objeto" - /> - <combo_box.item name="Buyobject" label="Comprar objeto" - /> - <combo_box.item name="Payobject" label="Pagar Objeto" - /> - <combo_box.item name="Open" label="Abrir" - /> - <combo_box.item name="Play" label="Executar a mÃdia do lote" - /> - <combo_box.item name="Opemmedia" label="Abrir a mÃdia do lote" - /> - </combo_box> - <panel name="perms_build"> - <text name="perm_modify"> - Você pode modificar este objeto - </text> - <text name="B:"> - B: - </text> - <text name="O:"> - O: - </text> - <text name="G:"> - G: - </text> - <text name="E:"> - E: - </text> - <text name="N:"> - N: - </text> - <text name="F:"> - F: - </text> - <text name="Next owner can:"> - Próximo Proprietário pode: - </text> - <check_box label="Modificar" name="checkbox next owner can modify"/> - <check_box label="Copiar" name="checkbox next owner can copy" left_delta="80"/> - <check_box name="checkbox next owner can transfer" left_delta="67"/> - </panel> - <string name="text modify info 1"> - Você pode modificar este objeto - </string> - <string name="text modify info 2"> - Você pode modificar estes objetos - </string> - <string name="text modify info 3"> - Você não pode modificar este objeto - </string> - <string name="text modify info 4"> - Você não pode modificar estes objetos - </string> - <string name="text modify warning"> - Você precisa selecionar o objeto todo para ajustar as permissões - </string> - <string name="Cost Default"> - Preço: L$ - </string> - <string name="Cost Total"> - Preço Total: L$ - </string> - <string name="Cost Per Unit"> - Preço Por: L$ - </string> - <string name="Cost Mixed"> - Preço Misturado - </string> - <string name="Sale Mixed"> - Venda Misturada - </string> + <spinner label="Preço: L$" name="Edit Cost"/> + <check_box label="Mostrar na busca" name="search_check" tool_tip="Permitir que as pessoas vejam este objeto nos resultados de busca"/> + <panel name="perms_build"> + <text name="perm_modify"> + Você pode modificar este objeto + </text> + <text name="Anyone can:"> + Todos: + </text> + <check_box label="Movimentar" name="checkbox allow everyone move"/> + <check_box label="Copiar" name="checkbox allow everyone copy"/> + <text name="Next owner can:"> + Próximo proprietário: + </text> + <check_box label="Modificar" name="checkbox next owner can modify"/> + <check_box label="Copiar" left_delta="80" name="checkbox next owner can copy"/> + <check_box label="Transferir" left_delta="67" name="checkbox next owner can transfer" tool_tip="O próximo dono poderá revender ou dar este objeto"/> + <text name="B:"> + B: + </text> + <text name="O:"> + O: + </text> + <text name="G:"> + G: + </text> + <text name="E:"> + E: + </text> + <text name="N:"> + N: + </text> + <text name="F:"> + F: + </text> + </panel> </panel> <panel label="Objeto" name="Object"> - <text name="select_single" width="272"> - Selecione apenas uma primitiva para editar os parâmetros. - </text> - <text name="edit_object"> - Editar os parâmetros do Objeto: - </text> <check_box label="Travado" name="checkbox locked" tool_tip="Previne que o objeto seja movido ou apagado. Muito útil para evitar edições não intencionais durante a construção."/> <check_box label="FÃsica" name="Physical Checkbox Ctrl" tool_tip="Permite que os objetos sejam empurrados e sofram efeito da gravidade"/> - <check_box label="Temporário" name="Temporary Checkbox Ctrl" tool_tip="Faz com que o objeto seja apagado 1 minuto após ser criado."/> + <check_box label="Temporário" name="Temporary Checkbox Ctrl" tool_tip="O objeto será excluÃdo um minuto depois de ser criado"/> <check_box label="Fantasma" name="Phantom Checkbox Ctrl" tool_tip="Faz com que o objeto não colida com outros objetos ou avatares"/> <text name="label position"> Posição (metros) @@ -246,48 +263,27 @@ <spinner label="X" name="Rot X"/> <spinner label="Y" name="Rot Y"/> <spinner label="Z" name="Rot Z"/> - <text name="label material"> - Material - </text> - <combo_box name="material"> - <combo_box.item name="Stone" label="Pedra" - /> - <combo_box.item name="Metal" label="Metal" - /> - <combo_box.item name="Glass" label="Vidro" - /> - <combo_box.item name="Wood" label="Madeira" - /> - <combo_box.item name="Flesh" label="Carne" - /> - <combo_box.item name="Plastic" label="Plástico" - /> - <combo_box.item name="Rubber" label="Couro" - /> - </combo_box> - <text name="label basetype"> - Forma básica - </text> <combo_box name="comboBaseType"> - <combo_box.item name="Box" label="Caixa" - /> - <combo_box.item name="Cylinder" label="Cilindro" - /> - <combo_box.item name="Prism" label="Prisma" - /> - <combo_box.item name="Sphere" label="Esfera" - /> - <combo_box.item name="Torus" label="Toróide" - /> - <combo_box.item name="Tube" label="Tubo" - /> - <combo_box.item name="Ring" label="Anel" - /> - <combo_box.item name="Sculpted" label="Esculpida" - /> + <combo_box.item label="Caixa" name="Box"/> + <combo_box.item label="Cilindro" name="Cylinder"/> + <combo_box.item label="Prisma" name="Prism"/> + <combo_box.item label="Esfera" name="Sphere"/> + <combo_box.item label="Toróide" name="Torus"/> + <combo_box.item label="Tubo" name="Tube"/> + <combo_box.item label="Anel" name="Ring"/> + <combo_box.item label="Esculpida" name="Sculpted"/> + </combo_box> + <combo_box name="material"> + <combo_box.item label="Pedra" name="Stone"/> + <combo_box.item label="Metal" name="Metal"/> + <combo_box.item label="Vidro" name="Glass"/> + <combo_box.item label="Madeira" name="Wood"/> + <combo_box.item label="Carne" name="Flesh"/> + <combo_box.item label="Plástico" name="Plastic"/> + <combo_box.item label="Couro" name="Rubber"/> </combo_box> <text name="text cut"> - Recorte InÃcio e final + Path Cut (begin/end) </text> <spinner label="I" name="cut begin"/> <spinner label="F" name="cut end"/> @@ -301,17 +297,13 @@ Forma Vazia </text> <combo_box name="hole"> - <combo_box.item name="Default" label="Padrão" - /> - <combo_box.item name="Circle" label="Circulo" - /> - <combo_box.item name="Square" label="Quadrado" - /> - <combo_box.item name="Triangle" label="Triâgulo" - /> + <combo_box.item label="Padrão" name="Default"/> + <combo_box.item label="Circulo" name="Circle"/> + <combo_box.item label="Quadrado" name="Square"/> + <combo_box.item label="Triâgulo" name="Triangle"/> </combo_box> <text name="text twist"> - Torcer no InÃcio e final + Twist (begin/end) </text> <spinner label="I" name="Twist Begin"/> <spinner label="F" name="Twist End"/> @@ -329,13 +321,13 @@ <spinner label="X" name="Shear X"/> <spinner label="Y" name="Shear Y"/> <text name="advanced_cut" width="156"> - Perfil Recortado no InÃcio e fim + Profile Cut (begin/end) </text> <text name="advanced_dimple"> - Cova InÃcio e final + Dimple (begin/end) </text> <text name="advanced_slice"> - Pedaço InÃcio e fim + Slice (begin/end) </text> <spinner label="I" name="Path Limit Begin"/> <spinner label="F" name="Path Limit End"/> @@ -351,22 +343,17 @@ Revoluções </text> <texture_picker label="Texture de Escultura" name="sculpt texture control" tool_tip="Click to choose a picture"/> - <check_box label="Espelho" name="sculpt mirror control" tool_tip="Inverter a primitiva esculpida ao longo do eixo X."/> - <check_box label="De dentro para fora" name="sculpt invert control" tool_tip="Inverte as normais das primitivas esculpidas, fazendo-as parecer de dentro para fora."/> + <check_box label="Espelho" name="sculpt mirror control" tool_tip="Flips sculpted prim along the X axis"/> + <check_box label="De dentro para fora" name="sculpt invert control" tool_tip="Inverts the sculpted prims normals, making it appear inside-out"/> <text name="label sculpt type"> Tipo costura </text> <combo_box name="sculpt type control"> - <combo_box.item name="None" label="(nenhum)" - /> - <combo_box.item name="Sphere" label="Esfera" - /> - <combo_box.item name="Torus" label="Toróide" - /> - <combo_box.item name="Plane" label="Plano" - /> - <combo_box.item name="Cylinder" label="Cilindro" - /> + <combo_box.item label="(nenhum)" name="None"/> + <combo_box.item label="Esfera" name="Sphere"/> + <combo_box.item label="Toróide" name="Torus"/> + <combo_box.item label="Plano" name="Plane"/> + <combo_box.item label="Cilindro" name="Cylinder"/> </combo_box> </panel> <panel label="Recursos" name="Features"> @@ -376,7 +363,7 @@ <text name="edit_object"> Editar caracterÃsticas do Objeto: </text> - <check_box label="FlexÃbilidade" name="Flexible1D Checkbox Ctrl" tool_tip="Permite que o objeto flexione no eixo Z. (Somente no lado do Cliente)"/> + <check_box label="FlexÃbilidade" name="Flexible1D Checkbox Ctrl" tool_tip="Allows object to flex about the Z axis (Client-side only)"/> <spinner label="Suavidade" name="FlexNumSections"/> <spinner label="Gravidade" name="FlexGravity"/> <spinner label="Arrastar" name="FlexFriction"/> @@ -386,17 +373,24 @@ <spinner label="Força Y" name="FlexForceY"/> <spinner label="Força Z" name="FlexForceZ"/> <check_box label="Luz" name="Light Checkbox Ctrl" tool_tip="Faz com que o objeto emita luz"/> - <text name="label color"> - Cor - </text> - <color_swatch label="" name="colorswatch" tool_tip="Clique para abrir o Seletor de Cores"/> + <color_swatch label="" name="colorswatch" tool_tip="Selecionar a cor"/> + <texture_picker label="" name="light texture control" tool_tip="Clique para selecionar uma imagem de projeção (só com renderização suspesa ativada)"/> <spinner label="Intensidade" name="Light Intensity"/> + <spinner label="FOV" name="Light FOV"/> <spinner label="Raio" name="Light Radius"/> + <spinner label="Enfocar" name="Light Focus"/> <spinner label="Queda" name="Light Falloff"/> + <spinner label="Ambiente" name="Light Ambiance"/> </panel> <panel label="Textura" name="Texture"> + <panel.string name="string repeats per meter"> + Repetir por Metro + </panel.string> + <panel.string name="string repeats per face"> + Repetir por Face + </panel.string> <texture_picker label="Textura" name="texture control" tool_tip="Clique para escolher uma imagem"/> - <color_swatch label="Cor" name="colorswatch" tool_tip="Clique para abrir o Seletor de Cores"/> + <color_swatch label="Cor" name="colorswatch" tool_tip="Selecionar a cor"/> <text name="color trans" width="100"> Transparência % </text> @@ -408,99 +402,69 @@ Mapeamento </text> <combo_box name="combobox texgen"> - <combo_box.item name="Default" label="Padrão" - /> - <combo_box.item name="Planar" label="Planar" - /> + <combo_box.item label="Padrão" name="Default"/> + <combo_box.item label="Planar" name="Planar"/> </combo_box> <text name="label shininess"> Brilho </text> <combo_box name="combobox shininess"> - <combo_box.item name="None" label="Nenhum" - /> - <combo_box.item name="Low" label="Baixo" - /> - <combo_box.item name="Medium" label="Médio" - /> - <combo_box.item name="High" label="Alto" - /> + <combo_box.item label="Nenhum" name="None"/> + <combo_box.item label="Baixo" name="Low"/> + <combo_box.item label="Médio" name="Medium"/> + <combo_box.item label="Alto" name="High"/> </combo_box> <text name="label bumpiness"> Ondulação </text> - <combo_box name="combobox bumpiness" width="100" > - <combo_box.item name="None" label="Nenhum" - /> - <combo_box.item name="Brightness" label="Claridade" - /> - <combo_box.item name="Darkness" label="Escuridão" - /> - <combo_box.item name="woodgrain" label="Granulação" - /> - <combo_box.item name="bark" label="Casca" - /> - <combo_box.item name="bricks" label="Tijolos" - /> - <combo_box.item name="checker" label="Caixa" - /> - <combo_box.item name="concrete" label="Concreto" - /> - <combo_box.item name="crustytile" label="Encaroçado" - /> - <combo_box.item name="cutstone" label="Pedra Cortante" - /> - <combo_box.item name="discs" label="Discos" - /> - <combo_box.item name="gravel" label="Cascalho" - /> - <combo_box.item name="petridish" label="Pedrisco" - /> - <combo_box.item name="siding" label="Revestimento" - /> - <combo_box.item name="stonetile" label="Empedrado" - /> - <combo_box.item name="stucco" label="Grafiato" - /> - <combo_box.item name="suction" label="Sulcos" - /> - <combo_box.item name="weave" label="Weave" - /> + <combo_box name="combobox bumpiness" width="100"> + <combo_box.item label="Nenhum" name="None"/> + <combo_box.item label="Claridade" name="Brightness"/> + <combo_box.item label="Escuridão" name="Darkness"/> + <combo_box.item label="Granulação" name="woodgrain"/> + <combo_box.item label="Casca" name="bark"/> + <combo_box.item label="Tijolos" name="bricks"/> + <combo_box.item label="Caixa" name="checker"/> + <combo_box.item label="Concreto" name="concrete"/> + <combo_box.item label="Encaroçado" name="crustytile"/> + <combo_box.item label="Pedra Cortante" name="cutstone"/> + <combo_box.item label="Discos" name="discs"/> + <combo_box.item label="Cascalho" name="gravel"/> + <combo_box.item label="Pedrisco" name="petridish"/> + <combo_box.item label="Revestimento" name="siding"/> + <combo_box.item label="Empedrado" name="stonetile"/> + <combo_box.item label="Grafiato" name="stucco"/> + <combo_box.item label="Sulcos" name="suction"/> + <combo_box.item label="Weave" name="weave"/> </combo_box> <text name="tex scale"> - Repetir por Face + Repeats / Face </text> <spinner label="Horizontal (U)" name="TexScaleU"/> <check_box label="Flip" name="checkbox flip s"/> <spinner label="Vertical (V)" name="TexScaleV"/> <check_box label="Flip" name="checkbox flip t"/> - <text name="tex rotate"> - Rotação (graus) - </text> - <string name="string repeats per meter"> - Repetir por Metro - </string> - <string name="string repeats per face"> - Repetir por Face - </string> - <text name="rpt"> - Repetir por Metro - </text> + <spinner label="RotationËš" name="TexRot"/> + <spinner label="Repeats / Meter" name="rptctrl"/> <button label="Aplicar" label_selected="Aplicar" name="button apply"/> <text name="tex offset"> - Deslocamento + Texture Offset </text> <spinner label="Horizontal (U)" name="TexOffsetU"/> <spinner label="Vertical (V)" name="TexOffsetV"/> - <text name="textbox autofix"> - Alinhar Texturas - </text> - <button label="Alinhar" label_selected="Alinhar" name="button align"/> + <panel name="Add_Media"> + <text name="media_tex"> + MÃdia + </text> + <button name="add_media" tool_tip="Adicionar mÃdia"/> + <button name="delete_media" tool_tip="Excluir esta textura de mÃdia"/> + <button name="edit_media" tool_tip="Editar esta mÃdia"/> + <button label="Alinhar" label_selected="Alinhar mÃdias" name="button align" tool_tip="Alinhar textura da mÃdia (após carregar mÃdia)"/> + </panel> </panel> <panel label="Conteúdo" name="Contents"> - <button label="Novo Script" label_selected="Novo Script" name="button new script"/> - <button label="Permissões" name="button permissions"/> - <panel name="ContentsInventory" width="272" /> + <button label="Novo Script" label_selected="Novo script" name="button new script"/> + <button label="Autorizações" name="button permissions"/> </panel> </tab_container> <panel name="land info panel"> @@ -508,62 +472,22 @@ Informações do Lote </text> <text name="label_area_price"> - Preço: L$[PRICE] por [AREA] m². + Preço: L$[PRICE] por [AREA] m² </text> <text name="label_area"> - Ãrea: [AREA] m². + Ãrea: [AREA] m² </text> - <button label="Sobre a Terra..." label_selected="Sobre a Terra..." name="button about land"/> - <check_box label="Mostrar donos" name="checkbox show owners" tool_tip="Colorir lotes de acordo com seus donos: Green = Sua terra Aqua = Terra do seu grupo Red = PossuÃda por outros Yellow = À venda Purple = A leilão Grey = Pública"/> - <button label="?" label_selected="?" name="button show owners help" left_delta="100"/> + <button label="Sobre terrenos" label_selected="Sobre terrenos" name="button about land"/> + <check_box label="Mostrar donos" name="checkbox show owners" tool_tip="Colorir lotes de acordo com seus donos: Green = Sua terra Aqua = Terra do seu grupo Red = PossuÃda por outros Yellow = À venda Purple = A leilão Grey = Pública"/> <text name="label_parcel_modify"> Modificar Lote </text> - <button label="Sub-Dividir" label_selected="Sub-Dividir" name="button subdivide land"/> - <button label="Unir" label_selected="Unir" name="button join land"/> + <button label="Subdividir" label_selected="Subdividir" name="button subdivide land"/> + <button label="Juntar" label_selected="Juntar" name="button join land"/> <text name="label_parcel_trans"> Transações com a Terra </text> - <button label="Comprar Terra" label_selected="Comprar Terra" name="button buy land"/> - <button label="Abandonar Terra" label_selected="Abandonar Terra" name="button abandon land"/> + <button label="Comprar terreno" label_selected="Comprar terreno" name="button buy land"/> + <button label="Abandonar terreno" label_selected="Abandonar terreno" name="button abandon land"/> </panel> - <floater.string name="status_rotate"> - Arrastar as bandas coloridas para girar o objeto - </floater.string> - <floater.string name="status_scale"> - Clicar e arrastar para esticar o lado selecionado - </floater.string> - <floater.string name="status_move"> - Arrastar para mover, Shift-arrastar para copiar - </floater.string> - <floater.string name="status_modifyland"> - Clicar e reter para modificar a terra - </floater.string> - <floater.string name="status_camera"> - Clicar e arrastar para mudar a vista - </floater.string> - <floater.string name="status_grab"> - Arrastar para mover, Ctrl para levantar, Ctrl-Shift para rotacionar - </floater.string> - <floater.string name="status_place"> - Clique no mundo para construir - </floater.string> - <floater.string name="status_selectland"> - Clicar e arrastar para selecionar a terra - </floater.string> - <floater.string name="grid_screen_text"> - Tela - </floater.string> - <floater.string name="grid_local_text"> - Local - </floater.string> - <floater.string name="grid_world_text"> - Mundo - </floater.string> - <floater.string name="grid_reference_text"> - Referência - </floater.string> - <floater.string name="grid_attachment_text"> - Anexo - </floater.string> </floater> diff --git a/indra/newview/skins/default/xui/pt/floater_top_objects.xml b/indra/newview/skins/default/xui/pt/floater_top_objects.xml index 15e69c450c..dc3bf73818 100644 --- a/indra/newview/skins/default/xui/pt/floater_top_objects.xml +++ b/indra/newview/skins/default/xui/pt/floater_top_objects.xml @@ -1,58 +1,59 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="top_objects" title="CARREGANDO..."> +<floater name="top_objects" title="Principais objetos:"> + <floater.string name="top_scripts_title"> + Principais Scripts + </floater.string> + <floater.string name="top_scripts_text"> + [COUNT] scripts tomando um total de [TIME] ms + </floater.string> + <floater.string name="scripts_score_label"> + Tempo + </floater.string> + <floater.string name="scripts_mono_time_label"> + Hora Mono + </floater.string> + <floater.string name="top_colliders_title"> + Principais Colidentes + </floater.string> + <floater.string name="top_colliders_text"> + [COUNT] objetos principais experimentando muitas potenciais colisões + </floater.string> + <floater.string name="colliders_score_label"> + Placar + </floater.string> + <floater.string name="none_descriptor"> + Nenhum encontrado. + </floater.string> <text name="title_text"> Carregando... </text> <scroll_list name="objects_list"> - <column label="Placar" name="score"/> - <column label="Nome" name="name"/> - <column label="Proprietário" name="owner"/> - <column label="Local" name="location"/> - <column label="Tempo" name="time"/> - <column label="Hora Mono" name="mono_time"/> + <scroll_list.columns label="Placar" name="score"/> + <scroll_list.columns label="Nome" name="name"/> + <scroll_list.columns label="Proprietário" name="owner"/> + <scroll_list.columns label="Local" name="location"/> + <scroll_list.columns label="Tempo" name="time"/> + <scroll_list.columns label="Hora Mono" name="mono_time"/> + <scroll_list.columns label="URLs" name="URLs"/> </scroll_list> <text name="id_text"> ID do Objeto: </text> + <line_editor font="SansSerifSmall" left="140" name="id_editor" width="280"/> <button label="Mostrar Avisos" name="show_beacon_btn"/> <text name="obj_name_text"> - Nome do Objeto: + Nome do objeto: </text> + <line_editor font="SansSerifSmall" left="140" name="object_name_editor" width="280"/> <button label="Filtro" name="filter_object_btn"/> <text name="owner_name_text" width="130"> - Nome do Proprietário: + Proprietário: </text> - <line_editor font="SansSerifSmall" left="140" name="id_editor" width="280"/> - <line_editor font="SansSerifSmall" left="140" name="object_name_editor" width="280"/> <line_editor font="SansSerifSmall" left="140" name="owner_name_editor" width="280"/> <button label="Filtro" name="filter_owner_btn"/> + <button label="Atualizar" name="refresh_btn"/> <button label="Retornar Selecionado" name="return_selected_btn" width="170"/> - <button label="Retornar Tudo" name="return_all_btn" left="190"/> + <button label="Retornar Tudo" left="190" name="return_all_btn"/> <button label="Desabilitar Selecionado" name="disable_selected_btn" width="170"/> - <button label="Desabilitar Tudo" name="disable_all_btn" left="190"/> - <button label="Atualizar" name="refresh_btn"/> - <string name="top_scripts_title"> - Principais Scripts - </string> - <string name="top_scripts_text"> - [COUNT] scripts tomando um total de [TIME] ms - </string> - <string name="scripts_score_label"> - Tempo - </string> - <string name="scripts_mono_time_label"> - Hora Mono - </string> - <string name="top_colliders_title"> - Principais Colidentes - </string> - <string name="top_colliders_text"> - [COUNT] objetos principais experimentando muitas potenciais colisões - </string> - <string name="colliders_score_label"> - Placar - </string> - <string name="none_descriptor"> - Nenhum encontrado. - </string> + <button label="Desabilitar Tudo" left="190" name="disable_all_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/pt/floater_tos.xml b/indra/newview/skins/default/xui/pt/floater_tos.xml index 7a0c187517..2675979783 100644 --- a/indra/newview/skins/default/xui/pt/floater_tos.xml +++ b/indra/newview/skins/default/xui/pt/floater_tos.xml @@ -1,16 +1,15 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="modal container" title=" "> + <floater.string name="real_url"> + http://secondlife.com/app/tos/ + </floater.string> + <floater.string name="loading_url"> + data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Carregando %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E + </floater.string> <button label="Continuar" label_selected="Continuar" name="Continue"/> <button label="Cancelar" label_selected="Cancelar" name="Cancel"/> - <check_box label="Eu concordo com os Termos do Serviço" name="agree_chk"/> + <check_box label="Concordo com os Termos de Serviço e com a PolÃtica de Privacidade" name="agree_chk"/> <text name="tos_heading"> - Por favor, leia os seguintes Termos de Serviço cuidadosamente. Para continuar acessando o -[SECOND_LIFE], você precisa aceitar o acordo. + Leia com atenção os Termos do Serviço e a PolÃtica de Privacidade. Para continuar a entrar no [SECOND_LIFE], é preciso aceitar esses termos. </text> - <text_editor name="tos_text"> - TOS_TEXT - </text_editor> - <string name="real_url"> - http://secondlife.com/app/tos/ - </string> </floater> diff --git a/indra/newview/skins/default/xui/pt/floater_voice_controls.xml b/indra/newview/skins/default/xui/pt/floater_voice_controls.xml new file mode 100644 index 0000000000..44f08b76b5 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/floater_voice_controls.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_voice_controls" title="Controles de voz"> + <string name="title_nearby"> + VOZ LOCAL + </string> + <string name="title_group"> + Ligação de grupo com [GROUP] + </string> + <string name="title_adhoc"> + Teleconferência + </string> + <string name="title_peer_2_peer"> + Ligação para [NAME] + </string> + <string name="no_one_near"> + Ninguém por perto ativou a voz + </string> + <layout_stack name="my_call_stack"> + <layout_panel name="my_panel"> + <text name="user_text" value="Meu avatar:"/> + </layout_panel> + <layout_stack name="voice_effect_and_leave_call_stack"> + <layout_panel name="leave_call_btn_panel"> + <button label="Desligar" name="leave_call_btn"/> + </layout_panel> + </layout_stack> + </layout_stack> +</floater> diff --git a/indra/newview/skins/default/xui/pt/floater_voice_effect.xml b/indra/newview/skins/default/xui/pt/floater_voice_effect.xml new file mode 100644 index 0000000000..4bc8575588 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/floater_voice_effect.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater label="Lugares" name="voice_effects" title="CHECAR DISTORÇÃO DE VOZ"> + <string name="no_voice_effect"> + (Não distorcer voz) + </string> + <string name="active_voice_effect"> + (Ativo) + </string> + <string name="unsubscribed_voice_effect"> + (Cancelou) + </string> + <string name="new_voice_effect"> + (Novo!) + </string> + <text name="status_text"> + Para ouvir um efeito de Distorção de voz, clique no botão Gravar, grave alguns instantes de voz, depois clique em Distorcer voz na lista para ouvir o resultado. + +Para reconectar à Voz local, basta fechar esta janela. + </text> + <button label="Gravar amostra" name="record_btn" tool_tip="Grave uma amostra da sua voz."/> + <button label="Parar" name="record_stop_btn"/> + <text name="voice_morphing_link"> + [[URL] Distorcer voz] + </text> + <scroll_list name="voice_effect_list" tool_tip="Grave sua voz por alguns instantes, depois clique num efeito para ouvir a distorção."> + <scroll_list.columns label="Distorcer voz" name="name"/> + <scroll_list.columns label="Vence em" name="expires"/> + </scroll_list> +</floater> diff --git a/indra/newview/skins/default/xui/pt/floater_water.xml b/indra/newview/skins/default/xui/pt/floater_water.xml index bad9aa0943..b4613e0890 100644 --- a/indra/newview/skins/default/xui/pt/floater_water.xml +++ b/indra/newview/skins/default/xui/pt/floater_water.xml @@ -3,29 +3,29 @@ <text name="KeyFramePresetsText" width="154"> Pré-configurações da Ãgua: </text> - <combo_box left_delta="160" name="WaterPresetsCombo" width="150" /> + <combo_box left_delta="160" name="WaterPresetsCombo" width="150"/> <button label="Novo" label_selected="Novo" name="WaterNewPreset"/> <button label="Salvar" label_selected="Salvar" name="WaterSavePreset"/> <button label="Deletar" label_selected="Deletar" name="WaterDeletePreset"/> <tab_container name="Water Tabs"> - <panel label="Configurações" name="Settings"> + <panel label="DEFINIÇÕES" name="Settings"> <text name="BHText"> Cor da névoa da Ãgua </text> <button label="?" name="WaterFogColorHelp"/> - <color_swatch label="" name="WaterFogColor" tool_tip="Clique para abrir o Capturador de Cor"/> + <color_swatch label="" name="WaterFogColor" tool_tip="Selecionar a cor"/> <text name="WaterFogDensText"> Expoente da Densidade de névoa </text> - <button label="?" name="WaterFogDensityHelp" left="209"/> + <button label="?" left="209" name="WaterFogDensityHelp"/> <text name="WaterUnderWaterFogModText"> Modificador da névoa Subaquática </text> - <button label="?" name="WaterUnderWaterFogModHelp" left="209"/> + <button label="?" left="209" name="WaterUnderWaterFogModHelp"/> <text name="BDensText"> Escala da Marola de Reflexão </text> - <button label="?" name="WaterNormalScaleHelp" left="415"/> + <button label="?" left="415" name="WaterNormalScaleHelp"/> <text name="BHText2"> 1 </text> @@ -38,29 +38,29 @@ <text name="HDText"> Escala de Fresnel </text> - <button label="?" name="WaterFresnelScaleHelp" left="415"/> + <button label="?" left="415" name="WaterFresnelScaleHelp"/> <text name="FresnelOffsetText"> Deslocamento de Fresnel </text> - <button label="?" name="WaterFresnelOffsetHelp" left="415"/> + <button label="?" left="415" name="WaterFresnelOffsetHelp"/> <text name="DensMultText"> Refratar a Escala para Cima </text> - <button label="?" name="WaterScaleAboveHelp" left="640"/> + <button label="?" left="640" name="WaterScaleAboveHelp"/> <text name="WaterScaleBelowText"> Refratar a Escala para Baixo </text> - <button label="?" name="WaterScaleBelowHelp" left="640"/> + <button label="?" left="640" name="WaterScaleBelowHelp"/> <text name="MaxAltText"> Multiplicador de Difusão </text> - <button label="?" name="WaterBlurMultiplierHelp" left="640"/> + <button label="?" left="640" name="WaterBlurMultiplierHelp"/> </panel> - <panel label="Imagem" name="Waves"> + <panel label="IMAGEM" name="Waves"> <text name="BHText"> Direção da Onda Maior </text> - <button label="?" name="WaterWave1Help" left="170"/> + <button label="?" left="170" name="WaterWave1Help"/> <text name="WaterWave1DirXText"> X </text> @@ -70,7 +70,7 @@ <text name="BHText2"> Direção da Onda Pequena </text> - <button label="?" name="WaterWave2Help" left="170"/> + <button label="?" left="170" name="WaterWave2Help"/> <text name="WaterWave2DirXText"> X </text> diff --git a/indra/newview/skins/default/xui/pt/floater_wearable_save_as.xml b/indra/newview/skins/default/xui/pt/floater_wearable_save_as.xml index 2b2c669a18..282bf0e268 100644 --- a/indra/newview/skins/default/xui/pt/floater_wearable_save_as.xml +++ b/indra/newview/skins/default/xui/pt/floater_wearable_save_as.xml @@ -3,7 +3,7 @@ <button label="Salvar" label_selected="Salvar" name="Save"/> <button label="Cancelar" label_selected="Cancelar" name="Cancel"/> <text name="Save item as:"> - Salvar item como: + Salvar item no inventário como: </text> <line_editor name="name ed"> Novo [DESC] diff --git a/indra/newview/skins/default/xui/pt/floater_whitelist_entry.xml b/indra/newview/skins/default/xui/pt/floater_whitelist_entry.xml new file mode 100644 index 0000000000..865d939d24 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/floater_whitelist_entry.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="whitelist_entry" title="LISTA BRANCA"> + <text name="media_label"> + Digite um URL ou série de URLs para a lista de domÃnios permitidos + </text> + <line_editor name="whitelist_entry" tool_tip="Digite um URL ou série de URLs para a lista branca"/> + <button label="OK" name="ok_btn"/> + <button label="Cancelar" name="cancel_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/pt/floater_windlight_options.xml b/indra/newview/skins/default/xui/pt/floater_windlight_options.xml index 951e37a1a6..22632a4ef8 100644 --- a/indra/newview/skins/default/xui/pt/floater_windlight_options.xml +++ b/indra/newview/skins/default/xui/pt/floater_windlight_options.xml @@ -5,11 +5,11 @@ </text> <combo_box left_delta="130" name="WLPresetsCombo"/> <button label="Novo" label_selected="Novo" name="WLNewPreset"/> - <button label="Salvar" label_selected="Salvar" name="WLSavePreset" left_delta="72"/> - <button label="Deletar" label_selected="Deletar" name="WLDeletePreset" left_delta="72"/> - <button label="Editor de Ciclos do Dia" label_selected="Editor de Ciclos do Dia" name="WLDayCycleMenuButton" width="150" left_delta="84" /> + <button label="Salvar" label_selected="Salvar" left_delta="72" name="WLSavePreset"/> + <button label="Deletar" label_selected="Deletar" left_delta="72" name="WLDeletePreset"/> + <button label="Editor de Ciclos do Dia" label_selected="Editor de Ciclos do Dia" left_delta="84" name="WLDayCycleMenuButton" width="150"/> <tab_container name="WindLight Tabs"> - <panel label="Atmosfera" name="Atmosphere"> + <panel label="ATMOSFERA" name="Atmosphere"> <text name="BHText"> Horizonte Azul </text> @@ -53,17 +53,17 @@ <text name="DensMultText"> Multiplicador de Densidade </text> - <button label="?" name="WLDensityMultHelp" left="635"/> + <button label="?" left="635" name="WLDensityMultHelp"/> <text name="WLDistanceMultText"> Multiplicador de Distância </text> - <button label="?" name="WLDistanceMultHelp" left="635"/> + <button label="?" left="635" name="WLDistanceMultHelp"/> <text name="MaxAltText"> Altitude Máxima </text> - <button label="?" name="WLMaxAltitudeHelp" left="635"/> + <button label="?" left="635" name="WLMaxAltitudeHelp"/> </panel> - <panel label="Iluminação" name="Lighting"> + <panel label="ILUMINAÇÃO" name="Lighting"> <text name="SLCText"> Cor do Sol/Lua </text> @@ -119,7 +119,7 @@ </text> <button label="?" name="WLStarBrightnessHelp"/> </panel> - <panel label="Nuvens" name="Clouds"> + <panel label="NUVENS" name="Clouds"> <text name="WLCloudColorText"> Cor da Nuvem </text> @@ -157,10 +157,10 @@ Escala da Nuvem </text> <button label="?" name="WLCloudScaleHelp"/> - <text name="WLCloudDetailText" font="SansSerifSmall"> + <text font="SansSerifSmall" name="WLCloudDetailText"> Detalhe da Nuvem (XY/Densidade) </text> - <button label="?" name="WLCloudDetailHelp" left="421"/> + <button label="?" left="421" name="WLCloudDetailHelp"/> <text name="BHText8"> X </text> @@ -181,7 +181,7 @@ <button label="?" name="WLCloudScrollYHelp"/> <check_box label="Travar" name="WLCloudLockY"/> <check_box label="Desenhar Nuvens Clássicas" name="DrawClassicClouds"/> - <button label="?" name="WLClassicCloudsHelp" left="645"/> + <button label="?" left="645" name="WLClassicCloudsHelp"/> </panel> </tab_container> </floater> diff --git a/indra/newview/skins/default/xui/pt/floater_window_size.xml b/indra/newview/skins/default/xui/pt/floater_window_size.xml new file mode 100644 index 0000000000..6a8ccbd002 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/floater_window_size.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="window_size" title="TAMANHO DA JANELA"> + <string name="resolution_format"> + [RES_X] x [RES_Y] + </string> + <text name="windowsize_text"> + Definir tamanho da janela: + </text> + <combo_box name="window_size_combo" tool_tip="largura x altura"> + <combo_box.item label="1000 x 700 (padrão)" name="item0"/> + <combo_box.item label="1024 x 768" name="item1"/> + <combo_box.item label="1280 x 720 (720p)" name="item2"/> + <combo_box.item label="1920 x 1080 (1080p)" name="item3"/> + </combo_box> + <button label="Definir" name="set_btn"/> + <button label="Cancelar" name="cancel_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/pt/floater_world_map.xml b/indra/newview/skins/default/xui/pt/floater_world_map.xml index 034602d6ea..878d0b1973 100644 --- a/indra/newview/skins/default/xui/pt/floater_world_map.xml +++ b/indra/newview/skins/default/xui/pt/floater_world_map.xml @@ -1,53 +1,78 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="worldmap" title="MAPA MUNDI"> - <tab_container name="maptab"> - <panel label="Objetos" name="objects_mapview"/> - <panel label="Terreno" name="terrain_mapview"/> - </tab_container> - <text name="you_label"> - Você - </text> - <text name="home_label"> - Casa - </text> - <text name="auction_label"> - Leilão - </text> - <text name="land_for_sale_label"> - Terra à venda - </text> - <button label="Ir para Casa" label_selected="Ir para casa" name="Go Home" tool_tip="Teletransportar para sua Casa"/> - <check_box label="Residente" name="people_chk"/> - <check_box label="Infohub" name="infohub_chk"/> - <check_box label="Telehub" name="telehubchk"/> - <check_box label="Terra à Venda" name="land_for_sale_chk"/> - <text name="events_label"> - Eventos: - </text> - <check_box label="PG" name="event_chk"/> - <check_box label="Mature" name="event_mature_chk"/> - <check_box label="Adult" name="event_adult_chk"/> - <combo_box label="Amigos Conectados" name="friend combo" tool_tip="Amigos para mostrar no Mapa"> - <combo_box.item name="item1" label="Amigos Conectados" /> - </combo_box> - <combo_box label="Landmarks" name="landmark combo" tool_tip="Landmark para mostrar no Mapa"> - <combo_box.item name="item1" label="Landmarks" /> - </combo_box> - <line_editor label="Procurar por nome de região" name="location" tool_tip="Digite o nome de uma Região"/> - <button label="Procurar" name="DoSearch" tool_tip="Procurar por região"/> - <text name="search_label"> - Resultados da Procura: - </text> - <text name="location_label"> - Localização: - </text> - <spinner name="spin x" tool_tip="Coordenada X da posição mostrada no mapa"/> - <spinner name="spin y" tool_tip="Coordenada Y da posição mostrada no mapa"/> - <spinner name="spin z" tool_tip="Coordenada Z da posição mostrada no Mapa"/> - <button font="SansSerifSmall" label="Teletransporte" label_selected="Teletransporte" name="Teleport" tool_tip="Teletransportar para a posição selecionada"/> - <button font="SansSerifSmall" left_delta="91" width="135" label="Mostrar destino" label_selected="Mostrar Destino" name="Show Destination" tool_tip="Centralizar mapa na posição selecionada"/> - <button font="SansSerifSmall" label="Limpar" label_selected="Limpar" name="Clear" tool_tip="Parar de percorrer"/> - <button font="SansSerifSmall" left_delta="91" width="135" label="Mostra minha localização" label_selected="Mostra minha localização" name="Show My Location" tool_tip="Centraliza o mapa na posição do seu Avatar"/> - <button font="SansSerifSmall" label="Copiar SLurl para área de transferência" name="copy_slurl" tool_tip="Copia a posição atual como SLurl para ser usada na Web"/> - <slider label="Zoom" name="zoom slider"/> +<floater name="worldmap" title="MAPA-MÚNDI"> + <panel name="layout_panel_1"> + <text name="events_label"> + Legenda + </text> + </panel> + <panel name="layout_panel_2"> + <button font="SansSerifSmall" label="Mostra minha localização" label_selected="Mostra minha localização" left_delta="91" name="Show My Location" tool_tip="Centrar o mapa na localização do meu avatar" /> + <text name="me_label"> + Eu + </text> + <check_box label="Residente" name="people_chk"/> + <text name="person_label"> + Pessoa + </text> + <check_box label="Infohub" name="infohub_chk"/> + <text name="infohub_label"> + Infohub + </text> + <check_box label="Terra à Venda" name="land_for_sale_chk"/> + <text name="land_sale_label"> + Venda de terreno + </text> + <text name="by_owner_label"> + o proprietário + </text> + <text name="auction_label"> + leilão de terrenos + </text> + <button label="Voltar ao meu inÃcio" label_selected="Voltar ao meu inÃcio" name="Go Home" tool_tip="Teletransportar para meu inÃcio"/> + <text name="Home_label"> + InÃcio + </text> + <text name="events_label"> + Eventos: + </text> + <check_box label="PG" name="event_chk"/> + <text name="pg_label"> + Público geral + </text> + <check_box label="Mature" name="event_mature_chk"/> + <text name="mature_label"> + Moderado + </text> + <check_box label="Adult" name="event_adult_chk"/> + <text name="adult_label"> + Adulto + </text> + </panel> + <panel name="layout_panel_3"> + <text name="find_on_map_label"> + Localizar no mapa + </text> + </panel> + <panel name="layout_panel_4"> + <combo_box label="Amigos online" name="friend combo" tool_tip="Mostrar amigos no mapa"> + <combo_box.item label="Amigos conectados" name="item1"/> + </combo_box> + <combo_box label="Meus marcos" name="landmark combo" tool_tip="Mostrar marco no mapa"> + <combo_box.item label="Meus marcos" name="item1"/> + </combo_box> + <search_editor label="Regiões por nome" name="location" tool_tip="Digite o nome da região"/> + <button label="Buscar" name="DoSearch" tool_tip="Buscar região"/> + <button name="Clear" tool_tip="Limpar linhas e redefinir mapa"/> + <button font="SansSerifSmall" label="Teletransportar" label_selected="Teletransporte" name="Teleport" tool_tip="Teletransportar para o lugar selecionado"/> + <button font="SansSerifSmall" label="Copiar SLurl" name="copy_slurl" tool_tip="Copia a localização atual como um SLurl para usar na web."/> + <button font="SansSerifSmall" label="Mostrar seleção" label_selected="Mostrar Destino" left_delta="91" name="Show Destination" tool_tip="Centrar mapa no local selecionado" width="135"/> + </panel> + <panel name="layout_panel_5"> + <text name="zoom_label"> + Zoom + </text> + </panel> + <panel name="layout_panel_6"> + <slider label="Zoom" name="zoom slider"/> + </panel> </floater> diff --git a/indra/newview/skins/default/xui/pt/inspect_avatar.xml b/indra/newview/skins/default/xui/pt/inspect_avatar.xml new file mode 100644 index 0000000000..a74ea15be0 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/inspect_avatar.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- + Not can_close / no title to avoid window chrome + Single instance - only have one at a time, recycle it each spawn +--> +<floater name="inspect_avatar"> + <string name="Subtitle"> + [IDADE] + </string> + <string name="Details"> + [PERFIL_SL] + </string> + <slider name="volume_slider" tool_tip="Volume de Voz" value="0.5"/> + <button label="Adicionar amigo" name="add_friend_btn"/> + <button label="MI" name="im_btn"/> + <button label="Perfil" name="view_profile_btn"/> + <panel name="moderator_panel"> + <button label="Disabilitar Voz" name="disable_voice"/> + <button label="Habilitar Voz" name="enable_voice"/> + </panel> +</floater> diff --git a/indra/newview/skins/default/xui/pt/inspect_group.xml b/indra/newview/skins/default/xui/pt/inspect_group.xml new file mode 100644 index 0000000000..889d35f269 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/inspect_group.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- + Not can_close / no title to avoid window chrome + Single instance - only have one at a time, recycle it each spawn +--> +<floater name="inspect_group"> + <string name="PrivateGroup"> + Grupo privado + </string> + <string name="FreeToJoin"> + Livre para ingressar + </string> + <string name="CostToJoin"> + [AMOUNT]L$ para ingressar + </string> + <string name="YouAreMember"> + Você é um membro + </string> + <button label="Ingressar" name="join_btn"/> + <button label="Abandonar" name="leave_btn"/> + <button label="Visualizar Perfil" name="view_profile_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/pt/inspect_object.xml b/indra/newview/skins/default/xui/pt/inspect_object.xml new file mode 100644 index 0000000000..b72de7038d --- /dev/null +++ b/indra/newview/skins/default/xui/pt/inspect_object.xml @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- + Not can_close / no title to avoid window chrome + Single instance - only have one at a time, recycle it each spawn +--> +<floater name="inspect_object"> + <string name="Creator"> + Autor: [CREATOR] + </string> + <string name="CreatorAndOwner"> + Autor [CREATOR] +Proprietário [OWNER] + </string> + <string name="Price"> + L$[AMOUNT] + </string> + <string name="PriceFree"> + Grátis! + </string> + <string name="Touch"> + Tocar + </string> + <string name="Sit"> + Sentar + </string> + <text name="object_name" value="Test Object Name That Is actually two lines and Really Long"/> + <text name="price_text"> + L$30.000 + </text> + <text name="object_description"> + This is a really long description for an object being as how it is at least 80 characters in length and so but maybe more like 120 at this point. Who knows, really? + </text> + <button label="Comprar" name="buy_btn"/> + <button label="Pagar" name="pay_btn"/> + <button label="Pegar uma cópia" name="take_free_copy_btn"/> + <button label="Tocar" name="touch_btn"/> + <button label="Sentar" name="sit_btn"/> + <button label="Abrir" name="open_btn"/> + <icon name="secure_browsing" tool_tip="Navegação segura"/> + <button label="Mais" name="more_info_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/pt/inspect_remote_object.xml b/indra/newview/skins/default/xui/pt/inspect_remote_object.xml new file mode 100644 index 0000000000..789194bf2e --- /dev/null +++ b/indra/newview/skins/default/xui/pt/inspect_remote_object.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- + Not can_close / no title to avoid window chrome + Single instance - only have one at a time, recycle it each spawn +--> +<floater name="inspect_remote_object"> + <text name="object_owner_label"> + Proprietário: + </text> + <button label="Mapa" name="map_btn"/> + <button label="Bloquear" name="block_btn"/> + <button label="Fechar" name="close_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/pt/language_settings.xml b/indra/newview/skins/default/xui/pt/language_settings.xml index 71418d446a..f25e77574d 100644 --- a/indra/newview/skins/default/xui/pt/language_settings.xml +++ b/indra/newview/skins/default/xui/pt/language_settings.xml @@ -3,9 +3,9 @@ <strings> <!-- Locale Information --> - <string name="MicrosoftLocale">english</string> - <string name="DarwinLocale">C</string> - <string name="LinuxLocale">C</string> + <string name="MicrosoftLocale">portuguese</string> + <string name="DarwinLocale">pt_PT.UTF-8</string> + <string name="LinuxLocale">pt_PT.UTF-8</string> <!-- datetimeToCodes["wkday"] = "%a"; // Thu diff --git a/indra/newview/skins/default/xui/pt/menu_attachment_other.xml b/indra/newview/skins/default/xui/pt/menu_attachment_other.xml new file mode 100644 index 0000000000..cfd69158bc --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_attachment_other.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- *NOTE: See also menu_avatar_other.xml --> +<context_menu name="Avatar Pie"> + <menu_item_call label="Ver perfil" name="Profile..."/> + <menu_item_call label="Adicionar amigo..." name="Add Friend"/> + <menu_item_call label="MI" name="Send IM..."/> + <menu_item_call label="Ligar" name="Call"/> + <menu_item_call label="Convidar para entrar no grupo" name="Invite..."/> + <menu_item_call label="Bloquear" name="Avatar Mute"/> + <menu_item_call label="Denunciar" name="abuse"/> + <menu_item_call label="Congelar" name="Freeze..."/> + <menu_item_call label="Ejetar" name="Eject..."/> + <menu_item_call label="Depurar texturas" name="Debug..."/> + <menu_item_call label="Mais zoom" name="Zoom In"/> + <menu_item_call label="Pagar" name="Pay..."/> + <menu_item_call label="Perfil do objeto" name="Object Inspect"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_attachment_self.xml b/indra/newview/skins/default/xui/pt/menu_attachment_self.xml new file mode 100644 index 0000000000..5cb1b211cf --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_attachment_self.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Attachment Pie"> + <menu_item_call label="Tocar" name="Attachment Object Touch"/> + <menu_item_call label="Editar" name="Edit..."/> + <menu_item_call label="Tirar" name="Detach"/> + <menu_item_call label="Largar" name="Drop"/> + <menu_item_call label="Ficar de pé" name="Stand Up"/> + <menu_item_call label="Trocar de look" name="Change Outfit"/> + <menu_item_call label="Meus amigos" name="Friends..."/> + <menu_item_call label="Meus grupos" name="Groups..."/> + <menu_item_call label="Meu perfil" name="Profile..."/> + <menu_item_call label="Depurar texturas" name="Debug..."/> +</context_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_avatar_icon.xml b/indra/newview/skins/default/xui/pt/menu_avatar_icon.xml new file mode 100644 index 0000000000..beba969b7e --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_avatar_icon.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Avatar Icon Menu"> + <menu_item_call label="Ver perfil" name="Show Profile"/> + <menu_item_call label="Enviar MI..." name="Send IM"/> + <menu_item_call label="Adicionar amigo..." name="Add Friend"/> + <menu_item_call label="Remover amigo..." name="Remove Friend"/> +</menu> diff --git a/indra/newview/skins/default/xui/pt/menu_avatar_other.xml b/indra/newview/skins/default/xui/pt/menu_avatar_other.xml new file mode 100644 index 0000000000..a4a26144c7 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_avatar_other.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- *NOTE: See also menu_attachment_other.xml --> +<context_menu name="Avatar Pie"> + <menu_item_call label="Ver perfil" name="Profile..."/> + <menu_item_call label="Adicionar amigo..." name="Add Friend"/> + <menu_item_call label="MI" name="Send IM..."/> + <menu_item_call label="Ligar" name="Call"/> + <menu_item_call label="Convidar para entrar no grupo" name="Invite..."/> + <menu_item_call label="Bloquear" name="Avatar Mute"/> + <menu_item_call label="Denunciar" name="abuse"/> + <menu_item_call label="Congelar" name="Freeze..."/> + <menu_item_call label="Ejetar" name="Eject..."/> + <menu_item_call label="Depurar texturas" name="Debug..."/> + <menu_item_call label="Mais zoom" name="Zoom In"/> + <menu_item_call label="Pagar" name="Pay..."/> +</context_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_avatar_self.xml b/indra/newview/skins/default/xui/pt/menu_avatar_self.xml new file mode 100644 index 0000000000..62055303b5 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_avatar_self.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Self Pie"> + <menu_item_call label="Ficar de pé" name="Stand Up"/> + <context_menu label="Tirar â–¶" name="Take Off >"> + <context_menu label="Roupa â–¶" name="Clothes >"> + <menu_item_call label="Camisa" name="Shirt"/> + <menu_item_call label="Calças" name="Pants"/> + <menu_item_call label="Saia" name="Skirt"/> + <menu_item_call label="Sapatos" name="Shoes"/> + <menu_item_call label="Meias" name="Socks"/> + <menu_item_call label="Jaqueta" name="Jacket"/> + <menu_item_call label="Luvas" name="Gloves"/> + <menu_item_call label="Camiseta" name="Self Undershirt"/> + <menu_item_call label="Roupa de baixo" name="Self Underpants"/> + <menu_item_call label="Tatuagem" name="Self Tattoo"/> + <menu_item_call label="Alpha" name="Self Alpha"/> + <menu_item_call label="Todas as roupas" name="All Clothes"/> + </context_menu> + <context_menu label="HUD â–¶" name="Object Detach HUD"/> + <context_menu label="Tirar â–¶" name="Object Detach"/> + <menu_item_call label="Tirar tudo" name="Detach All"/> + </context_menu> + <menu_item_call label="Trocar de look" name="Chenge Outfit"/> + <menu_item_call label="Editar meu look" name="Edit Outfit"/> + <menu_item_call label="Editar meu corpo" name="Edit My Shape"/> + <menu_item_call label="Meus amigos" name="Friends..."/> + <menu_item_call label="Meus grupos" name="Groups..."/> + <menu_item_call label="Meu perfil" name="Profile..."/> + <menu_item_call label="Depurar texturas" name="Debug..."/> +</context_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_bottomtray.xml b/indra/newview/skins/default/xui/pt/menu_bottomtray.xml new file mode 100644 index 0000000000..479d02512f --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_bottomtray.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="hide_camera_move_controls_menu"> + <menu_item_check label="Botão de gestos" name="ShowGestureButton"/> + <menu_item_check label="Botão de movimento" name="ShowMoveButton"/> + <menu_item_check label="Botão de ver" name="ShowCameraButton"/> + <menu_item_check label="Botão de fotos" name="ShowSnapshotButton"/> + <menu_item_check label="Botão da Barra lateral" name="ShowSidebarButton"/> + <menu_item_check label="Botão Construir" name="ShowBuildButton"/> + <menu_item_check label="Botão Buscar" name="ShowSearchButton"/> + <menu_item_check label="Botão Mapa" name="ShowWorldMapButton"/> + <menu_item_check label="Botão do Mini Mapa" name="ShowMiniMapButton"/> + <menu_item_call label="Cortar" name="NearbyChatBar_Cut"/> + <menu_item_call label="Copiar" name="NearbyChatBar_Copy"/> + <menu_item_call label="Colar" name="NearbyChatBar_Paste"/> + <menu_item_call label="Excluir" name="NearbyChatBar_Delete"/> + <menu_item_call label="Selecionar tudo" name="NearbyChatBar_Select_All"/> +</menu> diff --git a/indra/newview/skins/default/xui/pt/menu_cof_attachment.xml b/indra/newview/skins/default/xui/pt/menu_cof_attachment.xml new file mode 100644 index 0000000000..527e3af3c9 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_cof_attachment.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="COF Attachment"> + <menu_item_call label="Separar" name="detach"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_cof_body_part.xml b/indra/newview/skins/default/xui/pt/menu_cof_body_part.xml new file mode 100644 index 0000000000..704fd226eb --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_cof_body_part.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="COF Body"> + <menu_item_call label="Trocar" name="replace"/> + <menu_item_call label="Editar" name="edit"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_cof_clothing.xml b/indra/newview/skins/default/xui/pt/menu_cof_clothing.xml new file mode 100644 index 0000000000..a58353f14e --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_cof_clothing.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="COF Clothing"> + <menu_item_call label="Tirar" name="take_off"/> + <menu_item_call label="Subir um nÃvel" name="move_up"/> + <menu_item_call label="Baixar um nÃvel" name="move_down"/> + <menu_item_call label="Editar" name="edit"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_cof_gear.xml b/indra/newview/skins/default/xui/pt/menu_cof_gear.xml new file mode 100644 index 0000000000..8716992a5e --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_cof_gear.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Gear COF"> + <menu label="Roupas novas" name="COF.Gear.New_Clothes"/> + <menu label="Nova parte do corpo" name="COF.Geear.New_Body_Parts"/> +</menu> diff --git a/indra/newview/skins/default/xui/pt/menu_edit.xml b/indra/newview/skins/default/xui/pt/menu_edit.xml new file mode 100644 index 0000000000..ff431c9a21 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_edit.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu label="Editar" name="Edit"> + <menu_item_call label="Desfazer" name="Undo"/> + <menu_item_call label="Repetir" name="Redo"/> + <menu_item_call label="Cortar" name="Cut"/> + <menu_item_call label="Copiar" name="Copy"/> + <menu_item_call label="Colar" name="Paste"/> + <menu_item_call label="Excluir" name="Delete"/> + <menu_item_call label="Replicar" name="Duplicate"/> + <menu_item_call label="Selecionar tudo" name="Select All"/> + <menu_item_call label="Desfazer seleção" name="Deselect"/> +</menu> diff --git a/indra/newview/skins/default/xui/pt/menu_favorites.xml b/indra/newview/skins/default/xui/pt/menu_favorites.xml new file mode 100644 index 0000000000..062820fbca --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_favorites.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Popup"> + <menu_item_call label="Teletransportar" name="Teleport To Landmark"/> + <menu_item_call label="Ver/Editar marco" name="Landmark Open"/> + <menu_item_call label="Copiar SLurl" name="Copy slurl"/> + <menu_item_call label="Mostrar no mapa" name="Show On Map"/> + <menu_item_call label="Copiar" name="Landmark Copy"/> + <menu_item_call label="Colar" name="Landmark Paste"/> + <menu_item_call label="Excluir" name="Delete"/> +</menu> diff --git a/indra/newview/skins/default/xui/pt/menu_gesture_gear.xml b/indra/newview/skins/default/xui/pt/menu_gesture_gear.xml new file mode 100644 index 0000000000..70d8ae7a8e --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_gesture_gear.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_gesture_gear"> + <menu_item_call label="Adicionar/remover de favoritos" name="activate"/> + <menu_item_call label="Copiar" name="copy_gesture"/> + <menu_item_call label="Colar" name="paste"/> + <menu_item_call label="Copiar UUID" name="copy_uuid"/> + <menu_item_call label="Salvar para look atual" name="save_to_outfit"/> + <menu_item_call label="Editar" name="edit_gesture"/> + <menu_item_call label="Verificar" name="inspect"/> +</menu> diff --git a/indra/newview/skins/default/xui/pt/menu_group_plus.xml b/indra/newview/skins/default/xui/pt/menu_group_plus.xml new file mode 100644 index 0000000000..1083845d68 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_group_plus.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_group_plus"> + <menu_item_call label="Entrar no grupo..." name="item_join"/> + <menu_item_call label="Novo grupo..." name="item_new"/> +</menu> diff --git a/indra/newview/skins/default/xui/pt/menu_hide_navbar.xml b/indra/newview/skins/default/xui/pt/menu_hide_navbar.xml new file mode 100644 index 0000000000..c2b063193e --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_hide_navbar.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="hide_navbar_menu"> + <menu_item_check label="Mostrar barra de navegação" name="ShowNavbarNavigationPanel"/> + <menu_item_check label="Mostrar barra de favoritos" name="ShowNavbarFavoritesPanel"/> + <menu_item_check label="Mostrar minibarra de localização" name="ShowMiniLocationPanel"/> +</menu> diff --git a/indra/newview/skins/default/xui/pt/menu_im_well_button.xml b/indra/newview/skins/default/xui/pt/menu_im_well_button.xml new file mode 100644 index 0000000000..2d37cefd6f --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_im_well_button.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="IM Well Button Context Menu"> + <menu_item_call label="Fechar tudo" name="Close All"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_imchiclet_adhoc.xml b/indra/newview/skins/default/xui/pt/menu_imchiclet_adhoc.xml new file mode 100644 index 0000000000..ead949ba13 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_imchiclet_adhoc.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="IMChiclet AdHoc Menu"> + <menu_item_call label="Encerrar esta sessão" name="End Session"/> +</menu> diff --git a/indra/newview/skins/default/xui/pt/menu_imchiclet_group.xml b/indra/newview/skins/default/xui/pt/menu_imchiclet_group.xml new file mode 100644 index 0000000000..dd177d1b8d --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_imchiclet_group.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="IMChiclet Group Menu"> + <menu_item_call label="Sobre o grupo" name="Show Profile"/> + <menu_item_call label="Mostrar sessão" name="Chat"/> + <menu_item_call label="Encerrar esta sessão" name="End Session"/> +</menu> diff --git a/indra/newview/skins/default/xui/pt/menu_imchiclet_p2p.xml b/indra/newview/skins/default/xui/pt/menu_imchiclet_p2p.xml new file mode 100644 index 0000000000..d821b3ded0 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_imchiclet_p2p.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="IMChiclet P2P Menu"> + <menu_item_call label="Ver perfil" name="Show Profile"/> + <menu_item_call label="Adicionar amigo..." name="Add Friend"/> + <menu_item_call label="Mostrar sessão" name="Send IM"/> + <menu_item_call label="Encerrar esta sessão" name="End Session"/> +</menu> diff --git a/indra/newview/skins/default/xui/pt/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/pt/menu_inspect_avatar_gear.xml new file mode 100644 index 0000000000..6a511e6ab7 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_inspect_avatar_gear.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<menu name="Gear Menu"> + <menu_item_call label="Ver perfil" name="view_profile"/> + <menu_item_call label="Adicionar amigo..." name="add_friend"/> + <menu_item_call label="MI" name="im"/> + <menu_item_call label="Ligar" name="call"/> + <menu_item_call label="Teletransportar" name="teleport"/> + <menu_item_call label="Convidar para entrar no grupo" name="invite_to_group"/> + <menu_item_call label="Bloquear" name="block"/> + <menu_item_call label="Desbloquear" name="unblock"/> + <menu_item_call label="Denunciar" name="report"/> + <menu_item_call label="Congelar" name="freeze"/> + <menu_item_call label="Ejetar" name="eject"/> + <menu_item_call label="Depurar texturas" name="debug"/> + <menu_item_call label="Localizar no mapa" name="find_on_map"/> + <menu_item_call label="Mais zoom" name="zoom_in"/> + <menu_item_call label="Pagar" name="pay"/> + <menu_item_call label="Compartilhar" name="share"/> +</menu> diff --git a/indra/newview/skins/default/xui/pt/menu_inspect_object_gear.xml b/indra/newview/skins/default/xui/pt/menu_inspect_object_gear.xml new file mode 100644 index 0000000000..b69d205533 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_inspect_object_gear.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8"?> +<menu name="Gear Menu"> + <menu_item_call label="Tocar" name="touch"/> + <menu_item_call label="Sentar" name="sit"/> + <menu_item_call label="Pagar" name="pay"/> + <menu_item_call label="Comprar" name="buy"/> + <menu_item_call label="Pegar" name="take"/> + <menu_item_call label="Pegar uma cópia" name="take_copy"/> + <menu_item_call label="Abrir" name="open"/> + <menu_item_call label="Editar" name="edit"/> + <menu_item_call label="Vestir" name="wear"/> + <menu_item_call label="Denunciar" name="report"/> + <menu_item_call label="Bloquear" name="block"/> + <menu_item_call label="Mais zoom" name="zoom_in"/> + <menu_item_call label="Tirar" name="remove"/> + <menu_item_call label="Mais informações" name="more_info"/> +</menu> diff --git a/indra/newview/skins/default/xui/pt/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/pt/menu_inspect_self_gear.xml new file mode 100644 index 0000000000..c3e0608954 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_inspect_self_gear.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8"?> +<menu name="Gear Menu"> + <menu_item_call label="Ficar de pé" name="stand_up"/> + <menu_item_call label="Trocar de look" name="change_outfit"/> + <menu_item_call label="Meu perfil" name="my_profile"/> + <menu_item_call label="Meus amigos" name="my_friends"/> + <menu_item_call label="Meus grupos" name="my_groups"/> + <menu_item_call label="Depurar texturas" name="Debug..."/> +</menu> diff --git a/indra/newview/skins/default/xui/pt/menu_inv_offer_chiclet.xml b/indra/newview/skins/default/xui/pt/menu_inv_offer_chiclet.xml new file mode 100644 index 0000000000..c404719c95 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_inv_offer_chiclet.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="InvOfferChiclet Menu"> + <menu_item_call label="Fechar" name="Close"/> +</menu> diff --git a/indra/newview/skins/default/xui/pt/menu_inventory.xml b/indra/newview/skins/default/xui/pt/menu_inventory.xml index 486588158e..aa195e5739 100644 --- a/indra/newview/skins/default/xui/pt/menu_inventory.xml +++ b/indra/newview/skins/default/xui/pt/menu_inventory.xml @@ -1,66 +1,87 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="Popup"> + <menu_item_call label="Compartilhar" name="Share"/> <menu_item_call label="Comprar" name="Task Buy"/> <menu_item_call label="Abrir" name="Task Open"/> <menu_item_call label="Executar" name="Task Play"/> <menu_item_call label="Propriedades" name="Task Properties"/> <menu_item_call label="Renomear" name="Task Rename"/> <menu_item_call label="Apagar" name="Task Remove"/> - <menu_item_call label="Limpar Lixeira" name="Empty Trash"/> - <menu_item_call label="Limpar Achados e perdidos" name="Empty Lost And Found"/> - <menu_item_call label="Nova Pasta" name="New Folder"/> - <menu_item_call label="Novo Script" name="New Script"/> - <menu_item_call label="Nova Nota" name="New Note"/> - <menu_item_call label="Novo Gesto" name="New Gesture"/> - <menu label="Nova Roupa" name="New Clothes"> - <menu_item_call label="Nova Camisa" name="New Shirt"/> - <menu_item_call label="Nova Calça" name="New Pants"/> - <menu_item_call label="Novos Calçados" name="New Shoes"/> - <menu_item_call label="Novas Meias" name="New Socks"/> - <menu_item_call label="Nova Jaqueta" name="New Jacket"/> - <menu_item_call label="Nova Saia" name="New Skirt"/> - <menu_item_call label="Novas Luvas" name="New Gloves"/> - <menu_item_call label="Nova Anágua" name="New Undershirt"/> + <menu_item_call label="Limpar lixeira" name="Empty Trash"/> + <menu_item_call label="Limpar Achados & perdidos" name="Empty Lost And Found"/> + <menu_item_call label="Nova pasta" name="New Folder"/> + <menu_item_call label="Novo script" name="New Script"/> + <menu_item_call label="Nova anotação" name="New Note"/> + <menu_item_call label="Novo gesto" name="New Gesture"/> + <menu label="Novas roupas" name="New Clothes"> + <menu_item_call label="Nova camisa" name="New Shirt"/> + <menu_item_call label="Nova calça" name="New Pants"/> + <menu_item_call label="Novos calçados" name="New Shoes"/> + <menu_item_call label="Novas meias" name="New Socks"/> + <menu_item_call label="Nova jaqueta" name="New Jacket"/> + <menu_item_call label="Nova saia" name="New Skirt"/> + <menu_item_call label="Novas luvas" name="New Gloves"/> + <menu_item_call label="Nova anágua" name="New Undershirt"/> <menu_item_call label="Nova roupa de baixo" name="New Underpants"/> + <menu_item_call label="Nova máscara alfa" name="New Alpha Mask"/> + <menu_item_call label="Nova tatuagem" name="New Tattoo"/> </menu> - <menu label="Parte do corpo" name="New Body Parts"> + <menu label="Nova parte do corpo" name="New Body Parts"> <menu_item_call label="Nova forma" name="New Shape"/> <menu_item_call label="Nova pele" name="New Skin"/> <menu_item_call label="Novo cabelo" name="New Hair"/> <menu_item_call label="Novos olhos" name="New Eyes"/> </menu> + <menu label="Alterar fonte" name="Change Type"> + <menu_item_call label="Padrão" name="Default"/> + <menu_item_call label="Luvas" name="Gloves"/> + <menu_item_call label="Jaqueta" name="Jacket"/> + <menu_item_call label="Calças" name="Pants"/> + <menu_item_call label="Silhueta" name="Shape"/> + <menu_item_call label="Sapatos" name="Shoes"/> + <menu_item_call label="Camisa" name="Shirt"/> + <menu_item_call label="Saia" name="Skirt"/> + <menu_item_call label="Roupa de baixo" name="Underpants"/> + <menu_item_call label="Camiseta" name="Undershirt"/> + </menu> <menu_item_call label="Teletransporte" name="Landmark Open"/> <menu_item_call label="Abrir" name="Animation Open"/> <menu_item_call label="Abrir" name="Sound Open"/> + <menu_item_call label="Substituir equipamento" name="Replace Outfit"/> + <menu_item_call label="Adicionar ao equipamento" name="Add To Outfit"/> + <menu_item_call label="Tirar do look atual" name="Remove From Outfit"/> + <menu_item_call label="Encontrar original" name="Find Original"/> <menu_item_call label="Remover item" name="Purge Item"/> <menu_item_call label="Restaurar item" name="Restore Item"/> <menu_item_call label="Abrir" name="Open"/> + <menu_item_call label="Abrir original" name="Open Original"/> <menu_item_call label="Propriedades" name="Properties"/> <menu_item_call label="Renomear" name="Rename"/> - <menu_item_call label="Copy Asset UUID" name="Copy Asset UUID"/> + <menu_item_call label="Copiar item UUID" name="Copy Asset UUID"/> <menu_item_call label="Copiar" name="Copy"/> <menu_item_call label="Colar" name="Paste"/> + <menu_item_call label="Colar como link" name="Paste As Link"/> + <menu_item_call label="Remover link" name="Remove Link"/> <menu_item_call label="Apagar" name="Delete"/> - <menu_item_call label="Remover os itens" name="Take Off Items"/> - <menu_item_call label="Adicionar ao equipamento" name="Add To Outfit"/> - <menu_item_call label="Substituir equipamento" name="Replace Outfit"/> - <menu_item_call label="Iniciar conversa em conferência" name="Conference Chat Folder"/> - <menu_item_call label="Executar" name="Sound Play"/> - <menu_item_call label="Sobre as Landmarks" name="Teleport To Landmark"/> - <menu_item_call label="Executar in World" name="Animation Play"/> - <menu_item_call label="Executar localmente" name="Animation Audition"/> - <menu_item_call label="Mandar Mensagem Instantânea" name="Send Instant Message"/> + <menu_item_call label="Excluir pasta do sistema" name="Delete System Folder"/> + <menu_item_call label="Pasta conversa em conferência" name="Conference Chat Folder"/> + <menu_item_call label="Executar som" name="Sound Play"/> + <menu_item_call label="Sobre o marco" name="About Landmark"/> + <menu_item_call label="Executar animação" name="Animation Play"/> + <menu_item_call label="Executar áudio" name="Animation Audition"/> + <menu_item_call label="Mandar MI" name="Send Instant Message"/> <menu_item_call label="Oferecer teletransporte..." name="Offer Teleport..."/> - <menu_item_call label="Iniciar conversa em conferência" name="Conference Chat"/> + <menu_item_call label="Bate-papo em conferência" name="Conference Chat"/> <menu_item_call label="Ativar" name="Activate"/> <menu_item_call label="Desativar" name="Deactivate"/> - <menu_item_call label="Retirar de você" name="Detach From Yourself"/> - <menu_item_call label="Recuperar Última Posição" name="Restore to Last Position"/> - <menu_item_call label="Vestir" name="Object Wear"/> + <menu_item_call label="Salvar como" name="Save As"/> + <menu_item_call label="Retirar de si mesmo" name="Detach From Yourself"/> + <menu_item_call label="Vestir objeto" name="Object Wear"/> <menu label="Anexar a" name="Attach To"/> <menu label="Anexar ao HUD" name="Attach To HUD"/> <menu_item_call label="Editar" name="Wearable Edit"/> <menu_item_call label="Vestir" name="Wearable Wear"/> - <menu_item_call label="Retirar" name="Take Off"/> + <menu_item_call label="Adicionar" name="Wearable Add"/> + <menu_item_call label="Tirar" name="Take Off"/> <menu_item_call label="--Sem opções--" name="--no options--"/> </menu> diff --git a/indra/newview/skins/default/xui/pt/menu_inventory_add.xml b/indra/newview/skins/default/xui/pt/menu_inventory_add.xml new file mode 100644 index 0000000000..fc40384891 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_inventory_add.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_inventory_add"> + <menu label="Upload" name="upload"> + <menu_item_call label="Imagem (L$[COST])..." name="Upload Image"/> + <menu_item_call label="Som (L$[COST])..." name="Upload Sound"/> + <menu_item_call label="Animação (L$[COST])..." name="Upload Animation"/> + <menu_item_call label="Volume (L$[COST] per file)..." name="Bulk Upload"/> + </menu> + <menu_item_call label="Nova pasta" name="New Folder"/> + <menu_item_call label="Novo script" name="New Script"/> + <menu_item_call label="Nova anotação" name="New Note"/> + <menu_item_call label="Novo gesto" name="New Gesture"/> + <menu label="Novas roupas" name="New Clothes"> + <menu_item_call label="Nova camisa" name="New Shirt"/> + <menu_item_call label="Novas calças" name="New Pants"/> + <menu_item_call label="Novos sapatos" name="New Shoes"/> + <menu_item_call label="Novas meias" name="New Socks"/> + <menu_item_call label="Nova blusa" name="New Jacket"/> + <menu_item_call label="Nova saia" name="New Skirt"/> + <menu_item_call label="Novas luvas" name="New Gloves"/> + <menu_item_call label="Nova camiseta" name="New Undershirt"/> + <menu_item_call label="Novas roupa de baixo" name="New Underpants"/> + <menu_item_call label="Novo alpha" name="New Alpha"/> + <menu_item_call label="Nova tatuagem" name="New Tattoo"/> + </menu> + <menu label="Nova parte do corpo" name="New Body Parts"> + <menu_item_call label="Nova forma" name="New Shape"/> + <menu_item_call label="Nova pele" name="New Skin"/> + <menu_item_call label="Novo cabelo" name="New Hair"/> + <menu_item_call label="Novos olhos" name="New Eyes"/> + </menu> +</menu> diff --git a/indra/newview/skins/default/xui/pt/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/pt/menu_inventory_gear_default.xml new file mode 100644 index 0000000000..8bae7afddc --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_inventory_gear_default.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_gear_default"> + <menu_item_call label="Nova janela de inventário" name="new_window"/> + <menu_item_call label="Ordenar por nome" name="sort_by_name"/> + <menu_item_call label="Ordenar por mais recente" name="sort_by_recent"/> + <menu_item_call label="Mostrar filtros" name="show_filters"/> + <menu_item_call label="Restabelecer filtros" name="reset_filters"/> + <menu_item_call label="Fechar todas as pastas" name="close_folders"/> + <menu_item_call label="Esvaziar lixeira" name="empty_trash"/> + <menu_item_call label="Esvaziar achados e perdidos" name="empty_lostnfound"/> + <menu_item_call label="Salvar textura como" name="Save Texture As"/> + <menu_item_call label="Encontrar original" name="Find Original"/> + <menu_item_call label="Encontrar todos os links" name="Find All Links"/> +</menu> diff --git a/indra/newview/skins/default/xui/pt/menu_land.xml b/indra/newview/skins/default/xui/pt/menu_land.xml new file mode 100644 index 0000000000..9182ce321a --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_land.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Land Pie"> + <menu_item_call label="Sobre terrenos" name="Place Information..."/> + <menu_item_call label="Sentar aqui" name="Sit Here"/> + <menu_item_call label="Comprar este terreno" name="Land Buy"/> + <menu_item_call label="Comprar passe" name="Land Buy Pass"/> + <menu_item_call label="Construir" name="Create"/> + <menu_item_call label="Editar a topografia" name="Edit Terrain"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_landmark.xml b/indra/newview/skins/default/xui/pt/menu_landmark.xml new file mode 100644 index 0000000000..6accfebee7 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_landmark.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="landmark_overflow_menu"> + <menu_item_call label="Copiar SLurl" name="copy"/> + <menu_item_call label="Excluir" name="delete"/> + <menu_item_call label="Criar destaque" name="pick"/> + <menu_item_call label="Adicionar à barra de favoritos" name="add_to_favbar"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_login.xml b/indra/newview/skins/default/xui/pt/menu_login.xml index 7ec324cb3f..a43ac271a9 100644 --- a/indra/newview/skins/default/xui/pt/menu_login.xml +++ b/indra/newview/skins/default/xui/pt/menu_login.xml @@ -1,13 +1,23 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu_bar name="Login Menu"> - <menu label="Arquivo" name="File"> - <menu_item_call label="Sair" name="Quit"/> - </menu> - <menu label="Editar" name="Edit"> - <menu_item_call label="Preferências..." name="Preferences..."/> + <menu label="Eu" name="File"> + <menu_item_call label="Preferências" name="Preferences..."/> + <menu_item_call label="Sair do [APP_NAME]" name="Quit"/> </menu> <menu label="Ajuda" name="Help"> <menu_item_call label="Ajuda do [SECOND_LIFE]" name="Second Life Help"/> - <menu_item_call label="Sobre o [APP_NAME]..." name="About Second Life..."/> + <menu_item_call label="Sobre [APP_NAME]" name="About Second Life"/> + </menu> + <menu_item_check label="Exibir menu de depuração" name="Show Debug Menu"/> + <menu label="Depurar" name="Debug"> + <menu_item_call label="Mostrar configurações" name="Debug Settings"/> + <menu_item_call label="Configurações da interface e cor" name="UI/Color Settings"/> + <menu label="Testes de UI" name="UI Tests"/> + <menu_item_call label="Definir tamanho da janela:" name="Set Window Size..."/> + <menu_item_call label="Mostrar TOS" name="TOS"/> + <menu_item_call label="Mostrar mensagem crÃtica" name="Critical"/> + <menu_item_call label="Teste de navegador web" name="Web Browser Test"/> + <menu_item_check label="Exibir seletor da grade" name="Show Grid Picker"/> + <menu_item_call label="Exibir painel de notificações" name="Show Notifications Console"/> </menu> </menu_bar> diff --git a/indra/newview/skins/default/xui/pt/menu_mini_map.xml b/indra/newview/skins/default/xui/pt/menu_mini_map.xml index 1293f4e17f..380bd8cf11 100644 --- a/indra/newview/skins/default/xui/pt/menu_mini_map.xml +++ b/indra/newview/skins/default/xui/pt/menu_mini_map.xml @@ -1,8 +1,9 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="popup"> +<menu name="Popup"> <menu_item_call label="Zoom Perto" name="Zoom Close"/> <menu_item_call label="Zoom Médio" name="Zoom Medium"/> <menu_item_call label="Zoom Longe" name="Zoom Far"/> + <menu_item_check label="Girar mapa" name="Rotate Map"/> <menu_item_call label="Parar Acompanhamento" name="Stop Tracking"/> - <menu_item_call label="Perfil..." name="Profile"/> + <menu_item_call label="Mapa-múndi" name="World Map"/> </menu> diff --git a/indra/newview/skins/default/xui/pt/menu_navbar.xml b/indra/newview/skins/default/xui/pt/menu_navbar.xml new file mode 100644 index 0000000000..57c1471de3 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_navbar.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Navbar Menu"> + <menu_item_check label="Mostrar coordenadas" name="Show Coordinates"/> + <menu_item_check label="Mostrar as propriedades do terreno" name="Show Parcel Properties"/> + <menu_item_call label="Marco" name="Landmark"/> + <menu_item_call label="Cortar" name="Cut"/> + <menu_item_call label="Copiar" name="Copy"/> + <menu_item_call label="Colar" name="Paste"/> + <menu_item_call label="Excluir" name="Delete"/> + <menu_item_call label="Selecionar tudo" name="Select All"/> +</menu> diff --git a/indra/newview/skins/default/xui/pt/menu_nearby_chat.xml b/indra/newview/skins/default/xui/pt/menu_nearby_chat.xml new file mode 100644 index 0000000000..f1ea83c837 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_nearby_chat.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="NearBy Chat Menu"> + <menu_item_call label="Mostrar quem está aqui..." name="nearby_people"/> + <menu_item_check label="Mostrar texto bloqueado" name="muted_text"/> + <menu_item_check label="Mostrar Ãcones de amigos" name="show_buddy_icons"/> + <menu_item_check label="Mostrar nomes" name="show_names"/> + <menu_item_check label="Mostrar Ãcones e nomes" name="show_icons_and_names"/> + <menu_item_call label="Tamanho da fonte" name="font_size"/> +</menu> diff --git a/indra/newview/skins/default/xui/pt/menu_notification_well_button.xml b/indra/newview/skins/default/xui/pt/menu_notification_well_button.xml new file mode 100644 index 0000000000..43ad4134ec --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_notification_well_button.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Notification Well Button Context Menu"> + <menu_item_call label="Fechar tudo" name="Close All"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_object.xml b/indra/newview/skins/default/xui/pt/menu_object.xml new file mode 100644 index 0000000000..a5969cacc3 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_object.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Object Pie"> + <menu_item_call label="Tocar" name="Object Touch"/> + <menu_item_call label="Editar" name="Edit..."/> + <menu_item_call label="Construir" name="Build"/> + <menu_item_call label="Abrir" name="Open"/> + <menu_item_call label="Sentar aqui" name="Object Sit"/> + <menu_item_call label="Ficar de pé" name="Object Stand Up"/> + <menu_item_call label="Perfil do objeto" name="Object Inspect"/> + <menu_item_call label="Mais zoom" name="Zoom In"/> + <context_menu label="Colocar no(a)" name="Put On"> + <menu_item_call label="Vestir" name="Wear"/> + <context_menu label="Anexar >" name="Object Attach"/> + <context_menu label="Anexar o HUD >" name="Object Attach HUD"/> + </context_menu> + <context_menu label="Tirar >" name="Remove"> + <menu_item_call label="Denunciar abuso" name="Report Abuse..."/> + <menu_item_call label="Bloquear" name="Object Mute"/> + <menu_item_call label="Devolver" name="Return..."/> + <menu_item_call label="Excluir" name="Delete"/> + </context_menu> + <menu_item_call label="Comprar" name="Pie Object Bye"/> + <menu_item_call label="Pegar" name="Pie Object Take"/> + <menu_item_call label="Pegar uma cópia" name="Take Copy"/> + <menu_item_call label="Pagar" name="Pay..."/> + <menu_item_call label="Comprar" name="Buy..."/> +</context_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_object_icon.xml b/indra/newview/skins/default/xui/pt/menu_object_icon.xml new file mode 100644 index 0000000000..7af760a6ee --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_object_icon.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Object Icon Menu"> + <menu_item_call label="Perfil do objeto..." name="Object Profile"/> + <menu_item_call label="Bloquear..." name="Block"/> +</menu> diff --git a/indra/newview/skins/default/xui/pt/menu_outfit_gear.xml b/indra/newview/skins/default/xui/pt/menu_outfit_gear.xml new file mode 100644 index 0000000000..eb1c026708 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_outfit_gear.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Gear Outfit"> + <menu_item_call label="Vestir - Substituir look atual" name="wear"/> + <menu_item_call label="Tirar - Tirar do look atual" name="take_off"/> + <menu label="Roupas novas" name="New Clothes"> + <menu_item_call label="Nova camisa" name="New Shirt"/> + <menu_item_call label="Novas calças" name="New Pants"/> + <menu_item_call label="Novos sapatos" name="New Shoes"/> + <menu_item_call label="Novas meias" name="New Socks"/> + <menu_item_call label="Nova blusa" name="New Jacket"/> + <menu_item_call label="Nova saia" name="New Skirt"/> + <menu_item_call label="Novas luvas" name="New Gloves"/> + <menu_item_call label="Nova camiseta" name="New Undershirt"/> + <menu_item_call label="Novas roupa de baixo" name="New Underpants"/> + <menu_item_call label="Novo alpha" name="New Alpha"/> + <menu_item_call label="Nova tatuagem" name="New Tattoo"/> + </menu> + <menu label="Nova parte do corpo" name="New Body Parts"> + <menu_item_call label="Nova silhueta" name="New Shape"/> + <menu_item_call label="Nova pele" name="New Skin"/> + <menu_item_call label="Novo cabelo" name="New Hair"/> + <menu_item_call label="Novos olhos" name="New Eyes"/> + </menu> + <menu_item_call label="Renomear look" name="rename"/> + <menu_item_call label="Excluir visual" name="delete_outfit"/> +</menu> diff --git a/indra/newview/skins/default/xui/pt/menu_outfit_tab.xml b/indra/newview/skins/default/xui/pt/menu_outfit_tab.xml new file mode 100644 index 0000000000..7c30e8ac55 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_outfit_tab.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Outfit"> + <menu_item_call label="Vestir - Substituir look atual" name="wear_replace"/> + <menu_item_call label="Vestir - Sem tirar look atual" name="wear_add"/> + <menu_item_call label="Tirar - Tirar do look atual" name="take_off"/> + <menu_item_call label="Editar look" name="edit"/> + <menu_item_call label="Renomear" name="rename"/> + <menu_item_call label="Excluir visual" name="delete"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_participant_list.xml b/indra/newview/skins/default/xui/pt/menu_participant_list.xml new file mode 100644 index 0000000000..01f1d4ef80 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_participant_list.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Participant List Context Menu"> + <menu_item_check label="Ordenar por nome" name="SortByName"/> + <menu_item_check label="Ordenar por conversas mais recentes" name="SortByRecentSpeakers"/> + <menu_item_call label="Ver perfil" name="View Profile"/> + <menu_item_call label="Adicionar amigo..." name="Add Friend"/> + <menu_item_call label="MI" name="IM"/> + <menu_item_call label="Ligar" name="Call"/> + <menu_item_call label="Compartilhar" name="Share"/> + <menu_item_call label="Pagar" name="Pay"/> + <menu_item_check label="Ver Ãcones de pessoas" name="View Icons"/> + <menu_item_check label="Bloquear voz" name="Block/Unblock"/> + <menu_item_check label="Bloquear texto" name="MuteText"/> + <context_menu label="Opções do moderador >" name="Moderator Options"> + <menu_item_check label="Pode bater papo por escrito" name="AllowTextChat"/> + <menu_item_call label="Silenciar este participante" name="ModerateVoiceMuteSelected"/> + <menu_item_call label="Desfazer silenciar deste participante" name="ModerateVoiceUnMuteSelected"/> + <menu_item_call label="Silenciar todos" name="ModerateVoiceMute"/> + <menu_item_call label="Desfazer silenciar para todos" name="ModerateVoiceUnmute"/> + </context_menu> +</context_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_people_friends_view_sort.xml b/indra/newview/skins/default/xui/pt/menu_people_friends_view_sort.xml new file mode 100644 index 0000000000..25a37488d7 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_people_friends_view_sort.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_group_plus"> + <menu_item_check label="Ordenar por nome" name="sort_name"/> + <menu_item_check label="Ordenar por status" name="sort_status"/> + <menu_item_check label="Ver Ãcones de pessoas" name="view_icons"/> + <menu_item_call label="Ver residentes e objetos bloqueados" name="show_blocked_list"/> +</menu> diff --git a/indra/newview/skins/default/xui/pt/menu_people_groups.xml b/indra/newview/skins/default/xui/pt/menu_people_groups.xml new file mode 100644 index 0000000000..9a924ad7b9 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_people_groups.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_group_plus"> + <menu_item_call label="Ver dados" name="View Info"/> + <menu_item_call label="Bate-papo" name="Chat"/> + <menu_item_call label="Ligar" name="Call"/> + <menu_item_call label="Ativar" name="Activate"/> + <menu_item_call label="Sair" name="Leave"/> +</menu> diff --git a/indra/newview/skins/default/xui/pt/menu_people_groups_view_sort.xml b/indra/newview/skins/default/xui/pt/menu_people_groups_view_sort.xml new file mode 100644 index 0000000000..86a9d2263f --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_people_groups_view_sort.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_group_plus"> + <menu_item_check label="Mostrar Ãcones de grupos" name="Display Group Icons"/> + <menu_item_call label="Sair do grupo selecionado" name="Leave Selected Group"/> +</menu> diff --git a/indra/newview/skins/default/xui/pt/menu_people_nearby.xml b/indra/newview/skins/default/xui/pt/menu_people_nearby.xml new file mode 100644 index 0000000000..7c720f262b --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_people_nearby.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Avatar Context Menu"> + <menu_item_call label="Ver perfil" name="View Profile"/> + <menu_item_call label="Adicionar amigo..." name="Add Friend"/> + <menu_item_call label="Remover amigo..." name="Remove Friend"/> + <menu_item_call label="MI" name="IM"/> + <menu_item_call label="Ligar" name="Call"/> + <menu_item_call label="Mapa" name="Map"/> + <menu_item_call label="Compartilhar" name="Share"/> + <menu_item_call label="Pagar" name="Pay"/> + <menu_item_check label="Bloquear/desbloquear" name="Block/Unblock"/> + <menu_item_call label="Teletransportar?" name="teleport"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/pt/menu_people_nearby_multiselect.xml new file mode 100644 index 0000000000..fc08b3accb --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_people_nearby_multiselect.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Multi-Selected People Context Menu"> + <menu_item_call label="Adicionar amigo..." name="Add Friends"/> + <menu_item_call label="Remover amigo..." name="Remove Friend"/> + <menu_item_call label="MI" name="IM"/> + <menu_item_call label="Ligar" name="Call"/> + <menu_item_call label="Compartilhar" name="Share"/> + <menu_item_call label="Pagar" name="Pay"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_people_nearby_view_sort.xml b/indra/newview/skins/default/xui/pt/menu_people_nearby_view_sort.xml new file mode 100644 index 0000000000..228ce46a31 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_people_nearby_view_sort.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_group_plus"> + <menu_item_check label="Ordenar por conversas mais recentes" name="sort_by_recent_speakers"/> + <menu_item_check label="Ordenar por nome" name="sort_name"/> + <menu_item_check label="Ordenar por distância" name="sort_distance"/> + <menu_item_check label="Ver Ãcones de pessoas" name="view_icons"/> + <menu_item_call label="Ver residentes e objetos bloqueados" name="show_blocked_list"/> +</menu> diff --git a/indra/newview/skins/default/xui/pt/menu_people_recent_view_sort.xml b/indra/newview/skins/default/xui/pt/menu_people_recent_view_sort.xml new file mode 100644 index 0000000000..f3b89e01cd --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_people_recent_view_sort.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_group_plus"> + <menu_item_check label="Ordenar por mais recente" name="sort_most"/> + <menu_item_check label="Ordenar por nome" name="sort_name"/> + <menu_item_check label="Ver Ãcones de pessoas" name="view_icons"/> + <menu_item_call label="Ver residentes e objetos bloqueados" name="show_blocked_list"/> +</menu> diff --git a/indra/newview/skins/default/xui/pt/menu_picks.xml b/indra/newview/skins/default/xui/pt/menu_picks.xml new file mode 100644 index 0000000000..8b9e10fc02 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_picks.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Picks"> + <menu_item_call label="Info" name="pick_info"/> + <menu_item_call label="Editar" name="pick_edit"/> + <menu_item_call label="Teletransportar" name="pick_teleport"/> + <menu_item_call label="Mapa" name="pick_map"/> + <menu_item_call label="Excluir" name="pick_delete"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_picks_plus.xml b/indra/newview/skins/default/xui/pt/menu_picks_plus.xml new file mode 100644 index 0000000000..95a7c05262 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_picks_plus.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="picks_plus_menu"> + <menu_item_call label="Adicionar" name="create_pick"/> + <menu_item_call label="Novo anúncio" name="create_classified"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_place.xml b/indra/newview/skins/default/xui/pt/menu_place.xml new file mode 100644 index 0000000000..282ea20a7a --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_place.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="place_overflow_menu"> + <menu_item_call label="Criar marco" name="landmark"/> + <menu_item_call label="Criar destaque" name="pick"/> + <menu_item_call label="Comprar passe" name="pass"/> + <menu_item_call label="Editar" name="edit"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_place_add_button.xml b/indra/newview/skins/default/xui/pt/menu_place_add_button.xml new file mode 100644 index 0000000000..d099d04f8d --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_place_add_button.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_folder_gear"> + <menu_item_call label="Adicionar pasta" name="add_folder"/> + <menu_item_call label="Adicionar marco" name="add_landmark"/> +</menu> diff --git a/indra/newview/skins/default/xui/pt/menu_places_gear_folder.xml b/indra/newview/skins/default/xui/pt/menu_places_gear_folder.xml new file mode 100644 index 0000000000..2059a9ed2d --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_places_gear_folder.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_folder_gear"> + <menu_item_call label="Adicionar marco" name="add_landmark"/> + <menu_item_call label="Adicionar pasta" name="add_folder"/> + <menu_item_call label="Cortar" name="cut"/> + <menu_item_call label="Copiar" name="copy_folder"/> + <menu_item_call label="Colar" name="paste"/> + <menu_item_call label="Renomear" name="rename"/> + <menu_item_call label="Excluir" name="delete"/> + <menu_item_call label="Expanda" name="expand"/> + <menu_item_call label="Recolher" name="collapse"/> + <menu_item_call label="Expandir todas as pastas" name="expand_all"/> + <menu_item_call label="Recolher todas as pastas" name="collapse_all"/> + <menu_item_check label="Ordenar por data" name="sort_by_date"/> +</menu> diff --git a/indra/newview/skins/default/xui/pt/menu_places_gear_landmark.xml b/indra/newview/skins/default/xui/pt/menu_places_gear_landmark.xml new file mode 100644 index 0000000000..52a9d13735 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_places_gear_landmark.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_ladmark_gear"> + <menu_item_call label="Teletransportar" name="teleport"/> + <menu_item_call label="Mais informações" name="more_info"/> + <menu_item_call label="Mostrar no mapa" name="show_on_map"/> + <menu_item_call label="Adicionar marco" name="add_landmark"/> + <menu_item_call label="Adicionar pasta" name="add_folder"/> + <menu_item_call label="Cortar" name="cut"/> + <menu_item_call label="Copiar marco" name="copy_landmark"/> + <menu_item_call label="Copiar SLurl" name="copy_slurl"/> + <menu_item_call label="Colar" name="paste"/> + <menu_item_call label="Renomear" name="rename"/> + <menu_item_call label="Excluir" name="delete"/> + <menu_item_call label="Expandir todas as pastas" name="expand_all"/> + <menu_item_call label="Recolher todas as pastas" name="collapse_all"/> + <menu_item_check label="Ordenar por data" name="sort_by_date"/> + <menu_item_call label="Criar destaque" name="create_pick"/> +</menu> diff --git a/indra/newview/skins/default/xui/pt/menu_profile_overflow.xml b/indra/newview/skins/default/xui/pt/menu_profile_overflow.xml new file mode 100644 index 0000000000..d41ecbd755 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_profile_overflow.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="profile_overflow_menu"> + <menu_item_call label="Mapa" name="show_on_map"/> + <menu_item_call label="Pagar" name="pay"/> + <menu_item_call label="Compartilhar" name="share"/> + <menu_item_call label="Bloquear" name="block"/> + <menu_item_call label="Desbloquear" name="unblock"/> + <menu_item_call label="Chutar" name="kick"/> + <menu_item_call label="Congelar" name="freeze"/> + <menu_item_call label="Descongelar" name="unfreeze"/> + <menu_item_call label="CSR" name="csr"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_save_outfit.xml b/indra/newview/skins/default/xui/pt/menu_save_outfit.xml new file mode 100644 index 0000000000..61c6b9202f --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_save_outfit.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="save_outfit_menu"> + <menu_item_call label="Salvar" name="save_outfit"/> + <menu_item_call label="Salvar como" name="save_as_new_outfit"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_script_chiclet.xml b/indra/newview/skins/default/xui/pt/menu_script_chiclet.xml new file mode 100644 index 0000000000..ccf3878e14 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_script_chiclet.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="ScriptChiclet Menu"> + <menu_item_call label="Fechar" name="Close"/> +</menu> diff --git a/indra/newview/skins/default/xui/pt/menu_slurl.xml b/indra/newview/skins/default/xui/pt/menu_slurl.xml index 67a4b51b61..6d4c84fc3c 100644 --- a/indra/newview/skins/default/xui/pt/menu_slurl.xml +++ b/indra/newview/skins/default/xui/pt/menu_slurl.xml @@ -2,5 +2,5 @@ <menu name="Popup"> <menu_item_call label="Sobre a URL" name="about_url"/> <menu_item_call label="Teletransporte para a URL" name="teleport_to_url"/> - <menu_item_call label="Mostrar no Mapa" name="show_on_map"/> + <menu_item_call label="Mapa" name="show_on_map"/> </menu> diff --git a/indra/newview/skins/default/xui/pt/menu_teleport_history_gear.xml b/indra/newview/skins/default/xui/pt/menu_teleport_history_gear.xml new file mode 100644 index 0000000000..f034509be8 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_teleport_history_gear.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Teleport History Gear Context Menu"> + <menu_item_call label="Expandir todas as pastas" name="Expand all folders"/> + <menu_item_call label="Recolher todas as pastas" name="Collapse all folders"/> + <menu_item_call label="Limpar histórico de teletransporte" name="Clear Teleport History"/> +</menu> diff --git a/indra/newview/skins/default/xui/pt/menu_teleport_history_item.xml b/indra/newview/skins/default/xui/pt/menu_teleport_history_item.xml new file mode 100644 index 0000000000..ec1e7a0950 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_teleport_history_item.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Teleport History Item Context Menu"> + <menu_item_call label="Teletransportar" name="Teleport"/> + <menu_item_call label="Mais informações" name="More Information"/> + <menu_item_call label="Copiar" name="CopyToClipboard"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_teleport_history_tab.xml b/indra/newview/skins/default/xui/pt/menu_teleport_history_tab.xml new file mode 100644 index 0000000000..6a633cf74c --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_teleport_history_tab.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Teleport History Item Context Menu"> + <menu_item_call label="Abrir" name="TabOpen"/> + <menu_item_call label="Fechar" name="TabClose"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_text_editor.xml b/indra/newview/skins/default/xui/pt/menu_text_editor.xml new file mode 100644 index 0000000000..31c284c6ed --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_text_editor.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Text editor context menu"> + <menu_item_call label="Cortar" name="Cut"/> + <menu_item_call label="Copiar" name="Copy"/> + <menu_item_call label="Colar" name="Paste"/> + <menu_item_call label="Excluir" name="Delete"/> + <menu_item_call label="Selecionar tudo" name="Select All"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_url_agent.xml b/indra/newview/skins/default/xui/pt/menu_url_agent.xml new file mode 100644 index 0000000000..ba5e055124 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_url_agent.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Mostrar perfil de residente" name="show_agent"/> + <menu_item_call label="Copiar nome para área de transferência" name="url_copy_label"/> + <menu_item_call label="Copiar SLurl para área de transferência" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_url_group.xml b/indra/newview/skins/default/xui/pt/menu_url_group.xml new file mode 100644 index 0000000000..5b67a69c9a --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_url_group.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Mostrar informações do grupo" name="show_group"/> + <menu_item_call label="Copiar SLurl para área de transferência" name="url_copy_label"/> + <menu_item_call label="Copiar SLurl para área de transferência" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_url_http.xml b/indra/newview/skins/default/xui/pt/menu_url_http.xml new file mode 100644 index 0000000000..e53a2572b8 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_url_http.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Abrir página da web" name="url_open"/> + <menu_item_call label="Abrir no navegador do SL" name="url_open_internal"/> + <menu_item_call label="Abrir no navegador externo" name="url_open_external"/> + <menu_item_call label="Copiar URL para área de transferência" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_url_inventory.xml b/indra/newview/skins/default/xui/pt/menu_url_inventory.xml new file mode 100644 index 0000000000..45c14355d0 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_url_inventory.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Mostrar item de inventário" name="show_item"/> + <menu_item_call label="Copiar nome para área de transferência" name="url_copy_label"/> + <menu_item_call label="Copiar SLurl para área de transferência" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_url_map.xml b/indra/newview/skins/default/xui/pt/menu_url_map.xml new file mode 100644 index 0000000000..ba114cccaa --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_url_map.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Mostrar no mapa" name="show_on_map"/> + <menu_item_call label="Teletransportar para este lugar" name="teleport_to_location"/> + <menu_item_call label="Copiar SLurl para área de transferência" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_url_objectim.xml b/indra/newview/skins/default/xui/pt/menu_url_objectim.xml new file mode 100644 index 0000000000..c197444181 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_url_objectim.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Mostrar informações sobre o objeto" name="show_object"/> + <menu_item_call label="Mostrar no mapa" name="show_on_map"/> + <menu_item_call label="Teletransportar para lugar do objeto" name="teleport_to_object"/> + <menu_item_call label="Copiar nome do objeto para área de transferência" name="url_copy_label"/> + <menu_item_call label="Copiar SLurl para área de transferência" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_url_parcel.xml b/indra/newview/skins/default/xui/pt/menu_url_parcel.xml new file mode 100644 index 0000000000..6cc668bfd3 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_url_parcel.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Mostrar informações sobre este lote" name="show_parcel"/> + <menu_item_call label="Mostrar no mapa" name="show_on_map"/> + <menu_item_call label="Copiar SLurl para área de transferência" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_url_slapp.xml b/indra/newview/skins/default/xui/pt/menu_url_slapp.xml new file mode 100644 index 0000000000..d0784149ac --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_url_slapp.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Executar este comando" name="run_slapp"/> + <menu_item_call label="Copiar SLurl para área de transferência" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_url_slurl.xml b/indra/newview/skins/default/xui/pt/menu_url_slurl.xml new file mode 100644 index 0000000000..7216ccf0b3 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_url_slurl.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Mostrar informações sobre este lugar" name="show_place"/> + <menu_item_call label="Mostrar no mapa" name="show_on_map"/> + <menu_item_call label="Teletransportar para este lugar" name="teleport_to_location"/> + <menu_item_call label="Copiar SLurl para área de transferência" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_url_teleport.xml b/indra/newview/skins/default/xui/pt/menu_url_teleport.xml new file mode 100644 index 0000000000..f007425646 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_url_teleport.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Teletransportar para este lugar" name="teleport"/> + <menu_item_call label="Mostrar no mapa" name="show_on_map"/> + <menu_item_call label="Copiar SLurl para área de transferência" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_viewer.xml b/indra/newview/skins/default/xui/pt/menu_viewer.xml index 2c887fa50c..5a5a418370 100644 --- a/indra/newview/skins/default/xui/pt/menu_viewer.xml +++ b/indra/newview/skins/default/xui/pt/menu_viewer.xml @@ -1,217 +1,320 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu_bar name="Main Menu"> - <menu name="Me"> + <menu label="Eu" name="Me"> <menu_item_call label="Preferências" name="Preferences"/> - <menu_item_call name="Manage My Account"> - <menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=pt" /> + <menu_item_call label="Meu painel" name="Manage My Account"> + <menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=pt"/> </menu_item_call> + <menu_item_call label="Comprar L$" name="Buy and Sell L$"/> + <menu_item_call label="Meu perfil" name="Profile"/> + <menu_item_call label="Trocar de look" name="ChangeOutfit"/> + <menu_item_check label="Meu inventário" name="Inventory"/> + <menu_item_check label="Meu inventário" name="ShowSidetrayInventory"/> + <menu_item_check label="Meus gestos" name="Gestures"/> + <menu_item_check label="Minha voz" name="ShowVoice"/> + <menu label="Meu status" name="Status"> + <menu_item_call label="Ausente" name="Set Away"/> + <menu_item_call label="Ocupado" name="Set Busy"/> + </menu> + <menu_item_call label="Request Admin Status" name="Request Admin Options"/> + <menu_item_call label="Sair do modo admin" name="Leave Admin Options"/> + <menu_item_call label="Sair do [APP_NAME]" name="Quit"/> </menu> - <menu label="Arquivo" name="File"> - <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/> - <menu label="Upload" name="upload"> - <menu_item_call label="Imagem (L$[COST])..." name="Upload Image"/> - <menu_item_call label="Som (L$[COST])..." name="Upload Sound"/> - <menu_item_call label="Animação (L$[COST])..." name="Upload Animation"/> - <menu_item_call label="Bulk (L$[COST] por arquivo)..." name="Bulk Upload"/> - <menu_item_separator label="-----------" name="separator"/> - <menu_item_call label="Definir Permissões Padrão..." name="perm prefs"/> - </menu> - <menu_item_separator label="-----------" name="separator"/> - <menu_item_call label="Fechar janela" name="Close Window"/> - <menu_item_call label="Fechar todas as janelas" name="Close All Windows"/> - <menu_item_separator label="-----------" name="separator2"/> - <menu_item_call label="Salvar textura como..." name="Save Texture As..."/> - <menu_item_separator label="-----------" name="separator3"/> - <menu_item_call label="Tirar Foto" name="Take Snapshot"/> - <menu_item_call label="Salvar Foto no disco" name="Snapshot to Disk"/> - <menu_item_separator label="-----------" name="separator4"/> - <menu_item_call label="Sair" name="Quit"/> - </menu> - <menu label="Editar" name="Edit"> - <menu_item_call label="Voltar" name="Undo"/> - <menu_item_call label="Avançar" name="Redo"/> - <menu_item_separator label="-----------" name="separator"/> - <menu_item_call label="Cortar" name="Cut"/> - <menu_item_call label="Copiar" name="Copy"/> - <menu_item_call label="Colar" name="Paste"/> - <menu_item_call label="Apagar" name="Delete"/> - <menu_item_separator label="-----------" name="separator2"/> - <menu_item_call label="Procurar..." name="Search..."/> - <menu_item_separator label="-----------" name="separator3"/> - <menu_item_call label="Selecionar todos" name="Select All"/> - <menu_item_call label="Retirar seleção" name="Deselect"/> - <menu_item_separator label="-----------" name="separator4"/> - <menu_item_call label="Duplicar" name="Duplicate"/> - <menu_item_separator label="-----------" name="separator5"/> - <menu label="Anexar objeto" name="Attach Object"/> - <menu label="Desanexar objeto" name="Detach Object"/> - <menu label="Tirar a roupa" name="Take Off Clothing"> - <menu_item_call label="Camiseta" name="Shirt"/> - <menu_item_call label="Calças" name="Pants"/> - <menu_item_call label="Sapatos" name="Shoes"/> - <menu_item_call label="Meias" name="Socks"/> - <menu_item_call label="Blusa" name="Jacket"/> - <menu_item_call label="Luvas" name="Gloves"/> - <menu_item_call label="Anágua" name="Menu Undershirt"/> - <menu_item_call label="Roupa de baixo" name="Menu Underpants"/> - <menu_item_call label="saia" name="Skirt"/> - <menu_item_call label="Toda a roupa" name="All Clothes"/> - </menu> - <menu_item_separator label="-----------" name="separator6"/> - <menu_item_call label="Gestos..." name="Gestures..."/> - <menu_item_call label="Perfil..." name="Profile..."/> - <menu_item_call label="Aparência..." name="Appearance..."/> - <menu_item_separator label="-----------" name="separator7"/> - <menu_item_check label="Amigos..." name="Friends..."/> - <menu_item_call label="Grupos..." name="Groups..."/> - <menu_item_separator label="-----------" name="separator8"/> - <menu_item_call label="Preferências..." name="Preferences..."/> - </menu> - <menu label="Exibir" name="View"> - <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/> - <menu_item_call label="Visão do mouse" name="Mouselook"/> - <menu_item_check label="Construir" name="Build"/> - <menu_item_check label="Câmera voadora pelo joystick" name="Joystick Flycam"/> - <menu_item_call label="Resetar visão" name="Reset View"/> - <menu_item_call label="Olhar para o último movimento" name="Look at Last Chatter"/> - <menu_item_separator label="-----------" name="separator"/> - <menu_item_check label="Barra de ferramentas" name="Toolbar"/> - <menu_item_check label="Conversa local" name="Chat History"/> - <menu_item_check label="Comunicar" name="Instant Message"/> - <menu_item_check label="Inventário" name="Inventory"/> - <menu_item_check label="Falantes Ativos" name="Active Speakers"/> - <menu_item_check label="Lista de residentes e objetos silenciados" name="Mute List"/> - <menu_item_separator label="-----------" name="separator2"/> - <menu_item_check label="Controles de câmera" name="Camera Controls"/> - <menu_item_check label="Controles de movimento" name="Movement Controls"/> - <menu_item_check label="Mapa do mundo" name="World Map"/> - <menu_item_check label="Mini-Mapa" name="Mini-Map"/> - <menu_item_separator label="-----------" name="separator3"/> - <menu_item_check label="Barra de estatÃsticas" name="Statistics Bar"/> - <menu_item_check label="Linhas de propriedades" name="Property Lines"/> - <menu_item_check label="Linhas de banimento" name="Banlines"/> - <menu_item_check label="Donos de terrenos" name="Land Owners"/> - <menu_item_separator label="-----------" name="separator4"/> - <menu label="Dicas" name="Hover Tips"> - <menu_item_check label="Mostrar dicas" name="Show Tips"/> - <menu_item_separator label="-----------" name="separator"/> - <menu_item_check label="Dicas de terreno" name="Land Tips"/> - <menu_item_check label="Dicas de todos os objetos" name="Tips On All Objects"/> - </menu> - <menu_item_check label="Luz para transparência" name="Highlight Transparent"/> - <menu_item_check label="Balizas" name="beacons"/> - <menu_item_check label="Esconder partÃculas" name="Hide Particles"/> - <menu_item_check label="Mostrar anexo em HUD" name="Show HUD Attachments"/> - <menu_item_separator label="-----------" name="separator5"/> - <menu_item_call label="Mais zoom" name="Zoom In"/> - <menu_item_call label="Zoom padrão" name="Zoom Default"/> - <menu_item_call label="Menos zoom" name="Zoom Out"/> - <menu_item_separator label="-----------" name="separator6"/> - <menu_item_call label="Tela cheia" name="Toggle Fullscreen"/> - <menu_item_call label="Ajustar o tamanho da UI ao padrão" name="Set UI Size to Default"/> + <menu label="Comunicar" name="Communicate"> + <menu_item_call label="Meus amigos" name="My Friends"/> + <menu_item_call label="Meus grupos" name="My Groups"/> + <menu_item_check label="Bate-papo local" name="Nearby Chat"/> + <menu_item_call label="Pessoas por perto" name="Active Speakers"/> </menu> <menu label="Mundo" name="World"> - <menu_item_call label="Conversa" name="Chat"/> - <menu_item_check label="Sempre Correr" name="Always Run"/> - <menu_item_check label="Voar" name="Fly"/> - <menu_item_separator label="-----------" name="separator"/> - <menu_item_call label="Criar Landmark aqui" name="Create Landmark Here"/> - <menu_item_call label="Marcar como casa" name="Set Home to Here"/> - <menu_item_separator label="-----------" name="separator2"/> - <menu_item_call label="Teletransportar para casa" name="Teleport Home"/> - <menu_item_separator label="-----------" name="separator3"/> - <menu_item_call label="Deixar ausente" name="Set Away"/> - <menu_item_call label="Deixar Ocupado" name="Set Busy"/> - <menu_item_call label="Parar Animação do Meu Avatar" name="Stop Animating My Avatar"/> - <menu_item_call label="Liberar teclas" name="Release Keys"/> - <menu_item_separator label="-----------" name="separator4"/> - <menu_item_call label="Histórico de conta..." name="Account History..."> - <on_click name="AccountHistory_url" userdata="WebLaunchAccountHistory,http://secondlife.com/account/transactions.php?lang=pt"/> - </menu_item_call> - <menu_item_call label="Gerenciar minha conta..." name="Manage My Account..."> - <on_click name="ManageMyAccount_url" userdata="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=pt"/> - </menu_item_call> - <menu_item_call label="Comprar L$..." name="Buy and Sell L$..."/> - <menu_item_separator label="-----------" name="separator5"/> - <menu_item_call label="Meu terreno..." name="My Land..."/> - <menu_item_call label="Sobre o terreno..." name="About Land..."/> - <menu_item_call label="Comprar terreno..." name="Buy Land..."/> - <menu_item_call label="Região/Propriedade..." name="Region/Estate..."/> - <menu_item_separator label="-----------" name="separator6"/> - <menu label="Configurações de ambiente" name="Environment Settings"> + <menu_item_check label="Mini Mapa" name="Mini-Map"/> + <menu_item_check label="Mapa-múndi" name="World Map"/> + <menu_item_call label="Foto" name="Take Snapshot"/> + <menu_item_call label="Criar marco deste lugar" name="Create Landmark Here"/> + <menu label="Perfil da região" name="Land"> + <menu_item_call label="Perfil da região" name="Place Profile"/> + <menu_item_call label="Sobre terrenos" name="About Land"/> + <menu_item_call label="Região/Propriedade" name="Region/Estate"/> + </menu> + <menu_item_call label="Comprar este terreno" name="Buy Land"/> + <menu_item_call label="Meus terrenos" name="My Land"/> + <menu label="Mostrar" name="LandShow"> + <menu_item_check label="Controles de movimento" name="Movement Controls"/> + <menu_item_check label="Ver controles" name="Camera Controls"/> + <menu_item_check label="Limites" name="Ban Lines"/> + <menu_item_check label="Balizas" name="beacons"/> + <menu_item_check label="Limites do imóvel" name="Property Lines"/> + <menu_item_check label="Proprietários" name="Land Owners"/> + <menu_item_check label="Coordenadas" name="Coordinates"/> + <menu_item_check label="Propriedades do lote" name="Parcel Properties"/> + </menu> + <menu_item_call label="Teletransportar para meu inÃcio" name="Teleport Home"/> + <menu_item_call label="Definir como InÃcio" name="Set Home to Here"/> + <menu label="Sol" name="Environment Settings"> <menu_item_call label="Amanhecer" name="Sunrise"/> <menu_item_call label="Meio-dia" name="Noon"/> <menu_item_call label="Pôr-do-Sol" name="Sunset"/> <menu_item_call label="Meia-noite" name="Midnight"/> - <menu_item_call label="Reverter ao padrão da região" name="Revert to Region Default"/> - <menu_item_separator label="-----------" name="separator"/> + <menu_item_call label="Horário da propriedade" name="Revert to Region Default"/> <menu_item_call label="Editor de ambiente" name="Environment Editor"/> </menu> </menu> - <menu label="Ferramentas" name="Tools"> - <menu label="Selecionar ferramenta" name="Select Tool"> - <menu_item_call label="Foco" name="Focus"/> - <menu_item_call label="Mover" name="Move"/> - <menu_item_call label="Editar" name="Edit"/> - <menu_item_call label="Criar" name="Create"/> - <menu_item_call label="Terreno" name="Land"/> - </menu> - <menu_item_separator label="-----------" name="separator"/> - <menu_item_check label="Selecionar apenas meus objetos" name="Select Only My Objects"/> - <menu_item_check label="Selecionar apenas objetos móveis" name="Select Only Movable Objects"/> - <menu_item_check label="Selecionar objetos pela vizinhança" name="Select By Surrounding"/> - <menu_item_check label="Mostrar seleções escondidas" name="Show Hidden Selection"/> - <menu_item_check label="Mostrar luz radiante para seleção" name="Show Light Radius for Selection"/> - <menu_item_check label="Mostrar seleções de feixes" name="Show Selection Beam"/> - <menu_item_separator label="-----------" name="separator2"/> - <menu_item_check label="Alinhar à grade" name="Snap to Grid"/> - <menu_item_call label="Alinhar xy do objeto à grade" name="Snap Object XY to Grid"/> - <menu_item_call label="Usar seleção na grade" name="Use Selection for Grid"/> - <menu_item_call label="Opções de grade..." name="Grid Options..."/> - <menu_item_separator label="-----------" name="separator3"/> - <menu_item_check label="Editar partes unidas" name="Edit Linked Parts"/> - <menu_item_call label="Unir" name="Link"/> - <menu_item_call label="Desunir" name="Unlink"/> - <menu_item_separator label="-----------" name="separator4"/> - <menu_item_call label="Foco na seleção" name="Focus on Selection"/> - <menu_item_call label="Zoom na Seleção" name="Zoom to Selection"/> - <menu_item_call label="Comprar el objeto" name="Menu Object Take"> - <on_enable userdata="Comprar,Pegar" name="EnableBuyOrTake"/> - </menu_item_call> - <menu_item_call label="Pegar cópia" name="Take Copy"/> - <menu_item_call label="Salvar objeto de volta aos conteúdos do objeto" name="Save Object Back to Object Contents"/> - <menu_item_separator label="-----------" name="separator6"/> - <menu_item_call label="Mostrar scripts defeituosos/Erros de janela" name="Show Script Warning/Error Window"/> - <menu label="Recompilar os scripts na seleção" name="Recompile Scripts in Selection"> - <menu_item_call label="Mono" name="Mono"/> - <menu_item_call label="LSL" name="LSL"/> - </menu> - <menu_item_call label="Resetar scripts selecionados" name="Reset Scripts in Selection"/> - <menu_item_call label="Ajustar scripts para rodar na seleção" name="Set Scripts to Running in Selection"/> - <menu_item_call label="Ajustar scripts para não rodar na seleção" name="Set Scripts to Not Running in Selection"/> + <menu label="Construir" name="BuildTools"> + <menu_item_check label="Construir" name="Show Build Tools"/> + <menu label="Selecionar ferramenta de construção" name="Select Tool"> + <menu_item_call label="Ferramenta enfoque" name="Focus"/> + <menu_item_call label="Ferramenta de movimentação" name="Move"/> + <menu_item_call label="Ferramenta de edição" name="Edit"/> + <menu_item_call label="Ferramenta criar" name="Create"/> + <menu_item_call label="Ferramenta de terrenos" name="Land"/> + </menu> + <menu_item_call label="Link" name="Link"/> + <menu_item_call label="Desconectar links" name="Unlink"/> + <menu_item_check label="Edit Linked Parts" name="Edit Linked Parts"/> + <menu label="Selecionar partes conectadas" name="Select Linked Parts"> + <menu_item_call label="Selecionar próxima parte" name="Select Next Part"/> + <menu_item_call label="Selecionar parte anterior" name="Select Previous Part"/> + <menu_item_call label="Incluir próxima parte" name="Include Next Part"/> + <menu_item_call label="Incluir parte anterior" name="Include Previous Part"/> + </menu> + <menu_item_call label="Enfocar seleção" name="Focus on Selection"/> + <menu_item_call label="Ampliar seleção" name="Zoom to Selection"/> + <menu label="Objeto:" name="Object"> + <menu_item_call label="Comprar" name="Menu Object Buy"/> + <menu_item_call label="Pegar" name="Menu Object Take"/> + <menu_item_call label="Pegar uma cópia" name="Take Copy"/> + <menu_item_call label="Salvar no meu inventário" name="Save Object Back to My Inventory"/> + <menu_item_call label="Save Back to Object Contents" name="Save Object Back to Object Contents"/> + </menu> + <menu label="Scripts" name="Scripts"> + <menu_item_call label="Recompilar scripts (LSL)" name="Mono"/> + <menu_item_call label="Recompilar scripts (LSL)" name="LSL"/> + <menu_item_call label="Resetar scripts" name="Reset Scripts"/> + <menu_item_call label="Scripts em modo execução" name="Set Scripts to Running"/> + <menu_item_call label="Scripts em modo não execução" name="Set Scripts to Not Running"/> + </menu> + <menu label="Opções" name="Options"> + <menu_item_call label="Definir permissões padrão de upload" name="perm prefs"/> + <menu_item_check label="Mostrar permissões avançadas" name="DebugPermissions"/> + <menu_item_check label="Só selecionar meus objetos" name="Select Only My Objects"/> + <menu_item_check label="Só selecionar objetos móveis" name="Select Only Movable Objects"/> + <menu_item_check label="Selecionar contornando" name="Select By Surrounding"/> + <menu_item_check label="Mostrar seleção oculta" name="Show Hidden Selection"/> + <menu_item_check label="Mostrar alcance de luz da seleção" name="Show Light Radius for Selection"/> + <menu_item_check label="Mostrar raio de seleção" name="Show Selection Beam"/> + <menu_item_check label="Encaixar em grade" name="Snap to Grid"/> + <menu_item_call label="Encaixar objeto XY em grade" name="Snap Object XY to Grid"/> + <menu_item_call label="Usar seleção em grade" name="Use Selection for Grid"/> + <menu_item_call label="Opções de grade" name="Grid Options"/> + </menu> + <menu label="Upload" name="Upload"> + <menu_item_call label="Imagem (L$[COST])..." name="Upload Image"/> + <menu_item_call label="Som (L$[COST])..." name="Upload Sound"/> + <menu_item_call label="Animação (L$[COST])..." name="Upload Animation"/> + <menu_item_call label="Volume (L$[COST] por arquivo)..." name="Bulk Upload"/> + </menu> </menu> <menu label="Ajuda" name="Help"> - <menu_item_call label="Ajuda [SECOND_LIFE]" name="Second Life Help"/> - <menu_item_call label="Tutorial" name="Tutorial"/> - <menu_item_separator label="-----------" name="separator"/> - <menu_item_call label="Blog oficial da Linden..." name="Official Linden Blog..."/> - <menu_item_separator label="-----------" name="separator2"/> - <menu_item_call label="Portal de Scripts..." name="Scripting Portal..."/> - <menu_item_separator label="-----------" name="separator3"/> - <menu_item_call label="Reportar Abuso..." name="Report Abuse..."/> - <menu_item_call label="Colisões, impulsos e batidas..." name="Bumps, Pushes &amp; Hits..."/> - <menu_item_call label="Medidor de Lag" name="Lag Meter"/> - <menu_item_separator label="-----------" name="separator7"/> - <menu label="Reportando Bug" name="Bug Reporting"> - <menu_item_call label="Rastreador público de problemas..." name="Public Issue Tracker..."/> - <menu_item_call label="Ajuda do rastreador público de problemas..." name="Publc Issue Tracker Help..."/> - <menu_item_separator label="-----------" name="separator7"/> - <menu_item_call label="Reportando Bug 101..." name="Bug Reporing 101..."/> - <menu_item_call label="Questões de Segurança..." name="Security Issues..."/> - <menu_item_call label="Wiki de QA ..." name="QA Wiki..."/> - <menu_item_separator label="-----------" name="separator9"/> - <menu_item_call label="Reportar Bug..." name="Report Bug..."/> - </menu> - <menu_item_call label="Sobre [APP_NAME]..." name="About Second Life..."/> + <menu_item_call label="[SECOND_LIFE] Ajuda" name="Second Life Help"/> + <menu_item_call label="Denunciar abuso" name="Report Abuse"/> + <menu_item_call label="Relatar bug" name="Report Bug"/> + <menu_item_call label="Sobre [APP_NAME]" name="About Second Life"/> + </menu> + <menu label="Avançado" name="Advanced"> + <menu_item_check label="Exibir menu avançado" name="Show Advanced Menu"/> + <menu_item_call label="Parar minha animação" name="Stop Animating My Avatar"/> + <menu_item_call label="Recarregar texturas" name="Rebake Texture"/> + <menu_item_call label="Interface tamanho padrão" name="Set UI Size to Default"/> + <menu_item_call label="Definir tamanho da janela:" name="Set Window Size..."/> + <menu_item_check label="Limitar distância da seleção" name="Limit Select Distance"/> + <menu_item_check label="Disable Camera Constraints" name="Disable Camera Distance"/> + <menu_item_check label="Foto de alta resolução" name="HighResSnapshot"/> + <menu_item_check label="Compactar fotos para HD" name="QuietSnapshotsToDisk"/> + <menu_item_check label="Compactar fotos para HD" name="CompressSnapshotsToDisk"/> + <menu label="Ferramentas de desempenho" name="Performance Tools"> + <menu_item_call label="Medidor de lag" name="Lag Meter"/> + <menu_item_check label="Barra de estatÃsticas" name="Statistics Bar"/> + <menu_item_check label="Carga de renderização de avatar" name="Avatar Rendering Cost"/> + </menu> + <menu label="Realces e visibilidade" name="Highlighting and Visibility"> + <menu_item_check label="Efeito baliza piscando" name="Cheesy Beacon"/> + <menu_item_check label="Hide Particles" name="Hide Particles"/> + <menu_item_check label="Ocultar seleções" name="Hide Selected"/> + <menu_item_check label="Realçar transparentes" name="Highlight Transparent"/> + <menu_item_check label="Mostrar anexos HUD" name="Show HUD Attachments"/> + <menu_item_check label="Mostrar retÃculo na vista subjetiva" name="ShowCrosshairs"/> + </menu> + <menu label="Tipos de renderização" name="Rendering Types"> + <menu_item_check label="Simples" name="Simple"/> + <menu_item_check label="Alpha" name="Alpha"/> + <menu_item_check label="Ãrvore" name="Tree"/> + <menu_item_check label="Avatares" name="Character"/> + <menu_item_check label="SurfacePath" name="SurfacePath"/> + <menu_item_check label="Céu" name="Sky"/> + <menu_item_check label="Ãgua" name="Water"/> + <menu_item_check label="Chão" name="Ground"/> + <menu_item_check label="Volume" name="Volume"/> + <menu_item_check label="Grama" name="Grass"/> + <menu_item_check label="Nuvens" name="Clouds"/> + <menu_item_check label="Particles" name="Particles"/> + <menu_item_check label="Elevação" name="Bump"/> + </menu> + <menu label="Recursos de renderização" name="Rendering Features"> + <menu_item_check label="Interface" name="UI"/> + <menu_item_check label="Selecionado" name="Selected"/> + <menu_item_check label="Realçado" name="Highlighted"/> + <menu_item_check label="Texturas dinâmicas" name="Dynamic Textures"/> + <menu_item_check label="Sombras nos pés" name="Foot Shadows"/> + <menu_item_check label="Neblina" name="Fog"/> + <menu_item_check label="Objetos flexÃveis" name="Flexible Objects"/> + </menu> + <menu_item_check label="Executar diversas instâncias" name="Run Multiple Threads"/> + <menu_item_check label="Usar plugin de leitura de threads" name="Use Plugin Read Thread"/> + <menu_item_call label="Limpar cache de grupo" name="ClearGroupCache"/> + <menu_item_check label="Smoothing de mouse" name="Mouse Smoothing"/> + <menu label="Atalhos" name="Shortcuts"> + <menu_item_call label="Imagem (L$[COST])..." name="Upload Image"/> + <menu_item_check label="Busca" name="Search"/> + <menu_item_call label="Soltar objeto" name="Release Keys"/> + <menu_item_call label="Interface tamanho padrão" name="Set UI Size to Default"/> + <menu_item_check label="Correr sempre" name="Always Run"/> + <menu_item_check label="Voar" name="Fly"/> + <menu_item_call label="Fechar janela" name="Close Window"/> + <menu_item_call label="Fechar todas as janelas" name="Close All Windows"/> + <menu_item_call label="Gravar fotos no HD" name="Snapshot to Disk"/> + <menu_item_call label="Visão subjetiva" name="Mouselook"/> + <menu_item_check label="Flycam Joystick" name="Joystick Flycam"/> + <menu_item_call label="Visão padrão" name="Reset View"/> + <menu_item_call label="Olhar para quem fala por último" name="Look at Last Chatter"/> + <menu label="Selecionar ferramenta de construção" name="Select Tool"> + <menu_item_call label="Ferramenta enfoque" name="Focus"/> + <menu_item_call label="Ferramenta de movimentação" name="Move"/> + <menu_item_call label="Ferramenta de edição" name="Edit"/> + <menu_item_call label="Ferramenta criar" name="Create"/> + <menu_item_call label="Ferramenta de terrenos" name="Land"/> + </menu> + <menu_item_call label="Mais zoom" name="Zoom In"/> + <menu_item_call label="Zoom padrão" name="Zoom Default"/> + <menu_item_call label="Menos zoom" name="Zoom Out"/> + </menu> + <menu_item_call label="Mostrar configurações de depuração" name="Debug Settings"/> + <menu_item_check label="Show Develop Menu" name="Debug Mode"/> + </menu> + <menu label="Desenvolver" name="Develop"> + <menu label="Painéis" name="Consoles"> + <menu_item_check label="Painel de textura" name="Texture Console"/> + <menu_item_check label="Console de depuração" name="Debug Console"/> + <menu_item_call label="Painel de avisos" name="Notifications"/> + <menu_item_check label="Painel de tamanho de textura" name="Texture Size"/> + <menu_item_check label="Painel de texturas" name="Texture Category"/> + <menu_item_check label="Tempos" name="Fast Timers"/> + <menu_item_check label="Memória" name="Memory"/> + <menu_item_call label="Region Info to Debug Console" name="Region Info to Debug Console"/> + <menu_item_check label="Câmera:" name="Camera"/> + <menu_item_check label="Vento" name="Wind"/> + <menu_item_check label="Crachá" name="Badge"/> + </menu> + <menu label="Show Info" name="Display Info"> + <menu_item_check label="Mostrar hora" name="Show Time"/> + <menu_item_check label="Dados de renderização" name="Show Render Info"/> + <menu_item_check label="Mostrar cor sob o cursor" name="Show Color Under Cursor"/> + <menu_item_check label="Mostrar mudanças a objetos" name="Show Updates"/> + </menu> + <menu label="Force an Error" name="Force Errors"> + <menu_item_call label="Force Breakpoint" name="Force Breakpoint"/> + <menu_item_call label="Force LLError And Crash" name="Force LLError And Crash"/> + <menu_item_call label="Force Bad Memory Access" name="Force Bad Memory Access"/> + <menu_item_call label="Force an Infinite Loop" name="Force Infinite Loop"/> + <menu_item_call label="Force Driver Crash" name="Force Driver Carsh"/> + <menu_item_call label="Force Software Exception" name="Force Software Exception"/> + <menu_item_call label="Force Disconnect Viewer" name="Force Disconnect Viewer"/> + <menu_item_call label="Simulate a Memory Leak" name="Memory Leaking Simulation"/> + </menu> + <menu label="Render Tests" name="Render Tests"> + <menu_item_check label="Camera Offset" name="Camera Offset"/> + <menu_item_check label="Taxa de quadros aleatória" name="Randomize Framerate"/> + <menu_item_check label="Frame Test" name="Frame Test"/> + </menu> + <menu label="Rendering" name="Rendering"> + <menu_item_check label="Axes" name="Axes"/> + <menu_item_check label="Wireframe" name="Wireframe"/> + <menu_item_check label="Global Illumination" name="Global Illumination"/> + <menu_item_check label="Texturas de animação" name="Animation Textures"/> + <menu_item_check label="Desativar texturas" name="Disable Textures"/> + <menu_item_check label="Render Attached Lights" name="Render Attached Lights"/> + <menu_item_check label="Render Attached Particles" name="Render Attached Particles"/> + <menu_item_check label="Objetos iridescentes" name="Hover Glow Objects"/> + </menu> + <menu label="Rede" name="Network"> + <menu_item_check label="Pausar avatar" name="AgentPause"/> + <menu_item_call label="Drop a Packet" name="Drop a Packet"/> + </menu> + <menu_item_call label="Empurrões, trombadas e tapas" name="Bumps, Pushes &amp; Hits"/> + <menu label="Mundo" name="World"> + <menu_item_check label="Impor sobre sol regional" name="Sim Sun Override"/> + <menu_item_check label="Efeito baliza piscando" name="Cheesy Beacon"/> + <menu_item_check label="Fixed Weather" name="Fixed Weather"/> + <menu_item_call label="Dump Region Object Cache" name="Dump Region Object Cache"/> + </menu> + <menu label="Interface" name="UI"> + <menu_item_call label="Teste de navegador web" name="Web Browser Test"/> + <menu_item_call label="Print Selected Object Info" name="Print Selected Object Info"/> + <menu_item_call label="Dados de memória" name="Memory Stats"/> + <menu_item_check label="Double-Click Auto-Pilot" name="Double-ClickAuto-Pilot"/> + <menu_item_check label="Debug Clicks" name="Debug Clicks"/> + <menu_item_check label="Debug Mouse Events" name="Debug Mouse Events"/> + </menu> + <menu label="XUI" name="XUI"> + <menu_item_call label="Recarregar cores" name="Reload Color Settings"/> + <menu_item_call label="Teste de fonte" name="Show Font Test"/> + <menu_item_call label="Carregar de XML" name="Load from XML"/> + <menu_item_call label="Salvar para XML" name="Save to XML"/> + <menu_item_check label="Mostrar nomes XUI" name="Show XUI Names"/> + <menu_item_call label="Enviar MIs de teste" name="Send Test IMs"/> + </menu> + <menu label="Avatar" name="Character"> + <menu label="Grab Baked Texture" name="Grab Baked Texture"> + <menu_item_call label="Ãris" name="Iris"/> + <menu_item_call label="Cabeça" name="Head"/> + <menu_item_call label="Cintura acima" name="Upper Body"/> + <menu_item_call label="Cintura para baixo" name="Lower Body"/> + <menu_item_call label="Saia" name="Skirt"/> + </menu> + <menu label="Testes de personagem" name="Character Tests"> + <menu_item_call label="Toggle Character Geometry" name="Toggle Character Geometry"/> + <menu_item_check label="Allow Select Avatar" name="Allow Select Avatar"/> + </menu> + <menu_item_call label="Force Params to Default" name="Force Params to Default"/> + <menu_item_check label="Dados da animação" name="Animation Info"/> + <menu_item_check label="Mostrar animação de movimento" name="Slow Motion Animations"/> + <menu_item_check label="Disable Level Of Detail" name="Disable LOD"/> + <menu_item_check label="Show Collision Skeleton" name="Show Collision Skeleton"/> + <menu_item_check label="Display Agent Target" name="Display Agent Target"/> + <menu_item_call label="Depurar texturas do avatar" name="Debug Avatar Textures"/> + </menu> + <menu_item_check label="Texturas HTTP" name="HTTP Textures"/> + <menu_item_check label="Console Window on next Run" name="Console Window"/> + <menu_item_check label="Mostrar menu admin" name="View Admin Options"/> + <menu_item_call label="Request Admin Status" name="Request Admin Options"/> + <menu_item_call label="Sair do modo admin" name="Leave Admin Options"/> + </menu> + <menu label="Admin" name="Admin"> + <menu label="Object"> + <menu_item_call label="Pegar uma cópia" name="Take Copy"/> + <menu_item_call label="Force Owner To Me" name="Force Owner To Me"/> + <menu_item_call label="Force Owner Permissive" name="Force Owner Permissive"/> + <menu_item_call label="Excluir" name="Delete"/> + <menu_item_call label="Bloquear" name="Lock"/> + </menu> + <menu label="Lote" name="Parcel"> + <menu_item_call label="Force Owner To Me" name="Owner To Me"/> + <menu_item_call label="Conteúdo da Linden Lab" name="Set to Linden Content"/> + <menu_item_call label="Pedir terras públicas" name="Claim Public Land"/> + </menu> + <menu label="Região" name="Region"> + <menu_item_call label="Dump Temporary Asset Data" name="Dump Temp Asset Data"/> + <menu_item_call label="Save Region State" name="Save Region State"/> + </menu> + <menu_item_call label="God Tools" name="God Tools"/> </menu> </menu_bar> diff --git a/indra/newview/skins/default/xui/pt/menu_wearable_list_item.xml b/indra/newview/skins/default/xui/pt/menu_wearable_list_item.xml new file mode 100644 index 0000000000..dbf942796c --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_wearable_list_item.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Outfit Wearable Context Menu"> + <menu_item_call label="Vestir" name="wear"/> + <menu_item_call label="Adicionar" name="wear_add"/> + <menu_item_call label="Tirar / Separar" name="take_off_or_detach"/> + <menu_item_call label="Separar" name="detach"/> + <context_menu label="Colocar em â–¶" name="wearable_attach_to"/> + <context_menu label="Anexar ao HUD â–¶" name="wearable_attach_to_hud"/> + <menu_item_call label="Tirar" name="take_off"/> + <menu_item_call label="Editar" name="edit"/> + <menu_item_call label="Perfil do objeto" name="object_profile"/> + <menu_item_call label="Mostrar original" name="show_original"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/pt/mime_types_linux.xml b/indra/newview/skins/default/xui/pt/mime_types_linux.xml new file mode 100644 index 0000000000..789843cbba --- /dev/null +++ b/indra/newview/skins/default/xui/pt/mime_types_linux.xml @@ -0,0 +1,217 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<mimetypes name="default"> + <widgetset name="web"> + <label name="web_label"> + Conteúdo web + </label> + <tooltip name="web_tooltip"> + Este lugar possui conteúdo na web + </tooltip> + <playtip name="web_playtip"> + Mostrar conteúdo na web + </playtip> + </widgetset> + <widgetset name="movie"> + <label name="movie_label"> + Filme + </label> + <tooltip name="movie_tooltip"> + Aqui tem um vÃdeo para você assistir + </tooltip> + <playtip name="movie_playtip"> + Mostrar vÃdeo + </playtip> + </widgetset> + <widgetset name="image"> + <label name="image_label"> + Imagem + </label> + <tooltip name="image_tooltip"> + Aqui tem uma imagem para você ver + </tooltip> + <playtip name="image_playtip"> + Mostrar imagem + </playtip> + </widgetset> + <widgetset name="audio"> + <label name="audio_label"> + Ãudio + </label> + <tooltip name="audio_tooltip"> + Aqui tem um clipe de áudio para você ouvir + </tooltip> + <playtip name="audio_playtip"> + Tocar clipe + </playtip> + </widgetset> + <scheme name="rtsp"> + <label name="rtsp_label"> + Stream em tempo real + </label> + </scheme> + <mimetype name="blank"> + <label name="blank_label"> + - Nenhum - + </label> + </mimetype> + <mimetype name="none/none"> + <label name="none/none_label"> + - Nenhum - + </label> + </mimetype> + <mimetype name="audio/*"> + <label name="audio2_label"> + Ãudio + </label> + </mimetype> + <mimetype name="video/*"> + <label name="video2_label"> + VÃdeo + </label> + </mimetype> + <mimetype name="image/*"> + <label name="image2_label"> + Imagem + </label> + </mimetype> + <mimetype name="video/vnd.secondlife.qt.legacy"> + <label name="vnd.secondlife.qt.legacy_label"> + VÃdeo (QuickTime) + </label> + </mimetype> + <mimetype name="application/javascript"> + <label name="application/javascript_label"> + Javascript + </label> + </mimetype> + <mimetype name="application/ogg"> + <label name="application/ogg_label"> + Ogg Ãudio/VÃdeo + </label> + </mimetype> + <mimetype name="application/pdf"> + <label name="application/pdf_label"> + Arquivo PDF + </label> + </mimetype> + <mimetype name="application/postscript"> + <label name="application/postscript_label"> + Arquivo Postscript + </label> + </mimetype> + <mimetype name="application/rtf"> + <label name="application/rtf_label"> + Rich Text (RTF) + </label> + </mimetype> + <mimetype name="application/smil"> + <label name="application/smil_label"> + Synchronized Multimedia Integration Language (SMIL) + </label> + </mimetype> + <mimetype name="application/xhtml+xml"> + <label name="application/xhtml+xml_label"> + Página web (XHTML) + </label> + </mimetype> + <mimetype name="application/x-director"> + <label name="application/x-director_label"> + Macromedia Director + </label> + </mimetype> + <mimetype name="audio/mid"> + <label name="audio/mid_label"> + Ãudio (MIDI) + </label> + </mimetype> + <mimetype name="audio/mpeg"> + <label name="audio/mpeg_label"> + Ãudio (MP3) + </label> + </mimetype> + <mimetype name="audio/x-aiff"> + <label name="audio/x-aiff_label"> + Ãudio (AIFF) + </label> + </mimetype> + <mimetype name="audio/x-wav"> + <label name="audio/x-wav_label"> + Ãudio (WAV) + </label> + </mimetype> + <mimetype name="image/bmp"> + <label name="image/bmp_label"> + Imagem (BMP) + </label> + </mimetype> + <mimetype name="image/gif"> + <label name="image/gif_label"> + Imagem (GIF) + </label> + </mimetype> + <mimetype name="image/jpeg"> + <label name="image/jpeg_label"> + Imagem (JPEG) + </label> + </mimetype> + <mimetype name="image/png"> + <label name="image/png_label"> + Imagem (PNG) + </label> + </mimetype> + <mimetype name="image/svg+xml"> + <label name="image/svg+xml_label"> + Imagem (SVG) + </label> + </mimetype> + <mimetype name="image/tiff"> + <label name="image/tiff_label"> + Imagem (TIFF) + </label> + </mimetype> + <mimetype name="text/html"> + <label name="text/html_label"> + Página web + </label> + </mimetype> + <mimetype name="text/plain"> + <label name="text/plain_label"> + Texto + </label> + </mimetype> + <mimetype name="text/xml"> + <label name="text/xml_label"> + XML + </label> + </mimetype> + <mimetype name="video/mpeg"> + <label name="video/mpeg_label"> + VÃdeo (MPEG) + </label> + </mimetype> + <mimetype name="video/mp4"> + <label name="video/mp4_label"> + VÃdeo (MP4) + </label> + </mimetype> + <mimetype name="video/quicktime"> + <label name="video/quicktime_label"> + VÃdeo (QuickTime) + </label> + </mimetype> + <mimetype name="video/x-ms-asf"> + <label name="video/x-ms-asf_label"> + VÃdeo (Windows Media ASF) + </label> + </mimetype> + <mimetype name="video/x-ms-wmv"> + <label name="video/x-ms-wmv_label"> + VÃdeo (Windows Media WMV) + </label> + </mimetype> + <mimetype name="video/x-msvideo"> + <label name="video/x-msvideo_label"> + VÃdeo (AVI) + </label> + </mimetype> +</mimetypes> diff --git a/indra/newview/skins/default/xui/pt/mime_types_mac.xml b/indra/newview/skins/default/xui/pt/mime_types_mac.xml new file mode 100644 index 0000000000..34b40e94ab --- /dev/null +++ b/indra/newview/skins/default/xui/pt/mime_types_mac.xml @@ -0,0 +1,217 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<mimetypes name="default"> + <widgetset name="web"> + <label name="web_label"> + Conteúdo Web + </label> + <tooltip name="web_tooltip"> + Esta localização tem conteúdo Web + </tooltip> + <playtip name="web_playtip"> + Exibir conteúdo Web + </playtip> + </widgetset> + <widgetset name="movie"> + <label name="movie_label"> + Filme + </label> + <tooltip name="movie_tooltip"> + Há um filme que vai passar aqui + </tooltip> + <playtip name="movie_playtip"> + Começar filme + </playtip> + </widgetset> + <widgetset name="image"> + <label name="image_label"> + Imagem + </label> + <tooltip name="image_tooltip"> + Ha uma imagem nesta localização + </tooltip> + <playtip name="image_playtip"> + Visualizar a imagem desta localização + </playtip> + </widgetset> + <widgetset name="audio"> + <label name="audio_label"> + Audio + </label> + <tooltip name="audio_tooltip"> + Há áudio nesta localização + </tooltip> + <playtip name="audio_playtip"> + Tocar o áudio desta localização + </playtip> + </widgetset> + <scheme name="rtsp"> + <label name="rtsp_label"> + Real Time Streaming + </label> + </scheme> + <mimetype name="blank"> + <label name="blank_label"> + - Nenhum - + </label> + </mimetype> + <mimetype name="none/none"> + <label name="none/none_label"> + - Nenhum - + </label> + </mimetype> + <mimetype name="audio/*"> + <label name="audio2_label"> + Ãudio + </label> + </mimetype> + <mimetype name="video/*"> + <label name="video2_label"> + VÃdeo + </label> + </mimetype> + <mimetype name="image/*"> + <label name="image2_label"> + Imagem + </label> + </mimetype> + <mimetype name="video/vnd.secondlife.qt.legacy"> + <label name="vnd.secondlife.qt.legacy_label"> + Filme (QuickTime) + </label> + </mimetype> + <mimetype name="application/javascript"> + <label name="application/javascript_label"> + Javascript + </label> + </mimetype> + <mimetype name="application/ogg"> + <label name="application/ogg_label"> + Ogg Ãudio/Video + </label> + </mimetype> + <mimetype name="application/pdf"> + <label name="application/pdf_label"> + Documento PDF + </label> + </mimetype> + <mimetype name="application/postscript"> + <label name="application/postscript_label"> + Documento Postscript + </label> + </mimetype> + <mimetype name="application/rtf"> + <label name="application/rtf_label"> + Rich Text (RTF) + </label> + </mimetype> + <mimetype name="application/smil"> + <label name="application/smil_label"> + Linguagem sincronizada de integração multimidia (SMIL) + </label> + </mimetype> + <mimetype name="application/xhtml+xml"> + <label name="application/xhtml+xml_label"> + Página Web (XHTML) + </label> + </mimetype> + <mimetype name="application/x-director"> + <label name="application/x-director_label"> + Macromedia Director + </label> + </mimetype> + <mimetype name="audio/mid"> + <label name="audio/mid_label"> + Ãudio (MIDI) + </label> + </mimetype> + <mimetype name="audio/mpeg"> + <label name="audio/mpeg_label"> + Ãudio (MP3) + </label> + </mimetype> + <mimetype name="audio/x-aiff"> + <label name="audio/x-aiff_label"> + Ãudio (AIFF) + </label> + </mimetype> + <mimetype name="audio/x-wav"> + <label name="audio/x-wav_label"> + Ãudio (WAV) + </label> + </mimetype> + <mimetype name="image/bmp"> + <label name="image/bmp_label"> + Imagem (BMP) + </label> + </mimetype> + <mimetype name="image/gif"> + <label name="image/gif_label"> + Imagem (GIF) + </label> + </mimetype> + <mimetype name="image/jpeg"> + <label name="image/jpeg_label"> + Imagem (JPEG) + </label> + </mimetype> + <mimetype name="image/png"> + <label name="image/png_label"> + Imagem (PNG) + </label> + </mimetype> + <mimetype name="image/svg+xml"> + <label name="image/svg+xml_label"> + Imagem (SVG) + </label> + </mimetype> + <mimetype name="image/tiff"> + <label name="image/tiff_label"> + Imagem (TIFF) + </label> + </mimetype> + <mimetype name="text/html"> + <label name="text/html_label"> + Página Web + </label> + </mimetype> + <mimetype name="text/plain"> + <label name="text/plain_label"> + Texto + </label> + </mimetype> + <mimetype name="text/xml"> + <label name="text/xml_label"> + XML + </label> + </mimetype> + <mimetype name="video/mpeg"> + <label name="video/mpeg_label"> + Filme (MPEG) + </label> + </mimetype> + <mimetype name="video/mp4"> + <label name="video/mp4_label"> + Filme (MP4) + </label> + </mimetype> + <mimetype name="video/quicktime"> + <label name="video/quicktime_label"> + Filme (QuickTime) + </label> + </mimetype> + <mimetype name="video/x-ms-asf"> + <label name="video/x-ms-asf_label"> + Filme (Windows Media ASF) + </label> + </mimetype> + <mimetype name="video/x-ms-wmv"> + <label name="video/x-ms-wmv_label"> + Filme (Windows Media WMV) + </label> + </mimetype> + <mimetype name="video/x-msvideo"> + <label name="video/x-msvideo_label"> + Filme (AVI) + </label> + </mimetype> +</mimetypes> diff --git a/indra/newview/skins/default/xui/pt/notifications.xml b/indra/newview/skins/default/xui/pt/notifications.xml index c3ce53861f..4a738bf0ea 100644 --- a/indra/newview/skins/default/xui/pt/notifications.xml +++ b/indra/newview/skins/default/xui/pt/notifications.xml @@ -9,74 +9,45 @@ <global name="implicitclosebutton"> Fechar </global> - <template name="okbutton"> - <form> - <button - name="OK" - text="$yestext"/> - </form> - </template> - - <template name="okignore"> - <form> - <button - name="OK" - text="$yestext"/> - <ignore text="$ignoretext"/> - </form> - </template> - - <template name="okcancelbuttons"> - <form> - <button - name="OK" - text="$yestext"/> - <button - name="Cancel" - text="$notext"/> - </form> - </template> - - <template name="okcancelignore"> - <form> - <button - name="OK" - text="$yestext"/> - <button - name="Cancel" - text="$notext"/> - <ignore text="$ignoretext"/> - </form> - </template> - - <template name="okhelpbuttons"> - <form> - <button - name="OK" - text="$yestext"/> - <button - name="Help" - text="$helptext"/> - </form> - </template> - - <template name="yesnocancelbuttons"> - <form> - <button - name="Yes" - text="$yestext"/> - <button - name="No" - text="$notext"/> - <button - name="Cancel" - text="$canceltext"/> - </form> - </template> - <notification functor="GenericAcknowledge" label="Mensagem de Alerta Desconhecida" name="MissingAlert"> - Sua versão do [APP_NAME] não sabe como mostrar a mensagem de alerta que acabou de receber. - -Detalhes do erro: O alerta chamado '[_NAME]' não foi encontrado em notifications.xml. + <template name="okbutton"> + <form> + <button name="OK_okbutton" text="$yestext"/> + </form> + </template> + <template name="okignore"> + <form> + <button name="OK_okignore" text="$yestext"/> + </form> + </template> + <template name="okcancelbuttons"> + <form> + <button name="OK_okcancelbuttons" text="$yestext"/> + <button name="Cancel_okcancelbuttons" text="$notext"/> + </form> + </template> + <template name="okcancelignore"> + <form> + <button name="OK_okcancelignore" text="$yestext"/> + <button name="Cancel_okcancelignore" text="$notext"/> + </form> + </template> + <template name="okhelpbuttons"> + <form> + <button name="OK_okhelpbuttons" text="$yestext"/> + <button name="Help" text="$helptext"/> + </form> + </template> + <template name="yesnocancelbuttons"> + <form> + <button name="Yes" text="$yestext"/> + <button name="No" text="$notext"/> + <button name="Cancel_yesnocancelbuttons" text="$canceltext"/> + </form> + </template> + <notification functor="GenericAcknowledge" label="Notificação desconhecida" name="MissingAlert"> + Esta versão do [APP_NAME] não consegue exibir o aviso recebido. Verifique se você possui a versão mais recente do Visualizador. + +Detalhes do erro: O aviso '[_NAME]' não foi localizado no arquivo notifications.xml. <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="FloaterNotFound"> @@ -96,24 +67,18 @@ Detalhes do erro: O alerta chamado '[_NAME]' não foi encontrado em no <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Sim"/> </notification> <notification name="BadInstallation"> - Ocorreu um erro atualizando o [APP_NAME]. Por favor, faça o download da última versão em secondlife.com. - <usetemplate - name="okbutton" - yestext="OK"/> + Um erro ocorreu ao atualizar o [APP_NAME]. [http://get.secondlife.com Baixe a versão atual] do Visualizador. + <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="LoginFailedNoNetwork"> - Erro de Rede: Não conseguiu estabelecer uma conexão. + Falha de conexão com o [SECOND_LIFE_GRID]. '[DIAGNOSTIC]' -Por favor, verifique sua conexão de rede. - <usetemplate - name="okbutton" - yestext="OK"/> +Verifique se a conexão à internet está funcionando. + <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="MessageTemplateNotFound"> Modelo de Mensagem [PATH] não encontrado. - <usetemplate - name="okbutton" - yestext="OK"/> + <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="WearableSave"> Salvar modificações? @@ -139,15 +104,18 @@ Por favor, selecione apenas um objeto e tente novamente. Salvar todas as mudanças de roupas/ partes do corpo? <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Não Salvar" yestext="Salvar tudo"/> </notification> + <notification name="FriendsAndGroupsOnly"> + Residentes que não são amigos não veem que você decidiu ignorar ligações e MIs deles. + <usetemplate name="okbutton" yestext="OK"/> + </notification> <notification name="GrantModifyRights"> - Conceder direitos de modificar a outros residentes lhes permite trocar, deletar ou pegar QUAISQUER objetos que você possa ter no mundo. -Seja MUITO cuidadoso(a) quando passar esta permissão. -Você deseja conceder direitos de modificar para [FIRST_NAME] [LAST_NAME]? + Conceder direitos de modificação a outros residentes vai autorizá-los a mudar, apagar ou pegar TODOS os seus objetos. Seja MUITO cuidadoso ao conceder esta autorização. +Deseja modificar os direitos de modificação de [FIRST_NAME] [LAST_NAME]? <usetemplate name="okcancelbuttons" notext="Não" yestext="Sim"/> </notification> <notification name="GrantModifyRightsMultiple"> - Conceder direitos para modificar seus objetos a outro residente permite ele mudar QUAISQUER objetos que você possa ter no mundo. Tenha muito cuidado quando conceder essa permissão. -Você deseja permitir que os residentes selecionados tenham direito de edição? + Conceder direitos de modificação a outros residentes vai autorizá-los a mudar TODOS os seus objetos. Seja MUITO cuidadoso ao conceder esta autorização. +Deseja conceder direitos de modificação para os residentes selecionados? <usetemplate name="okcancelbuttons" notext="Não" yestext="Sim"/> </notification> <notification name="RevokeModifyRights"> @@ -177,7 +145,7 @@ Você deseja permitir que os residentes selecionados tenham direito de edição? Membros não podem ser removidos dessa função. Os membros podem, eles próprios, recusar a função. Deseja continuar? - <usetemplate ignoretext="Quando adicionar membro ao grupo como dono" name="okcancelignore" notext="Não" yestext="Sim"/> + <usetemplate ignoretext="Confirmar antes de adicionar novo Proprietário do grupo" name="okcancelignore" notext="Não" yestext="Sim"/> </notification> <notification name="AssignDangerousActionWarning"> Você está prestes a adicionar a habilidade '[ACTION_NAME]' para a função '[ROLE_NAME]' @@ -197,68 +165,31 @@ Qualquer membro numa função com esta habilidade, pode atribuir a sà mesmo -- Adicionar esta habilidade a '[ROLE_NAME]'? <usetemplate name="okcancelbuttons" notext="Não" yestext="Sim"/> </notification> - <notification name="ClickPublishHelpLand"> - Selecionando "Publicar na Busca" -Clicando neste Box, será mostrado: -- este lote nos resultados de busca -- os objetos públicos deste lote -- este lote na busca da web - </notification> - <notification name="ClickSoundHelpLand"> - MÃdia e Música podem apenas ser utilizadas dentro deste lote. As opções de Som e Voz podem ser restritas ao lote ou serão ouvidas por residentes fora do lote, dependendo de suas Classificações de maturidade. Ir para o Banco de Conhecimento para saber mais sobre como definir essas opções? - <url name="url"> - https://support.secondlife.com/ics/support/default.asp?deptID=4417&task=knowledge&questionID=5046 - </url> - <usetemplate - name="okcancelbuttons" - yestext="Ir para o Banco de Conhecimento" - notext="Fechar" /> - </notification> - <notification name="ClickSearchHelpAll"> - Os resultados de busca são organizados com base na aba em que você se encontra, sua Classificação de maturidade, a categoria escolhida e outros fatores. Para mais detalhes, por favor veja o Banco de Conhecimento. - <url name="url"> - https://support.secondlife.com/ics/support/default.asp?deptID=4417&task=knowledge&questionID=4722 - </url> - <usetemplate - name="okcancelbuttons" - yestext="Ir para o Banco de Conhecimento" - notext="Fechar" /> - </notification> - <notification name="ClickPublishHelpLandDisabled"> - Você não pode fazer este lote visÃvel na busca porque ele está localizado numa região que proÃbe isso. - </notification> - <notification name="ClickPublishHelpAvatar"> - Selecionando "Mostrar na Busca" será mostrado: -- meu perfil nos resultados de busca -- um link para meu perfil nas páginas de grupos públicos - </notification> - <notification name="ClickPartnerHelpAvatar"> - Você pode propor a outro Residente ou dissolver uma parceria existente através do website [SECOND_LIFE]. - -Ir para o site do [SECOND_LIFE] para mais informações sobre parceria? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Ir para a Página"/> - </notification> - <notification name="ClickUploadHelpPermissions"> - Suas permissões padrão podem não funcionar em regiões antigas. - </notification> - <notification name="ClickWebProfileHelpAvatar"> - Se este Residente definiu uma URL de perfil na web, então você pode: - * Clicar em 'Carregar' para ver a página na aba Web. - * Clicar Carregar > 'Em navegador externo' para ver a página no seu navegador de web padrão. - * Clicar Carregar > 'URL de Casa' para voltar ao perfil do Residente na web se você navegou adiante. - -Quando você está vendo seu próprio perfil, você pode entrar com qualquer URL como sendo seu perfil na web e clicar OK para definÃ-la. -Outros residentes podem visitar a URL que você definiu, quando eles olharem seu perfil. + <notification name="AttachmentDrop"> + Você está prestes a largar seu anexo. + Tem certeza de que quer prosseguir? + <usetemplate ignoretext="Confirmar antes de largar anexos" name="okcancelignore" notext="Não" yestext="Sim"/> </notification> <notification name="JoinGroupCanAfford"> Unir-se a esse grupo custa L$[COST]. Deseja prosseguir? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Unir-se"/> </notification> + <notification name="JoinGroupNoCost"> + Você está prestes a entrar no grupo [NAME]. +Deseja continuar? + <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Entrar"/> + </notification> <notification name="JoinGroupCannotAfford"> Associar-se a este grupo custa L$[COST]. Você não tem L$ suficientes para associar-se a este grupo. </notification> + <notification name="CreateGroupCost"> + Criar este grupo custa L$100. +Grupos ser formados por mais de um membro, caso contrário serão definitivamente excluÃdos. +Convite outros membros dentro de 48 horas. + <usetemplate canceltext="Cancelar" name="okcancelbuttons" notext="Cancelar" yestext="Criar grupo por L$100"/> + </notification> <notification name="LandBuyPass"> Por L$[COST] você pode ingressar no terreno ('[PARCEL_NAME]') por [TIME] horas. Comprar um passe de acesso? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> @@ -268,36 +199,36 @@ Você não tem L$ suficientes para associar-se a este grupo. Por favor, selecione um indivÃduo para realizar a venda se o valor for 0 L$. </notification> <notification name="ConfirmLandSaleChange"> - [LAND_SIZE] m² selecionados de terra estão sendo configurados para venda. + [LAND_SIZE] m² selecionados de terreno estão sendo configurados para venda. Seu preço de venda será L$[SALE_PRICE] e está autorizado para venda para [NAME]. Gostaria de continuar a fazer essa alteração? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Continuar"/> </notification> <notification name="ConfirmLandSaleToAnyoneChange"> - ATENÇÃO: Ao clicar em 'vender para qualquer um' torna a sua terra disponÃvel para toda a comunidade [SECOND_LIFE], mesmo aqueles que não estão nesta região. + ATENÇÃO: Clicar em 'vender a qualquer um' torna o terreno disponÃvel para toda a comunidade do [SECOND_LIFE], inclusive residentes de outras regiões. -A área de [LAND_SIZE] m² de terra selecionada está posta para venda. -Seu preço de venda será L$ [SALE_PRICE] e está autorizado para [NAME]. +O terreno selecionado, de [LAND_SIZE] m², está sendo reservado para venda. +O preço será L$[SALE_PRICE] e [NAME] pode comprar o terreno. <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="ReturnObjectsDeededToGroup"> - Você tem certeza de que quer retornar todos os objetos compartilhados com o grupo '[NAME]' neste lote de terra, para o inventário do seu antigo Proprietário? + Tem certeza de que quer devolver todos os objetos compartilhados com o grupo '[NAME]' neste lote, para o inventário do seu antigo Proprietário? *AVISO* Isso irá deletar os objetos não transferÃveis doados ao grupo! Objetos: [N] - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Retornar"/> + <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Devolver"/> </notification> <notification name="ReturnObjectsOwnedByUser"> - Você tem certeza de que deseja retornar todos os objetos do residente '[NAME]' neste lote para o inventário dele? + Você tem certeza de que deseja devolver todos os objetos do residente '[NAME]' neste lote para o inventário dele? Objetos: [N] - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Retornar"/> + <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Devolver"/> </notification> <notification name="ReturnObjectsOwnedBySelf"> Você tem certeza de que deseja retornar todos os objetos de sua propriedade neste lote para seu inventário? Objetos: [N] - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Retornar"/> + <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Devolver"/> </notification> <notification name="ReturnObjectsNotOwnedBySelf"> Você tem certeza de que deseja retornar todos os objetos que NÃO são seus para o inventário de seus proprietários? @@ -306,7 +237,7 @@ Objetos transferÃveis doados ao grupo retornarão para seu proprietários. *AVISO* Isso fará com que os objetos não-transferÃveis sejam deletados! Objetos: [N] - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Retornar"/> + <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Devolver"/> </notification> <notification name="ReturnObjectsNotOwnedByUser"> Você tem certeza de que deseja retornar todos os objetos deste lote NÃO pertencentes a [NAME] para o inventário do proprietário? @@ -314,11 +245,11 @@ Objetos: [N] *AVISO* Esta ação irá apagar os objetos não transferÃveis doados ao grupo! Objetos: [N] - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Retornar"/> + <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Devolver"/> </notification> <notification name="ReturnAllTopObjects"> Você tem certeza de que deseja enviar todos os objetos listados de volta aos inventários de seus proprietários? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Retornar"/> + <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Devolver"/> </notification> <notification name="DisableAllTopObjects"> Você tem certeza que deseja desativar todos os objetos desta região? @@ -328,13 +259,19 @@ Objetos: [N] Retornar os objetos deste lote que NÃO são compartilhados com o grupo [NAME] de volta para seus proprietários? Objetos: [N] - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Retornar"/> + <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Devolver"/> </notification> <notification name="UnableToDisableOutsideScripts"> - Não é possÃvel desabilitar scripts externos. + Não é possÃvel desativar scripts externos. Toda esta região possui dano habilitado. Scripts devem ser permitidos para fazer as armas funcionarem. </notification> + <notification name="MultipleFacesSelected"> + Diversas faces foram selecionadas. +Se você optar por prosseguir, diversas ocorrências a mÃdia serão colocadas nas diferentes faces do objeto. +Para colocar a mÃdia em só uma face, selecione Selecionar face e clique na face desejada do objeto. Depois clique em Adicionar. + <usetemplate ignoretext="A mÃdia será colocada nas diferentes faces selecionadas." name="okcancelignore" notext="Cancelar" yestext="OK"/> + </notification> <notification name="MustBeInParcel"> Você deve permanecer dentro do lote para definir o ponto de aterrissagem. </notification> @@ -364,43 +301,59 @@ Scripts devem ser permitidos para fazer as armas funcionarem. Você deve concordar com os Termos de Serviço para continuar a entrar no [SECOND_LIFE]. </notification> <notification name="CouldNotPutOnOutfit"> - Não foi possÃvel vestir o conjunto. A pasta do conjunto não contém roupas, partes do corpo ou acessórios. + Não foi possÃvel vestir o look. A pasta do look não contém roupas, partes do corpo ou acessórios. </notification> <notification name="CannotWearTrash"> Não é possÃvel usar roupas ou partes do corpo que estão no lixo. </notification> + <notification name="MaxAttachmentsOnOutfit"> + Não foi possÃvel anexar o objeto. +Ele ultrapassa o limite de anexos, de [MAX_ATTACHMENTS] objetos. Remova um objeto para poder anexar outro. + </notification> <notification name="CannotWearInfoNotComplete"> - Você não pode vestir este item porque ele ainda não carregou. Por favor, tente novamente em um minuto. + Você não pode vestir este item porque ele ainda não carregou. Tente novamente em um minuto. </notification> <notification name="MustHaveAccountToLogIn"> Oops! Alguma coisa foi deixada em branco. Você precisa entrar com ambos os Nome e Sobrenome do seu avatar. -Você precisa de uma conta para entrar no [SECOND_LIFE]. Você gostaria de criar uma conta agora? +Você precisa de uma conta para entrar no [SECOND_LIFE]. Você gostaria de abrir uma conta agora? <url name="url"> https://join.secondlife.com/index.php?lang=pt-BR </url> - <usetemplate name="okcancelbuttons" notext="Tentar novamente" yestext="Criar uma nova conta"/> + <usetemplate name="okcancelbuttons" notext="Tentar novamente" yestext="Abrir conta"/> + </notification> + <notification name="InvalidCredentialFormat"> + Digite o nome e sobrenome do seu avatar no campo Nome de usuário, depois faça o login novamente. </notification> <notification name="AddClassified"> - Anúncios classificados aparecem na seção 'Classificados' do diretório de Busca e no [http://secondlife.com/community/classifieds/?lang=pt-BR secondlife.com] por uma semana. -Preencha seu anúncio e então clique 'Publicar...' para adicioná-lo ao diretório. -Será solicitado a você um preço a ser pago, quando você clicar Publicar. -Pagando mais, faz com que seu anúncio apareça em posição mais alta na lista e também em posição mais alta, quando as pessoas buscarem por palavras-chave. - <usetemplate ignoretext="Quando adicionando um Classificado novo" name="okcancelignore" notext="Cancelar" yestext="OK"/> + Os anúncios serão publicados na seção 'Classificados' das buscas e em [http://secondlife.com/community/classifieds secondlife.com] durante uma semana. +Escreva seu anúncio e clique em 'Publicar...' +Depois, decida quanto deseja pagar pelo anúncio. +Quanto mais você pagar, mais alto será o posicionamento do seu anúncio nos classficados e nos resultados de busca das suas palavras-chave. + <usetemplate ignoretext="Como colocar um anúncio" name="okcancelignore" notext="Cancelar" yestext="OK"/> </notification> <notification name="DeleteClassified"> Apagar classificado'[NAME]'? Não há reembolso por taxas já pagas. <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Apagar"/> </notification> + <notification name="DeleteMedia"> + Você optor por excluir a mÃdia associada a esta face. +Tem certeza de que quer prosseguir? + <usetemplate ignoretext="Confirmar antes de apagar mÃdia de objetos" name="okcancelignore" notext="Não" yestext="Sim"/> + </notification> <notification name="ClassifiedSave"> Salvar as mudanças no classificado [NAME]? <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Não Salvar" yestext="Salvar"/> </notification> + <notification name="ClassifiedInsufficientFunds"> + Fundos insuficientes para pagar o anúncio. + <usetemplate name="okbutton" yestext="OK"/> + </notification> <notification name="DeleteAvatarPick"> - Apagar pegar [PICK]? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Delete"/> + Excluir destaque <nolink>[PICK]</nolink>? + <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Apagar"/> </notification> <notification name="PromptGoToEventsPage"> Ir até a página web de enventos [SECOND_LIFE] ? @@ -410,31 +363,23 @@ Não há reembolso por taxas já pagas. <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Ir à página"/> </notification> <notification name="SelectProposalToView"> - Por favor, selecione uma proposta para visualizar. + Selecione uma proposta para visualizar. </notification> <notification name="SelectHistoryItemToView"> - Por favor, selecione um item do histórico para exibÃ-lo. - </notification> - <notification name="ResetShowNextTimeDialogs"> - Você gostaria de reabilitar todas estas pop ups que você indicou previamente como 'Não me mostrar novamente'? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="SkipShowNextTimeDialogs"> - Você gostaria de desabilitar todas as popups que podem ser puladas? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> + Selecione um item do histórico para exibi-lo. </notification> <notification name="CacheWillClear"> - O cache será limpo quando você reiniciar [APP_NAME]. + O cache será limpo quando o [APP_NAME] for iniciado. </notification> <notification name="CacheWillBeMoved"> - O Cache será removido após reiniciar [APP_NAME]. -Nota: Isto limpará o cache. + O cache será limpo quando o [APP_NAME] for iniciado. +Nota: Este procedimento limpa o cache. </notification> <notification name="ChangeConnectionPort"> - Configuração de porta terá efeito após reiniciar [APP_NAME]. + Reinicie o [APP_NAME] para ativar a reconfiguração da porta. </notification> <notification name="ChangeSkin"> - A nova pele será exibida após reiniciar [APP_NAME]. + Reinicie o [APP_NAME] para ativar a pele nova. </notification> <notification name="GoToAuctionPage"> Ir para a página do [SECOND_LIFE] para ver os detalhes do leilão ou fazer um lance? @@ -464,7 +409,7 @@ O objeto pode estar fora de alcance ou foi deletado. O objeto pode estar fora de alcance ou foi deletado. </notification> <notification name="SaveNotecardFailReason"> - Houve um problema em salvar uma nota devido a seguinte razão: [REASON]. Por favor, tente salvar a nota novamente mais tarde. + Houve um problema em salvar uma nota devido a seguinte razão: [REASON]. Tente salvar a nota novamente mais tarde. </notification> <notification name="ScriptCannotUndo"> Não foi possÃvel desfazer todas as mudanças na sua versão de script. @@ -473,7 +418,7 @@ Gostaria de carregar a última versão salva? <usetemplate name="okcancelbuttons" notext="Não" yestext="Sim"/> </notification> <notification name="SaveScriptFailReason"> - Houve um problema em salvar um script devido à seguinte razão: [REASON]. Por favor, tente salvar novamente o script mais tarde. + Houve um problema em salvar um script devido à seguinte razão: [REASON]. Tente salvar novamente o script mais tarde. </notification> <notification name="SaveScriptFailObjectNotFound"> Não foi possÃvel salvar o script pois o objeto em que ele está não pôde ser encontrado. @@ -482,6 +427,11 @@ O objeto pode estar fora de alcance ou ter sido deletado. <notification name="SaveBytecodeFailReason"> Houve um problema em salvar uma compilação de script devido a seguinte razão: [REASON]. Por favor, tente salvar novamente o script mais tarde. </notification> + <notification name="StartRegionEmpty"> + Oops, você ainda não definiu sua região de partida. +Digite o nome da região na caixa 'Ponto de partida' ou selecione 'Última localização' ou 'Meu inÃcio' como ponto de partida. + <usetemplate name="okbutton" yestext="OK"/> + </notification> <notification name="CouldNotStartStopScript"> Não foi possÃvel iniciar ou parar o script pois o objeto em que ele está não pôde ser encontrado. O objeto pode estar fora de alcance ou ter sido deletado. @@ -493,35 +443,35 @@ O objeto pode estar fora de alcance ou ter sido deletado. Não foi possÃvel escrever o arquivo [[FILE]] </notification> <notification name="UnsupportedHardware"> - Aviso: Seu sistema não é compatÃvel com os requisitos mÃnimos exigidos pelo [APP_NAME]. Se você continuar usando o [APP_NAME] pode experimentar uma performance ruim. Infelizmente não podemos oferecer suporte técnico para configurações de sistema não suportado. + Sabe de uma coisa? Seu computador não tem os requisitos mÃnimos do [APP_NAME]. Talvez o desempenho seja um pouco sofrÃvel. O suporte não pode atender pedidos de assistência técnicas em sistemas não suportados. -MINSPECS -Você deseja visitar [_URL] para maiores informações? +Consultar [_URL] para mais informações? <url name="url" option="0"> http://secondlife.com/support/sysreqs.php?lang=pt </url> - <usetemplate ignoretext="Ao detectar hardware não suportado" name="okcancelignore" notext="Não" yestext="Sim"/> + <usetemplate ignoretext="O hardware do meu computador não é suportado" name="okcancelignore" notext="Não" yestext="Sim"/> </notification> <notification name="UnknownGPU"> - Seu sistema possui uma placa gráfica que nos é desconhecido neste momento. -Este é normalmente o caso de um novo hardware que nós não tivemos a chance de testar. [APP_NAME] vai muito provavelmente executar corretamente, mas talvez seja necessário ajustar suas configurações de gráficos para algo mais apropriado. -(Menu Editar > Preferências > Gráficos). + A placa de vÃdeo do seu sistema não é reconhecida pelo [APP_NAME]. +Isto acontece quando novos hardwares que ainda não foram testados no [APP_NAME]. Talvez isso não cause problemas, mas pode ser preciso checar as configurações de vÃdeo. +( Eu > Preferências > VÃdeo) <form name="form"> - <ignore name="ignore" text="Ao detectar uma placa de vÃdeo desconhecida"/> + <ignore name="ignore" text="Minha placa de vÃdeo não foi reconhecida."/> </form> </notification> <notification name="DisplaySettingsNoShaders"> - [APP_NAME] travou quando inicializava os drivers gráficos. -A Qualidade Gráfica será ajustada para baixa, para evitar alguns erros comuns de drivers. -Isto irá desabilitar alguns atributos gráficos. -Nós recomendamos a atualização dos drivers de sua placa gráfica. -A Qualidade Gráfica pode ser aumentada no Preferências > Gráficos. + O [APP_NAME] sofreu uma pane ao iniciar os drivers de vÃdeo. +A Qualidade do vÃdeo será definida como baixa para evitar os erros de driver mais comuns. Assim, alguns recursos de vÃdeo serão desativados. +Tente atualizar o driver da sua placa de vÃdeo. +Para aumentar a qualidade do vÃdeo, vá para Preferências > VÃdeo. </notification> <notification name="RegionNoTerraforming"> A região [REGION] não permite ser aplainada. </notification> <notification name="CannotCopyWarning"> - Você não tem permissão para copiar este item e irá perdê-lo do seu inventário se entregá-lo a alguém. Quer realmente oferecer este item? + Você não tem autorização para copiar os itens abaixo: +[ITENS] +ao dá-los, você ficará sem eles no seu inventário. Deseja realmente dar estes itens? <usetemplate name="okcancelbuttons" notext="Não" yestext="Sim"/> </notification> <notification name="CannotGiveItem"> @@ -555,28 +505,31 @@ Ele ou ela vai ficar temporariamente incapaz de se mover, usar o bate-papo ou in <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Descongelar" yestext="Congelar"/> </notification> <notification name="EjectAvatarFullname"> - Ejetar [AVATAR_NAME] da sua terra? + Ejetar [AVATAR_NAME] do seu terreno? <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Ejetar e Banir" yestext="Ejetar"/> </notification> <notification name="EjectAvatarNoBan"> - Ejetar este avatar da sua terra? + Ejetar este avatar do seu terreno? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Ejetar"/> </notification> <notification name="EjectAvatarFullnameNoBan"> - Ejetar [AVATAR_NAME] da sua terra? + Ejetar [AVATAR_NAME] do seu terreno? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Ejetar"/> </notification> + <notification name="EjectAvatarFromGroup"> + Você ejetou [AVATAR_NAME] do grupo [GROUP_NAME] + </notification> <notification name="AcquireErrorTooManyObjects"> Erro de aquisição: Muitos objetos selecionados. </notification> <notification name="AcquireErrorObjectSpan"> Erro de aquisição: Objetos criados em mais de uma região. -Por favor, mova todos os objetos a serem adquiridos para uma mesma região. +Mova todos os objetos a serem adquiridos para uma mesma região. </notification> <notification name="PromptGoToCurrencyPage"> [EXTRA] -Vá para [_URL] para informação sobre compra de L$. +Para mais informações sobre como comprar L$, consulte [_URL]. <url name="url"> http://secondlife.com/app/currency/?lang=pt-BR </url> @@ -655,6 +608,11 @@ Esperada [VALIDS] <notification name="CannotEncodeFile"> ImpossÃvel codificar o arquivo: [FILE] </notification> + <notification name="CorruptedProtectedDataStore"> + Não foi possÃvel fazer a leitura dos dados protegidos, redefinindo. + Isso pode ocorrer após mudanças na configuração da rede. + <usetemplate name="okbutton" yestext="OK"/> + </notification> <notification name="CorruptResourceFile"> Fonte do arquivo corrompida: [FILE] </notification> @@ -665,12 +623,19 @@ Esperada [VALIDS] Incapaz de criar arquivo de saÃda: [FILE] </notification> <notification name="DoNotSupportBulkAnimationUpload"> - Atualmente, não suportamos o envio de arquivos de animação em massa. + O [APP_NAME] ainda não faz o upload de vários arquivos de animação de uma vez. </notification> <notification name="CannotUploadReason"> Incapaz de carregar [FILE] devido ao seguinte motivo: [REASON] Por favor tente novamente mais tarde. </notification> + <notification name="LandmarkCreated"> + Você adicionou "[LANDMARK_NAME]" a sua pasta [FOLDER_NAME]. + </notification> + <notification name="LandmarkAlreadyExists"> + Você já tem um marco deste lugar. + <usetemplate name="okbutton" yestext="OK"/> + </notification> <notification name="CannotCreateLandmarkNotOwner"> Você não pode criar um ponto de referência porque o proprietário do terreno não permite. Tente novamente a alguns metros de distância. </notification> @@ -693,6 +658,9 @@ Selecione objetos com scripts. Selecione objetos com scripts que você tem permissão para modificar. </notification> + <notification name="CannotOpenScriptObjectNoMod"> + ImpossÃvel abrir script em objeto sem ter autorização para modificar. + </notification> <notification name="CannotSetRunningSelectObjectsNoScripts"> Impossibilitado de definir quaisquer scripts para 'rodando'. @@ -715,49 +683,47 @@ Pesquisava por: [FINALQUERY] Os termos de sua pesquisa eram muito curtos então nenhuma pesquisa foi feita. </notification> <notification name="CouldNotTeleportReason"> - Não é possÃvel teletransportar-se. + O teletransporte falhou. [REASON] </notification> - - <notification name="invalid_tport"> -Problema encontrado ao processar seu pedido de Teletransporte. Você pode tentar reiniciar antes de tentar teletransportar-se. Se você continuar a receber esta mensagem, por favor verifique a FAQ do Suporte Técnico em: -www.secondlife.com/support - </notification> - <notification name="invalid_region_handoff"> -Problema encontrado ao processar a passagem de regiões. Você pode tentar reiniciar antes de tentar atravessar regiões novamente. Se você continuar a receber esta mensagem, por favor verifique a FAQ do Suporte Técnico em: -www.secondlife.com/support - </notification> - <notification name="blocked_tport"> -Desculpe, teletransportes estão atualmente bloqueados. Tente novamente dentro de alguns instantes. Se você continuar com problemas de teletransporte, por favor tente deslogar e relogar para resolver o problema. - </notification> - <notification name="nolandmark_tport"> -Desculpe, mas o sistema não conseguiu localizar a landmark de destino. - </notification> - <notification name="timeout_tport"> -Desculpe, não foi possÃvel para o sistema executar o teletransporte. Tente novamente dentro de alguns instantes. - </notification> - <notification name="noaccess_tport"> -Desculpe, você não tem acesso ao destino deste teletransporte. - </notification> - <notification name="missing_attach_tport"> -Seu anexos ainda não chegaram. Tente esperar por alguns momentos ou deslogar e logar antes de tentar teleransportar-se novamente. - </notification> - <notification name="too_many_uploads_tport"> -Afluxo nesta região é atualmente tão alto que seu pedido de teletransporte não será possÃvel em tempo oportuno. Por favor, tente novamente em alguns minutos ou vá a uma área menos ocupada. - </notification> - <notification name="expired_tport"> -Desculpe, mas o sistema não conseguiu concluir o seu pedido de teletransporte em tempo hábil. Por favor, tente novamente em alguns minutos. - </notification> - <notification name="expired_region_handoff"> -Desculpe, mas o sistema não pôde concluir a sua travessia de região em tempo hábil. Por favor, tente novamente em alguns minutos. - </notification> - <notification name="no_host"> -Não foi possÃvel encontrar o destino do teletransporte. O destino pode estar temporariamente indisponÃvel ou não existir mais. Por favor, tente novamente em poucos minutos. - </notification> - <notification name="no_inventory_host"> -O sistema de inventário está indisponÃvel no momento. - </notification> - + <notification name="invalid_tport"> + Houve um problema ao processar o teletransporte. Talvez seja preciso sair e entrar do Second Life para fazer o teletransporte. +Se você continuar a receber esta mensagem, consulte [SUPPORT_SITE]. + </notification> + <notification name="invalid_region_handoff"> + Problema encontrado ao processar a passagem de regiões. Talvez seja preciso sair e entrar do Second Life atravessar regiões novamente. +Se você continuar a receber esta mensagem, consulte [SUPPORT_SITE]. + </notification> + <notification name="blocked_tport"> + Desculpe, teletransportes estão atualmente bloqueados. Tente novamente dentro de alguns instantes. Se você continuar com problemas de teletransporte, por favor tente deslogar e relogar para resolver o problema. + </notification> + <notification name="nolandmark_tport"> + Desculpe, mas o sistema não conseguiu localizar a landmark de destino. + </notification> + <notification name="timeout_tport"> + Desculpe, não foi possÃvel para o sistema executar o teletransporte. Tente novamente dentro de alguns instantes. + </notification> + <notification name="noaccess_tport"> + Desculpe, você não tem acesso ao destino deste teletransporte. + </notification> + <notification name="missing_attach_tport"> + Seu anexos ainda não chegaram. Tente esperar por alguns momentos ou deslogar e logar antes de tentar teleransportar-se novamente. + </notification> + <notification name="too_many_uploads_tport"> + Afluxo nesta região é atualmente tão alto que seu pedido de teletransporte não será possÃvel em tempo oportuno. Por favor, tente novamente em alguns minutos ou vá a uma área menos ocupada. + </notification> + <notification name="expired_tport"> + Desculpe, mas o sistema não conseguiu concluir o seu pedido de teletransporte em tempo hábil. Por favor, tente novamente em alguns minutos. + </notification> + <notification name="expired_region_handoff"> + Desculpe, mas o sistema não pôde concluir a sua travessia de região em tempo hábil. Por favor, tente novamente em alguns minutos. + </notification> + <notification name="no_host"> + Não foi possÃvel encontrar o destino do teletransporte. O destino pode estar temporariamente indisponÃvel ou não existir mais. Por favor, tente novamente em poucos minutos. + </notification> + <notification name="no_inventory_host"> + O sistema de inventário está indisponÃvel no momento. + </notification> <notification name="CannotSetLandOwnerNothingSelected"> Incapaz de estabelecer o proprietário do terreno: Nenhum lote selecionado. @@ -766,7 +732,8 @@ Nenhum lote selecionado. Não é possÃvel exigir a posse do terreno porque a seleção alcançou múltiplas regiões. Por favor, selecione uma área menor e tente novamente. </notification> <notification name="ForceOwnerAuctionWarning"> - Este lote está oferecido em leilão. Exigir a posse do terreno irá cancelar o leilão e possivelmente deixará alguns residentes infelizes, se os lances já começaram. Exigir posse? + Este lote vai a leilão. Forçar a mudança do dono cancela o leilão, podendo deixar residentes que já deram lances insatisfeitos. +Deseja forçar mudança de dono? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Retomar"/> </notification> <notification name="CannotContentifyNothingSelected"> @@ -794,7 +761,7 @@ Nenhum lote selecionado. Não é possÃvel achar a região em que este terreno se encontra. </notification> <notification name="CannotCloseFloaterBuyLand"> - Você não pode fechar a janela de Compra de Terreno até que o [APP_NAME] calcule o preço desta transação. + A janela Comprar terreno poderá ser fechada quando o [APP_NAME] determinar o preço da transação. </notification> <notification name="CannotDeedLandNothingSelected"> Não é possÃvel transferir posse do terreno: @@ -805,41 +772,33 @@ Nenhum lote selecionado. Nenhum grupo selecionado. </notification> <notification name="CannotDeedLandNoRegion"> - Não é possÃvel transferir posse do terreno: -Não é possÃvel se achar a região em que este terreno se encontra. + Houve um problema ao processar a doação do terreno: +A região do terreno não pôde ser localizada. </notification> <notification name="CannotDeedLandMultipleSelected"> - Impossibilitado de passar a propriedade da terra: -Selecionados vários lotes. + Não é possÃvel doar o terreno: +Vários lotes foram selecionados. Tente selecionar um único lote. </notification> - <notification name="ParcelCanPlayMedia"> - Esta localidade pode executar fluxo de mÃdia. -Fluxo de mÃdia necessita de uma conexão de Internet rápida. - -Executar fluxo de mÃdia quando disponÃvel? -(Você pode mudar esta opção mais tarde no Preferências > Ãudio & VÃdeo.) - <usetemplate name="okcancelbuttons" notext="Desabilitar" yestext="Exibir MÃdia"/> - </notification> <notification name="CannotDeedLandWaitingForServer"> - Impossibilitado de passar a propriedade da terra: -Esperando pelo servidor informar de quem é a propriedade. + Não é possÃvel doar o terreno: +Esperando o servidor informar de quem é a propriedade. Por favor, tente novamente. </notification> <notification name="CannotDeedLandNoTransfer"> - Não é possÃvel transferir posse do terreno: -A região [REGION] não permite transferência do terreno. + Não é possÃvel doar o terreno: +A região [REGION] não permite transferências de terreno. </notification> <notification name="CannotReleaseLandWatingForServer"> - Impossibilitado de abandonar a terra: + Não é possÃvel abandonar o terreno: Esperando o servidor atualizar as informações do lote. Tente novamente em alguns segundos. </notification> <notification name="CannotReleaseLandSelected"> - Impossibilitado de abandonar a terra: + Não é possÃvel abandonar o terreno: Você não é dono de todos os lotes selecionados. Por favor, selecione um único lote. @@ -850,33 +809,33 @@ Você não tem permissão de liberar este lote. Os lotes que você possui estão em verde. </notification> <notification name="CannotReleaseLandRegionNotFound"> - Impossibilitado de abandonar a terra: -Não consegue achar a região em que esta terra se encontra. + Houve um problema ao processar o abandono do terreno: +A região do terreno não pôde ser localizada. </notification> <notification name="CannotReleaseLandNoTransfer"> Não é possÃvel abandonar terreno: A região [REGION] não permite transferência de terreno. </notification> <notification name="CannotReleaseLandPartialSelection"> - Impossibilitado de abandonar a terra: -Você deve selecionar um lote inteiro para liberá-lo. + Não é possÃvel abandonar o terreno: +Selecione um lote inteiro e abra mão dele. Selecione um lote inteiro ou primeiro divida seu lote. </notification> <notification name="ReleaseLandWarning"> - Você está para liberar [AREA] m² de terra. -Liberando este terreno, o liberará de suas posses, mas não lhe concederá quaisquer L$. + Você está prestes a abrir mão de [AREA] m². +Ao abrir mão deste terreno, ele deixa de ser uma propriedade. Note que você não receberá nenhum L$. -Liberar esta terra? +Abrir mão deste terreno? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Renunciar"/> </notification> <notification name="CannotDivideLandNothingSelected"> - Impossibilitado de dividir a terra: + Não é possÃvel dividir o terreno: -Nenhum lote selecionado. +Nenhum lote foi selecionado. </notification> <notification name="CannotDivideLandPartialSelection"> - Impossibilitado de dividir a terra: + Não é possÃvel dividir o terreno: Você selecionou um lote inteiro. Tente selecionar uma parte do lote. @@ -888,49 +847,38 @@ Quer dividir o terreno? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Dividir"/> </notification> <notification name="CannotDivideLandNoRegion"> - Impossibilitado de dividir a terra: -Não consegue achar a região em que esta terra se encontra. + Houve um problema ao processar a divisão do terreno: +A região do terreno não pôde ser localizada. </notification> <notification name="CannotJoinLandNoRegion"> - Impossibilitado de unir a terra: -Não consegue achar a região em que esta terra se encontra. + Houve um problema ao processar a união dos terrenos: +A região do terreno não pôde ser localizada. </notification> <notification name="CannotJoinLandNothingSelected"> - Não é possÃvel unir terreno: + Não é possÃvel unir os terrenos: Nenhum lote selecionado. </notification> <notification name="CannotJoinLandEntireParcelSelected"> - Impossibilitado de unir a terra: + Não é possÃvel unir os terrenos: Você selecionou apenas um lote. Selecione a terra através de ambos os lotes. </notification> <notification name="CannotJoinLandSelection"> - Impossibilitado de unir a terra: + Não é possÃvel unir os terrenos: Você deve selecionar mais de um lote. -Selecione a terra através de ambos os lotes. +Selecione terrenos localizados em dois lotes. </notification> <notification name="JoinLandWarning"> - Unir esta terra vai criar um grande lote que envolve todos os lotes que intersectam o retângulo selecionado. + Unir os terrenos vai criar um grande lote, formado por todos os lotes que intersectam o retângulo selecionado. Você vai ter que redefinir nome e as opções do novo lote. -Unir a terra? +Unir os terrenos? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Unir"/> </notification> - <notification name="ShowOwnersHelp"> - Mostrar donos: -Colorir os lotes para mostrar o tipo de dono. - -Green = Sua terra -Aqua = Terra do seu Grupo -Red = PossuÃda por outros -Yellow = À venda -Purple = A leilão -Grey = Pública - </notification> <notification name="ConfirmNotecardSave"> - Esta nota precisa ser salva antes do item ser copiado ou visualizado. Salvar nota? + Esta anotação precisa ser salva antes de o item ser copiado ou visualizado. Salvar anotação? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Salvar"/> </notification> <notification name="ConfirmItemCopy"> @@ -950,13 +898,12 @@ Grey = Pública Não é possÃvel salvar '[NAME]' para um arquivo de vestimenta. Você precisa liberar algum espaço no seu computador e salvar o arquivo novamente. </notification> <notification name="CannotSaveToAssetStore"> - Impossibilitado de salvar [NAME] no armazenamento central de ativos. -Isso é geralmente uma falha temporária. Por favor personalize e salve novamente a vestimenta em poucos minutos. + Ocorreu um problema ao salvar [NAME]. +Em geral, essa é uma falha técnica temporária. Personalize e volte a salvar o item novamente dentro de alguns minutos. </notification> <notification name="YouHaveBeenLoggedOut"> - Você foi deslogado do [SECOND_LIFE]: + Ah não! O [SECOND_LIFE] teve de fechar. [MESSAGE] -Você ainda pode olhar o bate-papo e as mensagens instantâneas existentes, clicando em 'Exibir IM & bate-papo'. Caso contrário, clique em 'Sair' para sair do [APP_NAME] imediatamente. <usetemplate name="okcancelbuttons" notext="Sair" yestext="Exibir IM & bate-papo"/> </notification> <notification name="OnlyOfficerCanBuyLand"> @@ -981,6 +928,36 @@ Oferecer amizade para [NAME]? <button name="Cancel" text="Cancelar"/> </form> </notification> + <notification label="Salvar este look" name="SaveOutfitAs"> + Veja o meu novo visual: + <form name="form"> + <input name="message"> + [DESC] (novo) + </input> + <button name="Offer" text="OK"/> + <button name="Cancel" text="Cancelar"/> + </form> + </notification> + <notification label="Salvar item de vestuário" name="SaveWearableAs"> + Salvar item no meu inventário como: + <form name="form"> + <input name="message"> + [DESC] (novo) + </input> + <button name="Offer" text="OK"/> + <button name="Cancel" text="Cancelar"/> + </form> + </notification> + <notification label="Renomear look" name="RenameOutfit"> + Nome do novo look: + <form name="form"> + <input name="new_name"> + [NAME] + </input> + <button name="Offer" text="OK"/> + <button name="Cancel" text="Cancelar"/> + </form> + </notification> <notification name="RemoveFromFriends"> Você quer remover [FIRST_NAME] [LAST_NAME] da sua lista de amigos? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Remover"/> @@ -1015,6 +992,12 @@ em TODOS OS TERRENOS deste sim? Por favor, insira um valor maior. </notification> + <notification name="ConfirmItemDeleteHasLinks"> + Pelo menos um dos itens possui links que levam a ele. Ao excluir o item, os links não funcionarão mais. Por isso, recomendamos excluir os links primeiro. + +Tem certeza de que quer excluir estes items? + <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> + </notification> <notification name="ConfirmObjectDeleteLock"> Pelo menos um dos itens que você selecionou está trancado. @@ -1080,24 +1063,23 @@ Tem certeza de que deseja pegar estes itens? <usetemplate name="okcancelbuttons" notext="Não" yestext="Sim"/> </notification> <notification name="CantBuyLandAcrossMultipleRegions"> - Não foi possÃvel comprar terreno, pois a seleção abrange várias regiões. + Não foi possÃvel comprar o terreno, pois a seleção abrange várias regiões. Por favor, selecione uma área menor e tente novamente. </notification> <notification name="DeedLandToGroup"> - Na transferência de propriedade deste lote, o grupo deverá ter e manter créditos suficientes de uso da terra. -O preço de aquisição dos terrenos não é restituÃdo ao o proprietário. Se uma parcela transferida é vendida, o preço de venda é dividido igualmente entre os membros do grupo. + No ato da doação deste lote, o grupo deverá ter e manter créditos suficientes para ter o terreno. +O preço de aquisição dos terrenos não é restituÃdo ao proprietário. Se uma parcela doada for vendida, o preço de venda é dividido igualmente entre os membros do grupo. -Transferir propriedade de [AREA] m² de terra ao grupo '[GROUP_NAME]'? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Acionar"/> +Doar [AREA] m² ao grupo '[GROUP_NAME]'? + <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="DeedLandToGroupWithContribution"> - Na transferência de propriedade deste lote, o grupo deverá ter e manter créditos suficientes de uso da terra. -A Transferência incluirá uma contribuição de terra simultanea para o grupo de '[FIRST_NAME] [LAST_NAME]'. -O preço da compra não será restituÃdo ao proprietário. Se um lote for vendido, o preço da venda será dividido igualmente entre os membros do grupo. + No ato da doação deste lote, o grupo deverá ter e manter créditos suficientes para ter o terreno. A doação inclui uma contribuição simultânea para o grupo de '[FIRST_NAME] [LAST_NAME]'. +O preço de aquisição dos terrenos não é restituÃdo ao proprietário. Se uma parcela doada for vendida, o preço de venda é dividido igualmente entre os membros do grupo. -Transferir propriedade destes [AREA] m² de terreno para o grupo '[GROUP_NAME]'? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Acionar"/> +Doar [AREA] m² para o grupo '[GROUP_NAME]'? + <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="DisplaySetToSafe"> Configurações de display foram ajustadas para nÃveis de segurança porque você especificou -- opção de segurança. @@ -1107,30 +1089,39 @@ Transferir propriedade destes [AREA] m² de terreno para o grupo '[GROUP_NA </notification> <notification name="ErrorMessage"> [ERROR_MESSAGE] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="AvatarMovedDesired"> + Esse destino não está disponÃvel no momento. +Você chegou a uma região próxima. + </notification> + <notification name="AvatarMovedLast"> + Esse destino não está disponÃvel no momento. +Você chegou a uma região próxima. </notification> - <notification name="AvatarMoved"> - Sua [TYPE] localização não está disponÃvel no momento. - [HELP] -Você foi movido para uma região vizinha. + <notification name="AvatarMovedHome"> + Esse destino não está disponÃvel no momento. +Você chegou a uma região próxima. +Pense em usar outra região como seu inÃcio. </notification> <notification name="ClothingLoading"> - Sua vestimenta ainda está baixando. -Você pode usar o [SECOND_LIFE] normalmente e os outros o visualizarão corretamente. + As suas roupas estão sendo transferidas. +Enquando isso, use o [SECOND_LIFE] normalmente. Seu visual será exibido corretamente. <form name="form"> - <ignore name="ignore" text="Quando o vestuário está levando muito tempo para fazer download"/> + <ignore name="ignore" text="A roupa está demorando para chegar"/> </form> </notification> <notification name="FirstRun"> - A instalação do [APP_NAME] está completa. + A instalação do [APP_NAME] está pronta. -Se esta é a primeira vez usando o[SECOND_LIFE], será necessário que você crie uma conta antes de poder se logar. -Retornar a [https://join.secondlife.com/index.php?lang=pt-BR secondlife.com] para criar uma nova conta? +Se você ainda não conhece o [SECOND_LIFE], basta criar uma conta para começar. +Voltar para [http://join.secondlife.com secondlife.com] para criar sua conta? <usetemplate name="okcancelbuttons" notext="Continuar" yestext="Nova conta.."/> </notification> <notification name="LoginPacketNeverReceived"> - Estamos com problemas de conexão. Pode ser problema com a conexão de sua internet ou com os servidores do [SECOND_LIFE]. + Estamos detectando um problema de conexão. Pode haver um problema com a sua conexão à internet ou com o [SECOND_LIFE_GRID]. -Voce tanto pode checar a conexão de sua internet e tentar novamente em alguns minutos, ou clicar em Teletransporte para tentar teletransportar-se para sua casa. +Cheque sua conexão e tente em alguns minutos, clique na Ajuda para acessar o [SUPPORT_SITE], ou tente voltar para casa clicando em 'Teletransportar'. <url name="url"> http://br.secondlife.com/support/ </url> @@ -1148,14 +1139,50 @@ Pressione a tecla F1 para ajuda ou aprender mais sobre [SECOND_LIFE]. Por favor, escolha se o seu avatar é feminino ou masculino. Você pode mudar de idéia depois. <usetemplate name="okcancelbuttons" notext="Feminino" yestext="Masculino"/> </notification> + <notification name="CantTeleportToGrid"> + Não foi possÃvel ir para [SLURL], que fica em outro grid ([GRID]) em relação ao grid atual, ([CURRENT_GRID]). Feche o Visualizador e tente novamente. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="GeneralCertificateError"> + Falha de conexão com o servidor. +[REASON] + +SubjectName: [SUBJECT_NAME_STRING] +IssuerName: [ISSUER_NAME_STRING] +Válido de: [VALID_FROM] +Válido até: [VALID_TO] +MD5 Fingerprint: [SHA1_DIGEST] +Impressão digital SHA1: [MD5_DIGEST] +Uso da chave: [KEYUSAGE] +Uso estendido da chave: [EXTENDEDKEYUSAGE] +Identificador chave de assunto: [SUBJECTKEYIDENTIFIER] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="TrustCertificateError"> + A autoridade de certificação deste servidor é desconhecida. + +Dados do certificado: +SubjectName: [SUBJECT_NAME_STRING] +IssuerName: [ISSUER_NAME_STRING] +Válido de: [VALID_FROM] +Válido até: [VALID_TO] +MD5 Fingerprint: [SHA1_DIGEST] +Impressão digital SHA1: [MD5_DIGEST] +Uso da chave: [KEYUSAGE] +Uso estendido da chave: [EXTENDEDKEYUSAGE] +Identificador chave de assunto: [SUBJECTKEYIDENTIFIER] + +Confiar nesta autoridade? + <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Confiança"/> + </notification> <notification name="NotEnoughCurrency"> [NAME] L$ [PRICE] Você não possui suficientes L$ para fazer isso. </notification> <notification name="GrantedModifyRights"> - Foi garantido à você o privilégio de alterar o(s) objeto(s) de [FIRST_NAME] [LAST_NAME]' + [NAME] autorizou você a editar seus objetos. </notification> <notification name="RevokedModifyRights"> - Seu privilégio para alterar o(s) objeto(s) de [FIRST_NAME] [LAST_NAME]'s foi removido. + Seu direito de modificar objetos do/da [NAME] foi revogado </notification> <notification name="FlushMapVisibilityCaches"> Isto irá descarregar os caches de mapa relativos a esta região. @@ -1171,7 +1198,7 @@ Isso é realmente útil apenas para depuração. <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="KickUsersFromRegion"> - Teletransportar para casa todos os residentes nesta região? + Teletransportar para o inÃcio todos os residentes nesta região? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="EstateObjectReturn"> @@ -1232,113 +1259,126 @@ Por favor, ponha o objeto à venda e tente novamente. [DOWNLOAD_PATH] </notification> <notification name="DownloadWindowsMandatory"> - Uma nova versão do [APP_NAME] está disponÃvel. + Existe uma nova versão do [APP_NAME] [MESSAGE] -Você deve baixar essa atualização para utilizar o [APP_NAME]. +Baixe a atualização para usar o [APP_NAME]. <usetemplate name="okcancelbuttons" notext="Sair" yestext="Atualizar"/> </notification> <notification name="DownloadWindows"> - Uma versão atualizada do [APP_NAME] está disponÃvel. + Existe uma nova versão do [APP_NAME] [MESSAGE] -Essa atualização não é mandatória, mas sugerimos que você a instale para melhorar a performance e a estabilidade. +Não é preciso passar para a nova versão, mas ela pode melhorar o desempenho e estabilidade do visualizador. <usetemplate name="okcancelbuttons" notext="Continuar" yestext="Atualizar"/> </notification> <notification name="DownloadWindowsReleaseForDownload"> - Uma versão atualizada do [APP_NAME] está disponÃvel. + Existe uma nova versão do [APP_NAME] [MESSAGE] -Essa atualização não é mandatória, mas sugerimos que você a instale para melhorar a performance e a estabilidade. +Não é preciso passar para a nova versão, mas ela pode melhorar o desempenho e estabilidade do visualizador. <usetemplate name="okcancelbuttons" notext="Continuar" yestext="Atualizar"/> </notification> + <notification name="DownloadLinuxMandatory"> + Existe uma nova versão do [APP_NAME] +[MESSAGE] +Baixe a atualização para usar o [APP_NAME]. + <usetemplate name="okcancelbuttons" notext="Sair" yestext="Baixar"/> + </notification> + <notification name="DownloadLinux"> + Existe uma nova versão do [APP_NAME] +[MESSAGE] +Não é preciso passar para a nova versão, mas ela pode melhorar o desempenho e estabilidade. + <usetemplate name="okcancelbuttons" notext="Continuar" yestext="Baixar"/> + </notification> + <notification name="DownloadLinuxReleaseForDownload"> + Existe uma nova versão do [APP_NAME] +[MESSAGE] +Não é preciso passar para a nova versão, mas ela pode melhorar o desempenho e estabilidade. + <usetemplate name="okcancelbuttons" notext="Continuar" yestext="Baixar"/> + </notification> <notification name="DownloadMacMandatory"> - Uma nova versão do [APP_NAME] está disponÃvel. + Existe uma nova versão do [APP_NAME] [MESSAGE] -Você deve baixar esta atualização para utilizar o [APP_NAME]. +Baixe a atualização para usar o [APP_NAME]. -Baixar para sua pasta de Aplicativos? +Salvar na pasta Aplicativos? <usetemplate name="okcancelbuttons" notext="Sair" yestext="Atualizar"/> </notification> <notification name="DownloadMac"> - Uma nova versão do [APP_NAME] está disponÃvel. + Existe uma nova versão do [APP_NAME] [MESSAGE] -Essa atualização não é mandatória, mas sugerimos que você a instale para melhorar a performance e a estabilidade. +Não é preciso passar para a nova versão, mas ela pode melhorar o desempenho e estabilidade do visualizador. -Baixar para a sua pasta de Aplicativos? +Salvar na pasta Aplicativos? <usetemplate name="okcancelbuttons" notext="Continuar" yestext="Atualizar"/> </notification> <notification name="DownloadMacReleaseForDownload"> - Uma nova versão do [APP_NAME] está disponÃvel. - + Existe uma nova versão do [APP_NAME] [MESSAGE] -Essa atualização não é mandatória, mas sugerimos que você a instale para melhorar a performance e a estabilidade. +Não é preciso passar para a nova versão, mas ela pode melhorar o desempenho e estabilidade do visualizador. -Baixar para sua pasta de Aplicativos? +Salvar na pasta Aplicativos? <usetemplate name="okcancelbuttons" notext="Continuar" yestext="Atualizar"/> </notification> <notification name="DeedObjectToGroup"> Delegar este objeto causará ao grupo: * Receber os L$ pagos ao objeto - <usetemplate ignoretext="Ao transferir objetos aos grupos" name="okcancelignore" notext="Cancelar" yestext="Acionar"/> + <usetemplate ignoretext="Confirmar doações de um objeto a um grupo antes de fazer a doação" name="okcancelignore" notext="Cancelar" yestext="Acionar"/> </notification> <notification name="WebLaunchExternalTarget"> - Abrir o navegador do seu sistema para ver este conteúdo? - <usetemplate ignoretext="Ao abrir o navegador web do seu sistema para visualizar uma página Web" name="okcancelignore" notext="Cancelar" yestext="OK"/> + Abrir uma janela do navegador para ver essas informações? + <usetemplate ignoretext="Abrir o navegador para acessar uma página na web" name="okcancelignore" notext="Cancelar" yestext="OK"/> </notification> <notification name="WebLaunchJoinNow"> - Ir ao www.secondlife.com para gerenciar sua conta? - <usetemplate ignoretext="Ao abrir o navegador web para gerenciar sua conta" name="okcancelignore" notext="Cancelar" yestext="OK"/> + Deseja abrir o [http://secondlife.com/account/ Painel] para gerenciar sua conta? + <usetemplate ignoretext="Abrir o navegador para acessar minha conta" name="okcancelignore" notext="Cancelar" yestext="OK"/> </notification> <notification name="WebLaunchSecurityIssues"> Visite a Wiki do [SECOND_LIFE] para detalhes de como Reportar um Problema de Segurança. - <usetemplate ignoretext="Ao abrir o navegador da web para visualizar a Wiki de Problemas de Segurança" name="okcancelignore" notext="Cancelar" yestext="OK"/> + <usetemplate ignoretext="Abrir o navegador para ver como denunciar uma ocorrência" name="okcancelignore" notext="Cancelar" yestext="OK"/> </notification> <notification name="WebLaunchQAWiki"> Visite o Wiki de QA do [SECOND_LIFE]. - <usetemplate ignoretext="Ao abrir o navegador web para visualizar a Wiki de QA" name="okcancelignore" notext="Cancelar" yestext="OK"/> + <usetemplate ignoretext="Abrir meu navegador para ver a página Wiki" name="okcancelignore" notext="Cancelar" yestext="OK"/> </notification> <notification name="WebLaunchPublicIssue"> Visite o Rastreador Público de Problemas do [SECOND_LIFE], onde você poderá reportar Bugs e outros Problemas. - <usetemplate ignoretext="Ao abrir o navegador web para visualizar o Rastreador Público de Problemas" name="okcancelignore" notext="Cancelar" yestext="Ir para a Página"/> - </notification> - <notification name="WebLaunchPublicIssueHelp"> - Visite a Wiki [SECOND_LIFE] para informações sobre como utilizar o Rastrador de Público de Problemas. - <usetemplate ignoretext="Ao abrir o navegador web para visualizar a wiki do Rastreador Público de Problemas" name="okcancelignore" notext="Cancelar" yestext="Ir para a página"/> + <usetemplate ignoretext="Abrir o navegador para usar o Monitor de problemas" name="okcancelignore" notext="Cancelar" yestext="Ir para a Página"/> </notification> <notification name="WebLaunchSupportWiki"> Ir até o Blog Oficial da Linden buscar pelas últimas notÃcias e informações. - <usetemplate ignoretext="Ao abrir o navegador da web para visualizar o blog" name="okcancelignore" notext="Cancelar" yestext="Ir até a página"/> + <usetemplate ignoretext="Abrir meu navegador para ler o blog" name="okcancelignore" notext="Cancelar" yestext="Ir até a página"/> </notification> <notification name="WebLaunchLSLGuide"> - Ir para a página guia do LSL para ajuda com script? - <usetemplate ignoretext="Ao abrir o navegador web para visualizar o Guia de Scripts." name="okcancelignore" notext="Cancelar" yestext="Ir para a página"/> + Abrir o Guia de scripts para obter ajuda? + <usetemplate ignoretext="Abrir meu navegador para usar o Guia de scripts" name="okcancelignore" notext="Cancelar" yestext="Ir para a página"/> </notification> <notification name="WebLaunchLSLWiki"> - Ir para o portal LSL para ajuda com script? - <usetemplate ignoretext="Ao abrir o navegador da web para visualizar o Portal de LSL" name="okcancelignore" notext="Cancelar" yestext="Ir para a página"/> + Consultar o LSL Portal para obter ajuda com scripts? + <usetemplate ignoretext="Abrir meu navegador para consultar o LSL Portal" name="okcancelignore" notext="Cancelar" yestext="Ir para a página"/> </notification> <notification name="ReturnToOwner"> Você tem certeza que deseja retornar os objetos selecionados para seus proprietários? Objetos transferÃveis doados irão retornar aos proprietários anteriores. *AVISO* Objetos doados não – transferÃveis serão deletados! - <usetemplate ignoretext="Ao retornar objetos a seus proprietários" name="okcancelignore" notext="Cancelar" yestext="Retornar"/> + <usetemplate ignoretext="Confirmar antes de devolver objetos a seus donos" name="okcancelignore" notext="Cancelar" yestext="Retornar"/> </notification> <notification name="GroupLeaveConfirmMember"> Você é atualmente um membro do grupo [GROUP]. -Deixar este grupo? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Deixar"/> +Sair do grupo? + <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Sair"/> </notification> <notification name="ConfirmKick"> - Você quer REALMENTE expulsar todos os usuários deste grid? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Expulsar todos os usuários"/> + Tem CERTEZA de que deseja expulsar todos os residentes do grid? + <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Chutar todos"/> </notification> <notification name="MuteLinden"> - Desculpe, você não pode silenciar um Linden. + Desculpe, nenhum Linden pode ser bloqueado. <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="CannotStartAuctionAlreadyForSale"> - Você não pode começar um leilão com um lote que já foi colocado à venda. Desabilite a venda da terra se você tem certeza que deseja iniciar um leilão. + Você não pode começar um leilão com um lote que já foi colocado à venda. Desabilite a venda se você tem certeza que deseja fazer um leilão. </notification> - <notification label="Silenciar objeto pelo nome falhou" name="MuteByNameFailed"> - Você já silenciou este nome. + <notification label="Falha ao bloquear objeto por nome" name="MuteByNameFailed"> + Você já bloqueou este residente. <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="RemoveItemWarn"> @@ -1354,18 +1394,21 @@ Deixar este grupo? <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="BusyModeSet"> - Definido o Modo Ocupado. -Bate-papo e mensagens instantâneas serão escondidas. Mensagens instantâneas irão receber a sua resposta de modo ocupado. Todas as ofertas de teletransporte serão recusadas. Todas as ofertas de inventário irão para a sua Lixeira. - <usetemplate ignoretext="Ao definir o Modo Ocupado" name="okignore" yestext="OK"/> + Modo ocupado ativado. +O bate-papo e MIs não serão exibidos. MIs enviadas para você receberão sua resposta de modo ocupado. Todas as ofertas de teletransporte serão recusadas. Todas as ofertas de inventário serão colocadas na Lixeira. + <usetemplate ignoretext="Passar meu status para o modo ocupado" name="okignore" yestext="OK"/> </notification> <notification name="JoinedTooManyGroupsMember"> - Você já pertence a muitos grupos para entrar em outro. Por favor, deixe pelo menos um grupo antes de entrar neste. Para sair de um grupo, selecione o Menu Editar e a opção Meus 'Grupos...' -[NAME] convidou você para entrar num grupo como membro. -[INVITE] + Você atingiu o limite máximo de grupos. Saia de outro grupo para poder entrar nesse ou recuse o convite. +[NAME] está te convidando para entrar em um grupo. <usetemplate name="okcancelbuttons" notext="Recusar" yestext="Entrar"/> </notification> + <notification name="JoinedTooManyGroups"> + Você atingiu o limite máximo de grupos. Sai de um grupo para entrar ou criar outro. + <usetemplate name="okbutton" yestext="OK"/> + </notification> <notification name="KickUser"> - Expulsar este usuário com qual mensagem? + Chutar este residente com qual mensagem? <form name="form"> <input name="message"> Um administrador desligou você. @@ -1385,7 +1428,7 @@ Bate-papo e mensagens instantâneas serão escondidas. Mensagens instantâneas i </form> </notification> <notification name="FreezeUser"> - Paralise este usuário com qual mensagem? + Congelar este residente com qual mensagem? <form name="form"> <input name="message"> Você foi congelado. Você não pode se mover ou conversar. Um administrador irá contatá-lo via mensagem instantânea (MI). @@ -1395,7 +1438,7 @@ Bate-papo e mensagens instantâneas serão escondidas. Mensagens instantâneas i </form> </notification> <notification name="UnFreezeUser"> - Liberar este usuário com qual mensagem? + Descongelar este residente com qual mensagem? <form name="form"> <input name="message"> Você não está mais congelado. @@ -1415,7 +1458,7 @@ Bate-papo e mensagens instantâneas serão escondidas. Mensagens instantâneas i </form> </notification> <notification name="OfferTeleportFromGod"> - God user convocou para a sua localização? + Convocar residente à sua localização com poderes de deus? <form name="form"> <input name="message"> Junte-se a mim em [REGION] @@ -1425,8 +1468,20 @@ Bate-papo e mensagens instantâneas serão escondidas. Mensagens instantâneas i </form> </notification> <notification name="TeleportFromLandmark"> - Você tem certeza que quer se teletransportar? - <usetemplate ignoretext="Ao se teletransportar a partir de uma Landmark no inventário" name="okcancelignore" notext="Cancelar" yestext="Teletransportar"/> + Tem certeza de quer ser teletransportado para <nolink>[LOCATION]</nolink>? + <usetemplate ignoretext="Confirmar se eu quero ser teletransportado para marcos" name="okcancelignore" notext="Cancelar" yestext="Teletransportar"/> + </notification> + <notification name="TeleportToPick"> + Teletransportar para [PICK]? + <usetemplate ignoretext="Confirmar se eu quero ser teletransportado para Destaques" name="okcancelignore" notext="Cancelar" yestext="Teletransportar"/> + </notification> + <notification name="TeleportToClassified"> + Teletransportar para [CLASSIFIED]? + <usetemplate ignoretext="Confirmar se eu quero ser teletransportado lugar do anúncio" name="okcancelignore" notext="Cancelar" yestext="Teletransportar"/> + </notification> + <notification name="TeleportToHistoryEntry"> + Teletransportar para [HISTORY_ENTRY]? + <usetemplate ignoretext="Confirmar se eu quero ser teletransportado para marcos" name="okcancelignore" notext="Cancelar" yestext="Teletransportar"/> </notification> <notification label="Mensagem para todos na sua Propriedade" name="MessageEstate"> Digite um breve anúncio que será enviado para todos que estejam atualmente na sua propriedade. @@ -1437,11 +1492,11 @@ Bate-papo e mensagens instantâneas serão escondidas. Mensagens instantâneas i </form> </notification> <notification label="Mudar propriedade Linden" name="ChangeLindenEstate"> - Você está prestes a mudar uma propriedade pertencente a Linden (continente, teen grid, orientação, etc.) + Você está prestes a modificar uma propriedade da Linden (continente, teen, grid, orientação, etc) -Isto é EXTREMAMENTE PERIGOSO porque pode fundamentalmente afetar a experiência do usuário. No continente, vai mudar milhares de regiões e fazer o spaceserver soluçar. +Esta ação é EXTREMAMENTE PERIGOSA -- ela pode afetar a experiência dos residentes. No continente, isso vai mudar milhares de regiões e deixar o spaceserver sobrecarregado. -Proceder? +Deseja prosseguir? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Mudar Propriedade"/> </notification> <notification label="Mudar o acesso à propriedade Linden" name="ChangeLindenAccess"> @@ -1495,9 +1550,7 @@ Isto mudará milhares de regiões e fará o spaceserver soluçar. Você não é permitido na Região devido à sua Classificação de maturidade. Isto pode ser o resultado da falta de informação de validação de sua idade. Por favor, verifique se você está com o último Visualizador instalado e vá ao Banco de Conhecimento para detalhes em como acessar áreas com esta classificação de maturidade. - <usetemplate - name="okbutton" - yestext="OK"/> + <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="RegionEntryAccessBlocked_KB"> Você não é permitido nesta região devido à sua Classificação de maturidade. @@ -1506,37 +1559,29 @@ Ir para o Banco de Conhecimento para maiores informações sobre Classificaçõe <url name="url"> http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/pt </url> - <usetemplate - name="okcancelignore" - yestext="Ir para o Banco de Conhecimento" - notext="Fechar" - ignoretext="Quando a entrada na região está bloqueada devido à Classificação de maturidade"/> + <usetemplate ignoretext="Não posso entrar nessa região devido à classificação do conteúdo" name="okcancelignore" notext="Fechar" yestext="Ir para o Banco de Conhecimento"/> </notification> <notification name="RegionEntryAccessBlocked_Notify"> Você não é permitido nesta região devido à sua Classificação de maturidade. </notification> <notification name="RegionEntryAccessBlocked_Change"> - Você não é permitido nessa região devido à sua preferência de Classificação de maturidade. - -Você pode clicar em 'Mudar Preferência' para aumentar sua preferência de Classificação de maturidade agora e permitir sua entrada. Você estará habilitado a buscar e acessar conteúdo [REGIONMATURITY] a partir de agora. Se você desejar mais tarde voltar à configuração anterior, vá para Editar > Preferencias... > Geral. - <form name="form"> - <button - name="OK" - text="Mudar Preferência"/> - <button - default="true" - name="Cancel" - text="Fechar"/> - <ignore name="ignore" text="Quando a entrada na Região está bloqueada devido à preferência de Classificação de maturidade"/> - </form> + Você não pode entrar nessa região devido à sua seleção de maturidade. + +Para entrar na região desejada, mude o nÃvel de maturidade. Você então poderá fazer buscas e acessar conteúdo [REGIONMATURITY]. Para desfazer qualquer mudança, vá para Eu > Preferências > Geral. + <form name="form"> + <button name="OK" text="Mudar preferência"/> + <button default="true" name="Cancel" text="Fechar"/> + <ignore name="ignore" text="Minha preferência de maturidade impede que eu vá a uma região"/> + </form> + </notification> + <notification name="PreferredMaturityChanged"> + Sua opção de nÃvel de maturidade é [RATING]. </notification> <notification name="LandClaimAccessBlocked"> Você não pode reclamar esta terra devido à sua Classificação de maturidade. Isto pode ser o resultado de falta de informação na validação de sua idade. Por favor, verifique se você tem o último Visualizador instalado e vá para o Banco de Conhecimento para detalhes sobre o acesso de áreas com esta Classificação de maturidade. - <usetemplate - name="okbutton" - yestext="OK"/> + <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="LandClaimAccessBlocked_KB"> Você não pode reclamar esta terra devido à sua Classificação de maturidade. @@ -1545,32 +1590,22 @@ Ir para a o Banco de Conhecimento para maiores informações sobre Classificaçà <url name="url"> http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/pt </url> - <usetemplate - name="okcancelignore" - yestext="Ir para o Banco de Conhecimento" - notext="Fechar" - ignoretext="Quando reclamar a Terra está bloqueado devido à Classificação de maturidade"/> + <usetemplate ignoretext="Não reivindicar essa região devido à classificação do conteúdo" name="okcancelignore" notext="Fechar" yestext="Ir para o Banco de Conhecimento"/> </notification> <notification name="LandClaimAccessBlocked_Notify"> Você não pode reclamar esta terra devido à sua Classificação de maturidade. </notification> <notification name="LandClaimAccessBlocked_Change"> - Você não pode reclamar esta terra devido à sua preferência de Classsificação de maturidade. + Você não pode reivindicar essa região devido à sua preferência de maturidade -Você pode clicar em 'Mudar Preferência' para aumentar sua preferência de Classificação de maturidade agora e permitir sua entrada. Você estará habilitado a buscar e acessar conteúdo [REGIONMATURITY] a partir de agora. Se você desejar mais tarde voltar à configuração anterior, vá para Editar > Preferencias... > Geral. - <usetemplate - name="okcancelignore" - yestext="Mudar Preferência" - notext="Fechar" - ignoretext="Quando reclamar a Terra está bloqueado devido à preferência de Classificação de maturidade"/> +Clique em 'Mudar preferência' para aumentar o nÃvel de maturidade e entrar nessa região. De agora em diante você pode buscar e acessar conteúdo [REGIONMATURITY] . Para modificar esta configuração, vá à Eu > Preferências > Geral. + <usetemplate ignoretext="Minha preferência de conteúdo impede que eu reivindique terrenos" name="okcancelignore" notext="Fechar" yestext="Mudar Preferência"/> </notification> <notification name="LandBuyAccessBlocked"> Você não pode comprar esta terra devido à sua Classificação de maturidade. Isto pode ser o resultado de falta de informação na validação de sua idade. Por favor, verifique se você tem o último Visualizador instalado e vá para o Banco de Conhecimento para detalhes sobre o acesso de áreas com esta Classificação de maturidade. - <usetemplate - name="okbutton" - yestext="OK"/> + <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="LandBuyAccessBlocked_KB"> Você não pode comprar esta terra devido à sua Classificação de maturidade. @@ -1579,27 +1614,19 @@ Ir para o Banco de Conhecimento para maiores informações sobre Classificaçõe <url name="url"> http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/pt </url> - <usetemplate - name="okcancelignore" - yestext="Ir para o Banco de Conhecimento" - notext="Fechar" - ignoretext="Quando a compra de Terra está bloqueada devido à Classificação de maturidade"/> + <usetemplate ignoretext="Não posso comprar essa região devido à classificação do conteúdo" name="okcancelignore" notext="Fechar" yestext="Ir para o Banco de Conhecimento"/> </notification> <notification name="LandBuyAccessBlocked_Notify"> Você não pode comprar esta terra devido à sua Classificação de maturidade. </notification> <notification name="LandBuyAccessBlocked_Change"> - Você não pode comprar esta terra devido à sua preferência de Classificação de maturidade. + Você não pode comprar esse terreno devido à sua preferência de maturidade -Você pode clicar em 'Mudar Preferência' para aumentar sua preferência de Classificação de maturidade agora e permitir sua entrada. Você estará habilitado a buscar e acessar conteúdo [REGIONMATURITY] a partir de agora. Se você desejar mais tarde voltar à configuração anterior, vá para Editar > Preferencias... > Geral. - <usetemplate - name="okcancelignore" - yestext="Mudar Preferência" - notext="Fechar" - ignoretext="Quando a compra de Terra está bloqueada devido à preferência de Classificação de maturidade"/> +Clique em 'Mudar preferência' para aumentar o nÃvel de maturidade e entrar nessa região. De agora em diante você pode buscar e acessar conteúdo [REGIONMATURITY] . Para modificar esta configuração, vá à Eu > Preferências > Geral. + <usetemplate ignoretext="Minha preferência de conteúdo não me deixa comprar terrenos" name="okcancelignore" notext="Fechar" yestext="Mudar Preferência"/> </notification> <notification name="TooManyPrimsSelected"> - "Muitos prims foram selecionados. Por favor, selecione [MAX_PRIM_COUNT] ou menos e tente novamente." + Muitos prims foram selecionados. Selecione [MAX_PRIM_COUNT] ou menos prims, e tente de novo <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="ProblemImportingEstateCovenant"> @@ -1632,19 +1659,11 @@ Publicar este classificado agora por L$ [AMOUNT]? </notification> <notification name="SetClassifiedMature"> Este classificado contém conteúdo Mature? - <usetemplate - canceltext="Cancelar" - name="yesnocancelbuttons" - notext="Não" - yestext="Sim"/> + <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Não" yestext="Sim"/> </notification> <notification name="SetGroupMature"> Este grupo contém conteúdo Mature? - <usetemplate - canceltext="Cancelar" - name="yesnocancelbuttons" - notext="Não" - yestext="Sim"/> + <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Não" yestext="Sim"/> </notification> <notification label="Confirmar reiniciar" name="ConfirmRestart"> Você quer realmente reiniciar esta região em 2 minutos? @@ -1658,217 +1677,14 @@ Publicar este classificado agora por L$ [AMOUNT]? <button name="Cancel" text="Cancelar"/> </form> </notification> - <notification label="Bloquear Terraforma" name="HelpRegionBlockTerraform"> - Se esta opção for assinalada, donos de Terrenos não serão capazes de terraformar independentemente da configuração 'Editar Terreno' de suas terras por lote. - -Padrão: desligado - </notification> - <notification label="Bloquear Vôo" name="HelpRegionBlockFly"> - Se esta caixa estiver marcada, as pessoas não poderão voar nesta região independente das configurações por lote de 'Voar'. - -Padrão: desligado. - </notification> - <notification label="Mudança Conjunta das Permissões de Conteúdo" name="HelpBulkPermission"> - A ferramenta de Mudança Conjunta das Permissões lhe ajuda a mudar, rapidamente, as permissões de múltiplos itens que estão no conteúdo do(s) objeto(s) selecionado(s). Por favor observe que, no entanto, você está apenas definindo permissões para on itens que estão no conteúdo dos objetos selecionados -- não as permissões para o container dos próprios objetos. - -Também observe que as permissões não se aplicam aos conteúdos aninhados, contidos em quaisquer dos objetos. Sua solicitação opera apenas nos itens em exatamente um nÃvel de profundidade. - -Você pode escolher seletivamente quais tipos de itens modificar, usando a lista de conferência aqui, abaixo de 'Tipos de Conteúdo'. Quando você seleciona Texturas, as fotos são incluÃdas. - -* Esta ferramenta apenas mudará as permissões em itens que você pode mudar. -* Você não pode dar ao Próximo dono, as permissões que você já não tem. -* As permissões ao Próximo dono são meramente solicitações. Se um dos itens não puder assumir todas as novas permissões, nenhuma delas mudará. - -Quando você estiver pronto para mudar as permissões globais, clique 'Aplicar' e aguarde os resultados na tela. - -Se você fechar a janela de Permissões Conjuntas enquanto elas estiverem sendo alteradas, a operação será suspensa. - </notification> - <notification label="Permitir Dano" name="HelpRegionAllowDamage"> - Marcar essa caixa habilita o sistema de vitalidade em todos os lotes independente das configurações individuais. Se esta caixa ficar desmarcada, os proprietários de lotes individuais ainda estarão aptos a ativar o sistema de vitalidade de seus lotes. - -Padrão: desligado. - </notification> - <notification label="Limite de Agentes" name="HelpRegionAgentLimit"> - Define o número máximo de residentes permitidos nesta região. -Quanto mais residentes existirem em sua região, pior pode ser a performance. - -Padrão: 40 - </notification> - <notification label="Bonus de Objetos" name="HelpRegionObjectBonus"> - O Bônus de objetos é um multiplicador para primitivas permitidas em qualquer lote. O intervalo permitido é de 1 a 10. -Se fixado em '1 ', 512m² de cada lote permitem 117 objetos. -Fixado em '2 ', 512m² cada lote permitem 234, ou o dobro, e assim por diante. -O número máximo de objetos permitidos por região permanece 15000 não importa qual seja o Bônus de objeto. Uma vez estabelecido, esteja ciente de que a redução do Bônus de objetos pode retornar objetos ou apagá-los. - -Padrão: 1.0 - </notification> - <notification label="Maturidade" name="HelpRegionMaturity"> - Define a Classificação de Maturidade da região, como mostrado na barra de menu, no topo de qualquer visualizador do Residente e nas dicas no Mapa-Mundi, quando o cursor passa sobre esta Região. Esta definição também afeta o acesso a esta Região e aos resultados de busca. Outros Residentes podem apenas entrar em Regiões ou ver resultados de busca com a mesma Classificação de maturidade que eles escolheram em suas preferências. - -Pode levar algum tempo até que esta mudança se reflita no mapa. - </notification> - <notification label="Restringir Empurrar" name="HelpRegionRestrictPushObject"> - Esta caixa de verificação Configura toda a região para permissões restritivas de empurrar. -Quando habilitada, os agentes só podem empurrar a si mesmos ou serem empurrados pelo dono do lote. -(Empurrar se refere à função LSL llPushObject().) - -Padrão: Desligado. - </notification> - <notification label="Unir/dividir lote" name="HelpParcelChanges"> - Configura se os lotes que não pertencem ao dono da propriedade podem ser unidos ou subdivididos. -Se esta opção estiver desmarcada: - * Apenas os donos ou gerentes de propriedades podem unir ou dividir lotes. - * Eles podem unir ou subdividir lotes pertencentes ao dono ou ao grupo onde eles tem os poderes apropriados. -Se esta opção estiver marcada: - * Todos os donos de lotes podem unir ou subdividir os lotes que eles possuem. - * Para lotes pertencentes a grupos, aqueles com os poderes apropriados podem unir ou subdividir lotes. - -Padrão: Marcado. - </notification> - <notification label="Não Mostrar na Pesquisa" name="HelpRegionSearch"> - Ao marcar esta caixa irá bloquear os donos de lotes de listar seus lotes na busca - -Padrão: desligado - </notification> <notification label="Modificar a maturidade da Região" name="RegionMaturityChange"> - A classificação de maturidade para esta região foi atualizada. -Pode levar algum tempo para que a mudança seja refletida no mapa. - </notification> - <notification label="Revenda de Terreno" name="HelpRegionLandResell"> - Os gerentes e os donos de propriedades podem vender qualquer terreno pertencente ao dono da propriedade. -Se esta opção estiver desmarcada, os compradores não podem revender seus terrenos nesta região. -Se esta opção estiver marcada, compradores podem vender seus terrenos nesta região. - -Padrão: Desabilitada. - </notification> - <notification label="Desabilitar Scripts" name="HelpRegionDisableScripts"> - Quando a performance do simulador está ruim, um script pode ser o culpado. Abra a Barra de EstatÃsticas (Ctrl+Shift+1). Olhe no Simulador de FÃsica FPS. Se estiver abaixo de 45, então abra o painel 'Tempo' localizado na parte de baixo da Barra de EstatÃsticas. Se o Tempo de Script indicar 25 ms ou mais, clique no botão 'Get Top CScripts'. Será dado o nome e a localização do script que pode estar causando uma performance ruim. Marque a caixa 'Desabilitar Scripts' e aperte o botão 'Aplicar'. Isto temporariamente desabilitará todos os scripts nesta região. Uma vez que você chegar ao local, investigue o script para determinar se ele está causando o problema. Você pode querer entrar em contato com o proprietário do script, excluir ou devolver o objeto. Desmarque a caixa 'Desabilitar Script' e então clique em 'Aplicar' para reativar os scripts na região. Padrão: desligado. - </notification> - <notification label="Desabilitar Colisões" name="HelpRegionDisableCollisions"> - Quando a performance do simulador é pobre, os objetos fÃsicos podem ser os culpados.Abra a a Barra de EstatÃsticas (Ctrl+Shift+1). -Olhe a taxa de quadros por segundos (FPS) dos objetos fÃsicos. - -Se ela estiver abaixo de 45, abra o painel de Tempo, localizado na parte inferior da Barra de EstatÃsticas. Se o Tempo (FÃsicos) do Simulador mostrar 20 ms ou mais, clique o botão 'Pegue os Maiores Colidentes'. Será fornecido a você o nome e a localidade dos objetos fÃsicos que podem estar causando uma performance pobre. -Ativando a caixa Desabilitar Colisões e então pressionando o botão Aplicar, as colisões objeto-objeto serão temporariamente desabilitadas. Você pode precisar fazer isso para que possa viajar até a localidade onde observou um 'colidente-mor'. Uma vez tendo chegado à localidade, investigue o objeto – ele está constantemente colidindo com outros objetos? Você pode desejar contatar o dono do objeto ou deletar ou retornar o objeto. -Desative a caixa 'Desabilitar Colisões' e então use 'Aplicar' para reativar as colisões na região. - -Padrão: off - </notification> - <notification label="Desabilitar FÃsica" name="HelpRegionDisablePhysics"> - Desabilitar FÃsica é similar a desabilitar Colisões, com exceção de que todas as simulações fÃsicas serão desabilitadas. Isto significa que não só os objetos pararão de colidir, mas também que os avatares não poderão se mover. - -Isto só deve ser usado quando Desabilitar Colisões não trouxer performance suficiente à região para investigar um problema de FÃsica ou do 'Colidente-Mor'. - -Esteja certo de reabilitar FÃsica quando você terminar, ou os avatares não poderão se mover. - -Default: desligado - </notification> - <notification label="Principais Colidentes" name="HelpRegionTopColliders"> - Mostra uma lista de objetos com o maior número de potenciais colisões objeto-objeto. Estes objetos podem diminuir a performance do simulador. -Selecione Ver > Barra de EstatÃsticas e olhe em Simulador > Tempo > Tempo de Simulação (FÃsica) para ver se mais de 20 ms são gastos em fÃsica. - </notification> - <notification label="Principais Scripts" name="HelpRegionTopScripts"> - Mostra uma lista dos objetos gastando mais tempo rodando scripts LSL. Estes objetos podem diminuir a performance do simulador. -Selecione Ver > Barra de EstatÃsticas e olhe em Simulador > Tempo > Tempo de Script para ver se mais de 25 ms são gastos em scripts. - </notification> - <notification label="Reiniciar Região" name="HelpRegionRestart"> - Reinicia o processo do servidor rodando esta região, após um aviso de dois minutos. Todos os residentes nesta região serão desconectados. A região salvará seus dados e deverá retornar em até 90 segundos. - -Reiniciar a região não consertará a maioria dos problemas de performance, e deveria ser utilizada somente quando solicitado. - </notification> - <notification label="Altura da água" name="HelpRegionWaterHeight"> - Esta é a altura em metros onde a água aparece. Caso este ajuste seja diferente de 20 e você tenha águas adjacentes ao limite do seu terreno ou águas continentais, haverá uma abertura visÃvel. - -Padrão: 20 - </notification> - <notification label="Limite do aumento" name="HelpRegionTerrainRaise"> - Esta é a distância em metros que os donos de lotes podem elevar o terreno, a partir da altura nivelada do terreno. - -Padrão: 4 - </notification> - <notification label="Limite mais baixo" name="HelpRegionTerrainLower"> - Esta é a distância em metros que os donos de lotes podem abaixar o terreno, a partir da altura nivelada do terreno. - -Padrão: -4 - </notification> - <notification label="Carregar terreno RAW" name="HelpRegionUploadRaw"> - Este botão faz upload de um arquivo .RAW para a região em que você está. -O arquivo precisa conter as dimensões/número de canais corretos: RGB, 256x256 e 13 canais. A melhor forma de criar um arquivo da região é baixando o arquivo .RAW existente. Um bom primeiro passo seria modificar o primeiro canal (altura da região) e fazer o upload do arquivo. - -O upload pode levar certa de 45 segundos. Note que fazer upload do arquivo da região *não* moverá os objetos que estão na região, apenas o terreno e as permissões associadas a ele. Isso pode fazer com que alguns objetos fiquem debaixo da terra. - -Para mais informações sobre edição dos campos de altura da região, consulte a ajuda F1. - </notification> - <notification label="Baixar RAW de terreno" name="HelpRegionDownloadRaw"> - Este botão faz download de um arquivo contendo dados de altura do campo, dimensões do lote, status de lotes à venda e algumas permissões de lote para este terreno. Ao abrir o arquivo em programas como o Photoshop, você precisa especificar as dimensões do documento, que são: RGB, 256x256 com 13 canais. Este arquivo de terras não pode ser aberto de outra forma. - -Para mais informações sobre edição dos campos de altura da região, consulte a Ajuda F1. - </notification> - <notification label="Usar Sol da Propriedade" name="HelpRegionUseEstateSun"> - Esta caixa de opção faz com que a posição do sol nesta região seja a mesma que no resto da região. - -Padrão: ligada - </notification> - <notification label="Sol fixo" name="HelpRegionFixedSun"> - Esta caixa de opção ajusta a posição do sol no equalizador de fuso e interrompe o movimento do sol. - -Padrão: desligada - </notification> - <notification label="Nivelar Terreno" name="HelpRegionBakeTerrain"> - Este botão salva a forma atual do terreno como o novo padrão para a região. Uma vez nivelado, o terreno pode reverter à forma que foi salva, sempre que você ou outros utilizarem a ferramenta 'Revert' na edição de terreno. O terreno nivelado é também o ponto médio entre os limites de elevação e redução de terreno. - </notification> - <notification label="Gerentes da Propriedade" name="HelpEstateEstateManager"> - Um gerente da propriedade é um residente a quem você delegou o controle das configurações da região. Ele pode alterar qualquer configuração da região, com exceção de elevar, abaixar ou nivelar o terreno. Em particular, eles podem permitir ou banir residentes da sua propriedade. Gerentes da propriedade só podem ser adicionados ou removidos pelo dono da propriedade. - -Um gerente não pode adicionar ou remover outro gerente. Por favor, escolha somente residentes em quem você confia para serem gerentes da propriedade, pois você poderá ser responsabilizado pelas ações deles. - </notification> - <notification label="Usar hora Global" name="HelpEstateUseGlobalTime"> - Esta caixa de opção faz com que o Sol em sua propriedade siga a mesma posição do Sol nas propriedades da 'mainland' do Linden Lab. - -Padrão: ligado - </notification> - <notification label="Sol fixo" name="HelpEstateFixedSun"> - Esta caixa de opção ajusta a posição do sol no equalizador de fuso e interrompe o movimento do sol. - </notification> - <notification label="Acesso público" name="HelpEstateExternallyVisible"> - Esta caixa de verificação define se os Residentes que estão em outras propriedades podem entrar nesta, sem estar em uma lista de acesso. + O conteúdo desta região foi reclassificado. +Talvez leve algum tempo para a mudança ser refletida no mapa. -Padrão: on - </notification> - <notification label="Permitir Teletransporte direto" name="HelpEstateAllowDirectTeleport"> - Quando marcada, permite que os residentes se teletransportem diretamente para qualquer ponto da sua propriedade. Quando desmarcada, os residentes serão teleportados para o telehub mais próximo. - -Padrão: desmarcada - </notification> - <notification label="Permitir acesso" name="HelpEstateAllowResident"> - Acesso a esta propriedade estará limitado aos Residentes listados aqui e em quaisquer grupos abaixo. -Esta definição está disponÃvel apenas quando o Acesso Público estiver desmarcado. - </notification> - <notification label="Permitir acesso de grupo" name="HelpEstateAllowGroup"> - Acesso a esta propriedade estará limitado aos grupos listados aqui e a quaisquer Residentes acima. -Esta definição está disponÃvel apenas quando o Acesso Público estiver desmarcado. - </notification> - <notification label="Endereço de Email do Abuso" name="HelpEstateAbuseEmailAddress"> - Configurar isto para um endereço de email válido, fará com que relatos de abuso nesta propriedade sejam enviados para esse endereço. -DefinÃ-lo em branco fará com que os relatórios de abuso sejam enviados apenas para a Linden Lab. - </notification> - <notification label="Negar acesso" name="HelpEstateBanResident"> - Residentes desta lista estão proibidos de acessar a sua propriedade, independentemente de outras configurações. - </notification> - <notification label="Permitir Conversa por Voz" name="HelpEstateVoiceChat"> - Lotes nesta propriedade têm permissão para ter seus canais de voz próprios, nos quais os residentes podem ouvir e falar com os outros residentes próximos. - -Padrão: desligado +Para ir a regiões de conteúdo Adulto, é preciso ter uma conta verificada, seja comprovando a idade ou com dados de pagamento. </notification> <notification label="Discordância de Versão de Voz" name="VoiceVersionMismatch"> - Esta versão do [APP_NAME] não é compatÃvel com as caracterÃsticas do Canal de Voz desta região. Para que a Conversa por Voz funcione corretamente, você precisará atualizar o [APP_NAME]. - </notification> - <notification label="Corretor da Propriedade" name="HelpEstateCovenant"> - Definir um corretor da propriedade lhe permite vender lotes nesta propriedade. Se um corretor não for definido, você não pode vender terras. O cartão do seu corretor pode ficar vazio se você não desejar aplicar quaisquer regras ou avisar os compradores sobre qualquer coisa em relação ao lote antes da compra. - -Um corretor pode ser usado para comunicar regras, orientações, informações culturais ou simplesmente suas expectativas quanto ao futuro comprador. Isto pode incluir zoneamento, regulamentos para construções, opções de pagamento ou qualquer outra informação que você julgar importante que o novo proprietário veja e concorde antes da compra. - -O comprador precisa concordar com o corretor marcando a caixa de verificação antes de concluir a compra. Corretores são sempre visÃveis na caixa de diálogo 'Sobre a Terra' para todos os lotes que têm corretores definidos. + Esta versão do [APP_NAME] não é compatÃvel com o recurso 'Bate-papo de voz' desta região. Para o bate-papo de voz funcionar, atualize o [APP_NAME]. </notification> <notification label="ImpossÃvel Comprar Objetos" name="BuyObjectOneOwner"> Não é possÃvel comprar objetos de diferentes proprietários ao mesmo tempo. @@ -1956,53 +1772,36 @@ Por favor, re-insira sua senha e clique 'Confirmar Compra'. Estes itens serão movidos para o seu inventário, não copiados. Mover os itens do inventário? - <usetemplate ignoretext="Quando estiver movendo inventário não copiável a partir de objetos." name="okcancelignore" notext="Não mover" yestext="Mover"/> + <usetemplate ignoretext="Avisar antes de eu pegar items 'cópia proibida' de um objeto" name="okcancelignore" notext="Não mover" yestext="Mover"/> </notification> <notification name="MoveInventoryFromScriptedObject"> Você selecionou itens de inventário não copiáveis. Estes itens serão movidos para seu inventário, não copiados. Pelo fato de o objeto ter scripts, mover estes itens ao inventário pode provocar um mal funcionamento do script. Mover para o inventário o(s) item(s)? - <usetemplate ignoretext="Quando movendo objetos com scripts não copiáveis ao inventário" name="okcancelignore" notext="Não mover" yestext="Mover"/> + <usetemplate ignoretext="Avisar antes de eu pegar items 'cópia proibida' que podem quebrar objetos com script" name="okcancelignore" notext="Não mover" yestext="Mover"/> </notification> <notification name="ClickActionNotPayable"> - Aviso: A ação de 'Pagar Objeto' com clique foi definida, mas funcionará apenas se for adicionado um script com o evento money(). + Aviso: O clique em 'Pagar por objeto' foi processado, mas só pode funcionar se um script tiver um evento money(). <form name="form"> - <ignore name="ignore" text="Quando Definindo 'Pagar' em objetos sem eventos money()"/> + <ignore name="ignore" text="Definir 'Pagar por objeto' ao construir um objeto sem script money()"/> </form> </notification> <notification name="OpenObjectCannotCopy"> Não há itens neste objeto que você está autorizado a copiar. </notification> <notification name="WebLaunchAccountHistory"> - Ir para o site do [SECOND_LIFE] para visualizar o histórico de sua conta? - <usetemplate ignoretext="Ao abrir a página web de histórico de conta" name="okcancelignore" notext="Cancelar" yestext="Ir para a página"/> - </notification> - <notification name="ClickOpenF1Help"> - Visitar o website de Suporte do [SECOND_LIFE]? - <usetemplate ignoretext="Quando visitando o website de Suporte do [SECOND_LIFE]" name="okcancelignore" notext="Cancelar" yestext="Ir"/> + Deseja abrir o [http://secondlife.com/account/ Painel] para ver o histórico da sua conta? + <usetemplate ignoretext="Abrir o navegador para acessar minha conta" name="okcancelignore" notext="Cancelar" yestext="Ir para a página"/> </notification> <notification name="ConfirmQuit"> Tem certeza que deseja sair? - <usetemplate ignoretext="Quando Saindo do [APP_NAME]." name="okcancelignore" notext="Continuar" yestext="Sair"/> + <usetemplate ignoretext="Confirmar antes de sair" name="okcancelignore" notext="Não sair" yestext="Sair"/> </notification> <notification name="HelpReportAbuseEmailLL"> - Use esta ferramenta para reportar violações aos [http://secondlife.com/corporate/tos.php?lang=pt-BR Termos de Serviço] e aos [http://secondlife.com/corporate/cs.php?lang=pt-BR Padrões da Comunidade]. + Use esta ferramenta para denunciar infrações dos [http://secondlife.com/corporate/tos.php Termos do Serviço] e das [http://secondlife.com/corporate/cs.php Normas da Comunidade]. -Todos os abusos aos Termos de Serviço e aos Padrões da Comunidade reportados, são investigados e resolvidos. Você pode ver a resolução do incidente na Reportagem de Incidentes em: - -http://secondlife.com/support/incidentreport.php - </notification> - <notification name="HelpReportAbuseEmailEO"> - IMPORTANTE: Esta reportagem irá para o dono da região em que você se encontra atualmente e não para a Linden Lab. - -Como um serviço aos residentes e visitantes, o dono da região em que você se encontra foi eleito para receber e resolver todas as reportagens originadas nesta região. A Linden Lab não irá investigar reportagens que você envia desta localidade. - -O dono da região resolverá as reportagens baseado nas regras locais desta região, como definido na Declaração da propriedade. -(Veja as declarações indo ao menu Mundo e selecionando Sobre a Terra.) - -A resolução desta reportagem se aplica apenas a esta região; o acesso de Residentes à s outras áreas do [SECOND_LIFE] não será afetado pelas decisões desta reportagem. -Apenas a Linden Lab pode restringir acesso a todo o [SECOND_LIFE]. +Todas as denúncias de abuso são investigadas e resolvidas. </notification> <notification name="HelpReportAbuseSelectCategory"> Por favor, selecione uma categoria para a reportagem deste abuso. @@ -2026,17 +1825,18 @@ Seja tão especÃfico quanto você puder, incluindo nomes e os detalhes do incid Fazer uma descrição precisa nos ajuda a arquivar e processar as reportagens de abuso. </notification> <notification name="HelpReportAbuseContainsCopyright"> - Caro Residente, + Caro residente, + +Aparentemente você fez uma denúncia de infranção de propriedade intelectual. Certifique-se de que sua denúncia está correta: -Você parece estar relatando violação de propriedade intelectual. Por favor, certifique-se de que está relatando corretamente: +(1) Procedimento do abuso Se você tem motivos para acreditar que um residente está burlando o sistema de autorização do [SECOND_LIFE] usando o CopyBot ou ferramentas parecidas para infringir direitos de propriedade intelectual, envie um relatório de abuso. A equipe anti-abuso investiga e impõe sanções em casos de infranção dos [SECOND_LIFE] [http://secondlife.com/corporate/tos.php Termos de Serviço] ou das [http://secondlife.com/corporate/cs.php Normas da Comunidade]. Entretando, a equipe anti-abuso não lida com pedidos de remoção de conteúdo do [SECOND_LIFE]. Tais pedidos não serão atendidos. -(1) O Processo de abuso. Você pode apresentar um relatório de abuso se você acredita que um Residente está infringindo o sistema de permissões do [SECOND_LIFE], por exemplo, utilizando ferramentas CopyBot para copiar ou similar, para violar os direitos de propriedade intelectual. A Equipe de Abuso investiga e divulga a ação disciplinar adequada para o comportamento que viola o Estatuto da Comunidade do [SECOND_LIFE] ou os Termos de Serviço. No entanto, a mesma não controla e não irá responder aos pedidos para remover o conteúdo do mundo [SECOND_LIFE]. +(2) Procedimentos DMCA ou remoção de conteúdo. Para solicitar a remoção de conteúdo do [SECOND_LIFE], é imprescindÃvel enviar uma notificação de infração elaborada conforme as disposicões da [http://secondlife.com/corporate/dmca.php PolÃtica DMCA]. -(2) O processo de remoção de conteúdo ou DMCA. Para solicitar a remoção de conteúdo do [SECOND_LIFE], você deve enviar uma notificação válida de infração, conforme previsto em nossa PolÃtica de DMCA em http://secondlife.com/corporate/dmca.php. +Se você deseja continuar o procedimento de denúncia de abuso, feche esta janela e termine o relatório. A categoria 'CopyBot or Permissions Exploit' (robô de cópia ou exploit de autorização) -Se você ainda deseja prosseguir com o processo de abuso, por favor, feche esta janela e termine de enviar seu relatório. Pode ser necessário selecionar a categoria especÃfica 'CopyBot Infração de Permissões'. +Obrigado. -Obrigado, Linden Lab </notification> <notification name="FailedRequirementsCheck"> @@ -2047,9 +1847,9 @@ Linden Lab Já existe um objeto anexado a este ponto do seu corpo. Você deseja substituÃ-lo pelo objeto selecionado? <form name="form"> - <ignore name="ignore" save_option="true" text="Ao substituir os anexos existentes"/> - <button name="Yes" text="Sim"/> - <button name="No" text="Não"/> + <ignore name="ignore" save_option="true" text="Trocar um anexo atual pelo item selecionado"/> + <button ignore="Replace Automatically" name="Yes" text="Sim"/> + <button ignore="Never Replace" name="No" text="Não"/> </form> </notification> <notification label="Aviso de Modo Ocupado" name="BusyModePay"> @@ -2057,18 +1857,22 @@ Você deseja substituÃ-lo pelo objeto selecionado? Você gostaria de deixar o modo Ocupado antes de completar esta transação? <form name="form"> - <ignore name="ignore" save_option="true" text="Ao pagar uma pessoa ou objeto no modo ocupado"/> - <button name="Yes" text="Sim"/> - <button name="No" text="Não"/> + <ignore name="ignore" save_option="true" text="Estou prestes a pagar alguém ou um objeto no modo ocupado"/> + <button ignore="Always leave Busy Mode" name="Yes" text="Sim"/> + <button ignore="Never leave Busy Mode" name="No" text="Não"/> </form> </notification> + <notification name="ConfirmDeleteProtectedCategory"> + A pasta '[FOLDERNAME]' é uma pasta do sistema. Excluir pastas de sistema pode deixar o sistema instável. Tem certeza de que quer prosseguir? + <usetemplate ignoretext="Confirmar antes de excluir pastas do sistema." name="okcancelignore" notext="Cancelar" yestext="OK"/> + </notification> <notification name="ConfirmEmptyTrash"> - Tem certeza de que deseja remover permanentemente o conteúdo da lixeira de seu inventário? - <usetemplate ignoretext="Ao esvaziar a pasta da lixeira no seu inventário" name="okcancelignore" notext="Não" yestext="Sim"/> + Tem certeza de que deseja excluir o conteúdo da Lixeira? Para sempre? + <usetemplate ignoretext="Confirmar antes de esvaziar a pasta Lixeira" name="okcancelignore" notext="Não" yestext="Sim"/> </notification> <notification name="ConfirmClearBrowserCache"> - Você tem certeza que deseja limpar o cache do seu navegador? - <usetemplate name="okcancelbuttons" notext="Não" yestext="Sim"/> + Tem certeza de que quer apagar todo o histórico de viagens, web e buscas? + <usetemplate name="okcancelbuttons" notext="Não" yestext="OK"/> </notification> <notification name="ConfirmClearCookies"> Você tem certeza de que deseja limpar os cookies? @@ -2079,39 +1883,18 @@ Você gostaria de deixar o modo Ocupado antes de completar esta transação? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Sim"/> </notification> <notification name="ConfirmEmptyLostAndFound"> - Deseja realmente remover permanentemente o conteúdo da pasta achados e perdidos? - <usetemplate ignoretext="Ao esvaziar pasta Achados e Perdidos do seu inventário" name="okcancelignore" notext="Não" yestext="Sim"/> + Tem certeza de que deseja excluir o conteúdo dos Achados e Perdidos? Para sempre? + <usetemplate ignoretext="Confirmar antes de esvaziar a pasta Achados e Perdidos" name="okcancelignore" notext="Não" yestext="Sim"/> </notification> <notification name="CopySLURL"> - A seguinte SLurl foi copiada para o seu clipboard: + O seguinte SLurl foi copiado para a área de transferência: [SLURL] -Coloque-a em uma página web para dar aos outros um fácil acesso a este local ou tente você, colando-a na barra de endereços do seu navegador. +Inclua um link para facilitar o acesso para visitantes. Teste o link na barra de endereço de qualquer navegador da web. <form name="form"> - <ignore name="ignore" text="Ao copiar a SURL para o seu clipboard"/> + <ignore name="ignore" text="SLurl copiado para área de transferência."/> </form> </notification> - <notification name="GraphicsPreferencesHelp"> - Este painel controla o tamanho da janela, resolução e a qualidade dos gráficos do computador cliente. O Preferências > Interface Gráfica permite escolher entre quatro nÃveis gráficos: Baixo, Médio, Alto e Ultra. Você também pode personalizar suas configurações de gráficos selecionando a opção Personalizar e manipulando as seguintes definições: - -Sombreamento: Ativar ou desativar vários tipos de sombreadores de pixel. - -Detalhes de Reflexão: Define os tipos de objetos que a água pode refletir. - -Renderização de Avatar: Define opções que afetam a forma como o cliente renderizará os avatares. - -Alcance: Afeta a distância do seu ponto de vista que os objetos serão renderizados na cena. - -Número máximo de partÃculas: Define o número máximo de partÃculas que será capaz de ver na sua tela de uma só vez. - -Qualidade de Pós-Processamento: Define a resolução com a qual o brilho será renderizado. - -Detalhes de malha: Ajusta a quantidade de detalhes ou número de triângulos utilizados na renderização de certos objetos. Um valor mais alto leva mais tempo para renderizar, mas torna esses objetos mais detalhados. - -Detalhe de Iluminação: Seleciona os tipos de luzes que você gostaria de renderizar. - -Detalhe de Terreno: Ajusta a quantidade de detalhes que você gostaria de ver para a textura do terreno. - </notification> <notification name="WLSavePresetAlert"> Você deseja substituir a pré-configuração salva? <usetemplate name="okcancelbuttons" notext="Não" yestext="Sim"/> @@ -2130,149 +1913,6 @@ Detalhe de Terreno: Ajusta a quantidade de detalhes que você gostaria de ver pa Existe efeito de Pós-Processamento. Você deseja substituÃ-lo? <usetemplate name="okcancelbuttons" notext="Não" yestext="Sim"/> </notification> - <notification name="HelpEditSky"> - Editar os controles graduais do WindLight para configurar e salvar um conjunto de céus. - </notification> - <notification name="HelpEditDayCycle"> - Definir quais céus colocar durante todo o dia. - </notification> - <notification name="EnvSettingsHelpButton"> - Essas configurações ajustam a forma como o ambiente parece localmente no seu computador. Sua placa de vÃdeo precisa suportar o sombreador atmosférico, a fim de ter acesso a todas as definições. - -Ajuste o controle gradual "Hora do Dia" para alterar a fase do dia localmente no visualizador. - -Ajuste o controle gradual de "Cobertura das nuvens" para controlar quantas nuvens cobrem o céu. - -Pegue uma cor na paleta de cores de "Cor da Ãgua" para mudar a cor desta. - -Ajuste o controle gradual de "Névoa de Ãgua" para controlar o quão densa é a névoa dentro da água. - -Clique "Usar Horário da Propriedade" para redefinir a hora do dia para o horário atual do dia da região e permanecer atrelado a ela. - -Clique "Céu Avançado " para abrir um editor com configurações mais avançadas para o céu. - -Clique "Ãgua Avançada " para abrir um editor com configurações mais avançadas para a água. - </notification> - <notification name="HelpDayCycle"> - O editor de Ciclo do Dia dá a você o controle do céu durante um ciclo de dia/noite do [SECOND_LIFE]. Este é o ciclo usado pelo controle gradual da hora do dia do editor de ambiente básico. - -O editor do ciclo de dia trabalha configurando quadros-chave. Estes são pontos (representados pelos Ãcones cinza no gráfico de horário) que possuem um pré-ajuste de céu associado a eles. Conforme o dia passa, o céu do Windlight " anima " a interpolação entre esses quadros-chave. - -A seta amarela acima da linha de tempo representa a sua vista atual, baseada no horário do dia. Clique e arraste para ver como o seu dia será animado. Você pode adicionar ou deletar os quadros-chave pressionando os botões Adicionar Chave e Deletar chave ao lado direito da linha de tempo. - -Você pode configurar a posição do tempo de um quadro-chave arrastando-o pela linha do tempo, ou configurando manualmente no quadro de configurações do seu quadro-chave. Será possÃvel a você associar o seu quadro-chave a este respectivo padrão WindLight. - -A duração do ciclo determina a duração geral do "dia". Configurá-la para um valor baixo (por exmplo, 2 min.) quer dizer que a linha do tempo de 24 horas será animada completamente em apenas dois minutos reais! Assim que estiver satisfeito com a linha do tempo e o ciclo dos quadros-chave, use os botões Play e Stop para uma prévia de como ficará o resultado. Lembre-se, você também pode utilizar a seta amarela indicadora do tempo acima da linha do tempo para ver o ciclo animado interativamente. Usando o botão do tempo da popriedade irá sincronizar a duração do seu dia ao ciclo diário da propriedade. - -Assim que estiver satisfeito com o seu ciclo diário, você pode salvá-lo ou carregá-lo através dos botões Salvar Dia Teste e Carregar Dia Teste. Note que, por enquanto, nós permitimos apenas um Ciclo de dia. - </notification> - <notification name="HelpBlueHorizon"> - Use os cursores Vermelho/Verde/Azul ( Red/Green/Blue -RGB) para ajustar as cores do céu. Você também pode usar o controle de Intensidade (I) para mover os três controles RGB simultaneamente. - </notification> - <notification name="HelpHazeHorizon"> - Haze Horizon é um dos parâmetros mais úteis para ajuste global de exposição de luz na cena. Ele é eficaz para simular diversas configurações de exposição, tais como configurações para super-exposição do sol e escuros halos de Iris. - </notification> - <notification name="HelpBlueDensity"> - A densidade global azul afeta a saturação da cor do céu e nevoeiro. Se você mover o controle gradual de intensidade (I) para a direita, as cores vão se tornar mais brilhantes e vibrantes. Se você movê-lo totalmente para a esquerda, as cores perdem intensidade e cor, eventualmente chegando a preto e branco. Se pretende um ajuste fino do equilÃbrio de cor do céu, você pode controlar os diversos elementos da saturação, utilizando os controles graduais para vermelho / verde / azul (RGB). - </notification> - <notification name="HelpHazeDensity"> - Densidade de Poeira controla o nÃvel de fumaça, poeira cinza na atmosfera. Eficaz para simular cenas com altos nÃveis de poeira e poluentes. É também efetivo em simular névoa e nevoeiro. - </notification> - <notification name="HelpDensityMult"> - O Multiplicador de Densidade pode ser usado para afetar a densidade atmosférica global. Com definições mais baixas, ele cria uma sensação de "ar rarefeito" e em definições mais altas, ele cria um efeito mais denso, mais esfumaçado. - </notification> - <notification name="HelpDistanceMult"> - Ajusta como a distância no WindLight é percebida. Um valor zero efetivamente desativa a influência do WindLight sobre terrenos e objetos. Valores superiores a 1 simulam os efeitos atmosféricos mais espessos a maiores distâncias. - </notification> - <notification name="HelpMaxAltitude"> - Max Altitude ajusta os cálculos de performance de altitude do WindLight, quando computa sua iluminação atmosférica. Em perÃodos vespertinos do dia, é útil para ajustar a "profundidade" de como o pôr-do-sol aparece. - </notification> - <notification name="HelpSunlightColor"> - Ajustar a cor e intensidade da luz direta na cena. - </notification> - <notification name="HelpSunAmbient"> - Ajusta a cor e a intensidade da luz ambiente atmosférica na cena. - </notification> - <notification name="HelpSunGlow"> - O controle gradual de Tamanho controla o tamanho do sol. -O controle gradual de Foco controla o quanto o sol aparecerá desfocado no céu. - </notification> - <notification name="HelpSceneGamma"> - Ajusta a distribuição na tela de luz e escuridão. - </notification> - <notification name="HelpStarBrightness"> - Ajusta o brilho das estrelas no céu. - </notification> - <notification name="HelpTimeOfDay"> - Controla a localização do sol no céu. Semelhante a elevação. - </notification> - <notification name="HelpEastAngle"> - Controla a localização do sol no céu. -Similar ao azimute. - </notification> - <notification name="HelpCloudColor"> - Edita as cores das nuvens, É normalmente recomendado manter o tom esbranquiçado, mas hey! Você pode se divertir se desejar. - </notification> - <notification name="HelpCloudDetail"> - Controla os detalhes da camada de imagem superior na imagem de nuvem principal. X e Y controla sua posição. D (Densidade) controla o quão cheio ou estratificada as nuvens devem aparecer. - </notification> - <notification name="HelpCloudDensity"> - Permite que você controle a posição das nuvens com os cursores X e Y e a densidade deles com o cursor D. - </notification> - <notification name="HelpCloudCoverage"> - Controla o quanto as nuvens cobrem o céu. - </notification> - <notification name="HelpCloudScale"> - Controla o dimensionamento da imagem de nuvens na cúpula celeste. - </notification> - <notification name="HelpCloudScrollX"> - Controla a velocidade das nuvens que se movem na direção X. - </notification> - <notification name="HelpCloudScrollY"> - Controla a velocidade que as núvens se movem na direção Y. - </notification> - <notification name="HelpClassicClouds"> - Marque esta check box para permitir a reprodução das nuvens clássicas mais velhas do [SECOND_LIFE], além das nuvens WindLight. - </notification> - <notification name="HelpWaterFogColor"> - Escolhe a cor da neblina subaquática. - </notification> - <notification name="HelpWaterFogDensity"> - Controla a densidade da neblina da água e a distância de visibilidade debaixo d'água. - </notification> - <notification name="HelpUnderWaterFogMod"> - Modifica o efeito do expoente de densidade de Neblina para controlar até onde você pode ver quando o seu avatar está imerso. - </notification> - <notification name="HelpWaterGlow"> - Controla o quanto a superfÃcie da água deve brilhar. - </notification> - <notification name="HelpWaterNormalScale"> - Controla o escalonamento das três marolas que compõem a água. - </notification> - <notification name="HelpWaterFresnelScale"> - Controla o quanto de luz será refletido por ângulos diferentes. - </notification> - <notification name="HelpWaterFresnelOffset"> - Controla o quanto da intensidade da luz é refletida. - </notification> - <notification name="HelpWaterScaleAbove"> - Controla o quanto de luz será refratado olhando acima da superfÃcie da água. - </notification> - <notification name="HelpWaterScaleBelow"> - Controla o quanto de luz sera refratado visto debaixo da superfÃcie da água. - </notification> - <notification name="HelpWaterBlurMultiplier"> - Controla como ondas e reflexos são misturados. - </notification> - <notification name="HelpWaterNormalMap"> - Controla o mapeamento normal em todos os nÃveis da água para determinar reflexões / refrações. - </notification> - <notification name="HelpWaterWave1"> - Controla aonde e com que velocidade a versão em escala maior do mapa normal se move nas direções X e Y . - </notification> - <notification name="HelpWaterWave2"> - Controla onde e a velocidade com que o mapa normal em escala menor se move nas direções X e Y. - </notification> <notification name="NewSkyPreset"> Me dê o nome para o novo céu. <form name="form"> @@ -2318,35 +1958,33 @@ Similar ao azimute. <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="Cannot_Purchase_an_Attachment"> - Os itens não podem ser comprados enquanto forem parte de um anexo. + Objetos não podem ser adquiridos quando estão anexados. </notification> <notification label="Sobre o pedido de Permissão de Débito" name="DebitPermissionDetails"> Conceder esse pedido dá permissão ao script para tirar Linden dólares (L$) de sua conta. Para revogar esta permissão, o proprietário do objeto deve excluir o objeto ou resetar os scripts dele. <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="AutoWearNewClothing"> - Você gostaria de vestir automaticamente o item de vestuário que você criar? - <usetemplate ignoretext="Automaticamente vestir novo vestuário" name="okcancelignore" notext="Não" yestext="Sim"/> + Vestir automaticamente a roupa que você vai criar? + <usetemplate ignoretext="Vestir as roupas que eu criar enquanto edito minha aparência" name="okcancelignore" notext="Não" yestext="Sim"/> </notification> <notification name="NotAgeVerified"> - Você precisa ter a idade verificada para acessar este lote. -Gostaria de visitar o site do [SECOND_LIFE] para verificação de idade? + Ãrea restrita a residentes com idade comprovada. Deseja ir ao site do [SECOND_LIFE] para comprovar sua idade? [_URL] <url name="url" option="0"> https://secondlife.com/account/verification.php?lang=pt </url> - <usetemplate ignoretext="Alertar sobre a falta de verificação de idade" name="okcancelignore" notext="Não" yestext="Sim"/> + <usetemplate ignoretext="Ainda não comprovei minha idade" name="okcancelignore" notext="Não" yestext="Sim"/> </notification> <notification name="Cannot enter parcel: no payment info on file"> - Este lote exige que você tenha informações de pagamento no arquivo antes de poder acessá-lo. -Gostaria de visitar o site do [SECOND_LIFE] para configurá-lo? + Ãrea restrita a residentes que já cadastraram seus dados de pagamento Deseja ir ao site do [SECOND_LIFE] para cuidar disso? [_URL] <url name="url" option="0"> https://secondlife.com/account/index.php?lang=pt </url> - <usetemplate ignoretext="Avisar sobre a falta de informação de pagamento." name="okcancelignore" notext="Não" yestext="Sim"/> + <usetemplate ignoretext="Ainda não tenho cadastro de pagamento" name="okcancelignore" notext="Não" yestext="Sim"/> </notification> <notification name="MissingString"> A sequência [STRING_NAME] está faltando do strings.xml @@ -2354,6 +1992,9 @@ Gostaria de visitar o site do [SECOND_LIFE] para configurá-lo? <notification name="SystemMessageTip"> [MESSAGE] </notification> + <notification name="IMSystemMessageTip"> + [MESSAGE] + </notification> <notification name="Cancelled"> Cancelado </notification> @@ -2376,12 +2017,17 @@ Gostaria de visitar o site do [SECOND_LIFE] para configurá-lo? [FIRST] [LAST] está Offline </notification> <notification name="AddSelfFriend"> - Você não pode adicionar a si mesmo como amigo + Você é o máximo! Mesmo assim, não dá para adicionar a si mesmo(a) como amigo(a). </notification> <notification name="UploadingAuctionSnapshot"> Fazendo o upload das fotos do site da web e do mundo... (Leva cerca de 5 minutos) </notification> + <notification name="UploadConfirmation"> + O upload custa L$ [AMOUNT]. +Deseja continuar? + <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Upload"/> + </notification> <notification name="UploadPayment"> Você paga L$[AMOUNT] para fazer o upload. </notification> @@ -2395,11 +2041,10 @@ Gostaria de visitar o site do [SECOND_LIFE] para configurá-lo? Feito o download de Terrain.raw </notification> <notification name="GestureMissing"> - O Gesto [NAME] não se encontra na base de dados + O gesto [NAME] não está no banco de dados. </notification> <notification name="UnableToLoadGesture"> - ImpossÃvel de carregar o gesto [NAME]. -Por favor, tente novamente. + Falhar ao carregar o gesto [NAME]. </notification> <notification name="LandmarkMissing"> O landmark foi perdido na base de dados @@ -2408,14 +2053,14 @@ Por favor, tente novamente. ImpossÃvel carregar o landmark. Por favor, tente de novo. </notification> <notification name="CapsKeyOn"> - Seu botão CAPS LOCK está ativado. -Como isto afeta a senha digitada, você provavelmente desejará desativá-lo. + A tecla Maiúsc. está ligada. +Ela pode afetar a digitação da senha. </notification> <notification name="NotecardMissing"> Notecard foi perdido no banco de dados. </notification> <notification name="NotecardNoPermissions"> - Permissões insuficientes para visualizar o notecard + Você não está autorizado a ler esta nota. </notification> <notification name="RezItemNoPermissions"> Sem permissões suficientes para criar objetos. @@ -2453,11 +2098,11 @@ Por favor, tente novamente. Por favor, tente novamente. </notification> <notification name="CannotBuyObjectsFromDifferentOwners"> - ImpossÃvel comprar objetos de diferentes compradores ao mesmo tempo. -Por favor, compre apenas um objeto. + Só dá para comprar objetos de um dono por vez. +Selecione só um objeto. </notification> <notification name="ObjectNotForSale"> - Este objeto não está a venda. + Este objeto não está à venda. </notification> <notification name="EnteringGodMode"> Entrando em god mode, nÃvel [LEVEL] @@ -2466,10 +2111,10 @@ Por favor, compre apenas um objeto. Saindo do god mode, nÃvel [LEVEL] </notification> <notification name="CopyFailed"> - A cópia falhou porque você não tem permissão para copiar. + Você não está autorizado a copiar isso. </notification> <notification name="InventoryAccepted"> - [NAME] aceitou sua oferta de inventário. + [NAME] recebeu sua oferta de inventário. </notification> <notification name="InventoryDeclined"> [NAME] rejeitou sua oferta de inventário. @@ -2484,12 +2129,14 @@ Por favor, compre apenas um objeto. Seu cartão de visita foi negado. </notification> <notification name="TeleportToLandmark"> - Agora que você chegou à mainland, você pode se teletransportar para locais como '[NAME]' clicando no botão de Inventário, no canto direito inferior de sua tela, e selecionando a pasta Landmarks. -Dê um duplo-clique na landmark e clique Teletransportar para viajar para o local desejado. + Para se teletransportar para lugares como '[NAME]', abra o painel 'Lugares' à direita da tela e selecione a guia Marcos. +Basta clicar em qualquer marco e depois clicar em 'Teletransportar' na parte inferior da tela. +(Também é possÃvel clicar duas vezes no marco, ou clicar no marco com o botão direito e selecionar 'Teletransportar'.) </notification> <notification name="TeleportToPerson"> - Agora que você chegou à mainland, você pode contatar residentes como '[NAME]' clicando no botão de Inventário, canto direito inferior de sua tela, e selecionando a pasta Cartões de Visita. -Dê um duplo-clique num cartão de visita e em Mensagem Instantânea, digite sua mensagem. + Para entrar em contato com residentes como ''[NAME]', abra o painel 'Pessoas' à direita da tela. +Selecione o residente da lista e clique em 'MI' na parte de baixo do painel. +(Também é possÃvel clicar duas vezes no nome, ou clicar no nome com o botão direito e selecionar 'MI'.) </notification> <notification name="CantSelectLandFromMultipleRegions"> ImpossÃvel selecionar terra nas fronteiras do servidor. Tente selecionar um pedaço menor de terra. @@ -2511,6 +2158,9 @@ Dê um duplo-clique num cartão de visita e em Mensagem Instantânea, digite sua <notification name="SystemMessage"> [MESSAGE] </notification> + <notification name="PaymentRecived"> + [MESSAGE] + </notification> <notification name="EventNotification"> Notificação de evento: @@ -2533,8 +2183,20 @@ Dê um duplo-clique num cartão de visita e em Mensagem Instantânea, digite sua [NAMES] </notification> <notification name="NoQuickTime"> - O software QuickTime da Apple parece não estar instalado em seu sistema. -Se você deseja ver fluxo de mÃdia em terrenos que aceitem isso, você deverá ir ao site do QickTime (http://www.apple.com/quicktime) e instalar o player do QuickTime. + Aparentemente o QuickTime da Apple ainda não foi instalado no seu computador. +Para ver mÃdia em stream nas regiões que oferecem esse formato, vá ao [http://www.apple.com/quicktime site do QuickTime] e instale o QuickTime Player. + </notification> + <notification name="NoPlugin"> + Nenhum plugin de mÃdia detectado para lidar com o tipo de mime "[MIME_TYPE]". Este tipo de mÃdia não poderão ser acessados. + </notification> + <notification name="MediaPluginFailed"> + Falha no plugin de mÃdia abaixo: + [PLUGIN] + +Instale o plugin novamente ou contate o fabricante se o problema persistir. + <form name="form"> + <ignore name="ignore" text="Falha do plugin de mÃdia"/> + </form> </notification> <notification name="OwnedObjectsReturned"> Os objetos que lhe pertencem no lote selecionado do terreno, voltaram ao seu inventário. @@ -2543,7 +2205,7 @@ Se você deseja ver fluxo de mÃdia em terrenos que aceitem isso, você deverá Os objetos no lote selecionado de terra que pertence a [FIRST] [LAST], voltaram ao seu inventário. </notification> <notification name="OtherObjectsReturned2"> - Os objetos no lote de terra selecionado que pertence ao residente '[NAME]', voltaram aos seus donos. + Os objetos no lote selecionado, do residente [NAME], foram devolidos ao proprietãrio. </notification> <notification name="GroupObjectsReturned"> Os objetos no lote selecionado de terreno compartilhado pelo grupo [GROUPNAME], voltaram para os inventários de seus donos. @@ -2553,23 +2215,26 @@ Objetos não transferÃveis dados ao grupo foram deletados. <notification name="UnOwnedObjectsReturned"> Os objetos no lote selecionado que NÃO são seus, voltaram aos seus donos. </notification> + <notification name="ServerObjectMessage"> + Mensagem de [NAME]: +<nolink>[MSG]</nolink> + </notification> <notification name="NotSafe"> - Esta terra permite que você sofra ataques. -Você pode ser ferido aqui. Se você morrer, você será teletransportado à sua posição inicial. + A opção 'danos' desta região está ativada. +Você pode se dar mal aqui. Se você morrer, você será teletransportado de volta para seu inÃcio. </notification> <notification name="NoFly"> - Este terreno tem a opção Voar desabilitada. -Ou seja, você não pode voar aqui. + Esta área desativou a opção de voar. +Logo, não é possÃvel voar aqui. </notification> <notification name="PushRestricted"> - Esta terra é “Não empurreâ€. -Você não pode empurrar os outros, a não ser que seja o proprietário da terra. + Esta área não tolera empurrões. Não é possÃvel empurrar os outros aqui, a não ser que você seja o proprietário. </notification> <notification name="NoVoice"> - O uso de voz está desabilitado nesta terra. + Esta área desativou o bate-papo de voz. Você não vai ouvir ninguém falar. </notification> <notification name="NoBuild"> - Este terreno tem a opção de construir desabilitada, ou seja, você não pode criar objetos aqui. + Esta área desativou a opção de construir. Não é possÃvel construir ou fazer rez de objetos nesta área. </notification> <notification name="ScriptsStopped"> Um administrador não permitiu scripts temporariamente nesta região. @@ -2578,10 +2243,12 @@ Você não pode empurrar os outros, a não ser que seja o proprietário da terra Esta região não roda nenhum script. </notification> <notification name="NoOutsideScripts"> - Neste terreno, nenhum script funcionará, a não ser os scripts do próprio dono da terra. + Esta região não permite scripts de fora. + +Os únicos scripts que funcionam são os do proprietário do terreno. </notification> <notification name="ClaimPublicLand"> - Pode apenas reclamar terreno público na região em que você está. + Você só pode reivindicar terrenos públicos na região onde você está. </notification> <notification name="RegionTPAccessBlocked"> Você não é permitido na Região devido à sua Classificação de maturidade. Você precisa validar sua idade e/ou instalar o último Visualizador. @@ -2594,16 +2261,9 @@ Por favor, vá ao Banco de Conhecimento para detalhes sobre o acesso de áreas c <notification name="NoTeenGridAccess"> Sua conta não pode conectar a esta região da grade teen. </notification> - <notification name="NoHelpIslandTP"> - Você não pode se tele-transportar de volta à Ilha de Ajuda. -Vá para a Ilha de Ajuda Pública para repetir este tutorial. - </notification> <notification name="ImproperPaymentStatus"> Você não tem o status de pagamento adequado para entrar nesta região. </notification> - <notification name="MustGetAgeRegion"> - Você precisa ter sua idade verificada para entrar nesta região. - </notification> <notification name="MustGetAgeParcel"> Você precisa ter a idade verificada para entrar neste lote. </notification> @@ -2666,31 +2326,26 @@ Por favor, tente novamente em alguns instantes. Nenhum lote válido foi encontrado. </notification> <notification name="ObjectGiveItem"> - Um objeto nomeado [OBJECTFROMNAME] do dono [FIRST] [LAST] deu a você [OBJECTTYPE] nomeado '[OBJECTNAME]'. + Um objeto chamado [OBJECTFROMNAME] de [NAME_SLURL] lhe deu [OBJECTTYPE]: +[ITEM_SLURL] <form name="form"> <button name="Keep" text="Segure"/> <button name="Discard" text="Descarte"/> - <button name="Mute" text="Mudo"/> - </form> - </notification> - <notification name="ObjectGiveItemUnknownUser"> - Um objeto nomeado [OBJECTFROMNAME], de dono desconhecido, deu a você um [OBJECTTYPE] nomeado [OBJECTNAME]. - <form name="form"> - <button name="Keep" text="Segure"/> - <button name="Discard" text="Descarte"/> - <button name="Mute" text="Mudo"/> + <button name="Mute" text="Bloquear"/> </form> </notification> <notification name="UserGiveItem"> - [NAME]deu a voce um [OBJECTTYPE] nomeado '[OBJECTNAME]'. + [NAME_SLURL] lhe deu [OBJECTTYPE]: +[ITEM_SLURL] <form name="form"> - <button name="Keep" text="Mantenha"/> + <button name="Show" text="Mostrar"/> <button name="Discard" text="Descarte"/> - <button name="Mute" text="Mudo"/> + <button name="Mute" text="Bloquear"/> </form> </notification> <notification name="GodMessage"> [NAME] + [MESSAGE] </notification> <notification name="JoinGroup"> @@ -2702,14 +2357,17 @@ Por favor, tente novamente em alguns instantes. </form> </notification> <notification name="TeleportOffered"> - [NAME] ofereceu um teletransporte para seu local: + [NAME_SLURL] quer teletransportar você para a região deles: -[MESSAGE] +[MESSAGE] - [MATURITY_STR] <icon>[MATURITY_ICON]</icon> <form name="form"> <button name="Teleport" text="Teletransporte"/> <button name="Cancel" text="Cancelar"/> </form> </notification> + <notification name="TeleportOfferSent"> + Oferta de teletransporte enviada para [TO_NAME] + </notification> <notification name="GotoURL"> [MESSAGE] [URL] @@ -2719,16 +2377,19 @@ Por favor, tente novamente em alguns instantes. </form> </notification> <notification name="OfferFriendship"> - [NAME] está lhe oferecendo sua amizade + [NAME_SLURL] quer a sua amizade. [MESSAGE] -(Por definição vocês serão capazes de ver um ao outro online) +Cada um pode ver o status do outro (definição padrão). <form name="form"> <button name="Accept" text="Aceitar"/> <button name="Decline" text="Recusar"/> </form> </notification> + <notification name="FriendshipOffered"> + Você convidou [TO_NAME] para ser seu amigo(a) + </notification> <notification name="OfferFriendshipNoMessage"> [NAME] está lhe oferecendo sua amizade. @@ -2744,21 +2405,27 @@ Por favor, tente novamente em alguns instantes. <notification name="FriendshipDeclined"> [NAME] recusou seu convite de amizade </notification> + <notification name="FriendshipAcceptedByMe"> + Oferta de amizada aceita. + </notification> + <notification name="FriendshipDeclinedByMe"> + Oferta de amizada aceita. + </notification> <notification name="OfferCallingCard"> - [FIRST] [LAST] está oferecendo seu cartão de visita. -Isto adicionará uma anotação em seu inventário, de modo que você possa mandar rapidamente uma IM para este residente. + [FIRST] [LAST] estão te oferecendo um cartão de visita. +Ele colocará um item de inventário, para você possa contatá-lo facilmente. <form name="form"> <button name="Accept" text="Aceitar"/> <button name="Decline" text="Recusar"/> </form> </notification> <notification name="RegionRestartMinutes"> - A região será reiniciada em [MINUTES] minutos. -Se permanecer nesta região, você será desconectado. + Esta região será reiniciada em [MINUTES] minutos. +Se permanecer aqui, você será desconectado. </notification> <notification name="RegionRestartSeconds"> - Região será reiniciada em [SECONDS] segundos. -Se permanecer nesta região, você será desconectado. + Esta região será reiniciada em [SECONDS] segundos. +Se permanecer aqui, você será desconectado. </notification> <notification name="LoadWebPage"> Carregar página da web [URL]? @@ -2777,8 +2444,11 @@ Do objeto: [OBJECTNAME], dono: [NAME]? <notification name="FailedToFindWearable"> Falhou ao procurar [TYPE] nomeado [DESC] no banco de dados. </notification> + <notification name="ShareToWebFailed"> + Falha de upload da imagem na web. + </notification> <notification name="InvalidWearable"> - O item que você está tentando vestir usa uma caracterÃstica que seu Visualizador não lê. Por favor, atualize sua versão do [APP_NAME] para vestir este item. + O item que você está tentando usar tem um recurso que seu Visualizador não consegue ler. Atualize o [APP_NAME] para poder vestir esse item. </notification> <notification name="ScriptQuestion"> '[OBJECTNAME]', um objeto pertencente a '[NAME]', gostaria de: @@ -2788,16 +2458,16 @@ Está OK? <form name="form"> <button name="Yes" text="Sim"/> <button name="No" text="Não"/> - <button name="Mute" text="Mudo"/> + <button name="Mute" text="Bloquear"/> </form> </notification> <notification name="ScriptQuestionCaution"> - '[OBJECTNAME]', um objeto de '[NAME]', gostaria de: + Um objeto chamado '[OBJECTNAME]', de '[NAME]' gostaria de: [QUESTIONS] -Se você não confia neste objeto ou em seu criador, você deveria negar o pedido. Para informações adicionais clique no botão Detalhes. +Se você não confia nos objetos deste autor, recuse-o. -Autorizar este pedido? +Deixar? <form name="form"> <button name="Grant" text="Autorizar"/> <button name="Deny" text="Negar"/> @@ -2818,39 +2488,12 @@ Autorizar este pedido? <button name="Ignore" text="Ignorar"/> </form> </notification> - <notification name="FirstBalanceIncrease"> - Você recebeu uma quantia de L$[AMOUNT]. -Objetos e outros usuários podem dar L$ a você. -Seu saldo é mostrado no canto superior direito da tela. - </notification> - <notification name="FirstBalanceDecrease"> - Você pagou L$[AMOUNT]. -O seu balanço de dinheiro está sendo mostrado no canto superior direito da tela. - </notification> - <notification name="FirstSit"> - Você está sentado. -Use as setas (ou AWSD) para mudar a visão. -Clique em 'Levantar' para levantar. - </notification> - <notification name="FirstMap"> - Clique e arraste para movimentar o mapa. -Dê um duplo clique para teletransportar-se. -Use os controles à direita para achar coisas e mostrar fundos diferentes. - </notification> - <notification name="FirstBuild"> - Você pode construir novos objetos em algumas áreas do [SECOND_LIFE]. -Use as ferramentas acima, à esquerda para construir e tente manter apertadas as teclas Ctrl ou Alt para mudar rapidamente as ferramentas. -Aperte ESC para parar de construir. - </notification> - <notification name="FirstLeftClickNoHit"> - Clicando com esquerdo, você interage com os objetos especiais. -Se o ponteiro do mouse mudar a uma mão, você pode interagir com o objeto. -Clique com o direito que será mostrado sempre um menu das ações que você pode fazer. - </notification> - <notification name="FirstTeleport"> - Esta região não permite teletransporte ponto-a-ponto. Assim, você foi teletransportado para o telehub mais próximo. -Seu destino está assinalado com um farol alto. -Siga a flecha vermelha até o farol, ou clique nela para apagar o farol. + <notification name="BuyLindenDollarSuccess"> + Obrigado e volte sempre! + +Seu saldo L$ será atualizado findo o processamento da transação. Se o processamento levar mais de 20 min, a transação pode vir a ser cancelada. Neste caso, o valor da compra será creditado ao seu saldo em US$. + +Para checar o status do pagamento, consulte seu Histórico de transações no [http://secondlife.com/account/ Painel] </notification> <notification name="FirstOverrideKeys"> Suas chaves do movimento estão sendo seguras agora por um objeto. @@ -2858,88 +2501,57 @@ Tente as teclas de setas ou AWSD para ver o que elas fazem. Alguns objetos (como armas) requerem que você passe para mouselook para usá-los. Pressione 'M' para fazer isto. </notification> - <notification name="FirstAppearance"> - Você está editando sua aparência. -Para girar e ver em zoom, use as teclas de setas. -Quando terminar, aperte 'Salvar Tudo' para salvar sua aparência e sair. -Você pode editar sua aparência quantas vezes quiser. - </notification> - <notification name="FirstInventory"> - Este é o seu inventário, que contém objetos, notecards, roupas e outras coisas suas. -* Para vestir um objeto ou uma pasta completa, arraste-o para si mesmo(a). -* Para trzer um objeto ao mundo, arraste-o ao chão. -* Para ler um notecard, dê um duplo-click nele. - </notification> <notification name="FirstSandbox"> - Esta é a região conhecida como sandbox. -Os objetos que você constrói aqui podem ser deletados depois que você deixa a área. -As sandboxes são limpas de forma periódica. -Por favor, veja a informação no alto da tela, próxima ao nome da região. -As regiões de sandbox não são comuns e são marcadas com sÃmbolos. - </notification> - <notification name="FirstFlexible"> - Este objeto tem a propriedade flexÃvel. -Objetos flexÃveis não podem ser fÃsicos e devem ser fantasmas até que a caixa de verificação seja desmarcada. - </notification> - <notification name="FirstDebugMenus"> - Você ativou o menu Avançado. -Este menu contém funcionalidades úteis para desenvolvedores debugarem o [SECOND_LIFE]. -Para mostrar esse menu no Windows pressione Ctrl+Alt+D. No Mac pressione ⌥⌘D. - </notification> - <notification name="FirstSculptedPrim"> - Você está editando uma primitiva esculpida. -Primitivas esculpidas requerem uma textura especial para especificar suas formas. -Você encontrará exemplos dessas texturas na Biblioteca do Inventário. - </notification> - <notification name="FirstMedia"> - Você começou a tocar uma mÃdia. MÃdias podem ser autorizadas a iniciar automaticamente se você assim escolher na janela de Preferências, sob Ãudio/VÃdeo. Atente para o risco de segurança que pode haver ao acessar websites de mÃdia que você não confia. + Este é um sandbox, uma área onde residentes podem aprender a construir. + +Qualquer objeto deixado aqui será apagado quando você sair. Não se esqueça de clicar duas vezes e selecionar 'Pegar' para levar seu projeto para o seu inventário. </notification> <notification name="MaxListSelectMessage"> Você pode selecionar até [MAX_SELECT] itens desta lista. </notification> <notification name="VoiceInviteP2P"> - [NAME] está lhe convidando para uma conversa com voz. -Clique Aceitar para atender, ou Recusar para recusar o convite. Clique Mudo para calar quem está chamando. + [NAME] está te convidando para um bate-papo de voz. +Clique em Aceitar para atender ou em Recusar para recusar este convite. Clique em Bloquear para bloquear ligações deste avatar. <form name="form"> <button name="Accept" text="Aceitar"/> <button name="Decline" text="Recusar"/> - <button name="Mute" text="Mudo"/> + <button name="Mute" text="Bloquear"/> </form> </notification> <notification name="AutoUnmuteByIM"> - [FIRST] [LAST] recebeu uma Mensagem Instantânea sua e automaticamente não está mais no modo mudo. + [FIRST] [LAST] recebeu uma MI e foi desbloqueado(a) automaticamente. </notification> <notification name="AutoUnmuteByMoney"> - [FIRST] [LAST] recebeu pagamento seu e automaticamente não está mais no modo mudo. + [FIRST] [LAST] recebeu dinheiro e foi desbloqueado(a) automaticamente. </notification> <notification name="AutoUnmuteByInventory"> - [FIRST] [LAST] recebeu inventário seu e automaticamente não está mais mudo. + [FIRST] [LAST] recebeu dinheiro e foi desbloqueado(a) automaticamente. </notification> <notification name="VoiceInviteGroup"> - [NAME] juntou-se a uma conversa com voz do grupo [GROUP]. -Clique Aceitar para atender, ou Recusar para recusar o convite. Clique Mudo para calar quem está chamando. + [NAME] atendeu uma ligação de bate-papo de voz com o grupo [GROUP]. +Clique em Aceitar para atender ou em Recusar para recusar este convite. Clique em Bloquear para bloquear ligações deste avatar. <form name="form"> <button name="Accept" text="Aceitar"/> <button name="Decline" text="Recusar"/> - <button name="Mute" text="Mudo"/> + <button name="Mute" text="Bloquear"/> </form> </notification> <notification name="VoiceInviteAdHoc"> - [NAME] juntou-se a uma chamada de Conferência com voz... -Clique Aceitar para juntar-se à chamada ou Recusar para recusar o convite. Clique Mudo para calar este usuário. + [NAME] atendeu uma ligação de teleconferência. +Clique em Aceitar para atender ou em Recusar para recusar este convite. Clique em Bloquear para bloquear ligações deste avatar. <form name="form"> <button name="Accept" text="Aceitar"/> <button name="Decline" text="Recusar"/> - <button name="Mute" text="Mudo"/> + <button name="Mute" text="Bloquear"/> </form> </notification> <notification name="InviteAdHoc"> - [NAME] está lhe convidando para uma conversa em conferência... - Clique Aceitar para se juntar à conversa, ou Recusar para recusar o convite. Clique Mudo para calar este usuário. + [NAME] está te convidando para uma teleconferência de bate-papo. +Clique em Aceitar para atender ou em Recusar para recusar este convite. Clique em Bloquear para bloquear ligações deste avatar. <form name="form"> <button name="Accept" text="Aceitar"/> <button name="Decline" text="Recusar"/> - <button name="Mute" text="Mudo"/> + <button name="Mute" text="Bloquear"/> </form> </notification> <notification name="VoiceChannelFull"> @@ -2949,25 +2561,40 @@ Clique Aceitar para juntar-se à chamada ou Recusar para recusar o convite. Cliq Desculpe-nos. Esta área atingiu seu limite de capacidade para conversas com voz. Favor tentar usar voz em outra área. </notification> <notification name="VoiceChannelDisconnected"> - Você foi desconectado de [VOICE_CHANNEL_NAME]. Voce será reconectado agora à Conversa com voz local. + Você saiu da ligação com [VOICE_CHANNEL_NAME]. Agora você será reconectado ao bate-papo local. </notification> <notification name="VoiceChannelDisconnectedP2P"> - [VOICE_CHANNEL_NAME] desligou a chamada. Voce será reconectado agora à Conversa com voz local. + [VOICE_CHANNEL_NAME] encerrou a ligação. Agora você será reconectado ao bate-papo local. </notification> <notification name="P2PCallDeclined"> - [VOICE_CHANNEL_NAME] recusou sua chamada. Voce será reconectado agora à Conversa com voz local. + [VOICE_CHANNEL_NAME] recusou a ligação. Agora você será reconectado ao bate-papo local. </notification> <notification name="P2PCallNoAnswer"> - [VOICE_CHANNEL_NAME] não está disponÃvel para aceitar sua chamada. Voce será reconectado agora à Conversa com voz local. + [VOICE_CHANNEL_NAME] não está disponÃvel para atender sua ligação. Agora você será reconectado ao bate-papo local. </notification> <notification name="VoiceChannelJoinFailed"> - Falha na conexão com [VOICE_CHANNEL_NAME], tente novamente mais tarde. Voce será reconectado agora à Conversa com voz local. + Falha de conexão com [VOICE_CHANNEL_NAME]. Tente novamente mais tarde. Agora você será reconectado ao bate-papo local. </notification> <notification name="VoiceLoginRetry"> Estamos criando uma canal de voz para você. Isto pode levar até um minuto. </notification> + <notification name="VoiceEffectsExpired"> + Um ou mais serviços de distorção de voz que você assinou veceu. +[[URL] Clique aqui] para renovar o serviço. + </notification> + <notification name="VoiceEffectsExpiredInUse"> + A Distorção de voz ativa expirou. Suas configurações de voz padrão foram ativadas. +[[URL] Clique aqui] para renovar o serviço. + </notification> + <notification name="VoiceEffectsWillExpire"> + Uma ou mais das suas distorções de voz tem vencimento em menos de [INTERVAL] dias. +[[URL] Clique aqui] para renovar o serviço. + </notification> + <notification name="VoiceEffectsNew"> + Novas Distorções de voz! + </notification> <notification name="Cannot enter parcel: not a group member"> - Você não pode entrar nessa terra, você não é membro do grupo autorizado. + Só membros de um grupo podem acessar esta área. </notification> <notification name="Cannot enter parcel: banned"> Você não pode entrar nessa terra, você foi banido. @@ -2982,18 +2609,152 @@ Clique Aceitar para juntar-se à chamada ou Recusar para recusar o convite. Cliq Ocorreu um erro enquanto você tentava se conectar à conversa de voz de [VOICE_CHANNEL_NAME]. Favor tentar novamente mais tarde. </notification> <notification name="ServerVersionChanged"> - A região em que você entrou está rodando uma versão diferente de simulador. Clique aqui para mais detalhes. + Você chegou a uma região com uma versão diferente de servidor, que pode afetar o desempenho. [[URL] Consultar notas da versão.] + </notification> + <notification name="UnsupportedCommandSLURL"> + O SLurl no qual você clicou não é suportado. + </notification> + <notification name="BlockedSLURL"> + Um SLurl recebido de um navegador inidôneo foi bloqueado para a sua segurança. + </notification> + <notification name="ThrottledSLURL"> + Vários SLurls foram recebidos de um navegador inidôneo em pouco tempo. +Para sua segurança, os SLurls serão bloqueados por alguns instantes. + </notification> + <notification name="IMToast"> + [MESSAGE] + <form name="form"> + <button name="respondbutton" text="Responder"/> + </form> + </notification> + <notification name="ConfirmCloseAll"> + Tem certeza de que quer fechar todas as MIs? + <usetemplate ignoretext="Confirmar antes de fechar todas as MIs" name="okcancelignore" notext="Cancelar" yestext="OK"/> + </notification> + <notification name="AttachmentSaved"> + Anexo salvo. + </notification> + <notification name="UnableToFindHelpTopic"> + Nenhum tópico de ajuda foi encontrado com relação a este elemento. + </notification> + <notification name="ObjectMediaFailure"> + Erro do servidor: Falha ao atualizar ou executar a mÃdia. +'[ERROR]' + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="TextChatIsMutedByModerator"> + Seu texto de bate-papo foi silenciado pelo moderador. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="VoiceIsMutedByModerator"> + Sua voz foi silenciada pelo moderador. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="ConfirmClearTeleportHistory"> + Tem certeza que deseja apagar todo o seu histórico de teletransporte? + <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> + </notification> + <notification name="BottomTrayButtonCanNotBeShown"> + O botão selecionado não pode ser exibido no momento. +O botão será exibido quando houver espaço suficente. + </notification> + <notification name="ShareNotification"> + Selecione os residentes com quem compartilhar. + </notification> + <notification name="ShareItemsConfirmation"> + Tem certeza de que quer compartilhar os items abaixo? + +[ITENS] + +Com os seguintes residentes: + +[RESIDENTS] + <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> + </notification> + <notification name="ItemsShared"> + Itens compartilhados. + </notification> + <notification name="DeedToGroupFail"> + Ocorreu uma falha durante a doação ao grupo. + </notification> + <notification name="AvatarRezNotification"> + ( [EXISTENCE] segundos de vida ) +O avatar de '[NAME]' emergiu em [TIME] segundos. </notification> - <notification name="UnableToOpenCommandURL"> - A URL que vocÊ clicou não pode ser aberta no navegador web. + <notification name="AvatarRezSelfBakedDoneNotification"> + ( [EXISTENCE] segundos de vida ) +Você confeccionou seu look em [TIME] segundos. + </notification> + <notification name="AvatarRezSelfBakedUpdateNotification"> + ( [EXISTENCE] segundos de vida ) +Você enviou uma atualização da sua aparência em [TIME] segundos. +[STATUS] + </notification> + <notification name="AvatarRezCloudNotification"> + ( [EXISTENCE] segundos de vida ) +Avatar '[NAME]' transformou-se em nuvem. + </notification> + <notification name="AvatarRezArrivedNotification"> + ( [EXISTENCE] segundos de vida ) +Avatar '[NAME]' surgiu. + </notification> + <notification name="AvatarRezLeftCloudNotification"> + ( [EXISTENCE] segundos de vida ) +O avatar de '[NAME]' transformou-se em nuvem depois de [TIME] segundos. + </notification> + <notification name="AvatarRezEnteredAppearanceNotification"> + ( [EXISTENCE] segundos de vida ) +Avatar '[NAME]' entrou no modo aparência. + </notification> + <notification name="AvatarRezLeftAppearanceNotification"> + ( [EXISTENCE] segundos de vida ) +Avatar '[NAME]' sair do modo aparecer. + </notification> + <notification name="NoConnect"> + Detectamos um problema de conexão com [PROTOCOL] [HOSTID]. +Verifique a configuração da sua rede e firewall. + <form name="form"> + <button name="OK" text="OK"/> + </form> + </notification> + <notification name="NoVoiceConnect"> + Estamos tendo problemas de conexão com o seu servidor de voz: + +[HOSTID] + +Talvez não seja possÃvel se comunicar via voz. +Verifique a configuração da sua rede e firewall. + <form name="form"> + <button name="OK" text="OK"/> + </form> + </notification> + <notification name="AvatarRezLeftNotification"> + ( [EXISTENCE] segundos de vida ) +Avatar '[NAME]' saiu totalmente carregado. + </notification> + <notification name="AvatarRezSelfBakeNotification"> + ( [EXISTENCE] segundos de vida ) +Você carregou uma textura com [RESOLUTION] para o(a) '[BODYREGION]' em [TIME] segundos. + </notification> + <notification name="ConfirmLeaveCall"> + Tem certeza de que quer sair desta ligação? + <usetemplate ignoretext="Confirmar antes de deixar ligação" name="okcancelignore" notext="Não" yestext="Sim"/> + </notification> + <notification name="ConfirmMuteAll"> + Você silenciou todos os participantes de uma ligação de grupo. +Todos os demais residentes que entrarem na ligação mais tarde também serão silenciados, mesmo se você sair da ligação. + + +Silenciar todos? + <usetemplate ignoretext="Confirmar antes de silenciar todos os participantes em ligações de grupo." name="okcancelignore" notext="Cancelar" yestext="OK"/> </notification> <global name="UnsupportedCPU"> - A velocidade da sua CPU não suporta os requisitos mÃnimos exigidos. </global> <global name="UnsupportedGLRequirements"> - Você não parece ter os requisitos de hardware recomendados para rodar o [APP_NAME]. O [APP_NAME] exige uma placa gráfica OpenGL que tem apoio a multi- texturas. Se este for o caso, você pode se certificar de que tem os drivers mais recentes para sua placa gráfica, e os patches e pacotes de serviços para seu sistema operacional. + Aparentemente a sua máquina não atende os requisitos de hardware do [APP_NAME]. [APP_NAME] requer placas de vÃdeo OpenGL com suporte a multitexturas. Se sua place de vÃdeo tiver este perfil, atualize o driver da placa de vÃdeo, assim como patches e service packs do sistema operacional. -Se continuar com problemas, por favor visite: http://www.secondlife.com/support +Se você continuar a receber esta mensagem, consulte o [SUPPORT_SITE]. </global> <global name="UnsupportedCPUAmount"> 796 @@ -3007,10 +2768,8 @@ Se continuar com problemas, por favor visite: http://www.secondlife.com/support <global name="UnsupportedRAM"> - A memória do seu sistema não suporta os requisitos mÃnimos exigidos. </global> - <global name="PermYes"> - Sim - </global> - <global name="PermNo"> - Não + <global name="You can only set your 'Home Location' on your land or at a mainland Infohub."> + Se você tem um terreno, seu terreno pode ser seu inÃcio. +Outra opção é procurar por lugares com a tag 'Infohub' no mapa. </global> </notifications> diff --git a/indra/newview/skins/default/xui/pt/outfit_accordion_tab.xml b/indra/newview/skins/default/xui/pt/outfit_accordion_tab.xml new file mode 100644 index 0000000000..b1ffa0d2e5 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/outfit_accordion_tab.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- *NOTE: mantipov: this xml is intended to be used inside panel_outfits_list.xml for each outfit folder--> +<!-- All accordion tabs in the My Appearance/My Outfits panel will be created from this one at runtume--> +<accordion_tab name="Mockup Tab" title="Guia Protótipo"/> diff --git a/indra/newview/skins/default/xui/pt/panel_active_object_row.xml b/indra/newview/skins/default/xui/pt/panel_active_object_row.xml new file mode 100644 index 0000000000..73f6b2225f --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_active_object_row.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_activeim_row"> + <string name="unknown_obj"> + Objeto desconhecido + </string> + <text name="object_name"> + Objeto sem nome + </text> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_adhoc_control_panel.xml b/indra/newview/skins/default/xui/pt/panel_adhoc_control_panel.xml new file mode 100644 index 0000000000..bd50d4953d --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_adhoc_control_panel.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_im_control_panel"> + <layout_stack name="vertical_stack"> + <layout_panel name="call_btn_panel"> + <button label="Ligar" name="call_btn"/> + </layout_panel> + <layout_panel name="end_call_btn_panel"> + <button label="Desligar" name="end_call_btn"/> + </layout_panel> + <layout_panel name="voice_ctrls_btn_panel"> + <button label="Controles de voz" name="voice_ctrls_btn"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/pt/panel_avatar_list_item.xml new file mode 100644 index 0000000000..06d8823a74 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_avatar_list_item.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="avatar_list_item"> + <string name="FormatSeconds"> + [COUNT]s + </string> + <string name="FormatMinutes"> + [COUNT]min + </string> + <string name="FormatHours"> + [COUNT]h + </string> + <string name="FormatDays"> + [COUNT]dias + </string> + <string name="FormatWeeks"> + [COUNT]semanas + </string> + <string name="FormatMonths"> + [COUNT]meses + </string> + <string name="FormatYears"> + [COUNT]anos + </string> + <text name="avatar_name" value="Desconhecido"/> + <button name="profile_btn" tool_tip="Ver perfil"/> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_block_list_sidetray.xml b/indra/newview/skins/default/xui/pt/panel_block_list_sidetray.xml new file mode 100644 index 0000000000..c5f93d719a --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_block_list_sidetray.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="block_list_panel"> + <text name="title_text"> + Lista de bloqueados + </text> + <scroll_list name="blocked" tool_tip="Lista atual dos residentes bloqueados"/> + <button label="Bloquear residente..." label_selected="Bloquear residente..." name="Block resident..." tool_tip="Selecione o residente a bloquear"/> + <button label="Bloquear objeto por nome..." label_selected="Bloquear objeto por nome..." name="Block object by name..."/> + <button label="Desbloquear" label_selected="Desbloquear" name="Unblock" tool_tip="Remover residente ou objeto da lista dos bloqueados"/> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_body_parts_list_item.xml b/indra/newview/skins/default/xui/pt/panel_body_parts_list_item.xml new file mode 100644 index 0000000000..de764d8025 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_body_parts_list_item.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="wearable_item"> + <text name="item_name" value="..."/> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_bodyparts_list_button_bar.xml b/indra/newview/skins/default/xui/pt/panel_bodyparts_list_button_bar.xml new file mode 100644 index 0000000000..094a03553b --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_bodyparts_list_button_bar.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="clothing_list_button_bar_panel"> + <button label="Trocar" name="switch_btn"/> + <button label="Comprar >" name="bodyparts_shop_btn"/> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_bottomtray.xml b/indra/newview/skins/default/xui/pt/panel_bottomtray.xml new file mode 100644 index 0000000000..9fd7da55df --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_bottomtray.xml @@ -0,0 +1,49 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="bottom_tray"> + <string name="SpeakBtnToolTip" value="Liga e desliga o microfone"/> + <string name="VoiceControlBtnToolTip" value="Mostra/oculta os controles de voz"/> + <layout_stack name="toolbar_stack"> + <layout_panel name="speak_panel"> + <talk_button name="talk"> + <speak_button label="Falar" label_selected="Falar" name="speak_btn"/> + </talk_button> + </layout_panel> + <layout_panel name="gesture_panel"> + <gesture_combo_list label="Gesto" name="Gesture" tool_tip="Mostra/oculta os gestos"/> + </layout_panel> + <layout_panel name="movement_panel"> + <button label="Movimentar" name="movement_btn" tool_tip="Mostra/oculta os controles de movimento"/> + </layout_panel> + <layout_panel name="cam_panel"> + <button label="Exibir" name="camera_btn" tool_tip="Mostra/oculta os controles da câmera"/> + </layout_panel> + <layout_panel name="snapshot_panel"> + <button label="" name="snapshots" tool_tip="Tirar foto"/> + </layout_panel> + <layout_panel name="sidebar_btn_panel"> + <button label="Barra lateral" name="sidebar_btn" tool_tip="Mostra/oculta a barra lateral"/> + </layout_panel> + <layout_panel name="build_btn_panel"> + <button label="Construir" name="build_btn" tool_tip="Mostra/oculta ferramentas de Construção"/> + </layout_panel> + <layout_panel name="search_btn_panel"> + <button label="Busca" name="search_btn" tool_tip="Mostra/oculta os gestos"/> + </layout_panel> + <layout_panel name="world_map_btn_panel"> + <button label="Mapa" name="world_map_btn" tool_tip="Mostra/oculta o Mapa Múndi"/> + </layout_panel> + <layout_panel name="mini_map_btn_panel"> + <button label="Mini Mapa" name="mini_map_btn" tool_tip="Mostra/oculta o Mini Mapa"/> + </layout_panel> + <layout_panel name="im_well_panel"> + <chiclet_im_well name="im_well"> + <button name="Unread IM messages" tool_tip="Conversas"/> + </chiclet_im_well> + </layout_panel> + <layout_panel name="notification_well_panel"> + <chiclet_notification name="notification_well"> + <button name="Unread" tool_tip="Notificações"/> + </chiclet_notification> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_bottomtray_lite.xml b/indra/newview/skins/default/xui/pt/panel_bottomtray_lite.xml new file mode 100644 index 0000000000..78d9826099 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_bottomtray_lite.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="bottom_tray_lite"> + <layout_stack name="toolbar_stack_lite"> + <layout_panel name="gesture_panel"> + <gesture_combo_list label="Gesto" name="Gesture" tool_tip="Mostra/oculta os gestos"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_classified_info.xml b/indra/newview/skins/default/xui/pt/panel_classified_info.xml new file mode 100644 index 0000000000..191c005b1a --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_classified_info.xml @@ -0,0 +1,53 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_classified_info"> + <panel.string name="l$_price"> + L$ [PRICE] + </panel.string> + <panel.string name="click_through_text_fmt"> + [TELEPORT] teletransporte, [MAP] mapa, [PROFILE] perfil + </panel.string> + <panel.string name="date_fmt"> + [mthnum,datetime,slt]/[day,datetime,slt]/[year,datetime,slt] + </panel.string> + <panel.string name="auto_renew_on"> + Ativado + </panel.string> + <panel.string name="auto_renew_off"> + Desativado + </panel.string> + <text name="title" value="Dados do anúncio"/> + <scroll_container name="profile_scroll"> + <panel name="scroll_content_panel"> + <text_editor name="classified_name" value="[name]"/> + <text name="classified_location_label" value="Localização:"/> + <text_editor name="classified_location" value="[loading...]"/> + <text name="content_type_label" value="Tipo de conteúdo:"/> + <text_editor name="content_type" value="[content type]"/> + <text name="category_label" value="Categoria:"/> + <text_editor name="category" value="[category]"/> + <text name="creation_date_label" value="Data de criação"/> + <text_editor name="creation_date" tool_tip="Data de criação" value="[date]"/> + <text name="price_for_listing_label" value="Preço do anúncio:"/> + <text_editor name="price_for_listing" tool_tip="Preço do anúncio." value="[price]"/> + <layout_stack name="descr_stack"> + <layout_panel name="clickthrough_layout_panel"> + <text name="click_through_label" value="Cliques:"/> + <text_editor name="click_through_text" tool_tip="Dados de click-through" value="[clicks]"/> + </layout_panel> + <layout_panel name="price_layout_panel"> + <text name="auto_renew_label" value="Renovação automática:"/> + <text name="auto_renew" value="Ativado"/> + </layout_panel> + <layout_panel name="descr_layout_panel"> + <text name="classified_desc_label" value="Descrição:"/> + <text_editor name="classified_desc" value="[description]"/> + </layout_panel> + </layout_stack> + </panel> + </scroll_container> + <panel name="buttons"> + <button label="Teletransportar" name="teleport_btn"/> + <button label="Mapa" name="show_on_map_btn"/> + <button label="Editar" name="edit_btn"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_clothing_list_button_bar.xml b/indra/newview/skins/default/xui/pt/panel_clothing_list_button_bar.xml new file mode 100644 index 0000000000..bfdc7290d2 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_clothing_list_button_bar.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="clothing_list_button_bar_panel"> + <button label="Adicionar +" name="add_btn"/> + <button label="Comprar >" name="clothing_shop_btn"/> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_clothing_list_item.xml b/indra/newview/skins/default/xui/pt/panel_clothing_list_item.xml new file mode 100644 index 0000000000..de764d8025 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_clothing_list_item.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="wearable_item"> + <text name="item_name" value="..."/> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_cof_wearables.xml b/indra/newview/skins/default/xui/pt/panel_cof_wearables.xml new file mode 100644 index 0000000000..3e4b12b001 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_cof_wearables.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="cof_wearables"> + <accordion name="cof_wearables_accordion"> + <accordion_tab name="tab_attachments" title="Anexos"/> + <accordion_tab name="tab_clothing" title="Vestuário"/> + <accordion_tab name="tab_body_parts" title="Corpo"/> + </accordion> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_deletable_wearable_list_item.xml b/indra/newview/skins/default/xui/pt/panel_deletable_wearable_list_item.xml new file mode 100644 index 0000000000..91d90a5660 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_deletable_wearable_list_item.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="deletable_wearable_item"> + <text name="item_name" value="..."/> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_dummy_clothing_list_item.xml b/indra/newview/skins/default/xui/pt/panel_dummy_clothing_list_item.xml new file mode 100644 index 0000000000..6af84de0c7 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_dummy_clothing_list_item.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="dummy_clothing_item"> + <text name="item_name" value="..."/> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_edit_alpha.xml b/indra/newview/skins/default/xui/pt/panel_edit_alpha.xml new file mode 100644 index 0000000000..f8be9daf1b --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_edit_alpha.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="edit_alpha_panel"> + <panel name="avatar_alpha_color_panel"> + <texture_picker label="Alpha inferior" name="Lower Alpha" tool_tip="Selecionar imagem"/> + <texture_picker label="Alpha de cima" name="Upper Alpha" tool_tip="Selecionar imagem"/> + <texture_picker label="Cabeça Alpha" name="Head Alpha" tool_tip="Selecionar imagem"/> + <texture_picker label="Olhos Alpha" name="Eye Alpha" tool_tip="Selecionar imagem"/> + <texture_picker label="Cabelo alpha" name="Hair Alpha" tool_tip="Selecionar imagem"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_edit_classified.xml b/indra/newview/skins/default/xui/pt/panel_edit_classified.xml new file mode 100644 index 0000000000..f6fb223599 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_edit_classified.xml @@ -0,0 +1,48 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Editar anúncio" name="panel_edit_classified"> + <panel.string name="location_notice"> + (salvar para atualizar) + </panel.string> + <string name="publish_label"> + Publicar + </string> + <string name="save_label"> + Salvar + </string> + <text name="title"> + Editar anúncio + </text> + <scroll_container name="profile_scroll"> + <panel name="scroll_content_panel"> + <panel name="snapshot_panel"> + <icon label="" name="edit_icon" tool_tip="Selecione uma imagem"/> + </panel> + <text name="Name:"> + Cargo: + </text> + <text name="description_label"> + Descrição: + </text> + <text name="location_label"> + Localização: + </text> + <text name="classified_location"> + Carregando... + </text> + <button label="Usar configuração local" name="set_to_curr_location_btn"/> + <text name="category_label" value="Categoria:"/> + <text name="content_type_label" value="Tipo de conteúdo:"/> + <icons_combo_box label="Público geral" name="content_type"> + <icons_combo_box.item label="Moderado" name="mature_ci" value="Adulto"/> + <icons_combo_box.item label="Público geral" name="pg_ci" value="Adequado para menores"/> + </icons_combo_box> + <text name="price_for_listing_label" value="Preço do anúncio:"/> + <spinner label="L$" name="price_for_listing" tool_tip="Preço do anúncio" value="50"/> + <check_box label="Renovação automática semanal" name="auto_renew"/> + </panel> + </scroll_container> + <panel label="bottom_panel" name="bottom_panel"> + <button label="[LABEL]" name="save_changes_btn"/> + <button label="Cancelar" name="cancel_btn"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_edit_eyes.xml b/indra/newview/skins/default/xui/pt/panel_edit_eyes.xml new file mode 100644 index 0000000000..f21656d526 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_edit_eyes.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="edit_eyes_panel"> + <panel name="avatar_eye_color_panel"> + <texture_picker label="Ãris" name="Iris" tool_tip="Selecionar imagem"/> + </panel> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="eyes_main_tab" title="Olhos"/> + </accordion> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_edit_gloves.xml b/indra/newview/skins/default/xui/pt/panel_edit_gloves.xml new file mode 100644 index 0000000000..a94716e659 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_edit_gloves.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="edit_gloves_panel"> + <panel name="avatar_gloves_color_panel"> + <texture_picker label="Tecido" name="Fabric" tool_tip="Selecionar imagem"/> + <color_swatch label="Cor/Tonalidade" name="Color/Tint" tool_tip="Selecionar a cor"/> + </panel> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="gloves_main_tab" title="Luvas"/> + </accordion> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_edit_hair.xml b/indra/newview/skins/default/xui/pt/panel_edit_hair.xml new file mode 100644 index 0000000000..13f1f892f9 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_edit_hair.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="edit_hair_panel"> + <panel name="avatar_hair_color_panel"> + <texture_picker label="Texture" name="Texture" tool_tip="Selecionar imagem"/> + </panel> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="hair_color_tab" title="Cor"/> + <accordion_tab name="hair_style_tab" title="Estilo"/> + <accordion_tab name="hair_eyebrows_tab" title="Sombrancelhas"/> + <accordion_tab name="hair_facial_tab" title="Faciais"/> + </accordion> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_edit_jacket.xml b/indra/newview/skins/default/xui/pt/panel_edit_jacket.xml new file mode 100644 index 0000000000..f555bd9ac7 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_edit_jacket.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="edit_jacket_panel"> + <panel name="avatar_jacket_color_panel"> + <texture_picker label="Tecido de cima" name="Upper Fabric" tool_tip="Selecionar imagem"/> + <texture_picker label="Tecido de baixo" name="Lower Fabric" tool_tip="Selecionar imagem"/> + <color_swatch label="Cor/Tonalidade" name="Color/Tint" tool_tip="Selecionar a cor"/> + </panel> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="jacket_main_tab" title="Jaqueta"/> + </accordion> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_edit_pants.xml b/indra/newview/skins/default/xui/pt/panel_edit_pants.xml new file mode 100644 index 0000000000..67c300cc8d --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_edit_pants.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="edit_pants_panel"> + <panel name="avatar_pants_color_panel"> + <texture_picker label="Tecido" name="Fabric" tool_tip="Selecionar imagem"/> + <color_swatch label="Cor/Tonalidade" name="Color/Tint" tool_tip="Selecionar a cor"/> + </panel> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="pants_main_tab" title="Calças"/> + </accordion> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_edit_pick.xml b/indra/newview/skins/default/xui/pt/panel_edit_pick.xml new file mode 100644 index 0000000000..96a294bc28 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_edit_pick.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Editar destaques" name="panel_edit_pick"> + <panel.string name="location_notice"> + (salvar para atualizar) + </panel.string> + <text name="title"> + Editar destaques + </text> + <scroll_container name="profile_scroll"> + <panel name="scroll_content_panel"> + <icon label="" name="edit_icon" tool_tip="Selecione uma imagem"/> + <text name="Name:"> + Cargo: + </text> + <text name="description_label"> + Descrição: + </text> + <text name="location_label"> + Localização: + </text> + <text name="pick_location"> + Carregando... + </text> + <button label="Usar configuração local" name="set_to_curr_location_btn"/> + </panel> + </scroll_container> + <panel label="bottom_panel" name="bottom_panel"> + <button label="Salvar destaque" name="save_changes_btn"/> + <button label="Cancelar" name="cancel_btn"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_edit_profile.xml b/indra/newview/skins/default/xui/pt/panel_edit_profile.xml index a989cab167..c9e5513424 100644 --- a/indra/newview/skins/default/xui/pt/panel_edit_profile.xml +++ b/indra/newview/skins/default/xui/pt/panel_edit_profile.xml @@ -1,45 +1,51 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<panel name="edit_profile_panel"> - <string name="CaptionTextAcctInfo"> - [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION] - </string> - <string name="AcctTypeResident" - value="Residente" /> - <string name="AcctTypeTrial" - value="Teste" /> - <string name="AcctTypeCharterMember" - value="Estatuto do membro" /> - <string name="AcctTypeEmployee" - value="Contratado da Linden Lab" /> - <string name="PaymentInfoUsed" - value="Infor. de pagamento utilizadas" /> - <string name="PaymentInfoOnFile" - value="Infor. de pagamento no arquivo" /> - <string name="NoPaymentInfoOnFile" - value="Sem infor. de pagamento no arquivo" /> - <string name="AgeVerified" - value="Idade Verificada" /> - <string name="NotAgeVerified" - value="Idade não Verificada" /> - <string name="partner_edit_link_url"> - http://www.secondlife.com/account/partners.php?lang=pt - </string> - <panel name="scroll_content_panel"> - <panel name="data_panel" > - <panel name="lifes_images_panel"> - <panel name="second_life_image_panel"> - <text name="second_life_photo_title_text"> - [SECOND_LIFE]: - </text> - </panel> - </panel> - <text name="title_partner_text" value="Parceiro:"/> - <panel name="partner_data_panel"> - <text name="partner_text" value="[FIRST] [LAST]"/> - </panel> - <text name="text_box3"> - Resposta no Modo Ocupado: - </text> - </panel> - </panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Editar perfil" name="edit_profile_panel"> + <string name="CaptionTextAcctInfo"> + [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION] + </string> + <string name="RegisterDateFormat"> + [REG_DATE] ([AGE]) + </string> + <string name="AcctTypeResident" value="Residente"/> + <string name="AcctTypeTrial" value="Teste"/> + <string name="AcctTypeCharterMember" value="Estatuto do membro"/> + <string name="AcctTypeEmployee" value="Contratado da Linden Lab"/> + <string name="PaymentInfoUsed" value="Infor. de pagamento utilizadas"/> + <string name="PaymentInfoOnFile" value="Infor. de pagamento no arquivo"/> + <string name="NoPaymentInfoOnFile" value="Sem infor. de pagamento no arquivo"/> + <string name="AgeVerified" value="Idade Verificada"/> + <string name="NotAgeVerified" value="Idade não Verificada"/> + <string name="partner_edit_link_url"> + http://www.secondlife.com/account/partners.php?lang=pt + </string> + <string name="no_partner_text" value="Nenhum"/> + <scroll_container name="profile_scroll"> + <panel name="scroll_content_panel"> + <panel name="data_panel"> + <panel name="lifes_images_panel"> + <icon label="" name="2nd_life_edit_icon" tool_tip="Selecione uma imagem"/> + </panel> + <panel name="first_life_image_panel"> + <text name="real_world_photo_title_text" value="Mundo real:"/> + </panel> + <icon label="" name="real_world_edit_icon" tool_tip="Selecione uma imagem"/> + <text name="title_homepage_text"> + Página web: + </text> + <check_box label="Mostrar nos resultados de busca" name="show_in_search_checkbox"/> + <text name="title_acc_status_text" value="Minha conta:"/> + <text_editor name="acc_status_text" value="Residente. Dados de pagamento: não constam"/> + <text name="my_account_link" value="[[URL] Abrir meu painel]"/> + <text name="title_partner_text" value="Parceiro(a):"/> + <panel name="partner_data_panel"> + <name_box initial_value="(pesquisando)" name="partner_text"/> + </panel> + <text name="partner_edit_link" value="[[URL] Editar]"/> + </panel> + </panel> + </scroll_container> + <panel name="profile_me_buttons_panel"> + <button label="Salvar alterações" name="save_btn"/> + <button label="Cancelar" name="cancel_btn"/> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/pt/panel_edit_shape.xml b/indra/newview/skins/default/xui/pt/panel_edit_shape.xml new file mode 100644 index 0000000000..de41ba3ad2 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_edit_shape.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="edit_shape_panel"> + <string name="meters"> + Metros + </string> + <string name="feet"> + Pés + </string> + <string name="height"> + Altura: + </string> + <text name="avatar_height"/> + <panel label="Camisa" name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="shape_body_tab" title="Corpo"/> + <accordion_tab name="shape_head_tab" title="Cabeça"/> + <accordion_tab name="shape_eyes_tab" title="Olhos"/> + <accordion_tab name="shape_ears_tab" title="Orelhas"/> + <accordion_tab name="shape_nose_tab" title="Nariz"/> + <accordion_tab name="shape_mouth_tab" title="Boca"/> + <accordion_tab name="shape_chin_tab" title="Queixo"/> + <accordion_tab name="shape_torso_tab" title="Tronco"/> + <accordion_tab name="shape_legs_tab" title="Pernas"/> + </accordion> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_edit_shirt.xml b/indra/newview/skins/default/xui/pt/panel_edit_shirt.xml new file mode 100644 index 0000000000..fb7c4c080c --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_edit_shirt.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="edit_shirt_panel"> + <panel name="avatar_shirt_color_panel"> + <texture_picker label="tecido" name="Fabric" tool_tip="Clique para escolher uma foto"/> + <color_swatch label="Cor/Matiz" name="Color/Tint" tool_tip="Clique para abrir o selecionador de cor"/> + </panel> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="shirt_main_tab" title="Camisa"/> + </accordion> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_edit_shoes.xml b/indra/newview/skins/default/xui/pt/panel_edit_shoes.xml new file mode 100644 index 0000000000..d1d30cf46e --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_edit_shoes.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="edit_shoes_panel"> + <panel name="avatar_shoes_color_panel"> + <texture_picker label="Tecido" name="Fabric" tool_tip="Selecionar imagem"/> + <color_swatch label="Cor/Tonalidade" name="Color/Tint" tool_tip="Selecionar a cor"/> + </panel> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="shoes_main_tab" title="Sapatos"/> + </accordion> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_edit_skin.xml b/indra/newview/skins/default/xui/pt/panel_edit_skin.xml new file mode 100644 index 0000000000..f3d88123f2 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_edit_skin.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="edit_skin_panel"> + <panel name="avatar_skin_color_panel"> + <texture_picker label="Tatuagens na cabeça" name="Head Tattoos" tool_tip="Selecionar imagem"/> + <texture_picker label="Tatuagem parte de cima" name="Upper Tattoos" tool_tip="Selecionar imagem"/> + <texture_picker label="Tatuagem de baixo" name="Lower Tattoos" tool_tip="Selecionar imagem"/> + </panel> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="skin_color_tab" title="Cor da pele"/> + <accordion_tab name="skin_face_tab" title="Detalhe do rosto"/> + <accordion_tab name="skin_makeup_tab" title="Maquilagem"/> + <accordion_tab name="skin_body_tab" title="Detalhe do corpo"/> + </accordion> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_edit_skirt.xml b/indra/newview/skins/default/xui/pt/panel_edit_skirt.xml new file mode 100644 index 0000000000..b67cd53a83 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_edit_skirt.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="edit_skirt_panel"> + <panel name="avatar_skirt_color_panel"> + <texture_picker label="Tecido" name="Fabric" tool_tip="Selecionar imagem"/> + <color_swatch label="Cor/Tonalidade" name="Color/Tint" tool_tip="Selecionar a cor"/> + </panel> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="skirt_main_tab" title="Saia"/> + </accordion> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_edit_socks.xml b/indra/newview/skins/default/xui/pt/panel_edit_socks.xml new file mode 100644 index 0000000000..405568abeb --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_edit_socks.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="edit_socks_panel"> + <panel name="avatar_socks_color_panel"> + <texture_picker label="Tecido" name="Fabric" tool_tip="Selecionar imagem"/> + <color_swatch label="Cor/Tonalidade" name="Color/Tint" tool_tip="Selecionar a cor"/> + </panel> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="socks_main_tab" title="Meias"/> + </accordion> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_edit_tattoo.xml b/indra/newview/skins/default/xui/pt/panel_edit_tattoo.xml new file mode 100644 index 0000000000..f85bb3c499 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_edit_tattoo.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="edit_tattoo_panel"> + <panel name="avatar_tattoo_color_panel"> + <texture_picker label="Tatuagem de cabeça" name="Head Tattoo" tool_tip="Clique para escolher uma foto"/> + <texture_picker label="Tatuagem superior" name="Upper Tattoo" tool_tip="Selecione uma foto"/> + <texture_picker label="Tatuagem inferior" name="Lower Tattoo" tool_tip="Selecione uma foto"/> + <color_swatch label="Cor/Tonalidade" name="Color/Tint" tool_tip="Selecionar a cor"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_edit_underpants.xml b/indra/newview/skins/default/xui/pt/panel_edit_underpants.xml new file mode 100644 index 0000000000..f858dc0495 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_edit_underpants.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="edit_underpants_panel"> + <panel name="avatar_underpants_color_panel"> + <texture_picker label="Tecido" name="Fabric" tool_tip="Selecionar imagem"/> + <color_swatch label="Cor/Tonalidade" name="Color/Tint" tool_tip="Selecionar a cor"/> + </panel> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="underpants_main_tab" title="Roupa de baixo"/> + </accordion> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_edit_undershirt.xml b/indra/newview/skins/default/xui/pt/panel_edit_undershirt.xml new file mode 100644 index 0000000000..9c18fc1d6c --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_edit_undershirt.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="edit_undershirt_panel"> + <panel name="avatar_undershirt_color_panel"> + <texture_picker label="Tecido" name="Fabric" tool_tip="Selecionar imagem"/> + <color_swatch label="Cor/Tonalidade" name="Color/Tint" tool_tip="Selecionar a cor"/> + </panel> + <panel name="accordion_panel"> + <accordion name="wearable_accordion"> + <accordion_tab name="undershirt_main_tab" title="Camiseta"/> + </accordion> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_edit_wearable.xml b/indra/newview/skins/default/xui/pt/panel_edit_wearable.xml new file mode 100644 index 0000000000..e921dd1bea --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_edit_wearable.xml @@ -0,0 +1,107 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="VestÃvel" name="panel_edit_wearable"> + <string name="edit_shape_title"> + Editando forma + </string> + <string name="edit_skin_title"> + Editando pele + </string> + <string name="edit_hair_title"> + Editando cabelo + </string> + <string name="edit_eyes_title"> + Editando os olhos + </string> + <string name="edit_shirt_title"> + Editando camisa + </string> + <string name="edit_pants_title"> + Editando calças + </string> + <string name="edit_shoes_title"> + Editando sapatos + </string> + <string name="edit_socks_title"> + Editando meias + </string> + <string name="edit_jacket_title"> + Editando jaqueta + </string> + <string name="edit_skirt_title"> + Editando saia + </string> + <string name="edit_gloves_title"> + Editando luvas + </string> + <string name="edit_undershirt_title"> + Editando camiseta + </string> + <string name="edit_underpants_title"> + Editando roupa de baixo + </string> + <string name="edit_alpha_title"> + Editando máscara Alpha + </string> + <string name="edit_tattoo_title"> + Editando tatuagem + </string> + <string name="shape_desc_text"> + Forma: + </string> + <string name="skin_desc_text"> + Pele: + </string> + <string name="hair_desc_text"> + Cabelo: + </string> + <string name="eyes_desc_text"> + Olhos: + </string> + <string name="shirt_desc_text"> + Camisa: + </string> + <string name="pants_desc_text"> + Calças: + </string> + <string name="shoes_desc_text"> + Sapatos: + </string> + <string name="socks_desc_text"> + Meias: + </string> + <string name="jacket_desc_text"> + Jaqueta: + </string> + <string name="skirt_desc_text"> + Saia: + </string> + <string name="gloves_desc_text"> + Luvas: + </string> + <string name="undershirt_desc_text"> + Camiseta: + </string> + <string name="underpants_desc_text"> + Roupa de baixo: + </string> + <string name="alpha_desc_text"> + Máscara alpha: + </string> + <string name="tattoo_desc_text"> + Tatuagem: + </string> + <text name="edit_wearable_title" value="Editando forma"/> + <panel label="Camisa" name="wearable_type_panel"> + <text name="description_text" value="Forma:"/> + <radio_group name="sex_radio"> + <radio_item label="" name="sex_male" tool_tip="Masculino" value="1"/> + <radio_item label="" name="sex_female" tool_tip="Feminino" value="0"/> + </radio_group> + <icon name="male_icon" tool_tip="Masculino"/> + <icon name="female_icon" tool_tip="Feminino"/> + </panel> + <panel name="button_panel"> + <button label="Salvar como" name="save_as_button"/> + <button label="Reverter" name="revert_button"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_friends.xml b/indra/newview/skins/default/xui/pt/panel_friends.xml index d430d637ad..34073f9ce1 100644 --- a/indra/newview/skins/default/xui/pt/panel_friends.xml +++ b/indra/newview/skins/default/xui/pt/panel_friends.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="friends"> <string name="Multiple"> - Múltiplos amigos... + Diversos amigos </string> <scroll_list name="friend_list" tool_tip="Aperte shift ou control enquanto clica para selecionar múltiplos amigos"> <column name="icon_online_status" tool_tip="Status Online"/> @@ -11,10 +11,10 @@ <column name="icon_edit_mine" tool_tip="Amigo pode editar, apagar ou pegar seus objetos"/> <column name="icon_edit_theirs" tool_tip="Você pode editar os objetos deste amigo"/> </scroll_list> - <button width="86" label="MI/Chamar" name="im_btn" tool_tip="Abrir sessão de Mensagem Instantânea"/> - <button width="86" label="Perfil" name="profile_btn" tool_tip="Mostrar foto, grupos e outras informações"/> - <button width="86" label="Teletransp..." name="offer_teleport_btn" tool_tip="Oferecer a este amigo o teletransporte para sua localização atual"/> - <button width="86" label="Pagar..." name="pay_btn" tool_tip="Dar Linden dólares (L$) a este amigo"/> - <button width="86" label="Remover..." name="remove_btn" tool_tip="Remover esta pessoa de sua lista de amigos"/> - <button width="86" label="Adicionar..." name="add_btn" tool_tip="Oferecer amizade a um residente"/> + <button label="MI/Chamar" name="im_btn" tool_tip="Abrir sessão de Mensagem Instantânea" width="86"/> + <button label="Perfil" name="profile_btn" tool_tip="Mostrar foto, grupos e outras informações" width="86"/> + <button label="Teletransportar" name="offer_teleport_btn" tool_tip="Oferecer a este amigo o teletransporte para sua localização atual" width="86"/> + <button label="Pagar" name="pay_btn" tool_tip="Dar Linden dólares (L$) a este amigo" width="86"/> + <button label="Tirar" name="remove_btn" tool_tip="Remover esta pessoa de sua lista de amigos" width="86"/> + <button label="Adicionar" name="add_btn" tool_tip="Oferecer amizade para um residente" width="86"/> </panel> diff --git a/indra/newview/skins/default/xui/pt/panel_group_control_panel.xml b/indra/newview/skins/default/xui/pt/panel_group_control_panel.xml new file mode 100644 index 0000000000..502dae8d67 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_group_control_panel.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_im_control_panel"> + <layout_stack name="vertical_stack"> + <layout_panel name="group_info_btn_panel"> + <button label="Perfil do grupo" name="group_info_btn"/> + </layout_panel> + <layout_panel name="call_btn_panel"> + <button label="Ligar para o grupo" name="call_btn"/> + </layout_panel> + <layout_panel name="end_call_btn_panel"> + <button label="Desligar" name="end_call_btn"/> + </layout_panel> + <layout_panel name="voice_ctrls_btn_panel"> + <button label="Abrir controles de voz" name="voice_ctrls_btn"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_group_general.xml b/indra/newview/skins/default/xui/pt/panel_group_general.xml index 226011c138..6060f23bba 100644 --- a/indra/newview/skins/default/xui/pt/panel_group_general.xml +++ b/indra/newview/skins/default/xui/pt/panel_group_general.xml @@ -1,70 +1,58 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Geral" name="general_tab"> - <string name="help_text"> - A aba Geral contém informações gerais sobre este grupo, a lista dos donos e membros visÃveis, preferências gerais do grupo e opções dos membros. Passe o mouse sobre as opções para mais ajuda. - </string> - <string name="group_info_unchanged"> - Informações gerais do grupo foram modificadas - </string> - <button label="?" label_selected="?" name="help_button"/> - <line_editor label="Digite o nome do seu novo grupo aqui" name="group_name_editor"/> - <text name="group_name"> - Digite o nome do seu novo grupo aqui - </text> - <text name="prepend_founded_by"> - Fundado por: - </text> - <text name="founder_name" left_delta="74" > - (espera) - </text> - <text name="group_charter_label"> - Declaração do Grupo - </text> - <texture_picker label="InsÃgnia do Grupo" name="insignia" tool_tip="Clique para escolher uma imagem"/> + <panel.string name="help_text"> + A guia Geral contém informações gerais sobre o grupo, uma lista de membros, preferências do grupo e opções para membros. + +Para obter mais ajuda, passe o mouse sobre as opções. + </panel.string> + <panel.string name="group_info_unchanged"> + Informações gerais do grupo modificadas. + </panel.string> + <panel.string name="incomplete_member_data_str"> + Recuperando dados do membro + </panel.string> + <panel name="group_info_top"> + <texture_picker label="" name="insignia" tool_tip="Selecionar imagem"/> + <text name="prepend_founded_by"> + Fundador: + </text> + <name_box initial_value="(pesquisando)" name="founder_name"/> + <text name="join_cost_text"> + Grátis + </text> + <button label="ENTRAR AGORA!" name="btn_join"/> + </panel> <text_editor name="charter"> Declaração do grupo </text_editor> - <button label="Unir (L$0)" label_selected="Unir (L$0)" name="join_button"/> - <button label="Vista detalhada" label_selected="Vista detalhada" name="info_button"/> - <text name="text_owners_and_visible_members"> - Proprietários & Membros visÃveis - </text> - <text name="text_owners_are_shown_in_bold"> - (Proprietários são mostrados em negrito ) - </text> <name_list name="visible_members"> - <name_list.columns label="Nome do membro" name="name"/> + <name_list.columns label="Membro" name="name"/> <name_list.columns label="TÃtulo" name="title"/> - <name_list.columns label="Último login" name="online"/> + <name_list.columns label="Status" name="status"/> </name_list> - <text name="text_group_preferences"> - Preferências do Grupo + <text name="my_group_settngs_label"> + Eu </text> + <text name="active_title_label"> + Meu cargo + </text> + <combo_box name="active_title" tool_tip="Define o cargo que é exibido com o nome do seu avatar quando o grupo está ativo."/> + <check_box label="Receber avisos do grupo" name="receive_notices" tool_tip="Define o seu recebimento de avisos deste grupo. Desmarque esta opção se o grupo envia spam."/> + <check_box label="Mostrar no meu perfil" name="list_groups_in_profile" tool_tip="Define se você deseja incluir este grupo no seu perfil."/> <panel name="preferences_container"> - <check_box label="Mostre na busca" name="show_in_group_list" tool_tip="Deixe as pessoas verem este grupo nos resultados de busca."/> - <check_box label="Adesão aberta" name="open_enrollement" tool_tip="Definir se este grupo permite que novos membros entrem sem serem convidados"/> - <check_box label="Taxa de adesão:" name="check_enrollment_fee" tool_tip="Define se é necessária uma taxa de adesão para se unir ao grupo."/> - <spinner width="60" left_delta="120" name="spin_enrollment_fee" tool_tip="Os novos membros devem pagar esta taxa para se unir ao grupo quando a Taxa de Adesão está marcada."/> - <combo_box width="170" name="group_mature_check" tool_tip="Define se a informação do seu grupo é considerada mature."> - <combo_box.item name="select_mature" label="- Selecionar Maturidade -"/> - <combo_box.item name="mature" label="Conteúdo Mature"/> - <combo_box.item name="pg" label="Conteúdo PG"/> + <text name="group_settngs_label"> + Grupo + </text> + <check_box label="Qualquer um pode entrar" name="open_enrollement" tool_tip="Controla a entrada de novos membros, com ou sem convite."/> + <check_box label="Taxa de inscrição" name="check_enrollment_fee" tool_tip="Controla a cobrança de uma taxa de associação ao grupo."/> + <spinner label="L$" left_delta="120" name="spin_enrollment_fee" tool_tip="Se a opção 'Taxa de associação' estiver marcada, novos membros precisam pagar o valor definido para entrar no grupo." width="60"/> + <combo_box name="group_mature_check" tool_tip="Define se os dados do seu grupo são conteúdo moderado." width="170"> + <combo_item name="select_mature"> + - Selecione Maduro - + </combo_item> + <combo_box.item label="Conteúdo Mature" name="mature"/> + <combo_box.item label="Conteúdo PG" name="pg"/> </combo_box> - <panel name="title_container"> - <text name="active_title_label"> - Meu tÃtulo ativo - </text> - <combo_box name="active_title" tool_tip="Define o tÃtulo que aparece em seu avatar quando o grupo estiver ativo."/> - </panel> - <check_box label="Receber notÃcias do grupo" name="receive_notices" tool_tip="Define se Você deseja receber notÃcias deste grupo. Desmarque esta caixa se o grupo está lhe fazendo spam."/> - <check_box label="Listar grupo no meu perfil" name="list_groups_in_profile" tool_tip="Define se você deseja listar este grupo no seu Perfil"/> + <check_box initial_value="true" label="Mostre na busca" name="show_in_group_list" tool_tip="Incluir o grupo nos resultados de busca"/> </panel> - <string name="incomplete_member_data_str"> - Recuperando dados do membro - </string> - <string name="confirm_group_create_str"> - Criar este grupo irá custar L$100. -Você está realmente, realmente, REALMENTE seguro que deseja gastar L$100 para criar este grupo? -Esteja consciente de que se ninguém mais se juntar a este grupo dentro de 48 horas, este será dissolvido e o nome não estará disponÃvel para uso futuro. - </string> </panel> diff --git a/indra/newview/skins/default/xui/pt/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/pt/panel_group_info_sidetray.xml new file mode 100644 index 0000000000..29d757346c --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_group_info_sidetray.xml @@ -0,0 +1,35 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Perfil do grupo" name="GroupInfo"> + <panel.string name="default_needs_apply_text"> + Algumas modificações não foram salvas + </panel.string> + <panel.string name="want_apply_text"> + Deseja salvar essas mudanças? + </panel.string> + <panel.string name="group_join_btn"> + Entrar (L$[AMOUNT]) + </panel.string> + <panel.string name="group_join_free"> + Grátis + </panel.string> + <panel name="group_info_top"> + <text name="group_name" value="Carregando..."/> + <line_editor label="Digite o nome do grupo novo aqui" name="group_name_editor"/> + </panel> + <layout_stack name="layout"> + <layout_panel name="group_accordions"> + <accordion name="groups_accordion"> + <accordion_tab name="group_general_tab" title="Geral"/> + <accordion_tab name="group_roles_tab" title="Cargos"/> + <accordion_tab name="group_notices_tab" title="Avisos"/> + <accordion_tab name="group_land_tab" title="Terrenos/Bens"/> + </accordion> + </layout_panel> + <layout_panel name="button_row"> + <button label="Bate-papo" name="btn_chat"/> + <button label="Ligar para o grupo" name="btn_call" tool_tip="Ligar para este grupo"/> + <button label="Salvar" label_selected="Salvar" name="btn_apply"/> + <button label="Criar grupo" name="btn_create" tool_tip="Criar um grupo novo"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_group_invite.xml b/indra/newview/skins/default/xui/pt/panel_group_invite.xml index a02a17139b..c7def0ed96 100644 --- a/indra/newview/skins/default/xui/pt/panel_group_invite.xml +++ b/indra/newview/skins/default/xui/pt/panel_group_invite.xml @@ -1,23 +1,27 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Convidar um membro" name="invite_panel" width="224"> + <panel.string name="confirm_invite_owner_str"> + Você tem certeza de que deseja convidar novo(s) proprietário(s)? Esta ação é permanente! + </panel.string> + <panel.string name="loading"> + (carregando...) + </panel.string> + <panel.string name="already_in_group"> + Alguns dos residentes selecionados já estão no grupo, portanto não receberam convite. + </panel.string> <text name="help_text" width="214"> - Voce pode selecionar vários residentes -para convidar ao seu grupo. Clique -'Abrir Seletor de Residente' para iniciar. + Selecione um ou mais residentes para convidar. Clique em 'Abrir seletor de residentes' para começar. </text> <button label="Abrir Seletor de Residente" name="add_button" tool_tip=""/> - <name_list name="invitee_list" tool_tip="Mantenha apertada a tecla Control e clique nos nomes dos residentes para uma seleção múltipla."/> - <button left_delta="-7" width="214" label="Remove os selecionados acima da lista" name="remove_button" tool_tip="Remove os residentes selecionados acima da lista de convite."/> + <name_list name="invitee_list" tool_tip="Pressione Ctrl enquanto clica nos nomes dos residentes"/> + <button label="Remove os selecionados acima da lista" left_delta="-7" name="remove_button" tool_tip="Exclui os residentes selecionados acima da lista de convidados" width="214"/> <text name="role_text"> Escolha que Função atribuir a eles: </text> - <combo_box name="role_name" tool_tip="Escolha a partir da lista de Funções autorizadas a você para inclusão de membros."/> + <combo_box name="role_name" tool_tip="Selecione o cargo da lista de cargos que você pode designar a membros"/> <button label="Mandar convites" name="ok_button"/> <button label="Cancelar" name="cancel_button"/> - <string name="confirm_invite_owner_str"> - Você tem certeza de que deseja convidar novo(s) proprietário(s)? Esta ação é permanente! - </string> - <string name="loading"> - (carregando...) + <string name="GroupInvitation"> + Convite </string> </panel> diff --git a/indra/newview/skins/default/xui/pt/panel_group_land_money.xml b/indra/newview/skins/default/xui/pt/panel_group_land_money.xml index 5b09363e3c..e57a85a726 100644 --- a/indra/newview/skins/default/xui/pt/panel_group_land_money.xml +++ b/indra/newview/skins/default/xui/pt/panel_group_land_money.xml @@ -1,84 +1,84 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Terra & L$" name="land_money_tab"> - <string name="help_text"> - Lotes pertencentes ao grupo são listados adiante, com os detalhes de contribuição. Um aviso aparece até que o Total de Terra em Uso seja menor ou igual à Contribuição Total. As abas de Planejamento, Detalhes e Vendas fornecem informações sobre as finanças do grupo. - </string> - <button label="?" name="help_button"/> - <string name="cant_view_group_land_text"> - Você não tem permissão para ver as terras pertencentes ao grupo. - </string> - <string name="cant_view_group_accounting_text"> - Você não tem permissão para ver as informações sobre as contas do grupo. - </string> - <string name="loading_txt"> + <panel.string name="help_text"> + Será exibido um aviso até o Total de terrenos usados for igual ou inferior à contribuição total. + </panel.string> + <panel.string name="cant_view_group_land_text"> + Você não está autorizado a acessar terrenos de grupos + </panel.string> + <panel.string name="epmty_view_group_land_text"> + Nada consta + </panel.string> + <panel.string name="cant_view_group_accounting_text"> + Você não está autorizado a acessar os dados de contabilidade do grupo. + </panel.string> + <panel.string name="loading_txt"> Carregando... - </string> - <text name="group_land_heading" width="250"> - Terra percentente ao grupo - </text> - <scroll_list name="group_parcel_list"> - <column label="Nome do Lote" name="name"/> - <column label="Região" name="location"/> - <column label="Tipo" name="type"/> - <column label="Ãrea" name="area"/> - </scroll_list> - <button label="Mostrar no Mapa" label_selected="Mostrar no Mapa" name="map_button" left="282" width="130"/> - <text name="total_contributed_land_label"> - Contribuição Total: - </text> - <text name="total_contributed_land_value"> - [AREA] m² - </text> - <text name="total_land_in_use_label"> - Total de Terra em Uso: - </text> - <text name="total_land_in_use_value"> - [AREA] m² - </text> - <text name="land_available_label"> - Terra DisponÃvel: - </text> - <text name="land_available_value"> - [AREA] m² - </text> - <text name="your_contribution_label"> - Sua Contribuição: - </text> - <string name="land_contrib_error"> - Não é possÃvel definir sua contribuição para o terreno. - </string> - <text name="your_contribution_units"> - ( m² ) - </text> - <text name="your_contribution_max_value"> - ([AMOUNT] máxima) - </text> - <text name="group_over_limit_text"> - Membros do grupo precisam contribuir com mais créditos de Terra para -garantir a terra em uso. - </text> - <text name="group_money_heading"> - Grupo L$ - </text> + </panel.string> + <panel.string name="land_contrib_error"> + Não foi possÃvel definir sua contribuição + </panel.string> + <panel name="layout_panel_landmoney"> + <scroll_list name="group_parcel_list"> + <scroll_list.columns label="Lote" name="name"/> + <scroll_list.columns label="Região" name="location"/> + <scroll_list.columns label="Tipo" name="type"/> + <scroll_list.columns label="Ãrea:" name="area"/> + </scroll_list> + <text name="total_contributed_land_label"> + Total contribuÃdo: + </text> + <text name="total_contributed_land_value"> + [AREA] m² + </text> + <button label="Mapa" label_selected="Mapa" name="map_button"/> + <text name="total_land_in_use_label"> + Total em uso: + </text> + <text name="total_land_in_use_value"> + [AREA] m² + </text> + <text name="land_available_label"> + DisponÃveis: + </text> + <text name="land_available_value"> + [AREA] m² + </text> + <text name="your_contribution_label"> + Sua contribuição: + </text> + <text name="your_contribution_units"> + m² + </text> + <text name="your_contribution_max_value"> + ([AMOUNT] max) + </text> + <text name="group_over_limit_text"> + O terreno em uso requer mais créditos + </text> + <text name="group_money_heading"> + L$ do grupo + </text> + </panel> <tab_container name="group_money_tab_container"> - <panel label="Planejamento" name="group_money_planning_tab"> + <panel label="PLANEJAMENTO" name="group_money_planning_tab"> <text_editor name="group_money_planning_text"> - Computando.. + Carregando... </text_editor> </panel> - <panel label="Detalhes" name="group_money_details_tab"> + <panel label="DETALHES" name="group_money_details_tab"> <text_editor name="group_money_details_text"> - Computando... + Carregando... </text_editor> - <button label="< Mais Cedo" label_selected="< Cedo" name="earlier_details_button" tool_tip="Voltar no Tempo"/> - <button label="Mais Tarde >" label_selected="Tarde >" name="later_details_button" tool_tip="Adiantar o Tempo"/> + <button label="< Mais Cedo" label_selected="< Cedo" name="earlier_details_button" tool_tip="Atrás"/> + <button label="Mais Tarde >" label_selected="Tarde >" name="later_details_button" tool_tip="Próximo"/> </panel> - <panel label="Vendas" name="group_money_sales_tab"> + <panel label="VENDAS" name="group_money_sales_tab"> <text_editor name="group_money_sales_text"> - Computando... + Carregando... </text_editor> - <button label="< Mais Cedo" label_selected="< Mais Cedo" name="earlier_sales_button" tool_tip="Voltar no Tempo"/> - <button label="Mais Tarde >" label_selected="Mais Tarde >" name="later_sales_button" tool_tip="Adiantar o Tempo"/> + <button label="< Mais Cedo" label_selected="< Mais Cedo" name="earlier_sales_button" tool_tip="Atrás"/> + <button label="Mais Tarde >" label_selected="Mais Tarde >" name="later_sales_button" tool_tip="Próximo"/> </panel> </tab_container> </panel> diff --git a/indra/newview/skins/default/xui/pt/panel_group_list_item.xml b/indra/newview/skins/default/xui/pt/panel_group_list_item.xml new file mode 100644 index 0000000000..19c34d2f10 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_group_list_item.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="group_list_item"> + <text name="group_name" value="Desconhecido"/> + <button name="profile_btn" tool_tip="Ver perfil"/> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_group_notices.xml b/indra/newview/skins/default/xui/pt/panel_group_notices.xml index d5c0f01e33..9ccb85cdf6 100644 --- a/indra/newview/skins/default/xui/pt/panel_group_notices.xml +++ b/indra/newview/skins/default/xui/pt/panel_group_notices.xml @@ -1,58 +1,55 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="NotÃcias" name="notices_tab"> - <text name="help_text"> + <panel.string name="help_text"> As notÃcias são uma maneira rápida de comunicar-se através de um grupo transmitindo uma mensagem e entregando um item anexo, opcionalmente. As notÃcias vão apenas a membros do grupo que têm a função habilitada para receber notÃcias. Você pode desligar NotÃcias na aba Geral. - </text> - <text name="no_notices_text"> - Não existem notÃcias anteriores. - </text> - <button label="?" label_selected="?" name="help_button"/> - <text name="lbl"> - Arquivo de notÃcias do grupo - </text> + </panel.string> + <panel.string name="no_notices_text"> + Não há nenhum aviso antigo + </panel.string> <text name="lbl2"> - As notÃcias são mantidas por 14 dias. -Listas de aviso estão limitadas a 200 por grupo, diariamente. + Cada aviso é armazenado por 14 dias. +Cada grupo pode enviar no máximo 200 avisos/dia </text> <scroll_list name="notice_list"> - <column label="Assunto" name="subject"/> - <column label="Para" name="from"/> - <column label="Data" name="date"/> + <scroll_list.columns label="Assunto" name="subject"/> + <scroll_list.columns label="Para" name="from"/> + <scroll_list.columns label="Data" name="date"/> </scroll_list> <text name="notice_list_none_found"> - Nenhum encontrado. + Nenhum resultado foi encontrado. </text> - <button label="Criar nova notÃcia" label_selected="Criar nova notÃcia" name="create_new_notice"/> - <button label="Atualizar" label_selected="Atualizar Lista" name="refresh_notices"/> + <button label="Criar um novo aviso" label_selected="Criar nova notÃcia" name="create_new_notice" tool_tip="Criar um novo aviso"/> + <button label="Atualizar" label_selected="Atualizar lista" name="refresh_notices" tool_tip="Atualizar lista de avisos"/> <panel label="Criar nova notÃcia" name="panel_create_new_notice"> <text name="lbl"> - Criar uma notÃcia + Criar notÃcia </text> - <text name="lbl2"> - Você pode adicionar um item simples à notÃcia, arrastando-o do seu Inventário para o painel. Itens anexados devem ser copiáveis e transferÃveis e você não pode mandar uma pasta. - </text> - <text name="lbl3" left="20"> + <text left="20" name="lbl3"> Assunto: </text> - <line_editor name="create_subject" width="251" left_delta="61"/> - <text name="lbl4" left="15" width="60"> + <line_editor left_delta="61" name="create_subject" width="251"/> + <text left="15" name="lbl4" width="60"> Mensagem: </text> - <text_editor name="create_message" left_delta="66" width="330"/> + <text_editor left_delta="66" name="create_message" width="330"/> <text name="lbl5" width="68"> Anexo: </text> - <line_editor name="create_inventory_name" width="190" left_delta="74"/> - <button label="Remover o anexo" label_selected="Remover o anexo" name="remove_attachment"/> + <line_editor left_delta="74" name="create_inventory_name" width="190"/> + <text name="string"> + Arrastar e soltar o item aqui para anexá-lo: + </text> + <button label="Inventário" name="open_inventory" tool_tip="Inventário aberto"/> + <button label="Tirar" label_selected="Remover o anexo" name="remove_attachment" tool_tip="Remover anexo da notificação."/> <button label="Enviar" label_selected="Enviar" name="send_notice"/> - <panel name="drop_target" tool_tip="Arraste um item do inventário para dentro da caixa de mensagem para enviá-lo com a notÃcia. Você deve ter permissão para copiar e transferir o objeto, para enviá-lo com a notÃcia."/> + <group_drop_target name="drop_target" tool_tip="Arrastar um item do inventário para a caixa para enviá-lo com o aviso. É preciso ter autorização de cópia e transferência do item para anexá-lo ao aviso."/> </panel> - <panel label="Visualizar NotÃcia Anterior" name="panel_view_past_notice"> + <panel label="Visualizar notÃcia anterior" name="panel_view_past_notice"> <text name="lbl"> NotÃcia arquivada </text> <text name="lbl2"> - Para enviar uma notÃcia nova, clique no botão 'Criar Nova NotÃcia' acima. + Para enviar um novo aviso, clique no botão + </text> <text name="lbl3"> Asunto: @@ -60,6 +57,6 @@ Listas de aviso estão limitadas a 200 por grupo, diariamente. <text name="lbl4"> Mensagem: </text> - <button label="Abrir o anexo" label_selected="Abrir o anexo" name="open_attachment"/> + <button label="Abrir anexo" label_selected="Abrir o anexo" name="open_attachment"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/pt/panel_group_notify.xml b/indra/newview/skins/default/xui/pt/panel_group_notify.xml new file mode 100644 index 0000000000..5a8ea81074 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_group_notify.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="instant_message" name="panel_group_notify"> + <panel label="header" name="header"> + <text name="title" value="Nome do remetente / grupo"/> + </panel> + <text name="attachment" value="Anexo"/> + <button label="OK" name="btn_ok"/> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_group_roles.xml b/indra/newview/skins/default/xui/pt/panel_group_roles.xml index 087cf0c107..9c3792ec43 100644 --- a/indra/newview/skins/default/xui/pt/panel_group_roles.xml +++ b/indra/newview/skins/default/xui/pt/panel_group_roles.xml @@ -1,146 +1,104 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Membros e Funções" name="roles_tab"> - <string name="default_needs_apply_text"> - Existem alterações não aplicadas na sub-aba atual. - </string> - <string name="want_apply_text"> - Você quer submeter essas alterações? - </string> - <button label="?" name="help_button"/> - <panel name="members_header"> - <text name="static"> - Membros e Funções - </text> - <text name="static2"> - São atribuÃdas funções com habilidades aos membros do grupo. -Estes ajustes podem ser facilmente customizados para uma flexibilidade -e organização maiores. - </text> - </panel> - <panel name="roles_header"> - <text name="static"> - Funções - </text> - <text name="role_properties_modifiable"> - Selecionar uma função abaixo. Você pode modificar o nome, a descrição -e o tÃtulo do membro. - </text> - <text name="role_properties_not_modifiable"> - Selecione uma função abaixo para ver suas propriedades, membros e -habilidades permitidas. - </text> - <text bottom_delta="-28" name="role_actions_modifiable"> - Você também pode atribuir habilidades à função. - </text> - <text name="role_actions_not_modifiable"> - Você pode ver, mas não pode alterar habilidades atribuÃdas. - </text> - </panel> - <panel name="actions_header"> - <text name="static"> - Habilidades - </text> - <text name="static2"> - Você pode ver a descrição de uma habilidade e quais funções e membros -podem executar essa habilidade. - </text> - </panel> + <panel.string name="default_needs_apply_text"> + Algumas modificações não foram salvas + </panel.string> + <panel.string name="want_apply_text"> + Deseja salvar essas mudanças? + </panel.string> <tab_container height="164" name="roles_tab_container"> - <panel height="148" label="Membros" name="members_sub_tab" tool_tip="Membros"> - <line_editor bottom="127" name="search_text"/> - <button label="Pesquisar" name="search_button" width="75"/> - <button label="Mostrar todos" name="show_all_button" left_delta="80"/> - <name_list name="member_list" bottom_delta="-105" height="104" > - <column label="Nome do membro" name="name"/> - <column label="Tarifa doada" name="donated"/> - <column label="Último login" name="online"/> - </name_list> - <button label="Convidar Novo Membro..." name="member_invite" width="165"/> - <button label="Ejetar do Grupo" name="member_eject"/> - <string name="help_text"> + <panel height="148" label="MEMBROS" name="members_sub_tab" tool_tip="Membros"> + <panel.string name="help_text"> Você pode adicionar ou remover as funções designadas aos membros. Selecione vários membros, segurando a tecla Ctrl e clicando em seus nomes. - </string> + </panel.string> + <filter_editor label="Filtrar por membro" name="filter_input"/> + <name_list bottom_delta="-105" height="104" name="member_list"> + <name_list.columns label="Membro" name="name"/> + <name_list.columns label="Doações" name="donated"/> + <name_list.columns label="Status" name="online"/> + </name_list> + <button label="Convidar" name="member_invite" width="165"/> + <button label="Ejetar" name="member_eject"/> </panel> - <panel height="148" label="Funções" name="roles_sub_tab"> - <line_editor bottom="127" name="search_text"/> - <button label="Busca" name="search_button" width="75"/> - <button label="Mostrar todos" name="show_all_button" left_delta="80"/> - <scroll_list name="role_list" bottom_delta="-104" height="104"> - <column label="Nome da função" name="name"/> - <column label="TÃtulo" name="title"/> - <column label="Membro" name="members"/> + <panel height="148" label="CARGOS" name="roles_sub_tab"> + <panel.string name="help_text"> + Cada cargo tem um nome e uma lista das funções que membros designados podem desempenhar. + Os membros podem ter um ou mais cargos. + Cada grupo pode ter 10 cargos, incluindo Membro e Dono do Grupo. + </panel.string> + <panel.string name="cant_delete_role"> + As funções 'Todos' e 'Owners' são especiais e não podem ser apagadas. + </panel.string> + <panel.string name="power_folder_icon"> + Inv_FolderClosed + </panel.string> + <filter_editor label="Filtrar por cargo" name="filter_input"/> + <scroll_list bottom_delta="-104" height="104" name="role_list"> + <scroll_list.columns label="Cargo" name="name"/> + <scroll_list.columns label="TÃtulo" name="title"/> + <scroll_list.columns label="#" name="members"/> </scroll_list> - <button label="Criar nova função..." name="role_create"/> + <button label="Adicionar cargo" name="role_create"/> <button label="Apagar função" name="role_delete"/> - <string name="help_text"> - As funções têm um tÃtulo e uma lista de habilidades -permitidas que os membros podem executar. Os membros poderão ter um ou mais funções. - Um grupo poderá ter até 10 funções, incluÃndo as funções dos membros e do dono do grupo. - </string> - <string name="cant_delete_role"> - As funções 'todos' e 'donos' são especiais e não podem ser deletadas. - </string> </panel> - <panel height="148" label="Habilidades" name="actions_sub_tab"> - <line_editor bottom="127" name="search_text"/> - <button label="Busca" name="search_button" width="75"/> - <button label="Mostrar todos" name="show_all_button" left_delta="80"/> - <scroll_list bottom_delta="-120" height="118" name="action_list" tool_tip="Selecione uma habilidade para ver mais detalhes."/> - <string name="help_text"> + <panel height="148" label="FUNÇÕES" name="actions_sub_tab" tool_tip="Você pode ver a descrição de uma função e quais cargos e membros podem desempenhá-la."> + <panel.string name="help_text"> As habilidades permitem que os membros nas funções façam coisas especÃficas dentro do grupo. Há uma grande variedade de habilidades. - </string> + </panel.string> + <filter_editor label="Filtrar por função" name="filter_input"/> + <scroll_list bottom_delta="-120" height="118" name="action_list" tool_tip="Selecione uma função para ver mais detalhes"/> </panel> </tab_container> <panel name="members_footer"> <text name="static"> - Funções atribuÃdas + Cargos desempenhados </text> <text name="static2"> Habilidades permitidas </text> - <scroll_list name="member_allowed_actions" tool_tip="Para detalhes de cada habilidade permitida, veja a aba Habilidades."/> + <scroll_list name="member_allowed_actions" tool_tip="Clique na guia Funções para ver mais detalhes"/> </panel> <panel name="roles_footer"> <text name="static"> - Nome - </text> - <text name="static2"> - Descrição + Nome da função </text> <line_editor name="role_name"> Empregados </line_editor> <text name="static3"> - TÃtulo + TÃtulo da função </text> <line_editor name="role_title"> (esperando) </line_editor> + <text name="static2"> + Descrição + </text> <text_editor name="role_description"> (esperando) </text_editor> <text name="static4"> - Membros atribuÃdos + Cargos desempenhados </text> + <check_box label="Revelar membros" name="role_visible_in_list" tool_tip="Define se os membros dessa função são visÃveis na guia geral para pessoas de fora do grupo."/> <text name="static5" tool_tip="Uma lista de habilidades que a função selecionada atualmente pode executar."> Habilidades permitidas </text> - <check_box label="Membros estão visÃveis" name="role_visible_in_list" tool_tip="Selecione se os membros desta função estarão visÃveis na aba Diversos, para as pessoas de fora do grupo."/> - <scroll_list name="role_allowed_actions" tool_tip="Para ver detalhes de cada habilidade permitida, veja a aba correspondente."/> + <scroll_list name="role_allowed_actions" tool_tip="Clique na guia Funções para ver mais detalhes"/> </panel> <panel name="actions_footer"> <text name="static"> - Descrição + Descrição da função </text> <text_editor name="action_description"> Essa habilidade permite tirar alguem do grupo. Somente o dono do grupo poderá retirar outro dono do grupo. </text_editor> <text name="static2"> - Funções com habilidades + Cargos com esta função </text> <text name="static3"> - Membros com habilidades + Membros com esta função </text> </panel> </panel> diff --git a/indra/newview/skins/default/xui/pt/panel_groups.xml b/indra/newview/skins/default/xui/pt/panel_groups.xml index aaea1178a6..0aea0d53dd 100644 --- a/indra/newview/skins/default/xui/pt/panel_groups.xml +++ b/indra/newview/skins/default/xui/pt/panel_groups.xml @@ -1,15 +1,15 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="groups"> <text name="groupdesc" width="268"> - Seu grupo ativo atual es'ta mostrado em negrito. + Seu grupo ativo atual está em negrito. </text> <text name="groupcount" width="300"> - Você pertence a [COUNT] grupos (de no máximo [MAX]). + Você pertence a [COUNT] grupos (máximo [MAX]). </text> - <button width="86" label="MI/Chamada" name="IM" tool_tip="Abrir sessão de Mensagem Instantânea"/> + <button width="86" label="MI/Ligação" name="IM" tool_tip="Abrir sessão de Mensagem Instantânea"/> <button width="86" label="Informações" name="Info"/> <button width="86" label="Ativar" name="Activate"/> - <button width="86" label="Deixar" name="Leave"/> + <button width="86" label="Sair" name="Leave"/> <button width="86" label="Criar..." name="Create"/> <button width="86" label="Buscar..." name="Search..."/> </panel> diff --git a/indra/newview/skins/default/xui/pt/panel_im_control_panel.xml b/indra/newview/skins/default/xui/pt/panel_im_control_panel.xml new file mode 100644 index 0000000000..91b7d1b7cd --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_im_control_panel.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_im_control_panel"> + <layout_stack name="button_stack"> + <layout_panel name="view_profile_btn_panel"> + <button label="Perfil" name="view_profile_btn"/> + </layout_panel> + <layout_panel name="add_friend_btn_panel"> + <button label="Adicionar amigo" name="add_friend_btn"/> + </layout_panel> + <layout_panel name="teleport_btn_panel"> + <button label="Teletransportar" name="teleport_btn" tool_tip="Oferecer teletransporte"/> + </layout_panel> + <layout_panel name="share_btn_panel"> + <button label="Compartilhar" name="share_btn"/> + </layout_panel> + <layout_panel name="pay_btn_panel"> + <button label="Pagar" name="pay_btn"/> + </layout_panel> + <layout_panel name="call_btn_panel"> + <button label="Ligar" name="call_btn"/> + </layout_panel> + <layout_panel name="end_call_btn_panel"> + <button label="Encerrar ligação" name="end_call_btn"/> + </layout_panel> + <layout_panel name="voice_ctrls_btn_panel"> + <button label="Controles de voz" name="voice_ctrls_btn"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_inventory_item.xml b/indra/newview/skins/default/xui/pt/panel_inventory_item.xml new file mode 100644 index 0000000000..d18047fbcf --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_inventory_item.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="inventory_item"> + <text name="item_name" value="..."/> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_landmark_info.xml b/indra/newview/skins/default/xui/pt/panel_landmark_info.xml new file mode 100644 index 0000000000..6196c06d09 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_landmark_info.xml @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="landmark_info"> + <string name="title_create_landmark" value="Criar Landmark"/> + <string name="title_edit_landmark" value="Editar Landmark"/> + <string name="title_landmark" value="Landmark"/> + <string name="not_available" value="(N\A)"/> + <string name="unknown" value="(desconhecido)"/> + <string name="public" value="(público)"/> + <string name="server_update_text"> + Informação do lugar não disponÃvel sem atualização do servidor. + </string> + <string name="server_error_text"> + Informações sobre esta localização não está disponÃvel neste momento, por favor, tente novamente mais tarde. + </string> + <string name="server_forbidden_text"> + Informações sobre esta localização está indisponÃvel devido a restrições de acesso. Por favor, verifique as permissões com o proprietário da parcela. + </string> + <string name="acquired_date"> + [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local] + </string> + <button name="back_btn" tool_tip="Atrás"/> + <text name="title" value="Perfil do Lugar"/> + <scroll_container name="place_scroll"> + <panel name="scrolling_panel"> + <text name="maturity_value" value="desconhecido"/> + <panel name="landmark_info_panel"> + <text name="owner_label" value="Proprietário:"/> + <text name="creator_label" value="Criador:"/> + <text name="created_label" value="Criado:"/> + </panel> + <panel name="landmark_edit_panel"> + <text name="title_label" value="TÃtulo:"/> + <text name="notes_label" value="Minhas notas:"/> + <text name="folder_label" value="Localização da Landmark:"/> + </panel> + </panel> + </scroll_container> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_landmarks.xml b/indra/newview/skins/default/xui/pt/panel_landmarks.xml new file mode 100644 index 0000000000..3f357bcefe --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_landmarks.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="Landmarks"> + <accordion name="landmarks_accordion"> + <accordion_tab name="tab_favorites" title="Barra 'Destaques'"/> + <accordion_tab name="tab_landmarks" title="Meus marcos"/> + <accordion_tab name="tab_inventory" title="Meu inventário"/> + <accordion_tab name="tab_library" title="Biblioteca"/> + </accordion> + <panel name="bottom_panel"> + <button name="options_gear_btn" tool_tip="Mostrar opções adicionais"/> + <button name="add_btn" tool_tip="Adicionar marco"/> + <dnd_button name="trash_btn" tool_tip="Excluir marco selecionado"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_login.xml b/indra/newview/skins/default/xui/pt/panel_login.xml index d7ff3f29df..94a885960a 100644 --- a/indra/newview/skins/default/xui/pt/panel_login.xml +++ b/indra/newview/skins/default/xui/pt/panel_login.xml @@ -1,39 +1,40 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="panel_login"> <panel.string name="create_account_url"> - http://join.secondlife.com/index.php?lang=pt-BR + http://join.secondlife.com/ </panel.string> <panel.string name="forgot_password_url"> http://secondlife.com/account/request.php?lang=pt </panel.string> -<panel name="login_widgets"> - <text name="first_name_text"> - Primeiro nome: - </text> - <text name="last_name_text"> - Sobrenome: - </text> - <text name="password_text"> - Senha: - </text> - <text name="start_location_text"> - Posição inicial: - </text> - <combo_box name="start_location_combo"> - <combo_box.item name="MyHome" label="Minha casa" /> - <combo_box.item name="MyLastLocation" label="Minha última localização" /> - <combo_box.item name="Typeregionname" label="< Digite o nome da região >" /> - </combo_box> - <check_box label="Lembrar senha" name="remember_check"/> - <button label="Entrar" label_selected="Entrar" name="connect_btn"/> - <text name="create_new_account_text"> - Registrar-se para uma conta - </text> - <text name="forgot_password_text" left="-240" width="230"> - Esqueceu seu nome de usuário ou senha? - </text> - <text name="channel_text"> - [VERSION] - </text> -</panel> + <layout_stack name="login_widgets"> + <layout_panel name="login"> + <text name="username_text"> + Nome de usuário: + </text> + <line_editor label="Nome de usuário" name="username_edit" tool_tip="[SECOND_LIFE] Nome de usuário"/> + <text name="password_text"> + Senha: + </text> + <check_box label="Lembrar senha" name="remember_check"/> + <button label="conectar" name="connect_btn"/> + <text name="start_location_text"> + Começar em: + </text> + <combo_box name="start_location_combo"> + <combo_box.item label="Última posição" name="MyLastLocation"/> + <combo_box.item label="Meu inÃcio" name="MyHome"/> + </combo_box> + </layout_panel> + <layout_panel name="links"> + <text name="create_new_account_text"> + Cadastre-se + </text> + <text name="forgot_password_text"> + Esqueceu seu nome ou senha? + </text> + <text name="login_help"> + Precisa de ajuda ao conectar? + </text> + </layout_panel> + </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/pt/panel_main_inventory.xml b/indra/newview/skins/default/xui/pt/panel_main_inventory.xml new file mode 100644 index 0000000000..dbf8e4fa52 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_main_inventory.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Coisas" name="main inventory panel"> + <panel.string name="ItemcountFetching"> + Reunindo [ITEM_COUNT] itens ... [FILTER] + </panel.string> + <panel.string name="ItemcountCompleted"> + [ITEM_COUNT] itens [FILTER] + </panel.string> + <text name="ItemcountText"> + Itens: + </text> + <filter_editor label="Filtro" name="inventory search editor"/> + <tab_container name="inventory filter tabs"> + <inventory_panel label="Todos os itens" name="All Items"/> + <recent_inventory_panel label="Itens recentes" name="Recent Items"/> + </tab_container> + <layout_stack name="bottom_panel"> + <layout_panel name="options_gear_btn_panel"> + <button name="options_gear_btn" tool_tip="Mostrar opções adicionais"/> + </layout_panel> + <layout_panel name="add_btn_panel"> + <button name="add_btn" tool_tip="Adicionar novo item"/> + </layout_panel> + <layout_panel name="trash_btn_panel"> + <dnd_button name="trash_btn" tool_tip="Remover item selecionado"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_me.xml b/indra/newview/skins/default/xui/pt/panel_me.xml new file mode 100644 index 0000000000..412f75ca78 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_me.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Meu perfil" name="panel_me"> + <tab_container name="tabs"> + <panel label="MEU PERFIL" name="panel_profile"/> + <panel label="MEUS DESTAQUES" name="panel_picks"/> + </tab_container> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_media_settings_general.xml b/indra/newview/skins/default/xui/pt/panel_media_settings_general.xml new file mode 100644 index 0000000000..43c0820036 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_media_settings_general.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Geral" name="Media Settings General"> + <text name="home_label"> + Página web: + </text> + <text name="home_fails_whitelist_label"> + (Esta página não atende à lista de páginas aprovadas) + </text> + <line_editor name="home_url" tool_tip="Website desta mÃdia"/> + <text name="preview_label"> + Visualizar + </text> + <text name="current_url_label"> + Página atual: + </text> + <text name="current_url" tool_tip="Website desta mÃdia" value=""/> + <button label="Redefinir" name="current_url_reset_btn"/> + <check_box initial_value="false" label="Loop contÃnuo" name="auto_loop"/> + <check_box initial_value="false" label="Interagir no primeiro clique" name="first_click_interact"/> + <check_box initial_value="false" label="Zoom automático" name="auto_zoom"/> + <check_box initial_value="false" label="MÃdia auto-executável" name="auto_play"/> + <text name="media_setting_note"> + Nota: Residentes podem redefinir a configuração. + </text> + <check_box initial_value="false" label="Dimensionamento automático na frente do objeto" name="auto_scale"/> + <text name="size_label"> + Tamanho: + </text> + <text name="X_label"> + X + </text> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_media_settings_permissions.xml b/indra/newview/skins/default/xui/pt/panel_media_settings_permissions.xml new file mode 100644 index 0000000000..55226db274 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_media_settings_permissions.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Customizar" name="Media settings for controls"> + <text name="controls_label"> + Controles: + </text> + <combo_box name="controls"> + <combo_item name="Standard"> + Padrão + </combo_item> + <combo_item name="Mini"> + Mini + </combo_item> + </combo_box> + <text name="owner_label"> + Proprietário + </text> + <check_box initial_value="false" label="Permitir navegação & interatividade" name="perms_owner_interact"/> + <check_box initial_value="false" label="Exibir barra de controle" name="perms_owner_control"/> + <text name="group_label"> + Grupo: + </text> + <check_box initial_value="false" label="Permitir navegação & interatividade" name="perms_group_interact"/> + <check_box initial_value="false" label="Exibir barra de controle" name="perms_group_control"/> + <text name="anyone_label"> + Todos + </text> + <check_box initial_value="false" label="Permitir navegação & interatividade" name="perms_anyone_interact"/> + <check_box initial_value="false" label="Exibir barra de controle" name="perms_anyone_control"/> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_media_settings_security.xml b/indra/newview/skins/default/xui/pt/panel_media_settings_security.xml new file mode 100644 index 0000000000..646969946c --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_media_settings_security.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Segurança" name="Media Settings Security"> + <check_box initial_value="false" label="Acesso permitido a URLs com padrão especÃfico" name="whitelist_enable"/> + <text name="home_url_fails_some_items_in_whitelist"> + URLs com falha de acesso na página inicial são indicados com um: + </text> + <button label="Adicionar" name="whitelist_add"/> + <button label="Excluir" name="whitelist_del"/> + <text name="home_url_fails_whitelist"> + Aviso: A página inicial especificada na aba Geral não consta na lista de acesso. Seu acesso será autorizado quando a lista for retificada. + </text> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_my_profile.xml b/indra/newview/skins/default/xui/pt/panel_my_profile.xml new file mode 100644 index 0000000000..b1ca318add --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_my_profile.xml @@ -0,0 +1,35 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Perfil" name="panel_profile"> + <string name="no_partner_text" value="Nenhum"/> + <string name="no_group_text" value="Nenhum"/> + <string name="RegisterDateFormat"> + [REG_DATE] ([AGE]) + </string> + <layout_stack name="layout"> + <layout_panel name="profile_stack"> + <scroll_container name="profile_scroll"> + <panel name="scroll_content_panel"> + <panel name="second_life_image_panel"> + <icon label="" name="2nd_life_edit_icon" tool_tip="Clique no botão Editar para trocar a imagem"/> + <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/> + </panel> + <panel name="first_life_image_panel"> + <icon label="" name="real_world_edit_icon" tool_tip="Clique no botão Editar para trocar a imagem"/> + <text name="title_rw_descr_text" value="Mundo real:"/> + </panel> + <text name="title_member_text" value="Residente desde:"/> + <text name="title_acc_status_text" value="Conta:"/> + <text name="title_partner_text" value="Parceiro(a):"/> + <panel name="partner_data_panel"> + <name_box initial_value="(pesquisando)" name="partner_text"/> + </panel> + <text name="title_groups_text" value="Grupos:"/> + </panel> + </scroll_container> + </layout_panel> + <layout_panel name="profile_me_buttons_panel"> + <button label="Editar perfil" name="edit_profile_btn" tool_tip="Editar dados pessoais"/> + <button label="Editar aparência" name="edit_appearance_btn" tool_tip="Criar/editar aparência: fÃsico, roupas, etc."/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_navigation_bar.xml b/indra/newview/skins/default/xui/pt/panel_navigation_bar.xml new file mode 100644 index 0000000000..01930bf3b3 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_navigation_bar.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="navigation_bar"> + <panel name="navigation_panel"> + <pull_button name="back_btn" tool_tip="Voltar para região anterior"/> + <pull_button name="forward_btn" tool_tip="Avançar uma região"/> + <button name="home_btn" tool_tip="Teletransportar para meu inÃcio"/> + <location_input label="Onde" name="location_combo"/> + <search_combo_box label="Busca" name="search_combo_box" tool_tip="Busca"> + <combo_editor label="Buscar no [SECOND_LIFE]" name="search_combo_editor"/> + </search_combo_box> + </panel> + <favorites_bar name="favorite" tool_tip="Arraste marcos para cá para acessar seus lugares preferidos do Second Life!"> + <label name="favorites_bar_label" tool_tip="Arraste marcos para cá para acessar seus lugares preferidos do Second Life!"> + Barra Destaques + </label> + <chevron_button name=">>" tool_tip="Mostrar mais favoritos"/> + </favorites_bar> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_nearby_chat.xml b/indra/newview/skins/default/xui/pt/panel_nearby_chat.xml new file mode 100644 index 0000000000..bdbf29e70b --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_nearby_chat.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- All our XML is utf-8 encoded. --> +<panel name="nearby_chat"> + <panel name="chat_caption"> + <text name="sender_name"> + Bate-papo local + </text> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/pt/panel_nearby_chat_bar.xml new file mode 100644 index 0000000000..9b993488be --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_nearby_chat_bar.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="chat_bar"> + <line_editor label="Clique aqui para bater papo." name="chat_box" tool_tip="Tecle Enter para falar, Ctrl+Enter para gritar"/> + <button name="show_nearby_chat" tool_tip="Mostra/oculta o histórico do bate-papo local"/> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_nearby_media.xml b/indra/newview/skins/default/xui/pt/panel_nearby_media.xml new file mode 100644 index 0000000000..8d08177eed --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_nearby_media.xml @@ -0,0 +1,65 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="nearby_media"> + <string name="media_item_count_format"> + (%ld itens de mÃdia) + </string> + <string name="empty_item_text"> + <vazio> + </string> + <string name="parcel_media_name"> + MÃdia em stream deste lote + </string> + <string name="parcel_audio_name"> + Ãudio em stream do lote + </string> + <string name="playing_suffix"> + (em execução) + </string> + <panel name="minimized_controls"> + <button label="Parar tudo" name="all_nearby_media_disable_btn" tool_tip="Desligar mÃdias por perto"/> + <button label="Executar tudo" name="all_nearby_media_enable_btn" tool_tip="Ligar mÃdias por perto"/> + <button name="open_prefs_btn" tool_tip="Preferências de mÃdia"/> + <button label="Mais >>" label_selected="Menos <<" name="more_btn" tool_tip="Controles avançados"/> + <button label="Mais >>" label_selected="Menos <<" name="less_btn" tool_tip="Controles avançados"/> + </panel> + <panel name="nearby_media_panel"> + <combo_box name="show_combo"> + <combo_box.item label="Tudo" name="All"/> + <combo_box.item label="Neste lote" name="WithinParcel"/> + <combo_box.item label="Fora deste lote" name="OutsideParcel"/> + <combo_box.item label="Nos outros avatares" name="OnOthers"/> + </combo_box> + <scroll_list name="media_list"> + <scroll_list.columns label="Proximidade" name="media_proximity"/> + <scroll_list.columns label="VisÃveis" name="media_visibility"/> + <scroll_list.columns label="Classe" name="media_class"/> + <scroll_list.columns label="Nome" name="media_name"/> + <scroll_list.columns label="Depurar" name="media_debug"/> + </scroll_list> + <panel> + <layout_stack name="media_controls"> + <layout_panel name="stop"> + <button name="stop_btn" tool_tip="Parar mÃdia selecionada"/> + </layout_panel> + <layout_panel name="play"> + <button name="play_btn" tool_tip="Tocar mÃdia selecionada"/> + </layout_panel> + <layout_panel name="pause"> + <button name="pause_btn" tool_tip="Pausar mÃdia selecionada"/> + </layout_panel> + <layout_panel name="volume_slider_ctrl"> + <slider_bar initial_value="0.5" name="volume_slider" tool_tip="Volume da mÃdia selecionada"/> + </layout_panel> + <layout_panel name="mute"> + <button name="mute_btn" tool_tip="Silenciar mÃdia selecionada"/> + </layout_panel> + <layout_panel name="zoom"> + <button name="zoom_btn" tool_tip="Enfocar mÃdia"/> + </layout_panel> + <layout_panel name="unzoom"> + <button name="unzoom_btn" tool_tip="Desenfocar mÃdia selecionada"/> + </layout_panel> + </layout_stack> + </panel> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_notes.xml b/indra/newview/skins/default/xui/pt/panel_notes.xml new file mode 100644 index 0000000000..9aa842d9a5 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_notes.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Anotações e Privacidade" name="panel_notes"> + <layout_stack name="layout"> + <panel name="notes_stack"> + <scroll_container name="profile_scroll"> + <panel name="profile_scroll_panel"> + <text name="status_message" value="Minhas anotações privadas:"/> + <text name="status_message2" value="Deixar esta pessoa:"/> + <check_box label="Ver meu status" name="status_check"/> + <check_box label="Ver minha localização no mapa" name="map_check"/> + <check_box label="Pegar, editar ou excluir objetos meus" name="objects_check"/> + </panel> + </scroll_container> + </panel> + <panel name="notes_buttons_panel"> + <button label="Adicionar amigo" name="add_friend" tool_tip="Oferecer amizade ao residente"/> + <button label="MI" name="im" tool_tip="Abrir sessão de mensagem instantânea"/> + <button label="Ligar" name="call" tool_tip="Ligar para este residente"/> + <button label="Mapa" name="show_on_map_btn" tool_tip="Exibir o residente no mapa"/> + <button label="Teletransportar" name="teleport" tool_tip="Oferecer teletransporte"/> + </panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_online_status.xml b/indra/newview/skins/default/xui/pt/panel_online_status.xml new file mode 100644 index 0000000000..fdc489f375 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_online_status.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="friend_online_status" name="friend_online_status"/> diff --git a/indra/newview/skins/default/xui/pt/panel_online_status_toast.xml b/indra/newview/skins/default/xui/pt/panel_online_status_toast.xml new file mode 100644 index 0000000000..fdc489f375 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_online_status_toast.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="friend_online_status" name="friend_online_status"/> diff --git a/indra/newview/skins/default/xui/pt/panel_outfit_edit.xml b/indra/newview/skins/default/xui/pt/panel_outfit_edit.xml new file mode 100644 index 0000000000..bbf5b397c3 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_outfit_edit.xml @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- Side tray Outfit Edit panel --> +<panel label="Editar look" name="outfit_edit"> + <string name="No Outfit" value="Nenhum"/> + <string name="unsaved_changes" value="Mudanças não salvas"/> + <string name="now_editing" value="Editando..."/> + <panel.string name="not_available"> + (N\A) + </panel.string> + <panel.string name="unknown"> + (Desconhecido) + </panel.string> + <string name="Filter.All" value="Tudo"/> + <string name="Filter.Clothes/Body" value="Roupas/Corpo"/> + <string name="Filter.Objects" value="Objects"/> + <string name="Filter.Custom" value="Filtro personalizado"/> + <text name="title" value="Editar look"/> + <panel label="bottom_panel" name="header_panel"> + <panel label="bottom_panel" name="outfit_name_and_status"> + <text name="status" value="Editando..."/> + <text name="curr_outfit_name" value="[Look atual]"/> + </panel> + </panel> + <layout_stack name="im_panels"> + <layout_panel label="Painel de controle de MIs" name="outfit_wearables_panel"> + <layout_stack name="filter_panels"> + <layout_panel name="add_button_and_combobox"> + <button label="Adicionar mais..." name="show_add_wearables_btn"/> + </layout_panel> + <layout_panel name="filter_panel"> + <filter_editor label="Filtrar itens de vestuário" name="look_item_filter"/> + </layout_panel> + </layout_stack> + </layout_panel> + <layout_panel name="add_wearables_panel"/> + </layout_stack> + <panel name="save_revert_button_bar"> + <button label="Salvar" name="save_btn"/> + <button label="Reverter" name="revert_btn"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/pt/panel_outfits_inventory.xml new file mode 100644 index 0000000000..10ef2a332f --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_outfits_inventory.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Coisas" name="Outfits"> + <tab_container name="appearance_tabs"> + <panel label="MEUS LOOKS" name="outfitslist_tab"/> + <inventory_panel label="EM USO" name="cof_tab"/> + </tab_container> + <panel name="bottom_panel"> + <button name="options_gear_btn" tool_tip="Mostrar opções adicionais"/> + <dnd_button name="trash_btn" tool_tip="Remover item selecionado"/> + <button label="Salvar como" name="save_btn"/> + <button label="Vestir" name="wear_btn" tool_tip="Vestir look selecionado"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_outfits_inventory_gear_default.xml b/indra/newview/skins/default/xui/pt/panel_outfits_inventory_gear_default.xml new file mode 100644 index 0000000000..736b8f1fdd --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_outfits_inventory_gear_default.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_gear_default"> + <menu_item_call label="Substituir look atual" name="wear"/> + <menu_item_call label="Adicionar ao look atual" name="add"/> + <menu_item_call label="Tirar do look atual" name="remove"/> + <menu_item_call label="Renomear" name="rename"/> + <menu_item_call label="Remover link" name="remove_link"/> + <menu_item_call label="Excluir visual" name="delete"/> +</menu> diff --git a/indra/newview/skins/default/xui/pt/panel_people.xml b/indra/newview/skins/default/xui/pt/panel_people.xml new file mode 100644 index 0000000000..efeea89fa9 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_people.xml @@ -0,0 +1,64 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- Side tray panel --> +<panel label="Pessoas" name="people_panel"> + <string name="no_recent_people" value="Ninguém, recentemente. Em busca de alguém para conversar? Use a [secondlife:///app/search/people Busca] ou o [secondlife:///app/worldmap Mapa-Múndi]."/> + <string name="no_filtered_recent_people" value="Não encontrou o que procura? Tente buscar no [secondlife:///app/search/people/[SEARCH_TERM] Search]."/> + <string name="no_one_near" value="Ninguém por perto Em busca de alguém para conversar? Use a [secondlife:///app/search/people Busca] ou o [secondlife:///app/worldmap Mapa-Múndi]."/> + <string name="no_one_filtered_near" value="Não encontrou o que procura? Tente buscar no [secondlife:///app/search/people/[SEARCH_TERM] Search]."/> + <string name="no_friends_online" value="Nenhum amigo online"/> + <string name="no_friends" value="Nenhum amigo"/> + <string name="no_friends_msg"> + Encontre amigos fazendo uma [secondlife:///app/search/people busca de pessoas] ou clique em um residente para adicioná-lo. +Em busca de alguém para conversar? Procure no [secondlife:///app/worldmap Mapa-Múndi]. + </string> + <string name="no_filtered_friends_msg"> + Não encontrou o que procura? Tente buscar no [secondlife:///app/search/people/[SEARCH_TERM] Search]. + </string> + <string name="people_filter_label" value="Filtro de pessoas"/> + <string name="groups_filter_label" value="Filtro de grupos"/> + <string name="no_filtered_groups_msg" value="Não encontrou o que procura? Tente buscar no [secondlife:///app/search/groups/[SEARCH_TERM] Search]."/> + <string name="no_groups_msg" value="À procura de grupos interessantes? Tente fazer uma [secondlife:///app/search/groups Busca]."/> + <filter_editor label="Filtro" name="filter_input"/> + <tab_container name="tabs"> + <panel label="PROXIMIDADE" name="nearby_panel"> + <panel label="bottom_panel" name="bottom_panel"> + <button name="nearby_view_sort_btn" tool_tip="Opções"/> + <button name="add_friend_btn" tool_tip="Adicionar o residente selecionado para sua lista de amigos"/> + </panel> + </panel> + <panel label="MEUS AMIGOS" name="friends_panel"> + <accordion name="friends_accordion"> + <accordion_tab name="tab_online" title="Online"/> + <accordion_tab name="tab_all" title="Todos"/> + </accordion> + <panel label="bottom_panel" name="bottom_panel"> + <button name="friends_viewsort_btn" tool_tip="Opções"/> + <button name="add_btn" tool_tip="Oferecer amizade para um residente"/> + <button name="del_btn" tool_tip="Remover a pessoa selecionada da sua lista de amigos"/> + </panel> + </panel> + <panel label="MEUS GRUPOS" name="groups_panel"> + <panel label="bottom_panel" name="bottom_panel"> + <button name="groups_viewsort_btn" tool_tip="Opções"/> + <button name="plus_btn" tool_tip="Ingressar em um grupo/Criar novo grupo"/> + <button name="activate_btn" tool_tip="Ativar o grupo selecionado"/> + </panel> + </panel> + <panel label="RECENTE" name="recent_panel"> + <panel label="bottom_panel" name="bottom_panel"> + <button name="recent_viewsort_btn" tool_tip="Opções"/> + <button name="add_friend_btn" tool_tip="Adicionar o residente selecionado para sua lista de amigos"/> + </panel> + </panel> + </tab_container> + <panel name="button_bar"> + <button label="Perfil" name="view_profile_btn" tool_tip="Exibir fotografia, grupos e outras informações dos residentes" width="50"/> + <button label="MI" name="im_btn" tool_tip="Iniciar MI" width="24"/> + <button label="Chamada" name="call_btn" tool_tip="Ligar para este residente" width="61"/> + <button label="Compartilhar" name="share_btn" tool_tip="Compartilhar item de inventário" width="82"/> + <button label="Teletransporte" name="teleport_btn" tool_tip="Oferecer teletransporte" width="86"/> + <button label="Perfil do grupo" name="group_info_btn" tool_tip="Exibir informação de grupo"/> + <button label="Bate-papo de grupo" name="chat_btn" tool_tip="Iniciar bate-papo"/> + <button label="Ligar para o grupo" name="group_call_btn" tool_tip="Ligar para este grupo"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_pick_info.xml b/indra/newview/skins/default/xui/pt/panel_pick_info.xml new file mode 100644 index 0000000000..007965a8c9 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_pick_info.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_pick_info"> + <text name="title" value="Detalhes do destaque"/> + <scroll_container name="profile_scroll"> + <panel name="scroll_content_panel"> + <text name="pick_name" value="[NAME]"/> + <text name="pick_location" value="[carregando...]"/> + <text name="pick_desc" value="[descrição]"/> + </panel> + </scroll_container> + <panel name="buttons"> + <button label="Teletransportar" name="teleport_btn"/> + <button label="Mapa" name="show_on_map_btn"/> + <button label="Editar" name="edit_btn"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_picks.xml b/indra/newview/skins/default/xui/pt/panel_picks.xml new file mode 100644 index 0000000000..453954bc3e --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_picks.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Destaques" name="panel_picks"> + <string name="no_picks" value="Sem destaques"/> + <string name="no_classifieds" value="Sem classificados"/> + <text name="empty_picks_panel_text"> + Não ha nenhum destaque/ classificado aqui + </text> + <accordion name="accordion"> + <accordion_tab name="tab_picks" title="Destaques"/> + <accordion_tab name="tab_classifieds" title="Classificados"/> + </accordion> + <panel label="bottom_panel" name="edit_panel"> + <button name="new_btn" tool_tip="Criar um novo destaque ou classificado na localização atual"/> + </panel> + <panel name="buttons_cucks"> + <button label="Info" name="info_btn" tool_tip="Exibir informação de destaque"/> + <button label="Teletransportar" name="teleport_btn" tool_tip="Teletransportar para a área correspondente"/> + <button label="Mapa" name="show_on_map_btn" tool_tip="Exibir a área correspondente no Mapa Mundi"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_place_profile.xml b/indra/newview/skins/default/xui/pt/panel_place_profile.xml new file mode 100644 index 0000000000..03f997f31b --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_place_profile.xml @@ -0,0 +1,111 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="place_profile"> + <string name="on" value="Ligar"/> + <string name="off" value="Desligar"/> + <string name="anyone" value="Todos"/> + <string name="available" value="disponÃvel"/> + <string name="allocated" value="alocados"/> + <string name="title_place" value="Perfil da região"/> + <string name="title_teleport_history" value="Teletransportes"/> + <string name="not_available" value="(N\A)"/> + <string name="unknown" value="(Desconhecido)"/> + <string name="public" value="(público)"/> + <string name="none_text" value="(nenhum)"/> + <string name="sale_pending_text" value="(Venda em andamento)"/> + <string name="group_owned_text" value="(Propriedade do grupo)"/> + <string name="price_text" value="L$"/> + <string name="area_text" value="m²"/> + <string name="all_residents_text" value="Todos os residentes"/> + <string name="group_text" value="Grupo"/> + <string name="can_resell"> + Esta região permite a compra e venda de lotes. + </string> + <string name="can_not_resell"> + Esta região não permite a compra e venda de lotes. + </string> + <string name="can_change"> + Esta região permite a junção ou subdivisão de lotes. + </string> + <string name="can_not_change"> + Esta região não permite a junção ou subdivisão de lotes. + </string> + <string name="server_update_text"> + Dados sobre o local requerem atualização do servidor. + </string> + <string name="server_error_text"> + Dados sobre o local não disponÃveis no momento. Favor tentar mais tarde. + </string> + <string name="server_forbidden_text"> + Dados sobre o local controlados por lista de acesso. Verifique se você está autorizado a acessá-los com o dono do lote. + </string> + <string name="acquired_date"> + [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local] + </string> + <button name="back_btn" tool_tip="Atrás"/> + <text name="title" value="Perfil da região"/> + <scroll_container name="place_scroll"> + <panel name="scrolling_panel"> + <text name="owner_label" value="Proprietário:"/> + <text name="maturity_value" value="(Desconhecido)"/> + <accordion name="advanced_info_accordion"> + <accordion_tab name="parcel_characteristics_tab" title="Lote"> + <panel name="parcel_characteristics_panel"> + <text name="rating_label" value="Classificação:"/> + <text name="rating_value" value="desconhecido"/> + <text name="voice_label" value="Voz:"/> + <text name="voice_value" value="Ligar"/> + <text name="fly_label" value="Voar:"/> + <text name="fly_value" value="Ligar"/> + <text name="push_label" value="Empurrar:"/> + <text name="push_value" value="Desligar"/> + <text name="build_label" value="Construir:"/> + <text name="build_value" value="Ligar"/> + <text name="scripts_label" value="Scripts:"/> + <text name="scripts_value" value="Ligar"/> + <text name="damage_label" value="Dano:"/> + <text name="damage_value" value="Desligar"/> + <button label="Sobre terrenos" name="about_land_btn"/> + </panel> + </accordion_tab> + <accordion_tab name="region_information_tab" title="Região"> + <panel name="region_information_panel"> + <text name="region_name_label" value="Região:"/> + <text name="region_name" value="Alcelândia"/> + <text name="region_type_label" value="Tipo:"/> + <text name="region_type" value="Alce"/> + <text name="region_rating_label" value="Classificação:"/> + <text name="region_rating" value="Adulto"/> + <text name="region_owner_label" value="Proprietário:"/> + <text name="region_owner" value="moose Van Moose"/> + <text name="region_group_label" value="Grupo:"/> + <text name="region_group"> + The Mighty Moose of mooseville soundvillemoose + </text> + <button label="Região/Propriedade" name="region_info_btn"/> + </panel> + </accordion_tab> + <accordion_tab name="estate_information_tab" title="Propriedade"> + <panel name="estate_information_panel"> + <text name="estate_name_label" value="Propriedade:"/> + <text name="estate_rating_label" value="Classificação:"/> + <text name="estate_owner_label" value="Proprietário:"/> + <text name="covenant_label" value="Contrato:"/> + </panel> + </accordion_tab> + <accordion_tab name="sales_tab" title="À venda"> + <panel name="sales_panel"> + <text name="sales_price_label" value="Preço:"/> + <text name="area_label" value="Ãrea:"/> + <text name="traffic_label" value="Trânsito:"/> + <text name="primitives_label" value="Prims:"/> + <text name="parcel_scripts_label" value="Scripts:"/> + <text name="terraform_limits_label" value="Limite de terraplenagem:"/> + <text name="subdivide_label" value="Capacidade de juntar/subdividir:"/> + <text name="resale_label" value="Revenda:"/> + <text name="sale_to_label" value="À venda para:"/> + </panel> + </accordion_tab> + </accordion> + </panel> + </scroll_container> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_places.xml b/indra/newview/skins/default/xui/pt/panel_places.xml new file mode 100644 index 0000000000..5f2c56ab8c --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_places.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Lugares" name="places panel"> + <string name="landmarks_tab_title" value="MEUS MARCOS"/> + <string name="teleport_history_tab_title" value="TELETRANSPORTES"/> + <filter_editor label="Filtrar meus lugares" name="Filter"/> + <panel name="button_panel"> + <button label="Teletransportar" name="teleport_btn" tool_tip="Teletransportar para a área selecionada"/> + <button label="Mapa" name="map_btn" tool_tip="Mostrar a área no Mapa Múndi"/> + <button label="Editar" name="edit_btn" tool_tip="Editar dados do marco"/> + <button label="â–¼" name="overflow_btn" tool_tip="Mostrar opções adicionais"/> + <button label="Salvar" name="save_btn"/> + <button label="Cancelar" name="cancel_btn"/> + <button label="Fechar" name="close_btn"/> + <button label="Perfil" name="profile_btn" tool_tip="Mostrar perfil do lugar"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/pt/panel_preferences_advanced.xml index 5ca80bd74d..13cb8a444e 100644 --- a/indra/newview/skins/default/xui/pt/panel_preferences_advanced.xml +++ b/indra/newview/skins/default/xui/pt/panel_preferences_advanced.xml @@ -1,12 +1,37 @@ <?xml version="1.0" encoding="utf-8"?> -<panel name="advanced"> - <text name="AspectRatioLabel1" tool_tip="largura / altura"> - Relação de Aspecto: +<panel label="Avançado" name="advanced"> + <panel.string name="aspect_ratio_text"> + [NUM]:[DEN] + </panel.string> + <panel.string name="middle_mouse"> + Botão do meio do mouse + </panel.string> + <slider label="Ângulo de visão" name="camera_fov"/> + <slider label="Distância" name="camera_offset_scale"/> + <text name="heading2"> + Posicionamento automático da: </text> - <combo_box name="aspect_ratio" tool_tip="largura / altura"> - <combo_box.item label="4:3 (CRT Padrão)" name="item1"/> - <combo_box.item label="5:4 (1280x1024 LCD)" name="item2"/> - <combo_box.item label="8:5 (tela ampla)" name="item3"/> - <combo_box.item label="16:9 (tela ampla)" name="item4"/> - </combo_box> + <check_box label="Construção/Edição" name="edit_camera_movement" tool_tip="Use o posicionamento automático da câmera quando entrar e sair do modo de edição"/> + <check_box label="Aparência" name="appearance_camera_movement" tool_tip="Use o posicionamento automático da câmera quando em modo de edição"/> + <check_box initial_value="verdadeiro" label="Barra lateral" name="appearance_sidebar_positioning" tool_tip="Usar posicionamento automático da câmera na barra lateral"/> + <check_box label="Mostre-me em visão de mouse" name="first_person_avatar_visible"/> + <check_box label="Teclas de seta sempre me movem" name="arrow_keys_move_avatar_check"/> + <check_box label="Dê dois toques e pressione para correr" name="tap_tap_hold_to_run"/> + <check_box label="Mover os lábios do avatar ao falar" name="enable_lip_sync"/> + <check_box label="Balão de bate-papo" name="bubble_text_chat"/> + <slider label="Opacidade" name="bubble_chat_opacity"/> + <color_swatch name="background" tool_tip="Cor do balão de bate-papo"/> + <text name="UI Size:"> + Interface + </text> + <check_box label="Mostrar erros de script" name="show_script_errors"/> + <radio_group name="show_location"> + <radio_item label="Bate-papo local" name="0"/> + <radio_item label="Janelas separadas" name="1"/> + </radio_group> + <check_box label="Tecla liga/desliga da minha voz:" name="push_to_talk_toggle_check" tool_tip="Quando em modo de alternância, pressione e solte o botão UMA vez para ligar e desligar o microfone. Quando em modo de alternância, o microfone só transmite sua voz quando o botão estiver pressionado."/> + <line_editor label="Botão apertar e falar" name="modifier_combo"/> + <button label="Definir tecla" name="set_voice_hotkey_button"/> + <button label="Botão do meio do mouse" name="set_voice_middlemouse_button" tool_tip="Redefinir como botão do meio do mouse"/> + <button label="Outros dispositivos" name="joystick_setup_button"/> </panel> diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_alerts.xml b/indra/newview/skins/default/xui/pt/panel_preferences_alerts.xml index e060d784da..2ffe720ccf 100644 --- a/indra/newview/skins/default/xui/pt/panel_preferences_alerts.xml +++ b/indra/newview/skins/default/xui/pt/panel_preferences_alerts.xml @@ -1,18 +1,14 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Popups" name="popups" title="Popups"> - <text name="dont_show_label"> - Não mostrar estas popups: + <text name="tell_me_label"> + Avisar: </text> - <button label="Habilitar esta popup" label_selected="Habilitar este popup" name="enable_popup"/> - <button label="Habilitar todas as popups..." label_selected="Reiniciar Dialogos que serão mostrados na próxima vez..." name="reset_dialogs_btn" tool_tip="Habilitar todas as popups opcionais e notificações de “primeiro usoâ€." width="200"/> + <check_box label="Quando eu gasto ou recebo L$" name="notify_money_change_checkbox"/> + <check_box label="Quando meus amigos entram e saem" name="friends_online_notify_checkbox"/> <text name="show_label"> - Mostrar estas popups: + Mostrar sempre: </text> - <button label="Desabilitar todas estas popups..." name="skip_dialogs_btn" tool_tip="Desabilitar todas as popups opcionais e notificações de “primeiro usoâ€." width="200"/> - <text name="text_box2"> - Ofertas de notecards, texturas e landmarks: + <text name="dont_show_label"> + Nunca mostrar: </text> - <check_box label="Aceitar automaticamente" name="accept_new_inventory"/> - <check_box label="Visualizar automaticamente após aceitar" name="show_new_inventory"/> - <check_box label="Mostrar automaticamente objetos aceitos recentemente no inventário." name="show_in_inventory"/> </panel> diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml b/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml index aa40f97fe3..02b0ef35fe 100644 --- a/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml @@ -1,17 +1,19 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Chat" name="chat"> - <text name="text_box"> - Tamanho da Fonte -do Chat: + <text name="font_size"> + Tamanho da fonte: </text> <radio_group name="chat_font_size"> - <radio_item name="radio" label="Pequeno" /> - <radio_item name="radio2" label="Médio" /> - <radio_item name="radio3" label="Grande" /> + <radio_item label="Pequeno" name="radio" value="0"/> + <radio_item label="Médio" name="radio2" value="1"/> + <radio_item label="Grande" name="radio3" value="2"/> </radio_group> + <text name="font_colors"> + Cor da fonte: + </text> <color_swatch label="Você" name="user"/> <text name="text_box1"> - Você + Eu </text> <color_swatch label="Outros" name="agent"/> <text name="text_box2"> @@ -37,23 +39,21 @@ do Chat: <text name="text_box7"> Dono </text> - <color_swatch label="Bolha" name="background"/> - <text name="text_box8"> - Bolha - </text> <color_swatch label="URLs" name="links"/> <text name="text_box9"> URLs </text> - <check_box label="Mostrar Erros de Script e avisos como chat comum" name="script_errors_as_chat"/> - <spinner label="Ocultar Chat depois" label_width="108" name="fade_chat_time" width="160"/> - <spinner left="373" name="max_chat_count"/> - <slider label="Opacidade" name="console_opacity"/> - <check_box label="Use a largura total da tela (Precisa reiniciar)" name="chat_full_width_check"/> - <check_box label="Feche a barra de conversa após pressionar retornar" name="close_chat_on_return_check"/> - <check_box label="Teclas de Setas sempre movem o avatar durante a conversa" name="arrow_keys_move_avatar_check"/> - <check_box label="Mostrar a hora na conversa local" name="show_timestamps_check"/> - <check_box label="Executar animação digitada quando estiver conversando" name="play_typing_animation"/> - <check_box label="Mostrar bolhas do chat" name="bubble_text_chat"/> - <slider label="Opacidade" name="bubble_chat_opacity"/> + <check_box initial_value="true" label="Executar animação digitada quando estiver conversando" name="play_typing_animation"/> + <check_box label="Enviar MIs por email se estiver desconectado" name="send_im_to_email"/> + <check_box label="Ativar MIs e bate-papos de texto simples" name="plain_text_chat_history"/> + <text name="show_ims_in_label"> + Mostrar MIs em: + </text> + <text name="requires_restart_label"> + (Reinicie para ativar) + </text> + <radio_group name="chat_window" tool_tip="Exibir cada bate-papo em uma janela separada ou exibir todos em uma única janela com uma aba para cada pessoa (requer reinÃcio)"> + <radio_item label="Janelas separadas" name="radio" value="0"/> + <radio_item label="Guias" name="radio2" value="1"/> + </radio_group> </panel> diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_general.xml b/indra/newview/skins/default/xui/pt/panel_preferences_general.xml index 8bde39545c..8a34897c9b 100644 --- a/indra/newview/skins/default/xui/pt/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/pt/panel_preferences_general.xml @@ -1,90 +1,67 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Geral" name="general_panel"> - <combo_box name="start_location_combo"> - <combo_box.item name="MyHome" tool_tip="Como padrão, registrar na minha casa." label="Minha Casa"/> - <combo_box.item name="MyLastLocation" tool_tip="Por padrão, registrar na minha última localidade." label="Minha Última Localidade"/> - </combo_box> - <check_box label="Mostrar Posição Inicial na Tela de Login" name="show_location_checkbox"/> - <combo_box name="fade_out_combobox"> - <combo_box.item name="Never" label="Nunca"/> - <combo_box.item name="Show Temporarily" label="Mostrar Temporariamente"/> - <combo_box.item name="Always" label="Sempre"/> - </combo_box> - <check_box label="Avatar com Nomes Pequenos" name="small_avatar_names_checkbox"/> - <check_box label="Ocultar meu Nome na minha Tela" name="show_my_name_checkbox"/> - <text name="group_titles_textbox"> - TÃtulos dos Grupos: - </text> - <check_box label="Ocultar todos os TÃtulos de Grupos" name="show_all_title_checkbox"/> - <check_box label="Ocultar meu TÃtulo no Grupo" name="show_my_title_checkbox"/> - <color_swatch label="" name="effect_color_swatch" tool_tip="Clique para abrir o seletor de cores"/> - <text name="UI Size:"> - Tamanho da UI: + <text name="language_textbox"> + Idioma: </text> - <check_box label="Usar escala independente da resolução" name="ui_auto_scale"/> - <spinner label="Tempo para ficar Ausente:" name="afk_timeout_spinner"/> - <check_box label="Avisar quando receber ou gastar Linden dollars (L$)" name="notify_money_change_checkbox"/> - <text name="maturity_desired_label"> - Classificação: + <combo_box name="language_combobox"> + <combo_box.item label="Padrão" name="System Default Language"/> + <combo_box.item label="English (Inglês)" name="English"/> + <combo_box.item label="Dansk (Dinamarquês) - Beta" name="Danish"/> + <combo_box.item label="Deutsch (Alemão) - Beta" name="Deutsch(German)"/> + <combo_box.item label="Español (Espanhol) - Beta" name="Spanish"/> + <combo_box.item label="Français (Francês) - Beta" name="French"/> + <combo_box.item label="Italiano - Beta" name="Italian"/> + <combo_box.item label="Nederlands (Holandês) - Beta" name="Dutch"/> + <combo_box.item label="Polski (Polonês) - Beta" name="Polish"/> + <combo_box.item label="Português - Beta" name="Portugese"/> + <combo_box.item label="日本語 (Japonês) - Beta" name="(Japanese)"/> + </combo_box> + <text name="language_textbox2"> + (Reinicie para trocar de idioma) </text> <text name="maturity_desired_prompt"> - Eu quero acessar conteúdo classificado: + Quero acessar conteúdo: </text> + <text name="maturity_desired_textbox"/> <combo_box name="maturity_desired_combobox"> - <combo_box.item name="Desired_Adult" label="PG, Mature e Adult"/> - <combo_box.item name="Desired_Mature" label="PG e Mature"/> - <combo_box.item name="Desired_PG" label="PG"/> + <combo_box.item label="Geral, Moderado e Adulto" name="Desired_Adult"/> + <combo_box.item label="Geral e Moderado" name="Desired_Mature"/> + <combo_box.item label="Geral" name="Desired_PG"/> </combo_box> - <text name="maturity_desired_textbox"> - PG - </text> <text name="start_location_textbox"> - Posição Inicial: + Posição inicial: </text> - <text name="show_names_textbox"> - Mostrar Nomes: + <combo_box name="start_location_combo"> + <combo_box.item label="Última localização" name="MyLastLocation" tool_tip="Voltar ao lugar onde estava antes."/> + <combo_box.item label="Meu inÃcio" name="MyHome" tool_tip="Voltar ao meu inÃcio."/> + </combo_box> + <check_box initial_value="true" label="Mostrar ao entrar" name="show_location_checkbox"/> + <text name="name_tags_textbox"> + Mostrar nomes: </text> + <radio_group name="Name_Tag_Preference"> + <radio_item label="Desligar" name="radio" value="0"/> + <radio_item label="Ligar" name="radio2" value="1"/> + <radio_item label="Brevemente" name="radio3" value="2"/> + </radio_group> + <check_box label="Mostrar meu nome" name="show_my_name_checkbox1"/> + <check_box initial_value="true" label="Nome curto" name="small_avatar_names_checkbox"/> + <check_box label="Mostrar cargo" name="show_all_title_checkbox1"/> <text name="effects_color_textbox"> - Cores para Meus Efeitos: - </text> - <text name="seconds_textbox"> - segundos - </text> - <text name="crash_report_textbox"> - Relatórios de Falhas: - </text> - <text name="language_textbox"> - Linguagem: + Meus efeitos: </text> - <text name="language_textbox2"> - (Precisa de reinÃcio para efetivar) + <text name="title_afk_text"> + Entrar no modo ausente em: </text> - <string name="region_name_prompt"> - Digite o nome da Região - </string> - <combo_box name="crash_behavior_combobox"> - <combo_box.item name="Askbeforesending" label="Perguntar antes de enviar"/> - <combo_box.item name="Alwayssend" label="Sempre enviar"/> - <combo_box.item name="Neversend" label="Nunca Enviar"/> - </combo_box> - <combo_box name="language_combobox"> - <combo_box.item name="System Default Language" label="Padrão do Sistema"/> - <combo_box.item name="English" label="English (Inglês)"/> - <combo_box.item name="Danish" label="Dansk (Dinamarquês) - Beta"/> - <combo_box.item name="Deutsch(German)" label="Deutsch (Alemão) - Beta"/> - <combo_box.item name="Spanish" label="Español (Espanhol) - Beta"/> - <combo_box.item name="French" label="Français (Francês) - Beta"/> - <combo_box.item name="Italian" label="Italiano - Beta"/> - <combo_box.item name="Hungarian" label="Magyar (Húngaro) - Beta"/> - <combo_box.item name="Dutch" label="Nederlands (Holandês) - Beta"/> - <combo_box.item name="Polish" label="Polski (Polonês) - Beta"/> - <combo_box.item name="Portugese" label="Português - Beta"/> - <combo_box.item name="Russian" label="РуÑÑкий (Russo) - Beta"/> - <combo_box.item name="Turkish" label="Türkçe (Turco) - Beta"/> - <combo_box.item name="Ukrainian" label="УкраїнÑька (Ucraniano) - Beta"/> - <combo_box.item name="Chinese" label="䏿–‡ (简体) (Chinês) - Beta"/> - <combo_box.item name="(Japanese)" label="日本語 (Japonês) - Beta"/> - <combo_box.item name="(Korean)" label="한êµì–´ (Coreano) - Beta"/> + <color_swatch label="" name="effect_color_swatch" tool_tip="Clique para abrir o seletor de cores"/> + <combo_box label="Entrar no modo ausente em:" name="afk"> + <combo_box.item label="2 minutos" name="item0"/> + <combo_box.item label="5 minutos" name="item1"/> + <combo_box.item label="10 minutos" name="item2"/> + <combo_box.item label="30 minutos" name="item3"/> + <combo_box.item label="(nunca)" name="item4"/> </combo_box> - <check_box label="Compartilhar a linguagem com objetos" name="language_is_public" tool_tip="Isto permite que os objetos no mundo conheçam sua linguagem preferida."/> + <text name="text_box3"> + Mensagem do modo ocupado: + </text> </panel> diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/pt/panel_preferences_graphics1.xml index d7982ab940..ccf213099e 100644 --- a/indra/newview/skins/default/xui/pt/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/pt/panel_preferences_graphics1.xml @@ -1,43 +1,15 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Gráficos" name="Display panel"> - <button label="?" name="GraphicsPreferencesHelpButton"/> - <check_box label="Execute Second Life em uma janela" name="windowed mode"/> - <text_editor bottom="-56" height="40" name="FullScreenInfo" width="480"> - Se desmarcado, o visualizador exibirá tela inteira quando fizer o acesso. - </text_editor> - <text name="WindowSizeLabel"> - Tamanho da Janela: - </text> - <combo_box name="windowsize combo"> - <combo_box.item name="640x480" label="640x480" /> - <combo_box.item name="800x600" label="800x600" /> - <combo_box.item name="720x480" label="720x480 (NTSC)" /> - <combo_box.item name="768x576" label="768x576 (PAL)" /> - <combo_box.item name="1024x768" label="1024x768" /> - </combo_box> - <text name="DisplayResLabel"> - Resolução de Display: - </text> - <text name="AspectRatioLabel1" tool_tip="largura / altura"> - Relação de Aspecto: - </text> - <combo_box name="aspect_ratio" tool_tip="largura / altura"> - <combo_box.item name="4:3(StandardCRT)" label="4:3 (CRT Padrão)" /> - <combo_box.item name="5:4(1280x1024LCD)" label="5:4 (1280x1024 LCD)" /> - <combo_box.item name="8:5(Widescreen)" label="8:5 (tela ampla)" /> - <combo_box.item name="16:9(Widescreen)" label="16:9 (tela ampla)" /> - </combo_box> - <check_box label="Auto-detectar a relação" name="aspect_auto_detect"/> - <text name="HigherText"> - Qualidade e - </text> - <text name="QualityText"> - Performance: + <text name="QualitySpeed"> + Qualidade e velocidade: </text> <text name="FasterText"> Mais rápido </text> + <text name="BetterText"> + Melhor + </text> <text name="ShadersPrefText"> Baixo </text> @@ -50,96 +22,86 @@ rápido <text name="ShadersPrefText4"> Ultra </text> - <text name="HigherText2"> - Mais alto - </text> - <text name="QualityText2"> - Qualidade - </text> - <check_box label="Personalizar" left="395" name="CustomSettings"/> - <panel name="CustomGraphics Panel"> - <text name="ShadersText"> - Sombreadores: - </text> - <check_box label="Bump de Mapeamento e Brilho" name="BumpShiny"/> - <check_box label="Sombreadores básicos" name="BasicShaders" tool_tip="Desabilitar esta opção poderá impedir que alguns drivers de placa de vÃdeo a travem."/> - <check_box label="Sombreadores Atmosféricos" name="WindLightUseAtmosShaders"/> - <check_box label="Reflexos de Ãgua" name="Reflections"/> - <text name="ReflectionDetailText"> - Detalhes de Reflexão: - </text> - <radio_group name="ReflectionDetailRadio"> - <radio_item name="0" label="Terreno e Ãrvores" /> - <radio_item name="1" label="Todos os objetos estáticos" /> - <radio_item name="2" label="Todos os avatares e Objetos" /> - <radio_item name="3" label="Tudo" /> - </radio_group> - <text name="AvatarRenderingText"> - Renderização de Avatar: - </text> - <check_box label="Atributos do Avatar" name="AvatarImpostors"/> - <check_box label="Melhoria de Hardware" name="AvatarVertexProgram"/> - <check_box label="Vestimenta do Avatar" name="AvatarCloth"/> - <text name="DrawDistanceMeterText1"> - m - </text> - <text name="DrawDistanceMeterText2"> - m - </text> - <slider label="Distancia de desenho:" label_width="150" name="DrawDistance" width="255"/> - <slider label="Contador máx. de partÃculas:" label_width="150" name="MaxParticleCount" width="262"/> - <slider label="Qualidade de Pós-processamento:" label_width="178" name="RenderPostProcess" width="223"/> - <text name="MeshDetailText"> - Detalhes de Malha: - </text> - <slider label=" Objetos:" name="ObjectMeshDetail"/> - <slider label=" Primitivas Flexiveis:" name="FlexibleMeshDetail"/> - <slider label=" Ãrvores:" name="TreeMeshDetail"/> - <slider label=" Avatares:" name="AvatarMeshDetail"/> - <slider label=" Terreno:" name="TerrainMeshDetail"/> - <slider label=" Céu:" name="SkyMeshDetail"/> - <text name="PostProcessText"> - Baixo - </text> - <text name="ObjectMeshDetailText"> - Baixo - </text> - <text name="FlexibleMeshDetailText"> - Baixo - </text> - <text name="TreeMeshDetailText"> - Baixo - </text> - <text name="AvatarMeshDetailText"> - Baixo - </text> - <text name="TerrainMeshDetailText"> - Baixo - </text> - <text name="SkyMeshDetailText"> - Baixo - </text> - <text name="LightingDetailText"> - Detalhes de Iluminação: - </text> - <radio_group name="LightingDetailRadio"> - <radio_item name="SunMoon" label="Sol e Lua apenas" /> - <radio_item name="LocalLights" label="Luzes locais nas proximidades" /> - </radio_group> - <text name="TerrainDetailText"> - Detalhe do Terreno: - </text> - <radio_group left_delta="45" name="TerrainDetailRadio" width="276"> - <radio_item name="0" label="Baixo" /> - <radio_item name="2" label="Alto" /> - </radio_group> + <panel label="CustomGraphics" name="CustomGraphics Panel"> + <text name="ShadersText"> + Sombreadores: + </text> + <check_box initial_value="true" label="Bump de Mapeamento e Brilho" name="BumpShiny"/> + <check_box initial_value="true" label="Sombreadores básicos" name="BasicShaders" tool_tip="Desabilitar esta opção poderá impedir que alguns drivers de placa de vÃdeo a travem."/> + <check_box initial_value="true" label="Sombreadores Atmosféricos" name="WindLightUseAtmosShaders"/> + <check_box initial_value="true" label="Reflexos de Ãgua" name="Reflections"/> + <text name="ReflectionDetailText"> + Detalhes de Reflexão: + </text> + <radio_group name="ReflectionDetailRadio"> + <radio_item label="Terreno e árvores" name="0"/> + <radio_item label="Todos os objetos estáticos" name="1"/> + <radio_item label="Todos os avatares e Objetos" name="2"/> + <radio_item label="Tudo" name="3"/> + </radio_group> + <text name="AvatarRenderingText"> + Renderização de Avatar: + </text> + <check_box initial_value="true" label="Atributos do Avatar" name="AvatarImpostors"/> + <check_box initial_value="true" label="Melhoria de Hardware" name="AvatarVertexProgram"/> + <check_box initial_value="true" label="Vestimenta do Avatar" name="AvatarCloth"/> + <slider label="Distancia de desenho:" name="DrawDistance"/> + <text name="DrawDistanceMeterText2"> + m + </text> + <slider label="Contador máx. de partÃculas:" name="MaxParticleCount"/> + <slider label="Distância máx. desenho avatar:" name="MaxAvatarDrawDistance"/> + <text name="DrawDistanceMeterText3"> + m + </text> + <slider label="Qualidade de Pós-processamento:" name="RenderPostProcess"/> + <text name="MeshDetailText"> + Detalhes de Malha: + </text> + <slider label=" Objetos:" name="ObjectMeshDetail"/> + <slider label=" Primitivas Flexiveis:" name="FlexibleMeshDetail"/> + <slider label=" Ãrvores:" name="TreeMeshDetail"/> + <slider label=" Avatares:" name="AvatarMeshDetail"/> + <slider label=" Terreno:" name="TerrainMeshDetail"/> + <slider label=" Céu:" name="SkyMeshDetail"/> + <text name="PostProcessText"> + Baixo + </text> + <text name="ObjectMeshDetailText"> + Baixo + </text> + <text name="FlexibleMeshDetailText"> + Baixo + </text> + <text name="TreeMeshDetailText"> + Baixo + </text> + <text name="AvatarMeshDetailText"> + Baixo + </text> + <text name="TerrainMeshDetailText"> + Baixo + </text> + <text name="SkyMeshDetailText"> + Baixo + </text> + <text name="LightingDetailText"> + Detalhes de Iluminação: + </text> + <radio_group name="LightingDetailRadio"> + <radio_item label="Sol e Lua apenas" name="SunMoon" value="0"/> + <radio_item label="Luzes locais nas proximidades" name="LocalLights" value="1"/> + </radio_group> + <text name="TerrainDetailText"> + Detalhe do Terreno: + </text> + <radio_group left_delta="45" name="TerrainDetailRadio"> + <radio_item label="Baixo" name="0"/> + <radio_item label="Alto" name="2"/> + </radio_group> </panel> - <button label="Configurações Recomendadas" name="Defaults" width="190" left="110"/> - <button label="Opções de Hardware" label_selected="Opções de Hardware" name="GraphicsHardwareButton"/> - <panel.string name="resolution_format"> - [RES_X] x [RES_Y] - </panel.string> - <panel.string name="aspect_ratio_text"> - [NUM]:[DEN] - </panel.string> + <button label="Aplicar" label_selected="Aplicar" name="Apply"/> + <button label="Redefinir" left="110" name="Defaults"/> + <button label="Avançado" name="Advanced"/> + <button label="Hardware" label_selected="Hardware" name="GraphicsHardwareButton"/> </panel> diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/pt/panel_preferences_privacy.xml index 84c6c934c8..0cf2b7a4af 100644 --- a/indra/newview/skins/default/xui/pt/panel_preferences_privacy.xml +++ b/indra/newview/skins/default/xui/pt/panel_preferences_privacy.xml @@ -1,33 +1,26 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Comunicação" name="im"> - <text name="text_box"> - Minha situação online: + <panel.string name="log_in_to_change"> + autentique-se para mudar + </panel.string> + <button label="Limpar histórico" name="clear_cache" tool_tip="Apagar imagem do login, última localização, histórico de teletransporte, cache de texturas e web"/> + <text name="cache_size_label_l"> + (Locações, imagens, web, histórico de busca) </text> - <check_box label="Apenas meus Amigos e Grupos podem me ver online" name="online_visibility"/> - <text name="text_box2"> - Opções MI: + <check_box label="Apenas amigos e grupos sabem que estou online" name="online_visibility"/> + <check_box label="Apenas amigos e grupos podem me chamar ou enviar MI" name="voice_call_friends_only_check"/> + <check_box label="Desligar o microfone quando terminar chamadas" name="auto_disengage_mic_check"/> + <check_box label="Aceitar cookies" name="cookies_enabled"/> + <text name="Logs:"> + Logs: </text> - <string name="log_in_to_change"> - Logar para Alterar - </string> - <check_box label="Enviar MI para o e-mail ([EMAIL])" name="send_im_to_email"/> - <check_box label="Incluir MIs no console do chat" name="include_im_in_chat_console"/> - <check_box label="Mostrar data e hora na MI" name="show_timestamps_check"/> - <check_box label="Mostrar notificação de Amigo online" name="friends_online_notify_checkbox"/> - <text name="text_box3" width="134"> - Resposta no Modo -Ocupado: + <check_box label="Salvar logs de bate- papo das proximidades no meu computador" name="log_nearby_chat"/> + <check_box label="Salvar logs de MI no meu computador" name="log_instant_messages"/> + <check_box label="Adicionar timestamp" name="show_timestamps_check_im"/> + <text name="log_path_desc"> + Localização dos logs: </text> - <text name="text_box4"> - Opções de Registro: - </text> - <check_box label="Salvar um registro das MIs em meu computador" name="log_instant_messages"/> - <check_box label="Mostrar a hora nas MIs" name="log_instant_messages_timestamp"/> - <check_box label="Mostrar o final da última conversa em MI" name="log_show_history"/> - <check_box label="Salvar um registro da Conversa local em meu computador" name="log_chat"/> - <check_box label="Mostrar a hora no registro da Conversa local" name="log_chat_timestamp"/> - <check_box label="Mostrar MIs recebidas no registro de Conversa local" name="log_chat_IM"/> - <check_box label="Incluir data e hora" name="log_date_timestamp"/> - <button label="Mudar Local" label_selected="Alterar Caminho" name="log_path_button" width="120"/> <line_editor left="278" name="log_path_string" right="-20"/> + <button label="Navegar" label_selected="Navegar" name="log_path_button" width="120"/> + <button label="Lista dos bloqueados" name="block_list"/> </panel> diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_setup.xml b/indra/newview/skins/default/xui/pt/panel_preferences_setup.xml index 3c94090131..5266f646b7 100644 --- a/indra/newview/skins/default/xui/pt/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/pt/panel_preferences_setup.xml @@ -1,33 +1,49 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Câmera" name="Input panel"> - <text name=" Mouselook Options:"> - Mouselook: +<panel label="Configurações" name="Input panel"> + <button bottom_delta="-40" label="Outros dispositivos" name="joystick_setup_button" width="165"/> + <text name="Mouselook:"> + Visão subjetiva: </text> - <text name=" Mouse Sensitivity:"> - Sensibilidade do Mouse: + <text name=" Mouse Sensitivity"> + Sensibilidade do mouse </text> - <check_box label="Inverter o Mouse" name="invert_mouse"/> - <text name=" Auto Fly Options:"> - Vôo Automático: + <check_box label="Inverter" name="invert_mouse"/> + <text name="Network:"> + Rede: </text> - <check_box label="Voar/Aterrissar pressionando teclas para cima/baixo" name="automatic_fly"/> - <text name=" Camera Options:"> - Opções de Câmera: + <text name="Maximum bandwidth"> + Largura de banda máxima </text> - <text name="camera_fov_label" width="218"> - Angulo de Visão da Câmera: + <text name="text_box2"> + kbps </text> - <slider bottom_delta="-6" width="128" left="360" name="camera_fov" /> - <text name="Camera Follow Distance:" width="218"> - Distância de Acompanhamento da Camêra: + <check_box label="Personalizar porta" name="connection_port_enabled"/> + <spinner label="Número da porta:" name="connection_port"/> + <text name="cache_size_label_l"> + Tamanho do cache </text> - <slider bottom_delta="-6" width="128" left="360" name="camera_offset_scale" /> - <check_box label="Edição automática do movimento da câmera" name="edit_camera_movement" tool_tip="Usar posicionamento automático da câmera quando entrar e sair do modo de edição"/> - <check_box label="Movimento Automático da Câmera na edição de aparência" name="appearance_camera_movement" tool_tip="Usar posicionamento automático da câmera em modo de edição"/> - <text name="text2"> - Opções de Exibição -do Avatar: + <text name="text_box5"> + MB </text> - <check_box label="Mostra o avatar em primeira pessoa" name="first_person_avatar_visible"/> - <button bottom_delta="-40" label="Configuração do Joystick" name="joystick_setup_button" width="165"/> + <text name="Cache location"> + Localização do cache: + </text> + <button label="Procurar" label_selected="Procurar" name="set_cache"/> + <button label="Redefinir" label_selected="Redefinir" name="reset_cache"/> + <text name="Web:"> + Web: + </text> + <radio_group name="use_external_browser"> + <radio_item label="Usar meu navegador (IE, Firefox, Safari)" name="external" tool_tip="Use o navegador incluso para consultar a ajuda, abrir links da web, etc. Uso em tela inteira não recomendado." value="1"/> + <radio_item label="Usar navegador incluso" name="internal" tool_tip="Use este navegador para consultar a ajuda, abrir links da web, etc. As janelas abrem dentro do [APP_NAME]." value=""/> + </radio_group> + <check_box initial_value="true" label="Habilitar plugins" name="browser_plugins_enabled"/> + <check_box initial_value="true" label="Aceitar cookies" name="cookies_enabled"/> + <check_box initial_value="true" label="Habilitar Javascript" name="browser_javascript_enabled"/> + <check_box initial_value="false" label="Ativar web proxy" name="web_proxy_enabled"/> + <text name="Proxy location"> + Localização do proxy: + </text> + <line_editor name="web_proxy_editor" tool_tip="O nome ou endereço IP do proxy da sua preferência"/> + <spinner label="Porta:" name="web_proxy_port"/> </panel> diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_sound.xml b/indra/newview/skins/default/xui/pt/panel_preferences_sound.xml index 5574679cde..43c970841a 100644 --- a/indra/newview/skins/default/xui/pt/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/pt/panel_preferences_sound.xml @@ -1,39 +1,45 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Ãudio & VÃdeo" name="Preference Media panel"> - <slider label="Mestre" name="System Volume"/> +<panel label="Sons" name="Preference Media panel"> + <slider label="Volume principal" name="System Volume"/> + <check_box initial_value="true" label="Silenciar ao minimizar" name="mute_when_minimized"/> + <slider label="Botões" name="UI Volume"/> <slider label="Ambiente" name="Wind Volume"/> - <slider label="Sons" name="SFX Volume"/> + <slider label="Efeitos sonoros" name="SFX Volume"/> + <slider label="Streaming de música" name="Music Volume"/> + <check_box label="Ativado" name="music_enabled"/> <slider label="MÃdia" name="Media Volume"/> - <slider label="UI" name="UI Volume"/> - <slider label="Música" name="Music Volume"/> - <slider label="Voz" name="Voice Volume"/> - <text_editor name="voice_unavailable"> - Bate-papo de Voz nâo está disponÃvel - </text_editor> - <check_box label="Habilitar bate-papo de Voz" name="enable_voice_check"/> - <radio_group name="ear_location"> - <radio_item name="0" label="Ouvir o bate-papo de voz pela posição de câmera" /> - <radio_item name="1" label="Ouvir o bate-papo de voz pela posição do avatar" /> - </radio_group> - <button label="Configurações do dispositivo" name="device_settings_btn" width="180"/> - <text name="muting_text"> - Volume: - </text> - <text name="streaming_prefs_text"> - Preferências de -Streaming: + <check_box label="Ativado" name="enable_media"/> + <slider label="Bate-papo de voz" name="Voice Volume"/> + <check_box label="Ativado" name="enable_voice_check"/> + <check_box label="Autorizar auto-play de mÃdias" name="media_auto_play_btn" tool_tip="Marque esta opção para auto-executar mÃdias, se elas quiserem"/> + <check_box label="Tocar mÃdia anexada em outros avatares" name="media_show_on_others_btn" tool_tip="Desmarque esta opção para ocultar mÃdias anexadas em avatares por perto"/> + <text name="voice_chat_settings"> + Configuração de bate-papo de voz </text> - <text name="audio_prefs_text"> - Preferências de Ãudio: + <text name="Listen from"> + Ouvir a partir de: </text> - <panel label="Volume" name="Volume Panel"/> - <check_box label="Tocar música em streaming" name="streaming_music"/> - <check_box label="Tocar streaming de MÃdia" name="streaming_video"/> - <check_box label="Tocar mÃdia automaticamente" name="auto_streaming_video"/> - <check_box label="Silenciar Ãudio quando minimizar janela" name="mute_when_minimized"/> - <slider label="Efeito Doppler" name="Doppler Effect"/> - <slider label="Fator Distância" name="Distance Factor"/> - <slider label="Fator Rolloff" name="Rolloff Factor"/> - <spinner label="Mudar nÃvel de alerta de L$" name="L$ Change Threshold" label_width="165" width="229"/> - <spinner label="Mudar nÃvel de alerta de Saúde" name="Health Change Threshold" label_width="165" width="229"/> + <radio_group name="ear_location"> + <radio_item label="Posição de câmera" name="0"/> + <radio_item label="Posição do avatar" name="1"/> + </radio_group> + <button label="Controles de entrada/saÃda" name="device_settings_btn" width="180"/> + <panel label="Configuração dos dispositivo" name="device_settings_panel"> + <panel.string name="default_text"> + Padrão + </panel.string> + <text name="Input"> + Entrada + </text> + <text name="My volume label"> + Meu volume: + </text> + <slider_bar initial_value="1.0" name="mic_volume_slider" tool_tip="Mude o volume usando o controle deslizante"/> + <text name="wait_text"> + Aguarde + </text> + <text name="Output"> + SaÃda + </text> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/pt/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/pt/panel_prim_media_controls.xml new file mode 100644 index 0000000000..a1254b4da0 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_prim_media_controls.xml @@ -0,0 +1,79 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="MediaControls"> + <string name="min_width"> + 300 + </string> + <string name="min_height"> + 75 + </string> + <string name="zoom_medium_padding"> + 1.1 + </string> + <string name="top_world_view_avoid_zone"> + 50 + </string> + <layout_stack name="progress_indicator_area"> + <panel name="media_progress_indicator"> + <progress_bar name="media_progress_bar" tool_tip="Carregando mÃdia"/> + </panel> + </layout_stack> + <layout_stack name="media_controls"> + <layout_panel name="back"> + <button name="back_btn" tool_tip="Navegar para trás"/> + </layout_panel> + <layout_panel name="fwd"> + <button name="fwd_btn" tool_tip="Navegar para frente"/> + </layout_panel> + <layout_panel name="home"> + <button name="home_btn" tool_tip="Página web:"/> + </layout_panel> + <layout_panel name="media_stop"> + <button name="media_stop_btn" tool_tip="Parar mÃdia"/> + </layout_panel> + <layout_panel name="reload"> + <button name="reload_btn" tool_tip="Recarregar"/> + </layout_panel> + <layout_panel name="stop"> + <button name="stop_btn" tool_tip="Parar de carregar"/> + </layout_panel> + <layout_panel name="play"> + <button name="play_btn" tool_tip="Tocar mÃdia"/> + </layout_panel> + <layout_panel name="pause"> + <button name="pause_btn" tool_tip="Pausar mÃdia"/> + </layout_panel> + <layout_panel name="media_address"> + <line_editor name="media_address_url" tool_tip="URL da mÃdia"/> + <layout_stack name="media_address_url_icons"> + <layout_panel> + <icon name="media_whitelist_flag" tool_tip="Lista ativada"/> + </layout_panel> + <layout_panel> + <icon name="media_secure_lock_flag" tool_tip="Navegação segura"/> + </layout_panel> + </layout_stack> + </layout_panel> + <layout_panel name="media_play_position"> + <slider_bar initial_value="0.5" name="media_play_slider" tool_tip="Andamento do vÃdeo"/> + </layout_panel> + <layout_panel name="skip_back"> + <button name="skip_back_btn" tool_tip="Passo para trás"/> + </layout_panel> + <layout_panel name="skip_forward"> + <button name="skip_forward_btn" tool_tip="Passo para frente"/> + </layout_panel> + <layout_panel name="media_volume"> + <button name="media_mute_button" tool_tip="Silenciar esta mÃdia"/> + <slider name="volume_slider" tool_tip="Volume"/> + </layout_panel> + <layout_panel name="zoom_frame"> + <button name="zoom_frame_btn" tool_tip="Enfocar mÃdia"/> + </layout_panel> + <layout_panel name="close"> + <button name="close_btn" tool_tip="Menos zoom"/> + </layout_panel> + <layout_panel name="new_window"> + <button name="new_window_btn" tool_tip="Abrir URL em navegador"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_profile.xml b/indra/newview/skins/default/xui/pt/panel_profile.xml index ff53aa6a41..805e3aaebd 100644 --- a/indra/newview/skins/default/xui/pt/panel_profile.xml +++ b/indra/newview/skins/default/xui/pt/panel_profile.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="panel_profile"> +<panel label="Perfil" name="panel_profile"> <string name="CaptionTextAcctInfo"> [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION] @@ -11,4 +11,42 @@ http://www.secondlife.com/account/partners.php?lang=pt </string> <string name="my_account_link_url" value="http://secondlife.com/my/account/index.php?lang=pt-BR"/> + <string name="no_partner_text" value="Ninguém"/> + <string name="no_group_text" value="Nenhum"/> + <string name="RegisterDateFormat"> + [REG_DATE] ([AGE]) + </string> + <layout_stack name="layout"> + <layout_panel name="profile_stack"> + <scroll_container name="profile_scroll"> + <panel name="profile_scroll_panel"> + <panel name="second_life_image_panel"> + <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/> + </panel> + <panel name="first_life_image_panel"> + <text name="title_rw_descr_text" value="Mundo real:"/> + </panel> + <text name="title_member_text" value="Residente desde:"/> + <text name="title_acc_status_text" value="Conta:"/> + <text name="title_partner_text" value="Parceiro(a):"/> + <panel name="partner_data_panel"> + <name_box initial_value="(pesquisando)" name="partner_text"/> + </panel> + <text name="title_groups_text" value="Grupos:"/> + </panel> + </scroll_container> + </layout_panel> + <layout_panel name="profile_buttons_panel"> + <button label="Adicionar amigo" name="add_friend" tool_tip="Oferecer amizade ao residente"/> + <button label="MI" name="im" tool_tip="Abrir sessão de mensagem instantânea"/> + <button label="Ligar" name="call" tool_tip="Ligar para este residente"/> + <button label="Mapa" name="show_on_map_btn" tool_tip="Exibir o residente no mapa"/> + <button label="Teletransportar" name="teleport" tool_tip="Oferecer teletransporte"/> + <button label="â–¼" name="overflow_btn" tool_tip="Pagar ou compartilhar inventário com o residente"/> + </layout_panel> + <layout_panel name="profile_me_buttons_panel"> + <button label="Editar perfil" name="edit_profile_btn" tool_tip="Editar dados pessoais"/> + <button label="Editar aparência" name="edit_appearance_btn" tool_tip="Criar/editar aparência: fÃsico, roupas, etc."/> + </layout_panel> + </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/pt/panel_profile_view.xml b/indra/newview/skins/default/xui/pt/panel_profile_view.xml new file mode 100644 index 0000000000..62a16c6fbe --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_profile_view.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_target_profile"> + <string name="status_online"> + Conectado + </string> + <string name="status_offline"> + Desconectado + </string> + <text_editor name="user_name" value="Carregando..."/> + <text name="status" value="Conectado"/> + <tab_container name="tabs"> + <panel label="PERFIL" name="panel_profile"/> + <panel label="DESTAQUES" name="panel_picks"/> + <panel label="ANOTAÇÕES E PRIVACIDADE" name="panel_notes"/> + </tab_container> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_region_covenant.xml b/indra/newview/skins/default/xui/pt/panel_region_covenant.xml index 4977a1fac9..65ac89baf8 100644 --- a/indra/newview/skins/default/xui/pt/panel_region_covenant.xml +++ b/indra/newview/skins/default/xui/pt/panel_region_covenant.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Corretagem" name="Covenant"> <text name="estate_section_lbl"> - Propriedade: + Propriedade </text> <text bottom_delta="-19" name="estate_name_lbl"> Nome: @@ -22,7 +22,7 @@ Última modificação: Quarta, 31 de dezembro de 1969 à s 16:00:00 horas </text> <button label="?" name="covenant_help"/> - <text_editor name="covenant_editor" bottom="-247" height="162" > + <text_editor bottom="-247" height="162" name="covenant_editor"> Não há nenhuma regra fornecida para esta Propriedade. </text_editor> <button label="Resetar" name="reset_covenant"/> @@ -30,12 +30,11 @@ As mudanças das regras serão mostradas em todos os lotes da propriedade. </text> - <text bottom_delta="-36" name="covenant_instructions"> - Arraste e solte um notecard, para mudar as Regras desta - Propriedade. + <text bottom_delta="-36" name="covenant_instructions"> + Arrastar e soltar uma anotação para alterar o contrato em vigor nesta propriedade. </text> <text bottom_delta="-36" name="region_section_lbl"> - Região: + Região </text> <text name="region_name_lbl"> Nome: diff --git a/indra/newview/skins/default/xui/pt/panel_region_debug.xml b/indra/newview/skins/default/xui/pt/panel_region_debug.xml index 724df20155..f2cc9f644d 100644 --- a/indra/newview/skins/default/xui/pt/panel_region_debug.xml +++ b/indra/newview/skins/default/xui/pt/panel_region_debug.xml @@ -6,15 +6,15 @@ <text name="region_text"> desconhecido </text> - <check_box label="Desabilitar Scripts" name="disable_scripts_check" tool_tip="Desabilitar todos os scripts nesta região"/> + <check_box label="Desativar scripts" name="disable_scripts_check" tool_tip="Desativar todos os scripts nesta região"/> <button label="?" name="disable_scripts_help"/> - <check_box label="Desabilitar colisões" name="disable_collisions_check" tool_tip="Desabilitar colisões de não-avatares nessa região"/> + <check_box label="Desativar colisões" name="disable_collisions_check" tool_tip="Desabilitar colisões de não-avatares nessa região"/> <button label="?" name="disable_collisions_help"/> - <check_box label="Desabilitar fÃsica" name="disable_physics_check" tool_tip="Desabilitar toda a fÃsÃca nesta região"/> + <check_box label="Desativar fÃsica" name="disable_physics_check" tool_tip="Desativar toda a fÃsÃca nesta região"/> <button label="?" name="disable_physics_help"/> <button label="Aplicar" name="apply_btn"/> <text name="objret_text_lbl" width="130"> - Retornar objeto + Devolver objeto </text> <text name="resident_text_lbl"> Residente: @@ -22,19 +22,19 @@ <line_editor name="target_avatar_name"> (nenhum) </line_editor> - <button label="Escolher..." name="choose_avatar_btn"/> + <button label="Selecionar" name="choose_avatar_btn"/> <text name="options_text_lbl"> Opções: </text> - <check_box label="Retornar apenas aqueles objetos que contenham scripts" name="return_scripts" tool_tip="Retornar apenas objetos que contenham scripts."/> - <check_box label="Retornar apenas aqueles objetos na terra de alguém" name="return_other_land" tool_tip="Retornar apenas objetos que estejam na terra pertencente a alguém"/> - <check_box label="Retornar objetos em cada região desta propriedade" name="return_estate_wide" tool_tip="Retornar objetos em todas as regiões que constituem esta propriedade"/> - <button label="Retornar" name="return_btn"/> - <button width="280" label="Pegar os principais colidentes..." name="top_colliders_btn" tool_tip="Lista dos objetos que experimentam as mais potenciais colisões"/> - <button label="?" name="top_colliders_help" left="297"/> - <button width="280" label="Pegar Principais Scripts..." name="top_scripts_btn" tool_tip="Lista de objetos gastando mais tempo rodando scripts"/> - <button label="?" name="top_scripts_help" left="297"/> - <button label="Reiniciar a Região" name="restart_btn" tool_tip="Dar 2 minutos de contagem regressiva e reiniciar a região"/> + <check_box label="Com scripts" name="return_scripts" tool_tip="Só devolver objetos com scripts"/> + <check_box label="No terreno de outra pessoa" name="return_other_land" tool_tip="Devolver apenas objetos que estejam em terrenos de outra pessoa"/> + <check_box label="Em todas as regiões desta propriedade" name="return_estate_wide" tool_tip="Devolver objetos em todas as regiões que constituem esta propriedade"/> + <button label="Devolver" name="return_btn"/> + <button label="Principais colidentes..." name="top_colliders_btn" tool_tip="Lista dos objetos com maior potencial de colisão" width="280"/> + <button label="?" left="297" name="top_colliders_help"/> + <button label="Principais scripts..." name="top_scripts_btn" tool_tip="Lista de objetos que mais passam tempo executando scripts" width="280"/> + <button label="?" left="297" name="top_scripts_help"/> + <button label="Reiniciar a região" name="restart_btn" tool_tip="Após 2 minutos de contagem regressiva, reiniciar a região"/> <button label="?" name="restart_help"/> - <button label="Atrasar o Reinicio" name="cancel_restart_btn" tool_tip="Atrasar o reinicio da região por uma hora"/> + <button label="Adiar reinÃcio" name="cancel_restart_btn" tool_tip="Adiar o reinÃcio da região por uma hora"/> </panel> diff --git a/indra/newview/skins/default/xui/pt/panel_region_estate.xml b/indra/newview/skins/default/xui/pt/panel_region_estate.xml index f43402be15..e5d394865c 100644 --- a/indra/newview/skins/default/xui/pt/panel_region_estate.xml +++ b/indra/newview/skins/default/xui/pt/panel_region_estate.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Propriedade" name="Estate"> <text name="estate_help_text"> - Mudanças nas definições nesta guia irão afetar -todas as regiões desta propriedade. + Mudar as opções desta guia afeta todas as regiões desta propriedade. </text> <text name="estate_text"> Propriedade: @@ -11,7 +10,7 @@ todas as regiões desta propriedade. (desconhecido) </text> <text name="owner_text"> - Proprietário: + Proprietário do imóvel: </text> <text name="estate_owner"> (desconhecido) @@ -24,10 +23,10 @@ todas as regiões desta propriedade. <check_box label="Permitir acesso público" name="externally_visible_check"/> <button label="?" name="externally_visible_help"/> <text name="Only Allow"> - Acesso restrito a Residentes... + Restringir acesso a contas confirmardas por: </text> - <check_box label="com info. de pagamento em arquivo" name="limit_payment" tool_tip="Banir residentes não identificados."/> - <check_box label="Adultos com idade verificada" name="limit_age_verified" tool_tip="Banir residentes que não tenham confirmado a sua idade. Ver support.secondlife.com para mais informações."/> + <check_box label="Dados de pagamento fornecidos" name="limit_payment" tool_tip="Banir residentes sem identificação."/> + <check_box label="Verificação de idade" name="limit_age_verified" tool_tip="Banir residentes que não comprovaram a idade. Consulte o [SUPPORT_SITE] para saber mais."/> <check_box label="Permitir conversa de voz" name="voice_chat_check"/> <button label="?" name="voice_chat_help"/> <check_box label="Permitir Tele-transporte direto" name="allow_direct_teleport"/> @@ -40,7 +39,7 @@ todas as regiões desta propriedade. </string> <button label="?" name="abuse_email_address_help"/> <button label="Aplicar" name="apply_btn"/> - <button label="Chutar usuário da propriedade..." name="kick_user_from_estate_btn"/> + <button label="Expulsar da propriedade..." name="kick_user_from_estate_btn"/> <button label="Enviar mensagem à Propriedade" name="message_estate_btn"/> <text name="estate_manager_label"> Gerentes da propriedade: diff --git a/indra/newview/skins/default/xui/pt/panel_region_general.xml b/indra/newview/skins/default/xui/pt/panel_region_general.xml index 1a06d91aa8..d1a5eaa11e 100644 --- a/indra/newview/skins/default/xui/pt/panel_region_general.xml +++ b/indra/newview/skins/default/xui/pt/panel_region_general.xml @@ -19,35 +19,25 @@ desconhecido </text> <check_box label="Bloquear Terraform" name="block_terraform_check"/> - <button label="?" name="terraform_help"/> <check_box label="Bloquear Vôo" name="block_fly_check"/> - <button label="?" name="fly_help"/> <check_box label="Permitir Dano" name="allow_damage_check"/> - <button label="?" name="damage_help"/> <check_box label="Restringir Empurrar" name="restrict_pushobject"/> - <button label="?" name="restrict_pushobject_help"/> <check_box label="Permitir Revenda de Terra" name="allow_land_resell_check"/> - <button label="?" name="land_resell_help"/> <check_box label="Permitir Unir/Dividir Terra" name="allow_parcel_changes_check"/> - <button label="?" name="parcel_changes_help"/> <check_box label="Bloquear Mostrar Terra na Busca" name="block_parcel_search_check" tool_tip="Permitir que as pessoas vejam esta região e seus lotes nos resultados de busca"/> - <button label="?" name="parcel_search_help"/> <spinner label="Limit do Agente" name="agent_limit_spin"/> - <button label="?" name="agent_limit_help"/> <spinner label="Objeto Bonus" name="object_bonus_spin"/> - <button label="?" name="object_bonus_help"/> <text label="Maturidade" name="access_text"> Classificação: </text> - <combo_box label="Mature" name="access_combo"> - <combo_box.item label="Adult" name="Adult"/> - <combo_box.item label="Mature" name="Mature"/> - <combo_box.item label="PG" name="PG"/> - </combo_box> - <button label="?" name="access_help"/> + <icons_combo_box label="Mature" name="access_combo"> + <icons_combo_box.item label="Adult" name="Adult" value="42"/> + <icons_combo_box.item label="Mature" name="Mature" value="21"/> + <icons_combo_box.item label="PG" name="PG" value="13"/> + </icons_combo_box> <button label="Aplicar" name="apply_btn"/> - <button label="Teletransportar um usuário para Casa..." name="kick_btn"/> - <button label="Teletransportar Todos os Usuários..." name="kick_all_btn"/> + <button label="Teletransportar um residente para inÃcio..." name="kick_btn"/> + <button label="Teletransportar todos para inÃcio..." name="kick_all_btn"/> <button label="Enviar Mensagem para a Região..." name="im_btn"/> <button label="Gerenciar Telehub..." name="manage_telehub_btn"/> </panel> diff --git a/indra/newview/skins/default/xui/pt/panel_region_general_layout.xml b/indra/newview/skins/default/xui/pt/panel_region_general_layout.xml new file mode 100644 index 0000000000..534b2826af --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_region_general_layout.xml @@ -0,0 +1,43 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Região" name="General"> + <text name="region_text_lbl"> + Região: + </text> + <text name="region_text"> + (Desconhecido) + </text> + <text name="version_channel_text_lbl"> + Versão: + </text> + <text name="version_channel_text"> + (Desconhecido) + </text> + <text name="region_type_lbl"> + Tipo: + </text> + <text name="region_type"> + (Desconhecido) + </text> + <check_box label="Bloquear terraplanagens" name="block_terraform_check"/> + <check_box label="Bloquear voos" name="block_fly_check"/> + <check_box label="Permitir danos" name="allow_damage_check"/> + <check_box label="Limitar empurrões" name="restrict_pushobject"/> + <check_box label="Permitir revenda de terrenos" name="allow_land_resell_check"/> + <check_box label="Permitir união e divisão de terrenos" name="allow_parcel_changes_check"/> + <check_box label="Não mostrar nos resultados de pesquisa" name="block_parcel_search_check" tool_tip="Mostrar esta região e lotes nos resultados de pesquisa"/> + <spinner label="Limite do agente" name="agent_limit_spin"/> + <spinner label="Bônus do objeto" name="object_bonus_spin"/> + <text label="NÃvel de maturidade" name="access_text"> + Classificação: + </text> + <combo_box label="Moderado" name="access_combo"> + <combo_box.item label="Público adulto" name="Adult"/> + <combo_box.item label="Moderado" name="Mature"/> + <combo_box.item label="Geral" name="PG"/> + </combo_box> + <button label="Aplicar" name="apply_btn"/> + <button label="Teletransportar um residente para inÃcio..." name="kick_btn"/> + <button label="Teletransportar todos para inÃcio..." name="kick_all_btn"/> + <button label="Enviar mensagem para região..." name="im_btn"/> + <button label="Gerenciar telehub..." name="manage_telehub_btn"/> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_region_texture.xml b/indra/newview/skins/default/xui/pt/panel_region_texture.xml index 4787b59a8d..35928ccc67 100644 --- a/indra/newview/skins/default/xui/pt/panel_region_texture.xml +++ b/indra/newview/skins/default/xui/pt/panel_region_texture.xml @@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Texturas de Chão" name="Textures"> <text name="region_text_lbl"> Região: @@ -25,33 +25,33 @@ Escalas de Elevação de Terreno </text> <text name="height_text_lbl6"> - Sudeste + Noroeste </text> <text name="height_text_lbl7"> - Noroeste + Nordeste </text> <text name="height_text_lbl8"> Sudoeste </text> <text name="height_text_lbl9"> - Noroeste + Sudeste </text> - <spinner label="Baixo" name="height_start_spin_0" /> - <spinner label="Baixo" name="height_start_spin_1" /> - <spinner label="Baixo" name="height_start_spin_2" /> - <spinner label="Baixo" name="height_start_spin_3" /> - <spinner label="Alto" name="height_range_spin_0" /> - <spinner label="Alto" name="height_range_spin_1" /> - <spinner label="Alto" name="height_range_spin_2" /> - <spinner label="Alto" name="height_range_spin_3" /> + <spinner label="Baixo" name="height_start_spin_0"/> + <spinner label="Baixo" name="height_start_spin_1"/> + <spinner label="Baixo" name="height_start_spin_2"/> + <spinner label="Baixo" name="height_start_spin_3"/> + <spinner label="Alto" name="height_range_spin_0"/> + <spinner label="Alto" name="height_range_spin_1"/> + <spinner label="Alto" name="height_range_spin_2"/> + <spinner label="Alto" name="height_range_spin_3"/> <text name="height_text_lbl10"> - Estes valores respresentam o tipo de escala para as texturas acima. + Os valores representam o intervalo de mistura das texturas acima. </text> <text name="height_text_lbl11"> - Medido em metros, o valor Baixo é a altura máxima da Textura #1, + Em metros, o valor BAIXO é a altura MÃXIMA da Textura 1, e HIGH é a altura MÃNIMA da Textura 4. </text> <text name="height_text_lbl12"> e o valor Alto é a altura MÃnima da Textura #4. </text> - <button label="Aplicar" name="apply_btn" /> + <button label="Aplicar" name="apply_btn"/> </panel> diff --git a/indra/newview/skins/default/xui/pt/panel_script_ed.xml b/indra/newview/skins/default/xui/pt/panel_script_ed.xml new file mode 100644 index 0000000000..6f022945c2 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_script_ed.xml @@ -0,0 +1,43 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="script panel"> + <panel.string name="loading"> + Carregando... + </panel.string> + <panel.string name="can_not_view"> + Você não pode ver ou editar o script, uma vez que está definido como "não" copiar ". Você precisa de permissões para ver ou editar um script dentro de um objeto. + </panel.string> + <panel.string name="public_objects_can_not_run"> + Objetos públicos não podem executar scripts + </panel.string> + <panel.string name="script_running"> + Executando + </panel.string> + <panel.string name="Title"> + Script: [NOME] + </panel.string> + <text_editor name="Script Editor"> + Carregando... + </text_editor> + <button label="Salvar" label_selected="Salvar" name="Save_btn"/> + <combo_box label="Inserir..." name="Insert..."/> + <menu_bar name="script_menu"> + <menu label="Arquivo" name="File"> + <menu_item_call label="Salvar" name="Save"/> + <menu_item_call label="Reverter todas as alterações" name="Revert All Changes"/> + </menu> + <menu label="Editar" name="Edit"> + <menu_item_call label="desfazer" name="Undo"/> + <menu_item_call label="Refazer" name="Redo"/> + <menu_item_call label="Cortar" name="Cut"/> + <menu_item_call label="Copiar" name="Copy"/> + <menu_item_call label="Colar" name="Paste"/> + <menu_item_call label="Selecionar tudo" name="Select All"/> + <menu_item_call label="Desmarcar" name="Deselect"/> + <menu_item_call label="Buscar / Substituir..." name="Search / Replace..."/> + </menu> + <menu label="Ajuda" name="Help"> + <menu_item_call label="ajuda..." name="Help..."/> + <menu_item_call label="ajuda palavra- chave..." name="Keyword Help..."/> + </menu> + </menu_bar> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_script_limits_my_avatar.xml b/indra/newview/skins/default/xui/pt/panel_script_limits_my_avatar.xml new file mode 100644 index 0000000000..daf87c4dc6 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_script_limits_my_avatar.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="MEU AVATAR" name="script_limits_my_avatar_panel"> + <text name="script_memory"> + Uso de scripts + </text> + <text name="loading_text"> + Carregando... + </text> + <scroll_list name="scripts_list"> + <scroll_list.columns label="Tamanho (kb)" name="size"/> + <scroll_list.columns label="URLs" name="urls"/> + <scroll_list.columns label="Nome do objeto" name="name"/> + <scroll_list.columns label="Localização" name="location"/> + </scroll_list> + <button label="Atualizar lista" name="refresh_list_btn"/> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_script_limits_region_memory.xml b/indra/newview/skins/default/xui/pt/panel_script_limits_region_memory.xml new file mode 100644 index 0000000000..94274b2cfe --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_script_limits_region_memory.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="MEMÓRIA DA REGIÃO" name="script_limits_region_memory_panel"> + <text name="script_memory"> + Memória de scripts no lote + </text> + <text name="loading_text"> + Carregando... + </text> + <scroll_list name="scripts_list"> + <scroll_list.columns label="Tamanho (kb)" name="size"/> + <scroll_list.columns label="URLs" name="urls"/> + <scroll_list.columns label="Nome do objeto" name="name"/> + <scroll_list.columns label="Dono do objeto" name="owner"/> + <scroll_list.columns label="Lote" name="parcel"/> + <scroll_list.columns label="Localização" name="location"/> + </scroll_list> + <button label="Atualizar lista" name="refresh_list_btn"/> + <button label="Destaque" name="highlight_btn"/> + <button label="Devolver" name="return_btn"/> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_side_tray.xml b/indra/newview/skins/default/xui/pt/panel_side_tray.xml new file mode 100644 index 0000000000..1a424fb7f1 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_side_tray.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- Side tray cannot show background because it is always + partially on screen to hold tab buttons. --> +<side_tray name="sidebar"> + <sidetray_tab description="Exibir ou não barra lateral" name="sidebar_openclose" tab_title="Exibir ou não barra lateral"/> + <sidetray_tab description="InÃcio" name="sidebar_home" tab_title="InÃcio"> + <panel label="InÃcio" name="panel_home"/> + </sidetray_tab> + <sidetray_tab description="Edite seu perfil público e destaques." name="sidebar_me" tab_title="Meu perfil"> + <panel_container name="panel_container"> + <panel label="Eu" name="panel_me"/> + </panel_container> + </sidetray_tab> + <sidetray_tab description="Encontre seus amigos, contatos e pessoas nas proximidades." name="sidebar_people" tab_title="Pessoas"> + <panel_container name="panel_container"> + <panel label="Perfil do grupo" name="panel_group_info_sidetray"/> + <panel label="Residentes& Objetos bloqueados" name="panel_block_list_sidetray"/> + </panel_container> + </sidetray_tab> + <sidetray_tab description="Encontre lugares para ir e lugares que você ja visitou." label="Lugares" name="sidebar_places" tab_title="Lugares"> + <panel label="Lugares" name="panel_places"/> + </sidetray_tab> + <sidetray_tab description="Abra seu inventário." name="sidebar_inventory" tab_title="Meu inventário"> + <panel label="Editar inventário" name="sidepanel_inventory"/> + </sidetray_tab> + <sidetray_tab description="Muda sua aparência e seu visual atual." name="sidebar_appearance" tab_title="Minha aparência"> + <panel label="Editar aparência" name="sidepanel_appearance"/> + </sidetray_tab> +</side_tray> diff --git a/indra/newview/skins/default/xui/pt/panel_side_tray_tab_caption.xml b/indra/newview/skins/default/xui/pt/panel_side_tray_tab_caption.xml new file mode 100644 index 0000000000..7c06119901 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_side_tray_tab_caption.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="sidetray_tab_panel"> + <text name="sidetray_tab_title" value="Bandeja lateral"/> + <button name="show_help" tool_tip="Mostrar ajuda"/> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_stand_stop_flying.xml b/indra/newview/skins/default/xui/pt/panel_stand_stop_flying.xml new file mode 100644 index 0000000000..05869cf67a --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_stand_stop_flying.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- Width and height of this panel should be synchronized with "panel_modes" in the floater_moveview.xml--> +<panel name="panel_stand_stop_flying"> + <button label="Levantar-se" name="stand_btn" tool_tip="Clique aqui para ficar de pé."/> + <button label="Parar de voar" name="stop_fly_btn" tool_tip="Parar de voar"/> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_status_bar.xml b/indra/newview/skins/default/xui/pt/panel_status_bar.xml index 7f3d2b34a6..fbbcf0d1be 100644 --- a/indra/newview/skins/default/xui/pt/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/pt/panel_status_bar.xml @@ -1,38 +1,33 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="status"> - <text name="ParcelNameText" tool_tip="Nome do pedaço de terra em que você está. Clique Sobre a Terra para informações."> - Nome do pedaço de terra vai aqui - </text> - <text name="BalanceText" tool_tip="Saldo"> - Carregando... - </text> - <button label="" label_selected="" name="buycurrency" tool_tip="Comprar dinheiro"/> - <text name="TimeText" tool_tip="Hora atual (do PacÃfico)"> - 12:00 AM - </text> - <string name="StatBarDaysOfWeek"> + <panel.string name="StatBarDaysOfWeek"> Domingo:Segunda-feira:Terça-feira:Quarta-feira:Quinta-feira:Sexta-feira:Sábado - </string> - <string name="StatBarMonthsOfYear"> + </panel.string> + <panel.string name="StatBarMonthsOfYear"> Janeiro:Fevereiro:Março:Abril:Maio:Junho:Julho:Agosto:Setembro:Outubro:Novembro:Dezembro - </string> - <button label="" label_selected="" name="scriptout" tool_tip="Erros e avisos do Script"/> - <button label="" label_selected="" name="health" tool_tip="Saúde"/> - <text name="HealthText" tool_tip="Saúde"> - 100% - </text> - <button label="" label_selected="" name="no_fly" tool_tip="Não é permitido Voar"/> - <button label="" label_selected="" name="no_build" tool_tip="Construir/Rezzar não permitido"/> - <button label="" label_selected="" name="no_scripts" tool_tip="Scripts não permitidos"/> - <button label="" label_selected="" name="restrictpush" tool_tip="Não Empurrar"/> - <button label="" label_selected="" name="status_no_voice" tool_tip="Voz não disponÃvel aqui"/> - <button label="" label_selected="" name="buyland" tool_tip="Comprar este lote"/> - <line_editor label="Buscar" name="search_editor" tool_tip="Buscar no [SECOND_LIFE]"/> - <button label="" label_selected="" name="search_btn" tool_tip="Buscar no [SECOND_LIFE]"/> - <string name="packet_loss_tooltip"> + </panel.string> + <panel.string name="packet_loss_tooltip"> Perda de pacote - </string> - <string name="bandwidth_tooltip"> + </panel.string> + <panel.string name="bandwidth_tooltip"> Banda - </string> + </panel.string> + <panel.string name="time"> + [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt] + </panel.string> + <panel.string name="timeTooltip"> + [weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt] + </panel.string> + <panel.string name="buycurrencylabel"> + L$ [AMT] + </panel.string> + <panel name="balance_bg"> + <text name="balance" tool_tip="Meu saldo" value="L$20"/> + <button label="Comprar L$" name="buyL" tool_tip="Comprar mais L$"/> + </panel> + <text name="TimeText" tool_tip="Hora atual (PacÃfico)"> + 24:00 AM PST + </text> + <button name="media_toggle_btn" tool_tip="Tocar/Pausar todas mÃdias (música, vÃdeo, páginas web)"/> + <button name="volume_btn" tool_tip="Volume geral"/> </panel> diff --git a/indra/newview/skins/default/xui/pt/panel_teleport_history.xml b/indra/newview/skins/default/xui/pt/panel_teleport_history.xml new file mode 100644 index 0000000000..ba83fee7ba --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_teleport_history.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="Teleport History"> + <accordion name="history_accordion"> + <accordion_tab name="today" title="Hoje"/> + <accordion_tab name="yesterday" title="Ontem"/> + <accordion_tab name="2_days_ago" title="2 dias atrás"/> + 5 + <accordion_tab name="3_days_ago" title="3 dias atrás"/> + <accordion_tab name="4_days_ago" title="4 dias atrás"/> + <accordion_tab name="5_days_ago" title="5 dias atrás"/> + <accordion_tab name="6_days_and_older" title="6 dias e mais velhos"/> + <accordion_tab name="1_month_and_older" title="1 mês e mais velhos"/> + <accordion_tab name="6_months_and_older" title="6 meses e mais velhos"/> + </accordion> + <panel name="bottom_panel"> + <button name="gear_btn" tool_tip="Mostrar opções adicionais"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_teleport_history_item.xml b/indra/newview/skins/default/xui/pt/panel_teleport_history_item.xml new file mode 100644 index 0000000000..65f80fddd2 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_teleport_history_item.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="teleport_history_item"> + <button name="profile_btn" tool_tip="Mostrar dados do item"/> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_voice_effect.xml b/indra/newview/skins/default/xui/pt/panel_voice_effect.xml new file mode 100644 index 0000000000..08e89f46f9 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_voice_effect.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_voice_effect"> + <string name="no_voice_effect"> + Não distorcer voz + </string> + <string name="preview_voice_effects"> + Checar distorção de voz â–¶ + </string> + <string name="get_voice_effects"> + Distorcer voz â–¶ + </string> + <combo_box name="voice_effect" tool_tip="Selecione um efeito de distorção para mudar sua voz."> + <combo_box.item label="Não distorcer voz" name="no_voice_effect"/> + </combo_box> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_world_map.xml b/indra/newview/skins/default/xui/pt/panel_world_map.xml index 2fda713ec7..accab068fd 100644 --- a/indra/newview/skins/default/xui/pt/panel_world_map.xml +++ b/indra/newview/skins/default/xui/pt/panel_world_map.xml @@ -1,5 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="world_map"> + <panel.string name="Loading"> + Carregando... + </panel.string> + <panel.string name="InvalidLocation"> + Localização inválida + </panel.string> <panel.string name="world_map_north"> N </panel.string> @@ -24,6 +30,12 @@ <panel.string name="world_map_northwest"> NO </panel.string> + <panel.string name="world_map_person"> + 1 pessoa + </panel.string> + <panel.string name="world_map_people"> + [NUMBER] pessoas + </panel.string> <text label="N" name="floater_map_north" text="N"> N </text> diff --git a/indra/newview/skins/default/xui/pt/role_actions.xml b/indra/newview/skins/default/xui/pt/role_actions.xml index 8d192d4002..2e6e4dd133 100644 --- a/indra/newview/skins/default/xui/pt/role_actions.xml +++ b/indra/newview/skins/default/xui/pt/role_actions.xml @@ -1,186 +1,71 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <role_actions> - <action_set - description="Esta habilidades incluem poderes de adicionar ou remover membros do grupo e permitir que novos membros se juntem sem um convite." - name="Membership"> - <action description="Convidar pessoas para este grupo" - longdescription="Convide pessoas para este grupo usando o botão 'Convidar nova pessoa...' em Membros & aba Funções > sub-aba Membros." - name="member invite" /> - <action description="Expulsar membros deste grupo" - longdescription="Expulse membros deste grupo usando o botão 'Expulsar do grupo' em Membros & aba Funções > sub-aba Membros. Um proprietário pode expulsar qualquer um, exceto outro proprietário. Se você não é um proprietário, um membro pode expulsá-lo do grupo se, e somente se, ele apenas tiver a função de todos e não outras funções. Para remover membros de funções, você precisa ter a habilidade 'Remover membros de funções'." - name="member eject" /> - <action - description="Ativar/desativar 'Abrir registro' e mudar 'Taxa de assinatura'" - longdescription="Ative/desative 'Abrir registro' para permitir que novos membros se unam sem um convite, e mude a 'Taxa de registro' na seção Preferência de grupo da aba Geral." - name="member options" /> + <action_set description="Esta habilidades incluem poderes de adicionar ou remover membros do grupo e permitir que novos membros se juntem sem um convite." name="Membership"> + <action description="Convidar pessoas para este grupo" longdescription="Em Membros > Cargos, use o botão 'Convidar' para convidar pessoas para entrar no grupo." name="member invite"/> + <action description="Expulsar membros deste grupo" longdescription="Em Membros > Cargos, use o botão 'Ejetar' para tirar pessoas do grupo. Proprietários podem expulsar qualquer pessoa, menos outro proprietário. Se você não é Proprietário, um membro só pode ser expulso se tiver cargo 'Todos' e nenhum outro cargo. Para destituir um membro de seu cargo, você precisa ter a função 'Destituir membro com cargo'." name="member eject"/> + <action description="Alterna entre 'Inscrições abertas' e 'Taxa de associação'." longdescription="Ative 'Inscrições abertas' para que novos membros entrem no grupo sem convite, mude a 'Taxa de associação' na seção Geral." name="member options"/> </action_set> - <action_set - description="Estas habilidades incluem poderes de adicionar, remover e mudar funções do grupo; adicionar e remover membros em funções e designar habilidades a funções." - name="Roles"> - <action description="Criar novas funções" - longdescription="Crie novas funções em Membros & aba Funções > sub-aba Funções." - name="role create" /> - <action description="Apagar funções" - longdescription="Apague funções em Membros & aba Funções > sub-aba Funções." - name="role delete" /> - <action description="Mudar nomes de função, tÃtulos e descrições" - longdescription="Mude o nome de funções, tÃtulos e descrições na parte inferior de Membros & aba Funções > sub-aba Funções após selecionar uma função." - name="role properties" /> - <action description="Designar membros para a função do designador" - longdescription="Designe membros a funções na seção de funções designadas de Membros & aba Funções > sub-aba Membros. Um membro com este poder pode somente adicionar membros para a função que o designador já possui." - name="role assign member limited" /> - <action description="Designar membros para qualquer função" - longdescription="Designe membros a qualquer função na seção de funções designadas de Membros & aba Funções > sub-aba Membros. *AVISO* Quaisquer membros em uma função com esta habilidade podem designar a si próprios--e quaisquer outros membros não proprietários--para funções que têm mais poderes do que as atuais, elevando-os a poderes próximos ao do proprietário. Certifique-se de saber o que está fazendo antes de designar esta habilidade." - name="role assign member" /> - <action description="Remover membros das funções" - longdescription="Remova membros de funções na seção de funções designadas de Membros & aba Funções > sub-aba Membros. Proprietários não podem ser removidos." - name="role remove member" /> - <action description="Determinar e remover habilidades em funções" - longdescription="Designe e remova habilidades em funções na seção habilidades pertmitidas de Membros & aba Funções > sub-aba Funções. *AVISO* Quaisquer membros em uma função com esta habilidade podem desginar a si próprios--e quaisquer outros membros não proprietários--todas as habilidades, elevando-os a poderes próximos ao do proprietário. Certifique-se de saber o que está fazendo antes de designar esta habilidade." - name="role change actions" /> + <action_set description="Estas habilidades incluem poderes de adicionar, remover e mudar funções do grupo; adicionar e remover membros em funções e designar habilidades a funções." name="Roles"> + <action description="Criar novas funções" longdescription="Crie novos cargos na guia Cargos." name="role create"/> + <action description="Apagar funções" longdescription="Exclua cargos na guia Cargos." name="role delete"/> + <action description="Modificar o nome, tÃtulo e a descrição de cargos, e se o acesso a essas informações é público ou não" longdescription="Modificar o nome, tÃtulo e a descrição de cargos, e se o acesso a essas informações é público ou não. Essas configurações ficam na guia Cargos, depois da seleção do cargo." name="role properties"/> + <action description="Designar membros para a função do designador" longdescription="Na lista Cargos desempenhados, distribua os cargos aos membros (em Cargos > guia Membros). Membros exercendo esta função devem exercer um cargo para poder adicionar outros membros ao mesmo cargo." name="role assign member limited"/> + <action description="Designar membros para qualquer função" longdescription="Designe cargos aos membros na lista Cargos desempenhados (Cargos > guia Membros). *ATENÇÃO* Qualquer membro exercendo um cargo com esta função pode se designar -- ou designar outros membros não-proprietários -- a cargos com mais poder do que têm. Ou seja, membros com essa função podem assumir poderes quase iguais aos do proprietário. Pense bem antes de dar esta função a alguém." name="role assign member"/> + <action description="Remover membros das funções" longdescription="Use a lista Cargos desempenhados para destituir membros de seus cargos (Cargos > guia Membros). Proprietários não podem ser destituÃdos." name="role remove member"/> + <action description="Determinar e remover habilidades em funções" longdescription="Use a lista Funções autorizadas para adicionar e tirar as funções de cada cargo (Cargos > guia Cargos). *ATENÇÃO* Qualquer membro exercendo um cargo com esta função pode dar a sim mesmo -- ou a outros membros não-proprietários -- todas as funções. Membros excercendo todas as funções podem assumir poderes quase iguais aos do proprietário. Pense bem antes de dar esta função a alguém." name="role change actions"/> </action_set> - <action_set - description="Estas habilidade incluem poderes para modificar esta identidade de grupo, como mudar a visibilidade pública, apresentação e insÃgnia." - name="Group Identity"> - <action - description="Mudar apresentação, insÃgnia, 'Publicar na web', e quais membros estão publicamente visÃveis em Informações do Grupo." - longdescription="Mude a apresentação, insÃgnia, 'Publicar na web' e quais membros estão publicamente visÃveis em Informações do grupo. É feito na aba Geral." - name="group change identity" /> + <action_set description="Estas habilidade incluem poderes para modificar esta identidade de grupo, como mudar a visibilidade pública, apresentação e insÃgnia." name="Group Identity"> + <action description="Mudar apresentação, insÃgnia, 'Publicar na web', e quais membros estão publicamente visÃveis em Informações do Grupo." longdescription="Modificar o estatuto, sÃmbolo e exibição nos resultados de busca. Use a seção Geral." name="group change identity"/> </action_set> - <action_set - description="Estas habilidades incluem poderes para transferir, modificar e vender terrenos do grupo. Vá pra a janela Sobre o terreno, clique com o botão direito no terreno e selecione 'Sobre o terreno...' ou clique na informação da parcela na barra do menu." - name="Parcel Management"> - <action description="Transferir e comprar terreno para o grupo" - longdescription="Transfere e compre terreno para o grupo. É feito em Sobre o terreno > aba Geral." - name="land deed" /> - <action description="Abandonar terreno para Governador Linden" - longdescription="Abandone terreno para Governador Linden. *AVISO* Qualquer membro em uma função com esta habilidade pode abandonar o terreno pertencente ao grupo em Sobre o terreno > aba Geral, revertendo à posse Linden sem uma venda! Certifique-se de saber o que está fazendo antes de designar esta habilidade." - name="land release" /> - <action description="Definir terreno para informação de venda" - longdescription="Defina informações de venda para terreno. *AVISO* Qualquer membro em uma função com esta habilidade pode vender terrenos pertencentes ao grupo em Sobre o terreno > aba Geral como quiser! Certifique-se de sabe o que está fazendo antes de designar esta habilidade." - name="land set sale info" /> - <action description="Subdividir e unir parcelas" - longdescription="Subdivide and join parcels. This is done by right-clicking the ground, 'Edit Terrain', and dragging your mouse on the land to make a selection. To subdivide, select what you want to split and click 'Subdivide...'. To join, select two or more contiguous parcels and click 'Join...'. " - name="land divide join" /> + <action_set description="Estas funções incluem poderes de transferir, vender e modificar os terrenos do grupo. Para acessar a janela 'Sobre terrenos', clique no chão com o botão direito e selecione 'Sobre terrenos'. Ou clique no Ãcone 'i' da barra de navegação." name="Parcel Management"> + <action description="Transferir e comprar terreno para o grupo" longdescription="Transfere e compre terreno para o grupo. É feito em Sobre o terreno > aba Geral." name="land deed"/> + <action description="Abandonar terreno para Governador Linden" longdescription="Abandone terreno para Governador Linden. *AVISO* Qualquer membro em uma função com esta habilidade pode abandonar o terreno pertencente ao grupo em Sobre o terreno > aba Geral, revertendo à posse Linden sem uma venda! Certifique-se de saber o que está fazendo antes de designar esta habilidade." name="land release"/> + <action description="Definir terreno para informação de venda" longdescription="Defina informações de venda para terreno. *AVISO* Qualquer membro em uma função com esta habilidade pode vender terrenos pertencentes ao grupo em Sobre o terreno > aba Geral como quiser! Certifique-se de sabe o que está fazendo antes de designar esta habilidade." name="land set sale info"/> + <action description="Subdividir e unir parcelas" longdescription="Juntar ou dividir lotes. Clique no chão com o botão direito, selecione 'Editar terreno' e arraste o mouse sobre o terreno para ver as opções. Para dividir um terreno, selecione a área a ser dividida e clique em 'Dividir'. Para juntar terrenos, selecione dois ou mais lotes adjacentes e clique em 'Juntar'." name="land divide join"/> </action_set> - <action_set - description="Estas habilidades incluem poderes para mudar o nome da parcelas e configurações de publicação, visibilidade da busca de diretório e ponto de aterrissagem & opções de rota de TP." - name="Parcel Identity"> - <action - description="Ativar/desativar 'Exibir em locais de encontro' e definir categoria" - longdescription="Ativar/desativar 'Exibir em locais de encontro' e configurar uma categoria de parcela em Sobre o terreno > aba Opções." - name="land find places" /> - <action - description="Mudar nome da parcela, descrição, e configurações 'Publicar na web'" - longdescription="Mude o nome da parcela, descrição e configurações de 'Publicar na web'. É feito em Sobre o terreno > aba Opções." - name="land change identity" /> - <action description="Definir ponto de aterrissagem e rota de teletransporte" - longdescription="Em uma parcela pertencente ao grupo, membros em uma função com esta habilidade podem definir um ponto de aterrissagem para especificar onde os teletransportes chegam e também definir a rota do teletransporte para um maior controle. É feito em Sobre o terreno > aba Opções." - name="land set landing point" /> + <action_set description="Estas habilidades incluem poderes para mudar o nome da parcelas e configurações de publicação, visibilidade da busca de diretório e ponto de aterrissagem & opções de rota de TP." name="Parcel Identity"> + <action description="Alternar 'Exibir nos resultados de busca' e selecionar a categoria" longdescription="Alterne entre 'Exibir nos resultados de busca' ou não, e selecione a categoria do terreno em 'Sobre o terreno'." name="land find places"/> + <action description="Mude o nome, a descrição e a exibição do terreno nos resultados de busca." longdescription="Mude o nome, a descrição e a exibição do terreno nos resultados de busca. Veja essas opções em Sobre o terreno > guia Opções." name="land change identity"/> + <action description="Definir ponto de aterrissagem e rota de teletransporte" longdescription="Em uma parcela pertencente ao grupo, membros em uma função com esta habilidade podem definir um ponto de aterrissagem para especificar onde os teletransportes chegam e também definir a rota do teletransporte para um maior controle. É feito em Sobre o terreno > aba Opções." name="land set landing point"/> </action_set> - <action_set - description="Estas habilidade incluem poderes que afetam opções de parcela, como 'Criar objetos', 'Editar terreno' e música & configurações de mÃdia." - name="Parcel Settings"> - <action description="Mudar música & configurações de mÃdia" - longdescription="Mude streaming de música e configurações de vÃdeo em Sobre o terreno > aba MÃdia." - name="land change media" /> - <action description="Ativar/desativar 'Editar terreno'" - longdescription="Ative/desative 'Editar terreno'. *AVISO* Sobre o terreno > aba Opções > Editar terreno permite a qualquer um alterar as formas de seu terreno, substituir e mover plantas Linden. Certifique-se de saber o que está fazendo antes de desginar esta habilidade. A edição de terreno é ativada/desativada em Sobre o terreno > aba Opções." - name="land edit" /> - <action - description="Ativar/desativar variados Sobre o Terreno > Opções de configuração" - longdescription="Ative/desative 'Seguro (sem dano)', 'Voar', e permita a outros residentes: 'Criar objetos', 'Editar terreno', 'Criar pontos de referência', e 'Executar scripts' em um terreno pertencente ao grupo em Sobre o terreno > aba Opções." - name="land options" /> + <action_set description="Estas habilidade incluem poderes que afetam opções de parcela, como 'Criar objetos', 'Editar terreno' e música & configurações de mÃdia." name="Parcel Settings"> + <action description="Mudar música & configurações de mÃdia" longdescription="Mude streaming de música e configurações de vÃdeo em Sobre o terreno > aba MÃdia." name="land change media"/> + <action description="Ativar/desativar 'Editar terreno'" longdescription="Ative/desative 'Editar terreno'. *AVISO* Sobre o terreno > aba Opções > Editar terreno permite a qualquer um alterar as formas de seu terreno, substituir e mover plantas Linden. Certifique-se de saber o que está fazendo antes de desginar esta habilidade. A edição de terreno é ativada/desativada em Sobre o terreno > aba Opções." name="land edit"/> + <action description="Ativar/desativar variados Sobre o Terreno > Opções de configuração" longdescription="Alterna as opções 'Seguro (zero danos)', 'Voar' e autorizar outros residentes a: 'Editar terreno', 'Contruir', 'Criar marcos' e 'Executar scripts' nos terrenos do grupo. Clique em Sobre o terreno > guia Opções." name="land options"/> </action_set> - <action_set - description="Estas habilidades incluem poderes que permitem a membros ultrapassar restrições em parcelas pertencentes ao grupo." - name="Parcel Powers"> - <action description="Sempre permitir 'Editar terreno'" - longdescription="Membros em uma função com esta habilidade podem editar terreno em uma parcela pertencente ao grupo, mesmo se estiver desativada em Sobre o terreno > aba Opções." - name="land allow edit land" /> - <action description="Sempre permitir 'Voar'" - longdescription="Membros em uma função com esta habilidade podem voar sobre uma parcela pertencente ao grupo, mesmo se estiver desativada em Sobre o terreno > aba Opções." - name="land allow fly" /> - <action description="Sempre permitir 'Criar objetos'" - longdescription="Membros em uma função com esta habilidade podem criar objetos em uma parcela pertencente ao grupo, mesmo se estiver desativada em Sobre o terreno > aba Opções." - name="land allow create" /> - <action description="Sempre permitir 'Criar ponto de referência'" - longdescription="Membros em uma função com esta habilidade podem colocar um ponto de referência uma parcela pertencente ao grupo, mesmo se estiver desativada em Sobre o terreno > aba Opções." - name="land allow landmark" /> - <action description="Permitir 'Colocar casa aqui' no terreno do grupo" - longdescription="Membros em uma função com esta habilidade podem usar o menu Mundo > Definir lar aqui em uma parcela do grupo (definir terreno ou transferir para este grupo)." - name="land allow set home" /> + <action_set description="Estas habilidades incluem poderes que permitem a membros ultrapassar restrições em parcelas pertencentes ao grupo." name="Parcel Powers"> + <action description="Sempre permitir 'Editar terreno'" longdescription="Membros em uma função com esta habilidade podem editar terreno em uma parcela pertencente ao grupo, mesmo se estiver desativada em Sobre o terreno > aba Opções." name="land allow edit land"/> + <action description="Sempre permitir 'Voar'" longdescription="Membros em uma função com esta habilidade podem voar sobre uma parcela pertencente ao grupo, mesmo se estiver desativada em Sobre o terreno > aba Opções." name="land allow fly"/> + <action description="Sempre permitir 'Criar objetos'" longdescription="Membros em uma função com esta habilidade podem criar objetos em uma parcela pertencente ao grupo, mesmo se estiver desativada em Sobre o terreno > aba Opções." name="land allow create"/> + <action description="Sempre permitir 'Criar ponto de referência'" longdescription="Membros em uma função com esta habilidade podem colocar um ponto de referência uma parcela pertencente ao grupo, mesmo se estiver desativada em Sobre o terreno > aba Opções." name="land allow landmark"/> + <action description="Permitir 'Colocar casa aqui' no terreno do grupo" longdescription="Membros exercendo cargos com esta função podem selecionar no menu Mundo > Marcos > Definir como casa em lotes doados ao grupo." name="land allow set home"/> </action_set> - <action_set - description="Estas habilidades incluem poderes de permitir ou restringir acesso a parcelas pertencentes ao grupo, incluindo congelar e expulsar residentes." - name="Parcel Access"> - <action description="Gerenciar listas de acesso à parcela" - longdescription="Gerencie a lista de acesso à parcela em Sobre o terreno > aba Acesso." - name="land manage allowed" /> - <action description="Gerenciar lista de banidos da parcela" - longdescription="Gerencie a lista de banidos da parcela em Sobre o terreno > aba Banido." - name="land manage banned" /> - <action description="Mudar configurações de parcela 'Vender passes...'" - longdescription="Mude configurações de 'Vender passes...' em Sobre o terreno > aba Acesso." - name="land manage passes" /> - <action description="Expulsar e congelar residentes nas parcelas" - longdescription="Membros em uma função com esta habilidade podem lidar com um residente indesejado em uma parcela pertencente ao grupo clicando com o botão direitos sobre ele, Mais > e selecionado 'Expulsar...' ou 'Congelar...'." - name="land admin" /> + <action_set description="Estas habilidades incluem poderes de permitir ou restringir acesso a parcelas pertencentes ao grupo, incluindo congelar e expulsar residentes." name="Parcel Access"> + <action description="Gerenciar listas de acesso à parcela" longdescription="Gerencie a lista de acesso à parcela em Sobre o terreno > aba Acesso." name="land manage allowed"/> + <action description="Gerenciar lista de banidos da parcela" longdescription="Administre as listas de acesso e bloqueio em Sobre o terreno > guia Acesso." name="land manage banned"/> + <action description="Modificar as opções 'Vender passes para'" longdescription="Mude as opções 'Vender passes para' em Sobre o terreno > guia Acesso." name="land manage passes"/> + <action description="Expulsar e congelar residentes nas parcelas" longdescription="Membros exercendo cargos com esta função podem lidar com residentes problemáticos nos terrenos do grupo. Clique no residente com o botão direito, depois selecione 'Ejetar' ou 'Congelar'." name="land admin"/> </action_set> - <action_set - description="Estas habilidades incluem poderes de permitir a membros retornar objetos e colocar e mover plantas Linden. Útil para que membros organizem a paisagem, porém deve ser usado com cuidado, devido a não ser possÃvel desfazer a mudança dos objetos." - name="Parcel Content"> - <action description="Retornar objetos que pertencem ao grupo" - longdescription="Retorne objetos em parcelas pertencentes ao grupo que pertencem ao grupo em Sobre o terreno > aba Objetos." - name="land return group owned" /> - <action description="Retornar objetos definidos para o grupo" - longdescription="Retorne objetos em parcelas pertencentes ao grupo que em Sobre o terrreno > aba Objetos." - name="land return group set" /> - <action description="Retornar objetos que não pertencem ao grupo" - longdescription="Retorne objetos nas parcelas pertencentes a um grupo que estão sem grupo em em Sobre o terreno > aba Objetos." - name="land return non group" /> - <action description="Ajardinar usando plantas Linden" - longdescription="A habilidade de ajardinar permite colocar e mover árvores Linden, plantas e gramas. Estes itens podem ser encontrando na Biblioteca de seu inventário > pasta Objetos ou podem ser criados através do botão Construir." - name="land gardening" /> + <action_set description="Estas habilidades incluem poderes de permitir a membros retornar objetos e colocar e mover plantas Linden. Útil para que membros organizem a paisagem, porém deve ser usado com cuidado, devido a não ser possÃvel desfazer a mudança dos objetos." name="Parcel Content"> + <action description="Retornar objetos que pertencem ao grupo" longdescription="Retorne objetos em parcelas pertencentes ao grupo que pertencem ao grupo em Sobre o terreno > aba Objetos." name="land return group owned"/> + <action description="Retornar objetos definidos para o grupo" longdescription="Retorne objetos em parcelas pertencentes ao grupo que em Sobre o terrreno > aba Objetos." name="land return group set"/> + <action description="Retornar objetos que não pertencem ao grupo" longdescription="Retorne objetos nas parcelas pertencentes a um grupo que estão sem grupo em em Sobre o terreno > aba Objetos." name="land return non group"/> + <action description="Ajardinar usando plantas Linden" longdescription="Função de paisagismo: poder de plantar e mudar árvores, plantas e grama Linden. A pasta Biblioteca > Objetos do inventário contém material de paisagismo. Use o menu Construir para criar suas próprias plantas." name="land gardening"/> </action_set> - <action_set - description="These Abilities include powers to deed, modify, and sell group-owned objects. These changes are done in the Edit Tools > General Tab. Right-click an object and Edit to see its settings. " - name="Object Management"> - <action description="Transferir objetos para o grupo" - longdescription="Transfere objetos para o grupo em Editar ferramentas > aba Geral." - name="object deed" /> - <action description="Manipular (mover, copiar, modificar) objetos do grupo" - longdescription="Manipule (mover,copiar, modificar) objetos pertencentes ao grupo em Editar Ferramentas > aba Geral." - name="object manipulate" /> - <action description="Definir objetos pertencentes ao grupo para venda" - longdescription="Defina objetos pertencentes ao grupo para venda em Editar Ferramentas > aba Geral." - name="object set sale" /> + <action_set description="Estas funções incluem poderes de transferir, vender e modificar os objetos do grupo. Essas opções ficam nas Ferramentas de contrução > guia Geral. Clique em um objeto com o botão direito e selecione Editar para ver as configurações do objeto." name="Object Management"> + <action description="Transferir objetos para o grupo" longdescription="Transfira objetos para o grupo em Ferramentas de construção > guia Geral." name="object deed"/> + <action description="Manipular (mover, copiar, modificar) objetos do grupo" longdescription="Manipule (transportar, copiar, modificar) objetos do grupo nas Ferramentas de construção > guia Geral." name="object manipulate"/> + <action description="Definir objetos pertencentes ao grupo para venda" longdescription="Ponha objetos do grupo à venda nas Ferramentas de construção > guia Geral." name="object set sale"/> </action_set> - <action_set - description="Estas habilidades incluem poderes que requerem que membros paguem dÃvidas e recebam dividendos do grupo, e restringem acesso ao histórico de conta do grupo." - name="Accounting"> - <action description="Pagar débitos e receber dividendos do grupo" - longdescription="Members in a Role with this Ability will automatically pay group liabilities and receive group dividends. This means they will receive a portion of group-owned land sales which are distributed daily, as well as contribute towards things like parcel listing fees. " - name="accounting accountable" /> + <action_set description="Estas habilidades incluem poderes que requerem que membros paguem dÃvidas e recebam dividendos do grupo, e restringem acesso ao histórico de conta do grupo." name="Accounting"> + <action description="Pagar débitos e receber dividendos do grupo" longdescription="Members in a Role with this Ability will automatically pay group liabilities and receive group dividends. This means they will receive a portion of group-owned land sales which are distributed daily, as well as contribute towards things like parcel listing fees. " name="accounting accountable"/> </action_set> - <action_set - description="Estas habilidade incluem poderes de permitir enviar, receber e ver avisos de grupo." - name="Notices"> - <action description="Enviar aviso" - longdescription="Membros em uma função com esta habiliade podem enviar avisos em Informações de grupo > aba Avisos." - name="notices send" /> - <action description="Receber novos avisos e ver os anteriores" - longdescription="Membros em uma função com esta habilidade podem receber os novos avisos e ver os anteriores em Informações de grupo > aba Avisos." - name="notices receive" /> + <action_set description="Estas habilidade incluem poderes de permitir enviar, receber e ver avisos de grupo." name="Notices"> + <action description="Enviar aviso" longdescription="Membros que exercem cargos com esta função podem enviar avisos na seção Avisos." name="notices send"/> + <action description="Receber novos avisos e ver os anteriores" longdescription="Membros que exercem cargos com esta função podem receber e ler avisos antigos na seção Avisos." name="notices receive"/> </action_set> - <action_set - description="Estas habilidades incluem poderes de permitir a membros definir e votar em propostas e ver histórico de votação." - name="Proposals"> - <action description="Criar proposta" - longdescription="Membros em uma função com esta habilidade podem criar proposta para serem votadas em Informações de grupo > aba Propostas." - name="proposal start" /> - <action description="Votar em propostas" - longdescription="Membros em uma função com esta habilidade podem votar em propostas em Informações de grupo > aba Propostas." - name="proposal vote" /> + <action_set description="Estas habilidades incluem poderes de permitir a membros definir e votar em propostas e ver histórico de votação." name="Proposals"> + <action description="Criar proposta" longdescription="Membros em uma função com esta habilidade podem criar proposta para serem votadas em Informações de grupo > aba Propostas." name="proposal start"/> + <action description="Votar em propostas" longdescription="Membros em uma função com esta habilidade podem votar em propostas em Informações de grupo > aba Propostas." name="proposal vote"/> </action_set> </role_actions> diff --git a/indra/newview/skins/default/xui/pt/sidepanel_appearance.xml b/indra/newview/skins/default/xui/pt/sidepanel_appearance.xml new file mode 100644 index 0000000000..f075f45b8f --- /dev/null +++ b/indra/newview/skins/default/xui/pt/sidepanel_appearance.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Looks" name="appearance panel"> + <string name="No Outfit" value="Nenhum"/> + <string name="Unsaved Changes" value="Mudanças não salvas"/> + <string name="Now Wearing" value="Look atual..."/> + <panel name="panel_currentlook"> + <button label="E" name="editappearance_btn"/> + <button label="O" name="openoutfit_btn"/> + <text name="currentlook_status"> + (Status) + </text> + </panel> + <filter_editor label="Filtrar looks" name="Filter"/> +</panel> diff --git a/indra/newview/skins/default/xui/pt/sidepanel_inventory.xml b/indra/newview/skins/default/xui/pt/sidepanel_inventory.xml new file mode 100644 index 0000000000..e382da258f --- /dev/null +++ b/indra/newview/skins/default/xui/pt/sidepanel_inventory.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Coisas" name="objects panel"> + <panel label="" name="sidepanel__inventory_panel"> + <panel name="button_panel"> + <button label="Perfil" name="info_btn" tool_tip="Mostrar perfil do objeto"/> + <button label="Compartilhar" name="share_btn" tool_tip="Compartilhar item de inventário"/> + <button label="Comprar" name="shop_btn" tool_tip="Abrir página do Marketplace"/> + <button label="Vestir" name="wear_btn" tool_tip="Vestir visual selecionado"/> + <button label="Tocar" name="play_btn"/> + <button label="Teletransportar" name="teleport_btn" tool_tip="Teletransportar para a área selecionada"/> + </panel> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/pt/sidepanel_item_info.xml b/indra/newview/skins/default/xui/pt/sidepanel_item_info.xml new file mode 100644 index 0000000000..4fc50bac67 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/sidepanel_item_info.xml @@ -0,0 +1,73 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="item properties" title="Perfil do objeto"> + <panel.string name="unknown"> + (desconhecido) + </panel.string> + <panel.string name="public"> + (público) + </panel.string> + <panel.string name="you_can"> + você pode: + </panel.string> + <panel.string name="owner_can"> + Proprietário pode: + </panel.string> + <panel.string name="acquiredDate"> + [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local] + </panel.string> + <text name="title" value="Perfil do objeto"/> + <text name="where" value="(Inventário)"/> + <panel label=""> + <text name="LabelItemNameTitle"> + Nome: + </text> + <text name="LabelItemDescTitle"> + Descrição: + </text> + <text name="LabelCreatorTitle"> + Criador: + </text> + <button label="Perfil..." name="BtnCreator"/> + <text name="LabelOwnerTitle"> + Proprietário: + </text> + <button label="Perfil..." name="BtnOwner"/> + <text name="LabelAcquiredTitle"> + Adquirido: + </text> + <text name="LabelAcquiredDate"> + Quarta 24 de Maio 12:50:46 2006 + </text> + <panel name="perms_inv"> + <text name="perm_modify"> + Você pode: + </text> + <check_box label="Modificar" name="CheckOwnerModify"/> + <check_box label="Copiar" name="CheckOwnerCopy"/> + <check_box label="Transferir" name="CheckOwnerTransfer"/> + <text name="AnyoneLabel"> + Todos: + </text> + <check_box label="Copiar" name="CheckEveryoneCopy"/> + <text name="GroupLabel"> + Grupo: + </text> + <check_box label="Compartilhar" name="CheckShareWithGroup" tool_tip="Permitir que todos os membros do grupo tenham o seu nÃvel de modificação para este objeto. Faça uma doação para ativar restrições de função."/> + <text name="NextOwnerLabel"> + Próximo proprietário: + </text> + <check_box label="Modificar" name="CheckNextOwnerModify"/> + <check_box label="Copiar" name="CheckNextOwnerCopy"/> + <check_box label="Transferir" name="CheckNextOwnerTransfer" tool_tip="O próximo dono poderá revender ou dar este objeto"/> + </panel> + <check_box label="À venda" name="CheckPurchase"/> + <combo_box name="combobox sale copy"> + <combo_box.item label="Copiar" name="Copy"/> + <combo_box.item label="Original" name="Original"/> + </combo_box> + <spinner label="Preço: L$" name="Edit Cost"/> + </panel> + <panel name="button_panel"> + <button label="Cancelar" name="cancel_btn"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/pt/sidepanel_task_info.xml b/indra/newview/skins/default/xui/pt/sidepanel_task_info.xml new file mode 100644 index 0000000000..9193730018 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/sidepanel_task_info.xml @@ -0,0 +1,129 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="object properties" title="Perfil do objeto"> + <panel.string name="text deed continued"> + Doar + </panel.string> + <panel.string name="text deed"> + Doar + </panel.string> + <panel.string name="text modify info 1"> + Você pode modificar este objeto + </panel.string> + <panel.string name="text modify info 2"> + Você pode modificar estes objetos + </panel.string> + <panel.string name="text modify info 3"> + Você não pode modificar este objeto + </panel.string> + <panel.string name="text modify info 4"> + Você não pode modificar estes objetos + </panel.string> + <panel.string name="text modify warning"> + O objeto contém links ligando suas partes + </panel.string> + <panel.string name="Cost Default"> + Preço: L$ + </panel.string> + <panel.string name="Cost Total"> + Preço total: L$ + </panel.string> + <panel.string name="Cost Per Unit"> + Preço unitário: L$ + </panel.string> + <panel.string name="Cost Mixed"> + Preço misto + </panel.string> + <panel.string name="Sale Mixed"> + Venda mista + </panel.string> + <text name="title" value="Perfil do objeto"/> + <text name="where" value="(inworld)"/> + <panel label="" name="properties_panel"> + <text name="Name:"> + Nome: + </text> + <text name="Description:"> + Descrição: + </text> + <text name="CreatorNameLabel"> + Criador: + </text> + <text name="Creator Name"> + Erica Linden + </text> + <text name="Owner:"> + Proprietário: + </text> + <text name="Owner Name"> + Erica Linden + </text> + <text name="Group_label"> + Grupo: + </text> + <button name="button set group" tool_tip="Selecione o grupo que terá acesso à autorização do objeto"/> + <name_box initial_value="Carregando..." name="Group Name Proxy"/> + <button label="Doar" label_selected="Doar" name="button deed" tool_tip="Ao doar este item, o próximo dono terá permissões de próximo dono. Objetos de grupos podem ser doados por um oficial do grupo."/> + <text name="label click action"> + Clique para: + </text> + <combo_box name="clickaction"> + <combo_box.item label="Tocar (padrão)" name="Touch/grab(default)"/> + <combo_box.item label="Sentar em objeto" name="Sitonobject"/> + <combo_box.item label="Comprar objeto" name="Buyobject"/> + <combo_box.item label="Pagar por objeto" name="Payobject"/> + <combo_box.item label="Abrir" name="Open"/> + </combo_box> + <panel name="perms_inv"> + <text name="perm_modify"> + Você pode modificar este objeto + </text> + <text name="Anyone can:"> + Todos: + </text> + <check_box label="Copiar" name="checkbox allow everyone copy"/> + <check_box label="Movimentar" name="checkbox allow everyone move"/> + <text name="GroupLabel"> + Grupo: + </text> + <check_box label="Compartilhar" name="checkbox share with group" tool_tip="Permitir que todos os membros do grupo tenham o seu nÃvel de modificação para este objeto. Faça uma doação para ativar restrições de função."/> + <text name="NextOwnerLabel"> + Próximo proprietário: + </text> + <check_box label="Modificar" name="checkbox next owner can modify"/> + <check_box label="Copiar" name="checkbox next owner can copy"/> + <check_box label="Transferir" name="checkbox next owner can transfer" tool_tip="O próximo dono poderá revender ou dar este objeto"/> + </panel> + <check_box label="À venda" name="checkbox for sale"/> + <combo_box name="sale type"> + <combo_box.item label="Copiar" name="Copy"/> + <combo_box.item label="Conteúdo" name="Contents"/> + <combo_box.item label="Original" name="Original"/> + </combo_box> + <spinner label="Preço: L$" name="Edit Cost"/> + <check_box label="Mostrar nos resultados de busca" name="search_check" tool_tip="Incluir o objeto nos resultados de busca"/> + <text name="B:"> + B: + </text> + <text name="O:"> + O: + </text> + <text name="G:"> + G: + </text> + <text name="E:"> + E: + </text> + <text name="N:"> + N: + </text> + <text name="F:"> + F: + </text> + </panel> + <panel name="button_panel"> + <button label="Abrir" name="open_btn"/> + <button label="Pagar" name="pay_btn"/> + <button label="Comprar" name="buy_btn"/> + <button label="Detalhes" name="details_btn"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/pt/strings.xml b/indra/newview/skins/default/xui/pt/strings.xml index 9acfce99dd..80f52dfe46 100644 --- a/indra/newview/skins/default/xui/pt/strings.xml +++ b/indra/newview/skins/default/xui/pt/strings.xml @@ -1,12 +1,41 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <!-- This file contains strings that used to be hardcoded in the source. It is only for those strings which do not belong in a floater. - For example, the strings used in avatar chat bubbles, and strings + For example, the strings used in avatar chat bubbles, and strings that are returned from one component and may appear in many places--> <strings> - <string name="create_account_url">http://join.secondlife.com/index.php?lang=pt-BR</string> + <string name="CAPITALIZED_APP_NAME"> + SECOND LIFE + </string> + <string name="SUPPORT_SITE"> + Portal de Supporte Second Life + </string> + <string name="StartupDetectingHardware"> + Detectando hardware... + </string> + <string name="StartupLoading"> + Carregando [APP_NAME]... + </string> + <string name="StartupClearingCache"> + Limpando o cache... + </string> + <string name="StartupInitializingTextureCache"> + Iniciando cache de texturas... + </string> + <string name="StartupInitializingVFS"> + Iniciando VFS... + </string> + <string name="ProgressRestoring"> + Restaurando... + </string> + <string name="ProgressChangingResolution"> + Alterando a resolução... + </string> <string name="LoginInProgress"> - Fazendo Login. [APP_NAME] pode parecer congelado. Por favor, aguarde. + Fazendo login. [APP_NAME] pode parecer congelado. Por favor, aguarde. + </string> + <string name="LoginInProgressNoFrozen"> + Logando... </string> <string name="LoginAuthenticating"> Autenticando @@ -15,7 +44,7 @@ Executando manutenção da conta... </string> <string name="LoginAttempt"> - Falha na tentativa anterior de login. Fazendo Login, tentativa [NUMBER] + Falha na tentativa anterior de login. Login, tentativa [NUMBER] </string> <string name="LoginPrecaching"> Carregando mundo... @@ -26,14 +55,17 @@ <string name="LoginInitializingMultimedia"> Inicializando multimÃdia... </string> + <string name="LoginInitializingFonts"> + Carregando fontes... + </string> <string name="LoginVerifyingCache"> - Verificando arquivos no cache (pode levar 60-90 segundos)... + Verificando arquivos cache (pode levar de 60-90 segundos)... </string> <string name="LoginProcessingResponse"> - Processando Resposta... + Processando resposta... </string> <string name="LoginInitializingWorld"> - Inicializando Mundo... + Inicializando mundo... </string> <string name="LoginDecodingImages"> Decodificando imagens... @@ -42,13 +74,13 @@ Inicializando o QuickTime... </string> <string name="LoginQuicktimeNotFound"> - O QuickTime não foi encontrado - incapaz de inicializar. + O QuickTime não foi encontrado - falha ao iniciar. </string> <string name="LoginQuicktimeOK"> O QuickTime foi inicializado com sucesso. </string> <string name="LoginWaitingForRegionHandshake"> - Aguardando o handshake com a região... + Aguardando handshake com a região... </string> <string name="LoginConnectingToRegion"> Conectando à região... @@ -56,9 +88,57 @@ <string name="LoginDownloadingClothing"> Baixando roupas... </string> + <string name="InvalidCertificate"> + O servidor respondeu com um certificado inválido ou corrompido. Por favor contate o administrador do Grid. + </string> + <string name="CertInvalidHostname"> + Um hostname inválido foi usado para acessar o servidor. Verifique o SLURL ou hostname do Grid. + </string> + <string name="CertExpired"> + O certificado dado pelo Grid parece estar vencido. Verifique o relógio do sistema ou contate o administrador do Grid. + </string> + <string name="CertKeyUsage"> + O certificado dado pelo servidor não pôde ser usado para SSL. Por favor contate o administrador do Grid. + </string> + <string name="CertBasicConstraints"> + A cadeia de certificados do servidor tinha certificados demais. Por favor contate o administrador do Grid. + </string> + <string name="CertInvalidSignature"> + A assinatura do certificado dado pelo servidor do Grid não pôde ser verificada. Contate o administrador do seu Grid. + </string> + <string name="LoginFailedNoNetwork"> + Erro de rede: Não foi possÃvel estabelecer a conexão, verifique sua conexão de rede. + </string> + <string name="LoginFailed"> + Falha do login. + </string> + <string name="Quit"> + Sair + </string> + <string name="create_account_url"> + http://join.secondlife.com/index.php?lang=pt-BR + </string> <string name="AgentLostConnection"> Esta região pode estar passando por problemas. Por favor, verifique sua conexão com a internet. </string> + <string name="SavingSettings"> + Salvando configurações... + </string> + <string name="LoggingOut"> + Saindo... + </string> + <string name="ShuttingDown"> + Fechando... + </string> + <string name="YouHaveBeenDisconnected"> + Você foi desconectado da região onde estava. + </string> + <string name="SentToInvalidRegion"> + Você foi enviado para uma região inválida. + </string> + <string name="TestingDisconnect"> + Teste de desconexão + </string> <string name="TooltipPerson"> Pessoa </string> @@ -74,59 +154,29 @@ <string name="TooltipIsGroup"> (Grupo) </string> - <string name="TooltipFlagScript"> - Script - </string> - <string name="TooltipFlagPhysics"> - FÃsica - </string> - <string name="TooltipFlagTouch"> - Toque - </string> - <string name="TooltipFlagL$"> - L$ - </string> - <string name="TooltipFlagDropInventory"> - Dar Inventário - </string> - <string name="TooltipFlagPhantom"> - Imaterial - </string> - <string name="TooltipFlagTemporary"> - Temporário - </string> - <string name="TooltipFlagRightClickMenu"> - (Clique com o botão direito para acessar o menu) - </string> - <string name="TooltipFreeToCopy"> - Cópia Permitida - </string> <string name="TooltipForSaleL$"> À venda: L$[AMOUNT] </string> - <string name="TooltipForSaleMsg"> - À venda: [MESSAGE] - </string> <string name="TooltipFlagGroupBuild"> ConstruÃdo por Grupo </string> <string name="TooltipFlagNoBuild"> - Não é Permitido Construir + Não é permitido construir </string> <string name="TooltipFlagNoEdit"> ConstruÃdo por Grupo </string> <string name="TooltipFlagNotSafe"> - Não é Seguro + Não é seguro </string> <string name="TooltipFlagNoFly"> - Não é Permitido Voar + Não é permitido voar </string> <string name="TooltipFlagGroupScripts"> Scripts de Grupo </string> <string name="TooltipFlagNoScripts"> - Não são Permitidos Scripts + Não são permitidos scripts </string> <string name="TooltipLand"> Terreno: @@ -134,11 +184,118 @@ <string name="TooltipMustSingleDrop"> Apenas um item único pode ser arrastado para este local </string> + <string name="TooltipHttpUrl"> + Clique para ver a página web + </string> + <string name="TooltipSLURL"> + Clique para ver os dados desta localização + </string> + <string name="TooltipAgentUrl"> + Clique para ver o perfil deste residente + </string> + <string name="TooltipAgentMute"> + Clique para silenciar este residente + </string> + <string name="TooltipAgentUnmute"> + Clique para desfazer silenciar neste residente + </string> + <string name="TooltipAgentIM"> + Clique para enviar uma MI para este residente + </string> + <string name="TooltipAgentPay"> + Clique para pagar este residente + </string> + <string name="TooltipAgentOfferTeleport"> + Clique para enviar um pedido de amizade a este residente + </string> + <string name="TooltipAgentRequestFriend"> + Clique para enviar um pedido de amizade a este residente + </string> + <string name="TooltipGroupUrl"> + Clique para ver a descrição deste Grupo + </string> + <string name="TooltipEventUrl"> + Clique para ver a descrição deste evento + </string> + <string name="TooltipClassifiedUrl"> + Clique para ver este anúncio + </string> + <string name="TooltipParcelUrl"> + Clique para ver a descrição desta parcela + </string> + <string name="TooltipTeleportUrl"> + Clique para teletransportar para esta localização + </string> + <string name="TooltipObjectIMUrl"> + Clique para ver a descrição deste objeto + </string> + <string name="TooltipMapUrl"> + Clique para ver esta localização no mapa + </string> + <string name="TooltipSLAPP"> + Clique para ativar no secondlife:// comando + </string> + <string name="CurrentURL" value="URL atual: [CurrentURL]"/> + <string name="TooltipPrice" value="L$[PRICE]-"/> + <string name="SLurlLabelTeleport"> + Teletransportar para + </string> + <string name="SLurlLabelShowOnMap"> + Mostrar no mapa para + </string> + <string name="SLappAgentMute"> + Silenciar + </string> + <string name="SLappAgentUnmute"> + Desfazer silenciar + </string> + <string name="SLappAgentIM"> + MI + </string> + <string name="SLappAgentPay"> + Pagar + </string> + <string name="SLappAgentOfferTeleport"> + Oferecer teletransporte para + </string> + <string name="SLappAgentRequestFriend"> + Pedido de amizade + </string> + <string name="BUTTON_CLOSE_DARWIN"> + Fechar (⌘W) + </string> + <string name="BUTTON_CLOSE_WIN"> + Fechar (Ctrl+W) + </string> + <string name="BUTTON_CLOSE_CHROME"> + Fechar + </string> + <string name="BUTTON_RESTORE"> + Restaurar + </string> + <string name="BUTTON_MINIMIZE"> + Minimizar + </string> + <string name="BUTTON_TEAR_OFF"> + Separar-se da janela + </string> + <string name="BUTTON_DOCK"> + conectar-se à barra + </string> + <string name="BUTTON_HELP"> + Mostrar ajuda + </string> + <string name="Searching"> + Buscando... + </string> + <string name="NoneFound"> + Não encontrado. + </string> <string name="RetrievingData"> Buscando... </string> <string name="ReleaseNotes"> - Notas de Distribuição + Notas de versão </string> <string name="LoadingData"> Carregando... @@ -149,12 +306,12 @@ <string name="AvatarNameWaiting"> (aguardando) </string> - <string name="AvatarNameHippos"> - (hippos) - </string> <string name="GroupNameNone"> (nenhum) </string> + <string name="AvalineCaller"> + Interlocutor Avaline [ORDER] + </string> <string name="AssetErrorNone"> Nenhum erro </string> @@ -188,8 +345,80 @@ <string name="AssetErrorUnknownStatus"> Status desconhecido </string> - <string name="AvatarEditingApparance"> - (Editando Aparência) + <string name="texture"> + textura + </string> + <string name="sound"> + som + </string> + <string name="calling card"> + cartão de visitas + </string> + <string name="landmark"> + landmark + </string> + <string name="legacy script"> + script obsoleto + </string> + <string name="clothing"> + roupas + </string> + <string name="object"> + objeto + </string> + <string name="note card"> + anotação + </string> + <string name="folder"> + pasta + </string> + <string name="root"> + raiz + </string> + <string name="lsl2 script"> + script LSL2 + </string> + <string name="lsl bytecode"> + bytecode LSL + </string> + <string name="tga texture"> + textura tga + </string> + <string name="body part"> + parte do corpo + </string> + <string name="snapshot"> + fotografia + </string> + <string name="lost and found"> + Achados e Perdidos + </string> + <string name="targa image"> + imagem targa + </string> + <string name="trash"> + Lixo + </string> + <string name="jpeg image"> + imagem jpeg + </string> + <string name="animation"> + animação + </string> + <string name="gesture"> + gesto + </string> + <string name="simstate"> + simstate + </string> + <string name="favorite"> + favorito + </string> + <string name="symbolic link"> + link + </string> + <string name="symbolic folder link"> + link da pasta </string> <string name="AvatarAway"> Distante @@ -225,7 +454,7 @@ Entediado </string> <string name="anim_bow"> - Saudar curvando + Reverência </string> <string name="anim_clap"> Aplaudir @@ -285,10 +514,10 @@ Impaciente </string> <string name="anim_jumpforjoy"> - Pular de Alegria + Pular de alegria </string> <string name="anim_kissmybutt"> - Beije meu Bumbum + Beije meu bumbum </string> <string name="anim_express_kiss"> Beijar @@ -309,7 +538,7 @@ Nya-nya-nya </string> <string name="anim_punch_onetwo"> - Soco Um-Dois + Soco um-dois </string> <string name="anim_express_open_mouth"> Abrir a boca @@ -324,10 +553,10 @@ Apontar para si </string> <string name="anim_punch_l"> - Socar Esquerda + Soco esquerdo </string> <string name="anim_punch_r"> - Socar Direita + Soco direito </string> <string name="anim_rps_countdown"> RPS contar @@ -366,16 +595,16 @@ Fumar à toa </string> <string name="anim_smoke_inhale"> - Inalar Fumaça + Inalar fumaça </string> <string name="anim_smoke_throw_down"> - Expelir Fumaça + Expelir fumaça </string> <string name="anim_express_surprise"> Surpresa </string> <string name="anim_sword_strike_r"> - Golpe de Espada + Golpe de espada </string> <string name="anim_angry_tantrum"> Enraivecer @@ -411,7 +640,19 @@ Carregando... </string> <string name="worldmap_offline"> - Desconectado + Offline + </string> + <string name="worldmap_results_none_found"> + Nenhum encontrado. + </string> + <string name="Ok"> + OK + </string> + <string name="Premature end of file"> + término prematuro do arquivo + </string> + <string name="ST_NO_JOINT"> + Não é possÃvel encontrar a raiz (ROOT) ou junção (JOINT). </string> <string name="whisper"> sussurra: @@ -419,14 +660,68 @@ <string name="shout"> grita: </string> + <string name="ringing"> + Conectando à conversa de voz no mundo + </string> + <string name="connected"> + Conectado + </string> + <string name="unavailable"> + Voz não disponÃvel na sua localização atual + </string> + <string name="hang_up"> + Desconectado da conversa de Voz no mundo + </string> + <string name="reconnect_nearby"> + Agora você será reconectado ao bate-papo local. + </string> + <string name="ScriptQuestionCautionChatGranted"> + '[OBJECTNAME]', um objeto de '[OWNERNAME]', localizado em [REGIONNAME] a [REGIONPOS], obteve permissão para: [PERMISSIONS]. + </string> + <string name="ScriptQuestionCautionChatDenied"> + '[OBJECTNAME]', um objeto de '[OWNERNAME]', localizado em [REGIONNAME] a [REGIONPOS], teve permissão negada para: [PERMISSIONS]. + </string> + <string name="ScriptTakeMoney"> + Tomar linden dólares (L$) de você + </string> + <string name="ActOnControlInputs"> + Atue nas suas entradas de controle + </string> + <string name="RemapControlInputs"> + Remapeie suas entradas de controle + </string> + <string name="AnimateYourAvatar"> + Faça uma animação para o seu avatar + </string> + <string name="AttachToYourAvatar"> + Anexe ao seu avatar + </string> + <string name="ReleaseOwnership"> + Libere a propriedade e torne-a pública + </string> + <string name="LinkAndDelink"> + Una e desuna de outros objetos + </string> + <string name="AddAndRemoveJoints"> + Adicione e remova junções com outros objetos + </string> + <string name="ChangePermissions"> + Modifique as permissões + </string> + <string name="TrackYourCamera"> + Acompanhe sua câmera + </string> + <string name="ControlYourCamera"> + Controle sua camera + </string> <string name="SIM_ACCESS_PG"> - PG + Público geral </string> <string name="SIM_ACCESS_MATURE"> - Mature + Moderado </string> <string name="SIM_ACCESS_ADULT"> - Adult + Adulto </string> <string name="SIM_ACCESS_DOWN"> Desconectado @@ -437,10 +732,14 @@ <string name="land_type_unknown"> (desconhecido) </string> - <string name="covenant_never_modified">Última modificação: (nunca)</string> - <string name="covenant_modified">Última modificação: </string> + <string name="Estate / Full Region"> + Propriedadade / Região inteira: + </string> + <string name="Mainland / Full Region"> + Continente / Região inteira: + </string> <string name="all_files"> - Todos os Arquivos + Todos os arquivos </string> <string name="sound_files"> Sons @@ -464,10 +763,10 @@ Imagens Bitmap </string> <string name="avi_movie_file"> - Arquivo de filme AVI + Arquivo de vÃdeo AVI </string> <string name="xaf_animation_file"> - Arquivo de Animação XAF + Arquivo de animação XAF </string> <string name="xml_file"> Arquivo XML @@ -476,25 +775,972 @@ Arquivo RAW </string> <string name="compressed_image_files"> - Imagens Compactadas + Imagens compactadas </string> <string name="load_files"> - Carregar Arquivos + Carregar arquivos </string> <string name="choose_the_directory"> - Escolher Diretório + Selecionar pasta + </string> + <string name="AvatarSetNotAway"> + deixar como ausente + </string> + <string name="AvatarSetAway"> + deixar como ausente + </string> + <string name="AvatarSetNotBusy"> + deixar como não ocupado + </string> + <string name="AvatarSetBusy"> + Deixar como ocupado + </string> + <string name="shape"> + Silhueta + </string> + <string name="skin"> + Pele + </string> + <string name="hair"> + Cabelo + </string> + <string name="eyes"> + Olhos + </string> + <string name="shirt"> + Camisa + </string> + <string name="pants"> + Calças + </string> + <string name="shoes"> + Sapatos + </string> + <string name="socks"> + Meias + </string> + <string name="jacket"> + Blusa + </string> + <string name="gloves"> + Luvas + </string> + <string name="undershirt"> + Camiseta + </string> + <string name="underpants"> + Roupa de baixo + </string> + <string name="skirt"> + Saia + </string> + <string name="alpha"> + Alpha + </string> + <string name="tattoo"> + Tatuagem + </string> + <string name="invalid"> + Inválido + </string> + <string name="shirt_not_worn"> + Camisa não vestida + </string> + <string name="pants_not_worn"> + Calças não vestidas + </string> + <string name="shoes_not_worn"> + Sapatos não calçados + </string> + <string name="socks_not_worn"> + Meias não calçadas + </string> + <string name="jacket_not_worn"> + Jaqueta não vestida + </string> + <string name="gloves_not_worn"> + Luvas não calçadas + </string> + <string name="undershirt_not_worn"> + Camiseta não vestida + </string> + <string name="underpants_not_worn"> + Roupa de baixo não vestida + </string> + <string name="skirt_not_worn"> + Saia não vestida + </string> + <string name="alpha_not_worn"> + Alpha não vestido + </string> + <string name="tattoo_not_worn"> + Tatuagem não usada + </string> + <string name="invalid_not_worn"> + inválido + </string> + <string name="NewWearable"> + Novo [WEARABLE_ITEM] + </string> + <string name="CreateNewWearable"> + Criar [WEARABLE_TYPE] + </string> + <string name="next"> + Próximo + </string> + <string name="ok"> + OK + </string> + <string name="GroupNotifyGroupNotice"> + Anúncio de grupo + </string> + <string name="GroupNotifyGroupNotices"> + Anúncios do grupo + </string> + <string name="GroupNotifySentBy"> + Enviado por + </string> + <string name="GroupNotifyAttached"> + Anexo: + </string> + <string name="GroupNotifyViewPastNotices"> + Ver últimos anúncios ou optar por não receber essas mensagens aqui. + </string> + <string name="GroupNotifyOpenAttachment"> + Abrir anexo + </string> + <string name="GroupNotifySaveAttachment"> + Salvar anexo + </string> + <string name="TeleportOffer"> + Oferta de teletransporte + </string> + <string name="StartUpNotifications"> + Novas notificações chegaram enquanto você estava fora... + </string> + <string name="OverflowInfoChannelString"> + Você tem mais [%d] notificações + </string> + <string name="BodyPartsRightArm"> + Braço direito + </string> + <string name="BodyPartsHead"> + Cabeça + </string> + <string name="BodyPartsLeftArm"> + Braço esquerdo + </string> + <string name="BodyPartsLeftLeg"> + Perna esquerda + </string> + <string name="BodyPartsTorso"> + Tronco + </string> + <string name="BodyPartsRightLeg"> + Perna direita + </string> + <string name="GraphicsQualityLow"> + Baixo + </string> + <string name="GraphicsQualityMid"> + Meio + </string> + <string name="GraphicsQualityHigh"> + Alto + </string> + <string name="LeaveMouselook"> + Pressione ESC para retornar para visão do mundo + </string> + <string name="InventoryNoMatchingItems"> + Não encontrou o que procura? Tente buscar no [secondlife:///app/search/people/[SEARCH_TERM] Search]. + </string> + <string name="PlacesNoMatchingItems"> + Não encontrou o que procura? Tente buscar no [secondlife:///app/search/groups/[SEARCH_TERM] Search]. + </string> + <string name="FavoritesNoMatchingItems"> + Arraste um marco para adicioná-lo aos seus favoritos. + </string> + <string name="InventoryNoTexture"> + Você não possui uma cópia desta textura no seu inventário + </string> + <string name="no_transfer" value="(não transferÃvel)"/> + <string name="no_modify" value="(não modificável)"/> + <string name="no_copy" value="(não copiável)"/> + <string name="worn" value="(vestido)"/> + <string name="link" value="(link)"/> + <string name="broken_link" value="(link_quebrado)""/> + <string name="LoadingContents"> + Carregando conteúdo... + </string> + <string name="NoContents"> + Nenhum conteúdo + </string> + <string name="WornOnAttachmentPoint" value="(vestido em [ATTACHMENT_POINT])"/> + <string name="ActiveGesture" value="[GESLABEL] (ativado)"/> + <string name="Chat" value="Bate papo"/> + <string name="Sound" value="Som"/> + <string name="Wait" value="--- Aguarde"/> + <string name="AnimFlagStop" value="Parar animação"/> + <string name="AnimFlagStart" value="Iniciar animação"/> + <string name="Wave" value="Acenar"/> + <string name="HelloAvatar" value="Olá, avatar!"/> + <string name="ViewAllGestures" value="Ver todos>>"/> + <string name="GetMoreGestures" value="Mais >>"/> + <string name="Animations" value="Animações,"/> + <string name="Calling Cards" value="Cartões de visitas,"/> + <string name="Clothing" value="Vestuário,"/> + <string name="Gestures" value="Gestos,"/> + <string name="Landmarks" value="Marcos"/> + <string name="Notecards" value="Anotações"/> + <string name="Objects" value="Objetos,"/> + <string name="Scripts" value="Scripts,"/> + <string name="Sounds" value="Sons"/> + <string name="Textures" value="Texturas"/> + <string name="Snapshots" value="Fotografias"/> + <string name="No Filters" value="Não"/> + <string name="Since Logoff" value="- Desde desligado"/> + <string name="InvFolder My Inventory"> + Meu inventário + </string> + <string name="InvFolder My Favorites"> + Meus favoritos + </string> + <string name="InvFolder Library"> + Biblioteca + </string> + <string name="InvFolder Textures"> + Texturas + </string> + <string name="InvFolder Sounds"> + Sons + </string> + <string name="InvFolder Calling Cards"> + Cartões de visitas + </string> + <string name="InvFolder Landmarks"> + Marcos + </string> + <string name="InvFolder Scripts"> + Scripts + </string> + <string name="InvFolder Clothing"> + Vestuário + </string> + <string name="InvFolder Objects"> + Objetos + </string> + <string name="InvFolder Notecards"> + Anotações + </string> + <string name="InvFolder New Folder"> + Nova pasta + </string> + <string name="InvFolder Inventory"> + Inventário + </string> + <string name="InvFolder Uncompressed Images"> + Imagens descompactadas + </string> + <string name="InvFolder Body Parts"> + Corpo + </string> + <string name="InvFolder Trash"> + Lixo + </string> + <string name="InvFolder Photo Album"> + Ãlbum de fotografias + </string> + <string name="InvFolder Lost And Found"> + Achados e Perdidos + </string> + <string name="InvFolder Uncompressed Sounds"> + Sons descompactados + </string> + <string name="InvFolder Animations"> + Animações + </string> + <string name="InvFolder Gestures"> + Gestos + </string> + <string name="InvFolder favorite"> + Favoritos + </string> + <string name="InvFolder Current Outfit"> + Look atual + </string> + <string name="InvFolder My Outfits"> + Meus looks + </string> + <string name="InvFolder Accessories"> + Acessórios + </string> + <string name="InvFolder Friends"> + Amigos + </string> + <string name="InvFolder All"> + Tudo + </string> + <string name="Buy"> + Comprar + </string> + <string name="BuyforL$"> + Comprar por L$ + </string> + <string name="Stone"> + Pedra + </string> + <string name="Metal"> + Metal + </string> + <string name="Glass"> + Vidro + </string> + <string name="Wood"> + Madeira + </string> + <string name="Flesh"> + Carne + </string> + <string name="Plastic"> + Plástico + </string> + <string name="Rubber"> + Borrracha + </string> + <string name="Light"> + Luz + </string> + <string name="KBShift"> + Shift + </string> + <string name="KBCtrl"> + Ctrl + </string> + <string name="Chest"> + Peito + </string> + <string name="Skull"> + Crânio + </string> + <string name="Left Shoulder"> + Ombro esquerdo + </string> + <string name="Right Shoulder"> + Ombro direito + </string> + <string name="Left Hand"> + Mão esquerda + </string> + <string name="Right Hand"> + Mão direita + </string> + <string name="Left Foot"> + Pé esquerdo + </string> + <string name="Right Foot"> + Pé direito + </string> + <string name="Spine"> + Espinha + </string> + <string name="Pelvis"> + Pélvis + </string> + <string name="Mouth"> + Boca + </string> + <string name="Chin"> + Queixo + </string> + <string name="Left Ear"> + Orelha esquerda + </string> + <string name="Right Ear"> + Orelha direita + </string> + <string name="Left Eyeball"> + Globo ocular esquerdo + </string> + <string name="Right Eyeball"> + Globo ocular direito + </string> + <string name="Nose"> + Nariz + </string> + <string name="R Upper Arm"> + Braço superior D + </string> + <string name="R Forearm"> + Antebraço D + </string> + <string name="L Upper Arm"> + Braço superior E + </string> + <string name="L Forearm"> + Antebraço E + </string> + <string name="Right Hip"> + Quadril direito + </string> + <string name="R Upper Leg"> + Coxa D + </string> + <string name="R Lower Leg"> + Perna inferior D + </string> + <string name="Left Hip"> + Quadril esquerdo + </string> + <string name="L Upper Leg"> + Coxa E + </string> + <string name="L Lower Leg"> + Perna inferior E + </string> + <string name="Stomach"> + Estômago + </string> + <string name="Left Pec"> + Peitoral E + </string> + <string name="Right Pec"> + Peitoral D + </string> + <string name="YearsMonthsOld"> + [AGEYEARS] [AGEMONTHS] de idade + </string> + <string name="YearsOld"> + [AGEYEARS] de idade + </string> + <string name="MonthsOld"> + [AGEMONTHS] de idade + </string> + <string name="WeeksOld"> + [AGEWEEKS] de idade + </string> + <string name="DaysOld"> + [AGEDAYS] de idade + </string> + <string name="TodayOld"> + Cadastrado hoje + </string> + <string name="AgeYearsA"> + [COUNT] ano + </string> + <string name="AgeYearsB"> + [COUNT] anos + </string> + <string name="AgeYearsC"> + [COUNT] anos + </string> + <string name="AgeMonthsA"> + [COUNT] mês + </string> + <string name="AgeMonthsB"> + [COUNT] meses + </string> + <string name="AgeMonthsC"> + [COUNT] meses + </string> + <string name="AgeWeeksA"> + [COUNT] semana + </string> + <string name="AgeWeeksB"> + [COUNT] semanas + </string> + <string name="AgeWeeksC"> + [COUNT] semanas + </string> + <string name="AgeDaysA"> + [COUNT] dia + </string> + <string name="AgeDaysB"> + [COUNT] dias + </string> + <string name="AgeDaysC"> + [COUNT] dias + </string> + <string name="GroupMembersA"> + [COUNT] membro + </string> + <string name="GroupMembersB"> + [COUNT] membros + </string> + <string name="GroupMembersC"> + [COUNT] membros + </string> + <string name="AcctTypeResident"> + Residente + </string> + <string name="AcctTypeTrial"> + Prova + </string> + <string name="AcctTypeCharterMember"> + Lista de membros + </string> + <string name="AcctTypeEmployee"> + Empregado da Linden Lab + </string> + <string name="PaymentInfoUsed"> + Dados de pagamento usados + </string> + <string name="PaymentInfoOnFile"> + Dados de pagamento fornecidos + </string> + <string name="NoPaymentInfoOnFile"> + Nenhum dado de pagamento + </string> + <string name="AgeVerified"> + Idade comprovada + </string> + <string name="NotAgeVerified"> + Idade não comprovada + </string> + <string name="Center 2"> + Centro 2 + </string> + <string name="Top Right"> + Topo direita + </string> + <string name="Top"> + Topo + </string> + <string name="Top Left"> + Topo esquerda + </string> + <string name="Center"> + Centro + </string> + <string name="Bottom Left"> + Inferior esquerdo + </string> + <string name="Bottom"> + Inferior + </string> + <string name="Bottom Right"> + Inferior direito + </string> + <string name="CompileQueueDownloadedCompiling"> + Baixado, agora compilando + </string> + <string name="CompileQueueScriptNotFound"> + Script não encontrado no servidor. + </string> + <string name="CompileQueueProblemDownloading"> + Problema no download + </string> + <string name="CompileQueueInsufficientPermDownload"> + Permissões insuficientes para fazer o download do script. + </string> + <string name="CompileQueueInsufficientPermFor"> + Permissões insuficientes para + </string> + <string name="CompileQueueUnknownFailure"> + Falha desconhecida para download + </string> + <string name="CompileQueueTitle"> + Progresso do recompilamento + </string> + <string name="CompileQueueStart"> + recompilar + </string> + <string name="ResetQueueTitle"> + Reset Progresso + </string> + <string name="ResetQueueStart"> + Zerar + </string> + <string name="RunQueueTitle"> + Definir funcionamento do progresso + </string> + <string name="RunQueueStart"> + deixar funcionando + </string> + <string name="NotRunQueueTitle"> + Definir progresso não funcionando + </string> + <string name="NotRunQueueStart"> + não deixar funcionando + </string> + <string name="CompileSuccessful"> + Compilação bem sucedida + </string> + <string name="CompileSuccessfulSaving"> + Compilação bem sucedida, salvando... + </string> + <string name="SaveComplete"> + Salvo. + </string> + <string name="ObjectOutOfRange"> + Script (objeto fora de alcance) + </string> + <string name="GodToolsObjectOwnedBy"> + Objeto [OBJECT] de propriedade de [OWNER] + </string> + <string name="GroupsNone"> + nenhum + </string> + <string name="Group" value="(grupo)"/> + <string name="Unknown"> + (Desconhecido) + </string> + <string name="SummaryForTheWeek" value="Resumo para esta semana, com inÃcio em"/> + <string name="NextStipendDay" value="Próximo dia de salário é"/> + <string name="GroupIndividualShare" value="Grupo Divisão individualI"/> + <string name="Balance"> + Balanço + </string> + <string name="Credits"> + Créditos + </string> + <string name="Debits"> + Débitos + </string> + <string name="Total"> + Total + </string> + <string name="NoGroupDataFound"> + Não há dados de grupo + </string> + <string name="IMParentEstate"> + Propriedade-pai + </string> + <string name="IMMainland"> + continente + </string> + <string name="IMTeen"> + adolescente + </string> + <string name="RegionInfoError"> + erro + </string> + <string name="RegionInfoAllEstatesOwnedBy"> + todas as propriedades pertencem a [OWNER] + </string> + <string name="RegionInfoAllEstatesYouOwn"> + todas as propriedades que você possui + </string> + <string name="RegionInfoAllEstatesYouManage"> + todas as propriedades que você gerencia para [OWNER] + </string> + <string name="RegionInfoAllowedResidents"> + Residentes autorizados: ([ALLOWEDAGENTS], max [MAXACCESS]) + </string> + <string name="RegionInfoAllowedGroups"> + Grupos permitidos: ([ALLOWEDGROUPS], max [MAXACCESS]) + </string> + <string name="ScriptLimitsParcelScriptMemory"> + Memória de scripts no lote + </string> + <string name="ScriptLimitsParcelsOwned"> + Lotes listados: [PARCELS] + </string> + <string name="ScriptLimitsMemoryUsed"> + Memória usada: [COUNT] kb de [MAX] kb; [AVAILABLE] kb disponÃveis + </string> + <string name="ScriptLimitsMemoryUsedSimple"> + Memória usada: [COUNT] kb + </string> + <string name="ScriptLimitsParcelScriptURLs"> + URL dos scripts do lote + </string> + <string name="ScriptLimitsURLsUsed"> + URLs usados: [COUNT] de [MAX]; [AVAILABLE] disponÃveis + </string> + <string name="ScriptLimitsURLsUsedSimple"> + URLs usados: [COUNT] + </string> + <string name="ScriptLimitsRequestError"> + Erro ao solicitar dados + </string> + <string name="ScriptLimitsRequestNoParcelSelected"> + Nenhum lote foi selecionado + </string> + <string name="ScriptLimitsRequestWrongRegion"> + Erro: dados de script só disponÃveis na região da posição atual + </string> + <string name="ScriptLimitsRequestWaiting"> + Obtendo dados... + </string> + <string name="ScriptLimitsRequestDontOwnParcel"> + Você não está autorizado a examinar este lote. + </string> + <string name="SITTING_ON"> + Sentado em + </string> + <string name="ATTACH_CHEST"> + Peito + </string> + <string name="ATTACH_HEAD"> + Cabeça + </string> + <string name="ATTACH_LSHOULDER"> + Ombro esquerdo + </string> + <string name="ATTACH_RSHOULDER"> + Ombro direito + </string> + <string name="ATTACH_LHAND"> + Mão esquerda + </string> + <string name="ATTACH_RHAND"> + Mão direita + </string> + <string name="ATTACH_LFOOT"> + Pé esquerdo + </string> + <string name="ATTACH_RFOOT"> + Pé direito + </string> + <string name="ATTACH_BACK"> + Atrás + </string> + <string name="ATTACH_PELVIS"> + Pélvis + </string> + <string name="ATTACH_MOUTH"> + Boca + </string> + <string name="ATTACH_CHIN"> + Queixo + </string> + <string name="ATTACH_LEAR"> + Orelha esquerda + </string> + <string name="ATTACH_REAR"> + Orelha direita + </string> + <string name="ATTACH_LEYE"> + Olho esquerdo + </string> + <string name="ATTACH_REYE"> + Olho direito + </string> + <string name="ATTACH_NOSE"> + Nariz + </string> + <string name="ATTACH_RUARM"> + Braço direito + </string> + <string name="ATTACH_RLARM"> + Antebraço direito + </string> + <string name="ATTACH_LUARM"> + Braço esquerdo + </string> + <string name="ATTACH_LLARM"> + Antebraço esquerdo + </string> + <string name="ATTACH_RHIP"> + Quadril direito + </string> + <string name="ATTACH_RULEG"> + Coxa direita + </string> + <string name="ATTACH_RLLEG"> + Perna direita + </string> + <string name="ATTACH_LHIP"> + Quadril esquerdo + </string> + <string name="ATTACH_LULEG"> + Coxa esquerda + </string> + <string name="ATTACH_LLLEG"> + Perna esquerda + </string> + <string name="ATTACH_BELLY"> + Barriga + </string> + <string name="ATTACH_RPEC"> + Peitorais D + </string> + <string name="ATTACH_LPEC"> + Peitorais E + </string> + <string name="ATTACH_HUD_CENTER_2"> + HUD Central 2 + </string> + <string name="ATTACH_HUD_TOP_RIGHT"> + HUD superior direito + </string> + <string name="ATTACH_HUD_TOP_CENTER"> + HUD centro superior + </string> + <string name="ATTACH_HUD_TOP_LEFT"> + HUD superior esquerdo + </string> + <string name="ATTACH_HUD_CENTER_1"> + HUD Central 1 + </string> + <string name="ATTACH_HUD_BOTTOM_LEFT"> + HUD esquerda inferior + </string> + <string name="ATTACH_HUD_BOTTOM"> + HUD inferior + </string> + <string name="ATTACH_HUD_BOTTOM_RIGHT"> + HUD direito inferior + </string> + <string name="CursorPos"> + Linha [LINE], Coluna [COLUMN] + </string> + <string name="PanelDirCountFound"> + [COUNT] encontrado + </string> + <string name="PanelContentsNewScript"> + Novo Script + </string> + <string name="PanelContentsTooltip"> + Conteúdo do objeto + </string> + <string name="BusyModeResponseDefault"> + O residente para o qual escreveu está no modo 'ocupado', ou seja, ele prefere não receber nada no momento. Sua mensagem será exibida como uma MI mais tarde. + </string> + <string name="MuteByName"> + (por nome) + </string> + <string name="MuteAgent"> + (residente) + </string> + <string name="MuteObject"> + (objeto) + </string> + <string name="MuteGroup"> + (grupo) + </string> + <string name="MuteExternal"> + (Externo) + </string> + <string name="RegionNoCovenant"> + Não foi definido um contrato para essa região. + </string> + <string name="RegionNoCovenantOtherOwner"> + Não foi definido um contrato para essa Região. O terreno nesta região está sendo vendido pelo Proprietário, não pela Linden Lab. Favor contatar o Proprietário da região para detalhes de venda. + </string> + <string name="covenant_last_modified" value="Última modificação:"/> + <string name="none_text" value="(nenhum)"/> + <string name="never_text" value="(nunca)"/> + <string name="GroupOwned"> + Propriedade do Grupo + </string> + <string name="Public"> + Público + </string> + <string name="ClassifiedClicksTxt"> + Cliques: [TELEPORT] teletransporte, [MAP] mapa, [PROFILE] perfil + </string> + <string name="ClassifiedUpdateAfterPublish"> + (vai atualizar depois de publicado) + </string> + <string name="NoPicksClassifiedsText"> + Você não criou nenhum Destaque ou Anúncio. Clique no botão "+" para criar um Destaque ou Anúncio. + </string> + <string name="NoAvatarPicksClassifiedsText"> + O usuário não tem nenhum destaque ou anúncio + </string> + <string name="PicksClassifiedsLoadingText"> + Carregando... + </string> + <string name="MultiPreviewTitle"> + Preview + </string> + <string name="MultiPropertiesTitle"> + Propriedades + </string> + <string name="InvOfferAnObjectNamed"> + um objeto chamado + </string> + <string name="InvOfferOwnedByGroup"> + possuÃdo pelo grupo + </string> + <string name="InvOfferOwnedByUnknownGroup"> + de um grupo desconhecido + </string> + <string name="InvOfferOwnedBy"> + de + </string> + <string name="InvOfferOwnedByUnknownUser"> + de usuário desconhecido + </string> + <string name="InvOfferGaveYou"> + deu a você + </string> + <string name="InvOfferYouDecline"> + Você recusa + </string> + <string name="InvOfferFrom"> + de + </string> + <string name="GroupMoneyTotal"> + Total + </string> + <string name="GroupMoneyBought"> + comprou + </string> + <string name="GroupMoneyPaidYou"> + pagou a você + </string> + <string name="GroupMoneyPaidInto"> + depositado + </string> + <string name="GroupMoneyBoughtPassTo"> + comprou passe para + </string> + <string name="GroupMoneyPaidFeeForEvent"> + pagou taxa para o evento + </string> + <string name="GroupMoneyPaidPrizeForEvent"> + pagou prêmio para o evento + </string> + <string name="GroupMoneyBalance"> + Saldo + </string> + <string name="GroupMoneyCredits"> + Créditos + </string> + <string name="GroupMoneyDebits"> + Débitos + </string> + <string name="ViewerObjectContents"> + Conteúdo + </string> + <string name="AcquiredItems"> + Itens adquiridos + </string> + <string name="Cancel"> + Cancelar + </string> + <string name="UploadingCosts"> + Carregar [NAME] custa L$ [AMOUNT] + </string> + <string name="BuyingCosts"> + Isso custa L$ [AMOUNT] + </string> + <string name="UnknownFileExtension"> + Extensão de arquivo desconhecida [.%s] +Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh + </string> + <string name="MuteObject2"> + Bloquear + </string> + <string name="AddLandmarkNavBarMenu"> + Adicionar marco... + </string> + <string name="EditLandmarkNavBarMenu"> + Editar marco... </string> <string name="accel-mac-control"> - ⌃ + ⌃ </string> <string name="accel-mac-command"> - ⌘ + ⌘ </string> <string name="accel-mac-option"> - ⌥ + ⌥ </string> <string name="accel-mac-shift"> - ⇧ + ⇧ </string> <string name="accel-win-control"> Ctrl+ @@ -505,80 +1751,1642 @@ <string name="accel-win-shift"> Shift+ </string> - <string name="GraphicsQualityLow"> + <string name="FileSaved"> + Arquivo salvo + </string> + <string name="Receiving"> + Recebendo + </string> + <string name="AM"> + AM + </string> + <string name="PM"> + PM + </string> + <string name="PST"> + PST + </string> + <string name="PDT"> + PDT + </string> + <string name="Forward"> + Avante + </string> + <string name="Left"> + Esquerda + </string> + <string name="Right"> + Direita + </string> + <string name="Back"> + Atrás + </string> + <string name="North"> + Norte + </string> + <string name="South"> + Sul + </string> + <string name="West"> + Oeste + </string> + <string name="East"> + Leste + </string> + <string name="Up"> + Acima + </string> + <string name="Down"> + Abaixo + </string> + <string name="Any Category"> + Qualquer categoria + </string> + <string name="Shopping"> + Compras + </string> + <string name="Land Rental"> + Aluguel de terrenos + </string> + <string name="Property Rental"> + Aluguel de propriedade + </string> + <string name="Special Attraction"> + Atração especial + </string> + <string name="New Products"> + Novos Produtos + </string> + <string name="Employment"> + Emprego + </string> + <string name="Wanted"> + Desejado + </string> + <string name="Service"> + Serviço + </string> + <string name="Personal"> + Pessoal + </string> + <string name="None"> + Nenhum + </string> + <string name="Linden Location"> + Locação Linden + </string> + <string name="Adult"> + Adulto + </string> + <string name="Arts&Culture"> + Artes e Cultura + </string> + <string name="Business"> + Negócios + </string> + <string name="Educational"> + Educacional + </string> + <string name="Gaming"> + Games + </string> + <string name="Hangout"> + Moradia + </string> + <string name="Newcomer Friendly"> + Para recém-chegados + </string> + <string name="Parks&Nature"> + Parques & Natureza + </string> + <string name="Residential"> + Residencial + </string> + <string name="Stage"> + Estágio + </string> + <string name="Other"> + Outros + </string> + <string name="Any"> + Qualquer + </string> + <string name="You"> + Você + </string> + <string name="Multiple Media"> + MÃdia múltipla + </string> + <string name="Play Media"> + Tocar/Pausar mÃdia + </string> + <string name="MBCmdLineError"> + Um erro foi encontrado analisando a linha de comando. +Consulte: http://wiki.secondlife.com/wiki/Client_parameters +Erro: + </string> + <string name="MBCmdLineUsg"> + [APP_NAME] Uso de linha de comando: + </string> + <string name="MBUnableToAccessFile"> + [APP_NAME] não é capaz de acessar um arquivo que ele precisa. + +Isto pode ocorrer porque você de alguma maneira tem várias cópias em execução, ou o seu sistema acredita de maneira incorreta que um arquivo está aberto. +Se a mensagem persistir, reinicie o computador e tente novamente. +Se o error persistir, pode ser necessário desinstalar completamente [APP_NAME] e reinstalá-lo. + </string> + <string name="MBFatalError"> + Erro fatal + </string> + <string name="MBRequiresAltiVec"> + [APP_NAME] exige processador com AltiVec (G4 ou superior). + </string> + <string name="MBAlreadyRunning"> + [APP_NAME] já está em execução. +Verifique a sua barra de tarefas para obter uma cópia do programa minimizado. +Se a mensagem persistir, reinicie o computador. + </string> + <string name="MBFrozenCrashed"> + [APP_NAME] parece ter congelado ou falhado na execução anterior. Enviar relatório de falha? + </string> + <string name="MBAlert"> + Alerta + </string> + <string name="MBNoDirectX"> + [APP_NAME] é incapaz de detectar o DirectX 9.0b ou superior. +[APP_NAME] usa o DirectX para a detecção de hardware e / ou controladores desatualizados que podem causar problemas de estabilidade, desempenho ruim e falhas. Embora você possa executar [APP_NAME] sem ele, nós recomendamos fortemente que utilize o DirectX 9.0b. + +Deseja continuar? + </string> + <string name="MBWarning"> + Aviso + </string> + <string name="MBNoAutoUpdate"> + Atualização automática ainda não está implementada para o Linux. +Faça o download da versão mais recente do www.secondlife.com. + </string> + <string name="MBRegClassFailed"> + RegisterClass falhou + </string> + <string name="MBError"> + Erro + </string> + <string name="MBFullScreenErr"> + Incapaz de funcionar com tela cheia de [WIDTH] x [HEIGHT]. +Executando em janela. + </string> + <string name="MBDestroyWinFailed"> + Erro de desligamento ao destruir janela (DestroyWindow() failed) + </string> + <string name="MBShutdownErr"> + Erro de desligamento + </string> + <string name="MBDevContextErr"> + Não é possÃvel fazer contexto do dispositivo GL + </string> + <string name="MBPixelFmtErr"> + Não é possÃvel encontrar um formato de pixel adequado + </string> + <string name="MBPixelFmtDescErr"> + Não é possÃvel encontrar descrição de formato de pixel + </string> + <string name="MBTrueColorWindow"> + [APP_NAME] requer True Color (32-bit) para ser executado. +Por favor, vá para as configurações de vÃdeo do computador e defina o modo de cores para 32-bit. + </string> + <string name="MBAlpha"> + [APP_NAME] é incapaz de executar porque ele não consegue obter um canal alpha de 8 bits. Geralmente isso ocorre devido a problemas de drivers da placa de vÃdeo. +Por favor, certifique-se que os últimos drivers da placa de vÃdeo estão instalados. +Também não se esqueça de definir seu monitor para True Color (32-bit), em painéis de controle Configurações> Display>. +Se você continuar a receber esta mensagem, contate o [SUPPORT_SITE]. + </string> + <string name="MBPixelFmtSetErr"> + Não é possÃvel definir o formato de pixel + </string> + <string name="MBGLContextErr"> + Não é possÃvel criar o contexto de renderização GL + </string> + <string name="MBGLContextActErr"> + Não é possÃvel ativar o contexto de renderização GL + </string> + <string name="MBVideoDrvErr"> + [APP_NAME] é incapaz de funcionar por causa do seu driver de video não ter sido instalado corretamente, estão desatualizados, ou não são suportados pelo hardware. Por favor certifique-se que você possui os drivers de placa de vÃdeo mais recente e mesmo assim, tente reinstalá-los. + +If you continue to receive this message, contact the [SUPPORT_SITE]. + </string> + <string name="5 O'Clock Shadow"> + Barba por fazer + </string> + <string name="All White"> + Todo branco + </string> + <string name="Anime Eyes"> + Olhos de Anime + </string> + <string name="Arced"> + Arqueados + </string> + <string name="Arm Length"> + Comprimento do braço + </string> + <string name="Attached"> + Anexado + </string> + <string name="Attached Earlobes"> + Lóbulos da orelha anexados + </string> + <string name="Back Fringe"> + corte traseiro + </string> + <string name="Baggy"> + folgado + </string> + <string name="Bangs"> + Franja + </string> + <string name="Beady Eyes"> + Olhos pequenos + </string> + <string name="Belly Size"> + Tamanho da barriga + </string> + <string name="Big"> + Grande + </string> + <string name="Big Butt"> + Bunda grande + </string> + <string name="Big Hair Back"> + Cabelo volumoso: Trás + </string> + <string name="Big Hair Front"> + Cabelo volumoso: Frente + </string> + <string name="Big Hair Top"> + Cabelo volumoso: Topo + </string> + <string name="Big Head"> + cabeça grande + </string> + <string name="Big Pectorals"> + Peitorais grandes + </string> + <string name="Big Spikes"> + Pontas grandes + </string> + <string name="Black"> + Negro + </string> + <string name="Blonde"> + Loiro + </string> + <string name="Blonde Hair"> + Cabelo loiro + </string> + <string name="Blush"> + Blush + </string> + <string name="Blush Color"> + Cor do blush + </string> + <string name="Blush Opacity"> + Opacidade do blush + </string> + <string name="Body Definition"> + Definição do corpo + </string> + <string name="Body Fat"> + Gordura + </string> + <string name="Body Freckles"> + Sardas + </string> + <string name="Body Thick"> + Corpo cheio + </string> + <string name="Body Thickness"> + Ossatura + </string> + <string name="Body Thin"> + Corpo magro + </string> + <string name="Bow Legged"> + Pernas arqueadas + </string> + <string name="Breast Buoyancy"> + Caimento dos seios + </string> + <string name="Breast Cleavage"> + Separação dos seios + </string> + <string name="Breast Size"> + Tamanho dos seios + </string> + <string name="Bridge Width"> + Largura do nariz + </string> + <string name="Broad"> + Largo + </string> + <string name="Brow Size"> + Tamanho da sobrancelha + </string> + <string name="Bug Eyes"> + Olhos saltados + </string> + <string name="Bugged Eyes"> + Olhos esbugalhados + </string> + <string name="Bulbous"> + Bulbos + </string> + <string name="Bulbous Nose"> + Nariz em bulbo + </string> + <string name="Bushy Eyebrows"> + Sobrancelhas grossas + </string> + <string name="Bushy Hair"> + Cabelo grosso + </string> + <string name="Butt Size"> + Tamanho do traseiro + </string> + <string name="bustle skirt"> + Saia armada + </string> + <string name="no bustle"> + Saia reta + </string> + <string name="more bustle"> + Mais + </string> + <string name="Chaplin"> + Chaplin + </string> + <string name="Cheek Bones"> + Maçãs do rosto + </string> + <string name="Chest Size"> + Tamanho do peito + </string> + <string name="Chin Angle"> + Ângulo do queixo + </string> + <string name="Chin Cleft"> + Fissura do queixo + </string> + <string name="Chin Curtains"> + Barba de contorno + </string> + <string name="Chin Depth"> + Profundidade do queixo + </string> + <string name="Chin Heavy"> + Queixo pronunciado + </string> + <string name="Chin In"> + Queixo para dentro + </string> + <string name="Chin Out"> + Queixo para fora + </string> + <string name="Chin-Neck"> + Queixo-pescoço + </string> + <string name="Clear"> + Limpar + </string> + <string name="Cleft"> + Fenda + </string> + <string name="Close Set Eyes"> + Fechar conjunto de olhos + </string> + <string name="Closed"> + Fechado + </string> + <string name="Closed Back"> + Trás fechada + </string> + <string name="Closed Front"> + Frente fechada + </string> + <string name="Closed Left"> + Esquerda fechada + </string> + <string name="Closed Right"> + Direita fechada + </string> + <string name="Coin Purse"> + Pouco volume + </string> + <string name="Collar Back"> + Colarinho posterior + </string> + <string name="Collar Front"> + Colarinho anterior + </string> + <string name="Corner Down"> + Canto para baixo + </string> + <string name="Corner Up"> + Canto para cima + </string> + <string name="Creased"> + Vincado + </string> + <string name="Crooked Nose"> + Nariz torto + </string> + <string name="Cuff Flare"> + Bainha larga + </string> + <string name="Dark"> + Escuro + </string> + <string name="Dark Green"> + Verde escuro + </string> + <string name="Darker"> + Mais escuro + </string> + <string name="Deep"> + Profundidade + </string> + <string name="Default Heels"> + Salto padrão + </string> + <string name="Dense"> + Densidade + </string> + <string name="Double Chin"> + Queixo duplo + </string> + <string name="Downturned"> + Curvado para baixo + </string> + <string name="Duffle Bag"> + Mais volume + </string> + <string name="Ear Angle"> + Ângulo da orelha + </string> + <string name="Ear Size"> + Tamanho da orelha + </string> + <string name="Ear Tips"> + Pontas das orelhas + </string> + <string name="Egg Head"> + Cabeça oval + </string> + <string name="Eye Bags"> + Olheiras + </string> + <string name="Eye Color"> + Cor dos olhos + </string> + <string name="Eye Depth"> + Profundidade dos olhos + </string> + <string name="Eye Lightness"> + Luminosidade dos olhos + </string> + <string name="Eye Opening"> + Abertura dos olhos + </string> + <string name="Eye Pop"> + Olho saltado + </string> + <string name="Eye Size"> + Tamanho dos olhos + </string> + <string name="Eye Spacing"> + Espaçamento dos olhos + </string> + <string name="Eyebrow Arc"> + Arco da sobrancelha + </string> + <string name="Eyebrow Density"> + Densidade da sobrancelha + </string> + <string name="Eyebrow Height"> + Altura da sobrancelha + </string> + <string name="Eyebrow Points"> + Pontas da sobrancelha + </string> + <string name="Eyebrow Size"> + Tamanho da sobrancelha + </string> + <string name="Eyelash Length"> + Comprimento das pestanas + </string> + <string name="Eyeliner"> + Delineador + </string> + <string name="Eyeliner Color"> + Cor do delineador + </string> + <string name="Eyes Bugged"> + Olhos esbugalhados + </string> + <string name="Face Shear"> + Face raspada + </string> + <string name="Facial Definition"> + Definição facial + </string> + <string name="Far Set Eyes"> + Distância entre os olhos + </string> + <string name="Fat Lips"> + Lábios carnudos + </string> + <string name="Female"> + Feminino + </string> + <string name="Fingerless"> + Dedos + </string> + <string name="Fingers"> + Dedos + </string> + <string name="Flared Cuffs"> + Punhos largos + </string> + <string name="Flat"> + Chato + </string> + <string name="Flat Butt"> + Traseiro chato + </string> + <string name="Flat Head"> + Cabeça chata + </string> + <string name="Flat Toe"> + Dedos dos pés chatos + </string> + <string name="Foot Size"> + Tamanho dos pés + </string> + <string name="Forehead Angle"> + Ângulo da testa + </string> + <string name="Forehead Heavy"> + Testa pronunciada + </string> + <string name="Freckles"> + Sardas + </string> + <string name="Front Fringe"> + Franja + </string> + <string name="Full Back"> + Trás cheia + </string> + <string name="Full Eyeliner"> + Delienador cheio + </string> + <string name="Full Front"> + Frente cheia + </string> + <string name="Full Hair Sides"> + Cabelos laterais cheios + </string> + <string name="Full Sides"> + Lados cheios + </string> + <string name="Glossy"> + Brilhante + </string> + <string name="Glove Fingers"> + Dedos da luva + </string> + <string name="Glove Length"> + Comprimento das luvas + </string> + <string name="Hair"> + Cabelo + </string> + <string name="Hair Back"> + Cabelo: Trás + </string> + <string name="Hair Front"> + Cabelo: Frente + </string> + <string name="Hair Sides"> + Cabelos: Lateral + </string> + <string name="Hair Sweep"> + Cabelo penteado + </string> + <string name="Hair Thickess"> + Espessura do cabelo + </string> + <string name="Hair Thickness"> + Espessura do cabelo + </string> + <string name="Hair Tilt"> + Divisão do cabelo + </string> + <string name="Hair Tilted Left"> + Divistão do cabelo esquerda + </string> + <string name="Hair Tilted Right"> + Divisão do cabelo direita + </string> + <string name="Hair Volume"> + Cabelo: Volume + </string> + <string name="Hand Size"> + Tamanho das mãos + </string> + <string name="Handlebars"> + Bigode + </string> + <string name="Head Length"> + Comprimento da cabeça + </string> + <string name="Head Shape"> + Formato da cabeça + </string> + <string name="Head Size"> + Tamanho da cabeça + </string> + <string name="Head Stretch"> + Extensão da cabeça + </string> + <string name="Heel Height"> + Altura do salto + </string> + <string name="Heel Shape"> + Formato do salto + </string> + <string name="Height"> + Altura + </string> + <string name="High"> + Alto + </string> + <string name="High Heels"> + Salto alto + </string> + <string name="High Jaw"> + Maxilar alto + </string> + <string name="High Platforms"> + Plataformas altas + </string> + <string name="High and Tight"> + Alto e justo + </string> + <string name="Higher"> + Mais alto + </string> + <string name="Hip Length"> + Comprimento do quadril + </string> + <string name="Hip Width"> + Largura do quadril + </string> + <string name="In"> + Dentro + </string> + <string name="In Shdw Color"> + Cor da sombra interna + </string> + <string name="In Shdw Opacity"> + Opacidade da sombra interna + </string> + <string name="Inner Eye Corner"> + Canto interno dos olhos + </string> + <string name="Inner Eye Shadow"> + Sombra interna dos olhos + </string> + <string name="Inner Shadow"> + Sombra interna + </string> + <string name="Jacket Length"> + Comprimento da blusa + </string> + <string name="Jacket Wrinkles"> + Dobras da jaqueta + </string> + <string name="Jaw Angle"> + Ângulo da mandÃbula + </string> + <string name="Jaw Jut"> + Posição do maxilar + </string> + <string name="Jaw Shape"> + Formato do maxilar + </string> + <string name="Join"> + Juntar + </string> + <string name="Jowls"> + Papo + </string> + <string name="Knee Angle"> + Ângulo do joelho + </string> + <string name="Knock Kneed"> + Joelhos para dentro + </string> + <string name="Large"> + Grande + </string> + <string name="Large Hands"> + Mãos grandes + </string> + <string name="Left Part"> + Parte esquerda + </string> + <string name="Leg Length"> + Comprimento da perna + </string> + <string name="Leg Muscles"> + Musculatura da perna + </string> + <string name="Less"> + Menos + </string> + <string name="Less Body Fat"> + Menos gordura + </string> + <string name="Less Curtains"> + Menos barba + </string> + <string name="Less Freckles"> + Menos sardas + </string> + <string name="Less Full"> + Menos + </string> + <string name="Less Gravity"> + Menos gravidade + </string> + <string name="Less Love"> + Menos excesso + </string> + <string name="Less Muscles"> + Menos músculos + </string> + <string name="Less Muscular"> + Menos musculoso + </string> + <string name="Less Rosy"> + Menos rosado + </string> + <string name="Less Round"> + Menos arredondado + </string> + <string name="Less Saddle"> + Menos ancas + </string> + <string name="Less Square"> + Menos quadrado + </string> + <string name="Less Volume"> + Menos volume + </string> + <string name="Less soul"> + Menos alma + </string> + <string name="Lighter"> + Lighter + </string> + <string name="Lip Cleft"> + Fenda dos lábios + </string> + <string name="Lip Cleft Depth"> + Profundidade da fenda dos lábios + </string> + <string name="Lip Fullness"> + Volume dos lábios + </string> + <string name="Lip Pinkness"> + Rosado dos lábios + </string> + <string name="Lip Ratio"> + Proporção dos lábios + </string> + <string name="Lip Thickness"> + Espessura dos lábios + </string> + <string name="Lip Width"> + Largura dos lábios + </string> + <string name="Lipgloss"> + Brilho dos lábios + </string> + <string name="Lipstick"> + Batom + </string> + <string name="Lipstick Color"> + Cor do batom + </string> + <string name="Long"> + Longo + </string> + <string name="Long Head"> + Cabeça alongada + </string> + <string name="Long Hips"> + Lábios longos + </string> + <string name="Long Legs"> + Pernas longas + </string> + <string name="Long Neck"> + Pescoço longo + </string> + <string name="Long Pigtails"> + Chiquinhas longas + </string> + <string name="Long Ponytail"> + Rabo de cavalo longo + </string> + <string name="Long Torso"> + Torso longo + </string> + <string name="Long arms"> + Braços longos + </string> + <string name="Loose Pants"> + Pantalonas + </string> + <string name="Loose Shirt"> + Camisa folgada + </string> + <string name="Loose Sleeves"> + Mangas folgadas + </string> + <string name="Love Handles"> + Pneu + </string> + <string name="Low"> Baixo </string> - <string name="GraphicsQualityMid"> - Meio + <string name="Low Heels"> + Salto baixo </string> - <string name="GraphicsQualityHigh"> + <string name="Low Jaw"> + Maxilar baixo + </string> + <string name="Low Platforms"> + Plataformas baixas + </string> + <string name="Low and Loose"> + Baixo e solto + </string> + <string name="Lower"> + Mais baixo + </string> + <string name="Lower Bridge"> + Mais baixa + </string> + <string name="Lower Cheeks"> + Bochechas abaixadas + </string> + <string name="Male"> + Masculino + </string> + <string name="Middle Part"> + Parte do meio + </string> + <string name="More"> + Mais + </string> + <string name="More Blush"> + Mais blush + </string> + <string name="More Body Fat"> + Mais gordura + </string> + <string name="More Curtains"> + Mais barba + </string> + <string name="More Eyeshadow"> + Mais sombra dos olhos + </string> + <string name="More Freckles"> + Mais sardas + </string> + <string name="More Full"> + Mais volume + </string> + <string name="More Gravity"> + Mais gravidade + </string> + <string name="More Lipstick"> + Mais batom + </string> + <string name="More Love"> + Mais cintura + </string> + <string name="More Lower Lip"> + Mais lábio inferior + </string> + <string name="More Muscles"> + Mais músculos + </string> + <string name="More Muscular"> + Mais musculoso + </string> + <string name="More Rosy"> + Mais rosado + </string> + <string name="More Round"> + Mais arredondado + </string> + <string name="More Saddle"> + Mais ancas + </string> + <string name="More Sloped"> + Mais inclinado + </string> + <string name="More Square"> + Mais quadrado + </string> + <string name="More Upper Lip"> + Mais lábios superiores + </string> + <string name="More Vertical"> + Mais vertical + </string> + <string name="More Volume"> + Mais volume + </string> + <string name="More soul"> + Mais alma + </string> + <string name="Moustache"> + Bigode + </string> + <string name="Mouth Corner"> + Canto da boca + </string> + <string name="Mouth Position"> + Posição da boca + </string> + <string name="Mowhawk"> + Moicano + </string> + <string name="Muscular"> + Muscular + </string> + <string name="Mutton Chops"> + Costeletas + </string> + <string name="Nail Polish"> + Esmate das unhas + </string> + <string name="Nail Polish Color"> + Cor do esmalte das unhas + </string> + <string name="Narrow"> + Estreito + </string> + <string name="Narrow Back"> + Costas estreitas + </string> + <string name="Narrow Front"> + Frente estreita + </string> + <string name="Narrow Lips"> + Lábios estreitos + </string> + <string name="Natural"> + Natural + </string> + <string name="Neck Length"> + Comprimento do pescoço + </string> + <string name="Neck Thickness"> + Espessura do pescoço + </string> + <string name="No Blush"> + Sem blush + </string> + <string name="No Eyeliner"> + Sem delineador + </string> + <string name="No Eyeshadow"> + Sem sombra + </string> + <string name="No Lipgloss"> + Sem brilho + </string> + <string name="No Lipstick"> + Sem batom + </string> + <string name="No Part"> + Sem parte + </string> + <string name="No Polish"> + Sem esmalte + </string> + <string name="No Red"> + Sem vermelho + </string> + <string name="No Spikes"> + Sem pontas + </string> + <string name="No White"> + Sem branco + </string> + <string name="No Wrinkles"> + Sem dobras + </string> + <string name="Normal Lower"> + Normal inferior + </string> + <string name="Normal Upper"> + Normal superior + </string> + <string name="Nose Left"> + Nariz para esquerda + </string> + <string name="Nose Right"> + Nariz para direita + </string> + <string name="Nose Size"> + Tamanho do nariz + </string> + <string name="Nose Thickness"> + Espessura do nariz + </string> + <string name="Nose Tip Angle"> + Ângulo da ponta do nariz + </string> + <string name="Nose Tip Shape"> + Formato da ponta do nariz + </string> + <string name="Nose Width"> + Largura do nariz + </string> + <string name="Nostril Division"> + Divisão das narinas + </string> + <string name="Nostril Width"> + Largura das narinas + </string> + <string name="Opaque"> + Opaco + </string> + <string name="Open"> + Abrir + </string> + <string name="Open Back"> + Aberto atrás + </string> + <string name="Open Front"> + Aberto na frente + </string> + <string name="Open Left"> + Aberto esquerdo + </string> + <string name="Open Right"> + Aberto direito + </string> + <string name="Orange"> + Laranja + </string> + <string name="Out"> + Fora + </string> + <string name="Out Shdw Color"> + Cor da sombra externa + </string> + <string name="Out Shdw Opacity"> + Opacidade da sombra externa + </string> + <string name="Outer Eye Corner"> + Canto externo do olho + </string> + <string name="Outer Eye Shadow"> + Sombra externa do olho + </string> + <string name="Outer Shadow"> + Sombra externa + </string> + <string name="Overbite"> + Má oclusão + </string> + <string name="Package"> + Púbis + </string> + <string name="Painted Nails"> + Unhas pintadas + </string> + <string name="Pale"> + Pálido + </string> + <string name="Pants Crotch"> + Cavalo da calça + </string> + <string name="Pants Fit"> + Caimento das calças + </string> + <string name="Pants Length"> + Comprimento das calças + </string> + <string name="Pants Waist"> + Cintura da calça + </string> + <string name="Pants Wrinkles"> + Dobras das calças + </string> + <string name="Part"> + Parte + </string> + <string name="Part Bangs"> + Divisão da franja + </string> + <string name="Pectorals"> + Peitorais + </string> + <string name="Pigment"> + Pigmento + </string> + <string name="Pigtails"> + Chiquinhas + </string> + <string name="Pink"> + Rosa + </string> + <string name="Pinker"> + Mais rosado + </string> + <string name="Platform Height"> + Altura da plataforma + </string> + <string name="Platform Width"> + Largura da plataforma + </string> + <string name="Pointy"> + Pontudo + </string> + <string name="Pointy Heels"> + Salto agulha + </string> + <string name="Ponytail"> + Rabo de cavalo + </string> + <string name="Poofy Skirt"> + Saia bufante + </string> + <string name="Pop Left Eye"> + Olho saltado esquerdo + </string> + <string name="Pop Right Eye"> + Olho saltado direito + </string> + <string name="Puffy"> + Inchado + </string> + <string name="Puffy Eyelids"> + Pálpebras inchadas + </string> + <string name="Rainbow Color"> + Cor do arco Ãris + </string> + <string name="Red Hair"> + Cabelo ruivo + </string> + <string name="Regular"> + Normal + </string> + <string name="Right Part"> + Parte direita + </string> + <string name="Rosy Complexion"> + Rosado da face + </string> + <string name="Round"> + Arredondado + </string> + <string name="Ruddiness"> + Rubor + </string> + <string name="Ruddy"> + Corado + </string> + <string name="Rumpled Hair"> + Cabelo desalinhado + </string> + <string name="Saddle Bags"> + Culote + </string> + <string name="Scrawny Leg"> + Pernas magricelas + </string> + <string name="Separate"> + Separar + </string> + <string name="Shallow"> + Raso + </string> + <string name="Shear Back"> + Trás rente + </string> + <string name="Shear Face"> + Face raspada + </string> + <string name="Shear Front"> + Frente rente + </string> + <string name="Shear Left Up"> + Esquerda rente para cima + </string> + <string name="Shear Right Up"> + Trás rente para cima + </string> + <string name="Sheared Back"> + Rente atrás + </string> + <string name="Sheared Front"> + Rente frente + </string> + <string name="Shift Left"> + Deslocar p/ esquerda + </string> + <string name="Shift Mouth"> + Deslocar boca + </string> + <string name="Shift Right"> + Deslocar p/ direita + </string> + <string name="Shirt Bottom"> + Barra da camisa + </string> + <string name="Shirt Fit"> + Ajuste da camisa + </string> + <string name="Shirt Wrinkles"> + +/- amassada + </string> + <string name="Shoe Height"> + Altura do sapato + </string> + <string name="Short"> + Curto + </string> + <string name="Short Arms"> + Braços curtos + </string> + <string name="Short Legs"> + Pernas curtas + </string> + <string name="Short Neck"> + Pescoço curto + </string> + <string name="Short Pigtails"> + Chiquinhas curtas + </string> + <string name="Short Ponytail"> + Rabo de cavalo curto + </string> + <string name="Short Sideburns"> + Costeletas curtas + </string> + <string name="Short Torso"> + Tronco curto + </string> + <string name="Short hips"> + Quadril curto + </string> + <string name="Shoulders"> + Ombros + </string> + <string name="Side Fringe"> + pontas laterais + </string> + <string name="Sideburns"> + Costeletas + </string> + <string name="Sides Hair"> + Cabelo lateral + </string> + <string name="Sides Hair Down"> + Cabelo lateral long + </string> + <string name="Sides Hair Up"> + Cabelo lateral superior + </string> + <string name="Skinny Neck"> + Pescoço fino + </string> + <string name="Skirt Fit"> + Ajuste de saia + </string> + <string name="Skirt Length"> + Comprimento da saia + </string> + <string name="Slanted Forehead"> + Testa inclinada + </string> + <string name="Sleeve Length"> + Comprimento da manga + </string> + <string name="Sleeve Looseness"> + Folga da manga + </string> + <string name="Slit Back"> + Abertura : Atrás + </string> + <string name="Slit Front"> + Abertura: Frente + </string> + <string name="Slit Left"> + Abertura: Esquerda + </string> + <string name="Slit Right"> + Abertura: Direita + </string> + <string name="Small"> + Pequeno + </string> + <string name="Small Hands"> + Mãos pequenas + </string> + <string name="Small Head"> + Cabeça pequena + </string> + <string name="Smooth"> + Suavizar + </string> + <string name="Smooth Hair"> + Suavizar cabelo + </string> + <string name="Socks Length"> + Comprimento das meias + </string> + <string name="Soulpatch"> + Cavanhaque + </string> + <string name="Sparse"> + Disperso + </string> + <string name="Spiked Hair"> + Cabelo espetado + </string> + <string name="Square"> + Quadrado + </string> + <string name="Square Toe"> + Dedo quadrado + </string> + <string name="Squash Head"> + Cabeça de Pera + </string> + <string name="Stretch Head"> + Cabeça esticada + </string> + <string name="Sunken"> + Afundar + </string> + <string name="Sunken Chest"> + Peito afundado + </string> + <string name="Sunken Eyes"> + Olhos afundados + </string> + <string name="Sweep Back"> + Pentear para trás + </string> + <string name="Sweep Forward"> + Pentear para frente + </string> + <string name="Tall"> Alto </string> - - <!-- PARCEL_CATEGORY_UI_STRING --> - <string name="Linden Location">Locação Linden</string> - <string name="Adult">Adult</string> - <string name="Arts&Culture">Artes e Cultura</string> - <string name="Business">Negócios</string> - <string name="Educational">Educacional</string> - <string name="Gaming">Jogos</string> - <string name="Hangout">Moradia</string> - <string name="Newcomer Friendly">Amigável a Novos Usuários</string> - <string name="Parks&Nature">Parques & Natureza</string> - <string name="Residential">Residencial</string> - <string name="Shopping">Compras</string> - <string name="Other">Outros</string> - <string name="ringing"> - Conectando à conversa de Voz no mundo + <string name="Taper Back"> + Afinar atrás </string> - <string name="connected"> - Conectado + <string name="Taper Front"> + Afinar a frente </string> - <string name="unavailable"> - Voz não disponÃvel na sua localização atual + <string name="Thick Heels"> + Salto grosso </string> - <string name="hang_up"> - Desconectado da conversa de Voz no mundo + <string name="Thick Neck"> + Pescoço grosso + </string> + <string name="Thick Toe"> + Dedo grosso + </string> + <string name="Thin"> + Fino + </string> + <string name="Thin Eyebrows"> + Sobrancelhas finas + </string> + <string name="Thin Lips"> + Lábios finos + </string> + <string name="Thin Nose"> + Nariz fino + </string> + <string name="Tight Chin"> + Queixo apertado + </string> + <string name="Tight Cuffs"> + Punho justo + </string> + <string name="Tight Pants"> + Calça justa + </string> + <string name="Tight Shirt"> + Camisa justa + </string> + <string name="Tight Skirt"> + Saia justa + </string> + <string name="Tight Sleeves"> + Tight Sleeves + </string> + <string name="Toe Shape"> + Formato dos dedos + </string> + <string name="Toe Thickness"> + Espessura dos dos dedos + </string> + <string name="Torso Length"> + Comprimento do tronco + </string> + <string name="Torso Muscles"> + Músculos do tronco + </string> + <string name="Torso Scrawny"> + Tronco magricela + </string> + <string name="Unattached"> + Desanexado + </string> + <string name="Uncreased"> + Uncreased + </string> + <string name="Underbite"> + Underbite + </string> + <string name="Unnatural"> + Não natural + </string> + <string name="Upper Bridge"> + Parte alta do nariz + </string> + <string name="Upper Cheeks"> + Bochechas altas + </string> + <string name="Upper Chin Cleft"> + fenda do queixo alta + </string> + <string name="Upper Eyelid Fold"> + Curvatura dos cÃlios supériores + </string> + <string name="Upturned"> + Voltado para cima + </string> + <string name="Very Red"> + Bem vermelho + </string> + <string name="Waist Height"> + Altura da cintura + </string> + <string name="Well-Fed"> + Corpulento + </string> + <string name="White Hair"> + Grisalho + </string> + <string name="Wide"> + Amplo + </string> + <string name="Wide Back"> + Costas largas + </string> + <string name="Wide Front"> + Testa larga + </string> + <string name="Wide Lips"> + Lábios amplos + </string> + <string name="Wild"> + Selvagem + </string> + <string name="Wrinkles"> + Rugas + </string> + <string name="LocationCtrlAddLandmarkTooltip"> + Adicionar à s minhas Landmarks + </string> + <string name="LocationCtrlEditLandmarkTooltip"> + Editar minhas Landmarks + </string> + <string name="LocationCtrlInfoBtnTooltip"> + Ver mais informações sobre a localização atual + </string> + <string name="LocationCtrlComboBtnTooltip"> + Histórico de localizações + </string> + <string name="LocationCtrlAdultIconTooltip"> + Região Adulta + </string> + <string name="LocationCtrlModerateIconTooltip"> + Região Moderada + </string> + <string name="LocationCtrlGeneralIconTooltip"> + Região em geral + </string> + <string name="UpdaterWindowTitle"> + [APP_NAME] Atualização + </string> + <string name="UpdaterNowUpdating"> + Atualizando agora o [APP_NAME]... + </string> + <string name="UpdaterNowInstalling"> + Instalando [APP_NAME]... + </string> + <string name="UpdaterUpdatingDescriptive"> + Seu visualizador [APP_NAME] está sendo atualizado para a versão mais recente. Isso pode levar algum tempo, então por favor seja paciente. + </string> + <string name="UpdaterProgressBarTextWithEllipses"> + Fazendo o download da atualização... + </string> + <string name="UpdaterProgressBarText"> + Fazendo o download da atualização + </string> + <string name="UpdaterFailDownloadTitle"> + Falha no download da atualização + </string> + <string name="UpdaterFailUpdateDescriptive"> + Um erro ocorreu ao atualizar [APP_NAME]. Por favor, faça o download da versão mais recente em www.secondlife.com. + </string> + <string name="UpdaterFailInstallTitle"> + Falha ao instalar a atualização + </string> + <string name="UpdaterFailStartTitle"> + Falha ao iniciar o visualizador + </string> + <string name="ItemsComingInTooFastFrom"> + [APP_NAME]: Entrada de itens rápida demais de [FROM_NAME], visualização automática suspensa por [TIME] segundos + </string> + <string name="ItemsComingInTooFast"> + [APP_NAME]: Entrada de itens rápida demais, visualização automática suspensa por [TIME] segundos + </string> + <string name="IM_logging_string"> + -- Log de mensagem instantânea habilitado -- + </string> + <string name="IM_typing_start_string"> + [NAME] está digitando... + </string> + <string name="Unnamed"> + (Anônimo) + </string> + <string name="IM_moderated_chat_label"> + (Moderado: Voz desativado por padrão) + </string> + <string name="IM_unavailable_text_label"> + Bate-papo de texto não está disponÃvel para esta chamada. + </string> + <string name="IM_muted_text_label"> + Seu bate- papo de texto foi desabilitado por um Moderador do Grupo. + </string> + <string name="IM_default_text_label"> + Clique aqui para menagem instantânea. + </string> + <string name="IM_to_label"> + Para + </string> + <string name="IM_moderator_label"> + (Moderador) + </string> + <string name="answered_call"> + Ligação atendida + </string> + <string name="you_started_call"> + Você iniciou uma ligação de voz + </string> + <string name="you_joined_call"> + Você entrou na ligação + </string> + <string name="name_started_call"> + [NAME] iniciou uma ligação de voz + </string> + <string name="ringing-im"> + Entrando em ligação de voz... + </string> + <string name="connected-im"> + Conectado. Para sair, clique em Desligar + </string> + <string name="hang_up-im"> + Saiu da ligação de voz </string> - <string name="ScriptQuestionCautionChatGranted"> - '[OBJECTNAME]', um objeto de '[OWNERNAME]', localizado em [REGIONNAME] a [REGIONPOS], obteve permissão para: [PERMISSIONS]. - </string> - <string name="ScriptQuestionCautionChatDenied"> - '[OBJECTNAME]', um objeto de '[OWNERNAME]', localizado em [REGIONNAME] a [REGIONPOS], teve permissão negada para: [PERMISSIONS]. - </string> - <string name="ScriptTakeMoney"> - Tomar linden dólares (L$) de você - </string> - <string name="ActOnControlInputs"> - Atue nas suas entradas de controle - </string> - <string name="RemapControlInputs"> - Remapeie suas entradas de controle - </string> - <string name="AnimateYourAvatar"> - Faça uma animação para o seu avatar - </string> - <string name="AttachToYourAvatar"> - Anexe ao seu avatar - </string> - <string name="ReleaseOwnership"> - Libere a propriedade e torne-a pública - </string> - <string name="LinkAndDelink"> - Una e desuna de outros objetos - </string> - <string name="AddAndRemoveJoints"> - Adicione e remova junções com outros objetos - </string> - <string name="ChangePermissions"> - Modifique as permissões - </string> - <string name="TrackYourCamera"> - Acompanhe sua câmera - </string> - <string name="ControlYourCamera"> - Controle sua camera - </string> <string name="only_user_message"> Você é o único usuário desta sessão. </string> @@ -588,6 +3396,12 @@ <string name="invite_message"> Clique no botão [BUTTON NAME] para aceitar/ conectar a este bate-papo em voz. </string> + <string name="muted_message"> + Você bloqueou este residente. Se quiser retirar o bloqueio, basta enviar uma mensagem. + </string> + <string name="generic"> + Erro de solicitação, tente novamente mais tarde. + </string> <string name="generic_request_error"> Erro na requisição, por favor, tente novamente. </string> @@ -606,46 +3420,283 @@ <string name="not_a_mod_error"> Você não é um moderador de sessão. </string> + <string name="muted"> + Bate-papo de texto desativado por um moderador. + </string> <string name="muted_error"> Um moderador do grupo desabilitou seu bate-papo em texto. </string> <string name="add_session_event"> Não foi possÃvel adicionar usuários na sessão de bate-papo com [RECIPIENT]. </string> + <string name="message"> + Não foi possÃvel enviar sua mensagem para o bate-papo com [RECIPIENT]. + </string> <string name="message_session_event"> Não foi possÃvel enviar sua mensagem na sessão de bate- papo com [RECIPIENT]. </string> + <string name="mute"> + Erro durante a moderação. + </string> + <string name="removed"> + Você foi tirado do grupo. + </string> <string name="removed_from_group"> Você foi removido do grupo. </string> <string name="close_on_no_ability"> Você não possui mais a habilidade de estar na sessão de bate-papo. </string> - <string name="AcctTypeResident"> - Residente - </string> - <string name="AcctTypeTrial"> - Teste - </string> - <string name="AcctTypeCharterMember"> - Estatuto do membro - </string> - <string name="AcctTypeEmployee"> - Contratado da Linden Lab - </string> - <string name="PaymentInfoUsed"> - Infor. de pagamento utilizadas - </string> - <string name="PaymentInfoOnFile"> - Infor. de pagamento no arquivo - </string> - <string name="NoPaymentInfoOnFile"> - Sem infor. de pagamento no arquivo - </string> - <string name="AgeVerified"> - Idade Verificada - </string> - <string name="NotAgeVerified"> - Idade não Verificada - </string> + <string name="unread_chat_single"> + [SOURCES] disse alguma coisa + </string> + <string name="unread_chat_multiple"> + [SOURCES] disseram alguma coisa + </string> + <string name="session_initialization_timed_out_error"> + A inicialização da sessão expirou + </string> + <string name="voice_morphing_url"> + http://secondlife.com/landing/voicemorphing + </string> + <string name="paid_you_ldollars"> + [NAME] lhe pagou L$ [AMOUNT] + </string> + <string name="you_paid_ldollars"> + You pagou L$[AMOUNT] por [REASON] a [NAME]. + </string> + <string name="you_paid_ldollars_no_info"> + Você acaba de pagar L$[AMOUNT]. + </string> + <string name="you_paid_ldollars_no_reason"> + You pagou L$[AMOUNT] a [NAME]. + </string> + <string name="you_paid_ldollars_no_name"> + You pagou L$[AMOUNT] por [REASON]. + </string> + <string name="for a parcel of land"> + por uma parcela + </string> + <string name="for a land access pass"> + por um passe de acesso + </string> + <string name="for deeding land"> + para doar um terreno + </string> + <string name="to create a group"> + para criar um grupo + </string> + <string name="to join a group"> + para entrar em um grupo + </string> + <string name="to upload"> + para carregar + </string> + <string name="giving"> + Dando L$ [AMOUNT] + </string> + <string name="uploading_costs"> + O upload custa L$ [AMOUNT] + </string> + <string name="this_costs"> + Isso custa L$ [AMOUNT] + </string> + <string name="buying_selected_land"> + Comprando terreno selecionado L$ [AMOUNT] + </string> + <string name="this_object_costs"> + Esse objeto custa L$ [AMOUNT] + </string> + <string name="group_role_everyone"> + Todos + </string> + <string name="group_role_officers"> + Oficiais + </string> + <string name="group_role_owners"> + Proprietários + </string> + <string name="uploading_abuse_report"> + Carregando... + +Denunciar abuso + </string> + <string name="New Shape"> + Nova forma + </string> + <string name="New Skin"> + Nova pele + </string> + <string name="New Hair"> + Novo cabelo + </string> + <string name="New Eyes"> + Novos olhos + </string> + <string name="New Shirt"> + Nova camisa + </string> + <string name="New Pants"> + Novas calças + </string> + <string name="New Shoes"> + Novos sapatos + </string> + <string name="New Socks"> + Novas meias + </string> + <string name="New Jacket"> + Nova blusa + </string> + <string name="New Gloves"> + Novas luvas + </string> + <string name="New Undershirt"> + Nova camiseta + </string> + <string name="New Underpants"> + Novas roupa de baixo + </string> + <string name="New Skirt"> + Nova saia + </string> + <string name="New Alpha"> + Novo alpha + </string> + <string name="New Tattoo"> + Nova tatuagem + </string> + <string name="Invalid Wearable"> + Item inválido + </string> + <string name="New Script"> + Novo script + </string> + <string name="New Folder"> + Nova pasta + </string> + <string name="Contents"> + Conteúdo + </string> + <string name="Gesture"> + Gesto + </string> + <string name="Male Gestures"> + Gestos masculinos + </string> + <string name="Female Gestures"> + Gestos femininos + </string> + <string name="Other Gestures"> + Outros gestos + </string> + <string name="Speech Gestures"> + Gestos da fala + </string> + <string name="Common Gestures"> + Gestos comuns + </string> + <string name="Male - Excuse me"> + Perdão - masculino + </string> + <string name="Male - Get lost"> + Deixe-me em paz - masculino + </string> + <string name="Male - Blow kiss"> + Mandar beijo - masculino + </string> + <string name="Male - Boo"> + Vaia - masculino + </string> + <string name="Male - Bored"> + Maçante - masculino + </string> + <string name="Male - Hey"> + Ôpa! - masculino + </string> + <string name="Male - Laugh"> + Risada - masculino + </string> + <string name="Male - Repulsed"> + Quero distância! - masculino + </string> + <string name="Male - Shrug"> + Encolher de ombros - masculino + </string> + <string name="Male - Stick tougue out"> + Mostrar a lÃngua - masculino + </string> + <string name="Male - Wow"> + Wow - masculino + </string> + <string name="Female - Excuse me"> + Perdão - fem + </string> + <string name="Female - Get lost"> + Deixe-me em paz - feminino + </string> + <string name="Female - Blow kiss"> + Mandar beijo - fem + </string> + <string name="Female - Boo"> + Vaia - fem + </string> + <string name="Female - Bored"> + Maçante - feminino + </string> + <string name="Female - Hey"> + Ôpa - feminino + </string> + <string name="Female - Laugh"> + Risada - feminina + </string> + <string name="Female - Repulsed"> + Quero distância! - feminino + </string> + <string name="Female - Shrug"> + Encolher ombros - feminino + </string> + <string name="Female - Stick tougue out"> + Mostrar a lÃngua - feminino + </string> + <string name="Female - Wow"> + Wow - feminino + </string> + <string name="AvatarBirthDateFormat"> + [mthnum,datetime,slt]/[day,datetime,slt]/[year,datetime,slt] + </string> + <string name="DefaultMimeType"> + nenhum/nehum + </string> + <string name="texture_load_dimensions_error"> + A imagem excede o limite [WIDTH]*[HEIGHT] + </string> + <string name="words_separator" value=","/> + <string name="server_is_down"> + Aconteceu algo inesperado, apesar de termos tentador impedir isso. + + Cheque secondlifegrid.net para saber se foi detectado um problema com o serviço. + Se o problema persisitr, cheque a configuração da sua rede e firewall. + </string> + <string name="dateTimeWeekdaysNames"> + Domingo:Segunda:Terça:Quarta:Quinta:Sexta:Sábado + </string> + <string name="dateTimeWeekdaysShortNames"> + Dom:Seg:Ter:Qua:Qui:Sex:Sab + </string> + <string name="dateTimeMonthNames"> + Janeiro:Fevereiro:Março:Abril:Maio:Junho:Julho:Agosto:Setembro:Outubro:Novembro:Dezembro + </string> + <string name="dateTimeMonthShortNames"> + Jan:Fev:Mar:Abr:Maio:Jun:Jul:Ago:Set:Out:Nov:Dez + </string> + <string name="dateTimeDayFormat"> + [MDAY] + </string> + <string name="dateTimeAM"> + AM + </string> + <string name="dateTimePM"> + PM + </string> </strings> diff --git a/indra/newview/skins/default/xui/pt/teleport_strings.xml b/indra/newview/skins/default/xui/pt/teleport_strings.xml index 6eecc45bcf..11ea0f4195 100644 --- a/indra/newview/skins/default/xui/pt/teleport_strings.xml +++ b/indra/newview/skins/default/xui/pt/teleport_strings.xml @@ -2,12 +2,12 @@ <teleport_messages> <message_set name="errors"> <message name="invalid_tport"> - Problema encontrado ao processar seu pedido de Teletransporte. Você pode tentar reiniciar antes de tentar teletransportar-se. Se você continuar a receber esta mensagem, por favor verifique a FAQ do Suporte Técnico em: -www.secondlife.com/support + Houve um problema ao processar o teletransporte. Talvez seja preciso sair e entrar do Second Life para fazer o teletransporte. +Se você continuar a receber esta mensagem, por favor consulte o [SUPPORT_SITE]. </message> <message name="invalid_region_handoff"> - Problema encontrado ao processar a passagem de regiões. Você pode tentar reiniciar antes de tentar atravessar regiões novamente. Se você continuar a receber esta mensagem, por favor verifique a FAQ do Suporte Técnico em: -www.secondlife.com/support + Problema encontrado ao processar a passagem de regiões. Talvez seja preciso sair e entrar do Second Life atravessar regiões novamente. +Se você continuar a receber esta mensagem, por favor consulte o [SUPPORT_SITE]. </message> <message name="blocked_tport"> Desculpe, teletransportes estão atualmente bloqueados. Tente novamente dentro de alguns instantes. Se você continuar com problemas de teletransporte, por favor tente deslogar e relogar para resolver o problema. @@ -51,7 +51,7 @@ www.secondlife.com/support Transferindo para o destino. </message> <message name="sending_home"> - Enviando solicitação de localização da casa. + Enviando solicitação de localização de inÃcio. </message> <message name="sending_landmark"> Enviando solicitação de localização de landmark. @@ -59,6 +59,9 @@ www.secondlife.com/support <message name="completing"> Completando teletransporte. </message> + <message name="completed_from"> + Teletransporte de [T_SLURL] concluÃdo + </message> <message name="resolving"> Identificando destino. </message> diff --git a/indra/newview/tests/lllogininstance_test.cpp b/indra/newview/tests/lllogininstance_test.cpp index f7ac5361c5..1c29feec5f 100644 --- a/indra/newview/tests/lllogininstance_test.cpp +++ b/indra/newview/tests/lllogininstance_test.cpp @@ -2,7 +2,7 @@ * @file lllogininstance_test.cpp * @brief Test for lllogininstance.cpp. * - * $LicenseInfo:firstyear=2008&license=internal$ + * $LicenseInfo:firstyear=2008&license=viewergpl$ * Copyright (c) 2008, Linden Research, Inc. * $/LicenseInfo$ */ @@ -10,7 +10,10 @@ // Precompiled header #include "../llviewerprecompiledheaders.h" // Own header +#include "../llsecapi.h" +#include "../llviewernetwork.h" #include "../lllogininstance.h" + // STL headers // std headers // external library headers @@ -33,7 +36,12 @@ const std::string APPVIEWER_SERIALNUMBER("appviewer_serialno"); //----------------------------------------------------------------------------- static LLEventStream gTestPump("test_pump"); +#include "../llslurl.h" +#include "../llstartup.h" +LLSLURL LLStartUp::sStartSLURL; + #include "lllogin.h" + static std::string gLoginURI; static LLSD gLoginCreds; static bool gDisconnectCalled = false; @@ -54,17 +62,75 @@ void LLLogin::disconnect() gDisconnectCalled = true; } +LLSD LLCredential::getLoginParams() +{ + LLSD result = LLSD::emptyMap(); + + // legacy credential + result["passwd"] = "$1$testpasssd"; + result["first"] = "myfirst"; + result["last"] ="mylast"; + return result; +} +void LLCredential::identifierType(std::string &idType) +{ +} + +void LLCredential::authenticatorType(std::string &idType) +{ +} + //----------------------------------------------------------------------------- #include "../llviewernetwork.h" -unsigned char gMACAddress[MAC_ADDRESS_BYTES] = {'1','2','3','4','5','6'}; +LLGridManager::~LLGridManager() +{ +} + +void LLGridManager::addGrid(LLSD& grid_data) +{ +} +LLGridManager::LLGridManager() +{ +} -LLViewerLogin::LLViewerLogin() : mGridChoice(GRID_INFO_NONE) {} -LLViewerLogin::~LLViewerLogin() {} -void LLViewerLogin::getLoginURIs(std::vector<std::string>& uris) const +void LLGridManager::getLoginURIs(std::vector<std::string>& uris) { uris.push_back(VIEWERLOGIN_URI); } -std::string LLViewerLogin::getGridLabel() const { return VIEWERLOGIN_GRIDLABEL; } + +void LLGridManager::addSystemGrid(const std::string& label, + const std::string& name, + const std::string& login, + const std::string& helper, + const std::string& login_page, + const std::string& login_id) +{ +} +std::map<std::string, std::string> LLGridManager::getKnownGrids(bool favorite_only) +{ + std::map<std::string, std::string> result; + return result; +} + +void LLGridManager::setGridChoice(const std::string& grid_name) +{ +} + +bool LLGridManager::isInProductionGrid() +{ + return false; +} + +void LLGridManager::saveFavorites() +{} +std::string LLGridManager::getSLURLBase(const std::string& grid_name) +{ + return "myslurl"; +} +std::string LLGridManager::getAppSLURLBase(const std::string& grid_name) +{ + return "myappslurl"; +} //----------------------------------------------------------------------------- #include "../llviewercontrol.h" @@ -86,10 +152,6 @@ BOOL LLControlGroup::declareString(const std::string& name, const std::string &i #include "lluicolortable.h" void LLUIColorTable::saveUserSettings(void)const {} -//----------------------------------------------------------------------------- -#include "../llurlsimstring.h" -LLURLSimString LLURLSimString::sInstance; -bool LLURLSimString::parse() { return true; } //----------------------------------------------------------------------------- #include "llnotifications.h" @@ -197,15 +259,29 @@ namespace tut gSavedSettings.declareString("NextLoginLocation", "", "", FALSE); gSavedSettings.declareBOOL("LoginLastLocation", FALSE, "", FALSE); - credentials["first"] = "testfirst"; - credentials["last"] = "testlast"; - credentials["passwd"] = "testpass"; + LLSD authenticator = LLSD::emptyMap(); + LLSD identifier = LLSD::emptyMap(); + identifier["type"] = "agent"; + identifier["first_name"] = "testfirst"; + identifier["last_name"] = "testlast"; + authenticator["passwd"] = "testpass"; + agentCredential = new LLCredential(); + agentCredential->setCredentialData(identifier, authenticator); + + authenticator = LLSD::emptyMap(); + identifier = LLSD::emptyMap(); + identifier["type"] = "account"; + identifier["username"] = "testuser"; + authenticator["secret"] = "testsecret"; + accountCredential = new LLCredential(); + accountCredential->setCredentialData(identifier, authenticator); logininstance->setNotificationsInterface(¬ifications); } LLLoginInstance* logininstance; - LLSD credentials; + LLPointer<LLCredential> agentCredential; + LLPointer<LLCredential> accountCredential; MockNotifications notifications; }; @@ -219,7 +295,7 @@ namespace tut set_test_name("Test Simple Success And Disconnect"); // Test default connect. - logininstance->connect(credentials); + logininstance->connect(agentCredential); ensure_equals("Default connect uri", gLoginURI, VIEWERLOGIN_URI); @@ -260,7 +336,7 @@ namespace tut const std::string test_uri = "testing-uri"; // Test default connect. - logininstance->connect(test_uri, credentials); + logininstance->connect(test_uri, agentCredential); // connect should call LLLogin::connect to init gLoginURI and gLoginCreds. ensure_equals("Default connect uri", gLoginURI, "testing-uri"); @@ -282,7 +358,7 @@ namespace tut ensure("No TOS, failed auth", logininstance->authFailure()); // Start again. - logininstance->connect(test_uri, credentials); + logininstance->connect(test_uri, agentCredential); gTestPump.post(response); // Fail for tos again. gTOSReplyPump->post(true); // Accept tos, should reconnect w/ agree_to_tos. ensure_equals("Accepted agree to tos", gLoginCreds["params"]["agree_to_tos"].asBoolean(), true); @@ -294,11 +370,11 @@ namespace tut gTestPump.post(response); ensure("TOS auth failure", logininstance->authFailure()); - logininstance->connect(test_uri, credentials); + logininstance->connect(test_uri, agentCredential); ensure_equals("Reset to default for agree to tos", gLoginCreds["params"]["agree_to_tos"].asBoolean(), false); // Critical Message failure response. - logininstance->connect(test_uri, credentials); + logininstance->connect(test_uri, agentCredential); response["data"]["reason"] = "critical"; // Change response to "critical message" gTestPump.post(response); @@ -312,7 +388,7 @@ namespace tut response["data"]["reason"] = "key"; // bad creds. gTestPump.post(response); ensure("TOS auth failure", logininstance->authFailure()); - logininstance->connect(test_uri, credentials); + logininstance->connect(test_uri, agentCredential); ensure_equals("Default for agree to tos", gLoginCreds["params"]["read_critical"].asBoolean(), false); } @@ -323,7 +399,7 @@ namespace tut // Part 1 - Mandatory Update, with User accepts response. // Test connect with update needed. - logininstance->connect(credentials); + logininstance->connect(agentCredential); ensure_equals("Default connect uri", gLoginURI, VIEWERLOGIN_URI); @@ -349,7 +425,7 @@ namespace tut set_test_name("Test Mandatory Update User Decline"); // Test connect with update needed. - logininstance->connect(credentials); + logininstance->connect(agentCredential); ensure_equals("Default connect uri", gLoginURI, VIEWERLOGIN_URI); @@ -375,7 +451,7 @@ namespace tut // Part 3 - Mandatory Update, with bogus response. // Test connect with update needed. - logininstance->connect(credentials); + logininstance->connect(agentCredential); ensure_equals("Default connect uri", gLoginURI, VIEWERLOGIN_URI); @@ -401,7 +477,7 @@ namespace tut // Part 3 - Mandatory Update, with bogus response. // Test connect with update needed. - logininstance->connect(credentials); + logininstance->connect(agentCredential); ensure_equals("Default connect uri", gLoginURI, VIEWERLOGIN_URI); diff --git a/indra/newview/tests/llsecapi_test.cpp b/indra/newview/tests/llsecapi_test.cpp new file mode 100644 index 0000000000..caa1461987 --- /dev/null +++ b/indra/newview/tests/llsecapi_test.cpp @@ -0,0 +1,188 @@ +/** + * @file llsecapi_test.cpp + * @author Roxie + * @date 2009-02-10 + * @brief Test the sec api functionality + * + * $LicenseInfo:firstyear=2009&license=viewergpl$ + * + * Copyright (c) 2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden LregisterSecAPIab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ +#include "../llviewerprecompiledheaders.h" +#include "../llviewernetwork.h" +#include "../test/lltut.h" +#include "../llsecapi.h" +#include "../../llxml/llcontrol.h" + + +//---------------------------------------------------------------------------- +// Mock objects for the dependencies of the code we're testing + +LLControlGroup::LLControlGroup(const std::string& name) +: LLInstanceTracker<LLControlGroup, std::string>(name) {} +LLControlGroup::~LLControlGroup() {} +BOOL LLControlGroup::declareString(const std::string& name, + const std::string& initial_val, + const std::string& comment, + BOOL persist) {return TRUE;} +void LLControlGroup::setString(const std::string& name, const std::string& val){} +std::string LLControlGroup::getString(const std::string& name) +{ + return ""; +} + + +LLControlGroup gSavedSettings("test"); +class LLSecAPIBasicHandler : public LLSecAPIHandler +{ +protected: + LLPointer<LLCertificateChain> mCertChain; + LLPointer<LLCertificate> mCert; + LLPointer<LLCertificateStore> mCertStore; + LLSD mLLSD; + +public: + LLSecAPIBasicHandler() {} + + virtual ~LLSecAPIBasicHandler() {} + + // instantiate a certificate from a pem string + virtual LLPointer<LLCertificate> getCertificate(const std::string& pem_cert) + { + return mCert; + } + + + // instiate a certificate from an openssl X509 structure + virtual LLPointer<LLCertificate> getCertificate(X509* openssl_cert) + { + return mCert; + } + + + // instantiate a chain from an X509_STORE_CTX + virtual LLPointer<LLCertificateChain> getCertificateChain(const X509_STORE_CTX* chain) + { + return mCertChain; + } + + // instantiate a cert store given it's id. if a persisted version + // exists, it'll be loaded. If not, one will be created (but not + // persisted) + virtual LLPointer<LLCertificateStore> getCertificateStore(const std::string& store_id) + { + return mCertStore; + } + + // persist data in a protected store + virtual void setProtectedData(const std::string& data_type, + const std::string& data_id, + const LLSD& data) {} + + // retrieve protected data + virtual LLSD getProtectedData(const std::string& data_type, + const std::string& data_id) + { + return mLLSD; + } + + virtual void deleteProtectedData(const std::string& data_type, + const std::string& data_id) + { + } + + virtual LLPointer<LLCredential> createCredential(const std::string& grid, + const LLSD& identifier, + const LLSD& authenticator) + { + LLPointer<LLCredential> cred = NULL; + return cred; + } + + virtual LLPointer<LLCredential> loadCredential(const std::string& grid) + { + LLPointer<LLCredential> cred = NULL; + return cred; + } + + virtual void saveCredential(LLPointer<LLCredential> cred, bool save_authenticator) {} + + virtual void deleteCredential(LLPointer<LLCredential> cred) {} +}; + +// ------------------------------------------------------------------------------------------- +// TUT +// ------------------------------------------------------------------------------------------- +namespace tut +{ + // Test wrapper declaration : wrapping nothing for the moment + struct secapiTest + { + + secapiTest() + { + } + ~secapiTest() + { + } + }; + + // Tut templating thingamagic: test group, object and test instance + typedef test_group<secapiTest> secapiTestFactory; + typedef secapiTestFactory::object secapiTestObject; + tut::secapiTestFactory tut_test("llsecapi"); + + // --------------------------------------------------------------------------------------- + // Test functions + // --------------------------------------------------------------------------------------- + // registration + template<> template<> + void secapiTestObject::test<1>() + { + // retrieve an unknown handler + + ensure("'Unknown' handler should be NULL", !(BOOL)getSecHandler("unknown")); + LLPointer<LLSecAPIHandler> test1_handler = new LLSecAPIBasicHandler(); + registerSecHandler("sectest1", test1_handler); + ensure("'Unknown' handler should be NULL", !(BOOL)getSecHandler("unknown")); + LLPointer<LLSecAPIHandler> retrieved_test1_handler = getSecHandler("sectest1"); + ensure("Retrieved sectest1 handler should be the same", + retrieved_test1_handler == test1_handler); + + // insert a second handler + LLPointer<LLSecAPIHandler> test2_handler = new LLSecAPIBasicHandler(); + registerSecHandler("sectest2", test2_handler); + ensure("'Unknown' handler should be NULL", !(BOOL)getSecHandler("unknown")); + retrieved_test1_handler = getSecHandler("sectest1"); + ensure("Retrieved sectest1 handler should be the same", + retrieved_test1_handler == test1_handler); + + LLPointer<LLSecAPIHandler> retrieved_test2_handler = getSecHandler("sectest2"); + ensure("Retrieved sectest1 handler should be the same", + retrieved_test2_handler == test2_handler); + + } +} diff --git a/indra/newview/tests/llsechandler_basic_test.cpp b/indra/newview/tests/llsechandler_basic_test.cpp new file mode 100644 index 0000000000..fa9fff3ac9 --- /dev/null +++ b/indra/newview/tests/llsechandler_basic_test.cpp @@ -0,0 +1,1071 @@ +/** + * @file llsechandler_basic_test.cpp + * @author Roxie + * @date 2009-02-10 + * @brief Test the 'basic' sec handler functions + * + * $LicenseInfo:firstyear=2005&license=viewergpl$ + * + * Copyright (c) 2005-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ +#include "../llviewerprecompiledheaders.h" +#include "../test/lltut.h" +#include "../llsecapi.h" +#include "../llsechandler_basic.h" +#include "../../llxml/llcontrol.h" +#include "../llviewernetwork.h" +#include "lluuid.h" +#include "llxorcipher.h" +#include "apr_base64.h" +#include <vector> +#include <ios> +#include <llsdserialize.h> +#include <openssl/pem.h> +#include <openssl/err.h> +#include <openssl/evp.h> +#include "llxorcipher.h" +#include <openssl/ossl_typ.h> +#include <openssl/x509.h> +#include <openssl/x509v3.h> +#include <openssl/pem.h> +#include <openssl/asn1.h> +#include <openssl/rand.h> +#include <openssl/err.h> +#include "../llmachineid.h" + +#define ensure_throws(str, exc_type, cert, func, ...) \ +try \ +{ \ +func(__VA_ARGS__); \ +fail("throws, " str); \ +} \ +catch(exc_type& except) \ +{ \ +ensure("Exception cert is incorrect for " str, except.getCert() == cert); \ +} + +extern bool _cert_hostname_wildcard_match(const std::string& hostname, const std::string& wildcard_string); + +//---------------------------------------------------------------------------- +// Mock objects for the dependencies of the code we're testing + +std::string gFirstName; +std::string gLastName; +LLControlGroup::LLControlGroup(const std::string& name) +: LLInstanceTracker<LLControlGroup, std::string>(name) {} +LLControlGroup::~LLControlGroup() {} +BOOL LLControlGroup::declareString(const std::string& name, + const std::string& initial_val, + const std::string& comment, + BOOL persist) {return TRUE;} +void LLControlGroup::setString(const std::string& name, const std::string& val){} +std::string LLControlGroup::getString(const std::string& name) +{ + + if (name == "FirstName") + return gFirstName; + else if (name == "LastName") + return gLastName; + return ""; +} + +LLSD LLCredential::getLoginParams() +{ + LLSD result = LLSD::emptyMap(); + + // legacy credential + result["passwd"] = "$1$testpasssd"; + result["first"] = "myfirst"; + result["last"] ="mylast"; + return result; +} + +void LLCredential::identifierType(std::string &idType) +{ +} + +void LLCredential::authenticatorType(std::string &idType) +{ +} + + +LLControlGroup gSavedSettings("test"); +unsigned char gMACAddress[MAC_ADDRESS_BYTES] = {77,21,46,31,89,2}; + + +S32 LLMachineID::getUniqueID(unsigned char *unique_id, size_t len) +{ + memcpy(unique_id, gMACAddress, len); + return 1; +} +S32 LLMachineID::init() { return 1; } + + +// ------------------------------------------------------------------------------------------- +// TUT +// ------------------------------------------------------------------------------------------- +namespace tut +{ + // Test wrapper declaration : wrapping nothing for the moment + struct sechandler_basic_test + { + std::string mPemTestCert, mPemRootCert, mPemIntermediateCert, mPemChildCert, mSha1RSATestCert, mSha1RSATestCA; + std::string mDerFormat; + X509 *mX509TestCert, *mX509RootCert, *mX509IntermediateCert, *mX509ChildCert; + + sechandler_basic_test() + { + LLMachineID::init(); + OpenSSL_add_all_algorithms(); + OpenSSL_add_all_ciphers(); + OpenSSL_add_all_digests(); + ERR_load_crypto_strings(); + gFirstName = ""; + gLastName = ""; + LLFile::remove("test_password.dat"); + LLFile::remove("sechandler_settings.tmp"); + mPemTestCert = "-----BEGIN CERTIFICATE-----\n" + "MIIEuDCCA6CgAwIBAgIBBDANBgkqhkiG9w0BAQUFADCBtDELMAkGA1UEBhMCQlIx\n" + "EzARBgNVBAoTCklDUC1CcmFzaWwxPTA7BgNVBAsTNEluc3RpdHV0byBOYWNpb25h\n" + "bCBkZSBUZWNub2xvZ2lhIGRhIEluZm9ybWFjYW8gLSBJVEkxETAPBgNVBAcTCEJy\n" + "YXNpbGlhMQswCQYDVQQIEwJERjExMC8GA1UEAxMoQXV0b3JpZGFkZSBDZXJ0aWZp\n" + "Y2Fkb3JhIFJhaXogQnJhc2lsZWlyYTAeFw0wMTExMzAxMjU4MDBaFw0xMTExMzAy\n" + "MzU5MDBaMIG0MQswCQYDVQQGEwJCUjETMBEGA1UEChMKSUNQLUJyYXNpbDE9MDsG\n" + "A1UECxM0SW5zdGl0dXRvIE5hY2lvbmFsIGRlIFRlY25vbG9naWEgZGEgSW5mb3Jt\n" + "YWNhbyAtIElUSTERMA8GA1UEBxMIQnJhc2lsaWExCzAJBgNVBAgTAkRGMTEwLwYD\n" + "VQQDEyhBdXRvcmlkYWRlIENlcnRpZmljYWRvcmEgUmFpeiBCcmFzaWxlaXJhMIIB\n" + "IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwPMudwX/hvm+Uh2b/lQAcHVA\n" + "isamaLkWdkwP9/S/tOKIgRrL6Oy+ZIGlOUdd6uYtk9Ma/3pUpgcfNAj0vYm5gsyj\n" + "Qo9emsc+x6m4VWwk9iqMZSCK5EQkAq/Ut4n7KuLE1+gdftwdIgxfUsPt4CyNrY50\n" + "QV57KM2UT8x5rrmzEjr7TICGpSUAl2gVqe6xaii+bmYR1QrmWaBSAG59LrkrjrYt\n" + "bRhFboUDe1DK+6T8s5L6k8c8okpbHpa9veMztDVC9sPJ60MWXh6anVKo1UcLcbUR\n" + "yEeNvZneVRKAAU6ouwdjDvwlsaKydFKwed0ToQ47bmUKgcm+wV3eTRk36UOnTwID\n" + "AQABo4HSMIHPME4GA1UdIARHMEUwQwYFYEwBAQAwOjA4BggrBgEFBQcCARYsaHR0\n" + "cDovL2FjcmFpei5pY3BicmFzaWwuZ292LmJyL0RQQ2FjcmFpei5wZGYwPQYDVR0f\n" + "BDYwNDAyoDCgLoYsaHR0cDovL2FjcmFpei5pY3BicmFzaWwuZ292LmJyL0xDUmFj\n" + "cmFpei5jcmwwHQYDVR0OBBYEFIr68VeEERM1kEL6V0lUaQ2kxPA3MA8GA1UdEwEB\n" + "/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAZA5c1\n" + "U/hgIh6OcgLAfiJgFWpvmDZWqlV30/bHFpj8iBobJSm5uDpt7TirYh1Uxe3fQaGl\n" + "YjJe+9zd+izPRbBqXPVQA34EXcwk4qpWuf1hHriWfdrx8AcqSqr6CuQFwSr75Fos\n" + "SzlwDADa70mT7wZjAmQhnZx2xJ6wfWlT9VQfS//JYeIc7Fue2JNLd00UOSMMaiK/\n" + "t79enKNHEA2fupH3vEigf5Eh4bVAN5VohrTm6MY53x7XQZZr1ME7a55lFEnSeT0u\n" + "mlOAjR2mAbvSM5X5oSZNrmetdzyTj2flCM8CC7MLab0kkdngRIlUBGHF1/S5nmPb\n" + "K+9A46sd33oqK8n8\n" + "-----END CERTIFICATE-----\n"; + + mPemRootCert = "-----BEGIN CERTIFICATE-----\n" + "MIIB0TCCATqgAwIBAgIJANaTqrzEvHaRMA0GCSqGSIb3DQEBBAUAMBsxGTAXBgNV\n" + "BAMTEFJveGllcyB0ZXN0IHJvb3QwHhcNMDkwNDE1MjEwNzQ3WhcNMTAwNDE1MjEw\n" + "NzQ3WjAbMRkwFwYDVQQDExBSb3hpZXMgdGVzdCByb290MIGfMA0GCSqGSIb3DQEB\n" + "AQUAA4GNADCBiQKBgQCpo5nDW6RNz9IHUVZd7Tw2XAQiBniDF4xH0N1w7sUYTiFq\n" + "21mABsnOPJD3ra+MtOsXPHcaljm661JjTD8L40v5sfEbqDUPcOw76ClrPqnuAeyT\n" + "38qk8DHku/mT8YdprevGZdVcUXQg3vosVzOL93HOOHK+u61mEEoM9W5xoNVEdQID\n" + "AQABox0wGzAMBgNVHRMEBTADAQH/MAsGA1UdDwQEAwIBBjANBgkqhkiG9w0BAQQF\n" + "AAOBgQAzn0aW/+zWPmcTbvxonyiYYUr9b4SOB/quhAkT8KT4ir1dcZAXRR59+kEn\n" + "HSTu1FAodV0gvESqyobftF5hZ1XMxdJqGu//xP+YCwlv244G/0pp7KLI8ihNO2+N\n" + "lPBUJgbo++ZkhiE1jotZi9Ay0Oedh3s/AfbMZPyfpJ23ll6+BA==\n" + "-----END CERTIFICATE-----\n"; + + + + mPemIntermediateCert = "-----BEGIN CERTIFICATE-----\n" + "MIIBzzCCATigAwIBAgIBATANBgkqhkiG9w0BAQQFADAbMRkwFwYDVQQDExBSb3hp\n" + "ZXMgdGVzdCByb290MB4XDTA5MDQxNTIxMzE1NloXDTEwMDQxNTIxMzE1NlowITEf\n" + "MB0GA1UEAxMWUm94aWVzIGludGVybWVkaWF0ZSBDQTCBnzANBgkqhkiG9w0BAQEF\n" + "AAOBjQAwgYkCgYEA15MM0W1R37rx/24Q2Qkb5bSiQZxTUcQAhJ2pA8mwUucXuCVt\n" + "6ayI2TuN32nkjmsCgUkiT/bdXWp0OJo7/MXRIFeUNMCRxrpeFnxuigYEqbIXAdN6\n" + "qu/vdG2X4PRv/v9Ijrju4cBEiKIldIgOurWEIfXEsVSFP2XmFQHesF04qDcCAwEA\n" + "AaMdMBswDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAQYwDQYJKoZIhvcNAQEEBQAD\n" + "gYEAYljikYgak3W1jSo0vYthNHUy3lBVAKzDhpM96lY5OuXFslpCRX42zNL8X3kN\n" + "U/4IaJUVtZqx8WsUXl1eXHzBCaXCftapV4Ir6cENLIsXCdXs8paFYzN5nPJA5GYU\n" + "zWgkSEl1MEhNIc+bJW34vwi29EjrAShAhsIZ84Mt/lvD3Pc=\n" + "-----END CERTIFICATE-----\n"; + + mPemChildCert = "-----BEGIN CERTIFICATE-----\n" + "MIIB5DCCAU0CBEnm9eUwDQYJKoZIhvcNAQEEBQAwITEfMB0GA1UEAxMWUm94aWVz\n" + "IGludGVybWVkaWF0ZSBDQTAeFw0wOTA0MTYwMDAzNDlaFw0xMDA0MTYwMDAzNDla\n" + "MCAxHjAcBgNVBAMTFWVuaWFjNjMubGluZGVubGFiLmNvbTCBnzANBgkqhkiG9w0B\n" + "AQEFAAOBjQAwgYkCgYEAp9I5rofEzbjNht+9QejfnsIlEPqSxskoWKCG255TesWR\n" + "RTmw9wafHQQkJk/VIsaU4RMBYHkknGbHX2dGvMHmKZoWUPSQ/8FZz09o0Qx3TNUZ\n" + "l7KlGOD2d1c7ZxXDPqlLC6QW8DrE1/8zfwJ5cbYBXc8e7OKdSZeRrnwHyw4Q8r8C\n" + "AwEAAaMvMC0wEwYDVR0lBAwwCgYIKwYBBQUHAwEwCQYDVR0TBAIwADALBgNVHQ8E\n" + "BAMCBaAwDQYJKoZIhvcNAQEEBQADgYEAIG0M5tqYlXyMiGKPZfXy/R3M3ZZOapDk\n" + "W0dsXJYXAc35ftwtn0VYu9CNnZCcli17/d+AKhkK8a/oGPazqudjFF6WLJLTXaY9\n" + "NmhkJcOPADXkbyQPUPXzLe4YRrkEQeGhzMb4rKDQ1TKAcXfs0Y068pTpsixNSxja\n" + "NhAUUcve5Is=\n" + "-----END CERTIFICATE-----\n"; + + mDerFormat = "MIIEuDCCA6CgAwIBAgIBBDANBgkqhkiG9w0BAQUFADCBtDELMAkGA1UEBhMCQlIxEzARBgNVBAoT" +"CklDUC1CcmFzaWwxPTA7BgNVBAsTNEluc3RpdHV0byBOYWNpb25hbCBkZSBUZWNub2xvZ2lhIGRh" +"IEluZm9ybWFjYW8gLSBJVEkxETAPBgNVBAcTCEJyYXNpbGlhMQswCQYDVQQIEwJERjExMC8GA1UE" +"AxMoQXV0b3JpZGFkZSBDZXJ0aWZpY2Fkb3JhIFJhaXogQnJhc2lsZWlyYTAeFw0wMTExMzAxMjU4" +"MDBaFw0xMTExMzAyMzU5MDBaMIG0MQswCQYDVQQGEwJCUjETMBEGA1UEChMKSUNQLUJyYXNpbDE9" +"MDsGA1UECxM0SW5zdGl0dXRvIE5hY2lvbmFsIGRlIFRlY25vbG9naWEgZGEgSW5mb3JtYWNhbyAt" +"IElUSTERMA8GA1UEBxMIQnJhc2lsaWExCzAJBgNVBAgTAkRGMTEwLwYDVQQDEyhBdXRvcmlkYWRl" +"IENlcnRpZmljYWRvcmEgUmFpeiBCcmFzaWxlaXJhMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB" +"CgKCAQEAwPMudwX/hvm+Uh2b/lQAcHVAisamaLkWdkwP9/S/tOKIgRrL6Oy+ZIGlOUdd6uYtk9Ma" +"/3pUpgcfNAj0vYm5gsyjQo9emsc+x6m4VWwk9iqMZSCK5EQkAq/Ut4n7KuLE1+gdftwdIgxfUsPt" +"4CyNrY50QV57KM2UT8x5rrmzEjr7TICGpSUAl2gVqe6xaii+bmYR1QrmWaBSAG59LrkrjrYtbRhF" +"boUDe1DK+6T8s5L6k8c8okpbHpa9veMztDVC9sPJ60MWXh6anVKo1UcLcbURyEeNvZneVRKAAU6o" +"uwdjDvwlsaKydFKwed0ToQ47bmUKgcm+wV3eTRk36UOnTwIDAQABo4HSMIHPME4GA1UdIARHMEUw" +"QwYFYEwBAQAwOjA4BggrBgEFBQcCARYsaHR0cDovL2FjcmFpei5pY3BicmFzaWwuZ292LmJyL0RQ" +"Q2FjcmFpei5wZGYwPQYDVR0fBDYwNDAyoDCgLoYsaHR0cDovL2FjcmFpei5pY3BicmFzaWwuZ292" +"LmJyL0xDUmFjcmFpei5jcmwwHQYDVR0OBBYEFIr68VeEERM1kEL6V0lUaQ2kxPA3MA8GA1UdEwEB" +"/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAZA5c1U/hgIh6OcgLA" +"fiJgFWpvmDZWqlV30/bHFpj8iBobJSm5uDpt7TirYh1Uxe3fQaGlYjJe+9zd+izPRbBqXPVQA34E" +"Xcwk4qpWuf1hHriWfdrx8AcqSqr6CuQFwSr75FosSzlwDADa70mT7wZjAmQhnZx2xJ6wfWlT9VQf" +"S//JYeIc7Fue2JNLd00UOSMMaiK/t79enKNHEA2fupH3vEigf5Eh4bVAN5VohrTm6MY53x7XQZZr" +"1ME7a55lFEnSeT0umlOAjR2mAbvSM5X5oSZNrmetdzyTj2flCM8CC7MLab0kkdngRIlUBGHF1/S5" +"nmPbK+9A46sd33oqK8n8"; + + mSha1RSATestCert = "-----BEGIN CERTIFICATE-----\n" + "MIIDFDCCAn2gAwIBAgIDDqqYMA0GCSqGSIb3DQEBBQUAME4xCzAJBgNVBAYTAlVT\n" + "MRAwDgYDVQQKEwdFcXVpZmF4MS0wKwYDVQQLEyRFcXVpZmF4IFNlY3VyZSBDZXJ0\n" + "aWZpY2F0ZSBBdXRob3JpdHkwHhcNMTAwMTA1MDAzNjMwWhcNMTEwMTA3MjAyMTE0\n" + "WjCBnjEpMCcGA1UEBRMgQmNmc0RBRkl1U0YwdFpWVm5vOFJKbjVUbW9hNGR2Wkgx\n" + "CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4g\n" + "RnJhbmNpc2NvMR0wGwYDVQQKExRMaW5kZW4gUmVzZWFyY2ggSW5jLjEYMBYGA1UE\n" + "AxQPKi5saW5kZW5sYWIuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQD2\n" + "14Jdko8v6GB33hHbW+lNQyloFQtc2h4ykjf+fYPJ27dw6tQO2if7N3k/5XDkwC1N\n" + "krGgE9vt3iecCPgasue6k67Zyfj9HbEP2D+j38eROudrsxLaRFDQx50BvZ5YMNl3\n" + "4zQCj8/gCMsuq8cvaP9/rbJTUpgYWFGLsm8yAYOgWwIDAQABo4GuMIGrMA4GA1Ud\n" + "DwEB/wQEAwIE8DAdBgNVHQ4EFgQUIBK/JB9AyqquSEbkzt2Zux6v9sYwOgYDVR0f\n" + "BDMwMTAvoC2gK4YpaHR0cDovL2NybC5nZW90cnVzdC5jb20vY3Jscy9zZWN1cmVj\n" + "YS5jcmwwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gjIBBPM5iQn9QwHQYDVR0lBBYw\n" + "FAYIKwYBBQUHAwEGCCsGAQUFBwMCMA0GCSqGSIb3DQEBBQUAA4GBAKKR84+hvLuB\n" + "pop9VG7HQPIyEKtZq3Nnk+UlJGfjGY3csLWSFmxU727r5DzdEP1W1PwF3rxuoKcZ\n" + "4nJJpKdzoGVujgBMP2U/J0PJvU7D8U3Zqu7nrXAjOHj7iVnvJ3EKJ1bvwXaisgPN\n" + "wt21kKfGnA4OlhJtJ6VQvUkcF12I3pTP\n" + "-----END CERTIFICATE-----\n"; + + mSha1RSATestCA = "-----BEGIN CERTIFICATE-----\n" + "MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV\n" + "UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy\n" + "dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1\n" + "MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx\n" + "dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B\n" + "AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f\n" + "BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A\n" + "cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC\n" + "AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ\n" + "MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm\n" + "aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw\n" + "ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj\n" + "IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF\n" + "MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA\n" + "A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y\n" + "7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh\n" + "1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4\n" + "-----END CERTIFICATE-----\n"; + + + + + mX509TestCert = NULL; + mX509RootCert = NULL; + mX509IntermediateCert = NULL; + mX509ChildCert = NULL; + + BIO * validation_bio = BIO_new_mem_buf((void*)mPemTestCert.c_str(), mPemTestCert.length()); + PEM_read_bio_X509(validation_bio, &mX509TestCert, 0, NULL); + BIO_free(validation_bio); + validation_bio = BIO_new_mem_buf((void*)mPemRootCert.c_str(), mPemRootCert.length()); + PEM_read_bio_X509(validation_bio, &mX509RootCert, 0, NULL); + BIO_free(validation_bio); + validation_bio = BIO_new_mem_buf((void*)mPemIntermediateCert.c_str(), mPemIntermediateCert.length()); + PEM_read_bio_X509(validation_bio, &mX509IntermediateCert, 0, NULL); + BIO_free(validation_bio); + validation_bio = BIO_new_mem_buf((void*)mPemChildCert.c_str(), mPemChildCert.length()); + PEM_read_bio_X509(validation_bio, &mX509ChildCert, 0, NULL); + BIO_free(validation_bio); + } + ~sechandler_basic_test() + { + LLFile::remove("test_password.dat"); + LLFile::remove("sechandler_settings.tmp"); + LLFile::remove("mycertstore.pem"); + X509_free(mX509TestCert); + X509_free(mX509RootCert); + X509_free(mX509IntermediateCert); + X509_free(mX509ChildCert); + } + }; + + // Tut templating thingamagic: test group, object and test instance + typedef test_group<sechandler_basic_test> sechandler_basic_test_factory; + typedef sechandler_basic_test_factory::object sechandler_basic_test_object; + tut::sechandler_basic_test_factory tut_test("llsechandler_basic"); + + // --------------------------------------------------------------------------------------- + // Test functions + // --------------------------------------------------------------------------------------- + // test cert data retrieval + template<> template<> + void sechandler_basic_test_object::test<1>() + + { + char buffer[4096]; + LLPointer<LLCertificate> test_cert = new LLBasicCertificate(mPemTestCert); + + ensure_equals("Resultant pem is correct", + mPemTestCert, test_cert->getPem()); + std::vector<U8> binary_cert = test_cert->getBinary(); + + apr_base64_encode(buffer, (const char *)&binary_cert[0], binary_cert.size()); + + ensure_equals("Der Format is correct", memcmp(buffer, mDerFormat.c_str(), mDerFormat.length()), 0); + + LLSD llsd_cert; + test_cert->getLLSD(llsd_cert); + std::ostringstream llsd_value; + llsd_value << LLSDOStreamer<LLSDNotationFormatter>(llsd_cert) << std::endl; + std::string llsd_cert_str = llsd_value.str(); + ensure_equals("Issuer Name/commonName", + (std::string)llsd_cert["issuer_name"]["commonName"], "Autoridade Certificadora Raiz Brasileira"); + ensure_equals("Issure Name/countryName", (std::string)llsd_cert["issuer_name"]["countryName"], "BR"); + ensure_equals("Issuer Name/localityName", (std::string)llsd_cert["issuer_name"]["localityName"], "Brasilia"); + ensure_equals("Issuer Name/org name", (std::string)llsd_cert["issuer_name"]["organizationName"], "ICP-Brasil"); + ensure_equals("IssuerName/org unit", + (std::string)llsd_cert["issuer_name"]["organizationalUnitName"], "Instituto Nacional de Tecnologia da Informacao - ITI"); + ensure_equals("IssuerName/state", (std::string)llsd_cert["issuer_name"]["stateOrProvinceName"], "DF"); + ensure_equals("Issuer name string", + (std::string)llsd_cert["issuer_name_string"], "CN=Autoridade Certificadora Raiz Brasileira,ST=DF," + "L=Brasilia,OU=Instituto Nacional de Tecnologia da Informacao - ITI,O=ICP-Brasil,C=BR"); + ensure_equals("subject Name/commonName", + (std::string)llsd_cert["subject_name"]["commonName"], "Autoridade Certificadora Raiz Brasileira"); + ensure_equals("subject Name/countryName", (std::string)llsd_cert["subject_name"]["countryName"], "BR"); + ensure_equals("subject Name/localityName", (std::string)llsd_cert["subject_name"]["localityName"], "Brasilia"); + ensure_equals("subject Name/org name", (std::string)llsd_cert["subject_name"]["organizationName"], "ICP-Brasil"); + ensure_equals("subjectName/org unit", + (std::string)llsd_cert["subject_name"]["organizationalUnitName"], "Instituto Nacional de Tecnologia da Informacao - ITI"); + ensure_equals("subjectName/state", (std::string)llsd_cert["subject_name"]["stateOrProvinceName"], "DF"); + ensure_equals("subject name string", + (std::string)llsd_cert["subject_name_string"], "CN=Autoridade Certificadora Raiz Brasileira,ST=DF," + "L=Brasilia,OU=Instituto Nacional de Tecnologia da Informacao - ITI,O=ICP-Brasil,C=BR"); + + ensure_equals("md5 digest", (std::string)llsd_cert["md5_digest"], "96:89:7d:61:d1:55:2b:27:e2:5a:39:b4:2a:6c:44:6f"); + ensure_equals("serial number", (std::string)llsd_cert["serial_number"], "04"); + // sha1 digest is giving a weird value, and I've no idea why...feh + //ensure_equals("sha1 digest", (std::string)llsd_cert["sha1_digest"], "8e:fd:ca:bc:93:e6:1e:92:5d:4d:1d:ed:18:1a:43:20:a4:67:a1:39"); + ensure_equals("valid from", (std::string)llsd_cert["valid_from"], "2001-11-30T12:58:00Z"); + ensure_equals("valid to", (std::string)llsd_cert["valid_to"], "2011-11-30T23:59:00Z"); + LLSD expectedKeyUsage = LLSD::emptyArray(); + expectedKeyUsage.append(LLSD((std::string)"certSigning")); + expectedKeyUsage.append(LLSD((std::string)"crlSigning")); + ensure("key usage", valueCompareLLSD(llsd_cert["keyUsage"], expectedKeyUsage)); + ensure("basic constraints", (bool)llsd_cert["basicConstraints"]["CA"]); + + ensure("x509 is equal", !X509_cmp(mX509TestCert, test_cert->getOpenSSLX509())); + } + + + // test protected data + template<> template<> + void sechandler_basic_test_object::test<2>() + + { + + std::string protected_data = "sUSh3wj77NG9oAMyt3XIhaej3KLZhLZWFZvI6rIGmwUUOmmelrRg0NI9rkOj8ZDpTPxpwToaBT5u" + "GQhakdaGLJznr9bHr4/6HIC1bouKj4n2rs4TL6j2WSjto114QdlNfLsE8cbbE+ghww58g8SeyLQO" + "nyzXoz+/PBz0HD5SMFDuObccoPW24gmqYySz8YoEWhSwO0pUtEEqOjVRsAJgF5wLAtJZDeuilGsq" + "4ZT9Y4wZ9Rh8nnF3fDUL6IGamHe1ClXM1jgBu10F6UMhZbnH4C3aJ2E9+LiOntU+l3iCb2MpkEpr" + "82r2ZAMwIrpnirL/xoYoyz7MJQYwUuMvBPToZJrxNSsjI+S2Z+I3iEJAELMAAA=="; + + std::vector<U8> binary_data(apr_base64_decode_len(protected_data.c_str())); + apr_base64_decode_binary(&binary_data[0], protected_data.c_str()); + + LLXORCipher cipher(gMACAddress, MAC_ADDRESS_BYTES); + cipher.decrypt(&binary_data[0], 16); + unsigned char unique_id[MAC_ADDRESS_BYTES]; + LLMachineID::getUniqueID(unique_id, sizeof(unique_id)); + LLXORCipher cipher2(unique_id, sizeof(unique_id)); + cipher2.encrypt(&binary_data[0], 16); + std::ofstream temp_file("sechandler_settings.tmp", std::ofstream::binary); + temp_file.write((const char *)&binary_data[0], binary_data.size()); + temp_file.close(); + + LLPointer<LLSecAPIBasicHandler> handler = new LLSecAPIBasicHandler("sechandler_settings.tmp", + "test_password.dat"); + handler->init(); + // data retrieval for existing data + LLSD data = handler->getProtectedData("test_data_type", "test_data_id"); + + + ensure_equals("retrieve existing data1", (std::string)data["data1"], "test_data_1"); + ensure_equals("retrieve existing data2", (std::string)data["data2"], "test_data_2"); + ensure_equals("retrieve existing data3", (std::string)data["data3"]["elem1"], "test element1"); + + // data storage + LLSD store_data = LLSD::emptyMap(); + store_data["store_data1"] = "test_store_data1"; + store_data["store_data2"] = 27; + store_data["store_data3"] = LLSD::emptyMap(); + store_data["store_data3"]["subelem1"] = "test_subelem1"; + + handler->setProtectedData("test_data_type", "test_data_id1", store_data); + data = handler->getProtectedData("test_data_type", "test_data_id"); + + data = handler->getProtectedData("test_data_type", "test_data_id"); + // verify no overwrite of existing data + ensure_equals("verify no overwrite 1", (std::string)data["data1"], "test_data_1"); + ensure_equals("verify no overwrite 2", (std::string)data["data2"], "test_data_2"); + ensure_equals("verify no overwrite 3", (std::string)data["data3"]["elem1"], "test element1"); + + // verify written data is good + data = handler->getProtectedData("test_data_type", "test_data_id1"); + ensure_equals("verify stored data1", (std::string)data["store_data1"], "test_store_data1"); + ensure_equals("verify stored data2", (int)data["store_data2"], 27); + ensure_equals("verify stored data3", (std::string)data["store_data3"]["subelem1"], "test_subelem1"); + + // verify overwrite works + handler->setProtectedData("test_data_type", "test_data_id", store_data); + data = handler->getProtectedData("test_data_type", "test_data_id"); + ensure_equals("verify overwrite stored data1", (std::string)data["store_data1"], "test_store_data1"); + ensure_equals("verify overwrite stored data2", (int)data["store_data2"], 27); + ensure_equals("verify overwrite stored data3", (std::string)data["store_data3"]["subelem1"], "test_subelem1"); + + // verify other datatype doesn't conflict + store_data["store_data3"] = "test_store_data3"; + store_data["store_data4"] = 28; + store_data["store_data5"] = LLSD::emptyMap(); + store_data["store_data5"]["subelem2"] = "test_subelem2"; + + handler->setProtectedData("test_data_type1", "test_data_id", store_data); + data = handler->getProtectedData("test_data_type1", "test_data_id"); + ensure_equals("verify datatype stored data3", (std::string)data["store_data3"], "test_store_data3"); + ensure_equals("verify datatype stored data4", (int)data["store_data4"], 28); + ensure_equals("verify datatype stored data5", (std::string)data["store_data5"]["subelem2"], "test_subelem2"); + + // test data not found + + data = handler->getProtectedData("test_data_type1", "test_data_not_found"); + ensure("not found", data.isUndefined()); + + // cause a 'write' by using 'LLPointer' to delete then instantiate a handler + handler = NULL; + handler = new LLSecAPIBasicHandler("sechandler_settings.tmp", "test_password.dat"); + handler->init(); + + data = handler->getProtectedData("test_data_type1", "test_data_id"); + ensure_equals("verify datatype stored data3a", (std::string)data["store_data3"], "test_store_data3"); + ensure_equals("verify datatype stored data4a", (int)data["store_data4"], 28); + ensure_equals("verify datatype stored data5a", (std::string)data["store_data5"]["subelem2"], "test_subelem2"); + + // rewrite the initial file to verify reloads + handler = NULL; + std::ofstream temp_file2("sechandler_settings.tmp", std::ofstream::binary); + temp_file2.write((const char *)&binary_data[0], binary_data.size()); + temp_file2.close(); + + // cause a 'write' + handler = new LLSecAPIBasicHandler("sechandler_settings.tmp", "test_password.dat"); + handler->init(); + data = handler->getProtectedData("test_data_type1", "test_data_id"); + ensure("not found", data.isUndefined()); + + handler->deleteProtectedData("test_data_type", "test_data_id"); + ensure("Deleted data not found", handler->getProtectedData("test_data_type", "test_data_id").isUndefined()); + + LLFile::remove("sechandler_settings.tmp"); + handler = new LLSecAPIBasicHandler("sechandler_settings.tmp", "test_password.dat"); + handler->init(); + data = handler->getProtectedData("test_data_type1", "test_data_id"); + ensure("not found", data.isUndefined()); + handler = NULL; + + ensure(LLFile::isfile("sechandler_settings.tmp")); + } + + // test credenitals + template<> template<> + void sechandler_basic_test_object::test<3>() + { + LLPointer<LLSecAPIBasicHandler> handler = new LLSecAPIBasicHandler("sechandler_settings.tmp", "test_password.dat"); + handler->init(); + + LLSD my_id = LLSD::emptyMap(); + LLSD my_authenticator = LLSD::emptyMap(); + my_id["type"] = "test_type"; + my_id["username"] = "testuser@lindenlab.com"; + my_authenticator["type"] = "test_auth"; + my_authenticator["creds"] = "12345"; + + // test creation of credentials + LLPointer<LLCredential> my_cred = handler->createCredential("my_grid", my_id, my_authenticator); + + // test retrieval of credential components + ensure_equals("basic credential creation: identifier", my_id, my_cred->getIdentifier()); + ensure_equals("basic credential creation: authenticator", my_authenticator, my_cred->getAuthenticator()); + ensure_equals("basic credential creation: grid", "my_grid", my_cred->getGrid()); + + // test setting/overwriting of credential components + my_id["first_name"] = "firstname"; + my_id.erase("username"); + my_authenticator.erase("creds"); + my_authenticator["hash"] = "6563245"; + + my_cred->setCredentialData(my_id, my_authenticator); + ensure_equals("set credential data: identifier", my_id, my_cred->getIdentifier()); + ensure_equals("set credential data: authenticator", my_authenticator, my_cred->getAuthenticator()); + ensure_equals("set credential data: grid", "my_grid", my_cred->getGrid()); + + // test loading of a credential, that hasn't been saved, without + // any legacy saved credential data + LLPointer<LLCredential> my_new_cred = handler->loadCredential("my_grid2"); + ensure("unknown credential load test", my_new_cred->getIdentifier().isMap()); + ensure("unknown credential load test", !my_new_cred->getIdentifier().has("type")); + ensure("unknown credential load test", my_new_cred->getAuthenticator().isMap()); + ensure("unknown credential load test", !my_new_cred->getAuthenticator().has("type")); + // test saving of a credential + handler->saveCredential(my_cred, true); + + // test loading of a known credential + my_new_cred = handler->loadCredential("my_grid"); + ensure_equals("load a known credential: identifier", my_id, my_new_cred->getIdentifier()); + ensure_equals("load a known credential: authenticator",my_authenticator, my_new_cred->getAuthenticator()); + ensure_equals("load a known credential: grid", "my_grid", my_cred->getGrid()); + + // test deletion of a credential + handler->deleteCredential(my_new_cred); + + ensure("delete credential: identifier", my_new_cred->getIdentifier().isUndefined()); + ensure("delete credentialt: authenticator", my_new_cred->getIdentifier().isUndefined()); + ensure_equals("delete credential: grid", "my_grid", my_cred->getGrid()); + // load unknown cred + + my_new_cred = handler->loadCredential("my_grid"); + ensure("deleted credential load test", my_new_cred->getIdentifier().isMap()); + ensure("deleted credential load test", !my_new_cred->getIdentifier().has("type")); + ensure("deleted credential load test", my_new_cred->getAuthenticator().isMap()); + ensure("deleted credential load test", !my_new_cred->getAuthenticator().has("type")); + + // test loading of an unknown credential with legacy saved username, but without + // saved password + gFirstName = "myfirstname"; + gLastName = "mylastname"; + my_new_cred = handler->loadCredential("my_legacy_grid"); + ensure_equals("legacy credential with no password: type", + (const std::string)my_new_cred->getIdentifier()["type"], "agent"); + ensure_equals("legacy credential with no password: first_name", + (const std::string)my_new_cred->getIdentifier()["first_name"], "myfirstname"); + ensure_equals("legacy credential with no password: last_name", + (const std::string)my_new_cred->getIdentifier()["last_name"], "mylastname"); + + ensure("legacy credential with no password: no authenticator", my_new_cred->getAuthenticator().isUndefined()); + + // test loading of an unknown credential with legacy saved password and username + + std::string hashed_password = "fSQcLG03eyIWJmkzfyYaKm81dSweLmsxeSAYKGE7fSQ="; + int length = apr_base64_decode_len(hashed_password.c_str()); + std::vector<char> decoded_password(length); + apr_base64_decode(&decoded_password[0], hashed_password.c_str()); + LLXORCipher cipher(gMACAddress, MAC_ADDRESS_BYTES); + cipher.decrypt((U8*)&decoded_password[0], length); + unsigned char unique_id[MAC_ADDRESS_BYTES]; + LLMachineID::getUniqueID(unique_id, sizeof(unique_id)); + LLXORCipher cipher2(unique_id, sizeof(unique_id)); + cipher2.encrypt((U8*)&decoded_password[0], length); + llofstream password_file("test_password.dat", std::ofstream::binary); + password_file.write(&decoded_password[0], length); + password_file.close(); + + my_new_cred = handler->loadCredential("my_legacy_grid2"); + ensure_equals("legacy credential with password: type", + (const std::string)my_new_cred->getIdentifier()["type"], "agent"); + ensure_equals("legacy credential with password: first_name", + (const std::string)my_new_cred->getIdentifier()["first_name"], "myfirstname"); + ensure_equals("legacy credential with password: last_name", + (const std::string)my_new_cred->getIdentifier()["last_name"], "mylastname"); + + LLSD legacy_authenticator = my_new_cred->getAuthenticator(); + ensure_equals("legacy credential with password: type", + (std::string)legacy_authenticator["type"], + "hash"); + ensure_equals("legacy credential with password: algorithm", + (std::string)legacy_authenticator["algorithm"], + "md5"); + ensure_equals("legacy credential with password: algorithm", + (std::string)legacy_authenticator["secret"], + "01234567890123456789012345678901"); + + // test creation of credentials + my_cred = handler->createCredential("mysavedgrid", my_id, my_authenticator); + // test save without saving authenticator. + handler->saveCredential(my_cred, FALSE); + my_new_cred = handler->loadCredential("mysavedgrid"); + ensure_equals("saved credential without auth", + (const std::string)my_new_cred->getIdentifier()["type"], "test_type"); + ensure("no authenticator values were saved", my_new_cred->getAuthenticator().isUndefined()); + } + + // test cert vector + template<> template<> + void sechandler_basic_test_object::test<4>() + { + + // validate create from empty vector + LLPointer<LLBasicCertificateVector> test_vector = new LLBasicCertificateVector(); + ensure_equals("when loading with nothing, we should result in no certs in vector", test_vector->size(), 0); + + test_vector->add(new LLBasicCertificate(mPemTestCert)); + ensure_equals("one element in vector", test_vector->size(), 1); + test_vector->add(new LLBasicCertificate(mPemChildCert)); + ensure_equals("two elements in vector after add", test_vector->size(), 2); + + test_vector->add(new LLBasicCertificate(mPemChildCert)); + ensure_equals("two elements in vector after re-add", test_vector->size(), 2); + // validate order + X509* test_cert = (*test_vector)[0]->getOpenSSLX509(); + ensure("first cert added remains first cert", !X509_cmp(test_cert, mX509TestCert)); + X509_free(test_cert); + + test_cert = (*test_vector)[1]->getOpenSSLX509(); + ensure("adding a duplicate cert", !X509_cmp(test_cert, mX509ChildCert)); + X509_free(test_cert); + + // + // validate iterator + // + LLBasicCertificateVector::iterator current_cert = test_vector->begin(); + LLBasicCertificateVector::iterator copy_current_cert = current_cert; + // operator++(int) + ensure("validate iterator++ element in vector is expected cert", *current_cert++ == (*test_vector)[0]); + ensure("validate 2nd iterator++ element in vector is expected cert", *current_cert++ == (*test_vector)[1]); + ensure("validate end iterator++", current_cert == test_vector->end()); + + // copy + ensure("validate copy iterator element in vector is expected cert", *copy_current_cert == (*test_vector)[0]); + + // operator--(int) + current_cert--; + ensure("validate iterator-- element in vector is expected cert", *current_cert-- == (*test_vector)[1]); + ensure("validate iterator-- element in vector is expected cert", *current_cert == (*test_vector)[0]); + + ensure("begin iterator is equal", current_cert == test_vector->begin()); + + // operator++ + ensure("validate ++iterator element in vector is expected cert", *++current_cert == (*test_vector)[1]); + ensure("end of cert vector after ++iterator", ++current_cert == test_vector->end()); + // operator-- + ensure("validate --iterator element in vector is expected cert", *--current_cert == (*test_vector)[1]); + ensure("validate 2nd --iterator element in vector is expected cert", *--current_cert == (*test_vector)[0]); + + // validate remove + // validate create from empty vector + test_vector = new LLBasicCertificateVector(); + test_vector->add(new LLBasicCertificate(mPemTestCert)); + test_vector->add(new LLBasicCertificate(mPemChildCert)); + test_vector->erase(test_vector->begin()); + ensure_equals("one element in store after remove", test_vector->size(), 1); + test_cert = (*test_vector)[0]->getOpenSSLX509(); + ensure("validate cert was removed", !X509_cmp(test_cert, mX509ChildCert)); + X509_free(test_cert); + + // validate insert + test_vector->insert(test_vector->begin(), new LLBasicCertificate(mPemChildCert)); + test_cert = (*test_vector)[0]->getOpenSSLX509(); + + ensure("validate cert was inserted", !X509_cmp(test_cert, mX509ChildCert)); + X509_free(test_cert); + + //validate find + LLSD find_info = LLSD::emptyMap(); + test_vector->insert(test_vector->begin(), new LLBasicCertificate(mPemRootCert)); + find_info["issuer_name"] = LLSD::emptyMap(); + find_info["issuer_name"]["commonName"] = "Roxies intermediate CA"; + find_info["md5_digest"] = "97:24:c7:4c:d4:ba:2d:0e:9c:a1:18:8e:3a:c6:1f:c3"; + current_cert = test_vector->find(find_info); + ensure("found", current_cert != test_vector->end()); + ensure("found cert", (*current_cert).get() == (*test_vector)[1].get()); + find_info["sha1_digest"] = "bad value"; + current_cert =test_vector->find(find_info); + ensure("didn't find cert", current_cert == test_vector->end()); + } + + // test cert store + template<> template<> + void sechandler_basic_test_object::test<5>() + { + // validate load with nothing + LLFile::remove("mycertstore.pem"); + LLPointer<LLBasicCertificateStore> test_store = new LLBasicCertificateStore("mycertstore.pem"); + ensure_equals("when loading with nothing, we should result in no certs in store", test_store->size(), 0); + + // validate load with empty file + test_store->save(); + test_store = NULL; + test_store = new LLBasicCertificateStore("mycertstore.pem"); + ensure_equals("when loading with nothing, we should result in no certs in store", test_store->size(), 0); + test_store=NULL; + + // instantiate a cert store from a file + llofstream certstorefile("mycertstore.pem", std::ios::out); + certstorefile << mPemChildCert << std::endl << mPemTestCert << std::endl; + certstorefile.close(); + // validate loaded certs + test_store = new LLBasicCertificateStore("mycertstore.pem"); + ensure_equals("two elements in store", test_store->size(), 2); + + // operator[] + X509* test_cert = (*test_store)[0]->getOpenSSLX509(); + + ensure("validate first element in store is expected cert", !X509_cmp(test_cert, mX509ChildCert)); + X509_free(test_cert); + test_cert = (*test_store)[1]->getOpenSSLX509(); + ensure("validate second element in store is expected cert", !X509_cmp(test_cert, mX509TestCert)); + X509_free(test_cert); + + + // validate save + LLFile::remove("mycertstore.pem"); + test_store->save(); + test_store = NULL; + test_store = new LLBasicCertificateStore("mycertstore.pem"); + ensure_equals("two elements in store after save", test_store->size(), 2); + LLCertificateStore::iterator current_cert = test_store->begin(); + test_cert = (*current_cert)->getOpenSSLX509(); + ensure("validate first element in store is expected cert", !X509_cmp(test_cert, mX509ChildCert)); + current_cert++; + X509_free(test_cert); + test_cert = (*current_cert)->getOpenSSLX509(); + ensure("validate second element in store is expected cert", !X509_cmp(test_cert, mX509TestCert)); + X509_free(test_cert); + current_cert++; + ensure("end of cert store", current_cert == test_store->end()); + + } + + // cert name wildcard matching + template<> template<> + void sechandler_basic_test_object::test<6>() + { + ensure("simple name match", + _cert_hostname_wildcard_match("foo", "foo")); + + ensure("simple name match, with end period", + _cert_hostname_wildcard_match("foo.", "foo.")); + + ensure("simple name match, with begin period", + _cert_hostname_wildcard_match(".foo", ".foo")); + + ensure("simple name match, with mismatched period cn", + _cert_hostname_wildcard_match("foo.", "foo")); + + ensure("simple name match, with mismatched period hostname", + _cert_hostname_wildcard_match("foo", "foo.")); + + ensure("simple name match, with subdomain", + _cert_hostname_wildcard_match("foo.bar", "foo.bar")); + + ensure("stutter name match", + _cert_hostname_wildcard_match("foobbbbfoo", "foo*bbbfoo")); + + ensure("simple name match, with beginning wildcard", + _cert_hostname_wildcard_match("foobar", "*bar")); + + ensure("simple name match, with ending wildcard", + _cert_hostname_wildcard_match("foobar", "foo*")); + + ensure("simple name match, with beginning null wildcard", + _cert_hostname_wildcard_match("foobar", "*foobar")); + + ensure("simple name match, with ending null wildcard", + _cert_hostname_wildcard_match("foobar", "foobar*")); + + ensure("simple name match, with embedded wildcard", + _cert_hostname_wildcard_match("foobar", "f*r")); + + ensure("simple name match, with embedded null wildcard", + _cert_hostname_wildcard_match("foobar", "foo*bar")); + + ensure("simple name match, with dual embedded wildcard", + _cert_hostname_wildcard_match("foobar", "f*o*ar")); + + ensure("simple name mismatch", + !_cert_hostname_wildcard_match("bar", "foo")); + + ensure("simple name mismatch, with end period", + !_cert_hostname_wildcard_match("foobar.", "foo.")); + + ensure("simple name mismatch, with begin period", + !_cert_hostname_wildcard_match(".foobar", ".foo")); + + ensure("simple name mismatch, with subdomain", + !_cert_hostname_wildcard_match("foobar.bar", "foo.bar")); + + ensure("simple name mismatch, with beginning wildcard", + !_cert_hostname_wildcard_match("foobara", "*bar")); + + ensure("simple name mismatch, with ending wildcard", + !_cert_hostname_wildcard_match("oobar", "foo*")); + + ensure("simple name mismatch, with embedded wildcard", + !_cert_hostname_wildcard_match("oobar", "f*r")); + + ensure("simple name mismatch, with dual embedded wildcard", + !_cert_hostname_wildcard_match("foobar", "f*d*ar")); + + ensure("simple wildcard", + _cert_hostname_wildcard_match("foobar", "*")); + + ensure("long domain", + _cert_hostname_wildcard_match("foo.bar.com", "foo.bar.com")); + + ensure("long domain with multiple wildcards", + _cert_hostname_wildcard_match("foo.bar.com", "*.b*r.com")); + + ensure("end periods", + _cert_hostname_wildcard_match("foo.bar.com.", "*.b*r.com.")); + + ensure("match end period", + _cert_hostname_wildcard_match("foo.bar.com.", "*.b*r.com")); + + ensure("match end period2", + _cert_hostname_wildcard_match("foo.bar.com", "*.b*r.com.")); + + ensure("wildcard mismatch", + !_cert_hostname_wildcard_match("bar.com", "*.bar.com")); + + ensure("wildcard match", + _cert_hostname_wildcard_match("foo.bar.com", "*.bar.com")); + + ensure("wildcard match", + _cert_hostname_wildcard_match("foo.foo.bar.com", "*.bar.com")); + + ensure("wildcard match", + _cert_hostname_wildcard_match("foo.foo.bar.com", "*.*.com")); + + ensure("wildcard mismatch", + !_cert_hostname_wildcard_match("foo.foo.bar.com", "*.foo.com")); + } + + // test cert chain + template<> template<> + void sechandler_basic_test_object::test<7>() + { + // validate create from empty chain + LLPointer<LLBasicCertificateChain> test_chain = new LLBasicCertificateChain(NULL); + ensure_equals("when loading with nothing, we should result in no certs in chain", test_chain->size(), 0); + + // Single cert in the chain. + X509_STORE_CTX *test_store = X509_STORE_CTX_new(); + test_store->cert = mX509ChildCert; + test_store->untrusted = NULL; + test_chain = new LLBasicCertificateChain(test_store); + X509_STORE_CTX_free(test_store); + ensure_equals("two elements in store", test_chain->size(), 1); + X509* test_cert = (*test_chain)[0]->getOpenSSLX509(); + ensure("validate first element in store is expected cert", !X509_cmp(test_cert, mX509ChildCert)); + X509_free(test_cert); + + // cert + CA + + test_store = X509_STORE_CTX_new(); + test_store->cert = mX509ChildCert; + test_store->untrusted = sk_X509_new_null(); + sk_X509_push(test_store->untrusted, mX509IntermediateCert); + test_chain = new LLBasicCertificateChain(test_store); + X509_STORE_CTX_free(test_store); + ensure_equals("two elements in store", test_chain->size(), 2); + test_cert = (*test_chain)[0]->getOpenSSLX509(); + ensure("validate first element in store is expected cert", !X509_cmp(test_cert, mX509ChildCert)); + X509_free(test_cert); + test_cert = (*test_chain)[1]->getOpenSSLX509(); + ensure("validate second element in store is expected cert", !X509_cmp(test_cert, mX509IntermediateCert)); + X509_free(test_cert); + + // cert + nonrelated + + test_store = X509_STORE_CTX_new(); + test_store->cert = mX509ChildCert; + test_store->untrusted = sk_X509_new_null(); + sk_X509_push(test_store->untrusted, mX509TestCert); + test_chain = new LLBasicCertificateChain(test_store); + X509_STORE_CTX_free(test_store); + ensure_equals("two elements in store", test_chain->size(), 1); + test_cert = (*test_chain)[0]->getOpenSSLX509(); + ensure("validate first element in store is expected cert", !X509_cmp(test_cert, mX509ChildCert)); + X509_free(test_cert); + + // cert + CA + nonrelated + test_store = X509_STORE_CTX_new(); + test_store->cert = mX509ChildCert; + test_store->untrusted = sk_X509_new_null(); + sk_X509_push(test_store->untrusted, mX509IntermediateCert); + sk_X509_push(test_store->untrusted, mX509TestCert); + test_chain = new LLBasicCertificateChain(test_store); + X509_STORE_CTX_free(test_store); + ensure_equals("two elements in store", test_chain->size(), 2); + test_cert = (*test_chain)[0]->getOpenSSLX509(); + ensure("validate first element in store is expected cert", !X509_cmp(test_cert, mX509ChildCert)); + X509_free(test_cert); + test_cert = (*test_chain)[1]->getOpenSSLX509(); + ensure("validate second element in store is expected cert", !X509_cmp(test_cert, mX509IntermediateCert)); + X509_free(test_cert); + + // cert + intermediate + CA + test_store = X509_STORE_CTX_new(); + test_store->cert = mX509ChildCert; + test_store->untrusted = sk_X509_new_null(); + sk_X509_push(test_store->untrusted, mX509IntermediateCert); + sk_X509_push(test_store->untrusted, mX509RootCert); + test_chain = new LLBasicCertificateChain(test_store); + X509_STORE_CTX_free(test_store); + ensure_equals("three elements in store", test_chain->size(), 3); + test_cert = (*test_chain)[0]->getOpenSSLX509(); + ensure("validate first element in store is expected cert", !X509_cmp(test_cert, mX509ChildCert)); + X509_free(test_cert); + test_cert = (*test_chain)[1]->getOpenSSLX509(); + ensure("validate second element in store is expected cert", !X509_cmp(test_cert, mX509IntermediateCert)); + X509_free(test_cert); + + test_cert = (*test_chain)[2]->getOpenSSLX509(); + ensure("validate second element in store is expected cert", !X509_cmp(test_cert, mX509RootCert)); + X509_free(test_cert); + } + // test cert validation + template<> template<> + void sechandler_basic_test_object::test<8>() + { + // start with a trusted store with our known root cert + LLFile::remove("mycertstore.pem"); + LLPointer<LLBasicCertificateStore> test_store = new LLBasicCertificateStore("mycertstore.pem"); + test_store->add(new LLBasicCertificate(mX509RootCert)); + LLSD validation_params; + + // validate basic trust for a chain containing only the intermediate cert. (1 deep) + LLPointer<LLBasicCertificateChain> test_chain = new LLBasicCertificateChain(NULL); + + test_chain->add(new LLBasicCertificate(mX509IntermediateCert)); + + test_store->validate(0, test_chain, validation_params); + + // add the root certificate to the chain and revalidate + test_chain->add(new LLBasicCertificate(mX509RootCert)); + test_store->validate(0, test_chain, validation_params); + + // add the child cert at the head of the chain, and revalidate (3 deep chain) + test_chain->insert(test_chain->begin(), new LLBasicCertificate(mX509ChildCert)); + test_store->validate(0, test_chain, validation_params); + + // basic failure cases + test_chain = new LLBasicCertificateChain(NULL); + //validate with only the child cert in chain, but child cert was previously + // trusted + test_chain->add(new LLBasicCertificate(mX509ChildCert)); + + // validate without the trust flag. + test_store->validate(VALIDATION_POLICY_TRUSTED, test_chain, validation_params); + + // Validate with child cert but no parent, and no parent in CA store + test_store = new LLBasicCertificateStore("mycertstore.pem"); + ensure_throws("no CA, with only a child cert", + LLCertValidationTrustException, + (*test_chain)[0], + test_store->validate, + VALIDATION_POLICY_TRUSTED, + test_chain, + validation_params); + + + // validate without the trust flag. + test_store->validate(0, test_chain, validation_params); + + // clear out the store + test_store = new LLBasicCertificateStore("mycertstore.pem"); + // append the intermediate cert + test_chain->add(new LLBasicCertificate(mX509IntermediateCert)); + ensure_throws("no CA, with child and intermediate certs", + LLCertValidationTrustException, + (*test_chain)[1], + test_store->validate, + VALIDATION_POLICY_TRUSTED, + test_chain, + validation_params); + // validate without the trust flag + test_store->validate(0, test_chain, validation_params); + + // Test time validity + LLSD child_info; + ((*test_chain)[0])->getLLSD(child_info); + validation_params = LLSD::emptyMap(); + validation_params[CERT_VALIDATION_DATE] = LLDate(child_info[CERT_VALID_FROM].asDate().secondsSinceEpoch() + 1.0); + test_store->validate(VALIDATION_POLICY_TIME, test_chain, validation_params); + + validation_params = LLSD::emptyMap(); + validation_params[CERT_VALIDATION_DATE] = child_info[CERT_VALID_FROM].asDate(); + + validation_params[CERT_VALIDATION_DATE] = LLDate(child_info[CERT_VALID_FROM].asDate().secondsSinceEpoch() - 1.0); + + // test not yet valid + ensure_throws("Child cert not yet valid" , + LLCertValidationExpirationException, + (*test_chain)[0], + test_store->validate, + VALIDATION_POLICY_TIME, + test_chain, + validation_params); + validation_params = LLSD::emptyMap(); + validation_params[CERT_VALIDATION_DATE] = LLDate(child_info[CERT_VALID_TO].asDate().secondsSinceEpoch() + 1.0); + + // test cert expired + ensure_throws("Child cert expired", + LLCertValidationExpirationException, + (*test_chain)[0], + test_store->validate, + VALIDATION_POLICY_TIME, + test_chain, + validation_params); + + // test SSL KU + // validate basic trust for a chain containing child and intermediate. + test_chain = new LLBasicCertificateChain(NULL); + test_chain->add(new LLBasicCertificate(mX509ChildCert)); + test_chain->add(new LLBasicCertificate(mX509IntermediateCert)); + test_store->validate(VALIDATION_POLICY_SSL_KU, test_chain, validation_params); + + test_chain = new LLBasicCertificateChain(NULL); + test_chain->add(new LLBasicCertificate(mX509TestCert)); + + test_store = new LLBasicCertificateStore("mycertstore.pem"); + ensure_throws("Cert doesn't have ku", + LLCertKeyUsageValidationException, + (*test_chain)[0], + test_store->validate, + VALIDATION_POLICY_SSL_KU, + test_chain, + validation_params); + + // test sha1RSA validation + test_chain = new LLBasicCertificateChain(NULL); + test_chain->add(new LLBasicCertificate(mSha1RSATestCert)); + test_chain->add(new LLBasicCertificate(mSha1RSATestCA)); + + test_store->validate(0, test_chain, validation_params); + } + +}; + diff --git a/indra/newview/tests/llslurl_test.cpp b/indra/newview/tests/llslurl_test.cpp new file mode 100644 index 0000000000..803020dc7a --- /dev/null +++ b/indra/newview/tests/llslurl_test.cpp @@ -0,0 +1,258 @@ +/** + * @file llsecapi_test.cpp + * @author Roxie + * @date 2009-02-10 + * @brief Test the sec api functionality + * + * $LicenseInfo:firstyear=2009&license=viewergpl$ + * + * Copyright (c) 2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version maps.secondlife.com2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ +#include "../llviewerprecompiledheaders.h" +#include "../llviewernetwork.h" +#include "../test/lltut.h" +#include "../llslurl.h" +#include "../../llxml/llcontrol.h" +#include "llsdserialize.h" +//---------------------------------------------------------------------------- +// Mock objects for the dependencies of the code we're testing + +LLControlGroup::LLControlGroup(const std::string& name) +: LLInstanceTracker<LLControlGroup, std::string>(name) {} +LLControlGroup::~LLControlGroup() {} +BOOL LLControlGroup::declareString(const std::string& name, + const std::string& initial_val, + const std::string& comment, + BOOL persist) {return TRUE;} +void LLControlGroup::setString(const std::string& name, const std::string& val){} + +std::string gCmdLineLoginURI; +std::string gCmdLineGridChoice; +std::string gCmdLineHelperURI; +std::string gLoginPage; +std::string gCurrentGrid; +std::string LLControlGroup::getString(const std::string& name) +{ + if (name == "CmdLineGridChoice") + return gCmdLineGridChoice; + else if (name == "CmdLineHelperURI") + return gCmdLineHelperURI; + else if (name == "LoginPage") + return gLoginPage; + else if (name == "CurrentGrid") + return gCurrentGrid; + return ""; +} + +LLSD LLControlGroup::getLLSD(const std::string& name) +{ + if (name == "CmdLineLoginURI") + { + if(!gCmdLineLoginURI.empty()) + { + return LLSD(gCmdLineLoginURI); + } + } + return LLSD(); +} + + +LLControlGroup gSavedSettings("test"); + +// ------------------------------------------------------------------------------------------- +// TUT +// ------------------------------------------------------------------------------------------- +namespace tut +{ + // Test wrapper declaration : wrapping nothing for the moment + struct slurlTest + { + slurlTest() + { + LLGridManager::getInstance()->initialize(std::string("")); + } + ~slurlTest() + { + } + }; + + // Tut templating thingamagic: test group, object and test instance + typedef test_group<slurlTest> slurlTestFactory; + typedef slurlTestFactory::object slurlTestObject; + tut::slurlTestFactory tut_test("llslurl"); + + // --------------------------------------------------------------------------------------- + // Test functions + // --------------------------------------------------------------------------------------- + // construction from slurl string + template<> template<> + void slurlTestObject::test<1>() + { + LLGridManager::getInstance()->setGridChoice("util.agni.lindenlab.com"); + + LLSLURL slurl = LLSLURL(""); + ensure_equals("null slurl", (int)slurl.getType(), LLSLURL::LAST_LOCATION); + + slurl = LLSLURL("http://slurl.com/secondlife/myregion"); + ensure_equals("slurl.com slurl, region only - type", slurl.getType(), LLSLURL::LOCATION); + ensure_equals("slurl.com slurl, region only", slurl.getSLURLString(), + "http://maps.secondlife.com/secondlife/myregion/128/128/0"); + + slurl = LLSLURL("http://maps.secondlife.com/secondlife/myregion/1/2/3"); + ensure_equals("maps.secondlife.com slurl, region + coords - type", slurl.getType(), LLSLURL::LOCATION); + ensure_equals("maps.secondlife.com slurl, region + coords", slurl.getSLURLString(), + "http://maps.secondlife.com/secondlife/myregion/1/2/3"); + + slurl = LLSLURL("secondlife://myregion"); + ensure_equals("secondlife: slurl, region only - type", slurl.getType(), LLSLURL::LOCATION); + ensure_equals("secondlife: slurl, region only", slurl.getSLURLString(), + "http://maps.secondlife.com/secondlife/myregion/128/128/0"); + + slurl = LLSLURL("secondlife://myregion/1/2/3"); + ensure_equals("secondlife: slurl, region + coords - type", slurl.getType(), LLSLURL::LOCATION); + ensure_equals("secondlife slurl, region + coords", slurl.getSLURLString(), + "http://maps.secondlife.com/secondlife/myregion/1/2/3"); + + slurl = LLSLURL("/myregion"); + ensure_equals("/region slurl, region- type", slurl.getType(), LLSLURL::LOCATION); + ensure_equals("/region slurl, region ", slurl.getSLURLString(), + "http://maps.secondlife.com/secondlife/myregion/128/128/0"); + + slurl = LLSLURL("/myregion/1/2/3"); + ensure_equals("/: slurl, region + coords - type", slurl.getType(), LLSLURL::LOCATION); + ensure_equals("/ slurl, region + coords", slurl.getSLURLString(), + "http://maps.secondlife.com/secondlife/myregion/1/2/3"); + + slurl = LLSLURL("my region/1/2/3"); + ensure_equals(" slurl, region + coords - type", slurl.getType(), LLSLURL::LOCATION); + ensure_equals(" slurl, region + coords", slurl.getSLURLString(), + "http://maps.secondlife.com/secondlife/my%20region/1/2/3"); + + slurl = LLSLURL("https://my.grid.com/region/my%20region/1/2/3"); + ensure_equals("grid slurl, region + coords - type", slurl.getType(), LLSLURL::LOCATION); + ensure_equals("grid slurl, region + coords", slurl.getSLURLString(), + "https://my.grid.com/region/my%20region/1/2/3"); + + slurl = LLSLURL("https://my.grid.com/region/my region"); + ensure_equals("grid slurl, region + coords - type", slurl.getType(), LLSLURL::LOCATION); + ensure_equals("grid slurl, region + coords", slurl.getSLURLString(), + "https://my.grid.com/region/my%20region/128/128/0"); + + LLGridManager::getInstance()->setGridChoice("foo.bar.com"); + slurl = LLSLURL("/myregion/1/2/3"); + ensure_equals("/: slurl, region + coords - type", slurl.getType(), LLSLURL::LOCATION); + ensure_equals("/ slurl, region + coords", slurl.getSLURLString(), + "https://foo.bar.com/region/myregion/1/2/3"); + + slurl = LLSLURL("myregion/1/2/3"); + ensure_equals(": slurl, region + coords - type", slurl.getType(), LLSLURL::LOCATION); + ensure_equals(" slurl, region + coords", slurl.getSLURLString(), + "https://foo.bar.com/region/myregion/1/2/3"); + + slurl = LLSLURL(LLSLURL::SIM_LOCATION_HOME); + ensure_equals("home", slurl.getType(), LLSLURL::HOME_LOCATION); + + slurl = LLSLURL(LLSLURL::SIM_LOCATION_LAST); + ensure_equals("last", slurl.getType(), LLSLURL::LAST_LOCATION); + + slurl = LLSLURL("secondlife:///app/foo/bar?12345"); + ensure_equals("app", slurl.getType(), LLSLURL::APP); + ensure_equals("appcmd", slurl.getAppCmd(), "foo"); + ensure_equals("apppath", slurl.getAppPath().size(), 1); + ensure_equals("apppath2", slurl.getAppPath()[0].asString(), "bar"); + ensure_equals("appquery", slurl.getAppQuery(), "12345"); + ensure_equals("grid1", "foo.bar.com", slurl.getGrid()); + + slurl = LLSLURL("secondlife://Aditi/app/foo/bar?12345"); + ensure_equals("app", slurl.getType(), LLSLURL::APP); + ensure_equals("appcmd", slurl.getAppCmd(), "foo"); + ensure_equals("apppath", slurl.getAppPath().size(), 1); + ensure_equals("apppath2", slurl.getAppPath()[0].asString(), "bar"); + ensure_equals("appquery", slurl.getAppQuery(), "12345"); + ensure_equals("grid2", "util.aditi.lindenlab.com", slurl.getGrid()); + + LLGridManager::getInstance()->setGridChoice("foo.bar.com"); + slurl = LLSLURL("secondlife:///secondlife/myregion/1/2/3"); + ensure_equals("/: slurl, region + coords - type", slurl.getType(), LLSLURL::LOCATION); + ensure_equals("location", slurl.getType(), LLSLURL::LOCATION); + ensure_equals("region" , "myregion", slurl.getRegion()); + ensure_equals("grid3", "util.agni.lindenlab.com", slurl.getGrid()); + + slurl = LLSLURL("secondlife://Aditi/secondlife/myregion/1/2/3"); + ensure_equals("/: slurl, region + coords - type", slurl.getType(), LLSLURL::LOCATION); + ensure_equals("location", slurl.getType(), LLSLURL::LOCATION); + ensure_equals("region" , "myregion", slurl.getRegion()); + ensure_equals("grid4", "util.aditi.lindenlab.com", slurl.getGrid()); + + slurl = LLSLURL("https://my.grid.com/app/foo/bar?12345"); + ensure_equals("app", slurl.getType(), LLSLURL::APP); + ensure_equals("appcmd", slurl.getAppCmd(), "foo"); + ensure_equals("apppath", slurl.getAppPath().size(), 1); + ensure_equals("apppath2", slurl.getAppPath()[0].asString(), "bar"); + ensure_equals("appquery", slurl.getAppQuery(), "12345"); + + } + + // construction from grid/region/vector combos + template<> template<> + void slurlTestObject::test<2>() + { + LLSLURL slurl = LLSLURL("mygrid.com", "my region"); + ensure_equals("grid/region - type", slurl.getType(), LLSLURL::LOCATION); + ensure_equals("grid/region", slurl.getSLURLString(), + "https://mygrid.com/region/my%20region/128/128/0"); + + slurl = LLSLURL("mygrid.com", "my region", LLVector3(1,2,3)); + ensure_equals("grid/region/vector - type", slurl.getType(), LLSLURL::LOCATION); + ensure_equals(" grid/region/vector", slurl.getSLURLString(), + "https://mygrid.com/region/my%20region/1/2/3"); + + LLGridManager::getInstance()->setGridChoice("foo.bar.com.bar"); + slurl = LLSLURL("my region", LLVector3(1,2,3)); + ensure_equals("grid/region/vector - type", slurl.getType(), LLSLURL::LOCATION); + ensure_equals(" grid/region/vector", slurl.getSLURLString(), + "https://foo.bar.com.bar/region/my%20region/1/2/3"); + + LLGridManager::getInstance()->setGridChoice("util.agni.lindenlab.com"); + slurl = LLSLURL("my region", LLVector3(1,2,3)); + ensure_equals("default grid/region/vector - type", slurl.getType(), LLSLURL::LOCATION); + ensure_equals(" default grid/region/vector", slurl.getSLURLString(), + "http://maps.secondlife.com/secondlife/my%20region/1/2/3"); + + } + // Accessors + template<> template<> + void slurlTestObject::test<3>() + { + LLSLURL slurl = LLSLURL("https://my.grid.com/region/my%20region/1/2/3"); + ensure_equals("login string", slurl.getLoginString(), "uri:my region&1&2&3"); + ensure_equals("location string", slurl.getLocationString(), "my region/1/2/3"); + ensure_equals("grid", slurl.getGrid(), "my.grid.com"); + ensure_equals("region", slurl.getRegion(), "my region"); + ensure_equals("position", slurl.getPosition(), LLVector3(1, 2, 3)); + + } +} diff --git a/indra/newview/tests/llviewerhelputil_test.cpp b/indra/newview/tests/llviewerhelputil_test.cpp index dd61ac6ae5..eecc79d36c 100644 --- a/indra/newview/tests/llviewerhelputil_test.cpp +++ b/indra/newview/tests/llviewerhelputil_test.cpp @@ -86,7 +86,7 @@ public: #ifdef __GNUC__ __attribute__ ((noinline)) #endif - BOOL isGodlike() const { return FALSE; } + bool isGodlike() const { return FALSE; } }; LLAgent gAgent; diff --git a/indra/newview/tests/llviewernetwork_test.cpp b/indra/newview/tests/llviewernetwork_test.cpp new file mode 100644 index 0000000000..5fba5eb69c --- /dev/null +++ b/indra/newview/tests/llviewernetwork_test.cpp @@ -0,0 +1,582 @@ +/** + * @file llviewernetwork_test.cpp + * @author Roxie + * @date 2009-03-9 + * @brief Test the viewernetwork functionality + * + * $LicenseInfo:firstyear=2009&license=viewergpl$ + * + * Copyright (c) 2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden LregisterSecAPIab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ +#include "../llviewerprecompiledheaders.h" +#include "../llviewernetwork.h" +#include "../test/lltut.h" +#include "../../llxml/llcontrol.h" +#include "llfile.h" + +//---------------------------------------------------------------------------- +// Mock objects for the dependencies of the code we're testing + +LLControlGroup::LLControlGroup(const std::string& name) +: LLInstanceTracker<LLControlGroup, std::string>(name) {} +LLControlGroup::~LLControlGroup() {} +BOOL LLControlGroup::declareString(const std::string& name, + const std::string& initial_val, + const std::string& comment, + BOOL persist) {return TRUE;} +void LLControlGroup::setString(const std::string& name, const std::string& val){} + +std::string gCmdLineLoginURI; +std::string gCmdLineGridChoice; +std::string gCmdLineHelperURI; +std::string gLoginPage; +std::string gCurrentGrid; +std::string LLControlGroup::getString(const std::string& name) +{ + if (name == "CmdLineGridChoice") + return gCmdLineGridChoice; + else if (name == "CmdLineHelperURI") + return gCmdLineHelperURI; + else if (name == "LoginPage") + return gLoginPage; + else if (name == "CurrentGrid") + return gCurrentGrid; + return ""; +} + +LLSD LLControlGroup::getLLSD(const std::string& name) +{ + if (name == "CmdLineLoginURI") + { + if(!gCmdLineLoginURI.empty()) + { + return LLSD(gCmdLineLoginURI); + } + } + return LLSD(); +} + + +LLControlGroup gSavedSettings("test"); + +const char *gSampleGridFile = "<llsd><map>" +"<key>grid1</key><map>" +" <key>favorite</key><integer>1</integer>" +" <key>helper_uri</key><string>https://helper1/helpers/</string>" +" <key>label</key><string>mylabel</string>" +" <key>login_page</key><string>loginpage</string>" +" <key>login_uri</key><array><string>myloginuri</string></array>" +" <key>name</key><string>grid1</string>" +" <key>visible</key><integer>1</integer>" +" <key>credential_type</key><string>agent</string>" +" <key>grid_login_id</key><string>MyGrid</string>" +"</map>" +"<key>util.agni.lindenlab.com</key><map>" +" <key>favorite</key><integer>1</integer>" +" <key>helper_uri</key><string>https://helper1/helpers/</string>" +" <key>label</key><string>mylabel</string>" +" <key>login_page</key><string>loginpage</string>" +" <key>login_uri</key><array><string>myloginuri</string></array>" +" <key>name</key><string>util.agni.lindenlab.com</string>" +"</map></map></llsd>"; +// ------------------------------------------------------------------------------------------- +// TUT +// ------------------------------------------------------------------------------------------- +namespace tut +{ + // Test wrapper declaration : wrapping nothing for the moment + struct viewerNetworkTest + { + viewerNetworkTest() + { + LLFile::remove("grid_test.xml"); + gCmdLineLoginURI.clear(); + gCmdLineGridChoice.clear(); + gCmdLineHelperURI.clear(); + gLoginPage.clear(); + gCurrentGrid.clear(); + } + ~viewerNetworkTest() + { + LLFile::remove("grid_test.xml"); + } + }; + + // Tut templating thingamagic: test group, object and test instance + typedef test_group<viewerNetworkTest> viewerNetworkTestFactory; + typedef viewerNetworkTestFactory::object viewerNetworkTestObject; + tut::viewerNetworkTestFactory tut_test("llviewernetwork"); + + // --------------------------------------------------------------------------------------- + // Test functions + // --------------------------------------------------------------------------------------- + // initialization without a grid file + template<> template<> + void viewerNetworkTestObject::test<1>() + { + + LLGridManager *manager = LLGridManager::getInstance(); + // grid file doesn't exist + manager->initialize("grid_test.xml"); + // validate that some of the defaults are available. + std::map<std::string, std::string> known_grids = manager->getKnownGrids(); + ensure_equals("Known grids is a string-string map of size 23", known_grids.size(), 23); + ensure_equals("Agni has the right name and label", + known_grids[std::string("util.agni.lindenlab.com")], std::string("Agni")); + ensure_equals("None exists", known_grids[""], "None"); + + LLSD grid; + LLGridManager::getInstance()->getGridInfo("util.agni.lindenlab.com", grid); + ensure("Grid info for agni is a map", grid.isMap()); + ensure_equals("name is correct for agni", + grid[GRID_VALUE].asString(), std::string("util.agni.lindenlab.com")); + ensure_equals("label is correct for agni", + grid[GRID_LABEL_VALUE].asString(), std::string("Agni")); + ensure("Login URI is an array", + grid[GRID_LOGIN_URI_VALUE].isArray()); + ensure_equals("Agni login uri is correct", + grid[GRID_LOGIN_URI_VALUE][0].asString(), + std::string("https://login.agni.lindenlab.com/cgi-bin/login.cgi")); + ensure_equals("Agni helper uri is correct", + grid[GRID_HELPER_URI_VALUE].asString(), + std::string("https://secondlife.com/helpers/")); + ensure_equals("Agni login page is correct", + grid[GRID_LOGIN_PAGE_VALUE].asString(), + std::string("http://secondlife.com/app/login/")); + ensure("Agni is a favorite", + grid.has(GRID_IS_FAVORITE_VALUE)); + ensure("Agni is a system grid", + grid.has(GRID_IS_SYSTEM_GRID_VALUE)); + ensure("Grid file wasn't greated as it wasn't saved", + !LLFile::isfile("grid_test.xml")); + } + + // initialization with a grid file + template<> template<> + void viewerNetworkTestObject::test<2>() + { + llofstream gridfile("grid_test.xml"); + gridfile << gSampleGridFile; + gridfile.close(); + + LLGridManager::getInstance()->initialize("grid_test.xml"); + std::map<std::string, std::string> known_grids = LLGridManager::getInstance()->getKnownGrids(); + ensure_equals("adding a grid via a grid file increases known grid size", + known_grids.size(), 24); + ensure_equals("Agni is still there after we've added a grid via a grid file", + known_grids["util.agni.lindenlab.com"], std::string("Agni")); + + + // assure Agni doesn't get overwritten + LLSD grid; + LLGridManager::getInstance()->getGridInfo("util.agni.lindenlab.com", grid); + + ensure_equals("Agni grid label was not modified by grid file", + grid[GRID_LABEL_VALUE].asString(), std::string("Agni")); + + ensure_equals("Agni name wasn't modified by grid file", + grid[GRID_VALUE].asString(), std::string("util.agni.lindenlab.com")); + ensure("Agni grid URI is still an array after grid file", + grid[GRID_LOGIN_URI_VALUE].isArray()); + ensure_equals("Agni login uri still the same after grid file", + grid[GRID_LOGIN_URI_VALUE][0].asString(), + std::string("https://login.agni.lindenlab.com/cgi-bin/login.cgi")); + ensure_equals("Agni helper uri still the same after grid file", + grid[GRID_HELPER_URI_VALUE].asString(), + std::string("https://secondlife.com/helpers/")); + ensure_equals("Agni login page the same after grid file", + grid[GRID_LOGIN_PAGE_VALUE].asString(), + std::string("http://secondlife.com/app/login/")); + ensure("Agni still a favorite after grid file", + grid.has(GRID_IS_FAVORITE_VALUE)); + ensure("Agni system grid still set after grid file", + grid.has(GRID_IS_SYSTEM_GRID_VALUE)); + + ensure_equals("Grid file adds to name<->label map", + known_grids["grid1"], std::string("mylabel")); + LLGridManager::getInstance()->getGridInfo("grid1", grid); + ensure_equals("grid file grid name is set", + grid[GRID_VALUE].asString(), std::string("grid1")); + ensure_equals("grid file label is set", + grid[GRID_LABEL_VALUE].asString(), std::string("mylabel")); + ensure("grid file login uri is an array", + grid[GRID_LOGIN_URI_VALUE].isArray()); + ensure_equals("grid file login uri is set", + grid[GRID_LOGIN_URI_VALUE][0].asString(), + std::string("myloginuri")); + ensure_equals("grid file helper uri is set", + grid[GRID_HELPER_URI_VALUE].asString(), + std::string("https://helper1/helpers/")); + ensure_equals("grid file login page is set", + grid[GRID_LOGIN_PAGE_VALUE].asString(), + std::string("loginpage")); + ensure("grid file favorite is set", + grid.has(GRID_IS_FAVORITE_VALUE)); + ensure("grid file isn't a system grid", + !grid.has(GRID_IS_SYSTEM_GRID_VALUE)); + ensure("Grid file still exists after loading", + LLFile::isfile("grid_test.xml")); + } + + // Initialize via command line + + template<> template<> + void viewerNetworkTestObject::test<3>() + { + // USE --grid command line + // initialize with a known grid + LLSD grid; + gCmdLineGridChoice = "Aditi"; + LLGridManager::getInstance()->initialize("grid_test.xml"); + // with single login uri specified. + std::map<std::string, std::string> known_grids = LLGridManager::getInstance()->getKnownGrids(); + ensure_equals("Using a known grid via command line doesn't increase number of known grids", + known_grids.size(), 23); + ensure_equals("getGridLabel", LLGridManager::getInstance()->getGridLabel(), std::string("Aditi")); + // initialize with a known grid in lowercase + gCmdLineGridChoice = "agni"; + LLGridManager::getInstance()->initialize("grid_test.xml"); + ensure_equals("getGridLabel", LLGridManager::getInstance()->getGridLabel(), std::string("Agni")); + + // now try a command line with a custom grid identifier + gCmdLineGridChoice = "mycustomgridchoice"; + LLGridManager::getInstance()->initialize("grid_test.xml"); + known_grids = LLGridManager::getInstance()->getKnownGrids(); + ensure_equals("adding a command line grid with custom name increases known grid size", + known_grids.size(), 24); + ensure_equals("Custom Command line grid is added to the list of grids", + known_grids["mycustomgridchoice"], std::string("mycustomgridchoice")); + LLGridManager::getInstance()->getGridInfo("mycustomgridchoice", grid); + ensure_equals("Custom Command line grid name is set", + grid[GRID_VALUE].asString(), std::string("mycustomgridchoice")); + ensure_equals("Custom Command line grid label is set", + grid[GRID_LABEL_VALUE].asString(), std::string("mycustomgridchoice")); + ensure("Custom Command line grid login uri is an array", + grid[GRID_LOGIN_URI_VALUE].isArray()); + ensure_equals("Custom Command line grid login uri is set", + grid[GRID_LOGIN_URI_VALUE][0].asString(), + std::string("https://mycustomgridchoice/cgi-bin/login.cgi")); + ensure_equals("Custom Command line grid helper uri is set", + grid[GRID_HELPER_URI_VALUE].asString(), + std::string("https://mycustomgridchoice/helpers/")); + ensure_equals("Custom Command line grid login page is set", + grid[GRID_LOGIN_PAGE_VALUE].asString(), + std::string("http://mycustomgridchoice/app/login/")); + } + + // validate override of login uri with cmd line + template<> template<> + void viewerNetworkTestObject::test<4>() + { + // Override with loginuri + // override known grid + LLSD grid; + gCmdLineGridChoice = "Aditi"; + gCmdLineLoginURI = "https://my.login.uri/cgi-bin/login.cgi"; + LLGridManager::getInstance()->initialize("grid_test.xml"); + std::map<std::string, std::string> known_grids = LLGridManager::getInstance()->getKnownGrids(); + ensure_equals("Override known grid login uri: No grids are added", + known_grids.size(), 23); + LLGridManager::getInstance()->getGridInfo(grid); + ensure("Override known grid login uri: login uri is an array", + grid[GRID_LOGIN_URI_VALUE].isArray()); + ensure_equals("Override known grid login uri: Command line grid login uri is set", + grid[GRID_LOGIN_URI_VALUE][0].asString(), + std::string("https://my.login.uri/cgi-bin/login.cgi")); + ensure_equals("Override known grid login uri: helper uri is not changed", + grid[GRID_HELPER_URI_VALUE].asString(), + std::string("http://aditi-secondlife.webdev.lindenlab.com/helpers/")); + ensure_equals("Override known grid login uri: login page is not set", + grid[GRID_LOGIN_PAGE_VALUE].asString(), + std::string("http://secondlife.com/app/login/")); + + // Override with loginuri + // override custom grid + gCmdLineGridChoice = "mycustomgridchoice"; + gCmdLineLoginURI = "https://my.login.uri/cgi-bin/login.cgi"; + LLGridManager::getInstance()->initialize("grid_test.xml"); + known_grids = LLGridManager::getInstance()->getKnownGrids(); + LLGridManager::getInstance()->getGridInfo(grid); + ensure_equals("Override custom grid login uri: Grid is added", + known_grids.size(), 24); + ensure("Override custom grid login uri: login uri is an array", + grid[GRID_LOGIN_URI_VALUE].isArray()); + ensure_equals("Override custom grid login uri: login uri is set", + grid[GRID_LOGIN_URI_VALUE][0].asString(), + std::string("https://my.login.uri/cgi-bin/login.cgi")); + ensure_equals("Override custom grid login uri: Helper uri is not set", + grid[GRID_HELPER_URI_VALUE].asString(), + std::string("https://mycustomgridchoice/helpers/")); + ensure_equals("Override custom grid login uri: Login page is not set", + grid[GRID_LOGIN_PAGE_VALUE].asString(), + std::string("http://mycustomgridchoice/app/login/")); + } + + // validate override of helper uri with cmd line + template<> template<> + void viewerNetworkTestObject::test<5>() + { + // Override with helperuri + // override known grid + LLSD grid; + gCmdLineGridChoice = "Aditi"; + gCmdLineLoginURI = ""; + gCmdLineHelperURI = "https://my.helper.uri/mycustomhelpers"; + LLGridManager::getInstance()->initialize("grid_test.xml"); + std::map<std::string, std::string> known_grids = LLGridManager::getInstance()->getKnownGrids(); + ensure_equals("Override known grid helper uri: No grids are added", + known_grids.size(), 23); + LLGridManager::getInstance()->getGridInfo(grid); + ensure("Override known known helper uri: login uri is an array", + grid[GRID_LOGIN_URI_VALUE].isArray()); + ensure_equals("Override known grid helper uri: login uri is not changed", + grid[GRID_LOGIN_URI_VALUE][0].asString(), + std::string("https://login.aditi.lindenlab.com/cgi-bin/login.cgi")); + ensure_equals("Override known grid helper uri: helper uri is changed", + grid[GRID_HELPER_URI_VALUE].asString(), + std::string("https://my.helper.uri/mycustomhelpers")); + ensure_equals("Override known grid helper uri: login page is not changed", + grid[GRID_LOGIN_PAGE_VALUE].asString(), + std::string("http://secondlife.com/app/login/")); + + // Override with helperuri + // override custom grid + gCmdLineGridChoice = "mycustomgridchoice"; + gCmdLineHelperURI = "https://my.helper.uri/mycustomhelpers"; + LLGridManager::getInstance()->initialize("grid_test.xml"); + known_grids = LLGridManager::getInstance()->getKnownGrids(); + ensure_equals("Override custom grid helper uri: grids is added", + known_grids.size(), 24); + LLGridManager::getInstance()->getGridInfo(grid); + ensure("Override custom helper uri: login uri is an array", + grid[GRID_LOGIN_URI_VALUE].isArray()); + ensure_equals("Override custom grid helper uri: login uri is not changed", + grid[GRID_LOGIN_URI_VALUE][0].asString(), + std::string("https://mycustomgridchoice/cgi-bin/login.cgi")); + ensure_equals("Override custom grid helper uri: helper uri is changed", + grid[GRID_HELPER_URI_VALUE].asString(), + std::string("https://my.helper.uri/mycustomhelpers")); + ensure_equals("Override custom grid helper uri: login page is not changed", + grid[GRID_LOGIN_PAGE_VALUE].asString(), + std::string("http://mycustomgridchoice/app/login/")); + } + + // validate overriding of login page via cmd line + template<> template<> + void viewerNetworkTestObject::test<6>() + { + // Override with login page + // override known grid + LLSD grid; + gCmdLineGridChoice = "Aditi"; + gCmdLineHelperURI = ""; + gLoginPage = "myloginpage"; + LLGridManager::getInstance()->initialize("grid_test.xml"); + std::map<std::string, std::string> known_grids = LLGridManager::getInstance()->getKnownGrids(); + ensure_equals("Override known grid login page: No grids are added", + known_grids.size(), 23); + LLGridManager::getInstance()->getGridInfo(grid); + ensure("Override known grid login page: Command line grid login uri is an array", + grid[GRID_LOGIN_URI_VALUE].isArray()); + ensure_equals("Override known grid login page: login uri is not changed", + grid[GRID_LOGIN_URI_VALUE][0].asString(), + std::string("https://login.aditi.lindenlab.com/cgi-bin/login.cgi")); + ensure_equals("Override known grid login page: helper uri is not changed", + grid[GRID_HELPER_URI_VALUE].asString(), + std::string("http://aditi-secondlife.webdev.lindenlab.com/helpers/")); + ensure_equals("Override known grid login page: login page is changed", + grid[GRID_LOGIN_PAGE_VALUE].asString(), + std::string("myloginpage")); + + // Override with login page + // override custom grid + gCmdLineGridChoice = "mycustomgridchoice"; + gLoginPage = "myloginpage"; + LLGridManager::getInstance()->initialize("grid_test.xml"); + known_grids = LLGridManager::getInstance()->getKnownGrids(); + ensure_equals("Override custom grid login page: grids are added", + known_grids.size(), 24); + LLGridManager::getInstance()->getGridInfo(grid); + ensure("Override custom grid login page: Command line grid login uri is an array", + grid[GRID_LOGIN_URI_VALUE].isArray()); + ensure_equals("Override custom grid login page: login uri is not changed", + grid[GRID_LOGIN_URI_VALUE][0].asString(), + std::string("https://mycustomgridchoice/cgi-bin/login.cgi")); + ensure_equals("Override custom grid login page: helper uri is not changed", + grid[GRID_HELPER_URI_VALUE].asString(), + std::string("https://mycustomgridchoice/helpers/")); + ensure_equals("Override custom grid login page: login page is changed", + grid[GRID_LOGIN_PAGE_VALUE].asString(), + std::string("myloginpage")); + + } + + // validate grid selection + template<> template<> + void viewerNetworkTestObject::test<7>() + { + LLSD loginURI = LLSD::emptyArray(); + LLSD grid = LLSD::emptyMap(); + // adding a grid with simply a name will populate the values. + grid[GRID_VALUE] = "myaddedgrid"; + + LLGridManager::getInstance()->initialize("grid_test.xml"); + LLGridManager::getInstance()->addGrid(grid); + LLGridManager::getInstance()->setGridChoice("util.agni.lindenlab.com"); + ensure_equals("getGridLabel", LLGridManager::getInstance()->getGridLabel(), std::string("Agni")); + ensure_equals("getGrid", LLGridManager::getInstance()->getGrid(), + std::string("util.agni.lindenlab.com")); + ensure_equals("getHelperURI", LLGridManager::getInstance()->getHelperURI(), + std::string("https://secondlife.com/helpers/")); + ensure_equals("getLoginPage", LLGridManager::getInstance()->getLoginPage(), + std::string("http://secondlife.com/app/login/")); + ensure_equals("getLoginPage2", LLGridManager::getInstance()->getLoginPage("util.agni.lindenlab.com"), + std::string("http://secondlife.com/app/login/")); + ensure("Is Agni a production grid", LLGridManager::getInstance()->isInProductionGrid()); + std::vector<std::string> uris; + LLGridManager::getInstance()->getLoginURIs(uris); + ensure_equals("getLoginURIs size", uris.size(), 1); + ensure_equals("getLoginURIs", uris[0], + std::string("https://login.agni.lindenlab.com/cgi-bin/login.cgi")); + LLGridManager::getInstance()->setGridChoice("myaddedgrid"); + ensure_equals("getGridLabel", LLGridManager::getInstance()->getGridLabel(), std::string("myaddedgrid")); + ensure("Is myaddedgrid a production grid", !LLGridManager::getInstance()->isInProductionGrid()); + + LLGridManager::getInstance()->setFavorite(); + LLGridManager::getInstance()->getGridInfo("myaddedgrid", grid); + ensure("setting favorite", grid.has(GRID_IS_FAVORITE_VALUE)); + } + + // name based grid population + template<> template<> + void viewerNetworkTestObject::test<8>() + { + LLGridManager::getInstance()->initialize("grid_test.xml"); + LLSD grid = LLSD::emptyMap(); + // adding a grid with simply a name will populate the values. + grid[GRID_VALUE] = "myaddedgrid"; + LLGridManager::getInstance()->addGrid(grid); + LLGridManager::getInstance()->getGridInfo("myaddedgrid", grid); + + ensure_equals("name based grid has name value", + grid[GRID_VALUE].asString(), + std::string("myaddedgrid")); + ensure_equals("name based grid has label value", + grid[GRID_LABEL_VALUE].asString(), + std::string("myaddedgrid")); + ensure_equals("name based grid has name value", + grid[GRID_HELPER_URI_VALUE].asString(), + std::string("https://myaddedgrid/helpers/")); + ensure_equals("name based grid has name value", + grid[GRID_LOGIN_PAGE_VALUE].asString(), + std::string("http://myaddedgrid/app/login/")); + ensure("name based grid has array loginuri", + grid[GRID_LOGIN_URI_VALUE].isArray()); + ensure_equals("name based grid has single login uri value", + grid[GRID_LOGIN_URI_VALUE].size(), 1); + ensure_equals("Name based grid login uri is correct", + grid[GRID_LOGIN_URI_VALUE][0].asString(), + std::string("https://myaddedgrid/cgi-bin/login.cgi")); + ensure("name based grid is not a favorite yet", + !grid.has(GRID_IS_FAVORITE_VALUE)); + ensure("name based grid does not have system setting", + !grid.has(GRID_IS_SYSTEM_GRID_VALUE)); + + llofstream gridfile("grid_test.xml"); + gridfile << gSampleGridFile; + gridfile.close(); + } + + // persistence of the grid list with an empty gridfile. + template<> template<> + void viewerNetworkTestObject::test<9>() + { + // try with initial grid list without a grid file, + // without setting the grid to a saveable favorite. + LLGridManager::getInstance()->initialize("grid_test.xml"); + LLSD grid = LLSD::emptyMap(); + grid[GRID_VALUE] = std::string("mynewgridname"); + LLGridManager::getInstance()->addGrid(grid); + LLGridManager::getInstance()->saveFavorites(); + ensure("Grid file exists after saving", + LLFile::isfile("grid_test.xml")); + LLGridManager::getInstance()->initialize("grid_test.xml"); + // should not be there + std::map<std::string, std::string> known_grids = LLGridManager::getInstance()->getKnownGrids(); + ensure("New grid wasn't added to persisted list without being marked a favorite", + known_grids.find(std::string("mynewgridname")) == known_grids.end()); + + // mark a grid a favorite to make sure it's persisted + LLGridManager::getInstance()->addGrid(grid); + LLGridManager::getInstance()->setGridChoice("mynewgridname"); + LLGridManager::getInstance()->setFavorite(); + LLGridManager::getInstance()->saveFavorites(); + ensure("Grid file exists after saving", + LLFile::isfile("grid_test.xml")); + LLGridManager::getInstance()->initialize("grid_test.xml"); + // should not be there + known_grids = LLGridManager::getInstance()->getKnownGrids(); + ensure("New grid wasn't added to persisted list after being marked a favorite", + known_grids.find(std::string("mynewgridname")) != + known_grids.end()); + } + + // persistence of the grid file with existing gridfile + template<> template<> + void viewerNetworkTestObject::test<10>() + { + + llofstream gridfile("grid_test.xml"); + gridfile << gSampleGridFile; + gridfile.close(); + + LLGridManager::getInstance()->initialize("grid_test.xml"); + LLSD grid = LLSD::emptyMap(); + grid[GRID_VALUE] = std::string("mynewgridname"); + LLGridManager::getInstance()->addGrid(grid); + LLGridManager::getInstance()->saveFavorites(); + // validate we didn't lose existing favorites + LLGridManager::getInstance()->initialize("grid_test.xml"); + std::map<std::string, std::string> known_grids = LLGridManager::getInstance()->getKnownGrids(); + ensure("New grid wasn't added to persisted list after being marked a favorite", + known_grids.find(std::string("grid1")) != + known_grids.end()); + + // add a grid + LLGridManager::getInstance()->addGrid(grid); + LLGridManager::getInstance()->setGridChoice("mynewgridname"); + LLGridManager::getInstance()->setFavorite(); + LLGridManager::getInstance()->saveFavorites(); + known_grids = LLGridManager::getInstance()->getKnownGrids(); + ensure("New grid wasn't added to persisted list after being marked a favorite", + known_grids.find(std::string("grid1")) != + known_grids.end()); + known_grids = LLGridManager::getInstance()->getKnownGrids(); + ensure("New grid wasn't added to persisted list after being marked a favorite", + known_grids.find(std::string("mynewgridname")) != + known_grids.end()); + } +} diff --git a/indra/newview/tests/llxmlrpclistener_test.cpp b/indra/newview/tests/llxmlrpclistener_test.cpp index c94ba0a3e8..c2c7e963b9 100644 --- a/indra/newview/tests/llxmlrpclistener_test.cpp +++ b/indra/newview/tests/llxmlrpclistener_test.cpp @@ -4,7 +4,7 @@ * @date 2009-03-20 * @brief Test for llxmlrpclistener. * - * $LicenseInfo:firstyear=2009&license=internal$ + * $LicenseInfo:firstyear=2009&license=viewergpl$ * Copyright (c) 2009, Linden Research, Inc. * $/LicenseInfo$ */ diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 15a51bbe14..0b30128ff3 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -34,6 +34,7 @@ import sys import os.path import re import tarfile +import time viewer_dir = os.path.dirname(__file__) # add llmanifest library to our path so we don't have to muck with PYTHONPATH sys.path.append(os.path.join(viewer_dir, '../lib/python/indra/util')) @@ -41,9 +42,12 @@ from llmanifest import LLManifest, main, proper_windows_path, path_ancestors class ViewerManifest(LLManifest): def is_packaging_viewer(self): - # This is overridden by the WindowsManifest sub-class, - # which has different behavior if it is not packaging the viewer. - return True + # Some commands, files will only be included + # if we are packaging the viewer on windows. + # This manifest is also used to copy + # files during the build (see copy_w_viewer_manifest + # and copy_l_viewer_manifest targets) + return 'package' in self.args['actions'] def construct(self): super(ViewerManifest, self).construct() @@ -105,6 +109,12 @@ class ViewerManifest(LLManifest): self.end_prefix("*/html") self.end_prefix("skins") + # local_assets dir (for pre-cached textures) + if self.prefix(src="local_assets"): + self.path("*.j2c") + self.path("*.tga") + self.end_prefix("local_assets") + # Files in the newview/ directory self.path("gpu_table.txt") @@ -169,13 +179,6 @@ class WindowsManifest(ViewerManifest): else: return ''.join(self.channel().split()) + '.exe' - def is_packaging_viewer(self): - # Some commands, files will only be included - # if we are packaging the viewer on windows. - # This manifest is also used to copy - # files during the build. - return 'package' in self.args['actions'] - def test_msvcrt_and_copy_action(self, src, dst): # This is used to test a dll manifest. # It is used as a temporary override during the construct method @@ -332,6 +335,12 @@ class WindowsManifest(ViewerManifest): self.path("media_plugin_webkit.dll") self.end_prefix() + # winmm.dll shim + if self.prefix(src='../media_plugins/winmmshim/%s' % self.args['configuration'], dst="llplugin"): + self.path("winmm.dll") + self.end_prefix() + + if self.args['configuration'].lower() == 'debug': if self.prefix(src=os.path.join(os.pardir, os.pardir, 'libraries', 'i686-win32', 'lib', 'debug'), dst="llplugin"): @@ -479,8 +488,8 @@ class WindowsManifest(ViewerManifest): grid_vars_template = """ OutFile "%(installer_file)s" !define INSTFLAGS "%(flags)s" - !define INSTNAME "SecondLife" - !define SHORTCUT "Second Life" + !define INSTNAME "SecondLifeViewer2" + !define SHORTCUT "Second Life Viewer 2" !define URLNAME "secondlife" Caption "Second Life ${VERSION}" """ @@ -551,6 +560,10 @@ class WindowsManifest(ViewerManifest): class DarwinManifest(ViewerManifest): + def is_packaging_viewer(self): + # darwin requires full app bundle packaging even for debugging. + return True + def construct(self): # copy over the build result (this is a no-op if run within the xcode script) self.path(self.args['configuration'] + "/Second Life.app", dst="") @@ -629,7 +642,9 @@ class DarwinManifest(ViewerManifest): if dylibs["llcommon"]: for libfile in ("libapr-1.0.3.7.dylib", "libaprutil-1.0.3.8.dylib", - "libexpat.0.5.0.dylib"): + "libexpat.0.5.0.dylib", + "libexception_handler.dylib", + ): self.path(os.path.join(libdir, libfile), libfile) #libfmodwrapper.dylib @@ -639,14 +654,20 @@ class DarwinManifest(ViewerManifest): self.path("../mac_crash_logger/" + self.args['configuration'] + "/mac-crash-logger.app", "mac-crash-logger.app") self.path("../mac_updater/" + self.args['configuration'] + "/mac-updater.app", "mac-updater.app") + # plugin launcher + self.path("../llplugin/slplugin/" + self.args['configuration'] + "/SLPlugin.app", "SLPlugin.app") + # our apps dependencies on shared libs if dylibs["llcommon"]: mac_crash_logger_res_path = self.dst_path_of("mac-crash-logger.app/Contents/Resources") mac_updater_res_path = self.dst_path_of("mac-updater.app/Contents/Resources") + slplugin_res_path = self.dst_path_of("SLPlugin.app/Contents/Resources") for libfile in ("libllcommon.dylib", "libapr-1.0.3.7.dylib", "libaprutil-1.0.3.8.dylib", - "libexpat.0.5.0.dylib"): + "libexpat.0.5.0.dylib", + "libexception_handler.dylib", + ): target_lib = os.path.join('../../..', libfile) self.run_command("ln -sf %(target)r %(link)r" % {'target': target_lib, @@ -656,9 +677,10 @@ class DarwinManifest(ViewerManifest): {'target': target_lib, 'link' : os.path.join(mac_updater_res_path, libfile)} ) - - # plugin launcher - self.path("../llplugin/slplugin/" + self.args['configuration'] + "/SLPlugin", "SLPlugin") + self.run_command("ln -sf %(target)r %(link)r" % + {'target': target_lib, + 'link' : os.path.join(slplugin_res_path, libfile)} + ) # plugins if self.prefix(src="", dst="llplugin"): @@ -686,7 +708,7 @@ class DarwinManifest(ViewerManifest): def package_finish(self): - channel_standin = 'Second Life' # hah, our default channel is not usable on its own + channel_standin = 'Second Life Viewer 2' # hah, our default channel is not usable on its own if not self.default_channel(): channel_standin = self.channel() @@ -716,55 +738,72 @@ class DarwinManifest(ViewerManifest): # mount the image and get the name of the mount point and device node hdi_output = self.run_command('hdiutil attach -private %r' % sparsename) - devfile = re.search("/dev/disk([0-9]+)[^s]", hdi_output).group(0).strip() - volpath = re.search('HFS\s+(.+)', hdi_output).group(1).strip() + try: + devfile = re.search("/dev/disk([0-9]+)[^s]", hdi_output).group(0).strip() + volpath = re.search('HFS\s+(.+)', hdi_output).group(1).strip() - # Copy everything in to the mounted .dmg + # Copy everything in to the mounted .dmg - if self.default_channel() and not self.default_grid(): - app_name = "Second Life " + self.args['grid'] - else: - app_name = channel_standin.strip() - - # Hack: - # Because there is no easy way to coerce the Finder into positioning - # the app bundle in the same place with different app names, we are - # adding multiple .DS_Store files to svn. There is one for release, - # one for release candidate and one for first look. Any other channels - # will use the release .DS_Store, and will look broken. - # - Ambroff 2008-08-20 - dmg_template = os.path.join( - 'installers', - 'darwin', - '%s-dmg' % "".join(self.channel_unique().split()).lower()) - - if not os.path.exists (self.src_path_of(dmg_template)): - dmg_template = os.path.join ('installers', 'darwin', 'release-dmg') - - for s,d in {self.get_dst_prefix():app_name + ".app", - os.path.join(dmg_template, "_VolumeIcon.icns"): ".VolumeIcon.icns", - os.path.join(dmg_template, "background.jpg"): "background.jpg", - os.path.join(dmg_template, "_DS_Store"): ".DS_Store"}.items(): - print "Copying to dmg", s, d - self.copy_action(self.src_path_of(s), os.path.join(volpath, d)) - - # Hide the background image, DS_Store file, and volume icon file (set their "visible" bit) - for f in ".VolumeIcon.icns", "background.jpg", ".DS_Store": - self.run_command('SetFile -a V %r' % os.path.join(volpath, f)) - - # Create the alias file (which is a resource file) from the .r - self.run_command('rez %r -o %r' % - (self.src_path_of("installers/darwin/release-dmg/Applications-alias.r"), - os.path.join(volpath, "Applications"))) - - # Set the alias file's alias and custom icon bits - self.run_command('SetFile -a AC %r' % os.path.join(volpath, "Applications")) - - # Set the disk image root's custom icon bit - self.run_command('SetFile -a C %r' % volpath) - - # Unmount the image - self.run_command('hdiutil detach -force %r' % devfile) + if self.default_channel() and not self.default_grid(): + app_name = "Second Life " + self.args['grid'] + else: + app_name = channel_standin.strip() + + # Hack: + # Because there is no easy way to coerce the Finder into positioning + # the app bundle in the same place with different app names, we are + # adding multiple .DS_Store files to svn. There is one for release, + # one for release candidate and one for first look. Any other channels + # will use the release .DS_Store, and will look broken. + # - Ambroff 2008-08-20 + dmg_template = os.path.join( + 'installers', + 'darwin', + '%s-dmg' % "".join(self.channel_unique().split()).lower()) + + if not os.path.exists (self.src_path_of(dmg_template)): + dmg_template = os.path.join ('installers', 'darwin', 'release-dmg') + + for s,d in {self.get_dst_prefix():app_name + ".app", + os.path.join(dmg_template, "_VolumeIcon.icns"): ".VolumeIcon.icns", + os.path.join(dmg_template, "background.jpg"): "background.jpg", + os.path.join(dmg_template, "_DS_Store"): ".DS_Store"}.items(): + print "Copying to dmg", s, d + self.copy_action(self.src_path_of(s), os.path.join(volpath, d)) + + # Hide the background image, DS_Store file, and volume icon file (set their "visible" bit) + for f in ".VolumeIcon.icns", "background.jpg", ".DS_Store": + pathname = os.path.join(volpath, f) + # We've observed mysterious "no such file" failures of the SetFile + # command, especially on the first file listed above -- yet + # subsequent inspection of the target directory confirms it's + # there. Timing problem with copy command? Try to handle. + for x in xrange(3): + if os.path.exists(pathname): + print "Confirmed existence: %r" % pathname + break + print "Waiting for %s copy command to complete (%s)..." % (f, x+1) + sys.stdout.flush() + time.sleep(1) + # If we fall out of the loop above without a successful break, oh + # well, possibly we've mistaken the nature of the problem. In any + # case, don't hang up the whole build looping indefinitely, let + # the original problem manifest by executing the desired command. + self.run_command('SetFile -a V %r' % pathname) + + # Create the alias file (which is a resource file) from the .r + self.run_command('rez %r -o %r' % + (self.src_path_of("installers/darwin/release-dmg/Applications-alias.r"), + os.path.join(volpath, "Applications"))) + + # Set the alias file's alias and custom icon bits + self.run_command('SetFile -a AC %r' % os.path.join(volpath, "Applications")) + + # Set the disk image root's custom icon bit + self.run_command('SetFile -a C %r' % volpath) + finally: + # Unmount the image even if exceptions from any of the above + self.run_command('hdiutil detach -force %r' % devfile) print "Converting temp disk image to final disk image" self.run_command('hdiutil convert %(sparse)r -format UDZO -imagekey zlib-level=9 -o %(final)r' % {'sparse':sparsename, 'final':finalname}) @@ -854,16 +893,10 @@ class Linux_i686Manifest(LinuxManifest): print "Skipping %s - not found" % libfile pass - - if(self.args['buildtype'].lower() == 'release'): - print "* packaging stripped viewer binary." - self.path("secondlife-stripped","bin/do-not-directly-run-secondlife-bin") - else: - print "* packaging un-stripped viewer binary." - self.path("secondlife-bin","bin/do-not-directly-run-secondlife-bin") + self.path("secondlife-bin","bin/do-not-directly-run-secondlife-bin") - self.path("../linux_crash_logger/linux-crash-logger-stripped","bin/linux-crash-logger.bin") - self.path("../linux_updater/linux-updater-stripped", "bin/linux-updater.bin") + self.path("../linux_crash_logger/linux-crash-logger","bin/linux-crash-logger.bin") + self.path("../linux_updater/linux-updater", "bin/linux-updater.bin") self.path("../llplugin/slplugin/SLPlugin", "bin/SLPlugin") if self.prefix("res-sdl"): self.path("*") @@ -882,6 +915,7 @@ class Linux_i686Manifest(LinuxManifest): if self.prefix("../../libraries/i686-linux/lib_release_client", dst="lib"): self.path("libapr-1.so.0") self.path("libaprutil-1.so.0") + self.path("libbreakpad_client.so.0.0.0", "libbreakpad_client.so.0") self.path("libdb-4.2.so") self.path("libcrypto.so.0.9.7") self.path("libexpat.so.1") @@ -914,23 +948,16 @@ class Linux_i686Manifest(LinuxManifest): if self.prefix(src="vivox-runtime/i686-linux", dst="lib"): self.path("libortp.so") self.path("libsndfile.so.1") - #self.path("libvivoxoal.so.1") # no - we'll re-use the viewer's own OAL lib + #self.path("libvivoxoal.so.1") # no - we'll re-use the viewer's own OpenAL lib self.path("libvivoxsdk.so") self.path("libvivoxplatform.so") self.end_prefix("lib") -class Linux_x86_64Manifest(LinuxManifest): - def construct(self): - super(Linux_x86_64Manifest, self).construct() - self.path("secondlife-stripped","bin/do-not-directly-run-secondlife-bin") - self.path("../linux_crash_logger/linux-crash-logger-stripped","linux-crash-logger.bin") - if self.prefix("res-sdl"): - self.path("*") - # recurse - self.end_prefix("res-sdl") + if self.args['buildtype'].lower() == 'release' and self.is_packaging_viewer(): + print "* Going strip-crazy on the packaged binaries, since this is a RELEASE build" + self.run_command("find %(d)r/bin %(d)r/lib -type f | xargs --no-run-if-empty strip -S" % {'d': self.get_dst_prefix()} ) # makes some small assumptions about our packaged dir structure - self.path("featuretable_linux.txt") - self.path("secondlife-i686.supp") +################################################################ if __name__ == "__main__": main() diff --git a/indra/test/CMakeLists.txt b/indra/test/CMakeLists.txt index c1360987a5..66c78a86c4 100644 --- a/indra/test/CMakeLists.txt +++ b/indra/test/CMakeLists.txt @@ -13,6 +13,7 @@ include(LLXML) include(LScript) include(Linking) include(Tut) +include(LLAddBuildTest) include(GoogleMock) @@ -30,7 +31,7 @@ include_directories( set(test_SOURCE_FILES io.cpp -# llapp_tut.cpp # Temporarily removed until thread issues can be solved +# llapp_tut.cpp # Temporarily removed until thread issues can be solved llblowfish_tut.cpp llbuffer_tut.cpp lldoubledispatch_tut.cpp @@ -117,19 +118,12 @@ endif (WINDOWS) get_target_property(TEST_EXE test LOCATION) -IF(WINDOWS) - set(LD_LIBRARY_PATH ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}) -ELSEIF(DARWIN) - set(LD_LIBRARY_PATH ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/Resources:/usr/lib) -ELSE(WINDOWS) - set(LD_LIBRARY_PATH ${SHARED_LIB_STAGING_DIR}:/usr/lib) -ENDIF(WINDOWS) - -LL_TEST_COMMAND("${LD_LIBRARY_PATH}" +SET_TEST_PATH(LD_LIBRARY_PATH) +LL_TEST_COMMAND(command "${LD_LIBRARY_PATH}" "${TEST_EXE}" "--output=${CMAKE_CURRENT_BINARY_DIR}/cpp_test_results.txt" "--touch=${CMAKE_CURRENT_BINARY_DIR}/cpp_tests_ok.txt") ADD_CUSTOM_COMMAND( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/cpp_tests_ok.txt - COMMAND ${LL_TEST_COMMAND_value} + COMMAND ${command} DEPENDS test WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} COMMENT "C++ unit tests" diff --git a/indra/test/llpermissions_tut.cpp b/indra/test/llpermissions_tut.cpp index 4eadc64b5a..d5795ef4a0 100644 --- a/indra/test/llpermissions_tut.cpp +++ b/indra/test/llpermissions_tut.cpp @@ -61,7 +61,7 @@ namespace tut uuid2 == LLUUID::null && uuid3 == LLUUID::null)); ensure("LLPermission Get Functions failed", (permissions.getMaskBase() == PERM_ALL && permissions.getMaskOwner() == PERM_ALL && permissions.getMaskGroup() == PERM_ALL && permissions.getMaskEveryone() == PERM_ALL && permissions.getMaskNextOwner() == PERM_ALL)); - ensure("Ownership functions failed", (permissions.isGroupOwned() == FALSE && permissions.isOwned() == FALSE)); + ensure("Ownership functions failed", ((! permissions.isGroupOwned()) && (! permissions.isOwned()))); } template<> template<> @@ -204,7 +204,7 @@ namespace tut LLPermissions perm1; LLUUID uuid; BOOL is_group_owned = FALSE; - ensure("1:getOwnership:failed ", (FALSE == perm1.getOwnership(uuid,is_group_owned))); + ensure("1:getOwnership:failed ", ! perm1.getOwnership(uuid,is_group_owned)); LLPermissions perm; LLUUID creator("abf0d56b-82e5-47a2-a8ad-74741bb2c29e"); @@ -213,11 +213,11 @@ namespace tut LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8"); perm.init(creator,owner,lastOwner,group); perm.getOwnership(uuid,is_group_owned); - ensure("2:getOwnership:failed ", ((uuid == owner) && (FALSE == is_group_owned))); + ensure("2:getOwnership:failed ", ((uuid == owner) && (! is_group_owned))); perm.init(creator,LLUUID::null,lastOwner,group); perm.getOwnership(uuid,is_group_owned); - ensure("3:getOwnership:failed ", ((uuid == group) && (TRUE == is_group_owned))); + ensure("3:getOwnership:failed ", ((uuid == group) && is_group_owned)); } template<> template<> @@ -240,17 +240,17 @@ namespace tut LLUUID agent("abf0d56b-82e5-47a2-a8ad-74741bb2c29e"); LLUUID owner("68edcf47-ccd7-45b8-9f90-1649d7f12806"); LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8"); - bool is_atomic = TRUE; - ensure("setOwnerAndGroup():failed ", (TRUE == perm.setOwnerAndGroup(agent,owner,group,is_atomic))); + bool is_atomic = true; + ensure("setOwnerAndGroup():failed ", perm.setOwnerAndGroup(agent,owner,group,is_atomic)); LLUUID owner2("68edcf47-ccd7-45b8-9f90-1649d7f12807"); LLUUID group2("9c8eca51-53d5-42a7-bb58-cef070395db9"); // cant change - agent need to be current owner - ensure("setOwnerAndGroup():failed ", (FALSE == perm.setOwnerAndGroup(agent,owner2,group2,is_atomic))); + ensure("setOwnerAndGroup():failed ", ! perm.setOwnerAndGroup(agent,owner2,group2,is_atomic)); // should be able to change - agent and owner same as current owner - ensure("setOwnerAndGroup():failed ", (TRUE == perm.setOwnerAndGroup(owner,owner,group2,is_atomic))); + ensure("setOwnerAndGroup():failed ", perm.setOwnerAndGroup(owner,owner,group2,is_atomic)); } template<> template<> @@ -259,7 +259,7 @@ namespace tut LLPermissions perm; LLUUID agent; LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8"); - ensure("deedToGroup():failed ", (TRUE == perm.deedToGroup(agent,group))); + ensure("deedToGroup():failed ", perm.deedToGroup(agent,group)); } template<> template<> void permission_object_t::test<11>() @@ -268,12 +268,12 @@ namespace tut LLUUID agent; BOOL set = 1; U32 bits = PERM_TRANSFER | PERM_MODIFY; - ensure("setBaseBits():failed ", (TRUE == perm.setBaseBits(agent, set, bits))); - ensure("setOwnerBits():failed ", (TRUE == perm.setOwnerBits(agent, set, bits))); + ensure("setBaseBits():failed ", perm.setBaseBits(agent, set, bits)); + ensure("setOwnerBits():failed ", perm.setOwnerBits(agent, set, bits)); LLUUID agent1("9c8eca51-53d5-42a7-bb58-cef070395db8"); - ensure("setBaseBits():failed ", (FALSE == perm.setBaseBits(agent1, set, bits))); - ensure("setOwnerBits():failed ", (FALSE == perm.setOwnerBits(agent1, set, bits))); + ensure("setBaseBits():failed ", ! perm.setBaseBits(agent1, set, bits)); + ensure("setOwnerBits():failed ", ! perm.setOwnerBits(agent1, set, bits)); } template<> template<> @@ -284,14 +284,14 @@ namespace tut LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8"); BOOL set = 1; U32 bits = 10; - ensure("setGroupBits():failed ", (TRUE == perm.setGroupBits(agent,group, set, bits))); - ensure("setEveryoneBits():failed ", (TRUE == perm.setEveryoneBits(agent,group, set, bits))); - ensure("setNextOwnerBits():failed ", (TRUE == perm.setNextOwnerBits(agent,group, set, bits))); - - LLUUID agent1("abf0d56b-82e5-47a2-a8ad-74741bb2c29e"); - ensure("setGroupBits():failed ", (FALSE == perm.setGroupBits(agent1,group, set, bits))); - ensure("setEveryoneBits():failed ", (FALSE == perm.setEveryoneBits(agent1,group, set, bits))); - ensure("setNextOwnerBits():failed ", (FALSE == perm.setNextOwnerBits(agent1,group, set, bits))); + ensure("setGroupBits():failed ", perm.setGroupBits(agent,group, set, bits)); + ensure("setEveryoneBits():failed ", perm.setEveryoneBits(agent,group, set, bits)); + ensure("setNextOwnerBits():failed ", perm.setNextOwnerBits(agent,group, set, bits)); + + LLUUID agent1("abf0d56b-82e5-47a2-a8ad-74741bb2c29e"); + ensure("setGroupBits():failed ", ! perm.setGroupBits(agent1,group, set, bits)); + ensure("setEveryoneBits():failed ", ! perm.setEveryoneBits(agent1,group, set, bits)); + ensure("setNextOwnerBits():failed ", ! perm.setNextOwnerBits(agent1,group, set, bits)); } template<> template<> @@ -301,14 +301,14 @@ namespace tut LLUUID agent; LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8"); U32 bits = 10; - ensure("allowOperationBy():failed ", (TRUE == perm.allowOperationBy(bits,agent,group))); + ensure("allowOperationBy():failed ", perm.allowOperationBy(bits,agent,group)); LLUUID agent1("abf0d56b-82e5-47a2-a8ad-74741bb2c29e"); LLUUID creator("abf0d56b-82e5-47a2-a8ad-74741bb2c29e"); LLUUID owner("68edcf47-ccd7-45b8-9f90-1649d7f12806"); LLUUID lastOwner("5e47a0dc-97bf-44e0-8b40-de06718cee9d"); perm.init(creator,owner,lastOwner,group); - ensure("allowOperationBy():failed ", (TRUE == perm.allowOperationBy(bits,agent1,group))); + ensure("allowOperationBy():failed ", perm.allowOperationBy(bits,agent1,group)); } template<> template<> @@ -321,15 +321,12 @@ namespace tut LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8"); perm.init(creator,owner,lastOwner,group); LLUUID agent; - ensure("1:allowModifyBy():failed ", (TRUE == perm.allowModifyBy(agent))); - ensure("2:allowModifyBy():failed ", (TRUE == perm.allowModifyBy(agent,group))); + ensure("1:allowModifyBy():failed ", perm.allowModifyBy(agent)); + ensure("2:allowModifyBy():failed ", perm.allowModifyBy(agent,group)); - U32 val1 = 0x7FFFFFFF; - S32 sVal = 1 << 14; - sVal = val1 & sVal; LLUUID agent1("9c8eca51-53d5-42a7-bb58-cef070395db8"); - ensure("3:allowModifyBy():failed ", (sVal == perm.allowModifyBy(agent1))); - ensure("4:allowModifyBy():failed ", (sVal == perm.allowModifyBy(agent1,group))); + ensure("3:allowModifyBy():failed ", perm.allowModifyBy(agent1)); + ensure("4:allowModifyBy():failed ", perm.allowModifyBy(agent1,group)); } template<> template<> @@ -342,15 +339,12 @@ namespace tut LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8"); perm.init(creator,owner,lastOwner,group); LLUUID agent; - ensure("1:allowCopyBy():failed ", (TRUE == perm.allowModifyBy(agent))); - ensure("2:allowCopyBy():failed ", (TRUE == perm.allowModifyBy(agent,group))); + ensure("1:allowCopyBy():failed ", perm.allowModifyBy(agent)); + ensure("2:allowCopyBy():failed ", perm.allowModifyBy(agent,group)); - U32 val1 = 0x7FFFFFFF; - S32 sVal = 1 << 15; - sVal = val1 & sVal; LLUUID agent1("9c8eca51-53d5-42a7-bb58-cef070395db8"); - ensure("3:allowCopyBy():failed ", (sVal == perm.allowCopyBy(agent1))); - ensure("4:allowCopyBy():failed ", (sVal == perm.allowCopyBy(agent1,group))); + ensure("3:allowCopyBy():failed ", perm.allowCopyBy(agent1)); + ensure("4:allowCopyBy():failed ", perm.allowCopyBy(agent1,group)); } template<> template<> @@ -363,15 +357,12 @@ namespace tut LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8"); perm.init(creator,owner,lastOwner,group); LLUUID agent; - ensure("1:allowMoveBy():failed ", (TRUE == perm.allowMoveBy(agent))); - ensure("2:allowMoveBy():failed ", (TRUE == perm.allowMoveBy(agent,group))); + ensure("1:allowMoveBy():failed ", perm.allowMoveBy(agent)); + ensure("2:allowMoveBy():failed ", perm.allowMoveBy(agent,group)); - U32 val1 = 0x7FFFFFFF; - S32 sVal = 1 << 19; - sVal = val1 & sVal; LLUUID agent1("9c8eca51-53d5-42a7-bb58-cef070395db8"); - ensure("3:allowMoveBy():failed ", (sVal == perm.allowMoveBy(agent1))); - ensure("4:allowMoveBy():failed ", (sVal == perm.allowMoveBy(agent1,group))); + ensure("3:allowMoveBy():failed ", perm.allowMoveBy(agent1)); + ensure("4:allowMoveBy():failed ", perm.allowMoveBy(agent1,group)); } template<> template<> @@ -383,20 +374,17 @@ namespace tut LLUUID lastOwner("5e47a0dc-97bf-44e0-8b40-de06718cee9d"); LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8"); LLUUID agent; - ensure("1:allowMoveBy():failed ", (TRUE == perm.allowTransferTo(agent))); + ensure("1:allowMoveBy():failed ", perm.allowTransferTo(agent)); perm.init(creator,owner,lastOwner,group); - U32 val1 = 0x7FFFFFFF; - S32 sVal = 1 << 13; - sVal = val1 & sVal; - ensure("2:allowMoveBy():failed ", (sVal == perm.allowTransferTo(agent))); + ensure("2:allowMoveBy():failed ", perm.allowTransferTo(agent)); } template<> template<> void permission_object_t::test<18>() { LLPermissions perm,perm1; - ensure("1:Operator==:failed ", perm == perm1); + ensure_equals("1:Operator==:failed ", perm, perm1); LLUUID creator("abf0d56b-82e5-47a2-a8ad-74741bb2c29e"); LLUUID owner("68edcf47-ccd7-45b8-9f90-1649d7f12806"); @@ -404,7 +392,7 @@ namespace tut LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8"); perm.init(creator,owner,lastOwner,group); perm = perm1; - ensure("2:Operator==:failed ", perm == perm1); + ensure_equals("2:Operator==:failed ", perm, perm1); } template<> template<> @@ -416,7 +404,7 @@ namespace tut LLUUID lastOwner("5e47a0dc-97bf-44e0-8b40-de06718cee9d"); LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8"); perm.init(creator,owner,lastOwner,group); - ensure("2:Operator==:failed ", perm != perm1); + ensure_not_equals("2:Operator==:failed ", perm, perm1); } template<> template<> @@ -453,7 +441,7 @@ namespace tut } perm1.importFile(fp); fclose(fp); - ensure("exportFile()/importFile():failed to export and import the data ", perm1 == perm); + ensure_equals("exportFile()/importFile():failed to export and import the data ", perm1, perm); } template<> template<> @@ -479,7 +467,7 @@ namespace tut std::istringstream istream(ostream.str()); perm1.importLegacyStream(istream); - ensure("exportLegacyStream()/importLegacyStream():failed to export and import the data ", perm1 == perm); + ensure_equals("exportLegacyStream()/importLegacyStream():failed to export and import the data ", perm1, perm); } template<> template<> @@ -502,7 +490,7 @@ namespace tut stream1 << perm; perm1.init(creator,owner,lastOwner,group); stream2 << perm1; - ensure("1:operator << failed",(stream1.str() == stream2.str())); + ensure_equals("1:operator << failed", stream1.str(), stream2.str()); } template<> template<> @@ -533,19 +521,19 @@ namespace tut { LLAggregatePermissions AggrPermission; LLAggregatePermissions AggrPermission1; - ensure("getU8() function failed", (AggrPermission.getU8() == 0)); - ensure("isEmpty() function failed", (AggrPermission.isEmpty() == TRUE)); + ensure_equals("getU8() function failed", AggrPermission.getU8(), 0); + ensure("isEmpty() function failed", AggrPermission.isEmpty()); AggrPermission.getValue(PERM_TRANSFER); ensure_equals("getValue() function failed", AggrPermission.getValue(PERM_TRANSFER), 0x00); AggrPermission.aggregate(PERM_ITEM_UNRESTRICTED); - ensure("aggregate() function failed", (AggrPermission.isEmpty() == FALSE)); + ensure("aggregate() function failed", ! AggrPermission.isEmpty()); AggrPermission1.aggregate(AggrPermission); - ensure("aggregate() function failed", (AggrPermission1.isEmpty() == FALSE)); + ensure("aggregate() function failed", ! AggrPermission1.isEmpty()); std::ostringstream stream1; stream1 << AggrPermission; - ensure("operator<< failed", (stream1.str() == "{PI_COPY=All, PI_MODIFY=All, PI_TRANSFER=All}")); + ensure_equals("operator<< failed", stream1.str(), "{PI_COPY=All, PI_MODIFY=All, PI_TRANSFER=All}"); } } diff --git a/indra/test_apps/llplugintest/bookmarks.txt b/indra/test_apps/llplugintest/bookmarks.txt index b8b83df386..2ff64f217f 100644 --- a/indra/test_apps/llplugintest/bookmarks.txt +++ b/indra/test_apps/llplugintest/bookmarks.txt @@ -18,20 +18,20 @@ (Flash) Scribd,http://www.scribd.com/doc/14427744/Second-Life-Quickstart-Guide (Flash) MAME,http://yvern.com/fMAME/fMAME.html (QT) Local sample,file:///C|/Program Files/QuickTime/Sample.mov -(QT) Movie - Watchmen Trailer,http://movies.apple.com/movies/wb/watchmen/watchmen-tlr2_480p.mov -(QT) Movie - Transformers - Revenge of the Fallen,http://movies.apple.com/movies/paramount/transformers2/transformersrevengeofthefallen-tlr1_h.320.mov -(QT) Movie - Terminator Salvation,http://movies.apple.com/movies/wb/terminatorsalvation/terminatorsalvation-tlr3_h.320.mov -(QT) Movie - Angels and Demons,http://movies.apple.com/movies/sony_pictures/angelsanddemons/angelsanddemons-video_h.320.mov -(QT) Movie - Sin City Trailer,http://movies.apple.com/movies/miramax/sin_city/sin_city_480.mov -(QT) Movie - The Incredibles Trailer,http://movies.apple.com/movies/disney/the_incredibles/the_incredibles-tlr_a480.mov +(QT) Movie - Watchmen Trailer,http://trailers.apple.com/movies/wb/watchmen/watchmen-tlr2_480p.mov +(QT) Movie - Transformers - Revenge of the Fallen,http://trailers.apple.com/movies/paramount/transformers2/transformersrevengeofthefallen-tlr1_h.320.mov +(QT) Movie - Terminator Salvation,http://trailers.apple.com/movies/wb/terminatorsalvation/terminatorsalvation-tlr3_h.320.mov +(QT) Movie - Angels and Demons,http://trailers.apple.com/movies/sony_pictures/angelsanddemons/angelsanddemons-video_h.320.mov +(QT) Movie - Sin City Trailer,http://trailers.apple.com/movies/miramax/sin_city/sin_city_480.mov +(QT) Movie - The Incredibles Trailer,http://trailers.apple.com/movies/disney/the_incredibles/the_incredibles-tlr_a480.mov (QT) Movie - Streaming Apple Event,http://stream.qtv.apple.com/events/mar/0903lajkszg/m_090374535329zdwg_650_ref.mov (QT) Movie - MPEG-4 from Amazon S3,http://s3.amazonaws.com/callum-linden/flashdemo/interactive_flash_demo.mp4 -(QT) Movie - Star Trek,http://movies.apple.com/movies/paramount/star_trek/startrek-tlr3_h.320.mov -(QT) Movie - Ice Age 3,http://movies.apple.com/movies/fox/ice_age_iii/iceage3-tlrd_h.320.mov -(QT) Movie - AstroBoy,http://movies.apple.com/movies/summit/astroboy/astroboy-tsr_h.320.mov -(QT) Movie - Ante Up,http://movies.apple.com/movies/independent/anteup/anteup_h.320.mov -(QT) Movie - Every Little Step,http://movies.apple.com/movies/sony/everylittlestep/everylittlestep-clip_h.320.mov -(QT) Movie - The Informers,http://movies.apple.com/movies/independent/theinformers/theinformers_h.320.mov +(QT) Movie - Star Trek,http://trailers.apple.com/movies/paramount/star_trek/startrek-tlr3_h.320.mov +(QT) Movie - Ice Age 3,http://trailers.apple.com/movies/fox/ice_age_iii/iceage3-tlrd_h.320.mov +(QT) Movie - AstroBoy,http://trailers.apple.com/movies/summit/astroboy/astroboy-tsr_h.320.mov +(QT) Movie - Ante Up,http://trailers.apple.com/movies/independent/anteup/anteup_h.320.mov +(QT) Movie - Every Little Step,http://trailers.apple.com/movies/sony/everylittlestep/everylittlestep-clip_h.320.mov +(QT) Movie - The Informers,http://trailers.apple.com/movies/independent/theinformers/theinformers_h.320.mov (QT) Animated GIF,http://upload.wikimedia.org/wikipedia/commons/4/44/Optical.greysquares.arp-animated.gif (QT) Apple Text Descriptors,http://ubrowser.com/tmp/apple_text.txt (EX) Example Plugin,example://blah diff --git a/indra/test_apps/llplugintest/llmediaplugintest.cpp b/indra/test_apps/llplugintest/llmediaplugintest.cpp index d183aac208..7a544debb2 100644 --- a/indra/test_apps/llplugintest/llmediaplugintest.cpp +++ b/indra/test_apps/llplugintest/llmediaplugintest.cpp @@ -66,11 +66,11 @@ static void gluiCallbackWrapper( int control_id ); static bool isTexture( GLuint texture ) { bool result = false; - + // glIsTexture will sometimes return false for real textures... do this instead. if(texture != 0) result = true; - + return result; } @@ -95,24 +95,24 @@ mediaPanel::~mediaPanel() glDeleteTextures( 1, &mPickTextureHandle ); mPickTextureHandle = 0; } - + if ( isTexture( mMediaTextureHandle ) ) { std::cerr << "remMediaPanel: deleting media texture " << mMediaTextureHandle << std::endl; glDeleteTextures( 1, &mMediaTextureHandle ); mMediaTextureHandle = 0; } - + if(mPickTexturePixels) { delete mPickTexturePixels; } - + if(mMediaSource) { delete mMediaSource; } - + } //////////////////////////////////////////////////////////////////////////////// @@ -128,6 +128,7 @@ LLMediaPluginTest::LLMediaPluginTest( int app_window, int window_width, int wind mCurMouseY( 0 ), mFuzzyMedia( true ), mSelectedPanel( 0 ), + mDistanceCameraToSelectedGeometry( 0.0f ), mMediaBrowserControlEnableCookies( 0 ), mMediaBrowserControlBackButton( 0 ), mMediaBrowserControlForwardButton( 0 ), @@ -151,7 +152,7 @@ LLMediaPluginTest::LLMediaPluginTest( int app_window, int window_width, int wind //mBookmarks.push_back( std::pair< std::string, std::string >( "description", "url" ) ); // read bookmarks from file. - // note: uses command in ./CmakeLists.txt which copies bookmmarks file from source directory + // note: uses command in ./CmakeLists.txt which copies bookmmarks file from source directory // to app directory (WITHOUT build configuration dir) (this is cwd in Windows within MSVC) // For example, test_apps\llplugintest and not test_apps\llplugintest\Release // This may need to be changed for Mac/Linux builds. @@ -193,7 +194,7 @@ LLMediaPluginTest::LLMediaPluginTest( int app_window, int window_width, int wind // initialize linden lab APR module ll_init_apr(); - // Set up llerror logging + // Set up llerror logging { LLError::initForApplication("."); LLError::setDefaultLevel(LLError::LEVEL_INFO); @@ -240,6 +241,9 @@ LLMediaPluginTest::~LLMediaPluginTest() { remMediaPanel( mMediaPanels[ i ] ); }; + + // Stop the plugin read thread if it's running. + LLPluginProcessParent::setUseReadThread(false); } //////////////////////////////////////////////////////////////////////////////// @@ -273,7 +277,7 @@ void LLMediaPluginTest::reshape( int width, int height ) void LLMediaPluginTest::bindTexture(GLuint texture, GLint row_length, GLint alignment) { glEnable( GL_TEXTURE_2D ); - + glBindTexture( GL_TEXTURE_2D, texture ); glPixelStorei( GL_UNPACK_ROW_LENGTH, row_length ); glPixelStorei( GL_UNPACK_ALIGNMENT, alignment ); @@ -285,27 +289,57 @@ bool LLMediaPluginTest::checkGLError(const char *name) { bool result = false; GLenum error = glGetError(); - + if(error != GL_NO_ERROR) { // For some reason, glGenTextures is returning GL_INVALID_VALUE... std::cout << name << " ERROR 0x" << std::hex << error << std::dec << std::endl; result = true; } - + return result; } //////////////////////////////////////////////////////////////////////////////// // -void LLMediaPluginTest::drawGeometry( int panel ) +GLfloat LLMediaPluginTest::distanceToCamera( GLfloat point_x, GLfloat point_y, GLfloat point_z ) +{ + GLdouble camera_pos_x = 0.0f; + GLdouble camera_pos_y = 0.0f; + GLdouble camera_pos_z = 0.0f; + + GLdouble modelMatrix[16]; + GLdouble projMatrix[16]; + GLint viewport[4]; + + glGetDoublev(GL_MODELVIEW_MATRIX, modelMatrix); + glGetDoublev(GL_PROJECTION_MATRIX, projMatrix); + glGetIntegerv(GL_VIEWPORT, viewport); + + gluUnProject( + (viewport[2]-viewport[0])/2 , (viewport[3]-viewport[1])/2, + 0.0, + modelMatrix, projMatrix, viewport, + &camera_pos_x, &camera_pos_y, &camera_pos_z ); + + GLfloat distance = + sqrt( ( camera_pos_x - point_x ) * ( camera_pos_x - point_x ) + + ( camera_pos_y - point_y ) * ( camera_pos_y - point_y ) + + ( camera_pos_z - point_z ) * ( camera_pos_z - point_z ) ); + + return distance; +} + +//////////////////////////////////////////////////////////////////////////////// +// +void LLMediaPluginTest::drawGeometry( int panel, bool selected ) { // texture coordinates for each panel GLfloat non_opengl_texture_coords[ 8 ] = { 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f }; GLfloat opengl_texture_coords[ 8 ] = { 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f }; - + GLfloat *texture_coords = mMediaPanels[ panel ]->mAppTextureCoordsOpenGL?opengl_texture_coords:non_opengl_texture_coords; - + // base coordinates for each panel GLfloat base_vertex_pos[ 8 ] = { 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f }; @@ -316,31 +350,35 @@ void LLMediaPluginTest::drawGeometry( int panel ) const int panel_x = ( panel / num_rows ); const int panel_y = ( panel % num_rows ); - const float spacing = 0.1f; + // default spacing is small - make it larger if checkbox set - for testing positional audio + float spacing = 0.1f; + if ( mLargePanelSpacing ) + spacing = 2.0f; + const GLfloat offset_x = num_cols * ( 1.0 + spacing ) / 2; const GLfloat offset_y = num_rows * ( 1.0 + spacing ) / 2; - + // Adjust for media aspect ratios - { + { float aspect = 1.0f; if(mMediaPanels[ panel ]->mMediaHeight != 0) { aspect = (float)mMediaPanels[ panel ]->mMediaWidth / (float)mMediaPanels[ panel ]->mMediaHeight; } - + if(aspect > 1.0f) { // media is wider than it is high -- adjust the top and bottom in for( int corner = 0; corner < 4; ++corner ) { float temp = base_vertex_pos[corner * 2 + 1]; - + if(temp < 0.5f) temp += 0.5 - (0.5f / aspect); else temp -= 0.5 - (0.5f / aspect); - + base_vertex_pos[corner * 2 + 1] = temp; } } @@ -350,7 +388,7 @@ void LLMediaPluginTest::drawGeometry( int panel ) for( int corner = 0; corner < 4; ++corner ) { float temp = base_vertex_pos[corner * 2]; - + if(temp < 0.5f) temp += 0.5f - (0.5f * aspect); else @@ -371,6 +409,15 @@ void LLMediaPluginTest::drawGeometry( int panel ) glVertex3f( x, y, 0.0f ); }; glEnd(); + + // calculate distance to this panel if it's selected + if ( selected ) + { + GLfloat point_x = base_vertex_pos[ 0 ] + panel_x * ( 1.0 + spacing ) - offset_x + spacing / 2.0f; + GLfloat point_y = base_vertex_pos[ 0 + 1 ] + panel_y * ( 1.0 + spacing ) - offset_y + spacing / 2.0f; + GLfloat point_z = 0.0f; + mDistanceCameraToSelectedGeometry = distanceToCamera( point_x, point_y, point_z ); + }; } ////////////////////////////////////////////////////////////////////////////// @@ -403,7 +450,7 @@ void LLMediaPluginTest::draw( int draw_type ) if ( draw_type == DrawTypePickTexture ) { // only bother with pick if we have something to render - // Actually, we need to pick even if we're not ready to render. + // Actually, we need to pick even if we're not ready to render. // Otherwise you can't select and remove a panel which has gone bad. //if ( mMediaPanels[ panel ]->mReadyToRender ) { @@ -420,7 +467,7 @@ void LLMediaPluginTest::draw( int draw_type ) glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST ); // draw geometry using pick texture - drawGeometry( panel ); + drawGeometry( panel, false ); glMatrixMode( GL_TEXTURE ); glPopMatrix(); @@ -431,13 +478,13 @@ void LLMediaPluginTest::draw( int draw_type ) { bool texture_valid = false; bool plugin_exited = false; - + if(mMediaPanels[ panel ]->mMediaSource) { texture_valid = mMediaPanels[ panel ]->mMediaSource->textureValid(); plugin_exited = mMediaPanels[ panel ]->mMediaSource->isPluginExited(); } - + // save texture matrix (changes for each panel) glMatrixMode( GL_TEXTURE ); glPushMatrix(); @@ -465,14 +512,14 @@ void LLMediaPluginTest::draw( int draw_type ) mMediaPanels[ panel ]->mTextureScaleY, 1.0f ); }; - + float intensity = plugin_exited?0.25f:1.0f; - + // highlight the selected panel if ( mSelectedPanel && ( mMediaPanels[ panel ]->mId == mSelectedPanel->mId ) ) { startPanelHighlight( intensity, intensity, 0.0f, 5.0f ); - drawGeometry( panel ); + drawGeometry( panel, true ); endPanelHighlight(); } else @@ -481,21 +528,21 @@ void LLMediaPluginTest::draw( int draw_type ) if ( !mMediaPanels[ panel ]->mReadyToRender ) { startPanelHighlight( intensity, 0.0f, 0.0f, 2.0f ); - drawGeometry( panel ); + drawGeometry( panel, false ); endPanelHighlight(); } else - // just display a border around the media + // just display a border around the media { startPanelHighlight( 0.0f, intensity, 0.0f, 2.0f ); - drawGeometry( panel ); + drawGeometry( panel, false ); endPanelHighlight(); }; - + if ( mMediaPanels[ panel ]->mReadyToRender && texture_valid ) { // draw visual geometry - drawGeometry( panel ); + drawGeometry( panel, false ); } // restore texture matrix (changes for each panel) @@ -551,7 +598,7 @@ void LLMediaPluginTest::idle() // GLUI requires this if ( glutGetWindow() != mAppWindow ) glutSetWindow( mAppWindow ); - + // random creation/destruction of panels enabled? const time_t panel_timeout_time = 5; if ( mRandomPanelCount ) @@ -704,7 +751,7 @@ void LLMediaPluginTest::idle() for( int panel_index = 0; panel_index < (int)mMediaPanels.size(); ++panel_index ) { mediaPanel *panel = mMediaPanels[ panel_index ]; - + // call plugins idle function so it can potentially update itself panel->mMediaSource->idle(); @@ -717,7 +764,7 @@ void LLMediaPluginTest::idle() //std::cout << "texture invalid, skipping update..." << std::endl; } else - if ( panel && + if ( panel && ( panel->mMediaWidth != panel->mMediaSource->getWidth() || panel->mMediaHeight != panel->mMediaSource->getHeight() ) ) { @@ -733,7 +780,7 @@ void LLMediaPluginTest::idle() int y_offset = dirty_rect.mBottom; int width = dirty_rect.mRight - dirty_rect.mLeft; int height = dirty_rect.mTop - dirty_rect.mBottom; - + if((dirty_rect.mRight <= panel->mTextureWidth) && (dirty_rect.mTop <= panel->mTextureHeight)) { // Offset the pixels pointer properly @@ -752,23 +799,23 @@ void LLMediaPluginTest::idle() glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST ); }; - + checkGLError("glTexParameteri"); - + if(panel->mMediaSource->getTextureFormatSwapBytes()) { glPixelStorei(GL_UNPACK_SWAP_BYTES, 1); checkGLError("glPixelStorei"); } - + // draw portion that changes into texture - glTexSubImage2D( GL_TEXTURE_2D, 0, - x_offset, + glTexSubImage2D( GL_TEXTURE_2D, 0, + x_offset, y_offset, - width, + width, height, - panel->mMediaSource->getTextureFormatPrimary(), - panel->mMediaSource->getTextureFormatType(), + panel->mMediaSource->getTextureFormatPrimary(), + panel->mMediaSource->getTextureFormatType(), pixels ); if(checkGLError("glTexSubImage2D")) @@ -788,9 +835,9 @@ void LLMediaPluginTest::idle() glPixelStorei(GL_UNPACK_SWAP_BYTES, 0); checkGLError("glPixelStorei"); } - + panel->mMediaSource->resetDirty(); - + panel->mReadyToRender = true; } else @@ -811,8 +858,8 @@ void LLMediaPluginTest::idle() //////////////////////////////////////////////////////////////////////////////// // -void LLMediaPluginTest::windowPosToTexturePos( int window_x, int window_y, - int& media_x, int& media_y, +void LLMediaPluginTest::windowPosToTexturePos( int window_x, int window_y, + int& media_x, int& media_y, int& id ) { if ( ! mSelectedPanel ) @@ -828,7 +875,7 @@ void LLMediaPluginTest::windowPosToTexturePos( int window_x, int window_y, // OpenGL app == coordinate system this way // NOTE: unrelated to settings in plugin - this // is just for this app - mCurMouseY = mWindowHeight - window_y; + mCurMouseY = mWindowHeight - window_y; // extract x (0..1023, y (0..1023) and id (0..15) from RGB components unsigned long pixel_read_color_bits = ( mPixelReadColor[ 0 ] << 16 ) | ( mPixelReadColor[ 1 ] << 8 ) | mPixelReadColor[ 2 ]; @@ -880,14 +927,14 @@ void LLMediaPluginTest::selectPanel( mediaPanel* panel ) mSelectedPanel->mMediaSource->setVolume( 0.0f ); mSelectedPanel->mMediaSource->setPriority( LLPluginClassMedia::PRIORITY_LOW ); }; - + mSelectedPanel = panel; if( mSelectedPanel && mSelectedPanel->mMediaSource ) { mSelectedPanel->mMediaSource->setVolume( (float)mMediaTimeControlVolume / 100.0f ); mSelectedPanel->mMediaSource->setPriority( LLPluginClassMedia::PRIORITY_NORMAL ); - + if(!mSelectedPanel->mStartUrl.empty()) { mUrlEdit->set_text(const_cast<char*>(mSelectedPanel->mStartUrl.c_str()) ); @@ -900,7 +947,7 @@ void LLMediaPluginTest::selectPanel( mediaPanel* panel ) mediaPanel* LLMediaPluginTest::findMediaPanel( LLPluginClassMedia* source ) { mediaPanel *result = NULL; - + for( int panel = 0; panel < (int)mMediaPanels.size(); ++panel ) { if ( mMediaPanels[ panel ]->mMediaSource == source ) @@ -908,7 +955,7 @@ mediaPanel* LLMediaPluginTest::findMediaPanel( LLPluginClassMedia* source ) result = mMediaPanels[ panel ]; } } - + return result; } @@ -1003,6 +1050,11 @@ void LLMediaPluginTest::gluiCallback( int control_id ) } } else + if ( control_id == mIdUsePluginReadThread ) + { + LLPluginProcessParent::setUseReadThread(mUsePluginReadThread); + } + else if ( control_id == mIdControlCrashPlugin ) { // send message to plugin and ask it to crash @@ -1066,7 +1118,7 @@ void LLMediaPluginTest::gluiCallback( int control_id ) { if ( mSelectedPanel ) { - // get value from spinner + // get value from spinner float seconds_to_seek = mMediaTimeControlSeekSeconds; mSelectedPanel->mMediaSource->seek( seconds_to_seek ); mSelectedPanel->mMediaSource->start(); @@ -1169,8 +1221,8 @@ void LLMediaPluginTest::keyboard( int key ) exit( 0 ); }; - mSelectedPanel->mMediaSource->keyEvent( LLPluginClassMedia::KEY_EVENT_DOWN, key, 0 ); - mSelectedPanel->mMediaSource->keyEvent( LLPluginClassMedia::KEY_EVENT_UP, key, 0 ); + mSelectedPanel->mMediaSource->keyEvent( LLPluginClassMedia::KEY_EVENT_DOWN, key, 0 , LLSD()); + mSelectedPanel->mMediaSource->keyEvent( LLPluginClassMedia::KEY_EVENT_UP, key, 0, LLSD()); }; //////////////////////////////////////////////////////////////////////////////// @@ -1194,7 +1246,7 @@ void LLMediaPluginTest::mouseButton( int button, int state, int x, int y ) windowPosToTexturePos( x, y, media_x, media_y, id ); // only select a panel if we're on a panel - // (HACK: strictly speaking this rules out clicking on + // (HACK: strictly speaking this rules out clicking on // the origin of a panel but that's very unlikely) if ( media_x > 0 && media_y > 0 ) { @@ -1327,18 +1379,18 @@ void LLMediaPluginTest::makeChrome() mGluiMediaTimeControlWindow->add_column( false ); mIdMediaTimeControlVolume = start_id++; GLUI_Spinner* spinner = mGluiMediaTimeControlWindow->add_spinner( "Volume", 2, &mMediaTimeControlVolume, mIdMediaTimeControlVolume, gluiCallbackWrapper); - spinner->set_float_limits( 0, 100 ); + spinner->set_float_limits( 0, 100 ); mGluiMediaTimeControlWindow->add_column( true ); mIdMediaTimeControlSeekSeconds = start_id++; spinner = mGluiMediaTimeControlWindow->add_spinner( "", 2, &mMediaTimeControlSeekSeconds, mIdMediaTimeControlSeekSeconds, gluiCallbackWrapper); - spinner->set_float_limits( 0, 200 ); + spinner->set_float_limits( 0, 200 ); spinner->set_w( 32 ); spinner->set_speed( 0.025f ); mGluiMediaTimeControlWindow->add_column( false ); mIdMediaTimeControlSeek = start_id++; mGluiMediaTimeControlWindow->add_button( "SEEK", mIdMediaTimeControlSeek, gluiCallbackWrapper ); mGluiMediaTimeControlWindow->add_column( false ); - + // top window - media controls for "browser" media types (e.g. web browser) mGluiMediaBrowserControlWindow = GLUI_Master.create_glui_subwindow( mAppWindow, GLUI_SUBWINDOW_TOP ); @@ -1385,6 +1437,19 @@ void LLMediaPluginTest::makeChrome() mDisableTimeout = 0; glui_window_misc_control->add_checkbox( "Disable plugin timeout", &mDisableTimeout, mIdDisableTimeout, gluiCallbackWrapper ); glui_window_misc_control->set_main_gfx_window( mAppWindow ); + glui_window_misc_control->add_column( true ); + + mIdUsePluginReadThread = start_id++; + mUsePluginReadThread = 0; + glui_window_misc_control->add_checkbox( "Use plugin read thread", &mUsePluginReadThread, mIdUsePluginReadThread, gluiCallbackWrapper ); + glui_window_misc_control->set_main_gfx_window( mAppWindow ); + glui_window_misc_control->add_column( true ); + + mIdLargePanelSpacing = start_id++; + mLargePanelSpacing = 0; + glui_window_misc_control->add_checkbox( "Large Panel Spacing", &mLargePanelSpacing, mIdLargePanelSpacing, gluiCallbackWrapper ); + glui_window_misc_control->set_main_gfx_window( mAppWindow ); + glui_window_misc_control->add_column( true ); // bottom window - status mBottomGLUIWindow = GLUI_Master.create_glui_subwindow( mAppWindow, GLUI_SUBWINDOW_BOTTOM ); @@ -1449,7 +1514,7 @@ void LLMediaPluginTest::makePickTexture( int id, GLuint* texture_handle, unsigne // std::string LLMediaPluginTest::mimeTypeFromUrl( std::string& url ) { - // default to web + // default to web std::string mime_type = "text/html"; // we may need a more advanced MIME type accessor later :-) @@ -1479,7 +1544,7 @@ std::string LLMediaPluginTest::pluginNameFromMimeType( std::string& mime_type ) else if ( mime_type == "text/html" ) plugin_name = "media_plugin_webkit.dylib"; - + #elif LL_WINDOWS std::string plugin_name( "media_plugin_null.dll" ); @@ -1523,7 +1588,7 @@ void LLMediaPluginTest::addMediaPanel( std::string url ) // tell the plugin what size we asked for media_source->setSize( media_width, media_height ); - // Use the launcher start and initialize the plugin + // Use the launcher start and initialize the plugin #if LL_DARWIN || LL_LINUX std::string launcher_name( "SLPlugin" ); #elif LL_WINDOWS @@ -1542,8 +1607,8 @@ void LLMediaPluginTest::addMediaPanel( std::string url ) } std::string user_data_path = std::string( cwd ) + "/"; #endif - - media_source->init( launcher_name, plugin_name, false, user_data_path ); + media_source->setUserDataPath(user_data_path); + media_source->init( launcher_name, plugin_name, false ); media_source->setDisableTimeout(mDisableTimeout); // make a new panel and save parameters @@ -1580,7 +1645,7 @@ void LLMediaPluginTest::addMediaPanel( std::string url ) // id wasn't found so we can use it if ( ! id_exists ) { - panel->mId = nid; + panel->mId = nid; break; }; }; @@ -1592,7 +1657,7 @@ void LLMediaPluginTest::addMediaPanel( std::string url ) } else { - // now we have the ID we can use it to make the + // now we have the ID we can use it to make the // pick texture (id is baked into texture pixels) makePickTexture( panel->mId, &panel->mPickTextureHandle, &panel->mPickTexturePixels ); @@ -1615,17 +1680,17 @@ void LLMediaPluginTest::addMediaPanel( std::string url ) void LLMediaPluginTest::updateMediaPanel( mediaPanel* panel ) { // checkGLError("LLMediaPluginTest::updateMediaPanel"); - - if ( ! panel ) + + if ( ! panel ) return; - + if(!panel->mMediaSource || !panel->mMediaSource->textureValid()) { panel->mReadyToRender = false; return; } - - // take a reference copy of the plugin values since they + + // take a reference copy of the plugin values since they // might change during this lifetime of this function int plugin_media_width = panel->mMediaSource->getWidth(); int plugin_media_height = panel->mMediaSource->getHeight(); @@ -1633,18 +1698,18 @@ void LLMediaPluginTest::updateMediaPanel( mediaPanel* panel ) int plugin_texture_height = panel->mMediaSource->getBitsHeight(); // If the texture isn't created or the media or texture dimensions changed AND - // the sizes are valid then we need to delete the old media texture (if necessary) + // the sizes are valid then we need to delete the old media texture (if necessary) // then make a new one. if ((panel->mMediaTextureHandle == 0 || panel->mMediaWidth != plugin_media_width || - panel->mMediaHeight != plugin_media_height || + panel->mMediaHeight != plugin_media_height || panel->mTextureWidth != plugin_texture_width || panel->mTextureHeight != plugin_texture_height) && - ( plugin_media_width > 0 && plugin_media_height > 0 && + ( plugin_media_width > 0 && plugin_media_height > 0 && plugin_texture_width > 0 && plugin_texture_height > 0 ) ) { - std::cout << "Valid media size (" << plugin_media_width << " x " << plugin_media_height - << ") and texture size (" << plugin_texture_width << " x " << plugin_texture_height + std::cout << "Valid media size (" << plugin_media_width << " x " << plugin_media_height + << ") and texture size (" << plugin_texture_width << " x " << plugin_texture_height << ") for panel with ID=" << panel->mId << " - making texture" << std::endl; // delete old GL texture @@ -1654,13 +1719,13 @@ void LLMediaPluginTest::updateMediaPanel( mediaPanel* panel ) glDeleteTextures( 1, &panel->mMediaTextureHandle ); panel->mMediaTextureHandle = 0; } - + std::cerr << "before: pick texture is " << panel->mPickTextureHandle << ", media texture is " << panel->mMediaTextureHandle << std::endl; - + // make a GL texture based on the dimensions the plugin told us GLuint new_texture = 0; glGenTextures( 1, &new_texture ); - + checkGLError("glGenTextures"); std::cout << "glGenTextures returned " << new_texture << std::endl; @@ -1679,7 +1744,7 @@ void LLMediaPluginTest::updateMediaPanel( mediaPanel* panel ) std::cerr << "after: pick texture is " << panel->mPickTextureHandle << ", media texture is " << panel->mMediaTextureHandle << std::endl; }; - + // update our record of the media and texture dimensions // NOTE: do this after we we check for sizes changes panel->mMediaWidth = plugin_media_width; @@ -1699,7 +1764,7 @@ void LLMediaPluginTest::updateMediaPanel( mediaPanel* panel ) panel->mAppTextureCoordsOpenGL = panel->mMediaSource->getTextureCoordsOpenGL(); // Check to see if we have enough to render this panel. - // If we do, set a flag that the display functions use so + // If we do, set a flag that the display functions use so // they only render a panel with media if it's ready. if ( panel->mMediaWidth < 0 || panel->mMediaHeight < 0 || @@ -1716,26 +1781,26 @@ void LLMediaPluginTest::updateMediaPanel( mediaPanel* panel ) void LLMediaPluginTest::replaceMediaPanel( mediaPanel* panel, std::string url ) { // no media panels so we can't change anything - have to add - if ( mMediaPanels.size() == 0 ) + if ( mMediaPanels.size() == 0 ) return; // sanity check - if ( ! panel ) + if ( ! panel ) return; - + int index; for(index = 0; index < (int)mMediaPanels.size(); index++) { if(mMediaPanels[index] == panel) break; } - + if(index >= (int)mMediaPanels.size()) { // panel isn't in mMediaPanels return; } - + std::cout << "Replacing media panel with index " << panel->mId << std::endl; int panel_id = panel->mId; @@ -1760,7 +1825,7 @@ void LLMediaPluginTest::replaceMediaPanel( mediaPanel* panel, std::string url ) // tell the plugin what size we asked for media_source->setSize( media_width, media_height ); - // Use the launcher start and initialize the plugin + // Use the launcher start and initialize the plugin #if LL_DARWIN || LL_LINUX std::string launcher_name( "SLPlugin" ); #elif LL_WINDOWS @@ -1780,7 +1845,8 @@ void LLMediaPluginTest::replaceMediaPanel( mediaPanel* panel, std::string url ) std::string user_data_path = std::string( cwd ) + "/"; #endif - media_source->init( launcher_name, plugin_name, false, user_data_path ); + media_source->setUserDataPath(user_data_path); + media_source->init( launcher_name, plugin_name, false ); media_source->setDisableTimeout(mDisableTimeout); // make a new panel and save parameters @@ -1799,12 +1865,12 @@ void LLMediaPluginTest::replaceMediaPanel( mediaPanel* panel, std::string url ) panel->mAppTextureCoordsOpenGL = false; // really need an 'undefined' state here too panel->mReadyToRender = false; - panel->mId = panel_id; - + panel->mId = panel_id; + // Replace the entry in the panels array mMediaPanels[index] = panel; - // now we have the ID we can use it to make the + // now we have the ID we can use it to make the // pick texture (id is baked into texture pixels) makePickTexture( panel->mId, &panel->mPickTextureHandle, &panel->mPickTexturePixels ); @@ -1820,7 +1886,7 @@ void LLMediaPluginTest::replaceMediaPanel( mediaPanel* panel, std::string url ) // void LLMediaPluginTest::getRandomMediaSize( int& width, int& height, std::string mime_type ) { - // Make a new media source with a random size which we'll either + // Make a new media source with a random size which we'll either // directly or the media plugin will tell us what it wants later. // Use a random size so we can test support for weird media sizes. // (Almost everything else will get filled in later once the @@ -1829,8 +1895,8 @@ void LLMediaPluginTest::getRandomMediaSize( int& width, int& height, std::string width = ( ( rand() % 170 ) + 30 ) * 4; height = ( ( rand() % 170 ) + 30 ) * 4; - // adjust this random size if it's a browser so we get - // a more useful size for testing.. + // adjust this random size if it's a browser so we get + // a more useful size for testing.. if ( mime_type == "text/html" || mime_type == "example/example" ) { width = ( ( rand() % 100 ) + 100 ) * 4; @@ -1843,11 +1909,11 @@ void LLMediaPluginTest::getRandomMediaSize( int& width, int& height, std::string void LLMediaPluginTest::remMediaPanel( mediaPanel* panel ) { // always leave one panel - if ( mMediaPanels.size() == 1 ) + if ( mMediaPanels.size() == 1 ) return; // sanity check - don't think this can happen but see above for a case where it might... - if ( ! panel ) + if ( ! panel ) return; std::cout << "Removing media panel with index " << panel->mId << " - total panels = " << mMediaPanels.size() - 1 << std::endl; @@ -1855,7 +1921,7 @@ void LLMediaPluginTest::remMediaPanel( mediaPanel* panel ) if(mSelectedPanel == panel) mSelectedPanel = NULL; - delete panel; + delete panel; // remove from storage list for( int i = 0; i < (int)mMediaPanels.size(); ++i ) @@ -1867,7 +1933,7 @@ void LLMediaPluginTest::remMediaPanel( mediaPanel* panel ) }; }; - // select the first panel + // select the first panel selectPanel( mMediaPanels[ 0 ] ); } @@ -1887,26 +1953,28 @@ void LLMediaPluginTest::updateStatusBar() static bool cached_supports_browser_media = true; static bool cached_supports_time_media = false; static int cached_movie_time = -1; + static GLfloat cached_distance = -1.0f; static std::string cached_plugin_version = ""; - if ( + if ( cached_id == mSelectedPanel->mId && cached_media_width == mSelectedPanel->mMediaWidth && cached_media_height == mSelectedPanel->mMediaHeight && cached_texture_width == mSelectedPanel->mTextureWidth && cached_texture_height == mSelectedPanel->mTextureHeight && - cached_supports_browser_media == mSelectedPanel->mMediaSource->pluginSupportsMediaBrowser() && + cached_supports_browser_media == mSelectedPanel->mMediaSource->pluginSupportsMediaBrowser() && cached_supports_time_media == mSelectedPanel->mMediaSource->pluginSupportsMediaTime() && cached_plugin_version == mSelectedPanel->mMediaSource->getPluginVersion() && - cached_movie_time == (int)mSelectedPanel->mMediaSource->getCurrentTime() + cached_movie_time == (int)mSelectedPanel->mMediaSource->getCurrentTime() && + cached_distance == mDistanceCameraToSelectedGeometry ) { - // nothing changed so don't spend time in this shitty function + // nothing changed so don't spend time here return; }; std::ostringstream stream( "" ); - + stream.str( "" ); stream.clear(); @@ -1927,7 +1995,15 @@ void LLMediaPluginTest::updateStatusBar() stream << " x "; stream << std::setw( 4 ) << std::setfill( '0' ); stream << mSelectedPanel->mTextureHeight; + + stream << " | "; + stream << "Distance: "; + stream << std::setw( 6 ); + stream << std::setprecision( 3 ); + stream << std::setprecision( 3 ); + stream << mDistanceCameraToSelectedGeometry; stream << " | "; + if ( mSelectedPanel->mMediaSource->pluginSupportsMediaBrowser() ) stream << "BROWSER"; else @@ -2005,7 +2081,7 @@ void LLMediaPluginTest::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent e { // Uncomment this to make things much, much quieter. // return; - + switch(event) { case MEDIA_EVENT_CONTENT_UPDATED: @@ -2065,11 +2141,11 @@ void LLMediaPluginTest::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent e case MEDIA_EVENT_CLICK_LINK_HREF: std::cerr << "Media event: MEDIA_EVENT_CLICK_LINK_HREF, uri is " << self->getClickURL() << std::endl; break; - + case MEDIA_EVENT_CLICK_LINK_NOFOLLOW: std::cerr << "Media event: MEDIA_EVENT_CLICK_LINK_NOFOLLOW, uri is " << self->getClickURL() << std::endl; break; - + case MEDIA_EVENT_PLUGIN_FAILED: std::cerr << "Media event: MEDIA_EVENT_PLUGIN_FAILED" << std::endl; break; @@ -2195,13 +2271,13 @@ int main( int argc, char* argv[] ) glutSetWindow( app_window_handle ); gApplication = new LLMediaPluginTest( app_window_handle, app_window_width, app_window_height ); - + // update at approximately 60hz int update_ms = 1000 / 60; - + GLUI_Master.set_glutTimerFunc( update_ms, glutIdle, update_ms); glutMainLoop(); - + delete gApplication; } diff --git a/indra/test_apps/llplugintest/llmediaplugintest.h b/indra/test_apps/llplugintest/llmediaplugintest.h index c2b2baba95..5d08e42148 100644 --- a/indra/test_apps/llplugintest/llmediaplugintest.h +++ b/indra/test_apps/llplugintest/llmediaplugintest.h @@ -89,7 +89,7 @@ class LLMediaPluginTest : public LLPluginClassMediaOwner void bindTexture(GLuint texture, GLint row_length = 0, GLint alignment = 1); bool checkGLError(const char *name = "OpenGL"); - void drawGeometry( int panel ); + void drawGeometry( int panel, bool selected ); void startPanelHighlight( float red, float green, float blue, float line_width ); void endPanelHighlight(); enum { DrawTypePickTexture, DrawTypeMediaTexture }; @@ -113,6 +113,9 @@ class LLMediaPluginTest : public LLPluginClassMediaOwner void dumpPanelInfo(); void updateStatusBar(); + GLfloat distanceToCamera( GLfloat point_x, GLfloat point_y, GLfloat point_z ); + + // Inherited from LLPluginClassMediaOwner /*virtual*/ void handleMediaEvent(LLPluginClassMedia* self, LLPluginClassMediaOwner::EMediaEvent); @@ -142,6 +145,8 @@ class LLMediaPluginTest : public LLPluginClassMediaOwner float mViewPos[ 3 ]; float mViewRotation[ 16 ]; + float mDistanceCameraToSelectedGeometry; + int mIdControlAddPanel; int mIdControlRemPanel; @@ -159,6 +164,10 @@ class LLMediaPluginTest : public LLPluginClassMediaOwner int mRandomBookmarks; int mIdDisableTimeout; int mDisableTimeout; + int mIdUsePluginReadThread; + int mUsePluginReadThread; + int mIdLargePanelSpacing; + int mLargePanelSpacing; int mIdControlCrashPlugin; int mIdControlHangPlugin; int mIdControlExitApp; diff --git a/indra/viewer_components/login/lllogin.cpp b/indra/viewer_components/login/lllogin.cpp index b9f61ca7e1..e1922367bf 100644 --- a/indra/viewer_components/login/lllogin.cpp +++ b/indra/viewer_components/login/lllogin.cpp @@ -122,29 +122,35 @@ private: LLSD mAuthResponse, mValidAuthResponse; }; -void LLLogin::Impl::connect(const std::string& uri, const LLSD& credentials) +void LLLogin::Impl::connect(const std::string& uri, const LLSD& login_params) { + LL_DEBUGS("LLLogin") << " connect with uri '" << uri << "', login_params " << login_params << LL_ENDL; + // Launch a coroutine with our login_() method. Run the coroutine until // its first wait; at that point, return here. std::string coroname = LLCoros::instance().launch("LLLogin::Impl::login_", - boost::bind(&Impl::login_, this, _1, uri, credentials)); + boost::bind(&Impl::login_, this, _1, uri, login_params)); + LL_DEBUGS("LLLogin") << " connected with uri '" << uri << "', login_params " << login_params << LL_ENDL; } -void LLLogin::Impl::login_(LLCoros::self& self, std::string uri, LLSD credentials) +void LLLogin::Impl::login_(LLCoros::self& self, std::string uri, LLSD login_params) { - LLSD printable_credentials = credentials; - if(printable_credentials.has("params") - && printable_credentials["params"].has("passwd")) + try { - printable_credentials["params"]["passwd"] = "*******"; - } + LLSD printable_params = login_params; + //if(printable_params.has("params") + // && printable_params["params"].has("passwd")) + //{ + // printable_params["params"]["passwd"] = "*******"; + //} LL_DEBUGS("LLLogin") << "Entering coroutine " << LLCoros::instance().getName(self) - << " with uri '" << uri << "', credentials " << printable_credentials << LL_ENDL; + << " with uri '" << uri << "', parameters " << printable_params << LL_ENDL; // Arriving in SRVRequest state LLEventStream replyPump("SRVreply", true); // Should be an array of one or more uri strings. + LLSD rewrittenURIs; { LLEventTimeout filter(replyPump); @@ -155,9 +161,9 @@ void LLLogin::Impl::login_(LLCoros::self& self, std::string uri, LLSD credential // *NOTE:Mani - Completely arbitrary default timeout value for SRV request. F32 seconds_to_timeout = 5.0f; - if(credentials.has("cfg_srv_timeout")) + if(login_params.has("cfg_srv_timeout")) { - seconds_to_timeout = credentials["cfg_srv_timeout"].asReal(); + seconds_to_timeout = login_params["cfg_srv_timeout"].asReal(); } // If the SRV request times out (e.g. EXT-3934), simulate response: an @@ -167,9 +173,9 @@ void LLLogin::Impl::login_(LLCoros::self& self, std::string uri, LLSD credential filter.eventAfter(seconds_to_timeout, fakeResponse); std::string srv_pump_name = "LLAres"; - if(credentials.has("cfg_srv_pump")) + if(login_params.has("cfg_srv_pump")) { - srv_pump_name = credentials["cfg_srv_pump"].asString(); + srv_pump_name = login_params["cfg_srv_pump"].asString(); } // Make request @@ -194,7 +200,7 @@ void LLLogin::Impl::login_(LLCoros::self& self, std::string uri, LLSD credential urend(rewrittenURIs.endArray()); urit != urend; ++urit) { - LLSD request(credentials); + LLSD request(login_params); request["reply"] = loginReplyPump.getName(); request["uri"] = *urit; std::string status; @@ -291,8 +297,17 @@ void LLLogin::Impl::login_(LLCoros::self& self, std::string uri, LLSD credential // to success, add a data/message and data/reason fields. LLSD error_response; error_response["reason"] = mAuthResponse["status"]; + error_response["errorcode"] = mAuthResponse["errorcode"]; error_response["message"] = mAuthResponse["error"]; + if(mAuthResponse.has("certificate")) + { + error_response["certificate"] = mAuthResponse["certificate"]; + } sendProgressEvent("offline", "fail.login", error_response); + } + catch (...) { + llerrs << "login exception caught" << llendl; + } } void LLLogin::Impl::disconnect() diff --git a/indra/win_crash_logger/llcrashloggerwindows.cpp b/indra/win_crash_logger/llcrashloggerwindows.cpp index c9e01c8418..2884231299 100644 --- a/indra/win_crash_logger/llcrashloggerwindows.cpp +++ b/indra/win_crash_logger/llcrashloggerwindows.cpp @@ -299,7 +299,6 @@ void LLCrashLoggerWindows::gatherPlatformSpecificFiles() // At this point we're responsive enough the user could click the close button SetCursor(gCursorArrow); mDebugLog["DisplayDeviceInfo"] = gDXHardware.getDisplayInfo(); - mFileMap["CrashLog"] = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"SecondLifeException.log"); } bool LLCrashLoggerWindows::mainLoop() diff --git a/indra/win_updater/CMakeLists.txt b/indra/win_updater/CMakeLists.txt index 82347adf20..210486c668 100644 --- a/indra/win_updater/CMakeLists.txt +++ b/indra/win_updater/CMakeLists.txt @@ -6,6 +6,13 @@ include(00-Common) include(LLCommon) include(Linking) +# *HACK - override msvcrt implementation (intialized on 00-Common) to be +# statically linked for the installer this relies on vc taking the last flag on +# the command line +set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd") +set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /MT") +set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT") + include_directories( ${LLCOMMON_INCLUDE_DIRS} ) @@ -30,9 +37,9 @@ target_link_libraries(windows-updater set_target_properties(windows-updater PROPERTIES - LINK_FLAGS "/NODEFAULTLIB:LIBCMT" - LINK_FLAGS_DEBUG "/NODEFAULTLIB:\"LIBCMT;LIBCMTD;MSVCRT\"" + LINK_FLAGS "/NODEFAULTLIB:MSVCRT" + LINK_FLAGS_DEBUG "/NODEFAULTLIB:\"LIBCMT;MSVCRT\"" ) # The windows-updater doesn't link against anything non-system, apparently -#ll_deploy_sharedlibs_command(windows-updater)
\ No newline at end of file +#ll_deploy_sharedlibs_command(windows-updater) diff --git a/install.xml b/install.xml index 0c3c88ce72..f69d781c67 100644 --- a/install.xml +++ b/install.xml @@ -111,16 +111,16 @@ <key>darwin</key> <map> <key>md5sum</key> - <string>d9ce3ace9235249b7edf6f564de83395</string> + <string>cdb2f5c4a5a1f9ecd75bc1dbdd4db8e9</string> <key>url</key> - <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ares-1.4.0-darwin-20080731b.tar.bz2</uri> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ares-1.7.1-darwin-20100606.tar.bz2</uri> </map> <key>linux</key> <map> <key>md5sum</key> - <string>946c2e106f14f7a1e521d4a14e0e146f</string> + <string>91694429e391efeea1de974df26032a2</string> <key>url</key> - <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ares-1.4.0-linux-20081202.tar.bz2</uri> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ares-1.7.1-linux-20100527.tar.bz2</uri> </map> <key>linux64</key> <map> @@ -132,9 +132,9 @@ <key>windows</key> <map> <key>md5sum</key> - <string>f5cf8d121b26f2e7944f7e63cdbff04d</string> + <string>4b84738eec2e21b0c096d53b79ee2681</string> <key>url</key> - <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ares-1.6.0-windows-20091105.tar.bz2</uri> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ares-1.7.1-windows-20100611a.tar.bz2</uri> </map> </map> </map> @@ -193,16 +193,16 @@ <key>darwin</key> <map> <key>md5sum</key> - <string>84821102cb819257a66c8f38732647fc</string> + <string>71defd179827bf172b76d6020023e0e8</string> <key>url</key> - <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.39.0-darwin-20100119.tar.bz2</uri> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.39.0-darwin-20100222a.tar.bz2</uri> </map> <key>linux</key> <map> <key>md5sum</key> - <string>ee8e1b4bbcf137a84d6a85a1c51386ff</string> + <string>d58ac1a8396ac983b67cc3e3541457e3</string> <key>url</key> - <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.39.0-linux-20100119.tar.bz2</uri> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.39.0-linux-20100222a.tar.bz2</uri> </map> <key>linux64</key> <map> @@ -214,9 +214,9 @@ <key>windows</key> <map> <key>md5sum</key> - <string>acbf7a4165a917a4e087879d1756b355</string> + <string>94fd43f534e2055858d524086384907d</string> <key>url</key> - <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.39.0-windows-20100119.tar.bz2</uri> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.39.0-windows-20100219.tar.bz2</uri> </map> </map> </map> @@ -233,16 +233,16 @@ <key>darwin</key> <map> <key>md5sum</key> - <string>1bece4ebdc5fc3818854bc3df14b511b</string> + <string>752e295ccb17f0dcb7c0167db3ad1e69</string> <key>url</key> - <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/curl-7.16.4a-darwin-20090304.tar.bz2</uri> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/curl-7.20.1-darwin-20100606.tar.bz2</uri> </map> <key>linux</key> <map> <key>md5sum</key> - <string>0f366e421ae9c72d9659bd20a2a326d6</string> + <string>a20e73f2e7d6a032ff25a5161b1b7394</string> <key>url</key> - <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/curl-7.16.4a-linux-20090303a.tar.bz2</uri> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/curl-7.20.1-linux-20100527.tar.bz2</uri> </map> <key>linux64</key> <map> @@ -254,9 +254,9 @@ <key>windows</key> <map> <key>md5sum</key> - <string>53e5ab7affff7121a5af2f82b4d58b54</string> + <string>b28856d3d02ee680353ae440561a6579</string> <key>url</key> - <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/curl-7.19.6-windows-20091016.tar.bz2</uri> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/curl-7.20.1-windows-20100611.tar.bz2</uri> </map> </map> </map> @@ -436,9 +436,9 @@ <key>linux</key> <map> <key>md5sum</key> - <string>978ad7c67fe4a2419bfc841e2956ff9f</string> + <string>9de3f44be65645c7f6af236139596942</string> <key>url</key> - <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/freetype-2.3.9-linux-20090521c.tar.bz2</uri> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/freetype-2.3.9-linux-2010-02-19a-nommap.tar.bz2</uri> </map> <key>linux64</key> <map> @@ -583,6 +583,39 @@ </map> </map> </map> + <key>google_breakpad</key> + <map> + <key>copyright</key> + <string>Copyright (c) 2006, Google Inc.</string> + <key>description</key> + <string>An open-source multi-platform crash reporting system </string> + <key>license</key> + <string>bsd</string> + <key>packages</key> + <map> + <key>darwin</key> + <map> + <key>md5sum</key> + <string>ced4010b59f1a579caa7fe3c18512499</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/google_breakpad-0.0.0-rev599-darwin-20100528a.tar.bz2</uri> + </map> + <key>linux</key> + <map> + <key>md5sum</key> + <string>29c3e7dad60bbf02c811786436d99523</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/google_breakpad-0.0.0-rev599-linux-20100521b.tar.bz2</uri> + </map> + <key>windows</key> + <map> + <key>md5sum</key> + <string>0859d47242990125f17eaab30bece2ff</string> + <key>url</key> + <uri>http://viewer-source-downloads.s3.amazonaws.com/install_pkgs/google_breakpad-0.0.0-rev599-windows-20100524.tar.bz2</uri> + </map> + </map> + </map> <key>googlemock</key> <map> <key>copyright</key> @@ -948,23 +981,23 @@ anguage Infrstructure (CLI) international standard</string> <key>darwin</key> <map> <key>md5sum</key> - <string>d97d843704514ae1b5f153fab2931920</string> + <string>becffca6bd8dcb239de284ea2a8b485b</string> <key>url</key> - <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-4.6-darwin-20100120.tar.bz2</uri> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-4.6+cookies-darwin-20100617.tar.bz2</uri> </map> <key>linux</key> <map> <key>md5sum</key> - <string>c4c40fca14a8bd32096f8a27c75c526f</string> + <string>414d72dd59e3d83c96f0e1531360792e</string> <key>url</key> - <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-linux-20100105c.tar.bz2</uri> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-linux-20100618.tar.bz2</uri> </map> <key>windows</key> <map> <key>md5sum</key> - <string>18c1a4059bad1504a457e70c8c218033</string> + <string>df1bdd683128e060d60e435f65d8f7e8</string> <key>url</key> - <uri>http://viewer-source-downloads.s3.amazonaws.com/install_pkgs/llqtwebkit-windows-qt4.6-20100120.tar.bz2</uri> + <uri>http://viewer-source-downloads.s3.amazonaws.com/install_pkgs/llqtwebkit-windows-qt4.6-20100617.tar.bz2</uri> </map> </map> </map> @@ -1112,9 +1145,9 @@ anguage Infrstructure (CLI) international standard</string> <key>darwin</key> <map> <key>md5sum</key> - <string>a7b49e0f3eedbd5de117a3524c414b3a</string> + <string>11d2be4f2b172430747b7d4a6739e3d8</string> <key>url</key> - <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openSSL-0.9.7c-darwin-20080812.tar.bz2</uri> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openSSL-0.9.8l-darwin-20100428.tar.bz2</uri> </map> <key>linux</key> <map> @@ -1266,6 +1299,25 @@ anguage Infrstructure (CLI) international standard</string> </map> </map> </map> + <key>pulseaudio</key> + <map> + <key>copyright</key> + <string>Copyright 2004-2006 Lennart Poettering, Copyright 2006 Pierre Ossman (ossman@cendio.se) for Cendio AB</string> + <key>description</key> + <string>pulseaudio: headers only</string> + <key>license</key> + <string>lgpl</string> + <key>packages</key> + <map> + <key>linux</key> + <map> + <key>md5sum</key> + <string>30cb00069fe2a545fbf7be1070386236</string> + <key>url</key> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/linux-pulse-headers-0.9.14.tar.bz2</uri> + </map> + </map> + </map> <key>quicktime</key> <map> <key>copyright</key> @@ -1367,23 +1419,23 @@ anguage Infrstructure (CLI) international standard</string> <key>darwin</key> <map> <key>md5sum</key> - <string>51f3fa1ab39563505df83b48ba432a3c</string> + <string>aa144917d0e33453d3c2cc2c05c6c47c</string> <key>url</key> - <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/vivox-3.1.0001.7852-darwin-20100115.tar.bz2</uri> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/vivox-3.1.0001.8821-darwin-20100529.tar.bz2</uri> </map> <key>linux</key> <map> <key>md5sum</key> - <string>ab9573d6aa2acdd79a553c144c9ecb09</string> + <string>98f7945755f3ee8e52f685a3eff4d7be</string> <key>url</key> - <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/vivox-3.1.0001.7852-linux-20100115.tar.bz2</uri> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/vivox-3.1.0001.8821-linux-20100529.tar.bz2</uri> </map> <key>windows</key> <map> <key>md5sum</key> - <string>88ab785eebdc4f53a7dfc4e0b95f67ec</string> + <string>e8fdd46cb026c2ec72c4489eb3bf39c1</string> <key>url</key> - <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/vivox-3.1.0001.7852-windows-20100115.tar.bz2</uri> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/vivox-3.1.0001.8821-windows-20100529.tar.bz2</uri> </map> </map> </map> diff --git a/scripts/messages/message_template.msg b/scripts/messages/message_template.msg index c50ae4ad80..d4f791c202 100644 --- a/scripts/messages/message_template.msg +++ b/scripts/messages/message_template.msg @@ -1383,6 +1383,10 @@ version 2.0 { AgentID LLUUID } { KickedFromEstateID U32 } } + { + AgentInfo Single + { AgentEffectiveMaturity U32 } + } } // DataHomeLocationReply data->sim |